diff --git a/.github/ISSUE_TEMPLATE/DMP 2024.yml b/.github/ISSUE_TEMPLATE/DMP 2024.yml deleted file mode 100644 index 9ed19d7..0000000 --- a/.github/ISSUE_TEMPLATE/DMP 2024.yml +++ /dev/null @@ -1,263 +0,0 @@ -name: DMP 2024 Project Template -description: List a new project for Dedicated Mentoring Program (DMP) 2024 -title: "[DMP 2024]: " -labels: ["DMP 2024"] -body: - - type: textarea - id: ticket-description - validations: - required: true - attributes: - label: Ticket Contents - value: | - ## Description - [Provide a brief description of the feature, including why it is needed and what it will accomplish.] - - - type: textarea - id: ticket-goals - validations: - required: true - attributes: - label: Goals & Mid-Point Milestone - description: List the goals of the feature. Please add the goals that must be achieved by Mid-point check-in i.e 1.5 months into the coding period. - value: | - ## Goals - - [ ] [Goal 1] - - [ ] [Goal 2] - - [ ] [Goal 3] - - [ ] [Goal 4] - - [ ] [Goals Achieved By Mid-point Milestone] - - - type: textarea - id: ticket-setup - attributes: - label: Setup/Installation - description: Please list or link setup or installation guide (if any) - - - type: textarea - id: ticket-expected-outcome - attributes: - label: Expected Outcome - description: Describe in detail what the final product or result should look like and how it should behave. - - - type: textarea - id: ticket-acceptance-criteria - attributes: - label: Acceptance Criteria - description: List the acceptance criteria for this feature. - - - type: textarea - id: ticket-implementation-details - validations: - required: true - attributes: - label: Implementation Details - description: List any technical details about the proposed implementation, including any specific technologies that will be used. - - - type: textarea - id: ticket-mockups - attributes: - label: Mockups/Wireframes - description: Include links to any visual aids, mockups, wireframes, or diagrams that help illustrate what the final product should look like. This is not always necessary, but can be very helpful in many cases. - - - type: input - id: ticket-product - attributes: - label: Product Name - placeholder: Enter Product Name - validations: - required: true - - - type: dropdown - id: ticket-organisation - attributes: - label: Organisation Name - description: Enter Organisation Name - multiple: false - options: - - Bandhu - - Blockster Global (CREDBEL) - - Civis - - Dhwani - - Dhiway - - EGov - - NSUT in collaboration with C4GT, SEETA, AIC - - EkShop Marketplace - - FIDE - - If Me - - Key Education Foundation - - Norwegian Meteorological Institute - - Planet Read - - Project Second Chance - - Reap Benefit - - SamagraX - - ShikshaLokam - - Tech4Dev - - Tekdi - - The Mifos Initiative - - Tibil - - Ushahidi - - Arghyam - - Piramal Swasthya Management Research Institute - validations: - required: true - - - type: dropdown - id: ticket-governance-domain - attributes: - label: Domain - options: - - ⁠Healthcare - - ⁠Education - - Financial Inclusion - - ⁠Livelihoods - - ⁠Skilling - - ⁠Learning & Development - - ⁠Agriculture - - ⁠Service Delivery - - Open Source Library - - Water - validations: - required: true - - - - type: dropdown - id: ticket-technical-skills-required - attributes: - label: Tech Skills Needed - description: Select the technologies needed for this ticket (use Ctrl or Command to select multiple) - multiple: true - options: - - .NET - - Angular - - Artificial Intelligence - - ASP.NET - - AWS - - Babel - - Bootstrap - - C# - - Chart.js - - CI/CD - - Computer Vision - - CORS - - cURL - - Cypress - - D3.js - - Database - - Debugging - - Design - - DevOps - - Django - - Docker - - Electron - - ESLint - - Express.js - - Feature - - Flask - - Go - - GraphQL - - HTML - - Ionic - - Jest - - Java - - JavaScript - - Jenkins - - JWT - - Kubernetes - - Laravel - - Machine Learning - - Maintenance - - Markdown - - Material-UI - - Microservices - - MongoDB - - Mobile - - Mockups - - Mocha - - Natural Language Processing - - NestJS - - Node.js - - NUnit - - OAuth - - Performance Improvement - - Prettier - - Python - - Question - - React - - React Native - - Redux - - RESTful APIs - - Ruby - - Ruby on Rails - - Rust - - Scala - - Security - - Selenium - - SEO - - Serverless - - Solidity - - Spring Boot - - SQL - - Swagger - - Tailwind CSS - - Test - - Testing Library - - Three.js - - TypeScript - - UI/UX/Design - - Virtual Reality - - Vue.js - - WebSockets - - Webpack - - Other - validations: - required: true - - - type: textarea - id: ticket-mentors - attributes: - label: Mentor(s) - description: Please tag relevant mentors for the ticket - validations: - required: true - - - type: dropdown - id: ticket-category - attributes: - label: Category - description: Choose the categories that best describe your ticket - multiple: true - options: - - API - - Analytics - - Accessibility - - Backend - - Breaking Change - - Beginner Friendly - - Configuration - - CI/CD - - Database - - Data Science - - Deprecation - - Documentation - - Delpoyment - - Frontend - - Internationalization - - Localization - - Machine Learning - - Maintenance - - Mobile - - Performance Improvement - - Question - - Refactoring - - Research - - Needs Reproduction - - SEO - - Security - - Testing - - AI - - Other - validations: - required: true - - diff --git a/.github/ISSUE_TEMPLATE/DMP_2026.yml b/.github/ISSUE_TEMPLATE/DMP_2026.yml deleted file mode 100644 index 9d68f7f..0000000 --- a/.github/ISSUE_TEMPLATE/DMP_2026.yml +++ /dev/null @@ -1,345 +0,0 @@ -name: DMP 2026 Project Template -description: List a new project for Dedicated Mentoring Program (DMP) 2026 -title: "[DMP 2026]: " -labels: ["DMP 2026"] -body: - - type: textarea - id: ticket-description - validations: - required: true - attributes: - label: Ticket Contents - value: | - ## Description - [Provide a brief description of the feature, including why it is needed and what it will accomplish.] - - - type: textarea - id: ticket-goals - validations: - required: true - attributes: - label: Goals & Mid-Point Milestone - description: List the goals of the feature. Please add the goals that must be achieved by Mid-point check-in i.e 1.5 months into the coding period. - value: | - ## Goals - - [ ] [Goal 1] - - [ ] [Goal 2] - - [ ] [Goal 3] - - [ ] [Goal 4] - - [ ] [Goals Achieved By Mid-point Milestone] - - - type: textarea - id: ticket-setup - attributes: - label: Setup/Installation - description: Please list or link setup or installation guide (if any) - - - type: textarea - id: ticket-expected-outcome - attributes: - label: Expected Outcome - description: Describe in detail what the final product or result should look like and how it should behave. - - - type: textarea - id: ticket-acceptance-criteria - attributes: - label: Acceptance Criteria - description: List the acceptance criteria for this feature. - - - type: textarea - id: ticket-implementation-details - validations: - required: true - attributes: - label: Implementation Details - description: List any technical details about the proposed implementation, including any specific technologies that will be used. - - - type: textarea - id: ticket-mockups - attributes: - label: Mockups/Wireframes - description: Include links to any visual aids, mockups, wireframes, or diagrams that help illustrate what the final product should look like. This is not always necessary, but can be very helpful in many cases. - - - type: input - id: ticket-product - attributes: - label: Product Name - placeholder: Enter Product Name - validations: - required: true - - - type: dropdown - id: ticket-organisation - attributes: - label: Organisation Name - description: Enter Organisation Name - multiple: false - options: - - Agami - - Argusoft - - ARMMAN - - Avanti Fellows - - Bandhu - - Beckn - - Belongg - - Blockster Global (CREDBEL) - - Blockster Labs / AyanWorks - - CBoard - - CHAOSS - - CHAOSS Africa + GWU - - Civis - - ConveGenius - - Consul Democracy - - COSS - - CranberryFit - - Development Gateway - - DHIS2 - - Dhiway - - Dhwani - - Digital Green - - Digital India - - Dimagi - - Drupal - - Education Initiative - - eGov - - EkShop Marketplace - - FIDE - - FinternetLabs - - Flywheel - - GovDirectory - - Haqdarshak - - Healthsites.io - - IDinsight - - If Me - - IIIT Delhi - - IIT Bombay - - IIT Delhi - - Impactyaan - - Indus Action - - Intel Health - - Key Education Foundation - - Khushi Baby - - Learning Economy - - Linux Foundation - - Mecha Systems - - Medic Mobile - - Medtronic Labs - - MetaBrainz - - Mifos - - Mojaloop - - MOSIP - - NASSCOM Foundation - - NHA - - NIUA - - Norwegian Meteorological Institute - - NSUT x SEETA x AIC - - ONDC - - ONEST - - Open Healthcare Network - - OpenCRVS - - OpenFn - - OpenIMIS - - OpenMRS - - OpenSPP - - Piramal Swasthya - - Planet Read - - Policy Engine - - Pratham Books - - Project Second Chance - - Project Tech4Dev - - Protean - - RCTS-IIITH - - Reap Benefit - - Resolve to Save Lives - - Rocket Learning - - Rumsan - - Sahamati - - SamagraX - - Samanvay Foundation - - Sampatti Card - - Sanketika - - ShikshaLokam - - SimPPL - - Sugar Labs - - Swasth Alliance - - Swecha - - Tarento - - Tattle - - Tech4Dev - - Tekdi - - The Apprentice Project - - The Mifos Initiative - - Thoughtworks - - Tibil - - TinkerHub - - Trustin - - Tuner Labs - - TYCIA - - UNICEF - - United Nations - - Ushahidi - - Win Over Cancer - - WRI - - Zendalona - - Zenysis - - Arghyam - validations: - required: true - - - type: dropdown - id: ticket-governance-domain - attributes: - label: Domain - options: - - ⁠Healthcare - - ⁠Education - - Financial Inclusion - - ⁠Livelihoods - - ⁠Skilling - - ⁠Learning & Development - - ⁠Agriculture - - ⁠Service Delivery - - Open Source Library - - Water - validations: - required: true - - - - type: dropdown - id: ticket-technical-skills-required - attributes: - label: Tech Skills Needed - description: Select the technologies needed for this ticket (use Ctrl or Command to select multiple) - multiple: true - options: - - .NET - - Angular - - Artificial Intelligence - - ASP.NET - - AWS - - Babel - - Bootstrap - - C# - - Chart.js - - CI/CD - - Computer Vision - - CORS - - cURL - - Cypress - - D3.js - - Database - - Debugging - - Design - - DevOps - - Django - - Docker - - Electron - - ESLint - - Express.js - - Feature - - Flask - - Go - - GraphQL - - HTML - - Ionic - - Jest - - Java - - JavaScript - - Jenkins - - JWT - - Kubernetes - - Laravel - - Machine Learning - - Maintenance - - Markdown - - Material-UI - - Microservices - - MongoDB - - Mobile - - Mockups - - Mocha - - Natural Language Processing - - NestJS - - Node.js - - NUnit - - OAuth - - Performance Improvement - - Prettier - - Python - - Question - - React - - React Native - - Redux - - RESTful APIs - - Ruby - - Ruby on Rails - - Rust - - Scala - - Security - - Selenium - - SEO - - Serverless - - Solidity - - Spring Boot - - SQL - - Swagger - - Tailwind CSS - - Test - - Testing Library - - Three.js - - TypeScript - - UI/UX/Design - - Virtual Reality - - Vue.js - - WebSockets - - Webpack - - Other - validations: - required: true - - - type: textarea - id: ticket-mentors - attributes: - label: Mentor(s) - description: Please tag relevant mentors for the ticket - validations: - required: true - - - type: dropdown - id: ticket-category - attributes: - label: Category - description: Choose the categories that best describe your ticket - multiple: true - options: - - API - - Analytics - - Accessibility - - Backend - - Breaking Change - - Beginner Friendly - - Configuration - - CI/CD - - Database - - Data Science - - Deprecation - - Documentation - - Delpoyment - - Frontend - - Internationalization - - Localization - - Machine Learning - - Maintenance - - Mobile - - Performance Improvement - - Question - - Refactoring - - Research - - Needs Reproduction - - SEO - - Security - - Testing - - AI - - Other - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/dmp-2024.md b/.github/ISSUE_TEMPLATE/dmp-2024.md deleted file mode 100644 index 89a73b7..0000000 --- a/.github/ISSUE_TEMPLATE/dmp-2024.md +++ /dev/null @@ -1,269 +0,0 @@ ---- -name: DMP 2024 -about: Project proposal -title: '' -labels: '' -assignees: '' - ---- - -name: DMP 2024 Project Template -description: List a new project for Dedicated Mentoring Program (DMP) 2024 -title: "[DMP 2024]: " -labels: ["DMP 2024"] -body: - - type: textarea - id: ticket-description - validations: - required: true - attributes: - label: Ticket Contents - value: | - ## Description - [Provide a brief description of the feature, including why it is needed and what it will accomplish.] - - - type: textarea - id: ticket-goals - validations: - required: true - attributes: - label: Goals & Mid-Point Milestone - description: List the goals of the feature. Please add the goals that must be achieved by Mid-point check-in i.e 1.5 months into the coding period. - value: | - ## Goals - - [ ] [Goal 1] - - [ ] [Goal 2] - - [ ] [Goal 3] - - [ ] [Goal 4] - - [ ] [Goals Achieved By Mid-point Milestone] - - - type: textarea - id: ticket-setup - attributes: - label: Setup/Installation - description: Please list or link setup or installation guide (if any) - - - type: textarea - id: ticket-expected-outcome - attributes: - label: Expected Outcome - description: Describe in detail what the final product or result should look like and how it should behave. - - - type: textarea - id: ticket-acceptance-criteria - attributes: - label: Acceptance Criteria - description: List the acceptance criteria for this feature. - - - type: textarea - id: ticket-implementation-details - validations: - required: true - attributes: - label: Implementation Details - description: List any technical details about the proposed implementation, including any specific technologies that will be used. - - - type: textarea - id: ticket-mockups - attributes: - label: Mockups/Wireframes - description: Include links to any visual aids, mockups, wireframes, or diagrams that help illustrate what the final product should look like. This is not always necessary, but can be very helpful in many cases. - - - type: input - id: ticket-product - attributes: - label: Product Name - placeholder: Enter Product Name - validations: - required: true - - - type: dropdown - id: ticket-organisation - attributes: - label: Organisation Name - description: Enter Organisation Name - multiple: false - options: - - Bandhu - - Blockster Global (CREDBEL) - - Civis - - Dhwani - - Dhiway - - EGov - - EkShop Marketplace - - FIDE - - If Me - - Key Education Foundation - - Norwegian Meteorological Institute - - Planet Read - - Project Second Chance - - Reap Benefit - - SamagraX - - ShikshaLokam - - Tech4Dev - - Tekdi - - The Mifos Initiative - - Tibil - - Ushahidi - - Arghyam - - Piramal Swasthya Management Research Institute - validations: - required: true - - - type: dropdown - id: ticket-governance-domain - attributes: - label: Domain - options: - - ⁠Healthcare - - ⁠Education - - Financial Inclusion - - ⁠Livelihoods - - ⁠Skilling - - ⁠Learning & Development - - ⁠Agriculture - - ⁠Service Delivery - - Open Source Library - - Water - validations: - required: true - - - - type: dropdown - id: ticket-technical-skills-required - attributes: - label: Tech Skills Needed - description: Select the technologies needed for this ticket (use Ctrl or Command to select multiple) - multiple: true - options: - - .NET - - Angular - - Artificial Intelligence - - ASP.NET - - AWS - - Babel - - Bootstrap - - C# - - Chart.js - - CI/CD - - Computer Vision - - CORS - - cURL - - Cypress - - D3.js - - Database - - Debugging - - Design - - DevOps - - Django - - Docker - - Electron - - ESLint - - Express.js - - Feature - - Flask - - Go - - GraphQL - - HTML - - Ionic - - Jest - - Java - - JavaScript - - Jenkins - - JWT - - Kubernetes - - Laravel - - Machine Learning - - Maintenance - - Markdown - - Material-UI - - Microservices - - MongoDB - - Mobile - - Mockups - - Mocha - - Natural Language Processing - - NestJS - - Node.js - - NUnit - - OAuth - - Performance Improvement - - Prettier - - Python - - Question - - React - - React Native - - Redux - - RESTful APIs - - Ruby - - Ruby on Rails - - Rust - - Scala - - Security - - Selenium - - SEO - - Serverless - - Solidity - - Spring Boot - - SQL - - Swagger - - Tailwind CSS - - Test - - Testing Library - - Three.js - - TypeScript - - UI/UX/Design - - Virtual Reality - - Vue.js - - WebSockets - - Webpack - - Other - validations: - required: true - - - type: textarea - id: ticket-mentors - attributes: - label: Mentor(s) - description: Please tag relevant mentors for the ticket - validations: - required: true - - - type: dropdown - id: ticket-category - attributes: - label: Category - description: Choose the categories that best describe your ticket - multiple: true - options: - - API - - Analytics - - Accessibility - - Backend - - Breaking Change - - Beginner Friendly - - Configuration - - CI/CD - - Database - - Data Science - - Deprecation - - Documentation - - Delpoyment - - Frontend - - Internationalization - - Localization - - Machine Learning - - Maintenance - - Mobile - - Performance Improvement - - Question - - Refactoring - - Research - - Needs Reproduction - - SEO - - Security - - Testing - - AI - - Other - validations: - required: true diff --git a/.gitignore b/.gitignore deleted file mode 100644 index efa4672..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# misc -.DS_Store \ No newline at end of file diff --git a/DeveloperAdoption/.env.example b/DeveloperAdoption/.env.example deleted file mode 100644 index 14e85e6..0000000 --- a/DeveloperAdoption/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -FIREBASE_PROJECT_ID= -FIREBASE_CLIENT_EMAIL= -FIREBASE_PRIVATE_KEY= \ No newline at end of file diff --git a/DeveloperAdoption/.eslintrc.json b/DeveloperAdoption/.eslintrc.json deleted file mode 100644 index bffb357..0000000 --- a/DeveloperAdoption/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "next/core-web-vitals" -} diff --git a/DeveloperAdoption/.gitignore b/DeveloperAdoption/.gitignore deleted file mode 100644 index 8acccb0..0000000 --- a/DeveloperAdoption/.gitignore +++ /dev/null @@ -1,35 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/install-state.gz - -# testing -/coverage - -# next.js -/.next/ -/out/ - -.env.local - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts diff --git a/DeveloperAdoption/Readme.md b/DeveloperAdoption/Readme.md deleted file mode 100644 index aa9b690..0000000 --- a/DeveloperAdoption/Readme.md +++ /dev/null @@ -1,14 +0,0 @@ -## Contributors: - -- **Dhruv Rastogi** - [@Astr1sk](https://github.com/Astr1sk) -- **Manit Singh** - [@NucleonGodX](https://github.com/NucleonGodX) -- **Ajay Pal Singh** - [singhdsp](https://github.com/singhdsp/) -- **Subham Chauhan** - [@TechSubham](https://github.com/TechSubham) -- **Harshjeet Singh** - [@roug047](https://github.com/roug047) -- **Manasvi Nandal** - [manasvi476](https://github.com/manasvi476) - -## Project Links - -- **Video Demonstration:** - [YOUTUBE LINK](https://youtu.be/Av-YA1hoGHU) -- **Live Deployment:** - [DEPLOYED LINK](https://sih-internal-qubit-spreadx.vercel.app/) -- **Technology used:** (node.js, SocialCalc, firebase storage, firestore db) diff --git a/DeveloperAdoption/app/Components/SocialCalc/aspiring/SocialCalc.js b/DeveloperAdoption/app/Components/SocialCalc/aspiring/SocialCalc.js deleted file mode 100644 index b17a01f..0000000 --- a/DeveloperAdoption/app/Components/SocialCalc/aspiring/SocialCalc.js +++ /dev/null @@ -1,32423 +0,0 @@ -/* eslint-disable */ -// Taken from https://github.com/umdjs/umd/blob/master/templates/returnExports.js -// (c) by The UMD contributors -// MIT License: https://github.com/umdjs/umd/blob/master/LICENSE.md -(function (root, factory) { - if (typeof define === "function" && define.amd) { - // AMD. Register as an anonymous module. - define([], function () { - return (root.SocialCalc = factory.call(root, root)); - }); - } else if (typeof module === "object" && module.exports) { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = root.SocialCalc = factory.call(root, root); - } else { - // Browser globals (root is window) - root.SocialCalc = factory.call(root, root); - } -})(typeof self !== "undefined" ? self : this, function (window) { - // console.log(root) - // console.log(window) - var window = this; - var SocialCalc = {}; - - // - /* -// The module of the SocialCalc package with customizable constants, strings, etc. -// This is where most of the common localizations are done. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - // - /* -// The module of the SocialCalc package with customizable constants, strings, etc. -// This is where most of the common localizations are done. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; - - // ************************************* - // - // TO LEARN HOW TO LOCALIZE OR CUSTOMIZE SOCIALCALC, PLEASE READ THIS: - // - // The constants are all properties of the SocialCalc.Constants object. - // They are grouped here by what they are for, which module uses them, etc. - // - // Properties whose names start with "s_" are strings, or arrays of strings, - // that are good candidates for translation from the English. - // - // Other properties relate to visual settings, localization parameters, etc. - // - // These values are not used when SocialCalc modules are first loaded. - // They may be modified before the first use of the routines that use them, - // e.g., before creating SocialCalc objects. - // - // The exceptions are: - // TooltipOffsetX and TooltipOffsetY, as described with their definitions. - // - // SocialCalc IS NOT DESIGNED FOR USE WITH A TRANSLATION FUNCTION each time a string - // is used. Instead, language translations may be done by modifying this object. - // - // To customize SocialCalc, you may either replace this file with a modified version - // or you can overwrite the values before use. An example would be to - // iterate over all the properties looking for names that start with "s_" and - // use some other mechanism to obtain a localized string and replace the values - // here with those translated values. - // - // There is also a function, SocialCalc.ConstantsSetClasses, that may be used - // to easily switch SocialCalc from using explicit CSS styles for many things - // to using CSS classes. See the function, below, for more information. - // - // ************************************* - - SocialCalc.Constants = { - // - // Main SocialCalc module, socialcalc-3.js: - // - - //*** Common Constants - - textdatadefaulttype: "t", // This sets the default type for text on reading source file - // It should normally be "t" - - //*** Common error messages - - s_BrowserNotSupported: "Browser not supported.", // error thrown if browser can't handle events like IE or Firefox. - s_InternalError: "Internal SocialCalc error (probably an internal bug): ", // hopefully unlikely, but a test failed - - //*** SocialCalc.ParseSheetSave - - // Errors thrown on unexpected value in save file: - - s_pssUnknownColType: "Unknown col type item", - s_pssUnknownRowType: "Unknown row type item", - s_pssUnknownLineType: "Unknown line type", - - //*** SocialCalc.CellFromStringParts - - // Error thrown on unexpected value in save file: - - s_cfspUnknownCellType: "Unknown cell type item", - - //*** SocialCalc.CanonicalizeSheet - - doCanonicalizeSheet: true, // if true, do the canonicalization calculations - - //*** ExecuteSheetCommand - - s_escUnknownSheetCmd: "Unknown sheet command: ", - s_escUnknownSetCoordCmd: "Unknown set coord command: ", - s_escUnknownCmd: "Unknown command: ", - - //*** SocialCalc.CheckAndCalcCell - - s_caccCircRef: "Circular reference to ", // circular reference found during recalc - - //*** SocialCalc.RenderContext - - defaultRowNameWidth: "30", // used to set minimum width of the row header column - a string in pixels - defaultAssumedRowHeight: 15, // used when guessing row heights - number - defaultCellIDPrefix: "cell_", // if non-null, each cell will render with an ID starting with this - - // Default sheet display values - - defaultCellLayout: "padding:2px 2px 1px 2px;vertical-align:top;", - defaultCellFontStyle: "normal normal", - defaultCellFontSize: "small", - defaultCellFontFamily: "Verdana,Arial,Helvetica,sans-serif", - - defaultPaneDividerWidth: "2", // a string - defaultPaneDividerHeight: "3", // a string - - defaultGridCSS: "1px solid #C0C0C0;", // used as style to set each border when grid enabled (was #ECECEC) - - defaultCommentClass: "", // class added to cells with non-null comments when grid enabled - defaultCommentStyle: - "background-repeat:no-repeat;background-position:top right;background-image:url(/socialcalc/images/sc-commentbg.gif);", // style added to cells with non-null comments when grid enabled - defaultCommentNoGridClass: "", // class added to cells with non-null comments when grid not enabled - defaultCommentNoGridStyle: "", // style added to cells with non-null comments when grid not enabled - - defaultColWidth: "80", // text - defaultMinimumColWidth: 10, // numeric - - // For each of the following default sheet display values at least one of class and/or style are needed - - defaultHighlightTypeCursorClass: "", - // defaultHighlightTypeCursorStyle: "color:#FFF;backgroundColor:#A6A6A6;", - defaultHighlightTypeCursorStyle: "", - defaultHighlightTypeRangeClass: "", - //defaultHighlightTypeRangeStyle: "color:#000;backgroundColor:#E5E5E5;", - defaultHighlightTypeRangeStyle: "", - - defaultColnameClass: "", // regular column heading letters, needs a cursor property - defaultColnameStyle: - "font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;", - defaultSelectedColnameClass: "", // column with selected cell, needs a cursor property - defaultSelectedColnameStyle: - "font-size:small;text-align:center;color:#FFFFFF;background-color:#404040;cursor:e-resize;", - defaultRownameClass: "", // regular row heading numbers - defaultRownameStyle: - "font-size:small;text-align:right;color:#FFFFFF;background-color:#808080;", - defaultSelectedRownameClass: "", // column with selected cell, needs a cursor property - defaultSelectedRownameStyle: - "font-size:small;text-align:right;color:#FFFFFF;background-color:#404040;", - defaultUpperLeftClass: "", // Corner cell in upper left - defaultUpperLeftStyle: - "font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;", - defaultSkippedCellClass: "", // used if present for spanned cells peeking into a pane (at least one of class/style needed) - defaultSkippedCellStyle: "font-size:small;background-color:#CCC", // used if present - defaultPaneDividerClass: "", // used if present for the look of the space between panes (at least one of class/style needed) - defaultPaneDividerStyle: - "font-size:small;background-color:#C0C0C0;padding:0px;", // used if present - - s_rcMissingSheet: "Render Context must have a sheet object", // unlikely thrown error - - //*** SocialCalc.format_text_for_display - - defaultLinkFormatString: - 'Link', // used for format "text-link"; you could make this an img tag if desired - // defaultLinkFormatString: 'Link out', - defaultPageLinkFormatString: - 'Page', // used for format "text-link"; you could make this an img tag if desired - - //*** SocialCalc.format_number_for_display - - defaultFormatdt: "d-mmm-yyyy h:mm:ss", - defaultFormatd: "d-mmm-yyyy", - defaultFormatt: "[h]:mm:ss", - defaultDisplayTRUE: "TRUE", // how TRUE shows when rendered - defaultDisplayFALSE: "FALSE", - - // - // SocialCalc Table Editor module, socialcalctableeditor.js: - // - - //*** SocialCalc.TableEditor - - defaultImagePrefix: "/socialcalc/images/sc-", // URL prefix for images (e.g., "/www/assets/images/sc") - defaultTableEditorIDPrefix: "te_", // if present, many TableEditor elements are assigned IDs with this prefix - defaultPageUpDnAmount: 15, // number of rows to move cursor on PgUp/PgDn keys (numeric) - - AllowCtrlS: true, // turns on Ctrl-S trapdoor for setting custom numeric formats and commands if true - - //*** SocialCalc.CreateTableEditor - - defaultTableControlThickness: 0, // the short size for the scrollbars, etc. (numeric in pixels) - cteGriddivClass: "", // if present, the class for the TableEditor griddiv element - - //** SocialCalc.EditorGetStatuslineString -- strings shown on status line - - s_statusline_executing: "Executing...", - s_statusline_displaying: "Displaying...", - s_statusline_ordering: "Ordering...", - s_statusline_calculating: "Calculating...", - s_statusline_calculatingls: "Calculating... Loading Sheet...", - s_statusline_doingserverfunc: "doing server function ", - s_statusline_incell: " in cell ", - s_statusline_calcstart: "Calculation start...", - s_statusline_sum: "SUM", - s_statusline_recalcneeded: - '(Recalc needed)', - s_statusline_circref: 'Circular reference: ', - - //** SocialCalc.InputBoxDisplayCellContents - - s_inputboxdisplaymultilinetext: - "[Multi-line text: Click icon on right to edit]", - - //** SocialCalc.InputEcho - - defaultInputEchoClass: "", // if present, the class of the popup inputEcho div - defaultInputEchoStyle: - "filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;border:1px solid #884;" + - "fontSize:small;padding:2px 10px 1px 2px;cursor:default;", // if present, pseudo style - defaultInputEchoPromptClass: "", // if present, the class of the popup inputEcho div - defaultInputEchoPromptStyle: - "filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;" + - "borderLeft:1px solid #884;borderRight:1px solid #884;borderBottom:1px solid #884;" + - "fontSize:small;fontStyle:italic;padding:2px 10px 1px 2px;cursor:default;", // if present, pseudo style - - //** SocialCalc.InputEchoText - - ietUnknownFunction: "Unknown function ", // displayed when typing "=unknown(" - - //** SocialCalc.CellHandles - - CH_radius1: 29.0, // extent of inner circle within 90px image - CH_radius2: 41.0, // extent of outer circle within 90px image - s_CHfillAllTooltip: "Fill Contents and Formats Down/Right", // tooltip for fill all handle - s_CHfillContentsTooltip: "Fill Contents Only Down/Right", // tooltip for fill formulas handle - s_CHmovePasteAllTooltip: "Move Contents and Formats", // etc. - s_CHmovePasteContentsTooltip: "Move Contents Only", - s_CHmoveInsertAllTooltip: "Slide Contents and Formats within Row/Col", - s_CHmoveInsertContentsTooltip: "Slide Contents within Row/Col", - s_CHindicatorOperationLookup: { - Fill: "Fill", - FillC: "Fill Contents", - Move: "Move", - MoveI: "Slide", - MoveC: "Move Contents", - MoveIC: "Slide Contents", - }, // short form of operation to follow drag - s_CHindicatorDirectionLookup: { - Down: " Down", - Right: " Right", - Horizontal: " Horizontal", - Vertical: " Vertical", - }, // direction that modifies operation during drag - - //*** SocialCalc.TableControl - - defaultTCSliderThickness: 9, // length of pane slider (numeric in pixels) - defaultTCButtonThickness: 20, // length of scroll +/- buttons (numeric in pixels) - defaultTCThumbThickness: 15, // length of thumb (numeric in pixels) - - //*** SocialCalc.CreateTableControl - - TCmainStyle: "backgroundColor:#EEE;", // if present, pseudo style (text-align is textAlign) for main div of a table control - TCmainClass: "", // if present, the CSS class of the main div for a table control - TCendcapStyle: "backgroundColor:#FFF;", // backgroundColor may be used while waiting for image that may not come - TCendcapClass: "", - TCpanesliderStyle: "backgroundColor:#CCC;", - TCpanesliderClass: "", - s_panesliderTooltiph: "Drag to lock pane vertically", // tooltip for horizontal table control pane slider - s_panesliderTooltipv: "Drag to lock pane horizontally", - TClessbuttonStyle: "backgroundColor:#AAA;", - TClessbuttonClass: "", - TClessbuttonRepeatWait: 300, // in milliseconds - TClessbuttonRepeatInterval: 20, //100, // in milliseconds - TCmorebuttonStyle: "backgroundColor:#AAA;", - TCmorebuttonClass: "", - TCmorebuttonRepeatWait: 300, // in milliseconds - TCmorebuttonRepeatInterval: 20, //100, // in milliseconds - TCscrollareaStyle: "backgroundColor:#DDD;", - TCscrollareaClass: "", - TCscrollareaRepeatWait: 500, // in milliseconds - TCscrollareaRepeatInterval: 100, // in milliseconds - TCthumbClass: "", - TCthumbStyle: "backgroundColor:#CCC;", - - //*** SocialCalc.TCPSDragFunctionStart - - TCPStrackinglineClass: "", // at least one of class/style for pane slider tracking line display in table control - TCPStrackinglineStyle: "overflow:hidden;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCPStrackinglineThickness: "2px", // narrow dimension of trackling line (string with units) - - //*** SocialCalc.TCTDragFunctionStart - - TCTDFSthumbstatusvClass: "", // at least one of class/style for vertical thumb dragging status display in table control - TCTDFSthumbstatusvStyle: - "height:20px;width:auto;border:3px solid #808080;overflow:hidden;" + - "backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCTDFSthumbstatushClass: "", // at least one of class/style for horizontal thumb dragging status display in table control - TCTDFSthumbstatushStyle: - "height:20px;width:auto;border:1px solid black;padding:2px;" + - "backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCTDFSthumbstatusrownumClass: "", // at least one of class/style for thumb dragging status display in table control - TCTDFSthumbstatusrownumStyle: - "color:#FFF;background-color:#808080;font-size:small;white-space:nowrap;padding:3px;", // if present, real style - TCTDFStopOffsetv: 0, // offsets for thumbstatus display while dragging - TCTDFSleftOffsetv: -80, - s_TCTDFthumbstatusPrefixv: "Row ", // Text Control Drag Function text before row number - TCTDFStopOffseth: -30, - TCTDFSleftOffseth: 0, - s_TCTDFthumbstatusPrefixh: "Col ", // Text Control Drag Function text before col number - - //*** SocialCalc.TooltipInfo - - // Note: These two values are used to set the TooltipInfo initial values when the code is first read in. - // Modifying them here after loading has no effect -- you need to modify SocialCalc.TooltipInfo directly - // to dynamically set them. This is different than most other constants which may be modified until use. - - TooltipOffsetX: 2, // offset in pixels from mouse position (to right on left side of screen, to left on right) - TooltipOffsetY: 10, // offset in pixels above mouse position for lower edge - - //*** SocialCalc.TooltipDisplay - - TDpopupElementClass: "", // at least one of class/style for tooltip display - TDpopupElementStyle: - "border:1px solid black;padding:1px 2px 2px 2px;textAlign:center;backgroundColor:#FFF;" + - "fontSize:7pt;fontFamily:Verdana,Arial,Helvetica,sans-serif;" + - "position:absolute;width:auto;zIndex:110;", - // if present, pseudo style (text-align is textAlign) - - // - // SocialCalc Spreadsheet Control module, socialcalcspreadsheetcontrol.js: - // - - //*** SocialCalc.SpreadsheetControl - - SCToolbarbackground: "background-color:#404040;", - SCTabbackground: "background-color:#CCC;", - SCTabselectedCSS: - "font-size:small;padding:6px 30px 6px 8px;color:#FFF;background-color:#404040;cursor:default;border-right:1px solid #CCC;", - SCTabplainCSS: - "font-size:small;padding:6px 30px 6px 8px;color:#FFF;background-color:#808080;cursor:default;border-right:1px solid #CCC;", - SCToolbartext: - "font-size:x-small;font-weight:bold;color:#FFF;padding-bottom:4px;", - - SCFormulabarheight: 0, // in pixels, will contain a text input box - - SCStatuslineheight: 20, // in pixels - SCStatuslineCSS: "font-size:10px;padding:3px 0px;", - - // workbook - doWorkBook: true, - SCSheetBarHeight: 25, - SCSheetBarBackground: "background-color:#CCC;", - SCSheetBarCSS: "background-color:#CCC;", - SCSheetBarWidth: "70%", - - SCCellHandlesDisable: true, - SCNoInputEcho: true, // do we need an input echo ? - s_inputboxdisplaynoteditable: "[not editable]", - SCNoRowName: true, - SCNoRanging: true, - SCNoQuoteInInputBox: true, - // Constants for default Format tab (settings) - // - // *** EVEN THOUGH THESE DON'T START WITH s_: *** - // - // These should be carefully checked for localization. Make sure you understand what they do and how they work! - // The first part of "first:second|first:second|..." is what is displayed and the second is the value to be used. - // The value is normally not translated -- only the displayed part. The [cancel], [break], etc., are not translated -- - // they are commands to SocialCalc.SettingsControls.PopupListInitialize - - SCFormatNumberFormats: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Auto w/ commas!:[,]General|[break]:|" + - "00:00|000:000|0000:0000|00000:00000|[break]:|%loc!Formula!:formula|%loc!Hidden!:hidden|[newcol]:" + - "1234:0|1,234:#,##0|1,234.5:#,##0.0|1,234.56:#,##0.00|1,234.567:#,##0.000|1,234.5678:#,##0.0000|" + - "[break]:|1,234%:#,##0%|1,234.5%:#,##0.0%|1,234.56%:#,##0.00%|" + - "[newcol]:|$1,234:$#,##0|$1,234.5:$#,##0.0|$1,234.56:$#,##0.00|[break]:|" + - "(1,234):#,##0_);(#,##0)|(1,234.5):#,##0.0_);(#,##0.0)|(1,234.56):#,##0.00_);(#,##0.00)|[break]:|" + - "($1,234):#,##0_);($#,##0)|($1,234.5):$#,##0.0_);($#,##0.0)|($1,234.56):$#,##0.00_);($#,##0.00)|" + - "[newcol]:|1/4/06:m/d/yy|01/04/2006:mm/dd/yyyy|2006-01-04:yyyy-mm-dd|4-Jan-06:d-mmm-yy|04-Jan-2006:dd-mmm-yyyy|January 4, 2006:mmmm d, yyyy|" + - "[break]:|1\\c23:h:mm|1\\c23 PM:h:mm AM/PM|1\\c23\\c45:h:mm:ss|01\\c23\\c45:hh:mm:ss|26\\c23 (h\\cm):[hh]:mm|69\\c45 (m\\cs):[mm]:ss|69 (s):[ss]|" + - "[newcol]:|2006-01-04 01\\c23\\c45:yyyy-mm-dd hh:mm:ss|January 4, 2006:mmmm d, yyyy hh:mm:ss|Wed:ddd|Wednesday:dddd|", - SCFormatTextFormats: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Plain Text!:text-plain|" + - "HTML:text-html|%loc!Wikitext!:text-wiki|%loc!Link!:text-link|%loc!Formula!:formula|%loc!Hidden!:hidden|", - SCFormatPadsizes: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!No padding!:0px|" + - "[newcol]:|1 pixel:1px|2 pixels:2px|3 pixels:3px|4 pixels:4px|5 pixels:5px|" + - "6 pixels:6px|7 pixels:7px|8 pixels:8px|[newcol]:|9 pixels:9px|10 pixels:10px|11 pixels:11px|" + - "12 pixels:12px|13 pixels:13px|14 pixels:14px|16 pixels:16px|" + - "18 pixels:18px|[newcol]:|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|", - SCFormatFontsizes: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|X-Small:x-small|Small:small|Medium:medium|Large:large|X-Large:x-large|" + - "[newcol]:|6pt:6pt|7pt:7pt|8pt:8pt|9pt:9pt|10pt:10pt|11pt:11pt|12pt:12pt|14pt:14pt|16pt:16pt|" + - "[newcol]:|18pt:18pt|20pt:20pt|22pt:22pt|24pt:24pt|28pt:28pt|36pt:36pt|48pt:48pt|72pt:72pt|" + - "[newcol]:|8 pixels:8px|9 pixels:9px|10 pixels:10px|11 pixels:11px|" + - "12 pixels:12px|13 pixels:13px|14 pixels:14px|[newcol]:|16 pixels:16px|" + - "18 pixels:18px|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|", - SCFormatFontfamilies: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|Verdana:Verdana,Arial,Helvetica,sans-serif|" + - "Arial:arial,helvetica,sans-serif|Courier:'Courier New',Courier,monospace|", - SCFormatFontlook: - "[cancel]:|[break]:|%loc!Default!:|%loc!Normal!:normal normal|%loc!Bold!:normal bold|%loc!Italic!:italic normal|" + - "%loc!Bold Italic!:italic bold", - SCFormatTextAlignhoriz: - "[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|", - SCFormatNumberAlignhoriz: - "[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|", - SCFormatAlignVertical: - "[cancel]:|[break]:|%loc!Default!:|%loc!Top!:top|%loc!Middle!:middle|%loc!Bottom!:bottom|", - SCFormatColwidth: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|" + - "20 pixels:20|40:40|60:60|80:80|100:100|120:120|140:140|160:160|" + - "[newcol]:|180 pixels:180|200:200|220:220|240:240|260:260|280:280|300:300|", - SCFormatRecalc: "[cancel]:|[break]:|%loc!Auto!:|%loc!Manual!:off|", - - //*** SocialCalc.InitializeSpreadsheetControl - - ISCButtonBorderNormal: "#404040", - ISCButtonBorderHover: "#999", - ISCButtonBorderDown: "#FFF", - ISCButtonDownBackground: "#888", - - //*** SocialCalc.SettingsControls.PopupListInitialize - - s_PopupListCancel: "[Cancel]", - s_PopupListCustom: "Custom", - - // *** - // - // s_loc_ constants accessed by SocialCalc.LocalizeString and SocialCalc.LocalizeSubstrings - // - // Used extensively by socialcalcspreadsheetcontrol.js - // - // *** - - s_loc_align_center: "Align Center", - s_loc_align_left: "Align Left", - s_loc_align_right: "Align Right", - s_loc_alignment: "Alignment", - s_loc_audit: "Audit", - s_loc_audit_trail_this_session: "Audit Trail This Session", - s_loc_auto: "Auto", - s_loc_auto_sum: "Auto Sum", - s_loc_auto_wX_commas: "Auto w/ commas", - s_loc_automatic: "Automatic", - s_loc_background: "Background", - s_loc_bold: "Bold", - s_loc_bold_XampX_italics: "Bold & Italics", - s_loc_bold_italic: "Bold Italic", - s_loc_borders: "Borders", - s_loc_borders_off: "Borders Off", - s_loc_borders_on: "Borders On", - s_loc_bottom: "Bottom", - s_loc_bottom_border: "Bottom Border", - s_loc_cell_settings: "CELL SETTINGS", - s_loc_csv_format: "CSV format", - s_loc_cancel: "Cancel", - s_loc_category: "Category", - s_loc_center: "Center", - s_loc_clear: "Clear", - s_loc_clear_socialcalc_clipboard: "Clear SocialCalc Clipboard", - s_loc_clipboard: "Clipboard", - s_loc_color: "Color", - s_loc_column_: "Column ", - s_loc_comment: "Comment", - s_loc_copy: "Copy", - s_loc_custom: "Custom", - s_loc_cut: "Cut", - s_loc_default: "Default", - s_loc_default_alignment: "Default Alignment", - s_loc_default_column_width: "Default Column Width", - s_loc_default_font: "Default Font", - s_loc_default_format: "Default Format", - s_loc_default_padding: "Default Padding", - s_loc_delete: "Delete", - s_loc_delete_column: "Delete Column", - s_loc_delete_contents: "Delete Contents", - s_loc_delete_row: "Delete Row", - s_loc_description: "Description", - s_loc_display_clipboard_in: "Display Clipboard in", - s_loc_down: "Down", - s_loc_edit: "Edit", - s_loc_existing_names: "Existing Names", - s_loc_family: "Family", - s_loc_fill_down: "Fill Down", - s_loc_fill_right: "Fill Right", - s_loc_font: "Font", - s_loc_format: "Format", - s_loc_formula: "Formula", - s_loc_function_list: "Function List", - s_loc_functions: "Functions", - s_loc_grid: "Grid", - s_loc_hidden: "Hidden", - s_loc_horizontal: "Horizontal", - s_loc_insert_column: "Insert Column", - s_loc_insert_row: "Insert Row", - s_loc_italic: "Italic", - s_loc_last_sort: "Last Sort", - s_loc_left: "Left", - s_loc_left_border: "Left Border", - s_loc_link: "Link", - s_loc_link_input_box: "Link Input Box", - s_loc_list: "List", - s_loc_load_socialcalc_clipboard_with_this: - "Load SocialCalc Clipboard With This", - s_loc_major_sort: "Major Sort", - s_loc_manual: "Manual", - s_loc_merge_cells: "Merge Cells", - s_loc_middle: "Middle", - s_loc_minor_sort: "Minor Sort", - s_loc_move_insert: "Move Insert", - s_loc_move_paste: "Move Paste", - s_loc_multiXline_input_box: "Multi-line Input Box", - s_loc_name: "Name", - s_loc_names: "Names", - s_loc_no_padding: "No padding", - s_loc_normal: "Normal", - s_loc_number: "Number", - s_loc_number_horizontal: "Number Horizontal", - s_loc_ok: "OK", - s_loc_padding: "Padding", - s_loc_page_name: "Page Name", - s_loc_paste: "Paste", - s_loc_paste_formats: "Paste Formats", - s_loc_plain_text: "Plain Text", - s_loc_recalc: "Recalc", - s_loc_recalculation: "Recalculation", - s_loc_redo: "Redo", - s_loc_right: "Right", - s_loc_right_border: "Right Border", - s_loc_sheet_settings: "SHEET SETTINGS", - s_loc_save: "Save", - s_loc_save_to: "Save to", - s_loc_set_cell_contents: "Set Cell Contents", - s_loc_set_cells_to_sort: "Set Cells To Sort", - s_loc_set_value_to: "Set Value To", - s_loc_set_to_link_format: "Set to Link format", - s_loc_setXclear_move_from: "Set/Clear Move From", - s_loc_show_cell_settings: "Show Cell Settings", - s_loc_show_sheet_settings: "Show Sheet Settings", - s_loc_show_in_new_browser_window: "Show in new browser window", - s_loc_size: "Size", - s_loc_socialcalcXsave_format: "SocialCalc-save format", - s_loc_sort: "Sort", - s_loc_sort_: "Sort ", - s_loc_sort_cells: "Sort Cells", - s_loc_swap_colors: "Swap Colors", - s_loc_tabXdelimited_format: "Tab-delimited format", - s_loc_text: "Text", - s_loc_text_horizontal: "Text Horizontal", - s_loc_this_is_aXbrXsample: "This is a
sample", - s_loc_top: "Top", - s_loc_top_border: "Top Border", - s_loc_undone_steps: "UNDONE STEPS", - s_loc_url: "URL", - s_loc_undo: "Undo", - s_loc_unmerge_cells: "Unmerge Cells", - s_loc_up: "Up", - s_loc_value: "Value", - s_loc_vertical: "Vertical", - s_loc_wikitext: "Wikitext", - s_loc_workspace: "Workspace", - s_loc_XnewX: "[New]", - s_loc_XnoneX: "[None]", - s_loc_Xselect_rangeX: "[select range]", - - // - // SocialCalc Spreadsheet Viewer module, socialcalcviewer.js: - // - - //*** SocialCalc.SpreadsheetViewer - - SVStatuslineheight: 20, // in pixels - SVStatuslineCSS: "font-size:10px;padding:3px 0px;", - - // - // SocialCalc Format Number module, formatnumber2.js: - // - - FormatNumber_separatorchar: ",", // the thousands separator character when formatting numbers for display - FormatNumber_decimalchar: ".", // the decimal separator character when formatting numbers for display - FormatNumber_defaultCurrency: "$", // the currency string used if none specified - - // The following constants are arrays of strings with the short (3 character) and full names of days and months - - s_FormatNumber_daynames: [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - ], - s_FormatNumber_daynames3: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - s_FormatNumber_monthnames: [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ], - s_FormatNumber_monthnames3: [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - ], - s_FormatNumber_am: "AM", - s_FormatNumber_am1: "A", - s_FormatNumber_pm: "PM", - s_FormatNumber_pm1: "P", - - // - // SocialCalc Spreadsheet Formula module, formula1.js: - // - - s_parseerrexponent: "Improperly formed number exponent", - s_parseerrchar: "Unexpected character in formula", - s_parseerrstring: "Improperly formed string", - s_parseerrspecialvalue: "Improperly formed special value", - s_parseerrtwoops: - "Error in formula (two operators inappropriately in a row)", - s_parseerrmissingopenparen: - "Missing open parenthesis in list with comma(s). ", - s_parseerrcloseparennoopen: - "Closing parenthesis without open parenthesis. ", - s_parseerrmissingcloseparen: "Missing close parenthesis. ", - s_parseerrmissingoperand: "Missing operand. ", - s_parseerrerrorinformula: "Error in formula.", - s_calcerrerrorvalueinformula: "Error value in formula", - s_parseerrerrorinformulabadval: "Error in formula resulting in bad value", - s_formularangeresult: "Formula results in range value:", - s_calcerrnumericnan: "Formula results in an bad numeric value", - s_calcerrnumericoverflow: "Numeric overflow", - s_sheetunavailable: "Sheet unavailable:", // when FindSheetInCache returns null - s_calcerrcellrefmissing: "Cell reference missing when expected.", - s_calcerrsheetnamemissing: "Sheet name missing when expected.", - s_circularnameref: "Circular name reference to name", - s_calcerrunknownname: "Unknown name", - s_calcerrincorrectargstofunction: "Incorrect arguments to function", - s_sheetfuncunknownfunction: "Unknown function", - s_sheetfunclnarg: "LN argument must be greater than 0", - s_sheetfunclog10arg: "LOG10 argument must be greater than 0", - s_sheetfunclogsecondarg: - "LOG second argument must be numeric greater than 0", - s_sheetfunclogfirstarg: "LOG first argument must be greater than 0", - s_sheetfuncroundsecondarg: "ROUND second argument must be numeric", - s_sheetfuncddblife: "DDB life must be greater than 1", - s_sheetfuncslnlife: "SLN life must be greater than 1", - - // Function definition text - - s_fdef_ABS: "Absolute value function. ", - s_fdef_ACOS: "Trigonometric arccosine function. ", - s_fdef_AND: "True if all arguments are true. ", - s_fdef_ASIN: "Trigonometric arcsine function. ", - s_fdef_ATAN: "Trigonometric arctan function. ", - s_fdef_ATAN2: "Trigonometric arc tangent function (result is in radians). ", - s_fdef_AVERAGE: "Averages the values. ", - s_fdef_CHOOSE: - "Returns the value specified by the index. The values may be ranges of cells. ", - s_fdef_COLUMNS: "Returns the number of columns in the range. ", - s_fdef_COS: "Trigonometric cosine function (value is in radians). ", - s_fdef_COUNT: - "Counts the number of numeric values, not blank, text, or error. ", - s_fdef_COUNTA: "Counts the number of non-blank values. ", - s_fdef_COUNTBLANK: - 'Counts the number of blank values. (Note: "" is not blank.) ', - s_fdef_COUNTIF: - '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). ', - s_fdef_DATE: - '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. ', - s_fdef_DAVERAGE: - "Averages the values in the specified field in records that meet the criteria. ", - s_fdef_DAY: "Returns the day of month for a date value. ", - s_fdef_DCOUNT: - "Counts the number of numeric values, not blank, text, or error, in the specified field in records that meet the criteria. ", - s_fdef_DCOUNTA: - "Counts the number of non-blank values in the specified field in records that meet the criteria. ", - s_fdef_DDB: - "Returns the amount of depreciation at the given period of time (the default factor is 2 for double-declining balance). ", - s_fdef_DEGREES: "Converts value in radians into degrees. ", - s_fdef_DGET: - "Returns the value of the specified field in the single record that meets the criteria. ", - s_fdef_DMAX: - "Returns the maximum of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DMIN: - "Returns the maximum of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DPRODUCT: - "Returns the result of multiplying the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DSTDEV: - "Returns the sample standard deviation of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DSTDEVP: - "Returns the standard deviation of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DSUM: - "Returns the sum of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DVAR: - "Returns the sample variance of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DVARP: - "Returns the variance of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_EVEN: - "Rounds the value up in magnitude to the nearest even integer. ", - s_fdef_EXACT: - 'Returns "true" if the values are exactly the same, including case, type, etc. ', - s_fdef_EXP: "Returns e raised to the value power. ", - s_fdef_FACT: "Returns factorial of the value. ", - s_fdef_FALSE: 'Returns the logical value "false". ', - s_fdef_FIND: - 'Returns the starting position within string2 of the first occurrence of string1 at or after "start". If start is omitted, 1 is assumed. ', - s_fdef_FV: - "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). ", - s_fdef_HLOOKUP: - "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. ", - s_fdef_HOUR: "Returns the hour portion of a time or date/time value. ", - s_fdef_IF: - "Results in true-value if logical-expression is TRUE or non-zero, otherwise results in false-value. ", - s_fdef_INDEX: - "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)). ", - s_fdef_INT: - "Returns the value rounded down to the nearest integer (towards -infinity). ", - s_fdef_IRR: - "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%). ", - s_fdef_ISBLANK: - 'Returns "true" if the value is a reference to a blank cell. ', - s_fdef_ISERR: - 'Returns "true" if the value is of type "Error" but not "NA". ', - s_fdef_ISERROR: 'Returns "true" if the value is of type "Error". ', - s_fdef_ISLOGICAL: - 'Returns "true" if the value is of type "Logical" (true/false). ', - s_fdef_ISNA: 'Returns "true" if the value is the error type "NA". ', - s_fdef_ISNONTEXT: 'Returns "true" if the value is not of type "Text". ', - s_fdef_ISNUMBER: - 'Returns "true" if the value is of type "Number" (including logical values). ', - s_fdef_ISTEXT: 'Returns "true" if the value is of type "Text". ', - s_fdef_LEFT: - "Returns the specified number of characters from the text value. If count is omitted, 1 is assumed. ", - s_fdef_LEN: "Returns the number of characters in the text value. ", - s_fdef_LN: "Returns the natural logarithm of the value. ", - s_fdef_LOG: "Returns the logarithm of the value using the specified base. ", - s_fdef_LOG10: "Returns the base 10 logarithm of the value. ", - s_fdef_LOWER: - "Returns the text value with all uppercase characters converted to lowercase. ", - s_fdef_MATCH: - "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. ", - s_fdef_MAX: "Returns the maximum of the numeric values. ", - s_fdef_MID: - "Returns the specified number of characters from the text value starting from the specified position. ", - s_fdef_MIN: "Returns the minimum of the numeric values. ", - s_fdef_MINUTE: "Returns the minute portion of a time or date/time value. ", - s_fdef_MOD: - "Returns the remainder of the first value divided by the second. ", - s_fdef_MONTH: "Returns the month part of a date value. ", - s_fdef_N: "Returns the value if it is a numeric value otherwise an error. ", - s_fdef_NA: - "Returns the #N/A error value which propagates through most operations. ", - s_fdef_NOT: "Returns FALSE if value is true, and TRUE if it is false. ", - s_fdef_NOW: "Returns the current date/time. ", - s_fdef_NPER: - "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. ", - s_fdef_NPV: - "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. ", - s_fdef_ODD: "Rounds the value up in magnitude to the nearest odd integer. ", - s_fdef_OR: "True if any argument is true ", - s_fdef_PI: "The value 3.1415926... ", - s_fdef_PMT: - "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). ", - s_fdef_POWER: "Returns the first value raised to the second value power. ", - s_fdef_PRODUCT: "Returns the result of multiplying the numeric values. ", - s_fdef_PROPER: - "Returns the text value with the first letter of each word converted to uppercase and the others to lowercase. ", - s_fdef_PV: - "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). ", - s_fdef_RADIANS: "Converts value in degrees into radians. ", - s_fdef_RATE: - "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%). ", - s_fdef_REPLACE: - "Returns text1 with the specified number of characters starting from the specified position replaced by text2. ", - s_fdef_REPT: "Returns the text repeated the specified number of times. ", - s_fdef_RIGHT: - "Returns the specified number of characters from the text value starting from the end. If count is omitted, 1 is assumed. ", - s_fdef_ROUND: - "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). ", - s_fdef_ROWS: "Returns the number of rows in the range. ", - s_fdef_SECOND: - "Returns the second portion of a time or date/time value (truncated to an integer). ", - s_fdef_SIN: "Trigonometric sine function (value is in radians) ", - s_fdef_SLN: - "Returns the amount of depreciation at each period of time using the straight-line method. ", - s_fdef_SQRT: "Square root of the value ", - s_fdef_STDEV: - "Returns the sample standard deviation of the numeric values. ", - s_fdef_STDEVP: "Returns the standard deviation of the numeric values. ", - s_fdef_SUBSTITUTE: - 'Returns text1 with the all occurrences of oldtext replaced by newtext. If "occurrence" is present, then only that occurrence is replaced. ', - s_fdef_SUM: - "Adds the numeric values. The values to the sum function may be ranges in the form similar to A1:B5. ", - s_fdef_SUMIF: - '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. ', - s_fdef_SYD: "Depreciation by Sum of Year's Digits method. ", - s_fdef_T: "Returns the text value or else a null string. ", - s_fdef_TAN: "Trigonometric tangent function (value is in radians) ", - s_fdef_TIME: - "Returns the time value given the specified hour, minute, and second. ", - s_fdef_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. ', - s_fdef_TRIM: - "Returns the text value with leading, trailing, and repeated spaces removed. ", - s_fdef_TRUE: 'Returns the logical value "true". ', - s_fdef_TRUNC: - "Truncates the value to the specified number of decimal places. If precision is negative, truncate to powers of 10. ", - s_fdef_UPPER: - "Returns the text value with all lowercase characters converted to uppercase. ", - s_fdef_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. ", - s_fdef_VAR: "Returns the sample variance of the numeric values. ", - s_fdef_VARP: "Returns the variance of the numeric values. ", - s_fdef_VLOOKUP: - "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. ", - s_fdef_WEEKDAY: - "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. ", - s_fdef_YEAR: "Returns the year part of a date value. ", - - s_farg_v: "value", - s_farg_vn: "value1, value2, ...", - s_farg_xy: "valueX, valueY", - s_farg_choose: "index, value1, value2, ...", - s_farg_range: "range", - s_farg_rangec: "range, criteria", - s_farg_date: "year, month, day", - s_farg_dfunc: "databaserange, fieldname, criteriarange", - s_farg_ddb: "cost, salvage, lifetime, period [, factor]", - s_farg_find: "string1, string2 [, start]", - s_farg_fv: "rate, n, payment, [pv, [paytype]]", - s_farg_hlookup: "value, range, row, [rangelookup]", - s_farg_iffunc: "logical-expression, true-value, false-value", - s_farg_index: "range, rownum, colnum", - s_farg_irr: "range, [guess]", - s_farg_tc: "text, count", - s_farg_log: "value, base", - s_farg_match: "value, range, [rangelookup]", - s_farg_mid: "text, start, length", - s_farg_nper: "rate, payment, pv, [fv, [paytype]]", - s_farg_npv: "rate, value1, value2, ...", - s_farg_pmt: "rate, n, pv, [fv, [paytype]]", - s_farg_pv: "rate, n, payment, [fv, [paytype]]", - s_farg_rate: "n, payment, pv, [fv, [paytype, [guess]]]", - s_farg_replace: "text1, start, length, text2", - s_farg_vp: "value, [precision]", - s_farg_valpre: "value, precision", - s_farg_csl: "cost, salvage, lifetime", - s_farg_cslp: "cost, salvage, lifetime, period", - s_farg_subs: "text1, oldtext, newtext [, occurrence]", - s_farg_sumif: "range1, criteria [, range2]", - s_farg_hms: "hour, minute, second", - s_farg_txt: "text", - s_farg_vlookup: "value, range, col, [rangelookup]", - s_farg_weekday: "date, [type]", - s_farg_dt: "date", - - function_classlist: [ - "all", - "stat", - "lookup", - "datetime", - "financial", - "test", - "math", - "text", - ], // order of function classes - - s_fclass_all: "All", - s_fclass_stat: "Statistics", - s_fclass_lookup: "Lookup", - s_fclass_datetime: "Date & Time", - s_fclass_financial: "Financial", - s_fclass_test: "Test", - s_fclass_math: "Math", - s_fclass_text: "Text", - - lastone: null, - }; - - // Default classnames for use with SocialCalc.ConstantsSetClasses: - - SocialCalc.ConstantsDefaultClasses = { - defaultComment: "", - defaultCommentNoGrid: "", - defaultHighlightTypeCursor: "", - defaultHighlightTypeRange: "", - defaultColname: "", - defaultSelectedColname: "", - defaultRowname: "", - defaultSelectedRowname: "", - defaultUpperLeft: "", - defaultSkippedCell: "", - defaultPaneDivider: "", - cteGriddiv: "", // this one has no Style version with it - defaultInputEcho: { - classname: "", - style: "filter:alpha(opacity=90);opacity:.9;", - }, // so FireFox won't show warning - TCmain: "", - TCendcap: "", - TCpaneslider: "", - TClessbutton: "", - TCmorebutton: "", - TCscrollarea: "", - TCthumb: "", - TCPStrackingline: "", - TCTDFSthumbstatus: "", - TDpopupElement: "", - }; - - // - // SocialCalc.ConstantsSetClasses(prefix) - // - // This routine goes through all of the xyzClass/xyzStyle pairs and sets the Class to a default and - // turns off the Style, if present. The prefix is put before each default. - // The list of items to set is in SocialCalc.ConstantsDefaultClasses. The names there - // correspond to the "xyz" parts. If there is a value, it is the default to set. If the - // default is a null, no change is made. If the default is the null string (""), the - // name of the item is used (e.g., "defaultComment" would use the classname "defaultComment"). - // If the default is an object, then it expects {classname: classname, style: stylestring} - this - // lets you combine both. - // - - SocialCalc.ConstantsSetClasses = function (prefix) { - var defaults = SocialCalc.ConstantsDefaultClasses; - var scc = SocialCalc.Constants; - var item; - - prefix = prefix || ""; - - for (item in defaults) { - if (typeof defaults[item] == "string") { - scc[item + "Class"] = prefix + (defaults[item] || item); - if (scc[item + "Style"] !== undefined) { - scc[item + "Style"] = ""; - } - } else if (typeof defaults[item] == "object") { - scc[item + "Class"] = prefix + (defaults[item].classname || item); - scc[item + "Style"] = defaults[item].style; - } - } - }; - - // - // The main SocialCalc code module of the SocialCalc package - // - /* -// (c) Copyright 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - /* - -**** Overview **** - -This is the beginning of a library of routines for displaying and editing spreadsheet -data in a browser. The HTML that includes this does not need to have anything -specific to the spreadsheet or editor already present -- everything is dynamically -added to the DOM by this code, including the rendered sheet and any editing controls. - -The library has a few parts. This is the main SocialCalc code module. -Other parts are the Table Editor module, the Formula module, and the Format Number module. -Note: The Table Editor module is licensed under a different license than this module. - -The class/object style is derived from O'Reilly's JavaScript by Flanagan, 5th Edition, -section 9.3, page 157. - -All of the data, object definitions, functions, etc., are stored as properties of the SocialCalc -object so as not to clutter up the global variables nor conflict with other names. - -A design goal (not tested yet for success) is to make it possible to have more than one -spreadsheet active on a page, perhaps even open for editing. It is assumed, though, that -there is only one mouse and one keyboard (a good assumption on most PCs today but not in the -new "touch and surface world" Apple and Microsoft are working towards). - -The testing has been on Windows Firefox (2 and 3), -Internet Explorer (6 and 7), Opera (9.23 and mainly later), Mac Safari (3.1), and Mac Firefox (2.0.0.6). -There are small issues with Firefox before 2.0 (cosmetic with drag handles) and larger ones -with Opera before 9.5 (the Delete key isn't recognized in some cases -- the 9.5 version was still -in beta and this bug affects other products like GMail, I believe). - -The data is stored in a SocialCalc.Sheet object. The data is organized in a form similar to that -used by SocialCalc 1.1.0. There is a function for converting a normal SocialCalc spreadsheet -save data string (the spreadsheet part of a SocialCalc data file) into this internal form. - -The SocialCalc.RenderContext class provides methods for rendering a table into the DOM representing -part of the spreadsheet. It is assumed that the spreadsheet could possibly be very large -and that rendering the whole thing at once could be too time consuming. It is also set up so -that it might be possible to have some of the sheet data only be loaded on demand (such as by Ajax). -The rendering can render cells to the right and below the already active area of the spreadsheet -so that you can scroll to that "clean" area without explicitly doing "add row/column". The class also -does simple operations such as "scrolling" within that table. The table may optionally include -row and column headers and may be split into panes. Most of the code assumes any number of panes, -but only the rightmost pane has scrolling code. In normal operation there would be one or two -panes horizontally and vertically. The panes may start on any row/column, though a given row/column -should only appear in one pane at a time (not all code enforces this, yet). - -The RenderContext is designed to be rendered as part of a SocialCalc.TableEditor. The TableEditor -includes the spreadsheet grid as well as scrollbars, pane sliders, and (eventually) editing controls. -The layout is dynamic and may be recomputed on the fly, such as in response to resizing the browser -window. - -The scrollbars and pane sliders are created using SocialCalc.TableControl objects. These in turn -make use of Dragging, ToolTip, Button, and MouseWheel functions. - -The keyboard input is handled by keyboard code. - -There are also some helper routines. - -More comments yet to come... - -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; - - // ************************************* - // - // Shared values - // - // These are "global" values shared by the classes, including default settings - // - // ************************************* - - // Callbacks - - SocialCalc.Callbacks = { - // The next two are used by SocialCalc.format_text_for_display - - // The function to expand wiki text - should be set if you want wikitext expansion - // The form is: expand_wiki(displayvalue, sheetobj, linkstyle, valueformat) - // valueformat is text-wiki followed by optional sub-formats, e.g., text-wikipagelink - - expand_wiki: null, - - expand_markup: function ( - displayvalue, - sheetobj, - linkstyle // the old function to expand wiki text - may be replaced - ) { - return SocialCalc.default_expand_markup( - displayvalue, - sheetobj, - linkstyle - ); - }, - - // MakePageLink is used to create the href for a link to another "page" - // The form is: MakePageLink(pagename, workspacename, linktyle, valueformat), returns string - - MakePageLink: null, - - // NormalizeSheetName is used to make different variations of sheetnames use the same cache slot - - NormalizeSheetName: null, // use default - lowercase - }; - - // Shared flags - - // none at present - - // ************************************* - // - // Cell class: - // - // ************************************* - - // - // Class SocialCalc.Cell - // - // Usage: var s = new SocialCalc.Cell(coord); - // - // Cell attributes include: - // - // coord: the column/row as a string, e.g., "A1" - // datavalue: the value to be used for computation and formatting for display, - // string or numeric (tolerant of numbers stored as strings) - // datatype: if present, v=numeric value, t=text value, f=formula, - // or c=constant that is not a simple number (like "$1.20") - // formula: if present, the formula (without leading "=") for computation or the constant - // valuetype: first char is main type, the following are sub-types. - // Main types are b=blank cell, n=numeric, t=text, e=error - // Examples of using sub-types would be "nt" for a numeric time value, "n$" for currency, "nl" for logical - // displayvalue: if present, rendered version of datavalue with formatting attributes applied - // parseinfo: if present, cached parsed version of formula - // - // The following optional values, if present, are mainly used in rendering, overriding defaults: - // - // bt, br, bb, bl: number of border's definition - // layout: layout (vertical alignment, padding) definition number - // font: font definition number - // color: text color definition number - // bgcolor: background color definition number - // cellformat: cell format (horizontal alignment) definition number - // nontextvalueformat: custom format definition number for non-text values, e.g., numbers - // textvalueformat: custom format definition number for text values - // colspan, rowspan: number of cells to span for merged cells (only on main cell) - // cssc: custom css classname for cell, as text (no special chars) - // csss: custom css style definition - // mod: modification allowed flag "y" if present - // comment: cell comment string - // - - SocialCalc.Cell = function (coord) { - this.coord = coord; - this.datavalue = ""; - this.datatype = null; - this.formula = ""; - this.valuetype = "b"; - }; - - // The types of cell properties - // - // Type 1: Base, Type 2: Attribute, Type 3: Special (e.g., displaystring, parseinfo) - - SocialCalc.CellProperties = { - coord: 1, - datavalue: 1, - datatype: 1, - formula: 1, - valuetype: 1, - errors: 1, - comment: 1, - bt: 2, - br: 2, - bb: 2, - bl: 2, - layout: 2, - font: 2, - color: 2, - bgcolor: 2, - cellformat: 2, - nontextvalueformat: 2, - textvalueformat: 2, - colspan: 2, - rowspan: 2, - cssc: 2, - csss: 2, - mod: 2, - displaystring: 3, // used to cache rendered HTML of cell contents - parseinfo: 3, // used to cache parsed formulas - hcolspan: 3, - hrowspan: 3, // spans taking hidden cols/rows into account (!!! NOT YET !!!) - }; - - SocialCalc.CellPropertiesTable = { - bt: "borderstyle", - br: "borderstyle", - bb: "borderstyle", - bl: "borderstyle", - layout: "layout", - font: "font", - color: "color", - bgcolor: "color", - cellformat: "cellformat", - nontextvalueformat: "valueformat", - textvalueformat: "valueformat", - }; - - // ************************************* - // - // Sheet class: - // - // ************************************* - - // - // Class SocialCalc.Sheet - // - // Usage: var s = new SocialCalc.Sheet(); - // - - SocialCalc.Sheet = function () { - SocialCalc.ResetSheet(this); - - // Set other values: - // - // sheet.statuscallback(data, status, arg, this.statuscallbackparams) is called - // during recalc and commands. - // - // During recalc, data is the current recalcdata. - // The values for status and the corresponding arg are: - // - // calcorder, {coord: coord, total: celllist length, count: count} [0 or more times per recalc] - // calccheckdone, calclist length [once per recalc] - // calcstep, {coord: coord, total: calclist length, count: count} [0 or more times per recalc] - // calcloading, {sheetname: name-of-sheet} - // calcserverfunc, {funcname: name-of-function, coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds [once per recalc] - // - // During commands, data is SocialCalc.SheetCommandInfo. - // These values for status and arg are: - // - // cmdstart, cmdstr - // cmdend - // - - this.statuscallback = null; // routine called with cmdstart, calcstart, etc., status and args: - // sheet.statuscallback(data, status, arg, params) - this.statuscallbackparams = null; // parameters passed to that routine - }; - - // - // SocialCalc.ResetSheet(sheet) - // - // Resets (and/or initializes) sheet data values. - // - - SocialCalc.ResetSheet = function (sheet, reload) { - // properties: - - sheet.cells = {}; // at least one for each non-blank cell: coord: cell-object - sheet.attribs = - // sheet attributes - { - lastcol: 1, - lastrow: 1, - defaultlayout: 0, - }; - sheet.rowattribs = { - hide: {}, // access by row number - height: {}, - }; - sheet.colattribs = { - width: {}, // access by col name - hide: {}, - }; - sheet.names = {}; // Each is: {desc: "optional description", definition: "B5, A1:B7, or =formula"} - sheet.layouts = []; - sheet.layouthash = {}; - sheet.fonts = []; - sheet.fonthash = {}; - sheet.colors = []; - sheet.colorhash = {}; - sheet.borderstyles = []; - sheet.borderstylehash = {}; - sheet.cellformats = []; - sheet.cellformathash = {}; - sheet.valueformats = []; - sheet.valueformathash = {}; - - sheet.copiedfrom = ""; // if a range, then this was loaded from a saved range as clipboard content - - sheet.changes = new SocialCalc.UndoStack(); - - sheet.renderneeded = false; - - sheet.changedrendervalues = true; // if true, spans and/or fonts have changed (set by ExecuteSheetCommand & GetStyle) - - sheet.recalcchangedavalue = false; // true if a recalc resulted in a change to a cell's calculated value - }; - - // Methods: - - SocialCalc.Sheet.prototype.ResetSheet = function () { - SocialCalc.ResetSheet(this); - }; - SocialCalc.Sheet.prototype.AddCell = function (newcell) { - return (this.cells[newcell.coord] = newcell); - }; - SocialCalc.Sheet.prototype.GetAssuredCell = function (coord) { - return this.cells[coord] || this.AddCell(new SocialCalc.Cell(coord)); - }; - SocialCalc.Sheet.prototype.ParseSheetSave = function (savedsheet) { - SocialCalc.ParseSheetSave(savedsheet, this); - }; - SocialCalc.Sheet.prototype.CellFromStringParts = function (cell, parts, j) { - return SocialCalc.CellFromStringParts(this, cell, parts, j); - }; - SocialCalc.Sheet.prototype.CreateSheetSave = function (range, canonicalize) { - return SocialCalc.CreateSheetSave(this, range, canonicalize); - }; - SocialCalc.Sheet.prototype.CellToString = function (cell) { - return SocialCalc.CellToString(this, cell); - }; - SocialCalc.Sheet.prototype.CanonicalizeSheet = function (full) { - return SocialCalc.CanonicalizeSheet(this, full); - }; - SocialCalc.Sheet.prototype.EncodeCellAttributes = function (coord) { - return SocialCalc.EncodeCellAttributes(this, coord); - }; - SocialCalc.Sheet.prototype.EncodeSheetAttributes = function () { - return SocialCalc.EncodeSheetAttributes(this); - }; - SocialCalc.Sheet.prototype.DecodeCellAttributes = function ( - coord, - attribs, - range - ) { - return SocialCalc.DecodeCellAttributes(this, coord, attribs, range); - }; - SocialCalc.Sheet.prototype.DecodeSheetAttributes = function (attribs) { - return SocialCalc.DecodeSheetAttributes(this, attribs); - }; - - SocialCalc.Sheet.prototype.ScheduleSheetCommands = function ( - cmd, - saveundo, - isRemote - ) { - return SocialCalc.ScheduleSheetCommands(this, cmd, saveundo, isRemote); - }; - SocialCalc.Sheet.prototype.SheetUndo = function () { - return SocialCalc.SheetUndo(this); - }; - SocialCalc.Sheet.prototype.SheetRedo = function () { - return SocialCalc.SheetRedo(this); - }; - SocialCalc.Sheet.prototype.CreateAuditString = function () { - return SocialCalc.CreateAuditString(this); - }; - SocialCalc.Sheet.prototype.GetStyleNum = function (atype, style) { - return SocialCalc.GetStyleNum(this, atype, style); - }; - SocialCalc.Sheet.prototype.GetStyleString = function (atype, num) { - return SocialCalc.GetStyleString(this, atype, num); - }; - SocialCalc.Sheet.prototype.RecalcSheet = function () { - return SocialCalc.RecalcSheet(this); - }; - - // - // Sheet save format: - // - // linetype:param1:param2:... - // - // Linetypes are: - // - // version:versionname - version of this format. Currently 1.4. - // - // cell:coord:type:value...:type:value... - Types are as follows: - // - // v:value - straight numeric value - // t:value - straight text/wiki-text in cell, encoded to handle \, :, newlines - // vt:fulltype:value - value with value type/subtype - // vtf:fulltype:value:formulatext - formula resulting in value with value type/subtype, value and text encoded - // vtc:fulltype:value:valuetext - formatted text constant resulting in value with value type/subtype, value and text encoded - // vf:fvalue:formulatext - formula resulting in value, value and text encoded (obsolete: only pre format version 1.1) - // fvalue - first char is "N" for numeric value, "T" for text value, "H" for HTML value, rest is the value - // e:errortext - Error text. Non-blank means formula parsing/calculation results in error. - // b:topborder#:rightborder#:bottomborder#:leftborder# - border# in sheet border list or blank if none - // l:layout# - number in cell layout list - // f:font# - number in sheet fonts list - // c:color# - sheet color list index for text - // bg:color# - sheet color list index for background color - // cf:format# - sheet cell format number for explicit format (align:left, etc.) - // cvf:valueformat# - sheet cell value format number (obsolete: only pre format v1.2) - // tvf:valueformat# - sheet cell text value format number - // ntvf:valueformat# - sheet cell non-text value format number - // colspan:numcols - number of columns spanned in merged cell - // rowspan:numrows - number of rows spanned in merged cell - // cssc:classname - name of CSS class to be used for cell when published instead of one calculated here - // csss:styletext - explicit CSS style information, encoded to handle :, etc. - // mod:allow - if "y" allow modification of cell for live "view" recalc - // comment:value - encoded text of comment for this cell (added in v1.5) - // - // col: - // w:widthval - number, "auto" (no width in tag), number%, or blank (use default) - // hide: - yes/no, no is assumed if missing - // row: - // hide - yes/no, no is assumed if missing - // - // sheet: - // c:lastcol - number - // r:lastrow - number - // w:defaultcolwidth - number, "auto", number%, or blank (default->80) - // h:defaultrowheight - not used - // tf:format# - cell format number for sheet default for text values - // ntf:format# - cell format number for sheet default for non-text values (i.e., numbers) - // layout:layout# - default cell layout number in cell layout list - // font:font# - default font number in sheet font list - // vf:valueformat# - default number value format number in sheet valueformat list (obsolete: only pre format version 1.2) - // ntvf:valueformat# - default non-text (number) value format number in sheet valueformat list - // tvf:valueformat# - default text value format number in sheet valueformat list - // color:color# - default number for text color in sheet color list - // bgcolor:color# - default number for background color in sheet color list - // circularreferencecell:coord - cell coord with a circular reference - // recalc:value - on/off (on is default). If not "off", appropriate changes to the sheet cause a recalc - // needsrecalc:value - yes/no (no is default). If "yes", formula values are not up to date - // - // name:name:description:value - name definition, name in uppercase, with value being "B5", "A1:B7", or "=formula"; - // description and value are encoded. - // font:fontnum:value - text of font definition (style weight size family) for font fontnum - // "*" for "style weight", size, or family, means use default (first look to sheet, then builtin) - // color:colornum:rgbvalue - text of color definition (e.g., rgb(255,255,255)) for color colornum - // border:bordernum:value - text of border definition (thickness style color) for border bordernum - // layout:layoutnum:value - text of vertical alignment and padding style for cell layout layoutnum (* for default): - // vertical-alignment:vavalue;padding:topval rightval bottomval leftval; - // cellformat:cformatnum:value - text of cell alignment (left/center/right) for cellformat cformatnum - // valueformat:vformatnum:value - text of number format (see FormatValueForDisplay) for valueformat vformatnum (changed in v1.2) - // clipboardrange:upperleftcoord:bottomrightcoord - ignored -- from wikiCalc - // clipboard:coord:type:value:... - ignored -- from wikiCalc - // - // If this is clipboard contents, then there is also information to facilitate pasting: - // - // copiedfrom:upperleftcoord:bottomrightcoord - range from which this was copied - // - - // Functions: - - SocialCalc.ParseSheetSave = function (savedsheet, sheetobj) { - var lines = savedsheet.split(/\r\n|\n/); - var parts = []; - var line; - var i, j, t, v, coord, cell, attribs, name; - var scc = SocialCalc.Constants; - - for (i = 0; i < lines.length; i++) { - line = lines[i]; - parts = line.split(":"); - switch (parts[0]) { - case "cell": - cell = sheetobj.GetAssuredCell(parts[1]); - j = 2; - sheetobj.CellFromStringParts(cell, parts, j); - break; - - case "col": - coord = parts[1]; - j = 2; - while ((t = parts[j++])) { - switch (t) { - case "w": - sheetobj.colattribs.width[coord] = parts[j++]; // must be text - could be auto or %, etc. - break; - case "hide": - sheetobj.colattribs.hide[coord] = parts[j++]; - break; - default: - throw scc.s_pssUnknownColType + " '" + t + "'"; - break; - } - } - break; - - case "row": - coord = parts[1] - 0; - j = 2; - while ((t = parts[j++])) { - switch (t) { - case "h": - sheetobj.rowattribs.height[coord] = parts[j++] - 0; - break; - case "hide": - sheetobj.rowattribs.hide[coord] = parts[j++]; - break; - default: - throw scc.s_pssUnknownRowType + " '" + t + "'"; - break; - } - } - break; - - case "sheet": - attribs = sheetobj.attribs; - j = 1; - while ((t = parts[j++])) { - switch (t) { - case "c": - attribs.lastcol = parts[j++] - 0; - break; - case "r": - attribs.lastrow = parts[j++] - 0; - break; - case "w": - attribs.defaultcolwidth = parts[j++] + ""; - break; - case "h": - attribs.defaultrowheight = parts[j++] - 0; - break; - case "tf": - attribs.defaulttextformat = parts[j++] - 0; - break; - case "ntf": - attribs.defaultnontextformat = parts[j++] - 0; - break; - case "layout": - attribs.defaultlayout = parts[j++] - 0; - break; - case "font": - attribs.defaultfont = parts[j++] - 0; - break; - case "tvf": - attribs.defaulttextvalueformat = parts[j++] - 0; - break; - case "ntvf": - attribs.defaultnontextvalueformat = parts[j++] - 0; - break; - case "color": - attribs.defaultcolor = parts[j++] - 0; - break; - case "bgcolor": - attribs.defaultbgcolor = parts[j++] - 0; - break; - case "circularreferencecell": - attribs.circularreferencecell = parts[j++]; - break; - case "recalc": - attribs.recalc = parts[j++]; - break; - case "needsrecalc": - attribs.needsrecalc = parts[j++]; - break; - default: - j += 1; - break; - } - } - break; - - case "name": - name = SocialCalc.decodeFromSave(parts[1]).toUpperCase(); - sheetobj.names[name] = { desc: SocialCalc.decodeFromSave(parts[2]) }; - sheetobj.names[name].definition = SocialCalc.decodeFromSave(parts[3]); - break; - - case "layout": - parts = lines[i].match(/^layout\:(\d+)\:(.+)$/); // layouts can have ":" in them - sheetobj.layouts[parts[1] - 0] = parts[2]; - sheetobj.layouthash[parts[2]] = parts[1] - 0; - break; - - case "font": - sheetobj.fonts[parts[1] - 0] = parts[2]; - sheetobj.fonthash[parts[2]] = parts[1] - 0; - break; - - case "color": - sheetobj.colors[parts[1] - 0] = parts[2]; - sheetobj.colorhash[parts[2]] = parts[1] - 0; - break; - - case "border": - sheetobj.borderstyles[parts[1] - 0] = parts[2]; - sheetobj.borderstylehash[parts[2]] = parts[1] - 0; - break; - - case "cellformat": - v = SocialCalc.decodeFromSave(parts[2]); - sheetobj.cellformats[parts[1] - 0] = v; - sheetobj.cellformathash[v] = parts[1] - 0; - break; - - case "valueformat": - v = SocialCalc.decodeFromSave(parts[2]); - sheetobj.valueformats[parts[1] - 0] = v; - sheetobj.valueformathash[v] = parts[1] - 0; - break; - - case "version": - break; - - case "copiedfrom": - sheetobj.copiedfrom = parts[1] + ":" + parts[2]; - break; - - case "clipboardrange": // in save versions up to 1.3. Ignored. - case "clipboard": - break; - - case "": - break; - - default: - alert(scc.s_pssUnknownLineType + " '" + parts[0] + "'"); - throw scc.s_pssUnknownLineType + " '" + parts[0] + "'"; - break; - } - parts = null; - } - }; - - // - // SocialCalc.CellFromStringParts(sheet, cell, parts, j) - // - // Takes string that has been split by ":" in parts, starting at item j, - // and fills in cell assuming save format. - // - - SocialCalc.CellFromStringParts = function (sheet, cell, parts, j) { - var cell, t, v; - - while ((t = parts[j++])) { - switch (t) { - case "v": - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - cell.datatype = "v"; - cell.valuetype = "n"; - break; - case "t": - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - cell.datatype = "t"; - cell.valuetype = SocialCalc.Constants.textdatadefaulttype; - break; - case "vt": - v = parts[j++]; - cell.valuetype = v; - if (v.charAt(0) == "n") { - cell.datatype = "v"; - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - } else { - cell.datatype = "t"; - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - } - break; - case "vtf": - v = parts[j++]; - cell.valuetype = v; - if (v.charAt(0) == "n") { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - } else { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - } - cell.formula = SocialCalc.decodeFromSave(parts[j++]); - cell.datatype = "f"; - break; - case "vtc": - v = parts[j++]; - cell.valuetype = v; - if (v.charAt(0) == "n") { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - } else { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - } - cell.formula = SocialCalc.decodeFromSave(parts[j++]); - cell.datatype = "c"; - break; - case "e": - cell.errors = SocialCalc.decodeFromSave(parts[j++]); - break; - case "b": - cell.bt = parts[j++] - 0; - cell.br = parts[j++] - 0; - cell.bb = parts[j++] - 0; - cell.bl = parts[j++] - 0; - break; - case "l": - cell.layout = parts[j++] - 0; - break; - case "f": - cell.font = parts[j++] - 0; - break; - case "c": - cell.color = parts[j++] - 0; - break; - case "bg": - cell.bgcolor = parts[j++] - 0; - break; - case "cf": - cell.cellformat = parts[j++] - 0; - break; - case "ntvf": - cell.nontextvalueformat = parts[j++] - 0; - break; - case "tvf": - cell.textvalueformat = parts[j++] - 0; - break; - case "colspan": - cell.colspan = parts[j++] - 0; - break; - case "rowspan": - cell.rowspan = parts[j++] - 0; - break; - case "cssc": - cell.cssc = parts[j++]; - break; - case "csss": - cell.csss = SocialCalc.decodeFromSave(parts[j++]); - break; - case "mod": - j += 1; - break; - case "comment": - cell.comment = SocialCalc.decodeFromSave(parts[j++]); - break; - default: - throw SocialCalc.Constants.s_cfspUnknownCellType + " '" + t + "'"; - break; - } - } - }; - - SocialCalc.sheetfields = [ - "defaultrowheight", - "defaultcolwidth", - "circularreferencecell", - "recalc", - "needsrecalc", - ]; - SocialCalc.sheetfieldsshort = [ - "h", - "w", - "circularreferencecell", - "recalc", - "needsrecalc", - ]; - - SocialCalc.sheetfieldsxlat = [ - "defaulttextformat", - "defaultnontextformat", - "defaulttextvalueformat", - "defaultnontextvalueformat", - "defaultcolor", - "defaultbgcolor", - "defaultfont", - "defaultlayout", - ]; - SocialCalc.sheetfieldsxlatshort = [ - "tf", - "ntf", - "tvf", - "ntvf", - "color", - "bgcolor", - "font", - "layout", - ]; - SocialCalc.sheetfieldsxlatxlt = [ - "cellformat", - "cellformat", - "valueformat", - "valueformat", - "color", - "color", - "font", - "layout", - ]; - - // - // sheetstr = SocialCalc.CreateSheetSave(sheetobj, range, canonicalize) - // - // Creates a text representation of the sheetobj data. - // If the range is present then only those cells are saved - // (as clipboard data with "copiedfrom" set). - // - - SocialCalc.CreateSheetSave = function (sheetobj, range, canonicalize) { - var cell, - cr1, - cr2, - row, - col, - coord, - attrib, - line, - value, - formula, - i, - t, - r, - b, - l, - name, - blanklen; - var result = []; - - var prange; - - sheetobj.CanonicalizeSheet( - canonicalize || SocialCalc.Constants.doCanonicalizeSheet - ); - var xlt = sheetobj.xlt; - - if (range) { - prange = SocialCalc.ParseRange(range); - } else { - prange = { - cr1: { row: 1, col: 1 }, - cr2: { row: xlt.maxrow, col: xlt.maxcol }, - }; - } - cr1 = prange.cr1; - cr2 = prange.cr2; - - result.push("version:1.5"); - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - coord = SocialCalc.crToCoord(col, row); - cell = sheetobj.cells[coord]; - if (!cell) continue; - line = sheetobj.CellToString(cell); - if (line.length == 0) continue; // ignore completely empty cells - line = "cell:" + coord + line; - result.push(line); - } - } - - for (col = 1; col <= xlt.maxcol; col++) { - coord = SocialCalc.rcColname(col); - if (sheetobj.colattribs.width[coord]) - result.push("col:" + coord + ":w:" + sheetobj.colattribs.width[coord]); - if (sheetobj.colattribs.hide[coord]) - result.push( - "col:" + coord + ":hide:" + sheetobj.colattribs.hide[coord] - ); - } - - for (row = 1; row <= xlt.maxrow; row++) { - if (sheetobj.rowattribs.height[row]) - result.push("row:" + row + ":h:" + sheetobj.rowattribs.height[row]); - if (sheetobj.rowattribs.hide[row]) - result.push("row:" + row + ":hide:" + sheetobj.rowattribs.hide[row]); - } - - line = "sheet:c:" + xlt.maxcol + ":r:" + xlt.maxrow; - - for (i = 0; i < SocialCalc.sheetfields.length; i++) { - // non-xlated values - value = SocialCalc.encodeForSave( - sheetobj.attribs[SocialCalc.sheetfields[i]] - ); - if (value) line += ":" + SocialCalc.sheetfieldsshort[i] + ":" + value; - } - for (i = 0; i < SocialCalc.sheetfieldsxlat.length; i++) { - // xlated values - value = sheetobj.attribs[SocialCalc.sheetfieldsxlat[i]]; - if (value) - line += - ":" + - SocialCalc.sheetfieldsxlatshort[i] + - ":" + - xlt[SocialCalc.sheetfieldsxlatxlt[i] + "sxlat"][value]; - } - - result.push(line); - - for (i = 1; i < xlt.newborderstyles.length; i++) { - result.push("border:" + i + ":" + xlt.newborderstyles[i]); - } - - for (i = 1; i < xlt.newcellformats.length; i++) { - result.push( - "cellformat:" + - i + - ":" + - SocialCalc.encodeForSave(xlt.newcellformats[i]) - ); - } - - for (i = 1; i < xlt.newcolors.length; i++) { - result.push("color:" + i + ":" + xlt.newcolors[i]); - } - - for (i = 1; i < xlt.newfonts.length; i++) { - result.push("font:" + i + ":" + xlt.newfonts[i]); - } - - for (i = 1; i < xlt.newlayouts.length; i++) { - result.push("layout:" + i + ":" + xlt.newlayouts[i]); - } - - for (i = 1; i < xlt.newvalueformats.length; i++) { - result.push( - "valueformat:" + - i + - ":" + - SocialCalc.encodeForSave(xlt.newvalueformats[i]) - ); - } - - for (i = 0; i < xlt.namesorder.length; i++) { - name = xlt.namesorder[i]; - result.push( - "name:" + - SocialCalc.encodeForSave(name).toUpperCase() + - ":" + - SocialCalc.encodeForSave(sheetobj.names[name].desc) + - ":" + - SocialCalc.encodeForSave(sheetobj.names[name].definition) - ); - } - - if (range) { - result.push( - "copiedfrom:" + - SocialCalc.crToCoord(cr1.col, cr1.row) + - ":" + - SocialCalc.crToCoord(cr2.col, cr2.row) - ); - } - - result.push(""); // one extra to get extra \n - - delete sheetobj.xlt; // clean up - - return result.join("\n"); - }; - - // - // line = SocialCalc.CellToString(sheet, cell) - // - - SocialCalc.CellToString = function (sheet, cell) { - var cell, line, value, formula, t, r, b, l, xlt; - - line = ""; - - if (!cell) return line; - - value = SocialCalc.encodeForSave(cell.datavalue); - if (cell.datatype == "v") { - if (cell.valuetype == "n") line += ":v:" + value; - else line += ":vt:" + cell.valuetype + ":" + value; - } else if (cell.datatype == "t") { - if (cell.valuetype == SocialCalc.Constants.textdatadefaulttype) - line += ":t:" + value; - else line += ":vt:" + cell.valuetype + ":" + value; - } else { - formula = SocialCalc.encodeForSave(cell.formula); - if (cell.datatype == "f") { - line += ":vtf:" + cell.valuetype + ":" + value + ":" + formula; - } else if (cell.datatype == "c") { - line += ":vtc:" + cell.valuetype + ":" + value + ":" + formula; - } - } - if (cell.errors) { - line += ":e:" + SocialCalc.encodeForSave(cell.errors); - } - t = cell.bt || ""; - r = cell.br || ""; - b = cell.bb || ""; - l = cell.bl || ""; - - if (sheet.xlt) { - // if have canonical save info - xlt = sheet.xlt; - if (t || r || b || l) - line += - ":b:" + - xlt.borderstylesxlat[t || 0] + - ":" + - xlt.borderstylesxlat[r || 0] + - ":" + - xlt.borderstylesxlat[b || 0] + - ":" + - xlt.borderstylesxlat[l || 0]; - if (cell.layout) line += ":l:" + xlt.layoutsxlat[cell.layout]; - if (cell.font) line += ":f:" + xlt.fontsxlat[cell.font]; - if (cell.color) line += ":c:" + xlt.colorsxlat[cell.color]; - if (cell.bgcolor) line += ":bg:" + xlt.colorsxlat[cell.bgcolor]; - if (cell.cellformat) - line += ":cf:" + xlt.cellformatsxlat[cell.cellformat]; - if (cell.textvalueformat) - line += ":tvf:" + xlt.valueformatsxlat[cell.textvalueformat]; - if (cell.nontextvalueformat) - line += ":ntvf:" + xlt.valueformatsxlat[cell.nontextvalueformat]; - } else { - if (t || r || b || l) line += ":b:" + t + ":" + r + ":" + b + ":" + l; - if (cell.layout) line += ":l:" + cell.layout; - if (cell.font) line += ":f:" + cell.font; - if (cell.color) line += ":c:" + cell.color; - if (cell.bgcolor) line += ":bg:" + cell.bgcolor; - if (cell.cellformat) line += ":cf:" + cell.cellformat; - if (cell.textvalueformat) line += ":tvf:" + cell.textvalueformat; - if (cell.nontextvalueformat) line += ":ntvf:" + cell.nontextvalueformat; - } - if (cell.colspan) line += ":colspan:" + cell.colspan; - if (cell.rowspan) line += ":rowspan:" + cell.rowspan; - if (cell.cssc) line += ":cssc:" + cell.cssc; - if (cell.csss) line += ":csss:" + SocialCalc.encodeForSave(cell.csss); - if (cell.mod) line += ":mod:" + cell.mod; - if (cell.comment) - line += ":comment:" + SocialCalc.encodeForSave(cell.comment); - - return line; - }; - - // - // SocialCalc.CanonicalizeSheet(sheetobj, full) - // - // Goes through the sheet and fills in sheetobj.xlt with the following: - // - // .maxrow, .maxcol - lastrow and lastcol are as small as possible - // .newlayouts - new version of sheetobj.layouts without unused ones and all in ascending order - // .layoutsxlat - maps old layouts index to new one - // same ".new" and ".xlat" for fonts, colors, borderstyles, cell and value formats - // .namesorder - array with names sorted - // - // If full or SocialCalc.Constants.doCanonicalizeSheet are not true, then the values will leave things unchanged (to save time, etc.) - // - // sheetobj.xlt should be deleted when you are finished using it - // - - SocialCalc.CanonicalizeSheet = function (sheetobj, full) { - var l, coord, cr, cell, filled, an, a, newa, newxlat, used, ahash, i, v; - var maxrow = 0; - var maxcol = 0; - var alist = [ - "borderstyle", - "cellformat", - "color", - "font", - "layout", - "valueformat", - ]; - - var xlt = {}; - - xlt.namesorder = []; // always return a sorted list - for (a in sheetobj.names) { - xlt.namesorder.push(a); - } - xlt.namesorder.sort(); - - if (!SocialCalc.Constants.doCanonicalizeSheet || !full) { - // return make-no-changes values if not wanted - for (an = 0; an < alist.length; an++) { - a = alist[an]; - xlt["new" + a + "s"] = sheetobj[a + "s"]; - l = sheetobj[a + "s"].length; - newxlat = new Array(l); - newxlat[0] = ""; - for (i = 1; i < l; i++) { - newxlat[i] = i; - } - xlt[a + "sxlat"] = newxlat; - } - - xlt.maxrow = sheetobj.attribs.lastrow; - xlt.maxcol = sheetobj.attribs.lastcol; - - sheetobj.xlt = xlt; - - return; - } - - for (an = 0; an < alist.length; an++) { - a = alist[an]; - xlt[a + "sUsed"] = {}; - } - - var colorsUsed = xlt.colorsUsed; - var borderstylesUsed = xlt.borderstylesUsed; - var fontsUsed = xlt.fontsUsed; - var layoutsUsed = xlt.layoutsUsed; - var cellformatsUsed = xlt.cellformatsUsed; - var valueformatsUsed = xlt.valueformatsUsed; - - for (coord in sheetobj.cells) { - // check all cells to see which values are used - cr = SocialCalc.coordToCr(coord); - cell = sheetobj.cells[coord]; - filled = false; - - if (cell.valuetype && cell.valuetype != "b") filled = true; - - if (cell.color) { - colorsUsed[cell.color] = 1; - filled = true; - } - - if (cell.bgcolor) { - colorsUsed[cell.bgcolor] = 1; - filled = true; - } - - if (cell.bt) { - borderstylesUsed[cell.bt] = 1; - filled = true; - } - if (cell.br) { - borderstylesUsed[cell.br] = 1; - filled = true; - } - if (cell.bb) { - borderstylesUsed[cell.bb] = 1; - filled = true; - } - if (cell.bl) { - borderstylesUsed[cell.bl] = 1; - filled = true; - } - - if (cell.layout) { - layoutsUsed[cell.layout] = 1; - filled = true; - } - - if (cell.font) { - fontsUsed[cell.font] = 1; - filled = true; - } - - if (cell.cellformat) { - cellformatsUsed[cell.cellformat] = 1; - filled = true; - } - - if (cell.textvalueformat) { - valueformatsUsed[cell.textvalueformat] = 1; - filled = true; - } - - if (cell.nontextvalueformat) { - valueformatsUsed[cell.nontextvalueformat] = 1; - filled = true; - } - - if (filled) { - if (cr.row > maxrow) maxrow = cr.row; - if (cr.col > maxcol) maxcol = cr.col; - } - } - - for (i = 0; i < SocialCalc.sheetfieldsxlat.length; i++) { - // do sheet values, too - v = sheetobj.attribs[SocialCalc.sheetfieldsxlat[i]]; - if (v) { - xlt[SocialCalc.sheetfieldsxlatxlt[i] + "sUsed"][v] = 1; - } - } - - a = { height: 1, hide: 1 }; // look at explicit row settings - for (v in a) { - for (cr in sheetobj.rowattribs[v]) { - if (cr > maxrow) maxrow = cr; - } - } - a = { hide: 1, width: 1 }; // look at explicit col settings - for (v in a) { - for (coord in sheetobj.colattribs[v]) { - cr = SocialCalc.coordToCr(coord + "1"); - if (cr.col > maxcol) maxcol = cr.col; - } - } - - for (an = 0; an < alist.length; an++) { - // go through the attribs we want - a = alist[an]; - - newa = []; - used = xlt[a + "sUsed"]; - for (v in used) { - newa.push(sheetobj[a + "s"][v]); - } - newa.sort(); - newa.unshift(""); - - newxlat = [""]; - ahash = sheetobj[a + "hash"]; - - for (i = 1; i < newa.length; i++) { - newxlat[ahash[newa[i]]] = i; - } - - xlt[a + "sxlat"] = newxlat; - xlt["new" + a + "s"] = newa; - } - - xlt.maxrow = maxrow || 1; - xlt.maxcol = maxcol || 1; - - sheetobj.xlt = xlt; // leave for use by caller - }; - - // - // result = SocialCalc.EncodeCellAttributes(sheet, coord) - // - // Returns the cell's attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - - SocialCalc.EncodeCellAttributes = function (sheet, coord) { - var value, i, b, bb, parts; - var result = {}; - - var InitAttrib = function (name) { - result[name] = { def: true, val: "" }; - }; - - var InitAttribs = function (namelist) { - for (var i = 0; i < namelist.length; i++) { - InitAttrib(namelist[i]); - } - }; - - var SetAttrib = function (name, v) { - result[name].def = false; - result[name].val = v || ""; - }; - - var SetAttribStar = function (name, v) { - if (v == "*") return; - result[name].def = false; - result[name].val = v; - }; - - var cell = sheet.GetAssuredCell(coord); - - // cellformat: alignhoriz - - InitAttrib("alignhoriz"); - if (cell.cellformat) { - SetAttrib("alignhoriz", sheet.cellformats[cell.cellformat]); - } - - // layout: alignvert, padtop, padright, padbottom, padleft - - InitAttribs(["alignvert", "padtop", "padright", "padbottom", "padleft"]); - if (cell.layout) { - parts = sheet.layouts[cell.layout].match( - /^padding:\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+);vertical-align:\s*(\S+);/ - ); - SetAttribStar("padtop", parts[1]); - SetAttribStar("padright", parts[2]); - SetAttribStar("padbottom", parts[3]); - SetAttribStar("padleft", parts[4]); - SetAttribStar("alignvert", parts[5]); - } - - // font: fontfamily, fontlook, fontsize - - InitAttribs(["fontfamily", "fontlook", "fontsize"]); - if (cell.font) { - parts = sheet.fonts[cell.font].match(/^(\*|\S+? \S+?) (\S+?) (\S.*)$/); - SetAttribStar("fontfamily", parts[3]); - SetAttribStar("fontsize", parts[2]); - SetAttribStar("fontlook", parts[1]); - } - - // color: textcolor - - InitAttrib("textcolor"); - if (cell.color) { - SetAttrib("textcolor", sheet.colors[cell.color]); - } - - // bgcolor: bgcolor - - InitAttrib("bgcolor"); - if (cell.bgcolor) { - SetAttrib("bgcolor", sheet.colors[cell.bgcolor]); - } - - // formatting: numberformat, textformat - - InitAttribs(["numberformat", "textformat"]); - if (cell.nontextvalueformat) { - SetAttrib("numberformat", sheet.valueformats[cell.nontextvalueformat]); - } - if (cell.textvalueformat) { - SetAttrib("textformat", sheet.valueformats[cell.textvalueformat]); - } - - // merges: colspan, rowspan - - InitAttribs(["colspan", "rowspan"]); - SetAttrib("colspan", cell.colspan || 1); - SetAttrib("rowspan", cell.rowspan || 1); - - // borders: bXthickness, bXstyle, bXcolor for X = t, r, b, and l - - for (i = 0; i < 4; i++) { - b = "trbl".charAt(i); - bb = "b" + b; - InitAttrib(bb); - SetAttrib(bb, cell[bb] ? sheet.borderstyles[cell[bb]] : ""); - InitAttrib(bb + "thickness"); - InitAttrib(bb + "style"); - InitAttrib(bb + "color"); - if (cell[bb]) { - parts = sheet.borderstyles[cell[bb]].match(/(\S+)\s+(\S+)\s+(\S.+)/); - SetAttrib(bb + "thickness", parts[1]); - SetAttrib(bb + "style", parts[2]); - SetAttrib(bb + "color", parts[3]); - } - } - - // misc: cssc, csss, mod - - InitAttribs(["cssc", "csss", "mod"]); - SetAttrib("cssc", cell.cssc || ""); - SetAttrib("csss", cell.csss || ""); - SetAttrib("mod", cell.mod || "n"); - - return result; - }; - - // - // result = SocialCalc.EncodeSheetAttributes(sheet) - // - // Returns the sheet's attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - - SocialCalc.EncodeSheetAttributes = function (sheet) { - var value; - var attribs = sheet.attribs; - var result = {}; - - var InitAttrib = function (name) { - result[name] = { def: true, val: "" }; - }; - - var InitAttribs = function (namelist) { - for (var i = 0; i < namelist.length; i++) { - InitAttrib(namelist[i]); - } - }; - - var SetAttrib = function (name, v) { - result[name].def = false; - result[name].val = v || value; - }; - - var SetAttribStar = function (name, v) { - if (v == "*") return; - result[name].def = false; - result[name].val = v; - }; - - // sizes: colwidth, rowheight - - InitAttrib("colwidth"); - if (attribs.defaultcolwidth) { - SetAttrib("colwidth", attribs.defaultcolwidth); - } - - InitAttrib("rowheight"); - if (attribs.rowheight) { - SetAttrib("rowheight", attribs.defaultrowheight); - } - - // cellformat: textalignhoriz, numberalignhoriz - - InitAttrib("textalignhoriz"); - if (attribs.defaulttextformat) { - SetAttrib("textalignhoriz", sheet.cellformats[attribs.defaulttextformat]); - } - - InitAttrib("numberalignhoriz"); - if (attribs.defaultnontextformat) { - SetAttrib( - "numberalignhoriz", - sheet.cellformats[attribs.defaultnontextformat] - ); - } - - // layout: alignvert, padtop, padright, padbottom, padleft - - InitAttribs(["alignvert", "padtop", "padright", "padbottom", "padleft"]); - if (attribs.defaultlayout) { - parts = sheet.layouts[attribs.defaultlayout].match( - /^padding:\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+);vertical-align:\s*(\S+);/ - ); - SetAttribStar("padtop", parts[1]); - SetAttribStar("padright", parts[2]); - SetAttribStar("padbottom", parts[3]); - SetAttribStar("padleft", parts[4]); - SetAttribStar("alignvert", parts[5]); - } - - // font: fontfamily, fontlook, fontsize - - InitAttribs(["fontfamily", "fontlook", "fontsize"]); - if (attribs.defaultfont) { - parts = sheet.fonts[attribs.defaultfont].match( - /^(\*|\S+? \S+?) (\S+?) (\S.*)$/ - ); - SetAttribStar("fontfamily", parts[3]); - SetAttribStar("fontsize", parts[2]); - SetAttribStar("fontlook", parts[1]); - } - - // color: textcolor - - InitAttrib("textcolor"); - if (attribs.defaultcolor) { - SetAttrib("textcolor", sheet.colors[attribs.defaultcolor]); - } - - // bgcolor: bgcolor - - InitAttrib("bgcolor"); - if (attribs.defaultbgcolor) { - SetAttrib("bgcolor", sheet.colors[attribs.defaultbgcolor]); - } - - // formatting: numberformat, textformat - - InitAttribs(["numberformat", "textformat"]); - if (attribs.defaultnontextvalueformat) { - SetAttrib( - "numberformat", - sheet.valueformats[attribs.defaultnontextvalueformat] - ); - } - if (attribs.defaulttextvalueformat) { - SetAttrib( - "textformat", - sheet.valueformats[attribs.defaulttextvalueformat] - ); - } - - // recalc: recalc - - InitAttrib("recalc"); - if (attribs.recalc) { - SetAttrib("recalc", attribs.recalc); - } - - return result; - }; - - // - // cmdstr = SocialCalc.DecodeCellAttributes(sheet, coord, attribs, range) - // - // Takes cell attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - // and returns the sheet commands to make the actual attributes correspond. - // Returns a non-null string if any commands are to be executed, null otherwise. - // - // If range is provided, the commands are executed on the whole range. - // - - SocialCalc.DecodeCellAttributes = function (sheet, coord, newattribs, range) { - var value, b, bb; - - var cell = sheet.GetAssuredCell(coord); - - var changed = false; - - var CheckChanges = function (attribname, oldval, cmdname) { - var val; - if (newattribs[attribname]) { - if (newattribs[attribname].def) { - val = ""; - } else { - val = newattribs[attribname].val; - } - if (val != (oldval || "")) { - DoCmd(cmdname + " " + val); - } - } - }; - - var cmdstr = ""; - - var DoCmd = function (str) { - if (cmdstr) cmdstr += "\n"; - cmdstr += "set " + (range || coord) + " " + str; - changed = true; - }; - - // cellformat: alignhoriz - - CheckChanges( - "alignhoriz", - sheet.cellformats[cell.cellformat], - "cellformat" - ); - - // layout: alignvert, padtop, padright, padbottom, padleft - - if ( - !newattribs.alignvert.def || - !newattribs.padtop.def || - !newattribs.padright.def || - !newattribs.padbottom.def || - !newattribs.padleft.def - ) { - value = - "padding:" + - (newattribs.padtop.def ? "* " : newattribs.padtop.val + " ") + - (newattribs.padright.def ? "* " : newattribs.padright.val + " ") + - (newattribs.padbottom.def ? "* " : newattribs.padbottom.val + " ") + - (newattribs.padleft.def ? "*" : newattribs.padleft.val) + - ";vertical-align:" + - (newattribs.alignvert.def ? "*;" : newattribs.alignvert.val + ";"); - } else { - value = ""; - } - - if (value != (sheet.layouts[cell.layout] || "")) { - DoCmd("layout " + value); - } - - // font: fontfamily, fontlook, fontsize - - if ( - !newattribs.fontlook.def || - !newattribs.fontsize.def || - !newattribs.fontfamily.def - ) { - value = - (newattribs.fontlook.def ? "* " : newattribs.fontlook.val + " ") + - (newattribs.fontsize.def ? "* " : newattribs.fontsize.val + " ") + - (newattribs.fontfamily.def ? "*" : newattribs.fontfamily.val); - } else { - value = ""; - } - - if (value != (sheet.fonts[cell.font] || "")) { - DoCmd("font " + value); - } - - // color: textcolor - - CheckChanges("textcolor", sheet.colors[cell.color], "color"); - - // bgcolor: bgcolor - - CheckChanges("bgcolor", sheet.colors[cell.bgcolor], "bgcolor"); - - // formatting: numberformat, textformat - - CheckChanges( - "numberformat", - sheet.valueformats[cell.nontextvalueformat], - "nontextvalueformat" - ); - - CheckChanges( - "textformat", - sheet.valueformats[cell.textvalueformat], - "textvalueformat" - ); - - // merges: colspan, rowspan - NOT HANDLED: IGNORED! - - // borders: bX for X = t, r, b, and l; bXthickness, bXstyle, bXcolor ignored - - for (var i = 0; i < 4; i++) { - b = "trbl".charAt(i); - bb = "b" + b; - CheckChanges(bb, sheet.borderstyles[cell[bb]], bb); - } - - // misc: cssc, csss, mod - - CheckChanges("cssc", cell.cssc, "cssc"); - - CheckChanges("csss", cell.csss, "csss"); - - if (newattribs.mod) { - if (newattribs.mod.def) { - value = "n"; - } else { - value = newattribs.mod.val; - } - if (value != (cell.mod || "n")) { - if (value == "n") value = ""; // restrict to "y" and "" normally - DoCmd("mod " + value); - } - } - - // if any changes return command(s) - - if (changed) { - return cmdstr; - } else { - return null; - } - }; - - // - // changed = SocialCalc.DecodeSheetAttributes(sheet, newattribs) - // - // Takes sheet attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - // and returns the sheet commands to make the actual attributes correspond. - // Returns a non-null string if any commands were executed, null otherwise. - // - - SocialCalc.DecodeSheetAttributes = function (sheet, newattribs) { - var value; - var attribs = sheet.attribs; - var changed = false; - - var CheckChanges = function (attribname, oldval, cmdname) { - var val; - if (newattribs[attribname]) { - if (newattribs[attribname].def) { - val = ""; - } else { - val = newattribs[attribname].val; - } - if (val != (oldval || "")) { - DoCmd(cmdname + " " + val); - } - } - }; - - var cmdstr = ""; - - var DoCmd = function (str) { - if (cmdstr) cmdstr += "\n"; - cmdstr += "set sheet " + str; - changed = true; - }; - - // sizes: colwidth, rowheight - - CheckChanges("colwidth", attribs.defaultcolwidth, "defaultcolwidth"); - - CheckChanges("rowheight", attribs.defaultrowheight, "defaultrowheight"); - - // cellformat: textalignhoriz, numberalignhoriz - - CheckChanges( - "textalignhoriz", - sheet.cellformats[attribs.defaulttextformat], - "defaulttextformat" - ); - - CheckChanges( - "numberalignhoriz", - sheet.cellformats[attribs.defaultnontextformat], - "defaultnontextformat" - ); - - // layout: alignvert, padtop, padright, padbottom, padleft - - if ( - !newattribs.alignvert.def || - !newattribs.padtop.def || - !newattribs.padright.def || - !newattribs.padbottom.def || - !newattribs.padleft.def - ) { - value = - "padding:" + - (newattribs.padtop.def ? "* " : newattribs.padtop.val + " ") + - (newattribs.padright.def ? "* " : newattribs.padright.val + " ") + - (newattribs.padbottom.def ? "* " : newattribs.padbottom.val + " ") + - (newattribs.padleft.def ? "*" : newattribs.padleft.val) + - ";vertical-align:" + - (newattribs.alignvert.def ? "*;" : newattribs.alignvert.val + ";"); - } else { - value = ""; - } - - if (value != (sheet.layouts[attribs.defaultlayout] || "")) { - DoCmd("defaultlayout " + value); - } - - // font: fontfamily, fontlook, fontsize - - if ( - !newattribs.fontlook.def || - !newattribs.fontsize.def || - !newattribs.fontfamily.def - ) { - value = - (newattribs.fontlook.def ? "* " : newattribs.fontlook.val + " ") + - (newattribs.fontsize.def ? "* " : newattribs.fontsize.val + " ") + - (newattribs.fontfamily.def ? "*" : newattribs.fontfamily.val); - } else { - value = ""; - } - - if (value != (sheet.fonts[attribs.defaultfont] || "")) { - DoCmd("defaultfont " + value); - } - - // color: textcolor - - CheckChanges( - "textcolor", - sheet.colors[attribs.defaultcolor], - "defaultcolor" - ); - - // bgcolor: bgcolor - - CheckChanges( - "bgcolor", - sheet.colors[attribs.defaultbgcolor], - "defaultbgcolor" - ); - - // formatting: numberformat, textformat - - CheckChanges( - "numberformat", - sheet.valueformats[attribs.defaultnontextvalueformat], - "defaultnontextvalueformat" - ); - - CheckChanges( - "textformat", - sheet.valueformats[attribs.defaulttextvalueformat], - "defaulttextvalueformat" - ); - - // recalc: recalc - - CheckChanges("recalc", sheet.attribs.recalc, "recalc"); - - // if any changes return command(s) - - if (changed) { - return cmdstr; - } else { - return null; - } - }; - - // ************************************* - // - // Sheet command routines - // - // ************************************* - - // - // SocialCalc.SheetCommandInfo - object with information used during command execution - // - - SocialCalc.SheetCommandInfo = { - // only one of these - - sheetobj: null, // sheet being operated on - parseobj: null, // SocialCalc.Parse object with the command string, etc. - timerobj: null, // used for timeslicing - firsttimerdelay: 50, // wait before starting cmds (for Chrome - to give time to update) - timerdelay: 1, // wait between slices - maxtimeslice: 100, // do another slice after this many milliseconds - saveundo: false, // arg for ExecuteSheetCommand - - CmdExtensionCallbacks: {}, // for startcmdextension, in form: cmdname, {func:function(cmdname, data, sheet, SocialCalc.Parse object, saveundo), data:whatever} - cmdextensionbusy: "", // if length>0, command loop waits for SocialCalc.ResumeFromCmdExtension() - - // statuscallback: null, // called during execution - obsolete: use sheet obj's - // statuscallbackparams: null - }; - - // - // SocialCalc.ScheduleSheetCommands - // - // statuscallback is called at the beginning (cmdstart) and end (cmdend). - // - - SocialCalc.ScheduleSheetCommands = function ( - sheet, - cmdstr, - saveundo, - isRemote - ) { - if (SocialCalc.Callbacks.broadcast && !isRemote) { - if ( - cmdstr != "redisplay" && - cmdstr != "set sheet defaulttextvalueformat text-wiki" && - cmdstr != "recalc" - ) { - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "scmd", - id: sheet.sheetid, - cmdstr: cmdstr, - saveundo: saveundo, - }); - } - } - - var sci = SocialCalc.SheetCommandInfo; - - sci.sheetobj = sheet; - sci.parseobj = new SocialCalc.Parse(cmdstr); - sci.saveundo = saveundo; - - if (sci.sheetobj.statuscallback) { - // notify others if requested - sheet.statuscallback( - sci, - "cmdstart", - "", - sci.sheetobj.statuscallbackparams - ); - } - - if (sci.saveundo) { - sci.sheetobj.changes.PushChange(""); // add a step to undo stack - } - - sci.timerobj = window.setTimeout( - SocialCalc.SheetCommandsTimerRoutine, - sci.firsttimerdelay - ); - }; - - SocialCalc.SheetCommandsTimerRoutine = function () { - var errortext; - var sci = SocialCalc.SheetCommandInfo; - var starttime = new Date(); - - sci.timerobj = null; - - while (!sci.parseobj.EOF()) { - // go through all commands (separated by newlines) - - errortext = SocialCalc.ExecuteSheetCommand( - sci.sheetobj, - sci.parseobj, - sci.saveundo - ); - if (errortext) alert(errortext); - - sci.parseobj.NextLine(); - - if (sci.cmdextensionbusy.length > 0) { - // forced wait - if (sci.sheetobj.statuscallback) { - // notify others if requested - sci.sheetobj.statuscallback( - sci, - "cmdextension", - sci.cmdextensionbusy, - sci.sheetobj.statuscallbackparams - ); - } - return; - } - - if (new Date() - starttime >= sci.maxtimeslice) { - // if taking too long, give up CPU for a while - sci.timerobj = window.setTimeout( - SocialCalc.SheetCommandsTimerRoutine, - sci.timerdelay - ); - return; - } - } - - if (sci.sheetobj.statuscallback) { - // notify others if requested - sci.sheetobj.statuscallback( - sci, - "cmdend", - "", - sci.sheetobj.statuscallbackparams - ); - } - }; - - SocialCalc.ResumeFromCmdExtension = function () { - var sci = SocialCalc.SheetCommandInfo; - - sci.cmdextensionbusy = ""; - - SocialCalc.SheetCommandsTimerRoutine(); - }; - - // - // errortext = SocialCalc.ExecuteSheetCommand(sheet, cmd, saveundo) - // - // cmd is a SocialCalc.Parse object. - // - // Executes commands that modify the sheet data. - // Sets sheet "needsrecalc" as needed. - // Sets sheet "changedrendervalues" as needed. - // - // The cmd string may be multiple commands, separated by newlines. In that case - // only one "step" is put on the undo stack representing all the commands. - // Note that because of this, in "set A1 text ..." and "set A1 comment ..." text is - // treated as encoded (newline => \n, \ => \b, : => \c). - // - // The commands are in the forms: - // - // set sheet attributename value (plus lastcol and lastrow) - // set 22 attributename value - // set B attributename value - // set A1 attributename value1 value2... (see each attribute in code for details) - // set A1:B5 attributename value1 value2... - // erase/copy/cut/paste/fillright/filldown A1:B5 all/formulas/format - // loadclipboard save-encoded-clipboard-data - // clearclipboard - // merge C3:F3 - // unmerge C3 - // insertcol/insertrow C5 - // deletecol/deleterow C5:E7 - // movepaste/moveinsert A1:B5 A8 all/formulas/format (if insert, destination must be in same rows or columns or else paste done) - // sort cr1:cr2 col1 up/down col2 up/down col3 up/down - // name define NAME definition - // name desc NAME description - // name delete NAME - // recalc - // redisplay - // changedrendervalues - // startcmdextension extension rest-of-command - // - // If saveundo is true, then undo information is saved in sheet.changes. - // - - SocialCalc.ExecuteSheetCommand = function (sheet, cmd, saveundo) { - var cmdstr, - cmd1, - rest, - what, - attrib, - num, - pos, - pos2, - errortext, - undostart, - val; - var cr1, cr2, col, row, cr, cell, newcell; - var fillright, rowstart, colstart, crbase, rowoffset, coloffset, basecell; - var clipsheet, cliprange, numcols, numrows, attribtable; - var colend, - rowend, - newcolstart, - newrowstart, - newcolend, - newrowend, - rownext, - colnext, - colthis, - cellnext; - var lastrow, lastcol, rowbefore, colbefore, oldformula, oldcr; - var cols, dirs, lastsortcol, i, sortlist, sortcells, sortvalues, sorttypes; - var sortfunction, slen, valtype, originalrow, sortedcr; - var name, v1, v2; - var cmdextension; - - var attribs = sheet.attribs; - var changes = sheet.changes; - var cellProperties = SocialCalc.CellProperties; - var scc = SocialCalc.Constants; - - var ParseRange = function () { - var prange = SocialCalc.ParseRange(what); - cr1 = prange.cr1; - cr2 = prange.cr2; - if (cr2.col > attribs.lastcol) attribs.lastcol = cr2.col; - if (cr2.row > attribs.lastrow) attribs.lastrow = cr2.row; - }; - - errortext = ""; - - cmdstr = cmd.RestOfStringNoMove(); - if (saveundo) { - sheet.changes.AddDo(cmdstr); - } - - cmd1 = cmd.NextToken(); - - switch (cmd1) { - case "set": - what = cmd.NextToken(); - attrib = cmd.NextToken(); - rest = cmd.RestOfString(); - undostart = "set " + what + " " + attrib; - - if (what == "sheet") { - sheet.renderneeded = true; - switch (attrib) { - case "defaultcolwidth": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]); - attribs[attrib] = rest; - break; - case "defaultcolor": - case "defaultbgcolor": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("color", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("color", rest); - break; - case "defaultlayout": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("layout", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("layout", rest); - break; - case "defaultfont": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("font", attribs[attrib]) - ); - if (rest == "* * *") rest = ""; // all default - attribs[attrib] = sheet.GetStyleNum("font", rest); - break; - case "defaulttextformat": - case "defaultnontextformat": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("cellformat", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("cellformat", rest); - break; - case "defaulttextvalueformat": - case "defaultnontextvalueformat": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("valueformat", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("valueformat", rest); - for (cr in sheet.cells) { - // forget all cached display strings - delete sheet.cells[cr].displaystring; - } - break; - case "lastcol": - case "lastrow": - if (saveundo) changes.AddUndo(undostart, attribs[attrib] - 0); - num = rest - 0; - if (typeof num == "number") attribs[attrib] = num > 0 ? num : 1; - break; - case "recalc": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]); - if (rest == "off") { - attribs.recalc = rest; // manual recalc, not auto - } else { - // all values other than "off" mean "on" - delete attribs.recalc; - } - break; - default: - errortext = scc.s_escUnknownSheetCmd + cmdstr; - break; - } - } else if (/(^[A-Z])([A-Z])?(:[A-Z][A-Z]?){0,1}$/i.test(what)) { - // col attributes - sheet.renderneeded = true; - what = what.toUpperCase(); - pos = what.indexOf(":"); - if (pos >= 0) { - cr1 = SocialCalc.coordToCr(what.substring(0, pos) + "1"); - cr2 = SocialCalc.coordToCr(what.substring(pos + 1) + "1"); - } else { - cr1 = SocialCalc.coordToCr(what + "1"); - cr2 = cr1; - } - for (col = cr1.col; col <= cr2.col; col++) { - if (attrib == "width") { - cr = SocialCalc.rcColname(col); - if (saveundo) - changes.AddUndo( - "set " + cr + " width", - sheet.colattribs.width[cr] - ); - if (rest.length > 0) { - sheet.colattribs.width[cr] = rest; - } else { - delete sheet.colattribs.width[cr]; - } - } - } - } - - // !!!!! need row attribs !!!! - else if (/([a-z]){0,1}(\d+)/i.test(what)) { - // cell attributes - ParseRange(); - if ( - cr1.row != cr2.row || - cr1.col != cr2.col || - sheet.celldisplayneeded || - sheet.renderneeded - ) { - // not one cell - sheet.renderneeded = true; - sheet.celldisplayneeded = ""; - } else { - sheet.celldisplayneeded = SocialCalc.crToCoord(cr1.col, cr1.row); - } - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - if (attrib == "value") { - // set coord value type numeric-value - pos = rest.indexOf(" "); - cell.datavalue = rest.substring(pos + 1) - 0; - delete cell.errors; - cell.datatype = "v"; - cell.valuetype = rest.substring(0, pos); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "text") { - // set coord text type text-value - pos = rest.indexOf(" "); - cell.datavalue = SocialCalc.decodeFromSave( - rest.substring(pos + 1) - ); - delete cell.errors; - cell.datatype = "t"; - cell.valuetype = rest.substring(0, pos); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "formula") { - // set coord formula formula-body-less-initial-= - cell.datavalue = 0; // until recalc - delete cell.errors; - cell.datatype = "f"; - cell.valuetype = "e#N/A"; // until recalc - cell.formula = rest; - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "constant") { - // set coord constant type numeric-value source-text - pos = rest.indexOf(" "); - pos2 = rest.substring(pos + 1).indexOf(" "); - cell.datavalue = rest.substring(pos + 1, pos + 1 + pos2) - 0; - cell.valuetype = rest.substring(0, pos); - if (cell.valuetype.charAt(0) == "e") { - // error - cell.errors = cell.valuetype.substring(1); - } else { - delete cell.errors; - } - cell.datatype = "c"; - cell.formula = rest.substring(pos + pos2 + 2); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "empty") { - // erase value - cell.datavalue = ""; - delete cell.errors; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "all") { - // set coord all :this:val1:that:val2... - if (rest.length > 0) { - cell = new SocialCalc.Cell(cr); - sheet.CellFromStringParts(cell, rest.split(":"), 1); - sheet.cells[cr] = cell; - } else { - delete sheet.cells[cr]; - } - attribs.needsrecalc = "yes"; - } else if (/^b[trbl]$/.test(attrib)) { - // set coord bt 1px solid black - cell[attrib] = sheet.GetStyleNum("borderstyle", rest); - sheet.renderneeded = true; // affects more than just one cell - } else if (attrib == "color" || attrib == "bgcolor") { - cell[attrib] = sheet.GetStyleNum("color", rest); - } else if (attrib == "layout" || attrib == "cellformat") { - cell[attrib] = sheet.GetStyleNum(attrib, rest); - } else if (attrib == "font") { - // set coord font style weight size family - if (rest == "* * *") rest = ""; - cell[attrib] = sheet.GetStyleNum("font", rest); - } else if ( - attrib == "textvalueformat" || - attrib == "nontextvalueformat" - ) { - cell[attrib] = sheet.GetStyleNum("valueformat", rest); - delete cell.displaystring; - } else if (attrib == "cssc") { - rest = rest.replace(/[^a-zA-Z0-9\-]/g, ""); - cell.cssc = rest; - } else if (attrib == "csss") { - rest = rest.replace(/\n/g, ""); - cell.csss = rest; - } else if (attrib == "mod") { - rest = rest.replace(/[^yY]/g, "").toLowerCase(); - cell.mod = rest; - } else if (attrib == "comment") { - cell.comment = SocialCalc.decodeFromSave(rest); - } else { - errortext = scc.s_escUnknownSetCoordCmd + cmdstr; - } - } - } - } - break; - - case "merge": - sheet.renderneeded = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - cell = sheet.GetAssuredCell(cr1.coord); - if (saveundo) changes.AddUndo("unmerge " + cr1.coord); - - if (cr2.col > cr1.col) cell.colspan = cr2.col - cr1.col + 1; - else delete cell.colspan; - if (cr2.row > cr1.row) cell.rowspan = cr2.row - cr1.row + 1; - else delete cell.rowspan; - - sheet.changedrendervalues = true; - - break; - - case "unmerge": - sheet.renderneeded = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - cell = sheet.GetAssuredCell(cr1.coord); - if (saveundo) - changes.AddUndo( - "merge " + - cr1.coord + - ":" + - SocialCalc.crToCoord( - cr1.col + (cell.colspan || 1) - 1, - cr1.row + (cell.rowspan || 1) - 1 - ) - ); - - delete cell.colspan; - delete cell.rowspan; - - sheet.changedrendervalues = true; - - break; - - case "erase": - case "cut": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - if (cmd1 == "cut") { - // save copy of whole thing before erasing - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = SocialCalc.CreateSheetSave( - sheet, - what - ); - } - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - if (rest == "all") { - delete sheet.cells[cr]; - } else if (rest == "formulas") { - cell.datavalue = ""; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - delete cell.errors; - delete cell.displaystring; - delete cell.parseinfo; - if (cell.comment) { - // comments are considered content for erasing - delete cell.comment; - } - } else if (rest == "formats") { - newcell = new SocialCalc.Cell(cr); // create a new cell without attributes - newcell.datavalue = cell.datavalue; // copy existing values - newcell.datatype = cell.datatype; - newcell.formula = cell.formula; - newcell.valuetype = cell.valuetype; - if (cell.comment) { - newcell.comment = cell.comment; - } - sheet.cells[cr] = newcell; // replace - } - } - } - attribs.needsrecalc = "yes"; - break; - - case "fillright": - case "filldown": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - if (cmd1 == "fillright") { - fillright = true; - rowstart = cr1.row; - colstart = cr1.col + 1; - } else { - fillright = false; - rowstart = cr1.row + 1; - colstart = cr1.col; - } - for (row = rowstart; row <= cr2.row; row++) { - for (col = colstart; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - if (fillright) { - crbase = SocialCalc.crToCoord(cr1.col, row); - coloffset = col - colstart + 1; - rowoffset = 0; - } else { - crbase = SocialCalc.crToCoord(col, cr1.row); - coloffset = 0; - rowoffset = row - rowstart + 1; - } - basecell = sheet.GetAssuredCell(crbase); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - if (cell.datatype == "f") { - // offset relative coords, even in sheet references - cell.formula = SocialCalc.OffsetFormulaCoords( - basecell.formula, - coloffset, - rowoffset - ); - } else { - cell.formula = basecell.formula; - } - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - } - } - - attribs.needsrecalc = "yes"; - break; - - case "copy": - what = cmd.NextToken(); - rest = cmd.RestOfString(); - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = SocialCalc.CreateSheetSave( - sheet, - what - ); - break; - - case "loadclipboard": - rest = cmd.RestOfString(); - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = SocialCalc.decodeFromSave(rest); - break; - - case "clearclipboard": - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = ""; - break; - - case "paste": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - if (!SocialCalc.Clipboard.clipboard) { - break; - } - clipsheet = new SocialCalc.Sheet(); // load clipboard contents as another sheet - clipsheet.ParseSheetSave(SocialCalc.Clipboard.clipboard); - cliprange = SocialCalc.ParseRange(clipsheet.copiedfrom); - coloffset = cr1.col - cliprange.cr1.col; // get sizes, etc. - rowoffset = cr1.row - cliprange.cr1.row; - numcols = cliprange.cr2.col - cliprange.cr1.col + 1; - numrows = cliprange.cr2.row - cliprange.cr1.row + 1; - if (cr1.col + numcols - 1 > attribs.lastcol) - attribs.lastcol = cr1.col + numcols - 1; - if (cr1.row + numrows - 1 > attribs.lastrow) - attribs.lastrow = cr1.row + numrows - 1; - - for (row = cr1.row; row < cr1.row + numrows; row++) { - for (col = cr1.col; col < cr1.col + numcols; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - crbase = SocialCalc.crToCoord(col - coloffset, row - rowoffset); - basecell = clipsheet.GetAssuredCell(crbase); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - attribtable = SocialCalc.CellPropertiesTable[attrib]; - if (attribtable && basecell[attrib]) { - // table indexes to expand to strings since other sheet may have diff indexes - cell[attrib] = sheet.GetStyleNum( - attribtable, - clipsheet.GetStyleString(attribtable, basecell[attrib]) - ); - } else { - // these are not table indexes - cell[attrib] = basecell[attrib]; - } - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - if (cell.datatype == "f") { - // offset relative coords, even in sheet references - cell.formula = SocialCalc.OffsetFormulaCoords( - basecell.formula, - coloffset, - rowoffset - ); - } else { - cell.formula = basecell.formula; - } - delete cell.parseinfo; - cell.errors = basecell.errors; - if (basecell.comment) { - // comments are pasted as part of content, though not filled, etc. - cell.comment = basecell.comment; - } else if (cell.comment) { - delete cell.comment; - } - } - delete cell.displaystring; - } - } - - attribs.needsrecalc = "yes"; - break; - - case "sort": // sort cr1:cr2 col1 up/down col2 up/down col3 up/down - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - ParseRange(); - cols = []; // get columns and sort directions (or "") - dirs = []; - lastsortcol = 0; - for (i = 0; i <= 3; i++) { - cols[i] = cmd.NextToken(); - dirs[i] = cmd.NextToken(); - if (cols[i]) lastsortcol = i; - } - - sortcells = {}; // a copy of the data which will replace the original, but in the new order - sortlist = []; // an array of 0, 1, ..., nrows-1 needed for sorting - sortvalues = []; // values to be sorted corresponding to sortlist - sorttypes = []; // basic types of the values - - for (row = cr1.row; row <= cr2.row; row++) { - // fill in the sort info - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.cells[cr]; - if (cell) { - // only copy non-empty cells - sortcells[cr] = sheet.CellToString(cell); - if (saveundo) - changes.AddUndo("set " + cr + " all", sortcells[cr]); - } else { - if (saveundo) changes.AddUndo("set " + cr + " all"); - } - } - sortlist.push(sortlist.length); - sortvalues.push([]); - sorttypes.push([]); - slast = sorttypes.length - 1; - for (i = 0; i <= lastsortcol; i++) { - cr = cols[i] + row; // get cr on this row in sort col - cell = sheet.GetAssuredCell(cr); - val = cell.datavalue; - valtype = cell.valuetype.charAt(0) || "b"; - if (valtype == "t") val = val.toLowerCase(); - sortvalues[slast].push(val); - sorttypes[slast].push(valtype); - } - } - - sortfunction = function (a, b) { - // a comparison function that can handle all the type variations - var i, a1, b1, ta, cresult; - for (i = 0; i <= lastsortcol; i++) { - if (dirs[i] == "up") { - // handle sort direction - a1 = a; - b1 = b; - } else { - a1 = b; - b1 = a; - } - ta = sorttypes[a1][i]; - tb = sorttypes[b1][i]; - if (ta == "t") { - // numbers < text < errors, blank always last no matter what dir - if (tb == "t") { - a1 = sortvalues[a1][i]; - b1 = sortvalues[b1][i]; - cresult = a1 > b1 ? 1 : a1 < b1 ? -1 : 0; - } else if (tb == "n") { - cresult = 1; - } else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } else if (tb == "e") { - cresult = -1; - } - } else if (ta == "n") { - if (tb == "t") { - cresult = -1; - } else if (tb == "n") { - a1 = sortvalues[a1][i] - 0; // force to numeric, just in case - b1 = sortvalues[b1][i] - 0; - cresult = a1 > b1 ? 1 : a1 < b1 ? -1 : 0; - } else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } else if (tb == "e") { - cresult = -1; - } - } else if (ta == "e") { - if (tb == "e") { - a1 = sortvalues[a1][i]; - b1 = sortvalues[b1][i]; - cresult = a1 > b1 ? 1 : a1 < b1 ? -1 : 0; - } else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } else { - cresult = 1; - } - } else if (ta == "b") { - if (tb == "b") { - cresult = 0; - } else { - cresult = dirs[i] == "up" ? 1 : -1; - } - } - if (cresult) { - // return if tested not equal, otherwise do next column - return cresult; - } - } - cresult = a > b ? 1 : a < b ? -1 : 0; // equal - return position in original to maintain it - return cresult; - }; - - sortlist.sort(sortfunction); - - for (row = cr1.row; row <= cr2.row; row++) { - // copy original rows into sorted positions - originalrow = sortlist[row - cr1.row]; // relative position where it was in original - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - sortedcr = SocialCalc.crToCoord(col, originalrow + cr1.row); // original cell to be put in new place - if (sortcells[sortedcr]) { - cell = new SocialCalc.Cell(cr); - sheet.CellFromStringParts( - cell, - sortcells[sortedcr].split(":"), - 1 - ); - if (cell.datatype == "f") { - // offset coord refs, even to ***relative*** coords in other sheets - cell.formula = SocialCalc.OffsetFormulaCoords( - cell.formula, - 0, - row - cr1.row - originalrow - ); - } - sheet.cells[cr] = cell; - } else { - delete sheet.cells[cr]; - } - } - } - - attribs.needsrecalc = "yes"; - break; - - case "insertcol": - case "insertrow": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - - if (cmd1 == "insertcol") { - coloffset = 1; - colend = cr1.col; - rowoffset = 0; - rowend = 1; - newcolstart = cr1.col; - newcolend = cr1.col; - newrowstart = 1; - newrowend = attribs.lastrow; - if (saveundo) changes.AddUndo("deletecol " + cr1.coord); - } else { - coloffset = 0; - colend = 1; - rowoffset = 1; - rowend = cr1.row; - newcolstart = 1; - newcolend = attribs.lastcol; - newrowstart = cr1.row; - newrowend = cr1.row; - if (saveundo) changes.AddUndo("deleterow " + cr1.coord); - } - - for (row = attribs.lastrow; row >= rowend; row--) { - // copy the cells forward - for (col = attribs.lastcol; col >= colend; col--) { - crbase = SocialCalc.crToCoord(col, row); - cr = SocialCalc.crToCoord(col + coloffset, row + rowoffset); - if (!sheet.cells[crbase]) { - // copying empty cell - delete sheet.cells[cr]; // delete anything that may have been there - } else { - // overwrite existing cell with moved contents - sheet.cells[cr] = sheet.cells[crbase]; - } - } - } - - for (row = newrowstart; row <= newrowend; row++) { - // fill the "new" empty cells - for (col = newcolstart; col <= newcolend; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = new SocialCalc.Cell(cr); - sheet.cells[cr] = cell; - crbase = SocialCalc.crToCoord(col - coloffset, row - rowoffset); // copy attribs of the one before (0 gives you A or 1) - basecell = sheet.GetAssuredCell(crbase); - for (attrib in cellProperties) { - if (cellProperties[attrib] == 2) { - // copy only format attributes - cell[attrib] = basecell[attrib]; - } - } - } - } - - for (cr in sheet.cells) { - // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell && cell.datatype == "f") { - cell.formula = SocialCalc.AdjustFormulaCoords( - cell.formula, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - } - if (cell) { - delete cell.parseinfo; - } - } - - for (name in sheet.names) { - // update cell references to moved cells in names - if (sheet.names[name]) { - // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = - v2 + - SocialCalc.AdjustFormulaCoords( - v1, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - } - } - - for ( - row = attribs.lastrow; - row >= rowend && cmd1 == "insertrow"; - row-- - ) { - // copy the row attributes forward - rownext = row + rowoffset; - for (attrib in sheet.rowattribs) { - val = sheet.rowattribs[attrib][row]; - if (sheet.rowattribs[attrib][rownext] != val) { - // make assignment only if different - if (val) { - sheet.rowattribs[attrib][rownext] = val; - } else { - delete sheet.rowattribs[attrib][rownext]; - } - } - } - } - - for ( - col = attribs.lastcol; - col >= colend && cmd1 == "insertcol"; - col-- - ) { - // copy the column attributes forward - colthis = SocialCalc.rcColname(col); - colnext = SocialCalc.rcColname(col + coloffset); - for (attrib in sheet.colattribs) { - val = sheet.colattribs[attrib][colthis]; - if (sheet.colattribs[attrib][colnext] != val) { - // make assignment only if different - if (val) { - sheet.colattribs[attrib][colnext] = val; - } else { - delete sheet.colattribs[attrib][colnext]; - } - } - } - } - - attribs.lastcol += coloffset; - attribs.lastrow += rowoffset; - attribs.needsrecalc = "yes"; - break; - - case "deletecol": - case "deleterow": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - lastcol = attribs.lastcol; // save old values since ParseRange sets... - lastrow = attribs.lastrow; - ParseRange(); - - if (cmd1 == "deletecol") { - coloffset = cr1.col - cr2.col - 1; - rowoffset = 0; - colstart = cr2.col + 1; - rowstart = 1; - } else { - coloffset = 0; - rowoffset = cr1.row - cr2.row - 1; - colstart = 1; - rowstart = cr2.row + 1; - } - - for (row = rowstart; row <= lastrow - rowoffset; row++) { - // copy the cells backwards - extra so no dup of last set - for (col = colstart; col <= lastcol - coloffset; col++) { - cr = SocialCalc.crToCoord(col + coloffset, row + rowoffset); - if ( - saveundo && - (row < rowstart - rowoffset || col < colstart - coloffset) - ) { - // save cells that are overwritten as undo info - cell = sheet.cells[cr]; - if (!cell) { - // empty cell - changes.AddUndo("erase " + cr + " all"); - } else { - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - } - } - crbase = SocialCalc.crToCoord(col, row); - cell = sheet.cells[crbase]; - if (!cell) { - // copying empty cell - delete sheet.cells[cr]; // delete anything that may have been there - } else { - // overwrite existing cell with moved contents - sheet.cells[cr] = cell; - } - } - } - - //!!! multiple deletes isn't setting #REF!; need to fix up #REF!'s on undo but only those! - - for (cr in sheet.cells) { - // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell) { - if (cell.datatype == "f") { - oldformula = cell.formula; - cell.formula = SocialCalc.AdjustFormulaCoords( - oldformula, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - if (cell.formula != oldformula) { - delete cell.parseinfo; - if (saveundo && cell.formula.indexOf("#REF!") != -1) { - // save old version only if removed coord - oldcr = SocialCalc.coordToCr(cr); - changes.AddUndo( - "set " + - SocialCalc.rcColname(oldcr.col - coloffset) + - (oldcr.row - rowoffset) + - " formula " + - oldformula - ); - } - } - } else { - delete cell.parseinfo; - } - } - } - - for (name in sheet.names) { - // update cell references to moved cells in names - if (sheet.names[name]) { - // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = - v2 + - SocialCalc.AdjustFormulaCoords( - v1, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - } - } - - for ( - row = rowstart; - row <= lastrow - rowoffset && cmd1 == "deleterow"; - row++ - ) { - // copy the row attributes backwards - rowbefore = row + rowoffset; - for (attrib in sheet.rowattribs) { - val = sheet.rowattribs[attrib][row]; - if (sheet.rowattribs[attrib][rowbefore] != val) { - // make assignment only if different - if (saveundo) - changes.AddUndo( - "set " + rowbefore + " " + attrib, - sheet.rowattribs[attrib][rowbefore] - ); - if (val) { - sheet.rowattribs[attrib][rowbefore] = val; - } else { - delete sheet.rowattribs[attrib][rowbefore]; - } - } - } - } - - for ( - col = colstart; - col <= lastcol - coloffset && cmd1 == "deletecol"; - col++ - ) { - // copy the column attributes backwards - colthis = SocialCalc.rcColname(col); - colbefore = SocialCalc.rcColname(col + coloffset); - for (attrib in sheet.colattribs) { - val = sheet.colattribs[attrib][colthis]; - if (sheet.colattribs[attrib][colbefore] != val) { - // make assignment only if different - if (saveundo) - changes.AddUndo( - "set " + colbefore + " " + attrib, - sheet.colattribs[attrib][colbefore] - ); - if (val) { - sheet.colattribs[attrib][colbefore] = val; - } else { - delete sheet.colattribs[attrib][colbefore]; - } - } - } - } - - if (saveundo) { - if (cmd1 == "deletecol") { - for (col = cr1.col; col <= cr2.col; col++) { - changes.AddUndo("insertcol " + SocialCalc.rcColname(col)); - } - } else { - for (row = cr1.row; row <= cr2.row; row++) { - changes.AddUndo("insertrow " + row); - } - } - } - - if (cmd1 == "deletecol") { - if (cr1.col <= lastcol) { - // shrink sheet unless deleted phantom cols off the end - if (cr2.col <= lastcol) { - attribs.lastcol += coloffset; - } else { - attribs.lastcol = cr1.col - 1; - } - } - } else { - if (cr1.row <= lastrow) { - // shrink sheet unless deleted phantom rows off the end - if (cr2.row <= lastrow) { - attribs.lastrow += rowoffset; - } else { - attribs.lastrow = cr1.row - 1; - } - } - } - attribs.needsrecalc = "yes"; - break; - - case "movepaste": - case "moveinsert": - var movingcells, - dest, - destcr, - inserthoriz, - insertvert, - pushamount, - movedto; - - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - dest = cmd.NextToken(); - rest = cmd.RestOfString(); // rest is all/formulas/formats - if (rest == "") rest = "all"; - - ParseRange(); - - destcr = SocialCalc.coordToCr(dest); - - coloffset = destcr.col - cr1.col; - rowoffset = destcr.row - cr1.row; - numcols = cr2.col - cr1.col + 1; - numrows = cr2.row - cr1.row + 1; - - // get a copy of moving cells and erase from where they were - - movingcells = {}; - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - - if (!sheet.cells[cr]) { - // if had nothing - continue; // don't save anything - } - movingcells[cr] = new SocialCalc.Cell(cr); // create new cell to copy - - for (attrib in cellProperties) { - // go through each property - if (typeof cell[attrib] === undefined) { - // don't copy undefined things and no need to delete - continue; - } else { - movingcells[cr][attrib] = cell[attrib]; // copy for potential moving - } - if (rest == "all") { - delete cell[attrib]; - } - if (rest == "formulas") { - if ( - cellProperties[attrib] == 1 || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } - } - if (rest == "formats") { - if (cellProperties[attrib] == 2) { - delete cell[attrib]; - } - } - } - if (rest == "formulas") { - // leave pristene deleted cell - cell.datavalue = ""; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - } - if (rest == "all") { - // leave nothing for move all - delete sheet.cells[cr]; - } - } - } - - // if moveinsert, check destination OK, and calculate pushing parameters - - if (cmd1 == "moveinsert") { - inserthoriz = false; - insertvert = false; - if ( - rowoffset == 0 && - (destcr.col < cr1.col || destcr.col > cr2.col) - ) { - if (destcr.col < cr1.col) { - // moving left - pushamount = cr1.col - destcr.col; - inserthoriz = -1; - } else { - destcr.col -= 1; - coloffset = destcr.col - cr2.col; - pushamount = destcr.col - cr2.col; - inserthoriz = 1; - } - } else if ( - coloffset == 0 && - (destcr.row < cr1.row || destcr.row > cr2.row) - ) { - if (destcr.row < cr1.row) { - // moving up - pushamount = cr1.row - destcr.row; - insertvert = -1; - } else { - destcr.row -= 1; - rowoffset = destcr.row - cr2.row; - pushamount = destcr.row - cr2.row; - insertvert = 1; - } - } else { - cmd1 = "movepaste"; // not allowed right now - ignore - } - } - - // push any cells that need pushing - - movedto = {}; // remember what was moved where - - if (insertvert) { - for (row = 0; row < pushamount; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - if (insertvert < 0) { - crbase = SocialCalc.crToCoord( - col, - destcr.row + pushamount - row - 1 - ); // from cell - cr = SocialCalc.crToCoord(col, cr2.row - row); // to cell - } else { - crbase = SocialCalc.crToCoord( - col, - destcr.row - pushamount + row + 1 - ); // from cell - cr = SocialCalc.crToCoord(col, cr1.row + row); // to cell - } - - basecell = sheet.GetAssuredCell(crbase); - if (saveundo) - changes.AddUndo( - "set " + crbase + " all", - sheet.CellToString(basecell) - ); - - cell = sheet.GetAssuredCell(cr); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - - movedto[crbase] = cr; // old crbase is now at cr - } - } - } - if (inserthoriz) { - for (col = 0; col < pushamount; col++) { - for (row = cr1.row; row <= cr2.row; row++) { - if (inserthoriz < 0) { - crbase = SocialCalc.crToCoord( - destcr.col + pushamount - col - 1, - row - ); - cr = SocialCalc.crToCoord(cr2.col - col, row); - } else { - crbase = SocialCalc.crToCoord( - destcr.col - pushamount + col + 1, - row - ); - cr = SocialCalc.crToCoord(cr1.col + col, row); - } - - basecell = sheet.GetAssuredCell(crbase); - if (saveundo) - changes.AddUndo( - "set " + crbase + " all", - sheet.CellToString(basecell) - ); - - cell = sheet.GetAssuredCell(cr); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - - movedto[crbase] = cr; // old crbase is now at cr - } - } - } - - // paste moved cells into new place - - if (destcr.col + numcols - 1 > attribs.lastcol) - attribs.lastcol = destcr.col + numcols - 1; - if (destcr.row + numrows - 1 > attribs.lastrow) - attribs.lastrow = destcr.row + numrows - 1; - - for (row = cr1.row; row < cr1.row + numrows; row++) { - for (col = cr1.col; col < cr1.col + numcols; col++) { - cr = SocialCalc.crToCoord(col + coloffset, row + rowoffset); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - - crbase = SocialCalc.crToCoord(col, row); // get old cell to move - - movedto[crbase] = cr; // old crbase (moved cell) will now be at cr (destination) - - if (rest == "all" && !movingcells[crbase]) { - // moving an empty cell - delete sheet.cells[cr]; // make the cell empty - continue; - } - - basecell = movingcells[crbase]; - if (!basecell) basecell = sheet.GetAssuredCell(crbase); - - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - if (basecell.comment) { - // comments are pasted as part of content, though not filled, etc. - cell.comment = basecell.comment; - } else if (cell.comment) { - delete cell.comment; - } - } - delete cell.displaystring; - } - } - - // do fixups - - for (cr in sheet.cells) { - // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell) { - if (cell.datatype == "f") { - oldformula = cell.formula; - cell.formula = SocialCalc.ReplaceFormulaCoords( - oldformula, - movedto - ); - if (cell.formula != oldformula) { - delete cell.parseinfo; - if (saveundo && !movedto[cr]) { - // moved cells are already saved for undo - changes.AddUndo("set " + cr + " formula " + oldformula); - } - } - } else { - delete cell.parseinfo; - } - } - } - - for (name in sheet.names) { - // update cell references to moved cells in names - if (sheet.names[name]) { - // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - oldformula = v1; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = - v2 + SocialCalc.ReplaceFormulaCoords(v1, movedto); - if (saveundo && sheet.names[name].definition != oldformula) { - // save changes - changes.AddUndo("name define " + name + " " + oldformula); - } - } - } - - attribs.needsrecalc = "yes"; - break; - - case "name": - what = cmd.NextToken(); - name = cmd.NextToken(); - rest = cmd.RestOfString(); - - name = name.toUpperCase().replace(/[^A-Z0-9_\.]/g, ""); - if (name == "") break; // must have something - - if (what == "define") { - if (rest == "") break; // must have something - if (sheet.names[name]) { - // already exists - if (saveundo) - changes.AddUndo( - "name define " + name + " " + sheet.names[name].definition - ); - sheet.names[name].definition = rest; - } else { - // new - if (saveundo) changes.AddUndo("name delete " + name); - sheet.names[name] = { definition: rest, desc: "" }; - } - } else if (what == "desc") { - if (sheet.names[name]) { - // must already exist - if (saveundo) - changes.AddUndo( - "name desc " + name + " " + sheet.names[name].desc - ); - sheet.names[name].desc = rest; - } - } else if (what == "delete") { - if (saveundo) { - if (sheet.names[name].desc) - changes.AddUndo( - "name desc " + name + " " + sheet.names[name].desc - ); - changes.AddUndo( - "name define " + name + " " + sheet.names[name].definition - ); - } - delete sheet.names[name]; - } - attribs.needsrecalc = "yes"; - - break; - - case "recalc": - attribs.needsrecalc = "yes"; // request recalc - sheet.recalconce = true; // even if turned off - break; - - case "redisplay": - sheet.renderneeded = true; - break; - - case "changedrendervalues": // needed for undo sometimes - sheet.changedrendervalues = true; - break; - - case "startcmdextension": // startcmdextension extension rest-of-command - name = cmd.NextToken(); - cmdextension = SocialCalc.SheetCommandInfo.CmdExtensionCallbacks[name]; - if (cmdextension) { - cmdextension.func(name, cmdextension.data, sheet, cmd, saveundo); - } - break; - - default: - errortext = scc.s_escUnknownCmd + cmdstr; - break; - } - - /* For Debugging: -var ustack=""; -for (var i=0;i= 0; i--) { - // do them backwards - if (cmdstr) cmdstr += "\n"; // concatenate with separate lines - cmdstr += tos.undo[i]; - } - sheet.changes.Undo(); - sheet.ScheduleSheetCommands(cmdstr, false); // do undo operations - }; - - SocialCalc.SheetRedo = function (sheet) { - var tos, i; - var didredo = sheet.changes.Redo(); - if (!didredo) { - sheet.ScheduleSheetCommands("", false); // schedule doing nothing - return; - } - tos = sheet.changes.TOS(); - var cmdstr = ""; - - for (i = 0; tos && i < tos.command.length; i++) { - if (cmdstr) cmdstr += "\n"; // concatenate with separate lines - cmdstr += tos.command[i]; - } - sheet.ScheduleSheetCommands(cmdstr, false); // do undo operations - }; - - SocialCalc.CreateAuditString = function (sheet) { - var i, j; - var result = ""; - var stack = sheet.changes.stack; - var tos = sheet.changes.tos; - for (i = 0; i <= tos; i++) { - for (j = 0; j < stack[i].command.length; j++) { - result += stack[i].command[j] + "\n"; - } - } - - return result; - }; - - SocialCalc.GetStyleNum = function (sheet, atype, style) { - var num; - - if (style.length == 0) return 0; // null means use zero, which means default or global default - - num = sheet[atype + "hash"][style]; - if (!num) { - if (sheet[atype + "s"].length < 1) sheet[atype + "s"].push(""); - num = sheet[atype + "s"].push(style) - 1; - sheet[atype + "hash"][style] = num; - sheet.changedrendervalues = true; - } - return num; - }; - - SocialCalc.GetStyleString = function (sheet, atype, num) { - if (!num) return null; // zero, null, and undefined return null - - return sheet[atype + "s"][num]; - }; - - // - // updatedformula = SocialCalc.OffsetFormulaCoords(formula, coloffset, rowoffset) - // - // Change relative cell references by offsets (even those to other worksheets so fill, paste, sort work as expected). - // If not what you want, use absolute references. - // - - SocialCalc.OffsetFormulaCoords = function (formula, coloffset, rowoffset) { - var parseinfo, ttext, ttype, i, cr, newcr; - var updatedformula = ""; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = scf.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - if (ttype == token_coord) { - newcr = ""; - cr = SocialCalc.coordToCr(ttext); - if (ttext.charAt(0) != "$") { - // add col offset unless absolute column - cr.col += coloffset; - } else { - newcr += "$"; - } - newcr += SocialCalc.rcColname(cr.col); - if (ttext.indexOf("$", 1) == -1) { - // add row offset unless absolute row - cr.row += rowoffset; - } else { - newcr += "$"; - } - newcr += cr.row; - if (cr.row < 1 || cr.col < 1) { - newcr = "#REF!"; - } - updatedformula += newcr; - } else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { - // quotes to double - updatedformula += '"' + ttext.replace(/"/, '""') + '"'; - } else updatedformula += '"' + ttext + '"'; - } else if (ttype == token_op) { - updatedformula += tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } else { - // leave everything else alone - updatedformula += ttext; - } - } - - return updatedformula; - }; - - // - // updatedformula = SocialCalc.AdjustFormulaCoords(formula, col, coloffset, row, rowoffset) - // - // Change all cell references to cells starting with col/row by offsets - // - - SocialCalc.AdjustFormulaCoords = function ( - formula, - col, - coloffset, - row, - rowoffset - ) { - var ttype, ttext, i, newcr; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - if (ttype == token_op) { - // references with sheet specifier are not offset - if (ttext == "!") { - sheetref = true; // found a sheet reference - } else if (ttext != ":") { - // for everything but a range, reset - sheetref = false; - } - ttext = tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } - if (ttype == token_coord) { - cr = SocialCalc.coordToCr(ttext); - if ( - (coloffset < 0 && cr.col >= col && cr.col < col - coloffset) || - (rowoffset < 0 && cr.row >= row && cr.row < row - rowoffset) - ) { - // refs to deleted cells become invalid - if (!sheetref) { - cr.col = 0; - cr.row = 0; - } - } - if (!sheetref) { - if (cr.col >= col) { - cr.col += coloffset; - } - if (cr.row >= row) { - cr.row += rowoffset; - } - } - if (ttext.charAt(0) == "$") { - newcr = "$" + SocialCalc.rcColname(cr.col); - } else { - newcr = SocialCalc.rcColname(cr.col); - } - if (ttext.indexOf("$", 1) != -1) { - newcr += "$" + cr.row; - } else { - newcr += cr.row; - } - if (cr.row < 1 || cr.col < 1) { - newcr = "#REF!"; - } - ttext = newcr; - } else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { - // quotes to double - ttext = '"' + ttext.replace(/"/, '""') + '"'; - } else ttext = '"' + ttext + '"'; - } - updatedformula += ttext; - } - - return updatedformula; - }; - - // - // updatedformula = SocialCalc.ReplaceFormulaCoords(formula, movedto) - // - // Change all cell references to cells that are keys in moveto to be to moveto[coord]. - // Don't change references to other sheets. - // Handle range extents specially. - // - - SocialCalc.ReplaceFormulaCoords = function (formula, movedto) { - var ttype, ttext, i, newcr, coord; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - if (ttype == token_op) { - // references with sheet specifier are not change - if (ttext == "!") { - sheetref = true; // found a sheet reference - } else if (ttext != ":") { - // for everything but a range, reset - sheetref = false; - } - - //!!!! HANDLE RANGE EXTENT MOVES - - ttext = tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } - if (ttype == token_coord) { - cr = SocialCalc.coordToCr(ttext); // get parts - coord = SocialCalc.crToCoord(cr.col, cr.row); // get "clean" reference - if (movedto[coord] && !sheetref) { - // this is a reference to a moved cell - cr = SocialCalc.coordToCr(movedto[coord]); // get new row and col - if (ttext.charAt(0) == "$") { - // copy absolute ref marks if present - newcr = "$" + SocialCalc.rcColname(cr.col); - } else { - newcr = SocialCalc.rcColname(cr.col); - } - if (ttext.indexOf("$", 1) != -1) { - newcr += "$" + cr.row; - } else { - newcr += cr.row; - } - ttext = newcr; - } - } else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { - // quotes to double - ttext = '"' + ttext.replace(/"/, '""') + '"'; - } else ttext = '"' + ttext + '"'; - } - updatedformula += ttext; - } - - return updatedformula; - }; - - // ************************ - // - // Recalc Loop Code - // - // ************************ - - // - // How recalc works: - // - // !!!!!!!!!!!!!! - // - - // SocialCalc.RecalcInfo - object with global recalc info - - SocialCalc.RecalcInfo = { - sheet: null, // which sheet is being recalced - - currentState: 0, // current state - state: { start_calc: 1, order: 2, calc: 3, start_wait: 4, done_wait: 5 }, // allowed state values - - recalctimer: null, // value to cancel timer - maxtimeslice: 100, // maximum milliseconds per slice of recalc time before a wait - timeslicedelay: 1, // milliseconds to wait between recalc time slices - starttime: 0, // when recalc started - - // LoadSheet: a function that returns true if started a load or false if not. - // - - LoadSheet: function (sheetname) { - return false; - }, // default returns not found - }; - - // SocialCalc.RecalcData - object with recalc info while determining recalc order and afterward - - SocialCalc.RecalcData = function () { - // initialize a RecalcData object - - this.inrecalc = true; // if true, doing a recalc - this.celllist = []; // list with all potential cells to calculate - this.celllistitem = 0; // cell to check next when ordering - this.calclist = null; // object which is the chained list of cells to calculate - // each in the form of "coord: nextcoord" - // e.g., if B8 is calculated right after A8, then calclist.A8=="B8" - // if null, need to create the list - this.calclistlength = 0; // number of items in calclist - - this.firstcalc = null; // start of the calc list - a string or null - this.lastcalc = null; // last one on chain (used to add more to the end) - - this.nextcalc = null; // used to keep track during background recalc to make it restartable - this.count = 0; // number calculated - - // checkinfo is used when determining calc order: - - this.checkinfo = {}; // attributes are coords; if no attrib for a coord, it wasn't checked or doesn't need it - // values are RecalcCheckInfo objects while checking or TRUE when complete - }; - - // SocialCalc.RecalcCheckInfo - object that stores checking info while determining recalc order - - SocialCalc.RecalcCheckInfo = function () { - // initialize a RecalcCheckInfo object - - this.oldcoord = null; // chain back up of cells referring to cells - this.parsepos = 0; // which token we are up to - - // range info - - this.inrange = false; // if true, in the process of checking a range of coords - this.inrangestart = false; // if true, have not yet filled in range loop values - this.cr1 = null; // range first coord as a cr object - this.cr2 = null; // range second coord as a cr object - this.c1 = null; // range extents - this.c2 = null; - this.r1 = null; - this.r2 = null; - this.c = null; // looping values - this.r = null; - }; - - // Recalc the entire sheet - - SocialCalc.RecalcSheet = function (sheet) { - var coord, err, recalcdata; - var scri = SocialCalc.RecalcInfo; - - delete sheet.attribs.circularreferencecell; // reset recalc-wide things - SocialCalc.Formula.FreshnessInfoReset(); - - SocialCalc.RecalcClearTimeout(); - - scri.sheet = sheet; // set values needed by background recalc - scri.currentState = scri.state.start_calc; - - scri.starttime = new Date(); - - if (sheet.statuscallback) { - sheet.statuscallback(scri, "calcstart", null, sheet.statuscallbackparams); - } - - SocialCalc.RecalcSetTimeout(); - }; - - // - // SocialCalc.RecalcSetTimeout - set a timer for next recalc step - // - - SocialCalc.RecalcSetTimeout = function () { - var scri = SocialCalc.RecalcInfo; - - scri.recalctimer = window.setTimeout( - SocialCalc.RecalcTimerRoutine, - scri.timeslicedelay - ); - }; - - // - // SocialCalc.RecalcClearTimeout - cancel any timeouts - // - - SocialCalc.RecalcClearTimeout = function () { - var scri = SocialCalc.RecalcInfo; - - if (scri.recalctimer) { - window.clearTimeout(scri.recalctimer); - scri.recalctimer = null; - } - }; - - // - // SocialCalc.RecalcLoadedSheet(sheetname, str, recalcneeded) - // - // Called when a sheet finishes loading with name, string, and t/f whether it should be recalced. - // If loaded sheet has sheet.attribs.recalc=="off", then no recalc done. - // If sheetname is null, then the sheetname waiting for will be used. - // - - SocialCalc.RecalcLoadedSheet = function (sheetname, str, recalcneeded) { - var sheet; - var scri = SocialCalc.RecalcInfo; - var scf = SocialCalc.Formula; - - sheet = SocialCalc.Formula.AddSheetToCache( - sheetname || scf.SheetCache.waitingForLoading, - str - ); - - if (recalcneeded && sheet && sheet.attribs.recalc != "off") { - // if recalcneeded, and not manual sheet, chain in this new sheet to recalc loop - sheet.previousrecalcsheet = scri.sheet; - scri.sheet = sheet; - scri.currentState = scri.state.start_calc; - } - scf.SheetCache.waitingForLoading = null; - - SocialCalc.RecalcSetTimeout(); - }; - - // - // SocialCalc.RecalcTimerRoutine - handles the actual order determination and cell-by-cell recalculation in the background - // - - SocialCalc.RecalcTimerRoutine = function () { - var eresult, cell, coord, err, status; - var starttime = new Date(); - var count = 0; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var scri = SocialCalc.RecalcInfo; - var sheet = scri.sheet; - if (!sheet) { - return; - } - var recalcdata = sheet.recalcdata; - - var do_statuscallback = function (status, arg) { - // routine to do callback if required - if (sheet.statuscallback) { - sheet.statuscallback( - recalcdata, - status, - arg, - sheet.statuscallbackparams - ); - } - }; - - SocialCalc.RecalcClearTimeout(); - - if (scri.currentState == scri.state.start_calc) { - recalcdata = new SocialCalc.RecalcData(); - sheet.recalcdata = recalcdata; - - for (coord in sheet.cells) { - // get list of cells to check for order - if (!coord) continue; - recalcdata.celllist.push(coord); - } - - recalcdata.calclist = {}; // start with empty list - scri.currentState = scri.state.order; // drop through to determining recalc order - } - - if (scri.currentState == scri.state.order) { - while (recalcdata.celllistitem < recalcdata.celllist.length) { - // check all the cells to see if they should be on the list - coord = recalcdata.celllist[recalcdata.celllistitem++]; - err = SocialCalc.RecalcCheckCell(sheet, coord); - if (new Date() - starttime >= scri.maxtimeslice) { - // if taking too long, give up CPU for a while - do_statuscallback("calcorder", { - coord: coord, - total: recalcdata.celllist.length, - count: recalcdata.celllistitem, - }); - SocialCalc.RecalcSetTimeout(); - return; - } - } - - do_statuscallback("calccheckdone", recalcdata.calclistlength); - - recalcdata.nextcalc = recalcdata.firstcalc; // start at the beginning of the recalc chain - scri.currentState = scri.state.calc; // loop through cells on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - if (scri.currentState == scri.state.start_wait) { - // starting to wait for something - scri.currentState = scri.state.done_wait; // finished on next timer call - if (scri.LoadSheet) { - status = scri.LoadSheet(scf.SheetCache.waitingForLoading); - if (status) { - // started a load operation - return; - } - } - SocialCalc.RecalcLoadedSheet(null, "", false); - return; - } - - if (scri.currentState == scri.state.done_wait) { - scri.currentState = scri.state.calc; // loop through cells on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - // otherwise should be scri.state.calc - - if (scri.currentState != scri.state.calc) { - alert( - "Recalc state error: " + - scri.currentState + - ". Error in SocialCalc code." - ); - } - - coord = sheet.recalcdata.nextcalc; - while (coord) { - cell = sheet.cells[coord]; - eresult = scf.evaluate_parsed_formula(cell.parseinfo, sheet, false); - if (scf.SheetCache.waitingForLoading) { - // wait until restarted - recalcdata.nextcalc = coord; // start with this cell again - recalcdata.count += count; - do_statuscallback("calcloading", { - sheetname: scf.SheetCache.waitingForLoading, - }); - scri.currentState = scri.state.start_wait; // start load on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - if (scf.RemoteFunctionInfo.waitingForServer) { - // wait until restarted - recalcdata.nextcalc = coord; // start with this cell again - recalcdata.count += count; - do_statuscallback("calcserverfunc", { - funcname: scf.RemoteFunctionInfo.waitingForServer, - coord: coord, - total: recalcdata.calclistlength, - count: recalcdata.count, - }); - scri.currentState = scri.state.done_wait; // start load on next timer call - return; // return and wait for next recalc timer event - } - - if (cell.datavalue != eresult.value || cell.valuetype != eresult.type) { - // only update if changed from last time - cell.datavalue = eresult.value; - cell.valuetype = eresult.type; - delete cell.displaystring; - sheet.recalcchangedavalue = true; // remember something changed in case other code wants to know - } - if (eresult.error) { - cell.errors = eresult.error; - } - count++; - coord = sheet.recalcdata.calclist[coord]; - - if (new Date() - starttime >= scri.maxtimeslice) { - // if taking too long, give up CPU for a while - recalcdata.nextcalc = coord; // start with next cell on chain - recalcdata.count += count; - do_statuscallback("calcstep", { - coord: coord, - total: recalcdata.calclistlength, - count: recalcdata.count, - }); - SocialCalc.RecalcSetTimeout(); - return; - } - } - - recalcdata.inrecalc = false; - - delete sheet.recalcdata; // save memory and clear out for name lookup formula evaluation - - delete sheet.attribs.needsrecalc; // remember recalc done - - scri.sheet = sheet.previousrecalcsheet || null; // chain back if doing recalc of loaded sheets - if (scri.sheet) { - scri.currentState = scri.state.calc; // start where we left off - SocialCalc.RecalcSetTimeout(); - return; - } - - scf.FreshnessInfo.recalc_completed = true; // say freshness info is complete - - do_statuscallback("calcfinished", new Date() - scri.starttime); - }; - - // - // circref = SocialCalc.RecalcCheckCell(sheet, coord) - // - // Checks cell to put on calclist, looking at parsed tokens. - // Also checks cells this cell is dependent upon - // if it contains a formula with cell references. - // If circular reference, returns non-null. - // - - SocialCalc.RecalcCheckCell = function (sheet, startcoord) { - var parseinfo, - ttext, - ttype, - i, - rangecoord, - circref, - value, - pos, - pos2, - cell, - coordvals; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_name = tokentype.name; - var token_coord = tokentype.coord; - - var recalcdata = sheet.recalcdata; - var checkinfo = recalcdata.checkinfo; - - var sheetref = false; // if true, a sheet reference is in effect, so don't check that - var oldcoord = null; // coord of formula that referred to this one when checking down the tree - var coord = startcoord; // the coord of the cell we are checking - - // Start with requested cell, and then continue down or up the dependency tree - // oldcoord (and checkinfo[coord].oldcoord) maintains the reference stack during the tree walk - // checkinfo[coord] maintains the stack of checking looping values, e.g., token number being checked - - mainloop: while (coord) { - cell = sheet.cells[coord]; - coordvals = checkinfo[coord]; - - if ( - !cell || - cell.datatype != "f" || // Don't calculate if not a formula - (coordvals && typeof coordvals != "object") - ) { - // Don't calc if already calculated - coord = oldcoord; // go back up dependency tree to coord that referred to us - if (checkinfo[coord]) oldcoord = checkinfo[coord].oldcoord; - continue; - } - - if (!coordvals) { - // do we have checking information about this cell? - coordvals = new SocialCalc.RecalcCheckInfo(); // no - make a place to hold it - checkinfo[coord] = coordvals; - } - - if (cell.errors) { - // delete errors from previous recalcs - delete cell.errors; - } - - if (!cell.parseinfo) { - // cache parsed formula - cell.parseinfo = scf.ParseFormulaIntoTokens(cell.formula); - } - parseinfo = cell.parseinfo; - - for (i = coordvals.parsepos; i < parseinfo.length; i++) { - // go through each token in formula - - if (coordvals.inrange) { - // processing a range of coords - if (coordvals.inrangestart) { - // first time - fill in other values - if (coordvals.cr1.col > coordvals.cr2.col) { - coordvals.c1 = coordvals.cr2.col; - coordvals.c2 = coordvals.cr1.col; - } else { - coordvals.c1 = coordvals.cr1.col; - coordvals.c2 = coordvals.cr2.col; - } - coordvals.c = coordvals.c1 - 1; // start one before - - if (coordvals.cr1.row > coordvals.cr2.row) { - coordvals.r1 = coordvals.cr2.row; - coordvals.r2 = coordvals.cr1.row; - } else { - coordvals.r1 = coordvals.cr1.row; - coordvals.r2 = coordvals.cr2.row; - } - coordvals.r = coordvals.r1; // start on this row - coordvals.inrangestart = false; - } else { - // not first time - } - coordvals.c += 1; // increment column - if (coordvals.c > coordvals.c2) { - // finished the columns of this row - coordvals.r += 1; // increment row - if (coordvals.r > coordvals.r2) { - // finished checking the entire range - coordvals.inrange = false; - continue; - } - coordvals.c = coordvals.c1; // start at the beginning of next row - } - rangecoord = SocialCalc.crToCoord(coordvals.c, coordvals.r); - - // now check that one - - coordvals.parsepos = i; // remember our position - coordvals.oldcoord = oldcoord; // remember back up chain - oldcoord = coord; // come back to us - coord = rangecoord; - if (checkinfo[coord] && typeof checkinfo[coord] == "object") { - // Circular reference - cell.errors = SocialCalc.Constants.s_caccCircRef + startcoord; // set on original cell making the ref - checkinfo[startcoord] = true; // this one should be calculated once at this point - if (!recalcdata.firstcalc) { - recalcdata.firstcalc = startcoord; - } else { - recalcdata.calclist[recalcdata.lastcalc] = startcoord; - } - recalcdata.lastcalc = startcoord; - recalcdata.calclistlength++; // count number on list - sheet.attribs.circularreferencecell = coord + "|" + oldcoord; // remember at least one circ ref - return cell.errors; - } - continue mainloop; - } - - ttype = parseinfo[i].type; // get token details - ttext = parseinfo[i].text; - if (ttype == token_op) { - // references with sheet specifier are not checked - if (ttext == "!") { - sheetref = true; // found a sheet reference - } else if (ttext != ":") { - // for everything but a range, reset - sheetref = false; - } - } - - if (ttype == token_name) { - // look for named range - value = scf.LookupName(sheet, ttext); - if (value.type == "range") { - // only need to recurse here for range, which may be just one cell - pos = value.value.indexOf("|"); - if (pos != -1) { - // range - check each cell - coordvals.cr1 = SocialCalc.coordToCr( - value.value.substring(0, pos) - ); - pos2 = value.value.indexOf("|", pos + 1); - coordvals.cr2 = SocialCalc.coordToCr( - value.value.substring(pos + 1, pos2) - ); - coordvals.inrange = true; - coordvals.inrangestart = true; - i = i - 1; // back up so will start up again here - continue; - } - } else if (value.type == "coord") { - // just a coord - ttype = token_coord; // treat as a coord inline - ttext = value.value; // and then drop through to next test which should succeed - } else { - // not a defined name - probably a function - } - } - - if (ttype == token_coord) { - // token is a coord - - if ( - i >= 2 && // look for a range - parseinfo[i - 1].type == token_op && - parseinfo[i - 1].text == ":" && - parseinfo[i - 2].type == token_coord && - !sheetref - ) { - // Range -- check each cell - coordvals.cr1 = SocialCalc.coordToCr(parseinfo[i - 2].text); // remember range extents - coordvals.cr2 = SocialCalc.coordToCr(ttext); - coordvals.inrange = true; // next time use the range looping code - coordvals.inrangestart = true; - i = i - 1; // back up so will start up again here - continue; - } else if (!sheetref) { - // Single cell reference - if (ttext.indexOf("$") != -1) ttext = ttext.replace(/\$/g, ""); // remove any $'s - coordvals.parsepos = i + 1; // remember our position - come back on next token - coordvals.oldcoord = oldcoord; // remember back up chain - oldcoord = coord; // come back to us - coord = ttext; - if (checkinfo[coord] && typeof checkinfo[coord] == "object") { - // Circular reference - cell.errors = SocialCalc.Constants.s_caccCircRef + startcoord; // set on original cell making the ref - checkinfo[startcoord] = true; // this one should be calculated once at this point - if (!recalcdata.firstcalc) { - // add to calclist - recalcdata.firstcalc = startcoord; - } else { - recalcdata.calclist[recalcdata.lastcalc] = startcoord; - } - recalcdata.lastcalc = startcoord; - recalcdata.calclistlength++; // count number on list - sheet.attribs.circularreferencecell = coord + "|" + oldcoord; // remember at least one circ ref - return cell.errors; - } - continue mainloop; - } - } - } - - sheetref = false; // make sure off when bump back up - - checkinfo[coord] = true; // this one is finished - if (!recalcdata.firstcalc) { - // add to calclist - recalcdata.firstcalc = coord; - } else { - recalcdata.calclist[recalcdata.lastcalc] = coord; - } - recalcdata.lastcalc = coord; - recalcdata.calclistlength++; // count number on list - - coord = oldcoord; // go back to the formula that referred to us and continue - oldcoord = checkinfo[coord] ? checkinfo[coord].oldcoord : null; - } - - return ""; - }; - - // ************************************* - // - // Parse class: - // - // Used by ExecuteSheetCommand to get elements of commands to execute. - // The string it works with consists of one or more lines each - // made up of one or more tokens separated by a delimiter. - // - // ************************************* - - // Initialize: set string to work with - - SocialCalc.Parse = function (str) { - // properties: - - this.str = str; - this.pos = 0; - this.delimiter = " "; - this.lineEnd = str.indexOf("\n"); - if (this.lineEnd < 0) { - this.lineEnd = str.length; - } - }; - - // Return next token as a string - - SocialCalc.Parse.prototype.NextToken = function () { - if (this.pos < 0) return ""; - var pos2 = this.str.indexOf(this.delimiter, this.pos); - var pos1 = this.pos; - if (pos2 > this.lineEnd) { - // don't go past end of line - pos2 = this.lineEnd; - } - if (pos2 >= 0) { - this.pos = pos2 + 1; - return this.str.substring(pos1, pos2); - } else { - this.pos = this.lineEnd; - return this.str.substring(pos1, this.lineEnd); - } - }; - - // Return everything from current point until end of line - - SocialCalc.Parse.prototype.RestOfString = function () { - var oldpos = this.pos; - if (this.pos < 0 || this.pos >= this.lineEnd) return ""; - this.pos = this.lineEnd; - return this.str.substring(oldpos, this.lineEnd); - }; - - SocialCalc.Parse.prototype.RestOfStringNoMove = function () { - if (this.pos < 0 || this.pos >= this.lineEnd) return ""; - return this.str.substring(this.pos, this.lineEnd); - }; - - // Move current point to next line - - SocialCalc.Parse.prototype.NextLine = function () { - this.pos = this.lineEnd + 1; - this.lineEnd = this.str.indexOf("\n", this.pos); - if (this.lineEnd < 0) { - this.lineEnd = this.str.length; - } - }; - - // Check to see if at end of string with no more to process - - SocialCalc.Parse.prototype.EOF = function () { - if (this.pos < 0 || this.pos >= this.str.length) return true; - return false; - }; - - // ************************************* - // - // UndoStack class: - // - // Implements the behavior needed for a normal application's undo/redo stack. - // You add a new change sequence with PushChange. - // The type argument is a string that can be used to lookup some general string - // like "typing" or "setting attribute" for the menu prompts for undo/redo. - // - // You add the "do" steps with AddDo. The non-null, non-undefined arguments are - // joined together with " " to make a command string to be saved. - // - // You add the undo steps as commands for the most recent change with AddUndo. - // The non-null, non-undefined arguments are joined together with " " to make - // a command string to be saved. - // - // The Undo and Redo functions move the Top Of Stack pointer through the changes stack - // so you can undo and redo. Doing a new PushChange removes all undone items - // after TOS. - // - // You can push more things than you can undo if you want. - // There is a maximum to remember as the "did" stack for an audit trail (and as redo). This may be unlimited. - // There is a separate maximum to remember that can be undone. This may be smaller than maxRedo. - // - // ************************************* - - SocialCalc.UndoStack = function () { - // properties: - - this.stack = []; // {command: [], type: type, undo: []} -- multiple dos and undos allowed - this.tos = -1; // top of stack position, used for undo/redo - this.maxRedo = 0; // Maximum size of redo stack (and audit trail which is this.stack[n].command) or zero if no limit - this.maxUndo = 50; // Maximum number of steps kept for undo (usually the memory intensive part) or zero if no limit - }; - - SocialCalc.UndoStack.prototype.PushChange = function (type) { - // adding a new thing to the stack - while (this.stack.length > 0 && this.stack.length - 1 > this.tos) { - // pop off things not redone - this.stack.pop(); - } - this.stack.push({ command: [], type: type, undo: [] }); - if (this.maxRedo && this.stack.length > this.maxRedo) { - // limit number kept as audit trail - this.stack.shift(); // remove the extra one - } - if (this.maxUndo && this.stack.length > this.maxUndo) { - // need to trim excess undo info - this.stack[this.stack.length - this.maxUndo - 1].undo = []; // only need to remove one - } - this.tos = this.stack.length - 1; - }; - - SocialCalc.UndoStack.prototype.AddDo = function () { - var args = []; - for (var i = 0; i < arguments.length; i++) { - if (arguments[i] != null) args.push(arguments[i]); // ignore null or undefined - } - var cmd = args.join(" "); - this.stack[this.stack.length - 1].command.push(cmd); - }; - - SocialCalc.UndoStack.prototype.AddUndo = function () { - var args = []; - for (var i = 0; i < arguments.length; i++) { - if (arguments[i] != null) args.push(arguments[i]); // ignore null or undefined - } - var cmd = args.join(" "); - this.stack[this.stack.length - 1].undo.push(cmd); - }; - - SocialCalc.UndoStack.prototype.TOS = function () { - if (this.tos >= 0) return this.stack[this.tos]; - else return null; - }; - - SocialCalc.UndoStack.prototype.Undo = function () { - if ( - this.tos >= 0 && - (!this.maxUndo || this.tos > this.stack.length - this.maxUndo - 1) - ) { - this.tos -= 1; - return true; - } else { - return false; - } - }; - - SocialCalc.UndoStack.prototype.Redo = function () { - if (this.tos < this.stack.length - 1) { - this.tos += 1; - return true; - } else { - return false; - } - }; - - // ************************************* - // - // Clipboard Object: - // - // This is a single object. - // Stores the clipboard, which is shared by all active sheets. - // Like the undo stack, it does not persist from one editing session to another. - // - // ************************************* - - SocialCalc.Clipboard = { - // properties: - - clipboard: "", // empty or string in save format with "copiedfrom:" set to a range - }; - - // ************************************* - // - // RenderContext class: - // - // ************************************* - - SocialCalc.RenderContext = function (sheetobj) { - var parts, num, s; - var attribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - // properties: - - this.sheetobj = sheetobj; - this.hideRowsCols = false; // Rendering with panes only works with "false" - // !!!! Note: not implemented yet in rendering, just saved as an attribute - this.showGrid = false; - this.showRCHeaders = false; - this.rownamewidth = scc.defaultRowNameWidth; - this.pixelsPerRow = scc.defaultAssumedRowHeight; - - this.cellskip = {}; // if present, coord of cell covering this cell - this.coordToCR = {}; // for cells starting spans, coordToCR[coord]={row:row, col:col} - this.colwidth = []; // precomputed column widths, taking into account defaults - this.totalwidth = 0; // precomputed total table width - - this.rowpanes = []; // for each pane, {first: firstrow, last: lastrow} - this.colpanes = []; // for each pane, {first: firstrow, last: lastrow} - this.maxcol = 0; // max col and row to display, adding long spans, etc. - this.maxrow = 0; - - this.highlights = {}; // for each cell with special display: coord:highlightType (see this.highlightTypes) - this.cursorsuffix = ""; // added to highlights[cr]=="cursor" to get type to lookup - - this.highlightTypes = - // attributes to change when highlit - { - cursor: { - style: scc.defaultHighlightTypeCursorStyle, - className: scc.defaultHighlightTypeCursorClass, - }, - range: { - style: scc.defaultHighlightTypeRangeStyle, - className: scc.defaultHighlightTypeRangeClass, - }, - cursorinsertup: { - style: - "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-x;backgroundPosition:top left;backgroundImage:url(" + - scc.defaultImagePrefix + - "cursorinsertup.gif);", - className: scc.defaultHighlightTypeCursorClass, - }, - cursorinsertleft: { - style: - "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-y;backgroundPosition:top left;backgroundImage:url(" + - scc.defaultImagePrefix + - "cursorinsertleft.gif);", - className: scc.defaultHighlightTypeCursorClass, - }, - range2: { - style: - "color:#000;backgroundColor:#FFF;backgroundImage:url(" + - scc.defaultImagePrefix + - "range2.gif);", - className: "", - }, - }; - - this.cellIDprefix = scc.defaultCellIDPrefix; // if non-null, each cell will render with an ID - - this.defaultlinkstyle = null; // default linkstyle object (allows you to pass values to link renderer) - this.defaultHTMLlinkstyle = { type: "html" }; // default linkstyle for standalone HTML - - // constants: - - this.defaultfontstyle = scc.defaultCellFontStyle; - this.defaultfontsize = scc.defaultCellFontSize; - this.defaultfontfamily = scc.defaultCellFontFamily; - - this.defaultlayout = scc.defaultCellLayout; - - this.defaultpanedividerwidth = scc.defaultPaneDividerWidth; - this.defaultpanedividerheight = scc.defaultPaneDividerHeight; - - this.gridCSS = scc.defaultGridCSS; - - this.commentClassName = scc.defaultCommentClass; // for cells with non-blank comments when this.showGrid is true - this.commentCSS = scc.defaultCommentStyle; // any combination of classnames and styles may be used - this.commentNoGridClassName = scc.defaultCommentNoGridClass; // for cells when this.showGrid is false - this.commentNoGridCSS = scc.defaultCommentNoGridStyle; // any combination of classnames and styles may be used - - this.classnames = - // any combination of classnames and explicitStyles can be used - { - colname: scc.defaultColnameClass, - rowname: scc.defaultRownameClass, - selectedcolname: scc.defaultSelectedColnameClass, - selectedrowname: scc.defaultSelectedRownameClass, - upperleft: scc.defaultUpperLeftClass, - skippedcell: scc.defaultSkippedCellClass, - panedivider: scc.defaultPaneDividerClass, - }; - - this.explicitStyles = - // these may be used so you won't need a stylesheet with the classnames - { - colname: scc.defaultColnameStyle, - rowname: scc.defaultRownameStyle, - selectedcolname: scc.defaultSelectedColnameStyle, - selectedrowname: scc.defaultSelectedRownameStyle, - upperleft: scc.defaultUpperLeftStyle, - skippedcell: scc.defaultSkippedCellStyle, - panedivider: scc.defaultPaneDividerStyle, - }; - - // processed info about cell skipping - - this.cellskip = null; - this.needcellskip = true; - - // precomputed values, filling in defaults indicated by "*" - - this.fonts = []; // for each fontnum, {style: fs, weight: fw, size: fs, family: ff} - this.layouts = []; // for each layout, "padding:Tpx Rpx Bpx Lpx;vertical-align:va;" - - this.needprecompute = true; // need to call PrecomputeSheetFontsAndLayouts - - // if have a sheet object, initialize constants and precomputed values - - if (sheetobj) { - this.rowpanes[0] = { first: 1, last: attribs.lastrow }; - this.colpanes[0] = { first: 1, last: attribs.lastcol }; - } else throw scc.s_rcMissingSheet; - }; - - // Methods: - - SocialCalc.RenderContext.prototype.PrecomputeSheetFontsAndLayouts = - function () { - SocialCalc.PrecomputeSheetFontsAndLayouts(this); - }; - SocialCalc.RenderContext.prototype.CalculateCellSkipData = function () { - SocialCalc.CalculateCellSkipData(this); - }; - SocialCalc.RenderContext.prototype.CalculateColWidthData = function () { - SocialCalc.CalculateColWidthData(this); - }; - SocialCalc.RenderContext.prototype.SetRowPaneFirstLast = function ( - panenum, - first, - last - ) { - this.rowpanes[panenum] = { first: first, last: last }; - }; - SocialCalc.RenderContext.prototype.SetColPaneFirstLast = function ( - panenum, - first, - last - ) { - this.colpanes[panenum] = { first: first, last: last }; - }; - SocialCalc.RenderContext.prototype.CoordInPane = function ( - coord, - rowpane, - colpane - ) { - return SocialCalc.CoordInPane(this, coord, rowpane, colpane); - }; - SocialCalc.RenderContext.prototype.CellInPane = function ( - row, - col, - rowpane, - colpane - ) { - return SocialCalc.CellInPane(this, row, col, rowpane, colpane); - }; - SocialCalc.RenderContext.prototype.InitializeTable = function (tableobj) { - SocialCalc.InitializeTable(this, tableobj); - }; - SocialCalc.RenderContext.prototype.RenderSheet = function ( - oldtable, - linkstyle - ) { - return SocialCalc.RenderSheet(this, oldtable, linkstyle); - }; - SocialCalc.RenderContext.prototype.RenderColGroup = function () { - return SocialCalc.RenderColGroup(this); - }; - SocialCalc.RenderContext.prototype.RenderColHeaders = function () { - return SocialCalc.RenderColHeaders(this); - }; - SocialCalc.RenderContext.prototype.RenderSizingRow = function () { - return SocialCalc.RenderSizingRow(this); - }; - SocialCalc.RenderContext.prototype.RenderRow = function ( - rownum, - rowpane, - linkstyle - ) { - return SocialCalc.RenderRow(this, rownum, rowpane, linkstyle); - }; - SocialCalc.RenderContext.prototype.RenderSpacingRow = function () { - return SocialCalc.RenderSpacingRow(this); - }; - SocialCalc.RenderContext.prototype.RenderCell = function ( - rownum, - colnum, - rowpane, - colpane, - noElement, - linkstyle - ) { - return SocialCalc.RenderCell( - this, - rownum, - colnum, - rowpane, - colpane, - noElement, - linkstyle - ); - }; - - // Functions: - - SocialCalc.PrecomputeSheetFontsAndLayouts = function (context) { - var defaultfont, parts, layoutre, dparts, sparts, num, s, i; - var sheetobj = context.sheetobj; - var attribs = sheetobj.attribs; - - if (attribs.defaultfont) { - defaultfont = sheetobj.fonts[attribs.defaultfont]; - defaultfont = defaultfont.replace( - /^\*/, - SocialCalc.Constants.defaultCellFontStyle - ); - defaultfont = defaultfont.replace( - /(.+)\*(.+)/, - "$1" + SocialCalc.Constants.defaultCellFontSize + "$2" - ); - defaultfont = defaultfont.replace( - /\*$/, - SocialCalc.Constants.defaultCellFontFamily - ); - parts = defaultfont.match(/^(\S+? \S+?) (\S+?) (\S.*)$/); - context.defaultfontstyle = parts[1]; - context.defaultfontsize = parts[2]; - context.defaultfontfamily = parts[3]; - } - - for (num = 1; num < sheetobj.fonts.length; num++) { - // precompute fonts by filling in the *'s - s = sheetobj.fonts[num]; - s = s.replace(/^\*/, context.defaultfontstyle); - s = s.replace(/(.+)\*(.+)/, "$1" + context.defaultfontsize + "$2"); - s = s.replace(/\*$/, context.defaultfontfamily); - parts = s.match(/^(\S+?) (\S+?) (\S+?) (\S.*)$/); - context.fonts[num] = { - style: parts[1], - weight: parts[2], - size: parts[3], - family: parts[4], - }; - } - - layoutre = - /^padding:\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+);vertical-align:\s*(\S+);/; - dparts = SocialCalc.Constants.defaultCellLayout.match(layoutre); // get built-in defaults - - if (attribs.defaultlayout) { - sparts = sheetobj.layouts[attribs.defaultlayout].match(layoutre); // get sheet defaults, if set - } else { - sparts = ["", "*", "*", "*", "*", "*"]; - } - - for (num = 1; num < sheetobj.layouts.length; num++) { - // precompute layouts by filling in the *'s - s = sheetobj.layouts[num]; - parts = s.match(layoutre); - for (i = 1; i <= 5; i++) { - if (parts[i] == "*") { - parts[i] = sparts[i] != "*" ? sparts[i] : dparts[i]; // if *, sheet default or built-in - } - } - context.layouts[num] = - "padding:" + - parts[1] + - " " + - parts[2] + - " " + - parts[3] + - " " + - parts[4] + - ";vertical-align:" + - parts[5] + - ";"; - } - - context.needprecompute = false; - }; - - SocialCalc.CalculateCellSkipData = function (context) { - var row, - col, - coord, - cell, - contextcell, - colspan, - rowspan, - skiprow, - skipcol, - skipcoord; - - var sheetobj = context.sheetobj; - var sheetrowattribs = sheetobj.rowattribs; - var sheetcolattribs = sheetobj.colattribs; - context.maxrow = 0; - context.maxcol = 0; - context.cellskip = {}; // reset - - // Calculate cellskip data - var maxrow, maxcol; - - for (row = 1; row <= sheetobj.attribs.lastrow; row++) { - for (col = 1; col <= sheetobj.attribs.lastcol; col++) { - // look for spans and set cellskip for skipped cells - coord = SocialCalc.crToCoord(col, row); - cell = sheetobj.cells[coord]; - // don't look at undefined cells (they have no spans) or skipped cells - if (cell === undefined || context.cellskip[coord]) continue; - colspan = cell.colspan || 1; - rowspan = cell.rowspan || 1; - if (colspan > 1 || rowspan > 1) { - for (skiprow = row; skiprow < row + rowspan; skiprow++) { - for (skipcol = col; skipcol < col + colspan; skipcol++) { - // do the setting on individual cells - skipcoord = SocialCalc.crToCoord(skipcol, skiprow); - if (skipcoord == coord) { - // for coord, remember row and col - context.coordToCR[coord] = { row: row, col: col }; - } else { - // for other cells, flag with coord of here - context.cellskip[skipcoord] = coord; - } - if (skiprow > context.maxrow) maxrow = skiprow; - if (skipcol > context.maxcol) maxcol = skipcol; - } - } - } - } - } - - context.needcellskip = false; - }; - - SocialCalc.CalculateColWidthData = function (context) { - var colnum, colname, colwidth, totalwidth; - - var sheetobj = context.sheetobj; - var sheetcolattribs = sheetobj.colattribs; - - // Calculate column width data - - totalwidth = context.showRCHeaders ? context.rownamewidth - 0 : 0; - for (var colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - colname = SocialCalc.rcColname(colnum); - colwidth = - sheetobj.colattribs.width[colname] || - sheetobj.attribs.defaultcolwidth || - SocialCalc.Constants.defaultColWidth; - if (colwidth == "blank" || colwidth == "auto") colwidth = ""; - context.colwidth[colnum] = colwidth + ""; - totalwidth += colwidth && colwidth - 0 > 0 ? colwidth - 0 : 10; - } - } - context.totalwidth = totalwidth; - }; - - SocialCalc.InitializeTable = function (context, tableobj) { - /* - -Uses border-collapse so corners don't have holes -Note: IE and Firefox handle differently (IE adds borders and padding) -under border-collapse and Safari has problems with and wide text -Tablelayout "fixed" also leads to problems - -*/ - - /* - -*** Discussion *** - -The rendering assumes fixed column widths, even though SocialCalc allows "auto". -There may be issues with "auto" and it is hard to make it work cross-browser -with border-collapse, etc. - -This and the RenderSheet routine are where in the code the specifics of -table attributes and column size definitions are set. As the browsers settle down -and when we decide if we don't need auto width, we may want to revisit the way the -code does this (e.g., use table-layout:fixed). - -*/ - tableobj.style.borderCollapse = "collapse"; - tableobj.cellSpacing = "0"; - tableobj.cellPadding = "0"; - - tableobj.style.width = context.totalwidth + "px"; - }; - - // - // tableobj = SocialCalc.RenderSheet(context, oldtable, linkstyle) - // - // Renders a render context returning a DOM table object. - // If there is an oldtable object, it replaces it in the parent node. - // If oldtable is null, it just returns the new one. - // The linkstyle is "" or null for editing rendering - // and optionally an object passed on to formatting code. - // - - SocialCalc.RenderSheet = function (context, oldtable, linkstyle) { - var newrow, rowpane; - var tableobj, colgroupobj, tbodyobj, parentnode; - - // do precompute stuff if necessary - - if (context.sheetobj.changedrendervalues) { - context.needcellskip = true; - context.needprecompute = true; - context.sheetobj.changedrendervalues = false; - } - if (context.needcellskip) { - context.CalculateCellSkipData(); - } - if (context.needprecompute) { - context.PrecomputeSheetFontsAndLayouts(); - } - - context.CalculateColWidthData(); // always make sure col width values are up to date - - // make the table element and fill it in - - tableobj = document.createElement("table"); - context.InitializeTable(tableobj); - - colgroupobj = context.RenderColGroup(); - tableobj.appendChild(colgroupobj); - - tbodyobj = document.createElement("tbody"); - - tbodyobj.appendChild(context.RenderSizingRow()); - - if (context.showRCHeaders) { - newrow = context.RenderColHeaders(); - if (newrow) tbodyobj.appendChild(newrow); - } - - for (rowpane = 0; rowpane < context.rowpanes.length; rowpane++) { - for ( - var rownum = context.rowpanes[rowpane].first; - rownum <= context.rowpanes[rowpane].last; - rownum++ - ) { - newrow = context.RenderRow(rownum, rowpane, linkstyle); - tbodyobj.appendChild(newrow); - } - if (rowpane < context.rowpanes.length - 1) { - newrow = context.RenderSpacingRow(); - tbodyobj.appendChild(newrow); - } - } - - tableobj.appendChild(tbodyobj); - - if (oldtable) { - parentnode = oldtable.parentNode; - if (parentnode) parentnode.replaceChild(tableobj, oldtable); - } - - SocialCalc.EvalUserScripts(); - - return tableobj; - }; - - SocialCalc.RenderRow = function (context, rownum, rowpane, linkstyle) { - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - var colnum, newcol, colpane, newdiv; - - if (context.showRCHeaders) { - newcol = document.createElement("td"); - if (context.classnames) newcol.className = context.classnames.rowname; - if (context.explicitStyles) - newcol.style.cssText = context.explicitStyles.rowname; - newcol.width = context.rownamewidth; - newcol.style.verticalAlign = "top"; // to get around Safari making top of centered row number be - // considered top of row (and can't get position in Safari) - if (!SocialCalc.Constants.SCNoRowName) { - newcol.innerHTML = rownum + ""; - } - result.appendChild(newcol); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = context.RenderCell( - rownum, - colnum, - rowpane, - colpane, - null, - linkstyle - ); - if (newcol) result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("td"); - newcol.width = context.defaultpanedividerwidth; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - newdiv = document.createElement("div"); // for Firefox to avoid squishing - newdiv.style.width = context.defaultpanedividerwidth + "px"; - newdiv.style.overflow = "hidden"; - newcol.appendChild(newdiv); - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderSpacingRow = function (context) { - var colnum, newcol, colpane, w; - - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - - if (context.showRCHeaders) { - newcol = document.createElement("td"); - newcol.width = context.rownamewidth; - newcol.height = context.defaultpanedividerheight; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - result.appendChild(newcol); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = document.createElement("td"); - w = context.colwidth[colnum]; - if (w) newcol.width = w; - newcol.height = context.defaultpanedividerheight; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - if (newcol) result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("td"); - newcol.width = context.defaultpanedividerwidth; - newcol.height = context.defaultpanedividerheight; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderColHeaders = function (context) { - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - var colnum, newcol; - - if (!context.showRCHeaders) return null; - - newcol = document.createElement("td"); - if (context.classnames) newcol.className = context.classnames.upperleft; - if (context.explicitStyles) - newcol.style.cssText = context.explicitStyles.upperleft; - newcol.width = context.rownamewidth; - result.appendChild(newcol); - - for (var colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = document.createElement("td"); - if (context.classnames) newcol.className = context.classnames.colname; - if (context.explicitStyles) - newcol.style.cssText = context.explicitStyles.colname; - if (SocialCalc.Constants.SCNoColNames) { - // newcol.innerHTML=" "; - // newcol.innerHTML=""; - } else { - newcol.innerHTML = SocialCalc.rcColname(colnum); - } - result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("td"); - newcol.width = context.defaultpanedividerwidth; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderColGroup = function (context) { - var colpane, colnum, newcol, t; - var sheetobj = context.sheetobj; - - var result = document.createElement("colgroup"); - - if (context.showRCHeaders) { - newcol = document.createElement("col"); - newcol.width = context.rownamewidth; - result.appendChild(newcol); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = document.createElement("col"); - t = context.colwidth[colnum]; - if (t) newcol.width = t; - result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("col"); - newcol.width = context.defaultpanedividerwidth; - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderSizingRow = function (context) { - var colpane, colnum, newcell, t; - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - - if (context.showRCHeaders) { - newcell = document.createElement("td"); - newcell.style.width = context.rownamewidth + "px"; - newcell.height = "1"; - result.appendChild(newcell); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcell = document.createElement("td"); - t = context.colwidth[colnum]; - if (t) newcell.width = t; - newcell.height = "1"; - result.appendChild(newcell); - } - if (colpane < context.colpanes.length - 1) { - newcell = document.createElement("td"); - newcell.width = context.defaultpanedividerwidth; - newcell.height = "1"; - result.appendChild(newcell); - } - } - return result; - }; - - SocialCalc.RenderCell = function ( - context, - rownum, - colnum, - rowpane, - colpane, - noElement, - linkstyle - ) { - var sheetobj = context.sheetobj; - - var num, t, result, span, stylename, cell, sheetattribs, scdefaults; - var stylestr = ""; - - rownum = rownum - 0; // make sure a number - colnum = colnum - 0; - - var coord = SocialCalc.crToCoord(colnum, rownum); - - if (context.cellskip[coord]) { - // skip if within a span - if (context.CoordInPane(context.cellskip[coord], rowpane, colpane)) { - return null; // span starts in this pane -- so just skip - } - result = noElement - ? SocialCalc.CreatePseudoElement() - : document.createElement("td"); // span start is scrolled away, so make a special cell - if (context.classnames.skippedcell) - result.className = context.classnames.skippedcell; - if (context.explicitStyles.skippedcell) - result.style.cssText = context.explicitStyles.skippedcell; - result.innerHTML = " "; // put something there so height is OK - // !!! Really need to add borders in case there isn't anything else shown in the pane to get height - return result; - } - - result = noElement - ? SocialCalc.CreatePseudoElement() - : document.createElement("td"); - - if (context.cellIDprefix) { - result.id = context.cellIDprefix + coord; - } - - cell = sheetobj.cells[coord]; - - if (!cell) { - cell = new SocialCalc.Cell(coord); - } - - sheetattribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - if (cell.colspan > 1) { - span = 1; - for (num = 1; num < cell.colspan; num++) { - if ( - sheetobj.colattribs.hide[SocialCalc.rcColname(colnum + num)] != - "yes" && - context.CellInPane(rownum, colnum + num, rowpane, colpane) - ) { - span++; - } - } - result.colSpan = span; - } - - if (cell.rowspan > 1) { - span = 1; - for (num = 1; num < cell.rowspan; num++) { - if ( - sheetobj.rowattribs.hide[rownum + num + ""] != "yes" && - context.CellInPane(rownum + num, colnum, rowpane, colpane) - ) - span++; - } - result.rowSpan = span; - } - - if (cell.displaystring == undefined) { - // cache the display value - cell.displaystring = SocialCalc.FormatValueForDisplay( - sheetobj, - cell.datavalue, - coord, - linkstyle || context.defaultlinkstyle - ); - } else { - // callout to execute scripts if needed - SocialCalc.CallOutOnRenderCell(sheetobj, cell.datavalue, coord); - } - result.innerHTML = cell.displaystring; - - num = cell.layout || sheetattribs.defaultlayout; - if (num) { - stylestr += context.layouts[num]; // use precomputed layout with "*"'s filled in - } else { - stylestr += scc.defaultCellLayout; - } - - num = cell.font || sheetattribs.defaultfont; - if (num) { - // get expanded font strings in context - t = context.fonts[num]; // do each - plain "font:" style sets all sorts of other values, too (Safari font-stretch problem on cssText) - stylestr += - "font-style:" + - t.style + - ";font-weight:" + - t.weight + - ";font-size:" + - t.size + - ";font-family:" + - t.family + - ";"; - } else { - if (scc.defaultCellFontSize) { - stylestr += "font-size:" + scc.defaultCellFontSize + ";"; - } - if (scc.defaultCellFontFamily) { - stylestr += "font-family:" + scc.defaultCellFontFamily + ";"; - } - } - - num = cell.color || sheetattribs.defaultcolor; - if (num) stylestr += "color:" + sheetobj.colors[num] + ";"; - - num = cell.bgcolor || sheetattribs.defaultbgcolor; - if (num) stylestr += "background-color:" + sheetobj.colors[num] + ";"; - - num = cell.cellformat; - if (num) { - stylestr += "text-align:" + sheetobj.cellformats[num] + ";"; - } else { - t = cell.valuetype.charAt(0); - if (t == "t") { - num = sheetattribs.defaulttextformat; - if (num) stylestr += "text-align:" + sheetobj.cellformats[num] + ";"; - } else if ((t = "n")) { - num = sheetattribs.defaultnontextformat; - if (num) { - stylestr += "text-align:" + sheetobj.cellformats[num] + ";"; - } else { - stylestr += "text-align:right;"; - } - } else stylestr += "text-align:left;"; - } - - num = cell.bt; - if (num) stylestr += "border-top:" + sheetobj.borderstyles[num] + ";"; - - num = cell.br; - if (num) stylestr += "border-right:" + sheetobj.borderstyles[num] + ";"; - else if (context.showGrid) { - if ( - context.CellInPane( - rownum, - colnum + (cell.colspan || 1), - rowpane, - colpane - ) - ) - t = SocialCalc.crToCoord(colnum + (cell.colspan || 1), rownum); - else t = "nomatch"; - if (context.cellskip[t]) t = context.cellskip[t]; - if (!sheetobj.cells[t] || !sheetobj.cells[t].bl) - stylestr += "border-right:" + context.gridCSS; - } - - num = cell.bb; - if (num) stylestr += "border-bottom:" + sheetobj.borderstyles[num] + ";"; - else if (context.showGrid) { - if ( - context.CellInPane( - rownum + (cell.rowspan || 1), - colnum, - rowpane, - colpane - ) - ) - t = SocialCalc.crToCoord(colnum, rownum + (cell.rowspan || 1)); - else t = "nomatch"; - if (context.cellskip[t]) t = context.cellskip[t]; - if (!sheetobj.cells[t] || !sheetobj.cells[t].bt) - stylestr += "border-bottom:" + context.gridCSS; - } - - num = cell.bl; - if (num) stylestr += "border-left:" + sheetobj.borderstyles[num] + ";"; - - if (cell.comment) { - if (context.showGrid) { - if (context.commentClassName) { - result.className = - (result.className ? result.className + " " : "") + - context.commentClassName; - } - stylestr += context.commentCSS; - } else { - if (context.commentNoGridClassName) { - result.className = - (result.className ? result.className + " " : "") + - context.commentNoGridClassName; - } - stylestr += context.commentNoGridCSS; - } - } - - result.style.cssText = stylestr; - - //!!!!!!!!! - // NOTE: csss and cssc are not supported yet. - // csss needs to be parsed into pieces to override just the attributes specified, not all with assignment to cssText. - // cssc just needs to set the className. - - t = context.highlights[coord]; - if (t) { - // this is a highlit cell: Override style appropriately - if (t == "cursor") t += context.cursorsuffix; // cursor can take alternative forms - if (context.highlightTypes[t].className) { - result.className = - (result.className ? result.className + " " : "") + - context.highlightTypes[t].className; - } - // only if cell is editable, set the cursor class - if ( - t == "cursor" && - SocialCalc.Callbacks.IsCoordEditable && - !SocialCalc.Callbacks.IsCoordEditable( - context.sheetobj.sheetname + "!" + coord - ) - ) { - SocialCalc.setStyles(result, ""); - } else { - SocialCalc.setStyles(result, context.highlightTypes[t].style); - } - } - - return result; - }; - - SocialCalc.CoordInPane = function (context, coord, rowpane, colpane) { - var coordToCR = context.coordToCR[coord]; - if (!coordToCR || !coordToCR.row || !coordToCR.col) - throw "Bad coordToCR for " + coord; - return context.CellInPane(coordToCR.row, coordToCR.col, rowpane, colpane); - }; - - SocialCalc.CellInPane = function (context, row, col, rowpane, colpane) { - var panerowlimits = context.rowpanes[rowpane]; - var panecollimits = context.colpanes[colpane]; - if (!panerowlimits || !panecollimits) - throw "CellInPane called with unknown panes " + rowpane + "/" + colpane; - if (row < panerowlimits.first || row > panerowlimits.last) return false; - if (col < panecollimits.first || col > panecollimits.last) return false; - return true; - }; - - SocialCalc.CreatePseudoElement = function () { - return { style: { cssText: "" }, innerHTML: "", className: "" }; - }; - - // ************************************* - // - // Misc. functions: - // - // ************************************* - - SocialCalc.rcColname = function (c) { - if (c > 702) c = 702; // maximum number of columns - ZZ - if (c < 1) c = 1; - var collow = ((c - 1) % 26) + 65; - var colhigh = Math.floor((c - 1) / 26); - if (colhigh) - return String.fromCharCode(colhigh + 64) + String.fromCharCode(collow); - else return String.fromCharCode(collow); - }; - - SocialCalc.letters = [ - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - ]; - - SocialCalc.crToCoord = function (c, r) { - var result; - if (c < 1) c = 1; - if (c > 702) c = 702; // maximum number of columns - ZZ - if (r < 1) r = 1; - var collow = (c - 1) % 26; - var colhigh = Math.floor((c - 1) / 26); - if (colhigh) - result = SocialCalc.letters[colhigh - 1] + SocialCalc.letters[collow] + r; - else result = SocialCalc.letters[collow] + r; - return result; - }; - - SocialCalc.coordToCol = {}; // too expensive to set in crToCoord since that is called so many times - SocialCalc.coordToRow = {}; - - SocialCalc.coordToCr = function (cr) { - var c, i, ch; - var r = SocialCalc.coordToRow[cr]; - if (r) return { row: r, col: SocialCalc.coordToCol[cr] }; - c = 0; - r = 0; - for (i = 0; i < cr.length; i++) { - // this was faster than using regexes; assumes well-formed - ch = cr.charCodeAt(i); - if (ch == 36); - else if (ch <= 57) - // skip $'s - r = 10 * r + ch - 48; - else if (ch >= 97) c = 26 * c + ch - 96; - else if (ch >= 65) c = 26 * c + ch - 64; - } - SocialCalc.coordToCol[cr] = c; - SocialCalc.coordToRow[cr] = r; - return { row: r, col: c }; - }; - - SocialCalc.ParseRange = function (range) { - var pos, cr, cr1, cr2; - if (!range) range = "A1:A1"; // error return, hopefully benign - range = range.toUpperCase(); - pos = range.indexOf(":"); - if (pos >= 0) { - cr = range.substring(0, pos); - cr1 = SocialCalc.coordToCr(cr); - cr1.coord = cr; - cr = range.substring(pos + 1); - cr2 = SocialCalc.coordToCr(cr); - cr2.coord = cr; - } else { - cr1 = SocialCalc.coordToCr(range); - cr1.coord = range; - cr2 = SocialCalc.coordToCr(range); - cr2.coord = range; - } - return { cr1: cr1, cr2: cr2 }; - }; - - SocialCalc.decodeFromSave = function (s) { - if (typeof s != "string") return s; - if (s.indexOf("\\") == -1) return s; // for performace reasons: replace nothing takes up time - var r = s.replace(/\\c/g, ":"); - r = r.replace(/\\n/g, "\n"); - return r.replace(/\\b/g, "\\"); - }; - - SocialCalc.decodeFromAjax = function (s) { - if (typeof s != "string") return s; - if (s.indexOf("\\") == -1) return s; // for performace reasons: replace nothing takes up time - var r = s.replace(/\\c/g, ":"); - r = r.replace(/\\n/g, "\n"); - r = r.replace(/\\e/g, "]]"); - return r.replace(/\\b/g, "\\"); - }; - - SocialCalc.encodeForSave = function (s) { - if (typeof s != "string") return s; - if (s.indexOf("\\") != -1) - // for performace reasons: replace nothing takes up time - s = s.replace(/\\/g, "\\b"); - if (s.indexOf(":") != -1) s = s.replace(/:/g, "\\c"); - if (s.indexOf("\n") != -1) s = s.replace(/\n/g, "\\n"); - return s; - }; - - // - // Returns estring where &, <, >, " are HTML escaped - // - SocialCalc.special_chars = function (string) { - if (/[&<>"]/.test(string)) { - // only do "slow" replaces if something to replace - string = string.replace(/&/g, "&"); - string = string.replace(//g, ">"); - string = string.replace(/"/g, """); - } - return string; - }; - - SocialCalc.Lookup = function (value, list) { - for (i = 0; i < list.length; i++) { - if (list[i] > value) { - if (i > 0) return i - 1; - else return null; - } - } - return list.length - 1; // if all smaller, matches last - }; - - // - // setStyles(element, cssText) - // - // Takes a pseudo style string (e.g., text-align must be textAlign) and sets - // the element's style value for each style name listed (leaving others unchanged). - // OK to call with null cssText. - // - - SocialCalc.setStyles = function (element, cssText) { - var parts, part, pos, name, value; - - if (!cssText) return; - - parts = cssText.split(";"); - for (part = 0; part < parts.length; part++) { - pos = parts[part].indexOf(":"); // find first colon (could be one in url) - if (pos != -1) { - name = parts[part].substring(0, pos); - value = parts[part].substring(pos + 1); - if (name && value) { - // if non-null name and value, set style - element.style[name] = value; - } - } - // namevalue = parts[part].split(":"); - // if (namevalue[0]) element.style[namevalue[0]] = namevalue[1]; - } - }; - - // - // GetViewportInfo() - returns object with viewport width and height, and scroll offsets - // - // Flanagan, JavaScript, 5th Edition, page 276 - // - - SocialCalc.GetViewportInfo = function () { - var result = {}; - - if (window.innerWidth) { - // all but IE - result.width = window.innerWidth; - result.height = window.innerHeight; - result.horizontalScroll = window.pageXOffset; - result.verticalScroll = window.pageYOffset; - } else { - if (document.documentElement && document.documentElement.clientWidth) { - result.width = document.documentElement.clientWidth; - result.height = document.documentElement.clientHeight; - result.horizontalScroll = document.documentElement.scrollLeft; - result.verticalScroll = document.documentElement.scrollTop; - } else if (document.body.clientWidth) { - result.width = document.body.clientWidth; - result.height = document.body.clientHeight; - result.horizontalScroll = document.body.scrollLeft; - result.verticalScroll = document.body.scrollTop; - } - } - - return result; - }; - - // - // GetElementPosition(element) - returns object with left and top position of the element in the document - // - // Goodman's JavaScript & DHTML Cookbook, 2nd Edition, page 415 - // - - SocialCalc.GetElementPosition = function (element) { - var offsetLeft = 0; - var offsetTop = 0; - while (element) { - offsetLeft += element.offsetLeft; - offsetTop += element.offsetTop; - element = element.offsetParent; - } - return { left: offsetLeft, top: offsetTop }; - }; - - // - // GetElementPositionWithScroll(element) - returns object with left and top position of the element in the document - // - // Takes into account scroll offsets by going through entire tree - // - - SocialCalc.GetElementPositionWithScroll = function (element) { - var offsetLeft = 0; - var offsetTop = 0; - var offsetElement = element; - while (element) { - if (element.tagName == "HTML") break; - if (element == offsetElement) { - offsetLeft += element.offsetLeft; - offsetTop += element.offsetTop; - offsetElement = element.offsetParent; - } - if (element.scrollLeft) { - offsetLeft -= element.scrollLeft; - } - if (element.scrollTop) { - offsetTop -= element.scrollTop; - } - element = element.parentNode; - } - return { left: offsetLeft, top: offsetTop }; - }; - - // - // LookupElement(element, array) - returns array element which is an object with "element" of element - // - - SocialCalc.LookupElement = function (element, array) { - var i; - for (i = 0; i < array.length; i++) { - if (array[i].element == element) return array[i]; - } - return null; - }; - - // - // AssignID(obj, element, id) - Optionally assigns an ID with a prefix to the element - // - - SocialCalc.AssignID = function (obj, element, id) { - if (obj.idPrefix) { - // Object must have a non-empty idPrefix attribute - element.id = obj.idPrefix + id; - } - }; - - // - // SocialCalc.GetCellContents(sheetobj, coord) - // - // Returns the contents (value, formula, constant, etc.) of a cell - // with appropriate prefix ("'", "=", etc.) - // - - SocialCalc.GetCellContents = function (sheetobj, coord) { - var result = ""; - var cellobj = sheetobj.cells[coord]; - if (cellobj) { - switch (cellobj.datatype) { - case "v": - result = cellobj.datavalue + ""; - break; - case "t": - result = "'" + cellobj.datavalue; - break; - case "f": - result = "=" + cellobj.formula; - break; - case "c": - result = cellobj.formula; - break; - default: - break; - } - } - - return result; - }; - - // - // Routines translated from the SocialCalc 1.1.0 Perl code: - // - // (Makes use of the FormatNumber JavaScript code translated from the Perl.) - // - - // - // displayvalue = FormatValueForDisplay(sheetobj, value, cr, linkstyle) - // - // Returns a string, in HTML, for the contents of a cell. - // - // The value is a either numeric or text, the cr is the coord of the cell - // (its cell properties are used to determine formatting), and linkstyle - // is a value passed to wiki-text expansion routines specifying the - // purpose of the rendering so, for example, links can be rendered differently - // during edit than with plain HTML. - // - - SocialCalc.FormatValueForDisplay = function (sheetobj, value, cr, linkstyle) { - var valueformat, has_parens, has_commas, valuetype, valuesubtype; - var displayvalue; - - var sheetattribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - var cell = sheetobj.cells[cr]; - - if (!cell) { - // get an empty cell if not there - cell = new SocialCalc.Cell(cr); - } - - displayvalue = value; - - valuetype = cell.valuetype || ""; // get type of value to determine formatting - valuesubtype = valuetype.substring(1); - valuetype = valuetype.charAt(0); - - if (cell.errors || valuetype == "e") { - displayvalue = cell.errors || valuesubtype || "Error in cell"; - return displayvalue; - } - - if (valuetype == "t") { - valueformat = - sheetobj.valueformats[cell.textvalueformat - 0] || - sheetobj.valueformats[sheetattribs.defaulttextvalueformat - 0] || - ""; - if (valueformat == "formula") { - if (cell.datatype == "f") { - displayvalue = - SocialCalc.special_chars("=" + cell.formula) || " "; - } else if (cell.datatype == "c") { - displayvalue = - SocialCalc.special_chars("'" + cell.formula) || " "; - } else { - displayvalue = - SocialCalc.special_chars("'" + displayvalue) || " "; - } - return displayvalue; - } - displayvalue = SocialCalc.format_text_for_display( - displayvalue, - cell.valuetype, - valueformat, - sheetobj, - linkstyle - ); - if (valueformat == "text-html") - SocialCalc.ScriptCheck(sheetobj.sheetid, cr, value); - } else if (valuetype == "n") { - valueformat = cell.nontextvalueformat; - if (valueformat == null || valueformat == "") { - // - valueformat = sheetattribs.defaultnontextvalueformat; - } - valueformat = sheetobj.valueformats[valueformat - 0]; - if (valueformat == null || valueformat == "none") { - valueformat = ""; - } - if (valueformat == "formula") { - if (cell.datatype == "f") { - displayvalue = - SocialCalc.special_chars("=" + cell.formula) || " "; - } else if (cell.datatype == "c") { - displayvalue = - SocialCalc.special_chars("'" + cell.formula) || " "; - } else { - displayvalue = - SocialCalc.special_chars("'" + displayvalue) || " "; - } - return displayvalue; - } else if (valueformat == "forcetext") { - if (cell.datatype == "f") { - displayvalue = - SocialCalc.special_chars("=" + cell.formula) || " "; - } else if (cell.datatype == "c") { - displayvalue = SocialCalc.special_chars(cell.formula) || " "; - } else { - displayvalue = SocialCalc.special_chars(displayvalue) || " "; - } - return displayvalue; - } - - displayvalue = SocialCalc.format_number_for_display( - displayvalue, - cell.valuetype, - valueformat - ); - } else { - // unknown type - probably blank - displayvalue = " "; - } - - return displayvalue; - }; - - // - // displayvalue = format_text_for_display(rawvalue, valuetype, valueformat, sheetobj, linkstyle) - // - - SocialCalc.format_text_for_display = function ( - rawvalue, - valuetype, - valueformat, - sheetobj, - linkstyle - ) { - var valueformat, valuesubtype, dvsc, dvue, textval; - var displayvalue; - - valuesubtype = valuetype.substring(1); - - displayvalue = rawvalue; - - if (valueformat == "none" || valueformat == null) valueformat = ""; - if (!/^(text-|custom|hidden)/.test(valueformat)) valueformat = ""; - if (valueformat == "" || valueformat == "General") { - // determine format from type - if (valuesubtype == "h") valueformat = "text-html"; - if (valuesubtype == "w" || valuesubtype == "r") valueformat = "text-wiki"; - if (valuesubtype == "l") valueformat = "text-link"; - if (!valuesubtype) valueformat = "text-plain"; - } - if (valueformat == "text-html") { - // HTML - output as it as is - } else if ( - SocialCalc.Callbacks.expand_wiki && - /^text-wiki/.test(valueformat) - ) { - // do general wiki markup - displayvalue = SocialCalc.Callbacks.expand_wiki( - displayvalue, - sheetobj, - linkstyle, - valueformat - ); - } else if (valueformat == "text-wiki") { - // Wiki-text - encode then output - displayvalue = SocialCalc.special_chars(displayvalue); - } else if (valueformat == "text-wiki") { - // wiki text - displayvalue = - (SocialCalc.Callbacks.expand_markup && - SocialCalc.Callbacks.expand_markup( - displayvalue, - sheetobj, - linkstyle - )) || // do old wiki markup - SocialCalc.special_chars(displayvalue); - } else if (valueformat == "text-url") { - // text is a URL for a link - dvsc = SocialCalc.special_chars(displayvalue); - dvue = encodeURI(displayvalue); - displayvalue = '' + dvsc + ""; - } else if (valueformat == "text-link") { - // more extensive link capabilities for regular web links - displayvalue = SocialCalc.expand_text_link( - displayvalue, - sheetobj, - linkstyle, - valueformat - ); - } else if (valueformat == "text-image") { - // text is a URL for an image - dvue = encodeURI(displayvalue); - displayvalue = ''; - } else if (valueformat.substring(0, 12) == "text-custom:") { - // construct a custom text format: @r = text raw, @s = special chars, @u = url encoded - dvsc = SocialCalc.special_chars(displayvalue); // do special chars - dvsc = dvsc.replace(/ /g, "  "); // keep multiple spaces - dvsc = dvsc.replace(/\n/g, "
"); // keep line breaks - dvue = encodeURI(displayvalue); - textval = {}; - textval.r = displayvalue; - textval.s = dvsc; - textval.u = dvue; - displayvalue = valueformat.substring(12); // remove "text-custom:" - displayvalue = displayvalue.replace(/@(r|s|u)/g, function (a, c) { - return textval[c]; - }); // replace placeholders - } else if (valueformat.substring(0, 6) == "custom") { - // custom - displayvalue = SocialCalc.special_chars(displayvalue); // do special chars - displayvalue = displayvalue.replace(/ /g, "  "); // keep multiple spaces - displayvalue = displayvalue.replace(/\n/g, "
"); // keep line breaks - displayvalue += " (custom format)"; - } else if (valueformat == "hidden") { - displayvalue = " "; - } else { - // plain text - displayvalue = SocialCalc.special_chars(displayvalue); // do special chars - displayvalue = displayvalue.replace(/ /g, "  "); // keep multiple spaces - displayvalue = displayvalue.replace(/\n/g, "
"); // keep line breaks - } - - return displayvalue; - }; - - // - // displayvalue = format_number_for_display(rawvalue, valuetype, valueformat) - // - - SocialCalc.format_number_for_display = function ( - rawvalue, - valuetype, - valueformat - ) { - var value, valuesubtype; - var scc = SocialCalc.Constants; - - value = rawvalue - 0; - - valuesubtype = valuetype.substring(1); - - if (valueformat == "Auto" || valueformat == "") { - // cases with default format - if (valuesubtype == "%") { - // will display a % character - valueformat = "#,##0.0%"; - } else if (valuesubtype == "$") { - valueformat = "[$]#,##0.00"; - } else if (valuesubtype == "dt") { - valueformat = scc.defaultFormatdt; - } else if (valuesubtype == "d") { - valueformat = scc.defaultFormatd; - } else if (valuesubtype == "t") { - valueformat = scc.defaultFormatt; - } else if (valuesubtype == "l") { - valueformat = "logical"; - } else { - valueformat = "General"; - } - } - - if (valueformat == "logical") { - // do logical format - return value ? scc.defaultDisplayTRUE : scc.defaultDisplayFALSE; - } - - if (valueformat == "hidden") { - // do hidden format - return " "; - } - - // Use format - - return SocialCalc.FormatNumber.formatNumberWithFormat( - rawvalue, - valueformat, - "" - ); - }; - - // - // valueinfo = DetermineValueType(rawvalue) - // - // Takes a value and looks for special formatting like $, %, numbers, etc. - // Returns the value as a number or string and the type as {value: value, type: type}. - // Tries to follow the spec for spreadsheet function VALUE(v). - // - - SocialCalc.DetermineValueType = function (rawvalue) { - var value = rawvalue + ""; - var type = "t"; - var tvalue, matches, year, hour, minute, second, denom, num, intgr, constr; - - tvalue = value.replace(/^\s+/, ""); // remove leading and trailing blanks - tvalue = tvalue.replace(/\s+$/, ""); - - if (value.length == 0) { - type = ""; - } else if (value.match(/^\s+$/)) { - // just blanks - // leave type "t" - } else if (tvalue.match(/^[-+]?\d*(?:\.)?\d*(?:[eE][-+]?\d+)?$/)) { - // general number, including E - value = tvalue - 0; // try converting to number - if (isNaN(value)) { - // leave alone - catches things like plain "-" - value = rawvalue + ""; - } else { - type = "n"; - } - } else if (tvalue.match(/^[-+]?\d*(?:\.)?\d*\s*%$/)) { - // percent form: 15.1% - value = (tvalue.slice(0, -1) - 0) / 100; // convert and scale - type = "n%"; - } else if ( - tvalue.match(/^[-+]?\$\s*\d*(?:\.)?\d*\s*$/) && - tvalue.match(/\d/) - ) { - // $ format: $1.49 - value = tvalue.replace(/\$/, "") - 0; - type = "n$"; - } else if (tvalue.match(/^[-+]?(\d*,\d*)+(?:\.)?\d*$/)) { - // number format ignoring commas: 1,234.49 - value = tvalue.replace(/,/g, "") - 0; - type = "n"; - } else if (tvalue.match(/^[-+]?(\d*,\d*)+(?:\.)?\d*\s*%$/)) { - // % with commas: 1,234.49% - value = (tvalue.replace(/[%,]/g, "") - 0) / 100; - type = "n%"; - } else if ( - tvalue.match(/^[-+]?\$\s*(\d*,\d*)+(?:\.)?\d*$/) && - tvalue.match(/\d/) - ) { - // $ and commas: $1,234.49 - value = tvalue.replace(/[\$,]/g, "") - 0; - type = "n$"; - } else if ( - (matches = value.match(/^(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{1,4})\s*$/)) - ) { - // MM/DD/YYYY, MM/DD/YYYY - year = matches[3] - 0; - year = year < 1000 ? year + 2000 : year; - value = - SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - year, - matches[1] - 0, - matches[2] - 0 - ) - 2415019; - type = "nd"; - } else if ( - (matches = value.match(/^(\d{4})[\/\-](\d{1,2})[\/\-](\d{1,2})\s*$/)) - ) { - // YYYY-MM-DD, YYYY/MM/DD - year = matches[1] - 0; - year = year < 1000 ? year + 2000 : year; - value = - SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - year, - matches[2] - 0, - matches[3] - 0 - ) - 2415019; - type = "nd"; - } else if ((matches = value.match(/^(\d{1,2}):(\d{1,2})\s*$/))) { - // HH:MM - hour = matches[1] - 0; - minute = matches[2] - 0; - if (hour < 24 && minute < 60) { - value = hour / 24 + minute / (24 * 60); - type = "nt"; - } - } else if ((matches = value.match(/^(\d{1,2}):(\d{1,2}):(\d{1,2})\s*$/))) { - // HH:MM:SS - hour = matches[1] - 0; - minute = matches[2] - 0; - second = matches[3] - 0; - if (hour < 24 && minute < 60 && second < 60) { - value = hour / 24 + minute / (24 * 60) + second / (24 * 60 * 60); - type = "nt"; - } - } else if ((matches = value.match(/^\s*([-+]?\d+) (\d+)\/(\d+)\s*$/))) { - // 1 1/2 - intgr = matches[1] - 0; - num = matches[2] - 0; - denom = matches[3] - 0; - if (denom && denom > 0) { - value = intgr + (intgr < 0 ? -num / denom : num / denom); - type = "n"; - } - } else if ((constr = SocialCalc.InputConstants[value.toUpperCase()])) { - // special constants, like "false" and #N/A - num = constr.indexOf(","); - value = constr.substring(0, num) - 0; - type = constr.substring(num + 1); - } else if ( - tvalue.length > 7 && - tvalue.substring(0, 7).toLowerCase() == "http://" - ) { - // URL - value = tvalue; - type = "tl"; - } - - return { value: value, type: type }; - }; - - SocialCalc.InputConstants = { - // strings that turn into constants for SocialCalc.DetermineValueType - TRUE: "1,nl", - FALSE: "0,nl", - "#N/A": "0,e#N/A", - "#NULL!": "0,e#NULL!", - "#NUM!": "0,e#NUM!", - "#DIV/0!": "0,e#DIV/0!", - "#VALUE!": "0,e#VALUE!", - "#REF!": "0,e#REF!", - "#NAME?": "0,e#NAME?", - }; - - // - // result = default_expand_markup(displayvalue, sheetobj, linkstyle) - // - // Processes wiki-text -- this is a placeholder. - // Reference to here in SocialCalc.expand_markup should be replaced by application-specific routine. - // - - SocialCalc.default_expand_markup = function ( - displayvalue, - sheetobj, - linkstyle - ) { - var result = displayvalue; - - result = SocialCalc.special_chars(result); // do special chars - result = result.replace(/ /g, "  "); // keep multiple spaces - result = result.replace(/\n/g, "
"); // keep line breaks - - return result; // do very little by default - - result = result.replace(/('*)'''(.*?)'''/g, "$1$2"); // Wiki-style bold/italics - result = result.replace(/''(.*?)''/g, "$1"); - - return result; - }; - - // - // result = SocialCalc.expand_text_link(displayvalue, sheetobj, linkstyle, valueformat) - // - // Parses link text (URL, descriptions, pagenames, workspace names) and returns HTML - // - - SocialCalc.expand_text_link = function ( - displayvalue, - sheetobj, - linkstyle, - valueformat - ) { - var desc, tb, str; - - var scc = SocialCalc.Constants; - - var url = ""; - var parts = SocialCalc.ParseCellLinkText(displayvalue + ""); - - if (parts.desc) { - desc = SocialCalc.special_chars(parts.desc); - } else { - desc = parts.pagename - ? scc.defaultPageLinkFormatString - : scc.defaultLinkFormatString; - } - - if ( - displayvalue.length > 7 && - displayvalue.substring(0, 7).toLowerCase() == "http://" && - displayvalue.charAt(displayvalue.length - 1) != ">" - ) { - desc = desc.substring(7); // remove http:// unless explicit - } - - tb = parts.newwin || !linkstyle ? ' target="_blank"' : ""; - - if (parts.pagename) { - if (SocialCalc.Callbacks.MakePageLink) { - url = SocialCalc.Callbacks.MakePageLink( - parts.pagename, - parts.workspacename, - linkstyle, - valueformat - ); - } - // else if (parts.workspace) { - // url = "/" + encodeURI(parts.workspace) + "/" + encodeURI(parts.pagename); - // } - // else { - // url = parts.pagename; - // } - } else { - url = encodeURI(parts.url); - } - str = '" + desc + ""; - - return str; - }; - - // - // result = SocialCalc.ParseCellLinkText(str) - // - // Given: url = http://www.someurl.com/more, desc = Some descriptive text - // - // Takes the following: - // - // url - // - // desc - // "desc" - // <<>> instead of <> => target="_blank" (new window) - // - // [page name] - // "desc"[page name] - // desc[page name] - // {workspace name [page name]} - // "desc"{workspace name [page name]} - // [[]] instead of [] => target="_blank" (new window) - // - // - // Returns: {url: url, desc: desc, newwin: t/f, pagename: pagename, workspace: workspace} - // - - SocialCalc.ParseCellLinkText = function (str) { - var result = { - url: "", - desc: "", - newwin: false, - pagename: "", - workspace: "", - }; - - var pageform = false; - var urlend = str.length - 1; - var descstart = 0; - var lastlt = str.lastIndexOf("<"); - var lastbrkt = str.lastIndexOf("["); - var lastbrace = str.lastIndexOf("{"); - var descend = -1; - - if ( - (str.charAt(urlend) != ">" || lastlt == -1) && - (str.charAt(urlend) != "]" || lastbrkt == -1) && - (str.charAt(urlend) != "}" || - str.charAt(urlend - 1) != "]" || - lastbrace == -1 || - lastbrkt == -1 || - lastbrkt < lastbrace) - ) { - // plain url - urlend++; - descend = urlend; - } else { - // some markup - if (str.charAt(urlend) == ">") { - // url form - descend = lastlt - 1; - if ( - lastlt > 0 && - str.charAt(descend) == "<" && - str.charAt(urlend - 1) == ">" - ) { - descend--; - urlend--; - result.newwin = true; - } - } else if (str.charAt(urlend) == "]") { - // plain page form - descend = lastbrkt - 1; - pageform = true; - if ( - lastbrkt > 0 && - str.charAt(descend) == "[" && - str.charAt(urlend - 1) == "]" - ) { - descend--; - urlend--; - result.newwin = true; - } - } else if (str.charAt(urlend) == "}") { - // page and workspace form - descend = lastbrace - 1; - pageform = true; - wsend = lastbrkt; - urlend--; - if ( - lastbrkt > 0 && - str.charAt(lastbrkt - 1) == "[" && - str.charAt(urlend - 1) == "]" - ) { - wsend = lastbrkt - 1; - urlend--; - result.newwin = true; - } - if (str.charAt(wsend - 1) == " ") { - // trim trailing space in workspace name - wsend--; - } - result.workspace = str.substring(lastbrace + 1, wsend) || ""; - } - - if (str.charAt(descend) == " ") { - // trim trailing space on desc - descend--; - } - - if (str.charAt(descstart) == '"' && str.charAt(descend) == '"') { - descstart++; - descend--; - } - } - - if (pageform) { - result.pagename = str.substring(lastbrkt + 1, urlend) || ""; - } else { - result.url = str.substring(lastlt + 1, urlend) || ""; - } - - if (descend >= descstart) { - result.desc = str.substring(descstart, descend + 1); - } - - return result; - }; - - // - // result = SocialCalc.ConvertSaveToOtherFormat(savestr, outputformat, dorecalc) - // - // Returns a string in the specificed format: "scsave", "html", "csv", "tab" (tab delimited) - // If dorecalc is true, performs a recalc after loading (NO: obsolete!). - // - - SocialCalc.ConvertSaveToOtherFormat = function ( - savestr, - outputformat, - dorecalc - ) { - var sheet, context, clipextents, div, ele, row, col, cr, cell, str; - - var result = ""; - - if (outputformat == "scsave") { - return savestr; - } - - if (savestr == "") { - return ""; - } - - sheet = new SocialCalc.Sheet(); - sheet.ParseSheetSave(savestr); - - if (dorecalc) { - // no longer supported as of 9/10/08 - // Recalc is now async, so can't do it this way - throw "SocialCalc.ConvertSaveToOtherFormat: Not doing recalc."; - } - - if (sheet.copiedfrom) { - clipextents = SocialCalc.ParseRange(sheet.copiedfrom); - } else { - clipextents = { - cr1: { row: 1, col: 1 }, - cr2: { row: sheet.attribs.lastrow, col: sheet.attribs.lastcol }, - }; - } - - if (outputformat == "html") { - context = new SocialCalc.RenderContext(sheet); - if (sheet.copiedfrom) { - context.rowpanes[0] = { - first: clipextents.cr1.row, - last: clipextents.cr2.row, - }; - context.colpanes[0] = { - first: clipextents.cr1.col, - last: clipextents.cr2.col, - }; - } - div = document.createElement("div"); - ele = context.RenderSheet(null, context.defaultHTMLlinkstyle); - div.appendChild(ele); - context = undefined; - sheet = undefined; - result = div.innerHTML; - ele = undefined; - div = undefined; - return result; - } - - for (row = clipextents.cr1.row; row <= clipextents.cr2.row; row++) { - for (col = clipextents.cr1.col; col <= clipextents.cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - - if (cell.errors) { - str = cell.errors; - } else { - str = cell.datavalue + ""; // get value as text - } - - if (outputformat == "csv") { - if (str.indexOf('"') != -1) { - str = str.replace(/"/g, '""'); // double quotes - } - if (/[, \n"]/.test(str)) { - str = '"' + str + '"'; // add quotes - } - if (col > clipextents.cr1.col) { - str = "," + str; // add commas - } - } else if (outputformat == "tab") { - if (str.indexOf("\n") != -1) { - // if multiple lines - if (str.indexOf('"') != -1) { - str = str.replace(/"/g, '""'); // double quotes - } - str = '"' + str + '"'; // add quotes - } - if (col > clipextents.cr1.col) { - str = "\t" + str; // add tabs - } - } - result += str; - } - result += "\n"; - } - - return result; - }; - - // - // result = SocialCalc.ConvertOtherFormatToSave(inputstr, inputformat) - // - // Returns a string converted from the specified format: "scsave", "csv", "tab" (tab delimited) - // - - SocialCalc.ConvertOtherFormatToSave = function (inputstr, inputformat) { - var sheet, - context, - lines, - i, - line, - value, - inquote, - j, - ch, - values, - row, - col, - cr, - maxc; - - var result = ""; - - var AddCell = function () { - col++; - if (col > maxc) maxc = col; - cr = SocialCalc.crToCoord(col, row); - SocialCalc.SetConvertedCell(sheet, cr, value); - value = ""; - }; - - if (inputformat == "scsave") { - return inputstr; - } - - sheet = new SocialCalc.Sheet(); - - lines = inputstr.split(/\r\n|\n/); - - maxc = 0; - if (inputformat == "csv") { - row = 0; - inquote = false; - for (i = 0; i < lines.length; i++) { - if (i == lines.length - 1 && lines[i] == "") { - // extra null line - ignore - break; - } - if (inquote) { - // if inquote, just continue from where left off - value += "\n"; - } else { - // otherwise next row - value = ""; - row++; - col = 0; - } - line = lines[i]; - for (j = 0; j < line.length; j++) { - ch = line.charAt(j); - if (ch == '"') { - if (inquote) { - if (j < line.length - 1 && line.charAt(j + 1) == '"') { - // double quotes - j++; // skip the second one - value += '"'; // add one quote - } else { - inquote = false; - if (j == line.length - 1) { - // at end of line - AddCell(); - } - } - } else { - inquote = true; - } - continue; - } - if (ch == "," && !inquote) { - AddCell(); - } else { - value += ch; - } - if (j == line.length - 1 && !inquote) { - AddCell(); - } - } - } - if (maxc > 0) { - sheet.attribs.lastrow = row; - sheet.attribs.lastcol = maxc; - result = sheet.CreateSheetSave("A1:" + SocialCalc.crToCoord(maxc, row)); - } - } - - if (inputformat == "tab") { - row = 0; - inquote = false; - for (i = 0; i < lines.length; i++) { - if (i == lines.length - 1 && lines[i] == "") { - // extra null line - ignore - break; - } - if (inquote) { - // if inquote, just continue from where left off - value += "\n"; - } else { - // otherwise next row - value = ""; - row++; - col = 0; - } - line = lines[i]; - for (j = 0; j < line.length; j++) { - ch = line.charAt(j); - if (ch == '"') { - if (inquote) { - if (j < line.length - 1) { - if (line.charAt(j + 1) == '"') { - // double quotes - j++; // skip the second one - value += '"'; // add one quote - } else if (line.charAt(j + 1) == "\t") { - // end of quoted item - j++; - inquote = false; - AddCell(); - } - } else { - // at end of line - inquote = false; - AddCell(); - } - continue; - } - if (value == "") { - // quote at start of item - inquote = true; - continue; - } - } - if (ch == "\t" && !inquote) { - AddCell(); - } else { - value += ch; - } - if (j == line.length - 1 && !inquote) { - AddCell(); - } - } - } - if (maxc > 0) { - sheet.attribs.lastrow = row; - sheet.attribs.lastcol = maxc; - result = sheet.CreateSheetSave("A1:" + SocialCalc.crToCoord(maxc, row)); - } - } - - return result; - }; - - // - // SocialCalc.SetConvertedCell(sheet, cr, rawvalue) - // - // Sets the cell cr with a value and type determined from rawvalue - // - - SocialCalc.SetConvertedCell = function (sheet, cr, rawvalue) { - var cell, value; - - cell = sheet.GetAssuredCell(cr); - - value = SocialCalc.DetermineValueType(rawvalue); - - if (value.type == "n" && value.value == rawvalue) { - // check that we don't need "constant" to remember original value - cell.datatype = "v"; - cell.valuetype = "n"; - cell.datavalue = value.value; - } else if (value.type.charAt(0) == "t") { - // text of some sort but left unchanged - cell.datatype = "t"; - cell.valuetype = value.type; - cell.datavalue = value.value; - } else { - // special number types - cell.datatype = "c"; - cell.valuetype = value.type; - cell.datavalue = value.value; - cell.formula = rawvalue; - } - }; - - // - // socialcalctouch adds touch gestures to SocialCalc - // - // As a start, touch gestures are modeled similar to - // mouse events - // - // Author: Ramu Ramamurthy - // - // - // - - // - // - // To initialize, SocialCalc.CreateTableEditor must call - // SocialCalc.TouchRegister(editor.toplevel, {Swipe: SocialCalc.EditorProcessSwipe, editor: editor}); - // Also, any element create inside the grid needs to be touch registered for it to work - // this includes buttons, etc - // - // TestCases: - // 1) tap to point to cell, and to move edit-cell - // 2) double-tap on a cell to open edit-box, then tap on edit box to pullup keyboard - // -- when editing, tap on any other cell to be done with edit - // *** figure out escape to cancel edit versus return to accept edit - // -- when editing, and if = seen than tapping on cell puts the cell name into the edit box - // 3) tap on input box on top opens edit on cell - // tap on any cell accepts and finishes this edit - // *** need a way to cancel the edit versus accept the edit - // - // 4) tap on a cell and move finger starts a range - // removing finger completes the range - // tap on cell cancels range - // - // 5) a swipe action scrolls the sheet - // swipe up/dn scrolls up/dn - // swipe lt/rt scrolls lt/rt - // - // - // Wishlist: - // 1) smooth scroll will be nice (in addition to swipe) -- using a two-touch pan ? - // - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - - // ************************************* - // - // Touch functions: - // - // ************************************* - - SocialCalc.HasTouch = false; - - (function () { - // platform specific registration - var agent = navigator.userAgent.toLowerCase(); - - if ( - agent.indexOf("iphone") >= 0 || - agent.indexOf("ipad") >= 0 || - agent.indexOf("android") >= 0 - ) { - SocialCalc.HasTouch = true; - } - })(); - - SocialCalc.TouchInfo = { - // In sequence the following will be implemented - // swipe up/dn, left/right will scroll up/dn/left/right respectively - // - // touch on a cell will move ecell to that cell - // repeated touch on a cell will start edit on that cell - // touch on another cell will cancel edit if it was in progress (?) - // etc - // - // touch on buttons will activate the buttons - // - // The registeredElements array is used to identify items. - - // One item for each element to respond to the touch, each an object with: - // .element, .functionobj - - registeredElements: [], - - // for swipe - threshold_x: 20, - threshold_y: 20, - - orig_coord_x: 0, - orig_coord_y: 0, - final_coord_x: 0, - final_coord_y: 0, - - px_to_rows: 20, // 20 pixels is 1 row scroll - px_to_cols: 20, // 20 pixels is 1 col scroll - - touch_start: 0, - ranging: false, - ranging_threshold: 100, - move_start: 0, - - last_touch: 0, - timeout_handle: null, - doubletap_threshold: 500, // max milliseconds between taps - }; - - // - // TouchRegister(element, functionobj) - make element respond to touch - // - - SocialCalc.TouchRegister = function (element, functionobj) { - if (!SocialCalc.HasTouch) { - return; - } - - var touchinfo = SocialCalc.TouchInfo; - - if (SocialCalc.LookupElement(element, touchinfo.registeredElements)) { - // already registered - return; - } - - touchinfo.registeredElements.push({ - element: element, - functionobj: functionobj, - }); - - if (SocialCalc.HasTouch && element.addEventListener) { - // Webkit based (?) - element.addEventListener( - "touchstart", - SocialCalc.ProcessTouchStart, - false - ); - element.addEventListener("touchmove", SocialCalc.ProcessTouchMove, false); - element.addEventListener("touchend", SocialCalc.ProcessTouchEnd, false); - element.addEventListener( - "touchcancel", - SocialCalc.ProcessTouchCancel, - false - ); - // element.addEventListener("orientationchange", SocialCalc.ProcessOrientationChange, false); - } - }; - - SocialCalc.FindTouchElement = function (event) { - var touchinfo = SocialCalc.TouchInfo; - - var event = event || window.event; - - var ele = event.target || event.srcElement; // investigate - - for (var wobj = null; !wobj && ele; ele = ele.parentNode) { - // investigate - wobj = SocialCalc.LookupElement(ele, touchinfo.registeredElements); - } - - return wobj; - }; - - SocialCalc.ProcessTouchStart = function (event) { - var touchinfo = SocialCalc.TouchInfo; - touchinfo.orig_coord_x = event.targetTouches[0].pageX; - touchinfo.orig_coord_y = event.targetTouches[0].pageY; - - touchinfo.final_coord_x = touchinfo.orig_coord_x; - touchinfo.final_coord_y = touchinfo.orig_coord_y; - - touchinfo.touch_start = new Date().getTime(); - - event.preventDefault(); - }; - - SocialCalc.TouchGetSimulatedMouseEvent = function (event, mouse_evt_name) { - var touches = event.changedTouches; - var first = touches[0]; - var simulatedEvent = document.createEvent("MouseEvent"); - simulatedEvent.initMouseEvent( - mouse_evt_name, - true, - true, - window, - 1, - first.screenX, - first.screenY, - first.clientX, - first.clientY, - false, - false, - false, - false, - 0, - null - ); - return simulatedEvent; - }; - - SocialCalc.ProcessTouchMove = function (event) { - var touchinfo = SocialCalc.TouchInfo; - touchinfo.final_coord_x = event.targetTouches[0].pageX; - touchinfo.final_coord_y = event.targetTouches[0].pageY; - - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) return; // not one of our elements - - if (touchinfo.move_start == 0) { - touchinfo.move_start = new Date().getTime(); - if ( - touchinfo.move_start - touchinfo.touch_start > - touchinfo.ranging_threshold - ) { - // This is a delayed move - // send a mouse down event - // This is for ranging and dragging - - touchinfo.ranging = true; - var mouseDn = SocialCalc.TouchGetSimulatedMouseEvent( - event, - "mousedown" - ); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDn); - } - } else if (touchinfo.ranging) { - // already ranging - // send a mouse move event - - var mouseMv = SocialCalc.TouchGetSimulatedMouseEvent(event, "mousemove"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseMv); - } - - event.preventDefault(); - }; - - SocialCalc.ProcessTouchEnd = function (e) { - var touchinfo = SocialCalc.TouchInfo; - - var changeX = touchinfo.orig_coord_x - touchinfo.final_coord_x; - var changeY = touchinfo.orig_coord_y - touchinfo.final_coord_y; - - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) return; // not one of our elements - - var event = e || window.event; - - touchinfo.move_start = 0; - touchinfo.touch_start = 0; - - if (touchinfo.ranging) { - // in ranging, and dragging - // send a mouseup event - touchinfo.ranging = false; - var mouseUp = SocialCalc.TouchGetSimulatedMouseEvent(event, "mouseup"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseUp); - } else if ( - Math.abs(changeY) > touchinfo.threshold_y || - Math.abs(changeX) > touchinfo.threshold_x - ) { - // check for swipe - - var amount_y = Math.floor(changeY / touchinfo.px_to_rows); - var amount_x = Math.floor(changeX / touchinfo.px_to_cols); - if (wobj.functionobj && wobj.functionobj.Swipe) { - wobj.functionobj.Swipe(event, touchinfo, wobj, amount_y, amount_x); - } - } else { - // detect a double tap - var now = new Date().getTime(); - var lasttouch = touchinfo.last_touch || now + 1; - var delta = now - lasttouch; - if (touchinfo.timeout_handle) { - clearTimeout(touchinfo.timeout_handle); - touchinfo.timeout_handle = null; - } - - if (delta < touchinfo.doubletap_threshold && delta > 0) { - // doubletap seen - if (wobj.functionobj && wobj.functionobj.DoubleTap) { - wobj.functionobj.DoubleTap(event, touchinfo, wobj); - } - } else { - // this is a single tap - touchinfo.last_touch = now; - var timeoutFn = function () { - if (wobj.functionobj && wobj.functionobj.SingleTap) { - wobj.functionobj.SingleTap(event, touchinfo, wobj); - } - }; - touchinfo.timeout_handle = setTimeout( - timeoutFn(), - touchinfo.doubletap_threshold - ); - } - touchinfo.last_touch = now; - } - e.preventDefault(); - }; - - SocialCalc.ProcessTouchCancel = function (event) { - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) { - return; // do default behavior - } - - var touchinfo = SocialCalc.TouchInfo; - touchinfo.orig_coord_x = 0; - touchinfo.orig_coord_y = 0; - touchinfo.final_coord_x = 0; - touchinfo.final_coord_y = 0; - touchinfo.move_start = 0; - touchinfo.touch_start = 0; - touchinfo.ranging = false; - }; - - SocialCalc.EditorProcessSwipe = function ( - event, - touchinfo, - wobj, - swipevert, - swipehoriz - ) { - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - - if (wobj.functionobj.editor.state != "start") { - return; // ignore if cell being edited - } - - if (swipevert != 0 || swipehoriz != 0) { - //wobj.functionobj.editor.ScrollRelativeBoth(swipevert,swipehoriz); - wobj.functionobj.editor.ScrollRelativeBoth(swipevert, 0); //ignore horiz swipes entirely - } - }; - - SocialCalc.EditorProcessSingleTap = function (event, touchinfo, wobj) { - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - - // send mouse down - var mouseDn = SocialCalc.TouchGetSimulatedMouseEvent(event, "mousedown"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDn); - - // then send mouse up - var mouseUp = SocialCalc.TouchGetSimulatedMouseEvent(event, "mouseup"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseUp); - }; - - SocialCalc.EditorProcessDoubleTap = function (event, touchinfo, wobj) { - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - // simulate a mouse double click - var mouseDblClick = SocialCalc.TouchGetSimulatedMouseEvent( - event, - "dblclick" - ); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDblClick); - }; - - SocialCalc.ProcessOrientationChange = function (event) { - console.log("orientation change"); - //var height = $(window).height(); - //var width = $(window).width(); - - //console.log("width="+width+",height="+height) - - // $(window).trigger( "orientationchange.htmlclass" ); - // spreadsheet.DoOnResize(); - }; - - // - // SocialCalcTableEditor - // - /* - // The code module of the SocialCalc package that displays a scrolling grid with panes - // and handles keyboard and mouse I/O. - // - // (c) Copyright 2008, 2009, 2010 Socialtext, Inc. - // All Rights Reserved. - // - */ - - /* - - LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - - EXHIBIT A. Common Public Attribution License Version 1.0. - - The contents of this file are subject to the Common Public Attribution License Version 1.0 (the - "License"); you may not use this file except in compliance with the License. You may obtain a copy - of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but - Sections 14 and 15 have been added to cover use of software over a computer network and provide for - limited attribution for the Original Developer. In addition, Exhibit A has been modified to be - consistent with Exhibit B. - - Software distributed under the License 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 Original Code is SocialCalc JavaScript TableEditor. - - The Original Developer is the Initial Developer. - - The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by - Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - - Contributor: Dan Bricklin. - - - EXHIBIT B. Attribution Information - - When the TableEditor is producing and/or controlling the display the Graphic Image must be - displayed on the screen visible to the user in a manner comparable to that in the - Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for - that image. The image must be linked to the Attribution URL so as to access that page - when clicked. If the user interface includes a prominent "about" display which includes - factual prominent attribution in a form similar to that in the "about" display included - with the Original Code, including Socialtext copyright notices and URLs, then the image - need not be linked to the Attribution URL but the "tool-tip" is still required. - - Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - - Attribution Phrase (not exceeding 10 words): SocialCalc - - Attribution URL: http://www.socialcalc.org/xoattrib - - Graphic Image: The contents of the sc-logo.gif file in the Original Code or - a suitable replacement from http://www.socialcalc.org/licenses specified as - being for SocialCalc. - - Display of Attribution Information is required in Larger Works which are defined - in the CPAL as a work which combines Covered Code or portions thereof with code - not governed by the terms of the CPAL. - - */ - - // - // Some of the other files in the SocialCalc package are licensed under - // different licenses. Please note the licenses of the modules you use. - // - // Code History: - // - // 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. - // All Rights Reserved. - // Portions (c) Copyright 2007 Socialtext, Inc. - // All Rights Reserved. - // The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. - // wikiCalc 1.0 was written by Software Garden, Inc. - // Unless otherwise specified, referring to "SocialCalc" in comments refers to this - // JavaScript version of the code, not the SocialCalc Perl code. - // - - /* - - See the comments in the main SocialCalc code module file of the SocialCalc package. - - */ - - var SocialCalc; - if (!SocialCalc) { - // created here, too, in case load order is wrong, but main routines are required - SocialCalc = {}; - } - - // ************************************* - // - // Table Editor class: - // - // ************************************* - - // Constructor: - - SocialCalc.TableEditor = function (context) { - var scc = SocialCalc.Constants; - - // Properties: - - this.context = context; // editing context - this.toplevel = null; // top level HTML element for this table editor - this.fullgrid = null; // rendered editing context - - this.noEdit = false; // if true, disable all edit UI and make read-only - - this.width = null; - this.tablewidth = null; - this.height = null; - this.tableheight = null; - - this.inputBox = null; - this.inputEcho = null; - this.verticaltablecontrol = null; - this.horizontaltablecontrol = null; - - this.logo = null; - - this.cellhandles = null; - - // Dynamic properties: - - this.timeout = null; // if non-null, timer id for position calculations - this.busy = false; // true when executing command, calculating, etc. - this.ensureecell = false; // if true, ensure ecell is visible after timeout - this.deferredCommands = []; // commands to execute after busy, in form: {cmdstr: "cmds", saveundo: t/f} - - this.gridposition = null; // screen coords of full grid - this.headposition = null; // screen coords of upper left of grid within header rows - this.firstscrollingrow = null; // row number of top row in last (the scrolling) pane - this.firstscrollingrowtop = null; // position of top row in last (the scrolling) pane - this.lastnonscrollingrow = null; // row number of last displayed row in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblerow = null; // used for paging down - this.firstscrollingcol = null; // column number of top col in last (the scrolling) pane - this.firstscrollingcolleft = null; // position of top col in last (the scrolling) pane - this.lastnonscrollingcol = null; // col number of last displayed column in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblecol = null; // used for paging right - - this.rowpositions = []; // screen positions of the top of some rows - this.colpositions = []; // screen positions of the left side of some rows - this.rowheight = []; // size in pixels of each row when last checked, or null/undefined, for page up - this.colwidth = []; // size in pixels of each column when last checked, or null/undefined, for page left - - this.ecell = null; // either null or {coord: c, row: r, col: c} - this.state = "start"; // the keyboard states: see EditorProcessKey - - this.workingvalues = {}; // values used during keyboard editing, etc. - - // Constants: - - this.imageprefix = scc.defaultImagePrefix; // URL prefix for images (e.g., "/www/assets/images/sc") - this.idPrefix = scc.defaultTableEditorIDPrefix; - this.pageUpDnAmount = scc.defaultPageUpDnAmount; // number of rows to move cursor on PgUp/PgDn keys (numeric) - - // Callbacks - - // recalcFunction: if present, function(editor) {...}, called to do a recalc - // Default (sheet.RecalcSheet) does all the right stuff. - - this.recalcFunction = function (editor) { - if (editor.context.sheetobj.RecalcSheet) { - editor.context.sheetobj.RecalcSheet( - SocialCalc.EditorSheetStatusCallback, - editor - ); - } else return null; - }; - - // ctrlkeyFunction: if present, function(editor, charname) {...}, called to handle ctrl-V, etc., at top level - // Returns true (pass through for continued processing) or false (stop processing this key). - - this.ctrlkeyFunction = function (editor, charname) { - var ta, ha, cell, position, cmd, sel, cliptext; - - switch (charname) { - case "[ctrl-c]": - case "[ctrl-x]": - ta = editor.pasteTextarea; - ta.value = ""; - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = position.left - 1 + "px"; - ta.style.top = position.top - 1 + "px"; - } - if (editor.range.hasrange) { - sel = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - sel = editor.ecell.coord; - } - - // get what to copy to clipboard - cliptext = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), - "tab" - ); - - if ( - charname == "[ctrl-c]" || - editor.noEdit || - (SocialCalc.Callbacks.IsCellEditable && - !SocialCalc.Callbacks.IsCellEditable(editor)) - ) { - // if copy or cut but in no edit - cmd = "copy " + sel + " formulas"; - } else { - // [ctrl-x] - cmd = "cut " + sel + " formulas"; - } - editor.EditorScheduleSheetCommands(cmd, true, false); // queue up command to put on SocialCalc clipboard - - /* Copy as HTML: This fails rather badly as it won't paste into Notepad as tab-delimited text. Oh well. - -ha = editor.pasteHTMLarea; -if (editor.range.hasrange) { -cell = SocialCalc.GetEditorCellElement(editor, editor.range.top, editor.range.left); -} -else { -cell = SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); -} -if (cell) position = SocialCalc.GetElementPosition(cell.element); - -if (ha) { -if (position) { -ha.style.left = (position.left-1)+"px"; -ha.style.top = (position.top-1)+"px"; -} -ha.style.visibility="visible"; -cliptext = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), "html"); -ha.innerHTML = cliptext.replace(/]*>[\d\D]*?<\/tr\b[^>]*>/i, ''); -ha.focus(); - -var range = document.body.createControlRange(); -range.addElement(ha.childNodes[0]); -range.select(); -} -*/ - ta.style.display = "block"; - ta.value = cliptext; // must follow "block" setting for Webkit - ta.focus(); - ta.select(); - window.setTimeout(function () { - if (!SocialCalc.GetSpreadsheetControlObject) return; // in case not loaded - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - /* -var ha = editor.pasteHTMLarea; -if (ha) { -ha.blur(); -ha.innerHTML = ''; -ha.style.visibility = 'hidden'; -} -*/ - var ta = editor.pasteTextarea; - ta.blur(); - ta.style.display = "none"; - SocialCalc.KeyboardFocus(); - }, 200); - - return true; - - case "[ctrl-v]": - if (editor.noEdit) return true; // not if no edit - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - var showPasteTextArea = function () { - ta = editor.pasteTextarea; - ta.value = ""; - - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = position.left - 1 + "px"; - ta.style.top = position.top - 1 + "px"; - } - ta.style.display = "block"; - ta.value = ""; // must follow "block" setting for Webkit - ta.focus(); - }; - - ha = editor.pasteHTMLarea; - if (ha) { - /* Pasting via HTML - Currently IE only */ - ha.style.visibility = "visible"; - ha.focus(); - } else { - showPasteTextArea(); - } - window.setTimeout(function () { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var value = null; - var isPasteSameAsClipboard = false; - - ha = editor.pasteHTMLarea; - if (ha) { - /* IE: We append a U+FFFC to every TD that's not the last of its row, - * then we obtain innerText, then turn U+FFFC back to \t, - * thereby preserving the cell separations (which gets discarded - * if we simply paste via textarea. - */ - var _ObjectReplacementCharacter_ = String.fromCharCode(0xfffc); - var html = ha.innerHTML; - - if (html.search(/<(?![Bb][Rr])[A-Za-z]/) >= 0) { - /* HTML Paste: Mark TDs with U+FFFC accordingly.. */ - ha.innerHTML = html.replace( - /(?:<\/[Tt][Dd]>)/g, - _ObjectReplacementCharacter_ - ); - } else { - /* Text Paste: In IE, \t is transformed into  , so replace them with U+FFFC. */ - ha.innerHTML = html.replace( - /&[Nn][Bb][Ss][Pp];/g, - _ObjectReplacementCharacter_ - ); - } - - value = ha.innerText.replace( - new RegExp(_ObjectReplacementCharacter_, "g"), - "\t" - ); - - ha.innerHTML = ""; - ha.blur(); - ha.style.visibility = "hidden"; - } else { - var ta = editor.pasteTextarea; - value = ta.value; - ta.blur(); - ta.style.display = "none"; - } - - value = value.replace(/\r\n/g, "\n").replace(/\n?$/, "\n"); - var clipstr = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.Clipboard.clipboard, - "tab" - ); - if ( - value == clipstr || - (value.length - clipstr.length == 1 && - value.substring(0, value.length - 1) == clipstr) - ) { - isPasteSameAsClipboard = true; - } - - var cmd = ""; - // pastes SocialCalc clipboard if did a Ctrl-C and contents still the same - // Webkit adds an extra blank line, so need to allow for that - if (!isPasteSameAsClipboard) { - cmd = - "loadclipboard " + - SocialCalc.encodeForSave( - SocialCalc.ConvertOtherFormatToSave(value, "tab") - ) + - "\n"; - } - var cr; - if (editor.range.hasrange) { - cr = SocialCalc.crToCoord(editor.range.left, editor.range.top); - } else { - cr = editor.ecell.coord; - } - cmd += "paste " + cr + " formulas"; - editor.EditorScheduleSheetCommands(cmd, true, false); - SocialCalc.KeyboardFocus(); - }, 200); - return true; - - case "[ctrl-z]": - editor.EditorScheduleSheetCommands("undo", true, false); - return false; - - case "[ctrl-s]": // !!!! temporary hack - window.setTimeout(function () { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var sheet = editor.context.sheetobj; - var cell = sheet.GetAssuredCell(editor.ecell.coord); - var ntvf = cell.nontextvalueformat - ? sheet.valueformats[cell.nontextvalueformat - 0] || "" - : ""; - var newntvf = window.prompt( - "Advanced Feature:\n\nCustom Numeric Format or Command", - ntvf - ); - if (newntvf != null) { - // not cancelled - if (newntvf.match(/^cmd:/)) { - cmd = newntvf.substring(4); // execute as command - } else if (newntvf.match(/^edit:/)) { - cmd = newntvf.substring(5); // execute as command - if (SocialCalc.CtrlSEditor) { - SocialCalc.CtrlSEditor(cmd); - } - return; - } else { - if (editor.range.hasrange) { - sel = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord( - editor.range.right, - editor.range.bottom - ); - } else { - sel = editor.ecell.coord; - } - cmd = "set " + sel + " nontextvalueformat " + newntvf; - } - editor.EditorScheduleSheetCommands(cmd, true, false); - } - }, 200); - return false; - - default: - break; - } - return true; - }; - - // Set sheet's status callback: - - context.sheetobj.statuscallback = SocialCalc.EditorSheetStatusCallback; - context.sheetobj.statuscallbackparams = this; // this object: the table editor object - - // StatusCallback: all values are called at appropriate times, add with unique name, delete when done - // - // Each value must be an object in the form of: - // - // func: function(editor, status, arg, params) {...}, - // params: params value to call func with - // - // The values for status and arg are: - // - // all the SocialCalc RecalcSheet statuscallbacks, including: - // - // calccheckdone, calclist length - // calcorder, {coord: coord, total: celllist length, count: count} - // calcstep, {coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds - // - // the command callbacks, like cmdstart and cmdend - // cmdendnorender - // - // calcstart, null - // moveecell, new ecell coord - // rangechange, "coord:coord" or "coord" or "" - // specialkey, keyname ("[esc]") - // - - this.StatusCallback = {}; - - this.MoveECellCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.RangeChangeCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.SettingsCallbacks = {}; // See SocialCalc.SaveEditorSettings - - // Set initial cursor - - this.ecell = { coord: "A1", row: 1, col: 1 }; - context.highlights[this.ecell.coord] = "cursor"; - - // Initialize range data - // Range has at least hasrange (true/false). - // It may also have: anchorcoord, anchorrow, anchorcol, top, bottom, left, and right. - - this.range = { hasrange: false }; - - // Initialize range2 data (used to show selections, such as for move) - // Range2 has at least hasrange (true/false). - // It may also have: top, bottom, left, and right. - - this.range2 = { hasrange: false }; - }; - - // Methods: - - SocialCalc.TableEditor.prototype.CreateTableEditor = function ( - width, - height - ) { - return SocialCalc.CreateTableEditor(this, width, height); - }; - SocialCalc.TableEditor.prototype.ResizeTableEditor = function ( - width, - height - ) { - return SocialCalc.ResizeTableEditor(this, width, height); - }; - - SocialCalc.TableEditor.prototype.SaveEditorSettings = function () { - return SocialCalc.SaveEditorSettings(this); - }; - SocialCalc.TableEditor.prototype.LoadEditorSettings = function (str, flags) { - return SocialCalc.LoadEditorSettings(this, str, flags); - }; - - SocialCalc.TableEditor.prototype.EditorRenderSheet = function () { - SocialCalc.EditorRenderSheet(this); - }; - SocialCalc.TableEditor.prototype.EditorScheduleSheetCommands = function ( - cmdstr, - saveundo, - ignorebusy - ) { - SocialCalc.EditorScheduleSheetCommands(this, cmdstr, saveundo, ignorebusy); - }; - SocialCalc.TableEditor.prototype.ScheduleSheetCommands = function ( - cmdstr, - saveundo - ) { - this.context.sheetobj.ScheduleSheetCommands(cmdstr, saveundo); - }; - SocialCalc.TableEditor.prototype.SheetUndo = function () { - this.context.sheetobj.SheetUndo(); - }; - SocialCalc.TableEditor.prototype.SheetRedo = function () { - this.context.sheetobj.SheetRedo(); - }; - SocialCalc.TableEditor.prototype.EditorStepSet = function (status, arg) { - SocialCalc.EditorStepSet(this, status, arg); - }; - SocialCalc.TableEditor.prototype.GetStatuslineString = function ( - status, - arg, - params - ) { - return SocialCalc.EditorGetStatuslineString(this, status, arg, params); - }; - - SocialCalc.TableEditor.prototype.EditorMouseRegister = function () { - return SocialCalc.EditorMouseRegister(this); - }; - SocialCalc.TableEditor.prototype.EditorMouseUnregister = function () { - return SocialCalc.EditorMouseUnregister(this); - }; - SocialCalc.TableEditor.prototype.EditorMouseRange = function (coord) { - return SocialCalc.EditorMouseRange(this, coord); - }; - - SocialCalc.TableEditor.prototype.EditorProcessKey = function (ch, e) { - return SocialCalc.EditorProcessKey(this, ch, e); - }; - SocialCalc.TableEditor.prototype.EditorAddToInput = function (str, prefix) { - return SocialCalc.EditorAddToInput(this, str, prefix); - }; - SocialCalc.TableEditor.prototype.DisplayCellContents = function () { - return SocialCalc.EditorDisplayCellContents(this); - }; - SocialCalc.TableEditor.prototype.EditorSaveEdit = function (text) { - return SocialCalc.EditorSaveEdit(this, text); - }; - SocialCalc.TableEditor.prototype.EditorApplySetCommandsToRange = function ( - cmdline, - type - ) { - return SocialCalc.EditorApplySetCommandsToRange(this, cmdline, type); - }; - - SocialCalc.TableEditor.prototype.MoveECellWithKey = function (ch) { - return SocialCalc.MoveECellWithKey(this, ch); - }; - SocialCalc.TableEditor.prototype.MoveECell = function (newcell) { - return SocialCalc.MoveECell(this, newcell); - }; - SocialCalc.TableEditor.prototype.ReplaceCell = function (cell, row, col) { - SocialCalc.ReplaceCell(this, cell, row, col); - }; - SocialCalc.TableEditor.prototype.UpdateCellCSS = function (cell, row, col) { - SocialCalc.UpdateCellCSS(this, cell, row, col); - }; - SocialCalc.TableEditor.prototype.SetECellHeaders = function (selected) { - SocialCalc.SetECellHeaders(this, selected); - }; - SocialCalc.TableEditor.prototype.EnsureECellVisible = function () { - SocialCalc.EnsureECellVisible(this); - }; - SocialCalc.TableEditor.prototype.RangeAnchor = function (coord) { - SocialCalc.RangeAnchor(this, coord); - }; - SocialCalc.TableEditor.prototype.RangeExtend = function (coord) { - SocialCalc.RangeExtend(this, coord); - }; - SocialCalc.TableEditor.prototype.RangeRemove = function () { - SocialCalc.RangeRemove(this); - }; - SocialCalc.TableEditor.prototype.Range2Remove = function () { - SocialCalc.Range2Remove(this); - }; - - SocialCalc.TableEditor.prototype.FitToEditTable = function () { - SocialCalc.FitToEditTable(this); - }; - SocialCalc.TableEditor.prototype.CalculateEditorPositions = function () { - SocialCalc.CalculateEditorPositions(this); - }; - SocialCalc.TableEditor.prototype.ScheduleRender = function () { - SocialCalc.ScheduleRender(this); - }; - SocialCalc.TableEditor.prototype.DoRenderStep = function () { - SocialCalc.DoRenderStep(this); - }; - SocialCalc.TableEditor.prototype.SchedulePositionCalculations = function () { - SocialCalc.SchedulePositionCalculations(this); - }; - SocialCalc.TableEditor.prototype.DoPositionCalculations = function () { - SocialCalc.DoPositionCalculations(this); - }; - SocialCalc.TableEditor.prototype.CalculateRowPositions = function ( - panenum, - positions, - sizes - ) { - return SocialCalc.CalculateRowPositions(this, panenum, positions, sizes); - }; - SocialCalc.TableEditor.prototype.CalculateColPositions = function ( - panenum, - positions, - sizes - ) { - return SocialCalc.CalculateColPositions(this, panenum, positions, sizes); - }; - - SocialCalc.TableEditor.prototype.ScrollRelative = function ( - vertical, - amount - ) { - SocialCalc.ScrollRelative(this, vertical, amount); - }; - SocialCalc.TableEditor.prototype.ScrollRelativeBoth = function ( - vamount, - hamount - ) { - SocialCalc.ScrollRelativeBoth(this, vamount, hamount); - }; - SocialCalc.TableEditor.prototype.PageRelative = function ( - vertical, - direction - ) { - SocialCalc.PageRelative(this, vertical, direction); - }; - SocialCalc.TableEditor.prototype.LimitLastPanes = function () { - SocialCalc.LimitLastPanes(this); - }; - - SocialCalc.TableEditor.prototype.ScrollTableUpOneRow = function () { - return SocialCalc.ScrollTableUpOneRow(this); - }; - SocialCalc.TableEditor.prototype.ScrollTableDownOneRow = function () { - return SocialCalc.ScrollTableDownOneRow(this); - }; - SocialCalc.TableEditor.prototype.ScrollTableLeftOneCol = function () { - return SocialCalc.ScrollTableLeftOneCol(this); - }; - SocialCalc.TableEditor.prototype.ScrollTableRightOneCol = function () { - return SocialCalc.ScrollTableRightOneCol(this); - }; - - //contact prototype - SocialCalc.TableEditor.prototype.EditorChangecontact = function ( - text, - name, - phone, - email, - street, - city, - company, - val - ) { - return SocialCalc.EditorChangecontact( - this, - text, - name, - phone, - email, - street, - city, - company, - val - ); - }; - SocialCalc.TableEditor.prototype.EditorChangecolorFromWidget = function ( - text - ) { - return SocialCalc.EditorChangecolorFromWidget(this, text); - }; - SocialCalc.TableEditor.prototype.EditorChangeSheetcolor = function (text) { - return SocialCalc.EditorChangeSheetcolor(this, text); - }; - - SocialCalc.TableEditor.prototype.EditorChangefontFromWidget = function ( - text - ) { - return SocialCalc.EditorChangefontFromWidget(this, text); - }; - SocialCalc.TableEditor.prototype.EditorChangeSheetfont = function (text) { - return SocialCalc.EditorChangeSheetfont(this, text); - }; - SocialCalc.TableEditor.prototype.EditorCut = function (text, no_of_cells) { - return SocialCalc.EditorCut(this, text, no_of_cells); - }; - SocialCalc.TableEditor.prototype.EditorClearSheet = function ( - text, - cell_to_clear - ) { - return SocialCalc.EditorClearSheet(this, text, cell_to_clear); - }; - - // Functions: - - SocialCalc.CreateTableEditor = function (editor, width, height) { - var scc = SocialCalc.Constants; - var AssignID = SocialCalc.AssignID; - - editor.toplevel = document.createElement("div"); - editor.width = width; - editor.height = height; - - editor.griddiv = document.createElement("div"); - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width = editor.tablewidth + "px"; - editor.griddiv.style.height = editor.tableheight + "px"; - editor.griddiv.style.overflow = "hidden"; - editor.griddiv.style.cursor = "default"; - if (scc.cteGriddivClass) editor.griddiv.className = scc.cteGriddivClass; - AssignID(editor, editor.griddiv, "griddiv"); - - editor.FitToEditTable(); - - editor.EditorRenderSheet(); - - editor.griddiv.appendChild(editor.fullgrid); - - editor.verticaltablecontrol = new SocialCalc.TableControl( - editor, - true, - editor.tableheight - ); - editor.verticaltablecontrol.CreateTableControl(); - AssignID(editor, editor.verticaltablecontrol.main, "tablecontrolv"); - - editor.horizontaltablecontrol = new SocialCalc.TableControl( - editor, - false, - editor.tablewidth - ); - editor.horizontaltablecontrol.CreateTableControl(); - AssignID(editor, editor.horizontaltablecontrol.main, "tablecontrolh"); - - var table, tbody, tr, td, img, anchor, ta, ha; - - table = document.createElement("table"); - editor.layouttable = table; - table.cellSpacing = 0; - table.cellPadding = 0; - AssignID(editor, table, "layouttable"); - - tbody = document.createElement("tbody"); - table.appendChild(tbody); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - td.appendChild(editor.griddiv); - tr.appendChild(td); - td = document.createElement("td"); - //td.appendChild(editor.verticaltablecontrol.main); - tr.appendChild(td); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - //td.appendChild(editor.horizontaltablecontrol.main); - tr.appendChild(td); - - td = document.createElement("td"); // logo display: Required by CPAL License for this code! - //td.style.background="url("+editor.imageprefix+"logo.gif) no-repeat center center"; - td.innerHTML = - "
"; - tr.appendChild(td); - editor.logo = td; - AssignID(editor, editor.logo, "logo"); - SocialCalc.TooltipRegister(td.firstChild.firstChild, "SocialCalc", null); - - editor.toplevel.appendChild(editor.layouttable); - - if (!editor.noEdit) { - editor.inputEcho = new SocialCalc.InputEcho(editor); - AssignID(editor, editor.inputEcho.main, "inputecho"); - } - - editor.cellhandles = new SocialCalc.CellHandles(editor); - - ta = document.createElement("textarea"); // used for ctrl-c/ctrl-v where an invisible text area is needed - SocialCalc.setStyles( - ta, - "display:none;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);" - ); - ta.value = ""; - editor.pasteTextarea = ta; - AssignID(editor, editor.pasteTextarea, "pastetextarea"); - - if ( - navigator.userAgent.match(/Safari\//) && - !navigator.userAgent.match(/Chrome\//) - ) { - // special code for Safari 5 change - window.removeEventListener( - "beforepaste", - SocialCalc.SafariPasteFunction, - false - ); - window.addEventListener( - "beforepaste", - SocialCalc.SafariPasteFunction, - false - ); - window.removeEventListener( - "beforecopy", - SocialCalc.SafariPasteFunction, - false - ); - window.addEventListener( - "beforecopy", - SocialCalc.SafariPasteFunction, - false - ); - window.removeEventListener( - "beforecut", - SocialCalc.SafariPasteFunction, - false - ); - window.addEventListener( - "beforecut", - SocialCalc.SafariPasteFunction, - false - ); - } - - editor.toplevel.appendChild(editor.pasteTextarea); - - var div = document.createElement("div"); - div.innerHTML = "
"; - if (div.firstChild.nodeType == 1) { - /* We are running in IE -- Using HTML-based area for Ctrl-V */ - ha = document.createElement("div"); // used for ctrl-v where an invisible html area is needed - editor.pasteHTMLarea = ha; - editor.toplevel.appendChild(editor.pasteHTMLarea); - ha.contentEditable = true; - AssignID(editor, editor.pasteHTMLarea, "pastehtmlarea"); - SocialCalc.setStyles( - ha, - "display:block;visibility:hidden;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);overflow:hidden" - ); - } - - SocialCalc.MouseWheelRegister(editor.toplevel, { - WheelMove: SocialCalc.EditorProcessMouseWheel, - editor: editor, - }); - - if (SocialCalc.HasTouch) { - SocialCalc.TouchRegister(editor.toplevel, { - Swipe: SocialCalc.EditorProcessSwipe, - DoubleTap: SocialCalc.EditorProcessDoubleTap, - SingleTap: SocialCalc.EditorProcessSingleTap, - editor: editor, - }); - } - - if (editor.inputBox) { - // this seems to fix an obscure bug with Firefox 2 Mac where Ctrl-V doesn't get fired right - if (editor.inputBox.element) { - editor.inputBox.element.focus(); - editor.inputBox.element.blur(); - } - } - SocialCalc.KeyboardSetFocus(editor); - - // do status reporting things - - SocialCalc.EditorSheetStatusCallback(null, "startup", null, editor); - - // done - - return editor.toplevel; - }; - - // Special code needed for change that occurred with Safari 5 that made paste not work for some reason - - SocialCalc.SafariPasteFunction = function (e) { - e.preventDefault(); - }; - - // - // SocialCalc.ResizeTableEditor(editor, width, height) - // - // Move things around as appropriate and resize - // - - SocialCalc.ResizeTableEditor = function (editor, width, height) { - var scc = SocialCalc.Constants; - - editor.width = width; - editor.height = height; - - editor.toplevel.style.width = width + "px"; - editor.toplevel.style.height = height + "px"; - - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width = editor.tablewidth + "px"; - editor.griddiv.style.height = editor.tableheight + "px"; - - editor.verticaltablecontrol.main.style.height = editor.tableheight + "px"; - editor.horizontaltablecontrol.main.style.width = editor.tablewidth + "px"; - - editor.FitToEditTable(); - - editor.ScheduleRender(); - - return; - }; - - // - // str = SaveEditorSettings(editor) - // - // Returns a string representation of the pane settings, etc. - // - // The format is: - // - // version:1.0 - // rowpane:panenumber:firstnum:lastnum - // colpane:panenumber:firstnum:lastnum - // ecell:coord -- if set - // range:anchorcoord:top:bottom:left:right -- if set - // - // You can add additional values to be saved by using editor.SettingsCallbacks: - // - // editor.SettingsCallbacks["item-name"] = {save: savefunction, load: loadfunction} - // - // where savefunction(editor, "item-name") returns a string with the new lines to be added to the saved settings - // which include the trailing newlines, and loadfunction(editor, "item-name", line, flags) is given the line to process - // without the trailing newlines. - // - - SocialCalc.SaveEditorSettings = function (editor) { - var i, setting; - var context = editor.context; - var range = editor.range; - var result = ""; - - result += "version:1.0\n"; - - for (i = 0; i < context.rowpanes.length; i++) { - result += - "rowpane:" + - i + - ":" + - context.rowpanes[i].first + - ":" + - context.rowpanes[i].last + - "\n"; - } - for (i = 0; i < context.colpanes.length; i++) { - result += - "colpane:" + - i + - ":" + - context.colpanes[i].first + - ":" + - context.colpanes[i].last + - "\n"; - } - - if (editor.ecell) { - result += "ecell:" + editor.ecell.coord + "\n"; - } - - if (range.hasrange) { - result += - "range:" + - range.anchorcoord + - ":" + - range.top + - ":" + - range.bottom + - ":" + - range.left + - ":" + - range.right + - "\n"; - } - - for (setting in editor.SettingsCallbacks) { - result += editor.SettingsCallbacks[setting].save(editor, setting); - } - - return result; - }; - - // - // LoadEditorSettings(editor, str, flags) - // - // Sets the editor settings based on str. See SocialCalc.SaveEditorSettings for more details. - // Unrecognized lines are ignored. - // - - SocialCalc.LoadEditorSettings = function (editor, str, flags) { - var lines = str.split(/\r\n|\n/); - var parts = []; - var line, i, cr, row, col, coord, setting; - var context = editor.context; - var highlights, range; - - context.rowpanes = [{ first: 1, last: 1 }]; // reset to start - context.colpanes = [{ first: 1, last: 1 }]; - editor.ecell = null; - editor.range = { hasrange: false }; - editor.range2 = { hasrange: false }; - range = editor.range; - context.highlights = {}; - highlights = context.highlights; - - for (i = 0; i < lines.length; i++) { - line = lines[i]; - parts = line.split(":"); - setting = parts[0]; - switch (setting) { - case "version": - break; - - case "rowpane": - context.rowpanes[parts[1] - 0] = { - first: parts[2] - 0, - last: parts[3] - 0, - }; - break; - - case "colpane": - context.colpanes[parts[1] - 0] = { - first: parts[2] - 0, - last: parts[3] - 0, - }; - break; - - case "ecell": - editor.ecell = SocialCalc.coordToCr(parts[1]); - editor.ecell.coord = parts[1]; - highlights[parts[1]] = "cursor"; - break; - - case "range": - range.hasrange = true; - range.anchorcoord = parts[1]; - cr = SocialCalc.coordToCr(range.anchorcoord); - range.anchorrow = cr.row; - range.anchorcol = cr.col; - range.top = parts[2] - 0; - range.bottom = parts[3] - 0; - range.left = parts[4] - 0; - range.right = parts[5] - 0; - for (row = range.top; row <= range.bottom; row++) { - for (col = range.left; col <= range.right; col++) { - coord = SocialCalc.crToCoord(col, row); - if (highlights[coord] != "cursor") { - highlights[coord] = "range"; - } - } - } - break; - - default: - if (editor.SettingsCallbacks[setting]) { - editor.SettingsCallbacks[setting].load( - editor, - setting, - line, - flags - ); - } - break; - } - } - - return; - }; - - // - // EditorRenderSheet(editor) - // - // Renders the sheet and updates editor.fullgrid. - // Sets event handlers. - // - - SocialCalc.EditorRenderSheet = function (editor) { - editor.EditorMouseUnregister(); - - editor.fullgrid = editor.context.RenderSheet(editor.fullgrid); - - if (editor.ecell) editor.SetECellHeaders("selected"); - - SocialCalc.AssignID(editor, editor.fullgrid, "fullgrid"); // give it an id - - editor.EditorMouseRegister(); - }; - - // - // EditorScheduleSheetCommands(editor, cmdstr, saveundo, ignorebusy) - // - - SocialCalc.EditorScheduleSheetCommands = function ( - editor, - cmdstr, - saveundo, - ignorebusy - ) { - if (editor.state != "start" && !ignorebusy) { - // ignore commands if editing a cell - return; - } - - if (editor.busy && !ignorebusy) { - // hold off on commands if doing one - editor.deferredCommands.push({ cmdstr: cmdstr, saveundo: saveundo }); - return; - } - - switch (cmdstr) { - case "recalc": - case "redisplay": - editor.context.sheetobj.ScheduleSheetCommands(cmdstr, false); - break; - - case "undo": - editor.SheetUndo(); - break; - - case "redo": - editor.SheetRedo(); - break; - - default: - editor.context.sheetobj.ScheduleSheetCommands(cmdstr, saveundo); - break; - } - }; - - // - // EditorSheetStatusCallback(recalcdata, status, arg, editor) - // - // Called during recalc, executing commands, etc. - // - - SocialCalc.EditorSheetStatusCallback = function ( - recalcdata, - status, - arg, - editor - ) { - var f, cell, dcmd; - var sheetobj = editor.context.sheetobj; - var cr; - - var signalstatus = function (s) { - for (f in editor.StatusCallback) { - if (editor.StatusCallback[f].func) { - editor.StatusCallback[f].func( - editor, - s, - arg, - editor.StatusCallback[f].params - ); - } - } - }; - - switch (status) { - case "startup": - break; - - case "cmdstart": - editor.busy = true; - sheetobj.celldisplayneeded = ""; - break; - - case "cmdextension": - break; - - case "cmdend": - signalstatus(status); - - if (sheetobj.changedrendervalues) { - editor.context.PrecomputeSheetFontsAndLayouts(); - editor.context.CalculateCellSkipData(); - sheetobj.changedrendervalues = false; - } - - if (sheetobj.celldisplayneeded && !sheetobj.renderneeded) { - cr = SocialCalc.coordToCr(sheetobj.celldisplayneeded); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.ReplaceCell(cell, cr.row, cr.col); - } - - if (editor.deferredCommands.length) { - dcmd = editor.deferredCommands.shift(); - editor.EditorScheduleSheetCommands(dcmd.cmdstr, dcmd.saveundo, true); - return; - } - - if ( - sheetobj.attribs.needsrecalc && - (sheetobj.attribs.recalc != "off" || sheetobj.recalconce) && - editor.recalcFunction - ) { - editor.FitToEditTable(); - sheetobj.renderneeded = false; // recalc will force a render - if (sheetobj.recalconce) delete sheetobj.recalconce; // only do once - editor.recalcFunction(editor); - } else { - if (sheetobj.renderneeded) { - editor.FitToEditTable(); - sheetobj.renderneeded = false; - editor.ScheduleRender(); - } else { - editor.SchedulePositionCalculations(); // just in case command changed positions - // editor.busy = false; - // signalstatus("cmdendnorender"); - } - } - return; - - case "calcstart": - editor.busy = true; - break; - - case "calccheckdone": - case "calcorder": - case "calcstep": - case "calcloading": - case "calcserverfunc": - break; - - case "calcfinished": - signalstatus(status); - editor.ScheduleRender(); - return; - - case "schedrender": - editor.busy = true; // in case got here without cmd or recalc - break; - - case "renderdone": - break; - - case "schedposcalc": - editor.busy = true; // in case got here without cmd or recalc - break; - - case "doneposcalc": - if (editor.deferredCommands.length) { - signalstatus(status); - dcmd = editor.deferredCommands.shift(); - editor.EditorScheduleSheetCommands(dcmd.cmdstr, dcmd.saveundo, true); - } else { - editor.busy = false; - signalstatus(status); - if (editor.state == "start") editor.DisplayCellContents(); // make sure up to date - } - return; - - default: - addmsg("Unknown status: " + status); - break; - } - - signalstatus(status); - - return; - }; - - // Timer-driven steps for use with SocialCalc.EditorSheetStatusCallback - - SocialCalc.EditorStepInfo = { - // status: "", // saved value to pass to callback - editor: null, // for callback - // arg: null, // for callback - // timerobj: null - }; - - /* - SocialCalc.EditorStepSet = function(editor, status, arg) { - var esi = SocialCalc.EditorStepInfo; - addmsg("step: "+status); - if (esi.timerobj) { - alert("Already waiting. Old/new: "+esi.status+"/"+status); - } - esi.editor = editor; - esi.status = status; - esi.timerobj = window.setTimeout(SocialCalc.EditorStepDone, 1); - } - - SocialCalc.EditorStepDone = function() { - var esi = SocialCalc.EditorStepInfo; - esi.timerobj = null; - SocialCalc.EditorSheetStatusCallback(null, esi.status, null, esi.editor); - } - */ - - // - // str = SocialCalc.EditorGetStatuslineString(editor, status, arg, params) - // - // Assumes params is an object where it can use "calculating" and "command" - // to keep track of state. - // Returns string for status line. - // - - SocialCalc.EditorGetStatuslineString = function ( - editor, - status, - arg, - params - ) { - var scc = SocialCalc.Constants; - - var sstr, progress, coord, circ, r, c, cell, sum, ele; - - progress = ""; - - switch (status) { - case "moveecell": - case "rangechange": - case "startup": - break; - case "cmdstart": - params.command = true; - document.body.style.cursor = "progress"; - editor.griddiv.style.cursor = "progress"; - progress = scc.s_statusline_executing; - break; - case "cmdextension": - progress = "Command Extension: " + arg; - break; - case "cmdend": - params.command = false; - break; - case "schedrender": - progress = scc.s_statusline_displaying; - break; - case "renderdone": - progress = " "; - break; - case "schedposcalc": - progress = scc.s_statusline_displaying; - break; - case "cmdendnorender": - case "doneposcalc": - document.body.style.cursor = "default"; - editor.griddiv.style.cursor = "default"; - break; - case "calcorder": - progress = - scc.s_statusline_ordering + - Math.floor((100 * arg.count) / (arg.total || 1)) + - "%"; - break; - case "calcstep": - progress = - scc.s_statusline_calculating + - Math.floor((100 * arg.count) / (arg.total || 1)) + - "%"; - break; - case "calcloading": - progress = scc.s_statusline_calculatingls + ": " + arg.sheetname; - break; - case "calcserverfunc": - progress = - scc.s_statusline_calculating + - Math.floor((100 * arg.count) / (arg.total || 1)) + - "%, " + - scc.s_statusline_doingserverfunc + - arg.funcname + - scc.s_statusline_incell + - arg.coord; - break; - case "calcstart": - params.calculating = true; - document.body.style.cursor = "progress"; - editor.griddiv.style.cursor = "progress"; // griddiv has an explicit cursor style - progress = scc.s_statusline_calcstart; - break; - case "calccheckdone": - break; - case "calcfinished": - params.calculating = false; - break; - default: - progress = status; - break; - } - - if (!progress && params.calculating) { - progress = scc.s_statusline_calculating; - } - - // if there is a range, calculate sum (not during busy times) - if ( - !params.calculating && - !params.command && - !progress && - editor.range.hasrange && - (editor.range.left != editor.range.right || - editor.range.top != editor.range.bottom) - ) { - sum = 0; - for (r = editor.range.top; r <= editor.range.bottom; r++) { - for (c = editor.range.left; c <= editor.range.right; c++) { - cell = editor.context.sheetobj.cells[SocialCalc.crToCoord(c, r)]; - if (!cell) continue; - if (cell.valuetype && cell.valuetype.charAt(0) == "n") { - sum += cell.datavalue - 0; - } - } - } - - sum = SocialCalc.FormatNumber.formatNumberWithFormat( - sum, - "[,]General", - "" - ); - - coord = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - progress = - coord + - " (" + - (editor.range.right - editor.range.left + 1) + - "x" + - (editor.range.bottom - editor.range.top + 1) + - ") " + - scc.s_statusline_sum + - "=" + - sum + - " " + - progress; - } - sstr = editor.ecell.coord + "   " + progress; - - if ( - !params.calculating && - editor.context.sheetobj.attribs.needsrecalc == "yes" - ) { - sstr += "   " + scc.s_statusline_recalcneeded; - } - - circ = editor.context.sheetobj.attribs.circularreferencecell; - if (circ) { - circ = circ.replace(/\|/, " referenced by "); - sstr += "   " + scc.s_statusline_circref + circ + "
"; - } - - return sstr; - }; - - // - // Mouse stuff - // - - SocialCalc.EditorMouseInfo = { - // The registeredElements array is used to identify editor grid in which the mouse is doing things. - - // One item for each active editor, each an object with: - // .element, .editor - - registeredElements: [], - - editor: null, // editor being processed (between mousedown and mouseup) - element: null, // element being processed - - ignore: false, // if true, mousedowns are ignored - - mousedowncoord: "", // coord where mouse went down for drag range - mouselastcoord: "", // coord where mouse last was during drag - mouseresizecol: "", // col being resized - mouseresizeclientx: null, // where resize started - mouseresizedisplay: null, // element tracking new size - }; - - // - // EditorMouseRegister(editor) - // - - SocialCalc.EditorMouseRegister = function (editor) { - var mouseinfo = SocialCalc.EditorMouseInfo; - var element = editor.fullgrid; - var i; - - for (i = 0; i < mouseinfo.registeredElements.length; i++) { - if (mouseinfo.registeredElements[i].editor == editor) { - if (mouseinfo.registeredElements[i].element == element) { - return; // already set - don't do it again - } - break; - } - } - - if (i < mouseinfo.registeredElements.length) { - mouseinfo.registeredElements[i].element = element; - } else { - mouseinfo.registeredElements.push({ element: element, editor: editor }); - } - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener( - "mousedown", - SocialCalc.ProcessEditorMouseDown, - false - ); - element.addEventListener( - "dblclick", - SocialCalc.ProcessEditorDblClick, - false - ); - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousedown", SocialCalc.ProcessEditorMouseDown); - element.attachEvent("ondblclick", SocialCalc.ProcessEditorDblClick); - } else { - // don't handle this - throw "Browser not supported"; - } - - mouseinfo.ignore = false; // just in case - - return; - }; - - // - // EditorMouseUnregister(editor) - // - - SocialCalc.EditorMouseUnregister = function (editor) { - var mouseinfo = SocialCalc.EditorMouseInfo; - var element = editor.fullgrid; - var i, oldelement; - - for (i = 0; i < mouseinfo.registeredElements.length; i++) { - if (mouseinfo.registeredElements[i].editor == editor) { - break; - } - } - - if (i < mouseinfo.registeredElements.length) { - oldelement = mouseinfo.registeredElements[i].element; // remove old handlers - if (oldelement.removeEventListener) { - // DOM Level 2 - oldelement.removeEventListener( - "mousedown", - SocialCalc.ProcessEditorMouseDown, - false - ); - oldelement.removeEventListener( - "dblclick", - SocialCalc.ProcessEditorDblClick, - false - ); - } else if (oldelement.detachEvent) { - // IE - oldelement.detachEvent( - "onmousedown", - SocialCalc.ProcessEditorMouseDown - ); - oldelement.detachEvent("ondblclick", SocialCalc.ProcessEditorDblClick); - } - mouseinfo.registeredElements.splice(i, 1); - } - - return; - }; - - SocialCalc.ProcessEditorMouseDown = function (e) { - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var mobj; - - if (mouseinfo.ignore) return; // ignore this - - for (mobj = null; !mobj && ele; ele = ele.parentNode) { - // go up tree looking for one of our elements - mobj = SocialCalc.LookupElement(ele, mouseinfo.registeredElements); - } - if (!mobj) { - mouseinfo.editor = null; - return; // not one of our elements - } - - editor = mobj.editor; - mouseinfo.element = ele; - range = editor.range; - result = SocialCalc.GridMousePosition(editor, clientX, clientY); - - if (!result || result.rowheader) return; // not on a cell or col header - mouseinfo.editor = editor; // remember for later - - if (result.colheader && result.coltoresize) { - // col header - do drag resize - SocialCalc.ProcessEditorColsizeMouseDown(e, ele, result); - return; - } - - if (!result.coord) return; // not us - - if (!range.hasrange) { - if (e.shiftKey) editor.RangeAnchor(); - } - - SocialCalc.Callbacks.ToggleCell(result.coord); - coord = editor.MoveECell(result.coord); - - if (range.hasrange) { - if (e.shiftKey) editor.RangeExtend(); - else editor.RangeRemove(); - } - - mouseinfo.mousedowncoord = coord; // remember if starting drag range select - mouseinfo.mouselastcoord = coord; - - editor.EditorMouseRange(coord); - - SocialCalc.KeyboardSetFocus(editor); - if (editor.state != "start" && editor.inputBox) - editor.inputBox.element.focus(); - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.ProcessEditorMouseMove, - true - ); // capture everywhere - document.addEventListener( - "mouseup", - SocialCalc.ProcessEditorMouseUp, - true - ); // capture everywhere - } else if (ele.attachEvent) { - // IE 5+ - ele.setCapture(); - ele.attachEvent("onmousemove", SocialCalc.ProcessEditorMouseMove); - ele.attachEvent("onmouseup", SocialCalc.ProcessEditorMouseUp); - ele.attachEvent("onlosecapture", SocialCalc.ProcessEditorMouseUp); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.EditorMouseRange = function (editor, coord) { - var inputtext, wval; - var range = editor.range; - - switch ( - editor.state // editing a cell - shouldn't get here if no inputBox - ) { - case "input": - inputtext = editor.inputBox.GetText(); - wval = editor.workingvalues; - if ( - ("(+-*/,:!&<>=^".indexOf(inputtext.slice(-1)) >= 0 && - inputtext.slice(0, 1) == "=") || - inputtext == "=" - ) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { - // if in pointing operation - if (coord) { - if (range.hasrange) { - var sheetpref = - wval.currentsheet == wval.startsheet - ? "" - : wval.currentsheet + "!"; - editor.inputBox.SetText( - wval.partialexpr + - sheetpref + - SocialCalc.crToCoord(range.left, range.top) + - ":" + - sheetpref + - SocialCalc.crToCoord(range.right, range.bottom) - ); - } else { - var sheetpref = - wval.currentsheet == wval.startsheet - ? "" - : wval.currentsheet + "!"; - editor.inputBox.SetText(wval.partialexpr + sheetpref + coord); - } - } - } else { - // not in point -- done editing - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - } - break; - - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - break; - } - }; - - SocialCalc.ProcessEditorMouseMove = function (e) { - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat(editor, result); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - if (result.coord != mouseinfo.mouselastcoord) { - if (!e.shiftKey && !editor.range.hasrange) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - } - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - mouseinfo.mouselastcoord = result.coord; - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.ProcessEditorMouseUp = function (e) { - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result) return; - - if (!result.coord) result.coord = editor.ecell.coord; - - if (editor.range.hasrange) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } else if (result.coord && result.coord != mouseinfo.mousedowncoord) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener( - "mousemove", - SocialCalc.ProcessEditorMouseMove, - true - ); - document.removeEventListener( - "mouseup", - SocialCalc.ProcessEditorMouseUp, - true - ); - } else if (element.detachEvent) { - // IE - element.detachEvent("onlosecapture", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmouseup", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmousemove", SocialCalc.ProcessEditorMouseMove); - element.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - }; - - SocialCalc.ProcessEditorColsizeMouseDown = function (e, ele, result) { - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - mouseinfo.mouseresizecolnum = result.coltoresize; // remember col being resized - mouseinfo.mouseresizecol = SocialCalc.rcColname(result.coltoresize); - mouseinfo.mousedownclientx = clientX; - - var sizedisplay = document.createElement("div"); - mouseinfo.mouseresizedisplay = sizedisplay; - sizedisplay.style.width = "auto"; - sizedisplay.style.position = "absolute"; - sizedisplay.style.zIndex = 100; - sizedisplay.style.top = editor.headposition.top + 0 + "px"; - sizedisplay.style.left = editor.colpositions[result.coltoresize] + "px"; - sizedisplay.innerHTML = - '' + - '
 
' + - editor.context.colwidth[mouseinfo.mouseresizecolnum] + - "
"; - SocialCalc.setStyles( - sizedisplay.firstChild.lastChild.firstChild.childNodes[0], - "filter:alpha(opacity=85);opacity:.85;" - ); // so no warning msg with Firefox about filter - - editor.toplevel.appendChild(sizedisplay); - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.ProcessEditorColsizeMouseMove, - true - ); // capture everywhere - document.addEventListener( - "mouseup", - SocialCalc.ProcessEditorColsizeMouseUp, - true - ); // capture everywhere - } else if (editor.toplevel.attachEvent) { - // IE 5+ - editor.toplevel.setCapture(); - editor.toplevel.attachEvent( - "onmousemove", - SocialCalc.ProcessEditorColsizeMouseMove - ); - editor.toplevel.attachEvent( - "onmouseup", - SocialCalc.ProcessEditorColsizeMouseUp - ); - editor.toplevel.attachEvent( - "onlosecapture", - SocialCalc.ProcessEditorColsizeMouseUp - ); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.ProcessEditorColsizeMouseMove = function (e) { - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - var newsize = - editor.context.colwidth[mouseinfo.mouseresizecolnum] - - 0 + - (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) - newsize = SocialCalc.Constants.defaultMinimumColWidth; - - var sizedisplay = mouseinfo.mouseresizedisplay; - // sizedisplay.firstChild.lastChild.firstChild.childNodes[1].firstChild.innerHTML = newsize+""; - // sizedisplay.firstChild.lastChild.firstChild.childNodes[0].firstChild.style.width = (newsize-2)+"px"; - sizedisplay.innerHTML = - '' + - '
 
' + - newsize + - "
"; - SocialCalc.setStyles( - sizedisplay.firstChild.lastChild.firstChild.childNodes[0], - "filter:alpha(opacity=85);opacity:.85;" - ); // so no warning msg with Firefox about filter - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.ProcessEditorColsizeMouseUp = function (e) { - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - element = mouseinfo.element; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener( - "mousemove", - SocialCalc.ProcessEditorColsizeMouseMove, - true - ); - document.removeEventListener( - "mouseup", - SocialCalc.ProcessEditorColsizeMouseUp, - true - ); - } else if (editor.toplevel.detachEvent) { - // IE - editor.toplevel.detachEvent( - "onlosecapture", - SocialCalc.ProcessEditorColsizeMouseUp - ); - editor.toplevel.detachEvent( - "onmouseup", - SocialCalc.ProcessEditorColsizeMouseUp - ); - editor.toplevel.detachEvent( - "onmousemove", - SocialCalc.ProcessEditorColsizeMouseMove - ); - editor.toplevel.releaseCapture(); - } - - var newsize = - editor.context.colwidth[mouseinfo.mouseresizecolnum] - - 0 + - (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) - newsize = SocialCalc.Constants.defaultMinimumColWidth; - - editor.EditorScheduleSheetCommands( - "set " + mouseinfo.mouseresizecol + " width " + newsize, - true, - false - ); - - if (editor.timeout) window.clearTimeout(editor.timeout); - editor.timeout = window.setTimeout(SocialCalc.FinishColsize, 1); // wait - Firefox 2 has a bug otherwise with next mousedown - - return false; - }; - - SocialCalc.FinishColsize = function () { - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; - - editor.toplevel.removeChild(mouseinfo.mouseresizedisplay); - mouseinfo.mouseresizedisplay = null; - - // editor.FitToEditTable(); - // editor.EditorRenderSheet(); - // editor.SchedulePositionCalculations(); - - mouseinfo.editor = null; - - return; - }; - - // - // Handle auto-repeat of dragging the cursor into the borders of the sheet - // - - SocialCalc.AutoRepeatInfo = { - timer: null, // timer object for repeating - mouseinfo: null, // result from SocialCalc.GridMousePosition - repeatinterval: 1000, // milliseconds to wait between repeats - editor: null, // editor object to use when it repeats - repeatcallback: null, // used instead of default when repeating (e.g., for cellhandles) - // called as: repeatcallback(newcoord, direction) - }; - - // Control auto-repeat. If mouseinfo==null, cancel. - - SocialCalc.SetDragAutoRepeat = function (editor, mouseinfo, callback) { - var repeatinfo = SocialCalc.AutoRepeatInfo; - var coord, direction; - - repeatinfo.repeatcallback = callback; // null in regular case - - if (!mouseinfo) { - // cancel - if (repeatinfo.timer) { - // If was repeating, stop - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - repeatinfo.mouseinfo = null; - return; // done - } - - repeatinfo.editor = editor; - - if (repeatinfo.mouseinfo) { - // check for change while repeating - if (mouseinfo.rowheader || mouseinfo.rowfooter) { - if (mouseinfo.row != repeatinfo.mouseinfo.row) { - // changed row while dragging sidewards - coord = SocialCalc.crToCoord(editor.ecell.col, mouseinfo.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } else { - editor.MoveECell(coord); - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } else if (mouseinfo.colheader || mouseinfo.colfooter) { - if (mouseinfo.col != repeatinfo.mouseinfo.col) { - // changed col while dragging vertically - coord = SocialCalc.crToCoord(mouseinfo.col, editor.ecell.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } else { - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } - } - - repeatinfo.mouseinfo = mouseinfo; - - if (mouseinfo.distance < 5) repeatinfo.repeatinterval = 333; - else if (mouseinfo.distance < 10) repeatinfo.repeatinterval = 250; - else if (mouseinfo.distance < 25) repeatinfo.repeatinterval = 100; - else if (mouseinfo.distance < 35) repeatinfo.repeatinterval = 75; - else { - // too far - stop repeating - if (repeatinfo.timer) { - // if repeating, cancel it - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - return; - } - - if (!repeatinfo.timer) { - // start if not already running - repeatinfo.timer = window.setTimeout( - SocialCalc.DragAutoRepeat, - repeatinfo.repeatinterval - ); - } - - return; - }; - - // - // DragAutoRepeat() - // - - SocialCalc.DragAutoRepeat = function () { - var repeatinfo = SocialCalc.AutoRepeatInfo; - var mouseinfo = repeatinfo.mouseinfo; - - var direction, coord, cr; - - if (mouseinfo.rowheader) direction = "left"; - else if (mouseinfo.rowfooter) direction = "right"; - else if (mouseinfo.colheader) direction = "up"; - else if (mouseinfo.colfooter) direction = "down"; - - if (repeatinfo.repeatcallback) { - cr = SocialCalc.coordToCr(repeatinfo.editor.ecell.coord); - if (direction == "left" && cr.col > 1) cr.col--; - else if (direction == "right") cr.col++; - else if (direction == "up" && cr.row > 1) cr.row--; - else if (direction == "down") cr.row++; - coord = SocialCalc.crToCoord(cr.col, cr.row); - repeatinfo.repeatcallback(coord, direction); - } else { - coord = repeatinfo.editor.MoveECellWithKey("[a" + direction + "]shifted"); - if (coord) repeatinfo.editor.EditorMouseRange(coord); - } - - repeatinfo.timer = window.setTimeout( - SocialCalc.DragAutoRepeat, - repeatinfo.repeatinterval - ); - }; - - // - // Handling Clicking - // - - SocialCalc.ProcessEditorDblClick = function (e) { - var editor, result, coord, textarea, wval, range, sheetobj; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var mobj; - - if (mouseinfo.ignore) return; // ignore this - - for (mobj = null; !mobj && ele; ele = ele.parentNode) { - // go up tree looking for one of our elements - mobj = SocialCalc.LookupElement(ele, mouseinfo.registeredElements); - } - if (!mobj) { - mouseinfo.editor = null; - return; // not one of our elements - } - - editor = mobj.editor; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); - if (!result || !result.coord) return; // not within cell area - ignore - - mouseinfo.editor = editor; // remember for later - mouseinfo.element = ele; - range = editor.range; - - sheetobj = editor.context.sheetobj; - - switch (editor.state) { - case "start": - SocialCalc.EditorOpenCellEdit(editor); - break; - - case "input": - break; - - default: - break; - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.EditorOpenCellEdit = function (editor) { - var wval; - - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no input box, so no editing (happens on noEdit) - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - if (editor.inputBox.element.disabled) return true; // multi-line: ignore - if (editor.inputBox.element.style.display == "none") { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "editecell", - null, - editor.StatusCallback[f].params - ); - } - return true; // no inputBox display, so no editing - } - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - - editor.state = "inputboxdirect"; - - editor.inputBox.SetText(""); - editor.inputBox.DisplayCellContents(); - editor.inputBox.Select("end"); - wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - - return; - }; - - SocialCalc.EditorProcessKey = function (editor, ch, e) { - var result, cell, cellobj, valueinfo, fch, coord, inputtext, f; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - var range = editor.range; - - if (typeof ch != "string") ch = ""; - - switch (editor.state) { - case "start": - if (e.shiftKey && ch.substr(0, 2) == "[a") { - ch = ch + "shifted"; - } - if (ch == "[enter]") ch = "[adown]"; - if (ch == "[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if ( - ch.substr(0, 2) == "[a" || - ch.substr(0, 3) == "[pg" || - ch == "[home]" - ) { - result = editor.MoveECellWithKey(ch); - return !result; - } - if (ch == "[del]" || ch == "[backspace]") { - if (!editor.noEdit) { - editor.EditorApplySetCommandsToRange("empty", ""); - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - break; - } - if (ch == "[esc]") { - if (range.hasrange) { - editor.RangeRemove(); - editor.MoveECell(range.anchorcoord); - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "specialkey", - ch, - editor.StatusCallback[f].params - ); - } - } - return false; - } - - if (ch == "[f2]") { - if (editor.noEdit) return true; - SocialCalc.EditorOpenCellEdit(editor); - return false; - } - - if ((ch.length > 1 && ch.substr(0, 1) == "[") || ch.length == 0) { - // some control key - if (editor.ctrlkeyFunction && ch.length > 0) { - return editor.ctrlkeyFunction(editor, ch); - } else { - return true; - } - } - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no inputBox so no editing - if (editor.inputBox.element.style.display == "none") { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "editecell", - ch, - editor.StatusCallback[f].params - ); - } - return true; // no inputBox display, so no editing - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - editor.inputBox.element.disabled = false; // make sure editable - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - editor.inputBox.SetText(ch); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (editor.inputBox.skipOne) return false; // ignore a key already handled - if ( - ch == "[esc]" || - ch == "[enter]" || - ch == "[tab]" || - (ch && ch.substr(0, 2) == "[a") - ) { - if ( - ("(+-*/,:!&<>=^".indexOf(inputtext.slice(-1)) >= 0 && - inputtext.slice(0, 1) == "=") || - inputtext == "=" - ) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { - // if in pointing operation - if (e.shiftKey && ch.substr(0, 2) == "[a") { - ch = ch + "shifted"; - } - coord = editor.MoveECellWithKey(ch); - if (coord) { - if (range.hasrange) { - editor.inputBox.SetText( - wval.partialexpr + - SocialCalc.crToCoord(range.left, range.top) + - ":" + - SocialCalc.crToCoord(range.right, range.bottom) - ); - } else { - editor.inputBox.SetText(wval.partialexpr + coord); - } - return false; - } - } - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch != "[esc]") { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch == "[enter]") ch = "[adown]"; - if (ch == "[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0, 2) == "[a") { - editor.MoveECellWithKey(ch); - } - } else { - editor.inputBox.DisplayCellContents(); - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - break; - } - if (wval.partialexpr && ch == "[backspace]") { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - return false; - } - if (ch == "[f2]") return false; - if (range.hasrange) { - editor.RangeRemove(); - } - editor.MoveECell(wval.ecoord); - if (wval.partialexpr) { - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - wval.partialexpr = ""; // not pointing - } - return true; - - case "inputboxdirect": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (ch == "[esc]" || ch == "[enter]" || ch == "[tab]") { - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch == "[esc]") { - editor.inputBox.DisplayCellContents(); - } else { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch == "[enter]") ch = "[adown]"; - if (ch == "[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0, 2) == "[a") { - editor.MoveECellWithKey(ch); - } - } - break; - } - if (ch == "[f2]") return false; - return true; - - case "skip-and-start": - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - return false; - - default: - return true; - } - - return false; - }; - - SocialCalc.EditorAddToInput = function (editor, str, prefix) { - var wval = editor.workingvalues; - - if (editor.noEdit) return; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - switch (editor.state) { - case "start": - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.element.disabled = false; // make sure editable and overwrite old - editor.inputBox.Focus(); - editor.inputBox.SetText((prefix || "") + str); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.focus(); - if (wval.partialexpr) { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - editor.inputBox.SetText(editor.inputBox.GetText() + str); - break; - - default: - break; - } - }; - - SocialCalc.EditorDisplayCellContents = function (editor) { - if (editor.inputBox) editor.inputBox.DisplayCellContents(); - }; - var arr = []; - SocialCalc.EditorSaveEdit = function (editor, text) { - //console.log("editorSaveEdit"); - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - type = "text t"; - //changes for prompt - - value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord) + ""; - //console.log("old:"+oldvalue) - //console.log("new:"+value) - if (value == oldvalue) { - // no change - return; - } - if ("'" + value == oldvalue) { - return; - } - - fch = value.charAt(0); - if (fch == "=" && value.indexOf("\n") == -1) { - type = "formula"; - value = value.substring(1); - } else if (fch == "'") { - type = "text t"; - value = value.substring(1); - } else if (value.length == 0) { - type = "empty"; - } else { - valueinfo = SocialCalc.DetermineValueType(value); - if (valueinfo.type == "n" && value == valueinfo.value + "") { - // see if don't need "constant" - type = "value n"; - } else if (valueinfo.type.charAt(0) == "t") { - type = "text " + valueinfo.type; - } else if (valueinfo.type == "") { - type = "text t"; - } else { - type = "constant " + valueinfo.type + " " + valueinfo.value; - } - } - - if (type.charAt(0) == "t") { - // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - cmdline = "set " + wval.ecoord + " " + type + " " + value; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - }; - - // - // SocialCalc.EditorApplySetCommandsToRange(editor, cmd) - // - // Takes ecell or range and does a "set" command with cmd. - // - - SocialCalc.EditorApplySetCommandsToRange = function (editor, cmd) { - var cell, row, col, line, errortext; - - var sheetobj = editor.context.sheetobj; - var ecell = editor.ecell; - var range = editor.range; - - if (range.hasrange) { - coord = - SocialCalc.crToCoord(range.left, range.top) + - ":" + - SocialCalc.crToCoord(range.right, range.bottom); - line = "set " + coord + " " + cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } else { - line = "set " + ecell.coord + " " + cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } - - editor.DisplayCellContents(); - }; - - SocialCalc.EditorProcessMouseWheel = function ( - event, - delta, - mousewheelinfo, - wobj - ) { - if (wobj.functionobj.editor.busy) return; // ignore if busy - - if (delta > 0) { - wobj.functionobj.editor.ScrollRelative(true, -1); - } - if (delta < 0) { - wobj.functionobj.editor.ScrollRelative(true, +1); - } - }; - - // - // GridMousePosition(editor, clientX, clientY) - // - // Returns an object with row and col numbers and coord (spans handled for coords), - // and rowheader/colheader true if in header (where coord will be undefined). - // If in colheader, will return coltoresize if on appropriate place in col header. - // Also, there is rowfooter (on right) and colfooter (on bottom). - // In row/col header/footer, returns "distance" as pixels over the edge. - // - - SocialCalc.GridMousePosition = function (editor, clientX, clientY) { - var row, col, colpane; - var result = {}; - - for (row = 1; row < editor.rowpositions.length; row++) { - if (!editor.rowheight[row]) continue; // not rendered yet -- may be above or below us - if (editor.rowpositions[row] + editor.rowheight[row] > clientY) { - break; - } - } - for (col = 1; col < editor.colpositions.length; col++) { - if (!editor.colwidth[col]) continue; - if (editor.colpositions[col] + editor.colwidth[col] > clientX) { - break; - } - } - - result.row = row; - result.col = col; - - if (editor.headposition) { - if ( - clientX < editor.headposition.left && - clientX >= editor.gridposition.left - ) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } else if ( - clientY < editor.headposition.top && - clientY > editor.gridposition.top - ) { - // > because of sizing row - result.colheader = true; - result.distance = editor.headposition.top - clientY; - result.coltoresize = - col - - (editor.colpositions[col] + editor.colwidth[col] / 2 > clientX - ? 1 - : 0) || 1; - for (colpane = 0; colpane < editor.context.colpanes.length; colpane++) { - if ( - result.coltoresize >= editor.context.colpanes[colpane].first && - result.coltoresize <= editor.context.colpanes[colpane].last - ) { - // visible column - return result; - } - } - delete result.coltoresize; - return result; - } else if (clientX >= editor.verticaltablecontrol.controlborder) { - result.rowfooter = true; - result.distance = clientX - editor.verticaltablecontrol.controlborder; - return result; - } else if (clientY >= editor.horizontaltablecontrol.controlborder) { - result.colfooter = true; - result.distance = clientY - editor.horizontaltablecontrol.controlborder; - return result; - } else if (clientX < editor.gridposition.left) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } else if (clientY <= editor.gridposition.top) { - result.colheader = true; - result.distance = editor.headposition.top - clientY; - return result; - } else { - result.coord = SocialCalc.crToCoord(result.col, result.row); - if (editor.context.cellskip[result.coord]) { - // handle skipped cells - result.coord = editor.context.cellskip[result.coord]; - } - return result; - } - } - - return null; - }; - - // - // GetEditorCellElement(editor, row, col) - // - // Returns an object with element, the table cell element in the DOM that corresponds to row and column, - // as well as rowpane and colpane, the panes with the cell. - // If no such element, then returns null; - // - - SocialCalc.GetEditorCellElement = function (editor, row, col) { - var rowpane, colpane, c, coord; - var rowindex = 0; - var colindex = 0; - - for (rowpane = 0; rowpane < editor.context.rowpanes.length; rowpane++) { - if ( - row >= editor.context.rowpanes[rowpane].first && - row <= editor.context.rowpanes[rowpane].last - ) { - for (colpane = 0; colpane < editor.context.colpanes.length; colpane++) { - if ( - col >= editor.context.colpanes[colpane].first && - col <= editor.context.colpanes[colpane].last - ) { - rowindex += row - editor.context.rowpanes[rowpane].first + 2; - for (c = editor.context.colpanes[colpane].first; c <= col; c++) { - coord = editor.context.cellskip[SocialCalc.crToCoord(c, row)]; - if ( - !coord || - !editor.context.CoordInPane(coord, rowpane, colpane) - ) - // don't count col-spanned cells - colindex++; - } - return { - element: - editor.griddiv.firstChild.lastChild.childNodes[rowindex] - .childNodes[colindex], - rowpane: rowpane, - colpane: colpane, - }; - } - for ( - c = editor.context.colpanes[colpane].first; - c <= editor.context.colpanes[colpane].last; - c++ - ) { - coord = editor.context.cellskip[SocialCalc.crToCoord(c, row)]; - if (!coord || !editor.context.CoordInPane(coord, rowpane, colpane)) - // don't count col-spanned cells - colindex++; - } - colindex += 1; - } - } - rowindex += - editor.context.rowpanes[rowpane].last - - editor.context.rowpanes[rowpane].first + - 1 + - 1; - } - - return null; - }; - - // - // cellcoord = MoveECellWithKey(editor, ch) - // - // Processes an arrow key, etc., moving the edit cell. - // If not a movement key, returns null. - // - - SocialCalc.MoveECellWithKey = function (editor, ch) { - var coord, row, col, cell; - var shifted = false; - - if (!editor.ecell) { - return null; - } - - if (ch.slice(-7) == "shifted") { - ch = ch.slice(0, -7); - shifted = true; - } - - row = editor.ecell.row; - col = editor.ecell.col; - cell = editor.context.sheetobj.cells[editor.ecell.coord]; - - switch (ch) { - case "[adown]": - row += (cell && cell.rowspan) || 1; - break; - case "[aup]": - row--; - break; - case "[pgdn]": - row += editor.pageUpDnAmount - 1 + ((cell && cell.rowspan) || 1); - break; - case "[pgup]": - row -= editor.pageUpDnAmount; - break; - case "[aright]": - col += (cell && cell.colspan) || 1; - break; - case "[aleft]": - col--; - break; - case "[home]": - row = 1; - col = 1; - break; - default: - return null; - } - - if (!editor.range.hasrange) { - if (shifted) editor.RangeAnchor(); - } - - coord = editor.MoveECell(SocialCalc.crToCoord(col, row)); - - if (editor.range.hasrange) { - if (shifted) editor.RangeExtend(); - else editor.RangeRemove(); - } - - return coord; - }; - - // - // cellcoord = MoveECell(editor, newecell) - // - // Takes a coordinate and returns the new edit cell coordinate (which may be - // different if newecell is covered by a span). - // - - SocialCalc.MoveECell = function (editor, newcell) { - var cell, f; - - var highlights = editor.context.highlights; - - if (editor.ecell) { - //changes for prompt - if (editor.ecell.coord == newcell) return newcell; - - if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast("ecell", { - original: editor.ecell.coord, - ecell: newcell, - }); - } - - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - delete highlights[editor.ecell.coord]; - if ( - editor.range2.hasrange && - editor.ecell.row >= editor.range2.top && - editor.ecell.row <= editor.range2.bottom && - editor.ecell.col >= editor.range2.left && - editor.ecell.col <= editor.range2.right - ) { - highlights[editor.ecell.coord] = "range2"; - } - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders(""); // set to regular col/rowname styles - editor.cellhandles.ShowCellHandles(false); - } else if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast("ecell", { ecell: newcell }); - } - newcell = editor.context.cellskip[newcell] || newcell; - editor.ecell = SocialCalc.coordToCr(newcell); - editor.ecell.coord = newcell; - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - highlights[newcell] = "cursor"; - - for (f in editor.MoveECellCallback) { - // let others know - editor.MoveECellCallback[f](editor); - } - - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders("selected"); - - for (f in editor.StatusCallback) { - // let status line, etc., know - editor.StatusCallback[f].func( - editor, - "moveecell", - newcell, - editor.StatusCallback[f].params - ); - } - - if (editor.busy) { - editor.ensureecell = true; // wait for when not busy - } else { - editor.ensureecell = false; - editor.EnsureECellVisible(); - } - - return newcell; - }; - - SocialCalc.EnsureECellVisible = function (editor) { - var vamount = 0; - var hamount = 0; - - if (editor.ecell.row > editor.lastnonscrollingrow) { - if (editor.ecell.row < editor.firstscrollingrow) { - vamount = editor.ecell.row - editor.firstscrollingrow; - } else if (editor.ecell.row > editor.lastvisiblerow) { - vamount = editor.ecell.row - editor.lastvisiblerow; - } - } - if (editor.ecell.col > editor.lastnonscrollingcol) { - if (editor.ecell.col < editor.firstscrollingcol) { - hamount = editor.ecell.col - editor.firstscrollingcol; - } else if (editor.ecell.col > editor.lastvisiblecol) { - hamount = editor.ecell.col - editor.lastvisiblecol; - } - } - - if (vamount != 0 || hamount != 0) { - editor.ScrollRelativeBoth(vamount, hamount); - } else { - editor.cellhandles.ShowCellHandles(true); - } - }; - - SocialCalc.ReplaceCell = function (editor, cell, row, col) { - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell( - row, - col, - cell.rowpane, - cell.colpane, - true, - null - ); - if (newelement) { - // Don't use a real element and replaceChild, which seems to have focus issues with IE, Firefox, and speed issues - cell.element.innerHTML = newelement.innerHTML; - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a] != "cssText") - cell.element.style[a] = newelement.style[a]; - } - } - }; - - SocialCalc.UpdateCellCSS = function (editor, cell, row, col) { - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell( - row, - col, - cell.rowpane, - cell.colpane, - true, - null - ); - if (newelement) { - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a] != "cssText") - cell.element.style[a] = newelement.style[a]; - } - } - }; - - SocialCalc.SetECellHeaders = function (editor, selected) { - var ecell = editor.ecell; - var context = editor.context; - - var rowpane, colpane, first, last; - var rowindex = 0; - var colindex = 0; - var headercell; - - if (!ecell) return; - - for (rowpane = 0; rowpane < context.rowpanes.length; rowpane++) { - first = context.rowpanes[rowpane].first; - last = context.rowpanes[rowpane].last; - if (ecell.row >= first && ecell.row <= last) { - headercell = - editor.fullgrid.childNodes[1].childNodes[ - 2 + rowindex + ecell.row - first - ].childNodes[0]; - if (headercell) { - if (context.classnames) - headercell.className = context.classnames[selected + "rowname"]; - if (context.explicitStyles) - headercell.style.cssText = - context.explicitStyles[selected + "rowname"]; - headercell.style.verticalAlign = "top"; // to get around Safari making top of centered row number be - // considered top of row (and can't get position in Safari) - } - } - rowindex += last - first + 1 + 1; - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - first = context.colpanes[colpane].first; - last = context.colpanes[colpane].last; - if (ecell.col >= first && ecell.col <= last) { - headercell = - editor.fullgrid.childNodes[1].childNodes[1].childNodes[ - 1 + colindex + ecell.col - first - ]; - if (headercell) { - if (context.classnames) - headercell.className = context.classnames[selected + "colname"]; - if (context.explicitStyles) - headercell.style.cssText = - context.explicitStyles[selected + "colname"]; - } - } - colindex += last - first + 1 + 1; - } - }; - - // - // RangeAnchor(editor, ecoord) - // - // Sets the anchor of a range to ecoord (or ecell if missing). - // - - SocialCalc.RangeAnchor = function (editor, ecoord) { - if (editor.range.hasrange) { - editor.RangeRemove(); - } - - editor.RangeExtend(ecoord); - }; - - // - // RangeExtend(editor, ecoord) - // - // Sets the other corner of the range to ecoord or, if missing, ecell. - // - - SocialCalc.RangeExtend = function (editor, ecoord) { - var a, cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - var ecell; - if (ecoord) { - ecell = SocialCalc.coordToCr(ecoord); - ecell.coord = ecoord; - } else ecell = editor.ecell; - - if (!ecell) return; // just in case - if (SocialCalc.Constants.SCNoRanging) return; - - if (!range.hasrange) { - // called without RangeAnchor... - range.anchorcoord = ecell.coord; - range.anchorrow = ecell.row; - range.top = ecell.row; - range.bottom = ecell.row; - range.anchorcol = ecell.col; - range.left = ecell.col; - range.right = ecell.col; - range.hasrange = true; - } - - if (range.anchorrow < ecell.row) { - range.top = range.anchorrow; - range.bottom = ecell.row; - } else { - range.top = ecell.row; - range.bottom = range.anchorrow; - } - if (range.anchorcol < ecell.col) { - range.left = range.anchorcol; - range.right = ecell.col; - } else { - range.left = ecell.col; - range.right = range.anchorcol; - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - highlights[coord] = "unrange"; - break; - case "range2": - highlights[coord] = "unrange2"; - break; - } - } - - for (row = range.top; row <= range.bottom; row++) { - for (col = range.left; col <= range.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange": - highlights[coord] = "range"; - break; - case "cursor": - break; - case "unrange2": - default: - highlights[coord] = "newrange"; - break; - } - } - } - - for (row = range2.top; range2.hasrange && row <= range2.bottom; row++) { - for (col = range2.left; col <= range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange2": - highlights[coord] = "range2"; - break; - case "range": - case "newrange": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "unrange": - delete highlights[coord]; - break; - case "newrange": - highlights[coord] = "range"; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "range": - case "range2": - case "cursor": - continue; - } - - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - for (f in editor.RangeChangeCallback) { - // let others know - editor.RangeChangeCallback[f](editor); - } - - // create range/coord string and do status callback - - coord = SocialCalc.crToCoord(editor.range.left, editor.range.top); - if ( - editor.range.left != editor.range.right || - editor.range.top != editor.range.bottom - ) { - // more than one cell - coord += - ":" + SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "rangechange", - coord, - editor.StatusCallback[f].params - ); - } - - return; - }; - - // - // RangeRemove(editor) - // - // Turns off the range. - // - - SocialCalc.RangeRemove = function (editor) { - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - if (!range.hasrange && !range2.hasrange) return; - - for (row = range2.top; range2.hasrange && row <= range2.bottom; row++) { - for (col = range2.left; col <= range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "range": - highlights[coord] = "newrange2"; - break; - case "range2": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - delete highlights[coord]; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range.hasrange = false; - - for (f in editor.RangeChangeCallback) { - // let others know - editor.RangeChangeCallback[f](editor); - } - - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "rangechange", - "", - editor.StatusCallback[f].params - ); - } - - return; - }; - - // - // Range2Remove(editor) - // - // Turns off the range2. - // - - SocialCalc.Range2Remove = function (editor) { - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range2 = editor.range2; - - if (!range2.hasrange) return; - - for (coord in highlights) { - switch (highlights[coord]) { - case "range2": - delete highlights[coord]; - break; - case "range": - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range2.hasrange = false; - - return; - }; - - // - // FitToEditTable(editor) - // - // Figure out (through column width declarations and approximation of pixels per row) - // how many rendered rows and columns you need to be at least a little larger than - // the editor's editing area. - // - - SocialCalc.FitToEditTable = function (editor) { - var colnum, colname, colwidth, totalwidth, totalrows, rowpane, needed; - - var context = editor.context; - var sheetobj = context.sheetobj; - var sheetcolattribs = sheetobj.colattribs; - - // Calculate column width data - - totalwidth = context.showRCHeaders ? context.rownamewidth - 0 : 0; - for (var colpane = 0; colpane < context.colpanes.length - 1; colpane++) { - // Get width of all but last pane - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - colname = SocialCalc.rcColname(colnum); - colwidth = - sheetobj.colattribs.width[colname] || - sheetobj.attribs.defaultcolwidth || - SocialCalc.Constants.defaultColWidth; - if (colwidth == "blank" || colwidth == "auto") colwidth = ""; - totalwidth += colwidth && colwidth - 0 > 0 ? colwidth - 0 : 10; - } - } - - for (colnum = context.colpanes[colpane].first; colnum <= 10000; colnum++) { - //!!! max for safety, but makes that col max!!! - colname = SocialCalc.rcColname(colnum); - colwidth = - sheetobj.colattribs.width[colname] || - sheetobj.attribs.defaultcolwidth || - SocialCalc.Constants.defaultColWidth; - if (colwidth == "blank" || colwidth == "auto") colwidth = ""; - totalwidth += colwidth && colwidth - 0 > 0 ? colwidth - 0 : 10; - if (totalwidth > editor.tablewidth) break; - } - - context.colpanes[colpane].last = colnum; - - // Calculate row height data - - totalrows = context.showRCHeaders ? 1 : 0; - for (rowpane = 0; rowpane < context.rowpanes.length - 1; rowpane++) { - // count all panes but last one - totalrows += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 1; - } - - needed = editor.tableheight - totalrows * context.pixelsPerRow; // estimate amount needed - - context.rowpanes[rowpane].last = - context.rowpanes[rowpane].first + - Math.floor(needed / context.pixelsPerRow) + - 1; - }; - - // - // CalculateEditorPositions(editor) - // - // Calculate the screen positions and other values of various editing elements - // These values change and need to be recomputed when the pane first/last or cell contents change, - // as well as new column widths, etc. - // - // Note: Only call this after the grid has been rendered! You may have to wait for a timeout... - // - - SocialCalc.CalculateEditorPositions = function (editor) { - var rowpane, colpane, i; - - editor.gridposition = SocialCalc.GetElementPosition(editor.griddiv); - editor.headposition = SocialCalc.GetElementPosition( - editor.griddiv.firstChild.lastChild.childNodes[2].childNodes[1] - ); // 3rd tr 2nd td - - editor.rowpositions = []; - for (rowpane = 0; rowpane < editor.context.rowpanes.length; rowpane++) { - editor.CalculateRowPositions( - rowpane, - editor.rowpositions, - editor.rowheight - ); - } - for (i = 0; i < editor.rowpositions.length; i++) { - if (editor.rowpositions[i] > editor.gridposition.top + editor.tableheight) - break; - } - editor.lastvisiblerow = i - 1; - - editor.colpositions = []; - for (colpane = 0; colpane < editor.context.colpanes.length; colpane++) { - editor.CalculateColPositions( - colpane, - editor.colpositions, - editor.colwidth - ); - } - for (i = 0; i < editor.colpositions.length; i++) { - if (editor.colpositions[i] > editor.gridposition.left + editor.tablewidth) - break; - } - editor.lastvisiblecol = i - 1; - - editor.firstscrollingrow = - editor.context.rowpanes[editor.context.rowpanes.length - 1].first; - editor.firstscrollingrowtop = - editor.rowpositions[editor.firstscrollingrow] || editor.headposition.top; - editor.lastnonscrollingrow = - editor.context.rowpanes.length - 1 > 0 - ? editor.context.rowpanes[editor.context.rowpanes.length - 2].last - : 0; - editor.firstscrollingcol = - editor.context.colpanes[editor.context.colpanes.length - 1].first; - editor.firstscrollingcolleft = - editor.colpositions[editor.firstscrollingcol] || editor.headposition.left; - editor.lastnonscrollingcol = - editor.context.colpanes.length - 1 > 0 - ? editor.context.colpanes[editor.context.colpanes.length - 2].last - : 0; - - // Now do the table controls - - editor.verticaltablecontrol.ComputeTableControlPositions(); - editor.horizontaltablecontrol.ComputeTableControlPositions(); - }; - - // - // ScheduleRender(editor) - // - // Do a series of timeouts to render the sheet, wait for background layout and - // rendering by the browser, and then update editor visuals, sliders, etc. - // - - SocialCalc.ScheduleRender = function (editor) { - if (editor.timeout) window.clearTimeout(editor.timeout); // in case called more than once, just use latest - - SocialCalc.EditorSheetStatusCallback(null, "schedrender", null, editor); - SocialCalc.EditorStepInfo.editor = editor; - editor.timeout = window.setTimeout(SocialCalc.DoRenderStep, 1); - }; - - // DoRenderStep() - // - - SocialCalc.DoRenderStep = function () { - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - editor.EditorRenderSheet(); - - SocialCalc.EditorSheetStatusCallback(null, "renderdone", null, editor); - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - }; - - // - // SocialCalc.SchedulePositionCalculations(editor) - // - - SocialCalc.SchedulePositionCalculations = function (editor) { - SocialCalc.EditorStepInfo.editor = editor; - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - }; - - // DoPositionCalculations(editor) - // - // Update editor visuals, sliders, etc. - // - // Note: Only call this after the DOM objects have been modified and rendered! - // - - SocialCalc.DoPositionCalculations = function () { - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - var ok = false; - try { - editor.CalculateEditorPositions(); - ok = true; - } catch (e) {} - - if (!ok) { - if (typeof $ != "undefined") { - $(window).trigger("resize"); - setTimeout(SocialCalc.DoPositionCalculations, 400); - } - return; /* Workaround IE6 partial-initialized-DOM bug */ - } - - editor.verticaltablecontrol.PositionTableControlElements(); - editor.horizontaltablecontrol.PositionTableControlElements(); - - SocialCalc.EditorSheetStatusCallback(null, "doneposcalc", null, editor); - - if (editor.ensureecell && editor.ecell && !editor.deferredCommands.length) { - // don't do if deferred cmd to execute - editor.ensureecell = false; - editor.EnsureECellVisible(); // this could cause another redisplay - } - - editor.cellhandles.ShowCellHandles(true); - - //!!! Need to now check to see if this positioned controls out of the editing area - //!!! (such as when there is a large wrapped cell and it pushes the pane boundary too far down). - - if (SocialCalc.Callbacks.broadcast) - SocialCalc.Callbacks.broadcast("ask.ecell"); - }; - - SocialCalc.CalculateRowPositions = function ( - editor, - panenum, - positions, - sizes - ) { - var toprow, rowpane, rownum, offset, trowobj, cellposition; - - var context = editor.context; - var sheetobj = context.sheetobj; - - var tbodyobj; - - if (!context.showRCHeaders) throw "Needs showRCHeaders=true"; - - tbodyobj = editor.fullgrid.lastChild; - - // Calculate start of this pane as row in this table: - - toprow = 2; - for (rowpane = 0; rowpane < panenum; rowpane++) { - toprow += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 2; // skip pane and spacing row - } - - offset = 0; - for ( - rownum = context.rowpanes[rowpane].first; - rownum <= context.rowpanes[rowpane].last; - rownum++ - ) { - trowobj = tbodyobj.childNodes[toprow + offset]; - offset++; - cellposition = SocialCalc.GetElementPosition(trowobj.firstChild); - - // Safari has problem: If a cell in the row is high, cell 1 is centered and it returns top of centered part - // but if you get position of row element, it always returns the same value (not the row's) - // So we require row number to be vertical aligned to top - - if (!positions[rownum]) { - positions[rownum] = cellposition.top; // first one takes precedence - sizes[rownum] = trowobj.firstChild.offsetHeight; - } - } - - return; - }; - - SocialCalc.CalculateColPositions = function ( - editor, - panenum, - positions, - sizes - ) { - var leftcol, colpane, colnum, offset, trowobj, cellposition; - - var context = editor.context; - var sheetobj = context.sheetobj; - - var tbodyobj; - - if (!context.showRCHeaders) throw "Needs showRCHeaders=true"; - - tbodyobj = editor.fullgrid.lastChild; - - // Calculate start of this pane as column in this table: - - leftcol = 1; - for (colpane = 0; colpane < panenum; colpane++) { - leftcol += - context.colpanes[colpane].last - context.colpanes[colpane].first + 2; // skip pane and spacing col - } - - trowobj = tbodyobj.childNodes[1]; // get heading row, which has all columns - offset = 0; - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - cellposition = SocialCalc.GetElementPosition( - trowobj.childNodes[leftcol + offset] - ); - if (!positions[colnum]) { - positions[colnum] = cellposition.left; // first one takes precedence - if (trowobj.childNodes[leftcol + offset]) { - sizes[colnum] = trowobj.childNodes[leftcol + offset].offsetWidth; - } - } - offset++; - } - - return; - }; - - // ScrollRelative(editor, vertical, amount) - // - // If vertical true, scrolls up(-)/down(+), else left(-)/right(+) - - SocialCalc.ScrollRelative = function (editor, vertical, amount) { - if (vertical) { - editor.ScrollRelativeBoth(amount, 0); - } else { - editor.ScrollRelativeBoth(0, amount); - } - return; - }; - - // ScrollRelativeBoth(editor, vamount, hamount) - // - // Does both with one render - - SocialCalc.ScrollRelativeBoth = function (editor, vamount, hamount) { - var context = editor.context; - - var vplen = context.rowpanes.length; - var vlimit = vplen > 1 ? context.rowpanes[vplen - 2].last + 1 : 1; // don't scroll past here - if (context.rowpanes[vplen - 1].first + vamount < vlimit) { - // limit amount - vamount = -context.rowpanes[vplen - 1].first + vlimit; - } - - var hplen = context.colpanes.length; - var hlimit = hplen > 1 ? context.colpanes[hplen - 2].last + 1 : 1; // don't scroll past here - - if (context.colpanes[hplen - 1].first + hamount < hlimit) { - // limit amount - hamount = -context.colpanes[hplen - 1].first + hlimit; - } - - if ( - SocialCalc.IsScrollPossible && - !SocialCalc.IsScrollPossible( - editor.context.sheetobj.attribs.lastrow, - editor.context.sheetobj.attribs.lastcol, - context.rowpanes[vplen - 1].first, - context.colpanes[hplen - 1].first, - vamount, - hamount - ) - ) { - return; - } - - if ((vamount == 1 || vamount == -1) && hamount == 0) { - // special case quick scrolls - if (vamount == 1) { - editor.ScrollTableUpOneRow(); - } else { - editor.ScrollTableDownOneRow(); - } - if (editor.ecell) editor.SetECellHeaders("selected"); - editor.SchedulePositionCalculations(); - return; - } - - // Do a gross move and render - - if (vamount != 0 || hamount != 0) { - context.rowpanes[vplen - 1].first += vamount; - context.rowpanes[vplen - 1].last += vamount; - context.colpanes[hplen - 1].first += hamount; - context.colpanes[hplen - 1].last += hamount; - editor.FitToEditTable(); - editor.ScheduleRender(); - } - }; - - // PageRelative(editor, vertical, direction) - // - // If vertical true, pages up(direction is -)/down(+), else left(-)/right(+) - - SocialCalc.PageRelative = function (editor, vertical, direction) { - var context = editor.context; - var panes = vertical ? "rowpanes" : "colpanes"; - var lastpane = context[panes][context[panes].length - 1]; - var lastvisible = vertical ? "lastvisiblerow" : "lastvisiblecol"; - var sizearray = vertical ? editor.rowheight : editor.colwidth; - var defaultsize = vertical - ? SocialCalc.Constants.defaultAssumedRowHeight - : SocialCalc.Constants.defaultColWidth; - var size, newfirst, totalsize, current; - - if (direction > 0) { - // down/right - newfirst = editor[lastvisible]; - if (newfirst == lastpane.first) newfirst += 1; // move at least one - } else { - if (vertical) { - // calculate amount to scroll - totalsize = - editor.tableheight - - (editor.firstscrollingrowtop - editor.gridposition.top); - } else { - totalsize = - editor.tablewidth - - (editor.firstscrollingcolleft - editor.gridposition.left); - } - totalsize -= - sizearray[editor[lastvisible]] > 0 - ? sizearray[editor[lastvisible]] - : defaultsize; - - for (newfirst = lastpane.first - 1; newfirst > 0; newfirst--) { - size = sizearray[newfirst] > 0 ? sizearray[newfirst] : defaultsize; - if (totalsize < size) break; - totalsize -= size; - } - - current = lastpane.first; - if (newfirst >= current) newfirst = current - 1; // move at least 1 - if (newfirst < 1) newfirst = 1; - } - - lastpane.first = newfirst; - lastpane.last = newfirst + 1; - editor.LimitLastPanes(); - editor.FitToEditTable(); - editor.ScheduleRender(); - }; - - // LimitLastPanes(editor) - // - // Makes sure that the "first" of the last panes isn't before the last of the previous pane - // - - SocialCalc.LimitLastPanes = function (editor) { - var context = editor.context; - var plen; - - plen = context.rowpanes.length; - if ( - plen > 1 && - context.rowpanes[plen - 1].first <= context.rowpanes[plen - 2].last - ) - context.rowpanes[plen - 1].first = context.rowpanes[plen - 2].last + 1; - - plen = context.colpanes.length; - if ( - plen > 1 && - context.colpanes[plen - 1].first <= context.colpanes[plen - 2].last - ) - context.colpanes[plen - 1].first = context.colpanes[plen - 2].last + 1; - }; - - SocialCalc.ScrollTableUpOneRow = function (editor) { - var toprow, - rowpane, - rownum, - colnum, - colpane, - cell, - oldrownum, - maxspan, - newbottomrow, - newrow, - oldchild, - bottomrownum; - var rowneedsrefresh = {}; - - var context = editor.context; - var sheetobj = context.sheetobj; - var tableobj = editor.fullgrid; - - var tbodyobj; - - tbodyobj = tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane = 0; rowpane < context.rowpanes.length - 1; rowpane++) { - toprow += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 2; // skip pane and spacing row - } - - tbodyobj.removeChild(tbodyobj.childNodes[toprow]); - - context.rowpanes[rowpane].first++; - context.rowpanes[rowpane].last++; - editor.FitToEditTable(); - context.CalculateColWidthData(); // Just in case, since normally done in RenderSheet - - newbottomrow = context.RenderRow(context.rowpanes[rowpane].last, rowpane); - tbodyobj.appendChild(newbottomrow); - - // if scrolled off a row with starting rowspans, replace rows for the largest rowspan - - var maxrowspan = 1; - oldrownum = context.rowpanes[rowpane].first - 1; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - var coord = SocialCalc.crToCoord(colnum, oldrownum); - if (context.cellskip[coord]) continue; - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > maxrowspan) maxrowspan = cell.rowspan; - } - } - - if (maxrowspan > 1) { - for (rownum = 1; rownum < maxrowspan; rownum++) { - if (rownum + oldrownum >= context.rowpanes[rowpane].last) break; - newrow = context.RenderRow(rownum + oldrownum, rowpane); - oldchild = tbodyobj.childNodes[toprow + rownum - 1]; - tbodyobj.replaceChild(newrow, oldchild); - } - } - - // if added a row that includes rowspans from above, update the size of those to include new row - - bottomrownum = context.rowpanes[rowpane].last; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - coord = context.cellskip[SocialCalc.crToCoord(colnum, bottomrownum)]; - if (!coord) continue; // only look at spanned cells - rownum = context.coordToCR[coord].row - 0; - if ( - rownum == context.rowpanes[rowpane].last || - rownum < context.rowpanes[rowpane].first - ) - continue; // this row (colspan) or starts above pane - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > 1) rowneedsrefresh[rownum] = true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow = context.RenderRow(rownum, rowpane); - oldchild = - tbodyobj.childNodes[ - toprow + (rownum - context.rowpanes[rowpane].first) - ]; - tbodyobj.replaceChild(newrow, oldchild); - } - - return tableobj; - }; - - SocialCalc.ScrollTableDownOneRow = function (editor) { - var toprow, - rowpane, - rownum, - colnum, - colpane, - cell, - newrownum, - maxspan, - newbottomrow, - newrow, - oldchild, - bottomrownum, - maxrowspan, - coord; - var rowneedsrefresh = {}; - - var context = editor.context; - var sheetobj = context.sheetobj; - var tableobj = editor.fullgrid; - - var tbodyobj; - - tbodyobj = tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane = 0; rowpane < context.rowpanes.length - 1; rowpane++) { - toprow += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 2; // skip pane and spacing row - } - - tbodyobj.removeChild( - tbodyobj.childNodes[ - toprow + - (context.rowpanes[rowpane].last - context.rowpanes[rowpane].first) - ] - ); - - context.rowpanes[rowpane].first--; - context.rowpanes[rowpane].last--; - editor.FitToEditTable(); - context.CalculateColWidthData(); // Just in case, since normally done in RenderSheet - - newrow = context.RenderRow(context.rowpanes[rowpane].first, rowpane); - tbodyobj.insertBefore(newrow, tbodyobj.childNodes[toprow]); - - // if inserted a row with starting rowspans, replace rows for the largest rowspan - - maxrowspan = 1; - newrownum = context.rowpanes[rowpane].first; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - coord = SocialCalc.crToCoord(colnum, newrownum); - if (context.cellskip[coord]) continue; - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > maxrowspan) maxrowspan = cell.rowspan; - } - } - - if (maxrowspan > 1) { - for (rownum = 1; rownum < maxrowspan; rownum++) { - if (rownum + newrownum > context.rowpanes[rowpane].last) break; - newrow = context.RenderRow(rownum + newrownum, rowpane); - oldchild = tbodyobj.childNodes[toprow + rownum]; - tbodyobj.replaceChild(newrow, oldchild); - } - } - - // if last row now includes rowspans or rowspans from above, update the size of those to remove deleted row - - bottomrownum = context.rowpanes[rowpane].last; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - coord = SocialCalc.crToCoord(colnum, bottomrownum); - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > 1) { - rowneedsrefresh[bottomrownum] = true; // need to update this row - continue; - } - coord = context.cellskip[SocialCalc.crToCoord(colnum, bottomrownum)]; - if (!coord) continue; // only look at spanned cells - rownum = context.coordToCR[coord].row - 0; - if (rownum == bottomrownum || rownum < context.rowpanes[rowpane].first) - continue; // this row (colspan) or starts above pane - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > 1) rowneedsrefresh[rownum] = true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow = context.RenderRow(rownum, rowpane); - oldchild = - tbodyobj.childNodes[ - toprow + (rownum - context.rowpanes[rowpane].first) - ]; - tbodyobj.replaceChild(newrow, oldchild); - } - - return tableobj; - }; - - // ************************************* - // - // InputBox class: - // - // This class deals with the text box for editing cell contents. - // It mainly controls a user input box for typed content and is used to interact with - // the keyboard code, etc. - // - // You can use this inside a formula bar control of some sort. - // You create this after you have created a table editor object (but not necessarily - // done the CreateTableEditor method). - // - // When the user starts typing text, or double-clicks on a cell, this object - // comes into play. - // - // The element given when this is first constructed should be an input HTMLElement or - // something that acts like one. Check the code here to see what is done to it. - // - // ************************************* - - SocialCalc.InputBox = function (element, editor) { - if (!element) return; // invoked without enough data to work - - this.element = element; // the input element associated with this InputBox - this.editor = editor; // the TableEditor this belongs to - this.inputEcho = null; - - editor.inputBox = this; - - element.onmousedown = SocialCalc.InputBoxOnMouseDown; - - editor.MoveECellCallback.formulabar = function (e) { - if (e.state != "start") { - return; - } // if not in normal keyboard mode don't replace formula bar - editor.inputBox.DisplayCellContents(e.ecell.coord); - }; - }; - - // Methods: - - SocialCalc.InputBox.prototype.DisplayCellContents = function (coord) { - SocialCalc.InputBoxDisplayCellContents(this, coord); - }; - SocialCalc.InputBox.prototype.ShowInputBox = function (show) { - this.editor.inputEcho.ShowInputEcho(show); - }; - SocialCalc.InputBox.prototype.GetText = function () { - return this.element.value; - }; - SocialCalc.InputBox.prototype.SetText = function (newtext) { - if (!this.element) return; - this.element.value = newtext; - - if (!SocialCalc.Constants.SCNoInputEcho) { - this.editor.inputEcho.SetText(newtext + "_"); - } - }; - SocialCalc.InputBox.prototype.Focus = function () { - SocialCalc.InputBoxFocus(this); - }; - SocialCalc.InputBox.prototype.Blur = function () { - return this.element.blur(); - }; - SocialCalc.InputBox.prototype.Select = function (t) { - if (!this.element) return; - switch (t) { - case "end": - if (document.selection && document.selection.createRange) { - /* IE 4+ - Safer than setting .selectionEnd as it also works for Textareas. */ - var range = document.selection.createRange().duplicate(); - range.moveToElementText(this.element); - range.collapse(false); - range.select(); - } else if (this.element.selectionStart != undefined) { - this.element.selectionStart = this.element.value.length; - this.element.selectionEnd = this.element.value.length; - } - break; - } - }; - - // Functions: - - // - // SocialCalc.InputBoxDisplayCellContents(inputbox, coord) - // - // Sets input box to the contents of the specified cell (or ecell if null). - // - var CoordForColorChange; - var editCoord; - SocialCalc.InputBoxDisplayCellContents = function (inputbox, coord) { - var scc = SocialCalc.Constants; - var cell, position; - - if (!inputbox) return; - - //changes for prompt - if (!coord) { - coord = inputbox.editor.ecell.coord; - } - var text = SocialCalc.GetCellContents( - inputbox.editor.context.sheetobj, - coord - ); - if (text.indexOf("\n") != -1) { - //text = scc.s_inputboxdisplaymultilinetext; - text = scc.s_inputboxdisplaynoteditable; - inputbox.element.disabled = true; - SocialCalc.ToggleInputLineButtons(false); - } else if (!SocialCalc.Callbacks.IsCellEditable(inputbox.editor)) { - text = scc.s_inputboxdisplaynoteditable; - SocialCalc.ToggleInputLineButtons(false); - inputbox.element.disabled = true; - inputbox.element.style.display = "none"; - } else { - CoordForColorChange = coord; - editCoord = coord; - - //changes for prompt - - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - cell = SocialCalc.GetEditorCellElement( - inputbox.editor, - inputbox.editor.ecell.row, - inputbox.editor.ecell.col - ); - var left = "100px"; - var top = "100px"; - var width = 100; - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - left = position.left - 2 + "px"; - top = position.top - 7 + "px"; - width = cell.element.offsetWidth; - } - if (!cell || width == 0) { - //scrolled off screen - SocialCalc.ToggleInputLineButtons(false); - inputbox.element.disabled = true; - inputbox.element.style.display = "none"; - // do nothing - return; - } - var ele = document.getElementById(spreadsheet.formulabarDiv.id); - if (ele) { - spreadsheet.spreadsheetDiv.removeChild(spreadsheet.formulabarDiv); - } - spreadsheet.formulabarDiv.style.left = left; - spreadsheet.formulabarDiv.style.top = top; - //spreadsheet.formulabarDiv.style.width = "30px"; - //spreadsheet.formulabarDiv.style.fontSize = "10px"; - spreadsheet.formulabarDiv.style.zIndex = 100; - spreadsheet.formulabarDiv.style.position = "absolute"; - var input = spreadsheet.formulabarDiv.firstChild; - //changes for prompt - - input.style.fontSize = "100%"; - input.style.backgroundColor = "transparent"; - - input.style.borderBottomColor = "#306eff"; - input.style.borderBottomLeftRadius = "3px"; - input.style.borderBottomRightRadius = "3px"; - input.style.borderBottomStyle = "solid"; - input.style.borderBottomWidth = "2px"; - input.style.borderLeftColor = "#306eff"; - input.style.borderLeftStyle = "solid"; - input.style.borderLeftWidth = "2px"; - input.style.borderRightColor = "#306eff"; - input.style.borderRightStyle = "solid"; - input.style.borderRightWidth = "2px"; - input.style.borderTopColor = "#306eff"; - input.style.borderTopLeftRadius = "3px"; - input.style.borderTopRightRadius = "3px"; - input.style.borderTopStyle = "solid"; - input.style.borderTopWidth = "2px"; - - //console.log("cell width ="+width) - //changes for prompt - - input.size = "" + width / 8; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - - inputbox.element.disabled = false; - inputbox.element.style.display = "inline"; - SocialCalc.ToggleInputLineButtons(true); - } - if (scc.SCNoQuoteInInputBox && text.substring(0, 1) == "'") { - text = text.substring(1); - } - inputbox.SetText(text); - // autoSave(selectedFile); - }; - - // - // SocialCalc.InputBoxFocus(inputbox) - // - // Call this to have the input box get the focus and respond to keystrokes - // but still pass them off to SocialCalc.ProcessKey. - // - - SocialCalc.InputBoxFocus = function (inputbox) { - if (!inputbox) return; - inputbox.element.focus(); - var editor = inputbox.editor; - editor.state = "input"; - var wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - }; - - // - // SocialCalc.InputBoxOnMouseDown(e) - // - // This is called when the input box gets the focus. It then responds to keystrokes - // and pass them off to SocialCalc.ProcessKey, but in a different editing state. - // - - SocialCalc.InputBoxOnMouseDown = function (e) { - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var wval = editor.workingvalues; - - switch (editor.state) { - case "start": - editor.state = "inputboxdirect"; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.inputEcho.ShowInputEcho(true); - break; - - case "input": - wval.partialexpr = ""; // make sure not pointing - editor.MoveECell(wval.ecoord); - editor.state = "inputboxdirect"; - SocialCalc.KeyboardFocus(); // may have come here from outside of grid - break; - - case "inputboxdirect": - break; - } - }; - - // ************************************* - // - // InputEcho class: - // - // This object creates and controls an element that echos what's in the InputBox during editing - // It is draggable. - // - // ************************************* - - SocialCalc.InputEcho = function (editor) { - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - this.text = ""; // current value of what is displayed - this.interval = null; // timer handle - - this.container = null; // element containing main echo as well as prompt line - this.main = null; // main echo area - this.prompt = null; - - this.functionbox = null; // function chooser dialog - - this.container = document.createElement("div"); - SocialCalc.setStyles( - this.container, - "display:none;position:absolute;zIndex:10;" - ); - - this.topprompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) - this.topprompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) - SocialCalc.setStyles(this.topprompt, scc.defaultInputEchoPromptStyle); - this.topprompt.innerHTML = ""; - - this.container.appendChild(this.topprompt); - - this.main = document.createElement("div"); - - if (scc.defaultInputEchoClass) - this.main.className = scc.defaultInputEchoClass; - if (scc.defaultInputEchoStyle) - SocialCalc.setStyles(this.main, scc.defaultInputEchoStyle); - - this.main.innerHTML = " "; - - this.container.appendChild(this.main); - - this.prompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) - this.prompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) - SocialCalc.setStyles(this.prompt, scc.defaultInputEchoPromptStyle); - this.prompt.innerHTML = ""; - - this.container.appendChild(this.prompt); - - SocialCalc.DragRegister(this.main, true, true, { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: this.container, - }); - - editor.toplevel.appendChild(this.container); - }; - - // Methods: - - SocialCalc.InputEcho.prototype.ShowInputEcho = function (show) { - return SocialCalc.ShowInputEcho(this, show); - }; - SocialCalc.InputEcho.prototype.SetText = function (str) { - return SocialCalc.SetInputEchoText(this, str); - }; - - // Functions: - - SocialCalc.ShowInputEcho = function (inputecho, show) { - var cell, position; - var editor = inputecho.editor; - - if (!editor) return; - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - if (show) { - editor.cellhandles.ShowCellHandles(false); - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - inputecho.container.style.left = position.left - 1 + "px"; - inputecho.container.style.top = position.top - 1 + "px"; - } - inputecho.container.style.display = "block"; - if (inputecho.interval) window.clearInterval(inputecho.interval); // just in case - inputecho.interval = window.setInterval( - SocialCalc.InputEchoHeartbeat, - 50 - ); - } else { - if (inputecho.interval) window.clearInterval(inputecho.interval); - inputecho.container.style.display = "none"; - inputecho.topprompt.innerHTML = ""; - } - }; - - SocialCalc.SetInputEchoText = function (inputecho, str) { - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - var scc = SocialCalc.Constants; - var fname, fstr; - var newstr = SocialCalc.special_chars(str); - newstr = newstr.replace(/\n/g, "
"); - - if (inputecho.text != newstr) { - inputecho.main.innerHTML = newstr; - inputecho.text = newstr; - } - - var parts = str.match( - /.*[\+\-\*\/\&\^\<\>\=\,\(]([A-Za-z][A-ZA-z]\w*?)\([^\)]*$/ - ); - if (str.charAt(0) == "=" && parts) { - fname = parts[1].toUpperCase(); - if (SocialCalc.Formula.FunctionList[fname]) { - SocialCalc.Formula.FillFunctionInfo(); // make sure filled - fstr = SocialCalc.special_chars( - fname + "(" + SocialCalc.Formula.FunctionArgString(fname) + ")" - ); - } else { - fstr = scc.ietUnknownFunction + fname; - } - if (inputecho.prompt.innerHTML != fstr) { - inputecho.prompt.innerHTML = fstr; - inputecho.prompt.style.display = "block"; - } - } else if (inputecho.prompt.style.display != "none") { - inputecho.prompt.innerHTML = ""; - inputecho.prompt.style.display = "none"; - } - - var editor = inputecho.editor; - - if (editor.workingvalues.currentsheet != editor.workingvalues.startsheet) { - var promptstr = - "Editing:" + - editor.workingvalues.startsheet + - "!" + - editor.workingvalues.ecoord; - if (promptstr != inputecho.topprompt.innerHTML) { - inputecho.topprompt.innerHTML = - "Editing:" + - editor.workingvalues.startsheet + - "!" + - editor.workingvalues.ecoord; - inputecho.topprompt.style.display = "block"; - } - } else { - if (inputecho.topprompt.style.display != "none") { - inputecho.topprompt.innerHTML = ""; - inputecho.topprompt.style.display = "none"; - } - } - }; - - SocialCalc.InputEchoHeartbeat = function () { - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - if (editor.state == "inputboxdirect") { - editor.inputEcho.SetText(editor.inputBox.GetText() + "_"); - } - }; - - SocialCalc.InputEchoMouseDown = function (e) { - var event = e || window.event; - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - // if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - // else event.cancelBubble = true; // IE 5+ - // if (event.preventDefault) event.preventDefault(); // DOM Level 2 - // else event.returnValue = false; // IE 5+ - - editor.inputBox.element.focus(); - - // return false; - }; - - // ************************************* - // - // CellHandles class: - // - // This object creates and controls the elements around the cursor cell for dragging, etc. - // - // ************************************* - - SocialCalc.CellHandles = function (editor) { - var scc = SocialCalc.Constants; - var functions; - - if (editor.noEdit) return; // leave us with nothing - if (scc.SCCellHandlesDisable) return; - - this.editor = editor; // the TableEditor this belongs to - - this.noCursorSuffix = false; - - this.movedmouse = false; // used to detect no-op - - this.draghandle = document.createElement("div"); - SocialCalc.setStyles( - this.draghandle, - "display:none;position:absolute;zIndex:8;border:1px solid white;width:4px;height:4px;fontSize:1px;backgroundColor:#0E93D8;cursor:default;" - ); - this.draghandle.innerHTML = " "; - editor.toplevel.appendChild(this.draghandle); - SocialCalc.AssignID(editor, this.draghandle, "draghandle"); - - var imagetype = "png"; - if (navigator.userAgent.match(/MSIE 6\.0/)) { - imagetype = "gif"; - } - - this.dragpalette = document.createElement("div"); - SocialCalc.setStyles( - this.dragpalette, - "display:none;position:absolute;zIndex:8;width:90px;height:90px;fontSize:1px;textAlign:center;cursor:default;" + - "backgroundImage:url(" + - SocialCalc.Constants.defaultImagePrefix + - "drag-handles." + - imagetype + - ");" - ); - this.dragpalette.innerHTML = " "; - editor.toplevel.appendChild(this.dragpalette); - SocialCalc.AssignID(editor, this.dragpalette, "dragpalette"); - - this.dragtooltip = document.createElement("div"); - SocialCalc.setStyles( - this.dragtooltip, - "display:none;position:absolute;zIndex:9;border:1px solid black;width:100px;height:auto;fontSize:10px;backgroundColor:#FFFFFF;" - ); - this.dragtooltip.innerHTML = " "; - editor.toplevel.appendChild(this.dragtooltip); - SocialCalc.AssignID(editor, this.dragtooltip, "dragtooltip"); - - this.fillinghandle = document.createElement("div"); - SocialCalc.setStyles( - this.fillinghandle, - "display:none;position:absolute;zIndex:9;border:1px solid black;width:auto;height:14px;fontSize:10px;backgroundColor:#FFFFFF;" - ); - this.fillinghandle.innerHTML = " "; - editor.toplevel.appendChild(this.fillinghandle); - SocialCalc.AssignID(editor, this.fillinghandle, "fillinghandle"); - - if (this.draghandle.addEventListener) { - // DOM Level 2 -- Firefox, et al - this.draghandle.addEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMoveOnHandle, - false - ); - this.dragpalette.addEventListener( - "mousedown", - SocialCalc.CellHandlesMouseDown, - false - ); - this.dragpalette.addEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMoveOnHandle, - false - ); - } else if (this.draghandle.attachEvent) { - // IE 5+ - this.draghandle.attachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMoveOnHandle - ); - this.dragpalette.attachEvent( - "onmousedown", - SocialCalc.CellHandlesMouseDown - ); - this.dragpalette.attachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMoveOnHandle - ); - } else { - // don't handle this - throw "Browser not supported"; - } - }; - - // Methods: - - SocialCalc.CellHandles.prototype.ShowCellHandles = function (show, moveshow) { - return SocialCalc.ShowCellHandles(this, show, moveshow); - }; - - // Functions: - - SocialCalc.ShowCellHandles = function (cellhandles, show, moveshow) { - var cell, cell2, position, position2; - var editor = cellhandles.editor; - var doshow = false; - var row, col, viewport; - - if (!editor) return; - - do { - // a block that can you can "break" out of easily - - if (!show) break; - - row = editor.ecell.row; - col = editor.ecell.col; - - if (editor.state != "start") break; - if (row >= editor.lastvisiblerow) break; - if (col >= editor.lastvisiblecol) break; - if (row < editor.firstscrollingrow) break; - if (col < editor.firstscrollingcol) break; - - if ( - editor.rowpositions[row + 1] + 20 > - editor.horizontaltablecontrol.controlborder - ) { - break; - } - if (editor.rowpositions[row + 1] - 10 < editor.headposition.top) { - break; - } - if ( - editor.colpositions[col + 1] + 20 > - editor.verticaltablecontrol.controlborder - ) { - break; - } - if (editor.colpositions[col + 1] - 30 < editor.headposition.left) { - break; - } - - cellhandles.draghandle.style.left = - editor.colpositions[col + 1] - 1 + "px"; - cellhandles.draghandle.style.top = - editor.rowpositions[row + 1] - 1 + "px"; - cellhandles.draghandle.style.display = "block"; - - if (moveshow) { - cellhandles.draghandle.style.display = "none"; - cellhandles.dragpalette.style.left = - editor.colpositions[col + 1] - 45 + "px"; - cellhandles.dragpalette.style.top = - editor.rowpositions[row + 1] - 45 + "px"; - cellhandles.dragpalette.style.display = "block"; - viewport = SocialCalc.GetViewportInfo(); - cellhandles.dragtooltip.style.right = - viewport.width - (editor.colpositions[col + 1] - 1) + "px"; - cellhandles.dragtooltip.style.bottom = - viewport.height - (editor.rowpositions[row + 1] - 1) + "px"; - cellhandles.dragtooltip.style.display = "none"; - } - - doshow = true; - } while (false); // only do once - - if (!doshow) { - cellhandles.draghandle.style.display = "none"; - } - if (!moveshow) { - cellhandles.dragpalette.style.display = "none"; - cellhandles.dragtooltip.style.display = "none"; - } - }; - - SocialCalc.CellHandlesMouseMoveOnHandle = function (e) { - var scc = SocialCalc.Constants; - - var event = e || window.event; - var target = event.target || event.srcElement; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (!cellhandles.editor) return true; // no handles - - if (!editor.cellhandles.mouseDown) { - editor.cellhandles.ShowCellHandles(true, true); // show move handles, too - - if (target == cellhandles.dragpalette) { - var whichhandle = SocialCalc.SegmentDivHit( - [scc.CH_radius1, scc.CH_radius2], - editor.cellhandles.dragpalette, - clientX, - clientY - ); - if (whichhandle == 0) { - // off of active part of palette - SocialCalc.CellHandlesHoverTimeout(); - return; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - cellhandles.tooltipswhichhandle = whichhandle; - cellhandles.tooltipstimer = window.setTimeout( - SocialCalc.CellHandlesTooltipsTimeout, - 700 - ); - } - - if (cellhandles.timer) { - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - cellhandles.timer = window.setTimeout( - SocialCalc.CellHandlesHoverTimeout, - 3000 - ); - } - - return; - }; - - // - // whichsegment = SocialCalc.SegmentDivHit(segtable, divWithMouseHit, x, y) - // - // Takes segtable = [upperleft quadrant, upperright, bottomright, bottomleft] - // where each quadrant is either: - // 0 = ignore hits here - // number = return this value - // array = a new segtable for this subquadrant - // - // Alternatively, segtable can be: - // [radius 1, radius 2] and it returns 0 if no hit, - // -1, -2, -3, -4 for inner quadrants, and +1...+4 for outer quadrants - // - - SocialCalc.SegmentDivHit = function (segtable, divWithMouseHit, x, y) { - var width = divWithMouseHit.offsetWidth; - var height = divWithMouseHit.offsetHeight; - var left = divWithMouseHit.offsetLeft; - var top = divWithMouseHit.offsetTop; - var v = 0; - var table = segtable; - var len = Math.sqrt( - Math.pow(x - left - (width / 2.0 - 0.5), 2) + - Math.pow(y - top - (height / 2.0 - 0.5), 2) - ); - - if (table.length == 2) { - // type 2 segtable - if ( - x >= left && - x < left + width / 2 && - y >= top && - y < top + height / 2 - ) { - // upper left - if (len <= segtable[0]) v = -1; - else if (len <= segtable[1]) v = 1; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top && - y < top + height / 2 - ) { - // upper right - if (len <= segtable[0]) v = -2; - else if (len <= segtable[1]) v = 2; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - if (len <= segtable[0]) v = -3; - else if (len <= segtable[1]) v = 3; - } - if ( - x >= left && - x < left + width / 2 && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - if (len <= segtable[0]) v = -4; - else if (len <= segtable[1]) v = 4; - } - return v; - } - - while (true) { - if ( - x >= left && - x < left + width / 2 && - y >= top && - y < top + height / 2 - ) { - // upper left - quadrant += "1"; - v = table[0]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - height = height / 2; - continue; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top && - y < top + height / 2 - ) { - // upper right - quadrant += "2"; - v = table[1]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - left = left + width; - height = height / 2; - continue; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - quadrant += "3"; - v = table[2]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - left = left + width; - height = height / 2; - top = top + height; - continue; - } - if ( - x >= left && - x < left + width / 2 && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - quadrant += "4"; - v = table[3]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - height = height / 2; - top = top + height; - continue; - } - return 0; // didn't match - } - - //addmsg((x-divWithMouseHit.offsetLeft)+","+(y-divWithMouseHit.offsetTop)+"="+quadrant+" "+v); - return v; - }; - - SocialCalc.CellHandlesHoverTimeout = function () { - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.timer) { - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - editor.cellhandles.ShowCellHandles(true, false); // hide move handles - }; - - SocialCalc.CellHandlesTooltipsTimeout = function () { - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - - var whichhandle = cellhandles.tooltipswhichhandle; - if (whichhandle == 0) { - // off of active part of palette - SocialCalc.CellHandlesHoverTimeout(); - return; - } - if (whichhandle == -3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillAllTooltip; - } else if (whichhandle == 3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillContentsTooltip; - } else if (whichhandle == -2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteAllTooltip; - } else if (whichhandle == -4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertAllTooltip; - } else if (whichhandle == 2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteContentsTooltip; - } else if (whichhandle == 4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertContentsTooltip; - } else { - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - return; - } - - cellhandles.dragtooltip.style.display = "block"; - }; - - SocialCalc.CellHandlesMouseDown = function (e) { - var scc = SocialCalc.Constants; - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (editor.busy) return; // don't do anything when busy (is this correct?) - - var cellhandles = editor.cellhandles; - - cellhandles.movedmouse = false; // detect no-op - - if (cellhandles.timer) { - // cancel timer - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - - range = editor.range; - - var whichhandle = SocialCalc.SegmentDivHit( - [scc.CH_radius1, scc.CH_radius2], - editor.cellhandles.dragpalette, - clientX, - clientY - ); - if (whichhandle == 1 || whichhandle == -1 || whichhandle == 0) { - cellhandles.ShowCellHandles(true, false); // hide move handles - return; - } - - mouseinfo.ignore = true; // stop other code from looking at the mouse - - if (whichhandle == -3) { - cellhandles.dragtype = "Fill"; - // mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } else if (whichhandle == 3) { - cellhandles.dragtype = "FillC"; - // mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } else if (whichhandle == -2) { - cellhandles.dragtype = "Move"; - // mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } else if (whichhandle == -4) { - cellhandles.dragtype = "MoveI"; - // mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } else if (whichhandle == 2) { - cellhandles.dragtype = "MoveC"; - // mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } else if (whichhandle == 4) { - cellhandles.dragtype = "MoveIC"; - // mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } - - cellhandles.filltype = null; - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - break; - - case "Move": - case "MoveI": - case "MoveC": - case "MoveIC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.RangeRemove(); - break; - - default: - return; // not for us - } - - cellhandles.fillinghandle.style.left = clientX + "px"; - cellhandles.fillinghandle.style.top = clientY - 17 + "px"; - cellhandles.fillinghandle.innerHTML = - scc.s_CHindicatorOperationLookup[cellhandles.dragtype] + - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - cellhandles.ShowCellHandles(true, false); // hide move handles - cellhandles.mouseDown = true; - - mouseinfo.editor = editor; // remember for later - - coord = editor.ecell.coord; // start with cell with handles - - cellhandles.startingcoord = coord; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - - mouseinfo.mouselastcoord = coord; - - SocialCalc.KeyboardSetFocus(editor); - - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMove, - true - ); // capture everywhere - document.addEventListener("mouseup", SocialCalc.CellHandlesMouseUp, true); // capture everywhere - } else if (cellhandles.draghandle.attachEvent) { - // IE 5+ - cellhandles.draghandle.setCapture(); - cellhandles.draghandle.attachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMove - ); - cellhandles.draghandle.attachEvent( - "onmouseup", - SocialCalc.CellHandlesMouseUp - ); - cellhandles.draghandle.attachEvent( - "onlosecapture", - SocialCalc.CellHandlesMouseUp - ); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.CellHandlesMouseMove = function (e) { - var scc = SocialCalc.Constants; - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - var crstart, crend, cr, c, r; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat( - editor, - result, - SocialCalc.CellHandlesDragAutoRepeat - ); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - - cellhandles.movedmouse = true; // did move, so not no-op - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (result.coord == cellhandles.startingcoord) { - // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } else { - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Down") { - // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Down"; - } else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Right"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord != mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (result.coord != mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - c = editor.range2.right - editor.range2.left + result.col; - r = editor.range2.bottom - editor.range2.top + result.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (result.coord == cellhandles.startingcoord) { - // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } else { - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Vertical") { - // coerse to that - crend.col = editor.range2.left; - if ( - crend.row >= editor.range2.top && - crend.row <= editor.range2.bottom + 1 - ) - crend.row = editor.range2.bottom + 2; - } else { - crend.row = editor.range2.top; - if ( - crend.col >= editor.range2.left && - crend.col <= editor.range2.right + 1 - ) - crend.col = editor.range2.right + 2; - } - } else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Vertical"; - } else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Horizontal"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord != mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - if (!cellhandles.filltype) { - // no fill type - editor.RangeRemove(); - } else { - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - } - break; - } - - cellhandles.fillinghandle.style.left = clientX + "px"; - cellhandles.fillinghandle.style.top = clientY - 17 + "px"; - cellhandles.fillinghandle.innerHTML = - scc.s_CHindicatorOperationLookup[cellhandles.dragtype] + - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - mouseinfo.mouselastcoord = result.coord; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.CellHandlesDragAutoRepeat = function (coord, direction) { - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - var crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - var crend = SocialCalc.coordToCr(coord); - - var newcoord, c, r; - - var vscroll = 0; - var hscroll = 0; - - if (direction == "left") hscroll = -1; - else if (direction == "right") hscroll = 1; - else if (direction == "up") vscroll = -1; - else if (direction == "down") vscroll = 1; - editor.ScrollRelativeBoth(vscroll, hscroll); - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Down") { - // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord != mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (coord != mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - c = editor.range2.right - editor.range2.left + editor.ecell.col; - r = editor.range2.bottom - editor.range2.top + editor.ecell.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Vertical") { - // coerse to that - crend.col = editor.range2.left; - if ( - crend.row >= editor.range2.top && - crend.row <= editor.range2.bottom + 1 - ) - crend.row = editor.range2.bottom + 2; - } else { - crend.row = editor.range2.top; - if ( - crend.col >= editor.range2.left && - crend.col <= editor.range2.right + 1 - ) - crend.col = editor.range2.right + 2; - } - } else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord != mouseinfo.mouselastcoord) { - editor.MoveECell(newcoord); - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - } - - mouseinfo.mouselastcoord = newcoord; - }; - - SocialCalc.CellHandlesMouseUp = function (e) { - var editor, - element, - result, - coord, - now, - textarea, - sheetobj, - cellobj, - wval, - cstr, - cmdtype, - cmdtype2; - var crstart, crend; - var sizec, sizer, deltac, deltar; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - mouseinfo.ignore = false; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - cellhandles.mouseDown = false; - cellhandles.noCursorSuffix = false; - - cellhandles.fillinghandle.style.display = "none"; - - if (!result) result = {}; - if (!result.coord) result.coord = editor.ecell.coord; - - switch (cellhandles.dragtype) { - case "Fill": - case "Move": - case "MoveI": - cmdtype2 = " all"; - break; - case "FillC": - case "MoveC": - case "MoveIC": - cmdtype2 = " formulas"; - break; - } - - if (!cellhandles.movedmouse) { - // didn't move: just leave one cell selected - cellhandles.dragtype = "Nothing"; - } - - switch (cellhandles.dragtype) { - case "Nothing": - editor.Range2Remove(); - editor.RangeRemove(); - break; - - case "Fill": - case "FillC": - crstart = SocialCalc.coordToCr(cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - if (cellhandles.filltype) { - if (cellhandles.filltype == "Down") { - crend.col = crstart.col; - } else { - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - - editor.MoveECell(result.coord); - editor.RangeExtend(); - - if (editor.cellhandles.filltype == "Right") { - cmdtype = "right"; - } else { - cmdtype = "down"; - } - cstr = - "fill" + - cmdtype + - " " + - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom) + - cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - break; - - case "Move": - case "MoveC": - editor.context.cursorsuffix = ""; - cstr = - "movepaste " + - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + - ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) + - " " + - editor.ecell.coord + - cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - - break; - - case "MoveI": - case "MoveIC": - editor.context.cursorsuffix = ""; - sizec = editor.range2.right - editor.range2.left; - sizer = editor.range2.bottom - editor.range2.top; - deltac = editor.ecell.col - editor.range2.left; - deltar = editor.ecell.row - editor.range2.top; - cstr = - "moveinsert " + - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + - ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) + - " " + - editor.ecell.coord + - cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - editor.RangeRemove(); - if (editor.cellhandles.filltype == " Horizontal" && deltac > 0) { - editor.MoveECell( - SocialCalc.crToCoord(editor.ecell.col - sizec - 1, editor.ecell.row) - ); - } else if (editor.cellhandles.filltype == " Vertical" && deltar > 0) { - editor.MoveECell( - SocialCalc.crToCoord(editor.ecell.col, editor.ecell.row - sizer - 1) - ); - } - editor.RangeAnchor( - SocialCalc.crToCoord( - editor.ecell.col + sizec, - editor.ecell.row + sizer - ) - ); - editor.RangeExtend(); - - break; - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMove, - true - ); - document.removeEventListener( - "mouseup", - SocialCalc.CellHandlesMouseUp, - true - ); - } else if (cellhandles.draghandle.detachEvent) { - // IE - cellhandles.draghandle.detachEvent( - "onlosecapture", - SocialCalc.CellHandlesMouseUp - ); - cellhandles.draghandle.detachEvent( - "onmouseup", - SocialCalc.CellHandlesMouseUp - ); - cellhandles.draghandle.detachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMove - ); - cellhandles.draghandle.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - }; - - // ************************************* - // - // TableControl class: - // - // This class deals with the horizontal and verical scrollbars and pane sliders. - // - // +--------------+ - // | Endcap | - // +- - - - - - - + - // | | - // +--------------+ - // | Pane Slider | - // +--------------+ - // | | - // | Less Button | - // | | - // +--------------+ - // | Scroll Area | - // | | - // | | - // +--------------+ - // | Thumb | - // +--------------+ - // | | - // +--------------+ - // | | - // | More Button | - // | | - // +--------------+ - // - // ************************************* - - SocialCalc.TableControl = function (editor, vertical, size) { - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - - this.vertical = vertical; // true if vertical control, false if horizontal - this.size = size; // length in pixels - - this.main = null; // main element containing all the others - this.endcap = null; // the area at the top/left between the end and the pane slider - this.paneslider = null; // the slider to adjust the pane split - this.lessbutton = null; // the top/left scroll button - this.morebutton = null; // the bottom/right scroll button - this.scrollarea = null; // the area between the scroll buttons - this.thumb = null; // the sliding thing in the scrollarea - - // computed position values: - - this.controlborder = null; // left or top screen position for vertical or horizontal control - this.endcapstart = null; // top or left screen position for vertical or horizontal control - this.panesliderstart = null; - this.lessbuttonstart = null; - this.morebuttonstart = null; - this.scrollareastart = null; - this.scrollareaend = null; - this.scrollareasize = null; - this.thumbpos = null; - - // constants: - - this.controlthickness = scc.defaultTableControlThickness; // other dimension of complete control in pixels - this.sliderthickness = scc.defaultTCSliderThickness; - this.buttonthickness = scc.defaultTCButtonThickness; - this.thumbthickness = scc.defaultTCThumbThickness; - this.minscrollingpanesize = - this.buttonthickness + this.buttonthickness + this.thumbthickness + 20; // the 20 is to leave a little space - }; - - // Methods: - - SocialCalc.TableControl.prototype.CreateTableControl = function () { - return SocialCalc.CreateTableControl(this); - }; - SocialCalc.TableControl.prototype.PositionTableControlElements = function () { - SocialCalc.PositionTableControlElements(this); - }; - SocialCalc.TableControl.prototype.ComputeTableControlPositions = function () { - SocialCalc.ComputeTableControlPositions(this); - }; - - // Functions: - - SocialCalc.CreateTableControl = function (control) { - var s, functions, params; - var AssignID = SocialCalc.AssignID; - var setStyles = SocialCalc.setStyles; - var scc = SocialCalc.Constants; - var TooltipRegister = function (element, etype, vh) { - if (scc["s_" + etype + "Tooltip" + vh]) { - SocialCalc.TooltipRegister( - element, - scc["s_" + etype + "Tooltip" + vh], - null - ); - } - }; - - var imageprefix = control.editor.imageprefix; - var vh = control.vertical ? "v" : "h"; - - control.main = document.createElement("div"); - s = control.main.style; - s.height = - (control.vertical ? control.size : control.controlthickness) + "px"; - s.width = - (control.vertical ? control.controlthickness : control.size) + "px"; - s.zIndex = 0; - setStyles(control.main, scc.TCmainStyle); - s.backgroundImage = "url(" + imageprefix + "main-" + vh + ".gif)"; - if (scc.TCmainClass) control.main.className = scc.TCmainClass; - - control.main.style.display = "none"; // wait for layout - - control.endcap = document.createElement("div"); - s = control.endcap.style; - s.height = control.controlthickness + "px"; - s.width = control.controlthickness + "px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.endcap, scc.TCendcapStyle); - s.backgroundImage = "url(" + imageprefix + "endcap-" + vh + ".gif)"; - if (scc.TCendcapClass) control.endcap.className = scc.TCendcapClass; - AssignID(control.editor, control.endcap, "endcap" + vh); - - control.main.appendChild(control.endcap); - - control.paneslider = document.createElement("div"); - s = control.paneslider.style; - s.height = - (control.vertical ? control.sliderthickness : control.controlthickness) + - "px"; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.width = - (control.vertical ? control.controlthickness : control.sliderthickness) + - "px"; - s.position = "absolute"; - s[control.vertical ? "top" : "left"] = "4px"; - s.zIndex = 3; - setStyles(control.paneslider, scc.TCpanesliderStyle); - s.backgroundImage = "url(" + imageprefix + "paneslider-" + vh + ".gif)"; - if (scc.TCpanesliderClass) - control.paneslider.className = scc.TCpanesliderClass; - AssignID(control.editor, control.paneslider, "paneslider" + vh); - TooltipRegister(control.paneslider, "paneslider", vh); - - functions = { - MouseDown: SocialCalc.TCPSDragFunctionStart, - MouseMove: SocialCalc.TCPSDragFunctionMove, - MouseUp: SocialCalc.TCPSDragFunctionStop, - Disabled: function () { - return control.editor.busy; - }, - }; - - functions.control = control; // make sure this is there - - SocialCalc.DragRegister( - control.paneslider, - control.vertical, - !control.vertical, - functions - ); - - control.main.appendChild(control.paneslider); - - control.lessbutton = document.createElement("div"); - s = control.lessbutton.style; - s.height = - (control.vertical ? control.buttonthickness : control.controlthickness) + - "px"; - s.width = - (control.vertical ? control.controlthickness : control.buttonthickness) + - "px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.lessbutton, scc.TClessbuttonStyle); - s.backgroundImage = "url(" + imageprefix + "less-" + vh + "n.gif)"; - if (scc.TClessbuttonClass) - control.lessbutton.className = scc.TClessbuttonClass; - AssignID(control.editor, control.lessbutton, "lessbutton" + vh); - - params = { - repeatwait: scc.TClessbuttonRepeatWait, - repeatinterval: scc.TClessbuttonRepeatInterval, - normalstyle: - "backgroundImage:url(" + imageprefix + "less-" + vh + "n.gif);", - downstyle: - "backgroundImage:url(" + imageprefix + "less-" + vh + "d.gif);", - hoverstyle: - "backgroundImage:url(" + imageprefix + "less-" + vh + "h.gif);", - }; - functions = { - MouseDown: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, -1); - }, - Repeat: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, -1); - }, - Disabled: function () { - return control.editor.busy; - }, - }; - - SocialCalc.ButtonRegister(control.lessbutton, params, functions); - - control.main.appendChild(control.lessbutton); - - control.morebutton = document.createElement("div"); - s = control.morebutton.style; - s.height = - (control.vertical ? control.buttonthickness : control.controlthickness) + - "px"; - s.width = - (control.vertical ? control.controlthickness : control.buttonthickness) + - "px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.morebutton, scc.TCmorebuttonStyle); - s.backgroundImage = "url(" + imageprefix + "more-" + vh + "n.gif)"; - if (scc.TCmorebuttonClass) - control.morebutton.className = scc.TCmorebuttonClass; - AssignID(control.editor, control.morebutton, "morebutton" + vh); - - params = { - repeatwait: scc.TCmorebuttonRepeatWait, - repeatinterval: scc.TCmorebuttonRepeatInterval, - normalstyle: - "backgroundImage:url(" + imageprefix + "more-" + vh + "n.gif);", - downstyle: - "backgroundImage:url(" + imageprefix + "more-" + vh + "d.gif);", - hoverstyle: - "backgroundImage:url(" + imageprefix + "more-" + vh + "h.gif);", - }; - functions = { - MouseDown: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, +1); - }, - Repeat: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, +1); - }, - Disabled: function () { - return control.editor.busy; - }, - }; - - SocialCalc.ButtonRegister(control.morebutton, params, functions); - - control.main.appendChild(control.morebutton); - - control.scrollarea = document.createElement("div"); - s = control.scrollarea.style; - s.height = control.controlthickness + "px"; - s.width = control.controlthickness + "px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.scrollarea, scc.TCscrollareaStyle); - s.backgroundImage = "url(" + imageprefix + "scrollarea-" + vh + ".gif)"; - if (scc.TCscrollareaClass) - control.scrollarea.className = scc.TCscrollareaClass; - AssignID(control.editor, control.scrollarea, "scrollarea" + vh); - - params = { - repeatwait: scc.TCscrollareaRepeatWait, - repeatinterval: scc.TCscrollareaRepeatWait, - }; - functions = { - MouseDown: SocialCalc.ScrollAreaClick, - Repeat: SocialCalc.ScrollAreaClick, - Disabled: function () { - return control.editor.busy; - }, - }; - functions.control = control; - - SocialCalc.ButtonRegister(control.scrollarea, params, functions); - - control.main.appendChild(control.scrollarea); - - control.thumb = document.createElement("div"); - s = control.thumb.style; - s.height = - (control.vertical ? control.thumbthickness : control.controlthickness) + - "px"; - s.width = - (control.vertical ? control.controlthickness : control.thumbthickness) + - "px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.thumb, scc.TCthumbStyle); - control.thumb.style.backgroundImage = - "url(" + imageprefix + "thumb-" + vh + "n.gif)"; - if (scc.TCthumbClass) control.thumb.className = scc.TCthumbClass; - AssignID(control.editor, control.thumb, "thumb" + vh); - - functions = { - MouseDown: SocialCalc.TCTDragFunctionStart, - MouseMove: SocialCalc.TCTDragFunctionMove, - MouseUp: SocialCalc.TCTDragFunctionStop, - Disabled: function () { - return control.editor.busy; - }, - }; - functions.control = control; // make sure this is there - SocialCalc.DragRegister( - control.thumb, - control.vertical, - !control.vertical, - functions - ); - - params = { - normalstyle: - "backgroundImage:url(" + imageprefix + "thumb-" + vh + "n.gif)", - name: "Thumb", - downstyle: - "backgroundImage:url(" + imageprefix + "thumb-" + vh + "d.gif)", - hoverstyle: - "backgroundImage:url(" + imageprefix + "thumb-" + vh + "h.gif)", - }; - SocialCalc.ButtonRegister(control.thumb, params, null); // give it button-like visual behavior - - control.main.appendChild(control.thumb); - - return control.main; - }; - - // - // ScrollAreaClick - Button function to process pageup/down clicks - // - - SocialCalc.ScrollAreaClick = function (e, buttoninfo, bobj) { - var control = bobj.functionobj.control; - var bposition = SocialCalc.GetElementPosition(bobj.element); - var clickpos = control.vertical ? buttoninfo.clientY : buttoninfo.clientX; - if (control.editor.busy) { - // ignore if busy - wait for next repeat - return; - } - control.editor.PageRelative( - control.vertical, - clickpos > control.thumbpos ? 1 : -1 - ); - - return; - }; - - // - // PositionTableControlElements - // - - SocialCalc.PositionTableControlElements = function (control) { - var border, realend, thumbpos; - - var editor = control.editor; - - if (control.vertical) { - border = control.controlborder + "px"; - control.endcap.style.top = control.endcapstart + "px"; - control.endcap.style.left = border; - control.paneslider.style.top = control.panesliderstart + "px"; - control.paneslider.style.left = border; - control.lessbutton.style.top = control.lessbuttonstart + "px"; - control.lessbutton.style.left = border; - control.morebutton.style.top = control.morebuttonstart + "px"; - control.morebutton.style.left = border; - control.scrollarea.style.top = control.scrollareastart + "px"; - control.scrollarea.style.left = border; - control.scrollarea.style.height = control.scrollareasize + "px"; - realend = Math.max( - editor.context.sheetobj.attribs.lastrow, - editor.firstscrollingrow + 1 - ); - thumbpos = - ((editor.firstscrollingrow - (editor.lastnonscrollingrow + 1)) * - (control.scrollareasize - 3 * control.thumbthickness)) / - (realend - (editor.lastnonscrollingrow + 1)) + - control.scrollareastart - - 1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.top = thumbpos + "px"; - control.thumb.style.left = border; - } else { - border = control.controlborder + "px"; - control.endcap.style.left = control.endcapstart + "px"; - control.endcap.style.top = border; - control.paneslider.style.left = control.panesliderstart + "px"; - control.paneslider.style.top = border; - control.lessbutton.style.left = control.lessbuttonstart + "px"; - control.lessbutton.style.top = border; - control.morebutton.style.left = control.morebuttonstart + "px"; - control.morebutton.style.top = border; - control.scrollarea.style.left = control.scrollareastart + "px"; - control.scrollarea.style.top = border; - control.scrollarea.style.width = control.scrollareasize + "px"; - realend = Math.max( - editor.context.sheetobj.attribs.lastcol, - editor.firstscrollingcol + 1 - ); - thumbpos = - ((editor.firstscrollingcol - (editor.lastnonscrollingcol + 1)) * - (control.scrollareasize - control.thumbthickness)) / - (realend - editor.lastnonscrollingcol) + - control.scrollareastart - - 1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.left = thumbpos + "px"; - control.thumb.style.top = border; - } - control.thumbpos = thumbpos; - control.main.style.display = "block"; - }; - - // - // ComputeTableControlPositions - // - // This routine computes the screen positions and other values needed for laying out - // the table control elements. - // - - SocialCalc.ComputeTableControlPositions = function (control) { - var editor = control.editor; - - if (!editor.gridposition || !editor.headposition) - throw "Can't compute table control positions before editor positions"; - - if (control.vertical) { - control.controlborder = editor.gridposition.left + editor.tablewidth; // border=left position - control.endcapstart = editor.gridposition.top; // start=top position - control.panesliderstart = - editor.firstscrollingrowtop - control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingrowtop - 1; - control.morebuttonstart = - editor.gridposition.top + editor.tableheight - control.buttonthickness; - control.scrollareastart = - editor.firstscrollingrowtop - 1 + control.buttonthickness; - control.scrollareaend = control.morebuttonstart - 1; - control.scrollareasize = - control.scrollareaend - control.scrollareastart + 1; - } else { - control.controlborder = editor.gridposition.top + editor.tableheight; // border=top position - control.endcapstart = editor.gridposition.left; // start=left position - control.panesliderstart = - editor.firstscrollingcolleft - control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingcolleft - 1; - control.morebuttonstart = - editor.gridposition.left + editor.tablewidth - control.buttonthickness; - control.scrollareastart = - editor.firstscrollingcolleft - 1 + control.buttonthickness; - control.scrollareaend = control.morebuttonstart - 1; - control.scrollareasize = - control.scrollareaend - control.scrollareastart + 1; - } - }; - - ////// TCPS - TableControl Pan Slider methods - - // - // TCPSDragFunctionStart(event, draginfo, dobj) - // - // TableControlPaneSlider function for starting drag - // - - SocialCalc.TCPSDragFunctionStart = function (event, draginfo, dobj) { - var editor = dobj.functionobj.control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - draginfo.trackingline = document.createElement("div"); - draginfo.trackingline.style.height = dobj.vertical - ? scc.TCPStrackinglineThickness - : editor.tableheight - - (editor.headposition.top - editor.gridposition.top) + - "px"; - draginfo.trackingline.style.width = dobj.vertical - ? editor.tablewidth - - (editor.headposition.left - editor.gridposition.left) + - "px" - : scc.TCPStrackinglineThickness; - draginfo.trackingline.style.backgroundImage = - "url(" + - editor.imageprefix + - "trackingline-" + - (dobj.vertical ? "v" : "h") + - ".gif)"; - if (scc.TCPStrackinglineClass) - draginfo.trackingline.className = scc.TCPStrackinglineClass; - SocialCalc.setStyles(draginfo.trackingline, scc.TCPStrackinglineStyle); - - if (dobj.vertical) { - row = SocialCalc.Lookup( - draginfo.clientY + dobj.functionobj.control.sliderthickness, - editor.rowpositions - ); - draginfo.trackingline.style.top = - (editor.rowpositions[row] || editor.headposition.top) + "px"; - draginfo.trackingline.style.left = editor.headposition.left + "px"; - if (editor.context.rowpanes.length - 1) { - // has 2 already - editor.context.SetRowPaneFirstLast( - 1, - editor.context.rowpanes[0].last + 1, - editor.context.rowpanes[0].last + 1 - ); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } else { - col = SocialCalc.Lookup( - draginfo.clientX + dobj.functionobj.control.sliderthickness, - editor.colpositions - ); - draginfo.trackingline.style.top = editor.headposition.top + "px"; - draginfo.trackingline.style.left = - (editor.colpositions[col] || editor.headposition.left) + "px"; - if (editor.context.colpanes.length - 1) { - // has 2 already - editor.context.SetColPaneFirstLast( - 1, - editor.context.colpanes[0].last + 1, - editor.context.colpanes[0].last + 1 - ); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } - - editor.griddiv.appendChild(draginfo.trackingline); - }; - - // - // TCPSDragFunctionMove(event, draginfo, dobj) - // - - SocialCalc.TCPSDragFunctionMove = function (event, draginfo, dobj) { - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup( - draginfo.clientY + sliderthickness, - editor.rowpositions - ); - draginfo.trackingline.style.top = - (editor.rowpositions[row] || editor.headposition.top) + "px"; - } else { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup( - draginfo.clientX + sliderthickness, - editor.colpositions - ); - draginfo.trackingline.style.left = - (editor.colpositions[col] || editor.headposition.left) + "px"; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - }; - - // - // TCPSDragFunctionStop(event, draginfo, dobj) - // - - SocialCalc.TCPSDragFunctionStop = function (event, draginfo, dobj) { - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup( - draginfo.clientY + sliderthickness, - editor.rowpositions - ); - if (row > editor.context.sheetobj.attribs.lastrow) - row = editor.context.sheetobj.attribs.lastrow; // can't extend sheet here - if (!row || row <= editor.context.rowpanes[0].first) { - // set to no panes, leaving first pane settings - if (editor.context.rowpanes.length > 1) - editor.context.rowpanes.length = 1; - } else if (editor.context.rowpanes.length - 1) { - // has 2 already - if (!editor.timeout) { - // not waiting for position calc (so positions could be wrong) - editor.context.SetRowPaneFirstLast( - 0, - editor.context.rowpanes[0].first, - row - 1 - ); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } else { - editor.context.SetRowPaneFirstLast( - 0, - editor.context.rowpanes[0].first, - row - 1 - ); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } else { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup( - draginfo.clientX + sliderthickness, - editor.colpositions - ); - if (col > editor.context.sheetobj.attribs.lastcol) - col = editor.context.sheetobj.attribs.lastcol; // can't extend sheet here - if (!col || col <= editor.context.colpanes[0].first) { - // set to no panes, leaving first pane settings - if (editor.context.colpanes.length > 1) - editor.context.colpanes.length = 1; - } else if (editor.context.colpanes.length - 1) { - // has 2 already - if (!editor.timeout) { - // not waiting for position calc (so positions could be wrong) - editor.context.SetColPaneFirstLast( - 0, - editor.context.colpanes[0].first, - col - 1 - ); - editor.context.SetColPaneFirstLast(1, col, col); - } - } else { - editor.context.SetColPaneFirstLast( - 0, - editor.context.colpanes[0].first, - col - 1 - ); - editor.context.SetColPaneFirstLast(1, col, col); - } - } - - editor.FitToEditTable(); - - editor.griddiv.removeChild(draginfo.trackingline); - - editor.ScheduleRender(); - }; - - ////// TCT - TableControl Thumb methods - - //!!!! Note: Need to make start use same code as move/stop for determining row/col, since stop will set that - //!!!! Note: Need to make start/move/stop use positioning code that corresponds closer to - //!!!! ComputeTableControlPositions calculations. - - // - // TCTDragFunctionStart(event, draginfo, dobj) - // - // TableControlThumb function for starting drag - // - - SocialCalc.TCTDragFunctionStart = function (event, draginfo, dobj) { - var rowpane, colpane, row, col; - - var control = dobj.functionobj.control; - var editor = control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - if (draginfo.thumbstatus) { - // get rid of old one if mouseup was out of window - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) - draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - } - - draginfo.thumbstatus = document.createElement("div"); - - if (dobj.vertical) { - if (scc.TCTDFSthumbstatusvClass) - draginfo.thumbstatus.className = scc.TCTDFSthumbstatusvClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatusvStyle); - draginfo.thumbstatus.style.top = - draginfo.clientY + scc.TCTDFStopOffsetv + "px"; - draginfo.thumbstatus.style.left = - control.controlborder - 10 - editor.tablewidth / 2 + "px"; - draginfo.thumbstatus.style.width = editor.tablewidth / 2 + "px"; - - draginfo.thumbcontext = new SocialCalc.RenderContext( - editor.context.sheetobj - ); - draginfo.thumbcontext.showGrid = true; - draginfo.thumbcontext.rowpanes = [{ first: 1, last: 1 }]; - var pane = editor.context.colpanes[editor.context.colpanes.length - 1]; - draginfo.thumbcontext.colpanes = [{ first: pane.first, last: pane.last }]; - draginfo.thumbstatus.innerHTML = - '
msg
preview
'; - draginfo.thumbstatus.rowmsgele = - draginfo.thumbstatus.firstChild.firstChild.firstChild.firstChild.firstChild; - draginfo.thumbstatus.rowpreviewele = - draginfo.thumbstatus.firstChild.firstChild.firstChild.childNodes[1].firstChild; - editor.toplevel.appendChild(draginfo.thumbstatus); - SocialCalc.TCTDragFunctionRowSetStatus( - draginfo, - editor, - editor.firstscrollingrow || 1 - ); - } else { - if (scc.TCTDFSthumbstatushClass) - draginfo.thumbstatus.className = scc.TCTDFSthumbstatushClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatushStyle); - draginfo.thumbstatus.style.top = - control.controlborder + scc.TCTDFStopOffseth + "px"; - draginfo.thumbstatus.style.left = - draginfo.clientX + scc.TCTDFSleftOffseth + "px"; - editor.toplevel.appendChild(draginfo.thumbstatus); - draginfo.thumbstatus.innerHTML = - scc.s_TCTDFthumbstatusPrefixh + - SocialCalc.rcColname(editor.firstscrollingcol); - } - }; - - // - // SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, row) - // - // Render partial row - // - - SocialCalc.TCTDragFunctionRowSetStatus = function (draginfo, editor, row) { - var scc = SocialCalc.Constants; - var msg = scc.s_TCTDFthumbstatusPrefixv + row + " "; - - draginfo.thumbstatus.rowmsgele.innerHTML = msg; - - draginfo.thumbcontext.rowpanes = [{ first: row, last: row }]; - draginfo.thumbrowshown = row; - - var ele = draginfo.thumbcontext.RenderSheet( - draginfo.thumbstatus.rowpreviewele.firstChild, - { type: "html" } - ); - }; - - // - // TCTDragFunctionMove(event, draginfo, dobj) - // - - SocialCalc.TCTDragFunctionMove = function (event, draginfo, dobj) { - var first, msg; - var control = dobj.functionobj.control; - var thumbthickness = control.thumbthickness; - var editor = control.editor; - var scc = SocialCalc.Constants; - - if (dobj.vertical) { - if ( - draginfo.clientY > - control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2 - ) - draginfo.clientY = - control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2; - if (draginfo.clientY < control.scrollareastart - draginfo.offsetY - 1) - draginfo.clientY = control.scrollareastart - draginfo.offsetY - 1; - draginfo.thumbstatus.style.top = draginfo.clientY + "px"; - - first = - ((draginfo.clientY + draginfo.offsetY - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastrow - - editor.lastnonscrollingrow) + - editor.lastnonscrollingrow + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) - first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) - first = editor.context.sheetobj.attribs.lastrow; - // msg = scc.s_TCTDFthumbstatusPrefixv+first; - if (first != draginfo.thumbrowshown) { - SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, first); - } - } else { - if ( - draginfo.clientX > - control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2 - ) - draginfo.clientX = - control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2; - if (draginfo.clientX < control.scrollareastart - draginfo.offsetX - 1) - draginfo.clientX = control.scrollareastart - draginfo.offsetX - 1; - draginfo.thumbstatus.style.left = draginfo.clientX + "px"; - - first = - ((draginfo.clientX + draginfo.offsetX - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastcol - - editor.lastnonscrollingcol) + - editor.lastnonscrollingcol + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) - first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) - first = editor.context.sheetobj.attribs.lastcol; - msg = scc.s_TCTDFthumbstatusPrefixh + SocialCalc.rcColname(first); - draginfo.thumbstatus.innerHTML = msg; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - }; - - // - // TCTDragFunctionStop(event, draginfo, dobj) - // - - SocialCalc.TCTDragFunctionStop = function (event, draginfo, dobj) { - var first; - var control = dobj.functionobj.control; - var editor = control.editor; - - if (dobj.vertical) { - first = - ((draginfo.clientY + draginfo.offsetY - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastrow - - editor.lastnonscrollingrow) + - editor.lastnonscrollingrow + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) - first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) - first = editor.context.sheetobj.attribs.lastrow; - - editor.context.SetRowPaneFirstLast( - editor.context.rowpanes.length - 1, - first, - first + 1 - ); - } else { - first = - ((draginfo.clientX + draginfo.offsetX - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastcol - - editor.lastnonscrollingcol) + - editor.lastnonscrollingcol + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) - first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) - first = editor.context.sheetobj.attribs.lastcol; - - editor.context.SetColPaneFirstLast( - editor.context.colpanes.length - 1, - first, - first + 1 - ); - } - - editor.FitToEditTable(); - - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) - draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - - editor.ScheduleRender(); - }; - - // ************************************* - // - // Dragging functions: - // - // ************************************* - - SocialCalc.DragInfo = { - // There is only one of these -- no "new" is done. - // Only one dragging operation can be active at a time. - // The registeredElements array is used to decide which item to drag. - - // One item for each draggable thing, each an object with: - // .element, .vertical, .horizontal, .functionobj - - registeredElements: [], - - // Items used during a drag - - draggingElement: null, // item being processed (.element is the actual element) - startX: 0, - startY: 0, - startZ: 0, - clientX: 0, // modifyable version to restrict movement - clientY: 0, - offsetX: 0, - offsetY: 0, - horizontalScroll: 0, // retrieved at drag start - verticalScroll: 0, - }; - - // - // DragRegister(element, vertical, horizontal, functionobj) - make element draggable - // - // The functionobj defaults to moving the element contrained only by vertical and horizontal settings. - // - - SocialCalc.DragRegister = function ( - element, - vertical, - horizontal, - functionobj - ) { - var draginfo = SocialCalc.DragInfo; - - if (!functionobj) { - functionobj = { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - }; - } - - draginfo.registeredElements.push({ - element: element, - vertical: vertical, - horizontal: horizontal, - functionobj: functionobj, - }); - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.DragMouseDown, false); - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousedown", SocialCalc.DragMouseDown); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - }; - - // - // DragUnregister(element) - remove object from list - // - - SocialCalc.DragUnregister = function (element) { - var draginfo = SocialCalc.DragInfo; - - var i; - - if (!element) return; - - for (i = 0; i < draginfo.registeredElements.length; i++) { - if (draginfo.registeredElements[i].element == element) { - draginfo.registeredElements.splice(i, 1); - if (element.removeEventListener) { - // DOM Level 2 -- Firefox, et al - element.removeEventListener( - "mousedown", - SocialCalc.DragMouseDown, - false - ); - } else { - // IE 5+ - element.detachEvent("onmousedown", SocialCalc.DragMouseDown); - } - return; - } - } - - return; // ignore if not in list - }; - - // - // DragMouseDown(event) - // - - SocialCalc.DragMouseDown = function (event) { - var e = event || window.event; - - var draginfo = SocialCalc.DragInfo; - - var dobj = SocialCalc.LookupElement( - e.target || e.srcElement, - draginfo.registeredElements - ); - if (!dobj) return; - - if (dobj && dobj.functionobj && dobj.functionobj.Disabled) { - if (dobj.functionobj.Disabled(e, draginfo, dobj)) { - return; - } - } - - draginfo.draggingElement = dobj; - - var viewportinfo = SocialCalc.GetViewportInfo(); - draginfo.horizontalScroll = viewportinfo.horizontalScroll; - draginfo.verticalScroll = viewportinfo.verticalScroll; - - draginfo.clientX = e.clientX + draginfo.horizontalScroll; // get document-relative coordinates - draginfo.clientY = e.clientY + draginfo.verticalScroll; - draginfo.startX = draginfo.clientX; - draginfo.startY = draginfo.clientY; - draginfo.startZ = dobj.element.style.zIndex; - draginfo.offsetX = 0; - draginfo.offsetY = 0; - - dobj.element.style.zIndex = "100"; - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener("mousemove", SocialCalc.DragMouseMove, true); // capture everywhere - document.addEventListener("mouseup", SocialCalc.DragMouseUp, true); - } else if (dobj.element.attachEvent) { - // IE 5+ - dobj.element.setCapture(); - dobj.element.attachEvent("onmousemove", SocialCalc.DragMouseMove); - dobj.element.attachEvent("onmouseup", SocialCalc.DragMouseUp); - dobj.element.attachEvent("onlosecapture", SocialCalc.DragMouseUp); - } - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - if (dobj && dobj.functionobj && dobj.functionobj.MouseDown) - dobj.functionobj.MouseDown(e, draginfo, dobj); - - return false; - }; - - // - // DragMouseMove(event) - // - - SocialCalc.DragMouseMove = function (event) { - var e = event || window.event; - - var draginfo = SocialCalc.DragInfo; - draginfo.clientX = e.clientX + draginfo.horizontalScroll; - draginfo.clientY = e.clientY + draginfo.verticalScroll; - - var dobj = draginfo.draggingElement; - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - - if (dobj && dobj.functionobj && dobj.functionobj.MouseMove) - dobj.functionobj.MouseMove(e, draginfo, dobj); - - return false; - }; - - // - // DragMouseUp(event) - // - - SocialCalc.DragMouseUp = function (event) { - var e = event || window.event; - - var draginfo = SocialCalc.DragInfo; - draginfo.clientX = e.clientX + draginfo.horizontalScroll; - draginfo.clientY = e.clientY + draginfo.verticalScroll; - - var dobj = draginfo.draggingElement; - - dobj.element.style.zIndex = draginfo.startZ; - - if (dobj && dobj.functionobj && dobj.functionobj.MouseUp) - dobj.functionobj.MouseUp(e, draginfo, dobj); - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.DragMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.DragMouseUp, true); - // Note: In old (1.5?) versions of Firefox, this causes the browser to skip the MouseUp for - // the button code. https://bugzilla.mozilla.org/show_bug.cgi?id=174320 - // Firefox 1.5 is <1% share (http://marketshare.hitslink.com/report.aspx?qprid=7) - } else if (dobj.element.detachEvent) { - // IE - dobj.element.detachEvent("onlosecapture", SocialCalc.DragMouseUp); - dobj.element.detachEvent("onmouseup", SocialCalc.DragMouseUp); - dobj.element.detachEvent("onmousemove", SocialCalc.DragMouseMove); - dobj.element.releaseCapture(); - } - - draginfo.draggingElement = null; - - return false; - }; - - // - // DragFunctionStart(event, draginfo, dobj) - // - - SocialCalc.DragFunctionStart = function (event, draginfo, dobj) { - var val; - var element = dobj.functionobj.positionobj || dobj.element; - - val = element.style.top.match(/\d*/); - draginfo.offsetY = (val ? val[0] - 0 : 0) - draginfo.clientY; - val = element.style.left.match(/\d*/); - draginfo.offsetX = (val ? val[0] - 0 : 0) - draginfo.clientX; - }; - - // - // DragFunctionPosition(event, draginfo, dobj) - // - - SocialCalc.DragFunctionPosition = function (event, draginfo, dobj) { - var element = dobj.functionobj.positionobj || dobj.element; - - if (dobj.vertical) - element.style.top = draginfo.clientY + draginfo.offsetY + "px"; - if (dobj.horizontal) - element.style.left = draginfo.clientX + draginfo.offsetX + "px"; - }; - - // ************************************* - // - // Tooltip functions: - // - // ************************************* - - SocialCalc.TooltipInfo = { - // There is only one of these -- no "new" is done. - // Only one tooltip operation can be active at a time. - // The registeredElements array is used to identify items. - - // One item for each element with a tooltip, each an object with: - // .element, .tiptext, .functionobj - // Currently .functionobj can only contain .offsetx and .offsety. - // If present they are used instead of the default ones. - - registeredElements: [], - - registered: false, // if true, an event handler has been registered for this functionality - - // Items used during hover over an element - - tooltipElement: null, // item being processed (.element is the actual element) - timer: null, // timer object waiting to see if holding over element - popupElement: null, // tooltip element being displayed - clientX: 0, // modifyable version to restrict movement - clientY: 0, - offsetX: SocialCalc.Constants.TooltipOffsetX, // modifyable version to allow positioning - offsetY: SocialCalc.Constants.TooltipOffsetY, - }; - - // - // TooltipRegister(element, tiptext, functionobj) - make element have a tooltip - // - - SocialCalc.TooltipRegister = function (element, tiptext, functionobj) { - var tooltipinfo = SocialCalc.TooltipInfo; - tooltipinfo.registeredElements.push({ - element: element, - tiptext: tiptext, - functionobj: functionobj, - }); - - if (tooltipinfo.registered) return; // only need to add event listener once - - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.TooltipMouseMove, - false - ); - } else if (document.attachEvent) { - // IE 5+ - document.attachEvent("onmousemove", SocialCalc.TooltipMouseMove); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - tooltipinfo.registered = true; // remember - - return; - }; - - // - // TooltipMouseMove(event) - // - - SocialCalc.TooltipMouseMove = function (event) { - var e = event || window.event; - - var tooltipinfo = SocialCalc.TooltipInfo; - - tooltipinfo.viewport = SocialCalc.GetViewportInfo(); - tooltipinfo.clientX = e.clientX + tooltipinfo.viewport.horizontalScroll; - tooltipinfo.clientY = e.clientY + tooltipinfo.viewport.verticalScroll; - - var tobj = SocialCalc.LookupElement( - e.target || e.srcElement, - tooltipinfo.registeredElements - ); - - if (tooltipinfo.timer) { - // waiting to see if holding still: didn't hold still - window.clearTimeout(tooltipinfo.timer); // cancel timer - tooltipinfo.timer = null; - } - - if (tooltipinfo.popupElement) { - // currently displaying a tip: hide it - SocialCalc.TooltipHide(); - } - - tooltipinfo.tooltipElement = tobj || null; - - if (!tobj || SocialCalc.ButtonInfo.buttonDown) return; // if not an object with a tip or a "button" is down, ignore - - tooltipinfo.timer = window.setTimeout(SocialCalc.TooltipWaitDone, 700); - - if (tooltipinfo.tooltipElement.element.addEventListener) { - // Register event for mouse down which cancels tooltip stuff - tooltipinfo.tooltipElement.element.addEventListener( - "mousedown", - SocialCalc.TooltipMouseDown, - false - ); - } else if (tooltipinfo.tooltipElement.element.attachEvent) { - // IE - tooltipinfo.tooltipElement.element.attachEvent( - "onmousedown", - SocialCalc.TooltipMouseDown - ); - } - - return; - }; - - // - // TooltipMouseDown(event) - // - - SocialCalc.TooltipMouseDown = function (event) { - var e = event || window.event; - - var tooltipinfo = SocialCalc.TooltipInfo; - - if (tooltipinfo.timer) { - window.clearTimeout(tooltipinfo.timer); // cancel timer - tooltipinfo.timer = null; - } - - if (tooltipinfo.popupElement) { - // currently displaying a tip: hide it - SocialCalc.TooltipHide(); - } - - if (tooltipinfo.tooltipElement) { - if (tooltipinfo.tooltipElement.element.removeEventListener) { - // DOM Level 2 -- Firefox, et al - tooltipinfo.tooltipElement.element.removeEventListener( - "mousedown", - SocialCalc.TooltipMouseDown, - false - ); - } else if (tooltipinfo.tooltipElement.element.attachEvent) { - // IE 5+ - tooltipinfo.tooltipElement.element.detachEvent( - "onmousedown", - SocialCalc.TooltipMouseDown - ); - } - tooltipinfo.tooltipElement = null; - } - - return; - }; - - // - // TooltipDisplay(tobj) - // - - SocialCalc.TooltipDisplay = function (tobj) { - var tooltipinfo = SocialCalc.TooltipInfo; - var scc = SocialCalc.Constants; - var offsetX = - tobj.functionobj && typeof tobj.functionobj.offsetx == "number" - ? tobj.functionobj.offsetx - : tooltipinfo.offsetX; - var offsetY = - tobj.functionobj && typeof tobj.functionobj.offsety == "number" - ? tobj.functionobj.offsety - : tooltipinfo.offsetY; - - tooltipinfo.popupElement = document.createElement("div"); - if (scc.TDpopupElementClass) - tooltipinfo.popupElement.className = scc.TDpopupElementClass; - SocialCalc.setStyles(tooltipinfo.popupElement, scc.TDpopupElementStyle); - - tooltipinfo.popupElement.innerHTML = tobj.tiptext; - - if (tooltipinfo.clientX > tooltipinfo.viewport.width / 2) { - // on right side of screen - tooltipinfo.popupElement.style.bottom = - tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY + "px"; - tooltipinfo.popupElement.style.right = - tooltipinfo.viewport.width - tooltipinfo.clientX + offsetX + "px"; - } else { - // on left side of screen - tooltipinfo.popupElement.style.bottom = - tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY + "px"; - tooltipinfo.popupElement.style.left = - tooltipinfo.clientX + offsetX + "px"; - } - - if (tooltipinfo.clientY < 50) { - // make sure fits on screen if nothing above grid - tooltipinfo.popupElement.style.bottom = - tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY - 50 + "px"; - } - - document.body.appendChild(tooltipinfo.popupElement); - }; - - // - // TooltipHide() - // - - SocialCalc.TooltipHide = function () { - var tooltipinfo = SocialCalc.TooltipInfo; - - if (tooltipinfo.popupElement) { - tooltipinfo.popupElement.parentNode.removeChild(tooltipinfo.popupElement); - tooltipinfo.popupElement = null; - } - }; - - // - // TooltipWaitDone() - // - - SocialCalc.TooltipWaitDone = function () { - var tooltipinfo = SocialCalc.TooltipInfo; - - tooltipinfo.timer = null; - - SocialCalc.TooltipDisplay(tooltipinfo.tooltipElement); - }; - - // ************************************* - // - // Button functions: - // - // ************************************* - - SocialCalc.ButtonInfo = { - // There is only one of these -- no "new" is done. - // Only one button operation can be active at a time. - // The registeredElements array is used to identify items. - - // One item for each clickable element, each an object with: - // .element, .normalstyle, .hoverstyle, .downstyle, .repeatinterval, .functionobj - // - // .functionobj is an object with optional function objects for: - // mouseover, mouseout, mousedown, repeatinterval, mouseup, disabled - - registeredElements: [], - - // Items used during hover over an element, clicking, repeating, etc. - - buttonElement: null, // item being processed, hover or down (.element is the actual element) - doingHover: false, // true if mouse is over one of our elements - buttonDown: false, // true if button down and buttonElement not null - timer: null, // timer object for repeating - - // Used while processing an event - - horizontalScroll: 0, - verticalScroll: 0, - clientX: 0, - clientY: 0, - }; - - // - // ButtonRegister(element, paramobj, functionobj) - make element clickable - // - // The arguments (other than element) may be null (meaning no change for style and no repeat) - // The paramobj has the optional normalstyle, hoverstyle, downstyle, repeatwait, repeatinterval settings - - SocialCalc.ButtonRegister = function (element, paramobj, functionobj) { - var buttoninfo = SocialCalc.ButtonInfo; - - if (!paramobj) paramobj = {}; - - buttoninfo.registeredElements.push({ - name: paramobj.name, - element: element, - normalstyle: paramobj.normalstyle, - hoverstyle: paramobj.hoverstyle, - downstyle: paramobj.downstyle, - repeatwait: paramobj.repeatwait, - repeatinterval: paramobj.repeatinterval, - functionobj: functionobj, - }); - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.ButtonMouseDown, false); - element.addEventListener("mouseover", SocialCalc.ButtonMouseOver, false); - element.addEventListener("mouseout", SocialCalc.ButtonMouseOut, false); - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousedown", SocialCalc.ButtonMouseDown); - element.attachEvent("onmouseover", SocialCalc.ButtonMouseOver); - element.attachEvent("onmouseout", SocialCalc.ButtonMouseOut); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - }; - - // - // ButtonMouseOver(event) - // - - SocialCalc.ButtonMouseOver = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var bobj = SocialCalc.LookupElement( - e.target || e.srcElement, - buttoninfo.registeredElements - ); - - if (!bobj) return; - - if (buttoninfo.buttonDown) { - if (buttoninfo.buttonElement == bobj) { - buttoninfo.doingHover = true; // keep track whether we are on the pressed button or not - } - return; - } - - if ( - buttoninfo.buttonElement && - buttoninfo.buttonElement != bobj && - buttoninfo.doingHover - ) { - // moved to a new one, undo hover there - SocialCalc.setStyles( - buttoninfo.buttonElement.element, - buttoninfo.buttonElement.normalstyle - ); - } - - buttoninfo.buttonElement = bobj; // remember this one is hovering - buttoninfo.doingHover = true; - - SocialCalc.setStyles(bobj.element, bobj.hoverstyle); // set style (if provided) - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOver) - bobj.functionobj.MouseOver(e, buttoninfo, bobj); - - return; - }; - - // - // ButtonMouseOut(event) - // - - SocialCalc.ButtonMouseOut = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - if (buttoninfo.buttonDown) { - buttoninfo.doingHover = false; // keep track of overs and outs - return; - } - - var bobj = SocialCalc.LookupElement( - e.target || e.srcElement, - buttoninfo.registeredElements - ); - - if (buttoninfo.doingHover) { - // if there was a hover, undo it - if (buttoninfo.buttonElement) - SocialCalc.setStyles( - buttoninfo.buttonElement.element, - buttoninfo.buttonElement.normalstyle - ); - buttoninfo.buttonElement = null; - buttoninfo.doingHover = false; - } - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOut) - bobj.functionobj.MouseOut(e, buttoninfo, bobj); - - return; - }; - - // - // ButtonMouseDown(event) - // - - SocialCalc.ButtonMouseDown = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var viewportinfo = SocialCalc.GetViewportInfo(); - - var bobj = SocialCalc.LookupElement( - e.target || e.srcElement, - buttoninfo.registeredElements - ); - - if (!bobj) return; // not one of our elements - - if (bobj && bobj.functionobj && bobj.functionobj.Disabled) { - if (bobj.functionobj.Disabled(e, buttoninfo, bobj)) { - return; - } - } - - buttoninfo.buttonElement = bobj; - buttoninfo.buttonDown = true; - - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.downstyle); - - // Register event handler for mouse up - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener("mouseup", SocialCalc.ButtonMouseUp, true); // capture everywhere - } else if (bobj.element.attachEvent) { - // IE 5+ - bobj.element.setCapture(); - bobj.element.attachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.attachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - } - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - buttoninfo.horizontalScroll = viewportinfo.horizontalScroll; - buttoninfo.verticalScroll = viewportinfo.verticalScroll; - buttoninfo.clientX = e.clientX + buttoninfo.horizontalScroll; // get document-relative coordinates - buttoninfo.clientY = e.clientY + buttoninfo.verticalScroll; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseDown) - bobj.functionobj.MouseDown(e, buttoninfo, bobj); - - if (bobj.repeatwait) { - // if a repeat wait is set, then starting waiting for first repetition - buttoninfo.timer = window.setTimeout( - SocialCalc.ButtonRepeat, - bobj.repeatwait - ); - } - - return; - }; - - // - // ButtonMouseUp(event) - // - - SocialCalc.ButtonMouseUp = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (buttoninfo.timer) { - // if repeating, cancel it - window.clearTimeout(buttoninfo.timer); // cancel timer - buttoninfo.timer = null; - } - - if (!buttoninfo.buttonDown) return; // already did this (e.g., in IE, releaseCapture fires losecapture) - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener("mouseup", SocialCalc.ButtonMouseUp, true); - } else if (document.detachEvent) { - // IE - bobj.element.detachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - bobj.element.detachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.releaseCapture(); - } - - if (buttoninfo.buttonElement.downstyle) { - if (buttoninfo.doingHover) - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.hoverstyle); - else - SocialCalc.setStyles( - bobj.element, - buttoninfo.buttonElement.normalstyle - ); - } - - buttoninfo.buttonDown = false; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseUp) - bobj.functionobj.MouseUp(e, buttoninfo, bobj); - }; - - // - // ButtonRepeat() - // - - SocialCalc.ButtonRepeat = function () { - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (!bobj) return; - - if (bobj && bobj.functionobj && bobj.functionobj.Repeat) - bobj.functionobj.Repeat(null, buttoninfo, bobj); - - buttoninfo.timer = window.setTimeout( - SocialCalc.ButtonRepeat, - bobj.repeatinterval || 100 - ); - }; - - // ************************************* - // - // MouseWheel functions: - // - // ************************************* - - SocialCalc.MouseWheelInfo = { - // There is only one of these -- no "new" is done. - // The mousewheel only affects the one area the mouse pointer is over - // The registeredElements array is used to identify items. - - // One item for each element to respond to the mousewheel, each an object with: - // .element, .functionobj - - registeredElements: [], - }; - - // - // MouseWheelRegister(element, functionobj) - make element respond to mousewheel - // - - SocialCalc.MouseWheelRegister = function (element, functionobj) { - var mousewheelinfo = SocialCalc.MouseWheelInfo; - - mousewheelinfo.registeredElements.push({ - element: element, - functionobj: functionobj, - }); - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener( - "DOMMouseScroll", - SocialCalc.ProcessMouseWheel, - false - ); - element.addEventListener( - "mousewheel", - SocialCalc.ProcessMouseWheel, - false - ); // Opera needs this - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousewheel", SocialCalc.ProcessMouseWheel); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - }; - - SocialCalc.ProcessMouseWheel = function (e) { - var event = e || window.event; - var delta, coord; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - var mousewheelinfo = SocialCalc.MouseWheelInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var wobj; - - for (wobj = null; !wobj && ele; ele = ele.parentNode) { - // go up tree looking for one of our elements - wobj = SocialCalc.LookupElement(ele, mousewheelinfo.registeredElements); - } - if (!wobj) return; // not one of our elements - - if (event.wheelDelta) { - delta = event.wheelDelta / 120; - } else delta = -event.detail / 3; - if (!delta) delta = 0; - - if (wobj.functionobj && wobj.functionobj.WheelMove) - wobj.functionobj.WheelMove(event, delta, mousewheelinfo, wobj); - - if (event.preventDefault) event.preventDefault(); - event.returnValue = false; - }; - - // ************************************* - // - // Keyboard functions: - // - // For more information about keyboard handling, see: http://unixpapa.com/js/key.html - // - // ************************************* - - SocialCalc.keyboardTables = { - specialKeysCommon: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", - 46: "[del]", - 113: "[f2]", - }, - - specialKeysIE: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", - 46: "[del]", - 113: "[f2]", - }, - - controlKeysIE: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]", - }, - - specialKeysOpera: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", // issues with releases before 9.5 - same as "-" ("-" changed in 9.5) - 46: "[del]", // issues with releases before 9.5 - same as "." ("." changed in 9.5) - 113: "[f2]", - }, - - controlKeysOpera: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]", - }, - - specialKeysSafari: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 63232: "[aup]", - 63233: "[adown]", - 63234: "[aleft]", - 63235: "[aright]", - 63272: "[del]", - 63273: "[home]", - 63275: "[end]", - 63276: "[pgup]", - 63277: "[pgdn]", - 63237: "[f2]", - }, - - controlKeysSafari: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]", - }, - - ignoreKeysSafari: { - 63236: "[f1]", - 63238: "[f3]", - 63239: "[f4]", - 63240: "[f5]", - 63241: "[f6]", - 63242: "[f7]", - 63243: "[f8]", - 63244: "[f9]", - 63245: "[f10]", - 63246: "[f11]", - 63247: "[f12]", - 63289: "[numlock]", - }, - - specialKeysFirefox: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", - 46: "[del]", - 113: "[f2]", - }, - - controlKeysFirefox: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]", - }, - - ignoreKeysFirefox: { - 16: "[shift]", - 17: "[ctrl]", - 18: "[alt]", - 20: "[capslock]", - 19: "[pause]", - 44: "[printscreen]", - 91: "[windows]", - 92: "[windows]", - 112: "[f1]", - 114: "[f3]", - 115: "[f4]", - 116: "[f5]", - 117: "[f6]", - 118: "[f7]", - 119: "[f8]", - 120: "[f9]", - 121: "[f10]", - 122: "[f11]", - 123: "[f12]", - 144: "[numlock]", - 145: "[scrolllock]", - 224: "[cmd]", - }, - }; - - SocialCalc.Keyboard = { - areListener: false, // if true, we have been installed as a listener for keyboard events - focusTable: null, // the table editor object that gets keystrokes or null - passThru: null, // if not null, control element with focus to pass keyboard events to (has blur method), or "true" - didProcessKey: false, // did SocialCalc.ProcessKey in keydown - statusFromProcessKey: false, // the status from the keydown SocialCalc.ProcessKey - repeatingKeyPress: false, // some browsers (Opera, Gecko Mac) repeat special keys as KeyPress not KeyDown - chForProcessKey: "", // remember so can do repeat in those cases - }; - - SocialCalc.KeyboardSetFocus = function (editor) { - SocialCalc.Keyboard.focusTable = editor; - - if (!SocialCalc.Keyboard.areListener) { - document.onkeydown = SocialCalc.ProcessKeyDown; - document.onkeypress = SocialCalc.ProcessKeyPress; - SocialCalc.Keyboard.areListener = true; - } - if (SocialCalc.Keyboard.passThru) { - if (SocialCalc.Keyboard.passThru.blur) { - SocialCalc.Keyboard.passThru.blur(); - } - SocialCalc.Keyboard.passThru = null; - } - window.focus(); - }; - - SocialCalc.KeyboardFocus = function () { - SocialCalc.Keyboard.passThru = null; - window.focus(); - }; - - SocialCalc.ProcessKeyDown = function (e) { - var kt = SocialCalc.keyboardTables; - kt.didProcessKey = false; // always start false - kt.statusFromProcessKey = false; - kt.repeatingKeyPress = false; - - var ch = ""; - var status = true; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - // IE and Safari 3.1+ won't fire keyPress, so check for special keys here. - if (e.which == undefined || typeof e.keyIdentifier == "string") { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { - if (e.ctrlKey) { - ch = kt.controlKeysIE[e.keyCode]; - } - if (!ch) return true; - } - status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - } else { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { - // return true; - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysIE[e.keyCode]; // this works here - } - if (!ch) return true; - } - - status = SocialCalc.ProcessKey(ch, e); // process the key - kt.didProcessKey = true; // remember what happened - kt.statusFromProcessKey = status; - kt.chForProcessKey = ch; - } - - return status; - }; - - SocialCalc.ProcessKeyPress = function (e) { - var kt = SocialCalc.keyboardTables; - - var ch = ""; - - e = e || window.event; - - if (SocialCalc.Keyboard.passThru) return; // ignore - if (kt.didProcessKey) { - // already processed this key - if (kt.repeatingKeyPress) { - return SocialCalc.ProcessKey(kt.chForProcessKey, e); // process the same key as on KeyDown - } else { - kt.repeatingKeyPress = true; // see if get another KeyPress before KeyDown - return kt.statusFromProcessKey; // do what it said to do - } - } - - if (e.which == undefined) { - // IE - // Note: Esc and Enter will come through here, too, if not stopped at KeyDown - ch = String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) - } else { - // not IE - if (!e.which) return false; // ignore - special key - if (e.charCode == undefined) { - // Opera - if (e.which != 0) { - // character - if (e.which < 32 || e.which == 144) { - // special char (144 is numlock) - ch = kt.specialKeysOpera[e.which]; - if (ch) { - return true; - } - } else { - if (e.ctrlKey) { - ch = kt.controlKeysOpera[e.keyCode]; - } else { - ch = String.fromCharCode(e.which); - } - } - } else { - // special char - return true; - } - } else if (e.keyCode == 0 && e.charCode == 0) { - // OLPC Fn key or something - return; // ignore - } else if (e.keyCode == e.charCode) { - // Safari - ch = kt.specialKeysSafari[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysSafari[e.keyCode]) - // pass this through - return true; - if (e.metaKey) { - ch = kt.controlKeysSafari[e.keyCode]; - } else { - ch = String.fromCharCode(e.which); - } - } - } else { - // Firefox - if (kt.specialKeysFirefox[e.keyCode]) { - return true; - } - ch = String.fromCharCode(e.which); - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysFirefox[e.which]; - } - } - } - - var status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - - return status; - }; - - /* -* -* OLD ProcessKeyDown and ProcessKeyPress -- replaced for handling newer browsers, including Safari 3.1 and Opera 9.5 -* - -SocialCalc.ProcessKeyDown = function(e) { - -var kt = SocialCalc.keyboardTables; - -var ch=""; -var status=true; - -if (SocialCalc.Keyboard.passThru) return; // ignore - -e = e || window.event; - -if (e.which==undefined) { // IE -ch = kt.specialKeysIE[e.keyCode]; -if (!ch) { -if (e.ctrlKey) { -ch=kt.controlKeysIE[e.keyCode]; -} -if (!ch) -return true; -} - -status = SocialCalc.ProcessKey(ch, e); - -if (!status) { -if (e.preventDefault) e.preventDefault(); -e.returnValue = false; -} -} - -else { // don't do anything for other browsers - wait for keyPress -; // special key repeats are done as keypress in those browsers -} - -return status; - -} - -SocialCalc.ProcessKeyPress = function(e) { - -var kt = SocialCalc.keyboardTables; - -var ch=""; - -if (SocialCalc.Keyboard.passThru) return; // ignore - -e = e || window.event; - -if (e.which==undefined) { // IE -// Note: Esc and Enter will come through here, too, if not stopped at KeyDown -ch=String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) -} - -else { // not IE -if (e.charCode==undefined) { // Opera -if (e.which!=0) { // character -if (e.which<32) { // special char -ch = kt.specialKeysOpera[e.keyCode]; -if (!ch) -return true; -} -else { -if (e.ctrlKey) { -ch=kt.controlKeysOpera[e.keyCode]; -} -else { -ch = String.fromCharCode(e.which); -} -} -} -else { // special char -ch = kt.specialKeysOpera[e.keyCode]; -if (!ch) -return true; -} -} - -else if (e.keyCode==0 && e.charCode==0) { // OLPC Fn key or something -return; // ignore -} - -else if (e.keyCode==e.charCode) { // Safari -ch = kt.specialKeysSafari[e.keyCode]; -if (!ch) { -if (kt.ignoreKeysSafari[e.keyCode]) // pass this through -return true; -if (e.metaKey) { -ch=kt.controlKeysSafari[e.keyCode]; -} -else { -ch = String.fromCharCode(e.which); -} -} -} - -else { // Firefox -ch = kt.specialKeysFirefox[e.keyCode]; -if (!ch) { -if (kt.ignoreKeysFirefox[e.keyCode]) // pass this through -return true; -if (e.which) { // normal char -if (e.ctrlKey || e.metaKey) { -ch = kt.controlKeysFirefox[e.which]; -} -else { -ch = String.fromCharCode(e.which); -} -} -else { // usually a special char -return true; // old Firefox gives extra, empty keyPress for "/" - ignore -} -} -} -} - -var status = SocialCalc.ProcessKey(ch, e); - -if (!status) { -if (e.preventDefault) e.preventDefault(); -e.returnValue = false; -} - -return status; - -} -*/ - - // - // status = SocialCalc.ProcessKey(ch, e) - // - // Take a key representation as a character string and dispatch to appropriate routine - // - - SocialCalc.ProcessKey = function (ch, e) { - var ft = SocialCalc.Keyboard.focusTable; - - if (!ft) return true; // we're not handling it -- let browser do default - - return ft.EditorProcessKey(ch, e); - }; - - // For Contact - SocialCalc.EditorChangecontact = function ( - editor, - text, - name, - phone, - email, - street, - city, - company, - val - ) { - // alert('changecontact called'); - //var wval = editor.workingvalues; - if (name != "") { - cmdline = "set " + name + " " + "text t" + " " + contactname; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - cmdline = "set " + phone + " " + "text t" + " " + contactphoneNumber; - editor.EditorScheduleSheetCommands(cmdline, true, false); - if (email != "") { - cmdline = "set " + email + " " + "text t" + " " + contactemail; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - cmdline = "set " + street + " " + "text t" + " " + contactStreet; - editor.EditorScheduleSheetCommands(cmdline, true, false); - cmdline = "set " + city + " " + "text t" + " " + contactcity; - editor.EditorScheduleSheetCommands(cmdline, true, false); - if (val == "y") { - cmdline = "set " + company + " " + "text t" + " " + contactcompany; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - - return; - }; - - //changes by mini for font and color - - SocialCalc.EditorChangeSheetcolor = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - type = "text t"; - //value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - value = text; - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord) + ""; - if (value == oldvalue) { - // no change - return; - } - fch = value.charAt(0); - if (fch == "=" && value.indexOf("\n") == -1) { - type = "formula"; - value = value.substring(1); - } else if (fch == "'") { - type = "text t"; - value = value.substring(1); - } else if (value.length == 0) { - type = "empty"; - } else { - valueinfo = SocialCalc.DetermineValueType(value); - if (valueinfo.type == "n" && value == valueinfo.value + "") { - // see if don't need "constant" - type = "value n"; - } else if (valueinfo.type.charAt(0) == "t") { - type = "text " + valueinfo.type; - } else if (valueinfo.type == "") { - type = "text t"; - } else { - type = "constant " + valueinfo.type + " " + valueinfo.value; - } - } - - if (type.charAt(0) == "t") { - // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - //cmdline = "set "+wval.ecoord+" "+"font"+" "+value; - cmdline = "set " + "sheet" + " " + "defaultcolor" + " " + value; - //cmdline = "set "+"sheet"+" "+"defaultcolor green"; - //var control = SocialCalc.GetCurrentWorkBookControl(); - //alert('u reach sheet' + " "+control.workbook.sheetArr["sheet1"].sheet); - //cmdline = "set "+sheetobj+" "+"font"+" "+value; - //cmdline="set "+ control.workbook.sheetArr["sheet1"].sheet+" color blue" ; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - }; - - SocialCalc.EditorChangecolorFromWidget = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - if (!CoordForColorChange) { - alert("No active cell"); - return; - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - cmdline = "set " + CoordForColorChange + " " + "color" + " " + text; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - }; - - SocialCalc.EditorChangefontFromWidget = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - if (!CoordForColorChange) { - alert("No active cell"); - return; - } - //alert(CoordForColorChange); - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - //cmdline = "set "+CoordForColorChange+" "+"font"+" "+text; - //editor.EditorScheduleSheetCommands(cmdline, true, false); - var value = text; - if (value == "a") { - cmdline = "set " + CoordForColorChange + " font * 12px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "b") { - cmdline = "set " + CoordForColorChange + " font * 14px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "c") { - cmdline = "set " + CoordForColorChange + " font * 16px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "d") { - cmdline = "set " + CoordForColorChange + " font * 18px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - - return; - }; - - SocialCalc.EditorChangeSheetfont = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - type = "text t"; - //value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - value = text; - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord) + ""; - if (value == oldvalue) { - // no change - return; - } - fch = value.charAt(0); - if (fch == "=" && value.indexOf("\n") == -1) { - type = "formula"; - value = value.substring(1); - } else if (fch == "'") { - type = "text t"; - value = value.substring(1); - } else if (value.length == 0) { - type = "empty"; - } else { - valueinfo = SocialCalc.DetermineValueType(value); - if (valueinfo.type == "n" && value == valueinfo.value + "") { - // see if don't need "constant" - type = "value n"; - } else if (valueinfo.type.charAt(0) == "t") { - type = "text " + valueinfo.type; - } else if (valueinfo.type == "") { - type = "text t"; - } else { - type = "constant " + valueinfo.type + " " + valueinfo.value; - } - } - - if (type.charAt(0) == "t") { - // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - //cmdline = "set "+wval.ecoord+" "+"font"+" "+value; - //cmdline = "set "+"sheet"+" "+"defaultcolor"+" "+ value; - - //cmdline = "set "+"sheet"+" "+"defaultfont"+" * "+value+" *"; - - //cmdline = "set sheet defaultfont normal normal "+value +" *"; - //cmdline="set sheet defaultfont"; - // alert(cmdline); - //editor.EditorScheduleSheetCommands(cmdline, true, false); - if (value == "a") { - cmdline = "set sheet defaultfont * 12px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "b") { - cmdline = "set sheet defaultfont * 14px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "c") { - cmdline = "set sheet defaultfont * 16px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "d") { - cmdline = "set sheet defaultfont * 18px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - - //cmdline = ""+"set sheet defaultfont * 8pt *"; - //cmdline = "set "+"sheet"+" "+"defaultcolor green"; - //var control = SocialCalc.GetCurrentWorkBookControl(); - //alert('u reach sheet' + " "+control.workbook.sheetArr["sheet1"].sheet); - //cmdline = "set "+sheetobj+" "+"font"+" "+value; - //cmdline="set "+ control.workbook.sheetArr["sheet1"].sheet+" color blue" ; - - return; - }; - - SocialCalc.EditorCut = function (editor, value) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - if (value == "a") { - cmdline = "cut " + editCoord + " all"; - } else if (value == "b") { - cmdline = "copy " + editCoord + " all"; - } else if (value == "c") { - cmdline = "paste " + editCoord + " all"; - } else if (value == "d") { - cmdline = "erase " + editCoord + " formulas"; - } - editor.EditorScheduleSheetCommands(cmdline, true, false); - }; - - SocialCalc.EditorClearSheet = function (editor, cell_to_clear) { - //alert("clear"); - var cmdline; - var coord = cell_to_clear; - cmdline = "erase " + coord + " formulas"; - //console.log(cmdline); - editor.EditorScheduleSheetCommands(cmdline, true, false); - }; - - // - /* -// SocialCalc Number Formatting Library -// -// Part of the SocialCalc package. -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - - SocialCalc.FormatNumber = {}; - - SocialCalc.FormatNumber.format_definitions = {}; // Parsed formats are stored here globally - - // Most constants that are often customized for localization are in the SocialCalc.Constants module. - // If you use this module standalone, provide at least the "FormatNumber" values. - // - - // The following values may be customized externally for further localization of the format definitions themselves, - // but that would make them incompatible with other uses and is discouraged. - // - - SocialCalc.FormatNumber.separatorchar = ","; - SocialCalc.FormatNumber.decimalchar = "."; - SocialCalc.FormatNumber.daynames = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - ]; - SocialCalc.FormatNumber.daynames3 = [ - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - ]; - SocialCalc.FormatNumber.monthnames3 = [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - ]; - SocialCalc.FormatNumber.monthnames = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ]; - - SocialCalc.FormatNumber.allowedcolors = { - BLACK: "#000000", - BLUE: "#0000FF", - CYAN: "#00FFFF", - GREEN: "#00FF00", - MAGENTA: "#FF00FF", - RED: "#FF0000", - WHITE: "#FFFFFF", - YELLOW: "#FFFF00", - }; - - SocialCalc.FormatNumber.alloweddates = { - H: "h]", - M: "m]", - MM: "mm]", - S: "s]", - SS: "ss]", - }; - - // Other constants - - SocialCalc.FormatNumber.commands = { - copy: 1, - color: 2, - integer_placeholder: 3, - fraction_placeholder: 4, - decimal: 5, - currency: 6, - general: 7, - separator: 8, - date: 9, - comparison: 10, - section: 11, - style: 12, - }; - - SocialCalc.FormatNumber.datevalues = { - julian_offset: 2415019, - seconds_in_a_day: 24 * 60 * 60, - seconds_in_an_hour: 60 * 60, - }; - - /* ******************* - - result = SocialCalc.FormatNumber.formatNumberWithFormat = function(rawvalue, format_string, currency_char) - -************************* */ - - SocialCalc.FormatNumber.formatNumberWithFormat = function ( - rawvalue, - format_string, - currency_char - ) { - var scc = SocialCalc.Constants; - var scfn = SocialCalc.FormatNumber; - - var op, operandstr, fromend, cval, operandstrlc; - var startval, estartval; - var hrs, mins, secs, ehrs, emins, esecs, ampmstr, ymd; - var minOK, mpos; - var result = ""; - var thisformat; - var section, gotcomparison, compop, compval, cpos, oppos; - var sectioninfo; - var i, - decimalscale, - scaledvalue, - strvalue, - strparts, - integervalue, - fractionvalue; - var integerdigits2, - integerpos, - fractionpos, - textcolor, - textstyle, - separatorchar, - decimalchar; - var value; // working copy to change sign, etc. - var mspos; - rawvalue = rawvalue - 0; // make sure a number - value = rawvalue; - if (!isFinite(value)) return "NaN"; - - var negativevalue = value < 0 ? 1 : 0; // determine sign, etc. - if (negativevalue) value = -value; - var zerovalue = value == 0 ? 1 : 0; - - currency_char = currency_char || scc.FormatNumber_DefaultCurrency; - - scfn.parse_format_string(scfn.format_definitions, format_string); // make sure format is parsed - thisformat = scfn.format_definitions[format_string]; // Get format structure - - if (!thisformat) throw "Format not parsed error!"; - - section = thisformat.sectioninfo.length - 1; // get number of sections - 1 - - if (thisformat.hascomparison) { - // has comparisons - determine which section - section = 0; // set to which section we will use - gotcomparison = 0; // this section has no comparison - for (cpos = 0; ; cpos++) { - // scan for comparisons - op = thisformat.operators[cpos]; - operandstr = thisformat.operands[cpos]; // get next operator and operand - if (!op) { - // at end with no match - if (gotcomparison) { - // if comparison but no match - format_string = "General"; // use default of General - scfn.parse_format_string(scfn.format_definitions, format_string); - thisformat = scfn.format_definitions[format_string]; - section = 0; - } - break; // if no comparision, matches on this section - } - if (op == scfn.commands.section) { - // end of section - if (!gotcomparison) { - // no comparison, so it's a match - break; - } - gotcomparison = 0; - section++; // check out next one - continue; - } - if (op == scfn.commands.comparison) { - // found a comparison - do we meet it? - i = operandstr.indexOf(":"); - compop = operandstr.substring(0, i); - compval = operandstr.substring(i + 1) - 0; - if ( - (compop == "<" && rawvalue < compval) || - (compop == "<=" && rawvalue <= compval) || - (compop == "=" && rawvalue == compval) || - (compop == "<>" && rawvalue != compval) || - (compop == ">=" && rawvalue >= compval) || - (compop == ">" && rawvalue > compval) - ) { - // a match - break; - } - gotcomparison = 1; - } - } - } else if (section > 0) { - // more than one section (separated by ";") - if (section == 1) { - // two sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } else { - section = 0; // use first for all others - } - } else if (section == 2) { - // three sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } else if (zerovalue) { - section = 2; // use third section for zero values - } else { - section = 0; // use first for positive - } - } - } - - sectioninfo = thisformat.sectioninfo[section]; // look at values for our section - - if (sectioninfo.commas > 0) { - // scale by thousands - for (i = 0; i < sectioninfo.commas; i++) { - value /= 1000; - } - } - if (sectioninfo.percent > 0) { - // do percent scaling - for (i = 0; i < sectioninfo.percent; i++) { - value *= 100; - } - } - - decimalscale = 1; // cut down to required number of decimal digits - for (i = 0; i < sectioninfo.fractiondigits; i++) { - decimalscale *= 10; - } - scaledvalue = Math.floor(value * decimalscale + 0.5); - scaledvalue = scaledvalue / decimalscale; - - if (typeof scaledvalue != "number") return "NaN"; - if (!isFinite(scaledvalue)) return "NaN"; - - strvalue = scaledvalue + ""; // convert to string (Number.toFixed doesn't do all we need) - - // strvalue = value.toFixed(sectioninfo.fractiondigits); // cut down to required number of decimal digits - // and convert to string - - if ( - scaledvalue == 0 && - (sectioninfo.fractiondigits || sectioninfo.integerdigits) - ) { - negativevalue = 0; // no "-0" unless using multiple sections or General - } - - if (strvalue.indexOf("e") >= 0) { - // converted to scientific notation - return rawvalue + ""; // Just return plain converted raw value - } - - strparts = strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - if (!strparts) return "NaN"; // if not a number - integervalue = strparts[1]; - if (!integervalue || integervalue == "0") integervalue = ""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - - if (sectioninfo.hasdate) { - // there are date placeholders - if (rawvalue < 0) { - // bad date - return "??-???-?? ??:??:??"; - } - startval = - (rawvalue - Math.floor(rawvalue)) * scfn.datevalues.seconds_in_a_day; // get date/time parts - estartval = rawvalue * scfn.datevalues.seconds_in_a_day; // do elapsed time version, too - hrs = Math.floor(startval / scfn.datevalues.seconds_in_an_hour); - ehrs = Math.floor(estartval / scfn.datevalues.seconds_in_an_hour); - startval = startval - hrs * scfn.datevalues.seconds_in_an_hour; - mins = Math.floor(startval / 60); - emins = Math.floor(estartval / 60); - secs = startval - mins * 60; - decimalscale = 1; // round appropriately depending if there is ss.0 - for (i = 0; i < sectioninfo.fractiondigits; i++) { - decimalscale *= 10; - } - secs = Math.floor(secs * decimalscale + 0.5); - secs = secs / decimalscale; - esecs = Math.floor(estartval * decimalscale + 0.5); - esecs = esecs / decimalscale; - if (secs >= 60) { - // handle round up into next second, minute, etc. - secs = 0; - mins++; - emins++; - if (mins >= 60) { - mins = 0; - hrs++; - ehrs++; - if (hrs >= 24) { - hrs = 0; - rawvalue++; - } - } - } - fractionvalue = secs - Math.floor(secs) + ""; // for "hh:mm:ss.000" - fractionvalue = fractionvalue.substring(2); // skip "0." - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian( - Math.floor(rawvalue + scfn.datevalues.julian_offset) - ); - - minOK = 0; // says "m" can be minutes if true - var mspos = sectioninfo.sectionstart; // m scan position in ops - for (; ; mspos++) { - // scan for "m" and "mm" to see if any minutes fields, and am/pm - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op == scfn.commands.section) break; - if (op == scfn.commands.date) { - if ( - (operandstr.toLowerCase() == "am/pm" || - operandstr.toLowerCase() == "a/p") && - !ampmstr - ) { - if (hrs >= 12) { - hrs -= 12; - ampmstr = - operandstr.toLowerCase() == "a/p" - ? scc.s_FormatNumber_pm1 - : scc.s_FormatNumber_pm; // "P" : "PM"; - } else { - ampmstr = - operandstr.toLowerCase() == "a/p" - ? scc.s_FormatNumber_am1 - : scc.s_FormatNumber_am; // "A" : "AM"; - } - if (operandstr.indexOf(ampmstr) < 0) - ampmstr = ampmstr.toLowerCase(); // have case match case in format - } - if (minOK && (operandstr == "m" || operandstr == "mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr.charAt(0) == "h") { - minOK = 1; // m following h or hh or [h] is minutes not months - } else { - minOK = 0; - } - } else if (op != scfn.commands.copy) { - // copying chars can be between h and m - minOK = 0; - } - } - minOK = 0; - for (--mspos; ; mspos--) { - // scan other way for s after m - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op == scfn.commands.section) break; - if (op == scfn.commands.date) { - if (minOK && (operandstr == "m" || operandstr == "mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr == "ss") { - minOK = 1; // m before ss is minutes not months - } else { - minOK = 0; - } - } else if (op != scfn.commands.copy) { - // copying chars can be between ss and m - minOK = 0; - } - } - } - - integerdigits2 = 0; // init counters, etc. - integerpos = 0; - fractionpos = 0; - textcolor = ""; - textstyle = ""; - separatorchar = scc.FormatNumber_separatorchar; - if (separatorchar.indexOf(" ") >= 0) - separatorchar = separatorchar.replace(/ /g, " "); - decimalchar = scc.FormatNumber_decimalchar; - if (decimalchar.indexOf(" ") >= 0) - decimalchar = decimalchar.replace(/ /g, " "); - - oppos = sectioninfo.sectionstart; - - while ((op = thisformat.operators[oppos])) { - // execute format - operandstr = thisformat.operands[oppos++]; // get next operator and operand - - if (op == scfn.commands.copy) { - // put char in result - result += operandstr; - } else if (op == scfn.commands.color) { - // set color - textcolor = operandstr; - } else if (op == scfn.commands.style) { - // set style - textstyle = operandstr; - } else if (op == scfn.commands.integer_placeholder) { - // insert number part - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - integerdigits2++; - if (integerdigits2 == 1) { - // first one - if (integervalue.length > sectioninfo.integerdigits) { - // see if integer wider than field - for ( - ; - integerpos < integervalue.length - sectioninfo.integerdigits; - integerpos++ - ) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - } - if ( - integervalue.length < sectioninfo.integerdigits && - integerdigits2 <= sectioninfo.integerdigits - integervalue.length - ) { - // field is wider than value - if (operandstr == "0" || operandstr == "?") { - // fill with appropriate characters - result += operandstr == "0" ? "0" : " "; - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = sectioninfo.integerdigits - integerdigits2; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } else { - // normal integer digit - add it - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - integerpos++; - } - } else if (op == scfn.commands.fraction_placeholder) { - // add fraction part of number - if (fractionpos >= fractionvalue.length) { - if (operandstr == "0" || operandstr == "?") { - result += operandstr == "0" ? "0" : " "; - } - } else { - result += fractionvalue.charAt(fractionpos); - } - fractionpos++; - } else if (op == scfn.commands.decimal) { - // decimal point - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += decimalchar; - } else if (op == scfn.commands.currency) { - // currency symbol - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += operandstr; - } else if (op == scfn.commands.general) { - // insert "General" conversion - - // *** Cut down number of significant digits to avoid floating point artifacts: - - if (value != 0) { - // only if non-zero - var factor = Math.floor(Math.LOG10E * Math.log(value)); // get integer magnitude as a power of 10 - factor = Math.pow(10, 13 - factor); // turn into scaling factor - value = Math.floor(factor * value + 0.5) / factor; // scale positive value, round, undo scaling - if (!isFinite(value)) return "NaN"; - } - if (negativevalue) { - result += "-"; - } - strvalue = value + ""; // convert original value to string - if (strvalue.indexOf("e") >= 0) { - // converted to scientific notation - result += strvalue; - continue; - } - strparts = strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - integervalue = strparts[1]; - if (!integervalue || integervalue == "0") integervalue = ""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - integerpos = 0; - fractionpos = 0; - if (integervalue.length) { - for (; integerpos < integervalue.length; integerpos++) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } else { - result += "0"; - } - if (fractionvalue.length) { - result += decimalchar; - for (; fractionpos < fractionvalue.length; fractionpos++) { - result += fractionvalue.charAt(fractionpos); - } - } - } else if (op == scfn.commands.date) { - // date placeholder - operandstrlc = operandstr.toLowerCase(); - if (operandstrlc == "y" || operandstrlc == "yy") { - result += (ymd.year + "").substring(2); - } else if (operandstrlc == "yyyy") { - result += ymd.year + ""; - } else if (operandstrlc == "d") { - result += ymd.day + ""; - } else if (operandstrlc == "dd") { - cval = 1000 + ymd.day; - result += (cval + "").substr(2); - } else if (operandstrlc == "ddd") { - cval = Math.floor(rawvalue + 6) % 7; - result += scc.s_FormatNumber_daynames3[cval]; - } else if (operandstrlc == "dddd") { - cval = Math.floor(rawvalue + 6) % 7; - result += scc.s_FormatNumber_daynames[cval]; - } else if (operandstrlc == "m") { - result += ymd.month + ""; - } else if (operandstrlc == "mm") { - cval = 1000 + ymd.month; - result += (cval + "").substr(2); - } else if (operandstrlc == "mmm") { - result += scc.s_FormatNumber_monthnames3[ymd.month - 1]; - } else if (operandstrlc == "mmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month - 1]; - } else if (operandstrlc == "mmmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month - 1].charAt(0); - } else if (operandstrlc == "h") { - result += hrs + ""; - } else if (operandstrlc == "h]") { - result += ehrs + ""; - } else if (operandstrlc == "mmin") { - cval = 1000 + mins + ""; - result += cval.substr(2); - } else if (operandstrlc == "mm]") { - if (emins < 100) { - cval = 1000 + emins + ""; - result += cval.substr(2); - } else { - result += emins + ""; - } - } else if (operandstrlc == "min") { - result += mins + ""; - } else if (operandstrlc == "m]") { - result += emins + ""; - } else if (operandstrlc == "hh") { - cval = 1000 + hrs + ""; - result += cval.substr(2); - } else if (operandstrlc == "s") { - cval = Math.floor(secs); - result += cval + ""; - } else if (operandstrlc == "ss") { - cval = 1000 + Math.floor(secs) + ""; - result += cval.substr(2); - } else if (operandstrlc == "am/pm" || operandstrlc == "a/p") { - result += ampmstr; - } else if (operandstrlc == "ss]") { - if (esecs < 100) { - cval = 1000 + Math.floor(esecs) + ""; - result += cval.substr(2); - } else { - cval = Math.floor(esecs); - result += cval + ""; - } - } - } else if (op == scfn.commands.section) { - // end of section - break; - } else if (op == scfn.commands.comparison) { - // ignore - continue; - } else { - result += "!! Parse error !!"; - } - } - - if (textcolor) { - result = '' + result + ""; - } - if (textstyle) { - result = '' + result + ""; - } - - return result; - }; - - /* ******************* - - SocialCalc.FormatNumber.parse_format_string(format_defs, format_string) - - Takes a format string (e.g., "#,##0.00_);(#,##0.00)") and fills in format_defs with the parsed info - - format_defs - ["#,##0.0"]->{} - elements in the hash are one hash for each format - .operators->[] - array of operators from parsing the format string (each a number) - .operands->[] - array of corresponding operators (each usually a string) - .sectioninfo->[] - one hash for each section of the format - .start - .integerdigits - .fractiondigits - .commas - .percent - .thousandssep - .hasdates - .hascomparison - true if any section has [<100], etc. - -************************* */ - - SocialCalc.FormatNumber.parse_format_string = function ( - format_defs, - format_string - ) { - var scfn = SocialCalc.FormatNumber; - - var thisformat, section, sectionfinfo; - var integerpart = 1; // start out in integer part - var lastwasinteger; // last char was an integer placeholder - var lastwasslash; // last char was a backslash - escaping following character - var lastwasasterisk; // repeat next char - var lastwasunderscore; // last char was _ which picks up following char for width - var inquote, quotestr; // processing a quoted string - var inbracket, bracketstr, bracketdata; // processing a bracketed string - var ingeneral, gpos; // checks for characters "General" - var ampmstr, part; // checks for characters "A/P" and "AM/PM" - var indate; // keeps track of date/time placeholders - var chpos; // character position being looked at - var ch; // character being looked at - var sectioninfo; - - if (format_defs[format_string]) return; // already defined - nothing to do - - thisformat = { operators: [], operands: [], sectioninfo: [{}] }; // create info structure for this format - format_defs[format_string] = thisformat; // add to other format definitions - - section = 0; // start with section 0 - sectioninfo = thisformat.sectioninfo[section]; // get reference to info for current section - sectioninfo.sectionstart = 0; // position in operands that starts this section - sectioninfo.integerdigits = 0; // number of integer-part placeholders - sectioninfo.fractiondigits = 0; // fraction placeholders - sectioninfo.commas = 0; // commas encountered, to handle scaling - sectioninfo.percent = 0; // times to scale by 100 - - for (chpos = 0; chpos < format_string.length; chpos++) { - // parse - ch = format_string.charAt(chpos); // get next char to examine - if (inquote) { - if (ch == '"') { - inquote = 0; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(quotestr); - continue; - } - quotestr += ch; - continue; - } - if (inbracket) { - if (ch == "]") { - inbracket = 0; - bracketdata = - SocialCalc.FormatNumber.parse_format_bracket(bracketstr); - if (bracketdata.operator == scfn.commands.separator) { - sectioninfo.thousandssep = 1; // explicit [,] - continue; - } - if (bracketdata.operator == scfn.commands.date) { - sectioninfo.hasdate = 1; - } - if (bracketdata.operator == scfn.commands.comparison) { - thisformat.hascomparison = 1; - } - thisformat.operators.push(bracketdata.operator); - thisformat.operands.push(bracketdata.operand); - continue; - } - bracketstr += ch; - continue; - } - if (lastwasslash) { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - lastwasslash = false; - continue; - } - if (lastwasasterisk) { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch + ch + ch + ch + ch); // do 5 of them since no real tabs - lastwasasterisk = false; - continue; - } - if (lastwasunderscore) { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(" "); - lastwasunderscore = false; - continue; - } - if (ingeneral) { - if ("general".charAt(ingeneral) == ch.toLowerCase()) { - ingeneral++; - if (ingeneral == 7) { - thisformat.operators.push(scfn.commands.general); - thisformat.operands.push(ch); - ingeneral = 0; - } - continue; - } - ingeneral = 0; - } - if (indate) { - // last char was part of a date placeholder - if (indate.charAt(0) == ch) { - // another of the same char - indate += ch; // accumulate it - continue; - } - thisformat.operators.push(scfn.commands.date); // something else, save date info - thisformat.operands.push(indate); - sectioninfo.hasdate = 1; - indate = ""; - } - if (ampmstr) { - ampmstr += ch; - part = ampmstr.toLowerCase(); - if ( - part != "am/pm".substring(0, part.length) && - part != "a/p".substring(0, part.length) - ) { - ampstr = ""; - } else if (part == "am/pm" || part == "a/p") { - thisformat.operators.push(scfn.commands.date); - thisformat.operands.push(ampmstr); - ampmstr = ""; - } - continue; - } - if (ch == "#" || ch == "0" || ch == "?") { - // placeholder - if (integerpart) { - sectioninfo.integerdigits++; - if (sectioninfo.commas) { - // comma inside of integer placeholders - sectioninfo.thousandssep = 1; // any number is thousands separator - sectioninfo.commas = 0; // reset count of "thousand" factors - } - lastwasinteger = 1; - thisformat.operators.push(scfn.commands.integer_placeholder); - thisformat.operands.push(ch); - } else { - sectioninfo.fractiondigits++; - thisformat.operators.push(scfn.commands.fraction_placeholder); - thisformat.operands.push(ch); - } - } else if (ch == ".") { - // decimal point - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.decimal); - thisformat.operands.push(ch); - integerpart = 0; - } else if (ch == "$") { - // currency char - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.currency); - thisformat.operands.push(ch); - } else if (ch == ",") { - if (lastwasinteger) { - sectioninfo.commas++; - } else { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } - } else if (ch == "%") { - lastwasinteger = 0; - sectioninfo.percent++; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } else if (ch == '"') { - lastwasinteger = 0; - inquote = 1; - quotestr = ""; - } else if (ch == "[") { - lastwasinteger = 0; - inbracket = 1; - bracketstr = ""; - } else if (ch == "\\") { - lastwasslash = 1; - lastwasinteger = 0; - } else if (ch == "*") { - lastwasasterisk = 1; - lastwasinteger = 0; - } else if (ch == "_") { - lastwasunderscore = 1; - lastwasinteger = 0; - } else if (ch == ";") { - section++; // start next section - thisformat.sectioninfo[section] = {}; // create a new section - sectioninfo = thisformat.sectioninfo[section]; // get reference to info for current section - sectioninfo.sectionstart = 1 + thisformat.operators.length; // remember where it starts - sectioninfo.integerdigits = 0; // number of integer-part placeholders - sectioninfo.fractiondigits = 0; // fraction placeholders - sectioninfo.commas = 0; // commas encountered, to handle scaling - sectioninfo.percent = 0; // times to scale by 100 - integerpart = 1; // reset for new section - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.section); - thisformat.operands.push(ch); - } else if (ch.toLowerCase() == "g") { - ingeneral = 1; - lastwasinteger = 0; - } else if (ch.toLowerCase() == "a") { - ampmstr = ch; - lastwasinteger = 0; - } else if ("dmyhHs".indexOf(ch) >= 0) { - indate = ch; - } else { - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } - } - - if (indate) { - // last char was part of unsaved date placeholder - thisformat.operators.push(scfn.commands.date); - thisformat.operands.push(indate); - sectioninfo.hasdate = 1; - } - - return; - }; - - /* ******************* - - bracketdata = SocialCalc.FormatNumber.parse_format_bracket(bracketstr) - - Takes a bracket contents (e.g., "RED", ">10") and returns an operator and operand - - bracketdata->{} - .operator - .operand - -************************* */ - - SocialCalc.FormatNumber.parse_format_bracket = function (bracketstr) { - var scfn = SocialCalc.FormatNumber; - var scc = SocialCalc.Constants; - - var bracketdata = {}; - var parts; - - if (bracketstr.charAt(0) == "$") { - // currency - bracketdata.operator = scfn.commands.currency; - parts = bracketstr.match(/^\$(.+?)(\-.+?){0,1}$/); - if (parts) { - bracketdata.operand = - parts[1] || scc.FormatNumber_defaultCurrency || "$"; - } else { - bracketdata.operand = - bracketstr.substring(1) || scc.FormatNumber_defaultCurrency || "$"; - } - } else if (bracketstr == "?$") { - bracketdata.operator = scfn.commands.currency; - bracketdata.operand = "[?$]"; - } else if (scfn.allowedcolors[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.color; - bracketdata.operand = scfn.allowedcolors[bracketstr.toUpperCase()]; - } else if ((parts = bracketstr.match(/^style=([^"]*)$/))) { - // [style=...] - bracketdata.operator = scfn.commands.style; - bracketdata.operand = parts[1]; - } else if (bracketstr == ",") { - bracketdata.operator = scfn.commands.separator; - bracketdata.operand = bracketstr; - } else if (scfn.alloweddates[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.date; - bracketdata.operand = scfn.alloweddates[bracketstr.toUpperCase()]; - } else if ((parts = bracketstr.match(/^[<>=]/))) { - // comparison operator - parts = bracketstr.match(/^([<>=]+)(.+)$/); // split operator and value - bracketdata.operator = scfn.commands.comparison; - bracketdata.operand = parts[1] + ":" + parts[2]; - } else { - // unknown bracket - bracketdata.operator = scfn.commands.copy; - bracketdata.operand = "[" + bracketstr + "]"; - } - - return bracketdata; - }; - - /* ******************* - - juliandate = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, month, day) - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - - I= YEAR - J= MONTH - K= DAY -C - JD= K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12) - 2 /12-3*((I+4900+(J-14)/12)/100)/4 - -************************* */ - - SocialCalc.FormatNumber.convert_date_gregorian_to_julian = function ( - year, - month, - day - ) { - var juliandate; - - juliandate = - day - - 32075 + - SocialCalc.intFunc( - (1461 * (year + 4800 + SocialCalc.intFunc((month - 14) / 12))) / 4 - ); - juliandate += SocialCalc.intFunc( - (367 * (month - 2 - SocialCalc.intFunc((month - 14) / 12) * 12)) / 12 - ); - juliandate = - juliandate - - SocialCalc.intFunc( - (3 * - SocialCalc.intFunc( - (year + 4900 + SocialCalc.intFunc((month - 14) / 12)) / 100 - )) / - 4 - ); - - return juliandate; - }; - - /* ******************* - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian(juliandate) - - ymd->{} - .year - .month - .day - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - -************************* */ - - SocialCalc.FormatNumber.convert_date_julian_to_gregorian = function ( - juliandate - ) { - var L, N, I, J, K; - - L = juliandate + 68569; - N = Math.floor((4 * L) / 146097); - L = L - Math.floor((146097 * N + 3) / 4); - I = Math.floor((4000 * (L + 1)) / 1461001); - L = L - Math.floor((1461 * I) / 4) + 31; - J = Math.floor((80 * L) / 2447); - K = L - Math.floor((2447 * J) / 80); - L = Math.floor(J / 11); - J = J + 2 - 12 * L; - I = 100 * (N - 49) + I + L; - - return { year: I, month: J, day: K }; - }; - - SocialCalc.intFunc = function (n) { - if (n < 0) { - return -Math.floor(-n); - } else { - return Math.floor(n); - } - }; - - // - /* -// SocialCalc Spreadsheet Formula Library -// -// Part of the SocialCalc package -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - // In any case, requires SocialCalc.Constants. - - SocialCalc.Formula = {}; - - // - // Formula constants for parsing: - // - - SocialCalc.Formula.ParseState = { - num: 1, - alpha: 2, - coord: 3, - string: 4, - stringquote: 5, - numexp1: 6, - numexp2: 7, - alphanumeric: 8, - specialvalue: 9, - }; - - SocialCalc.Formula.TokenType = { - num: 1, - coord: 2, - op: 3, - name: 4, - error: 5, - string: 6, - space: 7, - }; - - SocialCalc.Formula.CharClass = { - num: 1, - numstart: 2, - op: 3, - eof: 4, - alpha: 5, - incoord: 6, - error: 7, - quote: 8, - space: 9, - specialstart: 10, - }; - - SocialCalc.Formula.CharClassTable = { - " ": 9, - "!": 3, - '"': 8, - "#": 10, - $: 6, - "%": 3, - "&": 3, - "(": 3, - ")": 3, - "*": 3, - "+": 3, - ",": 3, - "-": 3, - ".": 2, - "/": 3, - 0: 1, - 1: 1, - 2: 1, - 3: 1, - 4: 1, - 5: 1, - 6: 1, - 7: 1, - 8: 1, - 9: 1, - ":": 3, - "<": 3, - "=": 3, - ">": 3, - A: 5, - B: 5, - C: 5, - D: 5, - E: 5, - F: 5, - G: 5, - H: 5, - I: 5, - J: 5, - K: 5, - L: 5, - M: 5, - N: 5, - O: 5, - P: 5, - Q: 5, - R: 5, - S: 5, - T: 5, - U: 5, - V: 5, - W: 5, - X: 5, - Y: 5, - Z: 5, - "^": 3, - _: 5, - a: 5, - b: 5, - c: 5, - d: 5, - e: 5, - f: 5, - g: 5, - h: 5, - i: 5, - j: 5, - k: 5, - l: 5, - m: 5, - n: 5, - o: 5, - p: 5, - q: 5, - r: 5, - s: 5, - t: 5, - u: 5, - v: 5, - w: 5, - x: 5, - y: 5, - z: 5, - }; - - SocialCalc.Formula.UpperCaseTable = { - a: "A", - b: "B", - c: "C", - d: "D", - e: "E", - f: "F", - g: "G", - h: "H", - i: "I", - j: "J", - k: "K", - l: "L", - m: "M", - n: "N", - o: "O", - p: "P", - q: "Q", - r: "R", - s: "S", - t: "T", - u: "U", - v: "V", - w: "W", - x: "X", - y: "Y", - z: "Z", - }; - - SocialCalc.Formula.SpecialConstants = { - // names that turn into constants for name lookup - "#NULL!": "0,e#NULL!", - "#NUM!": "0,e#NUM!", - "#DIV/0!": "0,e#DIV/0!", - "#VALUE!": "0,e#VALUE!", - "#REF!": "0,e#REF!", - "#NAME?": "0,e#NAME?", - }; - - // Operator Precedence table - // - // 1- !, 2- : ,, 3- M P, 4- %, 5- ^, 6- * /, 7- + -, 8- &, 9- < > = G(>=) L(<=) N(<>), - // Negative value means Right Associative - - SocialCalc.Formula.TokenPrecedence = { - "!": 1, - ":": 2, - ",": 2, - M: -3, - P: -3, - "%": 4, - "^": 5, - "*": 6, - "/": 6, - "+": 7, - "-": 7, - "&": 8, - "<": 9, - ">": 9, - G: 9, - L: 9, - N: 9, - }; - - // Convert one-char token text to input text: - - SocialCalc.Formula.TokenOpExpansion = { - G: ">=", - L: "<=", - M: "-", - N: "<>", - P: "+", - }; - - // - // Information about the resulting value types when doing operations on values (used by LookupResultType) - // - // Each object entry is an object with specific types with result type info as follows: - // - // 'type1a': '|type2a:resulta|type2b:resultb|... - // Type of t* or n* matches any of those types not listed - // Results may be a type or the numbers 1 or 2 specifying to return type1 or type2 - - SocialCalc.Formula.TypeLookupTable = { - unaryminus: { - "n*": "|n*:1|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - unaryplus: { - "n*": "|n*:1|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - unarypercent: { - "n*": "|n:n%|n*:n|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - plus: { - "n%": "|n%:n%|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - nd: "|n%:n|nd:nd|nt:ndt|ndt:ndt|n$:n|n:nd|n*:n|b:n|e*:2|t*:e#VALUE!|", - nt: "|n%:n|nd:ndt|nt:nt|ndt:ndt|n$:n|n:nt|n*:n|b:n|e*:2|t*:e#VALUE!|", - ndt: "|n%:n|nd:ndt|nt:ndt|ndt:ndt|n$:n|n:ndt|n*:n|b:n|e*:2|t*:e#VALUE!|", - n$: "|n%:n|nd:n|nt:n|ndt:n|n$:n$|n:n$|n*:n|b:n|e*:2|t*:e#VALUE!|", - nl: "|n%:n|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - n: "|n%:n|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - b: "|n%:n%|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - "t*": "|n*:e#VALUE!|t*:e#VALUE!|b:e#VALUE!|e*:2|", - "e*": "|e*:1|n*:1|t*:1|b:1|", - }, - concat: { - t: "|t:t|th:th|tw:tw|tl:t|t*:2|e*:2|", - th: "|t:th|th:th|tw:t|tl:th|t*:t|e*:2|", - tw: "|t:tw|th:t|tw:tw|tl:tw|t*:t|e*:2|", - tl: "|t:tl|th:th|tw:tw|tl:tl|t*:t|e*:2|", - "e*": "|e*:1|n*:1|t*:1|", - }, - oneargnumeric: { - "n*": "|n*:n|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - twoargnumeric: { - "n*": "|n*:n|t*:e#VALUE!|e*:2|", - "e*": "|e*:1|n*:1|t*:1|", - "t*": "|t*:e#VALUE!|n*:e#VALUE!|e*:2|", - }, - propagateerror: { - "n*": "|n*:2|e*:2|", - "e*": "|e*:2|", - "t*": "|t*:2|e*:2|", - b: "|b:2|e*:2|", - }, - }; - - /* ******************* - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(line) - - Parses a text string as if it was a spreadsheet formula - - This uses a simple state machine run on each character in turn. - States remember whether a number is being gathered, etc. - The result is parseinfo which is an array with one entry for each token: - parseinfo[i] = { - text: "the characters making up the parsed token", - type: the type of the token (a number), - opcode: a single character version of an operator suitable for use in the - precedence table and distinguishing between unary and binary + and -. - -************************* */ - - SocialCalc.Formula.ParseFormulaIntoTokens = function (line) { - var i, - ch, - chclass, - haddecimal, - last_token, - last_token_type, - last_token_text, - t; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var parsestate = scf.ParseState; - var tokentype = scf.TokenType; - var charclass = scf.CharClass; - var charclasstable = scf.CharClassTable; - var uppercasetable = scf.UpperCaseTable; // much faster than toUpperCase function - var pushtoken = scf.ParsePushToken; - var coordregex = /^\$?[A-Z]{1,2}\$?[1-9]\d*$/i; - - var parseinfo = []; - var str = ""; - var state = 0; - var haddecimal = false; - var cclass; - - for (i = 0; i <= line.length; i++) { - if (i < line.length) { - ch = line.charAt(i); - cclass = charclasstable[ch]; - } else { - ch = ""; - cclass = charclass.eof; - } - - if (state == parsestate.num) { - if (cclass == charclass.num) { - str += ch; - } else if (cclass == charclass.numstart && !haddecimal) { - haddecimal = true; - str += ch; - } else if (ch == "E" || ch == "e") { - str += ch; - haddecimal = false; - state = parsestate.numexp1; - } else { - // end of number - save it - pushtoken(parseinfo, str, tokentype.num, 0); - haddecimal = false; - state = 0; - } - } - - if (state == parsestate.numexp1) { - if (cclass == parsestate.num) { - state = parsestate.numexp2; - } else if ( - (ch == "+" || ch == "-") && - uppercasetable[str.charAt(str.length - 1)] == "E" - ) { - str += ch; - } else if (ch == "E" || ch == "e") { - } else { - pushtoken(parseinfo, scc.s_parseerrexponent, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.numexp2) { - if (cclass == charclass.num) { - str += ch; - } else { - // end of number - save it - pushtoken(parseinfo, str, tokentype.num, 0); - state = 0; - } - } - - if (state == parsestate.alpha) { - if (cclass == charclass.num) { - state = parsestate.coord; - } else if (cclass == charclass.alpha || ch == ".") { - // alpha may be letters, numbers, "_", or "." - str += ch; - } else if (cclass == charclass.incoord) { - state = parsestate.coord; - } else if ( - cclass == charclass.op || - cclass == charclass.numstart || - cclass == charclass.space || - cclass == charclass.eof - ) { - pushtoken(parseinfo, str.toUpperCase(), tokentype.name, 0); - state = 0; - } else { - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.coord) { - if (cclass == charclass.num) { - str += ch; - } else if (cclass == charclass.incoord) { - str += ch; - } else if (cclass == charclass.alpha) { - state = parsestate.alphanumeric; - } else if ( - cclass == charclass.op || - cclass == charclass.numstart || - cclass == charclass.eof || - cclass == charclass.space - ) { - if (coordregex.test(str)) { - t = tokentype.coord; - } else { - t = tokentype.name; - } - pushtoken(parseinfo, str.toUpperCase(), t, 0); - state = 0; - } else { - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.alphanumeric) { - if (cclass == charclass.num || cclass == charclass.alpha) { - str += ch; - } else if ( - cclass == charclass.op || - cclass == charclass.numstart || - cclass == charclass.space || - cclass == charclass.eof - ) { - pushtoken(parseinfo, str.toUpperCase(), tokentype.name, 0); - state = 0; - } else { - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.string) { - if (cclass == charclass.quote) { - state = parsestate.stringquote; // got quote in string: is it doubled (quote in string) or by itself (end of string)? - } else if (cclass == charclass.eof) { - pushtoken(parseinfo, scc.s_parseerrstring, tokentype.error, 0); - state = 0; - } else { - str += ch; - } - } else if (state == parsestate.stringquote) { - // note else if here - if (cclass == charclass.quote) { - str += '"'; - state = parsestate.string; // double quote: add one then continue getting string - } else { - // something else -- end of string - pushtoken(parseinfo, str, tokentype.string, 0); - state = 0; // drop through to process - } - } else if (state == parsestate.specialvalue) { - // special values like #REF! - if (str.charAt(str.length - 1) == "!") { - // done - save value as a name - pushtoken(parseinfo, str, tokentype.name, 0); - state = 0; // drop through to process - } else if (cclass == charclass.eof) { - pushtoken(parseinfo, scc.s_parseerrspecialvalue, tokentype.error, 0); - state = 0; - } else { - str += ch; - } - } - - if (state == 0) { - if (cclass == charclass.num) { - str = ch; - state = parsestate.num; - } else if (cclass == charclass.numstart) { - str = ch; - haddecimal = true; - state = parsestate.num; - } else if (cclass == charclass.alpha || cclass == charclass.incoord) { - str = ch; - state = parsestate.alpha; - } else if (cclass == charclass.specialstart) { - str = ch; - state = parsestate.specialvalue; - } else if (cclass == charclass.op) { - str = ch; - if (parseinfo.length > 0) { - last_token = parseinfo[parseinfo.length - 1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - if (last_token_type == charclass.op) { - if (last_token_text == "<" || last_token_text == ">") { - str = last_token_text + str; - parseinfo.pop(); - if (parseinfo.length > 0) { - last_token = parseinfo[parseinfo.length - 1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - } else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - } - } - } else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - t = tokentype.op; - if ( - parseinfo.length == 0 || - (last_token_type == charclass.op && - last_token_text != ")" && - last_token_text != "%") - ) { - // Unary operator - if (str == "-") { - // M is unary minus - str = "M"; - ch = "M"; - } else if (str == "+") { - // P is unary plus - str = "P"; - ch = "P"; - } else if (str == ")" && last_token_text == "(") { - // null arg list OK - } else if (str != "(") { - // binary-op open-paren OK, others no - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } else if (str.length > 1) { - if (str == ">=") { - // G is >= - str = "G"; - ch = "G"; - } else if (str == "<=") { - // L is <= - str = "L"; - ch = "L"; - } else if (str == "<>") { - // N is <> - str = "N"; - ch = "N"; - } else { - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } - pushtoken(parseinfo, str, t, ch); - state = 0; - } else if (cclass == charclass.quote) { - // starting a string - str = ""; - state = parsestate.string; - } else if (cclass == charclass.space) { - // store so can reconstruct spacing - pushtoken(parseinfo, " ", tokentype.space, 0); - } else if (cclass == charclass.eof) { - // ignore -- needed to have extra loop to close out other things - } else { - // unknown class - such as unknown char - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - } - } - } - - return parseinfo; - }; - - SocialCalc.Formula.ParsePushToken = function ( - parseinfo, - ttext, - ttype, - topcode - ) { - parseinfo.push({ text: ttext, type: ttype, opcode: topcode }); - }; - - /* ******************* - - result = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, allowrangereturn) - - Does the calculation expressed in a parsed formula, returning a value, its type, and error info - returns: {value: value, type: valuetype, error: errortext}. - - If allowrangereturn is present and true, can return a range (e.g., "A1:A10" - translated from "A1|A10|") - -************************* */ - - SocialCalc.Formula.evaluate_parsed_formula = function ( - parseinfo, - sheet, - allowrangereturn - ) { - var result; - - var scf = SocialCalc.Formula; - var tokentype = scf.TokenType; - - var revpolish; - var parsestack = []; - - var errortext = ""; - - revpolish = scf.ConvertInfixToPolish(parseinfo); // result is either an array or a string with error text - - result = scf.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn); - - return result; - }; - - // - // revpolish = SocialCalc.Formula.ConvertInfixToPolish(parseinfo) - // - // Convert infix to reverse polish notation - // - // Returns revpolish array with a sequence of references to tokens by number if successful. - // Errors return a string with the error. - // - // Based upon the algorithm shown in Wikipedia "Reverse Polish notation" article - // and then enhanced for additional spreadsheet things - // - - SocialCalc.Formula.ConvertInfixToPolish = function (parseinfo) { - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var token_precedence = scf.TokenPrecedence; - - var revpolish = []; - var parsestack = []; - - var errortext = ""; - - var function_start = -1; - - var i, pii, ttype, ttext, tprecedence, tstackprecedence; - - for (i = 0; i < parseinfo.length; i++) { - pii = parseinfo[i]; - ttype = pii.type; - ttext = pii.text; - if ( - ttype == tokentype.num || - ttype == tokentype.coord || - ttype == tokentype.string - ) { - revpolish.push(i); - } else if (ttype == tokentype.name) { - parsestack.push(i); - revpolish.push(function_start); - } else if (ttype == tokentype.space) { - // ignore - continue; - } else if (ttext == ",") { - while ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].text != "(" - ) { - revpolish.push(parsestack.pop()); - } - if (parsestack.length == 0) { - // no ( -- error - errortext = scc.s_parseerrmissingopenparen; - break; - } - } else if (ttext == "(") { - parsestack.push(i); - } else if (ttext == ")") { - while ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].text != "(" - ) { - revpolish.push(parsestack.pop()); - } - if (parsestack.length == 0) { - // no ( -- error - errortext = scc.s_parseerrcloseparennoopen; - break; - } - parsestack.pop(); - if ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].type == tokentype.name - ) { - revpolish.push(parsestack.pop()); - } - } else if (ttype == tokentype.op) { - if ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].type == tokentype.name - ) { - revpolish.push(parsestack.pop()); - } - while ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].type == tokentype.op && - parseinfo[parsestack[parsestack.length - 1]].text != "(" - ) { - tprecedence = token_precedence[pii.opcode]; - tstackprecedence = - token_precedence[ - parseinfo[parsestack[parsestack.length - 1]].opcode - ]; - if (tprecedence >= 0 && tprecedence < tstackprecedence) { - break; - } else if (tprecedence < 0) { - tprecedence = -tprecedence; - if (tstackprecedence < 0) tstackprecedence = -tstackprecedence; - if (tprecedence <= tstackprecedence) { - break; - } - } - revpolish.push(parsestack.pop()); - } - parsestack.push(i); - } else if (ttype == tokentype.error) { - errortext = ttext; - break; - } else { - errortext = "Internal error while processing parsed formula. "; - break; - } - } - while (parsestack.length > 0) { - if (parseinfo[parsestack[parsestack.length - 1]].text == "(") { - errortext = scc.s_parseerrmissingcloseparen; - break; - } - revpolish.push(parsestack.pop()); - } - - if (errortext) { - return errortext; - } - - return revpolish; - }; - - // - // result = SocialCalc.Formula.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn) - // - // Execute reverse polish representation of formula - // - // Operand values are objects in the operand array with a "type" and an optional "value". - // Type can have these values (many are type and sub-type as two or more letters): - // "tw", "th", "t", "n", "nt", "coord", "range", "start", "eErrorType", "b" (blank) - // The value of a coord is in the form A57 or A57!sheetname - // The value of a range is coord|coord|number where number starts at 0 and is - // the offset of the next item to fetch if you are going through the range one by one - // The number starts as a null string ("A1|B3|") - // - - SocialCalc.Formula.EvaluatePolish = function ( - parseinfo, - revpolish, - sheet, - allowrangereturn - ) { - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var lookup_result_type = scf.LookupResultType; - var typelookup = scf.TypeLookupTable; - var operand_as_number = scf.OperandAsNumber; - var operand_as_text = scf.OperandAsText; - var operand_value_and_type = scf.OperandValueAndType; - var operands_as_coord_on_sheet = scf.OperandsAsCoordOnSheet; - var format_number_for_display = - SocialCalc.format_number_for_display || - function (v, t, f) { - return v + ""; - }; - - var errortext = ""; - var function_start = -1; - var missingOperandError = { - value: "", - type: "e#VALUE!", - error: scc.s_parseerrmissingoperand, - }; - var value; - - var operand = []; - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - var i, - rii, - prii, - ttype, - ttext, - value1, - value2, - tostype, - tostype2, - resulttype, - valuetype, - cond, - vmatch, - smatch; - - if (!parseinfo.length || !(revpolish instanceof Array)) { - return { - value: "", - type: "e#VALUE!", - error: typeof revpolish == "string" ? revpolish : "", - }; - } - - for (i = 0; i < revpolish.length; i++) { - rii = revpolish[i]; - if (rii == function_start) { - // Remember the start of a function argument list - PushOperand("start", 0); - continue; - } - - prii = parseinfo[rii]; - ttype = prii.type; - ttext = prii.text; - - if (ttype == tokentype.num) { - PushOperand("n", ttext - 0); - } else if (ttype == tokentype.coord) { - PushOperand("coord", ttext); - } else if (ttype == tokentype.string) { - PushOperand("t", ttext); - } else if (ttype == tokentype.op) { - if (operand.length <= 0) { - // Nothing on the stack... - return missingOperandError; - break; // done - } - - // Unary minus - - if (ttext == "M") { - value1 = operand_as_number(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.unaryminus - ); - PushOperand(resulttype, -value1.value); - } - - // Unary plus - else if (ttext == "P") { - value1 = operand_as_number(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.unaryplus - ); - PushOperand(resulttype, value1.value); - } - - // Unary % - percent, left associative - else if (ttext == "%") { - value1 = operand_as_number(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.unarypercent - ); - PushOperand(resulttype, 0.01 * value1.value); - } - - // & - string concatenate - else if (ttext == "&") { - if (operand.length <= 1) { - // Need at least two things on the stack... - return missingOperandError; - } - value2 = operand_as_text(sheet, operand); - value1 = operand_as_text(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.concat - ); - PushOperand(resulttype, value1.value + value2.value); - } - - // : - Range constructor - else if (ttext == ":") { - if (operand.length <= 1) { - // Need at least two things on the stack... - return missingOperandError; - } - value1 = scf.OperandsAsRangeOnSheet(sheet, operand); // get coords even if use name on other sheet - if (value1.error) { - // not available - errortext = errortext || value1.error; - } - PushOperand(value1.type, value1.value); // push sheetname with range on that sheet - } - - // ! - sheetname!coord - else if (ttext == "!") { - if (operand.length <= 1) { - // Need at least two things on the stack... - return missingOperandError; - } - value1 = operands_as_coord_on_sheet(sheet, operand); // get coord even if name on other sheet - if (value1.error) { - // not available - errortext = errortext || value1.error; - } - PushOperand(value1.type, value1.value); // push sheetname with coord or range on that sheet - } - - // Comparison operators: < L = G > N (< <= = >= > <>) - else if ( - ttext == "<" || - ttext == "L" || - ttext == "=" || - ttext == "G" || - ttext == ">" || - ttext == "N" - ) { - if (operand.length <= 1) { - // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_value_and_type(sheet, operand); - value1 = operand_value_and_type(sheet, operand); - if (value1.type.charAt(0) == "n" && value2.type.charAt(0) == "n") { - // compare two numbers - cond = 0; - if (ttext == "<") { - cond = value1.value < value2.value ? 1 : 0; - } else if (ttext == "L") { - cond = value1.value <= value2.value ? 1 : 0; - } else if (ttext == "=") { - cond = value1.value == value2.value ? 1 : 0; - } else if (ttext == "G") { - cond = value1.value >= value2.value ? 1 : 0; - } else if (ttext == ">") { - cond = value1.value > value2.value ? 1 : 0; - } else if (ttext == "N") { - cond = value1.value != value2.value ? 1 : 0; - } - PushOperand("nl", cond); - } else if (value1.type.charAt(0) == "e") { - // error on left - PushOperand(value1.type, 0); - } else if (value2.type.charAt(0) == "e") { - // error on right - PushOperand(value2.type, 0); - } else { - // text maybe mixed with numbers or blank - tostype = value1.type.charAt(0); - tostype2 = value2.type.charAt(0); - if (tostype == "n") { - value1.value = format_number_for_display(value1.value, "n", ""); - } else if (tostype == "b") { - value1.value = ""; - } - if (tostype2 == "n") { - value2.value = format_number_for_display(value2.value, "n", ""); - } else if (tostype2 == "b") { - value2.value = ""; - } - cond = 0; - value1.value = value1.value.toLowerCase(); // ignore case - value2.value = value2.value.toLowerCase(); - if (ttext == "<") { - cond = value1.value < value2.value ? 1 : 0; - } else if (ttext == "L") { - cond = value1.value <= value2.value ? 1 : 0; - } else if (ttext == "=") { - cond = value1.value == value2.value ? 1 : 0; - } else if (ttext == "G") { - cond = value1.value >= value2.value ? 1 : 0; - } else if (ttext == ">") { - cond = value1.value > value2.value ? 1 : 0; - } else if (ttext == "N") { - cond = value1.value != value2.value ? 1 : 0; - } - PushOperand("nl", cond); - } - } - - // Normal infix arithmethic operators: +, -. *, /, ^ - else { - // what's left are the normal infix arithmetic operators - if (operand.length <= 1) { - // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_as_number(sheet, operand); - value1 = operand_as_number(sheet, operand); - if (ttext == "+") { - resulttype = lookup_result_type( - value1.type, - value2.type, - typelookup.plus - ); - PushOperand(resulttype, value1.value + value2.value); - } else if (ttext == "-") { - resulttype = lookup_result_type( - value1.type, - value2.type, - typelookup.plus - ); - PushOperand(resulttype, value1.value - value2.value); - } else if (ttext == "*") { - resulttype = lookup_result_type( - value1.type, - value2.type, - typelookup.plus - ); - PushOperand(resulttype, value1.value * value2.value); - } else if (ttext == "/") { - if (value2.value != 0) { - PushOperand("n", value1.value / value2.value); // gives plain numeric result type - } else { - PushOperand("e#DIV/0!", 0); - } - } else if (ttext == "^") { - value1.value = Math.pow(value1.value, value2.value); - value1.type = "n"; // gives plain numeric result type - if (isNaN(value1.value)) { - value1.value = 0; - value1.type = "e#NUM!"; - } - PushOperand(value1.type, value1.value); - } - } - } - - // function or name - else if (ttype == tokentype.name) { - errortext = scf.CalculateFunction(ttext, operand, sheet); - if (errortext) break; - } else { - errortext = - scc.s_InternalError + "Unknown token " + ttype + " (" + ttext + "). "; - break; - } - } - - // look at final value and handle special cases - - value = operand[0] ? operand[0].value : ""; - tostype = operand[0] ? operand[0].type : ""; - - if (tostype == "name") { - // name - expand it - value1 = SocialCalc.Formula.LookupName(sheet, value); - value = value1.value; - tostype = value1.type; - errortext = errortext || value1.error; - } - - if (tostype == "coord") { - // the value is a coord reference, get its value and type - value1 = operand_value_and_type(sheet, operand); - value = value1.value; - tostype = value1.type; - if (tostype == "b") { - tostype = "n"; - value = 0; - } - } - - if (operand.length > 1 && !errortext) { - // something left - error - errortext += scc.s_parseerrerrorinformula; - } - - // set return type - - valuetype = tostype; - - if (tostype.charAt(0) == "e") { - // error value - errortext = - errortext || tostype.substring(1) || scc.s_calcerrerrorvalueinformula; - } else if (tostype == "range") { - vmatch = value.match(/^(.*)\|(.*)\|/); - smatch = vmatch[1].indexOf("!"); - if (smatch >= 0) { - // swap sheetname - vmatch[1] = - vmatch[1].substring(smatch + 1) + - "!" + - vmatch[1].substring(0, smatch).toUpperCase(); - } else { - vmatch[1] = vmatch[1].toUpperCase(); - } - value = vmatch[1] + ":" + vmatch[2].toUpperCase(); - if (!allowrangereturn) { - errortext = scc.s_formularangeresult + " " + value; - } - } - - if (errortext && valuetype.charAt(0) != "e") { - value = errortext; - valuetype = "e"; - } - - // look for overflow - - if (valuetype.charAt(0) == "n" && (isNaN(value) || !isFinite(value))) { - value = 0; - valuetype = "e#NUM!"; - errortext = isNaN(value) - ? scc.s_calcerrnumericnan - : scc.s_calcerrnumericoverflow; - } - - return { value: value, type: valuetype, error: errortext }; - }; - - /* -# -# resulttype = SocialCalc.Formula.LookupResultType(type1, type2, typelookup); -# -# typelookup has values of the following form: -# -# typelookup{"typespec1"} = "|typespec2A:resultA|typespec2B:resultB|..." -# -# First type1 is looked up. If no match, then the first letter (major type) of type1 plus "*" is looked up -# resulttype is type1 if result is "1", type2 if result is "2", otherwise the value of result. -# -*/ - - SocialCalc.Formula.LookupResultType = function (type1, type2, typelookup) { - var pos1, pos2, result; - - var table1 = typelookup[type1]; - - if (!table1) { - table1 = typelookup[type1.charAt(0) + "*"]; - if (!table1) { - return ( - "e#VALUE! (internal error, missing LookupResultType " + - type1.charAt(0) + - "*)" - ); // missing from table -- please add it - } - } - pos1 = table1.indexOf("|" + type2 + ":"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1 + 1); - if (pos2 < 0) - return ( - "e#VALUE! (internal error, incorrect LookupResultType " + table1 + ")" - ); - result = table1.substring(pos1 + type2.length + 2, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - pos1 = table1.indexOf("|" + type2.charAt(0) + "*:"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1 + 1); - if (pos2 < 0) - return ( - "e#VALUE! (internal error, incorrect LookupResultType " + table1 + ")" - ); - result = table1.substring(pos1 + 4, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - return "e#VALUE!"; - }; - - /* -# -# operandinfo = SocialCalc.Formula.TopOfStackValueAndType(sheet, operand) -# -# Returns top of stack value and type and then pops the stack. -# The result is {value: value, type: type, error: "only if bad error"} -# -*/ - - SocialCalc.Formula.TopOfStackValueAndType = function (sheet, operand) { - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - if (!stacklen) { - // make sure something is there - result.error = - SocialCalc.Constants.s_InternalError + "no operand on stack"; - return result; - } - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - return result; - }; - - /* -# -# operandinfo = OperandAsNumber(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns numeric value and type. -# Text values are treated as 0 if they can't be converted somehow. -# -*/ - - SocialCalc.Formula.OperandAsNumber = function (sheet, operand) { - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "n") { - operandinfo.value = operandinfo.value - 0; - } else if (t == "b") { - // blank cell - operandinfo.type = "n"; - operandinfo.value = 0; - } else if (t == "e") { - // error - operandinfo.value = 0; - } else { - valueinfo = SocialCalc.DetermineValueType - ? SocialCalc.DetermineValueType(operandinfo.value) - : { value: operandinfo.value - 0, type: "n" }; // if without rest of SocialCalc - if (valueinfo.type.charAt(0) == "n") { - operandinfo.value = valueinfo.value - 0; - operandinfo.type = valueinfo.type; - } else { - operandinfo.value = 0; - operandinfo.type = valueinfo.type; - } - } - - return operandinfo; - }; - - /* -# -# operandinfo = OperandAsText(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns text value, preserving sub-type. -# -*/ - - SocialCalc.Formula.OperandAsText = function (sheet, operand) { - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "t") { - // any flavor of text returns as is - } else if (t == "n") { - operandinfo.value = SocialCalc.format_number_for_display - ? SocialCalc.format_number_for_display( - operandinfo.value, - operandinfo.type, - "" - ) - : (operandinfo.value = operandinfo.value + ""); - operandinfo.type = "t"; - } else if (t == "b") { - // blank - operandinfo.value = ""; - operandinfo.type = "t"; - } else if (t == "e") { - // error - operandinfo.value = ""; - } else { - operand.value = operandinfo.value + ""; - operand.type = "t"; - } - - return operandinfo; - }; - - /* -# -# result = SocialCalc.Formula.OperandValueAndType(sheet, operand) -# -# Pops the top of stack and returns it, following a coord reference if necessary. -# The result is {value: value, type: type, error: "only if bad error"} -# Ranges are returned as if they were pushed onto the stack first coord first -# Also sets type with "t", "n", "th", etc., as appropriate -# -*/ - - SocialCalc.Formula.OperandValueAndType = function (sheet, operand) { - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - if (!stacklen) { - // make sure something is there - result.error = - SocialCalc.Constants.s_InternalError + "no operand on stack"; - return result; - } - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - if (result.type == "range") { - result = scf.StepThroughRangeDown(operand, result.value); - } - - if (result.type == "coord") { - // value is a coord reference - coordsheet = sheet; - pos = result.value.indexOf("!"); - if (pos != -1) { - // sheet reference - coordsheet = scf.FindInSheetCache(result.value.substring(pos + 1)); // get other sheet - if (coordsheet == null) { - // unavailable - result.type = "e#REF!"; - result.error = - SocialCalc.Constants.s_sheetunavailable + - " " + - result.value.substring(pos + 1); - result.value = 0; - return result; - } - result.value = result.value.substring(0, pos); // get coord part - } - - if (coordsheet) { - cell = coordsheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - cellvtype = cell.valuetype; // get type of value in the cell it points to - result.value = cell.datavalue; - } else { - cellvtype = "b"; - } - } else { - cellvtype = "e#N/A"; - result.value = 0; - } - result.type = cellvtype || "b"; - if (result.type == "b") { - // blank - result.value = 0; - } - } - - return result; - }; - - /* -# -# operandinfo = SocialCalc.Formula.OperandAsCoord(sheet, operand) -# -# Gets top of stack and pops it. -# Returns coord value. All others are treated as an error. -# -*/ - - SocialCalc.Formula.OperandAsCoord = function (sheet, operand) { - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - result = SocialCalc.Formula.LookupName(sheet, result.value); - } - if (result.type == "coord") { - // value is a coord reference - return result; - } else { - result.value = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - return result; - } - }; - - /* -# -# result = SocialCalc.Formula.OperandsAsCoordOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as sheetname!coord-or-name. -# Returns stack-style coord value (coord!sheetname, or coord!sheetname|coord|) with -# a type of coord or range. All others are treated as an error. -# If sheetname not available, sets result.error. -# -*/ - - SocialCalc.Formula.OperandsAsCoordOnSheet = function (sheet, operand) { - var sheetname, othersheet, pos1, pos2; - var value1 = {}; - var result = {}; - var scf = SocialCalc.Formula; - - var stacklen = operand.length; - value1.value = operand[stacklen - 1].value; // get top of stack - coord or name - value1.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - sheetname = scf.OperandAsSheetName(sheet, operand); // get sheetname as text - othersheet = scf.FindInSheetCache(sheetname.value); - if (othersheet == null) { - // unavailable - result.type = "e#REF!"; - result.value = 0; - result.error = - SocialCalc.Constants.s_sheetunavailable + " " + sheetname.value; - return result; - } - - if (value1.type == "name") { - value1 = scf.LookupName(othersheet, value1.value); - } - result.type = value1.type; - if (value1.type == "coord") { - // value is a coord reference - result.value = value1.value + "!" + sheetname.value; // return in the format as used on stack - } else if (value1.type == "range") { - // value is a range reference - pos1 = value1.value.indexOf("|"); - pos2 = value1.value.indexOf("|", pos1 + 1); - result.value = - value1.value.substring(0, pos1) + - "!" + - sheetname.value + - "|" + - value1.value.substring(pos1 + 1, pos2) + - "|"; - } else if (value1.type.charAt(0) == "e") { - result.value = value1.value; - } else { - result.error = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - result.value = 0; - } - return result; - }; - - /* -# -# result = SocialCalc.Formula.OperandsAsRangeOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as coord2-or-name:coord1. -# Name is evaluated on sheet of coord1. -# Returns result with "value" of stack-style range value (coord!sheetname|coord|) and -# "type" of "range". All others are treated as an error. -# -*/ - - SocialCalc.Formula.OperandsAsRangeOnSheet = function (sheet, operand) { - var value1, othersheet, pos1, pos2; - var value2 = {}; - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var stacklen = operand.length; - value2.value = operand[stacklen - 1].value; // get top of stack - coord or name for "right" side - value2.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - value1 = scf.OperandAsCoord(sheet, operand); // get "left" coord - if (value1.type != "coord") { - // not a coord, which it must be - return { value: 0, type: "e#REF!" }; - } - - othersheet = sheet; - pos1 = value1.value.indexOf("!"); - if (pos1 != -1) { - // sheet reference - pos2 = value1.value.indexOf("|", pos1 + 1); - if (pos2 < 0) pos2 = value1.value.length; - othersheet = scf.FindInSheetCache(value1.value.substring(pos1 + 1, pos2)); // get other sheet - if (othersheet == null) { - // unavailable - return { - value: 0, - type: "e#REF!", - errortext: - scc.s_sheetunavailable + - " " + - value1.value.substring(pos1 + 1, pos2), - }; - } - } - - if (value2.type == "name") { - // coord:name is allowed, if name is just one cell - value2 = scf.LookupName(othersheet, value2.value); - } - - if (value2.type == "coord") { - // value is a coord reference, so return the combined range - return { value: value1.value + "|" + value2.value + "|", type: "range" }; // return range in the format as used on stack - } else { - // bad form - return { value: scc.s_calcerrcellrefmissing, type: "e#REF!" }; - } - }; - - /* -# -# result = SocialCalc.Formula.OperandAsSheetName(sheet, operand) -# -# Gets top of stack and pops it. -# Returns sheetname value. All others are treated as an error. -# Accepts text, cell reference, and named value which is one of those two. -# -*/ - - SocialCalc.Formula.OperandAsSheetName = function (sheet, operand) { - var nvalue, cell; - - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - nvalue = SocialCalc.Formula.LookupName(sheet, result.value); - if (!nvalue.value) { - // not a known name - return bare name as the name value - return result; - } - result.value = nvalue.value; - result.type = nvalue.type; - } - if (result.type == "coord") { - // value is a coord reference, follow it to find sheet name - cell = sheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - result.value = cell.datavalue; - result.type = cell.valuetype; - } else { - result.value = ""; - result.type = "b"; - } - } - if (result.type.charAt(0) == "t") { - // value is a string which could be a sheet name - return result; - } else { - result.value = ""; - result.error = SocialCalc.Constants.s_calcerrsheetnamemissing; - return result; - } - }; - - // - // value = SocialCalc.Formula.LookupName(sheet, name) - // - // Returns value and type of a named value - // Names are case insensitive - // Names may have a definition which is a coord (A1), a range (A1:B7), or a formula (=OFFSET(A1,0,0,5,1)) - // Note: The range must not have sheet names ("!") in them. - // - - SocialCalc.Formula.LookupName = function (sheet, name) { - var pos, specialc, parseinfo; - var names = sheet.names; - var value = {}; - var startedwalk = false; - - if (names[name.toUpperCase()]) { - // is name defined? - - value.value = names[name.toUpperCase()].definition; // yes - - if (value.value.charAt(0) == "=") { - // formula - if (!sheet.checknamecirc) { - // are we possibly walking the name tree? - sheet.checknamecirc = {}; // not yet - startedwalk = true; // remember we are the reference that started it - } else { - if (sheet.checknamecirc[name]) { - // circular reference - value.type = "e#NAME?"; - value.error = - SocialCalc.Constants.s_circularnameref + ' "' + name + '".'; - return value; - } - } - sheet.checknamecirc[name] = true; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens( - value.value.substring(1) - ); - value = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, 1); // parse formula, allowing range return - - delete sheet.checknamecirc[name]; // done with us - if (startedwalk) { - delete sheet.checknamecirc; // done with walk - } - - if (value.type != "range") { - return value; - } - } - - pos = value.value.indexOf(":"); - if (pos != -1) { - // range - value.type = "range"; - value.value = - value.value.substring(0, pos) + - "|" + - value.value.substring(pos + 1) + - "|"; - value.value = value.value.toUpperCase(); - } else { - value.type = "coord"; - value.value = value.value.toUpperCase(); - } - return value; - } else if ( - (specialc = SocialCalc.Formula.SpecialConstants[name.toUpperCase()]) - ) { - // special constant, like #REF! - pos = specialc.indexOf(","); - value.value = specialc.substring(0, pos) - 0; - value.type = specialc.substring(pos + 1); - return value; - } else { - value.value = ""; - value.type = "e#NAME?"; - value.error = - SocialCalc.Constants.s_calcerrunknownname + ' "' + name + '"'; - return value; - } - }; - - /* -# -# coord = SocialCalc.Formula.StepThroughRangeDown(operand, rangevalue) -# -# Returns next coord in a range, keeping track on the operand stack -# Goes from upper left across and down to bottom right. -# -*/ - - SocialCalc.Formula.StepThroughRangeDown = function (operand, rangevalue) { - var value1, value2, sequence, pos1, pos2, sheet1, rp, c, r, count; - var scf = SocialCalc.Formula; - - pos1 = rangevalue.indexOf("|"); - pos2 = rangevalue.indexOf("|", pos1 + 1); - value1 = rangevalue.substring(0, pos1); - value2 = rangevalue.substring(pos1 + 1, pos2); - sequence = rangevalue.substring(pos2 + 1) - 0; - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1); - value1 = value1.substring(0, pos1); - } else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - rp = scf.OrderRangeParts(value1, value2); - - count = 0; - for (r = rp.r1; r <= rp.r2; r++) { - for (c = rp.c1; c <= rp.c2; c++) { - count++; - if (count > sequence) { - if (r != rp.r2 || c != rp.c2) { - // keep on stack until done - scf.PushOperand( - operand, - "range", - value1 + sheet1 + "|" + value2 + "|" + count - ); - } - return { value: SocialCalc.crToCoord(c, r) + sheet1, type: "coord" }; - } - } - } - }; - - /* -# -# result = SocialCalc.Formula.DecodeRangeParts(sheetdata, range) -# -# Returns sheetdata for the sheet where the range is, as well as -# the number of the first column in the range, the number of columns, -# and equivalent row information: -# -# {sheetdata: sheet, sheetname: name-or-"", col1num: n, ncols: n, row1num: n, nrows: n} -# -# If any errors, a null result is returned. -# -*/ - - SocialCalc.Formula.DecodeRangeParts = function (sheetdata, range) { - var value1, value2, pos1, pos2, sheet1, coordsheetdata, rp; - - var scf = SocialCalc.Formula; - - pos1 = range.indexOf("|"); - pos2 = range.indexOf("|", pos1 + 1); - value1 = range.substring(0, pos1); - value2 = range.substring(pos1 + 1, pos2); - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1 + 1); - value1 = value1.substring(0, pos1); - } else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - coordsheetdata = sheetdata; - if (sheet1) { - // sheet reference - coordsheetdata = scf.FindInSheetCache(sheet1); - if (coordsheetdata == null) { - // unavailable - return null; - } - } - - rp = scf.OrderRangeParts(value1, value2); - - return { - sheetdata: coordsheetdata, - sheetname: sheet1, - col1num: rp.c1, - ncols: rp.c2 - rp.c1 + 1, - row1num: rp.r1, - nrows: rp.r2 - rp.r1 + 1, - }; - }; - - //********************* - // - // Function Handling - // - //********************* - - // List of functions -- Define after functions are defined - // - // SocialCalc.Formula.FunctionList["function_name"] = [function_subroutine, number_of_arguments, arg_def, func_def, func_class] - // function_subroutine takes arguments (fname, operand, foperand, sheet), returns - // errortext or null, pushing result on operand stack. - // number_of_arguments is: - // 0 = no arguments - // >0 = exactly that many arguments - // <0 = that many arguments (abs value) or more - // 100 = don't check - // - // arg_def, if present, is the name of the element in SocialCalc.Formula.FunctionArgDefs. - // func_def, if present, is a string explaining the function. If not, looked up in SocialCalc.Constants. - // func_class, if present, is the comma-separated names of the elements in SocialCalc.Formula.FunctionClasses. - // - // To add a function, just add it to this object. - - if (!SocialCalc.Formula.FunctionList) { - // make sure it is defined (could have been in another module) - SocialCalc.Formula.FunctionList = {}; - } - - // FunctionClasses[classname] = {name: full-name-string, items: [sorted list of function names]}; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionClasses = null; // start null to say needs filling in - - // FunctionArgDef[argname] = explicit-string-for-arg-list; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionArgDefs = {}; - - /* -# -# errortext = SocialCalc.Formula.CalculateFunction(fname, operand, sheet) -# -# Dispatches for function fname. -# -*/ - - SocialCalc.Formula.CalculateFunction = function (fname, operand, sheet) { - var fobj, foperand, ffunc, argnum, ttext; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = ""; - - fobj = scf.FunctionList[fname]; - - if (fobj) { - foperand = []; - ffunc = fobj[0]; - argnum = fobj[1]; - scf.CopyFunctionArgs(operand, foperand); - if (argnum != 100) { - if (argnum < 0) { - if (foperand.length < -argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } else { - if (foperand.length != argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } - } - errortext = ffunc(fname, operand, foperand, sheet); - } else { - ttext = fname; - - if (operand.length && operand[operand.length - 1].type == "start") { - // no arguments - name or zero arg function - operand.pop(); - scf.PushOperand(operand, "name", ttext); - } else { - errortext = - SocialCalc.Constants.s_sheetfuncunknownfunction + " " + ttext + ". "; - } - } - - return errortext; - }; - - // - // SocialCalc.Formula.PushOperand(operand, t, v) - // - // Pushes the type and value onto the operand stack - // - - SocialCalc.Formula.PushOperand = function (operand, t, v) { - operand.push({ type: t, value: v }); - }; - - // - // SocialCalc.Formula.CopyFunctionArgs(operand, foperand) - // - // Pops operands from operand and pushes on foperand up to function start - // reversing order in the process. - // - - SocialCalc.Formula.CopyFunctionArgs = function (operand, foperand) { - var fobj, foperand, ffunc, argnum; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = null; - - while (operand.length > 0 && operand[operand.length - 1].type != "start") { - // get each arg - foperand.push(operand.pop()); // copy it - } - operand.pop(); // get rid of "start" - - return; - }; - - // - // errortext = SocialCalc.Formula.FunctionArgsError(fname, operand) - // - // Pushes appropriate error on operand stack and returns errortext, including fname - // - - SocialCalc.Formula.FunctionArgsError = function (fname, operand) { - var errortext = - SocialCalc.Constants.s_calcerrincorrectargstofunction + - " " + - fname + - ". "; - SocialCalc.Formula.PushOperand(operand, "e#VALUE!", errortext); - - return errortext; - }; - - // - // errortext = SocialCalc.Formula.FunctionSpecificError(fname, operand, errortype, errortext) - // - // Pushes specified error and text on operand stack. - // - - SocialCalc.Formula.FunctionSpecificError = function ( - fname, - operand, - errortype, - errortext - ) { - SocialCalc.Formula.PushOperand(operand, errortype, errortext); - - return errortext; - }; - - // - // haserror = SocialCalc.Formula.CheckForErrorValue(operand, v) - // - // If v.type is an error, push it on operand stack and return true, otherwise return false. - // - - SocialCalc.Formula.CheckForErrorValue = function (operand, v) { - if (v.type.charAt(0) == "e") { - operand.push(v); - return true; - } else { - return false; - } - }; - - ///////////////////////// - // - // FUNCTION INFORMATION ROUTINES - // - - // - // SocialCalc.Formula.FillFunctionInfo() - // - // Goes through function definitions and fills out FunctionArgDefs and FunctionClasses. - // Execute this after any changes to SocialCalc.Constants but before UI is used. - // - - SocialCalc.Formula.FillFunctionInfo = function () { - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var fname, f, classes, cname, i; - - if (scf.FunctionClasses) { - // only do once - return; - } - - for (fname in scf.FunctionList) { - f = scf.FunctionList[fname]; - if (f[2]) { - // has an arg def - scf.FunctionArgDefs[f[2]] = scc["s_farg_" + f[2]] || ""; // get it from constants - } - if (!f[3]) { - // no text def, see if in constants - if (scc["s_fdef_" + fname]) { - scf.FunctionList[fname][3] = scc["s_fdef_" + fname]; - } - } - } - - scf.FunctionClasses = {}; - - for (i = 0; i < scc.function_classlist.length; i++) { - cname = scc.function_classlist[i]; - scf.FunctionClasses[cname] = { - name: scc["s_fclass_" + cname], - items: [], - }; - } - - for (fname in scf.FunctionList) { - f = scf.FunctionList[fname]; - classes = f[4] ? f[4].split(",") : []; // get classes - classes.push("all"); - for (i = 0; i < classes.length; i++) { - cname = classes[i]; - scf.FunctionClasses[cname].items.push(fname); - } - } - for (cname in scf.FunctionClasses) { - scf.FunctionClasses[cname].items.sort(); - } - }; - - // - // str = SocialCalc.Formula.FunctionArgString(fname) - // - // Returns a string representing the arguments to function fname. - // - - SocialCalc.Formula.FunctionArgString = function (fname) { - var scf = SocialCalc.Formula; - var fdata = scf.FunctionList[fname]; - var nargs, i, str; - - var adef = fdata[2]; - - if (!adef) { - nargs = fdata[1]; - if (nargs == 0) { - adef = " "; - } else if (nargs > 0) { - str = "v1"; - for (i = 2; i <= nargs; i++) { - str += ", v" + i; - } - return str; - } else if (nargs < 0) { - str = "v1"; - for (i = 2; i < -nargs; i++) { - str += ", v" + i; - } - return str + ", ..."; - } else { - return "nargs: " + nargs; - } - } - - str = scf.FunctionArgDefs[adef] || adef; - - return str; - }; - - ///////////////////////// - // - // FUNCTION DEFINITIONS - // - // The standard function definitions follow. - // - // Note that some need SocialCalc.DetermineValueType to be defined. - // - - /* -# -# AVERAGE(v1,c1:c2,...) -# COUNT(v1,c1:c2,...) -# COUNTA(v1,c1:c2,...) -# COUNTBLANK(v1,c1:c2,...) -# MAX(v1,c1:c2,...) -# MIN(v1,c1:c2,...) -# PRODUCT(v1,c1:c2,...) -# STDEV(v1,c1:c2,...) -# STDEVP(v1,c1:c2,...) -# SUM(v1,c1:c2,...) -# VAR(v1,c1:c2,...) -# VARP(v1,c1:c2,...) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the dseries_functions, too. -# -*/ - - SocialCalc.Formula.SeriesFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var value1, t, v1; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - while (foperand.length > 0) { - value1 = operand_value_and_type(sheet, foperand); - t = value1.type.charAt(0); - if (t == "n") count += 1; - if (t != "b") counta += 1; - if (t == "b") countblank += 1; - - if (t == "n") { - v1 = value1.value - 0; // get it as a number - sum += v1; - product *= v1; - maxval = maxval != undefined ? (v1 > maxval ? v1 : maxval) : v1; - minval = minval != undefined ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { - // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } else { - // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type( - value1.type, - resulttypesum || value1.type, - typelookupplus - ); - } else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "SUM": - PushOperand(resulttypesum, sum); - break; - - case "PRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "MIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "MAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "COUNT": - PushOperand("n", count); - break; - - case "COUNTA": - PushOperand("n", counta); - break; - - case "COUNTBLANK": - PushOperand("n", countblank); - break; - - case "AVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - } - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["AVERAGE"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["COUNT"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["COUNTA"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["COUNTBLANK"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["MAX"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["MIN"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["PRODUCT"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["STDEV"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["STDEVP"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["SUM"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["VAR"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["VARP"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - - /* -# -# DAVERAGE(databaserange, fieldname, criteriarange) -# DCOUNT(databaserange, fieldname, criteriarange) -# DCOUNTA(databaserange, fieldname, criteriarange) -# DGET(databaserange, fieldname, criteriarange) -# DMAX(databaserange, fieldname, criteriarange) -# DMIN(databaserange, fieldname, criteriarange) -# DPRODUCT(databaserange, fieldname, criteriarange) -# DSTDEV(databaserange, fieldname, criteriarange) -# DSTDEVP(databaserange, fieldname, criteriarange) -# DSUM(databaserange, fieldname, criteriarange) -# DVAR(databaserange, fieldname, criteriarange) -# DVARP(databaserange, fieldname, criteriarange) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the series_functions, too. -# -*/ - - SocialCalc.Formula.DSeriesFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var value1, - tostype, - cr, - dbrange, - fieldname, - criteriarange, - dbinfo, - criteriainfo; - var fieldasnum, targetcol, i, j, k, cell, criteriafieldnums; - var testok, criteriacr, criteria, testcol, testcr; - var t; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - var value1 = {}; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - dbrange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - fieldname = scf.OperandValueAndType(sheet, foperand); // get a value - criteriarange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - - if (dbrange.type != "range" || criteriarange.type != "range") { - return scf.FunctionArgsError(fname, operand); - } - - dbinfo = scf.DecodeRangeParts(sheet, dbrange.value); - criteriainfo = scf.DecodeRangeParts(sheet, criteriarange.value); - - fieldasnum = scf.FieldToColnum( - dbinfo.sheetdata, - dbinfo.col1num, - dbinfo.ncols, - dbinfo.row1num, - fieldname.value, - fieldname.type - ); - if (fieldasnum <= 0) { - PushOperand("e#VALUE!", 0); - return; - } - - targetcol = dbinfo.col1num + fieldasnum - 1; - criteriafieldnums = []; - - for (i = 0; i < criteriainfo.ncols; i++) { - // get criteria field colnums - cell = criteriainfo.sheetdata.GetAssuredCell( - SocialCalc.crToCoord(criteriainfo.col1num + i, criteriainfo.row1num) - ); - criterianum = scf.FieldToColnum( - dbinfo.sheetdata, - dbinfo.col1num, - dbinfo.ncols, - dbinfo.row1num, - cell.datavalue, - cell.valuetype - ); - if (criterianum <= 0) { - PushOperand("e#VALUE!", 0); - return; - } - criteriafieldnums.push(dbinfo.col1num + criterianum - 1); - } - - for (i = 1; i < dbinfo.nrows; i++) { - // go through each row of the database - testok = false; - CRITERIAROW: for (j = 1; j < criteriainfo.nrows; j++) { - // go through each criteria row - for (k = 0; k < criteriainfo.ncols; k++) { - // look at each column - criteriacr = SocialCalc.crToCoord( - criteriainfo.col1num + k, - criteriainfo.row1num + j - ); // where criteria is - cell = criteriainfo.sheetdata.GetAssuredCell(criteriacr); - criteria = cell.datavalue; - if (typeof criteria == "string" && criteria.length == 0) continue; // blank items are OK - testcol = criteriafieldnums[k]; - testcr = SocialCalc.crToCoord(testcol, dbinfo.row1num + i); // cell to check - cell = criteriainfo.sheetdata.GetAssuredCell(testcr); - if ( - !scf.TestCriteria(cell.datavalue, cell.valuetype || "b", criteria) - ) { - continue CRITERIAROW; // does not meet criteria - check next row - } - } - testok = true; // met all the criteria - break CRITERIAROW; - } - if (!testok) { - continue; - } - - cr = SocialCalc.crToCoord(targetcol, dbinfo.row1num + i); // get cell of this row to do the function on - cell = dbinfo.sheetdata.GetAssuredCell(cr); - - value1.value = cell.datavalue; - value1.type = cell.valuetype; - t = value1.type.charAt(0); - if (t == "n") count += 1; - if (t != "b") counta += 1; - if (t == "b") countblank += 1; - - if (t == "n") { - v1 = value1.value - 0; // get it as a number - sum += v1; - product *= v1; - maxval = maxval != undefined ? (v1 > maxval ? v1 : maxval) : v1; - minval = minval != undefined ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { - // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } else { - // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type( - value1.type, - resulttypesum || value1.type, - typelookupplus - ); - } else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "DSUM": - PushOperand(resulttypesum, sum); - break; - - case "DPRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "DMIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "DMAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "DCOUNT": - PushOperand("n", count); - break; - - case "DCOUNTA": - PushOperand("n", counta); - break; - - case "DAVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DGET": - if (count == 1) { - PushOperand(resulttypesum, sum); - } else if (count == 0) { - PushOperand("e#VALUE!", 0); - } else { - PushOperand("e#NUM!", 0); - } - break; - } - - return; - }; - - SocialCalc.Formula.FunctionList["DAVERAGE"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DCOUNT"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DCOUNTA"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DGET"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DMAX"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DMIN"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DPRODUCT"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DSTDEV"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DSTDEVP"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DSUM"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DVAR"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DVARP"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - - /* -# -# colnum = SocialCalc.Formula.FieldToColnum(sheet, col1num, ncols, row1num, fieldname, fieldtype) -# -# If fieldname is a number, uses it, otherwise looks up string in cells in row to find field number -# -# If not found, returns 0. -# -*/ - - SocialCalc.Formula.FieldToColnum = function ( - sheet, - col1num, - ncols, - row1num, - fieldname, - fieldtype - ) { - var colnum, cell, value; - - if (fieldtype.charAt(0) == "n") { - // number - return it if legal - colnum = fieldname - 0; // make sure a number - if (colnum <= 0 || colnum > ncols) { - return 0; - } - return Math.floor(colnum); - } - - if (fieldtype.charAt(0) != "t") { - // must be text otherwise - return 0; - } - - fieldname = fieldname ? fieldname.toLowerCase() : ""; - - for (colnum = 0; colnum < ncols; colnum++) { - // look through column headers for a match - cell = sheet.GetAssuredCell( - SocialCalc.crToCoord(col1num + colnum, row1num) - ); - value = cell.datavalue; - value = (value + "").toLowerCase(); // ignore case - if (value == fieldname) { - // match - return colnum + 1; - } - } - return 0; // looked at all and no match - }; - - /* -# -# HLOOKUP(value, range, row, [rangelookup]) -# VLOOKUP(value, range, col, [rangelookup]) -# MATCH(value, range, [rangelookup]) -# -*/ - - SocialCalc.Formula.LookupFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var lookupvalue, range, offset, rangelookup, offsetvalue, rangeinfo; - var c, - r, - cincr, - rincr, - previousOK, - csave, - rsave, - cell, - value, - valuetype, - cr, - lookupvalue; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - lookupvalue = operand_value_and_type(sheet, foperand); - if (typeof lookupvalue.value == "string") { - lookupvalue.value = lookupvalue.value.toLowerCase(); - } - - range = scf.TopOfStackValueAndType(sheet, foperand); - - rangelookup = 1; // default to true or 1 - if (fname == "MATCH") { - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value - 0; - } - } else { - offsetvalue = scf.OperandAsNumber(sheet, foperand); - if (offsetvalue.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - offsetvalue = Math.floor(offsetvalue.value); - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value ? 1 : 0; // convert to 1 or 0 - } - } - lookupvalue.type = lookupvalue.type.charAt(0); // only deal with general type - if (lookupvalue.type == "n") { - // if number, make sure a number - lookupvalue.value = lookupvalue.value - 0; - } - - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - rangeinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (!rangeinfo) { - PushOperand("e#REF!", 0); - return; - } - - c = 0; - r = 0; - cincr = 0; - rincr = 0; - if (fname == "HLOOKUP") { - cincr = 1; - if (offsetvalue > rangeinfo.nrows) { - PushOperand("e#REF!", 0); - return; - } - } else if (fname == "VLOOKUP") { - rincr = 1; - if (offsetvalue > rangeinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - } else if (fname == "MATCH") { - if (rangeinfo.ncols > 1) { - if (rangeinfo.nrows > 1) { - PushOperand("e#N/A", 0); - return; - } - cincr = 1; - } else { - rincr = 1; - } - } else { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (offsetvalue < 1 && fname != "MATCH") { - PushOperand("e#VALUE!", 0); - return 0; - } - - previousOK; // if 1, previous test was <. If 2, also this one wasn't - - while (1) { - cr = SocialCalc.crToCoord(rangeinfo.col1num + c, rangeinfo.row1num + r); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype ? cell.valuetype.charAt(0) : "b"; // only deal with general types - if (valuetype == "n") { - value = value - 0; // make sure number - } - if (rangelookup) { - // rangelookup type 1 or -1: look for within brackets for matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { - // match - break; - } - if ( - (rangelookup > 0 && lookupvalue.value > value) || - (rangelookup < 0 && lookupvalue.value < value) - ) { - // possible match: wait and see - previousOK = 1; - csave = c; // remember col and row of last OK - rsave = r; - } else if (previousOK) { - // last one was OK, this one isn't - previousOK = 2; - break; - } - } else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { - // match - break; - } - if ( - (rangelookup > 0 && lookupvalue.value > value) || - (rangelookup < 0 && lookupvalue.value < value) - ) { - // possible match: wait and see - previousOK = 1; - csave = c; - rsave = r; - } else if (previousOK) { - // last one was OK, this one isn't - previousOK = 2; - break; - } - } - } else { - // exact value matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { - // match - break; - } - } else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { - // match - break; - } - } - } - - r += rincr; - c += cincr; - if (r >= rangeinfo.nrows || c >= rangeinfo.ncols) { - // end of range to check, no exact match - if (previousOK) { - // at least one could have been OK - previousOK = 2; - break; - } - PushOperand("e#N/A", 0); - return; - } - } - - if (previousOK == 2) { - // back to last OK - r = rsave; - c = csave; - } - - if (fname == "MATCH") { - value = c + r + 1; // only one may be <> 0 - valuetype = "n"; - } else { - cr = SocialCalc.crToCoord( - rangeinfo.col1num + c + (fname == "VLOOKUP" ? offsetvalue - 1 : 0), - rangeinfo.row1num + r + (fname == "HLOOKUP" ? offsetvalue - 1 : 0) - ); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype; - } - PushOperand(valuetype, value); - - return; - }; - - SocialCalc.Formula.FunctionList["HLOOKUP"] = [ - SocialCalc.Formula.LookupFunctions, - -3, - "hlookup", - "", - "lookup", - ]; - SocialCalc.Formula.FunctionList["MATCH"] = [ - SocialCalc.Formula.LookupFunctions, - -2, - "match", - "", - "lookup", - ]; - SocialCalc.Formula.FunctionList["VLOOKUP"] = [ - SocialCalc.Formula.LookupFunctions, - -3, - "vlookup", - "", - "lookup", - ]; - - /* -# -# INDEX(range, rownum, colnum) -# -*/ - - SocialCalc.Formula.IndexFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var range, sheetname, indexinfo, rowindex, colindex, result, resulttype; - - var scf = SocialCalc.Formula; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - indexinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (indexinfo.sheetname) { - sheetname = "!" + indexinfo.sheetname; - } else { - sheetname = ""; - } - - rowindex = { value: 0 }; - colindex = { value: 0 }; - - if (foperand.length) { - // look for row number - rowindex = scf.OperandAsNumber(sheet, foperand); - if (rowindex.type.charAt(0) != "n" || rowindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - // look for col number - colindex = scf.OperandAsNumber(sheet, foperand); - if (colindex.type.charAt(0) != "n" || colindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - } else { - // col number missing - if (indexinfo.nrows == 1) { - // if only one row, then rowindex is really colindex - colindex.value = rowindex.value; - rowindex.value = 0; - } - } - } - - if (rowindex.value > indexinfo.nrows || colindex.value > indexinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - - if (rowindex.value == 0) { - if (colindex.value == 0) { - if (indexinfo.nrows == 1 && indexinfo.ncols == 1) { - result = - SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + - sheetname; - resulttype = "coord"; - } else { - result = - SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + - sheetname + - "|" + - SocialCalc.crToCoord( - indexinfo.col1num + indexinfo.ncols - 1, - indexinfo.row1num + indexinfo.nrows - 1 - ) + - "|"; - resulttype = "range"; - } - } else { - if (indexinfo.nrows == 1) { - result = - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num - ) + sheetname; - resulttype = "coord"; - } else { - result = - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num - ) + - sheetname + - "|" + - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num + indexinfo.nrows - 1 - ) + - "|"; - resulttype = "range"; - } - } - } else { - if (colindex.value == 0) { - if (indexinfo.ncols == 1) { - result = - SocialCalc.crToCoord( - indexinfo.col1num, - indexinfo.row1num + rowindex.value - 1 - ) + sheetname; - resulttype = "coord"; - } else { - result = - SocialCalc.crToCoord( - indexinfo.col1num, - indexinfo.row1num + rowindex.value - 1 - ) + - sheetname + - "|" + - SocialCalc.crToCoord( - indexinfo.col1num + indexinfo.ncols - 1, - indexinfo.row1num + rowindex.value - 1 - ) + - "|"; - resulttype = "range"; - } - } else { - result = - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num + rowindex.value - 1 - ) + sheetname; - resulttype = "coord"; - } - } - - PushOperand(resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["INDEX"] = [ - SocialCalc.Formula.IndexFunction, - -1, - "index", - "", - "lookup", - ]; - - /* -# -# COUNTIF(c1:c2,"criteria") -# SUMIF(c1:c2,"criteria",[range2]) -# -*/ - - SocialCalc.Formula.CountifSumifFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var range, - criteria, - sumrange, - f2operand, - result, - resulttype, - value1, - value2; - var sum = 0; - var resulttypesum = ""; - var count = 0; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range or coord - criteria = scf.OperandAsText(sheet, foperand); // get criteria - if (fname == "SUMIF") { - if (foperand.length == 1) { - // three arg form of SUMIF - sumrange = scf.TopOfStackValueAndType(sheet, foperand); - } else if (foperand.length == 0) { - // two arg form - sumrange = { value: range.value, type: range.type }; - } else { - scf.FunctionArgsError(fname, operand); - return 0; - } - } else { - sumrange = { value: range.value, type: range.type }; - } - - if (criteria.type.charAt(0) == "n") { - criteria.value = criteria.value + ""; // make text - } else if (criteria.type.charAt(0) == "e") { - // error - criteria.value = null; - } else if (criteria.type.charAt(0) == "b") { - // blank here is undefined - criteria.value = null; - } - - if (range.type != "coord" && range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - if ( - fname == "SUMIF" && - sumrange.type != "coord" && - sumrange.type != "range" - ) { - scf.FunctionArgsError(fname, operand); - return 0; - } - - foperand.push(range); - f2operand = []; // to allow for 3 arg form - f2operand.push(sumrange); - - while (foperand.length) { - value1 = operand_value_and_type(sheet, foperand); - value2 = operand_value_and_type(sheet, f2operand); - - if (!scf.TestCriteria(value1.value, value1.type, criteria.value)) { - continue; - } - - count += 1; - - if (value2.type.charAt(0) == "n") { - sum += value2.value - 0; - resulttypesum = lookup_result_type( - value2.type, - resulttypesum || value2.type, - typelookupplus - ); - } else if ( - value2.type.charAt(0) == "e" && - resulttypesum.charAt(0) != "e" - ) { - resulttypesum = value2.type; - } - } - - resulttypesum = resulttypesum || "n"; - - if (fname == "SUMIF") { - PushOperand(resulttypesum, sum); - } else if (fname == "COUNTIF") { - PushOperand("n", count); - } - - return; - }; - - SocialCalc.Formula.FunctionList["COUNTIF"] = [ - SocialCalc.Formula.CountifSumifFunctions, - 2, - "rangec", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["SUMIF"] = [ - SocialCalc.Formula.CountifSumifFunctions, - -2, - "sumif", - "", - "stat", - ]; - - /* -# -# IF(cond,truevalue,falsevalue) -# -*/ - - SocialCalc.Formula.IfFunction = function (fname, operand, foperand, sheet) { - var cond, t; - - cond = SocialCalc.Formula.OperandValueAndType(sheet, foperand); - t = cond.type.charAt(0); - if (t != "n" && t != "b") { - operand.push({ type: "e#VALUE!", value: 0 }); - return; - } - - if (!cond.value) foperand.pop(); - operand.push(foperand.pop()); - if (cond.value) foperand.pop(); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["IF"] = [ - SocialCalc.Formula.IfFunction, - 3, - "iffunc", - "", - "test", - ]; - - /* -# -# DATE(year,month,day) -# -*/ - - SocialCalc.Formula.DateFunction = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var year = scf.OperandAsNumber(sheet, foperand); - var month = scf.OperandAsNumber(sheet, foperand); - var day = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - year.type, - month.type, - scf.TypeLookupTable.twoargnumeric - ); - resulttype = scf.LookupResultType( - resulttype, - day.type, - scf.TypeLookupTable.twoargnumeric - ); - if (resulttype.charAt(0) == "n") { - result = - SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - Math.floor(year.value), - Math.floor(month.value), - Math.floor(day.value) - ) - SocialCalc.FormatNumber.datevalues.julian_offset; - resulttype = "nd"; - } - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["DATE"] = [ - SocialCalc.Formula.DateFunction, - 3, - "date", - "", - "datetime", - ]; - - /* -# -# TIME(hour,minute,second) -# -*/ - - SocialCalc.Formula.TimeFunction = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var hours = scf.OperandAsNumber(sheet, foperand); - var minutes = scf.OperandAsNumber(sheet, foperand); - var seconds = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - hours.type, - minutes.type, - scf.TypeLookupTable.twoargnumeric - ); - resulttype = scf.LookupResultType( - resulttype, - seconds.type, - scf.TypeLookupTable.twoargnumeric - ); - if (resulttype.charAt(0) == "n") { - result = - (hours.value * 60 * 60 + minutes.value * 60 + seconds.value) / - (24 * 60 * 60); - resulttype = "nt"; - } - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["TIME"] = [ - SocialCalc.Formula.TimeFunction, - 3, - "hms", - "", - "datetime", - ]; - - /* -# -# DAY(date) -# MONTH(date) -# YEAR(date) -# WEEKDAY(date, [type]) -# -*/ - - SocialCalc.Formula.DMYFunctions = function (fname, operand, foperand, sheet) { - var ymd, dtype, doffset; - var scf = SocialCalc.Formula; - var result = 0; - - var datevalue = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - datevalue.type, - datevalue.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (resulttype.charAt(0) == "n") { - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian( - Math.floor( - datevalue.value + SocialCalc.FormatNumber.datevalues.julian_offset - ) - ); - switch (fname) { - case "DAY": - result = ymd.day; - break; - - case "MONTH": - result = ymd.month; - break; - - case "YEAR": - result = ymd.year; - break; - - case "WEEKDAY": - dtype = { value: 1 }; - if (foperand.length) { - // get type if present - dtype = scf.OperandAsNumber(sheet, foperand); - if ( - dtype.type.charAt(0) != "n" || - dtype.value < 1 || - dtype.value > 3 - ) { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { - // extra args - scf.FunctionArgsError(fname, operand); - return; - } - } - doffset = 6; - if (dtype.value > 1) { - doffset -= 1; - } - result = - (Math.floor(datevalue.value + doffset) % 7) + - (dtype.value < 3 ? 1 : 0); - break; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["DAY"] = [ - SocialCalc.Formula.DMYFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["MONTH"] = [ - SocialCalc.Formula.DMYFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["YEAR"] = [ - SocialCalc.Formula.DMYFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["WEEKDAY"] = [ - SocialCalc.Formula.DMYFunctions, - -1, - "weekday", - "", - "datetime", - ]; - - /* -# -# HOUR(datetime) -# MINUTE(datetime) -# SECOND(datetime) -# -*/ - - SocialCalc.Formula.HMSFunctions = function (fname, operand, foperand, sheet) { - var hours, minutes, seconds, fraction; - var scf = SocialCalc.Formula; - var result = 0; - - var datetime = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - datetime.type, - datetime.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (resulttype.charAt(0) == "n") { - if (datetime.value < 0) { - scf.PushOperand(operand, "e#NUM!", 0); // must be non-negative - return; - } - fraction = datetime.value - Math.floor(datetime.value); // fraction of a day - fraction *= 24; - hours = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - minutes = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - seconds = Math.floor(fraction + (datetime.value >= 0 ? 0.5 : -0.5)); - if (fname == "HOUR") { - result = hours; - } else if (fname == "MINUTE") { - result = minutes; - } else if (fname == "SECOND") { - result = seconds; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["HOUR"] = [ - SocialCalc.Formula.HMSFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["MINUTE"] = [ - SocialCalc.Formula.HMSFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["SECOND"] = [ - SocialCalc.Formula.HMSFunctions, - 1, - "v", - "", - "datetime", - ]; - - /* -# -# EXACT(v1,v2) -# -*/ - - SocialCalc.Formula.ExactFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value1 = scf.OperandValueAndType(sheet, foperand); - var v1type = value1.type.charAt(0); - var value2 = scf.OperandValueAndType(sheet, foperand); - var v2type = value2.type.charAt(0); - - if (v1type == "t") { - if (v2type == "t") { - result = value1.value == value2.value ? 1 : 0; - } else if (v2type == "b") { - result = value1.value.length ? 0 : 1; - } else if (v2type == "n") { - result = value1.value == value2.value + "" ? 1 : 0; - } else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } else { - result = 0; - } - } else if (v1type == "n") { - if (v2type == "n") { - result = value1.value - 0 == value2.value - 0 ? 1 : 0; - } else if (v2type == "b") { - result = 0; - } else if (v2type == "t") { - result = value1.value + "" == value2.value ? 1 : 0; - } else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } else { - result = 0; - } - } else if (v1type == "b") { - if (v2type == "t") { - result = value2.value.length ? 0 : 1; - } else if (v2type == "b") { - result = 1; - } else if (v2type == "n") { - result = 0; - } else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } else { - result = 0; - } - } else if (v1type == "e") { - result = value1.value; - resulttype = value1.type; - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["EXACT"] = [ - SocialCalc.Formula.ExactFunction, - 2, - "", - "", - "text", - ]; - - /* -# -# FIND(key,string,[start]) -# LEFT(string,[length]) -# LEN(string) -# LOWER(string) -# MID(string,start,length) -# PROPER(string) -# REPLACE(string,start,length,new) -# REPT(string,count) -# RIGHT(string,[length]) -# SUBSTITUTE(string,old,new,[which]) -# TRIM(string) -# UPPER(string) -# -*/ - - // SocialCalc.Formula.ArgList has an array for each function, one entry for each possible arg (up to max). - // Min args are specified in SocialCalc.Formula.FunctionList. - // If array element is 1 then it's a text argument, if it's 0 then it's numeric, if -1 then just get whatever's there - // Text values are manipulated as UTF-8, converting from and back to byte strings - - SocialCalc.Formula.ArgList = { - FIND: [1, 1, 0], - LEFT: [1, 0], - LEN: [1], - LOWER: [1], - MID: [1, 0, 0], - PROPER: [1], - REPLACE: [1, 0, 0, 1], - REPT: [1, 0], - RIGHT: [1, 0], - SUBSTITUTE: [1, 1, 1, 0], - TRIM: [1], - UPPER: [1], - }; - - SocialCalc.Formula.StringFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var i, value, offset, len, start, count; - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var numargs = foperand.length; - var argdef = scf.ArgList[fname]; - var operand_value = []; - var operand_type = []; - - for (i = 1; i <= numargs; i++) { - // go through each arg, get value and type, and check for errors - if (i > argdef.length) { - // too many args - scf.FunctionArgsError(fname, operand); - return; - } - if (argdef[i - 1] == 0) { - value = scf.OperandAsNumber(sheet, foperand); - } else if (argdef[i - 1] == 1) { - value = scf.OperandAsText(sheet, foperand); - } else if (argdef[i - 1] == -1) { - value = scf.OperandValueAndType(sheet, foperand); - } - operand_value[i] = value.value; - operand_type[i] = value.type; - if (value.type.charAt(0) == "e") { - scf.PushOperand(operand, value.type, result); - return; - } - } - - switch (fname) { - case "FIND": - offset = operand_type[3] ? operand_value[3] - 1 : 0; - if (offset < 0) { - result = "Start is before string"; // !! not displayed, no need to translate - } else { - result = operand_value[2].indexOf(operand_value[1], offset); // (null string matches first char) - if (result >= 0) { - result += 1; - resulttype = "n"; - } else { - result = "Not found"; // !! not displayed, error is e#VALUE! - } - } - break; - - case "LEFT": - len = operand_type[2] ? operand_value[2] - 0 : 1; - if (len < 0) { - result = "Negative length"; - } else { - result = operand_value[1].substring(0, len); - resulttype = "t"; - } - break; - - case "LEN": - result = operand_value[1].length; - resulttype = "n"; - break; - - case "LOWER": - result = operand_value[1].toLowerCase(); - resulttype = "t"; - break; - - case "MID": - start = operand_value[2] - 0; - len = operand_value[3] - 0; - if (len < 1 || start < 1) { - result = "Bad arguments"; - } else { - result = operand_value[1].substring(start - 1, start + len - 1); - resulttype = "t"; - } - break; - - case "PROPER": - result = operand_value[1].replace(/\b\w+\b/g, function (word) { - return word.substring(0, 1).toUpperCase() + word.substring(1); - }); // uppercase first character of words (see JavaScript, Flanagan, 5th edition, page 704) - resulttype = "t"; - break; - - case "REPLACE": - start = operand_value[2] - 0; - len = operand_value[3] - 0; - if (len < 0 || start < 1) { - result = "Bad arguments"; - } else { - result = - operand_value[1].substring(0, start - 1) + - operand_value[4] + - operand_value[1].substring(start - 1 + len); - resulttype = "t"; - } - break; - - case "REPT": - count = operand_value[2] - 0; - if (count < 0) { - result = "Negative count"; - } else { - result = ""; - for (; count > 0; count--) { - result += operand_value[1]; - } - resulttype = "t"; - } - break; - - case "RIGHT": - len = operand_type[2] ? operand_value[2] - 0 : 1; - if (len < 0) { - result = "Negative length"; - } else { - result = operand_value[1].slice(-len); - resulttype = "t"; - } - break; - - case "SUBSTITUTE": - fulltext = operand_value[1]; - oldtext = operand_value[2]; - newtext = operand_value[3]; - if (operand_value[4] != null) { - which = operand_value[4] - 0; - if (which <= 0) { - result = "Non-positive instance number"; - break; - } - } else { - which = 0; - } - count = 0; - oldpos = 0; - result = ""; - while (true) { - pos = fulltext.indexOf(oldtext, oldpos); - if (pos >= 0) { - count++; //!!!!!! old test just in case: if (count>1000) {alert(pos); break;} - result += fulltext.substring(oldpos, pos); - if (which == 0) { - result += newtext; // substitute - } else if (which == count) { - result += newtext + fulltext.substring(pos + oldtext.length); - break; - } else { - result += oldtext; // leave as was - } - oldpos = pos + oldtext.length; - } else { - // no more - result += fulltext.substring(oldpos); - break; - } - } - resulttype = "t"; - break; - - case "TRIM": - result = operand_value[1]; - result = result.replace(/^ */, ""); - result = result.replace(/ *$/, ""); - result = result.replace(/ +/g, " "); - resulttype = "t"; - break; - - case "UPPER": - result = operand_value[1].toUpperCase(); - resulttype = "t"; - break; - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["FIND"] = [ - SocialCalc.Formula.StringFunctions, - -2, - "find", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["LEFT"] = [ - SocialCalc.Formula.StringFunctions, - -2, - "tc", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["LEN"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "txt", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["LOWER"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "txt", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["MID"] = [ - SocialCalc.Formula.StringFunctions, - 3, - "mid", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["PROPER"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "v", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["REPLACE"] = [ - SocialCalc.Formula.StringFunctions, - 4, - "replace", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["REPT"] = [ - SocialCalc.Formula.StringFunctions, - 2, - "tc", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["RIGHT"] = [ - SocialCalc.Formula.StringFunctions, - -1, - "tc", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["SUBSTITUTE"] = [ - SocialCalc.Formula.StringFunctions, - -3, - "subs", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["TRIM"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "v", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["UPPER"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "v", - "", - "text", - ]; - - /* -# -# is_functions: -# -# ISBLANK(value) -# ISERR(value) -# ISERROR(value) -# ISLOGICAL(value) -# ISNA(value) -# ISNONTEXT(value) -# ISNUMBER(value) -# ISTEXT(value) -# -*/ - - SocialCalc.Formula.IsFunctions = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - case "ISBLANK": - result = value.type == "b" ? 1 : 0; - break; - - case "ISERR": - result = t == "e" ? (value.type == "e#N/A" ? 0 : 1) : 0; - break; - - case "ISERROR": - result = t == "e" ? 1 : 0; - break; - - case "ISLOGICAL": - result = value.type == "nl" ? 1 : 0; - break; - - case "ISNA": - result = value.type == "e#N/A" ? 1 : 0; - break; - - case "ISNONTEXT": - result = t == "t" ? 0 : 1; - break; - - case "ISNUMBER": - result = t == "n" ? 1 : 0; - break; - - case "ISTEXT": - result = t == "t" ? 1 : 0; - break; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["ISBLANK"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISERR"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISERROR"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISLOGICAL"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISNA"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISNONTEXT"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISNUMBER"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISTEXT"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - - /* -# -# ntv_functions: -# -# N(value) -# T(value) -# VALUE(value) -# -*/ - - SocialCalc.Formula.NTVFunctions = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - case "N": - result = t == "n" ? value.value - 0 : 0; - resulttype = "n"; - break; - - case "T": - result = t == "t" ? value.value + "" : ""; - resulttype = "t"; - break; - - case "VALUE": - if (t == "n" || t == "b") { - result = value.value || 0; - resulttype = "n"; - } else if (t == "t") { - value = SocialCalc.DetermineValueType(value.value); - if (value.type.charAt(0) != "n") { - result = 0; - resulttype = "e#VALUE!"; - } else { - result = value.value - 0; - resulttype = "n"; - } - } - break; - } - - if (t == "e") { - // error trumps - resulttype = value.type; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["N"] = [ - SocialCalc.Formula.NTVFunctions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["T"] = [ - SocialCalc.Formula.NTVFunctions, - 1, - "v", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["VALUE"] = [ - SocialCalc.Formula.NTVFunctions, - 1, - "v", - "", - "text", - ]; - - /* -# -# ABS(value) -# ACOS(value) -# ASIN(value) -# ATAN(value) -# COS(value) -# DEGREES(value) -# EVEN(value) -# EXP(value) -# FACT(value) -# INT(value) -# LN(value) -# LOG10(value) -# ODD(value) -# RADIANS(value) -# SIN(value) -# SQRT(value) -# TAN(value) -# -*/ - - SocialCalc.Formula.Math1Functions = function ( - fname, - operand, - foperand, - sheet - ) { - var v1, value, f; - var result = {}; - - var scf = SocialCalc.Formula; - - v1 = scf.OperandAsNumber(sheet, foperand); - value = v1.value; - result.type = scf.LookupResultType( - v1.type, - v1.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (result.type == "n") { - switch (fname) { - case "ABS": - value = Math.abs(value); - break; - - case "ACOS": - if (value >= -1 && value <= 1) { - value = Math.acos(value); - } else { - result.type = "e#NUM!"; - } - break; - - case "ASIN": - if (value >= -1 && value <= 1) { - value = Math.asin(value); - } else { - result.type = "e#NUM!"; - } - break; - - case "ATAN": - value = Math.atan(value); - break; - - case "COS": - value = Math.cos(value); - break; - - case "DEGREES": - value = (value * 180) / Math.PI; - break; - - case "EVEN": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (Math.floor(value + 1) % 2); - } else { - // integer - value = value + (value % 2); - } - if (v1.value < 0) value = -value; - break; - - case "EXP": - value = Math.exp(value); - break; - - case "FACT": - f = 1; - value = Math.floor(value); - for (; value > 0; value--) { - f *= value; - } - value = f; - break; - - case "INT": - value = Math.floor(value); // spreadsheet INT is floor(), not int() - break; - - case "LN": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclnarg; - } - value = Math.log(value); - break; - - case "LOG10": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclog10arg; - } - value = Math.log(value) / Math.log(10); - break; - - case "ODD": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (1 - (Math.floor(value + 1) % 2)); - } else { - // integer - value = value + (1 - (value % 2)); - } - if (v1.value < 0) value = -value; - break; - - case "RADIANS": - value = (value * Math.PI) / 180; - break; - - case "SIN": - value = Math.sin(value); - break; - - case "SQRT": - if (value >= 0) { - value = Math.sqrt(value); - } else { - result.type = "e#NUM!"; - } - break; - - case "TAN": - if (Math.cos(value) != 0) { - value = Math.tan(value); - } else { - result.type = "e#NUM!"; - } - break; - } - } - - result.value = value; - operand.push(result); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["ABS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ACOS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ASIN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ATAN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["COS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["DEGREES"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["EVEN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["EXP"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["FACT"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["INT"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["LN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["LOG10"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ODD"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["RADIANS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["SIN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["SQRT"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["TAN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - - /* -# -# ATAN2(x, y) -# MOD(a, b) -# POWER(a, b) -# TRUNC(value, precision) -# -*/ - - SocialCalc.Formula.Math2Functions = function ( - fname, - operand, - foperand, - sheet - ) { - var xval, yval, value, quotient, decimalscale, i; - var result = {}; - - var scf = SocialCalc.Formula; - - xval = scf.OperandAsNumber(sheet, foperand); - yval = scf.OperandAsNumber(sheet, foperand); - value = 0; - result.type = scf.LookupResultType( - xval.type, - yval.type, - scf.TypeLookupTable.twoargnumeric - ); - - if (result.type == "n") { - switch (fname) { - case "ATAN2": - if (xval.value == 0 && yval.value == 0) { - result.type = "e#DIV/0!"; - } else { - result.value = Math.atan2(yval.value, xval.value); - } - break; - - case "POWER": - result.value = Math.pow(xval.value, yval.value); - if (isNaN(result.value)) { - result.value = 0; - result.type = "e#NUM!"; - } - break; - - case "MOD": // en.wikipedia.org/wiki/Modulo_operation, etc. - if (yval.value == 0) { - result.type = "e#DIV/0!"; - } else { - quotient = xval.value / yval.value; - quotient = Math.floor(quotient); - result.value = xval.value - quotient * yval.value; - } - break; - - case "TRUNC": - decimalscale = 1; // cut down to required number of decimal digits - if (yval.value >= 0) { - yval.value = Math.floor(yval.value); - for (i = 0; i < yval.value; i++) { - decimalscale *= 10; - } - result.value = - Math.floor(Math.abs(xval.value) * decimalscale) / decimalscale; - } else if (yval.value < 0) { - yval.value = Math.floor(-yval.value); - for (i = 0; i < yval.value; i++) { - decimalscale *= 10; - } - result.value = - Math.floor(Math.abs(xval.value) / decimalscale) * decimalscale; - } - if (xval.value < 0) { - result.value = -result.value; - } - } - } - - operand.push(result); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["ATAN2"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "xy", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["MOD"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["POWER"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["TRUNC"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "valpre", - "", - "math", - ]; - - /* -# -# LOG(value,[base]) -# -*/ - - SocialCalc.Formula.LogFunction = function (fname, operand, foperand, sheet) { - var value, value2; - var result = {}; - - var scf = SocialCalc.Formula; - - result.value = 0; - - value = scf.OperandAsNumber(sheet, foperand); - result.type = scf.LookupResultType( - value.type, - value.type, - scf.TypeLookupTable.oneargnumeric - ); - if (foperand.length == 1) { - value2 = scf.OperandAsNumber(sheet, foperand); - if (value2.type.charAt(0) != "n" || value2.value <= 0) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfunclogsecondarg - ); - return 0; - } - } else if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } else { - value2 = { value: Math.E, type: "n" }; - } - - if (result.type == "n") { - if (value.value <= 0) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfunclogfirstarg - ); - return 0; - } - result.value = Math.log(value.value) / Math.log(value2.value); - } - - operand.push(result); - - return; - }; - - SocialCalc.Formula.FunctionList["LOG"] = [ - SocialCalc.Formula.LogFunction, - -1, - "log", - "", - "math", - ]; - - /* -# -# ROUND(value,[precision]) -# -*/ - - SocialCalc.Formula.RoundFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var value2, decimalscale, scaledvalue, i; - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var value = scf.OperandValueAndType(sheet, foperand); - var resulttype = scf.LookupResultType( - value.type, - value.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (foperand.length == 1) { - value2 = scf.OperandValueAndType(sheet, foperand); - if (value2.type.charAt(0) != "n") { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfuncroundsecondarg - ); - return 0; - } - } else if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } else { - value2 = { value: 0, type: "n" }; // if no second arg, assume 0 for simple round - } - - if (resulttype == "n") { - value2.value = value2.value - 0; - if (value2.value == 0) { - result = Math.round(value.value); - } else if (value2.value > 0) { - decimalscale = 1; // cut down to required number of decimal digits - value2.value = Math.floor(value2.value); - for (i = 0; i < value2.value; i++) { - decimalscale *= 10; - } - scaledvalue = Math.round(value.value * decimalscale); - result = scaledvalue / decimalscale; - } else if (value2.value < 0) { - decimalscale = 1; // cut down to required number of decimal digits - value2.value = Math.floor(-value2.value); - for (i = 0; i < value2.value; i++) { - decimalscale *= 10; - } - scaledvalue = Math.round(value.value / decimalscale); - result = scaledvalue * decimalscale; - } - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["ROUND"] = [ - SocialCalc.Formula.RoundFunction, - -1, - "vp", - "", - "math", - ]; - - /* -# -# AND(v1,c1:c2,...) -# OR(v1,c1:c2,...) -# -*/ - - SocialCalc.Formula.AndOrFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var value1, result; - - var scf = SocialCalc.Formula; - var resulttype = ""; - - if (fname == "AND") { - result = 1; - } else if (fname == "OR") { - result = 0; - } - - while (foperand.length) { - value1 = scf.OperandValueAndType(sheet, foperand); - if (value1.type.charAt(0) == "n") { - value1.value = value1.value - 0; - if (fname == "AND") { - result = value1.value != 0 ? result : 0; - } else if (fname == "OR") { - result = value1.value != 0 ? 1 : result; - } - resulttype = scf.LookupResultType( - value1.type, - resulttype || "nl", - scf.TypeLookupTable.propagateerror - ); - } else if (value1.type.charAt(0) == "e" && resulttype.charAt(0) != "e") { - resulttype = value1.type; - } - } - if (resulttype.length < 1) { - resulttype = "e#VALUE!"; - result = 0; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["AND"] = [ - SocialCalc.Formula.AndOrFunctions, - -1, - "vn", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["OR"] = [ - SocialCalc.Formula.AndOrFunctions, - -1, - "vn", - "", - "test", - ]; - - /* -# -# NOT(value) -# -*/ - - SocialCalc.Formula.NotFunction = function (fname, operand, foperand, sheet) { - var result = 0; - var scf = SocialCalc.Formula; - var value = scf.OperandValueAndType(sheet, foperand); - var resulttype = scf.LookupResultType( - value.type, - value.type, - scf.TypeLookupTable.propagateerror - ); - - if (value.type.charAt(0) == "n" || value.type == "b") { - result = value.value - 0 != 0 ? 0 : 1; // do the "not" operation - resulttype = "nl"; - } else if (value.type.charAt(0) == "t") { - resulttype = "e#VALUE!"; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["NOT"] = [ - SocialCalc.Formula.NotFunction, - 1, - "v", - "", - "test", - ]; - - /* -# -# CHOOSE(index,value1,value2,...) -# -*/ - - SocialCalc.Formula.ChooseFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var resulttype, count, value1; - var result = 0; - var scf = SocialCalc.Formula; - - var cindex = scf.OperandAsNumber(sheet, foperand); - - if (cindex.type.charAt(0) != "n") { - cindex.value = 0; - } - cindex.value = Math.floor(cindex.value); - - count = 0; - while (foperand.length) { - value1 = scf.TopOfStackValueAndType(sheet, foperand); - count += 1; - if (cindex.value == count) { - result = value1.value; - resulttype = value1.type; - break; - } - } - if (resulttype) { - // found something - scf.PushOperand(operand, resulttype, result); - } else { - scf.PushOperand(operand, "e#VALUE!", 0); - } - - return; - }; - - SocialCalc.Formula.FunctionList["CHOOSE"] = [ - SocialCalc.Formula.ChooseFunction, - -2, - "choose", - "", - "lookup", - ]; - - /* -# -# COLUMNS(c1:c2) -# ROWS(c1:c2) -# -*/ - - SocialCalc.Formula.ColumnsRowsFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var resulttype, rangeinfo; - var result = 0; - var scf = SocialCalc.Formula; - - var value1 = scf.TopOfStackValueAndType(sheet, foperand); - - if (value1.type == "coord") { - result = 1; - resulttype = "n"; - } else if (value1.type == "range") { - rangeinfo = scf.DecodeRangeParts(sheet, value1.value); - if (fname == "COLUMNS") { - result = rangeinfo.ncols; - } else if (fname == "ROWS") { - result = rangeinfo.nrows; - } - resulttype = "n"; - } else { - result = 0; - resulttype = "e#VALUE!"; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["COLUMNS"] = [ - SocialCalc.Formula.ColumnsRowsFunctions, - 1, - "range", - "", - "lookup", - ]; - SocialCalc.Formula.FunctionList["ROWS"] = [ - SocialCalc.Formula.ColumnsRowsFunctions, - 1, - "range", - "", - "lookup", - ]; - - /* -# -# FALSE() -# NA() -# NOW() -# PI() -# TODAY() -# TRUE() -# -*/ - - SocialCalc.Formula.ZeroArgFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var startval, tzoffset, start_1_1_1970, seconds_in_a_day, nowdays; - var result = { value: 0 }; - - switch (fname) { - case "FALSE": - result.type = "nl"; - result.value = 0; - break; - - case "NA": - result.type = "e#N/A"; - break; - - case "NOW": - startval = new Date(); - tzoffset = startval.getTimezoneOffset(); - startval = startval.getTime() / 1000; // convert to seconds - start_1_1_1970 = 25569; // Day number of 1/1/1970 starting with 1/1/1900 as 1 - seconds_in_a_day = 24 * 60 * 60; - nowdays = - start_1_1_1970 + startval / seconds_in_a_day - tzoffset / (24 * 60); - result.value = nowdays; - result.type = "ndt"; - SocialCalc.Formula.FreshnessInfo.volatile.NOW = true; // remember - break; - - case "PI": - result.type = "n"; - result.value = Math.PI; - break; - - case "TODAY": - startval = new Date(); - tzoffset = startval.getTimezoneOffset(); - startval = startval.getTime() / 1000; // convert to seconds - start_1_1_1970 = 25569; // Day number of 1/1/1970 starting with 1/1/1900 as 1 - seconds_in_a_day = 24 * 60 * 60; - nowdays = - start_1_1_1970 + startval / seconds_in_a_day - tzoffset / (24 * 60); - result.value = Math.floor(nowdays); - result.type = "nd"; - SocialCalc.Formula.FreshnessInfo.volatile.TODAY = true; // remember - break; - - case "TRUE": - result.type = "nl"; - result.value = 1; - break; - } - - operand.push(result); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["FALSE"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["NA"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["NOW"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["PI"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["TODAY"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["TRUE"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "test", - ]; - - // - // * * * * * FINANCIAL FUNCTIONS * * * * * - // - - /* -# -# DDB(cost,salvage,lifetime,period,[method]) -# -# Depreciation, method defaults to 2 for double-declining balance -# See: http://en.wikipedia.org/wiki/Depreciation -# -*/ - - SocialCalc.Formula.DDBFunction = function (fname, operand, foperand, sheet) { - var method, depreciation, accumulateddepreciation, i; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - var period = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - if (scf.CheckForErrorValue(operand, period)) return; - - if (lifetime.value < 1) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfuncddblife - ); - return 0; - } - - method = { value: 2, type: "n" }; - if (foperand.length > 0) { - method = scf.OperandAsNumber(sheet, foperand); - } - if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (scf.CheckForErrorValue(operand, method)) return; - - depreciation = 0; // calculated for each period - accumulateddepreciation = 0; // accumulated by adding each period's - - for (i = 1; i <= period.value - 0 && i <= lifetime.value; i++) { - // calculate for each period based on net from previous - depreciation = - (cost.value - accumulateddepreciation) * - (method.value / lifetime.value); - if (cost.value - accumulateddepreciation - depreciation < salvage.value) { - // don't go lower than salvage value - depreciation = cost.value - accumulateddepreciation - salvage.value; - } - accumulateddepreciation += depreciation; - } - - scf.PushOperand(operand, "n$", depreciation); - - return; - }; - - SocialCalc.Formula.FunctionList["DDB"] = [ - SocialCalc.Formula.DDBFunction, - -4, - "ddb", - "", - "financial", - ]; - - /* -# -# SLN(cost,salvage,lifetime) -# -# Depreciation for each period by straight-line method -# See: http://en.wikipedia.org/wiki/Depreciation -# -*/ - - SocialCalc.Formula.SLNFunction = function (fname, operand, foperand, sheet) { - var depreciation; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - - if (lifetime.value < 1) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfuncslnlife - ); - return 0; - } - - depreciation = (cost.value - salvage.value) / lifetime.value; - - scf.PushOperand(operand, "n$", depreciation); - - return; - }; - - SocialCalc.Formula.FunctionList["SLN"] = [ - SocialCalc.Formula.SLNFunction, - 3, - "csl", - "", - "financial", - ]; - - /* -# -# SYD(cost,salvage,lifetime,period) -# -# Depreciation by Sum of Year's Digits method -# -*/ - - SocialCalc.Formula.SYDFunction = function (fname, operand, foperand, sheet) { - var depreciation, sumperiods; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - var period = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - if (scf.CheckForErrorValue(operand, period)) return; - - if (lifetime.value < 1 || period.value <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return 0; - } - - sumperiods = ((lifetime.value + 1) * lifetime.value) / 2; // add up 1 through lifetime - depreciation = - ((cost.value - salvage.value) * (lifetime.value - period.value + 1)) / - sumperiods; // calc depreciation - - scf.PushOperand(operand, "n$", depreciation); - - return; - }; - - SocialCalc.Formula.FunctionList["SYD"] = [ - SocialCalc.Formula.SYDFunction, - 4, - "cslp", - "", - "financial", - ]; - - /* -# -# FV(rate, n, payment, [pv, [paytype]]) -# NPER(rate, payment, pv, [fv, [paytype]]) -# PMT(rate, n, pv, [fv, [paytype]]) -# PV(rate, n, payment, [fv, [paytype]]) -# RATE(n, payment, pv, [fv, [paytype, [guess]]]) -# -# Following the Open Document Format formula specification: -# -# PV = - Fv - (Payment * Nper) [if rate equals 0] -# Pv*(1+Rate)^Nper + Payment * (1 + Rate*PaymentType) * ( (1+Rate)^nper -1)/Rate + Fv = 0 -# -# For each function, the formulas are solved for the appropriate value (transformed using -# basic algebra). -# -*/ - - SocialCalc.Formula.InterestFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var resulttype, result, dval, evalue, fval; - var pv, - fv, - rate, - n, - payment, - paytype, - guess, - part1, - part2, - part3, - part4, - part5; - var olddelta, maxloop, tries, deltaepsilon, rate, oldrate, m; - - var scf = SocialCalc.Formula; - - var aval = scf.OperandAsNumber(sheet, foperand); - var bval = scf.OperandAsNumber(sheet, foperand); - var cval = scf.OperandAsNumber(sheet, foperand); - - resulttype = scf.LookupResultType( - aval.type, - bval.type, - scf.TypeLookupTable.twoargnumeric - ); - resulttype = scf.LookupResultType( - resulttype, - cval.type, - scf.TypeLookupTable.twoargnumeric - ); - if (foperand.length) { - // optional arguments - dval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType( - resulttype, - dval.type, - scf.TypeLookupTable.twoargnumeric - ); - if (foperand.length) { - // optional arguments - evalue = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType( - resulttype, - evalue.type, - scf.TypeLookupTable.twoargnumeric - ); - if (foperand.length) { - // optional arguments - if (fname != "RATE") { - // only rate has 6 possible args - scf.FunctionArgsError(fname, operand); - return 0; - } - fval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType( - resulttype, - fval.type, - scf.TypeLookupTable.twoargnumeric - ); - } - } - } - - if (resulttype == "n") { - switch (fname) { - case "FV": // FV(rate, n, payment, [pv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - pv = dval != null ? dval.value : 0; // get value if present, or use default - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - if (rate == 0) { - // simple calculation if no interest - fv = -pv - payment * n; - } else { - fv = -( - pv * Math.pow(1 + rate, n) + - (payment * (1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / - rate - ); - } - result = fv; - resulttype = "n$"; - break; - - case "NPER": // NPER(rate, payment, pv, [fv, [paytype]]) - rate = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - if (rate == 0) { - // simple calculation if no interest - if (payment == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - n = (pv + fv) / -payment; - } else { - part1 = (payment * (1 + rate * paytype)) / rate; - part2 = pv + part1; - if (part2 == 0 || rate <= -1) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part3 = (part1 - fv) / part2; - if (part3 <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part4 = Math.log(part3); - part5 = Math.log(1 + rate); // rate > -1 - n = part4 / part5; - } - result = n; - resulttype = "n"; - break; - - case "PMT": // PMT(rate, n, pv, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - pv = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - if (n == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } else if (rate == 0) { - // simple calculation if no interest - payment = (fv - pv) / n; - } else { - payment = - (0 - fv - pv * Math.pow(1 + rate, n)) / - (((1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / rate); - } - result = payment; - resulttype = "n$"; - break; - - case "PV": // PV(rate, n, payment, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (eval.value ? 1 : 0) : 0; - if (rate == -1) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } else if (rate == 0) { - // simple calculation if no interest - pv = -fv - payment * n; - } else { - pv = - (-fv - - (payment * (1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / - rate) / - Math.pow(1 + rate, n); - } - result = pv; - resulttype = "n$"; - break; - - case "RATE": // RATE(n, payment, pv, [fv, [paytype, [guess]]]) - n = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - guess = fval != null ? fval.value : 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 100; - tries = 0; - delta = 1; - epsilon = 0.0000001; // this is close enough - rate = guess || 0.00000001; // zero is not allowed - while ((delta >= 0 ? delta : -delta) > epsilon && rate != oldrate) { - delta = - fv + - pv * Math.pow(1 + rate, n) + - (payment * (1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / - rate; - if (olddelta != null) { - m = (delta - olddelta) / (rate - oldrate) || 0.001; // get slope (not zero) - oldrate = rate; - rate = rate - delta / m; // look for zero crossing - olddelta = delta; - } else { - // first time - no old values - oldrate = rate; - rate = 1.1 * rate; - olddelta = delta; - } - tries++; - if (tries >= maxloop) { - // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - result = rate; - resulttype = "n%"; - break; - } - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["FV"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "fv", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["NPER"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "nper", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["PMT"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "pmt", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["PV"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "pv", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["RATE"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "rate", - "", - "financial", - ]; - - /* -# -# NPV(rate,v1,v2,c1:c2,...) -# -*/ - - SocialCalc.Formula.NPVFunction = function (fname, operand, foperand, sheet) { - var resulttypenpv, rate, sum, factor, value1; - - var scf = SocialCalc.Formula; - - var rate = scf.OperandAsNumber(sheet, foperand); - if (scf.CheckForErrorValue(operand, rate)) return; - - sum = 0; - resulttypenpv = "n"; - factor = 1; - - while (foperand.length) { - value1 = scf.OperandValueAndType(sheet, foperand); - if (value1.type.charAt(0) == "n") { - factor *= 1 + rate.value; - if (factor == 0) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - sum += value1.value / factor; - resulttypenpv = scf.LookupResultType( - value1.type, - resulttypenpv || value1.type, - scf.TypeLookupTable.plus - ); - } else if ( - value1.type.charAt(0) == "e" && - resulttypenpv.charAt(0) != "e" - ) { - resulttypenpv = value1.type; - break; - } - } - - if (resulttypenpv.charAt(0) == "n") { - resulttypenpv = "n$"; - } - - scf.PushOperand(operand, resulttypenpv, sum); - - return; - }; - - SocialCalc.Formula.FunctionList["NPV"] = [ - SocialCalc.Formula.NPVFunction, - -2, - "npv", - "", - "financial", - ]; - - /* -# -# IRR(c1:c2,[guess]) -# -*/ - - SocialCalc.Formula.IRRFunction = function (fname, operand, foperand, sheet) { - var value1, - guess, - oldsum, - maxloop, - tries, - epsilon, - rate, - oldrate, - m, - sum, - factor, - i; - var rangeoperand = []; - var cashflows = []; - - var scf = SocialCalc.Formula; - - rangeoperand.push(foperand.pop()); // first operand is a range - - while (rangeoperand.length) { - // get values from range so we can do iterative approximations - value1 = scf.OperandValueAndType(sheet, rangeoperand); - if (value1.type.charAt(0) == "n") { - cashflows.push(value1.value); - } else if (value1.type.charAt(0) == "e") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - } - - if (!cashflows.length) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - - guess = { value: 0 }; - - if (foperand.length) { - // guess is provided - guess = scf.OperandAsNumber(sheet, foperand); - if (guess.type.charAt(0) != "n" && guess.type.charAt(0) != "b") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { - // should be no more args - scf.FunctionArgsError(fname, operand); - return; - } - } - - guess.value = guess.value || 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 20; - tries = 0; - epsilon = 0.0000001; // this is close enough - rate = guess.value; - sum = 1; - - while ((sum >= 0 ? sum : -sum) > epsilon && rate != oldrate) { - sum = 0; - factor = 1; - for (i = 0; i < cashflows.length; i++) { - factor *= 1 + rate; - if (factor == 0) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - sum += cashflows[i] / factor; - } - - if (oldsum != null) { - m = (sum - oldsum) / (rate - oldrate); // get slope - oldrate = rate; - rate = rate - sum / m; // look for zero crossing - oldsum = sum; - } else { - // first time - no old values - oldrate = rate; - rate = 1.1 * rate; - oldsum = sum; - } - tries++; - if (tries >= maxloop) { - // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - - scf.PushOperand(operand, "n%", rate); - - return; - }; - - SocialCalc.Formula.FunctionList["IRR"] = [ - SocialCalc.Formula.IRRFunction, - -1, - "irr", - "", - "financial", - ]; - - // - // SHEET CACHE - // - - SocialCalc.Formula.SheetCache = { - // Sheet data: Attributes are each sheet in the cache with values of an object with: - // - // sheet: sheet-obj (or null, meaning not found) - // recalcstate: constants.asloaded = as loaded - // constants.recalcing = being recalced now - // constants.recalcdone = recalc done - // name: name of sheet (in case just have object and don't know name) - // - - sheets: {}, - - // Waiting for loading: - // If sheet is not in cache, this is set to the sheetname being loaded - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForLoading: null, - - // Constants to use for setting sheets[*].recalcstate: - - constants: { asloaded: 0, recalcing: 1, recalcdone: 2 }, - - loadsheet: null, // (deprecated - use SocialCalc.RecalcInfo.LoadSheet) - }; - - // - // othersheet = SocialCalc.Formula.FindInSheetCache(sheetname) - // - // Returns a SocialCalc.Sheet object corresponding to string sheetname - // or null if the sheet is not available or in error. - // - // Each sheet is loaded only once and then stored in a cache. - // Loading is handled elsewhere, e.g., in the recalc loop. - // - - SocialCalc.Formula.FindInSheetCache = function (sheetname) { - var str; - var sfsc = SocialCalc.Formula.SheetCache; - - var nsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); // normalize different versions - - if (sfsc.sheets[nsheetname]) { - // a sheet by that name is in the cache already - return sfsc.sheets[nsheetname].sheet; // return it - } - - if (sfsc.waitingForLoading) { - // waiting already - only queue up one - return null; // return not found - } - - sfsc.waitingForLoading = nsheetname; // let recalc loop know that we have a sheet to load - - return null; // return not found - }; - - // - // newsheet = SocialCalc.Formula.AddSheetToCache(sheetname, str) - // - // Adds a new sheet to the sheet cache. - // Returns the sheet object filled out with the str (a saved sheet). - // - - SocialCalc.Formula.AddSheetToCache = function (sheetname, str) { - var newsheet = null; - var sfsc = SocialCalc.Formula.SheetCache; - var sfscc = sfsc.constants; - var newsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); - - if (str) { - newsheet = new SocialCalc.Sheet(); - newsheet.ParseSheetSave(str); - } - - sfsc.sheets[newsheetname] = { - sheet: newsheet, - recalcstate: sfscc.asloaded, - name: newsheetname, - }; - - SocialCalc.Formula.FreshnessInfo.sheets[newsheetname] = true; - - return newsheet; - }; - - // - // nsheet = SocialCalc.Formula.NormalizeSheetName(sheetname) - // - - SocialCalc.Formula.NormalizeSheetName = function (sheetname) { - if (SocialCalc.Callbacks.NormalizeSheetName) { - return SocialCalc.Callbacks.NormalizeSheetName(sheetname); - } else { - return sheetname.toLowerCase(); - } - }; - - // - // REMOTE FUNCTION INFO - // - - SocialCalc.Formula.RemoteFunctionInfo = { - // Waiting for server: - // If waiting for an XHR response from the server, this is set to some non-blank status text - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForServer: null, - }; - - // - // FRESHNESS INFO - // - // This information is generated during recalc. - // It may be used to help determine when the recalc data in a spreadsheet - // may be out of date. - // For example, it may be used to display a message like: - // "Dependent on sheet 'FOO' which was updated more recently than this printout" - - SocialCalc.Formula.FreshnessInfo = { - // For each external sheet referenced successfully an attribute of that name with value true. - - sheets: {}, - - // For each volatile function that is called an attribute of that name with value true. - - volatile: {}, - - // Set to false when started and true when recalc completes - - recalc_completed: false, - }; - - SocialCalc.Formula.FreshnessInfoReset = function () { - var scffi = SocialCalc.Formula.FreshnessInfo; - - scffi.sheets = {}; - scffi.volatile = {}; - scffi.recalc_completed = false; - }; - - // - // MISC ROUTINES - // - - // - // result = SocialCalc.Formula.PlainCoord(coord) - // - // Returns: coord without any $'s - // - - SocialCalc.Formula.PlainCoord = function (coord) { - if (coord.indexOf("$") == -1) return coord; - - return coord.replace(/\$/g, ""); // remove any $'s - }; - - // - // result = SocialCalc.Formula.OrderRangeParts(coord1, coord2) - // - // Returns: {c1: col, r1: row, c2: col, r2 = row} with c1/r1 upper left - // - - SocialCalc.Formula.OrderRangeParts = function (coord1, coord2) { - var cr1, cr2; - var result = {}; - - cr1 = SocialCalc.coordToCr(coord1); - cr2 = SocialCalc.coordToCr(coord2); - if (cr1.col > cr2.col) { - result.c1 = cr2.col; - result.c2 = cr1.col; - } else { - result.c1 = cr1.col; - result.c2 = cr2.col; - } - if (cr1.row > cr2.row) { - result.r1 = cr2.row; - result.r2 = cr1.row; - } else { - result.r1 = cr1.row; - result.r2 = cr2.row; - } - - return result; - }; - - // - // cond = SocialCalc.Formula.TestCriteria(value, type, criteria) - // - // Determines whether a value/type meets the criteria. - // A criteria can be a numeric value, text beginning with <, <=, =, >=, >, <>, text by itself is start of text to match. - // Used by a variety of functions, including the "D" functions (DSUM, etc.). - // - // Returns true or false - // - - SocialCalc.Formula.TestCriteria = function (value, type, criteria) { - var comparitor, basestring, basevalue, cond, testvalue; - - if (criteria == null) { - // undefined (e.g., error value) is always false - return false; - } - - criteria = criteria + ""; - comparitor = criteria.charAt(0); // look for comparitor - if (comparitor == "=" || comparitor == "<" || comparitor == ">") { - basestring = criteria.substring(1); - } else { - comparitor = criteria.substring(0, 2); - if (comparitor == "<=" || comparitor == "<>" || comparitor == ">=") { - basestring = criteria.substring(2); - } else { - comparitor = "none"; - basestring = criteria; - } - } - - basevalue = SocialCalc.DetermineValueType(basestring); // get type of value being compared - if (!basevalue.type) { - // no criteria base value given - if (comparitor == "none") { - // blank criteria matches nothing - return false; - } - if (type.charAt(0) == "b") { - // comparing to empty cell - if (comparitor == "=") { - // empty equals empty - return true; - } - } else { - if (comparitor == "<>") { - // "something" does not equal empty - return true; - } - } - return false; // otherwise false - } - - cond = false; - - if (basevalue.type.charAt(0) == "n" && type.charAt(0) == "t") { - // criteria is number, but value is text - testvalue = SocialCalc.DetermineValueType(value); - if (testvalue.type.charAt(0) == "n") { - // could be number - make it one - value = testvalue.value; - type = testvalue.type; - } - } - - if (type.charAt(0) == "n" && basevalue.type.charAt(0) == "n") { - // compare two numbers - value = value - 0; // make sure numbers - basevalue.value = basevalue.value - 0; - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - case "none": - cond = value == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } else if (type.charAt(0) == "e") { - // error on left - cond = false; - } else if (basevalue.type.charAt(0) == "e") { - // error on right - cond = false; - } else { - // text, maybe mixed with number or blank - if (type.charAt(0) == "n") { - value = SocialCalc.format_number_for_display(value, "n", ""); - } - if (basevalue.type.charAt(0) == "n") { - return false; // if number and didn't match already, isn't a match - } - - value = value ? value.toLowerCase() : ""; - basevalue.value = basevalue.value ? basevalue.value.toLowerCase() : ""; - - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - cond = value == basevalue.value; - break; - - case "none": - cond = value.substring(0, basevalue.value.length) == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } - - return cond; - }; - - // - /* -// The module of the SocialCalc package for the optional popup menus in socialcalcspreadsheetcontrol.js -// -// (c) Copyright 2009 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// -*/ - - var SocialCalc; // All values are stored in the master SocialCalc object - if (!SocialCalc) { - SocialCalc = {}; - } - - // The main Popup data -- there is only one set - - SocialCalc.Popup = {}; - - // Routines and values for each type of control, indexed by type name - // The value for each is an object constructed as follows: - // - // Create = function(type, id, attribs) - // Initialize = function(type, id, data) - // SetValue = function(type, id, value) - // GetValue = function(type, id) returns value - // SetDisabled = function(type, id, t/f) - // Show = function(type, id) - // Hide = function(type, id) - // Cancel = function(type, id) - // Reset = function(type) - // - // data = object to hold type-specific data - // - - SocialCalc.Popup.Types = {}; - - // Definitions for each individual control, indexed by id - // The value for each is an object constructed as follows: - // - // type: type name of the control - // value: current value of the control (usually a string, but can depend on type) - // data: object with type-specific items - // - - SocialCalc.Popup.Controls = {}; - - // System-wide values of currently active control - // - // id: id of current control or null - // - - SocialCalc.Popup.Current = {}; - - // Other values used by the Popup system - // - - SocialCalc.Popup.imagePrefix = "/socialcalc/images/sc-"; // image prefix - - // Override this for localization - - SocialCalc.Popup.LocalizeString = function (str) { - return str; - }; - - // * * * * * * * * * * * * * * * * - // - // GENERAL ROUTINES - // - // * * * * * * * * * * * * * * * * - - // - // SocialCalc.Popup.Create(type, id, attribs) - // - // Creates a control of type "type" as the children of document element "id" using "attribs" - // - - SocialCalc.Popup.Create = function (type, id, attribs) { - var pt = SocialCalc.Popup.Types[type]; - if (pt && pt.Create) { - pt.Create(type, id, attribs); - } - }; - - // - // SocialCalc.Popup.SetValue(id, value) - // - // Sets the value of control. - // - - SocialCalc.Popup.SetValue = function (id, value) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - var pt = spt[type]; - var spcdata = spc[id].data; - - if (pt && pt.Create) { - pt.SetValue(type, id, value); - if (spcdata.attribs && spcdata.attribs.changedcallback) { - spcdata.attribs.changedcallback(spcdata.attribs, id, value); - } - } - }; - - // - // SocialCalc.Popup.SetDisabled(id, disabled) - // - // Sets whether the control is disabled (true) or not (false). - // - - SocialCalc.Popup.SetDisabled = function (id, disabled) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - if (sp.Current.id && id == sp.Current.id) { - pt.Hide(type, sp.Current.id); - sp.Current.id = null; - } - pt.SetDisabled(type, id, disabled); - } - }; - - // - // SocialCalc.Popup.GetValue(id) - // - // Returns the value of control. - // - - SocialCalc.Popup.GetValue = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - return pt.GetValue(type, id); - } - - return null; - }; - - // - // SocialCalc.Popup.Initialize(id, data) - // - // Gives "data" to the appropriate initialization code. - // - - SocialCalc.Popup.Initialize = function (id, data) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Initialize) { - pt.Initialize(type, id, data); - } - }; - - // - // SocialCalc.Popup.Reset(type) - // - // Resets Popup, such as when turning to page. - // - - SocialCalc.Popup.Reset = function (type) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (spt[type].Reset) spt[type].Reset(type); - }; - - // - // SocialCalc.Popup.CClick(id) - // - // Should be called when the user clicks on a control to do the popup - // - - SocialCalc.Popup.CClick = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - if (spc[id].data && spc[id].data.disabled) return; - - var type = spc[id].type; - - var pt = spt[type]; - - if (sp.Current.id) { - spt[spc[sp.Current.id].type].Hide(type, sp.Current.id); - if (id == sp.Current.id) { - // same one - done - sp.Current.id = null; - return; - } - } - - if (pt && pt.Show) { - pt.Show(type, id); - } - - sp.Current.id = id; - }; - - // - // SocialCalc.Popup.Close() - // - // Used to close any open popup. - // - - SocialCalc.Popup.Close = function () { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - sp.CClick(sp.Current.id); - }; - - // - // SocialCalc.Popup.Cancel() - // - // Closes Popup and restores old value - // - - SocialCalc.Popup.Cancel = function () { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - var type = spc[sp.Current.id].type; - - var pt = spt[type]; - - pt.Cancel(type, sp.Current.id); - - sp.Current.id = null; - }; - - // - // ele = SocialCalc.Popup.CreatePopupDiv(id, attribs) - // - // Utility function to create the main popup div of width attribs.width. - // If attribs.title, create one with that text, and optionally attribs.moveable. - // - - SocialCalc.Popup.CreatePopupDiv = function (id, attribs) { - var pos, ele; - - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = document.createElement("div"); - main.style.position = "absolute"; - - pos = SocialCalc.GetElementPositionWithScroll(spcdata.mainele); - - main.style.top = pos.top + spcdata.mainele.offsetHeight + "px"; - main.style.left = pos.left + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - if (attribs.width) { - main.style.width = attribs.width; - } - - spcdata.mainele.appendChild(main); - - if (attribs.title) { - main.innerHTML = - '' + - '" + - '
' + - attribs.title + - " X 
'; - - if (attribs.moveable) { - spcdata.dragregistered = - main.firstChild.firstChild.firstChild.firstChild; - SocialCalc.DragRegister(spcdata.dragregistered, true, true, { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - }); - } - } - - return main; - }; - - // - // SocialCalc.Popup.EnsurePosition(id, container) - // - // Utility function to make sure popup is positioned completely within container (both element objects) - // and appropriate with respect to the main element controlling the popup. - // - - SocialCalc.Popup.EnsurePosition = function (id, container) { - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = spcdata.mainele.firstChild; - if (!main) { - alert("No main popup element firstChild."); - return; - } - var popup = spcdata.popupele; - - function GetLayoutValues(ele) { - var r = SocialCalc.GetElementPositionWithScroll(ele); - r.height = ele.offsetHeight; - r.width = ele.offsetWidth; - r.bottom = r.top + r.height; - r.right = r.left + r.width; - return r; - } - - var p = GetLayoutValues(popup); - var c = GetLayoutValues(container); - var m = GetLayoutValues(main); - var t = 0; // type of placement - //addmsg("popup t/r/b/l/h/w= "+p.top+"/"+p.right+"/"+p.bottom+"/"+p.left+"/"+p.height+"/"+p.width); - //addmsg("container t/r/b/l/h/w= "+c.top+"/"+c.right+"/"+c.bottom+"/"+c.left+"/"+c.height+"/"+c.width); - //addmsg("main t/r/b/l/h/w= "+m.top+"/"+m.right+"/"+m.bottom+"/"+m.left+"/"+m.height+"/"+m.width); - - // Check various layout cases in priority order - - if (m.bottom + p.height < c.bottom && m.left + p.width < c.right) { - // normal case: room on bottom and right - popup.style.top = m.bottom + "px"; - popup.style.left = m.left + "px"; - t = 1; - } else if (m.top - p.height > c.top && m.left + p.width < c.right) { - // room on top and right - popup.style.top = m.top - p.height + "px"; - popup.style.left = m.left + "px"; - t = 2; - } else if (m.bottom + p.height < c.bottom && m.right - p.width > c.left) { - // room on bottom and left - popup.style.top = m.bottom + "px"; - popup.style.left = m.right - p.width + "px"; - t = 3; - } else if (m.top - p.height > c.top && m.right - p.width > c.left) { - // room on top and left - popup.style.top = m.top - p.height + "px"; - popup.style.left = m.right - p.width + "px"; - t = 4; - } else if (m.bottom + p.height < c.bottom && p.width < c.width) { - // room on bottom and middle - popup.style.top = m.bottom + "px"; - popup.style.left = c.left + Math.floor((c.width - p.width) / 2) + "px"; - t = 5; - } else if (m.top - p.height > c.top && p.width < c.width) { - // room on top and middle - popup.style.top = m.top - p.height + "px"; - popup.style.left = c.left + Math.floor((c.width - p.width) / 2) + "px"; - t = 6; - } else if (p.height < c.height && m.right + p.width < c.right) { - // room on middle and right - popup.style.top = c.top + Math.floor((c.height - p.height) / 2) + "px"; - popup.style.left = m.right + "px"; - t = 7; - } else if (p.height < c.height && m.left - p.width > c.left) { - // room on middle and left - popup.style.top = c.top + Math.floor((c.height - p.height) / 2) + "px"; - popup.style.left = m.left - p.width + "px"; - t = 8; - } else { - // nothing works, so leave as it is - } - //addmsg("Popup layout "+t); - }; - - // - // ele = SocialCalc.Popup.DestroyPopupDiv(ele, dragregistered) - // - // Utility function to get rid of the main popup div. - // - - SocialCalc.Popup.DestroyPopupDiv = function (ele, dragregistered) { - if (!ele) return; - - ele.innerHTML = ""; - - SocialCalc.DragUnregister(dragregistered); // OK to do this even if not registered - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - // - // Color Utility Functions - // - - SocialCalc.Popup.RGBToHex = function (val) { - var sp = SocialCalc.Popup; - - if (val == "") { - return "000000"; - } - var rgbvals = val.match(/(\d+)\D+(\d+)\D+(\d+)/); - if (rgbvals) { - return sp.ToHex(rgbvals[1]) + sp.ToHex(rgbvals[2]) + sp.ToHex(rgbvals[3]); - } else { - return "000000"; - } - }; - - SocialCalc.Popup.HexDigits = "0123456789ABCDEF"; - - SocialCalc.Popup.ToHex = function (num) { - var sp = SocialCalc.Popup; - var first = Math.floor(num / 16); - var second = num % 16; - return sp.HexDigits.charAt(first) + sp.HexDigits.charAt(second); - }; - - SocialCalc.Popup.FromHex = function (str) { - var sp = SocialCalc.Popup; - var first = sp.HexDigits.indexOf(str.charAt(0).toUpperCase()); - var second = sp.HexDigits.indexOf(str.charAt(1).toUpperCase()); - return (first >= 0 ? first : 0) * 16 + (second >= 0 ? second : 0); - }; - - SocialCalc.Popup.HexToRGB = function (val) { - var sp = SocialCalc.Popup; - - return ( - "rgb(" + - sp.FromHex(val.substring(1, 3)) + - "," + - sp.FromHex(val.substring(3, 5)) + - "," + - sp.FromHex(val.substring(5, 7)) + - ")" - ); - }; - - SocialCalc.Popup.makeRGB = function (r, g, b) { - return ( - "rgb(" + - (r > 0 ? r : 0) + - "," + - (g > 0 ? g : 0) + - "," + - (b > 0 ? b : 0) + - ")" - ); - }; - - SocialCalc.Popup.splitRGB = function (rgb) { - var parts = rgb.match(/(\d+)\D+(\d+)\D+(\d+)\D/); - if (!parts) { - return { r: 0, g: 0, b: 0 }; - } else { - return { r: parts[1] - 0, g: parts[2] - 0, b: parts[3] - 0 }; - } - }; - - // * * * * * * * * * * * * * * * * - // - // ROUTINES FOR EACH TYPE - // - // * * * * * * * * * * * * * * * * - - // - // List - // - // type: List - // value: value of control, - // display: "value to display", - // custom: true if custom value, - // disabled: t/f, - // attribs: { - // title: "popup title string", - // moveable: t/f, - // width: optional width, e.g., "100px", - // ensureWithin: optional element object to ensure popup fits within if possible - // changedcallback: optional function(attribs, id, newvalue), - // ... - // } - // data: { - // ncols: calculated number of columns - // options: [ - // {o: option-name, v: value-to-return, - // a: {option attribs} // optional: {skip: true, custom: true, cancel: true, newcol: true} - // }, - // ...] - // } - // - // popupele: gets popup element object when created - // contentele: gets element created with all the content - // listdiv: gets div with list of items - // customele: gets input element with custom value - // dragregistered: gets element, if any, registered as draggable - // - - SocialCalc.Popup.Types.List = {}; - - SocialCalc.Popup.Types.List.Create = function (type, id, attribs) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - var spcid = { type: type, value: "", display: "", data: {} }; - if (spc[id]) { - return; - } - spc[id] = spcid; - var spcdata = spcid.data; - - spcdata.attribs = attribs || {}; - - var ele = document.getElementById(id); - if (!ele) { - alert("Missing element " + id); - return; - } - - spcdata.mainele = ele; - - ele.innerHTML = - ''; - - spcdata.options = []; // set to nothing - use Initialize to fill - }; - - SocialCalc.Popup.Types.List.SetValue = function (type, id, value) { - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - spcdata.value = value; - spcdata.custom = false; - - for (i = 0; i < spcdata.options.length; i++) { - o = spcdata.options[i]; - if (o.a) { - if (o.a.skip || o.a.custom || o.a.cancel) { - continue; - } - } - if (o.v == spcdata.value) { - // matches value - spcdata.display = o.o; - break; - } - } - if (i == spcdata.options.length) { - // none found - spcdata.display = "Custom"; - spcdata.custom = true; - } - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.value = spcdata.display; - } - }; - - SocialCalc.Popup.Types.List.SetDisabled = function (type, id, disabled) { - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - spcdata.disabled = disabled; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = disabled; - } - }; - - SocialCalc.Popup.Types.List.GetValue = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - return spcdata.value; - }; - - // data is: {value: initial value, attribs: {attribs stuff}, options: [{o: option-name, v: value-to-return, a: optional-attribs}, ...]} - - SocialCalc.Popup.Types.List.Initialize = function (type, id, data) { - var a; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - for (a in data.attribs) { - spcdata.attribs[a] = data.attribs[a]; - } - - spcdata.options = data ? data.options : []; - - if (data.value) { - // if has a value, set to it - sp.SetValue(id, data.value); - } - }; - - SocialCalc.Popup.Types.List.Reset = function (type) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (sp.Current.id && spc[sp.Current.id].type == type) { - // we have a popup - spt[type].Hide(type, sp.Current.id); - sp.Current.id = null; - } - }; - - SocialCalc.Popup.Types.List.Show = function (type, id) { - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var str = ""; - - spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs); - - if (spcdata.custom) { - str = SocialCalc.Popup.Types.List.MakeCustom(type, id); - - ele = document.createElement("div"); - ele.innerHTML = - '
' + - str + - "
"; - - spcdata.customele = ele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = ele; - } else { - str = SocialCalc.Popup.Types.List.MakeList(type, id); - - ele = document.createElement("div"); - ele.innerHTML = - '
' + str + "
"; - - spcdata.customele = null; - spcdata.listdiv = ele.firstChild; - spcdata.contentele = ele; - } - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = true; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.List.MakeList = function (type, id) { - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var str = ''; - var td = '" + td + "    " + "" + td; - spcdata.ncols += 1; - continue; - } - if (o.a.skip) { - str += - '
' + - o.o + - "
"; - continue; - } - } - if (o.v == spcdata.value && !(o.a && (o.a.custom || o.a.cancel))) { - // matches value - bg = "background-color:#DDF;"; - } else { - bg = ""; - } - str += - '
" + - o.o + - "
"; - } - - str += "
'; - - str += td; - - spcdata.ncols = 1; - - for (i = 0; i < spcdata.options.length; i++) { - o = spcdata.options[i]; - if (o.a) { - if (o.a.newcol) { - str += "
"; - - return str; - }; - - SocialCalc.Popup.Types.List.MakeCustom = function (type, id) { - var SPLoc = SocialCalc.Popup.LocalizeString; - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - var val = spcdata.value; - val = SocialCalc.special_chars(val); - - str = - '

' + - '

' + - "" + - "" + - "' + - "
"; - - return str; - }; - - SocialCalc.Popup.Types.List.ItemClicked = function (id, num) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var a = spcdata.options[num].a; - - if (a && a.custom) { - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeCustom("List", id); - nele = document.createElement("div"); - nele.innerHTML = - '
' + - str + - "
"; - spcdata.customele = nele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - return; - } - - if (a && a.cancel) { - SocialCalc.Popup.Close(); - return; - } - - SocialCalc.Popup.SetValue(id, spcdata.options[num].v); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.List.CustomToList = function (id) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeList("List", id); - nele = document.createElement("div"); - nele.innerHTML = - '
' + str + "
"; - spcdata.customele = null; - spcdata.listdiv = nele.firstChild; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.List.CustomOK = function (id) { - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.customele.value); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.List.MouseMove = function (id, ele) { - var col, i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var list = spcdata.listdiv; - - if (!list) return; - - var rowele = list.firstChild.firstChild.firstChild; // div.table.tbody.tr - - for (col = 0; col < spcdata.ncols; col++) { - for (i = 0; i < rowele.childNodes[col * 2].childNodes.length; i++) { - rowele.childNodes[col * 2].childNodes[i].style.backgroundColor = "#FFF"; - } - } - - ele.style.backgroundColor = "#DDF"; - }; - - SocialCalc.Popup.Types.List.Hide = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered); - spcdata.popupele = null; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = false; - } - }; - - SocialCalc.Popup.Types.List.Cancel = function (type, id) { - SocialCalc.Popup.Types.List.Hide(type, id); - }; - - // - // ColorChooser - // - // type: ColorChooser - // value: value of control as "rgb(r,g,b)" or "" if default, - // oldvalue: starting value to reset to on close, - // display: "value to display" as hex color value, - // custom: true if custom value, - // disabled: t/f, - // attribs: { - // title: "popup title string", - // moveable: t/f, - // width: optional width, e.g., "100px", of popup chooser - // ensureWithin: optional element object to ensure popup fits within if possible - // sampleWidth: optional width, e.g., "20px", - // sampleHeight: optional height, e.g., "20px", - // backgroundImage: optional background image for sample (transparent where want to show current color), e.g., "colorbg.gif" - // backgroundImageDefault: optional background image for sample when default (transparent shows white) - // backgroundImageDisabled: optional background image for sample when disabled (transparent shows gray) - // changedcallback: optional function(attribs, id, newvalue), - // ... - // } - // data: { - // } - // - // popupele: gets popup element object when created - // contentele: gets element created with all the content - // customele: gets input element with custom value - // - - SocialCalc.Popup.Types.ColorChooser = {}; - - SocialCalc.Popup.Types.ColorChooser.Create = function (type, id, attribs) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - var spcid = { type: type, value: "", display: "", data: {} }; - if (spc[id]) { - return; - } - spc[id] = spcid; - var spcdata = spcid.data; - - spcdata.attribs = attribs || {}; - var spca = spcdata.attribs; - - spcdata.value = ""; - - var ele = document.getElementById(id); - if (!ele) { - alert("Missing element " + id); - return; - } - - spcdata.mainele = ele; - - ele.innerHTML = - '
 
"; - }; - - SocialCalc.Popup.Types.ColorChooser.SetValue = function (type, id, value) { - var i, img, pos; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.value = value; - spcdata.custom = false; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (spcdata.value) { - spcdata.mainele.firstChild.style.backgroundColor = spcdata.value; - if (spca.backgroundImage) { - img = "url(" + sp.imagePrefix + spca.backgroundImage + ")"; - } else { - img = ""; - } - pos = "center center"; - } else { - spcdata.mainele.firstChild.style.backgroundColor = "#FFF"; - if (spca.backgroundImageDefault) { - img = "url(" + sp.imagePrefix + spca.backgroundImageDefault + ")"; - pos = "center center"; - } else { - img = "url(" + sp.imagePrefix + "defaultcolor.gif)"; - pos = "left top"; - } - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } - }; - - SocialCalc.Popup.Types.ColorChooser.SetDisabled = function ( - type, - id, - disabled - ) { - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.disabled = disabled; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (disabled) { - spcdata.mainele.firstChild.style.backgroundColor = "#DDD"; - if (spca.backgroundImageDisabled) { - img = "url(" + sp.imagePrefix + spca.backgroundImageDisabled + ")"; - pos = "center center"; - } else { - img = "url(" + sp.imagePrefix + "defaultcolor.gif)"; - pos = "left top"; - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } else { - sp.SetValue(id, spcdata.value); - } - } - }; - - SocialCalc.Popup.Types.ColorChooser.GetValue = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - return spcdata.value; - }; - - SocialCalc.Popup.Types.ColorChooser.Initialize = function (type, id, data) { - var a; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - for (a in data.attribs) { - spcdata.attribs[a] = data.attribs[a]; - } - - if (data.value) { - // if has a value, set to it - sp.SetValue(id, data.value); - } - }; - - SocialCalc.Popup.Types.ColorChooser.Reset = function (type) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (sp.Current.id && spc[sp.Current.id].type == type) { - // we have a popup - spt[type].Hide(type, sp.Current.id); - sp.Current.id = null; - } - }; - - SocialCalc.Popup.Types.ColorChooser.Show = function (type, id) { - var i, ele, mainele; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var str = ""; - - spcdata.oldvalue = spcdata.value; // remember starting value - - spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs); - - if (spcdata.custom) { - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom(type, id); - - ele = document.createElement("div"); - ele.innerHTML = - '
' + - str + - "
"; - - spcdata.customele = ele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = ele; - } else { - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid(type, id); - - ele = document.createElement("div"); - ele.style.padding = "3px"; - ele.style.backgroundColor = "#CCC"; - ele.appendChild(mainele); - - spcdata.customele = null; - spcdata.contentele = ele; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.ColorChooser.MakeCustom = function (type, id) { - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var SPLoc = sp.LocalizeString; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - str = - '

' + - '#

' + - "" + - "" + - "
"; - - return str; - }; - - SocialCalc.Popup.Types.ColorChooser.ItemClicked = function (id, num) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.CustomToList = function (id) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - }; - - SocialCalc.Popup.Types.ColorChooser.CustomOK = function (id) { - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.customele.value); - - sp.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.Hide = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered); - spcdata.popupele = null; - }; - - SocialCalc.Popup.Types.ColorChooser.Cancel = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.oldvalue); // reset to old value - - SocialCalc.Popup.Types.ColorChooser.Hide(type, id); - }; - - SocialCalc.Popup.Types.ColorChooser.CreateGrid = function (type, id) { - var ele, pos, row, rowele, col, g; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var SPLoc = sp.LocalizeString; - var spcdata = spc[id].data; - spcdata.grid = {}; - var grid = spcdata.grid; - - var mainele = document.createElement("div"); - - ele = document.createElement("table"); - ele.cellSpacing = 0; - ele.cellPadding = 0; - ele.style.width = "100px"; - grid.table = ele; - - ele = document.createElement("tbody"); - grid.table.appendChild(ele); - grid.tbody = ele; - - for (row = 0; row < 16; row++) { - rowele = document.createElement("tr"); - for (col = 0; col < 5; col++) { - g = {}; - grid[row + "," + col] = g; - ele = document.createElement("td"); - ele.style.fontSize = "1px"; - ele.innerHTML = " "; - ele.style.height = "10px"; - if (col <= 1) { - ele.style.width = "17px"; - ele.style.borderRight = "3px solid white"; - } else { - ele.style.width = "20px"; - ele.style.backgroundRepeat = "no-repeat"; - } - rowele.appendChild(ele); - g.ele = ele; - } - grid.tbody.appendChild(rowele); - } - mainele.appendChild(grid.table); - - ele = document.createElement("div"); - ele.style.marginTop = "3px"; - ele.innerHTML = - '' + - '' + - '' + - '" + - "
 #' + - SPLoc("OK") + - "
"; - grid.defaultbox = ele.firstChild.firstChild.firstChild.childNodes[0]; - grid.defaultbox.onclick = spt.ColorChooser.DefaultClicked; - grid.custom = ele.firstChild.firstChild.firstChild.childNodes[1]; - grid.custom.onclick = spt.ColorChooser.CustomClicked; - grid.msg = ele.firstChild.firstChild.firstChild.childNodes[2]; - grid.msg.onclick = spt.ColorChooser.CloseOK; - mainele.appendChild(ele); - - grid.table.onmousedown = spt.ColorChooser.GridMouseDown; - - spt.ColorChooser.DetermineColors(id); - spt.ColorChooser.SetColors(id); - - return mainele; - }; - - SocialCalc.Popup.Types.ColorChooser.gridToG = function (grid, row, col) { - return grid[row + "," + col]; - }; - - SocialCalc.Popup.Types.ColorChooser.DetermineColors = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - var col, row; - var rgb = sp.splitRGB(spcdata.value); - var color; - - col = 2; - row = 16 - Math.floor((rgb.r + 16) / 16); - grid["selectedrow" + col] = row; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB(17 * (15 - row), 0, 0); - } - - col = 3; - row = 16 - Math.floor((rgb.g + 16) / 16); - grid["selectedrow" + col] = row; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB(0, 17 * (15 - row), 0); - } - - col = 4; - row = 16 - Math.floor((rgb.b + 16) / 16); - grid["selectedrow" + col] = row; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB(0, 0, 17 * (15 - row)); - } - - col = 1; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB( - 17 * (15 - row), - 17 * (15 - row), - 17 * (15 - row) - ); - } - - col = 0; - var steps = [0, 68, 153, 204, 255]; - var commonrgb = [ - "400", - "310", - "420", - "440", - "442", - "340", - "040", - "042", - "032", - "044", - "024", - "004", - "204", - "314", - "402", - "414", - ]; - var x; - for (row = 0; row < 16; row++) { - x = commonrgb[row]; - sptc.gridToG(grid, row, col).rgb = - "rgb(" + - steps[x.charAt(0) - 0] + - "," + - steps[x.charAt(1) - 0] + - "," + - steps[x.charAt(2) - 0] + - ")"; - } - }; - - SocialCalc.Popup.Types.ColorChooser.SetColors = function (id) { - var row, col, g, ele, rgb; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - for (row = 0; row < 16; row++) { - for (col = 0; col < 5; col++) { - g = sptc.gridToG(grid, row, col); - g.ele.style.backgroundColor = g.rgb; - g.ele.title = sp.RGBToHex(g.rgb); - if (grid["selectedrow" + col] == row) { - g.ele.style.backgroundImage = - "url(" + sp.imagePrefix + "chooserarrow.gif)"; - } else { - g.ele.style.backgroundImage = ""; - } - } - } - - sp.SetValue(id, spcdata.value); - - grid.msg.style.backgroundColor = spcdata.value; - rgb = sp.splitRGB(spcdata.value || "rgb(255,255,255)"); - if (rgb.r + rgb.g + rgb.b < 220) { - grid.msg.style.color = "#FFF"; - } else { - grid.msg.style.color = "#000"; - } - if (!spcdata.value) { - // default - grid.msg.style.backgroundColor = "#FFF"; - grid.msg.style.backgroundImage = - "url(" + sp.imagePrefix + "defaultcolor.gif)"; - grid.msg.title = "Default"; - } else { - grid.msg.style.backgroundImage = ""; - grid.msg.title = sp.RGBToHex(spcdata.value); - } - }; - - SocialCalc.Popup.Types.ColorChooser.GridMouseDown = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - var grid = spcdata.grid; - - switch (event.type) { - case "mousedown": - grid.mousedown = true; - break; - case "mouseup": - grid.mousedown = false; - break; - case "mousemove": - if (!grid.mousedown) { - return; - } - break; - } - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - var gpos = SocialCalc.GetElementPosition(grid.table); - var row = Math.floor((clientY - gpos.top - 2) / 10); // -2 is to split the diff btw IE & FF - row = row < 0 ? 0 : row; - var col = Math.floor((clientX - gpos.left) / 20); - row = row < 0 ? 0 : row > 15 ? 15 : row; - col = col < 0 ? 0 : col > 4 ? 4 : col; - var color = sptc.gridToG(grid, row, col).ele.style.backgroundColor; - var newrgb = sp.splitRGB(color); - var oldrgb = sp.splitRGB(spcdata.value); - - switch (col) { - case 2: - spcdata.value = sp.makeRGB(newrgb.r, oldrgb.g, oldrgb.b); - break; - case 3: - spcdata.value = sp.makeRGB(oldrgb.r, newrgb.g, oldrgb.b); - break; - case 4: - spcdata.value = sp.makeRGB(oldrgb.r, oldrgb.g, newrgb.b); - break; - case 0: - case 1: - spcdata.value = color; - } - - sptc.DetermineColors(id); - sptc.SetColors(id); - }; - - SocialCalc.Popup.Types.ColorChooser.ControlClicked = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var cid = sp.Current.id; - if (!cid || id != cid) { - sp.CClick(id); - return; - } - - sptc.CloseOK(); - }; - - SocialCalc.Popup.Types.ColorChooser.DefaultClicked = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - spcdata.value = ""; - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.CustomClicked = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - var oele, str, nele; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom("ColorChooser", id); - nele = document.createElement("div"); - nele.innerHTML = - '
' + - str + - "
"; - spcdata.customele = nele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - spcdata.customele.value = sp.RGBToHex(spcdata.value); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.ColorChooser.CustomToGrid = function (id) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#" + spcdata.customele.value)); - - var oele, mainele, nele; - - oele = spcdata.contentele; - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid( - "ColorChooser", - id - ); - nele = document.createElement("div"); - nele.style.padding = "3px"; - nele.style.backgroundColor = "#CCC"; - nele.appendChild(mainele); - spcdata.customele = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.ColorChooser.CustomOK = function (id) { - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#" + spcdata.customele.value)); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.CloseOK = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - }; - - // - // SocialCalcSpreadsheetControl - // - /* -// The code module of the SocialCalc package that lets you embed a spreadsheet -// control with toolbar, etc., into a web page. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - - /* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript SpreadsheetControl. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the SpreadsheetControl is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/ - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - - // - // Some of the other files in the SocialCalc package are licensed under - // different licenses. Please note the licenses of the modules you use. - // - // Code History: - // - // Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. - // Unless otherwise specified, referring to "SocialCalc" in comments refers to this - // JavaScript version of the code, not the SocialCalc Perl code. - // - - /* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); - } - - // ************************************* - // - // SpreadsheetControl class: - // - // ************************************* - - // Global constants: - - SocialCalc.CurrentSpreadsheetControlObject = null; // right now there can only be one active at a time - - // Constructor: - - SocialCalc.SpreadsheetControl = function () { - var scc = SocialCalc.Constants; - - // Properties: - - this.parentNode = null; - this.spreadsheetDiv = null; - this.requestedHeight = 0; - this.requestedWidth = 0; - this.requestedSpaceBelow = 0; - this.height = 0; - this.width = 0; - this.viewheight = 0; // calculated amount for views below toolbar, etc. - - // Tab definitions: An array where each tab is an object of the form: - // - // name: "name", - // text: "text-on-tab", - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext - // Other replacements from spreadsheet.tabreplacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // view: "viewname", // view to show when selected; "sheet" or missing/null is spreadsheet - // oncreate: function(spreadsheet, tab-name), // called when first created to initialize - // onclick: function(spreadsheet, tab-name), missing/null is sheet default - // onclickFocus: text, // spreadsheet.idPrefix+text is given the focus if present instead of normal KeyboardFocus - // or if text isn't a string, that value (e.g., true) is used for SocialCalc.CmdGotFocus - // onunclick: function(spreadsheet, tab-name), missing/null is sheet default - - this.tabs = []; - this.tabnums = {}; // when adding tabs, add tab-name: array-index to this object - this.tabreplacements = {}; // see use above - this.currentTab = -1; // currently selected tab index in this.tabs or -1 (maintained by SocialCalc.SetTab) - - // View definitions: An object where each view is an object of the form: - // - // name: "name", // localized when first set using SocialCalc.LocalizeString - // element: node-in-the-dom, // filled in when initialized - // replacements: {}, // see below - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext, "%img.": spreadsheet.imagePrefix, - // SocialCalc.LocalizeSubstring replacements ("%loc!string!" and "%ssc!constant-name!") - // Other replacements from viewobject.replacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // divStyle: attributes for sheet div (SocialCalc.setStyles format) - // oncreate: function(spreadsheet, viewobject), // called when first created to initialize - // needsresize: true/false/null, // if true, do resize calc after displaying - // onresize: function(spreadsheet, viewobject), // called if needs resize - // values: {} // optional values to share with onclick handlers, etc. - // - // There is always a "sheet" view. - - this.views = {}; // {viewname: view-object, ...} - - // Dynamic properties: - - this.sheet = null; - this.context = null; - this.editor = null; - - this.spreadsheetDiv = null; - this.editorDiv = null; - - this.sortrange = ""; // remembered range for sort tab - - this.moverange = ""; // remembered range from movefrom used by movepaste/moveinsert - - // Constants: - - this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-" - this.multipartBoundary = "SocialCalcSpreadsheetControlSave"; // boundary used by SpreadsheetControlCreateSpreadsheetSave - this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src - - this.toolbarbackground = scc.SCToolbarbackground; - this.tabbackground = scc.SCTabbackground; // "background-color:#CCC;"; - this.tabselectedCSS = scc.SCTabselectedCSS; - this.tabplainCSS = scc.SCTabplainCSS; - this.toolbartext = scc.SCToolbartext; - - this.formulabarheight = scc.SCFormulabarheight; // in pixels, will contain a text input box - - if (scc.doWorkBook) { - this.sheetbarheight = scc.SCSheetBarHeight; - this.sheetbarCSS = scc.SCSheetBarCSS; - } else { - this.sheetbarheight = 0; - } - - this.statuslineheight = scc.SCStatuslineheight; // in pixels - this.statuslineCSS = scc.SCStatuslineCSS; - - // Callbacks: - - this.ExportCallback = null; // a function called for Clipboard Export button: this.ExportCallback(spreadsheet_control_object) - - // Initialization Code: - - this.sheet = new SocialCalc.Sheet(); - this.context = new SocialCalc.RenderContext(this.sheet); - this.context.showGrid = true; - this.context.showRCHeaders = true; - this.editor = new SocialCalc.TableEditor(this.context); - this.editor.StatusCallback.statusline = { - func: SocialCalc.SpreadsheetControlStatuslineCallback, - params: { - statuslineid: this.idPrefix + "statusline", - recalcid1: this.idPrefix + "divider_recalc", - recalcid2: this.idPrefix + "button_recalc", - }, - }; - - SocialCalc.CurrentSpreadsheetControlObject = this; // remember this for rendezvousing on events - - this.editor.MoveECellCallback.movefrom = function (editor) { - var cr; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - spreadsheet.context.cursorsuffix = ""; - if (editor.range2.hasrange && !editor.cellhandles.noCursorSuffix) { - if ( - editor.ecell.row == editor.range2.top && - (editor.ecell.col < editor.range2.left || - editor.ecell.col > editor.range2.right + 1) - ) { - spreadsheet.context.cursorsuffix = "insertleft"; - } - if ( - editor.ecell.col == editor.range2.left && - (editor.ecell.row < editor.range2.top || - editor.ecell.row > editor.range2.bottom + 1) - ) { - spreadsheet.context.cursorsuffix = "insertup"; - } - } - }; - - // formula bar buttons - - this.formulabuttons = { - formulafunctions: { - image: "formuladialog.gif", - tooltip: "Functions", // tooltips are localized when set below - command: SocialCalc.SpreadsheetControl.DoFunctionList, - }, - multilineinput: { - image: "multilinedialog.gif", - tooltip: "Multi-line Input Box", - command: SocialCalc.SpreadsheetControl.DoMultiline, - }, - link: { - image: "linkdialog.gif", - tooltip: "Link Input Box", - command: SocialCalc.SpreadsheetControl.DoLink, - }, - sum: { - image: "sumdialog.gif", - tooltip: "Auto Sum", - command: SocialCalc.SpreadsheetControl.DoSum, - }, - /* image: {image: "sumdialog.gif", tooltip: "Insert", - command: SocialCalc.Images.Insert }*/ - }; - - // Default tabs: - - // Edit - - this.tabnums.edit = this.tabs.length; - this.tabs.push({ - name: "edit", - text: "Edit", - html: - '
' + - ' ' + - ' ' + - '    ' + - '' + - ' ' + - ' ' + - '    ' + - '' + - ' ' + - '    ' + - '' + - ' ' + - '    ' + - '' + - ' ' + - ' ' + - '    ' + - '' + - ' ' + - ' ' + - '    ' + - ' ' + - ' ' + - ' ' + - '    ' + - ' ' + - ' ' + - '    ' + - ' ' + - ' ' + - '  ' + - ' ' + - '    ' + - ' ' + - "
", - oncreate: null, //function(spreadsheet, viewobject) {SocialCalc.DoCmd(null, "fill-rowcolstuff");}, - onclick: null, - }); - - // Settings (Format) - - this.tabnums.settings = this.tabs.length; - this.tabs.push({ - name: "settings", - text: "Format", - html: - '", - view: "settings", - onclick: function (s, t) { - SocialCalc.SettingsControls.idPrefix = s.idPrefix; // used to get color chooser div - SocialCalc.SettingControlReset(); - var sheetattribs = s.sheet.EncodeSheetAttributes(); - var cellattribs = s.sheet.EncodeCellAttributes(s.editor.ecell.coord); - SocialCalc.SettingsControlLoadPanel( - s.views.settings.values.sheetspanel, - sheetattribs - ); - SocialCalc.SettingsControlLoadPanel( - s.views.settings.values.cellspanel, - cellattribs - ); - document.getElementById(s.idPrefix + "settingsecell").innerHTML = - s.editor.ecell.coord; - SocialCalc.SpreadsheetControlSettingsSwitch("cell"); - s.views.settings.element.style.height = s.viewheight + "px"; - s.views.settings.element.firstChild.style.height = s.viewheight + "px"; - - var range; // set save message - if (s.editor.range.hasrange) { - range = - SocialCalc.crToCoord(s.editor.range.left, s.editor.range.top) + - ":" + - SocialCalc.crToCoord(s.editor.range.right, s.editor.range.bottom); - } else { - range = s.editor.ecell.coord; - } - document.getElementById(s.idPrefix + "settings-savecell").value = - SocialCalc.LocalizeString("Save to") + ": " + range; - }, - onclickFocus: true, - }); - - this.views["settings"] = { - name: "settings", - values: {}, - oncreate: function (s, viewobj) { - var scc = SocialCalc.Constants; - - viewobj.values.sheetspanel = { - // name: "sheet", - colorchooser: { id: s.idPrefix + "scolorchooser" }, - formatnumber: { - setting: "numberformat", - type: "PopupList", - id: s.idPrefix + "formatnumber", - initialdata: scc.SCFormatNumberFormats, - }, - formattext: { - setting: "textformat", - type: "PopupList", - id: s.idPrefix + "formattext", - initialdata: scc.SCFormatTextFormats, - }, - fontfamily: { - setting: "fontfamily", - type: "PopupList", - id: s.idPrefix + "fontfamily", - initialdata: scc.SCFormatFontfamilies, - }, - fontlook: { - setting: "fontlook", - type: "PopupList", - id: s.idPrefix + "fontlook", - initialdata: scc.SCFormatFontlook, - }, - fontsize: { - setting: "fontsize", - type: "PopupList", - id: s.idPrefix + "fontsize", - initialdata: scc.SCFormatFontsizes, - }, - textalignhoriz: { - setting: "textalignhoriz", - type: "PopupList", - id: s.idPrefix + "textalignhoriz", - initialdata: scc.SCFormatTextAlignhoriz, - }, - numberalignhoriz: { - setting: "numberalignhoriz", - type: "PopupList", - id: s.idPrefix + "numberalignhoriz", - initialdata: scc.SCFormatNumberAlignhoriz, - }, - alignvert: { - setting: "alignvert", - type: "PopupList", - id: s.idPrefix + "alignvert", - initialdata: scc.SCFormatAlignVertical, - }, - textcolor: { - setting: "textcolor", - type: "ColorChooser", - id: s.idPrefix + "textcolor", - }, - bgcolor: { - setting: "bgcolor", - type: "ColorChooser", - id: s.idPrefix + "bgcolor", - }, - padtop: { - setting: "padtop", - type: "PopupList", - id: s.idPrefix + "padtop", - initialdata: scc.SCFormatPadsizes, - }, - padright: { - setting: "padright", - type: "PopupList", - id: s.idPrefix + "padright", - initialdata: scc.SCFormatPadsizes, - }, - padbottom: { - setting: "padbottom", - type: "PopupList", - id: s.idPrefix + "padbottom", - initialdata: scc.SCFormatPadsizes, - }, - padleft: { - setting: "padleft", - type: "PopupList", - id: s.idPrefix + "padleft", - initialdata: scc.SCFormatPadsizes, - }, - colwidth: { - setting: "colwidth", - type: "PopupList", - id: s.idPrefix + "colwidth", - initialdata: scc.SCFormatColwidth, - }, - recalc: { - setting: "recalc", - type: "PopupList", - id: s.idPrefix + "recalc", - initialdata: scc.SCFormatRecalc, - }, - }; - viewobj.values.cellspanel = { - name: "cell", - colorchooser: { id: s.idPrefix + "scolorchooser" }, - cformatnumber: { - setting: "numberformat", - type: "PopupList", - id: s.idPrefix + "cformatnumber", - initialdata: scc.SCFormatNumberFormats, - }, - cformattext: { - setting: "textformat", - type: "PopupList", - id: s.idPrefix + "cformattext", - initialdata: scc.SCFormatTextFormats, - }, - cfontfamily: { - setting: "fontfamily", - type: "PopupList", - id: s.idPrefix + "cfontfamily", - initialdata: scc.SCFormatFontfamilies, - }, - cfontlook: { - setting: "fontlook", - type: "PopupList", - id: s.idPrefix + "cfontlook", - initialdata: scc.SCFormatFontlook, - }, - cfontsize: { - setting: "fontsize", - type: "PopupList", - id: s.idPrefix + "cfontsize", - initialdata: scc.SCFormatFontsizes, - }, - calignhoriz: { - setting: "alignhoriz", - type: "PopupList", - id: s.idPrefix + "calignhoriz", - initialdata: scc.SCFormatTextAlignhoriz, - }, - calignvert: { - setting: "alignvert", - type: "PopupList", - id: s.idPrefix + "calignvert", - initialdata: scc.SCFormatAlignVertical, - }, - ctextcolor: { - setting: "textcolor", - type: "ColorChooser", - id: s.idPrefix + "ctextcolor", - }, - cbgcolor: { - setting: "bgcolor", - type: "ColorChooser", - id: s.idPrefix + "cbgcolor", - }, - cbt: { setting: "bt", type: "BorderSide", id: s.idPrefix + "cbt" }, - cbr: { setting: "br", type: "BorderSide", id: s.idPrefix + "cbr" }, - cbb: { setting: "bb", type: "BorderSide", id: s.idPrefix + "cbb" }, - cbl: { setting: "bl", type: "BorderSide", id: s.idPrefix + "cbl" }, - cpadtop: { - setting: "padtop", - type: "PopupList", - id: s.idPrefix + "cpadtop", - initialdata: scc.SCFormatPadsizes, - }, - cpadright: { - setting: "padright", - type: "PopupList", - id: s.idPrefix + "cpadright", - initialdata: scc.SCFormatPadsizes, - }, - cpadbottom: { - setting: "padbottom", - type: "PopupList", - id: s.idPrefix + "cpadbottom", - initialdata: scc.SCFormatPadsizes, - }, - cpadleft: { - setting: "padleft", - type: "PopupList", - id: s.idPrefix + "cpadleft", - initialdata: scc.SCFormatPadsizes, - }, - }; - - SocialCalc.SettingsControlInitializePanel(viewobj.values.sheetspanel); - SocialCalc.SettingsControlInitializePanel(viewobj.values.cellspanel); - }, - replacements: { - itemtitle: { - regex: /\%itemtitle\./g, - replacement: - 'style="padding:12px 10px 0px 10px;font-weight:bold;text-align:right;vertical-align:top;font-size:small;"', - }, - sectiontitle: { - regex: /\%sectiontitle\./g, - replacement: - 'style="padding:16px 10px 0px 0px;font-weight:bold;vertical-align:top;font-size:small;color:#C00;"', - }, - parttitle: { - regex: /\%parttitle\./g, - replacement: - 'style="font-weight:bold;font-size:x-small;padding:0px 0px 3px 0px;"', - }, - itembody: { - regex: /\%itembody\./g, - replacement: - 'style="padding:12px 0px 0px 0px;vertical-align:top;font-size:small;"', - }, - bodypart: { - regex: /\%bodypart\./g, - replacement: - 'style="padding:0px 10px 0px 0px;font-size:small;vertical-align:top;"', - }, - }, - divStyle: "border:1px solid black;overflow:auto;", - html: - '' + - '' + - '
' + - '' + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - '' + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "

%loc!Format!:
" + - ' ' + - " " + - " " + - "
" + - "
%loc!Number!
" + - ' ' + - "
" + - "
%loc!Text!
" + - ' ' + - "
" + - "

%loc!Alignment!:
" + - ' ' + - " " + - " " + - "
" + - "
%loc!Horizontal!
" + - ' ' + - "
" + - "
%loc!Vertical!
" + - ' ' + - "
" + - "

%loc!Font!:
" + - ' ' + - " " + - " " + - " " + - " " + - " " + - "
" + - "
%loc!Family!
" + - ' ' + - "
" + - "
%loc!Bold & Italics!
" + - ' ' + - "
" + - "
%loc!Size!
" + - ' ' + - "
" + - "
%loc!Color!
" + - '
' + - "
" + - "
%loc!Background!
" + - '
' + - "
" + - "

%loc!Borders!:
" + - ' ' + - ' ' + - ' ' + - ' ' + - ' ' + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - "
%loc!Top Border!
%loc!Right Border!
%loc!Bottom Border!
%loc!Left Border!
" + - ' ' + - " " + - '
' + - "
    " + - ' ' + - " " + - '
' + - "
    " + - ' ' + - " " + - '
' + - "
    " + - ' ' + - " " + - '
' + - "
    
" + - "

%loc!Padding!:
" + - ' ' + - " " + - " " + - " " + - " " + - "
" + - "
%loc!Top!
" + - ' ' + - "
" + - "
%loc!Right!
" + - ' ' + - "
" + - "
%loc!Bottom!
" + - ' ' + - "
" + - "
%loc!Left!
" + - ' ' + - "
" + - "
" + - '
' + - '
' + - ' ' + - ' ' + - "
%loc!This is a
sample!
-1234.5
" + - "
" + - "
" + - "
", - }; - - // Sort - - this.tabnums.sort = this.tabs.length; - this.tabs.push({ - name: "sort", - text: "Sort", - html: - ' ", - onclick: SocialCalc.SpreadsheetControlSortOnclick, - }); - this.editor.SettingsCallbacks.sort = { - save: SocialCalc.SpreadsheetControlSortSave, - load: SocialCalc.SpreadsheetControlSortLoad, - }; - - // Audit - - this.tabnums.audit = this.tabs.length; - this.tabs.push({ - name: "audit", - text: "Audit", - html: - '", - view: "audit", - onclick: function (s, t) { - var SCLoc = SocialCalc.LocalizeString; - var i, j; - var str = - '
' + - SCLoc("Audit Trail This Session") + - ":

"; - var stack = s.sheet.changes.stack; - var tos = s.sheet.changes.tos; - for (i = 0; i < stack.length; i++) { - if (i == tos + 1) - str += - '
' + - SCLoc("UNDONE STEPS") + - ":
"; - for (j = 0; j < stack[i].command.length; j++) { - str += SocialCalc.special_chars(stack[i].command[j]) + "
"; - } - } - s.views.audit.element.innerHTML = str + "
"; - SocialCalc.CmdGotFocus(true); - }, - onclickFocus: true, - }); - - this.views["audit"] = { - name: "audit", - divStyle: "border:1px solid black;overflow:auto;", - html: "Audit Trail", - }; - - // Comment - - this.tabnums.comment = this.tabs.length; - this.tabs.push({ - name: "comment", - text: "Comment", - html: - '", - view: "sheet", - onclick: SocialCalc.SpreadsheetControlCommentOnclick, - onunclick: SocialCalc.SpreadsheetControlCommentOnunclick, - }); - - // Names - - this.tabnums.names = this.tabs.length; - this.tabs.push({ - name: "names", - text: "Names", - html: - '", - view: "sheet", - onclick: SocialCalc.SpreadsheetControlNamesOnclick, - onunclick: SocialCalc.SpreadsheetControlNamesOnunclick, - }); - - // Clipboard - - this.tabnums.clipboard = this.tabs.length; - this.tabs.push({ - name: "clipboard", - text: "Clipboard", - html: - '", - view: "clipboard", - onclick: SocialCalc.SpreadsheetControlClipboardOnclick, - onclickFocus: "clipboardtext", - }); - - this.views["clipboard"] = { - name: "clipboard", - divStyle: "overflow:auto;", - html: - '
' + - " %loc!Display Clipboard in!:" + - ' %loc!Tab-delimited format!  ' + - ' %loc!CSV format!  ' + - ' %loc!SocialCalc-save format!' + - "
" + - '   ' + - '   ' + - "
" + - ' ', - }; - - return; - }; - - // Methods: - - SocialCalc.SpreadsheetControl.prototype.InitializeSpreadsheetControl = - function (node, height, width, spacebelow) { - return SocialCalc.InitializeSpreadsheetControl( - this, - node, - height, - width, - spacebelow - ); - }; - SocialCalc.SpreadsheetControl.prototype.DoOnResize = function () { - return SocialCalc.DoOnResize(this); - }; - SocialCalc.SpreadsheetControl.prototype.SizeSSDiv = function () { - return SocialCalc.SizeSSDiv(this); - }; - SocialCalc.SpreadsheetControl.prototype.ExecuteCommand = function ( - combostr, - sstr - ) { - return SocialCalc.SpreadsheetControlExecuteCommand(this, combostr, sstr); - }; - SocialCalc.SpreadsheetControl.prototype.CreateSheetHTML = function () { - return SocialCalc.SpreadsheetControlCreateSheetHTML(this); - }; - SocialCalc.SpreadsheetControl.prototype.CreateSpreadsheetSave = function ( - otherparts - ) { - return SocialCalc.SpreadsheetControlCreateSpreadsheetSave(this, otherparts); - }; - SocialCalc.SpreadsheetControl.prototype.DecodeSpreadsheetSave = function ( - str - ) { - return SocialCalc.SpreadsheetControlDecodeSpreadsheetSave(this, str); - }; - SocialCalc.SpreadsheetControl.prototype.CreateCellHTML = function (coord) { - return SocialCalc.SpreadsheetControlCreateCellHTML(this, coord); - }; - SocialCalc.SpreadsheetControl.prototype.CreateCellHTMLSave = function ( - range - ) { - return SocialCalc.SpreadsheetControlCreateCellHTMLSave(this, range); - }; - - // Sheet Methods to make things a little easier: - - SocialCalc.SpreadsheetControl.prototype.ParseSheetSave = function (str) { - return this.sheet.ParseSheetSave(str); - }; - SocialCalc.SpreadsheetControl.prototype.CreateSheetSave = function () { - return this.sheet.CreateSheetSave(); - }; - - // Functions: - - // - // InitializeSpreadsheetControl(spreadsheet, node, height, width, spacebelow) - // - // Creates the control elements and makes them the child of node (string or element). - // If present, height and width specify size. - // If either is 0 or null (missing), the maximum that fits on the screen - // (taking spacebelow into account) is used. - // - // Displays the tabs and creates the views (other than "sheet"). - // The first tab is set as selected, but onclick is not invoked. - // - // You should do a redisplay or recalc (which redisplays) after running this. - // - - SocialCalc.InitializeSpreadsheetControl = function ( - spreadsheet, - node, - height, - width, - spacebelow - ) { - var scc = SocialCalc.Constants; - var SCLoc = SocialCalc.LocalizeString; - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var html, child, i, vname, v, style, button, bele; - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - spreadsheet.requestedHeight = height; - spreadsheet.requestedWidth = width; - spreadsheet.requestedSpaceBelow = spacebelow; - - if (typeof node == "string") node = document.getElementById(node); - - if (node == null) { - alert("SocialCalc.SpreadsheetControl not given parent node."); - } - - spreadsheet.parentNode = node; - - // create node to hold spreadsheet control - - spreadsheet.spreadsheetDiv = document.createElement("div"); - - spreadsheet.SizeSSDiv(); // calculate and fill in the size values - - for (child = node.firstChild; child != null; child = node.firstChild) { - node.removeChild(child); - } - - // create the tabbed UI at the top - - html = - '
'; - - for (i = 0; i < tabs.length; i++) { - html += tabs[i].html; - } - - html += - "
" + - '
' + - ''; - - for (i = 0; i < tabs.length; i++) { - html += - ' "; - } - - html += "
' + - SCLoc(tabs[i].text) + - "
"; - - spreadsheet.currentTab = 0; // this is where we started - - for (style in spreadsheet.tabreplacements) { - html = html.replace( - spreadsheet.tabreplacements[style].regex, - spreadsheet.tabreplacements[style].replacement - ); - } - html = html.replace(/\%s\./g, "SocialCalc."); - html = html.replace(/\%id\./g, spreadsheet.idPrefix); - html = html.replace(/\%tbt\./g, spreadsheet.toolbartext); - html = html.replace(/\%img\./g, spreadsheet.imagePrefix); - - html = SCLocSS(html); // localize with %loc!string! and %scc!constant! - - spreadsheet.spreadsheetDiv.innerHTML = html; - - node.appendChild(spreadsheet.spreadsheetDiv); - - // Initialize SocialCalc buttons - - spreadsheet.Buttons = { - button_undo: { tooltip: "Undo", command: "undo" }, - button_redo: { tooltip: "Redo", command: "redo" }, - button_copy: { tooltip: "Copy", command: "copy" }, - button_cut: { tooltip: "Cut", command: "cut" }, - button_paste: { tooltip: "Paste", command: "paste" }, - button_pasteformats: { - tooltip: "Paste Formats", - command: "pasteformats", - }, - button_delete: { tooltip: "Delete Contents", command: "delete" }, - button_filldown: { tooltip: "Fill Down", command: "filldown" }, - button_fillright: { tooltip: "Fill Right", command: "fillright" }, - button_movefrom: { tooltip: "Set/Clear Move From", command: "movefrom" }, - button_movepaste: { tooltip: "Move Paste", command: "movepaste" }, - button_moveinsert: { tooltip: "Move Insert", command: "moveinsert" }, - button_alignleft: { tooltip: "Align Left", command: "align-left" }, - button_aligncenter: { tooltip: "Align Center", command: "align-center" }, - button_alignright: { tooltip: "Align Right", command: "align-right" }, - button_borderon: { tooltip: "Borders On", command: "borderon" }, - button_borderoff: { tooltip: "Borders Off", command: "borderoff" }, - button_swapcolors: { tooltip: "Swap Colors", command: "swapcolors" }, - button_merge: { tooltip: "Merge Cells", command: "merge" }, - button_unmerge: { tooltip: "Unmerge Cells", command: "unmerge" }, - button_insertrow: { tooltip: "Insert Row", command: "insertrow" }, - button_insertcol: { tooltip: "Insert Column", command: "insertcol" }, - button_deleterow: { tooltip: "Delete Row", command: "deleterow" }, - button_deletecol: { tooltip: "Delete Column", command: "deletecol" }, - button_recalc: { tooltip: "Recalc", command: "recalc" }, - }; - - for (button in spreadsheet.Buttons) { - bele = document.getElementById(spreadsheet.idPrefix + button); - if (!bele) { - /*alert("Button "+(spreadsheet.idPrefix+button)+" missing");*/ continue; - } - bele.style.border = "1px solid " + scc.ISCButtonBorderNormal; - SocialCalc.TooltipRegister( - bele, - SCLoc(spreadsheet.Buttons[button].tooltip), - {} - ); - SocialCalc.ButtonRegister( - bele, - { - normalstyle: - "border:1px solid " + - scc.ISCButtonBorderNormal + - ";backgroundColor:" + - scc.ISCButtonBorderNormal + - ";", - hoverstyle: - "border:1px solid " + - scc.ISCButtonBorderHover + - ";backgroundColor:" + - scc.ISCButtonBorderNormal + - ";", - downstyle: - "border:1px solid " + - scc.ISCButtonBorderDown + - ";backgroundColor:" + - scc.ISCButtonDownBackground + - ";", - }, - { - MouseDown: SocialCalc.DoButtonCmd, - command: spreadsheet.Buttons[button].command, - } - ); - } - - // create formula bar - - spreadsheet.dummyFormulaDiv = document.createElement("div"); - spreadsheet.dummyFormulaDiv.style.height = - spreadsheet.formulabarheight + "px"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.dummyFormulaDiv); - - spreadsheet.formulabarDiv = document.createElement("div"); - spreadsheet.formulabarDiv.id = "formulabardiv"; - spreadsheet.formulabarDiv.style.height = - spreadsheet.formulabarheight + "px"; - spreadsheet.formulabarDiv.innerHTML = - ''; //' '; - //spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - var inputbox = new SocialCalc.InputBox( - spreadsheet.formulabarDiv.firstChild, - spreadsheet.editor - ); - - bele = document.createElement("img"); - bele.id = "testtest"; - bele.src = "/socialcalc/images/delete24.png"; - bele.style.verticalAlign = "middle"; - //bele.style.border = "1px solid #FFF"; - //bele.style.marginLeft = "4px"; - bele.style.display = "none"; - SocialCalc.ButtonRegister( - bele, - { normalstyle: "", hoverstyle: "", downstyle: "" }, - { MouseDown: SocialCalc.InputLineClearText } - ); - - // spreadsheet.formulabarDiv.appendChild(bele); - - /* - for (button in spreadsheet.formulabuttons) { - bele = document.createElement("img"); - bele.id = spreadsheet.idPrefix+button; - bele.src = spreadsheet.imagePrefix+spreadsheet.formulabuttons[button].image; - bele.style.verticalAlign = "middle"; - bele.style.border = "1px solid #FFF"; - bele.style.marginLeft = "4px"; - SocialCalc.TooltipRegister(bele, SCLoc(spreadsheet.formulabuttons[button].tooltip), {}); - SocialCalc.ButtonRegister(bele, - {normalstyle: "border:1px solid #FFF;backgroundColor:#FFF;", - hoverstyle: "border:1px solid #CCC;backgroundColor:#FFF;", - downstyle: "border:1px solid #000;backgroundColor:#FFF;"}, - {MouseDown: spreadsheet.formulabuttons[button].command}); - spreadsheet.formulabarDiv.appendChild(bele); - } - */ - // initialize tabs that need it - - for (i = 0; i < tabs.length; i++) { - // execute any tab-specific initialization code - if (tabs[i].oncreate) { - tabs[i].oncreate(spreadsheet, tabs[i].name); - } - } - - // create sheet view and others - if (!scc.doWorkBook) { - spreadsheet.nonviewheight = - spreadsheet.statuslineheight + - spreadsheet.spreadsheetDiv.firstChild.offsetHeight + - spreadsheet.spreadsheetDiv.lastChild.offsetHeight; - } else { - spreadsheet.nonviewheight = - 28 + - spreadsheet.sheetbarheight + - spreadsheet.spreadsheetDiv.firstChild.offsetHeight + - spreadsheet.spreadsheetDiv.lastChild.offsetHeight; - } - spreadsheet.viewheight = spreadsheet.height - spreadsheet.nonviewheight; - spreadsheet.editorDiv = spreadsheet.editor.CreateTableEditor( - spreadsheet.width, - spreadsheet.viewheight - ); - - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.editorDiv); - - for (vname in views) { - html = views[vname].html; - for (style in views[vname].replacements) { - html = html.replace( - views[vname].replacements[style].regex, - views[vname].replacements[style].replacement - ); - } - html = html.replace(/\%s\./g, "SocialCalc."); - html = html.replace(/\%id\./g, spreadsheet.idPrefix); - html = html.replace(/\%tbt\./g, spreadsheet.toolbartext); - html = html.replace(/\%img\./g, spreadsheet.imagePrefix); - v = document.createElement("div"); - SocialCalc.setStyles(v, views[vname].divStyle); - v.style.display = "none"; - v.style.width = spreadsheet.width + "px"; - v.style.height = spreadsheet.viewheight + "px"; - - html = SCLocSS(html); // localize with %loc!string!, etc. - - v.innerHTML = html; - spreadsheet.spreadsheetDiv.appendChild(v); - views[vname].element = v; - if (views[vname].oncreate) { - views[vname].oncreate(spreadsheet, views[vname]); - } - } - - views.sheet = { name: "sheet", element: spreadsheet.editorDiv }; - - // create statusline - - if (!scc.doWorkBook) { - spreadsheet.statuslineDiv = document.createElement("div"); - spreadsheet.statuslineDiv.style.cssText = spreadsheet.statuslineCSS; - // spreadsheet.statuslineDiv.style.height = spreadsheet.statuslineheight + "px"; // didn't take padding into account! - spreadsheet.statuslineDiv.style.height = - spreadsheet.statuslineheight - - (spreadsheet.statuslineDiv.style.paddingTop.slice(0, -2) - 0) - - (spreadsheet.statuslineDiv.style.paddingBottom.slice(0, -2) - 0) + - "px"; - spreadsheet.statuslineDiv.id = spreadsheet.idPrefix + "statusline"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.statuslineDiv); - } else { - SocialCalc.CreateSheetStatusBar(spreadsheet, scc); - } - - // done - refresh screen needed - - return; - }; - - SocialCalc.CreateSheetStatusBar = function (spreadsheet, scc) { - // create sheetbar - if (!scc.doWorkBook) { - return; - } - - // create a table with 1 row, containing 3 columns, 1 for sheetbar, 1 for separator, 1 for statusline - - spreadsheet.sheetstatusbarDiv = document.createElement("div"); - spreadsheet.sheetstatusbarDiv.style.height = - spreadsheet.sheetbarheight + 3 + "px"; - spreadsheet.sheetstatusbarDiv.style.backgroundColor = "#CCC"; - spreadsheet.sheetstatusbarDiv.id = spreadsheet.idPrefix + "sheetstatusbar"; - - spreadsheet.sheetbarDiv = document.createElement("div"); - //spreadsheet.sheetbarDiv.style.cssText = spreadsheet.sheetbarCSS; - spreadsheet.sheetbarDiv.id = spreadsheet.idPrefix + "sheetbar"; - - spreadsheet.statuslineDiv = document.createElement("div"); - spreadsheet.statuslineDiv.style.cssText = spreadsheet.statuslineCSS; - spreadsheet.statuslineDiv.id = spreadsheet.idPrefix + "statusline"; - - var table = document.createElement("table"); - spreadsheet.sheetstatusbartable = table; - table.cellSpacing = 0; - table.cellPadding = 0; - table.width = "100%"; - - var tbody = document.createElement("tbody"); - table.appendChild(tbody); - - var tr = document.createElement("tr"); - tbody.appendChild(tr); - var td = document.createElement("td"); - td.appendChild(spreadsheet.sheetbarDiv); - td.width = scc.SCSheetBarWidth; - tr.appendChild(td); - - td = document.createElement("td"); - td.innerHTML = " | "; - td.width = "1%"; - tr.appendChild(td); - - td = document.createElement("td"); - td.appendChild(spreadsheet.statuslineDiv); - tr.appendChild(td); - - spreadsheet.sheetstatusbarDiv.appendChild(table); - - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.sheetstatusbarDiv); - - spreadsheet.sheetstatusbarDiv.style.display = "none"; - }; - - // - // outstr = SocialCalc.LocalizeString(str) - // - // SocialCalc function to make localization easier. - // If str is "Text to localize", it returns - // SocialCalc.Constants.s_loc_text_to_localize if - // it exists, or else with just "Text to localize". - // Note that spaces are replaced with "_" and other special - // chars with "X" in the name of the constant (e.g., "A & B" - // would look for SocialCalc.Constants.s_loc_a_X_b. - // - - SocialCalc.LocalizeString = function (str) { - var cstr = SocialCalc.LocalizeStringList[str]; // found already this session? - if (!cstr) { - // no - look up - cstr = - SocialCalc.Constants[ - "s_loc_" + str.toLowerCase().replace(/\s/g, "_").replace(/\W/g, "X") - ] || str; - SocialCalc.LocalizeStringList[str] = cstr; - } - return cstr; - }; - - SocialCalc.LocalizeStringList = {}; // a list of strings to localize accumulated by the routine - - // - // outstr = SocialCalc.LocalizeSubstrings(str) - // - // SocialCalc function to make localization easier using %loc and %scc. - // - // Replaces sections of str with: - // %loc!Text to localize! - // with SocialCalc.Constants.s_loc_text_to_localize if - // it exists, or else with just "Text to localize". - // Note that spaces are replaced with "_" and other special - // chars with "X" in the name of the constant (e.g., %loc!A & B! - // would look for SocialCalc.Constants.s_loc_a_X_b. - // Uses SocialCalc.LocalizeString for this. - // - // Replaces sections of str with: - // %ssc!constant-name! - // with SocialCalc.Constants.constant-name. - // If the constant doesn't exist, throws and alert. - // - - SocialCalc.LocalizeSubstrings = function (str) { - var SCLoc = SocialCalc.LocalizeString; - - return str.replace(/%(loc|ssc)!(.*?)!/g, function (a, t, c) { - if (t == "ssc") { - return SocialCalc.Constants[c] || alert("Missing constant: " + c); - } else { - return SCLoc(c); - } - }); - }; - - // - // obj = GetSpreadsheetControlObject() - // - // Returns the current spreadsheet control object - // - - SocialCalc.GetSpreadsheetControlObject = function () { - var csco = SocialCalc.CurrentSpreadsheetControlObject; - if (csco) return csco; - - // throw ("No current SpreadsheetControl object."); - }; - - // - // SocialCalc.DoOnResize(spreadsheet) - // - // Processes an onResize event, setting the different views. - // - - SocialCalc.DoOnResize = function (spreadsheet) { - var v; - var views = spreadsheet.views; - - var needresize = spreadsheet.SizeSSDiv(); - if (!needresize) return; - - for (vname in views) { - v = views[vname].element; - v.style.width = spreadsheet.width + "px"; - v.style.height = spreadsheet.height - spreadsheet.nonviewheight + "px"; - } - - spreadsheet.editor.ResizeTableEditor( - spreadsheet.width, - spreadsheet.height - spreadsheet.nonviewheight - ); - }; - - // - // resized = SocialCalc.SizeSSDiv(spreadsheet) - // - // Figures out a reasonable size for the spreadsheet, given any requested values and viewport. - // Sets ssdiv to that. - // Return true if different than existing values. - // - - SocialCalc.SizeSSDiv = function (spreadsheet) { - var sizes, pos, resized, nodestyle, newval; - var fudgefactorX = 10; // for IE - var fudgefactorY = 10; - - resized = false; - - sizes = SocialCalc.GetViewportInfo(); - pos = SocialCalc.GetElementPosition(spreadsheet.parentNode); - pos.bottom = 0; - pos.right = 0; - - nodestyle = spreadsheet.parentNode.style; - - if (nodestyle.marginTop) { - pos.top += nodestyle.marginTop.slice(0, -2) - 0; - } - if (nodestyle.marginBottom) { - pos.bottom += nodestyle.marginBottom.slice(0, -2) - 0; - } - if (nodestyle.marginLeft) { - pos.left += nodestyle.marginLeft.slice(0, -2) - 0; - } - if (nodestyle.marginRight) { - pos.right += nodestyle.marginRight.slice(0, -2) - 0; - } - - newval = - spreadsheet.requestedHeight || - sizes.height - - (pos.top + pos.bottom + fudgefactorY) - - (spreadsheet.requestedSpaceBelow || 0); - if (spreadsheet.height != newval) { - spreadsheet.height = newval; - spreadsheet.spreadsheetDiv.style.height = newval + "px"; - resized = true; - } - newval = - spreadsheet.requestedWidth || - sizes.width - (pos.left + pos.right + fudgefactorX) || - 700; - if (spreadsheet.width != newval) { - spreadsheet.width = newval; - spreadsheet.spreadsheetDiv.style.width = newval + "px"; - resized = true; - } - - return resized; - }; - - // - // SocialCalc.SetTab(obj) - // - // The obj argument is either a string with the tab name or a DOM element with an ID - // - - SocialCalc.SetTab = function (obj) { - var newtab, tname, newtabnum, newview, i, vname, ele; - var menutabs = {}; - var tools = {}; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - if (typeof obj == "string") { - newtab = obj; - } else { - newtab = obj.id.slice(spreadsheet.idPrefix.length, -3); - } - - if ( - spreadsheet.editor.busy && // if busy and switching from "sheet", ignore - (!tabs[spreadsheet.currentTab].view || - tabs[spreadsheet.currentTab].view == "sheet") - ) { - for (i = 0; i < tabs.length; i++) { - if (tabs[i].name == newtab && tabs[i].view && tabs[i].view != "sheet") { - return; - } - } - } - - if (spreadsheet.tabs[spreadsheet.currentTab].onunclick) { - spreadsheet.tabs[spreadsheet.currentTab].onunclick( - spreadsheet, - spreadsheet.tabs[spreadsheet.currentTab].name - ); - } - - for (i = 0; i < tabs.length; i++) { - tname = tabs[i].name; - menutabs[tname] = document.getElementById( - spreadsheet.idPrefix + tname + "tab" - ); - tools[tname] = document.getElementById( - spreadsheet.idPrefix + tname + "tools" - ); - if (tname == newtab) { - newtabnum = i; - tools[tname].style.display = "block"; - menutabs[tname].style.cssText = spreadsheet.tabselectedCSS; - } else { - tools[tname].style.display = "none"; - menutabs[tname].style.cssText = spreadsheet.tabplainCSS; - } - } - - spreadsheet.currentTab = newtabnum; - - if (tabs[newtabnum].onclick) { - tabs[newtabnum].onclick(spreadsheet, newtab); - } - - for (vname in views) { - if ( - (!tabs[newtabnum].view && vname == "sheet") || - tabs[newtabnum].view == vname - ) { - views[vname].element.style.display = "block"; - newview = vname; - } else { - views[vname].element.style.display = "none"; - } - } - - if (tabs[newtabnum].onclickFocus) { - ele = tabs[newtabnum].onclickFocus; - if (typeof ele == "string") { - ele = document.getElementById(spreadsheet.idPrefix + ele); - ele.focus(); - } - SocialCalc.CmdGotFocus(ele); - } else { - SocialCalc.KeyboardFocus(); - } - - if (views[newview].needsresize && views[newview].onresize) { - views[newview].needsresize = false; - views[newview].onresize(spreadsheet, views[newview]); - } - - if (newview == "sheet") { - spreadsheet.statuslineDiv.style.display = "block"; - spreadsheet.editor.ScheduleRender(); - } else { - spreadsheet.statuslineDiv.style.display = "none"; - } - - return; - }; - - // - // SocialCalc.SpreadsheetControlStatuslineCallback - // - - SocialCalc.SpreadsheetControlStatuslineCallback = function ( - editor, - status, - arg, - params - ) { - var rele1, rele2; - - var ele = document.getElementById(params.statuslineid); - - if (ele) { - ele.innerHTML = editor.GetStatuslineString(status, arg, params); - } - - switch (status) { - case "cmdendnorender": - case "calcfinished": - case "doneposcalc": - rele1 = document.getElementById(params.recalcid1); - rele2 = document.getElementById(params.recalcid2); - if (!rele1 || !rele2) break; - if (editor.context.sheetobj.attribs.needsrecalc == "yes") { - rele1.style.display = "inline"; - rele2.style.display = "inline"; - } else { - rele1.style.display = "none"; - rele2.style.display = "none"; - } - break; - - default: - break; - } - }; - - // - // SocialCalc.UpdateSortRangeProposal(editor) - // - // Updates sort range proposed in the UI in element idPrefix+sortlist - // - - SocialCalc.UpdateSortRangeProposal = function (editor) { - var ele = document.getElementById( - SocialCalc.GetSpreadsheetControlObject().idPrefix + "sortlist" - ); - if (editor.range.hasrange) { - ele.options[0].text = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - ele.options[0].text = SocialCalc.LocalizeString("[select range]"); - } - }; - - // - // SocialCalc.LoadColumnChoosers(spreadsheet) - // - // Updates list of columns for choosing which to sort for Major, Minor, and Last sort - // - - SocialCalc.LoadColumnChoosers = function (spreadsheet) { - var SCLoc = SocialCalc.LocalizeString; - - var sortrange, nrange, rparts, col, colname, sele, oldindex; - - if (spreadsheet.sortrange && spreadsheet.sortrange.indexOf(":") == -1) { - // sortrange is a named range - nrange = SocialCalc.Formula.LookupName( - spreadsheet.sheet, - spreadsheet.sortrange || "" - ); - if (nrange.type == "range") { - rparts = nrange.value.match(/^(.*)\|(.*)\|$/); - sortrange = rparts[1] + ":" + rparts[2]; - } else { - sortrange = "A1:A1"; - } - } else { - sortrange = spreadsheet.sortrange; - } - var range = SocialCalc.ParseRange(sortrange); - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col = range.cr1.col; col <= range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option( - SCLoc("Column ") + colname, - colname - ); - } - sele.selectedIndex = - oldindex > 1 && oldindex <= range.cr2.col - range.cr1.col + 1 - ? oldindex - : 1; // restore what was there if reasonable - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col = range.cr1.col; col <= range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = - oldindex > 0 && oldindex <= range.cr2.col - range.cr1.col + 1 - ? oldindex - : 0; // default to [none] - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col = range.cr1.col; col <= range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = - oldindex > 0 && oldindex <= range.cr2.col - range.cr1.col + 1 - ? oldindex - : 0; // default to [none] - }; - - // - // SocialCalc.CmdGotFocus(obj) - // - // Sets SocialCalc.Keyboard.passThru: obj should be element with focus or "true" - // - - SocialCalc.CmdGotFocus = function (obj) { - SocialCalc.Keyboard.passThru = obj; - }; - - // - // SocialCalc.DoButtonCmd(e, buttoninfo, bobj) - // - - SocialCalc.DoButtonCmd = function (e, buttoninfo, bobj) { - SocialCalc.DoCmd(bobj.element, bobj.functionobj.command); - }; - - // - // SocialCalc.DoCmd(obj, which) - // - // xxx - // - - SocialCalc.DoCmd = function (obj, which) { - var combostr, - sstr, - cl, - i, - clele, - slist, - slistele, - str, - sele, - rele, - lele, - ele, - sortrange, - nrange, - rparts; - var sheet, cell, color, bgcolor, defaultcolor, defaultbgcolor; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - switch (which) { - case "undo": - spreadsheet.ExecuteCommand("undo", ""); - break; - - case "redo": - spreadsheet.ExecuteCommand("redo", ""); - break; - - case "fill-rowcolstuff": - case "fill-text": - cl = which.substring(5); - clele = document.getElementById(spreadsheet.idPrefix + cl + "list"); - clele.length = 0; - for (i = 0; i < SocialCalc.SpreadsheetCmdTable[cl].length; i++) { - clele.options[i] = new Option( - SocialCalc.SpreadsheetCmdTable[cl][i].t - ); - } - which = "changed-" + cl; // fall through to changed code - - case "changed-rowcolstuff": - case "changed-text": - cl = which.substring(8); - clele = document.getElementById(spreadsheet.idPrefix + cl + "list"); - slist = - SocialCalc.SpreadsheetCmdTable.slists[ - SocialCalc.SpreadsheetCmdTable[cl][clele.selectedIndex].s - ]; // get sList for this command - slistele = document.getElementById(spreadsheet.idPrefix + cl + "slist"); - slistele.length = 0; // reset - for (i = 0; i < (slist.length || 0); i++) { - slistele.options[i] = new Option(slist[i].t, slist[i].s); - } - return; // nothing else to do - - case "ok-rowcolstuff": - case "ok-text": - cl = which.substring(3); - clele = document.getElementById(spreadsheet.idPrefix + cl + "list"); - slistele = document.getElementById(spreadsheet.idPrefix + cl + "slist"); - combostr = SocialCalc.SpreadsheetCmdTable[cl][clele.selectedIndex].c; - sstr = slistele[slistele.selectedIndex].value; - SocialCalc.SpreadsheetControlExecuteCommand(obj, combostr, sstr); - break; - - case "ok-setsort": - lele = document.getElementById(spreadsheet.idPrefix + "sortlist"); - if (lele.selectedIndex == 0) { - if (editor.range.hasrange) { - spreadsheet.sortrange = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - spreadsheet.sortrange = - editor.ecell.coord + ":" + editor.ecell.coord; - } - } else { - spreadsheet.sortrange = lele.options[lele.selectedIndex].value; - } - ele = document.getElementById(spreadsheet.idPrefix + "sortbutton"); - ele.value = SocialCalc.LocalizeString("Sort ") + spreadsheet.sortrange; - ele.style.visibility = "visible"; - SocialCalc.LoadColumnChoosers(spreadsheet); - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - return; - - case "dosort": - if (spreadsheet.sortrange && spreadsheet.sortrange.indexOf(":") == -1) { - // sortrange is a named range - nrange = SocialCalc.Formula.LookupName( - spreadsheet.sheet, - spreadsheet.sortrange || "" - ); - if (nrange.type != "range") return; - rparts = nrange.value.match(/^(.*)\|(.*)\|$/); - sortrange = rparts[1] + ":" + rparts[2]; - } else { - sortrange = spreadsheet.sortrange; - } - if (sortrange == "A1:A1") return; - str = "sort " + sortrange + " "; - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - rele = document.getElementById(spreadsheet.idPrefix + "majorsortup"); - str += - sele.options[sele.selectedIndex].value + - (rele.checked ? " up" : " down"); - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "minorsortup"); - str += - " " + - sele.options[sele.selectedIndex].value + - (rele.checked ? " up" : " down"); - } - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "lastsortup"); - str += - " " + - sele.options[sele.selectedIndex].value + - (rele.checked ? " up" : " down"); - } - spreadsheet.ExecuteCommand(str, ""); - break; - - case "merge": - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - if (editor.range.hasrange) { - // set ecell to upper left - editor.MoveECell( - SocialCalc.crToCoord(editor.range.left, editor.range.top) - ); - editor.RangeRemove(); - } - break; - - case "movefrom": - if (editor.range2.hasrange) { - // toggle if already there - spreadsheet.context.cursorsuffix = ""; - editor.Range2Remove(); - spreadsheet.ExecuteCommand("redisplay", ""); - } else if (editor.range.hasrange) { - // set range2 to range or one cell - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.MoveECell( - SocialCalc.crToCoord(editor.range.left, editor.range.top) - ); - } else { - editor.range2.top = editor.ecell.row; - editor.range2.right = editor.ecell.col; - editor.range2.bottom = editor.ecell.row; - editor.range2.left = editor.ecell.col; - editor.range2.hasrange = true; - } - str = editor.range2.hasrange ? "" : "off"; - ele = document.getElementById(spreadsheet.idPrefix + "button_movefrom"); - ele.src = spreadsheet.imagePrefix + "movefrom" + str + ".gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_movepaste" - ); - ele.src = spreadsheet.imagePrefix + "movepaste" + str + ".gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_moveinsert" - ); - ele.src = spreadsheet.imagePrefix + "moveinsert" + str + ".gif"; - if (editor.range2.hasrange) editor.RangeRemove(); - break; - - case "movepaste": - case "moveinsert": - if (editor.range2.hasrange) { - spreadsheet.context.cursorsuffix = ""; - combostr = - which + - " " + - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + - ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) + - " " + - editor.ecell.coord; - spreadsheet.ExecuteCommand(combostr, ""); - editor.Range2Remove(); - ele = document.getElementById( - spreadsheet.idPrefix + "button_movefrom" - ); - ele.src = spreadsheet.imagePrefix + "movefromoff.gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_movepaste" - ); - ele.src = spreadsheet.imagePrefix + "movepasteoff.gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_moveinsert" - ); - ele.src = spreadsheet.imagePrefix + "moveinsertoff.gif"; - } - break; - - case "swapcolors": - sheet = spreadsheet.sheet; - cell = sheet.GetAssuredCell(editor.ecell.coord); - defaultcolor = sheet.attribs.defaultcolor - ? sheet.colors[sheet.attribs.defaultcolor] - : "rgb(0,0,0)"; - defaultbgcolor = sheet.attribs.defaultbgcolor - ? sheet.colors[sheet.attribs.defaultbgcolor] - : "rgb(255,255,255)"; - color = cell.color ? sheet.colors[cell.color] : defaultcolor; // get color - if (color == defaultbgcolor) color = ""; // going to swap, so if same as background default, use default - bgcolor = cell.bgcolor ? sheet.colors[cell.bgcolor] : defaultbgcolor; - if (bgcolor == defaultcolor) bgcolor = ""; // going to swap, so if same as foreground default, use default - spreadsheet.ExecuteCommand( - "set %C color " + bgcolor + "%Nset %C bgcolor " + color, - "" - ); - break; - - default: - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - break; - } - - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - }; - - SocialCalc.SpreadsheetCmdLookup = { - copy: "copy %C all", - cut: "cut %C all", - paste: "paste %C all", - pasteformats: "paste %C formats", - delete: "erase %C formulas", - filldown: "filldown %C all", - fillright: "fillright %C all", - erase: "erase %C all", - borderon: "set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S", - borderoff: "set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S", - merge: "merge %C", - unmerge: "unmerge %C", - "align-left": "set %C cellformat left", - "align-center": "set %C cellformat center", - "align-right": "set %C cellformat right", - "align-default": "set %C cellformat", - insertrow: "insertrow %C", - insertcol: "insertcol %C", - deleterow: "deleterow %C", - deletecol: "deletecol %C", - undo: "undo", - redo: "redo", - recalc: "recalc", - }; - - SocialCalc.SpreadsheetCmdSLookup = { - borderon: "1px solid rgb(0,0,0)", - borderoff: "", - }; - - /******* NO LONGER USED - -SocialCalc.SpreadsheetCmdTable = { - cmd: [ - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"}, - {t:"Copy", s:"all", c:"copy %C %S"}, - {t:"Cut", s:"all", c:"cut %C %S"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Merge Cells", s:"none", c:"merge %C"}, - {t:"Unmerge", s:"none", c:"unmerge %C"}, - {t:"Sort", s:"sortcol", c:"sort %R %S"}, - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Cell Borders", s:"borderOnOff", c:"set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S"}, - {t:"Column Width", s:"colWidths", c:"set %W width %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"}, - {t:"Default Column Width", s:"colWidths", c:"set sheet defaultcolwidth %S"} - ], - rowcolstuff: [ - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"} - ], - text: [ - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Text Format", s:"tvf", c:"set %C textvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Text Format", s:"tvf", c:"set sheet defaulttextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"} - ], - slists: { - "colors": [ - {t:"Default", s:""}, - {t:"Black", s:"rgb(0,0,0)"}, - {t:"Dark Gray", s:"rgb(102,102,102)"}, // #666 - {t:"Gray", s:"rgb(204,204,204)"}, // #CCC - {t:"White", s:"rgb(255,255,255)"}, - {t:"Red", s:"rgb(255,0,0)"}, - {t:"Dark Red", s:"rgb(153,0,0)"}, - {t:"Orange", s:"rgb(255,153,0)"}, - {t:"Yellow", s:"rgb(255,255,0)"}, - {t:"Light Yellow", s:"rgb(255,255,204)"}, - {t:"Green", s:"rgb(0,255,0)"}, - {t:"Dark Green", s:"rgb(0,153,0)"}, - {t:"Blue", s:"rgb(0,0,255)"}, - {t:"Dark Blue", s:"rgb(0,0,153)"}, - {t:"Light Blue", s:"rgb(204,204,255)"} - ], - "fonts": [ // style weight size family - {t:"Default", s:""}, - {t:"Bold", s:"normal bold * *"}, - {t:"Italic", s:"italic normal * *"}, - {t:"Small", s:"* small *"}, - {t:"Medium", s:"* medium *"}, - {t:"Large", s:"* large *"}, - {t:"Bold Small", s:"normal bold small *"}, - {t:"Bold Medium", s:"normal bold medium *"}, - {t:"Bold Large", s:"normal bold large *"} - ], - "cellformat": [ - {t:"Default", s:""}, - {t:"Left", s:"left"}, - {t:"Right", s:"right"}, - {t:"Center", s:"center"} - ], - "borderOnOff": [ - {t:"On", s:"1px solid rgb(0,0,0)"}, - {t:"Off", s:""} - ], - "colWidths": [ - {t:"Default", s:""}, - {t:"20", s:"20"}, - {t:"40", s:"40"}, - {t:"60", s:"60"}, - {t:"80", s:"80"}, - {t:"100", s:"100"}, - {t:"120", s:"120"}, - {t:"140", s:"140"}, - {t:"160", s:"160"}, - {t:"180", s:"180"}, - {t:"200", s:"200"}, - {t:"220", s:"220"}, - {t:"240", s:"240"}, - {t:"260", s:"260"}, - {t:"280", s:"280"}, - {t:"300", s:"300"} - ], - "ntvf": [ - {t:"Default", s:""}, - {t:"1234", s:"0"}, - {t:"1,234", s:"#,##0"}, - {t:"1,234.5", s:"#,##0.0"}, - {t:"1,234.56", s:"#,##0.00"}, - {t:"1,234.567", s:"#,##0.000"}, - {t:"1,234%", s:"#,##0%"}, - {t:"1,234.5%", s:"#,##0.0%"}, - {t:"(1,234)", s:"#,##0_);(#,##0)"}, - {t:"(1,234.5)", s:"#,##0.0_);(#,##0.0)"}, - {t:"(1,234.56)", s:"#,##0.00_);(#,##0.00)"}, - {t:"00", s:"00"}, - {t:"000", s:"000"}, - {t:"0000", s:"0000"}, - {t:"$1,234.56", s:"$#,##0.00"}, - {t:"2006-01-04", s:"yyyy-mm-dd"}, - {t:"01:23:45", s:"hh:mm:ss"}, - {t:"2006-01-04 01:23:45", s:"yyyy-mm-dd hh:mm:ss"}, - {t:"Hidden", s:"hidden"} - ], - "tvf": [ - {t:"Default", s:""}, - {t:"Automatic", s:"general"}, - {t:"Plain Text", s:"text-plain"}, - {t:"HTML", s:"text-html"}, - {t:"Wiki", s:"text-wiki"}, - {t:"Hidden", s:"hidden"} - ], - "ffal": [ // Formulas, Formats, All - {t:"All", s:"all"}, - {t:"Contents", s:"formulas"}, - {t:"Formats", s:"formats"} - ], - "all": [ // All - {t:"All", s:"all"} - ], - "rowcol": [ - {t:"Row", s:"row"}, - {t:"Column", s:"col"} - ], - "sortcol": [ - {t:"A up", s:"A up"}, - {t:"B up", s:"B up"}, - {t:"C up", s:"C up"}, - {t:"A down", s:"A down"}, - {t:"B down", s:"B down"}, - {t:"C down", s:"C down"}, - {t:"A, B, C up", s:"A up B up C up"} - ], - "none": [ // nothing - {t:" ", s:" "} - ] - } - } -*********/ - - // - // SocialCalc.SpreadsheetControlExecuteCommand(obj, combostr, sstr) - // - // xxx - // - - SocialCalc.SpreadsheetControlExecuteCommand = function (obj, combostr, sstr) { - var i, commands; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var eobj = spreadsheet.editor; - - var str = {}; - str.P = "%"; - str.N = "\n"; - if (eobj.range.hasrange) { - str.R = - SocialCalc.crToCoord(eobj.range.left, eobj.range.top) + - ":" + - SocialCalc.crToCoord(eobj.range.right, eobj.range.bottom); - str.C = str.R; - str.W = - SocialCalc.rcColname(eobj.range.left) + - ":" + - SocialCalc.rcColname(eobj.range.right); - } else { - str.C = eobj.ecell.coord; - str.R = eobj.ecell.coord + ":" + eobj.ecell.coord; - str.W = SocialCalc.rcColname(SocialCalc.coordToCr(eobj.ecell.coord).col); - } - str.S = sstr; - combostr = combostr.replace(/%C/g, str.C); - combostr = combostr.replace(/%R/g, str.R); - combostr = combostr.replace(/%N/g, str.N); - combostr = combostr.replace(/%S/g, str.S); - combostr = combostr.replace(/%W/g, str.W); - combostr = combostr.replace(/%P/g, str.P); - - eobj.EditorScheduleSheetCommands(combostr, true, false); - }; - - // - // result = SocialCalc.SpreadsheetControlCreateSheetHTML(spreadsheet) - // - // Returns the HTML representation of the whole spreadsheet - // - - SocialCalc.SpreadsheetControlCreateSheetHTML = function (spreadsheet) { - var context, div, ele; - - var result = ""; - - context = new SocialCalc.RenderContext(spreadsheet.sheet); - div = document.createElement("div"); - ele = context.RenderSheet(null, { type: "html" }); - div.appendChild(ele); - context = undefined; - result = div.innerHTML; - ele = undefined; - div = undefined; - return result; - }; - - // - // result = SocialCalc.SpreadsheetControlCreateCellHTML(spreadsheet, coord, linkstyle) - // - // Returns the HTML representation of a cell. Blank is "", not " ". - // - - SocialCalc.SpreadsheetControlCreateCellHTML = function ( - spreadsheet, - coord, - linkstyle - ) { - var result = ""; - var cell = spreadsheet.sheet.cells[coord]; - - if (!cell) return ""; - - if (cell.displaystring == undefined) { - result = SocialCalc.FormatValueForDisplay( - spreadsheet.sheet, - cell.datavalue, - coord, - linkstyle || spreadsheet.context.defaultHTMLlinkstyle - ); - } else { - result = cell.displaystring; - } - - if (result == " ") result = ""; - - return result; - }; - - // - // result = SocialCalc.SpreadsheetControlCreateCellHTMLSave(spreadsheet, range, linkstyle) - // - // Returns the HTML representation of a range of cells, or the whole sheet if range is null. - // The form is: - // version:1.0 - // coord:cell-HTML - // coord:cell-HTML - // ... - // - // Empty cells are skipped. The cell-HTML is encoded with ":"=>"\c", newline=>"\n", and "\"=>"\b". - // - - SocialCalc.SpreadsheetControlCreateCellHTMLSave = function ( - spreadsheet, - range, - linkstyle - ) { - var cr1, cr2, row, col, coord, cell, cellHTML; - var result = []; - var prange; - - if (range) { - prange = SocialCalc.ParseRange(range); - } else { - prange = { - cr1: { row: 1, col: 1 }, - cr2: { - row: spreadsheet.sheet.attribs.lastrow, - col: spreadsheet.sheet.attribs.lastcol, - }, - }; - } - cr1 = prange.cr1; - cr2 = prange.cr2; - - result.push("version:1.0"); - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - coord = SocialCalc.crToCoord(col, row); - cell = spreadsheet.sheet.cells[coord]; - if (!cell) continue; - if (cell.displaystring == undefined) { - cellHTML = SocialCalc.FormatValueForDisplay( - spreadsheet.sheet, - cell.datavalue, - coord, - linkstyle || spreadsheet.context.defaultHTMLlinkstyle - ); - } else { - cellHTML = cell.displaystring; - } - if (cellHTML == " ") continue; - result.push(coord + ":" + SocialCalc.encodeForSave(cellHTML)); - } - } - - result.push(""); // one extra to get extra \n - return result.join("\n"); - }; - - // - // Formula Bar Button Routines - // - - SocialCalc.SpreadsheetControl.DoFunctionList = function () { - var i, cname, str, f, ele; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var fcl = scc.function_classlist; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "function"; - - ele = document.getElementById(idp + "dialog"); - if (ele) return; // already have one - - scf.FillFunctionInfo(); - - str = - '
%loc!Category!
' + - '
  %loc!Functions!
' + - '
' + - '
' + - SocialCalc.SpreadsheetControl.GetFunctionInfoStr( - scf.FunctionClasses[fcl[0]].items[0] - ) + - "
" + - '
' + - ' ' + - '
' + - "
"; - - var main = document.createElement("div"); - main.id = idp + "dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - str = - '' + - '" + - '
' + - " %loc!Function List!" + - " X 
' + - '
' + - str + - "
"; - - str = SocialCalc.LocalizeSubstrings(str); - - main.innerHTML = str; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp + "name"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - //!!! need to do keyboard handling: if esc, hide; if All, letter scrolls to there - }; - - SocialCalc.SpreadsheetControl.GetFunctionNamesStr = function (cname) { - var i, f; - var scf = SocialCalc.Formula; - var str = ""; - - f = scf.FunctionClasses[cname]; - for (i = 0; i < f.items.length; i++) { - str += - '"; - } - - return str; - }; - - SocialCalc.SpreadsheetControl.FillFunctionNames = function (cname, ele) { - var i, f; - var scf = SocialCalc.Formula; - - ele.length = 0; - f = scf.FunctionClasses[cname]; - for (i = 0; i < f.items.length; i++) { - ele.options[i] = new Option(f.items[i], f.items[i]); - if (i == 0) { - ele.options[i].selected = true; - } - } - }; - - SocialCalc.SpreadsheetControl.GetFunctionInfoStr = function (fname) { - var scf = SocialCalc.Formula; - var f = scf.FunctionList[fname]; - var scsc = SocialCalc.special_chars; - - var str = - "" + fname + "(" + scsc(scf.FunctionArgString(fname)) + ")
"; - str += scsc(f[3]); - - return str; - }; - - SocialCalc.SpreadsheetControl.FunctionClassChosen = function (cname) { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "function"; - var scf = SocialCalc.Formula; - - SocialCalc.SpreadsheetControl.FillFunctionNames( - cname, - document.getElementById(idp + "name") - ); - - SocialCalc.SpreadsheetControl.FunctionChosen( - scf.FunctionClasses[cname].items[0] - ); - }; - - SocialCalc.SpreadsheetControl.FunctionChosen = function (fname) { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "function"; - - document.getElementById(idp + "desc").innerHTML = - SocialCalc.SpreadsheetControl.GetFunctionInfoStr(fname); - }; - - SocialCalc.SpreadsheetControl.HideFunctions = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById(spreadsheet.idPrefix + "functiondialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.SpreadsheetControl.DoFunctionPaste = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var ele = document.getElementById(spreadsheet.idPrefix + "functionname"); - var mele = document.getElementById( - spreadsheet.idPrefix + "multilinetextarea" - ); - - var text = ele.value + "("; - - SocialCalc.SpreadsheetControl.HideFunctions(); - - if (mele) { - // multi-line editing is in progress - mele.value += text; - mele.focus(); - SocialCalc.CmdGotFocus(mele); - } else { - editor.EditorAddToInput(text, "="); - } - }; - - SocialCalc.SpreadsheetControl.DoMultiline = function () { - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var str, ele, text; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "multiline"; - - ele = document.getElementById(idp + "dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - text = SocialCalc.special_chars(text); - - str = - '" + - '
' + - SCLocSS( - ' ' + - ' ' + - '
' + - "" - ); - - var main = document.createElement("div"); - main.id = idp + "dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - SCLocSS(" %loc!Multi-line Input Box!") + - " X 
' + - '
' + - str + - "
"; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp + "textarea"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - //!!! need to do keyboard handling: if esc, hide? - }; - - SocialCalc.SpreadsheetControl.HideMultiline = function () { - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix + "multilinedialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - }; - - SocialCalc.SpreadsheetControl.DoMultilineClear = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById( - spreadsheet.idPrefix + "multilinetextarea" - ); - - ele.value = ""; - ele.focus(); - }; - - SocialCalc.SpreadsheetControl.DoMultilinePaste = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var ele = document.getElementById( - spreadsheet.idPrefix + "multilinetextarea" - ); - - var text = ele.value; - - SocialCalc.SpreadsheetControl.HideMultiline(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - editor.EditorSaveEdit(text); - }; - - SocialCalc.SpreadsheetControl.DoLink = function () { - var SCLoc = SocialCalc.LocalizeString; - - var str, ele, text, cell, setformat, popup; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "link"; - - ele = document.getElementById(idp + "dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - if (text.charAt(0) == "'") { - text = text.slice(1); - } - - var parts = SocialCalc.ParseCellLinkText(text); - - text = SocialCalc.special_chars(text); - - cell = spreadsheet.sheet.cells[editor.ecell.coord]; - if (!cell || !cell.textvalueformat) { - // set to link format, but don't override - setformat = " checked"; - } else { - setformat = ""; - } - - popup = parts.newwin ? " checked" : ""; - - str = - '
' + - '' + - SCLoc("Description") + - "
" + - '
' + - '' + - SCLoc("URL") + - "
" + - '
'; - if (SocialCalc.Callbacks.MakePageLink) { - // only show if handling pagenames here - str += - '' + - SCLoc("Page Name") + - "
" + - '
' + - '' + - SCLoc("Workspace") + - "
" + - '
'; - } - str += SocialCalc.LocalizeSubstrings( - ' " + - '%loc!Set to Link format!
' + - ' " + - '%loc!Show in new browser window!' + - "
" + - '
' + - ' ' + - ' ' + - '
' + - "" - ); - - var main = document.createElement("div"); - main.id = idp + "dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - SCLoc("Link Input Box") + - " X 
' + - '
' + - str + - "
"; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp + "url"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - //!!! need to do keyboard handling: if esc, hide? - }; - - SocialCalc.SpreadsheetControl.HideLink = function () { - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix + "linkdialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - }; - - SocialCalc.SpreadsheetControl.DoLinkClear = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - document.getElementById(spreadsheet.idPrefix + "linkdesc").value = ""; - document.getElementById(spreadsheet.idPrefix + "linkpagename").value = ""; - document.getElementById(spreadsheet.idPrefix + "linkworkspace").value = ""; - - var ele = document.getElementById(spreadsheet.idPrefix + "linkurl"); - ele.value = ""; - ele.focus(); - }; - - SocialCalc.SpreadsheetControl.DoLinkPaste = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var descele = document.getElementById(spreadsheet.idPrefix + "linkdesc"); - var urlele = document.getElementById(spreadsheet.idPrefix + "linkurl"); - var pagenameele = document.getElementById( - spreadsheet.idPrefix + "linkpagename" - ); - var workspaceele = document.getElementById( - spreadsheet.idPrefix + "linkworkspace" - ); - var formatele = document.getElementById( - spreadsheet.idPrefix + "linkformat" - ); - var popupele = document.getElementById(spreadsheet.idPrefix + "linkpopup"); - - var text = ""; - - var ltsym, gtsym, obsym, cbsym; - - if (popupele.checked) { - ltsym = "<<"; - gtsym = ">>"; - obsym = "[["; - cbsym = "]]"; - } else { - ltsym = "<"; - gtsym = ">"; - obsym = "["; - cbsym = "]"; - } - - if (pagenameele && pagenameele.value) { - if (workspaceele.value) { - text = - descele.value + - "{" + - workspaceele.value + - obsym + - pagenameele.value + - cbsym + - "}"; - } else { - text = descele.value + obsym + pagenameele.value + cbsym; - } - } else { - text = descele.value + ltsym + urlele.value + gtsym; - } - - SocialCalc.SpreadsheetControl.HideLink(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - if (formatele.checked) { - SocialCalc.SpreadsheetControlExecuteCommand( - null, - "set %C textvalueformat text-link", - "" - ); - } - - editor.EditorSaveEdit(text); - }; - - SocialCalc.SpreadsheetControl.DoSum = function () { - var cmd, cell, row, col, sel, cr, foundvalue; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var sheet = editor.context.sheetobj; - - if (editor.range.hasrange) { - sel = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - cmd = - "set " + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom + 1) + - " formula sum(" + - sel + - ")"; - } else { - row = editor.ecell.row - 1; - col = editor.ecell.col; - if (row <= 1) { - cmd = "set " + editor.ecell.coord + " constant e#REF! 0 #REF!"; - } else { - foundvalue = false; - while (row > 0) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (!cell.datatype || cell.datatype == "t") { - if (foundvalue) { - row++; - break; - } - } else { - foundvalue = true; - } - row--; - } - cmd = - "set " + - editor.ecell.coord + - " formula sum(" + - SocialCalc.crToCoord(col, row) + - ":" + - SocialCalc.crToCoord(col, editor.ecell.row - 1) + - ")"; - } - } - - editor.EditorScheduleSheetCommands(cmd, true, false); - }; - - // - // TAB Routines - // - - // Sort - - SocialCalc.SpreadsheetControlSortOnclick = function (s, t) { - var name, i; - var namelist = []; - var nl = document.getElementById(s.idPrefix + "sortlist"); - SocialCalc.LoadColumnChoosers(s); - s.editor.RangeChangeCallback.sort = SocialCalc.UpdateSortRangeProposal; - - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - nl.options[0] = new Option(SocialCalc.LocalizeString("[select range]")); - for (i = 0; i < namelist.length; i++) { - name = namelist[i]; - nl.options[i + 1] = new Option(name, name); - if (name == s.sortrange) { - nl.options[i + 1].selected = true; - } - } - if (s.sortrange == "") { - nl.options[0].selected = true; - } - - SocialCalc.UpdateSortRangeProposal(s.editor); - SocialCalc.KeyboardFocus(); - return; - }; - - SocialCalc.SpreadsheetControlSortSave = function (editor, setting) { - // Format is: - // sort:sortrange:major:up/down:minor:up/down:last:up/down - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var str, sele, rele; - - str = "sort:" + SocialCalc.encodeForSave(spreadsheet.sortrange) + ":"; - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - rele = document.getElementById(spreadsheet.idPrefix + "majorsortup"); - str += sele.selectedIndex + (rele.checked ? ":up" : ":down"); - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "minorsortup"); - str += ":" + sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } else { - str += "::"; - } - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "lastsortup"); - str += ":" + sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } else { - str += "::"; - } - return str + "\n"; - }; - - SocialCalc.SpreadsheetControlSortLoad = function ( - editor, - setting, - line, - flags - ) { - var parts, ele; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - parts = line.split(":"); - spreadsheet.sortrange = SocialCalc.decodeFromSave(parts[1]); - ele = document.getElementById(spreadsheet.idPrefix + "sortbutton"); - if (spreadsheet.sortrange) { - ele.value = SocialCalc.LocalizeString("Sort ") + spreadsheet.sortrange; - ele.style.visibility = "visible"; - } else { - ele.style.visibility = "hidden"; - } - SocialCalc.LoadColumnChoosers(spreadsheet); - - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - sele.selectedIndex = parts[2] - 0; - document.getElementById( - spreadsheet.idPrefix + "majorsort" + parts[3] - ).checked = true; - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - if (parts[4]) { - sele.selectedIndex = parts[4] - 0; - document.getElementById( - spreadsheet.idPrefix + "minorsort" + parts[5] - ).checked = true; - } else { - sele.selectedIndex = 0; - document.getElementById( - spreadsheet.idPrefix + "minorsortup" - ).checked = true; - } - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - if (parts[6]) { - sele.selectedIndex = parts[6] - 0; - document.getElementById( - spreadsheet.idPrefix + "lastsort" + parts[7] - ).checked = true; - } else { - sele.selectedIndex = 0; - document.getElementById( - spreadsheet.idPrefix + "lastsortup" - ).checked = true; - } - - return true; - }; - - // Comment - - SocialCalc.SpreadsheetControlCommentOnclick = function (s, t) { - s.editor.MoveECellCallback.comment = - SocialCalc.SpreadsheetControlCommentMoveECell; - SocialCalc.SpreadsheetControlCommentDisplay(s, t); - SocialCalc.KeyboardFocus(); - return; - }; - - SocialCalc.SpreadsheetControlCommentDisplay = function (s, t) { - var c = ""; - if ( - s.editor.ecell && - s.editor.ecell.coord && - s.sheet.cells[s.editor.ecell.coord] - ) { - c = s.sheet.cells[s.editor.ecell.coord].comment || ""; - } - document.getElementById(s.idPrefix + "commenttext").value = c; - }; - - SocialCalc.SpreadsheetControlCommentMoveECell = function (editor) { - SocialCalc.SpreadsheetControlCommentDisplay( - SocialCalc.GetSpreadsheetControlObject(), - "comment" - ); - }; - - SocialCalc.SpreadsheetControlCommentSet = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - s.ExecuteCommand( - "set %C comment " + - SocialCalc.encodeForSave( - document.getElementById(s.idPrefix + "commenttext").value - ) - ); - var cell = SocialCalc.GetEditorCellElement( - s.editor, - s.editor.ecell.row, - s.editor.ecell.col - ); - s.editor.UpdateCellCSS(cell, s.editor.ecell.row, s.editor.ecell.col); - SocialCalc.KeyboardFocus(); - }; - - SocialCalc.SpreadsheetControlCommentOnunclick = function (s, t) { - delete s.editor.MoveECellCallback.comment; - }; - - // Names - - SocialCalc.SpreadsheetControlNamesOnclick = function (s, t) { - document.getElementById(s.idPrefix + "namesname").value = ""; - document.getElementById(s.idPrefix + "namesdesc").value = ""; - document.getElementById(s.idPrefix + "namesvalue").value = ""; - s.editor.RangeChangeCallback.names = - SocialCalc.SpreadsheetControlNamesRangeChange; - s.editor.MoveECellCallback.names = - SocialCalc.SpreadsheetControlNamesRangeChange; - SocialCalc.SpreadsheetControlNamesRangeChange(s.editor); - SocialCalc.SpreadsheetControlNamesFillNameList(); - SocialCalc.SpreadsheetControlNamesChangedName(); - }; - - SocialCalc.SpreadsheetControlNamesFillNameList = function () { - var SCLoc = SocialCalc.LocalizeString; - var name, i; - var namelist = []; - var s = SocialCalc.GetSpreadsheetControlObject(); - var nl = document.getElementById(s.idPrefix + "nameslist"); - var currentname = document - .getElementById(s.idPrefix + "namesname") - .value.toUpperCase() - .replace(/[^A-Z0-9_\.]/g, ""); - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - if (namelist.length > 0) { - nl.options[0] = new Option(SCLoc("[New]")); - } else { - nl.options[0] = new Option(SCLoc("[None]")); - } - for (i = 0; i < namelist.length; i++) { - name = namelist[i]; - nl.options[i + 1] = new Option(name, name); - if (name == currentname) { - nl.options[i + 1].selected = true; - } - } - if (currentname == "") { - nl.options[0].selected = true; - } - }; - - SocialCalc.SpreadsheetControlNamesChangedName = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var nl = document.getElementById(s.idPrefix + "nameslist"); - var name = nl.options[nl.selectedIndex].value; - if (s.sheet.names[name]) { - document.getElementById(s.idPrefix + "namesname").value = name; - document.getElementById(s.idPrefix + "namesdesc").value = - s.sheet.names[name].desc || ""; - document.getElementById(s.idPrefix + "namesvalue").value = - s.sheet.names[name].definition || ""; - } else { - document.getElementById(s.idPrefix + "namesname").value = ""; - document.getElementById(s.idPrefix + "namesdesc").value = ""; - document.getElementById(s.idPrefix + "namesvalue").value = ""; - } - }; - - SocialCalc.SpreadsheetControlNamesRangeChange = function (editor) { - var s = SocialCalc.GetSpreadsheetControlObject(); - var ele = document.getElementById(s.idPrefix + "namesrangeproposal"); - if (editor.range.hasrange) { - ele.value = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - ele.value = editor.ecell.coord; - } - }; - - SocialCalc.SpreadsheetControlNamesOnunclick = function (s, t) { - delete s.editor.RangeChangeCallback.names; - delete s.editor.MoveECellCallback.names; - }; - - SocialCalc.SpreadsheetControlNamesSetValue = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - document.getElementById(s.idPrefix + "namesvalue").value = - document.getElementById(s.idPrefix + "namesrangeproposal").value; - SocialCalc.KeyboardFocus(); - }; - - SocialCalc.SpreadsheetControlNamesSave = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var name = document.getElementById(s.idPrefix + "namesname").value; - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - if (name != "") { - s.ExecuteCommand( - "name define " + - name + - " " + - document.getElementById(s.idPrefix + "namesvalue").value + - "\n" + - "name desc " + - name + - " " + - document.getElementById(s.idPrefix + "namesdesc").value - ); - } - }; - - SocialCalc.SpreadsheetControlNamesDelete = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var name = document.getElementById(s.idPrefix + "namesname").value; - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - if (name != "") { - s.ExecuteCommand("name delete " + name); - // document.getElementById(s.idPrefix+"namesname").value = ""; - // document.getElementById(s.idPrefix+"namesvalue").value = ""; - // document.getElementById(s.idPrefix+"namesdesc").value = ""; - // SocialCalc.SpreadsheetControlNamesFillNameList(); - } - SocialCalc.KeyboardFocus(); - }; - - // Clipboard - - SocialCalc.SpreadsheetControlClipboardOnclick = function (s, t) { - var s = SocialCalc.GetSpreadsheetControlObject(); - clipele = document.getElementById(s.idPrefix + "clipboardtext"); - document.getElementById(s.idPrefix + "clipboardformat-tab").checked = true; - clipele.value = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.Clipboard.clipboard, - "tab" - ); - return; - }; - - SocialCalc.SpreadsheetControlClipboardFormat = function (which) { - var s = SocialCalc.GetSpreadsheetControlObject(); - clipele = document.getElementById(s.idPrefix + "clipboardtext"); - clipele.value = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.Clipboard.clipboard, - which - ); - }; - - SocialCalc.SpreadsheetControlClipboardLoad = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var savetype = "tab"; - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - if (document.getElementById(s.idPrefix + "clipboardformat-csv").checked) { - savetype = "csv"; - } else if ( - document.getElementById(s.idPrefix + "clipboardformat-scsave").checked - ) { - savetype = "scsave"; - } - s.editor.EditorScheduleSheetCommands( - "loadclipboard " + - SocialCalc.encodeForSave( - SocialCalc.ConvertOtherFormatToSave( - document.getElementById(s.idPrefix + "clipboardtext").value, - savetype - ) - ), - true, - false - ); - }; - - SocialCalc.SpreadsheetControlClipboardClear = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var clipele = document.getElementById(s.idPrefix + "clipboardtext"); - clipele.value = ""; - s.editor.EditorScheduleSheetCommands("clearclipboard", true, false); - clipele.focus(); - }; - - SocialCalc.SpreadsheetControlClipboardExport = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - if (s.ExportCallback) { - s.ExportCallback(s); - } - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - }; - - // Settings - - SocialCalc.SpreadsheetControlSettingsSwitch = function (target) { - SocialCalc.SettingControlReset(); - var s = SocialCalc.GetSpreadsheetControlObject(); - var sheettable = document.getElementById(s.idPrefix + "sheetsettingstable"); - var celltable = document.getElementById(s.idPrefix + "cellsettingstable"); - var sheettoolbar = document.getElementById( - s.idPrefix + "sheetsettingstoolbar" - ); - var celltoolbar = document.getElementById( - s.idPrefix + "cellsettingstoolbar" - ); - if (target == "sheet") { - sheettable.style.display = "block"; - celltable.style.display = "none"; - sheettoolbar.style.display = "block"; - celltoolbar.style.display = "none"; - SocialCalc.SettingsControlSetCurrentPanel( - s.views.settings.values.sheetspanel - ); - } else { - sheettable.style.display = "none"; - celltable.style.display = "block"; - sheettoolbar.style.display = "none"; - celltoolbar.style.display = "block"; - SocialCalc.SettingsControlSetCurrentPanel( - s.views.settings.values.cellspanel - ); - } - }; - - SocialCalc.SettingsControlSave = function (target) { - var range, cmdstr; - var s = SocialCalc.GetSpreadsheetControlObject(); - var sc = SocialCalc.SettingsControls; - var panelobj = sc.CurrentPanel; - var attribs = SocialCalc.SettingsControlUnloadPanel(panelobj); - - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - - if (target == "sheet") { - cmdstr = s.sheet.DecodeSheetAttributes(attribs); - } else if (target == "cell") { - if (s.editor.range.hasrange) { - range = - SocialCalc.crToCoord(s.editor.range.left, s.editor.range.top) + - ":" + - SocialCalc.crToCoord(s.editor.range.right, s.editor.range.bottom); - } - cmdstr = s.sheet.DecodeCellAttributes( - s.editor.ecell.coord, - attribs, - range - ); - } else { - // Cancel - } - if (cmdstr) { - s.editor.EditorScheduleSheetCommands(cmdstr, true, false); - } - }; - - /////////////////////// - // - // SAVE / LOAD ROUTINES - // - /////////////////////// - - // - // result = SocialCalc.SpreadsheetControlCreateSpreadsheetSave(spreadsheet, otherparts) - // - // Saves the spreadsheet's sheet data, editor settings, and audit trail (redo stack). - // The serialized data strings are concatenated together in multi-part MIME format. - // The first part lists the types of the subsequent parts (e.g., "sheet", "editor", and "audit") - // in this format: - // # comments - // version:1.0 - // part:type1 - // part:type2 - // ... - // - // If otherparts is non-null, it is an object with: - // partname1: "part contents - should end with \n", - // partname2: "part contents - should end with \n" - // - - SocialCalc.SpreadsheetControlCreateSpreadsheetSave = function ( - spreadsheet, - otherparts - ) { - var result; - - var otherpartsstr = ""; - var otherpartsnames = ""; - var partname, extranl; - - if (otherparts) { - for (partname in otherparts) { - if (otherparts[partname].charAt(otherparts[partname] - 1) != "\n") { - extranl = "\n"; - } else { - extranl = ""; - } - otherpartsstr += - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - otherparts[partname] + - extranl; - otherpartsnames += "part:" + partname + "\n"; - } - } - - result = - "socialcalc:version:1.0\n" + - "MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=" + - spreadsheet.multipartBoundary + - "\n" + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - "# SocialCalc Spreadsheet Control Save\nversion:1.0\npart:sheet\npart:edit\npart:audit\n" + - otherpartsnames + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - spreadsheet.CreateSheetSave() + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - spreadsheet.editor.SaveEditorSettings() + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - spreadsheet.sheet.CreateAuditString() + - otherpartsstr + - "--" + - spreadsheet.multipartBoundary + - "--\n"; - - return result; - }; - - // - // parts = SocialCalc.SpreadsheetControlDecodeSpreadsheetSave(spreadsheet, str) - // - // Separates the parts from a spreadsheet save string, returning an object with the sub-strings. - // - // {type1: {start: startpos, end: endpos}, type2:...} - // - - SocialCalc.SpreadsheetControlDecodeSpreadsheetSave = function ( - spreadsheet, - str - ) { - var pos1, - mpregex, - searchinfo, - boundary, - boundaryregex, - blanklineregex, - start, - ending, - lines, - i, - lines, - p, - pnun; - var parts = {}; - var partlist = []; - - pos1 = str.search(/^MIME-Version:\s1\.0/im); - if (pos1 < 0) return parts; - - mpregex = /^Content-Type:\s*multipart\/mixed;\s*boundary=(\S+)/gim; - mpregex.lastIndex = pos1; - - searchinfo = mpregex.exec(str); - if (mpregex.lastIndex <= 0) return parts; - boundary = searchinfo[1]; - - boundaryregex = new RegExp("^--" + boundary + "(?:\r\n|\n)", "mg"); - boundaryregex.lastIndex = mpregex.lastIndex; - - searchinfo = boundaryregex.exec(str); // find header top boundary - blanklineregex = /(?:\r\n|\n)(?:\r\n|\n)/gm; - blanklineregex.lastIndex = boundaryregex.lastIndex; - searchinfo = blanklineregex.exec(str); // skip to after blank line - if (!searchinfo) return parts; - start = blanklineregex.lastIndex; - boundaryregex.lastIndex = start; - searchinfo = boundaryregex.exec(str); // find end of header - if (!searchinfo) return parts; - ending = searchinfo.index; - - lines = str.substring(start, ending).split(/\r\n|\n/); // get header as lines - for (i = 0; i < lines.length; i++) { - line = lines[i]; - p = line.split(":"); - switch (p[0]) { - case "version": - break; - case "part": - partlist.push(p[1]); - break; - } - } - - for (pnum = 0; pnum < partlist.length; pnum++) { - // get each part - blanklineregex.lastIndex = ending; - searchinfo = blanklineregex.exec(str); // find blank line ending mime-part header - if (!searchinfo) return parts; - start = blanklineregex.lastIndex; - if (pnum == partlist.length - 1) { - // last one has different boundary - boundaryregex = new RegExp("^--" + boundary + "--$", "mg"); - } - boundaryregex.lastIndex = start; - searchinfo = boundaryregex.exec(str); // find ending boundary - if (!searchinfo) return parts; - ending = searchinfo.index; - parts[partlist[pnum]] = { start: start, end: ending }; // return position within full string - } - - return parts; - }; - - /* - * SettingsControls - * - * Each settings panel has an object in the following form: - * - * {ctrl-name1: {setting: setting-nameA, type: ctrl-type, id: id-component}, - * ctrl-name2: {setting: setting-nameB, type: ctrl-type, id: id-component, initialdata: optional-initialdata-override}, - * ...} - * - * The ctrl-types are names that correspond to: - * - * SocialCalc.SettingsControls.Controls = { - * ctrl-type1: { - * SetValue: function(panel-obj, ctrl-name, {def: true/false, val: value}) {...;}, - * ColorValues: if true, Onchanged converts between hex and RGB - * GetValue: function(panel-obj, ctrl-name) {...return {def: true/false, val: value};}, - * Initialize: function(panel-obj, ctrl-name) {...;}, // used to fill dropdowns, etc. - * InitialData: control-dependent, // used by Initialize (if no panel ctrlname.initialdata) - * OnReset: function(ctrl-name) {...;}, // called to put down popups, etc. - * ChangedCallback: function(ctrl-name) {...;} // if not null, called by control when user changes value - * } - * - */ - - SocialCalc.SettingsControls = { - Controls: {}, - CurrentPanel: null, // panel object to search on events - }; - - // - // SocialCalc.SettingsControlSetCurrentPanel(panel-object) - // - - SocialCalc.SettingsControlSetCurrentPanel = function (panelobj) { - SocialCalc.SettingsControls.CurrentPanel = panelobj; - - SocialCalc.SettingsControls.PopupChangeCallback( - { panelobj: panelobj }, - "", - null - ); - }; - - // - // SocialCalc.SettingsControlInitializePanel(panel-object) - // - - SocialCalc.SettingsControlInitializePanel = function (panelobj) { - var ctrlname; - var sc = SocialCalc.SettingsControls; - var ctrl; - - for (ctrlname in panelobj) { - if (ctrlname == "name") continue; - ctrl = sc.Controls[panelobj[ctrlname].type]; - if (ctrl && ctrl.Initialize) ctrl.Initialize(panelobj, ctrlname); - } - }; - - // - // SocialCalc.SettingsControlLoadPanel(panel-object, attribs) - // - - SocialCalc.SettingsControlLoadPanel = function (panelobj, attribs) { - var ctrlname; - var sc = SocialCalc.SettingsControls; - - for (ctrlname in panelobj) { - if (ctrlname == "name") continue; - ctrl = sc.Controls[panelobj[ctrlname].type]; - if (ctrl && ctrl.SetValue) - ctrl.SetValue(panelobj, ctrlname, attribs[panelobj[ctrlname].setting]); - } - }; - - // - // attribs = SocialCalc.SettingsControlUnloadPanel(panel-object) - // - - SocialCalc.SettingsControlUnloadPanel = function (panelobj) { - var ctrlname; - var sc = SocialCalc.SettingsControls; - var attribs = {}; - - for (ctrlname in panelobj) { - if (ctrlname == "name") continue; - ctrl = sc.Controls[panelobj[ctrlname].type]; - if (ctrl && ctrl.GetValue) - attribs[panelobj[ctrlname].setting] = ctrl.GetValue(panelobj, ctrlname); - } - - return attribs; - }; - - // - // SocialCalc.SettingsControls.PopupChangeCallback - // - - SocialCalc.SettingsControls.PopupChangeCallback = function ( - attribs, - id, - value - ) { - var sc = SocialCalc.Constants; - - var ele = document.getElementById("sample-text"); - - if (!ele || !attribs || !attribs.panelobj) return; - - var idPrefix = SocialCalc.CurrentSpreadsheetControlObject.idPrefix; - - var c = attribs.panelobj.name == "cell" ? "c" : ""; - - var v, a, parts, str1, str2, i; - - parts = - sc.defaultCellLayout.match( - /^padding.(\S+) (\S+) (\S+) (\S+).vertical.align.(\S+);$/ - ) || []; - - var cv = { - color: ["textcolor"], - backgroundColor: ["bgcolor", "#FFF"], - fontSize: ["fontsize", sc.defaultCellFontSize], - fontFamily: ["fontfamily"], - paddingTop: ["padtop", parts[1]], - paddingRight: ["padright", parts[2]], - paddingBottom: ["padbottom", parts[3]], - paddingLeft: ["padleft", parts[4]], - verticalAlign: ["alignvert", parts[5]], - }; - - for (a in cv) { - v = SocialCalc.Popup.GetValue(idPrefix + c + cv[a][0]) || cv[a][1] || ""; - ele.style[a] = v; - } - - if (c == "c") { - cv = { - borderTop: "cbt", - borderRight: "cbr", - borderBottom: "cbb", - borderLeft: "cbl", - }; - for (a in cv) { - v = SocialCalc.SettingsControls.BorderSideGetValue( - attribs.panelobj, - cv[a] - ); - ele.style[a] = v ? v.val || "" : ""; - } - v = SocialCalc.Popup.GetValue(idPrefix + "calignhoriz"); - ele.style.textAlign = v || "left"; - ele.childNodes[1].style.textAlign = v || "right"; - } else { - ele.style.border = ""; - v = SocialCalc.Popup.GetValue(idPrefix + "textalignhoriz"); - ele.style.textAlign = v || "left"; - v = SocialCalc.Popup.GetValue(idPrefix + "numberalignhoriz"); - ele.childNodes[1].style.textAlign = v || "right"; - } - - v = SocialCalc.Popup.GetValue(idPrefix + c + "fontlook"); - parts = v ? v.match(/^(\S+) (\S+)$/) || [] : []; - ele.style.fontStyle = parts[1] || ""; - ele.style.fontWeight = parts[2] || ""; - - v = SocialCalc.Popup.GetValue(idPrefix + c + "formatnumber") || "General"; - str1 = SocialCalc.FormatNumber.formatNumberWithFormat(9.8765, v, ""); - str2 = SocialCalc.FormatNumber.formatNumberWithFormat(-1234.5, v, ""); - if (str2 != "??-???-?? ??:??:??") { - // not bad date from negative number - str1 += "
" + str2; - } - - ele.childNodes[1].innerHTML = str1; - }; - - // - // PopupList Control - // - - SocialCalc.SettingsControls.PopupListSetValue = function ( - panelobj, - ctrlname, - value - ) { - if (!value) { - alert(ctrlname + " no value"); - return; - } - - var sp = SocialCalc.Popup; - - if (!value.def) { - sp.SetValue(panelobj[ctrlname].id, value.val); - } else { - sp.SetValue(panelobj[ctrlname].id, ""); - } - }; - - // - // SocialCalc.SettingsControls.PopupListGetValue - // - - SocialCalc.SettingsControls.PopupListGetValue = function ( - panelobj, - ctrlname - ) { - var ctl = panelobj[ctrlname]; - if (!ctl) return null; - - var value = SocialCalc.Popup.GetValue(ctl.id); - if (value) { - return { def: false, val: value }; - } else { - return { def: true, val: 0 }; - } - }; - - // - // SocialCalc.SettingsControls.PopupListInitialize - // - - SocialCalc.SettingsControls.PopupListInitialize = function ( - panelobj, - ctrlname - ) { - var i, val, pos, otext; - var sc = SocialCalc.SettingsControls; - var initialdata = - panelobj[ctrlname].initialdata || - sc.Controls[panelobj[ctrlname].type].InitialData || - ""; - initialdata = SocialCalc.LocalizeSubstrings(initialdata); - var optionvals = initialdata.split(/\|/); - - var options = []; - - for (i = 0; i < (optionvals.length || 0); i++) { - val = optionvals[i]; - pos = val.indexOf(":"); - otext = val.substring(0, pos); - if (otext.indexOf("\\") != -1) { - // escape any colons - otext = otext.replace(/\\c/g, ":"); - otext = otext.replace(/\\b/g, "\\"); - } - otext = SocialCalc.special_chars(otext); - if (otext == "[custom]") { - options[i] = { - o: SocialCalc.Constants.s_PopupListCustom, - v: val.substring(pos + 1), - a: { custom: true }, - }; - } else if (otext == "[cancel]") { - options[i] = { - o: SocialCalc.Constants.s_PopupListCancel, - v: "", - a: { cancel: true }, - }; - } else if (otext == "[break]") { - options[i] = { o: "-----", v: "", a: { skip: true } }; - } else if (otext == "[newcol]") { - options[i] = { o: "", v: "", a: { newcol: true } }; - } else { - options[i] = { o: otext, v: val.substring(pos + 1) }; - } - } - - SocialCalc.Popup.Create("List", panelobj[ctrlname].id, {}); - SocialCalc.Popup.Initialize(panelobj[ctrlname].id, { - options: options, - attribs: { - changedcallback: SocialCalc.SettingsControls.PopupChangeCallback, - panelobj: panelobj, - }, - }); - }; - - // - // SocialCalc.SettingsControls.PopupListReset - // - - SocialCalc.SettingsControls.PopupListReset = function (ctrlname) { - SocialCalc.Popup.Reset("List"); - }; - - SocialCalc.SettingsControls.Controls.PopupList = { - SetValue: SocialCalc.SettingsControls.PopupListSetValue, - GetValue: SocialCalc.SettingsControls.PopupListGetValue, - Initialize: SocialCalc.SettingsControls.PopupListInitialize, - OnReset: SocialCalc.SettingsControls.PopupListReset, - ChangedCallback: null, - }; - - // - // ColorChooser Control - // - - SocialCalc.SettingsControls.ColorChooserSetValue = function ( - panelobj, - ctrlname, - value - ) { - if (!value) { - alert(ctrlname + " no value"); - return; - } - - var sp = SocialCalc.Popup; - - if (!value.def) { - sp.SetValue(panelobj[ctrlname].id, value.val); - } else { - sp.SetValue(panelobj[ctrlname].id, ""); - } - }; - - // - // SocialCalc.SettingsControls.ColorChooserGetValue - // - - SocialCalc.SettingsControls.ColorChooserGetValue = function ( - panelobj, - ctrlname - ) { - var value = SocialCalc.Popup.GetValue(panelobj[ctrlname].id); - if (value) { - return { def: false, val: value }; - } else { - return { def: true, val: 0 }; - } - }; - - // - // SocialCalc.SettingsControls.ColorChooserInitialize - // - - SocialCalc.SettingsControls.ColorChooserInitialize = function ( - panelobj, - ctrlname - ) { - var i, val, pos, otext; - var sc = SocialCalc.SettingsControls; - - SocialCalc.Popup.Create("ColorChooser", panelobj[ctrlname].id, {}); - SocialCalc.Popup.Initialize(panelobj[ctrlname].id, { - attribs: { - title: " ", - moveable: true, - width: "106px", - changedcallback: SocialCalc.SettingsControls.PopupChangeCallback, - panelobj: panelobj, - }, - }); - }; - - // - // SocialCalc.SettingsControls.ColorChooserReset - // - - SocialCalc.SettingsControls.ColorChooserReset = function (ctrlname) { - SocialCalc.Popup.Reset("ColorChooser"); - }; - - SocialCalc.SettingsControls.Controls.ColorChooser = { - SetValue: SocialCalc.SettingsControls.ColorChooserSetValue, - GetValue: SocialCalc.SettingsControls.ColorChooserGetValue, - Initialize: SocialCalc.SettingsControls.ColorChooserInitialize, - OnReset: SocialCalc.SettingsControls.ColorChooserReset, - ChangedCallback: null, - }; - - // - // SocialCalc.SettingsControls.BorderSideSetValue - // - - SocialCalc.SettingsControls.BorderSideSetValue = function ( - panelobj, - ctrlname, - value - ) { - var sc = SocialCalc.SettingsControls; - var ele, found, idname, parts; - var idstart = panelobj[ctrlname].id; - - if (!value) { - alert(ctrlname + " no value"); - return; - } - - ele = document.getElementById(idstart + "-onoff-bcb"); // border checkbox - if (!ele) return; - - if (value.val) { - // border does not use default: it looks only to the value currently - ele.checked = true; - ele.value = value.val; - parts = value.val.match(/(\S+)\s+(\S+)\s+(\S.+)/); - idname = idstart + "-color"; - SocialCalc.Popup.SetValue(idname, parts[3]); - SocialCalc.Popup.SetDisabled(idname, false); - } else { - ele.checked = false; - ele.value = value.val; - idname = idstart + "-color"; - SocialCalc.Popup.SetValue(idname, ""); - SocialCalc.Popup.SetDisabled(idname, true); - } - }; - - // - // SocialCalc.SettingsControls.BorderSideGetValue - // - - SocialCalc.SettingsControls.BorderSideGetValue = function ( - panelobj, - ctrlname - ) { - var sc = SocialCalc.SettingsControls; - var ele, value; - var idstart = panelobj[ctrlname].id; - - ele = document.getElementById(idstart + "-onoff-bcb"); // border checkbox - if (!ele) return; - - if (ele.checked) { - // on - value = SocialCalc.Popup.GetValue(idstart + "-color"); - value = "1px solid " + (value || "rgb(0,0,0)"); - return { def: false, val: value }; - } else { - // off - return { def: false, val: "" }; - } - }; - - // - // SocialCalc.SettingsControls.BorderSideInitialize - // - - SocialCalc.SettingsControls.BorderSideInitialize = function ( - panelobj, - ctrlname - ) { - var sc = SocialCalc.SettingsControls; - var idstart = panelobj[ctrlname].id; - - SocialCalc.Popup.Create("ColorChooser", idstart + "-color", {}); - SocialCalc.Popup.Initialize(idstart + "-color", { - attribs: { - title: " ", - width: "106px", - moveable: true, - changedcallback: SocialCalc.SettingsControls.PopupChangeCallback, - panelobj: panelobj, - }, - }); - }; - - // - // SocialCalc.SettingsControlOnchangeBorder = function(ele) - // - - SocialCalc.SettingsControlOnchangeBorder = function (ele) { - var idname, value, found, ele2; - var sc = SocialCalc.SettingsControls; - var panelobj = sc.CurrentPanel; - - var nameparts = ele.id.match(/(^.*\-)(\w+)\-(\w+)\-(\w+)$/); - if (!nameparts) return; - var prefix = nameparts[1]; - var ctrlname = nameparts[2]; - var ctrlsubid = nameparts[3]; - var ctrlidsuffix = nameparts[4]; - var ctrltype = panelobj[ctrlname].type; - - switch (ctrlidsuffix) { - case "bcb": // border checkbox - if (ele.checked) { - sc.Controls[ctrltype].SetValue(sc.CurrentPanel, ctrlname, { - def: false, - val: ele.value || "1px solid rgb(0,0,0)", - }); - } else { - sc.Controls[ctrltype].SetValue(sc.CurrentPanel, ctrlname, { - def: false, - val: "", - }); - } - break; - } - }; - - SocialCalc.SettingsControls.Controls.BorderSide = { - SetValue: SocialCalc.SettingsControls.BorderSideSetValue, - GetValue: SocialCalc.SettingsControls.BorderSideGetValue, - OnClick: SocialCalc.SettingsControls.ColorComboOnClick, - Initialize: SocialCalc.SettingsControls.BorderSideInitialize, - InitialData: { thickness: "1 pixel:1px", style: "Solid:solid" }, - ChangedCallback: null, - }; - - SocialCalc.SettingControlReset = function () { - var sc = SocialCalc.SettingsControls; - var ctrlname; - - for (ctrlname in sc.Controls) { - if (sc.Controls[ctrlname].OnReset) - sc.Controls[ctrlname].OnReset(ctrlname); - } - }; - - /********************** - * - * CtrlSEditor implementation for editing SocialCalc.OtherSaveParts - * - */ - - SocialCalc.OtherSaveParts = {}; // holds other parts to save - must be set when loaded if you want to keep - - SocialCalc.CtrlSEditor = function (whichpart) { - var strtoedit, partname; - if (whichpart.length > 0) { - strtoedit = SocialCalc.special_chars( - SocialCalc.OtherSaveParts[whichpart] || "" - ); - } else { - strtoedit = "Listing of Parts\n"; - for (partname in SocialCalc.OtherSaveParts) { - strtoedit += SocialCalc.special_chars( - "\nPart: " + - partname + - "\n=====\n" + - SocialCalc.OtherSaveParts[partname] + - "\n" - ); - } - } - var editbox = document.createElement("div"); - editbox.style.cssText = - "position:absolute;z-index:500;width:300px;height:300px;left:100px;top:200px;border:1px solid black;background-color:#EEE;text-align:center;"; - editbox.id = "socialcalc-editbox"; - editbox.innerHTML = - whichpart + - '



'; - document.body.appendChild(editbox); - - var ebta = document.getElementById("socialcalc-editbox-textarea"); - ebta.focus(); - SocialCalc.CmdGotFocus(ebta); - }; - - SocialCalc.CtrlSEditorDone = function (idprefix, whichpart) { - var edittextarea = document.getElementById(idprefix + "-textarea"); - var text = edittextarea.value; - if (whichpart.length > 0) { - if (text.length > 0) { - SocialCalc.OtherSaveParts[whichpart] = text; - } else { - delete SocialCalc.OtherSaveParts[whichpart]; - } - } - - var editbox = document.getElementById(idprefix); - SocialCalc.KeyboardFocus(); - editbox.parentNode.removeChild(editbox); - }; - - // - // Workbook is a collection of sheets that are worked upon together - // - // The WorkBook class models and manages the collection of sheets - // - // Author: Ramu Ramamurthy - // - // - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - - // Constructor: - - SocialCalc.WorkBook = function (spread) { - this.spreadsheet = spread; // this is the spreadsheet control - this.defaultsheetname = null; - this.sheetArr = {}; // misnomer, this is not really an array - this.clipsheet = {}; // for copy paste of sheets - }; - - // Methods - - SocialCalc.WorkBook.prototype.InitializeWorkBook = function (defaultsheet) { - return SocialCalc.InitializeWorkBook(this, defaultsheet); - }; - - SocialCalc.WorkBook.prototype.AddNewWorkBookSheetNoSwitch = function ( - sheetid, - sheetname, - savestr - ) { - return SocialCalc.AddNewWorkBookSheetNoSwitch( - this, - sheetid, - sheetname, - savestr - ); - }; - SocialCalc.WorkBook.prototype.AddNewWorkBookSheet = function ( - sheetname, - oldsheetname, - fromclip, - spread - ) { - return SocialCalc.AddNewWorkBookSheet( - this, - sheetname, - oldsheetname, - fromclip, - spread - ); - }; - SocialCalc.WorkBook.prototype.ActivateWorkBookSheet = function ( - sheetname, - oldsheetname - ) { - return SocialCalc.ActivateWorkBookSheet(this, sheetname, oldsheetname); - }; - SocialCalc.WorkBook.prototype.DeleteWorkBookSheet = function ( - sheetname, - cursheetname - ) { - return SocialCalc.DeleteWorkBookSheet(this, sheetname, cursheetname); - }; - SocialCalc.WorkBook.prototype.SaveWorkBookSheet = function (sheetid) { - return SocialCalc.SaveWorkBookSheet(this, sheetid); - }; - SocialCalc.WorkBook.prototype.LoadRenameWorkBookSheet = function ( - sheetid, - savestr, - newname - ) { - return SocialCalc.LoadRenameWorkBookSheet(this, sheetid, savestr, newname); - }; - SocialCalc.WorkBook.prototype.RenameWorkBookSheet = function ( - oldname, - newname, - sheetid - ) { - return SocialCalc.RenameWorkBookSheet(this, oldname, newname, sheetid); - }; - SocialCalc.WorkBook.prototype.CopyWorkBookSheet = function (sheetid) { - return SocialCalc.CopyWorkBookSheet(this, sheetid); - }; - SocialCalc.WorkBook.prototype.PasteWorkBookSheet = function (newid, oldid) { - return SocialCalc.PasteWorkBookSheet(this, newid, oldid); - }; - SocialCalc.WorkBook.prototype.RenderWorkBookSheet = function () { - return SocialCalc.RenderWorkBookSheet(this); - }; - - SocialCalc.WorkBook.prototype.SheetNameExistsInWorkBook = function (name) { - return SocialCalc.SheetNameExistsInWorkBook(this, name); - }; - - SocialCalc.WorkBook.prototype.WorkbookScheduleCommand = function ( - cmd, - isremote - ) { - return SocialCalc.WorkbookScheduleCommand(this, cmd, isremote); - }; - - SocialCalc.WorkBook.prototype.WorkbookScheduleSheetCommand = function ( - cmd, - isremote - ) { - return SocialCalc.WorkbookScheduleSheetCommand(this, cmd, isremote); - }; - - // schedule some command - could be for sheet or for the workbook itself - SocialCalc.WorkbookScheduleCommand = function WorkbookScheduleCommand( - workbook, - cmd, - isremote - ) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - if (cmd.cmdtype == "scmd") { - workbook.WorkbookScheduleSheetCommand(cmd, isremote); - } - }; - - SocialCalc.WorkbookScheduleSheetCommand = - function WorkbookScheduleSheetCommand(workbook, cmd, isremote) { - //console.log(cmd.cmdtype,cmd.id,cmd.cmdstr); - - // check if sheet exists first - if (workbook.sheetArr[cmd.id]) { - workbook.sheetArr[cmd.id].sheet.ScheduleSheetCommands( - cmd.cmdstr, - cmd.saveundo, - isremote - ); - } - }; - - SocialCalc.InitializeWorkBook = function InitializeWorkBook( - workbook, - defaultsheet - ) { - workbook.defaultsheetname = defaultsheet; - - var spreadsheet = workbook.spreadsheet; - var defaultsheetname = workbook.defaultsheetname; - - // Initialize the Spreadsheet Control and display it - - SocialCalc.Formula.SheetCache.sheets[defaultsheetname] = { - sheet: spreadsheet.sheet, - name: defaultsheetname, - }; - - spreadsheet.sheet.sheetid = defaultsheetname; - spreadsheet.sheet.sheetname = defaultsheetname; - - workbook.sheetArr[defaultsheetname] = {}; - workbook.sheetArr[defaultsheetname].sheet = spreadsheet.sheet; - workbook.sheetArr[defaultsheetname].context = spreadsheet.context; - - // if these were properties of the sheet, then we wouldnt need to do this ! - workbook.sheetArr[defaultsheetname].editorprop = {}; - workbook.sheetArr[defaultsheetname].editorprop.ecell = null; - workbook.sheetArr[defaultsheetname].editorprop.range = null; - workbook.sheetArr[defaultsheetname].editorprop.range2 = null; - - workbook.clipsheet.savestr = null; - workbook.clipsheet.copiedfrom = null; - workbook.clipsheet.editorprop = {}; - - spreadsheet.editor.workingvalues.currentsheet = spreadsheet.sheet.sheetname; - spreadsheet.editor.workingvalues.startsheet = - spreadsheet.editor.workingvalues.currentsheet; - spreadsheet.editor.workingvalues.currentsheetid = spreadsheet.sheet.sheetid; - }; - - SocialCalc.AddNewWorkBookSheetNoSwitch = function AddNewWorkBookSheetNoSwitch( - workbook, - sheetid, - sheetname, - savestr - ) { - //alert(sheetid+","+sheetname+","+savestr); - - var spreadsheet = workbook.spreadsheet; - - var newsheet = new SocialCalc.Sheet(); - - SocialCalc.Formula.SheetCache.sheets[sheetname] = { - sheet: newsheet, - name: sheetname, - }; - - newsheet.sheetid = sheetid; - newsheet.sheetname = sheetname; - - if (savestr) { - newsheet.ParseSheetSave(savestr); - } - - workbook.sheetArr[sheetid] = {}; - workbook.sheetArr[sheetid].sheet = newsheet; - workbook.sheetArr[sheetid].context = null; - - if (workbook.sheetArr[sheetid].sheet.attribs) { - workbook.sheetArr[sheetid].sheet.attribs.needsrecalc = "yes"; - } - - workbook.sheetArr[sheetid].editorprop = {}; - workbook.sheetArr[sheetid].editorprop.ecell = { - coord: "A1", - row: 1, - col: 1, - }; - workbook.sheetArr[sheetid].editorprop.range = null; - workbook.sheetArr[sheetid].editorprop.range2 = null; - }; - - SocialCalc.AddNewWorkBookSheet = function AddNewWorkBookSheet( - workbook, - sheetid, - oldsheetid, - fromclip, - spread - ) { - var spreadsheet = workbook.spreadsheet; - - //alert("create new sheet "+sheetid+" old="+oldsheetid+" def="+workbook.defaultsheetname); - - if (spread == null) { - spreadsheet.sheet = new SocialCalc.Sheet(); - SocialCalc.Formula.SheetCache.sheets[sheetid] = { - sheet: spreadsheet.sheet, - name: sheetid, - }; - spreadsheet.sheet.sheetid = sheetid; - spreadsheet.sheet.sheetname = sheetid; - } else { - //alert("existing spread") - spreadsheet.sheet = spread; - } - - spreadsheet.context = new SocialCalc.RenderContext(spreadsheet.sheet); - - spreadsheet.sheet.statuscallback = SocialCalc.EditorSheetStatusCallback; - spreadsheet.sheet.statuscallbackparams = spreadsheet.editor; - - workbook.sheetArr[sheetid] = {}; - workbook.sheetArr[sheetid].sheet = spreadsheet.sheet; - workbook.sheetArr[sheetid].context = spreadsheet.context; - - workbook.sheetArr[sheetid].editorprop = {}; - workbook.sheetArr[sheetid].editorprop.ecell = null; - workbook.sheetArr[sheetid].editorprop.range = null; - workbook.sheetArr[sheetid].editorprop.range2 = null; - - if (oldsheetid != null) { - workbook.sheetArr[oldsheetid].editorprop.ecell = spreadsheet.editor.ecell; - workbook.sheetArr[oldsheetid].editorprop.range = spreadsheet.editor.range; - workbook.sheetArr[oldsheetid].editorprop.range2 = - spreadsheet.editor.range2; - } - - spreadsheet.context.showGrid = true; - spreadsheet.context.showRCHeaders = true; - spreadsheet.editor.context = spreadsheet.context; - - if (!fromclip) { - spreadsheet.editor.ecell = { - coord: "A1", - row: 1, - col: 1, - }; - - spreadsheet.editor.range = { - hasrange: false, - }; - spreadsheet.editor.range2 = { - hasrange: false, - }; - } - - // set highlights - spreadsheet.context.highlights[spreadsheet.editor.ecell.coord] = "cursor"; - - if (fromclip) { - // this is the result of a paste sheet - //alert("from clip"); - - if (workbook.clipsheet.savestr != null) { - //alert("sheetdata = "+workbook.clipsheet.savestr); - spreadsheet.sheet.ParseSheetSave(workbook.clipsheet.savestr); - } - - spreadsheet.editor.ecell = workbook.clipsheet.editorprop.ecell; - spreadsheet.context.highlights[spreadsheet.editor.ecell.coord] = "cursor"; - - // range is not pasted ??!?? - } - - spreadsheet.editor.workingvalues.currentsheet = spreadsheet.sheet.sheetname; - spreadsheet.editor.workingvalues.startsheet = - spreadsheet.editor.workingvalues.currentsheet; - spreadsheet.editor.workingvalues.currentsheetid = spreadsheet.sheet.sheetid; - - spreadsheet.editor.FitToEditTable(); - spreadsheet.editor.ScheduleRender(); - //spreadsheet.ExecuteCommand('recalc', ''); - }; - - SocialCalc.ActivateWorkBookSheet = function ActivateWorkBookSheet( - workbook, - sheetnamestr, - oldsheetnamestr - ) { - var spreadsheet = workbook.spreadsheet; - - //alert("activate "+sheetnamestr+" old="+oldsheetnamestr); - - spreadsheet.sheet = workbook.sheetArr[sheetnamestr].sheet; - spreadsheet.context = workbook.sheetArr[sheetnamestr].context; - - if (spreadsheet.context == null) { - //alert("context null") - //for (var sheet in workbook.sheetArr) alert(sheet+spreadsheet.sheet ) - workbook.AddNewWorkBookSheet( - sheetnamestr, - oldsheetnamestr, - false, - spreadsheet.sheet - ); - return; - } - - spreadsheet.editor.context = spreadsheet.context; - - if (oldsheetnamestr != null) { - workbook.sheetArr[oldsheetnamestr].editorprop.ecell = - spreadsheet.editor.ecell; - } - spreadsheet.editor.ecell = workbook.sheetArr[sheetnamestr].editorprop.ecell; - - if (oldsheetnamestr != null) { - workbook.sheetArr[oldsheetnamestr].editorprop.range = - spreadsheet.editor.range; - } - spreadsheet.editor.range = workbook.sheetArr[sheetnamestr].editorprop.range; - - if (oldsheetnamestr != null) { - workbook.sheetArr[oldsheetnamestr].editorprop.range2 = - spreadsheet.editor.range2; - } - spreadsheet.editor.range2 = - workbook.sheetArr[sheetnamestr].editorprop.range2; - - spreadsheet.sheet.statuscallback = SocialCalc.EditorSheetStatusCallback; - spreadsheet.sheet.statuscallbackparams = spreadsheet.editor; - - // reset highlights ?? - - //spreadsheet.editor.FitToEditTable(); - - spreadsheet.editor.workingvalues.currentsheet = spreadsheet.sheet.sheetname; - spreadsheet.editor.workingvalues.currentsheetid = spreadsheet.sheet.sheetid; - - if (spreadsheet.editor.state != "start" && spreadsheet.editor.inputBox) - spreadsheet.editor.inputBox.element.focus(); - - if (spreadsheet.editor.state == "start") { - spreadsheet.editor.workingvalues.startsheet = - spreadsheet.editor.workingvalues.currentsheet; - } - - //spreadsheet.editor.ScheduleRender(); - - if (spreadsheet.editor.state != "start" && spreadsheet.editor.inputBox) { - spreadsheet.editor.ScheduleRender(); - } else { - if (spreadsheet.sheet.attribs) { - spreadsheet.sheet.attribs.needsrecalc = "yes"; - } else { - spreadsheet.sheet.attribs = {}; - spreadsheet.sheet.attribs.needsrecalc = "yes"; - } - - spreadsheet.ExecuteCommand("redisplay", ""); - } - }; - - SocialCalc.DeleteWorkBookSheet = function DeleteWorkBookSheet( - workbook, - oldname, - curname - ) { - //alert("delete "+oldname+","+curname); - - delete workbook.sheetArr[oldname].context; - delete workbook.sheetArr[oldname].sheet; - delete workbook.sheetArr[oldname]; - // take sheet out of the formula cache - delete SocialCalc.Formula.SheetCache.sheets[curname]; - }; - - SocialCalc.SaveWorkBookSheet = function CreateSaveWorkBook( - workbook, - sheetid - ) { - var sheetstr = {}; - sheetstr.savestr = workbook.sheetArr[sheetid].sheet.CreateSheetSave(); - return sheetstr; - }; - - SocialCalc.LoadRenameWorkBookSheet = function LoadRenameWorkBookSheet( - workbook, - sheetid, - savestr, - newname - ) { - workbook.sheetArr[sheetid].sheet.ResetSheet(); - workbook.sheetArr[sheetid].sheet.ParseSheetSave(savestr); - - if (workbook.sheetArr[sheetid].sheet.attribs) { - workbook.sheetArr[sheetid].sheet.attribs.needsrecalc = "yes"; - } - - delete SocialCalc.Formula.SheetCache.sheets[ - workbook.sheetArr[sheetid].sheet.sheetname - ]; - workbook.sheetArr[sheetid].sheet.sheetname = newname; - SocialCalc.Formula.SheetCache.sheets[newname] = { - sheet: workbook.sheetArr[sheetid].sheet, - name: newname, - }; - }; - - SocialCalc.RenderWorkBookSheet = function RenderWorkBookSheet(workbook) { - workbook.spreadsheet.editor.ScheduleRender(); - }; - - SocialCalc.RenameWorkBookSheetCell = function (formula, oldname, newname) { - var ttype, ttext, i, newcr; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - var parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - //alert(ttype+","+ttext); - //console.log (scf.NormalizeSheetName(ttext) + " " + oldname); - if ( - ttype == tokentype.name && - scf.NormalizeSheetName(ttext) == oldname && - i < parseinfo.length - ) { - if (parseinfo[i + 1].type == token_op && parseinfo[i + 1].text == "!") { - updatedformula += newname; //console.log (updatedformula); - } else { - updatedformula += ttext; //console.log (updatedformula); - } - } else { - updatedformula += ttext; - } - } - //alert(updatedformula); - return updatedformula; - }; - - SocialCalc.RenameWorkBookSheet = function RenameWorkBookSheet( - workbook, - oldname, - newname, - sheetid - ) { - // for each sheet, fix up all the formula references - // - //alert (sheetid); - var oldsheet = SocialCalc.Formula.SheetCache.sheets[oldname].sheet; - delete SocialCalc.Formula.SheetCache.sheets[oldname]; - //alert (newname); // to check the newname - SocialCalc.Formula.SheetCache.sheets[newname] = { - sheet: oldsheet, - name: newname, - }; - workbook.sheetArr[sheetid].sheet.sheetname = newname; - // - // fix up formulas for sheet rename - // if formulas should not be fixed up upon sheet rename, then comment out the following - // block - // - for (var sheet in workbook.sheetArr) { - //alert("found sheet-"+sheet) - for (var cr in workbook.sheetArr[sheet].sheet.cells) { - // update cell references to sheet name - //alert(cr); - var cell = workbook.sheetArr[sheet].sheet.cells[cr]; - //if (cell) alert(cell.datatype) - if (cell && cell.datatype == "f") { - cell.formula = SocialCalc.RenameWorkBookSheetCell( - cell.formula, - oldname, - newname - ); - if (cell.parseinfo) { - delete cell.parseinfo; - } - } - } - } - // recalculate - workbook.spreadsheet.ExecuteCommand("recalc", ""); - }; - - SocialCalc.CopyWorkBookSheet = function CopyWorkBookSheet(workbook, sheetid) { - //alert("in copy "+sheetid); - workbook.clipsheet.savestr = - workbook.sheetArr[sheetid].sheet.CreateSheetSave(); - //alert("in copy save="+workbook.clipsheet.savestr); - workbook.clipsheet.copiedfrom = sheetid; - workbook.clipsheet.editorprop = {}; - workbook.clipsheet.editorprop.ecell = workbook.spreadsheet.editor.ecell; - //workbook.clipsheet.editorprop.range = workbook.spreadsheet.editor.range; - //workbook.clipsheet.editorprop.range2 = workbook.spreadsheet.editor.range2; - //workbook.clipsheet.highlights = workbook.spreadsheet.context.highlights; - - //alert("copied "+sheetid); - }; - - SocialCalc.PasteWorkBookSheet = function PasteWorkBookSheet( - workbook, - newsheetid, - oldsheetid - ) { - //alert(newsheetid+oldsheetid); - workbook.AddNewWorkBookSheet(newsheetid, oldsheetid, true); - - // clear the clip ? - }; - - SocialCalc.SheetNameExistsInWorkBook = function SheetNameExistsInWorkBook( - workbook, - name - ) { - for (var sheet in workbook.sheetArr) { - if (workbook.sheetArr[sheet].sheet.sheetname == name) { - return sheet; - } - } - return null; - }; - - // - // Workbook Control controls workbook actions (add/del/rename etc) and can appear at the - // bottom of the screen (?). Right now its just a proof of concept - // and appears at the top of the screen - // - // Author: Ramu Ramamurthy - // - // - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - - SocialCalc.CurrentWorkbookControlObject = null; - - SocialCalc.TestWorkBookSaveStr = ""; - - // Constructor: - - SocialCalc.WorkBookControl = function (book, divid, defaultsheetname) { - this.workbook = book; - this.div = divid; - this.defaultsheetname = defaultsheetname; - this.sheetButtonArr = {}; - this.sheetCnt = 0; - this.numSheets = 0; - this.currentSheetButton = null; - this.renameDialogId = "sheetRenameDialog"; - this.deleteDialogId = "sheetDeleteDialog"; - this.hideDialogId = "sheetHideDialog"; - this.unhideDialogId = "sheetUnhideDialog"; - - this.sheetshtml = - ''; - - //this.buttonshtml = - //'
'+ - //'
'+ - //''+ - //''+ - //''+ - - // ''+ - // ''+ - // ''+ - - //''+ - //''+ - //'
'+ - //'
'; - - SocialCalc.CurrentWorkbookControlObject = this; - this.sheetbar = new SocialCalc.SheetBar(); - }; - - // methods - SocialCalc.WorkBookControl.prototype.GetCurrentWorkBookControl = function () { - return SocialCalc.GetCurrentWorkBookControl(); - }; - SocialCalc.WorkBookControl.prototype.InitializeWorkBookControl = function () { - return SocialCalc.InitializeWorkBookControl(this); - }; - - SocialCalc.WorkBookControl.prototype.ExecuteWorkBookControlCommand = - function (cmd, isremote) { - return SocialCalc.ExecuteWorkBookControlCommand(this, cmd, isremote); - }; - - SocialCalc.ExecuteWorkBookControlCommand = function (control, cmd, isremote) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - //if (!isremote) { - // return; - //} - - if (cmd.cmdtype == "scmd") { - // dispatch a sheet command - control.workbook.WorkbookScheduleCommand(cmd, isremote); - return; - } - - if (cmd.cmdtype != "wcmd") { - return; - } - - var parseobj = new SocialCalc.Parse(cmd.cmdstr); - - var cmd1 = parseobj.NextToken(); - - switch (cmd1) { - case "addsheet": - SocialCalc.WorkBookControlAddSheetRemote(null); - break; - - case "addsheetstr": - var sheetstr = cmd.sheetstr; - SocialCalc.WorkBookControlAddSheetRemote(sheetstr); - break; - - case "delsheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlDelSheetRemote(sheetid); - break; - - case "rensheet": - var sheetid = parseobj.NextToken(); - var oldname = parseobj.NextToken(); - var newname = parseobj.NextToken(); - SocialCalc.WorkBookControlRenameSheetRemote(sheetid, oldname, newname); - break; - - case "activatesheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlActivateSheet(sheetid); - break; - - case "hidesheet": - var sheetid = parseobj.NextToken(); - - break; - - case "unhidesheet": - var sheetid = parseobj.NextToken(); - - break; - } - }; - - SocialCalc.GetCurrentWorkBookControl = function () { - return SocialCalc.CurrentWorkbookControlObject; - }; - - SocialCalc.InitializeWorkBookControl = function (control) { - var element = document.createElement("div"); - element.innerHTML = control.sheetshtml; - var foo = document.getElementById(control.div); - foo.appendChild(element); - //var element2 = document.createElement("div"); - //element2.innerHTML = control.buttonshtml; - //foo.appendChild(element2); - SocialCalc.WorkBookControlAddSheet(false); // this is for the default sheet - }; - - SocialCalc.WorkBookControlDelSheetRemote = function (sheetid) { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (sheetid == control.currentSheetButton.id) { - // the active sheet is being deleted - SocialCalc.WorkBookControlDelSheet(); - return; - } - // some non active sheet is being deleted - var foo = document.getElementById("fooBar"); - var deletedbutton = document.getElementById(sheetid); - - var did = deletedbutton.id; - var dname = deletedbutton.value; - delete control.sheetButtonArr[did]; - - foo.removeChild(deletedbutton); - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + did); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - // delete the sheet - control.workbook.DeleteWorkBookSheet(did, dname); - control.numSheets = control.numSheets - 1; - }; - - // assumes that the current active sheet is being deleted - SocialCalc.WorkBookControlDelSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { - //disallow this - var str = - '
' + - "" + - " A workbook must contain at least one worksheet " + - "

"; - str += - "To delete the selected sheet, you must first insert a new sheet.
"; - str += - '
' + - '
'; - var main = document.createElement("div"); - main.id = control.deleteDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - " X 
' + - '
' + - str + - "
"; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - // do a popup to reaffirm the deletion of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.deleteDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
' + - "" + - "The selected sheet will be permanently deleted." + - "
"; - str += "
    "; - str += "
  • To delete the selected sheet, click OK.
  • "; - str += "
  • To cancel the deletion, click cancel.
  • "; - str += "
"; - str += - '
' + - ' ' + - '
'; - - var main = document.createElement("div"); - main.id = control.deleteDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - " X 
' + - '
' + - str + - "
"; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.WorkBookControlDeleteSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.deleteDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlDeleteSheetSubmit = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlDeleteSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + current.id); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.currentSheetButton = null; - // delete the sheets - control.workbook.DeleteWorkBookSheet(name, curname); - control.numSheets = control.numSheets - 1; - - var cmdstr = "delsheet " + name; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - control.currentSheetButton.setAttribute( - "style", - "background-color:lightgreen" - ); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - break; - } - } - if (control.currentSheetButton != null) { - control.workbook.ActivateWorkBookSheet( - control.currentSheetButton.id, - null - ); - } - }; - - // assumes that the current active sheet is being hidden - SocialCalc.WorkBookControlHideSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { - //disallow this - var str = - '
' + - "" + - " A workbook must contain at least one worksheet " + - "

"; - str += - "Before hiding the selected sheet, you must first insert a new sheet.
"; - str += - '
' + - '
'; - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - " X 
' + - '
' + - str + - "
"; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - // do a popup to reaffirm the hiding of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.hideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
' + - "" + - "The selected sheet will be hidden." + - "
"; - str += "
    "; - str += "
  • To hide the selected sheet, click OK.
  • "; - str += "
  • To cancel the hiding, click cancel.
  • "; - str += "
"; - str += - '
' + - ' ' + - '
'; - - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - " X 
' + - '
' + - str + - "
"; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.WorkBookControlHideSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.hideDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlHideSheetSubmit = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlHideSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + current.id); - // unregister with mouse ? etc - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, false); - sheetbarbutton.style.display = "none"; - control.currentSheetButton = null; - // delete the sheets - - control.numSheets = control.numSheets - 1; - - var cmdstr = "hidesheet " + name; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if ( - sheet != null && - document.getElementById("sbsb-" + sheet).style.display != "none" - ) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute( - "style", - "background-color:lightgreen" - ); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet( - control.currentSheetButton.id, - null - ); - } - }; - - // displays all hidden sheets, and then unhides whatever is selected - SocialCalc.WorkBookControlUnhideSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - - var unhiddencount = 0; - for (var sheet in control.sheetButtonArr) { - if (document.getElementById("sbsb-" + sheet).style.display == "none") { - unhiddencount++; - } - } - - if (unhiddencount == 0) { - //no hidden sheets, error message here - var str = - '
' + - "" + - " There are no hidden worksheets. " + - "

"; - str += - "Before unhiding any sheets, you must first hide a sheet.
"; - str += - '
' + - '
'; - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - " X 
' + - '
' + - str + - "
"; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - var element = document.getElementById(control.unhideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
' + - "" + - "The following sheets are hidden." + - '
    ' + - ''; - for (var sheet in control.sheetButtonArr) { - if (document.getElementById("sbsb-" + sheet).style.display == "none") { - str += - '' + - control.sheetButtonArr[sheet].value + - "
    "; - } - } - - str += "
\n
    "; - str += "
  • To unhide the selected sheet, click OK.
  • "; - str += "
  • To cancel the unhiding, click cancel.
  • "; - str += "
"; - str += - '
' + - ' ' + - '
'; - - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - " X 
' + - '
' + - str + - "
"; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.WorkBookControlUnhideSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.unhideDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlUnhideSheetSubmit = function (name) { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlUnhideSheetHide(); - var current = document.getElementById(control.currentSheetButton.id); - - var curid = current.id; - var curname = control.currentSheetButton.value; - - control.currentSheetButton.setAttribute("style", ""); - var old = control.currentSheetButton.id; - console.log(old); - SocialCalc.SheetBarButtonActivate(old, false); - - var sheetbarbutton = document.getElementById("sbsb-" + name); - // unhide the button - sheetbarbutton.style.display = "inline"; - control.currentSheetButton = null; - - control.numSheets = control.numSheets + 1; - - var cmdstr = "unhidesheet " + name; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if ( - sheet != null && - document.getElementById("sbsb-" + sheet).style.display != "none" - ) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute( - "style", - "background-color:lightgreen" - ); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet( - control.currentSheetButton.id, - null - ); - } - }; - - SocialCalc.WorkBookControlAddSheetButton = function (sheetname, sheetid) { - var control = SocialCalc.GetCurrentWorkBookControl(); - - //Create an input type dynamically. - var element = document.createElement("input"); - - var name = null; - - if (sheetid != null) { - name = sheetid; - } else { - name = "sheet" + (control.sheetCnt + 1).toString(); - control.sheetCnt = control.sheetCnt + 1; - } - - //Assign different attributes to the element. - element.setAttribute("type", "button"); - if (sheetname == null) { - element.setAttribute("value", name); - } else { - element.setAttribute("value", sheetname); - } - element.setAttribute("id", name); - element.setAttribute("name", name); - - var fnname = - "SocialCalc.WorkBookControlActivateSheet(" + "'" + name + "'" + ")"; - - element.setAttribute("onclick", fnname); - - control.sheetButtonArr[name] = element; - - var foo = document.getElementById("fooBar"); - - //Append the element in page (in span). - foo.appendChild(element); - - control.numSheets = control.numSheets + 1; - - var el = new SocialCalc.SheetBarSheetButton( - "sbsb-" + name, - sheetname ? sheetname : name, - document.getElementById("SocialCalc-sheetbar-buttons"), - { - //normalstyle: "border:1px solid #000;backgroundColor:#FFF;", - //downstyle: "border:1px solid #000;backgroundColor:#CCC;", - //hoverstyle: "border:1px solid #000;backgroundColor:#FFF;" - }, - { - MouseDown: function () { - SocialCalc.SheetBarSheetButtonPress(name); - }, - Repeat: function () {}, - Disabled: function () {}, - } - ); - - return element; - }; - - SocialCalc.WorkBookControlAddSheet = function (addworksheet, sheetname) { - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(sheetname); - - // then change the highlight - - var old = "sheet1"; - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style", ""); - old = control.currentSheetButton.id; - SocialCalc.SheetBarButtonActivate(old, false); - } - - element.setAttribute("style", "background-color:lightgreen"); - control.currentSheetButton = element; - var newsheetid = element.id; - SocialCalc.SheetBarButtonActivate(newsheetid, true); - - // create the sheet - if (addworksheet) { - control.workbook.AddNewWorkBookSheet(newsheetid, old, false); - // broadcast an add command here - var cmdstr = "addsheet"; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - } - }; - - SocialCalc.WorkBookControlAddSheetRemote = function (savestr) { - var control = SocialCalc.GetCurrentWorkBookControl(); - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(); - - // add the sheet, dont switch to it - control.workbook.AddNewWorkBookSheetNoSwitch( - element.id, - element.value, - savestr - ); - }; - - SocialCalc.WorkBookControlActivateSheet = function (name) { - //alert("in activate sheet="+name) - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById(name); - foo.setAttribute("style", "background-color:lightgreen;"); - SocialCalc.SheetBarButtonActivate(name, true); - - var old = control.currentSheetButton.id; - if (control.currentSheetButton.id != foo.id) { - control.currentSheetButton.setAttribute("style", ""); - SocialCalc.SheetBarButtonActivate(old, false); - } - - control.currentSheetButton = foo; - - control.workbook.ActivateWorkBookSheet(name, old); - }; - - SocialCalc.WorkBookControlHttpRequest = null; - - SocialCalc.WorkBookControlAlertContents = function () { - var loadedstr = ""; - var http_request = SocialCalc.WorkBookControlHttpRequest; - - if (http_request.readyState == 4) { - //addmsg("received:" + http_request.responseText.length + " chars"); - try { - if (http_request.status == 200) { - loadedstr = http_request.responseText || ""; - http_request = null; - } else { - } - } catch (e) {} - // do something with loaded str - //alert("loaded="+loadedstr); - SocialCalc.TestWorkBookSaveStr = loadedstr; - SocialCalc.Clipboard.clipboard = loadedstr; - } - }; - - SocialCalc.WorkBookControlAjaxCall = function (url, contents) { - var http_request = null; - - alert("in ajax"); - if (window.XMLHttpRequest) { - // Mozilla, Safari,... - http_request = new XMLHttpRequest(); - } else if (window.ActiveXObject) { - // IE - try { - http_request = new ActiveXObject("Msxml2.XMLHTTP"); - } catch (e) { - try { - http_request = new ActiveXObject("Microsoft.XMLHTTP"); - } catch (e) {} - } - } - if (!http_request) { - alert("Giving up :( Cannot create an XMLHTTP instance"); - return false; - } - - // Make the actual request - SocialCalc.WorkBookControlHttpRequest = http_request; - - http_request.onreadystatechange = SocialCalc.WorkBookControlAlertContents; - http_request.open("POST", document.URL, true); // async - http_request.setRequestHeader( - "Content-Type", - "application/x-www-form-urlencoded" - ); - http_request.send(contents); - - return true; - }; - - SocialCalc.WorkBookControlSaveSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetsave = {}; - - sheetsave.numsheets = control.numSheets; - sheetsave.currentid = control.currentSheetButton.id; - sheetsave.currentname = control.currentSheetButton.value; - - sheetsave.sheetArr = {}; - for (var sheet in control.sheetButtonArr) { - var sheetstr = control.workbook.SaveWorkBookSheet(sheet); - sheetsave.sheetArr[sheet] = {}; - sheetsave.sheetArr[sheet].sheetstr = sheetstr; - sheetsave.sheetArr[sheet].name = control.sheetButtonArr[sheet].value; - sheetsave.sheetArr[sheet].hidden = - document.getElementById("sbsb-" + sheet).style.display == "none" - ? "1" - : "0"; - } - - // Save the editable cells if specified - if (SocialCalc.EditableCells && SocialCalc.EditableCells.allow) { - sheetsave.EditableCells = {}; - for (var i in SocialCalc.EditableCells) { - sheetsave.EditableCells[i] = SocialCalc.EditableCells[i]; - } - } - - var d = new Date(); - sheetsave["timestamp"] = d.toString(); - - SocialCalc.TestWorkBookSaveStr = JSON.stringify(sheetsave); - //alert(SocialCalc.TestWorkBookSaveStr); - // send it to the backend - // SocialCalc.WorkBookControlAjaxCall("/", "&sheetdata="+encodeURIComponent(SocialCalc.TestWorkBookSaveStr)); - return SocialCalc.TestWorkBookSaveStr; - }; - - // insert another workbook into an existing workbook - // assumption is at least 1 sheet exists in existing workbook - // sheets with same names will be overwritten ! - SocialCalc.WorkBookControlInsertWorkbook = function (savestr) { - var sheetsave; - if (savestr) { - sheetsave = JSON.parse(savestr); - } - var control = SocialCalc.GetCurrentWorkBookControl(); - for (var sheet in sheetsave.sheetArr) { - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - // check if sheetname already exists - var sheetname = sheetsave.sheetArr[sheet].name; - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - if (sheetid) { - console.log(sheetname + "exists"); - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, sheetname); - } else { - //just test-brand new insert first - sheetid = "sheet" + (control.sheetCnt + 1).toString(); - control.sheetCnt = control.sheetCnt + 1; - SocialCalc.WorkBookControlAddSheetButton( - sheetsave.sheetArr[sheet].name, - sheetid - ); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch( - sheetid, - sheetsave.sheetArr[sheet].name, - savestr - ); - } - } - }; - - SocialCalc.WorkBookControlLoad = function (savestr) { - var sheetsave; - - if (savestr == "") return; - - if (savestr) { - sheetsave = JSON.parse(savestr); - } else { - sheetsave = JSON.parse(SocialCalc.TestWorkBookSaveStr); - } - //alert(sheetsave.currentid+","+sheetsave.currentname) - - // first create a new workbook - var control = SocialCalc.GetCurrentWorkBookControl(); - - SocialCalc.WorkBookControlCreateNewBook(); - - // at this point there is one sheet, and 1 button - // create the sequence of buttons, and sheets - var firstrun = true; - var newbuttons = 0; - var sheetid = null; - var currentsheetid = sheetsave.currentid; - //alert("button="+newbuttons) - for (var sheet in sheetsave.sheetArr) { - //alert(sheet); - if (newbuttons > sheetsave.numsheets) { - break; - } - //alert("button="+newbuttons) - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - if (firstrun) { - firstrun = false; - // set the first button's name correctly - sheetid = control.currentSheetButton.id; - control.currentSheetButton.value = sheetsave.sheetArr[sheet].name; - SocialCalc.SheetBarButtonSetName( - sheetid, - sheetsave.sheetArr[sheet].name - ); - // set the sheet data for the first sheet which already exists - control.workbook.LoadRenameWorkBookSheet( - sheetid, - savestr, - control.currentSheetButton.value - ); - // need to also set the formula cache - currentsheetid = sheetid; - } else { - sheetid = "sheet" + (control.sheetCnt + 1).toString(); - control.sheetCnt = control.sheetCnt + 1; - SocialCalc.WorkBookControlAddSheetButton( - sheetsave.sheetArr[sheet].name, - sheetid - ); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch( - sheetid, - sheetsave.sheetArr[sheet].name, - savestr - ); - } - if (sheetsave.sheetArr[sheet].hidden == "1") { - // unregister with mouse ? etc - var sheetbarbutton = document.getElementById("sbsb-" + sheetid); - sheetbarbutton.style.display = "none"; - SocialCalc.SheetBarButtonActivate(sheet, false); - newbuttons = newbuttons - 1; - } - if (sheet == sheetsave.currentid) { - currentsheetid = sheetid; - } - newbuttons = newbuttons + 1; - } - // Save the user script data - if (sheetsave.EditableCells) { - SocialCalc.EditableCells = {}; - for (var i in sheetsave.EditableCells) { - SocialCalc.EditableCells[i] = sheetsave.EditableCells[i]; - } - } - var timeoutFn = function () { - SocialCalc.WorkBookControlActivateSheet(currentsheetid); - }; - window.setTimeout(timeoutFn, 200); - }; - - SocialCalc.WorkBookControlRenameSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - // do a popup to get the new name of the sheet - // the popup has an input element with submit, and cancel buttons - var element = document.getElementById(control.renameDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
' + - '' + - "Rename-" + - currentsheet + - "
" + - '' + - "Please ensure that you DO NOT have ANY spaces in the sheet name." + - "" + - '
' + - "
"; - - str += - '
' + - ' ' + - '
'; - - var main = document.createElement("div"); - main.id = control.renameDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - " X 
' + - '
' + - str + - "
"; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - - var ele = document.getElementById("newSheetName"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - }; - - SocialCalc.WorkBookControlRenameSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.renameDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlRenameSheetSubmit = function () { - // this handles all the rename action - var ele = document.getElementById("newSheetName"); - //console.log(ele.value); - var control = SocialCalc.GetCurrentWorkBookControl(); - if (ele.value.length == 0) { - ele.focus(); - return; - } - var oldname = control.currentSheetButton.value; - var newname = ele.value; - if (newname.indexOf(" ") != -1) { - alert( - "A space was found in the new name. Please ensure that the new name has no sapces" - ); - return; - } - SocialCalc.WorkBookControlRenameSheetHide(); - // verify newname does not clash with any existing sheet name - // if so reject - var smallname = newname.toLowerCase(); //converting to lower case to normalise - //console.log(smallname + " old " + ele.value); - for (var sheet in workbook.sheetArr) { - console.log(workbook.sheetArr[sheet].sheet.sheetname); //checking in sheetarr for repeated names - if (workbook.sheetArr[sheet].sheet.sheetname == smallname) { - alert(newname + " already exists"); - return; - } - } // variation of Case in letters of a sheet name will give an error if smallname is used. - - control.currentSheetButton.value = smallname; - - SocialCalc.SheetBarButtonSetName(control.currentSheetButton.id, newname); - - // perform a rename for formula references to this sheet in all the - // sheets in the workbook - control.workbook.RenameWorkBookSheet( - oldname, - smallname, - control.currentSheetButton.id - ); - - var cmdstr = - "rensheet " + - control.currentSheetButton.id + - " " + - oldname + - " " + - newname; - //console.log(cmdstr); - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - }; - - SocialCalc.WorkBookControlRenameSheetRemote = function ( - sheetid, - oldname, - newname - ) { - //console.log("rename sheet ",sheetid, oldname, newname) - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById("fooBar"); - var renbutton = document.getElementById(sheetid); - - renbutton.value = newname; - - SocialCalc.SheetBarButtonSetName(sheetid, newname); - - control.workbook.RenameWorkBookSheet(oldname, newname, sheetid); - }; - - SocialCalc.WorkBookControlCreateNewBook = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - // delete all the sheets except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - control.workbook.DeleteWorkBookSheet( - control.sheetButtonArr[sheet].id, - control.sheetButtonArr[sheet].value - ); - } - } - // Reset that 1 sheet - - control.workbook.LoadRenameWorkBookSheet( - control.currentSheetButton.id, - "", - control.workbook.defaultsheetname - ); - - // delete all the buttons except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.sheetButtonArr[sheet].id); - - var name = current.id; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + name); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.numSheets = control.numSheets - 1; - } - } - // rename that button - control.currentSheetButton.value = control.workbook.defaultsheetname; - //alert("done new workbook") - }; - - SocialCalc.WorkBookControlNewBook = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlCreateNewBook(); - control.workbook.RenderWorkBookSheet(); - }; - - SocialCalc.WorkBookControlMove = function (direction) { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - return; - } - var sheetArr = control.sheetButtonArr; - var newSheetArr = {}; - var sheetid = control.currentSheetButton.id; - - var curr_button = document.getElementById(sheetid); - var curr_sb_button = document.getElementById("sbsb-" + sheetid); - var sib_button = null; - var sib_sb_button = null; - if (direction == "left") { - sib_button = curr_button.previousSibling; - sib_sb_button = curr_sb_button.previousSibling; - if (!sib_sb_button) { - alert("Cannot move leftmost Sheet further to the left"); - return; - } - } else { - sib_button = curr_button.nextSibling; - sib_sb_button = curr_sb_button.nextSibling; - if (!sib_sb_button) { - alert("Cannot move rightmost Sheet further to the right"); - return; - } - } - var currid = sheetid; - var sibid = sib_button.id; - var parent = curr_button.parentNode; - var sb_parent = curr_sb_button.parentNode; - - var cloned = {}; - var clonedsb = {}; - for (button in sheetArr) { - clonedsb[button] = document.getElementById("sbsb-" + button); - cloned[button] = document.getElementById(button); - sb_parent.removeChild(document.getElementById("sbsb-" + button)); - parent.removeChild(document.getElementById(button)); - } - for (button in sheetArr) { - if (button != currid && button != sibid) { - newSheetArr[button] = sheetArr[button]; - sb_parent.appendChild(clonedsb[button]); - parent.appendChild(cloned[button]); - } else if (button == currid) { - if (direction == "left") { - newSheetArr[currid] = sheetArr[currid]; - newSheetArr[sibid] = sheetArr[sibid]; - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - } else { - newSheetArr[sibid] = sheetArr[sibid]; - newSheetArr[currid] = sheetArr[currid]; - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - } - } - } - control.sheetButtonArr = newSheetArr; - SocialCalc.SheetBarButtonActivate(currid, true); - }; - - SocialCalc.WorkBookControlMoveLeft = function () { - SocialCalc.WorkBookControlMove("left"); - }; - SocialCalc.WorkBookControlMoveRight = function () { - SocialCalc.WorkBookControlMove("right"); - }; - - SocialCalc.WorkBookControlCopySheet = function () { - //alert("in copy"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - control.workbook.CopyWorkBookSheet(control.currentSheetButton.id); - - alert("copied sheet:" + control.currentSheetButton.value); - }; - - SocialCalc.WorkBookControlPasteSheet = function () { - //alert("in paste"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - var oldid = control.currentSheetButton.id; - - SocialCalc.WorkBookControlAddSheet(false); - - var newid = control.currentSheetButton.id; - - //alert(newid+oldid); - - control.workbook.PasteWorkBookSheet(newid, oldid); - - var cmdstr = "addsheetstr"; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - sheetstr: control.workbook.clipsheet.savestr, - }); - }; - - SocialCalc.SheetBar = function () { - this.baseDiv = document.getElementById("SocialCalc-sheetbar"); - - this.prebuttonsDiv = document.createElement("div"); - this.prebuttonsDiv.style.cssText = "display:inline;"; - this.prebuttonsDiv.innerHTML = "        "; - this.prebuttonsDiv.id = "SocialCalc-sheetbar-prebuttons"; - - this.buttonsDiv = document.createElement("div"); - this.buttonsDiv.id = "SocialCalc-sheetbar-buttons"; - this.buttonsDiv.style.cssText = "display:inline;"; - - this.buttonActionsDiv = document.createElement("div"); - this.buttonActionsDiv.id = "SocialCalc-sheetbar-buttonactions"; - this.buttonActionsDiv.style.display = "inline"; - var addbutton = new SocialCalc.SheetBarSheetButton( - "sbsba-add", - "sbsba-add", - this.buttonActionsDiv, - {}, - { - MouseDown: function () { - var abc = SocialCalc.WorkBookControlAddSheet(true); - }, - }, - "add-2.png" - ); - - this.baseDiv.appendChild(this.prebuttonsDiv); - this.baseDiv.appendChild(this.buttonsDiv); - this.baseDiv.appendChild(this.buttonActionsDiv); - }; - - // define a new class for sheetbarsheetbutton - - SocialCalc.SheetBarSheetButton = function ( - id, - name, - parentdiv, - params, - functions, - img - ) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.name = name; - if (!img) { - this.ele.innerHTML = name; - this.ele.style.cssText = - "font-size:small;display:inline;padding:5px 5px 2px 5px;border:1px solid #000;"; - imgele = document.createElement("img"); - imgele.id = id + "-img"; - imgele.src = - SocialCalc.Constants.defaultImagePrefix + "menu-dropdown.png"; - imgele.style.cssText = - "padding:0px 2px;width:16px;height:16px;vertical-align:middle;"; - this.ele.appendChild(imgele); - SocialCalc.ButtonRegister(this.ele, params, functions); - SocialCalc.ButtonRegister(imgele, params, functions); - } else { - var imgele = document.createElement("img"); - imgele.src = SocialCalc.Constants.defaultImagePrefix + img; - imgele.style.cssText = "width:16px;height:16px;vertical-align:middle;"; - this.ele.appendChild(imgele); - this.ele.style.cssText = "display:inline;padding:5px 5px 2px 5px;"; - SocialCalc.ButtonRegister(imgele, params, functions); - } - parentdiv.appendChild(this.ele); - }; - - SocialCalc.SheetBarButtonActivate = function (id, active) { - var sbbutton = document.getElementById("sbsb-" + id); - sbbutton.isactive = active; - if (active) { - sbbutton.style.backgroundColor = "#FFF"; - var imgele = document.getElementById("sbsb-" + id + "-img"); - if (!imgele) { - imgele = document.createElement("img"); - imgele.id = "sbsb-" + id + "-img"; - imgele.src = - SocialCalc.Constants.defaultImagePrefix + "menu-dropdown.png"; - imgele.style.cssText = - "padding:0px 2px;width:16px;height:16px;vertical-align:middle;"; - } - sbbutton.appendChild(imgele); - SocialCalc.ButtonRegister( - imgele, - {}, - { - MouseDown: function () { - SocialCalc.SheetBarSheetButtonPress(id); - }, - Repeat: function () {}, - Disabled: function () {}, - } - ); - } else { - sbbutton.style.backgroundColor = "#CCC"; - var imgele = document.getElementById("sbsb-" + id + "-img"); - if (imgele) { - sbbutton.removeChild(imgele); - } - } - var menu = document.getElementById("sbsb-menu"); - if (menu && menu.style.display != "none") { - menu.style.display = "none"; - } - }; - - SocialCalc.SheetBarButtonSetName = function (id, name) { - var sbbutton = document.getElementById("sbsb-" + id); - sbbutton.name = name; - sbbutton.innerHTML = name; - if (sbbutton.isactive) { - SocialCalc.SheetBarButtonActivate(id, true); - } - }; - - SocialCalc.SheetBarSheetButtonPress = function (id) { - //console.log("button press") - var sbbutton = document.getElementById("sbsb-" + id); - if (sbbutton && sbbutton.isactive) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) { - var sbsbm = new SocialCalc.SheetBarSheetButtonMenu("sbsb-menu", id); - } else { - menu.clickedsheetid = id; - if (menu.style.display == "none") { - menu.style.display = "inline"; - SocialCalc.SheetBarSheetButtonMenuPosition(menu, id); - } else { - menu.style.display = "none"; - } - } - } else if (sbbutton) { - SocialCalc.WorkBookControlActivateSheet(id); - } - }; - - // define a new class for sheetbarsheet button menu item - - SocialCalc.SheetBarSheetButtonMenuItem = function (id, t) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.innerHTML = t; - this.ele.className = ""; - this.ele.style.cssText = - "padding:3px 4px;width:100px;height:20px;background-color:#FFF;"; - - var params = { - normalstyle: "backgroundColor:#FFF;", - downstyle: "backgroundColor:#CCC;", - hoverstyle: "backgroundColor:#CCC;", - }; - var functions = { - MouseDown: function () { - SocialCalc.SheetBarMenuItemPress(id); - }, - Repeat: function () {}, - Disabled: function () {}, - }; - - SocialCalc.ButtonRegister(this.ele, params, functions); - - SocialCalc.TouchRegister(this.ele, { SingleTap: functions.MouseDown }); - - return this.ele; - }; - - SocialCalc.SheetBarMenuItemPress = function (id) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) return; - - var clickedsheetid = menu.clickedsheetid; - - switch (id) { - case "sbsb_deletesheet": - //console.log("delete "+clickedsheetid); - SocialCalc.WorkBookControlDelSheet(); - break; - case "sbsb_hidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlHideSheet(); - break; - case "sbsb_unhidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlUnhideSheet(); - break; - case "sbsb_copysheet": - //console.log("copy "+clickedsheetid); - SocialCalc.WorkBookControlCopySheet(); - break; - case "sbsb_moveleft": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveLeft(); - break; - case "sbsb_moveright": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveRight(); - break; - - case "sbsb_pastesheet": - //console.log("paste "+clickedsheetid); - SocialCalc.WorkBookControlPasteSheet(); - break; - case "sbsb_renamesheet": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlRenameSheet(); - break; - case "sbsb_closemenu": - //console.log("rename "+clickedsheetid); - menu.style.display = "none"; - break; - default: - break; - } - menu.style.display = "none"; - }; - - // define a new class for sheetbarsheet button menu - SocialCalc.SheetBarSheetButtonMenu = function (id, clickedsheetid) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.className = ""; - this.ele.clickedsheetid = clickedsheetid; - this.ele.style.cssText = - "border:1px solid #000;position:absolute;top:200px;left:0px;width=100px;z-index:120"; - - var ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_deletesheet", - " Delete Sheet" - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_hidesheet", - " Hide Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_unhidesheet", - " Unhide Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_renamesheet", - " Rename Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_moveleft", - " Move Left " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_moveright", - " Move Right " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_copysheet", - " Copy Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_pastesheet", - " Paste Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_closemenu", - " Cancel" - ); - this.ele.appendChild(ele1); - - SocialCalc.SheetBarSheetButtonMenuPosition(this.ele, clickedsheetid); - - //var clickedsheet = document.getElementById(clickedsheetid); - //var position = SocialCalc.GetElementPosition(clickedsheet); - //console.log(clickedsheet.offsetHeight,clickedsheet.offsetWidth,clickedsheet.offsetLeft, clickedsheet.offsetTop); - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.editor.toplevel.appendChild(this.ele); - }; - - // position the sheet menu - SocialCalc.SheetBarSheetButtonMenuPosition = function (menu, clickedsheetid) { - var hlessbutton = document.getElementById("te_lessbuttonh"); - - //console.log(hlessbutton.style.top, hlessbutton.style.left); - - var sbbutton = document.getElementById("sbsb-" + clickedsheetid); - - //console.log(sbbutton.offsetLeft,clickedsheetid); - - var top = hlessbutton.style.top.slice(0, -2) - 220; - var left = sbbutton.offsetLeft + 7; - - menu.style.top = top + "px"; - menu.style.left = left + "px"; - - //console.log(menu.style.top, menu.style.left); - }; - - SocialCalc.ScriptInfo = { - scripts: {}, - handle: null, - }; - - SocialCalc.ScriptCheck = function (sheetid, coord, text) { - var commentstart = text.indexOf(""); - if (commentstart != -1 && commentend != -1) { - var script = text.slice(commentstart + 10, commentend); - //alert(script); - SocialCalc.ScriptInfo.scripts[coord] = script; - if (SocialCalc.ScriptInfo.handle == null) { - SocialCalc.ScriptInfo.handle = window.setTimeout( - SocialCalc.EvalUserScripts, - 500 - ); - } - //alert(coord+"-"+sheetid); - } - }; - - SocialCalc.EvalUserScript = function (data) { - var head = - document.getElementsByTagName("head")[0] || document.documentElement; - - if (data == "") return; - - var script = document.createElement("script"); - - script.type = "text/javascript"; - try { - // doesn't work on ie... - script.appendChild(document.createTextNode(data)); - } catch (e) { - // IE has funky script nodes - script.text = data; - } - - head.insertBefore(script, head.firstChild); - head.removeChild(script); - }; - - SocialCalc.EvalUserScripts = function () { - for (var cr in SocialCalc.ScriptInfo.scripts) { - SocialCalc.EvalUserScript(SocialCalc.ScriptInfo.scripts[cr]); - //console.log(cr,SocialCalc.ScriptInfo.scripts[cr]) - } - SocialCalc.ScriptInfo.handle = null; - SocialCalc.ScriptInfo.scripts = {}; - }; - - SocialCalc.CallOutOnRenderCell = function (sheetobj, value, cr) { - var cell = sheetobj.cells[cr]; - if (!cell) return; - var valuetype = cell.valuetype || ""; // get type of value to determine formatting - var valuesubtype = valuetype.substring(1); - var sheetattribs = sheetobj.attribs; - var valueformat; - valuetype = valuetype.charAt(0); - if (valuetype == "t") { - valueformat = - sheetobj.valueformats[cell.textvalueformat - 0] || - sheetobj.valueformats[sheetattribs.defaulttextvalueformat - 0] || - ""; - if (valueformat == "text-html") { - SocialCalc.ScriptCheck(sheetobj.sheetid, cr, value); - } - } - }; - - SocialCalc.GetCellDataValue = function (coord) { - var sheetname = null; - var sheetid = ""; - var bindex = coord.indexOf("!"); - if (bindex != -1) { - sheetname = coord.slice(0, bindex); - coord = coord.slice(bindex + 1); - //console.log(sheetname,coord) - } - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (sheetname == null) { - sheetid = control.currentSheetButton.id; - } else { - sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - } - - if (sheetid == null || sheetid == "") { - return "0"; - } - - var sheetobj = control.workbook.sheetArr[sheetid].sheet; - - var cell = sheetobj.cells[coord]; - - if (cell) { - return cell.datavalue; - } else { - return 0; - } - }; - - SocialCalc.GetCellDataArray = function (coordstr, sheetname) { - var vals = []; - var coords = coordstr.split(","); - if (sheetname == null) { - sheetname = ""; - } else { - sheetname = sheetname + "!"; - } - for (var c in coords) { - vals.push(SocialCalc.GetCellDataValue(sheetname + coords[c])); - } - return vals; - }; - - SocialCalc.UserScriptData = {}; - - SocialCalc.WorkBookRecalculateInfo = { - sheets: [], - calcorder: [], - current: 0, - pass: 0, - }; - - SocialCalc.WorkBookRecalculateAll = function () { - // do it from the last sheet to the first sheet - // using the recalc-done signal to trigger the next sheet - - // if already in the middle of a recalculate-all, ignore this. - if ( - SocialCalc.WorkBookRecalculateInfo.current != 0 || - SocialCalc.WorkBookRecalculateInfo.calcorder.length != 0 || - SocialCalc.WorkBookRecalculateInfo.sheets.length != 0 - ) { - return; - } - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - SocialCalc.WorkBookRecalculateInfo.current = 0; - - for (var sheet in control.workbook.sheetArr) { - SocialCalc.WorkBookRecalculateInfo.sheets.push(sheet); - } - - var i = 0; - for (var c = SocialCalc.WorkBookRecalculateInfo.sheets.length; c > 0; c--) { - SocialCalc.WorkBookRecalculateInfo.calcorder[i] = - SocialCalc.WorkBookRecalculateInfo.sheets[c - 1]; - i++; - } - window.setTimeout(SocialCalc.WorkBookRecalculateStep, 500); - }; - - SocialCalc.WorkBookRecalculateStep = function () { - if ( - SocialCalc.WorkBookRecalculateInfo.current == - SocialCalc.WorkBookRecalculateInfo.calcorder.length - ) { - SocialCalc.WorkBookRecalculateInfo.current = 0; - SocialCalc.WorkBookRecalculateInfo.calcorder = []; - SocialCalc.WorkBookRecalculateInfo.sheets = []; - if (SocialCalc.WorkBookRecalculateInfo.pass == 1) { - SocialCalc.WorkBookRecalculateInfo.pass = 0; - SocialCalc.SpinnerWaitHide(); - //alert("load done"); - return; - } else { - SocialCalc.WorkBookRecalculateInfo.pass++; - SocialCalc.WorkBookRecalculateAll(); - return; - } - } - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert("recalculate "+ - // SocialCalc.WorkBookRecalculateInfo.calcorder[ - // SocialCalc.WorkBookRecalculateInfo.current] - // ); - var sheetid = - SocialCalc.WorkBookRecalculateInfo.calcorder[ - SocialCalc.WorkBookRecalculateInfo.current - ]; - SocialCalc.WorkBookControlActivateSheet(sheetid); - SocialCalc.WorkBookRecalculateInfo.current++; - - window.setTimeout(SocialCalc.WorkBookRecalculateStep, 1000); - }; - - SocialCalc.SpinnerWaitCreate = function () { - // if the div exists already just use it - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - return; - } - var main = document.createElement("div"); - main.id = "waitloadingspinner"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - main.style.top = vp.height / 2 + "px"; - main.style.left = vp.width / 2 + "px"; - main.style.zIndex = 110; - - main.style.width = "50px"; - main.style.height = "50px"; - main.innerHTML = - 'Loading...'; - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.SpinnerWaitHide = function () { - // if the div exists already just use it - - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - ele.innerHTML = ""; - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - } - }; - - SocialCalc.EditableCells = {}; - SocialCalc.EditableCells.allow = false; - SocialCalc.EditableCells.cells = {}; - - SocialCalc.Callbacks.IsCoordEditable = function (sheetcoord) { - if (!SocialCalc.EditableCells.allow) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[sheetcoord]) { - // by default all cells are editable - return true; - } - - return false; - }; - - SocialCalc.Callbacks.IsCellEditable = function (editor) { - var cellname = editor.workingvalues.currentsheet + "!" + editor.ecell.coord; - if (!SocialCalc.EditableCells.allow) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[cellname]) { - // by default all cells are editable - return true; - } - - return false; - }; - - SocialCalc.IsScrollPossible = function ( - lastrow, - lastcol, - curr_vpos, - curr_hpos, - vamount, - hamount - ) { - //return false; - //console.log(lastrow+","+lastcol); - //console.log(curr_vpos+","+curr_hpos); - //console.log(vamount+","+hamount); - - if (curr_vpos + 10 + vamount > lastrow) { - return false; - } - if (curr_hpos + hamount > lastcol) { - return false; - } - return true; - }; - - // this is for checkmark toggling - SocialCalc.Callbacks.ToggleCell = function (cellname) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var sheetid = control.currentSheetButton.id; - var sheetobj = control.workbook.sheetArr[sheetid].sheet; - var cell = sheetobj.cells[cellname]; - var sheetname = sheetobj.sheetname; - - // check if cell is in constraints - //console.log(sheetname); - //console.log(cellname); - - var constraint = - SocialCalc.EditableCells.constraints[sheetname + "!" + cellname]; - if (!constraint || constraint[0] != "tc") { - return; - } - - var cellinner = document.getElementById("cell_" + cellname); - - if (cellinner.innerHTML.indexOf(" ") != -1) { - // set the value to the img value - cellinner.innerHTML = - '
'; - if (cell) { - //cell.displaystring = '
' ; - //cell.datavalue = '
' ; - //console.log("found cell") - cell.displaystring = - '
'; - cell.datavalue = - '
'; - //http://img689.imageshack.us/img689/9234/checkmark.png - } - } else { - // set the value to a space - cellinner.innerHTML = "
 
"; - if (cell) { - cell.datavalue = "
 
"; - cell.displaystring = "
 
"; - } - } - }; - - SocialCalc.WorkbookControlCreateSheetHTML = function (sheetlist) { - var context, div, ele; - - var result = ""; - - var control = SocialCalc.GetCurrentWorkBookControl(); - - div = document.createElement("div"); - - if (!sheetlist) { - context = new SocialCalc.RenderContext(spreadsheet.sheet); - ele = context.RenderSheet(null, { type: "html" }); - div.appendChild(ele); - context = undefined; - } else { - for (var sheetid in sheetlist) { - context = new SocialCalc.RenderContext( - control.workbook.sheetArr[sheetid].sheet - ); - ele = context.RenderSheet(null, { type: "html" }); - context = undefined; - div.appendChild(ele); - if (sheetid.substring(5) == control.sheetCnt) { - ele.style.pageBreakAfter = "auto"; - } else { - ele.style.pageBreakAfter = "always"; - } - } - } - - result = div.innerHTML; - ele = undefined; - div = undefined; - //console.log(result); - return result; - }; - - /* - http://www.JSON.org/json2.js - 2010-08-25 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date ? - 'Date(' + this[key] + ')' : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - - /*jslint evil: true, strict: false */ - - /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, - call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - // Create a JSON object only if one does not already exist. We create the - // methods in a closure to avoid creating global variables. - - if (!this.JSON) { - this.JSON = {}; - } - - (function () { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? "0" + n : n; - } - - if (typeof Date.prototype.toJSON !== "function") { - Date.prototype.toJSON = function (key) { - return isFinite(this.valueOf()) - ? this.getUTCFullYear() + - "-" + - f(this.getUTCMonth() + 1) + - "-" + - f(this.getUTCDate()) + - "T" + - f(this.getUTCHours()) + - ":" + - f(this.getUTCMinutes()) + - ":" + - f(this.getUTCSeconds()) + - "Z" - : null; - }; - - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = - function (key) { - return this.valueOf(); - }; - } - - var cx = - /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = - /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { - // table of character substitutions - "\b": "\\b", - "\t": "\\t", - "\n": "\\n", - "\f": "\\f", - "\r": "\\r", - '"': '\\"', - "\\": "\\\\", - }, - rep; - - function quote(string) { - // If the string contains no control characters, no quote characters, and no - // backslash characters, then we can safely slap some quotes around it. - // Otherwise we must also replace the offending characters with safe escape - // sequences. - - escapable.lastIndex = 0; - return escapable.test(string) - ? '"' + - string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === "string" - ? c - : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); - }) + - '"' - : '"' + string + '"'; - } - - function str(key, holder) { - // Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - - // If the value has a toJSON method, call it to obtain a replacement value. - - if ( - value && - typeof value === "object" && - typeof value.toJSON === "function" - ) { - value = value.toJSON(key); - } - - // If we were called with a replacer function, then call the replacer to - // obtain a replacement value. - - if (typeof rep === "function") { - value = rep.call(holder, key, value); - } - - // What happens next depends on the value's type. - - switch (typeof value) { - case "string": - return quote(value); - - case "number": - // JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : "null"; - - case "boolean": - case "null": - // If the value is a boolean or null, convert it to a string. Note: - // typeof null does not produce 'null'. The case is included here in - // the remote chance that this gets fixed someday. - - return String(value); - - // If the type is 'object', we might be dealing with an object or an array or - // null. - - case "object": - // Due to a specification blunder in ECMAScript, typeof null is 'object', - // so watch out for that case. - - if (!value) { - return "null"; - } - - // Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - - // Is the value an array? - - if (Object.prototype.toString.apply(value) === "[object Array]") { - // The value is an array. Stringify every element. Use null as a placeholder - // for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || "null"; - } - - // Join all of the elements together, separated with commas, and wrap them in - // brackets. - - v = - partial.length === 0 - ? "[]" - : gap - ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" - : "[" + partial.join(",") + "]"; - gap = mind; - return v; - } - - // If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === "object") { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === "string") { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ": " : ":") + v); - } - } - } - } else { - // Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ": " : ":") + v); - } - } - } - } - - // Join all of the member texts together, separated with commas, - // and wrap them in braces. - - v = - partial.length === 0 - ? "{}" - : gap - ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" - : "{" + partial.join(",") + "}"; - gap = mind; - return v; - } - } - - // If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== "function") { - JSON.stringify = function (value, replacer, space) { - // The stringify method takes a value and an optional replacer, and an optional - // space parameter, and returns a JSON text. The replacer can be a function - // that can replace values, or an array of strings that will select the keys. - // A default replacer method can be provided. Use of the space parameter can - // produce text that is more easily readable. - - var i; - gap = ""; - indent = ""; - - // If the space parameter is a number, make an indent string containing that - // many spaces. - - if (typeof space === "number") { - for (i = 0; i < space; i += 1) { - indent += " "; - } - - // If the space parameter is a string, it will be used as the indent string. - } else if (typeof space === "string") { - indent = space; - } - - // If there is a replacer, it must be a function or an array. - // Otherwise, throw an error. - - rep = replacer; - if ( - replacer && - typeof replacer !== "function" && - (typeof replacer !== "object" || typeof replacer.length !== "number") - ) { - throw new Error("JSON.stringify"); - } - - // Make a fake root object containing our value under the key of ''. - // Return the result of stringifying the value. - - return str("", { "": value }); - }; - } - - // If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== "function") { - JSON.parse = function (text, reviver) { - // The parse method takes a text and an optional reviver function, and returns - // a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - // The walk method is used to recursively walk the resulting structure so - // that modifications can be made. - - var k, - v, - value = holder[key]; - if (value && typeof value === "object") { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - // Parsing happens in four stages. In the first stage, we replace certain - // Unicode characters with escape sequences. JavaScript handles many characters - // incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - - // In the second stage, we run the text against regular expressions that look - // for non-JSON patterns. We are especially concerned with '()' and 'new' - // because they can cause invocation, and '=' because it can cause mutation. - // But just to be safe, we want to reject all unexpected forms. - - // We split the second stage into 4 regexp operations in order to work around - // crippling inefficiencies in IE's and Safari's regexp engines. First we - // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we - // replace all simple value tokens with ']' characters. Third, we delete all - // open brackets that follow a colon or comma or that begin the text. Finally, - // we look to see that the remaining characters are only whitespace or ']' or - // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if ( - /^[\],:{}\s]*$/.test( - text - .replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") - .replace( - /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - "]" - ) - .replace(/(?:^|:|,)(?:\s*\[)+/g, "") - ) - ) { - // In the third stage we use the eval function to compile the text into a - // JavaScript structure. The '{' operator is subject to a syntactic ambiguity - // in JavaScript: it can begin a block or an object literal. We wrap the text - // in parens to eliminate the ambiguity. - - j = eval("(" + text + ")"); - - // In the optional fourth stage, we recursively walk the new structure, passing - // each name/value pair to a reviver function for possible transformation. - - return typeof reviver === "function" ? walk({ "": j }, "") : j; - } - - // If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError("JSON.parse"); - }; - } - })(); - - SocialCalc.oldBtnActive = 1; - SocialCalc.Constants.defaultImagePrefix = "/socialcalc/images/sc-"; - SocialCalc.Constants.defaultGridCSS = ""; - SocialCalc.Constants.SCNoColNames = true; - SocialCalc.Constants.SCNoRowName = true; - SocialCalc.Constants.defaultRownameStyle = ""; - SocialCalc.Constants.defaultSelectedRownameStyle = ""; - SocialCalc.Popup.imagePrefix = "/socialcalc/images/sc-"; - - SocialCalc.ToggleInputLineButtons = function (show) { - var bele = document.getElementById("testtest"); - if (!bele) return; - if (show) { - bele.style.display = "inline"; - } else { - bele.style.display = "none"; - } - }; - - SocialCalc.InputLineClearText = function () { - spreadsheet.editor.inputBox.SetText(""); - }; - - SocialCalc.Callbacks.broadcast = function (type, data) {}; - - // END OF FILE - - if ("undefined" === typeof document) { - // We don't really need a DOM-based presentation layer on the server - SocialCalc.GetEditorCellElement = function () {}; - SocialCalc.ReplaceCell = function () {}; - SocialCalc.EditorRenderSheet = function () {}; - SocialCalc.SpreadsheetControlSortSave = function () { - return ""; - }; - SocialCalc.SpreadsheetControlStatuslineCallback = function () {}; - SocialCalc.DoPositionCalculations = function (editor) { - SocialCalc.EditorSheetStatusCallback(null, "doneposcalc", null, editor); - }; - } - - // Compatibility with webworker-threads - if (typeof self !== "undefined" && self.thread) { - window.setTimeout = function (cb, ms) { - if (ms <= 1) { - self.thread.nextTick(cb); - } - }; - window.clearTimeout = function () {}; - } - - // Just return a value to define the module export. - return SocialCalc; -}); diff --git a/DeveloperAdoption/app/Components/SocialCalc/index.js b/DeveloperAdoption/app/Components/SocialCalc/index.js deleted file mode 100644 index 80195bb..0000000 --- a/DeveloperAdoption/app/Components/SocialCalc/index.js +++ /dev/null @@ -1,25 +0,0 @@ -const SocialCalc = require("./aspiring/SocialCalc.js"); - -export function getDeviceType() { - /* Returns the type of the device */ - var device = "default"; - if (navigator.userAgent.match(/iPod/)) device = "iPod"; - if (navigator.userAgent.match(/iPad/)) device = "iPad"; - if (navigator.userAgent.match(/iPhone/)) device = "iPhone"; - if (navigator.userAgent.match(/Android/)) device = "Android"; - return device; -} - -export function initializeApp(data) { - /* Initializes the spreadsheet */ - - let tableeditor = document.getElementById("tableeditor"); - let spreadsheet = new SocialCalc.SpreadsheetControl(); - let workbook = new SocialCalc.WorkBook(spreadsheet); - workbook.InitializeWorkBook("sheet1"); - - spreadsheet.InitializeSpreadsheetControl(tableeditor, 0, 0, 0); - - - -} diff --git a/DeveloperAdoption/app/Login/page.jsx b/DeveloperAdoption/app/Login/page.jsx deleted file mode 100644 index e13a1d5..0000000 --- a/DeveloperAdoption/app/Login/page.jsx +++ /dev/null @@ -1,230 +0,0 @@ -"use client"; -import { useState } from "react"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faUser, faLock, faSignInAlt } from "@fortawesome/free-solid-svg-icons"; -import Link from "next/link"; -import { useRouter } from "next/navigation"; -import { auth } from "../../lib/firebaseConfig"; -import { signInWithEmailAndPassword } from "firebase/auth"; -import Image from "next/image"; -import background2 from "../../public/Login.jpg"; -import { motion } from "framer-motion"; - -const Login = () => { - const [email, setEmail] = useState(""); - const [password, setPassword] = useState(""); - const [errorMessage, setErrorMessage] = useState(""); - const [loading, setLoading] = useState(false); - const router = useRouter(); - - const handleSubmit = async (e) => { - e.preventDefault(); - setLoading(true); - - if (email === "" || password === "") { - setErrorMessage("Please enter both email and password."); - setLoading(false); - return; - } - - try { - const userCredential = await signInWithEmailAndPassword( - auth, - email, - password - ); - const user = userCredential.user; - console.log("User logged in:", user); - const idToken = await userCredential.user.getIdToken(); - - // Send the ID token to your API to set the session cookie - const response = await fetch("/api/auth/session", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ idToken }), - }); - - if (response.ok) { - // Redirect to dashboard or handle successful login - router.push("/") - } else { - // Handle error - setErrorMessage("Failed to set session"); - } - } catch (error) { - console.error("Error logging in:", error.message); - setErrorMessage("Invalid email or password."); - } finally { - setLoading(false); - } - }; - - return ( -
-
- - -
- -
-
- - Welcome! - -

- Sign in to your account -

- {errorMessage && ( - - {errorMessage} - - )} - -
- -
- setEmail(e.target.value)} - required - /> - -
-
-
- -
- setPassword(e.target.value)} - required - /> - -
-
-
-
- - -
- - Sign Up - -
- - {loading ? ( - -
-
- ) : ( - "Login" - )} -
-
- - - Forgot Password? - - -
- - - Login Background - -
-
- ); -}; - -export default Login; diff --git a/DeveloperAdoption/app/Login/password-reset/page.jsx b/DeveloperAdoption/app/Login/password-reset/page.jsx deleted file mode 100644 index 46267a9..0000000 --- a/DeveloperAdoption/app/Login/password-reset/page.jsx +++ /dev/null @@ -1,119 +0,0 @@ -"use client"; - -import { useState } from "react"; -import { sendPasswordResetEmail } from "firebase/auth"; -import { auth } from "../../../lib/firebaseConfig"; -import { motion } from "framer-motion"; - -const PasswordReset = () => { - const [email, setEmail] = useState(""); - const [message, setMessage] = useState(""); - const [error, setError] = useState(""); - const [loading, setLoading] = useState(false); - - const handleResetRequest = async (e) => { - e.preventDefault(); - setLoading(true); - - try { - await sendPasswordResetEmail(auth, email); - setMessage("If an account with that email exists, a password reset link has been sent."); - setError(""); - } catch (error) { - if (error.code === "auth/invalid-email") { - setError("Invalid email address format."); - } else if (error.code === "auth/user-not-found") { - setError("No account found with this email address."); - } else { - setError("Failed to send password reset email. Please try again."); - } - setMessage(""); - } finally { - setLoading(false); - } - }; - - return ( -
- - - Reset Password - -

Enter your email to receive a password reset link.

- {message && ( - - {message} - - )} - {error && ( - - {error} - - )} - -
- - setEmail(e.target.value)} - required - /> -
- - {loading ? ( - -
-
- ) : ( - "Send Reset Link" - )} -
-
-
-
- ); -}; - -export default PasswordReset; diff --git a/DeveloperAdoption/app/SignUp/page.jsx b/DeveloperAdoption/app/SignUp/page.jsx deleted file mode 100644 index 3ba4f35..0000000 --- a/DeveloperAdoption/app/SignUp/page.jsx +++ /dev/null @@ -1,224 +0,0 @@ -"use client"; -import React, { useState } from "react"; -import { useRouter } from "next/navigation"; -import { createUserWithEmailAndPassword, updateProfile } from "firebase/auth"; -import { auth } from "../../lib/firebaseConfig"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faUser, faEnvelope, faLock } from "@fortawesome/free-solid-svg-icons"; -import Link from "next/link"; -import { motion } from "framer-motion"; -import background from "../../public/SignUp.avif"; -import Image from "next/image"; - -export default function SignUp() { - const [name, setName] = useState(""); - const [email, setEmail] = useState(""); - const [password, setPassword] = useState(""); - const [errorMessage, setErrorMessage] = useState(""); - const [loading, setLoading] = useState(false); - const router = useRouter(); - - const handleSubmit = async (e) => { - e.preventDefault(); - setLoading(true); - - if (name === "" || email === "" || password === "") { - setErrorMessage("Please fill in all fields."); - setLoading(false); - return; - } - - try { - const userCredential = await createUserWithEmailAndPassword(auth, email, password); - const user = userCredential.user; - - // Update the user's profile with the display name - await updateProfile(user, { displayName: name }); - - // Force the ID token to refresh so that it reflects the updated profile - await user.reload(); - const idToken = await user.getIdToken(true); // Passing true refreshes the token - - // Send the refreshed ID token to your API to set the session cookie - const response = await fetch("/api/auth/session", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ idToken }), - }); - - if (response.ok) { - // Redirect to the dashboard or handle successful login - router.push("/"); - } else { - // Handle error - setErrorMessage("Failed to set session"); - } - } catch (error) { - setErrorMessage(error.message); - } finally { - setLoading(false); - } - }; - - return ( -
-
- - -
- -
-
- - Create an Account - - {errorMessage && ( - - {errorMessage} - - )} - -
- -
- setName(e.target.value)} - required - /> - -
-
-
- -
- setEmail(e.target.value)} - required - /> - -
-
-
- -
- setPassword(e.target.value)} - required - /> - -
-
- - {loading ? ( - -
-
- ) : ( - "Create Account" - )} -
-
- - - Already have an account? Log in - - -
- - - Signup Background - -
-
- ); -} diff --git a/DeveloperAdoption/app/Spreadsheet/[Id]/route.js b/DeveloperAdoption/app/Spreadsheet/[Id]/route.js deleted file mode 100644 index 60e6ab6..0000000 --- a/DeveloperAdoption/app/Spreadsheet/[Id]/route.js +++ /dev/null @@ -1,75 +0,0 @@ -import { NextResponse } from "next/server"; -import path from "path"; -import { promises as fs } from "fs"; -import nunjucks from "nunjucks"; -import { getFirebaseAdmin } from "@/lib/firebaseAdmin"; // Import your Firebase Admin setup -import { cookies } from "next/headers"; -import { verifySessionCookie } from "@/lib/verifySession"; - -// Configure Nunjucks -const templatesDir = path.join(process.cwd(), "public"); -nunjucks.configure(templatesDir, { autoescape: true }); - -export async function GET(request, { params }) { - const session = cookies().get("session")?.value; - if (!session) { - return NextResponse.json({ error: "No session provided" }, { status: 400 }); - } - const { Id } = params; - const sessionData = await verifySessionCookie(session); - if (!sessionData) { - return NextResponse.json({ error: "Invalid session." }, { status: 400 }); - } - // Initialize Firebase Admin - const admin = await getFirebaseAdmin(); - const db = admin.firestore(); - const storage = admin.storage(); - - try { - // Retrieve file metadata from Firestore - const userDocRef = db.collection("users").doc(sessionData.email); - const userDoc = await userDocRef.get(); - - if (!userDoc.exists) { - return new NextResponse("Bad Request", { status: 400 }); - } - - const userData = userDoc.data(); - const fileMetadata = userData.files.find((file) => file.id === Id); - - if (!fileMetadata) { - return new NextResponse("File not found", { status: 404 }); - } - - const filePath = `users/${encodeURIComponent(sessionData.email)}/${ - fileMetadata.id - }`; - - // Download the file content from Firebase Storage - const file = storage - .bucket("sih-internal-4375c.appspot.com") - .file(filePath); - const [fileContent] = await file.download(); - - // Add code to process the content if needed - - const data = { - entry: { - sheetstr: fileContent.toString(), - fname: fileMetadata.fileName, - fid: fileMetadata.id, - }, - }; - const templatePath = "importcollabload.html"; // Path to the template file - - const renderedContent = nunjucks.render(templatePath, data); - - // Return the rendered content as an HTML response - return new NextResponse(renderedContent, { - headers: { "Content-Type": "text/html" }, - }); - } catch (error) { - console.error("Error retrieving file:", error); - return new NextResponse("Error retrieving file", { status: 500 }); - } -} diff --git a/DeveloperAdoption/app/api/User/route.js b/DeveloperAdoption/app/api/User/route.js deleted file mode 100644 index 94e5a6c..0000000 --- a/DeveloperAdoption/app/api/User/route.js +++ /dev/null @@ -1,232 +0,0 @@ -// app/api/user/setup/route.js -import { getFirebaseAdmin } from "@/lib/firebaseAdmin"; -import { NextResponse } from "next/server"; -import { verifySessionCookie } from "@/lib/verifySession"; -import { cookies } from "next/headers"; -import { v4 as uuidv4 } from "uuid"; - -export async function GET(request) { - const session = cookies().get("session")?.value; - if (!session) { - return NextResponse.json({ error: "No session provided" }, { status: 400 }); - } - try { - const sessionData = await verifySessionCookie(session); - if (!sessionData) { - return NextResponse.json( - { error: "No session provided" }, - { status: 400 } - ); - } - - const email = sessionData.email; - const admin = await getFirebaseAdmin(); - - const db = admin.firestore(); - const storage = admin.storage(); - - const userDocRef = db.collection("users").doc(email); - // Get the current date - const currentDate = new Date(); - - // Format the date to `dd/mm/yyyy` - const formattedDate = new Intl.DateTimeFormat("en-GB").format(currentDate); - const userDoc = await userDocRef.get(); - const id = uuidv4(); - // If the user document does not exist, create it with default fields - if (!userDoc.exists) { - await userDocRef.set({ - name: sessionData.name, - createdAt: admin.firestore.FieldValue.serverTimestamp(), - files: [{ fileName: "default", createdAt: formattedDate, id: id }], - }); - - // Assuming content is passed in the request body - const content = ""; - // Create a file in Firebase Storage - const file = storage - .bucket("sih-internal-4375c.appspot.com") - .file(`users/${encodeURIComponent(email)}/${id}`); - await file.save(content, { - metadata: { - contentType: "text/plain", - }, - }); - - return NextResponse.json( - { message: "User document and file created successfully." }, - { status: 201 } - ); - } else { - // If the user document exists, return the existing document - const userData = userDoc.data(); - return NextResponse.json({ user: userData }, { status: 200 }); - } - } catch (error) { - console.error("Error setting up user:", error); - return NextResponse.json( - { error: "Failed to set up user." }, - { status: 500 } - ); - } -} -export async function POST(request) { - const session = cookies().get("session")?.value; - if (!session) { - return NextResponse.json({ error: "No session provided" }, { status: 400 }); - } - try { - const sessionData = await verifySessionCookie(session); - if (!sessionData) { - return NextResponse.json({ error: "Invalid session." }, { status: 400 }); - } - - const { fileName } = await request.json(); - // Check if fileName is provided - if (!fileName) { - return NextResponse.json( - { error: "fileName is required." }, - { status: 400 } - ); - } - - const email = sessionData.email; - const admin = await getFirebaseAdmin(); - const db = admin.firestore(); - const storage = admin.storage(); - - const userDocRef = db.collection("users").doc(email); - const userDoc = await userDocRef.get(); - const id = uuidv4(); - const currentDate = new Date(); - const formattedDate = new Intl.DateTimeFormat("en-GB").format(currentDate); - - if (!userDoc.exists) { - return NextResponse.json({ error: "User not found." }, { status: 404 }); - } - - const userFiles = userDoc.data().files || []; - userFiles.push({ fileName, createdAt: formattedDate, id }); - - await userDocRef.update({ files: userFiles }); - - const content = ""; - const file = storage - .bucket("sih-internal-4375c.appspot.com") - .file(`users/${encodeURIComponent(email)}/${id}`); - await file.save(content, { - metadata: { - contentType: "text/plain", - }, - }); - - return NextResponse.json( - { message: "File created and user document updated." }, - { status: 201 } - ); - } catch (error) { - console.error("Error creating file:", error); - return NextResponse.json( - { error: "Failed to create file." }, - { status: 500 } - ); - } -} - -export async function PUT(request) { - const session = cookies().get("session")?.value; - if (!session) { - return NextResponse.json({ error: "No session provided" }, { status: 400 }); - } - try { - const { id, fileName } = await request.json(); - const sessionData = await verifySessionCookie(session); - if (!sessionData) { - return NextResponse.json({ error: "Invalid session." }, { status: 400 }); - } - - const email = sessionData.email; - const admin = await getFirebaseAdmin(); - const db = admin.firestore(); - - const userDocRef = db.collection("users").doc(email); - const userDoc = await userDocRef.get(); - - if (!userDoc.exists) { - return NextResponse.json({ error: "User not found." }, { status: 404 }); - } - - const userFiles = userDoc.data().files || []; - const fileIndex = userFiles.findIndex((file) => file.id === id); - if (fileIndex === -1) { - return NextResponse.json({ error: "File not found." }, { status: 404 }); - } - - userFiles[fileIndex].fileName = fileName; - await userDocRef.update({ files: userFiles }); - - return NextResponse.json( - { message: "File renamed successfully." }, - { status: 200 } - ); - } catch (error) { - console.error("Error renaming file:", error); - return NextResponse.json( - { error: "Failed to rename file." }, - { status: 500 } - ); - } -} - -export async function DELETE(request) { - const session = cookies().get("session")?.value; - if (!session) { - return NextResponse.json({ error: "No session provided" }, { status: 400 }); - } - try { - const { id } = await request.json(); - const sessionData = await verifySessionCookie(session); - if (!sessionData) { - return NextResponse.json({ error: "Invalid session." }, { status: 400 }); - } - - const email = sessionData.email; - const admin = await getFirebaseAdmin(); - const db = admin.firestore(); - const storage = admin.storage(); - - const userDocRef = db.collection("users").doc(email); - const userDoc = await userDocRef.get(); - - if (!userDoc.exists) { - return NextResponse.json({ error: "User not found." }, { status: 404 }); - } - - const userFiles = userDoc.data().files || []; - const fileIndex = userFiles.findIndex((file) => file.id === id); - if (fileIndex === -1) { - return NextResponse.json({ error: "File not found." }, { status: 404 }); - } - - const filePath = `users/${encodeURIComponent(email)}/${id}`; - const file = storage - .bucket("sih-internal-4375c.appspot.com") - .file(filePath); - - await file.delete(); - userFiles.splice(fileIndex, 1); - - await userDocRef.update({ files: userFiles }); - - return NextResponse.json( - { message: "File deleted successfully." }, - { status: 200 } - ); - } catch (error) { - console.error("Error deleting file:", error); - return NextResponse.json( - { error: "Failed to delete file." }, - { status: 500 } - ); - } -} diff --git a/DeveloperAdoption/app/api/auth/logout/route.js b/DeveloperAdoption/app/api/auth/logout/route.js deleted file mode 100644 index f136c0f..0000000 --- a/DeveloperAdoption/app/api/auth/logout/route.js +++ /dev/null @@ -1,35 +0,0 @@ -import { NextResponse } from 'next/server'; -import { getFirebaseAdmin } from '@/lib/firebaseAdmin'; -import { cookies } from 'next/headers'; - -export async function POST(request) { - const admin = await getFirebaseAdmin(); - const auth = admin.auth(); - - try { - // Get the session cookie from the request (assuming it's sent as a cookie) - const sessionCookie = cookies().get("session")?.value; - - // Verify and revoke the session - if (sessionCookie) { - const decodedClaims = await auth.verifySessionCookie(sessionCookie); - await auth.revokeRefreshTokens(decodedClaims.sub); - } - - // Clear the session cookie - const response = NextResponse.json({ success: true }, { status: 200 }); - response.cookies.set({ - name: 'session', - value: '', - maxAge: -1, // This will delete the cookie - httpOnly: true, - secure: process.env.NODE_ENV === 'production', - path: '/', - }); - - return response; - } catch (error) { - console.error('Failed to logout:', error); - return NextResponse.json({ error: 'Failed to logout' }, { status: 500 }); - } -} diff --git a/DeveloperAdoption/app/api/auth/session/route.js b/DeveloperAdoption/app/api/auth/session/route.js deleted file mode 100644 index 0a97c9f..0000000 --- a/DeveloperAdoption/app/api/auth/session/route.js +++ /dev/null @@ -1,29 +0,0 @@ -import { NextResponse } from 'next/server'; -import { getFirebaseAdmin } from '@/lib/firebaseAdmin'; - -export async function POST(request) { - const { idToken } = await request.json(); - const admin = await getFirebaseAdmin(); - const auth = admin.auth() - - try { - const expiresIn = 60 * 60 * 24 * 5 * 1000; // 5 days - const sessionCookie = await auth.createSessionCookie(idToken, { expiresIn }); - - const response = NextResponse.json({ success: true }, { status: 200 }); - - response.cookies.set({ - name: 'session', - value: sessionCookie, - maxAge: expiresIn / 1000, // Convert to seconds - httpOnly: true, - secure: process.env.NODE_ENV === 'production', - path: '/', - }); - - return response; - } catch (error) { - console.error('Failed to create session:', error); - return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); - } -} \ No newline at end of file diff --git a/DeveloperAdoption/app/api/auth/verify-session/route.js b/DeveloperAdoption/app/api/auth/verify-session/route.js deleted file mode 100644 index 4a6af0c..0000000 --- a/DeveloperAdoption/app/api/auth/verify-session/route.js +++ /dev/null @@ -1,19 +0,0 @@ -import { NextResponse } from 'next/server'; -import { getFirebaseAdmin } from '@/lib/firebaseAdmin'; - -export async function POST(request) { - const { session } = await request.json(); - - if (!session) { - return NextResponse.json({ error: 'No session provided' }, { status: 400 }); - } - - try { - const admin = await getFirebaseAdmin(); - const decodedClaims = await admin.auth().verifySessionCookie(session, true); - return NextResponse.json({ uid: decodedClaims.uid }, { status: 200 }); - } catch (error) { - console.error('Session verification failed:', error); - return NextResponse.json({ error: 'Invalid session' }, { status: 401 }); - } -} \ No newline at end of file diff --git a/DeveloperAdoption/app/api/download/route.js b/DeveloperAdoption/app/api/download/route.js deleted file mode 100644 index 226aaa3..0000000 --- a/DeveloperAdoption/app/api/download/route.js +++ /dev/null @@ -1,132 +0,0 @@ -import * as XLSX from 'xlsx'; -import { unparse } from 'papaparse'; -import { NextResponse } from 'next/server'; - -function socialCalcToJson(socialCalcData) { - - if (typeof socialCalcData === 'string') { - try { - socialCalcData = JSON.parse(socialCalcData); - } catch (error) { - console.error('Error parsing JSON string:', error); - throw new Error('Invalid JSON string'); - } - } - - if (!socialCalcData || !socialCalcData.sheetArr || !socialCalcData.currentid) { - console.error('Invalid SocialCalc data structure:', JSON.stringify(socialCalcData)); - throw new Error('Invalid SocialCalc data structure'); - } - - const sheet = socialCalcData.sheetArr[socialCalcData.currentid]; - if (!sheet || !sheet.sheetstr || !sheet.sheetstr.savestr) { - console.error('Invalid sheet structure:', JSON.stringify(sheet)); - throw new Error('Invalid sheet structure'); - } - - const cells = sheet.sheetstr.savestr.split('\n'); - const cellData = {}; - let maxRow = 0; - let maxCol = 0; - - cells.forEach(cell => { - if (cell.startsWith('cell:')) { - const [, cellRef, , value] = cell.split(':'); - const match = cellRef.match(/([A-Z]+)(\d+)/); - if (match) { - const [, colLetters, rowNum] = match; - const row = parseInt(rowNum, 10); - const col = colLetters.split('').reduce((acc, letter) => acc * 26 + letter.charCodeAt(0) - 64, 0); - cellData[`${row},${col}`] = value || ''; - maxRow = Math.max(maxRow, row); - maxCol = Math.max(maxCol, col); - } - } - }); - - console.log(`Max row: ${maxRow}, Max col: ${maxCol}`); - - // Create rows with proper length - const rows = []; - for (let i = 1; i <= maxRow; i++) { - const row = new Array(maxCol).fill(''); - for (let j = 1; j <= maxCol; j++) { - row[j-1] = cellData[`${i},${j}`] || ''; - } - rows.push(row); - } - - console.log('Processed rows:', JSON.stringify(rows)); - return rows; -} - -function manualCsvGeneration(rows) { - return rows.map(row => row.map(cell => { - if (cell === null || cell === undefined) return ''; - return `"${String(cell).replace(/"/g, '""')}"`; - }).join(',')).join('\n'); -} - -export async function POST(req) { - try { - const data = await req.formData(); - const type = data.get('type'); - let content = data.get('content'); - let fileBuffer; - let fileType; - let fileName; - - // Parse content if it's a string - if (typeof content === 'string') { - try { - content = JSON.parse(content); - } catch (error) { - console.error('Error parsing content JSON:', error); - return NextResponse.json({ error: 'Invalid JSON content' }, { status: 400 }); - } - } - - const rows = socialCalcToJson(content); - console.log('Rows after socialCalcToJson:', JSON.stringify(rows)); - - if (type === 'excel') { - const worksheet = XLSX.utils.aoa_to_sheet(rows); - const workbook = XLSX.utils.book_new(); - XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); - const excelBuffer = XLSX.write(workbook, { type: 'buffer', bookType: 'xlsx' }); - fileBuffer = Buffer.from(excelBuffer); - fileType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; - fileName = 'sheet.xlsx'; - } else if (type === 'csv') { - if (!Array.isArray(rows) || rows.length === 0) { - console.error('Invalid rows data for CSV:', JSON.stringify(rows)); - throw new Error('No valid data to convert to CSV'); - } - let csvString; - try { - console.log('Attempting to use PapaParse'); - csvString = unparse(rows); - console.log('PapaParse successful'); - } catch (error) { - console.error('PapaParse failed, using manual CSV generation:', error); - csvString = manualCsvGeneration(rows); - } - fileBuffer = Buffer.from(csvString); - fileType = 'text/csv'; - fileName = 'sheet.csv'; - } else { - return NextResponse.json({ error: 'Invalid type specified' }, { status: 400 }); - } - - console.log('File created successfully'); - return new NextResponse(fileBuffer, { - headers: { - 'Content-Type': fileType, - 'Content-Disposition': `attachment; filename="${fileName}"`, - }, - }); - } catch (error) { - console.error('Error in POST function:', error); - return NextResponse.json({ error: 'Failed to process request: ' + error.message }, { status: 500 }); - } -} \ No newline at end of file diff --git a/DeveloperAdoption/app/api/import/route.js b/DeveloperAdoption/app/api/import/route.js deleted file mode 100644 index cf03e8a..0000000 --- a/DeveloperAdoption/app/api/import/route.js +++ /dev/null @@ -1,80 +0,0 @@ -import { NextResponse } from 'next/server'; -import * as XLSX from 'xlsx'; -import { parse } from 'papaparse'; - -export async function POST(req) { - try { - const formData = await req.formData(); - const file = formData.get('upload'); - - if (!file) { - return NextResponse.json({ error: 'No file uploaded' }, { status: 400 }); - } - - const fileName = file.name.toLowerCase(); - const fileBuffer = await file.arrayBuffer(); - - let data; - if (fileName.endsWith('.csv')) { - data = await processCsv(fileBuffer); - } else if (fileName.endsWith('.xlsx') || fileName.endsWith('.xls')) { - data = await processExcel(fileBuffer); - } else { - return NextResponse.json({ error: 'Unsupported file type' }, { status: 400 }); - } - - const jsonString = convertToSocialCalcFormat(data); - - return NextResponse.json({ data: jsonString }, { status: 200 }); - } catch (error) { - console.error('Error in import process:', error); - return NextResponse.json({ error: 'Failed to process file: ' + error.message }, { status: 500 }); - } -} - -async function processCsv(buffer) { - const text = new TextDecoder().decode(buffer); - return new Promise((resolve, reject) => { - parse(text, { - complete: (results) => resolve(results.data), - error: (error) => reject(error), - skipEmptyLines: true - }); - }); -} - -async function processExcel(buffer) { - const workbook = XLSX.read(buffer, { type: 'array' }); - const sheetName = workbook.SheetNames[0]; - const sheet = workbook.Sheets[sheetName]; - return XLSX.utils.sheet_to_json(sheet, { header: 1, defval: '' }); -} - -function convertToSocialCalcFormat(data) { - let cells = ''; - data.forEach((row, rowIndex) => { - row.forEach((cell, colIndex) => { - if (cell !== '') { - const colLetter = String.fromCharCode(65 + colIndex); - cells += `cell:${colLetter}${rowIndex + 1}:t:${cell}\n`; - } - }); - }); - - const socialCalcData = { - "sheetArr": { - "sheet1": { - "sheetstr": { - "savestr": cells - }, - "name": "sheet1", - "hidden": "0" - } - }, - "numsheets": 1, - "currentid": "sheet1", - "currentname": "sheet1" - }; - - return JSON.stringify(socialCalcData); -} \ No newline at end of file diff --git a/DeveloperAdoption/app/api/save/route.js b/DeveloperAdoption/app/api/save/route.js deleted file mode 100644 index d890099..0000000 --- a/DeveloperAdoption/app/api/save/route.js +++ /dev/null @@ -1,70 +0,0 @@ -import { NextResponse } from "next/server"; -import { getFirebaseAdmin } from "@/lib/firebaseAdmin"; -import { verifySessionCookie } from "@/lib/verifySession"; -import { cookies } from "next/headers"; - -export async function POST(request) { - // Retrieve session cookie - const a = await request.formData(); - const session = cookies().get("session")?.value; - - // Read the request body for the file ID, new content, and new file name - const fid = a.get("fid"); - const content = a.get("content"); - const newFileName = a.get("newFileName"); - - if (!session || !fid || !content || !newFileName) { - return new NextResponse("Session, file ID, content, and new file name are required", { status: 400 }); - } - - try { - // Verify the session cookie - const sessionData = await verifySessionCookie(session); - if (!sessionData) { - return new NextResponse("Invalid session", { status: 401 }); - } - - const email = sessionData.email; - - // Initialize Firebase Admin - const admin = await getFirebaseAdmin(); - const db = admin.firestore(); - const storage = admin.storage(); - - // Retrieve file metadata from Firestore - const userDocRef = db.collection("users").doc(email); - const userDoc = await userDocRef.get(); - - if (!userDoc.exists) { - return new NextResponse("User not found", { status: 404 }); - } - - const userData = userDoc.data(); - const fileMetadata = userData.files.find((file) => file.id === fid); - - if (!fileMetadata) { - return new NextResponse("File metadata not found", { status: 404 }); - } - - // Update file metadata in Firestore - const updatedFiles = userData.files.map((file) => - file.id === fid ? { ...file, fileName: newFileName } : file - ); - - await userDocRef.update({ files: updatedFiles }); - - // Update the file content in Firebase Storage - const filePath = `users/${encodeURIComponent(email)}/${fileMetadata.id}`; - const file = storage.bucket("sih-internal-4375c.appspot.com").file(filePath); - await file.save(content, { - metadata: { - contentType: "text/plain", - }, - }); - - return new NextResponse("File updated successfully", { status: 200 }); - } catch (error) { - console.error("Error saving file:", error); - return new NextResponse("Error saving file", { status: 500 }); - } -} \ No newline at end of file diff --git a/DeveloperAdoption/app/favicon.ico b/DeveloperAdoption/app/favicon.ico deleted file mode 100644 index 9662506..0000000 Binary files a/DeveloperAdoption/app/favicon.ico and /dev/null differ diff --git a/DeveloperAdoption/app/globals.css b/DeveloperAdoption/app/globals.css deleted file mode 100644 index b5c61c9..0000000 --- a/DeveloperAdoption/app/globals.css +++ /dev/null @@ -1,3 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/DeveloperAdoption/app/layout.js b/DeveloperAdoption/app/layout.js deleted file mode 100644 index 3709c6a..0000000 --- a/DeveloperAdoption/app/layout.js +++ /dev/null @@ -1,20 +0,0 @@ -import { Inter } from "next/font/google"; -import "./globals.css"; - -const inter = Inter({ subsets: ["latin"] }); - -export const metadata = { - title: "SpreadX | Qubit", - description: "Spreadx By Qubit", -}; - -export default function RootLayout({ children }) { - return ( - - - - - {children} - - ); -} diff --git a/DeveloperAdoption/app/page.jsx b/DeveloperAdoption/app/page.jsx deleted file mode 100644 index 0a2c9ac..0000000 --- a/DeveloperAdoption/app/page.jsx +++ /dev/null @@ -1,605 +0,0 @@ -"use client"; -import React, { useEffect, useState, useRef } from "react"; -import { onAuthStateChanged, signOut } from "firebase/auth"; -import { auth } from "../lib/firebaseConfig"; -import Image from "next/image"; -import add from "../public/Adder.png"; -import Logo from "../public/Logo.png"; -import { useRouter } from "next/navigation"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { - faSignOutAlt, - faTimes, - faEdit, - faTrash, - faEllipsisV, - faFolderPlus, - faSearch, -} from "@fortawesome/free-solid-svg-icons"; -import { motion, AnimatePresence } from "framer-motion"; - -function Dashboard() { - const [user, setUser] = useState(null); - const [isDropdownOpen, setIsDropdownOpen] = useState(false); - const [isSpreadsheetDropdownOpen, setIsSpreadsheetDropdownOpen] = - useState(false); - const [spreadsheetName, setSpreadsheetName] = useState(""); - const [createdSheets, setCreatedSheets] = useState([]); - const [editingSheetIndex, setEditingSheetIndex] = useState(null); - const [newName, setNewName] = useState(""); - const [dropdownIndex, setDropdownIndex] = useState(null); - const router = useRouter(); - const dropdownRef = useRef(null); - const [refresh, setRefresh] = useState(0); - const [loading, setLoading] = useState(true); - const [openingSpreadsheet, setOpeningSpreadsheet] = useState(false); - const [searchQuery, setSearchQuery] = useState(""); - - const handleRename = (index, e) => { - e.stopPropagation(); - setEditingSheetIndex(index); - setNewName(createdSheets[index].name); - setDropdownIndex(null); - }; - - const filterSheets = (sheets) => { - return sheets.filter((sheet) => - sheet.fileName.toLowerCase().includes(searchQuery.toLowerCase()) - ); - }; - - useEffect(() => { - const unsubscribe = onAuthStateChanged(auth, (user) => { - if (user) { - setUser(user); - } else { - setUser(null); - router.replace("/Login"); - } - }); - - return () => unsubscribe(); - }, []); - - useEffect(() => { - setLoading(true); - async function getUserData() { - try { - const response = await fetch("/api/User", { - method: "GET", - }); - - if (!response.ok) { - throw new Error(`Error: ${response.statusText}`); - } - - const data = await response.json(); - console.log(data); - setCreatedSheets(data.user.files); - console.log("User Data:", data); - setTimeout(() => setLoading(false), 1000); - } catch (error) { - console.error("Failed to fetch user data:", error); - } - } - getUserData(); - }, [refresh]); - - useEffect(() => { - setLoading(true); - async function getUserData() { - try { - const response = await fetch("/api/User", { - method: "GET", - }); - - if (!response.ok) { - throw new Error(`Error: ${response.statusText}`); - } - - const data = await response.json(); - setCreatedSheets(data.user.files); - setTimeout(() => setLoading(false), 1000); - setLoading(false); - } catch (error) { - console.error("Failed to fetch user data:", error); - setLoading(false); - } - } - getUserData(); - }, [refresh]); - - useEffect(() => { - const handleClickOutside = (event) => { - if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { - setDropdownIndex(null); - } - }; - - document.addEventListener("mousedown", handleClickOutside); - return () => document.removeEventListener("mousedown", handleClickOutside); - }, []); - - useEffect(() => { - console.log("Page Refreshed"); - }, [refresh]); - - const getFirstName = () => { - if (user && user.displayName) { - const names = user.displayName.split(" "); - return names[0]; - } - return "User"; - }; - - const handleSignOut = async () => { - try { - const response = await logoutUser(); - - if (response.ok) { - await signOut(auth); - router.push("/Login"); - } else { - console.error("Server logout failed"); - } - } catch (error) { - console.error("Sign out error:", error); - } - }; - - async function logoutUser() { - try { - const response = await fetch("/api/auth/logout", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - credentials: "include", - }); - - if (!response.ok) { - throw new Error("Failed to logout"); - } - - const data = await response.json(); - - if (data.success) { - console.log("Logout successful"); - } else { - console.error("Logout failed:", data.error); - } - - return response; - } catch (error) { - console.error("An error occurred during logout:", error); - throw error; - } - } - - async function createFile(fileName) { - try { - const response = await fetch("/api/User", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ fileName }), - }); - - if (!response.ok) { - throw new Error(`Error: ${response.statusText}`); - } - - const data = await response.json(); - console.log("File Created:", data); - setRefresh(refresh + 1); - } catch (error) { - console.error("Failed to create file:", error); - } - } - const handleSpreadsheetCreate = () => { - setLoading(true) - const spreadsheetNameTrim = spreadsheetName.trim(); - if (spreadsheetNameTrim) { - createFile(spreadsheetNameTrim); - setIsSpreadsheetDropdownOpen(false); - setSpreadsheetName(""); - } - }; - - const handleSpreadsheetOpen = (id) => { - setOpeningSpreadsheet(true); - router.push(`/Spreadsheet/${id}`); - setOpeningSpreadsheet(false); - }; - - const Loader = () => ( -
-
-
- ); - - async function deleteFile(id) { - try { - const response = await fetch("/api/User", { - method: "DELETE", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ id }), - }); - - if (!response.ok) { - throw new Error(`Error: ${response.statusText}`); - } - - const data = await response.json(); - console.log("File Deleted:", data); - setRefresh(refresh + 1); - } catch (error) { - console.error("Failed to delete file:", error); - } - } - - const handleRemove = (index) => { - setLoading(true) - deleteFile(createdSheets[index].id); - }; - - async function renameFile(id, fileName) { - try { - const response = await fetch("/api/User", { - method: "PUT", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ id, fileName }), - }); - - if (!response.ok) { - throw new Error(`Error: ${response.statusText}`); - } - - const data = await response.json(); - console.log("File Renamed:", data); - setEditingSheetIndex(null); - setRefresh(refresh + 1); - } catch (error) { - console.error("Failed to rename file:", error); - } - } - - const handleSaveRename = (index, e) => { - e.stopPropagation(); // Prevent the click from bubbling up - setEditingSheetIndex(null); - setLoading(true); - renameFile(createdSheets[index].id, newName); - }; - - const getCurrentDateTime = () => { - const now = new Date(); - const options = { - year: "numeric", - month: "short", - day: "numeric", - hour: "2-digit", - minute: "2-digit", - }; - return now.toLocaleDateString("en-US", options); - }; - - const groupSheetsByDate = () => { - const today = new Date().toLocaleDateString("en-GB"); - const yesterday = new Date( - new Date().setDate(new Date().getDate() - 1) - ).toLocaleDateString("en-GB"); - - const groupedSheets = { - Today: [], - Yesterday: [], - Earlier: [], - }; - - const filteredSheets = filterSheets(createdSheets); - - filteredSheets.forEach((sheet) => { - if (sheet.createdAt === today) { - groupedSheets.Today.push(sheet); - } else if (sheet.createdAt === yesterday) { - groupedSheets.Yesterday.push(sheet); - } else { - groupedSheets.Earlier.push(sheet); - } - }); - - return groupedSheets; - }; - - const groupedSheets = groupSheetsByDate(); - - return ( - <> - - {(loading || openingSpreadsheet) && } - -
- -
-
- - Qubit -
-
- -
-
-
- -
- setSearchQuery(e.target.value)} - className="pl-10 w-full px-4 py-2 bg-gray-100 rounded-full border border-gray-200 hover:border-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:text-black" - /> -
-
- -
- setIsDropdownOpen(!isDropdownOpen)} - whileHover={{ scale: 1.05 }} - whileTap={{ scale: 0.95 }} - > -
- {user ? getFirstName().charAt(0).toUpperCase() : "U"} -
-
- {isDropdownOpen && ( - -
- -
- {user?.email || "Email not available"} -
-
- - {user?.displayName?.charAt(0).toUpperCase() || "U"} - -
-
- {user?.displayName || "User"} -
-
-
- - - Sign Out - -
-
- )} -
-
- - - - setIsSpreadsheetDropdownOpen(true)} - > - New Spreadsheet - -
setIsSpreadsheetDropdownOpen(true)} - > - New Spreadsheet -
-
-
- - {isSpreadsheetDropdownOpen && ( -
-
setIsSpreadsheetDropdownOpen(false)} - >
- -
- -
- setSpreadsheetName(e.target.value)} - placeholder="Spreadsheet Name" - className="border rounded-lg p-2 mb-4 w-full" - /> -
- - Create Spreadsheet - -
-
-
- )} - -
- {Object.entries(groupedSheets).map( - ([group, sheets]) => - sheets.length > 0 && ( -
-

{group}

- {sheets.map((sheet, index) => ( -
handleSpreadsheetOpen(sheet.id)} - > - {loading ? ( - - ) : editingSheetIndex === index ? ( -
e.stopPropagation()} - > - setNewName(e.target.value)} - className="flex-grow border rounded-lg p-2 mr-2" - onClick={(e) => e.stopPropagation()} - /> - handleSaveRename(index, e)} - whileHover={{ scale: 1.05 }} - whileTap={{ scale: 0.95 }} - > - Save - -
- ) : ( -
-
- -
{sheet.fileName}
-
-
- {sheet.createdAt} -
-
- { - e.stopPropagation(); - setDropdownIndex( - dropdownIndex === index ? null : index - ); - }} - whileHover={{ scale: 1.05 }} - whileTap={{ scale: 0.95 }} - > - - - {dropdownIndex === index && ( - - - - - )} -
-
- )} -
- ))} -
- ) - )} -
-
- - ); -} - -export default Dashboard; diff --git a/DeveloperAdoption/cloud/storage/storage.js b/DeveloperAdoption/cloud/storage/storage.js deleted file mode 100644 index e69de29..0000000 diff --git a/DeveloperAdoption/jsconfig.json b/DeveloperAdoption/jsconfig.json deleted file mode 100644 index 2a2e4b3..0000000 --- a/DeveloperAdoption/jsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "compilerOptions": { - "paths": { - "@/*": ["./*"] - } - } -} diff --git a/DeveloperAdoption/lib/firebaseAdmin.js b/DeveloperAdoption/lib/firebaseAdmin.js deleted file mode 100644 index bc422de..0000000 --- a/DeveloperAdoption/lib/firebaseAdmin.js +++ /dev/null @@ -1,25 +0,0 @@ -let admin; - -export async function getFirebaseAdmin() { - if (!admin) { - admin = await import('firebase-admin'); - - if (!admin.apps.length) { - admin.initializeApp({ - credential: admin.credential.cert({ - projectId: process.env.FIREBASE_PROJECT_ID, - clientEmail: process.env.FIREBASE_CLIENT_EMAIL, - privateKey: process.env.FIREBASE_PRIVATE_KEY?.replace(/\\n/g, '\n'), - }), - storageBucket: "sih-internal-4375c.appspot.com", - }); - } - } - return admin; -} - -// Note: Only use this function in API routes, not in middleware -export async function verifySessionCookie(session, checkRevoked = true) { - const admin = await getFirebaseAdmin(); - return admin.auth().verifySessionCookie(session, checkRevoked); -} \ No newline at end of file diff --git a/DeveloperAdoption/lib/firebaseConfig.js b/DeveloperAdoption/lib/firebaseConfig.js deleted file mode 100644 index 43ec1e9..0000000 --- a/DeveloperAdoption/lib/firebaseConfig.js +++ /dev/null @@ -1,21 +0,0 @@ -// Import the functions you need from the SDKs you need -import { initializeApp } from "firebase/app"; -import { getAuth } from "firebase/auth"; // Import getAuth - -// Your web app's Firebase configuration -// For Firebase JS SDK v7.20.0 and later, measurementId is optional -const firebaseConfig = { - apiKey: "AIzaSyCqal3ZlyEa0_CEu0CRmDNfkIRrZO7wfqE", - authDomain: "sih-internal-4375c.firebaseapp.com", - projectId: "sih-internal-4375c", - storageBucket: "gs://sih-internal-4375c.appspot.com", - messagingSenderId: "280772071093", - appId: "1:280772071093:web:7bc692a37df30c672838fc", - measurementId: "G-G52GSR8VC2" -}; - -// Initialize Firebase -const app = initializeApp(firebaseConfig); -const auth = getAuth(app); - -export { auth }; diff --git a/DeveloperAdoption/lib/getServerUser.js b/DeveloperAdoption/lib/getServerUser.js deleted file mode 100644 index 1114e75..0000000 --- a/DeveloperAdoption/lib/getServerUser.js +++ /dev/null @@ -1,18 +0,0 @@ -import { cookies } from 'next/headers'; -import { auth } from './firebase-admin'; - -export async function getServerUser() { - const sessionCookie = cookies().get('session')?.value; - - if (!sessionCookie) { - return null; - } - - try { - const decodedClaims = await auth.verifySessionCookie(sessionCookie, true); - return decodedClaims; - } catch (error) { - console.error('Failed to verify session cookie:', error); - return null; - } -} \ No newline at end of file diff --git a/DeveloperAdoption/lib/verifySession.js b/DeveloperAdoption/lib/verifySession.js deleted file mode 100644 index d10f6bb..0000000 --- a/DeveloperAdoption/lib/verifySession.js +++ /dev/null @@ -1,13 +0,0 @@ -import { getFirebaseAdmin } from "./firebaseAdmin"; - - -export const verifySessionCookie = async (session) => { - try { - const admin = await getFirebaseAdmin(); - const decodedClaims = await admin.auth().verifySessionCookie(session, true); - return decodedClaims; - } catch (error) { - console.error("Session verification failed:", error); - return null; - } -}; diff --git a/DeveloperAdoption/next.config.mjs b/DeveloperAdoption/next.config.mjs deleted file mode 100644 index 4678774..0000000 --- a/DeveloperAdoption/next.config.mjs +++ /dev/null @@ -1,4 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = {}; - -export default nextConfig; diff --git a/DeveloperAdoption/package-lock.json b/DeveloperAdoption/package-lock.json deleted file mode 100644 index ecaf0a9..0000000 --- a/DeveloperAdoption/package-lock.json +++ /dev/null @@ -1,9074 +0,0 @@ -{ - "name": "spreadx", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "spreadx", - "version": "0.1.0", - "dependencies": { - "@aws-sdk/client-s3": "^3.637.0", - "@aws-sdk/s3-request-presigner": "^3.637.0", - "@fortawesome/free-brands-svg-icons": "^6.6.0", - "@fortawesome/free-solid-svg-icons": "^6.6.0", - "@fortawesome/react-fontawesome": "^0.2.2", - "firebase": "^10.13.1", - "firebase-admin": "^12.4.0", - "framer-motion": "^11.3.30", - "next": "14.2.6", - "next-auth": "^4.24.7", - "nunjucks": "^3.2.4", - "papaparse": "^5.4.1", - "react": "^18", - "react-dom": "^18", - "react-spinners": "^0.14.1", - "sharp": "^0.33.5", - "uuid": "^10.0.0", - "xlsx": "^0.18.5" - }, - "devDependencies": { - "eslint": "^8", - "eslint-config-next": "14.2.6", - "postcss": "^8", - "tailwindcss": "^3.4.1" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@aws-crypto/crc32": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", - "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/crc32c": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", - "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", - "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", - "dependencies": { - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-s3": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.637.0.tgz", - "integrity": "sha512-y6UC94fsMvhKbf0dzfnjVP1HePeGjplfcYfilZU1COIJLyTkMcUv4XcT4I407CGIrvgEafONHkiC09ygqUauNA==", - "dependencies": { - "@aws-crypto/sha1-browser": "5.2.0", - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-bucket-endpoint": "3.620.0", - "@aws-sdk/middleware-expect-continue": "3.620.0", - "@aws-sdk/middleware-flexible-checksums": "3.620.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-location-constraint": "3.609.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-sdk-s3": "3.635.0", - "@aws-sdk/middleware-ssec": "3.609.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/signature-v4-multi-region": "3.635.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@aws-sdk/xml-builder": "3.609.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/eventstream-serde-browser": "^3.0.6", - "@smithy/eventstream-serde-config-resolver": "^3.0.3", - "@smithy/eventstream-serde-node": "^3.0.5", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-blob-browser": "^3.1.2", - "@smithy/hash-node": "^3.0.3", - "@smithy/hash-stream-node": "^3.1.2", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/md5-js": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-stream": "^3.1.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.637.0.tgz", - "integrity": "sha512-+KjLvgX5yJYROWo3TQuwBJlHCY0zz9PsLuEolmXQn0BVK1L/m9GteZHtd+rEdAoDGBpE0Xqjy1oz5+SmtsaRUw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", - "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.635.0.tgz", - "integrity": "sha512-iJyRgEjOCQlBMXqtwPLIKYc7Bsc6nqjrZybdMDenPDa+kmLg7xh8LxHsu9088e+2/wtLicE34FsJJIfzu3L82g==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.637.0.tgz", - "integrity": "sha512-h+PFCWfZ0Q3Dx84SppET/TFpcQHmxFW8/oV9ArEvMilw4EBN+IlxgbL0CnHwjHW64szcmrM0mbebjEfHf4FXmw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.637.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.637.0.tgz", - "integrity": "sha512-yoEhoxJJfs7sPVQ6Is939BDQJZpZCoUgKr/ySse4YKOZ24t4VqgHA6+wV7rYh+7IW24Rd91UTvEzSuHYTlxlNA==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-ini": "3.637.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.637.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", - "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.637.0.tgz", - "integrity": "sha512-Mvz+h+e62/tl+dVikLafhv+qkZJ9RUb8l2YN/LeKMWkxQylPT83CPk9aimVhCV89zth1zpREArl97+3xsfgQvA==", - "dependencies": { - "@aws-sdk/client-sso": "3.637.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", - "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" - } - }, - "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.620.0.tgz", - "integrity": "sha512-eGLL0W6L3HDb3OACyetZYOWpHJ+gLo0TehQKeQyy2G8vTYXqNTeqYhuI6up9HVjBzU9eQiULVQETmgQs7TFaRg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-arn-parser": "3.568.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.620.0.tgz", - "integrity": "sha512-QXeRFMLfyQ31nAHLbiTLtk0oHzG9QLMaof5jIfqcUwnOkO8YnQdeqzakrg1Alpy/VQ7aqzIi8qypkBe2KXZz0A==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.620.0.tgz", - "integrity": "sha512-ftz+NW7qka2sVuwnnO1IzBku5ccP+s5qZGeRTPgrKB7OzRW85gthvIo1vQR2w+OwHFk7WJbbhhWwbCbktnP4UA==", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@aws-crypto/crc32c": "5.2.0", - "@aws-sdk/types": "3.609.0", - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", - "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.609.0.tgz", - "integrity": "sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", - "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.635.0.tgz", - "integrity": "sha512-RLdYJPEV4JL/7NBoFUs7VlP90X++5FlJdxHz0DzCjmiD3qCviKy+Cym3qg1gBgHwucs5XisuClxDrGokhAdTQw==", - "dependencies": { - "@aws-sdk/core": "3.635.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-arn-parser": "3.568.0", - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-stream": "^3.1.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.609.0.tgz", - "integrity": "sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.637.0.tgz", - "integrity": "sha512-URRiEDZEICyfAXmXcXREQCsvZrapITAymvg46p1Xjnuv7PTnUB0SF18B2omPL0E5d/X+T3O9NKdtot+BqJbIWw==", - "dependencies": { - "@aws-sdk/signature-v4-multi-region": "3.635.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-format-url": "3.609.0", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.635.0.tgz", - "integrity": "sha512-J6QY4/invOkpogCHjSaDON1hF03viPpOnsrzVuCvJMmclS/iG62R4EY0wq1alYll0YmSdmKlpJwHMWwGtqK63Q==", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.635.0", - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.568.0.tgz", - "integrity": "sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-format-url": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.609.0.tgz", - "integrity": "sha512-fuk29BI/oLQlJ7pfm6iJ4gkEpHdavffAALZwXh9eaY1vQ0ip0aKfRTiNudPoJjyyahnz5yJ1HkmlcDitlzsOrQ==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", - "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", - "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", - "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/xml-builder": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.609.0.tgz", - "integrity": "sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", - "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.0.0.tgz", - "integrity": "sha512-83rnH2nCvclWaPQQKvkJ2pdOjG4TZyEVuFDnlOF6KP08lDaaceVyw/W63mDuafQT+MKHCvXIPpE5uYWeM0rT4w==" - }, - "node_modules/@firebase/analytics": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.7.tgz", - "integrity": "sha512-GE29uTT6y/Jv2EP0OjpTezeTQZ5FTCTaZXKrrdVGjb/t35AU4u/jiU+hUwUPpuK8fqhhiHkS/AawE3a3ZK/a9Q==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/installations": "0.6.8", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/analytics-compat": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.13.tgz", - "integrity": "sha512-aZ4wGfNDMsCxhKzDbK2g1aV0JKsdQ9FbeIsjpNJPzhahV0XYj+z36Y4RNLPpG/6hHU4gxnezxs+yn3HhHkNL8w==", - "dependencies": { - "@firebase/analytics": "0.10.7", - "@firebase/analytics-types": "0.8.2", - "@firebase/component": "0.6.8", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/analytics-types": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.2.tgz", - "integrity": "sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==" - }, - "node_modules/@firebase/app": { - "version": "0.10.10", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.10.tgz", - "integrity": "sha512-sDqkdeFdVn5uygQm5EuIKOQ6/wxTcX/qKfm0MR46AiwLRHGLCDUMrXBkc8GhkK3ca2d6mPUSfPmndggo43D6PQ==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.7", - "idb": "7.1.1", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/app-check": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.7.tgz", - "integrity": "sha512-EkOeJcMKVR0zZ6z/jqcFTqHb/xq+TVIRIuBNGHdpcIuFU1czhSlegvqv2+nC+nFrkD8M6Xvd3tAlUOkdbMeS6A==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/app-check-compat": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.14.tgz", - "integrity": "sha512-kK3bPfojAfXE53W+20rxMqIxrloFswXG9vh4kEdYL6Wa2IB3sD5++2dPiK3yGxl8oQiqS8qL2wcKB5/xLpEVEg==", - "dependencies": { - "@firebase/app-check": "0.8.7", - "@firebase/app-check-types": "0.5.2", - "@firebase/component": "0.6.8", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.2.tgz", - "integrity": "sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==" - }, - "node_modules/@firebase/app-check-types": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.2.tgz", - "integrity": "sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==" - }, - "node_modules/@firebase/app-compat": { - "version": "0.2.40", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.40.tgz", - "integrity": "sha512-2L5MW4MH2ya7Wvw0hzWy3ZWeB4SqC5gYXDAV5AS1lBTL4zL3k8dsqJmry/cFV00GgkCI01WJbcXvFMCXJvgyow==", - "dependencies": { - "@firebase/app": "0.10.10", - "@firebase/component": "0.6.8", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/app-types": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.2.tgz", - "integrity": "sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==" - }, - "node_modules/@firebase/auth": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.8.tgz", - "integrity": "sha512-1KJlDrTrEEFTIBj9MxjAWjQ4skecBD4bmoayQ0l14QDbNc1a8qGbi+MFSJkH7O6VnGE6bTMcWSw6RrQNecqKaw==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0", - "undici": "6.19.7" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^1.18.1" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/@firebase/auth-compat": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.13.tgz", - "integrity": "sha512-rV6TMxUU6wBBZ2ouDMtjJsJXeewtvYvVzslzt3/P7O/kxiWlreHT/2M/1guMiXKo3zk52XK3GqP0uM2bN7fEow==", - "dependencies": { - "@firebase/auth": "1.7.8", - "@firebase/auth-types": "0.12.2", - "@firebase/component": "0.6.8", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0", - "undici": "6.19.7" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.3.tgz", - "integrity": "sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==" - }, - "node_modules/@firebase/auth-types": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.2.tgz", - "integrity": "sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/component": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.8.tgz", - "integrity": "sha512-LcNvxGLLGjBwB0dJUsBGCej2fqAepWyBubs4jt1Tiuns7QLbXHuyObZ4aMeBjZjWx4m8g1LoVI9QFpSaq/k4/g==", - "dependencies": { - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.7.tgz", - "integrity": "sha512-wjXr5AO8RPxVVg7rRCYffT7FMtBjHRfJ9KMwi19MbOf0vBf0H9YqW3WCgcnLpXI6ehiUcU3z3qgPnnU0nK6SnA==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.2", - "@firebase/auth-interop-types": "0.2.3", - "@firebase/component": "0.6.8", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.7", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.7.tgz", - "integrity": "sha512-R/3B+VVzEFN5YcHmfWns3eitA8fHLTL03io+FIoMcTYkajFnrBdS3A+g/KceN9omP7FYYYGTQWF9lvbEx6eMEg==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/database": "1.0.7", - "@firebase/database-types": "1.0.4", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-types": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.4.tgz", - "integrity": "sha512-mz9ZzbH6euFXbcBo+enuJ36I5dR5w+enJHHjy9Y5ThCdKUseqfDjW3vCp1YxE9zygFCSjJJ/z1cQ+zodvUcwPQ==", - "dependencies": { - "@firebase/app-types": "0.9.2", - "@firebase/util": "1.9.7" - } - }, - "node_modules/@firebase/firestore": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.7.1.tgz", - "integrity": "sha512-WliQNa8GVcH6EWkH0NAf+uAnxNiBuH+G8Buzr2ZS1NznOhJDK/q6Hsjv5TzNrijLTAdEfj/wk9VEv994KDSjxg==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.7", - "@firebase/webchannel-wrapper": "1.0.1", - "@grpc/grpc-js": "~1.9.0", - "@grpc/proto-loader": "^0.7.8", - "tslib": "^2.1.0", - "undici": "6.19.7" - }, - "engines": { - "node": ">=10.10.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/firestore-compat": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.36.tgz", - "integrity": "sha512-NtoIm7CT9f+SFB7cPMCtyCSxZReh/+SII5X4TQH394S3dwhru9HIfvEOKAMuAnXsSsLH72jXPUgdsEAUqg6Oug==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/firestore": "4.7.1", - "@firebase/firestore-types": "3.0.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/firestore-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.2.tgz", - "integrity": "sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/functions": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.7.tgz", - "integrity": "sha512-xaUsGI2kYrI8zJXgrNB7SrJKB8v1vJqR16YYi6g6dFTgBz4+VzWJFqqVU60BbdAWm6fXnUrg9gjlJQeqomT2Vg==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.2", - "@firebase/auth-interop-types": "0.2.3", - "@firebase/component": "0.6.8", - "@firebase/messaging-interop-types": "0.2.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0", - "undici": "6.19.7" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/functions-compat": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.13.tgz", - "integrity": "sha512-qcZvJO2ed6PAD+18DanVztw7WyQVQK43HoRhxusHAwDFvK/xY+mcGpj+IpfdxTNMBGCOIxKFp4Xqk/c2nubBlQ==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/functions": "0.11.7", - "@firebase/functions-types": "0.6.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/functions-types": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.2.tgz", - "integrity": "sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==" - }, - "node_modules/@firebase/installations": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.8.tgz", - "integrity": "sha512-57V374qdb2+wT5v7+ntpLXBjZkO6WRgmAUbVkRfFTM/4t980p0FesbqTAcOIiM8U866UeuuuF8lYH70D3jM/jQ==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/util": "1.9.7", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/installations-compat": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.8.tgz", - "integrity": "sha512-pI2q8JFHB7yIq/szmhzGSWXtOvtzl6tCUmyykv5C8vvfOVJUH6mP4M4iwjbK8S1JotKd/K70+JWyYlxgQ0Kpyw==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/installations": "0.6.8", - "@firebase/installations-types": "0.5.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/installations-types": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.2.tgz", - "integrity": "sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==", - "peerDependencies": { - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/logger": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", - "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/messaging": { - "version": "0.12.10", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.10.tgz", - "integrity": "sha512-fGbxJPKpl2DIKNJGhbk4mYPcM+qE2gl91r6xPoiol/mN88F5Ym6UeRdMVZah+pijh9WxM55alTYwXuW40r1Y2Q==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/installations": "0.6.8", - "@firebase/messaging-interop-types": "0.2.2", - "@firebase/util": "1.9.7", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/messaging-compat": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.10.tgz", - "integrity": "sha512-FXQm7rcowkDm8kFLduHV35IRYCRo+Ng0PIp/t1+EBuEbyplaKkGjZ932pE+owf/XR+G/60ku2QRBptRGLXZydg==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/messaging": "0.12.10", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/messaging-interop-types": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.2.tgz", - "integrity": "sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==" - }, - "node_modules/@firebase/performance": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.8.tgz", - "integrity": "sha512-F+alziiIZ6Yn8FG47mxwljq+4XkgkT2uJIFRlkyViUQRLzrogaUJW6u/+6ZrePXnouKlKIwzqos3PVJraPEcCA==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/installations": "0.6.8", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/performance-compat": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.8.tgz", - "integrity": "sha512-o7TFClRVJd3VIBoY7KZQqtCeW0PC6v9uBzM6Lfw3Nc9D7hM6OonqecYvh7NwJ6R14k+xM27frLS4BcCvFHKw2A==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/logger": "0.4.2", - "@firebase/performance": "0.6.8", - "@firebase/performance-types": "0.2.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/performance-types": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.2.tgz", - "integrity": "sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==" - }, - "node_modules/@firebase/remote-config": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.8.tgz", - "integrity": "sha512-AMLqe6wfIRnjc6FkCWOSUjhc1fSTEf8o+cv1NolFvbiJ/tU+TqN4pI7pT+MIKQzNiq5fxLehkOx+xtAQBxPJKQ==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/installations": "0.6.8", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/remote-config-compat": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.8.tgz", - "integrity": "sha512-UxSFOp6dzFj2AHB8Bq/BYtbq5iFyizKx4Rd6WxAdaKYM8cnPMeK+l2v+Oogtjae+AeyHRI+MfL2acsfVe5cd2A==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/logger": "0.4.2", - "@firebase/remote-config": "0.4.8", - "@firebase/remote-config-types": "0.3.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/remote-config-types": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.2.tgz", - "integrity": "sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==" - }, - "node_modules/@firebase/storage": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.13.1.tgz", - "integrity": "sha512-L6AJ5tWgHSi2g/gbc/2Pbm3qxmoEg9THmPIOpRsLwuz9LPeWbhyMQeGlqxWqtZGQO/z/LMjGYadNlupQj0HNfw==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0", - "undici": "6.19.7" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/storage-compat": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.11.tgz", - "integrity": "sha512-EEa9jgm/aRVIGSD0ByYAsZ0tvEKfVwSp9uFoa/97BISGWGjSNPIWjenaDvpDZ7aL8OxaGIpwuk700aHy7/T0Ug==", - "dependencies": { - "@firebase/component": "0.6.8", - "@firebase/storage": "0.13.1", - "@firebase/storage-types": "0.8.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/storage-types": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.2.tgz", - "integrity": "sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/util": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.7.tgz", - "integrity": "sha512-fBVNH/8bRbYjqlbIhZ+lBtdAAS4WqZumx03K06/u7fJSpz1TGjEMm1ImvKD47w+xaFKIP2ori6z8BrbakRfjJA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/vertexai-preview": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@firebase/vertexai-preview/-/vertexai-preview-0.0.3.tgz", - "integrity": "sha512-KVtUWLp+ScgiwkDKAvNkVucAyhLVQp6C6lhnVEuIg4mWhWcS3oerjAeVhZT4uNofKwWxRsOaB2Yec7DMTXlQPQ==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.2", - "@firebase/component": "0.6.8", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.7", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/webchannel-wrapper": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.1.tgz", - "integrity": "sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==" - }, - "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz", - "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.6.0.tgz", - "integrity": "sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg==", - "peer": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-brands-svg-icons": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.6.0.tgz", - "integrity": "sha512-1MPD8lMNW/earme4OQi1IFHtmHUwAKgghXlNwWi9GO7QkTfD+IIaYpIai4m2YJEzqfEji3jFHX1DZI5pbY/biQ==", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.6.0.tgz", - "integrity": "sha512-IYv/2skhEDFc2WGUcqvFJkeK39Q+HyPf5GHUrT/l2pKbtgEIv1al1TKd6qStR5OIwQdN1GZP54ci3y4mroJWjA==", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/react-fontawesome": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz", - "integrity": "sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==", - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "react": ">=16.3" - } - }, - "node_modules/@google-cloud/firestore": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.9.0.tgz", - "integrity": "sha512-c4ALHT3G08rV7Zwv8Z2KG63gZh66iKdhCBeDfCpIkLrjX6EAjTD/szMdj14M+FnQuClZLFfW5bAgoOjfNmLtJg==", - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.3.3", - "protobufjs": "^7.2.6" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/paginator": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", - "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/projectify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", - "optional": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/promisify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.12.1.tgz", - "integrity": "sha512-Z3ZzOnF3YKLuvpkvF+TjQ6lztxcAyTILp+FjKonmVpEwPa9vFvxpZjubLR4sB6bf19i/8HL2AXRjA0YFgHFRmQ==", - "optional": true, - "dependencies": { - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "duplexify": "^4.1.3", - "fast-xml-parser": "^4.4.1", - "gaxios": "^6.0.2", - "google-auth-library": "^9.6.3", - "html-entities": "^2.5.2", - "mime": "^3.0.0", - "p-limit": "^3.0.1", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.9.15", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz", - "integrity": "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==", - "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", - "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", - "cpu": [ - "wasm32" - ], - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.2.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "optional": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@next/env": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.6.tgz", - "integrity": "sha512-bs5DFKV+08EjWrl8EB+KKqev1ZTNONH1vFCaHh911aaB362NnP32UDTbE9VQhyiAgbFqJsfDkSxFERNDDb3j0g==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.6.tgz", - "integrity": "sha512-d3+p4AjIYmhqzYHhhmkRYYN6ZU35TwZAKX08xKRfnHkz72KhWL2kxMFsDptpZs5e8bBGdepn7vn1+9DaF8iX+A==", - "dev": true, - "dependencies": { - "glob": "10.3.10" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.6.tgz", - "integrity": "sha512-BtJZb+hYXGaVJJivpnDoi3JFVn80SHKCiiRUW3kk1SY6UCUy5dWFFSbh+tGi5lHAughzeduMyxbLt3pspvXNSg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.6.tgz", - "integrity": "sha512-ZHRbGpH6KHarzm6qEeXKSElSXh8dS2DtDPjQt3IMwY8QVk7GbdDYjvV4NgSnDA9huGpGgnyy3tH8i5yHCqVkiQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.6.tgz", - "integrity": "sha512-O4HqUEe3ZvKshXHcDUXn1OybN4cSZg7ZdwHJMGCXSUEVUqGTJVsOh17smqilIjooP/sIJksgl+1kcf2IWMZWHg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.6.tgz", - "integrity": "sha512-xUcdhr2hfalG8RDDGSFxQ75yOG894UlmFS4K2M0jLrUhauRBGOtUOxoDVwiIIuZQwZ3Y5hDsazNjdYGB0cQ9yQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.6.tgz", - "integrity": "sha512-InosKxw8UMcA/wEib5n2QttwHSKHZHNSbGcMepBM0CTcNwpxWzX32KETmwbhKod3zrS8n1vJ+DuJKbL9ZAB0Ag==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.6.tgz", - "integrity": "sha512-d4QXfJmt5pGJ7cG8qwxKSBnO5AXuKAFYxV7qyDRHnUNvY/dgDh+oX292gATpB2AAHgjdHd5ks1wXxIEj6muLUQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.6.tgz", - "integrity": "sha512-AlgIhk4/G+PzOG1qdF1b05uKTMsuRatFlFzAi5G8RZ9h67CVSSuZSbqGHbJDlcV1tZPxq/d4G0q6qcHDKWf4aQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.6.tgz", - "integrity": "sha512-hNukAxq7hu4o5/UjPp5jqoBEtrpCbOmnUqZSKNJG8GrUVzfq0ucdhQFVrHcLRMvQcwqqDh1a5AJN9ORnNDpgBQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.6.tgz", - "integrity": "sha512-NANtw+ead1rSDK1jxmzq3TYkl03UNK2KHqUYf1nIhNci6NkeqBD4s1njSzYGIlSHxCK+wSaL8RXZm4v+NF/pMw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@panva/hkdf": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.2.1.tgz", - "integrity": "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", - "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", - "dev": true - }, - "node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", - "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-3.0.0.tgz", - "integrity": "sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/chunked-blob-reader-native": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.0.tgz", - "integrity": "sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==", - "dependencies": { - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", - "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.0.tgz", - "integrity": "sha512-cHXq+FneIF/KJbt4q4pjN186+Jf4ZB0ZOqEaZMBhT79srEyGDDBV31NqBRBjazz8ppQ1bJbDJMY9ba5wKFV36w==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", - "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.2.tgz", - "integrity": "sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/eventstream-serde-browser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.6.tgz", - "integrity": "sha512-2hM54UWQUOrki4BtsUI1WzmD13/SeaqT/AB3EUJKbcver/WgKNaiJ5y5F5XXuVe6UekffVzuUDrBZVAA3AWRpQ==", - "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.5", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.3.tgz", - "integrity": "sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-node": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.5.tgz", - "integrity": "sha512-+upXvnHNyZP095s11jF5dhGw/Ihzqwl5G+/KtMnoQOpdfC3B5HYCcDVG9EmgkhJMXJlM64PyN5gjJl0uXFQehQ==", - "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.5", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-universal": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.5.tgz", - "integrity": "sha512-5u/nXbyoh1s4QxrvNre9V6vfyoLWuiVvvd5TlZjGThIikc3G+uNiG9uOTCWweSRjv1asdDIWK7nOmN7le4RYHQ==", - "dependencies": { - "@smithy/eventstream-codec": "^3.1.2", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", - "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-blob-browser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.2.tgz", - "integrity": "sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==", - "dependencies": { - "@smithy/chunked-blob-reader": "^3.0.0", - "@smithy/chunked-blob-reader-native": "^3.0.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-node": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", - "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/hash-stream-node": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.2.tgz", - "integrity": "sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", - "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/md5-js": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.3.tgz", - "integrity": "sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", - "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", - "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", - "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.15.tgz", - "integrity": "sha512-iTMedvNt1ApdvkaoE8aSDuwaoc+BhvHqttbA/FO4Ty+y/S5hW6Ci/CTScG7vam4RYJWZxdTElc3MEfHRVH6cgQ==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-retry/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", - "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", - "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", - "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", - "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", - "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", - "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", - "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", - "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", - "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", - "dependencies": { - "@smithy/types": "^3.3.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", - "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", - "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.2.0.tgz", - "integrity": "sha512-pDbtxs8WOhJLJSeaF/eAbPgXg4VVYFlRcL/zoNYA5WbG3wBL06CHtBSg53ppkttDpAJ/hdiede+xApip1CwSLw==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", - "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", - "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.15.tgz", - "integrity": "sha512-FZ4Psa3vjp8kOXcd3HJOiDPBCWtiilLl57r0cnNtq/Ga9RSDrM5ERL6xt+tO43+2af6Pn5Yp92x2n5vPuduNfg==", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.15.tgz", - "integrity": "sha512-KSyAAx2q6d0t6f/S4XB2+3+6aQacm3aLMhs9aLMqn18uYGUepbdssfogW5JQZpc6lXNBnp0tEnR5e9CEKmEd7A==", - "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", - "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", - "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", - "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", - "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", - "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", - "dependencies": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-waiter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.2.tgz", - "integrity": "sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" - }, - "node_modules/@swc/helpers": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", - "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", - "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "optional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/caseless": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", - "optional": true - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", - "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "optional": true - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" - }, - "node_modules/@types/node": { - "version": "22.5.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.1.tgz", - "integrity": "sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw==", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "node_modules/@types/request": { - "version": "2.48.12", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", - "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", - "optional": true, - "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "optional": true - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/a-sync-waterfall": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", - "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "optional": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/adler-32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", - "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "optional": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "devOptional": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "optional": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "optional": true - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "devOptional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "devOptional": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001655", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", - "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/cfb": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", - "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", - "dependencies": { - "adler-32": "~1.3.0", - "crc-32": "~1.2.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "devOptional": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "devOptional": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/codepage": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", - "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "optional": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "optional": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/duplexify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-next": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.6.tgz", - "integrity": "sha512-z0URA5LO6y8lS/YLN0EDW/C4LEkDODjJzA37dvLVdzCPzuewjzTe1os5g3XclZAZrQ8X8hPaSMQ2JuVWwMmrTA==", - "dev": true, - "dependencies": { - "@next/eslint-plugin-next": "14.2.6", - "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz", - "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==", - "dev": true, - "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.3.5", - "enhanced-resolve": "^5.15.0", - "eslint-module-utils": "^2.8.1", - "fast-glob": "^3.3.2", - "get-tsconfig": "^4.7.5", - "is-bun-module": "^1.0.2", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.2.tgz", - "integrity": "sha512-3XnC5fDyc8M4J2E8pt8pmSVRX2M+5yWMCfI/kDZwauQeFgzQOuhcRBFKjTeJagqgk4sFKxe1mvNVnaWwImx/Tg==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", - "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", - "dev": true, - "dependencies": { - "aria-query": "~5.1.3", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.9.1", - "axobject-query": "~3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.35.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", - "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "optional": true - }, - "node_modules/farmhash-modern": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/farmhash-modern/-/farmhash-modern-1.1.0.tgz", - "integrity": "sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "devOptional": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "devOptional": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/firebase": { - "version": "10.13.1", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.13.1.tgz", - "integrity": "sha512-L5BSkmvB2dzCUMpr8i/O8WMJC3Nqj5Ld8Wj/qnak+tz2Ga+JH6/FO93xArg9IGhktCrPXVODoWp6t9ybdgmXCA==", - "dependencies": { - "@firebase/analytics": "0.10.7", - "@firebase/analytics-compat": "0.2.13", - "@firebase/app": "0.10.10", - "@firebase/app-check": "0.8.7", - "@firebase/app-check-compat": "0.3.14", - "@firebase/app-compat": "0.2.40", - "@firebase/app-types": "0.9.2", - "@firebase/auth": "1.7.8", - "@firebase/auth-compat": "0.5.13", - "@firebase/database": "1.0.7", - "@firebase/database-compat": "1.0.7", - "@firebase/firestore": "4.7.1", - "@firebase/firestore-compat": "0.3.36", - "@firebase/functions": "0.11.7", - "@firebase/functions-compat": "0.3.13", - "@firebase/installations": "0.6.8", - "@firebase/installations-compat": "0.2.8", - "@firebase/messaging": "0.12.10", - "@firebase/messaging-compat": "0.2.10", - "@firebase/performance": "0.6.8", - "@firebase/performance-compat": "0.2.8", - "@firebase/remote-config": "0.4.8", - "@firebase/remote-config-compat": "0.2.8", - "@firebase/storage": "0.13.1", - "@firebase/storage-compat": "0.3.11", - "@firebase/util": "1.9.7", - "@firebase/vertexai-preview": "0.0.3" - } - }, - "node_modules/firebase-admin": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.4.0.tgz", - "integrity": "sha512-3HOHqJxNmFv0JgK3voyMQgmcibhJN4LQfZfhnZGb6pcONnZxejki4nQ1twsoJlGaIvgQWBtO7rc5mh/cqlOJNA==", - "dependencies": { - "@fastify/busboy": "^3.0.0", - "@firebase/database-compat": "^1.0.2", - "@firebase/database-types": "^1.0.0", - "@types/node": "^22.0.1", - "farmhash-modern": "^1.1.0", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.1.0", - "node-forge": "^1.3.1", - "uuid": "^10.0.0" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "@google-cloud/firestore": "^7.7.0", - "@google-cloud/storage": "^7.7.0" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/frac": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", - "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/framer-motion": { - "version": "11.3.31", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.3.31.tgz", - "integrity": "sha512-Xmxs08WBXnc2tNzNZbFSpquI33lvleJg4Y+hmZ+vFkn+laN9ZnR3gbZnNGKDtuz7c/x3u8dLg05OU3EhLobCsg==", - "dependencies": { - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "optional": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gaxios": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", - "optional": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gaxios/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.0.tgz", - "integrity": "sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/google-auth-library": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.14.0.tgz", - "integrity": "sha512-Y/eq+RWVs55Io/anIsm24sDS8X79Tq948zVLGaa7+KlJYYqaGwp1YI37w48nzrNi12RgnzMrQD4NzdmCowT90g==", - "optional": true, - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.4.0.tgz", - "integrity": "sha512-4fkXSbNy85ikO7mkD5lChLL5UfLnRBvg6z3s3THUJKI6OSbISbufMDE4S/ZH+J3mB9A2FdMXBT/hh7wTvpGAow==", - "optional": true, - "dependencies": { - "@grpc/grpc-js": "^1.10.9", - "@grpc/proto-loader": "^0.7.13", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "google-auth-library": "^9.3.0", - "node-fetch": "^2.7.0", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^2.0.2", - "protobufjs": "^7.3.2", - "retry-request": "^7.0.0", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax/node_modules/@grpc/grpc-js": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.11.1.tgz", - "integrity": "sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw==", - "optional": true, - "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/google-gax/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "optional": true - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "optional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "optional": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "devOptional": true - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "devOptional": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bun-module": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.1.0.tgz", - "integrity": "sha512-4mTAVPlrXpaN3jtF0lsnPCMGnq4+qZjVIKq0HCpfcqf8OC1SM5oATCIAPM5V5FN05qp2NNnFndphmdZS9CV3hA==", - "dev": true, - "dependencies": { - "semver": "^7.6.3" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "devOptional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "optional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "optional": true, - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwks-rsa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", - "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", - "dependencies": { - "@types/express": "^4.17.17", - "@types/jsonwebtoken": "^9.0.2", - "debug": "^4.3.4", - "jose": "^4.14.6", - "limiter": "^1.1.5", - "lru-memoizer": "^2.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-memoizer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", - "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "6.0.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "optional": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/next": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.6.tgz", - "integrity": "sha512-57Su7RqXs5CBKKKOagt8gPhMM3CpjgbeQhrtei2KLAA1vTNm7jfKS+uDARkSW8ZETUflDCBIsUKGSyQdRs4U4g==", - "dependencies": { - "@next/env": "14.2.6", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.6", - "@next/swc-darwin-x64": "14.2.6", - "@next/swc-linux-arm64-gnu": "14.2.6", - "@next/swc-linux-arm64-musl": "14.2.6", - "@next/swc-linux-x64-gnu": "14.2.6", - "@next/swc-linux-x64-musl": "14.2.6", - "@next/swc-win32-arm64-msvc": "14.2.6", - "@next/swc-win32-ia32-msvc": "14.2.6", - "@next/swc-win32-x64-msvc": "14.2.6" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next-auth": { - "version": "4.24.7", - "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.7.tgz", - "integrity": "sha512-iChjE8ov/1K/z98gdKbn2Jw+2vLgJtVV39X+rCP5SGnVQuco7QOr19FRNGMIrD8d3LYhHWV9j9sKLzq1aDWWQQ==", - "dependencies": { - "@babel/runtime": "^7.20.13", - "@panva/hkdf": "^1.0.2", - "cookie": "^0.5.0", - "jose": "^4.15.5", - "oauth": "^0.9.15", - "openid-client": "^5.4.0", - "preact": "^10.6.3", - "preact-render-to-string": "^5.1.19", - "uuid": "^8.3.2" - }, - "peerDependencies": { - "next": "^12.2.5 || ^13 || ^14", - "nodemailer": "^6.6.5", - "react": "^17.0.2 || ^18", - "react-dom": "^17.0.2 || ^18" - }, - "peerDependenciesMeta": { - "nodemailer": { - "optional": true - } - } - }, - "node_modules/next-auth/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "optional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nunjucks": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", - "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", - "dependencies": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "commander": "^5.1.0" - }, - "bin": { - "nunjucks-precompile": "bin/precompile" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "chokidar": "^3.3.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/oauth": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", - "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "devOptional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/oidc-token-hash": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", - "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", - "engines": { - "node": "^10.13.0 || >=12.0.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/openid-client": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.5.tgz", - "integrity": "sha512-5P4qO9nGJzB5PI0LFlhj4Dzg3m4odt0qsJTfyEtZyOlkgpILwEioOhVVJOrS1iVH494S4Ee5OCjjg6Bf5WOj3w==", - "dependencies": { - "jose": "^4.15.5", - "lru-cache": "^6.0.0", - "object-hash": "^2.2.0", - "oidc-token-hash": "^5.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/openid-client/node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "devOptional": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/papaparse": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", - "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/preact": { - "version": "10.23.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.23.2.tgz", - "integrity": "sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/preact-render-to-string": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", - "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", - "dependencies": { - "pretty-format": "^3.8.0" - }, - "peerDependencies": { - "preact": ">=10" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", - "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/proto3-json-serializer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", - "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==", - "optional": true, - "dependencies": { - "protobufjs": "^7.2.5" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-spinners": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.14.1.tgz", - "integrity": "sha512-2Izq+qgQ08HTofCVEdcAQCXFEYfqTDdfeDQJeo/HHQiQJD4imOicNLhkfN2eh1NYEWVOX4D9ok2lhuDB0z3Aag==", - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "devOptional": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "optional": true, - "dependencies": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "hasInstallScript": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssf": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", - "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", - "dependencies": { - "frac": "~1.1.2" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "optional": true, - "dependencies": { - "stubs": "^3.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "optional": true - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "optional": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.prototype.includes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", - "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "optional": true - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz", - "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "optional": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/teeny-request/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/teeny-request/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/teeny-request/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "optional": true - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.7.tgz", - "integrity": "sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A==", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "devOptional": true - }, - "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "optional": true - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "optional": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wmf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", - "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/word": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", - "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true - }, - "node_modules/xlsx": { - "version": "0.18.5", - "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", - "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", - "dependencies": { - "adler-32": "~1.3.0", - "cfb": "~1.2.1", - "codepage": "~1.15.0", - "crc-32": "~1.2.1", - "ssf": "~0.11.2", - "wmf": "~1.0.1", - "word": "~0.3.0" - }, - "bin": { - "xlsx": "bin/xlsx.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "devOptional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/DeveloperAdoption/package.json b/DeveloperAdoption/package.json deleted file mode 100644 index db00589..0000000 --- a/DeveloperAdoption/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "spreadx", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "dependencies": { - "@aws-sdk/client-s3": "^3.637.0", - "@aws-sdk/s3-request-presigner": "^3.637.0", - "@fortawesome/free-brands-svg-icons": "^6.6.0", - "@fortawesome/free-solid-svg-icons": "^6.6.0", - "@fortawesome/react-fontawesome": "^0.2.2", - "firebase": "^10.13.1", - "firebase-admin": "^12.4.0", - "framer-motion": "^11.3.30", - "next": "14.2.6", - "next-auth": "^4.24.7", - "nunjucks": "^3.2.4", - "papaparse": "^5.4.1", - "react": "^18", - "react-dom": "^18", - "react-spinners": "^0.14.1", - "sharp": "^0.33.5", - "uuid": "^10.0.0", - "xlsx": "^0.18.5" - }, - "devDependencies": { - "eslint": "^8", - "eslint-config-next": "14.2.6", - "postcss": "^8", - "tailwindcss": "^3.4.1" - } -} diff --git a/DeveloperAdoption/postcss.config.mjs b/DeveloperAdoption/postcss.config.mjs deleted file mode 100644 index 1a69fd2..0000000 --- a/DeveloperAdoption/postcss.config.mjs +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('postcss-load-config').Config} */ -const config = { - plugins: { - tailwindcss: {}, - }, -}; - -export default config; diff --git a/DeveloperAdoption/public/Adder.png b/DeveloperAdoption/public/Adder.png deleted file mode 100644 index 34aba29..0000000 Binary files a/DeveloperAdoption/public/Adder.png and /dev/null differ diff --git a/DeveloperAdoption/public/Login.jpg b/DeveloperAdoption/public/Login.jpg deleted file mode 100644 index e28c217..0000000 Binary files a/DeveloperAdoption/public/Login.jpg and /dev/null differ diff --git a/DeveloperAdoption/public/Logo.png b/DeveloperAdoption/public/Logo.png deleted file mode 100644 index d250635..0000000 Binary files a/DeveloperAdoption/public/Logo.png and /dev/null differ diff --git a/DeveloperAdoption/public/SignUp.avif b/DeveloperAdoption/public/SignUp.avif deleted file mode 100644 index 0550391..0000000 Binary files a/DeveloperAdoption/public/SignUp.avif and /dev/null differ diff --git a/DeveloperAdoption/public/SocialCalc.js b/DeveloperAdoption/public/SocialCalc.js deleted file mode 100644 index 7a48ee7..0000000 --- a/DeveloperAdoption/public/SocialCalc.js +++ /dev/null @@ -1,32423 +0,0 @@ -/* eslint-disable */ -// Taken from https://github.com/umdjs/umd/blob/master/templates/returnExports.js -// (c) by The UMD contributors -// MIT License: https://github.com/umdjs/umd/blob/master/LICENSE.md -(function (root, factory) { - if (typeof define === "function" && define.amd) { - // AMD. Register as an anonymous module. - define([], function () { - return (root.SocialCalc = factory.call(root, root)); - }); - } else if (typeof module === "object" && module.exports) { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = root.SocialCalc = factory.call(root, root); - } else { - // Browser globals (root is window) - root.SocialCalc = factory.call(root, root); - } -})(typeof self !== "undefined" ? self : this, function (window) { - // console.log(root) - // console.log(window) - var window = this; - var SocialCalc = {}; - - // - /* -// The module of the SocialCalc package with customizable constants, strings, etc. -// This is where most of the common localizations are done. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - // - /* -// The module of the SocialCalc package with customizable constants, strings, etc. -// This is where most of the common localizations are done. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; - - // ************************************* - // - // TO LEARN HOW TO LOCALIZE OR CUSTOMIZE SOCIALCALC, PLEASE READ THIS: - // - // The constants are all properties of the SocialCalc.Constants object. - // They are grouped here by what they are for, which module uses them, etc. - // - // Properties whose names start with "s_" are strings, or arrays of strings, - // that are good candidates for translation from the English. - // - // Other properties relate to visual settings, localization parameters, etc. - // - // These values are not used when SocialCalc modules are first loaded. - // They may be modified before the first use of the routines that use them, - // e.g., before creating SocialCalc objects. - // - // The exceptions are: - // TooltipOffsetX and TooltipOffsetY, as described with their definitions. - // - // SocialCalc IS NOT DESIGNED FOR USE WITH A TRANSLATION FUNCTION each time a string - // is used. Instead, language translations may be done by modifying this object. - // - // To customize SocialCalc, you may either replace this file with a modified version - // or you can overwrite the values before use. An example would be to - // iterate over all the properties looking for names that start with "s_" and - // use some other mechanism to obtain a localized string and replace the values - // here with those translated values. - // - // There is also a function, SocialCalc.ConstantsSetClasses, that may be used - // to easily switch SocialCalc from using explicit CSS styles for many things - // to using CSS classes. See the function, below, for more information. - // - // ************************************* - - SocialCalc.Constants = { - // - // Main SocialCalc module, socialcalc-3.js: - // - - //*** Common Constants - - textdatadefaulttype: "t", // This sets the default type for text on reading source file - // It should normally be "t" - - //*** Common error messages - - s_BrowserNotSupported: "Browser not supported.", // error thrown if browser can't handle events like IE or Firefox. - s_InternalError: "Internal SocialCalc error (probably an internal bug): ", // hopefully unlikely, but a test failed - - //*** SocialCalc.ParseSheetSave - - // Errors thrown on unexpected value in save file: - - s_pssUnknownColType: "Unknown col type item", - s_pssUnknownRowType: "Unknown row type item", - s_pssUnknownLineType: "Unknown line type", - - //*** SocialCalc.CellFromStringParts - - // Error thrown on unexpected value in save file: - - s_cfspUnknownCellType: "Unknown cell type item", - - //*** SocialCalc.CanonicalizeSheet - - doCanonicalizeSheet: true, // if true, do the canonicalization calculations - - //*** ExecuteSheetCommand - - s_escUnknownSheetCmd: "Unknown sheet command: ", - s_escUnknownSetCoordCmd: "Unknown set coord command: ", - s_escUnknownCmd: "Unknown command: ", - - //*** SocialCalc.CheckAndCalcCell - - s_caccCircRef: "Circular reference to ", // circular reference found during recalc - - //*** SocialCalc.RenderContext - - defaultRowNameWidth: "30", // used to set minimum width of the row header column - a string in pixels - defaultAssumedRowHeight: 15, // used when guessing row heights - number - defaultCellIDPrefix: "cell_", // if non-null, each cell will render with an ID starting with this - - // Default sheet display values - - defaultCellLayout: "padding:2px 2px 1px 2px;vertical-align:top;", - defaultCellFontStyle: "normal normal", - defaultCellFontSize: "small", - defaultCellFontFamily: "Verdana,Arial,Helvetica,sans-serif", - - defaultPaneDividerWidth: "2", // a string - defaultPaneDividerHeight: "3", // a string - - defaultGridCSS: "1px solid #C0C0C0;", // used as style to set each border when grid enabled (was #ECECEC) - - defaultCommentClass: "", // class added to cells with non-null comments when grid enabled - defaultCommentStyle: - "background-repeat:no-repeat;background-position:top right;background-image:url(/socialcalc/images/sc_commentbg.gif);", // style added to cells with non-null comments when grid enabled - defaultCommentNoGridClass: "", // class added to cells with non-null comments when grid not enabled - defaultCommentNoGridStyle: "", // style added to cells with non-null comments when grid not enabled - - defaultColWidth: "80", // text - defaultMinimumColWidth: 10, // numeric - - // For each of the following default sheet display values at least one of class and/or style are needed - - defaultHighlightTypeCursorClass: "", - // defaultHighlightTypeCursorStyle: "color:#FFF;backgroundColor:#A6A6A6;", - defaultHighlightTypeCursorStyle: "", - defaultHighlightTypeRangeClass: "", - //defaultHighlightTypeRangeStyle: "color:#000;backgroundColor:#E5E5E5;", - defaultHighlightTypeRangeStyle: "", - - defaultColnameClass: "", // regular column heading letters, needs a cursor property - defaultColnameStyle: - "font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;", - defaultSelectedColnameClass: "", // column with selected cell, needs a cursor property - defaultSelectedColnameStyle: - "font-size:small;text-align:center;color:#FFFFFF;background-color:#404040;cursor:e-resize;", - defaultRownameClass: "", // regular row heading numbers - defaultRownameStyle: - "font-size:small;text-align:right;color:#FFFFFF;background-color:#808080;", - defaultSelectedRownameClass: "", // column with selected cell, needs a cursor property - defaultSelectedRownameStyle: - "font-size:small;text-align:right;color:#FFFFFF;background-color:#404040;", - defaultUpperLeftClass: "", // Corner cell in upper left - defaultUpperLeftStyle: - "font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;", - defaultSkippedCellClass: "", // used if present for spanned cells peeking into a pane (at least one of class/style needed) - defaultSkippedCellStyle: "font-size:small;background-color:#CCC", // used if present - defaultPaneDividerClass: "", // used if present for the look of the space between panes (at least one of class/style needed) - defaultPaneDividerStyle: - "font-size:small;background-color:#C0C0C0;padding:0px;", // used if present - - s_rcMissingSheet: "Render Context must have a sheet object", // unlikely thrown error - - //*** SocialCalc.format_text_for_display - - defaultLinkFormatString: - 'Link', // used for format "text-link"; you could make this an img tag if desired - // defaultLinkFormatString: 'Link out', - defaultPageLinkFormatString: - 'Page', // used for format "text-link"; you could make this an img tag if desired - - //*** SocialCalc.format_number_for_display - - defaultFormatdt: "d-mmm-yyyy h:mm:ss", - defaultFormatd: "d-mmm-yyyy", - defaultFormatt: "[h]:mm:ss", - defaultDisplayTRUE: "TRUE", // how TRUE shows when rendered - defaultDisplayFALSE: "FALSE", - - // - // SocialCalc Table Editor module, socialcalctableeditor.js: - // - - //*** SocialCalc.TableEditor - - defaultImagePrefix: "/socialcalc/images/sc_", // URL prefix for images (e.g., "/www/assets/images/sc") - defaultTableEditorIDPrefix: "te_", // if present, many TableEditor elements are assigned IDs with this prefix - defaultPageUpDnAmount: 15, // number of rows to move cursor on PgUp/PgDn keys (numeric) - - AllowCtrlS: true, // turns on Ctrl-S trapdoor for setting custom numeric formats and commands if true - - //*** SocialCalc.CreateTableEditor - - defaultTableControlThickness: 0, // the short size for the scrollbars, etc. (numeric in pixels) - cteGriddivClass: "", // if present, the class for the TableEditor griddiv element - - //** SocialCalc.EditorGetStatuslineString -- strings shown on status line - - s_statusline_executing: "Executing...", - s_statusline_displaying: "Displaying...", - s_statusline_ordering: "Ordering...", - s_statusline_calculating: "Calculating...", - s_statusline_calculatingls: "Calculating... Loading Sheet...", - s_statusline_doingserverfunc: "doing server function ", - s_statusline_incell: " in cell ", - s_statusline_calcstart: "Calculation start...", - s_statusline_sum: "SUM", - s_statusline_recalcneeded: - '(Recalc needed)', - s_statusline_circref: 'Circular reference: ', - - //** SocialCalc.InputBoxDisplayCellContents - - s_inputboxdisplaymultilinetext: - "[Multi-line text: Click icon on right to edit]", - - //** SocialCalc.InputEcho - - defaultInputEchoClass: "", // if present, the class of the popup inputEcho div - defaultInputEchoStyle: - "filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;border:1px solid #884;" + - "fontSize:small;padding:2px 10px 1px 2px;cursor:default;", // if present, pseudo style - defaultInputEchoPromptClass: "", // if present, the class of the popup inputEcho div - defaultInputEchoPromptStyle: - "filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;" + - "borderLeft:1px solid #884;borderRight:1px solid #884;borderBottom:1px solid #884;" + - "fontSize:small;fontStyle:italic;padding:2px 10px 1px 2px;cursor:default;", // if present, pseudo style - - //** SocialCalc.InputEchoText - - ietUnknownFunction: "Unknown function ", // displayed when typing "=unknown(" - - //** SocialCalc.CellHandles - - CH_radius1: 29.0, // extent of inner circle within 90px image - CH_radius2: 41.0, // extent of outer circle within 90px image - s_CHfillAllTooltip: "Fill Contents and Formats Down/Right", // tooltip for fill all handle - s_CHfillContentsTooltip: "Fill Contents Only Down/Right", // tooltip for fill formulas handle - s_CHmovePasteAllTooltip: "Move Contents and Formats", // etc. - s_CHmovePasteContentsTooltip: "Move Contents Only", - s_CHmoveInsertAllTooltip: "Slide Contents and Formats within Row/Col", - s_CHmoveInsertContentsTooltip: "Slide Contents within Row/Col", - s_CHindicatorOperationLookup: { - Fill: "Fill", - FillC: "Fill Contents", - Move: "Move", - MoveI: "Slide", - MoveC: "Move Contents", - MoveIC: "Slide Contents", - }, // short form of operation to follow drag - s_CHindicatorDirectionLookup: { - Down: " Down", - Right: " Right", - Horizontal: " Horizontal", - Vertical: " Vertical", - }, // direction that modifies operation during drag - - //*** SocialCalc.TableControl - - defaultTCSliderThickness: 9, // length of pane slider (numeric in pixels) - defaultTCButtonThickness: 20, // length of scroll +/- buttons (numeric in pixels) - defaultTCThumbThickness: 15, // length of thumb (numeric in pixels) - - //*** SocialCalc.CreateTableControl - - TCmainStyle: "backgroundColor:#EEE;", // if present, pseudo style (text-align is textAlign) for main div of a table control - TCmainClass: "", // if present, the CSS class of the main div for a table control - TCendcapStyle: "backgroundColor:#FFF;", // backgroundColor may be used while waiting for image that may not come - TCendcapClass: "", - TCpanesliderStyle: "backgroundColor:#CCC;", - TCpanesliderClass: "", - s_panesliderTooltiph: "Drag to lock pane vertically", // tooltip for horizontal table control pane slider - s_panesliderTooltipv: "Drag to lock pane horizontally", - TClessbuttonStyle: "backgroundColor:#AAA;", - TClessbuttonClass: "", - TClessbuttonRepeatWait: 300, // in milliseconds - TClessbuttonRepeatInterval: 20, //100, // in milliseconds - TCmorebuttonStyle: "backgroundColor:#AAA;", - TCmorebuttonClass: "", - TCmorebuttonRepeatWait: 300, // in milliseconds - TCmorebuttonRepeatInterval: 20, //100, // in milliseconds - TCscrollareaStyle: "backgroundColor:#DDD;", - TCscrollareaClass: "", - TCscrollareaRepeatWait: 500, // in milliseconds - TCscrollareaRepeatInterval: 100, // in milliseconds - TCthumbClass: "", - TCthumbStyle: "backgroundColor:#CCC;", - - //*** SocialCalc.TCPSDragFunctionStart - - TCPStrackinglineClass: "", // at least one of class/style for pane slider tracking line display in table control - TCPStrackinglineStyle: "overflow:hidden;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCPStrackinglineThickness: "2px", // narrow dimension of trackling line (string with units) - - //*** SocialCalc.TCTDragFunctionStart - - TCTDFSthumbstatusvClass: "", // at least one of class/style for vertical thumb dragging status display in table control - TCTDFSthumbstatusvStyle: - "height:20px;width:auto;border:3px solid #808080;overflow:hidden;" + - "backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCTDFSthumbstatushClass: "", // at least one of class/style for horizontal thumb dragging status display in table control - TCTDFSthumbstatushStyle: - "height:20px;width:auto;border:1px solid black;padding:2px;" + - "backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCTDFSthumbstatusrownumClass: "", // at least one of class/style for thumb dragging status display in table control - TCTDFSthumbstatusrownumStyle: - "color:#FFF;background-color:#808080;font-size:small;white-space:nowrap;padding:3px;", // if present, real style - TCTDFStopOffsetv: 0, // offsets for thumbstatus display while dragging - TCTDFSleftOffsetv: -80, - s_TCTDFthumbstatusPrefixv: "Row ", // Text Control Drag Function text before row number - TCTDFStopOffseth: -30, - TCTDFSleftOffseth: 0, - s_TCTDFthumbstatusPrefixh: "Col ", // Text Control Drag Function text before col number - - //*** SocialCalc.TooltipInfo - - // Note: These two values are used to set the TooltipInfo initial values when the code is first read in. - // Modifying them here after loading has no effect -- you need to modify SocialCalc.TooltipInfo directly - // to dynamically set them. This is different than most other constants which may be modified until use. - - TooltipOffsetX: 2, // offset in pixels from mouse position (to right on left side of screen, to left on right) - TooltipOffsetY: 10, // offset in pixels above mouse position for lower edge - - //*** SocialCalc.TooltipDisplay - - TDpopupElementClass: "", // at least one of class/style for tooltip display - TDpopupElementStyle: - "border:1px solid black;padding:1px 2px 2px 2px;textAlign:center;backgroundColor:#FFF;" + - "fontSize:7pt;fontFamily:Verdana,Arial,Helvetica,sans-serif;" + - "position:absolute;width:auto;zIndex:110;", - // if present, pseudo style (text-align is textAlign) - - // - // SocialCalc Spreadsheet Control module, socialcalcspreadsheetcontrol.js: - // - - //*** SocialCalc.SpreadsheetControl - - SCToolbarbackground: "background-color:#404040;", - SCTabbackground: "background-color:#CCC;", - SCTabselectedCSS: - "font-size:small;padding:6px 30px 6px 8px;color:#FFF;background-color:#404040;cursor:default;border-right:1px solid #CCC;", - SCTabplainCSS: - "font-size:small;padding:6px 30px 6px 8px;color:#FFF;background-color:#808080;cursor:default;border-right:1px solid #CCC;", - SCToolbartext: - "font-size:x-small;font-weight:bold;color:#FFF;padding-bottom:4px;", - - SCFormulabarheight: 0, // in pixels, will contain a text input box - - SCStatuslineheight: 20, // in pixels - SCStatuslineCSS: "font-size:10px;padding:3px 0px;", - - // workbook - doWorkBook: true, - SCSheetBarHeight: 25, - SCSheetBarBackground: "background-color:#CCC;", - SCSheetBarCSS: "background-color:#CCC;", - SCSheetBarWidth: "70%", - - SCCellHandlesDisable: true, - SCNoInputEcho: true, // do we need an input echo ? - s_inputboxdisplaynoteditable: "[not editable]", - SCNoRowName: true, - SCNoRanging: true, - SCNoQuoteInInputBox: true, - // Constants for default Format tab (settings) - // - // *** EVEN THOUGH THESE DON'T START WITH s_: *** - // - // These should be carefully checked for localization. Make sure you understand what they do and how they work! - // The first part of "first:second|first:second|..." is what is displayed and the second is the value to be used. - // The value is normally not translated -- only the displayed part. The [cancel], [break], etc., are not translated -- - // they are commands to SocialCalc.SettingsControls.PopupListInitialize - - SCFormatNumberFormats: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Auto w/ commas!:[,]General|[break]:|" + - "00:00|000:000|0000:0000|00000:00000|[break]:|%loc!Formula!:formula|%loc!Hidden!:hidden|[newcol]:" + - "1234:0|1,234:#,##0|1,234.5:#,##0.0|1,234.56:#,##0.00|1,234.567:#,##0.000|1,234.5678:#,##0.0000|" + - "[break]:|1,234%:#,##0%|1,234.5%:#,##0.0%|1,234.56%:#,##0.00%|" + - "[newcol]:|$1,234:$#,##0|$1,234.5:$#,##0.0|$1,234.56:$#,##0.00|[break]:|" + - "(1,234):#,##0_);(#,##0)|(1,234.5):#,##0.0_);(#,##0.0)|(1,234.56):#,##0.00_);(#,##0.00)|[break]:|" + - "($1,234):#,##0_);($#,##0)|($1,234.5):$#,##0.0_);($#,##0.0)|($1,234.56):$#,##0.00_);($#,##0.00)|" + - "[newcol]:|1/4/06:m/d/yy|01/04/2006:mm/dd/yyyy|2006-01-04:yyyy-mm-dd|4-Jan-06:d-mmm-yy|04-Jan-2006:dd-mmm-yyyy|January 4, 2006:mmmm d, yyyy|" + - "[break]:|1\\c23:h:mm|1\\c23 PM:h:mm AM/PM|1\\c23\\c45:h:mm:ss|01\\c23\\c45:hh:mm:ss|26\\c23 (h\\cm):[hh]:mm|69\\c45 (m\\cs):[mm]:ss|69 (s):[ss]|" + - "[newcol]:|2006-01-04 01\\c23\\c45:yyyy-mm-dd hh:mm:ss|January 4, 2006:mmmm d, yyyy hh:mm:ss|Wed:ddd|Wednesday:dddd|", - SCFormatTextFormats: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Plain Text!:text-plain|" + - "HTML:text-html|%loc!Wikitext!:text-wiki|%loc!Link!:text-link|%loc!Formula!:formula|%loc!Hidden!:hidden|", - SCFormatPadsizes: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!No padding!:0px|" + - "[newcol]:|1 pixel:1px|2 pixels:2px|3 pixels:3px|4 pixels:4px|5 pixels:5px|" + - "6 pixels:6px|7 pixels:7px|8 pixels:8px|[newcol]:|9 pixels:9px|10 pixels:10px|11 pixels:11px|" + - "12 pixels:12px|13 pixels:13px|14 pixels:14px|16 pixels:16px|" + - "18 pixels:18px|[newcol]:|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|", - SCFormatFontsizes: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|X-Small:x-small|Small:small|Medium:medium|Large:large|X-Large:x-large|" + - "[newcol]:|6pt:6pt|7pt:7pt|8pt:8pt|9pt:9pt|10pt:10pt|11pt:11pt|12pt:12pt|14pt:14pt|16pt:16pt|" + - "[newcol]:|18pt:18pt|20pt:20pt|22pt:22pt|24pt:24pt|28pt:28pt|36pt:36pt|48pt:48pt|72pt:72pt|" + - "[newcol]:|8 pixels:8px|9 pixels:9px|10 pixels:10px|11 pixels:11px|" + - "12 pixels:12px|13 pixels:13px|14 pixels:14px|[newcol]:|16 pixels:16px|" + - "18 pixels:18px|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|", - SCFormatFontfamilies: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|Verdana:Verdana,Arial,Helvetica,sans-serif|" + - "Arial:arial,helvetica,sans-serif|Courier:'Courier New',Courier,monospace|", - SCFormatFontlook: - "[cancel]:|[break]:|%loc!Default!:|%loc!Normal!:normal normal|%loc!Bold!:normal bold|%loc!Italic!:italic normal|" + - "%loc!Bold Italic!:italic bold", - SCFormatTextAlignhoriz: - "[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|", - SCFormatNumberAlignhoriz: - "[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|", - SCFormatAlignVertical: - "[cancel]:|[break]:|%loc!Default!:|%loc!Top!:top|%loc!Middle!:middle|%loc!Bottom!:bottom|", - SCFormatColwidth: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|" + - "20 pixels:20|40:40|60:60|80:80|100:100|120:120|140:140|160:160|" + - "[newcol]:|180 pixels:180|200:200|220:220|240:240|260:260|280:280|300:300|", - SCFormatRecalc: "[cancel]:|[break]:|%loc!Auto!:|%loc!Manual!:off|", - - //*** SocialCalc.InitializeSpreadsheetControl - - ISCButtonBorderNormal: "#404040", - ISCButtonBorderHover: "#999", - ISCButtonBorderDown: "#FFF", - ISCButtonDownBackground: "#888", - - //*** SocialCalc.SettingsControls.PopupListInitialize - - s_PopupListCancel: "[Cancel]", - s_PopupListCustom: "Custom", - - // *** - // - // s_loc_ constants accessed by SocialCalc.LocalizeString and SocialCalc.LocalizeSubstrings - // - // Used extensively by socialcalcspreadsheetcontrol.js - // - // *** - - s_loc_align_center: "Align Center", - s_loc_align_left: "Align Left", - s_loc_align_right: "Align Right", - s_loc_alignment: "Alignment", - s_loc_audit: "Audit", - s_loc_audit_trail_this_session: "Audit Trail This Session", - s_loc_auto: "Auto", - s_loc_auto_sum: "Auto Sum", - s_loc_auto_wX_commas: "Auto w/ commas", - s_loc_automatic: "Automatic", - s_loc_background: "Background", - s_loc_bold: "Bold", - s_loc_bold_XampX_italics: "Bold & Italics", - s_loc_bold_italic: "Bold Italic", - s_loc_borders: "Borders", - s_loc_borders_off: "Borders Off", - s_loc_borders_on: "Borders On", - s_loc_bottom: "Bottom", - s_loc_bottom_border: "Bottom Border", - s_loc_cell_settings: "CELL SETTINGS", - s_loc_csv_format: "CSV format", - s_loc_cancel: "Cancel", - s_loc_category: "Category", - s_loc_center: "Center", - s_loc_clear: "Clear", - s_loc_clear_socialcalc_clipboard: "Clear SocialCalc Clipboard", - s_loc_clipboard: "Clipboard", - s_loc_color: "Color", - s_loc_column_: "Column ", - s_loc_comment: "Comment", - s_loc_copy: "Copy", - s_loc_custom: "Custom", - s_loc_cut: "Cut", - s_loc_default: "Default", - s_loc_default_alignment: "Default Alignment", - s_loc_default_column_width: "Default Column Width", - s_loc_default_font: "Default Font", - s_loc_default_format: "Default Format", - s_loc_default_padding: "Default Padding", - s_loc_delete: "Delete", - s_loc_delete_column: "Delete Column", - s_loc_delete_contents: "Delete Contents", - s_loc_delete_row: "Delete Row", - s_loc_description: "Description", - s_loc_display_clipboard_in: "Display Clipboard in", - s_loc_down: "Down", - s_loc_edit: "Edit", - s_loc_existing_names: "Existing Names", - s_loc_family: "Family", - s_loc_fill_down: "Fill Down", - s_loc_fill_right: "Fill Right", - s_loc_font: "Font", - s_loc_format: "Format", - s_loc_formula: "Formula", - s_loc_function_list: "Function List", - s_loc_functions: "Functions", - s_loc_grid: "Grid", - s_loc_hidden: "Hidden", - s_loc_horizontal: "Horizontal", - s_loc_insert_column: "Insert Column", - s_loc_insert_row: "Insert Row", - s_loc_italic: "Italic", - s_loc_last_sort: "Last Sort", - s_loc_left: "Left", - s_loc_left_border: "Left Border", - s_loc_link: "Link", - s_loc_link_input_box: "Link Input Box", - s_loc_list: "List", - s_loc_load_socialcalc_clipboard_with_this: - "Load SocialCalc Clipboard With This", - s_loc_major_sort: "Major Sort", - s_loc_manual: "Manual", - s_loc_merge_cells: "Merge Cells", - s_loc_middle: "Middle", - s_loc_minor_sort: "Minor Sort", - s_loc_move_insert: "Move Insert", - s_loc_move_paste: "Move Paste", - s_loc_multiXline_input_box: "Multi-line Input Box", - s_loc_name: "Name", - s_loc_names: "Names", - s_loc_no_padding: "No padding", - s_loc_normal: "Normal", - s_loc_number: "Number", - s_loc_number_horizontal: "Number Horizontal", - s_loc_ok: "OK", - s_loc_padding: "Padding", - s_loc_page_name: "Page Name", - s_loc_paste: "Paste", - s_loc_paste_formats: "Paste Formats", - s_loc_plain_text: "Plain Text", - s_loc_recalc: "Recalc", - s_loc_recalculation: "Recalculation", - s_loc_redo: "Redo", - s_loc_right: "Right", - s_loc_right_border: "Right Border", - s_loc_sheet_settings: "SHEET SETTINGS", - s_loc_save: "Save", - s_loc_save_to: "Save to", - s_loc_set_cell_contents: "Set Cell Contents", - s_loc_set_cells_to_sort: "Set Cells To Sort", - s_loc_set_value_to: "Set Value To", - s_loc_set_to_link_format: "Set to Link format", - s_loc_setXclear_move_from: "Set/Clear Move From", - s_loc_show_cell_settings: "Show Cell Settings", - s_loc_show_sheet_settings: "Show Sheet Settings", - s_loc_show_in_new_browser_window: "Show in new browser window", - s_loc_size: "Size", - s_loc_socialcalcXsave_format: "SocialCalc-save format", - s_loc_sort: "Sort", - s_loc_sort_: "Sort ", - s_loc_sort_cells: "Sort Cells", - s_loc_swap_colors: "Swap Colors", - s_loc_tabXdelimited_format: "Tab-delimited format", - s_loc_text: "Text", - s_loc_text_horizontal: "Text Horizontal", - s_loc_this_is_aXbrXsample: "This is a
sample", - s_loc_top: "Top", - s_loc_top_border: "Top Border", - s_loc_undone_steps: "UNDONE STEPS", - s_loc_url: "URL", - s_loc_undo: "Undo", - s_loc_unmerge_cells: "Unmerge Cells", - s_loc_up: "Up", - s_loc_value: "Value", - s_loc_vertical: "Vertical", - s_loc_wikitext: "Wikitext", - s_loc_workspace: "Workspace", - s_loc_XnewX: "[New]", - s_loc_XnoneX: "[None]", - s_loc_Xselect_rangeX: "[select range]", - - // - // SocialCalc Spreadsheet Viewer module, socialcalcviewer.js: - // - - //*** SocialCalc.SpreadsheetViewer - - SVStatuslineheight: 20, // in pixels - SVStatuslineCSS: "font-size:10px;padding:3px 0px;", - - // - // SocialCalc Format Number module, formatnumber2.js: - // - - FormatNumber_separatorchar: ",", // the thousands separator character when formatting numbers for display - FormatNumber_decimalchar: ".", // the decimal separator character when formatting numbers for display - FormatNumber_defaultCurrency: "$", // the currency string used if none specified - - // The following constants are arrays of strings with the short (3 character) and full names of days and months - - s_FormatNumber_daynames: [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - ], - s_FormatNumber_daynames3: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - s_FormatNumber_monthnames: [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ], - s_FormatNumber_monthnames3: [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - ], - s_FormatNumber_am: "AM", - s_FormatNumber_am1: "A", - s_FormatNumber_pm: "PM", - s_FormatNumber_pm1: "P", - - // - // SocialCalc Spreadsheet Formula module, formula1.js: - // - - s_parseerrexponent: "Improperly formed number exponent", - s_parseerrchar: "Unexpected character in formula", - s_parseerrstring: "Improperly formed string", - s_parseerrspecialvalue: "Improperly formed special value", - s_parseerrtwoops: - "Error in formula (two operators inappropriately in a row)", - s_parseerrmissingopenparen: - "Missing open parenthesis in list with comma(s). ", - s_parseerrcloseparennoopen: - "Closing parenthesis without open parenthesis. ", - s_parseerrmissingcloseparen: "Missing close parenthesis. ", - s_parseerrmissingoperand: "Missing operand. ", - s_parseerrerrorinformula: "Error in formula.", - s_calcerrerrorvalueinformula: "Error value in formula", - s_parseerrerrorinformulabadval: "Error in formula resulting in bad value", - s_formularangeresult: "Formula results in range value:", - s_calcerrnumericnan: "Formula results in an bad numeric value", - s_calcerrnumericoverflow: "Numeric overflow", - s_sheetunavailable: "Sheet unavailable:", // when FindSheetInCache returns null - s_calcerrcellrefmissing: "Cell reference missing when expected.", - s_calcerrsheetnamemissing: "Sheet name missing when expected.", - s_circularnameref: "Circular name reference to name", - s_calcerrunknownname: "Unknown name", - s_calcerrincorrectargstofunction: "Incorrect arguments to function", - s_sheetfuncunknownfunction: "Unknown function", - s_sheetfunclnarg: "LN argument must be greater than 0", - s_sheetfunclog10arg: "LOG10 argument must be greater than 0", - s_sheetfunclogsecondarg: - "LOG second argument must be numeric greater than 0", - s_sheetfunclogfirstarg: "LOG first argument must be greater than 0", - s_sheetfuncroundsecondarg: "ROUND second argument must be numeric", - s_sheetfuncddblife: "DDB life must be greater than 1", - s_sheetfuncslnlife: "SLN life must be greater than 1", - - // Function definition text - - s_fdef_ABS: "Absolute value function. ", - s_fdef_ACOS: "Trigonometric arccosine function. ", - s_fdef_AND: "True if all arguments are true. ", - s_fdef_ASIN: "Trigonometric arcsine function. ", - s_fdef_ATAN: "Trigonometric arctan function. ", - s_fdef_ATAN2: "Trigonometric arc tangent function (result is in radians). ", - s_fdef_AVERAGE: "Averages the values. ", - s_fdef_CHOOSE: - "Returns the value specified by the index. The values may be ranges of cells. ", - s_fdef_COLUMNS: "Returns the number of columns in the range. ", - s_fdef_COS: "Trigonometric cosine function (value is in radians). ", - s_fdef_COUNT: - "Counts the number of numeric values, not blank, text, or error. ", - s_fdef_COUNTA: "Counts the number of non-blank values. ", - s_fdef_COUNTBLANK: - 'Counts the number of blank values. (Note: "" is not blank.) ', - s_fdef_COUNTIF: - '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). ', - s_fdef_DATE: - '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. ', - s_fdef_DAVERAGE: - "Averages the values in the specified field in records that meet the criteria. ", - s_fdef_DAY: "Returns the day of month for a date value. ", - s_fdef_DCOUNT: - "Counts the number of numeric values, not blank, text, or error, in the specified field in records that meet the criteria. ", - s_fdef_DCOUNTA: - "Counts the number of non-blank values in the specified field in records that meet the criteria. ", - s_fdef_DDB: - "Returns the amount of depreciation at the given period of time (the default factor is 2 for double-declining balance). ", - s_fdef_DEGREES: "Converts value in radians into degrees. ", - s_fdef_DGET: - "Returns the value of the specified field in the single record that meets the criteria. ", - s_fdef_DMAX: - "Returns the maximum of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DMIN: - "Returns the maximum of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DPRODUCT: - "Returns the result of multiplying the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DSTDEV: - "Returns the sample standard deviation of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DSTDEVP: - "Returns the standard deviation of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DSUM: - "Returns the sum of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DVAR: - "Returns the sample variance of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DVARP: - "Returns the variance of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_EVEN: - "Rounds the value up in magnitude to the nearest even integer. ", - s_fdef_EXACT: - 'Returns "true" if the values are exactly the same, including case, type, etc. ', - s_fdef_EXP: "Returns e raised to the value power. ", - s_fdef_FACT: "Returns factorial of the value. ", - s_fdef_FALSE: 'Returns the logical value "false". ', - s_fdef_FIND: - 'Returns the starting position within string2 of the first occurrence of string1 at or after "start". If start is omitted, 1 is assumed. ', - s_fdef_FV: - "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). ", - s_fdef_HLOOKUP: - "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. ", - s_fdef_HOUR: "Returns the hour portion of a time or date/time value. ", - s_fdef_IF: - "Results in true-value if logical-expression is TRUE or non-zero, otherwise results in false-value. ", - s_fdef_INDEX: - "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)). ", - s_fdef_INT: - "Returns the value rounded down to the nearest integer (towards -infinity). ", - s_fdef_IRR: - "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%). ", - s_fdef_ISBLANK: - 'Returns "true" if the value is a reference to a blank cell. ', - s_fdef_ISERR: - 'Returns "true" if the value is of type "Error" but not "NA". ', - s_fdef_ISERROR: 'Returns "true" if the value is of type "Error". ', - s_fdef_ISLOGICAL: - 'Returns "true" if the value is of type "Logical" (true/false). ', - s_fdef_ISNA: 'Returns "true" if the value is the error type "NA". ', - s_fdef_ISNONTEXT: 'Returns "true" if the value is not of type "Text". ', - s_fdef_ISNUMBER: - 'Returns "true" if the value is of type "Number" (including logical values). ', - s_fdef_ISTEXT: 'Returns "true" if the value is of type "Text". ', - s_fdef_LEFT: - "Returns the specified number of characters from the text value. If count is omitted, 1 is assumed. ", - s_fdef_LEN: "Returns the number of characters in the text value. ", - s_fdef_LN: "Returns the natural logarithm of the value. ", - s_fdef_LOG: "Returns the logarithm of the value using the specified base. ", - s_fdef_LOG10: "Returns the base 10 logarithm of the value. ", - s_fdef_LOWER: - "Returns the text value with all uppercase characters converted to lowercase. ", - s_fdef_MATCH: - "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. ", - s_fdef_MAX: "Returns the maximum of the numeric values. ", - s_fdef_MID: - "Returns the specified number of characters from the text value starting from the specified position. ", - s_fdef_MIN: "Returns the minimum of the numeric values. ", - s_fdef_MINUTE: "Returns the minute portion of a time or date/time value. ", - s_fdef_MOD: - "Returns the remainder of the first value divided by the second. ", - s_fdef_MONTH: "Returns the month part of a date value. ", - s_fdef_N: "Returns the value if it is a numeric value otherwise an error. ", - s_fdef_NA: - "Returns the #N/A error value which propagates through most operations. ", - s_fdef_NOT: "Returns FALSE if value is true, and TRUE if it is false. ", - s_fdef_NOW: "Returns the current date/time. ", - s_fdef_NPER: - "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. ", - s_fdef_NPV: - "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. ", - s_fdef_ODD: "Rounds the value up in magnitude to the nearest odd integer. ", - s_fdef_OR: "True if any argument is true ", - s_fdef_PI: "The value 3.1415926... ", - s_fdef_PMT: - "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). ", - s_fdef_POWER: "Returns the first value raised to the second value power. ", - s_fdef_PRODUCT: "Returns the result of multiplying the numeric values. ", - s_fdef_PROPER: - "Returns the text value with the first letter of each word converted to uppercase and the others to lowercase. ", - s_fdef_PV: - "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). ", - s_fdef_RADIANS: "Converts value in degrees into radians. ", - s_fdef_RATE: - "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%). ", - s_fdef_REPLACE: - "Returns text1 with the specified number of characters starting from the specified position replaced by text2. ", - s_fdef_REPT: "Returns the text repeated the specified number of times. ", - s_fdef_RIGHT: - "Returns the specified number of characters from the text value starting from the end. If count is omitted, 1 is assumed. ", - s_fdef_ROUND: - "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). ", - s_fdef_ROWS: "Returns the number of rows in the range. ", - s_fdef_SECOND: - "Returns the second portion of a time or date/time value (truncated to an integer). ", - s_fdef_SIN: "Trigonometric sine function (value is in radians) ", - s_fdef_SLN: - "Returns the amount of depreciation at each period of time using the straight-line method. ", - s_fdef_SQRT: "Square root of the value ", - s_fdef_STDEV: - "Returns the sample standard deviation of the numeric values. ", - s_fdef_STDEVP: "Returns the standard deviation of the numeric values. ", - s_fdef_SUBSTITUTE: - 'Returns text1 with the all occurrences of oldtext replaced by newtext. If "occurrence" is present, then only that occurrence is replaced. ', - s_fdef_SUM: - "Adds the numeric values. The values to the sum function may be ranges in the form similar to A1:B5. ", - s_fdef_SUMIF: - '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. ', - s_fdef_SYD: "Depreciation by Sum of Year's Digits method. ", - s_fdef_T: "Returns the text value or else a null string. ", - s_fdef_TAN: "Trigonometric tangent function (value is in radians) ", - s_fdef_TIME: - "Returns the time value given the specified hour, minute, and second. ", - s_fdef_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. ', - s_fdef_TRIM: - "Returns the text value with leading, trailing, and repeated spaces removed. ", - s_fdef_TRUE: 'Returns the logical value "true". ', - s_fdef_TRUNC: - "Truncates the value to the specified number of decimal places. If precision is negative, truncate to powers of 10. ", - s_fdef_UPPER: - "Returns the text value with all lowercase characters converted to uppercase. ", - s_fdef_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. ", - s_fdef_VAR: "Returns the sample variance of the numeric values. ", - s_fdef_VARP: "Returns the variance of the numeric values. ", - s_fdef_VLOOKUP: - "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. ", - s_fdef_WEEKDAY: - "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. ", - s_fdef_YEAR: "Returns the year part of a date value. ", - - s_farg_v: "value", - s_farg_vn: "value1, value2, ...", - s_farg_xy: "valueX, valueY", - s_farg_choose: "index, value1, value2, ...", - s_farg_range: "range", - s_farg_rangec: "range, criteria", - s_farg_date: "year, month, day", - s_farg_dfunc: "databaserange, fieldname, criteriarange", - s_farg_ddb: "cost, salvage, lifetime, period [, factor]", - s_farg_find: "string1, string2 [, start]", - s_farg_fv: "rate, n, payment, [pv, [paytype]]", - s_farg_hlookup: "value, range, row, [rangelookup]", - s_farg_iffunc: "logical-expression, true-value, false-value", - s_farg_index: "range, rownum, colnum", - s_farg_irr: "range, [guess]", - s_farg_tc: "text, count", - s_farg_log: "value, base", - s_farg_match: "value, range, [rangelookup]", - s_farg_mid: "text, start, length", - s_farg_nper: "rate, payment, pv, [fv, [paytype]]", - s_farg_npv: "rate, value1, value2, ...", - s_farg_pmt: "rate, n, pv, [fv, [paytype]]", - s_farg_pv: "rate, n, payment, [fv, [paytype]]", - s_farg_rate: "n, payment, pv, [fv, [paytype, [guess]]]", - s_farg_replace: "text1, start, length, text2", - s_farg_vp: "value, [precision]", - s_farg_valpre: "value, precision", - s_farg_csl: "cost, salvage, lifetime", - s_farg_cslp: "cost, salvage, lifetime, period", - s_farg_subs: "text1, oldtext, newtext [, occurrence]", - s_farg_sumif: "range1, criteria [, range2]", - s_farg_hms: "hour, minute, second", - s_farg_txt: "text", - s_farg_vlookup: "value, range, col, [rangelookup]", - s_farg_weekday: "date, [type]", - s_farg_dt: "date", - - function_classlist: [ - "all", - "stat", - "lookup", - "datetime", - "financial", - "test", - "math", - "text", - ], // order of function classes - - s_fclass_all: "All", - s_fclass_stat: "Statistics", - s_fclass_lookup: "Lookup", - s_fclass_datetime: "Date & Time", - s_fclass_financial: "Financial", - s_fclass_test: "Test", - s_fclass_math: "Math", - s_fclass_text: "Text", - - lastone: null, - }; - - // Default classnames for use with SocialCalc.ConstantsSetClasses: - - SocialCalc.ConstantsDefaultClasses = { - defaultComment: "", - defaultCommentNoGrid: "", - defaultHighlightTypeCursor: "", - defaultHighlightTypeRange: "", - defaultColname: "", - defaultSelectedColname: "", - defaultRowname: "", - defaultSelectedRowname: "", - defaultUpperLeft: "", - defaultSkippedCell: "", - defaultPaneDivider: "", - cteGriddiv: "", // this one has no Style version with it - defaultInputEcho: { - classname: "", - style: "filter:alpha(opacity=90);opacity:.9;", - }, // so FireFox won't show warning - TCmain: "", - TCendcap: "", - TCpaneslider: "", - TClessbutton: "", - TCmorebutton: "", - TCscrollarea: "", - TCthumb: "", - TCPStrackingline: "", - TCTDFSthumbstatus: "", - TDpopupElement: "", - }; - - // - // SocialCalc.ConstantsSetClasses(prefix) - // - // This routine goes through all of the xyzClass/xyzStyle pairs and sets the Class to a default and - // turns off the Style, if present. The prefix is put before each default. - // The list of items to set is in SocialCalc.ConstantsDefaultClasses. The names there - // correspond to the "xyz" parts. If there is a value, it is the default to set. If the - // default is a null, no change is made. If the default is the null string (""), the - // name of the item is used (e.g., "defaultComment" would use the classname "defaultComment"). - // If the default is an object, then it expects {classname: classname, style: stylestring} - this - // lets you combine both. - // - - SocialCalc.ConstantsSetClasses = function (prefix) { - var defaults = SocialCalc.ConstantsDefaultClasses; - var scc = SocialCalc.Constants; - var item; - - prefix = prefix || ""; - - for (item in defaults) { - if (typeof defaults[item] == "string") { - scc[item + "Class"] = prefix + (defaults[item] || item); - if (scc[item + "Style"] !== undefined) { - scc[item + "Style"] = ""; - } - } else if (typeof defaults[item] == "object") { - scc[item + "Class"] = prefix + (defaults[item].classname || item); - scc[item + "Style"] = defaults[item].style; - } - } - }; - - // - // The main SocialCalc code module of the SocialCalc package - // - /* -// (c) Copyright 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - /* - -**** Overview **** - -This is the beginning of a library of routines for displaying and editing spreadsheet -data in a browser. The HTML that includes this does not need to have anything -specific to the spreadsheet or editor already present -- everything is dynamically -added to the DOM by this code, including the rendered sheet and any editing controls. - -The library has a few parts. This is the main SocialCalc code module. -Other parts are the Table Editor module, the Formula module, and the Format Number module. -Note: The Table Editor module is licensed under a different license than this module. - -The class/object style is derived from O'Reilly's JavaScript by Flanagan, 5th Edition, -section 9.3, page 157. - -All of the data, object definitions, functions, etc., are stored as properties of the SocialCalc -object so as not to clutter up the global variables nor conflict with other names. - -A design goal (not tested yet for success) is to make it possible to have more than one -spreadsheet active on a page, perhaps even open for editing. It is assumed, though, that -there is only one mouse and one keyboard (a good assumption on most PCs today but not in the -new "touch and surface world" Apple and Microsoft are working towards). - -The testing has been on Windows Firefox (2 and 3), -Internet Explorer (6 and 7), Opera (9.23 and mainly later), Mac Safari (3.1), and Mac Firefox (2.0.0.6). -There are small issues with Firefox before 2.0 (cosmetic with drag handles) and larger ones -with Opera before 9.5 (the Delete key isn't recognized in some cases -- the 9.5 version was still -in beta and this bug affects other products like GMail, I believe). - -The data is stored in a SocialCalc.Sheet object. The data is organized in a form similar to that -used by SocialCalc 1.1.0. There is a function for converting a normal SocialCalc spreadsheet -save data string (the spreadsheet part of a SocialCalc data file) into this internal form. - -The SocialCalc.RenderContext class provides methods for rendering a table into the DOM representing -part of the spreadsheet. It is assumed that the spreadsheet could possibly be very large -and that rendering the whole thing at once could be too time consuming. It is also set up so -that it might be possible to have some of the sheet data only be loaded on demand (such as by Ajax). -The rendering can render cells to the right and below the already active area of the spreadsheet -so that you can scroll to that "clean" area without explicitly doing "add row/column". The class also -does simple operations such as "scrolling" within that table. The table may optionally include -row and column headers and may be split into panes. Most of the code assumes any number of panes, -but only the rightmost pane has scrolling code. In normal operation there would be one or two -panes horizontally and vertically. The panes may start on any row/column, though a given row/column -should only appear in one pane at a time (not all code enforces this, yet). - -The RenderContext is designed to be rendered as part of a SocialCalc.TableEditor. The TableEditor -includes the spreadsheet grid as well as scrollbars, pane sliders, and (eventually) editing controls. -The layout is dynamic and may be recomputed on the fly, such as in response to resizing the browser -window. - -The scrollbars and pane sliders are created using SocialCalc.TableControl objects. These in turn -make use of Dragging, ToolTip, Button, and MouseWheel functions. - -The keyboard input is handled by keyboard code. - -There are also some helper routines. - -More comments yet to come... - -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; - - // ************************************* - // - // Shared values - // - // These are "global" values shared by the classes, including default settings - // - // ************************************* - - // Callbacks - - SocialCalc.Callbacks = { - // The next two are used by SocialCalc.format_text_for_display - - // The function to expand wiki text - should be set if you want wikitext expansion - // The form is: expand_wiki(displayvalue, sheetobj, linkstyle, valueformat) - // valueformat is text-wiki followed by optional sub-formats, e.g., text-wikipagelink - - expand_wiki: null, - - expand_markup: function ( - displayvalue, - sheetobj, - linkstyle // the old function to expand wiki text - may be replaced - ) { - return SocialCalc.default_expand_markup( - displayvalue, - sheetobj, - linkstyle - ); - }, - - // MakePageLink is used to create the href for a link to another "page" - // The form is: MakePageLink(pagename, workspacename, linktyle, valueformat), returns string - - MakePageLink: null, - - // NormalizeSheetName is used to make different variations of sheetnames use the same cache slot - - NormalizeSheetName: null, // use default - lowercase - }; - - // Shared flags - - // none at present - - // ************************************* - // - // Cell class: - // - // ************************************* - - // - // Class SocialCalc.Cell - // - // Usage: var s = new SocialCalc.Cell(coord); - // - // Cell attributes include: - // - // coord: the column/row as a string, e.g., "A1" - // datavalue: the value to be used for computation and formatting for display, - // string or numeric (tolerant of numbers stored as strings) - // datatype: if present, v=numeric value, t=text value, f=formula, - // or c=constant that is not a simple number (like "$1.20") - // formula: if present, the formula (without leading "=") for computation or the constant - // valuetype: first char is main type, the following are sub-types. - // Main types are b=blank cell, n=numeric, t=text, e=error - // Examples of using sub-types would be "nt" for a numeric time value, "n$" for currency, "nl" for logical - // displayvalue: if present, rendered version of datavalue with formatting attributes applied - // parseinfo: if present, cached parsed version of formula - // - // The following optional values, if present, are mainly used in rendering, overriding defaults: - // - // bt, br, bb, bl: number of border's definition - // layout: layout (vertical alignment, padding) definition number - // font: font definition number - // color: text color definition number - // bgcolor: background color definition number - // cellformat: cell format (horizontal alignment) definition number - // nontextvalueformat: custom format definition number for non-text values, e.g., numbers - // textvalueformat: custom format definition number for text values - // colspan, rowspan: number of cells to span for merged cells (only on main cell) - // cssc: custom css classname for cell, as text (no special chars) - // csss: custom css style definition - // mod: modification allowed flag "y" if present - // comment: cell comment string - // - - SocialCalc.Cell = function (coord) { - this.coord = coord; - this.datavalue = ""; - this.datatype = null; - this.formula = ""; - this.valuetype = "b"; - }; - - // The types of cell properties - // - // Type 1: Base, Type 2: Attribute, Type 3: Special (e.g., displaystring, parseinfo) - - SocialCalc.CellProperties = { - coord: 1, - datavalue: 1, - datatype: 1, - formula: 1, - valuetype: 1, - errors: 1, - comment: 1, - bt: 2, - br: 2, - bb: 2, - bl: 2, - layout: 2, - font: 2, - color: 2, - bgcolor: 2, - cellformat: 2, - nontextvalueformat: 2, - textvalueformat: 2, - colspan: 2, - rowspan: 2, - cssc: 2, - csss: 2, - mod: 2, - displaystring: 3, // used to cache rendered HTML of cell contents - parseinfo: 3, // used to cache parsed formulas - hcolspan: 3, - hrowspan: 3, // spans taking hidden cols/rows into account (!!! NOT YET !!!) - }; - - SocialCalc.CellPropertiesTable = { - bt: "borderstyle", - br: "borderstyle", - bb: "borderstyle", - bl: "borderstyle", - layout: "layout", - font: "font", - color: "color", - bgcolor: "color", - cellformat: "cellformat", - nontextvalueformat: "valueformat", - textvalueformat: "valueformat", - }; - - // ************************************* - // - // Sheet class: - // - // ************************************* - - // - // Class SocialCalc.Sheet - // - // Usage: var s = new SocialCalc.Sheet(); - // - - SocialCalc.Sheet = function () { - SocialCalc.ResetSheet(this); - - // Set other values: - // - // sheet.statuscallback(data, status, arg, this.statuscallbackparams) is called - // during recalc and commands. - // - // During recalc, data is the current recalcdata. - // The values for status and the corresponding arg are: - // - // calcorder, {coord: coord, total: celllist length, count: count} [0 or more times per recalc] - // calccheckdone, calclist length [once per recalc] - // calcstep, {coord: coord, total: calclist length, count: count} [0 or more times per recalc] - // calcloading, {sheetname: name-of-sheet} - // calcserverfunc, {funcname: name-of-function, coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds [once per recalc] - // - // During commands, data is SocialCalc.SheetCommandInfo. - // These values for status and arg are: - // - // cmdstart, cmdstr - // cmdend - // - - this.statuscallback = null; // routine called with cmdstart, calcstart, etc., status and args: - // sheet.statuscallback(data, status, arg, params) - this.statuscallbackparams = null; // parameters passed to that routine - }; - - // - // SocialCalc.ResetSheet(sheet) - // - // Resets (and/or initializes) sheet data values. - // - - SocialCalc.ResetSheet = function (sheet, reload) { - // properties: - - sheet.cells = {}; // at least one for each non-blank cell: coord: cell-object - sheet.attribs = - // sheet attributes - { - lastcol: 1, - lastrow: 1, - defaultlayout: 0, - }; - sheet.rowattribs = { - hide: {}, // access by row number - height: {}, - }; - sheet.colattribs = { - width: {}, // access by col name - hide: {}, - }; - sheet.names = {}; // Each is: {desc: "optional description", definition: "B5, A1:B7, or =formula"} - sheet.layouts = []; - sheet.layouthash = {}; - sheet.fonts = []; - sheet.fonthash = {}; - sheet.colors = []; - sheet.colorhash = {}; - sheet.borderstyles = []; - sheet.borderstylehash = {}; - sheet.cellformats = []; - sheet.cellformathash = {}; - sheet.valueformats = []; - sheet.valueformathash = {}; - - sheet.copiedfrom = ""; // if a range, then this was loaded from a saved range as clipboard content - - sheet.changes = new SocialCalc.UndoStack(); - - sheet.renderneeded = false; - - sheet.changedrendervalues = true; // if true, spans and/or fonts have changed (set by ExecuteSheetCommand & GetStyle) - - sheet.recalcchangedavalue = false; // true if a recalc resulted in a change to a cell's calculated value - }; - - // Methods: - - SocialCalc.Sheet.prototype.ResetSheet = function () { - SocialCalc.ResetSheet(this); - }; - SocialCalc.Sheet.prototype.AddCell = function (newcell) { - return (this.cells[newcell.coord] = newcell); - }; - SocialCalc.Sheet.prototype.GetAssuredCell = function (coord) { - return this.cells[coord] || this.AddCell(new SocialCalc.Cell(coord)); - }; - SocialCalc.Sheet.prototype.ParseSheetSave = function (savedsheet) { - SocialCalc.ParseSheetSave(savedsheet, this); - }; - SocialCalc.Sheet.prototype.CellFromStringParts = function (cell, parts, j) { - return SocialCalc.CellFromStringParts(this, cell, parts, j); - }; - SocialCalc.Sheet.prototype.CreateSheetSave = function (range, canonicalize) { - return SocialCalc.CreateSheetSave(this, range, canonicalize); - }; - SocialCalc.Sheet.prototype.CellToString = function (cell) { - return SocialCalc.CellToString(this, cell); - }; - SocialCalc.Sheet.prototype.CanonicalizeSheet = function (full) { - return SocialCalc.CanonicalizeSheet(this, full); - }; - SocialCalc.Sheet.prototype.EncodeCellAttributes = function (coord) { - return SocialCalc.EncodeCellAttributes(this, coord); - }; - SocialCalc.Sheet.prototype.EncodeSheetAttributes = function () { - return SocialCalc.EncodeSheetAttributes(this); - }; - SocialCalc.Sheet.prototype.DecodeCellAttributes = function ( - coord, - attribs, - range - ) { - return SocialCalc.DecodeCellAttributes(this, coord, attribs, range); - }; - SocialCalc.Sheet.prototype.DecodeSheetAttributes = function (attribs) { - return SocialCalc.DecodeSheetAttributes(this, attribs); - }; - - SocialCalc.Sheet.prototype.ScheduleSheetCommands = function ( - cmd, - saveundo, - isRemote - ) { - return SocialCalc.ScheduleSheetCommands(this, cmd, saveundo, isRemote); - }; - SocialCalc.Sheet.prototype.SheetUndo = function () { - return SocialCalc.SheetUndo(this); - }; - SocialCalc.Sheet.prototype.SheetRedo = function () { - return SocialCalc.SheetRedo(this); - }; - SocialCalc.Sheet.prototype.CreateAuditString = function () { - return SocialCalc.CreateAuditString(this); - }; - SocialCalc.Sheet.prototype.GetStyleNum = function (atype, style) { - return SocialCalc.GetStyleNum(this, atype, style); - }; - SocialCalc.Sheet.prototype.GetStyleString = function (atype, num) { - return SocialCalc.GetStyleString(this, atype, num); - }; - SocialCalc.Sheet.prototype.RecalcSheet = function () { - return SocialCalc.RecalcSheet(this); - }; - - // - // Sheet save format: - // - // linetype:param1:param2:... - // - // Linetypes are: - // - // version:versionname - version of this format. Currently 1.4. - // - // cell:coord:type:value...:type:value... - Types are as follows: - // - // v:value - straight numeric value - // t:value - straight text/wiki-text in cell, encoded to handle \, :, newlines - // vt:fulltype:value - value with value type/subtype - // vtf:fulltype:value:formulatext - formula resulting in value with value type/subtype, value and text encoded - // vtc:fulltype:value:valuetext - formatted text constant resulting in value with value type/subtype, value and text encoded - // vf:fvalue:formulatext - formula resulting in value, value and text encoded (obsolete: only pre format version 1.1) - // fvalue - first char is "N" for numeric value, "T" for text value, "H" for HTML value, rest is the value - // e:errortext - Error text. Non-blank means formula parsing/calculation results in error. - // b:topborder#:rightborder#:bottomborder#:leftborder# - border# in sheet border list or blank if none - // l:layout# - number in cell layout list - // f:font# - number in sheet fonts list - // c:color# - sheet color list index for text - // bg:color# - sheet color list index for background color - // cf:format# - sheet cell format number for explicit format (align:left, etc.) - // cvf:valueformat# - sheet cell value format number (obsolete: only pre format v1.2) - // tvf:valueformat# - sheet cell text value format number - // ntvf:valueformat# - sheet cell non-text value format number - // colspan:numcols - number of columns spanned in merged cell - // rowspan:numrows - number of rows spanned in merged cell - // cssc:classname - name of CSS class to be used for cell when published instead of one calculated here - // csss:styletext - explicit CSS style information, encoded to handle :, etc. - // mod:allow - if "y" allow modification of cell for live "view" recalc - // comment:value - encoded text of comment for this cell (added in v1.5) - // - // col: - // w:widthval - number, "auto" (no width in tag), number%, or blank (use default) - // hide: - yes/no, no is assumed if missing - // row: - // hide - yes/no, no is assumed if missing - // - // sheet: - // c:lastcol - number - // r:lastrow - number - // w:defaultcolwidth - number, "auto", number%, or blank (default->80) - // h:defaultrowheight - not used - // tf:format# - cell format number for sheet default for text values - // ntf:format# - cell format number for sheet default for non-text values (i.e., numbers) - // layout:layout# - default cell layout number in cell layout list - // font:font# - default font number in sheet font list - // vf:valueformat# - default number value format number in sheet valueformat list (obsolete: only pre format version 1.2) - // ntvf:valueformat# - default non-text (number) value format number in sheet valueformat list - // tvf:valueformat# - default text value format number in sheet valueformat list - // color:color# - default number for text color in sheet color list - // bgcolor:color# - default number for background color in sheet color list - // circularreferencecell:coord - cell coord with a circular reference - // recalc:value - on/off (on is default). If not "off", appropriate changes to the sheet cause a recalc - // needsrecalc:value - yes/no (no is default). If "yes", formula values are not up to date - // - // name:name:description:value - name definition, name in uppercase, with value being "B5", "A1:B7", or "=formula"; - // description and value are encoded. - // font:fontnum:value - text of font definition (style weight size family) for font fontnum - // "*" for "style weight", size, or family, means use default (first look to sheet, then builtin) - // color:colornum:rgbvalue - text of color definition (e.g., rgb(255,255,255)) for color colornum - // border:bordernum:value - text of border definition (thickness style color) for border bordernum - // layout:layoutnum:value - text of vertical alignment and padding style for cell layout layoutnum (* for default): - // vertical-alignment:vavalue;padding:topval rightval bottomval leftval; - // cellformat:cformatnum:value - text of cell alignment (left/center/right) for cellformat cformatnum - // valueformat:vformatnum:value - text of number format (see FormatValueForDisplay) for valueformat vformatnum (changed in v1.2) - // clipboardrange:upperleftcoord:bottomrightcoord - ignored -- from wikiCalc - // clipboard:coord:type:value:... - ignored -- from wikiCalc - // - // If this is clipboard contents, then there is also information to facilitate pasting: - // - // copiedfrom:upperleftcoord:bottomrightcoord - range from which this was copied - // - - // Functions: - - SocialCalc.ParseSheetSave = function (savedsheet, sheetobj) { - var lines = savedsheet.split(/\r\n|\n/); - var parts = []; - var line; - var i, j, t, v, coord, cell, attribs, name; - var scc = SocialCalc.Constants; - - for (i = 0; i < lines.length; i++) { - line = lines[i]; - parts = line.split(":"); - switch (parts[0]) { - case "cell": - cell = sheetobj.GetAssuredCell(parts[1]); - j = 2; - sheetobj.CellFromStringParts(cell, parts, j); - break; - - case "col": - coord = parts[1]; - j = 2; - while ((t = parts[j++])) { - switch (t) { - case "w": - sheetobj.colattribs.width[coord] = parts[j++]; // must be text - could be auto or %, etc. - break; - case "hide": - sheetobj.colattribs.hide[coord] = parts[j++]; - break; - default: - throw scc.s_pssUnknownColType + " '" + t + "'"; - break; - } - } - break; - - case "row": - coord = parts[1] - 0; - j = 2; - while ((t = parts[j++])) { - switch (t) { - case "h": - sheetobj.rowattribs.height[coord] = parts[j++] - 0; - break; - case "hide": - sheetobj.rowattribs.hide[coord] = parts[j++]; - break; - default: - throw scc.s_pssUnknownRowType + " '" + t + "'"; - break; - } - } - break; - - case "sheet": - attribs = sheetobj.attribs; - j = 1; - while ((t = parts[j++])) { - switch (t) { - case "c": - attribs.lastcol = parts[j++] - 0; - break; - case "r": - attribs.lastrow = parts[j++] - 0; - break; - case "w": - attribs.defaultcolwidth = parts[j++] + ""; - break; - case "h": - attribs.defaultrowheight = parts[j++] - 0; - break; - case "tf": - attribs.defaulttextformat = parts[j++] - 0; - break; - case "ntf": - attribs.defaultnontextformat = parts[j++] - 0; - break; - case "layout": - attribs.defaultlayout = parts[j++] - 0; - break; - case "font": - attribs.defaultfont = parts[j++] - 0; - break; - case "tvf": - attribs.defaulttextvalueformat = parts[j++] - 0; - break; - case "ntvf": - attribs.defaultnontextvalueformat = parts[j++] - 0; - break; - case "color": - attribs.defaultcolor = parts[j++] - 0; - break; - case "bgcolor": - attribs.defaultbgcolor = parts[j++] - 0; - break; - case "circularreferencecell": - attribs.circularreferencecell = parts[j++]; - break; - case "recalc": - attribs.recalc = parts[j++]; - break; - case "needsrecalc": - attribs.needsrecalc = parts[j++]; - break; - default: - j += 1; - break; - } - } - break; - - case "name": - name = SocialCalc.decodeFromSave(parts[1]).toUpperCase(); - sheetobj.names[name] = { desc: SocialCalc.decodeFromSave(parts[2]) }; - sheetobj.names[name].definition = SocialCalc.decodeFromSave(parts[3]); - break; - - case "layout": - parts = lines[i].match(/^layout\:(\d+)\:(.+)$/); // layouts can have ":" in them - sheetobj.layouts[parts[1] - 0] = parts[2]; - sheetobj.layouthash[parts[2]] = parts[1] - 0; - break; - - case "font": - sheetobj.fonts[parts[1] - 0] = parts[2]; - sheetobj.fonthash[parts[2]] = parts[1] - 0; - break; - - case "color": - sheetobj.colors[parts[1] - 0] = parts[2]; - sheetobj.colorhash[parts[2]] = parts[1] - 0; - break; - - case "border": - sheetobj.borderstyles[parts[1] - 0] = parts[2]; - sheetobj.borderstylehash[parts[2]] = parts[1] - 0; - break; - - case "cellformat": - v = SocialCalc.decodeFromSave(parts[2]); - sheetobj.cellformats[parts[1] - 0] = v; - sheetobj.cellformathash[v] = parts[1] - 0; - break; - - case "valueformat": - v = SocialCalc.decodeFromSave(parts[2]); - sheetobj.valueformats[parts[1] - 0] = v; - sheetobj.valueformathash[v] = parts[1] - 0; - break; - - case "version": - break; - - case "copiedfrom": - sheetobj.copiedfrom = parts[1] + ":" + parts[2]; - break; - - case "clipboardrange": // in save versions up to 1.3. Ignored. - case "clipboard": - break; - - case "": - break; - - default: - alert(scc.s_pssUnknownLineType + " '" + parts[0] + "'"); - throw scc.s_pssUnknownLineType + " '" + parts[0] + "'"; - break; - } - parts = null; - } - }; - - // - // SocialCalc.CellFromStringParts(sheet, cell, parts, j) - // - // Takes string that has been split by ":" in parts, starting at item j, - // and fills in cell assuming save format. - // - - SocialCalc.CellFromStringParts = function (sheet, cell, parts, j) { - var cell, t, v; - - while ((t = parts[j++])) { - switch (t) { - case "v": - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - cell.datatype = "v"; - cell.valuetype = "n"; - break; - case "t": - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - cell.datatype = "t"; - cell.valuetype = SocialCalc.Constants.textdatadefaulttype; - break; - case "vt": - v = parts[j++]; - cell.valuetype = v; - if (v.charAt(0) == "n") { - cell.datatype = "v"; - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - } else { - cell.datatype = "t"; - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - } - break; - case "vtf": - v = parts[j++]; - cell.valuetype = v; - if (v.charAt(0) == "n") { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - } else { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - } - cell.formula = SocialCalc.decodeFromSave(parts[j++]); - cell.datatype = "f"; - break; - case "vtc": - v = parts[j++]; - cell.valuetype = v; - if (v.charAt(0) == "n") { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - } else { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - } - cell.formula = SocialCalc.decodeFromSave(parts[j++]); - cell.datatype = "c"; - break; - case "e": - cell.errors = SocialCalc.decodeFromSave(parts[j++]); - break; - case "b": - cell.bt = parts[j++] - 0; - cell.br = parts[j++] - 0; - cell.bb = parts[j++] - 0; - cell.bl = parts[j++] - 0; - break; - case "l": - cell.layout = parts[j++] - 0; - break; - case "f": - cell.font = parts[j++] - 0; - break; - case "c": - cell.color = parts[j++] - 0; - break; - case "bg": - cell.bgcolor = parts[j++] - 0; - break; - case "cf": - cell.cellformat = parts[j++] - 0; - break; - case "ntvf": - cell.nontextvalueformat = parts[j++] - 0; - break; - case "tvf": - cell.textvalueformat = parts[j++] - 0; - break; - case "colspan": - cell.colspan = parts[j++] - 0; - break; - case "rowspan": - cell.rowspan = parts[j++] - 0; - break; - case "cssc": - cell.cssc = parts[j++]; - break; - case "csss": - cell.csss = SocialCalc.decodeFromSave(parts[j++]); - break; - case "mod": - j += 1; - break; - case "comment": - cell.comment = SocialCalc.decodeFromSave(parts[j++]); - break; - default: - throw SocialCalc.Constants.s_cfspUnknownCellType + " '" + t + "'"; - break; - } - } - }; - - SocialCalc.sheetfields = [ - "defaultrowheight", - "defaultcolwidth", - "circularreferencecell", - "recalc", - "needsrecalc", - ]; - SocialCalc.sheetfieldsshort = [ - "h", - "w", - "circularreferencecell", - "recalc", - "needsrecalc", - ]; - - SocialCalc.sheetfieldsxlat = [ - "defaulttextformat", - "defaultnontextformat", - "defaulttextvalueformat", - "defaultnontextvalueformat", - "defaultcolor", - "defaultbgcolor", - "defaultfont", - "defaultlayout", - ]; - SocialCalc.sheetfieldsxlatshort = [ - "tf", - "ntf", - "tvf", - "ntvf", - "color", - "bgcolor", - "font", - "layout", - ]; - SocialCalc.sheetfieldsxlatxlt = [ - "cellformat", - "cellformat", - "valueformat", - "valueformat", - "color", - "color", - "font", - "layout", - ]; - - // - // sheetstr = SocialCalc.CreateSheetSave(sheetobj, range, canonicalize) - // - // Creates a text representation of the sheetobj data. - // If the range is present then only those cells are saved - // (as clipboard data with "copiedfrom" set). - // - - SocialCalc.CreateSheetSave = function (sheetobj, range, canonicalize) { - var cell, - cr1, - cr2, - row, - col, - coord, - attrib, - line, - value, - formula, - i, - t, - r, - b, - l, - name, - blanklen; - var result = []; - - var prange; - - sheetobj.CanonicalizeSheet( - canonicalize || SocialCalc.Constants.doCanonicalizeSheet - ); - var xlt = sheetobj.xlt; - - if (range) { - prange = SocialCalc.ParseRange(range); - } else { - prange = { - cr1: { row: 1, col: 1 }, - cr2: { row: xlt.maxrow, col: xlt.maxcol }, - }; - } - cr1 = prange.cr1; - cr2 = prange.cr2; - - result.push("version:1.5"); - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - coord = SocialCalc.crToCoord(col, row); - cell = sheetobj.cells[coord]; - if (!cell) continue; - line = sheetobj.CellToString(cell); - if (line.length == 0) continue; // ignore completely empty cells - line = "cell:" + coord + line; - result.push(line); - } - } - - for (col = 1; col <= xlt.maxcol; col++) { - coord = SocialCalc.rcColname(col); - if (sheetobj.colattribs.width[coord]) - result.push("col:" + coord + ":w:" + sheetobj.colattribs.width[coord]); - if (sheetobj.colattribs.hide[coord]) - result.push( - "col:" + coord + ":hide:" + sheetobj.colattribs.hide[coord] - ); - } - - for (row = 1; row <= xlt.maxrow; row++) { - if (sheetobj.rowattribs.height[row]) - result.push("row:" + row + ":h:" + sheetobj.rowattribs.height[row]); - if (sheetobj.rowattribs.hide[row]) - result.push("row:" + row + ":hide:" + sheetobj.rowattribs.hide[row]); - } - - line = "sheet:c:" + xlt.maxcol + ":r:" + xlt.maxrow; - - for (i = 0; i < SocialCalc.sheetfields.length; i++) { - // non-xlated values - value = SocialCalc.encodeForSave( - sheetobj.attribs[SocialCalc.sheetfields[i]] - ); - if (value) line += ":" + SocialCalc.sheetfieldsshort[i] + ":" + value; - } - for (i = 0; i < SocialCalc.sheetfieldsxlat.length; i++) { - // xlated values - value = sheetobj.attribs[SocialCalc.sheetfieldsxlat[i]]; - if (value) - line += - ":" + - SocialCalc.sheetfieldsxlatshort[i] + - ":" + - xlt[SocialCalc.sheetfieldsxlatxlt[i] + "sxlat"][value]; - } - - result.push(line); - - for (i = 1; i < xlt.newborderstyles.length; i++) { - result.push("border:" + i + ":" + xlt.newborderstyles[i]); - } - - for (i = 1; i < xlt.newcellformats.length; i++) { - result.push( - "cellformat:" + - i + - ":" + - SocialCalc.encodeForSave(xlt.newcellformats[i]) - ); - } - - for (i = 1; i < xlt.newcolors.length; i++) { - result.push("color:" + i + ":" + xlt.newcolors[i]); - } - - for (i = 1; i < xlt.newfonts.length; i++) { - result.push("font:" + i + ":" + xlt.newfonts[i]); - } - - for (i = 1; i < xlt.newlayouts.length; i++) { - result.push("layout:" + i + ":" + xlt.newlayouts[i]); - } - - for (i = 1; i < xlt.newvalueformats.length; i++) { - result.push( - "valueformat:" + - i + - ":" + - SocialCalc.encodeForSave(xlt.newvalueformats[i]) - ); - } - - for (i = 0; i < xlt.namesorder.length; i++) { - name = xlt.namesorder[i]; - result.push( - "name:" + - SocialCalc.encodeForSave(name).toUpperCase() + - ":" + - SocialCalc.encodeForSave(sheetobj.names[name].desc) + - ":" + - SocialCalc.encodeForSave(sheetobj.names[name].definition) - ); - } - - if (range) { - result.push( - "copiedfrom:" + - SocialCalc.crToCoord(cr1.col, cr1.row) + - ":" + - SocialCalc.crToCoord(cr2.col, cr2.row) - ); - } - - result.push(""); // one extra to get extra \n - - delete sheetobj.xlt; // clean up - - return result.join("\n"); - }; - - // - // line = SocialCalc.CellToString(sheet, cell) - // - - SocialCalc.CellToString = function (sheet, cell) { - var cell, line, value, formula, t, r, b, l, xlt; - - line = ""; - - if (!cell) return line; - - value = SocialCalc.encodeForSave(cell.datavalue); - if (cell.datatype == "v") { - if (cell.valuetype == "n") line += ":v:" + value; - else line += ":vt:" + cell.valuetype + ":" + value; - } else if (cell.datatype == "t") { - if (cell.valuetype == SocialCalc.Constants.textdatadefaulttype) - line += ":t:" + value; - else line += ":vt:" + cell.valuetype + ":" + value; - } else { - formula = SocialCalc.encodeForSave(cell.formula); - if (cell.datatype == "f") { - line += ":vtf:" + cell.valuetype + ":" + value + ":" + formula; - } else if (cell.datatype == "c") { - line += ":vtc:" + cell.valuetype + ":" + value + ":" + formula; - } - } - if (cell.errors) { - line += ":e:" + SocialCalc.encodeForSave(cell.errors); - } - t = cell.bt || ""; - r = cell.br || ""; - b = cell.bb || ""; - l = cell.bl || ""; - - if (sheet.xlt) { - // if have canonical save info - xlt = sheet.xlt; - if (t || r || b || l) - line += - ":b:" + - xlt.borderstylesxlat[t || 0] + - ":" + - xlt.borderstylesxlat[r || 0] + - ":" + - xlt.borderstylesxlat[b || 0] + - ":" + - xlt.borderstylesxlat[l || 0]; - if (cell.layout) line += ":l:" + xlt.layoutsxlat[cell.layout]; - if (cell.font) line += ":f:" + xlt.fontsxlat[cell.font]; - if (cell.color) line += ":c:" + xlt.colorsxlat[cell.color]; - if (cell.bgcolor) line += ":bg:" + xlt.colorsxlat[cell.bgcolor]; - if (cell.cellformat) - line += ":cf:" + xlt.cellformatsxlat[cell.cellformat]; - if (cell.textvalueformat) - line += ":tvf:" + xlt.valueformatsxlat[cell.textvalueformat]; - if (cell.nontextvalueformat) - line += ":ntvf:" + xlt.valueformatsxlat[cell.nontextvalueformat]; - } else { - if (t || r || b || l) line += ":b:" + t + ":" + r + ":" + b + ":" + l; - if (cell.layout) line += ":l:" + cell.layout; - if (cell.font) line += ":f:" + cell.font; - if (cell.color) line += ":c:" + cell.color; - if (cell.bgcolor) line += ":bg:" + cell.bgcolor; - if (cell.cellformat) line += ":cf:" + cell.cellformat; - if (cell.textvalueformat) line += ":tvf:" + cell.textvalueformat; - if (cell.nontextvalueformat) line += ":ntvf:" + cell.nontextvalueformat; - } - if (cell.colspan) line += ":colspan:" + cell.colspan; - if (cell.rowspan) line += ":rowspan:" + cell.rowspan; - if (cell.cssc) line += ":cssc:" + cell.cssc; - if (cell.csss) line += ":csss:" + SocialCalc.encodeForSave(cell.csss); - if (cell.mod) line += ":mod:" + cell.mod; - if (cell.comment) - line += ":comment:" + SocialCalc.encodeForSave(cell.comment); - - return line; - }; - - // - // SocialCalc.CanonicalizeSheet(sheetobj, full) - // - // Goes through the sheet and fills in sheetobj.xlt with the following: - // - // .maxrow, .maxcol - lastrow and lastcol are as small as possible - // .newlayouts - new version of sheetobj.layouts without unused ones and all in ascending order - // .layoutsxlat - maps old layouts index to new one - // same ".new" and ".xlat" for fonts, colors, borderstyles, cell and value formats - // .namesorder - array with names sorted - // - // If full or SocialCalc.Constants.doCanonicalizeSheet are not true, then the values will leave things unchanged (to save time, etc.) - // - // sheetobj.xlt should be deleted when you are finished using it - // - - SocialCalc.CanonicalizeSheet = function (sheetobj, full) { - var l, coord, cr, cell, filled, an, a, newa, newxlat, used, ahash, i, v; - var maxrow = 0; - var maxcol = 0; - var alist = [ - "borderstyle", - "cellformat", - "color", - "font", - "layout", - "valueformat", - ]; - - var xlt = {}; - - xlt.namesorder = []; // always return a sorted list - for (a in sheetobj.names) { - xlt.namesorder.push(a); - } - xlt.namesorder.sort(); - - if (!SocialCalc.Constants.doCanonicalizeSheet || !full) { - // return make-no-changes values if not wanted - for (an = 0; an < alist.length; an++) { - a = alist[an]; - xlt["new" + a + "s"] = sheetobj[a + "s"]; - l = sheetobj[a + "s"].length; - newxlat = new Array(l); - newxlat[0] = ""; - for (i = 1; i < l; i++) { - newxlat[i] = i; - } - xlt[a + "sxlat"] = newxlat; - } - - xlt.maxrow = sheetobj.attribs.lastrow; - xlt.maxcol = sheetobj.attribs.lastcol; - - sheetobj.xlt = xlt; - - return; - } - - for (an = 0; an < alist.length; an++) { - a = alist[an]; - xlt[a + "sUsed"] = {}; - } - - var colorsUsed = xlt.colorsUsed; - var borderstylesUsed = xlt.borderstylesUsed; - var fontsUsed = xlt.fontsUsed; - var layoutsUsed = xlt.layoutsUsed; - var cellformatsUsed = xlt.cellformatsUsed; - var valueformatsUsed = xlt.valueformatsUsed; - - for (coord in sheetobj.cells) { - // check all cells to see which values are used - cr = SocialCalc.coordToCr(coord); - cell = sheetobj.cells[coord]; - filled = false; - - if (cell.valuetype && cell.valuetype != "b") filled = true; - - if (cell.color) { - colorsUsed[cell.color] = 1; - filled = true; - } - - if (cell.bgcolor) { - colorsUsed[cell.bgcolor] = 1; - filled = true; - } - - if (cell.bt) { - borderstylesUsed[cell.bt] = 1; - filled = true; - } - if (cell.br) { - borderstylesUsed[cell.br] = 1; - filled = true; - } - if (cell.bb) { - borderstylesUsed[cell.bb] = 1; - filled = true; - } - if (cell.bl) { - borderstylesUsed[cell.bl] = 1; - filled = true; - } - - if (cell.layout) { - layoutsUsed[cell.layout] = 1; - filled = true; - } - - if (cell.font) { - fontsUsed[cell.font] = 1; - filled = true; - } - - if (cell.cellformat) { - cellformatsUsed[cell.cellformat] = 1; - filled = true; - } - - if (cell.textvalueformat) { - valueformatsUsed[cell.textvalueformat] = 1; - filled = true; - } - - if (cell.nontextvalueformat) { - valueformatsUsed[cell.nontextvalueformat] = 1; - filled = true; - } - - if (filled) { - if (cr.row > maxrow) maxrow = cr.row; - if (cr.col > maxcol) maxcol = cr.col; - } - } - - for (i = 0; i < SocialCalc.sheetfieldsxlat.length; i++) { - // do sheet values, too - v = sheetobj.attribs[SocialCalc.sheetfieldsxlat[i]]; - if (v) { - xlt[SocialCalc.sheetfieldsxlatxlt[i] + "sUsed"][v] = 1; - } - } - - a = { height: 1, hide: 1 }; // look at explicit row settings - for (v in a) { - for (cr in sheetobj.rowattribs[v]) { - if (cr > maxrow) maxrow = cr; - } - } - a = { hide: 1, width: 1 }; // look at explicit col settings - for (v in a) { - for (coord in sheetobj.colattribs[v]) { - cr = SocialCalc.coordToCr(coord + "1"); - if (cr.col > maxcol) maxcol = cr.col; - } - } - - for (an = 0; an < alist.length; an++) { - // go through the attribs we want - a = alist[an]; - - newa = []; - used = xlt[a + "sUsed"]; - for (v in used) { - newa.push(sheetobj[a + "s"][v]); - } - newa.sort(); - newa.unshift(""); - - newxlat = [""]; - ahash = sheetobj[a + "hash"]; - - for (i = 1; i < newa.length; i++) { - newxlat[ahash[newa[i]]] = i; - } - - xlt[a + "sxlat"] = newxlat; - xlt["new" + a + "s"] = newa; - } - - xlt.maxrow = maxrow || 1; - xlt.maxcol = maxcol || 1; - - sheetobj.xlt = xlt; // leave for use by caller - }; - - // - // result = SocialCalc.EncodeCellAttributes(sheet, coord) - // - // Returns the cell's attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - - SocialCalc.EncodeCellAttributes = function (sheet, coord) { - var value, i, b, bb, parts; - var result = {}; - - var InitAttrib = function (name) { - result[name] = { def: true, val: "" }; - }; - - var InitAttribs = function (namelist) { - for (var i = 0; i < namelist.length; i++) { - InitAttrib(namelist[i]); - } - }; - - var SetAttrib = function (name, v) { - result[name].def = false; - result[name].val = v || ""; - }; - - var SetAttribStar = function (name, v) { - if (v == "*") return; - result[name].def = false; - result[name].val = v; - }; - - var cell = sheet.GetAssuredCell(coord); - - // cellformat: alignhoriz - - InitAttrib("alignhoriz"); - if (cell.cellformat) { - SetAttrib("alignhoriz", sheet.cellformats[cell.cellformat]); - } - - // layout: alignvert, padtop, padright, padbottom, padleft - - InitAttribs(["alignvert", "padtop", "padright", "padbottom", "padleft"]); - if (cell.layout) { - parts = sheet.layouts[cell.layout].match( - /^padding:\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+);vertical-align:\s*(\S+);/ - ); - SetAttribStar("padtop", parts[1]); - SetAttribStar("padright", parts[2]); - SetAttribStar("padbottom", parts[3]); - SetAttribStar("padleft", parts[4]); - SetAttribStar("alignvert", parts[5]); - } - - // font: fontfamily, fontlook, fontsize - - InitAttribs(["fontfamily", "fontlook", "fontsize"]); - if (cell.font) { - parts = sheet.fonts[cell.font].match(/^(\*|\S+? \S+?) (\S+?) (\S.*)$/); - SetAttribStar("fontfamily", parts[3]); - SetAttribStar("fontsize", parts[2]); - SetAttribStar("fontlook", parts[1]); - } - - // color: textcolor - - InitAttrib("textcolor"); - if (cell.color) { - SetAttrib("textcolor", sheet.colors[cell.color]); - } - - // bgcolor: bgcolor - - InitAttrib("bgcolor"); - if (cell.bgcolor) { - SetAttrib("bgcolor", sheet.colors[cell.bgcolor]); - } - - // formatting: numberformat, textformat - - InitAttribs(["numberformat", "textformat"]); - if (cell.nontextvalueformat) { - SetAttrib("numberformat", sheet.valueformats[cell.nontextvalueformat]); - } - if (cell.textvalueformat) { - SetAttrib("textformat", sheet.valueformats[cell.textvalueformat]); - } - - // merges: colspan, rowspan - - InitAttribs(["colspan", "rowspan"]); - SetAttrib("colspan", cell.colspan || 1); - SetAttrib("rowspan", cell.rowspan || 1); - - // borders: bXthickness, bXstyle, bXcolor for X = t, r, b, and l - - for (i = 0; i < 4; i++) { - b = "trbl".charAt(i); - bb = "b" + b; - InitAttrib(bb); - SetAttrib(bb, cell[bb] ? sheet.borderstyles[cell[bb]] : ""); - InitAttrib(bb + "thickness"); - InitAttrib(bb + "style"); - InitAttrib(bb + "color"); - if (cell[bb]) { - parts = sheet.borderstyles[cell[bb]].match(/(\S+)\s+(\S+)\s+(\S.+)/); - SetAttrib(bb + "thickness", parts[1]); - SetAttrib(bb + "style", parts[2]); - SetAttrib(bb + "color", parts[3]); - } - } - - // misc: cssc, csss, mod - - InitAttribs(["cssc", "csss", "mod"]); - SetAttrib("cssc", cell.cssc || ""); - SetAttrib("csss", cell.csss || ""); - SetAttrib("mod", cell.mod || "n"); - - return result; - }; - - // - // result = SocialCalc.EncodeSheetAttributes(sheet) - // - // Returns the sheet's attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - - SocialCalc.EncodeSheetAttributes = function (sheet) { - var value; - var attribs = sheet.attribs; - var result = {}; - - var InitAttrib = function (name) { - result[name] = { def: true, val: "" }; - }; - - var InitAttribs = function (namelist) { - for (var i = 0; i < namelist.length; i++) { - InitAttrib(namelist[i]); - } - }; - - var SetAttrib = function (name, v) { - result[name].def = false; - result[name].val = v || value; - }; - - var SetAttribStar = function (name, v) { - if (v == "*") return; - result[name].def = false; - result[name].val = v; - }; - - // sizes: colwidth, rowheight - - InitAttrib("colwidth"); - if (attribs.defaultcolwidth) { - SetAttrib("colwidth", attribs.defaultcolwidth); - } - - InitAttrib("rowheight"); - if (attribs.rowheight) { - SetAttrib("rowheight", attribs.defaultrowheight); - } - - // cellformat: textalignhoriz, numberalignhoriz - - InitAttrib("textalignhoriz"); - if (attribs.defaulttextformat) { - SetAttrib("textalignhoriz", sheet.cellformats[attribs.defaulttextformat]); - } - - InitAttrib("numberalignhoriz"); - if (attribs.defaultnontextformat) { - SetAttrib( - "numberalignhoriz", - sheet.cellformats[attribs.defaultnontextformat] - ); - } - - // layout: alignvert, padtop, padright, padbottom, padleft - - InitAttribs(["alignvert", "padtop", "padright", "padbottom", "padleft"]); - if (attribs.defaultlayout) { - parts = sheet.layouts[attribs.defaultlayout].match( - /^padding:\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+);vertical-align:\s*(\S+);/ - ); - SetAttribStar("padtop", parts[1]); - SetAttribStar("padright", parts[2]); - SetAttribStar("padbottom", parts[3]); - SetAttribStar("padleft", parts[4]); - SetAttribStar("alignvert", parts[5]); - } - - // font: fontfamily, fontlook, fontsize - - InitAttribs(["fontfamily", "fontlook", "fontsize"]); - if (attribs.defaultfont) { - parts = sheet.fonts[attribs.defaultfont].match( - /^(\*|\S+? \S+?) (\S+?) (\S.*)$/ - ); - SetAttribStar("fontfamily", parts[3]); - SetAttribStar("fontsize", parts[2]); - SetAttribStar("fontlook", parts[1]); - } - - // color: textcolor - - InitAttrib("textcolor"); - if (attribs.defaultcolor) { - SetAttrib("textcolor", sheet.colors[attribs.defaultcolor]); - } - - // bgcolor: bgcolor - - InitAttrib("bgcolor"); - if (attribs.defaultbgcolor) { - SetAttrib("bgcolor", sheet.colors[attribs.defaultbgcolor]); - } - - // formatting: numberformat, textformat - - InitAttribs(["numberformat", "textformat"]); - if (attribs.defaultnontextvalueformat) { - SetAttrib( - "numberformat", - sheet.valueformats[attribs.defaultnontextvalueformat] - ); - } - if (attribs.defaulttextvalueformat) { - SetAttrib( - "textformat", - sheet.valueformats[attribs.defaulttextvalueformat] - ); - } - - // recalc: recalc - - InitAttrib("recalc"); - if (attribs.recalc) { - SetAttrib("recalc", attribs.recalc); - } - - return result; - }; - - // - // cmdstr = SocialCalc.DecodeCellAttributes(sheet, coord, attribs, range) - // - // Takes cell attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - // and returns the sheet commands to make the actual attributes correspond. - // Returns a non-null string if any commands are to be executed, null otherwise. - // - // If range is provided, the commands are executed on the whole range. - // - - SocialCalc.DecodeCellAttributes = function (sheet, coord, newattribs, range) { - var value, b, bb; - - var cell = sheet.GetAssuredCell(coord); - - var changed = false; - - var CheckChanges = function (attribname, oldval, cmdname) { - var val; - if (newattribs[attribname]) { - if (newattribs[attribname].def) { - val = ""; - } else { - val = newattribs[attribname].val; - } - if (val != (oldval || "")) { - DoCmd(cmdname + " " + val); - } - } - }; - - var cmdstr = ""; - - var DoCmd = function (str) { - if (cmdstr) cmdstr += "\n"; - cmdstr += "set " + (range || coord) + " " + str; - changed = true; - }; - - // cellformat: alignhoriz - - CheckChanges( - "alignhoriz", - sheet.cellformats[cell.cellformat], - "cellformat" - ); - - // layout: alignvert, padtop, padright, padbottom, padleft - - if ( - !newattribs.alignvert.def || - !newattribs.padtop.def || - !newattribs.padright.def || - !newattribs.padbottom.def || - !newattribs.padleft.def - ) { - value = - "padding:" + - (newattribs.padtop.def ? "* " : newattribs.padtop.val + " ") + - (newattribs.padright.def ? "* " : newattribs.padright.val + " ") + - (newattribs.padbottom.def ? "* " : newattribs.padbottom.val + " ") + - (newattribs.padleft.def ? "*" : newattribs.padleft.val) + - ";vertical-align:" + - (newattribs.alignvert.def ? "*;" : newattribs.alignvert.val + ";"); - } else { - value = ""; - } - - if (value != (sheet.layouts[cell.layout] || "")) { - DoCmd("layout " + value); - } - - // font: fontfamily, fontlook, fontsize - - if ( - !newattribs.fontlook.def || - !newattribs.fontsize.def || - !newattribs.fontfamily.def - ) { - value = - (newattribs.fontlook.def ? "* " : newattribs.fontlook.val + " ") + - (newattribs.fontsize.def ? "* " : newattribs.fontsize.val + " ") + - (newattribs.fontfamily.def ? "*" : newattribs.fontfamily.val); - } else { - value = ""; - } - - if (value != (sheet.fonts[cell.font] || "")) { - DoCmd("font " + value); - } - - // color: textcolor - - CheckChanges("textcolor", sheet.colors[cell.color], "color"); - - // bgcolor: bgcolor - - CheckChanges("bgcolor", sheet.colors[cell.bgcolor], "bgcolor"); - - // formatting: numberformat, textformat - - CheckChanges( - "numberformat", - sheet.valueformats[cell.nontextvalueformat], - "nontextvalueformat" - ); - - CheckChanges( - "textformat", - sheet.valueformats[cell.textvalueformat], - "textvalueformat" - ); - - // merges: colspan, rowspan - NOT HANDLED: IGNORED! - - // borders: bX for X = t, r, b, and l; bXthickness, bXstyle, bXcolor ignored - - for (var i = 0; i < 4; i++) { - b = "trbl".charAt(i); - bb = "b" + b; - CheckChanges(bb, sheet.borderstyles[cell[bb]], bb); - } - - // misc: cssc, csss, mod - - CheckChanges("cssc", cell.cssc, "cssc"); - - CheckChanges("csss", cell.csss, "csss"); - - if (newattribs.mod) { - if (newattribs.mod.def) { - value = "n"; - } else { - value = newattribs.mod.val; - } - if (value != (cell.mod || "n")) { - if (value == "n") value = ""; // restrict to "y" and "" normally - DoCmd("mod " + value); - } - } - - // if any changes return command(s) - - if (changed) { - return cmdstr; - } else { - return null; - } - }; - - // - // changed = SocialCalc.DecodeSheetAttributes(sheet, newattribs) - // - // Takes sheet attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - // and returns the sheet commands to make the actual attributes correspond. - // Returns a non-null string if any commands were executed, null otherwise. - // - - SocialCalc.DecodeSheetAttributes = function (sheet, newattribs) { - var value; - var attribs = sheet.attribs; - var changed = false; - - var CheckChanges = function (attribname, oldval, cmdname) { - var val; - if (newattribs[attribname]) { - if (newattribs[attribname].def) { - val = ""; - } else { - val = newattribs[attribname].val; - } - if (val != (oldval || "")) { - DoCmd(cmdname + " " + val); - } - } - }; - - var cmdstr = ""; - - var DoCmd = function (str) { - if (cmdstr) cmdstr += "\n"; - cmdstr += "set sheet " + str; - changed = true; - }; - - // sizes: colwidth, rowheight - - CheckChanges("colwidth", attribs.defaultcolwidth, "defaultcolwidth"); - - CheckChanges("rowheight", attribs.defaultrowheight, "defaultrowheight"); - - // cellformat: textalignhoriz, numberalignhoriz - - CheckChanges( - "textalignhoriz", - sheet.cellformats[attribs.defaulttextformat], - "defaulttextformat" - ); - - CheckChanges( - "numberalignhoriz", - sheet.cellformats[attribs.defaultnontextformat], - "defaultnontextformat" - ); - - // layout: alignvert, padtop, padright, padbottom, padleft - - if ( - !newattribs.alignvert.def || - !newattribs.padtop.def || - !newattribs.padright.def || - !newattribs.padbottom.def || - !newattribs.padleft.def - ) { - value = - "padding:" + - (newattribs.padtop.def ? "* " : newattribs.padtop.val + " ") + - (newattribs.padright.def ? "* " : newattribs.padright.val + " ") + - (newattribs.padbottom.def ? "* " : newattribs.padbottom.val + " ") + - (newattribs.padleft.def ? "*" : newattribs.padleft.val) + - ";vertical-align:" + - (newattribs.alignvert.def ? "*;" : newattribs.alignvert.val + ";"); - } else { - value = ""; - } - - if (value != (sheet.layouts[attribs.defaultlayout] || "")) { - DoCmd("defaultlayout " + value); - } - - // font: fontfamily, fontlook, fontsize - - if ( - !newattribs.fontlook.def || - !newattribs.fontsize.def || - !newattribs.fontfamily.def - ) { - value = - (newattribs.fontlook.def ? "* " : newattribs.fontlook.val + " ") + - (newattribs.fontsize.def ? "* " : newattribs.fontsize.val + " ") + - (newattribs.fontfamily.def ? "*" : newattribs.fontfamily.val); - } else { - value = ""; - } - - if (value != (sheet.fonts[attribs.defaultfont] || "")) { - DoCmd("defaultfont " + value); - } - - // color: textcolor - - CheckChanges( - "textcolor", - sheet.colors[attribs.defaultcolor], - "defaultcolor" - ); - - // bgcolor: bgcolor - - CheckChanges( - "bgcolor", - sheet.colors[attribs.defaultbgcolor], - "defaultbgcolor" - ); - - // formatting: numberformat, textformat - - CheckChanges( - "numberformat", - sheet.valueformats[attribs.defaultnontextvalueformat], - "defaultnontextvalueformat" - ); - - CheckChanges( - "textformat", - sheet.valueformats[attribs.defaulttextvalueformat], - "defaulttextvalueformat" - ); - - // recalc: recalc - - CheckChanges("recalc", sheet.attribs.recalc, "recalc"); - - // if any changes return command(s) - - if (changed) { - return cmdstr; - } else { - return null; - } - }; - - // ************************************* - // - // Sheet command routines - // - // ************************************* - - // - // SocialCalc.SheetCommandInfo - object with information used during command execution - // - - SocialCalc.SheetCommandInfo = { - // only one of these - - sheetobj: null, // sheet being operated on - parseobj: null, // SocialCalc.Parse object with the command string, etc. - timerobj: null, // used for timeslicing - firsttimerdelay: 50, // wait before starting cmds (for Chrome - to give time to update) - timerdelay: 1, // wait between slices - maxtimeslice: 100, // do another slice after this many milliseconds - saveundo: false, // arg for ExecuteSheetCommand - - CmdExtensionCallbacks: {}, // for startcmdextension, in form: cmdname, {func:function(cmdname, data, sheet, SocialCalc.Parse object, saveundo), data:whatever} - cmdextensionbusy: "", // if length>0, command loop waits for SocialCalc.ResumeFromCmdExtension() - - // statuscallback: null, // called during execution - obsolete: use sheet obj's - // statuscallbackparams: null - }; - - // - // SocialCalc.ScheduleSheetCommands - // - // statuscallback is called at the beginning (cmdstart) and end (cmdend). - // - - SocialCalc.ScheduleSheetCommands = function ( - sheet, - cmdstr, - saveundo, - isRemote - ) { - if (SocialCalc.Callbacks.broadcast && !isRemote) { - if ( - cmdstr != "redisplay" && - cmdstr != "set sheet defaulttextvalueformat text-wiki" && - cmdstr != "recalc" - ) { - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "scmd", - id: sheet.sheetid, - cmdstr: cmdstr, - saveundo: saveundo, - }); - } - } - - var sci = SocialCalc.SheetCommandInfo; - - sci.sheetobj = sheet; - sci.parseobj = new SocialCalc.Parse(cmdstr); - sci.saveundo = saveundo; - - if (sci.sheetobj.statuscallback) { - // notify others if requested - sheet.statuscallback( - sci, - "cmdstart", - "", - sci.sheetobj.statuscallbackparams - ); - } - - if (sci.saveundo) { - sci.sheetobj.changes.PushChange(""); // add a step to undo stack - } - - sci.timerobj = window.setTimeout( - SocialCalc.SheetCommandsTimerRoutine, - sci.firsttimerdelay - ); - }; - - SocialCalc.SheetCommandsTimerRoutine = function () { - var errortext; - var sci = SocialCalc.SheetCommandInfo; - var starttime = new Date(); - - sci.timerobj = null; - - while (!sci.parseobj.EOF()) { - // go through all commands (separated by newlines) - - errortext = SocialCalc.ExecuteSheetCommand( - sci.sheetobj, - sci.parseobj, - sci.saveundo - ); - if (errortext) alert(errortext); - - sci.parseobj.NextLine(); - - if (sci.cmdextensionbusy.length > 0) { - // forced wait - if (sci.sheetobj.statuscallback) { - // notify others if requested - sci.sheetobj.statuscallback( - sci, - "cmdextension", - sci.cmdextensionbusy, - sci.sheetobj.statuscallbackparams - ); - } - return; - } - - if (new Date() - starttime >= sci.maxtimeslice) { - // if taking too long, give up CPU for a while - sci.timerobj = window.setTimeout( - SocialCalc.SheetCommandsTimerRoutine, - sci.timerdelay - ); - return; - } - } - - if (sci.sheetobj.statuscallback) { - // notify others if requested - sci.sheetobj.statuscallback( - sci, - "cmdend", - "", - sci.sheetobj.statuscallbackparams - ); - } - }; - - SocialCalc.ResumeFromCmdExtension = function () { - var sci = SocialCalc.SheetCommandInfo; - - sci.cmdextensionbusy = ""; - - SocialCalc.SheetCommandsTimerRoutine(); - }; - - // - // errortext = SocialCalc.ExecuteSheetCommand(sheet, cmd, saveundo) - // - // cmd is a SocialCalc.Parse object. - // - // Executes commands that modify the sheet data. - // Sets sheet "needsrecalc" as needed. - // Sets sheet "changedrendervalues" as needed. - // - // The cmd string may be multiple commands, separated by newlines. In that case - // only one "step" is put on the undo stack representing all the commands. - // Note that because of this, in "set A1 text ..." and "set A1 comment ..." text is - // treated as encoded (newline => \n, \ => \b, : => \c). - // - // The commands are in the forms: - // - // set sheet attributename value (plus lastcol and lastrow) - // set 22 attributename value - // set B attributename value - // set A1 attributename value1 value2... (see each attribute in code for details) - // set A1:B5 attributename value1 value2... - // erase/copy/cut/paste/fillright/filldown A1:B5 all/formulas/format - // loadclipboard save-encoded-clipboard-data - // clearclipboard - // merge C3:F3 - // unmerge C3 - // insertcol/insertrow C5 - // deletecol/deleterow C5:E7 - // movepaste/moveinsert A1:B5 A8 all/formulas/format (if insert, destination must be in same rows or columns or else paste done) - // sort cr1:cr2 col1 up/down col2 up/down col3 up/down - // name define NAME definition - // name desc NAME description - // name delete NAME - // recalc - // redisplay - // changedrendervalues - // startcmdextension extension rest-of-command - // - // If saveundo is true, then undo information is saved in sheet.changes. - // - - SocialCalc.ExecuteSheetCommand = function (sheet, cmd, saveundo) { - var cmdstr, - cmd1, - rest, - what, - attrib, - num, - pos, - pos2, - errortext, - undostart, - val; - var cr1, cr2, col, row, cr, cell, newcell; - var fillright, rowstart, colstart, crbase, rowoffset, coloffset, basecell; - var clipsheet, cliprange, numcols, numrows, attribtable; - var colend, - rowend, - newcolstart, - newrowstart, - newcolend, - newrowend, - rownext, - colnext, - colthis, - cellnext; - var lastrow, lastcol, rowbefore, colbefore, oldformula, oldcr; - var cols, dirs, lastsortcol, i, sortlist, sortcells, sortvalues, sorttypes; - var sortfunction, slen, valtype, originalrow, sortedcr; - var name, v1, v2; - var cmdextension; - - var attribs = sheet.attribs; - var changes = sheet.changes; - var cellProperties = SocialCalc.CellProperties; - var scc = SocialCalc.Constants; - - var ParseRange = function () { - var prange = SocialCalc.ParseRange(what); - cr1 = prange.cr1; - cr2 = prange.cr2; - if (cr2.col > attribs.lastcol) attribs.lastcol = cr2.col; - if (cr2.row > attribs.lastrow) attribs.lastrow = cr2.row; - }; - - errortext = ""; - - cmdstr = cmd.RestOfStringNoMove(); - if (saveundo) { - sheet.changes.AddDo(cmdstr); - } - - cmd1 = cmd.NextToken(); - - switch (cmd1) { - case "set": - what = cmd.NextToken(); - attrib = cmd.NextToken(); - rest = cmd.RestOfString(); - undostart = "set " + what + " " + attrib; - - if (what == "sheet") { - sheet.renderneeded = true; - switch (attrib) { - case "defaultcolwidth": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]); - attribs[attrib] = rest; - break; - case "defaultcolor": - case "defaultbgcolor": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("color", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("color", rest); - break; - case "defaultlayout": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("layout", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("layout", rest); - break; - case "defaultfont": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("font", attribs[attrib]) - ); - if (rest == "* * *") rest = ""; // all default - attribs[attrib] = sheet.GetStyleNum("font", rest); - break; - case "defaulttextformat": - case "defaultnontextformat": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("cellformat", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("cellformat", rest); - break; - case "defaulttextvalueformat": - case "defaultnontextvalueformat": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("valueformat", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("valueformat", rest); - for (cr in sheet.cells) { - // forget all cached display strings - delete sheet.cells[cr].displaystring; - } - break; - case "lastcol": - case "lastrow": - if (saveundo) changes.AddUndo(undostart, attribs[attrib] - 0); - num = rest - 0; - if (typeof num == "number") attribs[attrib] = num > 0 ? num : 1; - break; - case "recalc": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]); - if (rest == "off") { - attribs.recalc = rest; // manual recalc, not auto - } else { - // all values other than "off" mean "on" - delete attribs.recalc; - } - break; - default: - errortext = scc.s_escUnknownSheetCmd + cmdstr; - break; - } - } else if (/(^[A-Z])([A-Z])?(:[A-Z][A-Z]?){0,1}$/i.test(what)) { - // col attributes - sheet.renderneeded = true; - what = what.toUpperCase(); - pos = what.indexOf(":"); - if (pos >= 0) { - cr1 = SocialCalc.coordToCr(what.substring(0, pos) + "1"); - cr2 = SocialCalc.coordToCr(what.substring(pos + 1) + "1"); - } else { - cr1 = SocialCalc.coordToCr(what + "1"); - cr2 = cr1; - } - for (col = cr1.col; col <= cr2.col; col++) { - if (attrib == "width") { - cr = SocialCalc.rcColname(col); - if (saveundo) - changes.AddUndo( - "set " + cr + " width", - sheet.colattribs.width[cr] - ); - if (rest.length > 0) { - sheet.colattribs.width[cr] = rest; - } else { - delete sheet.colattribs.width[cr]; - } - } - } - } - - // !!!!! need row attribs !!!! - else if (/([a-z]){0,1}(\d+)/i.test(what)) { - // cell attributes - ParseRange(); - if ( - cr1.row != cr2.row || - cr1.col != cr2.col || - sheet.celldisplayneeded || - sheet.renderneeded - ) { - // not one cell - sheet.renderneeded = true; - sheet.celldisplayneeded = ""; - } else { - sheet.celldisplayneeded = SocialCalc.crToCoord(cr1.col, cr1.row); - } - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - if (attrib == "value") { - // set coord value type numeric-value - pos = rest.indexOf(" "); - cell.datavalue = rest.substring(pos + 1) - 0; - delete cell.errors; - cell.datatype = "v"; - cell.valuetype = rest.substring(0, pos); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "text") { - // set coord text type text-value - pos = rest.indexOf(" "); - cell.datavalue = SocialCalc.decodeFromSave( - rest.substring(pos + 1) - ); - delete cell.errors; - cell.datatype = "t"; - cell.valuetype = rest.substring(0, pos); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "formula") { - // set coord formula formula-body-less-initial-= - cell.datavalue = 0; // until recalc - delete cell.errors; - cell.datatype = "f"; - cell.valuetype = "e#N/A"; // until recalc - cell.formula = rest; - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "constant") { - // set coord constant type numeric-value source-text - pos = rest.indexOf(" "); - pos2 = rest.substring(pos + 1).indexOf(" "); - cell.datavalue = rest.substring(pos + 1, pos + 1 + pos2) - 0; - cell.valuetype = rest.substring(0, pos); - if (cell.valuetype.charAt(0) == "e") { - // error - cell.errors = cell.valuetype.substring(1); - } else { - delete cell.errors; - } - cell.datatype = "c"; - cell.formula = rest.substring(pos + pos2 + 2); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "empty") { - // erase value - cell.datavalue = ""; - delete cell.errors; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "all") { - // set coord all :this:val1:that:val2... - if (rest.length > 0) { - cell = new SocialCalc.Cell(cr); - sheet.CellFromStringParts(cell, rest.split(":"), 1); - sheet.cells[cr] = cell; - } else { - delete sheet.cells[cr]; - } - attribs.needsrecalc = "yes"; - } else if (/^b[trbl]$/.test(attrib)) { - // set coord bt 1px solid black - cell[attrib] = sheet.GetStyleNum("borderstyle", rest); - sheet.renderneeded = true; // affects more than just one cell - } else if (attrib == "color" || attrib == "bgcolor") { - cell[attrib] = sheet.GetStyleNum("color", rest); - } else if (attrib == "layout" || attrib == "cellformat") { - cell[attrib] = sheet.GetStyleNum(attrib, rest); - } else if (attrib == "font") { - // set coord font style weight size family - if (rest == "* * *") rest = ""; - cell[attrib] = sheet.GetStyleNum("font", rest); - } else if ( - attrib == "textvalueformat" || - attrib == "nontextvalueformat" - ) { - cell[attrib] = sheet.GetStyleNum("valueformat", rest); - delete cell.displaystring; - } else if (attrib == "cssc") { - rest = rest.replace(/[^a-zA-Z0-9\-]/g, ""); - cell.cssc = rest; - } else if (attrib == "csss") { - rest = rest.replace(/\n/g, ""); - cell.csss = rest; - } else if (attrib == "mod") { - rest = rest.replace(/[^yY]/g, "").toLowerCase(); - cell.mod = rest; - } else if (attrib == "comment") { - cell.comment = SocialCalc.decodeFromSave(rest); - } else { - errortext = scc.s_escUnknownSetCoordCmd + cmdstr; - } - } - } - } - break; - - case "merge": - sheet.renderneeded = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - cell = sheet.GetAssuredCell(cr1.coord); - if (saveundo) changes.AddUndo("unmerge " + cr1.coord); - - if (cr2.col > cr1.col) cell.colspan = cr2.col - cr1.col + 1; - else delete cell.colspan; - if (cr2.row > cr1.row) cell.rowspan = cr2.row - cr1.row + 1; - else delete cell.rowspan; - - sheet.changedrendervalues = true; - - break; - - case "unmerge": - sheet.renderneeded = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - cell = sheet.GetAssuredCell(cr1.coord); - if (saveundo) - changes.AddUndo( - "merge " + - cr1.coord + - ":" + - SocialCalc.crToCoord( - cr1.col + (cell.colspan || 1) - 1, - cr1.row + (cell.rowspan || 1) - 1 - ) - ); - - delete cell.colspan; - delete cell.rowspan; - - sheet.changedrendervalues = true; - - break; - - case "erase": - case "cut": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - if (cmd1 == "cut") { - // save copy of whole thing before erasing - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = SocialCalc.CreateSheetSave( - sheet, - what - ); - } - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - if (rest == "all") { - delete sheet.cells[cr]; - } else if (rest == "formulas") { - cell.datavalue = ""; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - delete cell.errors; - delete cell.displaystring; - delete cell.parseinfo; - if (cell.comment) { - // comments are considered content for erasing - delete cell.comment; - } - } else if (rest == "formats") { - newcell = new SocialCalc.Cell(cr); // create a new cell without attributes - newcell.datavalue = cell.datavalue; // copy existing values - newcell.datatype = cell.datatype; - newcell.formula = cell.formula; - newcell.valuetype = cell.valuetype; - if (cell.comment) { - newcell.comment = cell.comment; - } - sheet.cells[cr] = newcell; // replace - } - } - } - attribs.needsrecalc = "yes"; - break; - - case "fillright": - case "filldown": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - if (cmd1 == "fillright") { - fillright = true; - rowstart = cr1.row; - colstart = cr1.col + 1; - } else { - fillright = false; - rowstart = cr1.row + 1; - colstart = cr1.col; - } - for (row = rowstart; row <= cr2.row; row++) { - for (col = colstart; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - if (fillright) { - crbase = SocialCalc.crToCoord(cr1.col, row); - coloffset = col - colstart + 1; - rowoffset = 0; - } else { - crbase = SocialCalc.crToCoord(col, cr1.row); - coloffset = 0; - rowoffset = row - rowstart + 1; - } - basecell = sheet.GetAssuredCell(crbase); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - if (cell.datatype == "f") { - // offset relative coords, even in sheet references - cell.formula = SocialCalc.OffsetFormulaCoords( - basecell.formula, - coloffset, - rowoffset - ); - } else { - cell.formula = basecell.formula; - } - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - } - } - - attribs.needsrecalc = "yes"; - break; - - case "copy": - what = cmd.NextToken(); - rest = cmd.RestOfString(); - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = SocialCalc.CreateSheetSave( - sheet, - what - ); - break; - - case "loadclipboard": - rest = cmd.RestOfString(); - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = SocialCalc.decodeFromSave(rest); - break; - - case "clearclipboard": - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = ""; - break; - - case "paste": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - if (!SocialCalc.Clipboard.clipboard) { - break; - } - clipsheet = new SocialCalc.Sheet(); // load clipboard contents as another sheet - clipsheet.ParseSheetSave(SocialCalc.Clipboard.clipboard); - cliprange = SocialCalc.ParseRange(clipsheet.copiedfrom); - coloffset = cr1.col - cliprange.cr1.col; // get sizes, etc. - rowoffset = cr1.row - cliprange.cr1.row; - numcols = cliprange.cr2.col - cliprange.cr1.col + 1; - numrows = cliprange.cr2.row - cliprange.cr1.row + 1; - if (cr1.col + numcols - 1 > attribs.lastcol) - attribs.lastcol = cr1.col + numcols - 1; - if (cr1.row + numrows - 1 > attribs.lastrow) - attribs.lastrow = cr1.row + numrows - 1; - - for (row = cr1.row; row < cr1.row + numrows; row++) { - for (col = cr1.col; col < cr1.col + numcols; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - crbase = SocialCalc.crToCoord(col - coloffset, row - rowoffset); - basecell = clipsheet.GetAssuredCell(crbase); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - attribtable = SocialCalc.CellPropertiesTable[attrib]; - if (attribtable && basecell[attrib]) { - // table indexes to expand to strings since other sheet may have diff indexes - cell[attrib] = sheet.GetStyleNum( - attribtable, - clipsheet.GetStyleString(attribtable, basecell[attrib]) - ); - } else { - // these are not table indexes - cell[attrib] = basecell[attrib]; - } - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - if (cell.datatype == "f") { - // offset relative coords, even in sheet references - cell.formula = SocialCalc.OffsetFormulaCoords( - basecell.formula, - coloffset, - rowoffset - ); - } else { - cell.formula = basecell.formula; - } - delete cell.parseinfo; - cell.errors = basecell.errors; - if (basecell.comment) { - // comments are pasted as part of content, though not filled, etc. - cell.comment = basecell.comment; - } else if (cell.comment) { - delete cell.comment; - } - } - delete cell.displaystring; - } - } - - attribs.needsrecalc = "yes"; - break; - - case "sort": // sort cr1:cr2 col1 up/down col2 up/down col3 up/down - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - ParseRange(); - cols = []; // get columns and sort directions (or "") - dirs = []; - lastsortcol = 0; - for (i = 0; i <= 3; i++) { - cols[i] = cmd.NextToken(); - dirs[i] = cmd.NextToken(); - if (cols[i]) lastsortcol = i; - } - - sortcells = {}; // a copy of the data which will replace the original, but in the new order - sortlist = []; // an array of 0, 1, ..., nrows-1 needed for sorting - sortvalues = []; // values to be sorted corresponding to sortlist - sorttypes = []; // basic types of the values - - for (row = cr1.row; row <= cr2.row; row++) { - // fill in the sort info - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.cells[cr]; - if (cell) { - // only copy non-empty cells - sortcells[cr] = sheet.CellToString(cell); - if (saveundo) - changes.AddUndo("set " + cr + " all", sortcells[cr]); - } else { - if (saveundo) changes.AddUndo("set " + cr + " all"); - } - } - sortlist.push(sortlist.length); - sortvalues.push([]); - sorttypes.push([]); - slast = sorttypes.length - 1; - for (i = 0; i <= lastsortcol; i++) { - cr = cols[i] + row; // get cr on this row in sort col - cell = sheet.GetAssuredCell(cr); - val = cell.datavalue; - valtype = cell.valuetype.charAt(0) || "b"; - if (valtype == "t") val = val.toLowerCase(); - sortvalues[slast].push(val); - sorttypes[slast].push(valtype); - } - } - - sortfunction = function (a, b) { - // a comparison function that can handle all the type variations - var i, a1, b1, ta, cresult; - for (i = 0; i <= lastsortcol; i++) { - if (dirs[i] == "up") { - // handle sort direction - a1 = a; - b1 = b; - } else { - a1 = b; - b1 = a; - } - ta = sorttypes[a1][i]; - tb = sorttypes[b1][i]; - if (ta == "t") { - // numbers < text < errors, blank always last no matter what dir - if (tb == "t") { - a1 = sortvalues[a1][i]; - b1 = sortvalues[b1][i]; - cresult = a1 > b1 ? 1 : a1 < b1 ? -1 : 0; - } else if (tb == "n") { - cresult = 1; - } else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } else if (tb == "e") { - cresult = -1; - } - } else if (ta == "n") { - if (tb == "t") { - cresult = -1; - } else if (tb == "n") { - a1 = sortvalues[a1][i] - 0; // force to numeric, just in case - b1 = sortvalues[b1][i] - 0; - cresult = a1 > b1 ? 1 : a1 < b1 ? -1 : 0; - } else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } else if (tb == "e") { - cresult = -1; - } - } else if (ta == "e") { - if (tb == "e") { - a1 = sortvalues[a1][i]; - b1 = sortvalues[b1][i]; - cresult = a1 > b1 ? 1 : a1 < b1 ? -1 : 0; - } else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } else { - cresult = 1; - } - } else if (ta == "b") { - if (tb == "b") { - cresult = 0; - } else { - cresult = dirs[i] == "up" ? 1 : -1; - } - } - if (cresult) { - // return if tested not equal, otherwise do next column - return cresult; - } - } - cresult = a > b ? 1 : a < b ? -1 : 0; // equal - return position in original to maintain it - return cresult; - }; - - sortlist.sort(sortfunction); - - for (row = cr1.row; row <= cr2.row; row++) { - // copy original rows into sorted positions - originalrow = sortlist[row - cr1.row]; // relative position where it was in original - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - sortedcr = SocialCalc.crToCoord(col, originalrow + cr1.row); // original cell to be put in new place - if (sortcells[sortedcr]) { - cell = new SocialCalc.Cell(cr); - sheet.CellFromStringParts( - cell, - sortcells[sortedcr].split(":"), - 1 - ); - if (cell.datatype == "f") { - // offset coord refs, even to ***relative*** coords in other sheets - cell.formula = SocialCalc.OffsetFormulaCoords( - cell.formula, - 0, - row - cr1.row - originalrow - ); - } - sheet.cells[cr] = cell; - } else { - delete sheet.cells[cr]; - } - } - } - - attribs.needsrecalc = "yes"; - break; - - case "insertcol": - case "insertrow": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - - if (cmd1 == "insertcol") { - coloffset = 1; - colend = cr1.col; - rowoffset = 0; - rowend = 1; - newcolstart = cr1.col; - newcolend = cr1.col; - newrowstart = 1; - newrowend = attribs.lastrow; - if (saveundo) changes.AddUndo("deletecol " + cr1.coord); - } else { - coloffset = 0; - colend = 1; - rowoffset = 1; - rowend = cr1.row; - newcolstart = 1; - newcolend = attribs.lastcol; - newrowstart = cr1.row; - newrowend = cr1.row; - if (saveundo) changes.AddUndo("deleterow " + cr1.coord); - } - - for (row = attribs.lastrow; row >= rowend; row--) { - // copy the cells forward - for (col = attribs.lastcol; col >= colend; col--) { - crbase = SocialCalc.crToCoord(col, row); - cr = SocialCalc.crToCoord(col + coloffset, row + rowoffset); - if (!sheet.cells[crbase]) { - // copying empty cell - delete sheet.cells[cr]; // delete anything that may have been there - } else { - // overwrite existing cell with moved contents - sheet.cells[cr] = sheet.cells[crbase]; - } - } - } - - for (row = newrowstart; row <= newrowend; row++) { - // fill the "new" empty cells - for (col = newcolstart; col <= newcolend; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = new SocialCalc.Cell(cr); - sheet.cells[cr] = cell; - crbase = SocialCalc.crToCoord(col - coloffset, row - rowoffset); // copy attribs of the one before (0 gives you A or 1) - basecell = sheet.GetAssuredCell(crbase); - for (attrib in cellProperties) { - if (cellProperties[attrib] == 2) { - // copy only format attributes - cell[attrib] = basecell[attrib]; - } - } - } - } - - for (cr in sheet.cells) { - // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell && cell.datatype == "f") { - cell.formula = SocialCalc.AdjustFormulaCoords( - cell.formula, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - } - if (cell) { - delete cell.parseinfo; - } - } - - for (name in sheet.names) { - // update cell references to moved cells in names - if (sheet.names[name]) { - // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = - v2 + - SocialCalc.AdjustFormulaCoords( - v1, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - } - } - - for ( - row = attribs.lastrow; - row >= rowend && cmd1 == "insertrow"; - row-- - ) { - // copy the row attributes forward - rownext = row + rowoffset; - for (attrib in sheet.rowattribs) { - val = sheet.rowattribs[attrib][row]; - if (sheet.rowattribs[attrib][rownext] != val) { - // make assignment only if different - if (val) { - sheet.rowattribs[attrib][rownext] = val; - } else { - delete sheet.rowattribs[attrib][rownext]; - } - } - } - } - - for ( - col = attribs.lastcol; - col >= colend && cmd1 == "insertcol"; - col-- - ) { - // copy the column attributes forward - colthis = SocialCalc.rcColname(col); - colnext = SocialCalc.rcColname(col + coloffset); - for (attrib in sheet.colattribs) { - val = sheet.colattribs[attrib][colthis]; - if (sheet.colattribs[attrib][colnext] != val) { - // make assignment only if different - if (val) { - sheet.colattribs[attrib][colnext] = val; - } else { - delete sheet.colattribs[attrib][colnext]; - } - } - } - } - - attribs.lastcol += coloffset; - attribs.lastrow += rowoffset; - attribs.needsrecalc = "yes"; - break; - - case "deletecol": - case "deleterow": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - lastcol = attribs.lastcol; // save old values since ParseRange sets... - lastrow = attribs.lastrow; - ParseRange(); - - if (cmd1 == "deletecol") { - coloffset = cr1.col - cr2.col - 1; - rowoffset = 0; - colstart = cr2.col + 1; - rowstart = 1; - } else { - coloffset = 0; - rowoffset = cr1.row - cr2.row - 1; - colstart = 1; - rowstart = cr2.row + 1; - } - - for (row = rowstart; row <= lastrow - rowoffset; row++) { - // copy the cells backwards - extra so no dup of last set - for (col = colstart; col <= lastcol - coloffset; col++) { - cr = SocialCalc.crToCoord(col + coloffset, row + rowoffset); - if ( - saveundo && - (row < rowstart - rowoffset || col < colstart - coloffset) - ) { - // save cells that are overwritten as undo info - cell = sheet.cells[cr]; - if (!cell) { - // empty cell - changes.AddUndo("erase " + cr + " all"); - } else { - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - } - } - crbase = SocialCalc.crToCoord(col, row); - cell = sheet.cells[crbase]; - if (!cell) { - // copying empty cell - delete sheet.cells[cr]; // delete anything that may have been there - } else { - // overwrite existing cell with moved contents - sheet.cells[cr] = cell; - } - } - } - - //!!! multiple deletes isn't setting #REF!; need to fix up #REF!'s on undo but only those! - - for (cr in sheet.cells) { - // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell) { - if (cell.datatype == "f") { - oldformula = cell.formula; - cell.formula = SocialCalc.AdjustFormulaCoords( - oldformula, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - if (cell.formula != oldformula) { - delete cell.parseinfo; - if (saveundo && cell.formula.indexOf("#REF!") != -1) { - // save old version only if removed coord - oldcr = SocialCalc.coordToCr(cr); - changes.AddUndo( - "set " + - SocialCalc.rcColname(oldcr.col - coloffset) + - (oldcr.row - rowoffset) + - " formula " + - oldformula - ); - } - } - } else { - delete cell.parseinfo; - } - } - } - - for (name in sheet.names) { - // update cell references to moved cells in names - if (sheet.names[name]) { - // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = - v2 + - SocialCalc.AdjustFormulaCoords( - v1, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - } - } - - for ( - row = rowstart; - row <= lastrow - rowoffset && cmd1 == "deleterow"; - row++ - ) { - // copy the row attributes backwards - rowbefore = row + rowoffset; - for (attrib in sheet.rowattribs) { - val = sheet.rowattribs[attrib][row]; - if (sheet.rowattribs[attrib][rowbefore] != val) { - // make assignment only if different - if (saveundo) - changes.AddUndo( - "set " + rowbefore + " " + attrib, - sheet.rowattribs[attrib][rowbefore] - ); - if (val) { - sheet.rowattribs[attrib][rowbefore] = val; - } else { - delete sheet.rowattribs[attrib][rowbefore]; - } - } - } - } - - for ( - col = colstart; - col <= lastcol - coloffset && cmd1 == "deletecol"; - col++ - ) { - // copy the column attributes backwards - colthis = SocialCalc.rcColname(col); - colbefore = SocialCalc.rcColname(col + coloffset); - for (attrib in sheet.colattribs) { - val = sheet.colattribs[attrib][colthis]; - if (sheet.colattribs[attrib][colbefore] != val) { - // make assignment only if different - if (saveundo) - changes.AddUndo( - "set " + colbefore + " " + attrib, - sheet.colattribs[attrib][colbefore] - ); - if (val) { - sheet.colattribs[attrib][colbefore] = val; - } else { - delete sheet.colattribs[attrib][colbefore]; - } - } - } - } - - if (saveundo) { - if (cmd1 == "deletecol") { - for (col = cr1.col; col <= cr2.col; col++) { - changes.AddUndo("insertcol " + SocialCalc.rcColname(col)); - } - } else { - for (row = cr1.row; row <= cr2.row; row++) { - changes.AddUndo("insertrow " + row); - } - } - } - - if (cmd1 == "deletecol") { - if (cr1.col <= lastcol) { - // shrink sheet unless deleted phantom cols off the end - if (cr2.col <= lastcol) { - attribs.lastcol += coloffset; - } else { - attribs.lastcol = cr1.col - 1; - } - } - } else { - if (cr1.row <= lastrow) { - // shrink sheet unless deleted phantom rows off the end - if (cr2.row <= lastrow) { - attribs.lastrow += rowoffset; - } else { - attribs.lastrow = cr1.row - 1; - } - } - } - attribs.needsrecalc = "yes"; - break; - - case "movepaste": - case "moveinsert": - var movingcells, - dest, - destcr, - inserthoriz, - insertvert, - pushamount, - movedto; - - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - dest = cmd.NextToken(); - rest = cmd.RestOfString(); // rest is all/formulas/formats - if (rest == "") rest = "all"; - - ParseRange(); - - destcr = SocialCalc.coordToCr(dest); - - coloffset = destcr.col - cr1.col; - rowoffset = destcr.row - cr1.row; - numcols = cr2.col - cr1.col + 1; - numrows = cr2.row - cr1.row + 1; - - // get a copy of moving cells and erase from where they were - - movingcells = {}; - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - - if (!sheet.cells[cr]) { - // if had nothing - continue; // don't save anything - } - movingcells[cr] = new SocialCalc.Cell(cr); // create new cell to copy - - for (attrib in cellProperties) { - // go through each property - if (typeof cell[attrib] === undefined) { - // don't copy undefined things and no need to delete - continue; - } else { - movingcells[cr][attrib] = cell[attrib]; // copy for potential moving - } - if (rest == "all") { - delete cell[attrib]; - } - if (rest == "formulas") { - if ( - cellProperties[attrib] == 1 || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } - } - if (rest == "formats") { - if (cellProperties[attrib] == 2) { - delete cell[attrib]; - } - } - } - if (rest == "formulas") { - // leave pristene deleted cell - cell.datavalue = ""; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - } - if (rest == "all") { - // leave nothing for move all - delete sheet.cells[cr]; - } - } - } - - // if moveinsert, check destination OK, and calculate pushing parameters - - if (cmd1 == "moveinsert") { - inserthoriz = false; - insertvert = false; - if ( - rowoffset == 0 && - (destcr.col < cr1.col || destcr.col > cr2.col) - ) { - if (destcr.col < cr1.col) { - // moving left - pushamount = cr1.col - destcr.col; - inserthoriz = -1; - } else { - destcr.col -= 1; - coloffset = destcr.col - cr2.col; - pushamount = destcr.col - cr2.col; - inserthoriz = 1; - } - } else if ( - coloffset == 0 && - (destcr.row < cr1.row || destcr.row > cr2.row) - ) { - if (destcr.row < cr1.row) { - // moving up - pushamount = cr1.row - destcr.row; - insertvert = -1; - } else { - destcr.row -= 1; - rowoffset = destcr.row - cr2.row; - pushamount = destcr.row - cr2.row; - insertvert = 1; - } - } else { - cmd1 = "movepaste"; // not allowed right now - ignore - } - } - - // push any cells that need pushing - - movedto = {}; // remember what was moved where - - if (insertvert) { - for (row = 0; row < pushamount; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - if (insertvert < 0) { - crbase = SocialCalc.crToCoord( - col, - destcr.row + pushamount - row - 1 - ); // from cell - cr = SocialCalc.crToCoord(col, cr2.row - row); // to cell - } else { - crbase = SocialCalc.crToCoord( - col, - destcr.row - pushamount + row + 1 - ); // from cell - cr = SocialCalc.crToCoord(col, cr1.row + row); // to cell - } - - basecell = sheet.GetAssuredCell(crbase); - if (saveundo) - changes.AddUndo( - "set " + crbase + " all", - sheet.CellToString(basecell) - ); - - cell = sheet.GetAssuredCell(cr); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - - movedto[crbase] = cr; // old crbase is now at cr - } - } - } - if (inserthoriz) { - for (col = 0; col < pushamount; col++) { - for (row = cr1.row; row <= cr2.row; row++) { - if (inserthoriz < 0) { - crbase = SocialCalc.crToCoord( - destcr.col + pushamount - col - 1, - row - ); - cr = SocialCalc.crToCoord(cr2.col - col, row); - } else { - crbase = SocialCalc.crToCoord( - destcr.col - pushamount + col + 1, - row - ); - cr = SocialCalc.crToCoord(cr1.col + col, row); - } - - basecell = sheet.GetAssuredCell(crbase); - if (saveundo) - changes.AddUndo( - "set " + crbase + " all", - sheet.CellToString(basecell) - ); - - cell = sheet.GetAssuredCell(cr); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - - movedto[crbase] = cr; // old crbase is now at cr - } - } - } - - // paste moved cells into new place - - if (destcr.col + numcols - 1 > attribs.lastcol) - attribs.lastcol = destcr.col + numcols - 1; - if (destcr.row + numrows - 1 > attribs.lastrow) - attribs.lastrow = destcr.row + numrows - 1; - - for (row = cr1.row; row < cr1.row + numrows; row++) { - for (col = cr1.col; col < cr1.col + numcols; col++) { - cr = SocialCalc.crToCoord(col + coloffset, row + rowoffset); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - - crbase = SocialCalc.crToCoord(col, row); // get old cell to move - - movedto[crbase] = cr; // old crbase (moved cell) will now be at cr (destination) - - if (rest == "all" && !movingcells[crbase]) { - // moving an empty cell - delete sheet.cells[cr]; // make the cell empty - continue; - } - - basecell = movingcells[crbase]; - if (!basecell) basecell = sheet.GetAssuredCell(crbase); - - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - if (basecell.comment) { - // comments are pasted as part of content, though not filled, etc. - cell.comment = basecell.comment; - } else if (cell.comment) { - delete cell.comment; - } - } - delete cell.displaystring; - } - } - - // do fixups - - for (cr in sheet.cells) { - // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell) { - if (cell.datatype == "f") { - oldformula = cell.formula; - cell.formula = SocialCalc.ReplaceFormulaCoords( - oldformula, - movedto - ); - if (cell.formula != oldformula) { - delete cell.parseinfo; - if (saveundo && !movedto[cr]) { - // moved cells are already saved for undo - changes.AddUndo("set " + cr + " formula " + oldformula); - } - } - } else { - delete cell.parseinfo; - } - } - } - - for (name in sheet.names) { - // update cell references to moved cells in names - if (sheet.names[name]) { - // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - oldformula = v1; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = - v2 + SocialCalc.ReplaceFormulaCoords(v1, movedto); - if (saveundo && sheet.names[name].definition != oldformula) { - // save changes - changes.AddUndo("name define " + name + " " + oldformula); - } - } - } - - attribs.needsrecalc = "yes"; - break; - - case "name": - what = cmd.NextToken(); - name = cmd.NextToken(); - rest = cmd.RestOfString(); - - name = name.toUpperCase().replace(/[^A-Z0-9_\.]/g, ""); - if (name == "") break; // must have something - - if (what == "define") { - if (rest == "") break; // must have something - if (sheet.names[name]) { - // already exists - if (saveundo) - changes.AddUndo( - "name define " + name + " " + sheet.names[name].definition - ); - sheet.names[name].definition = rest; - } else { - // new - if (saveundo) changes.AddUndo("name delete " + name); - sheet.names[name] = { definition: rest, desc: "" }; - } - } else if (what == "desc") { - if (sheet.names[name]) { - // must already exist - if (saveundo) - changes.AddUndo( - "name desc " + name + " " + sheet.names[name].desc - ); - sheet.names[name].desc = rest; - } - } else if (what == "delete") { - if (saveundo) { - if (sheet.names[name].desc) - changes.AddUndo( - "name desc " + name + " " + sheet.names[name].desc - ); - changes.AddUndo( - "name define " + name + " " + sheet.names[name].definition - ); - } - delete sheet.names[name]; - } - attribs.needsrecalc = "yes"; - - break; - - case "recalc": - attribs.needsrecalc = "yes"; // request recalc - sheet.recalconce = true; // even if turned off - break; - - case "redisplay": - sheet.renderneeded = true; - break; - - case "changedrendervalues": // needed for undo sometimes - sheet.changedrendervalues = true; - break; - - case "startcmdextension": // startcmdextension extension rest-of-command - name = cmd.NextToken(); - cmdextension = SocialCalc.SheetCommandInfo.CmdExtensionCallbacks[name]; - if (cmdextension) { - cmdextension.func(name, cmdextension.data, sheet, cmd, saveundo); - } - break; - - default: - errortext = scc.s_escUnknownCmd + cmdstr; - break; - } - - /* For Debugging: -var ustack=""; -for (var i=0;i= 0; i--) { - // do them backwards - if (cmdstr) cmdstr += "\n"; // concatenate with separate lines - cmdstr += tos.undo[i]; - } - sheet.changes.Undo(); - sheet.ScheduleSheetCommands(cmdstr, false); // do undo operations - }; - - SocialCalc.SheetRedo = function (sheet) { - var tos, i; - var didredo = sheet.changes.Redo(); - if (!didredo) { - sheet.ScheduleSheetCommands("", false); // schedule doing nothing - return; - } - tos = sheet.changes.TOS(); - var cmdstr = ""; - - for (i = 0; tos && i < tos.command.length; i++) { - if (cmdstr) cmdstr += "\n"; // concatenate with separate lines - cmdstr += tos.command[i]; - } - sheet.ScheduleSheetCommands(cmdstr, false); // do undo operations - }; - - SocialCalc.CreateAuditString = function (sheet) { - var i, j; - var result = ""; - var stack = sheet.changes.stack; - var tos = sheet.changes.tos; - for (i = 0; i <= tos; i++) { - for (j = 0; j < stack[i].command.length; j++) { - result += stack[i].command[j] + "\n"; - } - } - - return result; - }; - - SocialCalc.GetStyleNum = function (sheet, atype, style) { - var num; - - if (style.length == 0) return 0; // null means use zero, which means default or global default - - num = sheet[atype + "hash"][style]; - if (!num) { - if (sheet[atype + "s"].length < 1) sheet[atype + "s"].push(""); - num = sheet[atype + "s"].push(style) - 1; - sheet[atype + "hash"][style] = num; - sheet.changedrendervalues = true; - } - return num; - }; - - SocialCalc.GetStyleString = function (sheet, atype, num) { - if (!num) return null; // zero, null, and undefined return null - - return sheet[atype + "s"][num]; - }; - - // - // updatedformula = SocialCalc.OffsetFormulaCoords(formula, coloffset, rowoffset) - // - // Change relative cell references by offsets (even those to other worksheets so fill, paste, sort work as expected). - // If not what you want, use absolute references. - // - - SocialCalc.OffsetFormulaCoords = function (formula, coloffset, rowoffset) { - var parseinfo, ttext, ttype, i, cr, newcr; - var updatedformula = ""; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = scf.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - if (ttype == token_coord) { - newcr = ""; - cr = SocialCalc.coordToCr(ttext); - if (ttext.charAt(0) != "$") { - // add col offset unless absolute column - cr.col += coloffset; - } else { - newcr += "$"; - } - newcr += SocialCalc.rcColname(cr.col); - if (ttext.indexOf("$", 1) == -1) { - // add row offset unless absolute row - cr.row += rowoffset; - } else { - newcr += "$"; - } - newcr += cr.row; - if (cr.row < 1 || cr.col < 1) { - newcr = "#REF!"; - } - updatedformula += newcr; - } else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { - // quotes to double - updatedformula += '"' + ttext.replace(/"/, '""') + '"'; - } else updatedformula += '"' + ttext + '"'; - } else if (ttype == token_op) { - updatedformula += tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } else { - // leave everything else alone - updatedformula += ttext; - } - } - - return updatedformula; - }; - - // - // updatedformula = SocialCalc.AdjustFormulaCoords(formula, col, coloffset, row, rowoffset) - // - // Change all cell references to cells starting with col/row by offsets - // - - SocialCalc.AdjustFormulaCoords = function ( - formula, - col, - coloffset, - row, - rowoffset - ) { - var ttype, ttext, i, newcr; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - if (ttype == token_op) { - // references with sheet specifier are not offset - if (ttext == "!") { - sheetref = true; // found a sheet reference - } else if (ttext != ":") { - // for everything but a range, reset - sheetref = false; - } - ttext = tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } - if (ttype == token_coord) { - cr = SocialCalc.coordToCr(ttext); - if ( - (coloffset < 0 && cr.col >= col && cr.col < col - coloffset) || - (rowoffset < 0 && cr.row >= row && cr.row < row - rowoffset) - ) { - // refs to deleted cells become invalid - if (!sheetref) { - cr.col = 0; - cr.row = 0; - } - } - if (!sheetref) { - if (cr.col >= col) { - cr.col += coloffset; - } - if (cr.row >= row) { - cr.row += rowoffset; - } - } - if (ttext.charAt(0) == "$") { - newcr = "$" + SocialCalc.rcColname(cr.col); - } else { - newcr = SocialCalc.rcColname(cr.col); - } - if (ttext.indexOf("$", 1) != -1) { - newcr += "$" + cr.row; - } else { - newcr += cr.row; - } - if (cr.row < 1 || cr.col < 1) { - newcr = "#REF!"; - } - ttext = newcr; - } else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { - // quotes to double - ttext = '"' + ttext.replace(/"/, '""') + '"'; - } else ttext = '"' + ttext + '"'; - } - updatedformula += ttext; - } - - return updatedformula; - }; - - // - // updatedformula = SocialCalc.ReplaceFormulaCoords(formula, movedto) - // - // Change all cell references to cells that are keys in moveto to be to moveto[coord]. - // Don't change references to other sheets. - // Handle range extents specially. - // - - SocialCalc.ReplaceFormulaCoords = function (formula, movedto) { - var ttype, ttext, i, newcr, coord; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - if (ttype == token_op) { - // references with sheet specifier are not change - if (ttext == "!") { - sheetref = true; // found a sheet reference - } else if (ttext != ":") { - // for everything but a range, reset - sheetref = false; - } - - //!!!! HANDLE RANGE EXTENT MOVES - - ttext = tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } - if (ttype == token_coord) { - cr = SocialCalc.coordToCr(ttext); // get parts - coord = SocialCalc.crToCoord(cr.col, cr.row); // get "clean" reference - if (movedto[coord] && !sheetref) { - // this is a reference to a moved cell - cr = SocialCalc.coordToCr(movedto[coord]); // get new row and col - if (ttext.charAt(0) == "$") { - // copy absolute ref marks if present - newcr = "$" + SocialCalc.rcColname(cr.col); - } else { - newcr = SocialCalc.rcColname(cr.col); - } - if (ttext.indexOf("$", 1) != -1) { - newcr += "$" + cr.row; - } else { - newcr += cr.row; - } - ttext = newcr; - } - } else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { - // quotes to double - ttext = '"' + ttext.replace(/"/, '""') + '"'; - } else ttext = '"' + ttext + '"'; - } - updatedformula += ttext; - } - - return updatedformula; - }; - - // ************************ - // - // Recalc Loop Code - // - // ************************ - - // - // How recalc works: - // - // !!!!!!!!!!!!!! - // - - // SocialCalc.RecalcInfo - object with global recalc info - - SocialCalc.RecalcInfo = { - sheet: null, // which sheet is being recalced - - currentState: 0, // current state - state: { start_calc: 1, order: 2, calc: 3, start_wait: 4, done_wait: 5 }, // allowed state values - - recalctimer: null, // value to cancel timer - maxtimeslice: 100, // maximum milliseconds per slice of recalc time before a wait - timeslicedelay: 1, // milliseconds to wait between recalc time slices - starttime: 0, // when recalc started - - // LoadSheet: a function that returns true if started a load or false if not. - // - - LoadSheet: function (sheetname) { - return false; - }, // default returns not found - }; - - // SocialCalc.RecalcData - object with recalc info while determining recalc order and afterward - - SocialCalc.RecalcData = function () { - // initialize a RecalcData object - - this.inrecalc = true; // if true, doing a recalc - this.celllist = []; // list with all potential cells to calculate - this.celllistitem = 0; // cell to check next when ordering - this.calclist = null; // object which is the chained list of cells to calculate - // each in the form of "coord: nextcoord" - // e.g., if B8 is calculated right after A8, then calclist.A8=="B8" - // if null, need to create the list - this.calclistlength = 0; // number of items in calclist - - this.firstcalc = null; // start of the calc list - a string or null - this.lastcalc = null; // last one on chain (used to add more to the end) - - this.nextcalc = null; // used to keep track during background recalc to make it restartable - this.count = 0; // number calculated - - // checkinfo is used when determining calc order: - - this.checkinfo = {}; // attributes are coords; if no attrib for a coord, it wasn't checked or doesn't need it - // values are RecalcCheckInfo objects while checking or TRUE when complete - }; - - // SocialCalc.RecalcCheckInfo - object that stores checking info while determining recalc order - - SocialCalc.RecalcCheckInfo = function () { - // initialize a RecalcCheckInfo object - - this.oldcoord = null; // chain back up of cells referring to cells - this.parsepos = 0; // which token we are up to - - // range info - - this.inrange = false; // if true, in the process of checking a range of coords - this.inrangestart = false; // if true, have not yet filled in range loop values - this.cr1 = null; // range first coord as a cr object - this.cr2 = null; // range second coord as a cr object - this.c1 = null; // range extents - this.c2 = null; - this.r1 = null; - this.r2 = null; - this.c = null; // looping values - this.r = null; - }; - - // Recalc the entire sheet - - SocialCalc.RecalcSheet = function (sheet) { - var coord, err, recalcdata; - var scri = SocialCalc.RecalcInfo; - - delete sheet.attribs.circularreferencecell; // reset recalc-wide things - SocialCalc.Formula.FreshnessInfoReset(); - - SocialCalc.RecalcClearTimeout(); - - scri.sheet = sheet; // set values needed by background recalc - scri.currentState = scri.state.start_calc; - - scri.starttime = new Date(); - - if (sheet.statuscallback) { - sheet.statuscallback(scri, "calcstart", null, sheet.statuscallbackparams); - } - - SocialCalc.RecalcSetTimeout(); - }; - - // - // SocialCalc.RecalcSetTimeout - set a timer for next recalc step - // - - SocialCalc.RecalcSetTimeout = function () { - var scri = SocialCalc.RecalcInfo; - - scri.recalctimer = window.setTimeout( - SocialCalc.RecalcTimerRoutine, - scri.timeslicedelay - ); - }; - - // - // SocialCalc.RecalcClearTimeout - cancel any timeouts - // - - SocialCalc.RecalcClearTimeout = function () { - var scri = SocialCalc.RecalcInfo; - - if (scri.recalctimer) { - window.clearTimeout(scri.recalctimer); - scri.recalctimer = null; - } - }; - - // - // SocialCalc.RecalcLoadedSheet(sheetname, str, recalcneeded) - // - // Called when a sheet finishes loading with name, string, and t/f whether it should be recalced. - // If loaded sheet has sheet.attribs.recalc=="off", then no recalc done. - // If sheetname is null, then the sheetname waiting for will be used. - // - - SocialCalc.RecalcLoadedSheet = function (sheetname, str, recalcneeded) { - var sheet; - var scri = SocialCalc.RecalcInfo; - var scf = SocialCalc.Formula; - - sheet = SocialCalc.Formula.AddSheetToCache( - sheetname || scf.SheetCache.waitingForLoading, - str - ); - - if (recalcneeded && sheet && sheet.attribs.recalc != "off") { - // if recalcneeded, and not manual sheet, chain in this new sheet to recalc loop - sheet.previousrecalcsheet = scri.sheet; - scri.sheet = sheet; - scri.currentState = scri.state.start_calc; - } - scf.SheetCache.waitingForLoading = null; - - SocialCalc.RecalcSetTimeout(); - }; - - // - // SocialCalc.RecalcTimerRoutine - handles the actual order determination and cell-by-cell recalculation in the background - // - - SocialCalc.RecalcTimerRoutine = function () { - var eresult, cell, coord, err, status; - var starttime = new Date(); - var count = 0; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var scri = SocialCalc.RecalcInfo; - var sheet = scri.sheet; - if (!sheet) { - return; - } - var recalcdata = sheet.recalcdata; - - var do_statuscallback = function (status, arg) { - // routine to do callback if required - if (sheet.statuscallback) { - sheet.statuscallback( - recalcdata, - status, - arg, - sheet.statuscallbackparams - ); - } - }; - - SocialCalc.RecalcClearTimeout(); - - if (scri.currentState == scri.state.start_calc) { - recalcdata = new SocialCalc.RecalcData(); - sheet.recalcdata = recalcdata; - - for (coord in sheet.cells) { - // get list of cells to check for order - if (!coord) continue; - recalcdata.celllist.push(coord); - } - - recalcdata.calclist = {}; // start with empty list - scri.currentState = scri.state.order; // drop through to determining recalc order - } - - if (scri.currentState == scri.state.order) { - while (recalcdata.celllistitem < recalcdata.celllist.length) { - // check all the cells to see if they should be on the list - coord = recalcdata.celllist[recalcdata.celllistitem++]; - err = SocialCalc.RecalcCheckCell(sheet, coord); - if (new Date() - starttime >= scri.maxtimeslice) { - // if taking too long, give up CPU for a while - do_statuscallback("calcorder", { - coord: coord, - total: recalcdata.celllist.length, - count: recalcdata.celllistitem, - }); - SocialCalc.RecalcSetTimeout(); - return; - } - } - - do_statuscallback("calccheckdone", recalcdata.calclistlength); - - recalcdata.nextcalc = recalcdata.firstcalc; // start at the beginning of the recalc chain - scri.currentState = scri.state.calc; // loop through cells on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - if (scri.currentState == scri.state.start_wait) { - // starting to wait for something - scri.currentState = scri.state.done_wait; // finished on next timer call - if (scri.LoadSheet) { - status = scri.LoadSheet(scf.SheetCache.waitingForLoading); - if (status) { - // started a load operation - return; - } - } - SocialCalc.RecalcLoadedSheet(null, "", false); - return; - } - - if (scri.currentState == scri.state.done_wait) { - scri.currentState = scri.state.calc; // loop through cells on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - // otherwise should be scri.state.calc - - if (scri.currentState != scri.state.calc) { - alert( - "Recalc state error: " + - scri.currentState + - ". Error in SocialCalc code." - ); - } - - coord = sheet.recalcdata.nextcalc; - while (coord) { - cell = sheet.cells[coord]; - eresult = scf.evaluate_parsed_formula(cell.parseinfo, sheet, false); - if (scf.SheetCache.waitingForLoading) { - // wait until restarted - recalcdata.nextcalc = coord; // start with this cell again - recalcdata.count += count; - do_statuscallback("calcloading", { - sheetname: scf.SheetCache.waitingForLoading, - }); - scri.currentState = scri.state.start_wait; // start load on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - if (scf.RemoteFunctionInfo.waitingForServer) { - // wait until restarted - recalcdata.nextcalc = coord; // start with this cell again - recalcdata.count += count; - do_statuscallback("calcserverfunc", { - funcname: scf.RemoteFunctionInfo.waitingForServer, - coord: coord, - total: recalcdata.calclistlength, - count: recalcdata.count, - }); - scri.currentState = scri.state.done_wait; // start load on next timer call - return; // return and wait for next recalc timer event - } - - if (cell.datavalue != eresult.value || cell.valuetype != eresult.type) { - // only update if changed from last time - cell.datavalue = eresult.value; - cell.valuetype = eresult.type; - delete cell.displaystring; - sheet.recalcchangedavalue = true; // remember something changed in case other code wants to know - } - if (eresult.error) { - cell.errors = eresult.error; - } - count++; - coord = sheet.recalcdata.calclist[coord]; - - if (new Date() - starttime >= scri.maxtimeslice) { - // if taking too long, give up CPU for a while - recalcdata.nextcalc = coord; // start with next cell on chain - recalcdata.count += count; - do_statuscallback("calcstep", { - coord: coord, - total: recalcdata.calclistlength, - count: recalcdata.count, - }); - SocialCalc.RecalcSetTimeout(); - return; - } - } - - recalcdata.inrecalc = false; - - delete sheet.recalcdata; // save memory and clear out for name lookup formula evaluation - - delete sheet.attribs.needsrecalc; // remember recalc done - - scri.sheet = sheet.previousrecalcsheet || null; // chain back if doing recalc of loaded sheets - if (scri.sheet) { - scri.currentState = scri.state.calc; // start where we left off - SocialCalc.RecalcSetTimeout(); - return; - } - - scf.FreshnessInfo.recalc_completed = true; // say freshness info is complete - - do_statuscallback("calcfinished", new Date() - scri.starttime); - }; - - // - // circref = SocialCalc.RecalcCheckCell(sheet, coord) - // - // Checks cell to put on calclist, looking at parsed tokens. - // Also checks cells this cell is dependent upon - // if it contains a formula with cell references. - // If circular reference, returns non-null. - // - - SocialCalc.RecalcCheckCell = function (sheet, startcoord) { - var parseinfo, - ttext, - ttype, - i, - rangecoord, - circref, - value, - pos, - pos2, - cell, - coordvals; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_name = tokentype.name; - var token_coord = tokentype.coord; - - var recalcdata = sheet.recalcdata; - var checkinfo = recalcdata.checkinfo; - - var sheetref = false; // if true, a sheet reference is in effect, so don't check that - var oldcoord = null; // coord of formula that referred to this one when checking down the tree - var coord = startcoord; // the coord of the cell we are checking - - // Start with requested cell, and then continue down or up the dependency tree - // oldcoord (and checkinfo[coord].oldcoord) maintains the reference stack during the tree walk - // checkinfo[coord] maintains the stack of checking looping values, e.g., token number being checked - - mainloop: while (coord) { - cell = sheet.cells[coord]; - coordvals = checkinfo[coord]; - - if ( - !cell || - cell.datatype != "f" || // Don't calculate if not a formula - (coordvals && typeof coordvals != "object") - ) { - // Don't calc if already calculated - coord = oldcoord; // go back up dependency tree to coord that referred to us - if (checkinfo[coord]) oldcoord = checkinfo[coord].oldcoord; - continue; - } - - if (!coordvals) { - // do we have checking information about this cell? - coordvals = new SocialCalc.RecalcCheckInfo(); // no - make a place to hold it - checkinfo[coord] = coordvals; - } - - if (cell.errors) { - // delete errors from previous recalcs - delete cell.errors; - } - - if (!cell.parseinfo) { - // cache parsed formula - cell.parseinfo = scf.ParseFormulaIntoTokens(cell.formula); - } - parseinfo = cell.parseinfo; - - for (i = coordvals.parsepos; i < parseinfo.length; i++) { - // go through each token in formula - - if (coordvals.inrange) { - // processing a range of coords - if (coordvals.inrangestart) { - // first time - fill in other values - if (coordvals.cr1.col > coordvals.cr2.col) { - coordvals.c1 = coordvals.cr2.col; - coordvals.c2 = coordvals.cr1.col; - } else { - coordvals.c1 = coordvals.cr1.col; - coordvals.c2 = coordvals.cr2.col; - } - coordvals.c = coordvals.c1 - 1; // start one before - - if (coordvals.cr1.row > coordvals.cr2.row) { - coordvals.r1 = coordvals.cr2.row; - coordvals.r2 = coordvals.cr1.row; - } else { - coordvals.r1 = coordvals.cr1.row; - coordvals.r2 = coordvals.cr2.row; - } - coordvals.r = coordvals.r1; // start on this row - coordvals.inrangestart = false; - } else { - // not first time - } - coordvals.c += 1; // increment column - if (coordvals.c > coordvals.c2) { - // finished the columns of this row - coordvals.r += 1; // increment row - if (coordvals.r > coordvals.r2) { - // finished checking the entire range - coordvals.inrange = false; - continue; - } - coordvals.c = coordvals.c1; // start at the beginning of next row - } - rangecoord = SocialCalc.crToCoord(coordvals.c, coordvals.r); - - // now check that one - - coordvals.parsepos = i; // remember our position - coordvals.oldcoord = oldcoord; // remember back up chain - oldcoord = coord; // come back to us - coord = rangecoord; - if (checkinfo[coord] && typeof checkinfo[coord] == "object") { - // Circular reference - cell.errors = SocialCalc.Constants.s_caccCircRef + startcoord; // set on original cell making the ref - checkinfo[startcoord] = true; // this one should be calculated once at this point - if (!recalcdata.firstcalc) { - recalcdata.firstcalc = startcoord; - } else { - recalcdata.calclist[recalcdata.lastcalc] = startcoord; - } - recalcdata.lastcalc = startcoord; - recalcdata.calclistlength++; // count number on list - sheet.attribs.circularreferencecell = coord + "|" + oldcoord; // remember at least one circ ref - return cell.errors; - } - continue mainloop; - } - - ttype = parseinfo[i].type; // get token details - ttext = parseinfo[i].text; - if (ttype == token_op) { - // references with sheet specifier are not checked - if (ttext == "!") { - sheetref = true; // found a sheet reference - } else if (ttext != ":") { - // for everything but a range, reset - sheetref = false; - } - } - - if (ttype == token_name) { - // look for named range - value = scf.LookupName(sheet, ttext); - if (value.type == "range") { - // only need to recurse here for range, which may be just one cell - pos = value.value.indexOf("|"); - if (pos != -1) { - // range - check each cell - coordvals.cr1 = SocialCalc.coordToCr( - value.value.substring(0, pos) - ); - pos2 = value.value.indexOf("|", pos + 1); - coordvals.cr2 = SocialCalc.coordToCr( - value.value.substring(pos + 1, pos2) - ); - coordvals.inrange = true; - coordvals.inrangestart = true; - i = i - 1; // back up so will start up again here - continue; - } - } else if (value.type == "coord") { - // just a coord - ttype = token_coord; // treat as a coord inline - ttext = value.value; // and then drop through to next test which should succeed - } else { - // not a defined name - probably a function - } - } - - if (ttype == token_coord) { - // token is a coord - - if ( - i >= 2 && // look for a range - parseinfo[i - 1].type == token_op && - parseinfo[i - 1].text == ":" && - parseinfo[i - 2].type == token_coord && - !sheetref - ) { - // Range -- check each cell - coordvals.cr1 = SocialCalc.coordToCr(parseinfo[i - 2].text); // remember range extents - coordvals.cr2 = SocialCalc.coordToCr(ttext); - coordvals.inrange = true; // next time use the range looping code - coordvals.inrangestart = true; - i = i - 1; // back up so will start up again here - continue; - } else if (!sheetref) { - // Single cell reference - if (ttext.indexOf("$") != -1) ttext = ttext.replace(/\$/g, ""); // remove any $'s - coordvals.parsepos = i + 1; // remember our position - come back on next token - coordvals.oldcoord = oldcoord; // remember back up chain - oldcoord = coord; // come back to us - coord = ttext; - if (checkinfo[coord] && typeof checkinfo[coord] == "object") { - // Circular reference - cell.errors = SocialCalc.Constants.s_caccCircRef + startcoord; // set on original cell making the ref - checkinfo[startcoord] = true; // this one should be calculated once at this point - if (!recalcdata.firstcalc) { - // add to calclist - recalcdata.firstcalc = startcoord; - } else { - recalcdata.calclist[recalcdata.lastcalc] = startcoord; - } - recalcdata.lastcalc = startcoord; - recalcdata.calclistlength++; // count number on list - sheet.attribs.circularreferencecell = coord + "|" + oldcoord; // remember at least one circ ref - return cell.errors; - } - continue mainloop; - } - } - } - - sheetref = false; // make sure off when bump back up - - checkinfo[coord] = true; // this one is finished - if (!recalcdata.firstcalc) { - // add to calclist - recalcdata.firstcalc = coord; - } else { - recalcdata.calclist[recalcdata.lastcalc] = coord; - } - recalcdata.lastcalc = coord; - recalcdata.calclistlength++; // count number on list - - coord = oldcoord; // go back to the formula that referred to us and continue - oldcoord = checkinfo[coord] ? checkinfo[coord].oldcoord : null; - } - - return ""; - }; - - // ************************************* - // - // Parse class: - // - // Used by ExecuteSheetCommand to get elements of commands to execute. - // The string it works with consists of one or more lines each - // made up of one or more tokens separated by a delimiter. - // - // ************************************* - - // Initialize: set string to work with - - SocialCalc.Parse = function (str) { - // properties: - - this.str = str; - this.pos = 0; - this.delimiter = " "; - this.lineEnd = str.indexOf("\n"); - if (this.lineEnd < 0) { - this.lineEnd = str.length; - } - }; - - // Return next token as a string - - SocialCalc.Parse.prototype.NextToken = function () { - if (this.pos < 0) return ""; - var pos2 = this.str.indexOf(this.delimiter, this.pos); - var pos1 = this.pos; - if (pos2 > this.lineEnd) { - // don't go past end of line - pos2 = this.lineEnd; - } - if (pos2 >= 0) { - this.pos = pos2 + 1; - return this.str.substring(pos1, pos2); - } else { - this.pos = this.lineEnd; - return this.str.substring(pos1, this.lineEnd); - } - }; - - // Return everything from current point until end of line - - SocialCalc.Parse.prototype.RestOfString = function () { - var oldpos = this.pos; - if (this.pos < 0 || this.pos >= this.lineEnd) return ""; - this.pos = this.lineEnd; - return this.str.substring(oldpos, this.lineEnd); - }; - - SocialCalc.Parse.prototype.RestOfStringNoMove = function () { - if (this.pos < 0 || this.pos >= this.lineEnd) return ""; - return this.str.substring(this.pos, this.lineEnd); - }; - - // Move current point to next line - - SocialCalc.Parse.prototype.NextLine = function () { - this.pos = this.lineEnd + 1; - this.lineEnd = this.str.indexOf("\n", this.pos); - if (this.lineEnd < 0) { - this.lineEnd = this.str.length; - } - }; - - // Check to see if at end of string with no more to process - - SocialCalc.Parse.prototype.EOF = function () { - if (this.pos < 0 || this.pos >= this.str.length) return true; - return false; - }; - - // ************************************* - // - // UndoStack class: - // - // Implements the behavior needed for a normal application's undo/redo stack. - // You add a new change sequence with PushChange. - // The type argument is a string that can be used to lookup some general string - // like "typing" or "setting attribute" for the menu prompts for undo/redo. - // - // You add the "do" steps with AddDo. The non-null, non-undefined arguments are - // joined together with " " to make a command string to be saved. - // - // You add the undo steps as commands for the most recent change with AddUndo. - // The non-null, non-undefined arguments are joined together with " " to make - // a command string to be saved. - // - // The Undo and Redo functions move the Top Of Stack pointer through the changes stack - // so you can undo and redo. Doing a new PushChange removes all undone items - // after TOS. - // - // You can push more things than you can undo if you want. - // There is a maximum to remember as the "did" stack for an audit trail (and as redo). This may be unlimited. - // There is a separate maximum to remember that can be undone. This may be smaller than maxRedo. - // - // ************************************* - - SocialCalc.UndoStack = function () { - // properties: - - this.stack = []; // {command: [], type: type, undo: []} -- multiple dos and undos allowed - this.tos = -1; // top of stack position, used for undo/redo - this.maxRedo = 0; // Maximum size of redo stack (and audit trail which is this.stack[n].command) or zero if no limit - this.maxUndo = 50; // Maximum number of steps kept for undo (usually the memory intensive part) or zero if no limit - }; - - SocialCalc.UndoStack.prototype.PushChange = function (type) { - // adding a new thing to the stack - while (this.stack.length > 0 && this.stack.length - 1 > this.tos) { - // pop off things not redone - this.stack.pop(); - } - this.stack.push({ command: [], type: type, undo: [] }); - if (this.maxRedo && this.stack.length > this.maxRedo) { - // limit number kept as audit trail - this.stack.shift(); // remove the extra one - } - if (this.maxUndo && this.stack.length > this.maxUndo) { - // need to trim excess undo info - this.stack[this.stack.length - this.maxUndo - 1].undo = []; // only need to remove one - } - this.tos = this.stack.length - 1; - }; - - SocialCalc.UndoStack.prototype.AddDo = function () { - var args = []; - for (var i = 0; i < arguments.length; i++) { - if (arguments[i] != null) args.push(arguments[i]); // ignore null or undefined - } - var cmd = args.join(" "); - this.stack[this.stack.length - 1].command.push(cmd); - }; - - SocialCalc.UndoStack.prototype.AddUndo = function () { - var args = []; - for (var i = 0; i < arguments.length; i++) { - if (arguments[i] != null) args.push(arguments[i]); // ignore null or undefined - } - var cmd = args.join(" "); - this.stack[this.stack.length - 1].undo.push(cmd); - }; - - SocialCalc.UndoStack.prototype.TOS = function () { - if (this.tos >= 0) return this.stack[this.tos]; - else return null; - }; - - SocialCalc.UndoStack.prototype.Undo = function () { - if ( - this.tos >= 0 && - (!this.maxUndo || this.tos > this.stack.length - this.maxUndo - 1) - ) { - this.tos -= 1; - return true; - } else { - return false; - } - }; - - SocialCalc.UndoStack.prototype.Redo = function () { - if (this.tos < this.stack.length - 1) { - this.tos += 1; - return true; - } else { - return false; - } - }; - - // ************************************* - // - // Clipboard Object: - // - // This is a single object. - // Stores the clipboard, which is shared by all active sheets. - // Like the undo stack, it does not persist from one editing session to another. - // - // ************************************* - - SocialCalc.Clipboard = { - // properties: - - clipboard: "", // empty or string in save format with "copiedfrom:" set to a range - }; - - // ************************************* - // - // RenderContext class: - // - // ************************************* - - SocialCalc.RenderContext = function (sheetobj) { - var parts, num, s; - var attribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - // properties: - - this.sheetobj = sheetobj; - this.hideRowsCols = false; // Rendering with panes only works with "false" - // !!!! Note: not implemented yet in rendering, just saved as an attribute - this.showGrid = false; - this.showRCHeaders = false; - this.rownamewidth = scc.defaultRowNameWidth; - this.pixelsPerRow = scc.defaultAssumedRowHeight; - - this.cellskip = {}; // if present, coord of cell covering this cell - this.coordToCR = {}; // for cells starting spans, coordToCR[coord]={row:row, col:col} - this.colwidth = []; // precomputed column widths, taking into account defaults - this.totalwidth = 0; // precomputed total table width - - this.rowpanes = []; // for each pane, {first: firstrow, last: lastrow} - this.colpanes = []; // for each pane, {first: firstrow, last: lastrow} - this.maxcol = 0; // max col and row to display, adding long spans, etc. - this.maxrow = 0; - - this.highlights = {}; // for each cell with special display: coord:highlightType (see this.highlightTypes) - this.cursorsuffix = ""; // added to highlights[cr]=="cursor" to get type to lookup - - this.highlightTypes = - // attributes to change when highlit - { - cursor: { - style: scc.defaultHighlightTypeCursorStyle, - className: scc.defaultHighlightTypeCursorClass, - }, - range: { - style: scc.defaultHighlightTypeRangeStyle, - className: scc.defaultHighlightTypeRangeClass, - }, - cursorinsertup: { - style: - "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-x;backgroundPosition:top left;backgroundImage:url(" + - scc.defaultImagePrefix + - "cursorinsertup.gif);", - className: scc.defaultHighlightTypeCursorClass, - }, - cursorinsertleft: { - style: - "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-y;backgroundPosition:top left;backgroundImage:url(" + - scc.defaultImagePrefix + - "cursorinsertleft.gif);", - className: scc.defaultHighlightTypeCursorClass, - }, - range2: { - style: - "color:#000;backgroundColor:#FFF;backgroundImage:url(" + - scc.defaultImagePrefix + - "range2.gif);", - className: "", - }, - }; - - this.cellIDprefix = scc.defaultCellIDPrefix; // if non-null, each cell will render with an ID - - this.defaultlinkstyle = null; // default linkstyle object (allows you to pass values to link renderer) - this.defaultHTMLlinkstyle = { type: "html" }; // default linkstyle for standalone HTML - - // constants: - - this.defaultfontstyle = scc.defaultCellFontStyle; - this.defaultfontsize = scc.defaultCellFontSize; - this.defaultfontfamily = scc.defaultCellFontFamily; - - this.defaultlayout = scc.defaultCellLayout; - - this.defaultpanedividerwidth = scc.defaultPaneDividerWidth; - this.defaultpanedividerheight = scc.defaultPaneDividerHeight; - - this.gridCSS = scc.defaultGridCSS; - - this.commentClassName = scc.defaultCommentClass; // for cells with non-blank comments when this.showGrid is true - this.commentCSS = scc.defaultCommentStyle; // any combination of classnames and styles may be used - this.commentNoGridClassName = scc.defaultCommentNoGridClass; // for cells when this.showGrid is false - this.commentNoGridCSS = scc.defaultCommentNoGridStyle; // any combination of classnames and styles may be used - - this.classnames = - // any combination of classnames and explicitStyles can be used - { - colname: scc.defaultColnameClass, - rowname: scc.defaultRownameClass, - selectedcolname: scc.defaultSelectedColnameClass, - selectedrowname: scc.defaultSelectedRownameClass, - upperleft: scc.defaultUpperLeftClass, - skippedcell: scc.defaultSkippedCellClass, - panedivider: scc.defaultPaneDividerClass, - }; - - this.explicitStyles = - // these may be used so you won't need a stylesheet with the classnames - { - colname: scc.defaultColnameStyle, - rowname: scc.defaultRownameStyle, - selectedcolname: scc.defaultSelectedColnameStyle, - selectedrowname: scc.defaultSelectedRownameStyle, - upperleft: scc.defaultUpperLeftStyle, - skippedcell: scc.defaultSkippedCellStyle, - panedivider: scc.defaultPaneDividerStyle, - }; - - // processed info about cell skipping - - this.cellskip = null; - this.needcellskip = true; - - // precomputed values, filling in defaults indicated by "*" - - this.fonts = []; // for each fontnum, {style: fs, weight: fw, size: fs, family: ff} - this.layouts = []; // for each layout, "padding:Tpx Rpx Bpx Lpx;vertical-align:va;" - - this.needprecompute = true; // need to call PrecomputeSheetFontsAndLayouts - - // if have a sheet object, initialize constants and precomputed values - - if (sheetobj) { - this.rowpanes[0] = { first: 1, last: attribs.lastrow }; - this.colpanes[0] = { first: 1, last: attribs.lastcol }; - } else throw scc.s_rcMissingSheet; - }; - - // Methods: - - SocialCalc.RenderContext.prototype.PrecomputeSheetFontsAndLayouts = - function () { - SocialCalc.PrecomputeSheetFontsAndLayouts(this); - }; - SocialCalc.RenderContext.prototype.CalculateCellSkipData = function () { - SocialCalc.CalculateCellSkipData(this); - }; - SocialCalc.RenderContext.prototype.CalculateColWidthData = function () { - SocialCalc.CalculateColWidthData(this); - }; - SocialCalc.RenderContext.prototype.SetRowPaneFirstLast = function ( - panenum, - first, - last - ) { - this.rowpanes[panenum] = { first: first, last: last }; - }; - SocialCalc.RenderContext.prototype.SetColPaneFirstLast = function ( - panenum, - first, - last - ) { - this.colpanes[panenum] = { first: first, last: last }; - }; - SocialCalc.RenderContext.prototype.CoordInPane = function ( - coord, - rowpane, - colpane - ) { - return SocialCalc.CoordInPane(this, coord, rowpane, colpane); - }; - SocialCalc.RenderContext.prototype.CellInPane = function ( - row, - col, - rowpane, - colpane - ) { - return SocialCalc.CellInPane(this, row, col, rowpane, colpane); - }; - SocialCalc.RenderContext.prototype.InitializeTable = function (tableobj) { - SocialCalc.InitializeTable(this, tableobj); - }; - SocialCalc.RenderContext.prototype.RenderSheet = function ( - oldtable, - linkstyle - ) { - return SocialCalc.RenderSheet(this, oldtable, linkstyle); - }; - SocialCalc.RenderContext.prototype.RenderColGroup = function () { - return SocialCalc.RenderColGroup(this); - }; - SocialCalc.RenderContext.prototype.RenderColHeaders = function () { - return SocialCalc.RenderColHeaders(this); - }; - SocialCalc.RenderContext.prototype.RenderSizingRow = function () { - return SocialCalc.RenderSizingRow(this); - }; - SocialCalc.RenderContext.prototype.RenderRow = function ( - rownum, - rowpane, - linkstyle - ) { - return SocialCalc.RenderRow(this, rownum, rowpane, linkstyle); - }; - SocialCalc.RenderContext.prototype.RenderSpacingRow = function () { - return SocialCalc.RenderSpacingRow(this); - }; - SocialCalc.RenderContext.prototype.RenderCell = function ( - rownum, - colnum, - rowpane, - colpane, - noElement, - linkstyle - ) { - return SocialCalc.RenderCell( - this, - rownum, - colnum, - rowpane, - colpane, - noElement, - linkstyle - ); - }; - - // Functions: - - SocialCalc.PrecomputeSheetFontsAndLayouts = function (context) { - var defaultfont, parts, layoutre, dparts, sparts, num, s, i; - var sheetobj = context.sheetobj; - var attribs = sheetobj.attribs; - - if (attribs.defaultfont) { - defaultfont = sheetobj.fonts[attribs.defaultfont]; - defaultfont = defaultfont.replace( - /^\*/, - SocialCalc.Constants.defaultCellFontStyle - ); - defaultfont = defaultfont.replace( - /(.+)\*(.+)/, - "$1" + SocialCalc.Constants.defaultCellFontSize + "$2" - ); - defaultfont = defaultfont.replace( - /\*$/, - SocialCalc.Constants.defaultCellFontFamily - ); - parts = defaultfont.match(/^(\S+? \S+?) (\S+?) (\S.*)$/); - context.defaultfontstyle = parts[1]; - context.defaultfontsize = parts[2]; - context.defaultfontfamily = parts[3]; - } - - for (num = 1; num < sheetobj.fonts.length; num++) { - // precompute fonts by filling in the *'s - s = sheetobj.fonts[num]; - s = s.replace(/^\*/, context.defaultfontstyle); - s = s.replace(/(.+)\*(.+)/, "$1" + context.defaultfontsize + "$2"); - s = s.replace(/\*$/, context.defaultfontfamily); - parts = s.match(/^(\S+?) (\S+?) (\S+?) (\S.*)$/); - context.fonts[num] = { - style: parts[1], - weight: parts[2], - size: parts[3], - family: parts[4], - }; - } - - layoutre = - /^padding:\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+);vertical-align:\s*(\S+);/; - dparts = SocialCalc.Constants.defaultCellLayout.match(layoutre); // get built-in defaults - - if (attribs.defaultlayout) { - sparts = sheetobj.layouts[attribs.defaultlayout].match(layoutre); // get sheet defaults, if set - } else { - sparts = ["", "*", "*", "*", "*", "*"]; - } - - for (num = 1; num < sheetobj.layouts.length; num++) { - // precompute layouts by filling in the *'s - s = sheetobj.layouts[num]; - parts = s.match(layoutre); - for (i = 1; i <= 5; i++) { - if (parts[i] == "*") { - parts[i] = sparts[i] != "*" ? sparts[i] : dparts[i]; // if *, sheet default or built-in - } - } - context.layouts[num] = - "padding:" + - parts[1] + - " " + - parts[2] + - " " + - parts[3] + - " " + - parts[4] + - ";vertical-align:" + - parts[5] + - ";"; - } - - context.needprecompute = false; - }; - - SocialCalc.CalculateCellSkipData = function (context) { - var row, - col, - coord, - cell, - contextcell, - colspan, - rowspan, - skiprow, - skipcol, - skipcoord; - - var sheetobj = context.sheetobj; - var sheetrowattribs = sheetobj.rowattribs; - var sheetcolattribs = sheetobj.colattribs; - context.maxrow = 0; - context.maxcol = 0; - context.cellskip = {}; // reset - - // Calculate cellskip data - var maxrow, maxcol; - - for (row = 1; row <= sheetobj.attribs.lastrow; row++) { - for (col = 1; col <= sheetobj.attribs.lastcol; col++) { - // look for spans and set cellskip for skipped cells - coord = SocialCalc.crToCoord(col, row); - cell = sheetobj.cells[coord]; - // don't look at undefined cells (they have no spans) or skipped cells - if (cell === undefined || context.cellskip[coord]) continue; - colspan = cell.colspan || 1; - rowspan = cell.rowspan || 1; - if (colspan > 1 || rowspan > 1) { - for (skiprow = row; skiprow < row + rowspan; skiprow++) { - for (skipcol = col; skipcol < col + colspan; skipcol++) { - // do the setting on individual cells - skipcoord = SocialCalc.crToCoord(skipcol, skiprow); - if (skipcoord == coord) { - // for coord, remember row and col - context.coordToCR[coord] = { row: row, col: col }; - } else { - // for other cells, flag with coord of here - context.cellskip[skipcoord] = coord; - } - if (skiprow > context.maxrow) maxrow = skiprow; - if (skipcol > context.maxcol) maxcol = skipcol; - } - } - } - } - } - - context.needcellskip = false; - }; - - SocialCalc.CalculateColWidthData = function (context) { - var colnum, colname, colwidth, totalwidth; - - var sheetobj = context.sheetobj; - var sheetcolattribs = sheetobj.colattribs; - - // Calculate column width data - - totalwidth = context.showRCHeaders ? context.rownamewidth - 0 : 0; - for (var colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - colname = SocialCalc.rcColname(colnum); - colwidth = - sheetobj.colattribs.width[colname] || - sheetobj.attribs.defaultcolwidth || - SocialCalc.Constants.defaultColWidth; - if (colwidth == "blank" || colwidth == "auto") colwidth = ""; - context.colwidth[colnum] = colwidth + ""; - totalwidth += colwidth && colwidth - 0 > 0 ? colwidth - 0 : 10; - } - } - context.totalwidth = totalwidth; - }; - - SocialCalc.InitializeTable = function (context, tableobj) { - /* - -Uses border-collapse so corners don't have holes -Note: IE and Firefox handle differently (IE adds borders and padding) -under border-collapse and Safari has problems with and wide text -Tablelayout "fixed" also leads to problems - -*/ - - /* - -*** Discussion *** - -The rendering assumes fixed column widths, even though SocialCalc allows "auto". -There may be issues with "auto" and it is hard to make it work cross-browser -with border-collapse, etc. - -This and the RenderSheet routine are where in the code the specifics of -table attributes and column size definitions are set. As the browsers settle down -and when we decide if we don't need auto width, we may want to revisit the way the -code does this (e.g., use table-layout:fixed). - -*/ - tableobj.style.borderCollapse = "collapse"; - tableobj.cellSpacing = "0"; - tableobj.cellPadding = "0"; - - tableobj.style.width = context.totalwidth + "px"; - }; - - // - // tableobj = SocialCalc.RenderSheet(context, oldtable, linkstyle) - // - // Renders a render context returning a DOM table object. - // If there is an oldtable object, it replaces it in the parent node. - // If oldtable is null, it just returns the new one. - // The linkstyle is "" or null for editing rendering - // and optionally an object passed on to formatting code. - // - - SocialCalc.RenderSheet = function (context, oldtable, linkstyle) { - var newrow, rowpane; - var tableobj, colgroupobj, tbodyobj, parentnode; - - // do precompute stuff if necessary - - if (context.sheetobj.changedrendervalues) { - context.needcellskip = true; - context.needprecompute = true; - context.sheetobj.changedrendervalues = false; - } - if (context.needcellskip) { - context.CalculateCellSkipData(); - } - if (context.needprecompute) { - context.PrecomputeSheetFontsAndLayouts(); - } - - context.CalculateColWidthData(); // always make sure col width values are up to date - - // make the table element and fill it in - - tableobj = document.createElement("table"); - context.InitializeTable(tableobj); - - colgroupobj = context.RenderColGroup(); - tableobj.appendChild(colgroupobj); - - tbodyobj = document.createElement("tbody"); - - tbodyobj.appendChild(context.RenderSizingRow()); - - if (context.showRCHeaders) { - newrow = context.RenderColHeaders(); - if (newrow) tbodyobj.appendChild(newrow); - } - - for (rowpane = 0; rowpane < context.rowpanes.length; rowpane++) { - for ( - var rownum = context.rowpanes[rowpane].first; - rownum <= context.rowpanes[rowpane].last; - rownum++ - ) { - newrow = context.RenderRow(rownum, rowpane, linkstyle); - tbodyobj.appendChild(newrow); - } - if (rowpane < context.rowpanes.length - 1) { - newrow = context.RenderSpacingRow(); - tbodyobj.appendChild(newrow); - } - } - - tableobj.appendChild(tbodyobj); - - if (oldtable) { - parentnode = oldtable.parentNode; - if (parentnode) parentnode.replaceChild(tableobj, oldtable); - } - - SocialCalc.EvalUserScripts(); - - return tableobj; - }; - - SocialCalc.RenderRow = function (context, rownum, rowpane, linkstyle) { - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - var colnum, newcol, colpane, newdiv; - - if (context.showRCHeaders) { - newcol = document.createElement("td"); - if (context.classnames) newcol.className = context.classnames.rowname; - if (context.explicitStyles) - newcol.style.cssText = context.explicitStyles.rowname; - newcol.width = context.rownamewidth; - newcol.style.verticalAlign = "top"; // to get around Safari making top of centered row number be - // considered top of row (and can't get position in Safari) - if (!SocialCalc.Constants.SCNoRowName) { - newcol.innerHTML = rownum + ""; - } - result.appendChild(newcol); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = context.RenderCell( - rownum, - colnum, - rowpane, - colpane, - null, - linkstyle - ); - if (newcol) result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("td"); - newcol.width = context.defaultpanedividerwidth; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - newdiv = document.createElement("div"); // for Firefox to avoid squishing - newdiv.style.width = context.defaultpanedividerwidth + "px"; - newdiv.style.overflow = "hidden"; - newcol.appendChild(newdiv); - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderSpacingRow = function (context) { - var colnum, newcol, colpane, w; - - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - - if (context.showRCHeaders) { - newcol = document.createElement("td"); - newcol.width = context.rownamewidth; - newcol.height = context.defaultpanedividerheight; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - result.appendChild(newcol); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = document.createElement("td"); - w = context.colwidth[colnum]; - if (w) newcol.width = w; - newcol.height = context.defaultpanedividerheight; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - if (newcol) result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("td"); - newcol.width = context.defaultpanedividerwidth; - newcol.height = context.defaultpanedividerheight; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderColHeaders = function (context) { - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - var colnum, newcol; - - if (!context.showRCHeaders) return null; - - newcol = document.createElement("td"); - if (context.classnames) newcol.className = context.classnames.upperleft; - if (context.explicitStyles) - newcol.style.cssText = context.explicitStyles.upperleft; - newcol.width = context.rownamewidth; - result.appendChild(newcol); - - for (var colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = document.createElement("td"); - if (context.classnames) newcol.className = context.classnames.colname; - if (context.explicitStyles) - newcol.style.cssText = context.explicitStyles.colname; - if (SocialCalc.Constants.SCNoColNames) { - // newcol.innerHTML=" "; - // newcol.innerHTML=""; - } else { - newcol.innerHTML = SocialCalc.rcColname(colnum); - } - result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("td"); - newcol.width = context.defaultpanedividerwidth; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderColGroup = function (context) { - var colpane, colnum, newcol, t; - var sheetobj = context.sheetobj; - - var result = document.createElement("colgroup"); - - if (context.showRCHeaders) { - newcol = document.createElement("col"); - newcol.width = context.rownamewidth; - result.appendChild(newcol); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = document.createElement("col"); - t = context.colwidth[colnum]; - if (t) newcol.width = t; - result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("col"); - newcol.width = context.defaultpanedividerwidth; - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderSizingRow = function (context) { - var colpane, colnum, newcell, t; - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - - if (context.showRCHeaders) { - newcell = document.createElement("td"); - newcell.style.width = context.rownamewidth + "px"; - newcell.height = "1"; - result.appendChild(newcell); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcell = document.createElement("td"); - t = context.colwidth[colnum]; - if (t) newcell.width = t; - newcell.height = "1"; - result.appendChild(newcell); - } - if (colpane < context.colpanes.length - 1) { - newcell = document.createElement("td"); - newcell.width = context.defaultpanedividerwidth; - newcell.height = "1"; - result.appendChild(newcell); - } - } - return result; - }; - - SocialCalc.RenderCell = function ( - context, - rownum, - colnum, - rowpane, - colpane, - noElement, - linkstyle - ) { - var sheetobj = context.sheetobj; - - var num, t, result, span, stylename, cell, sheetattribs, scdefaults; - var stylestr = ""; - - rownum = rownum - 0; // make sure a number - colnum = colnum - 0; - - var coord = SocialCalc.crToCoord(colnum, rownum); - - if (context.cellskip[coord]) { - // skip if within a span - if (context.CoordInPane(context.cellskip[coord], rowpane, colpane)) { - return null; // span starts in this pane -- so just skip - } - result = noElement - ? SocialCalc.CreatePseudoElement() - : document.createElement("td"); // span start is scrolled away, so make a special cell - if (context.classnames.skippedcell) - result.className = context.classnames.skippedcell; - if (context.explicitStyles.skippedcell) - result.style.cssText = context.explicitStyles.skippedcell; - result.innerHTML = " "; // put something there so height is OK - // !!! Really need to add borders in case there isn't anything else shown in the pane to get height - return result; - } - - result = noElement - ? SocialCalc.CreatePseudoElement() - : document.createElement("td"); - - if (context.cellIDprefix) { - result.id = context.cellIDprefix + coord; - } - - cell = sheetobj.cells[coord]; - - if (!cell) { - cell = new SocialCalc.Cell(coord); - } - - sheetattribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - if (cell.colspan > 1) { - span = 1; - for (num = 1; num < cell.colspan; num++) { - if ( - sheetobj.colattribs.hide[SocialCalc.rcColname(colnum + num)] != - "yes" && - context.CellInPane(rownum, colnum + num, rowpane, colpane) - ) { - span++; - } - } - result.colSpan = span; - } - - if (cell.rowspan > 1) { - span = 1; - for (num = 1; num < cell.rowspan; num++) { - if ( - sheetobj.rowattribs.hide[rownum + num + ""] != "yes" && - context.CellInPane(rownum + num, colnum, rowpane, colpane) - ) - span++; - } - result.rowSpan = span; - } - - if (cell.displaystring == undefined) { - // cache the display value - cell.displaystring = SocialCalc.FormatValueForDisplay( - sheetobj, - cell.datavalue, - coord, - linkstyle || context.defaultlinkstyle - ); - } else { - // callout to execute scripts if needed - SocialCalc.CallOutOnRenderCell(sheetobj, cell.datavalue, coord); - } - result.innerHTML = cell.displaystring; - - num = cell.layout || sheetattribs.defaultlayout; - if (num) { - stylestr += context.layouts[num]; // use precomputed layout with "*"'s filled in - } else { - stylestr += scc.defaultCellLayout; - } - - num = cell.font || sheetattribs.defaultfont; - if (num) { - // get expanded font strings in context - t = context.fonts[num]; // do each - plain "font:" style sets all sorts of other values, too (Safari font-stretch problem on cssText) - stylestr += - "font-style:" + - t.style + - ";font-weight:" + - t.weight + - ";font-size:" + - t.size + - ";font-family:" + - t.family + - ";"; - } else { - if (scc.defaultCellFontSize) { - stylestr += "font-size:" + scc.defaultCellFontSize + ";"; - } - if (scc.defaultCellFontFamily) { - stylestr += "font-family:" + scc.defaultCellFontFamily + ";"; - } - } - - num = cell.color || sheetattribs.defaultcolor; - if (num) stylestr += "color:" + sheetobj.colors[num] + ";"; - - num = cell.bgcolor || sheetattribs.defaultbgcolor; - if (num) stylestr += "background-color:" + sheetobj.colors[num] + ";"; - - num = cell.cellformat; - if (num) { - stylestr += "text-align:" + sheetobj.cellformats[num] + ";"; - } else { - t = cell.valuetype.charAt(0); - if (t == "t") { - num = sheetattribs.defaulttextformat; - if (num) stylestr += "text-align:" + sheetobj.cellformats[num] + ";"; - } else if ((t = "n")) { - num = sheetattribs.defaultnontextformat; - if (num) { - stylestr += "text-align:" + sheetobj.cellformats[num] + ";"; - } else { - stylestr += "text-align:right;"; - } - } else stylestr += "text-align:left;"; - } - - num = cell.bt; - if (num) stylestr += "border-top:" + sheetobj.borderstyles[num] + ";"; - - num = cell.br; - if (num) stylestr += "border-right:" + sheetobj.borderstyles[num] + ";"; - else if (context.showGrid) { - if ( - context.CellInPane( - rownum, - colnum + (cell.colspan || 1), - rowpane, - colpane - ) - ) - t = SocialCalc.crToCoord(colnum + (cell.colspan || 1), rownum); - else t = "nomatch"; - if (context.cellskip[t]) t = context.cellskip[t]; - if (!sheetobj.cells[t] || !sheetobj.cells[t].bl) - stylestr += "border-right:" + context.gridCSS; - } - - num = cell.bb; - if (num) stylestr += "border-bottom:" + sheetobj.borderstyles[num] + ";"; - else if (context.showGrid) { - if ( - context.CellInPane( - rownum + (cell.rowspan || 1), - colnum, - rowpane, - colpane - ) - ) - t = SocialCalc.crToCoord(colnum, rownum + (cell.rowspan || 1)); - else t = "nomatch"; - if (context.cellskip[t]) t = context.cellskip[t]; - if (!sheetobj.cells[t] || !sheetobj.cells[t].bt) - stylestr += "border-bottom:" + context.gridCSS; - } - - num = cell.bl; - if (num) stylestr += "border-left:" + sheetobj.borderstyles[num] + ";"; - - if (cell.comment) { - if (context.showGrid) { - if (context.commentClassName) { - result.className = - (result.className ? result.className + " " : "") + - context.commentClassName; - } - stylestr += context.commentCSS; - } else { - if (context.commentNoGridClassName) { - result.className = - (result.className ? result.className + " " : "") + - context.commentNoGridClassName; - } - stylestr += context.commentNoGridCSS; - } - } - - result.style.cssText = stylestr; - - //!!!!!!!!! - // NOTE: csss and cssc are not supported yet. - // csss needs to be parsed into pieces to override just the attributes specified, not all with assignment to cssText. - // cssc just needs to set the className. - - t = context.highlights[coord]; - if (t) { - // this is a highlit cell: Override style appropriately - if (t == "cursor") t += context.cursorsuffix; // cursor can take alternative forms - if (context.highlightTypes[t].className) { - result.className = - (result.className ? result.className + " " : "") + - context.highlightTypes[t].className; - } - // only if cell is editable, set the cursor class - if ( - t == "cursor" && - SocialCalc.Callbacks.IsCoordEditable && - !SocialCalc.Callbacks.IsCoordEditable( - context.sheetobj.sheetname + "!" + coord - ) - ) { - SocialCalc.setStyles(result, ""); - } else { - SocialCalc.setStyles(result, context.highlightTypes[t].style); - } - } - - return result; - }; - - SocialCalc.CoordInPane = function (context, coord, rowpane, colpane) { - var coordToCR = context.coordToCR[coord]; - if (!coordToCR || !coordToCR.row || !coordToCR.col) - throw "Bad coordToCR for " + coord; - return context.CellInPane(coordToCR.row, coordToCR.col, rowpane, colpane); - }; - - SocialCalc.CellInPane = function (context, row, col, rowpane, colpane) { - var panerowlimits = context.rowpanes[rowpane]; - var panecollimits = context.colpanes[colpane]; - if (!panerowlimits || !panecollimits) - throw "CellInPane called with unknown panes " + rowpane + "/" + colpane; - if (row < panerowlimits.first || row > panerowlimits.last) return false; - if (col < panecollimits.first || col > panecollimits.last) return false; - return true; - }; - - SocialCalc.CreatePseudoElement = function () { - return { style: { cssText: "" }, innerHTML: "", className: "" }; - }; - - // ************************************* - // - // Misc. functions: - // - // ************************************* - - SocialCalc.rcColname = function (c) { - if (c > 702) c = 702; // maximum number of columns - ZZ - if (c < 1) c = 1; - var collow = ((c - 1) % 26) + 65; - var colhigh = Math.floor((c - 1) / 26); - if (colhigh) - return String.fromCharCode(colhigh + 64) + String.fromCharCode(collow); - else return String.fromCharCode(collow); - }; - - SocialCalc.letters = [ - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - ]; - - SocialCalc.crToCoord = function (c, r) { - var result; - if (c < 1) c = 1; - if (c > 702) c = 702; // maximum number of columns - ZZ - if (r < 1) r = 1; - var collow = (c - 1) % 26; - var colhigh = Math.floor((c - 1) / 26); - if (colhigh) - result = SocialCalc.letters[colhigh - 1] + SocialCalc.letters[collow] + r; - else result = SocialCalc.letters[collow] + r; - return result; - }; - - SocialCalc.coordToCol = {}; // too expensive to set in crToCoord since that is called so many times - SocialCalc.coordToRow = {}; - - SocialCalc.coordToCr = function (cr) { - var c, i, ch; - var r = SocialCalc.coordToRow[cr]; - if (r) return { row: r, col: SocialCalc.coordToCol[cr] }; - c = 0; - r = 0; - for (i = 0; i < cr.length; i++) { - // this was faster than using regexes; assumes well-formed - ch = cr.charCodeAt(i); - if (ch == 36); - else if (ch <= 57) - // skip $'s - r = 10 * r + ch - 48; - else if (ch >= 97) c = 26 * c + ch - 96; - else if (ch >= 65) c = 26 * c + ch - 64; - } - SocialCalc.coordToCol[cr] = c; - SocialCalc.coordToRow[cr] = r; - return { row: r, col: c }; - }; - - SocialCalc.ParseRange = function (range) { - var pos, cr, cr1, cr2; - if (!range) range = "A1:A1"; // error return, hopefully benign - range = range.toUpperCase(); - pos = range.indexOf(":"); - if (pos >= 0) { - cr = range.substring(0, pos); - cr1 = SocialCalc.coordToCr(cr); - cr1.coord = cr; - cr = range.substring(pos + 1); - cr2 = SocialCalc.coordToCr(cr); - cr2.coord = cr; - } else { - cr1 = SocialCalc.coordToCr(range); - cr1.coord = range; - cr2 = SocialCalc.coordToCr(range); - cr2.coord = range; - } - return { cr1: cr1, cr2: cr2 }; - }; - - SocialCalc.decodeFromSave = function (s) { - if (typeof s != "string") return s; - if (s.indexOf("\\") == -1) return s; // for performace reasons: replace nothing takes up time - var r = s.replace(/\\c/g, ":"); - r = r.replace(/\\n/g, "\n"); - return r.replace(/\\b/g, "\\"); - }; - - SocialCalc.decodeFromAjax = function (s) { - if (typeof s != "string") return s; - if (s.indexOf("\\") == -1) return s; // for performace reasons: replace nothing takes up time - var r = s.replace(/\\c/g, ":"); - r = r.replace(/\\n/g, "\n"); - r = r.replace(/\\e/g, "]]"); - return r.replace(/\\b/g, "\\"); - }; - - SocialCalc.encodeForSave = function (s) { - if (typeof s != "string") return s; - if (s.indexOf("\\") != -1) - // for performace reasons: replace nothing takes up time - s = s.replace(/\\/g, "\\b"); - if (s.indexOf(":") != -1) s = s.replace(/:/g, "\\c"); - if (s.indexOf("\n") != -1) s = s.replace(/\n/g, "\\n"); - return s; - }; - - // - // Returns estring where &, <, >, " are HTML escaped - // - SocialCalc.special_chars = function (string) { - if (/[&<>"]/.test(string)) { - // only do "slow" replaces if something to replace - string = string.replace(/&/g, "&"); - string = string.replace(//g, ">"); - string = string.replace(/"/g, """); - } - return string; - }; - - SocialCalc.Lookup = function (value, list) { - for (i = 0; i < list.length; i++) { - if (list[i] > value) { - if (i > 0) return i - 1; - else return null; - } - } - return list.length - 1; // if all smaller, matches last - }; - - // - // setStyles(element, cssText) - // - // Takes a pseudo style string (e.g., text-align must be textAlign) and sets - // the element's style value for each style name listed (leaving others unchanged). - // OK to call with null cssText. - // - - SocialCalc.setStyles = function (element, cssText) { - var parts, part, pos, name, value; - - if (!cssText) return; - - parts = cssText.split(";"); - for (part = 0; part < parts.length; part++) { - pos = parts[part].indexOf(":"); // find first colon (could be one in url) - if (pos != -1) { - name = parts[part].substring(0, pos); - value = parts[part].substring(pos + 1); - if (name && value) { - // if non-null name and value, set style - element.style[name] = value; - } - } - // namevalue = parts[part].split(":"); - // if (namevalue[0]) element.style[namevalue[0]] = namevalue[1]; - } - }; - - // - // GetViewportInfo() - returns object with viewport width and height, and scroll offsets - // - // Flanagan, JavaScript, 5th Edition, page 276 - // - - SocialCalc.GetViewportInfo = function () { - var result = {}; - - if (window.innerWidth) { - // all but IE - result.width = window.innerWidth; - result.height = window.innerHeight; - result.horizontalScroll = window.pageXOffset; - result.verticalScroll = window.pageYOffset; - } else { - if (document.documentElement && document.documentElement.clientWidth) { - result.width = document.documentElement.clientWidth; - result.height = document.documentElement.clientHeight; - result.horizontalScroll = document.documentElement.scrollLeft; - result.verticalScroll = document.documentElement.scrollTop; - } else if (document.body.clientWidth) { - result.width = document.body.clientWidth; - result.height = document.body.clientHeight; - result.horizontalScroll = document.body.scrollLeft; - result.verticalScroll = document.body.scrollTop; - } - } - - return result; - }; - - // - // GetElementPosition(element) - returns object with left and top position of the element in the document - // - // Goodman's JavaScript & DHTML Cookbook, 2nd Edition, page 415 - // - - SocialCalc.GetElementPosition = function (element) { - var offsetLeft = 0; - var offsetTop = 0; - while (element) { - offsetLeft += element.offsetLeft; - offsetTop += element.offsetTop; - element = element.offsetParent; - } - return { left: offsetLeft, top: offsetTop }; - }; - - // - // GetElementPositionWithScroll(element) - returns object with left and top position of the element in the document - // - // Takes into account scroll offsets by going through entire tree - // - - SocialCalc.GetElementPositionWithScroll = function (element) { - var offsetLeft = 0; - var offsetTop = 0; - var offsetElement = element; - while (element) { - if (element.tagName == "HTML") break; - if (element == offsetElement) { - offsetLeft += element.offsetLeft; - offsetTop += element.offsetTop; - offsetElement = element.offsetParent; - } - if (element.scrollLeft) { - offsetLeft -= element.scrollLeft; - } - if (element.scrollTop) { - offsetTop -= element.scrollTop; - } - element = element.parentNode; - } - return { left: offsetLeft, top: offsetTop }; - }; - - // - // LookupElement(element, array) - returns array element which is an object with "element" of element - // - - SocialCalc.LookupElement = function (element, array) { - var i; - for (i = 0; i < array.length; i++) { - if (array[i].element == element) return array[i]; - } - return null; - }; - - // - // AssignID(obj, element, id) - Optionally assigns an ID with a prefix to the element - // - - SocialCalc.AssignID = function (obj, element, id) { - if (obj.idPrefix) { - // Object must have a non-empty idPrefix attribute - element.id = obj.idPrefix + id; - } - }; - - // - // SocialCalc.GetCellContents(sheetobj, coord) - // - // Returns the contents (value, formula, constant, etc.) of a cell - // with appropriate prefix ("'", "=", etc.) - // - - SocialCalc.GetCellContents = function (sheetobj, coord) { - var result = ""; - var cellobj = sheetobj.cells[coord]; - if (cellobj) { - switch (cellobj.datatype) { - case "v": - result = cellobj.datavalue + ""; - break; - case "t": - result = "'" + cellobj.datavalue; - break; - case "f": - result = "=" + cellobj.formula; - break; - case "c": - result = cellobj.formula; - break; - default: - break; - } - } - - return result; - }; - - // - // Routines translated from the SocialCalc 1.1.0 Perl code: - // - // (Makes use of the FormatNumber JavaScript code translated from the Perl.) - // - - // - // displayvalue = FormatValueForDisplay(sheetobj, value, cr, linkstyle) - // - // Returns a string, in HTML, for the contents of a cell. - // - // The value is a either numeric or text, the cr is the coord of the cell - // (its cell properties are used to determine formatting), and linkstyle - // is a value passed to wiki-text expansion routines specifying the - // purpose of the rendering so, for example, links can be rendered differently - // during edit than with plain HTML. - // - - SocialCalc.FormatValueForDisplay = function (sheetobj, value, cr, linkstyle) { - var valueformat, has_parens, has_commas, valuetype, valuesubtype; - var displayvalue; - - var sheetattribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - var cell = sheetobj.cells[cr]; - - if (!cell) { - // get an empty cell if not there - cell = new SocialCalc.Cell(cr); - } - - displayvalue = value; - - valuetype = cell.valuetype || ""; // get type of value to determine formatting - valuesubtype = valuetype.substring(1); - valuetype = valuetype.charAt(0); - - if (cell.errors || valuetype == "e") { - displayvalue = cell.errors || valuesubtype || "Error in cell"; - return displayvalue; - } - - if (valuetype == "t") { - valueformat = - sheetobj.valueformats[cell.textvalueformat - 0] || - sheetobj.valueformats[sheetattribs.defaulttextvalueformat - 0] || - ""; - if (valueformat == "formula") { - if (cell.datatype == "f") { - displayvalue = - SocialCalc.special_chars("=" + cell.formula) || " "; - } else if (cell.datatype == "c") { - displayvalue = - SocialCalc.special_chars("'" + cell.formula) || " "; - } else { - displayvalue = - SocialCalc.special_chars("'" + displayvalue) || " "; - } - return displayvalue; - } - displayvalue = SocialCalc.format_text_for_display( - displayvalue, - cell.valuetype, - valueformat, - sheetobj, - linkstyle - ); - if (valueformat == "text-html") - SocialCalc.ScriptCheck(sheetobj.sheetid, cr, value); - } else if (valuetype == "n") { - valueformat = cell.nontextvalueformat; - if (valueformat == null || valueformat == "") { - // - valueformat = sheetattribs.defaultnontextvalueformat; - } - valueformat = sheetobj.valueformats[valueformat - 0]; - if (valueformat == null || valueformat == "none") { - valueformat = ""; - } - if (valueformat == "formula") { - if (cell.datatype == "f") { - displayvalue = - SocialCalc.special_chars("=" + cell.formula) || " "; - } else if (cell.datatype == "c") { - displayvalue = - SocialCalc.special_chars("'" + cell.formula) || " "; - } else { - displayvalue = - SocialCalc.special_chars("'" + displayvalue) || " "; - } - return displayvalue; - } else if (valueformat == "forcetext") { - if (cell.datatype == "f") { - displayvalue = - SocialCalc.special_chars("=" + cell.formula) || " "; - } else if (cell.datatype == "c") { - displayvalue = SocialCalc.special_chars(cell.formula) || " "; - } else { - displayvalue = SocialCalc.special_chars(displayvalue) || " "; - } - return displayvalue; - } - - displayvalue = SocialCalc.format_number_for_display( - displayvalue, - cell.valuetype, - valueformat - ); - } else { - // unknown type - probably blank - displayvalue = " "; - } - - return displayvalue; - }; - - // - // displayvalue = format_text_for_display(rawvalue, valuetype, valueformat, sheetobj, linkstyle) - // - - SocialCalc.format_text_for_display = function ( - rawvalue, - valuetype, - valueformat, - sheetobj, - linkstyle - ) { - var valueformat, valuesubtype, dvsc, dvue, textval; - var displayvalue; - - valuesubtype = valuetype.substring(1); - - displayvalue = rawvalue; - - if (valueformat == "none" || valueformat == null) valueformat = ""; - if (!/^(text-|custom|hidden)/.test(valueformat)) valueformat = ""; - if (valueformat == "" || valueformat == "General") { - // determine format from type - if (valuesubtype == "h") valueformat = "text-html"; - if (valuesubtype == "w" || valuesubtype == "r") valueformat = "text-wiki"; - if (valuesubtype == "l") valueformat = "text-link"; - if (!valuesubtype) valueformat = "text-plain"; - } - if (valueformat == "text-html") { - // HTML - output as it as is - } else if ( - SocialCalc.Callbacks.expand_wiki && - /^text-wiki/.test(valueformat) - ) { - // do general wiki markup - displayvalue = SocialCalc.Callbacks.expand_wiki( - displayvalue, - sheetobj, - linkstyle, - valueformat - ); - } else if (valueformat == "text-wiki") { - // Wiki-text - encode then output - displayvalue = SocialCalc.special_chars(displayvalue); - } else if (valueformat == "text-wiki") { - // wiki text - displayvalue = - (SocialCalc.Callbacks.expand_markup && - SocialCalc.Callbacks.expand_markup( - displayvalue, - sheetobj, - linkstyle - )) || // do old wiki markup - SocialCalc.special_chars(displayvalue); - } else if (valueformat == "text-url") { - // text is a URL for a link - dvsc = SocialCalc.special_chars(displayvalue); - dvue = encodeURI(displayvalue); - displayvalue = '' + dvsc + ""; - } else if (valueformat == "text-link") { - // more extensive link capabilities for regular web links - displayvalue = SocialCalc.expand_text_link( - displayvalue, - sheetobj, - linkstyle, - valueformat - ); - } else if (valueformat == "text-image") { - // text is a URL for an image - dvue = encodeURI(displayvalue); - displayvalue = ''; - } else if (valueformat.substring(0, 12) == "text-custom:") { - // construct a custom text format: @r = text raw, @s = special chars, @u = url encoded - dvsc = SocialCalc.special_chars(displayvalue); // do special chars - dvsc = dvsc.replace(/ /g, "  "); // keep multiple spaces - dvsc = dvsc.replace(/\n/g, "
"); // keep line breaks - dvue = encodeURI(displayvalue); - textval = {}; - textval.r = displayvalue; - textval.s = dvsc; - textval.u = dvue; - displayvalue = valueformat.substring(12); // remove "text-custom:" - displayvalue = displayvalue.replace(/@(r|s|u)/g, function (a, c) { - return textval[c]; - }); // replace placeholders - } else if (valueformat.substring(0, 6) == "custom") { - // custom - displayvalue = SocialCalc.special_chars(displayvalue); // do special chars - displayvalue = displayvalue.replace(/ /g, "  "); // keep multiple spaces - displayvalue = displayvalue.replace(/\n/g, "
"); // keep line breaks - displayvalue += " (custom format)"; - } else if (valueformat == "hidden") { - displayvalue = " "; - } else { - // plain text - displayvalue = SocialCalc.special_chars(displayvalue); // do special chars - displayvalue = displayvalue.replace(/ /g, "  "); // keep multiple spaces - displayvalue = displayvalue.replace(/\n/g, "
"); // keep line breaks - } - - return displayvalue; - }; - - // - // displayvalue = format_number_for_display(rawvalue, valuetype, valueformat) - // - - SocialCalc.format_number_for_display = function ( - rawvalue, - valuetype, - valueformat - ) { - var value, valuesubtype; - var scc = SocialCalc.Constants; - - value = rawvalue - 0; - - valuesubtype = valuetype.substring(1); - - if (valueformat == "Auto" || valueformat == "") { - // cases with default format - if (valuesubtype == "%") { - // will display a % character - valueformat = "#,##0.0%"; - } else if (valuesubtype == "$") { - valueformat = "[$]#,##0.00"; - } else if (valuesubtype == "dt") { - valueformat = scc.defaultFormatdt; - } else if (valuesubtype == "d") { - valueformat = scc.defaultFormatd; - } else if (valuesubtype == "t") { - valueformat = scc.defaultFormatt; - } else if (valuesubtype == "l") { - valueformat = "logical"; - } else { - valueformat = "General"; - } - } - - if (valueformat == "logical") { - // do logical format - return value ? scc.defaultDisplayTRUE : scc.defaultDisplayFALSE; - } - - if (valueformat == "hidden") { - // do hidden format - return " "; - } - - // Use format - - return SocialCalc.FormatNumber.formatNumberWithFormat( - rawvalue, - valueformat, - "" - ); - }; - - // - // valueinfo = DetermineValueType(rawvalue) - // - // Takes a value and looks for special formatting like $, %, numbers, etc. - // Returns the value as a number or string and the type as {value: value, type: type}. - // Tries to follow the spec for spreadsheet function VALUE(v). - // - - SocialCalc.DetermineValueType = function (rawvalue) { - var value = rawvalue + ""; - var type = "t"; - var tvalue, matches, year, hour, minute, second, denom, num, intgr, constr; - - tvalue = value.replace(/^\s+/, ""); // remove leading and trailing blanks - tvalue = tvalue.replace(/\s+$/, ""); - - if (value.length == 0) { - type = ""; - } else if (value.match(/^\s+$/)) { - // just blanks - // leave type "t" - } else if (tvalue.match(/^[-+]?\d*(?:\.)?\d*(?:[eE][-+]?\d+)?$/)) { - // general number, including E - value = tvalue - 0; // try converting to number - if (isNaN(value)) { - // leave alone - catches things like plain "-" - value = rawvalue + ""; - } else { - type = "n"; - } - } else if (tvalue.match(/^[-+]?\d*(?:\.)?\d*\s*%$/)) { - // percent form: 15.1% - value = (tvalue.slice(0, -1) - 0) / 100; // convert and scale - type = "n%"; - } else if ( - tvalue.match(/^[-+]?\$\s*\d*(?:\.)?\d*\s*$/) && - tvalue.match(/\d/) - ) { - // $ format: $1.49 - value = tvalue.replace(/\$/, "") - 0; - type = "n$"; - } else if (tvalue.match(/^[-+]?(\d*,\d*)+(?:\.)?\d*$/)) { - // number format ignoring commas: 1,234.49 - value = tvalue.replace(/,/g, "") - 0; - type = "n"; - } else if (tvalue.match(/^[-+]?(\d*,\d*)+(?:\.)?\d*\s*%$/)) { - // % with commas: 1,234.49% - value = (tvalue.replace(/[%,]/g, "") - 0) / 100; - type = "n%"; - } else if ( - tvalue.match(/^[-+]?\$\s*(\d*,\d*)+(?:\.)?\d*$/) && - tvalue.match(/\d/) - ) { - // $ and commas: $1,234.49 - value = tvalue.replace(/[\$,]/g, "") - 0; - type = "n$"; - } else if ( - (matches = value.match(/^(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{1,4})\s*$/)) - ) { - // MM/DD/YYYY, MM/DD/YYYY - year = matches[3] - 0; - year = year < 1000 ? year + 2000 : year; - value = - SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - year, - matches[1] - 0, - matches[2] - 0 - ) - 2415019; - type = "nd"; - } else if ( - (matches = value.match(/^(\d{4})[\/\-](\d{1,2})[\/\-](\d{1,2})\s*$/)) - ) { - // YYYY-MM-DD, YYYY/MM/DD - year = matches[1] - 0; - year = year < 1000 ? year + 2000 : year; - value = - SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - year, - matches[2] - 0, - matches[3] - 0 - ) - 2415019; - type = "nd"; - } else if ((matches = value.match(/^(\d{1,2}):(\d{1,2})\s*$/))) { - // HH:MM - hour = matches[1] - 0; - minute = matches[2] - 0; - if (hour < 24 && minute < 60) { - value = hour / 24 + minute / (24 * 60); - type = "nt"; - } - } else if ((matches = value.match(/^(\d{1,2}):(\d{1,2}):(\d{1,2})\s*$/))) { - // HH:MM:SS - hour = matches[1] - 0; - minute = matches[2] - 0; - second = matches[3] - 0; - if (hour < 24 && minute < 60 && second < 60) { - value = hour / 24 + minute / (24 * 60) + second / (24 * 60 * 60); - type = "nt"; - } - } else if ((matches = value.match(/^\s*([-+]?\d+) (\d+)\/(\d+)\s*$/))) { - // 1 1/2 - intgr = matches[1] - 0; - num = matches[2] - 0; - denom = matches[3] - 0; - if (denom && denom > 0) { - value = intgr + (intgr < 0 ? -num / denom : num / denom); - type = "n"; - } - } else if ((constr = SocialCalc.InputConstants[value.toUpperCase()])) { - // special constants, like "false" and #N/A - num = constr.indexOf(","); - value = constr.substring(0, num) - 0; - type = constr.substring(num + 1); - } else if ( - tvalue.length > 7 && - tvalue.substring(0, 7).toLowerCase() == "http://" - ) { - // URL - value = tvalue; - type = "tl"; - } - - return { value: value, type: type }; - }; - - SocialCalc.InputConstants = { - // strings that turn into constants for SocialCalc.DetermineValueType - TRUE: "1,nl", - FALSE: "0,nl", - "#N/A": "0,e#N/A", - "#NULL!": "0,e#NULL!", - "#NUM!": "0,e#NUM!", - "#DIV/0!": "0,e#DIV/0!", - "#VALUE!": "0,e#VALUE!", - "#REF!": "0,e#REF!", - "#NAME?": "0,e#NAME?", - }; - - // - // result = default_expand_markup(displayvalue, sheetobj, linkstyle) - // - // Processes wiki-text -- this is a placeholder. - // Reference to here in SocialCalc.expand_markup should be replaced by application-specific routine. - // - - SocialCalc.default_expand_markup = function ( - displayvalue, - sheetobj, - linkstyle - ) { - var result = displayvalue; - - result = SocialCalc.special_chars(result); // do special chars - result = result.replace(/ /g, "  "); // keep multiple spaces - result = result.replace(/\n/g, "
"); // keep line breaks - - return result; // do very little by default - - result = result.replace(/('*)'''(.*?)'''/g, "$1$2"); // Wiki-style bold/italics - result = result.replace(/''(.*?)''/g, "$1"); - - return result; - }; - - // - // result = SocialCalc.expand_text_link(displayvalue, sheetobj, linkstyle, valueformat) - // - // Parses link text (URL, descriptions, pagenames, workspace names) and returns HTML - // - - SocialCalc.expand_text_link = function ( - displayvalue, - sheetobj, - linkstyle, - valueformat - ) { - var desc, tb, str; - - var scc = SocialCalc.Constants; - - var url = ""; - var parts = SocialCalc.ParseCellLinkText(displayvalue + ""); - - if (parts.desc) { - desc = SocialCalc.special_chars(parts.desc); - } else { - desc = parts.pagename - ? scc.defaultPageLinkFormatString - : scc.defaultLinkFormatString; - } - - if ( - displayvalue.length > 7 && - displayvalue.substring(0, 7).toLowerCase() == "http://" && - displayvalue.charAt(displayvalue.length - 1) != ">" - ) { - desc = desc.substring(7); // remove http:// unless explicit - } - - tb = parts.newwin || !linkstyle ? ' target="_blank"' : ""; - - if (parts.pagename) { - if (SocialCalc.Callbacks.MakePageLink) { - url = SocialCalc.Callbacks.MakePageLink( - parts.pagename, - parts.workspacename, - linkstyle, - valueformat - ); - } - // else if (parts.workspace) { - // url = "/" + encodeURI(parts.workspace) + "/" + encodeURI(parts.pagename); - // } - // else { - // url = parts.pagename; - // } - } else { - url = encodeURI(parts.url); - } - str = '" + desc + ""; - - return str; - }; - - // - // result = SocialCalc.ParseCellLinkText(str) - // - // Given: url = http://www.someurl.com/more, desc = Some descriptive text - // - // Takes the following: - // - // url - // - // desc - // "desc" - // <<>> instead of <> => target="_blank" (new window) - // - // [page name] - // "desc"[page name] - // desc[page name] - // {workspace name [page name]} - // "desc"{workspace name [page name]} - // [[]] instead of [] => target="_blank" (new window) - // - // - // Returns: {url: url, desc: desc, newwin: t/f, pagename: pagename, workspace: workspace} - // - - SocialCalc.ParseCellLinkText = function (str) { - var result = { - url: "", - desc: "", - newwin: false, - pagename: "", - workspace: "", - }; - - var pageform = false; - var urlend = str.length - 1; - var descstart = 0; - var lastlt = str.lastIndexOf("<"); - var lastbrkt = str.lastIndexOf("["); - var lastbrace = str.lastIndexOf("{"); - var descend = -1; - - if ( - (str.charAt(urlend) != ">" || lastlt == -1) && - (str.charAt(urlend) != "]" || lastbrkt == -1) && - (str.charAt(urlend) != "}" || - str.charAt(urlend - 1) != "]" || - lastbrace == -1 || - lastbrkt == -1 || - lastbrkt < lastbrace) - ) { - // plain url - urlend++; - descend = urlend; - } else { - // some markup - if (str.charAt(urlend) == ">") { - // url form - descend = lastlt - 1; - if ( - lastlt > 0 && - str.charAt(descend) == "<" && - str.charAt(urlend - 1) == ">" - ) { - descend--; - urlend--; - result.newwin = true; - } - } else if (str.charAt(urlend) == "]") { - // plain page form - descend = lastbrkt - 1; - pageform = true; - if ( - lastbrkt > 0 && - str.charAt(descend) == "[" && - str.charAt(urlend - 1) == "]" - ) { - descend--; - urlend--; - result.newwin = true; - } - } else if (str.charAt(urlend) == "}") { - // page and workspace form - descend = lastbrace - 1; - pageform = true; - wsend = lastbrkt; - urlend--; - if ( - lastbrkt > 0 && - str.charAt(lastbrkt - 1) == "[" && - str.charAt(urlend - 1) == "]" - ) { - wsend = lastbrkt - 1; - urlend--; - result.newwin = true; - } - if (str.charAt(wsend - 1) == " ") { - // trim trailing space in workspace name - wsend--; - } - result.workspace = str.substring(lastbrace + 1, wsend) || ""; - } - - if (str.charAt(descend) == " ") { - // trim trailing space on desc - descend--; - } - - if (str.charAt(descstart) == '"' && str.charAt(descend) == '"') { - descstart++; - descend--; - } - } - - if (pageform) { - result.pagename = str.substring(lastbrkt + 1, urlend) || ""; - } else { - result.url = str.substring(lastlt + 1, urlend) || ""; - } - - if (descend >= descstart) { - result.desc = str.substring(descstart, descend + 1); - } - - return result; - }; - - // - // result = SocialCalc.ConvertSaveToOtherFormat(savestr, outputformat, dorecalc) - // - // Returns a string in the specificed format: "scsave", "html", "csv", "tab" (tab delimited) - // If dorecalc is true, performs a recalc after loading (NO: obsolete!). - // - - SocialCalc.ConvertSaveToOtherFormat = function ( - savestr, - outputformat, - dorecalc - ) { - var sheet, context, clipextents, div, ele, row, col, cr, cell, str; - - var result = ""; - - if (outputformat == "scsave") { - return savestr; - } - - if (savestr == "") { - return ""; - } - - sheet = new SocialCalc.Sheet(); - sheet.ParseSheetSave(savestr); - - if (dorecalc) { - // no longer supported as of 9/10/08 - // Recalc is now async, so can't do it this way - throw "SocialCalc.ConvertSaveToOtherFormat: Not doing recalc."; - } - - if (sheet.copiedfrom) { - clipextents = SocialCalc.ParseRange(sheet.copiedfrom); - } else { - clipextents = { - cr1: { row: 1, col: 1 }, - cr2: { row: sheet.attribs.lastrow, col: sheet.attribs.lastcol }, - }; - } - - if (outputformat == "html") { - context = new SocialCalc.RenderContext(sheet); - if (sheet.copiedfrom) { - context.rowpanes[0] = { - first: clipextents.cr1.row, - last: clipextents.cr2.row, - }; - context.colpanes[0] = { - first: clipextents.cr1.col, - last: clipextents.cr2.col, - }; - } - div = document.createElement("div"); - ele = context.RenderSheet(null, context.defaultHTMLlinkstyle); - div.appendChild(ele); - context = undefined; - sheet = undefined; - result = div.innerHTML; - ele = undefined; - div = undefined; - return result; - } - - for (row = clipextents.cr1.row; row <= clipextents.cr2.row; row++) { - for (col = clipextents.cr1.col; col <= clipextents.cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - - if (cell.errors) { - str = cell.errors; - } else { - str = cell.datavalue + ""; // get value as text - } - - if (outputformat == "csv") { - if (str.indexOf('"') != -1) { - str = str.replace(/"/g, '""'); // double quotes - } - if (/[, \n"]/.test(str)) { - str = '"' + str + '"'; // add quotes - } - if (col > clipextents.cr1.col) { - str = "," + str; // add commas - } - } else if (outputformat == "tab") { - if (str.indexOf("\n") != -1) { - // if multiple lines - if (str.indexOf('"') != -1) { - str = str.replace(/"/g, '""'); // double quotes - } - str = '"' + str + '"'; // add quotes - } - if (col > clipextents.cr1.col) { - str = "\t" + str; // add tabs - } - } - result += str; - } - result += "\n"; - } - - return result; - }; - - // - // result = SocialCalc.ConvertOtherFormatToSave(inputstr, inputformat) - // - // Returns a string converted from the specified format: "scsave", "csv", "tab" (tab delimited) - // - - SocialCalc.ConvertOtherFormatToSave = function (inputstr, inputformat) { - var sheet, - context, - lines, - i, - line, - value, - inquote, - j, - ch, - values, - row, - col, - cr, - maxc; - - var result = ""; - - var AddCell = function () { - col++; - if (col > maxc) maxc = col; - cr = SocialCalc.crToCoord(col, row); - SocialCalc.SetConvertedCell(sheet, cr, value); - value = ""; - }; - - if (inputformat == "scsave") { - return inputstr; - } - - sheet = new SocialCalc.Sheet(); - - lines = inputstr.split(/\r\n|\n/); - - maxc = 0; - if (inputformat == "csv") { - row = 0; - inquote = false; - for (i = 0; i < lines.length; i++) { - if (i == lines.length - 1 && lines[i] == "") { - // extra null line - ignore - break; - } - if (inquote) { - // if inquote, just continue from where left off - value += "\n"; - } else { - // otherwise next row - value = ""; - row++; - col = 0; - } - line = lines[i]; - for (j = 0; j < line.length; j++) { - ch = line.charAt(j); - if (ch == '"') { - if (inquote) { - if (j < line.length - 1 && line.charAt(j + 1) == '"') { - // double quotes - j++; // skip the second one - value += '"'; // add one quote - } else { - inquote = false; - if (j == line.length - 1) { - // at end of line - AddCell(); - } - } - } else { - inquote = true; - } - continue; - } - if (ch == "," && !inquote) { - AddCell(); - } else { - value += ch; - } - if (j == line.length - 1 && !inquote) { - AddCell(); - } - } - } - if (maxc > 0) { - sheet.attribs.lastrow = row; - sheet.attribs.lastcol = maxc; - result = sheet.CreateSheetSave("A1:" + SocialCalc.crToCoord(maxc, row)); - } - } - - if (inputformat == "tab") { - row = 0; - inquote = false; - for (i = 0; i < lines.length; i++) { - if (i == lines.length - 1 && lines[i] == "") { - // extra null line - ignore - break; - } - if (inquote) { - // if inquote, just continue from where left off - value += "\n"; - } else { - // otherwise next row - value = ""; - row++; - col = 0; - } - line = lines[i]; - for (j = 0; j < line.length; j++) { - ch = line.charAt(j); - if (ch == '"') { - if (inquote) { - if (j < line.length - 1) { - if (line.charAt(j + 1) == '"') { - // double quotes - j++; // skip the second one - value += '"'; // add one quote - } else if (line.charAt(j + 1) == "\t") { - // end of quoted item - j++; - inquote = false; - AddCell(); - } - } else { - // at end of line - inquote = false; - AddCell(); - } - continue; - } - if (value == "") { - // quote at start of item - inquote = true; - continue; - } - } - if (ch == "\t" && !inquote) { - AddCell(); - } else { - value += ch; - } - if (j == line.length - 1 && !inquote) { - AddCell(); - } - } - } - if (maxc > 0) { - sheet.attribs.lastrow = row; - sheet.attribs.lastcol = maxc; - result = sheet.CreateSheetSave("A1:" + SocialCalc.crToCoord(maxc, row)); - } - } - - return result; - }; - - // - // SocialCalc.SetConvertedCell(sheet, cr, rawvalue) - // - // Sets the cell cr with a value and type determined from rawvalue - // - - SocialCalc.SetConvertedCell = function (sheet, cr, rawvalue) { - var cell, value; - - cell = sheet.GetAssuredCell(cr); - - value = SocialCalc.DetermineValueType(rawvalue); - - if (value.type == "n" && value.value == rawvalue) { - // check that we don't need "constant" to remember original value - cell.datatype = "v"; - cell.valuetype = "n"; - cell.datavalue = value.value; - } else if (value.type.charAt(0) == "t") { - // text of some sort but left unchanged - cell.datatype = "t"; - cell.valuetype = value.type; - cell.datavalue = value.value; - } else { - // special number types - cell.datatype = "c"; - cell.valuetype = value.type; - cell.datavalue = value.value; - cell.formula = rawvalue; - } - }; - - // - // socialcalctouch adds touch gestures to SocialCalc - // - // As a start, touch gestures are modeled similar to - // mouse events - // - // Author: Ramu Ramamurthy - // - // - // - - // - // - // To initialize, SocialCalc.CreateTableEditor must call - // SocialCalc.TouchRegister(editor.toplevel, {Swipe: SocialCalc.EditorProcessSwipe, editor: editor}); - // Also, any element create inside the grid needs to be touch registered for it to work - // this includes buttons, etc - // - // TestCases: - // 1) tap to point to cell, and to move edit-cell - // 2) double-tap on a cell to open edit-box, then tap on edit box to pullup keyboard - // -- when editing, tap on any other cell to be done with edit - // *** figure out escape to cancel edit versus return to accept edit - // -- when editing, and if = seen than tapping on cell puts the cell name into the edit box - // 3) tap on input box on top opens edit on cell - // tap on any cell accepts and finishes this edit - // *** need a way to cancel the edit versus accept the edit - // - // 4) tap on a cell and move finger starts a range - // removing finger completes the range - // tap on cell cancels range - // - // 5) a swipe action scrolls the sheet - // swipe up/dn scrolls up/dn - // swipe lt/rt scrolls lt/rt - // - // - // Wishlist: - // 1) smooth scroll will be nice (in addition to swipe) -- using a two-touch pan ? - // - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - - // ************************************* - // - // Touch functions: - // - // ************************************* - - SocialCalc.HasTouch = false; - - (function () { - // platform specific registration - var agent = navigator.userAgent.toLowerCase(); - - if ( - agent.indexOf("iphone") >= 0 || - agent.indexOf("ipad") >= 0 || - agent.indexOf("android") >= 0 - ) { - SocialCalc.HasTouch = true; - } - })(); - - SocialCalc.TouchInfo = { - // In sequence the following will be implemented - // swipe up/dn, left/right will scroll up/dn/left/right respectively - // - // touch on a cell will move ecell to that cell - // repeated touch on a cell will start edit on that cell - // touch on another cell will cancel edit if it was in progress (?) - // etc - // - // touch on buttons will activate the buttons - // - // The registeredElements array is used to identify items. - - // One item for each element to respond to the touch, each an object with: - // .element, .functionobj - - registeredElements: [], - - // for swipe - threshold_x: 20, - threshold_y: 20, - - orig_coord_x: 0, - orig_coord_y: 0, - final_coord_x: 0, - final_coord_y: 0, - - px_to_rows: 20, // 20 pixels is 1 row scroll - px_to_cols: 20, // 20 pixels is 1 col scroll - - touch_start: 0, - ranging: false, - ranging_threshold: 100, - move_start: 0, - - last_touch: 0, - timeout_handle: null, - doubletap_threshold: 500, // max milliseconds between taps - }; - - // - // TouchRegister(element, functionobj) - make element respond to touch - // - - SocialCalc.TouchRegister = function (element, functionobj) { - if (!SocialCalc.HasTouch) { - return; - } - - var touchinfo = SocialCalc.TouchInfo; - - if (SocialCalc.LookupElement(element, touchinfo.registeredElements)) { - // already registered - return; - } - - touchinfo.registeredElements.push({ - element: element, - functionobj: functionobj, - }); - - if (SocialCalc.HasTouch && element.addEventListener) { - // Webkit based (?) - element.addEventListener( - "touchstart", - SocialCalc.ProcessTouchStart, - false - ); - element.addEventListener("touchmove", SocialCalc.ProcessTouchMove, false); - element.addEventListener("touchend", SocialCalc.ProcessTouchEnd, false); - element.addEventListener( - "touchcancel", - SocialCalc.ProcessTouchCancel, - false - ); - // element.addEventListener("orientationchange", SocialCalc.ProcessOrientationChange, false); - } - }; - - SocialCalc.FindTouchElement = function (event) { - var touchinfo = SocialCalc.TouchInfo; - - var event = event || window.event; - - var ele = event.target || event.srcElement; // investigate - - for (var wobj = null; !wobj && ele; ele = ele.parentNode) { - // investigate - wobj = SocialCalc.LookupElement(ele, touchinfo.registeredElements); - } - - return wobj; - }; - - SocialCalc.ProcessTouchStart = function (event) { - var touchinfo = SocialCalc.TouchInfo; - touchinfo.orig_coord_x = event.targetTouches[0].pageX; - touchinfo.orig_coord_y = event.targetTouches[0].pageY; - - touchinfo.final_coord_x = touchinfo.orig_coord_x; - touchinfo.final_coord_y = touchinfo.orig_coord_y; - - touchinfo.touch_start = new Date().getTime(); - - event.preventDefault(); - }; - - SocialCalc.TouchGetSimulatedMouseEvent = function (event, mouse_evt_name) { - var touches = event.changedTouches; - var first = touches[0]; - var simulatedEvent = document.createEvent("MouseEvent"); - simulatedEvent.initMouseEvent( - mouse_evt_name, - true, - true, - window, - 1, - first.screenX, - first.screenY, - first.clientX, - first.clientY, - false, - false, - false, - false, - 0, - null - ); - return simulatedEvent; - }; - - SocialCalc.ProcessTouchMove = function (event) { - var touchinfo = SocialCalc.TouchInfo; - touchinfo.final_coord_x = event.targetTouches[0].pageX; - touchinfo.final_coord_y = event.targetTouches[0].pageY; - - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) return; // not one of our elements - - if (touchinfo.move_start == 0) { - touchinfo.move_start = new Date().getTime(); - if ( - touchinfo.move_start - touchinfo.touch_start > - touchinfo.ranging_threshold - ) { - // This is a delayed move - // send a mouse down event - // This is for ranging and dragging - - touchinfo.ranging = true; - var mouseDn = SocialCalc.TouchGetSimulatedMouseEvent( - event, - "mousedown" - ); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDn); - } - } else if (touchinfo.ranging) { - // already ranging - // send a mouse move event - - var mouseMv = SocialCalc.TouchGetSimulatedMouseEvent(event, "mousemove"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseMv); - } - - event.preventDefault(); - }; - - SocialCalc.ProcessTouchEnd = function (e) { - var touchinfo = SocialCalc.TouchInfo; - - var changeX = touchinfo.orig_coord_x - touchinfo.final_coord_x; - var changeY = touchinfo.orig_coord_y - touchinfo.final_coord_y; - - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) return; // not one of our elements - - var event = e || window.event; - - touchinfo.move_start = 0; - touchinfo.touch_start = 0; - - if (touchinfo.ranging) { - // in ranging, and dragging - // send a mouseup event - touchinfo.ranging = false; - var mouseUp = SocialCalc.TouchGetSimulatedMouseEvent(event, "mouseup"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseUp); - } else if ( - Math.abs(changeY) > touchinfo.threshold_y || - Math.abs(changeX) > touchinfo.threshold_x - ) { - // check for swipe - - var amount_y = Math.floor(changeY / touchinfo.px_to_rows); - var amount_x = Math.floor(changeX / touchinfo.px_to_cols); - if (wobj.functionobj && wobj.functionobj.Swipe) { - wobj.functionobj.Swipe(event, touchinfo, wobj, amount_y, amount_x); - } - } else { - // detect a double tap - var now = new Date().getTime(); - var lasttouch = touchinfo.last_touch || now + 1; - var delta = now - lasttouch; - if (touchinfo.timeout_handle) { - clearTimeout(touchinfo.timeout_handle); - touchinfo.timeout_handle = null; - } - - if (delta < touchinfo.doubletap_threshold && delta > 0) { - // doubletap seen - if (wobj.functionobj && wobj.functionobj.DoubleTap) { - wobj.functionobj.DoubleTap(event, touchinfo, wobj); - } - } else { - // this is a single tap - touchinfo.last_touch = now; - var timeoutFn = function () { - if (wobj.functionobj && wobj.functionobj.SingleTap) { - wobj.functionobj.SingleTap(event, touchinfo, wobj); - } - }; - touchinfo.timeout_handle = setTimeout( - timeoutFn(), - touchinfo.doubletap_threshold - ); - } - touchinfo.last_touch = now; - } - e.preventDefault(); - }; - - SocialCalc.ProcessTouchCancel = function (event) { - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) { - return; // do default behavior - } - - var touchinfo = SocialCalc.TouchInfo; - touchinfo.orig_coord_x = 0; - touchinfo.orig_coord_y = 0; - touchinfo.final_coord_x = 0; - touchinfo.final_coord_y = 0; - touchinfo.move_start = 0; - touchinfo.touch_start = 0; - touchinfo.ranging = false; - }; - - SocialCalc.EditorProcessSwipe = function ( - event, - touchinfo, - wobj, - swipevert, - swipehoriz - ) { - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - - if (wobj.functionobj.editor.state != "start") { - return; // ignore if cell being edited - } - - if (swipevert != 0 || swipehoriz != 0) { - //wobj.functionobj.editor.ScrollRelativeBoth(swipevert,swipehoriz); - wobj.functionobj.editor.ScrollRelativeBoth(swipevert, 0); //ignore horiz swipes entirely - } - }; - - SocialCalc.EditorProcessSingleTap = function (event, touchinfo, wobj) { - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - - // send mouse down - var mouseDn = SocialCalc.TouchGetSimulatedMouseEvent(event, "mousedown"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDn); - - // then send mouse up - var mouseUp = SocialCalc.TouchGetSimulatedMouseEvent(event, "mouseup"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseUp); - }; - - SocialCalc.EditorProcessDoubleTap = function (event, touchinfo, wobj) { - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - // simulate a mouse double click - var mouseDblClick = SocialCalc.TouchGetSimulatedMouseEvent( - event, - "dblclick" - ); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDblClick); - }; - - SocialCalc.ProcessOrientationChange = function (event) { - console.log("orientation change"); - //var height = $(window).height(); - //var width = $(window).width(); - - //console.log("width="+width+",height="+height) - - // $(window).trigger( "orientationchange.htmlclass" ); - // spreadsheet.DoOnResize(); - }; - - // - // SocialCalcTableEditor - // - /* - // The code module of the SocialCalc package that displays a scrolling grid with panes - // and handles keyboard and mouse I/O. - // - // (c) Copyright 2008, 2009, 2010 Socialtext, Inc. - // All Rights Reserved. - // - */ - - /* - - LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - - EXHIBIT A. Common Public Attribution License Version 1.0. - - The contents of this file are subject to the Common Public Attribution License Version 1.0 (the - "License"); you may not use this file except in compliance with the License. You may obtain a copy - of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but - Sections 14 and 15 have been added to cover use of software over a computer network and provide for - limited attribution for the Original Developer. In addition, Exhibit A has been modified to be - consistent with Exhibit B. - - Software distributed under the License 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 Original Code is SocialCalc JavaScript TableEditor. - - The Original Developer is the Initial Developer. - - The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by - Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - - Contributor: Dan Bricklin. - - - EXHIBIT B. Attribution Information - - When the TableEditor is producing and/or controlling the display the Graphic Image must be - displayed on the screen visible to the user in a manner comparable to that in the - Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for - that image. The image must be linked to the Attribution URL so as to access that page - when clicked. If the user interface includes a prominent "about" display which includes - factual prominent attribution in a form similar to that in the "about" display included - with the Original Code, including Socialtext copyright notices and URLs, then the image - need not be linked to the Attribution URL but the "tool-tip" is still required. - - Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - - Attribution Phrase (not exceeding 10 words): SocialCalc - - Attribution URL: http://www.socialcalc.org/xoattrib - - Graphic Image: The contents of the sc-logo.gif file in the Original Code or - a suitable replacement from http://www.socialcalc.org/licenses specified as - being for SocialCalc. - - Display of Attribution Information is required in Larger Works which are defined - in the CPAL as a work which combines Covered Code or portions thereof with code - not governed by the terms of the CPAL. - - */ - - // - // Some of the other files in the SocialCalc package are licensed under - // different licenses. Please note the licenses of the modules you use. - // - // Code History: - // - // 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. - // All Rights Reserved. - // Portions (c) Copyright 2007 Socialtext, Inc. - // All Rights Reserved. - // The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. - // wikiCalc 1.0 was written by Software Garden, Inc. - // Unless otherwise specified, referring to "SocialCalc" in comments refers to this - // JavaScript version of the code, not the SocialCalc Perl code. - // - - /* - - See the comments in the main SocialCalc code module file of the SocialCalc package. - - */ - - var SocialCalc; - if (!SocialCalc) { - // created here, too, in case load order is wrong, but main routines are required - SocialCalc = {}; - } - - // ************************************* - // - // Table Editor class: - // - // ************************************* - - // Constructor: - - SocialCalc.TableEditor = function (context) { - var scc = SocialCalc.Constants; - - // Properties: - - this.context = context; // editing context - this.toplevel = null; // top level HTML element for this table editor - this.fullgrid = null; // rendered editing context - - this.noEdit = false; // if true, disable all edit UI and make read-only - - this.width = null; - this.tablewidth = null; - this.height = null; - this.tableheight = null; - - this.inputBox = null; - this.inputEcho = null; - this.verticaltablecontrol = null; - this.horizontaltablecontrol = null; - - this.logo = null; - - this.cellhandles = null; - - // Dynamic properties: - - this.timeout = null; // if non-null, timer id for position calculations - this.busy = false; // true when executing command, calculating, etc. - this.ensureecell = false; // if true, ensure ecell is visible after timeout - this.deferredCommands = []; // commands to execute after busy, in form: {cmdstr: "cmds", saveundo: t/f} - - this.gridposition = null; // screen coords of full grid - this.headposition = null; // screen coords of upper left of grid within header rows - this.firstscrollingrow = null; // row number of top row in last (the scrolling) pane - this.firstscrollingrowtop = null; // position of top row in last (the scrolling) pane - this.lastnonscrollingrow = null; // row number of last displayed row in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblerow = null; // used for paging down - this.firstscrollingcol = null; // column number of top col in last (the scrolling) pane - this.firstscrollingcolleft = null; // position of top col in last (the scrolling) pane - this.lastnonscrollingcol = null; // col number of last displayed column in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblecol = null; // used for paging right - - this.rowpositions = []; // screen positions of the top of some rows - this.colpositions = []; // screen positions of the left side of some rows - this.rowheight = []; // size in pixels of each row when last checked, or null/undefined, for page up - this.colwidth = []; // size in pixels of each column when last checked, or null/undefined, for page left - - this.ecell = null; // either null or {coord: c, row: r, col: c} - this.state = "start"; // the keyboard states: see EditorProcessKey - - this.workingvalues = {}; // values used during keyboard editing, etc. - - // Constants: - - this.imageprefix = scc.defaultImagePrefix; // URL prefix for images (e.g., "/www/assets/images/sc") - this.idPrefix = scc.defaultTableEditorIDPrefix; - this.pageUpDnAmount = scc.defaultPageUpDnAmount; // number of rows to move cursor on PgUp/PgDn keys (numeric) - - // Callbacks - - // recalcFunction: if present, function(editor) {...}, called to do a recalc - // Default (sheet.RecalcSheet) does all the right stuff. - - this.recalcFunction = function (editor) { - if (editor.context.sheetobj.RecalcSheet) { - editor.context.sheetobj.RecalcSheet( - SocialCalc.EditorSheetStatusCallback, - editor - ); - } else return null; - }; - - // ctrlkeyFunction: if present, function(editor, charname) {...}, called to handle ctrl-V, etc., at top level - // Returns true (pass through for continued processing) or false (stop processing this key). - - this.ctrlkeyFunction = function (editor, charname) { - var ta, ha, cell, position, cmd, sel, cliptext; - - switch (charname) { - case "[ctrl-c]": - case "[ctrl-x]": - ta = editor.pasteTextarea; - ta.value = ""; - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = position.left - 1 + "px"; - ta.style.top = position.top - 1 + "px"; - } - if (editor.range.hasrange) { - sel = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - sel = editor.ecell.coord; - } - - // get what to copy to clipboard - cliptext = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), - "tab" - ); - - if ( - charname == "[ctrl-c]" || - editor.noEdit || - (SocialCalc.Callbacks.IsCellEditable && - !SocialCalc.Callbacks.IsCellEditable(editor)) - ) { - // if copy or cut but in no edit - cmd = "copy " + sel + " formulas"; - } else { - // [ctrl-x] - cmd = "cut " + sel + " formulas"; - } - editor.EditorScheduleSheetCommands(cmd, true, false); // queue up command to put on SocialCalc clipboard - - /* Copy as HTML: This fails rather badly as it won't paste into Notepad as tab-delimited text. Oh well. - -ha = editor.pasteHTMLarea; -if (editor.range.hasrange) { -cell = SocialCalc.GetEditorCellElement(editor, editor.range.top, editor.range.left); -} -else { -cell = SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); -} -if (cell) position = SocialCalc.GetElementPosition(cell.element); - -if (ha) { -if (position) { -ha.style.left = (position.left-1)+"px"; -ha.style.top = (position.top-1)+"px"; -} -ha.style.visibility="visible"; -cliptext = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), "html"); -ha.innerHTML = cliptext.replace(/]*>[\d\D]*?<\/tr\b[^>]*>/i, ''); -ha.focus(); - -var range = document.body.createControlRange(); -range.addElement(ha.childNodes[0]); -range.select(); -} -*/ - ta.style.display = "block"; - ta.value = cliptext; // must follow "block" setting for Webkit - ta.focus(); - ta.select(); - window.setTimeout(function () { - if (!SocialCalc.GetSpreadsheetControlObject) return; // in case not loaded - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - /* -var ha = editor.pasteHTMLarea; -if (ha) { -ha.blur(); -ha.innerHTML = ''; -ha.style.visibility = 'hidden'; -} -*/ - var ta = editor.pasteTextarea; - ta.blur(); - ta.style.display = "none"; - SocialCalc.KeyboardFocus(); - }, 200); - - return true; - - case "[ctrl-v]": - if (editor.noEdit) return true; // not if no edit - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - var showPasteTextArea = function () { - ta = editor.pasteTextarea; - ta.value = ""; - - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = position.left - 1 + "px"; - ta.style.top = position.top - 1 + "px"; - } - ta.style.display = "block"; - ta.value = ""; // must follow "block" setting for Webkit - ta.focus(); - }; - - ha = editor.pasteHTMLarea; - if (ha) { - /* Pasting via HTML - Currently IE only */ - ha.style.visibility = "visible"; - ha.focus(); - } else { - showPasteTextArea(); - } - window.setTimeout(function () { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var value = null; - var isPasteSameAsClipboard = false; - - ha = editor.pasteHTMLarea; - if (ha) { - /* IE: We append a U+FFFC to every TD that's not the last of its row, - * then we obtain innerText, then turn U+FFFC back to \t, - * thereby preserving the cell separations (which gets discarded - * if we simply paste via textarea. - */ - var _ObjectReplacementCharacter_ = String.fromCharCode(0xfffc); - var html = ha.innerHTML; - - if (html.search(/<(?![Bb][Rr])[A-Za-z]/) >= 0) { - /* HTML Paste: Mark TDs with U+FFFC accordingly.. */ - ha.innerHTML = html.replace( - /(?:<\/[Tt][Dd]>)/g, - _ObjectReplacementCharacter_ - ); - } else { - /* Text Paste: In IE, \t is transformed into  , so replace them with U+FFFC. */ - ha.innerHTML = html.replace( - /&[Nn][Bb][Ss][Pp];/g, - _ObjectReplacementCharacter_ - ); - } - - value = ha.innerText.replace( - new RegExp(_ObjectReplacementCharacter_, "g"), - "\t" - ); - - ha.innerHTML = ""; - ha.blur(); - ha.style.visibility = "hidden"; - } else { - var ta = editor.pasteTextarea; - value = ta.value; - ta.blur(); - ta.style.display = "none"; - } - - value = value.replace(/\r\n/g, "\n").replace(/\n?$/, "\n"); - var clipstr = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.Clipboard.clipboard, - "tab" - ); - if ( - value == clipstr || - (value.length - clipstr.length == 1 && - value.substring(0, value.length - 1) == clipstr) - ) { - isPasteSameAsClipboard = true; - } - - var cmd = ""; - // pastes SocialCalc clipboard if did a Ctrl-C and contents still the same - // Webkit adds an extra blank line, so need to allow for that - if (!isPasteSameAsClipboard) { - cmd = - "loadclipboard " + - SocialCalc.encodeForSave( - SocialCalc.ConvertOtherFormatToSave(value, "tab") - ) + - "\n"; - } - var cr; - if (editor.range.hasrange) { - cr = SocialCalc.crToCoord(editor.range.left, editor.range.top); - } else { - cr = editor.ecell.coord; - } - cmd += "paste " + cr + " formulas"; - editor.EditorScheduleSheetCommands(cmd, true, false); - SocialCalc.KeyboardFocus(); - }, 200); - return true; - - case "[ctrl-z]": - editor.EditorScheduleSheetCommands("undo", true, false); - return false; - - case "[ctrl-s]": // !!!! temporary hack - window.setTimeout(function () { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var sheet = editor.context.sheetobj; - var cell = sheet.GetAssuredCell(editor.ecell.coord); - var ntvf = cell.nontextvalueformat - ? sheet.valueformats[cell.nontextvalueformat - 0] || "" - : ""; - var newntvf = window.prompt( - "Advanced Feature:\n\nCustom Numeric Format or Command", - ntvf - ); - if (newntvf != null) { - // not cancelled - if (newntvf.match(/^cmd:/)) { - cmd = newntvf.substring(4); // execute as command - } else if (newntvf.match(/^edit:/)) { - cmd = newntvf.substring(5); // execute as command - if (SocialCalc.CtrlSEditor) { - SocialCalc.CtrlSEditor(cmd); - } - return; - } else { - if (editor.range.hasrange) { - sel = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord( - editor.range.right, - editor.range.bottom - ); - } else { - sel = editor.ecell.coord; - } - cmd = "set " + sel + " nontextvalueformat " + newntvf; - } - editor.EditorScheduleSheetCommands(cmd, true, false); - } - }, 200); - return false; - - default: - break; - } - return true; - }; - - // Set sheet's status callback: - - context.sheetobj.statuscallback = SocialCalc.EditorSheetStatusCallback; - context.sheetobj.statuscallbackparams = this; // this object: the table editor object - - // StatusCallback: all values are called at appropriate times, add with unique name, delete when done - // - // Each value must be an object in the form of: - // - // func: function(editor, status, arg, params) {...}, - // params: params value to call func with - // - // The values for status and arg are: - // - // all the SocialCalc RecalcSheet statuscallbacks, including: - // - // calccheckdone, calclist length - // calcorder, {coord: coord, total: celllist length, count: count} - // calcstep, {coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds - // - // the command callbacks, like cmdstart and cmdend - // cmdendnorender - // - // calcstart, null - // moveecell, new ecell coord - // rangechange, "coord:coord" or "coord" or "" - // specialkey, keyname ("[esc]") - // - - this.StatusCallback = {}; - - this.MoveECellCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.RangeChangeCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.SettingsCallbacks = {}; // See SocialCalc.SaveEditorSettings - - // Set initial cursor - - this.ecell = { coord: "A1", row: 1, col: 1 }; - context.highlights[this.ecell.coord] = "cursor"; - - // Initialize range data - // Range has at least hasrange (true/false). - // It may also have: anchorcoord, anchorrow, anchorcol, top, bottom, left, and right. - - this.range = { hasrange: false }; - - // Initialize range2 data (used to show selections, such as for move) - // Range2 has at least hasrange (true/false). - // It may also have: top, bottom, left, and right. - - this.range2 = { hasrange: false }; - }; - - // Methods: - - SocialCalc.TableEditor.prototype.CreateTableEditor = function ( - width, - height - ) { - return SocialCalc.CreateTableEditor(this, width, height); - }; - SocialCalc.TableEditor.prototype.ResizeTableEditor = function ( - width, - height - ) { - return SocialCalc.ResizeTableEditor(this, width, height); - }; - - SocialCalc.TableEditor.prototype.SaveEditorSettings = function () { - return SocialCalc.SaveEditorSettings(this); - }; - SocialCalc.TableEditor.prototype.LoadEditorSettings = function (str, flags) { - return SocialCalc.LoadEditorSettings(this, str, flags); - }; - - SocialCalc.TableEditor.prototype.EditorRenderSheet = function () { - SocialCalc.EditorRenderSheet(this); - }; - SocialCalc.TableEditor.prototype.EditorScheduleSheetCommands = function ( - cmdstr, - saveundo, - ignorebusy - ) { - SocialCalc.EditorScheduleSheetCommands(this, cmdstr, saveundo, ignorebusy); - }; - SocialCalc.TableEditor.prototype.ScheduleSheetCommands = function ( - cmdstr, - saveundo - ) { - this.context.sheetobj.ScheduleSheetCommands(cmdstr, saveundo); - }; - SocialCalc.TableEditor.prototype.SheetUndo = function () { - this.context.sheetobj.SheetUndo(); - }; - SocialCalc.TableEditor.prototype.SheetRedo = function () { - this.context.sheetobj.SheetRedo(); - }; - SocialCalc.TableEditor.prototype.EditorStepSet = function (status, arg) { - SocialCalc.EditorStepSet(this, status, arg); - }; - SocialCalc.TableEditor.prototype.GetStatuslineString = function ( - status, - arg, - params - ) { - return SocialCalc.EditorGetStatuslineString(this, status, arg, params); - }; - - SocialCalc.TableEditor.prototype.EditorMouseRegister = function () { - return SocialCalc.EditorMouseRegister(this); - }; - SocialCalc.TableEditor.prototype.EditorMouseUnregister = function () { - return SocialCalc.EditorMouseUnregister(this); - }; - SocialCalc.TableEditor.prototype.EditorMouseRange = function (coord) { - return SocialCalc.EditorMouseRange(this, coord); - }; - - SocialCalc.TableEditor.prototype.EditorProcessKey = function (ch, e) { - return SocialCalc.EditorProcessKey(this, ch, e); - }; - SocialCalc.TableEditor.prototype.EditorAddToInput = function (str, prefix) { - return SocialCalc.EditorAddToInput(this, str, prefix); - }; - SocialCalc.TableEditor.prototype.DisplayCellContents = function () { - return SocialCalc.EditorDisplayCellContents(this); - }; - SocialCalc.TableEditor.prototype.EditorSaveEdit = function (text) { - return SocialCalc.EditorSaveEdit(this, text); - }; - SocialCalc.TableEditor.prototype.EditorApplySetCommandsToRange = function ( - cmdline, - type - ) { - return SocialCalc.EditorApplySetCommandsToRange(this, cmdline, type); - }; - - SocialCalc.TableEditor.prototype.MoveECellWithKey = function (ch) { - return SocialCalc.MoveECellWithKey(this, ch); - }; - SocialCalc.TableEditor.prototype.MoveECell = function (newcell) { - return SocialCalc.MoveECell(this, newcell); - }; - SocialCalc.TableEditor.prototype.ReplaceCell = function (cell, row, col) { - SocialCalc.ReplaceCell(this, cell, row, col); - }; - SocialCalc.TableEditor.prototype.UpdateCellCSS = function (cell, row, col) { - SocialCalc.UpdateCellCSS(this, cell, row, col); - }; - SocialCalc.TableEditor.prototype.SetECellHeaders = function (selected) { - SocialCalc.SetECellHeaders(this, selected); - }; - SocialCalc.TableEditor.prototype.EnsureECellVisible = function () { - SocialCalc.EnsureECellVisible(this); - }; - SocialCalc.TableEditor.prototype.RangeAnchor = function (coord) { - SocialCalc.RangeAnchor(this, coord); - }; - SocialCalc.TableEditor.prototype.RangeExtend = function (coord) { - SocialCalc.RangeExtend(this, coord); - }; - SocialCalc.TableEditor.prototype.RangeRemove = function () { - SocialCalc.RangeRemove(this); - }; - SocialCalc.TableEditor.prototype.Range2Remove = function () { - SocialCalc.Range2Remove(this); - }; - - SocialCalc.TableEditor.prototype.FitToEditTable = function () { - SocialCalc.FitToEditTable(this); - }; - SocialCalc.TableEditor.prototype.CalculateEditorPositions = function () { - SocialCalc.CalculateEditorPositions(this); - }; - SocialCalc.TableEditor.prototype.ScheduleRender = function () { - SocialCalc.ScheduleRender(this); - }; - SocialCalc.TableEditor.prototype.DoRenderStep = function () { - SocialCalc.DoRenderStep(this); - }; - SocialCalc.TableEditor.prototype.SchedulePositionCalculations = function () { - SocialCalc.SchedulePositionCalculations(this); - }; - SocialCalc.TableEditor.prototype.DoPositionCalculations = function () { - SocialCalc.DoPositionCalculations(this); - }; - SocialCalc.TableEditor.prototype.CalculateRowPositions = function ( - panenum, - positions, - sizes - ) { - return SocialCalc.CalculateRowPositions(this, panenum, positions, sizes); - }; - SocialCalc.TableEditor.prototype.CalculateColPositions = function ( - panenum, - positions, - sizes - ) { - return SocialCalc.CalculateColPositions(this, panenum, positions, sizes); - }; - - SocialCalc.TableEditor.prototype.ScrollRelative = function ( - vertical, - amount - ) { - SocialCalc.ScrollRelative(this, vertical, amount); - }; - SocialCalc.TableEditor.prototype.ScrollRelativeBoth = function ( - vamount, - hamount - ) { - SocialCalc.ScrollRelativeBoth(this, vamount, hamount); - }; - SocialCalc.TableEditor.prototype.PageRelative = function ( - vertical, - direction - ) { - SocialCalc.PageRelative(this, vertical, direction); - }; - SocialCalc.TableEditor.prototype.LimitLastPanes = function () { - SocialCalc.LimitLastPanes(this); - }; - - SocialCalc.TableEditor.prototype.ScrollTableUpOneRow = function () { - return SocialCalc.ScrollTableUpOneRow(this); - }; - SocialCalc.TableEditor.prototype.ScrollTableDownOneRow = function () { - return SocialCalc.ScrollTableDownOneRow(this); - }; - SocialCalc.TableEditor.prototype.ScrollTableLeftOneCol = function () { - return SocialCalc.ScrollTableLeftOneCol(this); - }; - SocialCalc.TableEditor.prototype.ScrollTableRightOneCol = function () { - return SocialCalc.ScrollTableRightOneCol(this); - }; - - //contact prototype - SocialCalc.TableEditor.prototype.EditorChangecontact = function ( - text, - name, - phone, - email, - street, - city, - company, - val - ) { - return SocialCalc.EditorChangecontact( - this, - text, - name, - phone, - email, - street, - city, - company, - val - ); - }; - SocialCalc.TableEditor.prototype.EditorChangecolorFromWidget = function ( - text - ) { - return SocialCalc.EditorChangecolorFromWidget(this, text); - }; - SocialCalc.TableEditor.prototype.EditorChangeSheetcolor = function (text) { - return SocialCalc.EditorChangeSheetcolor(this, text); - }; - - SocialCalc.TableEditor.prototype.EditorChangefontFromWidget = function ( - text - ) { - return SocialCalc.EditorChangefontFromWidget(this, text); - }; - SocialCalc.TableEditor.prototype.EditorChangeSheetfont = function (text) { - return SocialCalc.EditorChangeSheetfont(this, text); - }; - SocialCalc.TableEditor.prototype.EditorCut = function (text, no_of_cells) { - return SocialCalc.EditorCut(this, text, no_of_cells); - }; - SocialCalc.TableEditor.prototype.EditorClearSheet = function ( - text, - cell_to_clear - ) { - return SocialCalc.EditorClearSheet(this, text, cell_to_clear); - }; - - // Functions: - - SocialCalc.CreateTableEditor = function (editor, width, height) { - var scc = SocialCalc.Constants; - var AssignID = SocialCalc.AssignID; - - editor.toplevel = document.createElement("div"); - editor.width = width; - editor.height = height; - - editor.griddiv = document.createElement("div"); - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width = editor.tablewidth + "px"; - editor.griddiv.style.height = editor.tableheight + "px"; - editor.griddiv.style.overflow = "hidden"; - editor.griddiv.style.cursor = "default"; - if (scc.cteGriddivClass) editor.griddiv.className = scc.cteGriddivClass; - AssignID(editor, editor.griddiv, "griddiv"); - - editor.FitToEditTable(); - - editor.EditorRenderSheet(); - - editor.griddiv.appendChild(editor.fullgrid); - - editor.verticaltablecontrol = new SocialCalc.TableControl( - editor, - true, - editor.tableheight - ); - editor.verticaltablecontrol.CreateTableControl(); - AssignID(editor, editor.verticaltablecontrol.main, "tablecontrolv"); - - editor.horizontaltablecontrol = new SocialCalc.TableControl( - editor, - false, - editor.tablewidth - ); - editor.horizontaltablecontrol.CreateTableControl(); - AssignID(editor, editor.horizontaltablecontrol.main, "tablecontrolh"); - - var table, tbody, tr, td, img, anchor, ta, ha; - - table = document.createElement("table"); - editor.layouttable = table; - table.cellSpacing = 0; - table.cellPadding = 0; - AssignID(editor, table, "layouttable"); - - tbody = document.createElement("tbody"); - table.appendChild(tbody); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - td.appendChild(editor.griddiv); - tr.appendChild(td); - td = document.createElement("td"); - //td.appendChild(editor.verticaltablecontrol.main); - tr.appendChild(td); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - //td.appendChild(editor.horizontaltablecontrol.main); - tr.appendChild(td); - - td = document.createElement("td"); // logo display: Required by CPAL License for this code! - //td.style.background="url("+editor.imageprefix+"logo.gif) no-repeat center center"; - td.innerHTML = - "
"; - tr.appendChild(td); - editor.logo = td; - AssignID(editor, editor.logo, "logo"); - SocialCalc.TooltipRegister(td.firstChild.firstChild, "SocialCalc", null); - - editor.toplevel.appendChild(editor.layouttable); - - if (!editor.noEdit) { - editor.inputEcho = new SocialCalc.InputEcho(editor); - AssignID(editor, editor.inputEcho.main, "inputecho"); - } - - editor.cellhandles = new SocialCalc.CellHandles(editor); - - ta = document.createElement("textarea"); // used for ctrl-c/ctrl-v where an invisible text area is needed - SocialCalc.setStyles( - ta, - "display:none;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);" - ); - ta.value = ""; - editor.pasteTextarea = ta; - AssignID(editor, editor.pasteTextarea, "pastetextarea"); - - if ( - navigator.userAgent.match(/Safari\//) && - !navigator.userAgent.match(/Chrome\//) - ) { - // special code for Safari 5 change - window.removeEventListener( - "beforepaste", - SocialCalc.SafariPasteFunction, - false - ); - window.addEventListener( - "beforepaste", - SocialCalc.SafariPasteFunction, - false - ); - window.removeEventListener( - "beforecopy", - SocialCalc.SafariPasteFunction, - false - ); - window.addEventListener( - "beforecopy", - SocialCalc.SafariPasteFunction, - false - ); - window.removeEventListener( - "beforecut", - SocialCalc.SafariPasteFunction, - false - ); - window.addEventListener( - "beforecut", - SocialCalc.SafariPasteFunction, - false - ); - } - - editor.toplevel.appendChild(editor.pasteTextarea); - - var div = document.createElement("div"); - div.innerHTML = "
"; - if (div.firstChild.nodeType == 1) { - /* We are running in IE -- Using HTML-based area for Ctrl-V */ - ha = document.createElement("div"); // used for ctrl-v where an invisible html area is needed - editor.pasteHTMLarea = ha; - editor.toplevel.appendChild(editor.pasteHTMLarea); - ha.contentEditable = true; - AssignID(editor, editor.pasteHTMLarea, "pastehtmlarea"); - SocialCalc.setStyles( - ha, - "display:block;visibility:hidden;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);overflow:hidden" - ); - } - - SocialCalc.MouseWheelRegister(editor.toplevel, { - WheelMove: SocialCalc.EditorProcessMouseWheel, - editor: editor, - }); - - if (SocialCalc.HasTouch) { - SocialCalc.TouchRegister(editor.toplevel, { - Swipe: SocialCalc.EditorProcessSwipe, - DoubleTap: SocialCalc.EditorProcessDoubleTap, - SingleTap: SocialCalc.EditorProcessSingleTap, - editor: editor, - }); - } - - if (editor.inputBox) { - // this seems to fix an obscure bug with Firefox 2 Mac where Ctrl-V doesn't get fired right - if (editor.inputBox.element) { - editor.inputBox.element.focus(); - editor.inputBox.element.blur(); - } - } - SocialCalc.KeyboardSetFocus(editor); - - // do status reporting things - - SocialCalc.EditorSheetStatusCallback(null, "startup", null, editor); - - // done - - return editor.toplevel; - }; - - // Special code needed for change that occurred with Safari 5 that made paste not work for some reason - - SocialCalc.SafariPasteFunction = function (e) { - e.preventDefault(); - }; - - // - // SocialCalc.ResizeTableEditor(editor, width, height) - // - // Move things around as appropriate and resize - // - - SocialCalc.ResizeTableEditor = function (editor, width, height) { - var scc = SocialCalc.Constants; - - editor.width = width; - editor.height = height; - - editor.toplevel.style.width = width + "px"; - editor.toplevel.style.height = height + "px"; - - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width = editor.tablewidth + "px"; - editor.griddiv.style.height = editor.tableheight + "px"; - - editor.verticaltablecontrol.main.style.height = editor.tableheight + "px"; - editor.horizontaltablecontrol.main.style.width = editor.tablewidth + "px"; - - editor.FitToEditTable(); - - editor.ScheduleRender(); - - return; - }; - - // - // str = SaveEditorSettings(editor) - // - // Returns a string representation of the pane settings, etc. - // - // The format is: - // - // version:1.0 - // rowpane:panenumber:firstnum:lastnum - // colpane:panenumber:firstnum:lastnum - // ecell:coord -- if set - // range:anchorcoord:top:bottom:left:right -- if set - // - // You can add additional values to be saved by using editor.SettingsCallbacks: - // - // editor.SettingsCallbacks["item-name"] = {save: savefunction, load: loadfunction} - // - // where savefunction(editor, "item-name") returns a string with the new lines to be added to the saved settings - // which include the trailing newlines, and loadfunction(editor, "item-name", line, flags) is given the line to process - // without the trailing newlines. - // - - SocialCalc.SaveEditorSettings = function (editor) { - var i, setting; - var context = editor.context; - var range = editor.range; - var result = ""; - - result += "version:1.0\n"; - - for (i = 0; i < context.rowpanes.length; i++) { - result += - "rowpane:" + - i + - ":" + - context.rowpanes[i].first + - ":" + - context.rowpanes[i].last + - "\n"; - } - for (i = 0; i < context.colpanes.length; i++) { - result += - "colpane:" + - i + - ":" + - context.colpanes[i].first + - ":" + - context.colpanes[i].last + - "\n"; - } - - if (editor.ecell) { - result += "ecell:" + editor.ecell.coord + "\n"; - } - - if (range.hasrange) { - result += - "range:" + - range.anchorcoord + - ":" + - range.top + - ":" + - range.bottom + - ":" + - range.left + - ":" + - range.right + - "\n"; - } - - for (setting in editor.SettingsCallbacks) { - result += editor.SettingsCallbacks[setting].save(editor, setting); - } - - return result; - }; - - // - // LoadEditorSettings(editor, str, flags) - // - // Sets the editor settings based on str. See SocialCalc.SaveEditorSettings for more details. - // Unrecognized lines are ignored. - // - - SocialCalc.LoadEditorSettings = function (editor, str, flags) { - var lines = str.split(/\r\n|\n/); - var parts = []; - var line, i, cr, row, col, coord, setting; - var context = editor.context; - var highlights, range; - - context.rowpanes = [{ first: 1, last: 1 }]; // reset to start - context.colpanes = [{ first: 1, last: 1 }]; - editor.ecell = null; - editor.range = { hasrange: false }; - editor.range2 = { hasrange: false }; - range = editor.range; - context.highlights = {}; - highlights = context.highlights; - - for (i = 0; i < lines.length; i++) { - line = lines[i]; - parts = line.split(":"); - setting = parts[0]; - switch (setting) { - case "version": - break; - - case "rowpane": - context.rowpanes[parts[1] - 0] = { - first: parts[2] - 0, - last: parts[3] - 0, - }; - break; - - case "colpane": - context.colpanes[parts[1] - 0] = { - first: parts[2] - 0, - last: parts[3] - 0, - }; - break; - - case "ecell": - editor.ecell = SocialCalc.coordToCr(parts[1]); - editor.ecell.coord = parts[1]; - highlights[parts[1]] = "cursor"; - break; - - case "range": - range.hasrange = true; - range.anchorcoord = parts[1]; - cr = SocialCalc.coordToCr(range.anchorcoord); - range.anchorrow = cr.row; - range.anchorcol = cr.col; - range.top = parts[2] - 0; - range.bottom = parts[3] - 0; - range.left = parts[4] - 0; - range.right = parts[5] - 0; - for (row = range.top; row <= range.bottom; row++) { - for (col = range.left; col <= range.right; col++) { - coord = SocialCalc.crToCoord(col, row); - if (highlights[coord] != "cursor") { - highlights[coord] = "range"; - } - } - } - break; - - default: - if (editor.SettingsCallbacks[setting]) { - editor.SettingsCallbacks[setting].load( - editor, - setting, - line, - flags - ); - } - break; - } - } - - return; - }; - - // - // EditorRenderSheet(editor) - // - // Renders the sheet and updates editor.fullgrid. - // Sets event handlers. - // - - SocialCalc.EditorRenderSheet = function (editor) { - editor.EditorMouseUnregister(); - - editor.fullgrid = editor.context.RenderSheet(editor.fullgrid); - - if (editor.ecell) editor.SetECellHeaders("selected"); - - SocialCalc.AssignID(editor, editor.fullgrid, "fullgrid"); // give it an id - - editor.EditorMouseRegister(); - }; - - // - // EditorScheduleSheetCommands(editor, cmdstr, saveundo, ignorebusy) - // - - SocialCalc.EditorScheduleSheetCommands = function ( - editor, - cmdstr, - saveundo, - ignorebusy - ) { - if (editor.state != "start" && !ignorebusy) { - // ignore commands if editing a cell - return; - } - - if (editor.busy && !ignorebusy) { - // hold off on commands if doing one - editor.deferredCommands.push({ cmdstr: cmdstr, saveundo: saveundo }); - return; - } - - switch (cmdstr) { - case "recalc": - case "redisplay": - editor.context.sheetobj.ScheduleSheetCommands(cmdstr, false); - break; - - case "undo": - editor.SheetUndo(); - break; - - case "redo": - editor.SheetRedo(); - break; - - default: - editor.context.sheetobj.ScheduleSheetCommands(cmdstr, saveundo); - break; - } - }; - - // - // EditorSheetStatusCallback(recalcdata, status, arg, editor) - // - // Called during recalc, executing commands, etc. - // - - SocialCalc.EditorSheetStatusCallback = function ( - recalcdata, - status, - arg, - editor - ) { - var f, cell, dcmd; - var sheetobj = editor.context.sheetobj; - var cr; - - var signalstatus = function (s) { - for (f in editor.StatusCallback) { - if (editor.StatusCallback[f].func) { - editor.StatusCallback[f].func( - editor, - s, - arg, - editor.StatusCallback[f].params - ); - } - } - }; - - switch (status) { - case "startup": - break; - - case "cmdstart": - editor.busy = true; - sheetobj.celldisplayneeded = ""; - break; - - case "cmdextension": - break; - - case "cmdend": - signalstatus(status); - - if (sheetobj.changedrendervalues) { - editor.context.PrecomputeSheetFontsAndLayouts(); - editor.context.CalculateCellSkipData(); - sheetobj.changedrendervalues = false; - } - - if (sheetobj.celldisplayneeded && !sheetobj.renderneeded) { - cr = SocialCalc.coordToCr(sheetobj.celldisplayneeded); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.ReplaceCell(cell, cr.row, cr.col); - } - - if (editor.deferredCommands.length) { - dcmd = editor.deferredCommands.shift(); - editor.EditorScheduleSheetCommands(dcmd.cmdstr, dcmd.saveundo, true); - return; - } - - if ( - sheetobj.attribs.needsrecalc && - (sheetobj.attribs.recalc != "off" || sheetobj.recalconce) && - editor.recalcFunction - ) { - editor.FitToEditTable(); - sheetobj.renderneeded = false; // recalc will force a render - if (sheetobj.recalconce) delete sheetobj.recalconce; // only do once - editor.recalcFunction(editor); - } else { - if (sheetobj.renderneeded) { - editor.FitToEditTable(); - sheetobj.renderneeded = false; - editor.ScheduleRender(); - } else { - editor.SchedulePositionCalculations(); // just in case command changed positions - // editor.busy = false; - // signalstatus("cmdendnorender"); - } - } - return; - - case "calcstart": - editor.busy = true; - break; - - case "calccheckdone": - case "calcorder": - case "calcstep": - case "calcloading": - case "calcserverfunc": - break; - - case "calcfinished": - signalstatus(status); - editor.ScheduleRender(); - return; - - case "schedrender": - editor.busy = true; // in case got here without cmd or recalc - break; - - case "renderdone": - break; - - case "schedposcalc": - editor.busy = true; // in case got here without cmd or recalc - break; - - case "doneposcalc": - if (editor.deferredCommands.length) { - signalstatus(status); - dcmd = editor.deferredCommands.shift(); - editor.EditorScheduleSheetCommands(dcmd.cmdstr, dcmd.saveundo, true); - } else { - editor.busy = false; - signalstatus(status); - if (editor.state == "start") editor.DisplayCellContents(); // make sure up to date - } - return; - - default: - addmsg("Unknown status: " + status); - break; - } - - signalstatus(status); - - return; - }; - - // Timer-driven steps for use with SocialCalc.EditorSheetStatusCallback - - SocialCalc.EditorStepInfo = { - // status: "", // saved value to pass to callback - editor: null, // for callback - // arg: null, // for callback - // timerobj: null - }; - - /* - SocialCalc.EditorStepSet = function(editor, status, arg) { - var esi = SocialCalc.EditorStepInfo; - addmsg("step: "+status); - if (esi.timerobj) { - alert("Already waiting. Old/new: "+esi.status+"/"+status); - } - esi.editor = editor; - esi.status = status; - esi.timerobj = window.setTimeout(SocialCalc.EditorStepDone, 1); - } - - SocialCalc.EditorStepDone = function() { - var esi = SocialCalc.EditorStepInfo; - esi.timerobj = null; - SocialCalc.EditorSheetStatusCallback(null, esi.status, null, esi.editor); - } - */ - - // - // str = SocialCalc.EditorGetStatuslineString(editor, status, arg, params) - // - // Assumes params is an object where it can use "calculating" and "command" - // to keep track of state. - // Returns string for status line. - // - - SocialCalc.EditorGetStatuslineString = function ( - editor, - status, - arg, - params - ) { - var scc = SocialCalc.Constants; - - var sstr, progress, coord, circ, r, c, cell, sum, ele; - - progress = ""; - - switch (status) { - case "moveecell": - case "rangechange": - case "startup": - break; - case "cmdstart": - params.command = true; - document.body.style.cursor = "progress"; - editor.griddiv.style.cursor = "progress"; - progress = scc.s_statusline_executing; - break; - case "cmdextension": - progress = "Command Extension: " + arg; - break; - case "cmdend": - params.command = false; - break; - case "schedrender": - progress = scc.s_statusline_displaying; - break; - case "renderdone": - progress = " "; - break; - case "schedposcalc": - progress = scc.s_statusline_displaying; - break; - case "cmdendnorender": - case "doneposcalc": - document.body.style.cursor = "default"; - editor.griddiv.style.cursor = "default"; - break; - case "calcorder": - progress = - scc.s_statusline_ordering + - Math.floor((100 * arg.count) / (arg.total || 1)) + - "%"; - break; - case "calcstep": - progress = - scc.s_statusline_calculating + - Math.floor((100 * arg.count) / (arg.total || 1)) + - "%"; - break; - case "calcloading": - progress = scc.s_statusline_calculatingls + ": " + arg.sheetname; - break; - case "calcserverfunc": - progress = - scc.s_statusline_calculating + - Math.floor((100 * arg.count) / (arg.total || 1)) + - "%, " + - scc.s_statusline_doingserverfunc + - arg.funcname + - scc.s_statusline_incell + - arg.coord; - break; - case "calcstart": - params.calculating = true; - document.body.style.cursor = "progress"; - editor.griddiv.style.cursor = "progress"; // griddiv has an explicit cursor style - progress = scc.s_statusline_calcstart; - break; - case "calccheckdone": - break; - case "calcfinished": - params.calculating = false; - break; - default: - progress = status; - break; - } - - if (!progress && params.calculating) { - progress = scc.s_statusline_calculating; - } - - // if there is a range, calculate sum (not during busy times) - if ( - !params.calculating && - !params.command && - !progress && - editor.range.hasrange && - (editor.range.left != editor.range.right || - editor.range.top != editor.range.bottom) - ) { - sum = 0; - for (r = editor.range.top; r <= editor.range.bottom; r++) { - for (c = editor.range.left; c <= editor.range.right; c++) { - cell = editor.context.sheetobj.cells[SocialCalc.crToCoord(c, r)]; - if (!cell) continue; - if (cell.valuetype && cell.valuetype.charAt(0) == "n") { - sum += cell.datavalue - 0; - } - } - } - - sum = SocialCalc.FormatNumber.formatNumberWithFormat( - sum, - "[,]General", - "" - ); - - coord = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - progress = - coord + - " (" + - (editor.range.right - editor.range.left + 1) + - "x" + - (editor.range.bottom - editor.range.top + 1) + - ") " + - scc.s_statusline_sum + - "=" + - sum + - " " + - progress; - } - sstr = editor.ecell.coord + "   " + progress; - - if ( - !params.calculating && - editor.context.sheetobj.attribs.needsrecalc == "yes" - ) { - sstr += "   " + scc.s_statusline_recalcneeded; - } - - circ = editor.context.sheetobj.attribs.circularreferencecell; - if (circ) { - circ = circ.replace(/\|/, " referenced by "); - sstr += "   " + scc.s_statusline_circref + circ + "
"; - } - - return sstr; - }; - - // - // Mouse stuff - // - - SocialCalc.EditorMouseInfo = { - // The registeredElements array is used to identify editor grid in which the mouse is doing things. - - // One item for each active editor, each an object with: - // .element, .editor - - registeredElements: [], - - editor: null, // editor being processed (between mousedown and mouseup) - element: null, // element being processed - - ignore: false, // if true, mousedowns are ignored - - mousedowncoord: "", // coord where mouse went down for drag range - mouselastcoord: "", // coord where mouse last was during drag - mouseresizecol: "", // col being resized - mouseresizeclientx: null, // where resize started - mouseresizedisplay: null, // element tracking new size - }; - - // - // EditorMouseRegister(editor) - // - - SocialCalc.EditorMouseRegister = function (editor) { - var mouseinfo = SocialCalc.EditorMouseInfo; - var element = editor.fullgrid; - var i; - - for (i = 0; i < mouseinfo.registeredElements.length; i++) { - if (mouseinfo.registeredElements[i].editor == editor) { - if (mouseinfo.registeredElements[i].element == element) { - return; // already set - don't do it again - } - break; - } - } - - if (i < mouseinfo.registeredElements.length) { - mouseinfo.registeredElements[i].element = element; - } else { - mouseinfo.registeredElements.push({ element: element, editor: editor }); - } - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener( - "mousedown", - SocialCalc.ProcessEditorMouseDown, - false - ); - element.addEventListener( - "dblclick", - SocialCalc.ProcessEditorDblClick, - false - ); - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousedown", SocialCalc.ProcessEditorMouseDown); - element.attachEvent("ondblclick", SocialCalc.ProcessEditorDblClick); - } else { - // don't handle this - throw "Browser not supported"; - } - - mouseinfo.ignore = false; // just in case - - return; - }; - - // - // EditorMouseUnregister(editor) - // - - SocialCalc.EditorMouseUnregister = function (editor) { - var mouseinfo = SocialCalc.EditorMouseInfo; - var element = editor.fullgrid; - var i, oldelement; - - for (i = 0; i < mouseinfo.registeredElements.length; i++) { - if (mouseinfo.registeredElements[i].editor == editor) { - break; - } - } - - if (i < mouseinfo.registeredElements.length) { - oldelement = mouseinfo.registeredElements[i].element; // remove old handlers - if (oldelement.removeEventListener) { - // DOM Level 2 - oldelement.removeEventListener( - "mousedown", - SocialCalc.ProcessEditorMouseDown, - false - ); - oldelement.removeEventListener( - "dblclick", - SocialCalc.ProcessEditorDblClick, - false - ); - } else if (oldelement.detachEvent) { - // IE - oldelement.detachEvent( - "onmousedown", - SocialCalc.ProcessEditorMouseDown - ); - oldelement.detachEvent("ondblclick", SocialCalc.ProcessEditorDblClick); - } - mouseinfo.registeredElements.splice(i, 1); - } - - return; - }; - - SocialCalc.ProcessEditorMouseDown = function (e) { - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var mobj; - - if (mouseinfo.ignore) return; // ignore this - - for (mobj = null; !mobj && ele; ele = ele.parentNode) { - // go up tree looking for one of our elements - mobj = SocialCalc.LookupElement(ele, mouseinfo.registeredElements); - } - if (!mobj) { - mouseinfo.editor = null; - return; // not one of our elements - } - - editor = mobj.editor; - mouseinfo.element = ele; - range = editor.range; - result = SocialCalc.GridMousePosition(editor, clientX, clientY); - - if (!result || result.rowheader) return; // not on a cell or col header - mouseinfo.editor = editor; // remember for later - - if (result.colheader && result.coltoresize) { - // col header - do drag resize - SocialCalc.ProcessEditorColsizeMouseDown(e, ele, result); - return; - } - - if (!result.coord) return; // not us - - if (!range.hasrange) { - if (e.shiftKey) editor.RangeAnchor(); - } - - SocialCalc.Callbacks.ToggleCell(result.coord); - coord = editor.MoveECell(result.coord); - - if (range.hasrange) { - if (e.shiftKey) editor.RangeExtend(); - else editor.RangeRemove(); - } - - mouseinfo.mousedowncoord = coord; // remember if starting drag range select - mouseinfo.mouselastcoord = coord; - - editor.EditorMouseRange(coord); - - SocialCalc.KeyboardSetFocus(editor); - if (editor.state != "start" && editor.inputBox) - editor.inputBox.element.focus(); - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.ProcessEditorMouseMove, - true - ); // capture everywhere - document.addEventListener( - "mouseup", - SocialCalc.ProcessEditorMouseUp, - true - ); // capture everywhere - } else if (ele.attachEvent) { - // IE 5+ - ele.setCapture(); - ele.attachEvent("onmousemove", SocialCalc.ProcessEditorMouseMove); - ele.attachEvent("onmouseup", SocialCalc.ProcessEditorMouseUp); - ele.attachEvent("onlosecapture", SocialCalc.ProcessEditorMouseUp); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.EditorMouseRange = function (editor, coord) { - var inputtext, wval; - var range = editor.range; - - switch ( - editor.state // editing a cell - shouldn't get here if no inputBox - ) { - case "input": - inputtext = editor.inputBox.GetText(); - wval = editor.workingvalues; - if ( - ("(+-*/,:!&<>=^".indexOf(inputtext.slice(-1)) >= 0 && - inputtext.slice(0, 1) == "=") || - inputtext == "=" - ) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { - // if in pointing operation - if (coord) { - if (range.hasrange) { - var sheetpref = - wval.currentsheet == wval.startsheet - ? "" - : wval.currentsheet + "!"; - editor.inputBox.SetText( - wval.partialexpr + - sheetpref + - SocialCalc.crToCoord(range.left, range.top) + - ":" + - sheetpref + - SocialCalc.crToCoord(range.right, range.bottom) - ); - } else { - var sheetpref = - wval.currentsheet == wval.startsheet - ? "" - : wval.currentsheet + "!"; - editor.inputBox.SetText(wval.partialexpr + sheetpref + coord); - } - } - } else { - // not in point -- done editing - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - } - break; - - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - break; - } - }; - - SocialCalc.ProcessEditorMouseMove = function (e) { - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat(editor, result); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - if (result.coord != mouseinfo.mouselastcoord) { - if (!e.shiftKey && !editor.range.hasrange) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - } - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - mouseinfo.mouselastcoord = result.coord; - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.ProcessEditorMouseUp = function (e) { - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result) return; - - if (!result.coord) result.coord = editor.ecell.coord; - - if (editor.range.hasrange) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } else if (result.coord && result.coord != mouseinfo.mousedowncoord) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener( - "mousemove", - SocialCalc.ProcessEditorMouseMove, - true - ); - document.removeEventListener( - "mouseup", - SocialCalc.ProcessEditorMouseUp, - true - ); - } else if (element.detachEvent) { - // IE - element.detachEvent("onlosecapture", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmouseup", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmousemove", SocialCalc.ProcessEditorMouseMove); - element.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - }; - - SocialCalc.ProcessEditorColsizeMouseDown = function (e, ele, result) { - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - mouseinfo.mouseresizecolnum = result.coltoresize; // remember col being resized - mouseinfo.mouseresizecol = SocialCalc.rcColname(result.coltoresize); - mouseinfo.mousedownclientx = clientX; - - var sizedisplay = document.createElement("div"); - mouseinfo.mouseresizedisplay = sizedisplay; - sizedisplay.style.width = "auto"; - sizedisplay.style.position = "absolute"; - sizedisplay.style.zIndex = 100; - sizedisplay.style.top = editor.headposition.top + 0 + "px"; - sizedisplay.style.left = editor.colpositions[result.coltoresize] + "px"; - sizedisplay.innerHTML = - '' + - '
 
' + - editor.context.colwidth[mouseinfo.mouseresizecolnum] + - "
"; - SocialCalc.setStyles( - sizedisplay.firstChild.lastChild.firstChild.childNodes[0], - "filter:alpha(opacity=85);opacity:.85;" - ); // so no warning msg with Firefox about filter - - editor.toplevel.appendChild(sizedisplay); - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.ProcessEditorColsizeMouseMove, - true - ); // capture everywhere - document.addEventListener( - "mouseup", - SocialCalc.ProcessEditorColsizeMouseUp, - true - ); // capture everywhere - } else if (editor.toplevel.attachEvent) { - // IE 5+ - editor.toplevel.setCapture(); - editor.toplevel.attachEvent( - "onmousemove", - SocialCalc.ProcessEditorColsizeMouseMove - ); - editor.toplevel.attachEvent( - "onmouseup", - SocialCalc.ProcessEditorColsizeMouseUp - ); - editor.toplevel.attachEvent( - "onlosecapture", - SocialCalc.ProcessEditorColsizeMouseUp - ); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.ProcessEditorColsizeMouseMove = function (e) { - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - var newsize = - editor.context.colwidth[mouseinfo.mouseresizecolnum] - - 0 + - (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) - newsize = SocialCalc.Constants.defaultMinimumColWidth; - - var sizedisplay = mouseinfo.mouseresizedisplay; - // sizedisplay.firstChild.lastChild.firstChild.childNodes[1].firstChild.innerHTML = newsize+""; - // sizedisplay.firstChild.lastChild.firstChild.childNodes[0].firstChild.style.width = (newsize-2)+"px"; - sizedisplay.innerHTML = - '' + - '
 
' + - newsize + - "
"; - SocialCalc.setStyles( - sizedisplay.firstChild.lastChild.firstChild.childNodes[0], - "filter:alpha(opacity=85);opacity:.85;" - ); // so no warning msg with Firefox about filter - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.ProcessEditorColsizeMouseUp = function (e) { - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - element = mouseinfo.element; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener( - "mousemove", - SocialCalc.ProcessEditorColsizeMouseMove, - true - ); - document.removeEventListener( - "mouseup", - SocialCalc.ProcessEditorColsizeMouseUp, - true - ); - } else if (editor.toplevel.detachEvent) { - // IE - editor.toplevel.detachEvent( - "onlosecapture", - SocialCalc.ProcessEditorColsizeMouseUp - ); - editor.toplevel.detachEvent( - "onmouseup", - SocialCalc.ProcessEditorColsizeMouseUp - ); - editor.toplevel.detachEvent( - "onmousemove", - SocialCalc.ProcessEditorColsizeMouseMove - ); - editor.toplevel.releaseCapture(); - } - - var newsize = - editor.context.colwidth[mouseinfo.mouseresizecolnum] - - 0 + - (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) - newsize = SocialCalc.Constants.defaultMinimumColWidth; - - editor.EditorScheduleSheetCommands( - "set " + mouseinfo.mouseresizecol + " width " + newsize, - true, - false - ); - - if (editor.timeout) window.clearTimeout(editor.timeout); - editor.timeout = window.setTimeout(SocialCalc.FinishColsize, 1); // wait - Firefox 2 has a bug otherwise with next mousedown - - return false; - }; - - SocialCalc.FinishColsize = function () { - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; - - editor.toplevel.removeChild(mouseinfo.mouseresizedisplay); - mouseinfo.mouseresizedisplay = null; - - // editor.FitToEditTable(); - // editor.EditorRenderSheet(); - // editor.SchedulePositionCalculations(); - - mouseinfo.editor = null; - - return; - }; - - // - // Handle auto-repeat of dragging the cursor into the borders of the sheet - // - - SocialCalc.AutoRepeatInfo = { - timer: null, // timer object for repeating - mouseinfo: null, // result from SocialCalc.GridMousePosition - repeatinterval: 1000, // milliseconds to wait between repeats - editor: null, // editor object to use when it repeats - repeatcallback: null, // used instead of default when repeating (e.g., for cellhandles) - // called as: repeatcallback(newcoord, direction) - }; - - // Control auto-repeat. If mouseinfo==null, cancel. - - SocialCalc.SetDragAutoRepeat = function (editor, mouseinfo, callback) { - var repeatinfo = SocialCalc.AutoRepeatInfo; - var coord, direction; - - repeatinfo.repeatcallback = callback; // null in regular case - - if (!mouseinfo) { - // cancel - if (repeatinfo.timer) { - // If was repeating, stop - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - repeatinfo.mouseinfo = null; - return; // done - } - - repeatinfo.editor = editor; - - if (repeatinfo.mouseinfo) { - // check for change while repeating - if (mouseinfo.rowheader || mouseinfo.rowfooter) { - if (mouseinfo.row != repeatinfo.mouseinfo.row) { - // changed row while dragging sidewards - coord = SocialCalc.crToCoord(editor.ecell.col, mouseinfo.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } else { - editor.MoveECell(coord); - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } else if (mouseinfo.colheader || mouseinfo.colfooter) { - if (mouseinfo.col != repeatinfo.mouseinfo.col) { - // changed col while dragging vertically - coord = SocialCalc.crToCoord(mouseinfo.col, editor.ecell.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } else { - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } - } - - repeatinfo.mouseinfo = mouseinfo; - - if (mouseinfo.distance < 5) repeatinfo.repeatinterval = 333; - else if (mouseinfo.distance < 10) repeatinfo.repeatinterval = 250; - else if (mouseinfo.distance < 25) repeatinfo.repeatinterval = 100; - else if (mouseinfo.distance < 35) repeatinfo.repeatinterval = 75; - else { - // too far - stop repeating - if (repeatinfo.timer) { - // if repeating, cancel it - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - return; - } - - if (!repeatinfo.timer) { - // start if not already running - repeatinfo.timer = window.setTimeout( - SocialCalc.DragAutoRepeat, - repeatinfo.repeatinterval - ); - } - - return; - }; - - // - // DragAutoRepeat() - // - - SocialCalc.DragAutoRepeat = function () { - var repeatinfo = SocialCalc.AutoRepeatInfo; - var mouseinfo = repeatinfo.mouseinfo; - - var direction, coord, cr; - - if (mouseinfo.rowheader) direction = "left"; - else if (mouseinfo.rowfooter) direction = "right"; - else if (mouseinfo.colheader) direction = "up"; - else if (mouseinfo.colfooter) direction = "down"; - - if (repeatinfo.repeatcallback) { - cr = SocialCalc.coordToCr(repeatinfo.editor.ecell.coord); - if (direction == "left" && cr.col > 1) cr.col--; - else if (direction == "right") cr.col++; - else if (direction == "up" && cr.row > 1) cr.row--; - else if (direction == "down") cr.row++; - coord = SocialCalc.crToCoord(cr.col, cr.row); - repeatinfo.repeatcallback(coord, direction); - } else { - coord = repeatinfo.editor.MoveECellWithKey("[a" + direction + "]shifted"); - if (coord) repeatinfo.editor.EditorMouseRange(coord); - } - - repeatinfo.timer = window.setTimeout( - SocialCalc.DragAutoRepeat, - repeatinfo.repeatinterval - ); - }; - - // - // Handling Clicking - // - - SocialCalc.ProcessEditorDblClick = function (e) { - var editor, result, coord, textarea, wval, range, sheetobj; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var mobj; - - if (mouseinfo.ignore) return; // ignore this - - for (mobj = null; !mobj && ele; ele = ele.parentNode) { - // go up tree looking for one of our elements - mobj = SocialCalc.LookupElement(ele, mouseinfo.registeredElements); - } - if (!mobj) { - mouseinfo.editor = null; - return; // not one of our elements - } - - editor = mobj.editor; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); - if (!result || !result.coord) return; // not within cell area - ignore - - mouseinfo.editor = editor; // remember for later - mouseinfo.element = ele; - range = editor.range; - - sheetobj = editor.context.sheetobj; - - switch (editor.state) { - case "start": - SocialCalc.EditorOpenCellEdit(editor); - break; - - case "input": - break; - - default: - break; - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.EditorOpenCellEdit = function (editor) { - var wval; - - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no input box, so no editing (happens on noEdit) - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - if (editor.inputBox.element.disabled) return true; // multi-line: ignore - if (editor.inputBox.element.style.display == "none") { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "editecell", - null, - editor.StatusCallback[f].params - ); - } - return true; // no inputBox display, so no editing - } - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - - editor.state = "inputboxdirect"; - - editor.inputBox.SetText(""); - editor.inputBox.DisplayCellContents(); - editor.inputBox.Select("end"); - wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - - return; - }; - - SocialCalc.EditorProcessKey = function (editor, ch, e) { - var result, cell, cellobj, valueinfo, fch, coord, inputtext, f; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - var range = editor.range; - - if (typeof ch != "string") ch = ""; - - switch (editor.state) { - case "start": - if (e.shiftKey && ch.substr(0, 2) == "[a") { - ch = ch + "shifted"; - } - if (ch == "[enter]") ch = "[adown]"; - if (ch == "[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if ( - ch.substr(0, 2) == "[a" || - ch.substr(0, 3) == "[pg" || - ch == "[home]" - ) { - result = editor.MoveECellWithKey(ch); - return !result; - } - if (ch == "[del]" || ch == "[backspace]") { - if (!editor.noEdit) { - editor.EditorApplySetCommandsToRange("empty", ""); - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - break; - } - if (ch == "[esc]") { - if (range.hasrange) { - editor.RangeRemove(); - editor.MoveECell(range.anchorcoord); - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "specialkey", - ch, - editor.StatusCallback[f].params - ); - } - } - return false; - } - - if (ch == "[f2]") { - if (editor.noEdit) return true; - SocialCalc.EditorOpenCellEdit(editor); - return false; - } - - if ((ch.length > 1 && ch.substr(0, 1) == "[") || ch.length == 0) { - // some control key - if (editor.ctrlkeyFunction && ch.length > 0) { - return editor.ctrlkeyFunction(editor, ch); - } else { - return true; - } - } - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no inputBox so no editing - if (editor.inputBox.element.style.display == "none") { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "editecell", - ch, - editor.StatusCallback[f].params - ); - } - return true; // no inputBox display, so no editing - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - editor.inputBox.element.disabled = false; // make sure editable - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - editor.inputBox.SetText(ch); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (editor.inputBox.skipOne) return false; // ignore a key already handled - if ( - ch == "[esc]" || - ch == "[enter]" || - ch == "[tab]" || - (ch && ch.substr(0, 2) == "[a") - ) { - if ( - ("(+-*/,:!&<>=^".indexOf(inputtext.slice(-1)) >= 0 && - inputtext.slice(0, 1) == "=") || - inputtext == "=" - ) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { - // if in pointing operation - if (e.shiftKey && ch.substr(0, 2) == "[a") { - ch = ch + "shifted"; - } - coord = editor.MoveECellWithKey(ch); - if (coord) { - if (range.hasrange) { - editor.inputBox.SetText( - wval.partialexpr + - SocialCalc.crToCoord(range.left, range.top) + - ":" + - SocialCalc.crToCoord(range.right, range.bottom) - ); - } else { - editor.inputBox.SetText(wval.partialexpr + coord); - } - return false; - } - } - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch != "[esc]") { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch == "[enter]") ch = "[adown]"; - if (ch == "[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0, 2) == "[a") { - editor.MoveECellWithKey(ch); - } - } else { - editor.inputBox.DisplayCellContents(); - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - break; - } - if (wval.partialexpr && ch == "[backspace]") { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - return false; - } - if (ch == "[f2]") return false; - if (range.hasrange) { - editor.RangeRemove(); - } - editor.MoveECell(wval.ecoord); - if (wval.partialexpr) { - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - wval.partialexpr = ""; // not pointing - } - return true; - - case "inputboxdirect": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (ch == "[esc]" || ch == "[enter]" || ch == "[tab]") { - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch == "[esc]") { - editor.inputBox.DisplayCellContents(); - } else { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch == "[enter]") ch = "[adown]"; - if (ch == "[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0, 2) == "[a") { - editor.MoveECellWithKey(ch); - } - } - break; - } - if (ch == "[f2]") return false; - return true; - - case "skip-and-start": - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - return false; - - default: - return true; - } - - return false; - }; - - SocialCalc.EditorAddToInput = function (editor, str, prefix) { - var wval = editor.workingvalues; - - if (editor.noEdit) return; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - switch (editor.state) { - case "start": - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.element.disabled = false; // make sure editable and overwrite old - editor.inputBox.Focus(); - editor.inputBox.SetText((prefix || "") + str); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.focus(); - if (wval.partialexpr) { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - editor.inputBox.SetText(editor.inputBox.GetText() + str); - break; - - default: - break; - } - }; - - SocialCalc.EditorDisplayCellContents = function (editor) { - if (editor.inputBox) editor.inputBox.DisplayCellContents(); - }; - var arr = []; - SocialCalc.EditorSaveEdit = function (editor, text) { - //console.log("editorSaveEdit"); - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - type = "text t"; - //changes for prompt - - value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord) + ""; - //console.log("old:"+oldvalue) - //console.log("new:"+value) - if (value == oldvalue) { - // no change - return; - } - if ("'" + value == oldvalue) { - return; - } - - fch = value.charAt(0); - if (fch == "=" && value.indexOf("\n") == -1) { - type = "formula"; - value = value.substring(1); - } else if (fch == "'") { - type = "text t"; - value = value.substring(1); - } else if (value.length == 0) { - type = "empty"; - } else { - valueinfo = SocialCalc.DetermineValueType(value); - if (valueinfo.type == "n" && value == valueinfo.value + "") { - // see if don't need "constant" - type = "value n"; - } else if (valueinfo.type.charAt(0) == "t") { - type = "text " + valueinfo.type; - } else if (valueinfo.type == "") { - type = "text t"; - } else { - type = "constant " + valueinfo.type + " " + valueinfo.value; - } - } - - if (type.charAt(0) == "t") { - // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - cmdline = "set " + wval.ecoord + " " + type + " " + value; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - }; - - // - // SocialCalc.EditorApplySetCommandsToRange(editor, cmd) - // - // Takes ecell or range and does a "set" command with cmd. - // - - SocialCalc.EditorApplySetCommandsToRange = function (editor, cmd) { - var cell, row, col, line, errortext; - - var sheetobj = editor.context.sheetobj; - var ecell = editor.ecell; - var range = editor.range; - - if (range.hasrange) { - coord = - SocialCalc.crToCoord(range.left, range.top) + - ":" + - SocialCalc.crToCoord(range.right, range.bottom); - line = "set " + coord + " " + cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } else { - line = "set " + ecell.coord + " " + cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } - - editor.DisplayCellContents(); - }; - - SocialCalc.EditorProcessMouseWheel = function ( - event, - delta, - mousewheelinfo, - wobj - ) { - if (wobj.functionobj.editor.busy) return; // ignore if busy - - if (delta > 0) { - wobj.functionobj.editor.ScrollRelative(true, -1); - } - if (delta < 0) { - wobj.functionobj.editor.ScrollRelative(true, +1); - } - }; - - // - // GridMousePosition(editor, clientX, clientY) - // - // Returns an object with row and col numbers and coord (spans handled for coords), - // and rowheader/colheader true if in header (where coord will be undefined). - // If in colheader, will return coltoresize if on appropriate place in col header. - // Also, there is rowfooter (on right) and colfooter (on bottom). - // In row/col header/footer, returns "distance" as pixels over the edge. - // - - SocialCalc.GridMousePosition = function (editor, clientX, clientY) { - var row, col, colpane; - var result = {}; - - for (row = 1; row < editor.rowpositions.length; row++) { - if (!editor.rowheight[row]) continue; // not rendered yet -- may be above or below us - if (editor.rowpositions[row] + editor.rowheight[row] > clientY) { - break; - } - } - for (col = 1; col < editor.colpositions.length; col++) { - if (!editor.colwidth[col]) continue; - if (editor.colpositions[col] + editor.colwidth[col] > clientX) { - break; - } - } - - result.row = row; - result.col = col; - - if (editor.headposition) { - if ( - clientX < editor.headposition.left && - clientX >= editor.gridposition.left - ) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } else if ( - clientY < editor.headposition.top && - clientY > editor.gridposition.top - ) { - // > because of sizing row - result.colheader = true; - result.distance = editor.headposition.top - clientY; - result.coltoresize = - col - - (editor.colpositions[col] + editor.colwidth[col] / 2 > clientX - ? 1 - : 0) || 1; - for (colpane = 0; colpane < editor.context.colpanes.length; colpane++) { - if ( - result.coltoresize >= editor.context.colpanes[colpane].first && - result.coltoresize <= editor.context.colpanes[colpane].last - ) { - // visible column - return result; - } - } - delete result.coltoresize; - return result; - } else if (clientX >= editor.verticaltablecontrol.controlborder) { - result.rowfooter = true; - result.distance = clientX - editor.verticaltablecontrol.controlborder; - return result; - } else if (clientY >= editor.horizontaltablecontrol.controlborder) { - result.colfooter = true; - result.distance = clientY - editor.horizontaltablecontrol.controlborder; - return result; - } else if (clientX < editor.gridposition.left) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } else if (clientY <= editor.gridposition.top) { - result.colheader = true; - result.distance = editor.headposition.top - clientY; - return result; - } else { - result.coord = SocialCalc.crToCoord(result.col, result.row); - if (editor.context.cellskip[result.coord]) { - // handle skipped cells - result.coord = editor.context.cellskip[result.coord]; - } - return result; - } - } - - return null; - }; - - // - // GetEditorCellElement(editor, row, col) - // - // Returns an object with element, the table cell element in the DOM that corresponds to row and column, - // as well as rowpane and colpane, the panes with the cell. - // If no such element, then returns null; - // - - SocialCalc.GetEditorCellElement = function (editor, row, col) { - var rowpane, colpane, c, coord; - var rowindex = 0; - var colindex = 0; - - for (rowpane = 0; rowpane < editor.context.rowpanes.length; rowpane++) { - if ( - row >= editor.context.rowpanes[rowpane].first && - row <= editor.context.rowpanes[rowpane].last - ) { - for (colpane = 0; colpane < editor.context.colpanes.length; colpane++) { - if ( - col >= editor.context.colpanes[colpane].first && - col <= editor.context.colpanes[colpane].last - ) { - rowindex += row - editor.context.rowpanes[rowpane].first + 2; - for (c = editor.context.colpanes[colpane].first; c <= col; c++) { - coord = editor.context.cellskip[SocialCalc.crToCoord(c, row)]; - if ( - !coord || - !editor.context.CoordInPane(coord, rowpane, colpane) - ) - // don't count col-spanned cells - colindex++; - } - return { - element: - editor.griddiv.firstChild.lastChild.childNodes[rowindex] - .childNodes[colindex], - rowpane: rowpane, - colpane: colpane, - }; - } - for ( - c = editor.context.colpanes[colpane].first; - c <= editor.context.colpanes[colpane].last; - c++ - ) { - coord = editor.context.cellskip[SocialCalc.crToCoord(c, row)]; - if (!coord || !editor.context.CoordInPane(coord, rowpane, colpane)) - // don't count col-spanned cells - colindex++; - } - colindex += 1; - } - } - rowindex += - editor.context.rowpanes[rowpane].last - - editor.context.rowpanes[rowpane].first + - 1 + - 1; - } - - return null; - }; - - // - // cellcoord = MoveECellWithKey(editor, ch) - // - // Processes an arrow key, etc., moving the edit cell. - // If not a movement key, returns null. - // - - SocialCalc.MoveECellWithKey = function (editor, ch) { - var coord, row, col, cell; - var shifted = false; - - if (!editor.ecell) { - return null; - } - - if (ch.slice(-7) == "shifted") { - ch = ch.slice(0, -7); - shifted = true; - } - - row = editor.ecell.row; - col = editor.ecell.col; - cell = editor.context.sheetobj.cells[editor.ecell.coord]; - - switch (ch) { - case "[adown]": - row += (cell && cell.rowspan) || 1; - break; - case "[aup]": - row--; - break; - case "[pgdn]": - row += editor.pageUpDnAmount - 1 + ((cell && cell.rowspan) || 1); - break; - case "[pgup]": - row -= editor.pageUpDnAmount; - break; - case "[aright]": - col += (cell && cell.colspan) || 1; - break; - case "[aleft]": - col--; - break; - case "[home]": - row = 1; - col = 1; - break; - default: - return null; - } - - if (!editor.range.hasrange) { - if (shifted) editor.RangeAnchor(); - } - - coord = editor.MoveECell(SocialCalc.crToCoord(col, row)); - - if (editor.range.hasrange) { - if (shifted) editor.RangeExtend(); - else editor.RangeRemove(); - } - - return coord; - }; - - // - // cellcoord = MoveECell(editor, newecell) - // - // Takes a coordinate and returns the new edit cell coordinate (which may be - // different if newecell is covered by a span). - // - - SocialCalc.MoveECell = function (editor, newcell) { - var cell, f; - - var highlights = editor.context.highlights; - - if (editor.ecell) { - //changes for prompt - if (editor.ecell.coord == newcell) return newcell; - - if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast("ecell", { - original: editor.ecell.coord, - ecell: newcell, - }); - } - - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - delete highlights[editor.ecell.coord]; - if ( - editor.range2.hasrange && - editor.ecell.row >= editor.range2.top && - editor.ecell.row <= editor.range2.bottom && - editor.ecell.col >= editor.range2.left && - editor.ecell.col <= editor.range2.right - ) { - highlights[editor.ecell.coord] = "range2"; - } - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders(""); // set to regular col/rowname styles - editor.cellhandles.ShowCellHandles(false); - } else if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast("ecell", { ecell: newcell }); - } - newcell = editor.context.cellskip[newcell] || newcell; - editor.ecell = SocialCalc.coordToCr(newcell); - editor.ecell.coord = newcell; - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - highlights[newcell] = "cursor"; - - for (f in editor.MoveECellCallback) { - // let others know - editor.MoveECellCallback[f](editor); - } - - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders("selected"); - - for (f in editor.StatusCallback) { - // let status line, etc., know - editor.StatusCallback[f].func( - editor, - "moveecell", - newcell, - editor.StatusCallback[f].params - ); - } - - if (editor.busy) { - editor.ensureecell = true; // wait for when not busy - } else { - editor.ensureecell = false; - editor.EnsureECellVisible(); - } - - return newcell; - }; - - SocialCalc.EnsureECellVisible = function (editor) { - var vamount = 0; - var hamount = 0; - - if (editor.ecell.row > editor.lastnonscrollingrow) { - if (editor.ecell.row < editor.firstscrollingrow) { - vamount = editor.ecell.row - editor.firstscrollingrow; - } else if (editor.ecell.row > editor.lastvisiblerow) { - vamount = editor.ecell.row - editor.lastvisiblerow; - } - } - if (editor.ecell.col > editor.lastnonscrollingcol) { - if (editor.ecell.col < editor.firstscrollingcol) { - hamount = editor.ecell.col - editor.firstscrollingcol; - } else if (editor.ecell.col > editor.lastvisiblecol) { - hamount = editor.ecell.col - editor.lastvisiblecol; - } - } - - if (vamount != 0 || hamount != 0) { - editor.ScrollRelativeBoth(vamount, hamount); - } else { - editor.cellhandles.ShowCellHandles(true); - } - }; - - SocialCalc.ReplaceCell = function (editor, cell, row, col) { - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell( - row, - col, - cell.rowpane, - cell.colpane, - true, - null - ); - if (newelement) { - // Don't use a real element and replaceChild, which seems to have focus issues with IE, Firefox, and speed issues - cell.element.innerHTML = newelement.innerHTML; - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a] != "cssText") - cell.element.style[a] = newelement.style[a]; - } - } - }; - - SocialCalc.UpdateCellCSS = function (editor, cell, row, col) { - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell( - row, - col, - cell.rowpane, - cell.colpane, - true, - null - ); - if (newelement) { - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a] != "cssText") - cell.element.style[a] = newelement.style[a]; - } - } - }; - - SocialCalc.SetECellHeaders = function (editor, selected) { - var ecell = editor.ecell; - var context = editor.context; - - var rowpane, colpane, first, last; - var rowindex = 0; - var colindex = 0; - var headercell; - - if (!ecell) return; - - for (rowpane = 0; rowpane < context.rowpanes.length; rowpane++) { - first = context.rowpanes[rowpane].first; - last = context.rowpanes[rowpane].last; - if (ecell.row >= first && ecell.row <= last) { - headercell = - editor.fullgrid.childNodes[1].childNodes[ - 2 + rowindex + ecell.row - first - ].childNodes[0]; - if (headercell) { - if (context.classnames) - headercell.className = context.classnames[selected + "rowname"]; - if (context.explicitStyles) - headercell.style.cssText = - context.explicitStyles[selected + "rowname"]; - headercell.style.verticalAlign = "top"; // to get around Safari making top of centered row number be - // considered top of row (and can't get position in Safari) - } - } - rowindex += last - first + 1 + 1; - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - first = context.colpanes[colpane].first; - last = context.colpanes[colpane].last; - if (ecell.col >= first && ecell.col <= last) { - headercell = - editor.fullgrid.childNodes[1].childNodes[1].childNodes[ - 1 + colindex + ecell.col - first - ]; - if (headercell) { - if (context.classnames) - headercell.className = context.classnames[selected + "colname"]; - if (context.explicitStyles) - headercell.style.cssText = - context.explicitStyles[selected + "colname"]; - } - } - colindex += last - first + 1 + 1; - } - }; - - // - // RangeAnchor(editor, ecoord) - // - // Sets the anchor of a range to ecoord (or ecell if missing). - // - - SocialCalc.RangeAnchor = function (editor, ecoord) { - if (editor.range.hasrange) { - editor.RangeRemove(); - } - - editor.RangeExtend(ecoord); - }; - - // - // RangeExtend(editor, ecoord) - // - // Sets the other corner of the range to ecoord or, if missing, ecell. - // - - SocialCalc.RangeExtend = function (editor, ecoord) { - var a, cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - var ecell; - if (ecoord) { - ecell = SocialCalc.coordToCr(ecoord); - ecell.coord = ecoord; - } else ecell = editor.ecell; - - if (!ecell) return; // just in case - if (SocialCalc.Constants.SCNoRanging) return; - - if (!range.hasrange) { - // called without RangeAnchor... - range.anchorcoord = ecell.coord; - range.anchorrow = ecell.row; - range.top = ecell.row; - range.bottom = ecell.row; - range.anchorcol = ecell.col; - range.left = ecell.col; - range.right = ecell.col; - range.hasrange = true; - } - - if (range.anchorrow < ecell.row) { - range.top = range.anchorrow; - range.bottom = ecell.row; - } else { - range.top = ecell.row; - range.bottom = range.anchorrow; - } - if (range.anchorcol < ecell.col) { - range.left = range.anchorcol; - range.right = ecell.col; - } else { - range.left = ecell.col; - range.right = range.anchorcol; - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - highlights[coord] = "unrange"; - break; - case "range2": - highlights[coord] = "unrange2"; - break; - } - } - - for (row = range.top; row <= range.bottom; row++) { - for (col = range.left; col <= range.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange": - highlights[coord] = "range"; - break; - case "cursor": - break; - case "unrange2": - default: - highlights[coord] = "newrange"; - break; - } - } - } - - for (row = range2.top; range2.hasrange && row <= range2.bottom; row++) { - for (col = range2.left; col <= range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange2": - highlights[coord] = "range2"; - break; - case "range": - case "newrange": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "unrange": - delete highlights[coord]; - break; - case "newrange": - highlights[coord] = "range"; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "range": - case "range2": - case "cursor": - continue; - } - - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - for (f in editor.RangeChangeCallback) { - // let others know - editor.RangeChangeCallback[f](editor); - } - - // create range/coord string and do status callback - - coord = SocialCalc.crToCoord(editor.range.left, editor.range.top); - if ( - editor.range.left != editor.range.right || - editor.range.top != editor.range.bottom - ) { - // more than one cell - coord += - ":" + SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "rangechange", - coord, - editor.StatusCallback[f].params - ); - } - - return; - }; - - // - // RangeRemove(editor) - // - // Turns off the range. - // - - SocialCalc.RangeRemove = function (editor) { - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - if (!range.hasrange && !range2.hasrange) return; - - for (row = range2.top; range2.hasrange && row <= range2.bottom; row++) { - for (col = range2.left; col <= range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "range": - highlights[coord] = "newrange2"; - break; - case "range2": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - delete highlights[coord]; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range.hasrange = false; - - for (f in editor.RangeChangeCallback) { - // let others know - editor.RangeChangeCallback[f](editor); - } - - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "rangechange", - "", - editor.StatusCallback[f].params - ); - } - - return; - }; - - // - // Range2Remove(editor) - // - // Turns off the range2. - // - - SocialCalc.Range2Remove = function (editor) { - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range2 = editor.range2; - - if (!range2.hasrange) return; - - for (coord in highlights) { - switch (highlights[coord]) { - case "range2": - delete highlights[coord]; - break; - case "range": - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range2.hasrange = false; - - return; - }; - - // - // FitToEditTable(editor) - // - // Figure out (through column width declarations and approximation of pixels per row) - // how many rendered rows and columns you need to be at least a little larger than - // the editor's editing area. - // - - SocialCalc.FitToEditTable = function (editor) { - var colnum, colname, colwidth, totalwidth, totalrows, rowpane, needed; - - var context = editor.context; - var sheetobj = context.sheetobj; - var sheetcolattribs = sheetobj.colattribs; - - // Calculate column width data - - totalwidth = context.showRCHeaders ? context.rownamewidth - 0 : 0; - for (var colpane = 0; colpane < context.colpanes.length - 1; colpane++) { - // Get width of all but last pane - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - colname = SocialCalc.rcColname(colnum); - colwidth = - sheetobj.colattribs.width[colname] || - sheetobj.attribs.defaultcolwidth || - SocialCalc.Constants.defaultColWidth; - if (colwidth == "blank" || colwidth == "auto") colwidth = ""; - totalwidth += colwidth && colwidth - 0 > 0 ? colwidth - 0 : 10; - } - } - - for (colnum = context.colpanes[colpane].first; colnum <= 10000; colnum++) { - //!!! max for safety, but makes that col max!!! - colname = SocialCalc.rcColname(colnum); - colwidth = - sheetobj.colattribs.width[colname] || - sheetobj.attribs.defaultcolwidth || - SocialCalc.Constants.defaultColWidth; - if (colwidth == "blank" || colwidth == "auto") colwidth = ""; - totalwidth += colwidth && colwidth - 0 > 0 ? colwidth - 0 : 10; - if (totalwidth > editor.tablewidth) break; - } - - context.colpanes[colpane].last = colnum; - - // Calculate row height data - - totalrows = context.showRCHeaders ? 1 : 0; - for (rowpane = 0; rowpane < context.rowpanes.length - 1; rowpane++) { - // count all panes but last one - totalrows += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 1; - } - - needed = editor.tableheight - totalrows * context.pixelsPerRow; // estimate amount needed - - context.rowpanes[rowpane].last = - context.rowpanes[rowpane].first + - Math.floor(needed / context.pixelsPerRow) + - 1; - }; - - // - // CalculateEditorPositions(editor) - // - // Calculate the screen positions and other values of various editing elements - // These values change and need to be recomputed when the pane first/last or cell contents change, - // as well as new column widths, etc. - // - // Note: Only call this after the grid has been rendered! You may have to wait for a timeout... - // - - SocialCalc.CalculateEditorPositions = function (editor) { - var rowpane, colpane, i; - - editor.gridposition = SocialCalc.GetElementPosition(editor.griddiv); - editor.headposition = SocialCalc.GetElementPosition( - editor.griddiv.firstChild.lastChild.childNodes[2].childNodes[1] - ); // 3rd tr 2nd td - - editor.rowpositions = []; - for (rowpane = 0; rowpane < editor.context.rowpanes.length; rowpane++) { - editor.CalculateRowPositions( - rowpane, - editor.rowpositions, - editor.rowheight - ); - } - for (i = 0; i < editor.rowpositions.length; i++) { - if (editor.rowpositions[i] > editor.gridposition.top + editor.tableheight) - break; - } - editor.lastvisiblerow = i - 1; - - editor.colpositions = []; - for (colpane = 0; colpane < editor.context.colpanes.length; colpane++) { - editor.CalculateColPositions( - colpane, - editor.colpositions, - editor.colwidth - ); - } - for (i = 0; i < editor.colpositions.length; i++) { - if (editor.colpositions[i] > editor.gridposition.left + editor.tablewidth) - break; - } - editor.lastvisiblecol = i - 1; - - editor.firstscrollingrow = - editor.context.rowpanes[editor.context.rowpanes.length - 1].first; - editor.firstscrollingrowtop = - editor.rowpositions[editor.firstscrollingrow] || editor.headposition.top; - editor.lastnonscrollingrow = - editor.context.rowpanes.length - 1 > 0 - ? editor.context.rowpanes[editor.context.rowpanes.length - 2].last - : 0; - editor.firstscrollingcol = - editor.context.colpanes[editor.context.colpanes.length - 1].first; - editor.firstscrollingcolleft = - editor.colpositions[editor.firstscrollingcol] || editor.headposition.left; - editor.lastnonscrollingcol = - editor.context.colpanes.length - 1 > 0 - ? editor.context.colpanes[editor.context.colpanes.length - 2].last - : 0; - - // Now do the table controls - - editor.verticaltablecontrol.ComputeTableControlPositions(); - editor.horizontaltablecontrol.ComputeTableControlPositions(); - }; - - // - // ScheduleRender(editor) - // - // Do a series of timeouts to render the sheet, wait for background layout and - // rendering by the browser, and then update editor visuals, sliders, etc. - // - - SocialCalc.ScheduleRender = function (editor) { - if (editor.timeout) window.clearTimeout(editor.timeout); // in case called more than once, just use latest - - SocialCalc.EditorSheetStatusCallback(null, "schedrender", null, editor); - SocialCalc.EditorStepInfo.editor = editor; - editor.timeout = window.setTimeout(SocialCalc.DoRenderStep, 1); - }; - - // DoRenderStep() - // - - SocialCalc.DoRenderStep = function () { - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - editor.EditorRenderSheet(); - - SocialCalc.EditorSheetStatusCallback(null, "renderdone", null, editor); - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - }; - - // - // SocialCalc.SchedulePositionCalculations(editor) - // - - SocialCalc.SchedulePositionCalculations = function (editor) { - SocialCalc.EditorStepInfo.editor = editor; - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - }; - - // DoPositionCalculations(editor) - // - // Update editor visuals, sliders, etc. - // - // Note: Only call this after the DOM objects have been modified and rendered! - // - - SocialCalc.DoPositionCalculations = function () { - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - var ok = false; - try { - editor.CalculateEditorPositions(); - ok = true; - } catch (e) {} - - if (!ok) { - if (typeof $ != "undefined") { - $(window).trigger("resize"); - setTimeout(SocialCalc.DoPositionCalculations, 400); - } - return; /* Workaround IE6 partial-initialized-DOM bug */ - } - - editor.verticaltablecontrol.PositionTableControlElements(); - editor.horizontaltablecontrol.PositionTableControlElements(); - - SocialCalc.EditorSheetStatusCallback(null, "doneposcalc", null, editor); - - if (editor.ensureecell && editor.ecell && !editor.deferredCommands.length) { - // don't do if deferred cmd to execute - editor.ensureecell = false; - editor.EnsureECellVisible(); // this could cause another redisplay - } - - editor.cellhandles.ShowCellHandles(true); - - //!!! Need to now check to see if this positioned controls out of the editing area - //!!! (such as when there is a large wrapped cell and it pushes the pane boundary too far down). - - if (SocialCalc.Callbacks.broadcast) - SocialCalc.Callbacks.broadcast("ask.ecell"); - }; - - SocialCalc.CalculateRowPositions = function ( - editor, - panenum, - positions, - sizes - ) { - var toprow, rowpane, rownum, offset, trowobj, cellposition; - - var context = editor.context; - var sheetobj = context.sheetobj; - - var tbodyobj; - - if (!context.showRCHeaders) throw "Needs showRCHeaders=true"; - - tbodyobj = editor.fullgrid.lastChild; - - // Calculate start of this pane as row in this table: - - toprow = 2; - for (rowpane = 0; rowpane < panenum; rowpane++) { - toprow += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 2; // skip pane and spacing row - } - - offset = 0; - for ( - rownum = context.rowpanes[rowpane].first; - rownum <= context.rowpanes[rowpane].last; - rownum++ - ) { - trowobj = tbodyobj.childNodes[toprow + offset]; - offset++; - cellposition = SocialCalc.GetElementPosition(trowobj.firstChild); - - // Safari has problem: If a cell in the row is high, cell 1 is centered and it returns top of centered part - // but if you get position of row element, it always returns the same value (not the row's) - // So we require row number to be vertical aligned to top - - if (!positions[rownum]) { - positions[rownum] = cellposition.top; // first one takes precedence - sizes[rownum] = trowobj.firstChild.offsetHeight; - } - } - - return; - }; - - SocialCalc.CalculateColPositions = function ( - editor, - panenum, - positions, - sizes - ) { - var leftcol, colpane, colnum, offset, trowobj, cellposition; - - var context = editor.context; - var sheetobj = context.sheetobj; - - var tbodyobj; - - if (!context.showRCHeaders) throw "Needs showRCHeaders=true"; - - tbodyobj = editor.fullgrid.lastChild; - - // Calculate start of this pane as column in this table: - - leftcol = 1; - for (colpane = 0; colpane < panenum; colpane++) { - leftcol += - context.colpanes[colpane].last - context.colpanes[colpane].first + 2; // skip pane and spacing col - } - - trowobj = tbodyobj.childNodes[1]; // get heading row, which has all columns - offset = 0; - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - cellposition = SocialCalc.GetElementPosition( - trowobj.childNodes[leftcol + offset] - ); - if (!positions[colnum]) { - positions[colnum] = cellposition.left; // first one takes precedence - if (trowobj.childNodes[leftcol + offset]) { - sizes[colnum] = trowobj.childNodes[leftcol + offset].offsetWidth; - } - } - offset++; - } - - return; - }; - - // ScrollRelative(editor, vertical, amount) - // - // If vertical true, scrolls up(-)/down(+), else left(-)/right(+) - - SocialCalc.ScrollRelative = function (editor, vertical, amount) { - if (vertical) { - editor.ScrollRelativeBoth(amount, 0); - } else { - editor.ScrollRelativeBoth(0, amount); - } - return; - }; - - // ScrollRelativeBoth(editor, vamount, hamount) - // - // Does both with one render - - SocialCalc.ScrollRelativeBoth = function (editor, vamount, hamount) { - var context = editor.context; - - var vplen = context.rowpanes.length; - var vlimit = vplen > 1 ? context.rowpanes[vplen - 2].last + 1 : 1; // don't scroll past here - if (context.rowpanes[vplen - 1].first + vamount < vlimit) { - // limit amount - vamount = -context.rowpanes[vplen - 1].first + vlimit; - } - - var hplen = context.colpanes.length; - var hlimit = hplen > 1 ? context.colpanes[hplen - 2].last + 1 : 1; // don't scroll past here - - if (context.colpanes[hplen - 1].first + hamount < hlimit) { - // limit amount - hamount = -context.colpanes[hplen - 1].first + hlimit; - } - - if ( - SocialCalc.IsScrollPossible && - !SocialCalc.IsScrollPossible( - editor.context.sheetobj.attribs.lastrow, - editor.context.sheetobj.attribs.lastcol, - context.rowpanes[vplen - 1].first, - context.colpanes[hplen - 1].first, - vamount, - hamount - ) - ) { - return; - } - - if ((vamount == 1 || vamount == -1) && hamount == 0) { - // special case quick scrolls - if (vamount == 1) { - editor.ScrollTableUpOneRow(); - } else { - editor.ScrollTableDownOneRow(); - } - if (editor.ecell) editor.SetECellHeaders("selected"); - editor.SchedulePositionCalculations(); - return; - } - - // Do a gross move and render - - if (vamount != 0 || hamount != 0) { - context.rowpanes[vplen - 1].first += vamount; - context.rowpanes[vplen - 1].last += vamount; - context.colpanes[hplen - 1].first += hamount; - context.colpanes[hplen - 1].last += hamount; - editor.FitToEditTable(); - editor.ScheduleRender(); - } - }; - - // PageRelative(editor, vertical, direction) - // - // If vertical true, pages up(direction is -)/down(+), else left(-)/right(+) - - SocialCalc.PageRelative = function (editor, vertical, direction) { - var context = editor.context; - var panes = vertical ? "rowpanes" : "colpanes"; - var lastpane = context[panes][context[panes].length - 1]; - var lastvisible = vertical ? "lastvisiblerow" : "lastvisiblecol"; - var sizearray = vertical ? editor.rowheight : editor.colwidth; - var defaultsize = vertical - ? SocialCalc.Constants.defaultAssumedRowHeight - : SocialCalc.Constants.defaultColWidth; - var size, newfirst, totalsize, current; - - if (direction > 0) { - // down/right - newfirst = editor[lastvisible]; - if (newfirst == lastpane.first) newfirst += 1; // move at least one - } else { - if (vertical) { - // calculate amount to scroll - totalsize = - editor.tableheight - - (editor.firstscrollingrowtop - editor.gridposition.top); - } else { - totalsize = - editor.tablewidth - - (editor.firstscrollingcolleft - editor.gridposition.left); - } - totalsize -= - sizearray[editor[lastvisible]] > 0 - ? sizearray[editor[lastvisible]] - : defaultsize; - - for (newfirst = lastpane.first - 1; newfirst > 0; newfirst--) { - size = sizearray[newfirst] > 0 ? sizearray[newfirst] : defaultsize; - if (totalsize < size) break; - totalsize -= size; - } - - current = lastpane.first; - if (newfirst >= current) newfirst = current - 1; // move at least 1 - if (newfirst < 1) newfirst = 1; - } - - lastpane.first = newfirst; - lastpane.last = newfirst + 1; - editor.LimitLastPanes(); - editor.FitToEditTable(); - editor.ScheduleRender(); - }; - - // LimitLastPanes(editor) - // - // Makes sure that the "first" of the last panes isn't before the last of the previous pane - // - - SocialCalc.LimitLastPanes = function (editor) { - var context = editor.context; - var plen; - - plen = context.rowpanes.length; - if ( - plen > 1 && - context.rowpanes[plen - 1].first <= context.rowpanes[plen - 2].last - ) - context.rowpanes[plen - 1].first = context.rowpanes[plen - 2].last + 1; - - plen = context.colpanes.length; - if ( - plen > 1 && - context.colpanes[plen - 1].first <= context.colpanes[plen - 2].last - ) - context.colpanes[plen - 1].first = context.colpanes[plen - 2].last + 1; - }; - - SocialCalc.ScrollTableUpOneRow = function (editor) { - var toprow, - rowpane, - rownum, - colnum, - colpane, - cell, - oldrownum, - maxspan, - newbottomrow, - newrow, - oldchild, - bottomrownum; - var rowneedsrefresh = {}; - - var context = editor.context; - var sheetobj = context.sheetobj; - var tableobj = editor.fullgrid; - - var tbodyobj; - - tbodyobj = tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane = 0; rowpane < context.rowpanes.length - 1; rowpane++) { - toprow += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 2; // skip pane and spacing row - } - - tbodyobj.removeChild(tbodyobj.childNodes[toprow]); - - context.rowpanes[rowpane].first++; - context.rowpanes[rowpane].last++; - editor.FitToEditTable(); - context.CalculateColWidthData(); // Just in case, since normally done in RenderSheet - - newbottomrow = context.RenderRow(context.rowpanes[rowpane].last, rowpane); - tbodyobj.appendChild(newbottomrow); - - // if scrolled off a row with starting rowspans, replace rows for the largest rowspan - - var maxrowspan = 1; - oldrownum = context.rowpanes[rowpane].first - 1; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - var coord = SocialCalc.crToCoord(colnum, oldrownum); - if (context.cellskip[coord]) continue; - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > maxrowspan) maxrowspan = cell.rowspan; - } - } - - if (maxrowspan > 1) { - for (rownum = 1; rownum < maxrowspan; rownum++) { - if (rownum + oldrownum >= context.rowpanes[rowpane].last) break; - newrow = context.RenderRow(rownum + oldrownum, rowpane); - oldchild = tbodyobj.childNodes[toprow + rownum - 1]; - tbodyobj.replaceChild(newrow, oldchild); - } - } - - // if added a row that includes rowspans from above, update the size of those to include new row - - bottomrownum = context.rowpanes[rowpane].last; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - coord = context.cellskip[SocialCalc.crToCoord(colnum, bottomrownum)]; - if (!coord) continue; // only look at spanned cells - rownum = context.coordToCR[coord].row - 0; - if ( - rownum == context.rowpanes[rowpane].last || - rownum < context.rowpanes[rowpane].first - ) - continue; // this row (colspan) or starts above pane - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > 1) rowneedsrefresh[rownum] = true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow = context.RenderRow(rownum, rowpane); - oldchild = - tbodyobj.childNodes[ - toprow + (rownum - context.rowpanes[rowpane].first) - ]; - tbodyobj.replaceChild(newrow, oldchild); - } - - return tableobj; - }; - - SocialCalc.ScrollTableDownOneRow = function (editor) { - var toprow, - rowpane, - rownum, - colnum, - colpane, - cell, - newrownum, - maxspan, - newbottomrow, - newrow, - oldchild, - bottomrownum, - maxrowspan, - coord; - var rowneedsrefresh = {}; - - var context = editor.context; - var sheetobj = context.sheetobj; - var tableobj = editor.fullgrid; - - var tbodyobj; - - tbodyobj = tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane = 0; rowpane < context.rowpanes.length - 1; rowpane++) { - toprow += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 2; // skip pane and spacing row - } - - tbodyobj.removeChild( - tbodyobj.childNodes[ - toprow + - (context.rowpanes[rowpane].last - context.rowpanes[rowpane].first) - ] - ); - - context.rowpanes[rowpane].first--; - context.rowpanes[rowpane].last--; - editor.FitToEditTable(); - context.CalculateColWidthData(); // Just in case, since normally done in RenderSheet - - newrow = context.RenderRow(context.rowpanes[rowpane].first, rowpane); - tbodyobj.insertBefore(newrow, tbodyobj.childNodes[toprow]); - - // if inserted a row with starting rowspans, replace rows for the largest rowspan - - maxrowspan = 1; - newrownum = context.rowpanes[rowpane].first; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - coord = SocialCalc.crToCoord(colnum, newrownum); - if (context.cellskip[coord]) continue; - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > maxrowspan) maxrowspan = cell.rowspan; - } - } - - if (maxrowspan > 1) { - for (rownum = 1; rownum < maxrowspan; rownum++) { - if (rownum + newrownum > context.rowpanes[rowpane].last) break; - newrow = context.RenderRow(rownum + newrownum, rowpane); - oldchild = tbodyobj.childNodes[toprow + rownum]; - tbodyobj.replaceChild(newrow, oldchild); - } - } - - // if last row now includes rowspans or rowspans from above, update the size of those to remove deleted row - - bottomrownum = context.rowpanes[rowpane].last; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - coord = SocialCalc.crToCoord(colnum, bottomrownum); - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > 1) { - rowneedsrefresh[bottomrownum] = true; // need to update this row - continue; - } - coord = context.cellskip[SocialCalc.crToCoord(colnum, bottomrownum)]; - if (!coord) continue; // only look at spanned cells - rownum = context.coordToCR[coord].row - 0; - if (rownum == bottomrownum || rownum < context.rowpanes[rowpane].first) - continue; // this row (colspan) or starts above pane - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > 1) rowneedsrefresh[rownum] = true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow = context.RenderRow(rownum, rowpane); - oldchild = - tbodyobj.childNodes[ - toprow + (rownum - context.rowpanes[rowpane].first) - ]; - tbodyobj.replaceChild(newrow, oldchild); - } - - return tableobj; - }; - - // ************************************* - // - // InputBox class: - // - // This class deals with the text box for editing cell contents. - // It mainly controls a user input box for typed content and is used to interact with - // the keyboard code, etc. - // - // You can use this inside a formula bar control of some sort. - // You create this after you have created a table editor object (but not necessarily - // done the CreateTableEditor method). - // - // When the user starts typing text, or double-clicks on a cell, this object - // comes into play. - // - // The element given when this is first constructed should be an input HTMLElement or - // something that acts like one. Check the code here to see what is done to it. - // - // ************************************* - - SocialCalc.InputBox = function (element, editor) { - if (!element) return; // invoked without enough data to work - - this.element = element; // the input element associated with this InputBox - this.editor = editor; // the TableEditor this belongs to - this.inputEcho = null; - - editor.inputBox = this; - - element.onmousedown = SocialCalc.InputBoxOnMouseDown; - - editor.MoveECellCallback.formulabar = function (e) { - if (e.state != "start") { - return; - } // if not in normal keyboard mode don't replace formula bar - editor.inputBox.DisplayCellContents(e.ecell.coord); - }; - }; - - // Methods: - - SocialCalc.InputBox.prototype.DisplayCellContents = function (coord) { - SocialCalc.InputBoxDisplayCellContents(this, coord); - }; - SocialCalc.InputBox.prototype.ShowInputBox = function (show) { - this.editor.inputEcho.ShowInputEcho(show); - }; - SocialCalc.InputBox.prototype.GetText = function () { - return this.element.value; - }; - SocialCalc.InputBox.prototype.SetText = function (newtext) { - if (!this.element) return; - this.element.value = newtext; - - if (!SocialCalc.Constants.SCNoInputEcho) { - this.editor.inputEcho.SetText(newtext + "_"); - } - }; - SocialCalc.InputBox.prototype.Focus = function () { - SocialCalc.InputBoxFocus(this); - }; - SocialCalc.InputBox.prototype.Blur = function () { - return this.element.blur(); - }; - SocialCalc.InputBox.prototype.Select = function (t) { - if (!this.element) return; - switch (t) { - case "end": - if (document.selection && document.selection.createRange) { - /* IE 4+ - Safer than setting .selectionEnd as it also works for Textareas. */ - var range = document.selection.createRange().duplicate(); - range.moveToElementText(this.element); - range.collapse(false); - range.select(); - } else if (this.element.selectionStart != undefined) { - this.element.selectionStart = this.element.value.length; - this.element.selectionEnd = this.element.value.length; - } - break; - } - }; - - // Functions: - - // - // SocialCalc.InputBoxDisplayCellContents(inputbox, coord) - // - // Sets input box to the contents of the specified cell (or ecell if null). - // - var CoordForColorChange; - var editCoord; - SocialCalc.InputBoxDisplayCellContents = function (inputbox, coord) { - var scc = SocialCalc.Constants; - var cell, position; - - if (!inputbox) return; - - //changes for prompt - if (!coord) { - coord = inputbox.editor.ecell.coord; - } - var text = SocialCalc.GetCellContents( - inputbox.editor.context.sheetobj, - coord - ); - if (text.indexOf("\n") != -1) { - //text = scc.s_inputboxdisplaymultilinetext; - text = scc.s_inputboxdisplaynoteditable; - inputbox.element.disabled = true; - SocialCalc.ToggleInputLineButtons(false); - } else if (!SocialCalc.Callbacks.IsCellEditable(inputbox.editor)) { - text = scc.s_inputboxdisplaynoteditable; - SocialCalc.ToggleInputLineButtons(false); - inputbox.element.disabled = true; - inputbox.element.style.display = "none"; - } else { - CoordForColorChange = coord; - editCoord = coord; - - //changes for prompt - - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - cell = SocialCalc.GetEditorCellElement( - inputbox.editor, - inputbox.editor.ecell.row, - inputbox.editor.ecell.col - ); - var left = "100px"; - var top = "100px"; - var width = 100; - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - left = position.left - 2 + "px"; - top = position.top - 7 + "px"; - width = cell.element.offsetWidth; - } - if (!cell || width == 0) { - //scrolled off screen - SocialCalc.ToggleInputLineButtons(false); - inputbox.element.disabled = true; - inputbox.element.style.display = "none"; - // do nothing - return; - } - var ele = document.getElementById(spreadsheet.formulabarDiv.id); - if (ele) { - spreadsheet.spreadsheetDiv.removeChild(spreadsheet.formulabarDiv); - } - spreadsheet.formulabarDiv.style.left = left; - spreadsheet.formulabarDiv.style.top = top; - //spreadsheet.formulabarDiv.style.width = "30px"; - //spreadsheet.formulabarDiv.style.fontSize = "10px"; - spreadsheet.formulabarDiv.style.zIndex = 100; - spreadsheet.formulabarDiv.style.position = "absolute"; - var input = spreadsheet.formulabarDiv.firstChild; - //changes for prompt - - input.style.fontSize = "100%"; - input.style.backgroundColor = "transparent"; - - input.style.borderBottomColor = "#306eff"; - input.style.borderBottomLeftRadius = "3px"; - input.style.borderBottomRightRadius = "3px"; - input.style.borderBottomStyle = "solid"; - input.style.borderBottomWidth = "2px"; - input.style.borderLeftColor = "#306eff"; - input.style.borderLeftStyle = "solid"; - input.style.borderLeftWidth = "2px"; - input.style.borderRightColor = "#306eff"; - input.style.borderRightStyle = "solid"; - input.style.borderRightWidth = "2px"; - input.style.borderTopColor = "#306eff"; - input.style.borderTopLeftRadius = "3px"; - input.style.borderTopRightRadius = "3px"; - input.style.borderTopStyle = "solid"; - input.style.borderTopWidth = "2px"; - - //console.log("cell width ="+width) - //changes for prompt - - input.size = "" + width / 8; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - - inputbox.element.disabled = false; - inputbox.element.style.display = "inline"; - SocialCalc.ToggleInputLineButtons(true); - } - if (scc.SCNoQuoteInInputBox && text.substring(0, 1) == "'") { - text = text.substring(1); - } - inputbox.SetText(text); - // autoSave(selectedFile); - }; - - // - // SocialCalc.InputBoxFocus(inputbox) - // - // Call this to have the input box get the focus and respond to keystrokes - // but still pass them off to SocialCalc.ProcessKey. - // - - SocialCalc.InputBoxFocus = function (inputbox) { - if (!inputbox) return; - inputbox.element.focus(); - var editor = inputbox.editor; - editor.state = "input"; - var wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - }; - - // - // SocialCalc.InputBoxOnMouseDown(e) - // - // This is called when the input box gets the focus. It then responds to keystrokes - // and pass them off to SocialCalc.ProcessKey, but in a different editing state. - // - - SocialCalc.InputBoxOnMouseDown = function (e) { - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var wval = editor.workingvalues; - - switch (editor.state) { - case "start": - editor.state = "inputboxdirect"; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.inputEcho.ShowInputEcho(true); - break; - - case "input": - wval.partialexpr = ""; // make sure not pointing - editor.MoveECell(wval.ecoord); - editor.state = "inputboxdirect"; - SocialCalc.KeyboardFocus(); // may have come here from outside of grid - break; - - case "inputboxdirect": - break; - } - }; - - // ************************************* - // - // InputEcho class: - // - // This object creates and controls an element that echos what's in the InputBox during editing - // It is draggable. - // - // ************************************* - - SocialCalc.InputEcho = function (editor) { - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - this.text = ""; // current value of what is displayed - this.interval = null; // timer handle - - this.container = null; // element containing main echo as well as prompt line - this.main = null; // main echo area - this.prompt = null; - - this.functionbox = null; // function chooser dialog - - this.container = document.createElement("div"); - SocialCalc.setStyles( - this.container, - "display:none;position:absolute;zIndex:10;" - ); - - this.topprompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) - this.topprompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) - SocialCalc.setStyles(this.topprompt, scc.defaultInputEchoPromptStyle); - this.topprompt.innerHTML = ""; - - this.container.appendChild(this.topprompt); - - this.main = document.createElement("div"); - - if (scc.defaultInputEchoClass) - this.main.className = scc.defaultInputEchoClass; - if (scc.defaultInputEchoStyle) - SocialCalc.setStyles(this.main, scc.defaultInputEchoStyle); - - this.main.innerHTML = " "; - - this.container.appendChild(this.main); - - this.prompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) - this.prompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) - SocialCalc.setStyles(this.prompt, scc.defaultInputEchoPromptStyle); - this.prompt.innerHTML = ""; - - this.container.appendChild(this.prompt); - - SocialCalc.DragRegister(this.main, true, true, { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: this.container, - }); - - editor.toplevel.appendChild(this.container); - }; - - // Methods: - - SocialCalc.InputEcho.prototype.ShowInputEcho = function (show) { - return SocialCalc.ShowInputEcho(this, show); - }; - SocialCalc.InputEcho.prototype.SetText = function (str) { - return SocialCalc.SetInputEchoText(this, str); - }; - - // Functions: - - SocialCalc.ShowInputEcho = function (inputecho, show) { - var cell, position; - var editor = inputecho.editor; - - if (!editor) return; - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - if (show) { - editor.cellhandles.ShowCellHandles(false); - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - inputecho.container.style.left = position.left - 1 + "px"; - inputecho.container.style.top = position.top - 1 + "px"; - } - inputecho.container.style.display = "block"; - if (inputecho.interval) window.clearInterval(inputecho.interval); // just in case - inputecho.interval = window.setInterval( - SocialCalc.InputEchoHeartbeat, - 50 - ); - } else { - if (inputecho.interval) window.clearInterval(inputecho.interval); - inputecho.container.style.display = "none"; - inputecho.topprompt.innerHTML = ""; - } - }; - - SocialCalc.SetInputEchoText = function (inputecho, str) { - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - var scc = SocialCalc.Constants; - var fname, fstr; - var newstr = SocialCalc.special_chars(str); - newstr = newstr.replace(/\n/g, "
"); - - if (inputecho.text != newstr) { - inputecho.main.innerHTML = newstr; - inputecho.text = newstr; - } - - var parts = str.match( - /.*[\+\-\*\/\&\^\<\>\=\,\(]([A-Za-z][A-ZA-z]\w*?)\([^\)]*$/ - ); - if (str.charAt(0) == "=" && parts) { - fname = parts[1].toUpperCase(); - if (SocialCalc.Formula.FunctionList[fname]) { - SocialCalc.Formula.FillFunctionInfo(); // make sure filled - fstr = SocialCalc.special_chars( - fname + "(" + SocialCalc.Formula.FunctionArgString(fname) + ")" - ); - } else { - fstr = scc.ietUnknownFunction + fname; - } - if (inputecho.prompt.innerHTML != fstr) { - inputecho.prompt.innerHTML = fstr; - inputecho.prompt.style.display = "block"; - } - } else if (inputecho.prompt.style.display != "none") { - inputecho.prompt.innerHTML = ""; - inputecho.prompt.style.display = "none"; - } - - var editor = inputecho.editor; - - if (editor.workingvalues.currentsheet != editor.workingvalues.startsheet) { - var promptstr = - "Editing:" + - editor.workingvalues.startsheet + - "!" + - editor.workingvalues.ecoord; - if (promptstr != inputecho.topprompt.innerHTML) { - inputecho.topprompt.innerHTML = - "Editing:" + - editor.workingvalues.startsheet + - "!" + - editor.workingvalues.ecoord; - inputecho.topprompt.style.display = "block"; - } - } else { - if (inputecho.topprompt.style.display != "none") { - inputecho.topprompt.innerHTML = ""; - inputecho.topprompt.style.display = "none"; - } - } - }; - - SocialCalc.InputEchoHeartbeat = function () { - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - if (editor.state == "inputboxdirect") { - editor.inputEcho.SetText(editor.inputBox.GetText() + "_"); - } - }; - - SocialCalc.InputEchoMouseDown = function (e) { - var event = e || window.event; - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - // if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - // else event.cancelBubble = true; // IE 5+ - // if (event.preventDefault) event.preventDefault(); // DOM Level 2 - // else event.returnValue = false; // IE 5+ - - editor.inputBox.element.focus(); - - // return false; - }; - - // ************************************* - // - // CellHandles class: - // - // This object creates and controls the elements around the cursor cell for dragging, etc. - // - // ************************************* - - SocialCalc.CellHandles = function (editor) { - var scc = SocialCalc.Constants; - var functions; - - if (editor.noEdit) return; // leave us with nothing - if (scc.SCCellHandlesDisable) return; - - this.editor = editor; // the TableEditor this belongs to - - this.noCursorSuffix = false; - - this.movedmouse = false; // used to detect no-op - - this.draghandle = document.createElement("div"); - SocialCalc.setStyles( - this.draghandle, - "display:none;position:absolute;zIndex:8;border:1px solid white;width:4px;height:4px;fontSize:1px;backgroundColor:#0E93D8;cursor:default;" - ); - this.draghandle.innerHTML = " "; - editor.toplevel.appendChild(this.draghandle); - SocialCalc.AssignID(editor, this.draghandle, "draghandle"); - - var imagetype = "png"; - if (navigator.userAgent.match(/MSIE 6\.0/)) { - imagetype = "gif"; - } - - this.dragpalette = document.createElement("div"); - SocialCalc.setStyles( - this.dragpalette, - "display:none;position:absolute;zIndex:8;width:90px;height:90px;fontSize:1px;textAlign:center;cursor:default;" + - "backgroundImage:url(" + - SocialCalc.Constants.defaultImagePrefix + - "drag-handles." + - imagetype + - ");" - ); - this.dragpalette.innerHTML = " "; - editor.toplevel.appendChild(this.dragpalette); - SocialCalc.AssignID(editor, this.dragpalette, "dragpalette"); - - this.dragtooltip = document.createElement("div"); - SocialCalc.setStyles( - this.dragtooltip, - "display:none;position:absolute;zIndex:9;border:1px solid black;width:100px;height:auto;fontSize:10px;backgroundColor:#FFFFFF;" - ); - this.dragtooltip.innerHTML = " "; - editor.toplevel.appendChild(this.dragtooltip); - SocialCalc.AssignID(editor, this.dragtooltip, "dragtooltip"); - - this.fillinghandle = document.createElement("div"); - SocialCalc.setStyles( - this.fillinghandle, - "display:none;position:absolute;zIndex:9;border:1px solid black;width:auto;height:14px;fontSize:10px;backgroundColor:#FFFFFF;" - ); - this.fillinghandle.innerHTML = " "; - editor.toplevel.appendChild(this.fillinghandle); - SocialCalc.AssignID(editor, this.fillinghandle, "fillinghandle"); - - if (this.draghandle.addEventListener) { - // DOM Level 2 -- Firefox, et al - this.draghandle.addEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMoveOnHandle, - false - ); - this.dragpalette.addEventListener( - "mousedown", - SocialCalc.CellHandlesMouseDown, - false - ); - this.dragpalette.addEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMoveOnHandle, - false - ); - } else if (this.draghandle.attachEvent) { - // IE 5+ - this.draghandle.attachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMoveOnHandle - ); - this.dragpalette.attachEvent( - "onmousedown", - SocialCalc.CellHandlesMouseDown - ); - this.dragpalette.attachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMoveOnHandle - ); - } else { - // don't handle this - throw "Browser not supported"; - } - }; - - // Methods: - - SocialCalc.CellHandles.prototype.ShowCellHandles = function (show, moveshow) { - return SocialCalc.ShowCellHandles(this, show, moveshow); - }; - - // Functions: - - SocialCalc.ShowCellHandles = function (cellhandles, show, moveshow) { - var cell, cell2, position, position2; - var editor = cellhandles.editor; - var doshow = false; - var row, col, viewport; - - if (!editor) return; - - do { - // a block that can you can "break" out of easily - - if (!show) break; - - row = editor.ecell.row; - col = editor.ecell.col; - - if (editor.state != "start") break; - if (row >= editor.lastvisiblerow) break; - if (col >= editor.lastvisiblecol) break; - if (row < editor.firstscrollingrow) break; - if (col < editor.firstscrollingcol) break; - - if ( - editor.rowpositions[row + 1] + 20 > - editor.horizontaltablecontrol.controlborder - ) { - break; - } - if (editor.rowpositions[row + 1] - 10 < editor.headposition.top) { - break; - } - if ( - editor.colpositions[col + 1] + 20 > - editor.verticaltablecontrol.controlborder - ) { - break; - } - if (editor.colpositions[col + 1] - 30 < editor.headposition.left) { - break; - } - - cellhandles.draghandle.style.left = - editor.colpositions[col + 1] - 1 + "px"; - cellhandles.draghandle.style.top = - editor.rowpositions[row + 1] - 1 + "px"; - cellhandles.draghandle.style.display = "block"; - - if (moveshow) { - cellhandles.draghandle.style.display = "none"; - cellhandles.dragpalette.style.left = - editor.colpositions[col + 1] - 45 + "px"; - cellhandles.dragpalette.style.top = - editor.rowpositions[row + 1] - 45 + "px"; - cellhandles.dragpalette.style.display = "block"; - viewport = SocialCalc.GetViewportInfo(); - cellhandles.dragtooltip.style.right = - viewport.width - (editor.colpositions[col + 1] - 1) + "px"; - cellhandles.dragtooltip.style.bottom = - viewport.height - (editor.rowpositions[row + 1] - 1) + "px"; - cellhandles.dragtooltip.style.display = "none"; - } - - doshow = true; - } while (false); // only do once - - if (!doshow) { - cellhandles.draghandle.style.display = "none"; - } - if (!moveshow) { - cellhandles.dragpalette.style.display = "none"; - cellhandles.dragtooltip.style.display = "none"; - } - }; - - SocialCalc.CellHandlesMouseMoveOnHandle = function (e) { - var scc = SocialCalc.Constants; - - var event = e || window.event; - var target = event.target || event.srcElement; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (!cellhandles.editor) return true; // no handles - - if (!editor.cellhandles.mouseDown) { - editor.cellhandles.ShowCellHandles(true, true); // show move handles, too - - if (target == cellhandles.dragpalette) { - var whichhandle = SocialCalc.SegmentDivHit( - [scc.CH_radius1, scc.CH_radius2], - editor.cellhandles.dragpalette, - clientX, - clientY - ); - if (whichhandle == 0) { - // off of active part of palette - SocialCalc.CellHandlesHoverTimeout(); - return; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - cellhandles.tooltipswhichhandle = whichhandle; - cellhandles.tooltipstimer = window.setTimeout( - SocialCalc.CellHandlesTooltipsTimeout, - 700 - ); - } - - if (cellhandles.timer) { - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - cellhandles.timer = window.setTimeout( - SocialCalc.CellHandlesHoverTimeout, - 3000 - ); - } - - return; - }; - - // - // whichsegment = SocialCalc.SegmentDivHit(segtable, divWithMouseHit, x, y) - // - // Takes segtable = [upperleft quadrant, upperright, bottomright, bottomleft] - // where each quadrant is either: - // 0 = ignore hits here - // number = return this value - // array = a new segtable for this subquadrant - // - // Alternatively, segtable can be: - // [radius 1, radius 2] and it returns 0 if no hit, - // -1, -2, -3, -4 for inner quadrants, and +1...+4 for outer quadrants - // - - SocialCalc.SegmentDivHit = function (segtable, divWithMouseHit, x, y) { - var width = divWithMouseHit.offsetWidth; - var height = divWithMouseHit.offsetHeight; - var left = divWithMouseHit.offsetLeft; - var top = divWithMouseHit.offsetTop; - var v = 0; - var table = segtable; - var len = Math.sqrt( - Math.pow(x - left - (width / 2.0 - 0.5), 2) + - Math.pow(y - top - (height / 2.0 - 0.5), 2) - ); - - if (table.length == 2) { - // type 2 segtable - if ( - x >= left && - x < left + width / 2 && - y >= top && - y < top + height / 2 - ) { - // upper left - if (len <= segtable[0]) v = -1; - else if (len <= segtable[1]) v = 1; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top && - y < top + height / 2 - ) { - // upper right - if (len <= segtable[0]) v = -2; - else if (len <= segtable[1]) v = 2; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - if (len <= segtable[0]) v = -3; - else if (len <= segtable[1]) v = 3; - } - if ( - x >= left && - x < left + width / 2 && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - if (len <= segtable[0]) v = -4; - else if (len <= segtable[1]) v = 4; - } - return v; - } - - while (true) { - if ( - x >= left && - x < left + width / 2 && - y >= top && - y < top + height / 2 - ) { - // upper left - quadrant += "1"; - v = table[0]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - height = height / 2; - continue; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top && - y < top + height / 2 - ) { - // upper right - quadrant += "2"; - v = table[1]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - left = left + width; - height = height / 2; - continue; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - quadrant += "3"; - v = table[2]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - left = left + width; - height = height / 2; - top = top + height; - continue; - } - if ( - x >= left && - x < left + width / 2 && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - quadrant += "4"; - v = table[3]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - height = height / 2; - top = top + height; - continue; - } - return 0; // didn't match - } - - //addmsg((x-divWithMouseHit.offsetLeft)+","+(y-divWithMouseHit.offsetTop)+"="+quadrant+" "+v); - return v; - }; - - SocialCalc.CellHandlesHoverTimeout = function () { - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.timer) { - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - editor.cellhandles.ShowCellHandles(true, false); // hide move handles - }; - - SocialCalc.CellHandlesTooltipsTimeout = function () { - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - - var whichhandle = cellhandles.tooltipswhichhandle; - if (whichhandle == 0) { - // off of active part of palette - SocialCalc.CellHandlesHoverTimeout(); - return; - } - if (whichhandle == -3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillAllTooltip; - } else if (whichhandle == 3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillContentsTooltip; - } else if (whichhandle == -2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteAllTooltip; - } else if (whichhandle == -4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertAllTooltip; - } else if (whichhandle == 2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteContentsTooltip; - } else if (whichhandle == 4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertContentsTooltip; - } else { - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - return; - } - - cellhandles.dragtooltip.style.display = "block"; - }; - - SocialCalc.CellHandlesMouseDown = function (e) { - var scc = SocialCalc.Constants; - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (editor.busy) return; // don't do anything when busy (is this correct?) - - var cellhandles = editor.cellhandles; - - cellhandles.movedmouse = false; // detect no-op - - if (cellhandles.timer) { - // cancel timer - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - - range = editor.range; - - var whichhandle = SocialCalc.SegmentDivHit( - [scc.CH_radius1, scc.CH_radius2], - editor.cellhandles.dragpalette, - clientX, - clientY - ); - if (whichhandle == 1 || whichhandle == -1 || whichhandle == 0) { - cellhandles.ShowCellHandles(true, false); // hide move handles - return; - } - - mouseinfo.ignore = true; // stop other code from looking at the mouse - - if (whichhandle == -3) { - cellhandles.dragtype = "Fill"; - // mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } else if (whichhandle == 3) { - cellhandles.dragtype = "FillC"; - // mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } else if (whichhandle == -2) { - cellhandles.dragtype = "Move"; - // mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } else if (whichhandle == -4) { - cellhandles.dragtype = "MoveI"; - // mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } else if (whichhandle == 2) { - cellhandles.dragtype = "MoveC"; - // mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } else if (whichhandle == 4) { - cellhandles.dragtype = "MoveIC"; - // mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } - - cellhandles.filltype = null; - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - break; - - case "Move": - case "MoveI": - case "MoveC": - case "MoveIC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.RangeRemove(); - break; - - default: - return; // not for us - } - - cellhandles.fillinghandle.style.left = clientX + "px"; - cellhandles.fillinghandle.style.top = clientY - 17 + "px"; - cellhandles.fillinghandle.innerHTML = - scc.s_CHindicatorOperationLookup[cellhandles.dragtype] + - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - cellhandles.ShowCellHandles(true, false); // hide move handles - cellhandles.mouseDown = true; - - mouseinfo.editor = editor; // remember for later - - coord = editor.ecell.coord; // start with cell with handles - - cellhandles.startingcoord = coord; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - - mouseinfo.mouselastcoord = coord; - - SocialCalc.KeyboardSetFocus(editor); - - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMove, - true - ); // capture everywhere - document.addEventListener("mouseup", SocialCalc.CellHandlesMouseUp, true); // capture everywhere - } else if (cellhandles.draghandle.attachEvent) { - // IE 5+ - cellhandles.draghandle.setCapture(); - cellhandles.draghandle.attachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMove - ); - cellhandles.draghandle.attachEvent( - "onmouseup", - SocialCalc.CellHandlesMouseUp - ); - cellhandles.draghandle.attachEvent( - "onlosecapture", - SocialCalc.CellHandlesMouseUp - ); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.CellHandlesMouseMove = function (e) { - var scc = SocialCalc.Constants; - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - var crstart, crend, cr, c, r; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat( - editor, - result, - SocialCalc.CellHandlesDragAutoRepeat - ); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - - cellhandles.movedmouse = true; // did move, so not no-op - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (result.coord == cellhandles.startingcoord) { - // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } else { - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Down") { - // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Down"; - } else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Right"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord != mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (result.coord != mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - c = editor.range2.right - editor.range2.left + result.col; - r = editor.range2.bottom - editor.range2.top + result.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (result.coord == cellhandles.startingcoord) { - // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } else { - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Vertical") { - // coerse to that - crend.col = editor.range2.left; - if ( - crend.row >= editor.range2.top && - crend.row <= editor.range2.bottom + 1 - ) - crend.row = editor.range2.bottom + 2; - } else { - crend.row = editor.range2.top; - if ( - crend.col >= editor.range2.left && - crend.col <= editor.range2.right + 1 - ) - crend.col = editor.range2.right + 2; - } - } else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Vertical"; - } else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Horizontal"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord != mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - if (!cellhandles.filltype) { - // no fill type - editor.RangeRemove(); - } else { - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - } - break; - } - - cellhandles.fillinghandle.style.left = clientX + "px"; - cellhandles.fillinghandle.style.top = clientY - 17 + "px"; - cellhandles.fillinghandle.innerHTML = - scc.s_CHindicatorOperationLookup[cellhandles.dragtype] + - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - mouseinfo.mouselastcoord = result.coord; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.CellHandlesDragAutoRepeat = function (coord, direction) { - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - var crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - var crend = SocialCalc.coordToCr(coord); - - var newcoord, c, r; - - var vscroll = 0; - var hscroll = 0; - - if (direction == "left") hscroll = -1; - else if (direction == "right") hscroll = 1; - else if (direction == "up") vscroll = -1; - else if (direction == "down") vscroll = 1; - editor.ScrollRelativeBoth(vscroll, hscroll); - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Down") { - // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord != mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (coord != mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - c = editor.range2.right - editor.range2.left + editor.ecell.col; - r = editor.range2.bottom - editor.range2.top + editor.ecell.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Vertical") { - // coerse to that - crend.col = editor.range2.left; - if ( - crend.row >= editor.range2.top && - crend.row <= editor.range2.bottom + 1 - ) - crend.row = editor.range2.bottom + 2; - } else { - crend.row = editor.range2.top; - if ( - crend.col >= editor.range2.left && - crend.col <= editor.range2.right + 1 - ) - crend.col = editor.range2.right + 2; - } - } else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord != mouseinfo.mouselastcoord) { - editor.MoveECell(newcoord); - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - } - - mouseinfo.mouselastcoord = newcoord; - }; - - SocialCalc.CellHandlesMouseUp = function (e) { - var editor, - element, - result, - coord, - now, - textarea, - sheetobj, - cellobj, - wval, - cstr, - cmdtype, - cmdtype2; - var crstart, crend; - var sizec, sizer, deltac, deltar; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - mouseinfo.ignore = false; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - cellhandles.mouseDown = false; - cellhandles.noCursorSuffix = false; - - cellhandles.fillinghandle.style.display = "none"; - - if (!result) result = {}; - if (!result.coord) result.coord = editor.ecell.coord; - - switch (cellhandles.dragtype) { - case "Fill": - case "Move": - case "MoveI": - cmdtype2 = " all"; - break; - case "FillC": - case "MoveC": - case "MoveIC": - cmdtype2 = " formulas"; - break; - } - - if (!cellhandles.movedmouse) { - // didn't move: just leave one cell selected - cellhandles.dragtype = "Nothing"; - } - - switch (cellhandles.dragtype) { - case "Nothing": - editor.Range2Remove(); - editor.RangeRemove(); - break; - - case "Fill": - case "FillC": - crstart = SocialCalc.coordToCr(cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - if (cellhandles.filltype) { - if (cellhandles.filltype == "Down") { - crend.col = crstart.col; - } else { - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - - editor.MoveECell(result.coord); - editor.RangeExtend(); - - if (editor.cellhandles.filltype == "Right") { - cmdtype = "right"; - } else { - cmdtype = "down"; - } - cstr = - "fill" + - cmdtype + - " " + - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom) + - cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - break; - - case "Move": - case "MoveC": - editor.context.cursorsuffix = ""; - cstr = - "movepaste " + - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + - ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) + - " " + - editor.ecell.coord + - cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - - break; - - case "MoveI": - case "MoveIC": - editor.context.cursorsuffix = ""; - sizec = editor.range2.right - editor.range2.left; - sizer = editor.range2.bottom - editor.range2.top; - deltac = editor.ecell.col - editor.range2.left; - deltar = editor.ecell.row - editor.range2.top; - cstr = - "moveinsert " + - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + - ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) + - " " + - editor.ecell.coord + - cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - editor.RangeRemove(); - if (editor.cellhandles.filltype == " Horizontal" && deltac > 0) { - editor.MoveECell( - SocialCalc.crToCoord(editor.ecell.col - sizec - 1, editor.ecell.row) - ); - } else if (editor.cellhandles.filltype == " Vertical" && deltar > 0) { - editor.MoveECell( - SocialCalc.crToCoord(editor.ecell.col, editor.ecell.row - sizer - 1) - ); - } - editor.RangeAnchor( - SocialCalc.crToCoord( - editor.ecell.col + sizec, - editor.ecell.row + sizer - ) - ); - editor.RangeExtend(); - - break; - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMove, - true - ); - document.removeEventListener( - "mouseup", - SocialCalc.CellHandlesMouseUp, - true - ); - } else if (cellhandles.draghandle.detachEvent) { - // IE - cellhandles.draghandle.detachEvent( - "onlosecapture", - SocialCalc.CellHandlesMouseUp - ); - cellhandles.draghandle.detachEvent( - "onmouseup", - SocialCalc.CellHandlesMouseUp - ); - cellhandles.draghandle.detachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMove - ); - cellhandles.draghandle.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - }; - - // ************************************* - // - // TableControl class: - // - // This class deals with the horizontal and verical scrollbars and pane sliders. - // - // +--------------+ - // | Endcap | - // +- - - - - - - + - // | | - // +--------------+ - // | Pane Slider | - // +--------------+ - // | | - // | Less Button | - // | | - // +--------------+ - // | Scroll Area | - // | | - // | | - // +--------------+ - // | Thumb | - // +--------------+ - // | | - // +--------------+ - // | | - // | More Button | - // | | - // +--------------+ - // - // ************************************* - - SocialCalc.TableControl = function (editor, vertical, size) { - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - - this.vertical = vertical; // true if vertical control, false if horizontal - this.size = size; // length in pixels - - this.main = null; // main element containing all the others - this.endcap = null; // the area at the top/left between the end and the pane slider - this.paneslider = null; // the slider to adjust the pane split - this.lessbutton = null; // the top/left scroll button - this.morebutton = null; // the bottom/right scroll button - this.scrollarea = null; // the area between the scroll buttons - this.thumb = null; // the sliding thing in the scrollarea - - // computed position values: - - this.controlborder = null; // left or top screen position for vertical or horizontal control - this.endcapstart = null; // top or left screen position for vertical or horizontal control - this.panesliderstart = null; - this.lessbuttonstart = null; - this.morebuttonstart = null; - this.scrollareastart = null; - this.scrollareaend = null; - this.scrollareasize = null; - this.thumbpos = null; - - // constants: - - this.controlthickness = scc.defaultTableControlThickness; // other dimension of complete control in pixels - this.sliderthickness = scc.defaultTCSliderThickness; - this.buttonthickness = scc.defaultTCButtonThickness; - this.thumbthickness = scc.defaultTCThumbThickness; - this.minscrollingpanesize = - this.buttonthickness + this.buttonthickness + this.thumbthickness + 20; // the 20 is to leave a little space - }; - - // Methods: - - SocialCalc.TableControl.prototype.CreateTableControl = function () { - return SocialCalc.CreateTableControl(this); - }; - SocialCalc.TableControl.prototype.PositionTableControlElements = function () { - SocialCalc.PositionTableControlElements(this); - }; - SocialCalc.TableControl.prototype.ComputeTableControlPositions = function () { - SocialCalc.ComputeTableControlPositions(this); - }; - - // Functions: - - SocialCalc.CreateTableControl = function (control) { - var s, functions, params; - var AssignID = SocialCalc.AssignID; - var setStyles = SocialCalc.setStyles; - var scc = SocialCalc.Constants; - var TooltipRegister = function (element, etype, vh) { - if (scc["s_" + etype + "Tooltip" + vh]) { - SocialCalc.TooltipRegister( - element, - scc["s_" + etype + "Tooltip" + vh], - null - ); - } - }; - - var imageprefix = control.editor.imageprefix; - var vh = control.vertical ? "v" : "h"; - - control.main = document.createElement("div"); - s = control.main.style; - s.height = - (control.vertical ? control.size : control.controlthickness) + "px"; - s.width = - (control.vertical ? control.controlthickness : control.size) + "px"; - s.zIndex = 0; - setStyles(control.main, scc.TCmainStyle); - s.backgroundImage = "url(" + imageprefix + "main-" + vh + ".gif)"; - if (scc.TCmainClass) control.main.className = scc.TCmainClass; - - control.main.style.display = "none"; // wait for layout - - control.endcap = document.createElement("div"); - s = control.endcap.style; - s.height = control.controlthickness + "px"; - s.width = control.controlthickness + "px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.endcap, scc.TCendcapStyle); - s.backgroundImage = "url(" + imageprefix + "endcap-" + vh + ".gif)"; - if (scc.TCendcapClass) control.endcap.className = scc.TCendcapClass; - AssignID(control.editor, control.endcap, "endcap" + vh); - - control.main.appendChild(control.endcap); - - control.paneslider = document.createElement("div"); - s = control.paneslider.style; - s.height = - (control.vertical ? control.sliderthickness : control.controlthickness) + - "px"; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.width = - (control.vertical ? control.controlthickness : control.sliderthickness) + - "px"; - s.position = "absolute"; - s[control.vertical ? "top" : "left"] = "4px"; - s.zIndex = 3; - setStyles(control.paneslider, scc.TCpanesliderStyle); - s.backgroundImage = "url(" + imageprefix + "paneslider-" + vh + ".gif)"; - if (scc.TCpanesliderClass) - control.paneslider.className = scc.TCpanesliderClass; - AssignID(control.editor, control.paneslider, "paneslider" + vh); - TooltipRegister(control.paneslider, "paneslider", vh); - - functions = { - MouseDown: SocialCalc.TCPSDragFunctionStart, - MouseMove: SocialCalc.TCPSDragFunctionMove, - MouseUp: SocialCalc.TCPSDragFunctionStop, - Disabled: function () { - return control.editor.busy; - }, - }; - - functions.control = control; // make sure this is there - - SocialCalc.DragRegister( - control.paneslider, - control.vertical, - !control.vertical, - functions - ); - - control.main.appendChild(control.paneslider); - - control.lessbutton = document.createElement("div"); - s = control.lessbutton.style; - s.height = - (control.vertical ? control.buttonthickness : control.controlthickness) + - "px"; - s.width = - (control.vertical ? control.controlthickness : control.buttonthickness) + - "px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.lessbutton, scc.TClessbuttonStyle); - s.backgroundImage = "url(" + imageprefix + "less-" + vh + "n.gif)"; - if (scc.TClessbuttonClass) - control.lessbutton.className = scc.TClessbuttonClass; - AssignID(control.editor, control.lessbutton, "lessbutton" + vh); - - params = { - repeatwait: scc.TClessbuttonRepeatWait, - repeatinterval: scc.TClessbuttonRepeatInterval, - normalstyle: - "backgroundImage:url(" + imageprefix + "less-" + vh + "n.gif);", - downstyle: - "backgroundImage:url(" + imageprefix + "less-" + vh + "d.gif);", - hoverstyle: - "backgroundImage:url(" + imageprefix + "less-" + vh + "h.gif);", - }; - functions = { - MouseDown: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, -1); - }, - Repeat: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, -1); - }, - Disabled: function () { - return control.editor.busy; - }, - }; - - SocialCalc.ButtonRegister(control.lessbutton, params, functions); - - control.main.appendChild(control.lessbutton); - - control.morebutton = document.createElement("div"); - s = control.morebutton.style; - s.height = - (control.vertical ? control.buttonthickness : control.controlthickness) + - "px"; - s.width = - (control.vertical ? control.controlthickness : control.buttonthickness) + - "px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.morebutton, scc.TCmorebuttonStyle); - s.backgroundImage = "url(" + imageprefix + "more-" + vh + "n.gif)"; - if (scc.TCmorebuttonClass) - control.morebutton.className = scc.TCmorebuttonClass; - AssignID(control.editor, control.morebutton, "morebutton" + vh); - - params = { - repeatwait: scc.TCmorebuttonRepeatWait, - repeatinterval: scc.TCmorebuttonRepeatInterval, - normalstyle: - "backgroundImage:url(" + imageprefix + "more-" + vh + "n.gif);", - downstyle: - "backgroundImage:url(" + imageprefix + "more-" + vh + "d.gif);", - hoverstyle: - "backgroundImage:url(" + imageprefix + "more-" + vh + "h.gif);", - }; - functions = { - MouseDown: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, +1); - }, - Repeat: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, +1); - }, - Disabled: function () { - return control.editor.busy; - }, - }; - - SocialCalc.ButtonRegister(control.morebutton, params, functions); - - control.main.appendChild(control.morebutton); - - control.scrollarea = document.createElement("div"); - s = control.scrollarea.style; - s.height = control.controlthickness + "px"; - s.width = control.controlthickness + "px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.scrollarea, scc.TCscrollareaStyle); - s.backgroundImage = "url(" + imageprefix + "scrollarea-" + vh + ".gif)"; - if (scc.TCscrollareaClass) - control.scrollarea.className = scc.TCscrollareaClass; - AssignID(control.editor, control.scrollarea, "scrollarea" + vh); - - params = { - repeatwait: scc.TCscrollareaRepeatWait, - repeatinterval: scc.TCscrollareaRepeatWait, - }; - functions = { - MouseDown: SocialCalc.ScrollAreaClick, - Repeat: SocialCalc.ScrollAreaClick, - Disabled: function () { - return control.editor.busy; - }, - }; - functions.control = control; - - SocialCalc.ButtonRegister(control.scrollarea, params, functions); - - control.main.appendChild(control.scrollarea); - - control.thumb = document.createElement("div"); - s = control.thumb.style; - s.height = - (control.vertical ? control.thumbthickness : control.controlthickness) + - "px"; - s.width = - (control.vertical ? control.controlthickness : control.thumbthickness) + - "px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.thumb, scc.TCthumbStyle); - control.thumb.style.backgroundImage = - "url(" + imageprefix + "thumb-" + vh + "n.gif)"; - if (scc.TCthumbClass) control.thumb.className = scc.TCthumbClass; - AssignID(control.editor, control.thumb, "thumb" + vh); - - functions = { - MouseDown: SocialCalc.TCTDragFunctionStart, - MouseMove: SocialCalc.TCTDragFunctionMove, - MouseUp: SocialCalc.TCTDragFunctionStop, - Disabled: function () { - return control.editor.busy; - }, - }; - functions.control = control; // make sure this is there - SocialCalc.DragRegister( - control.thumb, - control.vertical, - !control.vertical, - functions - ); - - params = { - normalstyle: - "backgroundImage:url(" + imageprefix + "thumb-" + vh + "n.gif)", - name: "Thumb", - downstyle: - "backgroundImage:url(" + imageprefix + "thumb-" + vh + "d.gif)", - hoverstyle: - "backgroundImage:url(" + imageprefix + "thumb-" + vh + "h.gif)", - }; - SocialCalc.ButtonRegister(control.thumb, params, null); // give it button-like visual behavior - - control.main.appendChild(control.thumb); - - return control.main; - }; - - // - // ScrollAreaClick - Button function to process pageup/down clicks - // - - SocialCalc.ScrollAreaClick = function (e, buttoninfo, bobj) { - var control = bobj.functionobj.control; - var bposition = SocialCalc.GetElementPosition(bobj.element); - var clickpos = control.vertical ? buttoninfo.clientY : buttoninfo.clientX; - if (control.editor.busy) { - // ignore if busy - wait for next repeat - return; - } - control.editor.PageRelative( - control.vertical, - clickpos > control.thumbpos ? 1 : -1 - ); - - return; - }; - - // - // PositionTableControlElements - // - - SocialCalc.PositionTableControlElements = function (control) { - var border, realend, thumbpos; - - var editor = control.editor; - - if (control.vertical) { - border = control.controlborder + "px"; - control.endcap.style.top = control.endcapstart + "px"; - control.endcap.style.left = border; - control.paneslider.style.top = control.panesliderstart + "px"; - control.paneslider.style.left = border; - control.lessbutton.style.top = control.lessbuttonstart + "px"; - control.lessbutton.style.left = border; - control.morebutton.style.top = control.morebuttonstart + "px"; - control.morebutton.style.left = border; - control.scrollarea.style.top = control.scrollareastart + "px"; - control.scrollarea.style.left = border; - control.scrollarea.style.height = control.scrollareasize + "px"; - realend = Math.max( - editor.context.sheetobj.attribs.lastrow, - editor.firstscrollingrow + 1 - ); - thumbpos = - ((editor.firstscrollingrow - (editor.lastnonscrollingrow + 1)) * - (control.scrollareasize - 3 * control.thumbthickness)) / - (realend - (editor.lastnonscrollingrow + 1)) + - control.scrollareastart - - 1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.top = thumbpos + "px"; - control.thumb.style.left = border; - } else { - border = control.controlborder + "px"; - control.endcap.style.left = control.endcapstart + "px"; - control.endcap.style.top = border; - control.paneslider.style.left = control.panesliderstart + "px"; - control.paneslider.style.top = border; - control.lessbutton.style.left = control.lessbuttonstart + "px"; - control.lessbutton.style.top = border; - control.morebutton.style.left = control.morebuttonstart + "px"; - control.morebutton.style.top = border; - control.scrollarea.style.left = control.scrollareastart + "px"; - control.scrollarea.style.top = border; - control.scrollarea.style.width = control.scrollareasize + "px"; - realend = Math.max( - editor.context.sheetobj.attribs.lastcol, - editor.firstscrollingcol + 1 - ); - thumbpos = - ((editor.firstscrollingcol - (editor.lastnonscrollingcol + 1)) * - (control.scrollareasize - control.thumbthickness)) / - (realend - editor.lastnonscrollingcol) + - control.scrollareastart - - 1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.left = thumbpos + "px"; - control.thumb.style.top = border; - } - control.thumbpos = thumbpos; - control.main.style.display = "block"; - }; - - // - // ComputeTableControlPositions - // - // This routine computes the screen positions and other values needed for laying out - // the table control elements. - // - - SocialCalc.ComputeTableControlPositions = function (control) { - var editor = control.editor; - - if (!editor.gridposition || !editor.headposition) - throw "Can't compute table control positions before editor positions"; - - if (control.vertical) { - control.controlborder = editor.gridposition.left + editor.tablewidth; // border=left position - control.endcapstart = editor.gridposition.top; // start=top position - control.panesliderstart = - editor.firstscrollingrowtop - control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingrowtop - 1; - control.morebuttonstart = - editor.gridposition.top + editor.tableheight - control.buttonthickness; - control.scrollareastart = - editor.firstscrollingrowtop - 1 + control.buttonthickness; - control.scrollareaend = control.morebuttonstart - 1; - control.scrollareasize = - control.scrollareaend - control.scrollareastart + 1; - } else { - control.controlborder = editor.gridposition.top + editor.tableheight; // border=top position - control.endcapstart = editor.gridposition.left; // start=left position - control.panesliderstart = - editor.firstscrollingcolleft - control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingcolleft - 1; - control.morebuttonstart = - editor.gridposition.left + editor.tablewidth - control.buttonthickness; - control.scrollareastart = - editor.firstscrollingcolleft - 1 + control.buttonthickness; - control.scrollareaend = control.morebuttonstart - 1; - control.scrollareasize = - control.scrollareaend - control.scrollareastart + 1; - } - }; - - ////// TCPS - TableControl Pan Slider methods - - // - // TCPSDragFunctionStart(event, draginfo, dobj) - // - // TableControlPaneSlider function for starting drag - // - - SocialCalc.TCPSDragFunctionStart = function (event, draginfo, dobj) { - var editor = dobj.functionobj.control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - draginfo.trackingline = document.createElement("div"); - draginfo.trackingline.style.height = dobj.vertical - ? scc.TCPStrackinglineThickness - : editor.tableheight - - (editor.headposition.top - editor.gridposition.top) + - "px"; - draginfo.trackingline.style.width = dobj.vertical - ? editor.tablewidth - - (editor.headposition.left - editor.gridposition.left) + - "px" - : scc.TCPStrackinglineThickness; - draginfo.trackingline.style.backgroundImage = - "url(" + - editor.imageprefix + - "trackingline-" + - (dobj.vertical ? "v" : "h") + - ".gif)"; - if (scc.TCPStrackinglineClass) - draginfo.trackingline.className = scc.TCPStrackinglineClass; - SocialCalc.setStyles(draginfo.trackingline, scc.TCPStrackinglineStyle); - - if (dobj.vertical) { - row = SocialCalc.Lookup( - draginfo.clientY + dobj.functionobj.control.sliderthickness, - editor.rowpositions - ); - draginfo.trackingline.style.top = - (editor.rowpositions[row] || editor.headposition.top) + "px"; - draginfo.trackingline.style.left = editor.headposition.left + "px"; - if (editor.context.rowpanes.length - 1) { - // has 2 already - editor.context.SetRowPaneFirstLast( - 1, - editor.context.rowpanes[0].last + 1, - editor.context.rowpanes[0].last + 1 - ); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } else { - col = SocialCalc.Lookup( - draginfo.clientX + dobj.functionobj.control.sliderthickness, - editor.colpositions - ); - draginfo.trackingline.style.top = editor.headposition.top + "px"; - draginfo.trackingline.style.left = - (editor.colpositions[col] || editor.headposition.left) + "px"; - if (editor.context.colpanes.length - 1) { - // has 2 already - editor.context.SetColPaneFirstLast( - 1, - editor.context.colpanes[0].last + 1, - editor.context.colpanes[0].last + 1 - ); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } - - editor.griddiv.appendChild(draginfo.trackingline); - }; - - // - // TCPSDragFunctionMove(event, draginfo, dobj) - // - - SocialCalc.TCPSDragFunctionMove = function (event, draginfo, dobj) { - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup( - draginfo.clientY + sliderthickness, - editor.rowpositions - ); - draginfo.trackingline.style.top = - (editor.rowpositions[row] || editor.headposition.top) + "px"; - } else { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup( - draginfo.clientX + sliderthickness, - editor.colpositions - ); - draginfo.trackingline.style.left = - (editor.colpositions[col] || editor.headposition.left) + "px"; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - }; - - // - // TCPSDragFunctionStop(event, draginfo, dobj) - // - - SocialCalc.TCPSDragFunctionStop = function (event, draginfo, dobj) { - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup( - draginfo.clientY + sliderthickness, - editor.rowpositions - ); - if (row > editor.context.sheetobj.attribs.lastrow) - row = editor.context.sheetobj.attribs.lastrow; // can't extend sheet here - if (!row || row <= editor.context.rowpanes[0].first) { - // set to no panes, leaving first pane settings - if (editor.context.rowpanes.length > 1) - editor.context.rowpanes.length = 1; - } else if (editor.context.rowpanes.length - 1) { - // has 2 already - if (!editor.timeout) { - // not waiting for position calc (so positions could be wrong) - editor.context.SetRowPaneFirstLast( - 0, - editor.context.rowpanes[0].first, - row - 1 - ); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } else { - editor.context.SetRowPaneFirstLast( - 0, - editor.context.rowpanes[0].first, - row - 1 - ); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } else { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup( - draginfo.clientX + sliderthickness, - editor.colpositions - ); - if (col > editor.context.sheetobj.attribs.lastcol) - col = editor.context.sheetobj.attribs.lastcol; // can't extend sheet here - if (!col || col <= editor.context.colpanes[0].first) { - // set to no panes, leaving first pane settings - if (editor.context.colpanes.length > 1) - editor.context.colpanes.length = 1; - } else if (editor.context.colpanes.length - 1) { - // has 2 already - if (!editor.timeout) { - // not waiting for position calc (so positions could be wrong) - editor.context.SetColPaneFirstLast( - 0, - editor.context.colpanes[0].first, - col - 1 - ); - editor.context.SetColPaneFirstLast(1, col, col); - } - } else { - editor.context.SetColPaneFirstLast( - 0, - editor.context.colpanes[0].first, - col - 1 - ); - editor.context.SetColPaneFirstLast(1, col, col); - } - } - - editor.FitToEditTable(); - - editor.griddiv.removeChild(draginfo.trackingline); - - editor.ScheduleRender(); - }; - - ////// TCT - TableControl Thumb methods - - //!!!! Note: Need to make start use same code as move/stop for determining row/col, since stop will set that - //!!!! Note: Need to make start/move/stop use positioning code that corresponds closer to - //!!!! ComputeTableControlPositions calculations. - - // - // TCTDragFunctionStart(event, draginfo, dobj) - // - // TableControlThumb function for starting drag - // - - SocialCalc.TCTDragFunctionStart = function (event, draginfo, dobj) { - var rowpane, colpane, row, col; - - var control = dobj.functionobj.control; - var editor = control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - if (draginfo.thumbstatus) { - // get rid of old one if mouseup was out of window - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) - draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - } - - draginfo.thumbstatus = document.createElement("div"); - - if (dobj.vertical) { - if (scc.TCTDFSthumbstatusvClass) - draginfo.thumbstatus.className = scc.TCTDFSthumbstatusvClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatusvStyle); - draginfo.thumbstatus.style.top = - draginfo.clientY + scc.TCTDFStopOffsetv + "px"; - draginfo.thumbstatus.style.left = - control.controlborder - 10 - editor.tablewidth / 2 + "px"; - draginfo.thumbstatus.style.width = editor.tablewidth / 2 + "px"; - - draginfo.thumbcontext = new SocialCalc.RenderContext( - editor.context.sheetobj - ); - draginfo.thumbcontext.showGrid = true; - draginfo.thumbcontext.rowpanes = [{ first: 1, last: 1 }]; - var pane = editor.context.colpanes[editor.context.colpanes.length - 1]; - draginfo.thumbcontext.colpanes = [{ first: pane.first, last: pane.last }]; - draginfo.thumbstatus.innerHTML = - '
msg
preview
'; - draginfo.thumbstatus.rowmsgele = - draginfo.thumbstatus.firstChild.firstChild.firstChild.firstChild.firstChild; - draginfo.thumbstatus.rowpreviewele = - draginfo.thumbstatus.firstChild.firstChild.firstChild.childNodes[1].firstChild; - editor.toplevel.appendChild(draginfo.thumbstatus); - SocialCalc.TCTDragFunctionRowSetStatus( - draginfo, - editor, - editor.firstscrollingrow || 1 - ); - } else { - if (scc.TCTDFSthumbstatushClass) - draginfo.thumbstatus.className = scc.TCTDFSthumbstatushClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatushStyle); - draginfo.thumbstatus.style.top = - control.controlborder + scc.TCTDFStopOffseth + "px"; - draginfo.thumbstatus.style.left = - draginfo.clientX + scc.TCTDFSleftOffseth + "px"; - editor.toplevel.appendChild(draginfo.thumbstatus); - draginfo.thumbstatus.innerHTML = - scc.s_TCTDFthumbstatusPrefixh + - SocialCalc.rcColname(editor.firstscrollingcol); - } - }; - - // - // SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, row) - // - // Render partial row - // - - SocialCalc.TCTDragFunctionRowSetStatus = function (draginfo, editor, row) { - var scc = SocialCalc.Constants; - var msg = scc.s_TCTDFthumbstatusPrefixv + row + " "; - - draginfo.thumbstatus.rowmsgele.innerHTML = msg; - - draginfo.thumbcontext.rowpanes = [{ first: row, last: row }]; - draginfo.thumbrowshown = row; - - var ele = draginfo.thumbcontext.RenderSheet( - draginfo.thumbstatus.rowpreviewele.firstChild, - { type: "html" } - ); - }; - - // - // TCTDragFunctionMove(event, draginfo, dobj) - // - - SocialCalc.TCTDragFunctionMove = function (event, draginfo, dobj) { - var first, msg; - var control = dobj.functionobj.control; - var thumbthickness = control.thumbthickness; - var editor = control.editor; - var scc = SocialCalc.Constants; - - if (dobj.vertical) { - if ( - draginfo.clientY > - control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2 - ) - draginfo.clientY = - control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2; - if (draginfo.clientY < control.scrollareastart - draginfo.offsetY - 1) - draginfo.clientY = control.scrollareastart - draginfo.offsetY - 1; - draginfo.thumbstatus.style.top = draginfo.clientY + "px"; - - first = - ((draginfo.clientY + draginfo.offsetY - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastrow - - editor.lastnonscrollingrow) + - editor.lastnonscrollingrow + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) - first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) - first = editor.context.sheetobj.attribs.lastrow; - // msg = scc.s_TCTDFthumbstatusPrefixv+first; - if (first != draginfo.thumbrowshown) { - SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, first); - } - } else { - if ( - draginfo.clientX > - control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2 - ) - draginfo.clientX = - control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2; - if (draginfo.clientX < control.scrollareastart - draginfo.offsetX - 1) - draginfo.clientX = control.scrollareastart - draginfo.offsetX - 1; - draginfo.thumbstatus.style.left = draginfo.clientX + "px"; - - first = - ((draginfo.clientX + draginfo.offsetX - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastcol - - editor.lastnonscrollingcol) + - editor.lastnonscrollingcol + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) - first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) - first = editor.context.sheetobj.attribs.lastcol; - msg = scc.s_TCTDFthumbstatusPrefixh + SocialCalc.rcColname(first); - draginfo.thumbstatus.innerHTML = msg; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - }; - - // - // TCTDragFunctionStop(event, draginfo, dobj) - // - - SocialCalc.TCTDragFunctionStop = function (event, draginfo, dobj) { - var first; - var control = dobj.functionobj.control; - var editor = control.editor; - - if (dobj.vertical) { - first = - ((draginfo.clientY + draginfo.offsetY - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastrow - - editor.lastnonscrollingrow) + - editor.lastnonscrollingrow + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) - first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) - first = editor.context.sheetobj.attribs.lastrow; - - editor.context.SetRowPaneFirstLast( - editor.context.rowpanes.length - 1, - first, - first + 1 - ); - } else { - first = - ((draginfo.clientX + draginfo.offsetX - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastcol - - editor.lastnonscrollingcol) + - editor.lastnonscrollingcol + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) - first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) - first = editor.context.sheetobj.attribs.lastcol; - - editor.context.SetColPaneFirstLast( - editor.context.colpanes.length - 1, - first, - first + 1 - ); - } - - editor.FitToEditTable(); - - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) - draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - - editor.ScheduleRender(); - }; - - // ************************************* - // - // Dragging functions: - // - // ************************************* - - SocialCalc.DragInfo = { - // There is only one of these -- no "new" is done. - // Only one dragging operation can be active at a time. - // The registeredElements array is used to decide which item to drag. - - // One item for each draggable thing, each an object with: - // .element, .vertical, .horizontal, .functionobj - - registeredElements: [], - - // Items used during a drag - - draggingElement: null, // item being processed (.element is the actual element) - startX: 0, - startY: 0, - startZ: 0, - clientX: 0, // modifyable version to restrict movement - clientY: 0, - offsetX: 0, - offsetY: 0, - horizontalScroll: 0, // retrieved at drag start - verticalScroll: 0, - }; - - // - // DragRegister(element, vertical, horizontal, functionobj) - make element draggable - // - // The functionobj defaults to moving the element contrained only by vertical and horizontal settings. - // - - SocialCalc.DragRegister = function ( - element, - vertical, - horizontal, - functionobj - ) { - var draginfo = SocialCalc.DragInfo; - - if (!functionobj) { - functionobj = { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - }; - } - - draginfo.registeredElements.push({ - element: element, - vertical: vertical, - horizontal: horizontal, - functionobj: functionobj, - }); - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.DragMouseDown, false); - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousedown", SocialCalc.DragMouseDown); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - }; - - // - // DragUnregister(element) - remove object from list - // - - SocialCalc.DragUnregister = function (element) { - var draginfo = SocialCalc.DragInfo; - - var i; - - if (!element) return; - - for (i = 0; i < draginfo.registeredElements.length; i++) { - if (draginfo.registeredElements[i].element == element) { - draginfo.registeredElements.splice(i, 1); - if (element.removeEventListener) { - // DOM Level 2 -- Firefox, et al - element.removeEventListener( - "mousedown", - SocialCalc.DragMouseDown, - false - ); - } else { - // IE 5+ - element.detachEvent("onmousedown", SocialCalc.DragMouseDown); - } - return; - } - } - - return; // ignore if not in list - }; - - // - // DragMouseDown(event) - // - - SocialCalc.DragMouseDown = function (event) { - var e = event || window.event; - - var draginfo = SocialCalc.DragInfo; - - var dobj = SocialCalc.LookupElement( - e.target || e.srcElement, - draginfo.registeredElements - ); - if (!dobj) return; - - if (dobj && dobj.functionobj && dobj.functionobj.Disabled) { - if (dobj.functionobj.Disabled(e, draginfo, dobj)) { - return; - } - } - - draginfo.draggingElement = dobj; - - var viewportinfo = SocialCalc.GetViewportInfo(); - draginfo.horizontalScroll = viewportinfo.horizontalScroll; - draginfo.verticalScroll = viewportinfo.verticalScroll; - - draginfo.clientX = e.clientX + draginfo.horizontalScroll; // get document-relative coordinates - draginfo.clientY = e.clientY + draginfo.verticalScroll; - draginfo.startX = draginfo.clientX; - draginfo.startY = draginfo.clientY; - draginfo.startZ = dobj.element.style.zIndex; - draginfo.offsetX = 0; - draginfo.offsetY = 0; - - dobj.element.style.zIndex = "100"; - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener("mousemove", SocialCalc.DragMouseMove, true); // capture everywhere - document.addEventListener("mouseup", SocialCalc.DragMouseUp, true); - } else if (dobj.element.attachEvent) { - // IE 5+ - dobj.element.setCapture(); - dobj.element.attachEvent("onmousemove", SocialCalc.DragMouseMove); - dobj.element.attachEvent("onmouseup", SocialCalc.DragMouseUp); - dobj.element.attachEvent("onlosecapture", SocialCalc.DragMouseUp); - } - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - if (dobj && dobj.functionobj && dobj.functionobj.MouseDown) - dobj.functionobj.MouseDown(e, draginfo, dobj); - - return false; - }; - - // - // DragMouseMove(event) - // - - SocialCalc.DragMouseMove = function (event) { - var e = event || window.event; - - var draginfo = SocialCalc.DragInfo; - draginfo.clientX = e.clientX + draginfo.horizontalScroll; - draginfo.clientY = e.clientY + draginfo.verticalScroll; - - var dobj = draginfo.draggingElement; - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - - if (dobj && dobj.functionobj && dobj.functionobj.MouseMove) - dobj.functionobj.MouseMove(e, draginfo, dobj); - - return false; - }; - - // - // DragMouseUp(event) - // - - SocialCalc.DragMouseUp = function (event) { - var e = event || window.event; - - var draginfo = SocialCalc.DragInfo; - draginfo.clientX = e.clientX + draginfo.horizontalScroll; - draginfo.clientY = e.clientY + draginfo.verticalScroll; - - var dobj = draginfo.draggingElement; - - dobj.element.style.zIndex = draginfo.startZ; - - if (dobj && dobj.functionobj && dobj.functionobj.MouseUp) - dobj.functionobj.MouseUp(e, draginfo, dobj); - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.DragMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.DragMouseUp, true); - // Note: In old (1.5?) versions of Firefox, this causes the browser to skip the MouseUp for - // the button code. https://bugzilla.mozilla.org/show_bug.cgi?id=174320 - // Firefox 1.5 is <1% share (http://marketshare.hitslink.com/report.aspx?qprid=7) - } else if (dobj.element.detachEvent) { - // IE - dobj.element.detachEvent("onlosecapture", SocialCalc.DragMouseUp); - dobj.element.detachEvent("onmouseup", SocialCalc.DragMouseUp); - dobj.element.detachEvent("onmousemove", SocialCalc.DragMouseMove); - dobj.element.releaseCapture(); - } - - draginfo.draggingElement = null; - - return false; - }; - - // - // DragFunctionStart(event, draginfo, dobj) - // - - SocialCalc.DragFunctionStart = function (event, draginfo, dobj) { - var val; - var element = dobj.functionobj.positionobj || dobj.element; - - val = element.style.top.match(/\d*/); - draginfo.offsetY = (val ? val[0] - 0 : 0) - draginfo.clientY; - val = element.style.left.match(/\d*/); - draginfo.offsetX = (val ? val[0] - 0 : 0) - draginfo.clientX; - }; - - // - // DragFunctionPosition(event, draginfo, dobj) - // - - SocialCalc.DragFunctionPosition = function (event, draginfo, dobj) { - var element = dobj.functionobj.positionobj || dobj.element; - - if (dobj.vertical) - element.style.top = draginfo.clientY + draginfo.offsetY + "px"; - if (dobj.horizontal) - element.style.left = draginfo.clientX + draginfo.offsetX + "px"; - }; - - // ************************************* - // - // Tooltip functions: - // - // ************************************* - - SocialCalc.TooltipInfo = { - // There is only one of these -- no "new" is done. - // Only one tooltip operation can be active at a time. - // The registeredElements array is used to identify items. - - // One item for each element with a tooltip, each an object with: - // .element, .tiptext, .functionobj - // Currently .functionobj can only contain .offsetx and .offsety. - // If present they are used instead of the default ones. - - registeredElements: [], - - registered: false, // if true, an event handler has been registered for this functionality - - // Items used during hover over an element - - tooltipElement: null, // item being processed (.element is the actual element) - timer: null, // timer object waiting to see if holding over element - popupElement: null, // tooltip element being displayed - clientX: 0, // modifyable version to restrict movement - clientY: 0, - offsetX: SocialCalc.Constants.TooltipOffsetX, // modifyable version to allow positioning - offsetY: SocialCalc.Constants.TooltipOffsetY, - }; - - // - // TooltipRegister(element, tiptext, functionobj) - make element have a tooltip - // - - SocialCalc.TooltipRegister = function (element, tiptext, functionobj) { - var tooltipinfo = SocialCalc.TooltipInfo; - tooltipinfo.registeredElements.push({ - element: element, - tiptext: tiptext, - functionobj: functionobj, - }); - - if (tooltipinfo.registered) return; // only need to add event listener once - - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.TooltipMouseMove, - false - ); - } else if (document.attachEvent) { - // IE 5+ - document.attachEvent("onmousemove", SocialCalc.TooltipMouseMove); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - tooltipinfo.registered = true; // remember - - return; - }; - - // - // TooltipMouseMove(event) - // - - SocialCalc.TooltipMouseMove = function (event) { - var e = event || window.event; - - var tooltipinfo = SocialCalc.TooltipInfo; - - tooltipinfo.viewport = SocialCalc.GetViewportInfo(); - tooltipinfo.clientX = e.clientX + tooltipinfo.viewport.horizontalScroll; - tooltipinfo.clientY = e.clientY + tooltipinfo.viewport.verticalScroll; - - var tobj = SocialCalc.LookupElement( - e.target || e.srcElement, - tooltipinfo.registeredElements - ); - - if (tooltipinfo.timer) { - // waiting to see if holding still: didn't hold still - window.clearTimeout(tooltipinfo.timer); // cancel timer - tooltipinfo.timer = null; - } - - if (tooltipinfo.popupElement) { - // currently displaying a tip: hide it - SocialCalc.TooltipHide(); - } - - tooltipinfo.tooltipElement = tobj || null; - - if (!tobj || SocialCalc.ButtonInfo.buttonDown) return; // if not an object with a tip or a "button" is down, ignore - - tooltipinfo.timer = window.setTimeout(SocialCalc.TooltipWaitDone, 700); - - if (tooltipinfo.tooltipElement.element.addEventListener) { - // Register event for mouse down which cancels tooltip stuff - tooltipinfo.tooltipElement.element.addEventListener( - "mousedown", - SocialCalc.TooltipMouseDown, - false - ); - } else if (tooltipinfo.tooltipElement.element.attachEvent) { - // IE - tooltipinfo.tooltipElement.element.attachEvent( - "onmousedown", - SocialCalc.TooltipMouseDown - ); - } - - return; - }; - - // - // TooltipMouseDown(event) - // - - SocialCalc.TooltipMouseDown = function (event) { - var e = event || window.event; - - var tooltipinfo = SocialCalc.TooltipInfo; - - if (tooltipinfo.timer) { - window.clearTimeout(tooltipinfo.timer); // cancel timer - tooltipinfo.timer = null; - } - - if (tooltipinfo.popupElement) { - // currently displaying a tip: hide it - SocialCalc.TooltipHide(); - } - - if (tooltipinfo.tooltipElement) { - if (tooltipinfo.tooltipElement.element.removeEventListener) { - // DOM Level 2 -- Firefox, et al - tooltipinfo.tooltipElement.element.removeEventListener( - "mousedown", - SocialCalc.TooltipMouseDown, - false - ); - } else if (tooltipinfo.tooltipElement.element.attachEvent) { - // IE 5+ - tooltipinfo.tooltipElement.element.detachEvent( - "onmousedown", - SocialCalc.TooltipMouseDown - ); - } - tooltipinfo.tooltipElement = null; - } - - return; - }; - - // - // TooltipDisplay(tobj) - // - - SocialCalc.TooltipDisplay = function (tobj) { - var tooltipinfo = SocialCalc.TooltipInfo; - var scc = SocialCalc.Constants; - var offsetX = - tobj.functionobj && typeof tobj.functionobj.offsetx == "number" - ? tobj.functionobj.offsetx - : tooltipinfo.offsetX; - var offsetY = - tobj.functionobj && typeof tobj.functionobj.offsety == "number" - ? tobj.functionobj.offsety - : tooltipinfo.offsetY; - - tooltipinfo.popupElement = document.createElement("div"); - if (scc.TDpopupElementClass) - tooltipinfo.popupElement.className = scc.TDpopupElementClass; - SocialCalc.setStyles(tooltipinfo.popupElement, scc.TDpopupElementStyle); - - tooltipinfo.popupElement.innerHTML = tobj.tiptext; - - if (tooltipinfo.clientX > tooltipinfo.viewport.width / 2) { - // on right side of screen - tooltipinfo.popupElement.style.bottom = - tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY + "px"; - tooltipinfo.popupElement.style.right = - tooltipinfo.viewport.width - tooltipinfo.clientX + offsetX + "px"; - } else { - // on left side of screen - tooltipinfo.popupElement.style.bottom = - tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY + "px"; - tooltipinfo.popupElement.style.left = - tooltipinfo.clientX + offsetX + "px"; - } - - if (tooltipinfo.clientY < 50) { - // make sure fits on screen if nothing above grid - tooltipinfo.popupElement.style.bottom = - tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY - 50 + "px"; - } - - document.body.appendChild(tooltipinfo.popupElement); - }; - - // - // TooltipHide() - // - - SocialCalc.TooltipHide = function () { - var tooltipinfo = SocialCalc.TooltipInfo; - - if (tooltipinfo.popupElement) { - tooltipinfo.popupElement.parentNode.removeChild(tooltipinfo.popupElement); - tooltipinfo.popupElement = null; - } - }; - - // - // TooltipWaitDone() - // - - SocialCalc.TooltipWaitDone = function () { - var tooltipinfo = SocialCalc.TooltipInfo; - - tooltipinfo.timer = null; - - SocialCalc.TooltipDisplay(tooltipinfo.tooltipElement); - }; - - // ************************************* - // - // Button functions: - // - // ************************************* - - SocialCalc.ButtonInfo = { - // There is only one of these -- no "new" is done. - // Only one button operation can be active at a time. - // The registeredElements array is used to identify items. - - // One item for each clickable element, each an object with: - // .element, .normalstyle, .hoverstyle, .downstyle, .repeatinterval, .functionobj - // - // .functionobj is an object with optional function objects for: - // mouseover, mouseout, mousedown, repeatinterval, mouseup, disabled - - registeredElements: [], - - // Items used during hover over an element, clicking, repeating, etc. - - buttonElement: null, // item being processed, hover or down (.element is the actual element) - doingHover: false, // true if mouse is over one of our elements - buttonDown: false, // true if button down and buttonElement not null - timer: null, // timer object for repeating - - // Used while processing an event - - horizontalScroll: 0, - verticalScroll: 0, - clientX: 0, - clientY: 0, - }; - - // - // ButtonRegister(element, paramobj, functionobj) - make element clickable - // - // The arguments (other than element) may be null (meaning no change for style and no repeat) - // The paramobj has the optional normalstyle, hoverstyle, downstyle, repeatwait, repeatinterval settings - - SocialCalc.ButtonRegister = function (element, paramobj, functionobj) { - var buttoninfo = SocialCalc.ButtonInfo; - - if (!paramobj) paramobj = {}; - - buttoninfo.registeredElements.push({ - name: paramobj.name, - element: element, - normalstyle: paramobj.normalstyle, - hoverstyle: paramobj.hoverstyle, - downstyle: paramobj.downstyle, - repeatwait: paramobj.repeatwait, - repeatinterval: paramobj.repeatinterval, - functionobj: functionobj, - }); - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.ButtonMouseDown, false); - element.addEventListener("mouseover", SocialCalc.ButtonMouseOver, false); - element.addEventListener("mouseout", SocialCalc.ButtonMouseOut, false); - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousedown", SocialCalc.ButtonMouseDown); - element.attachEvent("onmouseover", SocialCalc.ButtonMouseOver); - element.attachEvent("onmouseout", SocialCalc.ButtonMouseOut); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - }; - - // - // ButtonMouseOver(event) - // - - SocialCalc.ButtonMouseOver = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var bobj = SocialCalc.LookupElement( - e.target || e.srcElement, - buttoninfo.registeredElements - ); - - if (!bobj) return; - - if (buttoninfo.buttonDown) { - if (buttoninfo.buttonElement == bobj) { - buttoninfo.doingHover = true; // keep track whether we are on the pressed button or not - } - return; - } - - if ( - buttoninfo.buttonElement && - buttoninfo.buttonElement != bobj && - buttoninfo.doingHover - ) { - // moved to a new one, undo hover there - SocialCalc.setStyles( - buttoninfo.buttonElement.element, - buttoninfo.buttonElement.normalstyle - ); - } - - buttoninfo.buttonElement = bobj; // remember this one is hovering - buttoninfo.doingHover = true; - - SocialCalc.setStyles(bobj.element, bobj.hoverstyle); // set style (if provided) - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOver) - bobj.functionobj.MouseOver(e, buttoninfo, bobj); - - return; - }; - - // - // ButtonMouseOut(event) - // - - SocialCalc.ButtonMouseOut = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - if (buttoninfo.buttonDown) { - buttoninfo.doingHover = false; // keep track of overs and outs - return; - } - - var bobj = SocialCalc.LookupElement( - e.target || e.srcElement, - buttoninfo.registeredElements - ); - - if (buttoninfo.doingHover) { - // if there was a hover, undo it - if (buttoninfo.buttonElement) - SocialCalc.setStyles( - buttoninfo.buttonElement.element, - buttoninfo.buttonElement.normalstyle - ); - buttoninfo.buttonElement = null; - buttoninfo.doingHover = false; - } - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOut) - bobj.functionobj.MouseOut(e, buttoninfo, bobj); - - return; - }; - - // - // ButtonMouseDown(event) - // - - SocialCalc.ButtonMouseDown = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var viewportinfo = SocialCalc.GetViewportInfo(); - - var bobj = SocialCalc.LookupElement( - e.target || e.srcElement, - buttoninfo.registeredElements - ); - - if (!bobj) return; // not one of our elements - - if (bobj && bobj.functionobj && bobj.functionobj.Disabled) { - if (bobj.functionobj.Disabled(e, buttoninfo, bobj)) { - return; - } - } - - buttoninfo.buttonElement = bobj; - buttoninfo.buttonDown = true; - - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.downstyle); - - // Register event handler for mouse up - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener("mouseup", SocialCalc.ButtonMouseUp, true); // capture everywhere - } else if (bobj.element.attachEvent) { - // IE 5+ - bobj.element.setCapture(); - bobj.element.attachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.attachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - } - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - buttoninfo.horizontalScroll = viewportinfo.horizontalScroll; - buttoninfo.verticalScroll = viewportinfo.verticalScroll; - buttoninfo.clientX = e.clientX + buttoninfo.horizontalScroll; // get document-relative coordinates - buttoninfo.clientY = e.clientY + buttoninfo.verticalScroll; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseDown) - bobj.functionobj.MouseDown(e, buttoninfo, bobj); - - if (bobj.repeatwait) { - // if a repeat wait is set, then starting waiting for first repetition - buttoninfo.timer = window.setTimeout( - SocialCalc.ButtonRepeat, - bobj.repeatwait - ); - } - - return; - }; - - // - // ButtonMouseUp(event) - // - - SocialCalc.ButtonMouseUp = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (buttoninfo.timer) { - // if repeating, cancel it - window.clearTimeout(buttoninfo.timer); // cancel timer - buttoninfo.timer = null; - } - - if (!buttoninfo.buttonDown) return; // already did this (e.g., in IE, releaseCapture fires losecapture) - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener("mouseup", SocialCalc.ButtonMouseUp, true); - } else if (document.detachEvent) { - // IE - bobj.element.detachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - bobj.element.detachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.releaseCapture(); - } - - if (buttoninfo.buttonElement.downstyle) { - if (buttoninfo.doingHover) - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.hoverstyle); - else - SocialCalc.setStyles( - bobj.element, - buttoninfo.buttonElement.normalstyle - ); - } - - buttoninfo.buttonDown = false; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseUp) - bobj.functionobj.MouseUp(e, buttoninfo, bobj); - }; - - // - // ButtonRepeat() - // - - SocialCalc.ButtonRepeat = function () { - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (!bobj) return; - - if (bobj && bobj.functionobj && bobj.functionobj.Repeat) - bobj.functionobj.Repeat(null, buttoninfo, bobj); - - buttoninfo.timer = window.setTimeout( - SocialCalc.ButtonRepeat, - bobj.repeatinterval || 100 - ); - }; - - // ************************************* - // - // MouseWheel functions: - // - // ************************************* - - SocialCalc.MouseWheelInfo = { - // There is only one of these -- no "new" is done. - // The mousewheel only affects the one area the mouse pointer is over - // The registeredElements array is used to identify items. - - // One item for each element to respond to the mousewheel, each an object with: - // .element, .functionobj - - registeredElements: [], - }; - - // - // MouseWheelRegister(element, functionobj) - make element respond to mousewheel - // - - SocialCalc.MouseWheelRegister = function (element, functionobj) { - var mousewheelinfo = SocialCalc.MouseWheelInfo; - - mousewheelinfo.registeredElements.push({ - element: element, - functionobj: functionobj, - }); - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener( - "DOMMouseScroll", - SocialCalc.ProcessMouseWheel, - false - ); - element.addEventListener( - "mousewheel", - SocialCalc.ProcessMouseWheel, - false - ); // Opera needs this - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousewheel", SocialCalc.ProcessMouseWheel); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - }; - - SocialCalc.ProcessMouseWheel = function (e) { - var event = e || window.event; - var delta, coord; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - var mousewheelinfo = SocialCalc.MouseWheelInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var wobj; - - for (wobj = null; !wobj && ele; ele = ele.parentNode) { - // go up tree looking for one of our elements - wobj = SocialCalc.LookupElement(ele, mousewheelinfo.registeredElements); - } - if (!wobj) return; // not one of our elements - - if (event.wheelDelta) { - delta = event.wheelDelta / 120; - } else delta = -event.detail / 3; - if (!delta) delta = 0; - - if (wobj.functionobj && wobj.functionobj.WheelMove) - wobj.functionobj.WheelMove(event, delta, mousewheelinfo, wobj); - - if (event.preventDefault) event.preventDefault(); - event.returnValue = false; - }; - - // ************************************* - // - // Keyboard functions: - // - // For more information about keyboard handling, see: http://unixpapa.com/js/key.html - // - // ************************************* - - SocialCalc.keyboardTables = { - specialKeysCommon: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", - 46: "[del]", - 113: "[f2]", - }, - - specialKeysIE: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", - 46: "[del]", - 113: "[f2]", - }, - - controlKeysIE: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]", - }, - - specialKeysOpera: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", // issues with releases before 9.5 - same as "-" ("-" changed in 9.5) - 46: "[del]", // issues with releases before 9.5 - same as "." ("." changed in 9.5) - 113: "[f2]", - }, - - controlKeysOpera: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]", - }, - - specialKeysSafari: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 63232: "[aup]", - 63233: "[adown]", - 63234: "[aleft]", - 63235: "[aright]", - 63272: "[del]", - 63273: "[home]", - 63275: "[end]", - 63276: "[pgup]", - 63277: "[pgdn]", - 63237: "[f2]", - }, - - controlKeysSafari: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]", - }, - - ignoreKeysSafari: { - 63236: "[f1]", - 63238: "[f3]", - 63239: "[f4]", - 63240: "[f5]", - 63241: "[f6]", - 63242: "[f7]", - 63243: "[f8]", - 63244: "[f9]", - 63245: "[f10]", - 63246: "[f11]", - 63247: "[f12]", - 63289: "[numlock]", - }, - - specialKeysFirefox: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", - 46: "[del]", - 113: "[f2]", - }, - - controlKeysFirefox: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]", - }, - - ignoreKeysFirefox: { - 16: "[shift]", - 17: "[ctrl]", - 18: "[alt]", - 20: "[capslock]", - 19: "[pause]", - 44: "[printscreen]", - 91: "[windows]", - 92: "[windows]", - 112: "[f1]", - 114: "[f3]", - 115: "[f4]", - 116: "[f5]", - 117: "[f6]", - 118: "[f7]", - 119: "[f8]", - 120: "[f9]", - 121: "[f10]", - 122: "[f11]", - 123: "[f12]", - 144: "[numlock]", - 145: "[scrolllock]", - 224: "[cmd]", - }, - }; - - SocialCalc.Keyboard = { - areListener: false, // if true, we have been installed as a listener for keyboard events - focusTable: null, // the table editor object that gets keystrokes or null - passThru: null, // if not null, control element with focus to pass keyboard events to (has blur method), or "true" - didProcessKey: false, // did SocialCalc.ProcessKey in keydown - statusFromProcessKey: false, // the status from the keydown SocialCalc.ProcessKey - repeatingKeyPress: false, // some browsers (Opera, Gecko Mac) repeat special keys as KeyPress not KeyDown - chForProcessKey: "", // remember so can do repeat in those cases - }; - - SocialCalc.KeyboardSetFocus = function (editor) { - SocialCalc.Keyboard.focusTable = editor; - - if (!SocialCalc.Keyboard.areListener) { - document.onkeydown = SocialCalc.ProcessKeyDown; - document.onkeypress = SocialCalc.ProcessKeyPress; - SocialCalc.Keyboard.areListener = true; - } - if (SocialCalc.Keyboard.passThru) { - if (SocialCalc.Keyboard.passThru.blur) { - SocialCalc.Keyboard.passThru.blur(); - } - SocialCalc.Keyboard.passThru = null; - } - window.focus(); - }; - - SocialCalc.KeyboardFocus = function () { - SocialCalc.Keyboard.passThru = null; - window.focus(); - }; - - SocialCalc.ProcessKeyDown = function (e) { - var kt = SocialCalc.keyboardTables; - kt.didProcessKey = false; // always start false - kt.statusFromProcessKey = false; - kt.repeatingKeyPress = false; - - var ch = ""; - var status = true; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - // IE and Safari 3.1+ won't fire keyPress, so check for special keys here. - if (e.which == undefined || typeof e.keyIdentifier == "string") { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { - if (e.ctrlKey) { - ch = kt.controlKeysIE[e.keyCode]; - } - if (!ch) return true; - } - status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - } else { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { - // return true; - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysIE[e.keyCode]; // this works here - } - if (!ch) return true; - } - - status = SocialCalc.ProcessKey(ch, e); // process the key - kt.didProcessKey = true; // remember what happened - kt.statusFromProcessKey = status; - kt.chForProcessKey = ch; - } - - return status; - }; - - SocialCalc.ProcessKeyPress = function (e) { - var kt = SocialCalc.keyboardTables; - - var ch = ""; - - e = e || window.event; - - if (SocialCalc.Keyboard.passThru) return; // ignore - if (kt.didProcessKey) { - // already processed this key - if (kt.repeatingKeyPress) { - return SocialCalc.ProcessKey(kt.chForProcessKey, e); // process the same key as on KeyDown - } else { - kt.repeatingKeyPress = true; // see if get another KeyPress before KeyDown - return kt.statusFromProcessKey; // do what it said to do - } - } - - if (e.which == undefined) { - // IE - // Note: Esc and Enter will come through here, too, if not stopped at KeyDown - ch = String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) - } else { - // not IE - if (!e.which) return false; // ignore - special key - if (e.charCode == undefined) { - // Opera - if (e.which != 0) { - // character - if (e.which < 32 || e.which == 144) { - // special char (144 is numlock) - ch = kt.specialKeysOpera[e.which]; - if (ch) { - return true; - } - } else { - if (e.ctrlKey) { - ch = kt.controlKeysOpera[e.keyCode]; - } else { - ch = String.fromCharCode(e.which); - } - } - } else { - // special char - return true; - } - } else if (e.keyCode == 0 && e.charCode == 0) { - // OLPC Fn key or something - return; // ignore - } else if (e.keyCode == e.charCode) { - // Safari - ch = kt.specialKeysSafari[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysSafari[e.keyCode]) - // pass this through - return true; - if (e.metaKey) { - ch = kt.controlKeysSafari[e.keyCode]; - } else { - ch = String.fromCharCode(e.which); - } - } - } else { - // Firefox - if (kt.specialKeysFirefox[e.keyCode]) { - return true; - } - ch = String.fromCharCode(e.which); - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysFirefox[e.which]; - } - } - } - - var status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - - return status; - }; - - /* -* -* OLD ProcessKeyDown and ProcessKeyPress -- replaced for handling newer browsers, including Safari 3.1 and Opera 9.5 -* - -SocialCalc.ProcessKeyDown = function(e) { - -var kt = SocialCalc.keyboardTables; - -var ch=""; -var status=true; - -if (SocialCalc.Keyboard.passThru) return; // ignore - -e = e || window.event; - -if (e.which==undefined) { // IE -ch = kt.specialKeysIE[e.keyCode]; -if (!ch) { -if (e.ctrlKey) { -ch=kt.controlKeysIE[e.keyCode]; -} -if (!ch) -return true; -} - -status = SocialCalc.ProcessKey(ch, e); - -if (!status) { -if (e.preventDefault) e.preventDefault(); -e.returnValue = false; -} -} - -else { // don't do anything for other browsers - wait for keyPress -; // special key repeats are done as keypress in those browsers -} - -return status; - -} - -SocialCalc.ProcessKeyPress = function(e) { - -var kt = SocialCalc.keyboardTables; - -var ch=""; - -if (SocialCalc.Keyboard.passThru) return; // ignore - -e = e || window.event; - -if (e.which==undefined) { // IE -// Note: Esc and Enter will come through here, too, if not stopped at KeyDown -ch=String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) -} - -else { // not IE -if (e.charCode==undefined) { // Opera -if (e.which!=0) { // character -if (e.which<32) { // special char -ch = kt.specialKeysOpera[e.keyCode]; -if (!ch) -return true; -} -else { -if (e.ctrlKey) { -ch=kt.controlKeysOpera[e.keyCode]; -} -else { -ch = String.fromCharCode(e.which); -} -} -} -else { // special char -ch = kt.specialKeysOpera[e.keyCode]; -if (!ch) -return true; -} -} - -else if (e.keyCode==0 && e.charCode==0) { // OLPC Fn key or something -return; // ignore -} - -else if (e.keyCode==e.charCode) { // Safari -ch = kt.specialKeysSafari[e.keyCode]; -if (!ch) { -if (kt.ignoreKeysSafari[e.keyCode]) // pass this through -return true; -if (e.metaKey) { -ch=kt.controlKeysSafari[e.keyCode]; -} -else { -ch = String.fromCharCode(e.which); -} -} -} - -else { // Firefox -ch = kt.specialKeysFirefox[e.keyCode]; -if (!ch) { -if (kt.ignoreKeysFirefox[e.keyCode]) // pass this through -return true; -if (e.which) { // normal char -if (e.ctrlKey || e.metaKey) { -ch = kt.controlKeysFirefox[e.which]; -} -else { -ch = String.fromCharCode(e.which); -} -} -else { // usually a special char -return true; // old Firefox gives extra, empty keyPress for "/" - ignore -} -} -} -} - -var status = SocialCalc.ProcessKey(ch, e); - -if (!status) { -if (e.preventDefault) e.preventDefault(); -e.returnValue = false; -} - -return status; - -} -*/ - - // - // status = SocialCalc.ProcessKey(ch, e) - // - // Take a key representation as a character string and dispatch to appropriate routine - // - - SocialCalc.ProcessKey = function (ch, e) { - var ft = SocialCalc.Keyboard.focusTable; - - if (!ft) return true; // we're not handling it -- let browser do default - - return ft.EditorProcessKey(ch, e); - }; - - // For Contact - SocialCalc.EditorChangecontact = function ( - editor, - text, - name, - phone, - email, - street, - city, - company, - val - ) { - // alert('changecontact called'); - //var wval = editor.workingvalues; - if (name != "") { - cmdline = "set " + name + " " + "text t" + " " + contactname; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - cmdline = "set " + phone + " " + "text t" + " " + contactphoneNumber; - editor.EditorScheduleSheetCommands(cmdline, true, false); - if (email != "") { - cmdline = "set " + email + " " + "text t" + " " + contactemail; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - cmdline = "set " + street + " " + "text t" + " " + contactStreet; - editor.EditorScheduleSheetCommands(cmdline, true, false); - cmdline = "set " + city + " " + "text t" + " " + contactcity; - editor.EditorScheduleSheetCommands(cmdline, true, false); - if (val == "y") { - cmdline = "set " + company + " " + "text t" + " " + contactcompany; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - - return; - }; - - //changes by mini for font and color - - SocialCalc.EditorChangeSheetcolor = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - type = "text t"; - //value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - value = text; - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord) + ""; - if (value == oldvalue) { - // no change - return; - } - fch = value.charAt(0); - if (fch == "=" && value.indexOf("\n") == -1) { - type = "formula"; - value = value.substring(1); - } else if (fch == "'") { - type = "text t"; - value = value.substring(1); - } else if (value.length == 0) { - type = "empty"; - } else { - valueinfo = SocialCalc.DetermineValueType(value); - if (valueinfo.type == "n" && value == valueinfo.value + "") { - // see if don't need "constant" - type = "value n"; - } else if (valueinfo.type.charAt(0) == "t") { - type = "text " + valueinfo.type; - } else if (valueinfo.type == "") { - type = "text t"; - } else { - type = "constant " + valueinfo.type + " " + valueinfo.value; - } - } - - if (type.charAt(0) == "t") { - // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - //cmdline = "set "+wval.ecoord+" "+"font"+" "+value; - cmdline = "set " + "sheet" + " " + "defaultcolor" + " " + value; - //cmdline = "set "+"sheet"+" "+"defaultcolor green"; - //var control = SocialCalc.GetCurrentWorkBookControl(); - //alert('u reach sheet' + " "+control.workbook.sheetArr["sheet1"].sheet); - //cmdline = "set "+sheetobj+" "+"font"+" "+value; - //cmdline="set "+ control.workbook.sheetArr["sheet1"].sheet+" color blue" ; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - }; - - SocialCalc.EditorChangecolorFromWidget = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - if (!CoordForColorChange) { - alert("No active cell"); - return; - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - cmdline = "set " + CoordForColorChange + " " + "color" + " " + text; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - }; - - SocialCalc.EditorChangefontFromWidget = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - if (!CoordForColorChange) { - alert("No active cell"); - return; - } - //alert(CoordForColorChange); - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - //cmdline = "set "+CoordForColorChange+" "+"font"+" "+text; - //editor.EditorScheduleSheetCommands(cmdline, true, false); - var value = text; - if (value == "a") { - cmdline = "set " + CoordForColorChange + " font * 12px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "b") { - cmdline = "set " + CoordForColorChange + " font * 14px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "c") { - cmdline = "set " + CoordForColorChange + " font * 16px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "d") { - cmdline = "set " + CoordForColorChange + " font * 18px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - - return; - }; - - SocialCalc.EditorChangeSheetfont = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - type = "text t"; - //value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - value = text; - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord) + ""; - if (value == oldvalue) { - // no change - return; - } - fch = value.charAt(0); - if (fch == "=" && value.indexOf("\n") == -1) { - type = "formula"; - value = value.substring(1); - } else if (fch == "'") { - type = "text t"; - value = value.substring(1); - } else if (value.length == 0) { - type = "empty"; - } else { - valueinfo = SocialCalc.DetermineValueType(value); - if (valueinfo.type == "n" && value == valueinfo.value + "") { - // see if don't need "constant" - type = "value n"; - } else if (valueinfo.type.charAt(0) == "t") { - type = "text " + valueinfo.type; - } else if (valueinfo.type == "") { - type = "text t"; - } else { - type = "constant " + valueinfo.type + " " + valueinfo.value; - } - } - - if (type.charAt(0) == "t") { - // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - //cmdline = "set "+wval.ecoord+" "+"font"+" "+value; - //cmdline = "set "+"sheet"+" "+"defaultcolor"+" "+ value; - - //cmdline = "set "+"sheet"+" "+"defaultfont"+" * "+value+" *"; - - //cmdline = "set sheet defaultfont normal normal "+value +" *"; - //cmdline="set sheet defaultfont"; - // alert(cmdline); - //editor.EditorScheduleSheetCommands(cmdline, true, false); - if (value == "a") { - cmdline = "set sheet defaultfont * 12px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "b") { - cmdline = "set sheet defaultfont * 14px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "c") { - cmdline = "set sheet defaultfont * 16px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "d") { - cmdline = "set sheet defaultfont * 18px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - - //cmdline = ""+"set sheet defaultfont * 8pt *"; - //cmdline = "set "+"sheet"+" "+"defaultcolor green"; - //var control = SocialCalc.GetCurrentWorkBookControl(); - //alert('u reach sheet' + " "+control.workbook.sheetArr["sheet1"].sheet); - //cmdline = "set "+sheetobj+" "+"font"+" "+value; - //cmdline="set "+ control.workbook.sheetArr["sheet1"].sheet+" color blue" ; - - return; - }; - - SocialCalc.EditorCut = function (editor, value) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - if (value == "a") { - cmdline = "cut " + editCoord + " all"; - } else if (value == "b") { - cmdline = "copy " + editCoord + " all"; - } else if (value == "c") { - cmdline = "paste " + editCoord + " all"; - } else if (value == "d") { - cmdline = "erase " + editCoord + " formulas"; - } - editor.EditorScheduleSheetCommands(cmdline, true, false); - }; - - SocialCalc.EditorClearSheet = function (editor, cell_to_clear) { - //alert("clear"); - var cmdline; - var coord = cell_to_clear; - cmdline = "erase " + coord + " formulas"; - //console.log(cmdline); - editor.EditorScheduleSheetCommands(cmdline, true, false); - }; - - // - /* -// SocialCalc Number Formatting Library -// -// Part of the SocialCalc package. -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - - SocialCalc.FormatNumber = {}; - - SocialCalc.FormatNumber.format_definitions = {}; // Parsed formats are stored here globally - - // Most constants that are often customized for localization are in the SocialCalc.Constants module. - // If you use this module standalone, provide at least the "FormatNumber" values. - // - - // The following values may be customized externally for further localization of the format definitions themselves, - // but that would make them incompatible with other uses and is discouraged. - // - - SocialCalc.FormatNumber.separatorchar = ","; - SocialCalc.FormatNumber.decimalchar = "."; - SocialCalc.FormatNumber.daynames = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - ]; - SocialCalc.FormatNumber.daynames3 = [ - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - ]; - SocialCalc.FormatNumber.monthnames3 = [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - ]; - SocialCalc.FormatNumber.monthnames = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ]; - - SocialCalc.FormatNumber.allowedcolors = { - BLACK: "#000000", - BLUE: "#0000FF", - CYAN: "#00FFFF", - GREEN: "#00FF00", - MAGENTA: "#FF00FF", - RED: "#FF0000", - WHITE: "#FFFFFF", - YELLOW: "#FFFF00", - }; - - SocialCalc.FormatNumber.alloweddates = { - H: "h]", - M: "m]", - MM: "mm]", - S: "s]", - SS: "ss]", - }; - - // Other constants - - SocialCalc.FormatNumber.commands = { - copy: 1, - color: 2, - integer_placeholder: 3, - fraction_placeholder: 4, - decimal: 5, - currency: 6, - general: 7, - separator: 8, - date: 9, - comparison: 10, - section: 11, - style: 12, - }; - - SocialCalc.FormatNumber.datevalues = { - julian_offset: 2415019, - seconds_in_a_day: 24 * 60 * 60, - seconds_in_an_hour: 60 * 60, - }; - - /* ******************* - - result = SocialCalc.FormatNumber.formatNumberWithFormat = function(rawvalue, format_string, currency_char) - -************************* */ - - SocialCalc.FormatNumber.formatNumberWithFormat = function ( - rawvalue, - format_string, - currency_char - ) { - var scc = SocialCalc.Constants; - var scfn = SocialCalc.FormatNumber; - - var op, operandstr, fromend, cval, operandstrlc; - var startval, estartval; - var hrs, mins, secs, ehrs, emins, esecs, ampmstr, ymd; - var minOK, mpos; - var result = ""; - var thisformat; - var section, gotcomparison, compop, compval, cpos, oppos; - var sectioninfo; - var i, - decimalscale, - scaledvalue, - strvalue, - strparts, - integervalue, - fractionvalue; - var integerdigits2, - integerpos, - fractionpos, - textcolor, - textstyle, - separatorchar, - decimalchar; - var value; // working copy to change sign, etc. - var mspos; - rawvalue = rawvalue - 0; // make sure a number - value = rawvalue; - if (!isFinite(value)) return "NaN"; - - var negativevalue = value < 0 ? 1 : 0; // determine sign, etc. - if (negativevalue) value = -value; - var zerovalue = value == 0 ? 1 : 0; - - currency_char = currency_char || scc.FormatNumber_DefaultCurrency; - - scfn.parse_format_string(scfn.format_definitions, format_string); // make sure format is parsed - thisformat = scfn.format_definitions[format_string]; // Get format structure - - if (!thisformat) throw "Format not parsed error!"; - - section = thisformat.sectioninfo.length - 1; // get number of sections - 1 - - if (thisformat.hascomparison) { - // has comparisons - determine which section - section = 0; // set to which section we will use - gotcomparison = 0; // this section has no comparison - for (cpos = 0; ; cpos++) { - // scan for comparisons - op = thisformat.operators[cpos]; - operandstr = thisformat.operands[cpos]; // get next operator and operand - if (!op) { - // at end with no match - if (gotcomparison) { - // if comparison but no match - format_string = "General"; // use default of General - scfn.parse_format_string(scfn.format_definitions, format_string); - thisformat = scfn.format_definitions[format_string]; - section = 0; - } - break; // if no comparision, matches on this section - } - if (op == scfn.commands.section) { - // end of section - if (!gotcomparison) { - // no comparison, so it's a match - break; - } - gotcomparison = 0; - section++; // check out next one - continue; - } - if (op == scfn.commands.comparison) { - // found a comparison - do we meet it? - i = operandstr.indexOf(":"); - compop = operandstr.substring(0, i); - compval = operandstr.substring(i + 1) - 0; - if ( - (compop == "<" && rawvalue < compval) || - (compop == "<=" && rawvalue <= compval) || - (compop == "=" && rawvalue == compval) || - (compop == "<>" && rawvalue != compval) || - (compop == ">=" && rawvalue >= compval) || - (compop == ">" && rawvalue > compval) - ) { - // a match - break; - } - gotcomparison = 1; - } - } - } else if (section > 0) { - // more than one section (separated by ";") - if (section == 1) { - // two sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } else { - section = 0; // use first for all others - } - } else if (section == 2) { - // three sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } else if (zerovalue) { - section = 2; // use third section for zero values - } else { - section = 0; // use first for positive - } - } - } - - sectioninfo = thisformat.sectioninfo[section]; // look at values for our section - - if (sectioninfo.commas > 0) { - // scale by thousands - for (i = 0; i < sectioninfo.commas; i++) { - value /= 1000; - } - } - if (sectioninfo.percent > 0) { - // do percent scaling - for (i = 0; i < sectioninfo.percent; i++) { - value *= 100; - } - } - - decimalscale = 1; // cut down to required number of decimal digits - for (i = 0; i < sectioninfo.fractiondigits; i++) { - decimalscale *= 10; - } - scaledvalue = Math.floor(value * decimalscale + 0.5); - scaledvalue = scaledvalue / decimalscale; - - if (typeof scaledvalue != "number") return "NaN"; - if (!isFinite(scaledvalue)) return "NaN"; - - strvalue = scaledvalue + ""; // convert to string (Number.toFixed doesn't do all we need) - - // strvalue = value.toFixed(sectioninfo.fractiondigits); // cut down to required number of decimal digits - // and convert to string - - if ( - scaledvalue == 0 && - (sectioninfo.fractiondigits || sectioninfo.integerdigits) - ) { - negativevalue = 0; // no "-0" unless using multiple sections or General - } - - if (strvalue.indexOf("e") >= 0) { - // converted to scientific notation - return rawvalue + ""; // Just return plain converted raw value - } - - strparts = strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - if (!strparts) return "NaN"; // if not a number - integervalue = strparts[1]; - if (!integervalue || integervalue == "0") integervalue = ""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - - if (sectioninfo.hasdate) { - // there are date placeholders - if (rawvalue < 0) { - // bad date - return "??-???-?? ??:??:??"; - } - startval = - (rawvalue - Math.floor(rawvalue)) * scfn.datevalues.seconds_in_a_day; // get date/time parts - estartval = rawvalue * scfn.datevalues.seconds_in_a_day; // do elapsed time version, too - hrs = Math.floor(startval / scfn.datevalues.seconds_in_an_hour); - ehrs = Math.floor(estartval / scfn.datevalues.seconds_in_an_hour); - startval = startval - hrs * scfn.datevalues.seconds_in_an_hour; - mins = Math.floor(startval / 60); - emins = Math.floor(estartval / 60); - secs = startval - mins * 60; - decimalscale = 1; // round appropriately depending if there is ss.0 - for (i = 0; i < sectioninfo.fractiondigits; i++) { - decimalscale *= 10; - } - secs = Math.floor(secs * decimalscale + 0.5); - secs = secs / decimalscale; - esecs = Math.floor(estartval * decimalscale + 0.5); - esecs = esecs / decimalscale; - if (secs >= 60) { - // handle round up into next second, minute, etc. - secs = 0; - mins++; - emins++; - if (mins >= 60) { - mins = 0; - hrs++; - ehrs++; - if (hrs >= 24) { - hrs = 0; - rawvalue++; - } - } - } - fractionvalue = secs - Math.floor(secs) + ""; // for "hh:mm:ss.000" - fractionvalue = fractionvalue.substring(2); // skip "0." - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian( - Math.floor(rawvalue + scfn.datevalues.julian_offset) - ); - - minOK = 0; // says "m" can be minutes if true - var mspos = sectioninfo.sectionstart; // m scan position in ops - for (; ; mspos++) { - // scan for "m" and "mm" to see if any minutes fields, and am/pm - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op == scfn.commands.section) break; - if (op == scfn.commands.date) { - if ( - (operandstr.toLowerCase() == "am/pm" || - operandstr.toLowerCase() == "a/p") && - !ampmstr - ) { - if (hrs >= 12) { - hrs -= 12; - ampmstr = - operandstr.toLowerCase() == "a/p" - ? scc.s_FormatNumber_pm1 - : scc.s_FormatNumber_pm; // "P" : "PM"; - } else { - ampmstr = - operandstr.toLowerCase() == "a/p" - ? scc.s_FormatNumber_am1 - : scc.s_FormatNumber_am; // "A" : "AM"; - } - if (operandstr.indexOf(ampmstr) < 0) - ampmstr = ampmstr.toLowerCase(); // have case match case in format - } - if (minOK && (operandstr == "m" || operandstr == "mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr.charAt(0) == "h") { - minOK = 1; // m following h or hh or [h] is minutes not months - } else { - minOK = 0; - } - } else if (op != scfn.commands.copy) { - // copying chars can be between h and m - minOK = 0; - } - } - minOK = 0; - for (--mspos; ; mspos--) { - // scan other way for s after m - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op == scfn.commands.section) break; - if (op == scfn.commands.date) { - if (minOK && (operandstr == "m" || operandstr == "mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr == "ss") { - minOK = 1; // m before ss is minutes not months - } else { - minOK = 0; - } - } else if (op != scfn.commands.copy) { - // copying chars can be between ss and m - minOK = 0; - } - } - } - - integerdigits2 = 0; // init counters, etc. - integerpos = 0; - fractionpos = 0; - textcolor = ""; - textstyle = ""; - separatorchar = scc.FormatNumber_separatorchar; - if (separatorchar.indexOf(" ") >= 0) - separatorchar = separatorchar.replace(/ /g, " "); - decimalchar = scc.FormatNumber_decimalchar; - if (decimalchar.indexOf(" ") >= 0) - decimalchar = decimalchar.replace(/ /g, " "); - - oppos = sectioninfo.sectionstart; - - while ((op = thisformat.operators[oppos])) { - // execute format - operandstr = thisformat.operands[oppos++]; // get next operator and operand - - if (op == scfn.commands.copy) { - // put char in result - result += operandstr; - } else if (op == scfn.commands.color) { - // set color - textcolor = operandstr; - } else if (op == scfn.commands.style) { - // set style - textstyle = operandstr; - } else if (op == scfn.commands.integer_placeholder) { - // insert number part - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - integerdigits2++; - if (integerdigits2 == 1) { - // first one - if (integervalue.length > sectioninfo.integerdigits) { - // see if integer wider than field - for ( - ; - integerpos < integervalue.length - sectioninfo.integerdigits; - integerpos++ - ) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - } - if ( - integervalue.length < sectioninfo.integerdigits && - integerdigits2 <= sectioninfo.integerdigits - integervalue.length - ) { - // field is wider than value - if (operandstr == "0" || operandstr == "?") { - // fill with appropriate characters - result += operandstr == "0" ? "0" : " "; - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = sectioninfo.integerdigits - integerdigits2; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } else { - // normal integer digit - add it - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - integerpos++; - } - } else if (op == scfn.commands.fraction_placeholder) { - // add fraction part of number - if (fractionpos >= fractionvalue.length) { - if (operandstr == "0" || operandstr == "?") { - result += operandstr == "0" ? "0" : " "; - } - } else { - result += fractionvalue.charAt(fractionpos); - } - fractionpos++; - } else if (op == scfn.commands.decimal) { - // decimal point - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += decimalchar; - } else if (op == scfn.commands.currency) { - // currency symbol - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += operandstr; - } else if (op == scfn.commands.general) { - // insert "General" conversion - - // *** Cut down number of significant digits to avoid floating point artifacts: - - if (value != 0) { - // only if non-zero - var factor = Math.floor(Math.LOG10E * Math.log(value)); // get integer magnitude as a power of 10 - factor = Math.pow(10, 13 - factor); // turn into scaling factor - value = Math.floor(factor * value + 0.5) / factor; // scale positive value, round, undo scaling - if (!isFinite(value)) return "NaN"; - } - if (negativevalue) { - result += "-"; - } - strvalue = value + ""; // convert original value to string - if (strvalue.indexOf("e") >= 0) { - // converted to scientific notation - result += strvalue; - continue; - } - strparts = strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - integervalue = strparts[1]; - if (!integervalue || integervalue == "0") integervalue = ""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - integerpos = 0; - fractionpos = 0; - if (integervalue.length) { - for (; integerpos < integervalue.length; integerpos++) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } else { - result += "0"; - } - if (fractionvalue.length) { - result += decimalchar; - for (; fractionpos < fractionvalue.length; fractionpos++) { - result += fractionvalue.charAt(fractionpos); - } - } - } else if (op == scfn.commands.date) { - // date placeholder - operandstrlc = operandstr.toLowerCase(); - if (operandstrlc == "y" || operandstrlc == "yy") { - result += (ymd.year + "").substring(2); - } else if (operandstrlc == "yyyy") { - result += ymd.year + ""; - } else if (operandstrlc == "d") { - result += ymd.day + ""; - } else if (operandstrlc == "dd") { - cval = 1000 + ymd.day; - result += (cval + "").substr(2); - } else if (operandstrlc == "ddd") { - cval = Math.floor(rawvalue + 6) % 7; - result += scc.s_FormatNumber_daynames3[cval]; - } else if (operandstrlc == "dddd") { - cval = Math.floor(rawvalue + 6) % 7; - result += scc.s_FormatNumber_daynames[cval]; - } else if (operandstrlc == "m") { - result += ymd.month + ""; - } else if (operandstrlc == "mm") { - cval = 1000 + ymd.month; - result += (cval + "").substr(2); - } else if (operandstrlc == "mmm") { - result += scc.s_FormatNumber_monthnames3[ymd.month - 1]; - } else if (operandstrlc == "mmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month - 1]; - } else if (operandstrlc == "mmmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month - 1].charAt(0); - } else if (operandstrlc == "h") { - result += hrs + ""; - } else if (operandstrlc == "h]") { - result += ehrs + ""; - } else if (operandstrlc == "mmin") { - cval = 1000 + mins + ""; - result += cval.substr(2); - } else if (operandstrlc == "mm]") { - if (emins < 100) { - cval = 1000 + emins + ""; - result += cval.substr(2); - } else { - result += emins + ""; - } - } else if (operandstrlc == "min") { - result += mins + ""; - } else if (operandstrlc == "m]") { - result += emins + ""; - } else if (operandstrlc == "hh") { - cval = 1000 + hrs + ""; - result += cval.substr(2); - } else if (operandstrlc == "s") { - cval = Math.floor(secs); - result += cval + ""; - } else if (operandstrlc == "ss") { - cval = 1000 + Math.floor(secs) + ""; - result += cval.substr(2); - } else if (operandstrlc == "am/pm" || operandstrlc == "a/p") { - result += ampmstr; - } else if (operandstrlc == "ss]") { - if (esecs < 100) { - cval = 1000 + Math.floor(esecs) + ""; - result += cval.substr(2); - } else { - cval = Math.floor(esecs); - result += cval + ""; - } - } - } else if (op == scfn.commands.section) { - // end of section - break; - } else if (op == scfn.commands.comparison) { - // ignore - continue; - } else { - result += "!! Parse error !!"; - } - } - - if (textcolor) { - result = '' + result + ""; - } - if (textstyle) { - result = '' + result + ""; - } - - return result; - }; - - /* ******************* - - SocialCalc.FormatNumber.parse_format_string(format_defs, format_string) - - Takes a format string (e.g., "#,##0.00_);(#,##0.00)") and fills in format_defs with the parsed info - - format_defs - ["#,##0.0"]->{} - elements in the hash are one hash for each format - .operators->[] - array of operators from parsing the format string (each a number) - .operands->[] - array of corresponding operators (each usually a string) - .sectioninfo->[] - one hash for each section of the format - .start - .integerdigits - .fractiondigits - .commas - .percent - .thousandssep - .hasdates - .hascomparison - true if any section has [<100], etc. - -************************* */ - - SocialCalc.FormatNumber.parse_format_string = function ( - format_defs, - format_string - ) { - var scfn = SocialCalc.FormatNumber; - - var thisformat, section, sectionfinfo; - var integerpart = 1; // start out in integer part - var lastwasinteger; // last char was an integer placeholder - var lastwasslash; // last char was a backslash - escaping following character - var lastwasasterisk; // repeat next char - var lastwasunderscore; // last char was _ which picks up following char for width - var inquote, quotestr; // processing a quoted string - var inbracket, bracketstr, bracketdata; // processing a bracketed string - var ingeneral, gpos; // checks for characters "General" - var ampmstr, part; // checks for characters "A/P" and "AM/PM" - var indate; // keeps track of date/time placeholders - var chpos; // character position being looked at - var ch; // character being looked at - var sectioninfo; - - if (format_defs[format_string]) return; // already defined - nothing to do - - thisformat = { operators: [], operands: [], sectioninfo: [{}] }; // create info structure for this format - format_defs[format_string] = thisformat; // add to other format definitions - - section = 0; // start with section 0 - sectioninfo = thisformat.sectioninfo[section]; // get reference to info for current section - sectioninfo.sectionstart = 0; // position in operands that starts this section - sectioninfo.integerdigits = 0; // number of integer-part placeholders - sectioninfo.fractiondigits = 0; // fraction placeholders - sectioninfo.commas = 0; // commas encountered, to handle scaling - sectioninfo.percent = 0; // times to scale by 100 - - for (chpos = 0; chpos < format_string.length; chpos++) { - // parse - ch = format_string.charAt(chpos); // get next char to examine - if (inquote) { - if (ch == '"') { - inquote = 0; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(quotestr); - continue; - } - quotestr += ch; - continue; - } - if (inbracket) { - if (ch == "]") { - inbracket = 0; - bracketdata = - SocialCalc.FormatNumber.parse_format_bracket(bracketstr); - if (bracketdata.operator == scfn.commands.separator) { - sectioninfo.thousandssep = 1; // explicit [,] - continue; - } - if (bracketdata.operator == scfn.commands.date) { - sectioninfo.hasdate = 1; - } - if (bracketdata.operator == scfn.commands.comparison) { - thisformat.hascomparison = 1; - } - thisformat.operators.push(bracketdata.operator); - thisformat.operands.push(bracketdata.operand); - continue; - } - bracketstr += ch; - continue; - } - if (lastwasslash) { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - lastwasslash = false; - continue; - } - if (lastwasasterisk) { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch + ch + ch + ch + ch); // do 5 of them since no real tabs - lastwasasterisk = false; - continue; - } - if (lastwasunderscore) { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(" "); - lastwasunderscore = false; - continue; - } - if (ingeneral) { - if ("general".charAt(ingeneral) == ch.toLowerCase()) { - ingeneral++; - if (ingeneral == 7) { - thisformat.operators.push(scfn.commands.general); - thisformat.operands.push(ch); - ingeneral = 0; - } - continue; - } - ingeneral = 0; - } - if (indate) { - // last char was part of a date placeholder - if (indate.charAt(0) == ch) { - // another of the same char - indate += ch; // accumulate it - continue; - } - thisformat.operators.push(scfn.commands.date); // something else, save date info - thisformat.operands.push(indate); - sectioninfo.hasdate = 1; - indate = ""; - } - if (ampmstr) { - ampmstr += ch; - part = ampmstr.toLowerCase(); - if ( - part != "am/pm".substring(0, part.length) && - part != "a/p".substring(0, part.length) - ) { - ampstr = ""; - } else if (part == "am/pm" || part == "a/p") { - thisformat.operators.push(scfn.commands.date); - thisformat.operands.push(ampmstr); - ampmstr = ""; - } - continue; - } - if (ch == "#" || ch == "0" || ch == "?") { - // placeholder - if (integerpart) { - sectioninfo.integerdigits++; - if (sectioninfo.commas) { - // comma inside of integer placeholders - sectioninfo.thousandssep = 1; // any number is thousands separator - sectioninfo.commas = 0; // reset count of "thousand" factors - } - lastwasinteger = 1; - thisformat.operators.push(scfn.commands.integer_placeholder); - thisformat.operands.push(ch); - } else { - sectioninfo.fractiondigits++; - thisformat.operators.push(scfn.commands.fraction_placeholder); - thisformat.operands.push(ch); - } - } else if (ch == ".") { - // decimal point - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.decimal); - thisformat.operands.push(ch); - integerpart = 0; - } else if (ch == "$") { - // currency char - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.currency); - thisformat.operands.push(ch); - } else if (ch == ",") { - if (lastwasinteger) { - sectioninfo.commas++; - } else { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } - } else if (ch == "%") { - lastwasinteger = 0; - sectioninfo.percent++; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } else if (ch == '"') { - lastwasinteger = 0; - inquote = 1; - quotestr = ""; - } else if (ch == "[") { - lastwasinteger = 0; - inbracket = 1; - bracketstr = ""; - } else if (ch == "\\") { - lastwasslash = 1; - lastwasinteger = 0; - } else if (ch == "*") { - lastwasasterisk = 1; - lastwasinteger = 0; - } else if (ch == "_") { - lastwasunderscore = 1; - lastwasinteger = 0; - } else if (ch == ";") { - section++; // start next section - thisformat.sectioninfo[section] = {}; // create a new section - sectioninfo = thisformat.sectioninfo[section]; // get reference to info for current section - sectioninfo.sectionstart = 1 + thisformat.operators.length; // remember where it starts - sectioninfo.integerdigits = 0; // number of integer-part placeholders - sectioninfo.fractiondigits = 0; // fraction placeholders - sectioninfo.commas = 0; // commas encountered, to handle scaling - sectioninfo.percent = 0; // times to scale by 100 - integerpart = 1; // reset for new section - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.section); - thisformat.operands.push(ch); - } else if (ch.toLowerCase() == "g") { - ingeneral = 1; - lastwasinteger = 0; - } else if (ch.toLowerCase() == "a") { - ampmstr = ch; - lastwasinteger = 0; - } else if ("dmyhHs".indexOf(ch) >= 0) { - indate = ch; - } else { - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } - } - - if (indate) { - // last char was part of unsaved date placeholder - thisformat.operators.push(scfn.commands.date); - thisformat.operands.push(indate); - sectioninfo.hasdate = 1; - } - - return; - }; - - /* ******************* - - bracketdata = SocialCalc.FormatNumber.parse_format_bracket(bracketstr) - - Takes a bracket contents (e.g., "RED", ">10") and returns an operator and operand - - bracketdata->{} - .operator - .operand - -************************* */ - - SocialCalc.FormatNumber.parse_format_bracket = function (bracketstr) { - var scfn = SocialCalc.FormatNumber; - var scc = SocialCalc.Constants; - - var bracketdata = {}; - var parts; - - if (bracketstr.charAt(0) == "$") { - // currency - bracketdata.operator = scfn.commands.currency; - parts = bracketstr.match(/^\$(.+?)(\-.+?){0,1}$/); - if (parts) { - bracketdata.operand = - parts[1] || scc.FormatNumber_defaultCurrency || "$"; - } else { - bracketdata.operand = - bracketstr.substring(1) || scc.FormatNumber_defaultCurrency || "$"; - } - } else if (bracketstr == "?$") { - bracketdata.operator = scfn.commands.currency; - bracketdata.operand = "[?$]"; - } else if (scfn.allowedcolors[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.color; - bracketdata.operand = scfn.allowedcolors[bracketstr.toUpperCase()]; - } else if ((parts = bracketstr.match(/^style=([^"]*)$/))) { - // [style=...] - bracketdata.operator = scfn.commands.style; - bracketdata.operand = parts[1]; - } else if (bracketstr == ",") { - bracketdata.operator = scfn.commands.separator; - bracketdata.operand = bracketstr; - } else if (scfn.alloweddates[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.date; - bracketdata.operand = scfn.alloweddates[bracketstr.toUpperCase()]; - } else if ((parts = bracketstr.match(/^[<>=]/))) { - // comparison operator - parts = bracketstr.match(/^([<>=]+)(.+)$/); // split operator and value - bracketdata.operator = scfn.commands.comparison; - bracketdata.operand = parts[1] + ":" + parts[2]; - } else { - // unknown bracket - bracketdata.operator = scfn.commands.copy; - bracketdata.operand = "[" + bracketstr + "]"; - } - - return bracketdata; - }; - - /* ******************* - - juliandate = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, month, day) - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - - I= YEAR - J= MONTH - K= DAY -C - JD= K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12) - 2 /12-3*((I+4900+(J-14)/12)/100)/4 - -************************* */ - - SocialCalc.FormatNumber.convert_date_gregorian_to_julian = function ( - year, - month, - day - ) { - var juliandate; - - juliandate = - day - - 32075 + - SocialCalc.intFunc( - (1461 * (year + 4800 + SocialCalc.intFunc((month - 14) / 12))) / 4 - ); - juliandate += SocialCalc.intFunc( - (367 * (month - 2 - SocialCalc.intFunc((month - 14) / 12) * 12)) / 12 - ); - juliandate = - juliandate - - SocialCalc.intFunc( - (3 * - SocialCalc.intFunc( - (year + 4900 + SocialCalc.intFunc((month - 14) / 12)) / 100 - )) / - 4 - ); - - return juliandate; - }; - - /* ******************* - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian(juliandate) - - ymd->{} - .year - .month - .day - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - -************************* */ - - SocialCalc.FormatNumber.convert_date_julian_to_gregorian = function ( - juliandate - ) { - var L, N, I, J, K; - - L = juliandate + 68569; - N = Math.floor((4 * L) / 146097); - L = L - Math.floor((146097 * N + 3) / 4); - I = Math.floor((4000 * (L + 1)) / 1461001); - L = L - Math.floor((1461 * I) / 4) + 31; - J = Math.floor((80 * L) / 2447); - K = L - Math.floor((2447 * J) / 80); - L = Math.floor(J / 11); - J = J + 2 - 12 * L; - I = 100 * (N - 49) + I + L; - - return { year: I, month: J, day: K }; - }; - - SocialCalc.intFunc = function (n) { - if (n < 0) { - return -Math.floor(-n); - } else { - return Math.floor(n); - } - }; - - // - /* -// SocialCalc Spreadsheet Formula Library -// -// Part of the SocialCalc package -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - // In any case, requires SocialCalc.Constants. - - SocialCalc.Formula = {}; - - // - // Formula constants for parsing: - // - - SocialCalc.Formula.ParseState = { - num: 1, - alpha: 2, - coord: 3, - string: 4, - stringquote: 5, - numexp1: 6, - numexp2: 7, - alphanumeric: 8, - specialvalue: 9, - }; - - SocialCalc.Formula.TokenType = { - num: 1, - coord: 2, - op: 3, - name: 4, - error: 5, - string: 6, - space: 7, - }; - - SocialCalc.Formula.CharClass = { - num: 1, - numstart: 2, - op: 3, - eof: 4, - alpha: 5, - incoord: 6, - error: 7, - quote: 8, - space: 9, - specialstart: 10, - }; - - SocialCalc.Formula.CharClassTable = { - " ": 9, - "!": 3, - '"': 8, - "#": 10, - $: 6, - "%": 3, - "&": 3, - "(": 3, - ")": 3, - "*": 3, - "+": 3, - ",": 3, - "-": 3, - ".": 2, - "/": 3, - 0: 1, - 1: 1, - 2: 1, - 3: 1, - 4: 1, - 5: 1, - 6: 1, - 7: 1, - 8: 1, - 9: 1, - ":": 3, - "<": 3, - "=": 3, - ">": 3, - A: 5, - B: 5, - C: 5, - D: 5, - E: 5, - F: 5, - G: 5, - H: 5, - I: 5, - J: 5, - K: 5, - L: 5, - M: 5, - N: 5, - O: 5, - P: 5, - Q: 5, - R: 5, - S: 5, - T: 5, - U: 5, - V: 5, - W: 5, - X: 5, - Y: 5, - Z: 5, - "^": 3, - _: 5, - a: 5, - b: 5, - c: 5, - d: 5, - e: 5, - f: 5, - g: 5, - h: 5, - i: 5, - j: 5, - k: 5, - l: 5, - m: 5, - n: 5, - o: 5, - p: 5, - q: 5, - r: 5, - s: 5, - t: 5, - u: 5, - v: 5, - w: 5, - x: 5, - y: 5, - z: 5, - }; - - SocialCalc.Formula.UpperCaseTable = { - a: "A", - b: "B", - c: "C", - d: "D", - e: "E", - f: "F", - g: "G", - h: "H", - i: "I", - j: "J", - k: "K", - l: "L", - m: "M", - n: "N", - o: "O", - p: "P", - q: "Q", - r: "R", - s: "S", - t: "T", - u: "U", - v: "V", - w: "W", - x: "X", - y: "Y", - z: "Z", - }; - - SocialCalc.Formula.SpecialConstants = { - // names that turn into constants for name lookup - "#NULL!": "0,e#NULL!", - "#NUM!": "0,e#NUM!", - "#DIV/0!": "0,e#DIV/0!", - "#VALUE!": "0,e#VALUE!", - "#REF!": "0,e#REF!", - "#NAME?": "0,e#NAME?", - }; - - // Operator Precedence table - // - // 1- !, 2- : ,, 3- M P, 4- %, 5- ^, 6- * /, 7- + -, 8- &, 9- < > = G(>=) L(<=) N(<>), - // Negative value means Right Associative - - SocialCalc.Formula.TokenPrecedence = { - "!": 1, - ":": 2, - ",": 2, - M: -3, - P: -3, - "%": 4, - "^": 5, - "*": 6, - "/": 6, - "+": 7, - "-": 7, - "&": 8, - "<": 9, - ">": 9, - G: 9, - L: 9, - N: 9, - }; - - // Convert one-char token text to input text: - - SocialCalc.Formula.TokenOpExpansion = { - G: ">=", - L: "<=", - M: "-", - N: "<>", - P: "+", - }; - - // - // Information about the resulting value types when doing operations on values (used by LookupResultType) - // - // Each object entry is an object with specific types with result type info as follows: - // - // 'type1a': '|type2a:resulta|type2b:resultb|... - // Type of t* or n* matches any of those types not listed - // Results may be a type or the numbers 1 or 2 specifying to return type1 or type2 - - SocialCalc.Formula.TypeLookupTable = { - unaryminus: { - "n*": "|n*:1|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - unaryplus: { - "n*": "|n*:1|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - unarypercent: { - "n*": "|n:n%|n*:n|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - plus: { - "n%": "|n%:n%|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - nd: "|n%:n|nd:nd|nt:ndt|ndt:ndt|n$:n|n:nd|n*:n|b:n|e*:2|t*:e#VALUE!|", - nt: "|n%:n|nd:ndt|nt:nt|ndt:ndt|n$:n|n:nt|n*:n|b:n|e*:2|t*:e#VALUE!|", - ndt: "|n%:n|nd:ndt|nt:ndt|ndt:ndt|n$:n|n:ndt|n*:n|b:n|e*:2|t*:e#VALUE!|", - n$: "|n%:n|nd:n|nt:n|ndt:n|n$:n$|n:n$|n*:n|b:n|e*:2|t*:e#VALUE!|", - nl: "|n%:n|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - n: "|n%:n|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - b: "|n%:n%|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - "t*": "|n*:e#VALUE!|t*:e#VALUE!|b:e#VALUE!|e*:2|", - "e*": "|e*:1|n*:1|t*:1|b:1|", - }, - concat: { - t: "|t:t|th:th|tw:tw|tl:t|t*:2|e*:2|", - th: "|t:th|th:th|tw:t|tl:th|t*:t|e*:2|", - tw: "|t:tw|th:t|tw:tw|tl:tw|t*:t|e*:2|", - tl: "|t:tl|th:th|tw:tw|tl:tl|t*:t|e*:2|", - "e*": "|e*:1|n*:1|t*:1|", - }, - oneargnumeric: { - "n*": "|n*:n|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - twoargnumeric: { - "n*": "|n*:n|t*:e#VALUE!|e*:2|", - "e*": "|e*:1|n*:1|t*:1|", - "t*": "|t*:e#VALUE!|n*:e#VALUE!|e*:2|", - }, - propagateerror: { - "n*": "|n*:2|e*:2|", - "e*": "|e*:2|", - "t*": "|t*:2|e*:2|", - b: "|b:2|e*:2|", - }, - }; - - /* ******************* - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(line) - - Parses a text string as if it was a spreadsheet formula - - This uses a simple state machine run on each character in turn. - States remember whether a number is being gathered, etc. - The result is parseinfo which is an array with one entry for each token: - parseinfo[i] = { - text: "the characters making up the parsed token", - type: the type of the token (a number), - opcode: a single character version of an operator suitable for use in the - precedence table and distinguishing between unary and binary + and -. - -************************* */ - - SocialCalc.Formula.ParseFormulaIntoTokens = function (line) { - var i, - ch, - chclass, - haddecimal, - last_token, - last_token_type, - last_token_text, - t; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var parsestate = scf.ParseState; - var tokentype = scf.TokenType; - var charclass = scf.CharClass; - var charclasstable = scf.CharClassTable; - var uppercasetable = scf.UpperCaseTable; // much faster than toUpperCase function - var pushtoken = scf.ParsePushToken; - var coordregex = /^\$?[A-Z]{1,2}\$?[1-9]\d*$/i; - - var parseinfo = []; - var str = ""; - var state = 0; - var haddecimal = false; - var cclass; - - for (i = 0; i <= line.length; i++) { - if (i < line.length) { - ch = line.charAt(i); - cclass = charclasstable[ch]; - } else { - ch = ""; - cclass = charclass.eof; - } - - if (state == parsestate.num) { - if (cclass == charclass.num) { - str += ch; - } else if (cclass == charclass.numstart && !haddecimal) { - haddecimal = true; - str += ch; - } else if (ch == "E" || ch == "e") { - str += ch; - haddecimal = false; - state = parsestate.numexp1; - } else { - // end of number - save it - pushtoken(parseinfo, str, tokentype.num, 0); - haddecimal = false; - state = 0; - } - } - - if (state == parsestate.numexp1) { - if (cclass == parsestate.num) { - state = parsestate.numexp2; - } else if ( - (ch == "+" || ch == "-") && - uppercasetable[str.charAt(str.length - 1)] == "E" - ) { - str += ch; - } else if (ch == "E" || ch == "e") { - } else { - pushtoken(parseinfo, scc.s_parseerrexponent, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.numexp2) { - if (cclass == charclass.num) { - str += ch; - } else { - // end of number - save it - pushtoken(parseinfo, str, tokentype.num, 0); - state = 0; - } - } - - if (state == parsestate.alpha) { - if (cclass == charclass.num) { - state = parsestate.coord; - } else if (cclass == charclass.alpha || ch == ".") { - // alpha may be letters, numbers, "_", or "." - str += ch; - } else if (cclass == charclass.incoord) { - state = parsestate.coord; - } else if ( - cclass == charclass.op || - cclass == charclass.numstart || - cclass == charclass.space || - cclass == charclass.eof - ) { - pushtoken(parseinfo, str.toUpperCase(), tokentype.name, 0); - state = 0; - } else { - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.coord) { - if (cclass == charclass.num) { - str += ch; - } else if (cclass == charclass.incoord) { - str += ch; - } else if (cclass == charclass.alpha) { - state = parsestate.alphanumeric; - } else if ( - cclass == charclass.op || - cclass == charclass.numstart || - cclass == charclass.eof || - cclass == charclass.space - ) { - if (coordregex.test(str)) { - t = tokentype.coord; - } else { - t = tokentype.name; - } - pushtoken(parseinfo, str.toUpperCase(), t, 0); - state = 0; - } else { - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.alphanumeric) { - if (cclass == charclass.num || cclass == charclass.alpha) { - str += ch; - } else if ( - cclass == charclass.op || - cclass == charclass.numstart || - cclass == charclass.space || - cclass == charclass.eof - ) { - pushtoken(parseinfo, str.toUpperCase(), tokentype.name, 0); - state = 0; - } else { - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.string) { - if (cclass == charclass.quote) { - state = parsestate.stringquote; // got quote in string: is it doubled (quote in string) or by itself (end of string)? - } else if (cclass == charclass.eof) { - pushtoken(parseinfo, scc.s_parseerrstring, tokentype.error, 0); - state = 0; - } else { - str += ch; - } - } else if (state == parsestate.stringquote) { - // note else if here - if (cclass == charclass.quote) { - str += '"'; - state = parsestate.string; // double quote: add one then continue getting string - } else { - // something else -- end of string - pushtoken(parseinfo, str, tokentype.string, 0); - state = 0; // drop through to process - } - } else if (state == parsestate.specialvalue) { - // special values like #REF! - if (str.charAt(str.length - 1) == "!") { - // done - save value as a name - pushtoken(parseinfo, str, tokentype.name, 0); - state = 0; // drop through to process - } else if (cclass == charclass.eof) { - pushtoken(parseinfo, scc.s_parseerrspecialvalue, tokentype.error, 0); - state = 0; - } else { - str += ch; - } - } - - if (state == 0) { - if (cclass == charclass.num) { - str = ch; - state = parsestate.num; - } else if (cclass == charclass.numstart) { - str = ch; - haddecimal = true; - state = parsestate.num; - } else if (cclass == charclass.alpha || cclass == charclass.incoord) { - str = ch; - state = parsestate.alpha; - } else if (cclass == charclass.specialstart) { - str = ch; - state = parsestate.specialvalue; - } else if (cclass == charclass.op) { - str = ch; - if (parseinfo.length > 0) { - last_token = parseinfo[parseinfo.length - 1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - if (last_token_type == charclass.op) { - if (last_token_text == "<" || last_token_text == ">") { - str = last_token_text + str; - parseinfo.pop(); - if (parseinfo.length > 0) { - last_token = parseinfo[parseinfo.length - 1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - } else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - } - } - } else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - t = tokentype.op; - if ( - parseinfo.length == 0 || - (last_token_type == charclass.op && - last_token_text != ")" && - last_token_text != "%") - ) { - // Unary operator - if (str == "-") { - // M is unary minus - str = "M"; - ch = "M"; - } else if (str == "+") { - // P is unary plus - str = "P"; - ch = "P"; - } else if (str == ")" && last_token_text == "(") { - // null arg list OK - } else if (str != "(") { - // binary-op open-paren OK, others no - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } else if (str.length > 1) { - if (str == ">=") { - // G is >= - str = "G"; - ch = "G"; - } else if (str == "<=") { - // L is <= - str = "L"; - ch = "L"; - } else if (str == "<>") { - // N is <> - str = "N"; - ch = "N"; - } else { - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } - pushtoken(parseinfo, str, t, ch); - state = 0; - } else if (cclass == charclass.quote) { - // starting a string - str = ""; - state = parsestate.string; - } else if (cclass == charclass.space) { - // store so can reconstruct spacing - pushtoken(parseinfo, " ", tokentype.space, 0); - } else if (cclass == charclass.eof) { - // ignore -- needed to have extra loop to close out other things - } else { - // unknown class - such as unknown char - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - } - } - } - - return parseinfo; - }; - - SocialCalc.Formula.ParsePushToken = function ( - parseinfo, - ttext, - ttype, - topcode - ) { - parseinfo.push({ text: ttext, type: ttype, opcode: topcode }); - }; - - /* ******************* - - result = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, allowrangereturn) - - Does the calculation expressed in a parsed formula, returning a value, its type, and error info - returns: {value: value, type: valuetype, error: errortext}. - - If allowrangereturn is present and true, can return a range (e.g., "A1:A10" - translated from "A1|A10|") - -************************* */ - - SocialCalc.Formula.evaluate_parsed_formula = function ( - parseinfo, - sheet, - allowrangereturn - ) { - var result; - - var scf = SocialCalc.Formula; - var tokentype = scf.TokenType; - - var revpolish; - var parsestack = []; - - var errortext = ""; - - revpolish = scf.ConvertInfixToPolish(parseinfo); // result is either an array or a string with error text - - result = scf.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn); - - return result; - }; - - // - // revpolish = SocialCalc.Formula.ConvertInfixToPolish(parseinfo) - // - // Convert infix to reverse polish notation - // - // Returns revpolish array with a sequence of references to tokens by number if successful. - // Errors return a string with the error. - // - // Based upon the algorithm shown in Wikipedia "Reverse Polish notation" article - // and then enhanced for additional spreadsheet things - // - - SocialCalc.Formula.ConvertInfixToPolish = function (parseinfo) { - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var token_precedence = scf.TokenPrecedence; - - var revpolish = []; - var parsestack = []; - - var errortext = ""; - - var function_start = -1; - - var i, pii, ttype, ttext, tprecedence, tstackprecedence; - - for (i = 0; i < parseinfo.length; i++) { - pii = parseinfo[i]; - ttype = pii.type; - ttext = pii.text; - if ( - ttype == tokentype.num || - ttype == tokentype.coord || - ttype == tokentype.string - ) { - revpolish.push(i); - } else if (ttype == tokentype.name) { - parsestack.push(i); - revpolish.push(function_start); - } else if (ttype == tokentype.space) { - // ignore - continue; - } else if (ttext == ",") { - while ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].text != "(" - ) { - revpolish.push(parsestack.pop()); - } - if (parsestack.length == 0) { - // no ( -- error - errortext = scc.s_parseerrmissingopenparen; - break; - } - } else if (ttext == "(") { - parsestack.push(i); - } else if (ttext == ")") { - while ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].text != "(" - ) { - revpolish.push(parsestack.pop()); - } - if (parsestack.length == 0) { - // no ( -- error - errortext = scc.s_parseerrcloseparennoopen; - break; - } - parsestack.pop(); - if ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].type == tokentype.name - ) { - revpolish.push(parsestack.pop()); - } - } else if (ttype == tokentype.op) { - if ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].type == tokentype.name - ) { - revpolish.push(parsestack.pop()); - } - while ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].type == tokentype.op && - parseinfo[parsestack[parsestack.length - 1]].text != "(" - ) { - tprecedence = token_precedence[pii.opcode]; - tstackprecedence = - token_precedence[ - parseinfo[parsestack[parsestack.length - 1]].opcode - ]; - if (tprecedence >= 0 && tprecedence < tstackprecedence) { - break; - } else if (tprecedence < 0) { - tprecedence = -tprecedence; - if (tstackprecedence < 0) tstackprecedence = -tstackprecedence; - if (tprecedence <= tstackprecedence) { - break; - } - } - revpolish.push(parsestack.pop()); - } - parsestack.push(i); - } else if (ttype == tokentype.error) { - errortext = ttext; - break; - } else { - errortext = "Internal error while processing parsed formula. "; - break; - } - } - while (parsestack.length > 0) { - if (parseinfo[parsestack[parsestack.length - 1]].text == "(") { - errortext = scc.s_parseerrmissingcloseparen; - break; - } - revpolish.push(parsestack.pop()); - } - - if (errortext) { - return errortext; - } - - return revpolish; - }; - - // - // result = SocialCalc.Formula.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn) - // - // Execute reverse polish representation of formula - // - // Operand values are objects in the operand array with a "type" and an optional "value". - // Type can have these values (many are type and sub-type as two or more letters): - // "tw", "th", "t", "n", "nt", "coord", "range", "start", "eErrorType", "b" (blank) - // The value of a coord is in the form A57 or A57!sheetname - // The value of a range is coord|coord|number where number starts at 0 and is - // the offset of the next item to fetch if you are going through the range one by one - // The number starts as a null string ("A1|B3|") - // - - SocialCalc.Formula.EvaluatePolish = function ( - parseinfo, - revpolish, - sheet, - allowrangereturn - ) { - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var lookup_result_type = scf.LookupResultType; - var typelookup = scf.TypeLookupTable; - var operand_as_number = scf.OperandAsNumber; - var operand_as_text = scf.OperandAsText; - var operand_value_and_type = scf.OperandValueAndType; - var operands_as_coord_on_sheet = scf.OperandsAsCoordOnSheet; - var format_number_for_display = - SocialCalc.format_number_for_display || - function (v, t, f) { - return v + ""; - }; - - var errortext = ""; - var function_start = -1; - var missingOperandError = { - value: "", - type: "e#VALUE!", - error: scc.s_parseerrmissingoperand, - }; - var value; - - var operand = []; - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - var i, - rii, - prii, - ttype, - ttext, - value1, - value2, - tostype, - tostype2, - resulttype, - valuetype, - cond, - vmatch, - smatch; - - if (!parseinfo.length || !(revpolish instanceof Array)) { - return { - value: "", - type: "e#VALUE!", - error: typeof revpolish == "string" ? revpolish : "", - }; - } - - for (i = 0; i < revpolish.length; i++) { - rii = revpolish[i]; - if (rii == function_start) { - // Remember the start of a function argument list - PushOperand("start", 0); - continue; - } - - prii = parseinfo[rii]; - ttype = prii.type; - ttext = prii.text; - - if (ttype == tokentype.num) { - PushOperand("n", ttext - 0); - } else if (ttype == tokentype.coord) { - PushOperand("coord", ttext); - } else if (ttype == tokentype.string) { - PushOperand("t", ttext); - } else if (ttype == tokentype.op) { - if (operand.length <= 0) { - // Nothing on the stack... - return missingOperandError; - break; // done - } - - // Unary minus - - if (ttext == "M") { - value1 = operand_as_number(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.unaryminus - ); - PushOperand(resulttype, -value1.value); - } - - // Unary plus - else if (ttext == "P") { - value1 = operand_as_number(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.unaryplus - ); - PushOperand(resulttype, value1.value); - } - - // Unary % - percent, left associative - else if (ttext == "%") { - value1 = operand_as_number(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.unarypercent - ); - PushOperand(resulttype, 0.01 * value1.value); - } - - // & - string concatenate - else if (ttext == "&") { - if (operand.length <= 1) { - // Need at least two things on the stack... - return missingOperandError; - } - value2 = operand_as_text(sheet, operand); - value1 = operand_as_text(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.concat - ); - PushOperand(resulttype, value1.value + value2.value); - } - - // : - Range constructor - else if (ttext == ":") { - if (operand.length <= 1) { - // Need at least two things on the stack... - return missingOperandError; - } - value1 = scf.OperandsAsRangeOnSheet(sheet, operand); // get coords even if use name on other sheet - if (value1.error) { - // not available - errortext = errortext || value1.error; - } - PushOperand(value1.type, value1.value); // push sheetname with range on that sheet - } - - // ! - sheetname!coord - else if (ttext == "!") { - if (operand.length <= 1) { - // Need at least two things on the stack... - return missingOperandError; - } - value1 = operands_as_coord_on_sheet(sheet, operand); // get coord even if name on other sheet - if (value1.error) { - // not available - errortext = errortext || value1.error; - } - PushOperand(value1.type, value1.value); // push sheetname with coord or range on that sheet - } - - // Comparison operators: < L = G > N (< <= = >= > <>) - else if ( - ttext == "<" || - ttext == "L" || - ttext == "=" || - ttext == "G" || - ttext == ">" || - ttext == "N" - ) { - if (operand.length <= 1) { - // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_value_and_type(sheet, operand); - value1 = operand_value_and_type(sheet, operand); - if (value1.type.charAt(0) == "n" && value2.type.charAt(0) == "n") { - // compare two numbers - cond = 0; - if (ttext == "<") { - cond = value1.value < value2.value ? 1 : 0; - } else if (ttext == "L") { - cond = value1.value <= value2.value ? 1 : 0; - } else if (ttext == "=") { - cond = value1.value == value2.value ? 1 : 0; - } else if (ttext == "G") { - cond = value1.value >= value2.value ? 1 : 0; - } else if (ttext == ">") { - cond = value1.value > value2.value ? 1 : 0; - } else if (ttext == "N") { - cond = value1.value != value2.value ? 1 : 0; - } - PushOperand("nl", cond); - } else if (value1.type.charAt(0) == "e") { - // error on left - PushOperand(value1.type, 0); - } else if (value2.type.charAt(0) == "e") { - // error on right - PushOperand(value2.type, 0); - } else { - // text maybe mixed with numbers or blank - tostype = value1.type.charAt(0); - tostype2 = value2.type.charAt(0); - if (tostype == "n") { - value1.value = format_number_for_display(value1.value, "n", ""); - } else if (tostype == "b") { - value1.value = ""; - } - if (tostype2 == "n") { - value2.value = format_number_for_display(value2.value, "n", ""); - } else if (tostype2 == "b") { - value2.value = ""; - } - cond = 0; - value1.value = value1.value.toLowerCase(); // ignore case - value2.value = value2.value.toLowerCase(); - if (ttext == "<") { - cond = value1.value < value2.value ? 1 : 0; - } else if (ttext == "L") { - cond = value1.value <= value2.value ? 1 : 0; - } else if (ttext == "=") { - cond = value1.value == value2.value ? 1 : 0; - } else if (ttext == "G") { - cond = value1.value >= value2.value ? 1 : 0; - } else if (ttext == ">") { - cond = value1.value > value2.value ? 1 : 0; - } else if (ttext == "N") { - cond = value1.value != value2.value ? 1 : 0; - } - PushOperand("nl", cond); - } - } - - // Normal infix arithmethic operators: +, -. *, /, ^ - else { - // what's left are the normal infix arithmetic operators - if (operand.length <= 1) { - // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_as_number(sheet, operand); - value1 = operand_as_number(sheet, operand); - if (ttext == "+") { - resulttype = lookup_result_type( - value1.type, - value2.type, - typelookup.plus - ); - PushOperand(resulttype, value1.value + value2.value); - } else if (ttext == "-") { - resulttype = lookup_result_type( - value1.type, - value2.type, - typelookup.plus - ); - PushOperand(resulttype, value1.value - value2.value); - } else if (ttext == "*") { - resulttype = lookup_result_type( - value1.type, - value2.type, - typelookup.plus - ); - PushOperand(resulttype, value1.value * value2.value); - } else if (ttext == "/") { - if (value2.value != 0) { - PushOperand("n", value1.value / value2.value); // gives plain numeric result type - } else { - PushOperand("e#DIV/0!", 0); - } - } else if (ttext == "^") { - value1.value = Math.pow(value1.value, value2.value); - value1.type = "n"; // gives plain numeric result type - if (isNaN(value1.value)) { - value1.value = 0; - value1.type = "e#NUM!"; - } - PushOperand(value1.type, value1.value); - } - } - } - - // function or name - else if (ttype == tokentype.name) { - errortext = scf.CalculateFunction(ttext, operand, sheet); - if (errortext) break; - } else { - errortext = - scc.s_InternalError + "Unknown token " + ttype + " (" + ttext + "). "; - break; - } - } - - // look at final value and handle special cases - - value = operand[0] ? operand[0].value : ""; - tostype = operand[0] ? operand[0].type : ""; - - if (tostype == "name") { - // name - expand it - value1 = SocialCalc.Formula.LookupName(sheet, value); - value = value1.value; - tostype = value1.type; - errortext = errortext || value1.error; - } - - if (tostype == "coord") { - // the value is a coord reference, get its value and type - value1 = operand_value_and_type(sheet, operand); - value = value1.value; - tostype = value1.type; - if (tostype == "b") { - tostype = "n"; - value = 0; - } - } - - if (operand.length > 1 && !errortext) { - // something left - error - errortext += scc.s_parseerrerrorinformula; - } - - // set return type - - valuetype = tostype; - - if (tostype.charAt(0) == "e") { - // error value - errortext = - errortext || tostype.substring(1) || scc.s_calcerrerrorvalueinformula; - } else if (tostype == "range") { - vmatch = value.match(/^(.*)\|(.*)\|/); - smatch = vmatch[1].indexOf("!"); - if (smatch >= 0) { - // swap sheetname - vmatch[1] = - vmatch[1].substring(smatch + 1) + - "!" + - vmatch[1].substring(0, smatch).toUpperCase(); - } else { - vmatch[1] = vmatch[1].toUpperCase(); - } - value = vmatch[1] + ":" + vmatch[2].toUpperCase(); - if (!allowrangereturn) { - errortext = scc.s_formularangeresult + " " + value; - } - } - - if (errortext && valuetype.charAt(0) != "e") { - value = errortext; - valuetype = "e"; - } - - // look for overflow - - if (valuetype.charAt(0) == "n" && (isNaN(value) || !isFinite(value))) { - value = 0; - valuetype = "e#NUM!"; - errortext = isNaN(value) - ? scc.s_calcerrnumericnan - : scc.s_calcerrnumericoverflow; - } - - return { value: value, type: valuetype, error: errortext }; - }; - - /* -# -# resulttype = SocialCalc.Formula.LookupResultType(type1, type2, typelookup); -# -# typelookup has values of the following form: -# -# typelookup{"typespec1"} = "|typespec2A:resultA|typespec2B:resultB|..." -# -# First type1 is looked up. If no match, then the first letter (major type) of type1 plus "*" is looked up -# resulttype is type1 if result is "1", type2 if result is "2", otherwise the value of result. -# -*/ - - SocialCalc.Formula.LookupResultType = function (type1, type2, typelookup) { - var pos1, pos2, result; - - var table1 = typelookup[type1]; - - if (!table1) { - table1 = typelookup[type1.charAt(0) + "*"]; - if (!table1) { - return ( - "e#VALUE! (internal error, missing LookupResultType " + - type1.charAt(0) + - "*)" - ); // missing from table -- please add it - } - } - pos1 = table1.indexOf("|" + type2 + ":"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1 + 1); - if (pos2 < 0) - return ( - "e#VALUE! (internal error, incorrect LookupResultType " + table1 + ")" - ); - result = table1.substring(pos1 + type2.length + 2, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - pos1 = table1.indexOf("|" + type2.charAt(0) + "*:"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1 + 1); - if (pos2 < 0) - return ( - "e#VALUE! (internal error, incorrect LookupResultType " + table1 + ")" - ); - result = table1.substring(pos1 + 4, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - return "e#VALUE!"; - }; - - /* -# -# operandinfo = SocialCalc.Formula.TopOfStackValueAndType(sheet, operand) -# -# Returns top of stack value and type and then pops the stack. -# The result is {value: value, type: type, error: "only if bad error"} -# -*/ - - SocialCalc.Formula.TopOfStackValueAndType = function (sheet, operand) { - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - if (!stacklen) { - // make sure something is there - result.error = - SocialCalc.Constants.s_InternalError + "no operand on stack"; - return result; - } - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - return result; - }; - - /* -# -# operandinfo = OperandAsNumber(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns numeric value and type. -# Text values are treated as 0 if they can't be converted somehow. -# -*/ - - SocialCalc.Formula.OperandAsNumber = function (sheet, operand) { - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "n") { - operandinfo.value = operandinfo.value - 0; - } else if (t == "b") { - // blank cell - operandinfo.type = "n"; - operandinfo.value = 0; - } else if (t == "e") { - // error - operandinfo.value = 0; - } else { - valueinfo = SocialCalc.DetermineValueType - ? SocialCalc.DetermineValueType(operandinfo.value) - : { value: operandinfo.value - 0, type: "n" }; // if without rest of SocialCalc - if (valueinfo.type.charAt(0) == "n") { - operandinfo.value = valueinfo.value - 0; - operandinfo.type = valueinfo.type; - } else { - operandinfo.value = 0; - operandinfo.type = valueinfo.type; - } - } - - return operandinfo; - }; - - /* -# -# operandinfo = OperandAsText(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns text value, preserving sub-type. -# -*/ - - SocialCalc.Formula.OperandAsText = function (sheet, operand) { - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "t") { - // any flavor of text returns as is - } else if (t == "n") { - operandinfo.value = SocialCalc.format_number_for_display - ? SocialCalc.format_number_for_display( - operandinfo.value, - operandinfo.type, - "" - ) - : (operandinfo.value = operandinfo.value + ""); - operandinfo.type = "t"; - } else if (t == "b") { - // blank - operandinfo.value = ""; - operandinfo.type = "t"; - } else if (t == "e") { - // error - operandinfo.value = ""; - } else { - operand.value = operandinfo.value + ""; - operand.type = "t"; - } - - return operandinfo; - }; - - /* -# -# result = SocialCalc.Formula.OperandValueAndType(sheet, operand) -# -# Pops the top of stack and returns it, following a coord reference if necessary. -# The result is {value: value, type: type, error: "only if bad error"} -# Ranges are returned as if they were pushed onto the stack first coord first -# Also sets type with "t", "n", "th", etc., as appropriate -# -*/ - - SocialCalc.Formula.OperandValueAndType = function (sheet, operand) { - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - if (!stacklen) { - // make sure something is there - result.error = - SocialCalc.Constants.s_InternalError + "no operand on stack"; - return result; - } - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - if (result.type == "range") { - result = scf.StepThroughRangeDown(operand, result.value); - } - - if (result.type == "coord") { - // value is a coord reference - coordsheet = sheet; - pos = result.value.indexOf("!"); - if (pos != -1) { - // sheet reference - coordsheet = scf.FindInSheetCache(result.value.substring(pos + 1)); // get other sheet - if (coordsheet == null) { - // unavailable - result.type = "e#REF!"; - result.error = - SocialCalc.Constants.s_sheetunavailable + - " " + - result.value.substring(pos + 1); - result.value = 0; - return result; - } - result.value = result.value.substring(0, pos); // get coord part - } - - if (coordsheet) { - cell = coordsheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - cellvtype = cell.valuetype; // get type of value in the cell it points to - result.value = cell.datavalue; - } else { - cellvtype = "b"; - } - } else { - cellvtype = "e#N/A"; - result.value = 0; - } - result.type = cellvtype || "b"; - if (result.type == "b") { - // blank - result.value = 0; - } - } - - return result; - }; - - /* -# -# operandinfo = SocialCalc.Formula.OperandAsCoord(sheet, operand) -# -# Gets top of stack and pops it. -# Returns coord value. All others are treated as an error. -# -*/ - - SocialCalc.Formula.OperandAsCoord = function (sheet, operand) { - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - result = SocialCalc.Formula.LookupName(sheet, result.value); - } - if (result.type == "coord") { - // value is a coord reference - return result; - } else { - result.value = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - return result; - } - }; - - /* -# -# result = SocialCalc.Formula.OperandsAsCoordOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as sheetname!coord-or-name. -# Returns stack-style coord value (coord!sheetname, or coord!sheetname|coord|) with -# a type of coord or range. All others are treated as an error. -# If sheetname not available, sets result.error. -# -*/ - - SocialCalc.Formula.OperandsAsCoordOnSheet = function (sheet, operand) { - var sheetname, othersheet, pos1, pos2; - var value1 = {}; - var result = {}; - var scf = SocialCalc.Formula; - - var stacklen = operand.length; - value1.value = operand[stacklen - 1].value; // get top of stack - coord or name - value1.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - sheetname = scf.OperandAsSheetName(sheet, operand); // get sheetname as text - othersheet = scf.FindInSheetCache(sheetname.value); - if (othersheet == null) { - // unavailable - result.type = "e#REF!"; - result.value = 0; - result.error = - SocialCalc.Constants.s_sheetunavailable + " " + sheetname.value; - return result; - } - - if (value1.type == "name") { - value1 = scf.LookupName(othersheet, value1.value); - } - result.type = value1.type; - if (value1.type == "coord") { - // value is a coord reference - result.value = value1.value + "!" + sheetname.value; // return in the format as used on stack - } else if (value1.type == "range") { - // value is a range reference - pos1 = value1.value.indexOf("|"); - pos2 = value1.value.indexOf("|", pos1 + 1); - result.value = - value1.value.substring(0, pos1) + - "!" + - sheetname.value + - "|" + - value1.value.substring(pos1 + 1, pos2) + - "|"; - } else if (value1.type.charAt(0) == "e") { - result.value = value1.value; - } else { - result.error = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - result.value = 0; - } - return result; - }; - - /* -# -# result = SocialCalc.Formula.OperandsAsRangeOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as coord2-or-name:coord1. -# Name is evaluated on sheet of coord1. -# Returns result with "value" of stack-style range value (coord!sheetname|coord|) and -# "type" of "range". All others are treated as an error. -# -*/ - - SocialCalc.Formula.OperandsAsRangeOnSheet = function (sheet, operand) { - var value1, othersheet, pos1, pos2; - var value2 = {}; - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var stacklen = operand.length; - value2.value = operand[stacklen - 1].value; // get top of stack - coord or name for "right" side - value2.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - value1 = scf.OperandAsCoord(sheet, operand); // get "left" coord - if (value1.type != "coord") { - // not a coord, which it must be - return { value: 0, type: "e#REF!" }; - } - - othersheet = sheet; - pos1 = value1.value.indexOf("!"); - if (pos1 != -1) { - // sheet reference - pos2 = value1.value.indexOf("|", pos1 + 1); - if (pos2 < 0) pos2 = value1.value.length; - othersheet = scf.FindInSheetCache(value1.value.substring(pos1 + 1, pos2)); // get other sheet - if (othersheet == null) { - // unavailable - return { - value: 0, - type: "e#REF!", - errortext: - scc.s_sheetunavailable + - " " + - value1.value.substring(pos1 + 1, pos2), - }; - } - } - - if (value2.type == "name") { - // coord:name is allowed, if name is just one cell - value2 = scf.LookupName(othersheet, value2.value); - } - - if (value2.type == "coord") { - // value is a coord reference, so return the combined range - return { value: value1.value + "|" + value2.value + "|", type: "range" }; // return range in the format as used on stack - } else { - // bad form - return { value: scc.s_calcerrcellrefmissing, type: "e#REF!" }; - } - }; - - /* -# -# result = SocialCalc.Formula.OperandAsSheetName(sheet, operand) -# -# Gets top of stack and pops it. -# Returns sheetname value. All others are treated as an error. -# Accepts text, cell reference, and named value which is one of those two. -# -*/ - - SocialCalc.Formula.OperandAsSheetName = function (sheet, operand) { - var nvalue, cell; - - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - nvalue = SocialCalc.Formula.LookupName(sheet, result.value); - if (!nvalue.value) { - // not a known name - return bare name as the name value - return result; - } - result.value = nvalue.value; - result.type = nvalue.type; - } - if (result.type == "coord") { - // value is a coord reference, follow it to find sheet name - cell = sheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - result.value = cell.datavalue; - result.type = cell.valuetype; - } else { - result.value = ""; - result.type = "b"; - } - } - if (result.type.charAt(0) == "t") { - // value is a string which could be a sheet name - return result; - } else { - result.value = ""; - result.error = SocialCalc.Constants.s_calcerrsheetnamemissing; - return result; - } - }; - - // - // value = SocialCalc.Formula.LookupName(sheet, name) - // - // Returns value and type of a named value - // Names are case insensitive - // Names may have a definition which is a coord (A1), a range (A1:B7), or a formula (=OFFSET(A1,0,0,5,1)) - // Note: The range must not have sheet names ("!") in them. - // - - SocialCalc.Formula.LookupName = function (sheet, name) { - var pos, specialc, parseinfo; - var names = sheet.names; - var value = {}; - var startedwalk = false; - - if (names[name.toUpperCase()]) { - // is name defined? - - value.value = names[name.toUpperCase()].definition; // yes - - if (value.value.charAt(0) == "=") { - // formula - if (!sheet.checknamecirc) { - // are we possibly walking the name tree? - sheet.checknamecirc = {}; // not yet - startedwalk = true; // remember we are the reference that started it - } else { - if (sheet.checknamecirc[name]) { - // circular reference - value.type = "e#NAME?"; - value.error = - SocialCalc.Constants.s_circularnameref + ' "' + name + '".'; - return value; - } - } - sheet.checknamecirc[name] = true; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens( - value.value.substring(1) - ); - value = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, 1); // parse formula, allowing range return - - delete sheet.checknamecirc[name]; // done with us - if (startedwalk) { - delete sheet.checknamecirc; // done with walk - } - - if (value.type != "range") { - return value; - } - } - - pos = value.value.indexOf(":"); - if (pos != -1) { - // range - value.type = "range"; - value.value = - value.value.substring(0, pos) + - "|" + - value.value.substring(pos + 1) + - "|"; - value.value = value.value.toUpperCase(); - } else { - value.type = "coord"; - value.value = value.value.toUpperCase(); - } - return value; - } else if ( - (specialc = SocialCalc.Formula.SpecialConstants[name.toUpperCase()]) - ) { - // special constant, like #REF! - pos = specialc.indexOf(","); - value.value = specialc.substring(0, pos) - 0; - value.type = specialc.substring(pos + 1); - return value; - } else { - value.value = ""; - value.type = "e#NAME?"; - value.error = - SocialCalc.Constants.s_calcerrunknownname + ' "' + name + '"'; - return value; - } - }; - - /* -# -# coord = SocialCalc.Formula.StepThroughRangeDown(operand, rangevalue) -# -# Returns next coord in a range, keeping track on the operand stack -# Goes from upper left across and down to bottom right. -# -*/ - - SocialCalc.Formula.StepThroughRangeDown = function (operand, rangevalue) { - var value1, value2, sequence, pos1, pos2, sheet1, rp, c, r, count; - var scf = SocialCalc.Formula; - - pos1 = rangevalue.indexOf("|"); - pos2 = rangevalue.indexOf("|", pos1 + 1); - value1 = rangevalue.substring(0, pos1); - value2 = rangevalue.substring(pos1 + 1, pos2); - sequence = rangevalue.substring(pos2 + 1) - 0; - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1); - value1 = value1.substring(0, pos1); - } else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - rp = scf.OrderRangeParts(value1, value2); - - count = 0; - for (r = rp.r1; r <= rp.r2; r++) { - for (c = rp.c1; c <= rp.c2; c++) { - count++; - if (count > sequence) { - if (r != rp.r2 || c != rp.c2) { - // keep on stack until done - scf.PushOperand( - operand, - "range", - value1 + sheet1 + "|" + value2 + "|" + count - ); - } - return { value: SocialCalc.crToCoord(c, r) + sheet1, type: "coord" }; - } - } - } - }; - - /* -# -# result = SocialCalc.Formula.DecodeRangeParts(sheetdata, range) -# -# Returns sheetdata for the sheet where the range is, as well as -# the number of the first column in the range, the number of columns, -# and equivalent row information: -# -# {sheetdata: sheet, sheetname: name-or-"", col1num: n, ncols: n, row1num: n, nrows: n} -# -# If any errors, a null result is returned. -# -*/ - - SocialCalc.Formula.DecodeRangeParts = function (sheetdata, range) { - var value1, value2, pos1, pos2, sheet1, coordsheetdata, rp; - - var scf = SocialCalc.Formula; - - pos1 = range.indexOf("|"); - pos2 = range.indexOf("|", pos1 + 1); - value1 = range.substring(0, pos1); - value2 = range.substring(pos1 + 1, pos2); - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1 + 1); - value1 = value1.substring(0, pos1); - } else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - coordsheetdata = sheetdata; - if (sheet1) { - // sheet reference - coordsheetdata = scf.FindInSheetCache(sheet1); - if (coordsheetdata == null) { - // unavailable - return null; - } - } - - rp = scf.OrderRangeParts(value1, value2); - - return { - sheetdata: coordsheetdata, - sheetname: sheet1, - col1num: rp.c1, - ncols: rp.c2 - rp.c1 + 1, - row1num: rp.r1, - nrows: rp.r2 - rp.r1 + 1, - }; - }; - - //********************* - // - // Function Handling - // - //********************* - - // List of functions -- Define after functions are defined - // - // SocialCalc.Formula.FunctionList["function_name"] = [function_subroutine, number_of_arguments, arg_def, func_def, func_class] - // function_subroutine takes arguments (fname, operand, foperand, sheet), returns - // errortext or null, pushing result on operand stack. - // number_of_arguments is: - // 0 = no arguments - // >0 = exactly that many arguments - // <0 = that many arguments (abs value) or more - // 100 = don't check - // - // arg_def, if present, is the name of the element in SocialCalc.Formula.FunctionArgDefs. - // func_def, if present, is a string explaining the function. If not, looked up in SocialCalc.Constants. - // func_class, if present, is the comma-separated names of the elements in SocialCalc.Formula.FunctionClasses. - // - // To add a function, just add it to this object. - - if (!SocialCalc.Formula.FunctionList) { - // make sure it is defined (could have been in another module) - SocialCalc.Formula.FunctionList = {}; - } - - // FunctionClasses[classname] = {name: full-name-string, items: [sorted list of function names]}; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionClasses = null; // start null to say needs filling in - - // FunctionArgDef[argname] = explicit-string-for-arg-list; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionArgDefs = {}; - - /* -# -# errortext = SocialCalc.Formula.CalculateFunction(fname, operand, sheet) -# -# Dispatches for function fname. -# -*/ - - SocialCalc.Formula.CalculateFunction = function (fname, operand, sheet) { - var fobj, foperand, ffunc, argnum, ttext; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = ""; - - fobj = scf.FunctionList[fname]; - - if (fobj) { - foperand = []; - ffunc = fobj[0]; - argnum = fobj[1]; - scf.CopyFunctionArgs(operand, foperand); - if (argnum != 100) { - if (argnum < 0) { - if (foperand.length < -argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } else { - if (foperand.length != argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } - } - errortext = ffunc(fname, operand, foperand, sheet); - } else { - ttext = fname; - - if (operand.length && operand[operand.length - 1].type == "start") { - // no arguments - name or zero arg function - operand.pop(); - scf.PushOperand(operand, "name", ttext); - } else { - errortext = - SocialCalc.Constants.s_sheetfuncunknownfunction + " " + ttext + ". "; - } - } - - return errortext; - }; - - // - // SocialCalc.Formula.PushOperand(operand, t, v) - // - // Pushes the type and value onto the operand stack - // - - SocialCalc.Formula.PushOperand = function (operand, t, v) { - operand.push({ type: t, value: v }); - }; - - // - // SocialCalc.Formula.CopyFunctionArgs(operand, foperand) - // - // Pops operands from operand and pushes on foperand up to function start - // reversing order in the process. - // - - SocialCalc.Formula.CopyFunctionArgs = function (operand, foperand) { - var fobj, foperand, ffunc, argnum; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = null; - - while (operand.length > 0 && operand[operand.length - 1].type != "start") { - // get each arg - foperand.push(operand.pop()); // copy it - } - operand.pop(); // get rid of "start" - - return; - }; - - // - // errortext = SocialCalc.Formula.FunctionArgsError(fname, operand) - // - // Pushes appropriate error on operand stack and returns errortext, including fname - // - - SocialCalc.Formula.FunctionArgsError = function (fname, operand) { - var errortext = - SocialCalc.Constants.s_calcerrincorrectargstofunction + - " " + - fname + - ". "; - SocialCalc.Formula.PushOperand(operand, "e#VALUE!", errortext); - - return errortext; - }; - - // - // errortext = SocialCalc.Formula.FunctionSpecificError(fname, operand, errortype, errortext) - // - // Pushes specified error and text on operand stack. - // - - SocialCalc.Formula.FunctionSpecificError = function ( - fname, - operand, - errortype, - errortext - ) { - SocialCalc.Formula.PushOperand(operand, errortype, errortext); - - return errortext; - }; - - // - // haserror = SocialCalc.Formula.CheckForErrorValue(operand, v) - // - // If v.type is an error, push it on operand stack and return true, otherwise return false. - // - - SocialCalc.Formula.CheckForErrorValue = function (operand, v) { - if (v.type.charAt(0) == "e") { - operand.push(v); - return true; - } else { - return false; - } - }; - - ///////////////////////// - // - // FUNCTION INFORMATION ROUTINES - // - - // - // SocialCalc.Formula.FillFunctionInfo() - // - // Goes through function definitions and fills out FunctionArgDefs and FunctionClasses. - // Execute this after any changes to SocialCalc.Constants but before UI is used. - // - - SocialCalc.Formula.FillFunctionInfo = function () { - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var fname, f, classes, cname, i; - - if (scf.FunctionClasses) { - // only do once - return; - } - - for (fname in scf.FunctionList) { - f = scf.FunctionList[fname]; - if (f[2]) { - // has an arg def - scf.FunctionArgDefs[f[2]] = scc["s_farg_" + f[2]] || ""; // get it from constants - } - if (!f[3]) { - // no text def, see if in constants - if (scc["s_fdef_" + fname]) { - scf.FunctionList[fname][3] = scc["s_fdef_" + fname]; - } - } - } - - scf.FunctionClasses = {}; - - for (i = 0; i < scc.function_classlist.length; i++) { - cname = scc.function_classlist[i]; - scf.FunctionClasses[cname] = { - name: scc["s_fclass_" + cname], - items: [], - }; - } - - for (fname in scf.FunctionList) { - f = scf.FunctionList[fname]; - classes = f[4] ? f[4].split(",") : []; // get classes - classes.push("all"); - for (i = 0; i < classes.length; i++) { - cname = classes[i]; - scf.FunctionClasses[cname].items.push(fname); - } - } - for (cname in scf.FunctionClasses) { - scf.FunctionClasses[cname].items.sort(); - } - }; - - // - // str = SocialCalc.Formula.FunctionArgString(fname) - // - // Returns a string representing the arguments to function fname. - // - - SocialCalc.Formula.FunctionArgString = function (fname) { - var scf = SocialCalc.Formula; - var fdata = scf.FunctionList[fname]; - var nargs, i, str; - - var adef = fdata[2]; - - if (!adef) { - nargs = fdata[1]; - if (nargs == 0) { - adef = " "; - } else if (nargs > 0) { - str = "v1"; - for (i = 2; i <= nargs; i++) { - str += ", v" + i; - } - return str; - } else if (nargs < 0) { - str = "v1"; - for (i = 2; i < -nargs; i++) { - str += ", v" + i; - } - return str + ", ..."; - } else { - return "nargs: " + nargs; - } - } - - str = scf.FunctionArgDefs[adef] || adef; - - return str; - }; - - ///////////////////////// - // - // FUNCTION DEFINITIONS - // - // The standard function definitions follow. - // - // Note that some need SocialCalc.DetermineValueType to be defined. - // - - /* -# -# AVERAGE(v1,c1:c2,...) -# COUNT(v1,c1:c2,...) -# COUNTA(v1,c1:c2,...) -# COUNTBLANK(v1,c1:c2,...) -# MAX(v1,c1:c2,...) -# MIN(v1,c1:c2,...) -# PRODUCT(v1,c1:c2,...) -# STDEV(v1,c1:c2,...) -# STDEVP(v1,c1:c2,...) -# SUM(v1,c1:c2,...) -# VAR(v1,c1:c2,...) -# VARP(v1,c1:c2,...) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the dseries_functions, too. -# -*/ - - SocialCalc.Formula.SeriesFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var value1, t, v1; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - while (foperand.length > 0) { - value1 = operand_value_and_type(sheet, foperand); - t = value1.type.charAt(0); - if (t == "n") count += 1; - if (t != "b") counta += 1; - if (t == "b") countblank += 1; - - if (t == "n") { - v1 = value1.value - 0; // get it as a number - sum += v1; - product *= v1; - maxval = maxval != undefined ? (v1 > maxval ? v1 : maxval) : v1; - minval = minval != undefined ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { - // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } else { - // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type( - value1.type, - resulttypesum || value1.type, - typelookupplus - ); - } else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "SUM": - PushOperand(resulttypesum, sum); - break; - - case "PRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "MIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "MAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "COUNT": - PushOperand("n", count); - break; - - case "COUNTA": - PushOperand("n", counta); - break; - - case "COUNTBLANK": - PushOperand("n", countblank); - break; - - case "AVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - } - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["AVERAGE"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["COUNT"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["COUNTA"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["COUNTBLANK"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["MAX"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["MIN"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["PRODUCT"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["STDEV"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["STDEVP"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["SUM"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["VAR"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["VARP"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - - /* -# -# DAVERAGE(databaserange, fieldname, criteriarange) -# DCOUNT(databaserange, fieldname, criteriarange) -# DCOUNTA(databaserange, fieldname, criteriarange) -# DGET(databaserange, fieldname, criteriarange) -# DMAX(databaserange, fieldname, criteriarange) -# DMIN(databaserange, fieldname, criteriarange) -# DPRODUCT(databaserange, fieldname, criteriarange) -# DSTDEV(databaserange, fieldname, criteriarange) -# DSTDEVP(databaserange, fieldname, criteriarange) -# DSUM(databaserange, fieldname, criteriarange) -# DVAR(databaserange, fieldname, criteriarange) -# DVARP(databaserange, fieldname, criteriarange) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the series_functions, too. -# -*/ - - SocialCalc.Formula.DSeriesFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var value1, - tostype, - cr, - dbrange, - fieldname, - criteriarange, - dbinfo, - criteriainfo; - var fieldasnum, targetcol, i, j, k, cell, criteriafieldnums; - var testok, criteriacr, criteria, testcol, testcr; - var t; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - var value1 = {}; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - dbrange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - fieldname = scf.OperandValueAndType(sheet, foperand); // get a value - criteriarange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - - if (dbrange.type != "range" || criteriarange.type != "range") { - return scf.FunctionArgsError(fname, operand); - } - - dbinfo = scf.DecodeRangeParts(sheet, dbrange.value); - criteriainfo = scf.DecodeRangeParts(sheet, criteriarange.value); - - fieldasnum = scf.FieldToColnum( - dbinfo.sheetdata, - dbinfo.col1num, - dbinfo.ncols, - dbinfo.row1num, - fieldname.value, - fieldname.type - ); - if (fieldasnum <= 0) { - PushOperand("e#VALUE!", 0); - return; - } - - targetcol = dbinfo.col1num + fieldasnum - 1; - criteriafieldnums = []; - - for (i = 0; i < criteriainfo.ncols; i++) { - // get criteria field colnums - cell = criteriainfo.sheetdata.GetAssuredCell( - SocialCalc.crToCoord(criteriainfo.col1num + i, criteriainfo.row1num) - ); - criterianum = scf.FieldToColnum( - dbinfo.sheetdata, - dbinfo.col1num, - dbinfo.ncols, - dbinfo.row1num, - cell.datavalue, - cell.valuetype - ); - if (criterianum <= 0) { - PushOperand("e#VALUE!", 0); - return; - } - criteriafieldnums.push(dbinfo.col1num + criterianum - 1); - } - - for (i = 1; i < dbinfo.nrows; i++) { - // go through each row of the database - testok = false; - CRITERIAROW: for (j = 1; j < criteriainfo.nrows; j++) { - // go through each criteria row - for (k = 0; k < criteriainfo.ncols; k++) { - // look at each column - criteriacr = SocialCalc.crToCoord( - criteriainfo.col1num + k, - criteriainfo.row1num + j - ); // where criteria is - cell = criteriainfo.sheetdata.GetAssuredCell(criteriacr); - criteria = cell.datavalue; - if (typeof criteria == "string" && criteria.length == 0) continue; // blank items are OK - testcol = criteriafieldnums[k]; - testcr = SocialCalc.crToCoord(testcol, dbinfo.row1num + i); // cell to check - cell = criteriainfo.sheetdata.GetAssuredCell(testcr); - if ( - !scf.TestCriteria(cell.datavalue, cell.valuetype || "b", criteria) - ) { - continue CRITERIAROW; // does not meet criteria - check next row - } - } - testok = true; // met all the criteria - break CRITERIAROW; - } - if (!testok) { - continue; - } - - cr = SocialCalc.crToCoord(targetcol, dbinfo.row1num + i); // get cell of this row to do the function on - cell = dbinfo.sheetdata.GetAssuredCell(cr); - - value1.value = cell.datavalue; - value1.type = cell.valuetype; - t = value1.type.charAt(0); - if (t == "n") count += 1; - if (t != "b") counta += 1; - if (t == "b") countblank += 1; - - if (t == "n") { - v1 = value1.value - 0; // get it as a number - sum += v1; - product *= v1; - maxval = maxval != undefined ? (v1 > maxval ? v1 : maxval) : v1; - minval = minval != undefined ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { - // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } else { - // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type( - value1.type, - resulttypesum || value1.type, - typelookupplus - ); - } else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "DSUM": - PushOperand(resulttypesum, sum); - break; - - case "DPRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "DMIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "DMAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "DCOUNT": - PushOperand("n", count); - break; - - case "DCOUNTA": - PushOperand("n", counta); - break; - - case "DAVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DGET": - if (count == 1) { - PushOperand(resulttypesum, sum); - } else if (count == 0) { - PushOperand("e#VALUE!", 0); - } else { - PushOperand("e#NUM!", 0); - } - break; - } - - return; - }; - - SocialCalc.Formula.FunctionList["DAVERAGE"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DCOUNT"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DCOUNTA"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DGET"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DMAX"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DMIN"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DPRODUCT"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DSTDEV"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DSTDEVP"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DSUM"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DVAR"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DVARP"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - - /* -# -# colnum = SocialCalc.Formula.FieldToColnum(sheet, col1num, ncols, row1num, fieldname, fieldtype) -# -# If fieldname is a number, uses it, otherwise looks up string in cells in row to find field number -# -# If not found, returns 0. -# -*/ - - SocialCalc.Formula.FieldToColnum = function ( - sheet, - col1num, - ncols, - row1num, - fieldname, - fieldtype - ) { - var colnum, cell, value; - - if (fieldtype.charAt(0) == "n") { - // number - return it if legal - colnum = fieldname - 0; // make sure a number - if (colnum <= 0 || colnum > ncols) { - return 0; - } - return Math.floor(colnum); - } - - if (fieldtype.charAt(0) != "t") { - // must be text otherwise - return 0; - } - - fieldname = fieldname ? fieldname.toLowerCase() : ""; - - for (colnum = 0; colnum < ncols; colnum++) { - // look through column headers for a match - cell = sheet.GetAssuredCell( - SocialCalc.crToCoord(col1num + colnum, row1num) - ); - value = cell.datavalue; - value = (value + "").toLowerCase(); // ignore case - if (value == fieldname) { - // match - return colnum + 1; - } - } - return 0; // looked at all and no match - }; - - /* -# -# HLOOKUP(value, range, row, [rangelookup]) -# VLOOKUP(value, range, col, [rangelookup]) -# MATCH(value, range, [rangelookup]) -# -*/ - - SocialCalc.Formula.LookupFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var lookupvalue, range, offset, rangelookup, offsetvalue, rangeinfo; - var c, - r, - cincr, - rincr, - previousOK, - csave, - rsave, - cell, - value, - valuetype, - cr, - lookupvalue; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - lookupvalue = operand_value_and_type(sheet, foperand); - if (typeof lookupvalue.value == "string") { - lookupvalue.value = lookupvalue.value.toLowerCase(); - } - - range = scf.TopOfStackValueAndType(sheet, foperand); - - rangelookup = 1; // default to true or 1 - if (fname == "MATCH") { - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value - 0; - } - } else { - offsetvalue = scf.OperandAsNumber(sheet, foperand); - if (offsetvalue.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - offsetvalue = Math.floor(offsetvalue.value); - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value ? 1 : 0; // convert to 1 or 0 - } - } - lookupvalue.type = lookupvalue.type.charAt(0); // only deal with general type - if (lookupvalue.type == "n") { - // if number, make sure a number - lookupvalue.value = lookupvalue.value - 0; - } - - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - rangeinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (!rangeinfo) { - PushOperand("e#REF!", 0); - return; - } - - c = 0; - r = 0; - cincr = 0; - rincr = 0; - if (fname == "HLOOKUP") { - cincr = 1; - if (offsetvalue > rangeinfo.nrows) { - PushOperand("e#REF!", 0); - return; - } - } else if (fname == "VLOOKUP") { - rincr = 1; - if (offsetvalue > rangeinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - } else if (fname == "MATCH") { - if (rangeinfo.ncols > 1) { - if (rangeinfo.nrows > 1) { - PushOperand("e#N/A", 0); - return; - } - cincr = 1; - } else { - rincr = 1; - } - } else { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (offsetvalue < 1 && fname != "MATCH") { - PushOperand("e#VALUE!", 0); - return 0; - } - - previousOK; // if 1, previous test was <. If 2, also this one wasn't - - while (1) { - cr = SocialCalc.crToCoord(rangeinfo.col1num + c, rangeinfo.row1num + r); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype ? cell.valuetype.charAt(0) : "b"; // only deal with general types - if (valuetype == "n") { - value = value - 0; // make sure number - } - if (rangelookup) { - // rangelookup type 1 or -1: look for within brackets for matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { - // match - break; - } - if ( - (rangelookup > 0 && lookupvalue.value > value) || - (rangelookup < 0 && lookupvalue.value < value) - ) { - // possible match: wait and see - previousOK = 1; - csave = c; // remember col and row of last OK - rsave = r; - } else if (previousOK) { - // last one was OK, this one isn't - previousOK = 2; - break; - } - } else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { - // match - break; - } - if ( - (rangelookup > 0 && lookupvalue.value > value) || - (rangelookup < 0 && lookupvalue.value < value) - ) { - // possible match: wait and see - previousOK = 1; - csave = c; - rsave = r; - } else if (previousOK) { - // last one was OK, this one isn't - previousOK = 2; - break; - } - } - } else { - // exact value matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { - // match - break; - } - } else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { - // match - break; - } - } - } - - r += rincr; - c += cincr; - if (r >= rangeinfo.nrows || c >= rangeinfo.ncols) { - // end of range to check, no exact match - if (previousOK) { - // at least one could have been OK - previousOK = 2; - break; - } - PushOperand("e#N/A", 0); - return; - } - } - - if (previousOK == 2) { - // back to last OK - r = rsave; - c = csave; - } - - if (fname == "MATCH") { - value = c + r + 1; // only one may be <> 0 - valuetype = "n"; - } else { - cr = SocialCalc.crToCoord( - rangeinfo.col1num + c + (fname == "VLOOKUP" ? offsetvalue - 1 : 0), - rangeinfo.row1num + r + (fname == "HLOOKUP" ? offsetvalue - 1 : 0) - ); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype; - } - PushOperand(valuetype, value); - - return; - }; - - SocialCalc.Formula.FunctionList["HLOOKUP"] = [ - SocialCalc.Formula.LookupFunctions, - -3, - "hlookup", - "", - "lookup", - ]; - SocialCalc.Formula.FunctionList["MATCH"] = [ - SocialCalc.Formula.LookupFunctions, - -2, - "match", - "", - "lookup", - ]; - SocialCalc.Formula.FunctionList["VLOOKUP"] = [ - SocialCalc.Formula.LookupFunctions, - -3, - "vlookup", - "", - "lookup", - ]; - - /* -# -# INDEX(range, rownum, colnum) -# -*/ - - SocialCalc.Formula.IndexFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var range, sheetname, indexinfo, rowindex, colindex, result, resulttype; - - var scf = SocialCalc.Formula; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - indexinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (indexinfo.sheetname) { - sheetname = "!" + indexinfo.sheetname; - } else { - sheetname = ""; - } - - rowindex = { value: 0 }; - colindex = { value: 0 }; - - if (foperand.length) { - // look for row number - rowindex = scf.OperandAsNumber(sheet, foperand); - if (rowindex.type.charAt(0) != "n" || rowindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - // look for col number - colindex = scf.OperandAsNumber(sheet, foperand); - if (colindex.type.charAt(0) != "n" || colindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - } else { - // col number missing - if (indexinfo.nrows == 1) { - // if only one row, then rowindex is really colindex - colindex.value = rowindex.value; - rowindex.value = 0; - } - } - } - - if (rowindex.value > indexinfo.nrows || colindex.value > indexinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - - if (rowindex.value == 0) { - if (colindex.value == 0) { - if (indexinfo.nrows == 1 && indexinfo.ncols == 1) { - result = - SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + - sheetname; - resulttype = "coord"; - } else { - result = - SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + - sheetname + - "|" + - SocialCalc.crToCoord( - indexinfo.col1num + indexinfo.ncols - 1, - indexinfo.row1num + indexinfo.nrows - 1 - ) + - "|"; - resulttype = "range"; - } - } else { - if (indexinfo.nrows == 1) { - result = - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num - ) + sheetname; - resulttype = "coord"; - } else { - result = - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num - ) + - sheetname + - "|" + - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num + indexinfo.nrows - 1 - ) + - "|"; - resulttype = "range"; - } - } - } else { - if (colindex.value == 0) { - if (indexinfo.ncols == 1) { - result = - SocialCalc.crToCoord( - indexinfo.col1num, - indexinfo.row1num + rowindex.value - 1 - ) + sheetname; - resulttype = "coord"; - } else { - result = - SocialCalc.crToCoord( - indexinfo.col1num, - indexinfo.row1num + rowindex.value - 1 - ) + - sheetname + - "|" + - SocialCalc.crToCoord( - indexinfo.col1num + indexinfo.ncols - 1, - indexinfo.row1num + rowindex.value - 1 - ) + - "|"; - resulttype = "range"; - } - } else { - result = - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num + rowindex.value - 1 - ) + sheetname; - resulttype = "coord"; - } - } - - PushOperand(resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["INDEX"] = [ - SocialCalc.Formula.IndexFunction, - -1, - "index", - "", - "lookup", - ]; - - /* -# -# COUNTIF(c1:c2,"criteria") -# SUMIF(c1:c2,"criteria",[range2]) -# -*/ - - SocialCalc.Formula.CountifSumifFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var range, - criteria, - sumrange, - f2operand, - result, - resulttype, - value1, - value2; - var sum = 0; - var resulttypesum = ""; - var count = 0; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range or coord - criteria = scf.OperandAsText(sheet, foperand); // get criteria - if (fname == "SUMIF") { - if (foperand.length == 1) { - // three arg form of SUMIF - sumrange = scf.TopOfStackValueAndType(sheet, foperand); - } else if (foperand.length == 0) { - // two arg form - sumrange = { value: range.value, type: range.type }; - } else { - scf.FunctionArgsError(fname, operand); - return 0; - } - } else { - sumrange = { value: range.value, type: range.type }; - } - - if (criteria.type.charAt(0) == "n") { - criteria.value = criteria.value + ""; // make text - } else if (criteria.type.charAt(0) == "e") { - // error - criteria.value = null; - } else if (criteria.type.charAt(0) == "b") { - // blank here is undefined - criteria.value = null; - } - - if (range.type != "coord" && range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - if ( - fname == "SUMIF" && - sumrange.type != "coord" && - sumrange.type != "range" - ) { - scf.FunctionArgsError(fname, operand); - return 0; - } - - foperand.push(range); - f2operand = []; // to allow for 3 arg form - f2operand.push(sumrange); - - while (foperand.length) { - value1 = operand_value_and_type(sheet, foperand); - value2 = operand_value_and_type(sheet, f2operand); - - if (!scf.TestCriteria(value1.value, value1.type, criteria.value)) { - continue; - } - - count += 1; - - if (value2.type.charAt(0) == "n") { - sum += value2.value - 0; - resulttypesum = lookup_result_type( - value2.type, - resulttypesum || value2.type, - typelookupplus - ); - } else if ( - value2.type.charAt(0) == "e" && - resulttypesum.charAt(0) != "e" - ) { - resulttypesum = value2.type; - } - } - - resulttypesum = resulttypesum || "n"; - - if (fname == "SUMIF") { - PushOperand(resulttypesum, sum); - } else if (fname == "COUNTIF") { - PushOperand("n", count); - } - - return; - }; - - SocialCalc.Formula.FunctionList["COUNTIF"] = [ - SocialCalc.Formula.CountifSumifFunctions, - 2, - "rangec", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["SUMIF"] = [ - SocialCalc.Formula.CountifSumifFunctions, - -2, - "sumif", - "", - "stat", - ]; - - /* -# -# IF(cond,truevalue,falsevalue) -# -*/ - - SocialCalc.Formula.IfFunction = function (fname, operand, foperand, sheet) { - var cond, t; - - cond = SocialCalc.Formula.OperandValueAndType(sheet, foperand); - t = cond.type.charAt(0); - if (t != "n" && t != "b") { - operand.push({ type: "e#VALUE!", value: 0 }); - return; - } - - if (!cond.value) foperand.pop(); - operand.push(foperand.pop()); - if (cond.value) foperand.pop(); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["IF"] = [ - SocialCalc.Formula.IfFunction, - 3, - "iffunc", - "", - "test", - ]; - - /* -# -# DATE(year,month,day) -# -*/ - - SocialCalc.Formula.DateFunction = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var year = scf.OperandAsNumber(sheet, foperand); - var month = scf.OperandAsNumber(sheet, foperand); - var day = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - year.type, - month.type, - scf.TypeLookupTable.twoargnumeric - ); - resulttype = scf.LookupResultType( - resulttype, - day.type, - scf.TypeLookupTable.twoargnumeric - ); - if (resulttype.charAt(0) == "n") { - result = - SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - Math.floor(year.value), - Math.floor(month.value), - Math.floor(day.value) - ) - SocialCalc.FormatNumber.datevalues.julian_offset; - resulttype = "nd"; - } - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["DATE"] = [ - SocialCalc.Formula.DateFunction, - 3, - "date", - "", - "datetime", - ]; - - /* -# -# TIME(hour,minute,second) -# -*/ - - SocialCalc.Formula.TimeFunction = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var hours = scf.OperandAsNumber(sheet, foperand); - var minutes = scf.OperandAsNumber(sheet, foperand); - var seconds = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - hours.type, - minutes.type, - scf.TypeLookupTable.twoargnumeric - ); - resulttype = scf.LookupResultType( - resulttype, - seconds.type, - scf.TypeLookupTable.twoargnumeric - ); - if (resulttype.charAt(0) == "n") { - result = - (hours.value * 60 * 60 + minutes.value * 60 + seconds.value) / - (24 * 60 * 60); - resulttype = "nt"; - } - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["TIME"] = [ - SocialCalc.Formula.TimeFunction, - 3, - "hms", - "", - "datetime", - ]; - - /* -# -# DAY(date) -# MONTH(date) -# YEAR(date) -# WEEKDAY(date, [type]) -# -*/ - - SocialCalc.Formula.DMYFunctions = function (fname, operand, foperand, sheet) { - var ymd, dtype, doffset; - var scf = SocialCalc.Formula; - var result = 0; - - var datevalue = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - datevalue.type, - datevalue.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (resulttype.charAt(0) == "n") { - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian( - Math.floor( - datevalue.value + SocialCalc.FormatNumber.datevalues.julian_offset - ) - ); - switch (fname) { - case "DAY": - result = ymd.day; - break; - - case "MONTH": - result = ymd.month; - break; - - case "YEAR": - result = ymd.year; - break; - - case "WEEKDAY": - dtype = { value: 1 }; - if (foperand.length) { - // get type if present - dtype = scf.OperandAsNumber(sheet, foperand); - if ( - dtype.type.charAt(0) != "n" || - dtype.value < 1 || - dtype.value > 3 - ) { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { - // extra args - scf.FunctionArgsError(fname, operand); - return; - } - } - doffset = 6; - if (dtype.value > 1) { - doffset -= 1; - } - result = - (Math.floor(datevalue.value + doffset) % 7) + - (dtype.value < 3 ? 1 : 0); - break; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["DAY"] = [ - SocialCalc.Formula.DMYFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["MONTH"] = [ - SocialCalc.Formula.DMYFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["YEAR"] = [ - SocialCalc.Formula.DMYFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["WEEKDAY"] = [ - SocialCalc.Formula.DMYFunctions, - -1, - "weekday", - "", - "datetime", - ]; - - /* -# -# HOUR(datetime) -# MINUTE(datetime) -# SECOND(datetime) -# -*/ - - SocialCalc.Formula.HMSFunctions = function (fname, operand, foperand, sheet) { - var hours, minutes, seconds, fraction; - var scf = SocialCalc.Formula; - var result = 0; - - var datetime = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - datetime.type, - datetime.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (resulttype.charAt(0) == "n") { - if (datetime.value < 0) { - scf.PushOperand(operand, "e#NUM!", 0); // must be non-negative - return; - } - fraction = datetime.value - Math.floor(datetime.value); // fraction of a day - fraction *= 24; - hours = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - minutes = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - seconds = Math.floor(fraction + (datetime.value >= 0 ? 0.5 : -0.5)); - if (fname == "HOUR") { - result = hours; - } else if (fname == "MINUTE") { - result = minutes; - } else if (fname == "SECOND") { - result = seconds; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["HOUR"] = [ - SocialCalc.Formula.HMSFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["MINUTE"] = [ - SocialCalc.Formula.HMSFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["SECOND"] = [ - SocialCalc.Formula.HMSFunctions, - 1, - "v", - "", - "datetime", - ]; - - /* -# -# EXACT(v1,v2) -# -*/ - - SocialCalc.Formula.ExactFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value1 = scf.OperandValueAndType(sheet, foperand); - var v1type = value1.type.charAt(0); - var value2 = scf.OperandValueAndType(sheet, foperand); - var v2type = value2.type.charAt(0); - - if (v1type == "t") { - if (v2type == "t") { - result = value1.value == value2.value ? 1 : 0; - } else if (v2type == "b") { - result = value1.value.length ? 0 : 1; - } else if (v2type == "n") { - result = value1.value == value2.value + "" ? 1 : 0; - } else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } else { - result = 0; - } - } else if (v1type == "n") { - if (v2type == "n") { - result = value1.value - 0 == value2.value - 0 ? 1 : 0; - } else if (v2type == "b") { - result = 0; - } else if (v2type == "t") { - result = value1.value + "" == value2.value ? 1 : 0; - } else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } else { - result = 0; - } - } else if (v1type == "b") { - if (v2type == "t") { - result = value2.value.length ? 0 : 1; - } else if (v2type == "b") { - result = 1; - } else if (v2type == "n") { - result = 0; - } else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } else { - result = 0; - } - } else if (v1type == "e") { - result = value1.value; - resulttype = value1.type; - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["EXACT"] = [ - SocialCalc.Formula.ExactFunction, - 2, - "", - "", - "text", - ]; - - /* -# -# FIND(key,string,[start]) -# LEFT(string,[length]) -# LEN(string) -# LOWER(string) -# MID(string,start,length) -# PROPER(string) -# REPLACE(string,start,length,new) -# REPT(string,count) -# RIGHT(string,[length]) -# SUBSTITUTE(string,old,new,[which]) -# TRIM(string) -# UPPER(string) -# -*/ - - // SocialCalc.Formula.ArgList has an array for each function, one entry for each possible arg (up to max). - // Min args are specified in SocialCalc.Formula.FunctionList. - // If array element is 1 then it's a text argument, if it's 0 then it's numeric, if -1 then just get whatever's there - // Text values are manipulated as UTF-8, converting from and back to byte strings - - SocialCalc.Formula.ArgList = { - FIND: [1, 1, 0], - LEFT: [1, 0], - LEN: [1], - LOWER: [1], - MID: [1, 0, 0], - PROPER: [1], - REPLACE: [1, 0, 0, 1], - REPT: [1, 0], - RIGHT: [1, 0], - SUBSTITUTE: [1, 1, 1, 0], - TRIM: [1], - UPPER: [1], - }; - - SocialCalc.Formula.StringFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var i, value, offset, len, start, count; - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var numargs = foperand.length; - var argdef = scf.ArgList[fname]; - var operand_value = []; - var operand_type = []; - - for (i = 1; i <= numargs; i++) { - // go through each arg, get value and type, and check for errors - if (i > argdef.length) { - // too many args - scf.FunctionArgsError(fname, operand); - return; - } - if (argdef[i - 1] == 0) { - value = scf.OperandAsNumber(sheet, foperand); - } else if (argdef[i - 1] == 1) { - value = scf.OperandAsText(sheet, foperand); - } else if (argdef[i - 1] == -1) { - value = scf.OperandValueAndType(sheet, foperand); - } - operand_value[i] = value.value; - operand_type[i] = value.type; - if (value.type.charAt(0) == "e") { - scf.PushOperand(operand, value.type, result); - return; - } - } - - switch (fname) { - case "FIND": - offset = operand_type[3] ? operand_value[3] - 1 : 0; - if (offset < 0) { - result = "Start is before string"; // !! not displayed, no need to translate - } else { - result = operand_value[2].indexOf(operand_value[1], offset); // (null string matches first char) - if (result >= 0) { - result += 1; - resulttype = "n"; - } else { - result = "Not found"; // !! not displayed, error is e#VALUE! - } - } - break; - - case "LEFT": - len = operand_type[2] ? operand_value[2] - 0 : 1; - if (len < 0) { - result = "Negative length"; - } else { - result = operand_value[1].substring(0, len); - resulttype = "t"; - } - break; - - case "LEN": - result = operand_value[1].length; - resulttype = "n"; - break; - - case "LOWER": - result = operand_value[1].toLowerCase(); - resulttype = "t"; - break; - - case "MID": - start = operand_value[2] - 0; - len = operand_value[3] - 0; - if (len < 1 || start < 1) { - result = "Bad arguments"; - } else { - result = operand_value[1].substring(start - 1, start + len - 1); - resulttype = "t"; - } - break; - - case "PROPER": - result = operand_value[1].replace(/\b\w+\b/g, function (word) { - return word.substring(0, 1).toUpperCase() + word.substring(1); - }); // uppercase first character of words (see JavaScript, Flanagan, 5th edition, page 704) - resulttype = "t"; - break; - - case "REPLACE": - start = operand_value[2] - 0; - len = operand_value[3] - 0; - if (len < 0 || start < 1) { - result = "Bad arguments"; - } else { - result = - operand_value[1].substring(0, start - 1) + - operand_value[4] + - operand_value[1].substring(start - 1 + len); - resulttype = "t"; - } - break; - - case "REPT": - count = operand_value[2] - 0; - if (count < 0) { - result = "Negative count"; - } else { - result = ""; - for (; count > 0; count--) { - result += operand_value[1]; - } - resulttype = "t"; - } - break; - - case "RIGHT": - len = operand_type[2] ? operand_value[2] - 0 : 1; - if (len < 0) { - result = "Negative length"; - } else { - result = operand_value[1].slice(-len); - resulttype = "t"; - } - break; - - case "SUBSTITUTE": - fulltext = operand_value[1]; - oldtext = operand_value[2]; - newtext = operand_value[3]; - if (operand_value[4] != null) { - which = operand_value[4] - 0; - if (which <= 0) { - result = "Non-positive instance number"; - break; - } - } else { - which = 0; - } - count = 0; - oldpos = 0; - result = ""; - while (true) { - pos = fulltext.indexOf(oldtext, oldpos); - if (pos >= 0) { - count++; //!!!!!! old test just in case: if (count>1000) {alert(pos); break;} - result += fulltext.substring(oldpos, pos); - if (which == 0) { - result += newtext; // substitute - } else if (which == count) { - result += newtext + fulltext.substring(pos + oldtext.length); - break; - } else { - result += oldtext; // leave as was - } - oldpos = pos + oldtext.length; - } else { - // no more - result += fulltext.substring(oldpos); - break; - } - } - resulttype = "t"; - break; - - case "TRIM": - result = operand_value[1]; - result = result.replace(/^ */, ""); - result = result.replace(/ *$/, ""); - result = result.replace(/ +/g, " "); - resulttype = "t"; - break; - - case "UPPER": - result = operand_value[1].toUpperCase(); - resulttype = "t"; - break; - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["FIND"] = [ - SocialCalc.Formula.StringFunctions, - -2, - "find", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["LEFT"] = [ - SocialCalc.Formula.StringFunctions, - -2, - "tc", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["LEN"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "txt", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["LOWER"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "txt", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["MID"] = [ - SocialCalc.Formula.StringFunctions, - 3, - "mid", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["PROPER"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "v", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["REPLACE"] = [ - SocialCalc.Formula.StringFunctions, - 4, - "replace", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["REPT"] = [ - SocialCalc.Formula.StringFunctions, - 2, - "tc", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["RIGHT"] = [ - SocialCalc.Formula.StringFunctions, - -1, - "tc", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["SUBSTITUTE"] = [ - SocialCalc.Formula.StringFunctions, - -3, - "subs", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["TRIM"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "v", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["UPPER"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "v", - "", - "text", - ]; - - /* -# -# is_functions: -# -# ISBLANK(value) -# ISERR(value) -# ISERROR(value) -# ISLOGICAL(value) -# ISNA(value) -# ISNONTEXT(value) -# ISNUMBER(value) -# ISTEXT(value) -# -*/ - - SocialCalc.Formula.IsFunctions = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - case "ISBLANK": - result = value.type == "b" ? 1 : 0; - break; - - case "ISERR": - result = t == "e" ? (value.type == "e#N/A" ? 0 : 1) : 0; - break; - - case "ISERROR": - result = t == "e" ? 1 : 0; - break; - - case "ISLOGICAL": - result = value.type == "nl" ? 1 : 0; - break; - - case "ISNA": - result = value.type == "e#N/A" ? 1 : 0; - break; - - case "ISNONTEXT": - result = t == "t" ? 0 : 1; - break; - - case "ISNUMBER": - result = t == "n" ? 1 : 0; - break; - - case "ISTEXT": - result = t == "t" ? 1 : 0; - break; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["ISBLANK"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISERR"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISERROR"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISLOGICAL"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISNA"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISNONTEXT"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISNUMBER"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISTEXT"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - - /* -# -# ntv_functions: -# -# N(value) -# T(value) -# VALUE(value) -# -*/ - - SocialCalc.Formula.NTVFunctions = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - case "N": - result = t == "n" ? value.value - 0 : 0; - resulttype = "n"; - break; - - case "T": - result = t == "t" ? value.value + "" : ""; - resulttype = "t"; - break; - - case "VALUE": - if (t == "n" || t == "b") { - result = value.value || 0; - resulttype = "n"; - } else if (t == "t") { - value = SocialCalc.DetermineValueType(value.value); - if (value.type.charAt(0) != "n") { - result = 0; - resulttype = "e#VALUE!"; - } else { - result = value.value - 0; - resulttype = "n"; - } - } - break; - } - - if (t == "e") { - // error trumps - resulttype = value.type; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["N"] = [ - SocialCalc.Formula.NTVFunctions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["T"] = [ - SocialCalc.Formula.NTVFunctions, - 1, - "v", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["VALUE"] = [ - SocialCalc.Formula.NTVFunctions, - 1, - "v", - "", - "text", - ]; - - /* -# -# ABS(value) -# ACOS(value) -# ASIN(value) -# ATAN(value) -# COS(value) -# DEGREES(value) -# EVEN(value) -# EXP(value) -# FACT(value) -# INT(value) -# LN(value) -# LOG10(value) -# ODD(value) -# RADIANS(value) -# SIN(value) -# SQRT(value) -# TAN(value) -# -*/ - - SocialCalc.Formula.Math1Functions = function ( - fname, - operand, - foperand, - sheet - ) { - var v1, value, f; - var result = {}; - - var scf = SocialCalc.Formula; - - v1 = scf.OperandAsNumber(sheet, foperand); - value = v1.value; - result.type = scf.LookupResultType( - v1.type, - v1.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (result.type == "n") { - switch (fname) { - case "ABS": - value = Math.abs(value); - break; - - case "ACOS": - if (value >= -1 && value <= 1) { - value = Math.acos(value); - } else { - result.type = "e#NUM!"; - } - break; - - case "ASIN": - if (value >= -1 && value <= 1) { - value = Math.asin(value); - } else { - result.type = "e#NUM!"; - } - break; - - case "ATAN": - value = Math.atan(value); - break; - - case "COS": - value = Math.cos(value); - break; - - case "DEGREES": - value = (value * 180) / Math.PI; - break; - - case "EVEN": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (Math.floor(value + 1) % 2); - } else { - // integer - value = value + (value % 2); - } - if (v1.value < 0) value = -value; - break; - - case "EXP": - value = Math.exp(value); - break; - - case "FACT": - f = 1; - value = Math.floor(value); - for (; value > 0; value--) { - f *= value; - } - value = f; - break; - - case "INT": - value = Math.floor(value); // spreadsheet INT is floor(), not int() - break; - - case "LN": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclnarg; - } - value = Math.log(value); - break; - - case "LOG10": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclog10arg; - } - value = Math.log(value) / Math.log(10); - break; - - case "ODD": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (1 - (Math.floor(value + 1) % 2)); - } else { - // integer - value = value + (1 - (value % 2)); - } - if (v1.value < 0) value = -value; - break; - - case "RADIANS": - value = (value * Math.PI) / 180; - break; - - case "SIN": - value = Math.sin(value); - break; - - case "SQRT": - if (value >= 0) { - value = Math.sqrt(value); - } else { - result.type = "e#NUM!"; - } - break; - - case "TAN": - if (Math.cos(value) != 0) { - value = Math.tan(value); - } else { - result.type = "e#NUM!"; - } - break; - } - } - - result.value = value; - operand.push(result); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["ABS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ACOS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ASIN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ATAN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["COS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["DEGREES"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["EVEN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["EXP"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["FACT"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["INT"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["LN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["LOG10"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ODD"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["RADIANS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["SIN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["SQRT"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["TAN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - - /* -# -# ATAN2(x, y) -# MOD(a, b) -# POWER(a, b) -# TRUNC(value, precision) -# -*/ - - SocialCalc.Formula.Math2Functions = function ( - fname, - operand, - foperand, - sheet - ) { - var xval, yval, value, quotient, decimalscale, i; - var result = {}; - - var scf = SocialCalc.Formula; - - xval = scf.OperandAsNumber(sheet, foperand); - yval = scf.OperandAsNumber(sheet, foperand); - value = 0; - result.type = scf.LookupResultType( - xval.type, - yval.type, - scf.TypeLookupTable.twoargnumeric - ); - - if (result.type == "n") { - switch (fname) { - case "ATAN2": - if (xval.value == 0 && yval.value == 0) { - result.type = "e#DIV/0!"; - } else { - result.value = Math.atan2(yval.value, xval.value); - } - break; - - case "POWER": - result.value = Math.pow(xval.value, yval.value); - if (isNaN(result.value)) { - result.value = 0; - result.type = "e#NUM!"; - } - break; - - case "MOD": // en.wikipedia.org/wiki/Modulo_operation, etc. - if (yval.value == 0) { - result.type = "e#DIV/0!"; - } else { - quotient = xval.value / yval.value; - quotient = Math.floor(quotient); - result.value = xval.value - quotient * yval.value; - } - break; - - case "TRUNC": - decimalscale = 1; // cut down to required number of decimal digits - if (yval.value >= 0) { - yval.value = Math.floor(yval.value); - for (i = 0; i < yval.value; i++) { - decimalscale *= 10; - } - result.value = - Math.floor(Math.abs(xval.value) * decimalscale) / decimalscale; - } else if (yval.value < 0) { - yval.value = Math.floor(-yval.value); - for (i = 0; i < yval.value; i++) { - decimalscale *= 10; - } - result.value = - Math.floor(Math.abs(xval.value) / decimalscale) * decimalscale; - } - if (xval.value < 0) { - result.value = -result.value; - } - } - } - - operand.push(result); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["ATAN2"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "xy", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["MOD"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["POWER"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["TRUNC"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "valpre", - "", - "math", - ]; - - /* -# -# LOG(value,[base]) -# -*/ - - SocialCalc.Formula.LogFunction = function (fname, operand, foperand, sheet) { - var value, value2; - var result = {}; - - var scf = SocialCalc.Formula; - - result.value = 0; - - value = scf.OperandAsNumber(sheet, foperand); - result.type = scf.LookupResultType( - value.type, - value.type, - scf.TypeLookupTable.oneargnumeric - ); - if (foperand.length == 1) { - value2 = scf.OperandAsNumber(sheet, foperand); - if (value2.type.charAt(0) != "n" || value2.value <= 0) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfunclogsecondarg - ); - return 0; - } - } else if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } else { - value2 = { value: Math.E, type: "n" }; - } - - if (result.type == "n") { - if (value.value <= 0) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfunclogfirstarg - ); - return 0; - } - result.value = Math.log(value.value) / Math.log(value2.value); - } - - operand.push(result); - - return; - }; - - SocialCalc.Formula.FunctionList["LOG"] = [ - SocialCalc.Formula.LogFunction, - -1, - "log", - "", - "math", - ]; - - /* -# -# ROUND(value,[precision]) -# -*/ - - SocialCalc.Formula.RoundFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var value2, decimalscale, scaledvalue, i; - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var value = scf.OperandValueAndType(sheet, foperand); - var resulttype = scf.LookupResultType( - value.type, - value.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (foperand.length == 1) { - value2 = scf.OperandValueAndType(sheet, foperand); - if (value2.type.charAt(0) != "n") { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfuncroundsecondarg - ); - return 0; - } - } else if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } else { - value2 = { value: 0, type: "n" }; // if no second arg, assume 0 for simple round - } - - if (resulttype == "n") { - value2.value = value2.value - 0; - if (value2.value == 0) { - result = Math.round(value.value); - } else if (value2.value > 0) { - decimalscale = 1; // cut down to required number of decimal digits - value2.value = Math.floor(value2.value); - for (i = 0; i < value2.value; i++) { - decimalscale *= 10; - } - scaledvalue = Math.round(value.value * decimalscale); - result = scaledvalue / decimalscale; - } else if (value2.value < 0) { - decimalscale = 1; // cut down to required number of decimal digits - value2.value = Math.floor(-value2.value); - for (i = 0; i < value2.value; i++) { - decimalscale *= 10; - } - scaledvalue = Math.round(value.value / decimalscale); - result = scaledvalue * decimalscale; - } - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["ROUND"] = [ - SocialCalc.Formula.RoundFunction, - -1, - "vp", - "", - "math", - ]; - - /* -# -# AND(v1,c1:c2,...) -# OR(v1,c1:c2,...) -# -*/ - - SocialCalc.Formula.AndOrFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var value1, result; - - var scf = SocialCalc.Formula; - var resulttype = ""; - - if (fname == "AND") { - result = 1; - } else if (fname == "OR") { - result = 0; - } - - while (foperand.length) { - value1 = scf.OperandValueAndType(sheet, foperand); - if (value1.type.charAt(0) == "n") { - value1.value = value1.value - 0; - if (fname == "AND") { - result = value1.value != 0 ? result : 0; - } else if (fname == "OR") { - result = value1.value != 0 ? 1 : result; - } - resulttype = scf.LookupResultType( - value1.type, - resulttype || "nl", - scf.TypeLookupTable.propagateerror - ); - } else if (value1.type.charAt(0) == "e" && resulttype.charAt(0) != "e") { - resulttype = value1.type; - } - } - if (resulttype.length < 1) { - resulttype = "e#VALUE!"; - result = 0; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["AND"] = [ - SocialCalc.Formula.AndOrFunctions, - -1, - "vn", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["OR"] = [ - SocialCalc.Formula.AndOrFunctions, - -1, - "vn", - "", - "test", - ]; - - /* -# -# NOT(value) -# -*/ - - SocialCalc.Formula.NotFunction = function (fname, operand, foperand, sheet) { - var result = 0; - var scf = SocialCalc.Formula; - var value = scf.OperandValueAndType(sheet, foperand); - var resulttype = scf.LookupResultType( - value.type, - value.type, - scf.TypeLookupTable.propagateerror - ); - - if (value.type.charAt(0) == "n" || value.type == "b") { - result = value.value - 0 != 0 ? 0 : 1; // do the "not" operation - resulttype = "nl"; - } else if (value.type.charAt(0) == "t") { - resulttype = "e#VALUE!"; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["NOT"] = [ - SocialCalc.Formula.NotFunction, - 1, - "v", - "", - "test", - ]; - - /* -# -# CHOOSE(index,value1,value2,...) -# -*/ - - SocialCalc.Formula.ChooseFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var resulttype, count, value1; - var result = 0; - var scf = SocialCalc.Formula; - - var cindex = scf.OperandAsNumber(sheet, foperand); - - if (cindex.type.charAt(0) != "n") { - cindex.value = 0; - } - cindex.value = Math.floor(cindex.value); - - count = 0; - while (foperand.length) { - value1 = scf.TopOfStackValueAndType(sheet, foperand); - count += 1; - if (cindex.value == count) { - result = value1.value; - resulttype = value1.type; - break; - } - } - if (resulttype) { - // found something - scf.PushOperand(operand, resulttype, result); - } else { - scf.PushOperand(operand, "e#VALUE!", 0); - } - - return; - }; - - SocialCalc.Formula.FunctionList["CHOOSE"] = [ - SocialCalc.Formula.ChooseFunction, - -2, - "choose", - "", - "lookup", - ]; - - /* -# -# COLUMNS(c1:c2) -# ROWS(c1:c2) -# -*/ - - SocialCalc.Formula.ColumnsRowsFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var resulttype, rangeinfo; - var result = 0; - var scf = SocialCalc.Formula; - - var value1 = scf.TopOfStackValueAndType(sheet, foperand); - - if (value1.type == "coord") { - result = 1; - resulttype = "n"; - } else if (value1.type == "range") { - rangeinfo = scf.DecodeRangeParts(sheet, value1.value); - if (fname == "COLUMNS") { - result = rangeinfo.ncols; - } else if (fname == "ROWS") { - result = rangeinfo.nrows; - } - resulttype = "n"; - } else { - result = 0; - resulttype = "e#VALUE!"; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["COLUMNS"] = [ - SocialCalc.Formula.ColumnsRowsFunctions, - 1, - "range", - "", - "lookup", - ]; - SocialCalc.Formula.FunctionList["ROWS"] = [ - SocialCalc.Formula.ColumnsRowsFunctions, - 1, - "range", - "", - "lookup", - ]; - - /* -# -# FALSE() -# NA() -# NOW() -# PI() -# TODAY() -# TRUE() -# -*/ - - SocialCalc.Formula.ZeroArgFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var startval, tzoffset, start_1_1_1970, seconds_in_a_day, nowdays; - var result = { value: 0 }; - - switch (fname) { - case "FALSE": - result.type = "nl"; - result.value = 0; - break; - - case "NA": - result.type = "e#N/A"; - break; - - case "NOW": - startval = new Date(); - tzoffset = startval.getTimezoneOffset(); - startval = startval.getTime() / 1000; // convert to seconds - start_1_1_1970 = 25569; // Day number of 1/1/1970 starting with 1/1/1900 as 1 - seconds_in_a_day = 24 * 60 * 60; - nowdays = - start_1_1_1970 + startval / seconds_in_a_day - tzoffset / (24 * 60); - result.value = nowdays; - result.type = "ndt"; - SocialCalc.Formula.FreshnessInfo.volatile.NOW = true; // remember - break; - - case "PI": - result.type = "n"; - result.value = Math.PI; - break; - - case "TODAY": - startval = new Date(); - tzoffset = startval.getTimezoneOffset(); - startval = startval.getTime() / 1000; // convert to seconds - start_1_1_1970 = 25569; // Day number of 1/1/1970 starting with 1/1/1900 as 1 - seconds_in_a_day = 24 * 60 * 60; - nowdays = - start_1_1_1970 + startval / seconds_in_a_day - tzoffset / (24 * 60); - result.value = Math.floor(nowdays); - result.type = "nd"; - SocialCalc.Formula.FreshnessInfo.volatile.TODAY = true; // remember - break; - - case "TRUE": - result.type = "nl"; - result.value = 1; - break; - } - - operand.push(result); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["FALSE"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["NA"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["NOW"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["PI"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["TODAY"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["TRUE"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "test", - ]; - - // - // * * * * * FINANCIAL FUNCTIONS * * * * * - // - - /* -# -# DDB(cost,salvage,lifetime,period,[method]) -# -# Depreciation, method defaults to 2 for double-declining balance -# See: http://en.wikipedia.org/wiki/Depreciation -# -*/ - - SocialCalc.Formula.DDBFunction = function (fname, operand, foperand, sheet) { - var method, depreciation, accumulateddepreciation, i; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - var period = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - if (scf.CheckForErrorValue(operand, period)) return; - - if (lifetime.value < 1) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfuncddblife - ); - return 0; - } - - method = { value: 2, type: "n" }; - if (foperand.length > 0) { - method = scf.OperandAsNumber(sheet, foperand); - } - if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (scf.CheckForErrorValue(operand, method)) return; - - depreciation = 0; // calculated for each period - accumulateddepreciation = 0; // accumulated by adding each period's - - for (i = 1; i <= period.value - 0 && i <= lifetime.value; i++) { - // calculate for each period based on net from previous - depreciation = - (cost.value - accumulateddepreciation) * - (method.value / lifetime.value); - if (cost.value - accumulateddepreciation - depreciation < salvage.value) { - // don't go lower than salvage value - depreciation = cost.value - accumulateddepreciation - salvage.value; - } - accumulateddepreciation += depreciation; - } - - scf.PushOperand(operand, "n$", depreciation); - - return; - }; - - SocialCalc.Formula.FunctionList["DDB"] = [ - SocialCalc.Formula.DDBFunction, - -4, - "ddb", - "", - "financial", - ]; - - /* -# -# SLN(cost,salvage,lifetime) -# -# Depreciation for each period by straight-line method -# See: http://en.wikipedia.org/wiki/Depreciation -# -*/ - - SocialCalc.Formula.SLNFunction = function (fname, operand, foperand, sheet) { - var depreciation; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - - if (lifetime.value < 1) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfuncslnlife - ); - return 0; - } - - depreciation = (cost.value - salvage.value) / lifetime.value; - - scf.PushOperand(operand, "n$", depreciation); - - return; - }; - - SocialCalc.Formula.FunctionList["SLN"] = [ - SocialCalc.Formula.SLNFunction, - 3, - "csl", - "", - "financial", - ]; - - /* -# -# SYD(cost,salvage,lifetime,period) -# -# Depreciation by Sum of Year's Digits method -# -*/ - - SocialCalc.Formula.SYDFunction = function (fname, operand, foperand, sheet) { - var depreciation, sumperiods; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - var period = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - if (scf.CheckForErrorValue(operand, period)) return; - - if (lifetime.value < 1 || period.value <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return 0; - } - - sumperiods = ((lifetime.value + 1) * lifetime.value) / 2; // add up 1 through lifetime - depreciation = - ((cost.value - salvage.value) * (lifetime.value - period.value + 1)) / - sumperiods; // calc depreciation - - scf.PushOperand(operand, "n$", depreciation); - - return; - }; - - SocialCalc.Formula.FunctionList["SYD"] = [ - SocialCalc.Formula.SYDFunction, - 4, - "cslp", - "", - "financial", - ]; - - /* -# -# FV(rate, n, payment, [pv, [paytype]]) -# NPER(rate, payment, pv, [fv, [paytype]]) -# PMT(rate, n, pv, [fv, [paytype]]) -# PV(rate, n, payment, [fv, [paytype]]) -# RATE(n, payment, pv, [fv, [paytype, [guess]]]) -# -# Following the Open Document Format formula specification: -# -# PV = - Fv - (Payment * Nper) [if rate equals 0] -# Pv*(1+Rate)^Nper + Payment * (1 + Rate*PaymentType) * ( (1+Rate)^nper -1)/Rate + Fv = 0 -# -# For each function, the formulas are solved for the appropriate value (transformed using -# basic algebra). -# -*/ - - SocialCalc.Formula.InterestFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var resulttype, result, dval, evalue, fval; - var pv, - fv, - rate, - n, - payment, - paytype, - guess, - part1, - part2, - part3, - part4, - part5; - var olddelta, maxloop, tries, deltaepsilon, rate, oldrate, m; - - var scf = SocialCalc.Formula; - - var aval = scf.OperandAsNumber(sheet, foperand); - var bval = scf.OperandAsNumber(sheet, foperand); - var cval = scf.OperandAsNumber(sheet, foperand); - - resulttype = scf.LookupResultType( - aval.type, - bval.type, - scf.TypeLookupTable.twoargnumeric - ); - resulttype = scf.LookupResultType( - resulttype, - cval.type, - scf.TypeLookupTable.twoargnumeric - ); - if (foperand.length) { - // optional arguments - dval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType( - resulttype, - dval.type, - scf.TypeLookupTable.twoargnumeric - ); - if (foperand.length) { - // optional arguments - evalue = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType( - resulttype, - evalue.type, - scf.TypeLookupTable.twoargnumeric - ); - if (foperand.length) { - // optional arguments - if (fname != "RATE") { - // only rate has 6 possible args - scf.FunctionArgsError(fname, operand); - return 0; - } - fval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType( - resulttype, - fval.type, - scf.TypeLookupTable.twoargnumeric - ); - } - } - } - - if (resulttype == "n") { - switch (fname) { - case "FV": // FV(rate, n, payment, [pv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - pv = dval != null ? dval.value : 0; // get value if present, or use default - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - if (rate == 0) { - // simple calculation if no interest - fv = -pv - payment * n; - } else { - fv = -( - pv * Math.pow(1 + rate, n) + - (payment * (1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / - rate - ); - } - result = fv; - resulttype = "n$"; - break; - - case "NPER": // NPER(rate, payment, pv, [fv, [paytype]]) - rate = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - if (rate == 0) { - // simple calculation if no interest - if (payment == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - n = (pv + fv) / -payment; - } else { - part1 = (payment * (1 + rate * paytype)) / rate; - part2 = pv + part1; - if (part2 == 0 || rate <= -1) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part3 = (part1 - fv) / part2; - if (part3 <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part4 = Math.log(part3); - part5 = Math.log(1 + rate); // rate > -1 - n = part4 / part5; - } - result = n; - resulttype = "n"; - break; - - case "PMT": // PMT(rate, n, pv, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - pv = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - if (n == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } else if (rate == 0) { - // simple calculation if no interest - payment = (fv - pv) / n; - } else { - payment = - (0 - fv - pv * Math.pow(1 + rate, n)) / - (((1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / rate); - } - result = payment; - resulttype = "n$"; - break; - - case "PV": // PV(rate, n, payment, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (eval.value ? 1 : 0) : 0; - if (rate == -1) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } else if (rate == 0) { - // simple calculation if no interest - pv = -fv - payment * n; - } else { - pv = - (-fv - - (payment * (1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / - rate) / - Math.pow(1 + rate, n); - } - result = pv; - resulttype = "n$"; - break; - - case "RATE": // RATE(n, payment, pv, [fv, [paytype, [guess]]]) - n = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - guess = fval != null ? fval.value : 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 100; - tries = 0; - delta = 1; - epsilon = 0.0000001; // this is close enough - rate = guess || 0.00000001; // zero is not allowed - while ((delta >= 0 ? delta : -delta) > epsilon && rate != oldrate) { - delta = - fv + - pv * Math.pow(1 + rate, n) + - (payment * (1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / - rate; - if (olddelta != null) { - m = (delta - olddelta) / (rate - oldrate) || 0.001; // get slope (not zero) - oldrate = rate; - rate = rate - delta / m; // look for zero crossing - olddelta = delta; - } else { - // first time - no old values - oldrate = rate; - rate = 1.1 * rate; - olddelta = delta; - } - tries++; - if (tries >= maxloop) { - // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - result = rate; - resulttype = "n%"; - break; - } - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["FV"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "fv", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["NPER"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "nper", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["PMT"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "pmt", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["PV"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "pv", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["RATE"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "rate", - "", - "financial", - ]; - - /* -# -# NPV(rate,v1,v2,c1:c2,...) -# -*/ - - SocialCalc.Formula.NPVFunction = function (fname, operand, foperand, sheet) { - var resulttypenpv, rate, sum, factor, value1; - - var scf = SocialCalc.Formula; - - var rate = scf.OperandAsNumber(sheet, foperand); - if (scf.CheckForErrorValue(operand, rate)) return; - - sum = 0; - resulttypenpv = "n"; - factor = 1; - - while (foperand.length) { - value1 = scf.OperandValueAndType(sheet, foperand); - if (value1.type.charAt(0) == "n") { - factor *= 1 + rate.value; - if (factor == 0) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - sum += value1.value / factor; - resulttypenpv = scf.LookupResultType( - value1.type, - resulttypenpv || value1.type, - scf.TypeLookupTable.plus - ); - } else if ( - value1.type.charAt(0) == "e" && - resulttypenpv.charAt(0) != "e" - ) { - resulttypenpv = value1.type; - break; - } - } - - if (resulttypenpv.charAt(0) == "n") { - resulttypenpv = "n$"; - } - - scf.PushOperand(operand, resulttypenpv, sum); - - return; - }; - - SocialCalc.Formula.FunctionList["NPV"] = [ - SocialCalc.Formula.NPVFunction, - -2, - "npv", - "", - "financial", - ]; - - /* -# -# IRR(c1:c2,[guess]) -# -*/ - - SocialCalc.Formula.IRRFunction = function (fname, operand, foperand, sheet) { - var value1, - guess, - oldsum, - maxloop, - tries, - epsilon, - rate, - oldrate, - m, - sum, - factor, - i; - var rangeoperand = []; - var cashflows = []; - - var scf = SocialCalc.Formula; - - rangeoperand.push(foperand.pop()); // first operand is a range - - while (rangeoperand.length) { - // get values from range so we can do iterative approximations - value1 = scf.OperandValueAndType(sheet, rangeoperand); - if (value1.type.charAt(0) == "n") { - cashflows.push(value1.value); - } else if (value1.type.charAt(0) == "e") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - } - - if (!cashflows.length) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - - guess = { value: 0 }; - - if (foperand.length) { - // guess is provided - guess = scf.OperandAsNumber(sheet, foperand); - if (guess.type.charAt(0) != "n" && guess.type.charAt(0) != "b") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { - // should be no more args - scf.FunctionArgsError(fname, operand); - return; - } - } - - guess.value = guess.value || 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 20; - tries = 0; - epsilon = 0.0000001; // this is close enough - rate = guess.value; - sum = 1; - - while ((sum >= 0 ? sum : -sum) > epsilon && rate != oldrate) { - sum = 0; - factor = 1; - for (i = 0; i < cashflows.length; i++) { - factor *= 1 + rate; - if (factor == 0) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - sum += cashflows[i] / factor; - } - - if (oldsum != null) { - m = (sum - oldsum) / (rate - oldrate); // get slope - oldrate = rate; - rate = rate - sum / m; // look for zero crossing - oldsum = sum; - } else { - // first time - no old values - oldrate = rate; - rate = 1.1 * rate; - oldsum = sum; - } - tries++; - if (tries >= maxloop) { - // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - - scf.PushOperand(operand, "n%", rate); - - return; - }; - - SocialCalc.Formula.FunctionList["IRR"] = [ - SocialCalc.Formula.IRRFunction, - -1, - "irr", - "", - "financial", - ]; - - // - // SHEET CACHE - // - - SocialCalc.Formula.SheetCache = { - // Sheet data: Attributes are each sheet in the cache with values of an object with: - // - // sheet: sheet-obj (or null, meaning not found) - // recalcstate: constants.asloaded = as loaded - // constants.recalcing = being recalced now - // constants.recalcdone = recalc done - // name: name of sheet (in case just have object and don't know name) - // - - sheets: {}, - - // Waiting for loading: - // If sheet is not in cache, this is set to the sheetname being loaded - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForLoading: null, - - // Constants to use for setting sheets[*].recalcstate: - - constants: { asloaded: 0, recalcing: 1, recalcdone: 2 }, - - loadsheet: null, // (deprecated - use SocialCalc.RecalcInfo.LoadSheet) - }; - - // - // othersheet = SocialCalc.Formula.FindInSheetCache(sheetname) - // - // Returns a SocialCalc.Sheet object corresponding to string sheetname - // or null if the sheet is not available or in error. - // - // Each sheet is loaded only once and then stored in a cache. - // Loading is handled elsewhere, e.g., in the recalc loop. - // - - SocialCalc.Formula.FindInSheetCache = function (sheetname) { - var str; - var sfsc = SocialCalc.Formula.SheetCache; - - var nsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); // normalize different versions - - if (sfsc.sheets[nsheetname]) { - // a sheet by that name is in the cache already - return sfsc.sheets[nsheetname].sheet; // return it - } - - if (sfsc.waitingForLoading) { - // waiting already - only queue up one - return null; // return not found - } - - sfsc.waitingForLoading = nsheetname; // let recalc loop know that we have a sheet to load - - return null; // return not found - }; - - // - // newsheet = SocialCalc.Formula.AddSheetToCache(sheetname, str) - // - // Adds a new sheet to the sheet cache. - // Returns the sheet object filled out with the str (a saved sheet). - // - - SocialCalc.Formula.AddSheetToCache = function (sheetname, str) { - var newsheet = null; - var sfsc = SocialCalc.Formula.SheetCache; - var sfscc = sfsc.constants; - var newsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); - - if (str) { - newsheet = new SocialCalc.Sheet(); - newsheet.ParseSheetSave(str); - } - - sfsc.sheets[newsheetname] = { - sheet: newsheet, - recalcstate: sfscc.asloaded, - name: newsheetname, - }; - - SocialCalc.Formula.FreshnessInfo.sheets[newsheetname] = true; - - return newsheet; - }; - - // - // nsheet = SocialCalc.Formula.NormalizeSheetName(sheetname) - // - - SocialCalc.Formula.NormalizeSheetName = function (sheetname) { - if (SocialCalc.Callbacks.NormalizeSheetName) { - return SocialCalc.Callbacks.NormalizeSheetName(sheetname); - } else { - return sheetname.toLowerCase(); - } - }; - - // - // REMOTE FUNCTION INFO - // - - SocialCalc.Formula.RemoteFunctionInfo = { - // Waiting for server: - // If waiting for an XHR response from the server, this is set to some non-blank status text - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForServer: null, - }; - - // - // FRESHNESS INFO - // - // This information is generated during recalc. - // It may be used to help determine when the recalc data in a spreadsheet - // may be out of date. - // For example, it may be used to display a message like: - // "Dependent on sheet 'FOO' which was updated more recently than this printout" - - SocialCalc.Formula.FreshnessInfo = { - // For each external sheet referenced successfully an attribute of that name with value true. - - sheets: {}, - - // For each volatile function that is called an attribute of that name with value true. - - volatile: {}, - - // Set to false when started and true when recalc completes - - recalc_completed: false, - }; - - SocialCalc.Formula.FreshnessInfoReset = function () { - var scffi = SocialCalc.Formula.FreshnessInfo; - - scffi.sheets = {}; - scffi.volatile = {}; - scffi.recalc_completed = false; - }; - - // - // MISC ROUTINES - // - - // - // result = SocialCalc.Formula.PlainCoord(coord) - // - // Returns: coord without any $'s - // - - SocialCalc.Formula.PlainCoord = function (coord) { - if (coord.indexOf("$") == -1) return coord; - - return coord.replace(/\$/g, ""); // remove any $'s - }; - - // - // result = SocialCalc.Formula.OrderRangeParts(coord1, coord2) - // - // Returns: {c1: col, r1: row, c2: col, r2 = row} with c1/r1 upper left - // - - SocialCalc.Formula.OrderRangeParts = function (coord1, coord2) { - var cr1, cr2; - var result = {}; - - cr1 = SocialCalc.coordToCr(coord1); - cr2 = SocialCalc.coordToCr(coord2); - if (cr1.col > cr2.col) { - result.c1 = cr2.col; - result.c2 = cr1.col; - } else { - result.c1 = cr1.col; - result.c2 = cr2.col; - } - if (cr1.row > cr2.row) { - result.r1 = cr2.row; - result.r2 = cr1.row; - } else { - result.r1 = cr1.row; - result.r2 = cr2.row; - } - - return result; - }; - - // - // cond = SocialCalc.Formula.TestCriteria(value, type, criteria) - // - // Determines whether a value/type meets the criteria. - // A criteria can be a numeric value, text beginning with <, <=, =, >=, >, <>, text by itself is start of text to match. - // Used by a variety of functions, including the "D" functions (DSUM, etc.). - // - // Returns true or false - // - - SocialCalc.Formula.TestCriteria = function (value, type, criteria) { - var comparitor, basestring, basevalue, cond, testvalue; - - if (criteria == null) { - // undefined (e.g., error value) is always false - return false; - } - - criteria = criteria + ""; - comparitor = criteria.charAt(0); // look for comparitor - if (comparitor == "=" || comparitor == "<" || comparitor == ">") { - basestring = criteria.substring(1); - } else { - comparitor = criteria.substring(0, 2); - if (comparitor == "<=" || comparitor == "<>" || comparitor == ">=") { - basestring = criteria.substring(2); - } else { - comparitor = "none"; - basestring = criteria; - } - } - - basevalue = SocialCalc.DetermineValueType(basestring); // get type of value being compared - if (!basevalue.type) { - // no criteria base value given - if (comparitor == "none") { - // blank criteria matches nothing - return false; - } - if (type.charAt(0) == "b") { - // comparing to empty cell - if (comparitor == "=") { - // empty equals empty - return true; - } - } else { - if (comparitor == "<>") { - // "something" does not equal empty - return true; - } - } - return false; // otherwise false - } - - cond = false; - - if (basevalue.type.charAt(0) == "n" && type.charAt(0) == "t") { - // criteria is number, but value is text - testvalue = SocialCalc.DetermineValueType(value); - if (testvalue.type.charAt(0) == "n") { - // could be number - make it one - value = testvalue.value; - type = testvalue.type; - } - } - - if (type.charAt(0) == "n" && basevalue.type.charAt(0) == "n") { - // compare two numbers - value = value - 0; // make sure numbers - basevalue.value = basevalue.value - 0; - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - case "none": - cond = value == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } else if (type.charAt(0) == "e") { - // error on left - cond = false; - } else if (basevalue.type.charAt(0) == "e") { - // error on right - cond = false; - } else { - // text, maybe mixed with number or blank - if (type.charAt(0) == "n") { - value = SocialCalc.format_number_for_display(value, "n", ""); - } - if (basevalue.type.charAt(0) == "n") { - return false; // if number and didn't match already, isn't a match - } - - value = value ? value.toLowerCase() : ""; - basevalue.value = basevalue.value ? basevalue.value.toLowerCase() : ""; - - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - cond = value == basevalue.value; - break; - - case "none": - cond = value.substring(0, basevalue.value.length) == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } - - return cond; - }; - - // - /* -// The module of the SocialCalc package for the optional popup menus in socialcalcspreadsheetcontrol.js -// -// (c) Copyright 2009 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// -*/ - - var SocialCalc; // All values are stored in the master SocialCalc object - if (!SocialCalc) { - SocialCalc = {}; - } - - // The main Popup data -- there is only one set - - SocialCalc.Popup = {}; - - // Routines and values for each type of control, indexed by type name - // The value for each is an object constructed as follows: - // - // Create = function(type, id, attribs) - // Initialize = function(type, id, data) - // SetValue = function(type, id, value) - // GetValue = function(type, id) returns value - // SetDisabled = function(type, id, t/f) - // Show = function(type, id) - // Hide = function(type, id) - // Cancel = function(type, id) - // Reset = function(type) - // - // data = object to hold type-specific data - // - - SocialCalc.Popup.Types = {}; - - // Definitions for each individual control, indexed by id - // The value for each is an object constructed as follows: - // - // type: type name of the control - // value: current value of the control (usually a string, but can depend on type) - // data: object with type-specific items - // - - SocialCalc.Popup.Controls = {}; - - // System-wide values of currently active control - // - // id: id of current control or null - // - - SocialCalc.Popup.Current = {}; - - // Other values used by the Popup system - // - - SocialCalc.Popup.imagePrefix = "/socialcalc/images/sc_"; // image prefix - - // Override this for localization - - SocialCalc.Popup.LocalizeString = function (str) { - return str; - }; - - // * * * * * * * * * * * * * * * * - // - // GENERAL ROUTINES - // - // * * * * * * * * * * * * * * * * - - // - // SocialCalc.Popup.Create(type, id, attribs) - // - // Creates a control of type "type" as the children of document element "id" using "attribs" - // - - SocialCalc.Popup.Create = function (type, id, attribs) { - var pt = SocialCalc.Popup.Types[type]; - if (pt && pt.Create) { - pt.Create(type, id, attribs); - } - }; - - // - // SocialCalc.Popup.SetValue(id, value) - // - // Sets the value of control. - // - - SocialCalc.Popup.SetValue = function (id, value) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - var pt = spt[type]; - var spcdata = spc[id].data; - - if (pt && pt.Create) { - pt.SetValue(type, id, value); - if (spcdata.attribs && spcdata.attribs.changedcallback) { - spcdata.attribs.changedcallback(spcdata.attribs, id, value); - } - } - }; - - // - // SocialCalc.Popup.SetDisabled(id, disabled) - // - // Sets whether the control is disabled (true) or not (false). - // - - SocialCalc.Popup.SetDisabled = function (id, disabled) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - if (sp.Current.id && id == sp.Current.id) { - pt.Hide(type, sp.Current.id); - sp.Current.id = null; - } - pt.SetDisabled(type, id, disabled); - } - }; - - // - // SocialCalc.Popup.GetValue(id) - // - // Returns the value of control. - // - - SocialCalc.Popup.GetValue = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - return pt.GetValue(type, id); - } - - return null; - }; - - // - // SocialCalc.Popup.Initialize(id, data) - // - // Gives "data" to the appropriate initialization code. - // - - SocialCalc.Popup.Initialize = function (id, data) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Initialize) { - pt.Initialize(type, id, data); - } - }; - - // - // SocialCalc.Popup.Reset(type) - // - // Resets Popup, such as when turning to page. - // - - SocialCalc.Popup.Reset = function (type) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (spt[type].Reset) spt[type].Reset(type); - }; - - // - // SocialCalc.Popup.CClick(id) - // - // Should be called when the user clicks on a control to do the popup - // - - SocialCalc.Popup.CClick = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - if (spc[id].data && spc[id].data.disabled) return; - - var type = spc[id].type; - - var pt = spt[type]; - - if (sp.Current.id) { - spt[spc[sp.Current.id].type].Hide(type, sp.Current.id); - if (id == sp.Current.id) { - // same one - done - sp.Current.id = null; - return; - } - } - - if (pt && pt.Show) { - pt.Show(type, id); - } - - sp.Current.id = id; - }; - - // - // SocialCalc.Popup.Close() - // - // Used to close any open popup. - // - - SocialCalc.Popup.Close = function () { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - sp.CClick(sp.Current.id); - }; - - // - // SocialCalc.Popup.Cancel() - // - // Closes Popup and restores old value - // - - SocialCalc.Popup.Cancel = function () { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - var type = spc[sp.Current.id].type; - - var pt = spt[type]; - - pt.Cancel(type, sp.Current.id); - - sp.Current.id = null; - }; - - // - // ele = SocialCalc.Popup.CreatePopupDiv(id, attribs) - // - // Utility function to create the main popup div of width attribs.width. - // If attribs.title, create one with that text, and optionally attribs.moveable. - // - - SocialCalc.Popup.CreatePopupDiv = function (id, attribs) { - var pos, ele; - - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = document.createElement("div"); - main.style.position = "absolute"; - - pos = SocialCalc.GetElementPositionWithScroll(spcdata.mainele); - - main.style.top = pos.top + spcdata.mainele.offsetHeight + "px"; - main.style.left = pos.left + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - if (attribs.width) { - main.style.width = attribs.width; - } - - spcdata.mainele.appendChild(main); - - if (attribs.title) { - main.innerHTML = - '' + - '" + - '
' + - attribs.title + - " X 
'; - - if (attribs.moveable) { - spcdata.dragregistered = - main.firstChild.firstChild.firstChild.firstChild; - SocialCalc.DragRegister(spcdata.dragregistered, true, true, { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - }); - } - } - - return main; - }; - - // - // SocialCalc.Popup.EnsurePosition(id, container) - // - // Utility function to make sure popup is positioned completely within container (both element objects) - // and appropriate with respect to the main element controlling the popup. - // - - SocialCalc.Popup.EnsurePosition = function (id, container) { - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = spcdata.mainele.firstChild; - if (!main) { - alert("No main popup element firstChild."); - return; - } - var popup = spcdata.popupele; - - function GetLayoutValues(ele) { - var r = SocialCalc.GetElementPositionWithScroll(ele); - r.height = ele.offsetHeight; - r.width = ele.offsetWidth; - r.bottom = r.top + r.height; - r.right = r.left + r.width; - return r; - } - - var p = GetLayoutValues(popup); - var c = GetLayoutValues(container); - var m = GetLayoutValues(main); - var t = 0; // type of placement - //addmsg("popup t/r/b/l/h/w= "+p.top+"/"+p.right+"/"+p.bottom+"/"+p.left+"/"+p.height+"/"+p.width); - //addmsg("container t/r/b/l/h/w= "+c.top+"/"+c.right+"/"+c.bottom+"/"+c.left+"/"+c.height+"/"+c.width); - //addmsg("main t/r/b/l/h/w= "+m.top+"/"+m.right+"/"+m.bottom+"/"+m.left+"/"+m.height+"/"+m.width); - - // Check various layout cases in priority order - - if (m.bottom + p.height < c.bottom && m.left + p.width < c.right) { - // normal case: room on bottom and right - popup.style.top = m.bottom + "px"; - popup.style.left = m.left + "px"; - t = 1; - } else if (m.top - p.height > c.top && m.left + p.width < c.right) { - // room on top and right - popup.style.top = m.top - p.height + "px"; - popup.style.left = m.left + "px"; - t = 2; - } else if (m.bottom + p.height < c.bottom && m.right - p.width > c.left) { - // room on bottom and left - popup.style.top = m.bottom + "px"; - popup.style.left = m.right - p.width + "px"; - t = 3; - } else if (m.top - p.height > c.top && m.right - p.width > c.left) { - // room on top and left - popup.style.top = m.top - p.height + "px"; - popup.style.left = m.right - p.width + "px"; - t = 4; - } else if (m.bottom + p.height < c.bottom && p.width < c.width) { - // room on bottom and middle - popup.style.top = m.bottom + "px"; - popup.style.left = c.left + Math.floor((c.width - p.width) / 2) + "px"; - t = 5; - } else if (m.top - p.height > c.top && p.width < c.width) { - // room on top and middle - popup.style.top = m.top - p.height + "px"; - popup.style.left = c.left + Math.floor((c.width - p.width) / 2) + "px"; - t = 6; - } else if (p.height < c.height && m.right + p.width < c.right) { - // room on middle and right - popup.style.top = c.top + Math.floor((c.height - p.height) / 2) + "px"; - popup.style.left = m.right + "px"; - t = 7; - } else if (p.height < c.height && m.left - p.width > c.left) { - // room on middle and left - popup.style.top = c.top + Math.floor((c.height - p.height) / 2) + "px"; - popup.style.left = m.left - p.width + "px"; - t = 8; - } else { - // nothing works, so leave as it is - } - //addmsg("Popup layout "+t); - }; - - // - // ele = SocialCalc.Popup.DestroyPopupDiv(ele, dragregistered) - // - // Utility function to get rid of the main popup div. - // - - SocialCalc.Popup.DestroyPopupDiv = function (ele, dragregistered) { - if (!ele) return; - - ele.innerHTML = ""; - - SocialCalc.DragUnregister(dragregistered); // OK to do this even if not registered - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - // - // Color Utility Functions - // - - SocialCalc.Popup.RGBToHex = function (val) { - var sp = SocialCalc.Popup; - - if (val == "") { - return "000000"; - } - var rgbvals = val.match(/(\d+)\D+(\d+)\D+(\d+)/); - if (rgbvals) { - return sp.ToHex(rgbvals[1]) + sp.ToHex(rgbvals[2]) + sp.ToHex(rgbvals[3]); - } else { - return "000000"; - } - }; - - SocialCalc.Popup.HexDigits = "0123456789ABCDEF"; - - SocialCalc.Popup.ToHex = function (num) { - var sp = SocialCalc.Popup; - var first = Math.floor(num / 16); - var second = num % 16; - return sp.HexDigits.charAt(first) + sp.HexDigits.charAt(second); - }; - - SocialCalc.Popup.FromHex = function (str) { - var sp = SocialCalc.Popup; - var first = sp.HexDigits.indexOf(str.charAt(0).toUpperCase()); - var second = sp.HexDigits.indexOf(str.charAt(1).toUpperCase()); - return (first >= 0 ? first : 0) * 16 + (second >= 0 ? second : 0); - }; - - SocialCalc.Popup.HexToRGB = function (val) { - var sp = SocialCalc.Popup; - - return ( - "rgb(" + - sp.FromHex(val.substring(1, 3)) + - "," + - sp.FromHex(val.substring(3, 5)) + - "," + - sp.FromHex(val.substring(5, 7)) + - ")" - ); - }; - - SocialCalc.Popup.makeRGB = function (r, g, b) { - return ( - "rgb(" + - (r > 0 ? r : 0) + - "," + - (g > 0 ? g : 0) + - "," + - (b > 0 ? b : 0) + - ")" - ); - }; - - SocialCalc.Popup.splitRGB = function (rgb) { - var parts = rgb.match(/(\d+)\D+(\d+)\D+(\d+)\D/); - if (!parts) { - return { r: 0, g: 0, b: 0 }; - } else { - return { r: parts[1] - 0, g: parts[2] - 0, b: parts[3] - 0 }; - } - }; - - // * * * * * * * * * * * * * * * * - // - // ROUTINES FOR EACH TYPE - // - // * * * * * * * * * * * * * * * * - - // - // List - // - // type: List - // value: value of control, - // display: "value to display", - // custom: true if custom value, - // disabled: t/f, - // attribs: { - // title: "popup title string", - // moveable: t/f, - // width: optional width, e.g., "100px", - // ensureWithin: optional element object to ensure popup fits within if possible - // changedcallback: optional function(attribs, id, newvalue), - // ... - // } - // data: { - // ncols: calculated number of columns - // options: [ - // {o: option-name, v: value-to-return, - // a: {option attribs} // optional: {skip: true, custom: true, cancel: true, newcol: true} - // }, - // ...] - // } - // - // popupele: gets popup element object when created - // contentele: gets element created with all the content - // listdiv: gets div with list of items - // customele: gets input element with custom value - // dragregistered: gets element, if any, registered as draggable - // - - SocialCalc.Popup.Types.List = {}; - - SocialCalc.Popup.Types.List.Create = function (type, id, attribs) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - var spcid = { type: type, value: "", display: "", data: {} }; - if (spc[id]) { - return; - } - spc[id] = spcid; - var spcdata = spcid.data; - - spcdata.attribs = attribs || {}; - - var ele = document.getElementById(id); - if (!ele) { - alert("Missing element " + id); - return; - } - - spcdata.mainele = ele; - - ele.innerHTML = - ''; - - spcdata.options = []; // set to nothing - use Initialize to fill - }; - - SocialCalc.Popup.Types.List.SetValue = function (type, id, value) { - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - spcdata.value = value; - spcdata.custom = false; - - for (i = 0; i < spcdata.options.length; i++) { - o = spcdata.options[i]; - if (o.a) { - if (o.a.skip || o.a.custom || o.a.cancel) { - continue; - } - } - if (o.v == spcdata.value) { - // matches value - spcdata.display = o.o; - break; - } - } - if (i == spcdata.options.length) { - // none found - spcdata.display = "Custom"; - spcdata.custom = true; - } - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.value = spcdata.display; - } - }; - - SocialCalc.Popup.Types.List.SetDisabled = function (type, id, disabled) { - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - spcdata.disabled = disabled; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = disabled; - } - }; - - SocialCalc.Popup.Types.List.GetValue = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - return spcdata.value; - }; - - // data is: {value: initial value, attribs: {attribs stuff}, options: [{o: option-name, v: value-to-return, a: optional-attribs}, ...]} - - SocialCalc.Popup.Types.List.Initialize = function (type, id, data) { - var a; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - for (a in data.attribs) { - spcdata.attribs[a] = data.attribs[a]; - } - - spcdata.options = data ? data.options : []; - - if (data.value) { - // if has a value, set to it - sp.SetValue(id, data.value); - } - }; - - SocialCalc.Popup.Types.List.Reset = function (type) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (sp.Current.id && spc[sp.Current.id].type == type) { - // we have a popup - spt[type].Hide(type, sp.Current.id); - sp.Current.id = null; - } - }; - - SocialCalc.Popup.Types.List.Show = function (type, id) { - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var str = ""; - - spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs); - - if (spcdata.custom) { - str = SocialCalc.Popup.Types.List.MakeCustom(type, id); - - ele = document.createElement("div"); - ele.innerHTML = - '
' + - str + - "
"; - - spcdata.customele = ele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = ele; - } else { - str = SocialCalc.Popup.Types.List.MakeList(type, id); - - ele = document.createElement("div"); - ele.innerHTML = - '
' + str + "
"; - - spcdata.customele = null; - spcdata.listdiv = ele.firstChild; - spcdata.contentele = ele; - } - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = true; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.List.MakeList = function (type, id) { - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var str = ''; - var td = '" + td + "    " + "" + td; - spcdata.ncols += 1; - continue; - } - if (o.a.skip) { - str += - '
' + - o.o + - "
"; - continue; - } - } - if (o.v == spcdata.value && !(o.a && (o.a.custom || o.a.cancel))) { - // matches value - bg = "background-color:#DDF;"; - } else { - bg = ""; - } - str += - '
" + - o.o + - "
"; - } - - str += "
'; - - str += td; - - spcdata.ncols = 1; - - for (i = 0; i < spcdata.options.length; i++) { - o = spcdata.options[i]; - if (o.a) { - if (o.a.newcol) { - str += "
"; - - return str; - }; - - SocialCalc.Popup.Types.List.MakeCustom = function (type, id) { - var SPLoc = SocialCalc.Popup.LocalizeString; - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - var val = spcdata.value; - val = SocialCalc.special_chars(val); - - str = - '

' + - '

' + - "" + - "" + - "' + - "
"; - - return str; - }; - - SocialCalc.Popup.Types.List.ItemClicked = function (id, num) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var a = spcdata.options[num].a; - - if (a && a.custom) { - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeCustom("List", id); - nele = document.createElement("div"); - nele.innerHTML = - '
' + - str + - "
"; - spcdata.customele = nele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - return; - } - - if (a && a.cancel) { - SocialCalc.Popup.Close(); - return; - } - - SocialCalc.Popup.SetValue(id, spcdata.options[num].v); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.List.CustomToList = function (id) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeList("List", id); - nele = document.createElement("div"); - nele.innerHTML = - '
' + str + "
"; - spcdata.customele = null; - spcdata.listdiv = nele.firstChild; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.List.CustomOK = function (id) { - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.customele.value); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.List.MouseMove = function (id, ele) { - var col, i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var list = spcdata.listdiv; - - if (!list) return; - - var rowele = list.firstChild.firstChild.firstChild; // div.table.tbody.tr - - for (col = 0; col < spcdata.ncols; col++) { - for (i = 0; i < rowele.childNodes[col * 2].childNodes.length; i++) { - rowele.childNodes[col * 2].childNodes[i].style.backgroundColor = "#FFF"; - } - } - - ele.style.backgroundColor = "#DDF"; - }; - - SocialCalc.Popup.Types.List.Hide = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered); - spcdata.popupele = null; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = false; - } - }; - - SocialCalc.Popup.Types.List.Cancel = function (type, id) { - SocialCalc.Popup.Types.List.Hide(type, id); - }; - - // - // ColorChooser - // - // type: ColorChooser - // value: value of control as "rgb(r,g,b)" or "" if default, - // oldvalue: starting value to reset to on close, - // display: "value to display" as hex color value, - // custom: true if custom value, - // disabled: t/f, - // attribs: { - // title: "popup title string", - // moveable: t/f, - // width: optional width, e.g., "100px", of popup chooser - // ensureWithin: optional element object to ensure popup fits within if possible - // sampleWidth: optional width, e.g., "20px", - // sampleHeight: optional height, e.g., "20px", - // backgroundImage: optional background image for sample (transparent where want to show current color), e.g., "colorbg.gif" - // backgroundImageDefault: optional background image for sample when default (transparent shows white) - // backgroundImageDisabled: optional background image for sample when disabled (transparent shows gray) - // changedcallback: optional function(attribs, id, newvalue), - // ... - // } - // data: { - // } - // - // popupele: gets popup element object when created - // contentele: gets element created with all the content - // customele: gets input element with custom value - // - - SocialCalc.Popup.Types.ColorChooser = {}; - - SocialCalc.Popup.Types.ColorChooser.Create = function (type, id, attribs) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - var spcid = { type: type, value: "", display: "", data: {} }; - if (spc[id]) { - return; - } - spc[id] = spcid; - var spcdata = spcid.data; - - spcdata.attribs = attribs || {}; - var spca = spcdata.attribs; - - spcdata.value = ""; - - var ele = document.getElementById(id); - if (!ele) { - alert("Missing element " + id); - return; - } - - spcdata.mainele = ele; - - ele.innerHTML = - '
 
"; - }; - - SocialCalc.Popup.Types.ColorChooser.SetValue = function (type, id, value) { - var i, img, pos; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.value = value; - spcdata.custom = false; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (spcdata.value) { - spcdata.mainele.firstChild.style.backgroundColor = spcdata.value; - if (spca.backgroundImage) { - img = "url(" + sp.imagePrefix + spca.backgroundImage + ")"; - } else { - img = ""; - } - pos = "center center"; - } else { - spcdata.mainele.firstChild.style.backgroundColor = "#FFF"; - if (spca.backgroundImageDefault) { - img = "url(" + sp.imagePrefix + spca.backgroundImageDefault + ")"; - pos = "center center"; - } else { - img = "url(" + sp.imagePrefix + "defaultcolor.gif)"; - pos = "left top"; - } - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } - }; - - SocialCalc.Popup.Types.ColorChooser.SetDisabled = function ( - type, - id, - disabled - ) { - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.disabled = disabled; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (disabled) { - spcdata.mainele.firstChild.style.backgroundColor = "#DDD"; - if (spca.backgroundImageDisabled) { - img = "url(" + sp.imagePrefix + spca.backgroundImageDisabled + ")"; - pos = "center center"; - } else { - img = "url(" + sp.imagePrefix + "defaultcolor.gif)"; - pos = "left top"; - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } else { - sp.SetValue(id, spcdata.value); - } - } - }; - - SocialCalc.Popup.Types.ColorChooser.GetValue = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - return spcdata.value; - }; - - SocialCalc.Popup.Types.ColorChooser.Initialize = function (type, id, data) { - var a; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - for (a in data.attribs) { - spcdata.attribs[a] = data.attribs[a]; - } - - if (data.value) { - // if has a value, set to it - sp.SetValue(id, data.value); - } - }; - - SocialCalc.Popup.Types.ColorChooser.Reset = function (type) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (sp.Current.id && spc[sp.Current.id].type == type) { - // we have a popup - spt[type].Hide(type, sp.Current.id); - sp.Current.id = null; - } - }; - - SocialCalc.Popup.Types.ColorChooser.Show = function (type, id) { - var i, ele, mainele; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var str = ""; - - spcdata.oldvalue = spcdata.value; // remember starting value - - spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs); - - if (spcdata.custom) { - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom(type, id); - - ele = document.createElement("div"); - ele.innerHTML = - '
' + - str + - "
"; - - spcdata.customele = ele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = ele; - } else { - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid(type, id); - - ele = document.createElement("div"); - ele.style.padding = "3px"; - ele.style.backgroundColor = "#CCC"; - ele.appendChild(mainele); - - spcdata.customele = null; - spcdata.contentele = ele; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.ColorChooser.MakeCustom = function (type, id) { - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var SPLoc = sp.LocalizeString; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - str = - '

' + - '#

' + - "" + - "" + - "
"; - - return str; - }; - - SocialCalc.Popup.Types.ColorChooser.ItemClicked = function (id, num) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.CustomToList = function (id) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - }; - - SocialCalc.Popup.Types.ColorChooser.CustomOK = function (id) { - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.customele.value); - - sp.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.Hide = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered); - spcdata.popupele = null; - }; - - SocialCalc.Popup.Types.ColorChooser.Cancel = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.oldvalue); // reset to old value - - SocialCalc.Popup.Types.ColorChooser.Hide(type, id); - }; - - SocialCalc.Popup.Types.ColorChooser.CreateGrid = function (type, id) { - var ele, pos, row, rowele, col, g; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var SPLoc = sp.LocalizeString; - var spcdata = spc[id].data; - spcdata.grid = {}; - var grid = spcdata.grid; - - var mainele = document.createElement("div"); - - ele = document.createElement("table"); - ele.cellSpacing = 0; - ele.cellPadding = 0; - ele.style.width = "100px"; - grid.table = ele; - - ele = document.createElement("tbody"); - grid.table.appendChild(ele); - grid.tbody = ele; - - for (row = 0; row < 16; row++) { - rowele = document.createElement("tr"); - for (col = 0; col < 5; col++) { - g = {}; - grid[row + "," + col] = g; - ele = document.createElement("td"); - ele.style.fontSize = "1px"; - ele.innerHTML = " "; - ele.style.height = "10px"; - if (col <= 1) { - ele.style.width = "17px"; - ele.style.borderRight = "3px solid white"; - } else { - ele.style.width = "20px"; - ele.style.backgroundRepeat = "no-repeat"; - } - rowele.appendChild(ele); - g.ele = ele; - } - grid.tbody.appendChild(rowele); - } - mainele.appendChild(grid.table); - - ele = document.createElement("div"); - ele.style.marginTop = "3px"; - ele.innerHTML = - '' + - '' + - '' + - '" + - "
 #' + - SPLoc("OK") + - "
"; - grid.defaultbox = ele.firstChild.firstChild.firstChild.childNodes[0]; - grid.defaultbox.onclick = spt.ColorChooser.DefaultClicked; - grid.custom = ele.firstChild.firstChild.firstChild.childNodes[1]; - grid.custom.onclick = spt.ColorChooser.CustomClicked; - grid.msg = ele.firstChild.firstChild.firstChild.childNodes[2]; - grid.msg.onclick = spt.ColorChooser.CloseOK; - mainele.appendChild(ele); - - grid.table.onmousedown = spt.ColorChooser.GridMouseDown; - - spt.ColorChooser.DetermineColors(id); - spt.ColorChooser.SetColors(id); - - return mainele; - }; - - SocialCalc.Popup.Types.ColorChooser.gridToG = function (grid, row, col) { - return grid[row + "," + col]; - }; - - SocialCalc.Popup.Types.ColorChooser.DetermineColors = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - var col, row; - var rgb = sp.splitRGB(spcdata.value); - var color; - - col = 2; - row = 16 - Math.floor((rgb.r + 16) / 16); - grid["selectedrow" + col] = row; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB(17 * (15 - row), 0, 0); - } - - col = 3; - row = 16 - Math.floor((rgb.g + 16) / 16); - grid["selectedrow" + col] = row; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB(0, 17 * (15 - row), 0); - } - - col = 4; - row = 16 - Math.floor((rgb.b + 16) / 16); - grid["selectedrow" + col] = row; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB(0, 0, 17 * (15 - row)); - } - - col = 1; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB( - 17 * (15 - row), - 17 * (15 - row), - 17 * (15 - row) - ); - } - - col = 0; - var steps = [0, 68, 153, 204, 255]; - var commonrgb = [ - "400", - "310", - "420", - "440", - "442", - "340", - "040", - "042", - "032", - "044", - "024", - "004", - "204", - "314", - "402", - "414", - ]; - var x; - for (row = 0; row < 16; row++) { - x = commonrgb[row]; - sptc.gridToG(grid, row, col).rgb = - "rgb(" + - steps[x.charAt(0) - 0] + - "," + - steps[x.charAt(1) - 0] + - "," + - steps[x.charAt(2) - 0] + - ")"; - } - }; - - SocialCalc.Popup.Types.ColorChooser.SetColors = function (id) { - var row, col, g, ele, rgb; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - for (row = 0; row < 16; row++) { - for (col = 0; col < 5; col++) { - g = sptc.gridToG(grid, row, col); - g.ele.style.backgroundColor = g.rgb; - g.ele.title = sp.RGBToHex(g.rgb); - if (grid["selectedrow" + col] == row) { - g.ele.style.backgroundImage = - "url(" + sp.imagePrefix + "chooserarrow.gif)"; - } else { - g.ele.style.backgroundImage = ""; - } - } - } - - sp.SetValue(id, spcdata.value); - - grid.msg.style.backgroundColor = spcdata.value; - rgb = sp.splitRGB(spcdata.value || "rgb(255,255,255)"); - if (rgb.r + rgb.g + rgb.b < 220) { - grid.msg.style.color = "#FFF"; - } else { - grid.msg.style.color = "#000"; - } - if (!spcdata.value) { - // default - grid.msg.style.backgroundColor = "#FFF"; - grid.msg.style.backgroundImage = - "url(" + sp.imagePrefix + "defaultcolor.gif)"; - grid.msg.title = "Default"; - } else { - grid.msg.style.backgroundImage = ""; - grid.msg.title = sp.RGBToHex(spcdata.value); - } - }; - - SocialCalc.Popup.Types.ColorChooser.GridMouseDown = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - var grid = spcdata.grid; - - switch (event.type) { - case "mousedown": - grid.mousedown = true; - break; - case "mouseup": - grid.mousedown = false; - break; - case "mousemove": - if (!grid.mousedown) { - return; - } - break; - } - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - var gpos = SocialCalc.GetElementPosition(grid.table); - var row = Math.floor((clientY - gpos.top - 2) / 10); // -2 is to split the diff btw IE & FF - row = row < 0 ? 0 : row; - var col = Math.floor((clientX - gpos.left) / 20); - row = row < 0 ? 0 : row > 15 ? 15 : row; - col = col < 0 ? 0 : col > 4 ? 4 : col; - var color = sptc.gridToG(grid, row, col).ele.style.backgroundColor; - var newrgb = sp.splitRGB(color); - var oldrgb = sp.splitRGB(spcdata.value); - - switch (col) { - case 2: - spcdata.value = sp.makeRGB(newrgb.r, oldrgb.g, oldrgb.b); - break; - case 3: - spcdata.value = sp.makeRGB(oldrgb.r, newrgb.g, oldrgb.b); - break; - case 4: - spcdata.value = sp.makeRGB(oldrgb.r, oldrgb.g, newrgb.b); - break; - case 0: - case 1: - spcdata.value = color; - } - - sptc.DetermineColors(id); - sptc.SetColors(id); - }; - - SocialCalc.Popup.Types.ColorChooser.ControlClicked = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var cid = sp.Current.id; - if (!cid || id != cid) { - sp.CClick(id); - return; - } - - sptc.CloseOK(); - }; - - SocialCalc.Popup.Types.ColorChooser.DefaultClicked = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - spcdata.value = ""; - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.CustomClicked = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - var oele, str, nele; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom("ColorChooser", id); - nele = document.createElement("div"); - nele.innerHTML = - '
' + - str + - "
"; - spcdata.customele = nele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - spcdata.customele.value = sp.RGBToHex(spcdata.value); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.ColorChooser.CustomToGrid = function (id) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#" + spcdata.customele.value)); - - var oele, mainele, nele; - - oele = spcdata.contentele; - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid( - "ColorChooser", - id - ); - nele = document.createElement("div"); - nele.style.padding = "3px"; - nele.style.backgroundColor = "#CCC"; - nele.appendChild(mainele); - spcdata.customele = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.ColorChooser.CustomOK = function (id) { - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#" + spcdata.customele.value)); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.CloseOK = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - }; - - // - // SocialCalcSpreadsheetControl - // - /* -// The code module of the SocialCalc package that lets you embed a spreadsheet -// control with toolbar, etc., into a web page. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - - /* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript SpreadsheetControl. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the SpreadsheetControl is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/ - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - - // - // Some of the other files in the SocialCalc package are licensed under - // different licenses. Please note the licenses of the modules you use. - // - // Code History: - // - // Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. - // Unless otherwise specified, referring to "SocialCalc" in comments refers to this - // JavaScript version of the code, not the SocialCalc Perl code. - // - - /* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); - } - - // ************************************* - // - // SpreadsheetControl class: - // - // ************************************* - - // Global constants: - - SocialCalc.CurrentSpreadsheetControlObject = null; // right now there can only be one active at a time - - // Constructor: - - SocialCalc.SpreadsheetControl = function () { - var scc = SocialCalc.Constants; - - // Properties: - - this.parentNode = null; - this.spreadsheetDiv = null; - this.requestedHeight = 0; - this.requestedWidth = 0; - this.requestedSpaceBelow = 0; - this.height = 0; - this.width = 0; - this.viewheight = 0; // calculated amount for views below toolbar, etc. - - // Tab definitions: An array where each tab is an object of the form: - // - // name: "name", - // text: "text-on-tab", - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext - // Other replacements from spreadsheet.tabreplacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // view: "viewname", // view to show when selected; "sheet" or missing/null is spreadsheet - // oncreate: function(spreadsheet, tab-name), // called when first created to initialize - // onclick: function(spreadsheet, tab-name), missing/null is sheet default - // onclickFocus: text, // spreadsheet.idPrefix+text is given the focus if present instead of normal KeyboardFocus - // or if text isn't a string, that value (e.g., true) is used for SocialCalc.CmdGotFocus - // onunclick: function(spreadsheet, tab-name), missing/null is sheet default - - this.tabs = []; - this.tabnums = {}; // when adding tabs, add tab-name: array-index to this object - this.tabreplacements = {}; // see use above - this.currentTab = -1; // currently selected tab index in this.tabs or -1 (maintained by SocialCalc.SetTab) - - // View definitions: An object where each view is an object of the form: - // - // name: "name", // localized when first set using SocialCalc.LocalizeString - // element: node-in-the-dom, // filled in when initialized - // replacements: {}, // see below - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext, "%img.": spreadsheet.imagePrefix, - // SocialCalc.LocalizeSubstring replacements ("%loc!string!" and "%ssc!constant-name!") - // Other replacements from viewobject.replacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // divStyle: attributes for sheet div (SocialCalc.setStyles format) - // oncreate: function(spreadsheet, viewobject), // called when first created to initialize - // needsresize: true/false/null, // if true, do resize calc after displaying - // onresize: function(spreadsheet, viewobject), // called if needs resize - // values: {} // optional values to share with onclick handlers, etc. - // - // There is always a "sheet" view. - - this.views = {}; // {viewname: view-object, ...} - - // Dynamic properties: - - this.sheet = null; - this.context = null; - this.editor = null; - - this.spreadsheetDiv = null; - this.editorDiv = null; - - this.sortrange = ""; // remembered range for sort tab - - this.moverange = ""; // remembered range from movefrom used by movepaste/moveinsert - - // Constants: - - this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-" - this.multipartBoundary = "SocialCalcSpreadsheetControlSave"; // boundary used by SpreadsheetControlCreateSpreadsheetSave - this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src - - this.toolbarbackground = scc.SCToolbarbackground; - this.tabbackground = scc.SCTabbackground; // "background-color:#CCC;"; - this.tabselectedCSS = scc.SCTabselectedCSS; - this.tabplainCSS = scc.SCTabplainCSS; - this.toolbartext = scc.SCToolbartext; - - this.formulabarheight = scc.SCFormulabarheight; // in pixels, will contain a text input box - - if (scc.doWorkBook) { - this.sheetbarheight = scc.SCSheetBarHeight; - this.sheetbarCSS = scc.SCSheetBarCSS; - } else { - this.sheetbarheight = 0; - } - - this.statuslineheight = scc.SCStatuslineheight; // in pixels - this.statuslineCSS = scc.SCStatuslineCSS; - - // Callbacks: - - this.ExportCallback = null; // a function called for Clipboard Export button: this.ExportCallback(spreadsheet_control_object) - - // Initialization Code: - - this.sheet = new SocialCalc.Sheet(); - this.context = new SocialCalc.RenderContext(this.sheet); - this.context.showGrid = true; - this.context.showRCHeaders = true; - this.editor = new SocialCalc.TableEditor(this.context); - this.editor.StatusCallback.statusline = { - func: SocialCalc.SpreadsheetControlStatuslineCallback, - params: { - statuslineid: this.idPrefix + "statusline", - recalcid1: this.idPrefix + "divider_recalc", - recalcid2: this.idPrefix + "button_recalc", - }, - }; - - SocialCalc.CurrentSpreadsheetControlObject = this; // remember this for rendezvousing on events - - this.editor.MoveECellCallback.movefrom = function (editor) { - var cr; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - spreadsheet.context.cursorsuffix = ""; - if (editor.range2.hasrange && !editor.cellhandles.noCursorSuffix) { - if ( - editor.ecell.row == editor.range2.top && - (editor.ecell.col < editor.range2.left || - editor.ecell.col > editor.range2.right + 1) - ) { - spreadsheet.context.cursorsuffix = "insertleft"; - } - if ( - editor.ecell.col == editor.range2.left && - (editor.ecell.row < editor.range2.top || - editor.ecell.row > editor.range2.bottom + 1) - ) { - spreadsheet.context.cursorsuffix = "insertup"; - } - } - }; - - // formula bar buttons - - this.formulabuttons = { - formulafunctions: { - image: "formuladialog.gif", - tooltip: "Functions", // tooltips are localized when set below - command: SocialCalc.SpreadsheetControl.DoFunctionList, - }, - multilineinput: { - image: "multilinedialog.gif", - tooltip: "Multi-line Input Box", - command: SocialCalc.SpreadsheetControl.DoMultiline, - }, - link: { - image: "linkdialog.gif", - tooltip: "Link Input Box", - command: SocialCalc.SpreadsheetControl.DoLink, - }, - sum: { - image: "sumdialog.gif", - tooltip: "Auto Sum", - command: SocialCalc.SpreadsheetControl.DoSum, - }, - /* image: {image: "sumdialog.gif", tooltip: "Insert", - command: SocialCalc.Images.Insert }*/ - }; - - // Default tabs: - - // Edit - - this.tabnums.edit = this.tabs.length; - this.tabs.push({ - name: "edit", - text: "Edit", - html: - '
' + - ' ' + - ' ' + - '    ' + - '' + - ' ' + - ' ' + - '    ' + - '' + - ' ' + - '    ' + - '' + - ' ' + - '    ' + - '' + - ' ' + - ' ' + - '    ' + - '' + - ' ' + - ' ' + - '    ' + - ' ' + - ' ' + - ' ' + - '    ' + - ' ' + - ' ' + - '    ' + - ' ' + - ' ' + - '  ' + - ' ' + - '    ' + - ' ' + - "
", - oncreate: null, //function(spreadsheet, viewobject) {SocialCalc.DoCmd(null, "fill-rowcolstuff");}, - onclick: null, - }); - - // Settings (Format) - - this.tabnums.settings = this.tabs.length; - this.tabs.push({ - name: "settings", - text: "Format", - html: - '", - view: "settings", - onclick: function (s, t) { - SocialCalc.SettingsControls.idPrefix = s.idPrefix; // used to get color chooser div - SocialCalc.SettingControlReset(); - var sheetattribs = s.sheet.EncodeSheetAttributes(); - var cellattribs = s.sheet.EncodeCellAttributes(s.editor.ecell.coord); - SocialCalc.SettingsControlLoadPanel( - s.views.settings.values.sheetspanel, - sheetattribs - ); - SocialCalc.SettingsControlLoadPanel( - s.views.settings.values.cellspanel, - cellattribs - ); - document.getElementById(s.idPrefix + "settingsecell").innerHTML = - s.editor.ecell.coord; - SocialCalc.SpreadsheetControlSettingsSwitch("cell"); - s.views.settings.element.style.height = s.viewheight + "px"; - s.views.settings.element.firstChild.style.height = s.viewheight + "px"; - - var range; // set save message - if (s.editor.range.hasrange) { - range = - SocialCalc.crToCoord(s.editor.range.left, s.editor.range.top) + - ":" + - SocialCalc.crToCoord(s.editor.range.right, s.editor.range.bottom); - } else { - range = s.editor.ecell.coord; - } - document.getElementById(s.idPrefix + "settings-savecell").value = - SocialCalc.LocalizeString("Save to") + ": " + range; - }, - onclickFocus: true, - }); - - this.views["settings"] = { - name: "settings", - values: {}, - oncreate: function (s, viewobj) { - var scc = SocialCalc.Constants; - - viewobj.values.sheetspanel = { - // name: "sheet", - colorchooser: { id: s.idPrefix + "scolorchooser" }, - formatnumber: { - setting: "numberformat", - type: "PopupList", - id: s.idPrefix + "formatnumber", - initialdata: scc.SCFormatNumberFormats, - }, - formattext: { - setting: "textformat", - type: "PopupList", - id: s.idPrefix + "formattext", - initialdata: scc.SCFormatTextFormats, - }, - fontfamily: { - setting: "fontfamily", - type: "PopupList", - id: s.idPrefix + "fontfamily", - initialdata: scc.SCFormatFontfamilies, - }, - fontlook: { - setting: "fontlook", - type: "PopupList", - id: s.idPrefix + "fontlook", - initialdata: scc.SCFormatFontlook, - }, - fontsize: { - setting: "fontsize", - type: "PopupList", - id: s.idPrefix + "fontsize", - initialdata: scc.SCFormatFontsizes, - }, - textalignhoriz: { - setting: "textalignhoriz", - type: "PopupList", - id: s.idPrefix + "textalignhoriz", - initialdata: scc.SCFormatTextAlignhoriz, - }, - numberalignhoriz: { - setting: "numberalignhoriz", - type: "PopupList", - id: s.idPrefix + "numberalignhoriz", - initialdata: scc.SCFormatNumberAlignhoriz, - }, - alignvert: { - setting: "alignvert", - type: "PopupList", - id: s.idPrefix + "alignvert", - initialdata: scc.SCFormatAlignVertical, - }, - textcolor: { - setting: "textcolor", - type: "ColorChooser", - id: s.idPrefix + "textcolor", - }, - bgcolor: { - setting: "bgcolor", - type: "ColorChooser", - id: s.idPrefix + "bgcolor", - }, - padtop: { - setting: "padtop", - type: "PopupList", - id: s.idPrefix + "padtop", - initialdata: scc.SCFormatPadsizes, - }, - padright: { - setting: "padright", - type: "PopupList", - id: s.idPrefix + "padright", - initialdata: scc.SCFormatPadsizes, - }, - padbottom: { - setting: "padbottom", - type: "PopupList", - id: s.idPrefix + "padbottom", - initialdata: scc.SCFormatPadsizes, - }, - padleft: { - setting: "padleft", - type: "PopupList", - id: s.idPrefix + "padleft", - initialdata: scc.SCFormatPadsizes, - }, - colwidth: { - setting: "colwidth", - type: "PopupList", - id: s.idPrefix + "colwidth", - initialdata: scc.SCFormatColwidth, - }, - recalc: { - setting: "recalc", - type: "PopupList", - id: s.idPrefix + "recalc", - initialdata: scc.SCFormatRecalc, - }, - }; - viewobj.values.cellspanel = { - name: "cell", - colorchooser: { id: s.idPrefix + "scolorchooser" }, - cformatnumber: { - setting: "numberformat", - type: "PopupList", - id: s.idPrefix + "cformatnumber", - initialdata: scc.SCFormatNumberFormats, - }, - cformattext: { - setting: "textformat", - type: "PopupList", - id: s.idPrefix + "cformattext", - initialdata: scc.SCFormatTextFormats, - }, - cfontfamily: { - setting: "fontfamily", - type: "PopupList", - id: s.idPrefix + "cfontfamily", - initialdata: scc.SCFormatFontfamilies, - }, - cfontlook: { - setting: "fontlook", - type: "PopupList", - id: s.idPrefix + "cfontlook", - initialdata: scc.SCFormatFontlook, - }, - cfontsize: { - setting: "fontsize", - type: "PopupList", - id: s.idPrefix + "cfontsize", - initialdata: scc.SCFormatFontsizes, - }, - calignhoriz: { - setting: "alignhoriz", - type: "PopupList", - id: s.idPrefix + "calignhoriz", - initialdata: scc.SCFormatTextAlignhoriz, - }, - calignvert: { - setting: "alignvert", - type: "PopupList", - id: s.idPrefix + "calignvert", - initialdata: scc.SCFormatAlignVertical, - }, - ctextcolor: { - setting: "textcolor", - type: "ColorChooser", - id: s.idPrefix + "ctextcolor", - }, - cbgcolor: { - setting: "bgcolor", - type: "ColorChooser", - id: s.idPrefix + "cbgcolor", - }, - cbt: { setting: "bt", type: "BorderSide", id: s.idPrefix + "cbt" }, - cbr: { setting: "br", type: "BorderSide", id: s.idPrefix + "cbr" }, - cbb: { setting: "bb", type: "BorderSide", id: s.idPrefix + "cbb" }, - cbl: { setting: "bl", type: "BorderSide", id: s.idPrefix + "cbl" }, - cpadtop: { - setting: "padtop", - type: "PopupList", - id: s.idPrefix + "cpadtop", - initialdata: scc.SCFormatPadsizes, - }, - cpadright: { - setting: "padright", - type: "PopupList", - id: s.idPrefix + "cpadright", - initialdata: scc.SCFormatPadsizes, - }, - cpadbottom: { - setting: "padbottom", - type: "PopupList", - id: s.idPrefix + "cpadbottom", - initialdata: scc.SCFormatPadsizes, - }, - cpadleft: { - setting: "padleft", - type: "PopupList", - id: s.idPrefix + "cpadleft", - initialdata: scc.SCFormatPadsizes, - }, - }; - - SocialCalc.SettingsControlInitializePanel(viewobj.values.sheetspanel); - SocialCalc.SettingsControlInitializePanel(viewobj.values.cellspanel); - }, - replacements: { - itemtitle: { - regex: /\%itemtitle\./g, - replacement: - 'style="padding:12px 10px 0px 10px;font-weight:bold;text-align:right;vertical-align:top;font-size:small;"', - }, - sectiontitle: { - regex: /\%sectiontitle\./g, - replacement: - 'style="padding:16px 10px 0px 0px;font-weight:bold;vertical-align:top;font-size:small;color:#C00;"', - }, - parttitle: { - regex: /\%parttitle\./g, - replacement: - 'style="font-weight:bold;font-size:x-small;padding:0px 0px 3px 0px;"', - }, - itembody: { - regex: /\%itembody\./g, - replacement: - 'style="padding:12px 0px 0px 0px;vertical-align:top;font-size:small;"', - }, - bodypart: { - regex: /\%bodypart\./g, - replacement: - 'style="padding:0px 10px 0px 0px;font-size:small;vertical-align:top;"', - }, - }, - divStyle: "border:1px solid black;overflow:auto;", - html: - '' + - '' + - '
' + - '' + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - '' + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "

%loc!Format!:
" + - ' ' + - " " + - " " + - "
" + - "
%loc!Number!
" + - ' ' + - "
" + - "
%loc!Text!
" + - ' ' + - "
" + - "

%loc!Alignment!:
" + - ' ' + - " " + - " " + - "
" + - "
%loc!Horizontal!
" + - ' ' + - "
" + - "
%loc!Vertical!
" + - ' ' + - "
" + - "

%loc!Font!:
" + - ' ' + - " " + - " " + - " " + - " " + - " " + - "
" + - "
%loc!Family!
" + - ' ' + - "
" + - "
%loc!Bold & Italics!
" + - ' ' + - "
" + - "
%loc!Size!
" + - ' ' + - "
" + - "
%loc!Color!
" + - '
' + - "
" + - "
%loc!Background!
" + - '
' + - "
" + - "

%loc!Borders!:
" + - ' ' + - ' ' + - ' ' + - ' ' + - ' ' + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - "
%loc!Top Border!
%loc!Right Border!
%loc!Bottom Border!
%loc!Left Border!
" + - ' ' + - " " + - '
' + - "
    " + - ' ' + - " " + - '
' + - "
    " + - ' ' + - " " + - '
' + - "
    " + - ' ' + - " " + - '
' + - "
    
" + - "

%loc!Padding!:
" + - ' ' + - " " + - " " + - " " + - " " + - "
" + - "
%loc!Top!
" + - ' ' + - "
" + - "
%loc!Right!
" + - ' ' + - "
" + - "
%loc!Bottom!
" + - ' ' + - "
" + - "
%loc!Left!
" + - ' ' + - "
" + - "
" + - '
' + - '
' + - ' ' + - ' ' + - "
%loc!This is a
sample!
-1234.5
" + - "
" + - "
" + - "
", - }; - - // Sort - - this.tabnums.sort = this.tabs.length; - this.tabs.push({ - name: "sort", - text: "Sort", - html: - ' ", - onclick: SocialCalc.SpreadsheetControlSortOnclick, - }); - this.editor.SettingsCallbacks.sort = { - save: SocialCalc.SpreadsheetControlSortSave, - load: SocialCalc.SpreadsheetControlSortLoad, - }; - - // Audit - - this.tabnums.audit = this.tabs.length; - this.tabs.push({ - name: "audit", - text: "Audit", - html: - '", - view: "audit", - onclick: function (s, t) { - var SCLoc = SocialCalc.LocalizeString; - var i, j; - var str = - '
' + - SCLoc("Audit Trail This Session") + - ":

"; - var stack = s.sheet.changes.stack; - var tos = s.sheet.changes.tos; - for (i = 0; i < stack.length; i++) { - if (i == tos + 1) - str += - '
' + - SCLoc("UNDONE STEPS") + - ":
"; - for (j = 0; j < stack[i].command.length; j++) { - str += SocialCalc.special_chars(stack[i].command[j]) + "
"; - } - } - s.views.audit.element.innerHTML = str + "
"; - SocialCalc.CmdGotFocus(true); - }, - onclickFocus: true, - }); - - this.views["audit"] = { - name: "audit", - divStyle: "border:1px solid black;overflow:auto;", - html: "Audit Trail", - }; - - // Comment - - this.tabnums.comment = this.tabs.length; - this.tabs.push({ - name: "comment", - text: "Comment", - html: - '", - view: "sheet", - onclick: SocialCalc.SpreadsheetControlCommentOnclick, - onunclick: SocialCalc.SpreadsheetControlCommentOnunclick, - }); - - // Names - - this.tabnums.names = this.tabs.length; - this.tabs.push({ - name: "names", - text: "Names", - html: - '", - view: "sheet", - onclick: SocialCalc.SpreadsheetControlNamesOnclick, - onunclick: SocialCalc.SpreadsheetControlNamesOnunclick, - }); - - // Clipboard - - this.tabnums.clipboard = this.tabs.length; - this.tabs.push({ - name: "clipboard", - text: "Clipboard", - html: - '", - view: "clipboard", - onclick: SocialCalc.SpreadsheetControlClipboardOnclick, - onclickFocus: "clipboardtext", - }); - - this.views["clipboard"] = { - name: "clipboard", - divStyle: "overflow:auto;", - html: - '
' + - " %loc!Display Clipboard in!:" + - ' %loc!Tab-delimited format!  ' + - ' %loc!CSV format!  ' + - ' %loc!SocialCalc-save format!' + - "
" + - '   ' + - '   ' + - "
" + - ' ', - }; - - return; - }; - - // Methods: - - SocialCalc.SpreadsheetControl.prototype.InitializeSpreadsheetControl = - function (node, height, width, spacebelow) { - return SocialCalc.InitializeSpreadsheetControl( - this, - node, - height, - width, - spacebelow - ); - }; - SocialCalc.SpreadsheetControl.prototype.DoOnResize = function () { - return SocialCalc.DoOnResize(this); - }; - SocialCalc.SpreadsheetControl.prototype.SizeSSDiv = function () { - return SocialCalc.SizeSSDiv(this); - }; - SocialCalc.SpreadsheetControl.prototype.ExecuteCommand = function ( - combostr, - sstr - ) { - return SocialCalc.SpreadsheetControlExecuteCommand(this, combostr, sstr); - }; - SocialCalc.SpreadsheetControl.prototype.CreateSheetHTML = function () { - return SocialCalc.SpreadsheetControlCreateSheetHTML(this); - }; - SocialCalc.SpreadsheetControl.prototype.CreateSpreadsheetSave = function ( - otherparts - ) { - return SocialCalc.SpreadsheetControlCreateSpreadsheetSave(this, otherparts); - }; - SocialCalc.SpreadsheetControl.prototype.DecodeSpreadsheetSave = function ( - str - ) { - return SocialCalc.SpreadsheetControlDecodeSpreadsheetSave(this, str); - }; - SocialCalc.SpreadsheetControl.prototype.CreateCellHTML = function (coord) { - return SocialCalc.SpreadsheetControlCreateCellHTML(this, coord); - }; - SocialCalc.SpreadsheetControl.prototype.CreateCellHTMLSave = function ( - range - ) { - return SocialCalc.SpreadsheetControlCreateCellHTMLSave(this, range); - }; - - // Sheet Methods to make things a little easier: - - SocialCalc.SpreadsheetControl.prototype.ParseSheetSave = function (str) { - return this.sheet.ParseSheetSave(str); - }; - SocialCalc.SpreadsheetControl.prototype.CreateSheetSave = function () { - return this.sheet.CreateSheetSave(); - }; - - // Functions: - - // - // InitializeSpreadsheetControl(spreadsheet, node, height, width, spacebelow) - // - // Creates the control elements and makes them the child of node (string or element). - // If present, height and width specify size. - // If either is 0 or null (missing), the maximum that fits on the screen - // (taking spacebelow into account) is used. - // - // Displays the tabs and creates the views (other than "sheet"). - // The first tab is set as selected, but onclick is not invoked. - // - // You should do a redisplay or recalc (which redisplays) after running this. - // - - SocialCalc.InitializeSpreadsheetControl = function ( - spreadsheet, - node, - height, - width, - spacebelow - ) { - var scc = SocialCalc.Constants; - var SCLoc = SocialCalc.LocalizeString; - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var html, child, i, vname, v, style, button, bele; - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - spreadsheet.requestedHeight = height; - spreadsheet.requestedWidth = width; - spreadsheet.requestedSpaceBelow = spacebelow; - - if (typeof node == "string") node = document.getElementById(node); - - if (node == null) { - alert("SocialCalc.SpreadsheetControl not given parent node."); - } - - spreadsheet.parentNode = node; - - // create node to hold spreadsheet control - - spreadsheet.spreadsheetDiv = document.createElement("div"); - - spreadsheet.SizeSSDiv(); // calculate and fill in the size values - - for (child = node.firstChild; child != null; child = node.firstChild) { - node.removeChild(child); - } - - // create the tabbed UI at the top - - html = - '
'; - - for (i = 0; i < tabs.length; i++) { - html += tabs[i].html; - } - - html += - "
" + - '
' + - ''; - - for (i = 0; i < tabs.length; i++) { - html += - ' "; - } - - html += "
' + - SCLoc(tabs[i].text) + - "
"; - - spreadsheet.currentTab = 0; // this is where we started - - for (style in spreadsheet.tabreplacements) { - html = html.replace( - spreadsheet.tabreplacements[style].regex, - spreadsheet.tabreplacements[style].replacement - ); - } - html = html.replace(/\%s\./g, "SocialCalc."); - html = html.replace(/\%id\./g, spreadsheet.idPrefix); - html = html.replace(/\%tbt\./g, spreadsheet.toolbartext); - html = html.replace(/\%img\./g, spreadsheet.imagePrefix); - - html = SCLocSS(html); // localize with %loc!string! and %scc!constant! - - spreadsheet.spreadsheetDiv.innerHTML = html; - - node.appendChild(spreadsheet.spreadsheetDiv); - - // Initialize SocialCalc buttons - - spreadsheet.Buttons = { - button_undo: { tooltip: "Undo", command: "undo" }, - button_redo: { tooltip: "Redo", command: "redo" }, - button_copy: { tooltip: "Copy", command: "copy" }, - button_cut: { tooltip: "Cut", command: "cut" }, - button_paste: { tooltip: "Paste", command: "paste" }, - button_pasteformats: { - tooltip: "Paste Formats", - command: "pasteformats", - }, - button_delete: { tooltip: "Delete Contents", command: "delete" }, - button_filldown: { tooltip: "Fill Down", command: "filldown" }, - button_fillright: { tooltip: "Fill Right", command: "fillright" }, - button_movefrom: { tooltip: "Set/Clear Move From", command: "movefrom" }, - button_movepaste: { tooltip: "Move Paste", command: "movepaste" }, - button_moveinsert: { tooltip: "Move Insert", command: "moveinsert" }, - button_alignleft: { tooltip: "Align Left", command: "align-left" }, - button_aligncenter: { tooltip: "Align Center", command: "align-center" }, - button_alignright: { tooltip: "Align Right", command: "align-right" }, - button_borderon: { tooltip: "Borders On", command: "borderon" }, - button_borderoff: { tooltip: "Borders Off", command: "borderoff" }, - button_swapcolors: { tooltip: "Swap Colors", command: "swapcolors" }, - button_merge: { tooltip: "Merge Cells", command: "merge" }, - button_unmerge: { tooltip: "Unmerge Cells", command: "unmerge" }, - button_insertrow: { tooltip: "Insert Row", command: "insertrow" }, - button_insertcol: { tooltip: "Insert Column", command: "insertcol" }, - button_deleterow: { tooltip: "Delete Row", command: "deleterow" }, - button_deletecol: { tooltip: "Delete Column", command: "deletecol" }, - button_recalc: { tooltip: "Recalc", command: "recalc" }, - }; - - for (button in spreadsheet.Buttons) { - bele = document.getElementById(spreadsheet.idPrefix + button); - if (!bele) { - /*alert("Button "+(spreadsheet.idPrefix+button)+" missing");*/ continue; - } - bele.style.border = "1px solid " + scc.ISCButtonBorderNormal; - SocialCalc.TooltipRegister( - bele, - SCLoc(spreadsheet.Buttons[button].tooltip), - {} - ); - SocialCalc.ButtonRegister( - bele, - { - normalstyle: - "border:1px solid " + - scc.ISCButtonBorderNormal + - ";backgroundColor:" + - scc.ISCButtonBorderNormal + - ";", - hoverstyle: - "border:1px solid " + - scc.ISCButtonBorderHover + - ";backgroundColor:" + - scc.ISCButtonBorderNormal + - ";", - downstyle: - "border:1px solid " + - scc.ISCButtonBorderDown + - ";backgroundColor:" + - scc.ISCButtonDownBackground + - ";", - }, - { - MouseDown: SocialCalc.DoButtonCmd, - command: spreadsheet.Buttons[button].command, - } - ); - } - - // create formula bar - - spreadsheet.dummyFormulaDiv = document.createElement("div"); - spreadsheet.dummyFormulaDiv.style.height = - spreadsheet.formulabarheight + "px"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.dummyFormulaDiv); - - spreadsheet.formulabarDiv = document.createElement("div"); - spreadsheet.formulabarDiv.id = "formulabardiv"; - spreadsheet.formulabarDiv.style.height = - spreadsheet.formulabarheight + "px"; - spreadsheet.formulabarDiv.innerHTML = - ''; //' '; - //spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - var inputbox = new SocialCalc.InputBox( - spreadsheet.formulabarDiv.firstChild, - spreadsheet.editor - ); - - bele = document.createElement("img"); - bele.id = "testtest"; - bele.src = "lib/aspiring/www/assets/images/delete24.png"; - bele.style.verticalAlign = "middle"; - //bele.style.border = "1px solid #FFF"; - //bele.style.marginLeft = "4px"; - bele.style.display = "none"; - SocialCalc.ButtonRegister( - bele, - { normalstyle: "", hoverstyle: "", downstyle: "" }, - { MouseDown: SocialCalc.InputLineClearText } - ); - - // spreadsheet.formulabarDiv.appendChild(bele); - - /* - for (button in spreadsheet.formulabuttons) { - bele = document.createElement("img"); - bele.id = spreadsheet.idPrefix+button; - bele.src = spreadsheet.imagePrefix+spreadsheet.formulabuttons[button].image; - bele.style.verticalAlign = "middle"; - bele.style.border = "1px solid #FFF"; - bele.style.marginLeft = "4px"; - SocialCalc.TooltipRegister(bele, SCLoc(spreadsheet.formulabuttons[button].tooltip), {}); - SocialCalc.ButtonRegister(bele, - {normalstyle: "border:1px solid #FFF;backgroundColor:#FFF;", - hoverstyle: "border:1px solid #CCC;backgroundColor:#FFF;", - downstyle: "border:1px solid #000;backgroundColor:#FFF;"}, - {MouseDown: spreadsheet.formulabuttons[button].command}); - spreadsheet.formulabarDiv.appendChild(bele); - } - */ - // initialize tabs that need it - - for (i = 0; i < tabs.length; i++) { - // execute any tab-specific initialization code - if (tabs[i].oncreate) { - tabs[i].oncreate(spreadsheet, tabs[i].name); - } - } - - // create sheet view and others - if (!scc.doWorkBook) { - spreadsheet.nonviewheight = - spreadsheet.statuslineheight + - spreadsheet.spreadsheetDiv.firstChild.offsetHeight + - spreadsheet.spreadsheetDiv.lastChild.offsetHeight; - } else { - spreadsheet.nonviewheight = - 28 + - spreadsheet.sheetbarheight + - spreadsheet.spreadsheetDiv.firstChild.offsetHeight + - spreadsheet.spreadsheetDiv.lastChild.offsetHeight; - } - spreadsheet.viewheight = spreadsheet.height - spreadsheet.nonviewheight; - spreadsheet.editorDiv = spreadsheet.editor.CreateTableEditor( - spreadsheet.width, - spreadsheet.viewheight - ); - - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.editorDiv); - - for (vname in views) { - html = views[vname].html; - for (style in views[vname].replacements) { - html = html.replace( - views[vname].replacements[style].regex, - views[vname].replacements[style].replacement - ); - } - html = html.replace(/\%s\./g, "SocialCalc."); - html = html.replace(/\%id\./g, spreadsheet.idPrefix); - html = html.replace(/\%tbt\./g, spreadsheet.toolbartext); - html = html.replace(/\%img\./g, spreadsheet.imagePrefix); - v = document.createElement("div"); - SocialCalc.setStyles(v, views[vname].divStyle); - v.style.display = "none"; - v.style.width = spreadsheet.width + "px"; - v.style.height = spreadsheet.viewheight + "px"; - - html = SCLocSS(html); // localize with %loc!string!, etc. - - v.innerHTML = html; - spreadsheet.spreadsheetDiv.appendChild(v); - views[vname].element = v; - if (views[vname].oncreate) { - views[vname].oncreate(spreadsheet, views[vname]); - } - } - - views.sheet = { name: "sheet", element: spreadsheet.editorDiv }; - - // create statusline - - if (!scc.doWorkBook) { - spreadsheet.statuslineDiv = document.createElement("div"); - spreadsheet.statuslineDiv.style.cssText = spreadsheet.statuslineCSS; - // spreadsheet.statuslineDiv.style.height = spreadsheet.statuslineheight + "px"; // didn't take padding into account! - spreadsheet.statuslineDiv.style.height = - spreadsheet.statuslineheight - - (spreadsheet.statuslineDiv.style.paddingTop.slice(0, -2) - 0) - - (spreadsheet.statuslineDiv.style.paddingBottom.slice(0, -2) - 0) + - "px"; - spreadsheet.statuslineDiv.id = spreadsheet.idPrefix + "statusline"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.statuslineDiv); - } else { - SocialCalc.CreateSheetStatusBar(spreadsheet, scc); - } - - // done - refresh screen needed - - return; - }; - - SocialCalc.CreateSheetStatusBar = function (spreadsheet, scc) { - // create sheetbar - if (!scc.doWorkBook) { - return; - } - - // create a table with 1 row, containing 3 columns, 1 for sheetbar, 1 for separator, 1 for statusline - - spreadsheet.sheetstatusbarDiv = document.createElement("div"); - spreadsheet.sheetstatusbarDiv.style.height = - spreadsheet.sheetbarheight + 3 + "px"; - spreadsheet.sheetstatusbarDiv.style.backgroundColor = "#CCC"; - spreadsheet.sheetstatusbarDiv.id = spreadsheet.idPrefix + "sheetstatusbar"; - - spreadsheet.sheetbarDiv = document.createElement("div"); - //spreadsheet.sheetbarDiv.style.cssText = spreadsheet.sheetbarCSS; - spreadsheet.sheetbarDiv.id = spreadsheet.idPrefix + "sheetbar"; - - spreadsheet.statuslineDiv = document.createElement("div"); - spreadsheet.statuslineDiv.style.cssText = spreadsheet.statuslineCSS; - spreadsheet.statuslineDiv.id = spreadsheet.idPrefix + "statusline"; - - var table = document.createElement("table"); - spreadsheet.sheetstatusbartable = table; - table.cellSpacing = 0; - table.cellPadding = 0; - table.width = "100%"; - - var tbody = document.createElement("tbody"); - table.appendChild(tbody); - - var tr = document.createElement("tr"); - tbody.appendChild(tr); - var td = document.createElement("td"); - td.appendChild(spreadsheet.sheetbarDiv); - td.width = scc.SCSheetBarWidth; - tr.appendChild(td); - - td = document.createElement("td"); - td.innerHTML = " | "; - td.width = "1%"; - tr.appendChild(td); - - td = document.createElement("td"); - td.appendChild(spreadsheet.statuslineDiv); - tr.appendChild(td); - - spreadsheet.sheetstatusbarDiv.appendChild(table); - - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.sheetstatusbarDiv); - - spreadsheet.sheetstatusbarDiv.style.display = "none"; - }; - - // - // outstr = SocialCalc.LocalizeString(str) - // - // SocialCalc function to make localization easier. - // If str is "Text to localize", it returns - // SocialCalc.Constants.s_loc_text_to_localize if - // it exists, or else with just "Text to localize". - // Note that spaces are replaced with "_" and other special - // chars with "X" in the name of the constant (e.g., "A & B" - // would look for SocialCalc.Constants.s_loc_a_X_b. - // - - SocialCalc.LocalizeString = function (str) { - var cstr = SocialCalc.LocalizeStringList[str]; // found already this session? - if (!cstr) { - // no - look up - cstr = - SocialCalc.Constants[ - "s_loc_" + str.toLowerCase().replace(/\s/g, "_").replace(/\W/g, "X") - ] || str; - SocialCalc.LocalizeStringList[str] = cstr; - } - return cstr; - }; - - SocialCalc.LocalizeStringList = {}; // a list of strings to localize accumulated by the routine - - // - // outstr = SocialCalc.LocalizeSubstrings(str) - // - // SocialCalc function to make localization easier using %loc and %scc. - // - // Replaces sections of str with: - // %loc!Text to localize! - // with SocialCalc.Constants.s_loc_text_to_localize if - // it exists, or else with just "Text to localize". - // Note that spaces are replaced with "_" and other special - // chars with "X" in the name of the constant (e.g., %loc!A & B! - // would look for SocialCalc.Constants.s_loc_a_X_b. - // Uses SocialCalc.LocalizeString for this. - // - // Replaces sections of str with: - // %ssc!constant-name! - // with SocialCalc.Constants.constant-name. - // If the constant doesn't exist, throws and alert. - // - - SocialCalc.LocalizeSubstrings = function (str) { - var SCLoc = SocialCalc.LocalizeString; - - return str.replace(/%(loc|ssc)!(.*?)!/g, function (a, t, c) { - if (t == "ssc") { - return SocialCalc.Constants[c] || alert("Missing constant: " + c); - } else { - return SCLoc(c); - } - }); - }; - - // - // obj = GetSpreadsheetControlObject() - // - // Returns the current spreadsheet control object - // - - SocialCalc.GetSpreadsheetControlObject = function () { - var csco = SocialCalc.CurrentSpreadsheetControlObject; - if (csco) return csco; - - // throw ("No current SpreadsheetControl object."); - }; - - // - // SocialCalc.DoOnResize(spreadsheet) - // - // Processes an onResize event, setting the different views. - // - - SocialCalc.DoOnResize = function (spreadsheet) { - var v; - var views = spreadsheet.views; - - var needresize = spreadsheet.SizeSSDiv(); - if (!needresize) return; - - for (vname in views) { - v = views[vname].element; - v.style.width = spreadsheet.width + "px"; - v.style.height = spreadsheet.height - spreadsheet.nonviewheight + "px"; - } - - spreadsheet.editor.ResizeTableEditor( - spreadsheet.width, - spreadsheet.height - spreadsheet.nonviewheight - ); - }; - - // - // resized = SocialCalc.SizeSSDiv(spreadsheet) - // - // Figures out a reasonable size for the spreadsheet, given any requested values and viewport. - // Sets ssdiv to that. - // Return true if different than existing values. - // - - SocialCalc.SizeSSDiv = function (spreadsheet) { - var sizes, pos, resized, nodestyle, newval; - var fudgefactorX = 10; // for IE - var fudgefactorY = 10; - - resized = false; - - sizes = SocialCalc.GetViewportInfo(); - pos = SocialCalc.GetElementPosition(spreadsheet.parentNode); - pos.bottom = 0; - pos.right = 0; - - nodestyle = spreadsheet.parentNode.style; - - if (nodestyle.marginTop) { - pos.top += nodestyle.marginTop.slice(0, -2) - 0; - } - if (nodestyle.marginBottom) { - pos.bottom += nodestyle.marginBottom.slice(0, -2) - 0; - } - if (nodestyle.marginLeft) { - pos.left += nodestyle.marginLeft.slice(0, -2) - 0; - } - if (nodestyle.marginRight) { - pos.right += nodestyle.marginRight.slice(0, -2) - 0; - } - - newval = - spreadsheet.requestedHeight || - sizes.height - - (pos.top + pos.bottom + fudgefactorY) - - (spreadsheet.requestedSpaceBelow || 0); - if (spreadsheet.height != newval) { - spreadsheet.height = newval; - spreadsheet.spreadsheetDiv.style.height = newval + "px"; - resized = true; - } - newval = - spreadsheet.requestedWidth || - sizes.width - (pos.left + pos.right + fudgefactorX) || - 700; - if (spreadsheet.width != newval) { - spreadsheet.width = newval; - spreadsheet.spreadsheetDiv.style.width = newval + "px"; - resized = true; - } - - return resized; - }; - - // - // SocialCalc.SetTab(obj) - // - // The obj argument is either a string with the tab name or a DOM element with an ID - // - - SocialCalc.SetTab = function (obj) { - var newtab, tname, newtabnum, newview, i, vname, ele; - var menutabs = {}; - var tools = {}; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - if (typeof obj == "string") { - newtab = obj; - } else { - newtab = obj.id.slice(spreadsheet.idPrefix.length, -3); - } - - if ( - spreadsheet.editor.busy && // if busy and switching from "sheet", ignore - (!tabs[spreadsheet.currentTab].view || - tabs[spreadsheet.currentTab].view == "sheet") - ) { - for (i = 0; i < tabs.length; i++) { - if (tabs[i].name == newtab && tabs[i].view && tabs[i].view != "sheet") { - return; - } - } - } - - if (spreadsheet.tabs[spreadsheet.currentTab].onunclick) { - spreadsheet.tabs[spreadsheet.currentTab].onunclick( - spreadsheet, - spreadsheet.tabs[spreadsheet.currentTab].name - ); - } - - for (i = 0; i < tabs.length; i++) { - tname = tabs[i].name; - menutabs[tname] = document.getElementById( - spreadsheet.idPrefix + tname + "tab" - ); - tools[tname] = document.getElementById( - spreadsheet.idPrefix + tname + "tools" - ); - if (tname == newtab) { - newtabnum = i; - tools[tname].style.display = "block"; - menutabs[tname].style.cssText = spreadsheet.tabselectedCSS; - } else { - tools[tname].style.display = "none"; - menutabs[tname].style.cssText = spreadsheet.tabplainCSS; - } - } - - spreadsheet.currentTab = newtabnum; - - if (tabs[newtabnum].onclick) { - tabs[newtabnum].onclick(spreadsheet, newtab); - } - - for (vname in views) { - if ( - (!tabs[newtabnum].view && vname == "sheet") || - tabs[newtabnum].view == vname - ) { - views[vname].element.style.display = "block"; - newview = vname; - } else { - views[vname].element.style.display = "none"; - } - } - - if (tabs[newtabnum].onclickFocus) { - ele = tabs[newtabnum].onclickFocus; - if (typeof ele == "string") { - ele = document.getElementById(spreadsheet.idPrefix + ele); - ele.focus(); - } - SocialCalc.CmdGotFocus(ele); - } else { - SocialCalc.KeyboardFocus(); - } - - if (views[newview].needsresize && views[newview].onresize) { - views[newview].needsresize = false; - views[newview].onresize(spreadsheet, views[newview]); - } - - if (newview == "sheet") { - spreadsheet.statuslineDiv.style.display = "block"; - spreadsheet.editor.ScheduleRender(); - } else { - spreadsheet.statuslineDiv.style.display = "none"; - } - - return; - }; - - // - // SocialCalc.SpreadsheetControlStatuslineCallback - // - - SocialCalc.SpreadsheetControlStatuslineCallback = function ( - editor, - status, - arg, - params - ) { - var rele1, rele2; - - var ele = document.getElementById(params.statuslineid); - - if (ele) { - ele.innerHTML = editor.GetStatuslineString(status, arg, params); - } - - switch (status) { - case "cmdendnorender": - case "calcfinished": - case "doneposcalc": - rele1 = document.getElementById(params.recalcid1); - rele2 = document.getElementById(params.recalcid2); - if (!rele1 || !rele2) break; - if (editor.context.sheetobj.attribs.needsrecalc == "yes") { - rele1.style.display = "inline"; - rele2.style.display = "inline"; - } else { - rele1.style.display = "none"; - rele2.style.display = "none"; - } - break; - - default: - break; - } - }; - - // - // SocialCalc.UpdateSortRangeProposal(editor) - // - // Updates sort range proposed in the UI in element idPrefix+sortlist - // - - SocialCalc.UpdateSortRangeProposal = function (editor) { - var ele = document.getElementById( - SocialCalc.GetSpreadsheetControlObject().idPrefix + "sortlist" - ); - if (editor.range.hasrange) { - ele.options[0].text = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - ele.options[0].text = SocialCalc.LocalizeString("[select range]"); - } - }; - - // - // SocialCalc.LoadColumnChoosers(spreadsheet) - // - // Updates list of columns for choosing which to sort for Major, Minor, and Last sort - // - - SocialCalc.LoadColumnChoosers = function (spreadsheet) { - var SCLoc = SocialCalc.LocalizeString; - - var sortrange, nrange, rparts, col, colname, sele, oldindex; - - if (spreadsheet.sortrange && spreadsheet.sortrange.indexOf(":") == -1) { - // sortrange is a named range - nrange = SocialCalc.Formula.LookupName( - spreadsheet.sheet, - spreadsheet.sortrange || "" - ); - if (nrange.type == "range") { - rparts = nrange.value.match(/^(.*)\|(.*)\|$/); - sortrange = rparts[1] + ":" + rparts[2]; - } else { - sortrange = "A1:A1"; - } - } else { - sortrange = spreadsheet.sortrange; - } - var range = SocialCalc.ParseRange(sortrange); - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col = range.cr1.col; col <= range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option( - SCLoc("Column ") + colname, - colname - ); - } - sele.selectedIndex = - oldindex > 1 && oldindex <= range.cr2.col - range.cr1.col + 1 - ? oldindex - : 1; // restore what was there if reasonable - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col = range.cr1.col; col <= range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = - oldindex > 0 && oldindex <= range.cr2.col - range.cr1.col + 1 - ? oldindex - : 0; // default to [none] - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col = range.cr1.col; col <= range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = - oldindex > 0 && oldindex <= range.cr2.col - range.cr1.col + 1 - ? oldindex - : 0; // default to [none] - }; - - // - // SocialCalc.CmdGotFocus(obj) - // - // Sets SocialCalc.Keyboard.passThru: obj should be element with focus or "true" - // - - SocialCalc.CmdGotFocus = function (obj) { - SocialCalc.Keyboard.passThru = obj; - }; - - // - // SocialCalc.DoButtonCmd(e, buttoninfo, bobj) - // - - SocialCalc.DoButtonCmd = function (e, buttoninfo, bobj) { - SocialCalc.DoCmd(bobj.element, bobj.functionobj.command); - }; - - // - // SocialCalc.DoCmd(obj, which) - // - // xxx - // - - SocialCalc.DoCmd = function (obj, which) { - var combostr, - sstr, - cl, - i, - clele, - slist, - slistele, - str, - sele, - rele, - lele, - ele, - sortrange, - nrange, - rparts; - var sheet, cell, color, bgcolor, defaultcolor, defaultbgcolor; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - switch (which) { - case "undo": - spreadsheet.ExecuteCommand("undo", ""); - break; - - case "redo": - spreadsheet.ExecuteCommand("redo", ""); - break; - - case "fill-rowcolstuff": - case "fill-text": - cl = which.substring(5); - clele = document.getElementById(spreadsheet.idPrefix + cl + "list"); - clele.length = 0; - for (i = 0; i < SocialCalc.SpreadsheetCmdTable[cl].length; i++) { - clele.options[i] = new Option( - SocialCalc.SpreadsheetCmdTable[cl][i].t - ); - } - which = "changed-" + cl; // fall through to changed code - - case "changed-rowcolstuff": - case "changed-text": - cl = which.substring(8); - clele = document.getElementById(spreadsheet.idPrefix + cl + "list"); - slist = - SocialCalc.SpreadsheetCmdTable.slists[ - SocialCalc.SpreadsheetCmdTable[cl][clele.selectedIndex].s - ]; // get sList for this command - slistele = document.getElementById(spreadsheet.idPrefix + cl + "slist"); - slistele.length = 0; // reset - for (i = 0; i < (slist.length || 0); i++) { - slistele.options[i] = new Option(slist[i].t, slist[i].s); - } - return; // nothing else to do - - case "ok-rowcolstuff": - case "ok-text": - cl = which.substring(3); - clele = document.getElementById(spreadsheet.idPrefix + cl + "list"); - slistele = document.getElementById(spreadsheet.idPrefix + cl + "slist"); - combostr = SocialCalc.SpreadsheetCmdTable[cl][clele.selectedIndex].c; - sstr = slistele[slistele.selectedIndex].value; - SocialCalc.SpreadsheetControlExecuteCommand(obj, combostr, sstr); - break; - - case "ok-setsort": - lele = document.getElementById(spreadsheet.idPrefix + "sortlist"); - if (lele.selectedIndex == 0) { - if (editor.range.hasrange) { - spreadsheet.sortrange = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - spreadsheet.sortrange = - editor.ecell.coord + ":" + editor.ecell.coord; - } - } else { - spreadsheet.sortrange = lele.options[lele.selectedIndex].value; - } - ele = document.getElementById(spreadsheet.idPrefix + "sortbutton"); - ele.value = SocialCalc.LocalizeString("Sort ") + spreadsheet.sortrange; - ele.style.visibility = "visible"; - SocialCalc.LoadColumnChoosers(spreadsheet); - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - return; - - case "dosort": - if (spreadsheet.sortrange && spreadsheet.sortrange.indexOf(":") == -1) { - // sortrange is a named range - nrange = SocialCalc.Formula.LookupName( - spreadsheet.sheet, - spreadsheet.sortrange || "" - ); - if (nrange.type != "range") return; - rparts = nrange.value.match(/^(.*)\|(.*)\|$/); - sortrange = rparts[1] + ":" + rparts[2]; - } else { - sortrange = spreadsheet.sortrange; - } - if (sortrange == "A1:A1") return; - str = "sort " + sortrange + " "; - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - rele = document.getElementById(spreadsheet.idPrefix + "majorsortup"); - str += - sele.options[sele.selectedIndex].value + - (rele.checked ? " up" : " down"); - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "minorsortup"); - str += - " " + - sele.options[sele.selectedIndex].value + - (rele.checked ? " up" : " down"); - } - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "lastsortup"); - str += - " " + - sele.options[sele.selectedIndex].value + - (rele.checked ? " up" : " down"); - } - spreadsheet.ExecuteCommand(str, ""); - break; - - case "merge": - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - if (editor.range.hasrange) { - // set ecell to upper left - editor.MoveECell( - SocialCalc.crToCoord(editor.range.left, editor.range.top) - ); - editor.RangeRemove(); - } - break; - - case "movefrom": - if (editor.range2.hasrange) { - // toggle if already there - spreadsheet.context.cursorsuffix = ""; - editor.Range2Remove(); - spreadsheet.ExecuteCommand("redisplay", ""); - } else if (editor.range.hasrange) { - // set range2 to range or one cell - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.MoveECell( - SocialCalc.crToCoord(editor.range.left, editor.range.top) - ); - } else { - editor.range2.top = editor.ecell.row; - editor.range2.right = editor.ecell.col; - editor.range2.bottom = editor.ecell.row; - editor.range2.left = editor.ecell.col; - editor.range2.hasrange = true; - } - str = editor.range2.hasrange ? "" : "off"; - ele = document.getElementById(spreadsheet.idPrefix + "button_movefrom"); - ele.src = spreadsheet.imagePrefix + "movefrom" + str + ".gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_movepaste" - ); - ele.src = spreadsheet.imagePrefix + "movepaste" + str + ".gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_moveinsert" - ); - ele.src = spreadsheet.imagePrefix + "moveinsert" + str + ".gif"; - if (editor.range2.hasrange) editor.RangeRemove(); - break; - - case "movepaste": - case "moveinsert": - if (editor.range2.hasrange) { - spreadsheet.context.cursorsuffix = ""; - combostr = - which + - " " + - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + - ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) + - " " + - editor.ecell.coord; - spreadsheet.ExecuteCommand(combostr, ""); - editor.Range2Remove(); - ele = document.getElementById( - spreadsheet.idPrefix + "button_movefrom" - ); - ele.src = spreadsheet.imagePrefix + "movefromoff.gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_movepaste" - ); - ele.src = spreadsheet.imagePrefix + "movepasteoff.gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_moveinsert" - ); - ele.src = spreadsheet.imagePrefix + "moveinsertoff.gif"; - } - break; - - case "swapcolors": - sheet = spreadsheet.sheet; - cell = sheet.GetAssuredCell(editor.ecell.coord); - defaultcolor = sheet.attribs.defaultcolor - ? sheet.colors[sheet.attribs.defaultcolor] - : "rgb(0,0,0)"; - defaultbgcolor = sheet.attribs.defaultbgcolor - ? sheet.colors[sheet.attribs.defaultbgcolor] - : "rgb(255,255,255)"; - color = cell.color ? sheet.colors[cell.color] : defaultcolor; // get color - if (color == defaultbgcolor) color = ""; // going to swap, so if same as background default, use default - bgcolor = cell.bgcolor ? sheet.colors[cell.bgcolor] : defaultbgcolor; - if (bgcolor == defaultcolor) bgcolor = ""; // going to swap, so if same as foreground default, use default - spreadsheet.ExecuteCommand( - "set %C color " + bgcolor + "%Nset %C bgcolor " + color, - "" - ); - break; - - default: - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - break; - } - - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - }; - - SocialCalc.SpreadsheetCmdLookup = { - copy: "copy %C all", - cut: "cut %C all", - paste: "paste %C all", - pasteformats: "paste %C formats", - delete: "erase %C formulas", - filldown: "filldown %C all", - fillright: "fillright %C all", - erase: "erase %C all", - borderon: "set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S", - borderoff: "set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S", - merge: "merge %C", - unmerge: "unmerge %C", - "align-left": "set %C cellformat left", - "align-center": "set %C cellformat center", - "align-right": "set %C cellformat right", - "align-default": "set %C cellformat", - insertrow: "insertrow %C", - insertcol: "insertcol %C", - deleterow: "deleterow %C", - deletecol: "deletecol %C", - undo: "undo", - redo: "redo", - recalc: "recalc", - }; - - SocialCalc.SpreadsheetCmdSLookup = { - borderon: "1px solid rgb(0,0,0)", - borderoff: "", - }; - - /******* NO LONGER USED - -SocialCalc.SpreadsheetCmdTable = { - cmd: [ - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"}, - {t:"Copy", s:"all", c:"copy %C %S"}, - {t:"Cut", s:"all", c:"cut %C %S"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Merge Cells", s:"none", c:"merge %C"}, - {t:"Unmerge", s:"none", c:"unmerge %C"}, - {t:"Sort", s:"sortcol", c:"sort %R %S"}, - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Cell Borders", s:"borderOnOff", c:"set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S"}, - {t:"Column Width", s:"colWidths", c:"set %W width %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"}, - {t:"Default Column Width", s:"colWidths", c:"set sheet defaultcolwidth %S"} - ], - rowcolstuff: [ - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"} - ], - text: [ - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Text Format", s:"tvf", c:"set %C textvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Text Format", s:"tvf", c:"set sheet defaulttextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"} - ], - slists: { - "colors": [ - {t:"Default", s:""}, - {t:"Black", s:"rgb(0,0,0)"}, - {t:"Dark Gray", s:"rgb(102,102,102)"}, // #666 - {t:"Gray", s:"rgb(204,204,204)"}, // #CCC - {t:"White", s:"rgb(255,255,255)"}, - {t:"Red", s:"rgb(255,0,0)"}, - {t:"Dark Red", s:"rgb(153,0,0)"}, - {t:"Orange", s:"rgb(255,153,0)"}, - {t:"Yellow", s:"rgb(255,255,0)"}, - {t:"Light Yellow", s:"rgb(255,255,204)"}, - {t:"Green", s:"rgb(0,255,0)"}, - {t:"Dark Green", s:"rgb(0,153,0)"}, - {t:"Blue", s:"rgb(0,0,255)"}, - {t:"Dark Blue", s:"rgb(0,0,153)"}, - {t:"Light Blue", s:"rgb(204,204,255)"} - ], - "fonts": [ // style weight size family - {t:"Default", s:""}, - {t:"Bold", s:"normal bold * *"}, - {t:"Italic", s:"italic normal * *"}, - {t:"Small", s:"* small *"}, - {t:"Medium", s:"* medium *"}, - {t:"Large", s:"* large *"}, - {t:"Bold Small", s:"normal bold small *"}, - {t:"Bold Medium", s:"normal bold medium *"}, - {t:"Bold Large", s:"normal bold large *"} - ], - "cellformat": [ - {t:"Default", s:""}, - {t:"Left", s:"left"}, - {t:"Right", s:"right"}, - {t:"Center", s:"center"} - ], - "borderOnOff": [ - {t:"On", s:"1px solid rgb(0,0,0)"}, - {t:"Off", s:""} - ], - "colWidths": [ - {t:"Default", s:""}, - {t:"20", s:"20"}, - {t:"40", s:"40"}, - {t:"60", s:"60"}, - {t:"80", s:"80"}, - {t:"100", s:"100"}, - {t:"120", s:"120"}, - {t:"140", s:"140"}, - {t:"160", s:"160"}, - {t:"180", s:"180"}, - {t:"200", s:"200"}, - {t:"220", s:"220"}, - {t:"240", s:"240"}, - {t:"260", s:"260"}, - {t:"280", s:"280"}, - {t:"300", s:"300"} - ], - "ntvf": [ - {t:"Default", s:""}, - {t:"1234", s:"0"}, - {t:"1,234", s:"#,##0"}, - {t:"1,234.5", s:"#,##0.0"}, - {t:"1,234.56", s:"#,##0.00"}, - {t:"1,234.567", s:"#,##0.000"}, - {t:"1,234%", s:"#,##0%"}, - {t:"1,234.5%", s:"#,##0.0%"}, - {t:"(1,234)", s:"#,##0_);(#,##0)"}, - {t:"(1,234.5)", s:"#,##0.0_);(#,##0.0)"}, - {t:"(1,234.56)", s:"#,##0.00_);(#,##0.00)"}, - {t:"00", s:"00"}, - {t:"000", s:"000"}, - {t:"0000", s:"0000"}, - {t:"$1,234.56", s:"$#,##0.00"}, - {t:"2006-01-04", s:"yyyy-mm-dd"}, - {t:"01:23:45", s:"hh:mm:ss"}, - {t:"2006-01-04 01:23:45", s:"yyyy-mm-dd hh:mm:ss"}, - {t:"Hidden", s:"hidden"} - ], - "tvf": [ - {t:"Default", s:""}, - {t:"Automatic", s:"general"}, - {t:"Plain Text", s:"text-plain"}, - {t:"HTML", s:"text-html"}, - {t:"Wiki", s:"text-wiki"}, - {t:"Hidden", s:"hidden"} - ], - "ffal": [ // Formulas, Formats, All - {t:"All", s:"all"}, - {t:"Contents", s:"formulas"}, - {t:"Formats", s:"formats"} - ], - "all": [ // All - {t:"All", s:"all"} - ], - "rowcol": [ - {t:"Row", s:"row"}, - {t:"Column", s:"col"} - ], - "sortcol": [ - {t:"A up", s:"A up"}, - {t:"B up", s:"B up"}, - {t:"C up", s:"C up"}, - {t:"A down", s:"A down"}, - {t:"B down", s:"B down"}, - {t:"C down", s:"C down"}, - {t:"A, B, C up", s:"A up B up C up"} - ], - "none": [ // nothing - {t:" ", s:" "} - ] - } - } -*********/ - - // - // SocialCalc.SpreadsheetControlExecuteCommand(obj, combostr, sstr) - // - // xxx - // - - SocialCalc.SpreadsheetControlExecuteCommand = function (obj, combostr, sstr) { - var i, commands; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var eobj = spreadsheet.editor; - - var str = {}; - str.P = "%"; - str.N = "\n"; - if (eobj.range.hasrange) { - str.R = - SocialCalc.crToCoord(eobj.range.left, eobj.range.top) + - ":" + - SocialCalc.crToCoord(eobj.range.right, eobj.range.bottom); - str.C = str.R; - str.W = - SocialCalc.rcColname(eobj.range.left) + - ":" + - SocialCalc.rcColname(eobj.range.right); - } else { - str.C = eobj.ecell.coord; - str.R = eobj.ecell.coord + ":" + eobj.ecell.coord; - str.W = SocialCalc.rcColname(SocialCalc.coordToCr(eobj.ecell.coord).col); - } - str.S = sstr; - combostr = combostr.replace(/%C/g, str.C); - combostr = combostr.replace(/%R/g, str.R); - combostr = combostr.replace(/%N/g, str.N); - combostr = combostr.replace(/%S/g, str.S); - combostr = combostr.replace(/%W/g, str.W); - combostr = combostr.replace(/%P/g, str.P); - - eobj.EditorScheduleSheetCommands(combostr, true, false); - }; - - // - // result = SocialCalc.SpreadsheetControlCreateSheetHTML(spreadsheet) - // - // Returns the HTML representation of the whole spreadsheet - // - - SocialCalc.SpreadsheetControlCreateSheetHTML = function (spreadsheet) { - var context, div, ele; - - var result = ""; - - context = new SocialCalc.RenderContext(spreadsheet.sheet); - div = document.createElement("div"); - ele = context.RenderSheet(null, { type: "html" }); - div.appendChild(ele); - context = undefined; - result = div.innerHTML; - ele = undefined; - div = undefined; - return result; - }; - - // - // result = SocialCalc.SpreadsheetControlCreateCellHTML(spreadsheet, coord, linkstyle) - // - // Returns the HTML representation of a cell. Blank is "", not " ". - // - - SocialCalc.SpreadsheetControlCreateCellHTML = function ( - spreadsheet, - coord, - linkstyle - ) { - var result = ""; - var cell = spreadsheet.sheet.cells[coord]; - - if (!cell) return ""; - - if (cell.displaystring == undefined) { - result = SocialCalc.FormatValueForDisplay( - spreadsheet.sheet, - cell.datavalue, - coord, - linkstyle || spreadsheet.context.defaultHTMLlinkstyle - ); - } else { - result = cell.displaystring; - } - - if (result == " ") result = ""; - - return result; - }; - - // - // result = SocialCalc.SpreadsheetControlCreateCellHTMLSave(spreadsheet, range, linkstyle) - // - // Returns the HTML representation of a range of cells, or the whole sheet if range is null. - // The form is: - // version:1.0 - // coord:cell-HTML - // coord:cell-HTML - // ... - // - // Empty cells are skipped. The cell-HTML is encoded with ":"=>"\c", newline=>"\n", and "\"=>"\b". - // - - SocialCalc.SpreadsheetControlCreateCellHTMLSave = function ( - spreadsheet, - range, - linkstyle - ) { - var cr1, cr2, row, col, coord, cell, cellHTML; - var result = []; - var prange; - - if (range) { - prange = SocialCalc.ParseRange(range); - } else { - prange = { - cr1: { row: 1, col: 1 }, - cr2: { - row: spreadsheet.sheet.attribs.lastrow, - col: spreadsheet.sheet.attribs.lastcol, - }, - }; - } - cr1 = prange.cr1; - cr2 = prange.cr2; - - result.push("version:1.0"); - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - coord = SocialCalc.crToCoord(col, row); - cell = spreadsheet.sheet.cells[coord]; - if (!cell) continue; - if (cell.displaystring == undefined) { - cellHTML = SocialCalc.FormatValueForDisplay( - spreadsheet.sheet, - cell.datavalue, - coord, - linkstyle || spreadsheet.context.defaultHTMLlinkstyle - ); - } else { - cellHTML = cell.displaystring; - } - if (cellHTML == " ") continue; - result.push(coord + ":" + SocialCalc.encodeForSave(cellHTML)); - } - } - - result.push(""); // one extra to get extra \n - return result.join("\n"); - }; - - // - // Formula Bar Button Routines - // - - SocialCalc.SpreadsheetControl.DoFunctionList = function () { - var i, cname, str, f, ele; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var fcl = scc.function_classlist; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "function"; - - ele = document.getElementById(idp + "dialog"); - if (ele) return; // already have one - - scf.FillFunctionInfo(); - - str = - '
%loc!Category!
' + - '
  %loc!Functions!
' + - '
' + - '
' + - SocialCalc.SpreadsheetControl.GetFunctionInfoStr( - scf.FunctionClasses[fcl[0]].items[0] - ) + - "
" + - '
' + - ' ' + - '
' + - "
"; - - var main = document.createElement("div"); - main.id = idp + "dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - str = - '' + - '" + - '
' + - " %loc!Function List!" + - " X 
' + - '
' + - str + - "
"; - - str = SocialCalc.LocalizeSubstrings(str); - - main.innerHTML = str; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp + "name"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - //!!! need to do keyboard handling: if esc, hide; if All, letter scrolls to there - }; - - SocialCalc.SpreadsheetControl.GetFunctionNamesStr = function (cname) { - var i, f; - var scf = SocialCalc.Formula; - var str = ""; - - f = scf.FunctionClasses[cname]; - for (i = 0; i < f.items.length; i++) { - str += - '"; - } - - return str; - }; - - SocialCalc.SpreadsheetControl.FillFunctionNames = function (cname, ele) { - var i, f; - var scf = SocialCalc.Formula; - - ele.length = 0; - f = scf.FunctionClasses[cname]; - for (i = 0; i < f.items.length; i++) { - ele.options[i] = new Option(f.items[i], f.items[i]); - if (i == 0) { - ele.options[i].selected = true; - } - } - }; - - SocialCalc.SpreadsheetControl.GetFunctionInfoStr = function (fname) { - var scf = SocialCalc.Formula; - var f = scf.FunctionList[fname]; - var scsc = SocialCalc.special_chars; - - var str = - "" + fname + "(" + scsc(scf.FunctionArgString(fname)) + ")
"; - str += scsc(f[3]); - - return str; - }; - - SocialCalc.SpreadsheetControl.FunctionClassChosen = function (cname) { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "function"; - var scf = SocialCalc.Formula; - - SocialCalc.SpreadsheetControl.FillFunctionNames( - cname, - document.getElementById(idp + "name") - ); - - SocialCalc.SpreadsheetControl.FunctionChosen( - scf.FunctionClasses[cname].items[0] - ); - }; - - SocialCalc.SpreadsheetControl.FunctionChosen = function (fname) { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "function"; - - document.getElementById(idp + "desc").innerHTML = - SocialCalc.SpreadsheetControl.GetFunctionInfoStr(fname); - }; - - SocialCalc.SpreadsheetControl.HideFunctions = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById(spreadsheet.idPrefix + "functiondialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.SpreadsheetControl.DoFunctionPaste = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var ele = document.getElementById(spreadsheet.idPrefix + "functionname"); - var mele = document.getElementById( - spreadsheet.idPrefix + "multilinetextarea" - ); - - var text = ele.value + "("; - - SocialCalc.SpreadsheetControl.HideFunctions(); - - if (mele) { - // multi-line editing is in progress - mele.value += text; - mele.focus(); - SocialCalc.CmdGotFocus(mele); - } else { - editor.EditorAddToInput(text, "="); - } - }; - - SocialCalc.SpreadsheetControl.DoMultiline = function () { - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var str, ele, text; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "multiline"; - - ele = document.getElementById(idp + "dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - text = SocialCalc.special_chars(text); - - str = - '" + - '
' + - SCLocSS( - ' ' + - ' ' + - '
' + - "" - ); - - var main = document.createElement("div"); - main.id = idp + "dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - SCLocSS(" %loc!Multi-line Input Box!") + - " X 
' + - '
' + - str + - "
"; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp + "textarea"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - //!!! need to do keyboard handling: if esc, hide? - }; - - SocialCalc.SpreadsheetControl.HideMultiline = function () { - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix + "multilinedialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - }; - - SocialCalc.SpreadsheetControl.DoMultilineClear = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById( - spreadsheet.idPrefix + "multilinetextarea" - ); - - ele.value = ""; - ele.focus(); - }; - - SocialCalc.SpreadsheetControl.DoMultilinePaste = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var ele = document.getElementById( - spreadsheet.idPrefix + "multilinetextarea" - ); - - var text = ele.value; - - SocialCalc.SpreadsheetControl.HideMultiline(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - editor.EditorSaveEdit(text); - }; - - SocialCalc.SpreadsheetControl.DoLink = function () { - var SCLoc = SocialCalc.LocalizeString; - - var str, ele, text, cell, setformat, popup; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "link"; - - ele = document.getElementById(idp + "dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - if (text.charAt(0) == "'") { - text = text.slice(1); - } - - var parts = SocialCalc.ParseCellLinkText(text); - - text = SocialCalc.special_chars(text); - - cell = spreadsheet.sheet.cells[editor.ecell.coord]; - if (!cell || !cell.textvalueformat) { - // set to link format, but don't override - setformat = " checked"; - } else { - setformat = ""; - } - - popup = parts.newwin ? " checked" : ""; - - str = - '
' + - '' + - SCLoc("Description") + - "
" + - '
' + - '' + - SCLoc("URL") + - "
" + - '
'; - if (SocialCalc.Callbacks.MakePageLink) { - // only show if handling pagenames here - str += - '' + - SCLoc("Page Name") + - "
" + - '
' + - '' + - SCLoc("Workspace") + - "
" + - '
'; - } - str += SocialCalc.LocalizeSubstrings( - ' " + - '%loc!Set to Link format!
' + - ' " + - '%loc!Show in new browser window!' + - "
" + - '
' + - ' ' + - ' ' + - '
' + - "" - ); - - var main = document.createElement("div"); - main.id = idp + "dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - SCLoc("Link Input Box") + - " X 
' + - '
' + - str + - "
"; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp + "url"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - //!!! need to do keyboard handling: if esc, hide? - }; - - SocialCalc.SpreadsheetControl.HideLink = function () { - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix + "linkdialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - }; - - SocialCalc.SpreadsheetControl.DoLinkClear = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - document.getElementById(spreadsheet.idPrefix + "linkdesc").value = ""; - document.getElementById(spreadsheet.idPrefix + "linkpagename").value = ""; - document.getElementById(spreadsheet.idPrefix + "linkworkspace").value = ""; - - var ele = document.getElementById(spreadsheet.idPrefix + "linkurl"); - ele.value = ""; - ele.focus(); - }; - - SocialCalc.SpreadsheetControl.DoLinkPaste = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var descele = document.getElementById(spreadsheet.idPrefix + "linkdesc"); - var urlele = document.getElementById(spreadsheet.idPrefix + "linkurl"); - var pagenameele = document.getElementById( - spreadsheet.idPrefix + "linkpagename" - ); - var workspaceele = document.getElementById( - spreadsheet.idPrefix + "linkworkspace" - ); - var formatele = document.getElementById( - spreadsheet.idPrefix + "linkformat" - ); - var popupele = document.getElementById(spreadsheet.idPrefix + "linkpopup"); - - var text = ""; - - var ltsym, gtsym, obsym, cbsym; - - if (popupele.checked) { - ltsym = "<<"; - gtsym = ">>"; - obsym = "[["; - cbsym = "]]"; - } else { - ltsym = "<"; - gtsym = ">"; - obsym = "["; - cbsym = "]"; - } - - if (pagenameele && pagenameele.value) { - if (workspaceele.value) { - text = - descele.value + - "{" + - workspaceele.value + - obsym + - pagenameele.value + - cbsym + - "}"; - } else { - text = descele.value + obsym + pagenameele.value + cbsym; - } - } else { - text = descele.value + ltsym + urlele.value + gtsym; - } - - SocialCalc.SpreadsheetControl.HideLink(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - if (formatele.checked) { - SocialCalc.SpreadsheetControlExecuteCommand( - null, - "set %C textvalueformat text-link", - "" - ); - } - - editor.EditorSaveEdit(text); - }; - - SocialCalc.SpreadsheetControl.DoSum = function () { - var cmd, cell, row, col, sel, cr, foundvalue; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var sheet = editor.context.sheetobj; - - if (editor.range.hasrange) { - sel = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - cmd = - "set " + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom + 1) + - " formula sum(" + - sel + - ")"; - } else { - row = editor.ecell.row - 1; - col = editor.ecell.col; - if (row <= 1) { - cmd = "set " + editor.ecell.coord + " constant e#REF! 0 #REF!"; - } else { - foundvalue = false; - while (row > 0) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (!cell.datatype || cell.datatype == "t") { - if (foundvalue) { - row++; - break; - } - } else { - foundvalue = true; - } - row--; - } - cmd = - "set " + - editor.ecell.coord + - " formula sum(" + - SocialCalc.crToCoord(col, row) + - ":" + - SocialCalc.crToCoord(col, editor.ecell.row - 1) + - ")"; - } - } - - editor.EditorScheduleSheetCommands(cmd, true, false); - }; - - // - // TAB Routines - // - - // Sort - - SocialCalc.SpreadsheetControlSortOnclick = function (s, t) { - var name, i; - var namelist = []; - var nl = document.getElementById(s.idPrefix + "sortlist"); - SocialCalc.LoadColumnChoosers(s); - s.editor.RangeChangeCallback.sort = SocialCalc.UpdateSortRangeProposal; - - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - nl.options[0] = new Option(SocialCalc.LocalizeString("[select range]")); - for (i = 0; i < namelist.length; i++) { - name = namelist[i]; - nl.options[i + 1] = new Option(name, name); - if (name == s.sortrange) { - nl.options[i + 1].selected = true; - } - } - if (s.sortrange == "") { - nl.options[0].selected = true; - } - - SocialCalc.UpdateSortRangeProposal(s.editor); - SocialCalc.KeyboardFocus(); - return; - }; - - SocialCalc.SpreadsheetControlSortSave = function (editor, setting) { - // Format is: - // sort:sortrange:major:up/down:minor:up/down:last:up/down - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var str, sele, rele; - - str = "sort:" + SocialCalc.encodeForSave(spreadsheet.sortrange) + ":"; - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - rele = document.getElementById(spreadsheet.idPrefix + "majorsortup"); - str += sele.selectedIndex + (rele.checked ? ":up" : ":down"); - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "minorsortup"); - str += ":" + sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } else { - str += "::"; - } - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "lastsortup"); - str += ":" + sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } else { - str += "::"; - } - return str + "\n"; - }; - - SocialCalc.SpreadsheetControlSortLoad = function ( - editor, - setting, - line, - flags - ) { - var parts, ele; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - parts = line.split(":"); - spreadsheet.sortrange = SocialCalc.decodeFromSave(parts[1]); - ele = document.getElementById(spreadsheet.idPrefix + "sortbutton"); - if (spreadsheet.sortrange) { - ele.value = SocialCalc.LocalizeString("Sort ") + spreadsheet.sortrange; - ele.style.visibility = "visible"; - } else { - ele.style.visibility = "hidden"; - } - SocialCalc.LoadColumnChoosers(spreadsheet); - - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - sele.selectedIndex = parts[2] - 0; - document.getElementById( - spreadsheet.idPrefix + "majorsort" + parts[3] - ).checked = true; - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - if (parts[4]) { - sele.selectedIndex = parts[4] - 0; - document.getElementById( - spreadsheet.idPrefix + "minorsort" + parts[5] - ).checked = true; - } else { - sele.selectedIndex = 0; - document.getElementById( - spreadsheet.idPrefix + "minorsortup" - ).checked = true; - } - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - if (parts[6]) { - sele.selectedIndex = parts[6] - 0; - document.getElementById( - spreadsheet.idPrefix + "lastsort" + parts[7] - ).checked = true; - } else { - sele.selectedIndex = 0; - document.getElementById( - spreadsheet.idPrefix + "lastsortup" - ).checked = true; - } - - return true; - }; - - // Comment - - SocialCalc.SpreadsheetControlCommentOnclick = function (s, t) { - s.editor.MoveECellCallback.comment = - SocialCalc.SpreadsheetControlCommentMoveECell; - SocialCalc.SpreadsheetControlCommentDisplay(s, t); - SocialCalc.KeyboardFocus(); - return; - }; - - SocialCalc.SpreadsheetControlCommentDisplay = function (s, t) { - var c = ""; - if ( - s.editor.ecell && - s.editor.ecell.coord && - s.sheet.cells[s.editor.ecell.coord] - ) { - c = s.sheet.cells[s.editor.ecell.coord].comment || ""; - } - document.getElementById(s.idPrefix + "commenttext").value = c; - }; - - SocialCalc.SpreadsheetControlCommentMoveECell = function (editor) { - SocialCalc.SpreadsheetControlCommentDisplay( - SocialCalc.GetSpreadsheetControlObject(), - "comment" - ); - }; - - SocialCalc.SpreadsheetControlCommentSet = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - s.ExecuteCommand( - "set %C comment " + - SocialCalc.encodeForSave( - document.getElementById(s.idPrefix + "commenttext").value - ) - ); - var cell = SocialCalc.GetEditorCellElement( - s.editor, - s.editor.ecell.row, - s.editor.ecell.col - ); - s.editor.UpdateCellCSS(cell, s.editor.ecell.row, s.editor.ecell.col); - SocialCalc.KeyboardFocus(); - }; - - SocialCalc.SpreadsheetControlCommentOnunclick = function (s, t) { - delete s.editor.MoveECellCallback.comment; - }; - - // Names - - SocialCalc.SpreadsheetControlNamesOnclick = function (s, t) { - document.getElementById(s.idPrefix + "namesname").value = ""; - document.getElementById(s.idPrefix + "namesdesc").value = ""; - document.getElementById(s.idPrefix + "namesvalue").value = ""; - s.editor.RangeChangeCallback.names = - SocialCalc.SpreadsheetControlNamesRangeChange; - s.editor.MoveECellCallback.names = - SocialCalc.SpreadsheetControlNamesRangeChange; - SocialCalc.SpreadsheetControlNamesRangeChange(s.editor); - SocialCalc.SpreadsheetControlNamesFillNameList(); - SocialCalc.SpreadsheetControlNamesChangedName(); - }; - - SocialCalc.SpreadsheetControlNamesFillNameList = function () { - var SCLoc = SocialCalc.LocalizeString; - var name, i; - var namelist = []; - var s = SocialCalc.GetSpreadsheetControlObject(); - var nl = document.getElementById(s.idPrefix + "nameslist"); - var currentname = document - .getElementById(s.idPrefix + "namesname") - .value.toUpperCase() - .replace(/[^A-Z0-9_\.]/g, ""); - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - if (namelist.length > 0) { - nl.options[0] = new Option(SCLoc("[New]")); - } else { - nl.options[0] = new Option(SCLoc("[None]")); - } - for (i = 0; i < namelist.length; i++) { - name = namelist[i]; - nl.options[i + 1] = new Option(name, name); - if (name == currentname) { - nl.options[i + 1].selected = true; - } - } - if (currentname == "") { - nl.options[0].selected = true; - } - }; - - SocialCalc.SpreadsheetControlNamesChangedName = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var nl = document.getElementById(s.idPrefix + "nameslist"); - var name = nl.options[nl.selectedIndex].value; - if (s.sheet.names[name]) { - document.getElementById(s.idPrefix + "namesname").value = name; - document.getElementById(s.idPrefix + "namesdesc").value = - s.sheet.names[name].desc || ""; - document.getElementById(s.idPrefix + "namesvalue").value = - s.sheet.names[name].definition || ""; - } else { - document.getElementById(s.idPrefix + "namesname").value = ""; - document.getElementById(s.idPrefix + "namesdesc").value = ""; - document.getElementById(s.idPrefix + "namesvalue").value = ""; - } - }; - - SocialCalc.SpreadsheetControlNamesRangeChange = function (editor) { - var s = SocialCalc.GetSpreadsheetControlObject(); - var ele = document.getElementById(s.idPrefix + "namesrangeproposal"); - if (editor.range.hasrange) { - ele.value = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - ele.value = editor.ecell.coord; - } - }; - - SocialCalc.SpreadsheetControlNamesOnunclick = function (s, t) { - delete s.editor.RangeChangeCallback.names; - delete s.editor.MoveECellCallback.names; - }; - - SocialCalc.SpreadsheetControlNamesSetValue = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - document.getElementById(s.idPrefix + "namesvalue").value = - document.getElementById(s.idPrefix + "namesrangeproposal").value; - SocialCalc.KeyboardFocus(); - }; - - SocialCalc.SpreadsheetControlNamesSave = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var name = document.getElementById(s.idPrefix + "namesname").value; - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - if (name != "") { - s.ExecuteCommand( - "name define " + - name + - " " + - document.getElementById(s.idPrefix + "namesvalue").value + - "\n" + - "name desc " + - name + - " " + - document.getElementById(s.idPrefix + "namesdesc").value - ); - } - }; - - SocialCalc.SpreadsheetControlNamesDelete = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var name = document.getElementById(s.idPrefix + "namesname").value; - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - if (name != "") { - s.ExecuteCommand("name delete " + name); - // document.getElementById(s.idPrefix+"namesname").value = ""; - // document.getElementById(s.idPrefix+"namesvalue").value = ""; - // document.getElementById(s.idPrefix+"namesdesc").value = ""; - // SocialCalc.SpreadsheetControlNamesFillNameList(); - } - SocialCalc.KeyboardFocus(); - }; - - // Clipboard - - SocialCalc.SpreadsheetControlClipboardOnclick = function (s, t) { - var s = SocialCalc.GetSpreadsheetControlObject(); - clipele = document.getElementById(s.idPrefix + "clipboardtext"); - document.getElementById(s.idPrefix + "clipboardformat-tab").checked = true; - clipele.value = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.Clipboard.clipboard, - "tab" - ); - return; - }; - - SocialCalc.SpreadsheetControlClipboardFormat = function (which) { - var s = SocialCalc.GetSpreadsheetControlObject(); - clipele = document.getElementById(s.idPrefix + "clipboardtext"); - clipele.value = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.Clipboard.clipboard, - which - ); - }; - - SocialCalc.SpreadsheetControlClipboardLoad = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var savetype = "tab"; - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - if (document.getElementById(s.idPrefix + "clipboardformat-csv").checked) { - savetype = "csv"; - } else if ( - document.getElementById(s.idPrefix + "clipboardformat-scsave").checked - ) { - savetype = "scsave"; - } - s.editor.EditorScheduleSheetCommands( - "loadclipboard " + - SocialCalc.encodeForSave( - SocialCalc.ConvertOtherFormatToSave( - document.getElementById(s.idPrefix + "clipboardtext").value, - savetype - ) - ), - true, - false - ); - }; - - SocialCalc.SpreadsheetControlClipboardClear = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var clipele = document.getElementById(s.idPrefix + "clipboardtext"); - clipele.value = ""; - s.editor.EditorScheduleSheetCommands("clearclipboard", true, false); - clipele.focus(); - }; - - SocialCalc.SpreadsheetControlClipboardExport = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - if (s.ExportCallback) { - s.ExportCallback(s); - } - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - }; - - // Settings - - SocialCalc.SpreadsheetControlSettingsSwitch = function (target) { - SocialCalc.SettingControlReset(); - var s = SocialCalc.GetSpreadsheetControlObject(); - var sheettable = document.getElementById(s.idPrefix + "sheetsettingstable"); - var celltable = document.getElementById(s.idPrefix + "cellsettingstable"); - var sheettoolbar = document.getElementById( - s.idPrefix + "sheetsettingstoolbar" - ); - var celltoolbar = document.getElementById( - s.idPrefix + "cellsettingstoolbar" - ); - if (target == "sheet") { - sheettable.style.display = "block"; - celltable.style.display = "none"; - sheettoolbar.style.display = "block"; - celltoolbar.style.display = "none"; - SocialCalc.SettingsControlSetCurrentPanel( - s.views.settings.values.sheetspanel - ); - } else { - sheettable.style.display = "none"; - celltable.style.display = "block"; - sheettoolbar.style.display = "none"; - celltoolbar.style.display = "block"; - SocialCalc.SettingsControlSetCurrentPanel( - s.views.settings.values.cellspanel - ); - } - }; - - SocialCalc.SettingsControlSave = function (target) { - var range, cmdstr; - var s = SocialCalc.GetSpreadsheetControlObject(); - var sc = SocialCalc.SettingsControls; - var panelobj = sc.CurrentPanel; - var attribs = SocialCalc.SettingsControlUnloadPanel(panelobj); - - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - - if (target == "sheet") { - cmdstr = s.sheet.DecodeSheetAttributes(attribs); - } else if (target == "cell") { - if (s.editor.range.hasrange) { - range = - SocialCalc.crToCoord(s.editor.range.left, s.editor.range.top) + - ":" + - SocialCalc.crToCoord(s.editor.range.right, s.editor.range.bottom); - } - cmdstr = s.sheet.DecodeCellAttributes( - s.editor.ecell.coord, - attribs, - range - ); - } else { - // Cancel - } - if (cmdstr) { - s.editor.EditorScheduleSheetCommands(cmdstr, true, false); - } - }; - - /////////////////////// - // - // SAVE / LOAD ROUTINES - // - /////////////////////// - - // - // result = SocialCalc.SpreadsheetControlCreateSpreadsheetSave(spreadsheet, otherparts) - // - // Saves the spreadsheet's sheet data, editor settings, and audit trail (redo stack). - // The serialized data strings are concatenated together in multi-part MIME format. - // The first part lists the types of the subsequent parts (e.g., "sheet", "editor", and "audit") - // in this format: - // # comments - // version:1.0 - // part:type1 - // part:type2 - // ... - // - // If otherparts is non-null, it is an object with: - // partname1: "part contents - should end with \n", - // partname2: "part contents - should end with \n" - // - - SocialCalc.SpreadsheetControlCreateSpreadsheetSave = function ( - spreadsheet, - otherparts - ) { - var result; - - var otherpartsstr = ""; - var otherpartsnames = ""; - var partname, extranl; - - if (otherparts) { - for (partname in otherparts) { - if (otherparts[partname].charAt(otherparts[partname] - 1) != "\n") { - extranl = "\n"; - } else { - extranl = ""; - } - otherpartsstr += - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - otherparts[partname] + - extranl; - otherpartsnames += "part:" + partname + "\n"; - } - } - - result = - "socialcalc:version:1.0\n" + - "MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=" + - spreadsheet.multipartBoundary + - "\n" + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - "# SocialCalc Spreadsheet Control Save\nversion:1.0\npart:sheet\npart:edit\npart:audit\n" + - otherpartsnames + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - spreadsheet.CreateSheetSave() + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - spreadsheet.editor.SaveEditorSettings() + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - spreadsheet.sheet.CreateAuditString() + - otherpartsstr + - "--" + - spreadsheet.multipartBoundary + - "--\n"; - - return result; - }; - - // - // parts = SocialCalc.SpreadsheetControlDecodeSpreadsheetSave(spreadsheet, str) - // - // Separates the parts from a spreadsheet save string, returning an object with the sub-strings. - // - // {type1: {start: startpos, end: endpos}, type2:...} - // - - SocialCalc.SpreadsheetControlDecodeSpreadsheetSave = function ( - spreadsheet, - str - ) { - var pos1, - mpregex, - searchinfo, - boundary, - boundaryregex, - blanklineregex, - start, - ending, - lines, - i, - lines, - p, - pnun; - var parts = {}; - var partlist = []; - - pos1 = str.search(/^MIME-Version:\s1\.0/im); - if (pos1 < 0) return parts; - - mpregex = /^Content-Type:\s*multipart\/mixed;\s*boundary=(\S+)/gim; - mpregex.lastIndex = pos1; - - searchinfo = mpregex.exec(str); - if (mpregex.lastIndex <= 0) return parts; - boundary = searchinfo[1]; - - boundaryregex = new RegExp("^--" + boundary + "(?:\r\n|\n)", "mg"); - boundaryregex.lastIndex = mpregex.lastIndex; - - searchinfo = boundaryregex.exec(str); // find header top boundary - blanklineregex = /(?:\r\n|\n)(?:\r\n|\n)/gm; - blanklineregex.lastIndex = boundaryregex.lastIndex; - searchinfo = blanklineregex.exec(str); // skip to after blank line - if (!searchinfo) return parts; - start = blanklineregex.lastIndex; - boundaryregex.lastIndex = start; - searchinfo = boundaryregex.exec(str); // find end of header - if (!searchinfo) return parts; - ending = searchinfo.index; - - lines = str.substring(start, ending).split(/\r\n|\n/); // get header as lines - for (i = 0; i < lines.length; i++) { - line = lines[i]; - p = line.split(":"); - switch (p[0]) { - case "version": - break; - case "part": - partlist.push(p[1]); - break; - } - } - - for (pnum = 0; pnum < partlist.length; pnum++) { - // get each part - blanklineregex.lastIndex = ending; - searchinfo = blanklineregex.exec(str); // find blank line ending mime-part header - if (!searchinfo) return parts; - start = blanklineregex.lastIndex; - if (pnum == partlist.length - 1) { - // last one has different boundary - boundaryregex = new RegExp("^--" + boundary + "--$", "mg"); - } - boundaryregex.lastIndex = start; - searchinfo = boundaryregex.exec(str); // find ending boundary - if (!searchinfo) return parts; - ending = searchinfo.index; - parts[partlist[pnum]] = { start: start, end: ending }; // return position within full string - } - - return parts; - }; - - /* - * SettingsControls - * - * Each settings panel has an object in the following form: - * - * {ctrl-name1: {setting: setting-nameA, type: ctrl-type, id: id-component}, - * ctrl-name2: {setting: setting-nameB, type: ctrl-type, id: id-component, initialdata: optional-initialdata-override}, - * ...} - * - * The ctrl-types are names that correspond to: - * - * SocialCalc.SettingsControls.Controls = { - * ctrl-type1: { - * SetValue: function(panel-obj, ctrl-name, {def: true/false, val: value}) {...;}, - * ColorValues: if true, Onchanged converts between hex and RGB - * GetValue: function(panel-obj, ctrl-name) {...return {def: true/false, val: value};}, - * Initialize: function(panel-obj, ctrl-name) {...;}, // used to fill dropdowns, etc. - * InitialData: control-dependent, // used by Initialize (if no panel ctrlname.initialdata) - * OnReset: function(ctrl-name) {...;}, // called to put down popups, etc. - * ChangedCallback: function(ctrl-name) {...;} // if not null, called by control when user changes value - * } - * - */ - - SocialCalc.SettingsControls = { - Controls: {}, - CurrentPanel: null, // panel object to search on events - }; - - // - // SocialCalc.SettingsControlSetCurrentPanel(panel-object) - // - - SocialCalc.SettingsControlSetCurrentPanel = function (panelobj) { - SocialCalc.SettingsControls.CurrentPanel = panelobj; - - SocialCalc.SettingsControls.PopupChangeCallback( - { panelobj: panelobj }, - "", - null - ); - }; - - // - // SocialCalc.SettingsControlInitializePanel(panel-object) - // - - SocialCalc.SettingsControlInitializePanel = function (panelobj) { - var ctrlname; - var sc = SocialCalc.SettingsControls; - var ctrl; - - for (ctrlname in panelobj) { - if (ctrlname == "name") continue; - ctrl = sc.Controls[panelobj[ctrlname].type]; - if (ctrl && ctrl.Initialize) ctrl.Initialize(panelobj, ctrlname); - } - }; - - // - // SocialCalc.SettingsControlLoadPanel(panel-object, attribs) - // - - SocialCalc.SettingsControlLoadPanel = function (panelobj, attribs) { - var ctrlname; - var sc = SocialCalc.SettingsControls; - - for (ctrlname in panelobj) { - if (ctrlname == "name") continue; - ctrl = sc.Controls[panelobj[ctrlname].type]; - if (ctrl && ctrl.SetValue) - ctrl.SetValue(panelobj, ctrlname, attribs[panelobj[ctrlname].setting]); - } - }; - - // - // attribs = SocialCalc.SettingsControlUnloadPanel(panel-object) - // - - SocialCalc.SettingsControlUnloadPanel = function (panelobj) { - var ctrlname; - var sc = SocialCalc.SettingsControls; - var attribs = {}; - - for (ctrlname in panelobj) { - if (ctrlname == "name") continue; - ctrl = sc.Controls[panelobj[ctrlname].type]; - if (ctrl && ctrl.GetValue) - attribs[panelobj[ctrlname].setting] = ctrl.GetValue(panelobj, ctrlname); - } - - return attribs; - }; - - // - // SocialCalc.SettingsControls.PopupChangeCallback - // - - SocialCalc.SettingsControls.PopupChangeCallback = function ( - attribs, - id, - value - ) { - var sc = SocialCalc.Constants; - - var ele = document.getElementById("sample-text"); - - if (!ele || !attribs || !attribs.panelobj) return; - - var idPrefix = SocialCalc.CurrentSpreadsheetControlObject.idPrefix; - - var c = attribs.panelobj.name == "cell" ? "c" : ""; - - var v, a, parts, str1, str2, i; - - parts = - sc.defaultCellLayout.match( - /^padding.(\S+) (\S+) (\S+) (\S+).vertical.align.(\S+);$/ - ) || []; - - var cv = { - color: ["textcolor"], - backgroundColor: ["bgcolor", "#FFF"], - fontSize: ["fontsize", sc.defaultCellFontSize], - fontFamily: ["fontfamily"], - paddingTop: ["padtop", parts[1]], - paddingRight: ["padright", parts[2]], - paddingBottom: ["padbottom", parts[3]], - paddingLeft: ["padleft", parts[4]], - verticalAlign: ["alignvert", parts[5]], - }; - - for (a in cv) { - v = SocialCalc.Popup.GetValue(idPrefix + c + cv[a][0]) || cv[a][1] || ""; - ele.style[a] = v; - } - - if (c == "c") { - cv = { - borderTop: "cbt", - borderRight: "cbr", - borderBottom: "cbb", - borderLeft: "cbl", - }; - for (a in cv) { - v = SocialCalc.SettingsControls.BorderSideGetValue( - attribs.panelobj, - cv[a] - ); - ele.style[a] = v ? v.val || "" : ""; - } - v = SocialCalc.Popup.GetValue(idPrefix + "calignhoriz"); - ele.style.textAlign = v || "left"; - ele.childNodes[1].style.textAlign = v || "right"; - } else { - ele.style.border = ""; - v = SocialCalc.Popup.GetValue(idPrefix + "textalignhoriz"); - ele.style.textAlign = v || "left"; - v = SocialCalc.Popup.GetValue(idPrefix + "numberalignhoriz"); - ele.childNodes[1].style.textAlign = v || "right"; - } - - v = SocialCalc.Popup.GetValue(idPrefix + c + "fontlook"); - parts = v ? v.match(/^(\S+) (\S+)$/) || [] : []; - ele.style.fontStyle = parts[1] || ""; - ele.style.fontWeight = parts[2] || ""; - - v = SocialCalc.Popup.GetValue(idPrefix + c + "formatnumber") || "General"; - str1 = SocialCalc.FormatNumber.formatNumberWithFormat(9.8765, v, ""); - str2 = SocialCalc.FormatNumber.formatNumberWithFormat(-1234.5, v, ""); - if (str2 != "??-???-?? ??:??:??") { - // not bad date from negative number - str1 += "
" + str2; - } - - ele.childNodes[1].innerHTML = str1; - }; - - // - // PopupList Control - // - - SocialCalc.SettingsControls.PopupListSetValue = function ( - panelobj, - ctrlname, - value - ) { - if (!value) { - alert(ctrlname + " no value"); - return; - } - - var sp = SocialCalc.Popup; - - if (!value.def) { - sp.SetValue(panelobj[ctrlname].id, value.val); - } else { - sp.SetValue(panelobj[ctrlname].id, ""); - } - }; - - // - // SocialCalc.SettingsControls.PopupListGetValue - // - - SocialCalc.SettingsControls.PopupListGetValue = function ( - panelobj, - ctrlname - ) { - var ctl = panelobj[ctrlname]; - if (!ctl) return null; - - var value = SocialCalc.Popup.GetValue(ctl.id); - if (value) { - return { def: false, val: value }; - } else { - return { def: true, val: 0 }; - } - }; - - // - // SocialCalc.SettingsControls.PopupListInitialize - // - - SocialCalc.SettingsControls.PopupListInitialize = function ( - panelobj, - ctrlname - ) { - var i, val, pos, otext; - var sc = SocialCalc.SettingsControls; - var initialdata = - panelobj[ctrlname].initialdata || - sc.Controls[panelobj[ctrlname].type].InitialData || - ""; - initialdata = SocialCalc.LocalizeSubstrings(initialdata); - var optionvals = initialdata.split(/\|/); - - var options = []; - - for (i = 0; i < (optionvals.length || 0); i++) { - val = optionvals[i]; - pos = val.indexOf(":"); - otext = val.substring(0, pos); - if (otext.indexOf("\\") != -1) { - // escape any colons - otext = otext.replace(/\\c/g, ":"); - otext = otext.replace(/\\b/g, "\\"); - } - otext = SocialCalc.special_chars(otext); - if (otext == "[custom]") { - options[i] = { - o: SocialCalc.Constants.s_PopupListCustom, - v: val.substring(pos + 1), - a: { custom: true }, - }; - } else if (otext == "[cancel]") { - options[i] = { - o: SocialCalc.Constants.s_PopupListCancel, - v: "", - a: { cancel: true }, - }; - } else if (otext == "[break]") { - options[i] = { o: "-----", v: "", a: { skip: true } }; - } else if (otext == "[newcol]") { - options[i] = { o: "", v: "", a: { newcol: true } }; - } else { - options[i] = { o: otext, v: val.substring(pos + 1) }; - } - } - - SocialCalc.Popup.Create("List", panelobj[ctrlname].id, {}); - SocialCalc.Popup.Initialize(panelobj[ctrlname].id, { - options: options, - attribs: { - changedcallback: SocialCalc.SettingsControls.PopupChangeCallback, - panelobj: panelobj, - }, - }); - }; - - // - // SocialCalc.SettingsControls.PopupListReset - // - - SocialCalc.SettingsControls.PopupListReset = function (ctrlname) { - SocialCalc.Popup.Reset("List"); - }; - - SocialCalc.SettingsControls.Controls.PopupList = { - SetValue: SocialCalc.SettingsControls.PopupListSetValue, - GetValue: SocialCalc.SettingsControls.PopupListGetValue, - Initialize: SocialCalc.SettingsControls.PopupListInitialize, - OnReset: SocialCalc.SettingsControls.PopupListReset, - ChangedCallback: null, - }; - - // - // ColorChooser Control - // - - SocialCalc.SettingsControls.ColorChooserSetValue = function ( - panelobj, - ctrlname, - value - ) { - if (!value) { - alert(ctrlname + " no value"); - return; - } - - var sp = SocialCalc.Popup; - - if (!value.def) { - sp.SetValue(panelobj[ctrlname].id, value.val); - } else { - sp.SetValue(panelobj[ctrlname].id, ""); - } - }; - - // - // SocialCalc.SettingsControls.ColorChooserGetValue - // - - SocialCalc.SettingsControls.ColorChooserGetValue = function ( - panelobj, - ctrlname - ) { - var value = SocialCalc.Popup.GetValue(panelobj[ctrlname].id); - if (value) { - return { def: false, val: value }; - } else { - return { def: true, val: 0 }; - } - }; - - // - // SocialCalc.SettingsControls.ColorChooserInitialize - // - - SocialCalc.SettingsControls.ColorChooserInitialize = function ( - panelobj, - ctrlname - ) { - var i, val, pos, otext; - var sc = SocialCalc.SettingsControls; - - SocialCalc.Popup.Create("ColorChooser", panelobj[ctrlname].id, {}); - SocialCalc.Popup.Initialize(panelobj[ctrlname].id, { - attribs: { - title: " ", - moveable: true, - width: "106px", - changedcallback: SocialCalc.SettingsControls.PopupChangeCallback, - panelobj: panelobj, - }, - }); - }; - - // - // SocialCalc.SettingsControls.ColorChooserReset - // - - SocialCalc.SettingsControls.ColorChooserReset = function (ctrlname) { - SocialCalc.Popup.Reset("ColorChooser"); - }; - - SocialCalc.SettingsControls.Controls.ColorChooser = { - SetValue: SocialCalc.SettingsControls.ColorChooserSetValue, - GetValue: SocialCalc.SettingsControls.ColorChooserGetValue, - Initialize: SocialCalc.SettingsControls.ColorChooserInitialize, - OnReset: SocialCalc.SettingsControls.ColorChooserReset, - ChangedCallback: null, - }; - - // - // SocialCalc.SettingsControls.BorderSideSetValue - // - - SocialCalc.SettingsControls.BorderSideSetValue = function ( - panelobj, - ctrlname, - value - ) { - var sc = SocialCalc.SettingsControls; - var ele, found, idname, parts; - var idstart = panelobj[ctrlname].id; - - if (!value) { - alert(ctrlname + " no value"); - return; - } - - ele = document.getElementById(idstart + "-onoff-bcb"); // border checkbox - if (!ele) return; - - if (value.val) { - // border does not use default: it looks only to the value currently - ele.checked = true; - ele.value = value.val; - parts = value.val.match(/(\S+)\s+(\S+)\s+(\S.+)/); - idname = idstart + "-color"; - SocialCalc.Popup.SetValue(idname, parts[3]); - SocialCalc.Popup.SetDisabled(idname, false); - } else { - ele.checked = false; - ele.value = value.val; - idname = idstart + "-color"; - SocialCalc.Popup.SetValue(idname, ""); - SocialCalc.Popup.SetDisabled(idname, true); - } - }; - - // - // SocialCalc.SettingsControls.BorderSideGetValue - // - - SocialCalc.SettingsControls.BorderSideGetValue = function ( - panelobj, - ctrlname - ) { - var sc = SocialCalc.SettingsControls; - var ele, value; - var idstart = panelobj[ctrlname].id; - - ele = document.getElementById(idstart + "-onoff-bcb"); // border checkbox - if (!ele) return; - - if (ele.checked) { - // on - value = SocialCalc.Popup.GetValue(idstart + "-color"); - value = "1px solid " + (value || "rgb(0,0,0)"); - return { def: false, val: value }; - } else { - // off - return { def: false, val: "" }; - } - }; - - // - // SocialCalc.SettingsControls.BorderSideInitialize - // - - SocialCalc.SettingsControls.BorderSideInitialize = function ( - panelobj, - ctrlname - ) { - var sc = SocialCalc.SettingsControls; - var idstart = panelobj[ctrlname].id; - - SocialCalc.Popup.Create("ColorChooser", idstart + "-color", {}); - SocialCalc.Popup.Initialize(idstart + "-color", { - attribs: { - title: " ", - width: "106px", - moveable: true, - changedcallback: SocialCalc.SettingsControls.PopupChangeCallback, - panelobj: panelobj, - }, - }); - }; - - // - // SocialCalc.SettingsControlOnchangeBorder = function(ele) - // - - SocialCalc.SettingsControlOnchangeBorder = function (ele) { - var idname, value, found, ele2; - var sc = SocialCalc.SettingsControls; - var panelobj = sc.CurrentPanel; - - var nameparts = ele.id.match(/(^.*\-)(\w+)\-(\w+)\-(\w+)$/); - if (!nameparts) return; - var prefix = nameparts[1]; - var ctrlname = nameparts[2]; - var ctrlsubid = nameparts[3]; - var ctrlidsuffix = nameparts[4]; - var ctrltype = panelobj[ctrlname].type; - - switch (ctrlidsuffix) { - case "bcb": // border checkbox - if (ele.checked) { - sc.Controls[ctrltype].SetValue(sc.CurrentPanel, ctrlname, { - def: false, - val: ele.value || "1px solid rgb(0,0,0)", - }); - } else { - sc.Controls[ctrltype].SetValue(sc.CurrentPanel, ctrlname, { - def: false, - val: "", - }); - } - break; - } - }; - - SocialCalc.SettingsControls.Controls.BorderSide = { - SetValue: SocialCalc.SettingsControls.BorderSideSetValue, - GetValue: SocialCalc.SettingsControls.BorderSideGetValue, - OnClick: SocialCalc.SettingsControls.ColorComboOnClick, - Initialize: SocialCalc.SettingsControls.BorderSideInitialize, - InitialData: { thickness: "1 pixel:1px", style: "Solid:solid" }, - ChangedCallback: null, - }; - - SocialCalc.SettingControlReset = function () { - var sc = SocialCalc.SettingsControls; - var ctrlname; - - for (ctrlname in sc.Controls) { - if (sc.Controls[ctrlname].OnReset) - sc.Controls[ctrlname].OnReset(ctrlname); - } - }; - - /********************** - * - * CtrlSEditor implementation for editing SocialCalc.OtherSaveParts - * - */ - - SocialCalc.OtherSaveParts = {}; // holds other parts to save - must be set when loaded if you want to keep - - SocialCalc.CtrlSEditor = function (whichpart) { - var strtoedit, partname; - if (whichpart.length > 0) { - strtoedit = SocialCalc.special_chars( - SocialCalc.OtherSaveParts[whichpart] || "" - ); - } else { - strtoedit = "Listing of Parts\n"; - for (partname in SocialCalc.OtherSaveParts) { - strtoedit += SocialCalc.special_chars( - "\nPart: " + - partname + - "\n=====\n" + - SocialCalc.OtherSaveParts[partname] + - "\n" - ); - } - } - var editbox = document.createElement("div"); - editbox.style.cssText = - "position:absolute;z-index:500;width:300px;height:300px;left:100px;top:200px;border:1px solid black;background-color:#EEE;text-align:center;"; - editbox.id = "socialcalc-editbox"; - editbox.innerHTML = - whichpart + - '



'; - document.body.appendChild(editbox); - - var ebta = document.getElementById("socialcalc-editbox-textarea"); - ebta.focus(); - SocialCalc.CmdGotFocus(ebta); - }; - - SocialCalc.CtrlSEditorDone = function (idprefix, whichpart) { - var edittextarea = document.getElementById(idprefix + "-textarea"); - var text = edittextarea.value; - if (whichpart.length > 0) { - if (text.length > 0) { - SocialCalc.OtherSaveParts[whichpart] = text; - } else { - delete SocialCalc.OtherSaveParts[whichpart]; - } - } - - var editbox = document.getElementById(idprefix); - SocialCalc.KeyboardFocus(); - editbox.parentNode.removeChild(editbox); - }; - - // - // Workbook is a collection of sheets that are worked upon together - // - // The WorkBook class models and manages the collection of sheets - // - // Author: Ramu Ramamurthy - // - // - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - - // Constructor: - - SocialCalc.WorkBook = function (spread) { - this.spreadsheet = spread; // this is the spreadsheet control - this.defaultsheetname = null; - this.sheetArr = {}; // misnomer, this is not really an array - this.clipsheet = {}; // for copy paste of sheets - }; - - // Methods - - SocialCalc.WorkBook.prototype.InitializeWorkBook = function (defaultsheet) { - return SocialCalc.InitializeWorkBook(this, defaultsheet); - }; - - SocialCalc.WorkBook.prototype.AddNewWorkBookSheetNoSwitch = function ( - sheetid, - sheetname, - savestr - ) { - return SocialCalc.AddNewWorkBookSheetNoSwitch( - this, - sheetid, - sheetname, - savestr - ); - }; - SocialCalc.WorkBook.prototype.AddNewWorkBookSheet = function ( - sheetname, - oldsheetname, - fromclip, - spread - ) { - return SocialCalc.AddNewWorkBookSheet( - this, - sheetname, - oldsheetname, - fromclip, - spread - ); - }; - SocialCalc.WorkBook.prototype.ActivateWorkBookSheet = function ( - sheetname, - oldsheetname - ) { - return SocialCalc.ActivateWorkBookSheet(this, sheetname, oldsheetname); - }; - SocialCalc.WorkBook.prototype.DeleteWorkBookSheet = function ( - sheetname, - cursheetname - ) { - return SocialCalc.DeleteWorkBookSheet(this, sheetname, cursheetname); - }; - SocialCalc.WorkBook.prototype.SaveWorkBookSheet = function (sheetid) { - return SocialCalc.SaveWorkBookSheet(this, sheetid); - }; - SocialCalc.WorkBook.prototype.LoadRenameWorkBookSheet = function ( - sheetid, - savestr, - newname - ) { - return SocialCalc.LoadRenameWorkBookSheet(this, sheetid, savestr, newname); - }; - SocialCalc.WorkBook.prototype.RenameWorkBookSheet = function ( - oldname, - newname, - sheetid - ) { - return SocialCalc.RenameWorkBookSheet(this, oldname, newname, sheetid); - }; - SocialCalc.WorkBook.prototype.CopyWorkBookSheet = function (sheetid) { - return SocialCalc.CopyWorkBookSheet(this, sheetid); - }; - SocialCalc.WorkBook.prototype.PasteWorkBookSheet = function (newid, oldid) { - return SocialCalc.PasteWorkBookSheet(this, newid, oldid); - }; - SocialCalc.WorkBook.prototype.RenderWorkBookSheet = function () { - return SocialCalc.RenderWorkBookSheet(this); - }; - - SocialCalc.WorkBook.prototype.SheetNameExistsInWorkBook = function (name) { - return SocialCalc.SheetNameExistsInWorkBook(this, name); - }; - - SocialCalc.WorkBook.prototype.WorkbookScheduleCommand = function ( - cmd, - isremote - ) { - return SocialCalc.WorkbookScheduleCommand(this, cmd, isremote); - }; - - SocialCalc.WorkBook.prototype.WorkbookScheduleSheetCommand = function ( - cmd, - isremote - ) { - return SocialCalc.WorkbookScheduleSheetCommand(this, cmd, isremote); - }; - - // schedule some command - could be for sheet or for the workbook itself - SocialCalc.WorkbookScheduleCommand = function WorkbookScheduleCommand( - workbook, - cmd, - isremote - ) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - if (cmd.cmdtype == "scmd") { - workbook.WorkbookScheduleSheetCommand(cmd, isremote); - } - }; - - SocialCalc.WorkbookScheduleSheetCommand = - function WorkbookScheduleSheetCommand(workbook, cmd, isremote) { - //console.log(cmd.cmdtype,cmd.id,cmd.cmdstr); - - // check if sheet exists first - if (workbook.sheetArr[cmd.id]) { - workbook.sheetArr[cmd.id].sheet.ScheduleSheetCommands( - cmd.cmdstr, - cmd.saveundo, - isremote - ); - } - }; - - SocialCalc.InitializeWorkBook = function InitializeWorkBook( - workbook, - defaultsheet - ) { - workbook.defaultsheetname = defaultsheet; - - var spreadsheet = workbook.spreadsheet; - var defaultsheetname = workbook.defaultsheetname; - - // Initialize the Spreadsheet Control and display it - - SocialCalc.Formula.SheetCache.sheets[defaultsheetname] = { - sheet: spreadsheet.sheet, - name: defaultsheetname, - }; - - spreadsheet.sheet.sheetid = defaultsheetname; - spreadsheet.sheet.sheetname = defaultsheetname; - - workbook.sheetArr[defaultsheetname] = {}; - workbook.sheetArr[defaultsheetname].sheet = spreadsheet.sheet; - workbook.sheetArr[defaultsheetname].context = spreadsheet.context; - - // if these were properties of the sheet, then we wouldnt need to do this ! - workbook.sheetArr[defaultsheetname].editorprop = {}; - workbook.sheetArr[defaultsheetname].editorprop.ecell = null; - workbook.sheetArr[defaultsheetname].editorprop.range = null; - workbook.sheetArr[defaultsheetname].editorprop.range2 = null; - - workbook.clipsheet.savestr = null; - workbook.clipsheet.copiedfrom = null; - workbook.clipsheet.editorprop = {}; - - spreadsheet.editor.workingvalues.currentsheet = spreadsheet.sheet.sheetname; - spreadsheet.editor.workingvalues.startsheet = - spreadsheet.editor.workingvalues.currentsheet; - spreadsheet.editor.workingvalues.currentsheetid = spreadsheet.sheet.sheetid; - }; - - SocialCalc.AddNewWorkBookSheetNoSwitch = function AddNewWorkBookSheetNoSwitch( - workbook, - sheetid, - sheetname, - savestr - ) { - //alert(sheetid+","+sheetname+","+savestr); - - var spreadsheet = workbook.spreadsheet; - - var newsheet = new SocialCalc.Sheet(); - - SocialCalc.Formula.SheetCache.sheets[sheetname] = { - sheet: newsheet, - name: sheetname, - }; - - newsheet.sheetid = sheetid; - newsheet.sheetname = sheetname; - - if (savestr) { - newsheet.ParseSheetSave(savestr); - } - - workbook.sheetArr[sheetid] = {}; - workbook.sheetArr[sheetid].sheet = newsheet; - workbook.sheetArr[sheetid].context = null; - - if (workbook.sheetArr[sheetid].sheet.attribs) { - workbook.sheetArr[sheetid].sheet.attribs.needsrecalc = "yes"; - } - - workbook.sheetArr[sheetid].editorprop = {}; - workbook.sheetArr[sheetid].editorprop.ecell = { - coord: "A1", - row: 1, - col: 1, - }; - workbook.sheetArr[sheetid].editorprop.range = null; - workbook.sheetArr[sheetid].editorprop.range2 = null; - }; - - SocialCalc.AddNewWorkBookSheet = function AddNewWorkBookSheet( - workbook, - sheetid, - oldsheetid, - fromclip, - spread - ) { - var spreadsheet = workbook.spreadsheet; - - //alert("create new sheet "+sheetid+" old="+oldsheetid+" def="+workbook.defaultsheetname); - - if (spread == null) { - spreadsheet.sheet = new SocialCalc.Sheet(); - SocialCalc.Formula.SheetCache.sheets[sheetid] = { - sheet: spreadsheet.sheet, - name: sheetid, - }; - spreadsheet.sheet.sheetid = sheetid; - spreadsheet.sheet.sheetname = sheetid; - } else { - //alert("existing spread") - spreadsheet.sheet = spread; - } - - spreadsheet.context = new SocialCalc.RenderContext(spreadsheet.sheet); - - spreadsheet.sheet.statuscallback = SocialCalc.EditorSheetStatusCallback; - spreadsheet.sheet.statuscallbackparams = spreadsheet.editor; - - workbook.sheetArr[sheetid] = {}; - workbook.sheetArr[sheetid].sheet = spreadsheet.sheet; - workbook.sheetArr[sheetid].context = spreadsheet.context; - - workbook.sheetArr[sheetid].editorprop = {}; - workbook.sheetArr[sheetid].editorprop.ecell = null; - workbook.sheetArr[sheetid].editorprop.range = null; - workbook.sheetArr[sheetid].editorprop.range2 = null; - - if (oldsheetid != null) { - workbook.sheetArr[oldsheetid].editorprop.ecell = spreadsheet.editor.ecell; - workbook.sheetArr[oldsheetid].editorprop.range = spreadsheet.editor.range; - workbook.sheetArr[oldsheetid].editorprop.range2 = - spreadsheet.editor.range2; - } - - spreadsheet.context.showGrid = true; - spreadsheet.context.showRCHeaders = true; - spreadsheet.editor.context = spreadsheet.context; - - if (!fromclip) { - spreadsheet.editor.ecell = { - coord: "A1", - row: 1, - col: 1, - }; - - spreadsheet.editor.range = { - hasrange: false, - }; - spreadsheet.editor.range2 = { - hasrange: false, - }; - } - - // set highlights - spreadsheet.context.highlights[spreadsheet.editor.ecell.coord] = "cursor"; - - if (fromclip) { - // this is the result of a paste sheet - //alert("from clip"); - - if (workbook.clipsheet.savestr != null) { - //alert("sheetdata = "+workbook.clipsheet.savestr); - spreadsheet.sheet.ParseSheetSave(workbook.clipsheet.savestr); - } - - spreadsheet.editor.ecell = workbook.clipsheet.editorprop.ecell; - spreadsheet.context.highlights[spreadsheet.editor.ecell.coord] = "cursor"; - - // range is not pasted ??!?? - } - - spreadsheet.editor.workingvalues.currentsheet = spreadsheet.sheet.sheetname; - spreadsheet.editor.workingvalues.startsheet = - spreadsheet.editor.workingvalues.currentsheet; - spreadsheet.editor.workingvalues.currentsheetid = spreadsheet.sheet.sheetid; - - spreadsheet.editor.FitToEditTable(); - spreadsheet.editor.ScheduleRender(); - //spreadsheet.ExecuteCommand('recalc', ''); - }; - - SocialCalc.ActivateWorkBookSheet = function ActivateWorkBookSheet( - workbook, - sheetnamestr, - oldsheetnamestr - ) { - var spreadsheet = workbook.spreadsheet; - - //alert("activate "+sheetnamestr+" old="+oldsheetnamestr); - - spreadsheet.sheet = workbook.sheetArr[sheetnamestr].sheet; - spreadsheet.context = workbook.sheetArr[sheetnamestr].context; - - if (spreadsheet.context == null) { - //alert("context null") - //for (var sheet in workbook.sheetArr) alert(sheet+spreadsheet.sheet ) - workbook.AddNewWorkBookSheet( - sheetnamestr, - oldsheetnamestr, - false, - spreadsheet.sheet - ); - return; - } - - spreadsheet.editor.context = spreadsheet.context; - - if (oldsheetnamestr != null) { - workbook.sheetArr[oldsheetnamestr].editorprop.ecell = - spreadsheet.editor.ecell; - } - spreadsheet.editor.ecell = workbook.sheetArr[sheetnamestr].editorprop.ecell; - - if (oldsheetnamestr != null) { - workbook.sheetArr[oldsheetnamestr].editorprop.range = - spreadsheet.editor.range; - } - spreadsheet.editor.range = workbook.sheetArr[sheetnamestr].editorprop.range; - - if (oldsheetnamestr != null) { - workbook.sheetArr[oldsheetnamestr].editorprop.range2 = - spreadsheet.editor.range2; - } - spreadsheet.editor.range2 = - workbook.sheetArr[sheetnamestr].editorprop.range2; - - spreadsheet.sheet.statuscallback = SocialCalc.EditorSheetStatusCallback; - spreadsheet.sheet.statuscallbackparams = spreadsheet.editor; - - // reset highlights ?? - - //spreadsheet.editor.FitToEditTable(); - - spreadsheet.editor.workingvalues.currentsheet = spreadsheet.sheet.sheetname; - spreadsheet.editor.workingvalues.currentsheetid = spreadsheet.sheet.sheetid; - - if (spreadsheet.editor.state != "start" && spreadsheet.editor.inputBox) - spreadsheet.editor.inputBox.element.focus(); - - if (spreadsheet.editor.state == "start") { - spreadsheet.editor.workingvalues.startsheet = - spreadsheet.editor.workingvalues.currentsheet; - } - - //spreadsheet.editor.ScheduleRender(); - - if (spreadsheet.editor.state != "start" && spreadsheet.editor.inputBox) { - spreadsheet.editor.ScheduleRender(); - } else { - if (spreadsheet.sheet.attribs) { - spreadsheet.sheet.attribs.needsrecalc = "yes"; - } else { - spreadsheet.sheet.attribs = {}; - spreadsheet.sheet.attribs.needsrecalc = "yes"; - } - - spreadsheet.ExecuteCommand("redisplay", ""); - } - }; - - SocialCalc.DeleteWorkBookSheet = function DeleteWorkBookSheet( - workbook, - oldname, - curname - ) { - //alert("delete "+oldname+","+curname); - - delete workbook.sheetArr[oldname].context; - delete workbook.sheetArr[oldname].sheet; - delete workbook.sheetArr[oldname]; - // take sheet out of the formula cache - delete SocialCalc.Formula.SheetCache.sheets[curname]; - }; - - SocialCalc.SaveWorkBookSheet = function CreateSaveWorkBook( - workbook, - sheetid - ) { - var sheetstr = {}; - sheetstr.savestr = workbook.sheetArr[sheetid].sheet.CreateSheetSave(); - return sheetstr; - }; - - SocialCalc.LoadRenameWorkBookSheet = function LoadRenameWorkBookSheet( - workbook, - sheetid, - savestr, - newname - ) { - workbook.sheetArr[sheetid].sheet.ResetSheet(); - workbook.sheetArr[sheetid].sheet.ParseSheetSave(savestr); - - if (workbook.sheetArr[sheetid].sheet.attribs) { - workbook.sheetArr[sheetid].sheet.attribs.needsrecalc = "yes"; - } - - delete SocialCalc.Formula.SheetCache.sheets[ - workbook.sheetArr[sheetid].sheet.sheetname - ]; - workbook.sheetArr[sheetid].sheet.sheetname = newname; - SocialCalc.Formula.SheetCache.sheets[newname] = { - sheet: workbook.sheetArr[sheetid].sheet, - name: newname, - }; - }; - - SocialCalc.RenderWorkBookSheet = function RenderWorkBookSheet(workbook) { - workbook.spreadsheet.editor.ScheduleRender(); - }; - - SocialCalc.RenameWorkBookSheetCell = function (formula, oldname, newname) { - var ttype, ttext, i, newcr; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - var parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - //alert(ttype+","+ttext); - //console.log (scf.NormalizeSheetName(ttext) + " " + oldname); - if ( - ttype == tokentype.name && - scf.NormalizeSheetName(ttext) == oldname && - i < parseinfo.length - ) { - if (parseinfo[i + 1].type == token_op && parseinfo[i + 1].text == "!") { - updatedformula += newname; //console.log (updatedformula); - } else { - updatedformula += ttext; //console.log (updatedformula); - } - } else { - updatedformula += ttext; - } - } - //alert(updatedformula); - return updatedformula; - }; - - SocialCalc.RenameWorkBookSheet = function RenameWorkBookSheet( - workbook, - oldname, - newname, - sheetid - ) { - // for each sheet, fix up all the formula references - // - //alert (sheetid); - var oldsheet = SocialCalc.Formula.SheetCache.sheets[oldname].sheet; - delete SocialCalc.Formula.SheetCache.sheets[oldname]; - //alert (newname); // to check the newname - SocialCalc.Formula.SheetCache.sheets[newname] = { - sheet: oldsheet, - name: newname, - }; - workbook.sheetArr[sheetid].sheet.sheetname = newname; - // - // fix up formulas for sheet rename - // if formulas should not be fixed up upon sheet rename, then comment out the following - // block - // - for (var sheet in workbook.sheetArr) { - //alert("found sheet-"+sheet) - for (var cr in workbook.sheetArr[sheet].sheet.cells) { - // update cell references to sheet name - //alert(cr); - var cell = workbook.sheetArr[sheet].sheet.cells[cr]; - //if (cell) alert(cell.datatype) - if (cell && cell.datatype == "f") { - cell.formula = SocialCalc.RenameWorkBookSheetCell( - cell.formula, - oldname, - newname - ); - if (cell.parseinfo) { - delete cell.parseinfo; - } - } - } - } - // recalculate - workbook.spreadsheet.ExecuteCommand("recalc", ""); - }; - - SocialCalc.CopyWorkBookSheet = function CopyWorkBookSheet(workbook, sheetid) { - //alert("in copy "+sheetid); - workbook.clipsheet.savestr = - workbook.sheetArr[sheetid].sheet.CreateSheetSave(); - //alert("in copy save="+workbook.clipsheet.savestr); - workbook.clipsheet.copiedfrom = sheetid; - workbook.clipsheet.editorprop = {}; - workbook.clipsheet.editorprop.ecell = workbook.spreadsheet.editor.ecell; - //workbook.clipsheet.editorprop.range = workbook.spreadsheet.editor.range; - //workbook.clipsheet.editorprop.range2 = workbook.spreadsheet.editor.range2; - //workbook.clipsheet.highlights = workbook.spreadsheet.context.highlights; - - //alert("copied "+sheetid); - }; - - SocialCalc.PasteWorkBookSheet = function PasteWorkBookSheet( - workbook, - newsheetid, - oldsheetid - ) { - //alert(newsheetid+oldsheetid); - workbook.AddNewWorkBookSheet(newsheetid, oldsheetid, true); - - // clear the clip ? - }; - - SocialCalc.SheetNameExistsInWorkBook = function SheetNameExistsInWorkBook( - workbook, - name - ) { - for (var sheet in workbook.sheetArr) { - if (workbook.sheetArr[sheet].sheet.sheetname == name) { - return sheet; - } - } - return null; - }; - - // - // Workbook Control controls workbook actions (add/del/rename etc) and can appear at the - // bottom of the screen (?). Right now its just a proof of concept - // and appears at the top of the screen - // - // Author: Ramu Ramamurthy - // - // - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - - SocialCalc.CurrentWorkbookControlObject = null; - - SocialCalc.TestWorkBookSaveStr = ""; - - // Constructor: - - SocialCalc.WorkBookControl = function (book, divid, defaultsheetname) { - this.workbook = book; - this.div = divid; - this.defaultsheetname = defaultsheetname; - this.sheetButtonArr = {}; - this.sheetCnt = 0; - this.numSheets = 0; - this.currentSheetButton = null; - this.renameDialogId = "sheetRenameDialog"; - this.deleteDialogId = "sheetDeleteDialog"; - this.hideDialogId = "sheetHideDialog"; - this.unhideDialogId = "sheetUnhideDialog"; - - this.sheetshtml = - ''; - - //this.buttonshtml = - //'
'+ - //'
'+ - //''+ - //''+ - //''+ - - // ''+ - // ''+ - // ''+ - - //''+ - //''+ - //'
'+ - //'
'; - - SocialCalc.CurrentWorkbookControlObject = this; - this.sheetbar = new SocialCalc.SheetBar(); - }; - - // methods - SocialCalc.WorkBookControl.prototype.GetCurrentWorkBookControl = function () { - return SocialCalc.GetCurrentWorkBookControl(); - }; - SocialCalc.WorkBookControl.prototype.InitializeWorkBookControl = function () { - return SocialCalc.InitializeWorkBookControl(this); - }; - - SocialCalc.WorkBookControl.prototype.ExecuteWorkBookControlCommand = - function (cmd, isremote) { - return SocialCalc.ExecuteWorkBookControlCommand(this, cmd, isremote); - }; - - SocialCalc.ExecuteWorkBookControlCommand = function (control, cmd, isremote) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - //if (!isremote) { - // return; - //} - - if (cmd.cmdtype == "scmd") { - // dispatch a sheet command - control.workbook.WorkbookScheduleCommand(cmd, isremote); - return; - } - - if (cmd.cmdtype != "wcmd") { - return; - } - - var parseobj = new SocialCalc.Parse(cmd.cmdstr); - - var cmd1 = parseobj.NextToken(); - - switch (cmd1) { - case "addsheet": - SocialCalc.WorkBookControlAddSheetRemote(null); - break; - - case "addsheetstr": - var sheetstr = cmd.sheetstr; - SocialCalc.WorkBookControlAddSheetRemote(sheetstr); - break; - - case "delsheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlDelSheetRemote(sheetid); - break; - - case "rensheet": - var sheetid = parseobj.NextToken(); - var oldname = parseobj.NextToken(); - var newname = parseobj.NextToken(); - SocialCalc.WorkBookControlRenameSheetRemote(sheetid, oldname, newname); - break; - - case "activatesheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlActivateSheet(sheetid); - break; - - case "hidesheet": - var sheetid = parseobj.NextToken(); - - break; - - case "unhidesheet": - var sheetid = parseobj.NextToken(); - - break; - } - }; - - SocialCalc.GetCurrentWorkBookControl = function () { - return SocialCalc.CurrentWorkbookControlObject; - }; - - SocialCalc.InitializeWorkBookControl = function (control) { - var element = document.createElement("div"); - element.innerHTML = control.sheetshtml; - var foo = document.getElementById(control.div); - foo.appendChild(element); - //var element2 = document.createElement("div"); - //element2.innerHTML = control.buttonshtml; - //foo.appendChild(element2); - SocialCalc.WorkBookControlAddSheet(false); // this is for the default sheet - }; - - SocialCalc.WorkBookControlDelSheetRemote = function (sheetid) { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (sheetid == control.currentSheetButton.id) { - // the active sheet is being deleted - SocialCalc.WorkBookControlDelSheet(); - return; - } - // some non active sheet is being deleted - var foo = document.getElementById("fooBar"); - var deletedbutton = document.getElementById(sheetid); - - var did = deletedbutton.id; - var dname = deletedbutton.value; - delete control.sheetButtonArr[did]; - - foo.removeChild(deletedbutton); - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + did); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - // delete the sheet - control.workbook.DeleteWorkBookSheet(did, dname); - control.numSheets = control.numSheets - 1; - }; - - // assumes that the current active sheet is being deleted - SocialCalc.WorkBookControlDelSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { - //disallow this - var str = - '
' + - "" + - " A workbook must contain at least one worksheet " + - "

"; - str += - "To delete the selected sheet, you must first insert a new sheet.
"; - str += - '
' + - '
'; - var main = document.createElement("div"); - main.id = control.deleteDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - " X 
' + - '
' + - str + - "
"; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - // do a popup to reaffirm the deletion of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.deleteDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
' + - "" + - "The selected sheet will be permanently deleted." + - "
"; - str += "
    "; - str += "
  • To delete the selected sheet, click OK.
  • "; - str += "
  • To cancel the deletion, click cancel.
  • "; - str += "
"; - str += - '
' + - ' ' + - '
'; - - var main = document.createElement("div"); - main.id = control.deleteDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - " X 
' + - '
' + - str + - "
"; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.WorkBookControlDeleteSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.deleteDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlDeleteSheetSubmit = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlDeleteSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + current.id); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.currentSheetButton = null; - // delete the sheets - control.workbook.DeleteWorkBookSheet(name, curname); - control.numSheets = control.numSheets - 1; - - var cmdstr = "delsheet " + name; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - control.currentSheetButton.setAttribute( - "style", - "background-color:lightgreen" - ); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - break; - } - } - if (control.currentSheetButton != null) { - control.workbook.ActivateWorkBookSheet( - control.currentSheetButton.id, - null - ); - } - }; - - // assumes that the current active sheet is being hidden - SocialCalc.WorkBookControlHideSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { - //disallow this - var str = - '
' + - "" + - " A workbook must contain at least one worksheet " + - "

"; - str += - "Before hiding the selected sheet, you must first insert a new sheet.
"; - str += - '
' + - '
'; - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - " X 
' + - '
' + - str + - "
"; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - // do a popup to reaffirm the hiding of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.hideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
' + - "" + - "The selected sheet will be hidden." + - "
"; - str += "
    "; - str += "
  • To hide the selected sheet, click OK.
  • "; - str += "
  • To cancel the hiding, click cancel.
  • "; - str += "
"; - str += - '
' + - ' ' + - '
'; - - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - " X 
' + - '
' + - str + - "
"; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.WorkBookControlHideSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.hideDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlHideSheetSubmit = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlHideSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + current.id); - // unregister with mouse ? etc - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, false); - sheetbarbutton.style.display = "none"; - control.currentSheetButton = null; - // delete the sheets - - control.numSheets = control.numSheets - 1; - - var cmdstr = "hidesheet " + name; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if ( - sheet != null && - document.getElementById("sbsb-" + sheet).style.display != "none" - ) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute( - "style", - "background-color:lightgreen" - ); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet( - control.currentSheetButton.id, - null - ); - } - }; - - // displays all hidden sheets, and then unhides whatever is selected - SocialCalc.WorkBookControlUnhideSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - - var unhiddencount = 0; - for (var sheet in control.sheetButtonArr) { - if (document.getElementById("sbsb-" + sheet).style.display == "none") { - unhiddencount++; - } - } - - if (unhiddencount == 0) { - //no hidden sheets, error message here - var str = - '
' + - "" + - " There are no hidden worksheets. " + - "

"; - str += - "Before unhiding any sheets, you must first hide a sheet.
"; - str += - '
' + - '
'; - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - " X 
' + - '
' + - str + - "
"; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - var element = document.getElementById(control.unhideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
' + - "" + - "The following sheets are hidden." + - '
    ' + - ''; - for (var sheet in control.sheetButtonArr) { - if (document.getElementById("sbsb-" + sheet).style.display == "none") { - str += - '' + - control.sheetButtonArr[sheet].value + - "
    "; - } - } - - str += "
\n
    "; - str += "
  • To unhide the selected sheet, click OK.
  • "; - str += "
  • To cancel the unhiding, click cancel.
  • "; - str += "
"; - str += - '
' + - ' ' + - '
'; - - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - " X 
' + - '
' + - str + - "
"; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.WorkBookControlUnhideSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.unhideDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlUnhideSheetSubmit = function (name) { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlUnhideSheetHide(); - var current = document.getElementById(control.currentSheetButton.id); - - var curid = current.id; - var curname = control.currentSheetButton.value; - - control.currentSheetButton.setAttribute("style", ""); - var old = control.currentSheetButton.id; - console.log(old); - SocialCalc.SheetBarButtonActivate(old, false); - - var sheetbarbutton = document.getElementById("sbsb-" + name); - // unhide the button - sheetbarbutton.style.display = "inline"; - control.currentSheetButton = null; - - control.numSheets = control.numSheets + 1; - - var cmdstr = "unhidesheet " + name; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if ( - sheet != null && - document.getElementById("sbsb-" + sheet).style.display != "none" - ) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute( - "style", - "background-color:lightgreen" - ); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet( - control.currentSheetButton.id, - null - ); - } - }; - - SocialCalc.WorkBookControlAddSheetButton = function (sheetname, sheetid) { - var control = SocialCalc.GetCurrentWorkBookControl(); - - //Create an input type dynamically. - var element = document.createElement("input"); - - var name = null; - - if (sheetid != null) { - name = sheetid; - } else { - name = "sheet" + (control.sheetCnt + 1).toString(); - control.sheetCnt = control.sheetCnt + 1; - } - - //Assign different attributes to the element. - element.setAttribute("type", "button"); - if (sheetname == null) { - element.setAttribute("value", name); - } else { - element.setAttribute("value", sheetname); - } - element.setAttribute("id", name); - element.setAttribute("name", name); - - var fnname = - "SocialCalc.WorkBookControlActivateSheet(" + "'" + name + "'" + ")"; - - element.setAttribute("onclick", fnname); - - control.sheetButtonArr[name] = element; - - var foo = document.getElementById("fooBar"); - - //Append the element in page (in span). - foo.appendChild(element); - - control.numSheets = control.numSheets + 1; - - var el = new SocialCalc.SheetBarSheetButton( - "sbsb-" + name, - sheetname ? sheetname : name, - document.getElementById("SocialCalc-sheetbar-buttons"), - { - //normalstyle: "border:1px solid #000;backgroundColor:#FFF;", - //downstyle: "border:1px solid #000;backgroundColor:#CCC;", - //hoverstyle: "border:1px solid #000;backgroundColor:#FFF;" - }, - { - MouseDown: function () { - SocialCalc.SheetBarSheetButtonPress(name); - }, - Repeat: function () {}, - Disabled: function () {}, - } - ); - - return element; - }; - - SocialCalc.WorkBookControlAddSheet = function (addworksheet, sheetname) { - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(sheetname); - - // then change the highlight - - var old = "sheet1"; - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style", ""); - old = control.currentSheetButton.id; - SocialCalc.SheetBarButtonActivate(old, false); - } - - element.setAttribute("style", "background-color:lightgreen"); - control.currentSheetButton = element; - var newsheetid = element.id; - SocialCalc.SheetBarButtonActivate(newsheetid, true); - - // create the sheet - if (addworksheet) { - control.workbook.AddNewWorkBookSheet(newsheetid, old, false); - // broadcast an add command here - var cmdstr = "addsheet"; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - } - }; - - SocialCalc.WorkBookControlAddSheetRemote = function (savestr) { - var control = SocialCalc.GetCurrentWorkBookControl(); - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(); - - // add the sheet, dont switch to it - control.workbook.AddNewWorkBookSheetNoSwitch( - element.id, - element.value, - savestr - ); - }; - - SocialCalc.WorkBookControlActivateSheet = function (name) { - //alert("in activate sheet="+name) - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById(name); - foo.setAttribute("style", "background-color:lightgreen;"); - SocialCalc.SheetBarButtonActivate(name, true); - - var old = control.currentSheetButton.id; - if (control.currentSheetButton.id != foo.id) { - control.currentSheetButton.setAttribute("style", ""); - SocialCalc.SheetBarButtonActivate(old, false); - } - - control.currentSheetButton = foo; - - control.workbook.ActivateWorkBookSheet(name, old); - }; - - SocialCalc.WorkBookControlHttpRequest = null; - - SocialCalc.WorkBookControlAlertContents = function () { - var loadedstr = ""; - var http_request = SocialCalc.WorkBookControlHttpRequest; - - if (http_request.readyState == 4) { - //addmsg("received:" + http_request.responseText.length + " chars"); - try { - if (http_request.status == 200) { - loadedstr = http_request.responseText || ""; - http_request = null; - } else { - } - } catch (e) {} - // do something with loaded str - //alert("loaded="+loadedstr); - SocialCalc.TestWorkBookSaveStr = loadedstr; - SocialCalc.Clipboard.clipboard = loadedstr; - } - }; - - SocialCalc.WorkBookControlAjaxCall = function (url, contents) { - var http_request = null; - - alert("in ajax"); - if (window.XMLHttpRequest) { - // Mozilla, Safari,... - http_request = new XMLHttpRequest(); - } else if (window.ActiveXObject) { - // IE - try { - http_request = new ActiveXObject("Msxml2.XMLHTTP"); - } catch (e) { - try { - http_request = new ActiveXObject("Microsoft.XMLHTTP"); - } catch (e) {} - } - } - if (!http_request) { - alert("Giving up :( Cannot create an XMLHTTP instance"); - return false; - } - - // Make the actual request - SocialCalc.WorkBookControlHttpRequest = http_request; - - http_request.onreadystatechange = SocialCalc.WorkBookControlAlertContents; - http_request.open("POST", document.URL, true); // async - http_request.setRequestHeader( - "Content-Type", - "application/x-www-form-urlencoded" - ); - http_request.send(contents); - - return true; - }; - - SocialCalc.WorkBookControlSaveSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetsave = {}; - - sheetsave.numsheets = control.numSheets; - sheetsave.currentid = control.currentSheetButton.id; - sheetsave.currentname = control.currentSheetButton.value; - - sheetsave.sheetArr = {}; - for (var sheet in control.sheetButtonArr) { - var sheetstr = control.workbook.SaveWorkBookSheet(sheet); - sheetsave.sheetArr[sheet] = {}; - sheetsave.sheetArr[sheet].sheetstr = sheetstr; - sheetsave.sheetArr[sheet].name = control.sheetButtonArr[sheet].value; - sheetsave.sheetArr[sheet].hidden = - document.getElementById("sbsb-" + sheet).style.display == "none" - ? "1" - : "0"; - } - - // Save the editable cells if specified - if (SocialCalc.EditableCells && SocialCalc.EditableCells.allow) { - sheetsave.EditableCells = {}; - for (var i in SocialCalc.EditableCells) { - sheetsave.EditableCells[i] = SocialCalc.EditableCells[i]; - } - } - - var d = new Date(); - sheetsave["timestamp"] = d.toString(); - - SocialCalc.TestWorkBookSaveStr = JSON.stringify(sheetsave); - //alert(SocialCalc.TestWorkBookSaveStr); - // send it to the backend - // SocialCalc.WorkBookControlAjaxCall("/", "&sheetdata="+encodeURIComponent(SocialCalc.TestWorkBookSaveStr)); - return SocialCalc.TestWorkBookSaveStr; - }; - - // insert another workbook into an existing workbook - // assumption is at least 1 sheet exists in existing workbook - // sheets with same names will be overwritten ! - SocialCalc.WorkBookControlInsertWorkbook = function (savestr) { - var sheetsave; - if (savestr) { - sheetsave = JSON.parse(savestr); - } - var control = SocialCalc.GetCurrentWorkBookControl(); - for (var sheet in sheetsave.sheetArr) { - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - // check if sheetname already exists - var sheetname = sheetsave.sheetArr[sheet].name; - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - if (sheetid) { - console.log(sheetname + "exists"); - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, sheetname); - } else { - //just test-brand new insert first - sheetid = "sheet" + (control.sheetCnt + 1).toString(); - control.sheetCnt = control.sheetCnt + 1; - SocialCalc.WorkBookControlAddSheetButton( - sheetsave.sheetArr[sheet].name, - sheetid - ); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch( - sheetid, - sheetsave.sheetArr[sheet].name, - savestr - ); - } - } - }; - - SocialCalc.WorkBookControlLoad = function (savestr) { - var sheetsave; - - if (savestr == "") return; - - if (savestr) { - sheetsave = JSON.parse(savestr); - } else { - sheetsave = JSON.parse(SocialCalc.TestWorkBookSaveStr); - } - //alert(sheetsave.currentid+","+sheetsave.currentname) - - // first create a new workbook - var control = SocialCalc.GetCurrentWorkBookControl(); - - SocialCalc.WorkBookControlCreateNewBook(); - - // at this point there is one sheet, and 1 button - // create the sequence of buttons, and sheets - var firstrun = true; - var newbuttons = 0; - var sheetid = null; - var currentsheetid = sheetsave.currentid; - //alert("button="+newbuttons) - for (var sheet in sheetsave.sheetArr) { - //alert(sheet); - if (newbuttons > sheetsave.numsheets) { - break; - } - //alert("button="+newbuttons) - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - if (firstrun) { - firstrun = false; - // set the first button's name correctly - sheetid = control.currentSheetButton.id; - control.currentSheetButton.value = sheetsave.sheetArr[sheet].name; - SocialCalc.SheetBarButtonSetName( - sheetid, - sheetsave.sheetArr[sheet].name - ); - // set the sheet data for the first sheet which already exists - control.workbook.LoadRenameWorkBookSheet( - sheetid, - savestr, - control.currentSheetButton.value - ); - // need to also set the formula cache - currentsheetid = sheetid; - } else { - sheetid = "sheet" + (control.sheetCnt + 1).toString(); - control.sheetCnt = control.sheetCnt + 1; - SocialCalc.WorkBookControlAddSheetButton( - sheetsave.sheetArr[sheet].name, - sheetid - ); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch( - sheetid, - sheetsave.sheetArr[sheet].name, - savestr - ); - } - if (sheetsave.sheetArr[sheet].hidden == "1") { - // unregister with mouse ? etc - var sheetbarbutton = document.getElementById("sbsb-" + sheetid); - sheetbarbutton.style.display = "none"; - SocialCalc.SheetBarButtonActivate(sheet, false); - newbuttons = newbuttons - 1; - } - if (sheet == sheetsave.currentid) { - currentsheetid = sheetid; - } - newbuttons = newbuttons + 1; - } - // Save the user script data - if (sheetsave.EditableCells) { - SocialCalc.EditableCells = {}; - for (var i in sheetsave.EditableCells) { - SocialCalc.EditableCells[i] = sheetsave.EditableCells[i]; - } - } - var timeoutFn = function () { - SocialCalc.WorkBookControlActivateSheet(currentsheetid); - }; - window.setTimeout(timeoutFn, 200); - }; - - SocialCalc.WorkBookControlRenameSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - // do a popup to get the new name of the sheet - // the popup has an input element with submit, and cancel buttons - var element = document.getElementById(control.renameDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
' + - '' + - "Rename-" + - currentsheet + - "
" + - '' + - "Please ensure that you DO NOT have ANY spaces in the sheet name." + - "" + - '
' + - "
"; - - str += - '
' + - ' ' + - '
'; - - var main = document.createElement("div"); - main.id = control.renameDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
' + - " " + - " X 
' + - '
' + - str + - "
"; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - - var ele = document.getElementById("newSheetName"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - }; - - SocialCalc.WorkBookControlRenameSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.renameDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlRenameSheetSubmit = function () { - // this handles all the rename action - var ele = document.getElementById("newSheetName"); - //console.log(ele.value); - var control = SocialCalc.GetCurrentWorkBookControl(); - if (ele.value.length == 0) { - ele.focus(); - return; - } - var oldname = control.currentSheetButton.value; - var newname = ele.value; - if (newname.indexOf(" ") != -1) { - alert( - "A space was found in the new name. Please ensure that the new name has no sapces" - ); - return; - } - SocialCalc.WorkBookControlRenameSheetHide(); - // verify newname does not clash with any existing sheet name - // if so reject - var smallname = newname.toLowerCase(); //converting to lower case to normalise - //console.log(smallname + " old " + ele.value); - for (var sheet in workbook.sheetArr) { - console.log(workbook.sheetArr[sheet].sheet.sheetname); //checking in sheetarr for repeated names - if (workbook.sheetArr[sheet].sheet.sheetname == smallname) { - alert(newname + " already exists"); - return; - } - } // variation of Case in letters of a sheet name will give an error if smallname is used. - - control.currentSheetButton.value = smallname; - - SocialCalc.SheetBarButtonSetName(control.currentSheetButton.id, newname); - - // perform a rename for formula references to this sheet in all the - // sheets in the workbook - control.workbook.RenameWorkBookSheet( - oldname, - smallname, - control.currentSheetButton.id - ); - - var cmdstr = - "rensheet " + - control.currentSheetButton.id + - " " + - oldname + - " " + - newname; - //console.log(cmdstr); - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - }; - - SocialCalc.WorkBookControlRenameSheetRemote = function ( - sheetid, - oldname, - newname - ) { - //console.log("rename sheet ",sheetid, oldname, newname) - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById("fooBar"); - var renbutton = document.getElementById(sheetid); - - renbutton.value = newname; - - SocialCalc.SheetBarButtonSetName(sheetid, newname); - - control.workbook.RenameWorkBookSheet(oldname, newname, sheetid); - }; - - SocialCalc.WorkBookControlCreateNewBook = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - // delete all the sheets except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - control.workbook.DeleteWorkBookSheet( - control.sheetButtonArr[sheet].id, - control.sheetButtonArr[sheet].value - ); - } - } - // Reset that 1 sheet - - control.workbook.LoadRenameWorkBookSheet( - control.currentSheetButton.id, - "", - control.workbook.defaultsheetname - ); - - // delete all the buttons except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.sheetButtonArr[sheet].id); - - var name = current.id; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + name); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.numSheets = control.numSheets - 1; - } - } - // rename that button - control.currentSheetButton.value = control.workbook.defaultsheetname; - //alert("done new workbook") - }; - - SocialCalc.WorkBookControlNewBook = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlCreateNewBook(); - control.workbook.RenderWorkBookSheet(); - }; - - SocialCalc.WorkBookControlMove = function (direction) { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - return; - } - var sheetArr = control.sheetButtonArr; - var newSheetArr = {}; - var sheetid = control.currentSheetButton.id; - - var curr_button = document.getElementById(sheetid); - var curr_sb_button = document.getElementById("sbsb-" + sheetid); - var sib_button = null; - var sib_sb_button = null; - if (direction == "left") { - sib_button = curr_button.previousSibling; - sib_sb_button = curr_sb_button.previousSibling; - if (!sib_sb_button) { - alert("Cannot move leftmost Sheet further to the left"); - return; - } - } else { - sib_button = curr_button.nextSibling; - sib_sb_button = curr_sb_button.nextSibling; - if (!sib_sb_button) { - alert("Cannot move rightmost Sheet further to the right"); - return; - } - } - var currid = sheetid; - var sibid = sib_button.id; - var parent = curr_button.parentNode; - var sb_parent = curr_sb_button.parentNode; - - var cloned = {}; - var clonedsb = {}; - for (button in sheetArr) { - clonedsb[button] = document.getElementById("sbsb-" + button); - cloned[button] = document.getElementById(button); - sb_parent.removeChild(document.getElementById("sbsb-" + button)); - parent.removeChild(document.getElementById(button)); - } - for (button in sheetArr) { - if (button != currid && button != sibid) { - newSheetArr[button] = sheetArr[button]; - sb_parent.appendChild(clonedsb[button]); - parent.appendChild(cloned[button]); - } else if (button == currid) { - if (direction == "left") { - newSheetArr[currid] = sheetArr[currid]; - newSheetArr[sibid] = sheetArr[sibid]; - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - } else { - newSheetArr[sibid] = sheetArr[sibid]; - newSheetArr[currid] = sheetArr[currid]; - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - } - } - } - control.sheetButtonArr = newSheetArr; - SocialCalc.SheetBarButtonActivate(currid, true); - }; - - SocialCalc.WorkBookControlMoveLeft = function () { - SocialCalc.WorkBookControlMove("left"); - }; - SocialCalc.WorkBookControlMoveRight = function () { - SocialCalc.WorkBookControlMove("right"); - }; - - SocialCalc.WorkBookControlCopySheet = function () { - //alert("in copy"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - control.workbook.CopyWorkBookSheet(control.currentSheetButton.id); - - alert("copied sheet:" + control.currentSheetButton.value); - }; - - SocialCalc.WorkBookControlPasteSheet = function () { - //alert("in paste"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - var oldid = control.currentSheetButton.id; - - SocialCalc.WorkBookControlAddSheet(false); - - var newid = control.currentSheetButton.id; - - //alert(newid+oldid); - - control.workbook.PasteWorkBookSheet(newid, oldid); - - var cmdstr = "addsheetstr"; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - sheetstr: control.workbook.clipsheet.savestr, - }); - }; - - SocialCalc.SheetBar = function () { - this.baseDiv = document.getElementById("SocialCalc-sheetbar"); - - this.prebuttonsDiv = document.createElement("div"); - this.prebuttonsDiv.style.cssText = "display:inline;"; - this.prebuttonsDiv.innerHTML = "        "; - this.prebuttonsDiv.id = "SocialCalc-sheetbar-prebuttons"; - - this.buttonsDiv = document.createElement("div"); - this.buttonsDiv.id = "SocialCalc-sheetbar-buttons"; - this.buttonsDiv.style.cssText = "display:inline;"; - - this.buttonActionsDiv = document.createElement("div"); - this.buttonActionsDiv.id = "SocialCalc-sheetbar-buttonactions"; - this.buttonActionsDiv.style.display = "inline"; - var addbutton = new SocialCalc.SheetBarSheetButton( - "sbsba-add", - "sbsba-add", - this.buttonActionsDiv, - {}, - { - MouseDown: function () { - var abc = SocialCalc.WorkBookControlAddSheet(true); - }, - }, - "add-2.png" - ); - - this.baseDiv.appendChild(this.prebuttonsDiv); - this.baseDiv.appendChild(this.buttonsDiv); - this.baseDiv.appendChild(this.buttonActionsDiv); - }; - - // define a new class for sheetbarsheetbutton - - SocialCalc.SheetBarSheetButton = function ( - id, - name, - parentdiv, - params, - functions, - img - ) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.name = name; - if (!img) { - this.ele.innerHTML = name; - this.ele.style.cssText = - "font-size:small;display:inline;padding:5px 5px 2px 5px;border:1px solid #000;"; - imgele = document.createElement("img"); - imgele.id = id + "-img"; - imgele.src = - SocialCalc.Constants.defaultImagePrefix + "menu-dropdown.png"; - imgele.style.cssText = - "padding:0px 2px;width:16px;height:16px;vertical-align:middle;"; - this.ele.appendChild(imgele); - SocialCalc.ButtonRegister(this.ele, params, functions); - SocialCalc.ButtonRegister(imgele, params, functions); - } else { - var imgele = document.createElement("img"); - imgele.src = SocialCalc.Constants.defaultImagePrefix + img; - imgele.style.cssText = "width:16px;height:16px;vertical-align:middle;"; - this.ele.appendChild(imgele); - this.ele.style.cssText = "display:inline;padding:5px 5px 2px 5px;"; - SocialCalc.ButtonRegister(imgele, params, functions); - } - parentdiv.appendChild(this.ele); - }; - - SocialCalc.SheetBarButtonActivate = function (id, active) { - var sbbutton = document.getElementById("sbsb-" + id); - sbbutton.isactive = active; - if (active) { - sbbutton.style.backgroundColor = "#FFF"; - var imgele = document.getElementById("sbsb-" + id + "-img"); - if (!imgele) { - imgele = document.createElement("img"); - imgele.id = "sbsb-" + id + "-img"; - imgele.src = - SocialCalc.Constants.defaultImagePrefix + "menu-dropdown.png"; - imgele.style.cssText = - "padding:0px 2px;width:16px;height:16px;vertical-align:middle;"; - } - sbbutton.appendChild(imgele); - SocialCalc.ButtonRegister( - imgele, - {}, - { - MouseDown: function () { - SocialCalc.SheetBarSheetButtonPress(id); - }, - Repeat: function () {}, - Disabled: function () {}, - } - ); - } else { - sbbutton.style.backgroundColor = "#CCC"; - var imgele = document.getElementById("sbsb-" + id + "-img"); - if (imgele) { - sbbutton.removeChild(imgele); - } - } - var menu = document.getElementById("sbsb-menu"); - if (menu && menu.style.display != "none") { - menu.style.display = "none"; - } - }; - - SocialCalc.SheetBarButtonSetName = function (id, name) { - var sbbutton = document.getElementById("sbsb-" + id); - sbbutton.name = name; - sbbutton.innerHTML = name; - if (sbbutton.isactive) { - SocialCalc.SheetBarButtonActivate(id, true); - } - }; - - SocialCalc.SheetBarSheetButtonPress = function (id) { - //console.log("button press") - var sbbutton = document.getElementById("sbsb-" + id); - if (sbbutton && sbbutton.isactive) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) { - var sbsbm = new SocialCalc.SheetBarSheetButtonMenu("sbsb-menu", id); - } else { - menu.clickedsheetid = id; - if (menu.style.display == "none") { - menu.style.display = "inline"; - SocialCalc.SheetBarSheetButtonMenuPosition(menu, id); - } else { - menu.style.display = "none"; - } - } - } else if (sbbutton) { - SocialCalc.WorkBookControlActivateSheet(id); - } - }; - - // define a new class for sheetbarsheet button menu item - - SocialCalc.SheetBarSheetButtonMenuItem = function (id, t) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.innerHTML = t; - this.ele.className = ""; - this.ele.style.cssText = - "padding:3px 4px;width:100px;height:20px;background-color:#FFF;"; - - var params = { - normalstyle: "backgroundColor:#FFF;", - downstyle: "backgroundColor:#CCC;", - hoverstyle: "backgroundColor:#CCC;", - }; - var functions = { - MouseDown: function () { - SocialCalc.SheetBarMenuItemPress(id); - }, - Repeat: function () {}, - Disabled: function () {}, - }; - - SocialCalc.ButtonRegister(this.ele, params, functions); - - SocialCalc.TouchRegister(this.ele, { SingleTap: functions.MouseDown }); - - return this.ele; - }; - - SocialCalc.SheetBarMenuItemPress = function (id) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) return; - - var clickedsheetid = menu.clickedsheetid; - - switch (id) { - case "sbsb_deletesheet": - //console.log("delete "+clickedsheetid); - SocialCalc.WorkBookControlDelSheet(); - break; - case "sbsb_hidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlHideSheet(); - break; - case "sbsb_unhidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlUnhideSheet(); - break; - case "sbsb_copysheet": - //console.log("copy "+clickedsheetid); - SocialCalc.WorkBookControlCopySheet(); - break; - case "sbsb_moveleft": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveLeft(); - break; - case "sbsb_moveright": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveRight(); - break; - - case "sbsb_pastesheet": - //console.log("paste "+clickedsheetid); - SocialCalc.WorkBookControlPasteSheet(); - break; - case "sbsb_renamesheet": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlRenameSheet(); - break; - case "sbsb_closemenu": - //console.log("rename "+clickedsheetid); - menu.style.display = "none"; - break; - default: - break; - } - menu.style.display = "none"; - }; - - // define a new class for sheetbarsheet button menu - SocialCalc.SheetBarSheetButtonMenu = function (id, clickedsheetid) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.className = ""; - this.ele.clickedsheetid = clickedsheetid; - this.ele.style.cssText = - "border:1px solid #000;position:absolute;top:200px;left:0px;width=100px;z-index:120"; - - var ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_deletesheet", - " Delete Sheet" - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_hidesheet", - " Hide Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_unhidesheet", - " Unhide Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_renamesheet", - " Rename Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_moveleft", - " Move Left " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_moveright", - " Move Right " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_copysheet", - " Copy Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_pastesheet", - " Paste Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_closemenu", - " Cancel" - ); - this.ele.appendChild(ele1); - - SocialCalc.SheetBarSheetButtonMenuPosition(this.ele, clickedsheetid); - - //var clickedsheet = document.getElementById(clickedsheetid); - //var position = SocialCalc.GetElementPosition(clickedsheet); - //console.log(clickedsheet.offsetHeight,clickedsheet.offsetWidth,clickedsheet.offsetLeft, clickedsheet.offsetTop); - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.editor.toplevel.appendChild(this.ele); - }; - - // position the sheet menu - SocialCalc.SheetBarSheetButtonMenuPosition = function (menu, clickedsheetid) { - var hlessbutton = document.getElementById("te_lessbuttonh"); - - //console.log(hlessbutton.style.top, hlessbutton.style.left); - - var sbbutton = document.getElementById("sbsb-" + clickedsheetid); - - //console.log(sbbutton.offsetLeft,clickedsheetid); - - var top = hlessbutton.style.top.slice(0, -2) - 220; - var left = sbbutton.offsetLeft + 7; - - menu.style.top = top + "px"; - menu.style.left = left + "px"; - - //console.log(menu.style.top, menu.style.left); - }; - - SocialCalc.ScriptInfo = { - scripts: {}, - handle: null, - }; - - SocialCalc.ScriptCheck = function (sheetid, coord, text) { - var commentstart = text.indexOf(""); - if (commentstart != -1 && commentend != -1) { - var script = text.slice(commentstart + 10, commentend); - //alert(script); - SocialCalc.ScriptInfo.scripts[coord] = script; - if (SocialCalc.ScriptInfo.handle == null) { - SocialCalc.ScriptInfo.handle = window.setTimeout( - SocialCalc.EvalUserScripts, - 500 - ); - } - //alert(coord+"-"+sheetid); - } - }; - - SocialCalc.EvalUserScript = function (data) { - var head = - document.getElementsByTagName("head")[0] || document.documentElement; - - if (data == "") return; - - var script = document.createElement("script"); - - script.type = "text/javascript"; - try { - // doesn't work on ie... - script.appendChild(document.createTextNode(data)); - } catch (e) { - // IE has funky script nodes - script.text = data; - } - - head.insertBefore(script, head.firstChild); - head.removeChild(script); - }; - - SocialCalc.EvalUserScripts = function () { - for (var cr in SocialCalc.ScriptInfo.scripts) { - SocialCalc.EvalUserScript(SocialCalc.ScriptInfo.scripts[cr]); - //console.log(cr,SocialCalc.ScriptInfo.scripts[cr]) - } - SocialCalc.ScriptInfo.handle = null; - SocialCalc.ScriptInfo.scripts = {}; - }; - - SocialCalc.CallOutOnRenderCell = function (sheetobj, value, cr) { - var cell = sheetobj.cells[cr]; - if (!cell) return; - var valuetype = cell.valuetype || ""; // get type of value to determine formatting - var valuesubtype = valuetype.substring(1); - var sheetattribs = sheetobj.attribs; - var valueformat; - valuetype = valuetype.charAt(0); - if (valuetype == "t") { - valueformat = - sheetobj.valueformats[cell.textvalueformat - 0] || - sheetobj.valueformats[sheetattribs.defaulttextvalueformat - 0] || - ""; - if (valueformat == "text-html") { - SocialCalc.ScriptCheck(sheetobj.sheetid, cr, value); - } - } - }; - - SocialCalc.GetCellDataValue = function (coord) { - var sheetname = null; - var sheetid = ""; - var bindex = coord.indexOf("!"); - if (bindex != -1) { - sheetname = coord.slice(0, bindex); - coord = coord.slice(bindex + 1); - //console.log(sheetname,coord) - } - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (sheetname == null) { - sheetid = control.currentSheetButton.id; - } else { - sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - } - - if (sheetid == null || sheetid == "") { - return "0"; - } - - var sheetobj = control.workbook.sheetArr[sheetid].sheet; - - var cell = sheetobj.cells[coord]; - - if (cell) { - return cell.datavalue; - } else { - return 0; - } - }; - - SocialCalc.GetCellDataArray = function (coordstr, sheetname) { - var vals = []; - var coords = coordstr.split(","); - if (sheetname == null) { - sheetname = ""; - } else { - sheetname = sheetname + "!"; - } - for (var c in coords) { - vals.push(SocialCalc.GetCellDataValue(sheetname + coords[c])); - } - return vals; - }; - - SocialCalc.UserScriptData = {}; - - SocialCalc.WorkBookRecalculateInfo = { - sheets: [], - calcorder: [], - current: 0, - pass: 0, - }; - - SocialCalc.WorkBookRecalculateAll = function () { - // do it from the last sheet to the first sheet - // using the recalc-done signal to trigger the next sheet - - // if already in the middle of a recalculate-all, ignore this. - if ( - SocialCalc.WorkBookRecalculateInfo.current != 0 || - SocialCalc.WorkBookRecalculateInfo.calcorder.length != 0 || - SocialCalc.WorkBookRecalculateInfo.sheets.length != 0 - ) { - return; - } - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - SocialCalc.WorkBookRecalculateInfo.current = 0; - - for (var sheet in control.workbook.sheetArr) { - SocialCalc.WorkBookRecalculateInfo.sheets.push(sheet); - } - - var i = 0; - for (var c = SocialCalc.WorkBookRecalculateInfo.sheets.length; c > 0; c--) { - SocialCalc.WorkBookRecalculateInfo.calcorder[i] = - SocialCalc.WorkBookRecalculateInfo.sheets[c - 1]; - i++; - } - window.setTimeout(SocialCalc.WorkBookRecalculateStep, 500); - }; - - SocialCalc.WorkBookRecalculateStep = function () { - if ( - SocialCalc.WorkBookRecalculateInfo.current == - SocialCalc.WorkBookRecalculateInfo.calcorder.length - ) { - SocialCalc.WorkBookRecalculateInfo.current = 0; - SocialCalc.WorkBookRecalculateInfo.calcorder = []; - SocialCalc.WorkBookRecalculateInfo.sheets = []; - if (SocialCalc.WorkBookRecalculateInfo.pass == 1) { - SocialCalc.WorkBookRecalculateInfo.pass = 0; - SocialCalc.SpinnerWaitHide(); - //alert("load done"); - return; - } else { - SocialCalc.WorkBookRecalculateInfo.pass++; - SocialCalc.WorkBookRecalculateAll(); - return; - } - } - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert("recalculate "+ - // SocialCalc.WorkBookRecalculateInfo.calcorder[ - // SocialCalc.WorkBookRecalculateInfo.current] - // ); - var sheetid = - SocialCalc.WorkBookRecalculateInfo.calcorder[ - SocialCalc.WorkBookRecalculateInfo.current - ]; - SocialCalc.WorkBookControlActivateSheet(sheetid); - SocialCalc.WorkBookRecalculateInfo.current++; - - window.setTimeout(SocialCalc.WorkBookRecalculateStep, 1000); - }; - - SocialCalc.SpinnerWaitCreate = function () { - // if the div exists already just use it - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - return; - } - var main = document.createElement("div"); - main.id = "waitloadingspinner"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - main.style.top = vp.height / 2 + "px"; - main.style.left = vp.width / 2 + "px"; - main.style.zIndex = 110; - - main.style.width = "50px"; - main.style.height = "50px"; - main.innerHTML = - 'Loading...'; - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.SpinnerWaitHide = function () { - // if the div exists already just use it - - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - ele.innerHTML = ""; - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - } - }; - - SocialCalc.EditableCells = {}; - SocialCalc.EditableCells.allow = false; - SocialCalc.EditableCells.cells = {}; - - SocialCalc.Callbacks.IsCoordEditable = function (sheetcoord) { - if (!SocialCalc.EditableCells.allow) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[sheetcoord]) { - // by default all cells are editable - return true; - } - - return false; - }; - - SocialCalc.Callbacks.IsCellEditable = function (editor) { - var cellname = editor.workingvalues.currentsheet + "!" + editor.ecell.coord; - if (!SocialCalc.EditableCells.allow) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[cellname]) { - // by default all cells are editable - return true; - } - - return false; - }; - - SocialCalc.IsScrollPossible = function ( - lastrow, - lastcol, - curr_vpos, - curr_hpos, - vamount, - hamount - ) { - //return false; - //console.log(lastrow+","+lastcol); - //console.log(curr_vpos+","+curr_hpos); - //console.log(vamount+","+hamount); - - if (curr_vpos + 10 + vamount > lastrow) { - return false; - } - if (curr_hpos + hamount > lastcol) { - return false; - } - return true; - }; - - // this is for checkmark toggling - SocialCalc.Callbacks.ToggleCell = function (cellname) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var sheetid = control.currentSheetButton.id; - var sheetobj = control.workbook.sheetArr[sheetid].sheet; - var cell = sheetobj.cells[cellname]; - var sheetname = sheetobj.sheetname; - - // check if cell is in constraints - //console.log(sheetname); - //console.log(cellname); - - var constraint = - SocialCalc.EditableCells.constraints[sheetname + "!" + cellname]; - if (!constraint || constraint[0] != "tc") { - return; - } - - var cellinner = document.getElementById("cell_" + cellname); - - if (cellinner.innerHTML.indexOf(" ") != -1) { - // set the value to the img value - cellinner.innerHTML = - '
'; - if (cell) { - //cell.displaystring = '
' ; - //cell.datavalue = '
' ; - //console.log("found cell") - cell.displaystring = - '
'; - cell.datavalue = - '
'; - //http://img689.imageshack.us/img689/9234/checkmark.png - } - } else { - // set the value to a space - cellinner.innerHTML = "
 
"; - if (cell) { - cell.datavalue = "
 
"; - cell.displaystring = "
 
"; - } - } - }; - - SocialCalc.WorkbookControlCreateSheetHTML = function (sheetlist) { - var context, div, ele; - - var result = ""; - - var control = SocialCalc.GetCurrentWorkBookControl(); - - div = document.createElement("div"); - - if (!sheetlist) { - context = new SocialCalc.RenderContext(spreadsheet.sheet); - ele = context.RenderSheet(null, { type: "html" }); - div.appendChild(ele); - context = undefined; - } else { - for (var sheetid in sheetlist) { - context = new SocialCalc.RenderContext( - control.workbook.sheetArr[sheetid].sheet - ); - ele = context.RenderSheet(null, { type: "html" }); - context = undefined; - div.appendChild(ele); - if (sheetid.substring(5) == control.sheetCnt) { - ele.style.pageBreakAfter = "auto"; - } else { - ele.style.pageBreakAfter = "always"; - } - } - } - - result = div.innerHTML; - ele = undefined; - div = undefined; - //console.log(result); - return result; - }; - - /* - http://www.JSON.org/json2.js - 2010-08-25 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date ? - 'Date(' + this[key] + ')' : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - - /*jslint evil: true, strict: false */ - - /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, - call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - // Create a JSON object only if one does not already exist. We create the - // methods in a closure to avoid creating global variables. - - if (!this.JSON) { - this.JSON = {}; - } - - (function () { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? "0" + n : n; - } - - if (typeof Date.prototype.toJSON !== "function") { - Date.prototype.toJSON = function (key) { - return isFinite(this.valueOf()) - ? this.getUTCFullYear() + - "-" + - f(this.getUTCMonth() + 1) + - "-" + - f(this.getUTCDate()) + - "T" + - f(this.getUTCHours()) + - ":" + - f(this.getUTCMinutes()) + - ":" + - f(this.getUTCSeconds()) + - "Z" - : null; - }; - - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = - function (key) { - return this.valueOf(); - }; - } - - var cx = - /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = - /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { - // table of character substitutions - "\b": "\\b", - "\t": "\\t", - "\n": "\\n", - "\f": "\\f", - "\r": "\\r", - '"': '\\"', - "\\": "\\\\", - }, - rep; - - function quote(string) { - // If the string contains no control characters, no quote characters, and no - // backslash characters, then we can safely slap some quotes around it. - // Otherwise we must also replace the offending characters with safe escape - // sequences. - - escapable.lastIndex = 0; - return escapable.test(string) - ? '"' + - string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === "string" - ? c - : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); - }) + - '"' - : '"' + string + '"'; - } - - function str(key, holder) { - // Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - - // If the value has a toJSON method, call it to obtain a replacement value. - - if ( - value && - typeof value === "object" && - typeof value.toJSON === "function" - ) { - value = value.toJSON(key); - } - - // If we were called with a replacer function, then call the replacer to - // obtain a replacement value. - - if (typeof rep === "function") { - value = rep.call(holder, key, value); - } - - // What happens next depends on the value's type. - - switch (typeof value) { - case "string": - return quote(value); - - case "number": - // JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : "null"; - - case "boolean": - case "null": - // If the value is a boolean or null, convert it to a string. Note: - // typeof null does not produce 'null'. The case is included here in - // the remote chance that this gets fixed someday. - - return String(value); - - // If the type is 'object', we might be dealing with an object or an array or - // null. - - case "object": - // Due to a specification blunder in ECMAScript, typeof null is 'object', - // so watch out for that case. - - if (!value) { - return "null"; - } - - // Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - - // Is the value an array? - - if (Object.prototype.toString.apply(value) === "[object Array]") { - // The value is an array. Stringify every element. Use null as a placeholder - // for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || "null"; - } - - // Join all of the elements together, separated with commas, and wrap them in - // brackets. - - v = - partial.length === 0 - ? "[]" - : gap - ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" - : "[" + partial.join(",") + "]"; - gap = mind; - return v; - } - - // If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === "object") { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === "string") { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ": " : ":") + v); - } - } - } - } else { - // Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ": " : ":") + v); - } - } - } - } - - // Join all of the member texts together, separated with commas, - // and wrap them in braces. - - v = - partial.length === 0 - ? "{}" - : gap - ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" - : "{" + partial.join(",") + "}"; - gap = mind; - return v; - } - } - - // If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== "function") { - JSON.stringify = function (value, replacer, space) { - // The stringify method takes a value and an optional replacer, and an optional - // space parameter, and returns a JSON text. The replacer can be a function - // that can replace values, or an array of strings that will select the keys. - // A default replacer method can be provided. Use of the space parameter can - // produce text that is more easily readable. - - var i; - gap = ""; - indent = ""; - - // If the space parameter is a number, make an indent string containing that - // many spaces. - - if (typeof space === "number") { - for (i = 0; i < space; i += 1) { - indent += " "; - } - - // If the space parameter is a string, it will be used as the indent string. - } else if (typeof space === "string") { - indent = space; - } - - // If there is a replacer, it must be a function or an array. - // Otherwise, throw an error. - - rep = replacer; - if ( - replacer && - typeof replacer !== "function" && - (typeof replacer !== "object" || typeof replacer.length !== "number") - ) { - throw new Error("JSON.stringify"); - } - - // Make a fake root object containing our value under the key of ''. - // Return the result of stringifying the value. - - return str("", { "": value }); - }; - } - - // If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== "function") { - JSON.parse = function (text, reviver) { - // The parse method takes a text and an optional reviver function, and returns - // a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - // The walk method is used to recursively walk the resulting structure so - // that modifications can be made. - - var k, - v, - value = holder[key]; - if (value && typeof value === "object") { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - // Parsing happens in four stages. In the first stage, we replace certain - // Unicode characters with escape sequences. JavaScript handles many characters - // incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - - // In the second stage, we run the text against regular expressions that look - // for non-JSON patterns. We are especially concerned with '()' and 'new' - // because they can cause invocation, and '=' because it can cause mutation. - // But just to be safe, we want to reject all unexpected forms. - - // We split the second stage into 4 regexp operations in order to work around - // crippling inefficiencies in IE's and Safari's regexp engines. First we - // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we - // replace all simple value tokens with ']' characters. Third, we delete all - // open brackets that follow a colon or comma or that begin the text. Finally, - // we look to see that the remaining characters are only whitespace or ']' or - // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if ( - /^[\],:{}\s]*$/.test( - text - .replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") - .replace( - /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - "]" - ) - .replace(/(?:^|:|,)(?:\s*\[)+/g, "") - ) - ) { - // In the third stage we use the eval function to compile the text into a - // JavaScript structure. The '{' operator is subject to a syntactic ambiguity - // in JavaScript: it can begin a block or an object literal. We wrap the text - // in parens to eliminate the ambiguity. - - j = eval("(" + text + ")"); - - // In the optional fourth stage, we recursively walk the new structure, passing - // each name/value pair to a reviver function for possible transformation. - - return typeof reviver === "function" ? walk({ "": j }, "") : j; - } - - // If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError("JSON.parse"); - }; - } - })(); - - SocialCalc.oldBtnActive = 1; - SocialCalc.Constants.defaultImagePrefix = "/socialcalc/images/sc_"; - SocialCalc.Constants.defaultGridCSS = ""; - SocialCalc.Constants.SCNoColNames = true; - SocialCalc.Constants.SCNoRowName = true; - SocialCalc.Constants.defaultRownameStyle = ""; - SocialCalc.Constants.defaultSelectedRownameStyle = ""; - SocialCalc.Popup.imagePrefix = "/socialcalc/images/sc_"; - - SocialCalc.ToggleInputLineButtons = function (show) { - var bele = document.getElementById("testtest"); - if (!bele) return; - if (show) { - bele.style.display = "inline"; - } else { - bele.style.display = "none"; - } - }; - - SocialCalc.InputLineClearText = function () { - spreadsheet.editor.inputBox.SetText(""); - }; - - SocialCalc.Callbacks.broadcast = function (type, data) {}; - - // END OF FILE - - if ("undefined" === typeof document) { - // We don't really need a DOM-based presentation layer on the server - SocialCalc.GetEditorCellElement = function () {}; - SocialCalc.ReplaceCell = function () {}; - SocialCalc.EditorRenderSheet = function () {}; - SocialCalc.SpreadsheetControlSortSave = function () { - return ""; - }; - SocialCalc.SpreadsheetControlStatuslineCallback = function () {}; - SocialCalc.DoPositionCalculations = function (editor) { - SocialCalc.EditorSheetStatusCallback(null, "doneposcalc", null, editor); - }; - } - - // Compatibility with webworker-threads - if (typeof self !== "undefined" && self.thread) { - window.setTimeout = function (cb, ms) { - if (ms <= 1) { - self.thread.nextTick(cb); - } - }; - window.clearTimeout = function () {}; - } - - // Just return a value to define the module export. - return SocialCalc; -}); diff --git a/DeveloperAdoption/public/importcollabload.html b/DeveloperAdoption/public/importcollabload.html deleted file mode 100644 index a2c57e8..0000000 --- a/DeveloperAdoption/public/importcollabload.html +++ /dev/null @@ -1,897 +0,0 @@ - - - - - -TestMultiSheet - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- - Logo - Qubit -    Editing{{ entry["fname"] }} -

- -
- - -
-
- -
-
Loading editor
-
-
- - - - - - - - - diff --git a/DeveloperAdoption/public/next.svg b/DeveloperAdoption/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/DeveloperAdoption/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/DeveloperAdoption/public/socialcalc/Changes.txt b/DeveloperAdoption/public/socialcalc/Changes.txt deleted file mode 100644 index 20c486a..0000000 --- a/DeveloperAdoption/public/socialcalc/Changes.txt +++ /dev/null @@ -1,685 +0,0 @@ -Changes - -2007-12-27: -Fixed missing 'nl' entry in typelookup plus entry. (=false+1 was failing) -Renamed scjstest to socialcalc-1.js. -Added load and save of sheetobj.names. -Added names to data sent by simpleedit to server. - -2008-01-02: -Added ExecuteSheetCommand with "set sheet" commands. -Added GetStyleNum. -Added Parse class. -Added UndoStack class. - -2008-01-03: -Added Undo/Redo and implemented it for set sheet commands. - -2008-01-04: -Started set cell commands. - -2008-01-07: -Split undo into PushChange, AddDo, and AddUndo. -Added CellFromStringParts and CellToString and "set coord all". -Added more set cell commands. -Added EditorApplySetCommandsToRange. - -2008-01-08: -Fixed bug with clicking on cell below stuff not rendered yet. - -2008-01-11: -Added more set commands - -2008-01-14: -Moved to SocialCalcJSv2 hierarchy for revision control -Changed programs to use new hierarchy, e.g., image/ and data/ - -2008-01-15,16,17,18: -Created formula1.js to parse and execute formulas. -Added start of RecalcSheet to socialcalc-2.js. - -2008-01-21: -Implemented function scaffolding. -Added range support to formulas. -Implemented series functions, including SUM, etc. -Fixed OLPC Fn key bug. - -2008-01-23: -SocialCalc2Demo command/slist control. -Better keyboard focus handling when document window loses focus (passThru). -Added Home key to MoveECellWithKey. -Added multi-line to ExecuteSheetCommand, Parse class. - -2008-01-24: -Built SocialCalc2Demo tabs: Plain, Source, Help, About - -2008-01-26: -Added IF(condition,true-value,false-value) function. -Added erase All/Contents/Formats command. -Added filldown and fillright commands and SocialCalc.OffsetFormulaCoords. -Released Sweet SocialCalc 0.1. - -2008-01-28: -Changed order of display on Show Source/doNewSheet for iPhone bug. -Added Math1 functions: ABS, ACOS, ASIN, ATAN, COS, DEGREES, EVEN, EXP, FACT, INT, - LN, LOG10, ODD, RADIANS, SIN, TAN -Added ZeroArgFunctions: FALSE(), NA(), NOW(), PI(), TODAY(), TRUE() -Added Math2Functions: ATAN2, MOD, POWER, TRUNC - -2008-01-30: -Removed uses of "for (i in arrayobj)" for Prototype, etc., compatibility - -2008-01-31: -Added clipboard to sheet, as well as to save/load sheet -Bumped save version to 1.4 -Added copy, cut, paste, loadclipboard, clearclipboard commands -Added clipboard to Sweet SocialCalc source tab, with undo - -2008-02-02: -Made clipboard global to SocialCalc object. -Updated simpleedit8.pl to have command list of socialcalc2demo1 - -2008-02-05: -Added merge and unmerge commands. -Added insertcol/row commands. - -2008-02-06: -Added deletecol/row commands. -Added special values to formula parsing, like #REF!. - -2008-02-07: -Added licensing information, breaking out socialcalctableeditor.js. -Released as version 0.6. - -2008-02-08: -Changed URLs to be specific for About details and Attribution. -Bumped to 0.6.1 - -2008-02-09: -Removed substr(-numbers), which are not handled correctly by IE, in formula1.js, formatnumber2.js. -Fixed a bug with "+coord" - changed "sheetdata" to "sheet". - -2008-02-10: -Made UI Sugar-like with more tabs, grayscale scrollbars. - -2008-02-11: -Added ConvertSaveToOtherFormat and ConvertOtherFormatToSave to give multiple clipboard views - -2008-02-13: -Added sort command. - -2008-02-14: -Add primitive graph command. - -2008-02-15: -Released 0.6.3. - -2008-02-18: -Fixed sort "constant" bug which left a numeric constant (vtc) treated as text, not a number -Added SocialCalc.TestCriteria. - -2008-02-19: -Added DAVERAGE, DCOUNT, DCOUNTA, DGET, DMAX, DMIN, DPRODUCT, DSTDEV, DSTDEVP, DSUM, DVAR, and DVARP. -Added HLOOKUP, VLOOKUP, MATCH, INDEX, COUNTIF, and SUMIF. - -2008-02-21: -Added the rest of the wikiCalc/SocialCalc 1.1 normal functions. - -2008-03-10: -Replaced cursor use of editor.ReplaceCell with editor.UpdateCellCSS for speedup. - -2008-03-12: -Made 702 maximum number of columns (ZZ) for number to characters. - -2008-03-14: -First implementation of socialcalcspeadsheetcontrol.js. - -2008-03-20: -Fixed up name support in formulas, including getting names defined by formulas working. - -2008-03-24: -Added SocialCalc.Formula.loadsheet for inter-sheet references. - -2008-03-25: -Added comment value to cells. -Finished other places that were waiting for names or sheet references. - -2008-03-27: -Added SaveEditorSettings and LoadEditorSettings. - -2008-04-01: -Added tabs and views lists to SpreadsheetControl. -Tried rudimentary "audit" tab. - -2008-04-03: -Finished audit tab and comment tab. - -2008-04-04: -Changed formula parsing to allow "." inside alpha and made "_" alpha. -Added name commands to socialcalc-3.js. -Started and Names tab. - -2008-04-05: -Finished Names tab. - -2008-04-07: -Added SpreadsheetControlCreateSpreadsheetSave and DecodeSpreadsheetSave, -along with multipart-mime save format. -Fixed SocialCalc.SizeSSDiv: this.requestedHeight/Width => spreadsheet.requested... - -2008-04-09: -Moved the Audit, Comment, and Names tab definition code into socialcalcspreadsheetcontrol.js. -Added linkstyle to RenderSheet, carried through RenderCell, passed to expand_markup. -Added text formats to list (plain, HTML, wiki, hidden), fixed bug with default text format. -Parameterized toolbarbackground and tabbackground. - -2008-04-10: -Fixed bug introduced with linkstyle in rendering with linkstyle!=null. -Changed names of determine_value_type and format_value_for_display to camel case: - DetermineValueType and FormatValueForDisplay. -Added Clipboard tab and view to facilitate interim moving of data from Excel and web. - -2008-04-13: -Fixed requestedHeight/Width not working in SpreadsheetControl. - -2008-04-14: -Changed rowneedsrefresh in scroll up/down one row to be object instead of array for Prototype compatibility. -Added SocialCalc.SpreadsheetControlCreateCellHTML and SocialCalc.SpreadsheetControlCreateCellHTMLSave. - -2008-04-16: -Fixed SocialCalc.Formula.OperandAsSheetName not handling coords and names to get sheet name. - -2008-04-17: -Keyboard handing: Fixed initial "[" being ignored, backspace passing through to browser at top level (now treated as delete). -Fixed sheetname!range_name not working and numerous other sheetname! bugs. -Fixed handling of space after coord in formula. -If SocialCalc.Formula.SheetCache.loadsheet returns null, an error is displayed in addition to #REF!. - -2008-04-18: -Added dorecalc argument to SocialCalc.ConvertSaveToOtherFormat. - -2008-04-21: -Added editor.SettingsCallbacks. -Added named ranges to Sort. - -2008-04-23: -Added SocialCalc.defaultvalues.minimumcolwidth. -Added column drag resizing. -Fixed bug with dragging cursor out of grid losing capture on Firefox and Safari. - -2008-04-24: -Made drag resize display work in Opera. -Removed dependency on body setting for font-size:small. -Added more button bar buttons: Reverse, Wiki Text, Align, etc. -Added spreadsheet control ExportCallback. - -2008-04-25: -Fixed thumbstatus font size. -More drag resize for Opera and Firefox 3. - -2008-04-26: -Fixed merge button bug. -Added check to guard against drag resizing non-visible columns. - -2008-04-30: -Created SocialCalc.Constants. -Fixed bug where circularreferencecell wasn't reset on new recalc. - -2008-05-01: -Fixed bug where merged cells' grid hid borders to right and below. -Fixed horizontal control position off when not Verdana bug. - -2008-05-02: -Added more SocialCalc.Constants. -Added optional IDs on table control elements. -Fixed double-click outside grid bug. - -2008-05-04: -Added optional styles for table control elements. -Moved table control repeat settings to constants. -Made thumbstatus settings skinnable with constants. - -2008-05-05: -More constants: The rest of socialcalctableeditor.js, formatnumber2.js, and some of formula1.js. - -2008-05-06: -More constants: The rest of formula1.js and HighlightTypes for cursor and range. -Fixed recent bug with unable to click inside of input box. -Fixed -1 1/2 => -0.5 bug. - -2008-05-09: -Mostly finished InputBox/InputEcho stuff. -Fixed SocialCalc.intFunc bug which led to 2/3/08 (all Feb) being wrong. - -2008-05-11: -Fixes some "event" references that should have been "e" in socialcalctableeditor.js. -Made InputEcho draggable. -Added SocialCalc.ResizeTableEditor. - -2008-05-12: -Finish up InputBox stuff, handling no change, clicking during partialexpr, etc. -Added editor.DisplayCellContents() to be used to keep formula bar up to date -Fixed some bugs with reporting errors in formulas detected during parsing - -2008-05-13: -Fixed a focus outside the table editor bug with the input box. -Added ID to inputEcho. - -2008-05-20: -Continued work on SettingsControls objects, including adding the ColorDropdown and CustomDropdown. -Fixed some bugs with sizing of the non-main views. - -2008-05-21,22: -Completed Settings view display of existing settings. -Started GetValues and DecodeSheetSettings - -2008-05-26: -Implemented BorderSides settings control -Connected DecodeCellSettings, etc., so Settings view works -Layouts now handle * in any value position (PrecomputeSheetFonts renamed to PrecomputeSheetFontsAndLayouts) - -2008-05-28: -Added SocialCalc.EditorMouseInfo.ignore to turn off mousedown and dblclick detection temporarily. -Added defaultCommentClass, defaultCommentStyle, defaultCommentNoGridClass, and defaultCommentNoGridStyle - to Constants for SocialCalc.RenderCell and context.commentClassName, - context.commentClassCSS, etc., to RenderContext. -Created SocialCalc.ConstantsDefaultClasses and socialcalc.css. - -2008-06-02: -Added buttons to socialcalcspreadsheetcontrol.js. -Reworked the default toolbars to use buttons with icon images added to images file. -Made Clipboard tab have multiple formats again. -Updated the Help tab text. - -2008-06-04: -Fixed problem with * in font in EncodeCellAttributes - -2008-06-07: -Made InputBox Firefox up/down arrow handling work in more cases, adding inputBox.skipOne -Fixed H/VLOOKUP functions ignoring the rangelookup value - -2008-07-07: -Fixed blowup bug with "1 1/3" in SocialCalc.DetermineValueType - -2008-07-08: -EditorRenderSheet now adds "fullgrid" as an element id. It's the element that gets sheet mouse clicks. - -2008-07-09: -Fixed missing "1,234.5" format. - -2008-07-17: -Added statusline callbacks. -Added more comments about SocialCalc.Cell. -Changed SocialCalc.CellFromStringParts to convert strings to numbers in vt, vtf, and vtc. -Fixed bug where vertical-align wasn't being enforced in SocialCalc.SetECellHeaders. -Redid keyboard handlers to follow http://unixpapa.com/js/key.html more, - fixing bugs with Safari 3.1 and Opera 9.5. -Changed SocialCalc.InputBoxOnClick to SocialCalc.InputBoxOnMouseDown (bug 796). - -2008-07-18: -SocialCalc.DetermineValue now handles multiple commas (had missing "g" attribute) (bug 805). - -2008-07-29: -SocialCalc.Formula.SheetCache upgraded to handle loading, status values, and recalc flags. -New recalc code: - Fixed: Remember to have UI check for circ references and display status - Fixed: =Self should be circ - Fixed: if calced value/type is the same, don't delete display value - -2008-09-09: -Fixed formatnumber2.js ampmstr using non-existant constants - -2008-09-10: -Moved CalculateColWidthData call into RenderSheet -Fixed bug with last two rows in pane not getting height calculations updated correctly in - CalculateEditorPositions -Removed SheetRenders before recalc - -2008-09-11: -Fixed bug with pane slider into scrolled row/col too far: now it unscrolls second pane - (but must wait for position recalc, unfortunately) - -2008-09-12: -Fixed bug that kept pan slider tracking lines from showing - -2008-09-18: -EditorSaveEdit now does encodeForSave of text. -Added sheet.renderneeded and sheet.celldisplayneeded -Added SocialCalc.ScheduleSheetCommands and started using it instead of ExecuteCommands directly - -2008-09-19: -ScheduleSheetCommands now starts a time-sliced loop to execute commands - -2008-09-20: -2008-09-21: -2008-09-22: -2008-09-23: -Made commands, recalc, and display all be timer driven -Added deferred command execution -Added edit.busy -Made most of UI observe the busy flag, including Button and Drag additions - -2008-11-06: -Added calcorder as a timesliced part of recalc. - -2008-11-07: -Added recalc to coded and decoded sheet attributes. -Sheet recalc attribute is now followed, as well as new sheet.recalconce. - -2008-11-10: -SpreadsheetControl now has a default status line. -Added recalc button to toolbar. - -2008-11-11: -Recalc is now followed in mult-sheet recalc. - -2008-11-14: -Tab switching is ignored away from sheet when editor.busy. -Initial spreadsheet.currentTab is now 0 after initialization. -Recalc button in toolbar is only displayed if recalc needed - -2008-11-15: -Made spreadsheet.DoOnResize. -Fixed bug with ResizeTableEditor changing griddiv but not toplevel. - -2008-11-16: -Made SocialCalc.ResetSheet only reset data stuff so Reload works in new event-driven world. - -2008-11-19: -Sort range is now saved and loaded. - -2008-11-24: -Added sheet.changedrendervalues to fix bugs with changed fonts, etc. -Added color chooser to settings tab -Made scroll wheel follow editor.busy - -2008-11-26: -Updated simpleedit14.pl -Fixed some IE bugs with SocialCalc.SpreadsheetControlDecodeSpreadsheetSave with ^$ - -2008-11-29: -Fixed row hide setting load bug (typo). - -2008-12-01: -Made simpleedit14.pl do server-side wikitext expansion differently than client-side. -Fixed bug with formula bar not being updated after commands (and at load). -Fixed bug with commands being executed during cell edit. - -2008-12-04: -Made General format round to a maximum precision to lessen floating point artifacts. - -2008-12-09: -Added editor.ctrlkeyFunction, including Ctrl-V handling. -Added embedded newline support to csv and tab format conversion. - -2008-12-10: -Fixed bugs in simpleedit14.pl with loading unavailable sheets - -2008-12-11: -Added undo maximum of 100. - -2008-12-26: -Fixed SocialCalc.setStyles to allow colons in style values. (kratib reported) -Finally fixed FF 2 Mac losing Ctrl-V. -Changed grid line and pane divider color to something darker to better work on some laptops. -Fixed some bugs with sort settings not being preserved when updating column chooser info or loading - -2008-12-28: -Fixed some bugs with displaying zero values related to infinity and NaN. - -2009-01-14: -Fixed bug with reloading sheet with font settings. - -2009-01-15: -First implementation of movepaste/moveinsert done. -Added swapcolors button to socialcalcspreadsheetcontrol.js. - -2009-02-02: -Changed to SocialCalc.Callbacks.expand_wiki which takes subtypes. -Implemented demo samples of text-wiki-pagelink. - -2009-02-05: -Added SocialCalc.Formula.RemoteFunctionInfo.waitingForServer to help handling RPC. -Fixed recalc off not recalculating positions in case cell got different size. - -2009-02-20: -Created socialcalcpopup.js and changed socialcalcspreadsheetcontrol.js to use it. - -2009-02-24: -Continued fixing bugs in socialcalcpopup.js and adding features. - -2009-02-25: -Moved spreadsheetcontrol button and tab styles to SocialCalc.Constants to make skinning easier. - -2009-03-10: -Made socialcalc2demo10. -Made socialcalcserver.pl use all filenames and have settings file. - -2009-03-19: -Added function arg_def, func_def, and func_class to formula1.js and socialcalcconstants.js. -Added definitions to all functions. -Added function information routines FillFunctionInfo and FunctionArgString. -Added prompt to InputEcho to show function argument prompts. -Added function list dialog to ssctrltest1.html. -Added SocialCalc.EditorAddToInput for pasting function starts, etc. - -2009-03-23: -Added formula bar buttons to socialcalcspreadsheetcontrol.js. -Moved function list as a formula bar button in socialcalcspreadsheetcontrol.js. -Added Multi-line input box dialog and support. - -2009-03-24: -Tuned multi-line input to handle disabling inputbox when editing and when multi-line cell content. -Added SocialCalc.Formula.FreshnessInfo to help determine if calculations are out of date. - -2009-04-01: -Fixed bug with maxUndo that messed up audit. Now have maxRedo, too. - -2009-04-15: -Added value type "tl" -- text link -Upgraded text-link format handing, and added SocialCalc.ParseCellLinkText and .expand_text_link. -Made better handling of linktype (socialcalcspreadsheetcontrol.js) and $options (SocialCalcServersideUtilities.pm) - -2009-04-16: -More work on text-link and added to SocialCalcServersideUtilities.pm. - -2009-04-29: -Made linkstyle an object, added context.defaultlinkstyle and context.defaultHTMLlinkstyle. -HTML rendering stuff like SpreadsheetControlCreateCellHTML take optional linkstyle or use defaultHTMLlinkstyle. -Linking now has [pagename] and {worksheet [pagename]}/ -Added SocialCalc.Callback.MakePageLink. - -2009-04-30: -Added Link dialog. - -2009-05-01: -Added set format and popup options to Link dialog. -Upgraded SocialCalcServersideUtilities.pm to handle pagenames and workspaces. - -2009-05-07: -Added SocialCalc.GetElementPositionWithScroll to socialcalc-3.js to fix Popup bug when settings pane scrolled. -Added sheet.recalcchangedavalue so you can tell if a recalc changed anything. - -2009-05-11: -Changed tableeditor, socialcalc-3.js, and spreadsheetcontrol to use SocialCalc.Constants.defaultImagePrefix for images. It should have the "sc-" in it. -SocialCalc.Popup.imagePrefix needs its own version of the same thing. - -2009-05-15: -Split SocialCalcServersideUtilities.pm into 2 parts, adding SocialCalcServersideNumberFormatting.pm. -Upgraded socialcalcserver.pl to handle new image prefixes. -Added /* */ to SocialCalc js files so the minimizer won't strip out the licensing notices. - -2009-05-16: -Added ctrl-c handling, and got ctrl-c/ctrl-v working on FF 2/3/mac, Safari/Chrome, IE 6/7, Opera. -Added ctrl-z to do undo. -Fixed maxUndo/maxRedo to have maxRedo be the max size of stack and maxUndo is max undoable, and various undo bugs. -Fixed bugs with queuing up commands. -Set default maxUndo to 50. -Fixed bug that made some typeahead be lost. -Changed statusline total to use formatNumberWithFormat with [,]General format to clean up rounding, and add commas. - -2009-05-17: -Changed Ctrl-V to do just a Paste Formulas, not Paste All. - -2009-05-18: -Added Ctrl-X to be like Ctrl-C with Cut formulas instead of copy, made Ctrl-C use EditorScheduleSheetCommands. - -2009-05-19: -Hide ssctrl1.html extra buttons, added sample minimal Sum and Sum2 Button code. -Updated EditorAddToInput to erase any pointing partial expressions. - -2009-05-21: -Changed ctrl-v to paste in upper left if has range. - -2009-05-22: -Changed dragging vertical thumb to display part of each proposed new top row. New constants, etc. - -2009-05-28: -Wrote CreateCSV routine in Perl in socialcalcserverX.pl. - -2009-05-31: -Moved sum button into socialcalcspreadsheetcontrol.js as additional formula bar button. - -2009-06-01: -Made OLPC version's graphing more modular, and save. -Fixed bug in sort settings save. -Added SocialCalc.Callbacks.NormalizeSheetName to socialcalc-3.js and formula1.js. -Moved CreateCSV into SocialCalcServersideUtilities.pm. - -2009-06-09: -Fixed Safari bug with detecting partial formulas for prompt. -Fixed bugs with conditionals in formats. Issues converting from Perl... -Merged SocialCalcServersideFormatting.pm back into ServersideUtilities.pm. -Fixed bug in js and Perl with missing "=" comparison in conditional custom formats. -Added temporary Ctrl-S for setting custom numeric formats. - -2009-06-11: -Added "cmd:" prefix option to Ctrl-S for manually issuing commands. -Fixed bug in VLOOKUP argument prompt. - -2009-06-14: -Fixed bug with SocialCalc.Formula.OperandAsSheetName not working with absolute references. -Fixed bug with Popup custom not escaping current value. - -2009-06-16: -Fixed bug in SocialCalc.RecalcCheckCell where sheetref wasn't reset if range item ended in sheetref. - -2009-06-21: -Fixed: Audit tab doesn't escape <>, etc. - -2009-06-28: -Fixed bug with text-custom not working (conversion from Perl...) - -2009-07-15: -Fixed INDEX function not handling references on another sheet. - -2009-07-21: -Fixed redo of name delete setting value to description. - -2009-08-17: -Moved "moveecell" status call up above editor.EnsureECellVisible to not overwrite "Displaying..." message on Home, etc. -Fixed bug with Link dialog pasting page references adding extra "]". -Added SocialCalc.Popup.LocalizeString that needs to be overridden in socialcalcpopup. - -2009-08-19: -Fixed bug with socialcalcpopup.js Color Chooser when you clicked on last pixels of grid. -Added SocialCalc.LocalizeString and SocialCalc.LocalizeSubstrings to socialcalcspreadsheetcontrol.js. -Made use of LocalizeString and LocalizeSubstrings in socialcalcspreadsheetcontrol.js, ssctrltest1.html, OLPC code, etc. -This should finish the main localization enablement of SocialCalc in JavaScript. - -2009-08-27: -Removed extra " in SocialCalcServersideUtilities.pm that was messing up spans, etc. - -2009-09-03: -Put in SocialCalc.CanonicalizeSheet to do a pass before save to minimize sheet extents, remove unused items from -saved lists and alphabetize them. The saved data is upwards and downwards compatible. -Added SocialCalc.Constants.doCanonicalizeSheet to turn this off. - -2009-09-09: -Added sampleWidth, sampleHeight, backgroundImage, backgroundImageDefault, and backgroundImageDisabled to color chooser attribs. - -2009-09-23: -Added ensureWithin to socialcalcpopup.js. -Changed cursor position detection a bit in color chooser. -Made border color chooser moveable. -Fixed "-", ".", "e1" and other things being considered a number on input. - -2009-10-21: -Added text subtype "tr" (text rich) to formula1.js TypeLookupTable and to socialcalc3.js format_text_for_display - -2009-11-02: -Minor change to SocialCalc.special_chars to clean up regex. Not a bug, but a minor performance thing. - -2009-11-03: -Added text format Wikitext to SCFormatTextFormats in socialcalcconstants.js - -2009-12-02: -Added missing // to socialcalcspreadsheetcontrol.js setting of tabBackground. -Set minOK to 0 just in case in formatnumber2.js. - -2010-01-14: -Changed socialcalctableeditor.js to do auto-repeat in drag select. -Made formula editing reset position of InputEcho after pointing in case cell position has changed. -Added beginning of SocialCalc.CellHandles to socialcalctableeditor.js. Had test code, but now just returns. - -2010-02-09: -Fixed bug where undo stack didn't always set changedrendervalues so moves/pastes/etc of merged cells messed up display - -2010-03-23: -Finished changes to add editor.noEdit to socialcalctableeditor.js, including -fixing thumb dragging to better handle mouse out of window, handling no socialcalcspreadsheetcontrol.js, -etc. - -2010-03-25: -Added socialcalcviewer.js. -Fixed bug in SocialCalc.InitializeSpreadsheetControl that didn't take padding into account when sizing status line. - -2010-04-13: -Added CmdExtensions to socialcalc-3.js, and the startcmdextension command. - -2010-05-07: -Implemented drag handles for fill/move using a single image with a round, segmented palette. Added sc-drag-handles.png. - -2010-05-12: -Added SocialCalc.CtrlSEditor to socialcalctableeditor.js and socialcalcspreadsheetcontrol.js. -Use "edit:partname" command to edit, "edit:" to list all parts and contents. No text deletes part. -Added SocialCalc.OtherSaveParts to socialcalcspreadsheetcontrol.js. -This all gives us a way to set startup macros, etc. - -2010-05-13: -Fixed IE6 and IE7+ compatibility issues with drag palette. Uses .gif for IE6, .png otherwise. - -2010-07-05: -Upgraded to Tracy's drag palette images, including making radii setable constants. -Made click without drag on drag palette not do any commands. -Put in a fix for Safari 5 problem with copy/paste (involving onbeforepaste default behavior). - - -TO DO: - -Check out <= and >= Test Criteria! - -Make defaultCommentStyle work with defaultImagePrefix. - -Handle bad settings -Make sure insert/delete row/col and move handle name coord changing undo, especially wrt #REF!. -Need some way to abort recalc -- like pressing Esc? - - -Limit undo size? -1 row scroll of high cells doesn't update row height values or something - - scroll in Merges and Scrolling when 2 panes -- may be dragging when scrolled - doesn't know trying to set too far: check test -Bug in SocialCalc.pm: adjust_formula_coords refs to deleted cells -- doesn't handle multiple -Bug in Sheet.pm: test_criteria tests "value" instead of "type" for left error -Check SheetFunctions.pm: Dseries with criteria of "0" -- checks for blank as !criteria, not length - Also, see double testcol setting. -INDEX function (and range return from evaluate polish) does not handle other sheets. - Make DecodeRangeParts get that stuff to make it easy? -Bug in SheetFunctions.pm: StringFunctions error doesn't return right away - RIGHT has -1 args? - InterestFunctions: should be -3 args? - IRR check for values? -Bug in Sheet.pm: evaluate_parsed_formula return of range doesn't swap sheetname!coord -Sheet.ResetSheet doesn't seem to work well -- it does not recalc or redisplay well afterward - diff --git a/DeveloperAdoption/public/socialcalc/LEGAL.txt b/DeveloperAdoption/public/socialcalc/LEGAL.txt deleted file mode 100644 index ea8f9ff..0000000 --- a/DeveloperAdoption/public/socialcalc/LEGAL.txt +++ /dev/null @@ -1,72 +0,0 @@ -SOCIALCALC LEGAL.txt FILE: - -LEGAL INFORMATION - -This LEGAL.txt file accompanies the SocialCalc program. It includes notices required by the -licenses as well as general legal notices. - -========================================= - COPYRIGHT AND ATTRIBUTION NOTICES -========================================= - -Copyright (C) 2009 Socialtext, Inc. -All Rights Reserved. - -image:sc-logo.gif -"SocialCalc" -http://www.socialcalc.org/xoattrib - -========================================= - SOURCE CODE AVAILABILITY NOTICE -========================================= - -The source code for this product is available from: -http://socialcalc.org/. - -========================================= - GENERAL LEGAL NOTICES -========================================= - -wikiCalc, Garden, and Software Garden are registered trademarks of Software Garden, Inc. -Socialtext and SocialCalc are registered trademarks of Socialtext, Inc. -The Socialtext logo and Dreamcatcher are trademarks of Socialtext, Inc. - -========================================= - LEGAL NOTICES REQUIRED BY THE LICENSE -========================================= - -CHANGES MADE TO THE COVERED CODE (see CPAL Version 1.0 Section 3.3): - -2008-02-08: - Original Code started as a translation to JavaScript of code in SocialCalc 1.1.0 plus - much new code. - - Python code for the OLPC XO-1 initially coded by Luke Closs of Socialtext, Inc. - - JavaScript 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. - All Rights Reserved. - Portions (c) Copyright 2007 Socialtext, Inc. - All Rights Reserved. - The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. - wikiCalc 1.0 was written by Software Garden, Inc. - Unless otherwise specified, referring to "SocialCalc" in comments refers to this - JavaScript version of the code, not the SocialCalc Perl code. - ----------- - -(Documentation of future changes as the result of Modifications, including the date of -change, will go here in this LEGAL.txt file. This documentation may be summaries of -changes with the more detailed descriptions included in the actual modified files as -appropriate.) - -========== - -THIRD PARTY CLAIMS (see CPAL Version 1.0 Section 3.4(a)): - -None. - -[End of LEGAL.txt] - diff --git a/DeveloperAdoption/public/socialcalc/LICENSE.txt b/DeveloperAdoption/public/socialcalc/LICENSE.txt deleted file mode 100644 index 0827902..0000000 --- a/DeveloperAdoption/public/socialcalc/LICENSE.txt +++ /dev/null @@ -1,705 +0,0 @@ -SOCIALCALC LICENSE.txt FILE: - -========================================= - ABOUT THIS FILE -========================================= - -This file includes copies of the Common Public Attribution License (CPAL) and -the Artistic License 2.0. - -This product consists of components licensed under different licenses. -Check the contents of each file for a statement of the license for that file. -Files without license information are licensed under the Artistic License 2.0. - -====================================================== - COMMON PUBLIC ATTRIBUTION LICENSE VERSION 1.0 (CPAL) -====================================================== - -Common Public Attribution License Version 1.0 (CPAL) - -1. "Definitions" - -1.0.1 "Commercial Use" means distribution or otherwise making the Covered Code -available to a third party. - -1.1 "Contributor" means each entity that creates or contributes to the creation -of Modifications. - -1.2 "Contributor Version" means the combination of the Original Code, prior -Modifications used by a Contributor, and the Modifications made by that particular -Contributor. - -1.3 "Covered Code" means the Original Code or Modifications or the combination of -the Original Code and Modifications, in each case including portions thereof. - -1.4 "Electronic Distribution Mechanism" means a mechanism generally accepted in -the software development community for the electronic transfer of data. - -1.5 "Executable" means Covered Code in any form other than Source Code. - -1.6 "Initial Developer" means the individual or entity identified as the Initial -Developer in the Source Code notice required by Exhibit A. - -1.7 "Larger Work" means a work which combines Covered Code or portions thereof with -code not governed by the terms of this License. - -1.8 "License" means this document. - -1.8.1 "Licensable" means having the right to grant, to the maximum extent possible, -whether at the time of the initial grant or subsequently acquired, any and all of -the rights conveyed herein. - -1.9 "Modifications" means any addition to or deletion from the substance or structure -of either the Original Code or any previous Modifications. When Covered Code is -released as a series of files, a Modification is: - -A. Any addition to or deletion from the contents of a file containing Original Code -or previous Modifications. - -B. Any new file that contains any part of the Original Code or previous Modifications. - -1.10 "Original Code" means Source Code of computer software code which is described in -the Source Code notice required by Exhibit A as Original Code, and which, at the time -of its release under this License is not already Covered Code governed by this License. - -1.10.1 "Patent Claims" means any patent claim(s), now owned or hereafter acquired, -including without limitation, method, process, and apparatus claims, in any patent -Licensable by grantor. - -1.11 "Source Code" means the preferred form of the Covered Code for making modifications -to it, including all modules it contains, plus any associated interface definition files, -scripts used to control compilation and installation of an Executable, or source code -differential comparisons against either the Original Code or another well known, -available Covered Code of the Contributors choice. The Source Code can be in a compressed -or archival form, provided the appropriate decompression or de-archiving software is -widely available for no charge. - -1.12 "You" (or "Your") means an individual or a legal entity exercising rights under, and -complying with all of the terms of, this License or a future version of this License -issued under Section 6.1. For legal entities, "You" includes any entity which controls, -is controlled by, or is under common control with You. For purposes of this definition, -"control" means (a) the power, direct or indirect, to cause the direction or management -of such entity, whether by contract or otherwise, or (b) ownership of more than fifty -percent (50%) of the outstanding shares or beneficial ownership of such entity. - -2. Source Code License. - -2.1 The Initial Developer Grant. - -The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive -license, subject to third party intellectual property claims: - -(a) under intellectual property rights (other than patent or trademark) Licensable by -Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute -the Original Code (or portions thereof) with or without Modifications, and/or as part -of a Larger Work; and - -(b) under Patents Claims infringed by the making, using or selling of Original Code, to -make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of -the Original Code (or portions thereof). - -(c) the licenses granted in this Section 2.1(a) and (b) are effective on the date -Initial Developer first distributes Original Code under the terms of this License. - -(d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code -that You delete from the Original Code; 2) separate from the Original Code; or 3) for -infringements caused by: i) the modification of the Original Code or ii) the combination -of the Original Code with other software or devices. - -2.2 Contributor Grant. - -Subject to third party intellectual property claims, each Contributor hereby grants You -a world-wide, royalty-free, non-exclusive license - -(a) under intellectual property rights (other than patent or trademark) Licensable by -Contributor, to use, reproduce, modify, display, perform, sublicense and distribute -the Modifications created by such Contributor (or portions thereof) either on an -unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger -Work; and - -(b) under Patent Claims infringed by the making, using, or selling of Modifications -made by that Contributor either alone and/or in combination with its Contributor -Version (or portions of such combination), to make, use, sell, offer for sale, have -made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or -portions thereof); and 2) the combination of Modifications made by that Contributor -with its Contributor Version (or portions of such combination). - -(c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date -Contributor first makes Commercial Use of the Covered Code. - -(d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code -that Contributor has deleted from the Contributor Version; 2) separate from the -Contributor Version; 3) for infringements caused by: i) third party modifications of -Contributor Version or ii) the combination of Modifications made by that Contributor -with other software (except as part of the Contributor Version) or other devices; or -4) under Patent Claims infringed by Covered Code in the absence of Modifications made -by that Contributor. - -3. Distribution Obligations. - -3.1 Application of License. - -The Modifications which You create or to which You contribute are governed by the terms -of this License, including without limitation Section 2.2. The Source Code version of -Covered Code may be distributed only under the terms of this License or a future version -of this License released under Section 6.1, and You must include a copy of this License -with every copy of the Source Code You distribute. You may not offer or impose any terms -on any Source Code version that alters or restricts the applicable version of this License -or the recipients rights hereunder. However, You may include an additional document -offering the additional rights described in Section 3.5. - -3.2 Availability of Source Code. - -Any Modification which You create or to which You contribute must be made available in -Source Code form under the terms of this License either on the same media as an Executable -version or via an accepted Electronic Distribution Mechanism to anyone to whom you made -an Executable version available; and if made available via Electronic Distribution -Mechanism, must remain available for at least twelve (12) months after the date it -initially became available, or at least six (6) months after a subsequent version of that -particular Modification has been made available to such recipients. You are responsible -for ensuring that the Source Code version remains available even if the Electronic -Distribution Mechanism is maintained by a third party. - -3.3 Description of Modifications. - -You must cause all Covered Code to which You contribute to contain a file documenting the -changes You made to create that Covered Code and the date of any change. You must include -a prominent statement that the Modification is derived, directly or indirectly, from -Original Code provided by the Initial Developer and including the name of the Initial -Developer in (a) the Source Code, and (b) in any notice in an Executable version or -related documentation in which You describe the origin or ownership of the Covered Code. - -3.4 Intellectual Property Matters - -(a) Third Party Claims. - -If Contributor has knowledge that a license under a third partys intellectual property -rights is required to exercise the rights granted by such Contributor under Sections 2.1 -or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" -which describes the claim and the party making the claim in sufficient detail that a -recipient will know whom to contact. If Contributor obtains such knowledge after the -Modification is made available as described in Section 3.2, Contributor shall promptly -modify the LEGAL file in all copies Contributor makes available thereafter and shall take -other steps (such as notifying appropriate mailing lists or newsgroups) reasonably -calculated to inform those who received the Covered Code that new knowledge has been obtained. - -(b) Contributor APIs. - -If Contributors Modifications include an application programming interface and Contributor -has knowledge of patent licenses which are reasonably necessary to implement that API, -Contributor must also include this information in the LEGAL file. - -(c) Representations. - -Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor -believes that Contributors Modifications are Contributors original creation(s) and/or -Contributor has sufficient rights to grant the rights conveyed by this License. - -3.5 Required Notices. - -You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not -possible to put such notice in a particular Source Code file due to its structure, then -You must include such notice in a location (such as a relevant directory) where a user -would be likely to look for such a notice. If You created one or more Modification(s) -You may add your name as a Contributor to the notice described in Exhibit A. You must -also duplicate this License in any documentation for the Source Code where You describe -recipients rights or ownership rights relating to Covered Code. You may choose to offer, -and to charge a fee for, warranty, support, indemnity or liability obligations to one or -more recipients of Covered Code. However, You may do so only on Your own behalf, and not -on behalf of the Initial Developer or any Contributor. You must make it absolutely clear -than any such warranty, support, indemnity or liability obligation is offered by You alone, -and You hereby agree to indemnify the Initial Developer and every Contributor for any -liability incurred by the Initial Developer or such Contributor as a result of warranty, -support, indemnity or liability terms You offer. - -3.6 Distribution of Executable Versions. - -You may distribute Covered Code in Executable form only if the requirements of Section -3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the -Source Code version of the Covered Code is available under the terms of this License, -including a description of how and where You have fulfilled the obligations of Section -3.2. The notice must be conspicuously included in any notice in an Executable version, -related documentation or collateral in which You describe recipients rights relating to -the Covered Code. You may distribute the Executable version of Covered Code or ownership -rights under a license of Your choice, which may contain terms different from this License, -provided that You are in compliance with the terms of this License and that the license for -the Executable version does not attempt to limit or alter the recipients rights in the -Source Code version from the rights set forth in this License. If You distribute the -Executable version under a different license You must make it absolutely clear that any -terms which differ from this License are offered by You alone, not by the Initial Developer, -Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, -Original Developer and every Contributor for any liability incurred by the Initial Developer, -Original Developer or such Contributor as a result of any such terms You offer. - -3.7 Larger Works. - -You may create a Larger Work by combining Covered Code with other code not governed by the -terms of this License and distribute the Larger Work as a single product. In such a case, You -must make sure the requirements of this License are fulfilled for the Covered Code. - -4. Inability to Comply Due to Statute or Regulation. - -If it is impossible for You to comply with any of the terms of this License with respect to -some or all of the Covered Code due to statute, judicial order, or regulation then You must: -(a) comply with the terms of this License to the maximum extent possible; and (b) describe the -limitations and the code they affect. Such description must be included in the LEGAL file -described in Section 3.4 and must be included with all distributions of the Source Code. -Except to the extent prohibited by statute or regulation, such description must be -sufficiently detailed for a recipient of ordinary skill to be able to understand it. - -5. Application of this License. - -This License applies to code to which the Initial Developer has attached the notice in Exhibit -A and to related Covered Code. - -6. Versions of the License. - -6.1 New Versions. - -Socialtext, Inc. ("Socialtext") may publish revised and/or new versions of the License from -time to time. Each version will be given a distinguishing version number. - -6.2 Effect of New Versions. - -Once Covered Code has been published under a particular version of the License, You may always -continue to use it under the terms of that version. You may also choose to use such Covered -Code under the terms of any subsequent version of the License published by Socialtext. No one -other than Socialtext has the right to modify the terms applicable to Covered Code created -under this License. - -6.3 Derivative Works. - -If You create or use a modified version of this License (which you may only do in order to -apply it to code which is not already Covered Code governed by this License), You must (a) -rename Your license so that the phrases "Socialtext", "CPAL" or any confusingly similar phrase -do not appear in your license (except to note that your license differs from this License) and -(b) otherwise make it clear that Your version of the license contains terms which differ from -the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or -Contributor in the notice described in Exhibit A shall not of themselves be deemed to be -modifications of this License.) - -7. DISCLAIMER OF WARRANTY. - -COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, -EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS -FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK -AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE -DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER -CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER -OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS -AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -8. TERMINATION. - -8.1 This License and the rights granted hereunder will terminate automatically if You fail to -comply with terms herein and fail to cure such breach within 30 days of becoming aware of the -breach. All sublicenses to the Covered Code which are properly granted shall survive any -termination of this License. Provisions which, by their nature, must remain in effect beyond -the termination of this License shall survive. - -8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory -judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial -Developer, Original Developer or Contributor against whom You file such action is referred to -as "Participant") alleging that: - -(a) such Participants Contributor Version directly or indirectly infringes any patent, then -any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this -License shall, upon 60 days notice from Participant terminate prospectively, unless if within -60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually -agreeable reasonable royalty for Your past and future use of Modifications made by such -Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version -against such Participant. If within 60 days of notice, a reasonable royalty and payment -arrangement are not mutually agreed upon in writing by the parties or the litigation claim is -not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 -automatically terminate at the expiration of the 60 day notice period specified above. - -(b) any software, hardware, or device, other than such Participants Contributor Version, -directly or indirectly infringes any patent, then any rights granted to You by such Participant -under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, -sold, distributed, or had made, Modifications made by that Participant. - -8.3 If You assert a patent infringement claim against Participant alleging that such -Participants Contributor Version directly or indirectly infringes any patent where such claim -is resolved (such as by license or settlement) prior to the initiation of patent infringement -litigation, then the reasonable value of the licenses granted by such Participant under Sections -2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or -license. - -8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements -(excluding distributors and resellers) which have been validly granted by You or any distributor -hereunder prior to termination shall survive termination. - -9. LIMITATION OF LIABILITY. - -UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, -OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR -ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON -FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, -WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, -OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF -THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR -DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE LAW -PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF -INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. - -10. U.S. GOVERNMENT END USERS. - -The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), -consisting of "commercial computer software" and "commercial computer software documentation," as -such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 -C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered -Code with only those rights set forth herein. - -11. MISCELLANEOUS. - -This License represents the complete agreement concerning subject matter hereof. If any provision -of this License is held to be unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. This License shall be governed by California law provisions -(except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law -provisions. With respect to disputes in which at least one party is a citizen of, or an entity -chartered or registered to do business in the United States of America, any litigation relating to -this License shall be subject to the jurisdiction of the Federal Courts of the Northern District -of California, with venue lying in Santa Clara County, California, with the losing party -responsible for costs, including without limitation, court costs and reasonable attorneys fees -and expenses. The application of the United Nations Convention on Contracts for the International -Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a -contract shall be construed against the drafter shall not apply to this License. - -12. RESPONSIBILITY FOR CLAIMS. - -As between Initial Developer, Original Developer and the Contributors, each party is responsible -for claims and damages arising, directly or indirectly, out of its utilization of rights under -this License and You agree to work with Initial Developer, Original Developer and Contributors to -distribute such responsibility on an equitable basis. Nothing herein is intended or shall be -deemed to constitute any admission of liability. - -13. MULTIPLE-LICENSED CODE. - -Initial Developer may designate portions of the Covered Code as Multiple-Licensed. -Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered -Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial -Developer in the file described in Exhibit A. - -14. ADDITIONAL TERM: ATTRIBUTION - -(a) As a modest attribution to the organizer of the development of the Original Code ("Original -Developer"), in the hope that its promotional value may help justify the time, money and effort -invested in writing the Original Code, the Original Developer may include in Exhibit B -("Attribution Information") a requirement that each time an Executable and Source Code or a Larger -Work is launched or initially run (which includes initiating a session), a prominent display of -the Original Developers Attribution Information (as defined below) must occur on the graphic user -interface employed by the end user to access such Covered Code (which may include display on a -splash screen), if any. The size of the graphic image should be consistent with the size of the -other elements of the Attribution Information. If the access by the end user to the Executable and -Source Code does not create a graphic user interface for access to the Covered Code, this -obligation shall not apply. If the Original Code displays such Attribution Information in a -particular form (such as in the form of a splash screen, notice at login, an "about" display, or -dedicated attribution area on user interface screens), continued use of such form for that -Attribution Information is one way of meeting this requirement for notice. - -(b) Attribution information may only include a copyright notice, a brief phrase, graphic image and -a URL ("Attribution Information") and is subject to the Attribution Limits as defined below. For -these purposes, prominent shall mean display for sufficient duration to give reasonable notice to -the user of the identity of the Original Developer and that if You include Attribution Information -or similar information for other parties, You must ensure that the Attribution Information for the -Original Developer shall be no less prominent than such Attribution Information or similar -information for the other party. For greater certainty, the Original Developer may choose to -specify in Exhibit B below that the above attribution requirement only applies to an Executable -and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The -intent is to provide for reasonably modest attribution, therefore the Original Developer cannot -require that You display, at any time, more than the following information as Attribution -Information: (a) a copyright notice including the name of the Original Developer; (b) a word or -one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and -(d) a URL (collectively, the "Attribution Limits"). - -(c) If Exhibit B does not include any Attribution Information, then there are no requirements for -You to display any Attribution Information of the Original Developer. - -(d) You acknowledge that all trademarks, service marks and/or trade names contained within the -Attribution Information distributed with the Covered Code are the exclusive property of their -owners and may only be used with the permission of their owners, or under circumstances otherwise -permitted by law or as expressly set out in this License. - -15. ADDITIONAL TERM: NETWORK USE. -The term "External Deployment" means the use, distribution, or communication of the Original Code -or Modifications in any way such that the Original Code or Modifications may be used by anyone -other than You, whether those works are distributed or communicated to those persons or made -available as an application intended for use over a network. As an express condition for the grants -of license hereunder, You must treat any External Deployment by You of the Original Code or -Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. - -EXHIBIT A. Common Public Attribution License Version 1.0. - -"The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at _____________. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is______________________. - -The Original Developer is not the Initial Developer and is __________. If left blank, the Original -Developer is the Initial Developer. - -The Initial Developer of the Original Code is ____________. All portions of the code written by -___________ are Copyright (c) _____. All Rights Reserved. - -Contributor ______________________. - -Alternatively, the contents of this file may be used under the terms of the _____ license (the -[___] License), in which case the provisions of [______] License are applicable instead of those -above. - -If you wish to allow use of your version of this file only under the terms of the [____] License -and not to allow others to use your version of this file under the CPAL, indicate your decision by -deleting the provisions above and replace them with the notice and other provisions required by -the [___] License. If you do not delete the provisions above, a recipient may use your version of -this file under either the CPAL or the [___] License." - -[NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source -Code files of the Original Code. You should use the text of this Exhibit A rather than the text -found in the Original Code Source Code for Your Modifications.] - -EXHIBIT B. Attribution Information - -When the TableEditor is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2009 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - - -========================================= - THE ARTISTIC LICENSE 2.0 -========================================= - - The Artistic License 2.0 - - Copyright (c) 2000-2006, The Perl Foundation. - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -Preamble - -This license establishes the terms under which a given free software -Package may be copied, modified, distributed, and/or redistributed. -The intent is that the Copyright Holder maintains some artistic -control over the development of that Package while still keeping the -Package available as open source and free software. - -You are always permitted to make arrangements wholly outside of this -license directly with the Copyright Holder of a given Package. If the -terms of this license do not permit the full use that you propose to -make of the Package, you should contact the Copyright Holder and seek -a different licensing arrangement. - -Definitions - - "Copyright Holder" means the individual(s) or organization(s) - named in the copyright notice for the entire Package. - - "Contributor" means any party that has contributed code or other - material to the Package, in accordance with the Copyright Holder's - procedures. - - "You" and "your" means any person who would like to copy, - distribute, or modify the Package. - - "Package" means the collection of files distributed by the - Copyright Holder, and derivatives of that collection and/or of - those files. A given Package may consist of either the Standard - Version, or a Modified Version. - - "Distribute" means providing a copy of the Package or making it - accessible to anyone else, or in the case of a company or - organization, to others outside of your company or organization. - - "Distributor Fee" means any fee that you charge for Distributing - this Package or providing support for this Package to another - party. It does not mean licensing fees. - - "Standard Version" refers to the Package if it has not been - modified, or has been modified only in ways explicitly requested - by the Copyright Holder. - - "Modified Version" means the Package, if it has been changed, and - such changes were not explicitly requested by the Copyright - Holder. - - "Original License" means this Artistic License as Distributed with - the Standard Version of the Package, in its current version or as - it may be modified by The Perl Foundation in the future. - - "Source" form means the source code, documentation source, and - configuration files for the Package. - - "Compiled" form means the compiled bytecode, object code, binary, - or any other form resulting from mechanical transformation or - translation of the Source form. - - -Permission for Use and Modification Without Distribution - -(1) You are permitted to use the Standard Version and create and use -Modified Versions for any purpose without restriction, provided that -you do not Distribute the Modified Version. - - -Permissions for Redistribution of the Standard Version - -(2) You may Distribute verbatim copies of the Source form of the -Standard Version of this Package in any medium without restriction, -either gratis or for a Distributor Fee, provided that you duplicate -all of the original copyright notices and associated disclaimers. At -your discretion, such verbatim copies may or may not include a -Compiled form of the Package. - -(3) You may apply any bug fixes, portability changes, and other -modifications made available from the Copyright Holder. The resulting -Package will still be considered the Standard Version, and as such -will be subject to the Original License. - - -Distribution of Modified Versions of the Package as Source - -(4) You may Distribute your Modified Version as Source (either gratis -or for a Distributor Fee, and with or without a Compiled form of the -Modified Version) provided that you clearly document how it differs -from the Standard Version, including, but not limited to, documenting -any non-standard features, executables, or modules, and provided that -you do at least ONE of the following: - - (a) make the Modified Version available to the Copyright Holder - of the Standard Version, under the Original License, so that the - Copyright Holder may include your modifications in the Standard - Version. - - (b) ensure that installation of your Modified Version does not - prevent the user installing or running the Standard Version. In - addition, the Modified Version must bear a name that is different - from the name of the Standard Version. - - (c) allow anyone who receives a copy of the Modified Version to - make the Source form of the Modified Version available to others - under - - (i) the Original License or - - (ii) a license that permits the licensee to freely copy, - modify and redistribute the Modified Version using the same - licensing terms that apply to the copy that the licensee - received, and requires that the Source form of the Modified - Version, and of any works derived from it, be made freely - available in that license fees are prohibited but Distributor - Fees are allowed. - - -Distribution of Compiled Forms of the Standard Version -or Modified Versions without the Source - -(5) You may Distribute Compiled forms of the Standard Version without -the Source, provided that you include complete instructions on how to -get the Source of the Standard Version. Such instructions must be -valid at the time of your distribution. If these instructions, at any -time while you are carrying out such distribution, become invalid, you -must provide new instructions on demand or cease further distribution. -If you provide valid instructions or cease distribution within thirty -days after you become aware that the instructions are invalid, then -you do not forfeit any of your rights under this license. - -(6) You may Distribute a Modified Version in Compiled form without -the Source, provided that you comply with Section 4 with respect to -the Source of the Modified Version. - - -Aggregating or Linking the Package - -(7) You may aggregate the Package (either the Standard Version or -Modified Version) with other packages and Distribute the resulting -aggregation provided that you do not charge a licensing fee for the -Package. Distributor Fees are permitted, and licensing fees for other -components in the aggregation are permitted. The terms of this license -apply to the use and Distribution of the Standard or Modified Versions -as included in the aggregation. - -(8) You are permitted to link Modified and Standard Versions with -other works, to embed the Package in a larger work of your own, or to -build stand-alone binary or bytecode versions of applications that -include the Package, and Distribute the result without restriction, -provided the result does not expose a direct interface to the Package. - - -Items That are Not Considered Part of a Modified Version - -(9) Works (including, but not limited to, modules and scripts) that -merely extend or make use of the Package, do not, by themselves, cause -the Package to be a Modified Version. In addition, such works are not -considered parts of the Package itself, and are not subject to the -terms of this license. - - -General Provisions - -(10) Any use, modification, and distribution of the Standard or -Modified Versions is governed by this Artistic License. By using, -modifying or distributing the Package, you accept this license. Do not -use, modify, or distribute the Package, if you do not accept this -license. - -(11) If your Modified Version has been derived from a Modified -Version made by someone other than you, you are nevertheless required -to ensure that your Modified Version complies with the requirements of -this license. - -(12) This license does not grant you the right to use any trademark, -service mark, tradename, or logo of the Copyright Holder. - -(13) This license includes the non-exclusive, worldwide, -free-of-charge patent license to make, have made, use, offer to sell, -sell, import and otherwise transfer the Package with respect to any -patent claims licensable by the Copyright Holder that are necessarily -infringed by the Package. If you institute patent litigation -(including a cross-claim or counterclaim) against any party alleging -that the Package constitutes direct or contributory patent -infringement, then this Artistic License to you shall terminate on the -date that such litigation is filed. - -(14) Disclaimer of Warranty: -THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS -IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR -NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL -LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -[End of LICENSE.txt] - - diff --git a/DeveloperAdoption/public/socialcalc/SocialCalcServersideUtilities.pm b/DeveloperAdoption/public/socialcalc/SocialCalcServersideUtilities.pm deleted file mode 100644 index 853acbd..0000000 --- a/DeveloperAdoption/public/socialcalc/SocialCalcServersideUtilities.pm +++ /dev/null @@ -1,2929 +0,0 @@ -# -# SocialCalcServersideUtilites.pm -# - -# -# Based in part on the SocialCalc 1.1 code, which is based on wikiCalc 1.0. -# SocialCalc 1.1 was: -# Portions (c) Copyright 2005, 2006, 2007 Software Garden, Inc. -# All Rights Reserved. -# Portions (c) Copyright 2007 Socialtext, Inc. -# All Rights Reserved. -# This code is also based in part on the SocialCalc JavaScript implementation of 2008. -# -# The new rights in this new code: -# -# (c) Copyright 2008 Socialtext, Inc. -# All Rights Reserved. -# -# This code has NOT been released under an Open Source license at this point. -# It is not to be used without permission of Socialtext, Inc. -# -# Known problems: -# Doesn't handle UTF-8 currency symbols (and who knows what else) -# Doesn't handle hidden rows and columns correctly. -# - - use strict; - use utf8; - use Time::Local; - - require Exporter; - our @ISA = qw(Exporter); - our @EXPORT = qw(CreateSheet ParseSheetSave CreateSheetSave DecodeSpreadsheetSave - CreateCellHTML CreateCellHTMLSave - CreateCSV - CellToString - CreateRenderContext RenderSheet - CalculateCellSkipData PrecomputeSheetFontsAndLayouts CalculateColWidthData - RenderTableTag RenderColGroup RenderSizingRow RenderCell); - our $VERSION = '1.0.0'; - - # - # CONSTANTS - # - - # - # Date/time constants - # - - our $julian_offset = 2415019; - our $seconds_in_a_day = 24 * 60 * 60; - our $seconds_in_an_hour = 60 * 60; - - # - # SHEET DATA FORMAT - # - # When parsed, the sheet is stored in a sheet data structure. - # The structure is a hash with a format as follows: - # - # Cells: - # - # The sheet's cell data is stored as the value of the "cells" key. - # The $sheet{cells} value is a hash with cell coordinates as keys - # and a hash with the cell attributes as the value. For example, - # $sheet{cells}{A1}{formula} might have a value of "SUM(A1:A10)". - # - # Not all cells need an entry nor a data structure. If they are blank and use - # default values for their attributes, then they need not be present. - # - # Cell data is stored in a hash with the following "key: value" pairs: - # - # coord: the column/row as a string, e.g., "A1" - # datavalue: the value to be used for computation and formatting for display, - # string or numeric (tolerant of numbers stored as strings) - # datatype: if present, v=numeric value, t=text value, f=formula, - # or c=constant that is not a simple number (like "$1.20") - # formula: if present, the formula (without leading "=") for computation or the constant - # valuetype: first char is main type, the following are sub-types. - # Main types are b=blank cell, n=numeric, t=text, e=error - # Examples of using sub-types would be "nt" for a numeric time value, "n$" for currency, "nl" for logical - # - # The following optional values, if present, are mainly used in rendering, overriding defaults: - # - # bt, br, bb, bl: number of border's definition - # layout: layout (vertical alignment, padding) definition number - # font: font definition number - # color: text color definition number - # bgcolor: background color definition number - # cellformat: cell format (horizontal alignment) definition number - # nontextvalueformat: custom format definition number for non-text values, e.g., numbers - # textvalueformat: custom format definition number for text values - # colspan, rowspan: number of cells to span for merged cells (only on main cell) - # cssc: custom css classname for cell, as text (no special chars) - # csss: custom css style definition - # mod: modification allowed flag "y" if present - # comment: cell comment string - # - # Sheet attributes: - # Global values, such as default column width, are stored as "attribs". - # For example, $sheet{attribs}{defaultcolwidth} = 80. - # - # The sheet attribute key/values are: - # - # lastcol - number - # lastrow - number - # defaultcolwidth - number or blank (use system default) - # defaultrowheight - not used - # defaulttextformat:format# - cell format number (alignment) for sheet default for text values - # defaultnontextformat:format# - cell format number for sheet default for non-text values (i.e., numbers) - # defaultlayout:layout# - default cell layout number in cell layout list - # defaultfont:font# - default font number in sheet font list - # defaultnontextvalueformat:valueformat# - default non-text (number) value format number in sheet valueformat list - # defaulttextvalueformat:valueformat# - default text value format number in sheet valueformat list - # defaultcolor:color# - default number for text color in sheet color list - # defaultbgcolor:color# - default number for background color in sheet color list - # circularreferencecell:coord - cell coord with a circular reference - # recalc:value - on/off (on is default). If not "off", appropriate changes to the sheet cause a recalc - # needsrecalc:value - yes/no (no is default). If "yes", formula values are not up to date - # - # The Column attributes: - # Column attributes are stored in $sheet{colattribs}. - # $sheet{colattribs}{width}{col-letter(s)}: width or blank for column - # $sheet{colattribs}{hide}{col-letter(s)}: yes/no (default is no) - # - # The Row attributes: - # Row attributes are stored in $sheet{rowattribs}. - # $sheet{rowattribs}{hide}{rownumber}: yes/no (default is no) - # - # Names are stored as: - # $sheet{names}{"name"} = {desc => "description", definition => "definition"} - # - # The lookup value lists are stored as an array of strings and a hash to do reverse lookups. - # The lookup value lists are: layout, font, color, borderstyle, cellformat, and valueformat. - # $sheet{list-name . "s"}[$num] = value - # $sheet{list-name . "hash"}{"value"} = $num - # - # The range this was copied from (for partial saves) is in $sheet{copiedfrom}. - # - - # - # The following data structures are used as lookups by the save and parse code to make it - # more general and easier to extend: - # - - our %sheetAttribsLongToShort = (lastcol => "c", lastrow => "r", defaultcolwidth => "w", defaultrowheight => "h", - defaulttextformat => "tf", defaultnontextformat => "ntf", defaulttextvalueformat => "tvf", defaultnontextvalueformat => "ntvf", - defaultlayout => "layout", defaultfont => "font", defaultcolor => "color", defaultbgcolor => "bgcolor", - circularreferencecell => "circularreferencecell", recalc => "recalc", needsrecalc => "needsrecalc"); - - our %sheetAttribsShortToLong = ("c" => "lastcol", "r" => "lastrow", "w" => "defaultcolwidth", - "h" => "defaultrowheight", "tf" => "defaulttextformat", "ntf" => "defaultnontextformat", - "tvf" => "defaulttextvalueformat", "ntvf" => "defaultnontextvalueformat", - "layout" => "defaultlayout", "font" => "defaultfont", "color" => "defaultcolor", - "bgcolor" => "defaultbgcolor", "circularreferencecell" => "circularreferencecell", - "recalc" => "recalc", "needsrecalc" => "needsrecalc"); - - our %sheetAttribsStyle = (lastcol => 1, lastrow => 1, defaultcolwidth => 2, defaultrowheight => 1, - defaulttextformat => 1, defaultnontextformat => 1, defaulttextvalueformat => 1, defaultnontextvalueformat => 1, - defaultlayout => 1, defaultfont => 1, defaultcolor => 1, defaultbgcolor => 1, - circularreferencecell => 2, recalc => 2, needsrecalc => 2); - - our %cellAttribsStyle = (v => "v", t => "t", vt => "vt", vtf => "vtf", vtc => "vtc", - e => "decode", l => "plain", f => "plain", c => "plain", bg => "plain", cf => "plain", cvf => "plain", - ntvf => "plain", tvf => "plain", colspan => "plain", rowspan => "plain", cssc => "plain", - csss => "decode", mod => "plain", comment => "decode", b => "b"); - - our %cellAttribTypeLong = (e => "errors", l => "layout", f => "font", c => "color", bg => "bgcolor", cf => "cellformat", - ntvf => "nontextvalueformat", tvf => "textvalueformat", colspan => "colspan", rowspan => "rowspan", cssc => "cssc", - csss => "csss", mod => "mod", comment => "comment"); - - our %vlistNames = (layout => "layout", font => "font", color => "color", border => "borderstyle", - cellformat => "cellformat", valueformat => "valueformat"); - -# -# $newsheet = CreateSheet(); -# -# Returns a new sheet structure with all of the parts initialized. -# - -sub CreateSheet { - - my $sheet = { - version => "", # start with not set - cells => {}, - attribs => {lastcol => 1, lastrow => 1, defaultlayout => 0}, - rowattribs => {hide => {}, height => {}}, - colattribs => {hide => {}, width => {}}, - names => {}, - layouts => [], - layouthash => {}, - fonts => [], - fonthash => {}, - colors => [], - colorhash => {}, - borderstyles => [], - borderstylehash => {}, - cellformats => [], - cellformathash => {}, - valueformats => [], - valueformathash => {} - }; - - return $sheet; - - } - -# -# $errorstring = ParseSheetSave($sheet, $str); -# -# Parses the string $str in SocialCalc Sheet Save format and sets the -# values in $sheet. -# - -sub ParseSheetSave { - - my ($sheet, $str) = @_; - - my $maxcol = 1; - my $maxrow = 1; - $sheet->{attribs}{lastcol} = 0; - $sheet->{attribs}{lastrow} = 0; - - my @lines = split(/\r\n|\n/, $str); - - my ($linetype, $value, $coord, $type, $rest, $cell, $cr, $style, $valuetype, - $formula, $attrib, $num, $name, $desc); - - foreach my $line (@lines) { - ($linetype, $rest) = split(/:/, $line, 2); - - if ($linetype eq "version") { - $sheet->{version} = $rest; - } - - elsif ($linetype eq "cell") { - ($coord, $type, $rest) = split(/:/, $rest, 3); - $coord = uc($coord); - $cell = {'coord' => $coord} if $type; # start with minimal cell - $sheet->{cells}{$coord} = $cell; - $cr = CoordToCR($coord); - $maxcol = $cr->{col} if $cr->{col} > $maxcol; - $maxrow = $cr->{row} if $cr->{row} > $maxrow; - while ($type) { - $style = $cellAttribsStyle{$type}; - last if !$style; # process known, non-null types - if ($style eq "v") { - ($value, $type, $rest) = split(/:/, $rest, 3); - $cell->{datavalue} = DecodeFromSave($value); - $cell->{datatype} = "v"; - $cell->{valuetype} = "n"; - } - elsif ($style eq "t") { - ($value, $type, $rest) = split(/:/, $rest, 3); - $cell->{datavalue} = DecodeFromSave($value); - $cell->{datatype} = "t"; - $cell->{valuetype} = "t"; # !! should be Constants.textdatadefaulttype - } - elsif ($style eq "vt") { - ($valuetype, $value, $type, $rest) = split(/:/, $rest, 4); - $cell->{datavalue} = DecodeFromSave($value); - if (substr($valuetype,0,1) eq "n") { - $cell->{datatype} = "n"; - } - else { - $cell->{datatype} = "t"; - } - $cell->{valuetype} = $valuetype; - } - elsif ($style eq "vtf") { - ($valuetype, $value, $formula, $type, $rest) = split(/:/, $rest, 5); - $cell->{datavalue} = DecodeFromSave($value); - $cell->{formula} = DecodeFromSave($formula); - $cell->{datatype} = "f"; - $cell->{valuetype} = $valuetype; - } - elsif ($style eq "vtc") { - ($valuetype, $value, $formula, $type, $rest) = split(/:/, $rest, 5); - $cell->{datavalue} = DecodeFromSave($value); - $cell->{formula} = DecodeFromSave($formula); - $cell->{datatype} = "c"; - $cell->{valuetype} = $valuetype - } - elsif ($style eq "b") { - my ($t, $r, $b, $l); - ($t, $r, $b, $l, $type, $rest) = split(/:/, $rest, 6); - $cell->{bt} = $t; - $cell->{br} = $r; - $cell->{bb} = $b; - $cell->{bl} = $l; - } - elsif ($style eq "plain") { - $attrib = $cellAttribTypeLong{$type}; - ($value, $type, $rest) = split(/:/, $rest, 3); - $cell->{$attrib} = $value; - } - elsif ($style eq "decode") { - $attrib = $cellAttribTypeLong{$type}; - ($value, $type, $rest) = split(/:/, $rest, 3); - $cell->{$attrib} = DecodeFromSave($value); - } - else { - last; - } - } - } - - elsif ($linetype eq "col") { - ($coord, $type, $rest) = split(/:/, $rest, 3); - $coord = uc($coord); # normalize to upper case - while ($type) { - if ($type eq "w") { - ($value, $type, $rest) = split(/:/, $rest, 3); - $sheet->{colattribs}{width}{$coord} = $value; - } - elsif ($type eq "hide") { - ($value, $type, $rest) = split(/:/, $rest, 3); - $sheet->{colattribs}{hide}{$coord} = $value; - } - else { - last; - } - } - } - - elsif ($linetype eq "row") { - ($coord, $type, $rest) = split(/:/, $rest, 3); - while ($type) { - if ($type eq "h") { - ($value, $type, $rest) = split(/:/, $rest, 3); - $sheet->{rowattribs}{height}{$coord} = $value; - } - elsif ($type eq "hide") { - ($value, $type, $rest) = split(/:/, $rest, 3); - $sheet->{rowattribs}{hide}{$coord} = $value; - } - else { - last; - } - } - } - - elsif ($linetype eq "sheet") { - ($type, $rest) = split(/:/, $rest, 2); - while ($type) { - $attrib = $sheetAttribsShortToLong{$type}; - $style = $sheetAttribsStyle{$attrib}; - last if !$style; # process known, non-null types - if ($style==1) { # plain number - ($value, $type, $rest) = split(/:/, $rest, 3); - $sheet->{attribs}{$attrib} = $value-0; - } - elsif ($style==2) { # text - ($value, $type, $rest) = split(/:/, $rest, 3); - $sheet->{attribs}{$attrib} = $value; - } - else { - last; - } - } - } - - elsif ($linetype eq "name") { - ($name, $desc, $value) = split(/:/, $rest, 3); - $name = uc (DecodeFromSave($name)); - $sheet->{names}{$name}{desc} = DecodeFromSave($desc); - $sheet->{names}{$name}{definition} = DecodeFromSave($value); - } - - elsif ($vlistNames{$linetype}) { # if one of the value lists, process - $style = $vlistNames{$linetype}; # get base name - ($num, $value) = split(/:/, $rest, 2); - $value = DecodeFromSave($value); - $sheet->{$style . "s"}->[$num] = $value; - $sheet->{$style . "hash"}{$value} = $num; - } - - elsif ($linetype eq "") { # skip blank lines - } - - } - - $sheet->{attribs}{lastcol} ||= $maxcol || 1; - $sheet->{attribs}{lastrow} ||= $maxrow || 1; - - } - - -# -# $outstr = CreateSheetSave($sheet, $range); -# -# Returns the sheet as a string in SocialCalc Sheet Save format. -# If $range is present, it is in the form similar to "A1:B7", -# and just those cells will be used. -# - -sub CreateSheetSave { - - my ($sheet, $range) = @_; - my $outstr; - - my $prange; - - if ($range) { - $prange = ParseRange($range); - } - else { - $prange = (); - $prange->{cr1}{row} = 1; - $prange->{cr1}{col} = 1; - $prange->{cr2}{row} = $sheet->{attribs}{lastrow}; - $prange->{cr2}{col} = $sheet->{attribs}{lastcol}; - } - - my $cr1 = $prange->{cr1}; - my $cr2 = $prange->{cr2}; - - for (my $row=$cr1->{row}; $row <= $cr2->{row}; $row++) { - for (my $col=$cr1->{col}; $col <= $cr2->{col}; $col++) { - my $coord = CRToCoord($col, $row); - my $cell = $sheet->{cells}{$coord}; - next if !$cell; - my $line = CellToString($cell); - next if !$line; # ignore completely empty cells - $line = "cell:$coord$line\n"; - $outstr .= $line; - } - } - - for (my $col=1; $col <= $sheet->{attribs}{lastcol}; $col++) { - my $coord = NumberToCol($col); - if ($sheet->{colattribs}{width}{$coord}) { - $outstr .= "col:$coord:w:$sheet->{colattribs}{width}{$coord}\n"; - } - if ($sheet->{colattribs}{hide}{$coord}) { - $outstr .= "col:$coord:hide:$sheet->{colattribs}{hide}{$coord}\n"; - } - } - - for (my $row=1; $row <= $sheet->{attribs}{lastrow}; $row++) { - if ($sheet->{rowattribs}{height}{$row}) { - $outstr .= "row:$row:h:$sheet->{rowattribs}{height}{$row}\n"; - } - if ($sheet->{rowattribs}{hide}{$row}) { - $outstr .= "row:$row:hide:$sheet->{rowattribs}{hide}{$row}\n"; - } - } - - my $line = "sheet"; - for my $attrib (keys %sheetAttribsLongToShort) { - my $value = EncodeForSave($sheet->{attribs}{$attrib}); - if ($value) { - $line .= ":$sheetAttribsLongToShort{$attrib}:$value"; - } - } - $outstr .= "$line\n"; - - foreach my $name (keys %{$sheet->{names}}) { - $outstr .= "name:" . uc(EncodeForSave($name)) . ":" . - EncodeForSave($sheet->{names}{$name}{desc}) . ":" . - EncodeForSave($sheet->{names}{$name}{definition}) . "\n"; - } - - foreach my $type (keys %vlistNames) { # check each value list - my $vlist = $sheet->{$vlistNames{$type} . "s"}; - for (my $i=1; $i < @$vlist; $i++) { # output all values present - my $value = EncodeForSave($vlist->[$i]); - $outstr .= "$type:$i:$value\n"; - } - } - - if ($range) { - $outstr .= "copiedfrom:$range\n"; - } - - return $outstr; - - } - - -# -# $str = CellToString($cell) -# -# Returns string in cell save format. -# - -sub CellToString { - - my $cell = shift @_; - - my $str = ""; - - return $str if (!$cell); - - my $value = EncodeForSave($cell->{datavalue}); - if ($cell->{datatype} eq "v") { - if ($cell->{valuetype} eq "n") { - $str .= ":v:$value"; - } - else { - $str .= ":vt:$cell->{valuetype}:$value"; - } - } - elsif ($cell->{datatype} eq "t") { - if ($cell->{valuetype} eq "t") { # !!! should be Constants.textdatadefaulttype - $str .= ":t:$value"; - } - else { - $str .= ":vt:$cell->{valuetype}:$value"; - } - } - else { - my $formula = EncodeForSave($cell->{formula}); - if ($cell->{datatype} eq "f") { - $str .= ":vtf:$cell->{valuetype}:$value:$formula"; - } - elsif ($cell->{datatype} eq "c") { - $str .= ":vtc:$cell->{valuetype}:$value:$formula"; - } - } - if ($cell->{errors}) { - $str .= ":e:" . EncodeForSave($cell->{errors}); - } - my $t = $cell->{bt} || ""; - my $r = $cell->{br} || ""; - my $b = $cell->{bb} || ""; - my $l = $cell->{bl} || ""; - if ($t || $r || $b || $l) { - $str .= ":b:$t:$r:$b:$l"; - } - if ($cell->{layout}) { - $str .= ":l:$cell->{layout}"; - } - if ($cell->{font}) { - $str .= ":f:$cell->{font}"; - } - if ($cell->{color}) { - $str .= ":c:$cell->{color}"; - } - if ($cell->{bgcolor}) { - $str .= ":bg:$cell->{bgcolor}"; - } - if ($cell->{cellformat}) { - $str .= ":cf:$cell->{cellformat}"; - } - if ($cell->{textvalueformat}) { - $str .= ":tvf:$cell->{textvalueformat}"; - } - if ($cell->{nontextvalueformat}) { - $str .= ":ntvf:$cell->{nontextvalueformat}"; - } - if ($cell->{colspan}) { - $str .= ":colspan:$cell->{colspan}"; - } - if ($cell->{rowspan}) { - $str .= ":rowspan:$cell->{rowspan}"; - } - if ($cell->{cssc}) { - $str .= ":cssc:$cell->{cssc}"; - } - if ($cell->{csss}) { - $str .= ":csss:" . EncodeForSave($cell->{csss}); - } - if ($cell->{mod}) { - $str .= ":mod:$cell->{mod}"; - } - if ($cell->{comment}) { - $str .= ":comment:" . EncodeForSave($cell->{comment}); - } - - return $str; - - } - -# ************************************* -# -# Rendering Code -# -# ************************************* - -# -# $context = CreateRenderContext($sheet) -# - -sub CreateRenderContext { - - my $sheet = shift @_; - - my $context = { - - sheet => $sheet, - hideRowsCols => 0, # pay attention to row/col hide settings (currently ignored) - cellIDprefix => "", # if non-null, each cell will render with an ID starting with this - defaultcolwidth => 80, - defaultlayout => "padding:2px 2px 1px 2px;vertical-align:top;", - - globaldefaultfontstyle => "normal normal", - globaldefaultfontsize => "small", - globaldefaultfontfamily => "Verdana,Arial,Helvetica,sans-serif", - - explicitStyles => { - skippedcell => "font-size:small;background-color:#CCC", - comment => "background-repeat:no-repeat;background-position:top right;background-image:url(images/sc-commentbg.gif);" - }, - - classnames => { - skippedcell => "", - comment => "" - }, - - # initialize calculated values to be filled in later: - - cellskip => {}, # this-cell => coord of cell covering this cell (only for covered cells) - colwidth => [], # column widths, taking into account defaults - totalwidth => 0, # total table width - maxcol => 0, # max col to display, adding long spans, etc. - maxrow => 0, # max row to display, adding long spans, etc. - defaultfontstyle => "", - defaultfontsize => "", - defaultfontfamily => "", - fonts => [], # for each fontnum, {style: fs, weight: fw, size: fs, family: ff} - layouts => [], # for each layout, "padding:Tpx Rpx Bpx Lpx;vertical-align:va;" - - }; - - } - -# -# $outstr = RenderSheet($context, $options) -# -# Returns HTML for table rendering the sheet in that context. -# -# The options (passed to cell rendering code) are: -# -# newwinlinks => t/f (default is true) - whether text-link has target="_blank" by default or not -# - -sub RenderSheet { - - my ($context, $options) = @_; - my $sheet = $context->{sheet}; - - CalculateCellSkipData($context, $options); - PrecomputeSheetFontsAndLayouts($context, $options); - CalculateColWidthData($context, $options); - - my $outstr = RenderTableTag($context, $options); # start with table tag - - $outstr .= RenderColGroup($context, $options); # then colgroup section - - $outstr .= ""; - - $outstr .= RenderSizingRow($context, $options); # add tiny row so all cols have something despite spans - - for (my $row=1; $row <= $context->{maxrow}; $row++) { - $outstr .= ""; - for (my $col=1; $col <= $context->{maxcol}; $col++) { - $outstr .= RenderCell($context, $row, $col, $options); - } - $outstr .= ""; - } - - $outstr .= ""; - $outstr .= ""; - - return $outstr; - - } - -# -# CalculateCellSkipData($context, $options) -# -# Figures out which cells are to be skipped because of row and column spans. -# - -sub CalculateCellSkipData { - - my ($context, $options) = @_; - - my $sheet = $context->{sheet}; - my $sheetattribs = $sheet->{attribs}; - - $context->{maxcol} = $sheetattribs->{lastcol}; - $context->{maxrow} = $sheetattribs->{lastrow}; - $context->{cellskip} = {}; # reset - - # Calculate cellskip data - - for (my $row=1; $row <= $sheetattribs->{lastrow}; $row++) { - for (my $col=1; $col <= $sheetattribs->{lastcol}; $col++) { # look for spans and set cellskip for skipped cells - my $coord = CRToCoord($col, $row); - my $cell = $sheet->{cells}{$coord}; - # don't look at undefined cells (they have no spans) or skipped cells - if (!$cell || $context->{cellskip}{$coord}) { - next; - } - my $colspan = $cell->{colspan} || 1; - my $rowspan = $cell->{rowspan} || 1; - if ($colspan>1 || $rowspan>1) { - for (my $skiprow=$row; $skiprow<$row+$rowspan; $skiprow++) { - for (my $skipcol=$col; $skipcol<$col+$colspan; $skipcol++) { # do the setting on individual cells - my $skipcoord = CRToCoord($skipcol, $skiprow); - if ($skipcoord ne $coord) { # flag other cells to point back here - $context->{cellskip}{$skipcoord} = $coord; - } - if ($skiprow>$context->{maxrow}) { - $context->{maxrow} = $skiprow; - } - if ($skipcol>$context->{maxcol}) { - $context->{maxcol} = $skipcol; - } - } - } - } - } - } - - return; - - } - - -# -# PrecomputeSheetFontsAndLayouts($context, $options) -# -# Fills out the fonts and layouts arrays in the context. -# - -sub PrecomputeSheetFontsAndLayouts { - - my ($context, $options) = @_; - my $sheet = $context->{sheet}; - my $attribs = $sheet->{attribs}; - - if ($attribs->{defaultfont}) { - my $defaultfont = $sheet->{fonts}->[$attribs->{defaultfont}]; - $defaultfont =~ s/^\*/$context->{globaldefaultfontstyle}/e; - $defaultfont =~ s/(.+)\*(.+)/$1.$context->{globaldefaultfontsize}.$2/e; - $defaultfont =~ s/\*$/$context->{globaldefaultfontfamily}/e; - $defaultfont =~ m/^(\S+? \S+?) (\S+?) (\S.*)$/; - $context->{defaultfontstyle} = $1; - $context->{defaultfontsize} = $2; - $context->{defaultfontfamily} = $3; - } - else { - $context->{defaultfontstyle} = $context->{globaldefaultfontstyle}; - $context->{defaultfontsize} = $context->{globaldefaultfontsize}; - $context->{defaultfontfamily} = $context->{globaldefaultfontfamily}; - } - - for (my $num=1; $num<@{$sheet->{fonts}}; $num++) { # precompute fonts by filling in the *'s - my $s = $sheet->{fonts}->[$num]; - $s =~ s/^\*/$context->{defaultfontstyle}/e; - $s =~ s/(.+)\*(.+)/$1.$context->{defaultfontsize}.$2/e; - $s =~ s/\*$/$context->{defaultfontfamily}/e; - $s =~ m/^(\S+?) (\S+?) (\S+?) (\S.*)$/; - $context->{fonts}->[$num] = {style => $1, weight => $2, size => $3, family => $4}; - } - - my $layoutre = qr/^padding:\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+);vertical-align:\s*(\S+);/; - my @dparts = ($context->{defaultlayout} =~ m/$layoutre/); - my @sparts; - if ($attribs->{defaultlayout}) { - @sparts = ($sheet->{layouts}->[$attribs->{defaultlayout}] =~ m/$layoutre/); # get sheet defaults, if set - } - else { - @sparts = ("*", "*", "*", "*", "*"); - } - - for (my $num=1; $num<@{$sheet->{layouts}}; $num++) { # precompute layouts by filling in the *'s - my $s = $sheet->{layouts}->[$num]; - my @parts = ($s =~ m/$layoutre/); - for (my $i=0; $i<=4; $i++) { - if ($parts[$i] eq "*") { - $parts[$i] = ($sparts[$i] ne "*" ? $sparts[$i] : $dparts[$i]); # if *, sheet default or built-in - } - } - $context->{layouts}->[$num] = "padding:$parts[0] $parts[1] $parts[2] $parts[3];vertical-align:$parts[4];"; - } - - return; - - } - - -# -# CalculateColWidthData($context, $options) -# -# Saves the width of all the columns, taking the default into account, -# and calculates the total width of the table. -# -# Do CalculateCellSkipData first to calculate the max col and row. -# - -sub CalculateColWidthData { - - my ($context, $options) = @_; - my $sheet = $context->{sheet}; - - my $totalwidth = 0; - - for (my $col=1; $col <= $context->{maxcol}; $col++) { - my $colwidth = $sheet->{colattribs}{width}{NumberToCol($col)} || - $sheet->{attribs}->{defaultcolwidth} || $context->{defaultcolwidth}; - if ($colwidth eq "blank" || $colwidth eq "auto" || $colwidth eq "") { - $colwidth = ""; - } - $context->{colwidth}->[$col] = "$colwidth"; - $totalwidth += ($colwidth && $colwidth>0) ? $colwidth : 10; - } - - $context->{totalwidth} = $totalwidth; - - return; - - } - - -# -# $outstr = RenderTableTag($context, $options) -# -# Returns "" -# - -sub RenderTableTag { - - my ($context, $options) = @_; - - return qq!
!; - - } - -# -# $outstr = RenderColGroup($context, $options) -# -# Returns "..." -# - -sub RenderColGroup { - - my ($context, $options) = @_; - my $colwidths = $context->{colwidth}; - - my $outstr = ""; - - for (my $col=1; $col <= $context->{maxcol}; $col++) { - if ($colwidths->[$col]) { - $outstr .= qq!!; - } - else { - $outstr .= ""; - } - } - $outstr .= ""; - - return $outstr; - - } - -# -# $outstr = RenderSizingRow($context, $options) -# -# Returns row with blank cells for all columns just in case spans leave columns -# with no cells -- this has bugs in some cases with some browsers. -# - -sub RenderSizingRow { - - my ($context, $options) = @_; - my $colwidths = $context->{colwidth}; - - my $outstr = ""; - - for (my $col=1; $col <= $context->{maxcol}; $col++) { - if ($colwidths->[$col]) { - $outstr .= qq!!; - } - else { - $outstr .= qq!!; - } - } - $outstr .= ""; - - return $outstr; - - } - - -# -# $outstr = RenderCell($context, $row, $col, $options) -# -# Returns "" -# If skipped cell (because of span) returns "". -# -# If $options->{parts}, returns: -# {tag => "span=...", style => "padding:...", classes => "commentclass", -# value => "displayvalue", all => "{sheet}; - my $sheetattribs = $sheet->{attribs}; - - my $coord = CRToCoord($col, $row); - - my $outstr = ""; - my $tagstr = ""; - my $stylestr = ""; - my $classstr = ""; - my $displayvalue = ""; - - if ($context->{cellskip}{$coord}) { # skip if within a span - return $outstr; - } - - if ($context->{cellIDprefix}) { - $tagstr .= " " if $tagstr; - $tagstr .= qq!id="$context->{cellIDprefix}$coord"!; - } - - my $cell = $sheet->{cells}{$coord}; - if (!$cell) { - $cell = {datatype => "b"}; - } - - if ($cell->{colspan} > 1) { - my $span = 1; - for (my $num=1; $num<$cell->{colspan}; $num++) { - if ($sheet->{colattribs}{hide}{NumberToCol($col+$num)} ne "yes") { - $span++; - } - } - $tagstr .= " " if $tagstr; - $tagstr .= qq!colspan="$span"!; - } - - if ($cell->{rowspan} > 1) { - my $span = 1; - for (my $num=1; $num<$cell->{rowspan}; $num++) { - if ($sheet->{colattribs}{hide}{$row+$num} ne "yes") { - $span++; - } - } - $tagstr .= " " if $tagstr; - $tagstr .= qq!rowspan="$span"!; - } - - my $num = $cell->{layout} || $sheetattribs->{defaultlayout}; - if ($num) { - $stylestr .= $context->{layouts}[$num]; # use precomputed layout with "*"'s filled in - } - else { - $stylestr .= $context->{defaultlayout}; - } - - $num = $cell->{font} || $sheetattribs->{defaultfont}; - if ($num) { # get expanded font strings in context - my $t = $context->{fonts}->[$num]; # do each - plain "font:" style sets all sorts of other values, too (Safari font-stretch problem on cssText) - $stylestr .= "font-style:$t->{style};font-weight:$t->{weight};font-size:$t->{size};font-family:$t->{family};"; - } - else { - if ($context->{defaultfontsize}) { - $stylestr .= "font-size:$context->{defaultfontsize};"; - } - if ($context->{defaultfontfamily}) { - $stylestr .= "font-family:$context->{defaultfontfamily};"; - } - } - - $num = $cell->{color} || $sheetattribs->{defaultcolor}; - if ($num) { - $stylestr .= "color:$sheet->{colors}->[$num];"; - } - - $num = $cell->{bgcolor} || $sheetattribs->{defaultbgcolor}; - if ($num) { - $stylestr .= "background-color:$sheet->{colors}->[$num];"; - } - - $num = $cell->{cellformat}; - if ($num) { - $stylestr .= "text-align:$sheet->{cellformats}->[$num];"; - } - else { - my $t = substr($cell->{valuetype}, 0, 1); - if ($t eq "t") { - $num = $sheetattribs->{defaulttextformat}; - if ($num) { - $stylestr .= "text-align:$sheet->{cellformats}->[$num];"; - } - } - elsif ($t eq "n") { - $num = $sheetattribs->{defaultnontextformat}; - if ($num) { - $stylestr .= "text-align:$sheet->{cellformats}->[$num];"; - } - else { - $stylestr .= "text-align:right;"; - } - } - else { - $stylestr .= "text-align:left;"; - } - } - - if ($cell->{bt} && - ($cell->{bt}==$cell->{br} && $cell->{bt}==$cell->{bb} && $cell->{bt}==$cell->{bl})) { - $stylestr .= "border:$sheet->{borderstyles}->[$cell->{bt}];"; - } - - else { - $num = $cell->{bt}; - if ($num) { - $stylestr .= "border-top:$sheet->{borderstyles}->[$num];"; - } - - $num = $cell->{br}; - if ($num) { - $stylestr .= "border-right:$sheet->{borderstyles}->[$num];"; - } - - $num = $cell->{bb}; - if ($num) { - $stylestr .= "border-bottom:$sheet->{borderstyles}->[$num];"; - } - - $num = $cell->{bl}; - if ($num) { - $stylestr .= "border-left:$sheet->{borderstyles}->[$num];"; - } - } - - if ($cell->{comment}) { - if ($context->{classnames}{comment}) { - $classstr .= " " if $classstr; - $classstr .= $context->{classnames}{comment}; - } - $stylestr .= $context->{explicitStyles}{comment}; -#!! put comment text in title tag...? - } - - $displayvalue = FormatValueForDisplay($sheet, $cell->{datavalue}, $coord, $options); - - # Assemble output - - $outstr .= "{parts}) { - return {tag => $tagstr, style => $stylestr, classes => $classstr, - value => $displayvalue, all => $outstr}; - } - else { - return $outstr; - } - - } - - -# -# $parts = DecodeSpreadsheetSave($str) -# -# Separates the parts from a spreadsheet save string, returning reference to -# a hash with the sub-strings: -# -# {type1 => $string, type2 => ...} -# - -sub DecodeSpreadsheetSave { - - my $str = shift @_; - - my $parts = {}; - my @partlist; - - # Parse multipart-MIME setup - - my $OK = $str =~ m/^MIME-Version:\s1\.0/mig; - return $parts unless $OK; # no parts - $OK = $str =~ /(.*?)\nContent-Type:\s*multipart\/mixed;\s*boundary=(\S+)/mig; - return $parts unless $OK; - my $boundary = $2; - - # First part is header which says what comes next - - $OK = $str =~ m/^--$boundary$/mg; # find header top boundary - return $parts unless $OK; - $OK = $str =~ m/^$/mg; # skip to after blank line - return $parts unless $OK; - $OK = $str =~ m/(.*?)\n--$boundary$/msig; # get header part - return $parts unless $OK; - my $header = $1; - - my @lines = split(/\r\n|\n/, $header); # parse header - for (my $i=0; $i<@lines; $i++) { - my @line = split(":", $lines[$i]); - if ($line[0] eq "version") { - } - elsif ($line[0] eq "part") { - push @partlist, $line[1]; - } - } - - # Get each part - - for (my $pnum=0; $pnum<@partlist; $pnum++) { - $OK = $str =~ m/^(\r\n|\n)/mg; # skip to after blank line ending mime-part header - return $parts unless $OK; - - $boundary .= "--" if ($pnum == @partlist-1); # last part has different boundary - $OK = $str =~ m/(.*?)\n--$boundary$/msig; # get art's string - return $parts unless $OK; - $parts->{$partlist[$pnum]} = $1; # save string to return - } - - return $parts; - - } - - - -# -# $result = CreateCellHTML($sheet, $coord, $options) -# -# Returns the HTML representation of a cell. Blank is "", not " ". -# - -sub CreateCellHTML { - - my ($sheet, $coord, $options) = @_; - - my $result = ""; - my $cell = $sheet->{cells}{$coord}; - - if (!$cell) { - return ""; - } - - $result = FormatValueForDisplay($sheet, $cell->{datavalue}, $coord, $options); - - if ($result eq " ") { - $result = ""; - } - - return $result; - - } - -# -# $result = CreateCellHTMLSave($sheet, $range, $options) -# -# Returns the HTML representation of a range of cells, or the whole sheet if range is null. -# The form is: -# version:1.0 -# coord:cell-HTML -# coord:cell-HTML -# ... -# -# Empty cells are skipped. The cell-HTML is encoded with ":"=>"\c", newline=>"\n", and "\"=>"\b". -# - -sub CreateCellHTMLSave { - - my ($sheet, $range, $options) = @_; - - my $prange; - - if ($range) { - $prange = ParseRange($range); - } - else { - $prange = {cr1 => {row => 1, col => 1}, - cr2 => {row => $sheet->{attribs}{lastrow}, col => $sheet->{attribs}{lastcol}}}; - } - my $cr1 = $prange->{cr1}; - my $cr2 = $prange->{cr2}; - - my $result = "version:1.0\n"; - - for (my $row=$cr1->{row}; $row <= $cr2->{row}; $row++) { - for (my $col=$cr1->{col}; $col <= $cr2->{col}; $col++) { - my $coord = CRToCoord($col, $row); - my $cell = $sheet->{cells}{$coord}; - if (!$cell) { - next; - } - my $cellHTML = FormatValueForDisplay($sheet, $cell->{datavalue}, $coord, $options); - if ($cellHTML eq " ") { - next; - } - my $ecellHTML = EncodeForSave($cellHTML); - $result .= "$coord:$ecellHTML\n"; - } - } - - return $result; - - } - - -# -# $result = CreateCSV($sheet, $range, $options) -# -# Returns the CSV representation of a range of cells, or of the whole sheet if range is null. -# It returns the raw values, not formatted as dates, etc. -# - -sub CreateCSV { - - my ($sheet, $range, $options) = @_; - - my ($prange, $str); - - if ($range) { - $prange = ParseRange($range); - } - else { - $prange = {cr1 => {row => 1, col => 1}, - cr2 => {row => $sheet->{attribs}{lastrow}, col => $sheet->{attribs}{lastcol}}}; - } - my $cr1 = $prange->{cr1}; - my $cr2 = $prange->{cr2}; - - my $result = ""; - - for (my $row=$cr1->{row}; $row <= $cr2->{row}; $row++) { - for (my $col=$cr1->{col}; $col <= $cr2->{col}; $col++) { - my $coord = CRToCoord($col, $row); - my $cell = $sheet->{cells}{$coord}; - - if ($cell->{errors}) { - $str = $cell->{errors}; - } - else { - $str = $cell->{datavalue} || ""; - } - - $str =~ s/"/""/g; # double quotes - if ($str =~ m/[, \n"]/) { - $str = qq!"$str"!; # add quotes - } - if ($col > $cr1->{col}) { - $str = ",$str"; # add commas - } - $result .= $str; - } - $result .= "\n"; - } - - return $result; - - } - - -# * * * * * * * * * * * * * * * * * * * * -# -# Common helping routines -# -# * * * * * * * * * * * * * * * * * * * * - -# -# $rangehash = ParseRange($range) -# -# Takes $range with "A1:B7" and returns hash with: -# cr1 => {row => rownumber, col => colnumber, coord => CR}, -# cr2 => {row => rownumber, col => colnumber, coord => CR} -# - -sub ParseRange { - - my $range = shift @_; - - if (!$range) { - $range = "A1:A1"; # error return, hopefully benign - } - $range = uc $range; - - my ($cr1, $cr2); - $range =~ m/^(.+):(.+)$/; - if ($2) { # has two parts - $cr1 = CoordToCR($1); - $cr2 = CoordToCR($2); - } - else { - $cr1 = CoordToCR($range); - $cr2 = CoordToCR($range); - } - return {cr1 => $cr1, cr2 => $cr2}; - - } - - -# -# (col => $col, row => $row) = CoordToCR($coord) -# -# Turns B3 into (col => 2, row => 3, coord => "B3"). The default for both is 1. -# If range, only do this to first coord -# - -sub CoordToCR { - - my $coord = shift @_; - - $coord = lc($coord); - $coord =~ s/\$//g; - $coord =~ m/([a-z])([a-z])?(\d+)/; - my $col = ord($1) - ord('a') + 1 ; - $col = 26 * $col + ord($2) - ord('a') + 1 if $2; - - return {col => $col, row => $3, coord => uc $coord}; - -} - - -# -# $coord = CRToCoord($col, $row) -# -# Turns (2, 3) into B3. The default for both is 1. -# - -sub CRToCoord { - - my ($col, $row) = @_; - - $row = 1 unless $row > 1; - $col = 1 unless $col > 1; - - my $col_high = int(($col - 1) / 26); - my $col_low = ($col - 1) % 26; - - my $coord = chr(ord('A') + $col_low); - $coord = chr(ord('A') + $col_high - 1) . $coord if $col_high; - $coord .= $row; - - return $coord; - -} - - -# -# $col = ColToNumber($colname) -# -# Turns B into 2. The default is 1. -# - -sub ColToNumber { - - my $coord = shift @_; - - $coord = lc($coord); - $coord =~ m/([a-z])([a-z])?/; - return 1 unless $1; - my $col = ord($1) - ord('a') + 1 ; - $col = 26 * $col + ord($2) - ord('a') + 1 if $2; - - return $col; - -} - - -# -# $coord = NumberToCol($col) -# -# Turns 2 into B. The default is 1. -# - -sub NumberToCol { - - my $col = shift @_; - - $col = $col > 1 ? $col : 1; - - my $col_high = int(($col - 1) / 26); - my $col_low = ($col - 1) % 26; - - my $coord = chr(ord('A') + $col_low); - $coord = chr(ord('A') + $col_high - 1) . $coord if $col_high; - - return $coord; - -} - - -# # # # # # # # # # -# EncodeForSave($string) -# -# Returns $estring where :, \n, and \ are escaped -# - -sub EncodeForSave { - my $string = shift @_; - - $string =~ s/\\/\\b/g; # \ to \b - $string =~ s/:/\\c/g; # : to \c - $string =~ s/\n/\\n/g; # line end to \n - - return $string; -} - - -# # # # # # # # # # -# DecodeFromSave($string) -# -# Returns $estring with \c, \n, \b and \\ un-escaped -# - -sub DecodeFromSave { - my $string = shift @_; - - $string =~ s/\\c/:/g; - $string =~ s/\\n/\n/g; - $string =~ s/\\b/\\/g; - - return $string; -} - - -# # # # # # # # # # -# SpecialChars($string) -# -# Returns $estring where &, <, >, " are HTML escaped -# - -sub SpecialChars { - my $string = shift @_; - - $string =~ s/&/&/g; - $string =~ s//>/g; - $string =~ s/"/"/g; - - return $string; -} - - -# # # # # # # # # # -# SpecialCharsNL($string) -# -# Returns $estring where &, <, >, ", and LF are HTML escaped, CR's are removed -# - -sub SpecialCharsNL { - my $string = shift @_; - - $string =~ s/&/&/g; - $string =~ s//>/g; - $string =~ s/"/"/g; - $string =~ s/\r//gs; - $string =~ s/\n/ /gs; - - return $string; -} - - -# # # # # # # # # # -# URLEncode($string) -# -# Returns $estring with special chars URL encoded -# -# Based on Mastering Regular Expressions, Jeffrey E. F. Friedl, additional legal characters added -# - -sub URLEncode { - my $string = shift @_; - - $string =~ s!([^a-zA-Z0-9_\-;/?:@=#.])!sprintf('%%%02X', ord($1))!ge; - $string =~ s/%26/{{amp}}/gs; # let ampersands in URLs through -- convert to {{amp}} - - return $string; -} - - -# # # # # # # # # # -# URLEncodePlain($string) -# -# Returns $estring with special chars URL encoded for sending to others by HTTP, not publishing -# -# Based on Mastering Regular Expressions, Jeffrey E. F. Friedl, additional legal characters added -# - -sub URLEncodePlain { - my $string = shift @_; - - $string =~ s!([^a-zA-Z0-9_\-/?:@=#.])!sprintf('%%%02X', ord($1))!ge; - - return $string; -} - - -# # # # # # # # # # -# estring = ExpandMarkup($string, $sheet, $options) -# -# Returns $estring with expanded simple wikitext - used for error messages -# - -sub ExpandMarkup { - - my ($estring, $sheet, $options) = @_; - - return $estring; - - } - - -# # # # # # # # # # -# estring = ExpandWikitext($estring, $sheet, $options, $valueformat) -# -# Returns $estring with expanded wikitext - used for cell data -# - -sub ExpandWikitext { - - my ($estring, $sheet, $options, $valueformat) = @_; - - # handle the cases of text-wiki... - - if ($valueformat =~ m/^text-wiki(.+)$/) { # something more than just plain wikitext - my $subtype = $1; - my $result = ""; - - if ($subtype eq "-pagelink") { # not very secure or robust -- just a demo - if ($estring =~ m/\[(\S+)\s+(.+)\]$/) { - my $url = URLEncode("$1"); - my $scestring = SpecialChars($2); - $result = qq!$scestring!; - } - elsif ($estring =~ m/\[(.*)\]$/) { - my $url = URLEncode("$1"); - my $scestring = SpecialChars($1); - $result = qq!$scestring!; - } - else { - my $url = URLEncode($estring); - my $scestring = SpecialChars($estring); - $result = qq!$scestring!; - } - } - else { - $result = SpecialChars("$subtype: $estring"); - } - - return $result || " "; - - } - - $estring =~ s!\[(http:.+?)\s+(.+?)\]!'{{lt}}a href={{quot}}' . URLEncode("$1") . "{{quot}}{{gt}}$2\{{lt}}/a{{gt}}"!egs; # Wiki-style links - $estring =~ s!\[link:(.+?)\s+(.+?)\:link]!'{{lt}}a href={{quot}}' . URLEncode("$1") . "{{quot}}{{gt}}$2\{{lt}}/a{{gt}}"!egs; # [link:url text:link] to link - $estring =~ s!\[popup:(.+?)\s+(.+?)\:popup]!'{{lt}}a href={{quot}}' . URLEncode("$1") . "{{quot}} target={{quot}}_blank{{quot}}{{gt}}$2\{{lt}}/a{{gt}}"!egs; # [popup:url text:popup] to link with popup result - $estring =~ s!\[image:(.+?)\s+(.+?)\:image]!'{{lt}}img src={{quot}}' . URLEncode("$1") . '{{quot}} alt={{quot}}' . SpecialCharsNL("$2") . '{{quot}}{{gt}}'!egs; # [image:url alt-text:image] for images -# $string =~ s!\[page:(.+?)(\s+(.+?))?]!wiki_page_command($1,$3, $linkstyle)!egs; # [page:pagename text] to link to other pages on this site - - # Convert &, <, >, " - - $estring = SpecialChars($estring); - - # Multi-line text has additional formatting options ignored for single line - - if ($estring =~ m/\n/) { - my ($str, @closingtag); - foreach my $line (split /\n/, $estring) { # do things on a line-by-line basis - $line =~ s/\r//g; - if ($line =~ m/^([\*|#|;]{1,5})\s{0,1}(.+)$/) { # do list items - my $lnest = length($1); - my $lchr = substr($1,-1); - my $ltype; - if ($lnest > @closingtag) { - for (my $i=@closingtag; $i<$lnest; $i++) { - if ($lchr eq '*') { - $ltype = "ul"; - } - elsif ($lchr eq '#') { - $ltype = 'ol'; - } - else { - $ltype = 'dl'; - } - $str .= "<$ltype>"; - push @closingtag, ""; - } - } - elsif ($lnest < @closingtag) { - for (my $i=@closingtag; $i>$lnest; $i--) { - $str .= pop @closingtag; - } - } - if ($lchr eq ';') { - my $rest = $2; - if ($rest =~ m/\s*(.*?):(.*)$/) { - $str .= "
$1
$2
"; - } - else { - $str .= "
$rest
"; - } - } - else { - $str .= "
  • $2
  • "; - } - next; - } - while (@closingtag) { - $str .= pop @closingtag; - } - if ($line =~ m/^(={1,5})\s(.+)\s\1$/) { # = heading =, with equal number of equals on both sides - my $neq = length($1); - $str .= "$2"; - next; - } - if ($line =~ m/^(:{1,5})\s{0,1}(.+)$/) { # indent 20pts for each : - my $nindent = length($1) * 20; - $str .= "
    $2
    "; - next; - } - - $str .= "$line\n"; - } - while (@closingtag) { # just in case any left at the end - $str .= pop @closingtag; - } - $estring = $str; - } - - $estring =~ s/\n/
    /g; # Line breaks are preserved - $estring =~ s/('*)'''(.*?)'''/$1$2<\/b>/gs; # Wiki-style bold/italics - $estring =~ s/''(.*?)''/$1<\/i>/gs; - $estring =~ s/\[b:(.+?)\:b]/$1<\/b>/gs; # [b:text:b] for bold - $estring =~ s/\[i:(.+?)\:i]/$1<\/i>/gs; # [i:text:i] for italic - $estring =~ s/\[quote:(.+?)\:quote]/
    $1<\/blockquote>/gs; # [quote:text:quote] to indent - $estring =~ s/\{\{amp}}/&/gs; # {{amp}} for ampersand - $estring =~ s/\{\{lt}}//gs; # {{gt}} for greater than - $estring =~ s/\{\{quot}}/"/gs; # {{quot}} for quote - $estring =~ s/\{\{lbracket}}/[/gs; # {{lbracket}} for left bracket - $estring =~ s/\{\{rbracket}}/]/gs; # {{rbracket}} for right bracket - $estring =~ s/\{\{lbrace}}/{/gs; # {{lbrace}} for brace - - return $estring; - - } - -# * * * * * * * * * * * * * * * * * * * * -# -# Number Formatting code from SocialCalc 1.1.0 -# -# * * * * * * * * * * * * * * * * * * * * - - our %WKCStrings = ( -"sheetdefaultlayoutstyle" => "padding:2px 2px 1px 2px;vertical-align:top;", -"sheetdefaultfontfamily" => "Verdana,Arial,Helvetica,sans-serif", -"linkformatstring" => 'Link', # you could make this an img tag if desired: -#"linkformatstring" => '', -"defaultformatdt" => 'd-mmm-yyyy h:mm:ss', -"defaultformatd" => 'd-mmm-yyyy', -"defaultformatt" => '[h]:mm:ss', -"displaytrue" => 'TRUE', # how TRUE shows when rendered -"displayfalse" => 'FALSE', - ); - -# # # # # # # # # -# -# $displayvalue = FormatValueForDisplay($sheet, $value, $coord, $options) -# -# # # # # # # # # - -sub FormatValueForDisplay { - - my ($sheet, $value, $coord, $options) = @_; - - my $cell = $sheet->{cells}{$coord}; - my $sheetattribs = $sheet->{attribs}; - - my ($valueformat, $has_parens, $has_commas, $valuetype, $valuesubtype); - - # Get references to the parts - - my $displayvalue = $value; - - my $valuetype = $cell->{valuetype}; # get type of value to determine formatting - my $valuesubtype = substr($valuetype,1); - $valuetype = substr($valuetype,0,1); - - if ($cell->{errors} || $valuetype eq "e") { - $displayvalue = ExpandMarkup($cell->{errors}, $sheet, $options) || $valuesubtype || "Error in cell"; - return $displayvalue; - } - - if ($valuetype eq "t") { - $valueformat = $sheet->{valueformats}->[($cell->{textvalueformat} || $sheetattribs->{defaulttextvalueformat})] || ""; - if ($valueformat eq "formula") { - if ($cell->{datatype} eq "f") { - $displayvalue = SpecialChars("=$cell->{formula}") || " "; - } - elsif ($cell->{datatype} eq "c") { - $displayvalue = SpecialChars("'$cell->{formula}") || " "; - } - else { - $displayvalue = SpecialChars("'$displayvalue") || " "; - } - return $displayvalue; - } - $displayvalue = format_text_for_display($displayvalue, $cell->{valuetype}, $valueformat, $sheet, $options); - } - - elsif ($valuetype eq "n") { - $valueformat = $cell->{nontextvalueformat}; - if (length($valueformat) == 0) { # "0" is a legal value format - $valueformat = $sheetattribs->{defaultnontextvalueformat}; - } - $valueformat = $sheet->{valueformats}->[$valueformat]; - if (length($valueformat) == 0) { - $valueformat = ""; - } - $valueformat = "" if $valueformat eq "none"; - if ($valueformat eq "formula") { - if ($cell->{datatype} eq "f") { - $displayvalue = SpecialChars("=$cell->{formula}") || " "; - } - elsif ($cell->{datatype} eq "c") { - $displayvalue = SpecialChars("'$cell->{formula}") || " "; - } - else { - $displayvalue = SpecialChars("'$displayvalue") || " "; - } - return $displayvalue; - } - elsif ($valueformat eq "forcetext") { - if ($cell->{datatype} eq "f") { - $displayvalue = SpecialChars("=$cell->{formula}") || " "; - } - elsif ($cell->{datatype} eq "c") { - $displayvalue = SpecialChars($cell->{formula}) || " "; - } - else { - $displayvalue = SpecialChars($displayvalue) || " "; - } - return $displayvalue; - } - $displayvalue = format_number_for_display($displayvalue, $cell->{valuetype}, $valueformat); - } - else { # unknown type - probably blank - $displayvalue = " "; - } - - return $displayvalue; - - } - - -# # # # # # # # # -# -# $displayvalue = format_text_for_display($rawvalue, $valuetype, $valueformat, $sheetdata, $options) -# -# # # # # # # # # - -sub format_text_for_display { - - my ($rawvalue, $valuetype, $valueformat, $sheet, $options) = @_; - - my $valuesubtype = substr($valuetype,1); - - my $displayvalue = $rawvalue; - - $valueformat = "" if $valueformat eq "none"; - $valueformat = "" unless $valueformat =~ m/^(text-|custom|hidden)/; - if (!$valueformat || $valueformat eq "General") { # determine format from type - $valueformat = "text-html" if ($valuesubtype eq "h"); - $valueformat = "text-wiki" if ($valuesubtype eq "w"); - $valueformat = "text-link" if ($valuesubtype eq "l"); - $valueformat = "text-plain" unless $valuesubtype; - } - if ($valueformat eq "text-html") { # HTML - output as it as is - ; - } - elsif ($valueformat =~ m/^text-wiki/) { # wiki text - $displayvalue = ExpandWikitext($displayvalue, $sheet, $options, $valueformat); # do wiki markup - } - elsif ($valueformat eq "text-url") { # text is a URL for a link with optional description - my $dvsc = SpecialChars($displayvalue); - my $dvue = URLEncode($displayvalue); - $dvue =~ s/\Q{{amp}}/%26/g; - $displayvalue = qq!$dvsc!; - } - elsif ($valueformat eq "text-link") { # more extensive link capabilities for regular web links - $displayvalue = ExpandTextLink($displayvalue, $sheet, $options, $valueformat); - } - elsif ($valueformat eq "text-image") { # text is a URL for an image - my $dvue = URLEncode($displayvalue); - $dvue =~ s/\Q{{amp}}/%26/g; - $displayvalue = qq!!; - } - elsif ($valueformat =~ m/^text-custom\:/) { # construct a custom text format: @r = text raw, @s = special chars, @u = url encoded - my $dvsc = SpecialChars($displayvalue); # do special chars - $dvsc =~ s/ /  /g; # keep multiple spaces - $dvsc =~ s/\n/
    /g; # keep line breaks - my $dvue = URLEncode($displayvalue); - $dvue =~ s/\Q{{amp}}/%26/g; - my %textval; - $textval{r} = $displayvalue; - $textval{s} = $dvsc; - $textval{u} = $dvue; - $displayvalue = $valueformat; - $displayvalue =~ s/^text-custom\://; - $displayvalue =~ s/@(r|s|u)/$textval{$1}/ge; - } - elsif ($valueformat =~ m/^custom/) { # custom - $displayvalue = SpecialChars($displayvalue); # do special chars - $displayvalue =~ s/ /  /g; # keep multiple spaces - $displayvalue =~ s/\n/
    /g; # keep line breaks - $displayvalue .= " (custom format)"; - } - elsif ($valueformat eq "hidden") { - $displayvalue = " "; - } - else { # plain text - $displayvalue = SpecialChars($displayvalue); # do special chars - $displayvalue =~ s/ /  /g; # keep multiple spaces - $displayvalue =~ s/\n/
    /g; # keep line breaks - } - - return $displayvalue; - - } - - -# # # # # # # # # -# -# $displayvalue = ExpandTextLink($displayvalue, $sheet, $options, $valueformat) -# -# Given: url = http://www.someurl.com/more, desc = Some descriptive text -# -# Takes the following: -# -# url => "url" as a link to url or other html (depending on SocialCalc.Constants) -# => "Link" or image as link (depending on SocialCalc.Constants) -# desc => "desc" as a link to url -# "desc" => "desc" as a link to url -# <<>> instead of <> => target="_blank" (new window) even when not editing -# -# # # # # # # # # - - -sub ExpandTextLink { - - my ($displayvalue, $sheet, $options, $valueformat) = @_; - - my ($desc, $url); - - my $parts = ParseCellLinkText($displayvalue); - - if ($parts->{desc}) { - $desc = SpecialChars($parts->{desc}); - } - else { - $desc = $WKCStrings{linkformatstring}; - } - - if (length($displayvalue) > 7 && lc(substr($displayvalue,0,7)) eq "http://" - && substr($displayvalue,-1,1) ne ">") { - $desc = substr($desc,7); # remove http:// unless explicit - } - - my $tb = ($parts->{newwin} || $options->{newwinlinks}) ? ' target="_blank"' : ""; - - if ($parts->{pagename}) { - $url = MakePageLink($parts->{pagename}, $parts->{workspace}, $options, $valueformat); - } - else { - $url = URLEncode($parts->{url}); - } - - my $str = qq!$desc!; - - return $str; - - } - - -# # # # # # # # # -# -# $result = ParseCellLinkText($str) -# -# Given: url = http://www.someurl.com/more, desc = Some descriptive text -# -# Takes the following: -# -# url -# -# desc -# "desc" -# <<>> instead of <> => target="_blank" (new window) -# -# [page name] -# "desc"[page name] -# desc[page name] -# {workspace name [page name]} -# "desc"{workspace name [page name]} -# [[]] instead of [] => target="_blank" (new window) -# -# Returns: {url => url, desc => desc, newwin => t/f, pagename => pagename, workspace => workspace} -# -# # # # # # # # # - -sub ParseCellLinkText { - - my ($str) = @_; - - my $result = {url => "", desc => "", newwin => 0, pagename => "", workspace => ""}; - - if ($str !~ /<.*>$/ && $str !~ /\[.*\]$/ && $str !~ /\{.*\[.*\]\}$/) { # plain url - $result->{url} = $str; - $result->{desc} = $str; - return $result; - } - - my $desc; - - if ($str =~ /^(.*)\[\[(.*?)\]\]$/) { - $desc = $1; - $result->{pagename} = $2; - $result->{newwin} = 1; - } - elsif ($str =~ /^(.*)\[(.*?)\]$/) { - $desc = $1; - $result->{pagename} = $2; - } - elsif ($str =~ /^(.*)\{(.*?)(\s{0,1})\[\[(.*?)\]\]\}$/) { - $desc = $1; - $result->{workspace} = $2; - $result->{pagename} = $4; - $result->{newwin} = 1; - } - elsif ($str =~ /^(.*)\{(.*?)(\s{0,1})\[(.*?)\]\}$/) { - $desc = $1; - $result->{workspace} = $2; - $result->{pagename} = $4; - } - elsif ($str =~ /^(.*)<<(.*?)>>$/) { - $desc = $1; - $result->{url} = $2; - $result->{newwin} = 1; - } - else { - $str =~ /^(.*)<(.*?)>$/; - $desc = $1; - $result->{url} = $2; - } - - if ($desc =~ /^"(.*)"$/) { - $desc = $1; - } - - $result->{desc} = $desc; - - return $result; - - } - - -# # # # # # # # # # -# $estring = MakePageLink($pagename, $workspacename, $options, $valueformat); -# -# Returns $estring with expanded link to page in workspace -# - -sub MakePageLink { - - my ($pagename, $workspacename, $options, $valueformat) = @_; - - my $url = ""; - - if ($workspacename) { - $url = "?&workspace=" . URLEncode($workspacename) . "&pagename=" . URLEncode($pagename); - } - else { - $url = "?&pagename=" . URLEncode($pagename); - } - - return $url; - - } - - -# # # # # # # # # -# -# $displayvalue = format_number_for_display($rawvalue, $valuetype, $valueformat) -# -# # # # # # # # # - -sub format_number_for_display { - - my ($rawvalue, $valuetype, $valueformat) = @_; - - my ($has_parens, $has_commas); - - my $displayvalue = $rawvalue; - my $valuesubtype = substr($valuetype,1); - - if ($valueformat eq "Auto" || length($valueformat) == 0) { # cases with default format - if ($valuesubtype eq "%") { # will display a % character - $valueformat = "#,##0.0%"; - } - elsif ($valuesubtype eq '$') { - $valueformat = '[$]#,##0.00'; - } - elsif ($valuesubtype eq 'dt') { - $valueformat = $WKCStrings{"defaultformatdt"}; - } - elsif ($valuesubtype eq 'd') { - $valueformat = $WKCStrings{"defaultformatd"}; - } - elsif ($valuesubtype eq 't') { - $valueformat = $WKCStrings{"defaultformatt"}; - } - elsif ($valuesubtype eq 'l') { - $valueformat = 'logical'; - } - else { - $valueformat = "General"; - } - } - - if ($valueformat eq "logical") { # do logical format - return $rawvalue ? $WKCStrings{"displaytrue"} : $WKCStrings{"displayfalse"}; - } - - if ($valueformat eq "hidden") { # do hidden format - return " "; - } - - # Use format - - return format_number_with_format_string($rawvalue, $valueformat); - - } - - -# # # # # # # # # -# -# $juliandate = convert_date_gregorian_to_julian($year, $month, $day) -# -# From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html -# Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). -# Translated from the FORTRAN -# -# I= YEAR -# J= MONTH -# K= DAY -#C -# JD= K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12) -# 2 /12-3*((I+4900+(J-14)/12)/100)/4 -# -# # # # # # # # # - -sub convert_date_gregorian_to_julian { - - my ($year, $month, $day) = @_; - - my $juliandate= $day-32075+int(1461*($year+4800+int(($month-14)/12))/4); - $juliandate += int(367*($month-2-int(($month-14)/12)*12)/12); - $juliandate = $juliandate -int(3*int(($year+4900+int(($month-14)/12))/100)/4); - - return $juliandate; - -} - - -# # # # # # # # # -# -# ($year, $month, $day) = convert_date_julian_to_gregorian($juliandate) -# -# From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html -# Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). -# Translated from the FORTRAN -# -# # # # # # # # # - -sub convert_date_julian_to_gregorian { - - my $juliandate = shift @_; - - my ($L, $N, $I, $J, $K); - - $L = $juliandate+68569; - $N = int(4*$L/146097); - $L = $L-int((146097*$N+3)/4); - $I = int(4000*($L+1)/1461001); - $L = $L-int(1461*$I/4)+31; - $J = int(80*$L/2447); - $K = $L-int(2447*$J/80); - $L = int($J/11); - $J = $J+2-12*$L; - $I = 100*($N-49)+$I+$L; - - return ($I, $J, $K); - -} - - -# * * * * * * * * * * * * * * * * * * * * -# -# Number Formatting code from SocialCalc 1.1.0 -# -# * * * * * * * * * * * * * * * * * * * * - - our %NFStrings = ( -"decimalchar" => ".", -"separatorchar" => ",", -"currencychar" => '$', -"daynames" => "Sunday Monday Tuesday Wednesday Thursday Friday Saturday", -"daynames3" => "Sun Mon Tue Wed Thu Fri Sat ", -"monthnames3" => "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", -"monthnames" => "January February March April May June July August September October November December", - ); - - -# # # # # # # # # -# -# $result = format_number_with_format_string($value, $format_string, $currency_char) -# -# Use a format string to format a numeric value. Returns a string with the result. -# This is a subset of the normal styles accepted by many other spreadsheets, without fractions, E format, and @, -# and with any number of comparison fields and with [style=style-specification] (e.g., [style=color:red]) -# -# # # # # # # # # - - my %allowedcolors = (BLACK => "#000000", BLUE => "#0000FF", CYAN => "#00FFFF", GREEN => "#00FF00", MAGENTA => "#FF00FF", - RED => "#FF0000", WHITE => "#FFFFFF", YELLOW => "#FFFF00"); - - my %alloweddates = (H => "h]", M => "m]", MM => "mm]", "S" => "s]", "SS" => "ss]"); - - my %format_definitions; - my $cmd_copy = 1; - my $cmd_color = 2; - my $cmd_integer_placeholder = 3; - my $cmd_fraction_placeholder = 4; - my $cmd_decimal = 5; - my $cmd_currency = 6; - my $cmd_general = 7; - my $cmd_separator = 8; - my $cmd_date = 9; - my $cmd_comparison = 10; - my $cmd_section = 11; - my $cmd_style = 12; - -sub format_number_with_format_string { - - my ($rawvalue, $format_string, $currency_char) = @_; - - $currency_char ||= '$'; - - my ($op, $operandstr, $fromend, $cval, $operandstrlc); - my ($yr, $mn, $dy, $hrs, $mins, $secs, $ehrs, $emins, $esecs, $ampmstr); - my $result; - - my $value = $rawvalue+0; # get a working copy that's numeric - - my $negativevalue = $value < 0 ? 1 : 0; # determine sign, etc. - $value = -$value if $negativevalue; - my $zerovalue = $value == 0 ? 1 : 0; - - parse_format_string(\%format_definitions, $format_string); # make sure format is parsed - my $thisformat = $format_definitions{$format_string}; # Get format structure - - return "Format error!" unless $thisformat; - - my $section = (scalar @{$thisformat->{sectioninfo}}) - 1; # get number of sections - 1 - - if ($thisformat->{hascomparison}) { # has comparisons - determine which section - $section = 0; # set to which section we will use - my $gotcomparison = 0; # this section has no comparison - for (my $cpos; ;$cpos++) { # scan for comparisons - $op = $thisformat->{operators}->[$cpos]; - $operandstr = $thisformat->{operands}->[$cpos]; # get next operator and operand - if (!$op) { # at end with no match - if ($gotcomparison) { # if comparison but no match - $format_string = "General"; # use default of General - parse_format_string(\%format_definitions, $format_string); - $thisformat = $format_definitions{$format_string}; - $section = 0; - } - last; # if no comparision, matchines on this section - } - if ($op == $cmd_section) { # end of section - if (!$gotcomparison) { # no comparison, so it's a match - last; - } - $gotcomparison = 0; - $section++; # check out next one - next; - } - if ($op == $cmd_comparison) { # found a comparison - do we meet it? - my ($compop, $compval) = split(/:/, $operandstr, 2); - $compval = 0+$compval; - if (($compop eq "<" && $rawvalue < $compval) || - ($compop eq "<=" && $rawvalue <= $compval) || - ($compop eq "=" && $rawvalue == $compval) || - ($compop eq "<>" && $rawvalue != $compval) || - ($compop eq ">=" && $rawvalue >= $compval) || - ($compop eq ">" && $rawvalue > $compval)) { # a match - last; - } - $gotcomparison = 1; - } - } - } - elsif ($section > 0) { # more than one section (separated by ";") - if ($section == 1) { # two sections - if ($negativevalue) { - $negativevalue = 0; # sign will provided by section, not automatically - $section = 1; # use second section for negative values - } - else { - $section = 0; # use first for all others - } - } - elsif ($section == 2) { # three sections - if ($negativevalue) { - $negativevalue = 0; # sign will provided by section, not automatically - $section = 1; # use second section for negative values - } - elsif ($zerovalue) { - $section = 2; # use third section for zero values - } - else { - $section = 0; # use first for positive - } - } - } - - # Get values for our section - my ($sectionstart, $integerdigits, $fractiondigits, $commas, $percent, $thousandssep) = - @{%{$thisformat->{sectioninfo}->[$section]}}{qw(sectionstart integerdigits fractiondigits commas percent thousandssep)}; - - if ($commas > 0) { # scale by thousands - for (my $i=0; $i<$commas; $i++) { - $value /= 1000; - } - } - if ($percent > 0) { # do percent scaling - for (my $i=0; $i<$percent; $i++) { - $value *= 100; - } - } - - my $decimalscale = 1; # cut down to required number of decimal digits - for (my $i=0; $i<$fractiondigits; $i++) { - $decimalscale *= 10; - } - my $scaledvalue = int($value * $decimalscale + 0.5); - $scaledvalue = $scaledvalue / $decimalscale; - - $negativevalue = 0 if ($scaledvalue == 0 && ($fractiondigits || $integerdigits)); # no "-0" unless using multiple sections or General - - my $strvalue = "$scaledvalue"; # convert to string - if ($strvalue =~ m/e/) { # converted to scientific notation - return "$rawvalue"; # Just return plain converted raw value - } - $strvalue =~ m/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/; # get integer and fraction as character arrays - my $integervalue = $1; - $integervalue = "" if ($integervalue == 0); - my @integervalue = split(//, $integervalue); - my $fractionvalue = $2; - $fractionvalue = "" if ($fractionvalue == 0); - my @fractionvalue = split(//, $fractionvalue); - - if ($thisformat->{sectioninfo}->[$section]->{hasdate}) { # there are date placeholders - if ($rawvalue < 0) { # bad date - return "??-???-?? ??:??:??"; - } - my $startval = ($rawvalue-int($rawvalue)) * $seconds_in_a_day; # get date/time parts - my $estartval = $rawvalue * $seconds_in_a_day; # do elapsed time version, too - $hrs = int($startval / $seconds_in_an_hour); - $ehrs = int($estartval / $seconds_in_an_hour); - $startval = $startval - $hrs * $seconds_in_an_hour; - $mins = int($startval / 60); - $emins = int($estartval / 60); - $secs = $startval - $mins * 60; - $decimalscale = 1; # round appropriately depending if there is ss.0 - for (my $i=0; $i<$fractiondigits; $i++) { - $decimalscale *= 10; - } - $secs = int($secs * $decimalscale + 0.5); - $secs = $secs / $decimalscale; - $esecs = int($estartval * $decimalscale + 0.5); - $esecs = $esecs / $decimalscale; - if ($secs >= 60) { # handle round up into next second, minute, etc. - $secs = 0; - $mins++; $emins++; - if ($mins >= 60) { - $mins = 0; - $hrs++; $ehrs++; - if ($hrs >= 24) { - $hrs = 0; - $rawvalue++; - } - } - } - @fractionvalue = split(//, $secs-int($secs)); # for "hh:mm:ss.00" - shift @fractionvalue; shift @fractionvalue; - ($yr, $mn, $dy) = convert_date_julian_to_gregorian(int($rawvalue+$julian_offset)); - - my $minOK; # says "m" can be minutes - my $mspos = $sectionstart; # m scan position in ops - for ( ; ; $mspos++) { # scan for "m" and "mm" to see if any minutes fields, and am/pm - $op = $thisformat->{operators}->[$mspos]; - $operandstr = $thisformat->{operands}->[$mspos]; # get next operator and operand - last unless $op; # don't go past end - last if $op == $cmd_section; - if ($op == $cmd_date) { - if ((lc($operandstr) eq "am/pm" || lc($operandstr) eq "a/p") && !$ampmstr) { - if ($hrs >= 12) { - $hrs -= 12; - $ampmstr = lc($operandstr) eq "a/p" ? "P" : "PM"; - } - else { - $ampmstr = lc($operandstr) eq "a/p" ? "A" : "AM"; - } - $ampmstr = lc $ampmstr if $operandstr !~ m/$ampmstr/; - } - if ($minOK && ($operandstr eq "m" || $operandstr eq "mm")) { - $thisformat->{operands}->[$mspos] .= "in"; # turn into "min" or "mmin" - } - if (substr($operandstr,0,1) eq "h") { - $minOK = 1; # m following h or hh or [h] is minutes not months - } - else { - $minOK = 0; - } - } - elsif ($op != $cmd_copy) { # copying chars can be between h and m - $minOK = 0; - } - } - $minOK = 0; - for (--$mspos; ; $mspos--) { # scan other way for s after m - $op = $thisformat->{operators}->[$mspos]; - $operandstr = $thisformat->{operands}->[$mspos]; # get next operator and operand - last unless $op; # don't go past end - last if $op == $cmd_section; - if ($op == $cmd_date) { - if ($minOK && ($operandstr eq "m" || $operandstr eq "mm")) { - $thisformat->{operands}->[$mspos] .= "in"; # turn into "min" or "mmin" - } - if ($operandstr eq "ss") { - $minOK = 1; # m before ss is minutes not months - } - else { - $minOK = 0; - } - } - elsif ($op != $cmd_copy) { # copying chars can be between ss and m - $minOK = 0; - } - } - } - - my $integerdigits2 = 0; # init counters, etc. - my $integerpos = 0; - my $fractionpos = 0; - my $textcolor = ""; - my $textstyle = ""; - my $separatorchar = $NFStrings{"separatorchar"}; - $separatorchar =~ s/ / /g; - my $decimalchar = $NFStrings{"decimalchar"}; - $decimalchar =~ s/ / /g; - - my $oppos = $sectionstart; - - while ($op = $thisformat->{operators}->[$oppos]) { # execute format - $operandstr = $thisformat->{operands}->[$oppos++]; # get next operator and operand - if ($op == $cmd_copy) { # put char in result - $result .= $operandstr; - } - - elsif ($op == $cmd_color) { # set color - $textcolor = $operandstr; - } - - elsif ($op == $cmd_style) { # set style - $textstyle = $operandstr; - } - - elsif ($op == $cmd_integer_placeholder) { # insert number part - if ($negativevalue) { - $result .= "-"; - $negativevalue = 0; - } - $integerdigits2++; - if ($integerdigits2 == 1) { # first one - if ((scalar @integervalue) > $integerdigits) { # see if integer wider than field - for (;$integerpos < ((scalar @integervalue) - $integerdigits); $integerpos++) { - $result .= $integervalue[$integerpos]; - if ($thousandssep) { # see if this is a separator position - $fromend = (scalar @integervalue) - $integerpos - 1; - if ($fromend > 2 && $fromend % 3 == 0) { - $result .= $separatorchar; - } - } - } - } - } - if ((scalar @integervalue) < $integerdigits - && $integerdigits2 <= $integerdigits - (scalar @integervalue)) { # field is wider than value - if ($operandstr eq "0" || $operandstr eq "?") { # fill with appropriate characters - $result .= $operandstr eq "0" ? "0" : " "; - if ($thousandssep) { # see if this is a separator position - $fromend = $integerdigits - $integerdigits2; - if ($fromend > 2 && $fromend % 3 == 0) { - $result .= $separatorchar; - } - } - } - } - else { # normal integer digit - add it - $result .= $integervalue[$integerpos]; - if ($thousandssep) { # see if this is a separator position - $fromend = (scalar @integervalue) - $integerpos - 1; - if ($fromend > 2 && $fromend % 3 == 0) { - $result .= $separatorchar; - } - } - $integerpos++; - } - } - elsif ($op == $cmd_fraction_placeholder) { # add fraction part of number - if ($fractionpos >= scalar @fractionvalue) { - if ($operandstr eq "0" || $operandstr eq "?") { - $result .= $operandstr eq "0" ? "0" : " "; - } - } - else { - $result .= $fractionvalue[$fractionpos]; - } - $fractionpos++; - } - - elsif ($op == $cmd_decimal) { # decimal point - if ($negativevalue) { - $result .= "-"; - $negativevalue = 0; - } - $result .= $decimalchar; - } - - elsif ($op == $cmd_currency) { # currency symbol - if ($negativevalue) { - $result .= "-"; - $negativevalue = 0; - } - $result .= $operandstr; - } - - elsif ($op == $cmd_general) { # insert "General" conversion - - # *** Cut down number of significant digits to avoid floating point artifacts matching JavaScript: - - if ($value != 0) { # only if non-zero - my $factor = 0.43429448190325181667 * log($value); # get magnitude as a power of 10 the same way as JavaScript - if ($factor >= 0) { # as an integer (truncating down) - $factor = int($factor); - } - else { - my $mfactor = -int(-$factor); - $factor = $factor == $mfactor ? $factor : $mfactor - 1; - } - $factor = 10 ** (13-$factor); # turn into scaling factor - $value = int($factor * $value + 0.5) / $factor; # scale positive value, round, undo scaling - } - - if ($negativevalue) { - $result .= "-"; - } - $strvalue = "$value"; # convert original value to string - if ($strvalue =~ m/e/) { # converted to scientific notation - $result .= "$strvalue"; - next; - } - $strvalue =~ m/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/; - $integervalue = $1; - $integervalue = "" if ($integervalue == 0); - @integervalue = split(//, $integervalue); - $fractionvalue = $2; - $fractionvalue = "" if ($fractionvalue == 0); - @fractionvalue = split(//, $fractionvalue); - $integerpos = 0; - $fractionpos = 0; - if (scalar @integervalue) { - for (;$integerpos < scalar @integervalue; $integerpos++) { - $result .= $integervalue[$integerpos]; - if ($thousandssep) { # see if this is a separator position - $fromend = (scalar @integervalue) - $integerpos - 1; - if ($fromend > 2 && $fromend % 3 == 0) { - $result .= $separatorchar; - } - } - } - } - else { - $result .= "0"; - } - if (scalar @fractionvalue) { - $result .= $decimalchar; - for (;$fractionpos < scalar @fractionvalue; $fractionpos++) { - $result .= $fractionvalue[$fractionpos]; - } - } - } - - elsif ($op == $cmd_date) { # date placeholder - $operandstrlc = lc $operandstr; - if ($operandstrlc eq "y" || $operandstrlc eq "yy") { - $result .= substr("$yr",-2); - } - elsif ($operandstrlc eq "yyyy") { - $result .= "$yr"; - } - elsif ($operandstrlc eq "d") { - $result .= "$dy"; - } - elsif ($operandstrlc eq "dd") { - $cval = 1000 + $dy; - $result .= substr("$cval", -2); - } - elsif ($operandstrlc eq "ddd") { - $cval = int($rawvalue+6) % 7; - $result .= (split(/ /, $NFStrings{"daynames3"}))[$cval]; - } - elsif ($operandstrlc eq "dddd") { - $cval = int($rawvalue+6) % 7; - $result .= (split(/ /, $NFStrings{"daynames"}))[$cval]; - } - elsif ($operandstrlc eq "m") { - $result .= "$mn"; - } - elsif ($operandstrlc eq "mm") { - $cval = 1000 + $mn; - $result .= substr("$cval", -2); - } - elsif ($operandstrlc eq "mmm") { - $result .= (split(/ /, $NFStrings{"monthnames3"}))[$mn-1]; - } - elsif ($operandstrlc eq "mmmm") { - $result .= (split(/ /, $NFStrings{"monthnames"}))[$mn-1]; - } - elsif ($operandstrlc eq "mmmmm") { - $result .= substr((split(/ /, $NFStrings{"monthnames"}))[$mn-1], 0, 1); - } - elsif ($operandstrlc eq "h") { - $result .= "$hrs"; - } - elsif ($operandstrlc eq "h]") { - $result .= "$ehrs"; - } - elsif ($operandstrlc eq "mmin") { - $cval = 1000 + $mins; - $result .= substr("$cval", -2); - } - elsif ($operandstrlc eq "mm]") { - if ($emins < 100) { - $cval = 1000 + $emins; - $result .= substr("$cval", -2); - } - else { - $result .= "$emins"; - } - } - elsif ($operandstrlc eq "min") { - $result .= "$mins"; - } - elsif ($operandstrlc eq "m]") { - $result .= "$emins"; - } - elsif ($operandstrlc eq "hh") { - $cval = 1000 + $hrs; - $result .= substr("$cval", -2); - } - elsif ($operandstrlc eq "s") { - $cval = int($secs); - $result .= "$cval"; - } - elsif ($operandstrlc eq "ss") { - $cval = 1000 + int($secs); - $result .= substr("$cval", -2); - } - elsif ($operandstrlc eq "am/pm" || $operandstrlc eq "a/p") { - $result .= $ampmstr; - } - elsif ($operandstrlc eq "ss]") { - if ($esecs < 100) { - $cval = 1000 + int($esecs); - $result .= substr("$cval", -2); - } - else { - $cval = int($esecs); - $result = "$cval"; - } - } - } - - elsif ($op == $cmd_section) { # end of section - last; - } - - elsif ($op == $cmd_comparison) { # ignore - next; - } - - else { - $result .= "!! Parse error !!"; - } - } - - if ($textcolor) { - $result = qq!$result!; - } - if ($textstyle) { - $result = qq!$result!; - } - - return $result; -} - -# # # # # # # # # -# -# parse_format_string(\%format_defs, $format_string) -# -# Takes a format string (e.g., "#,##0.00_);(#,##0.00)") and fills in %foramt_defs with the parsed info -# -# %format_defs -# {"#,##0.0"}->{} # elements in the hash are one hash for each format -# {operators}->[] # array of operators from parsing the format string (each a number) -# {operands}->[] # array of corresponding operators (each usually a string) -# {sectioninfo}->[] # one hash for each section of the format -# {start} -# {integerdigits} -# {fractiondigits} -# {commas} -# {percent} -# {thousandssep} -# {hasdates} -# {hascomparison} # true if any section has [<100], etc. -# -# # # # # # # # # - -sub parse_format_string { - - my ($format_defs, $format_string) = @_; - - return if ($format_defs->{$format_string}); # already defined - nothing to do - - my $thisformat = {operators => [], operands => [], sectioninfo => [{}]}; # create info structure for this format - $format_defs->{$format_string} = $thisformat; # add to other format definitions - - my $section = 0; # start with section 0 - my $sectioninfo = $thisformat->{sectioninfo}->[$section]; # get reference to info for current section - $sectioninfo->{sectionstart} = 0; # position in operands that starts this section - - my @formatchars = split //, $format_string; # break into individual characters - - my $integerpart = 1; # start out in integer part - my $lastwasinteger; # last char was an integer placeholder - my $lastwasslash; # last char was a backslash - escaping following character - my $lastwasasterisk; # repeat next char - my $lastwasunderscore; # last char was _ which picks up following char for width - my ($inquote, $quotestr); # processing a quoted string - my ($inbracket, $bracketstr, $cmd); # processing a bracketed string - my ($ingeneral, $gpos); # checks for characters "General" - my $ampmstr; # checks for characters "A/P" and "AM/PM" - my $indate; # keeps track of date/time placeholders - - foreach my $ch (@formatchars) { # parse - if ($inquote) { - if ($ch eq '"') { - $inquote = 0; - push @{$thisformat->{operators}}, $cmd_copy; - push @{$thisformat->{operands}}, $quotestr; - next; - } - $quotestr .= $ch; - next; - } - if ($inbracket) { - if ($ch eq ']') { - $inbracket = 0; - ($cmd, $bracketstr) = parse_format_bracket($bracketstr); - if ($cmd == $cmd_separator) { - $sectioninfo->{thousandssep} = 1; # explicit [,] - next; - } - if ($cmd == $cmd_date) { - $sectioninfo->{hasdate} = 1; - } - if ($cmd == $cmd_comparison) { - $thisformat->{hascomparison} = 1; - } - push @{$thisformat->{operators}}, $cmd; - push @{$thisformat->{operands}}, $bracketstr; - next; - } - $bracketstr .= $ch; - next; - } - if ($lastwasslash) { - push @{$thisformat->{operators}}, $cmd_copy; - push @{$thisformat->{operands}}, $ch; - $lastwasslash = 0; - next; - } - if ($lastwasasterisk) { - push @{$thisformat->{operators}}, $cmd_copy; - push @{$thisformat->{operands}}, $ch x 5; - $lastwasasterisk = 0; - next; - } - if ($lastwasunderscore) { - push @{$thisformat->{operators}}, $cmd_copy; - push @{$thisformat->{operands}}, " "; - $lastwasunderscore = 0; - next; - } - if ($ingeneral) { - if (substr("general", $ingeneral, 1) eq lc $ch) { - $ingeneral++; - if ($ingeneral == 7) { - push @{$thisformat->{operators}}, $cmd_general; - push @{$thisformat->{operands}}, $ch; - $ingeneral = 0; - } - next; - } - $ingeneral = 0; - } - if ($indate) { # last char was part of a date placeholder - if (substr($indate,0,1) eq $ch) { # another of the same char - $indate .= $ch; # accumulate it - next; - } - push @{$thisformat->{operators}}, $cmd_date; # something else, save date info - push @{$thisformat->{operands}}, $indate; - $sectioninfo->{hasdate} = 1; - $indate = ""; - } - if ($ampmstr) { - $ampmstr .= $ch; - if ("am/pm" =~ m/^$ampmstr/i || "a/p" =~ m/^$ampmstr/i) { - if (("am/pm" eq lc $ampmstr) || ("a/p" eq lc $ampmstr)) { - push @{$thisformat->{operators}}, $cmd_date; - push @{$thisformat->{operands}}, $ampmstr; - $ampmstr = ""; - } - next; - } - $ampmstr = ""; - } - if ($ch eq "#" || $ch eq "0" || $ch eq "?") { # placeholder - if ($integerpart) { - $sectioninfo->{integerdigits}++; - if ($sectioninfo->{commas}) { # comma inside of integer placeholders - $sectioninfo->{thousandssep} = 1; # any number is thousands separator - $sectioninfo->{commas} = 0; # reset count of "thousand" factors - } - $lastwasinteger = 1; - push @{$thisformat->{operators}}, $cmd_integer_placeholder; - push @{$thisformat->{operands}}, $ch; - } - else { - $sectioninfo->{fractiondigits}++; - push @{$thisformat->{operators}}, $cmd_fraction_placeholder; - push @{$thisformat->{operands}}, $ch; - } - } - elsif ($ch eq ".") { # decimal point - $lastwasinteger = 0; - push @{$thisformat->{operators}}, $cmd_decimal; - push @{$thisformat->{operands}}, $ch; - $integerpart = 0; - } - elsif ($ch eq '$') { # currency char - $lastwasinteger = 0; - push @{$thisformat->{operators}}, $cmd_currency; - push @{$thisformat->{operands}}, $ch; - } - elsif ($ch eq ",") { - if ($lastwasinteger) { - $sectioninfo->{commas}++; - } - else { - push @{$thisformat->{operators}}, $cmd_copy; - push @{$thisformat->{operands}}, $ch; - } - } - elsif ($ch eq "%") { - $lastwasinteger = 0; - $sectioninfo->{percent}++; - push @{$thisformat->{operators}}, $cmd_copy; - push @{$thisformat->{operands}}, $ch; - } - elsif ($ch eq '"') { - $lastwasinteger = 0; - $inquote = 1; - $quotestr = ""; - } - elsif ($ch eq '[') { - $lastwasinteger = 0; - $inbracket = 1; - $bracketstr = ""; - } - elsif ($ch eq '\\') { - $lastwasslash = 1; - $lastwasinteger = 0; - } - elsif ($ch eq '*') { - $lastwasasterisk = 1; - $lastwasinteger = 0; - } - elsif ($ch eq '_') { - $lastwasunderscore = 1; - $lastwasinteger = 0; - } - elsif ($ch eq ";") { - $section++; # start next section - $thisformat->{sectioninfo}->[$section] = {}; # create a new section - $sectioninfo = $thisformat->{sectioninfo}->[$section]; # set to point to the new section - $sectioninfo->{sectionstart} = 1 + scalar @{$thisformat->{operators}}; # remember where it starts - $integerpart = 1; # reset for new section - $lastwasinteger = 0; - push @{$thisformat->{operators}}, $cmd_section; - push @{$thisformat->{operands}}, $ch; - } - elsif ((lc $ch) eq "g") { - $ingeneral = 1; - $lastwasinteger = 0; - } - elsif ((lc $ch) eq "a") { - $ampmstr = $ch; - $lastwasinteger = 0; - } - elsif ($ch =~ m/[dmyhHs]/) { - $indate = $ch; - } - else { - $lastwasinteger = 0; - push @{$thisformat->{operators}}, $cmd_copy; - push @{$thisformat->{operands}}, $ch; - } - } - - if ($indate) { # last char was part of unsaved date placeholder - push @{$thisformat->{operators}}, $cmd_date; # save what we got - push @{$thisformat->{operands}}, $indate; - $sectioninfo->{hasdate} = 1; - } - - return; - - } - - -# # # # # # # # # -# -# ($operator, $operand) = parse_format_bracket($bracketstr) -# -# # # # # # # # # - -sub parse_format_bracket { - - my $bracketstr = shift @_; - - my ($operator, $operand); - - if (substr($bracketstr, 0, 1) eq '$') { # currency - $operator = $cmd_currency; - if ($bracketstr =~ m/^\$(.+?)(\-.+?){0,1}$/) { - $operand = $1 || $NFStrings{"currencychar"} || '$'; - } - else { - $operand = substr($bracketstr,1) || $NFStrings{"currencychar"} || '$'; - } - } - elsif ($bracketstr eq '?$') { - $operator = $cmd_currency; - $operand = '[?$]'; - } - elsif ($allowedcolors{uc $bracketstr}) { - $operator = $cmd_color; - $operand = $allowedcolors{uc $bracketstr}; - } - elsif ($bracketstr =~ m/^style=([^"]*)$/) { # [style=...] - $operator = $cmd_style; - $operand = $1; - } - elsif ($bracketstr eq ",") { - $operator = $cmd_separator; - $operand = $bracketstr; - } - elsif ($alloweddates{uc $bracketstr}) { - $operator = $cmd_date; - $operand = $alloweddates{uc $bracketstr}; - } - elsif ($bracketstr =~ m/^[<>=]/) { # comparison operator - $bracketstr =~ m/^([<>=]+)(.+)$/; # split operator and value - $operator = $cmd_comparison; - $operand = "$1:$2"; - } - else { # unknown bracket - $operator = $cmd_copy; - $operand = "[$bracketstr]"; - } - - return ($operator, $operand); - - } - diff --git a/DeveloperAdoption/public/socialcalc/formatnumber2.js b/DeveloperAdoption/public/socialcalc/formatnumber2.js deleted file mode 100644 index 0cf3f94..0000000 --- a/DeveloperAdoption/public/socialcalc/formatnumber2.js +++ /dev/null @@ -1,950 +0,0 @@ -// -/* -// SocialCalc Number Formatting Library -// -// Part of the SocialCalc package. -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - -SocialCalc.FormatNumber = {}; - -SocialCalc.FormatNumber.format_definitions = {}; // Parsed formats are stored here globally - -// Most constants that are often customized for localization are in the SocialCalc.Constants module. -// If you use this module standalone, provide at least the "FormatNumber" values. -// - -// The following values may be customized externally for further localization of the format definitions themselves, -// but that would make them incompatible with other uses and is discouraged. -// - -SocialCalc.FormatNumber.separatorchar = ","; -SocialCalc.FormatNumber.decimalchar = "."; -SocialCalc.FormatNumber.daynames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; -SocialCalc.FormatNumber.daynames3 = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; -SocialCalc.FormatNumber.monthnames3 = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; -SocialCalc.FormatNumber.monthnames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", - "October", "November", "December"]; - -SocialCalc.FormatNumber.allowedcolors = - {BLACK: "#000000", BLUE: "#0000FF", CYAN: "#00FFFF", GREEN: "#00FF00", MAGENTA: "#FF00FF", - RED: "#FF0000", WHITE: "#FFFFFF", YELLOW: "#FFFF00"}; - -SocialCalc.FormatNumber.alloweddates = - {H: "h]", M: "m]", MM: "mm]", S: "s]", SS: "ss]"}; - -// Other constants - -SocialCalc.FormatNumber.commands = - {copy: 1, color: 2, integer_placeholder: 3, fraction_placeholder: 4, decimal: 5, - currency: 6, general:7, separator: 8, date: 9, comparison: 10, section: 11, style: 12}; - -SocialCalc.FormatNumber.datevalues = {julian_offset: 2415019, seconds_in_a_day: 24 * 60 * 60, seconds_in_an_hour: 60 * 60}; - -/* ******************* - - result = SocialCalc.FormatNumber.formatNumberWithFormat = function(rawvalue, format_string, currency_char) - -************************* */ - -SocialCalc.FormatNumber.formatNumberWithFormat = function(rawvalue, format_string, currency_char) { - - var scc = SocialCalc.Constants; - var scfn = SocialCalc.FormatNumber; - - var op, operandstr, fromend, cval, operandstrlc; - var startval, estartval; - var hrs, mins, secs, ehrs, emins, esecs, ampmstr, ymd; - var minOK, mpos; - var result=""; - var thisformat; - var section, gotcomparison, compop, compval, cpos, oppos; - var sectioninfo; - var i, decimalscale, scaledvalue, strvalue, strparts, integervalue, fractionvalue; - var integerdigits2, integerpos, fractionpos, textcolor, textstyle, separatorchar, decimalchar; - var value; // working copy to change sign, etc. - - rawvalue = rawvalue-0; // make sure a number - value = rawvalue; - if (!isFinite(value)) return "NaN"; - - var negativevalue = value < 0 ? 1 : 0; // determine sign, etc. - if (negativevalue) value = -value; - var zerovalue = value == 0 ? 1 : 0; - - currency_char = currency_char || scc.FormatNumber_DefaultCurrency; - - scfn.parse_format_string(scfn.format_definitions, format_string); // make sure format is parsed - thisformat = scfn.format_definitions[format_string]; // Get format structure - - if (!thisformat) throw "Format not parsed error!"; - - section = thisformat.sectioninfo.length - 1; // get number of sections - 1 - - if (thisformat.hascomparison) { // has comparisons - determine which section - section = 0; // set to which section we will use - gotcomparison = 0; // this section has no comparison - for (cpos=0; ;cpos++) { // scan for comparisons - op = thisformat.operators[cpos]; - operandstr = thisformat.operands[cpos]; // get next operator and operand - if (!op) { // at end with no match - if (gotcomparison) { // if comparison but no match - format_string = "General"; // use default of General - scfn.parse_format_string(scfn.format_definitions, format_string); - thisformat = scfn.format_definitions[format_string]; - section = 0; - } - break; // if no comparision, matches on this section - } - if (op == scfn.commands.section) { // end of section - if (!gotcomparison) { // no comparison, so it's a match - break; - } - gotcomparison = 0; - section++; // check out next one - continue; - } - if (op == scfn.commands.comparison) { // found a comparison - do we meet it? - i=operandstr.indexOf(":"); - compop=operandstr.substring(0,i); - compval=operandstr.substring(i+1)-0; - if ((compop == "<" && rawvalue < compval) || - (compop == "<=" && rawvalue <= compval) || - (compop == "=" && rawvalue == compval) || - (compop == "<>" && rawvalue != compval) || - (compop == ">=" && rawvalue >= compval) || - (compop == ">" && rawvalue > compval)) { // a match - break; - } - gotcomparison = 1; - } - } - } - else if (section > 0) { // more than one section (separated by ";") - if (section == 1) { // two sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } - else { - section = 0; // use first for all others - } - } - else if (section == 2) { // three sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } - else if (zerovalue) { - section = 2; // use third section for zero values - } - else { - section = 0; // use first for positive - } - } - } - - sectioninfo = thisformat.sectioninfo[section]; // look at values for our section - - if (sectioninfo.commas > 0) { // scale by thousands - for (i=0; i 0) { // do percent scaling - for (i=0; i=0) { // converted to scientific notation - return rawvalue+""; // Just return plain converted raw value - } - - strparts=strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - if (!strparts) return "NaN"; // if not a number - integervalue = strparts[1]; - if (!integervalue || integervalue=="0") integervalue=""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - - if (sectioninfo.hasdate) { // there are date placeholders - if (rawvalue < 0) { // bad date - return "??-???-?? ??:??:??"; - } - startval = (rawvalue-Math.floor(rawvalue)) * scfn.datevalues.seconds_in_a_day; // get date/time parts - estartval = rawvalue * scfn.datevalues.seconds_in_a_day; // do elapsed time version, too - hrs = Math.floor(startval / scfn.datevalues.seconds_in_an_hour); - ehrs = Math.floor(estartval / scfn.datevalues.seconds_in_an_hour); - startval = startval - hrs * scfn.datevalues.seconds_in_an_hour; - mins = Math.floor(startval / 60); - emins = Math.floor(estartval / 60); - secs = startval - mins * 60; - decimalscale = 1; // round appropriately depending if there is ss.0 - for (i=0; i= 60) { // handle round up into next second, minute, etc. - secs = 0; - mins++; emins++; - if (mins >= 60) { - mins = 0; - hrs++; ehrs++; - if (hrs >= 24) { - hrs = 0; - rawvalue++; - } - } - } - fractionvalue = (secs-Math.floor(secs))+""; // for "hh:mm:ss.000" - fractionvalue = fractionvalue.substring(2); // skip "0." - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian(Math.floor(rawvalue+scfn.datevalues.julian_offset)); - - minOK = 0; // says "m" can be minutes if true - mspos = sectioninfo.sectionstart; // m scan position in ops - for ( ; ; mspos++) { // scan for "m" and "mm" to see if any minutes fields, and am/pm - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op==scfn.commands.section) break; - if (op==scfn.commands.date) { - if ((operandstr.toLowerCase()=="am/pm" || operandstr.toLowerCase()=="a/p") && !ampmstr) { - if (hrs >= 12) { - hrs -= 12; - ampmstr = operandstr.toLowerCase()=="a/p" ? scc.s_FormatNumber_pm1 : scc.s_FormatNumber_pm; // "P" : "PM"; - } - else { - ampmstr = operandstr.toLowerCase()=="a/p" ? scc.s_FormatNumber_am1 : scc.s_FormatNumber_am; // "A" : "AM"; - } - if (operandstr.indexOf(ampmstr)<0) - ampmstr = ampmstr.toLowerCase(); // have case match case in format - } - if (minOK && (operandstr=="m" || operandstr=="mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr.charAt(0)=="h") { - minOK = 1; // m following h or hh or [h] is minutes not months - } - else { - minOK = 0; - } - } - else if (op!=scfn.commands.copy) { // copying chars can be between h and m - minOK = 0; - } - } - minOK = 0; - for (--mspos; ; mspos--) { // scan other way for s after m - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op==scfn.commands.section) break; - if (op==scfn.commands.date) { - if (minOK && (operandstr=="m" || operandstr=="mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr=="ss") { - minOK = 1; // m before ss is minutes not months - } - else { - minOK = 0; - } - } - else if (op!=scfn.commands.copy) { // copying chars can be between ss and m - minOK = 0; - } - } - } - - integerdigits2 = 0; // init counters, etc. - integerpos = 0; - fractionpos = 0; - textcolor = ""; - textstyle = ""; - separatorchar = scc.FormatNumber_separatorchar; - if (separatorchar.indexOf(" ")>=0) separatorchar = separatorchar.replace(/ /g, " "); - decimalchar = scc.FormatNumber_decimalchar; - if (decimalchar.indexOf(" ")>=0) decimalchar = decimalchar.replace(/ /g, " "); - - oppos = sectioninfo.sectionstart; - - while (op = thisformat.operators[oppos]) { // execute format - operandstr = thisformat.operands[oppos++]; // get next operator and operand - - if (op == scfn.commands.copy) { // put char in result - result += operandstr; - } - - else if (op == scfn.commands.color) { // set color - textcolor = operandstr; - } - - else if (op == scfn.commands.style) { // set style - textstyle = operandstr; - } - - else if (op == scfn.commands.integer_placeholder) { // insert number part - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - integerdigits2++; - if (integerdigits2 == 1) { // first one - if (integervalue.length > sectioninfo.integerdigits) { // see if integer wider than field - for (;integerpos < (integervalue.length - sectioninfo.integerdigits); integerpos++) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - } - if (integervalue.length < sectioninfo.integerdigits - && integerdigits2 <= sectioninfo.integerdigits - integervalue.length) { // field is wider than value - if (operandstr == "0" || operandstr == "?") { // fill with appropriate characters - result += operandstr == "0" ? "0" : " "; - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = sectioninfo.integerdigits - integerdigits2; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - else { // normal integer digit - add it - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - integerpos++; - } - } - else if (op == scfn.commands.fraction_placeholder) { // add fraction part of number - if (fractionpos >= fractionvalue.length) { - if (operandstr == "0" || operandstr == "?") { - result += operandstr == "0" ? "0" : " "; - } - } - else { - result += fractionvalue.charAt(fractionpos); - } - fractionpos++; - } - - else if (op == scfn.commands.decimal) { // decimal point - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += decimalchar; - } - - else if (op == scfn.commands.currency) { // currency symbol - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += operandstr; - } - - else if (op == scfn.commands.general) { // insert "General" conversion - - // *** Cut down number of significant digits to avoid floating point artifacts: - - if (value!=0) { // only if non-zero - var factor = Math.floor(Math.LOG10E * Math.log(value)); // get integer magnitude as a power of 10 - factor = Math.pow(10, 13-factor); // turn into scaling factor - value = Math.floor(factor * value + 0.5)/factor; // scale positive value, round, undo scaling - if (!isFinite(value)) return "NaN"; - } - if (negativevalue) { - result += "-"; - } - strvalue = value+""; // convert original value to string - if (strvalue.indexOf("e")>=0) { // converted to scientific notation - result += strvalue; - continue; - } - strparts=strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - integervalue = strparts[1]; - if (!integervalue || integervalue=="0") integervalue=""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - integerpos = 0; - fractionpos = 0; - if (integervalue.length) { - for (;integerpos < integervalue.length; integerpos++) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - else { - result += "0"; - } - if (fractionvalue.length) { - result += decimalchar; - for (;fractionpos < fractionvalue.length; fractionpos++) { - result += fractionvalue.charAt(fractionpos); - } - } - } - else if (op==scfn.commands.date) { // date placeholder - operandstrlc = operandstr.toLowerCase(); - if (operandstrlc=="y" || operandstrlc=="yy") { - result += (ymd.year+"").substring(2); - } - else if (operandstrlc=="yyyy") { - result += ymd.year+""; - } - else if (operandstrlc=="d") { - result += ymd.day+""; - } - else if (operandstrlc=="dd") { - cval = 1000 + ymd.day; - result += (cval+"").substr(2); - } - else if (operandstrlc=="ddd") { - cval = Math.floor(rawvalue+6) % 7; - result += scc.s_FormatNumber_daynames3[cval]; - } - else if (operandstrlc=="dddd") { - cval = Math.floor(rawvalue+6) % 7; - result += scc.s_FormatNumber_daynames[cval]; - } - else if (operandstrlc=="m") { - result += ymd.month+""; - } - else if (operandstrlc=="mm") { - cval = 1000 + ymd.month; - result += (cval+"").substr(2); - } - else if (operandstrlc=="mmm") { - result += scc.s_FormatNumber_monthnames3[ymd.month-1]; - } - else if (operandstrlc=="mmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month-1]; - } - else if (operandstrlc=="mmmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month-1].charAt(0); - } - else if (operandstrlc=="h") { - result += hrs+""; - } - else if (operandstrlc=="h]") { - result += ehrs+""; - } - else if (operandstrlc=="mmin") { - cval = (1000 + mins)+""; - result += cval.substr(2); - } - else if (operandstrlc=="mm]") { - if (emins < 100) { - cval = (1000 + emins)+""; - result += cval.substr(2); - } - else { - result += emins+""; - } - } - else if (operandstrlc=="min") { - result += mins+""; - } - else if (operandstrlc=="m]") { - result += emins+""; - } - else if (operandstrlc=="hh") { - cval = (1000 + hrs)+""; - result += cval.substr(2); - } - else if (operandstrlc=="s") { - cval = Math.floor(secs); - result += cval+""; - } - else if (operandstrlc=="ss") { - cval = (1000 + Math.floor(secs))+""; - result += cval.substr(2); - } - else if (operandstrlc=="am/pm" || operandstrlc=="a/p") { - result += ampmstr; - } - else if (operandstrlc=="ss]") { - if (esecs < 100) { - cval = (1000 + Math.floor(esecs))+""; - result += cval.substr(2); - } - else { - cval = Math.floor(esecs); - result += cval+""; - } - } - } - else if (op == scfn.commands.section) { // end of section - break; - } - - else if (op == scfn.commands.comparison) { // ignore - continue; - } - - else { - result += "!! Parse error !!"; - } - } - - if (textcolor) { - result = ''+result+''; - } - if (textstyle) { - result = ''+result+''; - } - - return result; - - }; - -/* ******************* - - SocialCalc.FormatNumber.parse_format_string(format_defs, format_string) - - Takes a format string (e.g., "#,##0.00_);(#,##0.00)") and fills in format_defs with the parsed info - - format_defs - ["#,##0.0"]->{} - elements in the hash are one hash for each format - .operators->[] - array of operators from parsing the format string (each a number) - .operands->[] - array of corresponding operators (each usually a string) - .sectioninfo->[] - one hash for each section of the format - .start - .integerdigits - .fractiondigits - .commas - .percent - .thousandssep - .hasdates - .hascomparison - true if any section has [<100], etc. - -************************* */ - -SocialCalc.FormatNumber.parse_format_string = function(format_defs, format_string) { - - var scfn = SocialCalc.FormatNumber; - - var thisformat, section, sectionfinfo; - var integerpart = 1; // start out in integer part - var lastwasinteger; // last char was an integer placeholder - var lastwasslash; // last char was a backslash - escaping following character - var lastwasasterisk; // repeat next char - var lastwasunderscore; // last char was _ which picks up following char for width - var inquote, quotestr; // processing a quoted string - var inbracket, bracketstr, bracketdata; // processing a bracketed string - var ingeneral, gpos; // checks for characters "General" - var ampmstr, part; // checks for characters "A/P" and "AM/PM" - var indate; // keeps track of date/time placeholders - var chpos; // character position being looked at - var ch; // character being looked at - - if (format_defs[format_string]) return; // already defined - nothing to do - - thisformat = {operators: [], operands: [], sectioninfo: [{}]}; // create info structure for this format - format_defs[format_string] = thisformat; // add to other format definitions - - section = 0; // start with section 0 - sectioninfo = thisformat.sectioninfo[section]; // get reference to info for current section - sectioninfo.sectionstart = 0; // position in operands that starts this section - sectioninfo.integerdigits = 0; // number of integer-part placeholders - sectioninfo.fractiondigits = 0; // fraction placeholders - sectioninfo.commas = 0; // commas encountered, to handle scaling - sectioninfo.percent = 0; // times to scale by 100 - - for (chpos=0; chpos=0) { - indate = ch; - } - else { - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } - } - - if (indate) { // last char was part of unsaved date placeholder - thisformat.operators.push(scfn.commands.date); - thisformat.operands.push(indate); - sectioninfo.hasdate = 1; - } - - return; - - } - - -/* ******************* - - bracketdata = SocialCalc.FormatNumber.parse_format_bracket(bracketstr) - - Takes a bracket contents (e.g., "RED", ">10") and returns an operator and operand - - bracketdata->{} - .operator - .operand - -************************* */ - -SocialCalc.FormatNumber.parse_format_bracket = function(bracketstr) { - - var scfn = SocialCalc.FormatNumber; - var scc = SocialCalc.Constants; - - var bracketdata={}; - var parts; - - if (bracketstr.charAt(0)=='$') { // currency - bracketdata.operator = scfn.commands.currency; - parts=bracketstr.match(/^\$(.+?)(\-.+?){0,1}$/); - if (parts) { - bracketdata.operand = parts[1] || scc.FormatNumber_defaultCurrency || '$'; - } - else { - bracketdata.operand = bracketstr.substring(1) || scc.FormatNumber_defaultCurrency || '$'; - } - } - else if (bracketstr=='?$') { - bracketdata.operator = scfn.commands.currency; - bracketdata.operand = '[?$]'; - } - else if (scfn.allowedcolors[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.color; - bracketdata.operand = scfn.allowedcolors[bracketstr.toUpperCase()]; - } - else if (parts=bracketstr.match(/^style=([^"]*)$/)) { // [style=...] - bracketdata.operator = scfn.commands.style; - bracketdata.operand = parts[1]; - } - else if (bracketstr==",") { - bracketdata.operator = scfn.commands.separator; - bracketdata.operand = bracketstr; - } - else if (scfn.alloweddates[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.date; - bracketdata.operand = scfn.alloweddates[bracketstr.toUpperCase()]; - } - else if (parts=bracketstr.match(/^[<>=]/)) { // comparison operator - parts=bracketstr.match(/^([<>=]+)(.+)$/); // split operator and value - bracketdata.operator = scfn.commands.comparison; - bracketdata.operand = parts[1]+":"+parts[2]; - } - else { // unknown bracket - bracketdata.operator = scfn.commands.copy; - bracketdata.operand = "["+bracketstr+"]"; - } - - return bracketdata; - - } - -/* ******************* - - juliandate = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, month, day) - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - - I= YEAR - J= MONTH - K= DAY -C - JD= K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12) - 2 /12-3*((I+4900+(J-14)/12)/100)/4 - -************************* */ - -SocialCalc.FormatNumber.convert_date_gregorian_to_julian = function(year, month, day) { - - var juliandate; - - juliandate = day-32075+SocialCalc.intFunc(1461*(year+4800+SocialCalc.intFunc((month-14)/12))/4); - juliandate += SocialCalc.intFunc(367*(month-2-SocialCalc.intFunc((month-14)/12)*12)/12); - juliandate = juliandate - SocialCalc.intFunc(3*SocialCalc.intFunc((year+4900+SocialCalc.intFunc((month-14)/12))/100)/4); - - return juliandate; - - } - - -/* ******************* - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian(juliandate) - - ymd->{} - .year - .month - .day - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - -************************* */ - -SocialCalc.FormatNumber.convert_date_julian_to_gregorian = function(juliandate) { - - var L, N, I, J, K; - - L = juliandate+68569; - N = Math.floor(4*L/146097); - L = L-Math.floor((146097*N+3)/4); - I = Math.floor(4000*(L+1)/1461001); - L = L-Math.floor(1461*I/4)+31; - J = Math.floor(80*L/2447); - K = L-Math.floor(2447*J/80); - L = Math.floor(J/11); - J = J+2-12*L; - I = 100*(N-49)+I+L; - - return {year:I, month:J, day:K}; - - } - -SocialCalc.intFunc = function(n) { - if (n < 0) { - return -Math.floor(-n); - } - else { - return Math.floor(n); - } - } - diff --git a/DeveloperAdoption/public/socialcalc/formula1.js b/DeveloperAdoption/public/socialcalc/formula1.js deleted file mode 100644 index 108b3fc..0000000 --- a/DeveloperAdoption/public/socialcalc/formula1.js +++ /dev/null @@ -1,4755 +0,0 @@ -// -/* -// SocialCalc Spreadsheet Formula Library -// -// Part of the SocialCalc package -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - // In any case, requires SocialCalc.Constants. - -SocialCalc.Formula = {}; - -// -// Formula constants for parsing: -// - - SocialCalc.Formula.ParseState = {num: 1, alpha: 2, coord: 3, string: 4, stringquote: 5, numexp1: 6, numexp2: 7, alphanumeric: 8, specialvalue:9}; - - SocialCalc.Formula.TokenType = {num: 1, coord: 2, op: 3, name: 4, error: 5, string: 6, space: 7}; - - SocialCalc.Formula.CharClass = {num: 1, numstart: 2, op: 3, eof: 4, alpha: 5, incoord: 6, error: 7, quote: 8, space: 9, specialstart: 10}; - - SocialCalc.Formula.CharClassTable = { - " ": 9, "!": 3, '"': 8, "#": 10, "$":6, "%":3, "&":3, "(": 3, ")": 3, "*": 3, "+": 3, ",": 3, "-": 3, ".": 2, "/": 3, - "0": 1, "1": 1, "2": 1, "3": 1, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "9": 1, - ":": 3, "<": 3, "=": 3, ">": 3, - "A": 5, "B": 5, "C": 5, "D": 5, "E": 5, "F": 5, "G": 5, "H": 5, "I": 5, "J": 5, "K": 5, "L": 5, "M": 5, "N": 5, - "O": 5, "P": 5, "Q": 5, "R": 5, "S": 5, "T": 5, "U": 5, "V": 5, "W": 5, "X": 5, "Y": 5, "Z": 5, - "^": 3, "_": 5, - "a": 5, "b": 5, "c": 5, "d": 5, "e": 5, "f": 5, "g": 5, "h": 5, "i": 5, "j": 5, "k": 5, "l": 5, "m": 5, "n": 5, - "o": 5, "p": 5, "q": 5, "r": 5, "s": 5, "t": 5, "u": 5, "v": 5, "w": 5, "x": 5, "y": 5, "z": 5 - }; - - SocialCalc.Formula.UpperCaseTable = { - "a": "A", "b": "B", "c": "C", "d": "D", "e": "E", "f": "F", "g": "G", "h": "H", "i": "I", "j": "J", "k": "K", "l": "L", "m": "M", - "n": "N", "o": "O", "p": "P", "q": "Q", "r": "R", "s": "S", "t": "T", "u": "U", "v": "V", "w": "W", "x": "X", "y": "Y", "z": "Z" - } - - SocialCalc.Formula.SpecialConstants = { // names that turn into constants for name lookup - "#NULL!": "0,e#NULL!", "#NUM!": "0,e#NUM!", "#DIV/0!": "0,e#DIV/0!", "#VALUE!": "0,e#VALUE!", - "#REF!": "0,e#REF!", "#NAME?": "0,e#NAME?"}; - - - // Operator Precedence table - // - // 1- !, 2- : ,, 3- M P, 4- %, 5- ^, 6- * /, 7- + -, 8- &, 9- < > = G(>=) L(<=) N(<>), - // Negative value means Right Associative - - SocialCalc.Formula.TokenPrecedence = { - "!": 1, - ":": 2, ",": 2, - "M": -3, "P": -3, - "%": 4, - "^": 5, - "*": 6, "/": 6, - "+": 7, "-": 7, - "&": 8, - "<": 9, ">": 9, "G": 9, "L": 9, "N": 9 - }; - - // Convert one-char token text to input text: - - SocialCalc.Formula.TokenOpExpansion = {'G': '>=', 'L': '<=', 'M': '-', 'N': '<>', 'P': '+'}; - - // - // Information about the resulting value types when doing operations on values (used by LookupResultType) - // - // Each object entry is an object with specific types with result type info as follows: - // - // 'type1a': '|type2a:resulta|type2b:resultb|... - // Type of t* or n* matches any of those types not listed - // Results may be a type or the numbers 1 or 2 specifying to return type1 or type2 - - - SocialCalc.Formula.TypeLookupTable = { - unaryminus: { 'n*': '|n*:1|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - unaryplus: { 'n*': '|n*:1|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - unarypercent: { 'n*': '|n:n%|n*:n|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - plus: { - 'n%': '|n%:n%|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nd': '|n%:n|nd:nd|nt:ndt|ndt:ndt|n$:n|n:nd|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nt': '|n%:n|nd:ndt|nt:nt|ndt:ndt|n$:n|n:nt|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'ndt': '|n%:n|nd:ndt|nt:ndt|ndt:ndt|n$:n|n:ndt|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'n$': '|n%:n|nd:n|nt:n|ndt:n|n$:n$|n:n$|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nl': '|n%:n|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'n': '|n%:n|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'b': '|n%:n%|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 't*': '|n*:e#VALUE!|t*:e#VALUE!|b:e#VALUE!|e*:2|', - 'e*': '|e*:1|n*:1|t*:1|b:1|' - }, - concat: { - 't': '|t:t|th:th|tw:tw|tl:t|tr:tr|t*:2|e*:2|', - 'th': '|t:th|th:th|tw:t|tl:th|tr:t|t*:t|e*:2|', - 'tw': '|t:tw|th:t|tw:tw|tl:tw|tr:tw|t*:t|e*:2|', - 'tl': '|t:tl|th:th|tw:tw|tl:tl|tr:tr|t*:t|e*:2|', - 't*': '|t*:t|e*:2|', - 'e*': '|e*:1|n*:1|t*:1|' - }, - oneargnumeric: { 'n*': '|n*:n|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - twoargnumeric: { 'n*': '|n*:n|t*:e#VALUE!|e*:2|', 'e*': '|e*:1|n*:1|t*:1|', 't*': '|t*:e#VALUE!|n*:e#VALUE!|e*:2|'}, - propagateerror: { 'n*': '|n*:2|e*:2|', 'e*': '|e*:2|', 't*': '|t*:2|e*:2|', 'b': '|b:2|e*:2|'} - }; - -/* ******************* - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(line) - - Parses a text string as if it was a spreadsheet formula - - This uses a simple state machine run on each character in turn. - States remember whether a number is being gathered, etc. - The result is parseinfo which is an array with one entry for each token: - parseinfo[i] = { - text: "the characters making up the parsed token", - type: the type of the token (a number), - opcode: a single character version of an operator suitable for use in the - precedence table and distinguishing between unary and binary + and -. - -************************* */ - -SocialCalc.Formula.ParseFormulaIntoTokens = function(line) { - - var i, ch, chclass, haddecimal, last_token, last_token_type, last_token_text, t; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var parsestate = scf.ParseState; - var tokentype = scf.TokenType; - var charclass = scf.CharClass; - var charclasstable = scf.CharClassTable; - var uppercasetable = scf.UpperCaseTable; // much faster than toUpperCase function - var pushtoken = scf.ParsePushToken; - var coordregex = /^\$?[A-Z]{1,2}\$?[1-9]\d*$/i; - - var parseinfo = []; - var str = ""; - var state = 0; - var haddecimal = false; - - for (i=0; i<=line.length; i++) { - if (i0) { - last_token = parseinfo[parseinfo.length-1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - if (last_token_type == charclass.op) { - if (last_token_text == '<' || last_token_text == ">") { - str = last_token_text + str; - parseinfo.pop(); - if (parseinfo.length>0) { - last_token = parseinfo[parseinfo.length-1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - } - else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - } - } - } - else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - t = tokentype.op; - if ((parseinfo.length == 0) - || (last_token_type == charclass.op && last_token_text != ')' && last_token_text != '%')) { // Unary operator - if (str == '-') { // M is unary minus - str = "M"; - ch = "M"; - } - else if (str == '+') { // P is unary plus - str = "P"; - ch = "P"; - } - else if (str == ')' && last_token_text == '(') { // null arg list OK - ; - } - else if (str != '(') { // binary-op open-paren OK, others no - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } - else if (str.length > 1) { - if (str == '>=') { // G is >= - str = "G"; - ch = "G"; - } - else if (str == '<=') { // L is <= - str = "L"; - ch = "L"; - } - else if (str == '<>') { // N is <> - str = "N"; - ch = "N"; - } - else { - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } - pushtoken(parseinfo, str, t, ch); - state = 0; - } - else if (cclass == charclass.quote) { // starting a string - str = ""; - state = parsestate.string; - } - else if (cclass == charclass.space) { // store so can reconstruct spacing - pushtoken(parseinfo, " ", tokentype.space, 0); - } - else if (cclass == charclass.eof) { // ignore -- needed to have extra loop to close out other things - } - else { // unknown class - such as unknown char - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - } - } - } - - return parseinfo; - - } - -SocialCalc.Formula.ParsePushToken = function(parseinfo, ttext, ttype, topcode) { - - parseinfo.push({text: ttext, type: ttype, opcode: topcode}); - - } - -/* ******************* - - result = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, allowrangereturn) - - Does the calculation expressed in a parsed formula, returning a value, its type, and error info - returns: {value: value, type: valuetype, error: errortext}. - - If allowrangereturn is present and true, can return a range (e.g., "A1:A10" - translated from "A1|A10|") - -************************* */ - -SocialCalc.Formula.evaluate_parsed_formula = function(parseinfo, sheet, allowrangereturn) { - - var result; - - var scf = SocialCalc.Formula; - var tokentype = scf.TokenType; - - var revpolish; - var parsestack = []; - - var errortext = ""; - - revpolish = scf.ConvertInfixToPolish(parseinfo); // result is either an array or a string with error text - - result = scf.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn); - - return result; - -} - -// -// revpolish = SocialCalc.Formula.ConvertInfixToPolish(parseinfo) -// -// Convert infix to reverse polish notation -// -// Returns revpolish array with a sequence of references to tokens by number if successful. -// Errors return a string with the error. -// -// Based upon the algorithm shown in Wikipedia "Reverse Polish notation" article -// and then enhanced for additional spreadsheet things -// - -SocialCalc.Formula.ConvertInfixToPolish = function(parseinfo) { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var token_precedence = scf.TokenPrecedence; - - var revpolish = []; - var parsestack = []; - - var errortext = ""; - - var function_start = -1; - - var i, pii, ttype, ttext, tprecedence, tstackprecedence; - - for (i=0; i= 0 && tprecedence < tstackprecedence) { - break; - } - else if (tprecedence < 0) { - tprecedence = -tprecedence; - if (tstackprecedence < 0) tstackprecedence = -tstackprecedence; - if (tprecedence <= tstackprecedence) { - break; - } - } - revpolish.push(parsestack.pop()); - } - parsestack.push(i); - } - else if (ttype == tokentype.error) { - errortext = ttext; - break; - } - else { - errortext = "Internal error while processing parsed formula. "; - break; - } - } - while (parsestack.length>0) { - if (parseinfo[parsestack[parsestack.length-1]].text == '(') { - errortext = scc.s_parseerrmissingcloseparen; - break; - } - revpolish.push(parsestack.pop()); - } - - if (errortext) { - return errortext; - } - - return revpolish; - - } - - -// -// result = SocialCalc.Formula.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn) -// -// Execute reverse polish representation of formula -// -// Operand values are objects in the operand array with a "type" and an optional "value". -// Type can have these values (many are type and sub-type as two or more letters): -// "tw", "th", "t", "n", "nt", "coord", "range", "start", "eErrorType", "b" (blank) -// The value of a coord is in the form A57 or A57!sheetname -// The value of a range is coord|coord|number where number starts at 0 and is -// the offset of the next item to fetch if you are going through the range one by one -// The number starts as a null string ("A1|B3|") -// - -SocialCalc.Formula.EvaluatePolish = function(parseinfo, revpolish, sheet, allowrangereturn) { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var lookup_result_type = scf.LookupResultType; - var typelookup = scf.TypeLookupTable; - var operand_as_number = scf.OperandAsNumber; - var operand_as_text = scf.OperandAsText; - var operand_value_and_type = scf.OperandValueAndType; - var operands_as_coord_on_sheet = scf.OperandsAsCoordOnSheet; - var format_number_for_display = SocialCalc.format_number_for_display || function(v, t, f) {return v+"";}; - - var errortext = ""; - var function_start = -1; - var missingOperandError = {value: "", type: "e#VALUE!", error: scc.s_parseerrmissingoperand}; - - var operand = []; - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var i, rii, prii, ttype, ttext, value1, value2, tostype, tostype2, resulttype, valuetype, cond, vmatch, smatch; - - if (!parseinfo.length || (! (revpolish instanceof Array))) { - return ({value: "", type: "e#VALUE!", error: (typeof revpolish == "string" ? revpolish : "")}); - } - - for (i=0; i N (< <= = >= > <>) - - else if (ttext == "<" || ttext == "L" || ttext == "=" || ttext == "G" || ttext == ">" || ttext == "N") { - if (operand.length <= 1) { // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_value_and_type(sheet, operand); - value1 = operand_value_and_type(sheet, operand); - if (value1.type.charAt(0) == "n" && value2.type.charAt(0) == "n") { // compare two numbers - cond = 0; - if (ttext == "<") { cond = value1.value < value2.value ? 1 : 0; } - else if (ttext == "L") { cond = value1.value <= value2.value ? 1 : 0; } - else if (ttext == "=") { cond = value1.value == value2.value ? 1 : 0; } - else if (ttext == "G") { cond = value1.value >= value2.value ? 1 : 0; } - else if (ttext == ">") { cond = value1.value > value2.value ? 1 : 0; } - else if (ttext == "N") { cond = value1.value != value2.value ? 1 : 0; } - PushOperand("nl", cond); - } - else if (value1.type.charAt(0) == "e") { // error on left - PushOperand(value1.type, 0); - } - else if (value2.type.charAt(0) == "e") { // error on right - PushOperand(value2.type, 0); - } - else { // text maybe mixed with numbers or blank - tostype = value1.type.charAt(0); - tostype2 = value2.type.charAt(0); - if (tostype == "n") { - value1.value = format_number_for_display(value1.value, "n", ""); - } - else if (tostype == "b") { - value1.value = ""; - } - if (tostype2 == "n") { - value2.value = format_number_for_display(value2.value, "n", ""); - } - else if (tostype2 == "b") { - value2.value = ""; - } - cond = 0; - value1.value = value1.value.toLowerCase(); // ignore case - value2.value = value2.value.toLowerCase(); - if (ttext == "<") { cond = value1.value < value2.value ? 1 : 0; } - else if (ttext == "L") { cond = value1.value <= value2.value ? 1 : 0; } - else if (ttext == "=") { cond = value1.value == value2.value ? 1 : 0; } - else if (ttext == "G") { cond = value1.value >= value2.value ? 1 : 0; } - else if (ttext == ">") { cond = value1.value > value2.value ? 1 : 0; } - else if (ttext == "N") { cond = value1.value != value2.value ? 1 : 0; } - PushOperand("nl", cond); - } - } - - // Normal infix arithmethic operators: +, -. *, /, ^ - - else { // what's left are the normal infix arithmetic operators - if (operand.length <= 1) { // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_as_number(sheet, operand); - value1 = operand_as_number(sheet, operand); - if (ttext == '+') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value + value2.value); - } - else if (ttext == '-') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value - value2.value); - } - else if (ttext == '*') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value * value2.value); - } - else if (ttext == '/') { - if (value2.value != 0) { - PushOperand("n", value1.value / value2.value); // gives plain numeric result type - } - else { - PushOperand("e#DIV/0!", 0); - } - } - else if (ttext == '^') { - value1.value = Math.pow(value1.value, value2.value); - value1.type = "n"; // gives plain numeric result type - if (isNaN(value1.value)) { - value1.value = 0; - value1.type = "e#NUM!"; - } - PushOperand(value1.type, value1.value); - } - } - } - - // function or name - - else if (ttype == tokentype.name) { - errortext = scf.CalculateFunction(ttext, operand, sheet); - if (errortext) break; - } - - else { - errortext = scc.s_InternalError+"Unknown token "+ttype+" ("+ttext+"). "; - break; - } - } - - // look at final value and handle special cases - - value = operand[0] ? operand[0].value : ""; - tostype = operand[0] ? operand[0].type : ""; - - if (tostype == "name") { // name - expand it - value1 = SocialCalc.Formula.LookupName(sheet, value); - value = value1.value; - tostype = value1.type; - errortext = errortext || value1.error; - } - - if (tostype == "coord") { // the value is a coord reference, get its value and type - value1 = operand_value_and_type(sheet, operand); - value = value1.value; - tostype = value1.type; - if (tostype == "b") { - tostype = "n"; - value = 0; - } - } - - if (operand.length > 1 && !errortext) { // something left - error - errortext += scc.s_parseerrerrorinformula; - } - - // set return type - - valuetype = tostype; - - if (tostype.charAt(0) == "e") { // error value - errortext = errortext || tostype.substring(1) || scc.s_calcerrerrorvalueinformula; - } - else if (tostype == "range") { - vmatch = value.match(/^(.*)\|(.*)\|/); - smatch = vmatch[1].indexOf("!"); - if (smatch>=0) { // swap sheetname - vmatch[1] = vmatch[1].substring(smatch+1) + "!" + vmatch[1].substring(0, smatch).toUpperCase(); - } - else { - vmatch[1] = vmatch[1].toUpperCase(); - } - value = vmatch[1] + ":" + vmatch[2].toUpperCase(); - if (!allowrangereturn) { - errortext = scc.s_formularangeresult+" "+value; - } - } - - if (errortext && valuetype.charAt(0) != "e") { - value = errortext; - valuetype = "e"; - } - - // look for overflow - - if (valuetype.charAt(0) == "n" && (isNaN(value) || !isFinite(value))) { - value = 0; - valuetype = "e#NUM!"; - errortext = isNaN(value) ? scc.s_calcerrnumericnan: scc.s_calcerrnumericoverflow; - } - - return ({value: value, type: valuetype, error: errortext}); - - } - - -/* -# -# resulttype = SocialCalc.Formula.LookupResultType(type1, type2, typelookup); -# -# typelookup has values of the following form: -# -# typelookup{"typespec1"} = "|typespec2A:resultA|typespec2B:resultB|..." -# -# First type1 is looked up. If no match, then the first letter (major type) of type1 plus "*" is looked up -# resulttype is type1 if result is "1", type2 if result is "2", otherwise the value of result. -# -*/ - -SocialCalc.Formula.LookupResultType = function(type1, type2, typelookup) { - - var pos1, pos2, result; - - var table1 = typelookup[type1]; - - if (!table1) { - table1 = typelookup[type1.charAt(0)+'*']; - if (!table1) { - return "e#VALUE! (internal error, missing LookupResultType "+type1.charAt(0)+"*)"; // missing from table -- please add it - } - } - pos1 = table1.indexOf("|"+type2+":"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1+1); - if (pos2<0) return "e#VALUE! (internal error, incorrect LookupResultType "+table1+")"; - result = table1.substring(pos1+type2.length+2, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - pos1 = table1.indexOf("|"+type2.charAt(0)+"*:"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1+1); - if (pos2<0) return "e#VALUE! (internal error, incorrect LookupResultType "+table1+")"; - result = table1.substring(pos1+4, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - return "e#VALUE!"; - - } - -/* -# -# operandinfo = SocialCalc.Formula.TopOfStackValueAndType(sheet, operand) -# -# Returns top of stack value and type and then pops the stack. -# The result is {value: value, type: type, error: "only if bad error"} -# -*/ - -SocialCalc.Formula.TopOfStackValueAndType = function(sheet, operand) { - - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - if (!stacklen) { // make sure something is there - result.error = SocialCalc.Constants.s_InternalError+"no operand on stack"; - return result; - } - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - return result; - - } - - -/* -# -# operandinfo = OperandAsNumber(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns numeric value and type. -# Text values are treated as 0 if they can't be converted somehow. -# -*/ - -SocialCalc.Formula.OperandAsNumber = function(sheet, operand) { - - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "n") { - operandinfo.value = operandinfo.value-0; - } - else if (t == "b") { // blank cell - operandinfo.type = "n"; - operandinfo.value = 0; - } - else if (t == "e") { // error - operandinfo.value = 0; - } - else { - valueinfo = SocialCalc.DetermineValueType ? SocialCalc.DetermineValueType(operandinfo.value) : - {value: operandinfo.value-0, type: "n"}; // if without rest of SocialCalc - if (valueinfo.type.charAt(0) == "n") { - operandinfo.value = valueinfo.value-0; - operandinfo.type = valueinfo.type; - } - else { - operandinfo.value = 0; - operandinfo.type = valueinfo.type; - } - } - - return operandinfo; - - } - -/* -# -# operandinfo = OperandAsText(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns text value, preserving sub-type. -# -*/ - -SocialCalc.Formula.OperandAsText = function(sheet, operand) { - - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "t") { // any flavor of text returns as is - ; - } - else if (t == "n") { - operandinfo.value = SocialCalc.format_number_for_display ? - SocialCalc.format_number_for_display(operandinfo.value, operandinfo.type, "") : - operandinfo.value = operandinfo.value+""; - operandinfo.type = "t"; - } - else if (t == "b") { // blank - operandinfo.value = ""; - operandinfo.type = "t"; - } - else if (t == "e") { // error - operandinfo.value = ""; - } - else { - operand.value = operandinfo.value + ""; - operand.type = "t"; - } - - return operandinfo; - - } - -/* -# -# result = SocialCalc.Formula.OperandValueAndType(sheet, operand) -# -# Pops the top of stack and returns it, following a coord reference if necessary. -# The result is {value: value, type: type, error: "only if bad error"} -# Ranges are returned as if they were pushed onto the stack first coord first -# Also sets type with "t", "n", "th", etc., as appropriate -# -*/ - -SocialCalc.Formula.OperandValueAndType = function(sheet, operand) { - - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - if (!stacklen) { // make sure something is there - result.error = SocialCalc.Constants.s_InternalError+"no operand on stack"; - return result; - } - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - if (result.type == "range") { - result = scf.StepThroughRangeDown(operand, result.value); - } - - if (result.type == "coord") { // value is a coord reference - coordsheet = sheet; - pos = result.value.indexOf("!"); - if (pos != -1) { // sheet reference - coordsheet = scf.FindInSheetCache(result.value.substring(pos+1)); // get other sheet - if (coordsheet == null) { // unavailable - result.type = "e#REF!"; - result.error = SocialCalc.Constants.s_sheetunavailable+" "+result.value.substring(pos+1); - result.value = 0; - return result; - } - result.value = result.value.substring(0, pos); // get coord part - } - - if (coordsheet) { - cell = coordsheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - cellvtype = cell.valuetype; // get type of value in the cell it points to - result.value = cell.datavalue; - } - else { - cellvtype = "b"; - } - } - else { - cellvtype = "e#N/A"; - result.value = 0; - } - result.type = cellvtype || "b"; - if (result.type == "b") { // blank - result.value = 0; - } - } - - return result; - - } - -/* -# -# operandinfo = SocialCalc.Formula.OperandAsCoord(sheet, operand) -# -# Gets top of stack and pops it. -# Returns coord value. All others are treated as an error. -# -*/ - - -SocialCalc.Formula.OperandAsCoord = function(sheet, operand) { - - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - result = SocialCalc.Formula.LookupName(sheet, result.value); - } - if (result.type == "coord") { // value is a coord reference - return result; - } - else { - result.value = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - return result; - } -} - - -/* -# -# result = SocialCalc.Formula.OperandsAsCoordOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as sheetname!coord-or-name. -# Returns stack-style coord value (coord!sheetname, or coord!sheetname|coord|) with -# a type of coord or range. All others are treated as an error. -# If sheetname not available, sets result.error. -# -*/ - -SocialCalc.Formula.OperandsAsCoordOnSheet = function(sheet, operand) { - - var sheetname, othersheet, pos1, pos2; - var value1 = {}; - var result = {}; - var scf = SocialCalc.Formula; - - var stacklen = operand.length; - value1.value = operand[stacklen-1].value; // get top of stack - coord or name - value1.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - sheetname = scf.OperandAsSheetName(sheet, operand); // get sheetname as text - othersheet = scf.FindInSheetCache(sheetname.value); - if (othersheet == null) { // unavailable - result.type = "e#REF!"; - result.value = 0; - result.error = SocialCalc.Constants.s_sheetunavailable+" "+sheetname.value; - return result; - } - - if (value1.type == "name") { - value1 = scf.LookupName(othersheet, value1.value); - } - result.type = value1.type; - if (value1.type == "coord") { // value is a coord reference - result.value = value1.value + "!" + sheetname.value; // return in the format as used on stack - } - else if (value1.type == "range") { // value is a range reference - pos1 = value1.value.indexOf("|"); - pos2 = value1.value.indexOf("|", pos1+1); - result.value = value1.value.substring(0, pos1) + "!" + sheetname.value + - "|" + value1.value.substring(pos1+1, pos2) + "|"; - } - else if (value1.type.charAt(0)=="e") { - result.value = value1.value; - } - else { - result.error = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - result.value = 0; - } - return result; - - } - -/* -# -# result = SocialCalc.Formula.OperandsAsRangeOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as coord2-or-name:coord1. -# Name is evaluated on sheet of coord1. -# Returns result with "value" of stack-style range value (coord!sheetname|coord|) and -# "type" of "range". All others are treated as an error. -# -*/ - -SocialCalc.Formula.OperandsAsRangeOnSheet = function(sheet, operand) { - - var value1, othersheet, pos1, pos2; - var value2 = {}; - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var stacklen = operand.length; - value2.value = operand[stacklen-1].value; // get top of stack - coord or name for "right" side - value2.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - value1 = scf.OperandAsCoord(sheet, operand); // get "left" coord - if (value1.type != "coord") { // not a coord, which it must be - return {value: 0, type: "e#REF!"}; - } - - othersheet = sheet; - pos1 = value1.value.indexOf("!"); - if (pos1 != -1) { // sheet reference - pos2 = value1.value.indexOf("|", pos1+1); - if (pos2 < 0) pos2 = value1.value.length; - othersheet = scf.FindInSheetCache(value1.value.substring(pos1+1,pos2)); // get other sheet - if (othersheet == null) { // unavailable - return {value: 0, type: "e#REF!", errortext: scc.s_sheetunavailable+" "+value1.value.substring(pos1+1,pos2)}; - } - } - - if (value2.type == "name") { // coord:name is allowed, if name is just one cell - value2 = scf.LookupName(othersheet, value2.value); - } - - if (value2.type == "coord") { // value is a coord reference, so return the combined range - return {value: value1.value+"|"+value2.value+"|", type: "range"}; // return range in the format as used on stack - } - else { // bad form - return {value: scc.s_calcerrcellrefmissing, type: "e#REF!"}; - } - } - - -/* -# -# result = SocialCalc.Formula.OperandAsSheetName(sheet, operand) -# -# Gets top of stack and pops it. -# Returns sheetname value. All others are treated as an error. -# Accepts text, cell reference, and named value which is one of those two. -# -*/ - -SocialCalc.Formula.OperandAsSheetName = function(sheet, operand) { - - var nvalue, cell; - - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - nvalue = SocialCalc.Formula.LookupName(sheet, result.value); - if (!nvalue.value) { // not a known name - return bare name as the name value - return result; - } - result.value = nvalue.value; - result.type = nvalue.type; - } - if (result.type == "coord") { // value is a coord reference, follow it to find sheet name - cell = sheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - result.value = cell.datavalue; - result.type = cell.valuetype; - } - else { - result.value = ""; - result.type = "b"; - } - } - if (result.type.charAt(0) == "t") { // value is a string which could be a sheet name - return result; - } - else { - result.value = ""; - result.error = SocialCalc.Constants.s_calcerrsheetnamemissing; - return result; - } - - } - -// -// value = SocialCalc.Formula.LookupName(sheet, name) -// -// Returns value and type of a named value -// Names are case insensitive -// Names may have a definition which is a coord (A1), a range (A1:B7), or a formula (=OFFSET(A1,0,0,5,1)) -// Note: The range must not have sheet names ("!") in them. -// - -SocialCalc.Formula.LookupName = function(sheet, name) { - - var pos, specialc, parseinfo; - var names = sheet.names; - var value = {}; - var startedwalk = false; - - if (names[name.toUpperCase()]) { // is name defined? - - value.value = names[name.toUpperCase()].definition; // yes - - if (value.value.charAt(0) == "=") { // formula - if (!sheet.checknamecirc) { // are we possibly walking the name tree? - sheet.checknamecirc = {}; // not yet - startedwalk = true; // remember we are the reference that started it - } - else { - if (sheet.checknamecirc[name]) { // circular reference - value.type = "e#NAME?"; - value.error = SocialCalc.Constants.s_circularnameref+' "' + name + '".'; - return value; - } - } - sheet.checknamecirc[name] = true; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(value.value.substring(1)); - value = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, 1); // parse formula, allowing range return - - delete sheet.checknamecirc[name]; // done with us - if (startedwalk) { - delete sheet.checknamecirc; // done with walk - } - - if (value.type != "range") { - return value; - } - } - - pos = value.value.indexOf(":"); - if (pos != -1) { // range - value.type = "range"; - value.value = value.value.substring(0, pos) + "|" + value.value.substring(pos+1)+"|"; - value.value = value.value.toUpperCase(); - } - else { - value.type = "coord"; - value.value = value.value.toUpperCase(); - } - return value; - } - else if (specialc=SocialCalc.Formula.SpecialConstants[name.toUpperCase()]) { // special constant, like #REF! - pos = specialc.indexOf(","); - value.value = specialc.substring(0,pos)-0; - value.type = specialc.substring(pos+1); - return value; - } - else { - value.value = ""; - value.type = "e#NAME?"; - value.error = SocialCalc.Constants.s_calcerrunknownname+' "'+name+'"'; - return value; - } - } - -/* -# -# coord = SocialCalc.Formula.StepThroughRangeDown(operand, rangevalue) -# -# Returns next coord in a range, keeping track on the operand stack -# Goes from upper left across and down to bottom right. -# -*/ - -SocialCalc.Formula.StepThroughRangeDown = function(operand, rangevalue) { - - var value1, value2, sequence, pos1, pos2, sheet1, rp, c, r, count; - var scf = SocialCalc.Formula; - - pos1 = rangevalue.indexOf("|"); - pos2 = rangevalue.indexOf("|", pos1+1); - value1 = rangevalue.substring(0, pos1); - value2 = rangevalue.substring(pos1+1, pos2); - sequence = rangevalue.substring(pos2+1) - 0; - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1); - value1 = value1.substring(0, pos1); - } - else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - rp = scf.OrderRangeParts(value1, value2); - - count = 0; - for (r=rp.r1; r<=rp.r2; r++) { - for (c=rp.c1; c<=rp.c2; c++) { - count++; - if (count > sequence) { - if (r!=rp.r2 || c!=rp.c2) { // keep on stack until done - scf.PushOperand(operand, "range", value1+sheet1+"|"+value2+"|"+count); - } - return {value: SocialCalc.crToCoord(c, r)+sheet1, type: "coord"}; - } - } - } - } - -/* -# -# result = SocialCalc.Formula.DecodeRangeParts(sheetdata, range) -# -# Returns sheetdata for the sheet where the range is, as well as -# the number of the first column in the range, the number of columns, -# and equivalent row information: -# -# {sheetdata: sheet, sheetname: name-or-"", col1num: n, ncols: n, row1num: n, nrows: n} -# -# If any errors, a null result is returned. -# -*/ - -SocialCalc.Formula.DecodeRangeParts = function(sheetdata, range) { - - var value1, value2, pos1, pos2, sheet1, coordsheetdata, rp; - - var scf = SocialCalc.Formula; - - pos1 = range.indexOf("|"); - pos2 = range.indexOf("|", pos1+1); - value1 = range.substring(0, pos1); - value2 = range.substring(pos1+1, pos2); - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1+1); - value1 = value1.substring(0, pos1); - } - else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - coordsheetdata = sheetdata; - if (sheet1) { // sheet reference - coordsheetdata = scf.FindInSheetCache(sheet1); - if (coordsheetdata == null) { // unavailable - return null; - } - } - - rp = scf.OrderRangeParts(value1, value2); - - return {sheetdata: coordsheetdata, sheetname: sheet1, col1num: rp.c1, ncols: rp.c2-rp.c1+1, row1num: rp.r1, nrows: rp.r2-rp.r1+1} - - } - - -//********************* -// -// Function Handling -// -//********************* - -// List of functions -- Define after functions are defined -// -// SocialCalc.Formula.FunctionList["function_name"] = [function_subroutine, number_of_arguments, arg_def, func_def, func_class] -// function_subroutine takes arguments (fname, operand, foperand, sheet), returns -// errortext or null, pushing result on operand stack. -// number_of_arguments is: -// 0 = no arguments -// >0 = exactly that many arguments -// <0 = that many arguments (abs value) or more -// 100 = don't check -// -// arg_def, if present, is the name of the element in SocialCalc.Formula.FunctionArgDefs. -// func_def, if present, is a string explaining the function. If not, looked up in SocialCalc.Constants. -// func_class, if present, is the comma-separated names of the elements in SocialCalc.Formula.FunctionClasses. -// -// To add a function, just add it to this object. - - if (!SocialCalc.Formula.FunctionList) { // make sure it is defined (could have been in another module) - SocialCalc.Formula.FunctionList = {}; - } - - // FunctionClasses[classname] = {name: full-name-string, items: [sorted list of function names]}; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionClasses = null; // start null to say needs filling in - - // FunctionArgDef[argname] = explicit-string-for-arg-list; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionArgDefs = {}; - - -/* -# -# errortext = SocialCalc.Formula.CalculateFunction(fname, operand, sheet) -# -# Dispatches for function fname. -# -*/ - -SocialCalc.Formula.CalculateFunction = function(fname, operand, sheet) { - - var fobj, foperand, ffunc, argnum, ttext; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = ""; - - fobj = scf.FunctionList[fname]; - - if (fobj) { - foperand = []; - ffunc = fobj[0]; - argnum = fobj[1]; - scf.CopyFunctionArgs(operand, foperand); - if (argnum != 100) { - if (argnum < 0) { - if (foperand.length < -argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } - else { - if (foperand.length != argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } - } - errortext = ffunc(fname, operand, foperand, sheet); - } - - else { - ttext = fname; - - if (operand.length && operand[operand.length-1].type == "start") { // no arguments - name or zero arg function - operand.pop(); - scf.PushOperand(operand, "name", ttext); - } - - else { - errortext = SocialCalc.Constants.s_sheetfuncunknownfunction+" " + ttext +". "; - } - } - - return errortext; - -} - -// -// SocialCalc.Formula.PushOperand(operand, t, v) -// -// Pushes the type and value onto the operand stack -// - -SocialCalc.Formula.PushOperand = function(operand, t, v) { - - operand.push({type: t, value: v}); - - } - -// -// SocialCalc.Formula.CopyFunctionArgs(operand, foperand) -// -// Pops operands from operand and pushes on foperand up to function start -// reversing order in the process. -// - -SocialCalc.Formula.CopyFunctionArgs = function(operand, foperand) { - - var fobj, foperand, ffunc, argnum; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = null; - - while (operand.length>0 && operand[operand.length-1].type != "start") { // get each arg - foperand.push(operand.pop()); // copy it - } - operand.pop(); // get rid of "start" - - return; - - } - -// -// errortext = SocialCalc.Formula.FunctionArgsError(fname, operand) -// -// Pushes appropriate error on operand stack and returns errortext, including fname -// - -SocialCalc.Formula.FunctionArgsError = function(fname, operand) { - - var errortext = SocialCalc.Constants.s_calcerrincorrectargstofunction+" " + fname + ". "; - SocialCalc.Formula.PushOperand(operand, "e#VALUE!", errortext); - - return errortext; - - } - - -// -// errortext = SocialCalc.Formula.FunctionSpecificError(fname, operand, errortype, errortext) -// -// Pushes specified error and text on operand stack. -// - -SocialCalc.Formula.FunctionSpecificError = function(fname, operand, errortype, errortext) { - - SocialCalc.Formula.PushOperand(operand, errortype, errortext); - - return errortext; - - } - -// -// haserror = SocialCalc.Formula.CheckForErrorValue(operand, v) -// -// If v.type is an error, push it on operand stack and return true, otherwise return false. -// - -SocialCalc.Formula.CheckForErrorValue = function(operand, v) { - - if (v.type.charAt(0) == "e") { - operand.push(v); - return true; - } - else { - return false; - } - - } - -///////////////////////// -// -// FUNCTION INFORMATION ROUTINES -// - -// -// SocialCalc.Formula.FillFunctionInfo() -// -// Goes through function definitions and fills out FunctionArgDefs and FunctionClasses. -// Execute this after any changes to SocialCalc.Constants but before UI is used. -// - -SocialCalc.Formula.FillFunctionInfo = function() { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var fname, f, classes, cname, i; - - if (scf.FunctionClasses) { // only do once - return; - } - - for (fname in scf.FunctionList) { - f = scf.FunctionList[fname]; - if (f[2]) { // has an arg def - scf.FunctionArgDefs[f[2]] = scc["s_farg_"+f[2]] || ""; // get it from constants - } - if (!f[3]) { // no text def, see if in constants - if (scc["s_fdef_"+fname]) { - scf.FunctionList[fname][3] = scc["s_fdef_"+fname]; - } - } - } - - scf.FunctionClasses = {}; - - for (i=0; i 0) { - str = "v1"; - for (i=2; i<=nargs; i++) { - str += ", v"+i; - } - return str; - } - else if (nargs < 0) { - str = "v1"; - for (i=2; i<-nargs; i++) { - str += ", v"+i; - } - return str+", ..."; - } - else { - return "nargs: "+nargs; - } - } - - str = scf.FunctionArgDefs[adef] || adef; - - return str; - - } - - -///////////////////////// -// -// FUNCTION DEFINITIONS -// -// The standard function definitions follow. -// -// Note that some need SocialCalc.DetermineValueType to be defined. -// - -/* -# -# AVERAGE(v1,c1:c2,...) -# COUNT(v1,c1:c2,...) -# COUNTA(v1,c1:c2,...) -# COUNTBLANK(v1,c1:c2,...) -# MAX(v1,c1:c2,...) -# MIN(v1,c1:c2,...) -# PRODUCT(v1,c1:c2,...) -# STDEV(v1,c1:c2,...) -# STDEVP(v1,c1:c2,...) -# SUM(v1,c1:c2,...) -# VAR(v1,c1:c2,...) -# VARP(v1,c1:c2,...) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the dseries_functions, too. -# -*/ - -SocialCalc.Formula.SeriesFunctions = function(fname, operand, foperand, sheet) { - - var value1, t, v1; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - while (foperand.length > 0) { - value1 = operand_value_and_type(sheet, foperand); - t = value1.type.charAt(0); - if (t == "n") count += 1; - if (t != "b") counta += 1; - if (t == "b") countblank += 1; - - if (t == "n") { - v1 = value1.value-0; // get it as a number - sum += v1; - product *= v1; - maxval = (maxval!=undefined) ? (v1 > maxval ? v1 : maxval) : v1; - minval = (minval!=undefined) ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } - else { // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type(value1.type, resulttypesum || value1.type, typelookupplus); - } - else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "SUM": - PushOperand(resulttypesum, sum); - break; - - case "PRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "MIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "MAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "COUNT": - PushOperand("n", count); - break; - - case "COUNTA": - PushOperand("n", counta); - break; - - case "COUNTBLANK": - PushOperand("n", countblank); - break; - - case "AVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum/count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - } - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["AVERAGE"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNT"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNTA"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNTBLANK"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["MAX"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["MIN"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["PRODUCT"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["STDEV"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["STDEVP"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["SUM"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["VAR"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["VARP"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; - -/* -# -# DAVERAGE(databaserange, fieldname, criteriarange) -# DCOUNT(databaserange, fieldname, criteriarange) -# DCOUNTA(databaserange, fieldname, criteriarange) -# DGET(databaserange, fieldname, criteriarange) -# DMAX(databaserange, fieldname, criteriarange) -# DMIN(databaserange, fieldname, criteriarange) -# DPRODUCT(databaserange, fieldname, criteriarange) -# DSTDEV(databaserange, fieldname, criteriarange) -# DSTDEVP(databaserange, fieldname, criteriarange) -# DSUM(databaserange, fieldname, criteriarange) -# DVAR(databaserange, fieldname, criteriarange) -# DVARP(databaserange, fieldname, criteriarange) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the series_functions, too. -# -*/ - -SocialCalc.Formula.DSeriesFunctions = function(fname, operand, foperand, sheet) { - - var value1, tostype, cr, dbrange, fieldname, criteriarange, dbinfo, criteriainfo; - var fieldasnum, targetcol, i, j, k, cell, criteriafieldnums; - var testok, criteriacr, criteria, testcol, testcr; - var t; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var value1 = {}; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - dbrange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - fieldname = scf.OperandValueAndType(sheet, foperand); // get a value - criteriarange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - - if (dbrange.type != "range" || criteriarange.type != "range") { - return scf.FunctionArgsError(fname, operand); - } - - dbinfo = scf.DecodeRangeParts(sheet, dbrange.value); - criteriainfo = scf.DecodeRangeParts(sheet, criteriarange.value); - - fieldasnum = scf.FieldToColnum(dbinfo.sheetdata, dbinfo.col1num, dbinfo.ncols, dbinfo.row1num, fieldname.value, fieldname.type); - if (fieldasnum <= 0) { - PushOperand("e#VALUE!", 0); - return; - } - - targetcol = dbinfo.col1num + fieldasnum - 1; - criteriafieldnums = []; - - for (i=0; i maxval ? v1 : maxval) : v1; - minval = (minval!=undefined) ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } - else { // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type(value1.type, resulttypesum || value1.type, typelookupplus); - } - else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "DSUM": - PushOperand(resulttypesum, sum); - break; - - case "DPRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "DMIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "DMAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "DCOUNT": - PushOperand("n", count); - break; - - case "DCOUNTA": - PushOperand("n", counta); - break; - - case "DAVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum/count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DGET": - if (count == 1) { - PushOperand(resulttypesum, sum); - } - else if (count == 0) { - PushOperand("e#VALUE!", 0); - } - else { - PushOperand("e#NUM!", 0); - } - break; - - } - - return; - - } - -SocialCalc.Formula.FunctionList["DAVERAGE"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DCOUNT"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DCOUNTA"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DGET"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DMAX"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DMIN"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DPRODUCT"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSTDEV"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSTDEVP"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSUM"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DVAR"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DVARP"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; - -/* -# -# colnum = SocialCalc.Formula.FieldToColnum(sheet, col1num, ncols, row1num, fieldname, fieldtype) -# -# If fieldname is a number, uses it, otherwise looks up string in cells in row to find field number -# -# If not found, returns 0. -# -*/ - -SocialCalc.Formula.FieldToColnum = function(sheet, col1num, ncols, row1num, fieldname, fieldtype) { - - var colnum, cell, value; - - if (fieldtype.charAt(0) == "n") { // number - return it if legal - colnum = fieldname - 0; // make sure a number - if (colnum <= 0 || colnum > ncols) { - return 0; - } - return Math.floor(colnum); - } - - if (fieldtype.charAt(0) != "t") { // must be text otherwise - return 0; - } - - fieldname = fieldname ? fieldname.toLowerCase() : ""; - - for (colnum=0; colnum < ncols; colnum++) { // look through column headers for a match - cell = sheet.GetAssuredCell(SocialCalc.crToCoord(col1num+colnum, row1num)); - value = cell.datavalue; - value = (value+"").toLowerCase(); // ignore case - if (value == fieldname) { // match - return colnum+1; - } - } - return 0; // looked at all and no match - - } - - -/* -# -# HLOOKUP(value, range, row, [rangelookup]) -# VLOOKUP(value, range, col, [rangelookup]) -# MATCH(value, range, [rangelookup]) -# -*/ - -SocialCalc.Formula.LookupFunctions = function(fname, operand, foperand, sheet) { - - var lookupvalue, range, offset, rangelookup, offsetvalue, rangeinfo; - var c, r, cincr, rincr, previousOK, csave, rsave, cell, value, valuetype, cr, lookupvalue; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - lookupvalue = operand_value_and_type(sheet, foperand); - if (typeof lookupvalue.value == "string") { - lookupvalue.value = lookupvalue.value.toLowerCase(); - } - - range = scf.TopOfStackValueAndType(sheet, foperand); - - rangelookup = 1; // default to true or 1 - if (fname == "MATCH") { - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value - 0; - } - } - else { - offsetvalue = scf.OperandAsNumber(sheet, foperand); - if (offsetvalue.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - offsetvalue = Math.floor(offsetvalue.value); - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value ? 1 : 0; // convert to 1 or 0 - } - } - lookupvalue.type = lookupvalue.type.charAt(0); // only deal with general type - if (lookupvalue.type == "n") { // if number, make sure a number - lookupvalue.value = lookupvalue.value - 0; - } - - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - rangeinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (!rangeinfo) { - PushOperand("e#REF!", 0); - return; - } - - c = 0; - r = 0; - cincr = 0; - rincr = 0; - if (fname == "HLOOKUP") { - cincr = 1; - if (offsetvalue > rangeinfo.nrows) { - PushOperand("e#REF!", 0); - return; - } - } - else if (fname == "VLOOKUP") { - rincr = 1; - if (offsetvalue > rangeinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - } - else if (fname == "MATCH") { - if (rangeinfo.ncols > 1) { - if (rangeinfo.nrows > 1) { - PushOperand("e#N/A", 0); - return; - } - cincr = 1; - } - else { - rincr = 1; - } - } - else { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (offsetvalue < 1 && fname != "MATCH") { - PushOperand("e#VALUE!", 0); - return 0; - } - - previousOK; // if 1, previous test was <. If 2, also this one wasn't - - while (1) { - cr = SocialCalc.crToCoord(rangeinfo.col1num + c, rangeinfo.row1num + r); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype ? cell.valuetype.charAt(0) : "b"; // only deal with general types - if (valuetype == "n") { - value = value - 0; // make sure number - } - if (rangelookup) { // rangelookup type 1 or -1: look for within brackets for matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { // match - break; - } - if ((rangelookup > 0 && lookupvalue.value > value) - || (rangelookup < 0 && lookupvalue.value < value)) { // possible match: wait and see - previousOK = 1; - csave = c; // remember col and row of last OK - rsave = r; - } - else if (previousOK) { // last one was OK, this one isn't - previousOK = 2; - break; - } - } - - else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { // match - break; - } - if ((rangelookup > 0 && lookupvalue.value > value) - || (rangelookup < 0 && lookupvalue.value < value)) { // possible match: wait and see - previousOK = 1; - csave = c; - rsave = r; - } - else if (previousOK) { // last one was OK, this one isn't - previousOK = 2; - break; - } - } - } - else { // exact value matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { // match - break; - } - } - else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { // match - break; - } - } - } - - r += rincr; - c += cincr; - if (r >= rangeinfo.nrows || c >= rangeinfo.ncols) { // end of range to check, no exact match - if (previousOK) { // at least one could have been OK - previousOK = 2; - break; - } - PushOperand("e#N/A", 0); - return; - } - } - - if (previousOK == 2) { // back to last OK - r = rsave; - c = csave; - } - - if (fname == "MATCH") { - value = c + r + 1; // only one may be <> 0 - valuetype = "n"; - } - else { - cr = SocialCalc.crToCoord(rangeinfo.col1num+c+(fname == "VLOOKUP" ? offsetvalue-1 : 0), rangeinfo.row1num+r+(fname == "HLOOKUP" ? offsetvalue-1 : 0)); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype; - } - PushOperand(valuetype, value); - - return; - - } - -SocialCalc.Formula.FunctionList["HLOOKUP"] = [SocialCalc.Formula.LookupFunctions, -3, "hlookup", "", "lookup"]; -SocialCalc.Formula.FunctionList["MATCH"] = [SocialCalc.Formula.LookupFunctions, -2, "match", "", "lookup"]; -SocialCalc.Formula.FunctionList["VLOOKUP"] = [SocialCalc.Formula.LookupFunctions, -3, "vlookup", "", "lookup"]; - -/* -# -# INDEX(range, rownum, colnum) -# -*/ - -SocialCalc.Formula.IndexFunction = function(fname, operand, foperand, sheet) { - - var range, sheetname, indexinfo, rowindex, colindex, result, resulttype; - - var scf = SocialCalc.Formula; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - indexinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (indexinfo.sheetname) { - sheetname = "!" + indexinfo.sheetname; - } - else { - sheetname = ""; - } - - rowindex = {value:0}; - colindex = {value:0}; - - if (foperand.length) { // look for row number - rowindex = scf.OperandAsNumber(sheet, foperand); - if (rowindex.type.charAt(0) != "n" || rowindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { // look for col number - colindex = scf.OperandAsNumber(sheet, foperand); - if (colindex.type.charAt(0) != "n" || colindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - } - else { // col number missing - if (indexinfo.nrows == 1) { // if only one row, then rowindex is really colindex - colindex.value = rowindex.value; - rowindex.value = 0; - } - } - } - - if (rowindex.value > indexinfo.nrows || colindex.value > indexinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - - if (rowindex.value == 0) { - if (colindex.value == 0) { - if (indexinfo.nrows == 1 && indexinfo.ncols == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+indexinfo.ncols-1, indexinfo.row1num+indexinfo.nrows-1) + - "|"; - resulttype = "range"; - } - } - else { - if (indexinfo.nrows == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num+indexinfo.nrows-1) + - "|"; - resulttype = "range"; - } - } - } - else { - if (colindex.value == 0) { - if (indexinfo.ncols == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num+rowindex.value-1) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num+rowindex.value-1) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+indexinfo.ncols-1, indexinfo.row1num+rowindex.value-1) + - "|"; - resulttype = "range"; - } - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num+rowindex.value-1) + sheetname; - resulttype = "coord"; - } - } - - PushOperand(resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["INDEX"] = [SocialCalc.Formula.IndexFunction, -1, "index", "", "lookup"]; - -/* -# -# COUNTIF(c1:c2,"criteria") -# SUMIF(c1:c2,"criteria",[range2]) -# -*/ - -SocialCalc.Formula.CountifSumifFunctions = function(fname, operand, foperand, sheet) { - - var range, criteria, sumrange, f2operand, result, resulttype, value1, value2; - var sum = 0; - var resulttypesum = ""; - var count = 0; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range or coord - criteria = scf.OperandAsText(sheet, foperand); // get criteria - if (fname == "SUMIF") { - if (foperand.length == 1) { // three arg form of SUMIF - sumrange = scf.TopOfStackValueAndType(sheet, foperand); - } - else if (foperand.length == 0) { // two arg form - sumrange = {value: range.value, type: range.type}; - } - else { - scf.FunctionArgsError(fname, operand); - return 0; - } - } - else { - sumrange = {value: range.value, type: range.type}; - } - - if (criteria.type.charAt(0) == "n") { - criteria.value = criteria.value + ""; // make text - } - else if (criteria.type.charAt(0) == "e") { // error - criteria.value = null; - } - else if (criteria.type.charAt(0) == "b") { // blank here is undefined - criteria.value = null; - } - - if (range.type != "coord" && range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - if (fname == "SUMIF" && sumrange.type != "coord" && sumrange.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - foperand.push(range); - f2operand = []; // to allow for 3 arg form - f2operand.push(sumrange); - - while (foperand.length) { - value1 = operand_value_and_type(sheet, foperand); - value2 = operand_value_and_type(sheet, f2operand); - - if (!scf.TestCriteria(value1.value, value1.type, criteria.value)) { - continue; - } - - count += 1; - - if (value2.type.charAt(0) == "n") { - sum += value2.value-0; - resulttypesum = lookup_result_type(value2.type, resulttypesum || value2.type, typelookupplus); - } - else if (value2.type.charAt(0) == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value2.type; - } - } - - resulttypesum = resulttypesum || "n"; - - if (fname == "SUMIF") { - PushOperand(resulttypesum, sum); - } - else if (fname == "COUNTIF") { - PushOperand("n", count); - } - - return; - - } - -SocialCalc.Formula.FunctionList["COUNTIF"] = [SocialCalc.Formula.CountifSumifFunctions, 2, "rangec", "", "stat"]; -SocialCalc.Formula.FunctionList["SUMIF"] = [SocialCalc.Formula.CountifSumifFunctions, -2, "sumif", "", "stat"]; - -/* -# -# IF(cond,truevalue,falsevalue) -# -*/ - -SocialCalc.Formula.IfFunction = function(fname, operand, foperand, sheet) { - - var cond, t; - - cond = SocialCalc.Formula.OperandValueAndType(sheet, foperand); - t = cond.type.charAt(0); - if (t != "n" && t != "b") { - operand.push({type: "e#VALUE!", value: 0}); - return; - } - - if (!cond.value) foperand.pop(); - operand.push(foperand.pop()); - if (cond.value) foperand.pop(); - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["IF"] = [SocialCalc.Formula.IfFunction, 3, "iffunc", "", "test"]; - -/* -# -# DATE(year,month,day) -# -*/ - -SocialCalc.Formula.DateFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var year = scf.OperandAsNumber(sheet, foperand); - var month = scf.OperandAsNumber(sheet, foperand); - var day = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(year.type, month.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, day.type, scf.TypeLookupTable.twoargnumeric); - if (resulttype.charAt(0) == "n") { - result = SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - Math.floor(year.value), Math.floor(month.value), Math.floor(day.value) - ) - SocialCalc.FormatNumber.datevalues.julian_offset; - resulttype = "nd"; - } - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["DATE"] = [SocialCalc.Formula.DateFunction, 3, "date", "", "datetime"]; - -/* -# -# TIME(hour,minute,second) -# -*/ - -SocialCalc.Formula.TimeFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var hours = scf.OperandAsNumber(sheet, foperand); - var minutes = scf.OperandAsNumber(sheet, foperand); - var seconds = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(hours.type, minutes.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, seconds.type, scf.TypeLookupTable.twoargnumeric); - if (resulttype.charAt(0) == "n") { - result = ((hours.value * 60 * 60) + (minutes.value * 60) + seconds.value) / (24*60*60); - resulttype = "nt"; - } - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["TIME"] = [SocialCalc.Formula.TimeFunction, 3, "hms", "", "datetime"]; - -/* -# -# DAY(date) -# MONTH(date) -# YEAR(date) -# WEEKDAY(date, [type]) -# -*/ - -SocialCalc.Formula.DMYFunctions = function(fname, operand, foperand, sheet) { - - var ymd, dtype, doffset; - var scf = SocialCalc.Formula; - var result = 0; - - var datevalue = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(datevalue.type, datevalue.type, scf.TypeLookupTable.oneargnumeric); - - if (resulttype.charAt(0) == "n") { - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian( - Math.floor(datevalue.value + SocialCalc.FormatNumber.datevalues.julian_offset)); - switch (fname) { - case "DAY": - result = ymd.day; - break; - - case "MONTH": - result = ymd.month; - break; - - case "YEAR": - result = ymd.year; - break; - - case "WEEKDAY": - dtype = {value: 1}; - if (foperand.length) { // get type if present - dtype = scf.OperandAsNumber(sheet, foperand); - if (dtype.type.charAt(0) != "n" || dtype.value < 1 || dtype.value > 3) { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { // extra args - scf.FunctionArgsError(fname, operand); - return; - } - } - doffset = 6; - if (dtype.value > 1) { - doffset -= 1; - } - result = Math.floor(datevalue.value+doffset) % 7 + (dtype.value < 3 ? 1 : 0); - break; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["DAY"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["MONTH"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["YEAR"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["WEEKDAY"] = [SocialCalc.Formula.DMYFunctions, -1, "weekday", "", "datetime"]; - -/* -# -# HOUR(datetime) -# MINUTE(datetime) -# SECOND(datetime) -# -*/ - -SocialCalc.Formula.HMSFunctions = function(fname, operand, foperand, sheet) { - - var hours, minutes, seconds, fraction; - var scf = SocialCalc.Formula; - var result = 0; - - var datetime = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(datetime.type, datetime.type, scf.TypeLookupTable.oneargnumeric); - - if (resulttype.charAt(0) == "n") { - if (datetime.value < 0) { - scf.PushOperand(operand, "e#NUM!", 0); // must be non-negative - return; - } - fraction = datetime.value - Math.floor(datetime.value); // fraction of a day - fraction *= 24; - hours = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - minutes = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - seconds = Math.floor(fraction + (datetime.value >= 0 ? 0.5: -0.5)); - if (fname == "HOUR") { - result = hours; - } - else if (fname == "MINUTE") { - result = minutes; - } - else if (fname == "SECOND") { - result = seconds; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["HOUR"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["MINUTE"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["SECOND"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; - -/* -# -# EXACT(v1,v2) -# -*/ - -SocialCalc.Formula.ExactFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value1 = scf.OperandValueAndType(sheet, foperand); - var v1type = value1.type.charAt(0); - var value2 = scf.OperandValueAndType(sheet, foperand); - var v2type = value2.type.charAt(0); - - if (v1type == "t") { - if (v2type == "t") { - result = value1.value == value2.value ? 1 : 0; - } - else if (v2type == "b") { - result = value1.value.length ? 0 : 1; - } - else if (v2type == "n") { - result = value1.value == value2.value+"" ? 1 : 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "n") { - if (v2type == "n") { - result = value1.value-0 == value2.value-0 ? 1 : 0; - } - else if (v2type == "b") { - result = 0; - } - else if (v2type == "t") { - result = value1.value+"" == value2.value ? 1 : 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "b") { - if (v2type == "t") { - result = value2.value.length ? 0 : 1; - } - else if (v2type == "b") { - result = 1; - } - else if (v2type == "n") { - result = 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "e") { - result = value1.value; - resulttype = value1.type; - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["EXACT"] = [SocialCalc.Formula.ExactFunction, 2, "", "", "text"]; - -/* -# -# FIND(key,string,[start]) -# LEFT(string,[length]) -# LEN(string) -# LOWER(string) -# MID(string,start,length) -# PROPER(string) -# REPLACE(string,start,length,new) -# REPT(string,count) -# RIGHT(string,[length]) -# SUBSTITUTE(string,old,new,[which]) -# TRIM(string) -# UPPER(string) -# -*/ - -// SocialCalc.Formula.ArgList has an array for each function, one entry for each possible arg (up to max). -// Min args are specified in SocialCalc.Formula.FunctionList. -// If array element is 1 then it's a text argument, if it's 0 then it's numeric, if -1 then just get whatever's there -// Text values are manipulated as UTF-8, converting from and back to byte strings - -SocialCalc.Formula.ArgList = { - FIND: [1, 1, 0], - LEFT: [1, 0], - LEN: [1], - LOWER: [1], - MID: [1, 0, 0], - PROPER: [1], - REPLACE: [1, 0, 0, 1], - REPT: [1, 0], - RIGHT: [1, 0], - SUBSTITUTE: [1, 1, 1, 0], - TRIM: [1], - UPPER: [1] - }; - -SocialCalc.Formula.StringFunctions = function(fname, operand, foperand, sheet) { - - var i, value, offset, len, start, count; - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var numargs = foperand.length; - var argdef = scf.ArgList[fname]; - var operand_value = []; - var operand_type = []; - - for (i=1; i <= numargs; i++) { // go through each arg, get value and type, and check for errors - if (i > argdef.length) { // too many args - scf.FunctionArgsError(fname, operand); - return; - } - if (argdef[i-1] == 0) { - value = scf.OperandAsNumber(sheet, foperand); - } - else if (argdef[i-1] == 1) { - value = scf.OperandAsText(sheet, foperand); - } - else if (argdef[i-1] == -1) { - value = scf.OperandValueAndType(sheet, foperand); - } - operand_value[i] = value.value; - operand_type[i] = value.type; - if (value.type.charAt(0) == "e") { - scf.PushOperand(operand, value.type, result); - return; - } - } - - switch (fname) { - case "FIND": - offset = operand_type[3] ? operand_value[3]-1 : 0; - if (offset < 0) { - result = "Start is before string"; // !! not displayed, no need to translate - } - else { - result = operand_value[2].indexOf(operand_value[1], offset); // (null string matches first char) - if (result >= 0) { - result += 1; - resulttype = "n"; - } - else { - result = "Not found"; // !! not displayed, error is e#VALUE! - } - } - break; - - case "LEFT": - len = operand_type[2] ? operand_value[2]-0 : 1; - if (len < 0) { - result = "Negative length"; - } - else { - result = operand_value[1].substring(0, len); - resulttype = "t"; - } - break; - - case "LEN": - result = operand_value[1].length; - resulttype = "n"; - break; - - case "LOWER": - result = operand_value[1].toLowerCase(); - resulttype = "t"; - break; - - case "MID": - start = operand_value[2]-0; - len = operand_value[3]-0; - if (len < 1 || start < 1) { - result = "Bad arguments"; - } - else { - result = operand_value[1].substring(start-1, start+len-1); - resulttype = "t"; - } - break; - - case "PROPER": - result = operand_value[1].replace(/\b\w+\b/g, function(word) { - return word.substring(0,1).toUpperCase() + - word.substring(1); - }); // uppercase first character of words (see JavaScript, Flanagan, 5th edition, page 704) - resulttype = "t"; - break; - - case "REPLACE": - start = operand_value[2]-0; - len = operand_value[3]-0; - if (len < 0 || start < 1) { - result = "Bad arguments"; - } - else { - result = operand_value[1].substring(0, start-1) + operand_value[4] + - operand_value[1].substring(start-1+len); - resulttype = "t"; - } - break; - - case "REPT": - count = operand_value[2]-0; - if (count < 0) { - result = "Negative count"; - } - else { - result = ""; - for (; count > 0; count--) { - result += operand_value[1]; - } - resulttype = "t"; - } - break; - - case "RIGHT": - len = operand_type[2] ? operand_value[2]-0 : 1; - if (len < 0) { - result = "Negative length"; - } - else { - result = operand_value[1].slice(-len); - resulttype = "t"; - } - break; - - case "SUBSTITUTE": - fulltext = operand_value[1]; - oldtext = operand_value[2]; - newtext = operand_value[3]; - if (operand_value[4] != null) { - which = operand_value[4]-0; - if (which <= 0) { - result = "Non-positive instance number"; - break; - } - } - else { - which = 0; - } - count = 0; - oldpos = 0; - result = ""; - while (true) { - pos = fulltext.indexOf(oldtext, oldpos); - if (pos >= 0) { - count++; //!!!!!! old test just in case: if (count>1000) {alert(pos); break;} - result += fulltext.substring(oldpos, pos); - if (which==0) { - result += newtext; // substitute - } - else if (which==count) { - result += newtext + fulltext.substring(pos+oldtext.length); - break; - } - else { - result += oldtext; // leave as was - } - oldpos = pos + oldtext.length; - } - else { // no more - result += fulltext.substring(oldpos); - break; - } - } - resulttype = "t"; - break; - - case "TRIM": - result = operand_value[1]; - result = result.replace(/^ */, ""); - result = result.replace(/ *$/, ""); - result = result.replace(/ +/g, " "); - resulttype = "t"; - break; - - case "UPPER": - result = operand_value[1].toUpperCase(); - resulttype = "t"; - break; - - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["FIND"] = [SocialCalc.Formula.StringFunctions, -2, "find", "", "text"]; -SocialCalc.Formula.FunctionList["LEFT"] = [SocialCalc.Formula.StringFunctions, -2, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["LEN"] = [SocialCalc.Formula.StringFunctions, 1, "txt", "", "text"]; -SocialCalc.Formula.FunctionList["LOWER"] = [SocialCalc.Formula.StringFunctions, 1, "txt", "", "text"]; -SocialCalc.Formula.FunctionList["MID"] = [SocialCalc.Formula.StringFunctions, 3, "mid", "", "text"]; -SocialCalc.Formula.FunctionList["PROPER"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["REPLACE"] = [SocialCalc.Formula.StringFunctions, 4, "replace", "", "text"]; -SocialCalc.Formula.FunctionList["REPT"] = [SocialCalc.Formula.StringFunctions, 2, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["RIGHT"] = [SocialCalc.Formula.StringFunctions, -1, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["SUBSTITUTE"] = [SocialCalc.Formula.StringFunctions, -3, "subs", "", "text"]; -SocialCalc.Formula.FunctionList["TRIM"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["UPPER"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; - -/* -# -# is_functions: -# -# ISBLANK(value) -# ISERR(value) -# ISERROR(value) -# ISLOGICAL(value) -# ISNA(value) -# ISNONTEXT(value) -# ISNUMBER(value) -# ISTEXT(value) -# -*/ - -SocialCalc.Formula.IsFunctions = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - - case "ISBLANK": - result = value.type == "b" ? 1 : 0; - break; - - case "ISERR": - result = t == "e" ? (value.type == "e#N/A" ? 0 : 1) : 0; - break; - - case "ISERROR": - result = t == "e" ? 1 : 0; - break; - - case "ISLOGICAL": - result = value.type == "nl" ? 1 : 0; - break; - - case "ISNA": - result = value.type == "e#N/A" ? 1 : 0; - break; - - case "ISNONTEXT": - result = t == "t" ? 0 : 1; - break; - - case "ISNUMBER": - result = t == "n" ? 1 : 0; - break; - - case "ISTEXT": - result = t == "t" ? 1 : 0; - break; - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["ISBLANK"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISERR"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISERROR"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISLOGICAL"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNA"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNONTEXT"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNUMBER"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISTEXT"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; - -/* -# -# ntv_functions: -# -# N(value) -# T(value) -# VALUE(value) -# -*/ - -SocialCalc.Formula.NTVFunctions = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - - case "N": - result = t == "n" ? value.value-0 : 0; - resulttype = "n"; - break; - - case "T": - result = t == "t" ? value.value+"" : ""; - resulttype = "t"; - break; - - case "VALUE": - if (t == "n" || t == "b") { - result = value.value || 0; - resulttype = "n"; - } - else if (t == "t") { - value = SocialCalc.DetermineValueType(value.value); - if (value.type.charAt(0) != "n") { - result = 0; - resulttype = "e#VALUE!"; - } - else { - result = value.value-0; - resulttype = "n"; - } - } - break; - } - - if (t == "e") { // error trumps - resulttype = value.type; - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["N"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["T"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["VALUE"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "text"]; - -/* -# -# ABS(value) -# ACOS(value) -# ASIN(value) -# ATAN(value) -# COS(value) -# DEGREES(value) -# EVEN(value) -# EXP(value) -# FACT(value) -# INT(value) -# LN(value) -# LOG10(value) -# ODD(value) -# RADIANS(value) -# SIN(value) -# SQRT(value) -# TAN(value) -# -*/ - -SocialCalc.Formula.Math1Functions = function(fname, operand, foperand, sheet) { - - var v1, value, f; - var result = {}; - - var scf = SocialCalc.Formula; - - v1 = scf.OperandAsNumber(sheet, foperand); - value = v1.value; - result.type = scf.LookupResultType(v1.type, v1.type, scf.TypeLookupTable.oneargnumeric); - - if (result.type == "n") { - switch (fname) { - case "ABS": - value = Math.abs(value); - break; - - case "ACOS": - if (value >= -1 && value <= 1) { - value = Math.acos(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "ASIN": - if (value >= -1 && value <= 1) { - value = Math.asin(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "ATAN": - value = Math.atan(value); - break; - - case "COS": - value = Math.cos(value); - break; - - case "DEGREES": - value = value * 180/Math.PI; - break; - - case "EVEN": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (Math.floor(value + 1) % 2); - } - else { // integer - value = value + (value % 2); - } - if (v1.value < 0) value = -value; - break; - - case "EXP": - value = Math.exp(value); - break; - - case "FACT": - f = 1; - value = Math.floor(value); - for (;value>0;value--) { - f *= value; - } - value = f; - break; - - case "INT": - value = Math.floor(value); // spreadsheet INT is floor(), not int() - break; - - case "LN": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclnarg; - } - value = Math.log(value); - break; - - case "LOG10": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclog10arg; - } - value = Math.log(value)/Math.log(10); - break; - - case "ODD": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (1 - (Math.floor(value + 1) % 2)); - } - else { // integer - value = value + (1 - (value % 2)); - } - if (v1.value < 0) value = -value; - break; - - case "RADIANS": - value = value * Math.PI/180; - break; - - case "SIN": - value = Math.sin(value); - break; - - case "SQRT": - if (value >= 0) { - value = Math.sqrt(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "TAN": - if (Math.cos(value) != 0) { - value = Math.tan(value); - } - else { - result.type = "e#NUM!"; - } - break; - } - } - - result.value = value; - operand.push(result); - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["ABS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ACOS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ASIN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ATAN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["COS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["DEGREES"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["EVEN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["EXP"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["FACT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["INT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["LN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["LOG10"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ODD"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["RADIANS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["SIN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["SQRT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["TAN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; - - -/* -# -# ATAN2(x, y) -# MOD(a, b) -# POWER(a, b) -# TRUNC(value, precision) -# -*/ - -SocialCalc.Formula.Math2Functions = function(fname, operand, foperand, sheet) { - - var xval, yval, value, quotient, decimalscale, i; - var result = {}; - - var scf = SocialCalc.Formula; - - xval = scf.OperandAsNumber(sheet, foperand); - yval = scf.OperandAsNumber(sheet, foperand); - value = 0; - result.type = scf.LookupResultType(xval.type, yval.type, scf.TypeLookupTable.twoargnumeric); - - if (result.type == "n") { - switch (fname) { - case "ATAN2": - if (xval.value == 0 && yval.value == 0) { - result.type = "e#DIV/0!"; - } - else { - result.value = Math.atan2(yval.value, xval.value); - } - break; - - case "POWER": - result.value = Math.pow(xval.value, yval.value); - if (isNaN(result.value)) { - result.value = 0; - result.type = "e#NUM!"; - } - break; - - case "MOD": // en.wikipedia.org/wiki/Modulo_operation, etc. - if (yval.value == 0) { - result.type = "e#DIV/0!"; - } - else { - quotient = xval.value/yval.value; - quotient = Math.floor(quotient); - result.value = xval.value - (quotient * yval.value); - } - break; - - case "TRUNC": - decimalscale = 1; // cut down to required number of decimal digits - if (yval.value >= 0) { - yval.value = Math.floor(yval.value); - for (i=0; i 0) { - decimalscale = 1; // cut down to required number of decimal digits - value2.value = Math.floor(value2.value); - for (i=0; i 0 ) { - method = scf.OperandAsNumber(sheet, foperand); - } - if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (scf.CheckForErrorValue(operand, method)) return; - - depreciation = 0; // calculated for each period - accumulateddepreciation = 0; // accumulated by adding each period's - - for (i=1; i<=period.value-0 && i<=lifetime.value; i++) { // calculate for each period based on net from previous - depreciation = (cost.value - accumulateddepreciation) * (method.value / lifetime.value); - if (cost.value - accumulateddepreciation - depreciation < salvage.value) { // don't go lower than salvage value - depreciation = cost.value - accumulateddepreciation - salvage.value; - } - accumulateddepreciation += depreciation; - } - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["DDB"] = [SocialCalc.Formula.DDBFunction, -4, "ddb", "", "financial"]; - -/* -# -# SLN(cost,salvage,lifetime) -# -# Depreciation for each period by straight-line method -# See: http://en.wikipedia.org/wiki/Depreciation -# -*/ - -SocialCalc.Formula.SLNFunction = function(fname, operand, foperand, sheet) { - - var depreciation; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - - if (lifetime.value < 1) { - scf.FunctionSpecificError(fname, operand, "e#NUM!", SocialCalc.Constants.s_sheetfuncslnlife); - return 0; - } - - depreciation = (cost.value - salvage.value) / lifetime.value; - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["SLN"] = [SocialCalc.Formula.SLNFunction, 3, "csl", "", "financial"]; - -/* -# -# SYD(cost,salvage,lifetime,period) -# -# Depreciation by Sum of Year's Digits method -# -*/ - -SocialCalc.Formula.SYDFunction = function(fname, operand, foperand, sheet) { - - var depreciation, sumperiods; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - var period = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - if (scf.CheckForErrorValue(operand, period)) return; - - if (lifetime.value < 1 || period.value <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return 0; - } - - sumperiods = ((lifetime.value + 1) * lifetime.value)/2; // add up 1 through lifetime - depreciation = (cost.value - salvage.value) * (lifetime.value - period.value + 1) / sumperiods; // calc depreciation - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["SYD"] = [SocialCalc.Formula.SYDFunction, 4, "cslp", "", "financial"]; - -/* -# -# FV(rate, n, payment, [pv, [paytype]]) -# NPER(rate, payment, pv, [fv, [paytype]]) -# PMT(rate, n, pv, [fv, [paytype]]) -# PV(rate, n, payment, [fv, [paytype]]) -# RATE(n, payment, pv, [fv, [paytype, [guess]]]) -# -# Following the Open Document Format formula specification: -# -# PV = - Fv - (Payment * Nper) [if rate equals 0] -# Pv*(1+Rate)^Nper + Payment * (1 + Rate*PaymentType) * ( (1+Rate)^nper -1)/Rate + Fv = 0 -# -# For each function, the formulas are solved for the appropriate value (transformed using -# basic algebra). -# -*/ - -SocialCalc.Formula.InterestFunctions = function(fname, operand, foperand, sheet) { - - var resulttype, result, dval, eval, fval; - var pv, fv, rate, n, payment, paytype, guess, part1, part2, part3, part4, part5; - var olddelta, maxloop, tries, deltaepsilon, rate, oldrate, m; - - var scf = SocialCalc.Formula; - - var aval = scf.OperandAsNumber(sheet, foperand); - var bval = scf.OperandAsNumber(sheet, foperand); - var cval = scf.OperandAsNumber(sheet, foperand); - - resulttype = scf.LookupResultType(aval.type, bval.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, cval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - dval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, dval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - eval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, eval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - if (fname != "RATE") { // only rate has 6 possible args - scf.FunctionArgsError(fname, operand); - return 0; - } - fval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, fval.type, scf.TypeLookupTable.twoargnumeric); - } - } - } - - if (resulttype == "n") { - switch (fname) { - case "FV": // FV(rate, n, payment, [pv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - pv = dval!=null ? dval.value : 0; // get value if present, or use default - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == 0) { // simple calculation if no interest - fv = -pv - (payment * n); - } - else { - fv = -(pv*Math.pow(1+rate,n) + payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate); - } - result = fv; - resulttype = 'n$'; - break; - - case "NPER": // NPER(rate, payment, pv, [fv, [paytype]]) - rate = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == 0) { // simple calculation if no interest - if (payment == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - n = (pv + fv)/(-payment); - } - else { - part1 = payment * (1 + rate * paytype) / rate; - part2 = pv + part1; - if (part2 == 0 || rate <= -1) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part3 = (part1 - fv) / part2; - if (part3 <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part4 = Math.log(part3); - part5 = Math.log(1 + rate); // rate > -1 - n = part4/part5; - } - result = n; - resulttype = 'n'; - break; - - case "PMT": // PMT(rate, n, pv, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (n == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - else if (rate == 0) { // simple calculation if no interest - payment = (fv - pv)/n; - } - else { - payment = (0 - fv - pv*Math.pow(1+rate,n))/((1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate); - } - result = payment; - resulttype = 'n$'; - break; - - case "PV": // PV(rate, n, payment, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == -1) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - else if (rate == 0) { // simple calculation if no interest - pv = -fv - (payment * n); - } - else { - pv = (-fv - payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate)/(Math.pow(1+rate,n)); - } - result = pv; - resulttype = 'n$'; - break; - - case "RATE": // RATE(n, payment, pv, [fv, [paytype, [guess]]]) - n = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - guess = fval!=null ? fval.value : 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 100; - tries = 0; - delta = 1; - epsilon = 0.0000001; // this is close enough - rate = guess || 0.00000001; // zero is not allowed - while ((delta >= 0 ? delta : -delta) > epsilon && (rate != oldrate)) { - delta = fv + pv*Math.pow(1+rate,n) + payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate; - if (olddelta!=null) { - m = (delta - olddelta)/(rate - oldrate) || .001; // get slope (not zero) - oldrate = rate; - rate = rate - delta / m; // look for zero crossing - olddelta = delta; - } - else { // first time - no old values - oldrate = rate; - rate = 1.1 * rate; - olddelta = delta; - } - tries++; - if (tries >= maxloop) { // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - result = rate; - resulttype = 'n%'; - break; - } - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["FV"] = [SocialCalc.Formula.InterestFunctions, -3, "fv", "", "financial"]; -SocialCalc.Formula.FunctionList["NPER"] = [SocialCalc.Formula.InterestFunctions, -3, "nper", "", "financial"]; -SocialCalc.Formula.FunctionList["PMT"] = [SocialCalc.Formula.InterestFunctions, -3, "pmt", "", "financial"]; -SocialCalc.Formula.FunctionList["PV"] = [SocialCalc.Formula.InterestFunctions, -3, "pv", "", "financial"]; -SocialCalc.Formula.FunctionList["RATE"] = [SocialCalc.Formula.InterestFunctions, -3, "rate", "", "financial"]; - -/* -# -# NPV(rate,v1,v2,c1:c2,...) -# -*/ - -SocialCalc.Formula.NPVFunction = function(fname, operand, foperand, sheet) { - - var resulttypenpv, rate, sum, factor, value1; - - var scf = SocialCalc.Formula; - - var rate = scf.OperandAsNumber(sheet, foperand); - if (scf.CheckForErrorValue(operand, rate)) return; - - sum = 0; - resulttypenpv = "n"; - factor = 1; - - while (foperand.length) { - value1 = scf.OperandValueAndType(sheet, foperand); - if (value1.type.charAt(0) == "n") { - factor *= (1 + rate.value); - if (factor == 0) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - sum += value1.value / factor; - resulttypenpv = scf.LookupResultType(value1.type, resulttypenpv || value1.type, scf.TypeLookupTable.plus); - } - else if (value1.type.charAt(0) == "e" && resulttypenpv.charAt(0) != "e") { - resulttypenpv = value1.type; - break; - } - } - - if (resulttypenpv.charAt(0) == "n") { - resulttypenpv = 'n$'; - } - - scf.PushOperand(operand, resulttypenpv, sum); - - return; - - } - -SocialCalc.Formula.FunctionList["NPV"] = [SocialCalc.Formula.NPVFunction, -2, "npv", "", "financial"]; - -/* -# -# IRR(c1:c2,[guess]) -# -*/ - -SocialCalc.Formula.IRRFunction = function(fname, operand, foperand, sheet) { - - var value1, guess, oldsum, maxloop, tries, epsilon, rate, oldrate, m, sum, factor, i; - var rangeoperand = []; - var cashflows = []; - - var scf = SocialCalc.Formula; - - rangeoperand.push(foperand.pop()); // first operand is a range - - while (rangeoperand.length) { // get values from range so we can do iterative approximations - value1 = scf.OperandValueAndType(sheet, rangeoperand); - if (value1.type.charAt(0) == "n") { - cashflows.push(value1.value); - } - else if (value1.type.charAt(0) == "e") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - } - - if (!cashflows.length) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - - guess = {value: 0}; - - if (foperand.length) { // guess is provided - guess = scf.OperandAsNumber(sheet, foperand); - if (guess.type.charAt(0) != "n" && guess.type.charAt(0) != "b") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { // should be no more args - scf.FunctionArgsError(fname, operand); - return; - } - } - - guess.value = guess.value || 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 20; - tries = 0; - epsilon = 0.0000001; // this is close enough - rate = guess.value; - sum = 1; - - while ((sum >= 0 ? sum : -sum) > epsilon && (rate != oldrate)) { - sum = 0; - factor = 1; - for (i=0; i= maxloop) { // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - - scf.PushOperand(operand, 'n%', rate); - - return; - - } - -SocialCalc.Formula.FunctionList["IRR"] = [SocialCalc.Formula.IRRFunction, -1, "irr", "", "financial"]; - -// -// SHEET CACHE -// - -SocialCalc.Formula.SheetCache = { - - // Sheet data: Attributes are each sheet in the cache with values of an object with: - // - // sheet: sheet-obj (or null, meaning not found) - // recalcstate: constants.asloaded = as loaded - // constants.recalcing = being recalced now - // constants.recalcdone = recalc done - // name: name of sheet (in case just have object and don't know name) - // - - sheets: {}, - - // Waiting for loading: - // If sheet is not in cache, this is set to the sheetname being loaded - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForLoading: null, - - // Constants to use for setting sheets[*].recalcstate: - - constants: {asloaded: 0, recalcing: 1, recalcdone: 2}, - - loadsheet: null // (deprecated - use SocialCalc.RecalcInfo.LoadSheet) - - }; - -// -// othersheet = SocialCalc.Formula.FindInSheetCache(sheetname) -// -// Returns a SocialCalc.Sheet object corresponding to string sheetname -// or null if the sheet is not available or in error. -// -// Each sheet is loaded only once and then stored in a cache. -// Loading is handled elsewhere, e.g., in the recalc loop. -// - -SocialCalc.Formula.FindInSheetCache = function(sheetname) { - - var str; - var sfsc = SocialCalc.Formula.SheetCache; - - var nsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); // normalize different versions - - if (sfsc.sheets[nsheetname]) { // a sheet by that name is in the cache already - return sfsc.sheets[nsheetname].sheet; // return it - } - - if (sfsc.waitingForLoading) { // waiting already - only queue up one - return null; // return not found - } - - if (sfsc.loadsheet) { // Deprecated old format synchronous callback -alert("Using SocialCalc.Formula.SheetCache.loadsheet - deprecated"); - return SocialCalc.Formula.AddSheetToCache(nsheetname, sfsc.loadsheet(nsheetname)); - } - - sfsc.waitingForLoading = nsheetname; // let recalc loop know that we have a sheet to load - - return null; // return not found - - } - -// -// newsheet = SocialCalc.Formula.AddSheetToCache(sheetname, str) -// -// Adds a new sheet to the sheet cache. -// Returns the sheet object filled out with the str (a saved sheet). -// - -SocialCalc.Formula.AddSheetToCache = function(sheetname, str) { - - var newsheet = null; - var sfsc = SocialCalc.Formula.SheetCache; - var sfscc = sfsc.constants; - var newsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); - - if (str) { - newsheet = new SocialCalc.Sheet(); - newsheet.ParseSheetSave(str); - } - - sfsc.sheets[newsheetname] = {sheet: newsheet, recalcstate: sfscc.asloaded, name: newsheetname}; - - SocialCalc.Formula.FreshnessInfo.sheets[newsheetname] = true; - - return newsheet; - - } - -// -// nsheet = SocialCalc.Formula.NormalizeSheetName(sheetname) -// - -SocialCalc.Formula.NormalizeSheetName = function(sheetname) { - - if (SocialCalc.Callbacks.NormalizeSheetName) { - return SocialCalc.Callbacks.NormalizeSheetName(sheetname); - } - else { - return sheetname.toLowerCase(); - } - } - -// -// REMOTE FUNCTION INFO -// - -SocialCalc.Formula.RemoteFunctionInfo = { - - // Waiting for server: - // If waiting for an XHR response from the server, this is set to some non-blank status text - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForServer: null - - }; - -// -// FRESHNESS INFO -// -// This information is generated during recalc. -// It may be used to help determine when the recalc data in a spreadsheet -// may be out of date. -// For example, it may be used to display a message like: -// "Dependent on sheet 'FOO' which was updated more recently than this printout" - -SocialCalc.Formula.FreshnessInfo = { - - // For each external sheet referenced successfully an attribute of that name with value true. - - sheets: {}, - - // For each volatile function that is called an attribute of that name with value true. - - volatile: {}, - - // Set to false when started and true when recalc completes - - recalc_completed: false - - }; - -SocialCalc.Formula.FreshnessInfoReset = function() { - - var scffi = SocialCalc.Formula.FreshnessInfo; - - scffi.sheets = {}; - scffi.volatile = {}; - scffi.recalc_completed = false; - - } - -// -// MISC ROUTINES -// - -// -// result = SocialCalc.Formula.PlainCoord(coord) -// -// Returns: coord without any $'s -// - -SocialCalc.Formula.PlainCoord = function(coord) { - - if (coord.indexOf("$") == -1) return coord; - - return coord.replace(/\$/g, ""); // remove any $'s - - } - -// -// result = SocialCalc.Formula.OrderRangeParts(coord1, coord2) -// -// Returns: {c1: col, r1: row, c2: col, r2 = row} with c1/r1 upper left -// - -SocialCalc.Formula.OrderRangeParts = function(coord1, coord2) { - - var cr1, cr2; - var result = {}; - - cr1 = SocialCalc.coordToCr(coord1); - cr2 = SocialCalc.coordToCr(coord2); - if (cr1.col > cr2.col) { result.c1 = cr2.col; result.c2 = cr1.col; } - else { result.c1 = cr1.col; result.c2 = cr2.col; } - if (cr1.row > cr2.row) { result.r1 = cr2.row; result.r2 = cr1.row; } - else { result.r1 = cr1.row; result.r2 = cr2.row; } - - return result; - - } - -// -// cond = SocialCalc.Formula.TestCriteria(value, type, criteria) -// -// Determines whether a value/type meets the criteria. -// A criteria can be a numeric value, text beginning with <, <=, =, >=, >, <>, text by itself is start of text to match. -// Used by a variety of functions, including the "D" functions (DSUM, etc.). -// -// Returns true or false -// - -SocialCalc.Formula.TestCriteria = function(value, type, criteria) { - - var comparitor, basestring, basevalue, cond, testvalue; - - if (criteria == null) { // undefined (e.g., error value) is always false - return false; - } - - criteria = criteria + ""; - comparitor = criteria.charAt(0); // look for comparitor - if (comparitor == "=" || comparitor == "<" || comparitor == ">") { - basestring = criteria.substring(1); - } - else { - comparitor = criteria.substring(0,2); - if (comparitor == "<=" || comparitor == "<>" || comparitor == ">=") { - basestring = criteria.substring(2); - } - else { - comparitor = "none"; - basestring = criteria; - } - } - - basevalue = SocialCalc.DetermineValueType(basestring); // get type of value being compared - if (!basevalue.type) { // no criteria base value given - if (comparitor == "none") { // blank criteria matches nothing - return false; - } - if (type.charAt(0) == "b") { // comparing to empty cell - if (comparitor == "=") { // empty equals empty - return true; - } - } - else { - if (comparitor == "<>") { // "something" does not equal empty - return true; - } - } - return false; // otherwise false - } - - cond = false; - - if (basevalue.type.charAt(0) == "n" && type.charAt(0) == "t") { // criteria is number, but value is text - testvalue = SocialCalc.DetermineValueType(value); - if (testvalue.type.charAt(0) == "n") { // could be number - make it one - value = testvalue.value; - type = testvalue.type; - } - } - - if (type.charAt(0) == "n" && basevalue.type.charAt(0) == "n") { // compare two numbers - value = value - 0; // make sure numbers - basevalue.value = basevalue.value - 0; - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - case "none": - cond = value == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } - - else if (type.charAt(0) == "e") { // error on left - cond = false; - } - - else if (basevalue.type.charAt(0) == "e") { // error on right - cond = false; - } - - else { // text, maybe mixed with number or blank - if (type.charAt(0) == "n") { - value = SocialCalc.format_number_for_display(value, "n", ""); - } - if (basevalue.type.charAt(0) == "n") { - return false; // if number and didn't match already, isn't a match - } - - value = value ? value.toLowerCase() : ""; - basevalue.value = basevalue.value ? basevalue.value.toLowerCase() : ""; - - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - cond = value == basevalue.value; - break; - - case "none": - cond = value.substring(0, basevalue.value.length) == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } - - return cond; - - } - diff --git a/DeveloperAdoption/public/socialcalc/images/sc-1x1.gif b/DeveloperAdoption/public/socialcalc/images/sc-1x1.gif deleted file mode 100644 index 1d9a4f5..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-1x1.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-aligncenter.gif b/DeveloperAdoption/public/socialcalc/images/sc-aligncenter.gif deleted file mode 100644 index 81fae2a..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-aligncenter.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-alignleft.gif b/DeveloperAdoption/public/socialcalc/images/sc-alignleft.gif deleted file mode 100644 index 0f3fea7..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-alignleft.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-alignright.gif b/DeveloperAdoption/public/socialcalc/images/sc-alignright.gif deleted file mode 100644 index c89e242..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-alignright.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-bordersoff.gif b/DeveloperAdoption/public/socialcalc/images/sc-bordersoff.gif deleted file mode 100644 index ffad4a2..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-bordersoff.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-borderson.gif b/DeveloperAdoption/public/socialcalc/images/sc-borderson.gif deleted file mode 100644 index 0224acc..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-borderson.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-chooserarrow.gif b/DeveloperAdoption/public/socialcalc/images/sc-chooserarrow.gif deleted file mode 100644 index b9010e2..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-chooserarrow.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-commentbg.gif b/DeveloperAdoption/public/socialcalc/images/sc-commentbg.gif deleted file mode 100644 index 0b5e17a..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-commentbg.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-copy.gif b/DeveloperAdoption/public/socialcalc/images/sc-copy.gif deleted file mode 100644 index 4ed54d0..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-copy.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-cursorinsertleft.gif b/DeveloperAdoption/public/socialcalc/images/sc-cursorinsertleft.gif deleted file mode 100644 index 03e9769..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-cursorinsertleft.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-cursorinsertup.gif b/DeveloperAdoption/public/socialcalc/images/sc-cursorinsertup.gif deleted file mode 100644 index 03e9769..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-cursorinsertup.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-cut.gif b/DeveloperAdoption/public/socialcalc/images/sc-cut.gif deleted file mode 100644 index cb906cc..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-cut.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-defaultcolor.gif b/DeveloperAdoption/public/socialcalc/images/sc-defaultcolor.gif deleted file mode 100644 index e9d69cd..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-defaultcolor.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-delete.gif b/DeveloperAdoption/public/socialcalc/images/sc-delete.gif deleted file mode 100644 index b8d18a7..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-delete.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-deletecol.gif b/DeveloperAdoption/public/socialcalc/images/sc-deletecol.gif deleted file mode 100644 index 0242f70..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-deletecol.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-deleterow.gif b/DeveloperAdoption/public/socialcalc/images/sc-deleterow.gif deleted file mode 100644 index 0ff543e..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-deleterow.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-divider1.gif b/DeveloperAdoption/public/socialcalc/images/sc-divider1.gif deleted file mode 100644 index 2f3ac5b..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-divider1.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-drag-handles.gif b/DeveloperAdoption/public/socialcalc/images/sc-drag-handles.gif deleted file mode 100644 index f380b75..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-drag-handles.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-drag-handles.png b/DeveloperAdoption/public/socialcalc/images/sc-drag-handles.png deleted file mode 100644 index 4ea5f51..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-drag-handles.png and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-endcap-h.gif b/DeveloperAdoption/public/socialcalc/images/sc-endcap-h.gif deleted file mode 100644 index 900afd6..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-endcap-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-endcap-v.gif b/DeveloperAdoption/public/socialcalc/images/sc-endcap-v.gif deleted file mode 100644 index 3e6ba4f..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-endcap-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-filldown.gif b/DeveloperAdoption/public/socialcalc/images/sc-filldown.gif deleted file mode 100644 index a0d6cba..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-filldown.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-fillright.gif b/DeveloperAdoption/public/socialcalc/images/sc-fillright.gif deleted file mode 100644 index 5169a72..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-fillright.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-formuladialog.gif b/DeveloperAdoption/public/socialcalc/images/sc-formuladialog.gif deleted file mode 100644 index 404f991..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-formuladialog.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-insertcol.gif b/DeveloperAdoption/public/socialcalc/images/sc-insertcol.gif deleted file mode 100644 index 8be72e8..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-insertcol.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-insertrow.gif b/DeveloperAdoption/public/socialcalc/images/sc-insertrow.gif deleted file mode 100644 index 28ab390..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-insertrow.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-less-hd.gif b/DeveloperAdoption/public/socialcalc/images/sc-less-hd.gif deleted file mode 100644 index 689ebc9..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-less-hd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-less-hh.gif b/DeveloperAdoption/public/socialcalc/images/sc-less-hh.gif deleted file mode 100644 index f1d978e..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-less-hh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-less-hn.gif b/DeveloperAdoption/public/socialcalc/images/sc-less-hn.gif deleted file mode 100644 index 81245b8..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-less-hn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-less-vd.gif b/DeveloperAdoption/public/socialcalc/images/sc-less-vd.gif deleted file mode 100644 index 605801f..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-less-vd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-less-vh.gif b/DeveloperAdoption/public/socialcalc/images/sc-less-vh.gif deleted file mode 100644 index aa2de92..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-less-vh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-less-vn.gif b/DeveloperAdoption/public/socialcalc/images/sc-less-vn.gif deleted file mode 100644 index 88290ef..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-less-vn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-linkdialog.gif b/DeveloperAdoption/public/socialcalc/images/sc-linkdialog.gif deleted file mode 100644 index d206394..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-linkdialog.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-linkout.gif b/DeveloperAdoption/public/socialcalc/images/sc-linkout.gif deleted file mode 100644 index 9215def..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-linkout.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-logo.gif b/DeveloperAdoption/public/socialcalc/images/sc-logo.gif deleted file mode 100644 index b76d534..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-logo.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-main-h.gif b/DeveloperAdoption/public/socialcalc/images/sc-main-h.gif deleted file mode 100644 index 0b260ed..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-main-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-main-v.gif b/DeveloperAdoption/public/socialcalc/images/sc-main-v.gif deleted file mode 100644 index 0fb12bb..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-main-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-merge.gif b/DeveloperAdoption/public/socialcalc/images/sc-merge.gif deleted file mode 100644 index 666b597..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-merge.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-more-hd.gif b/DeveloperAdoption/public/socialcalc/images/sc-more-hd.gif deleted file mode 100644 index 2eb56e0..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-more-hd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-more-hh.gif b/DeveloperAdoption/public/socialcalc/images/sc-more-hh.gif deleted file mode 100644 index fc1059a..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-more-hh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-more-hn.gif b/DeveloperAdoption/public/socialcalc/images/sc-more-hn.gif deleted file mode 100644 index 7e07204..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-more-hn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-more-vd.gif b/DeveloperAdoption/public/socialcalc/images/sc-more-vd.gif deleted file mode 100644 index 055f4ac..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-more-vd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-more-vh.gif b/DeveloperAdoption/public/socialcalc/images/sc-more-vh.gif deleted file mode 100644 index 07acdf7..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-more-vh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-more-vn.gif b/DeveloperAdoption/public/socialcalc/images/sc-more-vn.gif deleted file mode 100644 index 922756d..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-more-vn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-movefrom.gif b/DeveloperAdoption/public/socialcalc/images/sc-movefrom.gif deleted file mode 100644 index 7f665eb..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-movefrom.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-movefromoff.gif b/DeveloperAdoption/public/socialcalc/images/sc-movefromoff.gif deleted file mode 100644 index 1760f02..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-movefromoff.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-moveinsert.gif b/DeveloperAdoption/public/socialcalc/images/sc-moveinsert.gif deleted file mode 100644 index f082171..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-moveinsert.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-moveinsertoff.gif b/DeveloperAdoption/public/socialcalc/images/sc-moveinsertoff.gif deleted file mode 100644 index cbb4f30..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-moveinsertoff.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-movepaste.gif b/DeveloperAdoption/public/socialcalc/images/sc-movepaste.gif deleted file mode 100644 index 93108d1..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-movepaste.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-movepasteoff.gif b/DeveloperAdoption/public/socialcalc/images/sc-movepasteoff.gif deleted file mode 100644 index 254c572..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-movepasteoff.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-multilinedialog.gif b/DeveloperAdoption/public/socialcalc/images/sc-multilinedialog.gif deleted file mode 100644 index 1e0d6d6..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-multilinedialog.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-paneslider-h.gif b/DeveloperAdoption/public/socialcalc/images/sc-paneslider-h.gif deleted file mode 100644 index 8cb31d4..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-paneslider-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-paneslider-v.gif b/DeveloperAdoption/public/socialcalc/images/sc-paneslider-v.gif deleted file mode 100644 index c4bcaee..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-paneslider-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-paste.gif b/DeveloperAdoption/public/socialcalc/images/sc-paste.gif deleted file mode 100644 index e39f06c..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-paste.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-pasteformats.gif b/DeveloperAdoption/public/socialcalc/images/sc-pasteformats.gif deleted file mode 100644 index 94b2f50..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-pasteformats.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-range2.gif b/DeveloperAdoption/public/socialcalc/images/sc-range2.gif deleted file mode 100644 index e9d69cd..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-range2.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-recalc.gif b/DeveloperAdoption/public/socialcalc/images/sc-recalc.gif deleted file mode 100644 index 6e1ebb8..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-recalc.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-redo.gif b/DeveloperAdoption/public/socialcalc/images/sc-redo.gif deleted file mode 100644 index b14aca8..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-redo.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-scrollarea-h.gif b/DeveloperAdoption/public/socialcalc/images/sc-scrollarea-h.gif deleted file mode 100644 index c12715b..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-scrollarea-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-scrollarea-v.gif b/DeveloperAdoption/public/socialcalc/images/sc-scrollarea-v.gif deleted file mode 100644 index df99311..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-scrollarea-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-sumdialog.gif b/DeveloperAdoption/public/socialcalc/images/sc-sumdialog.gif deleted file mode 100644 index f6bb9ad..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-sumdialog.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-swapcolors.gif b/DeveloperAdoption/public/socialcalc/images/sc-swapcolors.gif deleted file mode 100644 index 49c6e80..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-swapcolors.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-thumb-hd.gif b/DeveloperAdoption/public/socialcalc/images/sc-thumb-hd.gif deleted file mode 100644 index e3afbd2..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-thumb-hd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-thumb-hh.gif b/DeveloperAdoption/public/socialcalc/images/sc-thumb-hh.gif deleted file mode 100644 index 47237c2..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-thumb-hh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-thumb-hn.gif b/DeveloperAdoption/public/socialcalc/images/sc-thumb-hn.gif deleted file mode 100644 index a8e0f08..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-thumb-hn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-thumb-vd.gif b/DeveloperAdoption/public/socialcalc/images/sc-thumb-vd.gif deleted file mode 100644 index c900734..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-thumb-vd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-thumb-vh.gif b/DeveloperAdoption/public/socialcalc/images/sc-thumb-vh.gif deleted file mode 100644 index a3229c7..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-thumb-vh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-thumb-vn.gif b/DeveloperAdoption/public/socialcalc/images/sc-thumb-vn.gif deleted file mode 100644 index d528f43..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-thumb-vn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-trackingline-h.gif b/DeveloperAdoption/public/socialcalc/images/sc-trackingline-h.gif deleted file mode 100644 index efeff83..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-trackingline-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-trackingline-v.gif b/DeveloperAdoption/public/socialcalc/images/sc-trackingline-v.gif deleted file mode 100644 index ce6e8cb..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-trackingline-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-undo.gif b/DeveloperAdoption/public/socialcalc/images/sc-undo.gif deleted file mode 100644 index 66a07f8..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-undo.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-unmerge.gif b/DeveloperAdoption/public/socialcalc/images/sc-unmerge.gif deleted file mode 100644 index 7e0df32..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-unmerge.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-wikiflag.gif b/DeveloperAdoption/public/socialcalc/images/sc-wikiflag.gif deleted file mode 100644 index caf0e3f..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-wikiflag.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/images/sc-wikilinkflag.gif b/DeveloperAdoption/public/socialcalc/images/sc-wikilinkflag.gif deleted file mode 100644 index 5ed3700..0000000 Binary files a/DeveloperAdoption/public/socialcalc/images/sc-wikilinkflag.gif and /dev/null differ diff --git a/DeveloperAdoption/public/socialcalc/simpleedit14.pl b/DeveloperAdoption/public/socialcalc/simpleedit14.pl deleted file mode 100644 index 7169349..0000000 --- a/DeveloperAdoption/public/socialcalc/simpleedit14.pl +++ /dev/null @@ -1,919 +0,0 @@ -#!/usr/bin/perl - - use strict; - use CGI qw(:standard); - use URI; - use HTTP::Daemon; - use HTTP::Status; - use HTTP::Response; - use Socket; - use CGI::Cookie; - - use SocialCalcServersideUtilities; - - - my $datadir = "se2-data/"; - my $versionstr = "2.01"; - my $jsdir = "/sgi/scjstest/"; - -# -# This whole first section lets this code run either as a CGI script on a server -# or standalone on the desktop run from the Perl command line. -# -# The main processing starts with process_request. -# - - if ($ENV{REQUEST_METHOD}) { # being run as a CGI on a server - print "Content-type: text/html\n\n"; - my $q = new CGI; - print process_request($q); - exit; - } - - # running locally - do mini-server - - my $d = HTTP::Daemon->new ( - LocalPort => 6557, - Reuse => 1); - - if (!$d) { - print "simpleedit could not start on 127.0.0.1:6557\n"; - exit; - } - - print "simpleedit14\nAccess at: http://127.0.0.1:6557/\n"; - - while (my $c = $d->accept) { - - # Make sure the request is from our machine - - if ($c) { - my ($port, $host) = sockaddr_in(getpeername($c)); - if ($host ne inet_aton("127.0.0.1")) { - $c->close; # no - ignore request completely - undef($c); - next; - } - } - - # Process the request - - while ((defined $c) && (my $r = $c->get_request)) { - if ($r->method eq 'POST' || $r->method eq 'GET') { - $c->force_last_request; - my $uri = $r->uri; - if ($uri =~ /favicon/) { # if this is a request for favicon.ico, ignore - $c->send_error(RC_NOT_FOUND); - next; - } - if ($uri =~ /\/quit$/) { - $c->send_file_response("quitmessage.html"); - $c->close; - undef($c); - exit; - } - if ($uri =~ /\/([a-z\-0-9]+)\.(gif|js|css)$/) { # ok request - $uri = "$1.$2"; - $uri = "images/$uri" if $2 eq "gif"; -# if ($2 eq "js") { -# $res->content_type("text/html; charset=UTF-8"); -# } - $c->send_file_response($uri); - next; - } - - my $resp=""; - if ($r->method eq 'POST') { - my $q = new CGI($r->content()); - $resp = process_request($q) - } - else { - my $q = new CGI($r->uri->query()); - $resp = process_request($q) - } - my $res = new HTTP::Response(200); - $res->content_type("text/html; charset=UTF-8"); - $res->expires("-1d"); - $res->content($resp); - $c->send_response($res); - } - - else { - $c->send_error(RC_FORBIDDEN); - } - } - - $c->close; - undef($c); - } - -# -# Main routine starts here: -# - -sub process_request { - - my ($request) = @_; - my $q = new CGI($request); - - my $response; - - my ($statusmessage); - - if ($q->param("loadsheet")) { # Ajax request: loadsheet=pagename.sheetname - my $fullsheetname = $q->param("loadsheet"); - $fullsheetname =~ m/^(.*)\.(.*)$/; - my $pagename = $1; - my $sheetname = $2; - my $page = {}; - load_page($q, $pagename, $page); - my $sheetstr = $page->{items}{$sheetname}{text}; - my $htmlpos = index($sheetstr, "\nHTML:\n"); - if ($htmlpos >= 0) { - $sheetstr = substr($sheetstr, 0, $htmlpos); - } -sleep 1; - return $sheetstr; - } - - if ($q->param("wikitext")) { # Ajax request: wikitext=wikitext-url-encoded - my $wikitext = $q->param("wikitext"); - $wikitext = expand_wikitext($wikitext); -sleep 1; - return $wikitext; - } - - my $pagename = $q->param('pagename'); - - if ($q->param('newpage')) { - $pagename = $q->param('newpagename'); - } - - $pagename =~ s/[^a-zA-Z0-9_\-]*//g; - if (!$pagename) { - $pagename = "home"; - $statusmessage .= "No pagename given - using '$pagename'
    "; - } - - if ($q->param('savepageedit')) { - my $newstr; - $newstr = $q->param('pagetext'); - if ($q->param('edittype') eq "clean") { - my $page = {}; - load_page($q, $pagename, $page); - $newstr =~ s/^\[(spreadsheet|datatable|drawing)\:(.+?)\]/"[$1:$2:\n" . $page->{items}{$2}{text} . "\n:$1]"/gme; - } - open (PAGEFILEOUT, ">$datadir$pagename.page.txt"); - print PAGEFILEOUT $newstr; - close PAGEFILEOUT; - $statusmessage .= "Saved updated page '$pagename'.
    "; - } - - if ($q->param("editpage") || $q->param("editrawpage")) { # when one of the "editpage" buttons is pressed - return do_editpage($q, $pagename, $statusmessage); - } - - foreach my $p ($q->param) { # go through all the parameters - if ($p =~ /^edit(spreadsheet|datatable):(.*)/) { # "editspreadsheet:sheetname" pressed - return start_editsheet($pagename, $2, $q, $statusmessage); - } - if ($p =~ /^editdrawing:(.*)/) { # "editdrawing:sheetname" pressed - return start_editdrawing($pagename, $1, $q, $statusmessage); - } - } - - if ($q->param('savespreadsheet')) { # save the edited spreadsheet - my $page = {}; - load_page($q, $pagename, $page); - my $pagestr = $page->{raw}; - my $sheetname = $q->param('sheetname'); - my $sheettype = $page->{items}{$sheetname}{type}; - - $pagestr =~ s/^\[$sheettype\:$sheetname:.*?\:$sheettype\]/"[$sheettype:$sheetname:\n" . $q->param('newstr') . "\n:$sheettype]"/sme; - - open (PAGEFILEOUT, ">$datadir$pagename.page.txt"); - print PAGEFILEOUT $pagestr; - close PAGEFILEOUT; - $statusmessage = - "Saved updated $sheettype '$sheetname' on page '$pagename'.
    "; - } - - $response = do_displaypage($q, $pagename, $statusmessage); # Otherwise, display page - - return $response; - - } - -# -# load_page($q, $pagename, \%page) -# -# Loads the specified page and puts the parts into %page: -# -# %page{raw} - raw page text -# %page{clean} - page text with embedded items' bodies removed -# %page{items}{name} - hash with embedded item "name"'s info -# %page{items}{name}{text} - text of embedded item's body -# %page{items}{name}{type} - type embedded item (e.g., "spreadsheet") -# - -sub load_page { - - my ($q, $pagename, $page) = @_; - - $page->{bodies} = {}; - - open (PAGEFILEIN, "$datadir$pagename.page.txt"); - my ($rawstr, $cleanstr); - while (my $line = ) { - $line =~ s/\r//g; - $rawstr .= $line; - if ($line =~ m/^\[(spreadsheet|datatable|drawing)\:(.*?)\:/) { - my $type = $1; - my $name = $2; - $page->{items}{$name} = {type => $type, text => ""}; - my $itemstr; - while (my $sline = ) { - $sline =~ s/\r//g; - $rawstr .= $sline; - last if substr($sline, 0, length($type)+2) eq ":$type]"; - $itemstr .= $sline; - } - $page->{items}{$name}{text} = $itemstr; - $cleanstr .= "[$type:$name]\n"; - } - else { - $cleanstr .= $line; - } - } - close PAGEFILEIN; - $page->{raw} = $rawstr; - $page->{clean} = $cleanstr; - - return; - } - -# -# $response = do_displaypage($q, $pagename, $statusmessage) - Display page -# - -sub do_displaypage { - - my ($q, $pagename, $statusmessage) = @_; - my $response; - - my $page = {}; - load_page($q, $pagename, $page); - - open (PAGEFILEIN, "$datadir$pagename.page.txt"); - my $pagestr; - while (my $line = ) { - $line =~ s/\r//g; - if ($line =~ m/^\[(spreadsheet|datatable|drawing)\:(.*?)\:/) { - my $sheettype = $1; - my $sheetname = $2; - my $sheetstr; - while (my $sline = ) { - $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); - } - else { - $html = "Sheet goes here"; - $localhtml = "Sheet goes here"; - } - $sheetstr = special_chars($sheetstr); - $pagestr .= <<"EOF"; - -
    ...
    - - -
    $localhtml
    - -EOF - } - else { - $pagestr .= expand_wikitext($line); - } - } - - close PAGEFILEIN; - - $response = <<"EOF"; - - - - -Simple Page Editor With Spreadsheets $versionstr - - - - - - - - - - -
    -
    -
    SIMPLE SYSTEM FOR EDITING PAGES WITH SPREADSHEETS AND MORE
    -
    $statusmessage  
    - - - -
    - Viewing page: $pagename -   - - -
    -
    -
    -
    - -
    - - Show item
    edit buttons
    -
    -$pagestr -
    -
    -
    Pages:
    -
    -EOF - - my @pagefiles = glob("$datadir*.page.txt"); # Get list of all pages - for (my $pnum=0; $pnum <= $#pagefiles; $pnum++) { - $pagefiles[$pnum] =~ m/^(?:.*\/){0,1}(.*).page.txt$/; - $response .= ", " if $pnum!=0; - $response .= qq!$1!; - } - - $response .= <<"EOF"; -
    -
    - - -
    - - -
    -
    -
    - - -EOF - - return $response; - } - - -# -# do_editpage($q, $pagename, $statusmessage) - Show page editing display -# - -sub do_editpage { - - my ($q, $pagename, $statusmessage) = @_; - my $response; - - my $page = {}; - load_page($q, $pagename, $page); - - my $edittype = $q->param("editpage") ? "clean" : "raw"; - - my $pagestr = special_chars($page->{$edittype}); - - $response = <<"EOF"; - - - - -Simple Page Editor With Spreadsheets $versionstr - - - -
    -
    -
    SIMPLE SYSTEM FOR EDITING PAGES WITH SPREADSHEETS AND MORE
    -
    $statusmessage  
    -
    Editing page: $pagename
    - -
    - - - -
    - - - - -EOF - - if ($edittype eq "clean") { - $response .= <<"EOF"; - - - -EOF - } - - $response .= <<"EOF"; -
    -
    - - -
    -
    - - -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 - - - - -Simple Page Editor With Spreadsheets $versionstr - - - - - - - - - -
    -
    -
    SIMPLE SYSTEM FOR EDITING PAGES WITH SPREADSHEETS AND MORE
    -
    $statusmessage  
    -
    Editing page: $pagename
    - - - - - - -
    -
    -
    -
    -
    - -
    -
    editor goes here
    - - - -EOF - - return $response; - - } - - -# -# start_editdrawing($pagename, $sheetname, $q, $statusmessage) -# - render initial editing display -# - -sub start_editdrawing { - - my ($pagename, $sheetname, $q, $statusmessage) = @_; - - my ($response, $sheetstr); - - my $page = {}; - load_page($q, $pagename, $page); - - $sheetstr = $page->{items}{$sheetname}{text}; - - $response = <<"EOF"; # output page with edit JS code - - - - -Simple Page Editor With Spreadsheets $versionstr - - - - - -
    -
    -
    SIMPLE SYSTEM FOR EDITING PAGES WITH SPREADSHEETS AND MORE
    -
    $statusmessage  
    -
    Editing page: $pagename
    - - - - - - -
    -
    -
    - - - -EOF - - return $response; - - } - - -# # # # # # # # # # -# special_chars($string) -# -# Returns $estring where &, <, >, " are HTML escaped -# - -sub special_chars { - my $string = shift @_; - - $string =~ s/&/&/g; - $string =~ s//>/g; - $string =~ s/"/"/g; - - return $string; -} - - -# -# decode_from_ajax($string) - Returns a string with -# \n, \b, and \c escaped to \n, \, and : -# - -sub decode_from_ajax { - my $string = shift @_; - - $string =~ s/\\n/\n/g; - $string =~ s/\\c/:/g; - $string =~ s/\\b/\\/g; - - return $string; -} - - -# -# encode_for_ajax($string) - Returns a string with -# \n, \, :, and ]]> escaped to \n, \b, \c, and \e -# - -sub encode_for_ajax { - my $string = shift @_; - - $string =~ s/\\/\\b/g; - $string =~ s/\n/\\n/g; - $string =~ s/\r//g; - $string =~ s/:/\\c/g; - $string =~ s/]]>/\\e/g; - - return $string; -} - - -# -# expand_wikitext($string) - Returns $string doing wiki-style formatting -# - -sub expand_wikitext { - my $string = shift @_; - - # Process forms that use URL encoding first - - # [page:pagename text] to link to other pages on this site - $string =~ s!\[page:(.+?)\s+(.+?)?]!'{{lt}}a href={{quot}}?pagename=' . - $1 . "{{quot}}{{gt}}$2\{{lt}}/a{{gt}}"!xegs; - - # [url:url text] to link to other pages on other sites - $string =~ s!\[url:(.+?)\s+(.+?)?]!'{{lt}}a href={{quot}}' . - $1 . "{{quot}} target={{quot}}_blank{{quot}}{{gt}}$2\{{lt}}/a{{gt}}"!xegs; - - # Convert &, <, >, " - - $string = special_chars($string); - - $string =~ s/^\= (.*) \=$/$1<\/span>/gs; - $string =~ s/\n/
    /g; # Line breaks are preserved - $string =~ s/('*)'''(.*?)'''/$1$2<\/b>/gs; # Wiki-style bold/italics - $string =~ s/''(.*?)''/$1<\/i>/gs; - $string =~ s/\{\{amp}}/&/gs; # {{amp}} for ampersand - $string =~ s/\{\{lt}}//gs; # {{gt}} for greater than - $string =~ s/\{\{quot}}/"/gs; # {{quot}} for quote - $string =~ s/\{\{lbracket}}/[/gs; # {{lbracket}} for left bracket - $string =~ s/\{\{rbracket}}/]/gs; # {{rbracket}} for right bracket - $string =~ s/\{\{lbrace}}/{/gs; # {{lbrace}} for brace - - return $string; -} - diff --git a/DeveloperAdoption/public/socialcalc/simpleedit15.pl b/DeveloperAdoption/public/socialcalc/simpleedit15.pl deleted file mode 100644 index 9642106..0000000 --- a/DeveloperAdoption/public/socialcalc/simpleedit15.pl +++ /dev/null @@ -1,1071 +0,0 @@ -#!/usr/bin/perl - - use strict; - use CGI qw(:standard); - use URI; - use HTTP::Daemon; - use HTTP::Status; - use HTTP::Response; - use Socket; - use CGI::Cookie; - use LWP::UserAgent; - - use SocialCalcServersideUtilities; - - - my $datadir = "se2-data/"; - my $versionstr = "2.02"; - my $jsdir = "/sgi/scjstest/"; - -# -# This whole first section lets this code run either as a CGI script on a server -# or standalone on the desktop run from the Perl command line. -# -# The main processing starts with process_request. -# - - if ($ENV{REQUEST_METHOD}) { # being run as a CGI on a server - print "Content-type: text/html\n\n"; - my $q = new CGI; - print process_request($q); - exit; - } - - # running locally - do mini-server - - my $d = HTTP::Daemon->new ( - LocalPort => 6557, - Reuse => 1); - - if (!$d) { - print "simpleedit could not start on 127.0.0.1:6557\n"; - exit; - } - - print "simpleedit15\nAccess at: http://127.0.0.1:6557/\n"; - - while (my $c = $d->accept) { - - # Make sure the request is from our machine - - if ($c) { - my ($port, $host) = sockaddr_in(getpeername($c)); - if ($host ne inet_aton("127.0.0.1")) { - $c->close; # no - ignore request completely - undef($c); - next; - } - } - - # Process the request - - while ((defined $c) && (my $r = $c->get_request)) { - if ($r->method eq 'POST' || $r->method eq 'GET') { - $c->force_last_request; - my $uri = $r->uri; - if ($uri =~ /favicon/) { # if this is a request for favicon.ico, ignore - $c->send_error(RC_NOT_FOUND); - next; - } - if ($uri =~ /\/quit$/) { - $c->send_file_response("quitmessage.html"); - $c->close; - undef($c); - exit; - } - if ($uri =~ /\/([a-z\-0-9]+)\.(gif|js|css)$/) { # ok request - $uri = "$1.$2"; - $uri = "images/$uri" if $2 eq "gif"; -# if ($2 eq "js") { -# $res->content_type("text/html; charset=UTF-8"); -# } - $c->send_file_response($uri); - next; - } - - my $resp=""; - if ($r->method eq 'POST') { - my $q = new CGI($r->content()); - $resp = process_request($q) - } - else { - my $q = new CGI($r->uri->query()); - $resp = process_request($q) - } - my $res = new HTTP::Response(200); - $res->content_type("text/html; charset=UTF-8"); - $res->expires("-1d"); - $res->content($resp); - $c->send_response($res); - } - - else { - $c->send_error(RC_FORBIDDEN); - } - } - - $c->close; - undef($c); - } - -# -# Main routine starts here: -# - -sub process_request { - - my ($request) = @_; - my $q = new CGI($request); - - my $response; - - my ($statusmessage); - - if ($q->param("loadsheet")) { # Ajax request: loadsheet=pagename.sheetname - my $fullsheetname = $q->param("loadsheet"); - $fullsheetname =~ m/^(.*)\.(.*)$/; - my $pagename = $1; - my $sheetname = $2; - my $page = {}; - load_page($q, $pagename, $page); - my $sheetstr = $page->{items}{$sheetname}{text}; - my $htmlpos = index($sheetstr, "\nHTML:\n"); - if ($htmlpos >= 0) { - $sheetstr = substr($sheetstr, 0, $htmlpos); - } -sleep 1; - return $sheetstr; - } - - if ($q->param("wikitext")) { # Ajax request: wikitext=wikitext-url-encoded - my $wikitext = $q->param("wikitext"); - $wikitext = expand_wikitext($wikitext); -sleep 1; - return $wikitext; - } - - if ($q->param("rpc")) { # Ajax request: rpc=functionname&arg1=...&arg2=... - # assume socialtext() function - my $nargs = $q->param("a")-0; - if (!$nargs) { - return "e#VALUE!:Bad arguments"; - } - my (@argvals, @argtypes, $returnstr); - for (my $i=1;$i<=$nargs;$i++) { - $q->param("a$i") =~ m/^(.*?)\:(.*)$/; - $argvals[$i] = $2; - $argtypes[$i] = $1; - } - my $func = $argvals[1]; - if ($func eq "regexget") { - my $ua = LWP::UserAgent->new; - $ua->agent("WKCcallableUtilities"); - $ua->timeout(5); - my $req = HTTP::Request->new("GET", $argvals[2]); - $req->header('Accept' => '*/*'); - my $res = $ua->request($req); - if ($res->is_success) { - my $returnedhtml = $res->content; - if ($argvals[3] && $returnedhtml =~ m/$argvals[3]/s) { - $returnstr = $1; - } - else { - $returnstr = $returnedhtml; - } - $returnstr = ($argvals[4] || "t") . ":" . $returnstr; - } - else { - $returnstr = "t:Unable to do regexget HTTP request: " . $res->status_line; - } - return $returnstr; - } - elsif ($func eq "wait") { - my $waittime = $argvals[2] > 0 ? $argvals[2] : 1; - sleep $waittime < 30 ? $waittime : 30; - return "b:0"; - } - else { - for (my $i=1;$i<=$nargs;$i++) { - $returnstr .= " $argvals[$i]($argtypes[$i])"; - } - return "t:$returnstr"; - } - } - - my $pagename = $q->param('pagename'); - - if ($q->param('newpage')) { - $pagename = $q->param('newpagename'); - } - - $pagename =~ s/[^a-zA-Z0-9_\-]*//g; - if (!$pagename) { - $pagename = "home"; - $statusmessage .= "No pagename given - using '$pagename'
    "; - } - - if ($q->param('savepageedit')) { - my $newstr; - $newstr = $q->param('pagetext'); - if ($q->param('edittype') eq "clean") { - my $page = {}; - load_page($q, $pagename, $page); - $newstr =~ s/^\[(spreadsheet|datatable|drawing)\:(.+?)\]/"[$1:$2:\n" . $page->{items}{$2}{text} . "\n:$1]"/gme; - } - open (PAGEFILEOUT, ">$datadir$pagename.page.txt"); - print PAGEFILEOUT $newstr; - close PAGEFILEOUT; - $statusmessage .= "Saved updated page '$pagename'.
    "; - } - - if ($q->param("editpage") || $q->param("editrawpage")) { # when one of the "editpage" buttons is pressed - return do_editpage($q, $pagename, $statusmessage); - } - - foreach my $p ($q->param) { # go through all the parameters - if ($p =~ /^edit(spreadsheet|datatable):(.*)/) { # "editspreadsheet:sheetname" pressed - return start_editsheet($pagename, $2, $q, $statusmessage); - } - if ($p =~ /^editdrawing:(.*)/) { # "editdrawing:sheetname" pressed - return start_editdrawing($pagename, $1, $q, $statusmessage); - } - } - - if ($q->param('savespreadsheet')) { # save the edited spreadsheet - my $page = {}; - load_page($q, $pagename, $page); - my $pagestr = $page->{raw}; - my $sheetname = $q->param('sheetname'); - my $sheettype = $page->{items}{$sheetname}{type}; - - $pagestr =~ s/^\[$sheettype\:$sheetname:.*?\:$sheettype\]/"[$sheettype:$sheetname:\n" . $q->param('newstr') . "\n:$sheettype]"/sme; - - open (PAGEFILEOUT, ">$datadir$pagename.page.txt"); - print PAGEFILEOUT $pagestr; - close PAGEFILEOUT; - $statusmessage = - "Saved updated $sheettype '$sheetname' on page '$pagename'.
    "; - } - - $response = do_displaypage($q, $pagename, $statusmessage); # Otherwise, display page - - return $response; - - } - -# -# load_page($q, $pagename, \%page) -# -# Loads the specified page and puts the parts into %page: -# -# %page{raw} - raw page text -# %page{clean} - page text with embedded items' bodies removed -# %page{items}{name} - hash with embedded item "name"'s info -# %page{items}{name}{text} - text of embedded item's body -# %page{items}{name}{type} - type embedded item (e.g., "spreadsheet") -# - -sub load_page { - - my ($q, $pagename, $page) = @_; - - $page->{bodies} = {}; - - open (PAGEFILEIN, "$datadir$pagename.page.txt"); - my ($rawstr, $cleanstr); - while (my $line = ) { - $line =~ s/\r//g; - $rawstr .= $line; - if ($line =~ m/^\[(spreadsheet|datatable|drawing)\:(.*?)\:/) { - my $type = $1; - my $name = $2; - $page->{items}{$name} = {type => $type, text => ""}; - my $itemstr; - while (my $sline = ) { - $sline =~ s/\r//g; - $rawstr .= $sline; - last if substr($sline, 0, length($type)+2) eq ":$type]"; - $itemstr .= $sline; - } - $page->{items}{$name}{text} = $itemstr; - $cleanstr .= "[$type:$name]\n"; - } - else { - $cleanstr .= $line; - } - } - close PAGEFILEIN; - $page->{raw} = $rawstr; - $page->{clean} = $cleanstr; - - return; - } - -# -# $response = do_displaypage($q, $pagename, $statusmessage) - Display page -# - -sub do_displaypage { - - my ($q, $pagename, $statusmessage) = @_; - my $response; - - my $page = {}; - load_page($q, $pagename, $page); - - open (PAGEFILEIN, "$datadir$pagename.page.txt"); - my $pagestr; - while (my $line = ) { - $line =~ s/\r//g; - if ($line =~ m/^\[(spreadsheet|datatable|drawing)\:(.*?)\:/) { - my $sheettype = $1; - my $sheetname = $2; - my $sheetstr; - while (my $sline = ) { - $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"; - - - - -
    $localhtml
    - -EOF - } - else { - $pagestr .= expand_wikitext($line); - } - } - - close PAGEFILEIN; - - $response = <<"EOF"; - - - - -Simple Page Editor With Spreadsheets $versionstr - - - - - - - - - - -
    -
    -
    SIMPLE SYSTEM FOR EDITING PAGES WITH SPREADSHEETS AND MORE
    -
    $statusmessage  
    - - - -
    - Viewing page: $pagename -   - - -
    -
    -
    -
    - -
    - - Show item
    edit buttons
    -
    -$pagestr -
    -
    -
    Pages:
    -
    -EOF - - my @pagefiles = glob("$datadir*.page.txt"); # Get list of all pages - for (my $pnum=0; $pnum <= $#pagefiles; $pnum++) { - $pagefiles[$pnum] =~ m/^(?:.*\/){0,1}(.*).page.txt$/; - $response .= ", " if $pnum!=0; - $response .= qq!$1!; - } - - $response .= <<"EOF"; -
    -
    - - -
    - - -
    -
    -
    - - -EOF - - return $response; - } - - -# -# do_editpage($q, $pagename, $statusmessage) - Show page editing display -# - -sub do_editpage { - - my ($q, $pagename, $statusmessage) = @_; - my $response; - - my $page = {}; - load_page($q, $pagename, $page); - - my $edittype = $q->param("editpage") ? "clean" : "raw"; - - my $pagestr = special_chars($page->{$edittype}); - - $response = <<"EOF"; - - - - -Simple Page Editor With Spreadsheets $versionstr - - - -
    -
    -
    SIMPLE SYSTEM FOR EDITING PAGES WITH SPREADSHEETS AND MORE
    -
    $statusmessage  
    -
    Editing page: $pagename
    - -
    - - - -
    - - - - -EOF - - if ($edittype eq "clean") { - $response .= <<"EOF"; - - - -EOF - } - - $response .= <<"EOF"; -
    -
    - - -
    -
    - - -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 - - - - -Simple Page Editor With Spreadsheets $versionstr - - - - - - - - - - -
    -
    -
    SIMPLE SYSTEM FOR EDITING PAGES WITH SPREADSHEETS AND MORE
    -
    $statusmessage  
    -
    Editing page: $pagename
    - - - - - - -
    -
    -
    -
    -
    - -
    -
    editor goes here
    - - - -EOF - - return $response; - - } - - -# -# start_editdrawing($pagename, $sheetname, $q, $statusmessage) -# - render initial editing display -# - -sub start_editdrawing { - - my ($pagename, $sheetname, $q, $statusmessage) = @_; - - my ($response, $sheetstr); - - my $page = {}; - load_page($q, $pagename, $page); - - $sheetstr = $page->{items}{$sheetname}{text}; - - $response = <<"EOF"; # output page with edit JS code - - - - -Simple Page Editor With Spreadsheets $versionstr - - - - - -
    -
    -
    SIMPLE SYSTEM FOR EDITING PAGES WITH SPREADSHEETS AND MORE
    -
    $statusmessage  
    -
    Editing page: $pagename
    - - - - - - -
    -
    -
    - - - -EOF - - return $response; - - } - - -# # # # # # # # # # -# special_chars($string) -# -# Returns $estring where &, <, >, " are HTML escaped -# - -sub special_chars { - my $string = shift @_; - - $string =~ s/&/&/g; - $string =~ s//>/g; - $string =~ s/"/"/g; - - return $string; -} - - -# -# decode_from_ajax($string) - Returns a string with -# \n, \b, and \c escaped to \n, \, and : -# - -sub decode_from_ajax { - my $string = shift @_; - - $string =~ s/\\n/\n/g; - $string =~ s/\\c/:/g; - $string =~ s/\\b/\\/g; - - return $string; -} - - -# -# encode_for_ajax($string) - Returns a string with -# \n, \, :, and ]]> escaped to \n, \b, \c, and \e -# - -sub encode_for_ajax { - my $string = shift @_; - - $string =~ s/\\/\\b/g; - $string =~ s/\n/\\n/g; - $string =~ s/\r//g; - $string =~ s/:/\\c/g; - $string =~ s/]]>/\\e/g; - - return $string; -} - - -# -# expand_wikitext($string) - Returns $string doing wiki-style formatting -# - -sub expand_wikitext { - my $string = shift @_; - - # Process forms that use URL encoding first - - # [page:pagename text] to link to other pages on this site - $string =~ s!\[page:(.+?)\s+(.+?)?]!'{{lt}}a href={{quot}}?pagename=' . - $1 . "{{quot}}{{gt}}$2\{{lt}}/a{{gt}}"!xegs; - - # [url:url text] to link to other pages on other sites - $string =~ s!\[url:(.+?)\s+(.+?)?]!'{{lt}}a href={{quot}}' . - $1 . "{{quot}} target={{quot}}_blank{{quot}}{{gt}}$2\{{lt}}/a{{gt}}"!xegs; - - # Convert &, <, >, " - - $string = special_chars($string); - - $string =~ s/^\= (.*) \=$/$1<\/span>/gs; - $string =~ s/\n/
    /g; # Line breaks are preserved - $string =~ s/('*)'''(.*?)'''/$1$2<\/b>/gs; # Wiki-style bold/italics - $string =~ s/''(.*?)''/$1<\/i>/gs; - $string =~ s/\{\{amp}}/&/gs; # {{amp}} for ampersand - $string =~ s/\{\{lt}}//gs; # {{gt}} for greater than - $string =~ s/\{\{quot}}/"/gs; # {{quot}} for quote - $string =~ s/\{\{lbracket}}/[/gs; # {{lbracket}} for left bracket - $string =~ s/\{\{rbracket}}/]/gs; # {{rbracket}} for right bracket - $string =~ s/\{\{lbrace}}/{/gs; # {{lbrace}} for brace - - return $string; -} - diff --git a/DeveloperAdoption/public/socialcalc/socialcalc-3.js b/DeveloperAdoption/public/socialcalc/socialcalc-3.js deleted file mode 100644 index 3ed8455..0000000 --- a/DeveloperAdoption/public/socialcalc/socialcalc-3.js +++ /dev/null @@ -1,5796 +0,0 @@ -// -// The main SocialCalc code module of the SocialCalc package -// -/* -// (c) Copyright 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - -/* - -**** Overview **** - -This is the beginning of a library of routines for displaying and editing spreadsheet -data in a browser. The HTML that includes this does not need to have anything -specific to the spreadsheet or editor already present -- everything is dynamically -added to the DOM by this code, including the rendered sheet and any editing controls. - -The library has a few parts. This is the main SocialCalc code module. -Other parts are the Table Editor module, the Formula module, and the Format Number module. -Note: The Table Editor module is licensed under a different license than this module. - -The class/object style is derived from O'Reilly's JavaScript by Flanagan, 5th Edition, -section 9.3, page 157. - -All of the data, object definitions, functions, etc., are stored as properties of the SocialCalc -object so as not to clutter up the global variables nor conflict with other names. - -A design goal (not tested yet for success) is to make it possible to have more than one -spreadsheet active on a page, perhaps even open for editing. It is assumed, though, that -there is only one mouse and one keyboard (a good assumption on most PCs today but not in the -new "touch and surface world" Apple and Microsoft are working towards). - -The testing has been on Windows Firefox (2 and 3), -Internet Explorer (6 and 7), Opera (9.23 and mainly later), Mac Safari (3.1), and Mac Firefox (2.0.0.6). -There are small issues with Firefox before 2.0 (cosmetic with drag handles) and larger ones -with Opera before 9.5 (the Delete key isn't recognized in some cases -- the 9.5 version was still -in beta and this bug affects other products like GMail, I believe). - -The data is stored in a SocialCalc.Sheet object. The data is organized in a form similar to that -used by SocialCalc 1.1.0. There is a function for converting a normal SocialCalc spreadsheet -save data string (the spreadsheet part of a SocialCalc data file) into this internal form. - -The SocialCalc.RenderContext class provides methods for rendering a table into the DOM representing -part of the spreadsheet. It is assumed that the spreadsheet could possibly be very large -and that rendering the whole thing at once could be too time consuming. It is also set up so -that it might be possible to have some of the sheet data only be loaded on demand (such as by Ajax). -The rendering can render cells to the right and below the already active area of the spreadsheet -so that you can scroll to that "clean" area without explicitly doing "add row/column". The class also -does simple operations such as "scrolling" within that table. The table may optionally include -row and column headers and may be split into panes. Most of the code assumes any number of panes, -but only the rightmost pane has scrolling code. In normal operation there would be one or two -panes horizontally and vertically. The panes may start on any row/column, though a given row/column -should only appear in one pane at a time (not all code enforces this, yet). - -The RenderContext is designed to be rendered as part of a SocialCalc.TableEditor. The TableEditor -includes the spreadsheet grid as well as scrollbars, pane sliders, and (eventually) editing controls. -The layout is dynamic and may be recomputed on the fly, such as in response to resizing the browser -window. - -The scrollbars and pane sliders are created using SocialCalc.TableControl objects. These in turn -make use of Dragging, ToolTip, Button, and MouseWheel functions. - -The keyboard input is handled by keyboard code. - -There are also some helper routines. - -More comments yet to come... - -*/ - - -var SocialCalc; -if (!SocialCalc) SocialCalc = {}; - -// ************************************* -// -// Shared values -// -// These are "global" values shared by the classes, including default settings -// -// ************************************* - -// Callbacks - -SocialCalc.Callbacks = { - - // The next two are used by SocialCalc.format_text_for_display - - // The function to expand wiki text - should be set if you want wikitext expansion - // The form is: expand_wiki(displayvalue, sheetobj, linkstyle, valueformat) - // valueformat is text-wiki followed by optional sub-formats, e.g., text-wikipagelink - - expand_wiki: null, - - expand_markup: function(displayvalue, sheetobj, linkstyle) // the old function to expand wiki text - may be replaced - {return SocialCalc.default_expand_markup(displayvalue, sheetobj, linkstyle);}, - - // MakePageLink is used to create the href for a link to another "page" - // The form is: MakePageLink(pagename, workspacename, linktyle, valueformat), returns string - - MakePageLink: null, - - // NormalizeSheetName is used to make different variations of sheetnames use the same cache slot - - NormalizeSheetName: null // use default - lowercase - - }; - -// Shared flags - - // none at present - - -// ************************************* -// -// Cell class: -// -// ************************************* - -// -// Class SocialCalc.Cell -// -// Usage: var s = new SocialCalc.Cell(coord); -// -// Cell attributes include: -// -// coord: the column/row as a string, e.g., "A1" -// datavalue: the value to be used for computation and formatting for display, -// string or numeric (tolerant of numbers stored as strings) -// datatype: if present, v=numeric value, t=text value, f=formula, -// or c=constant that is not a simple number (like "$1.20") -// formula: if present, the formula (without leading "=") for computation or the constant -// valuetype: first char is main type, the following are sub-types. -// Main types are b=blank cell, n=numeric, t=text, e=error -// Examples of using sub-types would be "nt" for a numeric time value, "n$" for currency, "nl" for logical -// displayvalue: if present, rendered version of datavalue with formatting attributes applied -// parseinfo: if present, cached parsed version of formula -// -// The following optional values, if present, are mainly used in rendering, overriding defaults: -// -// bt, br, bb, bl: number of border's definition -// layout: layout (vertical alignment, padding) definition number -// font: font definition number -// color: text color definition number -// bgcolor: background color definition number -// cellformat: cell format (horizontal alignment) definition number -// nontextvalueformat: custom format definition number for non-text values, e.g., numbers -// textvalueformat: custom format definition number for text values -// colspan, rowspan: number of cells to span for merged cells (only on main cell) -// cssc: custom css classname for cell, as text (no special chars) -// csss: custom css style definition -// mod: modification allowed flag "y" if present -// comment: cell comment string -// - -SocialCalc.Cell = function(coord) { - - this.coord = coord; - this.datavalue = ""; - this.datatype = null; - this.formula = ""; - this.valuetype = "b"; - - } - -// The types of cell properties -// -// Type 1: Base, Type 2: Attribute, Type 3: Special (e.g., displaystring, parseinfo) - -SocialCalc.CellProperties = { - coord: 1, datavalue: 1, datatype: 1, formula: 1, valuetype: 1, errors: 1, comment: 1, - bt: 2, br: 2, bb: 2, bl: 2, layout: 2, font: 2, color: 2, bgcolor: 2, - cellformat: 2, nontextvalueformat: 2, textvalueformat: 2, colspan: 2, rowspan: 2, - cssc: 2, csss: 2, mod: 2, - displaystring: 3, // used to cache rendered HTML of cell contents - parseinfo: 3, // used to cache parsed formulas - hcolspan: 3, hrowspan: 3 // spans taking hidden cols/rows into account (!!! NOT YET !!!) - }; - -SocialCalc.CellPropertiesTable = { - bt: "borderstyle", br: "borderstyle", bb: "borderstyle", bl: "borderstyle", - layout: "layout", font: "font", color: "color", bgcolor: "color", - cellformat: "cellformat", nontextvalueformat: "valueformat", textvalueformat: "valueformat" - }; - -// ************************************* -// -// Sheet class: -// -// ************************************* - -// -// Class SocialCalc.Sheet -// -// Usage: var s = new SocialCalc.Sheet(); -// - -SocialCalc.Sheet = function() { - - SocialCalc.ResetSheet(this); - - // Set other values: - // - // sheet.statuscallback(data, status, arg, this.statuscallbackparams) is called - // during recalc and commands. - // - // During recalc, data is the current recalcdata. - // The values for status and the corresponding arg are: - // - // calcorder, {coord: coord, total: celllist length, count: count} [0 or more times per recalc] - // calccheckdone, calclist length [once per recalc] - // calcstep, {coord: coord, total: calclist length, count: count} [0 or more times per recalc] - // calcloading, {sheetname: name-of-sheet} - // calcserverfunc, {funcname: name-of-function, coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds [once per recalc] - // - // During commands, data is SocialCalc.SheetCommandInfo. - // These values for status and arg are: - // - // cmdstart, cmdstr - // cmdend - // - - this.statuscallback = null; // routine called with cmdstart, calcstart, etc., status and args: - // sheet.statuscallback(data, status, arg, params) - this.statuscallbackparams = null; // parameters passed to that routine - - } - -// -// SocialCalc.ResetSheet(sheet) -// -// Resets (and/or initializes) sheet data values. -// - -SocialCalc.ResetSheet = function(sheet, reload) { - - // properties: - - sheet.cells = {}; // at least one for each non-blank cell: coord: cell-object - sheet.attribs = // sheet attributes - { - lastcol: 1, - lastrow: 1, - defaultlayout: 0 - }; - sheet.rowattribs = - { - hide: {}, // access by row number - height: {} - }; - sheet.colattribs = - { - width: {}, // access by col name - hide: {} - }; - sheet.names={}; // Each is: {desc: "optional description", definition: "B5, A1:B7, or =formula"} - sheet.layouts=[]; - sheet.layouthash={}; - sheet.fonts=[]; - sheet.fonthash={}; - sheet.colors=[]; - sheet.colorhash={}; - sheet.borderstyles=[]; - sheet.borderstylehash={}; - sheet.cellformats=[]; - sheet.cellformathash={}; - sheet.valueformats=[]; - sheet.valueformathash={}; - - sheet.copiedfrom = ""; // if a range, then this was loaded from a saved range as clipboard content - - sheet.changes = new SocialCalc.UndoStack(); - - sheet.renderneeded = false; - - sheet.changedrendervalues = true; // if true, spans and/or fonts have changed (set by ExecuteSheetCommand & GetStyle) - - sheet.recalcchangedavalue = false; // true if a recalc resulted in a change to a cell's calculated value - - } - -// Methods: - -SocialCalc.Sheet.prototype.ResetSheet = function() {SocialCalc.ResetSheet(this);}; -SocialCalc.Sheet.prototype.AddCell = function(newcell) {return this.cells[newcell.coord]=newcell;}; -SocialCalc.Sheet.prototype.GetAssuredCell = function(coord) { - return this.cells[coord] || this.AddCell(new SocialCalc.Cell(coord)); - }; -SocialCalc.Sheet.prototype.ParseSheetSave = function(savedsheet) {SocialCalc.ParseSheetSave(savedsheet,this);}; -SocialCalc.Sheet.prototype.CellFromStringParts = function(cell, parts, j) {return SocialCalc.CellFromStringParts(this, cell, parts, j);}; -SocialCalc.Sheet.prototype.CreateSheetSave = function(range, canonicalize) {return SocialCalc.CreateSheetSave(this, range, canonicalize);}; -SocialCalc.Sheet.prototype.CellToString = function(cell) {return SocialCalc.CellToString(this, cell);}; -SocialCalc.Sheet.prototype.CanonicalizeSheet = function(full) {return SocialCalc.CanonicalizeSheet(this, full);}; -SocialCalc.Sheet.prototype.EncodeCellAttributes = function(coord) {return SocialCalc.EncodeCellAttributes(this, coord);}; -SocialCalc.Sheet.prototype.EncodeSheetAttributes = function() {return SocialCalc.EncodeSheetAttributes(this);}; -SocialCalc.Sheet.prototype.DecodeCellAttributes = function(coord, attribs, range) {return SocialCalc.DecodeCellAttributes(this, coord, attribs, range);}; -SocialCalc.Sheet.prototype.DecodeSheetAttributes = function(attribs) {return SocialCalc.DecodeSheetAttributes(this, attribs);}; - -SocialCalc.Sheet.prototype.ScheduleSheetCommands = function(cmd, saveundo) {return SocialCalc.ScheduleSheetCommands(this, cmd, saveundo);}; -SocialCalc.Sheet.prototype.SheetUndo = function() {return SocialCalc.SheetUndo(this);}; -SocialCalc.Sheet.prototype.SheetRedo = function() {return SocialCalc.SheetRedo(this);}; -SocialCalc.Sheet.prototype.CreateAuditString = function() {return SocialCalc.CreateAuditString(this);}; -SocialCalc.Sheet.prototype.GetStyleNum = function(atype, style) {return SocialCalc.GetStyleNum(this, atype, style);}; -SocialCalc.Sheet.prototype.GetStyleString = function(atype, num) {return SocialCalc.GetStyleString(this, atype, num);}; -SocialCalc.Sheet.prototype.RecalcSheet = function() {return SocialCalc.RecalcSheet(this);}; - -// -// Sheet save format: -// -// linetype:param1:param2:... -// -// Linetypes are: -// -// version:versionname - version of this format. Currently 1.4. -// -// cell:coord:type:value...:type:value... - Types are as follows: -// -// v:value - straight numeric value -// t:value - straight text/wiki-text in cell, encoded to handle \, :, newlines -// vt:fulltype:value - value with value type/subtype -// vtf:fulltype:value:formulatext - formula resulting in value with value type/subtype, value and text encoded -// vtc:fulltype:value:valuetext - formatted text constant resulting in value with value type/subtype, value and text encoded -// vf:fvalue:formulatext - formula resulting in value, value and text encoded (obsolete: only pre format version 1.1) -// fvalue - first char is "N" for numeric value, "T" for text value, "H" for HTML value, rest is the value -// e:errortext - Error text. Non-blank means formula parsing/calculation results in error. -// b:topborder#:rightborder#:bottomborder#:leftborder# - border# in sheet border list or blank if none -// l:layout# - number in cell layout list -// f:font# - number in sheet fonts list -// c:color# - sheet color list index for text -// bg:color# - sheet color list index for background color -// cf:format# - sheet cell format number for explicit format (align:left, etc.) -// cvf:valueformat# - sheet cell value format number (obsolete: only pre format v1.2) -// tvf:valueformat# - sheet cell text value format number -// ntvf:valueformat# - sheet cell non-text value format number -// colspan:numcols - number of columns spanned in merged cell -// rowspan:numrows - number of rows spanned in merged cell -// cssc:classname - name of CSS class to be used for cell when published instead of one calculated here -// csss:styletext - explicit CSS style information, encoded to handle :, etc. -// mod:allow - if "y" allow modification of cell for live "view" recalc -// comment:value - encoded text of comment for this cell (added in v1.5) -// -// col: -// w:widthval - number, "auto" (no width in tag), number%, or blank (use default) -// hide: - yes/no, no is assumed if missing -// row: -// hide - yes/no, no is assumed if missing -// -// sheet: -// c:lastcol - number -// r:lastrow - number -// w:defaultcolwidth - number, "auto", number%, or blank (default->80) -// h:defaultrowheight - not used -// tf:format# - cell format number for sheet default for text values -// ntf:format# - cell format number for sheet default for non-text values (i.e., numbers) -// layout:layout# - default cell layout number in cell layout list -// font:font# - default font number in sheet font list -// vf:valueformat# - default number value format number in sheet valueformat list (obsolete: only pre format version 1.2) -// ntvf:valueformat# - default non-text (number) value format number in sheet valueformat list -// tvf:valueformat# - default text value format number in sheet valueformat list -// color:color# - default number for text color in sheet color list -// bgcolor:color# - default number for background color in sheet color list -// circularreferencecell:coord - cell coord with a circular reference -// recalc:value - on/off (on is default). If not "off", appropriate changes to the sheet cause a recalc -// needsrecalc:value - yes/no (no is default). If "yes", formula values are not up to date -// -// name:name:description:value - name definition, name in uppercase, with value being "B5", "A1:B7", or "=formula"; -// description and value are encoded. -// font:fontnum:value - text of font definition (style weight size family) for font fontnum -// "*" for "style weight", size, or family, means use default (first look to sheet, then builtin) -// color:colornum:rgbvalue - text of color definition (e.g., rgb(255,255,255)) for color colornum -// border:bordernum:value - text of border definition (thickness style color) for border bordernum -// layout:layoutnum:value - text of vertical alignment and padding style for cell layout layoutnum (* for default): -// vertical-alignment:vavalue;padding:topval rightval bottomval leftval; -// cellformat:cformatnum:value - text of cell alignment (left/center/right) for cellformat cformatnum -// valueformat:vformatnum:value - text of number format (see FormatValueForDisplay) for valueformat vformatnum (changed in v1.2) -// clipboardrange:upperleftcoord:bottomrightcoord - ignored -- from wikiCalc -// clipboard:coord:type:value:... - ignored -- from wikiCalc -// -// If this is clipboard contents, then there is also information to facilitate pasting: -// -// copiedfrom:upperleftcoord:bottomrightcoord - range from which this was copied -// - -// Functions: - -SocialCalc.ParseSheetSave = function(savedsheet,sheetobj) { - - var lines=savedsheet.split(/\r\n|\n/); - var parts=[]; - var line; - var i, j, t, v, coord, cell, attribs, name; - var scc = SocialCalc.Constants; - - for (i=0;i maxrow) maxrow = cr.row; - if (cr.col > maxcol) maxcol = cr.col; - } - } - - for (i=0; i maxrow) maxrow = cr; - } - } - a = {"hide": 1, "width": 1}; // look at explicit col settings - for (v in a) { - for (coord in sheetobj.colattribs[v]) { - cr = SocialCalc.coordToCr(coord+"1"); - if (cr.col > maxcol) maxcol = cr.col; - } - } - - for (an=0; an0, command loop waits for SocialCalc.ResumeFromCmdExtension() - -// statuscallback: null, // called during execution - obsolete: use sheet obj's -// statuscallbackparams: null - - }; - -// -// SocialCalc.ScheduleSheetCommands -// -// statuscallback is called at the beginning (cmdstart) and end (cmdend). -// - -SocialCalc.ScheduleSheetCommands = function(sheet, cmdstr, saveundo) { - - var sci = SocialCalc.SheetCommandInfo; - - sci.sheetobj = sheet; - sci.parseobj = new SocialCalc.Parse(cmdstr); - sci.saveundo = saveundo; - - if (sci.sheetobj.statuscallback) { // notify others if requested - sheet.statuscallback(sci, "cmdstart", "", sci.sheetobj.statuscallbackparams); - } - - if (sci.saveundo) { - sci.sheetobj.changes.PushChange(""); // add a step to undo stack - } - - sci.timerobj = window.setTimeout(SocialCalc.SheetCommandsTimerRoutine, sci.firsttimerdelay); - - } - -SocialCalc.SheetCommandsTimerRoutine = function() { - - var errortext; - var sci = SocialCalc.SheetCommandInfo; - var starttime = new Date(); - - sci.timerobj = null; - - while (!sci.parseobj.EOF()) { // go through all commands (separated by newlines) - - errortext = SocialCalc.ExecuteSheetCommand(sci.sheetobj, sci.parseobj, sci.saveundo); - if (errortext) alert(errortext); - - sci.parseobj.NextLine(); - - if (sci.cmdextensionbusy.length > 0) { // forced wait - if (sci.sheetobj.statuscallback) { // notify others if requested - sci.sheetobj.statuscallback(sci, "cmdextension", sci.cmdextensionbusy, sci.sheetobj.statuscallbackparams); - } - return; - } - - if (((new Date()) - starttime) >= sci.maxtimeslice) { // if taking too long, give up CPU for a while - sci.timerobj = window.setTimeout(SocialCalc.SheetCommandsTimerRoutine, sci.timerdelay); - return; - } - } - - if (sci.sheetobj.statuscallback) { // notify others if requested - sci.sheetobj.statuscallback(sci, "cmdend", "", sci.sheetobj.statuscallbackparams); - } - - } - -SocialCalc.ResumeFromCmdExtension = function() { - - var sci = SocialCalc.SheetCommandInfo; - - sci.cmdextensionbusy = ""; - - SocialCalc.SheetCommandsTimerRoutine(); - -} - -// -// errortext = SocialCalc.ExecuteSheetCommand(sheet, cmd, saveundo) -// -// cmd is a SocialCalc.Parse object. -// -// Executes commands that modify the sheet data. -// Sets sheet "needsrecalc" as needed. -// Sets sheet "changedrendervalues" as needed. -// -// The cmd string may be multiple commands, separated by newlines. In that case -// only one "step" is put on the undo stack representing all the commands. -// Note that because of this, in "set A1 text ..." and "set A1 comment ..." text is -// treated as encoded (newline => \n, \ => \b, : => \c). -// -// The commands are in the forms: -// -// set sheet attributename value (plus lastcol and lastrow) -// set 22 attributename value -// set B attributename value -// set A1 attributename value1 value2... (see each attribute in code for details) -// set A1:B5 attributename value1 value2... -// erase/copy/cut/paste/fillright/filldown A1:B5 all/formulas/format -// loadclipboard save-encoded-clipboard-data -// clearclipboard -// merge C3:F3 -// unmerge C3 -// insertcol/insertrow C5 -// deletecol/deleterow C5:E7 -// movepaste/moveinsert A1:B5 A8 all/formulas/format (if insert, destination must be in same rows or columns or else paste done) -// sort cr1:cr2 col1 up/down col2 up/down col3 up/down -// name define NAME definition -// name desc NAME description -// name delete NAME -// recalc -// redisplay -// changedrendervalues -// startcmdextension extension rest-of-command -// -// If saveundo is true, then undo information is saved in sheet.changes. -// - -SocialCalc.ExecuteSheetCommand = function(sheet, cmd, saveundo) { - - var cmdstr, cmd1, rest, what, attrib, num, pos, pos2, errortext, undostart, val; - var cr1, cr2, col, row, cr, cell, newcell; - var fillright, rowstart, colstart, crbase, rowoffset, coloffset, basecell; - var clipsheet, cliprange, numcols, numrows, attribtable; - var colend, rowend, newcolstart, newrowstart, newcolend, newrowend, rownext, colnext, colthis, cellnext; - var lastrow, lastcol, rowbefore, colbefore, oldformula, oldcr; - var cols, dirs, lastsortcol, i, sortlist, sortcells, sortvalues, sorttypes; - var sortfunction, slen, valtype, originalrow, sortedcr; - var name, v1, v2; - var cmdextension; - - var attribs = sheet.attribs; - var changes = sheet.changes; - var cellProperties = SocialCalc.CellProperties; - var scc = SocialCalc.Constants; - - var ParseRange = - function() { - var prange = SocialCalc.ParseRange(what); - cr1 = prange.cr1; - cr2 = prange.cr2; - if (cr2.col > attribs.lastcol) attribs.lastcol = cr2.col; - if (cr2.row > attribs.lastrow) attribs.lastrow = cr2.row; - }; - - errortext = ""; - - cmdstr = cmd.RestOfStringNoMove(); - if (saveundo) { - sheet.changes.AddDo(cmdstr); - } - - cmd1 = cmd.NextToken(); - - switch (cmd1) { - - case "set": - what = cmd.NextToken(); - attrib = cmd.NextToken(); - rest = cmd.RestOfString(); - undostart = "set "+what+" "+attrib; - - if (what=="sheet") { - sheet.renderneeded = true; - switch (attrib) { - case "defaultcolwidth": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]); - attribs[attrib] = rest; - break; - case "defaultcolor": - case "defaultbgcolor": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("color", attribs[attrib])); - attribs[attrib] = sheet.GetStyleNum("color", rest); - break; - case "defaultlayout": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("layout", attribs[attrib])); - attribs[attrib] = sheet.GetStyleNum("layout", rest); - break; - case "defaultfont": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("font", attribs[attrib])); - if (rest=="* * *") rest = ""; // all default - attribs[attrib] = sheet.GetStyleNum("font", rest); - break; - case "defaulttextformat": - case "defaultnontextformat": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("cellformat", attribs[attrib])); - attribs[attrib] = sheet.GetStyleNum("cellformat", rest); - break; - case "defaulttextvalueformat": - case "defaultnontextvalueformat": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("valueformat", attribs[attrib])); - attribs[attrib] = sheet.GetStyleNum("valueformat", rest); - for (cr in sheet.cells) { // forget all cached display strings - delete sheet.cells[cr].displaystring; - } - break; - case "lastcol": - case "lastrow": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]-0); - num = rest-0; - if (typeof num == "number") attribs[attrib] = num > 0 ? num : 1; - break; - case "recalc": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]); - if (rest == "off") { - attribs.recalc = rest; // manual recalc, not auto - } - else { // all values other than "off" mean "on" - delete attribs.recalc; - } - break; - default: - errortext = scc.s_escUnknownSheetCmd+cmdstr; - break; - } - } - - else if (/(^[A-Z])([A-Z])?(:[A-Z][A-Z]?){0,1}$/i.test(what)) { // col attributes - sheet.renderneeded = true; - what = what.toUpperCase(); - pos = what.indexOf(":"); - if (pos>=0) { - cr1 = SocialCalc.coordToCr(what.substring(0,pos)+"1"); - cr2 = SocialCalc.coordToCr(what.substring(pos+1)+"1"); - } - else { - cr1 = SocialCalc.coordToCr(what+"1"); - cr2 = cr1; - } - for (col=cr1.col; col <= cr2.col; col++) { - if (attrib=="width") { - cr = SocialCalc.rcColname(col); - if (saveundo) changes.AddUndo("set "+cr+" width", sheet.colattribs.width[cr]); - if (rest.length > 0 ) { - sheet.colattribs.width[cr] = rest; - } - else { - delete sheet.colattribs.width[cr]; - } - } - } - } - - // !!!!! need row attribs !!!! - - else if (/([a-z]){0,1}(\d+)/i.test(what)) { // cell attributes - ParseRange(); - if (cr1.row!=cr2.row || cr1.col!=cr2.col || sheet.celldisplayneeded || sheet.renderneeded) { // not one cell - sheet.renderneeded = true; - sheet.celldisplayneeded = ""; - } - else { - sheet.celldisplayneeded = SocialCalc.crToCoord(cr1.col, cr1.row); - } - for (row=cr1.row; row <= cr2.row; row++) { - for (col=cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - if (attrib=="value") { // set coord value type numeric-value - pos = rest.indexOf(" "); - cell.datavalue = rest.substring(pos+1)-0; - delete cell.errors; - cell.datatype = "v"; - cell.valuetype = rest.substring(0,pos); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="text") { // set coord text type text-value - pos = rest.indexOf(" "); - cell.datavalue = SocialCalc.decodeFromSave(rest.substring(pos+1)); - delete cell.errors; - cell.datatype = "t"; - cell.valuetype = rest.substring(0,pos); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="formula") { // set coord formula formula-body-less-initial-= - cell.datavalue = 0; // until recalc - delete cell.errors; - cell.datatype = "f"; - cell.valuetype = "e#N/A"; // until recalc - cell.formula = rest; - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="constant") { // set coord constant type numeric-value source-text - pos = rest.indexOf(" "); - pos2 = rest.substring(pos+1).indexOf(" "); - cell.datavalue = rest.substring(pos+1,pos+1+pos2)-0; - cell.valuetype = rest.substring(0,pos); - if (cell.valuetype.charAt(0)=="e") { // error - cell.errors = cell.valuetype.substring(1); - } - else { - delete cell.errors; - } - cell.datatype = "c"; - cell.formula = rest.substring(pos+pos2+2); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="empty") { // erase value - cell.datavalue = ""; - delete cell.errors; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="all") { // set coord all :this:val1:that:val2... - if (rest.length>0) { - cell = new SocialCalc.Cell(cr); - sheet.CellFromStringParts(cell, rest.split(":"), 1); - sheet.cells[cr] = cell; - } - else { - delete sheet.cells[cr]; - } - attribs.needsrecalc = "yes"; - } - else if (/^b[trbl]$/.test(attrib)) { // set coord bt 1px solid black - cell[attrib] = sheet.GetStyleNum("borderstyle", rest); - sheet.renderneeded = true; // affects more than just one cell - } - else if (attrib=="color" || attrib=="bgcolor") { - cell[attrib] = sheet.GetStyleNum("color", rest); - } - else if (attrib=="layout" || attrib=="cellformat") { - cell[attrib] = sheet.GetStyleNum(attrib, rest); - } - else if (attrib=="font") { // set coord font style weight size family - if (rest=="* * *") rest = ""; - cell[attrib] = sheet.GetStyleNum("font", rest); - } - else if (attrib=="textvalueformat" || attrib=="nontextvalueformat") { - cell[attrib] = sheet.GetStyleNum("valueformat", rest); - delete cell.displaystring; - } - else if (attrib=="cssc") { - rest = rest.replace(/[^a-zA-Z0-9\-]/g, ""); - cell.cssc = rest; - } - else if (attrib=="csss") { - rest = rest.replace(/\n/g, ""); - cell.csss = rest; - } - else if (attrib=="mod") { - rest = rest.replace(/[^yY]/g, "").toLowerCase(); - cell.mod = rest; - } - else if (attrib=="comment") { - cell.comment = SocialCalc.decodeFromSave(rest); - } - else { - errortext = scc.s_escUnknownSetCoordCmd+cmdstr; - } - } - } - - } - break; - - case "merge": - sheet.renderneeded = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - cell=sheet.GetAssuredCell(cr1.coord); - if (saveundo) changes.AddUndo("unmerge "+cr1.coord); - - if (cr2.col > cr1.col) cell.colspan = cr2.col - cr1.col + 1; - else delete cell.colspan; - if (cr2.row > cr1.row) cell.rowspan = cr2.row - cr1.row + 1; - else delete cell.rowspan; - - sheet.changedrendervalues = true; - - break; - - case "unmerge": - sheet.renderneeded = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - cell=sheet.GetAssuredCell(cr1.coord); - if (saveundo) changes.AddUndo("merge "+cr1.coord+":"+SocialCalc.crToCoord(cr1.col+(cell.colspan||1)-1, cr1.row+(cell.rowspan||1)-1)); - - delete cell.colspan; - delete cell.rowspan; - - sheet.changedrendervalues = true; - - break; - - case "erase": - case "cut": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - if (cmd1=="cut") { // save copy of whole thing before erasing - if (saveundo) changes.AddUndo("loadclipboard", SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard)); - SocialCalc.Clipboard.clipboard = SocialCalc.CreateSheetSave(sheet, what); - } - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - if (rest=="all") { - delete sheet.cells[cr]; - } - else if (rest == "formulas") { - cell.datavalue = ""; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - delete cell.errors; - delete cell.displaystring; - delete cell.parseinfo; - if (cell.comment) { // comments are considered content for erasing - delete cell.comment; - } - } - else if (rest == "formats") { - newcell = new SocialCalc.Cell(cr); // create a new cell without attributes - newcell.datavalue = cell.datavalue; // copy existing values - newcell.datatype = cell.datatype; - newcell.formula = cell.formula; - newcell.valuetype = cell.valuetype; - if (cell.comment) { - newcell.comment = cell.comment; - } - sheet.cells[cr] = newcell; // replace - } - } - } - attribs.needsrecalc = "yes"; - break; - - case "fillright": - case "filldown": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - if (cmd1 == "fillright") { - fillright = true; - rowstart = cr1.row; - colstart = cr1.col + 1; - } - else { - fillright = false; - rowstart = cr1.row + 1; - colstart = cr1.col; - } - for (row = rowstart; row <= cr2.row; row++) { - for (col = colstart; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - if (fillright) { - crbase = SocialCalc.crToCoord(cr1.col, row); - coloffset = col - colstart + 1; - rowoffset = 0; - } - else { - crbase = SocialCalc.crToCoord(col, cr1.row); - coloffset = 0; - rowoffset = row - rowstart + 1; - } - basecell = sheet.GetAssuredCell(crbase); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - if (cell.datatype == "f") { // offset relative coords, even in sheet references - cell.formula = SocialCalc.OffsetFormulaCoords(basecell.formula, coloffset, rowoffset); - } - else { - cell.formula = basecell.formula; - } - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - } - } - - attribs.needsrecalc = "yes"; - break; - - case "copy": - what = cmd.NextToken(); - rest = cmd.RestOfString(); - if (saveundo) changes.AddUndo("loadclipboard", SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard)); - SocialCalc.Clipboard.clipboard = SocialCalc.CreateSheetSave(sheet, what); - break; - - case "loadclipboard": - rest = cmd.RestOfString(); - if (saveundo) changes.AddUndo("loadclipboard", SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard)); - SocialCalc.Clipboard.clipboard = SocialCalc.decodeFromSave(rest); - break; - - case "clearclipboard": - if (saveundo) changes.AddUndo("loadclipboard", SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard)); - SocialCalc.Clipboard.clipboard = ""; - break; - - case "paste": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - if (!SocialCalc.Clipboard.clipboard) { - break; - } - clipsheet = new SocialCalc.Sheet(); // load clipboard contents as another sheet - clipsheet.ParseSheetSave(SocialCalc.Clipboard.clipboard); - cliprange = SocialCalc.ParseRange(clipsheet.copiedfrom); - coloffset = cr1.col - cliprange.cr1.col; // get sizes, etc. - rowoffset = cr1.row - cliprange.cr1.row; - numcols = cliprange.cr2.col - cliprange.cr1.col + 1; - numrows = cliprange.cr2.row - cliprange.cr1.row + 1; - if (cr1.col+numcols-1 > attribs.lastcol) attribs.lastcol = cr1.col+numcols-1; - if (cr1.row+numrows-1 > attribs.lastrow) attribs.lastrow = cr1.row+numrows-1; - - for (row = cr1.row; row < cr1.row+numrows; row++) { - for (col = cr1.col; col < cr1.col+numcols; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - crbase = SocialCalc.crToCoord(col-coloffset, row-rowoffset); - basecell = clipsheet.GetAssuredCell(crbase); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - attribtable = SocialCalc.CellPropertiesTable[attrib]; - if (attribtable && basecell[attrib]) { // table indexes to expand to strings since other sheet may have diff indexes - cell[attrib] = sheet.GetStyleNum(attribtable, clipsheet.GetStyleString(attribtable, basecell[attrib])); - } - else { // these are not table indexes - cell[attrib] = basecell[attrib]; - } - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - if (cell.datatype == "f") { // offset relative coords, even in sheet references - cell.formula = SocialCalc.OffsetFormulaCoords(basecell.formula, coloffset, rowoffset); - } - else { - cell.formula = basecell.formula; - } - delete cell.parseinfo; - cell.errors = basecell.errors; - if (basecell.comment) { // comments are pasted as part of content, though not filled, etc. - cell.comment = basecell.comment; - } - else if (cell.comment) { - delete cell.comment; - } - } - delete cell.displaystring; - } - } - - attribs.needsrecalc = "yes"; - break; - - case "sort": // sort cr1:cr2 col1 up/down col2 up/down col3 up/down - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - ParseRange(); - cols = []; // get columns and sort directions (or "") - dirs = []; - lastsortcol = 0; - for (i=0; i<=3; i++) { - cols[i] = cmd.NextToken(); - dirs[i] = cmd.NextToken(); - if (cols[i]) lastsortcol = i; - } - - sortcells = {}; // a copy of the data which will replace the original, but in the new order - sortlist = []; // an array of 0, 1, ..., nrows-1 needed for sorting - sortvalues = []; // values to be sorted corresponding to sortlist - sorttypes = []; // basic types of the values - - for (row = cr1.row; row <= cr2.row; row++) { // fill in the sort info - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.cells[cr]; - if (cell) { // only copy non-empty cells - sortcells[cr] = sheet.CellToString(cell); - if (saveundo) changes.AddUndo("set "+cr+" all", sortcells[cr]); - } - else { - if (saveundo) changes.AddUndo("set "+cr+" all"); - } - } - sortlist.push(sortlist.length); - sortvalues.push([]); - sorttypes.push([]); - slast = sorttypes.length-1; - for (i = 0; i <= lastsortcol; i++) { - cr = cols[i] + row; // get cr on this row in sort col - cell = sheet.GetAssuredCell(cr); - val = cell.datavalue; - valtype = cell.valuetype.charAt(0) || "b"; - if (valtype == "t") val = val.toLowerCase(); - sortvalues[slast].push(val); - sorttypes[slast].push(valtype); - } - } - - sortfunction = function(a, b) { // a comparison function that can handle all the type variations - var i, a1, b1, ta, cresult; - for (i=0; i<=lastsortcol; i++) { - if (dirs[i] == "up") { // handle sort direction - a1 = a; b1 = b; - } - else { - a1 = b; b1 = a; - } - ta = sorttypes[a1][i]; - tb = sorttypes[b1][i]; - if (ta == "t") { // numbers < text < errors, blank always last no matter what dir - if (tb == "t") { - a1 = sortvalues[a1][i]; - b1 = sortvalues[b1][i]; - cresult = a1 > b1 ? 1 : (a1 < b1 ? -1 : 0); - } - else if (tb == "n") { - cresult = 1; - } - else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } - else if (tb == "e") { - cresult = -1; - } - } - else if (ta == "n") { - if (tb == "t") { - cresult = -1; - } - else if (tb == "n") { - a1 = sortvalues[a1][i]-0; // force to numeric, just in case - b1 = sortvalues[b1][i]-0; - cresult = a1 > b1 ? 1 : (a1 < b1 ? -1 : 0); - } - else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } - else if (tb == "e") { - cresult = -1; - } - } - else if (ta == "e") { - if (tb == "e") { - a1 = sortvalues[a1][i]; - b1 = sortvalues[b1][i]; - cresult = a1 > b1 ? 1 : (a1 < b1 ? -1 : 0); - } - else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } - else { - cresult = 1; - } - } - else if (ta == "b") { - if (tb == "b") { - cresult = 0; - } - else { - cresult = dirs[i] == "up" ? 1 : -1; - } - } - if (cresult) { // return if tested not equal, otherwise do next column - return cresult; - } - } - cresult = a > b ? 1 : (a < b ? -1 : 0); // equal - return position in original to maintain it - return cresult; - } - - sortlist.sort(sortfunction); - - for (row = cr1.row; row <= cr2.row; row++) { // copy original rows into sorted positions - originalrow = sortlist[row-cr1.row]; // relative position where it was in original - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - sortedcr = SocialCalc.crToCoord(col, originalrow+cr1.row); // original cell to be put in new place - if (sortcells[sortedcr]) { - cell = new SocialCalc.Cell(cr); - sheet.CellFromStringParts(cell, sortcells[sortedcr].split(":"), 1); - if (cell.datatype == "f") { // offset coord refs, even to ***relative*** coords in other sheets - cell.formula = SocialCalc.OffsetFormulaCoords(cell.formula, 0, (row-cr1.row)-originalrow); - } - sheet.cells[cr] = cell; - } - else { - delete sheet.cells[cr]; - } - } - } - - attribs.needsrecalc = "yes"; - break; - - case "insertcol": - case "insertrow": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - - if (cmd1 == "insertcol") { - coloffset = 1; - colend = cr1.col; - rowoffset = 0; - rowend = 1; - newcolstart = cr1.col; - newcolend = cr1.col; - newrowstart = 1; - newrowend = attribs.lastrow; - if (saveundo) changes.AddUndo("deletecol "+cr1.coord); - } - else { - coloffset = 0; - colend = 1; - rowoffset = 1; - rowend = cr1.row; - newcolstart = 1; - newcolend = attribs.lastcol; - newrowstart = cr1.row; - newrowend = cr1.row; - if (saveundo) changes.AddUndo("deleterow "+cr1.coord); - } - - for (row=attribs.lastrow; row >= rowend; row--) { // copy the cells forward - for (col=attribs.lastcol; col >= colend; col--) { - crbase = SocialCalc.crToCoord(col, row); - cr = SocialCalc.crToCoord(col+coloffset, row+rowoffset); - if (!sheet.cells[crbase]) { // copying empty cell - delete sheet.cells[cr]; // delete anything that may have been there - } - else { // overwrite existing cell with moved contents - sheet.cells[cr] = sheet.cells[crbase]; - } - } - } - - for (row=newrowstart; row <= newrowend; row++) { // fill the "new" empty cells - for (col=newcolstart; col <= newcolend; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = new SocialCalc.Cell(cr); - sheet.cells[cr] = cell; - crbase = SocialCalc.crToCoord(col-coloffset, row-rowoffset); // copy attribs of the one before (0 gives you A or 1) - basecell = sheet.GetAssuredCell(crbase); - for (attrib in cellProperties) { - if (cellProperties[attrib] == 2) { // copy only format attributes - cell[attrib] = basecell[attrib]; - } - } - } - } - - for (cr in sheet.cells) { // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell && cell.datatype == "f") { - cell.formula = SocialCalc.AdjustFormulaCoords(cell.formula, cr1.col, coloffset, cr1.row, rowoffset); - } - if (cell) { - delete cell.parseinfo; - } - } - - for (name in sheet.names) { // update cell references to moved cells in names - if (sheet.names[name]) { // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = v2 + - SocialCalc.AdjustFormulaCoords(v1, cr1.col, coloffset, cr1.row, rowoffset); - } - } - - for (row = attribs.lastrow; row >= rowend && cmd1 == "insertrow"; row--) { // copy the row attributes forward - rownext = row + rowoffset; - for (attrib in sheet.rowattribs) { - val = sheet.rowattribs[attrib][row]; - if (sheet.rowattribs[attrib][rownext] != val) { // make assignment only if different - if (val) { - sheet.rowattribs[attrib][rownext] = val; - } - else { - delete sheet.rowattribs[attrib][rownext]; - } - } - } - } - - for (col = attribs.lastcol; col >= colend && cmd1 == "insertcol"; col--) { // copy the column attributes forward - colthis = SocialCalc.rcColname(col); - colnext = SocialCalc.rcColname(col + coloffset); - for (attrib in sheet.colattribs) { - val = sheet.colattribs[attrib][colthis]; - if (sheet.colattribs[attrib][colnext] != val) { // make assignment only if different - if (val) { - sheet.colattribs[attrib][colnext] = val; - } - else { - delete sheet.colattribs[attrib][colnext]; - } - } - } - } - - attribs.lastcol += coloffset; - attribs.lastrow += rowoffset; - attribs.needsrecalc = "yes"; - break; - - case "deletecol": - case "deleterow": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - lastcol = attribs.lastcol; // save old values since ParseRange sets... - lastrow = attribs.lastrow; - ParseRange(); - - if (cmd1 == "deletecol") { - coloffset = cr1.col - cr2.col - 1; - rowoffset = 0; - colstart = cr2.col + 1; - rowstart = 1; - } - else { - coloffset = 0; - rowoffset = cr1.row - cr2.row - 1; - colstart = 1; - rowstart = cr2.row + 1; - } - - for (row=rowstart; row <= lastrow - rowoffset; row++) { // copy the cells backwards - extra so no dup of last set - for (col=colstart; col <= lastcol - coloffset; col++) { - cr = SocialCalc.crToCoord(col+coloffset, row+rowoffset); - if (saveundo && (row cr2.col)) { - if (destcr.col < cr1.col) { // moving left - pushamount = cr1.col - destcr.col; - inserthoriz = -1; - } - else { - destcr.col -= 1; - coloffset = destcr.col - cr2.col; - pushamount = destcr.col - cr2.col; - inserthoriz = 1; - } - } - else if (coloffset==0 && (destcr.row < cr1.row || destcr.row > cr2.row)) { - if (destcr.row < cr1.row) { // moving up - pushamount = cr1.row - destcr.row; - insertvert = -1; - } - else { - destcr.row -= 1; - rowoffset = destcr.row - cr2.row; - pushamount = destcr.row - cr2.row; - insertvert = 1; - } - } - else { - cmd1 = "movepaste"; // not allowed right now - ignore - } - } - - // push any cells that need pushing - - movedto = {}; // remember what was moved where - - if (insertvert) { - for (row = 0; row < pushamount; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - if (insertvert < 0) { - crbase = SocialCalc.crToCoord(col, destcr.row+pushamount-row-1); // from cell - cr = SocialCalc.crToCoord(col, cr2.row-row); // to cell - } - else { - crbase = SocialCalc.crToCoord(col, destcr.row-pushamount+row+1); // from cell - cr = SocialCalc.crToCoord(col, cr1.row+row); // to cell - } - - basecell = sheet.GetAssuredCell(crbase); - if (saveundo) changes.AddUndo("set "+crbase+" all", sheet.CellToString(basecell)); - - cell = sheet.GetAssuredCell(cr); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - - movedto[crbase] = cr; // old crbase is now at cr - } - } - } - if (inserthoriz) { - for (col = 0; col < pushamount; col++) { - for (row = cr1.row; row <= cr2.row; row++) { - if (inserthoriz < 0) { - crbase = SocialCalc.crToCoord(destcr.col+pushamount-col-1, row); - cr = SocialCalc.crToCoord(cr2.col-col, row); - } - else { - crbase = SocialCalc.crToCoord(destcr.col-pushamount+col+1, row); - cr = SocialCalc.crToCoord(cr1.col+col, row); - } - - basecell = sheet.GetAssuredCell(crbase); - if (saveundo) changes.AddUndo("set "+crbase+" all", sheet.CellToString(basecell)); - - cell = sheet.GetAssuredCell(cr); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - - movedto[crbase] = cr; // old crbase is now at cr - } - } - } - - // paste moved cells into new place - - if (destcr.col+numcols-1 > attribs.lastcol) attribs.lastcol = destcr.col+numcols-1; - if (destcr.row+numrows-1 > attribs.lastrow) attribs.lastrow = destcr.row+numrows-1; - - for (row = cr1.row; row < cr1.row+numrows; row++) { - for (col = cr1.col; col < cr1.col+numcols; col++) { - cr = SocialCalc.crToCoord(col+coloffset, row+rowoffset); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - - crbase = SocialCalc.crToCoord(col, row); // get old cell to move - - movedto[crbase] = cr; // old crbase (moved cell) will now be at cr (destination) - - if (rest == "all" && !movingcells[crbase]) { // moving an empty cell - delete sheet.cells[cr]; // make the cell empty - continue; - } - - basecell = movingcells[crbase]; - if (!basecell) basecell = sheet.GetAssuredCell(crbase); - - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - if (basecell.comment) { // comments are pasted as part of content, though not filled, etc. - cell.comment = basecell.comment; - } - else if (cell.comment) { - delete cell.comment; - } - } - delete cell.displaystring; - } - } - - // do fixups - - for (cr in sheet.cells) { // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell) { - if (cell.datatype == "f") { - oldformula = cell.formula; - cell.formula = SocialCalc.ReplaceFormulaCoords(oldformula, movedto); - if (cell.formula != oldformula) { - delete cell.parseinfo; - if (saveundo && !movedto[cr]) { // moved cells are already saved for undo - changes.AddUndo("set "+cr+" formula "+oldformula); - } - } - } - else { - delete cell.parseinfo; - } - } - } - - for (name in sheet.names) { // update cell references to moved cells in names - if (sheet.names[name]) { // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - oldformula = v1; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = v2 + - SocialCalc.ReplaceFormulaCoords(v1, movedto); - if (saveundo && sheet.names[name].definition != oldformula) { // save changes - changes.AddUndo("name define "+name+" "+oldformula); - } - } - } - - attribs.needsrecalc = "yes"; - break; - - case "name": - what = cmd.NextToken(); - name = cmd.NextToken(); - rest = cmd.RestOfString(); - - name = name.toUpperCase().replace(/[^A-Z0-9_\.]/g, ""); - if (name == "") break; // must have something - - if (what == "define") { - if (rest == "") break; // must have something - if (sheet.names[name]) { // already exists - if (saveundo) changes.AddUndo("name define "+name+" "+sheet.names[name].definition); - sheet.names[name].definition = rest; - } - else { // new - if (saveundo) changes.AddUndo("name delete "+name); - sheet.names[name] = {definition: rest, desc: ""}; - } - } - else if (what == "desc") { - if (sheet.names[name]) { // must already exist - if (saveundo) changes.AddUndo("name desc "+name+" "+sheet.names[name].desc); - sheet.names[name].desc = rest; - } - } - else if (what == "delete") { - if (saveundo) { - if (sheet.names[name].desc) changes.AddUndo("name desc "+name+" "+sheet.names[name].desc); - changes.AddUndo("name define "+name+" "+sheet.names[name].definition); - } - delete sheet.names[name]; - } - attribs.needsrecalc = "yes"; - - break; - - case "recalc": - attribs.needsrecalc = "yes"; // request recalc - sheet.recalconce = true; // even if turned off - break; - - case "redisplay": - sheet.renderneeded = true; - break; - - case "changedrendervalues": // needed for undo sometimes - sheet.changedrendervalues = true; - break; - - case "startcmdextension": // startcmdextension extension rest-of-command - name = cmd.NextToken(); - cmdextension = SocialCalc.SheetCommandInfo.CmdExtensionCallbacks[name]; - if (cmdextension) { - cmdextension.func(name, cmdextension.data, sheet, cmd, saveundo); - } - break; - - default: - errortext = scc.s_escUnknownCmd+cmdstr; - break; - } - -/* For Debugging: -var ustack=""; -for (var i=0;i=0; i--) { // do them backwards - if (cmdstr) cmdstr += "\n"; // concatenate with separate lines - cmdstr += tos.undo[i]; - } - sheet.changes.Undo(); - sheet.ScheduleSheetCommands(cmdstr, false); // do undo operations - - } - -SocialCalc.SheetRedo = function(sheet) { - - var tos, i; - var didredo = sheet.changes.Redo(); - if (!didredo) { - sheet.ScheduleSheetCommands("", false); // schedule doing nothing - return; - } - tos = sheet.changes.TOS(); - var cmdstr = ""; - - for (i=0; tos && i= 0) { // quotes to double - updatedformula += '"' + ttext.replace(/"/, '""') + '"'; - } - else updatedformula += '"' + ttext + '"'; - } - else if (ttype == token_op) { - updatedformula += tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } - else { // leave everything else alone - updatedformula += ttext; - } - } - - return updatedformula; - - } - -// -// updatedformula = SocialCalc.AdjustFormulaCoords(formula, col, coloffset, row, rowoffset) -// -// Change all cell references to cells starting with col/row by offsets -// - -SocialCalc.AdjustFormulaCoords = function(formula, col, coloffset, row, rowoffset) { - - var ttype, ttext, i, newcr; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i=0; i=") - } - if (ttype == token_coord) { - cr = SocialCalc.coordToCr(ttext); - if ((coloffset < 0 && cr.col >= col && cr.col < col-coloffset) || - (rowoffset < 0 && cr.row >= row && cr.row < row-rowoffset)) { // refs to deleted cells become invalid - if (!sheetref) { - cr.col = 0; - cr.row = 0; - } - } - if (!sheetref) { - if (cr.col >= col) { - cr.col += coloffset; - } - if (cr.row >= row) { - cr.row += rowoffset; - } - } - if (ttext.charAt(0)=="$") { - newcr = "$"+SocialCalc.rcColname(cr.col); - } - else { - newcr = SocialCalc.rcColname(cr.col); - } - if (ttext.indexOf("$", 1)!=-1) { - newcr += "$" + cr.row; - } - else { - newcr += cr.row; - } - if (cr.row < 1 || cr.col < 1) { - newcr = "#REF!"; - } - ttext = newcr; - } - else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { // quotes to double - ttext = '"' + ttext.replace(/"/, '""') + '"'; - } - else ttext = '"' + ttext + '"'; - } - updatedformula += ttext; - } - - return updatedformula; - - } - -// -// updatedformula = SocialCalc.ReplaceFormulaCoords(formula, movedto) -// -// Change all cell references to cells that are keys in moveto to be to moveto[coord]. -// Don't change references to other sheets. -// Handle range extents specially. -// - -SocialCalc.ReplaceFormulaCoords = function(formula, movedto) { - - var ttype, ttext, i, newcr, coord; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i=0; i=") - } - if (ttype == token_coord) { - cr = SocialCalc.coordToCr(ttext); // get parts - coord = SocialCalc.crToCoord(cr.col, cr.row); // get "clean" reference - if (movedto[coord] && !sheetref) { // this is a reference to a moved cell - cr = SocialCalc.coordToCr(movedto[coord]); // get new row and col - if (ttext.charAt(0)=="$") { // copy absolute ref marks if present - newcr = "$"+SocialCalc.rcColname(cr.col); - } - else { - newcr = SocialCalc.rcColname(cr.col); - } - if (ttext.indexOf("$", 1)!=-1) { - newcr += "$" + cr.row; - } - else { - newcr += cr.row; - } - ttext = newcr; - } - } - else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { // quotes to double - ttext = '"' + ttext.replace(/"/, '""') + '"'; - } - else ttext = '"' + ttext + '"'; - } - updatedformula += ttext; - } - - return updatedformula; - - } - - -// ************************ -// -// Recalc Loop Code -// -// ************************ - -// -// How recalc works: -// -// !!!!!!!!!!!!!! -// - -// SocialCalc.RecalcInfo - object with global recalc info - -SocialCalc.RecalcInfo = { - - sheet: null, // which sheet is being recalced - - currentState: 0, // current state - state: {start_calc: 1, order: 2, calc: 3, start_wait: 4, done_wait: 5}, // allowed state values - - recalctimer: null, // value to cancel timer - maxtimeslice: 100, // maximum milliseconds per slice of recalc time before a wait - timeslicedelay: 1, // milliseconds to wait between recalc time slices - starttime: 0, // when recalc started - - // LoadSheet: a function that returns true if started a load or false if not. - // - - LoadSheet: function(sheetname) {return false;} // default returns not found - - } - -// SocialCalc.RecalcData - object with recalc info while determining recalc order and afterward - -SocialCalc.RecalcData = function() { // initialize a RecalcData object - - this.inrecalc = true; // if true, doing a recalc - this.celllist = []; // list with all potential cells to calculate - this.celllistitem = 0; // cell to check next when ordering - this.calclist = null; // object which is the chained list of cells to calculate - // each in the form of "coord: nextcoord" - // e.g., if B8 is calculated right after A8, then calclist.A8=="B8" - // if null, need to create the list - this.calclistlength = 0; // number of items in calclist - - this.firstcalc = null; // start of the calc list - a string or null - this.lastcalc = null; // last one on chain (used to add more to the end) - - this.nextcalc = null; // used to keep track during background recalc to make it restartable - this.count = 0; // number calculated - - // checkinfo is used when determining calc order: - - this.checkinfo = {}; // attributes are coords; if no attrib for a coord, it wasn't checked or doesn't need it - // values are RecalcCheckInfo objects while checking or TRUE when complete - - } - -// SocialCalc.RecalcCheckInfo - object that stores checking info while determining recalc order - -SocialCalc.RecalcCheckInfo = function() { // initialize a RecalcCheckInfo object - - this.oldcoord = null; // chain back up of cells referring to cells - this.parsepos = 0; // which token we are up to - - // range info - - this.inrange = false; // if true, in the process of checking a range of coords - this.inrangestart = false; // if true, have not yet filled in range loop values - this.cr1 = null; // range first coord as a cr object - this.cr2 = null; // range second coord as a cr object - this.c1 = null; // range extents - this.c2 = null; - this.r1 = null; - this.r2 = null; - this.c = null; // looping values - this.r = null; - - } - -// Recalc the entire sheet - -SocialCalc.RecalcSheet = function(sheet) { - - var coord, err, recalcdata; - var scri = SocialCalc.RecalcInfo; - - delete sheet.attribs.circularreferencecell; // reset recalc-wide things - SocialCalc.Formula.FreshnessInfoReset(); - - SocialCalc.RecalcClearTimeout(); - - scri.sheet = sheet; // set values needed by background recalc - scri.currentState = scri.state.start_calc; - - scri.starttime = new Date(); - - if (sheet.statuscallback) { - sheet.statuscallback(scri, "calcstart", null, sheet.statuscallbackparams); - } - - SocialCalc.RecalcSetTimeout(); - - } - -// -// SocialCalc.RecalcSetTimeout - set a timer for next recalc step -// - -SocialCalc.RecalcSetTimeout = function() { - - var scri = SocialCalc.RecalcInfo; - - scri.recalctimer = window.setTimeout(SocialCalc.RecalcTimerRoutine, scri.timeslicedelay); - - } - -// -// SocialCalc.RecalcClearTimeout - cancel any timeouts -// - -SocialCalc.RecalcClearTimeout = function() { - - var scri = SocialCalc.RecalcInfo; - - if (scri.recalctimer) { - window.clearTimeout(scri.recalctimer); - scri.recalctimer = null; - } - - } - - -// -// SocialCalc.RecalcLoadedSheet(sheetname, str, recalcneeded) -// -// Called when a sheet finishes loading with name, string, and t/f whether it should be recalced. -// If loaded sheet has sheet.attribs.recalc=="off", then no recalc done. -// If sheetname is null, then the sheetname waiting for will be used. -// - -SocialCalc.RecalcLoadedSheet = function(sheetname, str, recalcneeded) { - - var sheet; - var scri = SocialCalc.RecalcInfo; - var scf = SocialCalc.Formula; - - sheet = SocialCalc.Formula.AddSheetToCache(sheetname || scf.SheetCache.waitingForLoading, str); - - if (recalcneeded && sheet && sheet.attribs.recalc!="off") { // if recalcneeded, and not manual sheet, chain in this new sheet to recalc loop - sheet.previousrecalcsheet = scri.sheet; - scri.sheet = sheet; - scri.currentState = scri.state.start_calc; - } - scf.SheetCache.waitingForLoading = null; - - SocialCalc.RecalcSetTimeout(); - - } - - -// -// SocialCalc.RecalcTimerRoutine - handles the actual order determination and cell-by-cell recalculation in the background -// - -SocialCalc.RecalcTimerRoutine = function() { - - var eresult, cell, coord, err, status; - var starttime = new Date(); - var count = 0; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var scri = SocialCalc.RecalcInfo; - var sheet = scri.sheet; - if (!sheet) { - return; - } - var recalcdata = sheet.recalcdata; - - var do_statuscallback = function(status, arg) { // routine to do callback if required - if (sheet.statuscallback) { - sheet.statuscallback(recalcdata, status, arg, sheet.statuscallbackparams); - } - } - - SocialCalc.RecalcClearTimeout(); - - if (scri.currentState == scri.state.start_calc) { - - recalcdata = new SocialCalc.RecalcData(); - sheet.recalcdata = recalcdata; - - for (coord in sheet.cells) { // get list of cells to check for order - if (!coord) continue; - recalcdata.celllist.push(coord); - } - - recalcdata.calclist = {}; // start with empty list - scri.currentState = scri.state.order; // drop through to determining recalc order - } - - if (scri.currentState == scri.state.order) { - while (recalcdata.celllistitem < recalcdata.celllist.length) { // check all the cells to see if they should be on the list - coord = recalcdata.celllist[recalcdata.celllistitem++]; - err = SocialCalc.RecalcCheckCell(sheet, coord); - if (((new Date()) - starttime) >= scri.maxtimeslice) { // if taking too long, give up CPU for a while - do_statuscallback("calcorder", {coord: coord, total: recalcdata.celllist.length, count: recalcdata.celllistitem}); - SocialCalc.RecalcSetTimeout(); - return; - } - } - - do_statuscallback("calccheckdone", recalcdata.calclistlength); - - recalcdata.nextcalc = recalcdata.firstcalc; // start at the beginning of the recalc chain - scri.currentState = scri.state.calc; // loop through cells on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - if (scri.currentState == scri.state.start_wait) { // starting to wait for something - scri.currentState = scri.state.done_wait; // finished on next timer call - if (scri.LoadSheet) { - status = scri.LoadSheet(scf.SheetCache.waitingForLoading); - if (status) { // started a load operation - return; - } - } - SocialCalc.RecalcLoadedSheet(null, "", false); - return; - } - - if (scri.currentState == scri.state.done_wait) { - scri.currentState = scri.state.calc; // loop through cells on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - // otherwise should be scri.state.calc - - if (scri.currentState != scri.state.calc) { - alert("Recalc state error: "+scri.currentState+". Error in SocialCalc code."); - } - - coord = sheet.recalcdata.nextcalc; - while (coord) { - cell = sheet.cells[coord]; - eresult = scf.evaluate_parsed_formula(cell.parseinfo, sheet, false); - if (scf.SheetCache.waitingForLoading) { // wait until restarted - recalcdata.nextcalc = coord; // start with this cell again - recalcdata.count += count; - do_statuscallback("calcloading", {sheetname: scf.SheetCache.waitingForLoading}); - scri.currentState = scri.state.start_wait; // start load on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - if (scf.RemoteFunctionInfo.waitingForServer) { // wait until restarted - recalcdata.nextcalc = coord; // start with this cell again - recalcdata.count += count; - do_statuscallback("calcserverfunc", - {funcname: scf.RemoteFunctionInfo.waitingForServer, coord: coord, total: recalcdata.calclistlength, count: recalcdata.count}); - scri.currentState = scri.state.done_wait; // start load on next timer call - return; // return and wait for next recalc timer event - } - - if (cell.datavalue != eresult.value || - cell.valuetype != eresult.type) { // only update if changed from last time - cell.datavalue = eresult.value; - cell.valuetype = eresult.type; - delete cell.displaystring; - sheet.recalcchangedavalue = true; // remember something changed in case other code wants to know - } - if (eresult.error) { - cell.errors = eresult.error; - } - count++; - coord = sheet.recalcdata.calclist[coord]; - - if (((new Date()) - starttime) >= scri.maxtimeslice) { // if taking too long, give up CPU for a while - recalcdata.nextcalc = coord; // start with next cell on chain - recalcdata.count += count; - do_statuscallback("calcstep", {coord: coord, total: recalcdata.calclistlength, count: recalcdata.count}); - SocialCalc.RecalcSetTimeout(); - return; - } - } - - recalcdata.inrecalc = false; - - delete sheet.recalcdata; // save memory and clear out for name lookup formula evaluation - - delete sheet.attribs.needsrecalc; // remember recalc done - - scri.sheet = sheet.previousrecalcsheet || null; // chain back if doing recalc of loaded sheets - if (scri.sheet) { - scri.currentState = scri.state.calc; // start where we left off - SocialCalc.RecalcSetTimeout(); - return; - } - - scf.FreshnessInfo.recalc_completed = true; // say freshness info is complete - - do_statuscallback("calcfinished", (new Date()) - scri.starttime); - - } - - -// -// circref = SocialCalc.RecalcCheckCell(sheet, coord) -// -// Checks cell to put on calclist, looking at parsed tokens. -// Also checks cells this cell is dependent upon -// if it contains a formula with cell references. -// If circular reference, returns non-null. -// - -SocialCalc.RecalcCheckCell = function(sheet, startcoord) { - - var parseinfo, ttext, ttype, i, rangecoord, circref, value, pos, pos2, cell, coordvals; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_name = tokentype.name; - var token_coord = tokentype.coord; - - var recalcdata = sheet.recalcdata; - var checkinfo = recalcdata.checkinfo; - - var sheetref = false; // if true, a sheet reference is in effect, so don't check that - var oldcoord = null; // coord of formula that referred to this one when checking down the tree - var coord = startcoord; // the coord of the cell we are checking - - // Start with requested cell, and then continue down or up the dependency tree - // oldcoord (and checkinfo[coord].oldcoord) maintains the reference stack during the tree walk - // checkinfo[coord] maintains the stack of checking looping values, e.g., token number being checked - -mainloop: - while (coord) { - cell = sheet.cells[coord]; - coordvals = checkinfo[coord]; - - if (!cell || cell.datatype != "f" || // Don't calculate if not a formula - (coordvals && typeof coordvals != "object")) { // Don't calc if already calculated - coord = oldcoord; // go back up dependency tree to coord that referred to us - if (checkinfo[coord]) oldcoord = checkinfo[coord].oldcoord; - continue; - } - - if (!coordvals) { // do we have checking information about this cell? - coordvals = new SocialCalc.RecalcCheckInfo(); // no - make a place to hold it - checkinfo[coord] = coordvals; - } - - if (cell.errors) { // delete errors from previous recalcs - delete cell.errors; - } - - if (!cell.parseinfo) { // cache parsed formula - cell.parseinfo = scf.ParseFormulaIntoTokens(cell.formula); - } - parseinfo = cell.parseinfo; - - for (i=coordvals.parsepos; i coordvals.cr2.col) { coordvals.c1 = coordvals.cr2.col; coordvals.c2 = coordvals.cr1.col; } - else { coordvals.c1 = coordvals.cr1.col; coordvals.c2 = coordvals.cr2.col; } - coordvals.c = coordvals.c1 - 1; // start one before - - if (coordvals.cr1.row > coordvals.cr2.row) { coordvals.r1 = coordvals.cr2.row; coordvals.r2 = coordvals.cr1.row; } - else { coordvals.r1 = coordvals.cr1.row; coordvals.r2 = coordvals.cr2.row; } - coordvals.r = coordvals.r1; // start on this row - coordvals.inrangestart = false; - } - else { // not first time - } - coordvals.c += 1; // increment column - if (coordvals.c > coordvals.c2) { // finished the columns of this row - coordvals.r += 1; // increment row - if (coordvals.r > coordvals.r2) { // finished checking the entire range - coordvals.inrange = false; - continue; - } - coordvals.c = coordvals.c1; // start at the beginning of next row - } - rangecoord = SocialCalc.crToCoord(coordvals.c, coordvals.r); - - // now check that one - - coordvals.parsepos = i; // remember our position - coordvals.oldcoord = oldcoord; // remember back up chain - oldcoord = coord; // come back to us - coord = rangecoord; - if (checkinfo[coord] && typeof checkinfo[coord] == "object") { // Circular reference - cell.errors = SocialCalc.Constants.s_caccCircRef+startcoord; // set on original cell making the ref - checkinfo[startcoord] = true; // this one should be calculated once at this point - if (!recalcdata.firstcalc) { - recalcdata.firstcalc = startcoord; - } - else { - recalcdata.calclist[recalcdata.lastcalc] = startcoord; - } - recalcdata.lastcalc = startcoord; - recalcdata.calclistlength++; // count number on list - sheet.attribs.circularreferencecell = coord+"|"+oldcoord; // remember at least one circ ref - return cell.errors; - } - continue mainloop; - } - - ttype = parseinfo[i].type; // get token details - ttext = parseinfo[i].text; - if (ttype == token_op) { // references with sheet specifier are not checked - if (ttext == "!") { - sheetref = true; // found a sheet reference - } - else if (ttext != ":") { // for everything but a range, reset - sheetref = false; - } - } - - if (ttype == token_name) { // look for named range - value = scf.LookupName(sheet, ttext); - if (value.type == "range") { // only need to recurse here for range, which may be just one cell - pos = value.value.indexOf("|"); - if (pos != -1) { // range - check each cell - coordvals.cr1 = SocialCalc.coordToCr(value.value.substring(0,pos)); - pos2 = value.value.indexOf("|", pos+1); - coordvals.cr2 = SocialCalc.coordToCr(value.value.substring(pos+1,pos2)); - coordvals.inrange = true; - coordvals.inrangestart = true; - i = i-1; // back up so will start up again here - continue; - } - } - else if (value.type == "coord") { // just a coord - ttype = token_coord; // treat as a coord inline - ttext = value.value; // and then drop through to next test which should succeed - } - else { // not a defined name - probably a function - } - } - - if (ttype == token_coord) { // token is a coord - - if (i >= 2 // look for a range - && parseinfo[i-1].type == token_op && parseinfo[i-1].text == ':' - && parseinfo[i-2].type == token_coord - && !sheetref) { // Range -- check each cell - coordvals.cr1 = SocialCalc.coordToCr(parseinfo[i-2].text); // remember range extents - coordvals.cr2 = SocialCalc.coordToCr(ttext); - coordvals.inrange = true; // next time use the range looping code - coordvals.inrangestart = true; - i = i-1; // back up so will start up again here - continue; - } - - else if (!sheetref) { // Single cell reference - if (ttext.indexOf("$") != -1) ttext = ttext.replace(/\$/g, ""); // remove any $'s - coordvals.parsepos = i+1; // remember our position - come back on next token - coordvals.oldcoord = oldcoord; // remember back up chain - oldcoord = coord; // come back to us - coord = ttext; - if (checkinfo[coord] && typeof checkinfo[coord] == "object") { // Circular reference - cell.errors = SocialCalc.Constants.s_caccCircRef+startcoord; // set on original cell making the ref - checkinfo[startcoord] = true; // this one should be calculated once at this point - if (!recalcdata.firstcalc) { // add to calclist - recalcdata.firstcalc = startcoord; - } - else { - recalcdata.calclist[recalcdata.lastcalc] = startcoord; - } - recalcdata.lastcalc = startcoord; - recalcdata.calclistlength++; // count number on list - sheet.attribs.circularreferencecell = coord+"|"+oldcoord; // remember at least one circ ref - return cell.errors; - } - continue mainloop; - } - } - } - - sheetref = false; // make sure off when bump back up - - checkinfo[coord] = true; // this one is finished - if (!recalcdata.firstcalc) { // add to calclist - recalcdata.firstcalc = coord; - } - else { - recalcdata.calclist[recalcdata.lastcalc] = coord; - } - recalcdata.lastcalc = coord; - recalcdata.calclistlength++; // count number on list - - coord = oldcoord; // go back to the formula that referred to us and continue - oldcoord = checkinfo[coord] ? checkinfo[coord].oldcoord : null; - - } - - return ""; - - } - - -// ************************************* -// -// Parse class: -// -// Used by ExecuteSheetCommand to get elements of commands to execute. -// The string it works with consists of one or more lines each -// made up of one or more tokens separated by a delimiter. -// -// ************************************* - -// Initialize: set string to work with - -SocialCalc.Parse = function(str) { - - // properties: - - this.str = str; - this.pos = 0; - this.delimiter = " "; - this.lineEnd = str.indexOf("\n"); - if (this.lineEnd < 0) { - this.lineEnd = str.length; - } - - } - -// Return next token as a string - -SocialCalc.Parse.prototype.NextToken = function() { - if (this.pos < 0) return ""; - var pos2 = this.str.indexOf(this.delimiter, this.pos); - var pos1 = this.pos; - if (pos2 > this.lineEnd) { // don't go past end of line - pos2 = this.lineEnd; - } - if (pos2 >= 0) { - this.pos = pos2 + 1; - return this.str.substring(pos1, pos2); - } - else { - this.pos = this.lineEnd; - return this.str.substring(pos1, this.lineEnd); - } - } - -// Return everything from current point until end of line - -SocialCalc.Parse.prototype.RestOfString = function() { - var oldpos = this.pos; - if (this.pos < 0 || this.pos >= this.lineEnd) return ""; - this.pos = this.lineEnd; - return this.str.substring(oldpos, this.lineEnd); - } - -SocialCalc.Parse.prototype.RestOfStringNoMove = function() { - if (this.pos < 0 || this.pos >= this.lineEnd) return ""; - return this.str.substring(this.pos, this.lineEnd); - } - -// Move current point to next line - -SocialCalc.Parse.prototype.NextLine = function() { - this.pos = this.lineEnd + 1; - this.lineEnd = this.str.indexOf("\n", this.pos); - if (this.lineEnd < 0) { - this.lineEnd = this.str.length; - } - } - -// Check to see if at end of string with no more to process - -SocialCalc.Parse.prototype.EOF = function() { - if (this.pos < 0 || this.pos >= this.str.length) return true; - return false; - } - - -// ************************************* -// -// UndoStack class: -// -// Implements the behavior needed for a normal application's undo/redo stack. -// You add a new change sequence with PushChange. -// The type argument is a string that can be used to lookup some general string -// like "typing" or "setting attribute" for the menu prompts for undo/redo. -// -// You add the "do" steps with AddDo. The non-null, non-undefined arguments are -// joined together with " " to make a command string to be saved. -// -// You add the undo steps as commands for the most recent change with AddUndo. -// The non-null, non-undefined arguments are joined together with " " to make -// a command string to be saved. -// -// The Undo and Redo functions move the Top Of Stack pointer through the changes stack -// so you can undo and redo. Doing a new PushChange removes all undone items -// after TOS. -// -// You can push more things than you can undo if you want. -// There is a maximum to remember as the "did" stack for an audit trail (and as redo). This may be unlimited. -// There is a separate maximum to remember that can be undone. This may be smaller than maxRedo. -// -// ************************************* - -SocialCalc.UndoStack = function() { - - // properties: - - this.stack = []; // {command: [], type: type, undo: []} -- multiple dos and undos allowed - this.tos = -1; // top of stack position, used for undo/redo - this.maxRedo = 0; // Maximum size of redo stack (and audit trail which is this.stack[n].command) or zero if no limit - this.maxUndo = 50; // Maximum number of steps kept for undo (usually the memory intensive part) or zero if no limit - - } - -SocialCalc.UndoStack.prototype.PushChange = function(type) { // adding a new thing to the stack - while (this.stack.length > 0 && this.stack.length-1 > this.tos) { // pop off things not redone - this.stack.pop(); - } - this.stack.push({command: [], type: type, undo: []}); - if (this.maxRedo && this.stack.length > this.maxRedo) { // limit number kept as audit trail - this.stack.shift(); // remove the extra one - } - if (this.maxUndo && this.stack.length > this.maxUndo) { // need to trim excess undo info - this.stack[this.stack.length - this.maxUndo - 1].undo = []; // only need to remove one - } - this.tos = this.stack.length - 1; - } - -SocialCalc.UndoStack.prototype.AddDo = function() { - var args = []; - for (var i=0; i= 0) return this.stack[this.tos]; - else return null; - } - -SocialCalc.UndoStack.prototype.Undo = function() { - if (this.tos >= 0 && (!this.maxUndo || this.tos > this.stack.length - this.maxUndo - 1)) { - this.tos -= 1; - return true; - } - else { - return false; - } - } - -SocialCalc.UndoStack.prototype.Redo = function() { - if (this.tos < this.stack.length-1) { - this.tos += 1; - return true; - } - else { - return false; - } - } - -// ************************************* -// -// Clipboard Object: -// -// This is a single object. -// Stores the clipboard, which is shared by all active sheets. -// Like the undo stack, it does not persist from one editing session to another. -// -// ************************************* - -SocialCalc.Clipboard = { - - // properties: - - clipboard: "" // empty or string in save format with "copiedfrom:" set to a range - - } - - -// ************************************* -// -// RenderContext class: -// -// ************************************* - -SocialCalc.RenderContext = function(sheetobj) { - - var parts, num, s; - var attribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - // properties: - - this.sheetobj = sheetobj; - this.hideRowsCols = false; // Rendering with panes only works with "false" - // !!!! Note: not implemented yet in rendering, just saved as an attribute - this.showGrid = false; - this.showRCHeaders = false; - this.rownamewidth = scc.defaultRowNameWidth; - this.pixelsPerRow = scc.defaultAssumedRowHeight; - - this.cellskip = {}; // if present, coord of cell covering this cell - this.coordToCR = {}; // for cells starting spans, coordToCR[coord]={row:row, col:col} - this.colwidth = []; // precomputed column widths, taking into account defaults - this.totalwidth = 0; // precomputed total table width - - this.rowpanes = []; // for each pane, {first: firstrow, last: lastrow} - this.colpanes = []; // for each pane, {first: firstrow, last: lastrow} - this.maxcol=0; // max col and row to display, adding long spans, etc. - this.maxrow=0; - - this.highlights = {}; // for each cell with special display: coord:highlightType (see this.highlightTypes) - this.cursorsuffix = ""; // added to highlights[cr]=="cursor" to get type to lookup - - this.highlightTypes = // attributes to change when highlit - { - cursor: {style: scc.defaultHighlightTypeCursorStyle, className: scc.defaultHighlightTypeCursorClass}, - range: {style: scc.defaultHighlightTypeRangeStyle, className: scc.defaultHighlightTypeRangeClass}, - cursorinsertup: {style: "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-x;backgroundPosition:top left;backgroundImage:url("+scc.defaultImagePrefix+"cursorinsertup.gif);", className: scc.defaultHighlightTypeCursorClass}, - cursorinsertleft: {style: "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-y;backgroundPosition:top left;backgroundImage:url("+scc.defaultImagePrefix+"cursorinsertleft.gif);", className: scc.defaultHighlightTypeCursorClass}, - range2: {style: "color:#000;backgroundColor:#FFF;backgroundImage:url("+scc.defaultImagePrefix+"range2.gif);", className: ""} - } - - this.cellIDprefix = scc.defaultCellIDPrefix; // if non-null, each cell will render with an ID - - this.defaultlinkstyle = null; // default linkstyle object (allows you to pass values to link renderer) - this.defaultHTMLlinkstyle = {type: "html"}; // default linkstyle for standalone HTML - - // constants: - - this.defaultfontstyle = scc.defaultCellFontStyle; - this.defaultfontsize = scc.defaultCellFontSize; - this.defaultfontfamily = scc.defaultCellFontFamily; - - this.defaultlayout = scc.defaultCellLayout; - - this.defaultpanedividerwidth = scc.defaultPaneDividerWidth; - this.defaultpanedividerheight = scc.defaultPaneDividerHeight; - - this.gridCSS = scc.defaultGridCSS; - - this.commentClassName = scc.defaultCommentClass; // for cells with non-blank comments when this.showGrid is true - this.commentCSS = scc.defaultCommentStyle; // any combination of classnames and styles may be used - this.commentNoGridClassName = scc.defaultCommentNoGridClass; // for cells when this.showGrid is false - this.commentNoGridCSS = scc.defaultCommentNoGridStyle; // any combination of classnames and styles may be used - - this.classnames = // any combination of classnames and explicitStyles can be used - { - colname: scc.defaultColnameClass, - rowname: scc.defaultRownameClass, - selectedcolname: scc.defaultSelectedColnameClass, - selectedrowname: scc.defaultSelectedRownameClass, - upperleft: scc.defaultUpperLeftClass, - skippedcell: scc.defaultSkippedCellClass, - panedivider: scc.defaultPaneDividerClass - }; - - this.explicitStyles = // these may be used so you won't need a stylesheet with the classnames - { - colname: scc.defaultColnameStyle, - rowname: scc.defaultRownameStyle, - selectedcolname: scc.defaultSelectedColnameStyle, - selectedrowname: scc.defaultSelectedRownameStyle, - upperleft: scc.defaultUpperLeftStyle, - skippedcell: scc.defaultSkippedCellStyle, - panedivider: scc.defaultPaneDividerStyle - }; - - // processed info about cell skipping - - this.cellskip = null; - this.needcellskip = true; - - // precomputed values, filling in defaults indicated by "*" - - this.fonts=[]; // for each fontnum, {style: fs, weight: fw, size: fs, family: ff} - this.layouts=[]; // for each layout, "padding:Tpx Rpx Bpx Lpx;vertical-align:va;" - - this.needprecompute = true; // need to call PrecomputeSheetFontsAndLayouts - - // if have a sheet object, initialize constants and precomputed values - - if (sheetobj) { - this.rowpanes[0] = {first: 1, last: attribs.lastrow}; - this.colpanes[0] = {first: 1, last: attribs.lastcol}; - - } - else throw scc.s_rcMissingSheet; - - } - -// Methods: - -SocialCalc.RenderContext.prototype.PrecomputeSheetFontsAndLayouts = function() {SocialCalc.PrecomputeSheetFontsAndLayouts(this);}; -SocialCalc.RenderContext.prototype.CalculateCellSkipData = function() {SocialCalc.CalculateCellSkipData(this);}; -SocialCalc.RenderContext.prototype.CalculateColWidthData = function() {SocialCalc.CalculateColWidthData(this);}; -SocialCalc.RenderContext.prototype.SetRowPaneFirstLast = function(panenum, first, last) {this.rowpanes[panenum]={first:first, last:last};}; -SocialCalc.RenderContext.prototype.SetColPaneFirstLast = function(panenum, first, last) {this.colpanes[panenum]={first:first, last:last};}; -SocialCalc.RenderContext.prototype.CoordInPane = function(coord, rowpane, colpane) {return SocialCalc.CoordInPane(this, coord, rowpane, colpane);}; -SocialCalc.RenderContext.prototype.CellInPane = function(row, col, rowpane, colpane) {return SocialCalc.CellInPane(this, row, col, rowpane, colpane);}; -SocialCalc.RenderContext.prototype.InitializeTable = function(tableobj) {SocialCalc.InitializeTable(this, tableobj);}; -SocialCalc.RenderContext.prototype.RenderSheet = function(oldtable, linkstyle) {return SocialCalc.RenderSheet(this, oldtable, linkstyle);}; -SocialCalc.RenderContext.prototype.RenderColGroup = function() {return SocialCalc.RenderColGroup(this);}; -SocialCalc.RenderContext.prototype.RenderColHeaders = function() {return SocialCalc.RenderColHeaders(this);}; -SocialCalc.RenderContext.prototype.RenderSizingRow = function() {return SocialCalc.RenderSizingRow(this);}; -SocialCalc.RenderContext.prototype.RenderRow = function(rownum, rowpane, linkstyle) {return SocialCalc.RenderRow(this, rownum, rowpane, linkstyle);}; -SocialCalc.RenderContext.prototype.RenderSpacingRow = function() {return SocialCalc.RenderSpacingRow(this);}; -SocialCalc.RenderContext.prototype.RenderCell = function(rownum, colnum, rowpane, colpane, noElement, linkstyle) - {return SocialCalc.RenderCell(this, rownum, colnum, rowpane, colpane, noElement, linkstyle);}; - -// Functions: - -SocialCalc.PrecomputeSheetFontsAndLayouts = function(context) { - - var defaultfont, parts, layoutre, dparts, sparts, num, s, i; - var sheetobj = context.sheetobj; - var attribs = sheetobj.attribs; - - if (attribs.defaultfont) { - defaultfont = sheetobj.fonts[attribs.defaultfont]; - defaultfont = defaultfont.replace(/^\*/,SocialCalc.Constants.defaultCellFontStyle); - defaultfont = defaultfont.replace(/(.+)\*(.+)/,"$1"+SocialCalc.Constants.defaultCellFontSize+"$2"); - defaultfont = defaultfont.replace(/\*$/,SocialCalc.Constants.defaultCellFontFamily); - parts=defaultfont.match(/^(\S+? \S+?) (\S+?) (\S.*)$/); - context.defaultfontstyle = parts[1]; - context.defaultfontsize = parts[2]; - context.defaultfontfamily = parts[3]; - } - - for (num=1; num1 || rowspan>1) { - for (skiprow=row; skiprowcontext.maxrow) maxrow=skiprow; - if (skipcol>context.maxcol) maxcol=skipcol; - } - } - } - } - } - - context.needcellskip = false; - - } - -SocialCalc.CalculateColWidthData = function(context) { - - var colnum, colname, colwidth, totalwidth; - - var sheetobj=context.sheetobj; - var sheetcolattribs=sheetobj.colattribs; - - // Calculate column width data - - totalwidth=context.showRCHeaders ? context.rownamewidth-0 : 0; - for (colpane=0; colpane0)) ? (colwidth-0) : 10; - } - } - context.totalwidth = totalwidth; - - } - -SocialCalc.InitializeTable = function(context, tableobj) { - -/* - -Uses border-collapse so corners don't have holes -Note: IE and Firefox handle differently (IE adds borders and padding) -under border-collapse and Safari has problems with and wide text -Tablelayout "fixed" also leads to problems - -*/ - -/* - -*** Discussion *** - -The rendering assumes fixed column widths, even though SocialCalc allows "auto". -There may be issues with "auto" and it is hard to make it work cross-browser -with border-collapse, etc. - -This and the RenderSheet routine are where in the code the specifics of -table attributes and column size definitions are set. As the browsers settle down -and when we decide if we don't need auto width, we may want to revisit the way the -code does this (e.g., use table-layout:fixed). - -*/ - tableobj.style.borderCollapse="collapse"; - tableobj.cellSpacing="0"; - tableobj.cellPadding="0"; - - tableobj.style.width=context.totalwidth+"px"; - - } - -// -// tableobj = SocialCalc.RenderSheet(context, oldtable, linkstyle) -// -// Renders a render context returning a DOM table object. -// If there is an oldtable object, it replaces it in the parent node. -// If oldtable is null, it just returns the new one. -// The linkstyle is "" or null for editing rendering -// and optionally an object passed on to formatting code. -// - -SocialCalc.RenderSheet = function(context, oldtable, linkstyle) { - - var newrow, rowpane; - var tableobj, colgroupobj, tbodyobj, parentnode; - - // do precompute stuff if necessary - - if (context.sheetobj.changedrendervalues) { - context.needcellskip = true; - context.needprecompute = true; - context.sheetobj.changedrendervalues = false; - } - if (context.needcellskip) { - context.CalculateCellSkipData(); - } - if (context.needprecompute) { - context.PrecomputeSheetFontsAndLayouts(); - } - - context.CalculateColWidthData(); // always make sure col width values are up to date - - // make the table element and fill it in - - tableobj=document.createElement("table"); - context.InitializeTable(tableobj); - - colgroupobj=context.RenderColGroup(); - tableobj.appendChild(colgroupobj); - - tbodyobj=document.createElement("tbody"); - - tbodyobj.appendChild(context.RenderSizingRow()); - - if (context.showRCHeaders) { - newrow=context.RenderColHeaders(); - if (newrow) tbodyobj.appendChild(newrow); - } - - for (rowpane=0; rowpane position in Safari) - newcol.innerHTML=rownum+""; - result.appendChild(newcol); - } - - for (colpane=0; colpane1) { - span=1; - for (num=1; num1) { - span=1; - for (num=1; num panerowlimits.last) return false; - if (col < panecollimits.first || col > panecollimits.last) return false; - return true; - } - -SocialCalc.CreatePseudoElement = function() { - return {style:{cssText:""}, innerHTML: "", className: ""}; - } - - -// ************************************* -// -// Misc. functions: -// -// ************************************* - -SocialCalc.rcColname = function(c) { - if (c > 702) c = 702; // maximum number of columns - ZZ - if (c < 1) c = 1; - var collow = (c - 1) % 26 + 65; - var colhigh = Math.floor((c - 1) / 26); - if (colhigh) - return String.fromCharCode(colhigh + 64) + String.fromCharCode(collow); - else - return String.fromCharCode(collow); - } - -SocialCalc.letters = ["A","B","C","D","E","F","G","H","I","J","K","L","M", - "N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]; - -SocialCalc.crToCoord = function(c, r) { - var result; - if (c < 1) c = 1; - if (c > 702) c = 702; // maximum number of columns - ZZ - if (r < 1) r = 1; - var collow = (c - 1) % 26; - var colhigh = Math.floor((c - 1) / 26); - if (colhigh) - result = SocialCalc.letters[colhigh-1] + SocialCalc.letters[collow] + r; - else - result = SocialCalc.letters[collow] + r; - return result; - } - -SocialCalc.coordToCol = {}; // too expensive to set in crToCoord since that is called so many times -SocialCalc.coordToRow = {}; - -SocialCalc.coordToCr = function(cr) { - var c, i, ch; - var r = SocialCalc.coordToRow[cr]; - if (r) return {row: r, col: SocialCalc.coordToCol[cr]}; - c=0;r=0; - for (i=0; i=97) c = 26*c + ch-96; - else if (ch>=65) c = 26*c + ch-64; - } - SocialCalc.coordToCol[cr] = c; - SocialCalc.coordToRow[cr] = r; - return {row: r, col: c}; - - } - -SocialCalc.ParseRange = function(range) { - var pos, cr, cr1, cr2; - if (!range) range = "A1:A1"; // error return, hopefully benign - range = range.toUpperCase(); - pos = range.indexOf(":"); - if (pos>=0) { - cr = range.substring(0,pos); - cr1 = SocialCalc.coordToCr(cr); - cr1.coord = cr; - cr = range.substring(pos+1); - cr2 = SocialCalc.coordToCr(cr); - cr2.coord = cr; - } - else { - cr1 = SocialCalc.coordToCr(range); - cr1.coord = range; - cr2 = SocialCalc.coordToCr(range); - cr2.coord = range; - } - return {cr1: cr1, cr2: cr2}; - } - -SocialCalc.decodeFromSave = function(s) { - if (typeof s != "string") return s; - if (s.indexOf("\\")==-1) return s; // for performace reasons: replace nothing takes up time - var r=s.replace(/\\c/g,":"); - r=r.replace(/\\n/g,"\n"); - return r.replace(/\\b/g,"\\"); - } - -SocialCalc.decodeFromAjax = function(s) { - if (typeof s != "string") return s; - if (s.indexOf("\\")==-1) return s; // for performace reasons: replace nothing takes up time - var r=s.replace(/\\c/g,":"); - r=r.replace(/\\n/g,"\n"); - r=r.replace(/\\e/g,"]]"); - return r.replace(/\\b/g,"\\"); - } - -SocialCalc.encodeForSave = function(s) { - if (typeof s != "string") return s; - if (s.indexOf("\\")!=-1) // for performace reasons: replace nothing takes up time - s=s.replace(/\\/g,"\\b"); - if (s.indexOf(":")!=-1) - s=s.replace(/:/g,"\\c"); - if (s.indexOf("\n")!=-1) - s=s.replace(/\n/g,"\\n"); - return s; - } - -// -// Returns estring where &, <, >, " are HTML escaped -// -SocialCalc.special_chars = function(string) { - - if (/[&<>"]/.test(string)) { // only do "slow" replaces if something to replace - string = string.replace(/&/g, "&"); - string = string.replace(//g, ">"); - string = string.replace(/"/g, """); - } - return string; - - } - -SocialCalc.Lookup = function(value, list) { - - for (i=0; i value) { - if (i>0) return i-1; - else return null; - } - } - return list.length-1; // if all smaller, matches last - - } - -// -// setStyles(element, cssText) -// -// Takes a pseudo style string (e.g., text-align must be textAlign) and sets -// the element's style value for each style name listed (leaving others unchanged). -// OK to call with null cssText. -// - -SocialCalc.setStyles = function (element, cssText) { - - var parts, part, pos, name, value; - - if (!cssText) return; - - parts = cssText.split(";"); - for (part=0; part'+dvsc+''; - } - else if (valueformat=="text-link") { // more extensive link capabilities for regular web links - displayvalue = SocialCalc.expand_text_link(displayvalue, sheetobj, linkstyle, valueformat); - } - else if (valueformat=="text-image") { // text is a URL for an image - dvue = encodeURI(displayvalue); - displayvalue = ''; - } - else if (valueformat.substring(0,12)=="text-custom:") { // construct a custom text format: @r = text raw, @s = special chars, @u = url encoded - dvsc = SocialCalc.special_chars(displayvalue); // do special chars - dvsc = dvsc.replace(/ /g, "  "); // keep multiple spaces - dvsc = dvsc.replace(/\n/g, "
    "); // keep line breaks - dvue = encodeURI(displayvalue); - textval={}; - textval.r = displayvalue; - textval.s = dvsc; - textval.u = dvue; - displayvalue = valueformat.substring(12); // remove "text-custom:" - displayvalue = displayvalue.replace(/@(r|s|u)/g, function(a,c){return textval[c];}); // replace placeholders - } - else if (valueformat.substring(0,6)=="custom") { // custom - displayvalue = SocialCalc.special_chars(displayvalue); // do special chars - displayvalue = displayvalue.replace(/ /g, "  "); // keep multiple spaces - displayvalue = displayvalue.replace(/\n/g, "
    "); // keep line breaks - displayvalue += " (custom format)"; - } - else if (valueformat=="hidden") { - displayvalue = " "; - } - else { // plain text - displayvalue = SocialCalc.special_chars(displayvalue); // do special chars - displayvalue = displayvalue.replace(/ /g, "  "); // keep multiple spaces - displayvalue = displayvalue.replace(/\n/g, "
    "); // keep line breaks - } - - return displayvalue; - - } - - -// -// displayvalue = format_number_for_display(rawvalue, valuetype, valueformat) -// - -SocialCalc.format_number_for_display = function(rawvalue, valuetype, valueformat) { - - var value, valuesubtype; - var scc = SocialCalc.Constants; - - value = rawvalue-0; - - valuesubtype = valuetype.substring(1); - - if (valueformat=="Auto" || valueformat=="") { // cases with default format - if (valuesubtype=="%") { // will display a % character - valueformat = "#,##0.0%"; - } - else if (valuesubtype=='$') { - valueformat = '[$]#,##0.00'; - } - else if (valuesubtype=='dt') { - valueformat = scc.defaultFormatdt; - } - else if (valuesubtype=='d') { - valueformat = scc.defaultFormatd; - } - else if (valuesubtype=='t') { - valueformat = scc.defaultFormatt; - } - else if (valuesubtype=='l') { - valueformat = 'logical'; - } - else { - valueformat = "General"; - } - } - - if (valueformat=="logical") { // do logical format - return value ? scc.defaultDisplayTRUE : scc.defaultDisplayFALSE; - } - - if (valueformat=="hidden") { // do hidden format - return " "; - } - - // Use format - - return SocialCalc.FormatNumber.formatNumberWithFormat(rawvalue, valueformat, ""); - - } - -// -// valueinfo = DetermineValueType(rawvalue) -// -// Takes a value and looks for special formatting like $, %, numbers, etc. -// Returns the value as a number or string and the type as {value: value, type: type}. -// Tries to follow the spec for spreadsheet function VALUE(v). -// - -SocialCalc.DetermineValueType = function(rawvalue) { - - var value = rawvalue + ""; - var type = "t"; - var tvalue, matches, year, hour, minute, second, denom, num, intgr, constr; - - tvalue = value.replace(/^\s+/, ""); // remove leading and trailing blanks - tvalue = tvalue.replace(/\s+$/, ""); - - if (value.length==0) { - type = ""; - } - else if (value.match(/^\s+$/)) { // just blanks - ; // leave type "t" - } - else if (tvalue.match(/^[-+]?\d*(?:\.)?\d*(?:[eE][-+]?\d+)?$/)) { // general number, including E - value = tvalue - 0; // try converting to number - if (isNaN(value)) { // leave alone - catches things like plain "-" - value = rawvalue + ""; - } - else { - type = "n"; - } - } - else if (tvalue.match(/^[-+]?\d*(?:\.)?\d*\s*%$/)) { // percent form: 15.1% - value = (tvalue.slice(0, -1) - 0) / 100; // convert and scale - type = "n%"; - } - else if (tvalue.match(/^[-+]?\$\s*\d*(?:\.)?\d*\s*$/) && tvalue.match(/\d/)) { // $ format: $1.49 - value = tvalue.replace(/\$/, "") - 0; - type = "n$"; - } - else if (tvalue.match(/^[-+]?(\d*,\d*)+(?:\.)?\d*$/)) { // number format ignoring commas: 1,234.49 - value = tvalue.replace(/,/g, "") - 0; - type = "n"; - } - else if (tvalue.match(/^[-+]?(\d*,\d*)+(?:\.)?\d*\s*%$/)) { // % with commas: 1,234.49% - value = (tvalue.replace(/[%,]/g, "") - 0) / 100; - type = "n%"; - } - else if (tvalue.match(/^[-+]?\$\s*(\d*,\d*)+(?:\.)?\d*$/) && tvalue.match(/\d/)) { // $ and commas: $1,234.49 - value = tvalue.replace(/[\$,]/g, "") - 0; - type = "n$"; - } - else if (matches=value.match(/^(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{1,4})\s*$/)) { // MM/DD/YYYY, MM/DD/YYYY - year = matches[3] - 0; - year = year < 1000 ? year + 2000 : year; - value = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, matches[1]-0, matches[2]-0)-2415019; - type = "nd"; - } - else if (matches=value.match(/^(\d{4})[\/\-](\d{1,2})[\/\-](\d{1,2})\s*$/)) { // YYYY-MM-DD, YYYY/MM/DD - year = matches[1]-0; - year = year < 1000 ? year + 2000 : year; - value = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, matches[2]-0, matches[3]-0)-2415019; - type = "nd"; - } - else if (matches=value.match(/^(\d{1,2}):(\d{1,2})\s*$/)) { // HH:MM - hour = matches[1]-0; - minute = matches[2]-0; - if (hour < 24 && minute < 60) { - value = hour/24 + minute/(24*60); - type = "nt"; - } - } - else if (matches=value.match(/^(\d{1,2}):(\d{1,2}):(\d{1,2})\s*$/)) { // HH:MM:SS - hour = matches[1]-0; - minute = matches[2]-0; - second = matches[3]-0; - if (hour < 24 && minute < 60 && second < 60) { - value = hour/24 + minute/(24*60) + second/(24*60*60); - type = "nt"; - } - } - else if (matches=value.match(/^\s*([-+]?\d+) (\d+)\/(\d+)\s*$/)) { // 1 1/2 - intgr = matches[1]-0; - num = matches[2]-0; - denom = matches[3]-0; - if (denom && denom > 0) { - value = intgr + (intgr < 0 ? -num/denom : num/denom); - type = "n"; - } - } - else if (constr=SocialCalc.InputConstants[value.toUpperCase()]) { // special constants, like "false" and #N/A - num = constr.indexOf(","); - value = constr.substring(0,num)-0; - type = constr.substring(num+1); - } - - else if (tvalue.length > 7 && tvalue.substring(0,7).toLowerCase()=="http://") { // URL - value = tvalue; - type = "tl"; - } - - return {value: value, type: type}; - - } - -SocialCalc.InputConstants = { // strings that turn into constants for SocialCalc.DetermineValueType - "TRUE": "1,nl", "FALSE": "0,nl", "#N/A": "0,e#N/A", "#NULL!": "0,e#NULL!", "#NUM!": "0,e#NUM!", - "#DIV/0!": "0,e#DIV/0!", "#VALUE!": "0,e#VALUE!", "#REF!": "0,e#REF!", "#NAME?": "0,e#NAME?"}; - -// -// result = default_expand_markup(displayvalue, sheetobj, linkstyle) -// -// Processes wiki-text -- this is a placeholder. -// Reference to here in SocialCalc.expand_markup should be replaced by application-specific routine. -// - -SocialCalc.default_expand_markup = function(displayvalue, sheetobj, linkstyle) { - - var result = displayvalue; - - result = SocialCalc.special_chars(result); // do special chars - result = result.replace(/ /g, "  "); // keep multiple spaces - result = result.replace(/\n/g, "
    "); // keep line breaks - - return result; // do very little by default - - result = result.replace(/('*)'''(.*?)'''/g, "$1$2<\/b>"); // Wiki-style bold/italics - result = result.replace(/''(.*?)''/g, "$1<\/i>"); - - return result; - - } - - -// -// result = SocialCalc.expand_text_link(displayvalue, sheetobj, linkstyle, valueformat) -// -// Parses link text (URL, descriptions, pagenames, workspace names) and returns HTML -// - -SocialCalc.expand_text_link = function(displayvalue, sheetobj, linkstyle, valueformat) { - - var desc, tb, str; - - var scc = SocialCalc.Constants; - - var url = ""; - var parts = SocialCalc.ParseCellLinkText(displayvalue+""); - - if (parts.desc) { - desc = SocialCalc.special_chars(parts.desc); - } - else { - desc = parts.pagename ? scc.defaultPageLinkFormatString : scc.defaultLinkFormatString; - } - - if (displayvalue.length > 7 && displayvalue.substring(0,7).toLowerCase()=="http://" - && displayvalue.charAt(displayvalue.length-1)!=">") { - desc = desc.substring(7); // remove http:// unless explicit - } - - tb = (parts.newwin || !linkstyle) ? ' target="_blank"' : ""; - - if (parts.pagename) { - if (SocialCalc.Callbacks.MakePageLink) { - url = SocialCalc.Callbacks.MakePageLink(parts.pagename, parts.workspacename, linkstyle, valueformat); - } -// else if (parts.workspace) { -// url = "/" + encodeURI(parts.workspace) + "/" + encodeURI(parts.pagename); -// } -// else { -// url = parts.pagename; -// } - } - else { - url = encodeURI(parts.url); - } - str = '' + desc + ''; - - return str; - - } - - -// -// result = SocialCalc.ParseCellLinkText(str) -// -// Given: url = http://www.someurl.com/more, desc = Some descriptive text -// -// Takes the following: -// -// url -// -// desc -// "desc" -// <<>> instead of <> => target="_blank" (new window) -// -// [page name] -// "desc"[page name] -// desc[page name] -// {workspace name [page name]} -// "desc"{workspace name [page name]} -// [[]] instead of [] => target="_blank" (new window) -// -// -// Returns: {url: url, desc: desc, newwin: t/f, pagename: pagename, workspace: workspace} -// - -SocialCalc.ParseCellLinkText = function(str) { - - var result = {url: "", desc: "", newwin: false, pagename: "", workspace: ""}; - - var pageform = false; - var urlend = str.length - 1; - var descstart = 0; - var lastlt = str.lastIndexOf("<"); - var lastbrkt = str.lastIndexOf("["); - var lastbrace = str.lastIndexOf("{"); - var descend = -1; - - if ((str.charAt(urlend) != ">" || lastlt == -1) - && (str.charAt(urlend) != "]" || lastbrkt == -1) - && (str.charAt(urlend) != "}" || str.charAt(urlend-1) != "]" || - lastbrace == -1 || lastbrkt == -1 || lastbrkt < lastbrace)) { // plain url - urlend++; - descend = urlend; - } - else { // some markup - if (str.charAt(urlend)==">") { // url form - descend = lastlt - 1; - if (lastlt > 0 && str.charAt(descend) == "<" && str.charAt(urlend-1) == ">") { - descend--; - urlend--; - result.newwin = true; - } - } - - else if (str.charAt(urlend)=="]") { // plain page form - descend = lastbrkt - 1; - pageform = true; - if (lastbrkt > 0 && str.charAt(descend) == "[" && str.charAt(urlend-1) == "]") { - descend--; - urlend--; - result.newwin = true; - } - } - - else if (str.charAt(urlend)=="}") { // page and workspace form - descend = lastbrace - 1; - pageform = true; - wsend = lastbrkt; - urlend--; - if (lastbrkt > 0 && str.charAt(lastbrkt-1) == "[" && str.charAt(urlend-1) == "]") { - wsend = lastbrkt-1; - urlend--; - result.newwin = true; - } - if (str.charAt(wsend-1)==" ") { // trim trailing space in workspace name - wsend--; - } - result.workspace = str.substring(lastbrace+1, wsend) || ""; - } - - if (str.charAt(descend)==" ") { // trim trailing space on desc - descend--; - } - - if (str.charAt(descstart) == '"' && str.charAt(descend) == '"') { - descstart++; - descend--; - } - } - - if (pageform) { - result.pagename = str.substring(lastbrkt+1, urlend) || ""; - } - else { - result.url = str.substring(lastlt+1, urlend) || ""; - } - - if (descend >= descstart) { - result.desc = str.substring(descstart, descend+1); - } - - return result; - - } - - -// -// result = SocialCalc.ConvertSaveToOtherFormat(savestr, outputformat, dorecalc) -// -// Returns a string in the specificed format: "scsave", "html", "csv", "tab" (tab delimited) -// If dorecalc is true, performs a recalc after loading (NO: obsolete!). -// - -SocialCalc.ConvertSaveToOtherFormat = function(savestr, outputformat, dorecalc) { - - var sheet, context, clipextents, div, ele, row, col, cr, cell, str; - - var result = ""; - - if (outputformat == "scsave") { - return savestr; - } - - if (savestr == "") { - return ""; - } - - sheet = new SocialCalc.Sheet(); - sheet.ParseSheetSave(savestr); - - if (dorecalc) { - // no longer supported as of 9/10/08 - // Recalc is now async, so can't do it this way - throw("SocialCalc.ConvertSaveToOtherFormat: Not doing recalc."); - } - - if (sheet.copiedfrom) { - clipextents = SocialCalc.ParseRange(sheet.copiedfrom); - } - else { - clipextents = {cr1: {row: 1, col: 1}, cr2: {row: sheet.attribs.lastrow, col: sheet.attribs.lastcol}}; - } - - if (outputformat == "html") { - context=new SocialCalc.RenderContext(sheet); - if (sheet.copiedfrom) { - context.rowpanes[0] = {first: clipextents.cr1.row, last: clipextents.cr2.row}; - context.colpanes[0] = {first: clipextents.cr1.col, last: clipextents.cr2.col}; - } - div = document.createElement("div"); - ele = context.RenderSheet(null, context.defaultHTMLlinkstyle); - div.appendChild(ele); - delete context; - delete sheet; - result = div.innerHTML; - delete ele; - delete div; - return result; - } - - for (row = clipextents.cr1.row; row <= clipextents.cr2.row; row++) { - for (col = clipextents.cr1.col; col <= clipextents.cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - - if (cell.errors) { - str = cell.errors; - } - else { - str = cell.datavalue+""; // get value as text - } - - if (outputformat == "csv") { - if (str.indexOf('"')!=-1) { - str = str.replace(/"/g, '""'); // double quotes - } - if (/[, \n"]/.test(str)) { - str = '"' + str + '"'; // add quotes - } - if (col>clipextents.cr1.col) { - str = "," + str; // add commas - } - } - else if (outputformat == "tab") { - if (str.indexOf('\n')!=-1) { // if multiple lines - if (str.indexOf('"')!=-1) { - str = str.replace(/"/g, '""'); // double quotes - } - str = '"' + str + '"'; // add quotes - } - if (col>clipextents.cr1.col) { - str = "\t" + str; // add tabs - } - } - result += str; - } - result += "\n"; - } - - return result; - - } - - -// -// result = SocialCalc.ConvertOtherFormatToSave(inputstr, inputformat) -// -// Returns a string converted from the specified format: "scsave", "csv", "tab" (tab delimited) -// - -SocialCalc.ConvertOtherFormatToSave = function(inputstr, inputformat) { - - var sheet, context, lines, i, line, value, inquote, j, ch, values, row, col, cr, maxc; - - var result = ""; - - var AddCell = function() { - col++; - if (col>maxc) maxc = col; - cr = SocialCalc.crToCoord(col, row); - SocialCalc.SetConvertedCell(sheet, cr, value); - value = ""; - } - - if (inputformat == "scsave") { - return inputstr; - } - - sheet = new SocialCalc.Sheet(); - - lines = inputstr.split(/\r\n|\n/); - - maxc = 0; - if (inputformat == "csv") { - row = 0; - inquote = false; - for (i=0; i0) { - sheet.attribs.lastrow = row; - sheet.attribs.lastcol = maxc; - result = sheet.CreateSheetSave("A1:"+SocialCalc.crToCoord(maxc, row)); - } - } - - if (inputformat == "tab") { - row = 0; - inquote = false; - for (i=0; i0) { - sheet.attribs.lastrow = row; - sheet.attribs.lastcol = maxc; - result = sheet.CreateSheetSave("A1:"+SocialCalc.crToCoord(maxc, row)); - } - } - - return result; - - } - -// -// SocialCalc.SetConvertedCell(sheet, cr, rawvalue) -// -// Sets the cell cr with a value and type determined from rawvalue -// - -SocialCalc.SetConvertedCell = function(sheet, cr, rawvalue) { - - var cell, value; - - cell = sheet.GetAssuredCell(cr); - - value = SocialCalc.DetermineValueType(rawvalue); - - if (value.type == 'n' && value.value == rawvalue) { // check that we don't need "constant" to remember original value - cell.datatype = "v"; - cell.valuetype = "n"; - cell.datavalue = value.value; - } - else if (value.type.charAt(0) == 't') { // text of some sort but left unchanged - cell.datatype = "t"; - cell.valuetype = value.type; - cell.datavalue = value.value; - } - else { // special number types - cell.datatype = "c"; - cell.valuetype = value.type; - cell.datavalue = value.value; - cell.formula = rawvalue; - } - - } - diff --git a/DeveloperAdoption/public/socialcalc/socialcalc.css b/DeveloperAdoption/public/socialcalc/socialcalc.css deleted file mode 100644 index e5528a9..0000000 --- a/DeveloperAdoption/public/socialcalc/socialcalc.css +++ /dev/null @@ -1,48 +0,0 @@ -/* -// The optional default CSS style sheet for the SocialCalc package. -// SocialCalc can run without a style sheet (the default) or with one. -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -*/ - -.defaultComment {background-repeat:no-repeat;background-position:top right;background-image:url(images/sc-commentbg.gif);} -.defaultCommentNoGridStyle {} -.defaultHighlightTypeCursor {color:#FFF;background-color:#A6A6A6;} -.defaultHighlightTypeRange {color:#000;background-color:#E5E5E5;} -.defaultColname {font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;} -.defaultSelectedColname {font-size:small;text-align:center;color:#FFFFFF;background-color:#404040;cursor:e-resize;} -.defaultRowname {font-size:small;text-align:right;color:#FFFFFF;background-color:#808080;} -.defaultSelectedRowname {font-size:small;text-align:right;color:#FFFFFF;background-color:#404040;} -.defaultUpperLeft {font-size:small;} -.defaultSkippedCell {font-size:small;background-color:#CCC;} -.defaultPaneDivider {font-size:small;background-color:#ECECEC;padding:0px;} -.cteGriddiv {} -.defaultInputEcho {background-color:#FFD;border:1px solid #884; - font-size:small;padding:2px 10px 1px 2px;cursor:default;} -.TCmain {background-color:#EEE;} -.TCendcap {background-color:#FFF;} -.TCpaneslider {background-color:#CCC;} -.TClessbutton {background-color:#AAA;} -.TCmorebutton {background-color:#AAA;} -.TCscrollarea {background-color:#DDD;} -.TCthumb {background-color:#CCC;} -.TCPStrackingline {overflow:hidden;position:absolute;z-index:100;} -.TCTDFSthumbstatus {height:20px;width:auto;border:1px solid black;padding:2px; - background-color:#FFF;font-size:small;position:absolute;z-index:100;} -.TDpopupElement {border:1px solid black;padding:1px 2px 2px 2px;text-align:center;background-color:#FFF; - font-size:7pt;font-family:Verdana,Arial,Helvetica,sans-serif; - position:absolute;width:auto;z-index:110;} - - diff --git a/DeveloperAdoption/public/socialcalc/socialcalc2demo-0-8-1.html b/DeveloperAdoption/public/socialcalc/socialcalc2demo-0-8-1.html deleted file mode 100644 index e43b9ad..0000000 --- a/DeveloperAdoption/public/socialcalc/socialcalc2demo-0-8-1.html +++ /dev/null @@ -1,813 +0,0 @@ - - - - -SocialCalc 0.8.1 - - - - - - - - - - -
    -
    editor goes here
    -
    -
    - - - - - diff --git a/DeveloperAdoption/public/socialcalc/socialcalc2demo10.html b/DeveloperAdoption/public/socialcalc/socialcalc2demo10.html deleted file mode 100644 index 934544d..0000000 --- a/DeveloperAdoption/public/socialcalc/socialcalc2demo10.html +++ /dev/null @@ -1,786 +0,0 @@ - - - - -SocialCalc 0.7.10 - - - - - - - - - - -
    -
    editor goes here
    -
    -
    - - - - - diff --git a/DeveloperAdoption/public/socialcalc/socialcalcconstants.js b/DeveloperAdoption/public/socialcalc/socialcalcconstants.js deleted file mode 100644 index c66c410..0000000 --- a/DeveloperAdoption/public/socialcalc/socialcalcconstants.js +++ /dev/null @@ -1,828 +0,0 @@ -// -/* -// The module of the SocialCalc package with customizable constants, strings, etc. -// This is where most of the common localizations are done. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - -var SocialCalc; -if (!SocialCalc) SocialCalc = {}; - -// ************************************* -// -// TO LEARN HOW TO LOCALIZE OR CUSTOMIZE SOCIALCALC, PLEASE READ THIS: -// -// The constants are all properties of the SocialCalc.Constants object. -// They are grouped here by what they are for, which module uses them, etc. -// -// Properties whose names start with "s_" are strings, or arrays of strings, -// that are good candidates for translation from the English. -// -// Other properties relate to visual settings, localization parameters, etc. -// -// These values are not used when SocialCalc modules are first loaded. -// They may be modified before the first use of the routines that use them, -// e.g., before creating SocialCalc objects. -// -// The exceptions are: -// TooltipOffsetX and TooltipOffsetY, as described with their definitions. -// -// SocialCalc IS NOT DESIGNED FOR USE WITH A TRANSLATION FUNCTION each time a string -// is used. Instead, language translations may be done by modifying this object. -// -// To customize SocialCalc, you may either replace this file with a modified version -// or you can overwrite the values before use. An example would be to -// iterate over all the properties looking for names that start with "s_" and -// use some other mechanism to obtain a localized string and replace the values -// here with those translated values. -// -// There is also a function, SocialCalc.ConstantsSetClasses, that may be used -// to easily switch SocialCalc from using explicit CSS styles for many things -// to using CSS classes. See the function, below, for more information. -// -// ************************************* - -SocialCalc.Constants = { - -// -// Main SocialCalc module, socialcalc-3.js: -// - - //*** Common Constants - - textdatadefaulttype: "t", // This sets the default type for text on reading source file - // It should normally be "t" - - //*** Common error messages - - s_BrowserNotSupported: "Browser not supported.", // error thrown if browser can't handle events like IE or Firefox. - s_InternalError: "Internal SocialCalc error (probably an internal bug): ", // hopefully unlikely, but a test failed - - //*** SocialCalc.ParseSheetSave - - // Errors thrown on unexpected value in save file: - - s_pssUnknownColType: "Unknown col type item", - s_pssUnknownRowType: "Unknown row type item", - s_pssUnknownLineType: "Unknown line type", - - //*** SocialCalc.CellFromStringParts - - // Error thrown on unexpected value in save file: - - s_cfspUnknownCellType: "Unknown cell type item", - - //*** SocialCalc.CanonicalizeSheet - - doCanonicalizeSheet: true, // if true, do the canonicalization calculations - - //*** ExecuteSheetCommand - - s_escUnknownSheetCmd: "Unknown sheet command: ", - s_escUnknownSetCoordCmd: "Unknown set coord command: ", - s_escUnknownCmd: "Unknown command: ", - - //*** SocialCalc.CheckAndCalcCell - - s_caccCircRef: "Circular reference to ", // circular reference found during recalc - - //*** SocialCalc.RenderContext - - defaultRowNameWidth: "30", // used to set minimum width of the row header column - a string in pixels - defaultAssumedRowHeight: 15, // used when guessing row heights - number - defaultCellIDPrefix: "cell_", // if non-null, each cell will render with an ID starting with this - - // Default sheet display values - - defaultCellLayout: "padding:2px 2px 1px 2px;vertical-align:top;", - defaultCellFontStyle: "normal normal", - defaultCellFontSize: "small", - defaultCellFontFamily: "Verdana,Arial,Helvetica,sans-serif", - - defaultPaneDividerWidth: "2", // a string - defaultPaneDividerHeight: "3", // a string - - defaultGridCSS: "1px solid #D1D5DB;", // used as style to set each border when grid enabled (was #ECECEC) - - defaultCommentClass: "", // class added to cells with non-null comments when grid enabled - defaultCommentStyle: "background-repeat:no-repeat;background-position:top right;background-image:url(images/sc-commentbg.gif);", // style added to cells with non-null comments when grid enabled - defaultCommentNoGridClass: "", // class added to cells with non-null comments when grid not enabled - defaultCommentNoGridStyle: "", // style added to cells with non-null comments when grid not enabled - - defaultColWidth: "80", // text - defaultMinimumColWidth: 10, // numeric - - // For each of the following default sheet display values at least one of class and/or style are needed - - defaultHighlightTypeCursorClass: "", - defaultHighlightTypeCursorStyle: "color:#FFF;backgroundColor:#bdbdbb;", - defaultHighlightTypeRangeClass: "", - defaultHighlightTypeRangeStyle: "color:#000;backgroundColor:#f6f7c1;", - - defaultColnameClass: "", // regular column heading letters, needs a cursor property - defaultColnameStyle: "font-size:small;text-align:center;color:#0a0a0a;background-color:#bebebe;cursor:e-resize;", - defaultSelectedColnameClass: "", // column with selected cell, needs a cursor property - defaultSelectedColnameStyle: "font-size:small;text-align:center;color:#fcfcfc;background-color:#4CAF50;cursor:e-resize;", - defaultRownameClass: "", // regular row heading numbers - defaultRownameStyle: "font-size:small;text-align:right;color:#0a0a0a;background-color:#bebebe;", - defaultSelectedRownameClass: "", // column with selected cell, needs a cursor property - defaultSelectedRownameStyle: "font-size:small;text-align:right;color:#fcfcfc;background-color:#4CAF50;", - defaultUpperLeftClass: "", // Corner cell in upper left - defaultUpperLeftStyle: "font-size:small;", - defaultSkippedCellClass: "", // used if present for spanned cells peeking into a pane (at least one of class/style needed) - defaultSkippedCellStyle: "font-size:small;background-color:#2cc93c", // used if present - defaultPaneDividerClass: "", // used if present for the look of the space between panes (at least one of class/style needed) - defaultPaneDividerStyle: "font-size:small;background-color:#C0C0C0;padding:0px;", // used if present - - s_rcMissingSheet: "Render Context must have a sheet object", // unlikely thrown error - - //*** SocialCalc.format_text_for_display - - defaultLinkFormatString: 'Link', // used for format "text-link"; you could make this an img tag if desired -// defaultLinkFormatString: 'Link out', - defaultPageLinkFormatString: 'Page', // used for format "text-link"; you could make this an img tag if desired - - //*** SocialCalc.format_number_for_display - - defaultFormatdt: 'd-mmm-yyyy h:mm:ss', - defaultFormatd: 'd-mmm-yyyy', - defaultFormatt: '[h]:mm:ss', - defaultDisplayTRUE: 'TRUE', // how TRUE shows when rendered - defaultDisplayFALSE: 'FALSE', - -// -// SocialCalc Table Editor module, socialcalctableeditor.js: -// - - //*** SocialCalc.TableEditor - - defaultImagePrefix: "images/sc-", // URL prefix for images (e.g., "/images/sc") - defaultTableEditorIDPrefix: "te_", // if present, many TableEditor elements are assigned IDs with this prefix - defaultPageUpDnAmount: 15, // number of rows to move cursor on PgUp/PgDn keys (numeric) - - AllowCtrlS: true, // turns on Ctrl-S trapdoor for setting custom numeric formats and commands if true - - //*** SocialCalc.CreateTableEditor - - defaultTableControlThickness: 20, // the short size for the scrollbars, etc. (numeric in pixels) - cteGriddivClass: "", // if present, the class for the TableEditor griddiv element - - //** SocialCalc.EditorGetStatuslineString -- strings shown on status line - - s_statusline_executing: "Executing...", - s_statusline_displaying: "Displaying...", - s_statusline_ordering: "Ordering...", - s_statusline_calculating: "Calculating...", - s_statusline_calculatingls: "Calculating... Loading Sheet...", - s_statusline_doingserverfunc: "doing server function ", - s_statusline_incell: " in cell ", - s_statusline_calcstart: "Calculation start...", - s_statusline_sum: "SUM", - s_statusline_recalcneeded: '(Recalc needed)', - s_statusline_circref: 'Circular reference: ', - - //** SocialCalc.InputBoxDisplayCellContents - - s_inputboxdisplaymultilinetext: "[Multi-line text: Click icon on right to edit]", - - //** SocialCalc.InputEcho - - defaultInputEchoClass: "", // if present, the class of the popup inputEcho div - defaultInputEchoStyle: "filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;border:1px solid #884;"+ - "fontSize:small;padding:2px 10px 1px 2px;cursor:default;", // if present, pseudo style - defaultInputEchoPromptClass: "", // if present, the class of the popup inputEcho div - defaultInputEchoPromptStyle: "filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;"+ - "borderLeft:1px solid #884;borderRight:1px solid #884;borderBottom:1px solid #884;"+ - "fontSize:small;fontStyle:italic;padding:2px 10px 1px 2px;cursor:default;", // if present, pseudo style - - //** SocialCalc.InputEchoText - - ietUnknownFunction: "Unknown function ", // displayed when typing "=unknown(" - - //** SocialCalc.CellHandles - - CH_radius1: 29.0, // extent of inner circle within 90px image - CH_radius2: 41.0, // extent of outer circle within 90px image - s_CHfillAllTooltip: "Fill Contents and Formats Down/Right", // tooltip for fill all handle - s_CHfillContentsTooltip: "Fill Contents Only Down/Right", // tooltip for fill formulas handle - s_CHmovePasteAllTooltip: "Move Contents and Formats", // etc. - s_CHmovePasteContentsTooltip: "Move Contents Only", - s_CHmoveInsertAllTooltip: "Slide Contents and Formats within Row/Col", - s_CHmoveInsertContentsTooltip: "Slide Contents within Row/Col", - s_CHindicatorOperationLookup: {"Fill": "Fill", "FillC": "Fill Contents", - "Move": "Move", "MoveI": "Slide", - "MoveC": "Move Contents", "MoveIC": "Slide Contents"}, // short form of operation to follow drag - s_CHindicatorDirectionLookup: {"Down": " Down", "Right": " Right", - "Horizontal": " Horizontal", "Vertical": " Vertical"}, // direction that modifies operation during drag - - //*** SocialCalc.TableControl - - defaultTCSliderThickness: 9, // length of pane slider (numeric in pixels) - defaultTCButtonThickness: 20, // length of scroll +/- buttons (numeric in pixels) - defaultTCThumbThickness: 15, // length of thumb (numeric in pixels) - - //*** SocialCalc.CreateTableControl - - TCmainStyle: "backgroundColor:#EEE;", // if present, pseudo style (text-align is textAlign) for main div of a table control - TCmainClass: "", // if present, the CSS class of the main div for a table control - TCendcapStyle: "backgroundColor:#FFF;", // backgroundColor may be used while waiting for image that may not come - TCendcapClass: "", - TCpanesliderStyle: "backgroundColor:#CCC;", - TCpanesliderClass: "", - s_panesliderTooltiph: "Drag to lock pane vertically", // tooltip for horizontal table control pane slider - s_panesliderTooltipv: "Drag to lock pane horizontally", - TClessbuttonStyle: "backgroundColor:#AAA;", - TClessbuttonClass: "", - TClessbuttonRepeatWait: 300, // in milliseconds - TClessbuttonRepeatInterval: 20,//100, // in milliseconds - TCmorebuttonStyle: "backgroundColor:#AAA;", - TCmorebuttonClass: "", - TCmorebuttonRepeatWait: 300, // in milliseconds - TCmorebuttonRepeatInterval: 20,//100, // in milliseconds - TCscrollareaStyle: "backgroundColor:#DDD;", - TCscrollareaClass: "", - TCscrollareaRepeatWait: 500, // in milliseconds - TCscrollareaRepeatInterval: 100, // in milliseconds - TCthumbClass: "", - TCthumbStyle: "backgroundColor:#CCC;", - - //*** SocialCalc.TCPSDragFunctionStart - - TCPStrackinglineClass: "", // at least one of class/style for pane slider tracking line display in table control - TCPStrackinglineStyle: "overflow:hidden;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCPStrackinglineThickness: "2px", // narrow dimension of trackling line (string with units) - - - //*** SocialCalc.TCTDragFunctionStart - - TCTDFSthumbstatusvClass: "", // at least one of class/style for vertical thumb dragging status display in table control - TCTDFSthumbstatusvStyle: "height:20px;width:auto;border:3px solid #808080;overflow:hidden;"+ - "backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCTDFSthumbstatushClass: "", // at least one of class/style for horizontal thumb dragging status display in table control - TCTDFSthumbstatushStyle: "height:20px;width:auto;border:1px solid black;padding:2px;"+ - "backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCTDFSthumbstatusrownumClass: "", // at least one of class/style for thumb dragging status display in table control - TCTDFSthumbstatusrownumStyle: "color:#FFF;background-color:#808080;font-size:small;white-space:nowrap;padding:3px;", // if present, real style - TCTDFStopOffsetv: 0, // offsets for thumbstatus display while dragging - TCTDFSleftOffsetv: -80, - s_TCTDFthumbstatusPrefixv: "Row ", // Text Control Drag Function text before row number - TCTDFStopOffseth: -30, - TCTDFSleftOffseth: 0, - s_TCTDFthumbstatusPrefixh: "Col ", // Text Control Drag Function text before col number - - //*** SocialCalc.TooltipInfo - - // Note: These two values are used to set the TooltipInfo initial values when the code is first read in. - // Modifying them here after loading has no effect -- you need to modify SocialCalc.TooltipInfo directly - // to dynamically set them. This is different than most other constants which may be modified until use. - - TooltipOffsetX: 2, // offset in pixels from mouse position (to right on left side of screen, to left on right) - TooltipOffsetY: 10, // offset in pixels above mouse position for lower edge - - //*** SocialCalc.TooltipDisplay - - TDpopupElementClass: "", // at least one of class/style for tooltip display - TDpopupElementStyle: "border:1px solid black;padding:1px 2px 2px 2px;textAlign:center;backgroundColor:#FFF;"+ - "fontSize:7pt;fontFamily:Verdana,Arial,Helvetica,sans-serif;"+ - "position:absolute;width:auto;zIndex:110;", - // if present, pseudo style (text-align is textAlign) - - -// -// SocialCalc Spreadsheet Control module, socialcalcspreadsheetcontrol.js: -// - - //*** SocialCalc.SpreadsheetControl - - SCToolbarbackground: "background-color:#2B579A;", - SCTabbackground: "background-color:#2B579A;", - SCTabselectedCSS: "font-size:small;padding:6px 30px 6px 8px;color:#0a0a0a;background-color:#e0dfdf;cursor:default;border-right:1px solid #CCC;", - SCTabplainCSS: "font-size:small;padding:6px 30px 6px 8px;color:#ECF0F1;background-color:#2B579A;cursor:default;border-right:1px solid #8f8f8d;", - SCToolbartext: "font-size:x-small;font-weight:bold;color:#2C3E50;padding-bottom:4px;", - - SCFormulabarheight: 30, // in pixels, will contain a text input box - - SCStatuslineheight: 20, // in pixels - SCStatuslineCSS: "font-size:10px;padding:3px 0px;", - - - // workbook - doWorkBook: true, - SCSheetBarHeight: 25, - SCSheetBarBackground: "background-color:#0a0a0a;", - SCSheetBarCSS: "background-color:#CCC;", - SCSheetBarWidth: "70%", - - // Constants for default Format tab (settings) - // - // *** EVEN THOUGH THESE DON'T START WITH s_: *** - // - // These should be carefully checked for localization. Make sure you understand what they do and how they work! - // The first part of "first:second|first:second|..." is what is displayed and the second is the value to be used. - // The value is normally not translated -- only the displayed part. The [cancel], [break], etc., are not translated -- - // they are commands to SocialCalc.SettingsControls.PopupListInitialize - - SCFormatNumberFormats: "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Auto w/ commas!:[,]General|[break]:|"+ - "00:00|000:000|0000:0000|00000:00000|[break]:|%loc!Formula!:formula|%loc!Hidden!:hidden|[newcol]:"+ - "1234:0|1,234:#,##0|1,234.5:#,##0.0|1,234.56:#,##0.00|1,234.567:#,##0.000|1,234.5678:#,##0.0000|"+ - "[break]:|1,234%:#,##0%|1,234.5%:#,##0.0%|1,234.56%:#,##0.00%|"+ - "[newcol]:|$1,234:$#,##0|$1,234.5:$#,##0.0|$1,234.56:$#,##0.00|[break]:|"+ - "(1,234):#,##0_);(#,##0)|(1,234.5):#,##0.0_);(#,##0.0)|(1,234.56):#,##0.00_);(#,##0.00)|[break]:|"+ - "($1,234):#,##0_);($#,##0)|($1,234.5):$#,##0.0_);($#,##0.0)|($1,234.56):$#,##0.00_);($#,##0.00)|"+ - "[newcol]:|1/4/06:m/d/yy|01/04/2006:mm/dd/yyyy|2006-01-04:yyyy-mm-dd|4-Jan-06:d-mmm-yy|04-Jan-2006:dd-mmm-yyyy|January 4, 2006:mmmm d, yyyy|"+ - "[break]:|1\\c23:h:mm|1\\c23 PM:h:mm AM/PM|1\\c23\\c45:h:mm:ss|01\\c23\\c45:hh:mm:ss|26\\c23 (h\\cm):[hh]:mm|69\\c45 (m\\cs):[mm]:ss|69 (s):[ss]|"+ - "[newcol]:|2006-01-04 01\\c23\\c45:yyyy-mm-dd hh:mm:ss|January 4, 2006:mmmm d, yyyy hh:mm:ss|Wed:ddd|Wednesday:dddd|", - SCFormatTextFormats: "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Plain Text!:text-plain|"+ - "HTML:text-html|%loc!Wikitext!:text-wiki|%loc!Link!:text-link|%loc!Formula!:formula|%loc!Hidden!:hidden|", - SCFormatPadsizes: "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!No padding!:0px|"+ - "[newcol]:|1 pixel:1px|2 pixels:2px|3 pixels:3px|4 pixels:4px|5 pixels:5px|"+ - "6 pixels:6px|7 pixels:7px|8 pixels:8px|[newcol]:|9 pixels:9px|10 pixels:10px|11 pixels:11px|"+ - "12 pixels:12px|13 pixels:13px|14 pixels:14px|16 pixels:16px|"+ - "18 pixels:18px|[newcol]:|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|", - SCFormatFontsizes: "[cancel]:|[break]:|%loc!Default!:|[custom]:|X-Small:x-small|Small:small|Medium:medium|Large:large|X-Large:x-large|"+ - "[newcol]:|6pt:6pt|7pt:7pt|8pt:8pt|9pt:9pt|10pt:10pt|11pt:11pt|12pt:12pt|14pt:14pt|16pt:16pt|"+ - "[newcol]:|18pt:18pt|20pt:20pt|22pt:22pt|24pt:24pt|28pt:28pt|36pt:36pt|48pt:48pt|72pt:72pt|"+ - "[newcol]:|8 pixels:8px|9 pixels:9px|10 pixels:10px|11 pixels:11px|"+ - "12 pixels:12px|13 pixels:13px|14 pixels:14px|[newcol]:|16 pixels:16px|"+ - "18 pixels:18px|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|", - SCFormatFontfamilies: "[cancel]:|[break]:|%loc!Default!:|[custom]:|Verdana:Verdana,Arial,Helvetica,sans-serif|"+ - "Arial:arial,helvetica,sans-serif|Courier:'Courier New',Courier,monospace|", - SCFormatFontlook: "[cancel]:|[break]:|%loc!Default!:|%loc!Normal!:normal normal|%loc!Bold!:normal bold|%loc!Italic!:italic normal|"+ - "%loc!Bold Italic!:italic bold", - SCFormatTextAlignhoriz: "[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|", - SCFormatNumberAlignhoriz: "[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|", - SCFormatAlignVertical: "[cancel]:|[break]:|%loc!Default!:|%loc!Top!:top|%loc!Middle!:middle|%loc!Bottom!:bottom|", - SCFormatColwidth: "[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|"+ - "20 pixels:20|40:40|60:60|80:80|100:100|120:120|140:140|160:160|"+ - "[newcol]:|180 pixels:180|200:200|220:220|240:240|260:260|280:280|300:300|", - SCFormatRecalc: "[cancel]:|[break]:|%loc!Auto!:|%loc!Manual!:off|", - SCFormatEditable: "[cancel]:|[break]:|%loc!unset!:|%loc!Yes!:yes|%loc!No!:no|", - SCFormatConstraints: "[cancel]:|[break]:|%loc!None!:|%loc!Checkbox!:checkbox|%loc!Date!:date|%loc!Phone!:phone|", - - //*** SocialCalc.InitializeSpreadsheetControl - - ISCButtonBorderNormal: "#404040", - ISCButtonBorderHover: "#999", - ISCButtonBorderDown: "#FFF", - ISCButtonDownBackground: "#888", - - //*** SocialCalc.SettingsControls.PopupListInitialize - - s_PopupListCancel: "[Cancel]", - s_PopupListCustom: "Custom", - - // *** - // - // s_loc_ constants accessed by SocialCalc.LocalizeString and SocialCalc.LocalizeSubstrings - // - // Used extensively by socialcalcspreadsheetcontrol.js - // - // *** - - s_loc_align_center: "Align Center", - s_loc_align_left: "Align Left", - s_loc_align_right: "Align Right", - s_loc_alignment: "Alignment", - s_loc_audit: "Audit", - s_loc_audit_trail_this_session: "Audit Trail This Session", - s_loc_auto: "Auto", - s_loc_auto_sum: "Auto Sum", - s_loc_auto_wX_commas: "Auto w/ commas", - s_loc_automatic: "Automatic", - s_loc_background: "Background", - s_loc_bold: "Bold", - s_loc_bold_XampX_italics: "Bold & Italics", - s_loc_bold_italic: "Bold Italic", - s_loc_borders: "Borders", - s_loc_borders_off: "Borders Off", - s_loc_borders_on: "Borders On", - s_loc_bottom: "Bottom", - s_loc_bottom_border: "Bottom Border", - s_loc_cell_settings: "CELL SETTINGS", - s_loc_csv_format: "CSV format", - s_loc_cancel: "Cancel", - s_loc_category: "Category", - s_loc_center: "Center", - s_loc_clear: "Clear", - s_loc_clear_socialcalc_clipboard: "Clear SocialCalc Clipboard", - s_loc_clipboard: "Clipboard", - s_loc_color: "Color", - s_loc_column_: "Column ", - s_loc_comment: "Comment", - s_loc_copy: "Copy", - s_loc_custom: "Custom", - s_loc_cut: "Cut", - s_loc_default: "Default", - s_loc_default_alignment: "Default Alignment", - s_loc_default_column_width: "Default Column Width", - s_loc_default_font: "Default Font", - s_loc_default_format: "Default Format", - s_loc_default_padding: "Default Padding", - s_loc_delete: "Delete", - s_loc_delete_column: "Delete Column", - s_loc_delete_contents: "Delete Contents", - s_loc_delete_row: "Delete Row", - s_loc_description: "Description", - s_loc_display_clipboard_in: "Display Clipboard in", - s_loc_down: "Down", - s_loc_edit: "Edit", - s_loc_existing_names: "Existing Names", - s_loc_family: "Family", - s_loc_fill_down: "Fill Down", - s_loc_fill_right: "Fill Right", - s_loc_font: "Font", - s_loc_format: "Format", - s_loc_formula: "Formula", - s_loc_function_list: "Function List", - s_loc_functions: "Functions", - s_loc_grid: "Grid", - s_loc_hidden: "Hidden", - s_loc_horizontal: "Horizontal", - s_loc_insert_column: "Insert Column", - s_loc_insert_row: "Insert Row", - s_loc_italic: "Italic", - s_loc_last_sort: "Last Sort", - s_loc_left: "Left", - s_loc_left_border: "Left Border", - s_loc_link: "Link", - s_loc_link_input_box: "Link Input Box", - s_loc_list: "List", - s_loc_load_socialcalc_clipboard_with_this: "Load SocialCalc Clipboard With This", - s_loc_major_sort: "Major Sort", - s_loc_manual: "Manual", - s_loc_merge_cells: "Merge Cells", - s_loc_middle: "Middle", - s_loc_minor_sort: "Minor Sort", - s_loc_move_insert: "Move Insert", - s_loc_move_paste: "Move Paste", - s_loc_multiXline_input_box: "Multi-line Input Box", - s_loc_name: "Name", - s_loc_names: "Names", - s_loc_no_padding: "No padding", - s_loc_normal: "Normal", - s_loc_number: "Number", - s_loc_number_horizontal: "Number Horizontal", - s_loc_ok: "OK", - s_loc_padding: "Padding", - s_loc_page_name: "Page Name", - s_loc_paste: "Paste", - s_loc_paste_formats: "Paste Formats", - s_loc_plain_text: "Plain Text", - s_loc_recalc: "Recalc", - s_loc_recalculation: "Recalculation", - s_loc_redo: "Redo", - s_loc_right: "Right", - s_loc_right_border: "Right Border", - s_loc_sheet_settings: "SHEET SETTINGS", - s_loc_save: "Save", - s_loc_save_to: "Save to", - s_loc_set_cell_contents: "Set Cell Contents", - s_loc_set_cells_to_sort: "Set Cells To Sort", - s_loc_set_value_to: "Set Value To", - s_loc_set_to_link_format: "Set to Link format", - s_loc_setXclear_move_from: "Set/Clear Move From", - s_loc_show_cell_settings: "Show Cell Settings", - s_loc_show_sheet_settings: "Show Sheet Settings", - s_loc_show_in_new_browser_window: "Show in new browser window", - s_loc_size: "Size", - s_loc_socialcalcXsave_format: "SocialCalc-save format", - s_loc_sort: "Sort", - s_loc_sort_: "Sort ", - s_loc_sort_cells: "Sort Cells", - s_loc_swap_colors: "Swap Colors", - s_loc_tabXdelimited_format: "Tab-delimited format", - s_loc_text: "Text", - s_loc_text_horizontal: "Text Horizontal", - s_loc_this_is_aXbrXsample: "This is a
    sample", - s_loc_top: "Top", - s_loc_top_border: "Top Border", - s_loc_undone_steps: "UNDONE STEPS", - s_loc_url: "URL", - s_loc_undo: "Undo", - s_loc_unmerge_cells: "Unmerge Cells", - s_loc_up: "Up", - s_loc_value: "Value", - s_loc_vertical: "Vertical", - s_loc_wikitext: "Wikitext", - s_loc_workspace: "Workspace", - s_loc_XnewX: "[New]", - s_loc_XnoneX: "[None]", - s_loc_Xselect_rangeX: "[select range]", - -// -// SocialCalc Spreadsheet Viewer module, socialcalcviewer.js: -// - - //*** SocialCalc.SpreadsheetViewer - - SVStatuslineheight: 20, // in pixels - SVStatuslineCSS: "font-size:10px;padding:3px 0px;", - -// -// SocialCalc Format Number module, formatnumber2.js: -// - - FormatNumber_separatorchar: ",", // the thousands separator character when formatting numbers for display - FormatNumber_decimalchar: ".", // the decimal separator character when formatting numbers for display - FormatNumber_defaultCurrency: "$", // the currency string used if none specified - - // The following constants are arrays of strings with the short (3 character) and full names of days and months - - s_FormatNumber_daynames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - s_FormatNumber_daynames3: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - s_FormatNumber_monthnames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", - "October", "November", "December"], - s_FormatNumber_monthnames3: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - s_FormatNumber_am: "AM", - s_FormatNumber_am1: "A", - s_FormatNumber_pm: "PM", - s_FormatNumber_pm1: "P", - -// -// SocialCalc Spreadsheet Formula module, formula1.js: -// - - s_parseerrexponent: "Improperly formed number exponent", - s_parseerrchar: "Unexpected character in formula", - s_parseerrstring: "Improperly formed string", - s_parseerrspecialvalue: "Improperly formed special value", - s_parseerrtwoops: "Error in formula (two operators inappropriately in a row)", - s_parseerrmissingopenparen: "Missing open parenthesis in list with comma(s). ", - s_parseerrcloseparennoopen: "Closing parenthesis without open parenthesis. ", - s_parseerrmissingcloseparen: "Missing close parenthesis. ", - s_parseerrmissingoperand: "Missing operand. ", - s_parseerrerrorinformula: "Error in formula.", - s_calcerrerrorvalueinformula: "Error value in formula", - s_parseerrerrorinformulabadval: "Error in formula resulting in bad value", - s_formularangeresult: "Formula results in range value:", - s_calcerrnumericnan: "Formula results in an bad numeric value", - s_calcerrnumericoverflow: "Numeric overflow", - s_sheetunavailable: "Sheet unavailable:", // when FindSheetInCache returns null - s_calcerrcellrefmissing: "Cell reference missing when expected.", - s_calcerrsheetnamemissing: "Sheet name missing when expected.", - s_circularnameref: "Circular name reference to name", - s_calcerrunknownname: "Unknown name", - s_calcerrincorrectargstofunction: "Incorrect arguments to function", - s_sheetfuncunknownfunction: "Unknown function", - s_sheetfunclnarg: "LN argument must be greater than 0", - s_sheetfunclog10arg: "LOG10 argument must be greater than 0", - s_sheetfunclogsecondarg: "LOG second argument must be numeric greater than 0", - s_sheetfunclogfirstarg: "LOG first argument must be greater than 0", - s_sheetfuncroundsecondarg: "ROUND second argument must be numeric", - s_sheetfuncddblife: "DDB life must be greater than 1", - s_sheetfuncslnlife: "SLN life must be greater than 1", - - // Function definition text - - s_fdef_ABS: 'Absolute value function. ', - s_fdef_ACOS: 'Trigonometric arccosine function. ', - s_fdef_AND: 'True if all arguments are true. ', - s_fdef_ASIN: 'Trigonometric arcsine function. ', - s_fdef_ATAN: 'Trigonometric arctan function. ', - s_fdef_ATAN2: 'Trigonometric arc tangent function (result is in radians). ', - s_fdef_AVERAGE: 'Averages the values. ', - s_fdef_CHOOSE: 'Returns the value specified by the index. The values may be ranges of cells. ', - s_fdef_COLUMNS: 'Returns the number of columns in the range. ', - s_fdef_COS: 'Trigonometric cosine function (value is in radians). ', - s_fdef_COUNT: 'Counts the number of numeric values, not blank, text, or error. ', - s_fdef_COUNTA: 'Counts the number of non-blank values. ', - s_fdef_COUNTBLANK: 'Counts the number of blank values. (Note: "" is not blank.) ', - s_fdef_COUNTIF: '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). ', - s_fdef_DATE: '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. ', - s_fdef_DAVERAGE: 'Averages the values in the specified field in records that meet the criteria. ', - s_fdef_DAY: 'Returns the day of month for a date value. ', - s_fdef_DCOUNT: 'Counts the number of numeric values, not blank, text, or error, in the specified field in records that meet the criteria. ', - s_fdef_DCOUNTA: 'Counts the number of non-blank values in the specified field in records that meet the criteria. ', - s_fdef_DDB: 'Returns the amount of depreciation at the given period of time (the default factor is 2 for double-declining balance). ', - s_fdef_DEGREES: 'Converts value in radians into degrees. ', - s_fdef_DGET: 'Returns the value of the specified field in the single record that meets the criteria. ', - s_fdef_DMAX: 'Returns the maximum of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DMIN: 'Returns the maximum of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DPRODUCT: 'Returns the result of multiplying the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DSTDEV: 'Returns the sample standard deviation of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DSTDEVP: 'Returns the standard deviation of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DSUM: 'Returns the sum of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DVAR: 'Returns the sample variance of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DVARP: 'Returns the variance of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_EVEN: 'Rounds the value up in magnitude to the nearest even integer. ', - s_fdef_EXACT: 'Returns "true" if the values are exactly the same, including case, type, etc. ', - s_fdef_EXP: 'Returns e raised to the value power. ', - s_fdef_FACT: 'Returns factorial of the value. ', - s_fdef_FALSE: 'Returns the logical value "false". ', - s_fdef_FIND: 'Returns the starting position within string2 of the first occurrence of string1 at or after "start". If start is omitted, 1 is assumed. ', - s_fdef_FV: '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). ', - s_fdef_HLOOKUP: '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. ', - s_fdef_HOUR: 'Returns the hour portion of a time or date/time value. ', - s_fdef_IF: 'Results in true-value if logical-expression is TRUE or non-zero, otherwise results in false-value. ', - s_fdef_INDEX: '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)). ', - s_fdef_INT: 'Returns the value rounded down to the nearest integer (towards -infinity). ', - s_fdef_IRR: '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%). ', - s_fdef_ISBLANK: 'Returns "true" if the value is a reference to a blank cell. ', - s_fdef_ISERR: 'Returns "true" if the value is of type "Error" but not "NA". ', - s_fdef_ISERROR: 'Returns "true" if the value is of type "Error". ', - s_fdef_ISLOGICAL: 'Returns "true" if the value is of type "Logical" (true/false). ', - s_fdef_ISNA: 'Returns "true" if the value is the error type "NA". ', - s_fdef_ISNONTEXT: 'Returns "true" if the value is not of type "Text". ', - s_fdef_ISNUMBER: 'Returns "true" if the value is of type "Number" (including logical values). ', - s_fdef_ISTEXT: 'Returns "true" if the value is of type "Text". ', - s_fdef_LEFT: 'Returns the specified number of characters from the text value. If count is omitted, 1 is assumed. ', - s_fdef_LEN: 'Returns the number of characters in the text value. ', - s_fdef_LN: 'Returns the natural logarithm of the value. ', - s_fdef_LOG: 'Returns the logarithm of the value using the specified base. ', - s_fdef_LOG10: 'Returns the base 10 logarithm of the value. ', - s_fdef_LOWER: 'Returns the text value with all uppercase characters converted to lowercase. ', - s_fdef_MATCH: '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. ', - s_fdef_MAX: 'Returns the maximum of the numeric values. ', - s_fdef_MID: 'Returns the specified number of characters from the text value starting from the specified position. ', - s_fdef_MIN: 'Returns the minimum of the numeric values. ', - s_fdef_MINUTE: 'Returns the minute portion of a time or date/time value. ', - s_fdef_MOD: 'Returns the remainder of the first value divided by the second. ', - s_fdef_MONTH: 'Returns the month part of a date value. ', - s_fdef_N: 'Returns the value if it is a numeric value otherwise an error. ', - s_fdef_NA: 'Returns the #N/A error value which propagates through most operations. ', - s_fdef_NOT: 'Returns FALSE if value is true, and TRUE if it is false. ', - s_fdef_NOW: 'Returns the current date/time. ', - s_fdef_NPER: '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. ', - s_fdef_NPV: '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. ', - s_fdef_ODD: 'Rounds the value up in magnitude to the nearest odd integer. ', - s_fdef_OR: 'True if any argument is true ', - s_fdef_PI: 'The value 3.1415926... ', - s_fdef_PMT: '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). ', - s_fdef_POWER: 'Returns the first value raised to the second value power. ', - s_fdef_PRODUCT: 'Returns the result of multiplying the numeric values. ', - s_fdef_PROPER: 'Returns the text value with the first letter of each word converted to uppercase and the others to lowercase. ', - s_fdef_PV: '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). ', - s_fdef_RADIANS: 'Converts value in degrees into radians. ', - s_fdef_RATE: '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%). ', - s_fdef_REPLACE: 'Returns text1 with the specified number of characters starting from the specified position replaced by text2. ', - s_fdef_REPT: 'Returns the text repeated the specified number of times. ', - s_fdef_RIGHT: 'Returns the specified number of characters from the text value starting from the end. If count is omitted, 1 is assumed. ', - s_fdef_ROUND: '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). ', - s_fdef_ROWS: 'Returns the number of rows in the range. ', - s_fdef_SECOND: 'Returns the second portion of a time or date/time value (truncated to an integer). ', - s_fdef_SIN: 'Trigonometric sine function (value is in radians) ', - s_fdef_SLN: 'Returns the amount of depreciation at each period of time using the straight-line method. ', - s_fdef_SQRT: 'Square root of the value ', - s_fdef_STDEV: 'Returns the sample standard deviation of the numeric values. ', - s_fdef_STDEVP: 'Returns the standard deviation of the numeric values. ', - s_fdef_SUBSTITUTE: 'Returns text1 with the all occurrences of oldtext replaced by newtext. If "occurrence" is present, then only that occurrence is replaced. ', - s_fdef_SUM: 'Adds the numeric values. The values to the sum function may be ranges in the form similar to A1:B5. ', - s_fdef_SUMIF: '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. ', - s_fdef_SYD: 'Depreciation by Sum of Year\'s Digits method. ', - s_fdef_T: 'Returns the text value or else a null string. ', - s_fdef_TAN: 'Trigonometric tangent function (value is in radians) ', - s_fdef_TIME: 'Returns the time value given the specified hour, minute, and second. ', - s_fdef_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. ', - s_fdef_TRIM: 'Returns the text value with leading, trailing, and repeated spaces removed. ', - s_fdef_TRUE: 'Returns the logical value "true". ', - s_fdef_TRUNC: 'Truncates the value to the specified number of decimal places. If precision is negative, truncate to powers of 10. ', - s_fdef_UPPER: 'Returns the text value with all lowercase characters converted to uppercase. ', - s_fdef_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. ', - s_fdef_VAR: 'Returns the sample variance of the numeric values. ', - s_fdef_VARP: 'Returns the variance of the numeric values. ', - s_fdef_VLOOKUP: '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. ', - s_fdef_WEEKDAY: '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. ', - s_fdef_YEAR: 'Returns the year part of a date value. ', - - s_farg_v: "value", - s_farg_vn: "value1, value2, ...", - s_farg_xy: "valueX, valueY", - s_farg_choose: "index, value1, value2, ...", - s_farg_range: "range", - s_farg_rangec: "range, criteria", - s_farg_date: "year, month, day", - s_farg_dfunc: "databaserange, fieldname, criteriarange", - s_farg_ddb: "cost, salvage, lifetime, period [, factor]", - s_farg_find: "string1, string2 [, start]", - s_farg_fv: "rate, n, payment, [pv, [paytype]]", - s_farg_hlookup: "value, range, row, [rangelookup]", - s_farg_iffunc: "logical-expression, true-value, false-value", - s_farg_index: "range, rownum, colnum", - s_farg_irr: "range, [guess]", - s_farg_tc: "text, count", - s_farg_log: "value, base", - s_farg_match: "value, range, [rangelookup]", - s_farg_mid: "text, start, length", - s_farg_nper: "rate, payment, pv, [fv, [paytype]]", - s_farg_npv: "rate, value1, value2, ...", - s_farg_pmt: "rate, n, pv, [fv, [paytype]]", - s_farg_pv: "rate, n, payment, [fv, [paytype]]", - s_farg_rate: "n, payment, pv, [fv, [paytype, [guess]]]", - s_farg_replace: "text1, start, length, text2", - s_farg_vp: "value, [precision]", - s_farg_valpre: "value, precision", - s_farg_csl: "cost, salvage, lifetime", - s_farg_cslp: "cost, salvage, lifetime, period", - s_farg_subs: "text1, oldtext, newtext [, occurrence]", - s_farg_sumif: "range1, criteria [, range2]", - s_farg_hms: "hour, minute, second", - s_farg_txt: "text", - s_farg_vlookup: "value, range, col, [rangelookup]", - s_farg_weekday: "date, [type]", - s_farg_dt: "date", - - function_classlist: ["all", "stat", "lookup", "datetime", "financial", "test", "math", "text"], // order of function classes - - s_fclass_all: "All", - s_fclass_stat: "Statistics", - s_fclass_lookup: "Lookup", - s_fclass_datetime: "Date & Time", - s_fclass_financial: "Financial", - s_fclass_test: "Test", - s_fclass_math: "Math", - s_fclass_text: "Text", - - lastone: null - - }; - -// Default classnames for use with SocialCalc.ConstantsSetClasses: - -SocialCalc.ConstantsDefaultClasses = { - defaultComment: "", - defaultCommentNoGrid: "", - defaultHighlightTypeCursor: "", - defaultHighlightTypeRange: "", - defaultColname: "", - defaultSelectedColname: "", - defaultRowname: "", - defaultSelectedRowname: "", - defaultUpperLeft: "", - defaultSkippedCell: "", - defaultPaneDivider: "", - cteGriddiv: "", // this one has no Style version with it - defaultInputEcho: {classname: "", style: "filter:alpha(opacity=90);opacity:.9;"}, // so FireFox won't show warning - TCmain: "", - TCendcap: "", - TCpaneslider: "", - TClessbutton: "", - TCmorebutton: "", - TCscrollarea: "", - TCthumb: "", - TCPStrackingline: "", - TCTDFSthumbstatus: "", - TDpopupElement: "" - }; - -// -// SocialCalc.ConstantsSetClasses(prefix) -// -// This routine goes through all of the xyzClass/xyzStyle pairs and sets the Class to a default and -// turns off the Style, if present. The prefix is put before each default. -// The list of items to set is in SocialCalc.ConstantsDefaultClasses. The names there -// correspond to the "xyz" parts. If there is a value, it is the default to set. If the -// default is a null, no change is made. If the default is the null string (""), the -// name of the item is used (e.g., "defaultComment" would use the classname "defaultComment"). -// If the default is an object, then it expects {classname: classname, style: stylestring} - this -// lets you combine both. -// - -SocialCalc.ConstantsSetClasses = function(prefix) { - - var defaults = SocialCalc.ConstantsDefaultClasses; - var scc = SocialCalc.Constants; - var item; - - prefix = prefix || ""; - - for (item in defaults) { - if (typeof defaults[item] == "string") { - scc[item+"Class"] = prefix + (defaults[item] || item); - if (scc[item+"Style"] !== undefined) { - scc[item+"Style"] = ""; - } - } - else if (typeof defaults[item] == "object") { - scc[item+"Class"] = prefix + (defaults[item].classname || item); - scc[item+"Style"] = defaults[item].style; - } - } - } - diff --git a/DeveloperAdoption/public/socialcalc/socialcalcpopup.js b/DeveloperAdoption/public/socialcalc/socialcalcpopup.js deleted file mode 100644 index e527536..0000000 --- a/DeveloperAdoption/public/socialcalc/socialcalcpopup.js +++ /dev/null @@ -1,1618 +0,0 @@ -// -/* -// The module of the SocialCalc package for the optional popup menus in socialcalcspreadsheetcontrol.js -// -// (c) Copyright 2009 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// -*/ - - var SocialCalc; // All values are stored in the master SocialCalc object - if (!SocialCalc) { - SocialCalc = {}; - } - - // The main Popup data -- there is only one set - - SocialCalc.Popup = {}; - - // Routines and values for each type of control, indexed by type name - // The value for each is an object constructed as follows: - // - // Create = function(type, id, attribs) - // Initialize = function(type, id, data) - // SetValue = function(type, id, value) - // GetValue = function(type, id) returns value - // SetDisabled = function(type, id, t/f) - // Show = function(type, id) - // Hide = function(type, id) - // Cancel = function(type, id) - // Reset = function(type) - // - // data = object to hold type-specific data - // - - SocialCalc.Popup.Types = {}; - - // Definitions for each individual control, indexed by id - // The value for each is an object constructed as follows: - // - // type: type name of the control - // value: current value of the control (usually a string, but can depend on type) - // data: object with type-specific items - // - - SocialCalc.Popup.Controls = {}; - - // System-wide values of currently active control - // - // id: id of current control or null - // - - SocialCalc.Popup.Current = {}; - - // Other values used by the Popup system - // - - SocialCalc.Popup.imagePrefix = "images/sc-"; // image prefix - - // Override this for localization - - SocialCalc.Popup.LocalizeString = function(str) {return str;}; - - -// * * * * * * * * * * * * * * * * -// -// GENERAL ROUTINES -// -// * * * * * * * * * * * * * * * * - -// -// SocialCalc.Popup.Create(type, id, attribs) -// -// Creates a control of type "type" as the children of document element "id" using "attribs" -// - -SocialCalc.Popup.Create = function(type, id, attribs) { - - var pt = SocialCalc.Popup.Types[type]; - if (pt && pt.Create) { - pt.Create(type, id, attribs); - } - - } - - -// -// SocialCalc.Popup.SetValue(id, value) -// -// Sets the value of control. -// - -SocialCalc.Popup.SetValue = function(id, value) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - var pt = spt[type]; - var spcdata = spc[id].data; - - if (pt && pt.Create) { - pt.SetValue(type, id, value); - if (spcdata.attribs && spcdata.attribs.changedcallback) { - spcdata.attribs.changedcallback(spcdata.attribs, id, value); - } - } - - } - - -// -// SocialCalc.Popup.SetDisabled(id, disabled) -// -// Sets whether the control is disabled (true) or not (false). -// - -SocialCalc.Popup.SetDisabled = function(id, disabled) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - if (sp.Current.id && id == sp.Current.id) { - pt.Hide(type, sp.Current.id); - sp.Current.id = null; - } - pt.SetDisabled(type, id, disabled); - } - - } - - -// -// SocialCalc.Popup.GetValue(id) -// -// Returns the value of control. -// - -SocialCalc.Popup.GetValue = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - return pt.GetValue(type, id); - } - - return null; - - } - - -// -// SocialCalc.Popup.Initialize(id, data) -// -// Gives "data" to the appropriate initialization code. -// - -SocialCalc.Popup.Initialize = function(id, data) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Initialize) { - pt.Initialize(type, id, data); - } - - } - - -// -// SocialCalc.Popup.Reset(type) -// -// Resets Popup, such as when turning to page. -// - -SocialCalc.Popup.Reset = function(type) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (spt[type].Reset) spt[type].Reset(type); - - } - - -// -// SocialCalc.Popup.CClick(id) -// -// Should be called when the user clicks on a control to do the popup -// - -SocialCalc.Popup.CClick = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - if (spc[id].data && spc[id].data.disabled) return; - - var type = spc[id].type; - - var pt = spt[type]; - - if (sp.Current.id) { - spt[spc[sp.Current.id].type].Hide(type, sp.Current.id); - if (id == sp.Current.id) { // same one - done - sp.Current.id = null; - return; - } - } - - if (pt && pt.Show) { - pt.Show(type, id); - } - - sp.Current.id = id; - - } - - -// -// SocialCalc.Popup.Close() -// -// Used to close any open popup. -// - -SocialCalc.Popup.Close = function() { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - sp.CClick(sp.Current.id); - - } - -// -// SocialCalc.Popup.Cancel() -// -// Closes Popup and restores old value -// - -SocialCalc.Popup.Cancel = function() { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - var type = spc[sp.Current.id].type; - - var pt = spt[type]; - - pt.Cancel(type, sp.Current.id); - - sp.Current.id = null; - - } - -// -// ele = SocialCalc.Popup.CreatePopupDiv(id, attribs) -// -// Utility function to create the main popup div of width attribs.width. -// If attribs.title, create one with that text, and optionally attribs.moveable. -// - -SocialCalc.Popup.CreatePopupDiv = function(id, attribs) { - - var pos, ele; - - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = document.createElement("div"); - main.style.position = "absolute"; - - pos = SocialCalc.GetElementPositionWithScroll(spcdata.mainele); - - main.style.top = (pos.top+spcdata.mainele.offsetHeight)+"px"; - main.style.left = (pos.left)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - if (attribs.width) { - main.style.width = attribs.width; - } - - spcdata.mainele.appendChild(main); - - if (attribs.title) { - main.innerHTML = ''+ - ''+ - '
    '+attribs.title+' X 
    '; - - if (attribs.moveable) { - spcdata.dragregistered = main.firstChild.firstChild.firstChild.firstChild; - SocialCalc.DragRegister(spcdata.dragregistered, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - } - } - - return main; - - } - -// -// SocialCalc.Popup.EnsurePosition(id, container) -// -// Utility function to make sure popup is positioned completely within container (both element objects) -// and appropriate with respect to the main element controlling the popup. -// - -SocialCalc.Popup.EnsurePosition = function(id, container) { - - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = spcdata.mainele.firstChild; - if (!main) {alert("No main popup element firstChild.");return}; - var popup = spcdata.popupele; - - function GetLayoutValues(ele) { - var r = SocialCalc.GetElementPositionWithScroll(ele); - r.height = ele.offsetHeight; - r.width = ele.offsetWidth; - r.bottom = r.top+r.height; - r.right = r.left+r.width; - return r; - } - - var p = GetLayoutValues(popup); - var c = GetLayoutValues(container); - var m = GetLayoutValues(main); - var t = 0; // type of placement -//addmsg("popup t/r/b/l/h/w= "+p.top+"/"+p.right+"/"+p.bottom+"/"+p.left+"/"+p.height+"/"+p.width); -//addmsg("container t/r/b/l/h/w= "+c.top+"/"+c.right+"/"+c.bottom+"/"+c.left+"/"+c.height+"/"+c.width); -//addmsg("main t/r/b/l/h/w= "+m.top+"/"+m.right+"/"+m.bottom+"/"+m.left+"/"+m.height+"/"+m.width); - - // Check various layout cases in priority order - - if (m.bottom+p.height < c.bottom && m.left+p.width < c.right) { // normal case: room on bottom and right - popup.style.top = m.bottom + "px"; - popup.style.left = m.left + "px"; - t = 1; - } - - else if (m.top-p.height > c.top && m.left+p.width < c.right) { // room on top and right - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = m.left + "px"; - t = 2; - } - - else if (m.bottom+p.height < c.bottom && m.right-p.width > c.left) { // room on bottom and left - popup.style.top = m.bottom + "px"; - popup.style.left = (m.right-p.width) + "px"; - t = 3; - } - - else if (m.top-p.height > c.top && m.right-p.width > c.left) { // room on top and left - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = (m.right-p.width) + "px"; - t = 4; - } - - else if (m.bottom+p.height < c.bottom && p.width < c.width) { // room on bottom and middle - popup.style.top = m.bottom + "px"; - popup.style.left = (c.left+Math.floor((c.width-p.width)/2)) + "px"; - t = 5; - } - - else if (m.top-p.height > c.top && p.width < c.width) { // room on top and middle - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = (c.left+Math.floor((c.width-p.width)/2)) + "px"; - t = 6; - } - - else if (p.height < c.height && m.right+p.width < c.right) { // room on middle and right - popup.style.top = (c.top+Math.floor((c.height-p.height)/2)) + "px"; - popup.style.left = m.right + "px"; - t = 7; - } - - else if (p.height < c.height && m.left-p.width > c.left) { // room on middle and left - popup.style.top = (c.top+Math.floor((c.height-p.height)/2)) + "px"; - popup.style.left = (m.left-p.width) + "px"; - t = 8; - } - - else { // nothing works, so leave as it is - } -//addmsg("Popup layout "+t); - -} - -// -// ele = SocialCalc.Popup.DestroyPopupDiv(ele, dragregistered) -// -// Utility function to get rid of the main popup div. -// - -SocialCalc.Popup.DestroyPopupDiv = function(ele, dragregistered) { - - if (!ele) return; - - ele.innerHTML = ""; - - SocialCalc.DragUnregister(dragregistered); // OK to do this even if not registered - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - } - -// -// Color Utility Functions -// - -SocialCalc.Popup.RGBToHex = function(val) { - - var sp = SocialCalc.Popup; - - if (val=="") { - return "000000"; - } - var rgbvals = val.match(/(\d+)\D+(\d+)\D+(\d+)/); - if (rgbvals) { - return sp.ToHex(rgbvals[1])+sp.ToHex(rgbvals[2])+sp.ToHex(rgbvals[3]); - } - else { - return "000000"; - } - } - -SocialCalc.Popup.HexDigits="0123456789ABCDEF"; - -SocialCalc.Popup.ToHex = function(num) { - var sp = SocialCalc.Popup; - var first=Math.floor(num / 16); - var second=num % 16; - return sp.HexDigits.charAt(first)+sp.HexDigits.charAt(second); - } - -SocialCalc.Popup.FromHex = function(str) { - - var sp = SocialCalc.Popup; - var first = sp.HexDigits.indexOf(str.charAt(0).toUpperCase()); - var second = sp.HexDigits.indexOf(str.charAt(1).toUpperCase()); - return ((first>=0)?first:0)*16+((second>=0)?second:0); - } - -SocialCalc.Popup.HexToRGB = function(val) { - - var sp = SocialCalc.Popup; - - return "rgb("+sp.FromHex(val.substring(1,3))+","+sp.FromHex(val.substring(3,5))+","+sp.FromHex(val.substring(5,7))+")"; - - } - -SocialCalc.Popup.makeRGB = function(r, g, b) { - return "rgb("+(r>0?r:0)+","+(g>0?g:0)+","+(b>0?b:0)+")"; - } - -SocialCalc.Popup.splitRGB = function(rgb) { - var parts = rgb.match(/(\d+)\D+(\d+)\D+(\d+)\D/); - if (!parts) { - return {r:0, g:0, b:0}; - } - else { - return {r: parts[1]-0, g: parts[2]-0, b: parts[3]-0}; - } - } - -// * * * * * * * * * * * * * * * * -// -// ROUTINES FOR EACH TYPE -// -// * * * * * * * * * * * * * * * * - -// -// List -// -// type: List -// value: value of control, -// display: "value to display", -// custom: true if custom value, -// disabled: t/f, -// attribs: { -// title: "popup title string", -// moveable: t/f, -// width: optional width, e.g., "100px", -// ensureWithin: optional element object to ensure popup fits within if possible -// changedcallback: optional function(attribs, id, newvalue), -// ... -// } -// data: { -// ncols: calculated number of columns -// options: [ -// {o: option-name, v: value-to-return, -// a: {option attribs} // optional: {skip: true, custom: true, cancel: true, newcol: true} -// }, -// ...] -// } -// -// popupele: gets popup element object when created -// contentele: gets element created with all the content -// listdiv: gets div with list of items -// customele: gets input element with custom value -// dragregistered: gets element, if any, registered as draggable -// - -SocialCalc.Popup.Types.List = {}; - -SocialCalc.Popup.Types.List.Create = function(type, id, attribs) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - var spcid = {type: type, value: "", display: "", data: {}}; - if (spc[id]) {alert("Already created "+id); return;} - spc[id] = spcid; - var spcdata = spcid.data; - - spcdata.attribs = attribs || {}; - - var ele = document.getElementById(id); - if (!ele) {alert("Missing element "+id); return;} - - spcdata.mainele = ele; - - ele.innerHTML = ''; - - spcdata.options = []; // set to nothing - use Initialize to fill - - } - -SocialCalc.Popup.Types.List.SetValue = function(type, id, value) { - - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - spcdata.value = value; - spcdata.custom = false; - - for (i=0; i'; - - spcdata.customele = ele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = ele; - } - else { - str = SocialCalc.Popup.Types.List.MakeList(type, id); - - ele = document.createElement("div"); - ele.innerHTML = '
    '+str+'
    '; - - spcdata.customele = null; - spcdata.listdiv = ele.firstChild; - spcdata.contentele = ele; - } - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = true; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - -SocialCalc.Popup.Types.List.MakeList = function(type, id) { - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data - - var str = ''; - var td = '
    '; - - str += td; - - spcdata.ncols = 1; - - for (i=0; i'+td; - spcdata.ncols += 1; - continue; - } - if (o.a.skip) { - str += '
    '+o.o+'
    '; - continue; - } - } - if (o.v == spcdata.value && !(o.a && (o.a.custom || o.a.cancel))) { // matches value - bg = "background-color:#DDF;"; - } - else { - bg = ""; - } - str += '
    '+o.o+'
    '; - } - - str += "
    "; - - return str; - - } - - -SocialCalc.Popup.Types.List.MakeCustom = function(type, id) { - - var SPLoc = SocialCalc.Popup.LocalizeString; - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - var val = spcdata.value; - val = SocialCalc.special_chars(val); - - str = '

    '+ - '

    '+ - ''+ - ''+ - ''+ - '
    '; - - return str; - - } - - -SocialCalc.Popup.Types.List.ItemClicked = function(id, num) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var a = spcdata.options[num].a; - - if (a && a.custom) { - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeCustom("List", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = nele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - return; - } - - if (a && a.cancel) { - SocialCalc.Popup.Close(); - return; - } - - SocialCalc.Popup.SetValue(id, spcdata.options[num].v); - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.List.CustomToList = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeList("List", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = null; - spcdata.listdiv = nele.firstChild; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - } - - -SocialCalc.Popup.Types.List.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.customele.value); - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.List.MouseMove = function(id, ele) { - - var col, i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var list = spcdata.listdiv; - - if (!list) return; - - var rowele = list.firstChild.firstChild.firstChild; // div.table.tbody.tr - - for (col=0; col '; - - } - -SocialCalc.Popup.Types.ColorChooser.SetValue = function(type, id, value) { - - var i, img, pos; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.value = value; - spcdata.custom = false; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (spcdata.value) { - spcdata.mainele.firstChild.style.backgroundColor = spcdata.value; - if (spca.backgroundImage) { - img = "url("+sp.imagePrefix+spca.backgroundImage+")"; - } - else { - img = ""; - } - pos = "center center"; - } - else { - spcdata.mainele.firstChild.style.backgroundColor = "#FFF"; - if (spca.backgroundImageDefault) { - img = "url("+sp.imagePrefix+spca.backgroundImageDefault+")"; - pos = "center center"; - } - else { - img = "url("+sp.imagePrefix+"defaultcolor.gif)"; - pos = "left top"; - } - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } - - } - - -SocialCalc.Popup.Types.ColorChooser.SetDisabled = function(type, id, disabled) { - - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.disabled = disabled; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (disabled) { - spcdata.mainele.firstChild.style.backgroundColor = "#DDD"; - if (spca.backgroundImageDisabled) { - img = "url("+sp.imagePrefix+spca.backgroundImageDisabled+")"; - pos = "center center"; - } - else { - img = "url("+sp.imagePrefix+"defaultcolor.gif)"; - pos = "left top"; - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } - else { - sp.SetValue(id, spcdata.value); - } - } - - } - - -SocialCalc.Popup.Types.ColorChooser.GetValue = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - return spcdata.value; - - } - - -SocialCalc.Popup.Types.ColorChooser.Initialize = function(type, id, data) { - - var a; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - for (a in data.attribs) { - spcdata.attribs[a] = data.attribs[a]; - } - - if (data.value) { // if has a value, set to it - sp.SetValue(id, data.value); - } - - } - - -SocialCalc.Popup.Types.ColorChooser.Reset = function(type) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (sp.Current.id && spc[sp.Current.id].type == type) { // we have a popup - spt[type].Hide(type, sp.Current.id); - sp.Current.id = null; - } - - } - - -SocialCalc.Popup.Types.ColorChooser.Show = function(type, id) { - - var i, ele, mainele; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data - - var str = ""; - - spcdata.oldvalue = spcdata.value; // remember starting value - - spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs); - - if (spcdata.custom) { - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom(type, id); - - ele = document.createElement("div"); - ele.innerHTML = '
    '+str+'
    '; - - spcdata.customele = ele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = ele; - } - else { - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid(type, id); - - ele = document.createElement("div"); - ele.style.padding = "3px"; - ele.style.backgroundColor = "#CCC"; - ele.appendChild(mainele); - - spcdata.customele = null; - spcdata.contentele = ele; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - -SocialCalc.Popup.Types.ColorChooser.MakeCustom = function(type, id) { - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var SPLoc = sp.LocalizeString; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - str = '

    '+ - '#

    '+ - ''+ - ''+ - '
    '; - - return str; - - } - - -SocialCalc.Popup.Types.ColorChooser.ItemClicked = function(id, num) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.ColorChooser.CustomToList = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - } - - -SocialCalc.Popup.Types.ColorChooser.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.customele.value); - - sp.Close(); - - } - - -SocialCalc.Popup.Types.ColorChooser.Hide = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered); - spcdata.popupele = null; - - } - - -SocialCalc.Popup.Types.ColorChooser.Cancel = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.oldvalue); // reset to old value - - SocialCalc.Popup.Types.ColorChooser.Hide(type, id); - - } - - -SocialCalc.Popup.Types.ColorChooser.CreateGrid = function (type, id) { - - var ele, pos, row, rowele, col, g; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var SPLoc = sp.LocalizeString; - var spcdata = spc[id].data; - spcdata.grid = {}; - var grid = spcdata.grid; - - var mainele = document.createElement("div"); - - ele = document.createElement("table"); - ele.cellSpacing = 0; - ele.cellPadding = 0; - ele.style.width = "100px"; - grid.table = ele; - - ele = document.createElement("tbody"); - grid.table.appendChild(ele); - grid.tbody = ele; - - for (row=0; row<16; row++) { - rowele = document.createElement("tr"); - for (col=0; col<5; col++) { - g = {}; - grid[row+","+col] = g; - ele = document.createElement("td"); - ele.style.fontSize = "1px"; - ele.innerHTML = " "; - ele.style.height = "10px"; - if (col<=1) { - ele.style.width = "17px"; - ele.style.borderRight = "3px solid white"; - } - else { - ele.style.width = "20px"; - ele.style.backgroundRepeat = "no-repeat"; - } - rowele.appendChild(ele); - g.ele = ele; - } - grid.tbody.appendChild(rowele); - } - mainele.appendChild(grid.table); - - ele = document.createElement("div"); - ele.style.marginTop = "3px"; - ele.innerHTML = ''+ - ''+ - ''+ - ''+ - '
     #'+SPLoc("OK")+'
    '; - grid.defaultbox = ele.firstChild.firstChild.firstChild.childNodes[0]; - grid.defaultbox.onclick = spt.ColorChooser.DefaultClicked; - grid.custom = ele.firstChild.firstChild.firstChild.childNodes[1]; - grid.custom.onclick = spt.ColorChooser.CustomClicked; - grid.msg = ele.firstChild.firstChild.firstChild.childNodes[2]; - grid.msg.onclick = spt.ColorChooser.CloseOK; - mainele.appendChild(ele); - - grid.table.onmousedown = spt.ColorChooser.GridMouseDown; - - spt.ColorChooser.DetermineColors(id); - spt.ColorChooser.SetColors(id); - - return mainele; - - } - -SocialCalc.Popup.Types.ColorChooser.gridToG = function(grid, row, col) { - - return grid[row+","+col]; - - } - -SocialCalc.Popup.Types.ColorChooser.DetermineColors = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - var col, row; - var rgb = sp.splitRGB(spcdata.value); - var color; - - col = 2; - row = 16-Math.floor((rgb.r+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(17*(15-row),0,0); - } - - col = 3; - row = 16-Math.floor((rgb.g+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(0,17*(15-row),0); - } - - col = 4; - row = 16-Math.floor((rgb.b+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(0,0,17*(15-row)); - } - - col = 1; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(17*(15-row),17*(15-row),17*(15-row)); - } - - col = 0; - var steps = [0, 68, 153, 204, 255]; - var commonrgb = ["400", "310", "420", "440", "442", "340", "040", "042", "032", "044", "024", "004", "204", "314", "402", "414"]; - var x; - for (row=0; row<16; row++) { - x = commonrgb[row]; - sptc.gridToG(grid,row,col).rgb = "rgb("+steps[x.charAt(0)-0]+","+steps[x.charAt(1)-0]+","+steps[x.charAt(2)-0]+")"; - } - - } - -SocialCalc.Popup.Types.ColorChooser.SetColors = function(id) { - - var row, col, g, ele, rgb; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - for (row=0; row<16; row++) { - for (col=0; col<5; col++) { - g = sptc.gridToG(grid,row, col); - g.ele.style.backgroundColor = g.rgb; - g.ele.title = sp.RGBToHex(g.rgb); - if (grid["selectedrow"+col]==row) { - g.ele.style.backgroundImage = "url("+sp.imagePrefix+"chooserarrow.gif)"; - } - else { - g.ele.style.backgroundImage = ""; - } - } - } - - sp.SetValue(id, spcdata.value); - - grid.msg.style.backgroundColor = spcdata.value; - rgb = sp.splitRGB(spcdata.value || "rgb(255,255,255)"); - if (rgb.r+rgb.g+rgb.b < 220) { - grid.msg.style.color = "#FFF"; - } - else { - grid.msg.style.color = "#000"; - } - if (!spcdata.value) { // default - grid.msg.style.backgroundColor = "#FFF"; - grid.msg.style.backgroundImage = "url("+sp.imagePrefix+"defaultcolor.gif)"; - grid.msg.title = "Default"; - } - else { - grid.msg.style.backgroundImage = ""; - grid.msg.title = sp.RGBToHex(spcdata.value); - } - - } - -SocialCalc.Popup.Types.ColorChooser.GridMouseDown = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - var grid = spcdata.grid; - - switch (event.type) { - case "mousedown": - grid.mousedown = true; - break; - case "mouseup": - grid.mousedown = false; - break; - case "mousemove": - if (!grid.mousedown) { - return; - } - break; - } - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - var gpos = SocialCalc.GetElementPosition(grid.table); - var row = Math.floor((clientY-gpos.top-2)/10); // -2 is to split the diff btw IE & FF - row = row < 0 ? 0 : row; - var col = Math.floor((clientX-gpos.left)/20); - row = row < 0 ? 0 : (row > 15 ? 15 : row); - col = col < 0 ? 0 : (col > 4 ? 4 : col); - var color = sptc.gridToG(grid,row,col).ele.style.backgroundColor; - var newrgb = sp.splitRGB(color); - var oldrgb = sp.splitRGB(spcdata.value); - - switch (col) { - case 2: - spcdata.value = sp.makeRGB(newrgb.r, oldrgb.g, oldrgb.b); - break; - case 3: - spcdata.value = sp.makeRGB(oldrgb.r, newrgb.g, oldrgb.b); - break; - case 4: - spcdata.value = sp.makeRGB(oldrgb.r, oldrgb.g, newrgb.b); - break; - case 0: - case 1: - spcdata.value = color; - } - - sptc.DetermineColors(id); - sptc.SetColors(id); - - } - - -SocialCalc.Popup.Types.ColorChooser.ControlClicked = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var cid = sp.Current.id; - if (!cid || id != cid) { - sp.CClick(id); - return; - } - - sptc.CloseOK(); - - } - -SocialCalc.Popup.Types.ColorChooser.DefaultClicked = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - spcdata.value = ""; - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - - } - -SocialCalc.Popup.Types.ColorChooser.CustomClicked = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - var oele, str, nele; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom("ColorChooser", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = nele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - spcdata.customele.value = sp.RGBToHex(spcdata.value); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - - -SocialCalc.Popup.Types.ColorChooser.CustomToGrid = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#"+spcdata.customele.value)); - - var oele, mainele, nele; - - oele = spcdata.contentele; - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid("ColorChooser", id); - nele = document.createElement("div"); - nele.style.padding = "3px"; - nele.style.backgroundColor = "#CCC"; - nele.appendChild(mainele); - spcdata.customele = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - } - - -SocialCalc.Popup.Types.ColorChooser.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#"+spcdata.customele.value)); - - SocialCalc.Popup.Close(); - - } - -SocialCalc.Popup.Types.ColorChooser.CloseOK = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - - } - diff --git a/DeveloperAdoption/public/socialcalc/socialcalcserver.pl b/DeveloperAdoption/public/socialcalc/socialcalcserver.pl deleted file mode 100644 index 2c43159..0000000 --- a/DeveloperAdoption/public/socialcalc/socialcalcserver.pl +++ /dev/null @@ -1,685 +0,0 @@ -#!/usr/bin/perl - -# -# SocialCalc Server -# -# This is a simple Perl CGI server that uses SocialCalc in the browser -# to edit files stored on the server or a regular personal computer. -# - - use strict; - use CGI qw(:standard); - use URI; - use HTTP::Daemon; - use HTTP::Status; - use HTTP::Response; - use Socket; - use CGI::Cookie; - use LWP::UserAgent; - -# use SocialCalcServersideUtilities; - - # Defaults - - my $settingsfile = "socialcalcserversettings.txt"; # file with values for the following - my $datadir = "se2-data/"; # The subdirectory of where the code is that holds the socialcalc data files - my $versionstr = "0.2.3"; - my $titlestr = "SocialCalc Server $versionstr"; - my $jsdir = "/sgi/scjs/"; # The subdirectory of the server home page (when run thru CGI) - # where the .js files are, and ./images/ subdirectory. - my $imagedir = "/images/sc-"; - -# -# This whole first section lets this code run either as a CGI script on a server -# or standalone on the desktop run from the Perl command line. -# -# The main processing starts with process_request. -# - - if ($ENV{REQUEST_METHOD}) { # being run as a CGI on a server - print "Content-type: text/html\n\n"; - my $q = new CGI; - print process_request($q); - exit; - } - - # running locally - do mini-server - - my $d = HTTP::Daemon->new ( - LocalPort => 6557, - Reuse => 1); - - if (!$d) { - print "simpleedit could not start on 127.0.0.1:6557\n"; - exit; - } - - print "socialcalcserver\nAccess at: http://127.0.0.1:6557/\n"; - - while (my $c = $d->accept) { - - # Make sure the request is from our machine - - if ($c) { - my ($port, $host) = sockaddr_in(getpeername($c)); - if ($host ne inet_aton("127.0.0.1")) { - $c->close; # no - ignore request completely - undef($c); - next; - } - } - - # Process the request - - while ((defined $c) && (my $r = $c->get_request)) { - if ($r->method eq 'POST' || $r->method eq 'GET') { - $c->force_last_request; - my $uri = $r->uri; - if ($uri =~ /favicon/) { # if this is a request for favicon.ico, ignore - $c->send_error(RC_NOT_FOUND); - next; - } - if ($uri =~ /\/quit$/) { - $c->send_file_response("quitmessage.html"); - $c->close; - undef($c); - exit; - } - if ($uri =~ /\/([a-z\-0-9]+)\.(gif|js|css|png)(\?.*)*$/) { # ok request - $uri = "$1.$2"; - $uri = "images/$uri" if ($2 eq "gif" || $2 eq "png"); -# if ($2 eq "js") { -# $res->content_type("text/html; charset=UTF-8"); -# } - $c->send_file_response($uri); - next; - } - - my $resp=""; - if ($r->method eq 'POST') { - my $q = new CGI($r->content()); - $resp = process_request($q) - } - else { - my $q = new CGI($r->uri->query()); - $resp = process_request($q) - } - my $res = new HTTP::Response(200); - $res->content_type("text/html; charset=UTF-8"); - $res->expires("-1d"); - $res->content($resp); - $c->send_response($res); - } - - else { - $c->send_error(RC_FORBIDDEN); - } - } - - $c->close; - undef($c); - } - -# -# Main routine starts here: -# - -sub process_request { - - my ($request) = @_; - my $q = new CGI($request); - - my $response; - - my ($statusmessage); - - if (-e $settingsfile) { - open (SETTINGSFILE, $settingsfile); - while (my $line = ) { - chomp $line; $line =~ s/\r//g; - my @sline = split /\:/, $line; - $datadir = $sline[1] if ($sline[0] eq "datadir"); - $jsdir = $sline[1] if ($sline[0] eq "jsdir"); - } - close SETTINGSFILE; - } - else { - if ($q->param('setup')) { # got settings - do this once - $datadir = $q->param('datadir'); - $jsdir = $q->param('jsdir'); - open (SETTINGSFILE, ">$settingsfile"); - print SETTINGSFILE <<"EOF"; -# SocialcalcServer settings -version:1.0 -datadir:$datadir -jsdir:$jsdir -EOF - close SETTINGSFILE; - mkdir $datadir; - } - else { - $response = <<"EOF"; - - - - -$titlestr - - - -
    -
    -
    SIMPLE SYSTEM FOR EDITING SOCIALCALC FILES
    -
    Initial Setup
    -
    -Name of subdirectory of where the code is to hold spreadsheet data files: -
    -Name of subdirectory of server home page that has the JavaScript files and the images subdirectory -(only needed if running on Apache, etc., not when running standalone from the -command line in Perl):
    - -
    -
    - -
    -
    - - -EOF - - return $response; - } - - } - - my $pagename = $q->param('pagename'); - - if ($q->param('newpage')) { - $pagename = $q->param('newpagename'); - } - - $pagename =~ s/[^a-zA-Z0-9_\-\.]*//g; - if (!$pagename) { - $pagename = "[None]"; - return do_displaypage($q, $pagename, $statusmessage); - } - - if ($q->param("editpage") || $q->param("editrawpage")) { # when one of the "editpage" buttons is pressed - return do_editpage($q, $pagename, $statusmessage); - } - - if ($q->param("edit")) { # "edit" pressed - return start_editsheet($pagename, $q, $statusmessage); - } - if ($q->param("view")) { # "view" pressed - return start_viewsheet($pagename, $q, $statusmessage); - } - - if ($q->param('savespreadsheet')) { # save the edited spreadsheet - my $pagestr = $q->param('newstr'); - - open (PAGEFILEOUT, ">$datadir$pagename"); - print PAGEFILEOUT $pagestr; - close PAGEFILEOUT; - $statusmessage = - "Saved updated '$pagename'.
    "; - } - - if ($q->param('filecontents')) { # return contents of file - my $fileurl = $q->param('filecontents'); - - open (PAGEFILEIN, "$fileurl"); - my $filestr; - while (my $line = ) { - $filestr .= $line; - } - close PAGEFILEIN; -print $filestr; - return $filestr; - - } - - $response = do_displaypage($q, $pagename, $statusmessage); # Otherwise, display page - - return $response; - - } - -# -# $response = do_displaypage($q, $pagename, $statusmessage) - Display page -# - -sub do_displaypage { - - my ($q, $pagename, $statusmessage) = @_; - my $response; - - $response = <<"EOF"; - - - - -$titlestr - - - - -
    -
    -
    SIMPLE SYSTEM FOR EDITING SOCIALCALC FILES
    -
    $statusmessage  
    -
    -
    Pages:
    -
    -EOF - - my @pagefiles = glob("$datadir*"); # Get list of all pages - for (my $pnum=0; $pnum <= $#pagefiles; $pnum++) { - $pagefiles[$pnum] =~ m/^(?:.*\/){0,1}(.*)$/; - $response .= qq!$1 !; - $response .= qq!
    !; - } - - $response .= <<"EOF"; - - - -
    -
    - -
    - - - -
    -
    -
    - - -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 = ) { - $sheetstr .= $line; - } - $sheetstr = special_chars($sheetstr); - - close PAGEFILEIN; - - $response = <<"EOF"; # output page with edit JS code - - - - -$titlestr - $pagename - - - - - - - - - - -
    -
    -
    SIMPLE SYSTEM FOR EDITING SOCIALCALC FILES
    -
    $statusmessage  
    -
    Editing page: $pagename
    - - - - - -
    -
    -
    editor goes here
    - - - -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 = ) { - $sheetstr .= $line; - } - $sheetstr = special_chars($sheetstr); - - $response = <<"EOF"; # output page with JS code to render - - - - -$titlestr - $pagename - - - - - - - - - - -EOF - - if (!$q->param('print')) { - $response .= <<"EOF"; -
    -
    SIMPLE SYSTEM FOR EDITING SOCIALCALC FILES
    -
    $statusmessage  
    -
    Editing page: $pagename
    -
    - -
    -Printer-friendly -
    -EOF - } - - $response .= <<"EOF"; - -
    Sheet goes here
    - - - -EOF - - return $response; - - } - - -# # # # # # # # # # -# special_chars($string) -# -# Returns $estring where &, <, >, " are HTML escaped -# - -sub special_chars { - my $string = shift @_; - - $string =~ s/&/&/g; - $string =~ s//>/g; - $string =~ s/"/"/g; - - return $string; -} - - -# -# decode_from_ajax($string) - Returns a string with -# \n, \b, and \c escaped to \n, \, and : -# - -sub decode_from_ajax { - my $string = shift @_; - - $string =~ s/\\n/\n/g; - $string =~ s/\\c/:/g; - $string =~ s/\\b/\\/g; - - return $string; -} - - -# -# encode_for_ajax($string) - Returns a string with -# \n, \, :, and ]]> escaped to \n, \b, \c, and \e -# - -sub encode_for_ajax { - my $string = shift @_; - - $string =~ s/\\/\\b/g; - $string =~ s/\n/\\n/g; - $string =~ s/\r//g; - $string =~ s/:/\\c/g; - $string =~ s/]]>/\\e/g; - - return $string; -} - diff --git a/DeveloperAdoption/public/socialcalc/socialcalcspreadsheetcontrol.js b/DeveloperAdoption/public/socialcalc/socialcalcspreadsheetcontrol.js deleted file mode 100644 index 366f385..0000000 --- a/DeveloperAdoption/public/socialcalc/socialcalcspreadsheetcontrol.js +++ /dev/null @@ -1,3585 +0,0 @@ -// -// SocialCalcSpreadsheetControl -// -/* -// The code module of the SocialCalc package that lets you embed a spreadsheet -// control with toolbar, etc., into a web page. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript SpreadsheetControl. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the SpreadsheetControl is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/ - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); - } - -// ************************************* -// -// SpreadsheetControl class: -// -// ************************************* - -// Global constants: - - SocialCalc.CurrentSpreadsheetControlObject = null; // right now there can only be one active at a time - - -// Constructor: - -SocialCalc.SpreadsheetControl = function() { - - var scc = SocialCalc.Constants; - - // Properties: - - this.parentNode = null; - this.spreadsheetDiv = null; - this.requestedHeight = 0; - this.requestedWidth = 0; - this.requestedSpaceBelow = 0; - this.height = 0; - this.width = 0; - this.viewheight = 0; // calculated amount for views below toolbar, etc. - - // Tab definitions: An array where each tab is an object of the form: - // - // name: "name", - // text: "text-on-tab", - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext - // Other replacements from spreadsheet.tabreplacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // view: "viewname", // view to show when selected; "sheet" or missing/null is spreadsheet - // oncreate: function(spreadsheet, tab-name), // called when first created to initialize - // onclick: function(spreadsheet, tab-name), missing/null is sheet default - // onclickFocus: text, // spreadsheet.idPrefix+text is given the focus if present instead of normal KeyboardFocus - // or if text isn't a string, that value (e.g., true) is used for SocialCalc.CmdGotFocus - // onunclick: function(spreadsheet, tab-name), missing/null is sheet default - - this.tabs = []; - this.tabnums = {}; // when adding tabs, add tab-name: array-index to this object - this.tabreplacements = {}; // see use above - this.currentTab = -1; // currently selected tab index in this.tabs or -1 (maintained by SocialCalc.SetTab) - - // View definitions: An object where each view is an object of the form: - // - // name: "name", // localized when first set using SocialCalc.LocalizeString - // element: node-in-the-dom, // filled in when initialized - // replacements: {}, // see below - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext, "%img.": spreadsheet.imagePrefix, - // SocialCalc.LocalizeSubstring replacements ("%loc!string!" and "%ssc!constant-name!") - // Other replacements from viewobject.replacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // divStyle: attributes for sheet div (SocialCalc.setStyles format) - // oncreate: function(spreadsheet, viewobject), // called when first created to initialize - // needsresize: true/false/null, // if true, do resize calc after displaying - // onresize: function(spreadsheet, viewobject), // called if needs resize - // values: {} // optional values to share with onclick handlers, etc. - // - // There is always a "sheet" view. - - this.views = {}; // {viewname: view-object, ...} - - // Dynamic properties: - - this.sheet = null; - this.context = null; - this.editor = null; - - this.spreadsheetDiv = null; - this.editorDiv = null; - - this.sortrange = ""; // remembered range for sort tab - - this.moverange = ""; // remembered range from movefrom used by movepaste/moveinsert - - // Constants: - - this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-" - this.multipartBoundary = "SocialCalcSpreadsheetControlSave"; // boundary used by SpreadsheetControlCreateSpreadsheetSave - this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src - - this.toolbarbackground = scc.SCToolbarbackground; - this.tabbackground = scc.SCTabbackground; // "background-color:#CCC;"; - this.tabselectedCSS = scc.SCTabselectedCSS; - this.tabplainCSS = scc.SCTabplainCSS; - this.toolbartext = scc.SCToolbartext; - - this.formulabarheight = scc.SCFormulabarheight; // in pixels, will contain a text input box - - this.statuslineheight = scc.SCStatuslineheight; // in pixels - this.statuslineCSS = scc.SCStatuslineCSS; - - // Callbacks: - - this.ExportCallback = null; // a function called for Clipboard Export button: this.ExportCallback(spreadsheet_control_object) - - // Initialization Code: - - this.sheet = new SocialCalc.Sheet(); - this.context = new SocialCalc.RenderContext(this.sheet); - this.context.showGrid=true; - this.context.showRCHeaders=true; - this.editor = new SocialCalc.TableEditor(this.context); - this.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetControlStatuslineCallback, - params: {statuslineid: this.idPrefix+"statusline", - recalcid1: this.idPrefix+"divider_recalc", - recalcid2: this.idPrefix+"button_recalc"}}; - - SocialCalc.CurrentSpreadsheetControlObject = this; // remember this for rendezvousing on events - - this.editor.MoveECellCallback.movefrom = function(editor) { - var cr; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - spreadsheet.context.cursorsuffix = ""; - if (editor.range2.hasrange && !editor.cellhandles.noCursorSuffix) { - if (editor.ecell.row==editor.range2.top && (editor.ecell.coleditor.range2.right+1)) { - spreadsheet.context.cursorsuffix = "insertleft"; - } - if (editor.ecell.col==editor.range2.left && (editor.ecell.roweditor.range2.bottom+1)) { - spreadsheet.context.cursorsuffix = "insertup"; - } - } - }; - - // formula bar buttons - - this.formulabuttons = { - formulafunctions: {image: "formuladialog.gif", tooltip: "Functions", // tooltips are localized when set below - command: SocialCalc.SpreadsheetControl.DoFunctionList}, - multilineinput: {image: "multilinedialog.gif", tooltip: "Multi-line Input Box", - command: SocialCalc.SpreadsheetControl.DoMultiline}, - link: {image: "linkdialog.gif", tooltip: "Link Input Box", - command: SocialCalc.SpreadsheetControl.DoLink}, - sum: {image: "sumdialog.gif", tooltip: "Auto Sum", - command: SocialCalc.SpreadsheetControl.DoSum} - } - - // Default tabs: - - // Edit - - this.tabnums.edit = this.tabs.length; - this.tabs.push({name: "edit", text: "Edit", html: - '
    '+ -' '+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -''+ -' '+ -'    '+ -''+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -' '+ -' '+ -' '+ -'    '+ -' '+ -' '+ -'    '+ -' '+ -' '+ -'  '+ -' '+ -'    '+ -' '+ - '
    ', - oncreate: null, //function(spreadsheet, viewobject) {SocialCalc.DoCmd(null, "fill-rowcolstuff");}, - onclick: null}); - - // Settings (Format) - - this.tabnums.settings = this.tabs.length; - this.tabs.push({name: "settings", text: "Format", html: - '', - view: "settings", - onclick: function(s, t) { - SocialCalc.SettingsControls.idPrefix = s.idPrefix; // used to get color chooser div - SocialCalc.SettingControlReset(); - var sheetattribs = s.sheet.EncodeSheetAttributes(); - var cellattribs = s.sheet.EncodeCellAttributes(s.editor.ecell.coord); - SocialCalc.SettingsControlLoadPanel(s.views.settings.values.sheetspanel, sheetattribs); - SocialCalc.SettingsControlLoadPanel(s.views.settings.values.cellspanel, cellattribs); - document.getElementById(s.idPrefix+"settingsecell").innerHTML = s.editor.ecell.coord; - SocialCalc.SpreadsheetControlSettingsSwitch("cell"); - s.views.settings.element.style.height = s.viewheight+"px"; - s.views.settings.element.firstChild.style.height = s.viewheight+"px"; - - var range; // set save message - if (s.editor.range.hasrange) { - range = SocialCalc.crToCoord(s.editor.range.left, s.editor.range.top) + ":" + - SocialCalc.crToCoord(s.editor.range.right, s.editor.range.bottom); - } - else { - range = s.editor.ecell.coord; - } - document.getElementById(s.idPrefix+"settings-savecell").value = SocialCalc.LocalizeString("Save to")+": "+range; - }, - onclickFocus: true - }); - - this.views["settings"] = {name: "settings", values: {}, - oncreate: function(s, viewobj) { - var scc = SocialCalc.Constants; - - viewobj.values.sheetspanel = { -// name: "sheet", - colorchooser: {id: s.idPrefix+"scolorchooser"}, - formatnumber: {setting: "numberformat", type: "PopupList", id: s.idPrefix+"formatnumber", - initialdata: scc.SCFormatNumberFormats}, - formattext: {setting: "textformat", type: "PopupList", id: s.idPrefix+"formattext", - initialdata: scc.SCFormatTextFormats}, - fontfamily: {setting: "fontfamily", type: "PopupList", id: s.idPrefix+"fontfamily", - initialdata: scc.SCFormatFontfamilies}, - fontlook: {setting: "fontlook", type: "PopupList", id: s.idPrefix+"fontlook", - initialdata: scc.SCFormatFontlook}, - fontsize: {setting: "fontsize", type: "PopupList", id: s.idPrefix+"fontsize", - initialdata: scc.SCFormatFontsizes}, - textalignhoriz: {setting: "textalignhoriz", type: "PopupList", id: s.idPrefix+"textalignhoriz", - initialdata: scc.SCFormatTextAlignhoriz}, - numberalignhoriz: {setting: "numberalignhoriz", type: "PopupList", id: s.idPrefix+"numberalignhoriz", - initialdata: scc.SCFormatNumberAlignhoriz}, - alignvert: {setting: "alignvert", type: "PopupList", id: s.idPrefix+"alignvert", - initialdata: scc.SCFormatAlignVertical}, - textcolor: {setting: "textcolor", type: "ColorChooser", id: s.idPrefix+"textcolor"}, - bgcolor: {setting: "bgcolor", type: "ColorChooser", id: s.idPrefix+"bgcolor"}, - padtop: {setting: "padtop", type: "PopupList", id: s.idPrefix+"padtop", - initialdata: scc.SCFormatPadsizes}, - padright: {setting: "padright", type: "PopupList", id: s.idPrefix+"padright", - initialdata: scc.SCFormatPadsizes}, - padbottom: {setting: "padbottom", type: "PopupList", id: s.idPrefix+"padbottom", - initialdata: scc.SCFormatPadsizes}, - padleft: {setting: "padleft", type: "PopupList", id: s.idPrefix+"padleft", - initialdata: scc.SCFormatPadsizes}, - colwidth: {setting: "colwidth", type: "PopupList", id: s.idPrefix+"colwidth", - initialdata: scc.SCFormatColwidth}, - recalc: {setting: "recalc", type: "PopupList", id: s.idPrefix+"recalc", - initialdata: scc.SCFormatRecalc} - }; - viewobj.values.cellspanel = { - name: "cell", - colorchooser: {id: s.idPrefix+"scolorchooser"}, - cformatnumber: {setting: "numberformat", type: "PopupList", id: s.idPrefix+"cformatnumber", - initialdata: scc.SCFormatNumberFormats}, - cformattext: {setting: "textformat", type: "PopupList", id: s.idPrefix+"cformattext", - initialdata: scc.SCFormatTextFormats}, - cfontfamily: {setting: "fontfamily", type: "PopupList", id: s.idPrefix+"cfontfamily", - initialdata: scc.SCFormatFontfamilies}, - cfontlook: {setting: "fontlook", type: "PopupList", id: s.idPrefix+"cfontlook", - initialdata: scc.SCFormatFontlook}, - cfontsize: {setting: "fontsize", type: "PopupList", id: s.idPrefix+"cfontsize", - initialdata: scc.SCFormatFontsizes}, - calignhoriz: {setting: "alignhoriz", type: "PopupList", id: s.idPrefix+"calignhoriz", - initialdata: scc.SCFormatTextAlignhoriz}, - calignvert: {setting: "alignvert", type: "PopupList", id: s.idPrefix+"calignvert", - initialdata: scc.SCFormatAlignVertical}, - ctextcolor: {setting: "textcolor", type: "ColorChooser", id: s.idPrefix+"ctextcolor"}, - cbgcolor: {setting: "bgcolor", type: "ColorChooser", id: s.idPrefix+"cbgcolor"}, - cbt: {setting: "bt", type: "BorderSide", id: s.idPrefix+"cbt"}, - cbr: {setting: "br", type: "BorderSide", id: s.idPrefix+"cbr"}, - cbb: {setting: "bb", type: "BorderSide", id: s.idPrefix+"cbb"}, - cbl: {setting: "bl", type: "BorderSide", id: s.idPrefix+"cbl"}, - cpadtop: {setting: "padtop", type: "PopupList", id: s.idPrefix+"cpadtop", - initialdata: scc.SCFormatPadsizes}, - cpadright: {setting: "padright", type: "PopupList", id: s.idPrefix+"cpadright", - initialdata: scc.SCFormatPadsizes}, - cpadbottom: {setting: "padbottom", type: "PopupList", id: s.idPrefix+"cpadbottom", - initialdata: scc.SCFormatPadsizes}, - cpadleft: {setting: "padleft", type: "PopupList", id: s.idPrefix+"cpadleft", - initialdata: scc.SCFormatPadsizes} - }; - - SocialCalc.SettingsControlInitializePanel(viewobj.values.sheetspanel); - SocialCalc.SettingsControlInitializePanel(viewobj.values.cellspanel); - }, - replacements: { - itemtitle: {regex: /\%itemtitle\./g, replacement: 'style="padding:12px 10px 0px 10px;font-weight:bold;text-align:right;vertical-align:top;font-size:small;"'}, - sectiontitle: {regex: /\%sectiontitle\./g, replacement: 'style="padding:16px 10px 0px 0px;font-weight:bold;vertical-align:top;font-size:small;color:#C00;"'}, - parttitle: {regex: /\%parttitle\./g, replacement: 'style="font-weight:bold;font-size:x-small;padding:0px 0px 3px 0px;"'}, - itembody: {regex: /\%itembody\./g, replacement: 'style="padding:12px 0px 0px 0px;vertical-align:top;font-size:small;"'}, - bodypart: {regex: /\%bodypart\./g, replacement: 'style="padding:0px 10px 0px 0px;font-size:small;vertical-align:top;"'} - }, - divStyle: "border:1px solid black;overflow:auto;", - html: - ''+ -''+ -'
    '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -'

    %loc!Format!:
    '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Number!
    '+ -' '+ -'
    '+ -'
    %loc!Text!
    '+ -' '+ -'
    '+ -'

    %loc!Alignment!:
    '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Horizontal!
    '+ -' '+ -'
    '+ -'
    %loc!Vertical!
    '+ -' '+ -'
    '+ -'

    %loc!Font!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Family!
    '+ -' '+ -'
    '+ -'
    %loc!Bold & Italics!
    '+ -' '+ -'
    '+ -'
    %loc!Size!
    '+ -' '+ -'
    '+ -'
    %loc!Color!
    '+ -'
    '+ -'
    '+ -'
    %loc!Background!
    '+ -'
    '+ -'
    '+ -'

    %loc!Borders!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    %loc!Top Border!
    %loc!Right Border!
    %loc!Bottom Border!
    %loc!Left Border!
    '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        
    '+ -'

    %loc!Padding!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Top!
    '+ -' '+ -'
    '+ -'
    %loc!Right!
    '+ -' '+ -'
    '+ -'
    %loc!Bottom!
    '+ -' '+ -'
    '+ -'
    %loc!Left!
    '+ -' '+ -'
    '+ -'
    '+ -'
    '+ -'
    '+ -' '+ -' '+ -'
    %loc!This is a
    sample!
    -1234.5
    '+ -'
    '+ -'
    '+ -'
    ' - }; - - // Sort - - this.tabnums.sort = this.tabs.length; - this.tabs.push({name: "sort", text: "Sort", html: - ' ', - onclick: SocialCalc.SpreadsheetControlSortOnclick}); - this.editor.SettingsCallbacks.sort = {save: SocialCalc.SpreadsheetControlSortSave, load: SocialCalc.SpreadsheetControlSortLoad}; - - // Audit - - this.tabnums.audit = this.tabs.length; - this.tabs.push({name: "audit", text: "Audit", html: - '', - view: "audit", - onclick: - function(s, t) { - var SCLoc = SocialCalc.LocalizeString; - var i, j; - var str = '
    '+SCLoc("Audit Trail This Session")+':

    '; - var stack = s.sheet.changes.stack; - var tos = s.sheet.changes.tos; - for (i=0; i'; - for (j=0; j"; - } - } - s.views.audit.element.innerHTML = str+"
    "; - SocialCalc.CmdGotFocus(true); - }, - onclickFocus: true - }); - - this.views["audit"] = {name: "audit", - divStyle: "border:1px solid black;overflow:auto;", - html: 'Audit Trail' - }; - - // Comment - - this.tabnums.comment = this.tabs.length; - this.tabs.push({name: "comment", text: "Comment", html: - '', - view: "sheet", - onclick: SocialCalc.SpreadsheetControlCommentOnclick, - onunclick: SocialCalc.SpreadsheetControlCommentOnunclick - }); - - // Names - - this.tabnums.names = this.tabs.length; - this.tabs.push({name: "names", text: "Names", html: - '', - view: "sheet", - onclick: SocialCalc.SpreadsheetControlNamesOnclick, - onunclick: SocialCalc.SpreadsheetControlNamesOnunclick - }); - - // Clipboard - - this.tabnums.clipboard = this.tabs.length; - this.tabs.push({name: "clipboard", text: "Clipboard", html: - '', - view: "clipboard", - onclick: SocialCalc.SpreadsheetControlClipboardOnclick, - onclickFocus: "clipboardtext" - }); - - this.views["clipboard"] = {name: "clipboard", divStyle: "overflow:auto;", html: - '
    '+ - ' %loc!Display Clipboard in!:'+ - ' %loc!Tab-delimited format!  '+ - ' %loc!CSV format!  '+ - ' %loc!SocialCalc-save format!'+ - '
    '+ - '   '+ - '   '+ - '
    '+ - ' ' - }; - - return; - - } - -// Methods: - -SocialCalc.SpreadsheetControl.prototype.InitializeSpreadsheetControl = - function(node, height, width, spacebelow) {return SocialCalc.InitializeSpreadsheetControl(this, node, height, width, spacebelow);}; -SocialCalc.SpreadsheetControl.prototype.DoOnResize = function() {return SocialCalc.DoOnResize(this);}; -SocialCalc.SpreadsheetControl.prototype.SizeSSDiv = function() {return SocialCalc.SizeSSDiv(this);}; -SocialCalc.SpreadsheetControl.prototype.ExecuteCommand = - function(combostr, sstr) {return SocialCalc.SpreadsheetControlExecuteCommand(this, combostr, sstr);}; -SocialCalc.SpreadsheetControl.prototype.CreateSheetHTML = - function() {return SocialCalc.SpreadsheetControlCreateSheetHTML(this);}; -SocialCalc.SpreadsheetControl.prototype.CreateSpreadsheetSave = - function(otherparts) {return SocialCalc.SpreadsheetControlCreateSpreadsheetSave(this, otherparts);}; -SocialCalc.SpreadsheetControl.prototype.DecodeSpreadsheetSave = - function(str) {return SocialCalc.SpreadsheetControlDecodeSpreadsheetSave(this, str);}; -SocialCalc.SpreadsheetControl.prototype.CreateCellHTML = - function(coord) {return SocialCalc.SpreadsheetControlCreateCellHTML(this, coord);}; -SocialCalc.SpreadsheetControl.prototype.CreateCellHTMLSave = - function(range) {return SocialCalc.SpreadsheetControlCreateCellHTMLSave(this, range);}; - - -// Sheet Methods to make things a little easier: - -SocialCalc.SpreadsheetControl.prototype.ParseSheetSave = function(str) {return this.sheet.ParseSheetSave(str);}; -SocialCalc.SpreadsheetControl.prototype.CreateSheetSave = function() {return this.sheet.CreateSheetSave();}; - - -// Functions: - -// -// InitializeSpreadsheetControl(spreadsheet, node, height, width, spacebelow) -// -// Creates the control elements and makes them the child of node (string or element). -// If present, height and width specify size. -// If either is 0 or null (missing), the maximum that fits on the screen -// (taking spacebelow into account) is used. -// -// Displays the tabs and creates the views (other than "sheet"). -// The first tab is set as selected, but onclick is not invoked. -// -// You should do a redisplay or recalc (which redisplays) after running this. -// - -SocialCalc.InitializeSpreadsheetControl = function(spreadsheet, node, height, width, spacebelow) { - - var scc = SocialCalc.Constants; - var SCLoc = SocialCalc.LocalizeString; - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var html, child, i, vname, v, style, button, bele; - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - spreadsheet.requestedHeight = height; - spreadsheet.requestedWidth = width; - spreadsheet.requestedSpaceBelow = spacebelow; - - if (typeof node == "string") node = document.getElementById(node); - - if (node == null) { - alert("SocialCalc.SpreadsheetControl not given parent node."); - } - - spreadsheet.parentNode = node; - - // create node to hold spreadsheet control - - spreadsheet.spreadsheetDiv = document.createElement("div"); - - spreadsheet.SizeSSDiv(); // calculate and fill in the size values - - for (child=node.firstChild; child!=null; child=node.firstChild) { - node.removeChild(child); - } - - // create the tabbed UI at the top - - html = '
    '; - - for (i=0; i'+ - ''; - - for (i=0; i' + SCLoc(tabs[i].text) + ''; - } - - html += '
    '; - - spreadsheet.currentTab = 0; // this is where we started - - for (style in spreadsheet.tabreplacements) { - html = html.replace(spreadsheet.tabreplacements[style].regex, spreadsheet.tabreplacements[style].replacement); - } - html = html.replace(/\%s\./g, "SocialCalc."); - html = html.replace(/\%id\./g, spreadsheet.idPrefix); - html = html.replace(/\%tbt\./g, spreadsheet.toolbartext); - html = html.replace(/\%img\./g, spreadsheet.imagePrefix); - - html = SCLocSS(html); // localize with %loc!string! and %scc!constant! - - spreadsheet.spreadsheetDiv.innerHTML = html; - - node.appendChild(spreadsheet.spreadsheetDiv); - - // Initialize SocialCalc buttons - -spreadsheet.Buttons = { - button_undo: {tooltip: "Undo", command: "undo"}, - button_redo: {tooltip: "Redo", command: "redo"}, - button_copy: {tooltip: "Copy", command: "copy"}, - button_cut: {tooltip: "Cut", command: "cut"}, - button_paste: {tooltip: "Paste", command: "paste"}, - button_pasteformats: {tooltip: "Paste Formats", command: "pasteformats"}, - button_delete: {tooltip: "Delete Contents", command: "delete"}, - button_filldown: {tooltip: "Fill Down", command: "filldown"}, - button_fillright: {tooltip: "Fill Right", command: "fillright"}, - button_movefrom: {tooltip: "Set/Clear Move From", command: "movefrom"}, - button_movepaste: {tooltip: "Move Paste", command: "movepaste"}, - button_moveinsert: {tooltip: "Move Insert", command: "moveinsert"}, - button_alignleft: {tooltip: "Align Left", command: "align-left"}, - button_aligncenter: {tooltip: "Align Center", command: "align-center"}, - button_alignright: {tooltip: "Align Right", command: "align-right"}, - button_borderon: {tooltip: "Borders On", command: "borderon"}, - button_borderoff: {tooltip: "Borders Off", command: "borderoff"}, - button_swapcolors: {tooltip: "Swap Colors", command: "swapcolors"}, - button_merge: {tooltip: "Merge Cells", command: "merge"}, - button_unmerge: {tooltip: "Unmerge Cells", command: "unmerge"}, - button_insertrow: {tooltip: "Insert Row", command: "insertrow"}, - button_insertcol: {tooltip: "Insert Column", command: "insertcol"}, - button_deleterow: {tooltip: "Delete Row", command: "deleterow"}, - button_deletecol: {tooltip: "Delete Column", command: "deletecol"}, - button_recalc: {tooltip: "Recalc", command: "recalc"} - } - - for (button in spreadsheet.Buttons) { - bele = document.getElementById(spreadsheet.idPrefix+button); - if (!bele) {alert("Button "+(spreadsheet.idPrefix+button)+" missing"); continue;} - bele.style.border = "1px solid "+scc.ISCButtonBorderNormal; - SocialCalc.TooltipRegister(bele, SCLoc(spreadsheet.Buttons[button].tooltip), {}); - SocialCalc.ButtonRegister(bele, - {normalstyle: "border:1px solid "+scc.ISCButtonBorderNormal+";backgroundColor:"+scc.ISCButtonBorderNormal+";", - hoverstyle: "border:1px solid "+scc.ISCButtonBorderHover+";backgroundColor:"+scc.ISCButtonBorderNormal+";", - downstyle: "border:1px solid "+scc.ISCButtonBorderDown+";backgroundColor:"+scc.ISCButtonDownBackground+";"}, - {MouseDown: SocialCalc.DoButtonCmd, command: spreadsheet.Buttons[button].command}); - } - - // create formula bar - - spreadsheet.formulabarDiv = document.createElement("div"); - spreadsheet.formulabarDiv.style.height = spreadsheet.formulabarheight + "px"; - spreadsheet.formulabarDiv.innerHTML = ' '; //' '; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - var inputbox = new SocialCalc.InputBox(spreadsheet.formulabarDiv.firstChild, spreadsheet.editor); - - for (button in spreadsheet.formulabuttons) { - bele = document.createElement("img"); - bele.id = spreadsheet.idPrefix+button; - bele.src = spreadsheet.imagePrefix+spreadsheet.formulabuttons[button].image; - bele.style.verticalAlign = "middle"; - bele.style.border = "1px solid #FFF"; - bele.style.marginLeft = "4px"; - SocialCalc.TooltipRegister(bele, SCLoc(spreadsheet.formulabuttons[button].tooltip), {}); - SocialCalc.ButtonRegister(bele, - {normalstyle: "border:1px solid #FFF;backgroundColor:#FFF;", - hoverstyle: "border:1px solid #CCC;backgroundColor:#FFF;", - downstyle: "border:1px solid #000;backgroundColor:#FFF;"}, - {MouseDown: spreadsheet.formulabuttons[button].command}); - spreadsheet.formulabarDiv.appendChild(bele); - } - - // initialize tabs that need it - - for (i=0; i 1 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 1; // restore what was there if reasonable - sele = document.getElementById(spreadsheet.idPrefix+"minorsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col=range.cr1.col; col<=range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = oldindex > 0 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 0; // default to [none] - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col=range.cr1.col; col<=range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = oldindex > 0 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 0; // default to [none] - - } - -// -// SocialCalc.CmdGotFocus(obj) -// -// Sets SocialCalc.Keyboard.passThru: obj should be element with focus or "true" -// - -SocialCalc.CmdGotFocus = function(obj) { - - SocialCalc.Keyboard.passThru = obj; - - } - - -// -// SocialCalc.DoButtonCmd(e, buttoninfo, bobj) -// - -SocialCalc.DoButtonCmd = function(e, buttoninfo, bobj) { - - SocialCalc.DoCmd(bobj.element, bobj.functionobj.command); - - } - -// -// SocialCalc.DoCmd(obj, which) -// -// xxx -// - -SocialCalc.DoCmd = function(obj, which) { - - var combostr, sstr, cl, i, clele, slist, slistele, str, sele, rele, lele, ele, sortrange, nrange, rparts; - var sheet, cell, color, bgcolor, defaultcolor, defaultbgcolor; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - switch (which) { - case "undo": - spreadsheet.ExecuteCommand("undo", ""); - break; - - case "redo": - spreadsheet.ExecuteCommand("redo", ""); - break; - - case "fill-rowcolstuff": - case "fill-text": - cl = which.substring(5); - clele = document.getElementById(spreadsheet.idPrefix+cl+"list"); - clele.length = 0; - for (i=0; i0) { - rele = document.getElementById(spreadsheet.idPrefix+"minorsortup"); - str += " "+sele.options[sele.selectedIndex].value + (rele.checked ? " up" : " down"); - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (sele.selectedIndex>0) { - rele = document.getElementById(spreadsheet.idPrefix+"lastsortup"); - str += " "+sele.options[sele.selectedIndex].value + (rele.checked ? " up" : " down"); - } - spreadsheet.ExecuteCommand(str, ""); - break; - - case "merge": - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - if (editor.range.hasrange) { // set ecell to upper left - editor.MoveECell(SocialCalc.crToCoord(editor.range.left, editor.range.top)); - editor.RangeRemove(); - } - break; - - case "movefrom": - if (editor.range2.hasrange) { // toggle if already there - spreadsheet.context.cursorsuffix = ""; - editor.Range2Remove(); - spreadsheet.ExecuteCommand("redisplay", ""); - } - else if (editor.range.hasrange) { // set range2 to range or one cell - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.MoveECell(SocialCalc.crToCoord(editor.range.left, editor.range.top)); - } - else { - editor.range2.top = editor.ecell.row; - editor.range2.right = editor.ecell.col; - editor.range2.bottom = editor.ecell.row; - editor.range2.left = editor.ecell.col; - editor.range2.hasrange = true; - } - str = editor.range2.hasrange ? "" : "off"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movefrom"); - ele.src=spreadsheet.imagePrefix+"movefrom"+str+".gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movepaste"); - ele.src=spreadsheet.imagePrefix+"movepaste"+str+".gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_moveinsert"); - ele.src=spreadsheet.imagePrefix+"moveinsert"+str+".gif"; - if (editor.range2.hasrange) editor.RangeRemove(); - break; - - case "movepaste": - case "moveinsert": - if (editor.range2.hasrange) { - spreadsheet.context.cursorsuffix = ""; - combostr = which+" "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord; - spreadsheet.ExecuteCommand(combostr, ""); - editor.Range2Remove(); - ele = document.getElementById(spreadsheet.idPrefix+"button_movefrom"); - ele.src=spreadsheet.imagePrefix+"movefromoff.gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movepaste"); - ele.src=spreadsheet.imagePrefix+"movepasteoff.gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_moveinsert"); - ele.src=spreadsheet.imagePrefix+"moveinsertoff.gif"; - } - break; - - case "swapcolors": - sheet = spreadsheet.sheet; - cell = sheet.GetAssuredCell(editor.ecell.coord); - defaultcolor = sheet.attribs.defaultcolor ? sheet.colors[sheet.attribs.defaultcolor] : "rgb(0,0,0)"; - defaultbgcolor = sheet.attribs.defaultbgcolor ? sheet.colors[sheet.attribs.defaultbgcolor] : "rgb(255,255,255)"; - color = cell.color ? sheet.colors[cell.color] : defaultcolor; // get color - if (color == defaultbgcolor) color = ""; // going to swap, so if same as background default, use default - bgcolor = cell.bgcolor ? sheet.colors[cell.bgcolor] : defaultbgcolor; - if (bgcolor == defaultcolor) bgcolor = ""; // going to swap, so if same as foreground default, use default - spreadsheet.ExecuteCommand("set %C color "+bgcolor+"%Nset %C bgcolor "+color, ""); - break; - - default: - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - break; - } - - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - - } - -SocialCalc.SpreadsheetCmdLookup = { - 'copy': 'copy %C all', - 'cut': 'cut %C all', - 'paste': 'paste %C all', - 'pasteformats': 'paste %C formats', - 'delete': 'erase %C formulas', - 'filldown': 'filldown %C all', - 'fillright': 'fillright %C all', - 'erase': 'erase %C all', - 'borderon': 'set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S', - 'borderoff': 'set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S', - 'merge': 'merge %C', - 'unmerge': 'unmerge %C', - 'align-left': 'set %C cellformat left', - 'align-center': 'set %C cellformat center', - 'align-right': 'set %C cellformat right', - 'align-default': 'set %C cellformat', - 'insertrow': 'insertrow %C', - 'insertcol': 'insertcol %C', - 'deleterow': 'deleterow %C', - 'deletecol': 'deletecol %C', - 'undo': 'undo', - 'redo': 'redo', - 'recalc': 'recalc' - } - -SocialCalc.SpreadsheetCmdSLookup = { - 'borderon': '1px solid rgb(0,0,0)', - 'borderoff': '' - } - -/******* NO LONGER USED - -SocialCalc.SpreadsheetCmdTable = { - cmd: [ - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"}, - {t:"Copy", s:"all", c:"copy %C %S"}, - {t:"Cut", s:"all", c:"cut %C %S"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Merge Cells", s:"none", c:"merge %C"}, - {t:"Unmerge", s:"none", c:"unmerge %C"}, - {t:"Sort", s:"sortcol", c:"sort %R %S"}, - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Cell Borders", s:"borderOnOff", c:"set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S"}, - {t:"Column Width", s:"colWidths", c:"set %W width %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"}, - {t:"Default Column Width", s:"colWidths", c:"set sheet defaultcolwidth %S"} - ], - rowcolstuff: [ - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"} - ], - text: [ - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Text Format", s:"tvf", c:"set %C textvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Text Format", s:"tvf", c:"set sheet defaulttextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"} - ], - slists: { - "colors": [ - {t:"Default", s:""}, - {t:"Black", s:"rgb(0,0,0)"}, - {t:"Dark Gray", s:"rgb(102,102,102)"}, // #666 - {t:"Gray", s:"rgb(204,204,204)"}, // #CCC - {t:"White", s:"rgb(255,255,255)"}, - {t:"Red", s:"rgb(255,0,0)"}, - {t:"Dark Red", s:"rgb(153,0,0)"}, - {t:"Orange", s:"rgb(255,153,0)"}, - {t:"Yellow", s:"rgb(255,255,0)"}, - {t:"Light Yellow", s:"rgb(255,255,204)"}, - {t:"Green", s:"rgb(0,255,0)"}, - {t:"Dark Green", s:"rgb(0,153,0)"}, - {t:"Blue", s:"rgb(0,0,255)"}, - {t:"Dark Blue", s:"rgb(0,0,153)"}, - {t:"Light Blue", s:"rgb(204,204,255)"} - ], - "fonts": [ // style weight size family - {t:"Default", s:""}, - {t:"Bold", s:"normal bold * *"}, - {t:"Italic", s:"italic normal * *"}, - {t:"Small", s:"* small *"}, - {t:"Medium", s:"* medium *"}, - {t:"Large", s:"* large *"}, - {t:"Bold Small", s:"normal bold small *"}, - {t:"Bold Medium", s:"normal bold medium *"}, - {t:"Bold Large", s:"normal bold large *"} - ], - "cellformat": [ - {t:"Default", s:""}, - {t:"Left", s:"left"}, - {t:"Right", s:"right"}, - {t:"Center", s:"center"} - ], - "borderOnOff": [ - {t:"On", s:"1px solid rgb(0,0,0)"}, - {t:"Off", s:""} - ], - "colWidths": [ - {t:"Default", s:""}, - {t:"20", s:"20"}, - {t:"40", s:"40"}, - {t:"60", s:"60"}, - {t:"80", s:"80"}, - {t:"100", s:"100"}, - {t:"120", s:"120"}, - {t:"140", s:"140"}, - {t:"160", s:"160"}, - {t:"180", s:"180"}, - {t:"200", s:"200"}, - {t:"220", s:"220"}, - {t:"240", s:"240"}, - {t:"260", s:"260"}, - {t:"280", s:"280"}, - {t:"300", s:"300"} - ], - "ntvf": [ - {t:"Default", s:""}, - {t:"1234", s:"0"}, - {t:"1,234", s:"#,##0"}, - {t:"1,234.5", s:"#,##0.0"}, - {t:"1,234.56", s:"#,##0.00"}, - {t:"1,234.567", s:"#,##0.000"}, - {t:"1,234%", s:"#,##0%"}, - {t:"1,234.5%", s:"#,##0.0%"}, - {t:"(1,234)", s:"#,##0_);(#,##0)"}, - {t:"(1,234.5)", s:"#,##0.0_);(#,##0.0)"}, - {t:"(1,234.56)", s:"#,##0.00_);(#,##0.00)"}, - {t:"00", s:"00"}, - {t:"000", s:"000"}, - {t:"0000", s:"0000"}, - {t:"$1,234.56", s:"$#,##0.00"}, - {t:"2006-01-04", s:"yyyy-mm-dd"}, - {t:"01:23:45", s:"hh:mm:ss"}, - {t:"2006-01-04 01:23:45", s:"yyyy-mm-dd hh:mm:ss"}, - {t:"Hidden", s:"hidden"} - ], - "tvf": [ - {t:"Default", s:""}, - {t:"Automatic", s:"general"}, - {t:"Plain Text", s:"text-plain"}, - {t:"HTML", s:"text-html"}, - {t:"Wiki", s:"text-wiki"}, - {t:"Hidden", s:"hidden"} - ], - "ffal": [ // Formulas, Formats, All - {t:"All", s:"all"}, - {t:"Contents", s:"formulas"}, - {t:"Formats", s:"formats"} - ], - "all": [ // All - {t:"All", s:"all"} - ], - "rowcol": [ - {t:"Row", s:"row"}, - {t:"Column", s:"col"} - ], - "sortcol": [ - {t:"A up", s:"A up"}, - {t:"B up", s:"B up"}, - {t:"C up", s:"C up"}, - {t:"A down", s:"A down"}, - {t:"B down", s:"B down"}, - {t:"C down", s:"C down"}, - {t:"A, B, C up", s:"A up B up C up"} - ], - "none": [ // nothing - {t:" ", s:" "} - ] - } - } -*********/ - -// -// SocialCalc.SpreadsheetControlExecuteCommand(obj, combostr, sstr) -// -// xxx -// - -SocialCalc.SpreadsheetControlExecuteCommand = function(obj, combostr, sstr) { - - var i, commands; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var eobj = spreadsheet.editor; - - var str = {}; - str.P = "%"; - str.N = "\n" - if (eobj.range.hasrange) { - str.R = SocialCalc.crToCoord(eobj.range.left, eobj.range.top)+ - ":"+SocialCalc.crToCoord(eobj.range.right, eobj.range.bottom); - str.C = str.R; - str.W = SocialCalc.rcColname(eobj.range.left) + ":" + SocialCalc.rcColname(eobj.range.right); - } - else { - str.C = eobj.ecell.coord; - str.R = eobj.ecell.coord+":"+eobj.ecell.coord; - str.W = SocialCalc.rcColname(SocialCalc.coordToCr(eobj.ecell.coord).col); - } - str.S = sstr; - combostr = combostr.replace(/%C/g, str.C); - combostr = combostr.replace(/%R/g, str.R); - combostr = combostr.replace(/%N/g, str.N); - combostr = combostr.replace(/%S/g, str.S); - combostr = combostr.replace(/%W/g, str.W); - combostr = combostr.replace(/%P/g, str.P); - - eobj.EditorScheduleSheetCommands(combostr, true, false); - - } - -// -// result = SocialCalc.SpreadsheetControlCreateSheetHTML(spreadsheet) -// -// Returns the HTML representation of the whole spreadsheet -// - -SocialCalc.SpreadsheetControlCreateSheetHTML = function(spreadsheet) { - - var context, div, ele; - - var result = ""; - - context = new SocialCalc.RenderContext(spreadsheet.sheet); - div = document.createElement("div"); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - result = div.innerHTML; - delete ele; - delete div; - return result; - - } - -// -// result = SocialCalc.SpreadsheetControlCreateCellHTML(spreadsheet, coord, linkstyle) -// -// Returns the HTML representation of a cell. Blank is "", not " ". -// - -SocialCalc.SpreadsheetControlCreateCellHTML = function(spreadsheet, coord, linkstyle) { - - var result = ""; - var cell = spreadsheet.sheet.cells[coord]; - - if (!cell) return ""; - - if (cell.displaystring == undefined) { - result = SocialCalc.FormatValueForDisplay(spreadsheet.sheet, cell.datavalue, coord, (linkstyle || spreadsheet.context.defaultHTMLlinkstyle)); - } - else { - result = cell.displaystring; - } - - if (result == " ") result = ""; - - return result; - - } - -// -// result = SocialCalc.SpreadsheetControlCreateCellHTMLSave(spreadsheet, range, linkstyle) -// -// Returns the HTML representation of a range of cells, or the whole sheet if range is null. -// The form is: -// version:1.0 -// coord:cell-HTML -// coord:cell-HTML -// ... -// -// Empty cells are skipped. The cell-HTML is encoded with ":"=>"\c", newline=>"\n", and "\"=>"\b". -// - -SocialCalc.SpreadsheetControlCreateCellHTMLSave = function(spreadsheet, range, linkstyle) { - - var cr1, cr2, row, col, coord, cell, cellHTML; - var result = []; - var prange; - - if (range) { - prange = SocialCalc.ParseRange(range); - } - else { - prange = {cr1: {row: 1, col:1}, - cr2: {row: spreadsheet.sheet.attribs.lastrow, col: spreadsheet.sheet.attribs.lastcol}}; - } - cr1 = prange.cr1; - cr2 = prange.cr2; - - result.push("version:1.0"); - - for (row=cr1.row; row <= cr2.row; row++) { - for (col=cr1.col; col <= cr2.col; col++) { - coord = SocialCalc.crToCoord(col, row); - cell=spreadsheet.sheet.cells[coord]; - if (!cell) continue; - if (cell.displaystring == undefined) { - cellHTML = SocialCalc.FormatValueForDisplay(spreadsheet.sheet, cell.datavalue, coord, (linkstyle || spreadsheet.context.defaultHTMLlinkstyle)); - } - else { - cellHTML = cell.displaystring; - } - if (cellHTML == " ") continue; - result.push(coord+":"+SocialCalc.encodeForSave(cellHTML)); - } - } - - result.push(""); // one extra to get extra \n - return result.join("\n"); - } - -// -// Formula Bar Button Routines -// - -SocialCalc.SpreadsheetControl.DoFunctionList = function() { - - var i, cname, str, f, ele; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var fcl = scc.function_classlist; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - scf.FillFunctionInfo(); - - str = '
    %loc!Category!
    '+ - '
      %loc!Functions!
    '+ - '
    '+ - '
    '+SocialCalc.SpreadsheetControl.GetFunctionInfoStr(scf.FunctionClasses[fcl[0]].items[0])+'
    '+ - '
    '+ - ' '+ - '
    '+ - '
    '; - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - str = ''+ - ''+ - '
    '+" %loc!Function List!"+' X 
    '+ - '
    '+str+'
    '; - - str = SocialCalc.LocalizeSubstrings(str); - - main.innerHTML = str; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"name"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide; if All, letter scrolls to there - - } - -SocialCalc.SpreadsheetControl.GetFunctionNamesStr = function(cname) { - - var i, f; - var scf = SocialCalc.Formula; - var str = ""; - - f = scf.FunctionClasses[cname]; - for (i=0; i':'>')+f.items[i]+''; - } - - return str; - - } - -SocialCalc.SpreadsheetControl.FillFunctionNames = function(cname, ele) { - - var i, f; - var scf = SocialCalc.Formula; - - ele.length = 0; - f = scf.FunctionClasses[cname]; - for (i=0; i
    "; - str += scsc(f[3]); - - return str; - - } - -SocialCalc.SpreadsheetControl.FunctionClassChosen = function(cname) { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - var scf = SocialCalc.Formula; - - SocialCalc.SpreadsheetControl.FillFunctionNames(cname, document.getElementById(idp+"name")); - - SocialCalc.SpreadsheetControl.FunctionChosen(scf.FunctionClasses[cname].items[0]); - - } - -SocialCalc.SpreadsheetControl.FunctionChosen = function(fname) { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - - document.getElementById(idp+"desc").innerHTML = SocialCalc.SpreadsheetControl.GetFunctionInfoStr(fname); - - } - -SocialCalc.SpreadsheetControl.HideFunctions = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById(spreadsheet.idPrefix+"functiondialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - } - -SocialCalc.SpreadsheetControl.DoFunctionPaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var ele = document.getElementById(spreadsheet.idPrefix+"functionname"); - var mele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - var text = ele.value+"("; - - SocialCalc.SpreadsheetControl.HideFunctions(); - - if (mele) { // multi-line editing is in progress - mele.value += text; - mele.focus(); - SocialCalc.CmdGotFocus(mele); - } - else { - editor.EditorAddToInput(text, "="); - } - - } - - -SocialCalc.SpreadsheetControl.DoMultiline = function() { - - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var str, ele, text; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"multiline"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - text = SocialCalc.special_chars(text); - - str = ''+ - '
    '+ - SCLocSS(' '+ - ' '+ - '
    '+ - '
    '); - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+ - SCLocSS(" %loc!Multi-line Input Box!")+' X 
    '+ - '
    '+str+'
    '; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"textarea"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide? - - } - - -SocialCalc.SpreadsheetControl.HideMultiline = function() { - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinedialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - - } - -SocialCalc.SpreadsheetControl.DoMultilineClear = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - ele.value = ""; - ele.focus(); - - } - - -SocialCalc.SpreadsheetControl.DoMultilinePaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - var text = ele.value; - - SocialCalc.SpreadsheetControl.HideMultiline(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - editor.EditorSaveEdit(text); - - } - - -SocialCalc.SpreadsheetControl.DoLink = function() { - - var SCLoc = SocialCalc.LocalizeString; - - var str, ele, text, cell, setformat, popup; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"link"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - if (text.charAt(0)=="'") { - text = text.slice(1); - } - - var parts = SocialCalc.ParseCellLinkText(text); - - text = SocialCalc.special_chars(text); - - cell = spreadsheet.sheet.cells[editor.ecell.coord]; - if (!cell || !cell.textvalueformat) { // set to link format, but don't override - setformat = " checked"; - } - else { - setformat = ""; - } - - popup = parts.newwin ? " checked" : ""; - - str = '
    '+ - ''+SCLoc("Description")+'
    '+ - '
    '+ - ''+SCLoc("URL")+'
    '+ - '
    '; - if (SocialCalc.Callbacks.MakePageLink) { // only show if handling pagenames here - str += ''+SCLoc("Page Name")+'
    '+ - '
    '+ - ''+SCLoc("Workspace")+'
    '+ - '
    '; - } - str += SocialCalc.LocalizeSubstrings(' '+ - '%loc!Set to Link format!
    '+ - ' '+ - '%loc!Show in new browser window!'+ - '
    '+ - '
    '+ - ' '+ - ' '+ - '
    '+ - ''); - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+SCLoc("Link Input Box")+' X 
    '+ - '
    '+str+'
    '; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"url"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide? - - } - - -SocialCalc.SpreadsheetControl.HideLink = function() { - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix+"linkdialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - - } - -SocialCalc.SpreadsheetControl.DoLinkClear = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - document.getElementById(spreadsheet.idPrefix+"linkdesc").value = ""; - document.getElementById(spreadsheet.idPrefix+"linkpagename").value = ""; - document.getElementById(spreadsheet.idPrefix+"linkworkspace").value = ""; - - var ele = document.getElementById(spreadsheet.idPrefix+"linkurl"); - ele.value = ""; - ele.focus(); - - } - - -SocialCalc.SpreadsheetControl.DoLinkPaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var descele = document.getElementById(spreadsheet.idPrefix+"linkdesc"); - var urlele = document.getElementById(spreadsheet.idPrefix+"linkurl"); - var pagenameele = document.getElementById(spreadsheet.idPrefix+"linkpagename"); - var workspaceele = document.getElementById(spreadsheet.idPrefix+"linkworkspace"); - var formatele = document.getElementById(spreadsheet.idPrefix+"linkformat"); - var popupele = document.getElementById(spreadsheet.idPrefix+"linkpopup"); - - var text = ""; - - var ltsym, gtsym, obsym, cbsym; - - if (popupele.checked) { - ltsym = "<<"; gtsym = ">>"; obsym = "[["; cbsym = "]]"; - } - else { - ltsym = "<"; gtsym = ">"; obsym = "["; cbsym = "]"; - } - - if (pagenameele && pagenameele.value) { - if (workspaceele.value) { - text = descele.value+"{"+workspaceele.value+obsym+pagenameele.value+cbsym+"}"; - } - else { - text = descele.value+obsym+pagenameele.value+cbsym; - } - } - else { - text = descele.value+ltsym+urlele.value+gtsym; - } - - SocialCalc.SpreadsheetControl.HideLink(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - if (formatele.checked) { - SocialCalc.SpreadsheetControlExecuteCommand(null, "set %C textvalueformat text-link", ""); - } - - editor.EditorSaveEdit(text); - - } - -SocialCalc.SpreadsheetControl.DoSum = function() { - - var cmd, cell, row, col, sel, cr, foundvalue; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var sheet = editor.context.sheetobj; - - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - cmd = "set "+SocialCalc.crToCoord(editor.range.right, editor.range.bottom+1)+ - " formula sum("+sel+")"; - } - else { - row = editor.ecell.row - 1; - col = editor.ecell.col; - if (row<=1) { - cmd = "set "+editor.ecell.coord+" constant e#REF! 0 #REF!"; - } - else { - foundvalue = false; - while (row>0) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (!cell.datatype || cell.datatype=="t") { - if (foundvalue) { - row++; - break; - } - } - else { - foundvalue = true; - } - row--; - } - cmd = "set "+editor.ecell.coord+" formula sum("+ - SocialCalc.crToCoord(col,row)+":"+SocialCalc.crToCoord(col, editor.ecell.row-1)+")"; - } - } - - editor.EditorScheduleSheetCommands(cmd, true, false); - - } - - -// -// TAB Routines -// - -// Sort - -SocialCalc.SpreadsheetControlSortOnclick = function(s, t) { - - var name, i; - var namelist = []; - var nl = document.getElementById(s.idPrefix+"sortlist"); - SocialCalc.LoadColumnChoosers(s); - s.editor.RangeChangeCallback.sort = SocialCalc.UpdateSortRangeProposal; - - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - nl.options[0] = new Option(SocialCalc.LocalizeString("[select range]")); - for (i=0; i0) { - rele = document.getElementById(spreadsheet.idPrefix+"minorsortup"); - str += ":"+sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } - else { - str += "::"; - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (sele.selectedIndex>0) { - rele = document.getElementById(spreadsheet.idPrefix+"lastsortup"); - str += ":"+sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } - else { - str += "::"; - } - return str+"\n"; - } - -SocialCalc.SpreadsheetControlSortLoad = function(editor, setting, line, flags) { - var parts, ele; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - parts = line.split(":"); - spreadsheet.sortrange = SocialCalc.decodeFromSave(parts[1]); - ele = document.getElementById(spreadsheet.idPrefix+"sortbutton"); - if (spreadsheet.sortrange) { - ele.value = SocialCalc.LocalizeString("Sort ")+spreadsheet.sortrange; - ele.style.visibility = "visible"; - } - else { - ele.style.visibility = "hidden"; - } - SocialCalc.LoadColumnChoosers(spreadsheet); - - sele = document.getElementById(spreadsheet.idPrefix+"majorsort"); - sele.selectedIndex = parts[2]-0; - document.getElementById(spreadsheet.idPrefix+"majorsort"+parts[3]).checked = true; - sele = document.getElementById(spreadsheet.idPrefix+"minorsort"); - if (parts[4]) { - sele.selectedIndex = parts[4]-0; - document.getElementById(spreadsheet.idPrefix+"minorsort"+parts[5]).checked = true; - } - else { - sele.selectedIndex = 0; - document.getElementById(spreadsheet.idPrefix+"minorsortup").checked = true; - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (parts[6]) { - sele.selectedIndex = parts[6]-0; - document.getElementById(spreadsheet.idPrefix+"lastsort"+parts[7]).checked = true; - } - else { - sele.selectedIndex = 0; - document.getElementById(spreadsheet.idPrefix+"lastsortup").checked = true; - } - - return true; - } - -// Comment - -SocialCalc.SpreadsheetControlCommentOnclick = function(s, t) { - s.editor.MoveECellCallback.comment = SocialCalc.SpreadsheetControlCommentMoveECell; - SocialCalc.SpreadsheetControlCommentDisplay(s, t); - SocialCalc.KeyboardFocus(); - return; - } - -SocialCalc.SpreadsheetControlCommentDisplay = function(s, t) { - var c = ""; - if (s.editor.ecell && s.editor.ecell.coord && s.sheet.cells[s.editor.ecell.coord]) { - c = s.sheet.cells[s.editor.ecell.coord].comment || ""; - } - document.getElementById(s.idPrefix+"commenttext").value = c; - } - -SocialCalc.SpreadsheetControlCommentMoveECell = function(editor) { - SocialCalc.SpreadsheetControlCommentDisplay(SocialCalc.GetSpreadsheetControlObject(), "comment"); - } - -SocialCalc.SpreadsheetControlCommentSet = function() { - var s=SocialCalc.GetSpreadsheetControlObject(); - s.ExecuteCommand("set %C comment "+SocialCalc.encodeForSave(document.getElementById(s.idPrefix+"commenttext").value)); - var cell=SocialCalc.GetEditorCellElement(s.editor, s.editor.ecell.row, s.editor.ecell.col); - s.editor.UpdateCellCSS(cell, s.editor.ecell.row, s.editor.ecell.col); - SocialCalc.KeyboardFocus(); - } - -SocialCalc.SpreadsheetControlCommentOnunclick = function(s, t) { - delete s.editor.MoveECellCallback.comment; - } - -// Names - -SocialCalc.SpreadsheetControlNamesOnclick = function(s, t) { - document.getElementById(s.idPrefix+"namesname").value = ""; - document.getElementById(s.idPrefix+"namesdesc").value = ""; - document.getElementById(s.idPrefix+"namesvalue").value = ""; - s.editor.RangeChangeCallback.names = SocialCalc.SpreadsheetControlNamesRangeChange; - s.editor.MoveECellCallback.names = SocialCalc.SpreadsheetControlNamesRangeChange; - SocialCalc.SpreadsheetControlNamesRangeChange(s.editor); - SocialCalc.SpreadsheetControlNamesFillNameList(); - SocialCalc.SpreadsheetControlNamesChangedName(); - } - -SocialCalc.SpreadsheetControlNamesFillNameList = function() { - var SCLoc = SocialCalc.LocalizeString; - var name, i; - var namelist = []; - var s=SocialCalc.GetSpreadsheetControlObject(); - var nl = document.getElementById(s.idPrefix+"nameslist"); - var currentname = document.getElementById(s.idPrefix+"namesname").value.toUpperCase().replace(/[^A-Z0-9_\.]/g, ""); - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - if (namelist.length > 0) { - nl.options[0] = new Option(SCLoc("[New]")); - } - else { - nl.options[0] = new Option(SCLoc("[None]")); - } - for (i=0; i 0) { - strtoedit = SocialCalc.special_chars(SocialCalc.OtherSaveParts[whichpart] || ""); - } - else { - strtoedit = "Listing of Parts\n"; - for (partname in SocialCalc.OtherSaveParts) { - strtoedit += SocialCalc.special_chars("\nPart: "+partname+"\n=====\n"+SocialCalc.OtherSaveParts[partname]+"\n"); - } - } - var editbox = document.createElement("div"); - editbox.style.cssText = "position:absolute;z-index:500;width:300px;height:300px;left:100px;top:200px;border:1px solid black;background-color:#EEE;text-align:center;"; - editbox.id = "socialcalc-editbox"; - editbox.innerHTML = whichpart+'



    '; - document.body.appendChild(editbox); - - var ebta = document.getElementById("socialcalc-editbox-textarea"); - ebta.focus(); - SocialCalc.CmdGotFocus(ebta); - - } - -SocialCalc.CtrlSEditorDone = function(idprefix, whichpart) { - - var edittextarea = document.getElementById(idprefix+"-textarea"); - var text = edittextarea.value; - if (whichpart.length > 0) { - if (text.length > 0) { - SocialCalc.OtherSaveParts[whichpart] = text; - } - else { - delete SocialCalc.OtherSaveParts[whichpart]; - } - } - - var editbox = document.getElementById(idprefix); - SocialCalc.KeyboardFocus(); - editbox.parentNode.removeChild(editbox); - - } - diff --git a/DeveloperAdoption/public/socialcalc/socialcalctableeditor.js b/DeveloperAdoption/public/socialcalc/socialcalctableeditor.js deleted file mode 100644 index dbaf5f9..0000000 --- a/DeveloperAdoption/public/socialcalc/socialcalctableeditor.js +++ /dev/null @@ -1,6256 +0,0 @@ -// -// SocialCalcTableEditor -// -/* -// The code module of the SocialCalc package that displays a scrolling grid with panes -// and handles keyboard and mouse I/O. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript TableEditor. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the TableEditor is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/xoattrib - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { // created here, too, in case load order is wrong, but main routines are required - SocialCalc = {}; - } - -// ************************************* -// -// Table Editor class: -// -// ************************************* - -// Constructor: - -SocialCalc.TableEditor = function(context) { - - var scc = SocialCalc.Constants; - - // Properties: - - this.context = context; // editing context - this.toplevel = null; // top level HTML element for this table editor - this.fullgrid = null; // rendered editing context - - this.noEdit = false; // if true, disable all edit UI and make read-only - - this.width = null; - this.tablewidth = null; - this.height = null; - this.tableheight = null; - - this.inputBox = null; - this.inputEcho = null; - this.verticaltablecontrol = null; - this.horizontaltablecontrol = null; - - this.logo = null; - - this.cellhandles = null; - - // Dynamic properties: - - this.timeout = null; // if non-null, timer id for position calculations - this.busy = false; // true when executing command, calculating, etc. - this.ensureecell = false; // if true, ensure ecell is visible after timeout - this.deferredCommands = []; // commands to execute after busy, in form: {cmdstr: "cmds", saveundo: t/f} - - this.gridposition = null; // screen coords of full grid - this.headposition = null; // screen coords of upper left of grid within header rows - this.firstscrollingrow = null; // row number of top row in last (the scrolling) pane - this.firstscrollingrowtop = null; // position of top row in last (the scrolling) pane - this.lastnonscrollingrow = null; // row number of last displayed row in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblerow = null; // used for paging down - this.firstscrollingcol = null; // column number of top col in last (the scrolling) pane - this.firstscrollingcolleft = null; // position of top col in last (the scrolling) pane - this.lastnonscrollingcol = null; // col number of last displayed column in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblecol = null; // used for paging right - - this.rowpositions = []; // screen positions of the top of some rows - this.colpositions = []; // screen positions of the left side of some rows - this.rowheight = []; // size in pixels of each row when last checked, or null/undefined, for page up - this.colwidth = []; // size in pixels of each column when last checked, or null/undefined, for page left - - this.ecell = null; // either null or {coord: c, row: r, col: c} - this.state = "start"; // the keyboard states: see EditorProcessKey - - this.workingvalues = {}; // values used during keyboard editing, etc. - - // Constants: - - this.imageprefix = scc.defaultImagePrefix; // URL prefix for images (e.g., "/images/sc") - this.idPrefix = scc.defaultTableEditorIDPrefix; - this.pageUpDnAmount = scc.defaultPageUpDnAmount; // number of rows to move cursor on PgUp/PgDn keys (numeric) - - // Callbacks - - // recalcFunction: if present, function(editor) {...}, called to do a recalc - // Default (sheet.RecalcSheet) does all the right stuff. - - this.recalcFunction = function(editor) { - if (editor.context.sheetobj.RecalcSheet) { - editor.context.sheetobj.RecalcSheet(SocialCalc.EditorSheetStatusCallback, editor); - } - else return null; - }; - - // ctrlkeyFunction: if present, function(editor, charname) {...}, called to handle ctrl-V, etc., at top level - // Returns true (pass through for continued processing) or false (stop processing this key). - - this.ctrlkeyFunction = function(editor, charname) { - - var ta, cell, position, cmd, sel, cliptext; - - switch (charname) { - case "[ctrl-c]": - case "[ctrl-x]": - ta = editor.pasteTextarea; - ta.value = ""; - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = (position.left-1)+"px"; - ta.style.top = (position.top-1)+"px"; - } - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - else { - sel = editor.ecell.coord; - } - - // get what to copy to clipboard - cliptext = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), "tab"); - - if (charname == "[ctrl-c]" || editor.noEdit) { // if copy or cut but in no edit - cmd = "copy "+sel+" formulas"; - } - else { // [ctrl-x] - cmd = "cut "+sel+" formulas"; - } - editor.EditorScheduleSheetCommands(cmd, true, false); // queue up command to put on SocialCalc clipboard - - ta.style.display = "block"; - ta.value = cliptext; // must follow "block" setting for Webkit - ta.focus(); - ta.select(); - window.setTimeout(function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; // in case not loaded - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var ta = editor.pasteTextarea; - ta.blur(); - ta.style.display = "none"; - SocialCalc.KeyboardFocus(); - }, 200); - - return true; - - case "[ctrl-v]": - if (editor.noEdit) return true; // not if no edit - ta = editor.pasteTextarea; - ta.value = ""; - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = (position.left-1)+"px"; - ta.style.top = (position.top-1)+"px"; - } - ta.style.display = "block"; - ta.value = ""; // must follow "block" setting for Webkit - ta.focus(); - window.setTimeout(function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var ta = editor.pasteTextarea; - var value = ta.value; - ta.blur(); - ta.style.display = "none"; - var cmd = ""; - var clipstr = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.Clipboard.clipboard, "tab"); - value = value.replace(/\r\n/g, "\n"); - // pastes SocialCalc clipboard if did a Ctrl-C and contents still the same - // Webkit adds an extra blank line, so need to allow for that - if (value != clipstr && (value.length-clipstr.length!=1 || value.substring(0,value.length-1)!=clipstr)) { - cmd = "loadclipboard "+ - SocialCalc.encodeForSave(SocialCalc.ConvertOtherFormatToSave(value, "tab")) + "\n"; - } - var cr; - if (editor.range.hasrange) { - cr = SocialCalc.crToCoord(editor.range.left, editor.range.top); - } - else { - cr = editor.ecell.coord; - } - cmd += "paste "+cr+" formulas"; - editor.EditorScheduleSheetCommands(cmd, true, false); - SocialCalc.KeyboardFocus(); - }, 200); - return true; - - case "[ctrl-z]": - editor.EditorScheduleSheetCommands("undo", true, false); - return false; - - case "[ctrl-s]": // !!!! temporary hack - if (!SocialCalc.Constants.AllowCtrlS) break; - window.setTimeout( - function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var sheet = editor.context.sheetobj; - var cell = sheet.GetAssuredCell(editor.ecell.coord); - var ntvf = cell.nontextvalueformat ? sheet.valueformats[cell.nontextvalueformat-0] || "" : ""; - var newntvf = window.prompt("Advanced Feature:\n\nCustom Numeric Format or Command", ntvf); - if (newntvf != null) { // not cancelled - if (newntvf.match(/^cmd:/)) { - cmd = newntvf.substring(4); // execute as command - } - else if (newntvf.match(/^edit:/)) { - cmd = newntvf.substring(5); // execute as command - if (SocialCalc.CtrlSEditor) { - SocialCalc.CtrlSEditor(cmd); - } - return; - } - else { - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - else { - sel = editor.ecell.coord; - } - cmd = "set "+sel+" nontextvalueformat "+newntvf; - } - editor.EditorScheduleSheetCommands(cmd, true, false); - } - }, - 200); - return false; - - default: - break; - } - return true; - }; - - // Set sheet's status callback: - - context.sheetobj.statuscallback = SocialCalc.EditorSheetStatusCallback; - context.sheetobj.statuscallbackparams = this; // this object: the table editor object - - - // StatusCallback: all values are called at appropriate times, add with unique name, delete when done - // - // Each value must be an object in the form of: - // - // func: function(editor, status, arg, params) {...}, - // params: params value to call func with - // - // The values for status and arg are: - // - // all the SocialCalc RecalcSheet statuscallbacks, including: - // - // calccheckdone, calclist length - // calcorder, {coord: coord, total: celllist length, count: count} - // calcstep, {coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds - // - // the command callbacks, like cmdstart and cmdend - // cmdendnorender - // - // calcstart, null - // moveecell, new ecell coord - // rangechange, "coord:coord" or "coord" or "" - // specialkey, keyname ("[esc]") - // - - this.StatusCallback = {}; - - - this.MoveECellCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.RangeChangeCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.SettingsCallbacks = {}; // See SocialCalc.SaveEditorSettings - - // Set initial cursor - - this.ecell = {coord: "A1", row: 1, col: 1}; - context.highlights[this.ecell.coord] = "cursor"; - - // Initialize range data - // Range has at least hasrange (true/false). - // It may also have: anchorcoord, anchorrow, anchorcol, top, bottom, left, and right. - - this.range = {hasrange: false}; - - // Initialize range2 data (used to show selections, such as for move) - // Range2 has at least hasrange (true/false). - // It may also have: top, bottom, left, and right. - - this.range2 = {hasrange: false}; - - } - -// Methods: - -SocialCalc.TableEditor.prototype.CreateTableEditor = function(width, height) {return SocialCalc.CreateTableEditor(this, width, height);}; -SocialCalc.TableEditor.prototype.ResizeTableEditor = function(width, height) {return SocialCalc.ResizeTableEditor(this, width, height);}; - -SocialCalc.TableEditor.prototype.SaveEditorSettings = function() {return SocialCalc.SaveEditorSettings(this);}; -SocialCalc.TableEditor.prototype.LoadEditorSettings = function(str, flags) {return SocialCalc.LoadEditorSettings(this, str, flags);}; - -SocialCalc.TableEditor.prototype.EditorRenderSheet = function() {SocialCalc.EditorRenderSheet(this);}; -SocialCalc.TableEditor.prototype.EditorScheduleSheetCommands = function(cmdstr, saveundo, ignorebusy) {SocialCalc.EditorScheduleSheetCommands(this, cmdstr, saveundo, ignorebusy);}; -SocialCalc.TableEditor.prototype.ScheduleSheetCommands = function(cmdstr, saveundo) { - this.context.sheetobj.ScheduleSheetCommands(cmdstr, saveundo); - }; -SocialCalc.TableEditor.prototype.SheetUndo = function() { - this.context.sheetobj.SheetUndo(); - }; -SocialCalc.TableEditor.prototype.SheetRedo = function() { - this.context.sheetobj.SheetRedo(); - }; -SocialCalc.TableEditor.prototype.EditorStepSet = function(status, arg) {SocialCalc.EditorStepSet(this, status, arg);}; -SocialCalc.TableEditor.prototype.GetStatuslineString = function(status, arg, params) {return SocialCalc.EditorGetStatuslineString(this, status, arg, params);}; - -SocialCalc.TableEditor.prototype.EditorMouseRegister = function() {return SocialCalc.EditorMouseRegister(this);}; -SocialCalc.TableEditor.prototype.EditorMouseUnregister = function() {return SocialCalc.EditorMouseUnregister(this);}; -SocialCalc.TableEditor.prototype.EditorMouseRange = function(coord) {return SocialCalc.EditorMouseRange(this, coord);}; - -SocialCalc.TableEditor.prototype.EditorProcessKey = function(ch, e) {return SocialCalc.EditorProcessKey(this, ch, e);}; -SocialCalc.TableEditor.prototype.EditorAddToInput = function(str, prefix) {return SocialCalc.EditorAddToInput(this, str, prefix);}; -SocialCalc.TableEditor.prototype.DisplayCellContents = function() {return SocialCalc.EditorDisplayCellContents(this);}; -SocialCalc.TableEditor.prototype.EditorSaveEdit = function(text) {return SocialCalc.EditorSaveEdit(this, text);}; -SocialCalc.TableEditor.prototype.EditorApplySetCommandsToRange = function(cmdline, type) {return SocialCalc.EditorApplySetCommandsToRange(this, cmdline, type);}; - -SocialCalc.TableEditor.prototype.MoveECellWithKey = function(ch) {return SocialCalc.MoveECellWithKey(this, ch);}; -SocialCalc.TableEditor.prototype.MoveECell = function(newcell) {return SocialCalc.MoveECell(this, newcell);}; -SocialCalc.TableEditor.prototype.ReplaceCell = function(cell, row, col) {SocialCalc.ReplaceCell(this, cell, row, col);}; -SocialCalc.TableEditor.prototype.UpdateCellCSS = function(cell, row, col) {SocialCalc.UpdateCellCSS(this, cell, row, col);}; -SocialCalc.TableEditor.prototype.SetECellHeaders = function(selected) {SocialCalc.SetECellHeaders(this, selected);}; -SocialCalc.TableEditor.prototype.EnsureECellVisible = function() {SocialCalc.EnsureECellVisible(this);}; -SocialCalc.TableEditor.prototype.RangeAnchor = function(coord) {SocialCalc.RangeAnchor(this, coord);}; -SocialCalc.TableEditor.prototype.RangeExtend = function(coord) {SocialCalc.RangeExtend(this, coord);}; -SocialCalc.TableEditor.prototype.RangeRemove = function() {SocialCalc.RangeRemove(this);}; -SocialCalc.TableEditor.prototype.Range2Remove = function() {SocialCalc.Range2Remove(this);}; - -SocialCalc.TableEditor.prototype.FitToEditTable = function() {SocialCalc.FitToEditTable(this);}; -SocialCalc.TableEditor.prototype.CalculateEditorPositions = function() {SocialCalc.CalculateEditorPositions(this);}; -SocialCalc.TableEditor.prototype.ScheduleRender = function() {SocialCalc.ScheduleRender(this);}; -SocialCalc.TableEditor.prototype.DoRenderStep = function() {SocialCalc.DoRenderStep(this);}; -SocialCalc.TableEditor.prototype.SchedulePositionCalculations = function() {SocialCalc.SchedulePositionCalculations(this);}; -SocialCalc.TableEditor.prototype.DoPositionCalculations = function() {SocialCalc.DoPositionCalculations(this);}; -SocialCalc.TableEditor.prototype.CalculateRowPositions = function(panenum, positions, sizes) {return SocialCalc.CalculateRowPositions(this, panenum, positions, sizes);}; -SocialCalc.TableEditor.prototype.CalculateColPositions = function(panenum, positions, sizes) {return SocialCalc.CalculateColPositions(this, panenum, positions, sizes);}; - -SocialCalc.TableEditor.prototype.ScrollRelative = function(vertical, amount) {SocialCalc.ScrollRelative(this, vertical, amount);}; -SocialCalc.TableEditor.prototype.ScrollRelativeBoth = function(vamount, hamount) {SocialCalc.ScrollRelativeBoth(this, vamount, hamount);}; -SocialCalc.TableEditor.prototype.PageRelative = function(vertical, direction) {SocialCalc.PageRelative(this, vertical, direction);}; -SocialCalc.TableEditor.prototype.LimitLastPanes = function() {SocialCalc.LimitLastPanes(this);}; - -SocialCalc.TableEditor.prototype.ScrollTableUpOneRow = function() {return SocialCalc.ScrollTableUpOneRow(this);}; -SocialCalc.TableEditor.prototype.ScrollTableDownOneRow = function() {return SocialCalc.ScrollTableDownOneRow(this);}; -SocialCalc.TableEditor.prototype.ScrollTableLeftOneCol = function() {return SocialCalc.ScrollTableLeftOneCol(this);}; -SocialCalc.TableEditor.prototype.ScrollTableRightOneCol = function() {return SocialCalc.ScrollTableRightOneCol(this);}; - -// Functions: - -SocialCalc.CreateTableEditor = function(editor, width, height) { - - var scc = SocialCalc.Constants; - var AssignID = SocialCalc.AssignID; - - editor.toplevel = document.createElement("div"); - editor.width = width; - editor.height = height; - - editor.griddiv = document.createElement("div"); - editor.tablewidth = width - scc.defaultTableControlThickness; - editor.tableheight = height - scc.defaultTableControlThickness; - editor.griddiv.style.width=editor.tablewidth+"px"; - editor.griddiv.style.height=editor.tableheight+"px"; - editor.griddiv.style.overflow="hidden"; - editor.griddiv.style.cursor="default"; - if (scc.cteGriddivClass) editor.griddiv.className = scc.cteGriddivClass; - AssignID(editor, editor.griddiv, "griddiv"); - - editor.FitToEditTable(); - - editor.EditorRenderSheet(); - - editor.griddiv.appendChild(editor.fullgrid); - - editor.verticaltablecontrol = new SocialCalc.TableControl(editor, true, editor.tableheight); - editor.verticaltablecontrol.CreateTableControl(); - AssignID(editor, editor.verticaltablecontrol.main, "tablecontrolv"); - - editor.horizontaltablecontrol = new SocialCalc.TableControl(editor, false, editor.tablewidth); - editor.horizontaltablecontrol.CreateTableControl(); - AssignID(editor, editor.horizontaltablecontrol.main, "tablecontrolh"); - - var table, tbody, tr, td, img, anchor, ta; - - table = document.createElement("table"); - editor.layouttable = table; - table.cellSpacing = 0; - table.cellPadding = 0; - AssignID(editor, table, "layouttable"); - - tbody = document.createElement("tbody"); - table.appendChild(tbody); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - td.appendChild(editor.griddiv); - tr.appendChild(td); - td = document.createElement("td"); - td.appendChild(editor.verticaltablecontrol.main); - tr.appendChild(td); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - td.appendChild(editor.horizontaltablecontrol.main); - tr.appendChild(td); - - td = document.createElement("td"); // logo display: Required by CPAL License for this code! - td.style.background="url("+editor.imageprefix+"logo.gif) no-repeat center center"; - td.innerHTML = "
    "; - tr.appendChild(td); - editor.logo = td; - AssignID(editor, editor.logo, "logo"); - SocialCalc.TooltipRegister(td.firstChild.firstChild, "SocialCalc", null); - - editor.toplevel.appendChild(editor.layouttable); - - if (!editor.noEdit) { - editor.inputEcho = new SocialCalc.InputEcho(editor); - AssignID(editor, editor.inputEcho.main, "inputecho"); - } - - editor.cellhandles = new SocialCalc.CellHandles(editor); - - ta = document.createElement("textarea"); // used for ctrl-c/ctrl-v where an invisible text area is needed - SocialCalc.setStyles(ta, "display:none;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);"); - ta.value = ""; - editor.pasteTextarea = ta; - AssignID(editor, editor.pasteTextarea, "pastetextarea"); - - if (navigator.userAgent.match(/Safari\//) &&!navigator.userAgent.match(/Chrome\//)) { // special code for Safari 5 change - window.removeEventListener('beforepaste', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforepaste', SocialCalc.SafariPasteFunction, false); - window.removeEventListener('beforecopy', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforecopy', SocialCalc.SafariPasteFunction, false); - window.removeEventListener('beforecut', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforecut', SocialCalc.SafariPasteFunction, false); - } - - editor.toplevel.appendChild(editor.pasteTextarea); - - SocialCalc.MouseWheelRegister(editor.toplevel, {WheelMove: SocialCalc.EditorProcessMouseWheel, editor: editor}); - - if (editor.inputBox) { // this seems to fix an obscure bug with Firefox 2 Mac where Ctrl-V doesn't get fired right - if (editor.inputBox.element) { - editor.inputBox.element.focus(); - editor.inputBox.element.blur(); - } - } - SocialCalc.KeyboardSetFocus(editor); - - // do status reporting things - - SocialCalc.EditorSheetStatusCallback(null, "startup", null, editor); - - // done - - return editor.toplevel; - - } - -// Special code needed for change that occurred with Safari 5 that made paste not work for some reason - -SocialCalc.SafariPasteFunction = function(e) { - e.preventDefault(); - } - -// -// SocialCalc.ResizeTableEditor(editor, width, height) -// -// Move things around as appropriate and resize -// - -SocialCalc.ResizeTableEditor = function(editor, width, height) { - - var scc = SocialCalc.Constants; - - editor.width = width; - editor.height = height; - - editor.toplevel.style.width = width+"px"; - editor.toplevel.style.height = height+"px"; - - editor.tablewidth = width - scc.defaultTableControlThickness; - editor.tableheight = height - scc.defaultTableControlThickness; - editor.griddiv.style.width=editor.tablewidth+"px"; - editor.griddiv.style.height=editor.tableheight+"px"; - - editor.verticaltablecontrol.main.style.height = editor.tableheight + "px"; - editor.horizontaltablecontrol.main.style.width = editor.tablewidth + "px"; - - editor.FitToEditTable(); - - editor.ScheduleRender(); - - return; - - } - -// -// str = SaveEditorSettings(editor) -// -// Returns a string representation of the pane settings, etc. -// -// The format is: -// -// version:1.0 -// rowpane:panenumber:firstnum:lastnum -// colpane:panenumber:firstnum:lastnum -// ecell:coord -- if set -// range:anchorcoord:top:bottom:left:right -- if set -// -// You can add additional values to be saved by using editor.SettingsCallbacks: -// -// editor.SettingsCallbacks["item-name"] = {save: savefunction, load: loadfunction} -// -// where savefunction(editor, "item-name") returns a string with the new lines to be added to the saved settings -// which include the trailing newlines, and loadfunction(editor, "item-name", line, flags) is given the line to process -// without the trailing newlines. -// - -SocialCalc.SaveEditorSettings = function(editor) { - - var i, setting; - var context = editor.context; - var range = editor.range; - var result = ""; - - result += "version:1.0\n"; - - for (i=0; i'; - } - - return sstr; - - } - - -// -// Mouse stuff -// - -SocialCalc.EditorMouseInfo = { - - // The registeredElements array is used to identify editor grid in which the mouse is doing things. - - // One item for each active editor, each an object with: - // .element, .editor - - registeredElements: [], - - editor: null, // editor being processed (between mousedown and mouseup) - element: null, // element being processed - - ignore: false, // if true, mousedowns are ignored - - mousedowncoord: "", // coord where mouse went down for drag range - mouselastcoord: "", // coord where mouse last was during drag - mouseresizecol: "", // col being resized - mouseresizeclientx: null, // where resize started - mouseresizedisplay: null // element tracking new size - } - -// -// EditorMouseRegister(editor) -// - -SocialCalc.EditorMouseRegister = function(editor) { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var element = editor.fullgrid; - var i; - - for (i=0; i=^".indexOf(inputtext.slice(-1))>=0 && inputtext.slice(0,1)=="=") || - (inputtext == "=")) { - wval.partialexpr = inputtext; - } - - if (wval.partialexpr) { // if in pointing operation - if (coord) { - if (range.hasrange) { - editor.inputBox.SetText(wval.partialexpr + SocialCalc.crToCoord(range.left, range.top) + ":" + - SocialCalc.crToCoord(range.right, range.bottom)); - } - else { - editor.inputBox.SetText(wval.partialexpr + coord); - } - } - } - else { // not in point -- done editing - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - } - break; - - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - break; - } - } - -SocialCalc.ProcessEditorMouseMove = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat(editor, result); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - if (result.coord!=mouseinfo.mouselastcoord) { - if (!e.shiftKey && !editor.range.hasrange) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - } - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - mouseinfo.mouselastcoord = result.coord; - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.ProcessEditorMouseUp = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result) return; - - if (!result.coord) result.coord = editor.ecell.coord; - - if (editor.range.hasrange) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - else if (result.coord && result.coord!=mouseinfo.mousedowncoord) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.ProcessEditorMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.ProcessEditorMouseUp, true); - } - else if (element.detachEvent) { // IE - element.detachEvent("onlosecapture", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmouseup", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmousemove", SocialCalc.ProcessEditorMouseMove); - element.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - - } - - -SocialCalc.ProcessEditorColsizeMouseDown = function(e, ele, result) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - mouseinfo.mouseresizecolnum = result.coltoresize; // remember col being resized - mouseinfo.mouseresizecol = SocialCalc.rcColname(result.coltoresize); - mouseinfo.mousedownclientx = clientX; - - var sizedisplay = document.createElement("div"); - mouseinfo.mouseresizedisplay = sizedisplay; - sizedisplay.style.width = "auto"; - sizedisplay.style.position = "absolute"; - sizedisplay.style.zIndex = 100; - sizedisplay.style.top = (editor.headposition.top+0)+"px"; - sizedisplay.style.left = editor.colpositions[result.coltoresize]+"px"; - sizedisplay.innerHTML = ''+ - '
     
    '+ - editor.context.colwidth[mouseinfo.mouseresizecolnum] + '
    '; - SocialCalc.setStyles(sizedisplay.firstChild.lastChild.firstChild.childNodes[0], "filter:alpha(opacity=85);opacity:.85;"); // so no warning msg with Firefox about filter - - editor.toplevel.appendChild(sizedisplay); - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mousemove", SocialCalc.ProcessEditorColsizeMouseMove, true); // capture everywhere - document.addEventListener("mouseup", SocialCalc.ProcessEditorColsizeMouseUp, true); // capture everywhere - } - else if (editor.toplevel.attachEvent) { // IE 5+ - editor.toplevel.setCapture(); - editor.toplevel.attachEvent("onmousemove", SocialCalc.ProcessEditorColsizeMouseMove); - editor.toplevel.attachEvent("onmouseup", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.attachEvent("onlosecapture", SocialCalc.ProcessEditorColsizeMouseUp); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - } - - -SocialCalc.ProcessEditorColsizeMouseMove = function(e) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - var newsize = (editor.context.colwidth[mouseinfo.mouseresizecolnum]-0) + (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) newsize = SocialCalc.Constants.defaultMinimumColWidth; - - var sizedisplay = mouseinfo.mouseresizedisplay; -// sizedisplay.firstChild.lastChild.firstChild.childNodes[1].firstChild.innerHTML = newsize+""; -// sizedisplay.firstChild.lastChild.firstChild.childNodes[0].firstChild.style.width = (newsize-2)+"px"; - sizedisplay.innerHTML = ''+ - '
     
    '+ - newsize + '
    '; - SocialCalc.setStyles(sizedisplay.firstChild.lastChild.firstChild.childNodes[0], "filter:alpha(opacity=85);opacity:.85;"); // so no warning msg with Firefox about filter - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.ProcessEditorColsizeMouseUp = function(e) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - element = mouseinfo.element; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.ProcessEditorColsizeMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.ProcessEditorColsizeMouseUp, true); - } - else if (editor.toplevel.detachEvent) { // IE - editor.toplevel.detachEvent("onlosecapture", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.detachEvent("onmouseup", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.detachEvent("onmousemove", SocialCalc.ProcessEditorColsizeMouseMove); - editor.toplevel.releaseCapture(); - } - - var newsize = (editor.context.colwidth[mouseinfo.mouseresizecolnum]-0) + (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) newsize = SocialCalc.Constants.defaultMinimumColWidth; - - editor.EditorScheduleSheetCommands("set "+mouseinfo.mouseresizecol+" width "+newsize, true, false); - - if (editor.timeout) window.clearTimeout(editor.timeout); - editor.timeout = window.setTimeout(SocialCalc.FinishColsize, 1); // wait - Firefox 2 has a bug otherwise with next mousedown - - return false; - - } - - -SocialCalc.FinishColsize = function() { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; - - editor.toplevel.removeChild(mouseinfo.mouseresizedisplay); - mouseinfo.mouseresizedisplay = null; - -// editor.FitToEditTable(); -// editor.EditorRenderSheet(); -// editor.SchedulePositionCalculations(); - - mouseinfo.editor = null; - - return; - - } - -// -// Handle auto-repeat of dragging the cursor into the borders of the sheet -// - -SocialCalc.AutoRepeatInfo = { - - timer: null, // timer object for repeating - mouseinfo: null, // result from SocialCalc.GridMousePosition - repeatinterval: 1000, // milliseconds to wait between repeats - editor: null, // editor object to use when it repeats - repeatcallback: null // used instead of default when repeating (e.g., for cellhandles) - // called as: repeatcallback(newcoord, direction) - -}; - -// Control auto-repeat. If mouseinfo==null, cancel. - -SocialCalc.SetDragAutoRepeat = function(editor, mouseinfo, callback) { - - var repeatinfo = SocialCalc.AutoRepeatInfo; - var coord, direction; - - repeatinfo.repeatcallback = callback; // null in regular case - - if (!mouseinfo) { // cancel - if (repeatinfo.timer) { // If was repeating, stop - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - repeatinfo.mouseinfo = null; - return; // done - } - - repeatinfo.editor = editor; - - if (repeatinfo.mouseinfo) { // check for change while repeating - if (mouseinfo.rowheader || mouseinfo.rowfooter) { - if (mouseinfo.row != repeatinfo.mouseinfo.row) { // changed row while dragging sidewards - coord = SocialCalc.crToCoord(editor.ecell.col, mouseinfo.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } - else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } - else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } - else { - editor.MoveECell(coord); - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } - else if (mouseinfo.colheader || mouseinfo.colfooter) { - if (mouseinfo.col != repeatinfo.mouseinfo.col) { // changed col while dragging vertically - coord = SocialCalc.crToCoord(mouseinfo.col, editor.ecell.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } - else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } - else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } - else { - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } - } - - repeatinfo.mouseinfo = mouseinfo; - - if (mouseinfo.distance < 5) repeatinfo.repeatinterval = 333; - else if (mouseinfo.distance < 10) repeatinfo.repeatinterval = 250; - else if (mouseinfo.distance < 25) repeatinfo.repeatinterval = 100; - else if (mouseinfo.distance < 35) repeatinfo.repeatinterval = 75; - else { // too far - stop repeating - if (repeatinfo.timer) { // if repeating, cancel it - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - return; - } - - if (!repeatinfo.timer) { // start if not already running - repeatinfo.timer = window.setTimeout(SocialCalc.DragAutoRepeat, repeatinfo.repeatinterval); - } - - return; - - } - -// -// DragAutoRepeat() -// - -SocialCalc.DragAutoRepeat = function() { - - var repeatinfo = SocialCalc.AutoRepeatInfo; - var mouseinfo = repeatinfo.mouseinfo; - - var direction, coord, cr; - - if (mouseinfo.rowheader) direction = "left"; - else if (mouseinfo.rowfooter) direction = "right"; - else if (mouseinfo.colheader) direction = "up"; - else if (mouseinfo.colfooter) direction = "down"; - - if (repeatinfo.repeatcallback) { - cr = SocialCalc.coordToCr(repeatinfo.editor.ecell.coord); - if (direction == "left" && cr.col > 1) cr.col--; - else if (direction == "right") cr.col++; - else if (direction == "up" && cr.row > 1) cr.row--; - else if (direction == "down") cr.row++; - coord = SocialCalc.crToCoord(cr.col, cr.row); - repeatinfo.repeatcallback(coord, direction); - } - else { - coord = repeatinfo.editor.MoveECellWithKey("[a"+direction+"]shifted"); - if (coord) repeatinfo.editor.EditorMouseRange(coord); - } - - repeatinfo.timer = window.setTimeout(SocialCalc.DragAutoRepeat, repeatinfo.repeatinterval); - - } - -// -// Handling Clicking -// - -SocialCalc.ProcessEditorDblClick = function(e) { - - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var mobj; - - if (mouseinfo.ignore) return; // ignore this - - for (mobj=null; !mobj && ele; ele=ele.parentNode) { // go up tree looking for one of our elements - mobj = SocialCalc.LookupElement(ele, mouseinfo.registeredElements); - } - if (!mobj) { - mouseinfo.editor = null; - return; // not one of our elements - } - - editor = mobj.editor; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); - if (!result || !result.coord) return; // not within cell area - ignore - - mouseinfo.editor = editor; // remember for later - mouseinfo.element = ele; - range = editor.range; - - sheetobj = editor.context.sheetobj; - - switch (editor.state) { - case "start": - SocialCalc.EditorOpenCellEdit(editor); - break; - - case "input": - break; - - default: - break; - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.EditorOpenCellEdit = function(editor) { - - var wval; - - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no input box, so no editing (happens on noEdit) - if (editor.inputBox.element.disabled) return true; // multi-line: ignore - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - editor.state = "inputboxdirect"; - editor.inputBox.SetText(""); - editor.inputBox.DisplayCellContents(); - editor.inputBox.Select("end"); - wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - - return; - - } - - -SocialCalc.EditorProcessKey = function(editor, ch, e) { - - var result, cell, cellobj, valueinfo, fch, coord, inputtext, f; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - var range = editor.range; - - if (typeof ch != "string") ch = ""; - - switch (editor.state) { - case "start": - if (e.shiftKey && ch.substr(0,2)=="[a") { - ch = ch + "shifted"; - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a" || ch.substr(0,3)=="[pg" || ch=="[home]") { - result = editor.MoveECellWithKey(ch); - return !result; - } - if (ch=="[del]" || ch=="[backspace]") { - if (!editor.noEdit) { - editor.EditorApplySetCommandsToRange("empty", ""); - } - break; - } - if (ch=="[esc]") { - if (range.hasrange) { - editor.RangeRemove(); - editor.MoveECell(range.anchorcoord); - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "specialkey", ch, editor.StatusCallback[f].params); - } - } - return false; - } - - if (ch=="[f2]") { - if (editor.noEdit) return true; - SocialCalc.EditorOpenCellEdit(editor); - return false; - } - - if ((ch.length>1 && ch.substr(0,1)=="[") || ch.length==0) { // some control key - if (editor.ctrlkeyFunction && ch.length>0) { - return editor.ctrlkeyFunction(editor, ch); - } - else { - return true; - } - } - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no inputBox so no editing - editor.inputBox.element.disabled = false; // make sure editable - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - editor.inputBox.SetText(ch); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - break; - - case "input": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (editor.inputBox.skipOne) return false; // ignore a key already handled - if (ch=="[esc]" || ch=="[enter]" || ch=="[tab]" || (ch && ch.substr(0,2)=="[a")) { - if (("(+-*/,:!&<>=^".indexOf(inputtext.slice(-1))>=0 && inputtext.slice(0,1)=="=") || - (inputtext == "=")) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { // if in pointing operation - if (e.shiftKey && ch.substr(0,2)=="[a") { - ch = ch + "shifted"; - } - coord = editor.MoveECellWithKey(ch); - if (coord) { - if (range.hasrange) { - editor.inputBox.SetText(wval.partialexpr + SocialCalc.crToCoord(range.left, range.top) + ":" + - SocialCalc.crToCoord(range.right, range.bottom)); - } - else { - editor.inputBox.SetText(wval.partialexpr + coord); - } - return false; - } - } - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch != "[esc]") { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a") { - editor.MoveECellWithKey(ch); - } - } - else { - editor.inputBox.DisplayCellContents(); - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - break; - } - if (wval.partialexpr && ch=="[backspace]") { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - return false; - } - if (ch=="[f2]") return false; - if (range.hasrange) { - editor.RangeRemove(); - } - editor.MoveECell(wval.ecoord); - if (wval.partialexpr) { - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - wval.partialexpr = ""; // not pointing - } - return true; - - case "inputboxdirect": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (ch=="[esc]" || ch=="[enter]" || ch=="[tab]") { - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch == "[esc]") { - editor.inputBox.DisplayCellContents(); - } - else { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a") { - editor.MoveECellWithKey(ch); - } - } - break; - } - if (ch=="[f2]") return false; - return true; - - case "skip-and-start": - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - return false; - - default: - return true; - } - - return false; - - } - -SocialCalc.EditorAddToInput = function(editor, str, prefix) { - - var wval = editor.workingvalues; - - if (editor.noEdit) return; - - switch (editor.state) { - case "start": - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.element.disabled = false; // make sure editable and overwrite old - editor.inputBox.Focus(); - editor.inputBox.SetText((prefix||"")+str); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.focus(); - if (wval.partialexpr) { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - editor.inputBox.SetText(editor.inputBox.GetText()+str); - break; - - default: - break; - } - - } - - -SocialCalc.EditorDisplayCellContents = function(editor) { - - if (editor.inputBox) editor.inputBox.DisplayCellContents(); - - } - -SocialCalc.EditorSaveEdit = function(editor, text) { - - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - type = "text t"; - value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord)+""; - if (value == oldvalue) { // no change - return; - } - fch = value.charAt(0); - if (fch=="=" && value.indexOf("\n")==-1) { - type = "formula"; - value = value.substring(1); - } - else if (fch=="'") { - type = "text t"; - value = value.substring(1); - } - else if (value.length==0) { - type = "empty"; - } - else { - valueinfo = SocialCalc.DetermineValueType(value) - if (valueinfo.type=="n" && value==(valueinfo.value+"")) { // see if don't need "constant" - type = "value n"; - } - else if (valueinfo.type.charAt(0)=="t") { - type = "text "+valueinfo.type; - } - else if (valueinfo.type=="") { - type = "text t"; - } - else { - type = "constant "+valueinfo.type+" "+valueinfo.value; - } - } - - if (type.charAt(0)=="t") { // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - cmdline = "set "+wval.ecoord+" "+type+" "+value; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - - } - -// -// SocialCalc.EditorApplySetCommandsToRange(editor, cmd) -// -// Takes ecell or range and does a "set" command with cmd. -// - -SocialCalc.EditorApplySetCommandsToRange = function(editor, cmd) { - - var cell, row, col, line, errortext; - - var sheetobj = editor.context.sheetobj; - var ecell = editor.ecell; - var range = editor.range; - - if (range.hasrange) { - coord = SocialCalc.crToCoord(range.left, range.top)+":"+SocialCalc.crToCoord(range.right, range.bottom); - line = "set "+coord+" "+cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } - else { - line = "set "+ecell.coord+" "+cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } - - editor.DisplayCellContents(); - - } - -SocialCalc.EditorProcessMouseWheel = function(event, delta, mousewheelinfo, wobj) { - - if (wobj.functionobj.editor.busy) return; // ignore if busy - - if (delta > 0) { - wobj.functionobj.editor.ScrollRelative(true, -1); - } - if (delta < 0) { - wobj.functionobj.editor.ScrollRelative(true, +1); - } - - } - -// -// GridMousePosition(editor, clientX, clientY) -// -// Returns an object with row and col numbers and coord (spans handled for coords), -// and rowheader/colheader true if in header (where coord will be undefined). -// If in colheader, will return coltoresize if on appropriate place in col header. -// Also, there is rowfooter (on right) and colfooter (on bottom). -// In row/col header/footer, returns "distance" as pixels over the edge. -// - -SocialCalc.GridMousePosition = function(editor, clientX, clientY) { - - var row, col, colpane; - var result = {}; - - for (row=1; rowclientY) { - break; - } - } - for (col=1; colclientX) { - break; - } - } - - result.row = row; - result.col = col; - - if (editor.headposition) { - if (clientX < editor.headposition.left && clientX >= editor.gridposition.left) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } - else if (clientY < editor.headposition.top && clientY > editor.gridposition.top) { // > because of sizing row - result.colheader = true; - result.distance = editor.headposition.top - clientY; - result.coltoresize = col-(editor.colpositions[col]+editor.colwidth[col]/2>clientX?1:0) || 1; - for (colpane=0; colpane= editor.context.colpanes[colpane].first && - result.coltoresize <= editor.context.colpanes[colpane].last) { // visible column - return result; - } - } - delete result.coltoresize; - return result; - } - else if (clientX >= editor.verticaltablecontrol.controlborder) { - result.rowfooter = true; - result.distance = clientX - editor.verticaltablecontrol.controlborder; - return result; - } - else if (clientY >= editor.horizontaltablecontrol.controlborder) { - result.colfooter = true; - result.distance = clientY - editor.horizontaltablecontrol.controlborder; - return result; - } - else if (clientX < editor.gridposition.left) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } - else if (clientY <= editor.gridposition.top) { - result.colheader = true; - result.distance = editor.headposition.top - clientY; - return result; - } - else { - result.coord = SocialCalc.crToCoord(result.col, result.row); - if (editor.context.cellskip[result.coord]) { // handle skipped cells - result.coord = editor.context.cellskip[result.coord]; - } - return result; - } - } - - return null; - - } - -// -// GetEditorCellElement(editor, row, col) -// -// Returns an object with element, the table cell element in the DOM that corresponds to row and column, -// as well as rowpane and colpane, the panes with the cell. -// If no such element, then returns null; -// - -SocialCalc.GetEditorCellElement = function(editor, row, col) { - - var rowpane, colpane, c, coord; - var rowindex = 0; - var colindex = 0; - - for (rowpane=0; rowpane= editor.context.rowpanes[rowpane].first && row <= editor.context.rowpanes[rowpane].last) { - for (colpane=0; colpane= editor.context.colpanes[colpane].first && col <= editor.context.colpanes[colpane].last) { - rowindex += row - editor.context.rowpanes[rowpane].first + 2; - for (c=editor.context.colpanes[colpane].first; c<=col; c++) { - coord=editor.context.cellskip[SocialCalc.crToCoord(c,row)]; - if (!coord || !editor.context.CoordInPane(coord, rowpane, colpane)) // don't count col-spanned cells - colindex++; - } - return { - element: editor.griddiv.firstChild.lastChild.childNodes[rowindex].childNodes[colindex], - rowpane: rowpane, colpane: colpane}; - } - for (c=editor.context.colpanes[colpane].first; c<=editor.context.colpanes[colpane].last; c++) { - coord=editor.context.cellskip[SocialCalc.crToCoord(c,row)]; - if (!coord || !editor.context.CoordInPane(coord, rowpane, colpane)) // don't count col-spanned cells - colindex++; - } - colindex += 1; - } - } - rowindex += editor.context.rowpanes[rowpane].last - editor.context.rowpanes[rowpane].first + 1 + 1; - } - - return null; -} - -// -// cellcoord = MoveECellWithKey(editor, ch) -// -// Processes an arrow key, etc., moving the edit cell. -// If not a movement key, returns null. -// - -SocialCalc.MoveECellWithKey = function(editor, ch) { - - var coord, row, col, cell; - var shifted = false; - - if (!editor.ecell) { - return null; - } - - if (ch.slice(-7)=="shifted") { - ch = ch.slice(0,-7); - shifted = true; - } - - row = editor.ecell.row; - col = editor.ecell.col; - cell = editor.context.sheetobj.cells[editor.ecell.coord]; - - switch (ch) { - case "[adown]": - row += (cell && cell.rowspan) || 1; - break; - case "[aup]": - row--; - break; - case "[pgdn]": - row += editor.pageUpDnAmount - 1 + ((cell && cell.rowspan) || 1); - break; - case "[pgup]": - row -= editor.pageUpDnAmount; - break; - case "[aright]": - col += (cell && cell.colspan) || 1; - break; - case "[aleft]": - col--; - break; - case "[home]": - row = 1; - col = 1; - break; - default: - return null; - } - - if (!editor.range.hasrange) { - if (shifted) - editor.RangeAnchor(); - } - - coord = editor.MoveECell(SocialCalc.crToCoord(col, row)); - - if (editor.range.hasrange) { - if (shifted) - editor.RangeExtend(); - else - editor.RangeRemove(); - } - - return coord; - - } - -// -// cellcoord = MoveECell(editor, newecell) -// -// Takes a coordinate and returns the new edit cell coordinate (which may be -// different if newecell is covered by a span). -// - -SocialCalc.MoveECell = function(editor, newcell) { - - var cell, f; - - var highlights = editor.context.highlights; - - if (editor.ecell) { - if (editor.ecell.coord==newcell) return newcell; // already there - don't do anything and don't tell anybody - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - delete highlights[editor.ecell.coord]; - if (editor.range2.hasrange && - editor.ecell.row>=editor.range2.top && editor.ecell.row<=editor.range2.bottom && - editor.ecell.col>=editor.range2.left && editor.ecell.col<=editor.range2.right) { - highlights[editor.ecell.coord] = "range2"; - } - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders(""); // set to regular col/rowname styles - editor.cellhandles.ShowCellHandles(false); - } - newcell = editor.context.cellskip[newcell] || newcell; - editor.ecell = SocialCalc.coordToCr(newcell); - editor.ecell.coord = newcell; - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - highlights[newcell] = "cursor"; - - for (f in editor.MoveECellCallback) { // let others know - editor.MoveECellCallback[f](editor); - } - - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders("selected"); - - for (f in editor.StatusCallback) { // let status line, etc., know - editor.StatusCallback[f].func(editor, "moveecell", newcell, editor.StatusCallback[f].params); - } - - if (editor.busy) { - editor.ensureecell = true; // wait for when not busy - } - else { - editor.ensureecell = false; - editor.EnsureECellVisible(); - } - - return newcell; - - } - -SocialCalc.EnsureECellVisible = function(editor) { - - var vamount = 0; - var hamount = 0; - - if (editor.ecell.row > editor.lastnonscrollingrow) { - if (editor.ecell.row < editor.firstscrollingrow) { - vamount = editor.ecell.row - editor.firstscrollingrow; - } - else if (editor.ecell.row > editor.lastvisiblerow) { - vamount = editor.ecell.row - editor.lastvisiblerow; - } - } - if (editor.ecell.col > editor.lastnonscrollingcol) { - if (editor.ecell.col < editor.firstscrollingcol) { - hamount = editor.ecell.col - editor.firstscrollingcol; - } - else if (editor.ecell.col > editor.lastvisiblecol) { - hamount = editor.ecell.col- editor.lastvisiblecol; - } - } - - if (vamount!=0 || hamount!=0) { - editor.ScrollRelativeBoth(vamount, hamount); - } - else { - editor.cellhandles.ShowCellHandles(true); - } - - } - -SocialCalc.ReplaceCell = function(editor, cell, row, col) { - - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell(row, col, cell.rowpane, cell.colpane, true, null); - if (newelement) { - // Don't use a real element and replaceChild, which seems to have focus issues with IE, Firefox, and speed issues - cell.element.innerHTML = newelement.innerHTML; - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a]!="cssText") - cell.element.style[a] = newelement.style[a]; - } - } - } - - -SocialCalc.UpdateCellCSS = function(editor, cell, row, col) { - - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell(row, col, cell.rowpane, cell.colpane, true, null); - if (newelement) { - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a]!="cssText") - cell.element.style[a] = newelement.style[a]; - } - } - } - - -SocialCalc.SetECellHeaders = function(editor, selected) { - - var ecell = editor.ecell; - var context = editor.context; - - var rowpane, colpane, first, last; - var rowindex = 0; - var colindex = 0; - var headercell; - - if (!ecell) return; - - for (rowpane=0; rowpane= first && ecell.row <= last) { - headercell = editor.fullgrid.childNodes[1].childNodes[2+rowindex+ecell.row-first].childNodes[0]; - if (headercell) { - if (context.classnames) headercell.className=context.classnames[selected+"rowname"]; - if (context.explicitStyles) headercell.style.cssText=context.explicitStyles[selected+"rowname"]; - headercell.style.verticalAlign="top"; // to get around Safari making top of centered row number be - // considered top of row (and can't get position in Safari) - } - } - rowindex += last - first + 1 + 1; - } - - for (colpane=0; colpane= first && ecell.col <= last) { - headercell = editor.fullgrid.childNodes[1].childNodes[1].childNodes[1+colindex+ecell.col-first]; - if (headercell) { - if (context.classnames) headercell.className=context.classnames[selected+"colname"]; - if (context.explicitStyles) headercell.style.cssText=context.explicitStyles[selected+"colname"]; - } - } - colindex += last - first + 1 + 1; - } - } - -// -// RangeAnchor(editor, ecoord) -// -// Sets the anchor of a range to ecoord (or ecell if missing). -// - -SocialCalc.RangeAnchor = function(editor, ecoord) { - - if (editor.range.hasrange) { - editor.RangeRemove(); - } - - editor.RangeExtend(ecoord); - - } - -// -// RangeExtend(editor, ecoord) -// -// Sets the other corner of the range to ecoord or, if missing, ecell. -// - -SocialCalc.RangeExtend = function(editor, ecoord) { - - var a, cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - var ecell; - if (ecoord) { - ecell = SocialCalc.coordToCr(ecoord); - ecell.coord = ecoord; - } - else ecell = editor.ecell; - - if (!ecell) return; // just in case - - if (!range.hasrange) { // called without RangeAnchor... - range.anchorcoord = ecell.coord; - range.anchorrow = ecell.row; - range.top = ecell.row; - range.bottom = ecell.row; - range.anchorcol = ecell.col; - range.left = ecell.col; - range.right = ecell.col; - range.hasrange = true; - } - - if (range.anchorrow < ecell.row) { - range.top = range.anchorrow; - range.bottom = ecell.row; - } - else { - range.top = ecell.row; - range.bottom = range.anchorrow; - } - if (range.anchorcol < ecell.col) { - range.left = range.anchorcol; - range.right = ecell.col; - } - else { - range.left = ecell.col; - range.right = range.anchorcol; - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - highlights[coord] = "unrange"; - break; - case "range2": - highlights[coord] = "unrange2"; - break; - } - } - - for (row=range.top; row<=range.bottom; row++) { - for (col=range.left; col<=range.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange": - highlights[coord] = "range"; - break; - case "cursor": - break; - case "unrange2": - default: - highlights[coord] = "newrange"; - break; - } - } - } - - for (row=range2.top; range2.hasrange && row<=range2.bottom; row++) { - for (col=range2.left; col<=range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange2": - highlights[coord] = "range2"; - break; - case "range": - case "newrange": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - - switch (highlights[coord]) { - case "unrange": - delete highlights[coord]; - break; - case "newrange": - highlights[coord] = "range"; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "range": - case "range2": - case "cursor": - continue; - } - - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - - } - - for (f in editor.RangeChangeCallback) { // let others know - editor.RangeChangeCallback[f](editor); - } - - // create range/coord string and do status callback - - coord = SocialCalc.crToCoord(editor.range.left, editor.range.top); - if (editor.range.left!=editor.range.right || editor.range.top!=editor.range.bottom) { // more than one cell - coord += ":" + SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "rangechange", coord, editor.StatusCallback[f].params); - } - - return; - - } - -// -// RangeRemove(editor) -// -// Turns off the range. -// - -SocialCalc.RangeRemove = function(editor) { - - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - if (!range.hasrange && !range2.hasrange) return; - - for (row=range2.top; range2.hasrange && row<=range2.bottom; row++) { - for (col=range2.left; col<=range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "range": - highlights[coord] = "newrange2"; - break; - case "range2": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - delete highlights[coord]; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell=SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range.hasrange = false; - - for (f in editor.RangeChangeCallback) { // let others know - editor.RangeChangeCallback[f](editor); - } - - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "rangechange", "", editor.StatusCallback[f].params); - } - - return; - - } - -// -// Range2Remove(editor) -// -// Turns off the range2. -// - -SocialCalc.Range2Remove = function(editor) { - - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range2 = editor.range2; - - if (!range2.hasrange) return; - - for (coord in highlights) { - switch (highlights[coord]) { - case "range2": - delete highlights[coord]; - break; - case "range": - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell=SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range2.hasrange = false; - - return; - - } - -// -// FitToEditTable(editor) -// -// Figure out (through column width declarations and approximation of pixels per row) -// how many rendered rows and columns you need to be at least a little larger than -// the editor's editing area. -// - -SocialCalc.FitToEditTable = function(editor) { - - var colnum, colname, colwidth, totalwidth, totalrows, rowpane, needed; - - var context=editor.context; - var sheetobj=context.sheetobj; - var sheetcolattribs=sheetobj.colattribs; - - // Calculate column width data - - totalwidth=context.showRCHeaders ? context.rownamewidth-0 : 0; - for (colpane=0; colpane0)) ? (colwidth-0) : 10; - } - } - - for (colnum=context.colpanes[colpane].first; colnum<=10000; colnum++) { //!!! max for safety, but makes that col max!!! - colname=SocialCalc.rcColname(colnum); - colwidth = sheetobj.colattribs.width[colname] || sheetobj.attribs.defaultcolwidth || SocialCalc.Constants.defaultColWidth; - if (colwidth=="blank" || colwidth=="auto") colwidth=""; - totalwidth+=(colwidth && ((colwidth-0)>0)) ? (colwidth-0) : 10; - if (totalwidth > editor.tablewidth) break; - } - - context.colpanes[colpane].last = colnum; - - // Calculate row height data - - totalrows=context.showRCHeaders ? 1 : 0; - for (rowpane=0; rowpaneeditor.gridposition.top+editor.tableheight) break; - } - editor.lastvisiblerow = i-1; - - editor.colpositions = []; - for (colpane=0; colpaneeditor.gridposition.left+editor.tablewidth) break; - } - editor.lastvisiblecol = i-1; - - editor.firstscrollingrow = editor.context.rowpanes[editor.context.rowpanes.length-1].first; - editor.firstscrollingrowtop = editor.rowpositions[editor.firstscrollingrow] || editor.headposition.top; - editor.lastnonscrollingrow = editor.context.rowpanes.length-1 > 0 ? - editor.context.rowpanes[editor.context.rowpanes.length-2].last : 0; - editor.firstscrollingcol = editor.context.colpanes[editor.context.colpanes.length-1].first; - editor.firstscrollingcolleft = editor.colpositions[editor.firstscrollingcol] || editor.headposition.left; - editor.lastnonscrollingcol = editor.context.colpanes.length-1 > 0 ? - editor.context.colpanes[editor.context.colpanes.length-2].last : 0; - - // Now do the table controls - - editor.verticaltablecontrol.ComputeTableControlPositions(); - editor.horizontaltablecontrol.ComputeTableControlPositions(); - } - -// -// ScheduleRender(editor) -// -// Do a series of timeouts to render the sheet, wait for background layout and -// rendering by the browser, and then update editor visuals, sliders, etc. -// - -SocialCalc.ScheduleRender = function(editor) { - - if (editor.timeout) window.clearTimeout(editor.timeout); // in case called more than once, just use latest - - SocialCalc.EditorSheetStatusCallback(null, "schedrender", null, editor); - SocialCalc.EditorStepInfo.editor = editor; - editor.timeout = window.setTimeout(SocialCalc.DoRenderStep, 1); - - } - -// DoRenderStep() -// - -SocialCalc.DoRenderStep = function() { - - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - editor.EditorRenderSheet(); - - SocialCalc.EditorSheetStatusCallback(null, "renderdone", null, editor); - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - - } - -// -// SocialCalc.SchedulePositionCalculations(editor) -// - -SocialCalc.SchedulePositionCalculations = function(editor) { - - SocialCalc.EditorStepInfo.editor = editor; - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - - } - -// DoPositionCalculations(editor) -// -// Update editor visuals, sliders, etc. -// -// Note: Only call this after the DOM objects have been modified and rendered! -// - -SocialCalc.DoPositionCalculations = function() { - - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - editor.CalculateEditorPositions(); - editor.verticaltablecontrol.PositionTableControlElements(); - editor.horizontaltablecontrol.PositionTableControlElements(); - - SocialCalc.EditorSheetStatusCallback(null, "doneposcalc", null, editor); - - if (editor.ensureecell && editor.ecell && !editor.deferredCommands.length) { // don't do if deferred cmd to execute - editor.ensureecell = false; - editor.EnsureECellVisible(); // this could cause another redisplay - } - - editor.cellhandles.ShowCellHandles(true); - - -//!!! Need to now check to see if this positioned controls out of the editing area -//!!! (such as when there is a large wrapped cell and it pushes the pane boundary too far down). - - } - -SocialCalc.CalculateRowPositions = function(editor, panenum, positions, sizes) { - - var toprow, rowpane, rownum, offset, trowobj, cellposition; - - var context=editor.context; - var sheetobj=context.sheetobj; - - var tbodyobj; - - if (!context.showRCHeaders) throw("Needs showRCHeaders=true"); - - tbodyobj=editor.fullgrid.lastChild; - - // Calculate start of this pane as row in this table: - - toprow = 2; - for (rowpane=0; rowpane1 ? context.rowpanes[vplen-2].last+1 : 1; // don't scroll past here - if (context.rowpanes[vplen-1].first+vamount < vlimit) { // limit amount - vamount = (-context.rowpanes[vplen-1].first) + vlimit; - } - - var hplen=context.colpanes.length; - var hlimit = hplen>1 ? context.colpanes[hplen-2].last+1 : 1; // don't scroll past here - if (context.colpanes[hplen-1].first+hamount < hlimit) { // limit amount - hamount = (-context.colpanes[hplen-1].first) + hlimit; - } - - if ((vamount==1 || vamount==-1) && hamount==0) { // special case quick scrolls - if (vamount==1) { - editor.ScrollTableUpOneRow(); - } - else { - editor.ScrollTableDownOneRow(); - } - if (editor.ecell) editor.SetECellHeaders("selected"); - editor.SchedulePositionCalculations(); - return; - } - - // Do a gross move and render - - if (vamount!=0 || hamount!=0) { - context.rowpanes[vplen-1].first += vamount; - context.rowpanes[vplen-1].last += vamount; - context.colpanes[hplen-1].first += hamount; - context.colpanes[hplen-1].last += hamount; - editor.FitToEditTable(); - editor.ScheduleRender(); - } - - } - - -// PageRelative(editor, vertical, direction) -// -// If vertical true, pages up(direction is -)/down(+), else left(-)/right(+) - -SocialCalc.PageRelative = function(editor, vertical, direction) { - - var context=editor.context; - var panes=vertical ? "rowpanes" : "colpanes"; - var lastpane=context[panes][context[panes].length-1]; - var lastvisible=vertical ? "lastvisiblerow" : "lastvisiblecol"; - var sizearray=vertical ? editor.rowheight : editor.colwidth; - var defaultsize=vertical ? SocialCalc.Constants.defaultAssumedRowHeight : SocialCalc.Constants.defaultColWidth; - var size, newfirst, totalsize, current; - - if (direction > 0) { // down/right - newfirst = editor[lastvisible]; - if (newfirst == lastpane.first) newfirst += 1; // move at least one - } - else { - if (vertical) { // calculate amount to scroll - totalsize = editor.tableheight - (editor.firstscrollingrowtop - editor.gridposition.top); - } - else { - totalsize = editor.tablewidth - (editor.firstscrollingcolleft - editor.gridposition.left); - } - totalsize -= sizearray[editor[lastvisible]] > 0 ? sizearray[editor[lastvisible]] : defaultsize; - - for (newfirst=lastpane.first-1; newfirst>0; newfirst--) { - size = sizearray[newfirst] > 0 ? sizearray[newfirst] : defaultsize; - if (totalsize < size) break; - totalsize -= size; - } - - current = lastpane.first; - if (newfirst >= current) newfirst = current-1; // move at least 1 - if (newfirst < 1) newfirst = 1; - } - - lastpane.first = newfirst; - lastpane.last = newfirst+1; - editor.LimitLastPanes(); - editor.FitToEditTable(); - editor.ScheduleRender(); - - } - -// LimitLastPanes(editor) -// -// Makes sure that the "first" of the last panes isn't before the last of the previous pane -// - -SocialCalc.LimitLastPanes = function(editor) { - - var context=editor.context; - var plen; - - plen = context.rowpanes.length; - if (plen>1 && context.rowpanes[plen-1].first <= context.rowpanes[plen-2].last) - context.rowpanes[plen-1].first = context.rowpanes[plen-2].last+1; - - plen = context.colpanes.length; - if (plen>1 && context.colpanes[plen-1].first <= context.colpanes[plen-2].last) - context.colpanes[plen-1].first = context.colpanes[plen-2].last+1; - - } - -SocialCalc.ScrollTableUpOneRow = function(editor) { - - var toprow, rowpane, rownum, colnum, colpane, cell, oldrownum, maxspan, newbottomrow, newrow, oldchild, bottomrownum; - var rowneedsrefresh={}; - - var context=editor.context; - var sheetobj=context.sheetobj; - var tableobj=editor.fullgrid; - - var tbodyobj; - - tbodyobj=tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane=0; rowpanemaxrowspan) maxrowspan=cell.rowspan; - } - } - - if (maxrowspan>1) { - for (rownum=1; rownum= context.rowpanes[rowpane].last) break; - newrow=context.RenderRow(rownum+oldrownum, rowpane); - oldchild=tbodyobj.childNodes[toprow+rownum-1]; - tbodyobj.replaceChild(newrow,oldchild); - } - } - - // if added a row that includes rowspans from above, update the size of those to include new row - - bottomrownum=context.rowpanes[rowpane].last; - - for (colpane=0; colpane1) rowneedsrefresh[rownum]=true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow=context.RenderRow(rownum, rowpane); - oldchild=tbodyobj.childNodes[(toprow+(rownum-context.rowpanes[rowpane].first))]; - tbodyobj.replaceChild(newrow,oldchild); - } - - return tableobj; - } - -SocialCalc.ScrollTableDownOneRow = function(editor) { - - var toprow, rowpane, rownum, colnum, colpane, cell, newrownum, maxspan, newbottomrow, newrow, oldchild, bottomrownum; - var rowneedsrefresh={}; - - var context=editor.context; - var sheetobj=context.sheetobj; - var tableobj=editor.fullgrid; - - var tbodyobj; - - tbodyobj=tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane=0; rowpanemaxrowspan) maxrowspan=cell.rowspan; - } - } - - if (maxrowspan>1) { - for (rownum=1; rownum context.rowpanes[rowpane].last) break; - newrow=context.RenderRow(rownum+newrownum, rowpane); - oldchild=tbodyobj.childNodes[toprow+rownum]; - tbodyobj.replaceChild(newrow,oldchild); - } - } - - // if last row now includes rowspans or rowspans from above, update the size of those to remove deleted row - - bottomrownum=context.rowpanes[rowpane].last; - - for (colpane=0; colpane1) { - rowneedsrefresh[bottomrownum]=true; // need to update this row - continue; - } - coord=context.cellskip[SocialCalc.crToCoord(colnum, bottomrownum)]; - if (!coord) continue; // only look at spanned cells - rownum=context.coordToCR[coord].row-0; - if (rownum==bottomrownum || - rownum1) rowneedsrefresh[rownum]=true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow=context.RenderRow(rownum, rowpane); - oldchild=tbodyobj.childNodes[(toprow+(rownum-context.rowpanes[rowpane].first))]; - tbodyobj.replaceChild(newrow,oldchild); - } - - return tableobj; - } - - -// ************************************* -// -// InputBox class: -// -// This class deals with the text box for editing cell contents. -// It mainly controls a user input box for typed content and is used to interact with -// the keyboard code, etc. -// -// You can use this inside a formula bar control of some sort. -// You create this after you have created a table editor object (but not necessarily -// done the CreateTableEditor method). -// -// When the user starts typing text, or double-clicks on a cell, this object -// comes into play. -// -// The element given when this is first constructed should be an input HTMLElement or -// something that acts like one. Check the code here to see what is done to it. -// -// ************************************* - -SocialCalc.InputBox = function(element, editor) { - - if (!element) return; // invoked without enough data to work - - this.element = element; // the input element associated with this InputBox - this.editor = editor; // the TableEditor this belongs to - this.inputEcho = null; - - editor.inputBox = this; - - element.onmousedown = SocialCalc.InputBoxOnMouseDown; - - editor.MoveECellCallback.formulabar = function(e){ - if (e.state!="start") return; // if not in normal keyboard mode don't replace formula bar - editor.inputBox.DisplayCellContents(e.ecell.coord); - }; - } - - -// Methods: - -SocialCalc.InputBox.prototype.DisplayCellContents = function(coord) {SocialCalc.InputBoxDisplayCellContents(this, coord);}; -SocialCalc.InputBox.prototype.ShowInputBox = function(show) {this.editor.inputEcho.ShowInputEcho(show);}; -SocialCalc.InputBox.prototype.GetText = function() {return this.element.value;}; -SocialCalc.InputBox.prototype.SetText = function(newtext) { - if (!this.element) return; - this.element.value=newtext; - this.editor.inputEcho.SetText(newtext+"_"); - }; -SocialCalc.InputBox.prototype.Focus = function() {SocialCalc.InputBoxFocus(this);}; -SocialCalc.InputBox.prototype.Blur = function() {return this.element.blur();}; -SocialCalc.InputBox.prototype.Select = function(t) { - if (!this.element) return; - switch (t) { - case "end": - if (this.element.selectionStart!=undefined) { - this.element.selectionStart=this.element.value.length; - this.element.selectionEnd=this.element.value.length; - } - break; - } - }; - -// Functions: - -// -// SocialCalc.InputBoxDisplayCellContents(inputbox, coord) -// -// Sets input box to the contents of the specified cell (or ecell if null). -// - -SocialCalc.InputBoxDisplayCellContents = function(inputbox, coord) { - - var scc = SocialCalc.Constants; - - if (!inputbox) return; - if (!coord) coord = inputbox.editor.ecell.coord; - var text = SocialCalc.GetCellContents(inputbox.editor.context.sheetobj, coord); - if (text.indexOf("\n")!=-1) { - text = scc.s_inputboxdisplaymultilinetext; - inputbox.element.disabled = true; - } - else { - inputbox.element.disabled = false; - } - inputbox.SetText(text); - - } - -// -// SocialCalc.InputBoxFocus(inputbox) -// -// Call this to have the input box get the focus and respond to keystrokes -// but still pass them off to SocialCalc.ProcessKey. -// - -SocialCalc.InputBoxFocus = function(inputbox) { - - if (!inputbox) return; - inputbox.element.focus(); - var editor = inputbox.editor; - editor.state = "input"; - var wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - - }; - -// -// SocialCalc.InputBoxOnMouseDown(e) -// -// This is called when the input box gets the focus. It then responds to keystrokes -// and pass them off to SocialCalc.ProcessKey, but in a different editing state. -// - -SocialCalc.InputBoxOnMouseDown = function(e) { - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var wval = editor.workingvalues; - - switch (editor.state) { - case "start": - editor.state="inputboxdirect"; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.inputEcho.ShowInputEcho(true); - break; - - case "input": - wval.partialexpr = ""; // make sure not pointing - editor.MoveECell(wval.ecoord); - editor.state="inputboxdirect"; - SocialCalc.KeyboardFocus(); // may have come here from outside of grid - break; - - case "inputboxdirect": - break; - } - } - - -// ************************************* -// -// InputEcho class: -// -// This object creates and controls an element that echos what's in the InputBox during editing -// It is draggable. -// -// ************************************* - -SocialCalc.InputEcho = function(editor) { - - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - this.text = ""; // current value of what is displayed - this.interval = null; // timer handle - - this.container = null; // element containing main echo as well as prompt line - this.main = null; // main echo area - this.prompt = null; - - this.functionbox = null; // function chooser dialog - - this.container = document.createElement("div"); - SocialCalc.setStyles(this.container, "display:none;position:absolute;zIndex:10;"); - - this.main = document.createElement("div"); - if (scc.defaultInputEchoClass) this.main.className = scc.defaultInputEchoClass; - if (scc.defaultInputEchoStyle) SocialCalc.setStyles(this.main, scc.defaultInputEchoStyle); - this.main.innerHTML = " "; - - this.container.appendChild(this.main); - - this.prompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) this.prompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) SocialCalc.setStyles(this.prompt, scc.defaultInputEchoPromptStyle); - this.prompt.innerHTML = ""; - - this.container.appendChild(this.prompt); - - SocialCalc.DragRegister(this.main, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: this.container}); - - editor.toplevel.appendChild(this.container); - - } - -// Methods: - -SocialCalc.InputEcho.prototype.ShowInputEcho = function(show) {return SocialCalc.ShowInputEcho(this, show);}; -SocialCalc.InputEcho.prototype.SetText = function(str) {return SocialCalc.SetInputEchoText(this, str);}; - -// Functions: - -SocialCalc.ShowInputEcho = function(inputecho, show) { - - var cell, position; - var editor = inputecho.editor; - - if (!editor) return; - - if (show) { - editor.cellhandles.ShowCellHandles(false); - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - inputecho.container.style.left = (position.left-1)+"px"; - inputecho.container.style.top = (position.top-1)+"px"; - } - inputecho.container.style.display = "block"; - if (inputecho.interval) window.clearInterval(inputecho.interval); // just in case - inputecho.interval = window.setInterval(SocialCalc.InputEchoHeartbeat, 50); - } - else { - if (inputecho.interval) window.clearInterval(inputecho.interval); - inputecho.container.style.display = "none"; - } - - } - -SocialCalc.SetInputEchoText = function(inputecho, str) { - - var scc = SocialCalc.Constants; - var fname, fstr; - var newstr = SocialCalc.special_chars(str); - newstr = newstr.replace(/\n/g,"
    "); - - if (inputecho.text != newstr) { - inputecho.main.innerHTML = newstr; - inputecho.text = newstr; - } - - var parts = str.match(/.*[\+\-\*\/\&\^\<\>\=\,\(]([A-Za-z][A-ZA-z]\w*?)\([^\)]*$/); - if (str.charAt(0)=="=" && parts) { - fname = parts[1].toUpperCase(); - if (SocialCalc.Formula.FunctionList[fname]) { - SocialCalc.Formula.FillFunctionInfo(); // make sure filled - fstr = SocialCalc.special_chars(fname+"("+SocialCalc.Formula.FunctionArgString(fname)+")"); - } - else { - fstr = scc.ietUnknownFunction+fname; - } - if (inputecho.prompt.innerHTML != fstr) { - inputecho.prompt.innerHTML = fstr; - inputecho.prompt.style.display = "block"; - } - } - else if (inputecho.prompt.style.display != "none") { - inputecho.prompt.innerHTML = ""; - inputecho.prompt.style.display = "none"; - } - - } - -SocialCalc.InputEchoHeartbeat = function() { - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - editor.inputEcho.SetText(editor.inputBox.GetText()+"_"); - - } - -SocialCalc.InputEchoMouseDown = function(e) { - var event = e || window.event; - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - -// if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 -// else event.cancelBubble = true; // IE 5+ -// if (event.preventDefault) event.preventDefault(); // DOM Level 2 -// else event.returnValue = false; // IE 5+ - - editor.inputBox.element.focus(); - -// return false; - }; - - -// ************************************* -// -// CellHandles class: -// -// This object creates and controls the elements around the cursor cell for dragging, etc. -// -// ************************************* - -SocialCalc.CellHandles = function(editor) { - - var scc = SocialCalc.Constants; - var functions; - - if (editor.noEdit) return; // leave us with nothing - - this.editor = editor; // the TableEditor this belongs to - - this.noCursorSuffix = false; - - this.movedmouse = false; // used to detect no-op - - this.draghandle = document.createElement("div"); - SocialCalc.setStyles(this.draghandle, "display:none;position:absolute;zIndex:8;border:1px solid white;width:4px;height:4px;fontSize:1px;backgroundColor:#0E93D8;cursor:default;"); - this.draghandle.innerHTML = ' '; - editor.toplevel.appendChild(this.draghandle); - SocialCalc.AssignID(editor, this.draghandle, "draghandle"); - - var imagetype = "png"; - if (navigator.userAgent.match(/MSIE 6\.0/)) { - imagetype = "gif"; - } - - this.dragpalette = document.createElement("div"); - SocialCalc.setStyles(this.dragpalette, "display:none;position:absolute;zIndex:8;width:90px;height:90px;fontSize:1px;textAlign:center;cursor:default;"+ - "backgroundImage:url("+SocialCalc.Constants.defaultImagePrefix+"drag-handles."+imagetype+");"); - this.dragpalette.innerHTML = ' '; - editor.toplevel.appendChild(this.dragpalette); - SocialCalc.AssignID(editor, this.dragpalette, "dragpalette"); - - this.dragtooltip = document.createElement("div"); - SocialCalc.setStyles(this.dragtooltip, "display:none;position:absolute;zIndex:9;border:1px solid black;width:100px;height:auto;fontSize:10px;backgroundColor:#FFFFFF;"); - this.dragtooltip.innerHTML = ' '; - editor.toplevel.appendChild(this.dragtooltip); - SocialCalc.AssignID(editor, this.dragtooltip, "dragtooltip"); - - this.fillinghandle = document.createElement("div"); - SocialCalc.setStyles(this.fillinghandle, "display:none;position:absolute;zIndex:9;border:1px solid black;width:auto;height:14px;fontSize:10px;backgroundColor:#FFFFFF;"); - this.fillinghandle.innerHTML = ' '; - editor.toplevel.appendChild(this.fillinghandle); - SocialCalc.AssignID(editor, this.fillinghandle, "fillinghandle"); - - if (this.draghandle.addEventListener) { // DOM Level 2 -- Firefox, et al - this.draghandle.addEventListener("mousemove", SocialCalc.CellHandlesMouseMoveOnHandle, false); - this.dragpalette.addEventListener("mousedown", SocialCalc.CellHandlesMouseDown, false); - this.dragpalette.addEventListener("mousemove", SocialCalc.CellHandlesMouseMoveOnHandle, false); - } - else if (this.draghandle.attachEvent) { // IE 5+ - this.draghandle.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMoveOnHandle); - this.dragpalette.attachEvent("onmousedown", SocialCalc.CellHandlesMouseDown); - this.dragpalette.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMoveOnHandle); - } - else { // don't handle this - throw "Browser not supported"; - } - - } - -// Methods: - -SocialCalc.CellHandles.prototype.ShowCellHandles = function(show, moveshow) {return SocialCalc.ShowCellHandles(this, show, moveshow);}; - -// Functions: - -SocialCalc.ShowCellHandles = function(cellhandles, show, moveshow) { - - var cell, cell2, position, position2; - var editor = cellhandles.editor; - var doshow = false; - var row, col, viewport; - - if (!editor) return; - - do { // a block that can you can "break" out of easily - - if (!show) break; - - row = editor.ecell.row; - col = editor.ecell.col; - - if (editor.state != "start") break; - if (row >= editor.lastvisiblerow) break; - if (col >= editor.lastvisiblecol) break; - if (row < editor.firstscrollingrow) break; - if (col < editor.firstscrollingcol) break; - - if (editor.rowpositions[row+1]+20>editor.horizontaltablecontrol.controlborder) { - break; - } - if (editor.rowpositions[row+1]-10editor.verticaltablecontrol.controlborder) { - break; - } - if (editor.colpositions[col+1]-30= left && x < left+width/2 && y >= top && y < top+height/2) { // upper left - if (len <= segtable[0]) v = -1; - else if (len <= segtable[1]) v = 1; - } - if (x >= left+width/2 && x < left+width && y >= top && y < top+height/2) { // upper right - if (len <= segtable[0]) v = -2; - else if (len <= segtable[1]) v = 2; - } - if (x >= left+width/2 && x < left+width && y >= top+height/2 && y < top+height) { // bottom right - if (len <= segtable[0]) v = -3; - else if (len <= segtable[1]) v = 3; - } - if (x >= left && x < left+width/2 && y >= top+height/2 && y < top+height) { // bottom right - if (len <= segtable[0]) v = -4; - else if (len <= segtable[1]) v = 4; - } - return v; - } - - while (true) { - if (x >= left && x < left+width/2 && y >= top && y < top+height/2) { // upper left - quadrant += "1"; - v = table[0]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - height = height/2; - continue; - } - if (x >= left+width/2 && x < left+width && y >= top && y < top+height/2) { // upper right - quadrant += "2"; - v = table[1]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - left = left+width; - height = height/2; - continue; - } - if (x >= left+width/2 && x < left+width && y >= top+height/2 && y < top+height) { // bottom right - quadrant += "3"; - v = table[2]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - left = left + width; - height = height/2; - top = top + height; - continue; - } - if (x >= left && x < left+width/2 && y >= top+height/2 && y < top+height) { // bottom right - quadrant += "4"; - v = table[3]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - height = height/2; - top = top + height; - continue; - } - return 0; // didn't match - } - -//addmsg((x-divWithMouseHit.offsetLeft)+","+(y-divWithMouseHit.offsetTop)+"="+quadrant+" "+v); - return v; - -} - -SocialCalc.CellHandlesHoverTimeout = function() { - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.timer) { - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - editor.cellhandles.ShowCellHandles(true, false); // hide move handles - -} - -SocialCalc.CellHandlesTooltipsTimeout = function() { - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - - var whichhandle = cellhandles.tooltipswhichhandle; - if (whichhandle==0) { // off of active part of palette - SocialCalc.CellHandlesHoverTimeout(); - return; - } - if (whichhandle==-3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillAllTooltip; - } - else if (whichhandle==3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillContentsTooltip; - } - else if (whichhandle==-2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteAllTooltip; - } - else if (whichhandle==-4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertAllTooltip; - } - else if (whichhandle==2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteContentsTooltip; - } - else if (whichhandle==4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertContentsTooltip; - } - else { - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - return; - } - - cellhandles.dragtooltip.style.display = "block"; - -} - -SocialCalc.CellHandlesMouseDown = function(e) { - - var scc = SocialCalc.Constants; - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (editor.busy) return; // don't do anything when busy (is this correct?) - - var cellhandles = editor.cellhandles; - - cellhandles.movedmouse = false; // detect no-op - - if (cellhandles.timer) { // cancel timer - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - - range = editor.range; - - var whichhandle = SocialCalc.SegmentDivHit([scc.CH_radius1, scc.CH_radius2], editor.cellhandles.dragpalette, clientX, clientY); - if (whichhandle==1 || whichhandle==-1 || whichhandle==0) { - cellhandles.ShowCellHandles(true, false); // hide move handles - return; - } - - mouseinfo.ignore = true; // stop other code from looking at the mouse - - if (whichhandle==-3) { - cellhandles.dragtype = "Fill"; -// mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==3) { - cellhandles.dragtype = "FillC"; -// mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==-2) { - cellhandles.dragtype = "Move"; -// mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } - else if (whichhandle==-4) { - cellhandles.dragtype = "MoveI"; -// mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==2) { - cellhandles.dragtype = "MoveC"; -// mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } - else if (whichhandle==4) { - cellhandles.dragtype = "MoveIC"; -// mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } - - cellhandles.filltype = null; - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - break; - - case "Move": - case "MoveI": - case "MoveC": - case "MoveIC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.RangeRemove(); - break; - - default: - return; // not for us - } - - cellhandles.fillinghandle.style.left = (clientX)+"px"; - cellhandles.fillinghandle.style.top = (clientY - 17)+"px"; - cellhandles.fillinghandle.innerHTML = scc.s_CHindicatorOperationLookup[cellhandles.dragtype]+ - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - cellhandles.ShowCellHandles(true, false); // hide move handles - cellhandles.mouseDown = true; - - mouseinfo.editor = editor; // remember for later - - coord = editor.ecell.coord; // start with cell with handles - - cellhandles.startingcoord = coord; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - - mouseinfo.mouselastcoord = coord; - - SocialCalc.KeyboardSetFocus(editor); - - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mousemove", SocialCalc.CellHandlesMouseMove, true); // capture everywhere - document.addEventListener("mouseup", SocialCalc.CellHandlesMouseUp, true); // capture everywhere - } - else if (cellhandles.draghandle.attachEvent) { // IE 5+ - cellhandles.draghandle.setCapture(); - cellhandles.draghandle.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMove); - cellhandles.draghandle.attachEvent("onmouseup", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.attachEvent("onlosecapture", SocialCalc.CellHandlesMouseUp); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - -SocialCalc.CellHandlesMouseMove = function(e) { - - var scc = SocialCalc.Constants; - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - var crstart, crend, cr, c, r; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat(editor, result, SocialCalc.CellHandlesDragAutoRepeat); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - - - cellhandles.movedmouse = true; // did move, so not no-op - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - - if (result.coord == cellhandles.startingcoord) { // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } - else { - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Down") { // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } - else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } - else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Down"; - } - else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Right"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - c = editor.range2.right - editor.range2.left + result.col; - r = editor.range2.bottom - editor.range2.top + result.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (result.coord == cellhandles.startingcoord) { // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } - else { - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Vertical") { // coerse to that - crend.col = editor.range2.left; - if (crend.row>=editor.range2.top && crend.row<=editor.range2.bottom+1) crend.row = editor.range2.bottom+2; - } - else { - crend.row = editor.range2.top; - if (crend.col>=editor.range2.left && crend.col<=editor.range2.right+1) crend.col = editor.range2.right+2; - } - } - else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Vertical"; - } - else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Horizontal"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - if (!cellhandles.filltype) { // no fill type - editor.RangeRemove(); - } - else { - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - } - break; - - } - - - cellhandles.fillinghandle.style.left = (clientX)+"px"; - cellhandles.fillinghandle.style.top = (clientY - 17)+"px"; - cellhandles.fillinghandle.innerHTML = scc.s_CHindicatorOperationLookup[cellhandles.dragtype]+ - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - mouseinfo.mouselastcoord = result.coord; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - -SocialCalc.CellHandlesDragAutoRepeat = function(coord, direction) { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - var crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - var crend = SocialCalc.coordToCr(coord); - - var newcoord, c, r; - - var vscroll = 0; - var hscroll = 0; - - if (direction == "left") hscroll = -1; - else if (direction == "right") hscroll = 1; - else if (direction == "up") vscroll = -1; - else if (direction == "down") vscroll = 1; - editor.ScrollRelativeBoth(vscroll, hscroll); - - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Down") { // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } - else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } - else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord!=mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - c = editor.range2.right - editor.range2.left + editor.ecell.col; - r = editor.range2.bottom - editor.range2.top + editor.ecell.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Vertical") { // coerse to that - crend.col = editor.range2.left; - if (crend.row>=editor.range2.top && crend.row<=editor.range2.bottom+1) crend.row = editor.range2.bottom+2; - } - else { - crend.row = editor.range2.top; - if (crend.col>=editor.range2.left && crend.col<=editor.range2.right+1) crend.col = editor.range2.right+2; - } - } - else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord!=mouseinfo.mouselastcoord) { - editor.MoveECell(newcoord); - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - } - - mouseinfo.mouselastcoord = newcoord; - - } - -SocialCalc.CellHandlesMouseUp = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval, cstr, cmdtype, cmdtype2; - var crstart, crend; - var sizec, sizer, deltac, deltar; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - mouseinfo.ignore = false; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - cellhandles.mouseDown = false; - cellhandles.noCursorSuffix = false; - - cellhandles.fillinghandle.style.display = "none"; - - if (!result) result = {}; - if (!result.coord) result.coord = editor.ecell.coord; - - switch (cellhandles.dragtype) { - case "Fill": - case "Move": - case "MoveI": - cmdtype2 = " all"; - break; - case "FillC": - case "MoveC": - case "MoveIC": - cmdtype2 = " formulas"; - break; - } - - if (!cellhandles.movedmouse) { // didn't move: just leave one cell selected - cellhandles.dragtype = "Nothing"; - } - - switch (cellhandles.dragtype) { - case "Nothing": - editor.Range2Remove(); - editor.RangeRemove(); - break; - - case "Fill": - case "FillC": - - crstart = SocialCalc.coordToCr(cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - if (cellhandles.filltype) { - if (cellhandles.filltype=="Down") { - crend.col = crstart.col; - } - else { - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - - editor.MoveECell(result.coord); - editor.RangeExtend(); - - if (editor.cellhandles.filltype=="Right") { - cmdtype = "right"; - } - else { - cmdtype = "down"; - } - cstr = "fill"+cmdtype+" "+SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom)+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - break; - - case "Move": - case "MoveC": - editor.context.cursorsuffix = ""; - cstr = "movepaste "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - - break; - - case "MoveI": - case "MoveIC": - editor.context.cursorsuffix = ""; - sizec = editor.range2.right - editor.range2.left; - sizer = editor.range2.bottom - editor.range2.top; - deltac = editor.ecell.col - editor.range2.left; - deltar = editor.ecell.row - editor.range2.top; - cstr = "moveinsert "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - editor.RangeRemove(); - if (editor.cellhandles.filltype==" Horizontal" && deltac > 0) { - editor.MoveECell(SocialCalc.crToCoord(editor.ecell.col-sizec-1, editor.ecell.row)); - } - else if (editor.cellhandles.filltype==" Vertical" && deltar > 0) { - editor.MoveECell(SocialCalc.crToCoord(editor.ecell.col, editor.ecell.row-sizer-1)); - } - editor.RangeAnchor(SocialCalc.crToCoord(editor.ecell.col+sizec, editor.ecell.row+sizer)); - editor.RangeExtend(); - - break; - - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.CellHandlesMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.CellHandlesMouseUp, true); - } - else if (cellhandles.draghandle.detachEvent) { // IE - cellhandles.draghandle.detachEvent("onlosecapture", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.detachEvent("onmouseup", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.detachEvent("onmousemove", SocialCalc.CellHandlesMouseMove); - cellhandles.draghandle.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - - } - -// ************************************* -// -// TableControl class: -// -// This class deals with the horizontal and verical scrollbars and pane sliders. -// -// +--------------+ -// | Endcap | -// +- - - - - - - + -// | | -// +--------------+ -// | Pane Slider | -// +--------------+ -// | | -// | Less Button | -// | | -// +--------------+ -// | Scroll Area | -// | | -// | | -// +--------------+ -// | Thumb | -// +--------------+ -// | | -// +--------------+ -// | | -// | More Button | -// | | -// +--------------+ -// -// ************************************* - -SocialCalc.TableControl = function(editor, vertical, size) { - - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - - this.vertical = vertical; // true if vertical control, false if horizontal - this.size = size; // length in pixels - - this.main = null; // main element containing all the others - this.endcap = null; // the area at the top/left between the end and the pane slider - this.paneslider = null; // the slider to adjust the pane split - this.lessbutton = null; // the top/left scroll button - this.morebutton = null; // the bottom/right scroll button - this.scrollarea = null; // the area between the scroll buttons - this.thumb = null; // the sliding thing in the scrollarea - - // computed position values: - - this.controlborder = null; // left or top screen position for vertical or horizontal control - this.endcapstart = null; // top or left screen position for vertical or horizontal control - this.panesliderstart = null; - this.lessbuttonstart = null; - this.morebuttonstart = null; - this.scrollareastart = null; - this.scrollareaend = null; - this.scrollareasize = null; - this.thumbpos = null; - - // constants: - - this.controlthickness = scc.defaultTableControlThickness; // other dimension of complete control in pixels - this.sliderthickness = scc.defaultTCSliderThickness; - this.buttonthickness = scc.defaultTCButtonThickness; - this.thumbthickness = scc.defaultTCThumbThickness; - this.minscrollingpanesize = this.buttonthickness+this.buttonthickness+this.thumbthickness+20; // the 20 is to leave a little space - - } - -// Methods: - -SocialCalc.TableControl.prototype.CreateTableControl = function() {return SocialCalc.CreateTableControl(this);}; -SocialCalc.TableControl.prototype.PositionTableControlElements = function() {SocialCalc.PositionTableControlElements(this);}; -SocialCalc.TableControl.prototype.ComputeTableControlPositions = function() {SocialCalc.ComputeTableControlPositions(this);}; - -// Functions: - -SocialCalc.CreateTableControl = function(control) { - - var s, functions, params; - var AssignID = SocialCalc.AssignID; - var setStyles = SocialCalc.setStyles; - var scc = SocialCalc.Constants; - var TooltipRegister = function(element, etype, vh) { - if (scc["s_"+etype+"Tooltip"+vh]) { - SocialCalc.TooltipRegister(element, scc["s_"+etype+"Tooltip"+vh], null); - } - } - - var imageprefix = control.editor.imageprefix; - var vh = control.vertical ? "v" : "h"; - - control.main = document.createElement("div"); - s = control.main.style; - s.height = (control.vertical ? control.size : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.size)+"px"; - s.zIndex = 0; - setStyles(control.main, scc.TCmainStyle); - s.backgroundImage="url("+imageprefix+"main-"+vh+".gif)"; - if (scc.TCmainClass) control.main.className = scc.TCmainClass; - - control.main.style.display="none"; // wait for layout - - control.endcap = document.createElement("div"); - s = control.endcap.style; - s.height = control.controlthickness+"px"; - s.width = control.controlthickness+"px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.endcap, scc.TCendcapStyle); - s.backgroundImage="url("+imageprefix+"endcap-"+vh+".gif)"; - if (scc.TCendcapClass) control.endcap.className = scc.TCendcapClass; - AssignID(control.editor, control.endcap, "endcap"+vh); - - control.main.appendChild(control.endcap); - - control.paneslider = document.createElement("div"); - s = control.paneslider.style; - s.height = (control.vertical ? control.sliderthickness : control.controlthickness)+"px"; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.width = (control.vertical ? control.controlthickness : control.sliderthickness)+"px"; - s.position = "absolute"; - s[control.vertical?"top":"left"] = "4px"; - s.zIndex = 3; - setStyles(control.paneslider, scc.TCpanesliderStyle); - s.backgroundImage="url("+imageprefix+"paneslider-"+vh+".gif)"; - if (scc.TCpanesliderClass) control.paneslider.className = scc.TCpanesliderClass; - AssignID(control.editor, control.paneslider, "paneslider"+vh); - TooltipRegister(control.paneslider, "paneslider", vh); - - functions = {MouseDown:SocialCalc.TCPSDragFunctionStart, - MouseMove: SocialCalc.TCPSDragFunctionMove, - MouseUp: SocialCalc.TCPSDragFunctionStop, - Disabled: function() {return control.editor.busy;}}; - - functions.control = control; // make sure this is there - - SocialCalc.DragRegister(control.paneslider, control.vertical, !control.vertical, functions); - - control.main.appendChild(control.paneslider); - - control.lessbutton = document.createElement("div"); - s = control.lessbutton.style; - s.height = (control.vertical ? control.buttonthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.buttonthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.lessbutton, scc.TClessbuttonStyle); - s.backgroundImage="url("+imageprefix+"less-"+vh+"n.gif)" - if (scc.TClessbuttonClass) control.lessbutton.className = scc.TClessbuttonClass; - AssignID(control.editor, control.lessbutton, "lessbutton"+vh); - - params = {repeatwait:scc.TClessbuttonRepeatWait, repeatinterval:scc.TClessbuttonRepeatInterval, - normalstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"n.gif);", - downstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"d.gif);", - hoverstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"h.gif);"}; - functions = {MouseDown:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, -1);}, - Repeat:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, -1);}, - Disabled: function() {return control.editor.busy;}}; - - SocialCalc.ButtonRegister(control.lessbutton, params, functions); - - control.main.appendChild(control.lessbutton); - - control.morebutton = document.createElement("div"); - s = control.morebutton.style; - s.height = (control.vertical ? control.buttonthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.buttonthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.morebutton, scc.TCmorebuttonStyle); - s.backgroundImage="url("+imageprefix+"more-"+vh+"n.gif)" - if (scc.TCmorebuttonClass) control.morebutton.className = scc.TCmorebuttonClass; - AssignID(control.editor, control.morebutton, "morebutton"+vh); - - params = {repeatwait:scc.TCmorebuttonRepeatWait, repeatinterval:scc.TCmorebuttonRepeatInterval, - normalstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"n.gif);", - downstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"d.gif);", - hoverstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"h.gif);"}; - functions = {MouseDown:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, +1);}, - Repeat:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, +1);}, - Disabled: function() {return control.editor.busy;}}; - - SocialCalc.ButtonRegister(control.morebutton, params, functions); - - control.main.appendChild(control.morebutton); - - control.scrollarea = document.createElement("div"); - s = control.scrollarea.style; - s.height = control.controlthickness+"px"; - s.width = control.controlthickness+"px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.scrollarea, scc.TCscrollareaStyle); - s.backgroundImage="url("+imageprefix+"scrollarea-"+vh+".gif)"; - if (scc.TCscrollareaClass) control.scrollarea.className = scc.TCscrollareaClass; - AssignID(control.editor, control.scrollarea, "scrollarea"+vh); - - params = {repeatwait:scc.TCscrollareaRepeatWait, repeatinterval:scc.TCscrollareaRepeatWait}; - functions = {MouseDown:SocialCalc.ScrollAreaClick, Repeat:SocialCalc.ScrollAreaClick, - Disabled: function() {return control.editor.busy;}}; - functions.control = control; - - SocialCalc.ButtonRegister(control.scrollarea, params, functions); - - control.main.appendChild(control.scrollarea); - - control.thumb = document.createElement("div"); - s = control.thumb.style; - s.height = (control.vertical ? control.thumbthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.thumbthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.thumb, scc.TCthumbStyle); - control.thumb.style.backgroundImage="url("+imageprefix+"thumb-"+vh+"n.gif)"; - if (scc.TCthumbClass) control.thumb.className = scc.TCthumbClass; - AssignID(control.editor, control.thumb, "thumb"+vh); - - functions = {MouseDown:SocialCalc.TCTDragFunctionStart, - MouseMove: SocialCalc.TCTDragFunctionMove, - MouseUp: SocialCalc.TCTDragFunctionStop, - Disabled: function() {return control.editor.busy;}}; - functions.control = control; // make sure this is there - SocialCalc.DragRegister(control.thumb, control.vertical, !control.vertical, functions); - - params = {normalstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"n.gif)", name:"Thumb", - downstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"d.gif)", - hoverstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"h.gif)"}; - SocialCalc.ButtonRegister(control.thumb, params, null); // give it button-like visual behavior - - control.main.appendChild(control.thumb); - - return control.main; - -} - -// -// ScrollAreaClick - Button function to process pageup/down clicks -// - -SocialCalc.ScrollAreaClick = function(e, buttoninfo, bobj) { - - var control = bobj.functionobj.control; - var bposition = SocialCalc.GetElementPosition(bobj.element); - var clickpos = control.vertical ? buttoninfo.clientY : buttoninfo.clientX; - if (control.editor.busy) { // ignore if busy - wait for next repeat - return; - } - control.editor.PageRelative(control.vertical, clickpos > control.thumbpos ? 1 : -1); - - return; - -} - -// -// PositionTableControlElements -// - -SocialCalc.PositionTableControlElements = function(control) { - - var border, realend, thumbpos; - - var editor = control.editor; - - if (control.vertical) { - border = control.controlborder+"px"; - control.endcap.style.top = control.endcapstart+"px"; - control.endcap.style.left = border; - control.paneslider.style.top = control.panesliderstart+"px"; - control.paneslider.style.left = border - control.lessbutton.style.top = control.lessbuttonstart+"px"; - control.lessbutton.style.left = border; - control.morebutton.style.top = control.morebuttonstart+"px"; - control.morebutton.style.left = border; - control.scrollarea.style.top = control.scrollareastart+"px"; - control.scrollarea.style.left = border; - control.scrollarea.style.height = control.scrollareasize+"px"; - realend = Math.max(editor.context.sheetobj.attribs.lastrow, editor.firstscrollingrow+1); - thumbpos = ((editor.firstscrollingrow-(editor.lastnonscrollingrow+1))*(control.scrollareasize-3*control.thumbthickness))/ - (realend-(editor.lastnonscrollingrow+1))+control.scrollareastart-1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.top = thumbpos+"px"; - control.thumb.style.left = border; - } - else { - border = control.controlborder+"px"; - control.endcap.style.left = control.endcapstart+"px"; - control.endcap.style.top = border; - control.paneslider.style.left = control.panesliderstart+"px"; - control.paneslider.style.top = border - control.lessbutton.style.left = control.lessbuttonstart+"px"; - control.lessbutton.style.top = border; - control.morebutton.style.left = control.morebuttonstart+"px"; - control.morebutton.style.top = border; - control.scrollarea.style.left = control.scrollareastart+"px"; - control.scrollarea.style.top = border; - control.scrollarea.style.width = control.scrollareasize+"px"; - realend = Math.max(editor.context.sheetobj.attribs.lastcol, editor.firstscrollingcol+1); - thumbpos = ((editor.firstscrollingcol-(editor.lastnonscrollingcol+1))*(control.scrollareasize-control.thumbthickness))/ - (realend-editor.lastnonscrollingcol)+control.scrollareastart-1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.left = thumbpos+"px"; - control.thumb.style.top = border; - } - control.thumbpos = thumbpos; - control.main.style.display="block"; - - } - -// -// ComputeTableControlPositions -// -// This routine computes the screen positions and other values needed for laying out -// the table control elements. -// - -SocialCalc.ComputeTableControlPositions = function(control) { - - var editor = control.editor; - - if (!editor.gridposition || !editor.headposition) throw("Can't compute table control positions before editor positions"); - - if (control.vertical) { - control.controlborder = editor.gridposition.left+editor.tablewidth; // border=left position - control.endcapstart = editor.gridposition.top; // start=top position - control.panesliderstart = editor.firstscrollingrowtop-control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingrowtop-1; - control.morebuttonstart = editor.gridposition.top+editor.tableheight-control.buttonthickness; - control.scrollareastart = editor.firstscrollingrowtop-1+control.buttonthickness; - control.scrollareaend = control.morebuttonstart-1; - control.scrollareasize = control.scrollareaend-control.scrollareastart+1; - } - else { - control.controlborder = editor.gridposition.top+editor.tableheight; // border=top position - control.endcapstart = editor.gridposition.left; // start=left position - control.panesliderstart = editor.firstscrollingcolleft-control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingcolleft-1; - control.morebuttonstart = editor.gridposition.left+editor.tablewidth-control.buttonthickness; - control.scrollareastart = editor.firstscrollingcolleft-1+control.buttonthickness; - control.scrollareaend = control.morebuttonstart-1; - control.scrollareasize = control.scrollareaend-control.scrollareastart+1; - } - } - -////// TCPS - TableControl Pan Slider methods - -// -// TCPSDragFunctionStart(event, draginfo, dobj) -// -// TableControlPaneSlider function for starting drag -// - -SocialCalc.TCPSDragFunctionStart = function(event, draginfo, dobj) { - - var editor = dobj.functionobj.control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - draginfo.trackingline = document.createElement("div"); - draginfo.trackingline.style.height = dobj.vertical ? scc.TCPStrackinglineThickness : - (editor.tableheight-(editor.headposition.top-editor.gridposition.top))+"px"; - draginfo.trackingline.style.width = dobj.vertical ? - (editor.tablewidth-(editor.headposition.left-editor.gridposition.left))+"px" : scc.TCPStrackinglineThickness; - draginfo.trackingline.style.backgroundImage="url("+editor.imageprefix+"trackingline-"+(dobj.vertical?"v":"h")+".gif)";; - if (scc.TCPStrackinglineClass) draginfo.trackingline.className = scc.TCPStrackinglineClass; - SocialCalc.setStyles(draginfo.trackingline, scc.TCPStrackinglineStyle); - - if (dobj.vertical) { - row = SocialCalc.Lookup(draginfo.clientY+dobj.functionobj.control.sliderthickness, editor.rowpositions); - draginfo.trackingline.style.top = (editor.rowpositions[row] || editor.headposition.top)+"px"; - draginfo.trackingline.style.left = editor.headposition.left+"px"; - if (editor.context.rowpanes.length-1) { // has 2 already - editor.context.SetRowPaneFirstLast(1, editor.context.rowpanes[0].last+1, editor.context.rowpanes[0].last+1); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } - else { - col = SocialCalc.Lookup(draginfo.clientX+dobj.functionobj.control.sliderthickness, editor.colpositions); - draginfo.trackingline.style.top = editor.headposition.top+"px"; - draginfo.trackingline.style.left = (editor.colpositions[col] || editor.headposition.left)+"px"; - if (editor.context.colpanes.length-1) { // has 2 already - editor.context.SetColPaneFirstLast(1, editor.context.colpanes[0].last+1, editor.context.colpanes[0].last+1); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } - - editor.griddiv.appendChild(draginfo.trackingline); - - } - -// -// TCPSDragFunctionMove(event, draginfo, dobj) -// - -SocialCalc.TCPSDragFunctionMove = function(event, draginfo, dobj) { - - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup(draginfo.clientY+sliderthickness, editor.rowpositions); - draginfo.trackingline.style.top = (editor.rowpositions[row] || editor.headposition.top)+"px"; - } - else { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup(draginfo.clientX+sliderthickness, editor.colpositions); - draginfo.trackingline.style.left = (editor.colpositions[col] || editor.headposition.left)+"px"; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - - } - -// -// TCPSDragFunctionStop(event, draginfo, dobj) -// - -SocialCalc.TCPSDragFunctionStop = function(event, draginfo, dobj) { - - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup(draginfo.clientY+sliderthickness, editor.rowpositions); - if (row>editor.context.sheetobj.attribs.lastrow) row=editor.context.sheetobj.attribs.lastrow; // can't extend sheet here - if (!row || row<=editor.context.rowpanes[0].first) { // set to no panes, leaving first pane settings - if (editor.context.rowpanes.length>1) editor.context.rowpanes.length = 1; - } - else if (editor.context.rowpanes.length-1) { // has 2 already - if (!editor.timeout) { // not waiting for position calc (so positions could be wrong) - editor.context.SetRowPaneFirstLast(0, editor.context.rowpanes[0].first, row-1); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } - else { - editor.context.SetRowPaneFirstLast(0, editor.context.rowpanes[0].first, row-1); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } - else { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup(draginfo.clientX+sliderthickness, editor.colpositions); - if (col>editor.context.sheetobj.attribs.lastcol) col=editor.context.sheetobj.attribs.lastcol; // can't extend sheet here - if (!col || col<=editor.context.colpanes[0].first) { // set to no panes, leaving first pane settings - if (editor.context.colpanes.length>1) editor.context.colpanes.length = 1; - } - else if (editor.context.colpanes.length-1) { // has 2 already - if (!editor.timeout) { // not waiting for position calc (so positions could be wrong) - editor.context.SetColPaneFirstLast(0, editor.context.colpanes[0].first, col-1); - editor.context.SetColPaneFirstLast(1, col, col); - } - } - else { - editor.context.SetColPaneFirstLast(0, editor.context.colpanes[0].first, col-1); - editor.context.SetColPaneFirstLast(1, col, col); - } - } - - editor.FitToEditTable(); - - editor.griddiv.removeChild(draginfo.trackingline); - - editor.ScheduleRender(); - - } - -////// TCT - TableControl Thumb methods - -//!!!! Note: Need to make start use same code as move/stop for determining row/col, since stop will set that -//!!!! Note: Need to make start/move/stop use positioning code that corresponds closer to -//!!!! ComputeTableControlPositions calculations. - -// -// TCTDragFunctionStart(event, draginfo, dobj) -// -// TableControlThumb function for starting drag -// - -SocialCalc.TCTDragFunctionStart = function(event, draginfo, dobj) { - - var rowpane, colpane, row, col; - - var control = dobj.functionobj.control; - var editor = control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - if (draginfo.thumbstatus) { // get rid of old one if mouseup was out of window - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - } - - draginfo.thumbstatus = document.createElement("div"); - - if (dobj.vertical) { - if (scc.TCTDFSthumbstatusvClass) draginfo.thumbstatus.className = scc.TCTDFSthumbstatusvClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatusvStyle); - draginfo.thumbstatus.style.top = (draginfo.clientY+scc.TCTDFStopOffsetv)+"px"; - draginfo.thumbstatus.style.left = (control.controlborder-10-(editor.tablewidth/2))+"px"; - draginfo.thumbstatus.style.width = (editor.tablewidth/2)+"px"; - - draginfo.thumbcontext = new SocialCalc.RenderContext(editor.context.sheetobj); - draginfo.thumbcontext.showGrid = true; - draginfo.thumbcontext.rowpanes = [{first: 1, last: 1}]; - var pane = editor.context.colpanes[editor.context.colpanes.length-1]; - draginfo.thumbcontext.colpanes = [{first: pane.first, last: pane.last}]; - draginfo.thumbstatus.innerHTML = '
    msg
    preview
    '; - draginfo.thumbstatus.rowmsgele = draginfo.thumbstatus.firstChild.firstChild.firstChild.firstChild.firstChild; - draginfo.thumbstatus.rowpreviewele = draginfo.thumbstatus.firstChild.firstChild.firstChild.childNodes[1].firstChild; - editor.toplevel.appendChild(draginfo.thumbstatus); - SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, editor.firstscrollingrow || 1); - } - else { - if (scc.TCTDFSthumbstatushClass) draginfo.thumbstatus.className = scc.TCTDFSthumbstatushClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatushStyle); - draginfo.thumbstatus.style.top = (control.controlborder+scc.TCTDFStopOffseth)+"px"; - draginfo.thumbstatus.style.left = (draginfo.clientX+scc.TCTDFSleftOffseth)+"px"; - editor.toplevel.appendChild(draginfo.thumbstatus); - draginfo.thumbstatus.innerHTML = scc.s_TCTDFthumbstatusPrefixh+SocialCalc.rcColname(editor.firstscrollingcol); - } - - } - - -// -// SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, row) -// -// Render partial row -// - -SocialCalc.TCTDragFunctionRowSetStatus = function(draginfo, editor, row) { - - var scc = SocialCalc.Constants; - var msg = scc.s_TCTDFthumbstatusPrefixv+row+" "; - - draginfo.thumbstatus.rowmsgele.innerHTML = msg; - - draginfo.thumbcontext.rowpanes = [{first: row, last: row}]; - draginfo.thumbrowshown = row; - - var ele = draginfo.thumbcontext.RenderSheet(draginfo.thumbstatus.rowpreviewele.firstChild, {type: "html"}); - - } - - -// -// TCTDragFunctionMove(event, draginfo, dobj) -// - -SocialCalc.TCTDragFunctionMove = function(event, draginfo, dobj) { - - var first, msg; - var control = dobj.functionobj.control; - var thumbthickness = control.thumbthickness; - var editor = control.editor; - var scc = SocialCalc.Constants; - - if (dobj.vertical) { - if (draginfo.clientY > control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2) - draginfo.clientY = control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2; - if (draginfo.clientY < control.scrollareastart - draginfo.offsetY - 1) - draginfo.clientY = control.scrollareastart - draginfo.offsetY - 1; - draginfo.thumbstatus.style.top = draginfo.clientY+"px"; - - first = - ((draginfo.clientY+draginfo.offsetY-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastrow-editor.lastnonscrollingrow) - + editor.lastnonscrollingrow + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) first = editor.context.sheetobj.attribs.lastrow; -// msg = scc.s_TCTDFthumbstatusPrefixv+first; - if (first != draginfo.thumbrowshown) { - SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, first); - } - } - else { - if (draginfo.clientX > control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2) - draginfo.clientX = control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2; - if (draginfo.clientX < control.scrollareastart - draginfo.offsetX - 1) - draginfo.clientX = control.scrollareastart - draginfo.offsetX - 1; - draginfo.thumbstatus.style.left = draginfo.clientX+"px"; - - first = - ((draginfo.clientX+draginfo.offsetX-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastcol-editor.lastnonscrollingcol) - + editor.lastnonscrollingcol + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) first = editor.context.sheetobj.attribs.lastcol; - msg = scc.s_TCTDFthumbstatusPrefixh+SocialCalc.rcColname(first); - draginfo.thumbstatus.innerHTML = msg; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - - } - -// -// TCTDragFunctionStop(event, draginfo, dobj) -// - -SocialCalc.TCTDragFunctionStop = function(event, draginfo, dobj) { - - var first; - var control = dobj.functionobj.control; - var editor = control.editor; - - if (dobj.vertical) { - first = - ((draginfo.clientY+draginfo.offsetY-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastrow-editor.lastnonscrollingrow) - + editor.lastnonscrollingrow + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) first = editor.context.sheetobj.attribs.lastrow; - - editor.context.SetRowPaneFirstLast(editor.context.rowpanes.length-1, first, first+1); - } - else { - first = - ((draginfo.clientX+draginfo.offsetX-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastcol-editor.lastnonscrollingcol) - + editor.lastnonscrollingcol + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) first = editor.context.sheetobj.attribs.lastcol; - - editor.context.SetColPaneFirstLast(editor.context.colpanes.length-1, first, first+1); - } - - editor.FitToEditTable(); - - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - - editor.ScheduleRender(); - - } - -// ************************************* -// -// Dragging functions: -// -// ************************************* - -SocialCalc.DragInfo = { - - // There is only one of these -- no "new" is done. - // Only one dragging operation can be active at a time. - // The registeredElements array is used to decide which item to drag. - - // One item for each draggable thing, each an object with: - // .element, .vertical, .horizontal, .functionobj - - registeredElements: [], - - // Items used during a drag - - draggingElement: null, // item being processed (.element is the actual element) - startX: 0, - startY: 0, - startZ: 0, - clientX: 0, // modifyable version to restrict movement - clientY: 0, - offsetX: 0, - offsetY: 0, - horizontalScroll: 0, // retrieved at drag start - verticalScroll: 0 - - } - -// -// DragRegister(element, vertical, horizontal, functionobj) - make element draggable -// -// The functionobj defaults to moving the element contrained only by vertical and horizontal settings. -// - -SocialCalc.DragRegister = function(element, vertical, horizontal, functionobj) { - - var draginfo = SocialCalc.DragInfo; - - if (!functionobj) { - functionobj = {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null}; - } - - draginfo.registeredElements.push( - {element: element, vertical: vertical, horizontal: horizontal, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.DragMouseDown, false); - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousedown", SocialCalc.DragMouseDown); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - } - -// -// DragUnregister(element) - remove object from list -// - -SocialCalc.DragUnregister = function(element) { - - var draginfo = SocialCalc.DragInfo; - - var i; - - if (!element) return; - - for (i=0; i tooltipinfo.viewport.width/2) { // on right side of screen - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY)+"px"; - tooltipinfo.popupElement.style.right = (tooltipinfo.viewport.width - tooltipinfo.clientX + offsetX)+"px"; - } - else { // on left side of screen - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY)+"px"; - tooltipinfo.popupElement.style.left = (tooltipinfo.clientX + offsetX)+"px"; - } - - if (tooltipinfo.clientY < 50) { // make sure fits on screen if nothing above grid - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY - 50)+"px"; - } - - document.body.appendChild(tooltipinfo.popupElement); - - } - -// -// TooltipHide() -// - -SocialCalc.TooltipHide = function() { - - var tooltipinfo = SocialCalc.TooltipInfo; - - if (tooltipinfo.popupElement) { - tooltipinfo.popupElement.parentNode.removeChild(tooltipinfo.popupElement); - tooltipinfo.popupElement = null; - } - - } - -// -// TooltipWaitDone() -// - -SocialCalc.TooltipWaitDone = function() { - - var tooltipinfo = SocialCalc.TooltipInfo; - - tooltipinfo.timer = null; - - SocialCalc.TooltipDisplay(tooltipinfo.tooltipElement); - - } - - -// ************************************* -// -// Button functions: -// -// ************************************* - -SocialCalc.ButtonInfo = { - - // There is only one of these -- no "new" is done. - // Only one button operation can be active at a time. - // The registeredElements array is used to identify items. - - // One item for each clickable element, each an object with: - // .element, .normalstyle, .hoverstyle, .downstyle, .repeatinterval, .functionobj - // - // .functionobj is an object with optional function objects for: - // mouseover, mouseout, mousedown, repeatinterval, mouseup, disabled - - registeredElements: [], - - // Items used during hover over an element, clicking, repeating, etc. - - buttonElement: null, // item being processed, hover or down (.element is the actual element) - doingHover: false, // true if mouse is over one of our elements - buttonDown: false, // true if button down and buttonElement not null - timer: null, // timer object for repeating - - // Used while processing an event - - horizontalScroll: 0, - verticalScroll: 0, - clientX: 0, - clientY: 0 - - } - -// -// ButtonRegister(element, paramobj, functionobj) - make element clickable -// -// The arguments (other than element) may be null (meaning no change for style and no repeat) -// The paramobj has the optional normalstyle, hoverstyle, downstyle, repeatwait, repeatinterval settings - -SocialCalc.ButtonRegister = function(element, paramobj, functionobj) { - - var buttoninfo = SocialCalc.ButtonInfo; - - if (!paramobj) paramobj = {}; - - buttoninfo.registeredElements.push( - {name: paramobj.name, element: element, normalstyle: paramobj.normalstyle, hoverstyle: paramobj.hoverstyle, downstyle: paramobj.downstyle, - repeatwait: paramobj.repeatwait, repeatinterval: paramobj.repeatinterval, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.ButtonMouseDown, false); - element.addEventListener("mouseover", SocialCalc.ButtonMouseOver, false); - element.addEventListener("mouseout", SocialCalc.ButtonMouseOut, false); - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousedown", SocialCalc.ButtonMouseDown); - element.attachEvent("onmouseover", SocialCalc.ButtonMouseOver); - element.attachEvent("onmouseout", SocialCalc.ButtonMouseOut); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - - } - -// -// ButtonMouseOver(event) -// - -SocialCalc.ButtonMouseOver = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (!bobj) return; - - if (buttoninfo.buttonDown) { - if (buttoninfo.buttonElement==bobj) { - buttoninfo.doingHover = true; // keep track whether we are on the pressed button or not - } - return; - } - - if (buttoninfo.buttonElement && - buttoninfo.buttonElement!=bobj && buttoninfo.doingHover) { // moved to a new one, undo hover there - SocialCalc.setStyles(buttoninfo.buttonElement.element, buttoninfo.buttonElement.normalstyle); - } - - buttoninfo.buttonElement = bobj; // remember this one is hovering - buttoninfo.doingHover = true; - - SocialCalc.setStyles(bobj.element, bobj.hoverstyle); // set style (if provided) - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOver) bobj.functionobj.MouseOver(e, buttoninfo, bobj); - - return; - - } - -// -// ButtonMouseOut(event) -// - -SocialCalc.ButtonMouseOut = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - if (buttoninfo.buttonDown) { - buttoninfo.doingHover = false; // keep track of overs and outs - return; - } - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (buttoninfo.doingHover) { // if there was a hover, undo it - if (buttoninfo.buttonElement) - SocialCalc.setStyles(buttoninfo.buttonElement.element, buttoninfo.buttonElement.normalstyle); - buttoninfo.buttonElement = null; - buttoninfo.doingHover = false; - } - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOut) bobj.functionobj.MouseOut(e, buttoninfo, bobj); - - return; - - } - -// -// ButtonMouseDown(event) -// - -SocialCalc.ButtonMouseDown = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var viewportinfo = SocialCalc.GetViewportInfo(); - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (!bobj) return; // not one of our elements - - if (bobj && bobj.functionobj && bobj.functionobj.Disabled) { - if (bobj.functionobj.Disabled(e, buttoninfo, bobj)) { - return; - } - } - - buttoninfo.buttonElement = bobj; - buttoninfo.buttonDown = true; - - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.downstyle); - - // Register event handler for mouse up - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mouseup", SocialCalc.ButtonMouseUp, true); // capture everywhere - } - else if (bobj.element.attachEvent) { // IE 5+ - bobj.element.setCapture(); - bobj.element.attachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.attachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - } - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - buttoninfo.horizontalScroll = viewportinfo.horizontalScroll; - buttoninfo.verticalScroll = viewportinfo.verticalScroll; - buttoninfo.clientX = e.clientX + buttoninfo.horizontalScroll; // get document-relative coordinates - buttoninfo.clientY = e.clientY + buttoninfo.verticalScroll; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseDown) bobj.functionobj.MouseDown(e, buttoninfo, bobj); - - if (bobj.repeatwait) { // if a repeat wait is set, then starting waiting for first repetition - buttoninfo.timer = window.setTimeout(SocialCalc.ButtonRepeat, bobj.repeatwait); - } - - return; - - } - -// -// ButtonMouseUp(event) -// - -SocialCalc.ButtonMouseUp = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (buttoninfo.timer) { // if repeating, cancel it - window.clearTimeout(buttoninfo.timer); // cancel timer - buttoninfo.timer = null; - } - - if (!buttoninfo.buttonDown) return; // already did this (e.g., in IE, releaseCapture fires losecapture) - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mouseup", SocialCalc.ButtonMouseUp, true); - } - else if (document.detachEvent) { // IE - bobj.element.detachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - bobj.element.detachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.releaseCapture(); - } - - if (buttoninfo.buttonElement.downstyle) { - if (buttoninfo.doingHover) - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.hoverstyle); - else - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.normalstyle); - } - - buttoninfo.buttonDown = false; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseUp) bobj.functionobj.MouseUp(e, buttoninfo, bobj); - - } - -// -// ButtonRepeat() -// - -SocialCalc.ButtonRepeat = function() { - - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (!bobj) return; - - if (bobj && bobj.functionobj && bobj.functionobj.Repeat) bobj.functionobj.Repeat(null, buttoninfo, bobj); - - buttoninfo.timer = window.setTimeout(SocialCalc.ButtonRepeat, bobj.repeatinterval || 100); - - } - -// ************************************* -// -// MouseWheel functions: -// -// ************************************* - -SocialCalc.MouseWheelInfo = { - - // There is only one of these -- no "new" is done. - // The mousewheel only affects the one area the mouse pointer is over - // The registeredElements array is used to identify items. - - // One item for each element to respond to the mousewheel, each an object with: - // .element, .functionobj - - registeredElements: [] - - } - -// -// MouseWheelRegister(element, functionobj) - make element respond to mousewheel -// - -SocialCalc.MouseWheelRegister = function(element, functionobj) { - - var mousewheelinfo = SocialCalc.MouseWheelInfo; - - mousewheelinfo.registeredElements.push( - {element: element, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("DOMMouseScroll", SocialCalc.ProcessMouseWheel, false); - element.addEventListener("mousewheel", SocialCalc.ProcessMouseWheel, false); // Opera needs this - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousewheel", SocialCalc.ProcessMouseWheel); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - - } - -SocialCalc.ProcessMouseWheel = function(e) { - - var event = e || window.event; - var delta; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - var mousewheelinfo = SocialCalc.MouseWheelInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var wobj; - - for (wobj=null; !wobj && ele; ele=ele.parentNode) { // go up tree looking for one of our elements - wobj = SocialCalc.LookupElement(ele, mousewheelinfo.registeredElements); - } - if (!wobj) return; // not one of our elements - - if (event.wheelDelta) { - delta = event.wheelDelta/120; - } - else delta = -event.detail/3; - if (!delta) delta = 0; - - if (wobj.functionobj && wobj.functionobj.WheelMove) wobj.functionobj.WheelMove(event, delta, mousewheelinfo, wobj); - - if (event.preventDefault) event.preventDefault(); - event.returnValue = false; - - } - -// ************************************* -// -// Keyboard functions: -// -// For more information about keyboard handling, see: http://unixpapa.com/js/key.html -// -// ************************************* - -SocialCalc.keyboardTables = { - - specialKeysCommon: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - specialKeysIE: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - controlKeysIE: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]" - }, - - specialKeysOpera: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", - 45: "[ins]", // issues with releases before 9.5 - same as "-" ("-" changed in 9.5) - 46: "[del]", // issues with releases before 9.5 - same as "." ("." changed in 9.5) - 113: "[f2]" - }, - - controlKeysOpera: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]" - }, - - specialKeysSafari: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 63232: "[aup]", 63233: "[adown]", - 63234: "[aleft]", 63235: "[aright]", 63272: "[del]", 63273: "[home]", 63275: "[end]", 63276: "[pgup]", - 63277: "[pgdn]", 63237: "[f2]" - }, - - controlKeysSafari: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]" - }, - - ignoreKeysSafari: { - 63236: "[f1]", 63238: "[f3]", 63239: "[f4]", 63240: "[f5]", 63241: "[f6]", 63242: "[f7]", - 63243: "[f8]", 63244: "[f9]", 63245: "[f10]", 63246: "[f11]", 63247: "[f12]", 63289: "[numlock]" - }, - - specialKeysFirefox: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - controlKeysFirefox: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]" - }, - - ignoreKeysFirefox: { - 16: "[shift]", 17: "[ctrl]", 18: "[alt]", 20: "[capslock]", 19: "[pause]", 44: "[printscreen]", - 91: "[windows]", 92: "[windows]", 112: "[f1]", 114: "[f3]", 115: "[f4]", 116: "[f5]", - 117: "[f6]", 118: "[f7]", 119: "[f8]", 120: "[f9]", 121: "[f10]", 122: "[f11]", 123: "[f12]", - 144: "[numlock]", 145: "[scrolllock]", 224: "[cmd]" - } - } - -SocialCalc.Keyboard = { - areListener: false, // if true, we have been installed as a listener for keyboard events - focusTable: null, // the table editor object that gets keystrokes or null - passThru: null, // if not null, control element with focus to pass keyboard events to (has blur method), or "true" - didProcessKey: false, // did SocialCalc.ProcessKey in keydown - statusFromProcessKey: false, // the status from the keydown SocialCalc.ProcessKey - repeatingKeyPress: false, // some browsers (Opera, Gecko Mac) repeat special keys as KeyPress not KeyDown - chForProcessKey: "" // remember so can do repeat in those cases - }; - -SocialCalc.KeyboardSetFocus = function(editor) { - - SocialCalc.Keyboard.focusTable = editor; - - if (!SocialCalc.Keyboard.areListener) { - document.onkeydown = SocialCalc.ProcessKeyDown; - document.onkeypress = SocialCalc.ProcessKeyPress; - SocialCalc.Keyboard.areListener = true; - } - if (SocialCalc.Keyboard.passThru) { - if (SocialCalc.Keyboard.passThru.blur) { - SocialCalc.Keyboard.passThru.blur(); - } - SocialCalc.Keyboard.passThru = null; - } - window.focus(); - } - -SocialCalc.KeyboardFocus = function() { - - SocialCalc.Keyboard.passThru = null; - window.focus(); - - } - -SocialCalc.ProcessKeyDown = function(e) { - - var kt = SocialCalc.keyboardTables; - kt.didProcessKey = false; // always start false - kt.statusFromProcessKey = false; - kt.repeatingKeyPress = false; - - var ch=""; - var status=true; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - if (e.which==undefined) { // IE - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { - if (e.ctrlKey) { - ch=kt.controlKeysIE[e.keyCode]; - } - if (!ch) - return true; - } - status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - } - - else { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { -// return true; - if (e.ctrlKey || e.metaKey) { - ch=kt.controlKeysIE[e.keyCode]; // this works here - } - if (!ch) - return true; - } - - status = SocialCalc.ProcessKey(ch, e); // process the key - kt.didProcessKey = true; // remember what happened - kt.statusFromProcessKey = status; - kt.chForProcessKey = ch; - } - - return status; - - } - -SocialCalc.ProcessKeyPress = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - - e = e || window.event; - - if (SocialCalc.Keyboard.passThru) return; // ignore - if (kt.didProcessKey) { // already processed this key - if (kt.repeatingKeyPress) { - return SocialCalc.ProcessKey(kt.chForProcessKey, e); // process the same key as on KeyDown - } - else { - kt.repeatingKeyPress = true; // see if get another KeyPress before KeyDown - return kt.statusFromProcessKey; // do what it said to do - } - } - - if (e.which==undefined) { // IE - // Note: Esc and Enter will come through here, too, if not stopped at KeyDown - ch=String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) - } - - else { // not IE - if (!e.which) - return false; // ignore - special key - if (e.charCode==undefined) { // Opera - if (e.which!=0) { // character - if (e.which<32 || e.which==144) { // special char (144 is numlock) - ch = kt.specialKeysOpera[e.which]; - if (ch) { - return true; - } - } - else { - if (e.ctrlKey) { - ch=kt.controlKeysOpera[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - else { // special char - return true; - } - } - - else if (e.keyCode==0 && e.charCode==0) { // OLPC Fn key or something - return; // ignore - } - - else if (e.keyCode==e.charCode) { // Safari - ch = kt.specialKeysSafari[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysSafari[e.keyCode]) // pass this through - return true; - if (e.metaKey) { - ch=kt.controlKeysSafari[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - - else { // Firefox - if (kt.specialKeysFirefox[e.keyCode]) { - return true; - } - ch = String.fromCharCode(e.which); - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysFirefox[e.which]; - } - } - } - - var status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - - return status; - - } - -/* - * - * OLD ProcessKeyDown and ProcessKeyPress -- replaced for handling newer browsers, including Safari 3.1 and Opera 9.5 - * - -SocialCalc.ProcessKeyDown = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - var status=true; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - if (e.which==undefined) { // IE - ch = kt.specialKeysIE[e.keyCode]; - if (!ch) { - if (e.ctrlKey) { - ch=kt.controlKeysIE[e.keyCode]; - } - if (!ch) - return true; - } - - status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - } - - else { // don't do anything for other browsers - wait for keyPress - ; // special key repeats are done as keypress in those browsers - } - - return status; - - } - -SocialCalc.ProcessKeyPress = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - if (e.which==undefined) { // IE - // Note: Esc and Enter will come through here, too, if not stopped at KeyDown - ch=String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) - } - - else { // not IE - if (e.charCode==undefined) { // Opera - if (e.which!=0) { // character - if (e.which<32) { // special char - ch = kt.specialKeysOpera[e.keyCode]; - if (!ch) - return true; - } - else { - if (e.ctrlKey) { - ch=kt.controlKeysOpera[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - else { // special char - ch = kt.specialKeysOpera[e.keyCode]; - if (!ch) - return true; - } - } - - else if (e.keyCode==0 && e.charCode==0) { // OLPC Fn key or something - return; // ignore - } - - else if (e.keyCode==e.charCode) { // Safari - ch = kt.specialKeysSafari[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysSafari[e.keyCode]) // pass this through - return true; - if (e.metaKey) { - ch=kt.controlKeysSafari[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - - else { // Firefox - ch = kt.specialKeysFirefox[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysFirefox[e.keyCode]) // pass this through - return true; - if (e.which) { // normal char - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysFirefox[e.which]; - } - else { - ch = String.fromCharCode(e.which); - } - } - else { // usually a special char - return true; // old Firefox gives extra, empty keyPress for "/" - ignore - } - } - } - } - - var status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - - return status; - - } -*/ - -// -// status = SocialCalc.ProcessKey(ch, e) -// -// Take a key representation as a character string and dispatch to appropriate routine -// - -SocialCalc.ProcessKey = function (ch, e) { - - var ft = SocialCalc.Keyboard.focusTable; - - if (!ft) return true; // we're not handling it -- let browser do default - - return ft.EditorProcessKey(ch, e); - - } - - diff --git a/DeveloperAdoption/public/socialcalc/socialcalcviewer.js b/DeveloperAdoption/public/socialcalc/socialcalcviewer.js deleted file mode 100644 index 7abcf8b..0000000 --- a/DeveloperAdoption/public/socialcalc/socialcalcviewer.js +++ /dev/null @@ -1,687 +0,0 @@ -// -// SocialCalcViewer -// -/* -// The code module of the SocialCalc package that lets you embed a spreadsheet viewer -// with an optional simple toolbar into a web page. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript SpreadsheetViewer. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the SpreadsheetViewer is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/ - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); - } - -// ************************************* -// -// SpreadsheetViewer class: -// -// ************************************* - -// Global constants: - - SocialCalc.CurrentSpreadsheetViewerObject = null; // right now there can only be one active at a time - - -// Constructor: - -SocialCalc.SpreadsheetViewer = function() { - - var scc = SocialCalc.Constants; - - // Properties: - - this.parentNode = null; - this.spreadsheetDiv = null; - this.requestedHeight = 0; - this.requestedWidth = 0; - this.requestedSpaceBelow = 0; - this.height = 0; - this.width = 0; - this.viewheight = 0; // calculated amount for views below toolbar, etc. - - // Dynamic properties: - - this.sheet = null; - this.context = null; - this.editor = null; - - this.spreadsheetDiv = null; - this.editorDiv = null; - - this.sortrange = ""; // remembered range for sort tab - - // Constants: - - this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-" - this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src - - this.statuslineheight = scc.SVStatuslineheight; // in pixels - this.statuslineCSS = scc.SVStatuslineCSS; - - // Callbacks: - - // Initialization Code: - - this.sheet = new SocialCalc.Sheet(); - this.context = new SocialCalc.RenderContext(this.sheet); - this.context.showGrid=true; - this.context.showRCHeaders=true; - this.editor = new SocialCalc.TableEditor(this.context); - this.editor.noEdit = true; - this.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetViewerStatuslineCallback, - params: {}}; - this.hasStatusLine = true; // default -// this.statuslineHTML = '
    {status}Will be link
    '; - this.statuslineHTML = '
    {status} 
    '; - this.statuslineFull = true; - this.noRecalc = true; // don't do a recalc when loaded, so no need for external sheet routines - - // Repeating macro info - - this.repeatingMacroTimer = null; - this.repeatingMacroInterval = 60; // default to 60 seconds - this.repeatingMacroCommands = ""; // what to execute - - - SocialCalc.CurrentSpreadsheetViewerObject = this; // remember this for rendezvousing on events - - return; - - } - -// Methods: - -SocialCalc.SpreadsheetViewer.prototype.InitializeSpreadsheetViewer = - function(node, height, width, spacebelow) {return SocialCalc.InitializeSpreadsheetViewer(this, node, height, width, spacebelow);}; -SocialCalc.SpreadsheetViewer.prototype.LoadSave = function(str) {return SocialCalc.SpreadsheetViewerLoadSave(this, str);}; -SocialCalc.SpreadsheetViewer.prototype.DoOnResize = function() {return SocialCalc.DoOnResize(this);}; -SocialCalc.SpreadsheetViewer.prototype.SizeSSDiv = function() {return SocialCalc.SizeSSDiv(this);}; -SocialCalc.SpreadsheetViewer.prototype.DecodeSpreadsheetSave = - function(str) {return SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave(this, str);}; - -// Sheet Methods to make things a little easier: - -SocialCalc.SpreadsheetViewer.prototype.ParseSheetSave = function(str) {return this.sheet.ParseSheetSave(str);}; - - -// Functions: - -// -// InitializeSpreadsheetViewer(spreadsheet, node, height, width, spacebelow) -// -// Creates the control elements and makes them the child of node (string or element). -// If present, height and width specify size. -// If either is 0 or null (missing), the maximum that fits on the screen -// (taking spacebelow into account) is used. -// -// You should do a redisplay or recalc (which redisplays) after running this. -// - -SocialCalc.InitializeSpreadsheetViewer = function(spreadsheet, node, height, width, spacebelow) { - - var scc = SocialCalc.Constants; - var SCLoc = SocialCalc.LocalizeString; - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var html, child, i, vname, v, style, button, bele; - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - spreadsheet.requestedHeight = height; - spreadsheet.requestedWidth = width; - spreadsheet.requestedSpaceBelow = spacebelow; - - if (typeof node == "string") node = document.getElementById(node); - - if (node == null) { - alert("SocialCalc.SpreadsheetControl not given parent node."); - } - - spreadsheet.parentNode = node; - - // create node to hold spreadsheet view - - spreadsheet.spreadsheetDiv = document.createElement("div"); - - spreadsheet.SizeSSDiv(); // calculate and fill in the size values - - for (child=node.firstChild; child!=null; child=node.firstChild) { - node.removeChild(child); - } - - node.appendChild(spreadsheet.spreadsheetDiv); - - // create sheet div - - spreadsheet.nonviewheight = spreadsheet.hasStatusLine ? spreadsheet.statuslineheight : 0; - spreadsheet.viewheight = spreadsheet.height-spreadsheet.nonviewheight; - spreadsheet.editorDiv=spreadsheet.editor.CreateTableEditor(spreadsheet.width, spreadsheet.viewheight); - - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.editorDiv); - - // create statusline - - if (spreadsheet.hasStatusLine) { - spreadsheet.statuslineDiv = document.createElement("div"); - spreadsheet.statuslineDiv.style.cssText = spreadsheet.statuslineCSS; - spreadsheet.statuslineDiv.style.height = spreadsheet.statuslineheight - - (spreadsheet.statuslineDiv.style.paddingTop.slice(0,-2)-0) - - (spreadsheet.statuslineDiv.style.paddingBottom.slice(0,-2)-0) + "px"; - spreadsheet.statuslineDiv.id = spreadsheet.idPrefix+"statusline"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.statuslineDiv); - spreadsheet.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetViewerStatuslineCallback, - params: {spreadsheetobj:spreadsheet}}; - } - - // done - refresh screen needed - - return; - - } - -SocialCalc.SpreadsheetViewerLoadSave = function(spreadsheet, savestr) { - - var rmstr, pos, t, t2; - - var parts = spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - spreadsheet.sheet.ResetSheet(); - spreadsheet.sheet.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) { // executed now - spreadsheet.editor.EditorScheduleSheetCommands(savestr.substring(parts.startupmacro.start, parts.startupmacro.end), false, true); - } - if (parts.repeatingmacro) { // first line tells how many seconds before first execution. Last cmd must be "cmdextension repeatmacro delay" to continue repeating. - rmstr = savestr.substring(parts.repeatingmacro.start, parts.repeatingmacro.end); - rmstr = rmstr.replace("\r", ""); // make sure no CR, only LF - pos = rmstr.indexOf("\n"); - if (pos > 0) { - t = rmstr.substring(0, pos)-0; // get number - t2 = t; -// if (!(t > 0)) t = 60; // handles NAN, too - spreadsheet.repeatingMacroInterval = t; - spreadsheet.repeatingMacroCommands = rmstr.substring(pos+1); - if (t2 > 0) { // zero means don't start yet - spreadsheet.repeatingMacroTimer = window.setTimeout(SocialCalc.SpreadsheetViewerDoRepeatingMacro, spreadsheet.repeatingMacroInterval * 1000); - } - } - } - } - if (spreadsheet.editor.context.sheetobj.attribs.recalc=="off" || spreadsheet.noRecalc) { - spreadsheet.editor.ScheduleRender(); - } - else { - spreadsheet.editor.EditorScheduleSheetCommands("recalc"); - } - } - -// -// SocialCalc.SpreadsheetViewerDoRepeatingMacro -// -// Called by a timer. Executes repeatingMacroCommands once. -// Use the "startcmdextension repeatmacro delay" command last to schedule this again. -// - -SocialCalc.SpreadsheetViewerDoRepeatingMacro = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - var editor = spreadsheet.editor; - - spreadsheet.repeatingMacroTimer = null; - - SocialCalc.SheetCommandInfo.CmdExtensionCallbacks.repeatmacro = {func:SocialCalc.SpreadsheetViewerRepeatMacroCommand, data:null}; - - editor.EditorScheduleSheetCommands(spreadsheet.repeatingMacroCommands); - -} - -SocialCalc.SpreadsheetViewerRepeatMacroCommand = function(name, data, sheet, cmd, saveundo) { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - - var rest = cmd.RestOfString(); - var t = rest-0; // get number - if (!(t > 0)) t = spreadsheet.repeatingMacroInterval; // handles NAN, too, using last value - spreadsheet.repeatingMacroInterval = t; - - spreadsheet.repeatingMacroTimer = window.setTimeout(SocialCalc.SpreadsheetViewerDoRepeatingMacro, spreadsheet.repeatingMacroInterval * 1000); - -} - -SocialCalc.SpreadsheetViewerStopRepeatingMacro = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - - if (spreadsheet.repeatingMacroTimer) { - window.clearTimeout(spreadsheet.repeatingMacroTimer); - spreadsheet.repeatingMacroTimer = null; - } -} - -// -// SocialCalc.SpreadsheetViewerDoButtonCmd(e, buttoninfo, bobj) -// -// xxx -// - -SocialCalc.SpreadsheetViewerDoButtonCmd = function(e, buttoninfo, bobj) { - - var obj = bobj.element; - var which = bobj.functionobj.command; - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - var editor = spreadsheet.editor; - - switch (which) { - case "recalc": - editor.EditorScheduleSheetCommands("recalc"); - break; - - default: - break; - } - - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - - } - - -// -// outstr = SocialCalc.LocalizeString(str) -// -// SocialCalc function to make localization easier. -// If str is "Text to localize", it returns -// SocialCalc.Constants.s_loc_text_to_localize if -// it exists, or else with just "Text to localize". -// Note that spaces are replaced with "_" and other special -// chars with "X" in the name of the constant (e.g., "A & B" -// would look for SocialCalc.Constants.s_loc_a_X_b. -// - -SocialCalc.LocalizeString = function(str) { - var cstr = SocialCalc.LocalizeStringList[str]; // found already this session? - if (!cstr) { // no - look up - cstr = SocialCalc.Constants["s_loc_"+str.toLowerCase().replace(/\s/g, "_").replace(/\W/g, "X")] || str; - SocialCalc.LocalizeStringList[str] = cstr; - } - return cstr; - } - -SocialCalc.LocalizeStringList = {}; // a list of strings to localize accumulated by the routine - -// -// outstr = SocialCalc.LocalizeSubstrings(str) -// -// SocialCalc function to make localization easier using %loc and %scc. -// -// Replaces sections of str with: -// %loc!Text to localize! -// with SocialCalc.Constants.s_loc_text_to_localize if -// it exists, or else with just "Text to localize". -// Note that spaces are replaced with "_" and other special -// chars with "X" in the name of the constant (e.g., %loc!A & B! -// would look for SocialCalc.Constants.s_loc_a_X_b. -// Uses SocialCalc.LocalizeString for this. -// -// Replaces sections of str with: -// %ssc!constant-name! -// with SocialCalc.Constants.constant-name. -// If the constant doesn't exist, throws and alert. -// - -SocialCalc.LocalizeSubstrings = function(str) { - - var SCLoc = SocialCalc.LocalizeString; - - return str.replace(/%(loc|ssc)!(.*?)!/g, function(a, t, c) { - if (t=="ssc") { - return SocialCalc.Constants[c] || alert("Missing constant: "+c); - } - else { - return SCLoc(c); - } - }); - - } - -// -// obj = GetSpreadsheetViewerObject() -// -// Returns the current spreadsheet view object -// - -SocialCalc.GetSpreadsheetViewerObject = function() { - - var csvo = SocialCalc.CurrentSpreadsheetViewerObject; - if (csvo) return csvo; - - throw ("No current SpreadsheetViewer object."); - - } - - -// -// SocialCalc.DoOnResize(spreadsheet) -// -// Processes an onResize event, setting the different views. -// - -SocialCalc.DoOnResize = function(spreadsheet) { - - var v; - var views = spreadsheet.views; - - var needresize = spreadsheet.SizeSSDiv(); - if (!needresize) return; - - for (vname in views) { - v = views[vname].element; - v.style.width = spreadsheet.width + "px"; - v.style.height = (spreadsheet.height-spreadsheet.nonviewheight) + "px"; - } - - spreadsheet.editor.ResizeTableEditor(spreadsheet.width, spreadsheet.height-spreadsheet.nonviewheight); - - } - - -// -// resized = SocialCalc.SizeSSDiv(spreadsheet) -// -// Figures out a reasonable size for the spreadsheet, given any requested values and viewport. -// Sets ssdiv to that. -// Return true if different than existing values. -// - -SocialCalc.SizeSSDiv = function(spreadsheet) { - - var sizes, pos, resized, nodestyle, newval; - var fudgefactorX = 10; // for IE - var fudgefactorY = 10; - - resized = false; - - sizes = SocialCalc.GetViewportInfo(); - pos = SocialCalc.GetElementPosition(spreadsheet.parentNode); - pos.bottom = 0; - pos.right = 0; - - nodestyle = spreadsheet.parentNode.style; - - if (nodestyle.marginTop) { - pos.top += nodestyle.marginTop.slice(0,-2)-0; - } - if (nodestyle.marginBottom) { - pos.bottom += nodestyle.marginBottom.slice(0,-2)-0; - } - if (nodestyle.marginLeft) { - pos.left += nodestyle.marginLeft.slice(0,-2)-0; - } - if (nodestyle.marginRight) { - pos.right += nodestyle.marginRight.slice(0,-2)-0; - } - - newval = spreadsheet.requestedHeight || - sizes.height - (pos.top + pos.bottom + fudgefactorY) - - (spreadsheet.requestedSpaceBelow || 0); - if (spreadsheet.height != newval) { - spreadsheet.height = newval; - spreadsheet.spreadsheetDiv.style.height = newval + "px"; - resized = true; - } - newval = spreadsheet.requestedWidth || - sizes.width - (pos.left + pos.right + fudgefactorX) || 700; - if (spreadsheet.width != newval) { - spreadsheet.width = newval; - spreadsheet.spreadsheetDiv.style.width = newval + "px"; - resized = true; - } - - return resized; - - } - - -// -// SocialCalc.SpreadsheetViewerStatuslineCallback -// - -SocialCalc.SpreadsheetViewerStatuslineCallback = function(editor, status, arg, params) { - - var spreadsheet = params.spreadsheetobj; - var slstr = ""; - - if (spreadsheet && spreadsheet.statuslineDiv) { - if (spreadsheet.statuslineFull) { - slstr = editor.GetStatuslineString(status, arg, params); - } - else { - slstr = editor.ecell.coord; - } - slstr = spreadsheet.statuslineHTML.replace(/\{status\}/, slstr); - spreadsheet.statuslineDiv.innerHTML = slstr; - } - - switch (status) { - case "cmdendnorender": - case "calcfinished": - case "doneposcalc": - break; // not updating Recalc button since no toolbar - - default: - break; - } - - } - - -// -// SocialCalc.CmdGotFocus(obj) -// -// Sets SocialCalc.Keyboard.passThru: obj should be element with focus or "true" -// - -SocialCalc.CmdGotFocus = function(obj) { - - SocialCalc.Keyboard.passThru = obj; - - } - - -// -// result = SocialCalc.SpreadsheetViewerCreateSheetHTML(spreadsheet) -// -// Returns the HTML representation of the whole spreadsheet -// - -SocialCalc.SpreadsheetViewerCreateSheetHTML = function(spreadsheet) { - - var context, div, ele; - - var result = ""; - - context = new SocialCalc.RenderContext(spreadsheet.sheet); - div = document.createElement("div"); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - result = div.innerHTML; - delete ele; - delete div; - return result; - - } - - -/////////////////////// -// -// LOAD ROUTINE -// -/////////////////////// - -// -// parts = SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave(spreadsheet, str) -// -// Separates the parts from a spreadsheet save string, returning an object with the sub-strings. -// -// {type1: {start: startpos, end: endpos}, type2:...} -// - -SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave = function(spreadsheet, str) { - - var pos1, mpregex, searchinfo, boundary, boundaryregex, blanklineregex, start, ending, lines, i, lines, p, pnun; - var parts = {}; - var partlist = []; - -var hasreturnonly = /[^\n]\r[^\n]/; -if (hasreturnonly.test(str)) { -str = str.replace(/([^\n])\r([^\n])/g, "$1\r\n$2"); -} - pos1 = str.search(/^MIME-Version:\s1\.0/mi); - if (pos1 < 0) return parts; - - mpregex = /^Content-Type:\s*multipart\/mixed;\s*boundary=(\S+)/mig; - mpregex.lastIndex = pos1; - - searchinfo = mpregex.exec(str); - if (mpregex.lastIndex <= 0) return parts; - boundary = searchinfo[1]; - - boundaryregex = new RegExp("^--"+boundary+"(?:\r\n|\n)", "mg"); - boundaryregex.lastIndex = mpregex.lastIndex; - - searchinfo = boundaryregex.exec(str); // find header top boundary - blanklineregex = /(?:\r\n|\n)(?:\r\n|\n)/gm; - blanklineregex.lastIndex = boundaryregex.lastIndex; - searchinfo = blanklineregex.exec(str); // skip to after blank line - if (!searchinfo) return parts; - start = blanklineregex.lastIndex; - boundaryregex.lastIndex = start; - searchinfo = boundaryregex.exec(str); // find end of header - if (!searchinfo) return parts; - ending = searchinfo.index; - - lines = str.substring(start, ending).split(/\r\n|\n/); // get header as lines - for (i=0;i - - - -SS Ctrl Test 1 - - - - - - - - - - - -
    -
    -ssctrltest1.html - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -
    editor goes here
    - - - diff --git a/DeveloperAdoption/public/static/#%2Amerge%2A#850aay# b/DeveloperAdoption/public/static/#%2Amerge%2A#850aay# deleted file mode 100644 index e9e434e..0000000 --- a/DeveloperAdoption/public/static/#%2Amerge%2A#850aay# +++ /dev/null @@ -1,1870 +0,0 @@ -// -// Workbook Control controls workbook actions (add/del/rename etc) and can appear at the -// bottom of the screen (?). Right now its just a proof of concept -// and appears at the top of the screen -// -// Author: Ramu Ramamurthy -// -// - -var SocialCalc; -if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; -} - -SocialCalc.CurrentWorkbookControlObject = null; - -SocialCalc.TestWorkBookSaveStr = ""; - - -// Constructor: - -SocialCalc.WorkBookControl = function(book, divid, defaultsheetname) { - - this.workbook = book; - this.div = divid; - this.defaultsheetname = defaultsheetname; - this.sheetButtonArr = {}; - this.sheetCnt = 0; - this.numSheets = 0; - this.currentSheetButton = null; - this.renameDialogId = "sheetRenameDialog"; - this.deleteDialogId = "sheetDeleteDialog"; - this.hideDialogId = "sheetHideDialog"; - this.unhideDialogId = "sheetUnhideDialog"; - - this.sheetshtml = ''; - -//this.buttonshtml = -//'
    '+ -//'
    '+ -//''+ -//''+ -//''+ - -// ''+ -// ''+ -// ''+ - -//''+ -//''+ -//'
    '+ -//'
    '; - - SocialCalc.CurrentWorkbookControlObject = this; - this.sheetbar = new SocialCalc.SheetBar(); -} - -// methods -SocialCalc.WorkBookControl.prototype.GetCurrentWorkBookControl = function() {return SocialCalc.GetCurrentWorkBookControl();}; -SocialCalc.WorkBookControl.prototype.InitializeWorkBookControl = function() {return SocialCalc.InitializeWorkBookControl(this);}; - - -SocialCalc.WorkBookControl.prototype.ExecuteWorkBookControlCommand = function(cmd, isremote) { - return SocialCalc.ExecuteWorkBookControlCommand(this, cmd, isremote); -} - -SocialCalc.ExecuteWorkBookControlCommand = function(control, cmd, isremote) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - //if (!isremote) { - // return; - //} - - if (cmd.cmdtype == "scmd") { - // dispatch a sheet command - control.workbook.WorkbookScheduleCommand(cmd, isremote); - return; - - } - - if (cmd.cmdtype != "wcmd") { - return; - } - - var parseobj = new SocialCalc.Parse(cmd.cmdstr); - - var cmd1 = parseobj.NextToken(); - - switch (cmd1) { - case "addsheet": - SocialCalc.WorkBookControlAddSheetRemote(null); - break; - - case "addsheetstr": - var sheetstr = cmd.sheetstr; - SocialCalc.WorkBookControlAddSheetRemote(sheetstr); - break; - - case "delsheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlDelSheetRemote(sheetid); - break; - - case "rensheet": - var sheetid = parseobj.NextToken(); - var oldname = parseobj.NextToken(); - var newname = parseobj.NextToken(); - SocialCalc.WorkBookControlRenameSheetRemote(sheetid, oldname, newname); - break; - - case "activatesheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlActivateSheet(sheetid); - break; - - case "hidesheet": - var sheetid = parseobj.NextToken(); - - break; - - case "unhidesheet": - var sheetid = parseobj.NextToken(); - - break; - } -} - -SocialCalc.GetCurrentWorkBookControl = function() { - return SocialCalc.CurrentWorkbookControlObject; -} - -SocialCalc.InitializeWorkBookControl = function(control) { - var element = document.createElement("div"); - element.innerHTML = control.sheetshtml; - var foo = document.getElementById(control.div); - foo.appendChild(element); - //var element2 = document.createElement("div"); - //element2.innerHTML = control.buttonshtml; - //foo.appendChild(element2); - SocialCalc.WorkBookControlAddSheet(false); // this is for the default sheet -} - -SocialCalc.WorkBookControlDelSheetRemote = function(sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (sheetid == control.currentSheetButton.id) { - // the active sheet is being deleted - SocialCalc.WorkBookControlDelSheet(); - return; - } - // some non active sheet is being deleted - var foo = document.getElementById("fooBar"); - var deletedbutton = document.getElementById(sheetid); - - var did = deletedbutton.id; - var dname = deletedbutton.value; - delete control.sheetButtonArr[did]; - - foo.removeChild(deletedbutton); - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+did); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - // delete the sheet - control.workbook.DeleteWorkBookSheet(did, dname); - control.numSheets = control.numSheets-1; - -} - -// assumes that the current active sheet is being deleted -SocialCalc.WorkBookControlDelSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } -if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='To delete the selected sheet, you must first insert a new sheet.
    '; -str +='
    '+ - '
    '; - var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the deletion of the sheet - // the popup has two buttons : Confirm and Cancel -var element = document.getElementById(control.deleteDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+ 'The selected sheet will be permanently deleted.'+ '
    '; -str +='
      '; - str +='
    • To delete the selected sheet, click OK.
    • '; - str +='
    • To cancel the deletion, click cancel.
    • '; -str+='
    '; -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.WorkBookControlDeleteSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.deleteDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlDeleteSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlDeleteSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.currentSheetButton = null; - // delete the sheets - control.workbook.DeleteWorkBookSheet(name, curname); - control.numSheets = control.numSheets-1; - - var cmdstr = "delsheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true) - break; - } - } - if (control.currentSheetButton != null) { - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } -} - -// assumes that the current active sheet is being hidden -SocialCalc.WorkBookControlHideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='Before hiding the selected sheet, you must first insert a new sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the hiding of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.hideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The selected sheet will be hidden.'+ '
    '; - str +='
      '; - str +='
    • To hide the selected sheet, click OK.
    • '; - str +='
    • To cancel the hiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - -SocialCalc.WorkBookControlHideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.hideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlHideSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlHideSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, false); - sheetbarbutton.style.display="none"; - control.currentSheetButton = null; - // delete the sheets - - control.numSheets = control.numSheets-1; - - var cmdstr = "hidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - -// displays all hidden sheets, and then unhides whatever is selected -SocialCalc.WorkBookControlUnhideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - - var unhiddencount = 0; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - unhiddencount++; - } - } - - if(unhiddencount==0) { //no hidden sheets, error message here - var str = '
    '+ - ''+' There are no hidden worksheets. ' + '

    '; - str +='Before unhiding any sheets, you must first hide a sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - var element = document.getElementById(control.unhideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The following sheets are hidden.'+ '
      ' + - ''; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - str += '' + control.sheetButtonArr[sheet].value +'
      '; - } - } - - str +='
    \n
      '; - str +='
    • To unhide the selected sheet, click OK.
    • '; - str +='
    • To cancel the unhiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - - - -SocialCalc.WorkBookControlUnhideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.unhideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} - - -SocialCalc.WorkBookControlUnhideSheetSubmit = function(name) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlUnhideSheetHide(); - var current = document.getElementById(control.currentSheetButton.id); - - var curid = current.id; - var curname = control.currentSheetButton.value; - - control.currentSheetButton.setAttribute("style",""); - var old = control.currentSheetButton.id; - console.log(old); - SocialCalc.SheetBarButtonActivate(old, false); - - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unhide the button - sheetbarbutton.style.display = "inline"; - control.currentSheetButton = null; - - control.numSheets = control.numSheets+1; - - var cmdstr = "unhidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - - - -SocialCalc.WorkBookControlAddSheetButton = function(sheetname, sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - //Create an input type dynamically. - var element = document.createElement("input"); - - var name = null; - - if (sheetid != null) { - name = sheetid - } else { - name = "sheet"+ (control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt + 1; - } - - //Assign different attributes to the element. - element.setAttribute("type", "button"); - if (sheetname == null) { - element.setAttribute("value", name); - } else { - element.setAttribute("value", sheetname); - } - element.setAttribute("id", name); - element.setAttribute("name", name); - - var fnname = "SocialCalc.WorkBookControlActivateSheet("+"'"+name+"'"+")"; - - element.setAttribute("onclick",fnname); - - control.sheetButtonArr[name] = element; - - - var foo = document.getElementById("fooBar"); - - //Append the element in page (in span). - foo.appendChild(element); - - control.numSheets = control.numSheets + 1; - - var el = new SocialCalc.SheetBarSheetButton("sbsb-"+name, (sheetname?sheetname:name), - document.getElementById("SocialCalc-sheetbar-buttons"), - { - //normalstyle: "border:1px solid #000;backgroundColor:#FFF;", - //downstyle: "border:1px solid #000;backgroundColor:#CCC;", - //hoverstyle: "border:1px solid #000;backgroundColor:#FFF;" - }, - { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(name);}, - Repeat:function(){}, - Disabled: function() {} - } - ); - - return element; -} - -SocialCalc.WorkBookControlAddSheet = function(addworksheet, sheetname){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(sheetname); - - // then change the highlight - - var old="sheet1"; - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style", ""); - old = control.currentSheetButton.id; - SocialCalc.SheetBarButtonActivate(old, false); - } - - element.setAttribute("style","background-color:lightgreen"); - control.currentSheetButton = element; - var newsheetid = element.id; - SocialCalc.SheetBarButtonActivate(newsheetid, true); - - // create the sheet - if (addworksheet) { - control.workbook.AddNewWorkBookSheet(newsheetid, old, false); - // broadcast an add command here - var cmdstr = "addsheet" - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - } - -} - -SocialCalc.WorkBookControlAddSheetRemote = function(savestr){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(); - - // add the sheet, dont switch to it - control.workbook.AddNewWorkBookSheetNoSwitch(element.id, - element.value, savestr); -} - - -SocialCalc.WorkBookControlActivateSheet = function(name) { - - //alert("in activate sheet="+name) - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById(name); - foo.setAttribute("style","background-color:lightgreen;"); - SocialCalc.SheetBarButtonActivate(name, true) - - var old = control.currentSheetButton.id; - if (control.currentSheetButton.id != foo.id) { - control.currentSheetButton.setAttribute("style", ""); - SocialCalc.SheetBarButtonActivate(old, false) - } - - control.currentSheetButton = foo; - - control.workbook.ActivateWorkBookSheet(name, old); - -} - -SocialCalc.WorkBookControlHttpRequest = null; - -SocialCalc.WorkBookControlAlertContents = function(){ - - var loadedstr = ""; - var http_request = SocialCalc.WorkBookControlHttpRequest; - - if (http_request.readyState == 4) { - //addmsg("received:" + http_request.responseText.length + " chars"); - try { - if (http_request.status == 200) { - loadedstr = http_request.responseText || ""; - http_request = null; - } - else { - ; - } - } - catch (e) { - } - // do something with loaded str - //alert("loaded="+loadedstr); - SocialCalc.TestWorkBookSaveStr = loadedstr; - SocialCalc.Clipboard.clipboard = loadedstr; - } -} - - -SocialCalc.WorkBookControlAjaxCall = function(url, contents) { - - var http_request = null; - - alert("in ajax") - if (window.XMLHttpRequest) { // Mozilla, Safari,... - http_request = new XMLHttpRequest(); - } - else - if (window.ActiveXObject) { // IE - try { - http_request = new ActiveXObject("Msxml2.XMLHTTP"); - } - catch (e) { - try { - http_request = new ActiveXObject("Microsoft.XMLHTTP"); - } - catch (e) { - } - } - } - if (!http_request) { - alert('Giving up :( Cannot create an XMLHTTP instance'); - return false; - } - - // Make the actual request - SocialCalc.WorkBookControlHttpRequest = http_request; - - http_request.onreadystatechange = SocialCalc.WorkBookControlAlertContents; - http_request.open('POST', document.URL, true); // async - http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - http_request.send(contents); - - return true; - -} - -SocialCalc.WorkBookControlSaveSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetsave = {}; - - sheetsave.numsheets = control.numSheets; - sheetsave.currentid = control.currentSheetButton.id; - sheetsave.currentname = control.currentSheetButton.value; - - sheetsave.sheetArr = {} - for (var sheet in control.sheetButtonArr) { - var sheetstr = control.workbook.SaveWorkBookSheet(sheet); - sheetsave.sheetArr[sheet] = {} - sheetsave.sheetArr[sheet].sheetstr = sheetstr; - sheetsave.sheetArr[sheet].name = control.sheetButtonArr[sheet].value; - sheetsave.sheetArr[sheet].hidden = document.getElementById("sbsb-" + sheet).style.display == "none" ? "1" : "0"; - } - - // Save the editable cells if specified - if (SocialCalc.EditableCells && SocialCalc.EditableCells.allow) { - sheetsave.EditableCells = {}; - for (var i in SocialCalc.EditableCells) { - sheetsave.EditableCells[i] = SocialCalc.EditableCells[i]; - } - } - - SocialCalc.TestWorkBookSaveStr = JSON.stringify(sheetsave); - //alert(SocialCalc.TestWorkBookSaveStr); - // send it to the backend - // SocialCalc.WorkBookControlAjaxCall("/", "&sheetdata="+encodeURIComponent(SocialCalc.TestWorkBookSaveStr)); - return SocialCalc.TestWorkBookSaveStr; -} - - -// insert another workbook into an existing workbook -// assumption is at least 1 sheet exists in existing workbook -// sheets with same names will be overwritten ! -SocialCalc.WorkBookControlInsertWorkbook = function(savestr) { - var sheetsave - if (savestr) { - sheetsave = JSON.parse(savestr); - } - var control = SocialCalc.GetCurrentWorkBookControl(); - for (var sheet in sheetsave.sheetArr) { - - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end) - } - } - // check if sheetname already exists - var sheetname = sheetsave.sheetArr[sheet].name - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - if (sheetid) { - //alert(sheetname+"exists") - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, sheetname) - } - else { - //just test-brand new insert first - sheetid = "sheet"+(control.sheetCnt+1).toString() - control.sheetCnt = control.sheetCnt+1 - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid) - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr) - - } - } - -} - -SocialCalc.WorkBookControlLoad = function(savestr){ - - var sheetsave; - - if (savestr == "") return; - - if (savestr) { - sheetsave = JSON.parse(savestr); - } else { - sheetsave = JSON.parse(SocialCalc.TestWorkBookSaveStr); - } - //alert(sheetsave.currentid+","+sheetsave.currentname) - - // first create a new workbook - var control = SocialCalc.GetCurrentWorkBookControl(); - - SocialCalc.WorkBookControlCreateNewBook(); - - // at this point there is one sheet, and 1 button - // create the sequence of buttons, and sheets - var firstrun = true; - var newbuttons = 0 - var sheetid = null; - var currentsheetid = sheetsave.currentid; - //alert("button="+newbuttons) - for (var sheet in sheetsave.sheetArr) { - //alert(sheet); - if (newbuttons > sheetsave.numsheets) { - break; - } - //alert("button="+newbuttons) - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - if (firstrun) { - firstrun=false; - // set the first button's name correctly - sheetid = control.currentSheetButton.id; - control.currentSheetButton.value = sheetsave.sheetArr[sheet].name; - SocialCalc.SheetBarButtonSetName(sheetid, sheetsave.sheetArr[sheet].name); - // set the sheet data for the first sheet which already exists - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, control.currentSheetButton.value); - // need to also set the formula cache - currentsheetid = sheetid; - } - else { - sheetid = "sheet"+(control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt+1; - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr); - } - if(sheetsave.sheetArr[sheet].hidden=="1") { - // unregister with mouse ? etc - var sheetbarbutton = document.getElementById("sbsb-" + sheetid); - sheetbarbutton.style.display="none"; - SocialCalc.SheetBarButtonActivate(sheet, false); - newbuttons= newbuttons - 1; - } - if (sheet == sheetsave.currentid) { - currentsheetid = sheetid - } - newbuttons = newbuttons + 1; - } - // Save the user script data - if (sheetsave.EditableCells) { - SocialCalc.EditableCells = {}; - for (var i in sheetsave.EditableCells) { - SocialCalc.EditableCells[i] = sheetsave.EditableCells[i]; - } - } - var timeoutFn = function() { - SocialCalc.WorkBookControlActivateSheet(currentsheetid); - }; - window.setTimeout(timeoutFn, 200); -} - - -SocialCalc.WorkBookControlRenameSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // do a popup to get the new name of the sheet - // the popup has an input element with submit, and cancel buttons - var element = document.getElementById(control.renameDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+'Rename-'+ currentsheet + '
    '+ - '' + 'Please ensure that you DO NOT have ANY spaces in the sheet name.' + '' + - '
    '+'
    '; - -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.renameDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - -var ele = document.getElementById("newSheetName"); -ele.focus(); -SocialCalc.CmdGotFocus(ele); - -} - -SocialCalc.WorkBookControlRenameSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.renameDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlRenameSheetSubmit = function(){ - - // this handles all the rename action - var ele = document.getElementById("newSheetName"); - //alert(ele.value); - var control = SocialCalc.GetCurrentWorkBookControl(); - if (ele.value.length == 0) { - ele.focus(); - return; - } - var oldname = control.currentSheetButton.value; - var newname = ele.value; - - - SocialCalc.WorkBookControlRenameSheetHide(); - // verify newname does not clash with any existing sheet name - // if so reject - for (var sheet in control.sheetButtonArr) { - if (control.sheetButtonArr[sheet].value == newname) { - alert(newname+" already exists"); - return; - } - } - - control.currentSheetButton.value = newname; - - SocialCalc.SheetBarButtonSetName (control.currentSheetButton.id, newname); - - // perform a rename for formula references to this sheet in all the - // sheets in the workbook - control.workbook.RenameWorkBookSheet(oldname, ele.value, control.currentSheetButton.id); - - var cmdstr = "rensheet "+control.currentSheetButton.id+" "+oldname+" "+newname; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - -} - -SocialCalc.WorkBookControlRenameSheetRemote = function(sheetid, oldname, newname) { - //console.log("rename sheet ",sheetid, oldname, newname) - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById("fooBar"); - var renbutton = document.getElementById(sheetid); - - renbutton.value = newname; - - SocialCalc.SheetBarButtonSetName(sheetid, newname); - -control.workbook.RenameWorkBookSheet(oldname, newname, sheetid); - -} - - -SocialCalc.WorkBookControlCreateNewBook = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // delete all the sheets except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - control.workbook.DeleteWorkBookSheet(control.sheetButtonArr[sheet].id, control.sheetButtonArr[sheet].value); - } - } - // Reset that 1 sheet - - control.workbook.LoadRenameWorkBookSheet(control.currentSheetButton.id, "", control.workbook.defaultsheetname) - - - // delete all the buttons except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.sheetButtonArr[sheet].id); - - var name = current.id; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - control.numSheets = control.numSheets - 1; - } - } - // rename that button - control.currentSheetButton.value = control.workbook.defaultsheetname; - //alert("done new workbook") -} - -SocialCalc.WorkBookControlNewBook = function() { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlCreateNewBook(); - control.workbook.RenderWorkBookSheet(); -} - - -SocialCalc.WorkBookControlMove = function(direction){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - return; - } - var sheetArr = control.sheetButtonArr; - var newSheetArr = {}; - var sheetid = control.currentSheetButton.id; - - var curr_button = document.getElementById(sheetid); - var curr_sb_button = document.getElementById("sbsb-"+sheetid); - var sib_button = null; - var sib_sb_button = null; - if (direction == "left") { - sib_button = curr_button.previousSibling; - sib_sb_button = curr_sb_button.previousSibling; - if(!sib_sb_button) { - alert("Cannot move leftmost Sheet further to the left"); - return; - } - } - else { - sib_button = curr_button.nextSibling; - sib_sb_button = curr_sb_button.nextSibling; - if(!sib_sb_button) { - alert("Cannot move rightmost Sheet further to the right"); - return; - } - } - var currid = sheetid; - var sibid = sib_button.id; - var parent = curr_button.parentNode; - var sb_parent = curr_sb_button.parentNode; - - var cloned = {}; - var clonedsb = {}; - for(button in sheetArr) { - clonedsb[button] = document.getElementById("sbsb-"+button); - cloned[button] = document.getElementById(button); - sb_parent.removeChild(document.getElementById("sbsb-"+button)); - parent.removeChild(document.getElementById(button)); - } - for(button in sheetArr) { - if(button != currid && button != sibid) { - newSheetArr[button] = sheetArr[button]; - sb_parent.appendChild(clonedsb[button]); - parent.appendChild(cloned[button]); - } - else if(button == currid) { - if (direction == "left") { - newSheetArr[currid] = sheetArr[currid]; - newSheetArr[sibid] = sheetArr[sibid]; - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - } else { - newSheetArr[sibid] = sheetArr[sibid]; - newSheetArr[currid] = sheetArr[currid]; - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - } - } - } - control.sheetButtonArr = newSheetArr; - SocialCalc.SheetBarButtonActivate(currid,true); -} - -SocialCalc.WorkBookControlMoveLeft = function(){ - SocialCalc.WorkBookControlMove("left"); -} -SocialCalc.WorkBookControlMoveRight = function(){ - SocialCalc.WorkBookControlMove("right"); -} - - - -SocialCalc.WorkBookControlCopySheet = function(){ - - //alert("in copy"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - control.workbook.CopyWorkBookSheet(control.currentSheetButton.id); - - alert("copied sheet:"+control.currentSheetButton.value); -} - -SocialCalc.WorkBookControlPasteSheet = function() { - - //alert("in paste"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - var oldid = control.currentSheetButton.id; - - SocialCalc.WorkBookControlAddSheet(false); - - var newid = control.currentSheetButton.id; - - //alert(newid+oldid); - - control.workbook.PasteWorkBookSheet(newid, oldid); - - var cmdstr = "addsheetstr"; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr, sheetstr: control.workbook.clipsheet.savestr}); - -} - -SocialCalc.SheetBar = function() { - this.baseDiv = document.getElementById("SocialCalc-sheetbar"); - - this.prebuttonsDiv = document.createElement("div"); - this.prebuttonsDiv.style.cssText = "display:inline;"; - this.prebuttonsDiv.innerHTML="        "; - this.prebuttonsDiv.id = "SocialCalc-sheetbar-prebuttons"; - - this.buttonsDiv = document.createElement("div"); - this.buttonsDiv.id = "SocialCalc-sheetbar-buttons"; - this.buttonsDiv.style.cssText = "display:inline;"; - - this.buttonActionsDiv = document.createElement("div"); - this.buttonActionsDiv.id = "SocialCalc-sheetbar-buttonactions"; - this.buttonActionsDiv.style.display = "inline"; - var addbutton = new SocialCalc.SheetBarSheetButton("sbsba-add", "sbsba-add", this.buttonActionsDiv, - {}, - { - MouseDown:function(){var abc=SocialCalc.WorkBookControlAddSheet(true);} - }, - "add-2.png"); - - - this.baseDiv.appendChild(this.prebuttonsDiv); - this.baseDiv.appendChild(this.buttonsDiv); - this.baseDiv.appendChild(this.buttonActionsDiv); -} - -// define a new class for sheetbarsheetbutton - -SocialCalc.SheetBarSheetButton = function(id, name, parentdiv, params, functions, img) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.name = name; - if (!img) { - this.ele.innerHTML = name; - this.ele.style.cssText = "font-size:small;display:inline;padding:5px 5px 2px 5px;border:1px solid #000;"; - imgele = document.createElement("img"); - imgele.id = id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - SocialCalc.ButtonRegister(this.ele, params, functions); - SocialCalc.ButtonRegister(imgele, params, functions); - } else { - var imgele = document.createElement("img"); - imgele.src = SocialCalc.Constants.defaultImagePrefix +img; - imgele.style.cssText = "width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - this.ele.style.cssText = "display:inline;padding:5px 5px 2px 5px;"; - SocialCalc.ButtonRegister(imgele, params, functions); - } - parentdiv.appendChild(this.ele); -} - -SocialCalc.SheetBarButtonActivate = function(id, active) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.isactive = active; - if (active) { - sbbutton.style.backgroundColor = "#FFF"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (!imgele) { - imgele = document.createElement("img"); - imgele.id = "sbsb-"+id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - } - sbbutton.appendChild(imgele); - SocialCalc.ButtonRegister(imgele, {}, { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(id);}, - Repeat:function(){}, - Disabled: function() {} - } ); - } - else { - sbbutton.style.backgroundColor = "#CCC"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (imgele) { - sbbutton.removeChild(imgele); - } - } - var menu = document.getElementById("sbsb-menu"); - if (menu && menu.style.display != "none") { - menu.style.display = "none"; - } -} - -SocialCalc.SheetBarButtonSetName = function(id, name) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.name = name; - sbbutton.innerHTML = name; - if (sbbutton.isactive) { - SocialCalc.SheetBarButtonActivate(id, true); - } -} - - -SocialCalc.SheetBarSheetButtonPress = function(id) { - //console.log("button press") - var sbbutton = document.getElementById("sbsb-"+id); - if (sbbutton && sbbutton.isactive) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) { - var sbsbm = new SocialCalc.SheetBarSheetButtonMenu("sbsb-menu", id); - } else { - menu.clickedsheetid = id; - if (menu.style.display == "none") { - menu.style.display = "inline"; - SocialCalc.SheetBarSheetButtonMenuPosition(menu, id); - } else { - menu.style.display = "none"; - } - } - - } else if (sbbutton) { - SocialCalc.WorkBookControlActivateSheet(id); - } - -} - - -// define a new class for sheetbarsheet button menu item - -SocialCalc.SheetBarSheetButtonMenuItem = function(id, t) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.innerHTML = t; - this.ele.className = ""; - this.ele.style.cssText = "padding:3px 4px;width:100px;height:20px;background-color:#FFF;"; - - var params = { - normalstyle: "backgroundColor:#FFF;", - downstyle: "backgroundColor:#CCC;", - hoverstyle: "backgroundColor:#CCC;"}; - var functions = {MouseDown:function(){SocialCalc.SheetBarMenuItemPress(id);}, - Repeat:function(){}, - Disabled: function() {}}; - - SocialCalc.ButtonRegister(this.ele, params, functions); - - SocialCalc.TouchRegister(this.ele, {SingleTap:functions.MouseDown}); - - return this.ele; - -} - -SocialCalc.SheetBarMenuItemPress = function(id) { - - var menu = document.getElementById("sbsb-menu"); - if (!menu) return; - - var clickedsheetid = menu.clickedsheetid; - - switch(id) { - case "sbsb_deletesheet": - //console.log("delete "+clickedsheetid); - SocialCalc.WorkBookControlDelSheet(); - break; - case "sbsb_hidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlHideSheet(); - break; - case "sbsb_unhidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlUnhideSheet(); - break; - case "sbsb_copysheet": - //console.log("copy "+clickedsheetid); - SocialCalc.WorkBookControlCopySheet(); - break; - case "sbsb_moveleft": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveLeft(); - break; - case "sbsb_moveright": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveRight(); - break; - - case "sbsb_pastesheet": - //console.log("paste "+clickedsheetid); - SocialCalc.WorkBookControlPasteSheet(); - break; - case "sbsb_renamesheet": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlRenameSheet(); - break; - case "sbsb_closemenu": - //console.log("rename "+clickedsheetid); - menu.style.display = "none"; - break; - default: - break; - } - menu.style.display = "none"; - -} - -// define a new class for sheetbarsheet button menu -SocialCalc.SheetBarSheetButtonMenu = function(id, clickedsheetid) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.className = ""; - this.ele.clickedsheetid = clickedsheetid; - this.ele.style.cssText = "border:1px solid #000;position:absolute;top:200px;left:0px;width=100px;z-index:120"; - - var ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_deletesheet"," Delete Sheet"); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_hidesheet"," Hide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_unhidesheet"," Unhide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_renamesheet"," Rename Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveleft"," Move Left "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveright"," Move Right "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_copysheet"," Copy Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_pastesheet"," Paste Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_closemenu"," Cancel"); - this.ele.appendChild(ele1); - - - SocialCalc.SheetBarSheetButtonMenuPosition(this.ele, clickedsheetid); - - //var clickedsheet = document.getElementById(clickedsheetid); - //var position = SocialCalc.GetElementPosition(clickedsheet); - //console.log(clickedsheet.offsetHeight,clickedsheet.offsetWidth,clickedsheet.offsetLeft, clickedsheet.offsetTop); - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.editor.toplevel.appendChild(this.ele); - - - - - -} - -// position the sheet menu -SocialCalc.SheetBarSheetButtonMenuPosition = function(menu, clickedsheetid) { - - var hlessbutton = document.getElementById("te_lessbuttonh"); - - //console.log(hlessbutton.style.top, hlessbutton.style.left); - - var sbbutton = document.getElementById("sbsb-"+clickedsheetid); - - //console.log(sbbutton.offsetLeft,clickedsheetid); - - var top = hlessbutton.style.top.slice(0,-2)-220; - var left = sbbutton.offsetLeft+7; - - menu.style.top = top+"px"; - menu.style.left = left+"px"; - - //console.log(menu.style.top, menu.style.left); -} - -SocialCalc.ScriptInfo = { - scripts : {}, - handle:null -}; - -SocialCalc.ScriptCheck = function(sheetid, coord, text) { -var commentstart = text.indexOf(""); -if ((commentstart != -1) && (commentend != -1)) { - script = text.slice(commentstart+10,commentend); - //alert(script); - SocialCalc.ScriptInfo.scripts[coord] = script; - if (SocialCalc.ScriptInfo.handle == null) { - SocialCalc.ScriptInfo.handle = - window.setTimeout(SocialCalc.EvalUserScripts,500); - } - //alert(coord+"-"+sheetid); -} -} - -SocialCalc.EvalUserScript = function(data) { - var head = document.getElementsByTagName("head")[0] || - document.documentElement; - - if (data == "") return; - - var script = document.createElement("script"); - - script.type = "text/javascript"; - try { - // doesn't work on ie... - script.appendChild(document.createTextNode(data)); - } catch(e) { - // IE has funky script nodes - script.text = data; - } - - head.insertBefore(script, head.firstChild); - head.removeChild(script); -} - -SocialCalc.EvalUserScripts = function() { -for (var cr in SocialCalc.ScriptInfo.scripts) { - SocialCalc.EvalUserScript(SocialCalc.ScriptInfo.scripts[cr]); - //console.log(cr,SocialCalc.ScriptInfo.scripts[cr]) -} -SocialCalc.ScriptInfo.handle = null; -SocialCalc.ScriptInfo.scripts = {}; -} - -SocialCalc.CallOutOnRenderCell = function(sheetobj, value, cr) { -var cell=sheetobj.cells[cr]; -if (!cell) return; -var valuetype = cell.valuetype || ""; // get type of value to determine formatting -var valuesubtype = valuetype.substring(1); -var sheetattribs=sheetobj.attribs; -valuetype = valuetype.charAt(0); -if (valuetype=="t") { - valueformat = sheetobj.valueformats[cell.textvalueformat-0] || sheetobj.valueformats[sheetattribs.defaulttextvalueformat-0] || ""; - if (valueformat == "text-html") {SocialCalc.ScriptCheck(sheetobj.sheetid,cr,value);} -} -} - -SocialCalc.GetCellDataValue = function(coord) { - - var sheetname = null; - var sheetid = ""; - var bindex = coord.indexOf("!"); - if (bindex != -1) { - sheetname = coord.slice(0,bindex); - coord = coord.slice(bindex+1); - //console.log(sheetname,coord) - } - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (sheetname == null) { - sheetid = control.currentSheetButton.id - } else { - sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - } - - if ((sheetid == null) || (sheetid == "")) { - return "0"; - } - - var sheetobj = control.workbook.sheetArr[sheetid].sheet - - var cell = sheetobj.cells[coord] - - if (cell) {return cell.datavalue;} else {return 0;} -} - -SocialCalc.GetCellDataArray = function(coordstr,sheetname) { - var vals = [] - var coords = coordstr.split(","); - if (sheetname == null) { sheetname=""; } - else { - sheetname = sheetname+"!"; - } - for (var c in coords) { - - vals.push(SocialCalc.GetCellDataValue(sheetname+coords[c])); - } - return vals; -} - -SocialCalc.UserScriptData = {} - - -SocialCalc.WorkBookRecalculateInfo = { - sheets : [], - calcorder: [], - current: 0, - pass: 0 -}; - -SocialCalc.WorkBookRecalculateAll = function() { - // do it from the last sheet to the first sheet - // using the recalc-done signal to trigger the next sheet - - // if already in the middle of a recalculate-all, ignore this. - if ((SocialCalc.WorkBookRecalculateInfo.current != 0) || - (SocialCalc.WorkBookRecalculateInfo.calcorder.length != 0) || - (SocialCalc.WorkBookRecalculateInfo.sheets.length != 0)) { - return; - } - - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - SocialCalc.WorkBookRecalculateInfo.current = 0; - - for (var sheet in control.workbook.sheetArr) { - SocialCalc.WorkBookRecalculateInfo.sheets.push(sheet); - } - - var i = 0; - for (var c=SocialCalc.WorkBookRecalculateInfo.sheets.length; - c>0; c--) { - SocialCalc.WorkBookRecalculateInfo.calcorder[i] = - SocialCalc.WorkBookRecalculateInfo.sheets[c-1]; - i++; - } - window.setTimeout(SocialCalc.WorkBookRecalculateStep,500); -} - -SocialCalc.WorkBookRecalculateStep = function() { - if (SocialCalc.WorkBookRecalculateInfo.current == - SocialCalc.WorkBookRecalculateInfo.calcorder.length) { - SocialCalc.WorkBookRecalculateInfo.current = 0; - SocialCalc.WorkBookRecalculateInfo.calcorder = []; - SocialCalc.WorkBookRecalculateInfo.sheets = []; - if (SocialCalc.WorkBookRecalculateInfo.pass == - 1) { - SocialCalc.WorkBookRecalculateInfo.pass = 0; - SocialCalc.SpinnerWaitHide(); - //alert("load done"); - return; - } else { - SocialCalc.WorkBookRecalculateInfo.pass++; - SocialCalc.WorkBookRecalculateAll(); - return; - } - } - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert("recalculate "+ - // SocialCalc.WorkBookRecalculateInfo.calcorder[ - // SocialCalc.WorkBookRecalculateInfo.current] - // ); - var sheetid = -SocialCalc.WorkBookRecalculateInfo.calcorder[ - SocialCalc.WorkBookRecalculateInfo.current]; - SocialCalc.WorkBookControlActivateSheet(sheetid); - SocialCalc.WorkBookRecalculateInfo.current++; - - - window.setTimeout(SocialCalc.WorkBookRecalculateStep,1000); -} - - -SocialCalc.SpinnerWaitCreate = function() { - // if the div exists already just use it - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - return; - } - var main = document.createElement("div"); - main.id = "waitloadingspinner"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - main.style.top = (vp.height/2)+"px"; - main.style.left = (vp.width/2)+"px"; - main.style.zIndex = 110; - - main.style.width='50px' - main.style.height = '50px' - main.innerHTML = 'Loading...'; - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.SpinnerWaitHide = function() { - // if the div exists already just use it - -var ele = document.getElementById("waitloadingspinner"); -if (ele) { - ele.innerHTML = ""; - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} -} - -SocialCalc.EditableCells = {}; -SocialCalc.EditableCells.allow = false; -SocialCalc.EditableCells.cells = {}; -SocialCalc.EditableCells.constraints = {}; - -SocialCalc.Callbacks.IsCellEditable = function(editor) { - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - - if (!(SocialCalc.EditableCells.allow)) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[cellname]) { - // by default all cells are editable - return true; - } - return false; -} - -SocialCalc.Callbacks.CheckConstraints = function(editor, value) -{ - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - var constraint = SocialCalc.EditableCells.constraints[cellname]; - //alert(JSON.stringify(constraint)) - if (constraint != null) { - switch (constraint[0]) { - case "numeric": - // check that value is numeric - var val = parseInt(value); - //alert(val) - if (isNaN(val)) { - alert("please input a number"); - return false; - } - - break; - case "percent": - break; - } - } - return true; -} - -// this is for checkmark toggling -SocialCalc.Callbacks.ToggleCell = function() -{ - // check what the current ecell is - var control = SocialCalc.GetCurrentWorkBookControl(); - - var editor = control.workbook.spreadsheet.editor; - - var cellname = editor.ecell.coord; - - var value = SocialCalc.GetCellDataValue(cellname); - - console.log(cellname) - console.log(value) - - var cmdstr = ""; - if (value.indexOf(" ") != -1) { - // set the value to the img value - //cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - - } else { - // set the value to a space - cmdstr = "set " + cellname + ' text t
     
    ' + "\n"; - } - - var sheetid = control.currentSheetButton.id - console.log(sheetid) - console.log(cmdstr) - cmd = {cmdtype:"scmd", id:sheetid, cmdstr: cmdstr, saveundo: false}; - control.ExecuteWorkBookControlCommand(cmd, false); - -} - - -SocialCalc.WorkbookControlCreateSheetHTML = function(sheetlist) { - - var context, div, ele; - - var result = ""; - - var control = SocialCalc.GetCurrentWorkBookControl(); - - div = document.createElement("div"); - - if (!sheetlist) { - context = new SocialCalc.RenderContext(spreadsheet.sheet); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - } else { - for (var sheetid in sheetlist) { - context = control.workbook.sheetArr[sheetid].context; - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - } - } - - result = div.innerHTML; - delete ele; - delete div; - return result; - - } \ No newline at end of file diff --git a/DeveloperAdoption/public/static/Anton.ttf b/DeveloperAdoption/public/static/Anton.ttf deleted file mode 100644 index 0d9c9ac..0000000 Binary files a/DeveloperAdoption/public/static/Anton.ttf and /dev/null differ diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/analytics.csv b/DeveloperAdoption/public/static/Highcharts-2/examples/analytics.csv deleted file mode 100644 index 68e08a3..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/analytics.csv +++ /dev/null @@ -1,87 +0,0 @@ -# ---------------------------------------- -highcharts.com -Daily visits -"September 5, 2010","October 5, 2010" -# ---------------------------------------- - -# ---------------------------------------- -# Graph -# ---------------------------------------- -Day,All Visits (Segment),New Visitors (Segment) -"Sunday, September 5, 2010",966,433 -"Monday, September 6, 2010","2,475",983 -"Tuesday, September 7, 2010","3,336","1,463" -"Wednesday, September 8, 2010","3,211","1,316" -"Thursday, September 9, 2010","3,229","1,351" -"Friday, September 10, 2010","2,802","1,270" -"Saturday, September 11, 2010","1,168",604 -"Sunday, September 12, 2010","1,110",498 -"Monday, September 13, 2010","3,112","1,352" -"Tuesday, September 14, 2010","3,590","1,626" -"Wednesday, September 15, 2010","3,529","1,549" -"Thursday, September 16, 2010","3,519","1,574" -"Friday, September 17, 2010","3,696","1,680" -"Saturday, September 18, 2010","1,400",677 -"Sunday, September 19, 2010","1,302",603 -"Monday, September 20, 2010","3,348","1,472" -"Tuesday, September 21, 2010","3,606","1,570" -"Wednesday, September 22, 2010","3,320","1,438" -"Thursday, September 23, 2010","2,677","1,140" -"Friday, September 24, 2010","2,795","1,256" -"Saturday, September 25, 2010","1,299",589 -"Sunday, September 26, 2010","1,189",533 -"Monday, September 27, 2010","3,189","1,253" -"Tuesday, September 28, 2010","3,223","1,266" -"Wednesday, September 29, 2010","3,231","1,249" -"Thursday, September 30, 2010","3,608","1,684" -"Friday, October 1, 2010","2,945","1,185" -"Saturday, October 2, 2010","1,058",460 -"Sunday, October 3, 2010","1,114",499 -"Monday, October 4, 2010","2,774","1,131" -"Tuesday, October 5, 2010","2,679","1,047" - -# ---------------------------------------- -# Table -# ---------------------------------------- -Day,Visits,New Visits -"Friday, September 17, 2010" -All Visits,3696,1680 -New Visitors,1680,1680 -% of Total,0.45454545454545453,1.0 -"Thursday, September 30, 2010" -All Visits,3608,1684 -New Visitors,1684,1684 -% of Total,0.46674057649667405,1.0 -"Tuesday, September 21, 2010" -All Visits,3606,1570 -New Visitors,1570,1570 -% of Total,0.4353854686633389,1.0 -"Tuesday, September 14, 2010" -All Visits,3590,1626 -New Visitors,1626,1626 -% of Total,0.452924791086351,1.0 -"Wednesday, September 15, 2010" -All Visits,3529,1549 -New Visitors,1549,1549 -% of Total,0.4389345423632757,1.0 -"Thursday, September 16, 2010" -All Visits,3519,1574 -New Visitors,1574,1574 -% of Total,0.44728616084114803,1.0 -"Monday, September 20, 2010" -All Visits,3348,1472 -New Visitors,1472,1472 -% of Total,0.43966547192353644,1.0 -"Tuesday, September 7, 2010" -All Visits,3336,1463 -New Visitors,1463,1463 -% of Total,0.4385491606714628,1.0 -"Wednesday, September 22, 2010" -All Visits,3320,1438 -New Visitors,1438,1438 -% of Total,0.4331325301204819,1.0 -"Wednesday, September 29, 2010" -All Visits,3231,1249 -New Visitors,1249,1249 -% of Total,0.3865676261219437,1.0 -# -------------------------------------------------------------------------------- diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/analytics.tsv b/DeveloperAdoption/public/static/Highcharts-2/examples/analytics.tsv deleted file mode 100644 index 025f7ac..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/analytics.tsv +++ /dev/null @@ -1,87 +0,0 @@ -# ---------------------------------------- -highcharts.com -Daily visits -September 5, 2010 October 5, 2010 -# ---------------------------------------- - -# ---------------------------------------- -# Graph -# ---------------------------------------- -Day All Visits (Segment) New Visitors (Segment) -Sunday, September 5, 2010 966 433 -Monday, September 6, 2010 2,475 983 -Tuesday, September 7, 2010 3,336 1,463 -Wednesday, September 8, 2010 3,211 1,316 -Thursday, September 9, 2010 3,229 1,351 -Friday, September 10, 2010 2,802 1,270 -Saturday, September 11, 2010 1,168 604 -Sunday, September 12, 2010 1,110 498 -Monday, September 13, 2010 3,112 1,352 -Tuesday, September 14, 2010 3,590 1,626 -Wednesday, September 15, 2010 3,529 1,549 -Thursday, September 16, 2010 3,519 1,574 -Friday, September 17, 2010 3,696 1,680 -Saturday, September 18, 2010 1,400 677 -Sunday, September 19, 2010 1,302 603 -Monday, September 20, 2010 3,348 1,472 -Tuesday, September 21, 2010 3,606 1,570 -Wednesday, September 22, 2010 3,320 1,438 -Thursday, September 23, 2010 2,677 1,140 -Friday, September 24, 2010 2,795 1,256 -Saturday, September 25, 2010 1,299 589 -Sunday, September 26, 2010 1,189 533 -Monday, September 27, 2010 3,189 1,253 -Tuesday, September 28, 2010 3,223 1,266 -Wednesday, September 29, 2010 3,231 1,249 -Thursday, September 30, 2010 3,608 1,684 -Friday, October 1, 2010 2,945 1,185 -Saturday, October 2, 2010 1,058 460 -Sunday, October 3, 2010 1,114 499 -Monday, October 4, 2010 2,774 1,131 -Tuesday, October 5, 2010 2,679 1,047 - -# ---------------------------------------- -# Table -# ---------------------------------------- -Day Visits New Visits -Friday, September 17, 2010 -All Visits 3696 1680 -New Visitors 1680 1680 -% of Total 0.45454545454545453 1.0 -Thursday, September 30, 2010 -All Visits 3608 1684 -New Visitors 1684 1684 -% of Total 0.46674057649667405 1.0 -Tuesday, September 21, 2010 -All Visits 3606 1570 -New Visitors 1570 1570 -% of Total 0.4353854686633389 1.0 -Tuesday, September 14, 2010 -All Visits 3590 1626 -New Visitors 1626 1626 -% of Total 0.452924791086351 1.0 -Wednesday, September 15, 2010 -All Visits 3529 1549 -New Visitors 1549 1549 -% of Total 0.4389345423632757 1.0 -Thursday, September 16, 2010 -All Visits 3519 1574 -New Visitors 1574 1574 -% of Total 0.44728616084114803 1.0 -Monday, September 20, 2010 -All Visits 3348 1472 -New Visitors 1472 1472 -% of Total 0.43966547192353644 1.0 -Tuesday, September 7, 2010 -All Visits 3336 1463 -New Visitors 1463 1463 -% of Total 0.4385491606714628 1.0 -Wednesday, September 22, 2010 -All Visits 3320 1438 -New Visitors 1438 1438 -% of Total 0.4331325301204819 1.0 -Wednesday, September 29, 2010 -All Visits 3231 1249 -New Visitors 1249 1249 -% of Total 0.3865676261219437 1.0 -# -------------------------------------------------------------------------------- diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/area-basic.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/area-basic.htm deleted file mode 100644 index 10c5832..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/area-basic.htm +++ /dev/null @@ -1,110 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/area-inverted.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/area-inverted.htm deleted file mode 100644 index 882128e..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/area-inverted.htm +++ /dev/null @@ -1,107 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/area-missing.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/area-missing.htm deleted file mode 100644 index 7a9fa96..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/area-missing.htm +++ /dev/null @@ -1,101 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/area-negative.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/area-negative.htm deleted file mode 100644 index 9208dfa..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/area-negative.htm +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/area-stacked-percent.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/area-stacked-percent.htm deleted file mode 100644 index 12e4062..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/area-stacked-percent.htm +++ /dev/null @@ -1,98 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/area-stacked.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/area-stacked.htm deleted file mode 100644 index c9257f6..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/area-stacked.htm +++ /dev/null @@ -1,102 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/areaspline.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/areaspline.htm deleted file mode 100644 index a891bf8..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/areaspline.htm +++ /dev/null @@ -1,101 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/bar-basic.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/bar-basic.htm deleted file mode 100644 index 3f90c26..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/bar-basic.htm +++ /dev/null @@ -1,102 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/bar-negative-stack.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/bar-negative-stack.htm deleted file mode 100644 index 68fb06b..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/bar-negative-stack.htm +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/bar-stacked.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/bar-stacked.htm deleted file mode 100644 index 1a45aa9..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/bar-stacked.htm +++ /dev/null @@ -1,83 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/column-basic.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/column-basic.htm deleted file mode 100644 index bd12ac4..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/column-basic.htm +++ /dev/null @@ -1,113 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/column-negative.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/column-negative.htm deleted file mode 100644 index 50100de..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/column-negative.htm +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/column-parsed.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/column-parsed.htm deleted file mode 100644 index 9372bc8..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/column-parsed.htm +++ /dev/null @@ -1,137 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    JaneJohn
    Apples34
    Pears20
    Plums511
    Bananas11
    Oranges24
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/column-rotated-labels.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/column-rotated-labels.htm deleted file mode 100644 index 18fcca6..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/column-rotated-labels.htm +++ /dev/null @@ -1,117 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/column-stacked-and-grouped.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/column-stacked-and-grouped.htm deleted file mode 100644 index 0a983e9..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/column-stacked-and-grouped.htm +++ /dev/null @@ -1,95 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/column-stacked-percent.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/column-stacked-percent.htm deleted file mode 100644 index b2f7e1d..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/column-stacked-percent.htm +++ /dev/null @@ -1,79 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/column-stacked.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/column-stacked.htm deleted file mode 100644 index e831362..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/column-stacked.htm +++ /dev/null @@ -1,91 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/combo-dual-axes.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/combo-dual-axes.htm deleted file mode 100644 index d98ef20..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/combo-dual-axes.htm +++ /dev/null @@ -1,117 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/combo-multi-axes.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/combo-multi-axes.htm deleted file mode 100644 index e008c04..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/combo-multi-axes.htm +++ /dev/null @@ -1,153 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/combo-regression.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/combo-regression.htm deleted file mode 100644 index b6077e2..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/combo-regression.htm +++ /dev/null @@ -1,75 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/combo.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/combo.htm deleted file mode 100644 index f7fe92b..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/combo.htm +++ /dev/null @@ -1,113 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/dynamic-click-to-add.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/dynamic-click-to-add.htm deleted file mode 100644 index bc9cecb..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/dynamic-click-to-add.htm +++ /dev/null @@ -1,104 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/dynamic-master-detail.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/dynamic-master-detail.htm deleted file mode 100644 index 10b8f2d..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/dynamic-master-detail.htm +++ /dev/null @@ -1,389 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/dynamic-update.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/dynamic-update.htm deleted file mode 100644 index 0902f3c..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/dynamic-update.htm +++ /dev/null @@ -1,105 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/line-ajax.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/line-ajax.htm deleted file mode 100644 index 7a27e3a..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/line-ajax.htm +++ /dev/null @@ -1,197 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/line-basic.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/line-basic.htm deleted file mode 100644 index 99c7a5a..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/line-basic.htm +++ /dev/null @@ -1,97 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/line-labels.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/line-labels.htm deleted file mode 100644 index 7970624..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/line-labels.htm +++ /dev/null @@ -1,82 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/line-time-series.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/line-time-series.htm deleted file mode 100644 index 21955bd..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/line-time-series.htm +++ /dev/null @@ -1,222 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/pie-basic.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/pie-basic.htm deleted file mode 100644 index 590ec71..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/pie-basic.htm +++ /dev/null @@ -1,85 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/pie-donut.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/pie-donut.htm deleted file mode 100644 index 788ffcd..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/pie-donut.htm +++ /dev/null @@ -1,95 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/pie-legend.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/pie-legend.htm deleted file mode 100644 index 8005818..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/pie-legend.htm +++ /dev/null @@ -1,81 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/scatter.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/scatter.htm deleted file mode 100644 index 05a75b0..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/scatter.htm +++ /dev/null @@ -1,214 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/spline-inverted.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/spline-inverted.htm deleted file mode 100644 index b7029e2..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/spline-inverted.htm +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/spline-plot-bands.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/spline-plot-bands.htm deleted file mode 100644 index e05a253..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/spline-plot-bands.htm +++ /dev/null @@ -1,185 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/spline-symbols.htm b/DeveloperAdoption/public/static/Highcharts-2/examples/spline-symbols.htm deleted file mode 100644 index e19a507..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/spline-symbols.htm +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/examples/tokyo.json b/DeveloperAdoption/public/static/Highcharts-2/examples/tokyo.json deleted file mode 100644 index 0b38f96..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/examples/tokyo.json +++ /dev/null @@ -1 +0,0 @@ -[7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6] \ No newline at end of file diff --git a/DeveloperAdoption/public/static/Highcharts-2/exporting-server/index.php b/DeveloperAdoption/public/static/Highcharts-2/exporting-server/index.php deleted file mode 100644 index 664375d..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/exporting-server/index.php +++ /dev/null @@ -1,97 +0,0 @@ -$output"; - echo "Error while converting SVG"; - } - - // stream it - else { - header("Content-Disposition: attachment; filename=$filename.$ext"); - header("Content-Type: $type"); - echo file_get_contents($outfile); - } - - // delete it - unlink("temp/$tempName.svg"); - unlink($outfile); - -// SVG can be streamed directly back -} else if ($ext == 'svg') { - header("Content-Disposition: attachment; filename=$filename.$ext"); - header("Content-Type: $type"); - echo $svg; - -} else { - echo "Invalid type"; -} -?> diff --git a/DeveloperAdoption/public/static/Highcharts-2/graphics/skies.jpg b/DeveloperAdoption/public/static/Highcharts-2/graphics/skies.jpg deleted file mode 100644 index 259f46a..0000000 Binary files a/DeveloperAdoption/public/static/Highcharts-2/graphics/skies.jpg and /dev/null differ diff --git a/DeveloperAdoption/public/static/Highcharts-2/graphics/snow.png b/DeveloperAdoption/public/static/Highcharts-2/graphics/snow.png deleted file mode 100644 index 0171485..0000000 Binary files a/DeveloperAdoption/public/static/Highcharts-2/graphics/snow.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/Highcharts-2/graphics/sun.png b/DeveloperAdoption/public/static/Highcharts-2/graphics/sun.png deleted file mode 100644 index 2c89e40..0000000 Binary files a/DeveloperAdoption/public/static/Highcharts-2/graphics/sun.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/Highcharts-2/index.htm b/DeveloperAdoption/public/static/Highcharts-2/index.htm deleted file mode 100644 index c60ca30..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/index.htm +++ /dev/null @@ -1,98 +0,0 @@ - - - - - Highcharts Examples - - -

    Highcharts Examples

    -

    Line and scatter charts

    - -

    Area charts

    - -

    Column and bar charts

    - -

    Pie charts

    - -

    Dynamic charts

    - -

    Combinations

    - - - diff --git a/DeveloperAdoption/public/static/Highcharts-2/js/adapters/mootools-adapter.js b/DeveloperAdoption/public/static/Highcharts-2/js/adapters/mootools-adapter.js deleted file mode 100644 index 7cd304f..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/js/adapters/mootools-adapter.js +++ /dev/null @@ -1,12 +0,0 @@ -/* - Highcharts JS v2.1.4 (2011-03-30) - MooTools adapter - - (c) 2010 Torstein H?nsi - - License: www.highcharts.com/license -*/ -(function(){var g=window,i=!!g.$merge;$extend=g.$extend||function(){return Object.append.apply(Object,arguments)};g.HighchartsAdapter={init:function(){var a=Fx.prototype,b=a.start,c=Fx.Morph.prototype,d=c.compute;a.start=function(f){var e=this.element;if(f.d)this.paths=Highcharts.pathAnim.init(e,e.d,this.toD);b.apply(this,arguments)};c.compute=function(f,e,j){var h=this.paths;if(h)this.element.attr("d",Highcharts.pathAnim.step(h[0],h[1],j,this.toD));else return d.apply(this,arguments)}},animate:function(a, -b,c){var d=a.attr,f=c&&c.complete;if(d&&!a.setStyle){a.getStyle=a.attr;a.setStyle=function(){var e=arguments;a.attr.call(a,e[0],e[1][0])};a.$family=a.uid=true}HighchartsAdapter.stop(a);c=new Fx.Morph(d?a:$(a),$extend({transition:Fx.Transitions.Quad.easeInOut},c));if(b.d)c.toD=b.d;f&&c.addEvent("complete",f);c.start(b);a.fx=c},each:function(a,b){return i?$each(a,b):a.each(b)},map:function(a,b){return a.map(b)},grep:function(a,b){return a.filter(b)},merge:function(){var a=arguments,b=[{}],c=a.length; -if(i)a=$merge.apply(null,a);else{for(;c--;)b[c+1]=a[c];a=Object.merge.apply(Object,b)}return a},hyphenate:function(a){return a.hyphenate()},addEvent:function(a,b,c){if(typeof b=="string"){if(b=="unload")b="beforeunload";if(!a.addEvent)if(a.nodeName)a=$(a);else $extend(a,new Events);a.addEvent(b,c)}},removeEvent:function(a,b,c){if(b){if(b=="unload")b="beforeunload";a.removeEvent(b,c)}},fireEvent:function(a,b,c,d){b=new Event({type:b,target:a});b=$extend(b,c);b.preventDefault=function(){d=null};a.fireEvent&& -a.fireEvent(b.type,b);d&&d(b)},stop:function(a){a.fx&&a.fx.cancel()}}})(); diff --git a/DeveloperAdoption/public/static/Highcharts-2/js/adapters/mootools-adapter.src.js b/DeveloperAdoption/public/static/Highcharts-2/js/adapters/mootools-adapter.src.js deleted file mode 100644 index 2273cde..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/js/adapters/mootools-adapter.src.js +++ /dev/null @@ -1,244 +0,0 @@ -/** - * @license Highcharts JS v2.1.4 (2011-03-30) - * MooTools adapter - * - * (c) 2010 Torstein Hønsi - * - * License: www.highcharts.com/license - */ - -// JSLint options: -/*global Highcharts, Fx, $, $extend, $each, $merge, Events, Event */ - -(function() { - -var win = window, - legacy = !!win.$merge - $extend = win.$extend || function() { - return Object.append.apply(Object, arguments) - }; - -win.HighchartsAdapter = { - /** - * Initialize the adapter. This is run once as Highcharts is first run. - */ - init: function() { - var fxProto = Fx.prototype, - fxStart = fxProto.start, - morphProto = Fx.Morph.prototype, - morphCompute = morphProto.compute; - - // override Fx.start to allow animation of SVG element wrappers - fxProto.start = function(from, to) { - var fx = this, - elem = fx.element; - - // special for animating paths - if (from.d) { - //this.fromD = this.element.d.split(' '); - fx.paths = Highcharts.pathAnim.init( - elem, - elem.d, - fx.toD - ); - } - fxStart.apply(fx, arguments); - }; - - // override Fx.step to allow animation of SVG element wrappers - morphProto.compute = function(from, to, delta) { - var fx = this, - paths = fx.paths; - - if (paths) { - fx.element.attr( - 'd', - Highcharts.pathAnim.step(paths[0], paths[1], delta, fx.toD) - ); - } else { - return morphCompute.apply(fx, arguments); - } - }; - - }, - - /** - * Animate a HTML element or SVG element wrapper - * @param {Object} el - * @param {Object} params - * @param {Object} options jQuery-like animation options: duration, easing, callback - */ - animate: function (el, params, options) { - var isSVGElement = el.attr, - effect, - complete = options && options.complete; - - if (isSVGElement && !el.setStyle) { - // add setStyle and getStyle methods for internal use in Moo - el.getStyle = el.attr; - el.setStyle = function() { // property value is given as array in Moo - break it down - var args = arguments; - el.attr.call(el, args[0], args[1][0]); - } - // dirty hack to trick Moo into handling el as an element wrapper - el.$family = el.uid = true; - } - - // stop running animations - HighchartsAdapter.stop(el); - - // define and run the effect - effect = new Fx.Morph( - isSVGElement ? el : $(el), - $extend({ - transition: Fx.Transitions.Quad.easeInOut - }, options) - ); - - // special treatment for paths - if (params.d) { - effect.toD = params.d; - } - - // jQuery-like events - if (complete) { - effect.addEvent('complete', complete); - } - - // run - effect.start(params); - - // record for use in stop method - el.fx = effect; - }, - - /** - * MooTool's each function - * - */ - each: function(arr, fn) { - return legacy ? - $each(arr, fn) : - arr.each(fn); - }, - - /** - * Map an array - * @param {Array} arr - * @param {Function} fn - */ - map: function (arr, fn){ - return arr.map(fn); - }, - - /** - * Grep or filter an array - * @param {Array} arr - * @param {Function} fn - */ - grep: function(arr, fn) { - return arr.filter(fn); - }, - - /** - * Deep merge two objects and return a third - */ - merge: function() { - var args = arguments, - args13 = [{}], // MooTools 1.3+ - i = args.length, - ret; - - if (legacy) { - ret = $merge.apply(null, args); - } else { - while (i--) { - args13[i + 1] = args[i]; - } - ret = Object.merge.apply(Object, args13); - } - - return ret; - }, - - /** - * Hyphenate a string, like minWidth becomes min-width - * @param {Object} str - */ - hyphenate: function (str){ - return str.hyphenate(); - }, - - /** - * Add an event listener - * @param {Object} el HTML element or custom object - * @param {String} type Event type - * @param {Function} fn Event handler - */ - addEvent: function (el, type, fn) { - if (typeof type == 'string') { // chart broke due to el being string, type function - - if (type == 'unload') { // Moo self destructs before custom unload events - type = 'beforeunload'; - } - - // if the addEvent method is not defined, el is a custom Highcharts object - // like series or point - if (!el.addEvent) { - if (el.nodeName) { - el = $(el); // a dynamically generated node - } else { - $extend(el, new Events()); // a custom object - } - } - - el.addEvent(type, fn); - } - }, - - removeEvent: function(el, type, fn) { - if (type) { - if (type == 'unload') { // Moo self destructs before custom unload events - type = 'beforeunload'; - } - - - el.removeEvent(type, fn); - } - }, - - fireEvent: function(el, event, eventArguments, defaultFunction) { - // create an event object that keeps all functions - event = new Event({ - type: event, - target: el - }); - event = $extend(event, eventArguments); - // override the preventDefault function to be able to use - // this for custom events - event.preventDefault = function() { - defaultFunction = null; - }; - // if fireEvent is not available on the object, there hasn't been added - // any events to it above - if (el.fireEvent) { - el.fireEvent(event.type, event); - } - - // fire the default if it is passed and it is not prevented above - if (defaultFunction) { - defaultFunction(event); - } - }, - - /** - * Stop running animations on the object - */ - stop: function (el) { - if (el.fx) { - el.fx.cancel(); - } - } -} - -})(); \ No newline at end of file diff --git a/DeveloperAdoption/public/static/Highcharts-2/js/adapters/prototype-adapter.js b/DeveloperAdoption/public/static/Highcharts-2/js/adapters/prototype-adapter.js deleted file mode 100644 index 2591f6b..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/js/adapters/prototype-adapter.js +++ /dev/null @@ -1,14 +0,0 @@ -/* - Highcharts JS v2.1.4 (2011-03-02) - Prototype adapter - - @author Michael Nelson, Torstein H?nsi. - - Feel free to use and modify this script. - Highcharts license: www.highcharts.com/license. -*/ -var HighchartsAdapter=function(){var f=typeof Effect!="undefined";return{init:function(){if(f)Effect.HighchartsTransition=Class.create(Effect.Base,{initialize:function(a,b,c,d){var e;this.element=a;e=a.attr(b);if(b=="d"){this.paths=Highcharts.pathAnim.init(a,a.d,c);this.toD=c;e=0;c=1}this.start(Object.extend(d||{},{from:e,to:c,attribute:b}))},setup:function(){HighchartsAdapter._extend(this.element);this.element._highchart_animation=this},update:function(a){var b=this.paths;if(b)a=Highcharts.pathAnim.step(b[0], -b[1],a,this.toD);this.element.attr(this.options.attribute,a)},finish:function(){this.element._highchart_animation=null}})},addEvent:function(a,b,c){if(a.addEventListener||a.attachEvent)Event.observe($(a),b,c);else{HighchartsAdapter._extend(a);a._highcharts_observe(b,c)}},animate:function(a,b,c){var d;c=c||{};c.delay=0;c.duration=(c.duration||500)/1E3;if(f)for(d in b)new Effect.HighchartsTransition($(a),d,b[d],c);else for(d in b)a.attr(d,b[d]);if(!a.attr)throw"Todo: implement animate DOM objects"; -},stop:function(a){a._highcharts_extended&&a._highchart_animation&&a._highchart_animation.cancel()},each:function(a,b){$A(a).each(b)},fireEvent:function(a,b,c,d){if(b.preventDefault)d=null;if(a.fire)a.fire(b,c);else a._highcharts_extended&&a._highcharts_fire(b,c);d&&d(c)},removeEvent:function(a,b,c){if($(a).stopObserving)a.stopObserving(a,b,c);else{HighchartsAdapter._extend(a);a._highcharts_stop_observing(b,c)}},grep:function(a,b){return a.findAll(b)},hyphenate:function(a){return a.replace(/([A-Z])/g, -function(b,c){return"-"+c.toLowerCase()})},map:function(a,b){return a.map(b)},merge:function(){function a(b,c){var d,e;for(e in c){d=c[e];b[e]=d&&typeof d=="object"&&d.constructor!=Array?a(b[e]||{},d):c[e]}return b}return function(){for(var b=arguments,c={},d=0;d {a : 'a', b : {b1 : 'b1', b2 : 'b2_prime'}, c : 'c'} - /*merge: function(){ - function doCopy(copy, original) { - var value, - key, - undef, - nil, - same, - obj, - arr, - node; - - for (key in original) { - value = original[key]; - undef = typeof(value) === 'undefined'; - nil = value === null; - same = original === copy[key]; - - if (undef || nil || same) { - continue; - } - - obj = typeof(value) === 'object'; - arr = value && obj && value.constructor == Array; - node = !!value.nodeType; - - if (obj && !arr && !node) { - copy[key] = doCopy(typeof copy[key] == 'object' ? copy[key] : {}, value); - } - else { - copy[key] = original[key]; - } - } - return copy; - } - - var args = arguments, retVal = {}; - - for (var i = 0; i < args.length; i++) { - retVal = doCopy(retVal, args[i]); - } - - return retVal; - },*/ - merge: function() { // the built-in prototype merge function doesn't do deep copy - function doCopy(copy, original) { - var value; - - for (var key in original) { - value = original[key]; - if (value && typeof value == 'object' && value.constructor != Array) { - copy[key] = doCopy(copy[key] || {}, value); // copy - - } else { - copy[key] = original[key]; - } - } - return copy; - } - - function merge() { - var args = arguments, - retVal = {}; - - for (var i = 0; i < args.length; i++) { - retVal = doCopy(retVal, args[i]) - - } - return retVal; - } - - return merge.apply(this, arguments); - }, - - // extend an object to handle highchart events (highchart objects, not svg elements). - // this is a very simple way of handling events but whatever, it works (i think) - _extend: function(object){ - if (!object._highcharts_extended) { - Object.extend(object, { - _highchart_events: {}, - _highchart_animation: null, - _highcharts_extended: true, - _highcharts_observe: function(name, fn){ - this._highchart_events[name] = [this._highchart_events[name], fn].compact().flatten(); - }, - _highcharts_stop_observing: function(name, fn){ - this._highchart_events[name] = [this._highchart_events[name]].compact().flatten().without(fn); - }, - _highcharts_fire: function(name, args){ - (this._highchart_events[name] || []).each(function(fn){ - if (args && args.stopped) { - return; // "throw $break" wasn't working. i think because of the scope of 'this'. - } - fn.bind(this)(args); - } -.bind(this)); - } - }); - } - } -}; -})(); diff --git a/DeveloperAdoption/public/static/Highcharts-2/js/highcharts.js b/DeveloperAdoption/public/static/Highcharts-2/js/highcharts.js deleted file mode 100644 index aa9de94..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/js/highcharts.js +++ /dev/null @@ -1,162 +0,0 @@ -/* - Highcharts JS v2.1.4 (2011-03-02) - - (c) 2009-2010 Torstein H?nsi - - License: www.highcharts.com/license -*/ -(function(){function qa(a,b){a||(a={});for(var c in b)a[c]=b[c];return a}function oa(a,b){return parseInt(a,b||10)}function Kb(a){return typeof a=="string"}function Eb(a){return typeof a=="object"}function ac(a){return typeof a=="number"}function mc(a,b){for(var c=a.length;c--;)if(a[c]==b){a.splice(c,1);break}}function J(a){return a!==Ra&&a!==null}function za(a,b,c){var d,e;if(Kb(b))if(J(c))a.setAttribute(b,c);else{if(a&&a.getAttribute)e=a.getAttribute(b)}else if(J(b)&&Eb(b))for(d in b)a.setAttribute(d, -b[d]);return e}function nc(a){if(!a||a.constructor!=Array)a=[a];return a}function y(){var a=arguments,b,c,d=a.length;for(b=0;b3?g%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+cb(a-c).toFixed(f).slice(2):"")}function Hc(){}function Hd(a,b){function c(m,h){function x(l, -p){this.pos=l;this.minor=p;this.isNew=true;p||this.addLabel()}function w(l){if(l){this.options=l;this.id=l.id}return this}function O(){var l=[],p=[],r;Ta=u=null;Z=[];t(Ba,function(o){r=false;t(["xAxis","yAxis"],function(la){if(o.isCartesian&&(la=="xAxis"&&ma||la=="yAxis"&&!ma)&&(o.options[la]==h.index||o.options[la]===Ra&&h.index===0)){o[la]=s;Z.push(o);r=true}});if(!o.visible&&v.ignoreHiddenSeries)r=false;if(r){var T,Y,G,B,ia;if(!ma){T=o.options.stacking;Ic=T=="percent";if(T){B=o.type+y(o.options.stack, -"");ia="-"+B;o.stackKey=B;Y=l[B]||[];l[B]=Y;G=p[ia]||[];p[ia]=G}if(Ic){Ta=0;u=99}}if(o.isCartesian){t(o.data,function(la){var C=la.x,na=la.y,S=na<0,$=S?G:Y;S=S?ia:B;if(Ta===null)Ta=u=la[H];if(ma)if(C>u)u=C;else{if(Cu)u=na;else if(la=0){Ta=0;Id=true}else if(u<0){u=0;Jd=true}}}})}function ja(l,p){var r; -Fb=p?1:Ua.pow(10,ob(Ua.log(l)/Ua.LN10));r=l/Fb;if(!p){p=[1,2,2.5,5,10];if(h.allowDecimals===false)if(Fb==1)p=[1,2,5,10];else if(Fb<=0.1)p=[1/Fb]}for(var o=0;o0||!Jd))P+=l*Kd}Wa=K==P?1:Mb&&!T&&Y==r.options.tickPixelInterval?r.tickInterval:y(T,Va?1:(P-K)*Y/A);if(!N&&!J(h.tickInterval))Wa=ja(Wa);s.tickInterval=Wa;Jc=h.minorTickInterval==="auto"&&Wa?Wa/5:h.minorTickInterval;if(N){ra=[];T=Sa.global.useUTC; -var G=1E3/qb,B=6E4/qb,ia=36E5/qb;Y=864E5/qb;l=6048E5/qb;o=2592E6/qb;var la=31556952E3/qb,C=[["second",G,[1,2,5,10,15,30]],["minute",B,[1,2,5,10,15,30]],["hour",ia,[1,2,3,4,6,8,12]],["day",Y,[1,2]],["week",l,[1,2]],["month",o,[1,2,3,4,6]],["year",la,null]],na=C[6],S=na[1],$=na[2];for(r=0;r=G)$.setSeconds(S>=B?0:C*ob($.getSeconds()/ -C));if(S>=B)$[Cd](S>=ia?0:C*ob($[bd]()/C));if(S>=ia)$[Dd](S>=Y?0:C*ob($[cd]()/C));if(S>=Y)$[ed](S>=o?1:C*ob($[oc]()/C));if(S>=o){$[Ed](S>=la?0:C*ob($[Dc]()/C));p=$[Ec]()}if(S>=la){p-=p%C;$[Fd](p)}S==l&&$[ed]($[oc]()-$[dd]()+h.startOfWeek);r=1;p=$[Ec]();G=$.getTime()/qb;B=$[Dc]();for(ia=$[oc]();Gp&&ra.shift();if(h.endOnTick)P=r;else PGb[H])Gb[H]=ra.length}}function Ea(){var l,p;gb=K;cc=P;O();ga();ha=D;D=A/(P-K||1);if(!ma)for(l in ea)for(p in ea[l])ea[l][p].cum=ea[l][p].total;if(!s.isDirty)s.isDirty=K!=gb||P!=cc}function ua(l){l= -(new w(l)).render();Nb.push(l);return l}function bb(){var l=h.title,p=h.alternateGridColor,r=h.lineWidth,o,T,Y=m.hasRendered,G=Y&&J(gb)&&!isNaN(gb);o=Z.length&&J(K)&&J(P);A=M?wa:sa;D=A/(P-K||1);xa=M?V:rb;if(o||Mb){if(Jc&&!Va)for(o=K+(ra[0]-K)%Jc;o<=P;o+=Jc){Wb[o]||(Wb[o]=new x(o,true));G&&Wb[o].isNew&&Wb[o].render(null,true);Wb[o].isActive=true;Wb[o].render()}t(ra,function(B,ia){if(!Mb||B>=K&&B<=P){G&&sb[B].isNew&&sb[B].render(ia,true);sb[B].isActive=true;sb[B].render(ia)}});p&&t(ra,function(B,ia){if(ia% -2===0&&B=1E3?Gd(l,0):l},Nc=M&&h.labels.staggerLines,Xb=h.reversed,Yb=Va&&h.tickmarkPlacement=="between"?0.5:0;x.prototype={addLabel:function(){var l=this.pos,p=h.labels,r=!(l== -K&&!y(h.showFirstLabel,1)||l==P&&!y(h.showLastLabel,0)),o=Va&&M&&Va.length&&!p.step&&!p.staggerLines&&!p.rotation&&wa/Va.length||!M&&wa/2,T=this.label;l=$d.call({isFirst:l==ra[0],isLast:l==ra[ra.length-1],dateTimeLabelFormat:Kc,value:Va&&Va[l]?Va[l]:l});o=o&&{width:o-2*(p.padding||10)+$a};o=qa(o,p.style);if(T===Ra)this.label=J(l)&&r&&p.enabled?aa.text(l,0,0).attr({align:p.align,rotation:p.rotation}).css(o).add(tb):null;else T&&T.attr({text:l}).css(o)},getLabelSize:function(){var l=this.label;return l? -(this.labelBBox=l.getBBox())[M?"height":"width"]:0},render:function(l,p){var r=!this.minor,o=this.label,T=this.pos,Y=h.labels,G=this.gridLine,B=r?h.gridLineWidth:h.minorGridLineWidth,ia=r?h.gridLineColor:h.minorGridLineColor,la=r?h.gridLineDashStyle:h.minorGridLineDashStyle,C=this.mark,na=r?h.tickLength:h.minorTickLength,S=r?h.tickWidth:h.minorTickWidth||0,$=r?h.tickColor:h.minorTickColor,pc=r?h.tickPosition:h.minorTickPosition;r=Y.step;var hb=p&&Oc||Pa,Ob;Ob=M?va(T+Yb,null,null,p)+xa:V+Q+(Oa?(p&& -jd||Xa)-Ab-V:0);hb=M?hb-rb+Q-(Oa?sa:0):hb-va(T+Yb,null,null,p)-xa;if(B){T=Ka(T+Yb,B,p);if(G===Ra){G={stroke:ia,"stroke-width":B};if(la)G.dashstyle=la;this.gridLine=G=B?aa.path(T).attr(G).add(Hb):null}G&&T&&G.animate({d:T})}if(S){if(pc=="inside")na=-na;if(Oa)na=-na;B=aa.crispLine([Za,Ob,hb,Da,Ob+(M?0:-na),hb+(M?na:0)],S);if(C)C.animate({d:B});else this.mark=aa.path(B).attr({stroke:$,"stroke-width":S}).add(tb)}if(o){Ob=Ob+Y.x-(Yb&&M?Yb*D*(Xb?-1:1):0);hb=hb+Y.y-(Yb&&!M?Yb*D*(Xb?1:-1):0);J(Y.y)||(hb+= -parseInt(o.styles.lineHeight)*0.9-o.getBBox().height/2);if(Nc)hb+=l%Nc*16;if(r)o[l%r?"hide":"show"]();o[this.isNew?"attr":"animate"]({x:Ob,y:hb})}this.isNew=false},destroy:function(){for(var l in this)this[l]&&this[l].destroy&&this[l].destroy()}};w.prototype={render:function(){var l=this,p=l.options,r=p.label,o=l.label,T=p.width,Y=p.to,G,B=p.from,ia=p.dashStyle,la=l.svgElem,C=[],na,S,$=p.color;S=p.zIndex;var pc=p.events;if(T){C=Ka(p.value,T);p={stroke:$,"stroke-width":T};if(ia)p.dashstyle=ia}else if(J(B)&& -J(Y)){B=Ca(B,K);Y=pb(Y,P);G=Ka(Y);if((C=Ka(B))&&G)C.push(G[4],G[5],G[1],G[2]);else C=null;p={fill:$}}else return;if(J(S))p.zIndex=S;if(la)if(C)la.animate({d:C},null,la.onGetPath);else{la.hide();la.onGetPath=function(){la.show()}}else if(C&&C.length){l.svgElem=la=aa.path(C).attr(p).add();if(pc){ia=function(hb){la.on(hb,function(Ob){pc[hb].apply(l,[Ob])})};for(na in pc)ia(na)}}if(r&&J(r.text)&&C&&C.length&&wa>0&&sa>0){r=ya({align:M&&G&&"center",x:M?!G&&4:10,verticalAlign:!M&&G&&"middle",y:M?G?16:10: -G?6:-4,rotation:M&&!G&&90},r);if(!o)l.label=o=aa.text(r.text,0,0).attr({align:r.textAlign||r.align,rotation:r.rotation,zIndex:S}).css(r.style).add();G=[C[1],C[4],C[6]||C[1]];C=[C[2],C[5],C[7]||C[2]];na=pb.apply(Ua,G);S=pb.apply(Ua,C);o.align(r,false,{x:na,y:S,width:Ca.apply(Ua,G)-na,height:Ca.apply(Ua,C)-S});o.show()}else o&&o.hide();return l},destroy:function(){for(var l in this){this[l]&&this[l].destroy&&this[l].destroy();delete this[l]}mc(Nb,this)}};va=function(l,p,r,o){var T=1,Y=0,G=o?ha:D;o= -o?gb:K;G||(G=D);if(r){T*=-1;Y=A}if(Xb){T*=-1;Y-=T*A}if(p){if(Xb)l=A-l;l=l/G+o}else l=T*(l-o)*G+Y;return l};Ka=function(l,p,r){var o,T,Y;l=va(l,null,null,r);var G=r&&Oc||Pa,B=r&&jd||Xa,ia;r=T=fa(l+xa);o=Y=fa(G-l-xa);if(isNaN(l))ia=true;else if(M){o=ba;Y=G-rb;if(rV+wa)ia=true}else{r=V;T=B-Ab;if(oba+sa)ia=true}return ia?null:aa.crispLine([Za,r,o,Da,T,Y],p||0)};if(Ga&&ma&&Xb===Ra)Xb=true;qa(s,{addPlotBand:ua,addPlotLine:ua,adjustTickAmount:function(){if(Gb&&!N&&!Va&&!Mb){var l=ec,p=ra.length; -ec=Gb[H];if(pl)l=K;else if(P', -A?Mc("%A, %b %e, %Y",D):D,"

    "]:[];t(H,function(va){xa.push(va.point.tooltipFormatter(ha))});return xa.join("")}function x(H,A){E=ma?H:(2*E+H)/3;ea=ma?A:(ea+A)/2;s.translate(E,ea);kd=cb(H-E)>1||cb(A-ea)>1?function(){x(H,A)}:null}function w(){if(!ma){var H=q.hoverPoints;s.hide();t(ga,function(A){A&&A.hide()});H&&t(H,function(A){A.setState()});q.hoverPoints=null;ma=true}}var O,ja=m.borderWidth,L=m.crosshairs,ga=[],Ea=m.style,ua=m.shared,bb=oa(Ea.padding),Ja=ja+bb,ma=true,Oa,M,E=0,ea=0;Ea.padding= -0;var s=aa.g("tooltip").attr({zIndex:8}).add(),N=aa.rect(Ja,Ja,0,0,m.borderRadius,ja).attr({fill:m.backgroundColor,"stroke-width":ja}).add(s).shadow(m.shadow),Q=aa.text("",bb+Ja,oa(Ea.fontSize)+bb+Ja).attr({zIndex:1}).css(Ea).add(s);s.hide();return{shared:ua,refresh:function(H){var A,D,ha,xa=0,va={},Ka=[];ha=H.tooltipPos;A=m.formatter||h;va=q.hoverPoints;var tb=function(Fa){return{series:Fa.series,point:Fa,x:Fa.category,y:Fa.y,percentage:Fa.percentage,total:Fa.total||Fa.stackTotal}};if(ua){va&&t(va, -function(Fa){Fa.setState()});q.hoverPoints=H;t(H,function(Fa){Fa.setState(yb);xa+=Fa.plotY;Ka.push(tb(Fa))});D=H[0].plotX;xa=fa(xa)/H.length;va={x:H[0].category};va.points=Ka;H=H[0]}else va=tb(H);va=A.call(va);O=H.series;D=ua?D:H.plotX;xa=ua?xa:H.plotY;A=fa(ha?ha[0]:Ga?wa-xa:D);D=fa(ha?ha[1]:Ga?sa-D:xa);ha=ua||!H.series.isCartesian||hc(A,D);if(va===false||!ha)w();else{if(ma){s.show();ma=false}Q.attr({text:va});ha=Q.getBBox();Oa=ha.width+2*bb;M=ha.height+2*bb;N.attr({width:Oa,height:M,stroke:m.borderColor|| -H.color||O.color||"#606060"});A=A-Oa+V-25;D=D-M+ba+10;if(A<7){A=7;D-=30}if(D<5)D=5;else if(D+M>Pa)D=Pa-M-5;x(fa(A-Ja),fa(D-Ja))}if(L){L=nc(L);D=L.length;for(var Hb;D--;)if(L[D]&&(Hb=H.series[D?"yAxis":"xAxis"])){A=Hb.getPlotLinePath(H[D?"y":"x"],1);if(ga[D])ga[D].attr({d:A,visibility:Bb});else{ha={"stroke-width":L[D].width||1,stroke:L[D].color||"#C0C0C0",zIndex:2};if(L[D].dashStyle)ha.dashstyle=L[D].dashStyle;ga[D]=aa.path(A).attr(ha).add()}}}},hide:w}}function f(m,h){function x(E){var ea;E=E||ib.event; -if(!E.target)E.target=E.srcElement;ea=E.touches?E.touches.item(0):E;if(E.type!="mousemove"||ib.opera){for(var s=ta,N={left:s.offsetLeft,top:s.offsetTop};s=s.offsetParent;){N.left+=s.offsetLeft;N.top+=s.offsetTop;if(s!=Aa.body&&s!=Aa.documentElement){N.left-=s.scrollLeft;N.top-=s.scrollTop}}qc=N}if(Ac){E.chartX=E.x;E.chartY=E.y}else if(ea.layerX===Ra){E.chartX=ea.pageX-qc.left;E.chartY=ea.pageY-qc.top}else{E.chartX=E.layerX;E.chartY=E.layerY}return E}function w(E){var ea={xAxis:[],yAxis:[]};t(ab,function(s){var N= -s.translate,Q=s.isXAxis;ea[Q?"xAxis":"yAxis"].push({axis:s,value:N((Ga?!Q:Q)?E.chartX-V:sa-E.chartY+ba,true)})});return ea}function O(){var E=m.hoverSeries,ea=m.hoverPoint;ea&&ea.onMouseOut();E&&E.onMouseOut();rc&&rc.hide();ld=null}function ja(){if(ua){var E={xAxis:[],yAxis:[]},ea=ua.getBBox(),s=ea.x-V,N=ea.y-ba;if(Ea){t(ab,function(Q){var H=Q.translate,A=Q.isXAxis,D=Ga?!A:A,ha=H(D?s:sa-N-ea.height,true);H=H(D?s+ea.width:sa-N,true);E[A?"xAxis":"yAxis"].push({axis:Q,min:pb(ha,H),max:Ca(ha,H)})});La(m, -"selection",E,md)}ua=ua.destroy()}m.mouseIsDown=nd=Ea=false;Cb(Aa,Ib?"touchend":"mouseup",ja)}var L,ga,Ea,ua,bb=v.zoomType,Ja=/x/.test(bb),ma=/y/.test(bb),Oa=Ja&&!Ga||ma&&Ga,M=ma&&!Ga||Ja&&Ga;Pc=function(){if(Qc){Qc.translate(V,ba);Ga&&Qc.attr({width:m.plotWidth,height:m.plotHeight}).invert()}else m.trackerGroup=Qc=aa.g("tracker").attr({zIndex:9}).add()};Pc();if(h.enabled)m.tooltip=rc=e(h);(function(){var E=true;ta.onmousedown=function(s){s=x(s);m.mouseIsDown=nd=true;L=s.chartX;ga=s.chartY;Qa(Aa, -Ib?"touchend":"mouseup",ja)};var ea=function(s){if(!(s&&s.touches&&s.touches.length>1)){s=x(s);if(!Ib)s.returnValue=false;var N=s.chartX,Q=s.chartY,H=!hc(N-V,Q-ba);if(Ib&&s.type=="touchstart")if(za(s.target,"isTracker"))m.runTrackerClick||s.preventDefault();else!ae&&!H&&s.preventDefault();if(H){E||O();if(NV+wa)N=V+wa;if(Qba+sa)Q=ba+sa}if(nd&&s.type!="touchstart"){if(Ea=Math.sqrt(Math.pow(L-N,2)+Math.pow(ga-Q,2))>10){if(ic&&(Ja||ma)&&hc(L-V,ga-ba))ua||(ua=aa.rect(V, -ba,Oa?1:wa,M?1:sa,0).attr({fill:"rgba(69,114,167,0.25)",zIndex:7}).add());if(ua&&Oa){N=N-L;ua.attr({width:cb(N),x:(N>0?0:N)+L})}if(ua&&M){Q=Q-ga;ua.attr({height:cb(Q),y:(Q>0?0:Q)+ga})}}}else if(!H){var A;Q=m.hoverPoint;N=m.hoverSeries;var D,ha,xa=Xa,va=Ga?s.chartY:s.chartX-V;if(rc&&h.shared){A=[];D=Ba.length;for(ha=0;haxa&&A.splice(D, -1);if(A.length&&A[0].plotX!=ld){rc.refresh(A);ld=A[0].plotX}}if(N&&N.tracker)(s=N.tooltipPoints[va])&&s!=Q&&s.onMouseOver()}return(E=H)||!ic}};ta.onmousemove=ea;Qa(ta,"mouseleave",O);ta.ontouchstart=function(s){if(Ja||ma)ta.onmousedown(s);ea(s)};ta.ontouchmove=ea;ta.ontouchend=function(){Ea&&O()};ta.onclick=function(s){var N=m.hoverPoint;s=x(s);s.cancelBubble=true;if(!Ea)if(N&&za(s.target,"isTracker")){var Q=N.plotX,H=N.plotY;qa(N,{pageX:qc.left+V+(Ga?wa-H:Q),pageY:qc.top+ba+(Ga?sa-Q:H)});La(N.series, -"click",qa(s,{point:N}));N.firePointEvent("click",s)}else{qa(s,w(s));hc(s.chartX-V,s.chartY-ba)&&La(m,"click",s)}Ea=false}})();Nd=setInterval(function(){kd&&kd()},32);qa(this,{zoomX:Ja,zoomY:ma,resetTracker:O})}function g(m){var h=m.type||v.type||v.defaultSeriesType,x=ub[h],w=q.hasRendered;if(w)if(Ga&&h=="column")x=ub.bar;else if(!Ga&&h=="bar")x=ub.column;h=new x;h.init(q,m);if(!w&&h.inverted)Ga=true;if(h.isCartesian)ic=h.isCartesian;Ba.push(h);return h}function i(){v.alignTicks!==false&&t(ab,function(m){m.adjustTickAmount()}); -Gb=null}function k(m){var h=q.isDirtyLegend,x,w=q.isDirtyBox,O=Ba.length,ja=O,L=q.clipRect;for(bc(m,q);ja--;){m=Ba[ja];if(m.isDirty&&m.options.stacking){x=true;break}}if(x)for(ja=O;ja--;){m=Ba[ja];if(m.options.stacking)m.isDirty=true}t(Ba,function(ga){if(ga.isDirty){ga.cleanData();ga.getSegments();if(ga.options.legendType=="point")h=true}});if(h&&od.renderLegend){od.renderLegend();q.isDirtyLegend=false}if(ic){if(!Rc){Gb=null;t(ab,function(ga){ga.setScale()})}i();sc();t(ab,function(ga){if(ga.isDirty|| -w){ga.redraw();w=true}})}if(w){pd();Pc();if(L){Sc(L);L.animate({width:q.plotSizeX,height:q.plotSizeY})}}t(Ba,function(ga){if(ga.isDirty&&ga.visible&&(!ga.isCartesian||ga.xAxis))ga.redraw()});gc&&gc.resetTracker&&gc.resetTracker();La(q,"redraw")}function j(){var m=a.xAxis||{},h=a.yAxis||{},x;m=nc(m);t(m,function(w,O){w.index=O;w.isX=true});h=nc(h);t(h,function(w,O){w.index=O});ab=m.concat(h);q.xAxis=[];q.yAxis=[];ab=jc(ab,function(w){x=new c(q,w);q[x.isXAxis?"xAxis":"yAxis"].push(x);return x});i()} -function n(m,h){kc=ya(a.title,m);tc=ya(a.subtitle,h);t([["title",m,kc],["subtitle",h,tc]],function(x){var w=x[0],O=q[w],ja=x[1];x=x[2];if(O&&ja){O.destroy();O=null}if(x&&x.text&&!O)q[w]=aa.text(x.text,0,0).attr({align:x.align,"class":"highcharts-"+w,zIndex:1}).css(x.style).add().align(x,false,uc)})}function z(){jb=v.renderTo;Od=Zb+qd++;if(Kb(jb))jb=Aa.getElementById(jb);jb.innerHTML="";if(!jb.offsetWidth){Qb=jb.cloneNode(0);Ia(Qb,{position:lc,top:"-9999px",display:""});Aa.body.appendChild(Qb)}Tc= -(Qb||jb).offsetWidth;vc=(Qb||jb).offsetHeight;q.chartWidth=Xa=v.width||Tc||600;q.chartHeight=Pa=v.height||(vc>19?vc:400);q.container=ta=fb(Lb,{className:"highcharts-container"+(v.className?" "+v.className:""),id:Od},qa({position:Pd,overflow:vb,width:Xa+$a,height:Pa+$a,textAlign:"left"},v.style),Qb||jb);q.renderer=aa=v.forExport?new Uc(ta,Xa,Pa,true):new Qd(ta,Xa,Pa);var m,h;if(Rd&&ta.getBoundingClientRect){m=function(){Ia(ta,{left:0,top:0});h=ta.getBoundingClientRect();Ia(ta,{left:-h.left%1+$a,top:-h.top% -1+$a})};m();Qa(ib,"resize",m);Qa(q,"destroy",function(){Cb(ib,"resize",m)})}}function F(){function m(){var x=v.width||jb.offsetWidth,w=v.height||jb.offsetHeight;if(x&&w){if(x!=Tc||w!=vc){clearTimeout(h);h=setTimeout(function(){rd(x,w,false)},100)}Tc=x;vc=w}}var h;Qa(window,"resize",m);Qa(q,"destroy",function(){Cb(window,"resize",m)})}function W(){var m=a.labels,h=a.credits,x;n();od=q.legend=new be(q);sc();t(ab,function(w){w.setTickPositions(true)});i();sc();pd();ic&&t(ab,function(w){w.render()}); -if(!q.seriesGroup)q.seriesGroup=aa.g("series-group").attr({zIndex:3}).add();t(Ba,function(w){w.translate();w.setTooltipPoints();w.render()});m.items&&t(m.items,function(){var w=qa(m.style,this.style),O=oa(w.left)+V,ja=oa(w.top)+ba+12;delete w.left;delete w.top;aa.text(this.html,O,ja).attr({zIndex:2}).css(w).add()});if(!q.toolbar)q.toolbar=d(q);if(h.enabled&&!q.credits){x=h.href;aa.text(h.text,0,0).on("click",function(){if(x)location.href=x}).attr({align:h.position.align,zIndex:8}).css(h.style).add().align(h.position)}Pc(); -q.hasRendered=true;if(Qb){jb.appendChild(ta);Fc(Qb)}}function ca(){var m=Ba.length,h=ta&&ta.parentNode;La(q,"destroy");Cb(ib,"unload",ca);Cb(q);for(t(ab,function(x){Cb(x)});m--;)Ba[m].destroy();if(ta){ta.innerHTML="";Cb(ta);h&&h.removeChild(ta);ta=null}if(aa)aa.alignedObjects=null;clearInterval(Nd);for(m in q)delete q[m]}function ka(){if(!wc&&ib==ib.top&&Aa.readyState!="complete")Aa.attachEvent("onreadystatechange",function(){Aa.detachEvent("onreadystatechange",ka);ka()});else{z();sd();td();t(a.series|| -[],function(m){g(m)});q.inverted=Ga=y(Ga,a.chart.inverted);j();q.render=W;q.tracker=gc=new f(q,a.tooltip);W();La(q,"load");b&&b.apply(q,[q]);t(q.callbacks,function(m){m.apply(q,[q])})}}Lc=ya(Lc,Sa.xAxis);hd=ya(hd,Sa.yAxis);Sa.xAxis=Sa.yAxis=null;a=ya(Sa,a);var v=a.chart,I=v.margin;I=Eb(I)?I:[I,I,I,I];var da=y(v.marginTop,I[0]),X=y(v.marginRight,I[1]),U=y(v.marginBottom,I[2]),R=y(v.marginLeft,I[3]),Ha=v.spacingTop,Ya=v.spacingRight,ud=v.spacingBottom,Vc=v.spacingLeft,uc,kc,tc,ba,Ab,rb,V,Pb,jb,Qb,ta, -Od,Tc,vc,Xa,Pa,jd,Oc,Wc,vd,wd,Xc,q=this,ae=(I=v.events)&&!!I.click,xd,hc,rc,nd,$b,Sd,yd,sa,wa,gc,Qc,Pc,od,Rb,Sb,qc,ic=v.showAxes,Rc=0,ab=[],Gb,Ba=[],Ga,aa,kd,Nd,ld,pd,sc,sd,td,rd,md,Td,be=function(m){function h(u,Z){var pa=u.legendItem,Na=u.legendLine,P=u.legendSymbol,K=M.color,gb=Z?L.itemStyle.color:K;K=Z?u.color:K;pa&&pa.css({fill:gb});Na&&Na.attr({stroke:K});P&&P.attr({stroke:K,fill:K})}function x(u,Z,pa){var Na=u.legendItem,P=u.legendLine,K=u.legendSymbol;u=u.checkbox;Na&&Na.attr({x:Z,y:pa}); -P&&P.translate(Z,pa-4);K&&K.attr({x:Z+K.xOff,y:pa+K.yOff});if(u){u.x=Z;u.y=pa}}function w(){t(bb,function(u){var Z=u.checkbox;Z&&Ia(Z,{left:Ka.attr("translateX")+u.legendItemWidth+Z.x-40+$a,top:Ka.attr("translateY")+Z.y-11+$a})})}function O(u){var Z,pa,Na,P,K,gb=u.legendItem;P=u.series||u;if(!gb){K=/^(bar|pie|area|column)$/.test(P.type);u.legendItem=gb=aa.text(L.labelFormatter.call(u),0,0).css(u.visible?ma:M).on("mouseover",function(){u.setState(yb);gb.css(Oa)}).on("mouseout",function(){gb.css(u.visible? -ma:M);u.setState()}).on("click",function(){var Vb=function(){u.setVisible()};u.firePointEvent?u.firePointEvent("legendItemClick",null,Vb):La(u,"legendItemClick",null,Vb)}).attr({zIndex:2}).add(Ka);if(!K&&u.options&&u.options.lineWidth){var cc=u.options;P={"stroke-width":cc.lineWidth,zIndex:2};if(cc.dashStyle)P.dashstyle=cc.dashStyle;u.legendLine=aa.path([Za,-Ea-ua,0,Da,-ua,0]).attr(P).add(Ka)}if(K)Z=aa.rect(pa=-Ea-ua,Na=-11,Ea,12,2).attr({"stroke-width":0,zIndex:3}).add(Ka);else if(u.options&&u.options.marker&& -u.options.marker.enabled)Z=aa.symbol(u.symbol,pa=-Ea/2-ua,Na=-4,u.options.marker.radius).attr(u.pointAttr[db]).attr({zIndex:3}).add(Ka);if(Z){Z.xOff=pa;Z.yOff=Na}u.legendSymbol=Z;h(u,u.visible);if(u.options&&u.options.showCheckbox){u.checkbox=fb("input",{type:"checkbox",checked:u.selected,defaultChecked:u.selected},L.itemCheckboxStyle,ta);Qa(u.checkbox,"click",function(Vb){La(u,"checkboxClick",{checked:Vb.target.checked},function(){u.select()})})}}Z=gb.getBBox();pa=u.legendItemWidth=L.itemWidth|| -Ea+ua+Z.width+ea;D=Z.height;if(ga&&Q-N+pa>(Hb||Xa-2*E-N)){Q=N;H+=D}A=H;x(u,Q,H);if(ga)Q+=pa;else H+=D;tb=Hb||Ca(ga?Q-N:pa,tb);bb.push(u)}function ja(){Q=N;H=s;A=tb=0;bb=[];Ka||(Ka=aa.g("legend").attr({zIndex:7}).add());Ta&&Fa.reverse();t(Fa,function(Na){if(Na.options.showInLegend)t(Na.options.legendType=="point"?Na.data:[Na],O)});Ta&&Fa.reverse();Rb=Hb||tb;Sb=A-s+D;if(xa||va){Rb+=2*E;Sb+=2*E;if(ha)Rb>0&&Sb>0&&ha.animate(ha.crisp(null,null,null,Rb,Sb));else ha=aa.rect(0,0,Rb,Sb,L.borderRadius,xa|| -0).attr({stroke:L.borderColor,"stroke-width":xa||0,fill:va||nb}).add(Ka).shadow(L.shadow);ha[bb.length?"show":"hide"]()}for(var u=["left","right","top","bottom"],Z,pa=4;pa--;){Z=u[pa];if(Ja[Z]&&Ja[Z]!="auto"){L[pa<2?"align":"verticalAlign"]=Z;L[pa<2?"x":"y"]=oa(Ja[Z])*(pa%2?-1:1)}}Ka.align(qa(L,{width:Rb,height:Sb}),true,uc);Rc||w()}var L=m.options.legend;if(L.enabled){var ga=L.layout=="horizontal",Ea=L.symbolWidth,ua=L.symbolPadding,bb,Ja=L.style,ma=L.itemStyle,Oa=L.itemHoverStyle,M=L.itemHiddenStyle, -E=oa(Ja.padding),ea=20,s=18,N=4+E+Ea+ua,Q,H,A,D=0,ha,xa=L.borderWidth,va=L.backgroundColor,Ka,tb,Hb=L.width,Fa=m.series,Ta=L.reversed;ja();Qa(m,"endResize",w);return{colorizeItem:h,destroyItem:function(u){var Z=u.checkbox;t(["legendItem","legendLine","legendSymbol"],function(pa){u[pa]&&u[pa].destroy()});Z&&Fc(u.checkbox)},renderLegend:ja}}};hc=function(m,h){return m>=0&&m<=wa&&h>=0&&h<=sa};Td=function(){La(q,"selection",{resetSelection:true},md);q.toolbar.remove("zoom")};md=function(m){var h=Sa.lang, -x=q.pointCount<100;q.toolbar.add("zoom",h.resetZoom,h.resetZoomTitle,Td);!m||m.resetSelection?t(ab,function(w){w.setExtremes(null,null,false,x)}):t(m.xAxis.concat(m.yAxis),function(w){var O=w.axis;if(q.tracker[O.isXAxis?"zoomX":"zoomY"])O.setExtremes(w.min,w.max,false,x)});k()};sc=function(){var m=a.legend,h=y(m.margin,10),x=m.x,w=m.y,O=m.align,ja=m.verticalAlign,L;sd();if((q.title||q.subtitle)&&!J(da))if(L=Ca(q.title&&!kc.floating&&!kc.verticalAlign&&kc.y||0,q.subtitle&&!tc.floating&&!tc.verticalAlign&& -tc.y||0))ba=Ca(ba,L+y(kc.margin,15)+Ha);if(m.enabled&&!m.floating)if(O=="right")J(X)||(Ab=Ca(Ab,Rb-x+h+Ya));else if(O=="left")J(R)||(V=Ca(V,Rb+x+h+Vc));else if(ja=="top")J(da)||(ba=Ca(ba,Sb+w+h+Ha));else if(ja=="bottom")J(U)||(rb=Ca(rb,Sb-w+h+ud));ic&&t(ab,function(ga){ga.getOffset()});J(R)||(V+=Pb[3]);J(da)||(ba+=Pb[0]);J(U)||(rb+=Pb[2]);J(X)||(Ab+=Pb[1]);td()};rd=function(m,h,x){var w=q.title,O=q.subtitle;Rc+=1;bc(x,q);Oc=Pa;jd=Xa;Xa=fa(m);Pa=fa(h);Ia(ta,{width:Xa+$a,height:Pa+$a});aa.setSize(Xa, -Pa,x);wa=Xa-V-Ab;sa=Pa-ba-rb;Gb=null;t(ab,function(ja){ja.isDirty=true;ja.setScale()});t(Ba,function(ja){ja.isDirty=true});q.isDirtyLegend=true;q.isDirtyBox=true;sc();w&&w.align(null,null,uc);O&&O.align(null,null,uc);k(x);Oc=null;La(q,"resize");setTimeout(function(){La(q,"endResize",null,function(){Rc-=1})},Bc&&Bc.duration||500)};td=function(){q.plotLeft=V=fa(V);q.plotTop=ba=fa(ba);q.plotWidth=wa=fa(Xa-V-Ab);q.plotHeight=sa=fa(Pa-ba-rb);q.plotSizeX=Ga?sa:wa;q.plotSizeY=Ga?wa:sa;uc={x:Vc,y:Ha,width:Xa- -Vc-Ya,height:Pa-Ha-ud}};sd=function(){ba=y(da,Ha);Ab=y(X,Ya);rb=y(U,ud);V=y(R,Vc);Pb=[0,0,0,0]};pd=function(){var m=v.borderWidth||0,h=v.backgroundColor,x=v.plotBackgroundColor,w=v.plotBackgroundImage,O,ja={x:V,y:ba,width:wa,height:sa};O=m+(v.shadow?8:0);if(m||h)if(Wc)Wc.animate(Wc.crisp(null,null,null,Xa-O,Pa-O));else Wc=aa.rect(O/2,O/2,Xa-O,Pa-O,v.borderRadius,m).attr({stroke:v.borderColor,"stroke-width":m,fill:h||nb}).add().shadow(v.shadow);if(x)if(vd)vd.animate(ja);else vd=aa.rect(V,ba,wa,sa, -0).attr({fill:x}).add().shadow(v.plotShadow);if(w)if(wd)wd.animate(ja);else wd=aa.image(w,V,ba,wa,sa).add();if(v.plotBorderWidth)if(Xc)Xc.animate(Xc.crisp(null,V,ba,wa,sa));else Xc=aa.rect(V,ba,wa,sa,0,v.plotBorderWidth).attr({stroke:v.plotBorderColor,"stroke-width":v.plotBorderWidth,zIndex:4}).add();q.isDirtyBox=false};Yc=Jb=0;Qa(ib,"unload",ca);v.reflow!==false&&Qa(q,"load",F);if(I)for(xd in I)Qa(q,xd,I[xd]);q.options=a;q.series=Ba;q.addSeries=function(m,h,x){var w;if(m){bc(x,q);h=y(h,true);La(q, -"addSeries",{options:m},function(){w=g(m);w.isDirty=true;q.isDirtyLegend=true;h&&q.redraw()})}return w};q.animation=y(v.animation,true);q.destroy=ca;q.get=function(m){var h,x,w;for(h=0;h-1,f=e?7:3,g;b=b.split(" ");c=[].concat(c);var i,k,j=function(n){for(g=n.length;g--;)n[g]==Za&&n.splice(g+1,0,n[g+1],n[g+2],n[g+1],n[g+2])};if(e){j(b);j(c)}if(a.isArea){i= -b.splice(b.length-6,6);k=c.splice(c.length-6,6)}if(d){c=[].concat(c).splice(0,f).concat(c);a.shift=false}if(b.length)for(a=c.length;b.length255)b[e]=255}}return this},setOpacity:function(d){b[3]=d;return this}}};Mc=function(a,b,c){function d(F){return F.toString().replace(/^([0-9])$/,"0$1")}if(!J(b)||isNaN(b))return"Invalid date";a=y(a,"%Y-%m-%d %H:%M:%S");b=new Date(b* -qb);var e=b[cd](),f=b[dd](),g=b[oc](),i=b[Dc](),k=b[Ec](),j=Sa.lang,n=j.weekdays;j=j.months;b={a:n[f].substr(0,3),A:n[f],d:d(g),e:g,b:j[i].substr(0,3),B:j[i],m:d(i+1),y:k.toString().substr(2,2),Y:k,H:d(e),I:d(e%12||12),l:e%12||12,M:d(b[bd]()),p:e<12?"AM":"PM",P:e<12?"am":"pm",S:d(b.getSeconds())};for(var z in b)a=a.replace("%"+z,b[z]);return c?a.substr(0,1).toUpperCase()+a.substr(1):a};Hc.prototype={init:function(a,b){this.element=Aa.createElementNS("http://www.w3.org/2000/svg",b);this.renderer=a}, -animate:function(a,b,c){if(b=y(b,Bc,true)){b=ya(b);if(c)b.complete=c;Zc(this,a,b)}else{this.attr(a);c&&c()}},attr:function(a,b){var c,d,e,f,g=this.element,i=g.nodeName,k=this.renderer,j,n=this.shadows,z,F=this;if(Kb(a)&&J(b)){c=a;a={};a[c]=b}if(Kb(a)){c=a;if(i=="circle")c={x:"cx",y:"cy"}[c]||c;else if(c=="strokeWidth")c="stroke-width";F=za(g,c)||this[c]||0;if(c!="d"&&c!="visibility")F=parseFloat(F)}else for(c in a){j=false;d=a[c];if(c=="d"){if(d&&d.join)d=d.join(" ");if(/(NaN| {2}|^$)/.test(d))d= -"M 0 0";this.d=d}else if(c=="x"&&i=="text"){for(e=0;eg||!J(g)&& -J(b))){d.insertBefore(f,a);return this}}d.appendChild(f);this.added=true;return this},destroy:function(){var a=this.element||{},b=this.shadows,c=a.parentNode,d;a.onclick=a.onmouseout=a.onmouseover=a.onmousemove=null;Sc(this);c&&c.removeChild(a);b&&t(b,function(e){(c=e.parentNode)&&c.removeChild(e)});mc(this.renderer.alignedObjects,this);for(d in this)delete this[d];return null},empty:function(){for(var a=this.element,b=a.childNodes,c=b.length;c--;)a.removeChild(b[c])},shadow:function(a){var b=[], -c,d=this.element,e=this.parentInverted?"(-1,-1)":"(1,1)";if(a){for(a=1;a<=3;a++){c=d.cloneNode(0);za(c,{isShadow:"true",stroke:"rgb(0, 0, 0)","stroke-opacity":0.05*a,"stroke-width":7-2*a,transform:"translate"+e,fill:nb});d.parentNode.insertBefore(c,d);b.push(c)}this.shadows=b}return this}};var Uc=function(){this.init.apply(this,arguments)};Uc.prototype={init:function(a,b,c,d){var e=location,f;this.Element=Hc;f=this.createElement("svg").attr({xmlns:"http://www.w3.org/2000/svg",version:"1.1"});a.appendChild(f.element); -this.box=f.element;this.boxWrapper=f;this.alignedObjects=[];this.url=Ac?"":e.href.replace(/#.*?$/,"");this.defs=this.createElement("defs").add();this.forExport=d;this.setSize(b,c,false)},createElement:function(a){var b=new this.Element;b.init(this,a);return b},buildText:function(a){for(var b=a.element,c=y(a.textStr,"").toString().replace(/<(b|strong)>/g,'').replace(/<(i|em)>/g,'').replace(//g, -"").split(/]?>/g),d=b.childNodes,e=/style="([^"]+)"/,f=/href="([^"]+)"/,g=za(b,"x"),i=a.styles,k=Rd&&i&&i.HcDirection=="rtl"&&!this.forExport,j,n=i&&oa(i.width),z=i&&i.lineHeight,F,W=d.length;W--;)b.removeChild(d[W]);n&&!a.added&&this.box.appendChild(b);t(c,function(ca,ka){var v,I=0,da;ca=ca.replace(//g,"|||");v=ca.split("|||");t(v,function(X){if(X!==""||v.length==1){var U={},R=Aa.createElementNS("http://www.w3.org/2000/svg","tspan");e.test(X)&& -za(R,"style",X.match(e)[1].replace(/(;| |^)color([ :])/,"$1fill$2"));if(f.test(X)){za(R,"onclick",'location.href="'+X.match(f)[1]+'"');Ia(R,{cursor:"pointer"})}X=X.replace(/<(.|\n)*?>/g,"")||" ";if(k){j=[];for(W=X.length;W--;)j.push(X.charAt(W));X=j.join("")}R.appendChild(Aa.createTextNode(X));if(I)U.dx=3;else U.x=g;if(!I){if(ka){da=oa(window.getComputedStyle(F,null).getPropertyValue("line-height"));if(isNaN(da))da=z||F.offsetHeight||18;za(R,"dy",da)}F=R}za(R,U);b.appendChild(R);I++;if(n){X=X.replace(/-/g, -"- ").split(" ");for(var Ha,Ya=[];X.length||Ya.length;){Ha=b.getBBox().width;U=Ha>n;if(!U||X.length==1){X=Ya;Ya=[];if(X.length){R=Aa.createElementNS("http://www.w3.org/2000/svg","tspan");za(R,{x:g,dy:z||16});b.appendChild(R);if(Ha>n)n=Ha}}else{R.removeChild(R.firstChild);Ya.unshift(X.pop())}R.appendChild(Aa.createTextNode(X.join(" ").replace(/- /g,"-")))}}}})})},crispLine:function(a,b){if(a[1]==a[4])a[1]=a[4]=fa(a[1])+b%2/2;if(a[2]==a[5])a[2]=a[5]=fa(a[2])+b%2/2;return a},path:function(a){return this.createElement("path").attr({d:a, -fill:nb})},circle:function(a,b,c){a=Eb(a)?a:{x:a,y:b,r:c};return this.createElement("circle").attr(a)},arc:function(a,b,c,d,e,f){if(Eb(a)){b=a.y;c=a.r;d=a.innerR;e=a.start;f=a.end;a=a.x}return this.symbol("arc",a||0,b||0,c||0,{innerR:d||0,start:e||0,end:f||0})},rect:function(a,b,c,d,e,f){if(Eb(a)){b=a.y;c=a.width;d=a.height;e=a.r;a=a.x}e=this.createElement("rect").attr({rx:e,ry:e,fill:nb});return e.attr(e.crisp(f,a,b,Ca(c,0),Ca(d,0)))},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length; -this.width=a;this.height=b;for(this.boxWrapper[y(c,true)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){return this.createElement("g").attr(J(a)&&{"class":Zb+a})},image:function(a,b,c,d,e){var f={preserveAspectRatio:nb};arguments.length>1&&qa(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a);return f},symbol:function(a,b,c,d,e){var f,g=this.symbols[a];g=g&&g(b,c,d,e);var i=/^url\((.*?)\)$/; -if(g){f=this.path(g);qa(f,{symbolName:a,x:b,y:c,r:d});e&&qa(f,e)}else if(i.test(a)){a=a.match(i)[1];f=this.image(a).attr({x:b,y:c});fb("img",{onload:function(){var k=de[this.src]||[this.width,this.height];f.attr({width:k[0],height:k[1]}).translate(-fa(k[0]/2),-fa(k[1]/2))},src:a})}else f=this.circle(b,c,d);return f},symbols:{square:function(a,b,c){c=0.707*c;return[Za,a-c,b-c,Da,a+c,b-c,a+c,b+c,a-c,b+c,"Z"]},triangle:function(a,b,c){return[Za,a,b-1.33*c,Da,a+c,b+0.67*c,a-c,b+0.67*c,"Z"]},"triangle-down":function(a, -b,c){return[Za,a,b+1.33*c,Da,a-c,b-0.67*c,a+c,b-0.67*c,"Z"]},diamond:function(a,b,c){return[Za,a,b-c,Da,a+c,b,a,b+c,a-c,b,"Z"]},arc:function(a,b,c,d){var e=d.start,f=d.end-1.0E-6,g=d.innerR,i=kb(e),k=zb(e),j=kb(f);f=zb(f);d=d.end-e');if(b){c=b==Lb||b=="span"||b=="img"?c.join(""): -a.prepVML(c);this.element=fb(c)}this.renderer=a},add:function(a){var b=this.renderer,c=this.element,d=b.box;d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);yc&&d.gVis==vb&&Ia(c,{visibility:vb});d.appendChild(c);this.added=true;this.alignOnAdd&&this.updateTransform();return this},attr:function(a,b){var c,d,e,f=this.element||{},g=f.style,i=f.nodeName,k=this.renderer,j=this.symbolName,n,z,F=this.shadows,W=this;if(Kb(a)&&J(b)){c=a;a={};a[c]=b}if(Kb(a)){c=a;W=c=="strokeWidth"||c=="stroke-width"?this.strokeweight: -this[c]}else for(c in a){d=a[c];n=false;if(j&&/^(x|y|r|start|end|width|height|innerR)/.test(c)){if(!z){this.symbolAttr(a);z=true}n=true}else if(c=="d"){d=d||[];this.d=d.join(" ");e=d.length;for(n=[];e--;)n[e]=ac(d[e])?fa(d[e]*10)-5:d[e]=="Z"?"x":d[e];d=n.join(" ")||"x";f.path=d;if(F)for(e=F.length;e--;)F[e].path=d;n=true}else if(c=="zIndex"||c=="visibility"){if(yc&&c=="visibility"&&i=="DIV"){f.gVis=d;n=f.childNodes;for(e=n.length;e--;)Ia(n[e],{visibility:d});if(d==Bb)d=null}if(d)g[c]=d;n=true}else if(/^(width|height)$/.test(c)){if(this.updateClipping){this[c]= -d;this.updateClipping()}else g[c]=d;n=true}else if(/^(x|y)$/.test(c)){this[c]=d;if(f.tagName=="SPAN")this.updateTransform();else g[{x:"left",y:"top"}[c]]=d}else if(c=="class")f.className=d;else if(c=="stroke"){d=k.color(d,f,c);c="strokecolor"}else if(c=="stroke-width"||c=="strokeWidth"){f.stroked=d?true:false;c="strokeweight";this[c]=d;if(ac(d))d+=$a}else if(c=="dashstyle"){(f.getElementsByTagName("stroke")[0]||fb(k.prepVML([""]),null,null,f))[c]=d||"solid";this.dashstyle=d;n=true}else if(c== -"fill")if(i=="SPAN")g.color=d;else{f.filled=d!=nb?true:false;d=k.color(d,f,c);c="fillcolor"}else if(c=="translateX"||c=="translateY"||c=="rotation"||c=="align"){if(c=="align")c="textAlign";this[c]=d;this.updateTransform();n=true}else if(c=="text"){f.innerHTML=d;n=true}if(F&&c=="visibility")for(e=F.length;e--;)F[e].style[c]=d;if(!n)if(yc)f[c]=d;else za(f,c,d)}return W},clip:function(a){var b=this,c=a.members;c.push(b);b.destroyClip=function(){mc(c,b)};return b.css(a.getCSS(b.inverted))},css:function(a){var b= -this.element;if(b=a&&b.tagName=="SPAN"&&a.width){delete a.width;this.textWidth=b;this.updateTransform()}this.styles=qa(this.styles,a);Ia(this.element,a);return this},destroy:function(){this.destroyClip&&this.destroyClip();Hc.prototype.destroy.apply(this)},empty:function(){for(var a=this.element.childNodes,b=a.length,c;b--;){c=a[b];c.parentNode.removeChild(c)}},getBBox:function(){var a=this.element;if(a.nodeName=="text")a.style.position=lc;return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}}, -on:function(a,b){this.element["on"+a]=function(){var c=ib.event;c.target=c.srcElement;b(c)};return this},updateTransform:function(){if(this.added){var a=this,b=a.element,c=a.translateX||0,d=a.translateY||0,e=a.x||0,f=a.y||0,g=a.textAlign||"left",i={left:0,center:0.5,right:1}[g],k=g&&g!="left";if(c||d)a.css({marginLeft:c,marginTop:d});a.inverted&&t(b.childNodes,function(I){a.renderer.invertChild(I,b)});if(b.tagName=="SPAN"){var j,n;c=a.rotation;var z;j=0;d=1;var F=0,W;z=oa(a.textWidth);var ca=a.xCorr|| -0,ka=a.yCorr||0,v=[c,g,b.innerHTML,a.textWidth].join(",");if(v!=a.cTT){if(J(c)){j=c*Ud;d=kb(j);F=zb(j);Ia(b,{filter:c?["progid:DXImageTransform.Microsoft.Matrix(M11=",d,", M12=",-F,", M21=",F,", M22=",d,", sizingMethod='auto expand')"].join(""):nb})}j=b.offsetWidth;n=b.offsetHeight;if(j>z){Ia(b,{width:z+$a,display:"block",whiteSpace:"normal"});j=z}z=fa(oa(b.style.fontSize||12)*1.2);ca=d<0&&-j;ka=F<0&&-n;W=d*F<0;ca+=F*z*(W?1-i:i);ka-=d*z*(c?W?i:1-i:1);if(k){ca-=j*i*(d<0?-1:1);if(c)ka-=n*i*(F<0?-1: -1);Ia(b,{textAlign:g})}a.xCorr=ca;a.yCorr=ka}Ia(b,{left:e+ca,top:f+ka});a.cTT=v}}else this.alignOnAdd=true},shadow:function(a){var b=[],c=this.element,d=this.renderer,e,f=c.style,g,i=c.path;if(""+c.path==="")i="x";if(a){for(a=1;a<=3;a++){g=[''];e=fb(d.prepVML(g),null,{left:oa(f.left)+1,top:oa(f.top)+1});g=[''];fb(d.prepVML(g),null, -null,e);c.parentNode.insertBefore(e,c);b.push(e)}this.shadows=b}return this}});Ma=function(){this.init.apply(this,arguments)};Ma.prototype=ya(Uc.prototype,{isIE8:xc.indexOf("MSIE 8.0")>-1,init:function(a,b,c){var d;this.Element=ge;this.alignedObjects=[];d=this.createElement(Lb);a.appendChild(d.element);this.box=d.element;this.boxWrapper=d;this.setSize(b,c,false);if(!Aa.namespaces.hcv){Aa.namespaces.add("hcv","urn:schemas-microsoft-com:vml");Aa.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}, -clipRect:function(a,b,c,d){var e=this.createElement();return qa(e,{members:[],left:a,top:b,width:c,height:d,getCSS:function(f){var g=this.top,i=this.left,k=i+this.width,j=g+this.height;g={clip:"rect("+fa(f?i:g)+"px,"+fa(f?j:k)+"px,"+fa(f?k:j)+"px,"+fa(f?g:i)+"px)"};!f&&yc&&qa(g,{width:k+$a,height:j+$a});return g},updateClipping:function(){t(e.members,function(f){f.css(e.getCSS(f.inverted))})}})},color:function(a,b,c){var d,e=/^rgba/;if(a&&a.linearGradient){var f,g,i=a.linearGradient,k,j,n,z;t(a.stops, -function(F,W){if(e.test(F[1])){d=Ub(F[1]);f=d.get("rgb");g=d.get("a")}else{f=F[1];g=1}if(W){n=f;z=g}else{k=f;j=g}});a=90-Ua.atan((i[3]-i[1])/(i[2]-i[0]))*180/Tb;c=["<",c,' colors="0% ',k,",100% ",n,'" angle="',a,'" opacity="',z,'" o:opacity2="',j,'" type="gradient" focus="100%" />'];fb(this.prepVML(c),null,null,b)}else if(e.test(a)&&b.tagName!="IMG"){d=Ub(a);c=["<",c,' opacity="',d.get("a"),'"/>'];fb(this.prepVML(c),null,null,b);return d.get("rgb")}else return a},prepVML:function(a){var b=this.isIE8; -a=a.join("");if(b){a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />');a=a.indexOf('style="')==-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')}else a=a.replace("<","1&&f.css({left:b,top:c,width:d,height:e});return f},rect:function(a,b,c,d,e,f){if(Eb(a)){b=a.y;c=a.width;d=a.height;e=a.r;a=a.x}var g=this.symbol("rect");g.r=e;return g.attr(g.crisp(f,a,b,Ca(c,0),Ca(d,0)))},invertChild:function(a,b){var c=b.style; -Ia(a,{flip:"x",left:oa(c.width)-10,top:oa(c.height)-10,rotation:-90})},symbols:{arc:function(a,b,c,d){var e=d.start,f=d.end,g=kb(e),i=zb(e),k=kb(f),j=zb(f);d=d.innerR;var n=0.07/c,z=d&&0.1/d||0;if(f-e===0)return["x"];else if(2*Tb-f+e=c.length)Jb=0}a.chart.pointCount++;return this},applyOptions:function(a){var b=this.series;this.config=a;if(ac(a)||a===null)this.y=a;else if(Eb(a)&&!ac(a.length)){qa(this,a);this.options=a}else if(Kb(a[0])){this.name=a[0];this.y=a[1]}else if(ac(a[0])){this.x=a[0];this.y=a[1]}if(this.x===Ra)this.x=b.autoIncrement()},destroy:function(){var a=this,b=a.series,c;b.chart.pointCount--;a==b.chart.hoverPoint&&a.onMouseOut();b.chart.hoverPoints=null;Cb(a);t(["graphic","tracker","group","dataLabel", -"connector"],function(d){a[d]&&a[d].destroy()});a.legendItem&&a.series.chart.legend.destroyItem(a);for(c in a)a[c]=null},select:function(a,b){var c=this,d=c.series.chart;c.selected=a=y(a,!c.selected);c.firePointEvent(a?"select":"unselect");c.setState(a&&"select");b||t(d.getSelectedPoints(),function(e){if(e.selected&&e!=c){e.selected=false;e.setState(db);e.firePointEvent("unselect")}})},onMouseOver:function(){var a=this.series.chart,b=a.tooltip,c=a.hoverPoint;c&&c!=this&&c.onMouseOut();this.firePointEvent("mouseOver"); -b&&!b.shared&&b.refresh(this);this.setState(yb);a.hoverPoint=this},onMouseOut:function(){this.firePointEvent("mouseOut");this.setState();this.series.chart.hoverPoint=null},tooltipFormatter:function(a){var b=this.series;return['',this.name||b.name,": ",!a?"x = "+(this.name||this.x)+", ":"","",!a?"y = ":"",this.y,"
    "].join("")},getDataLabelText:function(){return this.series.options.dataLabels.formatter.call({x:this.x,y:this.y,series:this.series, -point:this,percentage:this.percentage,total:this.total||this.stackTotal})},update:function(a,b,c){var d=this,e=d.series,f=d.dataLabel,g=d.graphic,i=e.chart;b=y(b,true);d.firePointEvent("update",{options:a},function(){d.applyOptions(a);f&&f.attr({text:d.getDataLabelText()});if(Eb(a)){e.getAttribs();g&&g.attr(d.pointAttr[e.state])}e.isDirty=true;b&&i.redraw(c)})},remove:function(a,b){var c=this,d=c.series,e=d.chart,f=d.data;bc(b,e);a=y(a,true);c.firePointEvent("remove",null,function(){mc(f,c);c.destroy(); -d.isDirty=true;a&&e.redraw()})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;if(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])this.importEvents();if(a=="click"&&e.allowPointSelect)c=function(f){d.select(null,f.ctrlKey||f.metaKey||f.shiftKey)};La(this,a,b,c)},importEvents:function(){if(!this.hasImportedEvents){var a=ya(this.series.options.point,this.options).events,b;this.events=a;for(b in a)Qa(this,b,a[b]);this.hasImportedEvents=true}},setState:function(a){var b= -this.series,c=b.options.states,d=wb[b.type].marker&&b.options.marker,e=d&&!d.enabled,f=(d=d&&d.states[a])&&d.enabled===false,g=b.stateMarkerGraphic,i=b.chart,k=this.pointAttr;a||(a=db);if(!(a==this.state||this.selected&&a!="select"||c[a]&&c[a].enabled===false||a&&(f||e&&!d.enabled))){if(this.graphic)this.graphic.attr(k[a]);else{if(a){if(!g)b.stateMarkerGraphic=g=i.renderer.circle(0,0,k[a].r).attr(k[a]).add(b.group);g.translate(this.plotX,this.plotY)}if(g)g[a?"show":"hide"]()}this.state=a}}};var mb= -function(){};mb.prototype={isCartesian:true,type:"line",pointClass:zc,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor",r:"radius"},init:function(a,b){var c,d;d=a.series.length;this.chart=a;b=this.setOptions(b);qa(this,{index:d,options:b,name:b.name||"Series "+(d+1),state:db,pointAttr:{},visible:b.visible!==false,selected:b.selected===true});d=b.events;for(c in d)Qa(this,c,d[c]);if(d&&d.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick= -true;this.getColor();this.getSymbol();this.setData(b.data,false)},autoIncrement:function(){var a=this.options,b=this.xIncrement;b=y(b,a.pointStart,0);this.pointInterval=y(this.pointInterval,a.pointInterval,1);this.xIncrement=b+this.pointInterval;return b},cleanData:function(){var a=this.chart,b=this.data,c,d,e=a.smallestInterval,f,g;b.sort(function(i,k){return i.x-k.x});for(g=b.length-1;g>=0;g--)b[g-1]&&b[g-1].x==b[g].x&&b.splice(g-1,1);for(g=b.length-1;g>=0;g--)if(b[g-1]){f=b[g].x-b[g-1].x;if(d=== -Ra||fa+1&&b.push(c.slice(a+1,e));a=e}else e==c.length-1&&b.push(c.slice(a+1,e+1))});this.segments=b},setOptions:function(a){var b=this.chart.options.plotOptions;return ya(b[this.type],b.series,a)},getColor:function(){var a=this.chart.options.colors;this.color=this.options.color||a[Jb++]||"#0000ff";if(Jb>=a.length)Jb=0},getSymbol:function(){var a= -this.chart.options.symbols;this.symbol=this.options.marker.symbol||a[Yc++];if(Yc>=a.length)Yc=0},addPoint:function(a,b,c,d){var e=this.data,f=this.graph,g=this.area,i=this.chart;a=(new this.pointClass).init(this,a);bc(d,i);if(f&&c)f.shift=c;if(g){g.shift=c;g.isArea=true}b=y(b,true);e.push(a);c&&e[0].remove(false);this.isDirty=true;b&&i.redraw()},setData:function(a,b){var c=this,d=c.data,e=c.initialColor,f=c.chart,g=d&&d.length||0;c.xIncrement=null;if(J(e))Jb=e;for(a=jc(nc(a||[]),function(i){return(new c.pointClass).init(c, -i)});g--;)d[g].destroy();c.data=a;c.cleanData();c.getSegments();c.isDirty=true;f.isDirtyBox=true;y(b,true)&&f.redraw(false)},remove:function(a,b){var c=this,d=c.chart;a=y(a,true);if(!c.isRemoving){c.isRemoving=true;La(c,"remove",null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=true;a&&d.redraw(b)})}c.isRemoving=false},translate:function(){for(var a=this.chart,b=this.options.stacking,c=this.xAxis.categories,d=this.yAxis,e=this.data,f=e.length;f--;){var g=e[f],i=g.x,k=g.y,j=g.low,n=d.stacks[(k< -0?"-":"")+this.stackKey];g.plotX=this.xAxis.translate(i);if(b&&this.visible&&n&&n[i]){j=n[i];i=j.total;j.cum=j=j.cum-k;k=j+k;if(b=="percent"){j=i?j*100/i:0;k=i?k*100/i:0}g.percentage=i?g.y*100/i:0;g.stackTotal=i}if(J(j))g.yBottom=d.translate(j,0,1);if(k!==null)g.plotY=d.translate(k,0,1);g.clientX=a.inverted?a.plotHeight-g.plotX:g.plotX;g.category=c&&c[g.x]!==Ra?c[g.x]:g.x}},setTooltipPoints:function(a){var b=this.chart,c=b.inverted,d=[],e=fa((c?b.plotTop:b.plotLeft)+b.plotSizeX),f,g,i=[];if(a)this.tooltipPoints= -null;t(this.segments,function(k){d=d.concat(k)});if(this.xAxis&&this.xAxis.reversed)d=d.reverse();t(d,function(k,j){f=d[j-1]?d[j-1].high+1:0;for(g=k.high=d[j+1]?ob((k.plotX+(d[j+1]?d[j+1].plotX:e))/2):e;f<=g;)i[c?e-f++:f++]=k});this.tooltipPoints=i},onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(!(!Ib&&a.mouseIsDown)){b&&b!=this&&b.onMouseOut();this.options.events.mouseOver&&La(this,"mouseOver");this.tracker&&this.tracker.toFront();this.setState(yb);a.hoverSeries=this}},onMouseOut:function(){var a= -this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;d&&d.onMouseOut();this&&a.events.mouseOut&&La(this,"mouseOut");c&&!a.stickyTracking&&c.hide();this.setState();b.hoverSeries=null},animate:function(a){var b=this.chart,c=this.clipRect,d=this.options.animation;if(d&&!Eb(d))d={};if(a){if(!c.isAnimating){c.attr("width",0);c.isAnimating=true}}else{c.animate({width:b.plotSizeX},d);this.animate=null}},drawPoints:function(){var a,b=this.data,c=this.chart,d,e,f,g,i,k;if(this.options.marker.enabled)for(f= -b.length;f--;){g=b[f];d=g.plotX;e=g.plotY;k=g.graphic;if(e!==Ra&&!isNaN(e)){a=g.pointAttr[g.selected?"select":db];i=a.r;if(k)k.animate({x:d,y:e,r:i});else g.graphic=c.renderer.symbol(y(g.marker&&g.marker.symbol,this.symbol),d,e,i).attr(a).add(this.group)}}},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,i={};a=a||{};b=b||{};c=c||{};d=d||{};for(f in e){g=e[f];i[f]=y(a[g],b[f],c[f],d[f])}return i},getAttribs:function(){var a=this,b=wb[a.type].marker?a.options.marker:a.options,c= -b.states,d=c[yb],e,f=a.color,g={stroke:f,fill:f},i=a.data,k=[],j,n=a.pointAttrToOptions;if(a.options.marker){d.radius=d.radius||b.radius+2;d.lineWidth=d.lineWidth||b.lineWidth+1}else d.color=d.color||Ub(d.color||f).brighten(d.brightness).get();k[db]=a.convertAttribs(b,g);t([yb,"select"],function(F){k[F]=a.convertAttribs(c[F],k[db])});a.pointAttr=k;for(f=i.length;f--;){g=i[f];if((b=g.options&&g.options.marker||g.options)&&b.enabled===false)b.radius=0;e=false;if(g.options)for(var z in n)if(J(b[n[z]]))e= -true;if(e){j=[];c=b.states||{};e=c[yb]=c[yb]||{};if(!a.options.marker)e.color=Ub(e.color||g.options.color).brighten(e.brightness||d.brightness).get();j[db]=a.convertAttribs(b,k[db]);j[yb]=a.convertAttribs(c[yb],k[yb],j[db]);j.select=a.convertAttribs(c.select,k.select,j[db])}else j=k;g.pointAttr=j}},destroy:function(){var a=this,b=a.chart,c=/\/5[0-9\.]+ (Safari|Mobile)\//.test(xc),d,e;Cb(a);a.legendItem&&a.chart.legend.destroyItem(a);t(a.data,function(f){f.destroy()});t(["area","graph","dataLabelsGroup", -"group","tracker"],function(f){if(a[f]){d=c&&f=="group"?"hide":"destroy";a[f][d]()}});if(b.hoverSeries==a)b.hoverSeries=null;mc(b.series,a);for(e in a)delete a[e]},drawDataLabels:function(){if(this.options.dataLabels.enabled){var a,b,c=this.data,d=this.options.dataLabels,e,f=this.dataLabelsGroup,g=this.chart,i=g.inverted,k=this.type,j;if(!f)f=this.dataLabelsGroup=g.renderer.g(Zb+"data-labels").attr({visibility:this.visible?Bb:vb,zIndex:5}).translate(g.plotLeft,g.plotTop).add();j=d.color;if(j=="auto")j= -null;d.style.color=y(j,this.color);t(c,function(n){var z=n.barX;z=z&&z+n.barW/2||n.plotX||-999;var F=y(n.plotY,-999),W=n.dataLabel,ca=d.align;e=n.getDataLabelText();a=(i?g.plotWidth-F:z)+d.x;b=(i?g.plotHeight-z:F)+d.y;if(k=="column")a+={left:-1,right:1}[ca]*n.barW/2||0;if(W)W.animate({x:a,y:b});else if(J(e))W=n.dataLabel=g.renderer.text(e,a,b).attr({align:ca,rotation:d.rotation,zIndex:1}).css(d.style).add(f);i&&!d.y&&W.attr({y:b+parseInt(W.styles.lineHeight)*0.9-W.getBBox().height/2})})}},drawGraph:function(){var a= -this,b=a.options,c=a.graph,d=[],e,f=a.area,g=a.group,i=b.lineColor||a.color,k=b.lineWidth,j=b.dashStyle,n,z=a.chart.renderer,F=a.yAxis.getThreshold(b.threshold||0),W=/^area/.test(a.type),ca=[],ka=[];t(a.segments,function(v){n=[];t(v,function(U,R){if(a.getPointSpline)n.push.apply(n,a.getPointSpline(v,U,R));else{n.push(R?Da:Za);R&&b.step&&n.push(U.plotX,v[R-1].plotY);n.push(U.plotX,U.plotY)}});if(v.length>1)d=d.concat(n);else ca.push(v[0]);if(W){var I=[],da,X=n.length;for(da=0;da=0;da--)I.push(v[da].plotX,v[da].yBottom);else I.push(Da,v[v.length-1].plotX,F,Da,v[0].plotX,F);ka=ka.concat(I)}});a.graphPath=d;a.singlePoints=ca;if(W){e=y(b.fillColor,Ub(a.color).setOpacity(b.fillOpacity||0.75).get());if(f)f.animate({d:ka});else a.area=a.chart.renderer.path(ka).attr({fill:e}).add(g)}if(c)c.animate({d:d});else if(k){c={stroke:i,"stroke-width":k};if(j)c.dashstyle=j;a.graph=z.path(d).attr(c).add(g).shadow(b.shadow)}}, -render:function(){var a=this,b=a.chart,c,d,e=a.options,f=e.animation,g=f&&a.animate;f=g?f&&f.duration||500:0;var i=a.clipRect;d=b.renderer;if(!i){i=a.clipRect=!b.hasRendered&&b.clipRect?b.clipRect:d.clipRect(0,0,b.plotSizeX,b.plotSizeY);if(!b.clipRect)b.clipRect=i}if(!a.group){c=a.group=d.g("series");if(b.inverted){d=function(){c.attr({width:b.plotWidth,height:b.plotHeight}).invert()};d();Qa(b,"resize",d)}c.clip(a.clipRect).attr({visibility:a.visible?Bb:vb,zIndex:e.zIndex}).translate(b.plotLeft,b.plotTop).add(b.seriesGroup)}a.drawDataLabels(); -g&&a.animate(true);a.getAttribs();a.drawGraph&&a.drawGraph();a.drawPoints();a.options.enableMouseTracking!==false&&a.drawTracker();g&&a.animate();setTimeout(function(){i.isAnimating=false;if((c=a.group)&&i!=b.clipRect&&i.renderer){c.clip(a.clipRect=b.clipRect);i.destroy()}},f);a.isDirty=false},redraw:function(){var a=this.chart,b=this.group;if(b){a.inverted&&b.attr({width:a.plotWidth,height:a.plotHeight});b.animate({translateX:a.plotLeft,translateY:a.plotTop})}this.translate();this.setTooltipPoints(true); -this.render()},setState:function(a){var b=this.options,c=this.graph,d=b.states;b=b.lineWidth;a=a||db;if(this.state!=a){this.state=a;if(!(d[a]&&d[a].enabled===false)){if(a)b=d[a].lineWidth||b+1;if(c&&!c.dashstyle)c.attr({"stroke-width":b},a?0:500)}}},setVisible:function(a,b){var c=this.chart,d=this.legendItem,e=this.group,f=this.tracker,g=this.dataLabelsGroup,i,k=this.data,j=c.options.chart.ignoreHiddenSeries;i=this.visible;i=(this.visible=a=a===Ra?!i:a)?"show":"hide";e&&e[i]();if(f)f[i]();else for(e= -k.length;e--;){f=k[e];f.tracker&&f.tracker[i]()}g&&g[i]();d&&c.legend.colorizeItem(this,a);this.isDirty=true;this.options.stacking&&t(c.series,function(n){if(n.options.stacking&&n.visible)n.isDirty=true});if(j)c.isDirtyBox=true;b!==false&&c.redraw();La(this,i)},show:function(){this.setVisible(true)},hide:function(){this.setVisible(false)},select:function(a){this.selected=a=a===Ra?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;La(this,a?"select":"unselect")},drawTracker:function(){var a= -this,b=a.options,c=[].concat(a.graphPath),d=c.length,e=a.chart,f=e.options.tooltip.snap,g=a.tracker,i=b.cursor;i=i&&{cursor:i};var k=a.singlePoints,j;if(d)for(j=d+1;j--;){c[j]==Za&&c.splice(j+1,0,c[j+1]-f,c[j+2],Da);if(j&&c[j]==Za||j==d)c.splice(j,0,Da,c[j-2]+f,c[j-1])}for(j=0;j -a&&k>e){k=Ca(a,e);n=2*e-k}else if(kg&&n>e){n=Ca(g,e);k=2*e-n}else if(nv?X-v:ka-(da<=ka?v:0)}Ya=R-3}qa(I,{barX:U,barY:R,barW:W,barH:Ha});I.shapeType="rect";I.shapeArgs={x:U,y:R,width:W,height:Ha,r:k.borderRadius}; -I.trackerArgs=J(Ya)&&ya(I.shapeArgs,{height:Ca(6,Ha+3),y:Ya})})},getSymbol:function(){},drawGraph:function(){},drawPoints:function(){var a=this,b=a.options,c=a.chart.renderer,d,e;t(a.data,function(f){var g=f.plotY;if(g!==Ra&&!isNaN(g)){d=f.graphic;e=f.shapeArgs;if(d){Sc(d);d.animate(e)}else f.graphic=c[f.shapeType](e).attr(f.pointAttr[f.selected?"select":db]).add(a.group).shadow(b.shadow)}})},drawTracker:function(){var a=this,b=a.chart,c=b.renderer,d,e,f=+new Date,g=a.options.cursor,i=g&&{cursor:g}, -k;t(a.data,function(j){e=j.tracker;d=j.trackerArgs||j.shapeArgs;if(j.y!==null)if(e)e.attr(d);else j.tracker=c[j.shapeType](d).attr({isTracker:f,fill:Vd,visibility:a.visible?Bb:vb,zIndex:1}).on(Ib?"touchstart":"mouseover",function(n){k=n.relatedTarget||n.fromElement;b.hoverSeries!=a&&za(k,"isTracker")!=f&&a.onMouseOver();j.onMouseOver()}).on("mouseout",function(n){if(!a.options.stickyTracking){k=n.relatedTarget||n.toElement;za(k,"isTracker")!=f&&a.onMouseOut()}}).css(i).add(b.trackerGroup)})},animate:function(a){var b= -this,c=b.data;if(!a){t(c,function(d){var e=d.graphic;if(e){e.attr({height:0,y:b.yAxis.translate(0,0,1)});e.animate({height:d.barH,y:d.barY},b.options.animation)}});b.animate=null}},remove:function(){var a=this,b=a.chart;b.hasRendered&&t(b.series,function(c){if(c.type==a.type)c.isDirty=true});mb.prototype.remove.apply(a,arguments)}});ub.column=ad;Ma=xb(ad,{type:"bar",init:function(a){a.inverted=this.inverted=true;ad.prototype.init.apply(this,arguments)}});ub.bar=Ma;Ma=xb(mb,{type:"scatter",translate:function(){var a= -this;mb.prototype.translate.apply(a);t(a.data,function(b){b.shapeType="circle";b.shapeArgs={x:b.plotX,y:b.plotY,r:a.chart.options.tooltip.snap}})},drawTracker:function(){var a=this,b=a.options.cursor,c=b&&{cursor:b},d;t(a.data,function(e){(d=e.graphic)&&d.attr({isTracker:true}).on("mouseover",function(){a.onMouseOver();e.onMouseOver()}).on("mouseout",function(){a.options.stickyTracking||a.onMouseOut()}).css(c)})},cleanData:function(){}});ub.scatter=Ma;Ma=xb(zc,{init:function(){zc.prototype.init.apply(this, -arguments);var a=this,b;qa(a,{visible:a.visible!==false,name:y(a.name,"Slice")});b=function(){a.slice()};Qa(a,"select",b);Qa(a,"unselect",b);return a},setVisible:function(a){var b=this.series.chart,c=this.tracker,d=this.dataLabel,e=this.connector,f;f=(this.visible=a=a===Ra?!this.visible:a)?"show":"hide";this.group[f]();c&&c[f]();d&&d[f]();e&&e[f]();this.legendItem&&b.legend.colorizeItem(this,a)},slice:function(a,b,c){var d=this.series.chart,e=this.slicedTranslation;bc(c,d);y(b,true);a=this.sliced= -J(a)?a:!this.sliced;this.group.animate({translateX:a?e[0]:d.plotLeft,translateY:a?e[1]:d.plotTop})}});Ma=xb(mb,{type:"pie",isCartesian:false,pointClass:Ma,pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:function(){this.initialColor=Jb},animate:function(){var a=this;t(a.data,function(b){var c=b.graphic;b=b.shapeArgs;var d=-Tb/2;if(c){c.attr({r:0,start:d,end:d});c.animate({r:b.r,start:b.start,end:b.end},a.options.animation)}});a.animate=null},translate:function(){var a= -0,b=-0.25,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f=c.center,g=this.chart,i=g.plotWidth,k=g.plotHeight,j,n,z,F=this.data,W=2*Tb,ca,ka=pb(i,k),v,I,da,X=c.dataLabels.distance;f.push(c.size,c.innerSize||0);f=jc(f,function(U,R){return(v=/%$/.test(U))?[i,k,ka,ka][R]*oa(U)/100:U});this.getX=function(U,R){z=Ua.asin((U-f[1])/(f[2]/2+X));return f[0]+(R?-1:1)*kb(z)*(f[2]/2+X)};this.center=f;t(F,function(U){a+=U.y});t(F,function(U){ca=a?U.y/a:0;j=fa(b*W*1E3)/1E3;b+=ca;n=fa(b*W*1E3)/1E3;U.shapeType= -"arc";U.shapeArgs={x:f[0],y:f[1],r:f[2]/2,innerR:f[3]/2,start:j,end:n};z=(n+j)/2;U.slicedTranslation=jc([kb(z)*d+g.plotLeft,zb(z)*d+g.plotTop],fa);I=kb(z)*f[2]/2;da=zb(z)*f[2]/2;U.tooltipPos=[f[0]+I*0.7,f[1]+da*0.7];U.labelPos=[f[0]+I+kb(z)*X,f[1]+da+zb(z)*X,f[0]+I+kb(z)*e,f[1]+da+zb(z)*e,f[0]+I,f[1]+da,X<0?"center":z0,j,n,z=this.center[1],F=[[],[],[],[]],W,ca,ka,v,I,da,X,U=4,R;mb.prototype.drawDataLabels.apply(this);t(a,function(Ha){var Ya=Ha.labelPos[7];F[Ya<0?0:YaYa.y};U--;){a=0;b=[].concat(F[U]);b.sort(X);for(R=b.length;R--;)b[R].rank=R;for(v=0;v<2;v++){n=(da=U%3)?9999:-9999;I=da?-1:1;for(R=0;Rn-j){ca=n+I*j;W=this.getX(ca,U>1);if(!da&&ca+j>z||da&&ca-j
    /g, '
    ') - .split(/]?>/g), - childNodes = textNode.childNodes, - styleRegex = /style="([^"]+)"/, - hrefRegex = /href="([^"]+)"/, - parentX = attr(textNode, 'x'), - textStyles = wrapper.styles, - reverse = isFirefox && textStyles && textStyles.HcDirection == 'rtl' && !this.forExport, // issue #38 - arr, - width = textStyles && pInt(textStyles.width), - textLineHeight = textStyles && textStyles.lineHeight, - lastLine, - i = childNodes.length; - - // remove old text - while (i--) { - textNode.removeChild(childNodes[i]); - } - - if (width && !wrapper.added) { - this.box.appendChild(textNode); // attach it to the DOM to read offset width - } - - each(lines, function(line, lineNo) { - var spans, spanNo = 0, lineHeight; - - line = line.replace(//g, '|||'); - spans = line.split('|||'); - - each(spans, function (span) { - if (span !== '' || spans.length == 1) { - var attributes = {}, - tspan = doc.createElementNS(SVG_NS, 'tspan'); - if (styleRegex.test(span)) { - attr( - tspan, - 'style', - span.match(styleRegex)[1].replace(/(;| |^)color([ :])/, '$1fill$2') - ); - } - if (hrefRegex.test(span)) { - attr(tspan, 'onclick', 'location.href=\"'+ span.match(hrefRegex)[1] +'\"'); - css(tspan, { cursor: 'pointer' }); - } - - span = span.replace(/<(.|\n)*?>/g, '') || ' '; - - // issue #38 workaround. - if (reverse) { - arr = []; - i = span.length; - while (i--) { - arr.push(span.charAt(i)) - } - span = arr.join(''); - } - - // add the text node - tspan.appendChild(doc.createTextNode(span)); - - if (!spanNo) { // first span in a line, align it to the left - attributes.x = parentX; - } else { - // Firefox ignores spaces at the front or end of the tspan - attributes.dx = 3; // space - } - - // first span on subsequent line, add the line height - if (!spanNo) { - if (lineNo) { - // Webkit and opera sometimes return 'normal' as the line height. In that - // case, webkit uses offsetHeight, while Opera falls back to 18 - lineHeight = pInt(window.getComputedStyle(lastLine, null).getPropertyValue('line-height')); - if (isNaN(lineHeight)) { - lineHeight = textLineHeight || lastLine.offsetHeight || 18; - } - attr(tspan, 'dy', lineHeight); - } - lastLine = tspan; // record for use in next line - } - - // add attributes - attr(tspan, attributes); - - // append it - textNode.appendChild(tspan); - - spanNo++; - - // check width and apply soft breaks - if (width) { - var words = span.replace(/-/g, '- ').split(' '), - tooLong, - actualWidth, - rest = []; - - while (words.length || rest.length) { - actualWidth = textNode.getBBox().width; - tooLong = actualWidth > width; - if (!tooLong || words.length == 1) { // new line needed - words = rest; - rest = []; - if (words.length) { - tspan = doc.createElementNS(SVG_NS, 'tspan'); - attr(tspan, { - x: parentX, - dy: textLineHeight || 16 - }); - textNode.appendChild(tspan); - - if (actualWidth > width) { // a single word is pressing it out - width = actualWidth; - } - } - } else { // append to existing line tspan - tspan.removeChild(tspan.firstChild); - rest.unshift(words.pop()); - } - - tspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-'))); - } - - } - } - }); - }); - - - }, - - /** - * Make a straight line crisper by not spilling out to neighbour pixels - * @param {Array} points - * @param {Number} width - */ - crispLine: function(points, width) { - // points format: [M, 0, 0, L, 100, 0] - // normalize to a crisp line - if (points[1] == points[4]) { - points[1] = points[4] = mathRound(points[1]) + (width % 2 / 2); - } - if (points[2] == points[5]) { - points[2] = points[5] = mathRound(points[2]) + (width % 2 / 2); - } - return points; - }, - - - /** - * Draw a path - * @param {Array} path An SVG path in array form - */ - path: function (path) { - return this.createElement('path').attr({ - d: path, - fill: NONE - }); - }, - - /** - * Draw and return an SVG circle - * @param {Number} x The x position - * @param {Number} y The y position - * @param {Number} r The radius - */ - circle: function (x, y, r) { - var attr = isObject(x) ? - x : - { - x: x, - y: y, - r: r - }; - - return this.createElement('circle').attr(attr); - }, - - /** - * Draw and return an arc - * @param {Number} x X position - * @param {Number} y Y position - * @param {Number} r Radius - * @param {Number} innerR Inner radius like used in donut charts - * @param {Number} start Starting angle - * @param {Number} end Ending angle - */ - arc: function (x, y, r, innerR, start, end) { - // arcs are defined as symbols for the ability to set - // attributes in attr and animate - - if (isObject(x)) { - y = x.y; - r = x.r; - innerR = x.innerR; - start = x.start; - end = x.end; - x = x.x; - } - - return this.symbol('arc', x || 0, y || 0, r || 0, { - innerR: innerR || 0, - start: start || 0, - end: end || 0 - }); - }, - - /** - * Draw and return a rectangle - * @param {Number} x Left position - * @param {Number} y Top position - * @param {Number} width - * @param {Number} height - * @param {Number} r Border corner radius - * @param {Number} strokeWidth A stroke width can be supplied to allow crisp drawing - */ - rect: function (x, y, width, height, r, strokeWidth) { - if (isObject(x)) { - y = x.y; - width = x.width; - height = x.height; - r = x.r; - x = x.x; - } - var wrapper = this.createElement('rect').attr({ - rx: r, - ry: r, - fill: NONE - }); - - return wrapper.attr(wrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0))); - }, - - /** - * Resize the box and re-align all aligned elements - * @param {Object} width - * @param {Object} height - * @param {Boolean} animate - * - */ - setSize: function(width, height, animate) { - var renderer = this, - alignedObjects = renderer.alignedObjects, - i = alignedObjects.length; - - renderer.width = width; - renderer.height = height; - - renderer.boxWrapper[pick(animate, true) ? 'animate' : 'attr']({ - width: width, - height: height - }); - - while (i--) { - alignedObjects[i].align(); - } - }, - - /** - * Create a group - * @param {String} name The group will be given a class name of 'highcharts-{name}'. - * This can be used for styling and scripting. - */ - g: function(name) { - return this.createElement('g').attr( - defined(name) && { 'class': PREFIX + name } - ); - }, - - /** - * Display an image - * @param {String} src - * @param {Number} x - * @param {Number} y - * @param {Number} width - * @param {Number} height - */ - image: function(src, x, y, width, height) { - var attribs = { - preserveAspectRatio: NONE - }, - elemWrapper; - - // optional properties - if (arguments.length > 1) { - extend(attribs, { - x: x, - y: y, - width: width, - height: height - }); - } - - elemWrapper = this.createElement('image').attr(attribs); - - // set the href in the xlink namespace - elemWrapper.element.setAttributeNS('http://www.w3.org/1999/xlink', - 'href', src); - - return elemWrapper; - }, - - /** - * Draw a symbol out of pre-defined shape paths from the namespace 'symbol' object. - * - * @param {Object} symbol - * @param {Object} x - * @param {Object} y - * @param {Object} radius - * @param {Object} options - */ - symbol: function(symbol, x, y, radius, options) { - - var obj, - - // get the symbol definition function - symbolFn = this.symbols[symbol], - - // check if there's a path defined for this symbol - path = symbolFn && symbolFn( - x, - y, - radius, - options - ), - - imageRegex = /^url\((.*?)\)$/, - imageSrc; - - if (path) { - - obj = this.path(path); - // expando properties for use in animate and attr - extend(obj, { - symbolName: symbol, - x: x, - y: y, - r: radius - }); - if (options) { - extend(obj, options); - } - - - // image symbols - } else if (imageRegex.test(symbol)) { - - imageSrc = symbol.match(imageRegex)[1]; - - // create the image synchronously, add attribs async - obj = this.image(imageSrc) - .attr({ - x: x, - y: y - }); - - // create a dummy JavaScript image to get the width and height - createElement('img', { - onload: function() { - var img = this, - size = symbolSizes[img.src] || [img.width, img.height]; - obj.attr({ - width: size[0], - height: size[1] - }).translate( - -mathRound(size[0] / 2), - -mathRound(size[1] / 2) - ); - }, - src: imageSrc - }); - - // default circles - } else { - obj = this.circle(x, y, radius); - } - - return obj; - }, - - /** - * An extendable collection of functions for defining symbol paths. - */ - symbols: { - 'square': function (x, y, radius) { - var len = 0.707 * radius; - return [ - M, x-len, y-len, - L, x+len, y-len, - x+len, y+len, - x-len, y+len, - 'Z' - ]; - }, - - 'triangle': function (x, y, radius) { - return [ - M, x, y-1.33 * radius, - L, x+radius, y + 0.67 * radius, - x-radius, y + 0.67 * radius, - 'Z' - ]; - }, - - 'triangle-down': function (x, y, radius) { - return [ - M, x, y + 1.33 * radius, - L, x-radius, y-0.67 * radius, - x+radius, y-0.67 * radius, - 'Z' - ]; - }, - 'diamond': function (x, y, radius) { - return [ - M, x, y-radius, - L, x+radius, y, - x, y+radius, - x-radius, y, - 'Z' - ]; - }, - 'arc': function (x, y, radius, options) { - var start = options.start, - end = options.end - 0.000001, // to prevent cos and sin of start and end from becoming equal on 360 arcs - innerRadius = options.innerR, - cosStart = mathCos(start), - sinStart = mathSin(start), - cosEnd = mathCos(end), - sinEnd = mathSin(end), - longArc = options.end - start < mathPI ? 0 : 1; - - return [ - M, - x + radius * cosStart, - y + radius * sinStart, - 'A', // arcTo - radius, // x radius - radius, // y radius - 0, // slanting - longArc, // long or short arc - 1, // clockwise - x + radius * cosEnd, - y + radius * sinEnd, - L, - x + innerRadius * cosEnd, - y + innerRadius * sinEnd, - 'A', // arcTo - innerRadius, // x radius - innerRadius, // y radius - 0, // slanting - longArc, // long or short arc - 0, // clockwise - x + innerRadius * cosStart, - y + innerRadius * sinStart, - - 'Z' // close - ]; - } - }, - - /** - * Define a clipping rectangle - * @param {String} id - * @param {Number} x - * @param {Number} y - * @param {Number} width - * @param {Number} height - */ - clipRect: function (x, y, width, height) { - var wrapper, - id = PREFIX + idCounter++, - - clipPath = this.createElement('clipPath').attr({ - id: id - }).add(this.defs); - - wrapper = this.rect(x, y, width, height, 0).add(clipPath); - wrapper.id = id; - - return wrapper; - }, - - - /** - * Take a color and return it if it's a string, make it a gradient if it's a - * gradient configuration object - * - * @param {Object} color The color or config object - */ - color: function(color, elem, prop) { - var colorObject, - regexRgba = /^rgba/; - if (color && color.linearGradient) { - var renderer = this, - strLinearGradient = 'linearGradient', - linearGradient = color[strLinearGradient], - id = PREFIX + idCounter++, - gradientObject, - stopColor, - stopOpacity; - gradientObject = renderer.createElement(strLinearGradient).attr({ - id: id, - gradientUnits: 'userSpaceOnUse', - x1: linearGradient[0], - y1: linearGradient[1], - x2: linearGradient[2], - y2: linearGradient[3] - }).add(renderer.defs); - - each(color.stops, function(stop) { - if (regexRgba.test(stop[1])) { - colorObject = Color(stop[1]); - stopColor = colorObject.get('rgb'); - stopOpacity = colorObject.get('a'); - } else { - stopColor = stop[1]; - stopOpacity = 1; - } - renderer.createElement('stop').attr({ - offset: stop[0], - 'stop-color': stopColor, - 'stop-opacity': stopOpacity - }).add(gradientObject); - }); - - return 'url('+ this.url +'#'+ id +')'; - - // Webkit and Batik can't show rgba. - } else if (regexRgba.test(color)) { - colorObject = Color(color); - attr(elem, prop +'-opacity', colorObject.get('a')); - - return colorObject.get('rgb'); - - - } else { - return color; - } - - }, - - - /** - * Add text to the SVG object - * @param {String} str - * @param {Number} x Left position - * @param {Number} y Top position - */ - text: function(str, x, y) { - - // declare variables - var defaultChartStyle = defaultOptions.chart.style, - wrapper; - - x = mathRound(pick(x, 0)); - y = mathRound(pick(y, 0)); - - wrapper = this.createElement('text') - .attr({ - x: x, - y: y, - text: str - }) - .css({ - 'font-family': defaultChartStyle.fontFamily, - 'font-size': defaultChartStyle.fontSize - }); - - wrapper.x = x; - wrapper.y = y; - return wrapper; - } -}; // end SVGRenderer - - - - -/* **************************************************************************** - * * - * START OF INTERNET EXPLORER <= 8 SPECIFIC CODE * - * * - * For applications and websites that don't need IE support, like platform * - * targeted mobile apps and web apps, this code can be removed. * - * * - *****************************************************************************/ -var VMLRenderer; -if (!hasSVG) { - -/** - * The VML element wrapper. - */ -var VMLElement = extendClass( SVGElement, { - - /** - * Initialize a new VML element wrapper. It builds the markup as a string - * to minimize DOM traffic. - * @param {Object} renderer - * @param {Object} nodeName - */ - init: function(renderer, nodeName) { - var markup = ['<', nodeName, ' filled="f" stroked="f"'], - style = ['position: ', ABSOLUTE, ';']; - - // divs and shapes need size - if (nodeName == 'shape' || nodeName == DIV) { - style.push('left:0;top:0;width:10px;height:10px;'); - } - if (docMode8) { - style.push('visibility: ', nodeName == DIV ? HIDDEN : VISIBLE); - } - - markup.push(' style="', style.join(''), '"/>'); - - // create element with default attributes and style - if (nodeName) { - markup = nodeName == DIV || nodeName == 'span' || nodeName == 'img' ? - markup.join('') - : renderer.prepVML(markup); - this.element = createElement(markup); - } - - this.renderer = renderer; - }, - - /** - * Add the node to the given parent - * @param {Object} parent - */ - add: function(parent) { - var wrapper = this, - renderer = wrapper.renderer, - element = wrapper.element, - box = renderer.box, - inverted = parent && parent.inverted, - - // get the parent node - parentNode = parent ? - parent.element || parent : - box; - - - // if the parent group is inverted, apply inversion on all children - if (inverted) { // only on groups - renderer.invertChild(element, parentNode); - } - - // issue #140 workaround - related to #61 and #74 - if (docMode8 && parentNode.gVis == HIDDEN) { - css(element, { visibility: HIDDEN }); - } - - // append it - parentNode.appendChild(element); - - // align text after adding to be able to read offset - wrapper.added = true; - if (wrapper.alignOnAdd) { - wrapper.updateTransform(); - } - - return wrapper; - }, - - /** - * Get or set attributes - */ - attr: function(hash, val) { - var key, - value, - i, - element = this.element || {}, - elemStyle = element.style, - nodeName = element.nodeName, - renderer = this.renderer, - symbolName = this.symbolName, - childNodes, - hasSetSymbolSize, - shadows = this.shadows, - skipAttr, - ret = this; - - // single key-value pair - if (isString(hash) && defined(val)) { - key = hash; - hash = {}; - hash[key] = val; - } - - // used as a getter, val is undefined - if (isString(hash)) { - key = hash; - if (key == 'strokeWidth' || key == 'stroke-width') { - ret = this.strokeweight; - } else { - ret = this[key]; - } - - // setter - } else { - for (key in hash) { - value = hash[key]; - skipAttr = false; - - // prepare paths - // symbols - if (symbolName && /^(x|y|r|start|end|width|height|innerR)/.test(key)) { - // if one of the symbol size affecting parameters are changed, - // check all the others only once for each call to an element's - // .attr() method - if (!hasSetSymbolSize) { - - this.symbolAttr(hash); - - hasSetSymbolSize = true; - } - - skipAttr = true; - - } else if (key == 'd') { - value = value || []; - this.d = value.join(' '); // used in getter for animation - - // convert paths - i = value.length; - var convertedPath = []; - while (i--) { - - // Multiply by 10 to allow subpixel precision. - // Substracting half a pixel seems to make the coordinates - // align with SVG, but this hasn't been tested thoroughly - if (isNumber(value[i])) { - convertedPath[i] = mathRound(value[i] * 10) - 5; - } - // close the path - else if (value[i] == 'Z') { - convertedPath[i] = 'x'; - } - else { - convertedPath[i] = value[i]; - } - - } - value = convertedPath.join(' ') || 'x'; - element.path = value; - - // update shadows - if (shadows) { - i = shadows.length; - while (i--) { - shadows[i].path = value; - } - } - skipAttr = true; - - // directly mapped to css - } else if (key == 'zIndex' || key == 'visibility') { - - // issue 61 workaround - if (docMode8 && key == 'visibility' && nodeName == 'DIV') { - element.gVis = value; - childNodes = element.childNodes; - i = childNodes.length; - while (i--) { - css(childNodes[i], { visibility: value }); - } - if (value == VISIBLE) { // issue 74 - value = null; - } - } - - if (value) { - elemStyle[key] = value; - } - - - - skipAttr = true; - - // width and height - } else if (/^(width|height)$/.test(key)) { - - - // clipping rectangle special - if (this.updateClipping) { - this[key] = value; - this.updateClipping(); - - } else { - // normal - elemStyle[key] = value; - } - - skipAttr = true; - - // x and y - } else if (/^(x|y)$/.test(key)) { - - this[key] = value; // used in getter - - if (element.tagName == 'SPAN') { - this.updateTransform(); - - } else { - elemStyle[{ x: 'left', y: 'top' }[key]] = value; - } - - // class name - } else if (key == 'class') { - // IE8 Standards mode has problems retrieving the className - element.className = value; - - // stroke - } else if (key == 'stroke') { - - value = renderer.color(value, element, key); - - key = 'strokecolor'; - - // stroke width - } else if (key == 'stroke-width' || key == 'strokeWidth') { - element.stroked = value ? true : false; - key = 'strokeweight'; - this[key] = value; // used in getter, issue #113 - if (isNumber(value)) { - value += PX; - } - - // dashStyle - } else if (key == 'dashstyle') { - var strokeElem = element.getElementsByTagName('stroke')[0] || - createElement(renderer.prepVML(['']), null, null, element); - strokeElem[key] = value || 'solid'; - this.dashstyle = value; /* because changing stroke-width will change the dash length - and cause an epileptic effect */ - skipAttr = true; - - // fill - } else if (key == 'fill') { - - if (nodeName == 'SPAN') { // text color - elemStyle.color = value; - } else { - element.filled = value != NONE ? true : false; - - value = renderer.color(value, element, key); - - key = 'fillcolor'; - } - - // translation for animation - } else if (key == 'translateX' || key == 'translateY' || key == 'rotation' || key == 'align') { - if (key == 'align') { - key = 'textAlign'; - } - this[key] = value; - this.updateTransform(); - - skipAttr = true; - } - - // text for rotated and non-rotated elements - else if (key == 'text') { - element.innerHTML = value; - skipAttr = true; - } - - - // let the shadow follow the main element - if (shadows && key == 'visibility') { - i = shadows.length; - while (i--) { - shadows[i].style[key] = value; - } - } - - - - if (!skipAttr) { - if (docMode8) { // IE8 setAttribute bug - element[key] = value; - } else { - attr(element, key, value); - } - } - } - } - return ret; - }, - - /** - * Set the element's clipping to a predefined rectangle - * - * @param {String} id The id of the clip rectangle - */ - clip: function(clipRect) { - var wrapper = this, - clipMembers = clipRect.members; - - clipMembers.push(wrapper); - wrapper.destroyClip = function() { - erase(clipMembers, wrapper); - }; - return wrapper.css(clipRect.getCSS(wrapper.inverted)); - }, - - /** - * Set styles for the element - * @param {Object} styles - */ - css: function(styles) { - var wrapper = this, - element = wrapper.element, - textWidth = styles && element.tagName == 'SPAN' && styles.width; - - /*if (textWidth) { - extend(styles, { - display: 'block', - whiteSpace: 'normal' - }); - }*/ - if (textWidth) { - delete styles.width; - wrapper.textWidth = textWidth; - wrapper.updateTransform(); - } - - wrapper.styles = extend(wrapper.styles, styles); - css(wrapper.element, styles); - - - - return wrapper; - }, - - /** - * Extend element.destroy by removing it from the clip members array - */ - destroy: function() { - var wrapper = this; - - if (wrapper.destroyClip) { - wrapper.destroyClip(); - } - - SVGElement.prototype.destroy.apply(wrapper); - }, - - /** - * Remove all child nodes of a group, except the v:group element - */ - empty: function() { - var element = this.element, - childNodes = element.childNodes, - i = childNodes.length, - node; - - while (i--) { - node = childNodes[i]; - node.parentNode.removeChild(node); - } - }, - - /** - * VML override for calculating the bounding box based on offsets - * - * @return {Object} A hash containing values for x, y, width and height - */ - - getBBox: function() { - var element = this.element; - - // faking getBBox in exported SVG in legacy IE - if (element.nodeName == 'text') { - element.style.position = ABSOLUTE; - } - - return { - x: element.offsetLeft, - y: element.offsetTop, - width: element.offsetWidth, - height: element.offsetHeight - }; - - }, - - /** - * Add an event listener. VML override for normalizing event parameters. - * @param {String} eventType - * @param {Function} handler - */ - on: function(eventType, handler) { - // simplest possible event model for internal use - this.element['on'+ eventType] = function() { - var evt = win.event; - evt.target = evt.srcElement; - handler(evt); - }; - return this; - }, - - - /** - * VML override private method to update elements based on internal - * properties based on SVG transform - */ - updateTransform: function(hash) { - // aligning non added elements is expensive - if (!this.added) { - this.alignOnAdd = true; - return; - } - - var wrapper = this, - elem = wrapper.element, - translateX = wrapper.translateX || 0, - translateY = wrapper.translateY || 0, - x = wrapper.x || 0, - y = wrapper.y || 0, - align = wrapper.textAlign || 'left', - alignCorrection = { left: 0, center: 0.5, right: 1 }[align], - nonLeft = align && align != 'left'; - - // apply translate - if (translateX || translateY) { - wrapper.css({ - marginLeft: translateX, - marginTop: translateY - }); - } - - // apply inversion - if (wrapper.inverted) { // wrapper is a group - each(elem.childNodes, function(child) { - wrapper.renderer.invertChild(child, elem); - }); - } - - if (elem.tagName == 'SPAN') { - - var width, height, - rotation = wrapper.rotation, - lineHeight, - radians = 0, - costheta = 1, - sintheta = 0, - quad, - textWidth = pInt(wrapper.textWidth), - xCorr = wrapper.xCorr || 0, - yCorr = wrapper.yCorr || 0, - currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth].join(','); - - if (currentTextTransform != wrapper.cTT) { // do the calculations and DOM access only if properties changed - - if (defined(rotation)) { - radians = rotation * deg2rad; // deg to rad - costheta = mathCos(radians); - sintheta = mathSin(radians); - - // Adjust for alignment and rotation. - // Test case: http://highcharts.com/tests/?file=text-rotation - css(elem, { - filter: rotation ? ['progid:DXImageTransform.Microsoft.Matrix(M11=', costheta, - ', M12=', -sintheta, ', M21=', sintheta, ', M22=', costheta, - ', sizingMethod=\'auto expand\')'].join('') : NONE - }); - } - - width = elem.offsetWidth; - height = elem.offsetHeight; - - // update textWidth - if (width > textWidth) { - css(elem, { - width: textWidth +PX, - display: 'block', - whiteSpace: 'normal' - }); - width = textWidth; - } - - // correct x and y - lineHeight = mathRound(pInt(elem.style.fontSize || 12) * 1.2); - xCorr = costheta < 0 && -width; - yCorr = sintheta < 0 && -height; - - // correct for lineHeight and corners spilling out after rotation - quad = costheta * sintheta < 0; - xCorr += sintheta * lineHeight * (quad ? 1 - alignCorrection : alignCorrection); - yCorr -= costheta * lineHeight * (rotation ? (quad ? alignCorrection : 1 - alignCorrection) : 1); - - // correct for the length/height of the text - if (nonLeft) { - xCorr -= width * alignCorrection * (costheta < 0 ? -1 : 1); - if (rotation) { - yCorr -= height * alignCorrection * (sintheta < 0 ? -1 : 1); - } - css(elem, { - textAlign: align - }); - } - - // record correction - wrapper.xCorr = xCorr; - wrapper.yCorr = yCorr; - } - - // apply position with correction - css(elem, { - left: x + xCorr, - top: y + yCorr - }); - - // record current text transform - wrapper.cTT = currentTextTransform; - } - }, - - /** - * Apply a drop shadow by copying elements and giving them different strokes - * @param {Boolean} apply - */ - shadow: function(apply) { - var shadows = [], - i, - element = this.element, - renderer = this.renderer, - shadow, - elemStyle = element.style, - markup, - path = element.path; - - // the path is some mysterious string-like object that can be cast to a string - if (''+ element.path === '') { - path = 'x'; - } - - if (apply) { - for (i = 1; i <= 3; i++) { - markup = ['']; - shadow = createElement(renderer.prepVML(markup), - null, { - left: pInt(elemStyle.left) + 1, - top: pInt(elemStyle.top) + 1 - } - ); - - // apply the opacity - markup = ['']; - createElement(renderer.prepVML(markup), null, null, shadow); - - - // insert it - element.parentNode.insertBefore(shadow, element); - - // record it - shadows.push(shadow); - - } - - this.shadows = shadows; - } - return this; - - } -}); - -/** - * The VML renderer - */ -VMLRenderer = function() { - this.init.apply(this, arguments); -}; -VMLRenderer.prototype = merge( SVGRenderer.prototype, { // inherit SVGRenderer - - isIE8: userAgent.indexOf('MSIE 8.0') > -1, - - - /** - * Initialize the VMLRenderer - * @param {Object} container - * @param {Number} width - * @param {Number} height - */ - init: function(container, width, height) { - var renderer = this, - boxWrapper; - - renderer.Element = VMLElement; - renderer.alignedObjects = []; - - boxWrapper = renderer.createElement(DIV); - container.appendChild(boxWrapper.element); - - - // generate the containing box - renderer.box = boxWrapper.element; - renderer.boxWrapper = boxWrapper; - - - renderer.setSize(width, height, false); - - // The only way to make IE6 and IE7 print is to use a global namespace. However, - // with IE8 the only way to make the dynamic shapes visible in screen and print mode - // seems to be to add the xmlns attribute and the behaviour style inline. - if (!doc.namespaces.hcv) { - - doc.namespaces.add('hcv', 'urn:schemas-microsoft-com:vml'); - - // setup default css - doc.createStyleSheet().cssText = - 'hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke'+ - '{ behavior:url(#default#VML); display: inline-block; } '; - - } - }, - - /** - * Define a clipping rectangle. In VML it is accomplished by storing the values - * for setting the CSS style to all associated members. - * - * @param {Number} x - * @param {Number} y - * @param {Number} width - * @param {Number} height - */ - clipRect: function (x, y, width, height) { - - // create a dummy element - var clipRect = this.createElement(); - - // mimic a rectangle with its style object for automatic updating in attr - return extend(clipRect, { - members: [], - left: x, - top: y, - width: width, - height: height, - getCSS: function(inverted) { - var rect = this,//clipRect.element.style, - top = rect.top, - left = rect.left, - right = left + rect.width, - bottom = top + rect.height, - ret = { - clip: 'rect('+ - mathRound(inverted ? left : top) + 'px,'+ - mathRound(inverted ? bottom : right) + 'px,'+ - mathRound(inverted ? right : bottom) + 'px,'+ - mathRound(inverted ? top : left) +'px)' - }; - - // issue 74 workaround - if (!inverted && docMode8) { - extend(ret, { - width: right +PX, - height: bottom +PX - }); - } - return ret; - }, - - // used in attr and animation to update the clipping of all members - updateClipping: function() { - each(clipRect.members, function(member) { - member.css(clipRect.getCSS(member.inverted)); - }); - } - }); - - }, - - - /** - * Take a color and return it if it's a string, make it a gradient if it's a - * gradient configuration object, and apply opacity. - * - * @param {Object} color The color or config object - */ - color: function(color, elem, prop) { - var colorObject, - regexRgba = /^rgba/, - markup; - - if (color && color.linearGradient) { - - var stopColor, - stopOpacity, - linearGradient = color.linearGradient, - angle, - color1, - opacity1, - color2, - opacity2; - - each(color.stops, function(stop, i) { - if (regexRgba.test(stop[1])) { - colorObject = Color(stop[1]); - stopColor = colorObject.get('rgb'); - stopOpacity = colorObject.get('a'); - } else { - stopColor = stop[1]; - stopOpacity = 1; - } - - if (!i) { // first - color1 = stopColor; - opacity1 = stopOpacity; - } else { - color2 = stopColor; - opacity2 = stopOpacity; - } - }); - - - - // calculate the angle based on the linear vector - angle = 90 - math.atan( - (linearGradient[3] - linearGradient[1]) / // y vector - (linearGradient[2] - linearGradient[0]) // x vector - ) * 180 / mathPI; - - // when colors attribute is used, the meanings of opacity and o:opacity2 - // are reversed. - markup = ['<', prop, ' colors="0% ', color1, ',100% ', color2, '" angle="', angle, - '" opacity="', opacity2, '" o:opacity2="', opacity1, - '" type="gradient" focus="100%" />']; - createElement(this.prepVML(markup), null, null, elem); - - - - // if the color is an rgba color, split it and add a fill node - // to hold the opacity component - } else if (regexRgba.test(color) && elem.tagName != 'IMG') { - - colorObject = Color(color); - - markup = ['<', prop, ' opacity="', colorObject.get('a'), '"/>']; - createElement(this.prepVML(markup), null, null, elem); - - return colorObject.get('rgb'); - - - } else { - return color; - } - - }, - - /** - * Take a VML string and prepare it for either IE8 or IE6/IE7. - * @param {Array} markup A string array of the VML markup to prepare - */ - prepVML: function(markup) { - var vmlStyle = 'display:inline-block;behavior:url(#default#VML);', - isIE8 = this.isIE8; - - markup = markup.join(''); - - if (isIE8) { // add xmlns and style inline - markup = markup.replace('/>', ' xmlns="urn:schemas-microsoft-com:vml" />'); - if (markup.indexOf('style="') == -1) { - markup = markup.replace('/>', ' style="'+ vmlStyle +'" />'); - } else { - markup = markup.replace('style="', 'style="'+ vmlStyle); - } - - } else { // add namespace - markup = markup.replace('<', ' 1) { - obj.css({ - left: x, - top: y, - width: width, - height: height - }); - } - return obj; - }, - - /** - * VML uses a shape for rect to overcome bugs and rotation problems - */ - rect: function(x, y, width, height, r, strokeWidth) { - - if (isObject(x)) { - y = x.y; - width = x.width; - height = x.height; - r = x.r; - x = x.x; - } - var wrapper = this.symbol('rect'); - wrapper.r = r; - - return wrapper.attr(wrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0))); - }, - - /** - * In the VML renderer, each child of an inverted div (group) is inverted - * @param {Object} element - * @param {Object} parentNode - */ - invertChild: function(element, parentNode) { - var parentStyle = parentNode.style; - - css(element, { - flip: 'x', - left: pInt(parentStyle.width) - 10, - top: pInt(parentStyle.height) - 10, - rotation: -90 - }); - }, - - /** - * Symbol definitions that override the parent SVG renderer's symbols - * - */ - symbols: { - // VML specific arc function - arc: function (x, y, radius, options) { - var start = options.start, - end = options.end, - cosStart = mathCos(start), - sinStart = mathSin(start), - cosEnd = mathCos(end), - sinEnd = mathSin(end), - innerRadius = options.innerR, - circleCorrection = 0.07 / radius, - innerCorrection = innerRadius && 0.1 / innerRadius || 0; - - if (end - start === 0) { // no angle, don't show it. - return ['x']; - - //} else if (end - start == 2 * mathPI) { // full circle - } else if (2 * mathPI - end + start < circleCorrection) { // full circle - // empirical correction found by trying out the limits for different radii - cosEnd = - circleCorrection; - } else if (end - start < innerCorrection) { // issue #186, another mysterious VML arc problem - cosEnd = mathCos(start + innerCorrection); - } - - return [ - 'wa', // clockwise arc to - x - radius, // left - y - radius, // top - x + radius, // right - y + radius, // bottom - x + radius * cosStart, // start x - y + radius * sinStart, // start y - x + radius * cosEnd, // end x - y + radius * sinEnd, // end y - - - 'at', // anti clockwise arc to - x - innerRadius, // left - y - innerRadius, // top - x + innerRadius, // right - y + innerRadius, // bottom - x + innerRadius * cosEnd, // start x - y + innerRadius * sinEnd, // start y - x + innerRadius * cosStart, // end x - y + innerRadius * sinStart, // end y - - 'x', // finish path - 'e' // close - ]; - - }, - // Add circle symbol path. This performs significantly faster than v:oval. - circle: function (x, y, r) { - return [ - 'wa', // clockwisearcto - x - r, // left - y - r, // top - x + r, // right - y + r, // bottom - x + r, // start x - y, // start y - x + r, // end x - y, // end y - //'x', // finish path - 'e' // close - ]; - }, - /** - * Add rectangle symbol path which eases rotation and omits arcsize problems - * compared to the built-in VML roundrect shape - * - * @param {Number} left Left position - * @param {Number} top Top position - * @param {Number} r Border radius - * @param {Object} options Width and height - */ - - rect: function (left, top, r, options) { - if (!defined(options)) { - return []; - } - var width = options.width, - height = options.height, - right = left + width, - bottom = top + height; - - r = mathMin(r, width, height); - - return [ - M, - left + r, top, - - L, - right - r, top, - 'wa', - right - 2 * r, top, - right, top + 2 * r, - right - r, top, - right, top + r, - - L, - right, bottom - r, - 'wa', - right - 2 * r, bottom - 2 * r, - right, bottom, - right, bottom - r, - right - r, bottom, - - L, - left + r, bottom, - 'wa', - left, bottom - 2 * r, - left + 2 * r, bottom, - left + r, bottom, - left, bottom - r, - - L, - left, top + r, - 'wa', - left, top, - left + 2 * r, top + 2 * r, - left, top + r, - left + r, top, - - - 'x', - 'e' - ]; - - } - } -}); -} -/* **************************************************************************** - * * - * END OF INTERNET EXPLORER <= 8 SPECIFIC CODE * - * * - *****************************************************************************/ - -/** - * General renderer - */ -var Renderer = hasSVG ? SVGRenderer : VMLRenderer; - - -/** - * The chart class - * @param {Object} options - * @param {Function} callback Function to run when the chart has loaded - */ -function Chart (options, callback) { - - defaultXAxisOptions = merge(defaultXAxisOptions, defaultOptions.xAxis); - defaultYAxisOptions = merge(defaultYAxisOptions, defaultOptions.yAxis); - defaultOptions.xAxis = defaultOptions.yAxis = null; - - // Handle regular options - options = merge(defaultOptions, options); - - // Define chart variables - var optionsChart = options.chart, - optionsMargin = optionsChart.margin, - margin = isObject(optionsMargin) ? - optionsMargin : - [optionsMargin, optionsMargin, optionsMargin, optionsMargin], - optionsMarginTop = pick(optionsChart.marginTop, margin[0]), - optionsMarginRight = pick(optionsChart.marginRight, margin[1]), - optionsMarginBottom = pick(optionsChart.marginBottom, margin[2]), - optionsMarginLeft = pick(optionsChart.marginLeft, margin[3]), - spacingTop = optionsChart.spacingTop, - spacingRight = optionsChart.spacingRight, - spacingBottom = optionsChart.spacingBottom, - spacingLeft = optionsChart.spacingLeft, - spacingBox, - chartTitleOptions, - chartSubtitleOptions, - plotTop, - marginRight, - marginBottom, - plotLeft, - axisOffset, - renderTo, - renderToClone, - container, - containerId, - containerWidth, - containerHeight, - chartWidth, - chartHeight, - oldChartWidth, - oldChartHeight, - chartBackground, - plotBackground, - plotBGImage, - plotBorder, - chart = this, - chartEvents = optionsChart.events, - runChartClick = chartEvents && !!chartEvents.click, - eventType, - isInsidePlot, // function - tooltip, - mouseIsDown, - loadingDiv, - loadingSpan, - loadingShown, - plotHeight, - plotWidth, - tracker, - trackerGroup, - placeTrackerGroup, - legend, - legendWidth, - legendHeight, - chartPosition,// = getPosition(container), - hasCartesianSeries = optionsChart.showAxes, - isResizing = 0, - axes = [], - maxTicks, // handle the greatest amount of ticks on grouped axes - series = [], - inverted, - renderer, - tooltipTick, - tooltipInterval, - hoverX, - drawChartBox, // function - getMargins, // function - resetMargins, // function - setChartSize, // function - resize, - zoom, // function - zoomOut; // function - - - /** - * Create a new axis object - * @param {Object} chart - * @param {Object} options - */ - function Axis (chart, options) { - - // Define variables - var isXAxis = options.isX, - opposite = options.opposite, // needed in setOptions - horiz = inverted ? !isXAxis : isXAxis, - side = horiz ? - (opposite ? 0 /* top */ : 2 /* bottom */) : - (opposite ? 1 /* right*/ : 3 /* left */ ), - stacks = {}; - - - options = merge( - isXAxis ? defaultXAxisOptions : defaultYAxisOptions, - [defaultTopAxisOptions, defaultRightAxisOptions, - defaultBottomAxisOptions, defaultLeftAxisOptions][side], - options - ); - - var axis = this, - isDatetimeAxis = options.type == 'datetime', - offset = options.offset || 0, - xOrY = isXAxis ? 'x' : 'y', - axisLength, - transA, // translation factor - oldTransA, // used for prerendering - transB = horiz ? plotLeft : marginBottom, // translation addend - translate, // fn - getPlotLinePath, // fn - axisGroup, - gridGroup, - axisLine, - dataMin, - dataMax, - associatedSeries, - userSetMin, - userSetMax, - max = null, - min = null, - oldMin, - oldMax, - minPadding = options.minPadding, - maxPadding = options.maxPadding, - isLinked = defined(options.linkedTo), - ignoreMinPadding, // can be set to true by a column or bar series - ignoreMaxPadding, - usePercentage, - events = options.events, - eventType, - plotLinesAndBands = [], - tickInterval, - minorTickInterval, - magnitude, - tickPositions, // array containing predefined positions - ticks = {}, - minorTicks = {}, - alternateBands = {}, - tickAmount, - labelOffset, - axisTitleMargin,// = options.title.margin, - dateTimeLabelFormat, - categories = options.categories, - labelFormatter = options.labels.formatter || // can be overwritten by dynamic format - function() { - var value = this.value, - ret; - - if (dateTimeLabelFormat) { // datetime axis - ret = dateFormat(dateTimeLabelFormat, value); - - } else if (tickInterval % 1000000 === 0) { // use M abbreviation - ret = (value / 1000000) +'M'; - - } else if (tickInterval % 1000 === 0) { // use k abbreviation - ret = (value / 1000) +'k'; - - } else if (!categories && value >= 1000) { // add thousands separators - ret = numberFormat(value, 0); - - } else { // strings (categories) and small numbers - ret = value; - } - return ret; - }, - - staggerLines = horiz && options.labels.staggerLines, - reversed = options.reversed, - tickmarkOffset = (categories && options.tickmarkPlacement == 'between') ? 0.5 : 0; - - /** - * The Tick class - */ - function Tick(pos, minor) { - var tick = this; - tick.pos = pos; - tick.minor = minor; - tick.isNew = true; - - if (!minor) { - tick.addLabel(); - } - } - Tick.prototype = { - /** - * Write the tick label - */ - addLabel: function() { - var pos = this.pos, - labelOptions = options.labels, - str, - withLabel = !((pos == min && !pick(options.showFirstLabel, 1)) || - (pos == max && !pick(options.showLastLabel, 0))), - width = categories && horiz && categories.length && - !labelOptions.step && !labelOptions.staggerLines && - !labelOptions.rotation && - plotWidth / categories.length || - !horiz && plotWidth / 2, - css, - label = this.label; - - - // get the string - str = labelFormatter.call({ - isFirst: pos == tickPositions[0], - isLast: pos == tickPositions[tickPositions.length - 1], - dateTimeLabelFormat: dateTimeLabelFormat, - value: (categories && categories[pos] ? categories[pos] : pos) - }); - - // prepare CSS - css = width && { width: (width - 2 * (labelOptions.padding || 10)) +PX }; - css = extend(css, labelOptions.style); - - // first call - if (label === UNDEFINED) { - this.label = - defined(str) && withLabel && labelOptions.enabled ? - renderer.text( - str, - 0, - 0 - ) - .attr({ - align: labelOptions.align, - rotation: labelOptions.rotation - }) - // without position absolute, IE export sometimes is wrong - .css(css) - .add(axisGroup): - null; - - // update - } else if (label) { - label.attr({ text: str }) - .css(css); - } - }, - /** - * Get the offset height or width of the label - */ - getLabelSize: function() { - var label = this.label; - return label ? - ((this.labelBBox = label.getBBox()))[horiz ? 'height' : 'width'] : - 0; - }, - /** - * Put everything in place - * - * @param index {Number} - * @param old {Boolean} Use old coordinates to prepare an animation into new position - */ - render: function(index, old) { - var tick = this, - major = !tick.minor, - label = tick.label, - pos = tick.pos, - labelOptions = options.labels, - gridLine = tick.gridLine, - gridLineWidth = major ? options.gridLineWidth : options.minorGridLineWidth, - gridLineColor = major ? options.gridLineColor : options.minorGridLineColor, - dashStyle = major ? - options.gridLineDashStyle : - options.minorGridLineDashStyle, - gridLinePath, - mark = tick.mark, - markPath, - tickLength = major ? options.tickLength : options.minorTickLength, - tickWidth = major ? options.tickWidth : (options.minorTickWidth || 0), - tickColor = major ? options.tickColor : options.minorTickColor, - tickPosition = major ? options.tickPosition : options.minorTickPosition, - step = labelOptions.step, - cHeight = old && oldChartHeight || chartHeight, - attribs, - x, - y; - - // get x and y position for ticks and labels - x = horiz ? - translate(pos + tickmarkOffset, null, null, old) + transB : - plotLeft + offset + (opposite ? (old && oldChartWidth || chartWidth) - marginRight - plotLeft : 0); - - y = horiz ? - cHeight - marginBottom + offset - (opposite ? plotHeight : 0) : - cHeight - translate(pos + tickmarkOffset, null, null, old) - transB; - - // create the grid line - if (gridLineWidth) { - gridLinePath = getPlotLinePath(pos + tickmarkOffset, gridLineWidth, old); - - if (gridLine === UNDEFINED) { - attribs = { - stroke: gridLineColor, - 'stroke-width': gridLineWidth - }; - if (dashStyle) { - attribs.dashstyle = dashStyle; - } - tick.gridLine = gridLine = - gridLineWidth ? - renderer.path(gridLinePath) - .attr(attribs).add(gridGroup) : - null; - } - if (gridLine && gridLinePath) { - gridLine.animate({ - d: gridLinePath - }); - } - } - - // create the tick mark - if (tickWidth) { - - // negate the length - if (tickPosition == 'inside') { - tickLength = -tickLength; - } - if (opposite) { - tickLength = -tickLength; - } - - markPath = renderer.crispLine([ - M, - x, - y, - L, - x + (horiz ? 0 : -tickLength), - y + (horiz ? tickLength : 0) - ], tickWidth); - - if (mark) { // updating - mark.animate({ - d: markPath - }); - } else { // first time - tick.mark = renderer.path( - markPath - ).attr({ - stroke: tickColor, - 'stroke-width': tickWidth - }).add(axisGroup); - } - } - - // the label is created on init - now move it into place - if (label) { - x = x + labelOptions.x - (tickmarkOffset && horiz ? - tickmarkOffset * transA * (reversed ? -1 : 1) : 0); - y = y + labelOptions.y - (tickmarkOffset && !horiz ? - tickmarkOffset * transA * (reversed ? 1 : -1) : 0); - - // vertically centered - if (!defined(labelOptions.y)) { - y += parseInt(label.styles.lineHeight) * 0.9 - label.getBBox().height / 2; - } - - - // correct for staggered labels - if (staggerLines) { - y += (index % staggerLines) * 16; - } - // apply step - if (step) { - // show those indices dividable by step - label[index % step ? 'hide' : 'show'](); - } - - label[tick.isNew ? 'attr' : 'animate']({ - x: x, - y: y - }); - - } - - tick.isNew = false; - }, - /** - * Destructor for the tick prototype - */ - destroy: function() { - var tick = this, - n; - for (n in tick) { - if (tick[n] && tick[n].destroy) { - tick[n].destroy(); - } - } - } - }; - - /** - * The object wrapper for plot lines and plot bands - * @param {Object} options - */ - function PlotLineOrBand(options) { - var plotLine = this; - if (options) { - plotLine.options = options; - plotLine.id = options.id; - } - - //plotLine.render() - return plotLine; - } - - PlotLineOrBand.prototype = { - - /** - * Render the plot line or plot band. If it is already existing, - * move it. - */ - render: function () { - var plotLine = this, - options = plotLine.options, - optionsLabel = options.label, - label = plotLine.label, - width = options.width, - to = options.to, - toPath, // bands only - from = options.from, - dashStyle = options.dashStyle, - svgElem = plotLine.svgElem, - path = [], - addEvent, - eventType, - xs, - ys, - x, - y, - color = options.color, - zIndex = options.zIndex, - events = options.events, - attribs; - - // plot line - if (width) { - path = getPlotLinePath(options.value, width); - attribs = { - stroke: color, - 'stroke-width': width - }; - if (dashStyle) { - attribs.dashstyle = dashStyle; - } - } - - // plot band - else if (defined(from) && defined(to)) { - // keep within plot area - from = mathMax(from, min); - to = mathMin(to, max); - - toPath = getPlotLinePath(to); - path = getPlotLinePath(from); - if (path && toPath) { - path.push( - toPath[4], - toPath[5], - toPath[1], - toPath[2] - ); - } else { // outside the axis area - path = null; - } - attribs = { - fill: color - }; - } else { - return; - } - // zIndex - if (defined(zIndex)) { - attribs.zIndex = zIndex; - } - - // common for lines and bands - if (svgElem) { - if (path) { - svgElem.animate({ - d: path - }, null, svgElem.onGetPath); - } else { - svgElem.hide(); - svgElem.onGetPath = function() { - svgElem.show(); - } - } - } else if (path && path.length) { - plotLine.svgElem = svgElem = renderer.path(path) - .attr(attribs).add(); - - // events - if (events) { - addEvent = function(eventType) { - svgElem.on(eventType, function(e) { - events[eventType].apply(plotLine, [e]); - }); - }; - for (eventType in events) { - addEvent(eventType); - } - } - } - - // the plot band/line label - if (optionsLabel && defined(optionsLabel.text) && path && path.length && plotWidth > 0 && plotHeight > 0) { - // apply defaults - optionsLabel = merge({ - align: horiz && toPath && 'center', - x: horiz ? !toPath && 4 : 10, - verticalAlign : !horiz && toPath && 'middle', - y: horiz ? toPath ? 16 : 10 : toPath ? 6 : -4, - rotation: horiz && !toPath && 90 - }, optionsLabel); - - // add the SVG element - if (!label) { - plotLine.label = label = renderer.text( - optionsLabel.text, - 0, - 0 - ) - .attr({ - align: optionsLabel.textAlign || optionsLabel.align, - rotation: optionsLabel.rotation, - zIndex: zIndex - }) - .css(optionsLabel.style) - .add(); - } - - // get the bounding box and align the label - xs = [path[1], path[4], path[6] || path[1]]; - ys = [path[2], path[5], path[7] || path[2]]; - x = mathMin.apply(math, xs); - y = mathMin.apply(math, ys); - - label.align(optionsLabel, false, { - x: x, - y: y, - width: mathMax.apply(math, xs) - x, - height: mathMax.apply(math, ys) - y - }); - label.show(); - - } else if (label) { // move out of sight - label.hide(); - } - - // chainable - return plotLine; - }, - - /** - * Remove the plot line or band - */ - destroy: function() { - var obj = this, - n; - - for (n in obj) { - if (obj[n] && obj[n].destroy) { - obj[n].destroy(); // destroy SVG wrappers - } - delete obj[n]; - } - // remove it from the lookup - erase(plotLinesAndBands, obj); - } - }; - - - /** - * Get the minimum and maximum for the series of each axis - */ - function getSeriesExtremes() { - var posStack = [], - negStack = [], - run; - - // reset dataMin and dataMax in case we're redrawing - dataMin = dataMax = null; - - // get an overview of what series are associated with this axis - associatedSeries = []; - - each(series, function(serie) { - run = false; - - - // match this axis against the series' given or implicated axis - each(['xAxis', 'yAxis'], function(strAxis) { - if ( - // the series is a cartesian type, and... - serie.isCartesian && - // we're in the right x or y dimension, and... - (strAxis == 'xAxis' && isXAxis || strAxis == 'yAxis' && !isXAxis) && ( - // the axis number is given in the options and matches this axis index, or - (serie.options[strAxis] == options.index) || - // the axis index is not given - (serie.options[strAxis] === UNDEFINED && options.index === 0) - ) - ) { - serie[strAxis] = axis; - associatedSeries.push(serie); - - // the series is visible, run the min/max detection - run = true; - } - }); - // ignore hidden series if opted - if (!serie.visible && optionsChart.ignoreHiddenSeries) { - run = false; - } - - if (run) { - - var stacking, - posPointStack, - negPointStack, - stackKey, - negKey; - - if (!isXAxis) { - stacking = serie.options.stacking; - usePercentage = stacking == 'percent'; - - // create a stack for this particular series type - if (stacking) { - stackKey = serie.type + pick(serie.options.stack, ''); - negKey = '-'+ stackKey; - serie.stackKey = stackKey; // used in translate - - posPointStack = posStack[stackKey] || []; // contains the total values for each x - posStack[stackKey] = posPointStack; - - negPointStack = negStack[negKey] || []; - negStack[negKey] = negPointStack; - } - if (usePercentage) { - dataMin = 0; - dataMax = 99; - } - } - if (serie.isCartesian) { // line, column etc. need axes, pie doesn't - each(serie.data, function(point, i) { - var pointX = point.x, - pointY = point.y, - isNegative = pointY < 0, - pointStack = isNegative ? negPointStack : posPointStack, - key = isNegative ? negKey : stackKey, - totalPos, - pointLow; - - // initial values - if (dataMin === null) { - - // start out with the first point - dataMin = dataMax = point[xOrY]; - } - - // x axis - if (isXAxis) { - if (pointX > dataMax) { - dataMax = pointX; - } else if (pointX < dataMin) { - dataMin = pointX; - } - } - - // y axis - else if (defined(pointY)) { - if (stacking) { - pointStack[pointX] = - defined(pointStack[pointX]) ? - pointStack[pointX] + pointY : pointY; - } - totalPos = pointStack ? pointStack[pointX] : pointY; - pointLow = pick(point.low, totalPos); - if (!usePercentage) { - if (totalPos > dataMax) { - dataMax = totalPos; - } else if (pointLow < dataMin) { - dataMin = pointLow; - } - } - if (stacking) { - // add the series - if (!stacks[key]) { - stacks[key] = {}; - } - stacks[key][pointX] = { - total: totalPos, - cum: totalPos - }; - } - } - }); - - - // For column, areas and bars, set the minimum automatically to zero - // and prevent that minPadding is added in setScale - if (/(area|column|bar)/.test(serie.type) && !isXAxis) { - if (dataMin >= 0) { - dataMin = 0; - ignoreMinPadding = true; - } else if (dataMax < 0) { - dataMax = 0; - ignoreMaxPadding = true; - } - } - } - } - }); - - } - - /** - * Translate from axis value to pixel position on the chart, or back - * - */ - translate = function(val, backwards, cvsCoord, old) { - var sign = 1, - cvsOffset = 0, - localA = old ? oldTransA : transA, - localMin = old ? oldMin : min, - returnValue; - - if (!localA) { - localA = transA; - } - - if (cvsCoord) { - sign *= -1; // canvas coordinates inverts the value - cvsOffset = axisLength; - } - if (reversed) { // reversed axis - sign *= -1; - cvsOffset -= sign * axisLength; - } - - if (backwards) { // reverse translation - if (reversed) { - val = axisLength - val; - } - returnValue = val / localA + localMin; // from chart pixel to value - - } else { // normal translation - returnValue = sign * (val - localMin) * localA + cvsOffset; // from value to chart pixel - } - - return returnValue; - }; - - /** - * Create the path for a plot line that goes from the given value on - * this axis, across the plot to the opposite side - * @param {Number} value - * @param {Number} lineWidth Used for calculation crisp line - * @param {Number] old Use old coordinates (for resizing and rescaling) - */ - getPlotLinePath = function(value, lineWidth, old) { - var x1, - y1, - x2, - y2, - translatedValue = translate(value, null, null, old), - cHeight = old && oldChartHeight || chartHeight, - cWidth = old && oldChartWidth || chartWidth, - skip; - - x1 = x2 = mathRound(translatedValue + transB); - y1 = y2 = mathRound(cHeight - translatedValue - transB); - - if (isNaN(translatedValue)) { // no min or max - skip = true; - - } else if (horiz) { - y1 = plotTop; - y2 = cHeight - marginBottom; - if (x1 < plotLeft || x1 > plotLeft + plotWidth) { - skip = true; - } - } else { - x1 = plotLeft; - x2 = cWidth - marginRight; - if (y1 < plotTop || y1 > plotTop + plotHeight) { - skip = true; - } - } - return skip ? - null : - renderer.crispLine([M, x1, y1, L, x2, y2], lineWidth || 0); - }; - - /** - * Take an interval and normalize it to multiples of 1, 2, 2.5 and 5 - * @param {Number} interval - */ - function normalizeTickInterval(interval, multiples) { - var normalized; - - // round to a tenfold of 1, 2, 2.5 or 5 - magnitude = multiples ? 1 : math.pow(10, mathFloor(math.log(interval) / math.LN10)); - normalized = interval / magnitude; - - // multiples for a linear scale - if (!multiples) { - multiples = [1, 2, 2.5, 5, 10]; - //multiples = [1, 2, 2.5, 4, 5, 7.5, 10]; - - // the allowDecimals option - if (options.allowDecimals === false) { - if (magnitude == 1) { - multiples = [1, 2, 5, 10]; - } else if (magnitude <= 0.1) { - multiples = [1 / magnitude]; - } - } - } - - // normalize the interval to the nearest multiple - for (var i = 0; i < multiples.length; i++) { - interval = multiples[i]; - if (normalized <= (multiples[i] + (multiples[i+1] || multiples[i])) / 2) { - break; - } - } - - // multiply back to the correct magnitude - interval *= magnitude; - - return interval; - } - - /** - * Set the tick positions to a time unit that makes sense, for example - * on the first of each month or on every Monday. - */ - function setDateTimeTickPositions() { - tickPositions = []; - var i, - useUTC = defaultOptions.global.useUTC, - oneSecond = 1000 / timeFactor, - oneMinute = 60000 / timeFactor, - oneHour = 3600000 / timeFactor, - oneDay = 24 * 3600000 / timeFactor, - oneWeek = 7 * 24 * 3600000 / timeFactor, - oneMonth = 30 * 24 * 3600000 / timeFactor, - oneYear = 31556952000 / timeFactor, - - units = [[ - 'second', // unit name - oneSecond, // fixed incremental unit - [1, 2, 5, 10, 15, 30] // allowed multiples - ], [ - 'minute', // unit name - oneMinute, // fixed incremental unit - [1, 2, 5, 10, 15, 30] // allowed multiples - ], [ - 'hour', // unit name - oneHour, // fixed incremental unit - [1, 2, 3, 4, 6, 8, 12] // allowed multiples - ], [ - 'day', // unit name - oneDay, // fixed incremental unit - [1, 2] // allowed multiples - ], [ - 'week', // unit name - oneWeek, // fixed incremental unit - [1, 2] // allowed multiples - ], [ - 'month', - oneMonth, - [1, 2, 3, 4, 6] - ], [ - 'year', - oneYear, - null - ]], - - unit = units[6], // default unit is years - interval = unit[1], - multiples = unit[2]; - - // loop through the units to find the one that best fits the tickInterval - for (i = 0; i < units.length; i++) { - unit = units[i]; - interval = unit[1]; - multiples = unit[2]; - - - if (units[i+1]) { - // lessThan is in the middle between the highest multiple and the next unit. - var lessThan = (interval * multiples[multiples.length - 1] + - units[i + 1][1]) / 2; - - // break and keep the current unit - if (tickInterval <= lessThan) { - break; - } - } - } - - // prevent 2.5 years intervals, though 25, 250 etc. are allowed - if (interval == oneYear && tickInterval < 5 * interval) { - multiples = [1, 2, 5]; - } - - // get the minimum value by flooring the date - var multitude = normalizeTickInterval(tickInterval / interval, multiples), - minYear, // used in months and years as a basis for Date.UTC() - minDate = new Date(min * timeFactor); - - minDate.setMilliseconds(0); - - if (interval >= oneSecond) { // second - minDate.setSeconds(interval >= oneMinute ? 0 : - multitude * mathFloor(minDate.getSeconds() / multitude)); - } - - if (interval >= oneMinute) { // minute - minDate[setMinutes](interval >= oneHour ? 0 : - multitude * mathFloor(minDate[getMinutes]() / multitude)); - } - - if (interval >= oneHour) { // hour - minDate[setHours](interval >= oneDay ? 0 : - multitude * mathFloor(minDate[getHours]() / multitude)); - } - - if (interval >= oneDay) { // day - minDate[setDate](interval >= oneMonth ? 1 : - multitude * mathFloor(minDate[getDate]() / multitude)); - } - - if (interval >= oneMonth) { // month - minDate[setMonth](interval >= oneYear ? 0 : - multitude * mathFloor(minDate[getMonth]() / multitude)); - minYear = minDate[getFullYear](); - } - - if (interval >= oneYear) { // year - minYear -= minYear % multitude; - minDate[setFullYear](minYear); - } - - // week is a special case that runs outside the hierarchy - if (interval == oneWeek) { - // get start of current week, independent of multitude - minDate[setDate](minDate[getDate]() - minDate[getDay]() + - options.startOfWeek); - } - - - // get tick positions - i = 1; // prevent crash just in case - minYear = minDate[getFullYear](); - var time = minDate.getTime() / timeFactor, - minMonth = minDate[getMonth](), - minDateDate = minDate[getDate](); - - // iterate and add tick positions at appropriate values - while (time < max && i < plotWidth) { - tickPositions.push(time); - - // if the interval is years, use Date.UTC to increase years - if (interval == oneYear) { - time = makeTime(minYear + i * multitude, 0) / timeFactor; - - // if the interval is months, use Date.UTC to increase months - } else if (interval == oneMonth) { - time = makeTime(minYear, minMonth + i * multitude) / timeFactor; - - // if we're using global time, the interval is not fixed as it jumps - // one hour at the DST crossover - } else if (!useUTC && (interval == oneDay || interval == oneWeek)) { - time = makeTime(minYear, minMonth, minDateDate + - i * multitude * (interval == oneDay ? 1 : 7)); - - // else, the interval is fixed and we use simple addition - } else { - time += interval * multitude; - } - - i++; - } - // push the last time - tickPositions.push(time); - - - // dynamic label formatter - dateTimeLabelFormat = options.dateTimeLabelFormats[unit[0]]; - } - - /** - * Fix JS round off float errors - * @param {Number} num - */ - function correctFloat(num) { - var invMag, ret = num; - if (defined(magnitude)) { - invMag = (magnitude < 1 ? mathRound(1 / magnitude) : 1) * 10; - ret = mathRound(num * invMag) / invMag; - } - return ret; - } - - /** - * Set the tick positions of a linear axis to round values like whole tens or every five. - */ - function setLinearTickPositions() { - - var i, - roundedMin = mathFloor(min / tickInterval) * tickInterval, - roundedMax = mathCeil(max / tickInterval) * tickInterval; - - tickPositions = []; - - // populate the intermediate values - i = correctFloat(roundedMin); - while (i <= roundedMax) { - tickPositions.push(i); - i = correctFloat(i + tickInterval); - } - - } - - /** - * Set the tick positions to round values and optionally extend the extremes - * to the nearest tick - */ - function setTickPositions(secondPass) { - var length, - catPad, - linkedParent, - linkedParentExtremes, - tickIntervalOption = options.tickInterval, - tickPixelIntervalOption = options.tickPixelInterval, - maxZoom = options.maxZoom || ( - isXAxis ? - mathMin(chart.smallestInterval * 5, dataMax - dataMin) : - null - ), - zoomOffset; - - - axisLength = horiz ? plotWidth : plotHeight; - - // linked axis gets the extremes from the parent axis - if (isLinked) { - linkedParent = chart[isXAxis ? 'xAxis' : 'yAxis'][options.linkedTo]; - linkedParentExtremes = linkedParent.getExtremes(); - min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin); - max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax); - } - - // initial min and max from the extreme data values - else { - min = pick(userSetMin, options.min, dataMin); - max = pick(userSetMax, options.max, dataMax); - } - - // maxZoom exceeded, just center the selection - if (max - min < maxZoom) { - zoomOffset = (maxZoom - max + min) / 2; - // if min and max options have been set, don't go beyond it - min = mathMax(min - zoomOffset, pick(options.min, min - zoomOffset), dataMin); - max = mathMin(min + maxZoom, pick(options.max, min + maxZoom), dataMax); - } - - // pad the values to get clear of the chart's edges - if (!categories && !usePercentage && !isLinked && defined(min) && defined(max)) { - length = (max - min) || 1; - if (!defined(options.min) && !defined(userSetMin) && minPadding && (dataMin < 0 || !ignoreMinPadding)) { - min -= length * minPadding; - } - if (!defined(options.max) && !defined(userSetMax) && maxPadding && (dataMax > 0 || !ignoreMaxPadding)) { - max += length * maxPadding; - } - } - - // get tickInterval - if (min == max) { - tickInterval = 1; - } else if (isLinked && !tickIntervalOption && - tickPixelIntervalOption == linkedParent.options.tickPixelInterval) { - tickInterval = linkedParent.tickInterval; - } else { - tickInterval = pick( - tickIntervalOption, - categories ? // for categoried axis, 1 is default, for linear axis use tickPix - 1 : - (max - min) * tickPixelIntervalOption / axisLength - ); - } - - if (!isDatetimeAxis && !defined(options.tickInterval)) { // linear - tickInterval = normalizeTickInterval(tickInterval); - } - axis.tickInterval = tickInterval; // record for linked axis - - // get minorTickInterval - minorTickInterval = options.minorTickInterval === 'auto' && tickInterval ? - tickInterval / 5 : options.minorTickInterval; - - // find the tick positions - if (isDatetimeAxis) { - setDateTimeTickPositions(); - } else { - setLinearTickPositions(); - } - - if (!isLinked) { - // pad categorised axis to nearest half unit - if (categories || (isXAxis && chart.hasColumn)) { - catPad = (categories ? 1 : tickInterval) * 0.5; - if (categories || !defined(pick(options.min, userSetMin))) { - min -= catPad; - } - if (categories || !defined(pick(options.max, userSetMax))) { - max += catPad; - } - } - - // reset min/max or remove extremes based on start/end on tick - var roundedMin = tickPositions[0], - roundedMax = tickPositions[tickPositions.length - 1]; - - if (options.startOnTick) { - min = roundedMin; - } else if (min > roundedMin) { - tickPositions.shift(); - } - - if (options.endOnTick) { - max = roundedMax; - } else if (max < roundedMax) { - tickPositions.pop(); - } - - // record the greatest number of ticks for multi axis - if (!maxTicks) { // first call, or maxTicks have been reset after a zoom operation - maxTicks = { - x: 0, - y: 0 - }; - } - - if (!isDatetimeAxis && tickPositions.length > maxTicks[xOrY]) { - maxTicks[xOrY] = tickPositions.length; - } - } - - - } - - /** - * When using multiple axes, adjust the number of ticks to match the highest - * number of ticks in that group - */ - function adjustTickAmount() { - - if (maxTicks && !isDatetimeAxis && !categories && !isLinked) { // only apply to linear scale - var oldTickAmount = tickAmount, - calculatedTickAmount = tickPositions.length; - - // set the axis-level tickAmount to use below - tickAmount = maxTicks[xOrY]; - - if (calculatedTickAmount < tickAmount) { - while (tickPositions.length < tickAmount) { - tickPositions.push( correctFloat( - tickPositions[tickPositions.length - 1] + tickInterval - )); - } - transA *= (calculatedTickAmount - 1) / (tickAmount - 1); - max = tickPositions[tickPositions.length - 1]; - - } - if (defined(oldTickAmount) && tickAmount != oldTickAmount) { - axis.isDirty = true; - } - } - - } - - /** - * Set the scale based on data min and max, user set min and max or options - * - */ - function setScale() { - var type, - i; - - oldMin = min; - oldMax = max; - - // get data extremes if needed - getSeriesExtremes(); - - // get fixed positions based on tickInterval - setTickPositions(); - - // the translation factor used in translate function - oldTransA = transA; - transA = axisLength / ((max - min) || 1); - - // reset stacks - if (!isXAxis) { - for (type in stacks) { - for (i in stacks[type]) { - stacks[type][i].cum = stacks[type][i].total; - } - } - } - - // mark as dirty if it is not already set to dirty and extremes have changed - if (!axis.isDirty) { - axis.isDirty = (min != oldMin || max != oldMax); - } - - } - - /** - * Set the extremes and optionally redraw - * @param {Number} newMin - * @param {Number} newMax - * @param {Boolean} redraw - * @param {Boolean|Object} animation Whether to apply animation, and optionally animation - * configuration - * - */ - function setExtremes(newMin, newMax, redraw, animation) { - - redraw = pick(redraw, true); // defaults to true - - fireEvent(axis, 'setExtremes', { // fire an event to enable syncing of multiple charts - min: newMin, - max: newMax - }, function() { // the default event handler - - userSetMin = newMin; - userSetMax = newMax; - - - // redraw - if (redraw) { - chart.redraw(animation); - } - }); - - } - - /** - * Get the actual axis extremes - */ - function getExtremes() { - return { - min: min, - max: max, - dataMin: dataMin, - dataMax: dataMax - }; - } - - /** - * Get the zero plane either based on zero or on the min or max value. - * Used in bar and area plots - */ - function getThreshold(threshold) { - if (min > threshold) { - threshold = min; - } else if (max < threshold) { - threshold = max; - } - - return translate(threshold, 0, 1); - } - - /** - * Add a plot band or plot line after render time - * - * @param options {Object} The plotBand or plotLine configuration object - */ - function addPlotBandOrLine(options) { - var obj = new PlotLineOrBand(options).render(); - plotLinesAndBands.push(obj); - return obj; - } - - /** - * Render the tick labels to a preliminary position to get their sizes - */ - function getOffset() { - - var hasData = associatedSeries.length && defined(min) && defined(max), - titleOffset = 0, - titleMargin = 0, - axisTitleOptions = options.title, - labelOptions = options.labels, - directionFactor = [-1, 1, 1, -1][side]; - - if (!axisGroup) { - axisGroup = renderer.g('axis') - .attr({ zIndex: 7 }) - .add(); - gridGroup = renderer.g('grid') - .attr({ zIndex: 1 }) - .add(); - } - - labelOffset = 0; // reset - - if (hasData || isLinked) { - each(tickPositions, function(pos) { - if (!ticks[pos]) { - ticks[pos] = new Tick(pos); - } else { - ticks[pos].addLabel(); // update labels depending on tick interval - } - - // left side must be align: right and right side must have align: left for labels - if (side === 0 || side == 2 || { 1: 'left', 3: 'right' }[side] == labelOptions.align) { - - // get the highest offset - labelOffset = mathMax( - ticks[pos].getLabelSize(), - labelOffset - ); - } - - }); - - if (staggerLines) { - labelOffset += (staggerLines - 1) * 16; - } - - } else { // doesn't have data - for (var n in ticks) { - ticks[n].destroy(); - delete ticks[n]; - } - } - - if (axisTitleOptions && axisTitleOptions.text) { - if (!axis.axisTitle) { - axis.axisTitle = renderer.text( - axisTitleOptions.text, - 0, - 0 - ) - .attr({ - zIndex: 7, - rotation: axisTitleOptions.rotation || 0, - align: - axisTitleOptions.textAlign || - { low: 'left', middle: 'center', high: 'right' }[axisTitleOptions.align] - }) - .css(axisTitleOptions.style) - .add(); - } - - titleOffset = axis.axisTitle.getBBox()[horiz ? 'height' : 'width']; - titleMargin = pick(axisTitleOptions.margin, horiz ? 5 : 10); - - } - - // handle automatic or user set offset - offset = directionFactor * (options.offset || axisOffset[side]); - - axisTitleMargin = - labelOffset + - (side != 2 && labelOffset && directionFactor * options.labels[horiz ? 'y' : 'x']) + - titleMargin; - - axisOffset[side] = mathMax( - axisOffset[side], - axisTitleMargin + titleOffset + directionFactor * offset - ); - - } - - /** - * Render the axis - */ - function render() { - var axisTitleOptions = options.title, - alternateGridColor = options.alternateGridColor, - lineWidth = options.lineWidth, - lineLeft, - lineTop, - linePath, - hasRendered = chart.hasRendered, - slideInTicks = hasRendered && defined(oldMin) && !isNaN(oldMin), - hasData = associatedSeries.length && defined(min) && defined(max); - - // update metrics - axisLength = horiz ? plotWidth : plotHeight; - transA = axisLength / ((max - min) || 1); - transB = horiz ? plotLeft : marginBottom; // translation addend - - // If the series has data draw the ticks. Else only the line and title - if (hasData || isLinked) { - - // minor ticks - if (minorTickInterval && !categories) { - var pos = min + (tickPositions[0] - min) % minorTickInterval; - for (pos; pos <= max; pos += minorTickInterval) { - if (!minorTicks[pos]) { - minorTicks[pos] = new Tick(pos, true); - } - - // render new ticks in old position - if (slideInTicks && minorTicks[pos].isNew) { - minorTicks[pos].render(null, true); - } - - - minorTicks[pos].isActive = true; - minorTicks[pos].render(); - } - } - - // major ticks - each(tickPositions, function(pos, i) { - // linked axes need an extra check to find out if - if (!isLinked || (pos >= min && pos <= max)) { - - // render new ticks in old position - if (slideInTicks && ticks[pos].isNew) { - ticks[pos].render(i, true); - } - - ticks[pos].isActive = true; - ticks[pos].render(i); - } - }); - - // alternate grid color - if (alternateGridColor) { - each(tickPositions, function(pos, i) { - if (i % 2 === 0 && pos < max) { - /*plotLinesAndBands.push(new PlotLineOrBand({ - from: pos, - to: tickPositions[i + 1] !== UNDEFINED ? tickPositions[i + 1] : max, - color: alternateGridColor - }));*/ - - if (!alternateBands[pos]) { - alternateBands[pos] = new PlotLineOrBand(); - } - alternateBands[pos].options = { - from: pos, - to: tickPositions[i + 1] !== UNDEFINED ? tickPositions[i + 1] : max, - color: alternateGridColor - }; - alternateBands[pos].render(); - alternateBands[pos].isActive = true; - } - }); - } - - // custom plot bands (behind grid lines) - /*if (!hasRendered) { // only first time - each(options.plotBands || [], function(plotBandOptions) { - plotLinesAndBands.push(new PlotLineOrBand( - extend({ zIndex: 1 }, plotBandOptions) - ).render()); - }); - }*/ - - - - - // custom plot lines and bands - if (!hasRendered) { // only first time - each((options.plotLines || []).concat(options.plotBands || []), function(plotLineOptions) { - plotLinesAndBands.push(new PlotLineOrBand(plotLineOptions).render()); - }); - } - - - - } // end if hasData - - // remove inactive ticks - each([ticks, minorTicks, alternateBands], function(coll) { - for (var pos in coll) { - if (!coll[pos].isActive) { - coll[pos].destroy(); - delete coll[pos]; - } else { - coll[pos].isActive = false; // reset - } - } - }); - - - - - // Static items. As the axis group is cleared on subsequent calls - // to render, these items are added outside the group. - // axis line - if (lineWidth) { - lineLeft = plotLeft + (opposite ? plotWidth : 0) + offset; - lineTop = chartHeight - marginBottom - (opposite ? plotHeight : 0) + offset; - - linePath = renderer.crispLine([ - M, - horiz ? - plotLeft: - lineLeft, - horiz ? - lineTop: - plotTop, - L, - horiz ? - chartWidth - marginRight : - lineLeft, - horiz ? - lineTop: - chartHeight - marginBottom - ], lineWidth); - if (!axisLine) { - axisLine = renderer.path(linePath) - .attr({ - stroke: options.lineColor, - 'stroke-width': lineWidth, - zIndex: 7 - }) - .add(); - } else { - axisLine.animate({ d: linePath }); - } - - } - - if (axis.axisTitle) { - // compute anchor points for each of the title align options - var margin = horiz ? plotLeft : plotTop, - fontSize = pInt(axisTitleOptions.style.fontSize || 12), - // the position in the length direction of the axis - alongAxis = { - low: margin + (horiz ? 0 : axisLength), - middle: margin + axisLength / 2, - high: margin + (horiz ? axisLength : 0) - }[axisTitleOptions.align], - - // the position in the perpendicular direction of the axis - offAxis = (horiz ? plotTop + plotHeight : plotLeft) + - (horiz ? 1 : -1) * // horizontal axis reverses the margin - (opposite ? -1 : 1) * // so does opposite axes - axisTitleMargin + - //(isIE ? fontSize / 3 : 0)+ // preliminary fix for vml's centerline - (side == 2 ? fontSize : 0); - - axis.axisTitle[hasRendered ? 'animate' : 'attr']({ - x: horiz ? - alongAxis: - offAxis + (opposite ? plotWidth : 0) + offset + - (axisTitleOptions.x || 0), // x - y: horiz ? - offAxis - (opposite ? plotHeight : 0) + offset: - alongAxis + (axisTitleOptions.y || 0) // y - }); - - } - - axis.isDirty = false; - } - - /** - * Remove a plot band or plot line from the chart by id - * @param {Object} id - */ - function removePlotBandOrLine(id) { - var i = plotLinesAndBands.length; - while (i--) { - if (plotLinesAndBands[i].id == id) { - plotLinesAndBands[i].destroy(); - } - } - } - - /** - * Redraw the axis to reflect changes in the data or axis extremes - */ - function redraw() { - - // hide tooltip and hover states - if (tracker.resetTracker) { - tracker.resetTracker(); - } - - // render the axis - render(); - - // move plot lines and bands - each(plotLinesAndBands, function(plotLine) { - plotLine.render(); - }); - - // mark associated series as dirty and ready for redraw - each(associatedSeries, function(series) { - series.isDirty = true; - }); - - } - - /** - * Set new axis categories and optionally redraw - * @param {Array} newCategories - * @param {Boolean} doRedraw - */ - function setCategories(newCategories, doRedraw) { - // set the categories - axis.categories = categories = newCategories; - - // force reindexing tooltips - each(associatedSeries, function(series) { - series.translate(); - series.setTooltipPoints(true); - }); - - - // optionally redraw - axis.isDirty = true; - - if (pick(doRedraw, true)) { - chart.redraw(); - } - } - - - - // Run Axis - - // inverted charts have reversed xAxes as default - if (inverted && isXAxis && reversed === UNDEFINED) { - reversed = true; - } - - - // expose some variables - extend(axis, { - addPlotBand: addPlotBandOrLine, - addPlotLine: addPlotBandOrLine, - adjustTickAmount: adjustTickAmount, - categories: categories, - getExtremes: getExtremes, - getPlotLinePath: getPlotLinePath, - getThreshold: getThreshold, - isXAxis: isXAxis, - options: options, - plotLinesAndBands: plotLinesAndBands, - getOffset: getOffset, - render: render, - setCategories: setCategories, - setExtremes: setExtremes, - setScale: setScale, - setTickPositions: setTickPositions, - translate: translate, - redraw: redraw, - removePlotBand: removePlotBandOrLine, - removePlotLine: removePlotBandOrLine, - reversed: reversed, - stacks: stacks - }); - - // register event listeners - for (eventType in events) { - addEvent(axis, eventType, events[eventType]); - } - - // set min and max - setScale(); - - } // end Axis - - - /** - * The toolbar object - * - * @param {Object} chart - */ - function Toolbar(chart) { - var buttons = {}; - - function add(id, text, title, fn) { - if (!buttons[id]) { - var button = renderer.text( - text, - 0, - 0 - ) - .css(options.toolbar.itemStyle) - .align({ - align: 'right', - x: - marginRight - 20, - y: plotTop + 30 - }) - .on('click', fn) - /*.on('touchstart', function(e) { - e.stopPropagation(); // don't fire the container event - fn(); - })*/ - .attr({ - align: 'right', - zIndex: 20 - }) - .add(); - buttons[id] = button; - } - } - function remove(id) { - discardElement(buttons[id].element); - buttons[id] = null; - } - - // public - return { - add: add, - remove: remove - }; - } - - /** - * The tooltip object - * @param {Object} options Tooltip options - */ - function Tooltip (options) { - var currentSeries, - borderWidth = options.borderWidth, - crosshairsOptions = options.crosshairs, - crosshairs = [], - style = options.style, - shared = options.shared, - padding = pInt(style.padding), - boxOffLeft = borderWidth + padding, // off left/top position as IE can't - //properly handle negative positioned shapes - tooltipIsHidden = true, - boxWidth, - boxHeight, - currentX = 0, - currentY = 0; - - // remove padding CSS and apply padding on box instead - style.padding = 0; - - // create the elements - var group = renderer.g('tooltip') - .attr({ zIndex: 8 }) - .add(), - - box = renderer.rect(boxOffLeft, boxOffLeft, 0, 0, options.borderRadius, borderWidth) - .attr({ - fill: options.backgroundColor, - 'stroke-width': borderWidth - }) - .add(group) - .shadow(options.shadow), - label = renderer.text('', padding + boxOffLeft, pInt(style.fontSize) + padding + boxOffLeft) - .attr({ zIndex: 1 }) - .css(style) - .add(group); - - group.hide(); - - /** - * In case no user defined formatter is given, this will be used - */ - function defaultFormatter() { - var pThis = this, - items = pThis.points || splat(pThis), - xAxis = items[0].series.xAxis, - x = pThis.x, - isDateTime = xAxis && xAxis.options.type == 'datetime', - useHeader = isString(x) || isDateTime, - series, - s; - - // build the header - s = useHeader ? - ['', - (isDateTime ? dateFormat('%A, %b %e, %Y', x) : x), - '
    '] : []; - - // build the values - each(items, function(item) { - s.push(item.point.tooltipFormatter(useHeader)); - }); - return s.join(''); - } - - /** - * Provide a soft movement for the tooltip - * - * @param {Number} finalX - * @param {Number} finalY - */ - function move(finalX, finalY) { - - currentX = tooltipIsHidden ? finalX : (2 * currentX + finalX) / 3; - currentY = tooltipIsHidden ? finalY : (currentY + finalY) / 2; - - group.translate(currentX, currentY); - - - // run on next tick of the mouse tracker - if (mathAbs(finalX - currentX) > 1 || mathAbs(finalY - currentY) > 1) { - tooltipTick = function() { - move(finalX, finalY); - }; - } else { - tooltipTick = null; - } - } - - /** - * Hide the tooltip - */ - function hide() { - if (!tooltipIsHidden) { - var hoverPoints = chart.hoverPoints; - - group.hide(); - - each(crosshairs, function(crosshair) { - if (crosshair) { - crosshair.hide(); - } - }); - - // hide previous hoverPoints and set new - if (hoverPoints) { - each (hoverPoints, function(point) { - point.setState(); - }); - } - chart.hoverPoints = null; - - - tooltipIsHidden = true; - } - - } - - /** - * Refresh the tooltip's text and position. - * @param {Object} point - * - */ - function refresh(point) { - var x, - y, - boxX, - boxY, - show, - bBox, - plotX, - plotY = 0, - textConfig = {}, - text, - pointConfig = [], - tooltipPos = point.tooltipPos, - formatter = options.formatter || defaultFormatter, - hoverPoints = chart.hoverPoints, - getConfig = function(point) { - return { - series: point.series, - point: point, - x: point.category, - y: point.y, - percentage: point.percentage, - total: point.total || point.stackTotal - }; - }; - - // shared tooltip, array is sent over - if (shared) { - - // hide previous hoverPoints and set new - if (hoverPoints) { - each (hoverPoints, function(point) { - point.setState(); - }); - } - chart.hoverPoints = point; - - each(point, function(item, i) { - /*var series = item.series, - hoverPoint = series.hoverPoint; - if (hoverPoint) { - hoverPoint.setState(); - } - series.hoverPoint = item;*/ - item.setState(HOVER_STATE); - plotY += item.plotY; // for average - - pointConfig.push(getConfig(item)); - }); - - plotX = point[0].plotX; - plotY = mathRound(plotY) / point.length; // mathRound because Opera 10 has problems here - - textConfig = { - x: point[0].category - }; - textConfig.points = pointConfig; - point = point[0]; - - // single point tooltip - } else { - textConfig = getConfig(point); - } - text = formatter.call(textConfig); - - // register the current series - currentSeries = point.series; - - // get the reference point coordinates (pie charts use tooltipPos) - plotX = shared ? plotX : point.plotX; - plotY = shared ? plotY : point.plotY; - x = mathRound(tooltipPos ? tooltipPos[0] : (inverted ? plotWidth - plotY : plotX)); - y = mathRound(tooltipPos ? tooltipPos[1] : (inverted ? plotHeight - plotX : plotY)); - - - // hide tooltip if the point falls outside the plot - show = shared || !point.series.isCartesian || isInsidePlot(x, y); - - // update the inner HTML - if (text === false || !show) { - hide(); - } else { - - // show it - if (tooltipIsHidden) { - group.show(); - tooltipIsHidden = false; - } - - // update text - label.attr({ - text: text - }); - - // get the bounding box - bBox = label.getBBox(); - boxWidth = bBox.width + 2 * padding; - boxHeight = bBox.height + 2 * padding; - - // set the size of the box - box.attr({ - width: boxWidth, - height: boxHeight, - stroke: options.borderColor || point.color || currentSeries.color || '#606060' - }); - - // keep the box within the chart area - boxX = x - boxWidth + plotLeft - 25; - boxY = y - boxHeight + plotTop + 10; - - // it is too far to the left, adjust it - if (boxX < 7) { - boxX = 7; - boxY -= 30; - } - - - if (boxY < 5) { - boxY = 5; // above - } else if (boxY + boxHeight > chartHeight) { - boxY = chartHeight - boxHeight - 5; // below - } - - // do the move - move(mathRound(boxX - boxOffLeft), mathRound(boxY - boxOffLeft)); - - - } - - - // crosshairs - if (crosshairsOptions) { - crosshairsOptions = splat(crosshairsOptions); // [x, y] - - var path, - i = crosshairsOptions.length, - attribs, - axis; - - while (i--) { - if (crosshairsOptions[i] && (axis = point.series[i ? 'yAxis' : 'xAxis'])) { - path = axis - .getPlotLinePath(point[i ? 'y' : 'x'], 1); - if (crosshairs[i]) { - crosshairs[i].attr({ d: path, visibility: VISIBLE }); - - } else { - attribs = { - 'stroke-width': crosshairsOptions[i].width || 1, - stroke: crosshairsOptions[i].color || '#C0C0C0', - zIndex: 2 - }; - if (crosshairsOptions[i].dashStyle) { - attribs.dashstyle = crosshairsOptions[i].dashStyle; - } - crosshairs[i] = renderer.path(path) - .attr(attribs) - .add(); - } - } - } - } - } - - - - // public members - return { - shared: shared, - refresh: refresh, - hide: hide - }; - } - - /** - * The mouse tracker object - * @param {Object} chart - * @param {Object} options - */ - function MouseTracker (chart, options) { - - - var mouseDownX, - mouseDownY, - hasDragged, - selectionMarker, - zoomType = optionsChart.zoomType, - zoomX = /x/.test(zoomType), - zoomY = /y/.test(zoomType), - zoomHor = zoomX && !inverted || zoomY && inverted, - zoomVert = zoomY && !inverted || zoomX && inverted; - - /** - * Add crossbrowser support for chartX and chartY - * @param {Object} e The event object in standard browsers - */ - function normalizeMouseEvent(e) { - var ePos; - - // common IE normalizing - e = e || win.event; - if (!e.target) { - e.target = e.srcElement; - } - - // iOS - ePos = e.touches ? e.touches.item(0) : e; - - // in certain cases, get mouse position - if (e.type != 'mousemove' || win.opera) { // only Opera needs position on mouse move, see below - chartPosition = getPosition(container); - } - - // chartX and chartY - if (isIE) { // IE including IE9 that has chartX but in a different meaning - e.chartX = e.x; - e.chartY = e.y; - } else { - if (ePos.layerX === UNDEFINED) { // Opera and iOS - e.chartX = ePos.pageX - chartPosition.left; - e.chartY = ePos.pageY - chartPosition.top; - } else { - e.chartX = e.layerX; - e.chartY = e.layerY; - } - } - - return e; - } - - /** - * Get the click position in terms of axis values. - * - * @param {Object} e A mouse event - */ - function getMouseCoordinates(e) { - var coordinates = { - xAxis: [], - yAxis: [] - }; - each(axes, function(axis, i) { - var translate = axis.translate, - isXAxis = axis.isXAxis, - isHorizontal = inverted ? !isXAxis : isXAxis; - - coordinates[isXAxis ? 'xAxis' : 'yAxis'].push({ - axis: axis, - value: translate( - isHorizontal ? - e.chartX - plotLeft : - plotHeight - e.chartY + plotTop, - true - ) - }); - }); - return coordinates; - } - - /** - * With line type charts with a single tracker, get the point closest to the mouse - */ - function onmousemove (e) { - var point, - points, - hoverPoint = chart.hoverPoint, - hoverSeries = chart.hoverSeries, - i, - j, - distance = chartWidth, - index = inverted ? e.chartY : e.chartX - plotLeft; // wtf? - - // shared tooltip - if (tooltip && options.shared) { - points = []; - - // loop over all series and find the ones with points closest to the mouse - i = series.length; - for (j = 0; j < i; j++) { - if (series[j].visible && series[j].tooltipPoints.length) { - point = series[j].tooltipPoints[index]; - point._dist = mathAbs(index - point.plotX); - distance = mathMin(distance, point._dist); - points.push(point); - } - } - // remove furthest points - i = points.length; - while (i--) { - if (points[i]._dist > distance) { - points.splice(i, 1); - } - } - // refresh the tooltip if necessary - if (points.length && (points[0].plotX != hoverX)) { - tooltip.refresh(points); - hoverX = points[0].plotX; - } - } - - // separate tooltip and general mouse events - if (hoverSeries && hoverSeries.tracker) { // only use for line-type series with common tracker - - // get the point - point = hoverSeries.tooltipPoints[index]; - - // a new point is hovered, refresh the tooltip - if (point && point != hoverPoint) { - - // trigger the events - point.onMouseOver(); - - } - } - } - - - - /** - * Reset the tracking by hiding the tooltip, the hover series state and the hover point - */ - function resetTracker() { - var hoverSeries = chart.hoverSeries, - hoverPoint = chart.hoverPoint; - - if (hoverPoint) { - hoverPoint.onMouseOut(); - } - - if (hoverSeries) { - hoverSeries.onMouseOut(); - } - - if (tooltip) { - tooltip.hide(); - } - - hoverX = null; - } - - /** - * Mouse up or outside the plot area - */ - function drop() { - if (selectionMarker) { - var selectionData = { - xAxis: [], - yAxis: [] - }, - selectionBox = selectionMarker.getBBox(), - selectionLeft = selectionBox.x - plotLeft, - selectionTop = selectionBox.y - plotTop; - - - // a selection has been made - if (hasDragged) { - - // record each axis' min and max - each(axes, function(axis, i) { - var translate = axis.translate, - isXAxis = axis.isXAxis, - isHorizontal = inverted ? !isXAxis : isXAxis, - selectionMin = translate( - isHorizontal ? - selectionLeft : - plotHeight - selectionTop - selectionBox.height, - true - ), - selectionMax = translate( - isHorizontal ? - selectionLeft + selectionBox.width : - plotHeight - selectionTop, - true - ); - - selectionData[isXAxis ? 'xAxis' : 'yAxis'].push({ - axis: axis, - min: mathMin(selectionMin, selectionMax), // for reversed axes - max: mathMax(selectionMin, selectionMax) - }); - - }); - fireEvent(chart, 'selection', selectionData, zoom); - - } - selectionMarker = selectionMarker.destroy(); - } - - chart.mouseIsDown = mouseIsDown = hasDragged = false; - removeEvent(doc, hasTouch ? 'touchend' : 'mouseup', drop); - - } - - /** - * Set the JS events on the container element - */ - function setDOMEvents () { - var lastWasOutsidePlot = true; - - /* - * Record the starting position of a dragoperation - */ - container.onmousedown = function(e) { - e = normalizeMouseEvent(e); - - // record the start position - //e.preventDefault && e.preventDefault(); - - chart.mouseIsDown = mouseIsDown = true; - mouseDownX = e.chartX; - mouseDownY = e.chartY; - - addEvent(doc, hasTouch ? 'touchend' : 'mouseup', drop); - }; - - // The mousemove, touchmove and touchstart event handler - var mouseMove = function(e) { - - // let the system handle multitouch operations like two finger scroll - // and pinching - if (e && e.touches && e.touches.length > 1) { - return; - } - - // normalize - e = normalizeMouseEvent(e); - if (!hasTouch) { // not for touch devices - e.returnValue = false; - } - - var chartX = e.chartX, - chartY = e.chartY, - isOutsidePlot = !isInsidePlot(chartX - plotLeft, chartY - plotTop); - - // on touch devices, only trigger click if a handler is defined - if (hasTouch && e.type == 'touchstart') { - if (attr(e.target, 'isTracker')) { - if (!chart.runTrackerClick) { - e.preventDefault(); - } - } else if (!runChartClick && !isOutsidePlot) { - e.preventDefault(); - } - } - - // cancel on mouse outside - if (isOutsidePlot) { - - if (!lastWasOutsidePlot) { - // reset the tracker - resetTracker(); - } - - // drop the selection if any and reset mouseIsDown and hasDragged - //drop(); - if (chartX < plotLeft) { - chartX = plotLeft; - } else if (chartX > plotLeft + plotWidth) { - chartX = plotLeft + plotWidth; - } - - if (chartY < plotTop) { - chartY = plotTop; - } else if (chartY > plotTop + plotHeight) { - chartY = plotTop + plotHeight; - } - - } - - if (mouseIsDown && e.type != 'touchstart') { // make selection - - // determine if the mouse has moved more than 10px - if ((hasDragged = Math.sqrt( - Math.pow(mouseDownX - chartX, 2) + - Math.pow(mouseDownY - chartY, 2) - ) > 10)) { - - // make a selection - if (hasCartesianSeries && (zoomX || zoomY) && - isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop)) { - if (!selectionMarker) { - selectionMarker = renderer.rect( - plotLeft, - plotTop, - zoomHor ? 1 : plotWidth, - zoomVert ? 1 : plotHeight, - 0 - ) - .attr({ - fill: 'rgba(69,114,167,0.25)', - zIndex: 7 - }) - .add(); - } - } - - // adjust the width of the selection marker - if (selectionMarker && zoomHor) { - var xSize = chartX - mouseDownX; - selectionMarker.attr({ - width: mathAbs(xSize), - x: (xSize > 0 ? 0 : xSize) + mouseDownX - }); - } - // adjust the height of the selection marker - if (selectionMarker && zoomVert) { - var ySize = chartY - mouseDownY; - selectionMarker.attr({ - height: mathAbs(ySize), - y: (ySize > 0 ? 0 : ySize) + mouseDownY - }); - } - } - - } else if (!isOutsidePlot) { - // show the tooltip - onmousemove(e); - } - - lastWasOutsidePlot = isOutsidePlot; - - // when outside plot, allow touch-drag by returning true - return isOutsidePlot || !hasCartesianSeries; - }; - - /* - * When the mouse enters the container, run mouseMove - */ - container.onmousemove = mouseMove; - - /* - * When the mouse leaves the container, hide the tracking (tooltip). - */ - addEvent(container, 'mouseleave', resetTracker); - - - container.ontouchstart = function(e) { - // For touch devices, use touchmove to zoom - if (zoomX || zoomY) { - container.onmousedown(e); - } - // Show tooltip and prevent the lower mouse pseudo event - mouseMove(e); - }; - - /* - * Allow dragging the finger over the chart to read the values on touch - * devices - */ - container.ontouchmove = mouseMove; - - /* - * Allow dragging the finger over the chart to read the values on touch - * devices - */ - container.ontouchend = function() { - if (hasDragged) { - resetTracker(); - } - }; - - - // MooTools 1.2.3 doesn't fire this in IE when using addEvent - container.onclick = function(e) { - var hoverPoint = chart.hoverPoint; - e = normalizeMouseEvent(e); - - e.cancelBubble = true; // IE specific - - - if (!hasDragged) { - if (hoverPoint && attr(e.target, 'isTracker')) { - var plotX = hoverPoint.plotX, - plotY = hoverPoint.plotY; - - // add page position info - extend(hoverPoint, { - pageX: chartPosition.left + plotLeft + - (inverted ? plotWidth - plotY : plotX), - pageY: chartPosition.top + plotTop + - (inverted ? plotHeight - plotX : plotY) - }); - - // the series click event - fireEvent(hoverPoint.series, 'click', extend(e, { - point: hoverPoint - })); - - // the point click event - hoverPoint.firePointEvent('click', e); - - } else { - extend(e, getMouseCoordinates(e)); - - // fire a click event in the chart - if (isInsidePlot(e.chartX - plotLeft, e.chartY - plotTop)) { - fireEvent(chart, 'click', e); - } - } - - - } - // reset mouseIsDown and hasDragged - hasDragged = false; - }; - - } - - /** - * Create the image map that listens for mouseovers - */ - placeTrackerGroup = function() { - - // first create - plot positions is not final at this stage - if (!trackerGroup) { - chart.trackerGroup = trackerGroup = renderer.g('tracker') - .attr({ zIndex: 9 }) - .add(); - - // then position - this happens on load and after resizing and changing - // axis or box positions - } else { - trackerGroup.translate(plotLeft, plotTop); - if (inverted) { - trackerGroup.attr({ - width: chart.plotWidth, - height: chart.plotHeight - }).invert(); - } - } - }; - - - // Run MouseTracker - placeTrackerGroup(); - if (options.enabled) { - chart.tooltip = tooltip = Tooltip(options); - } - - setDOMEvents(); - - // set the fixed interval ticking for the smooth tooltip - tooltipInterval = setInterval(function() { - if (tooltipTick) { - tooltipTick(); - } - }, 32); - - // expose properties - extend(this, { - zoomX: zoomX, - zoomY: zoomY, - resetTracker: resetTracker - }); - } - - - - /** - * The overview of the chart's series - * @param {Object} chart - */ - var Legend = function(chart) { - - var options = chart.options.legend; - - if (!options.enabled) { - return; - } - - var horizontal = options.layout == 'horizontal', - symbolWidth = options.symbolWidth, - symbolPadding = options.symbolPadding, - allItems, - style = options.style, - itemStyle = options.itemStyle, - itemHoverStyle = options.itemHoverStyle, - itemHiddenStyle = options.itemHiddenStyle, - padding = pInt(style.padding), - rightPadding = 20, - //lineHeight = options.lineHeight || 16, - y = 18, - initialItemX = 4 + padding + symbolWidth + symbolPadding, - itemX, - itemY, - lastItemY, - itemHeight = 0, - box, - legendBorderWidth = options.borderWidth, - legendBackgroundColor = options.backgroundColor, - legendGroup, - offsetWidth, - widthOption = options.width, - series = chart.series, - reversedLegend = options.reversed; - - - - /** - * Set the colors for the legend item - * @param {Object} item A Series or Point instance - * @param {Object} visible Dimmed or colored - */ - function colorizeItem(item, visible) { - var legendItem = item.legendItem, - legendLine = item.legendLine, - legendSymbol = item.legendSymbol, - hiddenColor = itemHiddenStyle.color, - textColor = visible ? options.itemStyle.color : hiddenColor, - symbolColor = visible ? item.color : hiddenColor; - if (legendItem) { - legendItem.css({ fill: textColor }); - } - if (legendLine) { - legendLine.attr({ stroke: symbolColor }); - } - if (legendSymbol) { - legendSymbol.attr({ - stroke: symbolColor, - fill: symbolColor - }); - } - } - - /** - * Position the legend item - * @param {Object} item A Series or Point instance - * @param {Object} visible Dimmed or colored - */ - function positionItem(item, itemX, itemY) { - var legendItem = item.legendItem, - legendLine = item.legendLine, - legendSymbol = item.legendSymbol, - checkbox = item.checkbox; - if (legendItem) { - legendItem.attr({ - x: itemX, - y: itemY - }); - } - if (legendLine) { - legendLine.translate(itemX, itemY - 4); - } - if (legendSymbol) { - legendSymbol.attr({ - x: itemX + legendSymbol.xOff, - y: itemY + legendSymbol.yOff - }); - } - if (checkbox) { - checkbox.x = itemX; - checkbox.y = itemY; - } - } - - /** - * Destroy a single legend item - * @param {Object} item The series or point - */ - function destroyItem(item) { - var checkbox = item.checkbox; - - // pull out from the array - //erase(allItems, item); - - // destroy SVG elements - each(['legendItem', 'legendLine', 'legendSymbol'], function(key) { - if (item[key]) { - item[key].destroy(); - } - }); - - if (checkbox) { - discardElement(item.checkbox); - } - - - } - - - /** - * Position the checkboxes after the width is determined - */ - function positionCheckboxes() { - each(allItems, function(item) { - var checkbox = item.checkbox; - if (checkbox) { - css(checkbox, { - left: (legendGroup.attr('translateX') + item.legendItemWidth + checkbox.x - 40) +PX, - top: (legendGroup.attr('translateY') + checkbox.y - 11) + PX - }); - } - }); - } - - /** - * Render a single specific legend item - * @param {Object} item A series or point - */ - function renderItem(item) { - var bBox, - itemWidth, - legendSymbol, - symbolX, - symbolY, - attribs, - simpleSymbol, - li = item.legendItem, - series = item.series || item, - i = allItems.length; - - - if (!li) { // generate it once, later move it - - // let these series types use a simple symbol - simpleSymbol = /^(bar|pie|area|column)$/.test(series.type); - - // generate the list item text - item.legendItem = li = renderer.text( - options.labelFormatter.call(item), - 0, - 0 - ) - .css(item.visible ? itemStyle : itemHiddenStyle) - .on('mouseover', function() { - item.setState(HOVER_STATE); - li.css(itemHoverStyle); - }) - .on('mouseout', function() { - li.css(item.visible ? itemStyle : itemHiddenStyle); - item.setState(); - }) - .on('click', function(event) { - var strLegendItemClick = 'legendItemClick', - fnLegendItemClick = function() { - item.setVisible(); - }; - - // click the name or symbol - if (item.firePointEvent) { // point - item.firePointEvent(strLegendItemClick, null, fnLegendItemClick); - } else { - fireEvent(item, strLegendItemClick, null, fnLegendItemClick); - } - }) - .attr({ zIndex: 2 }) - .add(legendGroup); - - // draw the line - if (!simpleSymbol && item.options && item.options.lineWidth) { - var itemOptions = item.options; - attribs = { - 'stroke-width': itemOptions.lineWidth, - zIndex: 2 - }; - if (itemOptions.dashStyle) { - attribs.dashstyle = itemOptions.dashStyle; - } - item.legendLine = renderer.path([ - M, - -symbolWidth - symbolPadding, - 0, - L, - -symbolPadding, - 0 - ]) - .attr(attribs) - .add(legendGroup); - } - - // draw a simple symbol - if (simpleSymbol) { // bar|pie|area|column - //legendLayer.drawRect( - legendSymbol = renderer.rect( - (symbolX = -symbolWidth - symbolPadding), - (symbolY = -11), - symbolWidth, - 12, - 2 - ).attr({ - 'stroke-width': 0, - zIndex: 3 - }).add(legendGroup); - } - - // draw the marker - else if (item.options && item.options.marker && item.options.marker.enabled) { - legendSymbol = renderer.symbol( - item.symbol, - (symbolX = -symbolWidth / 2 - symbolPadding), - (symbolY = -4), - item.options.marker.radius - ) - .attr(item.pointAttr[NORMAL_STATE]) - .attr({ zIndex: 3 }) - .add(legendGroup); - - - } - if (legendSymbol) { - legendSymbol.xOff = symbolX; - legendSymbol.yOff = symbolY; - } - - item.legendSymbol = legendSymbol; - - // colorize the items - colorizeItem(item, item.visible); - - - // add the HTML checkbox on top - if (item.options && item.options.showCheckbox) { - item.checkbox = createElement('input', { - type: 'checkbox', - checked: item.selected, - defaultChecked: item.selected // required by IE7 - }, options.itemCheckboxStyle, container); - - addEvent(item.checkbox, 'click', function(event) { - var target = event.target; - fireEvent(item, 'checkboxClick', { - checked: target.checked - }, - function() { - item.select(); - } - ); - }); - } - } - - - // calculate the positions for the next line - bBox = li.getBBox(); - - itemWidth = item.legendItemWidth = - options.itemWidth || symbolWidth + symbolPadding + bBox.width + rightPadding; - itemHeight = bBox.height; - - // if the item exceeds the width, start a new line - if (horizontal && itemX - initialItemX + itemWidth > - (widthOption || (chartWidth - 2 * padding - initialItemX))) { - itemX = initialItemX; - itemY += itemHeight; - } - lastItemY = itemY; - - // position the newly generated or reordered items - positionItem(item, itemX, itemY); - - // advance - if (horizontal) { - itemX += itemWidth; - } else { - itemY += itemHeight; - } - - // the width of the widest item - offsetWidth = widthOption || mathMax( - horizontal ? itemX - initialItemX : itemWidth, - offsetWidth - ); - - - - // add it all to an array to use below - allItems.push(item); - } - - /** - * Render the legend. This method can be called both before and after - * chart.render. If called after, it will only rearrange items instead - * of creating new ones. - */ - function renderLegend() { - itemX = initialItemX; - itemY = y; - offsetWidth = 0; - lastItemY = 0; - - allItems = []; - - if (!legendGroup) { - legendGroup = renderer.g('legend') - .attr({ zIndex: 7 }) - .add(); - } - - - // add HTML for each series - if (reversedLegend) { - series.reverse(); - } - each(series, function(serie) { - if (!serie.options.showInLegend) { - return; - } - - // use points or series for the legend item depending on legendType - var items = (serie.options.legendType == 'point') ? - serie.data : [serie]; - - // render all items - each(items, renderItem); - }); - if (reversedLegend) { // restore - series.reverse(); - } - - - - // Draw the border - legendWidth = widthOption || offsetWidth; - legendHeight = lastItemY - y + itemHeight; - - if (legendBorderWidth || legendBackgroundColor) { - legendWidth += 2 * padding; - legendHeight += 2 * padding; - - if (!box) { - box = renderer.rect( - 0, - 0, - legendWidth, - legendHeight, - options.borderRadius, - legendBorderWidth || 0 - ).attr({ - stroke: options.borderColor, - 'stroke-width': legendBorderWidth || 0, - fill: legendBackgroundColor || NONE - }) - .add(legendGroup) - .shadow(options.shadow); - - } else if (legendWidth > 0 && legendHeight > 0) { - box.animate( - box.crisp(null, null, null, legendWidth, legendHeight) - ); - } - - // hide the border if no items - box[allItems.length ? 'show' : 'hide'](); - } - - // 1.x compatibility: positioning based on style - var props = ['left', 'right', 'top', 'bottom'], - prop, - i = 4; - while(i--) { - prop = props[i]; - if (style[prop] && style[prop] != 'auto') { - options[i < 2 ? 'align' : 'verticalAlign'] = prop; - options[i < 2 ? 'x' : 'y'] = pInt(style[prop]) * (i % 2 ? -1 : 1); - } - } - - legendGroup.align(extend(options, { - width: legendWidth, - height: legendHeight - }), true, spacingBox); - - if (!isResizing) { - positionCheckboxes(); - } - } - - - // run legend - renderLegend(); - - // move checkboxes - addEvent(chart, 'endResize', positionCheckboxes); - - // expose - return { - colorizeItem: colorizeItem, - destroyItem: destroyItem, - renderLegend: renderLegend - }; - }; - - - - - - - /** - * Initialize an individual series, called internally before render time - */ - function initSeries(options) { - var type = options.type || optionsChart.type || optionsChart.defaultSeriesType, - typeClass = seriesTypes[type], - serie, - hasRendered = chart.hasRendered; - - // an inverted chart can't take a column series and vice versa - if (hasRendered) { - if (inverted && type == 'column') { - typeClass = seriesTypes.bar; - } else if (!inverted && type == 'bar') { - typeClass = seriesTypes.column; - } - } - - serie = new typeClass(); - - serie.init(chart, options); - - // set internal chart properties - if (!hasRendered && serie.inverted) { - inverted = true; - } - if (serie.isCartesian) { - hasCartesianSeries = serie.isCartesian; - } - - series.push(serie); - - return serie; - } - - /** - * Add a series dynamically after time - * - * @param {Object} options The config options - * @param {Boolean} redraw Whether to redraw the chart after adding. Defaults to true. - * @param {Boolean|Object} animation Whether to apply animation, and optionally animation - * configuration - * - * @return {Object} series The newly created series object - */ - function addSeries(options, redraw, animation) { - var series; - - if (options) { - setAnimation(animation, chart); - redraw = pick(redraw, true); // defaults to true - - fireEvent(chart, 'addSeries', { options: options }, function() { - series = initSeries(options); - series.isDirty = true; - - chart.isDirtyLegend = true; // the series array is out of sync with the display - if (redraw) { - chart.redraw(); - } - }); - } - - return series; - } - - /** - * Check whether a given point is within the plot area - * - * @param {Number} x Pixel x relative to the coordinateSystem - * @param {Number} y Pixel y relative to the coordinateSystem - */ - isInsidePlot = function(x, y) { - return x >= 0 && - x <= plotWidth && - y >= 0 && - y <= plotHeight; - }; - - /** - * Adjust all axes tick amounts - */ - function adjustTickAmounts() { - if (optionsChart.alignTicks !== false) { - each(axes, function(axis) { - axis.adjustTickAmount(); - }); - } - maxTicks = null; - } - - /** - * Redraw legend, axes or series based on updated data - * - * @param {Boolean|Object} animation Whether to apply animation, and optionally animation - * configuration - */ - function redraw(animation) { - var redrawLegend = chart.isDirtyLegend, - hasStackedSeries, - isDirtyBox = chart.isDirtyBox, // todo: check if it has actually changed? - seriesLength = series.length, - i = seriesLength, - clipRect = chart.clipRect, - serie; - - setAnimation(animation, chart); - - // link stacked series - while (i--) { - serie = series[i]; - if (serie.isDirty && serie.options.stacking) { - hasStackedSeries = true; - break; - } - } - if (hasStackedSeries) { // mark others as dirty - i = seriesLength; - while (i--) { - serie = series[i]; - if (serie.options.stacking) { - serie.isDirty = true; - } - } - } - - // handle updated data in the series - each(series, function(serie) { - if (serie.isDirty) { // prepare the data so axis can read it - serie.cleanData(); - serie.getSegments(); - - if (serie.options.legendType == 'point') { - redrawLegend = true; - } - } - }); - - // handle added or removed series - if (redrawLegend && legend.renderLegend) { // series or pie points are added or removed - // draw legend graphics - legend.renderLegend(); - - chart.isDirtyLegend = false; - } - - if (hasCartesianSeries) { - if (!isResizing) { - - // reset maxTicks - maxTicks = null; - - // set axes scales - each(axes, function(axis) { - axis.setScale(); - }); - } - adjustTickAmounts(); - getMargins(); - - // redraw axes - each(axes, function(axis) { - if (axis.isDirty || isDirtyBox) { - axis.redraw(); - isDirtyBox = true; // always redraw box to reflect changes in the axis labels - } - }); - - - } - - // the plot areas size has changed - if (isDirtyBox) { - drawChartBox(); - placeTrackerGroup(); - - // move clip rect - if (clipRect) { - stop(clipRect); - clipRect.animate({ // for chart resize - width: chart.plotSizeX, - height: chart.plotSizeY - }); - } - - } - - - // redraw affected series - each(series, function(serie) { - if (serie.isDirty && serie.visible && - (!serie.isCartesian || serie.xAxis)) { // issue #153 - serie.redraw(); - } - }); - - - // hide tooltip and hover states - if (tracker && tracker.resetTracker) { - tracker.resetTracker(); - } - - // fire the event - fireEvent(chart, 'redraw'); - } - - - - /** - * Dim the chart and show a loading text or symbol - * @param {String} str An optional text to show in the loading label instead of the default one - */ - function showLoading(str) { - var loadingOptions = options.loading; - - // create the layer at the first call - if (!loadingDiv) { - loadingDiv = createElement(DIV, { - className: 'highcharts-loading' - }, extend(loadingOptions.style, { - left: plotLeft + PX, - top: plotTop + PX, - width: plotWidth + PX, - height: plotHeight + PX, - zIndex: 10, - display: NONE - }), container); - - loadingSpan = createElement( - 'span', - null, - loadingOptions.labelStyle, - loadingDiv - ); - - } - - // update text - loadingSpan.innerHTML = str || options.lang.loading; - - // show it - if (!loadingShown) { - css(loadingDiv, { opacity: 0, display: '' }); - animate(loadingDiv, { - opacity: loadingOptions.style.opacity - }, { - duration: loadingOptions.showDuration - }); - loadingShown = true; - } - } - /** - * Hide the loading layer - */ - function hideLoading() { - animate(loadingDiv, { - opacity: 0 - }, { - duration: options.loading.hideDuration, - complete: function() { - css(loadingDiv, { display: NONE }); - } - }); - loadingShown = false; - } - - /** - * Get an axis, series or point object by id. - * @param id {String} The id as given in the configuration options - */ - function get(id) { - var i, - j, - data; - - // search axes - for (i = 0; i < axes.length; i++) { - if (axes[i].options.id == id) { - return axes[i]; - } - } - - // search series - for (i = 0; i < series.length; i++) { - if (series[i].options.id == id) { - return series[i]; - } - } - - // search points - for (i = 0; i < series.length; i++) { - data = series[i].data; - for (j = 0; j < data.length; j++) { - if (data[j].id == id) { - return data[j]; - } - } - } - return null; - } - - /** - * Create the Axis instances based on the config options - */ - function getAxes() { - var xAxisOptions = options.xAxis || {}, - yAxisOptions = options.yAxis || {}, - axis; - - // make sure the options are arrays and add some members - xAxisOptions = splat(xAxisOptions); - each(xAxisOptions, function(axis, i) { - axis.index = i; - axis.isX = true; - }); - - yAxisOptions = splat(yAxisOptions); - each(yAxisOptions, function(axis, i) { - axis.index = i; - }); - - // concatenate all axis options into one array - axes = xAxisOptions.concat(yAxisOptions); - - // loop the options and construct axis objects - chart.xAxis = []; - chart.yAxis = []; - axes = map(axes, function(axisOptions) { - axis = new Axis(chart, axisOptions); - chart[axis.isXAxis ? 'xAxis' : 'yAxis'].push(axis); - - return axis; - }); - - adjustTickAmounts(); - } - - - /** - * Get the currently selected points from all series - */ - function getSelectedPoints() { - var points = []; - each(series, function(serie) { - points = points.concat( grep( serie.data, function(point) { - return point.selected; - })); - }); - return points; - } - - /** - * Get the currently selected series - */ - function getSelectedSeries() { - return grep(series, function (serie) { - return serie.selected; - }); - } - - /** - * Zoom out to 1:1 - */ - zoomOut = function () { - fireEvent(chart, 'selection', { resetSelection: true }, zoom); - chart.toolbar.remove('zoom'); - - }; - /** - * Zoom into a given portion of the chart given by axis coordinates - * @param {Object} event - */ - zoom = function (event) { - - // add button to reset selection - var lang = defaultOptions.lang, - animate = chart.pointCount < 100; - chart.toolbar.add('zoom', lang.resetZoom, lang.resetZoomTitle, zoomOut); - - // if zoom is called with no arguments, reset the axes - if (!event || event.resetSelection) { - each(axes, function(axis) { - axis.setExtremes(null, null, false, animate); - }); - } - - // else, zoom in on all axes - else { - each(event.xAxis.concat(event.yAxis), function(axisData) { - var axis = axisData.axis; - - // don't zoom more than maxZoom - if (chart.tracker[axis.isXAxis ? 'zoomX' : 'zoomY']) { - axis.setExtremes(axisData.min, axisData.max, false, animate); - } - }); - } - - // redraw chart - redraw(); - }; - - /** - * Show the title and subtitle of the chart - * - * @param titleOptions {Object} New title options - * @param subtitleOptions {Object} New subtitle options - * - */ - function setTitle (titleOptions, subtitleOptions) { - - chartTitleOptions = merge(options.title, titleOptions); - chartSubtitleOptions = merge(options.subtitle, subtitleOptions); - - // add title and subtitle - each([ - ['title', titleOptions, chartTitleOptions], - ['subtitle', subtitleOptions, chartSubtitleOptions] - ], function(arr) { - var name = arr[0], - title = chart[name], - titleOptions = arr[1], - chartTitleOptions = arr[2]; - - if (title && titleOptions) { - title.destroy(); // remove old - title = null; - } - if (chartTitleOptions && chartTitleOptions.text && !title) { - chart[name] = renderer.text( - chartTitleOptions.text, - 0, - 0 - ) - .attr({ - align: chartTitleOptions.align, - 'class': 'highcharts-'+ name, - zIndex: 1 - }) - .css(chartTitleOptions.style) - .add() - .align(chartTitleOptions, false, spacingBox); - } - }); - - } - - /** - * Get chart width and height according to options and container size - */ - function getChartSize() { - - containerWidth = (renderToClone || renderTo).offsetWidth; - containerHeight = (renderToClone || renderTo).offsetHeight; - chart.chartWidth = chartWidth = optionsChart.width || containerWidth || 600; - chart.chartHeight = chartHeight = optionsChart.height || - // the offsetHeight of an empty container is 0 in standard browsers, but 19 in IE7: - (containerHeight > 19 ? containerHeight : 400); - } - - - /** - * Get the containing element, determine the size and create the inner container - * div to hold the chart - */ - function getContainer() { - renderTo = optionsChart.renderTo; - containerId = PREFIX + idCounter++; - - if (isString(renderTo)) { - renderTo = doc.getElementById(renderTo); - } - - // remove previous chart - renderTo.innerHTML = ''; - - // If the container doesn't have an offsetWidth, it has or is a child of a node - // that has display:none. We need to temporarily move it out to a visible - // state to determine the size, else the legend and tooltips won't render - // properly - if (!renderTo.offsetWidth) { - renderToClone = renderTo.cloneNode(0); - css(renderToClone, { - position: ABSOLUTE, - top: '-9999px', - display: '' - }); - doc.body.appendChild(renderToClone); - } - - // get the width and height - getChartSize(); - - // create the inner container - chart.container = container = createElement(DIV, { - className: 'highcharts-container' + - (optionsChart.className ? ' '+ optionsChart.className : ''), - id: containerId - }, extend({ - position: RELATIVE, - overflow: HIDDEN, // needed for context menu (avoid scrollbars) and - // content overflow in IE - width: chartWidth + PX, - height: chartHeight + PX, - textAlign: 'left' - }, optionsChart.style), - renderToClone || renderTo - ); - - chart.renderer = renderer = - optionsChart.forExport ? // force SVG, used for SVG export - new SVGRenderer(container, chartWidth, chartHeight, true) : - new Renderer(container, chartWidth, chartHeight); - - // Issue 110 workaround: - // In Firefox, if a div is positioned by percentage, its pixel position may land - // between pixels. The container itself doesn't display this, but an SVG element - // inside this container will be drawn at subpixel precision. In order to draw - // sharp lines, this must be compensated for. This doesn't seem to work inside - // iframes though (like in jsFiddle). - var subPixelFix, rect; - if (isFirefox && container.getBoundingClientRect) { - subPixelFix = function() { - css(container, { left: 0, top: 0 }); - rect = container.getBoundingClientRect(); - css(container, { - left: (-rect.left % 1) + PX, - top: (-rect.top % 1) + PX - }); - }; - - // run the fix now - subPixelFix(); - - // run it on resize - addEvent(win, 'resize', subPixelFix); - - // remove it on chart destroy - addEvent(chart, 'destroy', function() { - removeEvent(win, 'resize', subPixelFix); - }); - } - } - - /** - * Calculate margins by rendering axis labels in a preliminary position. Title, - * subtitle and legend have already been rendered at this stage, but will be - * moved into their final positions - */ - getMargins = function() { - var legendOptions = options.legend, - legendMargin = pick(legendOptions.margin, 10), - legendX = legendOptions.x, - legendY = legendOptions.y, - align = legendOptions.align, - verticalAlign = legendOptions.verticalAlign, - titleOffset; - - resetMargins(); - - // adjust for title and subtitle - if ((chart.title || chart.subtitle) && !defined(optionsMarginTop)) { - titleOffset = mathMax( - chart.title && !chartTitleOptions.floating && !chartTitleOptions.verticalAlign && chartTitleOptions.y || 0, - chart.subtitle && !chartSubtitleOptions.floating && !chartSubtitleOptions.verticalAlign && chartSubtitleOptions.y || 0 - ); - if (titleOffset) { - plotTop = mathMax(plotTop, titleOffset + pick(chartTitleOptions.margin, 15) + spacingTop); - } - } - // adjust for legend - if (legendOptions.enabled && !legendOptions.floating) { - if (align == 'right') { // horizontal alignment handled first - if (!defined(optionsMarginRight)) { - marginRight = mathMax( - marginRight, - legendWidth - legendX + legendMargin + spacingRight - ); - } - } else if (align == 'left') { - if (!defined(optionsMarginLeft)) { - plotLeft = mathMax( - plotLeft, - legendWidth + legendX + legendMargin + spacingLeft - ); - } - - } else if (verticalAlign == 'top') { - if (!defined(optionsMarginTop)) { - plotTop = mathMax( - plotTop, - legendHeight + legendY + legendMargin + spacingTop - ); - } - - } else if (verticalAlign == 'bottom') { - if (!defined(optionsMarginBottom)) { - marginBottom = mathMax( - marginBottom, - legendHeight - legendY + legendMargin + spacingBottom - ); - } - } - } - - // pre-render axes to get labels offset width - if (hasCartesianSeries) { - each(axes, function(axis) { - axis.getOffset(); - }); - } - - if (!defined(optionsMarginLeft)) { - plotLeft += axisOffset[3]; - } - if (!defined(optionsMarginTop)) { - plotTop += axisOffset[0]; - } - if (!defined(optionsMarginBottom)) { - marginBottom += axisOffset[2]; - } - if (!defined(optionsMarginRight)) { - marginRight += axisOffset[1]; - } - - setChartSize(); - - }; - - /** - * Add the event handlers necessary for auto resizing - * - */ - function initReflow() { - var reflowTimeout; - function reflow() { - var width = optionsChart.width || renderTo.offsetWidth, - height = optionsChart.height || renderTo.offsetHeight; - - if (width && height) { // means container is display:none - if (width != containerWidth || height != containerHeight) { - clearTimeout(reflowTimeout); - reflowTimeout = setTimeout(function() { - resize(width, height, false); - }, 100); - } - containerWidth = width; - containerHeight = height; - } - } - addEvent(window, 'resize', reflow); - addEvent(chart, 'destroy', function() { - removeEvent(window, 'resize', reflow); - }); - } - - /** - * Resize the chart to a given width and height - * @param {Number} width - * @param {Number} height - * @param {Object|Boolean} animation - */ - resize = function(width, height, animation) { - var chartTitle = chart.title, - chartSubtitle = chart.subtitle; - - isResizing += 1; - - // set the animation for the current process - setAnimation(animation, chart); - - oldChartHeight = chartHeight; - oldChartWidth = chartWidth; - chartWidth = mathRound(width); - chartHeight = mathRound(height); - - css(container, { - width: chartWidth + PX, - height: chartHeight + PX - }); - renderer.setSize(chartWidth, chartHeight, animation); - - // update axis lengths for more correct tick intervals: - plotWidth = chartWidth - plotLeft - marginRight; - plotHeight = chartHeight - plotTop - marginBottom; - - // handle axes - maxTicks = null; - each(axes, function(axis) { - axis.isDirty = true; - axis.setScale(); - }); - - // make sure non-cartesian series are also handled - each(series, function(serie) { - serie.isDirty = true; - }); - - chart.isDirtyLegend = true; // force legend redraw - chart.isDirtyBox = true; // force redraw of plot and chart border - - getMargins(); - - // move titles - if (chartTitle) { - chartTitle.align(null, null, spacingBox); - } - if (chartSubtitle) { - chartSubtitle.align(null, null, spacingBox); - } - - redraw(animation); - - - oldChartHeight = null; - fireEvent(chart, 'resize'); - - // fire endResize and set isResizing back - setTimeout(function() { - fireEvent(chart, 'endResize', null, function() { - isResizing -= 1; - }); - }, globalAnimation && globalAnimation.duration || 500); - }; - - /** - * Set the public chart properties. This is done before and after the pre-render - * to determine margin sizes - */ - setChartSize = function() { - - chart.plotLeft = plotLeft = mathRound(plotLeft); - chart.plotTop = plotTop = mathRound(plotTop); - chart.plotWidth = plotWidth = mathRound(chartWidth - plotLeft - marginRight); - chart.plotHeight = plotHeight = mathRound(chartHeight - plotTop - marginBottom); - - chart.plotSizeX = inverted ? plotHeight : plotWidth; - chart.plotSizeY = inverted ? plotWidth : plotHeight; - - spacingBox = { - x: spacingLeft, - y: spacingTop, - width: chartWidth - spacingLeft - spacingRight, - height: chartHeight - spacingTop - spacingBottom - }; - }; - - /** - * Initial margins before auto size margins are applied - */ - resetMargins = function() { - plotTop = pick(optionsMarginTop, spacingTop); - marginRight = pick(optionsMarginRight, spacingRight); - marginBottom = pick(optionsMarginBottom, spacingBottom); - plotLeft = pick(optionsMarginLeft, spacingLeft); - axisOffset = [0, 0, 0, 0]; // top, right, bottom, left - }; - - /** - * Draw the borders and backgrounds for chart and plot area - */ - drawChartBox = function() { - var chartBorderWidth = optionsChart.borderWidth || 0, - chartBackgroundColor = optionsChart.backgroundColor, - plotBackgroundColor = optionsChart.plotBackgroundColor, - plotBackgroundImage = optionsChart.plotBackgroundImage, - mgn, - plotSize = { - x: plotLeft, - y: plotTop, - width: plotWidth, - height: plotHeight - }; - - // Chart area - mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0); - - if (chartBorderWidth || chartBackgroundColor) { - if (!chartBackground) { - chartBackground = renderer.rect(mgn / 2, mgn / 2, chartWidth - mgn, chartHeight - mgn, - optionsChart.borderRadius, chartBorderWidth) - .attr({ - stroke: optionsChart.borderColor, - 'stroke-width': chartBorderWidth, - fill: chartBackgroundColor || NONE - }) - .add() - .shadow(optionsChart.shadow); - } else { // resize - chartBackground.animate( - chartBackground.crisp(null, null, null, chartWidth - mgn, chartHeight - mgn) - ); - } - } - - - // Plot background - if (plotBackgroundColor) { - if (!plotBackground) { - plotBackground = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0) - .attr({ - fill: plotBackgroundColor - }) - .add() - .shadow(optionsChart.plotShadow); - } else { - plotBackground.animate(plotSize); - } - } - if (plotBackgroundImage) { - if (!plotBGImage) { - plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight) - .add(); - } else { - plotBGImage.animate(plotSize); - } - } - - // Plot area border - if (optionsChart.plotBorderWidth) { - if (!plotBorder) { - plotBorder = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0, optionsChart.plotBorderWidth) - .attr({ - stroke: optionsChart.plotBorderColor, - 'stroke-width': optionsChart.plotBorderWidth, - zIndex: 4 - }) - .add(); - } else { - plotBorder.animate( - plotBorder.crisp(null, plotLeft, plotTop, plotWidth, plotHeight) - ); - } - } - - // reset - chart.isDirtyBox = false; - }; - - /** - * Render all graphics for the chart - */ - function render () { - var labels = options.labels, - credits = options.credits, - creditsHref; - - // Title - setTitle(); - - - // Legend - legend = chart.legend = new Legend(chart); - - // Get margins by pre-rendering axes - getMargins(); - each(axes, function(axis) { - axis.setTickPositions(true); // update to reflect the new margins - }); - adjustTickAmounts(); - getMargins(); // second pass to check for new labels - - - // Draw the borders and backgrounds - drawChartBox(); - - // Axes - if (hasCartesianSeries) { - each(axes, function(axis) { - axis.render(); - }); - } - - - // The series - if (!chart.seriesGroup) { - chart.seriesGroup = renderer.g('series-group') - .attr({ zIndex: 3 }) - .add(); - } - each(series, function(serie) { - serie.translate(); - serie.setTooltipPoints(); - serie.render(); - }); - - - // Labels - if (labels.items) { - each(labels.items, function() { - var style = extend(labels.style, this.style), - x = pInt(style.left) + plotLeft, - y = pInt(style.top) + plotTop + 12; - - // delete to prevent rewriting in IE - delete style.left; - delete style.top; - - renderer.text( - this.html, - x, - y - ) - .attr({ zIndex: 2 }) - .css(style) - .add(); - - }); - } - - // Toolbar (don't redraw) - if (!chart.toolbar) { - chart.toolbar = Toolbar(chart); - } - - // Credits - if (credits.enabled && !chart.credits) { - creditsHref = credits.href; - renderer.text( - credits.text, - 0, - 0 - ) - .on('click', function() { - if (creditsHref) { - location.href = creditsHref; - } - }) - .attr({ - align: credits.position.align, - zIndex: 8 - }) - .css(credits.style) - .add() - .align(credits.position); - } - - placeTrackerGroup(); - - // Set flag - chart.hasRendered = true; - - // If the chart was rendered outside the top container, put it back in - if (renderToClone) { - renderTo.appendChild(container); - discardElement(renderToClone); - //updatePosition(container); - } - } - - /** - * Clean up memory usage - */ - function destroy() { - var i = series.length, - parentNode = container && container.parentNode; - - // fire the chart.destoy event - fireEvent(chart, 'destroy'); - - // remove events - removeEvent(win, 'unload', destroy); - removeEvent(chart); - - each(axes, function(axis) { - removeEvent(axis); - }); - - // destroy each series - while (i--) { - series[i].destroy(); - } - - // remove container and all SVG - if (container) { // can break in IE when destroyed before finished loading - container.innerHTML = ''; - removeEvent(container); - if (parentNode) { - parentNode.removeChild(container); - } - - // IE6 leak - container = null; - } - - // IE7 leak - if (renderer) { // can break in IE when destroyed before finished loading - renderer.alignedObjects = null; - } - - // memory and CPU leak - clearInterval(tooltipInterval); - - // clean it all up - for (i in chart) { - delete chart[i]; - } - - } - /** - * Prepare for first rendering after all data are loaded - */ - function firstRender() { - - // VML namespaces can't be added until after complete. Listening - // for Perini's doScroll hack is not enough. - var onreadystatechange = 'onreadystatechange'; - if (!hasSVG && win == win.top && doc.readyState != 'complete') { - doc.attachEvent(onreadystatechange, function() { - doc.detachEvent(onreadystatechange, firstRender); - firstRender(); - }); - return; - } - - // create the container - getContainer(); - - resetMargins(); - setChartSize(); - - // Initialize the series - each(options.series || [], function(serieOptions) { - initSeries(serieOptions); - }); - - // Set the common inversion and transformation for inverted series after initSeries - chart.inverted = inverted = pick(inverted, options.chart.inverted); - - - getAxes(); - - - chart.render = render; - - // depends on inverted and on margins being set - chart.tracker = tracker = new MouseTracker(chart, options.tooltip); - - //globalAnimation = false; - render(); - - fireEvent(chart, 'load'); - - //globalAnimation = true; - - // run callbacks - if (callback) { - callback.apply(chart, [chart]); - } - each(chart.callbacks, function(fn) { - fn.apply(chart, [chart]); - }); - } - - // Run chart - - - - // Set to zero for each new chart - colorCounter = 0; - symbolCounter = 0; - - // Destroy the chart and free up memory. - addEvent(win, 'unload', destroy); - - // Set up auto resize - if (optionsChart.reflow !== false) { - addEvent(chart, 'load', initReflow); - } - - // Chart event handlers - if (chartEvents) { - for (eventType in chartEvents) { - addEvent(chart, eventType, chartEvents[eventType]); - } - } - - - chart.options = options; - chart.series = series; - - - - - - - // Expose methods and variables - chart.addSeries = addSeries; - chart.animation = pick(optionsChart.animation, true); - chart.destroy = destroy; - chart.get = get; - chart.getSelectedPoints = getSelectedPoints; - chart.getSelectedSeries = getSelectedSeries; - chart.hideLoading = hideLoading; - chart.isInsidePlot = isInsidePlot; - chart.redraw = redraw; - chart.setSize = resize; - chart.setTitle = setTitle; - chart.showLoading = showLoading; - chart.pointCount = 0; - /* - if ($) $(function() { - $container = $('#container'); - var origChartWidth, - origChartHeight; - if ($container) { - $('') - .insertBefore($container) - .click(function() { - if (origChartWidth === UNDEFINED) { - origChartWidth = chartWidth; - origChartHeight = chartHeight; - } - chart.resize(chartWidth *= 1.1, chartHeight *= 1.1); - }); - $('') - .insertBefore($container) - .click(function() { - if (origChartWidth === UNDEFINED) { - origChartWidth = chartWidth; - origChartHeight = chartHeight; - } - chart.resize(chartWidth *= 0.9, chartHeight *= 0.9); - }); - $('') - .insertBefore($container) - .click(function() { - if (origChartWidth === UNDEFINED) { - origChartWidth = chartWidth; - origChartHeight = chartHeight; - } - chart.resize(origChartWidth, origChartHeight); - }); - } - }) - */ - - - - - firstRender(); - - -} // end Chart - -// Hook for exporting module -Chart.prototype.callbacks = []; - -/** - * The Point object and prototype. Inheritable and used as base for PiePoint - */ -var Point = function() {}; -Point.prototype = { - - /** - * Initialize the point - * @param {Object} series The series object containing this point - * @param {Object} options The data in either number, array or object format - */ - init: function(series, options) { - var point = this, - defaultColors; - point.series = series; - point.applyOptions(options); - point.pointAttr = {}; - - if (series.options.colorByPoint) { - defaultColors = series.chart.options.colors; - if (!point.options) { - point.options = {}; - } - point.color = point.options.color = point.color || defaultColors[colorCounter++]; - - // loop back to zero - if (colorCounter >= defaultColors.length) { - colorCounter = 0; - } - } - - series.chart.pointCount++; - return point; - }, - /** - * Apply the options containing the x and y data and possible some extra properties. - * This is called on point init or from point.update. - * - * @param {Object} options - */ - applyOptions: function(options) { - var point = this, - series = point.series; - - point.config = options; - - // onedimensional array input - if (isNumber(options) || options === null) { - point.y = options; - } - - // object input - else if (isObject(options) && !isNumber(options.length)) { - - // copy options directly to point - extend(point, options); - point.options = options; - } - - // categorized data with name in first position - else if (isString(options[0])) { - point.name = options[0]; - point.y = options[1]; - } - - // two-dimentional array - else if (isNumber(options[0])) { - point.x = options[0]; - point.y = options[1]; - } - - /* - * If no x is set by now, get auto incremented value. All points must have an - * x value, however the y value can be null to create a gap in the series - */ - if (point.x === UNDEFINED) { - point.x = series.autoIncrement(); - } - - }, - - /** - * Destroy a point to clear memory. Its reference still stays in series.data. - */ - destroy: function() { - var point = this, - series = point.series, - prop; - - series.chart.pointCount--; - - if (point == series.chart.hoverPoint) { - point.onMouseOut(); - } - series.chart.hoverPoints = null; // remove reference - - // remove all events - removeEvent(point); - - each(['graphic', 'tracker', 'group', 'dataLabel', 'connector'], function(prop) { - if (point[prop]) { - point[prop].destroy(); - } - }); - - if (point.legendItem) { // pies have legend items - point.series.chart.legend.destroyItem(point); - } - - for (prop in point) { - point[prop] = null; - } - - - }, - - /** - * Toggle the selection status of a point - * @param {Boolean} selected Whether to select or unselect the point. - * @param {Boolean} accumulate Whether to add to the previous selection. By default, - * this happens if the control key (Cmd on Mac) was pressed during clicking. - */ - select: function(selected, accumulate) { - var point = this, - series = point.series, - chart = series.chart; - - point.selected = selected = pick(selected, !point.selected); - - //series.isDirty = true; - point.firePointEvent(selected ? 'select' : 'unselect'); - point.setState(selected && SELECT_STATE); - - // unselect all other points unless Ctrl or Cmd + click - if (!accumulate) { - each(chart.getSelectedPoints(), function (loopPoint) { - if (loopPoint.selected && loopPoint != point) { - loopPoint.selected = false; - loopPoint.setState(NORMAL_STATE); - loopPoint.firePointEvent('unselect'); - } - }); - } - - }, - - onMouseOver: function() { - var point = this, - chart = point.series.chart, - tooltip = chart.tooltip, - hoverPoint = chart.hoverPoint; - - // set normal state to previous series - if (hoverPoint && hoverPoint != point) { - hoverPoint.onMouseOut(); - } - - // trigger the event - point.firePointEvent('mouseOver'); - - // update the tooltip - if (tooltip && !tooltip.shared) { - tooltip.refresh(point); - } - - // hover this - point.setState(HOVER_STATE); - chart.hoverPoint = point; - }, - - onMouseOut: function() { - var point = this; - point.firePointEvent('mouseOut'); - - point.setState(); - point.series.chart.hoverPoint = null; - }, - - /** - * Extendable method for formatting each point's tooltip line - * - * @param {Boolean} useHeader Whether a common header is used for multiple series in the tooltip - * - * @return {String} A string to be concatenated in to the common tooltip text - */ - tooltipFormatter: function(useHeader) { - var point = this, - series = point.series; - - return ['', (point.name || series.name), ': ', - (!useHeader ? ('x = '+ (point.name || point.x) + ', ') : ''), - '', (!useHeader ? 'y = ' : '' ), point.y, '
    '].join(''); - - }, - - /** - * Get the formatted text for this point's data label - * - * @return {String} The formatted data label pseudo-HTML - */ - getDataLabelText: function() { - var point = this; - return this.series.options.dataLabels.formatter.call({ - x: point.x, - y: point.y, - series: point.series, - point: point, - percentage: point.percentage, - total: point.total || point.stackTotal - }); - }, - - /** - * Update the point with new options (typically x/y data) and optionally redraw the series. - * - * @param {Object} options Point options as defined in the series.data array - * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call - * @param {Boolean|Object} animation Whether to apply animation, and optionally animation - * configuration - * - */ - update: function(options, redraw, animation) { - var point = this, - series = point.series, - dataLabel = point.dataLabel, - graphic = point.graphic, - chart = series.chart; - - redraw = pick(redraw, true); - - // fire the event with a default handler of doing the update - point.firePointEvent('update', { options: options }, function() { - - point.applyOptions(options); - - if (dataLabel) { - dataLabel.attr({ - text: point.getDataLabelText() - }) - } - - // update visuals - if (isObject(options)) { - series.getAttribs(); - if (graphic) { - graphic.attr(point.pointAttr[series.state]); - } - } - - // redraw - series.isDirty = true; - if (redraw) { - chart.redraw(animation); - } - }); - }, - - /** - * Remove a point and optionally redraw the series and if necessary the axes - * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call - * @param {Boolean|Object} animation Whether to apply animation, and optionally animation - * configuration - */ - remove: function(redraw, animation) { - var point = this, - series = point.series, - chart = series.chart, - data = series.data; - - setAnimation(animation, chart); - redraw = pick(redraw, true); - - // fire the event with a default handler of removing the point - point.firePointEvent('remove', null, function() { - - erase(data, point); - - point.destroy(); - - - // redraw - series.isDirty = true; - if (redraw) { - chart.redraw(); - } - }); - - - }, - - /** - * Fire an event on the Point object. Must not be renamed to fireEvent, as this - * causes a name clash in MooTools - * @param {String} eventType - * @param {Object} eventArgs Additional event arguments - * @param {Function} defaultFunction Default event handler - */ - firePointEvent: function(eventType, eventArgs, defaultFunction) { - var point = this, - series = this.series, - seriesOptions = series.options; - - // load event handlers on demand to save time on mouseover/out - if (seriesOptions.point.events[eventType] || ( - point.options && point.options.events && point.options.events[eventType])) { - this.importEvents(); - } - - // add default handler if in selection mode - if (eventType == 'click' && seriesOptions.allowPointSelect) { - defaultFunction = function (event) { - // Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera - point.select(null, event.ctrlKey || event.metaKey || event.shiftKey); - }; - } - - fireEvent(this, eventType, eventArgs, defaultFunction); - }, - /** - * Import events from the series' and point's options. Only do it on - * demand, to save processing time on hovering. - */ - importEvents: function() { - if (!this.hasImportedEvents) { - var point = this, - options = merge(point.series.options.point, point.options), - events = options.events, - eventType; - - point.events = events; - - for (eventType in events) { - addEvent(point, eventType, events[eventType]); - } - this.hasImportedEvents = true; - - } - }, - - /** - * Set the point's state - * @param {String} state - */ - setState: function(state) { - var point = this, - series = point.series, - stateOptions = series.options.states, - markerOptions = defaultPlotOptions[series.type].marker && series.options.marker, - normalDisabled = markerOptions && !markerOptions.enabled, - markerStateOptions = markerOptions && markerOptions.states[state], - stateDisabled = markerStateOptions && markerStateOptions.enabled === false, - stateMarkerGraphic = series.stateMarkerGraphic, - chart = series.chart, - pointAttr = point.pointAttr; - - if (!state) { - state = NORMAL_STATE; // empty string - } - - if ( - // already has this state - state == point.state || - // selected points don't respond to hover - (point.selected && state != SELECT_STATE) || - // series' state options is disabled - (stateOptions[state] && stateOptions[state].enabled === false) || - // point marker's state options is disabled - (state && (stateDisabled || normalDisabled && !markerStateOptions.enabled)) - - ) { - return; - } - - // apply hover styles to the existing point - if (point.graphic) { - point.graphic.attr(pointAttr[state]); - } - // if a graphic is not applied to each point in the normal state, create a shared - // graphic for the hover state - else { - if (state) { - if (!stateMarkerGraphic) { - series.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.circle( - 0, 0, pointAttr[state].r - ) - .attr(pointAttr[state]) - .add(series.group); - } - - stateMarkerGraphic.translate( - point.plotX, - point.plotY - ); - } - - if (stateMarkerGraphic) { - stateMarkerGraphic[state ? 'show' : 'hide'](); - } - } - - point.state = state; - } -}; - -/** - * The base function which all other series types inherit from - * @param {Object} chart - * @param {Object} options - */ -var Series = function() {}; - -Series.prototype = { - - isCartesian: true, - type: 'line', - pointClass: Point, - pointAttrToOptions: { // mapping between SVG attributes and the corresponding options - stroke: 'lineColor', - 'stroke-width': 'lineWidth', - fill: 'fillColor', - r: 'radius' - }, - init: function(chart, options) { - var series = this, - eventType, - events, - //pointEvent, - index = chart.series.length; - - series.chart = chart; - options = series.setOptions(options); // merge with plotOptions - - // set some variables - extend(series, { - index: index, - options: options, - name: options.name || 'Series '+ (index + 1), - state: NORMAL_STATE, - pointAttr: {}, - visible: options.visible !== false, // true by default - selected: options.selected === true // false by default - }); - - // register event listeners - events = options.events; - for (eventType in events) { - addEvent(series, eventType, events[eventType]); - } - if ( - (events && events.click) || - (options.point && options.point.events && options.point.events.click) || - options.allowPointSelect - ) { - chart.runTrackerClick = true; - } - - series.getColor(); - series.getSymbol(); - - // set the data - series.setData(options.data, false); - - }, - - - /** - * Return an auto incremented x value based on the pointStart and pointInterval options. - * This is only used if an x value is not given for the point that calls autoIncrement. - */ - autoIncrement: function() { - var series = this, - options = series.options, - xIncrement = series.xIncrement; - - xIncrement = pick(xIncrement, options.pointStart, 0); - - series.pointInterval = pick(series.pointInterval, options.pointInterval, 1); - - series.xIncrement = xIncrement + series.pointInterval; - return xIncrement; - }, - - /** - * Sort the data and remove duplicates - */ - cleanData: function() { - var series = this, - chart = series.chart, - data = series.data, - closestPoints, - smallestInterval, - chartSmallestInterval = chart.smallestInterval, - interval, - i; - - // sort the data points - data.sort(function(a, b){ - return (a.x - b.x); - }); - - // remove points with equal x values - // record the closest distance for calculation of column widths - for (i = data.length - 1; i >= 0; i--) { - if (data[i - 1]) { - if (data[i - 1].x == data[i].x) { - data.splice(i - 1, 1); // remove the duplicate - } - - } - } - - - // find the closes pair of points - for (i = data.length - 1; i >= 0; i--) { - if (data[i - 1]) { - interval = data[i].x - data[i - 1].x; - if (smallestInterval === UNDEFINED || interval < smallestInterval) { - smallestInterval = interval; - closestPoints = i; - } - } - } - - if (chartSmallestInterval === UNDEFINED || smallestInterval < chartSmallestInterval) { - chart.smallestInterval = smallestInterval; - } - series.closestPoints = closestPoints; - }, - - /** - * Divide the series data into segments divided by null values. Also sort - * the data points and delete duplicate values. - */ - getSegments: function() { - var lastNull = -1, - segments = [], - data = this.data; - - // create the segments - each(data, function(point, i) { - if (point.y === null) { - if (i > lastNull + 1) { - segments.push(data.slice(lastNull + 1, i)); - } - lastNull = i; - } else if (i == data.length - 1) { // last value - segments.push(data.slice(lastNull + 1, i + 1)); - } - }); - this.segments = segments; - - - }, - /** - * Set the series options by merging from the options tree - * @param {Object} itemOptions - */ - setOptions: function(itemOptions) { - var plotOptions = this.chart.options.plotOptions, - options = merge( - plotOptions[this.type], - plotOptions.series, - itemOptions - ); - - return options; - - }, - /** - * Get the series' color - */ - getColor: function(){ - var defaultColors = this.chart.options.colors; - this.color = this.options.color || defaultColors[colorCounter++] || '#0000ff'; - if (colorCounter >= defaultColors.length) { - colorCounter = 0; - } - }, - /** - * Get the series' symbol - */ - getSymbol: function(){ - var defaultSymbols = this.chart.options.symbols, - symbol = this.options.marker.symbol || defaultSymbols[symbolCounter++]; - this.symbol = symbol; - if (symbolCounter >= defaultSymbols.length) { - symbolCounter = 0; - } - }, - - /** - * Add a point dynamically after chart load time - * @param {Object} options Point options as given in series.data - * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call - * @param {Boolean} shift If shift is true, a point is shifted off the start - * of the series as one is appended to the end. - * @param {Boolean|Object} animation Whether to apply animation, and optionally animation - * configuration - */ - addPoint: function(options, redraw, shift, animation) { - var series = this, - data = series.data, - graph = series.graph, - area = series.area, - chart = series.chart, - point = (new series.pointClass()).init(series, options); - - setAnimation(animation, chart); - - if (graph && shift) { // make graph animate sideways - graph.shift = shift; - } - if (area) { - area.shift = shift; - area.isArea = true; - } - - redraw = pick(redraw, true); - - data.push(point); - if (shift) { - data[0].remove(false); - } - - - // redraw - series.isDirty = true; - if (redraw) { - chart.redraw(); - } - }, - - /** - * Replace the series data with a new set of data - * @param {Object} data - * @param {Object} redraw - */ - setData: function(data, redraw) { - var series = this, - oldData = series.data, - initialColor = series.initialColor, - chart = series.chart, - i = oldData && oldData.length || 0; - - series.xIncrement = null; // reset for new data - if (defined(initialColor)) { // reset colors for pie - colorCounter = initialColor; - } - - data = map(splat(data || []), function(pointOptions) { - return (new series.pointClass()).init(series, pointOptions); - }); - - // destroy old points - while (i--) { - oldData[i].destroy(); - } - - // set the data - series.data = data; - - series.cleanData(); - series.getSegments(); - - // redraw - series.isDirty = true; - chart.isDirtyBox = true; - if (pick(redraw, true)) { - chart.redraw(false); - } - }, - - /** - * Remove a series and optionally redraw the chart - * - * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call - * @param {Boolean|Object} animation Whether to apply animation, and optionally animation - * configuration - */ - - remove: function(redraw, animation) { - var series = this, - chart = series.chart; - redraw = pick(redraw, true); - - if (!series.isRemoving) { /* prevent triggering native event in jQuery - (calling the remove function from the remove event) */ - series.isRemoving = true; - - // fire the event with a default handler of removing the point - fireEvent(series, 'remove', null, function() { - - - // destroy elements - series.destroy(); - - - // redraw - chart.isDirtyLegend = chart.isDirtyBox = true; - if (redraw) { - chart.redraw(animation); - } - }); - - } - series.isRemoving = false; - }, - - /** - * Translate data points from raw data values to chart specific positioning data - * needed later in drawPoints, drawGraph and drawTracker. - */ - translate: function() { - var series = this, - chart = series.chart, - stacking = series.options.stacking, - categories = series.xAxis.categories, - yAxis = series.yAxis, - data = series.data, - i = data.length; - - // do the translation - while (i--) { - var point = data[i], - xValue = point.x, - yValue = point.y, - yBottom = point.low, - stack = yAxis.stacks[(yValue < 0 ? '-' : '') + series.stackKey], - pointStack, - pointStackTotal; - point.plotX = series.xAxis.translate(xValue); - - // calculate the bottom y value for stacked series - if (stacking && series.visible && stack && stack[xValue]) { - pointStack = stack[xValue]; - pointStackTotal = pointStack.total; - pointStack.cum = yBottom = pointStack.cum - yValue; // start from top - yValue = yBottom + yValue; - - if (stacking == 'percent') { - yBottom = pointStackTotal ? yBottom * 100 / pointStackTotal : 0; - yValue = pointStackTotal ? yValue * 100 / pointStackTotal : 0; - } - - point.percentage = pointStackTotal ? point.y * 100 / pointStackTotal : 0; - point.stackTotal = pointStackTotal; - } - - if (defined(yBottom)) { - point.yBottom = yAxis.translate(yBottom, 0, 1); - } - - // set the y value - if (yValue !== null) { - point.plotY = yAxis.translate(yValue, 0, 1); - } - - // set client related positions for mouse tracking - point.clientX = chart.inverted ? - chart.plotHeight - point.plotX : - point.plotX; // for mouse tracking - - // some API data - point.category = categories && categories[point.x] !== UNDEFINED ? - categories[point.x] : point.x; - - } - }, - /** - * Memoize tooltip texts and positions - */ - setTooltipPoints: function (renew) { - var series = this, - chart = series.chart, - inverted = chart.inverted, - data = [], - plotSize = mathRound((inverted ? chart.plotTop : chart.plotLeft) + chart.plotSizeX), - low, - high, - tooltipPoints = []; // a lookup array for each pixel in the x dimension - - // renew - if (renew) { - series.tooltipPoints = null; - } - - // concat segments to overcome null values - each(series.segments, function(segment){ - data = data.concat(segment); - }); - - // loop the concatenated data and apply each point to all the closest - // pixel positions - if (series.xAxis && series.xAxis.reversed) { - data = data.reverse();//reverseArray(data); - } - - each(data, function(point, i) { - - low = data[i - 1] ? data[i - 1].high + 1 : 0; - high = point.high = data[i + 1] ? ( - mathFloor((point.plotX + (data[i + 1] ? - data[i + 1].plotX : plotSize)) / 2)) : - plotSize; - - while (low <= high) { - tooltipPoints[inverted ? plotSize - low++ : low++] = point; - } - }); - series.tooltipPoints = tooltipPoints; - }, - - - - - /** - * Series mouse over handler - */ - onMouseOver: function() { - var series = this, - chart = series.chart, - hoverSeries = chart.hoverSeries; - - if (!hasTouch && chart.mouseIsDown) { - return; - } - - // set normal state to previous series - if (hoverSeries && hoverSeries != series) { - hoverSeries.onMouseOut(); - } - - // trigger the event, but to save processing time, - // only if defined - if (series.options.events.mouseOver) { - fireEvent(series, 'mouseOver'); - } - - - // bring to front - // Todo: optimize. This is one of two operations slowing down the tooltip in Firefox. - // Can the tracking be done otherwise? - if (series.tracker) { - series.tracker.toFront(); - } - - // hover this - series.setState(HOVER_STATE); - chart.hoverSeries = series; - }, - - /** - * Series mouse out handler - */ - onMouseOut: function() { - // trigger the event only if listeners exist - var series = this, - options = series.options, - chart = series.chart, - tooltip = chart.tooltip, - hoverPoint = chart.hoverPoint; - - // trigger mouse out on the point, which must be in this series - if (hoverPoint) { - hoverPoint.onMouseOut(); - } - - // fire the mouse out event - if (series && options.events.mouseOut) { - fireEvent(series, 'mouseOut'); - } - - - // hide the tooltip - if (tooltip && !options.stickyTracking) { - tooltip.hide(); - } - - // set normal state - series.setState(); - chart.hoverSeries = null; - }, - - /** - * Animate in the series - */ - animate: function(init) { - var series = this, - chart = series.chart, - clipRect = series.clipRect, - animation = series.options.animation; - - if (animation && !isObject(animation)) { - animation = {}; - } - - if (init) { // initialize the animation - if (!clipRect.isAnimating) { // apply it only for one of the series - clipRect.attr( 'width', 0 ); - clipRect.isAnimating = true; - } - - } else { // run the animation - clipRect.animate({ - width: chart.plotSizeX - }, animation); - - // delete this function to allow it only once - this.animate = null; - } - }, - - - /** - * Draw the markers - */ - drawPoints: function(){ - var series = this, - pointAttr, - data = series.data, - chart = series.chart, - plotX, - plotY, - i, - point, - radius, - graphic; - - if (series.options.marker.enabled) { - i = data.length; - while (i--) { - point = data[i]; - plotX = point.plotX; - plotY = point.plotY; - graphic = point.graphic; - - // only draw the point if y is defined - if (plotY !== UNDEFINED && !isNaN(plotY)) { - - /* && removed this code because points stayed after zoom - point.plotX >= 0 && point.plotX <= chart.plotSizeX && - point.plotY >= 0 && point.plotY <= chart.plotSizeY*/ - - // shortcuts - pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE]; - radius = pointAttr.r; - - if (graphic) { // update - graphic.animate({ - x: plotX, - y: plotY, - r: radius - }); - } else { - point.graphic = chart.renderer.symbol( - pick(point.marker && point.marker.symbol, series.symbol), - plotX, - plotY, - radius - ) - .attr(pointAttr) - .add(series.group); - } - } - } - } - - }, - - /** - * Convert state properties from API naming conventions to SVG attributes - * - * @param {Object} options API options object - * @param {Object} base1 SVG attribute object to inherit from - * @param {Object} base2 Second level SVG attribute object to inherit from - */ - convertAttribs: function(options, base1, base2, base3) { - var conversion = this.pointAttrToOptions, - attr, - option, - obj = {}; - - options = options || {}; - base1 = base1 || {}; - base2 = base2 || {}; - base3 = base3 || {}; - - for (attr in conversion) { - option = conversion[attr]; - obj[attr] = pick(options[option], base1[attr], base2[attr], base3[attr]); - } - return obj; - }, - - /** - * Get the state attributes. Each series type has its own set of attributes - * that are allowed to change on a point's state change. Series wide attributes are stored for - * all series, and additionally point specific attributes are stored for all - * points with individual marker options. If such options are not defined for the point, - * a reference to the series wide attributes is stored in point.pointAttr. - */ - getAttribs: function() { - var series = this, - normalOptions = defaultPlotOptions[series.type].marker ? series.options.marker : series.options, - stateOptions = normalOptions.states, - stateOptionsHover = stateOptions[HOVER_STATE], - pointStateOptionsHover, - seriesColor = series.color, - normalDefaults = { - stroke: seriesColor, - fill: seriesColor - }, - data = series.data, - i, - point, - seriesPointAttr = [], - pointAttr, - pointAttrToOptions = series.pointAttrToOptions, - hasPointSpecificOptions; - - // series type specific modifications - if (series.options.marker) { // line, spline, area, areaspline, scatter - - // if no hover radius is given, default to normal radius + 2 - stateOptionsHover.radius = stateOptionsHover.radius || normalOptions.radius + 2; - stateOptionsHover.lineWidth = stateOptionsHover.lineWidth || normalOptions.lineWidth + 1; - - } else { // column, bar, pie - - // if no hover color is given, brighten the normal color - stateOptionsHover.color = stateOptionsHover.color || - Color(stateOptionsHover.color || seriesColor) - .brighten(stateOptionsHover.brightness).get(); - } - - // general point attributes for the series normal state - seriesPointAttr[NORMAL_STATE] = series.convertAttribs(normalOptions, normalDefaults); - - // HOVER_STATE and SELECT_STATE states inherit from normal state except the default radius - each([HOVER_STATE, SELECT_STATE], function(state) { - seriesPointAttr[state] = - series.convertAttribs(stateOptions[state], seriesPointAttr[NORMAL_STATE]); - }); - - // set it - series.pointAttr = seriesPointAttr; - - - // Generate the point-specific attribute collections if specific point - // options are given. If not, create a referance to the series wide point - // attributes - i = data.length; - while (i--) { - point = data[i]; - normalOptions = (point.options && point.options.marker) || point.options; - if (normalOptions && normalOptions.enabled === false) { - normalOptions.radius = 0; - } - hasPointSpecificOptions = false; - - // check if the point has specific visual options - if (point.options) { - for (var key in pointAttrToOptions) { - if (defined(normalOptions[pointAttrToOptions[key]])) { - hasPointSpecificOptions = true; - } - } - } - - - - // a specific marker config object is defined for the individual point: - // create it's own attribute collection - if (hasPointSpecificOptions) { - - pointAttr = []; - stateOptions = normalOptions.states || {}; // reassign for individual point - pointStateOptionsHover = stateOptions[HOVER_STATE] = stateOptions[HOVER_STATE] || {}; - - // if no hover color is given, brighten the normal color - if (!series.options.marker) { // column, bar, point - pointStateOptionsHover.color = - Color(pointStateOptionsHover.color || point.options.color) - .brighten(pointStateOptionsHover.brightness || - stateOptionsHover.brightness).get(); - - } - - // normal point state inherits series wide normal state - pointAttr[NORMAL_STATE] = series.convertAttribs(normalOptions, seriesPointAttr[NORMAL_STATE]); - - // inherit from point normal and series hover - pointAttr[HOVER_STATE] = series.convertAttribs( - stateOptions[HOVER_STATE], - seriesPointAttr[HOVER_STATE], - pointAttr[NORMAL_STATE] - ); - // inherit from point normal and series hover - pointAttr[SELECT_STATE] = series.convertAttribs( - stateOptions[SELECT_STATE], - seriesPointAttr[SELECT_STATE], - pointAttr[NORMAL_STATE] - ); - - - - // no marker config object is created: copy a reference to the series-wide - // attribute collection - } else { - pointAttr = seriesPointAttr; - } - - point.pointAttr = pointAttr; - - } - - }, - - - /** - * Clear DOM objects and free up memory - */ - destroy: function() { - var series = this, - chart = series.chart, - //chartSeries = series.chart.series, - clipRect = series.clipRect, - issue134 = /\/5[0-9\.]+ (Safari|Mobile)\//.test(userAgent), // todo: update when Safari bug is fixed - destroy, - prop; - - // remove all events - removeEvent(series); - - // remove legend items - if (series.legendItem) { - series.chart.legend.destroyItem(series); - } - - // destroy all points with their elements - each(series.data, function(point) { - point.destroy(); - }); - // destroy all SVGElements associated to the series - each(['area', 'graph', 'dataLabelsGroup', 'group', 'tracker'], function(prop) { - if (series[prop]) { - - // issue 134 workaround - destroy = issue134 && prop == 'group' ? - 'hide' : - 'destroy'; - - series[prop][destroy](); - } - }); - - // remove from hoverSeries - if (chart.hoverSeries == series) { - chart.hoverSeries = null; - } - erase(chart.series, series); - - // clear all members - for (prop in series) { - delete series[prop]; - } - }, - - /** - * Draw the data labels - */ - drawDataLabels: function() { - if (this.options.dataLabels.enabled) { - var series = this, - x, - y, - data = series.data, - options = series.options.dataLabels, - str, - dataLabelsGroup = series.dataLabelsGroup, - chart = series.chart, - inverted = chart.inverted, - seriesType = series.type, - color; - - // create a separate group for the data labels to avoid rotation - if (!dataLabelsGroup) { - dataLabelsGroup = series.dataLabelsGroup = - chart.renderer.g(PREFIX +'data-labels') - .attr({ - visibility: series.visible ? VISIBLE : HIDDEN, - zIndex: 5 - }) - .translate(chart.plotLeft, chart.plotTop) - .add(); - } - - // determine the color - color = options.color; - if (color == 'auto') { // 1.0 backwards compatibility - color = null; - } - options.style.color = pick(color, series.color); - - // make the labels for each point - each(data, function(point, i){ - var barX = point.barX, - plotX = barX && barX + point.barW / 2 || point.plotX || -999, - plotY = pick(point.plotY, -999), - dataLabel = point.dataLabel, - align = options.align; - - // get the string - str = point.getDataLabelText(); - x = (inverted ? chart.plotWidth - plotY : plotX) + options.x; - y = (inverted ? chart.plotHeight - plotX : plotY) + options.y; - - // in columns, align the string to the column - if (seriesType == 'column') { - x += { left: -1, right: 1 }[align] * point.barW / 2 || 0; - } - - - if (dataLabel) { - dataLabel.animate({ - x: x, - y: y - }); - } else if (defined(str)) { - dataLabel = point.dataLabel = chart.renderer.text( - str, - x, - y - ) - .attr({ - align: align, - rotation: options.rotation, - zIndex: 1 - }) - .css(options.style) - .add(dataLabelsGroup); - } - - // vertically centered - if (inverted && !options.y) { - dataLabel.attr({ - y: y + parseInt(dataLabel.styles.lineHeight) * 0.9 - dataLabel.getBBox().height / 2 - }); - } - - /*if (series.isCartesian) { - dataLabel[chart.isInsidePlot(plotX, plotY) ? 'show' : 'hide'](); - }*/ - - }); - } - }, - - /** - * Draw the actual graph - */ - drawGraph: function(state) { - var series = this, - options = series.options, - chart = series.chart, - graph = series.graph, - graphPath = [], - fillColor, - area = series.area, - group = series.group, - color = options.lineColor || series.color, - lineWidth = options.lineWidth, - dashStyle = options.dashStyle, - segmentPath, - renderer = chart.renderer, - translatedThreshold = series.yAxis.getThreshold(options.threshold || 0), - useArea = /^area/.test(series.type), - singlePoints = [], // used in drawTracker - areaPath = [], - attribs; - - - // divide into segments and build graph and area paths - each(series.segments, function(segment) { - segmentPath = []; - - // build the segment line - each(segment, function(point, i) { - - if (series.getPointSpline) { // generate the spline as defined in the SplineSeries object - segmentPath.push.apply(segmentPath, series.getPointSpline(segment, point, i)); - - } else { - - // moveTo or lineTo - segmentPath.push(i ? L : M); - - // step line? - if (i && options.step) { - var lastPoint = segment[i - 1]; - segmentPath.push( - point.plotX, - lastPoint.plotY - ); - } - - // normal line to next point - segmentPath.push( - point.plotX, - point.plotY - ); - } - }); - - // add the segment to the graph, or a single point for tracking - if (segment.length > 1) { - graphPath = graphPath.concat(segmentPath); - } else { - singlePoints.push(segment[0]); - } - - // build the area - if (useArea) { - var areaSegmentPath = [], - i, - segLength = segmentPath.length; - for (i = 0; i < segLength; i++) { - areaSegmentPath.push(segmentPath[i]); - } - if (segLength == 3) { // for animation from 1 to two points - areaSegmentPath.push(L, segmentPath[1], segmentPath[2]); - } - if (options.stacking && series.type != 'areaspline') { - // follow stack back. Todo: implement areaspline - for (i = segment.length - 1; i >= 0; i--) { - areaSegmentPath.push(segment[i].plotX, segment[i].yBottom); - } - - } else { // follow zero line back - areaSegmentPath.push( - L, - segment[segment.length - 1].plotX, - translatedThreshold, - L, - segment[0].plotX, - translatedThreshold - ); - } - areaPath = areaPath.concat(areaSegmentPath); - } - }); - - // used in drawTracker: - series.graphPath = graphPath; - series.singlePoints = singlePoints; - - // draw the area if area series or areaspline - if (useArea) { - fillColor = pick( - options.fillColor, - Color(series.color).setOpacity(options.fillOpacity || 0.75).get() - ); - if (area) { - area.animate({ d: areaPath }); - - } else { - // draw the area - series.area = series.chart.renderer.path(areaPath) - .attr({ - fill: fillColor - }).add(group); - } - } - - // draw the graph - if (graph) { - //graph.animate({ d: graphPath.join(' ') }); - graph.animate({ d: graphPath }); - - } else { - if (lineWidth) { - attribs = { - 'stroke': color, - 'stroke-width': lineWidth - }; - if (dashStyle) { - attribs.dashstyle = dashStyle; - } - - series.graph = renderer.path(graphPath) - .attr(attribs).add(group).shadow(options.shadow); - } - } - }, - - - /** - * Render the graph and markers - */ - render: function() { - var series = this, - chart = series.chart, - group, - setInvert, - options = series.options, - animation = options.animation, - doAnimation = animation && series.animate, - duration = doAnimation ? animation && animation.duration || 500 : 0, - clipRect = series.clipRect, - renderer = chart.renderer; - - - // Add plot area clipping rectangle. If this is before chart.hasRendered, - // create one shared clipRect. - if (!clipRect) { - clipRect = series.clipRect = !chart.hasRendered && chart.clipRect ? - chart.clipRect : - renderer.clipRect(0, 0, chart.plotSizeX, chart.plotSizeY); - if (!chart.clipRect) { - chart.clipRect = clipRect; - } - } - - - // the group - if (!series.group) { - group = series.group = renderer.g('series'); - - if (chart.inverted) { - setInvert = function() { - group.attr({ - width: chart.plotWidth, - height: chart.plotHeight - }).invert(); - }; - - setInvert(); // do it now - addEvent(chart, 'resize', setInvert); // do it on resize - } - group.clip(series.clipRect) - .attr({ - visibility: series.visible ? VISIBLE : HIDDEN, - zIndex: options.zIndex - }) - .translate(chart.plotLeft, chart.plotTop) - .add(chart.seriesGroup); - } - - series.drawDataLabels(); - - // initiate the animation - if (doAnimation) { - series.animate(true); - } - - // cache attributes for shapes - series.getAttribs(); - - // draw the graph if any - if (series.drawGraph) { - series.drawGraph(); - } - - // draw the points - series.drawPoints(); - - // draw the mouse tracking area - if (series.options.enableMouseTracking !== false) { - series.drawTracker(); - } - - // run the animation - if (doAnimation) { - series.animate(); - } - - // finish the individual clipRect - setTimeout(function() { - clipRect.isAnimating = false; - group = series.group; // can be destroyed during the timeout - if (group && clipRect != chart.clipRect && clipRect.renderer) { - group.clip((series.clipRect = chart.clipRect)); - clipRect.destroy(); - } - }, duration); - - - series.isDirty = false; // means data is in accordance with what you see - - }, - - /** - * Redraw the series after an update in the axes. - */ - redraw: function() { - var series = this, - chart = series.chart, - clipRect = series.clipRect, - group = series.group; - - /*if (clipRect) { - stop(clipRect); - clipRect.animate({ // for chart resize - width: chart.plotSizeX, - height: chart.plotSizeY - }); - }*/ - - // reposition on resize - if (group) { - if (chart.inverted) { - group.attr({ - width: chart.plotWidth, - height: chart.plotHeight - }); - } - - group.animate({ - translateX: chart.plotLeft, - translateY: chart.plotTop - }); - } - - series.translate(); - series.setTooltipPoints(true); - series.render(); - }, - - /** - * Set the state of the graph - */ - setState: function(state) { - var series = this, - options = series.options, - graph = series.graph, - stateOptions = options.states, - lineWidth = options.lineWidth; - - state = state || NORMAL_STATE; - - if (series.state != state) { - series.state = state; - - if (stateOptions[state] && stateOptions[state].enabled === false) { - return; - } - - if (state) { - lineWidth = stateOptions[state].lineWidth || lineWidth + 1; - } - - if (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML - graph.attr({ // use attr because animate will cause any other animation on the graph to stop - 'stroke-width': lineWidth - }, state ? 0 : 500); - } - } - }, - - /** - * Set the visibility of the graph - * - * @param vis {Boolean} True to show the series, false to hide. If UNDEFINED, - * the visibility is toggled. - */ - setVisible: function(vis, redraw) { - var series = this, - chart = series.chart, - legendItem = series.legendItem, - seriesGroup = series.group, - seriesTracker = series.tracker, - dataLabelsGroup = series.dataLabelsGroup, - showOrHide, - i, - data = series.data, - point, - ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries, - oldVisibility = series.visible; - - // if called without an argument, toggle visibility - series.visible = vis = vis === UNDEFINED ? !oldVisibility : vis; - showOrHide = vis ? 'show' : 'hide'; - - // show or hide series - if (seriesGroup) { // pies don't have one - seriesGroup[showOrHide](); - } - - // show or hide trackers - if (seriesTracker) { - seriesTracker[showOrHide](); - } else { - i = data.length; - while (i--) { - point = data[i]; - if (point.tracker) { - point.tracker[showOrHide](); - } - } - } - - - if (dataLabelsGroup) { - dataLabelsGroup[showOrHide](); - } - - if (legendItem) { - chart.legend.colorizeItem(series, vis); - } - - - // rescale or adapt to resized chart - series.isDirty = true; - // in a stack, all other series are affected - if (series.options.stacking) { - each(chart.series, function(otherSeries) { - if (otherSeries.options.stacking && otherSeries.visible) { - otherSeries.isDirty = true; - } - }); - } - - if (ignoreHiddenSeries) { - chart.isDirtyBox = true; - } - if (redraw !== false) { - chart.redraw(); - } - - fireEvent(series, showOrHide); - }, - - /** - * Show the graph - */ - show: function() { - this.setVisible(true); - }, - - /** - * Hide the graph - */ - hide: function() { - this.setVisible(false); - }, - - - /** - * Set the selected state of the graph - * - * @param selected {Boolean} True to select the series, false to unselect. If - * UNDEFINED, the selection state is toggled. - */ - select: function(selected) { - var series = this; - // if called without an argument, toggle - series.selected = selected = (selected === UNDEFINED) ? !series.selected : selected; - - if (series.checkbox) { - series.checkbox.checked = selected; - } - - fireEvent(series, selected ? 'select' : 'unselect'); - }, - - - /** - * Draw the tracker object that sits above all data labels and markers to - * track mouse events on the graph or points. For the line type charts - * the tracker uses the same graphPath, but with a greater stroke width - * for better control. - */ - drawTracker: function() { - var series = this, - options = series.options, - trackerPath = [].concat(series.graphPath), - trackerPathLength = trackerPath.length, - chart = series.chart, - snap = chart.options.tooltip.snap, - tracker = series.tracker, - cursor = options.cursor, - css = cursor && { cursor: cursor }, - singlePoints = series.singlePoints, - singlePoint, - i; - - // Extend end points. A better way would be to use round linecaps, - // but those are not clickable in VML. - if (trackerPathLength) { - i = trackerPathLength + 1; - while (i--) { - if (trackerPath[i] == M) { // extend left side - trackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], L); - } - if ((i && trackerPath[i] == M) || i == trackerPathLength) { // extend right side - trackerPath.splice(i, 0, L, trackerPath[i - 2] + snap, trackerPath[i - 1]); - } - } - } - - // handle single points - for (i = 0; i < singlePoints.length; i++) { - singlePoint = singlePoints[i]; - trackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY, - L, singlePoint.plotX + snap, singlePoint.plotY); - } - - // draw the tracker - if (tracker) { - tracker.attr({ d: trackerPath }); - - } else { // create - series.tracker = chart.renderer.path(trackerPath) - .attr({ - isTracker: true, - stroke: TRACKER_FILL, - fill: NONE, - 'stroke-width' : options.lineWidth + 2 * snap, - visibility: series.visible ? VISIBLE : HIDDEN, - zIndex: 1 - }) - .on(hasTouch ? 'touchstart' : 'mouseover', function() { - if (chart.hoverSeries != series) { - series.onMouseOver(); - } - }) - .on('mouseout', function() { - if (!options.stickyTracking) { - series.onMouseOut(); - } - }) - .css(css) - .add(chart.trackerGroup); - } - - } - -}; // end Series prototype - - -/** - * LineSeries object - */ -var LineSeries = extendClass(Series); -seriesTypes.line = LineSeries; - -/** - * AreaSeries object - */ -var AreaSeries = extendClass(Series, { - type: 'area' -}); -seriesTypes.area = AreaSeries; - - - - -/** - * SplineSeries object - */ -var SplineSeries = extendClass( Series, { - type: 'spline', - - /** - * Draw the actual graph - */ - getPointSpline: function(segment, point, i) { - var smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc - denom = smoothing + 1, - plotX = point.plotX, - plotY = point.plotY, - lastPoint = segment[i - 1], - nextPoint = segment[i + 1], - leftContX, - leftContY, - rightContX, - rightContY, - ret; - - // find control points - if (i && i < segment.length - 1) { - var lastX = lastPoint.plotX, - lastY = lastPoint.plotY, - nextX = nextPoint.plotX, - nextY = nextPoint.plotY, - correction; - - leftContX = (smoothing * plotX + lastX) / denom; - leftContY = (smoothing * plotY + lastY) / denom; - rightContX = (smoothing * plotX + nextX) / denom; - rightContY = (smoothing * plotY + nextY) / denom; - - // have the two control points make a straight line through main point - correction = ((rightContY - leftContY) * (rightContX - plotX)) / - (rightContX - leftContX) + plotY - rightContY; - - leftContY += correction; - rightContY += correction; - - // to prevent false extremes, check that control points are between - // neighbouring points' y values - if (leftContY > lastY && leftContY > plotY) { - leftContY = mathMax(lastY, plotY); - rightContY = 2 * plotY - leftContY; // mirror of left control point - } else if (leftContY < lastY && leftContY < plotY) { - leftContY = mathMin(lastY, plotY); - rightContY = 2 * plotY - leftContY; - } - if (rightContY > nextY && rightContY > plotY) { - rightContY = mathMax(nextY, plotY); - leftContY = 2 * plotY - rightContY; - } else if (rightContY < nextY && rightContY < plotY) { - rightContY = mathMin(nextY, plotY); - leftContY = 2 * plotY - rightContY; - } - - // record for drawing in next point - point.rightContX = rightContX; - point.rightContY = rightContY; - - } - - // moveTo or lineTo - if (!i) { - ret = [M, plotX, plotY]; - } - - // curve from last point to this - else { - ret = [ - 'C', - lastPoint.rightContX || lastPoint.plotX, - lastPoint.rightContY || lastPoint.plotY, - leftContX || plotX, - leftContY || plotY, - plotX, - plotY - ]; - lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later - } - return ret; - } -}); -seriesTypes.spline = SplineSeries; - - - -/** - * AreaSplineSeries object - */ -var AreaSplineSeries = extendClass(SplineSeries, { - type: 'areaspline' -}); -seriesTypes.areaspline = AreaSplineSeries; - -/** - * ColumnSeries object - */ -var ColumnSeries = extendClass(Series, { - type: 'column', - pointAttrToOptions: { // mapping between SVG attributes and the corresponding options - stroke: 'borderColor', - 'stroke-width': 'borderWidth', - fill: 'color', - r: 'borderRadius' - }, - init: function() { - Series.prototype.init.apply(this, arguments); - - var series = this, - chart = series.chart; - - // flag the chart in order to pad the x axis - chart.hasColumn = true; - - // if the series is added dynamically, force redraw of other - // series affected by a new column - if (chart.hasRendered) { - each(chart.series, function(otherSeries) { - if (otherSeries.type == series.type) { - otherSeries.isDirty = true; - } - }); - } - }, - - /** - * Translate each point to the plot area coordinate system and find shape positions - */ - translate: function() { - var series = this, - chart = series.chart, - columnCount = 0, - reversedXAxis = series.xAxis.reversed, - categories = series.xAxis.categories, - stackGroups = {}, - stackKey, - columnIndex; - - Series.prototype.translate.apply(series); - - // Get the total number of column type series. - // This is called on every series. Consider moving this logic to a - // chart.orderStacks() function and call it on init, addSeries and removeSeries - each(chart.series, function(otherSeries) { - if (otherSeries.type == series.type) { - if (otherSeries.options.stacking) { - stackKey = otherSeries.stackKey; - if (stackGroups[stackKey] === UNDEFINED) { - stackGroups[stackKey] = columnCount++; - } - columnIndex = stackGroups[stackKey]; - } else if (otherSeries.visible){ - columnIndex = columnCount++; - } - otherSeries.columnIndex = columnIndex; - } - }); - - // calculate the width and position of each column based on - // the number of column series in the plot, the groupPadding - // and the pointPadding options - var options = series.options, - data = series.data, - closestPoints = series.closestPoints, - categoryWidth = mathAbs( - data[1] ? data[closestPoints].plotX - data[closestPoints - 1].plotX : - chart.plotSizeX / (categories ? categories.length : 1) - ), - groupPadding = categoryWidth * options.groupPadding, - groupWidth = categoryWidth - 2 * groupPadding, - pointOffsetWidth = groupWidth / columnCount, - optionPointWidth = options.pointWidth, - pointPadding = defined(optionPointWidth) ? (pointOffsetWidth - optionPointWidth) / 2 : - pointOffsetWidth * options.pointPadding, - pointWidth = mathMax(pick(optionPointWidth, pointOffsetWidth - 2 * pointPadding), 1), - colIndex = (reversedXAxis ? columnCount - - series.columnIndex : series.columnIndex) || 0, - pointXOffset = pointPadding + (groupPadding + colIndex * - pointOffsetWidth -(categoryWidth / 2)) * - (reversedXAxis ? -1 : 1), - threshold = options.threshold || 0, - translatedThreshold = series.yAxis.getThreshold(threshold), - minPointLength = pick(options.minPointLength, 5); - - // record the new values - each(data, function(point) { - var plotY = point.plotY, - yBottom = point.yBottom || translatedThreshold, - barX = point.plotX + pointXOffset, - barY = mathCeil(mathMin(plotY, yBottom)), - barH = mathCeil(mathMax(plotY, yBottom) - barY), - trackerY; - - // handle options.minPointLength and tracker for small points - if (mathAbs(barH) < minPointLength) { - if (minPointLength) { - barH = minPointLength; - barY = - mathAbs(barY - translatedThreshold) > minPointLength ? // stacked - yBottom - minPointLength : // keep position - translatedThreshold - (plotY <= translatedThreshold ? minPointLength : 0); - } - trackerY = barY - 3; - } - - extend(point, { - barX: barX, - barY: barY, - barW: pointWidth, - barH: barH - }); - point.shapeType = 'rect'; - point.shapeArgs = { - x: barX, - y: barY, - width: pointWidth, - height: barH, - r: options.borderRadius - }; - - // make small columns responsive to mouse - point.trackerArgs = defined(trackerY) && merge(point.shapeArgs, { - height: mathMax(6, barH + 3), - y: trackerY - }); - }); - - }, - - getSymbol: function(){ - }, - - /** - * Columns have no graph - */ - drawGraph: function() {}, - - /** - * Draw the columns. For bars, the series.group is rotated, so the same coordinates - * apply for columns and bars. This method is inherited by scatter series. - * - */ - drawPoints: function() { - var series = this, - options = series.options, - renderer = series.chart.renderer, - graphic, - shapeArgs; - - - // draw the columns - each(series.data, function(point) { - var plotY = point.plotY; - if (plotY !== UNDEFINED && !isNaN(plotY)) { - graphic = point.graphic; - shapeArgs = point.shapeArgs; - if (graphic) { // update - stop(graphic); - graphic.animate(shapeArgs); - - } else { - point.graphic = renderer[point.shapeType](shapeArgs) - .attr(point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE]) - .add(series.group) - .shadow(options.shadow); - } - - } - }); - }, - /** - * Draw the individual tracker elements. - * This method is inherited by scatter and pie charts too. - */ - drawTracker: function() { - var series = this, - chart = series.chart, - renderer = chart.renderer, - shapeArgs, - tracker, - trackerLabel = +new Date(), - cursor = series.options.cursor, - css = cursor && { cursor: cursor }, - rel; - - each(series.data, function(point) { - tracker = point.tracker; - shapeArgs = point.trackerArgs || point.shapeArgs; - if (point.y !== null) { - if (tracker) {// update - tracker.attr(shapeArgs); - - } else { - point.tracker = - renderer[point.shapeType](shapeArgs) - .attr({ - isTracker: trackerLabel, - fill: TRACKER_FILL, - visibility: series.visible ? VISIBLE : HIDDEN, - zIndex: 1 - }) - .on(hasTouch ? 'touchstart' : 'mouseover', function(event) { - rel = event.relatedTarget || event.fromElement; - if (chart.hoverSeries != series && attr(rel, 'isTracker') != trackerLabel) { - series.onMouseOver(); - } - point.onMouseOver(); - - }) - .on('mouseout', function(event) { - if (!series.options.stickyTracking) { - rel = event.relatedTarget || event.toElement; - if (attr(rel, 'isTracker') != trackerLabel) { - series.onMouseOut(); - } - } - }) - .css(css) - .add(chart.trackerGroup); - } - } - }); - }, - - - /** - * Animate the column heights one by one from zero - * @param {Boolean} init Whether to initialize the animation or run it - */ - animate: function(init) { - var series = this, - data = series.data; - - if (!init) { // run the animation - /* - * Note: Ideally the animation should be initialized by calling - * series.group.hide(), and then calling series.group.show() - * after the animation was started. But this rendered the shadows - * invisible in IE8 standards mode. If the columns flicker on large - * datasets, this is the cause. - */ - - each(data, function(point) { - var graphic = point.graphic; - - if (graphic) { - // start values - graphic.attr({ - height: 0, - y: series.yAxis.translate(0, 0, 1) - }); - - // animate - graphic.animate({ - height: point.barH, - y: point.barY - }, series.options.animation); - } - }); - - - // delete this function to allow it only once - series.animate = null; - } - - }, - /** - * Remove this series from the chart - */ - remove: function() { - var series = this, - chart = series.chart; - - // column and bar series affects other series of the same type - // as they are either stacked or grouped - if (chart.hasRendered) { - each(chart.series, function(otherSeries) { - if (otherSeries.type == series.type) { - otherSeries.isDirty = true; - } - }); - } - - Series.prototype.remove.apply(series, arguments); - } -}); -seriesTypes.column = ColumnSeries; - -var BarSeries = extendClass(ColumnSeries, { - type: 'bar', - init: function(chart) { - chart.inverted = this.inverted = true; - ColumnSeries.prototype.init.apply(this, arguments); - } -}); -seriesTypes.bar = BarSeries; - -/** - * The scatter series class - */ -var ScatterSeries = extendClass(Series, { - type: 'scatter', - - /** - * Extend the base Series' translate method by adding shape type and - * arguments for the point trackers - */ - translate: function() { - var series = this; - - Series.prototype.translate.apply(series); - - each(series.data, function(point) { - point.shapeType = 'circle'; - point.shapeArgs = { - x: point.plotX, - y: point.plotY, - r: series.chart.options.tooltip.snap - }; - }); - }, - - - /** - * Create individual tracker elements for each point - */ - //drawTracker: ColumnSeries.prototype.drawTracker, - drawTracker: function() { - var series = this, - cursor = series.options.cursor, - css = cursor && { cursor: cursor }, - graphic; - - each(series.data, function(point) { - graphic = point.graphic; - if (graphic) { // doesn't exist for null points - graphic - .attr({ isTracker: true }) - .on('mouseover', function(event) { - series.onMouseOver(); - point.onMouseOver(); - }) - .on('mouseout', function(event) { - if (!series.options.stickyTracking) { - series.onMouseOut(); - } - }) - .css(css); - } - }); - - }, - - /** - * Cleaning the data is not necessary in a scatter plot - */ - cleanData: function() {} -}); -seriesTypes.scatter = ScatterSeries; - -/** - * Extended point object for pies - */ -var PiePoint = extendClass(Point, { - /** - * Initiate the pie slice - */ - init: function () { - - Point.prototype.init.apply(this, arguments); - - var point = this, - toggleSlice; - - //visible: options.visible !== false, - extend(point, { - visible: point.visible !== false, - name: pick(point.name, 'Slice') - }); - - // add event listener for select - toggleSlice = function() { - point.slice(); - }; - addEvent(point, 'select', toggleSlice); - addEvent(point, 'unselect', toggleSlice); - - return point; - }, - - /** - * Toggle the visibility of the pie slice - * @param {Boolean} vis Whether to show the slice or not. If undefined, the - * visibility is toggled - */ - setVisible: function(vis) { - var point = this, - chart = point.series.chart, - tracker = point.tracker, - dataLabel = point.dataLabel, - connector = point.connector, - method; - - // if called without an argument, toggle visibility - point.visible = vis = vis === UNDEFINED ? !point.visible : vis; - - method = vis ? 'show' : 'hide'; - - point.group[method](); - if (tracker) { - tracker[method](); - } - if (dataLabel) { - dataLabel[method](); - } - if (connector) { - connector[method](); - } - if (point.legendItem) { - chart.legend.colorizeItem(point, vis); - } - }, - - /** - * Set or toggle whether the slice is cut out from the pie - * @param {Boolean} sliced When undefined, the slice state is toggled - * @param {Boolean} redraw Whether to redraw the chart. True by default. - */ - slice: function(sliced, redraw, animation) { - var point = this, - series = point.series, - chart = series.chart, - slicedTranslation = point.slicedTranslation; - - setAnimation(animation, chart); - - // redraw is true by default - redraw = pick(redraw, true); - - // if called without an argument, toggle - sliced = point.sliced = defined(sliced) ? sliced : !point.sliced; - - point.group.animate({ - translateX: (sliced ? slicedTranslation[0] : chart.plotLeft), - translateY: (sliced ? slicedTranslation[1] : chart.plotTop) - }); - - } -}); - -/** - * The Pie series class - */ -var PieSeries = extendClass(Series, { - type: 'pie', - isCartesian: false, - pointClass: PiePoint, - pointAttrToOptions: { // mapping between SVG attributes and the corresponding options - stroke: 'borderColor', - 'stroke-width': 'borderWidth', - fill: 'color' - }, - - /** - * Pies have one color each point - */ - getColor: function() { - // record first color for use in setData - this.initialColor = colorCounter; - }, - - /** - * Animate the column heights one by one from zero - * @param {Boolean} init Whether to initialize the animation or run it - */ - animate: function(init) { - var series = this, - data = series.data; - - each(data, function(point) { - var graphic = point.graphic, - args = point.shapeArgs, - up = -mathPI / 2; - - if (graphic) { - // start values - graphic.attr({ - r: 0, - start: up, - end: up - }); - - // animate - graphic.animate({ - r: args.r, - start: args.start, - end: args.end - }, series.options.animation); - } - }); - - // delete this function to allow it only once - series.animate = null; - - }, - /** - * Do translation for pie slices - */ - translate: function() { - var total = 0, - series = this, - cumulative = -0.25, // start at top - precision = 1000, // issue #172 - options = series.options, - slicedOffset = options.slicedOffset, - connectorOffset = slicedOffset + options.borderWidth, - positions = options.center, - chart = series.chart, - plotWidth = chart.plotWidth, - plotHeight = chart.plotHeight, - start, - end, - angle, - data = series.data, - circ = 2 * mathPI, - fraction, - smallestSize = mathMin(plotWidth, plotHeight), - isPercent, - radiusX, // the x component of the radius vector for a given point - radiusY, - labelDistance = options.dataLabels.distance; - - // get positions - either an integer or a percentage string must be given - positions.push(options.size, options.innerSize || 0); - positions = map(positions, function(length, i) { - - isPercent = /%$/.test(length); - return isPercent ? - // i == 0: centerX, relative to width - // i == 1: centerY, relative to height - // i == 2: size, relative to smallestSize - [plotWidth, plotHeight, smallestSize, smallestSize][i] * - pInt(length) / 100: - length; - }); - - // utility for getting the x value from a given y, used for anticollision logic in data labels - series.getX = function(y, left) { - - angle = math.asin((y - positions[1]) / (positions[2] / 2 + labelDistance)); - - return positions[0] + - (left ? -1 : 1) * - (mathCos(angle) * (positions[2] / 2 + labelDistance)); - }; - - // set center for later use - series.center = positions; - - // get the total sum - each(data, function(point) { - total += point.y; - }); - - each(data, function(point) { - // set start and end angle - fraction = total ? point.y / total : 0; - start = mathRound(cumulative * circ * precision) / precision; - cumulative += fraction; - end = mathRound(cumulative * circ * precision) / precision; - - // set the shape - point.shapeType = 'arc'; - point.shapeArgs = { - x: positions[0], - y: positions[1], - r: positions[2] / 2, - innerR: positions[3] / 2, - start: start, - end: end - }; - - // center for the sliced out slice - angle = (end + start) / 2; - point.slicedTranslation = map([ - mathCos(angle) * slicedOffset + chart.plotLeft, - mathSin(angle) * slicedOffset + chart.plotTop - ], mathRound); - - // set the anchor point for tooltips - radiusX = mathCos(angle) * positions[2] / 2; - radiusY = mathSin(angle) * positions[2] / 2; - point.tooltipPos = [ - positions[0] + radiusX * 0.7, - positions[1] + radiusY * 0.7 - ]; - - // set the anchor point for data labels - point.labelPos = [ - positions[0] + radiusX + mathCos(angle) * labelDistance, // first break of connector - positions[1] + radiusY + mathSin(angle) * labelDistance, // a/a - positions[0] + radiusX + mathCos(angle) * connectorOffset, // second break, right outside pie - positions[1] + radiusY + mathSin(angle) * connectorOffset, // a/a - positions[0] + radiusX, // landing point for connector - positions[1] + radiusY, // a/a - labelDistance < 0 ? // alignment - 'center' : - angle < circ / 4 ? 'left' : 'right', // alignment - angle // center angle - ]; - - - // API properties - point.percentage = fraction * 100; - point.total = total; - - }); - - this.setTooltipPoints(); - }, - - /** - * Render the slices - */ - render: function() { - var series = this; - - // cache attributes for shapes - series.getAttribs(); - - this.drawPoints(); - - // draw the mouse tracking area - if (series.options.enableMouseTracking !== false) { - series.drawTracker(); - } - - this.drawDataLabels(); - - if (series.options.animation && series.animate) { - series.animate(); - } - - series.isDirty = false; // means data is in accordance with what you see - }, - - /** - * Draw the data points - */ - drawPoints: function() { - var series = this, - chart = series.chart, - renderer = chart.renderer, - groupTranslation, - //center, - graphic, - group, - shapeArgs; - - // draw the slices - each(series.data, function(point) { - graphic = point.graphic; - shapeArgs = point.shapeArgs; - group = point.group; - - // create the group the first time - if (!group) { - group = point.group = renderer.g('point') - .attr({ zIndex: 5 }) - .add(); - } - - // if the point is sliced, use special translation, else use plot area traslation - groupTranslation = point.sliced ? point.slicedTranslation : [chart.plotLeft, chart.plotTop]; - group.translate(groupTranslation[0], groupTranslation[1]) - - - // draw the slice - if (graphic) { - graphic.animate(shapeArgs); - } else { - point.graphic = - renderer.arc(shapeArgs) - .attr(extend( - point.pointAttr[NORMAL_STATE], - { 'stroke-linejoin': 'round' } - )) - .add(point.group); - } - - // detect point specific visibility - if (point.visible === false) { - point.setVisible(false); - } - - }); - - }, - - /** - * Override the base drawDataLabels method by pie specific functionality - */ - drawDataLabels: function() { - var series = this, - data = series.data, - point, - chart = series.chart, - options = series.options.dataLabels, - connectorPadding = pick(options.connectorPadding, 10), - connectorWidth = pick(options.connectorWidth, 1), - connector, - connectorPath, - outside = options.distance > 0, - dataLabel, - labelPos, - labelHeight, - lastY, - centerY = series.center[1], - quarters = [// divide the points into quarters for anti collision - [], // top right - [], // bottom right - [], // bottom left - [] // top left - ], - x, - y, - visibility, - overlapping, - rankArr, - secondPass, - sign, - lowerHalf, - sort, - i = 4, - j; - - // run parent method - Series.prototype.drawDataLabels.apply(series); - - // arrange points for detection collision - each(data, function(point) { - var angle = point.labelPos[7], - quarter; - if (angle < 0) { - quarter = 0; - } else if (angle < mathPI / 2) { - quarter = 1; - } else if (angle < mathPI) { - quarter = 2; - } else { - quarter = 3; - } - quarters[quarter].push(point); - }); - quarters[1].reverse(); - quarters[3].reverse(); - - // define the sorting algorithm - sort = function(a,b) { - return a.y > b.y; - }; - /* Loop over the points in each quartile, starting from the top and bottom - * of the pie to detect overlapping labels. - */ - while (i--) { - overlapping = 0; - - // create an array for sorting and ranking the points within each quarter - rankArr = [].concat(quarters[i]); - rankArr.sort(sort); - j = rankArr.length; - while (j--) { - rankArr[j].rank = j; - } - - /* In the first pass, count the number of overlapping labels. In the second - * pass, remove the labels with lowest rank/values. - */ - for (secondPass = 0; secondPass < 2; secondPass++) { - lowerHalf = i % 3; - lastY = lowerHalf ? 9999 : -9999; - sign = lowerHalf ? -1 : 1; - - for (j = 0; j < quarters[i].length; j++) { - point = quarters[i][j]; - - if ((dataLabel = point.dataLabel)) { - labelPos = point.labelPos; - visibility = VISIBLE; - x = labelPos[0]; - y = labelPos[1]; - - - // assume all labels have equal height - if (!labelHeight) { - labelHeight = dataLabel && dataLabel.getBBox().height; - } - - // anticollision - if (outside) { - if (secondPass && point.rank < overlapping) { - visibility = HIDDEN; - } else if ((!lowerHalf && y < lastY + labelHeight) || - (lowerHalf && y > lastY - labelHeight)) { - y = lastY + sign * labelHeight; - x = series.getX(y, i > 1); - if ((!lowerHalf && y + labelHeight > centerY) || - (lowerHalf && y -labelHeight < centerY)) { - if (secondPass) { - visibility = HIDDEN; - } else { - overlapping++; - } - } - } - } - - if (point.visible === false) { - visibility = HIDDEN; - } - - if (visibility == VISIBLE) { - lastY = y; - } - - if (secondPass) { - - // move or place the data label - dataLabel - .attr({ - visibility: visibility, - align: labelPos[6] - }) - [dataLabel.moved ? 'animate' : 'attr']({ - x: x + options.x + - ({ left: connectorPadding, right: -connectorPadding }[labelPos[6]] || 0), - y: y + options.y - }); - dataLabel.moved = true; - - // draw the connector - if (outside && connectorWidth) { - connector = point.connector; - - connectorPath = [ - M, - x + (labelPos[6] == 'left' ? 5 : -5), y, // end of the string at the label - L, - x, y, // first break, next to the label - L, - labelPos[2], labelPos[3], // second break - L, - labelPos[4], labelPos[5] // base - ]; - - if (connector) { - connector.animate({ d: connectorPath }); - connector.attr('visibility', visibility); - - } else { - point.connector = connector = series.chart.renderer.path(connectorPath).attr({ - 'stroke-width': connectorWidth, - stroke: options.connectorColor || '#606060', - visibility: visibility, - zIndex: 3 - }) - .translate(chart.plotLeft, chart.plotTop) - .add(); - } - } - } - } - } - } - } - }, - - /** - * Draw point specific tracker objects. Inherit directly from column series. - */ - drawTracker: ColumnSeries.prototype.drawTracker, - - /** - * Pies don't have point marker symbols - */ - getSymbol: function() {} - -}); -seriesTypes.pie = PieSeries; - - -// global variables -win.Highcharts = { - Chart: Chart, - dateFormat: dateFormat, - pathAnim: pathAnim, - getOptions: getOptions, - numberFormat: numberFormat, - Point: Point, - Color: Color, - Renderer: Renderer, - seriesTypes: seriesTypes, - setOptions: setOptions, - Series: Series, - - // Expose utility funcitons for modules - addEvent: addEvent, - createElement: createElement, - discardElement: discardElement, - css: css, - each: each, - extend: extend, - map: map, - merge: merge, - pick: pick, - extendClass: extendClass, - version: '2.1.4' -}; -})(); - diff --git a/DeveloperAdoption/public/static/Highcharts-2/js/modules/exporting.js b/DeveloperAdoption/public/static/Highcharts-2/js/modules/exporting.js deleted file mode 100644 index 792c127..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/js/modules/exporting.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - Highcharts JS v2.1.4 (2011-03-02) - Exporting module - - (c) 2010 Torstein H?nsi - - License: www.highcharts.com/license -*/ -(function(){var k=Highcharts,y=k.Chart,C=k.addEvent,r=k.createElement,z=k.discardElement,u=k.css,w=k.merge,s=k.each,p=k.extend,D=Math.max,q=document,E=window,A="ontouchstart"in q.documentElement,B=k.setOptions({lang:{downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",exportButtonTitle:"Export to raster or vector image",printButtonTitle:"Print the chart"}});B.navigation={menuStyle:{border:"1px solid #A0A0A0", -background:"#FFFFFF"},menuItemStyle:{padding:"0 5px",background:"none",color:"#303030",fontSize:A?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{align:"right",backgroundColor:{linearGradient:[0,0,0,20],stops:[[0.4,"#F7F7F7"],[0.6,"#E3E3E3"]]},borderColor:"#B0B0B0",borderRadius:3,borderWidth:1,height:20,hoverBorderColor:"#909090",hoverSymbolFill:"#81A7CF",hoverSymbolStroke:"#4572A5",symbolFill:"#E0E0E0",symbolStroke:"#A0A0A0",symbolX:11.5,symbolY:10.5,verticalAlign:"top", -width:24,y:10}};B.exporting={type:"image/png",url:"http://export.highcharts.com/",width:800,buttons:{exportButton:{symbol:"exportIcon",x:-10,symbolFill:"#A8BF77",hoverSymbolFill:"#768F3E",_titleKey:"exportButtonTitle",menuItems:[{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}, -printButton:{symbol:"printIcon",x:-36,symbolFill:"#B5C9DF",hoverSymbolFill:"#779ABF",_titleKey:"printButtonTitle",onclick:function(){this.print()}}}};p(y.prototype,{getSVG:function(b){var c=this,a,f,d,i,e,h,j=w(c.options,b);if(!q.createElementNS)q.createElementNS=function(l,g){var n=q.createElement(g);n.getBBox=function(){return c.renderer.Element.prototype.getBBox.apply({element:n})};return n};a=r("div",null,{position:"absolute",top:"-9999em",width:c.chartWidth+"px",height:c.chartHeight+"px"},q.body); -p(j.chart,{renderTo:a,forExport:true});j.exporting.enabled=false;j.chart.plotBackgroundImage=null;j.series=[];s(c.series,function(l){d=l.options;d.animation=false;d.showCheckbox=false;if(d&&d.marker&&/^url\(/.test(d.marker.symbol))d.marker.symbol="circle";d.data=[];s(l.data,function(g){i=g.config;e={x:g.x,y:g.y,name:g.name};typeof i=="object"&&g.config&&i.constructor!=Array&&p(e,i);d.data.push(e);(h=g.config&&g.config.marker)&&/^url\(/.test(h.symbol)&&delete h.symbol});j.series.push(d)});b=new Highcharts.Chart(j); -f=b.container.innerHTML;j=null;b.destroy();z(a);f=f.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/isTracker="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/id=([^" >]+)/g,'id="$1"').replace(/class=([^" ]+)/g,'class="$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(l){return l.toLowerCase()});f=f.replace(/(url\(#highcharts-[0-9]+)"/g,"$1").replace(/"/g, -"'");if(f.match(/ xmlns="/g).length==2)f=f.replace(/xmlns="[^"]+"/,"");return f},exportChart:function(b,c){var a,f=this.getSVG(c);b=w(this.options.exporting,b);a=r("form",{method:"post",action:b.url},{display:"none"},q.body);s(["filename","type","width","svg"],function(d){r("input",{type:"hidden",name:d,value:{filename:b.filename||"chart",type:b.type,width:b.width,svg:f}[d]},null,a)});a.submit();z(a)},print:function(){var b=this,c=b.container,a=[],f=c.parentNode,d=q.body,i=d.childNodes;if(!b.isPrinting){b.isPrinting= -true;s(i,function(e,h){if(e.nodeType==1){a[h]=e.style.display;e.style.display="none"}});d.appendChild(c);E.print();setTimeout(function(){f.appendChild(c);s(i,function(e,h){if(e.nodeType==1)e.style.display=a[h]});b.isPrinting=false},1E3)}},contextMenu:function(b,c,a,f,d,i){var e=this,h=e.options.navigation,j=h.menuItemStyle,l=e.chartWidth,g=e.chartHeight,n="cache-"+b,m=e[n],o=D(d,i),t,x;if(!m){e[n]=m=r("div",{className:"highcharts-"+b},{position:"absolute",zIndex:1E3,padding:o+"px"},e.container);t= -r("div",null,p({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},h.menuStyle),m);x=function(){u(m,{display:"none"})};C(m,"mouseleave",x);s(c,function(v){if(v)r("div",{onmouseover:function(){u(this,h.menuItemHoverStyle)},onmouseout:function(){u(this,j)},innerHTML:v.text||k.getOptions().lang[v.textKey]},p({cursor:"pointer"},j),t)[A?"ontouchstart":"onclick"]=function(){x();v.onclick.apply(e,arguments)}});e.exportMenuWidth=m.offsetWidth;e.exportMenuHeight= -m.offsetHeight}b={display:"block"};if(a+e.exportMenuWidth>l)b.right=l-a-d-o+"px";else b.left=a-o+"px";if(f+i+e.exportMenuHeight>g)b.bottom=g-f-o+"px";else b.top=f+i-o+"px";u(m,b)},addButton:function(b){function c(){g.attr(o);l.attr(m)}var a=this,f=a.renderer,d=w(a.options.navigation.buttonOptions,b),i=d.onclick,e=d.menuItems,h=d.width,j=d.height,l,g,n;b=d.borderWidth;var m={stroke:d.borderColor},o={stroke:d.symbolStroke,fill:d.symbolFill};if(d.enabled!==false){l=f.rect(0,0,h,j,d.borderRadius,b).align(d, -true).attr(p({fill:d.backgroundColor,"stroke-width":b,zIndex:19},m)).add();n=f.rect(0,0,h,j,0).align(d).attr({fill:"rgba(255, 255, 255, 0.001)",title:k.getOptions().lang[d._titleKey],zIndex:21}).css({cursor:"pointer"}).on("mouseover",function(){g.attr({stroke:d.hoverSymbolStroke,fill:d.hoverSymbolFill});l.attr({stroke:d.hoverBorderColor})}).on("mouseout",c).on("click",c).add();if(e)i=function(){c();var t=n.getBBox();a.contextMenu("export-menu",e,t.x,t.y,h,j)};n.on("click",function(){i.apply(a,arguments)}); -g=f.symbol(d.symbol,d.symbolX,d.symbolY,(d.symbolSize||12)/2).align(d,true).attr(p(o,{"stroke-width":d.symbolStrokeWidth||1,zIndex:20})).add()}}});k.Renderer.prototype.symbols.exportIcon=function(b,c,a){return["M",b-a,c+a,"L",b+a,c+a,b+a,c+a*0.5,b-a,c+a*0.5,"Z","M",b,c+a*0.5,"L",b-a*0.5,c-a/3,b-a/6,c-a/3,b-a/6,c-a,b+a/6,c-a,b+a/6,c-a/3,b+a*0.5,c-a/3,"Z"]};k.Renderer.prototype.symbols.printIcon=function(b,c,a){return["M",b-a,c+a*0.5,"L",b+a,c+a*0.5,b+a,c-a/3,b-a,c-a/3,"Z","M",b-a*0.5,c-a/3,"L",b-a* -0.5,c-a,b+a*0.5,c-a,b+a*0.5,c-a/3,"Z","M",b-a*0.5,c+a*0.5,"L",b-a*0.75,c+a,b+a*0.75,c+a,b+a*0.5,c+a*0.5,"Z"]};y.prototype.callbacks.push(function(b){var c,a=b.options.exporting,f=a.buttons;if(a.enabled!==false)for(c in f)b.addButton(f[c])})})(); diff --git a/DeveloperAdoption/public/static/Highcharts-2/js/modules/exporting.src.js b/DeveloperAdoption/public/static/Highcharts-2/js/modules/exporting.src.js deleted file mode 100644 index 4577f67..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/js/modules/exporting.src.js +++ /dev/null @@ -1,673 +0,0 @@ -/** - * @license Highcharts JS v2.1.4 (2011-03-02) - * Exporting module - * - * (c) 2010 Torstein Hønsi - * - * License: www.highcharts.com/license - */ - -// JSLint options: -/*global Highcharts, document, window, Math, setTimeout */ - -(function() { // encapsulate - -// create shortcuts -var HC = Highcharts, - Chart = HC.Chart, - addEvent = HC.addEvent, - createElement = HC.createElement, - discardElement = HC.discardElement, - css = HC.css, - merge = HC.merge, - each = HC.each, - extend = HC.extend, - math = Math, - mathMax = math.max, - doc = document, - win = window, - hasTouch = 'ontouchstart' in doc.documentElement, - M = 'M', - L = 'L', - DIV = 'div', - HIDDEN = 'hidden', - NONE = 'none', - PREFIX = 'highcharts-', - ABSOLUTE = 'absolute', - PX = 'px', - - - - // Add language and get the defaultOptions - defaultOptions = HC.setOptions({ - lang: { - downloadPNG: 'Download PNG image', - downloadJPEG: 'Download JPEG image', - downloadPDF: 'Download PDF document', - downloadSVG: 'Download SVG vector image', - exportButtonTitle: 'Export to raster or vector image', - printButtonTitle: 'Print the chart' - } - }); - -// Buttons and menus are collected in a separate config option set called 'navigation'. -// This can be extended later to add control buttons like zoom and pan right click menus. -defaultOptions.navigation = { - menuStyle: { - border: '1px solid #A0A0A0', - background: '#FFFFFF' - }, - menuItemStyle: { - padding: '0 5px', - background: NONE, - color: '#303030', - fontSize: hasTouch ? '14px' : '11px' - }, - menuItemHoverStyle: { - background: '#4572A5', - color: '#FFFFFF' - }, - - buttonOptions: { - align: 'right', - backgroundColor: { - linearGradient: [0, 0, 0, 20], - stops: [ - [0.4, '#F7F7F7'], - [0.6, '#E3E3E3'] - ] - }, - borderColor: '#B0B0B0', - borderRadius: 3, - borderWidth: 1, - //enabled: true, - height: 20, - hoverBorderColor: '#909090', - hoverSymbolFill: '#81A7CF', - hoverSymbolStroke: '#4572A5', - symbolFill: '#E0E0E0', - //symbolSize: 12, - symbolStroke: '#A0A0A0', - //symbolStrokeWidth: 1, - symbolX: 11.5, - symbolY: 10.5, - verticalAlign: 'top', - width: 24, - y: 10 - } -}; - - - -// Add the export related options -defaultOptions.exporting = { - //enabled: true, - //filename: 'chart', - type: 'image/png', - url: 'http://export.highcharts.com/', - width: 800, - buttons: { - exportButton: { - //enabled: true, - symbol: 'exportIcon', - x: -10, - symbolFill: '#A8BF77', - hoverSymbolFill: '#768F3E', - _titleKey: 'exportButtonTitle', - menuItems: [{ - textKey: 'downloadPNG', - onclick: function() { - this.exportChart(); - } - }, { - textKey: 'downloadJPEG', - onclick: function() { - this.exportChart({ - type: 'image/jpeg' - }); - } - }, { - textKey: 'downloadPDF', - onclick: function() { - this.exportChart({ - type: 'application/pdf' - }); - } - }, { - textKey: 'downloadSVG', - onclick: function() { - this.exportChart({ - type: 'image/svg+xml' - }); - } - }/*, { - text: 'View SVG', - onclick: function() { - var svg = this.getSVG() - .replace(//g, '>'); - - doc.body.innerHTML = '
    '+ svg +'
    '; - } - }*/] - - }, - printButton: { - //enabled: true, - symbol: 'printIcon', - x: -36, - symbolFill: '#B5C9DF', - hoverSymbolFill: '#779ABF', - _titleKey: 'printButtonTitle', - onclick: function() { - this.print(); - } - } - } -}; - - - -extend(Chart.prototype, { - /** - * Return an SVG representation of the chart - * - * @param additionalOptions {Object} Additional chart options for the generated SVG representation - */ - getSVG: function(additionalOptions) { - var chart = this, - chartCopy, - sandbox, - svg, - seriesOptions, - config, - pointOptions, - pointMarker, - options = merge(chart.options, additionalOptions); // copy the options and add extra options - - // IE compatibility hack for generating SVG content that it doesn't really understand - if (!doc.createElementNS) { - doc.createElementNS = function(ns, tagName) { - var elem = doc.createElement(tagName); - elem.getBBox = function() { - return chart.renderer.Element.prototype.getBBox.apply({ element: elem }); - }; - return elem; - }; - } - - // create a sandbox where a new chart will be generated - sandbox = createElement(DIV, null, { - position: ABSOLUTE, - top: '-9999em', - width: chart.chartWidth + PX, - height: chart.chartHeight + PX - }, doc.body); - - // override some options - extend(options.chart, { - renderTo: sandbox, - forExport: true - }); - options.exporting.enabled = false; // hide buttons in print - options.chart.plotBackgroundImage = null; // the converter doesn't handle images - // prepare for replicating the chart - options.series = []; - each(chart.series, function(serie) { - seriesOptions = serie.options; - - seriesOptions.animation = false; // turn off animation - seriesOptions.showCheckbox = false; - - // remove image markers - if (seriesOptions && seriesOptions.marker && /^url\(/.test(seriesOptions.marker.symbol)) { - seriesOptions.marker.symbol = 'circle'; - } - - seriesOptions.data = []; - - each(serie.data, function(point) { - - // extend the options by those values that can be expressed in a number or array config - config = point.config; - pointOptions = { - x: point.x, - y: point.y, - name: point.name - }; - - if (typeof config == 'object' && point.config && config.constructor != Array) { - extend(pointOptions, config); - } - - seriesOptions.data.push(pointOptions); // copy fresh updated data - - // remove image markers - pointMarker = point.config && point.config.marker; - if (pointMarker && /^url\(/.test(pointMarker.symbol)) { - delete pointMarker.symbol; - } - }); - - options.series.push(seriesOptions); - }); - - // generate the chart copy - chartCopy = new Highcharts.Chart(options); - - // get the SVG from the container's innerHTML - svg = chartCopy.container.innerHTML; - - // free up memory - options = null; - chartCopy.destroy(); - discardElement(sandbox); - - // sanitize - svg = svg - .replace(/zIndex="[^"]+"/g, '') - .replace(/isShadow="[^"]+"/g, '') - .replace(/symbolName="[^"]+"/g, '') - .replace(/jQuery[0-9]+="[^"]+"/g, '') - .replace(/isTracker="[^"]+"/g, '') - .replace(/url\([^#]+#/g, 'url(#') - /*.replace(/')*/ - /* This fails in IE < 8 - .replace(/([0-9]+)\.([0-9]+)/g, function(s1, s2, s3) { // round off to save weight - return s2 +'.'+ s3[0]; - })*/ - - // IE specific - .replace(/id=([^" >]+)/g, 'id="$1"') - .replace(/class=([^" ]+)/g, 'class="$1"') - .replace(/ transform /g, ' ') - .replace(/:(path|rect)/g, '$1') - .replace(/style="([^"]+)"/g, function(s) { - return s.toLowerCase(); - }); - - // IE9 beta bugs with innerHTML. Test again with final IE9. - svg = svg.replace(/(url\(#highcharts-[0-9]+)"/g, '$1') - .replace(/"/g, "'"); - if (svg.match(/ xmlns="/g).length == 2) { - svg = svg.replace(/xmlns="[^"]+"/, ''); - } - - return svg; - }, - - /** - * Submit the SVG representation of the chart to the server - * @param {Object} options Exporting options. Possible members are url, type and width. - * @param {Object} chartOptions Additional chart options for the SVG representation of the chart - */ - exportChart: function(options, chartOptions) { - var form, - chart = this, - svg = chart.getSVG(chartOptions); - - // merge the options - options = merge(chart.options.exporting, options); - - // create the form - form = createElement('form', { - method: 'post', - action: options.url - }, { - display: NONE - }, doc.body); - - // add the values - each(['filename', 'type', 'width', 'svg'], function(name) { - createElement('input', { - type: HIDDEN, - name: name, - value: { - filename: options.filename || 'chart', - type: options.type, - width: options.width, - svg: svg - }[name] - }, null, form); - }); - - // submit - form.submit(); - - // clean up - discardElement(form); - }, - - /** - * Print the chart - */ - print: function() { - - var chart = this, - container = chart.container, - origDisplay = [], - origParent = container.parentNode, - body = doc.body, - childNodes = body.childNodes; - - if (chart.isPrinting) { // block the button while in printing mode - return; - } - - chart.isPrinting = true; - - // hide all body content - each(childNodes, function(node, i) { - if (node.nodeType == 1) { - origDisplay[i] = node.style.display; - node.style.display = NONE; - } - }); - - // pull out the chart - body.appendChild(container); - - // print - win.print(); - - // allow the browser to prepare before reverting - setTimeout(function() { - - // put the chart back in - origParent.appendChild(container); - - // restore all body content - each(childNodes, function(node, i) { - if (node.nodeType == 1) { - node.style.display = origDisplay[i]; - } - }); - - chart.isPrinting = false; - - }, 1000); - - }, - - /** - * Display a popup menu for choosing the export type - * - * @param {String} name An identifier for the menu - * @param {Array} items A collection with text and onclicks for the items - * @param {Number} x The x position of the opener button - * @param {Number} y The y position of the opener button - * @param {Number} width The width of the opener button - * @param {Number} height The height of the opener button - */ - contextMenu: function(name, items, x, y, width, height) { - var chart = this, - navOptions = chart.options.navigation, - menuItemStyle = navOptions.menuItemStyle, - chartWidth = chart.chartWidth, - chartHeight = chart.chartHeight, - cacheName = 'cache-'+ name, - menu = chart[cacheName], - menuPadding = mathMax(width, height), // for mouse leave detection - boxShadow = '3px 3px 10px #888', - innerMenu, - hide, - menuStyle; - - // create the menu only the first time - if (!menu) { - - // create a HTML element above the SVG - chart[cacheName] = menu = createElement(DIV, { - className: PREFIX + name - }, { - position: ABSOLUTE, - zIndex: 1000, - padding: menuPadding + PX - }, chart.container); - - innerMenu = createElement(DIV, null, - extend({ - MozBoxShadow: boxShadow, - WebkitBoxShadow: boxShadow, - boxShadow: boxShadow - }, navOptions.menuStyle) , menu); - - // hide on mouse out - hide = function() { - css(menu, { display: NONE }); - }; - - addEvent(menu, 'mouseleave', hide); - - - // create the items - each(items, function(item) { - if (item) { - var div = createElement(DIV, { - onmouseover: function() { - css(this, navOptions.menuItemHoverStyle); - }, - onmouseout: function() { - css(this, menuItemStyle); - }, - innerHTML: item.text || HC.getOptions().lang[item.textKey] - }, extend({ - cursor: 'pointer' - }, menuItemStyle), innerMenu); - - div[hasTouch ? 'ontouchstart' : 'onclick'] = function() { - hide(); - item.onclick.apply(chart, arguments); - }; - - } - }); - - chart.exportMenuWidth = menu.offsetWidth; - chart.exportMenuHeight = menu.offsetHeight; - } - - menuStyle = { display: 'block' }; - - // if outside right, right align it - if (x + chart.exportMenuWidth > chartWidth) { - menuStyle.right = (chartWidth - x - width - menuPadding) + PX; - } else { - menuStyle.left = (x - menuPadding) + PX; - } - // if outside bottom, bottom align it - if (y + height + chart.exportMenuHeight > chartHeight) { - menuStyle.bottom = (chartHeight - y - menuPadding) + PX; - } else { - menuStyle.top = (y + height - menuPadding) + PX; - } - - css(menu, menuStyle); - }, - - /** - * Add the export button to the chart - */ - addButton: function(options) { - var chart = this, - renderer = chart.renderer, - btnOptions = merge(chart.options.navigation.buttonOptions, options), - onclick = btnOptions.onclick, - menuItems = btnOptions.menuItems, - /*position = chart.getAlignment(btnOptions), - buttonLeft = position.x, - buttonTop = position.y,*/ - buttonWidth = btnOptions.width, - buttonHeight = btnOptions.height, - box, - symbol, - button, - borderWidth = btnOptions.borderWidth, - boxAttr = { - stroke: btnOptions.borderColor - - }, - symbolAttr = { - stroke: btnOptions.symbolStroke, - fill: btnOptions.symbolFill - }; - - if (btnOptions.enabled === false) { - return; - } - - // element to capture the click - function revert() { - symbol.attr(symbolAttr); - box.attr(boxAttr); - } - - // the box border - box = renderer.rect( - 0, - 0, - buttonWidth, - buttonHeight, - btnOptions.borderRadius, - borderWidth - ) - //.translate(buttonLeft, buttonTop) // to allow gradients - .align(btnOptions, true) - .attr(extend({ - fill: btnOptions.backgroundColor, - 'stroke-width': borderWidth, - zIndex: 19 - }, boxAttr)).add(); - - // the invisible element to track the clicks - button = renderer.rect( - 0, - 0, - buttonWidth, - buttonHeight, - 0 - ) - .align(btnOptions) - .attr({ - fill: 'rgba(255, 255, 255, 0.001)', - title: HC.getOptions().lang[btnOptions._titleKey], - zIndex: 21 - }).css({ - cursor: 'pointer' - }) - .on('mouseover', function() { - symbol.attr({ - stroke: btnOptions.hoverSymbolStroke, - fill: btnOptions.hoverSymbolFill - }); - box.attr({ - stroke: btnOptions.hoverBorderColor - }); - }) - .on('mouseout', revert) - .on('click', revert) - .add(); - - //addEvent(button.element, 'click', revert); - - // add the click event - if (menuItems) { - onclick = function(e) { - revert(); - var bBox = button.getBBox(); - chart.contextMenu('export-menu', menuItems, bBox.x, bBox.y, buttonWidth, buttonHeight); - }; - } - /*addEvent(button.element, 'click', function() { - onclick.apply(chart, arguments); - });*/ - button.on('click', function() { - onclick.apply(chart, arguments); - }); - - // the icon - symbol = renderer.symbol( - btnOptions.symbol, - btnOptions.symbolX, - btnOptions.symbolY, - (btnOptions.symbolSize || 12) / 2 - ) - .align(btnOptions, true) - .attr(extend(symbolAttr, { - 'stroke-width': btnOptions.symbolStrokeWidth || 1, - zIndex: 20 - })).add(); - - - - } -}); - -// Create the export icon -HC.Renderer.prototype.symbols.exportIcon = function(x, y, radius) { - return [ - M, // the disk - x - radius, y + radius, - L, - x + radius, y + radius, - x + radius, y + radius * 0.5, - x - radius, y + radius * 0.5, - 'Z', - M, // the arrow - x, y + radius * 0.5, - L, - x - radius * 0.5, y - radius / 3, - x - radius / 6, y - radius / 3, - x - radius / 6, y - radius, - x + radius / 6, y - radius, - x + radius / 6, y - radius / 3, - x + radius * 0.5, y - radius / 3, - 'Z' - ]; -}; -// Create the print icon -HC.Renderer.prototype.symbols.printIcon = function(x, y, radius) { - return [ - M, // the printer - x - radius, y + radius * 0.5, - L, - x + radius, y + radius * 0.5, - x + radius, y - radius / 3, - x - radius, y - radius / 3, - 'Z', - M, // the upper sheet - x - radius * 0.5, y - radius / 3, - L, - x - radius * 0.5, y - radius, - x + radius * 0.5, y - radius, - x + radius * 0.5, y - radius / 3, - 'Z', - M, // the lower sheet - x - radius * 0.5, y + radius * 0.5, - L, - x - radius * 0.75, y + radius, - x + radius * 0.75, y + radius, - x + radius * 0.5, y + radius * 0.5, - 'Z' - ]; -}; - - -// Add the buttons on chart load -Chart.prototype.callbacks.push(function(chart) { - var n, - exportingOptions = chart.options.exporting, - buttons = exportingOptions.buttons; - - if (exportingOptions.enabled !== false) { - - for (n in buttons) { - chart.addButton(buttons[n]); - } - } -}); - - -})(); \ No newline at end of file diff --git a/DeveloperAdoption/public/static/Highcharts-2/js/themes/dark-blue.js b/DeveloperAdoption/public/static/Highcharts-2/js/themes/dark-blue.js deleted file mode 100644 index d5728cf..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/js/themes/dark-blue.js +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Dark blue theme for Highcharts JS - * @author Torstein Hønsi - */ - -Highcharts.theme = { - colors: ["#DDDF0D", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee", - "#55BF3B", "#DF5353", "#7798BF", "#aaeeee"], - chart: { - backgroundColor: { - linearGradient: [0, 0, 250, 500], - stops: [ - [0, 'rgb(48, 48, 96)'], - [1, 'rgb(0, 0, 0)'] - ] - }, - borderColor: '#000000', - borderWidth: 2, - className: 'dark-container', - plotBackgroundColor: 'rgba(255, 255, 255, .1)', - plotBorderColor: '#CCCCCC', - plotBorderWidth: 1 - }, - title: { - style: { - color: '#C0C0C0', - font: 'bold 16px "Trebuchet MS", Verdana, sans-serif' - } - }, - subtitle: { - style: { - color: '#666666', - font: 'bold 12px "Trebuchet MS", Verdana, sans-serif' - } - }, - xAxis: { - gridLineColor: '#333333', - gridLineWidth: 1, - labels: { - style: { - color: '#A0A0A0' - } - }, - lineColor: '#A0A0A0', - tickColor: '#A0A0A0', - title: { - style: { - color: '#CCC', - fontWeight: 'bold', - fontSize: '12px', - fontFamily: 'Trebuchet MS, Verdana, sans-serif' - - } - } - }, - yAxis: { - gridLineColor: '#333333', - labels: { - style: { - color: '#A0A0A0' - } - }, - lineColor: '#A0A0A0', - minorTickInterval: null, - tickColor: '#A0A0A0', - tickWidth: 1, - title: { - style: { - color: '#CCC', - fontWeight: 'bold', - fontSize: '12px', - fontFamily: 'Trebuchet MS, Verdana, sans-serif' - } - } - }, - legend: { - itemStyle: { - font: '9pt Trebuchet MS, Verdana, sans-serif', - color: '#A0A0A0' - } - }, - tooltip: { - backgroundColor: 'rgba(0, 0, 0, 0.75)', - style: { - color: '#F0F0F0' - } - }, - toolbar: { - itemStyle: { - color: 'silver' - } - }, - plotOptions: { - line: { - dataLabels: { - color: '#CCC' - }, - marker: { - lineColor: '#333' - } - }, - spline: { - marker: { - lineColor: '#333' - } - }, - scatter: { - marker: { - lineColor: '#333' - } - } - }, - legend: { - itemStyle: { - color: '#CCC' - }, - itemHoverStyle: { - color: '#FFF' - }, - itemHiddenStyle: { - color: '#444' - } - }, - credits: { - style: { - color: '#666' - } - }, - labels: { - style: { - color: '#CCC' - } - }, - - navigation: { - buttonOptions: { - backgroundColor: { - linearGradient: [0, 0, 0, 20], - stops: [ - [0.4, '#606060'], - [0.6, '#333333'] - ] - }, - borderColor: '#000000', - symbolStroke: '#C0C0C0', - hoverSymbolStroke: '#FFFFFF' - } - }, - - exporting: { - buttons: { - exportButton: { - symbolFill: '#55BE3B' - }, - printButton: { - symbolFill: '#7797BE' - } - } - }, - - // special colors for some of the - legendBackgroundColor: 'rgba(0, 0, 0, 0.5)', - legendBackgroundColorSolid: 'rgb(35, 35, 70)', - dataLabelsColor: '#444', - textColor: '#C0C0C0', - maskColor: 'rgba(255,255,255,0.3)' -}; - -// Apply the theme -var highchartsOptions = Highcharts.setOptions(Highcharts.theme); \ No newline at end of file diff --git a/DeveloperAdoption/public/static/Highcharts-2/js/themes/dark-green.js b/DeveloperAdoption/public/static/Highcharts-2/js/themes/dark-green.js deleted file mode 100644 index c8bb541..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/js/themes/dark-green.js +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Dark blue theme for Highcharts JS - * @author Torstein Hønsi - */ - -Highcharts.theme = { - colors: ["#DDDF0D", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee", - "#55BF3B", "#DF5353", "#7798BF", "#aaeeee"], - chart: { - backgroundColor: { - linearGradient: [0, 0, 250, 500], - stops: [ - [0, 'rgb(48, 96, 48)'], - [1, 'rgb(0, 0, 0)'] - ] - }, - borderColor: '#000000', - borderWidth: 2, - className: 'dark-container', - plotBackgroundColor: 'rgba(255, 255, 255, .1)', - plotBorderColor: '#CCCCCC', - plotBorderWidth: 1 - }, - title: { - style: { - color: '#C0C0C0', - font: 'bold 16px "Trebuchet MS", Verdana, sans-serif' - } - }, - subtitle: { - style: { - color: '#666666', - font: 'bold 12px "Trebuchet MS", Verdana, sans-serif' - } - }, - xAxis: { - gridLineColor: '#333333', - gridLineWidth: 1, - labels: { - style: { - color: '#A0A0A0' - } - }, - lineColor: '#A0A0A0', - tickColor: '#A0A0A0', - title: { - style: { - color: '#CCC', - fontWeight: 'bold', - fontSize: '12px', - fontFamily: 'Trebuchet MS, Verdana, sans-serif' - - } - } - }, - yAxis: { - gridLineColor: '#333333', - labels: { - style: { - color: '#A0A0A0' - } - }, - lineColor: '#A0A0A0', - minorTickInterval: null, - tickColor: '#A0A0A0', - tickWidth: 1, - title: { - style: { - color: '#CCC', - fontWeight: 'bold', - fontSize: '12px', - fontFamily: 'Trebuchet MS, Verdana, sans-serif' - } - } - }, - legend: { - itemStyle: { - font: '9pt Trebuchet MS, Verdana, sans-serif', - color: '#A0A0A0' - } - }, - tooltip: { - backgroundColor: 'rgba(0, 0, 0, 0.75)', - style: { - color: '#F0F0F0' - } - }, - toolbar: { - itemStyle: { - color: 'silver' - } - }, - plotOptions: { - line: { - dataLabels: { - color: '#CCC' - }, - marker: { - lineColor: '#333' - } - }, - spline: { - marker: { - lineColor: '#333' - } - }, - scatter: { - marker: { - lineColor: '#333' - } - } - }, - legend: { - itemStyle: { - color: '#CCC' - }, - itemHoverStyle: { - color: '#FFF' - }, - itemHiddenStyle: { - color: '#444' - } - }, - credits: { - style: { - color: '#666' - } - }, - labels: { - style: { - color: '#CCC' - } - }, - - navigation: { - buttonOptions: { - backgroundColor: { - linearGradient: [0, 0, 0, 20], - stops: [ - [0.4, '#606060'], - [0.6, '#333333'] - ] - }, - borderColor: '#000000', - symbolStroke: '#C0C0C0', - hoverSymbolStroke: '#FFFFFF' - } - }, - - exporting: { - buttons: { - exportButton: { - symbolFill: '#55BE3B' - }, - printButton: { - symbolFill: '#7797BE' - } - } - }, - - // special colors for some of the - legendBackgroundColor: 'rgba(0, 0, 0, 0.5)', - legendBackgroundColorSolid: 'rgb(35, 35, 70)', - dataLabelsColor: '#444', - textColor: '#C0C0C0', - maskColor: 'rgba(255,255,255,0.3)' -}; - -// Apply the theme -var highchartsOptions = Highcharts.setOptions(Highcharts.theme); \ No newline at end of file diff --git a/DeveloperAdoption/public/static/Highcharts-2/js/themes/gray.js b/DeveloperAdoption/public/static/Highcharts-2/js/themes/gray.js deleted file mode 100644 index a292a76..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/js/themes/gray.js +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Gray theme for Highcharts JS - * @author Torstein Hønsi - */ - -Highcharts.theme = { - colors: ["#DDDF0D", "#7798BF", "#55BF3B", "#DF5353", "#aaeeee", "#ff0066", "#eeaaee", - "#55BF3B", "#DF5353", "#7798BF", "#aaeeee"], - chart: { - backgroundColor: { - linearGradient: [0, 0, 0, 400], - stops: [ - [0, 'rgb(96, 96, 96)'], - [1, 'rgb(16, 16, 16)'] - ] - }, - borderWidth: 0, - borderRadius: 15, - plotBackgroundColor: null, - plotShadow: false, - plotBorderWidth: 0 - }, - title: { - style: { - color: '#FFF', - font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' - } - }, - subtitle: { - style: { - color: '#DDD', - font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' - } - }, - xAxis: { - gridLineWidth: 0, - lineColor: '#999', - tickColor: '#999', - labels: { - style: { - color: '#999', - fontWeight: 'bold' - } - }, - title: { - style: { - color: '#AAA', - font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' - } - } - }, - yAxis: { - alternateGridColor: null, - minorTickInterval: null, - gridLineColor: 'rgba(255, 255, 255, .1)', - lineWidth: 0, - tickWidth: 0, - labels: { - style: { - color: '#999', - fontWeight: 'bold' - } - }, - title: { - style: { - color: '#AAA', - font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' - } - } - }, - legend: { - itemStyle: { - color: '#CCC' - }, - itemHoverStyle: { - color: '#FFF' - }, - itemHiddenStyle: { - color: '#333' - } - }, - labels: { - style: { - color: '#CCC' - } - }, - tooltip: { - backgroundColor: { - linearGradient: [0, 0, 0, 50], - stops: [ - [0, 'rgba(96, 96, 96, .8)'], - [1, 'rgba(16, 16, 16, .8)'] - ] - }, - borderWidth: 0, - style: { - color: '#FFF' - } - }, - - - plotOptions: { - line: { - dataLabels: { - color: '#CCC' - }, - marker: { - lineColor: '#333' - } - }, - spline: { - marker: { - lineColor: '#333' - } - }, - scatter: { - marker: { - lineColor: '#333' - } - } - }, - - toolbar: { - itemStyle: { - color: '#CCC' - } - }, - - navigation: { - buttonOptions: { - backgroundColor: { - linearGradient: [0, 0, 0, 20], - stops: [ - [0.4, '#606060'], - [0.6, '#333333'] - ] - }, - borderColor: '#000000', - symbolStroke: '#C0C0C0', - hoverSymbolStroke: '#FFFFFF' - } - }, - - exporting: { - buttons: { - exportButton: { - symbolFill: '#55BE3B' - }, - printButton: { - symbolFill: '#7797BE' - } - } - }, - - // special colors for some of the demo examples - legendBackgroundColor: 'rgba(48, 48, 48, 0.8)', - legendBackgroundColorSolid: 'rgb(70, 70, 70)', - dataLabelsColor: '#444', - textColor: '#E0E0E0', - maskColor: 'rgba(255,255,255,0.3)' -}; - -// Apply the theme -var highchartsOptions = Highcharts.setOptions(Highcharts.theme); diff --git a/DeveloperAdoption/public/static/Highcharts-2/js/themes/grid.js b/DeveloperAdoption/public/static/Highcharts-2/js/themes/grid.js deleted file mode 100644 index 2cb9341..0000000 --- a/DeveloperAdoption/public/static/Highcharts-2/js/themes/grid.js +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Grid theme for Highcharts JS - * @author Torstein Hønsi - */ - -Highcharts.theme = { - colors: ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4'], - chart: { - backgroundColor: { - linearGradient: [0, 0, 500, 500], - stops: [ - [0, 'rgb(255, 255, 255)'], - [1, 'rgb(240, 240, 255)'] - ] - } -, - borderWidth: 2, - plotBackgroundColor: 'rgba(255, 255, 255, .9)', - plotShadow: true, - plotBorderWidth: 1 - }, - title: { - style: { - color: '#000', - font: 'bold 16px "Trebuchet MS", Verdana, sans-serif' - } - }, - subtitle: { - style: { - color: '#666666', - font: 'bold 12px "Trebuchet MS", Verdana, sans-serif' - } - }, - xAxis: { - gridLineWidth: 1, - lineColor: '#000', - tickColor: '#000', - labels: { - style: { - color: '#000', - font: '11px Trebuchet MS, Verdana, sans-serif' - } - }, - title: { - style: { - color: '#333', - fontWeight: 'bold', - fontSize: '12px', - fontFamily: 'Trebuchet MS, Verdana, sans-serif' - - } - } - }, - yAxis: { - minorTickInterval: 'auto', - lineColor: '#000', - lineWidth: 1, - tickWidth: 1, - tickColor: '#000', - labels: { - style: { - color: '#000', - font: '11px Trebuchet MS, Verdana, sans-serif' - } - }, - title: { - style: { - color: '#333', - fontWeight: 'bold', - fontSize: '12px', - fontFamily: 'Trebuchet MS, Verdana, sans-serif' - } - } - }, - legend: { - itemStyle: { - font: '9pt Trebuchet MS, Verdana, sans-serif', - color: 'black' - - }, - itemHoverStyle: { - color: '#039' - }, - itemHiddenStyle: { - color: 'gray' - } - }, - labels: { - style: { - color: '#99b' - } - } -}; - -// Apply the theme -var highchartsOptions = Highcharts.setOptions(Highcharts.theme); - diff --git a/DeveloperAdoption/public/static/autosave.js b/DeveloperAdoption/public/static/autosave.js deleted file mode 100644 index 21ccaea..0000000 --- a/DeveloperAdoption/public/static/autosave.js +++ /dev/null @@ -1,86 +0,0 @@ -// -// Autosave functionality -- this is the browser version that saves to the server -// -// External interfaces are from: -// SocialCalcTableEditor (for autosave upon edit) -// - -if (!Aspiring) { - Aspiring = {}; -} -Aspiring.AutoSave = {}; -Aspiring.AutoSave.selectedFile = "default"; -Aspiring.AutoSave.autoSaveTimeoutId = null; -Aspiring.AutoSave.SaveTimeout = 10000; // 10 seconds - -// This is called from the SocialCalcTableEditor -// EditorSaveEdit function -SocialCalc.Callbacks.editAutoSave = function () { - // mark filename dirty - // start a timer - console.log("in auto save"); - Aspiring.AutoSave.setCurrentFileDirty(); - if (Aspiring.AutoSave.autoSaveTimeoutId != null) { - console.log("timer already running"); - } else { - Aspiring.AutoSave.autoSaveTimeoutId = window.setTimeout( - Aspiring.AutoSave.TimerExpiry, - Aspiring.AutoSave.SaveTimeout - ); - } -}; - -Aspiring.AutoSave.TimerExpiry = function() { - console.log("auto save timer"); - if (SocialCalc.GetCurrentWorkBookControl().workbook.spreadsheet.editor.state == "start") { - // save file - if (Aspiring.AutoSave.selectedFile == "default") { - Aspiring.AutoSave.selectedFile = "Untitled"; - } - - // Create a FormData object - const formData = new FormData(); - formData.append("newFileName", Aspiring.AutoSave.selectedFile); - formData.append("content", SocialCalc.WorkBookControlSaveSheet()); - formData.append("fid", document.getElementById("fidValueHolder").innerHTML); - - // Use $.ajax to send the FormData - $.ajax({ - url: "/api/save", - type: "POST", - data: formData, - processData: false, // Prevent jQuery from automatically processing the data - contentType: false, // Prevent jQuery from setting the Content-Type header - success: function(response) { - const msg = response["data"]; - console.log(msg); - }, - error: function(xhr, status, error) { - console.error("Auto-save failed: ", status, error); - } - }); - - console.log("saved as " + Aspiring.AutoSave.selectedFile); - Aspiring.AutoSave.autoSaveTimeoutId = null; - // unmark dirty - Aspiring.AutoSave.updateFileName(Aspiring.AutoSave.selectedFile); - } else { - // user is editing - console.log("skip autosave, user is editing"); - Aspiring.AutoSave.autoSaveTimeoutId = window.setTimeout(fileAutoSaveTimerExpiry, Aspiring.AutoSave.SaveTimeout); - } -}; - - -Aspiring.AutoSave.updateFileName = function (name) { - Aspiring.AutoSave.selectedFile = name; - document.getElementById("filenameholder").innerHTML = name; -}; - -Aspiring.AutoSave.setCurrentFileDirty = function () { - if (Aspiring.AutoSave.selectedFile == "default") { - Aspiring.AutoSave.selectedFile = "Untitled"; - } - document.getElementById("filenameholder").innerHTML = - Aspiring.AutoSave.selectedFile + "(*)"; -}; diff --git a/DeveloperAdoption/public/static/checkmark.png b/DeveloperAdoption/public/static/checkmark.png deleted file mode 100644 index b435424..0000000 Binary files a/DeveloperAdoption/public/static/checkmark.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/excanvas.min.js b/DeveloperAdoption/public/static/excanvas.min.js deleted file mode 100644 index 12c74f7..0000000 --- a/DeveloperAdoption/public/static/excanvas.min.js +++ /dev/null @@ -1 +0,0 @@ -if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&").replace(/"/g,""")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AHAL.x){AL.x=Z.x}if(AG.y==null||Z.yAL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('','','');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()}; \ No newline at end of file diff --git a/DeveloperAdoption/public/static/fonts.css b/DeveloperAdoption/public/static/fonts.css deleted file mode 100644 index 27bb751..0000000 --- a/DeveloperAdoption/public/static/fonts.css +++ /dev/null @@ -1,4 +0,0 @@ -@font-face{ - font-family: Anton; /*Custom name of the font*/ - src:url(/static/Anton.ttf); /*static url of the font*/ - } \ No newline at end of file diff --git a/DeveloperAdoption/public/static/formatnumber2.js b/DeveloperAdoption/public/static/formatnumber2.js deleted file mode 100644 index 0cf3f94..0000000 --- a/DeveloperAdoption/public/static/formatnumber2.js +++ /dev/null @@ -1,950 +0,0 @@ -// -/* -// SocialCalc Number Formatting Library -// -// Part of the SocialCalc package. -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - -SocialCalc.FormatNumber = {}; - -SocialCalc.FormatNumber.format_definitions = {}; // Parsed formats are stored here globally - -// Most constants that are often customized for localization are in the SocialCalc.Constants module. -// If you use this module standalone, provide at least the "FormatNumber" values. -// - -// The following values may be customized externally for further localization of the format definitions themselves, -// but that would make them incompatible with other uses and is discouraged. -// - -SocialCalc.FormatNumber.separatorchar = ","; -SocialCalc.FormatNumber.decimalchar = "."; -SocialCalc.FormatNumber.daynames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; -SocialCalc.FormatNumber.daynames3 = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; -SocialCalc.FormatNumber.monthnames3 = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; -SocialCalc.FormatNumber.monthnames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", - "October", "November", "December"]; - -SocialCalc.FormatNumber.allowedcolors = - {BLACK: "#000000", BLUE: "#0000FF", CYAN: "#00FFFF", GREEN: "#00FF00", MAGENTA: "#FF00FF", - RED: "#FF0000", WHITE: "#FFFFFF", YELLOW: "#FFFF00"}; - -SocialCalc.FormatNumber.alloweddates = - {H: "h]", M: "m]", MM: "mm]", S: "s]", SS: "ss]"}; - -// Other constants - -SocialCalc.FormatNumber.commands = - {copy: 1, color: 2, integer_placeholder: 3, fraction_placeholder: 4, decimal: 5, - currency: 6, general:7, separator: 8, date: 9, comparison: 10, section: 11, style: 12}; - -SocialCalc.FormatNumber.datevalues = {julian_offset: 2415019, seconds_in_a_day: 24 * 60 * 60, seconds_in_an_hour: 60 * 60}; - -/* ******************* - - result = SocialCalc.FormatNumber.formatNumberWithFormat = function(rawvalue, format_string, currency_char) - -************************* */ - -SocialCalc.FormatNumber.formatNumberWithFormat = function(rawvalue, format_string, currency_char) { - - var scc = SocialCalc.Constants; - var scfn = SocialCalc.FormatNumber; - - var op, operandstr, fromend, cval, operandstrlc; - var startval, estartval; - var hrs, mins, secs, ehrs, emins, esecs, ampmstr, ymd; - var minOK, mpos; - var result=""; - var thisformat; - var section, gotcomparison, compop, compval, cpos, oppos; - var sectioninfo; - var i, decimalscale, scaledvalue, strvalue, strparts, integervalue, fractionvalue; - var integerdigits2, integerpos, fractionpos, textcolor, textstyle, separatorchar, decimalchar; - var value; // working copy to change sign, etc. - - rawvalue = rawvalue-0; // make sure a number - value = rawvalue; - if (!isFinite(value)) return "NaN"; - - var negativevalue = value < 0 ? 1 : 0; // determine sign, etc. - if (negativevalue) value = -value; - var zerovalue = value == 0 ? 1 : 0; - - currency_char = currency_char || scc.FormatNumber_DefaultCurrency; - - scfn.parse_format_string(scfn.format_definitions, format_string); // make sure format is parsed - thisformat = scfn.format_definitions[format_string]; // Get format structure - - if (!thisformat) throw "Format not parsed error!"; - - section = thisformat.sectioninfo.length - 1; // get number of sections - 1 - - if (thisformat.hascomparison) { // has comparisons - determine which section - section = 0; // set to which section we will use - gotcomparison = 0; // this section has no comparison - for (cpos=0; ;cpos++) { // scan for comparisons - op = thisformat.operators[cpos]; - operandstr = thisformat.operands[cpos]; // get next operator and operand - if (!op) { // at end with no match - if (gotcomparison) { // if comparison but no match - format_string = "General"; // use default of General - scfn.parse_format_string(scfn.format_definitions, format_string); - thisformat = scfn.format_definitions[format_string]; - section = 0; - } - break; // if no comparision, matches on this section - } - if (op == scfn.commands.section) { // end of section - if (!gotcomparison) { // no comparison, so it's a match - break; - } - gotcomparison = 0; - section++; // check out next one - continue; - } - if (op == scfn.commands.comparison) { // found a comparison - do we meet it? - i=operandstr.indexOf(":"); - compop=operandstr.substring(0,i); - compval=operandstr.substring(i+1)-0; - if ((compop == "<" && rawvalue < compval) || - (compop == "<=" && rawvalue <= compval) || - (compop == "=" && rawvalue == compval) || - (compop == "<>" && rawvalue != compval) || - (compop == ">=" && rawvalue >= compval) || - (compop == ">" && rawvalue > compval)) { // a match - break; - } - gotcomparison = 1; - } - } - } - else if (section > 0) { // more than one section (separated by ";") - if (section == 1) { // two sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } - else { - section = 0; // use first for all others - } - } - else if (section == 2) { // three sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } - else if (zerovalue) { - section = 2; // use third section for zero values - } - else { - section = 0; // use first for positive - } - } - } - - sectioninfo = thisformat.sectioninfo[section]; // look at values for our section - - if (sectioninfo.commas > 0) { // scale by thousands - for (i=0; i 0) { // do percent scaling - for (i=0; i=0) { // converted to scientific notation - return rawvalue+""; // Just return plain converted raw value - } - - strparts=strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - if (!strparts) return "NaN"; // if not a number - integervalue = strparts[1]; - if (!integervalue || integervalue=="0") integervalue=""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - - if (sectioninfo.hasdate) { // there are date placeholders - if (rawvalue < 0) { // bad date - return "??-???-?? ??:??:??"; - } - startval = (rawvalue-Math.floor(rawvalue)) * scfn.datevalues.seconds_in_a_day; // get date/time parts - estartval = rawvalue * scfn.datevalues.seconds_in_a_day; // do elapsed time version, too - hrs = Math.floor(startval / scfn.datevalues.seconds_in_an_hour); - ehrs = Math.floor(estartval / scfn.datevalues.seconds_in_an_hour); - startval = startval - hrs * scfn.datevalues.seconds_in_an_hour; - mins = Math.floor(startval / 60); - emins = Math.floor(estartval / 60); - secs = startval - mins * 60; - decimalscale = 1; // round appropriately depending if there is ss.0 - for (i=0; i= 60) { // handle round up into next second, minute, etc. - secs = 0; - mins++; emins++; - if (mins >= 60) { - mins = 0; - hrs++; ehrs++; - if (hrs >= 24) { - hrs = 0; - rawvalue++; - } - } - } - fractionvalue = (secs-Math.floor(secs))+""; // for "hh:mm:ss.000" - fractionvalue = fractionvalue.substring(2); // skip "0." - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian(Math.floor(rawvalue+scfn.datevalues.julian_offset)); - - minOK = 0; // says "m" can be minutes if true - mspos = sectioninfo.sectionstart; // m scan position in ops - for ( ; ; mspos++) { // scan for "m" and "mm" to see if any minutes fields, and am/pm - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op==scfn.commands.section) break; - if (op==scfn.commands.date) { - if ((operandstr.toLowerCase()=="am/pm" || operandstr.toLowerCase()=="a/p") && !ampmstr) { - if (hrs >= 12) { - hrs -= 12; - ampmstr = operandstr.toLowerCase()=="a/p" ? scc.s_FormatNumber_pm1 : scc.s_FormatNumber_pm; // "P" : "PM"; - } - else { - ampmstr = operandstr.toLowerCase()=="a/p" ? scc.s_FormatNumber_am1 : scc.s_FormatNumber_am; // "A" : "AM"; - } - if (operandstr.indexOf(ampmstr)<0) - ampmstr = ampmstr.toLowerCase(); // have case match case in format - } - if (minOK && (operandstr=="m" || operandstr=="mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr.charAt(0)=="h") { - minOK = 1; // m following h or hh or [h] is minutes not months - } - else { - minOK = 0; - } - } - else if (op!=scfn.commands.copy) { // copying chars can be between h and m - minOK = 0; - } - } - minOK = 0; - for (--mspos; ; mspos--) { // scan other way for s after m - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op==scfn.commands.section) break; - if (op==scfn.commands.date) { - if (minOK && (operandstr=="m" || operandstr=="mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr=="ss") { - minOK = 1; // m before ss is minutes not months - } - else { - minOK = 0; - } - } - else if (op!=scfn.commands.copy) { // copying chars can be between ss and m - minOK = 0; - } - } - } - - integerdigits2 = 0; // init counters, etc. - integerpos = 0; - fractionpos = 0; - textcolor = ""; - textstyle = ""; - separatorchar = scc.FormatNumber_separatorchar; - if (separatorchar.indexOf(" ")>=0) separatorchar = separatorchar.replace(/ /g, " "); - decimalchar = scc.FormatNumber_decimalchar; - if (decimalchar.indexOf(" ")>=0) decimalchar = decimalchar.replace(/ /g, " "); - - oppos = sectioninfo.sectionstart; - - while (op = thisformat.operators[oppos]) { // execute format - operandstr = thisformat.operands[oppos++]; // get next operator and operand - - if (op == scfn.commands.copy) { // put char in result - result += operandstr; - } - - else if (op == scfn.commands.color) { // set color - textcolor = operandstr; - } - - else if (op == scfn.commands.style) { // set style - textstyle = operandstr; - } - - else if (op == scfn.commands.integer_placeholder) { // insert number part - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - integerdigits2++; - if (integerdigits2 == 1) { // first one - if (integervalue.length > sectioninfo.integerdigits) { // see if integer wider than field - for (;integerpos < (integervalue.length - sectioninfo.integerdigits); integerpos++) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - } - if (integervalue.length < sectioninfo.integerdigits - && integerdigits2 <= sectioninfo.integerdigits - integervalue.length) { // field is wider than value - if (operandstr == "0" || operandstr == "?") { // fill with appropriate characters - result += operandstr == "0" ? "0" : " "; - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = sectioninfo.integerdigits - integerdigits2; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - else { // normal integer digit - add it - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - integerpos++; - } - } - else if (op == scfn.commands.fraction_placeholder) { // add fraction part of number - if (fractionpos >= fractionvalue.length) { - if (operandstr == "0" || operandstr == "?") { - result += operandstr == "0" ? "0" : " "; - } - } - else { - result += fractionvalue.charAt(fractionpos); - } - fractionpos++; - } - - else if (op == scfn.commands.decimal) { // decimal point - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += decimalchar; - } - - else if (op == scfn.commands.currency) { // currency symbol - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += operandstr; - } - - else if (op == scfn.commands.general) { // insert "General" conversion - - // *** Cut down number of significant digits to avoid floating point artifacts: - - if (value!=0) { // only if non-zero - var factor = Math.floor(Math.LOG10E * Math.log(value)); // get integer magnitude as a power of 10 - factor = Math.pow(10, 13-factor); // turn into scaling factor - value = Math.floor(factor * value + 0.5)/factor; // scale positive value, round, undo scaling - if (!isFinite(value)) return "NaN"; - } - if (negativevalue) { - result += "-"; - } - strvalue = value+""; // convert original value to string - if (strvalue.indexOf("e")>=0) { // converted to scientific notation - result += strvalue; - continue; - } - strparts=strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - integervalue = strparts[1]; - if (!integervalue || integervalue=="0") integervalue=""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - integerpos = 0; - fractionpos = 0; - if (integervalue.length) { - for (;integerpos < integervalue.length; integerpos++) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - else { - result += "0"; - } - if (fractionvalue.length) { - result += decimalchar; - for (;fractionpos < fractionvalue.length; fractionpos++) { - result += fractionvalue.charAt(fractionpos); - } - } - } - else if (op==scfn.commands.date) { // date placeholder - operandstrlc = operandstr.toLowerCase(); - if (operandstrlc=="y" || operandstrlc=="yy") { - result += (ymd.year+"").substring(2); - } - else if (operandstrlc=="yyyy") { - result += ymd.year+""; - } - else if (operandstrlc=="d") { - result += ymd.day+""; - } - else if (operandstrlc=="dd") { - cval = 1000 + ymd.day; - result += (cval+"").substr(2); - } - else if (operandstrlc=="ddd") { - cval = Math.floor(rawvalue+6) % 7; - result += scc.s_FormatNumber_daynames3[cval]; - } - else if (operandstrlc=="dddd") { - cval = Math.floor(rawvalue+6) % 7; - result += scc.s_FormatNumber_daynames[cval]; - } - else if (operandstrlc=="m") { - result += ymd.month+""; - } - else if (operandstrlc=="mm") { - cval = 1000 + ymd.month; - result += (cval+"").substr(2); - } - else if (operandstrlc=="mmm") { - result += scc.s_FormatNumber_monthnames3[ymd.month-1]; - } - else if (operandstrlc=="mmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month-1]; - } - else if (operandstrlc=="mmmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month-1].charAt(0); - } - else if (operandstrlc=="h") { - result += hrs+""; - } - else if (operandstrlc=="h]") { - result += ehrs+""; - } - else if (operandstrlc=="mmin") { - cval = (1000 + mins)+""; - result += cval.substr(2); - } - else if (operandstrlc=="mm]") { - if (emins < 100) { - cval = (1000 + emins)+""; - result += cval.substr(2); - } - else { - result += emins+""; - } - } - else if (operandstrlc=="min") { - result += mins+""; - } - else if (operandstrlc=="m]") { - result += emins+""; - } - else if (operandstrlc=="hh") { - cval = (1000 + hrs)+""; - result += cval.substr(2); - } - else if (operandstrlc=="s") { - cval = Math.floor(secs); - result += cval+""; - } - else if (operandstrlc=="ss") { - cval = (1000 + Math.floor(secs))+""; - result += cval.substr(2); - } - else if (operandstrlc=="am/pm" || operandstrlc=="a/p") { - result += ampmstr; - } - else if (operandstrlc=="ss]") { - if (esecs < 100) { - cval = (1000 + Math.floor(esecs))+""; - result += cval.substr(2); - } - else { - cval = Math.floor(esecs); - result += cval+""; - } - } - } - else if (op == scfn.commands.section) { // end of section - break; - } - - else if (op == scfn.commands.comparison) { // ignore - continue; - } - - else { - result += "!! Parse error !!"; - } - } - - if (textcolor) { - result = ''+result+''; - } - if (textstyle) { - result = ''+result+''; - } - - return result; - - }; - -/* ******************* - - SocialCalc.FormatNumber.parse_format_string(format_defs, format_string) - - Takes a format string (e.g., "#,##0.00_);(#,##0.00)") and fills in format_defs with the parsed info - - format_defs - ["#,##0.0"]->{} - elements in the hash are one hash for each format - .operators->[] - array of operators from parsing the format string (each a number) - .operands->[] - array of corresponding operators (each usually a string) - .sectioninfo->[] - one hash for each section of the format - .start - .integerdigits - .fractiondigits - .commas - .percent - .thousandssep - .hasdates - .hascomparison - true if any section has [<100], etc. - -************************* */ - -SocialCalc.FormatNumber.parse_format_string = function(format_defs, format_string) { - - var scfn = SocialCalc.FormatNumber; - - var thisformat, section, sectionfinfo; - var integerpart = 1; // start out in integer part - var lastwasinteger; // last char was an integer placeholder - var lastwasslash; // last char was a backslash - escaping following character - var lastwasasterisk; // repeat next char - var lastwasunderscore; // last char was _ which picks up following char for width - var inquote, quotestr; // processing a quoted string - var inbracket, bracketstr, bracketdata; // processing a bracketed string - var ingeneral, gpos; // checks for characters "General" - var ampmstr, part; // checks for characters "A/P" and "AM/PM" - var indate; // keeps track of date/time placeholders - var chpos; // character position being looked at - var ch; // character being looked at - - if (format_defs[format_string]) return; // already defined - nothing to do - - thisformat = {operators: [], operands: [], sectioninfo: [{}]}; // create info structure for this format - format_defs[format_string] = thisformat; // add to other format definitions - - section = 0; // start with section 0 - sectioninfo = thisformat.sectioninfo[section]; // get reference to info for current section - sectioninfo.sectionstart = 0; // position in operands that starts this section - sectioninfo.integerdigits = 0; // number of integer-part placeholders - sectioninfo.fractiondigits = 0; // fraction placeholders - sectioninfo.commas = 0; // commas encountered, to handle scaling - sectioninfo.percent = 0; // times to scale by 100 - - for (chpos=0; chpos=0) { - indate = ch; - } - else { - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } - } - - if (indate) { // last char was part of unsaved date placeholder - thisformat.operators.push(scfn.commands.date); - thisformat.operands.push(indate); - sectioninfo.hasdate = 1; - } - - return; - - } - - -/* ******************* - - bracketdata = SocialCalc.FormatNumber.parse_format_bracket(bracketstr) - - Takes a bracket contents (e.g., "RED", ">10") and returns an operator and operand - - bracketdata->{} - .operator - .operand - -************************* */ - -SocialCalc.FormatNumber.parse_format_bracket = function(bracketstr) { - - var scfn = SocialCalc.FormatNumber; - var scc = SocialCalc.Constants; - - var bracketdata={}; - var parts; - - if (bracketstr.charAt(0)=='$') { // currency - bracketdata.operator = scfn.commands.currency; - parts=bracketstr.match(/^\$(.+?)(\-.+?){0,1}$/); - if (parts) { - bracketdata.operand = parts[1] || scc.FormatNumber_defaultCurrency || '$'; - } - else { - bracketdata.operand = bracketstr.substring(1) || scc.FormatNumber_defaultCurrency || '$'; - } - } - else if (bracketstr=='?$') { - bracketdata.operator = scfn.commands.currency; - bracketdata.operand = '[?$]'; - } - else if (scfn.allowedcolors[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.color; - bracketdata.operand = scfn.allowedcolors[bracketstr.toUpperCase()]; - } - else if (parts=bracketstr.match(/^style=([^"]*)$/)) { // [style=...] - bracketdata.operator = scfn.commands.style; - bracketdata.operand = parts[1]; - } - else if (bracketstr==",") { - bracketdata.operator = scfn.commands.separator; - bracketdata.operand = bracketstr; - } - else if (scfn.alloweddates[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.date; - bracketdata.operand = scfn.alloweddates[bracketstr.toUpperCase()]; - } - else if (parts=bracketstr.match(/^[<>=]/)) { // comparison operator - parts=bracketstr.match(/^([<>=]+)(.+)$/); // split operator and value - bracketdata.operator = scfn.commands.comparison; - bracketdata.operand = parts[1]+":"+parts[2]; - } - else { // unknown bracket - bracketdata.operator = scfn.commands.copy; - bracketdata.operand = "["+bracketstr+"]"; - } - - return bracketdata; - - } - -/* ******************* - - juliandate = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, month, day) - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - - I= YEAR - J= MONTH - K= DAY -C - JD= K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12) - 2 /12-3*((I+4900+(J-14)/12)/100)/4 - -************************* */ - -SocialCalc.FormatNumber.convert_date_gregorian_to_julian = function(year, month, day) { - - var juliandate; - - juliandate = day-32075+SocialCalc.intFunc(1461*(year+4800+SocialCalc.intFunc((month-14)/12))/4); - juliandate += SocialCalc.intFunc(367*(month-2-SocialCalc.intFunc((month-14)/12)*12)/12); - juliandate = juliandate - SocialCalc.intFunc(3*SocialCalc.intFunc((year+4900+SocialCalc.intFunc((month-14)/12))/100)/4); - - return juliandate; - - } - - -/* ******************* - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian(juliandate) - - ymd->{} - .year - .month - .day - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - -************************* */ - -SocialCalc.FormatNumber.convert_date_julian_to_gregorian = function(juliandate) { - - var L, N, I, J, K; - - L = juliandate+68569; - N = Math.floor(4*L/146097); - L = L-Math.floor((146097*N+3)/4); - I = Math.floor(4000*(L+1)/1461001); - L = L-Math.floor(1461*I/4)+31; - J = Math.floor(80*L/2447); - K = L-Math.floor(2447*J/80); - L = Math.floor(J/11); - J = J+2-12*L; - I = 100*(N-49)+I+L; - - return {year:I, month:J, day:K}; - - } - -SocialCalc.intFunc = function(n) { - if (n < 0) { - return -Math.floor(-n); - } - else { - return Math.floor(n); - } - } - diff --git a/DeveloperAdoption/public/static/formula1.js b/DeveloperAdoption/public/static/formula1.js deleted file mode 100644 index 9e9231f..0000000 --- a/DeveloperAdoption/public/static/formula1.js +++ /dev/null @@ -1,4749 +0,0 @@ -// -/* -// SocialCalc Spreadsheet Formula Library -// -// Part of the SocialCalc package -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - // In any case, requires SocialCalc.Constants. - -SocialCalc.Formula = {}; - -// -// Formula constants for parsing: -// - - SocialCalc.Formula.ParseState = {num: 1, alpha: 2, coord: 3, string: 4, stringquote: 5, numexp1: 6, numexp2: 7, alphanumeric: 8, specialvalue:9}; - - SocialCalc.Formula.TokenType = {num: 1, coord: 2, op: 3, name: 4, error: 5, string: 6, space: 7}; - - SocialCalc.Formula.CharClass = {num: 1, numstart: 2, op: 3, eof: 4, alpha: 5, incoord: 6, error: 7, quote: 8, space: 9, specialstart: 10}; - - SocialCalc.Formula.CharClassTable = { - " ": 9, "!": 3, '"': 8, "#": 10, "$":6, "%":3, "&":3, "(": 3, ")": 3, "*": 3, "+": 3, ",": 3, "-": 3, ".": 2, "/": 3, - "0": 1, "1": 1, "2": 1, "3": 1, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "9": 1, - ":": 3, "<": 3, "=": 3, ">": 3, - "A": 5, "B": 5, "C": 5, "D": 5, "E": 5, "F": 5, "G": 5, "H": 5, "I": 5, "J": 5, "K": 5, "L": 5, "M": 5, "N": 5, - "O": 5, "P": 5, "Q": 5, "R": 5, "S": 5, "T": 5, "U": 5, "V": 5, "W": 5, "X": 5, "Y": 5, "Z": 5, - "^": 3, "_": 5, - "a": 5, "b": 5, "c": 5, "d": 5, "e": 5, "f": 5, "g": 5, "h": 5, "i": 5, "j": 5, "k": 5, "l": 5, "m": 5, "n": 5, - "o": 5, "p": 5, "q": 5, "r": 5, "s": 5, "t": 5, "u": 5, "v": 5, "w": 5, "x": 5, "y": 5, "z": 5 - }; - - SocialCalc.Formula.UpperCaseTable = { - "a": "A", "b": "B", "c": "C", "d": "D", "e": "E", "f": "F", "g": "G", "h": "H", "i": "I", "j": "J", "k": "K", "l": "L", "m": "M", - "n": "N", "o": "O", "p": "P", "q": "Q", "r": "R", "s": "S", "t": "T", "u": "U", "v": "V", "w": "W", "x": "X", "y": "Y", "z": "Z" - } - - SocialCalc.Formula.SpecialConstants = { // names that turn into constants for name lookup - "#NULL!": "0,e#NULL!", "#NUM!": "0,e#NUM!", "#DIV/0!": "0,e#DIV/0!", "#VALUE!": "0,e#VALUE!", - "#REF!": "0,e#REF!", "#NAME?": "0,e#NAME?"}; - - - // Operator Precedence table - // - // 1- !, 2- : ,, 3- M P, 4- %, 5- ^, 6- * /, 7- + -, 8- &, 9- < > = G(>=) L(<=) N(<>), - // Negative value means Right Associative - - SocialCalc.Formula.TokenPrecedence = { - "!": 1, - ":": 2, ",": 2, - "M": -3, "P": -3, - "%": 4, - "^": 5, - "*": 6, "/": 6, - "+": 7, "-": 7, - "&": 8, - "<": 9, ">": 9, "G": 9, "L": 9, "N": 9 - }; - - // Convert one-char token text to input text: - - SocialCalc.Formula.TokenOpExpansion = {'G': '>=', 'L': '<=', 'M': '-', 'N': '<>', 'P': '+'}; - - // - // Information about the resulting value types when doing operations on values (used by LookupResultType) - // - // Each object entry is an object with specific types with result type info as follows: - // - // 'type1a': '|type2a:resulta|type2b:resultb|... - // Type of t* or n* matches any of those types not listed - // Results may be a type or the numbers 1 or 2 specifying to return type1 or type2 - - - SocialCalc.Formula.TypeLookupTable = { - unaryminus: { 'n*': '|n*:1|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - unaryplus: { 'n*': '|n*:1|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - unarypercent: { 'n*': '|n:n%|n*:n|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - plus: { - 'n%': '|n%:n%|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nd': '|n%:n|nd:nd|nt:ndt|ndt:ndt|n$:n|n:nd|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nt': '|n%:n|nd:ndt|nt:nt|ndt:ndt|n$:n|n:nt|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'ndt': '|n%:n|nd:ndt|nt:ndt|ndt:ndt|n$:n|n:ndt|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'n$': '|n%:n|nd:n|nt:n|ndt:n|n$:n$|n:n$|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nl': '|n%:n|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'n': '|n%:n|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'b': '|n%:n%|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 't*': '|n*:e#VALUE!|t*:e#VALUE!|b:e#VALUE!|e*:2|', - 'e*': '|e*:1|n*:1|t*:1|b:1|' - }, - concat: { - 't': '|t:t|th:th|tw:tw|tl:t|t*:2|e*:2|', - 'th': '|t:th|th:th|tw:t|tl:th|t*:t|e*:2|', - 'tw': '|t:tw|th:t|tw:tw|tl:tw|t*:t|e*:2|', - 'tl': '|t:tl|th:th|tw:tw|tl:tl|t*:t|e*:2|', - 'e*': '|e*:1|n*:1|t*:1|' - }, - oneargnumeric: { 'n*': '|n*:n|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - twoargnumeric: { 'n*': '|n*:n|t*:e#VALUE!|e*:2|', 'e*': '|e*:1|n*:1|t*:1|', 't*': '|t*:e#VALUE!|n*:e#VALUE!|e*:2|'}, - propagateerror: { 'n*': '|n*:2|e*:2|', 'e*': '|e*:2|', 't*': '|t*:2|e*:2|', 'b': '|b:2|e*:2|'} - }; - -/* ******************* - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(line) - - Parses a text string as if it was a spreadsheet formula - - This uses a simple state machine run on each character in turn. - States remember whether a number is being gathered, etc. - The result is parseinfo which is an array with one entry for each token: - parseinfo[i] = { - text: "the characters making up the parsed token", - type: the type of the token (a number), - opcode: a single character version of an operator suitable for use in the - precedence table and distinguishing between unary and binary + and -. - -************************* */ - -SocialCalc.Formula.ParseFormulaIntoTokens = function(line) { - - var i, ch, chclass, haddecimal, last_token, last_token_type, last_token_text, t; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var parsestate = scf.ParseState; - var tokentype = scf.TokenType; - var charclass = scf.CharClass; - var charclasstable = scf.CharClassTable; - var uppercasetable = scf.UpperCaseTable; // much faster than toUpperCase function - var pushtoken = scf.ParsePushToken; - var coordregex = /^\$?[A-Z]{1,2}\$?[1-9]\d*$/i; - - var parseinfo = []; - var str = ""; - var state = 0; - haddecimal = false; - - for (i=0; i<=line.length; i++) { - if (i0) { - last_token = parseinfo[parseinfo.length-1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - if (last_token_type == charclass.op) { - if (last_token_text == '<' || last_token_text == ">") { - str = last_token_text + str; - parseinfo.pop(); - if (parseinfo.length>0) { - last_token = parseinfo[parseinfo.length-1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - } - else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - } - } - } - else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - t = tokentype.op; - if ((parseinfo.length == 0) - || (last_token_type == charclass.op && last_token_text != ')' && last_token_text != '%')) { // Unary operator - if (str == '-') { // M is unary minus - str = "M"; - ch = "M"; - } - else if (str == '+') { // P is unary plus - str = "P"; - ch = "P"; - } - else if (str == ')' && last_token_text == '(') { // null arg list OK - ; - } - else if (str != '(') { // binary-op open-paren OK, others no - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } - else if (str.length > 1) { - if (str == '>=') { // G is >= - str = "G"; - ch = "G"; - } - else if (str == '<=') { // L is <= - str = "L"; - ch = "L"; - } - else if (str == '<>') { // N is <> - str = "N"; - ch = "N"; - } - else { - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } - pushtoken(parseinfo, str, t, ch); - state = 0; - } - else if (cclass == charclass.quote) { // starting a string - str = ""; - state = parsestate.string; - } - else if (cclass == charclass.space) { // store so can reconstruct spacing - pushtoken(parseinfo, " ", tokentype.space, 0); - } - else if (cclass == charclass.eof) { // ignore -- needed to have extra loop to close out other things - } - else { // unknown class - such as unknown char - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - } - } - } - - return parseinfo; - - } - -SocialCalc.Formula.ParsePushToken = function(parseinfo, ttext, ttype, topcode) { - - parseinfo.push({text: ttext, type: ttype, opcode: topcode}); - - } - -/* ******************* - - result = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, allowrangereturn) - - Does the calculation expressed in a parsed formula, returning a value, its type, and error info - returns: {value: value, type: valuetype, error: errortext}. - - If allowrangereturn is present and true, can return a range (e.g., "A1:A10" - translated from "A1|A10|") - -************************* */ - -SocialCalc.Formula.evaluate_parsed_formula = function(parseinfo, sheet, allowrangereturn) { - - var result; - - var scf = SocialCalc.Formula; - var tokentype = scf.TokenType; - - var revpolish; - var parsestack = []; - - var errortext = ""; - - revpolish = scf.ConvertInfixToPolish(parseinfo); // result is either an array or a string with error text - - result = scf.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn); - - return result; - -} - -// -// revpolish = SocialCalc.Formula.ConvertInfixToPolish(parseinfo) -// -// Convert infix to reverse polish notation -// -// Returns revpolish array with a sequence of references to tokens by number if successful. -// Errors return a string with the error. -// -// Based upon the algorithm shown in Wikipedia "Reverse Polish notation" article -// and then enhanced for additional spreadsheet things -// - -SocialCalc.Formula.ConvertInfixToPolish = function(parseinfo) { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var token_precedence = scf.TokenPrecedence; - - var revpolish = []; - var parsestack = []; - - var errortext = ""; - - var function_start = -1; - - var i, pii, ttype, ttext, tprecedence, tstackprecedence; - - for (i=0; i= 0 && tprecedence < tstackprecedence) { - break; - } - else if (tprecedence < 0) { - tprecedence = -tprecedence; - if (tstackprecedence < 0) tstackprecedence = -tstackprecedence; - if (tprecedence <= tstackprecedence) { - break; - } - } - revpolish.push(parsestack.pop()); - } - parsestack.push(i); - } - else if (ttype == tokentype.error) { - errortext = ttext; - break; - } - else { - errortext = "Internal error while processing parsed formula. "; - break; - } - } - while (parsestack.length>0) { - if (parseinfo[parsestack[parsestack.length-1]].text == '(') { - errortext = scc.s_parseerrmissingcloseparen; - break; - } - revpolish.push(parsestack.pop()); - } - - if (errortext) { - return errortext; - } - - return revpolish; - - } - - -// -// result = SocialCalc.Formula.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn) -// -// Execute reverse polish representation of formula -// -// Operand values are objects in the operand array with a "type" and an optional "value". -// Type can have these values (many are type and sub-type as two or more letters): -// "tw", "th", "t", "n", "nt", "coord", "range", "start", "eErrorType", "b" (blank) -// The value of a coord is in the form A57 or A57!sheetname -// The value of a range is coord|coord|number where number starts at 0 and is -// the offset of the next item to fetch if you are going through the range one by one -// The number starts as a null string ("A1|B3|") -// - -SocialCalc.Formula.EvaluatePolish = function(parseinfo, revpolish, sheet, allowrangereturn) { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var lookup_result_type = scf.LookupResultType; - var typelookup = scf.TypeLookupTable; - var operand_as_number = scf.OperandAsNumber; - var operand_as_text = scf.OperandAsText; - var operand_value_and_type = scf.OperandValueAndType; - var operands_as_coord_on_sheet = scf.OperandsAsCoordOnSheet; - var format_number_for_display = SocialCalc.format_number_for_display || function(v, t, f) {return v+"";}; - - var errortext = ""; - var function_start = -1; - var missingOperandError = {value: "", type: "e#VALUE!", error: scc.s_parseerrmissingoperand}; - - var operand = []; - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var i, rii, prii, ttype, ttext, value1, value2, tostype, tostype2, resulttype, valuetype, cond, vmatch, smatch; - - if (!parseinfo.length || (! (revpolish instanceof Array))) { - return ({value: "", type: "e#VALUE!", error: (typeof revpolish == "string" ? revpolish : "")}); - } - - for (i=0; i N (< <= = >= > <>) - - else if (ttext == "<" || ttext == "L" || ttext == "=" || ttext == "G" || ttext == ">" || ttext == "N") { - if (operand.length <= 1) { // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_value_and_type(sheet, operand); - value1 = operand_value_and_type(sheet, operand); - if (value1.type.charAt(0) == "n" && value2.type.charAt(0) == "n") { // compare two numbers - cond = 0; - if (ttext == "<") { cond = value1.value < value2.value ? 1 : 0; } - else if (ttext == "L") { cond = value1.value <= value2.value ? 1 : 0; } - else if (ttext == "=") { cond = value1.value == value2.value ? 1 : 0; } - else if (ttext == "G") { cond = value1.value >= value2.value ? 1 : 0; } - else if (ttext == ">") { cond = value1.value > value2.value ? 1 : 0; } - else if (ttext == "N") { cond = value1.value != value2.value ? 1 : 0; } - PushOperand("nl", cond); - } - else if (value1.type.charAt(0) == "e") { // error on left - PushOperand(value1.type, 0); - } - else if (value2.type.charAt(0) == "e") { // error on right - PushOperand(value2.type, 0); - } - else { // text maybe mixed with numbers or blank - tostype = value1.type.charAt(0); - tostype2 = value2.type.charAt(0); - if (tostype == "n") { - value1.value = format_number_for_display(value1.value, "n", ""); - } - else if (tostype == "b") { - value1.value = ""; - } - if (tostype2 == "n") { - value2.value = format_number_for_display(value2.value, "n", ""); - } - else if (tostype2 == "b") { - value2.value = ""; - } - cond = 0; - value1.value = value1.value.toLowerCase(); // ignore case - value2.value = value2.value.toLowerCase(); - if (ttext == "<") { cond = value1.value < value2.value ? 1 : 0; } - else if (ttext == "L") { cond = value1.value <= value2.value ? 1 : 0; } - else if (ttext == "=") { cond = value1.value == value2.value ? 1 : 0; } - else if (ttext == "G") { cond = value1.value >= value2.value ? 1 : 0; } - else if (ttext == ">") { cond = value1.value > value2.value ? 1 : 0; } - else if (ttext == "N") { cond = value1.value != value2.value ? 1 : 0; } - PushOperand("nl", cond); - } - } - - // Normal infix arithmethic operators: +, -. *, /, ^ - - else { // what's left are the normal infix arithmetic operators - if (operand.length <= 1) { // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_as_number(sheet, operand); - value1 = operand_as_number(sheet, operand); - if (ttext == '+') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value + value2.value); - } - else if (ttext == '-') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value - value2.value); - } - else if (ttext == '*') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value * value2.value); - } - else if (ttext == '/') { - if (value2.value != 0) { - PushOperand("n", value1.value / value2.value); // gives plain numeric result type - } - else { - PushOperand("e#DIV/0!", 0); - } - } - else if (ttext == '^') { - value1.value = Math.pow(value1.value, value2.value); - value1.type = "n"; // gives plain numeric result type - if (isNaN(value1.value)) { - value1.value = 0; - value1.type = "e#NUM!"; - } - PushOperand(value1.type, value1.value); - } - } - } - - // function or name - - else if (ttype == tokentype.name) { - errortext = scf.CalculateFunction(ttext, operand, sheet); - if (errortext) break; - } - - else { - errortext = scc.s_InternalError+"Unknown token "+ttype+" ("+ttext+"). "; - break; - } - } - - // look at final value and handle special cases - - value = operand[0] ? operand[0].value : ""; - tostype = operand[0] ? operand[0].type : ""; - - if (tostype == "name") { // name - expand it - value1 = SocialCalc.Formula.LookupName(sheet, value); - value = value1.value; - tostype = value1.type; - errortext = errortext || value1.error; - } - - if (tostype == "coord") { // the value is a coord reference, get its value and type - value1 = operand_value_and_type(sheet, operand); - value = value1.value; - tostype = value1.type; - if (tostype == "b") { - tostype = "n"; - value = 0; - } - } - - if (operand.length > 1 && !errortext) { // something left - error - errortext += scc.s_parseerrerrorinformula; - } - - // set return type - - valuetype = tostype; - - if (tostype.charAt(0) == "e") { // error value - errortext = errortext || tostype.substring(1) || scc.s_calcerrerrorvalueinformula; - } - else if (tostype == "range") { - vmatch = value.match(/^(.*)\|(.*)\|/); - smatch = vmatch[1].indexOf("!"); - if (smatch>=0) { // swap sheetname - vmatch[1] = vmatch[1].substring(smatch+1) + "!" + vmatch[1].substring(0, smatch).toUpperCase(); - } - else { - vmatch[1] = vmatch[1].toUpperCase(); - } - value = vmatch[1] + ":" + vmatch[2].toUpperCase(); - if (!allowrangereturn) { - errortext = scc.s_formularangeresult+" "+value; - } - } - - if (errortext && valuetype.charAt(0) != "e") { - value = errortext; - valuetype = "e"; - } - - // look for overflow - - if (valuetype.charAt(0) == "n" && (isNaN(value) || !isFinite(value))) { - value = 0; - valuetype = "e#NUM!"; - errortext = isNaN(value) ? scc.s_calcerrnumericnan: scc.s_calcerrnumericoverflow; - } - - return ({value: value, type: valuetype, error: errortext}); - - } - - -/* -# -# resulttype = SocialCalc.Formula.LookupResultType(type1, type2, typelookup); -# -# typelookup has values of the following form: -# -# typelookup{"typespec1"} = "|typespec2A:resultA|typespec2B:resultB|..." -# -# First type1 is looked up. If no match, then the first letter (major type) of type1 plus "*" is looked up -# resulttype is type1 if result is "1", type2 if result is "2", otherwise the value of result. -# -*/ - -SocialCalc.Formula.LookupResultType = function(type1, type2, typelookup) { - - var pos1, pos2, result; - - var table1 = typelookup[type1]; - - if (!table1) { - table1 = typelookup[type1.charAt(0)+'*']; - if (!table1) { - return "e#VALUE! (internal error, missing LookupResultType "+type1.charAt(0)+"*)"; // missing from table -- please add it - } - } - pos1 = table1.indexOf("|"+type2+":"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1+1); - if (pos2<0) return "e#VALUE! (internal error, incorrect LookupResultType "+table1+")"; - result = table1.substring(pos1+type2.length+2, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - pos1 = table1.indexOf("|"+type2.charAt(0)+"*:"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1+1); - if (pos2<0) return "e#VALUE! (internal error, incorrect LookupResultType "+table1+")"; - result = table1.substring(pos1+4, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - return "e#VALUE!"; - - } - -/* -# -# operandinfo = SocialCalc.Formula.TopOfStackValueAndType(sheet, operand) -# -# Returns top of stack value and type and then pops the stack. -# The result is {value: value, type: type, error: "only if bad error"} -# -*/ - -SocialCalc.Formula.TopOfStackValueAndType = function(sheet, operand) { - - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - if (!stacklen) { // make sure something is there - result.error = SocialCalc.Constants.s_InternalError+"no operand on stack"; - return result; - } - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - return result; - - } - - -/* -# -# operandinfo = OperandAsNumber(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns numeric value and type. -# Text values are treated as 0 if they can't be converted somehow. -# -*/ - -SocialCalc.Formula.OperandAsNumber = function(sheet, operand) { - - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "n") { - operandinfo.value = operandinfo.value-0; - } - else if (t == "b") { // blank cell - operandinfo.type = "n"; - operandinfo.value = 0; - } - else if (t == "e") { // error - operandinfo.value = 0; - } - else { - valueinfo = SocialCalc.DetermineValueType ? SocialCalc.DetermineValueType(operandinfo.value) : - {value: operandinfo.value-0, type: "n"}; // if without rest of SocialCalc - if (valueinfo.type.charAt(0) == "n") { - operandinfo.value = valueinfo.value-0; - operandinfo.type = valueinfo.type; - } - else { - operandinfo.value = 0; - operandinfo.type = valueinfo.type; - } - } - - return operandinfo; - - } - -/* -# -# operandinfo = OperandAsText(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns text value, preserving sub-type. -# -*/ - -SocialCalc.Formula.OperandAsText = function(sheet, operand) { - - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "t") { // any flavor of text returns as is - ; - } - else if (t == "n") { - operandinfo.value = SocialCalc.format_number_for_display ? - SocialCalc.format_number_for_display(operandinfo.value, operandinfo.type, "") : - operandinfo.value = operandinfo.value+""; - operandinfo.type = "t"; - } - else if (t == "b") { // blank - operandinfo.value = ""; - operandinfo.type = "t"; - } - else if (t == "e") { // error - operandinfo.value = ""; - } - else { - operand.value = operandinfo.value + ""; - operand.type = "t"; - } - - return operandinfo; - - } - -/* -# -# result = SocialCalc.Formula.OperandValueAndType(sheet, operand) -# -# Pops the top of stack and returns it, following a coord reference if necessary. -# The result is {value: value, type: type, error: "only if bad error"} -# Ranges are returned as if they were pushed onto the stack first coord first -# Also sets type with "t", "n", "th", etc., as appropriate -# -*/ - -SocialCalc.Formula.OperandValueAndType = function(sheet, operand) { - - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - if (!stacklen) { // make sure something is there - result.error = SocialCalc.Constants.s_InternalError+"no operand on stack"; - return result; - } - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - if (result.type == "range") { - result = scf.StepThroughRangeDown(operand, result.value); - } - - if (result.type == "coord") { // value is a coord reference - coordsheet = sheet; - pos = result.value.indexOf("!"); - if (pos != -1) { // sheet reference - coordsheet = scf.FindInSheetCache(result.value.substring(pos+1)); // get other sheet - if (coordsheet == null) { // unavailable - result.type = "e#REF!"; - result.error = SocialCalc.Constants.s_sheetunavailable+" "+result.value.substring(pos+1); - result.value = 0; - return result; - } - result.value = result.value.substring(0, pos); // get coord part - } - - if (coordsheet) { - cell = coordsheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - cellvtype = cell.valuetype; // get type of value in the cell it points to - result.value = cell.datavalue; - } - else { - cellvtype = "b"; - } - } - else { - cellvtype = "e#N/A"; - result.value = 0; - } - result.type = cellvtype || "b"; - if (result.type == "b") { // blank - result.value = 0; - } - } - - return result; - - } - -/* -# -# operandinfo = SocialCalc.Formula.OperandAsCoord(sheet, operand) -# -# Gets top of stack and pops it. -# Returns coord value. All others are treated as an error. -# -*/ - - -SocialCalc.Formula.OperandAsCoord = function(sheet, operand) { - - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - result = SocialCalc.Formula.LookupName(sheet, result.value); - } - if (result.type == "coord") { // value is a coord reference - return result; - } - else { - result.value = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - return result; - } -} - - -/* -# -# result = SocialCalc.Formula.OperandsAsCoordOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as sheetname!coord-or-name. -# Returns stack-style coord value (coord!sheetname, or coord!sheetname|coord|) with -# a type of coord or range. All others are treated as an error. -# If sheetname not available, sets result.error. -# -*/ - -SocialCalc.Formula.OperandsAsCoordOnSheet = function(sheet, operand) { - - var sheetname, othersheet, pos1, pos2; - var value1 = {}; - var result = {}; - var scf = SocialCalc.Formula; - - var stacklen = operand.length; - value1.value = operand[stacklen-1].value; // get top of stack - coord or name - value1.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - sheetname = scf.OperandAsSheetName(sheet, operand); // get sheetname as text - othersheet = scf.FindInSheetCache(sheetname.value); - if (othersheet == null) { // unavailable - result.type = "e#REF!"; - result.value = 0; - result.error = SocialCalc.Constants.s_sheetunavailable+" "+sheetname.value; - return result; - } - - if (value1.type == "name") { - value1 = scf.LookupName(othersheet, value1.value); - } - result.type = value1.type; - if (value1.type == "coord") { // value is a coord reference - result.value = value1.value + "!" + sheetname.value; // return in the format as used on stack - } - else if (value1.type == "range") { // value is a range reference - pos1 = value1.value.indexOf("|"); - pos2 = value1.value.indexOf("|", pos1+1); - result.value = value1.value.substring(0, pos1) + "!" + sheetname.value + - "|" + value1.value.substring(pos1+1, pos2) + "|"; - } - else if (value1.type.charAt(0)=="e") { - result.value = value1.value; - } - else { - result.error = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - result.value = 0; - } - return result; - - } - -/* -# -# result = SocialCalc.Formula.OperandsAsRangeOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as coord2-or-name:coord1. -# Name is evaluated on sheet of coord1. -# Returns result with "value" of stack-style range value (coord!sheetname|coord|) and -# "type" of "range". All others are treated as an error. -# -*/ - -SocialCalc.Formula.OperandsAsRangeOnSheet = function(sheet, operand) { - - var value1, othersheet, pos1, pos2; - var value2 = {}; - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var stacklen = operand.length; - value2.value = operand[stacklen-1].value; // get top of stack - coord or name for "right" side - value2.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - value1 = scf.OperandAsCoord(sheet, operand); // get "left" coord - if (value1.type != "coord") { // not a coord, which it must be - return {value: 0, type: "e#REF!"}; - } - - othersheet = sheet; - pos1 = value1.value.indexOf("!"); - if (pos1 != -1) { // sheet reference - pos2 = value1.value.indexOf("|", pos1+1); - if (pos2 < 0) pos2 = value1.value.length; - othersheet = scf.FindInSheetCache(value1.value.substring(pos1+1,pos2)); // get other sheet - if (othersheet == null) { // unavailable - return {value: 0, type: "e#REF!", errortext: scc.s_sheetunavailable+" "+value1.value.substring(pos1+1,pos2)}; - } - } - - if (value2.type == "name") { // coord:name is allowed, if name is just one cell - value2 = scf.LookupName(othersheet, value2.value); - } - - if (value2.type == "coord") { // value is a coord reference, so return the combined range - return {value: value1.value+"|"+value2.value+"|", type: "range"}; // return range in the format as used on stack - } - else { // bad form - return {value: scc.s_calcerrcellrefmissing, type: "e#REF!"}; - } - } - - -/* -# -# result = SocialCalc.Formula.OperandAsSheetName(sheet, operand) -# -# Gets top of stack and pops it. -# Returns sheetname value. All others are treated as an error. -# Accepts text, cell reference, and named value which is one of those two. -# -*/ - -SocialCalc.Formula.OperandAsSheetName = function(sheet, operand) { - - var nvalue, cell; - - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - nvalue = SocialCalc.Formula.LookupName(sheet, result.value); - if (!nvalue.value) { // not a known name - return bare name as the name value - return result; - } - result.value = nvalue.value; - result.type = nvalue.type; - } - if (result.type == "coord") { // value is a coord reference, follow it to find sheet name - cell = sheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - result.value = cell.datavalue; - result.type = cell.valuetype; - } - else { - result.value = ""; - result.type = "b"; - } - } - if (result.type.charAt(0) == "t") { // value is a string which could be a sheet name - return result; - } - else { - result.value = ""; - result.error = SocialCalc.Constants.s_calcerrsheetnamemissing; - return result; - } - - } - -// -// value = SocialCalc.Formula.LookupName(sheet, name) -// -// Returns value and type of a named value -// Names are case insensitive -// Names may have a definition which is a coord (A1), a range (A1:B7), or a formula (=OFFSET(A1,0,0,5,1)) -// Note: The range must not have sheet names ("!") in them. -// - -SocialCalc.Formula.LookupName = function(sheet, name) { - - var pos, specialc, parseinfo; - var names = sheet.names; - var value = {}; - var startedwalk = false; - - if (names[name.toUpperCase()]) { // is name defined? - - value.value = names[name.toUpperCase()].definition; // yes - - if (value.value.charAt(0) == "=") { // formula - if (!sheet.checknamecirc) { // are we possibly walking the name tree? - sheet.checknamecirc = {}; // not yet - startedwalk = true; // remember we are the reference that started it - } - else { - if (sheet.checknamecirc[name]) { // circular reference - value.type = "e#NAME?"; - value.error = SocialCalc.Constants.s_circularnameref+' "' + name + '".'; - return value; - } - } - sheet.checknamecirc[name] = true; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(value.value.substring(1)); - value = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, 1); // parse formula, allowing range return - - delete sheet.checknamecirc[name]; // done with us - if (startedwalk) { - delete sheet.checknamecirc; // done with walk - } - - if (value.type != "range") { - return value; - } - } - - pos = value.value.indexOf(":"); - if (pos != -1) { // range - value.type = "range"; - value.value = value.value.substring(0, pos) + "|" + value.value.substring(pos+1)+"|"; - value.value = value.value.toUpperCase(); - } - else { - value.type = "coord"; - value.value = value.value.toUpperCase(); - } - return value; - } - else if (specialc=SocialCalc.Formula.SpecialConstants[name.toUpperCase()]) { // special constant, like #REF! - pos = specialc.indexOf(","); - value.value = specialc.substring(0,pos)-0; - value.type = specialc.substring(pos+1); - return value; - } - else { - value.value = ""; - value.type = "e#NAME?"; - value.error = SocialCalc.Constants.s_calcerrunknownname+' "'+name+'"'; - return value; - } - } - -/* -# -# coord = SocialCalc.Formula.StepThroughRangeDown(operand, rangevalue) -# -# Returns next coord in a range, keeping track on the operand stack -# Goes from upper left across and down to bottom right. -# -*/ - -SocialCalc.Formula.StepThroughRangeDown = function(operand, rangevalue) { - - var value1, value2, sequence, pos1, pos2, sheet1, rp, c, r, count; - var scf = SocialCalc.Formula; - - pos1 = rangevalue.indexOf("|"); - pos2 = rangevalue.indexOf("|", pos1+1); - value1 = rangevalue.substring(0, pos1); - value2 = rangevalue.substring(pos1+1, pos2); - sequence = rangevalue.substring(pos2+1) - 0; - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1); - value1 = value1.substring(0, pos1); - } - else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - rp = scf.OrderRangeParts(value1, value2); - - count = 0; - for (r=rp.r1; r<=rp.r2; r++) { - for (c=rp.c1; c<=rp.c2; c++) { - count++; - if (count > sequence) { - if (r!=rp.r2 || c!=rp.c2) { // keep on stack until done - scf.PushOperand(operand, "range", value1+sheet1+"|"+value2+"|"+count); - } - return {value: SocialCalc.crToCoord(c, r)+sheet1, type: "coord"}; - } - } - } - } - -/* -# -# result = SocialCalc.Formula.DecodeRangeParts(sheetdata, range) -# -# Returns sheetdata for the sheet where the range is, as well as -# the number of the first column in the range, the number of columns, -# and equivalent row information: -# -# {sheetdata: sheet, sheetname: name-or-"", col1num: n, ncols: n, row1num: n, nrows: n} -# -# If any errors, a null result is returned. -# -*/ - -SocialCalc.Formula.DecodeRangeParts = function(sheetdata, range) { - - var value1, value2, pos1, pos2, sheet1, coordsheetdata, rp; - - var scf = SocialCalc.Formula; - - pos1 = range.indexOf("|"); - pos2 = range.indexOf("|", pos1+1); - value1 = range.substring(0, pos1); - value2 = range.substring(pos1+1, pos2); - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1+1); - value1 = value1.substring(0, pos1); - } - else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - coordsheetdata = sheetdata; - if (sheet1) { // sheet reference - coordsheetdata = scf.FindInSheetCache(sheet1); - if (coordsheetdata == null) { // unavailable - return null; - } - } - - rp = scf.OrderRangeParts(value1, value2); - - return {sheetdata: coordsheetdata, sheetname: sheet1, col1num: rp.c1, ncols: rp.c2-rp.c1+1, row1num: rp.r1, nrows: rp.r2-rp.r1+1} - - } - - -//********************* -// -// Function Handling -// -//********************* - -// List of functions -- Define after functions are defined -// -// SocialCalc.Formula.FunctionList["function_name"] = [function_subroutine, number_of_arguments, arg_def, func_def, func_class] -// function_subroutine takes arguments (fname, operand, foperand, sheet), returns -// errortext or null, pushing result on operand stack. -// number_of_arguments is: -// 0 = no arguments -// >0 = exactly that many arguments -// <0 = that many arguments (abs value) or more -// 100 = don't check -// -// arg_def, if present, is the name of the element in SocialCalc.Formula.FunctionArgDefs. -// func_def, if present, is a string explaining the function. If not, looked up in SocialCalc.Constants. -// func_class, if present, is the comma-separated names of the elements in SocialCalc.Formula.FunctionClasses. -// -// To add a function, just add it to this object. - - if (!SocialCalc.Formula.FunctionList) { // make sure it is defined (could have been in another module) - SocialCalc.Formula.FunctionList = {}; - } - - // FunctionClasses[classname] = {name: full-name-string, items: [sorted list of function names]}; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionClasses = null; // start null to say needs filling in - - // FunctionArgDef[argname] = explicit-string-for-arg-list; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionArgDefs = {}; - - -/* -# -# errortext = SocialCalc.Formula.CalculateFunction(fname, operand, sheet) -# -# Dispatches for function fname. -# -*/ - -SocialCalc.Formula.CalculateFunction = function(fname, operand, sheet) { - - var fobj, foperand, ffunc, argnum, ttext; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = ""; - - fobj = scf.FunctionList[fname]; - - if (fobj) { - foperand = []; - ffunc = fobj[0]; - argnum = fobj[1]; - scf.CopyFunctionArgs(operand, foperand); - if (argnum != 100) { - if (argnum < 0) { - if (foperand.length < -argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } - else { - if (foperand.length != argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } - } - errortext = ffunc(fname, operand, foperand, sheet); - } - - else { - ttext = fname; - - if (operand.length && operand[operand.length-1].type == "start") { // no arguments - name or zero arg function - operand.pop(); - scf.PushOperand(operand, "name", ttext); - } - - else { - errortext = SocialCalc.Constants.s_sheetfuncunknownfunction+" " + ttext +". "; - } - } - - return errortext; - -} - -// -// SocialCalc.Formula.PushOperand(operand, t, v) -// -// Pushes the type and value onto the operand stack -// - -SocialCalc.Formula.PushOperand = function(operand, t, v) { - - operand.push({type: t, value: v}); - - } - -// -// SocialCalc.Formula.CopyFunctionArgs(operand, foperand) -// -// Pops operands from operand and pushes on foperand up to function start -// reversing order in the process. -// - -SocialCalc.Formula.CopyFunctionArgs = function(operand, foperand) { - - var fobj, foperand, ffunc, argnum; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = null; - - while (operand.length>0 && operand[operand.length-1].type != "start") { // get each arg - foperand.push(operand.pop()); // copy it - } - operand.pop(); // get rid of "start" - - return; - - } - -// -// errortext = SocialCalc.Formula.FunctionArgsError(fname, operand) -// -// Pushes appropriate error on operand stack and returns errortext, including fname -// - -SocialCalc.Formula.FunctionArgsError = function(fname, operand) { - - var errortext = SocialCalc.Constants.s_calcerrincorrectargstofunction+" " + fname + ". "; - SocialCalc.Formula.PushOperand(operand, "e#VALUE!", errortext); - - return errortext; - - } - - -// -// errortext = SocialCalc.Formula.FunctionSpecificError(fname, operand, errortype, errortext) -// -// Pushes specified error and text on operand stack. -// - -SocialCalc.Formula.FunctionSpecificError = function(fname, operand, errortype, errortext) { - - SocialCalc.Formula.PushOperand(operand, errortype, errortext); - - return errortext; - - } - -// -// haserror = SocialCalc.Formula.CheckForErrorValue(operand, v) -// -// If v.type is an error, push it on operand stack and return true, otherwise return false. -// - -SocialCalc.Formula.CheckForErrorValue = function(operand, v) { - - if (v.type.charAt(0) == "e") { - operand.push(v); - return true; - } - else { - return false; - } - - } - -///////////////////////// -// -// FUNCTION INFORMATION ROUTINES -// - -// -// SocialCalc.Formula.FillFunctionInfo() -// -// Goes through function definitions and fills out FunctionArgDefs and FunctionClasses. -// Execute this after any changes to SocialCalc.Constants but before UI is used. -// - -SocialCalc.Formula.FillFunctionInfo = function() { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var fname, f, classes, cname, i; - - if (scf.FunctionClasses) { // only do once - return; - } - - for (fname in scf.FunctionList) { - f = scf.FunctionList[fname]; - if (f[2]) { // has an arg def - scf.FunctionArgDefs[f[2]] = scc["s_farg_"+f[2]] || ""; // get it from constants - } - if (!f[3]) { // no text def, see if in constants - if (scc["s_fdef_"+fname]) { - scf.FunctionList[fname][3] = scc["s_fdef_"+fname]; - } - } - } - - scf.FunctionClasses = {}; - - for (i=0; i 0) { - str = "v1"; - for (i=2; i<=nargs; i++) { - str += ", v"+i; - } - return str; - } - else if (nargs < 0) { - str = "v1"; - for (i=2; i<-nargs; i++) { - str += ", v"+i; - } - return str+", ..."; - } - else { - return "nargs: "+nargs; - } - } - - str = scf.FunctionArgDefs[adef] || adef; - - return str; - - } - - -///////////////////////// -// -// FUNCTION DEFINITIONS -// -// The standard function definitions follow. -// -// Note that some need SocialCalc.DetermineValueType to be defined. -// - -/* -# -# AVERAGE(v1,c1:c2,...) -# COUNT(v1,c1:c2,...) -# COUNTA(v1,c1:c2,...) -# COUNTBLANK(v1,c1:c2,...) -# MAX(v1,c1:c2,...) -# MIN(v1,c1:c2,...) -# PRODUCT(v1,c1:c2,...) -# STDEV(v1,c1:c2,...) -# STDEVP(v1,c1:c2,...) -# SUM(v1,c1:c2,...) -# VAR(v1,c1:c2,...) -# VARP(v1,c1:c2,...) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the dseries_functions, too. -# -*/ - -SocialCalc.Formula.SeriesFunctions = function(fname, operand, foperand, sheet) { - - var value1, t, v1; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - while (foperand.length > 0) { - value1 = operand_value_and_type(sheet, foperand); - t = value1.type.charAt(0); - if (t == "n") count += 1; - if (t != "b") counta += 1; - if (t == "b") countblank += 1; - - if (t == "n") { - v1 = value1.value-0; // get it as a number - sum += v1; - product *= v1; - maxval = (maxval!=undefined) ? (v1 > maxval ? v1 : maxval) : v1; - minval = (minval!=undefined) ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } - else { // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type(value1.type, resulttypesum || value1.type, typelookupplus); - } - else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "SUM": - PushOperand(resulttypesum, sum); - break; - - case "PRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "MIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "MAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "COUNT": - PushOperand("n", count); - break; - - case "COUNTA": - PushOperand("n", counta); - break; - - case "COUNTBLANK": - PushOperand("n", countblank); - break; - - case "AVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum/count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - } - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["AVERAGE"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNT"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNTA"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNTBLANK"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["MAX"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["MIN"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["PRODUCT"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["STDEV"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["STDEVP"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["SUM"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["VAR"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["VARP"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; - -/* -# -# DAVERAGE(databaserange, fieldname, criteriarange) -# DCOUNT(databaserange, fieldname, criteriarange) -# DCOUNTA(databaserange, fieldname, criteriarange) -# DGET(databaserange, fieldname, criteriarange) -# DMAX(databaserange, fieldname, criteriarange) -# DMIN(databaserange, fieldname, criteriarange) -# DPRODUCT(databaserange, fieldname, criteriarange) -# DSTDEV(databaserange, fieldname, criteriarange) -# DSTDEVP(databaserange, fieldname, criteriarange) -# DSUM(databaserange, fieldname, criteriarange) -# DVAR(databaserange, fieldname, criteriarange) -# DVARP(databaserange, fieldname, criteriarange) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the series_functions, too. -# -*/ - -SocialCalc.Formula.DSeriesFunctions = function(fname, operand, foperand, sheet) { - - var value1, tostype, cr, dbrange, fieldname, criteriarange, dbinfo, criteriainfo; - var fieldasnum, targetcol, i, j, k, cell, criteriafieldnums; - var testok, criteriacr, criteria, testcol, testcr; - var t; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var value1 = {}; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - dbrange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - fieldname = scf.OperandValueAndType(sheet, foperand); // get a value - criteriarange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - - if (dbrange.type != "range" || criteriarange.type != "range") { - return scf.FunctionArgsError(fname, operand); - } - - dbinfo = scf.DecodeRangeParts(sheet, dbrange.value); - criteriainfo = scf.DecodeRangeParts(sheet, criteriarange.value); - - fieldasnum = scf.FieldToColnum(dbinfo.sheetdata, dbinfo.col1num, dbinfo.ncols, dbinfo.row1num, fieldname.value, fieldname.type); - if (fieldasnum <= 0) { - PushOperand("e#VALUE!", 0); - return; - } - - targetcol = dbinfo.col1num + fieldasnum - 1; - criteriafieldnums = []; - - for (i=0; i maxval ? v1 : maxval) : v1; - minval = (minval!=undefined) ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } - else { // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type(value1.type, resulttypesum || value1.type, typelookupplus); - } - else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "DSUM": - PushOperand(resulttypesum, sum); - break; - - case "DPRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "DMIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "DMAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "DCOUNT": - PushOperand("n", count); - break; - - case "DCOUNTA": - PushOperand("n", counta); - break; - - case "DAVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum/count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DGET": - if (count == 1) { - PushOperand(resulttypesum, sum); - } - else if (count == 0) { - PushOperand("e#VALUE!", 0); - } - else { - PushOperand("e#NUM!", 0); - } - break; - - } - - return; - - } - -SocialCalc.Formula.FunctionList["DAVERAGE"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DCOUNT"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DCOUNTA"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DGET"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DMAX"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DMIN"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DPRODUCT"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSTDEV"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSTDEVP"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSUM"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DVAR"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DVARP"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; - -/* -# -# colnum = SocialCalc.Formula.FieldToColnum(sheet, col1num, ncols, row1num, fieldname, fieldtype) -# -# If fieldname is a number, uses it, otherwise looks up string in cells in row to find field number -# -# If not found, returns 0. -# -*/ - -SocialCalc.Formula.FieldToColnum = function(sheet, col1num, ncols, row1num, fieldname, fieldtype) { - - var colnum, cell, value; - - if (fieldtype.charAt(0) == "n") { // number - return it if legal - colnum = fieldname - 0; // make sure a number - if (colnum <= 0 || colnum > ncols) { - return 0; - } - return Math.floor(colnum); - } - - if (fieldtype.charAt(0) != "t") { // must be text otherwise - return 0; - } - - fieldname = fieldname ? fieldname.toLowerCase() : ""; - - for (colnum=0; colnum < ncols; colnum++) { // look through column headers for a match - cell = sheet.GetAssuredCell(SocialCalc.crToCoord(col1num+colnum, row1num)); - value = cell.datavalue; - value = (value+"").toLowerCase(); // ignore case - if (value == fieldname) { // match - return colnum+1; - } - } - return 0; // looked at all and no match - - } - - -/* -# -# HLOOKUP(value, range, row, [rangelookup]) -# VLOOKUP(value, range, col, [rangelookup]) -# MATCH(value, range, [rangelookup]) -# -*/ - -SocialCalc.Formula.LookupFunctions = function(fname, operand, foperand, sheet) { - - var lookupvalue, range, offset, rangelookup, offsetvalue, rangeinfo; - var c, r, cincr, rincr, previousOK, csave, rsave, cell, value, valuetype, cr, lookupvalue; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - lookupvalue = operand_value_and_type(sheet, foperand); - if (typeof lookupvalue.value == "string") { - lookupvalue.value = lookupvalue.value.toLowerCase(); - } - - range = scf.TopOfStackValueAndType(sheet, foperand); - - rangelookup = 1; // default to true or 1 - if (fname == "MATCH") { - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value - 0; - } - } - else { - offsetvalue = scf.OperandAsNumber(sheet, foperand); - if (offsetvalue.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - offsetvalue = Math.floor(offsetvalue.value); - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value ? 1 : 0; // convert to 1 or 0 - } - } - lookupvalue.type = lookupvalue.type.charAt(0); // only deal with general type - if (lookupvalue.type == "n") { // if number, make sure a number - lookupvalue.value = lookupvalue.value - 0; - } - - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - rangeinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (!rangeinfo) { - PushOperand("e#REF!", 0); - return; - } - - c = 0; - r = 0; - cincr = 0; - rincr = 0; - if (fname == "HLOOKUP") { - cincr = 1; - if (offsetvalue > rangeinfo.nrows) { - PushOperand("e#REF!", 0); - return; - } - } - else if (fname == "VLOOKUP") { - rincr = 1; - if (offsetvalue > rangeinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - } - else if (fname == "MATCH") { - if (rangeinfo.ncols > 1) { - if (rangeinfo.nrows > 1) { - PushOperand("e#N/A", 0); - return; - } - cincr = 1; - } - else { - rincr = 1; - } - } - else { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (offsetvalue < 1 && fname != "MATCH") { - PushOperand("e#VALUE!", 0); - return 0; - } - - previousOK; // if 1, previous test was <. If 2, also this one wasn't - - while (1) { - cr = SocialCalc.crToCoord(rangeinfo.col1num + c, rangeinfo.row1num + r); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype ? cell.valuetype.charAt(0) : "b"; // only deal with general types - if (valuetype == "n") { - value = value - 0; // make sure number - } - if (rangelookup) { // rangelookup type 1 or -1: look for within brackets for matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { // match - break; - } - if ((rangelookup > 0 && lookupvalue.value > value) - || (rangelookup < 0 && lookupvalue.value < value)) { // possible match: wait and see - previousOK = 1; - csave = c; // remember col and row of last OK - rsave = r; - } - else if (previousOK) { // last one was OK, this one isn't - previousOK = 2; - break; - } - } - - else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { // match - break; - } - if ((rangelookup > 0 && lookupvalue.value > value) - || (rangelookup < 0 && lookupvalue.value < value)) { // possible match: wait and see - previousOK = 1; - csave = c; - rsave = r; - } - else if (previousOK) { // last one was OK, this one isn't - previousOK = 2; - break; - } - } - } - else { // exact value matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { // match - break; - } - } - else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { // match - break; - } - } - } - - r += rincr; - c += cincr; - if (r >= rangeinfo.nrows || c >= rangeinfo.ncols) { // end of range to check, no exact match - if (previousOK) { // at least one could have been OK - previousOK = 2; - break; - } - PushOperand("e#N/A", 0); - return; - } - } - - if (previousOK == 2) { // back to last OK - r = rsave; - c = csave; - } - - if (fname == "MATCH") { - value = c + r + 1; // only one may be <> 0 - valuetype = "n"; - } - else { - cr = SocialCalc.crToCoord(rangeinfo.col1num+c+(fname == "VLOOKUP" ? offsetvalue-1 : 0), rangeinfo.row1num+r+(fname == "HLOOKUP" ? offsetvalue-1 : 0)); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype; - } - PushOperand(valuetype, value); - - return; - - } - -SocialCalc.Formula.FunctionList["HLOOKUP"] = [SocialCalc.Formula.LookupFunctions, -3, "hlookup", "", "lookup"]; -SocialCalc.Formula.FunctionList["MATCH"] = [SocialCalc.Formula.LookupFunctions, -2, "match", "", "lookup"]; -SocialCalc.Formula.FunctionList["VLOOKUP"] = [SocialCalc.Formula.LookupFunctions, -3, "vlookup", "", "lookup"]; - -/* -# -# INDEX(range, rownum, colnum) -# -*/ - -SocialCalc.Formula.IndexFunction = function(fname, operand, foperand, sheet) { - - var range, sheetname, indexinfo, rowindex, colindex, result, resulttype; - - var scf = SocialCalc.Formula; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - indexinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (indexinfo.sheetname) { - sheetname = "!" + indexinfo.sheetname; - } - else { - sheetname = ""; - } - - rowindex = {value:0}; - colindex = {value:0}; - - if (foperand.length) { // look for row number - rowindex = scf.OperandAsNumber(sheet, foperand); - if (rowindex.type.charAt(0) != "n" || rowindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { // look for col number - colindex = scf.OperandAsNumber(sheet, foperand); - if (colindex.type.charAt(0) != "n" || colindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - } - else { // col number missing - if (indexinfo.nrows == 1) { // if only one row, then rowindex is really colindex - colindex.value = rowindex.value; - rowindex.value = 0; - } - } - } - - if (rowindex.value > indexinfo.nrows || colindex.value > indexinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - - if (rowindex.value == 0) { - if (colindex.value == 0) { - if (indexinfo.nrows == 1 && indexinfo.ncols == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+indexinfo.ncols-1, indexinfo.row1num+indexinfo.nrows-1) + - "|"; - resulttype = "range"; - } - } - else { - if (indexinfo.nrows == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num+indexinfo.nrows-1) + - "|"; - resulttype = "range"; - } - } - } - else { - if (colindex.value == 0) { - if (indexinfo.ncols == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num+rowindex.value-1) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num+rowindex.value-1) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+indexinfo.ncols-1, indexinfo.row1num+rowindex.value-1) + - "|"; - resulttype = "range"; - } - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num+rowindex.value-1) + sheetname; - resulttype = "coord"; - } - } - - PushOperand(resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["INDEX"] = [SocialCalc.Formula.IndexFunction, -1, "index", "", "lookup"]; - -/* -# -# COUNTIF(c1:c2,"criteria") -# SUMIF(c1:c2,"criteria",[range2]) -# -*/ - -SocialCalc.Formula.CountifSumifFunctions = function(fname, operand, foperand, sheet) { - - var range, criteria, sumrange, f2operand, result, resulttype, value1, value2; - var sum = 0; - var resulttypesum = ""; - var count = 0; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range or coord - criteria = scf.OperandAsText(sheet, foperand); // get criteria - if (fname == "SUMIF") { - if (foperand.length == 1) { // three arg form of SUMIF - sumrange = scf.TopOfStackValueAndType(sheet, foperand); - } - else if (foperand.length == 0) { // two arg form - sumrange = {value: range.value, type: range.type}; - } - else { - scf.FunctionArgsError(fname, operand); - return 0; - } - } - else { - sumrange = {value: range.value, type: range.type}; - } - - if (criteria.type.charAt(0) == "n") { - criteria.value = criteria.value + ""; // make text - } - else if (criteria.type.charAt(0) == "e") { // error - criteria.value = null; - } - else if (criteria.type.charAt(0) == "b") { // blank here is undefined - criteria.value = null; - } - - if (range.type != "coord" && range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - if (fname == "SUMIF" && sumrange.type != "coord" && sumrange.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - foperand.push(range); - f2operand = []; // to allow for 3 arg form - f2operand.push(sumrange); - - while (foperand.length) { - value1 = operand_value_and_type(sheet, foperand); - value2 = operand_value_and_type(sheet, f2operand); - - if (!scf.TestCriteria(value1.value, value1.type, criteria.value)) { - continue; - } - - count += 1; - - if (value2.type.charAt(0) == "n") { - sum += value2.value-0; - resulttypesum = lookup_result_type(value2.type, resulttypesum || value2.type, typelookupplus); - } - else if (value2.type.charAt(0) == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value2.type; - } - } - - resulttypesum = resulttypesum || "n"; - - if (fname == "SUMIF") { - PushOperand(resulttypesum, sum); - } - else if (fname == "COUNTIF") { - PushOperand("n", count); - } - - return; - - } - -SocialCalc.Formula.FunctionList["COUNTIF"] = [SocialCalc.Formula.CountifSumifFunctions, 2, "rangec", "", "stat"]; -SocialCalc.Formula.FunctionList["SUMIF"] = [SocialCalc.Formula.CountifSumifFunctions, -2, "sumif", "", "stat"]; - -/* -# -# IF(cond,truevalue,falsevalue) -# -*/ - -SocialCalc.Formula.IfFunction = function(fname, operand, foperand, sheet) { - - var cond, t; - - cond = SocialCalc.Formula.OperandValueAndType(sheet, foperand); - t = cond.type.charAt(0); - if (t != "n" && t != "b") { - operand.push({type: "e#VALUE!", value: 0}); - return; - } - - if (!cond.value) foperand.pop(); - operand.push(foperand.pop()); - if (cond.value) foperand.pop(); - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["IF"] = [SocialCalc.Formula.IfFunction, 3, "iffunc", "", "test"]; - -/* -# -# DATE(year,month,day) -# -*/ - -SocialCalc.Formula.DateFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var year = scf.OperandAsNumber(sheet, foperand); - var month = scf.OperandAsNumber(sheet, foperand); - var day = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(year.type, month.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, day.type, scf.TypeLookupTable.twoargnumeric); - if (resulttype.charAt(0) == "n") { - result = SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - Math.floor(year.value), Math.floor(month.value), Math.floor(day.value) - ) - SocialCalc.FormatNumber.datevalues.julian_offset; - resulttype = "nd"; - } - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["DATE"] = [SocialCalc.Formula.DateFunction, 3, "date", "", "datetime"]; - -/* -# -# TIME(hour,minute,second) -# -*/ - -SocialCalc.Formula.TimeFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var hours = scf.OperandAsNumber(sheet, foperand); - var minutes = scf.OperandAsNumber(sheet, foperand); - var seconds = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(hours.type, minutes.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, seconds.type, scf.TypeLookupTable.twoargnumeric); - if (resulttype.charAt(0) == "n") { - result = ((hours.value * 60 * 60) + (minutes.value * 60) + seconds.value) / (24*60*60); - resulttype = "nt"; - } - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["TIME"] = [SocialCalc.Formula.TimeFunction, 3, "hms", "", "datetime"]; - -/* -# -# DAY(date) -# MONTH(date) -# YEAR(date) -# WEEKDAY(date, [type]) -# -*/ - -SocialCalc.Formula.DMYFunctions = function(fname, operand, foperand, sheet) { - - var ymd, dtype, doffset; - var scf = SocialCalc.Formula; - var result = 0; - - var datevalue = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(datevalue.type, datevalue.type, scf.TypeLookupTable.oneargnumeric); - - if (resulttype.charAt(0) == "n") { - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian( - Math.floor(datevalue.value + SocialCalc.FormatNumber.datevalues.julian_offset)); - switch (fname) { - case "DAY": - result = ymd.day; - break; - - case "MONTH": - result = ymd.month; - break; - - case "YEAR": - result = ymd.year; - break; - - case "WEEKDAY": - dtype = {value: 1}; - if (foperand.length) { // get type if present - dtype = scf.OperandAsNumber(sheet, foperand); - if (dtype.type.charAt(0) != "n" || dtype.value < 1 || dtype.value > 3) { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { // extra args - scf.FunctionArgsError(fname, operand); - return; - } - } - doffset = 6; - if (dtype.value > 1) { - doffset -= 1; - } - result = Math.floor(datevalue.value+doffset) % 7 + (dtype.value < 3 ? 1 : 0); - break; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["DAY"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["MONTH"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["YEAR"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["WEEKDAY"] = [SocialCalc.Formula.DMYFunctions, -1, "weekday", "", "datetime"]; - -/* -# -# HOUR(datetime) -# MINUTE(datetime) -# SECOND(datetime) -# -*/ - -SocialCalc.Formula.HMSFunctions = function(fname, operand, foperand, sheet) { - - var hours, minutes, seconds, fraction; - var scf = SocialCalc.Formula; - var result = 0; - - var datetime = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(datetime.type, datetime.type, scf.TypeLookupTable.oneargnumeric); - - if (resulttype.charAt(0) == "n") { - if (datetime.value < 0) { - scf.PushOperand(operand, "e#NUM!", 0); // must be non-negative - return; - } - fraction = datetime.value - Math.floor(datetime.value); // fraction of a day - fraction *= 24; - hours = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - minutes = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - seconds = Math.floor(fraction + (datetime.value >= 0 ? 0.5: -0.5)); - if (fname == "HOUR") { - result = hours; - } - else if (fname == "MINUTE") { - result = minutes; - } - else if (fname == "SECOND") { - result = seconds; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["HOUR"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["MINUTE"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["SECOND"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; - -/* -# -# EXACT(v1,v2) -# -*/ - -SocialCalc.Formula.ExactFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value1 = scf.OperandValueAndType(sheet, foperand); - var v1type = value1.type.charAt(0); - var value2 = scf.OperandValueAndType(sheet, foperand); - var v2type = value2.type.charAt(0); - - if (v1type == "t") { - if (v2type == "t") { - result = value1.value == value2.value ? 1 : 0; - } - else if (v2type == "b") { - result = value1.value.length ? 0 : 1; - } - else if (v2type == "n") { - result = value1.value == value2.value+"" ? 1 : 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "n") { - if (v2type == "n") { - result = value1.value-0 == value2.value-0 ? 1 : 0; - } - else if (v2type == "b") { - result = 0; - } - else if (v2type == "t") { - result = value1.value+"" == value2.value ? 1 : 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "b") { - if (v2type == "t") { - result = value2.value.length ? 0 : 1; - } - else if (v2type == "b") { - result = 1; - } - else if (v2type == "n") { - result = 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "e") { - result = value1.value; - resulttype = value1.type; - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["EXACT"] = [SocialCalc.Formula.ExactFunction, 2, "", "", "text"]; - -/* -# -# FIND(key,string,[start]) -# LEFT(string,[length]) -# LEN(string) -# LOWER(string) -# MID(string,start,length) -# PROPER(string) -# REPLACE(string,start,length,new) -# REPT(string,count) -# RIGHT(string,[length]) -# SUBSTITUTE(string,old,new,[which]) -# TRIM(string) -# UPPER(string) -# -*/ - -// SocialCalc.Formula.ArgList has an array for each function, one entry for each possible arg (up to max). -// Min args are specified in SocialCalc.Formula.FunctionList. -// If array element is 1 then it's a text argument, if it's 0 then it's numeric, if -1 then just get whatever's there -// Text values are manipulated as UTF-8, converting from and back to byte strings - -SocialCalc.Formula.ArgList = { - FIND: [1, 1, 0], - LEFT: [1, 0], - LEN: [1], - LOWER: [1], - MID: [1, 0, 0], - PROPER: [1], - REPLACE: [1, 0, 0, 1], - REPT: [1, 0], - RIGHT: [1, 0], - SUBSTITUTE: [1, 1, 1, 0], - TRIM: [1], - UPPER: [1] - }; - -SocialCalc.Formula.StringFunctions = function(fname, operand, foperand, sheet) { - - var i, value, offset, len, start, count; - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var numargs = foperand.length; - var argdef = scf.ArgList[fname]; - var operand_value = []; - var operand_type = []; - - for (i=1; i <= numargs; i++) { // go through each arg, get value and type, and check for errors - if (i > argdef.length) { // too many args - scf.FunctionArgsError(fname, operand); - return; - } - if (argdef[i-1] == 0) { - value = scf.OperandAsNumber(sheet, foperand); - } - else if (argdef[i-1] == 1) { - value = scf.OperandAsText(sheet, foperand); - } - else if (argdef[i-1] == -1) { - value = scf.OperandValueAndType(sheet, foperand); - } - operand_value[i] = value.value; - operand_type[i] = value.type; - if (value.type.charAt(0) == "e") { - scf.PushOperand(operand, value.type, result); - return; - } - } - - switch (fname) { - case "FIND": - offset = operand_type[3] ? operand_value[3]-1 : 0; - if (offset < 0) { - result = "Start is before string"; // !! not displayed, no need to translate - } - else { - result = operand_value[2].indexOf(operand_value[1], offset); // (null string matches first char) - if (result >= 0) { - result += 1; - resulttype = "n"; - } - else { - result = "Not found"; // !! not displayed, error is e#VALUE! - } - } - break; - - case "LEFT": - len = operand_type[2] ? operand_value[2]-0 : 1; - if (len < 0) { - result = "Negative length"; - } - else { - result = operand_value[1].substring(0, len); - resulttype = "t"; - } - break; - - case "LEN": - result = operand_value[1].length; - resulttype = "n"; - break; - - case "LOWER": - result = operand_value[1].toLowerCase(); - resulttype = "t"; - break; - - case "MID": - start = operand_value[2]-0; - len = operand_value[3]-0; - if (len < 1 || start < 1) { - result = "Bad arguments"; - } - else { - result = operand_value[1].substring(start-1, start+len-1); - resulttype = "t"; - } - break; - - case "PROPER": - result = operand_value[1].replace(/\b\w+\b/g, function(word) { - return word.substring(0,1).toUpperCase() + - word.substring(1); - }); // uppercase first character of words (see JavaScript, Flanagan, 5th edition, page 704) - resulttype = "t"; - break; - - case "REPLACE": - start = operand_value[2]-0; - len = operand_value[3]-0; - if (len < 0 || start < 1) { - result = "Bad arguments"; - } - else { - result = operand_value[1].substring(0, start-1) + operand_value[4] + - operand_value[1].substring(start-1+len); - resulttype = "t"; - } - break; - - case "REPT": - count = operand_value[2]-0; - if (count < 0) { - result = "Negative count"; - } - else { - result = ""; - for (; count > 0; count--) { - result += operand_value[1]; - } - resulttype = "t"; - } - break; - - case "RIGHT": - len = operand_type[2] ? operand_value[2]-0 : 1; - if (len < 0) { - result = "Negative length"; - } - else { - result = operand_value[1].slice(-len); - resulttype = "t"; - } - break; - - case "SUBSTITUTE": - fulltext = operand_value[1]; - oldtext = operand_value[2]; - newtext = operand_value[3]; - if (operand_value[4] != null) { - which = operand_value[4]-0; - if (which <= 0) { - result = "Non-positive instance number"; - break; - } - } - else { - which = 0; - } - count = 0; - oldpos = 0; - result = ""; - while (true) { - pos = fulltext.indexOf(oldtext, oldpos); - if (pos >= 0) { - count++; //!!!!!! old test just in case: if (count>1000) {alert(pos); break;} - result += fulltext.substring(oldpos, pos); - if (which==0) { - result += newtext; // substitute - } - else if (which==count) { - result += newtext + fulltext.substring(pos+oldtext.length); - break; - } - else { - result += oldtext; // leave as was - } - oldpos = pos + oldtext.length; - } - else { // no more - result += fulltext.substring(oldpos); - break; - } - } - resulttype = "t"; - break; - - case "TRIM": - result = operand_value[1]; - result = result.replace(/^ */, ""); - result = result.replace(/ *$/, ""); - result = result.replace(/ +/g, " "); - resulttype = "t"; - break; - - case "UPPER": - result = operand_value[1].toUpperCase(); - resulttype = "t"; - break; - - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["FIND"] = [SocialCalc.Formula.StringFunctions, -2, "find", "", "text"]; -SocialCalc.Formula.FunctionList["LEFT"] = [SocialCalc.Formula.StringFunctions, -2, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["LEN"] = [SocialCalc.Formula.StringFunctions, 1, "txt", "", "text"]; -SocialCalc.Formula.FunctionList["LOWER"] = [SocialCalc.Formula.StringFunctions, 1, "txt", "", "text"]; -SocialCalc.Formula.FunctionList["MID"] = [SocialCalc.Formula.StringFunctions, 3, "mid", "", "text"]; -SocialCalc.Formula.FunctionList["PROPER"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["REPLACE"] = [SocialCalc.Formula.StringFunctions, 4, "replace", "", "text"]; -SocialCalc.Formula.FunctionList["REPT"] = [SocialCalc.Formula.StringFunctions, 2, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["RIGHT"] = [SocialCalc.Formula.StringFunctions, -1, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["SUBSTITUTE"] = [SocialCalc.Formula.StringFunctions, -3, "subs", "", "text"]; -SocialCalc.Formula.FunctionList["TRIM"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["UPPER"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; - -/* -# -# is_functions: -# -# ISBLANK(value) -# ISERR(value) -# ISERROR(value) -# ISLOGICAL(value) -# ISNA(value) -# ISNONTEXT(value) -# ISNUMBER(value) -# ISTEXT(value) -# -*/ - -SocialCalc.Formula.IsFunctions = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - - case "ISBLANK": - result = value.type == "b" ? 1 : 0; - break; - - case "ISERR": - result = t == "e" ? (value.type == "e#N/A" ? 0 : 1) : 0; - break; - - case "ISERROR": - result = t == "e" ? 1 : 0; - break; - - case "ISLOGICAL": - result = value.type == "nl" ? 1 : 0; - break; - - case "ISNA": - result = value.type == "e#N/A" ? 1 : 0; - break; - - case "ISNONTEXT": - result = t == "t" ? 0 : 1; - break; - - case "ISNUMBER": - result = t == "n" ? 1 : 0; - break; - - case "ISTEXT": - result = t == "t" ? 1 : 0; - break; - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["ISBLANK"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISERR"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISERROR"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISLOGICAL"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNA"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNONTEXT"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNUMBER"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISTEXT"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; - -/* -# -# ntv_functions: -# -# N(value) -# T(value) -# VALUE(value) -# -*/ - -SocialCalc.Formula.NTVFunctions = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - - case "N": - result = t == "n" ? value.value-0 : 0; - resulttype = "n"; - break; - - case "T": - result = t == "t" ? value.value+"" : ""; - resulttype = "t"; - break; - - case "VALUE": - if (t == "n" || t == "b") { - result = value.value || 0; - resulttype = "n"; - } - else if (t == "t") { - value = SocialCalc.DetermineValueType(value.value); - if (value.type.charAt(0) != "n") { - result = 0; - resulttype = "e#VALUE!"; - } - else { - result = value.value-0; - resulttype = "n"; - } - } - break; - } - - if (t == "e") { // error trumps - resulttype = value.type; - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["N"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["T"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["VALUE"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "text"]; - -/* -# -# ABS(value) -# ACOS(value) -# ASIN(value) -# ATAN(value) -# COS(value) -# DEGREES(value) -# EVEN(value) -# EXP(value) -# FACT(value) -# INT(value) -# LN(value) -# LOG10(value) -# ODD(value) -# RADIANS(value) -# SIN(value) -# SQRT(value) -# TAN(value) -# -*/ - -SocialCalc.Formula.Math1Functions = function(fname, operand, foperand, sheet) { - - var v1, value, f; - var result = {}; - - var scf = SocialCalc.Formula; - - v1 = scf.OperandAsNumber(sheet, foperand); - value = v1.value; - result.type = scf.LookupResultType(v1.type, v1.type, scf.TypeLookupTable.oneargnumeric); - - if (result.type == "n") { - switch (fname) { - case "ABS": - value = Math.abs(value); - break; - - case "ACOS": - if (value >= -1 && value <= 1) { - value = Math.acos(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "ASIN": - if (value >= -1 && value <= 1) { - value = Math.asin(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "ATAN": - value = Math.atan(value); - break; - - case "COS": - value = Math.cos(value); - break; - - case "DEGREES": - value = value * 180/Math.PI; - break; - - case "EVEN": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (Math.floor(value + 1) % 2); - } - else { // integer - value = value + (value % 2); - } - if (v1.value < 0) value = -value; - break; - - case "EXP": - value = Math.exp(value); - break; - - case "FACT": - f = 1; - value = Math.floor(value); - for (;value>0;value--) { - f *= value; - } - value = f; - break; - - case "INT": - value = Math.floor(value); // spreadsheet INT is floor(), not int() - break; - - case "LN": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclnarg; - } - value = Math.log(value); - break; - - case "LOG10": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclog10arg; - } - value = Math.log(value)/Math.log(10); - break; - - case "ODD": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (1 - (Math.floor(value + 1) % 2)); - } - else { // integer - value = value + (1 - (value % 2)); - } - if (v1.value < 0) value = -value; - break; - - case "RADIANS": - value = value * Math.PI/180; - break; - - case "SIN": - value = Math.sin(value); - break; - - case "SQRT": - if (value >= 0) { - value = Math.sqrt(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "TAN": - if (Math.cos(value) != 0) { - value = Math.tan(value); - } - else { - result.type = "e#NUM!"; - } - break; - } - } - - result.value = value; - operand.push(result); - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["ABS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ACOS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ASIN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ATAN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["COS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["DEGREES"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["EVEN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["EXP"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["FACT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["INT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["LN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["LOG10"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ODD"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["RADIANS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["SIN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["SQRT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["TAN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; - - -/* -# -# ATAN2(x, y) -# MOD(a, b) -# POWER(a, b) -# TRUNC(value, precision) -# -*/ - -SocialCalc.Formula.Math2Functions = function(fname, operand, foperand, sheet) { - - var xval, yval, value, quotient, decimalscale, i; - var result = {}; - - var scf = SocialCalc.Formula; - - xval = scf.OperandAsNumber(sheet, foperand); - yval = scf.OperandAsNumber(sheet, foperand); - value = 0; - result.type = scf.LookupResultType(xval.type, yval.type, scf.TypeLookupTable.twoargnumeric); - - if (result.type == "n") { - switch (fname) { - case "ATAN2": - if (xval.value == 0 && yval.value == 0) { - result.type = "e#DIV/0!"; - } - else { - result.value = Math.atan2(yval.value, xval.value); - } - break; - - case "POWER": - result.value = Math.pow(xval.value, yval.value); - if (isNaN(result.value)) { - result.value = 0; - result.type = "e#NUM!"; - } - break; - - case "MOD": // en.wikipedia.org/wiki/Modulo_operation, etc. - if (yval.value == 0) { - result.type = "e#DIV/0!"; - } - else { - quotient = xval.value/yval.value; - quotient = Math.floor(quotient); - result.value = xval.value - (quotient * yval.value); - } - break; - - case "TRUNC": - decimalscale = 1; // cut down to required number of decimal digits - if (yval.value >= 0) { - yval.value = Math.floor(yval.value); - for (i=0; i 0) { - decimalscale = 1; // cut down to required number of decimal digits - value2.value = Math.floor(value2.value); - for (i=0; i 0 ) { - method = scf.OperandAsNumber(sheet, foperand); - } - if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (scf.CheckForErrorValue(operand, method)) return; - - depreciation = 0; // calculated for each period - accumulateddepreciation = 0; // accumulated by adding each period's - - for (i=1; i<=period.value-0 && i<=lifetime.value; i++) { // calculate for each period based on net from previous - depreciation = (cost.value - accumulateddepreciation) * (method.value / lifetime.value); - if (cost.value - accumulateddepreciation - depreciation < salvage.value) { // don't go lower than salvage value - depreciation = cost.value - accumulateddepreciation - salvage.value; - } - accumulateddepreciation += depreciation; - } - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["DDB"] = [SocialCalc.Formula.DDBFunction, -4, "ddb", "", "financial"]; - -/* -# -# SLN(cost,salvage,lifetime) -# -# Depreciation for each period by straight-line method -# See: http://en.wikipedia.org/wiki/Depreciation -# -*/ - -SocialCalc.Formula.SLNFunction = function(fname, operand, foperand, sheet) { - - var depreciation; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - - if (lifetime.value < 1) { - scf.FunctionSpecificError(fname, operand, "e#NUM!", SocialCalc.Constants.s_sheetfuncslnlife); - return 0; - } - - depreciation = (cost.value - salvage.value) / lifetime.value; - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["SLN"] = [SocialCalc.Formula.SLNFunction, 3, "csl", "", "financial"]; - -/* -# -# SYD(cost,salvage,lifetime,period) -# -# Depreciation by Sum of Year's Digits method -# -*/ - -SocialCalc.Formula.SYDFunction = function(fname, operand, foperand, sheet) { - - var depreciation, sumperiods; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - var period = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - if (scf.CheckForErrorValue(operand, period)) return; - - if (lifetime.value < 1 || period.value <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return 0; - } - - sumperiods = ((lifetime.value + 1) * lifetime.value)/2; // add up 1 through lifetime - depreciation = (cost.value - salvage.value) * (lifetime.value - period.value + 1) / sumperiods; // calc depreciation - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["SYD"] = [SocialCalc.Formula.SYDFunction, 4, "cslp", "", "financial"]; - -/* -# -# FV(rate, n, payment, [pv, [paytype]]) -# NPER(rate, payment, pv, [fv, [paytype]]) -# PMT(rate, n, pv, [fv, [paytype]]) -# PV(rate, n, payment, [fv, [paytype]]) -# RATE(n, payment, pv, [fv, [paytype, [guess]]]) -# -# Following the Open Document Format formula specification: -# -# PV = - Fv - (Payment * Nper) [if rate equals 0] -# Pv*(1+Rate)^Nper + Payment * (1 + Rate*PaymentType) * ( (1+Rate)^nper -1)/Rate + Fv = 0 -# -# For each function, the formulas are solved for the appropriate value (transformed using -# basic algebra). -# -*/ - -SocialCalc.Formula.InterestFunctions = function(fname, operand, foperand, sheet) { - - var resulttype, result, dval, eval, fval; - var pv, fv, rate, n, payment, paytype, guess, part1, part2, part3, part4, part5; - var olddelta, maxloop, tries, deltaepsilon, rate, oldrate, m; - - var scf = SocialCalc.Formula; - - var aval = scf.OperandAsNumber(sheet, foperand); - var bval = scf.OperandAsNumber(sheet, foperand); - var cval = scf.OperandAsNumber(sheet, foperand); - - resulttype = scf.LookupResultType(aval.type, bval.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, cval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - dval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, dval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - eval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, eval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - if (fname != "RATE") { // only rate has 6 possible args - scf.FunctionArgsError(fname, operand); - return 0; - } - fval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, fval.type, scf.TypeLookupTable.twoargnumeric); - } - } - } - - if (resulttype == "n") { - switch (fname) { - case "FV": // FV(rate, n, payment, [pv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - pv = dval!=null ? dval.value : 0; // get value if present, or use default - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == 0) { // simple calculation if no interest - fv = -pv - (payment * n); - } - else { - fv = -(pv*Math.pow(1+rate,n) + payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate); - } - result = fv; - resulttype = 'n$'; - break; - - case "NPER": // NPER(rate, payment, pv, [fv, [paytype]]) - rate = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == 0) { // simple calculation if no interest - if (payment == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - n = (pv + fv)/(-payment); - } - else { - part1 = payment * (1 + rate * paytype) / rate; - part2 = pv + part1; - if (part2 == 0 || rate <= -1) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part3 = (part1 - fv) / part2; - if (part3 <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part4 = Math.log(part3); - part5 = Math.log(1 + rate); // rate > -1 - n = part4/part5; - } - result = n; - resulttype = 'n'; - break; - - case "PMT": // PMT(rate, n, pv, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (n == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - else if (rate == 0) { // simple calculation if no interest - payment = (fv - pv)/n; - } - else { - payment = (0 - fv - pv*Math.pow(1+rate,n))/((1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate); - } - result = payment; - resulttype = 'n$'; - break; - - case "PV": // PV(rate, n, payment, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == -1) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - else if (rate == 0) { // simple calculation if no interest - pv = -fv - (payment * n); - } - else { - pv = (-fv - payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate)/(Math.pow(1+rate,n)); - } - result = pv; - resulttype = 'n$'; - break; - - case "RATE": // RATE(n, payment, pv, [fv, [paytype, [guess]]]) - n = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - guess = fval!=null ? fval.value : 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 100; - tries = 0; - delta = 1; - epsilon = 0.0000001; // this is close enough - rate = guess || 0.00000001; // zero is not allowed - while ((delta >= 0 ? delta : -delta) > epsilon && (rate != oldrate)) { - delta = fv + pv*Math.pow(1+rate,n) + payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate; - if (olddelta!=null) { - m = (delta - olddelta)/(rate - oldrate) || .001; // get slope (not zero) - oldrate = rate; - rate = rate - delta / m; // look for zero crossing - olddelta = delta; - } - else { // first time - no old values - oldrate = rate; - rate = 1.1 * rate; - olddelta = delta; - } - tries++; - if (tries >= maxloop) { // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - result = rate; - resulttype = 'n%'; - break; - } - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["FV"] = [SocialCalc.Formula.InterestFunctions, -3, "fv", "", "financial"]; -SocialCalc.Formula.FunctionList["NPER"] = [SocialCalc.Formula.InterestFunctions, -3, "nper", "", "financial"]; -SocialCalc.Formula.FunctionList["PMT"] = [SocialCalc.Formula.InterestFunctions, -3, "pmt", "", "financial"]; -SocialCalc.Formula.FunctionList["PV"] = [SocialCalc.Formula.InterestFunctions, -3, "pv", "", "financial"]; -SocialCalc.Formula.FunctionList["RATE"] = [SocialCalc.Formula.InterestFunctions, -3, "rate", "", "financial"]; - -/* -# -# NPV(rate,v1,v2,c1:c2,...) -# -*/ - -SocialCalc.Formula.NPVFunction = function(fname, operand, foperand, sheet) { - - var resulttypenpv, rate, sum, factor, value1; - - var scf = SocialCalc.Formula; - - var rate = scf.OperandAsNumber(sheet, foperand); - if (scf.CheckForErrorValue(operand, rate)) return; - - sum = 0; - resulttypenpv = "n"; - factor = 1; - - while (foperand.length) { - value1 = scf.OperandValueAndType(sheet, foperand); - if (value1.type.charAt(0) == "n") { - factor *= (1 + rate.value); - if (factor == 0) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - sum += value1.value / factor; - resulttypenpv = scf.LookupResultType(value1.type, resulttypenpv || value1.type, scf.TypeLookupTable.plus); - } - else if (value1.type.charAt(0) == "e" && resulttypenpv.charAt(0) != "e") { - resulttypenpv = value1.type; - break; - } - } - - if (resulttypenpv.charAt(0) == "n") { - resulttypenpv = 'n$'; - } - - scf.PushOperand(operand, resulttypenpv, sum); - - return; - - } - -SocialCalc.Formula.FunctionList["NPV"] = [SocialCalc.Formula.NPVFunction, -2, "npv", "", "financial"]; - -/* -# -# IRR(c1:c2,[guess]) -# -*/ - -SocialCalc.Formula.IRRFunction = function(fname, operand, foperand, sheet) { - - var value1, guess, oldsum, maxloop, tries, epsilon, rate, oldrate, m, sum, factor, i; - var rangeoperand = []; - var cashflows = []; - - var scf = SocialCalc.Formula; - - rangeoperand.push(foperand.pop()); // first operand is a range - - while (rangeoperand.length) { // get values from range so we can do iterative approximations - value1 = scf.OperandValueAndType(sheet, rangeoperand); - if (value1.type.charAt(0) == "n") { - cashflows.push(value1.value); - } - else if (value1.type.charAt(0) == "e") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - } - - if (!cashflows.length) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - - guess = {value: 0}; - - if (foperand.length) { // guess is provided - guess = scf.OperandAsNumber(sheet, foperand); - if (guess.type.charAt(0) != "n" && guess.type.charAt(0) != "b") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { // should be no more args - scf.FunctionArgsError(fname, operand); - return; - } - } - - guess.value = guess.value || 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 20; - tries = 0; - epsilon = 0.0000001; // this is close enough - rate = guess.value; - sum = 1; - - while ((sum >= 0 ? sum : -sum) > epsilon && (rate != oldrate)) { - sum = 0; - factor = 1; - for (i=0; i= maxloop) { // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - - scf.PushOperand(operand, 'n%', rate); - - return; - - } - -SocialCalc.Formula.FunctionList["IRR"] = [SocialCalc.Formula.IRRFunction, -1, "irr", "", "financial"]; - -// -// SHEET CACHE -// - -SocialCalc.Formula.SheetCache = { - - // Sheet data: Attributes are each sheet in the cache with values of an object with: - // - // sheet: sheet-obj (or null, meaning not found) - // recalcstate: constants.asloaded = as loaded - // constants.recalcing = being recalced now - // constants.recalcdone = recalc done - // name: name of sheet (in case just have object and don't know name) - // - - sheets: {}, - - // Waiting for loading: - // If sheet is not in cache, this is set to the sheetname being loaded - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForLoading: null, - - // Constants to use for setting sheets[*].recalcstate: - - constants: {asloaded: 0, recalcing: 1, recalcdone: 2}, - - loadsheet: null // (deprecated - use SocialCalc.RecalcInfo.LoadSheet) - - }; - -// -// othersheet = SocialCalc.Formula.FindInSheetCache(sheetname) -// -// Returns a SocialCalc.Sheet object corresponding to string sheetname -// or null if the sheet is not available or in error. -// -// Each sheet is loaded only once and then stored in a cache. -// Loading is handled elsewhere, e.g., in the recalc loop. -// - -SocialCalc.Formula.FindInSheetCache = function(sheetname) { - - var str; - var sfsc = SocialCalc.Formula.SheetCache; - - var nsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); // normalize different versions - - if (sfsc.sheets[nsheetname]) { // a sheet by that name is in the cache already - return sfsc.sheets[nsheetname].sheet; // return it - } - - if (sfsc.waitingForLoading) { // waiting already - only queue up one - return null; // return not found - } - - sfsc.waitingForLoading = nsheetname; // let recalc loop know that we have a sheet to load - - return null; // return not found - - } - -// -// newsheet = SocialCalc.Formula.AddSheetToCache(sheetname, str) -// -// Adds a new sheet to the sheet cache. -// Returns the sheet object filled out with the str (a saved sheet). -// - -SocialCalc.Formula.AddSheetToCache = function(sheetname, str) { - - var newsheet = null; - var sfsc = SocialCalc.Formula.SheetCache; - var sfscc = sfsc.constants; - var newsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); - - if (str) { - newsheet = new SocialCalc.Sheet(); - newsheet.ParseSheetSave(str); - } - - sfsc.sheets[newsheetname] = {sheet: newsheet, recalcstate: sfscc.asloaded, name: newsheetname}; - - SocialCalc.Formula.FreshnessInfo.sheets[newsheetname] = true; - - return newsheet; - - } - -// -// nsheet = SocialCalc.Formula.NormalizeSheetName(sheetname) -// - -SocialCalc.Formula.NormalizeSheetName = function(sheetname) { - - if (SocialCalc.Callbacks.NormalizeSheetName) { - return SocialCalc.Callbacks.NormalizeSheetName(sheetname); - } - else { - return sheetname.toLowerCase(); - } - } - -// -// REMOTE FUNCTION INFO -// - -SocialCalc.Formula.RemoteFunctionInfo = { - - // Waiting for server: - // If waiting for an XHR response from the server, this is set to some non-blank status text - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForServer: null - - }; - -// -// FRESHNESS INFO -// -// This information is generated during recalc. -// It may be used to help determine when the recalc data in a spreadsheet -// may be out of date. -// For example, it may be used to display a message like: -// "Dependent on sheet 'FOO' which was updated more recently than this printout" - -SocialCalc.Formula.FreshnessInfo = { - - // For each external sheet referenced successfully an attribute of that name with value true. - - sheets: {}, - - // For each volatile function that is called an attribute of that name with value true. - - volatile: {}, - - // Set to false when started and true when recalc completes - - recalc_completed: false - - }; - -SocialCalc.Formula.FreshnessInfoReset = function() { - - var scffi = SocialCalc.Formula.FreshnessInfo; - - scffi.sheets = {}; - scffi.volatile = {}; - scffi.recalc_completed = false; - - } - -// -// MISC ROUTINES -// - -// -// result = SocialCalc.Formula.PlainCoord(coord) -// -// Returns: coord without any $'s -// - -SocialCalc.Formula.PlainCoord = function(coord) { - - if (coord.indexOf("$") == -1) return coord; - - return coord.replace(/\$/g, ""); // remove any $'s - - } - -// -// result = SocialCalc.Formula.OrderRangeParts(coord1, coord2) -// -// Returns: {c1: col, r1: row, c2: col, r2 = row} with c1/r1 upper left -// - -SocialCalc.Formula.OrderRangeParts = function(coord1, coord2) { - - var cr1, cr2; - var result = {}; - - cr1 = SocialCalc.coordToCr(coord1); - cr2 = SocialCalc.coordToCr(coord2); - if (cr1.col > cr2.col) { result.c1 = cr2.col; result.c2 = cr1.col; } - else { result.c1 = cr1.col; result.c2 = cr2.col; } - if (cr1.row > cr2.row) { result.r1 = cr2.row; result.r2 = cr1.row; } - else { result.r1 = cr1.row; result.r2 = cr2.row; } - - return result; - - } - -// -// cond = SocialCalc.Formula.TestCriteria(value, type, criteria) -// -// Determines whether a value/type meets the criteria. -// A criteria can be a numeric value, text beginning with <, <=, =, >=, >, <>, text by itself is start of text to match. -// Used by a variety of functions, including the "D" functions (DSUM, etc.). -// -// Returns true or false -// - -SocialCalc.Formula.TestCriteria = function(value, type, criteria) { - - var comparitor, basestring, basevalue, cond, testvalue; - - if (criteria == null) { // undefined (e.g., error value) is always false - return false; - } - - criteria = criteria + ""; - comparitor = criteria.charAt(0); // look for comparitor - if (comparitor == "=" || comparitor == "<" || comparitor == ">") { - basestring = criteria.substring(1); - } - else { - comparitor = criteria.substring(0,2); - if (comparitor == "<=" || comparitor == "<>" || comparitor == ">=") { - basestring = criteria.substring(2); - } - else { - comparitor = "none"; - basestring = criteria; - } - } - - basevalue = SocialCalc.DetermineValueType(basestring); // get type of value being compared - if (!basevalue.type) { // no criteria base value given - if (comparitor == "none") { // blank criteria matches nothing - return false; - } - if (type.charAt(0) == "b") { // comparing to empty cell - if (comparitor == "=") { // empty equals empty - return true; - } - } - else { - if (comparitor == "<>") { // "something" does not equal empty - return true; - } - } - return false; // otherwise false - } - - cond = false; - - if (basevalue.type.charAt(0) == "n" && type.charAt(0) == "t") { // criteria is number, but value is text - testvalue = SocialCalc.DetermineValueType(value); - if (testvalue.type.charAt(0) == "n") { // could be number - make it one - value = testvalue.value; - type = testvalue.type; - } - } - - if (type.charAt(0) == "n" && basevalue.type.charAt(0) == "n") { // compare two numbers - value = value - 0; // make sure numbers - basevalue.value = basevalue.value - 0; - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - case "none": - cond = value == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } - - else if (type.charAt(0) == "e") { // error on left - cond = false; - } - - else if (basevalue.type.charAt(0) == "e") { // error on right - cond = false; - } - - else { // text, maybe mixed with number or blank - if (type.charAt(0) == "n") { - value = SocialCalc.format_number_for_display(value, "n", ""); - } - if (basevalue.type.charAt(0) == "n") { - return false; // if number and didn't match already, isn't a match - } - - value = value ? value.toLowerCase() : ""; - basevalue.value = basevalue.value ? basevalue.value.toLowerCase() : ""; - - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - cond = value == basevalue.value; - break; - - case "none": - cond = value.substring(0, basevalue.value.length) == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } - - return cond; - - } - diff --git a/DeveloperAdoption/public/static/highslide/examples/ajax.html b/DeveloperAdoption/public/static/highslide/examples/ajax.html deleted file mode 100644 index 5814e3e..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/ajax.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - -
    -AJAX requesting the body of a HTML page, - - click here. - -
    - -AJAX requesting a specific id in an external HTML page, - - intro, - - div3. - - -
    - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/flash.html b/DeveloperAdoption/public/static/highslide/examples/flash.html deleted file mode 100644 index ec6a636..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/flash.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/gallery-controls-in-heading.html b/DeveloperAdoption/public/static/highslide/examples/gallery-controls-in-heading.html deleted file mode 100644 index 49e3e0c..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/gallery-controls-in-heading.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/gallery-dark.html b/DeveloperAdoption/public/static/highslide/examples/gallery-dark.html deleted file mode 100644 index 2a73f36..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/gallery-dark.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/gallery-floating-caption.html b/DeveloperAdoption/public/static/highslide/examples/gallery-floating-caption.html deleted file mode 100644 index e37baa1..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/gallery-floating-caption.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/gallery-floating-thumbs.html b/DeveloperAdoption/public/static/highslide/examples/gallery-floating-thumbs.html deleted file mode 100644 index d954c24..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/gallery-floating-thumbs.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/gallery-horizontal-strip.html b/DeveloperAdoption/public/static/highslide/examples/gallery-horizontal-strip.html deleted file mode 100644 index a416c52..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/gallery-horizontal-strip.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/gallery-in-box.html b/DeveloperAdoption/public/static/highslide/examples/gallery-in-box.html deleted file mode 100644 index fd8f0ac..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/gallery-in-box.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/gallery-in-page.html b/DeveloperAdoption/public/static/highslide/examples/gallery-in-page.html deleted file mode 100644 index cc1d1ed..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/gallery-in-page.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/gallery-thumbstrip-above.html b/DeveloperAdoption/public/static/highslide/examples/gallery-thumbstrip-above.html deleted file mode 100644 index 7b2c09e..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/gallery-thumbstrip-above.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/gallery-vertical-strip.html b/DeveloperAdoption/public/static/highslide/examples/gallery-vertical-strip.html deleted file mode 100644 index 6fef48b..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/gallery-vertical-strip.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/gallery-white.html b/DeveloperAdoption/public/static/highslide/examples/gallery-white.html deleted file mode 100644 index 5ef276f..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/gallery-white.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/headline.html b/DeveloperAdoption/public/static/highslide/examples/headline.html deleted file mode 100644 index 6c2b516..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/headline.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - -
    - - - Open HTML-content - -
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam dapibus leo quis nisl. In lectus. Vivamus consectetuer pede in nisl. Mauris cursus pretium mauris. Suspendisse condimentum mi ac tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec sed enim. Ut vel ipsum. Cras consequat velit et justo. Donec mollis, mi at tincidunt vehicula, nisl mi luctus risus, quis scelerisque arcu nibh ac nisi. Sed risus. Curabitur urna. Aliquam vitae nisl. Quisque imperdiet semper justo. Pellentesque nonummy pretium tellus. -
    - - - - -
    - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/html.html b/DeveloperAdoption/public/static/highslide/examples/html.html deleted file mode 100644 index 54fb50c..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/html.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - -
    - - - - - HTML content - - -
    -
    - -
    -
    - Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam dapibus leo quis nisl. In lectus. Vivamus consectetuer pede in nisl. Mauris cursus pretium mauris. Suspendisse condimentum mi ac tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec sed enim. Ut vel ipsum. Cras consequat velit et justo. Donec mollis, mi at tincidunt vehicula, nisl mi luctus risus, quis scelerisque arcu nibh ac nisi. Sed risus. Curabitur urna. Aliquam vitae nisl. Quisque imperdiet semper justo. Pellentesque nonummy pretium tellus. -
    - -
    - -
    - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/iframe.html b/DeveloperAdoption/public/static/highslide/examples/iframe.html deleted file mode 100644 index cbd581b..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/iframe.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/image-map.html b/DeveloperAdoption/public/static/highslide/examples/image-map.html deleted file mode 100644 index e5ca441..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/image-map.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - -
    - - - - - - Iceland - Denmark - Norway - Sweden - Finland - -
    - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/includes/Flash.swf b/DeveloperAdoption/public/static/highslide/examples/includes/Flash.swf deleted file mode 100644 index cc7c747..0000000 Binary files a/DeveloperAdoption/public/static/highslide/examples/includes/Flash.swf and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/examples/includes/ajax.htm b/DeveloperAdoption/public/static/highslide/examples/includes/ajax.htm deleted file mode 100644 index 7185544..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/includes/ajax.htm +++ /dev/null @@ -1,45 +0,0 @@ - - - - - -AJAX content - - - -
    -

    AJAX content

    -

    Highslide's AJAX engine lets you put your content in a separate file and display - it within a Highslide popup. If the file is HTML, you can specify a specific id - for Highslide to fetch. In this case, the id intro was fetched.

    -

    To see the source of the linked AJAX file, right click on the anchor link that you clicked - to open this popup, then choose Open in new window.

    -

    Highslide caches the AJAX content upon page load, so that it sits ready to display - instantly when the user clicks the thumbnail or link.

    -
    - -
    -

    Dynamic content

    -

    Highslide HTML allows the popup size to be recalculated after the content has been - changed, either through internal scripts or through external AJAX calls.

    -

    This example also has hs.preserveContent set to true. Try updating - the content and move the popup, then close it and open it again.

    -
    - Read more - -
    -
    - -
    -

    Header for div3

    -Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam dapibus leo quis nisl. In lectus. Vivamus consectetuer pede in nisl. Mauris cursus pretium mauris. Suspendisse condimentum mi ac tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec sed enim. Ut vel ipsum. Cras consequat velit et justo. Donec mollis, mi at tincidunt vehicula, nisl mi luctus risus, quis scelerisque arcu nibh ac nisi. Sed risus. Curabitur urna. Aliquam vitae nisl. Quisque imperdiet semper justo. Pellentesque nonummy pretium tellus. -
    - -
    -

    Header for div4

    -Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam dapibus leo quis nisl. In lectus. Vivamus consectetuer pede in nisl. Mauris cursus pretium mauris. Suspendisse condimentum mi ac tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec sed enim. Ut vel ipsum. Cras consequat velit et justo. Donec mollis, mi at tincidunt vehicula, nisl mi luctus risus, quis scelerisque arcu nibh ac nisi. Sed risus. Curabitur urna. Aliquam vitae nisl. Quisque imperdiet semper justo. Pellentesque nonummy pretium tellus. -
    - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/includes/include-short.htm b/DeveloperAdoption/public/static/highslide/examples/includes/include-short.htm deleted file mode 100644 index 730f8c8..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/includes/include-short.htm +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Included content - - - - -

    Full HTML content

    -

    -Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam dapibus leo quis nisl. -In lectus. Vivamus consectetuer pede in nisl. Mauris cursus pretium mauris. Suspendisse -condimentum mi ac tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada -fames ac turpis egestas. Donec sed enim. Ut vel ipsum. Cras consequat velit et justo. Donec -mollis, mi at tincidunt vehicula, nisl mi luctus risus, quis scelerisque arcu nibh ac nisi. - Sed risus. Curabitur urna. Aliquam vitae nisl. Quisque imperdiet semper justo. Pellentesque - nonummy pretium tellus. -

    -

    -Cras interdum accumsan diam. Nam neque neque, feugiat sed, blandit quis, feugiat et, magna. -Etiam ornare cursus eros. Duis gravida. Integer bibendum. Nulla nonummy ante eu est. Mauris -dapibus quam eget orci. Praesent nec metus eget mauris sagittis consequat. Cras rutrum. Etiam -dictum. Cras placerat orci non quam. Suspendisse nec nulla sit amet enim ultricies malesuada. -Nullam lobortis. Ut gravida. Morbi hendrerit. Integer pretium euismod mauris. Duis condimentum -sagittis arcu. Integer est. Nulla ante ligula, auctor sit amet, vulputate in, aliquet in, sem. -

    - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/inline.html b/DeveloperAdoption/public/static/highslide/examples/inline.html deleted file mode 100644 index e3c68e3..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/inline.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - -
    - - - Open HTML-content - -
    -

    Lorem ipsum

    - Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam dapibus leo quis nisl. In lectus. Vivamus consectetuer pede in nisl. Mauris cursus pretium mauris. Suspendisse condimentum mi ac tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec sed enim. Ut vel ipsum. Cras consequat velit et justo. Donec mollis, mi at tincidunt vehicula, nisl mi luctus risus, quis scelerisque arcu nibh ac nisi. Sed risus. Curabitur urna. Aliquam vitae nisl. Quisque imperdiet semper justo. Pellentesque nonummy pretium tellus. -
    - - - - -
    - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/mini-galleries.html b/DeveloperAdoption/public/static/highslide/examples/mini-galleries.html deleted file mode 100644 index 752706a..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/mini-galleries.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/mini-gallery.html b/DeveloperAdoption/public/static/highslide/examples/mini-gallery.html deleted file mode 100644 index 3fc32c4..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/mini-gallery.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/no-border.html b/DeveloperAdoption/public/static/highslide/examples/no-border.html deleted file mode 100644 index 1007c2c..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/no-border.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - -Highslide JS - - - - - - - - - - - - - - - - -
    - - - Highslide JS - - - -
    - This caption can be styled using CSS. -
    - -
    - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/no-outline.html b/DeveloperAdoption/public/static/highslide/examples/no-outline.html deleted file mode 100644 index bf7f681..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/no-outline.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - -
    - - - Highslide JS - - - -
    - This caption can be styled using CSS. -
    - - -
    - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/outer-glow.html b/DeveloperAdoption/public/static/highslide/examples/outer-glow.html deleted file mode 100644 index b4227a0..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/outer-glow.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - -
    - - - Highslide JS - - - -
    - This caption can be styled using CSS. -
    - - -
    - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/white-10px.html b/DeveloperAdoption/public/static/highslide/examples/white-10px.html deleted file mode 100644 index d910100..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/white-10px.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - -Highslide JS - - - - - - - - - - - - - - - -
    - - - Highslide JS - - - -
    - This caption can be styled using CSS. -
    - -
    - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/white-rounded-outline.html b/DeveloperAdoption/public/static/highslide/examples/white-rounded-outline.html deleted file mode 100644 index bef801a..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/white-rounded-outline.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - -
    - - - Highslide JS - - - -
    - This caption can be styled using CSS. -
    - -
    - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/examples/youtube.html b/DeveloperAdoption/public/static/highslide/examples/youtube.html deleted file mode 100644 index 0bdd1e4..0000000 --- a/DeveloperAdoption/public/static/highslide/examples/youtube.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/close.png b/DeveloperAdoption/public/static/highslide/highslide/graphics/close.png deleted file mode 100644 index 4de4396..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/close.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/closeX.png b/DeveloperAdoption/public/static/highslide/highslide/graphics/closeX.png deleted file mode 100644 index cf5d018..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/closeX.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar-black-border.gif b/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar-black-border.gif deleted file mode 100644 index e2403fe..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar-black-border.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar-text-buttons.png b/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar-text-buttons.png deleted file mode 100644 index d2f72e0..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar-text-buttons.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar-white-small.gif b/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar-white-small.gif deleted file mode 100644 index 462fce7..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar-white-small.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar-white.gif b/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar-white.gif deleted file mode 100644 index 1f143f5..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar-white.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar2.gif b/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar2.gif deleted file mode 100644 index 39ad652..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar2.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar3.gif b/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar3.gif deleted file mode 100644 index 3eebb81..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar3.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar4-hover.gif b/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar4-hover.gif deleted file mode 100644 index ca08b59..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar4-hover.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar4.gif b/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar4.gif deleted file mode 100644 index 7a3ad34..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/controlbar4.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/fullexpand.gif b/DeveloperAdoption/public/static/highslide/highslide/graphics/fullexpand.gif deleted file mode 100644 index 26d9ed0..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/fullexpand.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/geckodimmer.png b/DeveloperAdoption/public/static/highslide/highslide/graphics/geckodimmer.png deleted file mode 100644 index 309bb27..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/geckodimmer.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/icon.gif b/DeveloperAdoption/public/static/highslide/highslide/graphics/icon.gif deleted file mode 100644 index b74a073..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/icon.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/loader.gif b/DeveloperAdoption/public/static/highslide/highslide/graphics/loader.gif deleted file mode 100644 index 0b31f6f..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/loader.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/loader.white.gif b/DeveloperAdoption/public/static/highslide/highslide/graphics/loader.white.gif deleted file mode 100644 index f2a1bc0..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/loader.white.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/Outlines.psd b/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/Outlines.psd deleted file mode 100644 index 5405651..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/Outlines.psd and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/beveled.png b/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/beveled.png deleted file mode 100644 index fc428f4..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/beveled.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/drop-shadow.png b/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/drop-shadow.png deleted file mode 100644 index 0186c2e..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/drop-shadow.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/glossy-dark.png b/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/glossy-dark.png deleted file mode 100644 index 3c64c0d..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/glossy-dark.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/outer-glow.png b/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/outer-glow.png deleted file mode 100644 index 288d43f..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/outer-glow.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/rounded-black.png b/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/rounded-black.png deleted file mode 100644 index a77e65d..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/rounded-black.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/rounded-white.png b/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/rounded-white.png deleted file mode 100644 index 0d4b817..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/outlines/rounded-white.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/resize.gif b/DeveloperAdoption/public/static/highslide/highslide/graphics/resize.gif deleted file mode 100644 index 9100de7..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/resize.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/scrollarrows.png b/DeveloperAdoption/public/static/highslide/highslide/graphics/scrollarrows.png deleted file mode 100644 index b3d5575..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/scrollarrows.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/zoomin.cur b/DeveloperAdoption/public/static/highslide/highslide/graphics/zoomin.cur deleted file mode 100644 index cb79124..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/zoomin.cur and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/graphics/zoomout.cur b/DeveloperAdoption/public/static/highslide/highslide/graphics/zoomout.cur deleted file mode 100644 index acf6199..0000000 Binary files a/DeveloperAdoption/public/static/highslide/highslide/graphics/zoomout.cur and /dev/null differ diff --git a/DeveloperAdoption/public/static/highslide/highslide/highslide-full.js b/DeveloperAdoption/public/static/highslide/highslide/highslide-full.js deleted file mode 100644 index 9f7b3ef..0000000 --- a/DeveloperAdoption/public/static/highslide/highslide/highslide-full.js +++ /dev/null @@ -1,3320 +0,0 @@ -/** - * Name: Highslide JS - * Version: 4.1.13 (2011-10-06) - * Config: default +events +unobtrusive +imagemap +slideshow +positioning +transitions +viewport +thumbstrip +inline +ajax +iframe +flash - * Author: Torstein Hønsi - * Support: www.highslide.com/support - * License: www.highslide.com/#license - */ -if (!hs) { var hs = { -// Language strings -lang : { - cssDirection: 'ltr', - loadingText : 'Loading...', - loadingTitle : 'Click to cancel', - focusTitle : 'Click to bring to front', - fullExpandTitle : 'Expand to actual size (f)', - creditsText : 'Powered by Highslide JS', - creditsTitle : 'Go to the Highslide JS homepage', - previousText : 'Previous', - nextText : 'Next', - moveText : 'Move', - closeText : 'Close', - closeTitle : 'Close (esc)', - resizeTitle : 'Resize', - playText : 'Play', - playTitle : 'Play slideshow (spacebar)', - pauseText : 'Pause', - pauseTitle : 'Pause slideshow (spacebar)', - previousTitle : 'Previous (arrow left)', - nextTitle : 'Next (arrow right)', - moveTitle : 'Move', - fullExpandText : '1:1', - number: 'Image %1 of %2', - restoreTitle : 'Click to close image, click and drag to move. Use arrow keys for next and previous.' -}, -// See http://highslide.com/ref for examples of settings -graphicsDir : 'highslide/graphics/', -expandCursor : 'zoomin.cur', // null disables -restoreCursor : 'zoomout.cur', // null disables -expandDuration : 250, // milliseconds -restoreDuration : 250, -marginLeft : 15, -marginRight : 15, -marginTop : 15, -marginBottom : 15, -zIndexCounter : 1001, // adjust to other absolutely positioned elements -loadingOpacity : 0.75, -allowMultipleInstances: true, -numberOfImagesToPreload : 5, -outlineWhileAnimating : 2, // 0 = never, 1 = always, 2 = HTML only -outlineStartOffset : 3, // ends at 10 -padToMinWidth : false, // pad the popup width to make room for wide caption -fullExpandPosition : 'bottom right', -fullExpandOpacity : 1, -showCredits : true, // you can set this to false if you want -creditsHref : 'http://highslide.com/', -creditsTarget : '_self', -enableKeyListener : true, -openerTagNames : ['a', 'area'], // Add more to allow slideshow indexing -transitions : [], -transitionDuration: 250, -dimmingOpacity: 0, // Lightbox style dimming background -dimmingDuration: 50, // 0 for instant dimming - -allowWidthReduction : false, -allowHeightReduction : true, -preserveContent : true, // Preserve changes made to the content and position of HTML popups. -objectLoadTime : 'before', // Load iframes 'before' or 'after' expansion. -cacheAjax : true, // Cache ajax popups for instant display. Can be overridden for each popup. -anchor : 'auto', // where the image expands from -align : 'auto', // position in the client (overrides anchor) -targetX: null, // the id of a target element -targetY: null, -dragByHeading: true, -minWidth: 200, -minHeight: 200, -allowSizeReduction: true, // allow the image to reduce to fit client size. If false, this overrides minWidth and minHeight -outlineType : 'drop-shadow', // set null to disable outlines -skin : { - controls: - '
    ' - , - contentWrapper: - '
    '+ - '
    '+ - '' -}, -// END OF YOUR SETTINGS - - -// declare internal properties -preloadTheseImages : [], -continuePreloading: true, -expanders : [], -overrides : [ - 'allowSizeReduction', - 'useBox', - 'anchor', - 'align', - 'targetX', - 'targetY', - 'outlineType', - 'outlineWhileAnimating', - 'captionId', - 'captionText', - 'captionEval', - 'captionOverlay', - 'headingId', - 'headingText', - 'headingEval', - 'headingOverlay', - 'creditsPosition', - 'dragByHeading', - 'autoplay', - 'numberPosition', - 'transitions', - 'dimmingOpacity', - - 'width', - 'height', - - 'contentId', - 'allowWidthReduction', - 'allowHeightReduction', - 'preserveContent', - 'maincontentId', - 'maincontentText', - 'maincontentEval', - 'objectType', - 'cacheAjax', - 'objectWidth', - 'objectHeight', - 'objectLoadTime', - 'swfOptions', - 'wrapperClassName', - 'minWidth', - 'minHeight', - 'maxWidth', - 'maxHeight', - 'pageOrigin', - 'slideshowGroup', - 'easing', - 'easingClose', - 'fadeInOut', - 'src' -], -overlays : [], -idCounter : 0, -oPos : { - x: ['leftpanel', 'left', 'center', 'right', 'rightpanel'], - y: ['above', 'top', 'middle', 'bottom', 'below'] -}, -mouse: {}, -headingOverlay: {}, -captionOverlay: {}, -swfOptions: { flashvars: {}, params: {}, attributes: {} }, -timers : [], - -slideshows : [], - -pendingOutlines : {}, -sleeping : [], -preloadTheseAjax : [], -cacheBindings : [], -cachedGets : {}, -clones : {}, -onReady: [], -uaVersion: /Trident\/4\.0/.test(navigator.userAgent) ? 8 : - parseFloat((navigator.userAgent.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1]), -ie : (document.all && !window.opera), -//ie : navigator && /MSIE [678]/.test(navigator.userAgent), // ie9 compliant? -safari : /Safari/.test(navigator.userAgent), -geckoMac : /Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent), - -$ : function (id) { - if (id) return document.getElementById(id); -}, - -push : function (arr, val) { - arr[arr.length] = val; -}, - -createElement : function (tag, attribs, styles, parent, nopad) { - var el = document.createElement(tag); - if (attribs) hs.extend(el, attribs); - if (nopad) hs.setStyles(el, {padding: 0, border: 'none', margin: 0}); - if (styles) hs.setStyles(el, styles); - if (parent) parent.appendChild(el); - return el; -}, - -extend : function (el, attribs) { - for (var x in attribs) el[x] = attribs[x]; - return el; -}, - -setStyles : function (el, styles) { - for (var x in styles) { - if (hs.ieLt9 && x == 'opacity') { - if (styles[x] > 0.99) el.style.removeAttribute('filter'); - else el.style.filter = 'alpha(opacity='+ (styles[x] * 100) +')'; - } - else el.style[x] = styles[x]; - } -}, -animate: function(el, prop, opt) { - var start, - end, - unit; - if (typeof opt != 'object' || opt === null) { - var args = arguments; - opt = { - duration: args[2], - easing: args[3], - complete: args[4] - }; - } - if (typeof opt.duration != 'number') opt.duration = 250; - opt.easing = Math[opt.easing] || Math.easeInQuad; - opt.curAnim = hs.extend({}, prop); - for (var name in prop) { - var e = new hs.fx(el, opt , name ); - - start = parseFloat(hs.css(el, name)) || 0; - end = parseFloat(prop[name]); - unit = name != 'opacity' ? 'px' : ''; - - e.custom( start, end, unit ); - } -}, -css: function(el, prop) { - if (el.style[prop]) { - return el.style[prop]; - } else if (document.defaultView) { - return document.defaultView.getComputedStyle(el, null).getPropertyValue(prop); - - } else { - if (prop == 'opacity') prop = 'filter'; - var val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b){ return b.toUpperCase(); })]; - if (prop == 'filter') - val = val.replace(/alpha\(opacity=([0-9]+)\)/, - function (a, b) { return b / 100 }); - return val === '' ? 1 : val; - } -}, - -getPageSize : function () { - var d = document, w = window, iebody = d.compatMode && d.compatMode != 'BackCompat' - ? d.documentElement : d.body, - ieLt9 = hs.ie && (hs.uaVersion < 9 || typeof pageXOffset == 'undefined'); - - var width = ieLt9 ? iebody.clientWidth : - (d.documentElement.clientWidth || self.innerWidth), - height = ieLt9 ? iebody.clientHeight : self.innerHeight; - hs.page = { - width: width, - height: height, - scrollLeft: ieLt9 ? iebody.scrollLeft : pageXOffset, - scrollTop: ieLt9 ? iebody.scrollTop : pageYOffset - }; - return hs.page; -}, - -getPosition : function(el) { - if (/area/i.test(el.tagName)) { - var imgs = document.getElementsByTagName('img'); - for (var i = 0; i < imgs.length; i++) { - var u = imgs[i].useMap; - if (u && u.replace(/^.*?#/, '') == el.parentNode.name) { - el = imgs[i]; - break; - } - } - } - var p = { x: el.offsetLeft, y: el.offsetTop }; - while (el.offsetParent) { - el = el.offsetParent; - p.x += el.offsetLeft; - p.y += el.offsetTop; - if (el != document.body && el != document.documentElement) { - p.x -= el.scrollLeft; - p.y -= el.scrollTop; - } - } - return p; -}, - -expand : function(a, params, custom, type) { - if (!a) a = hs.createElement('a', null, { display: 'none' }, hs.container); - if (typeof a.getParams == 'function') return params; - if (type == 'html') { - for (var i = 0; i < hs.sleeping.length; i++) { - if (hs.sleeping[i] && hs.sleeping[i].a == a) { - hs.sleeping[i].awake(); - hs.sleeping[i] = null; - return false; - } - } - hs.hasHtmlExpanders = true; - } - try { - new hs.Expander(a, params, custom, type); - return false; - } catch (e) { return true; } -}, - -htmlExpand : function(a, params, custom) { - return hs.expand(a, params, custom, 'html'); -}, - -getSelfRendered : function() { - return hs.createElement('div', { - className: 'highslide-html-content', - innerHTML: hs.replaceLang(hs.skin.contentWrapper) - }); -}, -getElementByClass : function (el, tagName, className) { - var els = el.getElementsByTagName(tagName); - for (var i = 0; i < els.length; i++) { - if ((new RegExp(className)).test(els[i].className)) { - return els[i]; - } - } - return null; -}, -replaceLang : function(s) { - s = s.replace(/\s/g, ' '); - var re = /{hs\.lang\.([^}]+)\}/g, - matches = s.match(re), - lang; - if (matches) for (var i = 0; i < matches.length; i++) { - lang = matches[i].replace(re, "$1"); - if (typeof hs.lang[lang] != 'undefined') s = s.replace(matches[i], hs.lang[lang]); - } - return s; -}, - - -setClickEvents : function () { - var els = document.getElementsByTagName('a'); - for (var i = 0; i < els.length; i++) { - var type = hs.isUnobtrusiveAnchor(els[i]); - if (type && !els[i].hsHasSetClick) { - (function(){ - var t = type; - if (hs.fireEvent(hs, 'onSetClickEvent', { element: els[i], type: t })) { - els[i].onclick =(type == 'image') ?function() { return hs.expand(this) }: - function() { return hs.htmlExpand(this, { objectType: t } );}; - } - })(); - els[i].hsHasSetClick = true; - } - } - hs.getAnchors(); -}, -isUnobtrusiveAnchor: function(el) { - if (el.rel == 'highslide') return 'image'; - else if (el.rel == 'highslide-ajax') return 'ajax'; - else if (el.rel == 'highslide-iframe') return 'iframe'; - else if (el.rel == 'highslide-swf') return 'swf'; -}, - -getCacheBinding : function (a) { - for (var i = 0; i < hs.cacheBindings.length; i++) { - if (hs.cacheBindings[i][0] == a) { - var c = hs.cacheBindings[i][1]; - hs.cacheBindings[i][1] = c.cloneNode(1); - return c; - } - } - return null; -}, - -preloadAjax : function (e) { - var arr = hs.getAnchors(); - for (var i = 0; i < arr.htmls.length; i++) { - var a = arr.htmls[i]; - if (hs.getParam(a, 'objectType') == 'ajax' && hs.getParam(a, 'cacheAjax')) - hs.push(hs.preloadTheseAjax, a); - } - - hs.preloadAjaxElement(0); -}, - -preloadAjaxElement : function (i) { - if (!hs.preloadTheseAjax[i]) return; - var a = hs.preloadTheseAjax[i]; - var cache = hs.getNode(hs.getParam(a, 'contentId')); - if (!cache) cache = hs.getSelfRendered(); - var ajax = new hs.Ajax(a, cache, 1); - ajax.onError = function () { }; - ajax.onLoad = function () { - hs.push(hs.cacheBindings, [a, cache]); - hs.preloadAjaxElement(i + 1); - }; - ajax.run(); -}, - -focusTopmost : function() { - var topZ = 0, - topmostKey = -1, - expanders = hs.expanders, - exp, - zIndex; - for (var i = 0; i < expanders.length; i++) { - exp = expanders[i]; - if (exp) { - zIndex = exp.wrapper.style.zIndex; - if (zIndex && zIndex > topZ) { - topZ = zIndex; - topmostKey = i; - } - } - } - if (topmostKey == -1) hs.focusKey = -1; - else expanders[topmostKey].focus(); -}, - -getParam : function (a, param) { - a.getParams = a.onclick; - var p = a.getParams ? a.getParams() : null; - a.getParams = null; - - return (p && typeof p[param] != 'undefined') ? p[param] : - (typeof hs[param] != 'undefined' ? hs[param] : null); -}, - -getSrc : function (a) { - var src = hs.getParam(a, 'src'); - if (src) return src; - return a.href; -}, - -getNode : function (id) { - var node = hs.$(id), clone = hs.clones[id], a = {}; - if (!node && !clone) return null; - if (!clone) { - clone = node.cloneNode(true); - clone.id = ''; - hs.clones[id] = clone; - return node; - } else { - return clone.cloneNode(true); - } -}, - -discardElement : function(d) { - if (d) hs.garbageBin.appendChild(d); - hs.garbageBin.innerHTML = ''; -}, -dim : function(exp) { - if (!hs.dimmer) { - isNew = true; - hs.dimmer = hs.createElement ('div', { - className: 'highslide-dimming highslide-viewport-size', - owner: '', - onclick: function() { - if (hs.fireEvent(hs, 'onDimmerClick')) - - hs.close(); - } - }, { - visibility: 'visible', - opacity: 0 - }, hs.container, true); - - if (/(Android|iPad|iPhone|iPod)/.test(navigator.userAgent)) { - var body = document.body; - function pixDimmerSize() { - hs.setStyles(hs.dimmer, { - width: body.scrollWidth +'px', - height: body.scrollHeight +'px' - }); - } - pixDimmerSize(); - hs.addEventListener(window, 'resize', pixDimmerSize); - } - } - hs.dimmer.style.display = ''; - - var isNew = hs.dimmer.owner == ''; - hs.dimmer.owner += '|'+ exp.key; - - if (isNew) { - if (hs.geckoMac && hs.dimmingGeckoFix) - hs.setStyles(hs.dimmer, { - background: 'url('+ hs.graphicsDir + 'geckodimmer.png)', - opacity: 1 - }); - else - hs.animate(hs.dimmer, { opacity: exp.dimmingOpacity }, hs.dimmingDuration); - } -}, -undim : function(key) { - if (!hs.dimmer) return; - if (typeof key != 'undefined') hs.dimmer.owner = hs.dimmer.owner.replace('|'+ key, ''); - - if ( - (typeof key != 'undefined' && hs.dimmer.owner != '') - || (hs.upcoming && hs.getParam(hs.upcoming, 'dimmingOpacity')) - ) return; - - if (hs.geckoMac && hs.dimmingGeckoFix) hs.dimmer.style.display = 'none'; - else hs.animate(hs.dimmer, { opacity: 0 }, hs.dimmingDuration, null, function() { - hs.dimmer.style.display = 'none'; - }); -}, -transit : function (adj, exp) { - var last = exp || hs.getExpander(); - exp = last; - if (hs.upcoming) return false; - else hs.last = last; - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - try { - hs.upcoming = adj; - adj.onclick(); - } catch (e){ - hs.last = hs.upcoming = null; - } - try { - if (!adj || exp.transitions[1] != 'crossfade') - exp.close(); - } catch (e) {} - return false; -}, - -previousOrNext : function (el, op) { - var exp = hs.getExpander(el); - if (exp) return hs.transit(exp.getAdjacentAnchor(op), exp); - else return false; -}, - -previous : function (el) { - return hs.previousOrNext(el, -1); -}, - -next : function (el) { - return hs.previousOrNext(el, 1); -}, - -keyHandler : function(e) { - if (!e) e = window.event; - if (!e.target) e.target = e.srcElement; // ie - if (typeof e.target.form != 'undefined') return true; // form element has focus - if (!hs.fireEvent(hs, 'onKeyDown', e)) return true; - var exp = hs.getExpander(); - - var op = null; - switch (e.keyCode) { - case 70: // f - if (exp) exp.doFullExpand(); - return true; - case 32: // Space - op = 2; - break; - case 34: // Page Down - case 39: // Arrow right - case 40: // Arrow down - op = 1; - break; - case 8: // Backspace - case 33: // Page Up - case 37: // Arrow left - case 38: // Arrow up - op = -1; - break; - case 27: // Escape - case 13: // Enter - op = 0; - } - if (op !== null) {if (op != 2)hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - if (!hs.enableKeyListener) return true; - - if (e.preventDefault) e.preventDefault(); - else e.returnValue = false; - if (exp) { - if (op == 0) { - exp.close(); - } else if (op == 2) { - if (exp.slideshow) exp.slideshow.hitSpace(); - } else { - if (exp.slideshow) exp.slideshow.pause(); - hs.previousOrNext(exp.key, op); - } - return false; - } - } - return true; -}, - - -registerOverlay : function (overlay) { - hs.push(hs.overlays, hs.extend(overlay, { hsId: 'hsId'+ hs.idCounter++ } )); -}, - - -addSlideshow : function (options) { - var sg = options.slideshowGroup; - if (typeof sg == 'object') { - for (var i = 0; i < sg.length; i++) { - var o = {}; - for (var x in options) o[x] = options[x]; - o.slideshowGroup = sg[i]; - hs.push(hs.slideshows, o); - } - } else { - hs.push(hs.slideshows, options); - } -}, - -getWrapperKey : function (element, expOnly) { - var el, re = /^highslide-wrapper-([0-9]+)$/; - // 1. look in open expanders - el = element; - while (el.parentNode) { - if (el.hsKey !== undefined) return el.hsKey; - if (el.id && re.test(el.id)) return el.id.replace(re, "$1"); - el = el.parentNode; - } - // 2. look in thumbnail - if (!expOnly) { - el = element; - while (el.parentNode) { - if (el.tagName && hs.isHsAnchor(el)) { - for (var key = 0; key < hs.expanders.length; key++) { - var exp = hs.expanders[key]; - if (exp && exp.a == el) return key; - } - } - el = el.parentNode; - } - } - return null; -}, - -getExpander : function (el, expOnly) { - if (typeof el == 'undefined') return hs.expanders[hs.focusKey] || null; - if (typeof el == 'number') return hs.expanders[el] || null; - if (typeof el == 'string') el = hs.$(el); - return hs.expanders[hs.getWrapperKey(el, expOnly)] || null; -}, - -isHsAnchor : function (a) { - return (a.onclick && a.onclick.toString().replace(/\s/g, ' ').match(/hs.(htmlE|e)xpand/)); -}, - -reOrder : function () { - for (var i = 0; i < hs.expanders.length; i++) - if (hs.expanders[i] && hs.expanders[i].isExpanded) hs.focusTopmost(); -}, -fireEvent : function (obj, evt, args) { - return obj && obj[evt] ? (obj[evt](obj, args) !== false) : true; -}, - -mouseClickHandler : function(e) -{ - if (!e) e = window.event; - if (e.button > 1) return true; - if (!e.target) e.target = e.srcElement; - - var el = e.target; - while (el.parentNode - && !(/highslide-(image|move|html|resize)/.test(el.className))) - { - el = el.parentNode; - } - var exp = hs.getExpander(el); - if (exp && (exp.isClosing || !exp.isExpanded)) return true; - - if (exp && e.type == 'mousedown') { - if (e.target.form) return true; - var match = el.className.match(/highslide-(image|move|resize)/); - if (match) { - hs.dragArgs = { - exp: exp , - type: match[1], - left: exp.x.pos, - width: exp.x.size, - top: exp.y.pos, - height: exp.y.size, - clickX: e.clientX, - clickY: e.clientY - }; - - - hs.addEventListener(document, 'mousemove', hs.dragHandler); - if (e.preventDefault) e.preventDefault(); // FF - - if (/highslide-(image|html)-blur/.test(exp.content.className)) { - exp.focus(); - hs.hasFocused = true; - } - return false; - } - else if (/highslide-html/.test(el.className) && hs.focusKey != exp.key) { - exp.focus(); - exp.doShowHide('hidden'); - } - } else if (e.type == 'mouseup') { - - hs.removeEventListener(document, 'mousemove', hs.dragHandler); - - if (hs.dragArgs) { - if (hs.styleRestoreCursor && hs.dragArgs.type == 'image') - hs.dragArgs.exp.content.style.cursor = hs.styleRestoreCursor; - var hasDragged = hs.dragArgs.hasDragged; - - if (!hasDragged &&!hs.hasFocused && !/(move|resize)/.test(hs.dragArgs.type)) { - if (hs.fireEvent(exp, 'onImageClick')) - exp.close(); - } - else if (hasDragged || (!hasDragged && hs.hasHtmlExpanders)) { - hs.dragArgs.exp.doShowHide('hidden'); - } - - if (hs.dragArgs.exp.releaseMask) - hs.dragArgs.exp.releaseMask.style.display = 'none'; - - if (hasDragged) hs.fireEvent(hs.dragArgs.exp, 'onDrop', hs.dragArgs); - hs.hasFocused = false; - hs.dragArgs = null; - - } else if (/highslide-image-blur/.test(el.className)) { - el.style.cursor = hs.styleRestoreCursor; - } - } - return false; -}, - -dragHandler : function(e) -{ - if (!hs.dragArgs) return true; - if (!e) e = window.event; - var a = hs.dragArgs, exp = a.exp; - if (exp.iframe) { - if (!exp.releaseMask) exp.releaseMask = hs.createElement('div', null, - { position: 'absolute', width: exp.x.size+'px', height: exp.y.size+'px', - left: exp.x.cb+'px', top: exp.y.cb+'px', zIndex: 4, background: (hs.ieLt9 ? 'white' : 'none'), - opacity: 0.01 }, - exp.wrapper, true); - if (exp.releaseMask.style.display == 'none') - exp.releaseMask.style.display = ''; - } - - a.dX = e.clientX - a.clickX; - a.dY = e.clientY - a.clickY; - - var distance = Math.sqrt(Math.pow(a.dX, 2) + Math.pow(a.dY, 2)); - if (!a.hasDragged) a.hasDragged = (a.type != 'image' && distance > 0) - || (distance > (hs.dragSensitivity || 5)); - - if (a.hasDragged && e.clientX > 5 && e.clientY > 5) { - if (!hs.fireEvent(exp, 'onDrag', a)) return false; - - if (a.type == 'resize') exp.resize(a); - else { - exp.moveTo(a.left + a.dX, a.top + a.dY); - if (a.type == 'image') exp.content.style.cursor = 'move'; - } - } - return false; -}, - -wrapperMouseHandler : function (e) { - try { - if (!e) e = window.event; - var over = /mouseover/i.test(e.type); - if (!e.target) e.target = e.srcElement; // ie - if (!e.relatedTarget) e.relatedTarget = - over ? e.fromElement : e.toElement; // ie - var exp = hs.getExpander(e.target); - if (!exp.isExpanded) return; - if (!exp || !e.relatedTarget || hs.getExpander(e.relatedTarget, true) == exp - || hs.dragArgs) return; - hs.fireEvent(exp, over ? 'onMouseOver' : 'onMouseOut', e); - for (var i = 0; i < exp.overlays.length; i++) (function() { - var o = hs.$('hsId'+ exp.overlays[i]); - if (o && o.hideOnMouseOut) { - if (over) hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: over ? o.opacity : 0 }, o.dur); - } - })(); - } catch (e) {} -}, -addEventListener : function (el, event, func) { - if (el == document && event == 'ready') { - hs.push(hs.onReady, func); - } - try { - el.addEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - el.attachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = func; - } - } -}, - -removeEventListener : function (el, event, func) { - try { - el.removeEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = null; - } - } -}, - -preloadFullImage : function (i) { - if (hs.continuePreloading && hs.preloadTheseImages[i] && hs.preloadTheseImages[i] != 'undefined') { - var img = document.createElement('img'); - img.onload = function() { - img = null; - hs.preloadFullImage(i + 1); - }; - img.src = hs.preloadTheseImages[i]; - } -}, -preloadImages : function (number) { - if (number && typeof number != 'object') hs.numberOfImagesToPreload = number; - - var arr = hs.getAnchors(); - for (var i = 0; i < arr.images.length && i < hs.numberOfImagesToPreload; i++) { - hs.push(hs.preloadTheseImages, hs.getSrc(arr.images[i])); - } - - // preload outlines - if (hs.outlineType) new hs.Outline(hs.outlineType, function () { hs.preloadFullImage(0)} ); - else - - hs.preloadFullImage(0); - - // preload cursor - if (hs.restoreCursor) var cur = hs.createElement('img', { src: hs.graphicsDir + hs.restoreCursor }); -}, - - -init : function () { - if (!hs.container) { - - hs.ieLt7 = hs.ie && hs.uaVersion < 7; - hs.ieLt9 = hs.ie && hs.uaVersion < 9; - - hs.getPageSize(); - hs.ie6SSL = hs.ieLt7 && location.protocol == 'https:'; - for (var x in hs.langDefaults) { - if (typeof hs[x] != 'undefined') hs.lang[x] = hs[x]; - else if (typeof hs.lang[x] == 'undefined' && typeof hs.langDefaults[x] != 'undefined') - hs.lang[x] = hs.langDefaults[x]; - } - - hs.container = hs.createElement('div', { - className: 'highslide-container' - }, { - position: 'absolute', - left: 0, - top: 0, - width: '100%', - zIndex: hs.zIndexCounter, - direction: 'ltr' - }, - document.body, - true - ); - hs.loading = hs.createElement('a', { - className: 'highslide-loading', - title: hs.lang.loadingTitle, - innerHTML: hs.lang.loadingText, - href: 'javascript:;' - }, { - position: 'absolute', - top: '-9999px', - opacity: hs.loadingOpacity, - zIndex: 1 - }, hs.container - ); - hs.garbageBin = hs.createElement('div', null, { display: 'none' }, hs.container); - hs.viewport = hs.createElement('div', { - className: 'highslide-viewport highslide-viewport-size' - }, { - visibility: (hs.safari && hs.uaVersion < 525) ? 'visible' : 'hidden' - }, hs.container, 1 - ); - hs.clearing = hs.createElement('div', null, - { clear: 'both', paddingTop: '1px' }, null, true); - - // http://www.robertpenner.com/easing/ - Math.linearTween = function (t, b, c, d) { - return c*t/d + b; - }; - Math.easeInQuad = function (t, b, c, d) { - return c*(t/=d)*t + b; - }; - Math.easeOutQuad = function (t, b, c, d) { - return -c *(t/=d)*(t-2) + b; - }; - - hs.hideSelects = hs.ieLt7; - hs.hideIframes = ((window.opera && hs.uaVersion < 9) || navigator.vendor == 'KDE' - || (hs.ieLt7 && hs.uaVersion < 5.5)); - hs.fireEvent(this, 'onActivate'); - } -}, -ready : function() { - if (hs.isReady) return; - hs.isReady = true; - for (var i = 0; i < hs.onReady.length; i++) hs.onReady[i](); -}, - -updateAnchors : function() { - var el, els, all = [], images = [], htmls = [],groups = {}, re; - - for (var i = 0; i < hs.openerTagNames.length; i++) { - els = document.getElementsByTagName(hs.openerTagNames[i]); - for (var j = 0; j < els.length; j++) { - el = els[j]; - re = hs.isHsAnchor(el); - if (re) { - hs.push(all, el); - if (re[0] == 'hs.expand') hs.push(images, el); - else if (re[0] == 'hs.htmlExpand') hs.push(htmls, el); - var g = hs.getParam(el, 'slideshowGroup') || 'none'; - if (!groups[g]) groups[g] = []; - hs.push(groups[g], el); - } - } - } - hs.anchors = { all: all, groups: groups, images: images, htmls: htmls }; - return hs.anchors; - -}, - -getAnchors : function() { - return hs.anchors || hs.updateAnchors(); -}, - - -close : function(el) { - var exp = hs.getExpander(el); - if (exp) exp.close(); - return false; -} -}; // end hs object -hs.fx = function( elem, options, prop ){ - this.options = options; - this.elem = elem; - this.prop = prop; - - if (!options.orig) options.orig = {}; -}; -hs.fx.prototype = { - update: function(){ - (hs.fx.step[this.prop] || hs.fx.step._default)(this); - - if (this.options.step) - this.options.step.call(this.elem, this.now, this); - - }, - custom: function(from, to, unit){ - this.startTime = (new Date()).getTime(); - this.start = from; - this.end = to; - this.unit = unit;// || this.unit || "px"; - this.now = this.start; - this.pos = this.state = 0; - - var self = this; - function t(gotoEnd){ - return self.step(gotoEnd); - } - - t.elem = this.elem; - - if ( t() && hs.timers.push(t) == 1 ) { - hs.timerId = setInterval(function(){ - var timers = hs.timers; - - for ( var i = 0; i < timers.length; i++ ) - if ( !timers[i]() ) - timers.splice(i--, 1); - - if ( !timers.length ) { - clearInterval(hs.timerId); - } - }, 13); - } - }, - step: function(gotoEnd){ - var t = (new Date()).getTime(); - if ( gotoEnd || t >= this.options.duration + this.startTime ) { - this.now = this.end; - this.pos = this.state = 1; - this.update(); - - this.options.curAnim[ this.prop ] = true; - - var done = true; - for ( var i in this.options.curAnim ) - if ( this.options.curAnim[i] !== true ) - done = false; - - if ( done ) { - if (this.options.complete) this.options.complete.call(this.elem); - } - return false; - } else { - var n = t - this.startTime; - this.state = n / this.options.duration; - this.pos = this.options.easing(n, 0, 1, this.options.duration); - this.now = this.start + ((this.end - this.start) * this.pos); - this.update(); - } - return true; - } - -}; - -hs.extend( hs.fx, { - step: { - - opacity: function(fx){ - hs.setStyles(fx.elem, { opacity: fx.now }); - }, - - _default: function(fx){ - try { - if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) - fx.elem.style[ fx.prop ] = fx.now + fx.unit; - else - fx.elem[ fx.prop ] = fx.now; - } catch (e) {} - } - } -}); - -hs.Outline = function (outlineType, onLoad) { - this.onLoad = onLoad; - this.outlineType = outlineType; - var v = hs.uaVersion, tr; - - this.hasAlphaImageLoader = hs.ie && hs.uaVersion < 7; - if (!outlineType) { - if (onLoad) onLoad(); - return; - } - - hs.init(); - this.table = hs.createElement( - 'table', { - cellSpacing: 0 - }, { - visibility: 'hidden', - position: 'absolute', - borderCollapse: 'collapse', - width: 0 - }, - hs.container, - true - ); - var tbody = hs.createElement('tbody', null, null, this.table, 1); - - this.td = []; - for (var i = 0; i <= 8; i++) { - if (i % 3 == 0) tr = hs.createElement('tr', null, { height: 'auto' }, tbody, true); - this.td[i] = hs.createElement('td', null, null, tr, true); - var style = i != 4 ? { lineHeight: 0, fontSize: 0} : { position : 'relative' }; - hs.setStyles(this.td[i], style); - } - this.td[4].className = outlineType +' highslide-outline'; - - this.preloadGraphic(); -}; - -hs.Outline.prototype = { -preloadGraphic : function () { - var src = hs.graphicsDir + (hs.outlinesDir || "outlines/")+ this.outlineType +".png"; - - var appendTo = hs.safari && hs.uaVersion < 525 ? hs.container : null; - this.graphic = hs.createElement('img', null, { position: 'absolute', - top: '-9999px' }, appendTo, true); // for onload trigger - - var pThis = this; - this.graphic.onload = function() { pThis.onGraphicLoad(); }; - - this.graphic.src = src; -}, - -onGraphicLoad : function () { - var o = this.offset = this.graphic.width / 4, - pos = [[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]], - dim = { height: (2*o) +'px', width: (2*o) +'px' }; - for (var i = 0; i <= 8; i++) { - if (pos[i]) { - if (this.hasAlphaImageLoader) { - var w = (i == 1 || i == 7) ? '100%' : this.graphic.width +'px'; - var div = hs.createElement('div', null, { width: '100%', height: '100%', position: 'relative', overflow: 'hidden'}, this.td[i], true); - hs.createElement ('div', null, { - filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+ this.graphic.src + "')", - position: 'absolute', - width: w, - height: this.graphic.height +'px', - left: (pos[i][0]*o)+'px', - top: (pos[i][1]*o)+'px' - }, - div, - true); - } else { - hs.setStyles(this.td[i], { background: 'url('+ this.graphic.src +') '+ (pos[i][0]*o)+'px '+(pos[i][1]*o)+'px'}); - } - - if (window.opera && (i == 3 || i ==5)) - hs.createElement('div', null, dim, this.td[i], true); - - hs.setStyles (this.td[i], dim); - } - } - this.graphic = null; - if (hs.pendingOutlines[this.outlineType]) hs.pendingOutlines[this.outlineType].destroy(); - hs.pendingOutlines[this.outlineType] = this; - if (this.onLoad) this.onLoad(); -}, - -setPosition : function (pos, offset, vis, dur, easing) { - var exp = this.exp, - stl = exp.wrapper.style, - offset = offset || 0, - pos = pos || { - x: exp.x.pos + offset, - y: exp.y.pos + offset, - w: exp.x.get('wsize') - 2 * offset, - h: exp.y.get('wsize') - 2 * offset - }; - if (vis) this.table.style.visibility = (pos.h >= 4 * this.offset) - ? 'visible' : 'hidden'; - hs.setStyles(this.table, { - left: (pos.x - this.offset) +'px', - top: (pos.y - this.offset) +'px', - width: (pos.w + 2 * this.offset) +'px' - }); - - pos.w -= 2 * this.offset; - pos.h -= 2 * this.offset; - hs.setStyles (this.td[4], { - width: pos.w >= 0 ? pos.w +'px' : 0, - height: pos.h >= 0 ? pos.h +'px' : 0 - }); - if (this.hasAlphaImageLoader) this.td[3].style.height - = this.td[5].style.height = this.td[4].style.height; - -}, - -destroy : function(hide) { - if (hide) this.table.style.visibility = 'hidden'; - else hs.discardElement(this.table); -} -}; - -hs.Dimension = function(exp, dim) { - this.exp = exp; - this.dim = dim; - this.ucwh = dim == 'x' ? 'Width' : 'Height'; - this.wh = this.ucwh.toLowerCase(); - this.uclt = dim == 'x' ? 'Left' : 'Top'; - this.lt = this.uclt.toLowerCase(); - this.ucrb = dim == 'x' ? 'Right' : 'Bottom'; - this.rb = this.ucrb.toLowerCase(); - this.p1 = this.p2 = 0; -}; -hs.Dimension.prototype = { -get : function(key) { - switch (key) { - case 'loadingPos': - return this.tpos + this.tb + (this.t - hs.loading['offset'+ this.ucwh]) / 2; - case 'loadingPosXfade': - return this.pos + this.cb+ this.p1 + (this.size - hs.loading['offset'+ this.ucwh]) / 2; - case 'wsize': - return this.size + 2 * this.cb + this.p1 + this.p2; - case 'fitsize': - return this.clientSize - this.marginMin - this.marginMax; - case 'maxsize': - return this.get('fitsize') - 2 * this.cb - this.p1 - this.p2 ; - case 'opos': - return this.pos - (this.exp.outline ? this.exp.outline.offset : 0); - case 'osize': - return this.get('wsize') + (this.exp.outline ? 2*this.exp.outline.offset : 0); - case 'imgPad': - return this.imgSize ? Math.round((this.size - this.imgSize) / 2) : 0; - - } -}, -calcBorders: function() { - // correct for borders - this.cb = (this.exp.content['offset'+ this.ucwh] - this.t) / 2; - - this.marginMax = hs['margin'+ this.ucrb]; -}, -calcThumb: function() { - this.t = this.exp.el[this.wh] ? parseInt(this.exp.el[this.wh]) : - this.exp.el['offset'+ this.ucwh]; - this.tpos = this.exp.tpos[this.dim]; - this.tb = (this.exp.el['offset'+ this.ucwh] - this.t) / 2; - if (this.tpos == 0 || this.tpos == -1) { - this.tpos = (hs.page[this.wh] / 2) + hs.page['scroll'+ this.uclt]; - }; -}, -calcExpanded: function() { - var exp = this.exp; - this.justify = 'auto'; - - // get alignment - if (exp.align == 'center') this.justify = 'center'; - else if (new RegExp(this.lt).test(exp.anchor)) this.justify = null; - else if (new RegExp(this.rb).test(exp.anchor)) this.justify = 'max'; - - - // size and position - this.pos = this.tpos - this.cb + this.tb; - - if (this.maxHeight && this.dim == 'x') - exp.maxWidth = Math.min(exp.maxWidth || this.full, exp.maxHeight * this.full / exp.y.full); - - this.size = Math.min(this.full, exp['max'+ this.ucwh] || this.full); - this.minSize = exp.allowSizeReduction ? - Math.min(exp['min'+ this.ucwh], this.full) :this.full; - if (exp.isImage && exp.useBox) { - this.size = exp[this.wh]; - this.imgSize = this.full; - } - if (this.dim == 'x' && hs.padToMinWidth) this.minSize = exp.minWidth; - this.target = exp['target'+ this.dim.toUpperCase()]; - this.marginMin = hs['margin'+ this.uclt]; - this.scroll = hs.page['scroll'+ this.uclt]; - this.clientSize = hs.page[this.wh]; -}, -setSize: function(i) { - var exp = this.exp; - if (exp.isImage && (exp.useBox || hs.padToMinWidth)) { - this.imgSize = i; - this.size = Math.max(this.size, this.imgSize); - exp.content.style[this.lt] = this.get('imgPad')+'px'; - } else - this.size = i; - - exp.content.style[this.wh] = i +'px'; - exp.wrapper.style[this.wh] = this.get('wsize') +'px'; - if (exp.outline) exp.outline.setPosition(); - if (exp.releaseMask) exp.releaseMask.style[this.wh] = i +'px'; - if (this.dim == 'y' && exp.iDoc && exp.body.style.height != 'auto') try { - exp.iDoc.body.style.overflow = 'auto'; - } catch (e) {} - if (exp.isHtml) { - var d = exp.scrollerDiv; - if (this.sizeDiff === undefined) - this.sizeDiff = exp.innerContent['offset'+ this.ucwh] - d['offset'+ this.ucwh]; - d.style[this.wh] = (this.size - this.sizeDiff) +'px'; - - if (this.dim == 'x') exp.mediumContent.style.width = 'auto'; - if (exp.body) exp.body.style[this.wh] = 'auto'; - } - if (this.dim == 'x' && exp.overlayBox) exp.sizeOverlayBox(true); - if (this.dim == 'x' && exp.slideshow && exp.isImage) { - if (i == this.full) exp.slideshow.disable('full-expand'); - else exp.slideshow.enable('full-expand'); - } -}, -setPos: function(i) { - this.pos = i; - this.exp.wrapper.style[this.lt] = i +'px'; - - if (this.exp.outline) this.exp.outline.setPosition(); - -} -}; - -hs.Expander = function(a, params, custom, contentType) { - if (document.readyState && hs.ie && !hs.isReady) { - hs.addEventListener(document, 'ready', function() { - new hs.Expander(a, params, custom, contentType); - }); - return; - } - this.a = a; - this.custom = custom; - this.contentType = contentType || 'image'; - this.isHtml = (contentType == 'html'); - this.isImage = !this.isHtml; - - hs.continuePreloading = false; - this.overlays = []; - this.last = hs.last; - hs.last = null; - hs.init(); - var key = this.key = hs.expanders.length; - // override inline parameters - for (var i = 0; i < hs.overrides.length; i++) { - var name = hs.overrides[i]; - this[name] = params && typeof params[name] != 'undefined' ? - params[name] : hs[name]; - } - if (!this.src) this.src = a.href; - - // get thumb - var el = (params && params.thumbnailId) ? hs.$(params.thumbnailId) : a; - el = this.thumb = el.getElementsByTagName('img')[0] || el; - this.thumbsUserSetId = el.id || a.id; - if (!hs.fireEvent(this, 'onInit')) return true; - - // check if already open - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].a == a - && !(this.last && this.transitions[1] == 'crossfade')) { - hs.expanders[i].focus(); - return false; - } - } - - // cancel other - if (!hs.allowSimultaneousLoading) for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].thumb != el && !hs.expanders[i].onLoadStarted) { - hs.expanders[i].cancelLoading(); - } - } - hs.expanders[key] = this; - if (!hs.allowMultipleInstances && !hs.upcoming) { - if (hs.expanders[key-1]) hs.expanders[key-1].close(); - if (typeof hs.focusKey != 'undefined' && hs.expanders[hs.focusKey]) - hs.expanders[hs.focusKey].close(); - } - - // initiate metrics - this.el = el; - this.tpos = this.pageOrigin || hs.getPosition(el); - hs.getPageSize(); - var x = this.x = new hs.Dimension(this, 'x'); - x.calcThumb(); - var y = this.y = new hs.Dimension(this, 'y'); - y.calcThumb(); - if (/area/i.test(el.tagName)) this.getImageMapAreaCorrection(el); - this.wrapper = hs.createElement( - 'div', { - id: 'highslide-wrapper-'+ this.key, - className: 'highslide-wrapper '+ this.wrapperClassName - }, { - visibility: 'hidden', - position: 'absolute', - zIndex: hs.zIndexCounter += 2 - }, null, true ); - - this.wrapper.onmouseover = this.wrapper.onmouseout = hs.wrapperMouseHandler; - if (this.contentType == 'image' && this.outlineWhileAnimating == 2) - this.outlineWhileAnimating = 0; - - // get the outline - if (!this.outlineType - || (this.last && this.isImage && this.transitions[1] == 'crossfade')) { - this[this.contentType +'Create'](); - - } else if (hs.pendingOutlines[this.outlineType]) { - this.connectOutline(); - this[this.contentType +'Create'](); - - } else { - this.showLoading(); - var exp = this; - new hs.Outline(this.outlineType, - function () { - exp.connectOutline(); - exp[exp.contentType +'Create'](); - } - ); - } - return true; -}; - -hs.Expander.prototype = { -error : function(e) { - if (hs.debug) alert ('Line '+ e.lineNumber +': '+ e.message); - else window.location.href = this.src; -}, - -connectOutline : function() { - var outline = this.outline = hs.pendingOutlines[this.outlineType]; - outline.exp = this; - outline.table.style.zIndex = this.wrapper.style.zIndex - 1; - hs.pendingOutlines[this.outlineType] = null; -}, - -showLoading : function() { - if (this.onLoadStarted || this.loading) return; - - this.loading = hs.loading; - var exp = this; - this.loading.onclick = function() { - exp.cancelLoading(); - }; - - - if (!hs.fireEvent(this, 'onShowLoading')) return; - var exp = this, - l = this.x.get('loadingPos') +'px', - t = this.y.get('loadingPos') +'px'; - if (!tgt && this.last && this.transitions[1] == 'crossfade') - var tgt = this.last; - if (tgt) { - l = tgt.x.get('loadingPosXfade') +'px'; - t = tgt.y.get('loadingPosXfade') +'px'; - this.loading.style.zIndex = hs.zIndexCounter++; - } - setTimeout(function () { - if (exp.loading) hs.setStyles(exp.loading, { left: l, top: t, zIndex: hs.zIndexCounter++ })} - , 100); -}, - -imageCreate : function() { - var exp = this; - - var img = document.createElement('img'); - this.content = img; - img.onload = function () { - if (hs.expanders[exp.key]) exp.contentLoaded(); - }; - if (hs.blockRightClick) img.oncontextmenu = function() { return false; }; - img.className = 'highslide-image'; - hs.setStyles(img, { - visibility: 'hidden', - display: 'block', - position: 'absolute', - maxWidth: '9999px', - zIndex: 3 - }); - img.title = hs.lang.restoreTitle; - if (hs.safari && hs.uaVersion < 525) hs.container.appendChild(img); - if (hs.ie && hs.flushImgSize) img.src = null; - img.src = this.src; - - this.showLoading(); -}, - -htmlCreate : function () { - if (!hs.fireEvent(this, 'onBeforeGetContent')) return; - - this.content = hs.getCacheBinding(this.a); - if (!this.content) - this.content = hs.getNode(this.contentId); - if (!this.content) - this.content = hs.getSelfRendered(); - this.getInline(['maincontent']); - if (this.maincontent) { - var body = hs.getElementByClass(this.content, 'div', 'highslide-body'); - if (body) body.appendChild(this.maincontent); - this.maincontent.style.display = 'block'; - } - hs.fireEvent(this, 'onAfterGetContent'); - - var innerContent = this.innerContent = this.content; - - if (/(swf|iframe)/.test(this.objectType)) this.setObjContainerSize(innerContent); - - // the content tree - hs.container.appendChild(this.wrapper); - hs.setStyles( this.wrapper, { - position: 'static', - padding: '0 '+ hs.marginRight +'px 0 '+ hs.marginLeft +'px' - }); - this.content = hs.createElement( - 'div', { - className: 'highslide-html' - }, { - position: 'relative', - zIndex: 3, - height: 0, - overflow: 'hidden' - }, - this.wrapper - ); - this.mediumContent = hs.createElement('div', null, null, this.content, 1); - this.mediumContent.appendChild(innerContent); - - hs.setStyles (innerContent, { - position: 'relative', - display: 'block', - direction: hs.lang.cssDirection || '' - }); - if (this.width) innerContent.style.width = this.width +'px'; - if (this.height) hs.setStyles(innerContent, { - height: this.height +'px', - overflow: 'hidden' - }); - if (innerContent.offsetWidth < this.minWidth) - innerContent.style.width = this.minWidth +'px'; - - - - if (this.objectType == 'ajax' && !hs.getCacheBinding(this.a)) { - this.showLoading(); - var exp = this; - var ajax = new hs.Ajax(this.a, innerContent); - ajax.src = this.src; - ajax.onLoad = function () { if (hs.expanders[exp.key]) exp.contentLoaded(); }; - ajax.onError = function () { location.href = exp.src; }; - ajax.run(); - } - else - - if (this.objectType == 'iframe' && this.objectLoadTime == 'before') { - this.writeExtendedContent(); - } - else - this.contentLoaded(); -}, - -contentLoaded : function() { - try { - if (!this.content) return; - this.content.onload = null; - if (this.onLoadStarted) return; - else this.onLoadStarted = true; - - var x = this.x, y = this.y; - - if (this.loading) { - hs.setStyles(this.loading, { top: '-9999px' }); - this.loading = null; - hs.fireEvent(this, 'onHideLoading'); - } - if (this.isImage) { - x.full = this.content.width; - y.full = this.content.height; - - hs.setStyles(this.content, { - width: x.t +'px', - height: y.t +'px' - }); - this.wrapper.appendChild(this.content); - hs.container.appendChild(this.wrapper); - } else if (this.htmlGetSize) this.htmlGetSize(); - - x.calcBorders(); - y.calcBorders(); - - hs.setStyles (this.wrapper, { - left: (x.tpos + x.tb - x.cb) +'px', - top: (y.tpos + x.tb - y.cb) +'px' - }); - - - this.initSlideshow(); - this.getOverlays(); - - var ratio = x.full / y.full; - x.calcExpanded(); - this.justify(x); - - y.calcExpanded(); - this.justify(y); - if (this.isHtml) this.htmlSizeOperations(); - if (this.overlayBox) this.sizeOverlayBox(0, 1); - - - if (this.allowSizeReduction) { - if (this.isImage) - this.correctRatio(ratio); - else this.fitOverlayBox(); - var ss = this.slideshow; - if (ss && this.last && ss.controls && ss.fixedControls) { - var pos = ss.overlayOptions.position || '', p; - for (var dim in hs.oPos) for (var i = 0; i < 5; i++) { - p = this[dim]; - if (pos.match(hs.oPos[dim][i])) { - p.pos = this.last[dim].pos - + (this.last[dim].p1 - p.p1) - + (this.last[dim].size - p.size) * [0, 0, .5, 1, 1][i]; - if (ss.fixedControls == 'fit') { - if (p.pos + p.size + p.p1 + p.p2 > p.scroll + p.clientSize - p.marginMax) - p.pos = p.scroll + p.clientSize - p.size - p.marginMin - p.marginMax - p.p1 - p.p2; - if (p.pos < p.scroll + p.marginMin) p.pos = p.scroll + p.marginMin; - } - } - } - } - if (this.isImage && this.x.full > (this.x.imgSize || this.x.size)) { - this.createFullExpand(); - if (this.overlays.length == 1) this.sizeOverlayBox(); - } - } - this.show(); - - } catch (e) { - this.error(e); - } -}, - - -setObjContainerSize : function(parent, auto) { - var c = hs.getElementByClass(parent, 'DIV', 'highslide-body'); - if (/(iframe|swf)/.test(this.objectType)) { - if (this.objectWidth) c.style.width = this.objectWidth +'px'; - if (this.objectHeight) c.style.height = this.objectHeight +'px'; - } -}, - -writeExtendedContent : function () { - if (this.hasExtendedContent) return; - var exp = this; - this.body = hs.getElementByClass(this.innerContent, 'DIV', 'highslide-body'); - if (this.objectType == 'iframe') { - this.showLoading(); - var ruler = hs.clearing.cloneNode(1); - this.body.appendChild(ruler); - this.newWidth = this.innerContent.offsetWidth; - if (!this.objectWidth) this.objectWidth = ruler.offsetWidth; - var hDiff = this.innerContent.offsetHeight - this.body.offsetHeight, - h = this.objectHeight || hs.page.height - hDiff - hs.marginTop - hs.marginBottom, - onload = this.objectLoadTime == 'before' ? - ' onload="if (hs.expanders['+ this.key +']) hs.expanders['+ this.key +'].contentLoaded()" ' : ''; - this.body.innerHTML += ''; - this.ruler = this.body.getElementsByTagName('div')[0]; - this.iframe = this.body.getElementsByTagName('iframe')[0]; - - if (this.objectLoadTime == 'after') this.correctIframeSize(); - - } - if (this.objectType == 'swf') { - this.body.id = this.body.id || 'hs-flash-id-' + this.key; - var a = this.swfOptions; - if (!a.params) a.params = {}; - if (typeof a.params.wmode == 'undefined') a.params.wmode = 'transparent'; - if (swfobject) swfobject.embedSWF(this.src, this.body.id, this.objectWidth, this.objectHeight, - a.version || '7', a.expressInstallSwfurl, a.flashvars, a.params, a.attributes); - } - this.hasExtendedContent = true; -}, -htmlGetSize : function() { - if (this.iframe && !this.objectHeight) { // loadtime before - this.iframe.style.height = this.body.style.height = this.getIframePageHeight() +'px'; - } - this.innerContent.appendChild(hs.clearing); - if (!this.x.full) this.x.full = this.innerContent.offsetWidth; - this.y.full = this.innerContent.offsetHeight; - this.innerContent.removeChild(hs.clearing); - if (hs.ie && this.newHeight > parseInt(this.innerContent.currentStyle.height)) { // ie css bug - this.newHeight = parseInt(this.innerContent.currentStyle.height); - } - hs.setStyles( this.wrapper, { position: 'absolute', padding: '0'}); - hs.setStyles( this.content, { width: this.x.t +'px', height: this.y.t +'px'}); - -}, - -getIframePageHeight : function() { - var h; - try { - var doc = this.iDoc = this.iframe.contentDocument || this.iframe.contentWindow.document; - var clearing = doc.createElement('div'); - clearing.style.clear = 'both'; - doc.body.appendChild(clearing); - h = clearing.offsetTop; - if (hs.ie) h += parseInt(doc.body.currentStyle.marginTop) - + parseInt(doc.body.currentStyle.marginBottom) - 1; - } catch (e) { // other domain - h = 300; - } - return h; -}, -correctIframeSize : function () { - var wDiff = this.innerContent.offsetWidth - this.ruler.offsetWidth; - hs.discardElement(this.ruler); - if (wDiff < 0) wDiff = 0; - - var hDiff = this.innerContent.offsetHeight - this.iframe.offsetHeight; - if (this.iDoc && !this.objectHeight && !this.height && this.y.size == this.y.full) try { - this.iDoc.body.style.overflow = 'hidden'; - } catch (e) {} - hs.setStyles(this.iframe, { - width: Math.abs(this.x.size - wDiff) +'px', - height: Math.abs(this.y.size - hDiff) +'px' - }); - hs.setStyles(this.body, { - width: this.iframe.style.width, - height: this.iframe.style.height - }); - - this.scrollingContent = this.iframe; - this.scrollerDiv = this.scrollingContent; - -}, -htmlSizeOperations : function () { - - this.setObjContainerSize(this.innerContent); - - - if (this.objectType == 'swf' && this.objectLoadTime == 'before') this.writeExtendedContent(); - - // handle minimum size - if (this.x.size < this.x.full && !this.allowWidthReduction) this.x.size = this.x.full; - if (this.y.size < this.y.full && !this.allowHeightReduction) this.y.size = this.y.full; - this.scrollerDiv = this.innerContent; - hs.setStyles(this.mediumContent, { - position: 'relative', - width: this.x.size +'px' - }); - hs.setStyles(this.innerContent, { - border: 'none', - width: 'auto', - height: 'auto' - }); - var node = hs.getElementByClass(this.innerContent, 'DIV', 'highslide-body'); - if (node && !/(iframe|swf)/.test(this.objectType)) { - var cNode = node; // wrap to get true size - node = hs.createElement(cNode.nodeName, null, {overflow: 'hidden'}, null, true); - cNode.parentNode.insertBefore(node, cNode); - node.appendChild(hs.clearing); // IE6 - node.appendChild(cNode); - - var wDiff = this.innerContent.offsetWidth - node.offsetWidth; - var hDiff = this.innerContent.offsetHeight - node.offsetHeight; - node.removeChild(hs.clearing); - - var kdeBugCorr = hs.safari || navigator.vendor == 'KDE' ? 1 : 0; // KDE repainting bug - hs.setStyles(node, { - width: (this.x.size - wDiff - kdeBugCorr) +'px', - height: (this.y.size - hDiff) +'px', - overflow: 'auto', - position: 'relative' - } - ); - if (kdeBugCorr && cNode.offsetHeight > node.offsetHeight) { - node.style.width = (parseInt(node.style.width) + kdeBugCorr) + 'px'; - } - this.scrollingContent = node; - this.scrollerDiv = this.scrollingContent; - } - if (this.iframe && this.objectLoadTime == 'before') this.correctIframeSize(); - if (!this.scrollingContent && this.y.size < this.mediumContent.offsetHeight) this.scrollerDiv = this.content; - - if (this.scrollerDiv == this.content && !this.allowWidthReduction && !/(iframe|swf)/.test(this.objectType)) { - this.x.size += 17; // room for scrollbars - } - if (this.scrollerDiv && this.scrollerDiv.offsetHeight > this.scrollerDiv.parentNode.offsetHeight) { - setTimeout("try { hs.expanders["+ this.key +"].scrollerDiv.style.overflow = 'auto'; } catch(e) {}", - hs.expandDuration); - } -}, - -getImageMapAreaCorrection : function(area) { - var c = area.coords.split(','); - for (var i = 0; i < c.length; i++) c[i] = parseInt(c[i]); - - if (area.shape.toLowerCase() == 'circle') { - this.x.tpos += c[0] - c[2]; - this.y.tpos += c[1] - c[2]; - this.x.t = this.y.t = 2 * c[2]; - } else { - var maxX, maxY, minX = maxX = c[0], minY = maxY = c[1]; - for (var i = 0; i < c.length; i++) { - if (i % 2 == 0) { - minX = Math.min(minX, c[i]); - maxX = Math.max(maxX, c[i]); - } else { - minY = Math.min(minY, c[i]); - maxY = Math.max(maxY, c[i]); - } - } - this.x.tpos += minX; - this.x.t = maxX - minX; - this.y.tpos += minY; - this.y.t = maxY - minY; - } -}, -justify : function (p, moveOnly) { - var tgtArr, tgt = p.target, dim = p == this.x ? 'x' : 'y'; - - if (tgt && tgt.match(/ /)) { - tgtArr = tgt.split(' '); - tgt = tgtArr[0]; - } - if (tgt && hs.$(tgt)) { - p.pos = hs.getPosition(hs.$(tgt))[dim]; - if (tgtArr && tgtArr[1] && tgtArr[1].match(/^[-]?[0-9]+px$/)) - p.pos += parseInt(tgtArr[1]); - if (p.size < p.minSize) p.size = p.minSize; - - } else if (p.justify == 'auto' || p.justify == 'center') { - - var hasMovedMin = false; - - var allowReduce = p.exp.allowSizeReduction; - if (p.justify == 'center') - p.pos = Math.round(p.scroll + (p.clientSize + p.marginMin - p.marginMax - p.get('wsize')) / 2); - else - p.pos = Math.round(p.pos - ((p.get('wsize') - p.t) / 2)); - if (p.pos < p.scroll + p.marginMin) { - p.pos = p.scroll + p.marginMin; - hasMovedMin = true; - } - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - if (p.pos + p.get('wsize') > p.scroll + p.clientSize - p.marginMax) { - if (!moveOnly && hasMovedMin && allowReduce) { - p.size = Math.min(p.size, p.get(dim == 'y' ? 'fitsize' : 'maxsize')); - } else if (p.get('wsize') < p.get('fitsize')) { - p.pos = p.scroll + p.clientSize - p.marginMax - p.get('wsize'); - } else { // image larger than viewport - p.pos = p.scroll + p.marginMin; - if (!moveOnly && allowReduce) p.size = p.get(dim == 'y' ? 'fitsize' : 'maxsize'); - } - } - - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - - - } else if (p.justify == 'max') { - p.pos = Math.floor(p.pos - p.size + p.t); - } - - - if (p.pos < p.marginMin) { - var tmpMin = p.pos; - p.pos = p.marginMin; - - if (allowReduce && !moveOnly) p.size = p.size - (p.pos - tmpMin); - - } -}, - -correctRatio : function(ratio) { - var x = this.x, - y = this.y, - changed = false, - xSize = Math.min(x.full, x.size), - ySize = Math.min(y.full, y.size), - useBox = (this.useBox || hs.padToMinWidth); - - if (xSize / ySize > ratio) { // width greater - xSize = ySize * ratio; - if (xSize < x.minSize) { // below minWidth - xSize = x.minSize; - ySize = xSize / ratio; - } - changed = true; - - } else if (xSize / ySize < ratio) { // height greater - ySize = xSize / ratio; - changed = true; - } - - if (hs.padToMinWidth && x.full < x.minSize) { - x.imgSize = x.full; - y.size = y.imgSize = y.full; - } else if (this.useBox) { - x.imgSize = xSize; - y.imgSize = ySize; - } else { - x.size = xSize; - y.size = ySize; - } - changed = this.fitOverlayBox(this.useBox ? null : ratio, changed); - if (useBox && y.size < y.imgSize) { - y.imgSize = y.size; - x.imgSize = y.size * ratio; - } - if (changed || useBox) { - x.pos = x.tpos - x.cb + x.tb; - x.minSize = x.size; - this.justify(x, true); - - y.pos = y.tpos - y.cb + y.tb; - y.minSize = y.size; - this.justify(y, true); - if (this.overlayBox) this.sizeOverlayBox(); - } - - -}, -fitOverlayBox : function(ratio, changed) { - var x = this.x, y = this.y; - if (this.overlayBox && (this.isImage || this.allowHeightReduction)) { - while (y.size > this.minHeight && x.size > this.minWidth - && y.get('wsize') > y.get('fitsize')) { - y.size -= 10; - if (ratio) x.size = y.size * ratio; - this.sizeOverlayBox(0, 1); - changed = true; - } - } - return changed; -}, - -reflow : function () { - if (this.scrollerDiv) { - var h = /iframe/i.test(this.scrollerDiv.tagName) ? (this.getIframePageHeight() + 1) +'px' : 'auto'; - if (this.body) this.body.style.height = h; - this.scrollerDiv.style.height = h; - this.y.setSize(this.innerContent.offsetHeight); - } -}, - -show : function () { - var x = this.x, y = this.y; - this.doShowHide('hidden'); - hs.fireEvent(this, 'onBeforeExpand'); - if (this.slideshow && this.slideshow.thumbstrip) this.slideshow.thumbstrip.selectThumb(); - - // Apply size change - this.changeSize( - 1, { - wrapper: { - width : x.get('wsize'), - height : y.get('wsize'), - left: x.pos, - top: y.pos - }, - content: { - left: x.p1 + x.get('imgPad'), - top: y.p1 + y.get('imgPad'), - width:x.imgSize ||x.size, - height:y.imgSize ||y.size - } - }, - hs.expandDuration - ); -}, - -changeSize : function(up, to, dur) { - // transition - var trans = this.transitions, - other = up ? (this.last ? this.last.a : null) : hs.upcoming, - t = (trans[1] && other - && hs.getParam(other, 'transitions')[1] == trans[1]) ? - trans[1] : trans[0]; - - if (this[t] && t != 'expand') { - this[t](up, to); - return; - } - - if (this.outline && !this.outlineWhileAnimating) { - if (up) this.outline.setPosition(); - else this.outline.destroy( - (this.isHtml && this.preserveContent)); - } - - - if (!up) this.destroyOverlays(); - - var exp = this, - x = exp.x, - y = exp.y, - easing = this.easing; - if (!up) easing = this.easingClose || easing; - var after = up ? - function() { - - if (exp.outline) exp.outline.table.style.visibility = "visible"; - setTimeout(function() { - exp.afterExpand(); - }, 50); - } : - function() { - exp.afterClose(); - }; - if (up) hs.setStyles( this.wrapper, { - width: x.t +'px', - height: y.t +'px' - }); - if (up && this.isHtml) { - hs.setStyles(this.wrapper, { - left: (x.tpos - x.cb + x.tb) +'px', - top: (y.tpos - y.cb + y.tb) +'px' - }); - } - if (this.fadeInOut) { - hs.setStyles(this.wrapper, { opacity: up ? 0 : 1 }); - hs.extend(to.wrapper, { opacity: up }); - } - hs.animate( this.wrapper, to.wrapper, { - duration: dur, - easing: easing, - step: function(val, args) { - if (exp.outline && exp.outlineWhileAnimating && args.prop == 'top') { - var fac = up ? args.pos : 1 - args.pos; - var pos = { - w: x.t + (x.get('wsize') - x.t) * fac, - h: y.t + (y.get('wsize') - y.t) * fac, - x: x.tpos + (x.pos - x.tpos) * fac, - y: y.tpos + (y.pos - y.tpos) * fac - }; - exp.outline.setPosition(pos, 0, 1); - } - if (exp.isHtml) { - if (args.prop == 'left') - exp.mediumContent.style.left = (x.pos - val) +'px'; - if (args.prop == 'top') - exp.mediumContent.style.top = (y.pos - val) +'px'; - } - } - }); - hs.animate( this.content, to.content, dur, easing, after); - if (up) { - this.wrapper.style.visibility = 'visible'; - this.content.style.visibility = 'visible'; - if (this.isHtml) this.innerContent.style.visibility = 'visible'; - this.a.className += ' highslide-active-anchor'; - } -}, - - - -fade : function(up, to) { - this.outlineWhileAnimating = false; - var exp = this, t = up ? hs.expandDuration : 0; - - if (up) { - hs.animate(this.wrapper, to.wrapper, 0); - hs.setStyles(this.wrapper, { opacity: 0, visibility: 'visible' }); - hs.animate(this.content, to.content, 0); - this.content.style.visibility = 'visible'; - - hs.animate(this.wrapper, { opacity: 1 }, t, null, - function() { exp.afterExpand(); }); - } - - if (this.outline) { - this.outline.table.style.zIndex = this.wrapper.style.zIndex; - var dir = up || -1, - offset = this.outline.offset, - startOff = up ? 3 : offset, - endOff = up? offset : 3; - for (var i = startOff; dir * i <= dir * endOff; i += dir, t += 25) { - (function() { - var o = up ? endOff - i : startOff - i; - setTimeout(function() { - exp.outline.setPosition(0, o, 1); - }, t); - })(); - } - } - - - if (up) {}//setTimeout(function() { exp.afterExpand(); }, t+50); - else { - setTimeout( function() { - if (exp.outline) exp.outline.destroy(exp.preserveContent); - - exp.destroyOverlays(); - - hs.animate( exp.wrapper, { opacity: 0 }, hs.restoreDuration, null, function(){ - exp.afterClose(); - }); - }, t); - } -}, -crossfade : function (up, to, from) { - if (!up) return; - var exp = this, - last = this.last, - x = this.x, - y = this.y, - lastX = last.x, - lastY = last.y, - wrapper = this.wrapper, - content = this.content, - overlayBox = this.overlayBox; - hs.removeEventListener(document, 'mousemove', hs.dragHandler); - - hs.setStyles(content, { - width: (x.imgSize || x.size) +'px', - height: (y.imgSize || y.size) +'px' - }); - if (overlayBox) overlayBox.style.overflow = 'visible'; - this.outline = last.outline; - if (this.outline) this.outline.exp = exp; - last.outline = null; - var fadeBox = hs.createElement('div', { - className: 'highslide-'+ this.contentType - }, { - position: 'absolute', - zIndex: 4, - overflow: 'hidden', - display: 'none' - } - ); - var names = { oldImg: last, newImg: this }; - for (var n in names) { - this[n] = names[n].content.cloneNode(1); - hs.setStyles(this[n], { - position: 'absolute', - border: 0, - visibility: 'visible' - }); - fadeBox.appendChild(this[n]); - } - wrapper.appendChild(fadeBox); - if (this.isHtml) hs.setStyles(this.mediumContent, { - left: 0, - top: 0 - }); - if (overlayBox) { - overlayBox.className = ''; - wrapper.appendChild(overlayBox); - } - fadeBox.style.display = ''; - last.content.style.display = 'none'; - - - if (hs.safari && hs.uaVersion < 525) { - this.wrapper.style.visibility = 'visible'; - } - hs.animate(wrapper, { - width: x.size - }, { - duration: hs.transitionDuration, - step: function(val, args) { - var pos = args.pos, - invPos = 1 - pos; - var prop, - size = {}, - props = ['pos', 'size', 'p1', 'p2']; - for (var n in props) { - prop = props[n]; - size['x'+ prop] = Math.round(invPos * lastX[prop] + pos * x[prop]); - size['y'+ prop] = Math.round(invPos * lastY[prop] + pos * y[prop]); - size.ximgSize = Math.round( - invPos * (lastX.imgSize || lastX.size) + pos * (x.imgSize || x.size)); - size.ximgPad = Math.round(invPos * lastX.get('imgPad') + pos * x.get('imgPad')); - size.yimgSize = Math.round( - invPos * (lastY.imgSize || lastY.size) + pos * (y.imgSize || y.size)); - size.yimgPad = Math.round(invPos * lastY.get('imgPad') + pos * y.get('imgPad')); - } - if (exp.outline) exp.outline.setPosition({ - x: size.xpos, - y: size.ypos, - w: size.xsize + size.xp1 + size.xp2 + 2 * x.cb, - h: size.ysize + size.yp1 + size.yp2 + 2 * y.cb - }); - last.wrapper.style.clip = 'rect(' - + (size.ypos - lastY.pos)+'px, ' - + (size.xsize + size.xp1 + size.xp2 + size.xpos + 2 * lastX.cb - lastX.pos) +'px, ' - + (size.ysize + size.yp1 + size.yp2 + size.ypos + 2 * lastY.cb - lastY.pos) +'px, ' - + (size.xpos - lastX.pos)+'px)'; - - hs.setStyles(content, { - top: (size.yp1 + y.get('imgPad')) +'px', - left: (size.xp1 + x.get('imgPad')) +'px', - marginTop: (y.pos - size.ypos) +'px', - marginLeft: (x.pos - size.xpos) +'px' - }); - hs.setStyles(wrapper, { - top: size.ypos +'px', - left: size.xpos +'px', - width: (size.xp1 + size.xp2 + size.xsize + 2 * x.cb)+ 'px', - height: (size.yp1 + size.yp2 + size.ysize + 2 * y.cb) + 'px' - }); - hs.setStyles(fadeBox, { - width: (size.ximgSize || size.xsize) + 'px', - height: (size.yimgSize || size.ysize) +'px', - left: (size.xp1 + size.ximgPad) +'px', - top: (size.yp1 + size.yimgPad) +'px', - visibility: 'visible' - }); - - hs.setStyles(exp.oldImg, { - top: (lastY.pos - size.ypos + lastY.p1 - size.yp1 + lastY.get('imgPad') - size.yimgPad)+'px', - left: (lastX.pos - size.xpos + lastX.p1 - size.xp1 + lastX.get('imgPad') - size.ximgPad)+'px' - }); - - hs.setStyles(exp.newImg, { - opacity: pos, - top: (y.pos - size.ypos + y.p1 - size.yp1 + y.get('imgPad') - size.yimgPad) +'px', - left: (x.pos - size.xpos + x.p1 - size.xp1 + x.get('imgPad') - size.ximgPad) +'px' - }); - if (overlayBox) hs.setStyles(overlayBox, { - width: size.xsize + 'px', - height: size.ysize +'px', - left: (size.xp1 + x.cb) +'px', - top: (size.yp1 + y.cb) +'px' - }); - }, - complete: function () { - wrapper.style.visibility = content.style.visibility = 'visible'; - content.style.display = 'block'; - hs.discardElement(fadeBox); - exp.afterExpand(); - last.afterClose(); - exp.last = null; - } - - }); -}, -reuseOverlay : function(o, el) { - if (!this.last) return false; - for (var i = 0; i < this.last.overlays.length; i++) { - var oDiv = hs.$('hsId'+ this.last.overlays[i]); - if (oDiv && oDiv.hsId == o.hsId) { - this.genOverlayBox(); - oDiv.reuse = this.key; - hs.push(this.overlays, this.last.overlays[i]); - return true; - } - } - return false; -}, - - -afterExpand : function() { - this.isExpanded = true; - this.focus(); - - if (this.isHtml && this.objectLoadTime == 'after') this.writeExtendedContent(); - if (this.iframe) { - try { - var exp = this, - doc = this.iframe.contentDocument || this.iframe.contentWindow.document; - hs.addEventListener(doc, 'mousedown', function () { - if (hs.focusKey != exp.key) exp.focus(); - }); - } catch(e) {} - if (hs.ie && typeof this.isClosing != 'boolean') // first open - this.iframe.style.width = (this.objectWidth - 1) +'px'; // hasLayout - } - if (this.dimmingOpacity) hs.dim(this); - if (hs.upcoming && hs.upcoming == this.a) hs.upcoming = null; - this.prepareNextOutline(); - var p = hs.page, mX = hs.mouse.x + p.scrollLeft, mY = hs.mouse.y + p.scrollTop; - this.mouseIsOver = this.x.pos < mX && mX < this.x.pos + this.x.get('wsize') - && this.y.pos < mY && mY < this.y.pos + this.y.get('wsize'); - if (this.overlayBox) this.showOverlays(); - hs.fireEvent(this, 'onAfterExpand'); - -}, - - -prepareNextOutline : function() { - var key = this.key; - var outlineType = this.outlineType; - new hs.Outline(outlineType, - function () { try { hs.expanders[key].preloadNext(); } catch (e) {} }); -}, - - -preloadNext : function() { - var next = this.getAdjacentAnchor(1); - if (next && next.onclick.toString().match(/hs\.expand/)) - var img = hs.createElement('img', { src: hs.getSrc(next) }); -}, - - -getAdjacentAnchor : function(op) { - var current = this.getAnchorIndex(), as = hs.anchors.groups[this.slideshowGroup || 'none']; - if (as && !as[current + op] && this.slideshow && this.slideshow.repeat) { - if (op == 1) return as[0]; - else if (op == -1) return as[as.length-1]; - } - return (as && as[current + op]) || null; -}, - -getAnchorIndex : function() { - var arr = hs.getAnchors().groups[this.slideshowGroup || 'none']; - if (arr) for (var i = 0; i < arr.length; i++) { - if (arr[i] == this.a) return i; - } - return null; -}, - - -getNumber : function() { - if (this[this.numberPosition]) { - var arr = hs.anchors.groups[this.slideshowGroup || 'none']; - if (arr) { - var s = hs.lang.number.replace('%1', this.getAnchorIndex() + 1).replace('%2', arr.length); - this[this.numberPosition].innerHTML = - '
    '+ s +'
    '+ this[this.numberPosition].innerHTML; - } - } -}, -initSlideshow : function() { - if (!this.last) { - for (var i = 0; i < hs.slideshows.length; i++) { - var ss = hs.slideshows[i], sg = ss.slideshowGroup; - if (typeof sg == 'undefined' || sg === null || sg === this.slideshowGroup) - this.slideshow = new hs.Slideshow(this.key, ss); - } - } else { - this.slideshow = this.last.slideshow; - } - var ss = this.slideshow; - if (!ss) return; - var key = ss.expKey = this.key; - - ss.checkFirstAndLast(); - ss.disable('full-expand'); - if (ss.controls) { - this.createOverlay(hs.extend(ss.overlayOptions || {}, { - overlayId: ss.controls, - hsId: 'controls', - zIndex: 5 - })); - } - if (ss.thumbstrip) ss.thumbstrip.add(this); - if (!this.last && this.autoplay) ss.play(true); - if (ss.autoplay) { - ss.autoplay = setTimeout(function() { - hs.next(key); - }, (ss.interval || 500)); - } -}, - -cancelLoading : function() { - hs.discardElement (this.wrapper); - hs.expanders[this.key] = null; - if (hs.upcoming == this.a) hs.upcoming = null; - hs.undim(this.key); - if (this.loading) hs.loading.style.left = '-9999px'; - hs.fireEvent(this, 'onHideLoading'); -}, - -writeCredits : function () { - if (this.credits) return; - this.credits = hs.createElement('a', { - href: hs.creditsHref, - target: hs.creditsTarget, - className: 'highslide-credits', - innerHTML: hs.lang.creditsText, - title: hs.lang.creditsTitle - }); - this.createOverlay({ - overlayId: this.credits, - position: this.creditsPosition || 'top left', - hsId: 'credits' - }); -}, - -getInline : function(types, addOverlay) { - for (var i = 0; i < types.length; i++) { - var type = types[i], s = null; - if (type == 'caption' && !hs.fireEvent(this, 'onBeforeGetCaption')) return; - else if (type == 'heading' && !hs.fireEvent(this, 'onBeforeGetHeading')) return; - if (!this[type +'Id'] && this.thumbsUserSetId) - this[type +'Id'] = type +'-for-'+ this.thumbsUserSetId; - if (this[type +'Id']) this[type] = hs.getNode(this[type +'Id']); - if (!this[type] && !this[type +'Text'] && this[type +'Eval']) try { - s = eval(this[type +'Eval']); - } catch (e) {} - if (!this[type] && this[type +'Text']) { - s = this[type +'Text']; - } - if (!this[type] && !s) { - this[type] = hs.getNode(this.a['_'+ type + 'Id']); - if (!this[type]) { - var next = this.a.nextSibling; - while (next && !hs.isHsAnchor(next)) { - if ((new RegExp('highslide-'+ type)).test(next.className || null)) { - if (!next.id) this.a['_'+ type + 'Id'] = next.id = 'hsId'+ hs.idCounter++; - this[type] = hs.getNode(next.id); - break; - } - next = next.nextSibling; - } - } - } - if (!this[type] && !s && this.numberPosition == type) s = '\n'; - - if (!this[type] && s) this[type] = hs.createElement('div', - { className: 'highslide-'+ type, innerHTML: s } ); - - if (addOverlay && this[type]) { - var o = { position: (type == 'heading') ? 'above' : 'below' }; - for (var x in this[type+'Overlay']) o[x] = this[type+'Overlay'][x]; - o.overlayId = this[type]; - this.createOverlay(o); - } - } -}, - - -// on end move and resize -doShowHide : function(visibility) { - if (hs.hideSelects) this.showHideElements('SELECT', visibility); - if (hs.hideIframes) this.showHideElements('IFRAME', visibility); - if (hs.geckoMac) this.showHideElements('*', visibility); -}, -showHideElements : function (tagName, visibility) { - var els = document.getElementsByTagName(tagName); - var prop = tagName == '*' ? 'overflow' : 'visibility'; - for (var i = 0; i < els.length; i++) { - if (prop == 'visibility' || (document.defaultView.getComputedStyle( - els[i], "").getPropertyValue('overflow') == 'auto' - || els[i].getAttribute('hidden-by') != null)) { - var hiddenBy = els[i].getAttribute('hidden-by'); - if (visibility == 'visible' && hiddenBy) { - hiddenBy = hiddenBy.replace('['+ this.key +']', ''); - els[i].setAttribute('hidden-by', hiddenBy); - if (!hiddenBy) els[i].style[prop] = els[i].origProp; - } else if (visibility == 'hidden') { // hide if behind - var elPos = hs.getPosition(els[i]); - elPos.w = els[i].offsetWidth; - elPos.h = els[i].offsetHeight; - if (!this.dimmingOpacity) { // hide all if dimming - - var clearsX = (elPos.x + elPos.w < this.x.get('opos') - || elPos.x > this.x.get('opos') + this.x.get('osize')); - var clearsY = (elPos.y + elPos.h < this.y.get('opos') - || elPos.y > this.y.get('opos') + this.y.get('osize')); - } - var wrapperKey = hs.getWrapperKey(els[i]); - if (!clearsX && !clearsY && wrapperKey != this.key) { // element falls behind image - if (!hiddenBy) { - els[i].setAttribute('hidden-by', '['+ this.key +']'); - els[i].origProp = els[i].style[prop]; - els[i].style[prop] = 'hidden'; - - } else if (hiddenBy.indexOf('['+ this.key +']') == -1) { - els[i].setAttribute('hidden-by', hiddenBy + '['+ this.key +']'); - } - } else if ((hiddenBy == '['+ this.key +']' || hs.focusKey == wrapperKey) - && wrapperKey != this.key) { // on move - els[i].setAttribute('hidden-by', ''); - els[i].style[prop] = els[i].origProp || ''; - } else if (hiddenBy && hiddenBy.indexOf('['+ this.key +']') > -1) { - els[i].setAttribute('hidden-by', hiddenBy.replace('['+ this.key +']', '')); - } - - } - } - } -}, - -focus : function() { - this.wrapper.style.zIndex = hs.zIndexCounter += 2; - // blur others - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && i == hs.focusKey) { - var blurExp = hs.expanders[i]; - blurExp.content.className += ' highslide-'+ blurExp.contentType +'-blur'; - if (blurExp.isImage) { - blurExp.content.style.cursor = hs.ieLt7 ? 'hand' : 'pointer'; - blurExp.content.title = hs.lang.focusTitle; - } - hs.fireEvent(blurExp, 'onBlur'); - } - } - - // focus this - if (this.outline) this.outline.table.style.zIndex - = this.wrapper.style.zIndex - 1; - this.content.className = 'highslide-'+ this.contentType; - if (this.isImage) { - this.content.title = hs.lang.restoreTitle; - - if (hs.restoreCursor) { - hs.styleRestoreCursor = window.opera ? 'pointer' : 'url('+ hs.graphicsDir + hs.restoreCursor +'), pointer'; - if (hs.ieLt7 && hs.uaVersion < 6) hs.styleRestoreCursor = 'hand'; - this.content.style.cursor = hs.styleRestoreCursor; - } - } - hs.focusKey = this.key; - hs.addEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - hs.fireEvent(this, 'onFocus'); -}, -moveTo: function(x, y) { - this.x.setPos(x); - this.y.setPos(y); -}, -resize : function (e) { - var w, h, r = e.width / e.height; - w = Math.max(e.width + e.dX, Math.min(this.minWidth, this.x.full)); - if (this.isImage && Math.abs(w - this.x.full) < 12) w = this.x.full; - h = this.isHtml ? e.height + e.dY : w / r; - if (h < Math.min(this.minHeight, this.y.full)) { - h = Math.min(this.minHeight, this.y.full); - if (this.isImage) w = h * r; - } - this.resizeTo(w, h); -}, -resizeTo: function(w, h) { - this.y.setSize(h); - this.x.setSize(w); - this.wrapper.style.height = this.y.get('wsize') +'px'; -}, - -close : function() { - if (this.isClosing || !this.isExpanded) return; - if (this.transitions[1] == 'crossfade' && hs.upcoming) { - hs.getExpander(hs.upcoming).cancelLoading(); - hs.upcoming = null; - } - if (!hs.fireEvent(this, 'onBeforeClose')) return; - this.isClosing = true; - if (this.slideshow && !hs.upcoming) this.slideshow.pause(); - - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - - try { - if (this.isHtml) this.htmlPrepareClose(); - this.content.style.cursor = 'default'; - this.changeSize( - 0, { - wrapper: { - width : this.x.t, - height : this.y.t, - left: this.x.tpos - this.x.cb + this.x.tb, - top: this.y.tpos - this.y.cb + this.y.tb - }, - content: { - left: 0, - top: 0, - width: this.x.t, - height: this.y.t - } - }, hs.restoreDuration - ); - } catch (e) { this.afterClose(); } -}, - -htmlPrepareClose : function() { - if (hs.geckoMac) { // bad redraws - if (!hs.mask) hs.mask = hs.createElement('div', null, - { position: 'absolute' }, hs.container); - hs.setStyles(hs.mask, { width: this.x.size +'px', height: this.y.size +'px', - left: this.x.pos +'px', top: this.y.pos +'px', display: 'block' }); - } - if (this.objectType == 'swf') try { hs.$(this.body.id).StopPlay(); } catch (e) {} - - if (this.objectLoadTime == 'after' && !this.preserveContent) this.destroyObject(); - if (this.scrollerDiv && this.scrollerDiv != this.scrollingContent) - this.scrollerDiv.style.overflow = 'hidden'; -}, - -destroyObject : function () { - if (hs.ie && this.iframe) - try { this.iframe.contentWindow.document.body.innerHTML = ''; } catch (e) {} - if (this.objectType == 'swf') swfobject.removeSWF(this.body.id); - this.body.innerHTML = ''; -}, - -sleep : function() { - if (this.outline) this.outline.table.style.display = 'none'; - this.releaseMask = null; - this.wrapper.style.display = 'none'; - this.isExpanded = false; - hs.push(hs.sleeping, this); -}, - -awake : function() {try { - - hs.expanders[this.key] = this; - - if (!hs.allowMultipleInstances &&hs.focusKey != this.key) { - try { hs.expanders[hs.focusKey].close(); } catch (e){} - } - - var z = hs.zIndexCounter++, stl = { display: '', zIndex: z }; - hs.setStyles (this.wrapper, stl); - this.isClosing = false; - - var o = this.outline || 0; - if (o) { - if (!this.outlineWhileAnimating) stl.visibility = 'hidden'; - hs.setStyles (o.table, stl); - } - if (this.slideshow) { - this.initSlideshow(); - } - - this.show(); -} catch (e) {} - - -}, - -createOverlay : function (o) { - var el = o.overlayId, - relToVP = (o.relativeTo == 'viewport' && !/panel$/.test(o.position)); - if (typeof el == 'string') el = hs.getNode(el); - if (o.html) el = hs.createElement('div', { innerHTML: o.html }); - if (!el || typeof el == 'string') return; - if (!hs.fireEvent(this, 'onCreateOverlay', { overlay: el })) return; - el.style.display = 'block'; - o.hsId = o.hsId || o.overlayId; - if (this.transitions[1] == 'crossfade' && this.reuseOverlay(o, el)) return; - this.genOverlayBox(); - var width = o.width && /^[0-9]+(px|%)$/.test(o.width) ? o.width : 'auto'; - if (/^(left|right)panel$/.test(o.position) && !/^[0-9]+px$/.test(o.width)) width = '200px'; - var overlay = hs.createElement( - 'div', { - id: 'hsId'+ hs.idCounter++, - hsId: o.hsId - }, { - position: 'absolute', - visibility: 'hidden', - width: width, - direction: hs.lang.cssDirection || '', - opacity: 0 - }, - relToVP ? hs.viewport :this.overlayBox, - true - ); - if (relToVP) overlay.hsKey = this.key; - - overlay.appendChild(el); - hs.extend(overlay, { - opacity: 1, - offsetX: 0, - offsetY: 0, - dur: (o.fade === 0 || o.fade === false || (o.fade == 2 && hs.ie)) ? 0 : 250 - }); - hs.extend(overlay, o); - - - if (this.gotOverlays) { - this.positionOverlay(overlay); - if (!overlay.hideOnMouseOut || this.mouseIsOver) - hs.animate(overlay, { opacity: overlay.opacity }, overlay.dur); - } - hs.push(this.overlays, hs.idCounter - 1); -}, -positionOverlay : function(overlay) { - var p = overlay.position || 'middle center', - relToVP = (overlay.relativeTo == 'viewport'), - offX = overlay.offsetX, - offY = overlay.offsetY; - if (relToVP) { - hs.viewport.style.display = 'block'; - overlay.hsKey = this.key; - if (overlay.offsetWidth > overlay.parentNode.offsetWidth) - overlay.style.width = '100%'; - } else - if (overlay.parentNode != this.overlayBox) this.overlayBox.appendChild(overlay); - if (/left$/.test(p)) overlay.style.left = offX +'px'; - - if (/center$/.test(p)) hs.setStyles (overlay, { - left: '50%', - marginLeft: (offX - Math.round(overlay.offsetWidth / 2)) +'px' - }); - - if (/right$/.test(p)) overlay.style.right = - offX +'px'; - - if (/^leftpanel$/.test(p)) { - hs.setStyles(overlay, { - right: '100%', - marginRight: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p1 = overlay.offsetWidth; - - } else if (/^rightpanel$/.test(p)) { - hs.setStyles(overlay, { - left: '100%', - marginLeft: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p2 = overlay.offsetWidth; - } - var parOff = overlay.parentNode.offsetHeight; - overlay.style.height = 'auto'; - if (relToVP && overlay.offsetHeight > parOff) - overlay.style.height = hs.ieLt7 ? parOff +'px' : '100%'; - - if (/^top/.test(p)) overlay.style.top = offY +'px'; - if (/^middle/.test(p)) hs.setStyles (overlay, { - top: '50%', - marginTop: (offY - Math.round(overlay.offsetHeight / 2)) +'px' - }); - if (/^bottom/.test(p)) overlay.style.bottom = - offY +'px'; - if (/^above$/.test(p)) { - hs.setStyles(overlay, { - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - bottom: '100%', - marginBottom: this.y.cb +'px', - width: 'auto' - }); - this.y.p1 = overlay.offsetHeight; - - } else if (/^below$/.test(p)) { - hs.setStyles(overlay, { - position: 'relative', - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - top: '100%', - marginTop: this.y.cb +'px', - width: 'auto' - }); - this.y.p2 = overlay.offsetHeight; - overlay.style.position = 'absolute'; - } -}, - -getOverlays : function() { - this.getInline(['heading', 'caption'], true); - this.getNumber(); - if (this.caption) hs.fireEvent(this, 'onAfterGetCaption'); - if (this.heading) hs.fireEvent(this, 'onAfterGetHeading'); - if (this.heading && this.dragByHeading) this.heading.className += ' highslide-move'; - if (hs.showCredits) this.writeCredits(); - for (var i = 0; i < hs.overlays.length; i++) { - var o = hs.overlays[i], tId = o.thumbnailId, sg = o.slideshowGroup; - if ((!tId && !sg) || (tId && tId == this.thumbsUserSetId) - || (sg && sg === this.slideshowGroup)) { - if (this.isImage || (this.isHtml && o.useOnHtml)) - this.createOverlay(o); - } - } - var os = []; - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - if (/panel$/.test(o.position)) this.positionOverlay(o); - else hs.push(os, o); - } - for (var i = 0; i < os.length; i++) this.positionOverlay(os[i]); - this.gotOverlays = true; -}, -genOverlayBox : function() { - if (!this.overlayBox) this.overlayBox = hs.createElement ( - 'div', { - className: this.wrapperClassName - }, { - position : 'absolute', - width: (this.x.size || (this.useBox ? this.width : null) - || this.x.full) +'px', - height: (this.y.size || this.y.full) +'px', - visibility : 'hidden', - overflow : 'hidden', - zIndex : hs.ie ? 4 : 'auto' - }, - hs.container, - true - ); -}, -sizeOverlayBox : function(doWrapper, doPanels) { - var overlayBox = this.overlayBox, - x = this.x, - y = this.y; - hs.setStyles( overlayBox, { - width: x.size +'px', - height: y.size +'px' - }); - if (doWrapper || doPanels) { - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - var ie6 = (hs.ieLt7 || document.compatMode == 'BackCompat'); - if (o && /^(above|below)$/.test(o.position)) { - if (ie6) { - o.style.width = (overlayBox.offsetWidth + 2 * x.cb - + x.p1 + x.p2) +'px'; - } - y[o.position == 'above' ? 'p1' : 'p2'] = o.offsetHeight; - } - if (o && ie6 && /^(left|right)panel$/.test(o.position)) { - o.style.height = (overlayBox.offsetHeight + 2* y.cb) +'px'; - } - } - } - if (doWrapper) { - hs.setStyles(this.content, { - top: y.p1 +'px' - }); - hs.setStyles(overlayBox, { - top: (y.p1 + y.cb) +'px' - }); - } -}, - -showOverlays : function() { - var b = this.overlayBox; - b.className = ''; - hs.setStyles(b, { - top: (this.y.p1 + this.y.cb) +'px', - left: (this.x.p1 + this.x.cb) +'px', - overflow : 'visible' - }); - if (hs.safari) b.style.visibility = 'visible'; - this.wrapper.appendChild (b); - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - o.style.zIndex = o.zIndex || 4; - if (!o.hideOnMouseOut || this.mouseIsOver) { - o.style.visibility = 'visible'; - hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: o.opacity }, o.dur); - } - } -}, - -destroyOverlays : function() { - if (!this.overlays.length) return; - if (this.slideshow) { - var c = this.slideshow.controls; - if (c && hs.getExpander(c) == this) c.parentNode.removeChild(c); - } - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - if (o && o.parentNode == hs.viewport && hs.getExpander(o) == this) hs.discardElement(o); - } - if (this.isHtml && this.preserveContent) { - this.overlayBox.style.top = '-9999px'; - hs.container.appendChild(this.overlayBox); - } else - hs.discardElement(this.overlayBox); -}, - - - -createFullExpand : function () { - if (this.slideshow && this.slideshow.controls) { - this.slideshow.enable('full-expand'); - return; - } - this.fullExpandLabel = hs.createElement( - 'a', { - href: 'javascript:hs.expanders['+ this.key +'].doFullExpand();', - title: hs.lang.fullExpandTitle, - className: 'highslide-full-expand' - } - ); - if (!hs.fireEvent(this, 'onCreateFullExpand')) return; - - this.createOverlay({ - overlayId: this.fullExpandLabel, - position: hs.fullExpandPosition, - hideOnMouseOut: true, - opacity: hs.fullExpandOpacity - }); -}, - -doFullExpand : function () { - try { - if (!hs.fireEvent(this, 'onDoFullExpand')) return; - if (this.fullExpandLabel) hs.discardElement(this.fullExpandLabel); - - this.focus(); - var xSize = this.x.size, - ySize = this.y.size; - this.resizeTo(this.x.full, this.y.full); - - var xpos = this.x.pos - (this.x.size - xSize) / 2; - if (xpos < hs.marginLeft) xpos = hs.marginLeft; - - var ypos = this.y.pos - (this.y.size - ySize) / 2; - if (ypos < hs.marginTop) ypos = hs.marginTop; - - this.moveTo(xpos, ypos); - this.doShowHide('hidden'); - - } catch (e) { - this.error(e); - } -}, - - -afterClose : function () { - this.a.className = this.a.className.replace('highslide-active-anchor', ''); - - this.doShowHide('visible'); - - if (this.isHtml && this.preserveContent - && this.transitions[1] != 'crossfade') { - this.sleep(); - } else { - if (this.outline && this.outlineWhileAnimating) this.outline.destroy(); - - hs.discardElement(this.wrapper); - } - if (hs.mask) hs.mask.style.display = 'none'; - this.destroyOverlays(); - if (!hs.viewport.childNodes.length) hs.viewport.style.display = 'none'; - - if (this.dimmingOpacity) hs.undim(this.key); - hs.fireEvent(this, 'onAfterClose'); - hs.expanders[this.key] = null; - hs.reOrder(); -} - -}; - - -// hs.Ajax object prototype -hs.Ajax = function (a, content, pre) { - this.a = a; - this.content = content; - this.pre = pre; -}; - -hs.Ajax.prototype = { -run : function () { - var xhr; - if (!this.src) this.src = hs.getSrc(this.a); - if (this.src.match('#')) { - var arr = this.src.split('#'); - this.src = arr[0]; - this.id = arr[1]; - } - if (hs.cachedGets[this.src]) { - this.cachedGet = hs.cachedGets[this.src]; - if (this.id) this.getElementContent(); - else this.loadHTML(); - return; - } - try { xhr = new XMLHttpRequest(); } - catch (e) { - try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } - catch (e) { - try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } - catch (e) { this.onError(); } - } - } - var pThis = this; - xhr.onreadystatechange = function() { - if(pThis.xhr.readyState == 4) { - if (pThis.id) pThis.getElementContent(); - else pThis.loadHTML(); - } - }; - var src = this.src; - this.xhr = xhr; - if (hs.forceAjaxReload) - src = src.replace(/$/, (/\?/.test(src) ? '&' : '?') +'dummy='+ (new Date()).getTime()); - xhr.open('GET', src, true); - xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); - xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - xhr.send(null); -}, - -getElementContent : function() { - hs.init(); - var attribs = window.opera || hs.ie6SSL ? { src: 'about:blank' } : null; - - this.iframe = hs.createElement('iframe', attribs, - { position: 'absolute', top: '-9999px' }, hs.container); - - this.loadHTML(); -}, - -loadHTML : function() { - var s = this.cachedGet || this.xhr.responseText, - regBody; - if (this.pre) hs.cachedGets[this.src] = s; - if (!hs.ie || hs.uaVersion >= 5.5) { - s = s.replace(new RegExp(']*>', 'gi'), '') - .replace(new RegExp(']*>.*?', 'gi'), ''); - if (this.iframe) { - var doc = this.iframe.contentDocument; - if (!doc && this.iframe.contentWindow) doc = this.iframe.contentWindow.document; - if (!doc) { // Opera - var pThis = this; - setTimeout(function() { pThis.loadHTML(); }, 25); - return; - } - doc.open(); - doc.write(s); - doc.close(); - try { s = doc.getElementById(this.id).innerHTML; } catch (e) { - try { s = this.iframe.document.getElementById(this.id).innerHTML; } catch (e) {} // opera - } - hs.discardElement(this.iframe); - } else { - regBody = /(]*>|<\/body>)/ig; - if (regBody.test(s)) s = s.split(regBody)[hs.ieLt9 ? 1 : 2]; - - } - } - hs.getElementByClass(this.content, 'DIV', 'highslide-body').innerHTML = s; - this.onLoad(); - for (var x in this) this[x] = null; -} -}; - - -hs.Slideshow = function (expKey, options) { - if (hs.dynamicallyUpdateAnchors !== false) hs.updateAnchors(); - this.expKey = expKey; - for (var x in options) this[x] = options[x]; - if (this.useControls) this.getControls(); - if (this.thumbstrip) this.thumbstrip = hs.Thumbstrip(this); -}; -hs.Slideshow.prototype = { -getControls: function() { - this.controls = hs.createElement('div', { innerHTML: hs.replaceLang(hs.skin.controls) }, - null, hs.container); - - var buttons = ['play', 'pause', 'previous', 'next', 'move', 'full-expand', 'close']; - this.btn = {}; - var pThis = this; - for (var i = 0; i < buttons.length; i++) { - this.btn[buttons[i]] = hs.getElementByClass(this.controls, 'li', 'highslide-'+ buttons[i]); - this.enable(buttons[i]); - } - this.btn.pause.style.display = 'none'; - //this.disable('full-expand'); -}, -checkFirstAndLast: function() { - if (this.repeat || !this.controls) return; - var exp = hs.expanders[this.expKey], - cur = exp.getAnchorIndex(), - re = /disabled$/; - if (cur == 0) - this.disable('previous'); - else if (re.test(this.btn.previous.getElementsByTagName('a')[0].className)) - this.enable('previous'); - if (cur + 1 == hs.anchors.groups[exp.slideshowGroup || 'none'].length) { - this.disable('next'); - this.disable('play'); - } else if (re.test(this.btn.next.getElementsByTagName('a')[0].className)) { - this.enable('next'); - this.enable('play'); - } -}, -enable: function(btn) { - if (!this.btn) return; - var sls = this, a = this.btn[btn].getElementsByTagName('a')[0], re = /disabled$/; - a.onclick = function() { - sls[btn](); - return false; - }; - if (re.test(a.className)) a.className = a.className.replace(re, ''); -}, -disable: function(btn) { - if (!this.btn) return; - var a = this.btn[btn].getElementsByTagName('a')[0]; - a.onclick = function() { return false; }; - if (!/disabled$/.test(a.className)) a.className += ' disabled'; -}, -hitSpace: function() { - if (this.autoplay) this.pause(); - else this.play(); -}, -play: function(wait) { - if (this.btn) { - this.btn.play.style.display = 'none'; - this.btn.pause.style.display = ''; - } - - this.autoplay = true; - if (!wait) hs.next(this.expKey); -}, -pause: function() { - if (this.btn) { - this.btn.pause.style.display = 'none'; - this.btn.play.style.display = ''; - } - - clearTimeout(this.autoplay); - this.autoplay = null; -}, -previous: function() { - this.pause(); - hs.previous(this.btn.previous); -}, -next: function() { - this.pause(); - hs.next(this.btn.next); -}, -move: function() {}, -'full-expand': function() { - hs.getExpander().doFullExpand(); -}, -close: function() { - hs.close(this.btn.close); -} -}; -hs.Thumbstrip = function(slideshow) { - function add (exp) { - hs.extend(options || {}, { - overlayId: dom, - hsId: 'thumbstrip', - className: 'highslide-thumbstrip-'+ mode +'-overlay ' + (options.className || '') - }); - if (hs.ieLt7) options.fade = 0; - exp.createOverlay(options); - hs.setStyles(dom.parentNode, { overflow: 'hidden' }); - }; - - function scroll (delta) { - selectThumb(undefined, Math.round(delta * dom[isX ? 'offsetWidth' : 'offsetHeight'] * 0.7)); - }; - - function selectThumb (i, scrollBy) { - if (i === undefined) for (var j = 0; j < group.length; j++) { - if (group[j] == hs.expanders[slideshow.expKey].a) { - i = j; - break; - } - } - if (i === undefined) return; - var as = dom.getElementsByTagName('a'), - active = as[i], - cell = active.parentNode, - left = isX ? 'Left' : 'Top', - right = isX ? 'Right' : 'Bottom', - width = isX ? 'Width' : 'Height', - offsetLeft = 'offset' + left, - offsetWidth = 'offset' + width, - overlayWidth = div.parentNode.parentNode[offsetWidth], - minTblPos = overlayWidth - table[offsetWidth], - curTblPos = parseInt(table.style[isX ? 'left' : 'top']) || 0, - tblPos = curTblPos, - mgnRight = 20; - if (scrollBy !== undefined) { - tblPos = curTblPos - scrollBy; - - if (minTblPos > 0) minTblPos = 0; - if (tblPos > 0) tblPos = 0; - if (tblPos < minTblPos) tblPos = minTblPos; - - - } else { - for (var j = 0; j < as.length; j++) as[j].className = ''; - active.className = 'highslide-active-anchor'; - var activeLeft = i > 0 ? as[i - 1].parentNode[offsetLeft] : cell[offsetLeft], - activeRight = cell[offsetLeft] + cell[offsetWidth] + - (as[i + 1] ? as[i + 1].parentNode[offsetWidth] : 0); - if (activeRight > overlayWidth - curTblPos) tblPos = overlayWidth - activeRight; - else if (activeLeft < -curTblPos) tblPos = -activeLeft; - } - var markerPos = cell[offsetLeft] + (cell[offsetWidth] - marker[offsetWidth]) / 2 + tblPos; - hs.animate(table, isX ? { left: tblPos } : { top: tblPos }, null, 'easeOutQuad'); - hs.animate(marker, isX ? { left: markerPos } : { top: markerPos }, null, 'easeOutQuad'); - scrollUp.style.display = tblPos < 0 ? 'block' : 'none'; - scrollDown.style.display = (tblPos > minTblPos) ? 'block' : 'none'; - - }; - - - // initialize - var group = hs.anchors.groups[hs.expanders[slideshow.expKey].slideshowGroup || 'none'], - options = slideshow.thumbstrip, - mode = options.mode || 'horizontal', - floatMode = (mode == 'float'), - tree = floatMode ? ['div', 'ul', 'li', 'span'] : ['table', 'tbody', 'tr', 'td'], - isX = (mode == 'horizontal'), - dom = hs.createElement('div', { - className: 'highslide-thumbstrip highslide-thumbstrip-'+ mode, - innerHTML: - '
    '+ - '<'+ tree[0] +'><'+ tree[1] +'>
    '+ - '
    '+ - '
    '+ - '
    ' - }, { - display: 'none' - }, hs.container), - domCh = dom.childNodes, - div = domCh[0], - scrollUp = domCh[1], - scrollDown = domCh[2], - marker = domCh[3], - table = div.firstChild, - tbody = dom.getElementsByTagName(tree[1])[0], - tr; - for (var i = 0; i < group.length; i++) { - if (i == 0 || !isX) tr = hs.createElement(tree[2], null, null, tbody); - (function(){ - var a = group[i], - cell = hs.createElement(tree[3], null, null, tr), - pI = i; - hs.createElement('a', { - href: a.href, - title: a.title, - onclick: function() { - if (/highslide-active-anchor/.test(this.className)) return false; - hs.getExpander(this).focus(); - return hs.transit(a); - }, - innerHTML: hs.stripItemFormatter ? hs.stripItemFormatter(a) : a.innerHTML - }, null, cell); - })(); - } - if (!floatMode) { - scrollUp.onclick = function () { scroll(-1); }; - scrollDown.onclick = function() { scroll(1); }; - hs.addEventListener(tbody, document.onmousewheel !== undefined ? - 'mousewheel' : 'DOMMouseScroll', function(e) { - var delta = 0; - e = e || window.event; - if (e.wheelDelta) { - delta = e.wheelDelta/120; - if (hs.opera) delta = -delta; - } else if (e.detail) { - delta = -e.detail/3; - } - if (delta) scroll(-delta * 0.2); - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - }); - } - - return { - add: add, - selectThumb: selectThumb - } -}; -hs.langDefaults = hs.lang; -// history -var HsExpander = hs.Expander; -if (hs.ie && window == window.top) { - (function () { - try { - document.documentElement.doScroll('left'); - } catch (e) { - setTimeout(arguments.callee, 50); - return; - } - hs.ready(); - })(); -} -hs.addEventListener(document, 'DOMContentLoaded', hs.ready); -hs.addEventListener(window, 'load', hs.ready); - -// set handlers -hs.addEventListener(document, 'ready', function() { - if (hs.expandCursor || hs.dimmingOpacity) { - var style = hs.createElement('style', { type: 'text/css' }, null, - document.getElementsByTagName('HEAD')[0]), - backCompat = document.compatMode == 'BackCompat'; - - - function addRule(sel, dec) { - if (hs.ie && (hs.uaVersion < 9 || backCompat)) { - var last = document.styleSheets[document.styleSheets.length - 1]; - if (typeof(last.addRule) == "object") last.addRule(sel, dec); - } else { - style.appendChild(document.createTextNode(sel + " {" + dec + "}")); - } - } - function fix(prop) { - return 'expression( ( ( ignoreMe = document.documentElement.'+ prop + - ' ? document.documentElement.'+ prop +' : document.body.'+ prop +' ) ) + \'px\' );'; - } - if (hs.expandCursor) addRule ('.highslide img', - 'cursor: url('+ hs.graphicsDir + hs.expandCursor +'), pointer !important;'); - addRule ('.highslide-viewport-size', - hs.ie && (hs.uaVersion < 7 || backCompat) ? - 'position: absolute; '+ - 'left:'+ fix('scrollLeft') + - 'top:'+ fix('scrollTop') + - 'width:'+ fix('clientWidth') + - 'height:'+ fix('clientHeight') : - 'position: fixed; width: 100%; height: 100%; left: 0; top: 0'); - } -}); -hs.addEventListener(window, 'resize', function() { - hs.getPageSize(); - if (hs.viewport) for (var i = 0; i < hs.viewport.childNodes.length; i++) { - var node = hs.viewport.childNodes[i], - exp = hs.getExpander(node); - exp.positionOverlay(node); - if (node.hsId == 'thumbstrip') exp.slideshow.thumbstrip.selectThumb(); - } -}); -hs.addEventListener(document, 'mousemove', function(e) { - hs.mouse = { x: e.clientX, y: e.clientY }; -}); -hs.addEventListener(document, 'mousedown', hs.mouseClickHandler); -hs.addEventListener(document, 'mouseup', hs.mouseClickHandler); -hs.addEventListener(document, 'ready', hs.setClickEvents); -hs.addEventListener(window, 'load', hs.preloadImages); -hs.addEventListener(window, 'load', hs.preloadAjax); -} diff --git a/DeveloperAdoption/public/static/highslide/highslide/highslide-full.min.js b/DeveloperAdoption/public/static/highslide/highslide/highslide-full.min.js deleted file mode 100644 index 6281959..0000000 --- a/DeveloperAdoption/public/static/highslide/highslide/highslide-full.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Name: Highslide JS - * Version: 4.1.13 (2011-10-06) - * Config: default +events +unobtrusive +imagemap +slideshow +positioning +transitions +viewport +thumbstrip +inline +ajax +iframe +flash - * Author: Torstein Hønsi - * Support: www.highslide.com/support - * License: www.highslide.com/#license - */ -if(!hs){var hs={lang:{cssDirection:"ltr",loadingText:"Loading...",loadingTitle:"Click to cancel",focusTitle:"Click to bring to front",fullExpandTitle:"Expand to actual size (f)",creditsText:"Powered by Highslide JS",creditsTitle:"Go to the Highslide JS homepage",previousText:"Previous",nextText:"Next",moveText:"Move",closeText:"Close",closeTitle:"Close (esc)",resizeTitle:"Resize",playText:"Play",playTitle:"Play slideshow (spacebar)",pauseText:"Pause",pauseTitle:"Pause slideshow (spacebar)",previousTitle:"Previous (arrow left)",nextTitle:"Next (arrow right)",moveTitle:"Move",fullExpandText:"1:1",number:"Image %1 of %2",restoreTitle:"Click to close image, click and drag to move. Use arrow keys for next and previous."},graphicsDir:"highslide/graphics/",expandCursor:"zoomin.cur",restoreCursor:"zoomout.cur",expandDuration:250,restoreDuration:250,marginLeft:15,marginRight:15,marginTop:15,marginBottom:15,zIndexCounter:1001,loadingOpacity:0.75,allowMultipleInstances:true,numberOfImagesToPreload:5,outlineWhileAnimating:2,outlineStartOffset:3,padToMinWidth:false,fullExpandPosition:"bottom right",fullExpandOpacity:1,showCredits:true,creditsHref:"http://highslide.com/",creditsTarget:"_self",enableKeyListener:true,openerTagNames:["a","area"],transitions:[],transitionDuration:250,dimmingOpacity:0,dimmingDuration:50,allowWidthReduction:false,allowHeightReduction:true,preserveContent:true,objectLoadTime:"before",cacheAjax:true,anchor:"auto",align:"auto",targetX:null,targetY:null,dragByHeading:true,minWidth:200,minHeight:200,allowSizeReduction:true,outlineType:"drop-shadow",skin:{controls:'',contentWrapper:'
    '},preloadTheseImages:[],continuePreloading:true,expanders:[],overrides:["allowSizeReduction","useBox","anchor","align","targetX","targetY","outlineType","outlineWhileAnimating","captionId","captionText","captionEval","captionOverlay","headingId","headingText","headingEval","headingOverlay","creditsPosition","dragByHeading","autoplay","numberPosition","transitions","dimmingOpacity","width","height","contentId","allowWidthReduction","allowHeightReduction","preserveContent","maincontentId","maincontentText","maincontentEval","objectType","cacheAjax","objectWidth","objectHeight","objectLoadTime","swfOptions","wrapperClassName","minWidth","minHeight","maxWidth","maxHeight","pageOrigin","slideshowGroup","easing","easingClose","fadeInOut","src"],overlays:[],idCounter:0,oPos:{x:["leftpanel","left","center","right","rightpanel"],y:["above","top","middle","bottom","below"]},mouse:{},headingOverlay:{},captionOverlay:{},swfOptions:{flashvars:{},params:{},attributes:{}},timers:[],slideshows:[],pendingOutlines:{},sleeping:[],preloadTheseAjax:[],cacheBindings:[],cachedGets:{},clones:{},onReady:[],uaVersion:/Trident\/4\.0/.test(navigator.userAgent)?8:parseFloat((navigator.userAgent.toLowerCase().match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1]),ie:(document.all&&!window.opera),safari:/Safari/.test(navigator.userAgent),geckoMac:/Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent),$:function(a){if(a){return document.getElementById(a)}},push:function(a,b){a[a.length]=b},createElement:function(a,f,e,d,c){var b=document.createElement(a);if(f){hs.extend(b,f)}if(c){hs.setStyles(b,{padding:0,border:"none",margin:0})}if(e){hs.setStyles(b,e)}if(d){d.appendChild(b)}return b},extend:function(b,c){for(var a in c){b[a]=c[a]}return b},setStyles:function(b,c){for(var a in c){if(hs.ieLt9&&a=="opacity"){if(c[a]>0.99){b.style.removeAttribute("filter")}else{b.style.filter="alpha(opacity="+(c[a]*100)+")"}}else{b.style[a]=c[a]}}},animate:function(f,a,d){var c,g,j;if(typeof d!="object"||d===null){var i=arguments;d={duration:i[2],easing:i[3],complete:i[4]}}if(typeof d.duration!="number"){d.duration=250}d.easing=Math[d.easing]||Math.easeInQuad;d.curAnim=hs.extend({},a);for(var b in a){var h=new hs.fx(f,d,b);c=parseFloat(hs.css(f,b))||0;g=parseFloat(a[b]);j=b!="opacity"?"px":"";h.custom(c,g,j)}},css:function(a,c){if(a.style[c]){return a.style[c]}else{if(document.defaultView){return document.defaultView.getComputedStyle(a,null).getPropertyValue(c)}else{if(c=="opacity"){c="filter"}var b=a.currentStyle[c.replace(/\-(\w)/g,function(e,d){return d.toUpperCase()})];if(c=="filter"){b=b.replace(/alpha\(opacity=([0-9]+)\)/,function(e,d){return d/100})}return b===""?1:b}}},getPageSize:function(){var f=document,b=window,e=f.compatMode&&f.compatMode!="BackCompat"?f.documentElement:f.body,g=hs.ie&&(hs.uaVersion<9||typeof pageXOffset=="undefined");var c=g?e.clientWidth:(f.documentElement.clientWidth||self.innerWidth),a=g?e.clientHeight:self.innerHeight;hs.page={width:c,height:a,scrollLeft:g?e.scrollLeft:pageXOffset,scrollTop:g?e.scrollTop:pageYOffset};return hs.page},getPosition:function(c){if(/area/i.test(c.tagName)){var e=document.getElementsByTagName("img");for(var b=0;bc){c=f;b=d}}}if(b==-1){hs.focusKey=-1}else{a[b].focus()}},getParam:function(b,d){b.getParams=b.onclick;var c=b.getParams?b.getParams():null;b.getParams=null;return(c&&typeof c[d]!="undefined")?c[d]:(typeof hs[d]!="undefined"?hs[d]:null)},getSrc:function(b){var c=hs.getParam(b,"src");if(c){return c}return b.href},getNode:function(e){var c=hs.$(e),d=hs.clones[e],b={};if(!c&&!d){return null}if(!d){d=c.cloneNode(true);d.id="";hs.clones[e]=d;return c}else{return d.cloneNode(true)}},discardElement:function(a){if(a){hs.garbageBin.appendChild(a)}hs.garbageBin.innerHTML=""},dim:function(d){if(!hs.dimmer){a=true;hs.dimmer=hs.createElement("div",{className:"highslide-dimming highslide-viewport-size",owner:"",onclick:function(){if(hs.fireEvent(hs,"onDimmerClick")){hs.close()}}},{visibility:"visible",opacity:0},hs.container,true);if(/(Android|iPad|iPhone|iPod)/.test(navigator.userAgent)){var b=document.body;function c(){hs.setStyles(hs.dimmer,{width:b.scrollWidth+"px",height:b.scrollHeight+"px"})}c();hs.addEventListener(window,"resize",c)}}hs.dimmer.style.display="";var a=hs.dimmer.owner=="";hs.dimmer.owner+="|"+d.key;if(a){if(hs.geckoMac&&hs.dimmingGeckoFix){hs.setStyles(hs.dimmer,{background:"url("+hs.graphicsDir+"geckodimmer.png)",opacity:1})}else{hs.animate(hs.dimmer,{opacity:d.dimmingOpacity},hs.dimmingDuration)}}},undim:function(a){if(!hs.dimmer){return}if(typeof a!="undefined"){hs.dimmer.owner=hs.dimmer.owner.replace("|"+a,"")}if((typeof a!="undefined"&&hs.dimmer.owner!="")||(hs.upcoming&&hs.getParam(hs.upcoming,"dimmingOpacity"))){return}if(hs.geckoMac&&hs.dimmingGeckoFix){hs.dimmer.style.display="none"}else{hs.animate(hs.dimmer,{opacity:0},hs.dimmingDuration,null,function(){hs.dimmer.style.display="none"})}},transit:function(a,d){var b=d||hs.getExpander();d=b;if(hs.upcoming){return false}else{hs.last=b}hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler);try{hs.upcoming=a;a.onclick()}catch(c){hs.last=hs.upcoming=null}try{if(!a||d.transitions[1]!="crossfade"){d.close()}}catch(c){}return false},previousOrNext:function(a,c){var b=hs.getExpander(a);if(b){return hs.transit(b.getAdjacentAnchor(c),b)}else{return false}},previous:function(a){return hs.previousOrNext(a,-1)},next:function(a){return hs.previousOrNext(a,1)},keyHandler:function(a){if(!a){a=window.event}if(!a.target){a.target=a.srcElement}if(typeof a.target.form!="undefined"){return true}if(!hs.fireEvent(hs,"onKeyDown",a)){return true}var b=hs.getExpander();var c=null;switch(a.keyCode){case 70:if(b){b.doFullExpand()}return true;case 32:c=2;break;case 34:case 39:case 40:c=1;break;case 8:case 33:case 37:case 38:c=-1;break;case 27:case 13:c=0}if(c!==null){if(c!=2){hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler)}if(!hs.enableKeyListener){return true}if(a.preventDefault){a.preventDefault()}else{a.returnValue=false}if(b){if(c==0){b.close()}else{if(c==2){if(b.slideshow){b.slideshow.hitSpace()}}else{if(b.slideshow){b.slideshow.pause()}hs.previousOrNext(b.key,c)}}return false}}return true},registerOverlay:function(a){hs.push(hs.overlays,hs.extend(a,{hsId:"hsId"+hs.idCounter++}))},addSlideshow:function(b){var d=b.slideshowGroup;if(typeof d=="object"){for(var c=0;c1){return true}if(!d.target){d.target=d.srcElement}var b=d.target;while(b.parentNode&&!(/highslide-(image|move|html|resize)/.test(b.className))){b=b.parentNode}var f=hs.getExpander(b);if(f&&(f.isClosing||!f.isExpanded)){return true}if(f&&d.type=="mousedown"){if(d.target.form){return true}var a=b.className.match(/highslide-(image|move|resize)/);if(a){hs.dragArgs={exp:f,type:a[1],left:f.x.pos,width:f.x.size,top:f.y.pos,height:f.y.size,clickX:d.clientX,clickY:d.clientY};hs.addEventListener(document,"mousemove",hs.dragHandler);if(d.preventDefault){d.preventDefault()}if(/highslide-(image|html)-blur/.test(f.content.className)){f.focus();hs.hasFocused=true}return false}else{if(/highslide-html/.test(b.className)&&hs.focusKey!=f.key){f.focus();f.doShowHide("hidden")}}}else{if(d.type=="mouseup"){hs.removeEventListener(document,"mousemove",hs.dragHandler);if(hs.dragArgs){if(hs.styleRestoreCursor&&hs.dragArgs.type=="image"){hs.dragArgs.exp.content.style.cursor=hs.styleRestoreCursor}var c=hs.dragArgs.hasDragged;if(!c&&!hs.hasFocused&&!/(move|resize)/.test(hs.dragArgs.type)){if(hs.fireEvent(f,"onImageClick")){f.close()}}else{if(c||(!c&&hs.hasHtmlExpanders)){hs.dragArgs.exp.doShowHide("hidden")}}if(hs.dragArgs.exp.releaseMask){hs.dragArgs.exp.releaseMask.style.display="none"}if(c){hs.fireEvent(hs.dragArgs.exp,"onDrop",hs.dragArgs)}hs.hasFocused=false;hs.dragArgs=null}else{if(/highslide-image-blur/.test(b.className)){b.style.cursor=hs.styleRestoreCursor}}}}return false},dragHandler:function(c){if(!hs.dragArgs){return true}if(!c){c=window.event}var b=hs.dragArgs,d=b.exp;if(d.iframe){if(!d.releaseMask){d.releaseMask=hs.createElement("div",null,{position:"absolute",width:d.x.size+"px",height:d.y.size+"px",left:d.x.cb+"px",top:d.y.cb+"px",zIndex:4,background:(hs.ieLt9?"white":"none"),opacity:0.01},d.wrapper,true)}if(d.releaseMask.style.display=="none"){d.releaseMask.style.display=""}}b.dX=c.clientX-b.clickX;b.dY=c.clientY-b.clickY;var f=Math.sqrt(Math.pow(b.dX,2)+Math.pow(b.dY,2));if(!b.hasDragged){b.hasDragged=(b.type!="image"&&f>0)||(f>(hs.dragSensitivity||5))}if(b.hasDragged&&c.clientX>5&&c.clientY>5){if(!hs.fireEvent(d,"onDrag",b)){return false}if(b.type=="resize"){d.resize(b)}else{d.moveTo(b.left+b.dX,b.top+b.dY);if(b.type=="image"){d.content.style.cursor="move"}}}return false},wrapperMouseHandler:function(c){try{if(!c){c=window.event}var b=/mouseover/i.test(c.type);if(!c.target){c.target=c.srcElement}if(!c.relatedTarget){c.relatedTarget=b?c.fromElement:c.toElement}var d=hs.getExpander(c.target);if(!d.isExpanded){return}if(!d||!c.relatedTarget||hs.getExpander(c.relatedTarget,true)==d||hs.dragArgs){return}hs.fireEvent(d,b?"onMouseOver":"onMouseOut",c);for(var a=0;a=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var a=true;for(var b in this.options.curAnim){if(this.options.curAnim[b]!==true){a=false}}if(a){if(this.options.complete){this.options.complete.call(this.elem)}}return false}else{var e=c-this.startTime;this.state=e/this.options.duration;this.pos=this.options.easing(e,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};hs.extend(hs.fx,{step:{opacity:function(a){hs.setStyles(a.elem,{opacity:a.now})},_default:function(a){try{if(a.elem.style&&a.elem.style[a.prop]!=null){a.elem.style[a.prop]=a.now+a.unit}else{a.elem[a.prop]=a.now}}catch(b){}}}});hs.Outline=function(g,e){this.onLoad=e;this.outlineType=g;var a=hs.uaVersion,f;this.hasAlphaImageLoader=hs.ie&&hs.uaVersion<7;if(!g){if(e){e()}return}hs.init();this.table=hs.createElement("table",{cellSpacing:0},{visibility:"hidden",position:"absolute",borderCollapse:"collapse",width:0},hs.container,true);var b=hs.createElement("tbody",null,null,this.table,1);this.td=[];for(var c=0;c<=8;c++){if(c%3==0){f=hs.createElement("tr",null,{height:"auto"},b,true)}this.td[c]=hs.createElement("td",null,null,f,true);var d=c!=4?{lineHeight:0,fontSize:0}:{position:"relative"};hs.setStyles(this.td[c],d)}this.td[4].className=g+" highslide-outline";this.preloadGraphic()};hs.Outline.prototype={preloadGraphic:function(){var b=hs.graphicsDir+(hs.outlinesDir||"outlines/")+this.outlineType+".png";var a=hs.safari&&hs.uaVersion<525?hs.container:null;this.graphic=hs.createElement("img",null,{position:"absolute",top:"-9999px"},a,true);var c=this;this.graphic.onload=function(){c.onGraphicLoad()};this.graphic.src=b},onGraphicLoad:function(){var d=this.offset=this.graphic.width/4,f=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],c={height:(2*d)+"px",width:(2*d)+"px"};for(var b=0;b<=8;b++){if(f[b]){if(this.hasAlphaImageLoader){var a=(b==1||b==7)?"100%":this.graphic.width+"px";var e=hs.createElement("div",null,{width:"100%",height:"100%",position:"relative",overflow:"hidden"},this.td[b],true);hs.createElement("div",null,{filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+this.graphic.src+"')",position:"absolute",width:a,height:this.graphic.height+"px",left:(f[b][0]*d)+"px",top:(f[b][1]*d)+"px"},e,true)}else{hs.setStyles(this.td[b],{background:"url("+this.graphic.src+") "+(f[b][0]*d)+"px "+(f[b][1]*d)+"px"})}if(window.opera&&(b==3||b==5)){hs.createElement("div",null,c,this.td[b],true)}hs.setStyles(this.td[b],c)}}this.graphic=null;if(hs.pendingOutlines[this.outlineType]){hs.pendingOutlines[this.outlineType].destroy()}hs.pendingOutlines[this.outlineType]=this;if(this.onLoad){this.onLoad()}},setPosition:function(g,e,c,b,f){var d=this.exp,a=d.wrapper.style,e=e||0,g=g||{x:d.x.pos+e,y:d.y.pos+e,w:d.x.get("wsize")-2*e,h:d.y.get("wsize")-2*e};if(c){this.table.style.visibility=(g.h>=4*this.offset)?"visible":"hidden"}hs.setStyles(this.table,{left:(g.x-this.offset)+"px",top:(g.y-this.offset)+"px",width:(g.w+2*this.offset)+"px"});g.w-=2*this.offset;g.h-=2*this.offset;hs.setStyles(this.td[4],{width:g.w>=0?g.w+"px":0,height:g.h>=0?g.h+"px":0});if(this.hasAlphaImageLoader){this.td[3].style.height=this.td[5].style.height=this.td[4].style.height}},destroy:function(a){if(a){this.table.style.visibility="hidden"}else{hs.discardElement(this.table)}}};hs.Dimension=function(b,a){this.exp=b;this.dim=a;this.ucwh=a=="x"?"Width":"Height";this.wh=this.ucwh.toLowerCase();this.uclt=a=="x"?"Left":"Top";this.lt=this.uclt.toLowerCase();this.ucrb=a=="x"?"Right":"Bottom";this.rb=this.ucrb.toLowerCase();this.p1=this.p2=0};hs.Dimension.prototype={get:function(a){switch(a){case"loadingPos":return this.tpos+this.tb+(this.t-hs.loading["offset"+this.ucwh])/2;case"loadingPosXfade":return this.pos+this.cb+this.p1+(this.size-hs.loading["offset"+this.ucwh])/2;case"wsize":return this.size+2*this.cb+this.p1+this.p2;case"fitsize":return this.clientSize-this.marginMin-this.marginMax;case"maxsize":return this.get("fitsize")-2*this.cb-this.p1-this.p2;case"opos":return this.pos-(this.exp.outline?this.exp.outline.offset:0);case"osize":return this.get("wsize")+(this.exp.outline?2*this.exp.outline.offset:0);case"imgPad":return this.imgSize?Math.round((this.size-this.imgSize)/2):0}},calcBorders:function(){this.cb=(this.exp.content["offset"+this.ucwh]-this.t)/2;this.marginMax=hs["margin"+this.ucrb]},calcThumb:function(){this.t=this.exp.el[this.wh]?parseInt(this.exp.el[this.wh]):this.exp.el["offset"+this.ucwh];this.tpos=this.exp.tpos[this.dim];this.tb=(this.exp.el["offset"+this.ucwh]-this.t)/2;if(this.tpos==0||this.tpos==-1){this.tpos=(hs.page[this.wh]/2)+hs.page["scroll"+this.uclt]}},calcExpanded:function(){var a=this.exp;this.justify="auto";if(a.align=="center"){this.justify="center"}else{if(new RegExp(this.lt).test(a.anchor)){this.justify=null}else{if(new RegExp(this.rb).test(a.anchor)){this.justify="max"}}}this.pos=this.tpos-this.cb+this.tb;if(this.maxHeight&&this.dim=="x"){a.maxWidth=Math.min(a.maxWidth||this.full,a.maxHeight*this.full/a.y.full)}this.size=Math.min(this.full,a["max"+this.ucwh]||this.full);this.minSize=a.allowSizeReduction?Math.min(a["min"+this.ucwh],this.full):this.full;if(a.isImage&&a.useBox){this.size=a[this.wh];this.imgSize=this.full}if(this.dim=="x"&&hs.padToMinWidth){this.minSize=a.minWidth}this.target=a["target"+this.dim.toUpperCase()];this.marginMin=hs["margin"+this.uclt];this.scroll=hs.page["scroll"+this.uclt];this.clientSize=hs.page[this.wh]},setSize:function(a){var f=this.exp;if(f.isImage&&(f.useBox||hs.padToMinWidth)){this.imgSize=a;this.size=Math.max(this.size,this.imgSize);f.content.style[this.lt]=this.get("imgPad")+"px"}else{this.size=a}f.content.style[this.wh]=a+"px";f.wrapper.style[this.wh]=this.get("wsize")+"px";if(f.outline){f.outline.setPosition()}if(f.releaseMask){f.releaseMask.style[this.wh]=a+"px"}if(this.dim=="y"&&f.iDoc&&f.body.style.height!="auto"){try{f.iDoc.body.style.overflow="auto"}catch(b){}}if(f.isHtml){var c=f.scrollerDiv;if(this.sizeDiff===undefined){this.sizeDiff=f.innerContent["offset"+this.ucwh]-c["offset"+this.ucwh]}c.style[this.wh]=(this.size-this.sizeDiff)+"px";if(this.dim=="x"){f.mediumContent.style.width="auto"}if(f.body){f.body.style[this.wh]="auto"}}if(this.dim=="x"&&f.overlayBox){f.sizeOverlayBox(true)}if(this.dim=="x"&&f.slideshow&&f.isImage){if(a==this.full){f.slideshow.disable("full-expand")}else{f.slideshow.enable("full-expand")}}},setPos:function(a){this.pos=a;this.exp.wrapper.style[this.lt]=a+"px";if(this.exp.outline){this.exp.outline.setPosition()}}};hs.Expander=function(k,f,b,l){if(document.readyState&&hs.ie&&!hs.isReady){hs.addEventListener(document,"ready",function(){new hs.Expander(k,f,b,l)});return}this.a=k;this.custom=b;this.contentType=l||"image";this.isHtml=(l=="html");this.isImage=!this.isHtml;hs.continuePreloading=false;this.overlays=[];this.last=hs.last;hs.last=null;hs.init();var m=this.key=hs.expanders.length;for(var g=0;ga.scroll+a.clientSize-a.marginMax){a.pos=a.scroll+a.clientSize-a.size-a.marginMin-a.marginMax-a.p1-a.p2}if(a.pos(this.x.imgSize||this.x.size)){this.createFullExpand();if(this.overlays.length==1){this.sizeOverlayBox()}}}this.show()}catch(d){this.error(d)}},setObjContainerSize:function(a,d){var b=hs.getElementByClass(a,"DIV","highslide-body");if(/(iframe|swf)/.test(this.objectType)){if(this.objectWidth){b.style.width=this.objectWidth+"px"}if(this.objectHeight){b.style.height=this.objectHeight+"px"}}},writeExtendedContent:function(){if(this.hasExtendedContent){return}var f=this;this.body=hs.getElementByClass(this.innerContent,"DIV","highslide-body");if(this.objectType=="iframe"){this.showLoading();var g=hs.clearing.cloneNode(1);this.body.appendChild(g);this.newWidth=this.innerContent.offsetWidth;if(!this.objectWidth){this.objectWidth=g.offsetWidth}var c=this.innerContent.offsetHeight-this.body.offsetHeight,d=this.objectHeight||hs.page.height-c-hs.marginTop-hs.marginBottom,e=this.objectLoadTime=="before"?' onload="if (hs.expanders['+this.key+"]) hs.expanders["+this.key+'].contentLoaded()" ':"";this.body.innerHTML+='';this.ruler=this.body.getElementsByTagName("div")[0];this.iframe=this.body.getElementsByTagName("iframe")[0];if(this.objectLoadTime=="after"){this.correctIframeSize()}}if(this.objectType=="swf"){this.body.id=this.body.id||"hs-flash-id-"+this.key;var b=this.swfOptions;if(!b.params){b.params={}}if(typeof b.params.wmode=="undefined"){b.params.wmode="transparent"}if(swfobject){swfobject.embedSWF(this.src,this.body.id,this.objectWidth,this.objectHeight,b.version||"7",b.expressInstallSwfurl,b.flashvars,b.params,b.attributes)}}this.hasExtendedContent=true},htmlGetSize:function(){if(this.iframe&&!this.objectHeight){this.iframe.style.height=this.body.style.height=this.getIframePageHeight()+"px"}this.innerContent.appendChild(hs.clearing);if(!this.x.full){this.x.full=this.innerContent.offsetWidth}this.y.full=this.innerContent.offsetHeight;this.innerContent.removeChild(hs.clearing);if(hs.ie&&this.newHeight>parseInt(this.innerContent.currentStyle.height)){this.newHeight=parseInt(this.innerContent.currentStyle.height)}hs.setStyles(this.wrapper,{position:"absolute",padding:"0"});hs.setStyles(this.content,{width:this.x.t+"px",height:this.y.t+"px"})},getIframePageHeight:function(){var a;try{var d=this.iDoc=this.iframe.contentDocument||this.iframe.contentWindow.document;var b=d.createElement("div");b.style.clear="both";d.body.appendChild(b);a=b.offsetTop;if(hs.ie){a+=parseInt(d.body.currentStyle.marginTop)+parseInt(d.body.currentStyle.marginBottom)-1}}catch(c){a=300}return a},correctIframeSize:function(){var b=this.innerContent.offsetWidth-this.ruler.offsetWidth;hs.discardElement(this.ruler);if(b<0){b=0}var a=this.innerContent.offsetHeight-this.iframe.offsetHeight;if(this.iDoc&&!this.objectHeight&&!this.height&&this.y.size==this.y.full){try{this.iDoc.body.style.overflow="hidden"}catch(c){}}hs.setStyles(this.iframe,{width:Math.abs(this.x.size-b)+"px",height:Math.abs(this.y.size-a)+"px"});hs.setStyles(this.body,{width:this.iframe.style.width,height:this.iframe.style.height});this.scrollingContent=this.iframe;this.scrollerDiv=this.scrollingContent},htmlSizeOperations:function(){this.setObjContainerSize(this.innerContent);if(this.objectType=="swf"&&this.objectLoadTime=="before"){this.writeExtendedContent()}if(this.x.sizee.offsetHeight){e.style.width=(parseInt(e.style.width)+d)+"px"}this.scrollingContent=e;this.scrollerDiv=this.scrollingContent}if(this.iframe&&this.objectLoadTime=="before"){this.correctIframeSize()}if(!this.scrollingContent&&this.y.sizethis.scrollerDiv.parentNode.offsetHeight){setTimeout("try { hs.expanders["+this.key+"].scrollerDiv.style.overflow = 'auto'; } catch(e) {}",hs.expandDuration)}},getImageMapAreaCorrection:function(d){var h=d.coords.split(",");for(var b=0;bf.scroll+f.clientSize-f.marginMax){if(!b&&d&&a){f.size=Math.min(f.size,f.get(e=="y"?"fitsize":"maxsize"))}else{if(f.get("wsize")c){d=b*c;if(dthis.minHeight&&a.size>this.minWidth&&d.get("wsize")>d.get("fitsize")){d.size-=10;if(b){a.size=d.size*b}this.sizeOverlayBox(0,1);c=true}}return c},reflow:function(){if(this.scrollerDiv){var a=/iframe/i.test(this.scrollerDiv.tagName)?(this.getIframePageHeight()+1)+"px":"auto";if(this.body){this.body.style.height=a}this.scrollerDiv.style.height=a;this.y.setSize(this.innerContent.offsetHeight)}},show:function(){var a=this.x,b=this.y;this.doShowHide("hidden");hs.fireEvent(this,"onBeforeExpand");if(this.slideshow&&this.slideshow.thumbstrip){this.slideshow.thumbstrip.selectThumb()}this.changeSize(1,{wrapper:{width:a.get("wsize"),height:b.get("wsize"),left:a.pos,top:b.pos},content:{left:a.p1+a.get("imgPad"),top:b.p1+b.get("imgPad"),width:a.imgSize||a.size,height:b.imgSize||b.size}},hs.expandDuration)},changeSize:function(d,i,b){var k=this.transitions,e=d?(this.last?this.last.a:null):hs.upcoming,j=(k[1]&&e&&hs.getParam(e,"transitions")[1]==k[1])?k[1]:k[0];if(this[j]&&j!="expand"){this[j](d,i);return}if(this.outline&&!this.outlineWhileAnimating){if(d){this.outline.setPosition()}else{this.outline.destroy((this.isHtml&&this.preserveContent))}}if(!d){this.destroyOverlays()}var c=this,h=c.x,g=c.y,f=this.easing;if(!d){f=this.easingClose||f}var a=d?function(){if(c.outline){c.outline.table.style.visibility="visible"}setTimeout(function(){c.afterExpand()},50)}:function(){c.afterClose()};if(d){hs.setStyles(this.wrapper,{width:h.t+"px",height:g.t+"px"})}if(d&&this.isHtml){hs.setStyles(this.wrapper,{left:(h.tpos-h.cb+h.tb)+"px",top:(g.tpos-g.cb+g.tb)+"px"})}if(this.fadeInOut){hs.setStyles(this.wrapper,{opacity:d?0:1});hs.extend(i.wrapper,{opacity:d})}hs.animate(this.wrapper,i.wrapper,{duration:b,easing:f,step:function(n,l){if(c.outline&&c.outlineWhileAnimating&&l.prop=="top"){var m=d?l.pos:1-l.pos;var o={w:h.t+(h.get("wsize")-h.t)*m,h:g.t+(g.get("wsize")-g.t)*m,x:h.tpos+(h.pos-h.tpos)*m,y:g.tpos+(g.pos-g.tpos)*m};c.outline.setPosition(o,0,1)}if(c.isHtml){if(l.prop=="left"){c.mediumContent.style.left=(h.pos-n)+"px"}if(l.prop=="top"){c.mediumContent.style.top=(g.pos-n)+"px"}}}});hs.animate(this.content,i.content,b,f,a);if(d){this.wrapper.style.visibility="visible";this.content.style.visibility="visible";if(this.isHtml){this.innerContent.style.visibility="visible"}this.a.className+=" highslide-active-anchor"}},fade:function(f,h){this.outlineWhileAnimating=false;var c=this,j=f?hs.expandDuration:0;if(f){hs.animate(this.wrapper,h.wrapper,0);hs.setStyles(this.wrapper,{opacity:0,visibility:"visible"});hs.animate(this.content,h.content,0);this.content.style.visibility="visible";hs.animate(this.wrapper,{opacity:1},j,null,function(){c.afterExpand()})}if(this.outline){this.outline.table.style.zIndex=this.wrapper.style.zIndex;var b=f||-1,d=this.outline.offset,a=f?3:d,g=f?d:3;for(var e=a;b*e<=b*g;e+=b,j+=25){(function(){var i=f?g-e:a-e;setTimeout(function(){c.outline.setPosition(0,i,1)},j)})()}}if(f){}else{setTimeout(function(){if(c.outline){c.outline.destroy(c.preserveContent)}c.destroyOverlays();hs.animate(c.wrapper,{opacity:0},hs.restoreDuration,null,function(){c.afterClose()})},j)}},crossfade:function(g,m,o){if(!g){return}var f=this,p=this.last,l=this.x,k=this.y,d=p.x,b=p.y,a=this.wrapper,i=this.content,c=this.overlayBox;hs.removeEventListener(document,"mousemove",hs.dragHandler);hs.setStyles(i,{width:(l.imgSize||l.size)+"px",height:(k.imgSize||k.size)+"px"});if(c){c.style.overflow="visible"}this.outline=p.outline;if(this.outline){this.outline.exp=f}p.outline=null;var h=hs.createElement("div",{className:"highslide-"+this.contentType},{position:"absolute",zIndex:4,overflow:"hidden",display:"none"});var j={oldImg:p,newImg:this};for(var e in j){this[e]=j[e].content.cloneNode(1);hs.setStyles(this[e],{position:"absolute",border:0,visibility:"visible"});h.appendChild(this[e])}a.appendChild(h);if(this.isHtml){hs.setStyles(this.mediumContent,{left:0,top:0})}if(c){c.className="";a.appendChild(c)}h.style.display="";p.content.style.display="none";if(hs.safari&&hs.uaVersion<525){this.wrapper.style.visibility="visible"}hs.animate(a,{width:l.size},{duration:hs.transitionDuration,step:function(u,r){var x=r.pos,q=1-x;var w,s={},t=["pos","size","p1","p2"];for(var v in t){w=t[v];s["x"+w]=Math.round(q*d[w]+x*l[w]);s["y"+w]=Math.round(q*b[w]+x*k[w]);s.ximgSize=Math.round(q*(d.imgSize||d.size)+x*(l.imgSize||l.size));s.ximgPad=Math.round(q*d.get("imgPad")+x*l.get("imgPad"));s.yimgSize=Math.round(q*(b.imgSize||b.size)+x*(k.imgSize||k.size));s.yimgPad=Math.round(q*b.get("imgPad")+x*k.get("imgPad"))}if(f.outline){f.outline.setPosition({x:s.xpos,y:s.ypos,w:s.xsize+s.xp1+s.xp2+2*l.cb,h:s.ysize+s.yp1+s.yp2+2*k.cb})}p.wrapper.style.clip="rect("+(s.ypos-b.pos)+"px, "+(s.xsize+s.xp1+s.xp2+s.xpos+2*d.cb-d.pos)+"px, "+(s.ysize+s.yp1+s.yp2+s.ypos+2*b.cb-b.pos)+"px, "+(s.xpos-d.pos)+"px)";hs.setStyles(i,{top:(s.yp1+k.get("imgPad"))+"px",left:(s.xp1+l.get("imgPad"))+"px",marginTop:(k.pos-s.ypos)+"px",marginLeft:(l.pos-s.xpos)+"px"});hs.setStyles(a,{top:s.ypos+"px",left:s.xpos+"px",width:(s.xp1+s.xp2+s.xsize+2*l.cb)+"px",height:(s.yp1+s.yp2+s.ysize+2*k.cb)+"px"});hs.setStyles(h,{width:(s.ximgSize||s.xsize)+"px",height:(s.yimgSize||s.ysize)+"px",left:(s.xp1+s.ximgPad)+"px",top:(s.yp1+s.yimgPad)+"px",visibility:"visible"});hs.setStyles(f.oldImg,{top:(b.pos-s.ypos+b.p1-s.yp1+b.get("imgPad")-s.yimgPad)+"px",left:(d.pos-s.xpos+d.p1-s.xp1+d.get("imgPad")-s.ximgPad)+"px"});hs.setStyles(f.newImg,{opacity:x,top:(k.pos-s.ypos+k.p1-s.yp1+k.get("imgPad")-s.yimgPad)+"px",left:(l.pos-s.xpos+l.p1-s.xp1+l.get("imgPad")-s.ximgPad)+"px"});if(c){hs.setStyles(c,{width:s.xsize+"px",height:s.ysize+"px",left:(s.xp1+l.cb)+"px",top:(s.yp1+k.cb)+"px"})}},complete:function(){a.style.visibility=i.style.visibility="visible";i.style.display="block";hs.discardElement(h);f.afterExpand();p.afterClose();f.last=null}})},reuseOverlay:function(d,c){if(!this.last){return false}for(var b=0;b'+b+""+this[this.numberPosition].innerHTML}}},initSlideshow:function(){if(!this.last){for(var c=0;cthis.x.get("opos")+this.x.get("osize"));var g=(k.y+k.hthis.y.get("opos")+this.y.get("osize"))}var d=hs.getWrapperKey(e[f]);if(!j&&!g&&d!=this.key){if(!h){e[f].setAttribute("hidden-by","["+this.key+"]");e[f].origProp=e[f].style[a];e[f].style[a]="hidden"}else{if(h.indexOf("["+this.key+"]")==-1){e[f].setAttribute("hidden-by",h+"["+this.key+"]")}}}else{if((h=="["+this.key+"]"||hs.focusKey==d)&&d!=this.key){e[f].setAttribute("hidden-by","");e[f].style[a]=e[f].origProp||""}else{if(h&&h.indexOf("["+this.key+"]")>-1){e[f].setAttribute("hidden-by",h.replace("["+this.key+"]",""))}}}}}}}},focus:function(){this.wrapper.style.zIndex=hs.zIndexCounter+=2;for(var a=0;ae.parentNode.offsetWidth){e.style.width="100%"}}else{if(e.parentNode!=this.overlayBox){this.overlayBox.appendChild(e)}}if(/left$/.test(f)){e.style.left=b+"px"}if(/center$/.test(f)){hs.setStyles(e,{left:"50%",marginLeft:(b-Math.round(e.offsetWidth/2))+"px"})}if(/right$/.test(f)){e.style.right=-b+"px"}if(/^leftpanel$/.test(f)){hs.setStyles(e,{right:"100%",marginRight:this.x.cb+"px",top:-this.y.cb+"px",bottom:-this.y.cb+"px",overflow:"auto"});this.x.p1=e.offsetWidth}else{if(/^rightpanel$/.test(f)){hs.setStyles(e,{left:"100%",marginLeft:this.x.cb+"px",top:-this.y.cb+"px",bottom:-this.y.cb+"px",overflow:"auto"});this.x.p2=e.offsetWidth}}var d=e.parentNode.offsetHeight;e.style.height="auto";if(c&&e.offsetHeight>d){e.style.height=hs.ieLt7?d+"px":"100%"}if(/^top/.test(f)){e.style.top=a+"px"}if(/^middle/.test(f)){hs.setStyles(e,{top:"50%",marginTop:(a-Math.round(e.offsetHeight/2))+"px"})}if(/^bottom/.test(f)){e.style.bottom=-a+"px"}if(/^above$/.test(f)){hs.setStyles(e,{left:(-this.x.p1-this.x.cb)+"px",right:(-this.x.p2-this.x.cb)+"px",bottom:"100%",marginBottom:this.y.cb+"px",width:"auto"});this.y.p1=e.offsetHeight}else{if(/^below$/.test(f)){hs.setStyles(e,{position:"relative",left:(-this.x.p1-this.x.cb)+"px",right:(-this.x.p2-this.x.cb)+"px",top:"100%",marginTop:this.y.cb+"px",width:"auto"});this.y.p2=e.offsetHeight;e.style.position="absolute"}}},getOverlays:function(){this.getInline(["heading","caption"],true);this.getNumber();if(this.caption){hs.fireEvent(this,"onAfterGetCaption")}if(this.heading){hs.fireEvent(this,"onAfterGetHeading")}if(this.heading&&this.dragByHeading){this.heading.className+=" highslide-move"}if(hs.showCredits){this.writeCredits()}for(var a=0;a=5.5){c=c.replace(new RegExp("]*>","gi"),"").replace(new RegExp("]*>.*?<\/script>","gi"),"");if(this.iframe){var f=this.iframe.contentDocument;if(!f&&this.iframe.contentWindow){f=this.iframe.contentWindow.document}if(!f){var g=this;setTimeout(function(){g.loadHTML()},25);return}f.open();f.write(c);f.close();try{c=f.getElementById(this.id).innerHTML}catch(d){try{c=this.iframe.document.getElementById(this.id).innerHTML}catch(d){}}hs.discardElement(this.iframe)}else{b=/(]*>|<\/body>)/ig;if(b.test(c)){c=c.split(b)[hs.ieLt9?1:2]}}}hs.getElementByClass(this.content,"DIV","highslide-body").innerHTML=c;this.onLoad();for(var a in this){this[a]=null}}};hs.Slideshow=function(c,b){if(hs.dynamicallyUpdateAnchors!==false){hs.updateAnchors()}this.expKey=c;for(var a in b){this[a]=b[a]}if(this.useControls){this.getControls()}if(this.thumbstrip){this.thumbstrip=hs.Thumbstrip(this)}};hs.Slideshow.prototype={getControls:function(){this.controls=hs.createElement("div",{innerHTML:hs.replaceLang(hs.skin.controls)},null,hs.container);var b=["play","pause","previous","next","move","full-expand","close"];this.btn={};var c=this;for(var a=0;a0){F=0}if(C>0){C=0}if(C0?G[L-1].parentNode[B]:w[B],A=w[B]+w[H]+(G[L+1]?G[L+1].parentNode[H]:0);if(A>x-v){C=x-A}else{if(J<-v){C=-J}}}var E=w[B]+(w[H]-g[H])/2+C;hs.animate(s,h?{left:C}:{top:C},null,"easeOutQuad");hs.animate(g,h?{left:E}:{top:E},null,"easeOutQuad");l.style.display=C<0?"block":"none";t.style.display=(C>F)?"block":"none"}var j=hs.anchors.groups[hs.expanders[k.expKey].slideshowGroup||"none"],f=k.thumbstrip,m=f.mode||"horizontal",u=(m=="float"),o=u?["div","ul","li","span"]:["table","tbody","tr","td"],h=(m=="horizontal"),r=hs.createElement("div",{className:"highslide-thumbstrip highslide-thumbstrip-"+m,innerHTML:'
    <'+o[0]+"><"+o[1]+">
    '},{display:"none"},hs.container),e=r.childNodes,n=e[0],l=e[1],t=e[2],g=e[3],s=n.firstChild,a=r.getElementsByTagName(o[1])[0],b;for(var q=0;q35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q(!m){A m={18:{97:\'aK\',aZ:\'fw...\',aY:\'8G 2i fP\',bD:\'8G 2i g0 2i eR\',9Z:\'eZ 2i fc D (f)\',cq:\'f8 by an ao\',cr:\'f4 2i f6 an ao fg\',8Y:\'aq\',8W:\'ay\',8Z:\'ag\',92:\'am\',90:\'am (eD)\',b0:\'eY\',ab:\'al\',au:\'al 1p (aj)\',ac:\'ah\',ad:\'ah 1p (aj)\',8s:\'aq (8w 1b)\',8X:\'ay (8w 3m)\',8V:\'ag\',ae:\'1:1\',3G:\'g7 %1 fz %2\',9W:\'8G 2i 26 2R, dC aA dE 2i 3u. dF 8w dB O 1D aA 3a.\'},5c:\'K/dw/\',7R:\'dv.5q\',6h:\'dx.5q\',6W:5Z,9A:5Z,4W:15,9B:15,4d:15,6L:15,4F:cY,be:0.75,9l:M,9f:5,3Y:2,ei:3,5S:1j,bz:\'4Q 3m\',bA:1,br:M,ct:\'em://K.eh/\',cs:\'ec\',aS:M,9w:[\'a\',\'5v\'],3q:[],cE:5Z,4b:0,87:50,6J:1j,6X:M,4D:M,3U:\'60\',7W:M,46:\'1M\',9n:\'1M\',b1:I,aC:I,a7:M,4s:aw,6k:aw,5Y:M,1Z:\'ev-dV\',8i:{2X:\'

    <6t>\'+\'<1H 1W="K-3a">\'+\'\'+\'<1C>{m.18.8Y}\'+\'\'+\'<1H 1W="K-3L">\'+\'\'+\'<1C>{m.18.ab}\'+\'\'+\'<1H 1W="K-3p">\'+\'\'+\'<1C>{m.18.ac}\'+\'\'+\'<1H 1W="K-1D">\'+\'\'+\'<1C>{m.18.8W}\'+\'\'+\'<1H 1W="K-3u">\'+\'\'+\'<1C>{m.18.8Z}\'+\'\'+\'<1H 1W="K-1a-2F">\'+\'\'+\'<1C>{m.18.ae}\'+\'\'+\'<1H 1W="K-26">\'+\'\'+\'<1C>{m.18.92}\'+\'\'+\'

    \',bd:\'

    <6t>\'+\'<1H 1W="K-3a">\'+\'\'+\'<1C>{m.18.8Y}\'+\'\'+\'<1H 1W="K-1D">\'+\'\'+\'<1C>{m.18.8W}\'+\'\'+\'<1H 1W="K-3u">\'+\'\'+\'<1C>{m.18.8Z}\'+\'\'+\'<1H 1W="K-26">\'+\'\'+\'<1C>{m.18.92}\'+\'\'+\'

    \'+\'

    \'+\'

    \'+\'<1C 1W="K-3O" 24="{m.18.b0}"><1C>\'+\'

    \'},64:[],a1:M,16:[],a4:[\'5Y\',\'3t\',\'46\',\'9n\',\'b1\',\'aC\',\'1Z\',\'3Y\',\'dU\',\'dM\',\'dL\',\'b3\',\'dK\',\'dI\',\'dJ\',\'b2\',\'cv\',\'a7\',\'42\',\'6l\',\'3q\',\'4b\',\'L\',\'N\',\'88\',\'6J\',\'6X\',\'4D\',\'dN\',\'dO\',\'dT\',\'2I\',\'7W\',\'4j\',\'4x\',\'3U\',\'8e\',\'a9\',\'4s\',\'6k\',\'6M\',\'9i\',\'aX\',\'2N\',\'2Q\',\'cF\',\'cD\',\'1e\'],1T:[],61:0,8g:{x:[\'bM\',\'1b\',\'4X\',\'3m\',\'bC\'],y:[\'5N\',\'Y\',\'9a\',\'4Q\',\'7E\']},7B:{},b2:{},b3:{},8e:{aG:{},29:{},aF:{}},4m:[],6u:[],4n:{},4R:[],7q:[],5a:[],7k:{},8c:{},7l:[],2t:/dP\\/4\\.0/.11(4A.6d)?8:8J((4A.6d.5G().3b(/.+(?:b9|dQ|e9|2h)[\\/: ]([\\d.]+)/)||[0,\'0\'])[1]),2h:(W.6q&&!1S.3z),4M:/ea/.11(4A.6d),6y:/eu.+b9:1\\.[0-8].+es/.11(4A.6d),$:C(1v){q(1v)E W.9Q(1v)},2o:C(2a,3j){2a[2a.V]=3j},1d:C(ba,4l,49,6c,bh){A el=W.1d(ba);q(4l)m.3A(el,4l);q(bh)m.R(el,{94:0,8H:\'1E\',9D:0});q(49)m.R(el,49);q(6c)6c.1X(el);E el},3A:C(el,4l){O(A x 2Y 4l)el[x]=4l[x];E el},R:C(el,49){O(A x 2Y 49){q(m.3R&&x==\'1z\'){q(49[x]>0.99)el.G.ew(\'5Q\');J el.G.5Q=\'bg(1z=\'+(49[x]*2w)+\')\'}J el.G[x]=49[x]}},2z:C(el,1f,3C){A 4T,51,4w;q(1F 3C!=\'7j\'||3C===I){A 2H=c5;3C={4h:2H[2],2Q:2H[3],76:2H[4]}}q(1F 3C.4h!=\'3G\')3C.4h=5Z;3C.2Q=1h[3C.2Q]||1h.bj;3C.7g=m.3A({},1f);O(A 2Z 2Y 1f){A e=1J m.fx(el,3C,2Z);4T=8J(m.8I(el,2Z))||0;51=8J(1f[2Z]);4w=2Z!=\'1z\'?\'F\':\'\';e.3E(4T,51,4w)}},8I:C(el,1f){q(el.G[1f]){E el.G[1f]}J q(W.8L){E W.8L.cK(el,I).co(1f)}J{q(1f==\'1z\')1f=\'5Q\';A 3j=el.5y[1f.2k(/\\-(\\w)/g,C(a,b){E b.bi()})];q(1f==\'5Q\')3j=3j.2k(/bg\\(1z=([0-9]+)\\)/,C(a,b){E b/2w});E 3j===\'\'?1:3j}},7S:C(){A d=W,w=1S,63=d.7a&&d.7a!=\'8v\'?d.5h:d.19,3R=m.2h&&(m.2t<9||1F bf==\'1L\');A L=3R?63.8F:(d.5h.8F||7c.ep),N=3R?63.c4:7c.eo;m.4g={L:L,N:N,5O:3R?63.5O:bf,5R:3R?63.5R:ed};E m.4g},6K:C(el){q(/5v/i.11(el.3J)){A 7N=W.2C(\'1N\');O(A i=0;i<7N.V;i++){A u=7N[i].eb;q(u&&u.2k(/^.*?#/,\'\')==el.23.2Z){el=7N[i];5m}}}A p={x:el.4V,y:el.8O};5g(el.bb){el=el.bb;p.x+=el.4V;p.y+=el.8O;q(el!=W.19&&el!=W.5h){p.x-=el.5O;p.y-=el.5R}}E p},2F:C(a,29,3E,T){q(!a)a=m.1d(\'a\',I,{1o:\'1E\'},m.2b);q(1F a.6a==\'C\')E 29;q(T==\'3D\'){O(A i=0;i8d){8d=1B;7n=i}}}q(7n==-1)m.3d=-1;J 16[7n].3M()},43:C(a,6b){a.6a=a.2p;A p=a.6a?a.6a():I;a.6a=I;E(p&&1F p[6b]!=\'1L\')?p[6b]:(1F m[6b]!=\'1L\'?m[6b]:I)},7s:C(a){A 1e=m.43(a,\'1e\');q(1e)E 1e;E a.21},4J:C(1v){A 1P=m.$(1v),4q=m.8c[1v],a={};q(!1P&&!4q)E I;q(!4q){4q=1P.5J(M);4q.1v=\'\';m.8c[1v]=4q;E 1P}J{E 4q.5J(M)}},3B:C(d){q(d)m.9y.1X(d);m.9y.2d=\'\'},1u:C(B){q(!m.2v){84=M;m.2v=m.1d(\'P\',{1c:\'K-dc K-2x-D\',5r:\'\',2p:C(){q(m.1A(m,\'d3\'))m.26()}},{1n:\'1Y\',1z:0},m.2b,M);q(/(df|d2|cU|cT)/.11(4A.6d)){A 19=W.19;C 81(){m.R(m.2v,{L:19.cR+\'F\',N:19.cV+\'F\'})}81();m.2j(1S,\'3O\',81)}}m.2v.G.1o=\'\';A 84=m.2v.5r==\'\';m.2v.5r+=\'|\'+B.Q;q(84){q(m.6y&&m.aR)m.R(m.2v,{9t:\'7T(\'+m.5c+\'d0.ak)\',1z:1});J m.2z(m.2v,{1z:B.4b},m.87)}},9x:C(Q){q(!m.2v)E;q(1F Q!=\'1L\')m.2v.5r=m.2v.5r.2k(\'|\'+Q,\'\');q((1F Q!=\'1L\'&&m.2v.5r!=\'\')||(m.2q&&m.43(m.2q,\'4b\')))E;q(m.6y&&m.aR)m.2v.G.1o=\'1E\';J m.2z(m.2v,{1z:0},m.87,I,C(){m.2v.G.1o=\'1E\'})},8N:C(7z,B){A 1i=B||m.2G();B=1i;q(m.2q)E 1j;J m.1i=1i;m.4z(W,1S.3z?\'6U\':\'71\',m.68);1t{m.2q=7z;7z.2p()}1y(e){m.1i=m.2q=I}1t{q(!7z||B.3q[1]!=\'4e\')B.26()}1y(e){}E 1j},7O:C(el,2n){A B=m.2G(el);q(B)E m.8N(B.7V(2n),B);J E 1j},3a:C(el){E m.7O(el,-1)},1D:C(el){E m.7O(el,1)},68:C(e){q(!e)e=1S.2u;q(!e.2L)e.2L=e.9k;q(1F e.2L.9j!=\'1L\')E M;q(!m.1A(m,\'dz\',e))E M;A B=m.2G();A 2n=I;b6(e.dy){2c 70:q(B)B.7r();E M;2c 32:2n=2;5m;2c 34:2c 39:2c 40:2n=1;5m;2c 8:2c 33:2c 37:2c 38:2n=-1;5m;2c 27:2c 13:2n=0}q(2n!==I){q(2n!=2)m.4z(W,1S.3z?\'6U\':\'71\',m.68);q(!m.aS)E M;q(e.5n)e.5n();J e.c0=1j;q(B){q(2n==0){B.26()}J q(2n==2){q(B.1p)B.1p.cl()}J{q(B.1p)B.1p.3p();m.7O(B.Q,2n)}E 1j}}E M},du:C(14){m.2o(m.1T,m.3A(14,{22:\'22\'+m.61++}))},dt:C(1r){A 3c=1r.2N;q(1F 3c==\'7j\'){O(A i=0;i<3c.V;i++){A o={};O(A x 2Y 1r)o[x]=1r[x];o.2N=3c[i];m.2o(m.6u,o)}}J{m.2o(m.6u,1r)}},9U:C(7y,7h){A el,2m=/^K-U-([0-9]+)$/;el=7y;5g(el.23){q(el.6R!==1L)E el.6R;q(el.1v&&2m.11(el.1v))E el.1v.2k(2m,"$1");el=el.23}q(!7h){el=7y;5g(el.23){q(el.3J&&m.77(el)){O(A Q=0;Q1)E M;q(!e.2L)e.2L=e.9k;A el=e.2L;5g(el.23&&!(/K-(2R|3u|3D|3O)/.11(el.1c))){el=el.23}A B=m.2G(el);q(B&&(B.62||!B.55))E M;q(B&&e.T==\'8y\'){q(e.2L.9j)E M;A 3b=el.1c.3b(/K-(2R|3u|3O)/);q(3b){m.2y={B:B,T:3b[1],1b:B.x.H,L:B.x.D,Y:B.y.H,N:B.y.D,aV:e.7A,aO:e.7F};m.2j(W,\'7D\',m.6H);q(e.5n)e.5n();q(/K-(2R|3D)-9J/.11(B.S.1c)){B.3M();m.a6=M}E 1j}J q(/K-3D/.11(el.1c)&&m.3d!=B.Q){B.3M();B.59(\'1q\')}}J q(e.T==\'c3\'){m.4z(W,\'7D\',m.6H);q(m.2y){q(m.54&&m.2y.T==\'2R\')m.2y.B.S.G.4L=m.54;A 3I=m.2y.3I;q(!3I&&!m.a6&&!/(3u|3O)/.11(m.2y.T)){q(m.1A(B,\'dr\'))B.26()}J q(3I||(!3I&&m.aU)){m.2y.B.59(\'1q\')}q(m.2y.B.3W)m.2y.B.3W.G.1o=\'1E\';q(3I)m.1A(m.2y.B,\'do\',m.2y);m.a6=1j;m.2y=I}J q(/K-2R-9J/.11(el.1c)){el.G.4L=m.54}}E 1j},6H:C(e){q(!m.2y)E M;q(!e)e=1S.2u;A a=m.2y,B=a.B;q(B.1k){q(!B.3W)B.3W=m.1d(\'P\',I,{1l:\'2l\',L:B.x.D+\'F\',N:B.y.D+\'F\',1b:B.x.cb+\'F\',Y:B.y.cb+\'F\',1B:4,9t:(m.3R?\'eB\':\'1E\'),1z:0.eU},B.U,M);q(B.3W.G.1o==\'1E\')B.3W.G.1o=\'\'}a.dX=e.7A-a.aV;a.dY=e.7F-a.aO;A 9g=1h.fG(1h.aE(a.dX,2)+1h.aE(a.dY,2));q(!a.3I)a.3I=(a.T!=\'2R\'&&9g>0)||(9g>(m.fK||5));q(a.3I&&e.7A>5&&e.7F>5){q(!m.1A(B,\'fN\',a))E 1j;q(a.T==\'3O\')B.3O(a);J{B.9m(a.1b+a.dX,a.Y+a.dY);q(a.T==\'2R\')B.S.G.4L=\'3u\'}}E 1j},aP:C(e){1t{q(!e)e=1S.2u;A 66=/fM/i.11(e.T);q(!e.2L)e.2L=e.9k;q(!e.7P)e.7P=66?e.fE:e.fD;A B=m.2G(e.2L);q(!B.55)E;q(!B||!e.7P||m.2G(e.7P,M)==B||m.2y)E;m.1A(B,66?\'ft\':\'fr\',e);O(A i=0;i=k.1r.4h+k.9c){k.4o=k.51;k.H=k.96=1;k.82();k.1r.7g[k.1f]=M;A 9s=M;O(A i 2Y k.1r.7g)q(k.1r.7g[i]!==M)9s=1j;q(9s){q(k.1r.76)k.1r.76.ax(k.30)}E 1j}J{A n=t-k.9c;k.96=n/k.1r.4h;k.H=k.1r.2Q(n,0,1,k.1r.4h);k.4o=k.4T+((k.51-k.4T)*k.H);k.82()}E M}};m.3A(m.fx,{3P:{1z:C(fx){m.R(fx.30,{1z:fx.4o})},ap:C(fx){1t{q(fx.30.G&&fx.30.G[fx.1f]!=I)fx.30.G[fx.1f]=fx.4o+fx.4w;J fx.30[fx.1f]=fx.4o}1y(e){}}}});m.6r=C(1Z,3F){k.3F=3F;k.1Z=1Z;A v=m.2t,47;k.9G=m.2h&&m.2t<7;q(!1Z){q(3F)3F();E}m.7m();k.2g=m.1d(\'2g\',{eJ:0},{1n:\'1q\',1l:\'2l\',eN:\'eM\',L:0},m.2b,M);A 4G=m.1d(\'4G\',I,I,k.2g,1);k.2J=[];O(A i=0;i<=8;i++){q(i%3==0)47=m.1d(\'47\',I,{N:\'1M\'},4G,M);k.2J[i]=m.1d(\'2J\',I,I,47,M);A G=i!=4?{eL:0,eK:0}:{1l:\'4y\'};m.R(k.2J[i],G)}k.2J[4].1c=1Z+\' K-1g\';k.ai()};m.6r.5w={ai:C(){A 1e=m.5c+(m.f1||"fi/")+k.1Z+".ak";A ar=m.4M&&m.2t<73?m.2b:I;k.3V=m.1d(\'1N\',I,{1l:\'2l\',Y:\'-4v\'},ar,M);A 3v=k;k.3V.4N=C(){3v.az()};k.3V.1e=1e},az:C(){A o=k.1w=k.3V.L/4,H=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],1u={N:(2*o)+\'F\',L:(2*o)+\'F\'};O(A i=0;i<=8;i++){q(H[i]){q(k.9G){A w=(i==1||i==7)?\'2w%\':k.3V.L+\'F\';A P=m.1d(\'P\',I,{L:\'2w%\',N:\'2w%\',1l:\'4y\',2e:\'1q\'},k.2J[i],M);m.1d(\'P\',I,{5Q:"fo:fn.bv.fm(fl=fe, 1e=\'"+k.3V.1e+"\')",1l:\'2l\',L:w,N:k.3V.N+\'F\',1b:(H[i][0]*o)+\'F\',Y:(H[i][1]*o)+\'F\'},P,M)}J{m.R(k.2J[i],{9t:\'7T(\'+k.3V.1e+\') \'+(H[i][0]*o)+\'F \'+(H[i][1]*o)+\'F\'})}q(1S.3z&&(i==3||i==5))m.1d(\'P\',I,1u,k.2J[i],M);m.R(k.2J[i],1u)}}k.3V=I;q(m.4n[k.1Z])m.4n[k.1Z].5U();m.4n[k.1Z]=k;q(k.3F)k.3F()},4C:C(H,1w,aB,4i,2Q){A B=k.B,5X=B.U.G,1w=1w||0,H=H||{x:B.x.H+1w,y:B.y.H+1w,w:B.x.Z(\'2f\')-2*1w,h:B.y.Z(\'2f\')-2*1w};q(aB)k.2g.G.1n=(H.h>=4*k.1w)?\'1Y\':\'1q\';m.R(k.2g,{1b:(H.x-k.1w)+\'F\',Y:(H.y-k.1w)+\'F\',L:(H.w+2*k.1w)+\'F\'});H.w-=2*k.1w;H.h-=2*k.1w;m.R(k.2J[4],{L:H.w>=0?H.w+\'F\':0,N:H.h>=0?H.h+\'F\':0});q(k.9G)k.2J[3].G.N=k.2J[5].G.N=k.2J[4].G.N},5U:C(bk){q(bk)k.2g.G.1n=\'1q\';J m.3B(k.2g)}};m.6A=C(B,1u){k.B=B;k.1u=1u;k.3l=1u==\'x\'?\'bY\':\'bW\';k.3k=k.3l.5G();k.6m=1u==\'x\'?\'cj\':\'c8\';k.6Y=k.6m.5G();k.9L=1u==\'x\'?\'c7\':\'bX\';k.b5=k.9L.5G();k.1G=k.36=0};m.6A.5w={Z:C(Q){b6(Q){2c\'9T\':E k.1K+k.3s+(k.t-m.2r[\'1w\'+k.3l])/2;2c\'9v\':E k.H+k.cb+k.1G+(k.D-m.2r[\'1w\'+k.3l])/2;2c\'2f\':E k.D+2*k.cb+k.1G+k.36;2c\'5e\':E k.4K-k.3o-k.4S;2c\'8D\':E k.Z(\'5e\')-2*k.cb-k.1G-k.36;2c\'6e\':E k.H-(k.B.1g?k.B.1g.1w:0);2c\'9R\':E k.Z(\'2f\')+(k.B.1g?2*k.B.1g.1w:0);2c\'2K\':E k.1V?1h.3e((k.D-k.1V)/2):0}},8a:C(){k.cb=(k.B.S[\'1w\'+k.3l]-k.t)/2;k.4S=m[\'9D\'+k.9L]},9M:C(){k.t=k.B.el[k.3k]?3H(k.B.el[k.3k]):k.B.el[\'1w\'+k.3l];k.1K=k.B.1K[k.1u];k.3s=(k.B.el[\'1w\'+k.3l]-k.t)/2;q(k.1K==0||k.1K==-1){k.1K=(m.4g[k.3k]/2)+m.4g[\'28\'+k.6m]}},8h:C(){A B=k.B;k.2T=\'1M\';q(B.9n==\'4X\')k.2T=\'4X\';J q(1J 4Y(k.6Y).11(B.46))k.2T=I;J q(1J 4Y(k.b5).11(B.46))k.2T=\'4t\';k.H=k.1K-k.cb+k.3s;q(k.9i&&k.1u==\'x\')B.6M=1h.31(B.6M||k.1a,B.9i*k.1a/B.y.1a);k.D=1h.31(k.1a,B[\'4t\'+k.3l]||k.1a);k.2U=B.5Y?1h.31(B[\'31\'+k.3l],k.1a):k.1a;q(B.2E&&B.3t){k.D=B[k.3k];k.1V=k.1a}q(k.1u==\'x\'&&m.5S)k.2U=B.4s;k.2L=B[\'2L\'+k.1u.bi()];k.3o=m[\'9D\'+k.6m];k.28=m.4g[\'28\'+k.6m];k.4K=m.4g[k.3k]},72:C(i){A B=k.B;q(B.2E&&(B.3t||m.5S)){k.1V=i;k.D=1h.4t(k.D,k.1V);B.S.G[k.6Y]=k.Z(\'2K\')+\'F\'}J k.D=i;B.S.G[k.3k]=i+\'F\';B.U.G[k.3k]=k.Z(\'2f\')+\'F\';q(B.1g)B.1g.4C();q(B.3W)B.3W.G[k.3k]=i+\'F\';q(k.1u==\'y\'&&B.5C&&B.19.G.N!=\'1M\')1t{B.5C.19.G.2e=\'1M\'}1y(e){}q(B.2A){A d=B.2s;q(k.9e===1L)k.9e=B.1s[\'1w\'+k.3l]-d[\'1w\'+k.3l];d.G[k.3k]=(k.D-k.9e)+\'F\';q(k.1u==\'x\')B.4c.G.L=\'1M\';q(B.19)B.19.G[k.3k]=\'1M\'}q(k.1u==\'x\'&&B.1x)B.57(M);q(k.1u==\'x\'&&B.1p&&B.2E){q(i==k.1a)B.1p.5d(\'1a-2F\');J B.1p.4u(\'1a-2F\')}},aa:C(i){k.H=i;k.B.U.G[k.6Y]=i+\'F\';q(k.B.1g)k.B.1g.4C()}};m.5A=C(a,29,3E,35){q(W.bS&&m.2h&&!m.9F){m.2j(W,\'41\',C(){1J m.5A(a,29,3E,35)});E}k.a=a;k.3E=3E;k.35=35||\'2R\';k.2A=(35==\'3D\');k.2E=!k.2A;m.a1=1j;k.1T=[];k.1i=m.1i;m.1i=I;m.7m();A Q=k.Q=m.16.V;O(A i=0;ip.28+p.4K-p.4S)p.H=p.28+p.4K-p.D-p.3o-p.4S-p.1G-p.36;q(p.H(k.x.1V||k.x.D)){k.bs();q(k.1T.V==1)k.57()}}k.a5()}1y(e){k.9o(e)}},91:C(6c,1M){A c=m.4p(6c,\'7J\',\'K-19\');q(/(1k|3x)/.11(k.2I)){q(k.4j)c.G.L=k.4j+\'F\';q(k.4x)c.G.N=k.4x+\'F\'}},6T:C(){q(k.aD)E;A B=k;k.19=m.4p(k.1s,\'7J\',\'K-19\');q(k.2I==\'1k\'){k.6n();A 5o=m.3w.5J(1);k.19.1X(5o);k.eP=k.1s.1O;q(!k.4j)k.4j=5o.1O;A 5b=k.1s.1U-k.19.1U,h=k.4x||m.4g.N-5b-m.4d-m.6L,4N=k.3U==\'60\'?\' 4N="q (m.16[\'+k.Q+\']) m.16[\'+k.Q+\'].69()" \':\'\';k.19.2d+=\'<1k 2Z="m\'+(1J 7K()).79()+\'" eQ="0" Q="\'+k.Q+\'" \'+\' G="L:\'+k.4j+\'F; N:\'+h+\'F" \'+4N+\' 1e="\'+k.1e+\'" >\';k.5o=k.19.2C(\'P\')[0];k.1k=k.19.2C(\'1k\')[0];q(k.3U==\'6x\')k.8A()}q(k.2I==\'3x\'){k.19.1v=k.19.1v||\'m-fY-1v-\'+k.Q;A a=k.8e;q(!a.29)a.29={};q(1F a.29.aN==\'1L\')a.29.aN=\'fR\';q(9p)9p.fT(k.1e,k.19.1v,k.4j,k.4x,a.g1||\'7\',a.gb,a.aG,a.29,a.aF)}k.aD=M},7Z:C(){q(k.1k&&!k.4x){k.1k.G.N=k.19.G.N=k.8p()+\'F\'}k.1s.1X(m.3w);q(!k.x.1a)k.x.1a=k.1s.1O;k.y.1a=k.1s.1U;k.1s.9q(m.3w);q(m.2h&&k.aL>3H(k.1s.5y.N)){k.aL=3H(k.1s.5y.N)}m.R(k.U,{1l:\'2l\',94:\'0\'});m.R(k.S,{L:k.x.t+\'F\',N:k.y.t+\'F\'})},8p:C(){A h;1t{A 2B=k.5C=k.1k.9O||k.1k.6g.W;A 3w=2B.1d(\'P\');3w.G.aJ=\'bc\';2B.19.1X(3w);h=3w.8O;q(m.2h)h+=3H(2B.19.5y.4d)+3H(2B.19.5y.6L)-1}1y(e){h=de}E h},8A:C(){A 5i=k.1s.1O-k.5o.1O;m.3B(k.5o);q(5i<0)5i=0;A 5b=k.1s.1U-k.1k.1U;q(k.5C&&!k.4x&&!k.N&&k.y.D==k.y.1a)1t{k.5C.19.G.2e=\'1q\'}1y(e){}m.R(k.1k,{L:1h.9Y(k.x.D-5i)+\'F\',N:1h.9Y(k.y.D-5b)+\'F\'});m.R(k.19,{L:k.1k.G.L,N:k.1k.G.N});k.52=k.1k;k.2s=k.52},b4:C(){k.91(k.1s);q(k.2I==\'3x\'&&k.3U==\'60\')k.6T();q(k.x.D1P.1U){1P.G.L=(3H(1P.G.L)+6E)+\'F\'}k.52=1P;k.2s=k.52}q(k.1k&&k.3U==\'60\')k.8A();q(!k.52&&k.y.Dk.2s.23.1U){4a("1t { m.16["+k.Q+"].2s.G.2e = \'1M\'; } 1y(e) {}",m.6W)}},b8:C(5v){A c=5v.fC.7G(\',\');O(A i=0;ip.28+p.4K-p.4S){q(!5u&&8C&&5s){p.D=1h.31(p.D,p.Z(1u==\'y\'?\'5e\':\'8D\'))}J q(p.Z(\'2f\')2M){ 3f=3y*2M;q(3fk.6k&&x.D>k.4s&&y.Z(\'2f\')>y.Z(\'5e\')){y.D-=10;q(2M)x.D=y.D*2M;k.57(0,1);3T=M}}E 3T},dS:C(){q(k.2s){A h=/1k/i.11(k.2s.3J)?(k.8p()+1)+\'F\':\'1M\';q(k.19)k.19.G.N=h;k.2s.G.N=h;k.y.72(k.1s.1U)}},a5:C(){A x=k.x,y=k.y;k.59(\'1q\');m.1A(k,\'et\');q(k.1p&&k.1p.2D)k.1p.2D.5t();k.9b(1,{U:{L:x.Z(\'2f\'),N:y.Z(\'2f\'),1b:x.H,Y:y.H},S:{1b:x.1G+x.Z(\'2K\'),Y:y.1G+y.Z(\'2K\'),L:x.1V||x.D,N:y.1V||y.D}},m.6W)},9b:C(1I,2i,4i){A 5M=k.3q,8o=1I?(k.1i?k.1i.a:I):m.2q,t=(5M[1]&&8o&&m.43(8o,\'3q\')[1]==5M[1])?5M[1]:5M[0];q(k[t]&&t!=\'2F\'){k[t](1I,2i);E}q(k.1g&&!k.3Y){q(1I)k.1g.4C();J k.1g.5U((k.2A&&k.4D))}q(!1I)k.78();A B=k,x=B.x,y=B.y,2Q=k.2Q;q(!1I)2Q=k.cF||2Q;A 6x=1I?C(){q(B.1g)B.1g.2g.G.1n="1Y";4a(C(){B.6I()},50)}:C(){B.5D()};q(1I)m.R(k.U,{L:x.t+\'F\',N:y.t+\'F\'});q(1I&&k.2A){m.R(k.U,{1b:(x.1K-x.cb+x.3s)+\'F\',Y:(y.1K-y.cb+y.3s)+\'F\'})}q(k.cD){m.R(k.U,{1z:1I?0:1});m.3A(2i.U,{1z:1I})}m.2z(k.U,2i.U,{4h:4i,2Q:2Q,3P:C(3j,2H){q(B.1g&&B.3Y&&2H.1f==\'Y\'){A 5W=1I?2H.H:1-2H.H;A H={w:x.t+(x.Z(\'2f\')-x.t)*5W,h:y.t+(y.Z(\'2f\')-y.t)*5W,x:x.1K+(x.H-x.1K)*5W,y:y.1K+(y.H-y.1K)*5W};B.1g.4C(H,0,1)}q(B.2A){q(2H.1f==\'1b\')B.4c.G.1b=(x.H-3j)+\'F\';q(2H.1f==\'Y\')B.4c.G.Y=(y.H-3j)+\'F\'}}});m.2z(k.S,2i.S,4i,2Q,6x);q(1I){k.U.G.1n=\'1Y\';k.S.G.1n=\'1Y\';q(k.2A)k.1s.G.1n=\'1Y\';k.a.1c+=\' K-4I-46\'}},6w:C(1I,2i){k.3Y=1j;A B=k,t=1I?m.6W:0;q(1I){m.2z(k.U,2i.U,0);m.R(k.U,{1z:0,1n:\'1Y\'});m.2z(k.S,2i.S,0);k.S.G.1n=\'1Y\';m.2z(k.U,{1z:1},t,I,C(){B.6I()})}q(k.1g){k.1g.2g.G.1B=k.U.G.1B;A 6Z=1I||-1,1w=k.1g.1w,8r=1I?3:1w,8q=1I?1w:3;O(A i=8r;6Z*i<=6Z*8q;i+=6Z,t+=25){(C(){A o=1I?8q-i:8r-i;4a(C(){B.1g.4C(0,o,1)},t)})()}}q(1I){}J{4a(C(){q(B.1g)B.1g.5U(B.4D);B.78();m.2z(B.U,{1z:0},m.9A,I,C(){B.5D()})},t)}},4e:C(1I,2i,8u){q(!1I)E;A B=k,1i=k.1i,x=k.x,y=k.y,3n=1i.x,3g=1i.y,U=k.U,S=k.S,1x=k.1x;m.4z(W,\'7D\',m.6H);m.R(S,{L:(x.1V||x.D)+\'F\',N:(y.1V||y.D)+\'F\'});q(1x)1x.G.2e=\'1Y\';k.1g=1i.1g;q(k.1g)k.1g.B=B;1i.1g=I;A 5l=m.1d(\'P\',{1c:\'K-\'+k.35},{1l:\'2l\',1B:4,2e:\'1q\',1o:\'1E\'});A 8t={cN:1i,cM:k};O(A n 2Y 8t){k[n]=8t[n].S.5J(1);m.R(k[n],{1l:\'2l\',8H:0,1n:\'1Y\'});5l.1X(k[n])}U.1X(5l);q(k.2A)m.R(k.4c,{1b:0,Y:0});q(1x){1x.1c=\'\';U.1X(1x)}5l.G.1o=\'\';1i.S.G.1o=\'1E\';q(m.4M&&m.2t<73){k.U.G.1n=\'1Y\'}m.2z(U,{L:x.D},{4h:m.cE,3P:C(3j,2H){A H=2H.H,4B=1-H;A 1f,D={},93=[\'H\',\'D\',\'1G\',\'36\'];O(A n 2Y 93){1f=93[n];D[\'x\'+1f]=1h.3e(4B*3n[1f]+H*x[1f]);D[\'y\'+1f]=1h.3e(4B*3g[1f]+H*y[1f]);D.cI=1h.3e(4B*(3n.1V||3n.D)+H*(x.1V||x.D));D.6S=1h.3e(4B*3n.Z(\'2K\')+H*x.Z(\'2K\'));D.cJ=1h.3e(4B*(3g.1V||3g.D)+H*(y.1V||y.D));D.6V=1h.3e(4B*3g.Z(\'2K\')+H*y.Z(\'2K\'))}q(B.1g)B.1g.4C({x:D.3h,y:D.3r,w:D.5L+D.44+D.8U+2*x.cb,h:D.5K+D.45+D.8T+2*y.cb});1i.U.G.d7=\'d6(\'+(D.3r-3g.H)+\'F, \'+(D.5L+D.44+D.8U+D.3h+2*3n.cb-3n.H)+\'F, \'+(D.5K+D.45+D.8T+D.3r+2*3g.cb-3g.H)+\'F, \'+(D.3h-3n.H)+\'F)\';m.R(S,{Y:(D.45+y.Z(\'2K\'))+\'F\',1b:(D.44+x.Z(\'2K\'))+\'F\',4d:(y.H-D.3r)+\'F\',4W:(x.H-D.3h)+\'F\'});m.R(U,{Y:D.3r+\'F\',1b:D.3h+\'F\',L:(D.44+D.8U+D.5L+2*x.cb)+\'F\',N:(D.45+D.8T+D.5K+2*y.cb)+\'F\'});m.R(5l,{L:(D.cI||D.5L)+\'F\',N:(D.cJ||D.5K)+\'F\',1b:(D.44+D.6S)+\'F\',Y:(D.45+D.6V)+\'F\',1n:\'1Y\'});m.R(B.cN,{Y:(3g.H-D.3r+3g.1G-D.45+3g.Z(\'2K\')-D.6V)+\'F\',1b:(3n.H-D.3h+3n.1G-D.44+3n.Z(\'2K\')-D.6S)+\'F\'});m.R(B.cM,{1z:H,Y:(y.H-D.3r+y.1G-D.45+y.Z(\'2K\')-D.6V)+\'F\',1b:(x.H-D.3h+x.1G-D.44+x.Z(\'2K\')-D.6S)+\'F\'});q(1x)m.R(1x,{L:D.5L+\'F\',N:D.5K+\'F\',1b:(D.44+x.cb)+\'F\',Y:(D.45+y.cb)+\'F\'})},76:C(){U.G.1n=S.G.1n=\'1Y\';S.G.1o=\'3X\';m.3B(5l);B.6I();1i.5D();B.1i=I}})},bQ:C(o,el){q(!k.1i)E 1j;O(A i=0;i\'+s+\'

    \'+k[k.6l].2d}}},a0:C(){q(!k.1i){O(A i=0;ik.x.Z(\'6e\')+k.x.Z(\'9R\'));A bG=(3N.y+3N.hk.y.Z(\'6e\')+k.y.Z(\'9R\'))}A 6F=m.9U(1m[i]);q(!bl&&!bG&&6F!=k.Q){q(!2S){1m[i].5F(\'1q-by\',\'[\'+k.Q+\']\');1m[i].9N=1m[i].G[1f];1m[i].G[1f]=\'1q\'}J q(2S.bF(\'[\'+k.Q+\']\')==-1){1m[i].5F(\'1q-by\',2S+\'[\'+k.Q+\']\')}}J q((2S==\'[\'+k.Q+\']\'||m.3d==6F)&&6F!=k.Q){1m[i].5F(\'1q-by\',\'\');1m[i].G[1f]=1m[i].9N||\'\'}J q(2S&&2S.bF(\'[\'+k.Q+\']\')>-1){1m[i].5F(\'1q-by\',2S.2k(\'[\'+k.Q+\']\',\'\'))}}}}},3M:C(){k.U.G.1B=m.4F+=2;O(A i=0;i14.23.1O)14.G.L=\'2w%\'}J q(14.23!=k.1x)k.1x.1X(14);q(/1b$/.11(p))14.G.1b=74+\'F\';q(/4X$/.11(p))m.R(14,{1b:\'50%\',4W:(74-1h.3e(14.1O/2))+\'F\'});q(/3m$/.11(p))14.G.3m=-74+\'F\';q(/^bM$/.11(p)){m.R(14,{3m:\'2w%\',9B:k.x.cb+\'F\',Y:-k.y.cb+\'F\',4Q:-k.y.cb+\'F\',2e:\'1M\'});k.x.1G=14.1O}J q(/^bC$/.11(p)){m.R(14,{1b:\'2w%\',4W:k.x.cb+\'F\',Y:-k.y.cb+\'F\',4Q:-k.y.cb+\'F\',2e:\'1M\'});k.x.36=14.1O}A 9d=14.23.1U;14.G.N=\'1M\';q(53&&14.1U>9d)14.G.N=m.3Z?9d+\'F\':\'2w%\';q(/^Y/.11(p))14.G.Y=6O+\'F\';q(/^9a/.11(p))m.R(14,{Y:\'50%\',4d:(6O-1h.3e(14.1U/2))+\'F\'});q(/^4Q/.11(p))14.G.4Q=-6O+\'F\';q(/^5N$/.11(p)){m.R(14,{1b:(-k.x.1G-k.x.cb)+\'F\',3m:(-k.x.36-k.x.cb)+\'F\',4Q:\'2w%\',6L:k.y.cb+\'F\',L:\'1M\'});k.y.1G=14.1U}J q(/^7E$/.11(p)){m.R(14,{1l:\'4y\',1b:(-k.x.1G-k.x.cb)+\'F\',3m:(-k.x.36-k.x.cb)+\'F\',Y:\'2w%\',4d:k.y.cb+\'F\',L:\'1M\'});k.y.36=14.1U;14.G.1l=\'2l\'}},bB:C(){k.a2([\'58\',\'9X\'],M);k.bq();q(k.9X)m.1A(k,\'eE\');q(k.58)m.1A(k,\'eF\');q(k.58&&k.a7)k.58.1c+=\' K-3u\';q(m.br)k.bp();O(A i=0;i=5.5){s=s.2k(1J 4Y(\']*>\',\'c9\'),\'\').2k(1J 4Y(\']*>.*?\',\'c9\'),\'\');q(k.1k){A 2B=k.1k.9O;q(!2B&&k.1k.6g)2B=k.1k.6g.W;q(!2B){A 3v=k;4a(C(){3v.6f()},25);E}2B.ca();2B.dg(s);2B.26();1t{s=2B.9Q(k.1v).2d}1y(e){1t{s=k.1k.W.9Q(k.1v).2d}1y(e){}}m.3B(k.1k)}J{7H=/(<19[^>]*>|<\\/19>)/db;q(7H.11(s))s=s.7G(7H)[m.3R?1:2]}}m.4p(k.S,\'7J\',\'K-19\').2d=s;k.3F();O(A x 2Y k)k[x]=I}};m.83=C(4k,1r){q(m.cX!==1j)m.95();k.4k=4k;O(A x 2Y 1r)k[x]=1r[x];q(k.cZ)k.cg();q(k.2D)k.2D=m.ci(k)};m.83.5w={cg:C(){k.2X=m.1d(\'P\',{2d:m.8b(m.8i.2X)},I,m.2b);A 6j=[\'3L\',\'3p\',\'3a\',\'1D\',\'3u\',\'1a-2F\',\'26\'];k.1Q={};A 3v=k;O(A i=0;i<6j.V;i++){k.1Q[6j[i]]=m.4p(k.2X,\'1H\',\'K-\'+6j[i]);k.4u(6j[i])}k.1Q.3p.G.1o=\'1E\'},ch:C(){q(k.cm||!k.2X)E;A B=m.16[k.4k],5q=B.7v(),2m=/7w$/;q(5q==0)k.5d(\'3a\');J q(2m.11(k.1Q.3a.2C(\'a\')[0].1c))k.4u(\'3a\');q(5q+1==m.4U.3i[B.2N||\'1E\'].V){k.5d(\'1D\');k.5d(\'3L\')}J q(2m.11(k.1Q.1D.2C(\'a\')[0].1c)){k.4u(\'1D\');k.4u(\'3L\')}},4u:C(1Q){q(!k.1Q)E;A cn=k,a=k.1Q[1Q].2C(\'a\')[0],2m=/7w$/;a.2p=C(){cn[1Q]();E 1j};q(2m.11(a.1c))a.1c=a.1c.2k(2m,\'\')},5d:C(1Q){q(!k.1Q)E;A a=k.1Q[1Q].2C(\'a\')[0];a.2p=C(){E 1j};q(!/7w$/.11(a.1c))a.1c+=\' 7w\'},cl:C(){q(k.42)k.3p();J k.3L()},3L:C(ck){q(k.1Q){k.1Q.3L.G.1o=\'1E\';k.1Q.3p.G.1o=\'\'}k.42=M;q(!ck)m.1D(k.4k)},3p:C(){q(k.1Q){k.1Q.3p.G.1o=\'1E\';k.1Q.3L.G.1o=\'\'}d9(k.42);k.42=I},3a:C(){k.3p();m.3a(k.1Q.3a)},1D:C(){k.3p();m.1D(k.1Q.1D)},3u:C(){},\'1a-2F\':C(){m.2G().7r()},26:C(){m.26(k.1Q.26)}};m.ci=C(1p){C 7p(B){m.3A(1r||{},{4P:4E,22:\'2D\',1c:\'K-2D-\'+5k+\'-14 \'+(1r.1c||\'\')});q(m.3Z)1r.6w=0;B.4O(1r);m.R(4E.23,{2e:\'1q\'})};C 28(3K){5t(1L,1h.3e(3K*4E[3S?\'1O\':\'1U\']*0.7))};C 5t(i,80){q(i===1L)O(A j=0;j<5I.V;j++){q(5I[j]==m.16[1p.4k].a){i=j;5m}}q(i===1L)E;A as=4E.2C(\'a\'),4I=as[i],48=4I.23,1b=3S?\'cj\':\'c8\',3m=3S?\'c7\':\'bX\',L=3S?\'bY\':\'bW\',4V=\'1w\'+1b,1O=\'1w\'+L,7e=P.23.23[1O],5j=7e-2g[1O],6o=3H(2g.G[3S?\'1b\':\'Y\'])||0,2O=6o,ej=20;q(80!==1L){2O=6o-80;q(5j>0)5j=0;q(2O>0)2O=0;q(2O<5j)2O=5j}J{O(A j=0;j0?as[i-1].23[4V]:48[4V],7Y=48[4V]+48[1O]+(as[i+1]?as[i+1].23[1O]:0);q(7Y>7e-6o)2O=7e-7Y;J q(7X<-6o)2O=-7X}A 8R=48[4V]+(48[1O]-7f[1O])/2+2O;m.2z(2g,3S?{1b:2O}:{Y:2O},I,\'8S\');m.2z(7f,3S?{1b:8R}:{Y:8R},I,\'8S\');8l.G.1o=2O<0?\'3X\':\'1E\';8M.G.1o=(2O>5j)?\'3X\':\'1E\'};A 5I=m.4U.3i[m.16[1p.4k].2N||\'1E\'],1r=1p.2D,5k=1r.5k||\'bV\',8K=(5k==\'en\'),4f=8K?[\'P\',\'6t\',\'1H\',\'1C\']:[\'2g\',\'4G\',\'47\',\'2J\'],3S=(5k==\'bV\'),4E=m.1d(\'P\',{1c:\'K-2D K-2D-\'+5k,2d:\'

    \'+\'<\'+4f[0]+\'><\'+4f[1]+\'>

    \'+\'

    \'+\'

    \'+\'

    \'},{1o:\'1E\'},m.2b),5E=4E.7L,P=5E[0],8l=5E[1],8M=5E[2],7f=5E[3],2g=P.ef,4G=4E.2C(4f[1])[0],47;O(A i=0;i<5I.V;i++){q(i==0||!3S)47=m.1d(4f[2],I,I,4G);(C(){A a=5I[i],48=m.1d(4f[3],I,I,47),ex=i;m.1d(\'a\',{21:a.21,24:a.24,2p:C(){q(/K-4I-46/.11(k.1c))E 1j;m.2G(k).3M();E m.8N(a)},2d:m.bT?m.bT(a):a.2d},I,48)})()}q(!8K){8l.2p=C(){28(-1)};8M.2p=C(){28(1)};m.2j(4G,W.eA!==1L?\'er\':\'eq\',C(e){A 3K=0;e=e||1S.2u;q(e.bU){3K=e.bU/dR;q(m.3z)3K=-3K}J q(e.bZ){3K=-e.bZ/3}q(3K)28(-3K*0.2);q(e.5n)e.5n();e.c0=1j})}E{7p:7p,5t:5t}};m.7o=m.18;A e8=m.5A;q(m.2h&&1S==1S.Y){(C(){1t{W.5h.e4(\'1b\')}1y(e){4a(c5.dZ,50);E}m.41()})()}m.2j(W,\'dW\',m.41);m.2j(1S,\'8B\',m.41);m.2j(W,\'41\',C(){q(m.7R||m.4b){A G=m.1d(\'G\',{T:\'e0/8I\'},I,W.2C(\'e1\')[0]),8E=W.7a==\'8v\';C 5P(8m,8n){q(m.2h&&(m.2t<9||8E)){A 1i=W.c6[W.c6.V-1];q(1F(1i.5P)=="7j")1i.5P(8m,8n)}J{G.1X(W.e6(8m+" {"+8n+"}"))}}C 5T(1f){E\'e5( ( ( ez = W.5h.\'+1f+\' ? W.5h.\'+1f+\' : W.19.\'+1f+\' ) ) + \\\'F\\\' );\'}q(m.7R)5P(\'.K 1N\',\'4L: 7T(\'+m.5c+m.7R+\'), 7Q !dA;\');5P(\'.K-2x-D\',m.2h&&(m.2t<7||8E)?\'1l: 2l; \'+\'1b:\'+5T(\'5O\')+\'Y:\'+5T(\'5R\')+\'L:\'+5T(\'8F\')+\'N:\'+5T(\'c4\'):\'1l: fV; L: 2w%; N: 2w%; 1b: 0; Y: 0\')}});m.2j(1S,\'3O\',C(){m.7S();q(m.2x)O(A i=0;iHighslide JS
    ', - creditsTitle : 'Go to the Highslide JS homepage', - previousText : 'Previous', - nextText : 'Next', - moveText : 'Move', - closeText : 'Close', - closeTitle : 'Close (esc)', - resizeTitle : 'Resize', - playText : 'Play', - playTitle : 'Play slideshow (spacebar)', - pauseText : 'Pause', - pauseTitle : 'Pause slideshow (spacebar)', - previousTitle : 'Previous (arrow left)', - nextTitle : 'Next (arrow right)', - moveTitle : 'Move', - fullExpandText : '1:1', - number: 'Image %1 of %2', - restoreTitle : 'Click to close image, click and drag to move. Use arrow keys for next and previous.' -}, -// See http://highslide.com/ref for examples of settings -graphicsDir : 'highslide/graphics/', -expandCursor : 'zoomin.cur', // null disables -restoreCursor : 'zoomout.cur', // null disables -expandDuration : 250, // milliseconds -restoreDuration : 250, -marginLeft : 15, -marginRight : 15, -marginTop : 15, -marginBottom : 15, -zIndexCounter : 1001, // adjust to other absolutely positioned elements -loadingOpacity : 0.75, -allowMultipleInstances: true, -numberOfImagesToPreload : 5, -outlineWhileAnimating : 2, // 0 = never, 1 = always, 2 = HTML only -outlineStartOffset : 3, // ends at 10 -padToMinWidth : false, // pad the popup width to make room for wide caption -fullExpandPosition : 'bottom right', -fullExpandOpacity : 1, -showCredits : true, // you can set this to false if you want -creditsHref : 'http://highslide.com/', -creditsTarget : '_self', -enableKeyListener : true, -openerTagNames : ['a'], // Add more to allow slideshow indexing -transitions : [], -transitionDuration: 250, -dimmingOpacity: 0, // Lightbox style dimming background -dimmingDuration: 50, // 0 for instant dimming - -anchor : 'auto', // where the image expands from -align : 'auto', // position in the client (overrides anchor) -targetX: null, // the id of a target element -targetY: null, -dragByHeading: true, -minWidth: 200, -minHeight: 200, -allowSizeReduction: true, // allow the image to reduce to fit client size. If false, this overrides minWidth and minHeight -outlineType : 'drop-shadow', // set null to disable outlines -skin : { - controls: - '
    ' -}, -// END OF YOUR SETTINGS - - -// declare internal properties -preloadTheseImages : [], -continuePreloading: true, -expanders : [], -overrides : [ - 'allowSizeReduction', - 'useBox', - 'anchor', - 'align', - 'targetX', - 'targetY', - 'outlineType', - 'outlineWhileAnimating', - 'captionId', - 'captionText', - 'captionEval', - 'captionOverlay', - 'headingId', - 'headingText', - 'headingEval', - 'headingOverlay', - 'creditsPosition', - 'dragByHeading', - 'autoplay', - 'numberPosition', - 'transitions', - 'dimmingOpacity', - - 'width', - 'height', - - 'wrapperClassName', - 'minWidth', - 'minHeight', - 'maxWidth', - 'maxHeight', - 'pageOrigin', - 'slideshowGroup', - 'easing', - 'easingClose', - 'fadeInOut', - 'src' -], -overlays : [], -idCounter : 0, -oPos : { - x: ['leftpanel', 'left', 'center', 'right', 'rightpanel'], - y: ['above', 'top', 'middle', 'bottom', 'below'] -}, -mouse: {}, -headingOverlay: {}, -captionOverlay: {}, -timers : [], - -slideshows : [], - -pendingOutlines : {}, -clones : {}, -onReady: [], -uaVersion: /Trident\/4\.0/.test(navigator.userAgent) ? 8 : - parseFloat((navigator.userAgent.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1]), -ie : (document.all && !window.opera), -//ie : navigator && /MSIE [678]/.test(navigator.userAgent), // ie9 compliant? -safari : /Safari/.test(navigator.userAgent), -geckoMac : /Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent), - -$ : function (id) { - if (id) return document.getElementById(id); -}, - -push : function (arr, val) { - arr[arr.length] = val; -}, - -createElement : function (tag, attribs, styles, parent, nopad) { - var el = document.createElement(tag); - if (attribs) hs.extend(el, attribs); - if (nopad) hs.setStyles(el, {padding: 0, border: 'none', margin: 0}); - if (styles) hs.setStyles(el, styles); - if (parent) parent.appendChild(el); - return el; -}, - -extend : function (el, attribs) { - for (var x in attribs) el[x] = attribs[x]; - return el; -}, - -setStyles : function (el, styles) { - for (var x in styles) { - if (hs.ieLt9 && x == 'opacity') { - if (styles[x] > 0.99) el.style.removeAttribute('filter'); - else el.style.filter = 'alpha(opacity='+ (styles[x] * 100) +')'; - } - else el.style[x] = styles[x]; - } -}, -animate: function(el, prop, opt) { - var start, - end, - unit; - if (typeof opt != 'object' || opt === null) { - var args = arguments; - opt = { - duration: args[2], - easing: args[3], - complete: args[4] - }; - } - if (typeof opt.duration != 'number') opt.duration = 250; - opt.easing = Math[opt.easing] || Math.easeInQuad; - opt.curAnim = hs.extend({}, prop); - for (var name in prop) { - var e = new hs.fx(el, opt , name ); - - start = parseFloat(hs.css(el, name)) || 0; - end = parseFloat(prop[name]); - unit = name != 'opacity' ? 'px' : ''; - - e.custom( start, end, unit ); - } -}, -css: function(el, prop) { - if (el.style[prop]) { - return el.style[prop]; - } else if (document.defaultView) { - return document.defaultView.getComputedStyle(el, null).getPropertyValue(prop); - - } else { - if (prop == 'opacity') prop = 'filter'; - var val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b){ return b.toUpperCase(); })]; - if (prop == 'filter') - val = val.replace(/alpha\(opacity=([0-9]+)\)/, - function (a, b) { return b / 100 }); - return val === '' ? 1 : val; - } -}, - -getPageSize : function () { - var d = document, w = window, iebody = d.compatMode && d.compatMode != 'BackCompat' - ? d.documentElement : d.body, - ieLt9 = hs.ie && (hs.uaVersion < 9 || typeof pageXOffset == 'undefined'); - - var width = ieLt9 ? iebody.clientWidth : - (d.documentElement.clientWidth || self.innerWidth), - height = ieLt9 ? iebody.clientHeight : self.innerHeight; - hs.page = { - width: width, - height: height, - scrollLeft: ieLt9 ? iebody.scrollLeft : pageXOffset, - scrollTop: ieLt9 ? iebody.scrollTop : pageYOffset - }; - return hs.page; -}, - -getPosition : function(el) { - var p = { x: el.offsetLeft, y: el.offsetTop }; - while (el.offsetParent) { - el = el.offsetParent; - p.x += el.offsetLeft; - p.y += el.offsetTop; - if (el != document.body && el != document.documentElement) { - p.x -= el.scrollLeft; - p.y -= el.scrollTop; - } - } - return p; -}, - -expand : function(a, params, custom, type) { - if (!a) a = hs.createElement('a', null, { display: 'none' }, hs.container); - if (typeof a.getParams == 'function') return params; - try { - new hs.Expander(a, params, custom); - return false; - } catch (e) { return true; } -}, -getElementByClass : function (el, tagName, className) { - var els = el.getElementsByTagName(tagName); - for (var i = 0; i < els.length; i++) { - if ((new RegExp(className)).test(els[i].className)) { - return els[i]; - } - } - return null; -}, -replaceLang : function(s) { - s = s.replace(/\s/g, ' '); - var re = /{hs\.lang\.([^}]+)\}/g, - matches = s.match(re), - lang; - if (matches) for (var i = 0; i < matches.length; i++) { - lang = matches[i].replace(re, "$1"); - if (typeof hs.lang[lang] != 'undefined') s = s.replace(matches[i], hs.lang[lang]); - } - return s; -}, - - -focusTopmost : function() { - var topZ = 0, - topmostKey = -1, - expanders = hs.expanders, - exp, - zIndex; - for (var i = 0; i < expanders.length; i++) { - exp = expanders[i]; - if (exp) { - zIndex = exp.wrapper.style.zIndex; - if (zIndex && zIndex > topZ) { - topZ = zIndex; - topmostKey = i; - } - } - } - if (topmostKey == -1) hs.focusKey = -1; - else expanders[topmostKey].focus(); -}, - -getParam : function (a, param) { - a.getParams = a.onclick; - var p = a.getParams ? a.getParams() : null; - a.getParams = null; - - return (p && typeof p[param] != 'undefined') ? p[param] : - (typeof hs[param] != 'undefined' ? hs[param] : null); -}, - -getSrc : function (a) { - var src = hs.getParam(a, 'src'); - if (src) return src; - return a.href; -}, - -getNode : function (id) { - var node = hs.$(id), clone = hs.clones[id], a = {}; - if (!node && !clone) return null; - if (!clone) { - clone = node.cloneNode(true); - clone.id = ''; - hs.clones[id] = clone; - return node; - } else { - return clone.cloneNode(true); - } -}, - -discardElement : function(d) { - if (d) hs.garbageBin.appendChild(d); - hs.garbageBin.innerHTML = ''; -}, -dim : function(exp) { - if (!hs.dimmer) { - isNew = true; - hs.dimmer = hs.createElement ('div', { - className: 'highslide-dimming highslide-viewport-size', - owner: '', - onclick: function() { - - hs.close(); - } - }, { - visibility: 'visible', - opacity: 0 - }, hs.container, true); - - if (/(Android|iPad|iPhone|iPod)/.test(navigator.userAgent)) { - var body = document.body; - function pixDimmerSize() { - hs.setStyles(hs.dimmer, { - width: body.scrollWidth +'px', - height: body.scrollHeight +'px' - }); - } - pixDimmerSize(); - hs.addEventListener(window, 'resize', pixDimmerSize); - } - } - hs.dimmer.style.display = ''; - - var isNew = hs.dimmer.owner == ''; - hs.dimmer.owner += '|'+ exp.key; - - if (isNew) { - if (hs.geckoMac && hs.dimmingGeckoFix) - hs.setStyles(hs.dimmer, { - background: 'url('+ hs.graphicsDir + 'geckodimmer.png)', - opacity: 1 - }); - else - hs.animate(hs.dimmer, { opacity: exp.dimmingOpacity }, hs.dimmingDuration); - } -}, -undim : function(key) { - if (!hs.dimmer) return; - if (typeof key != 'undefined') hs.dimmer.owner = hs.dimmer.owner.replace('|'+ key, ''); - - if ( - (typeof key != 'undefined' && hs.dimmer.owner != '') - || (hs.upcoming && hs.getParam(hs.upcoming, 'dimmingOpacity')) - ) return; - - if (hs.geckoMac && hs.dimmingGeckoFix) hs.dimmer.style.display = 'none'; - else hs.animate(hs.dimmer, { opacity: 0 }, hs.dimmingDuration, null, function() { - hs.dimmer.style.display = 'none'; - }); -}, -transit : function (adj, exp) { - var last = exp || hs.getExpander(); - exp = last; - if (hs.upcoming) return false; - else hs.last = last; - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - try { - hs.upcoming = adj; - adj.onclick(); - } catch (e){ - hs.last = hs.upcoming = null; - } - try { - if (!adj || exp.transitions[1] != 'crossfade') - exp.close(); - } catch (e) {} - return false; -}, - -previousOrNext : function (el, op) { - var exp = hs.getExpander(el); - if (exp) return hs.transit(exp.getAdjacentAnchor(op), exp); - else return false; -}, - -previous : function (el) { - return hs.previousOrNext(el, -1); -}, - -next : function (el) { - return hs.previousOrNext(el, 1); -}, - -keyHandler : function(e) { - if (!e) e = window.event; - if (!e.target) e.target = e.srcElement; // ie - if (typeof e.target.form != 'undefined') return true; // form element has focus - var exp = hs.getExpander(); - - var op = null; - switch (e.keyCode) { - case 70: // f - if (exp) exp.doFullExpand(); - return true; - case 32: // Space - op = 2; - break; - case 34: // Page Down - case 39: // Arrow right - case 40: // Arrow down - op = 1; - break; - case 8: // Backspace - case 33: // Page Up - case 37: // Arrow left - case 38: // Arrow up - op = -1; - break; - case 27: // Escape - case 13: // Enter - op = 0; - } - if (op !== null) {if (op != 2)hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - if (!hs.enableKeyListener) return true; - - if (e.preventDefault) e.preventDefault(); - else e.returnValue = false; - if (exp) { - if (op == 0) { - exp.close(); - } else if (op == 2) { - if (exp.slideshow) exp.slideshow.hitSpace(); - } else { - if (exp.slideshow) exp.slideshow.pause(); - hs.previousOrNext(exp.key, op); - } - return false; - } - } - return true; -}, - - -registerOverlay : function (overlay) { - hs.push(hs.overlays, hs.extend(overlay, { hsId: 'hsId'+ hs.idCounter++ } )); -}, - - -addSlideshow : function (options) { - var sg = options.slideshowGroup; - if (typeof sg == 'object') { - for (var i = 0; i < sg.length; i++) { - var o = {}; - for (var x in options) o[x] = options[x]; - o.slideshowGroup = sg[i]; - hs.push(hs.slideshows, o); - } - } else { - hs.push(hs.slideshows, options); - } -}, - -getWrapperKey : function (element, expOnly) { - var el, re = /^highslide-wrapper-([0-9]+)$/; - // 1. look in open expanders - el = element; - while (el.parentNode) { - if (el.hsKey !== undefined) return el.hsKey; - if (el.id && re.test(el.id)) return el.id.replace(re, "$1"); - el = el.parentNode; - } - // 2. look in thumbnail - if (!expOnly) { - el = element; - while (el.parentNode) { - if (el.tagName && hs.isHsAnchor(el)) { - for (var key = 0; key < hs.expanders.length; key++) { - var exp = hs.expanders[key]; - if (exp && exp.a == el) return key; - } - } - el = el.parentNode; - } - } - return null; -}, - -getExpander : function (el, expOnly) { - if (typeof el == 'undefined') return hs.expanders[hs.focusKey] || null; - if (typeof el == 'number') return hs.expanders[el] || null; - if (typeof el == 'string') el = hs.$(el); - return hs.expanders[hs.getWrapperKey(el, expOnly)] || null; -}, - -isHsAnchor : function (a) { - return (a.onclick && a.onclick.toString().replace(/\s/g, ' ').match(/hs.(htmlE|e)xpand/)); -}, - -reOrder : function () { - for (var i = 0; i < hs.expanders.length; i++) - if (hs.expanders[i] && hs.expanders[i].isExpanded) hs.focusTopmost(); -}, - -mouseClickHandler : function(e) -{ - if (!e) e = window.event; - if (e.button > 1) return true; - if (!e.target) e.target = e.srcElement; - - var el = e.target; - while (el.parentNode - && !(/highslide-(image|move|html|resize)/.test(el.className))) - { - el = el.parentNode; - } - var exp = hs.getExpander(el); - if (exp && (exp.isClosing || !exp.isExpanded)) return true; - - if (exp && e.type == 'mousedown') { - if (e.target.form) return true; - var match = el.className.match(/highslide-(image|move|resize)/); - if (match) { - hs.dragArgs = { - exp: exp , - type: match[1], - left: exp.x.pos, - width: exp.x.size, - top: exp.y.pos, - height: exp.y.size, - clickX: e.clientX, - clickY: e.clientY - }; - - - hs.addEventListener(document, 'mousemove', hs.dragHandler); - if (e.preventDefault) e.preventDefault(); // FF - - if (/highslide-(image|html)-blur/.test(exp.content.className)) { - exp.focus(); - hs.hasFocused = true; - } - return false; - } - } else if (e.type == 'mouseup') { - - hs.removeEventListener(document, 'mousemove', hs.dragHandler); - - if (hs.dragArgs) { - if (hs.styleRestoreCursor && hs.dragArgs.type == 'image') - hs.dragArgs.exp.content.style.cursor = hs.styleRestoreCursor; - var hasDragged = hs.dragArgs.hasDragged; - - if (!hasDragged &&!hs.hasFocused && !/(move|resize)/.test(hs.dragArgs.type)) { - exp.close(); - } - else if (hasDragged || (!hasDragged && hs.hasHtmlExpanders)) { - hs.dragArgs.exp.doShowHide('hidden'); - } - hs.hasFocused = false; - hs.dragArgs = null; - - } else if (/highslide-image-blur/.test(el.className)) { - el.style.cursor = hs.styleRestoreCursor; - } - } - return false; -}, - -dragHandler : function(e) -{ - if (!hs.dragArgs) return true; - if (!e) e = window.event; - var a = hs.dragArgs, exp = a.exp; - - a.dX = e.clientX - a.clickX; - a.dY = e.clientY - a.clickY; - - var distance = Math.sqrt(Math.pow(a.dX, 2) + Math.pow(a.dY, 2)); - if (!a.hasDragged) a.hasDragged = (a.type != 'image' && distance > 0) - || (distance > (hs.dragSensitivity || 5)); - - if (a.hasDragged && e.clientX > 5 && e.clientY > 5) { - - if (a.type == 'resize') exp.resize(a); - else { - exp.moveTo(a.left + a.dX, a.top + a.dY); - if (a.type == 'image') exp.content.style.cursor = 'move'; - } - } - return false; -}, - -wrapperMouseHandler : function (e) { - try { - if (!e) e = window.event; - var over = /mouseover/i.test(e.type); - if (!e.target) e.target = e.srcElement; // ie - if (!e.relatedTarget) e.relatedTarget = - over ? e.fromElement : e.toElement; // ie - var exp = hs.getExpander(e.target); - if (!exp.isExpanded) return; - if (!exp || !e.relatedTarget || hs.getExpander(e.relatedTarget, true) == exp - || hs.dragArgs) return; - for (var i = 0; i < exp.overlays.length; i++) (function() { - var o = hs.$('hsId'+ exp.overlays[i]); - if (o && o.hideOnMouseOut) { - if (over) hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: over ? o.opacity : 0 }, o.dur); - } - })(); - } catch (e) {} -}, -addEventListener : function (el, event, func) { - if (el == document && event == 'ready') { - hs.push(hs.onReady, func); - } - try { - el.addEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - el.attachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = func; - } - } -}, - -removeEventListener : function (el, event, func) { - try { - el.removeEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = null; - } - } -}, - -preloadFullImage : function (i) { - if (hs.continuePreloading && hs.preloadTheseImages[i] && hs.preloadTheseImages[i] != 'undefined') { - var img = document.createElement('img'); - img.onload = function() { - img = null; - hs.preloadFullImage(i + 1); - }; - img.src = hs.preloadTheseImages[i]; - } -}, -preloadImages : function (number) { - if (number && typeof number != 'object') hs.numberOfImagesToPreload = number; - - var arr = hs.getAnchors(); - for (var i = 0; i < arr.images.length && i < hs.numberOfImagesToPreload; i++) { - hs.push(hs.preloadTheseImages, hs.getSrc(arr.images[i])); - } - - // preload outlines - if (hs.outlineType) new hs.Outline(hs.outlineType, function () { hs.preloadFullImage(0)} ); - else - - hs.preloadFullImage(0); - - // preload cursor - if (hs.restoreCursor) var cur = hs.createElement('img', { src: hs.graphicsDir + hs.restoreCursor }); -}, - - -init : function () { - if (!hs.container) { - - hs.ieLt7 = hs.ie && hs.uaVersion < 7; - hs.ieLt9 = hs.ie && hs.uaVersion < 9; - - hs.getPageSize(); - for (var x in hs.langDefaults) { - if (typeof hs[x] != 'undefined') hs.lang[x] = hs[x]; - else if (typeof hs.lang[x] == 'undefined' && typeof hs.langDefaults[x] != 'undefined') - hs.lang[x] = hs.langDefaults[x]; - } - - hs.container = hs.createElement('div', { - className: 'highslide-container' - }, { - position: 'absolute', - left: 0, - top: 0, - width: '100%', - zIndex: hs.zIndexCounter, - direction: 'ltr' - }, - document.body, - true - ); - hs.loading = hs.createElement('a', { - className: 'highslide-loading', - title: hs.lang.loadingTitle, - innerHTML: hs.lang.loadingText, - href: 'javascript:;' - }, { - position: 'absolute', - top: '-9999px', - opacity: hs.loadingOpacity, - zIndex: 1 - }, hs.container - ); - hs.garbageBin = hs.createElement('div', null, { display: 'none' }, hs.container); - hs.viewport = hs.createElement('div', { - className: 'highslide-viewport highslide-viewport-size' - }, { - visibility: (hs.safari && hs.uaVersion < 525) ? 'visible' : 'hidden' - }, hs.container, 1 - ); - - // http://www.robertpenner.com/easing/ - Math.linearTween = function (t, b, c, d) { - return c*t/d + b; - }; - Math.easeInQuad = function (t, b, c, d) { - return c*(t/=d)*t + b; - }; - Math.easeOutQuad = function (t, b, c, d) { - return -c *(t/=d)*(t-2) + b; - }; - - hs.hideSelects = hs.ieLt7; - hs.hideIframes = ((window.opera && hs.uaVersion < 9) || navigator.vendor == 'KDE' - || (hs.ieLt7 && hs.uaVersion < 5.5)); - } -}, -ready : function() { - if (hs.isReady) return; - hs.isReady = true; - for (var i = 0; i < hs.onReady.length; i++) hs.onReady[i](); -}, - -updateAnchors : function() { - var el, els, all = [], images = [],groups = {}, re; - - for (var i = 0; i < hs.openerTagNames.length; i++) { - els = document.getElementsByTagName(hs.openerTagNames[i]); - for (var j = 0; j < els.length; j++) { - el = els[j]; - re = hs.isHsAnchor(el); - if (re) { - hs.push(all, el); - if (re[0] == 'hs.expand') hs.push(images, el); - var g = hs.getParam(el, 'slideshowGroup') || 'none'; - if (!groups[g]) groups[g] = []; - hs.push(groups[g], el); - } - } - } - hs.anchors = { all: all, groups: groups, images: images }; - return hs.anchors; - -}, - -getAnchors : function() { - return hs.anchors || hs.updateAnchors(); -}, - - -close : function(el) { - var exp = hs.getExpander(el); - if (exp) exp.close(); - return false; -} -}; // end hs object -hs.fx = function( elem, options, prop ){ - this.options = options; - this.elem = elem; - this.prop = prop; - - if (!options.orig) options.orig = {}; -}; -hs.fx.prototype = { - update: function(){ - (hs.fx.step[this.prop] || hs.fx.step._default)(this); - - if (this.options.step) - this.options.step.call(this.elem, this.now, this); - - }, - custom: function(from, to, unit){ - this.startTime = (new Date()).getTime(); - this.start = from; - this.end = to; - this.unit = unit;// || this.unit || "px"; - this.now = this.start; - this.pos = this.state = 0; - - var self = this; - function t(gotoEnd){ - return self.step(gotoEnd); - } - - t.elem = this.elem; - - if ( t() && hs.timers.push(t) == 1 ) { - hs.timerId = setInterval(function(){ - var timers = hs.timers; - - for ( var i = 0; i < timers.length; i++ ) - if ( !timers[i]() ) - timers.splice(i--, 1); - - if ( !timers.length ) { - clearInterval(hs.timerId); - } - }, 13); - } - }, - step: function(gotoEnd){ - var t = (new Date()).getTime(); - if ( gotoEnd || t >= this.options.duration + this.startTime ) { - this.now = this.end; - this.pos = this.state = 1; - this.update(); - - this.options.curAnim[ this.prop ] = true; - - var done = true; - for ( var i in this.options.curAnim ) - if ( this.options.curAnim[i] !== true ) - done = false; - - if ( done ) { - if (this.options.complete) this.options.complete.call(this.elem); - } - return false; - } else { - var n = t - this.startTime; - this.state = n / this.options.duration; - this.pos = this.options.easing(n, 0, 1, this.options.duration); - this.now = this.start + ((this.end - this.start) * this.pos); - this.update(); - } - return true; - } - -}; - -hs.extend( hs.fx, { - step: { - - opacity: function(fx){ - hs.setStyles(fx.elem, { opacity: fx.now }); - }, - - _default: function(fx){ - try { - if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) - fx.elem.style[ fx.prop ] = fx.now + fx.unit; - else - fx.elem[ fx.prop ] = fx.now; - } catch (e) {} - } - } -}); - -hs.Outline = function (outlineType, onLoad) { - this.onLoad = onLoad; - this.outlineType = outlineType; - var v = hs.uaVersion, tr; - - this.hasAlphaImageLoader = hs.ie && hs.uaVersion < 7; - if (!outlineType) { - if (onLoad) onLoad(); - return; - } - - hs.init(); - this.table = hs.createElement( - 'table', { - cellSpacing: 0 - }, { - visibility: 'hidden', - position: 'absolute', - borderCollapse: 'collapse', - width: 0 - }, - hs.container, - true - ); - var tbody = hs.createElement('tbody', null, null, this.table, 1); - - this.td = []; - for (var i = 0; i <= 8; i++) { - if (i % 3 == 0) tr = hs.createElement('tr', null, { height: 'auto' }, tbody, true); - this.td[i] = hs.createElement('td', null, null, tr, true); - var style = i != 4 ? { lineHeight: 0, fontSize: 0} : { position : 'relative' }; - hs.setStyles(this.td[i], style); - } - this.td[4].className = outlineType +' highslide-outline'; - - this.preloadGraphic(); -}; - -hs.Outline.prototype = { -preloadGraphic : function () { - var src = hs.graphicsDir + (hs.outlinesDir || "outlines/")+ this.outlineType +".png"; - - var appendTo = hs.safari && hs.uaVersion < 525 ? hs.container : null; - this.graphic = hs.createElement('img', null, { position: 'absolute', - top: '-9999px' }, appendTo, true); // for onload trigger - - var pThis = this; - this.graphic.onload = function() { pThis.onGraphicLoad(); }; - - this.graphic.src = src; -}, - -onGraphicLoad : function () { - var o = this.offset = this.graphic.width / 4, - pos = [[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]], - dim = { height: (2*o) +'px', width: (2*o) +'px' }; - for (var i = 0; i <= 8; i++) { - if (pos[i]) { - if (this.hasAlphaImageLoader) { - var w = (i == 1 || i == 7) ? '100%' : this.graphic.width +'px'; - var div = hs.createElement('div', null, { width: '100%', height: '100%', position: 'relative', overflow: 'hidden'}, this.td[i], true); - hs.createElement ('div', null, { - filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+ this.graphic.src + "')", - position: 'absolute', - width: w, - height: this.graphic.height +'px', - left: (pos[i][0]*o)+'px', - top: (pos[i][1]*o)+'px' - }, - div, - true); - } else { - hs.setStyles(this.td[i], { background: 'url('+ this.graphic.src +') '+ (pos[i][0]*o)+'px '+(pos[i][1]*o)+'px'}); - } - - if (window.opera && (i == 3 || i ==5)) - hs.createElement('div', null, dim, this.td[i], true); - - hs.setStyles (this.td[i], dim); - } - } - this.graphic = null; - if (hs.pendingOutlines[this.outlineType]) hs.pendingOutlines[this.outlineType].destroy(); - hs.pendingOutlines[this.outlineType] = this; - if (this.onLoad) this.onLoad(); -}, - -setPosition : function (pos, offset, vis, dur, easing) { - var exp = this.exp, - stl = exp.wrapper.style, - offset = offset || 0, - pos = pos || { - x: exp.x.pos + offset, - y: exp.y.pos + offset, - w: exp.x.get('wsize') - 2 * offset, - h: exp.y.get('wsize') - 2 * offset - }; - if (vis) this.table.style.visibility = (pos.h >= 4 * this.offset) - ? 'visible' : 'hidden'; - hs.setStyles(this.table, { - left: (pos.x - this.offset) +'px', - top: (pos.y - this.offset) +'px', - width: (pos.w + 2 * this.offset) +'px' - }); - - pos.w -= 2 * this.offset; - pos.h -= 2 * this.offset; - hs.setStyles (this.td[4], { - width: pos.w >= 0 ? pos.w +'px' : 0, - height: pos.h >= 0 ? pos.h +'px' : 0 - }); - if (this.hasAlphaImageLoader) this.td[3].style.height - = this.td[5].style.height = this.td[4].style.height; - -}, - -destroy : function(hide) { - if (hide) this.table.style.visibility = 'hidden'; - else hs.discardElement(this.table); -} -}; - -hs.Dimension = function(exp, dim) { - this.exp = exp; - this.dim = dim; - this.ucwh = dim == 'x' ? 'Width' : 'Height'; - this.wh = this.ucwh.toLowerCase(); - this.uclt = dim == 'x' ? 'Left' : 'Top'; - this.lt = this.uclt.toLowerCase(); - this.ucrb = dim == 'x' ? 'Right' : 'Bottom'; - this.rb = this.ucrb.toLowerCase(); - this.p1 = this.p2 = 0; -}; -hs.Dimension.prototype = { -get : function(key) { - switch (key) { - case 'loadingPos': - return this.tpos + this.tb + (this.t - hs.loading['offset'+ this.ucwh]) / 2; - case 'loadingPosXfade': - return this.pos + this.cb+ this.p1 + (this.size - hs.loading['offset'+ this.ucwh]) / 2; - case 'wsize': - return this.size + 2 * this.cb + this.p1 + this.p2; - case 'fitsize': - return this.clientSize - this.marginMin - this.marginMax; - case 'maxsize': - return this.get('fitsize') - 2 * this.cb - this.p1 - this.p2 ; - case 'opos': - return this.pos - (this.exp.outline ? this.exp.outline.offset : 0); - case 'osize': - return this.get('wsize') + (this.exp.outline ? 2*this.exp.outline.offset : 0); - case 'imgPad': - return this.imgSize ? Math.round((this.size - this.imgSize) / 2) : 0; - - } -}, -calcBorders: function() { - // correct for borders - this.cb = (this.exp.content['offset'+ this.ucwh] - this.t) / 2; - - this.marginMax = hs['margin'+ this.ucrb]; -}, -calcThumb: function() { - this.t = this.exp.el[this.wh] ? parseInt(this.exp.el[this.wh]) : - this.exp.el['offset'+ this.ucwh]; - this.tpos = this.exp.tpos[this.dim]; - this.tb = (this.exp.el['offset'+ this.ucwh] - this.t) / 2; - if (this.tpos == 0 || this.tpos == -1) { - this.tpos = (hs.page[this.wh] / 2) + hs.page['scroll'+ this.uclt]; - }; -}, -calcExpanded: function() { - var exp = this.exp; - this.justify = 'auto'; - - // get alignment - if (exp.align == 'center') this.justify = 'center'; - else if (new RegExp(this.lt).test(exp.anchor)) this.justify = null; - else if (new RegExp(this.rb).test(exp.anchor)) this.justify = 'max'; - - - // size and position - this.pos = this.tpos - this.cb + this.tb; - - if (this.maxHeight && this.dim == 'x') - exp.maxWidth = Math.min(exp.maxWidth || this.full, exp.maxHeight * this.full / exp.y.full); - - this.size = Math.min(this.full, exp['max'+ this.ucwh] || this.full); - this.minSize = exp.allowSizeReduction ? - Math.min(exp['min'+ this.ucwh], this.full) :this.full; - if (exp.isImage && exp.useBox) { - this.size = exp[this.wh]; - this.imgSize = this.full; - } - if (this.dim == 'x' && hs.padToMinWidth) this.minSize = exp.minWidth; - this.target = exp['target'+ this.dim.toUpperCase()]; - this.marginMin = hs['margin'+ this.uclt]; - this.scroll = hs.page['scroll'+ this.uclt]; - this.clientSize = hs.page[this.wh]; -}, -setSize: function(i) { - var exp = this.exp; - if (exp.isImage && (exp.useBox || hs.padToMinWidth)) { - this.imgSize = i; - this.size = Math.max(this.size, this.imgSize); - exp.content.style[this.lt] = this.get('imgPad')+'px'; - } else - this.size = i; - - exp.content.style[this.wh] = i +'px'; - exp.wrapper.style[this.wh] = this.get('wsize') +'px'; - if (exp.outline) exp.outline.setPosition(); - if (this.dim == 'x' && exp.overlayBox) exp.sizeOverlayBox(true); - if (this.dim == 'x' && exp.slideshow && exp.isImage) { - if (i == this.full) exp.slideshow.disable('full-expand'); - else exp.slideshow.enable('full-expand'); - } -}, -setPos: function(i) { - this.pos = i; - this.exp.wrapper.style[this.lt] = i +'px'; - - if (this.exp.outline) this.exp.outline.setPosition(); - -} -}; - -hs.Expander = function(a, params, custom, contentType) { - if (document.readyState && hs.ie && !hs.isReady) { - hs.addEventListener(document, 'ready', function() { - new hs.Expander(a, params, custom, contentType); - }); - return; - } - this.a = a; - this.custom = custom; - this.contentType = contentType || 'image'; - this.isImage = !this.isHtml; - - hs.continuePreloading = false; - this.overlays = []; - this.last = hs.last; - hs.last = null; - hs.init(); - var key = this.key = hs.expanders.length; - // override inline parameters - for (var i = 0; i < hs.overrides.length; i++) { - var name = hs.overrides[i]; - this[name] = params && typeof params[name] != 'undefined' ? - params[name] : hs[name]; - } - if (!this.src) this.src = a.href; - - // get thumb - var el = (params && params.thumbnailId) ? hs.$(params.thumbnailId) : a; - el = this.thumb = el.getElementsByTagName('img')[0] || el; - this.thumbsUserSetId = el.id || a.id; - - // check if already open - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].a == a - && !(this.last && this.transitions[1] == 'crossfade')) { - hs.expanders[i].focus(); - return false; - } - } - - // cancel other - if (!hs.allowSimultaneousLoading) for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].thumb != el && !hs.expanders[i].onLoadStarted) { - hs.expanders[i].cancelLoading(); - } - } - hs.expanders[key] = this; - if (!hs.allowMultipleInstances && !hs.upcoming) { - if (hs.expanders[key-1]) hs.expanders[key-1].close(); - if (typeof hs.focusKey != 'undefined' && hs.expanders[hs.focusKey]) - hs.expanders[hs.focusKey].close(); - } - - // initiate metrics - this.el = el; - this.tpos = this.pageOrigin || hs.getPosition(el); - hs.getPageSize(); - var x = this.x = new hs.Dimension(this, 'x'); - x.calcThumb(); - var y = this.y = new hs.Dimension(this, 'y'); - y.calcThumb(); - this.wrapper = hs.createElement( - 'div', { - id: 'highslide-wrapper-'+ this.key, - className: 'highslide-wrapper '+ this.wrapperClassName - }, { - visibility: 'hidden', - position: 'absolute', - zIndex: hs.zIndexCounter += 2 - }, null, true ); - - this.wrapper.onmouseover = this.wrapper.onmouseout = hs.wrapperMouseHandler; - if (this.contentType == 'image' && this.outlineWhileAnimating == 2) - this.outlineWhileAnimating = 0; - - // get the outline - if (!this.outlineType - || (this.last && this.isImage && this.transitions[1] == 'crossfade')) { - this[this.contentType +'Create'](); - - } else if (hs.pendingOutlines[this.outlineType]) { - this.connectOutline(); - this[this.contentType +'Create'](); - - } else { - this.showLoading(); - var exp = this; - new hs.Outline(this.outlineType, - function () { - exp.connectOutline(); - exp[exp.contentType +'Create'](); - } - ); - } - return true; -}; - -hs.Expander.prototype = { -error : function(e) { - if (hs.debug) alert ('Line '+ e.lineNumber +': '+ e.message); - else window.location.href = this.src; -}, - -connectOutline : function() { - var outline = this.outline = hs.pendingOutlines[this.outlineType]; - outline.exp = this; - outline.table.style.zIndex = this.wrapper.style.zIndex - 1; - hs.pendingOutlines[this.outlineType] = null; -}, - -showLoading : function() { - if (this.onLoadStarted || this.loading) return; - - this.loading = hs.loading; - var exp = this; - this.loading.onclick = function() { - exp.cancelLoading(); - }; - var exp = this, - l = this.x.get('loadingPos') +'px', - t = this.y.get('loadingPos') +'px'; - if (!tgt && this.last && this.transitions[1] == 'crossfade') - var tgt = this.last; - if (tgt) { - l = tgt.x.get('loadingPosXfade') +'px'; - t = tgt.y.get('loadingPosXfade') +'px'; - this.loading.style.zIndex = hs.zIndexCounter++; - } - setTimeout(function () { - if (exp.loading) hs.setStyles(exp.loading, { left: l, top: t, zIndex: hs.zIndexCounter++ })} - , 100); -}, - -imageCreate : function() { - var exp = this; - - var img = document.createElement('img'); - this.content = img; - img.onload = function () { - if (hs.expanders[exp.key]) exp.contentLoaded(); - }; - if (hs.blockRightClick) img.oncontextmenu = function() { return false; }; - img.className = 'highslide-image'; - hs.setStyles(img, { - visibility: 'hidden', - display: 'block', - position: 'absolute', - maxWidth: '9999px', - zIndex: 3 - }); - img.title = hs.lang.restoreTitle; - if (hs.safari && hs.uaVersion < 525) hs.container.appendChild(img); - if (hs.ie && hs.flushImgSize) img.src = null; - img.src = this.src; - - this.showLoading(); -}, - -contentLoaded : function() { - try { - if (!this.content) return; - this.content.onload = null; - if (this.onLoadStarted) return; - else this.onLoadStarted = true; - - var x = this.x, y = this.y; - - if (this.loading) { - hs.setStyles(this.loading, { top: '-9999px' }); - this.loading = null; - } - x.full = this.content.width; - y.full = this.content.height; - - hs.setStyles(this.content, { - width: x.t +'px', - height: y.t +'px' - }); - this.wrapper.appendChild(this.content); - hs.container.appendChild(this.wrapper); - - x.calcBorders(); - y.calcBorders(); - - hs.setStyles (this.wrapper, { - left: (x.tpos + x.tb - x.cb) +'px', - top: (y.tpos + x.tb - y.cb) +'px' - }); - - - this.initSlideshow(); - this.getOverlays(); - - var ratio = x.full / y.full; - x.calcExpanded(); - this.justify(x); - - y.calcExpanded(); - this.justify(y); - if (this.overlayBox) this.sizeOverlayBox(0, 1); - - - if (this.allowSizeReduction) { - this.correctRatio(ratio); - var ss = this.slideshow; - if (ss && this.last && ss.controls && ss.fixedControls) { - var pos = ss.overlayOptions.position || '', p; - for (var dim in hs.oPos) for (var i = 0; i < 5; i++) { - p = this[dim]; - if (pos.match(hs.oPos[dim][i])) { - p.pos = this.last[dim].pos - + (this.last[dim].p1 - p.p1) - + (this.last[dim].size - p.size) * [0, 0, .5, 1, 1][i]; - if (ss.fixedControls == 'fit') { - if (p.pos + p.size + p.p1 + p.p2 > p.scroll + p.clientSize - p.marginMax) - p.pos = p.scroll + p.clientSize - p.size - p.marginMin - p.marginMax - p.p1 - p.p2; - if (p.pos < p.scroll + p.marginMin) p.pos = p.scroll + p.marginMin; - } - } - } - } - if (this.isImage && this.x.full > (this.x.imgSize || this.x.size)) { - this.createFullExpand(); - if (this.overlays.length == 1) this.sizeOverlayBox(); - } - } - this.show(); - - } catch (e) { - this.error(e); - } -}, - -justify : function (p, moveOnly) { - var tgtArr, tgt = p.target, dim = p == this.x ? 'x' : 'y'; - - if (tgt && tgt.match(/ /)) { - tgtArr = tgt.split(' '); - tgt = tgtArr[0]; - } - if (tgt && hs.$(tgt)) { - p.pos = hs.getPosition(hs.$(tgt))[dim]; - if (tgtArr && tgtArr[1] && tgtArr[1].match(/^[-]?[0-9]+px$/)) - p.pos += parseInt(tgtArr[1]); - if (p.size < p.minSize) p.size = p.minSize; - - } else if (p.justify == 'auto' || p.justify == 'center') { - - var hasMovedMin = false; - - var allowReduce = p.exp.allowSizeReduction; - if (p.justify == 'center') - p.pos = Math.round(p.scroll + (p.clientSize + p.marginMin - p.marginMax - p.get('wsize')) / 2); - else - p.pos = Math.round(p.pos - ((p.get('wsize') - p.t) / 2)); - if (p.pos < p.scroll + p.marginMin) { - p.pos = p.scroll + p.marginMin; - hasMovedMin = true; - } - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - if (p.pos + p.get('wsize') > p.scroll + p.clientSize - p.marginMax) { - if (!moveOnly && hasMovedMin && allowReduce) { - p.size = Math.min(p.size, p.get(dim == 'y' ? 'fitsize' : 'maxsize')); - } else if (p.get('wsize') < p.get('fitsize')) { - p.pos = p.scroll + p.clientSize - p.marginMax - p.get('wsize'); - } else { // image larger than viewport - p.pos = p.scroll + p.marginMin; - if (!moveOnly && allowReduce) p.size = p.get(dim == 'y' ? 'fitsize' : 'maxsize'); - } - } - - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - - - } else if (p.justify == 'max') { - p.pos = Math.floor(p.pos - p.size + p.t); - } - - - if (p.pos < p.marginMin) { - var tmpMin = p.pos; - p.pos = p.marginMin; - - if (allowReduce && !moveOnly) p.size = p.size - (p.pos - tmpMin); - - } -}, - -correctRatio : function(ratio) { - var x = this.x, - y = this.y, - changed = false, - xSize = Math.min(x.full, x.size), - ySize = Math.min(y.full, y.size), - useBox = (this.useBox || hs.padToMinWidth); - - if (xSize / ySize > ratio) { // width greater - xSize = ySize * ratio; - if (xSize < x.minSize) { // below minWidth - xSize = x.minSize; - ySize = xSize / ratio; - } - changed = true; - - } else if (xSize / ySize < ratio) { // height greater - ySize = xSize / ratio; - changed = true; - } - - if (hs.padToMinWidth && x.full < x.minSize) { - x.imgSize = x.full; - y.size = y.imgSize = y.full; - } else if (this.useBox) { - x.imgSize = xSize; - y.imgSize = ySize; - } else { - x.size = xSize; - y.size = ySize; - } - changed = this.fitOverlayBox(this.useBox ? null : ratio, changed); - if (useBox && y.size < y.imgSize) { - y.imgSize = y.size; - x.imgSize = y.size * ratio; - } - if (changed || useBox) { - x.pos = x.tpos - x.cb + x.tb; - x.minSize = x.size; - this.justify(x, true); - - y.pos = y.tpos - y.cb + y.tb; - y.minSize = y.size; - this.justify(y, true); - if (this.overlayBox) this.sizeOverlayBox(); - } - - -}, -fitOverlayBox : function(ratio, changed) { - var x = this.x, y = this.y; - if (this.overlayBox) { - while (y.size > this.minHeight && x.size > this.minWidth - && y.get('wsize') > y.get('fitsize')) { - y.size -= 10; - if (ratio) x.size = y.size * ratio; - this.sizeOverlayBox(0, 1); - changed = true; - } - } - return changed; -}, - -show : function () { - var x = this.x, y = this.y; - this.doShowHide('hidden'); - if (this.slideshow && this.slideshow.thumbstrip) this.slideshow.thumbstrip.selectThumb(); - - // Apply size change - this.changeSize( - 1, { - wrapper: { - width : x.get('wsize'), - height : y.get('wsize'), - left: x.pos, - top: y.pos - }, - content: { - left: x.p1 + x.get('imgPad'), - top: y.p1 + y.get('imgPad'), - width:x.imgSize ||x.size, - height:y.imgSize ||y.size - } - }, - hs.expandDuration - ); -}, - -changeSize : function(up, to, dur) { - // transition - var trans = this.transitions, - other = up ? (this.last ? this.last.a : null) : hs.upcoming, - t = (trans[1] && other - && hs.getParam(other, 'transitions')[1] == trans[1]) ? - trans[1] : trans[0]; - - if (this[t] && t != 'expand') { - this[t](up, to); - return; - } - - if (this.outline && !this.outlineWhileAnimating) { - if (up) this.outline.setPosition(); - else this.outline.destroy(); - } - - - if (!up) this.destroyOverlays(); - - var exp = this, - x = exp.x, - y = exp.y, - easing = this.easing; - if (!up) easing = this.easingClose || easing; - var after = up ? - function() { - - if (exp.outline) exp.outline.table.style.visibility = "visible"; - setTimeout(function() { - exp.afterExpand(); - }, 50); - } : - function() { - exp.afterClose(); - }; - if (up) hs.setStyles( this.wrapper, { - width: x.t +'px', - height: y.t +'px' - }); - if (this.fadeInOut) { - hs.setStyles(this.wrapper, { opacity: up ? 0 : 1 }); - hs.extend(to.wrapper, { opacity: up }); - } - hs.animate( this.wrapper, to.wrapper, { - duration: dur, - easing: easing, - step: function(val, args) { - if (exp.outline && exp.outlineWhileAnimating && args.prop == 'top') { - var fac = up ? args.pos : 1 - args.pos; - var pos = { - w: x.t + (x.get('wsize') - x.t) * fac, - h: y.t + (y.get('wsize') - y.t) * fac, - x: x.tpos + (x.pos - x.tpos) * fac, - y: y.tpos + (y.pos - y.tpos) * fac - }; - exp.outline.setPosition(pos, 0, 1); - } - } - }); - hs.animate( this.content, to.content, dur, easing, after); - if (up) { - this.wrapper.style.visibility = 'visible'; - this.content.style.visibility = 'visible'; - this.a.className += ' highslide-active-anchor'; - } -}, - - - -fade : function(up, to) { - this.outlineWhileAnimating = false; - var exp = this, t = up ? hs.expandDuration : 0; - - if (up) { - hs.animate(this.wrapper, to.wrapper, 0); - hs.setStyles(this.wrapper, { opacity: 0, visibility: 'visible' }); - hs.animate(this.content, to.content, 0); - this.content.style.visibility = 'visible'; - - hs.animate(this.wrapper, { opacity: 1 }, t, null, - function() { exp.afterExpand(); }); - } - - if (this.outline) { - this.outline.table.style.zIndex = this.wrapper.style.zIndex; - var dir = up || -1, - offset = this.outline.offset, - startOff = up ? 3 : offset, - endOff = up? offset : 3; - for (var i = startOff; dir * i <= dir * endOff; i += dir, t += 25) { - (function() { - var o = up ? endOff - i : startOff - i; - setTimeout(function() { - exp.outline.setPosition(0, o, 1); - }, t); - })(); - } - } - - - if (up) {}//setTimeout(function() { exp.afterExpand(); }, t+50); - else { - setTimeout( function() { - if (exp.outline) exp.outline.destroy(exp.preserveContent); - - exp.destroyOverlays(); - - hs.animate( exp.wrapper, { opacity: 0 }, hs.restoreDuration, null, function(){ - exp.afterClose(); - }); - }, t); - } -}, -crossfade : function (up, to, from) { - if (!up) return; - var exp = this, - last = this.last, - x = this.x, - y = this.y, - lastX = last.x, - lastY = last.y, - wrapper = this.wrapper, - content = this.content, - overlayBox = this.overlayBox; - hs.removeEventListener(document, 'mousemove', hs.dragHandler); - - hs.setStyles(content, { - width: (x.imgSize || x.size) +'px', - height: (y.imgSize || y.size) +'px' - }); - if (overlayBox) overlayBox.style.overflow = 'visible'; - this.outline = last.outline; - if (this.outline) this.outline.exp = exp; - last.outline = null; - var fadeBox = hs.createElement('div', { - className: 'highslide-'+ this.contentType - }, { - position: 'absolute', - zIndex: 4, - overflow: 'hidden', - display: 'none' - } - ); - var names = { oldImg: last, newImg: this }; - for (var n in names) { - this[n] = names[n].content.cloneNode(1); - hs.setStyles(this[n], { - position: 'absolute', - border: 0, - visibility: 'visible' - }); - fadeBox.appendChild(this[n]); - } - wrapper.appendChild(fadeBox); - if (overlayBox) { - overlayBox.className = ''; - wrapper.appendChild(overlayBox); - } - fadeBox.style.display = ''; - last.content.style.display = 'none'; - - - if (hs.safari && hs.uaVersion < 525) { - this.wrapper.style.visibility = 'visible'; - } - hs.animate(wrapper, { - width: x.size - }, { - duration: hs.transitionDuration, - step: function(val, args) { - var pos = args.pos, - invPos = 1 - pos; - var prop, - size = {}, - props = ['pos', 'size', 'p1', 'p2']; - for (var n in props) { - prop = props[n]; - size['x'+ prop] = Math.round(invPos * lastX[prop] + pos * x[prop]); - size['y'+ prop] = Math.round(invPos * lastY[prop] + pos * y[prop]); - size.ximgSize = Math.round( - invPos * (lastX.imgSize || lastX.size) + pos * (x.imgSize || x.size)); - size.ximgPad = Math.round(invPos * lastX.get('imgPad') + pos * x.get('imgPad')); - size.yimgSize = Math.round( - invPos * (lastY.imgSize || lastY.size) + pos * (y.imgSize || y.size)); - size.yimgPad = Math.round(invPos * lastY.get('imgPad') + pos * y.get('imgPad')); - } - if (exp.outline) exp.outline.setPosition({ - x: size.xpos, - y: size.ypos, - w: size.xsize + size.xp1 + size.xp2 + 2 * x.cb, - h: size.ysize + size.yp1 + size.yp2 + 2 * y.cb - }); - last.wrapper.style.clip = 'rect(' - + (size.ypos - lastY.pos)+'px, ' - + (size.xsize + size.xp1 + size.xp2 + size.xpos + 2 * lastX.cb - lastX.pos) +'px, ' - + (size.ysize + size.yp1 + size.yp2 + size.ypos + 2 * lastY.cb - lastY.pos) +'px, ' - + (size.xpos - lastX.pos)+'px)'; - - hs.setStyles(content, { - top: (size.yp1 + y.get('imgPad')) +'px', - left: (size.xp1 + x.get('imgPad')) +'px', - marginTop: (y.pos - size.ypos) +'px', - marginLeft: (x.pos - size.xpos) +'px' - }); - hs.setStyles(wrapper, { - top: size.ypos +'px', - left: size.xpos +'px', - width: (size.xp1 + size.xp2 + size.xsize + 2 * x.cb)+ 'px', - height: (size.yp1 + size.yp2 + size.ysize + 2 * y.cb) + 'px' - }); - hs.setStyles(fadeBox, { - width: (size.ximgSize || size.xsize) + 'px', - height: (size.yimgSize || size.ysize) +'px', - left: (size.xp1 + size.ximgPad) +'px', - top: (size.yp1 + size.yimgPad) +'px', - visibility: 'visible' - }); - - hs.setStyles(exp.oldImg, { - top: (lastY.pos - size.ypos + lastY.p1 - size.yp1 + lastY.get('imgPad') - size.yimgPad)+'px', - left: (lastX.pos - size.xpos + lastX.p1 - size.xp1 + lastX.get('imgPad') - size.ximgPad)+'px' - }); - - hs.setStyles(exp.newImg, { - opacity: pos, - top: (y.pos - size.ypos + y.p1 - size.yp1 + y.get('imgPad') - size.yimgPad) +'px', - left: (x.pos - size.xpos + x.p1 - size.xp1 + x.get('imgPad') - size.ximgPad) +'px' - }); - if (overlayBox) hs.setStyles(overlayBox, { - width: size.xsize + 'px', - height: size.ysize +'px', - left: (size.xp1 + x.cb) +'px', - top: (size.yp1 + y.cb) +'px' - }); - }, - complete: function () { - wrapper.style.visibility = content.style.visibility = 'visible'; - content.style.display = 'block'; - hs.discardElement(fadeBox); - exp.afterExpand(); - last.afterClose(); - exp.last = null; - } - - }); -}, -reuseOverlay : function(o, el) { - if (!this.last) return false; - for (var i = 0; i < this.last.overlays.length; i++) { - var oDiv = hs.$('hsId'+ this.last.overlays[i]); - if (oDiv && oDiv.hsId == o.hsId) { - this.genOverlayBox(); - oDiv.reuse = this.key; - hs.push(this.overlays, this.last.overlays[i]); - return true; - } - } - return false; -}, - - -afterExpand : function() { - this.isExpanded = true; - this.focus(); - if (this.dimmingOpacity) hs.dim(this); - if (hs.upcoming && hs.upcoming == this.a) hs.upcoming = null; - this.prepareNextOutline(); - var p = hs.page, mX = hs.mouse.x + p.scrollLeft, mY = hs.mouse.y + p.scrollTop; - this.mouseIsOver = this.x.pos < mX && mX < this.x.pos + this.x.get('wsize') - && this.y.pos < mY && mY < this.y.pos + this.y.get('wsize'); - if (this.overlayBox) this.showOverlays(); - -}, - - -prepareNextOutline : function() { - var key = this.key; - var outlineType = this.outlineType; - new hs.Outline(outlineType, - function () { try { hs.expanders[key].preloadNext(); } catch (e) {} }); -}, - - -preloadNext : function() { - var next = this.getAdjacentAnchor(1); - if (next && next.onclick.toString().match(/hs\.expand/)) - var img = hs.createElement('img', { src: hs.getSrc(next) }); -}, - - -getAdjacentAnchor : function(op) { - var current = this.getAnchorIndex(), as = hs.anchors.groups[this.slideshowGroup || 'none']; - if (as && !as[current + op] && this.slideshow && this.slideshow.repeat) { - if (op == 1) return as[0]; - else if (op == -1) return as[as.length-1]; - } - return (as && as[current + op]) || null; -}, - -getAnchorIndex : function() { - var arr = hs.getAnchors().groups[this.slideshowGroup || 'none']; - if (arr) for (var i = 0; i < arr.length; i++) { - if (arr[i] == this.a) return i; - } - return null; -}, - - -getNumber : function() { - if (this[this.numberPosition]) { - var arr = hs.anchors.groups[this.slideshowGroup || 'none']; - if (arr) { - var s = hs.lang.number.replace('%1', this.getAnchorIndex() + 1).replace('%2', arr.length); - this[this.numberPosition].innerHTML = - '
    '+ s +'
    '+ this[this.numberPosition].innerHTML; - } - } -}, -initSlideshow : function() { - if (!this.last) { - for (var i = 0; i < hs.slideshows.length; i++) { - var ss = hs.slideshows[i], sg = ss.slideshowGroup; - if (typeof sg == 'undefined' || sg === null || sg === this.slideshowGroup) - this.slideshow = new hs.Slideshow(this.key, ss); - } - } else { - this.slideshow = this.last.slideshow; - } - var ss = this.slideshow; - if (!ss) return; - var key = ss.expKey = this.key; - - ss.checkFirstAndLast(); - ss.disable('full-expand'); - if (ss.controls) { - this.createOverlay(hs.extend(ss.overlayOptions || {}, { - overlayId: ss.controls, - hsId: 'controls', - zIndex: 5 - })); - } - if (ss.thumbstrip) ss.thumbstrip.add(this); - if (!this.last && this.autoplay) ss.play(true); - if (ss.autoplay) { - ss.autoplay = setTimeout(function() { - hs.next(key); - }, (ss.interval || 500)); - } -}, - -cancelLoading : function() { - hs.discardElement (this.wrapper); - hs.expanders[this.key] = null; - if (hs.upcoming == this.a) hs.upcoming = null; - hs.undim(this.key); - if (this.loading) hs.loading.style.left = '-9999px'; -}, - -writeCredits : function () { - if (this.credits) return; - this.credits = hs.createElement('a', { - href: hs.creditsHref, - target: hs.creditsTarget, - className: 'highslide-credits', - innerHTML: hs.lang.creditsText, - title: hs.lang.creditsTitle - }); - this.createOverlay({ - overlayId: this.credits, - position: this.creditsPosition || 'top left', - hsId: 'credits' - }); -}, - -getInline : function(types, addOverlay) { - for (var i = 0; i < types.length; i++) { - var type = types[i], s = null; - if (!this[type +'Id'] && this.thumbsUserSetId) - this[type +'Id'] = type +'-for-'+ this.thumbsUserSetId; - if (this[type +'Id']) this[type] = hs.getNode(this[type +'Id']); - if (!this[type] && !this[type +'Text'] && this[type +'Eval']) try { - s = eval(this[type +'Eval']); - } catch (e) {} - if (!this[type] && this[type +'Text']) { - s = this[type +'Text']; - } - if (!this[type] && !s) { - this[type] = hs.getNode(this.a['_'+ type + 'Id']); - if (!this[type]) { - var next = this.a.nextSibling; - while (next && !hs.isHsAnchor(next)) { - if ((new RegExp('highslide-'+ type)).test(next.className || null)) { - if (!next.id) this.a['_'+ type + 'Id'] = next.id = 'hsId'+ hs.idCounter++; - this[type] = hs.getNode(next.id); - break; - } - next = next.nextSibling; - } - } - } - if (!this[type] && !s && this.numberPosition == type) s = '\n'; - - if (!this[type] && s) this[type] = hs.createElement('div', - { className: 'highslide-'+ type, innerHTML: s } ); - - if (addOverlay && this[type]) { - var o = { position: (type == 'heading') ? 'above' : 'below' }; - for (var x in this[type+'Overlay']) o[x] = this[type+'Overlay'][x]; - o.overlayId = this[type]; - this.createOverlay(o); - } - } -}, - - -// on end move and resize -doShowHide : function(visibility) { - if (hs.hideSelects) this.showHideElements('SELECT', visibility); - if (hs.hideIframes) this.showHideElements('IFRAME', visibility); - if (hs.geckoMac) this.showHideElements('*', visibility); -}, -showHideElements : function (tagName, visibility) { - var els = document.getElementsByTagName(tagName); - var prop = tagName == '*' ? 'overflow' : 'visibility'; - for (var i = 0; i < els.length; i++) { - if (prop == 'visibility' || (document.defaultView.getComputedStyle( - els[i], "").getPropertyValue('overflow') == 'auto' - || els[i].getAttribute('hidden-by') != null)) { - var hiddenBy = els[i].getAttribute('hidden-by'); - if (visibility == 'visible' && hiddenBy) { - hiddenBy = hiddenBy.replace('['+ this.key +']', ''); - els[i].setAttribute('hidden-by', hiddenBy); - if (!hiddenBy) els[i].style[prop] = els[i].origProp; - } else if (visibility == 'hidden') { // hide if behind - var elPos = hs.getPosition(els[i]); - elPos.w = els[i].offsetWidth; - elPos.h = els[i].offsetHeight; - if (!this.dimmingOpacity) { // hide all if dimming - - var clearsX = (elPos.x + elPos.w < this.x.get('opos') - || elPos.x > this.x.get('opos') + this.x.get('osize')); - var clearsY = (elPos.y + elPos.h < this.y.get('opos') - || elPos.y > this.y.get('opos') + this.y.get('osize')); - } - var wrapperKey = hs.getWrapperKey(els[i]); - if (!clearsX && !clearsY && wrapperKey != this.key) { // element falls behind image - if (!hiddenBy) { - els[i].setAttribute('hidden-by', '['+ this.key +']'); - els[i].origProp = els[i].style[prop]; - els[i].style[prop] = 'hidden'; - - } else if (hiddenBy.indexOf('['+ this.key +']') == -1) { - els[i].setAttribute('hidden-by', hiddenBy + '['+ this.key +']'); - } - } else if ((hiddenBy == '['+ this.key +']' || hs.focusKey == wrapperKey) - && wrapperKey != this.key) { // on move - els[i].setAttribute('hidden-by', ''); - els[i].style[prop] = els[i].origProp || ''; - } else if (hiddenBy && hiddenBy.indexOf('['+ this.key +']') > -1) { - els[i].setAttribute('hidden-by', hiddenBy.replace('['+ this.key +']', '')); - } - - } - } - } -}, - -focus : function() { - this.wrapper.style.zIndex = hs.zIndexCounter += 2; - // blur others - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && i == hs.focusKey) { - var blurExp = hs.expanders[i]; - blurExp.content.className += ' highslide-'+ blurExp.contentType +'-blur'; - blurExp.content.style.cursor = hs.ieLt7 ? 'hand' : 'pointer'; - blurExp.content.title = hs.lang.focusTitle; - } - } - - // focus this - if (this.outline) this.outline.table.style.zIndex - = this.wrapper.style.zIndex - 1; - this.content.className = 'highslide-'+ this.contentType; - this.content.title = hs.lang.restoreTitle; - - if (hs.restoreCursor) { - hs.styleRestoreCursor = window.opera ? 'pointer' : 'url('+ hs.graphicsDir + hs.restoreCursor +'), pointer'; - if (hs.ieLt7 && hs.uaVersion < 6) hs.styleRestoreCursor = 'hand'; - this.content.style.cursor = hs.styleRestoreCursor; - } - - hs.focusKey = this.key; - hs.addEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); -}, -moveTo: function(x, y) { - this.x.setPos(x); - this.y.setPos(y); -}, -resize : function (e) { - var w, h, r = e.width / e.height; - w = Math.max(e.width + e.dX, Math.min(this.minWidth, this.x.full)); - if (this.isImage && Math.abs(w - this.x.full) < 12) w = this.x.full; - h = w / r; - if (h < Math.min(this.minHeight, this.y.full)) { - h = Math.min(this.minHeight, this.y.full); - if (this.isImage) w = h * r; - } - this.resizeTo(w, h); -}, -resizeTo: function(w, h) { - this.y.setSize(h); - this.x.setSize(w); - this.wrapper.style.height = this.y.get('wsize') +'px'; -}, - -close : function() { - if (this.isClosing || !this.isExpanded) return; - if (this.transitions[1] == 'crossfade' && hs.upcoming) { - hs.getExpander(hs.upcoming).cancelLoading(); - hs.upcoming = null; - } - this.isClosing = true; - if (this.slideshow && !hs.upcoming) this.slideshow.pause(); - - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - - try { - this.content.style.cursor = 'default'; - this.changeSize( - 0, { - wrapper: { - width : this.x.t, - height : this.y.t, - left: this.x.tpos - this.x.cb + this.x.tb, - top: this.y.tpos - this.y.cb + this.y.tb - }, - content: { - left: 0, - top: 0, - width: this.x.t, - height: this.y.t - } - }, hs.restoreDuration - ); - } catch (e) { this.afterClose(); } -}, - -createOverlay : function (o) { - var el = o.overlayId, - relToVP = (o.relativeTo == 'viewport' && !/panel$/.test(o.position)); - if (typeof el == 'string') el = hs.getNode(el); - if (o.html) el = hs.createElement('div', { innerHTML: o.html }); - if (!el || typeof el == 'string') return; - el.style.display = 'block'; - o.hsId = o.hsId || o.overlayId; - if (this.transitions[1] == 'crossfade' && this.reuseOverlay(o, el)) return; - this.genOverlayBox(); - var width = o.width && /^[0-9]+(px|%)$/.test(o.width) ? o.width : 'auto'; - if (/^(left|right)panel$/.test(o.position) && !/^[0-9]+px$/.test(o.width)) width = '200px'; - var overlay = hs.createElement( - 'div', { - id: 'hsId'+ hs.idCounter++, - hsId: o.hsId - }, { - position: 'absolute', - visibility: 'hidden', - width: width, - direction: hs.lang.cssDirection || '', - opacity: 0 - }, - relToVP ? hs.viewport :this.overlayBox, - true - ); - if (relToVP) overlay.hsKey = this.key; - - overlay.appendChild(el); - hs.extend(overlay, { - opacity: 1, - offsetX: 0, - offsetY: 0, - dur: (o.fade === 0 || o.fade === false || (o.fade == 2 && hs.ie)) ? 0 : 250 - }); - hs.extend(overlay, o); - - - if (this.gotOverlays) { - this.positionOverlay(overlay); - if (!overlay.hideOnMouseOut || this.mouseIsOver) - hs.animate(overlay, { opacity: overlay.opacity }, overlay.dur); - } - hs.push(this.overlays, hs.idCounter - 1); -}, -positionOverlay : function(overlay) { - var p = overlay.position || 'middle center', - relToVP = (overlay.relativeTo == 'viewport'), - offX = overlay.offsetX, - offY = overlay.offsetY; - if (relToVP) { - hs.viewport.style.display = 'block'; - overlay.hsKey = this.key; - if (overlay.offsetWidth > overlay.parentNode.offsetWidth) - overlay.style.width = '100%'; - } else - if (overlay.parentNode != this.overlayBox) this.overlayBox.appendChild(overlay); - if (/left$/.test(p)) overlay.style.left = offX +'px'; - - if (/center$/.test(p)) hs.setStyles (overlay, { - left: '50%', - marginLeft: (offX - Math.round(overlay.offsetWidth / 2)) +'px' - }); - - if (/right$/.test(p)) overlay.style.right = - offX +'px'; - - if (/^leftpanel$/.test(p)) { - hs.setStyles(overlay, { - right: '100%', - marginRight: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p1 = overlay.offsetWidth; - - } else if (/^rightpanel$/.test(p)) { - hs.setStyles(overlay, { - left: '100%', - marginLeft: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p2 = overlay.offsetWidth; - } - var parOff = overlay.parentNode.offsetHeight; - overlay.style.height = 'auto'; - if (relToVP && overlay.offsetHeight > parOff) - overlay.style.height = hs.ieLt7 ? parOff +'px' : '100%'; - - if (/^top/.test(p)) overlay.style.top = offY +'px'; - if (/^middle/.test(p)) hs.setStyles (overlay, { - top: '50%', - marginTop: (offY - Math.round(overlay.offsetHeight / 2)) +'px' - }); - if (/^bottom/.test(p)) overlay.style.bottom = - offY +'px'; - if (/^above$/.test(p)) { - hs.setStyles(overlay, { - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - bottom: '100%', - marginBottom: this.y.cb +'px', - width: 'auto' - }); - this.y.p1 = overlay.offsetHeight; - - } else if (/^below$/.test(p)) { - hs.setStyles(overlay, { - position: 'relative', - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - top: '100%', - marginTop: this.y.cb +'px', - width: 'auto' - }); - this.y.p2 = overlay.offsetHeight; - overlay.style.position = 'absolute'; - } -}, - -getOverlays : function() { - this.getInline(['heading', 'caption'], true); - this.getNumber(); - if (this.heading && this.dragByHeading) this.heading.className += ' highslide-move'; - if (hs.showCredits) this.writeCredits(); - for (var i = 0; i < hs.overlays.length; i++) { - var o = hs.overlays[i], tId = o.thumbnailId, sg = o.slideshowGroup; - if ((!tId && !sg) || (tId && tId == this.thumbsUserSetId) - || (sg && sg === this.slideshowGroup)) { - this.createOverlay(o); - } - } - var os = []; - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - if (/panel$/.test(o.position)) this.positionOverlay(o); - else hs.push(os, o); - } - for (var i = 0; i < os.length; i++) this.positionOverlay(os[i]); - this.gotOverlays = true; -}, -genOverlayBox : function() { - if (!this.overlayBox) this.overlayBox = hs.createElement ( - 'div', { - className: this.wrapperClassName - }, { - position : 'absolute', - width: (this.x.size || (this.useBox ? this.width : null) - || this.x.full) +'px', - height: (this.y.size || this.y.full) +'px', - visibility : 'hidden', - overflow : 'hidden', - zIndex : hs.ie ? 4 : 'auto' - }, - hs.container, - true - ); -}, -sizeOverlayBox : function(doWrapper, doPanels) { - var overlayBox = this.overlayBox, - x = this.x, - y = this.y; - hs.setStyles( overlayBox, { - width: x.size +'px', - height: y.size +'px' - }); - if (doWrapper || doPanels) { - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - var ie6 = (hs.ieLt7 || document.compatMode == 'BackCompat'); - if (o && /^(above|below)$/.test(o.position)) { - if (ie6) { - o.style.width = (overlayBox.offsetWidth + 2 * x.cb - + x.p1 + x.p2) +'px'; - } - y[o.position == 'above' ? 'p1' : 'p2'] = o.offsetHeight; - } - if (o && ie6 && /^(left|right)panel$/.test(o.position)) { - o.style.height = (overlayBox.offsetHeight + 2* y.cb) +'px'; - } - } - } - if (doWrapper) { - hs.setStyles(this.content, { - top: y.p1 +'px' - }); - hs.setStyles(overlayBox, { - top: (y.p1 + y.cb) +'px' - }); - } -}, - -showOverlays : function() { - var b = this.overlayBox; - b.className = ''; - hs.setStyles(b, { - top: (this.y.p1 + this.y.cb) +'px', - left: (this.x.p1 + this.x.cb) +'px', - overflow : 'visible' - }); - if (hs.safari) b.style.visibility = 'visible'; - this.wrapper.appendChild (b); - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - o.style.zIndex = o.zIndex || 4; - if (!o.hideOnMouseOut || this.mouseIsOver) { - o.style.visibility = 'visible'; - hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: o.opacity }, o.dur); - } - } -}, - -destroyOverlays : function() { - if (!this.overlays.length) return; - if (this.slideshow) { - var c = this.slideshow.controls; - if (c && hs.getExpander(c) == this) c.parentNode.removeChild(c); - } - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - if (o && o.parentNode == hs.viewport && hs.getExpander(o) == this) hs.discardElement(o); - } - hs.discardElement(this.overlayBox); -}, - - - -createFullExpand : function () { - if (this.slideshow && this.slideshow.controls) { - this.slideshow.enable('full-expand'); - return; - } - this.fullExpandLabel = hs.createElement( - 'a', { - href: 'javascript:hs.expanders['+ this.key +'].doFullExpand();', - title: hs.lang.fullExpandTitle, - className: 'highslide-full-expand' - } - ); - - this.createOverlay({ - overlayId: this.fullExpandLabel, - position: hs.fullExpandPosition, - hideOnMouseOut: true, - opacity: hs.fullExpandOpacity - }); -}, - -doFullExpand : function () { - try { - if (this.fullExpandLabel) hs.discardElement(this.fullExpandLabel); - - this.focus(); - var xSize = this.x.size, - ySize = this.y.size; - this.resizeTo(this.x.full, this.y.full); - - var xpos = this.x.pos - (this.x.size - xSize) / 2; - if (xpos < hs.marginLeft) xpos = hs.marginLeft; - - var ypos = this.y.pos - (this.y.size - ySize) / 2; - if (ypos < hs.marginTop) ypos = hs.marginTop; - - this.moveTo(xpos, ypos); - this.doShowHide('hidden'); - - } catch (e) { - this.error(e); - } -}, - - -afterClose : function () { - this.a.className = this.a.className.replace('highslide-active-anchor', ''); - - this.doShowHide('visible'); - if (this.outline && this.outlineWhileAnimating) this.outline.destroy(); - - hs.discardElement(this.wrapper); - this.destroyOverlays(); - if (!hs.viewport.childNodes.length) hs.viewport.style.display = 'none'; - - if (this.dimmingOpacity) hs.undim(this.key); - hs.expanders[this.key] = null; - hs.reOrder(); -} - -}; - - -hs.Slideshow = function (expKey, options) { - if (hs.dynamicallyUpdateAnchors !== false) hs.updateAnchors(); - this.expKey = expKey; - for (var x in options) this[x] = options[x]; - if (this.useControls) this.getControls(); - if (this.thumbstrip) this.thumbstrip = hs.Thumbstrip(this); -}; -hs.Slideshow.prototype = { -getControls: function() { - this.controls = hs.createElement('div', { innerHTML: hs.replaceLang(hs.skin.controls) }, - null, hs.container); - - var buttons = ['play', 'pause', 'previous', 'next', 'move', 'full-expand', 'close']; - this.btn = {}; - var pThis = this; - for (var i = 0; i < buttons.length; i++) { - this.btn[buttons[i]] = hs.getElementByClass(this.controls, 'li', 'highslide-'+ buttons[i]); - this.enable(buttons[i]); - } - this.btn.pause.style.display = 'none'; - //this.disable('full-expand'); -}, -checkFirstAndLast: function() { - if (this.repeat || !this.controls) return; - var exp = hs.expanders[this.expKey], - cur = exp.getAnchorIndex(), - re = /disabled$/; - if (cur == 0) - this.disable('previous'); - else if (re.test(this.btn.previous.getElementsByTagName('a')[0].className)) - this.enable('previous'); - if (cur + 1 == hs.anchors.groups[exp.slideshowGroup || 'none'].length) { - this.disable('next'); - this.disable('play'); - } else if (re.test(this.btn.next.getElementsByTagName('a')[0].className)) { - this.enable('next'); - this.enable('play'); - } -}, -enable: function(btn) { - if (!this.btn) return; - var sls = this, a = this.btn[btn].getElementsByTagName('a')[0], re = /disabled$/; - a.onclick = function() { - sls[btn](); - return false; - }; - if (re.test(a.className)) a.className = a.className.replace(re, ''); -}, -disable: function(btn) { - if (!this.btn) return; - var a = this.btn[btn].getElementsByTagName('a')[0]; - a.onclick = function() { return false; }; - if (!/disabled$/.test(a.className)) a.className += ' disabled'; -}, -hitSpace: function() { - if (this.autoplay) this.pause(); - else this.play(); -}, -play: function(wait) { - if (this.btn) { - this.btn.play.style.display = 'none'; - this.btn.pause.style.display = ''; - } - - this.autoplay = true; - if (!wait) hs.next(this.expKey); -}, -pause: function() { - if (this.btn) { - this.btn.pause.style.display = 'none'; - this.btn.play.style.display = ''; - } - - clearTimeout(this.autoplay); - this.autoplay = null; -}, -previous: function() { - this.pause(); - hs.previous(this.btn.previous); -}, -next: function() { - this.pause(); - hs.next(this.btn.next); -}, -move: function() {}, -'full-expand': function() { - hs.getExpander().doFullExpand(); -}, -close: function() { - hs.close(this.btn.close); -} -}; -hs.Thumbstrip = function(slideshow) { - function add (exp) { - hs.extend(options || {}, { - overlayId: dom, - hsId: 'thumbstrip', - className: 'highslide-thumbstrip-'+ mode +'-overlay ' + (options.className || '') - }); - if (hs.ieLt7) options.fade = 0; - exp.createOverlay(options); - hs.setStyles(dom.parentNode, { overflow: 'hidden' }); - }; - - function scroll (delta) { - selectThumb(undefined, Math.round(delta * dom[isX ? 'offsetWidth' : 'offsetHeight'] * 0.7)); - }; - - function selectThumb (i, scrollBy) { - if (i === undefined) for (var j = 0; j < group.length; j++) { - if (group[j] == hs.expanders[slideshow.expKey].a) { - i = j; - break; - } - } - if (i === undefined) return; - var as = dom.getElementsByTagName('a'), - active = as[i], - cell = active.parentNode, - left = isX ? 'Left' : 'Top', - right = isX ? 'Right' : 'Bottom', - width = isX ? 'Width' : 'Height', - offsetLeft = 'offset' + left, - offsetWidth = 'offset' + width, - overlayWidth = div.parentNode.parentNode[offsetWidth], - minTblPos = overlayWidth - table[offsetWidth], - curTblPos = parseInt(table.style[isX ? 'left' : 'top']) || 0, - tblPos = curTblPos, - mgnRight = 20; - if (scrollBy !== undefined) { - tblPos = curTblPos - scrollBy; - - if (minTblPos > 0) minTblPos = 0; - if (tblPos > 0) tblPos = 0; - if (tblPos < minTblPos) tblPos = minTblPos; - - - } else { - for (var j = 0; j < as.length; j++) as[j].className = ''; - active.className = 'highslide-active-anchor'; - var activeLeft = i > 0 ? as[i - 1].parentNode[offsetLeft] : cell[offsetLeft], - activeRight = cell[offsetLeft] + cell[offsetWidth] + - (as[i + 1] ? as[i + 1].parentNode[offsetWidth] : 0); - if (activeRight > overlayWidth - curTblPos) tblPos = overlayWidth - activeRight; - else if (activeLeft < -curTblPos) tblPos = -activeLeft; - } - var markerPos = cell[offsetLeft] + (cell[offsetWidth] - marker[offsetWidth]) / 2 + tblPos; - hs.animate(table, isX ? { left: tblPos } : { top: tblPos }, null, 'easeOutQuad'); - hs.animate(marker, isX ? { left: markerPos } : { top: markerPos }, null, 'easeOutQuad'); - scrollUp.style.display = tblPos < 0 ? 'block' : 'none'; - scrollDown.style.display = (tblPos > minTblPos) ? 'block' : 'none'; - - }; - - - // initialize - var group = hs.anchors.groups[hs.expanders[slideshow.expKey].slideshowGroup || 'none'], - options = slideshow.thumbstrip, - mode = options.mode || 'horizontal', - floatMode = (mode == 'float'), - tree = floatMode ? ['div', 'ul', 'li', 'span'] : ['table', 'tbody', 'tr', 'td'], - isX = (mode == 'horizontal'), - dom = hs.createElement('div', { - className: 'highslide-thumbstrip highslide-thumbstrip-'+ mode, - innerHTML: - '
    '+ - '<'+ tree[0] +'><'+ tree[1] +'>
    '+ - '
    '+ - '
    '+ - '
    ' - }, { - display: 'none' - }, hs.container), - domCh = dom.childNodes, - div = domCh[0], - scrollUp = domCh[1], - scrollDown = domCh[2], - marker = domCh[3], - table = div.firstChild, - tbody = dom.getElementsByTagName(tree[1])[0], - tr; - for (var i = 0; i < group.length; i++) { - if (i == 0 || !isX) tr = hs.createElement(tree[2], null, null, tbody); - (function(){ - var a = group[i], - cell = hs.createElement(tree[3], null, null, tr), - pI = i; - hs.createElement('a', { - href: a.href, - title: a.title, - onclick: function() { - if (/highslide-active-anchor/.test(this.className)) return false; - hs.getExpander(this).focus(); - return hs.transit(a); - }, - innerHTML: hs.stripItemFormatter ? hs.stripItemFormatter(a) : a.innerHTML - }, null, cell); - })(); - } - if (!floatMode) { - scrollUp.onclick = function () { scroll(-1); }; - scrollDown.onclick = function() { scroll(1); }; - hs.addEventListener(tbody, document.onmousewheel !== undefined ? - 'mousewheel' : 'DOMMouseScroll', function(e) { - var delta = 0; - e = e || window.event; - if (e.wheelDelta) { - delta = e.wheelDelta/120; - if (hs.opera) delta = -delta; - } else if (e.detail) { - delta = -e.detail/3; - } - if (delta) scroll(-delta * 0.2); - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - }); - } - - return { - add: add, - selectThumb: selectThumb - } -}; -hs.langDefaults = hs.lang; -// history -var HsExpander = hs.Expander; -if (hs.ie && window == window.top) { - (function () { - try { - document.documentElement.doScroll('left'); - } catch (e) { - setTimeout(arguments.callee, 50); - return; - } - hs.ready(); - })(); -} -hs.addEventListener(document, 'DOMContentLoaded', hs.ready); -hs.addEventListener(window, 'load', hs.ready); - -// set handlers -hs.addEventListener(document, 'ready', function() { - if (hs.expandCursor || hs.dimmingOpacity) { - var style = hs.createElement('style', { type: 'text/css' }, null, - document.getElementsByTagName('HEAD')[0]), - backCompat = document.compatMode == 'BackCompat'; - - - function addRule(sel, dec) { - if (hs.ie && (hs.uaVersion < 9 || backCompat)) { - var last = document.styleSheets[document.styleSheets.length - 1]; - if (typeof(last.addRule) == "object") last.addRule(sel, dec); - } else { - style.appendChild(document.createTextNode(sel + " {" + dec + "}")); - } - } - function fix(prop) { - return 'expression( ( ( ignoreMe = document.documentElement.'+ prop + - ' ? document.documentElement.'+ prop +' : document.body.'+ prop +' ) ) + \'px\' );'; - } - if (hs.expandCursor) addRule ('.highslide img', - 'cursor: url('+ hs.graphicsDir + hs.expandCursor +'), pointer !important;'); - addRule ('.highslide-viewport-size', - hs.ie && (hs.uaVersion < 7 || backCompat) ? - 'position: absolute; '+ - 'left:'+ fix('scrollLeft') + - 'top:'+ fix('scrollTop') + - 'width:'+ fix('clientWidth') + - 'height:'+ fix('clientHeight') : - 'position: fixed; width: 100%; height: 100%; left: 0; top: 0'); - } -}); -hs.addEventListener(window, 'resize', function() { - hs.getPageSize(); - if (hs.viewport) for (var i = 0; i < hs.viewport.childNodes.length; i++) { - var node = hs.viewport.childNodes[i], - exp = hs.getExpander(node); - exp.positionOverlay(node); - if (node.hsId == 'thumbstrip') exp.slideshow.thumbstrip.selectThumb(); - } -}); -hs.addEventListener(document, 'mousemove', function(e) { - hs.mouse = { x: e.clientX, y: e.clientY }; -}); -hs.addEventListener(document, 'mousedown', hs.mouseClickHandler); -hs.addEventListener(document, 'mouseup', hs.mouseClickHandler); - -hs.addEventListener(document, 'ready', hs.getAnchors); -hs.addEventListener(window, 'load', hs.preloadImages); -} diff --git a/DeveloperAdoption/public/static/highslide/highslide/highslide-with-gallery.min.js b/DeveloperAdoption/public/static/highslide/highslide/highslide-with-gallery.min.js deleted file mode 100644 index 6e634d6..0000000 --- a/DeveloperAdoption/public/static/highslide/highslide/highslide-with-gallery.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Name: Highslide JS - * Version: 4.1.13 (2011-10-06) - * Config: default +slideshow +positioning +transitions +viewport +thumbstrip - * Author: Torstein Hønsi - * Support: www.highslide.com/support - * License: www.highslide.com/#license - */ -if(!hs){var hs={lang:{cssDirection:"ltr",loadingText:"Loading...",loadingTitle:"Click to cancel",focusTitle:"Click to bring to front",fullExpandTitle:"Expand to actual size (f)",creditsText:"Powered by Highslide JS",creditsTitle:"Go to the Highslide JS homepage",previousText:"Previous",nextText:"Next",moveText:"Move",closeText:"Close",closeTitle:"Close (esc)",resizeTitle:"Resize",playText:"Play",playTitle:"Play slideshow (spacebar)",pauseText:"Pause",pauseTitle:"Pause slideshow (spacebar)",previousTitle:"Previous (arrow left)",nextTitle:"Next (arrow right)",moveTitle:"Move",fullExpandText:"1:1",number:"Image %1 of %2",restoreTitle:"Click to close image, click and drag to move. Use arrow keys for next and previous."},graphicsDir:"highslide/graphics/",expandCursor:"zoomin.cur",restoreCursor:"zoomout.cur",expandDuration:250,restoreDuration:250,marginLeft:15,marginRight:15,marginTop:15,marginBottom:15,zIndexCounter:1001,loadingOpacity:0.75,allowMultipleInstances:true,numberOfImagesToPreload:5,outlineWhileAnimating:2,outlineStartOffset:3,padToMinWidth:false,fullExpandPosition:"bottom right",fullExpandOpacity:1,showCredits:true,creditsHref:"http://highslide.com/",creditsTarget:"_self",enableKeyListener:true,openerTagNames:["a"],transitions:[],transitionDuration:250,dimmingOpacity:0,dimmingDuration:50,anchor:"auto",align:"auto",targetX:null,targetY:null,dragByHeading:true,minWidth:200,minHeight:200,allowSizeReduction:true,outlineType:"drop-shadow",skin:{controls:''},preloadTheseImages:[],continuePreloading:true,expanders:[],overrides:["allowSizeReduction","useBox","anchor","align","targetX","targetY","outlineType","outlineWhileAnimating","captionId","captionText","captionEval","captionOverlay","headingId","headingText","headingEval","headingOverlay","creditsPosition","dragByHeading","autoplay","numberPosition","transitions","dimmingOpacity","width","height","wrapperClassName","minWidth","minHeight","maxWidth","maxHeight","pageOrigin","slideshowGroup","easing","easingClose","fadeInOut","src"],overlays:[],idCounter:0,oPos:{x:["leftpanel","left","center","right","rightpanel"],y:["above","top","middle","bottom","below"]},mouse:{},headingOverlay:{},captionOverlay:{},timers:[],slideshows:[],pendingOutlines:{},clones:{},onReady:[],uaVersion:/Trident\/4\.0/.test(navigator.userAgent)?8:parseFloat((navigator.userAgent.toLowerCase().match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1]),ie:(document.all&&!window.opera),safari:/Safari/.test(navigator.userAgent),geckoMac:/Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent),$:function(a){if(a){return document.getElementById(a)}},push:function(a,b){a[a.length]=b},createElement:function(a,f,e,d,c){var b=document.createElement(a);if(f){hs.extend(b,f)}if(c){hs.setStyles(b,{padding:0,border:"none",margin:0})}if(e){hs.setStyles(b,e)}if(d){d.appendChild(b)}return b},extend:function(b,c){for(var a in c){b[a]=c[a]}return b},setStyles:function(b,c){for(var a in c){if(hs.ieLt9&&a=="opacity"){if(c[a]>0.99){b.style.removeAttribute("filter")}else{b.style.filter="alpha(opacity="+(c[a]*100)+")"}}else{b.style[a]=c[a]}}},animate:function(f,a,d){var c,g,j;if(typeof d!="object"||d===null){var i=arguments;d={duration:i[2],easing:i[3],complete:i[4]}}if(typeof d.duration!="number"){d.duration=250}d.easing=Math[d.easing]||Math.easeInQuad;d.curAnim=hs.extend({},a);for(var b in a){var h=new hs.fx(f,d,b);c=parseFloat(hs.css(f,b))||0;g=parseFloat(a[b]);j=b!="opacity"?"px":"";h.custom(c,g,j)}},css:function(a,c){if(a.style[c]){return a.style[c]}else{if(document.defaultView){return document.defaultView.getComputedStyle(a,null).getPropertyValue(c)}else{if(c=="opacity"){c="filter"}var b=a.currentStyle[c.replace(/\-(\w)/g,function(e,d){return d.toUpperCase()})];if(c=="filter"){b=b.replace(/alpha\(opacity=([0-9]+)\)/,function(e,d){return d/100})}return b===""?1:b}}},getPageSize:function(){var f=document,b=window,e=f.compatMode&&f.compatMode!="BackCompat"?f.documentElement:f.body,g=hs.ie&&(hs.uaVersion<9||typeof pageXOffset=="undefined");var c=g?e.clientWidth:(f.documentElement.clientWidth||self.innerWidth),a=g?e.clientHeight:self.innerHeight;hs.page={width:c,height:a,scrollLeft:g?e.scrollLeft:pageXOffset,scrollTop:g?e.scrollTop:pageYOffset};return hs.page},getPosition:function(a){var b={x:a.offsetLeft,y:a.offsetTop};while(a.offsetParent){a=a.offsetParent;b.x+=a.offsetLeft;b.y+=a.offsetTop;if(a!=document.body&&a!=document.documentElement){b.x-=a.scrollLeft;b.y-=a.scrollTop}}return b},expand:function(b,g,d,c){if(!b){b=hs.createElement("a",null,{display:"none"},hs.container)}if(typeof b.getParams=="function"){return g}try{new hs.Expander(b,g,d);return false}catch(f){return true}},getElementByClass:function(e,c,d){var b=e.getElementsByTagName(c);for(var a=0;ac){c=f;b=d}}}if(b==-1){hs.focusKey=-1}else{a[b].focus()}},getParam:function(b,d){b.getParams=b.onclick;var c=b.getParams?b.getParams():null;b.getParams=null;return(c&&typeof c[d]!="undefined")?c[d]:(typeof hs[d]!="undefined"?hs[d]:null)},getSrc:function(b){var c=hs.getParam(b,"src");if(c){return c}return b.href},getNode:function(e){var c=hs.$(e),d=hs.clones[e],b={};if(!c&&!d){return null}if(!d){d=c.cloneNode(true);d.id="";hs.clones[e]=d;return c}else{return d.cloneNode(true)}},discardElement:function(a){if(a){hs.garbageBin.appendChild(a)}hs.garbageBin.innerHTML=""},dim:function(d){if(!hs.dimmer){a=true;hs.dimmer=hs.createElement("div",{className:"highslide-dimming highslide-viewport-size",owner:"",onclick:function(){hs.close()}},{visibility:"visible",opacity:0},hs.container,true);if(/(Android|iPad|iPhone|iPod)/.test(navigator.userAgent)){var b=document.body;function c(){hs.setStyles(hs.dimmer,{width:b.scrollWidth+"px",height:b.scrollHeight+"px"})}c();hs.addEventListener(window,"resize",c)}}hs.dimmer.style.display="";var a=hs.dimmer.owner=="";hs.dimmer.owner+="|"+d.key;if(a){if(hs.geckoMac&&hs.dimmingGeckoFix){hs.setStyles(hs.dimmer,{background:"url("+hs.graphicsDir+"geckodimmer.png)",opacity:1})}else{hs.animate(hs.dimmer,{opacity:d.dimmingOpacity},hs.dimmingDuration)}}},undim:function(a){if(!hs.dimmer){return}if(typeof a!="undefined"){hs.dimmer.owner=hs.dimmer.owner.replace("|"+a,"")}if((typeof a!="undefined"&&hs.dimmer.owner!="")||(hs.upcoming&&hs.getParam(hs.upcoming,"dimmingOpacity"))){return}if(hs.geckoMac&&hs.dimmingGeckoFix){hs.dimmer.style.display="none"}else{hs.animate(hs.dimmer,{opacity:0},hs.dimmingDuration,null,function(){hs.dimmer.style.display="none"})}},transit:function(a,d){var b=d||hs.getExpander();d=b;if(hs.upcoming){return false}else{hs.last=b}hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler);try{hs.upcoming=a;a.onclick()}catch(c){hs.last=hs.upcoming=null}try{if(!a||d.transitions[1]!="crossfade"){d.close()}}catch(c){}return false},previousOrNext:function(a,c){var b=hs.getExpander(a);if(b){return hs.transit(b.getAdjacentAnchor(c),b)}else{return false}},previous:function(a){return hs.previousOrNext(a,-1)},next:function(a){return hs.previousOrNext(a,1)},keyHandler:function(a){if(!a){a=window.event}if(!a.target){a.target=a.srcElement}if(typeof a.target.form!="undefined"){return true}var b=hs.getExpander();var c=null;switch(a.keyCode){case 70:if(b){b.doFullExpand()}return true;case 32:c=2;break;case 34:case 39:case 40:c=1;break;case 8:case 33:case 37:case 38:c=-1;break;case 27:case 13:c=0}if(c!==null){if(c!=2){hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler)}if(!hs.enableKeyListener){return true}if(a.preventDefault){a.preventDefault()}else{a.returnValue=false}if(b){if(c==0){b.close()}else{if(c==2){if(b.slideshow){b.slideshow.hitSpace()}}else{if(b.slideshow){b.slideshow.pause()}hs.previousOrNext(b.key,c)}}return false}}return true},registerOverlay:function(a){hs.push(hs.overlays,hs.extend(a,{hsId:"hsId"+hs.idCounter++}))},addSlideshow:function(b){var d=b.slideshowGroup;if(typeof d=="object"){for(var c=0;c1){return true}if(!d.target){d.target=d.srcElement}var b=d.target;while(b.parentNode&&!(/highslide-(image|move|html|resize)/.test(b.className))){b=b.parentNode}var f=hs.getExpander(b);if(f&&(f.isClosing||!f.isExpanded)){return true}if(f&&d.type=="mousedown"){if(d.target.form){return true}var a=b.className.match(/highslide-(image|move|resize)/);if(a){hs.dragArgs={exp:f,type:a[1],left:f.x.pos,width:f.x.size,top:f.y.pos,height:f.y.size,clickX:d.clientX,clickY:d.clientY};hs.addEventListener(document,"mousemove",hs.dragHandler);if(d.preventDefault){d.preventDefault()}if(/highslide-(image|html)-blur/.test(f.content.className)){f.focus();hs.hasFocused=true}return false}}else{if(d.type=="mouseup"){hs.removeEventListener(document,"mousemove",hs.dragHandler);if(hs.dragArgs){if(hs.styleRestoreCursor&&hs.dragArgs.type=="image"){hs.dragArgs.exp.content.style.cursor=hs.styleRestoreCursor}var c=hs.dragArgs.hasDragged;if(!c&&!hs.hasFocused&&!/(move|resize)/.test(hs.dragArgs.type)){f.close()}else{if(c||(!c&&hs.hasHtmlExpanders)){hs.dragArgs.exp.doShowHide("hidden")}}hs.hasFocused=false;hs.dragArgs=null}else{if(/highslide-image-blur/.test(b.className)){b.style.cursor=hs.styleRestoreCursor}}}}return false},dragHandler:function(c){if(!hs.dragArgs){return true}if(!c){c=window.event}var b=hs.dragArgs,d=b.exp;b.dX=c.clientX-b.clickX;b.dY=c.clientY-b.clickY;var f=Math.sqrt(Math.pow(b.dX,2)+Math.pow(b.dY,2));if(!b.hasDragged){b.hasDragged=(b.type!="image"&&f>0)||(f>(hs.dragSensitivity||5))}if(b.hasDragged&&c.clientX>5&&c.clientY>5){if(b.type=="resize"){d.resize(b)}else{d.moveTo(b.left+b.dX,b.top+b.dY);if(b.type=="image"){d.content.style.cursor="move"}}}return false},wrapperMouseHandler:function(c){try{if(!c){c=window.event}var b=/mouseover/i.test(c.type);if(!c.target){c.target=c.srcElement}if(!c.relatedTarget){c.relatedTarget=b?c.fromElement:c.toElement}var d=hs.getExpander(c.target);if(!d.isExpanded){return}if(!d||!c.relatedTarget||hs.getExpander(c.relatedTarget,true)==d||hs.dragArgs){return}for(var a=0;a=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var a=true;for(var b in this.options.curAnim){if(this.options.curAnim[b]!==true){a=false}}if(a){if(this.options.complete){this.options.complete.call(this.elem)}}return false}else{var e=c-this.startTime;this.state=e/this.options.duration;this.pos=this.options.easing(e,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};hs.extend(hs.fx,{step:{opacity:function(a){hs.setStyles(a.elem,{opacity:a.now})},_default:function(a){try{if(a.elem.style&&a.elem.style[a.prop]!=null){a.elem.style[a.prop]=a.now+a.unit}else{a.elem[a.prop]=a.now}}catch(b){}}}});hs.Outline=function(g,e){this.onLoad=e;this.outlineType=g;var a=hs.uaVersion,f;this.hasAlphaImageLoader=hs.ie&&hs.uaVersion<7;if(!g){if(e){e()}return}hs.init();this.table=hs.createElement("table",{cellSpacing:0},{visibility:"hidden",position:"absolute",borderCollapse:"collapse",width:0},hs.container,true);var b=hs.createElement("tbody",null,null,this.table,1);this.td=[];for(var c=0;c<=8;c++){if(c%3==0){f=hs.createElement("tr",null,{height:"auto"},b,true)}this.td[c]=hs.createElement("td",null,null,f,true);var d=c!=4?{lineHeight:0,fontSize:0}:{position:"relative"};hs.setStyles(this.td[c],d)}this.td[4].className=g+" highslide-outline";this.preloadGraphic()};hs.Outline.prototype={preloadGraphic:function(){var b=hs.graphicsDir+(hs.outlinesDir||"outlines/")+this.outlineType+".png";var a=hs.safari&&hs.uaVersion<525?hs.container:null;this.graphic=hs.createElement("img",null,{position:"absolute",top:"-9999px"},a,true);var c=this;this.graphic.onload=function(){c.onGraphicLoad()};this.graphic.src=b},onGraphicLoad:function(){var d=this.offset=this.graphic.width/4,f=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],c={height:(2*d)+"px",width:(2*d)+"px"};for(var b=0;b<=8;b++){if(f[b]){if(this.hasAlphaImageLoader){var a=(b==1||b==7)?"100%":this.graphic.width+"px";var e=hs.createElement("div",null,{width:"100%",height:"100%",position:"relative",overflow:"hidden"},this.td[b],true);hs.createElement("div",null,{filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+this.graphic.src+"')",position:"absolute",width:a,height:this.graphic.height+"px",left:(f[b][0]*d)+"px",top:(f[b][1]*d)+"px"},e,true)}else{hs.setStyles(this.td[b],{background:"url("+this.graphic.src+") "+(f[b][0]*d)+"px "+(f[b][1]*d)+"px"})}if(window.opera&&(b==3||b==5)){hs.createElement("div",null,c,this.td[b],true)}hs.setStyles(this.td[b],c)}}this.graphic=null;if(hs.pendingOutlines[this.outlineType]){hs.pendingOutlines[this.outlineType].destroy()}hs.pendingOutlines[this.outlineType]=this;if(this.onLoad){this.onLoad()}},setPosition:function(g,e,c,b,f){var d=this.exp,a=d.wrapper.style,e=e||0,g=g||{x:d.x.pos+e,y:d.y.pos+e,w:d.x.get("wsize")-2*e,h:d.y.get("wsize")-2*e};if(c){this.table.style.visibility=(g.h>=4*this.offset)?"visible":"hidden"}hs.setStyles(this.table,{left:(g.x-this.offset)+"px",top:(g.y-this.offset)+"px",width:(g.w+2*this.offset)+"px"});g.w-=2*this.offset;g.h-=2*this.offset;hs.setStyles(this.td[4],{width:g.w>=0?g.w+"px":0,height:g.h>=0?g.h+"px":0});if(this.hasAlphaImageLoader){this.td[3].style.height=this.td[5].style.height=this.td[4].style.height}},destroy:function(a){if(a){this.table.style.visibility="hidden"}else{hs.discardElement(this.table)}}};hs.Dimension=function(b,a){this.exp=b;this.dim=a;this.ucwh=a=="x"?"Width":"Height";this.wh=this.ucwh.toLowerCase();this.uclt=a=="x"?"Left":"Top";this.lt=this.uclt.toLowerCase();this.ucrb=a=="x"?"Right":"Bottom";this.rb=this.ucrb.toLowerCase();this.p1=this.p2=0};hs.Dimension.prototype={get:function(a){switch(a){case"loadingPos":return this.tpos+this.tb+(this.t-hs.loading["offset"+this.ucwh])/2;case"loadingPosXfade":return this.pos+this.cb+this.p1+(this.size-hs.loading["offset"+this.ucwh])/2;case"wsize":return this.size+2*this.cb+this.p1+this.p2;case"fitsize":return this.clientSize-this.marginMin-this.marginMax;case"maxsize":return this.get("fitsize")-2*this.cb-this.p1-this.p2;case"opos":return this.pos-(this.exp.outline?this.exp.outline.offset:0);case"osize":return this.get("wsize")+(this.exp.outline?2*this.exp.outline.offset:0);case"imgPad":return this.imgSize?Math.round((this.size-this.imgSize)/2):0}},calcBorders:function(){this.cb=(this.exp.content["offset"+this.ucwh]-this.t)/2;this.marginMax=hs["margin"+this.ucrb]},calcThumb:function(){this.t=this.exp.el[this.wh]?parseInt(this.exp.el[this.wh]):this.exp.el["offset"+this.ucwh];this.tpos=this.exp.tpos[this.dim];this.tb=(this.exp.el["offset"+this.ucwh]-this.t)/2;if(this.tpos==0||this.tpos==-1){this.tpos=(hs.page[this.wh]/2)+hs.page["scroll"+this.uclt]}},calcExpanded:function(){var a=this.exp;this.justify="auto";if(a.align=="center"){this.justify="center"}else{if(new RegExp(this.lt).test(a.anchor)){this.justify=null}else{if(new RegExp(this.rb).test(a.anchor)){this.justify="max"}}}this.pos=this.tpos-this.cb+this.tb;if(this.maxHeight&&this.dim=="x"){a.maxWidth=Math.min(a.maxWidth||this.full,a.maxHeight*this.full/a.y.full)}this.size=Math.min(this.full,a["max"+this.ucwh]||this.full);this.minSize=a.allowSizeReduction?Math.min(a["min"+this.ucwh],this.full):this.full;if(a.isImage&&a.useBox){this.size=a[this.wh];this.imgSize=this.full}if(this.dim=="x"&&hs.padToMinWidth){this.minSize=a.minWidth}this.target=a["target"+this.dim.toUpperCase()];this.marginMin=hs["margin"+this.uclt];this.scroll=hs.page["scroll"+this.uclt];this.clientSize=hs.page[this.wh]},setSize:function(a){var b=this.exp;if(b.isImage&&(b.useBox||hs.padToMinWidth)){this.imgSize=a;this.size=Math.max(this.size,this.imgSize);b.content.style[this.lt]=this.get("imgPad")+"px"}else{this.size=a}b.content.style[this.wh]=a+"px";b.wrapper.style[this.wh]=this.get("wsize")+"px";if(b.outline){b.outline.setPosition()}if(this.dim=="x"&&b.overlayBox){b.sizeOverlayBox(true)}if(this.dim=="x"&&b.slideshow&&b.isImage){if(a==this.full){b.slideshow.disable("full-expand")}else{b.slideshow.enable("full-expand")}}},setPos:function(a){this.pos=a;this.exp.wrapper.style[this.lt]=a+"px";if(this.exp.outline){this.exp.outline.setPosition()}}};hs.Expander=function(k,f,b,l){if(document.readyState&&hs.ie&&!hs.isReady){hs.addEventListener(document,"ready",function(){new hs.Expander(k,f,b,l)});return}this.a=k;this.custom=b;this.contentType=l||"image";this.isImage=!this.isHtml;hs.continuePreloading=false;this.overlays=[];this.last=hs.last;hs.last=null;hs.init();var m=this.key=hs.expanders.length;for(var g=0;ga.scroll+a.clientSize-a.marginMax){a.pos=a.scroll+a.clientSize-a.size-a.marginMin-a.marginMax-a.p1-a.p2}if(a.pos(this.x.imgSize||this.x.size)){this.createFullExpand();if(this.overlays.length==1){this.sizeOverlayBox()}}}this.show()}catch(d){this.error(d)}},justify:function(f,b){var g,h=f.target,e=f==this.x?"x":"y";if(h&&h.match(/ /)){g=h.split(" ");h=g[0]}if(h&&hs.$(h)){f.pos=hs.getPosition(hs.$(h))[e];if(g&&g[1]&&g[1].match(/^[-]?[0-9]+px$/)){f.pos+=parseInt(g[1])}if(f.sizef.scroll+f.clientSize-f.marginMax){if(!b&&d&&a){f.size=Math.min(f.size,f.get(e=="y"?"fitsize":"maxsize"))}else{if(f.get("wsize")c){d=b*c;if(dthis.minHeight&&a.size>this.minWidth&&d.get("wsize")>d.get("fitsize")){d.size-=10;if(b){a.size=d.size*b}this.sizeOverlayBox(0,1);c=true}}return c},show:function(){var a=this.x,b=this.y;this.doShowHide("hidden");if(this.slideshow&&this.slideshow.thumbstrip){this.slideshow.thumbstrip.selectThumb()}this.changeSize(1,{wrapper:{width:a.get("wsize"),height:b.get("wsize"),left:a.pos,top:b.pos},content:{left:a.p1+a.get("imgPad"),top:b.p1+b.get("imgPad"),width:a.imgSize||a.size,height:b.imgSize||b.size}},hs.expandDuration)},changeSize:function(d,i,b){var k=this.transitions,e=d?(this.last?this.last.a:null):hs.upcoming,j=(k[1]&&e&&hs.getParam(e,"transitions")[1]==k[1])?k[1]:k[0];if(this[j]&&j!="expand"){this[j](d,i);return}if(this.outline&&!this.outlineWhileAnimating){if(d){this.outline.setPosition()}else{this.outline.destroy()}}if(!d){this.destroyOverlays()}var c=this,h=c.x,g=c.y,f=this.easing;if(!d){f=this.easingClose||f}var a=d?function(){if(c.outline){c.outline.table.style.visibility="visible"}setTimeout(function(){c.afterExpand()},50)}:function(){c.afterClose()};if(d){hs.setStyles(this.wrapper,{width:h.t+"px",height:g.t+"px"})}if(this.fadeInOut){hs.setStyles(this.wrapper,{opacity:d?0:1});hs.extend(i.wrapper,{opacity:d})}hs.animate(this.wrapper,i.wrapper,{duration:b,easing:f,step:function(n,l){if(c.outline&&c.outlineWhileAnimating&&l.prop=="top"){var m=d?l.pos:1-l.pos;var o={w:h.t+(h.get("wsize")-h.t)*m,h:g.t+(g.get("wsize")-g.t)*m,x:h.tpos+(h.pos-h.tpos)*m,y:g.tpos+(g.pos-g.tpos)*m};c.outline.setPosition(o,0,1)}}});hs.animate(this.content,i.content,b,f,a);if(d){this.wrapper.style.visibility="visible";this.content.style.visibility="visible";this.a.className+=" highslide-active-anchor"}},fade:function(f,h){this.outlineWhileAnimating=false;var c=this,j=f?hs.expandDuration:0;if(f){hs.animate(this.wrapper,h.wrapper,0);hs.setStyles(this.wrapper,{opacity:0,visibility:"visible"});hs.animate(this.content,h.content,0);this.content.style.visibility="visible";hs.animate(this.wrapper,{opacity:1},j,null,function(){c.afterExpand()})}if(this.outline){this.outline.table.style.zIndex=this.wrapper.style.zIndex;var b=f||-1,d=this.outline.offset,a=f?3:d,g=f?d:3;for(var e=a;b*e<=b*g;e+=b,j+=25){(function(){var i=f?g-e:a-e;setTimeout(function(){c.outline.setPosition(0,i,1)},j)})()}}if(f){}else{setTimeout(function(){if(c.outline){c.outline.destroy(c.preserveContent)}c.destroyOverlays();hs.animate(c.wrapper,{opacity:0},hs.restoreDuration,null,function(){c.afterClose()})},j)}},crossfade:function(g,m,o){if(!g){return}var f=this,p=this.last,l=this.x,k=this.y,d=p.x,b=p.y,a=this.wrapper,i=this.content,c=this.overlayBox;hs.removeEventListener(document,"mousemove",hs.dragHandler);hs.setStyles(i,{width:(l.imgSize||l.size)+"px",height:(k.imgSize||k.size)+"px"});if(c){c.style.overflow="visible"}this.outline=p.outline;if(this.outline){this.outline.exp=f}p.outline=null;var h=hs.createElement("div",{className:"highslide-"+this.contentType},{position:"absolute",zIndex:4,overflow:"hidden",display:"none"});var j={oldImg:p,newImg:this};for(var e in j){this[e]=j[e].content.cloneNode(1);hs.setStyles(this[e],{position:"absolute",border:0,visibility:"visible"});h.appendChild(this[e])}a.appendChild(h);if(c){c.className="";a.appendChild(c)}h.style.display="";p.content.style.display="none";if(hs.safari&&hs.uaVersion<525){this.wrapper.style.visibility="visible"}hs.animate(a,{width:l.size},{duration:hs.transitionDuration,step:function(u,r){var x=r.pos,q=1-x;var w,s={},t=["pos","size","p1","p2"];for(var v in t){w=t[v];s["x"+w]=Math.round(q*d[w]+x*l[w]);s["y"+w]=Math.round(q*b[w]+x*k[w]);s.ximgSize=Math.round(q*(d.imgSize||d.size)+x*(l.imgSize||l.size));s.ximgPad=Math.round(q*d.get("imgPad")+x*l.get("imgPad"));s.yimgSize=Math.round(q*(b.imgSize||b.size)+x*(k.imgSize||k.size));s.yimgPad=Math.round(q*b.get("imgPad")+x*k.get("imgPad"))}if(f.outline){f.outline.setPosition({x:s.xpos,y:s.ypos,w:s.xsize+s.xp1+s.xp2+2*l.cb,h:s.ysize+s.yp1+s.yp2+2*k.cb})}p.wrapper.style.clip="rect("+(s.ypos-b.pos)+"px, "+(s.xsize+s.xp1+s.xp2+s.xpos+2*d.cb-d.pos)+"px, "+(s.ysize+s.yp1+s.yp2+s.ypos+2*b.cb-b.pos)+"px, "+(s.xpos-d.pos)+"px)";hs.setStyles(i,{top:(s.yp1+k.get("imgPad"))+"px",left:(s.xp1+l.get("imgPad"))+"px",marginTop:(k.pos-s.ypos)+"px",marginLeft:(l.pos-s.xpos)+"px"});hs.setStyles(a,{top:s.ypos+"px",left:s.xpos+"px",width:(s.xp1+s.xp2+s.xsize+2*l.cb)+"px",height:(s.yp1+s.yp2+s.ysize+2*k.cb)+"px"});hs.setStyles(h,{width:(s.ximgSize||s.xsize)+"px",height:(s.yimgSize||s.ysize)+"px",left:(s.xp1+s.ximgPad)+"px",top:(s.yp1+s.yimgPad)+"px",visibility:"visible"});hs.setStyles(f.oldImg,{top:(b.pos-s.ypos+b.p1-s.yp1+b.get("imgPad")-s.yimgPad)+"px",left:(d.pos-s.xpos+d.p1-s.xp1+d.get("imgPad")-s.ximgPad)+"px"});hs.setStyles(f.newImg,{opacity:x,top:(k.pos-s.ypos+k.p1-s.yp1+k.get("imgPad")-s.yimgPad)+"px",left:(l.pos-s.xpos+l.p1-s.xp1+l.get("imgPad")-s.ximgPad)+"px"});if(c){hs.setStyles(c,{width:s.xsize+"px",height:s.ysize+"px",left:(s.xp1+l.cb)+"px",top:(s.yp1+k.cb)+"px"})}},complete:function(){a.style.visibility=i.style.visibility="visible";i.style.display="block";hs.discardElement(h);f.afterExpand();p.afterClose();f.last=null}})},reuseOverlay:function(d,c){if(!this.last){return false}for(var b=0;b'+b+""+this[this.numberPosition].innerHTML}}},initSlideshow:function(){if(!this.last){for(var c=0;cthis.x.get("opos")+this.x.get("osize"));var g=(k.y+k.hthis.y.get("opos")+this.y.get("osize"))}var d=hs.getWrapperKey(e[f]);if(!j&&!g&&d!=this.key){if(!h){e[f].setAttribute("hidden-by","["+this.key+"]");e[f].origProp=e[f].style[a];e[f].style[a]="hidden"}else{if(h.indexOf("["+this.key+"]")==-1){e[f].setAttribute("hidden-by",h+"["+this.key+"]")}}}else{if((h=="["+this.key+"]"||hs.focusKey==d)&&d!=this.key){e[f].setAttribute("hidden-by","");e[f].style[a]=e[f].origProp||""}else{if(h&&h.indexOf("["+this.key+"]")>-1){e[f].setAttribute("hidden-by",h.replace("["+this.key+"]",""))}}}}}}}},focus:function(){this.wrapper.style.zIndex=hs.zIndexCounter+=2;for(var a=0;ae.parentNode.offsetWidth){e.style.width="100%"}}else{if(e.parentNode!=this.overlayBox){this.overlayBox.appendChild(e)}}if(/left$/.test(f)){e.style.left=b+"px"}if(/center$/.test(f)){hs.setStyles(e,{left:"50%",marginLeft:(b-Math.round(e.offsetWidth/2))+"px"})}if(/right$/.test(f)){e.style.right=-b+"px"}if(/^leftpanel$/.test(f)){hs.setStyles(e,{right:"100%",marginRight:this.x.cb+"px",top:-this.y.cb+"px",bottom:-this.y.cb+"px",overflow:"auto"});this.x.p1=e.offsetWidth}else{if(/^rightpanel$/.test(f)){hs.setStyles(e,{left:"100%",marginLeft:this.x.cb+"px",top:-this.y.cb+"px",bottom:-this.y.cb+"px",overflow:"auto"});this.x.p2=e.offsetWidth}}var d=e.parentNode.offsetHeight;e.style.height="auto";if(c&&e.offsetHeight>d){e.style.height=hs.ieLt7?d+"px":"100%"}if(/^top/.test(f)){e.style.top=a+"px"}if(/^middle/.test(f)){hs.setStyles(e,{top:"50%",marginTop:(a-Math.round(e.offsetHeight/2))+"px"})}if(/^bottom/.test(f)){e.style.bottom=-a+"px"}if(/^above$/.test(f)){hs.setStyles(e,{left:(-this.x.p1-this.x.cb)+"px",right:(-this.x.p2-this.x.cb)+"px",bottom:"100%",marginBottom:this.y.cb+"px",width:"auto"});this.y.p1=e.offsetHeight}else{if(/^below$/.test(f)){hs.setStyles(e,{position:"relative",left:(-this.x.p1-this.x.cb)+"px",right:(-this.x.p2-this.x.cb)+"px",top:"100%",marginTop:this.y.cb+"px",width:"auto"});this.y.p2=e.offsetHeight;e.style.position="absolute"}}},getOverlays:function(){this.getInline(["heading","caption"],true);this.getNumber();if(this.heading&&this.dragByHeading){this.heading.className+=" highslide-move"}if(hs.showCredits){this.writeCredits()}for(var a=0;a0){F=0}if(C>0){C=0}if(C0?G[L-1].parentNode[B]:w[B],A=w[B]+w[H]+(G[L+1]?G[L+1].parentNode[H]:0);if(A>x-v){C=x-A}else{if(J<-v){C=-J}}}var E=w[B]+(w[H]-g[H])/2+C;hs.animate(s,h?{left:C}:{top:C},null,"easeOutQuad");hs.animate(g,h?{left:E}:{top:E},null,"easeOutQuad");l.style.display=C<0?"block":"none";t.style.display=(C>F)?"block":"none"}var j=hs.anchors.groups[hs.expanders[k.expKey].slideshowGroup||"none"],f=k.thumbstrip,m=f.mode||"horizontal",u=(m=="float"),o=u?["div","ul","li","span"]:["table","tbody","tr","td"],h=(m=="horizontal"),r=hs.createElement("div",{className:"highslide-thumbstrip highslide-thumbstrip-"+m,innerHTML:'
    <'+o[0]+"><"+o[1]+">
    '},{display:"none"},hs.container),e=r.childNodes,n=e[0],l=e[1],t=e[2],g=e[3],s=n.firstChild,a=r.getElementsByTagName(o[1])[0],b;for(var q=0;q35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q(!m){u m={18:{9C:\'9t\',9f:\'bb...\',9g:\'8o 1L ba\',9Y:\'8o 1L bd 1L bw\',7p:\'bx 1L bl B (f)\',aS:\'bp by 8H 8I\',b0:\'bn 1L bj 8H 8I bz\',8T:\'8C\',8U:\'8D\',8w:\'8E\',8v:\'8J\',8t:\'8J (bv)\',bu:\'bg\',8P:\'8G\',8A:\'8G 1g (8B)\',8N:\'8F\',8M:\'8F 1g (8B)\',8S:\'8C (8l 14)\',8O:\'8D (8l 2V)\',8s:\'8E\',8r:\'1:1\',3n:\'b9 %1 bq %2\',84:\'8o 1L 26 2M, c4 8L c6 1L 3i. c0 8l c1 K 1p 8L 3c.\'},4p:\'L/bX/\',5M:\'bI.4y\',5m:\'bK.4y\',7f:53,8p:53,4L:15,9M:15,4j:15,9K:15,4z:bE,91:0.75,9j:J,7A:5,3B:2,bP:3,4R:1f,at:\'4g 2V\',aq:1,an:J,aF:\'bQ://L.c2/\',aE:\'bO\',8V:J,8e:[\'a\'],2Z:[],aL:53,3I:0,7G:50,3Q:\'2n\',6H:\'2n\',8y:H,8x:H,7v:J,5c:8R,5w:8R,5q:J,1B:\'bR-bS\',a6:{2B:\'<7V>\'+\'<1R 2s="L-3c">\'+\'\'+\'<23>{m.18.8T}\'+\'\'+\'<1R 2s="L-3r">\'+\'\'+\'<23>{m.18.8P}\'+\'\'+\'<1R 2s="L-2S">\'+\'\'+\'<23>{m.18.8N}\'+\'\'+\'<1R 2s="L-1p">\'+\'\'+\'<23>{m.18.8U}\'+\'\'+\'<1R 2s="L-3i">\'+\'\'+\'<23>{m.18.8w}\'+\'\'+\'<1R 2s="L-1a-2D">\'+\'\'+\'<23>{m.18.8r}\'+\'\'+\'<1R 2s="L-26">\'+\'\'+\'<23>{m.18.8v}\'+\'\'+\'\'},4X:[],6Z:J,W:[],6V:[\'5q\',\'30\',\'3Q\',\'6H\',\'8y\',\'8x\',\'1B\',\'3B\',\'bG\',\'bH\',\'bJ\',\'8u\',\'bW\',\'cd\',\'cc\',\'8z\',\'aW\',\'7v\',\'3D\',\'5b\',\'2Z\',\'3I\',\'M\',\'1b\',\'7B\',\'5c\',\'5w\',\'6F\',\'6R\',\'9i\',\'2t\',\'2r\',\'aT\',\'aD\',\'1G\'],1x:[],4V:0,7q:{x:[\'9H\',\'14\',\'4i\',\'2V\',\'9L\'],y:[\'4T\',\'11\',\'8h\',\'4g\',\'6D\']},66:{},8z:{},8u:{},3u:[],4U:[],48:{},7I:{},5G:[],21:/ca\\/4\\.0/.19(4B.5r)?8:8n((4B.5r.5Y().2H(/.+(?:9y|c9|ce|2m)[\\/: ]([\\d.]+)/)||[0,\'0\'])[1]),2m:(R.52&&!1A.3q),4u:/cf/.19(4B.5r),5Z:/ci.+9y:1\\.[0-8].+cg/.19(4B.5r),$:z(1M){q(1M)D R.c7(1M)},2p:z(2o,3j){2o[2o.S]=3j},1c:z(9m,4k,3P,8b,9n){u C=R.1c(9m);q(4k)m.3b(C,4k);q(9n)m.V(C,{bY:0,aM:\'1F\',6S:0});q(3P)m.V(C,3P);q(8b)8b.2E(C);D C},3b:z(C,4k){K(u x 2T 4k)C[x]=4k[x];D C},V:z(C,3P){K(u x 2T 3P){q(m.4d&&x==\'1n\'){q(3P[x]>0.99)C.G.c5(\'5j\');I C.G.5j=\'9o(1n=\'+(3P[x]*28)+\')\'}I C.G[x]=3P[x]}},2b:z(C,Z,31){u 41,4v,47;q(1q 31!=\'6q\'||31===H){u 36=9V;31={3J:36[2],2r:36[3],63:36[4]}}q(1q 31.3J!=\'3n\')31.3J=53;31.2r=1d[31.2r]||1d.93;31.5S=m.3b({},Z);K(u 35 2T Z){u e=24 m.1E(C,31,35);41=8n(m.7U(C,35))||0;4v=8n(Z[35]);47=35!=\'1n\'?\'F\':\'\';e.3F(41,4v,47)}},7U:z(C,Z){q(C.G[Z]){D C.G[Z]}I q(R.6T){D R.6T.9P(C,H).9Q(Z)}I{q(Z==\'1n\')Z=\'5j\';u 3j=C.bf[Z.2j(/\\-(\\w)/g,z(a,b){D b.92()})];q(Z==\'5j\')3j=3j.2j(/9o\\(1n=([0-9]+)\\)/,z(a,b){D b/28});D 3j===\'\'?1:3j}},6v:z(){u d=R,w=1A,5d=d.6i&&d.6i!=\'7P\'?d.4l:d.3x,4d=m.2m&&(m.21<9||1q 9l==\'1C\');u M=4d?5d.8m:(d.4l.8m||5J.b2),1b=4d?5d.aK:5J.b3;m.3S={M:M,1b:1b,5l:4d?5d.5l:9l,5i:4d?5d.5i:be};D m.3S},6g:z(C){u p={x:C.4f,y:C.9h};4o(C.9k){C=C.9k;p.x+=C.4f;p.y+=C.9h;q(C!=R.3x&&C!=R.4l){p.x-=C.5l;p.y-=C.5i}}D p},2D:z(a,2O,3F,T){q(!a)a=m.1c(\'a\',H,{1u:\'1F\'},m.22);q(1q a.5u==\'z\')D 2O;2d{24 m.4Z(a,2O,3F);D 1f}1W(e){D J}},a4:z(C,4F,U){u 1i=C.2L(4F);K(u i=0;i<1i.S;i++){q((24 5X(U)).19(1i[i].U)){D 1i[i]}}D H},a7:z(s){s=s.2j(/\\s/g,\' \');u 1T=/{m\\.18\\.([^}]+)\\}/g,4S=s.2H(1T),18;q(4S)K(u i=0;i<4S.S;i++){18=4S[i].2j(1T,"$1");q(1q m.18[18]!=\'1C\')s=s.2j(4S[i],m.18[18])}D s},9w:z(){u 7J=0,6j=-1,W=m.W,A,1r;K(u i=0;i7J){7J=1r;6j=i}}}q(6j==-1)m.3v=-1;I W[6j].43()},5h:z(a,5p){a.5u=a.2G;u p=a.5u?a.5u():H;a.5u=H;D(p&&1q p[5p]!=\'1C\')?p[5p]:(1q m[5p]!=\'1C\'?m[5p]:H)},73:z(a){u 1G=m.5h(a,\'1G\');q(1G)D 1G;D a.1Y},4W:z(1M){u 3w=m.$(1M),45=m.7I[1M],a={};q(!3w&&!45)D H;q(!45){45=3w.7j(J);45.1M=\'\';m.7I[1M]=45;D 3w}I{D 45.7j(J)}},3H:z(d){q(d)m.8j.2E(d);m.8j.2R=\'\'},1m:z(A){q(!m.2a){7E=J;m.2a=m.1c(\'X\',{U:\'L-bk L-1Z-B\',4x:\'\',2G:z(){m.26()}},{1e:\'1D\',1n:0},m.22,J);q(/(bm|bt|bo|br)/.19(4B.5r)){u 3x=R.3x;z 7H(){m.V(m.2a,{M:3x.bA+\'F\',1b:3x.b5+\'F\'})}7H();m.1Q(1A,\'3O\',7H)}}m.2a.G.1u=\'\';u 7E=m.2a.4x==\'\';m.2a.4x+=\'|\'+A.P;q(7E){q(m.5Z&&m.9q)m.V(m.2a,{9e:\'5O(\'+m.4p+\'bh.97)\',1n:1});I m.2b(m.2a,{1n:A.3I},m.7G)}},7Q:z(P){q(!m.2a)D;q(1q P!=\'1C\')m.2a.4x=m.2a.4x.2j(\'|\'+P,\'\');q((1q P!=\'1C\'&&m.2a.4x!=\'\')||(m.1U&&m.5h(m.1U,\'3I\')))D;q(m.5Z&&m.9q)m.2a.G.1u=\'1F\';I m.2b(m.2a,{1n:0},m.7G,H,z(){m.2a.G.1u=\'1F\'})},83:z(6n,A){u Y=A||m.2h();A=Y;q(m.1U)D 1f;I m.Y=Y;m.49(R,1A.3q?\'5P\':\'5Q\',m.4N);2d{m.1U=6n;6n.2G()}1W(e){m.Y=m.1U=H}2d{q(!6n||A.2Z[1]!=\'3Y\')A.26()}1W(e){}D 1f},6d:z(C,1P){u A=m.2h(C);q(A)D m.83(A.7b(1P),A);I D 1f},3c:z(C){D m.6d(C,-1)},1p:z(C){D m.6d(C,1)},4N:z(e){q(!e)e=1A.29;q(!e.2i)e.2i=e.7l;q(1q e.2i.9x!=\'1C\')D J;u A=m.2h();u 1P=H;8Y(e.cq){1I 70:q(A)A.6k();D J;1I 32:1P=2;5B;1I 34:1I 39:1I 40:1P=1;5B;1I 8:1I 33:1I 37:1I 38:1P=-1;5B;1I 27:1I 13:1P=0}q(1P!==H){q(1P!=2)m.49(R,1A.3q?\'5P\':\'5Q\',m.4N);q(!m.8V)D J;q(e.4D)e.4D();I e.9W=1f;q(A){q(1P==0){A.26()}I q(1P==2){q(A.1g)A.1g.ad()}I{q(A.1g)A.1g.2S();m.6d(A.P,1P)}D 1f}}D J},d5:z(O){m.2p(m.1x,m.3b(O,{1H:\'1H\'+m.4V++}))},d4:z(1h){u 2C=1h.2t;q(1q 2C==\'6q\'){K(u i=0;i<2C.S;i++){u o={};K(u x 2T 1h)o[x]=1h[x];o.2t=2C[i];m.2p(m.4U,o)}}I{m.2p(m.4U,1h)}},86:z(7N,65){u C,1T=/^L-Q-([0-9]+)$/;C=7N;4o(C.1O){q(C.5F!==1C)D C.5F;q(C.1M&&1T.19(C.1M))D C.1M.2j(1T,"$1");C=C.1O}q(!65){C=7N;4o(C.1O){q(C.4F&&m.5L(C)){K(u P=0;P1)D J;q(!e.2i)e.2i=e.7l;u C=e.2i;4o(C.1O&&!(/L-(2M|3i|5W|3O)/.19(C.U))){C=C.1O}u A=m.2h(C);q(A&&(A.8c||!A.55))D J;q(A&&e.T==\'aH\'){q(e.2i.9x)D J;u 2H=C.U.2H(/L-(2M|3i|3O)/);q(2H){m.2I={A:A,T:2H[1],14:A.x.E,M:A.x.B,11:A.y.E,1b:A.y.B,9v:e.6c,9u:e.68};m.1Q(R,\'6o\',m.5V);q(e.4D)e.4D();q(/L-(2M|5W)-89/.19(A.17.U)){A.43();m.7R=J}D 1f}}I q(e.T==\'aA\'){m.49(R,\'6o\',m.5V);q(m.2I){q(m.4I&&m.2I.T==\'2M\')m.2I.A.17.G.46=m.4I;u 3y=m.2I.3y;q(!3y&&!m.7R&&!/(3i|3O)/.19(m.2I.T)){A.26()}I q(3y||(!3y&&m.d8)){m.2I.A.5s(\'1s\')}m.7R=1f;m.2I=H}I q(/L-2M-89/.19(C.U)){C.G.46=m.4I}}D 1f},5V:z(e){q(!m.2I)D J;q(!e)e=1A.29;u a=m.2I,A=a.A;a.5T=e.6c-a.9v;a.7o=e.68-a.9u;u 7s=1d.ck(1d.9r(a.5T,2)+1d.9r(a.7o,2));q(!a.3y)a.3y=(a.T!=\'2M\'&&7s>0)||(7s>(m.cX||5));q(a.3y&&e.6c>5&&e.68>5){q(a.T==\'3O\')A.3O(a);I{A.7C(a.14+a.5T,a.11+a.7o);q(a.T==\'2M\')A.17.G.46=\'3i\'}}D 1f},8Q:z(e){2d{q(!e)e=1A.29;u 6C=/cW/i.19(e.T);q(!e.2i)e.2i=e.7l;q(!e.6E)e.6E=6C?e.db:e.di;u A=m.2h(e.2i);q(!A.55)D;q(!A||!e.6E||m.2h(e.6E,J)==A||m.2I)D;K(u i=0;i=k.1h.3J+k.80){k.4c=k.4v;k.E=k.7X=1;k.8a();k.1h.5S[k.Z]=J;u 8d=J;K(u i 2T k.1h.5S)q(k.1h.5S[i]!==J)8d=1f;q(8d){q(k.1h.63)k.1h.63.95(k.2F)}D 1f}I{u n=t-k.80;k.7X=n/k.1h.3J;k.E=k.1h.2r(n,0,1,k.1h.3J);k.4c=k.41+((k.4v-k.41)*k.E);k.8a()}D J}};m.3b(m.1E,{3k:{1n:z(1E){m.V(1E.2F,{1n:1E.4c})},96:z(1E){2d{q(1E.2F.G&&1E.2F.G[1E.Z]!=H)1E.2F.G[1E.Z]=1E.4c+1E.47;I 1E.2F[1E.Z]=1E.4c}1W(e){}}}});m.4O=z(1B,3V){k.3V=3V;k.1B=1B;u v=m.21,3L;k.7h=m.2m&&m.21<7;q(!1B){q(3V)3V();D}m.71();k.1V=m.1c(\'1V\',{cr:0},{1e:\'1s\',1j:\'2v\',cC:\'cD\',M:0},m.22,J);u 4a=m.1c(\'4a\',H,H,k.1V,1);k.2e=[];K(u i=0;i<=8;i++){q(i%3==0)3L=m.1c(\'3L\',H,{1b:\'2n\'},4a,J);k.2e[i]=m.1c(\'2e\',H,H,3L,J);u G=i!=4?{cP:0,cO:0}:{1j:\'8i\'};m.V(k.2e[i],G)}k.2e[4].U=1B+\' L-16\';k.98()};m.4O.5o={98:z(){u 1G=m.4p+(m.cN||"cQ/")+k.1B+".97";u 9a=m.4u&&m.21<6t?m.22:H;k.3d=m.1c(\'1y\',H,{1j:\'2v\',11:\'-4P\'},9a,J);u 7T=k;k.3d.64=z(){7T.9b()};k.3d.1G=1G},9b:z(){u o=k.1k=k.3d.M/4,E=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],1m={1b:(2*o)+\'F\',M:(2*o)+\'F\'};K(u i=0;i<=8;i++){q(E[i]){q(k.7h){u w=(i==1||i==7)?\'28%\':k.3d.M+\'F\';u X=m.1c(\'X\',H,{M:\'28%\',1b:\'28%\',1j:\'8i\',3a:\'1s\'},k.2e[i],J);m.1c(\'X\',H,{5j:"cL:cG.cF.cE(cH=cI, 1G=\'"+k.3d.1G+"\')",1j:\'2v\',M:w,1b:k.3d.1b+\'F\',14:(E[i][0]*o)+\'F\',11:(E[i][1]*o)+\'F\'},X,J)}I{m.V(k.2e[i],{9e:\'5O(\'+k.3d.1G+\') \'+(E[i][0]*o)+\'F \'+(E[i][1]*o)+\'F\'})}q(1A.3q&&(i==3||i==5))m.1c(\'X\',H,1m,k.2e[i],J);m.V(k.2e[i],1m)}}k.3d=H;q(m.48[k.1B])m.48[k.1B].5x();m.48[k.1B]=k;q(k.3V)k.3V()},3Z:z(E,1k,9d,3t,2r){u A=k.A,cK=A.Q.G,1k=1k||0,E=E||{x:A.x.E+1k,y:A.y.E+1k,w:A.x.N(\'1N\')-2*1k,h:A.y.N(\'1N\')-2*1k};q(9d)k.1V.G.1e=(E.h>=4*k.1k)?\'1D\':\'1s\';m.V(k.1V,{14:(E.x-k.1k)+\'F\',11:(E.y-k.1k)+\'F\',M:(E.w+2*k.1k)+\'F\'});E.w-=2*k.1k;E.h-=2*k.1k;m.V(k.2e[4],{M:E.w>=0?E.w+\'F\':0,1b:E.h>=0?E.h+\'F\':0});q(k.7h)k.2e[3].G.1b=k.2e[5].G.1b=k.2e[4].G.1b},5x:z(9c){q(9c)k.1V.G.1e=\'1s\';I m.3H(k.1V)}};m.6r=z(A,1m){k.A=A;k.1m=1m;k.3m=1m==\'x\'?\'ah\':\'au\';k.3G=k.3m.5Y();k.4M=1m==\'x\'?\'af\':\'ag\';k.6B=k.4M.5Y();k.7d=1m==\'x\'?\'a5\':\'a8\';k.90=k.7d.5Y();k.1o=k.2z=0};m.6r.5o={N:z(P){8Y(P){1I\'78\':D k.1K+k.3o+(k.t-m.1S[\'1k\'+k.3m])/2;1I\'6Q\':D k.E+k.cb+k.1o+(k.B-m.1S[\'1k\'+k.3m])/2;1I\'1N\':D k.B+2*k.cb+k.1o+k.2z;1I\'4n\':D k.3W-k.2P-k.3X;1I\'7a\':D k.N(\'4n\')-2*k.cb-k.1o-k.2z;1I\'5t\':D k.E-(k.A.16?k.A.16.1k:0);1I\'7M\':D k.N(\'1N\')+(k.A.16?2*k.A.16.1k:0);1I\'2f\':D k.1z?1d.2y((k.B-k.1z)/2):0}},74:z(){k.cb=(k.A.17[\'1k\'+k.3m]-k.t)/2;k.3X=m[\'6S\'+k.7d]},6X:z(){k.t=k.A.C[k.3G]?7L(k.A.C[k.3G]):k.A.C[\'1k\'+k.3m];k.1K=k.A.1K[k.1m];k.3o=(k.A.C[\'1k\'+k.3m]-k.t)/2;q(k.1K==0||k.1K==-1){k.1K=(m.3S[k.3G]/2)+m.3S[\'1J\'+k.4M]}},6P:z(){u A=k.A;k.2k=\'2n\';q(A.6H==\'4i\')k.2k=\'4i\';I q(24 5X(k.6B).19(A.3Q))k.2k=H;I q(24 5X(k.90).19(A.3Q))k.2k=\'56\';k.E=k.1K-k.cb+k.3o;q(k.6R&&k.1m==\'x\')A.6F=1d.2X(A.6F||k.1a,A.6R*k.1a/A.y.1a);k.B=1d.2X(k.1a,A[\'56\'+k.3m]||k.1a);k.2q=A.5q?1d.2X(A[\'2X\'+k.3m],k.1a):k.1a;q(A.3A&&A.30){k.B=A[k.3G];k.1z=k.1a}q(k.1m==\'x\'&&m.4R)k.2q=A.5c;k.2i=A[\'2i\'+k.1m.92()];k.2P=m[\'6S\'+k.4M];k.1J=m.3S[\'1J\'+k.4M];k.3W=m.3S[k.3G]},82:z(i){u A=k.A;q(A.3A&&(A.30||m.4R)){k.1z=i;k.B=1d.56(k.B,k.1z);A.17.G[k.6B]=k.N(\'2f\')+\'F\'}I k.B=i;A.17.G[k.3G]=i+\'F\';A.Q.G[k.3G]=k.N(\'1N\')+\'F\';q(A.16)A.16.3Z();q(k.1m==\'x\'&&A.1l)A.4K(J);q(k.1m==\'x\'&&A.1g&&A.3A){q(i==k.1a)A.1g.4J(\'1a-2D\');I A.1g.3T(\'1a-2D\')}},7Z:z(i){k.E=i;k.A.Q.G[k.6B]=i+\'F\';q(k.A.16)k.A.16.3Z()}};m.4Z=z(a,2O,3F,2Q){q(R.cs&&m.2m&&!m.6I){m.1Q(R,\'3s\',z(){24 m.4Z(a,2O,3F,2Q)});D}k.a=a;k.3F=3F;k.2Q=2Q||\'2M\';k.3A=!k.cp;m.6Z=1f;k.1x=[];k.Y=m.Y;m.Y=H;m.71();u P=k.P=m.W.S;K(u i=0;ip.1J+p.3W-p.3X)p.E=p.1J+p.3W-p.B-p.2P-p.3X-p.1o-p.2z;q(p.E(k.x.1z||k.x.B)){k.ap();q(k.1x.S==1)k.4K()}}k.aG()}1W(e){k.7D(e)}},2k:z(p,4C){u 4b,2l=p.2i,1m=p==k.x?\'x\':\'y\';q(2l&&2l.2H(/ /)){4b=2l.dh(\' \');2l=4b[0]}q(2l&&m.$(2l)){p.E=m.6g(m.$(2l))[1m];q(4b&&4b[1]&&4b[1].2H(/^[-]?[0-9]+F$/))p.E+=7L(4b[1]);q(p.Bp.1J+p.3W-p.3X){q(!4C&&79&&4q){p.B=1d.2X(p.B,p.N(1m==\'y\'?\'4n\':\'7a\'))}I q(p.N(\'1N\')2x){ 2A=2Y*2x;q(2Ak.5w&&x.B>k.5c&&y.N(\'1N\')>y.N(\'4n\')){y.B-=10;q(2x)x.B=y.B*2x;k.4K(0,1);3e=J}}D 3e},aG:z(){u x=k.x,y=k.y;k.5s(\'1s\');q(k.1g&&k.1g.2g)k.1g.2g.4G();k.8f(1,{Q:{M:x.N(\'1N\'),1b:y.N(\'1N\'),14:x.E,11:y.E},17:{14:x.1o+x.N(\'2f\'),11:y.1o+y.N(\'2f\'),M:x.1z||x.B,1b:y.1z||y.B}},m.7f)},8f:z(1t,1L,3t){u 5k=k.2Z,6M=1t?(k.Y?k.Y.a:H):m.1U,t=(5k[1]&&6M&&m.5h(6M,\'2Z\')[1]==5k[1])?5k[1]:5k[0];q(k[t]&&t!=\'2D\'){k[t](1t,1L);D}q(k.16&&!k.3B){q(1t)k.16.3Z();I k.16.5x()}q(!1t)k.67();u A=k,x=A.x,y=A.y,2r=k.2r;q(!1t)2r=k.aT||2r;u ay=1t?z(){q(A.16)A.16.1V.G.1e="1D";4r(z(){A.62()},50)}:z(){A.5v()};q(1t)m.V(k.Q,{M:x.t+\'F\',1b:y.t+\'F\'});q(k.aD){m.V(k.Q,{1n:1t?0:1});m.3b(1L.Q,{1n:1t})}m.2b(k.Q,1L.Q,{3J:3t,2r:2r,3k:z(3j,36){q(A.16&&A.3B&&36.Z==\'11\'){u 4Q=1t?36.E:1-36.E;u E={w:x.t+(x.N(\'1N\')-x.t)*4Q,h:y.t+(y.N(\'1N\')-y.t)*4Q,x:x.1K+(x.E-x.1K)*4Q,y:y.1K+(y.E-y.1K)*4Q};A.16.3Z(E,0,1)}}});m.2b(k.17,1L.17,3t,2r,ay);q(1t){k.Q.G.1e=\'1D\';k.17.G.1e=\'1D\';k.a.U+=\' L-42-3Q\'}},5n:z(1t,1L){k.3B=1f;u A=k,t=1t?m.7f:0;q(1t){m.2b(k.Q,1L.Q,0);m.V(k.Q,{1n:0,1e:\'1D\'});m.2b(k.17,1L.17,0);k.17.G.1e=\'1D\';m.2b(k.Q,{1n:1},t,H,z(){A.62()})}q(k.16){k.16.1V.G.1r=k.Q.G.1r;u 5D=1t||-1,1k=k.16.1k,7c=1t?3:1k,6Y=1t?1k:3;K(u i=7c;5D*i<=5D*6Y;i+=5D,t+=25){(z(){u o=1t?6Y-i:7c-i;4r(z(){A.16.3Z(0,o,1)},t)})()}}q(1t){}I{4r(z(){q(A.16)A.16.5x(A.cz);A.67();m.2b(A.Q,{1n:0},m.8p,H,z(){A.5v()})},t)}},3Y:z(1t,1L,72){q(!1t)D;u A=k,Y=k.Y,x=k.x,y=k.y,2W=Y.x,2U=Y.y,Q=k.Q,17=k.17,1l=k.1l;m.49(R,\'6o\',m.5V);m.V(17,{M:(x.1z||x.B)+\'F\',1b:(y.1z||y.B)+\'F\'});q(1l)1l.G.3a=\'1D\';k.16=Y.16;q(k.16)k.16.A=A;Y.16=H;u 4s=m.1c(\'X\',{U:\'L-\'+k.2Q},{1j:\'2v\',1r:4,3a:\'1s\',1u:\'1F\'});u 77={aO:Y,aR:k};K(u n 2T 77){k[n]=77[n].17.7j(1);m.V(k[n],{1j:\'2v\',aM:0,1e:\'1D\'});4s.2E(k[n])}Q.2E(4s);q(1l){1l.U=\'\';Q.2E(1l)}4s.G.1u=\'\';Y.17.G.1u=\'1F\';q(m.4u&&m.21<6t){k.Q.G.1e=\'1D\'}m.2b(Q,{M:x.B},{3J:m.aL,3k:z(3j,36){u E=36.E,3U=1-E;u Z,B={},6N=[\'E\',\'B\',\'1o\',\'2z\'];K(u n 2T 6N){Z=6N[n];B[\'x\'+Z]=1d.2y(3U*2W[Z]+E*x[Z]);B[\'y\'+Z]=1d.2y(3U*2U[Z]+E*y[Z]);B.aJ=1d.2y(3U*(2W.1z||2W.B)+E*(x.1z||x.B));B.6p=1d.2y(3U*2W.N(\'2f\')+E*x.N(\'2f\'));B.aN=1d.2y(3U*(2U.1z||2U.B)+E*(y.1z||y.B));B.6f=1d.2y(3U*2U.N(\'2f\')+E*y.N(\'2f\'))}q(A.16)A.16.3Z({x:B.2K,y:B.2J,w:B.58+B.3C+B.6O+2*x.cb,h:B.5a+B.3z+B.6W+2*y.cb});Y.Q.G.ct=\'cn(\'+(B.2J-2U.E)+\'F, \'+(B.58+B.3C+B.6O+B.2K+2*2W.cb-2W.E)+\'F, \'+(B.5a+B.3z+B.6W+B.2J+2*2U.cb-2U.E)+\'F, \'+(B.2K-2W.E)+\'F)\';m.V(17,{11:(B.3z+y.N(\'2f\'))+\'F\',14:(B.3C+x.N(\'2f\'))+\'F\',4j:(y.E-B.2J)+\'F\',4L:(x.E-B.2K)+\'F\'});m.V(Q,{11:B.2J+\'F\',14:B.2K+\'F\',M:(B.3C+B.6O+B.58+2*x.cb)+\'F\',1b:(B.3z+B.6W+B.5a+2*y.cb)+\'F\'});m.V(4s,{M:(B.aJ||B.58)+\'F\',1b:(B.aN||B.5a)+\'F\',14:(B.3C+B.6p)+\'F\',11:(B.3z+B.6f)+\'F\',1e:\'1D\'});m.V(A.aO,{11:(2U.E-B.2J+2U.1o-B.3z+2U.N(\'2f\')-B.6f)+\'F\',14:(2W.E-B.2K+2W.1o-B.3C+2W.N(\'2f\')-B.6p)+\'F\'});m.V(A.aR,{1n:E,11:(y.E-B.2J+y.1o-B.3z+y.N(\'2f\')-B.6f)+\'F\',14:(x.E-B.2K+x.1o-B.3C+x.N(\'2f\')-B.6p)+\'F\'});q(1l)m.V(1l,{M:B.58+\'F\',1b:B.5a+\'F\',14:(B.3C+x.cb)+\'F\',11:(B.3z+y.cb)+\'F\'})},63:z(){Q.G.1e=17.G.1e=\'1D\';17.G.1u=\'4H\';m.3H(4s);A.62();Y.5v();A.Y=H}})},9E:z(o,C){q(!k.Y)D 1f;K(u i=0;i\'+s+\'\'+k[k.5b].2R}}},aB:z(){q(!k.Y){K(u i=0;ik.x.N(\'5t\')+k.x.N(\'7M\'));u 9Z=(3g.y+3g.hk.y.N(\'5t\')+k.y.N(\'7M\'))}u 5H=m.86(1i[i]);q(!ax&&!9Z&&5H!=k.P){q(!2u){1i[i].5A(\'1s-by\',\'[\'+k.P+\']\');1i[i].88=1i[i].G[Z];1i[i].G[Z]=\'1s\'}I q(2u.9X(\'[\'+k.P+\']\')==-1){1i[i].5A(\'1s-by\',2u+\'[\'+k.P+\']\')}}I q((2u==\'[\'+k.P+\']\'||m.3v==5H)&&5H!=k.P){1i[i].5A(\'1s-by\',\'\');1i[i].G[Z]=1i[i].88||\'\'}I q(2u&&2u.9X(\'[\'+k.P+\']\')>-1){1i[i].5A(\'1s-by\',2u.2j(\'[\'+k.P+\']\',\'\'))}}}}},43:z(){k.Q.G.1r=m.4z+=2;K(u i=0;iO.1O.2c)O.G.M=\'28%\'}I q(O.1O!=k.1l)k.1l.2E(O);q(/14$/.19(p))O.G.14=5E+\'F\';q(/4i$/.19(p))m.V(O,{14:\'50%\',4L:(5E-1d.2y(O.2c/2))+\'F\'});q(/2V$/.19(p))O.G.2V=-5E+\'F\';q(/^9H$/.19(p)){m.V(O,{2V:\'28%\',9M:k.x.cb+\'F\',11:-k.y.cb+\'F\',4g:-k.y.cb+\'F\',3a:\'2n\'});k.x.1o=O.2c}I q(/^9L$/.19(p)){m.V(O,{14:\'28%\',4L:k.x.cb+\'F\',11:-k.y.cb+\'F\',4g:-k.y.cb+\'F\',3a:\'2n\'});k.x.2z=O.2c}u 8g=O.1O.3f;O.G.1b=\'2n\';q(4E&&O.3f>8g)O.G.1b=m.3E?8g+\'F\':\'28%\';q(/^11/.19(p))O.G.11=5C+\'F\';q(/^8h/.19(p))m.V(O,{11:\'50%\',4j:(5C-1d.2y(O.3f/2))+\'F\'});q(/^4g/.19(p))O.G.4g=-5C+\'F\';q(/^4T$/.19(p)){m.V(O,{14:(-k.x.1o-k.x.cb)+\'F\',2V:(-k.x.2z-k.x.cb)+\'F\',4g:\'28%\',9K:k.y.cb+\'F\',M:\'2n\'});k.y.1o=O.3f}I q(/^6D$/.19(p)){m.V(O,{1j:\'8i\',14:(-k.x.1o-k.x.cb)+\'F\',2V:(-k.x.2z-k.x.cb)+\'F\',11:\'28%\',4j:k.y.cb+\'F\',M:\'2n\'});k.y.2z=O.3f;O.G.1j=\'2v\'}},9J:z(){k.a2([\'6z\',\'dd\'],J);k.a3();q(k.6z&&k.7v)k.6z.U+=\' L-3i\';q(m.an)k.am();K(u i=0;i0)4w=0;q(2w>0)2w=0;q(2w<4w)2w=4w}I{K(u j=0;j0?as[i-1].1O[4f]:3M[4f],7x=3M[4f]+3M[2c]+(as[i+1]?as[i+1].1O[2c]:0);q(7x>6h-5z)2w=6h-7x;I q(7F<-5z)2w=-7F}u 7r=3M[4f]+(3M[2c]-6b[2c])/2+2w;m.2b(1V,3p?{14:2w}:{11:2w},H,\'7n\');m.2b(6b,3p?{14:7r}:{11:7r},H,\'7n\');7Y.G.1u=2w<0?\'4H\':\'1F\';85.G.1u=(2w>4w)?\'4H\':\'1F\'};u 51=m.3R.2N[m.W[1g.3N].2t||\'1F\'],1h=1g.2g,4m=1h.4m||\'ao\',81=(4m==\'bi\'),3K=81?[\'X\',\'7V\',\'1R\',\'23\']:[\'1V\',\'4a\',\'3L\',\'2e\'],3p=(4m==\'ao\'),4e=m.1c(\'X\',{U:\'L-2g L-2g-\'+4m,2R:\'\'+\'<\'+3K[0]+\'><\'+3K[1]+\'>\'+\'\'+\'\'+\'\'},{1u:\'1F\'},m.22),57=4e.6l,X=57[0],7Y=57[1],85=57[2],6b=57[3],1V=X.b7,4a=4e.2L(3K[1])[0],3L;K(u i=0;i<51.S;i++){q(i==0||!3p)3L=m.1c(3K[2],H,H,4a);(z(){u a=51[i],3M=m.1c(3K[3],H,H,3L),cj=i;m.1c(\'a\',{1Y:a.1Y,1X:a.1X,2G:z(){q(/L-42-3Q/.19(k.U))D 1f;m.2h(k).43();D m.83(a)},2R:m.9I?m.9I(a):a.2R},H,3M)})()}q(!81){7Y.2G=z(){1J(-1)};85.2G=z(){1J(1)};m.1Q(4a,R.c3!==1C?\'bB\':\'bZ\',z(e){u 3h=0;e=e||1A.29;q(e.9D){3h=e.9D/ch;q(m.3q)3h=-3h}I q(e.9N){3h=-e.9N/3}q(3h)1J(-3h*0.2);q(e.4D)e.4D();e.9W=1f})}D{6s:6s,4G:4G}};m.5U=m.18;u bC=m.4Z;q(m.2m&&1A==1A.11){(z(){2d{R.4l.bD(\'14\')}1W(e){4r(9V.bF,50);D}m.3s()})()}m.1Q(R,\'bL\',m.3s);m.1Q(1A,\'az\',m.3s);m.1Q(R,\'3s\',z(){q(m.5M||m.3I){u G=m.1c(\'G\',{T:\'bM/7U\'},H,R.2L(\'bT\')[0]),8k=R.6i==\'7P\';z 5e(7w,7W){q(m.2m&&(m.21<9||8k)){u Y=R.9S[R.9S.S-1];q(1q(Y.5e)=="6q")Y.5e(7w,7W)}I{G.2E(R.bU(7w+" {"+7W+"}"))}}z 5f(Z){D\'bV( ( ( bN = R.4l.\'+Z+\' ? R.4l.\'+Z+\' : R.3x.\'+Z+\' ) ) + \\\'F\\\' );\'}q(m.5M)5e(\'.L 1y\',\'46: 5O(\'+m.4p+m.5M+\'), 5R !c8;\');5e(\'.L-1Z-B\',m.2m&&(m.21<7||8k)?\'1j: 2v; \'+\'14:\'+5f(\'5l\')+\'11:\'+5f(\'5i\')+\'M:\'+5f(\'8m\')+\'1b:\'+5f(\'aK\'):\'1j: bc; M: 28%; 1b: 28%; 14: 0; 11: 0\')}});m.1Q(1A,\'3O\',z(){m.6v();q(m.1Z)K(u i=0;iHighslide JS
    ', - creditsTitle : 'Go to the Highslide JS homepage', - previousText : 'Previous', - nextText : 'Next', - moveText : 'Move', - closeText : 'Close', - closeTitle : 'Close (esc)', - resizeTitle : 'Resize', - playText : 'Play', - playTitle : 'Play slideshow (spacebar)', - pauseText : 'Pause', - pauseTitle : 'Pause slideshow (spacebar)', - previousTitle : 'Previous (arrow left)', - nextTitle : 'Next (arrow right)', - moveTitle : 'Move', - fullExpandText : '1:1', - restoreTitle : 'Click to close image, click and drag to move. Use arrow keys for next and previous.' -}, -// See http://highslide.com/ref for examples of settings -graphicsDir : 'highslide/graphics/', -expandCursor : 'zoomin.cur', // null disables -restoreCursor : 'zoomout.cur', // null disables -expandDuration : 250, // milliseconds -restoreDuration : 250, -marginLeft : 15, -marginRight : 15, -marginTop : 15, -marginBottom : 15, -zIndexCounter : 1001, // adjust to other absolutely positioned elements -loadingOpacity : 0.75, -allowMultipleInstances: true, -numberOfImagesToPreload : 5, -outlineWhileAnimating : 2, // 0 = never, 1 = always, 2 = HTML only -outlineStartOffset : 3, // ends at 10 -padToMinWidth : false, // pad the popup width to make room for wide caption -fullExpandPosition : 'bottom right', -fullExpandOpacity : 1, -showCredits : true, // you can set this to false if you want -creditsHref : 'http://highslide.com/', -creditsTarget : '_self', -enableKeyListener : true, -openerTagNames : ['a'], // Add more to allow slideshow indexing - -allowWidthReduction : false, -allowHeightReduction : true, -preserveContent : true, // Preserve changes made to the content and position of HTML popups. -objectLoadTime : 'before', // Load iframes 'before' or 'after' expansion. -cacheAjax : true, // Cache ajax popups for instant display. Can be overridden for each popup. -dragByHeading: true, -minWidth: 200, -minHeight: 200, -allowSizeReduction: true, // allow the image to reduce to fit client size. If false, this overrides minWidth and minHeight -outlineType : 'drop-shadow', // set null to disable outlines -skin : { - contentWrapper: - '
    '+ - '
    '+ - '' -}, -// END OF YOUR SETTINGS - - -// declare internal properties -preloadTheseImages : [], -continuePreloading: true, -expanders : [], -overrides : [ - 'allowSizeReduction', - 'useBox', - 'outlineType', - 'outlineWhileAnimating', - 'captionId', - 'captionText', - 'captionEval', - 'captionOverlay', - 'headingId', - 'headingText', - 'headingEval', - 'headingOverlay', - 'creditsPosition', - 'dragByHeading', - - 'width', - 'height', - - 'contentId', - 'allowWidthReduction', - 'allowHeightReduction', - 'preserveContent', - 'maincontentId', - 'maincontentText', - 'maincontentEval', - 'objectType', - 'cacheAjax', - 'objectWidth', - 'objectHeight', - 'objectLoadTime', - 'swfOptions', - 'wrapperClassName', - 'minWidth', - 'minHeight', - 'maxWidth', - 'maxHeight', - 'pageOrigin', - 'slideshowGroup', - 'easing', - 'easingClose', - 'fadeInOut', - 'src' -], -overlays : [], -idCounter : 0, -oPos : { - x: ['leftpanel', 'left', 'center', 'right', 'rightpanel'], - y: ['above', 'top', 'middle', 'bottom', 'below'] -}, -mouse: {}, -headingOverlay: {}, -captionOverlay: {}, -swfOptions: { flashvars: {}, params: {}, attributes: {} }, -timers : [], - -pendingOutlines : {}, -sleeping : [], -preloadTheseAjax : [], -cacheBindings : [], -cachedGets : {}, -clones : {}, -onReady: [], -uaVersion: /Trident\/4\.0/.test(navigator.userAgent) ? 8 : - parseFloat((navigator.userAgent.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1]), -ie : (document.all && !window.opera), -//ie : navigator && /MSIE [678]/.test(navigator.userAgent), // ie9 compliant? -safari : /Safari/.test(navigator.userAgent), -geckoMac : /Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent), - -$ : function (id) { - if (id) return document.getElementById(id); -}, - -push : function (arr, val) { - arr[arr.length] = val; -}, - -createElement : function (tag, attribs, styles, parent, nopad) { - var el = document.createElement(tag); - if (attribs) hs.extend(el, attribs); - if (nopad) hs.setStyles(el, {padding: 0, border: 'none', margin: 0}); - if (styles) hs.setStyles(el, styles); - if (parent) parent.appendChild(el); - return el; -}, - -extend : function (el, attribs) { - for (var x in attribs) el[x] = attribs[x]; - return el; -}, - -setStyles : function (el, styles) { - for (var x in styles) { - if (hs.ieLt9 && x == 'opacity') { - if (styles[x] > 0.99) el.style.removeAttribute('filter'); - else el.style.filter = 'alpha(opacity='+ (styles[x] * 100) +')'; - } - else el.style[x] = styles[x]; - } -}, -animate: function(el, prop, opt) { - var start, - end, - unit; - if (typeof opt != 'object' || opt === null) { - var args = arguments; - opt = { - duration: args[2], - easing: args[3], - complete: args[4] - }; - } - if (typeof opt.duration != 'number') opt.duration = 250; - opt.easing = Math[opt.easing] || Math.easeInQuad; - opt.curAnim = hs.extend({}, prop); - for (var name in prop) { - var e = new hs.fx(el, opt , name ); - - start = parseFloat(hs.css(el, name)) || 0; - end = parseFloat(prop[name]); - unit = name != 'opacity' ? 'px' : ''; - - e.custom( start, end, unit ); - } -}, -css: function(el, prop) { - if (el.style[prop]) { - return el.style[prop]; - } else if (document.defaultView) { - return document.defaultView.getComputedStyle(el, null).getPropertyValue(prop); - - } else { - if (prop == 'opacity') prop = 'filter'; - var val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b){ return b.toUpperCase(); })]; - if (prop == 'filter') - val = val.replace(/alpha\(opacity=([0-9]+)\)/, - function (a, b) { return b / 100 }); - return val === '' ? 1 : val; - } -}, - -getPageSize : function () { - var d = document, w = window, iebody = d.compatMode && d.compatMode != 'BackCompat' - ? d.documentElement : d.body, - ieLt9 = hs.ie && (hs.uaVersion < 9 || typeof pageXOffset == 'undefined'); - - var width = ieLt9 ? iebody.clientWidth : - (d.documentElement.clientWidth || self.innerWidth), - height = ieLt9 ? iebody.clientHeight : self.innerHeight; - hs.page = { - width: width, - height: height, - scrollLeft: ieLt9 ? iebody.scrollLeft : pageXOffset, - scrollTop: ieLt9 ? iebody.scrollTop : pageYOffset - }; - return hs.page; -}, - -getPosition : function(el) { - var p = { x: el.offsetLeft, y: el.offsetTop }; - while (el.offsetParent) { - el = el.offsetParent; - p.x += el.offsetLeft; - p.y += el.offsetTop; - if (el != document.body && el != document.documentElement) { - p.x -= el.scrollLeft; - p.y -= el.scrollTop; - } - } - return p; -}, - -expand : function(a, params, custom, type) { - if (!a) a = hs.createElement('a', null, { display: 'none' }, hs.container); - if (typeof a.getParams == 'function') return params; - if (type == 'html') { - for (var i = 0; i < hs.sleeping.length; i++) { - if (hs.sleeping[i] && hs.sleeping[i].a == a) { - hs.sleeping[i].awake(); - hs.sleeping[i] = null; - return false; - } - } - hs.hasHtmlExpanders = true; - } - try { - new hs.Expander(a, params, custom, type); - return false; - } catch (e) { return true; } -}, - -htmlExpand : function(a, params, custom) { - return hs.expand(a, params, custom, 'html'); -}, - -getSelfRendered : function() { - return hs.createElement('div', { - className: 'highslide-html-content', - innerHTML: hs.replaceLang(hs.skin.contentWrapper) - }); -}, -getElementByClass : function (el, tagName, className) { - var els = el.getElementsByTagName(tagName); - for (var i = 0; i < els.length; i++) { - if ((new RegExp(className)).test(els[i].className)) { - return els[i]; - } - } - return null; -}, -replaceLang : function(s) { - s = s.replace(/\s/g, ' '); - var re = /{hs\.lang\.([^}]+)\}/g, - matches = s.match(re), - lang; - if (matches) for (var i = 0; i < matches.length; i++) { - lang = matches[i].replace(re, "$1"); - if (typeof hs.lang[lang] != 'undefined') s = s.replace(matches[i], hs.lang[lang]); - } - return s; -}, - - -getCacheBinding : function (a) { - for (var i = 0; i < hs.cacheBindings.length; i++) { - if (hs.cacheBindings[i][0] == a) { - var c = hs.cacheBindings[i][1]; - hs.cacheBindings[i][1] = c.cloneNode(1); - return c; - } - } - return null; -}, - -preloadAjax : function (e) { - var arr = hs.getAnchors(); - for (var i = 0; i < arr.htmls.length; i++) { - var a = arr.htmls[i]; - if (hs.getParam(a, 'objectType') == 'ajax' && hs.getParam(a, 'cacheAjax')) - hs.push(hs.preloadTheseAjax, a); - } - - hs.preloadAjaxElement(0); -}, - -preloadAjaxElement : function (i) { - if (!hs.preloadTheseAjax[i]) return; - var a = hs.preloadTheseAjax[i]; - var cache = hs.getNode(hs.getParam(a, 'contentId')); - if (!cache) cache = hs.getSelfRendered(); - var ajax = new hs.Ajax(a, cache, 1); - ajax.onError = function () { }; - ajax.onLoad = function () { - hs.push(hs.cacheBindings, [a, cache]); - hs.preloadAjaxElement(i + 1); - }; - ajax.run(); -}, - -focusTopmost : function() { - var topZ = 0, - topmostKey = -1, - expanders = hs.expanders, - exp, - zIndex; - for (var i = 0; i < expanders.length; i++) { - exp = expanders[i]; - if (exp) { - zIndex = exp.wrapper.style.zIndex; - if (zIndex && zIndex > topZ) { - topZ = zIndex; - topmostKey = i; - } - } - } - if (topmostKey == -1) hs.focusKey = -1; - else expanders[topmostKey].focus(); -}, - -getParam : function (a, param) { - a.getParams = a.onclick; - var p = a.getParams ? a.getParams() : null; - a.getParams = null; - - return (p && typeof p[param] != 'undefined') ? p[param] : - (typeof hs[param] != 'undefined' ? hs[param] : null); -}, - -getSrc : function (a) { - var src = hs.getParam(a, 'src'); - if (src) return src; - return a.href; -}, - -getNode : function (id) { - var node = hs.$(id), clone = hs.clones[id], a = {}; - if (!node && !clone) return null; - if (!clone) { - clone = node.cloneNode(true); - clone.id = ''; - hs.clones[id] = clone; - return node; - } else { - return clone.cloneNode(true); - } -}, - -discardElement : function(d) { - if (d) hs.garbageBin.appendChild(d); - hs.garbageBin.innerHTML = ''; -}, -transit : function (adj, exp) { - var last = exp || hs.getExpander(); - exp = last; - if (hs.upcoming) return false; - else hs.last = last; - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - try { - hs.upcoming = adj; - adj.onclick(); - } catch (e){ - hs.last = hs.upcoming = null; - } - try { - exp.close(); - } catch (e) {} - return false; -}, - -previousOrNext : function (el, op) { - var exp = hs.getExpander(el); - if (exp) return hs.transit(exp.getAdjacentAnchor(op), exp); - else return false; -}, - -previous : function (el) { - return hs.previousOrNext(el, -1); -}, - -next : function (el) { - return hs.previousOrNext(el, 1); -}, - -keyHandler : function(e) { - if (!e) e = window.event; - if (!e.target) e.target = e.srcElement; // ie - if (typeof e.target.form != 'undefined') return true; // form element has focus - var exp = hs.getExpander(); - - var op = null; - switch (e.keyCode) { - case 70: // f - if (exp) exp.doFullExpand(); - return true; - case 32: // Space - case 34: // Page Down - case 39: // Arrow right - case 40: // Arrow down - op = 1; - break; - case 8: // Backspace - case 33: // Page Up - case 37: // Arrow left - case 38: // Arrow up - op = -1; - break; - case 27: // Escape - case 13: // Enter - op = 0; - } - if (op !== null) {hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - if (!hs.enableKeyListener) return true; - - if (e.preventDefault) e.preventDefault(); - else e.returnValue = false; - if (exp) { - if (op == 0) { - exp.close(); - } else { - hs.previousOrNext(exp.key, op); - } - return false; - } - } - return true; -}, - - -registerOverlay : function (overlay) { - hs.push(hs.overlays, hs.extend(overlay, { hsId: 'hsId'+ hs.idCounter++ } )); -}, - - -getWrapperKey : function (element, expOnly) { - var el, re = /^highslide-wrapper-([0-9]+)$/; - // 1. look in open expanders - el = element; - while (el.parentNode) { - if (el.id && re.test(el.id)) return el.id.replace(re, "$1"); - el = el.parentNode; - } - // 2. look in thumbnail - if (!expOnly) { - el = element; - while (el.parentNode) { - if (el.tagName && hs.isHsAnchor(el)) { - for (var key = 0; key < hs.expanders.length; key++) { - var exp = hs.expanders[key]; - if (exp && exp.a == el) return key; - } - } - el = el.parentNode; - } - } - return null; -}, - -getExpander : function (el, expOnly) { - if (typeof el == 'undefined') return hs.expanders[hs.focusKey] || null; - if (typeof el == 'number') return hs.expanders[el] || null; - if (typeof el == 'string') el = hs.$(el); - return hs.expanders[hs.getWrapperKey(el, expOnly)] || null; -}, - -isHsAnchor : function (a) { - return (a.onclick && a.onclick.toString().replace(/\s/g, ' ').match(/hs.(htmlE|e)xpand/)); -}, - -reOrder : function () { - for (var i = 0; i < hs.expanders.length; i++) - if (hs.expanders[i] && hs.expanders[i].isExpanded) hs.focusTopmost(); -}, - -mouseClickHandler : function(e) -{ - if (!e) e = window.event; - if (e.button > 1) return true; - if (!e.target) e.target = e.srcElement; - - var el = e.target; - while (el.parentNode - && !(/highslide-(image|move|html|resize)/.test(el.className))) - { - el = el.parentNode; - } - var exp = hs.getExpander(el); - if (exp && (exp.isClosing || !exp.isExpanded)) return true; - - if (exp && e.type == 'mousedown') { - if (e.target.form) return true; - var match = el.className.match(/highslide-(image|move|resize)/); - if (match) { - hs.dragArgs = { - exp: exp , - type: match[1], - left: exp.x.pos, - width: exp.x.size, - top: exp.y.pos, - height: exp.y.size, - clickX: e.clientX, - clickY: e.clientY - }; - - - hs.addEventListener(document, 'mousemove', hs.dragHandler); - if (e.preventDefault) e.preventDefault(); // FF - - if (/highslide-(image|html)-blur/.test(exp.content.className)) { - exp.focus(); - hs.hasFocused = true; - } - return false; - } - else if (/highslide-html/.test(el.className) && hs.focusKey != exp.key) { - exp.focus(); - exp.doShowHide('hidden'); - } - } else if (e.type == 'mouseup') { - - hs.removeEventListener(document, 'mousemove', hs.dragHandler); - - if (hs.dragArgs) { - if (hs.styleRestoreCursor && hs.dragArgs.type == 'image') - hs.dragArgs.exp.content.style.cursor = hs.styleRestoreCursor; - var hasDragged = hs.dragArgs.hasDragged; - - if (!hasDragged &&!hs.hasFocused && !/(move|resize)/.test(hs.dragArgs.type)) { - exp.close(); - } - else if (hasDragged || (!hasDragged && hs.hasHtmlExpanders)) { - hs.dragArgs.exp.doShowHide('hidden'); - } - - if (hs.dragArgs.exp.releaseMask) - hs.dragArgs.exp.releaseMask.style.display = 'none'; - hs.hasFocused = false; - hs.dragArgs = null; - - } else if (/highslide-image-blur/.test(el.className)) { - el.style.cursor = hs.styleRestoreCursor; - } - } - return false; -}, - -dragHandler : function(e) -{ - if (!hs.dragArgs) return true; - if (!e) e = window.event; - var a = hs.dragArgs, exp = a.exp; - if (exp.iframe) { - if (!exp.releaseMask) exp.releaseMask = hs.createElement('div', null, - { position: 'absolute', width: exp.x.size+'px', height: exp.y.size+'px', - left: exp.x.cb+'px', top: exp.y.cb+'px', zIndex: 4, background: (hs.ieLt9 ? 'white' : 'none'), - opacity: 0.01 }, - exp.wrapper, true); - if (exp.releaseMask.style.display == 'none') - exp.releaseMask.style.display = ''; - } - - a.dX = e.clientX - a.clickX; - a.dY = e.clientY - a.clickY; - - var distance = Math.sqrt(Math.pow(a.dX, 2) + Math.pow(a.dY, 2)); - if (!a.hasDragged) a.hasDragged = (a.type != 'image' && distance > 0) - || (distance > (hs.dragSensitivity || 5)); - - if (a.hasDragged && e.clientX > 5 && e.clientY > 5) { - - if (a.type == 'resize') exp.resize(a); - else { - exp.moveTo(a.left + a.dX, a.top + a.dY); - if (a.type == 'image') exp.content.style.cursor = 'move'; - } - } - return false; -}, - -wrapperMouseHandler : function (e) { - try { - if (!e) e = window.event; - var over = /mouseover/i.test(e.type); - if (!e.target) e.target = e.srcElement; // ie - if (!e.relatedTarget) e.relatedTarget = - over ? e.fromElement : e.toElement; // ie - var exp = hs.getExpander(e.target); - if (!exp.isExpanded) return; - if (!exp || !e.relatedTarget || hs.getExpander(e.relatedTarget, true) == exp - || hs.dragArgs) return; - for (var i = 0; i < exp.overlays.length; i++) (function() { - var o = hs.$('hsId'+ exp.overlays[i]); - if (o && o.hideOnMouseOut) { - if (over) hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: over ? o.opacity : 0 }, o.dur); - } - })(); - } catch (e) {} -}, -addEventListener : function (el, event, func) { - if (el == document && event == 'ready') { - hs.push(hs.onReady, func); - } - try { - el.addEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - el.attachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = func; - } - } -}, - -removeEventListener : function (el, event, func) { - try { - el.removeEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = null; - } - } -}, - -preloadFullImage : function (i) { - if (hs.continuePreloading && hs.preloadTheseImages[i] && hs.preloadTheseImages[i] != 'undefined') { - var img = document.createElement('img'); - img.onload = function() { - img = null; - hs.preloadFullImage(i + 1); - }; - img.src = hs.preloadTheseImages[i]; - } -}, -preloadImages : function (number) { - if (number && typeof number != 'object') hs.numberOfImagesToPreload = number; - - var arr = hs.getAnchors(); - for (var i = 0; i < arr.images.length && i < hs.numberOfImagesToPreload; i++) { - hs.push(hs.preloadTheseImages, hs.getSrc(arr.images[i])); - } - - // preload outlines - if (hs.outlineType) new hs.Outline(hs.outlineType, function () { hs.preloadFullImage(0)} ); - else - - hs.preloadFullImage(0); - - // preload cursor - if (hs.restoreCursor) var cur = hs.createElement('img', { src: hs.graphicsDir + hs.restoreCursor }); -}, - - -init : function () { - if (!hs.container) { - - hs.ieLt7 = hs.ie && hs.uaVersion < 7; - hs.ieLt9 = hs.ie && hs.uaVersion < 9; - - hs.getPageSize(); - hs.ie6SSL = hs.ieLt7 && location.protocol == 'https:'; - for (var x in hs.langDefaults) { - if (typeof hs[x] != 'undefined') hs.lang[x] = hs[x]; - else if (typeof hs.lang[x] == 'undefined' && typeof hs.langDefaults[x] != 'undefined') - hs.lang[x] = hs.langDefaults[x]; - } - - hs.container = hs.createElement('div', { - className: 'highslide-container' - }, { - position: 'absolute', - left: 0, - top: 0, - width: '100%', - zIndex: hs.zIndexCounter, - direction: 'ltr' - }, - document.body, - true - ); - hs.loading = hs.createElement('a', { - className: 'highslide-loading', - title: hs.lang.loadingTitle, - innerHTML: hs.lang.loadingText, - href: 'javascript:;' - }, { - position: 'absolute', - top: '-9999px', - opacity: hs.loadingOpacity, - zIndex: 1 - }, hs.container - ); - hs.garbageBin = hs.createElement('div', null, { display: 'none' }, hs.container); - hs.clearing = hs.createElement('div', null, - { clear: 'both', paddingTop: '1px' }, null, true); - - // http://www.robertpenner.com/easing/ - Math.linearTween = function (t, b, c, d) { - return c*t/d + b; - }; - Math.easeInQuad = function (t, b, c, d) { - return c*(t/=d)*t + b; - }; - - hs.hideSelects = hs.ieLt7; - hs.hideIframes = ((window.opera && hs.uaVersion < 9) || navigator.vendor == 'KDE' - || (hs.ieLt7 && hs.uaVersion < 5.5)); - } -}, -ready : function() { - if (hs.isReady) return; - hs.isReady = true; - for (var i = 0; i < hs.onReady.length; i++) hs.onReady[i](); -}, - -updateAnchors : function() { - var el, els, all = [], images = [], htmls = [],groups = {}, re; - - for (var i = 0; i < hs.openerTagNames.length; i++) { - els = document.getElementsByTagName(hs.openerTagNames[i]); - for (var j = 0; j < els.length; j++) { - el = els[j]; - re = hs.isHsAnchor(el); - if (re) { - hs.push(all, el); - if (re[0] == 'hs.expand') hs.push(images, el); - else if (re[0] == 'hs.htmlExpand') hs.push(htmls, el); - var g = hs.getParam(el, 'slideshowGroup') || 'none'; - if (!groups[g]) groups[g] = []; - hs.push(groups[g], el); - } - } - } - hs.anchors = { all: all, groups: groups, images: images, htmls: htmls }; - return hs.anchors; - -}, - -getAnchors : function() { - return hs.anchors || hs.updateAnchors(); -}, - - -close : function(el) { - var exp = hs.getExpander(el); - if (exp) exp.close(); - return false; -} -}; // end hs object -hs.fx = function( elem, options, prop ){ - this.options = options; - this.elem = elem; - this.prop = prop; - - if (!options.orig) options.orig = {}; -}; -hs.fx.prototype = { - update: function(){ - (hs.fx.step[this.prop] || hs.fx.step._default)(this); - - if (this.options.step) - this.options.step.call(this.elem, this.now, this); - - }, - custom: function(from, to, unit){ - this.startTime = (new Date()).getTime(); - this.start = from; - this.end = to; - this.unit = unit;// || this.unit || "px"; - this.now = this.start; - this.pos = this.state = 0; - - var self = this; - function t(gotoEnd){ - return self.step(gotoEnd); - } - - t.elem = this.elem; - - if ( t() && hs.timers.push(t) == 1 ) { - hs.timerId = setInterval(function(){ - var timers = hs.timers; - - for ( var i = 0; i < timers.length; i++ ) - if ( !timers[i]() ) - timers.splice(i--, 1); - - if ( !timers.length ) { - clearInterval(hs.timerId); - } - }, 13); - } - }, - step: function(gotoEnd){ - var t = (new Date()).getTime(); - if ( gotoEnd || t >= this.options.duration + this.startTime ) { - this.now = this.end; - this.pos = this.state = 1; - this.update(); - - this.options.curAnim[ this.prop ] = true; - - var done = true; - for ( var i in this.options.curAnim ) - if ( this.options.curAnim[i] !== true ) - done = false; - - if ( done ) { - if (this.options.complete) this.options.complete.call(this.elem); - } - return false; - } else { - var n = t - this.startTime; - this.state = n / this.options.duration; - this.pos = this.options.easing(n, 0, 1, this.options.duration); - this.now = this.start + ((this.end - this.start) * this.pos); - this.update(); - } - return true; - } - -}; - -hs.extend( hs.fx, { - step: { - - opacity: function(fx){ - hs.setStyles(fx.elem, { opacity: fx.now }); - }, - - _default: function(fx){ - try { - if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) - fx.elem.style[ fx.prop ] = fx.now + fx.unit; - else - fx.elem[ fx.prop ] = fx.now; - } catch (e) {} - } - } -}); - -hs.Outline = function (outlineType, onLoad) { - this.onLoad = onLoad; - this.outlineType = outlineType; - var v = hs.uaVersion, tr; - - this.hasAlphaImageLoader = hs.ie && hs.uaVersion < 7; - if (!outlineType) { - if (onLoad) onLoad(); - return; - } - - hs.init(); - this.table = hs.createElement( - 'table', { - cellSpacing: 0 - }, { - visibility: 'hidden', - position: 'absolute', - borderCollapse: 'collapse', - width: 0 - }, - hs.container, - true - ); - var tbody = hs.createElement('tbody', null, null, this.table, 1); - - this.td = []; - for (var i = 0; i <= 8; i++) { - if (i % 3 == 0) tr = hs.createElement('tr', null, { height: 'auto' }, tbody, true); - this.td[i] = hs.createElement('td', null, null, tr, true); - var style = i != 4 ? { lineHeight: 0, fontSize: 0} : { position : 'relative' }; - hs.setStyles(this.td[i], style); - } - this.td[4].className = outlineType +' highslide-outline'; - - this.preloadGraphic(); -}; - -hs.Outline.prototype = { -preloadGraphic : function () { - var src = hs.graphicsDir + (hs.outlinesDir || "outlines/")+ this.outlineType +".png"; - - var appendTo = hs.safari && hs.uaVersion < 525 ? hs.container : null; - this.graphic = hs.createElement('img', null, { position: 'absolute', - top: '-9999px' }, appendTo, true); // for onload trigger - - var pThis = this; - this.graphic.onload = function() { pThis.onGraphicLoad(); }; - - this.graphic.src = src; -}, - -onGraphicLoad : function () { - var o = this.offset = this.graphic.width / 4, - pos = [[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]], - dim = { height: (2*o) +'px', width: (2*o) +'px' }; - for (var i = 0; i <= 8; i++) { - if (pos[i]) { - if (this.hasAlphaImageLoader) { - var w = (i == 1 || i == 7) ? '100%' : this.graphic.width +'px'; - var div = hs.createElement('div', null, { width: '100%', height: '100%', position: 'relative', overflow: 'hidden'}, this.td[i], true); - hs.createElement ('div', null, { - filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+ this.graphic.src + "')", - position: 'absolute', - width: w, - height: this.graphic.height +'px', - left: (pos[i][0]*o)+'px', - top: (pos[i][1]*o)+'px' - }, - div, - true); - } else { - hs.setStyles(this.td[i], { background: 'url('+ this.graphic.src +') '+ (pos[i][0]*o)+'px '+(pos[i][1]*o)+'px'}); - } - - if (window.opera && (i == 3 || i ==5)) - hs.createElement('div', null, dim, this.td[i], true); - - hs.setStyles (this.td[i], dim); - } - } - this.graphic = null; - if (hs.pendingOutlines[this.outlineType]) hs.pendingOutlines[this.outlineType].destroy(); - hs.pendingOutlines[this.outlineType] = this; - if (this.onLoad) this.onLoad(); -}, - -setPosition : function (pos, offset, vis, dur, easing) { - var exp = this.exp, - stl = exp.wrapper.style, - offset = offset || 0, - pos = pos || { - x: exp.x.pos + offset, - y: exp.y.pos + offset, - w: exp.x.get('wsize') - 2 * offset, - h: exp.y.get('wsize') - 2 * offset - }; - if (vis) this.table.style.visibility = (pos.h >= 4 * this.offset) - ? 'visible' : 'hidden'; - hs.setStyles(this.table, { - left: (pos.x - this.offset) +'px', - top: (pos.y - this.offset) +'px', - width: (pos.w + 2 * this.offset) +'px' - }); - - pos.w -= 2 * this.offset; - pos.h -= 2 * this.offset; - hs.setStyles (this.td[4], { - width: pos.w >= 0 ? pos.w +'px' : 0, - height: pos.h >= 0 ? pos.h +'px' : 0 - }); - if (this.hasAlphaImageLoader) this.td[3].style.height - = this.td[5].style.height = this.td[4].style.height; - -}, - -destroy : function(hide) { - if (hide) this.table.style.visibility = 'hidden'; - else hs.discardElement(this.table); -} -}; - -hs.Dimension = function(exp, dim) { - this.exp = exp; - this.dim = dim; - this.ucwh = dim == 'x' ? 'Width' : 'Height'; - this.wh = this.ucwh.toLowerCase(); - this.uclt = dim == 'x' ? 'Left' : 'Top'; - this.lt = this.uclt.toLowerCase(); - this.ucrb = dim == 'x' ? 'Right' : 'Bottom'; - this.rb = this.ucrb.toLowerCase(); - this.p1 = this.p2 = 0; -}; -hs.Dimension.prototype = { -get : function(key) { - switch (key) { - case 'loadingPos': - return this.tpos + this.tb + (this.t - hs.loading['offset'+ this.ucwh]) / 2; - case 'wsize': - return this.size + 2 * this.cb + this.p1 + this.p2; - case 'fitsize': - return this.clientSize - this.marginMin - this.marginMax; - case 'maxsize': - return this.get('fitsize') - 2 * this.cb - this.p1 - this.p2 ; - case 'opos': - return this.pos - (this.exp.outline ? this.exp.outline.offset : 0); - case 'osize': - return this.get('wsize') + (this.exp.outline ? 2*this.exp.outline.offset : 0); - case 'imgPad': - return this.imgSize ? Math.round((this.size - this.imgSize) / 2) : 0; - - } -}, -calcBorders: function() { - // correct for borders - this.cb = (this.exp.content['offset'+ this.ucwh] - this.t) / 2; - - this.marginMax = hs['margin'+ this.ucrb]; -}, -calcThumb: function() { - this.t = this.exp.el[this.wh] ? parseInt(this.exp.el[this.wh]) : - this.exp.el['offset'+ this.ucwh]; - this.tpos = this.exp.tpos[this.dim]; - this.tb = (this.exp.el['offset'+ this.ucwh] - this.t) / 2; - if (this.tpos == 0 || this.tpos == -1) { - this.tpos = (hs.page[this.wh] / 2) + hs.page['scroll'+ this.uclt]; - }; -}, -calcExpanded: function() { - var exp = this.exp; - this.justify = 'auto'; - - - // size and position - this.pos = this.tpos - this.cb + this.tb; - - if (this.maxHeight && this.dim == 'x') - exp.maxWidth = Math.min(exp.maxWidth || this.full, exp.maxHeight * this.full / exp.y.full); - - this.size = Math.min(this.full, exp['max'+ this.ucwh] || this.full); - this.minSize = exp.allowSizeReduction ? - Math.min(exp['min'+ this.ucwh], this.full) :this.full; - if (exp.isImage && exp.useBox) { - this.size = exp[this.wh]; - this.imgSize = this.full; - } - if (this.dim == 'x' && hs.padToMinWidth) this.minSize = exp.minWidth; - this.marginMin = hs['margin'+ this.uclt]; - this.scroll = hs.page['scroll'+ this.uclt]; - this.clientSize = hs.page[this.wh]; -}, -setSize: function(i) { - var exp = this.exp; - if (exp.isImage && (exp.useBox || hs.padToMinWidth)) { - this.imgSize = i; - this.size = Math.max(this.size, this.imgSize); - exp.content.style[this.lt] = this.get('imgPad')+'px'; - } else - this.size = i; - - exp.content.style[this.wh] = i +'px'; - exp.wrapper.style[this.wh] = this.get('wsize') +'px'; - if (exp.outline) exp.outline.setPosition(); - if (exp.releaseMask) exp.releaseMask.style[this.wh] = i +'px'; - if (this.dim == 'y' && exp.iDoc && exp.body.style.height != 'auto') try { - exp.iDoc.body.style.overflow = 'auto'; - } catch (e) {} - if (exp.isHtml) { - var d = exp.scrollerDiv; - if (this.sizeDiff === undefined) - this.sizeDiff = exp.innerContent['offset'+ this.ucwh] - d['offset'+ this.ucwh]; - d.style[this.wh] = (this.size - this.sizeDiff) +'px'; - - if (this.dim == 'x') exp.mediumContent.style.width = 'auto'; - if (exp.body) exp.body.style[this.wh] = 'auto'; - } - if (this.dim == 'x' && exp.overlayBox) exp.sizeOverlayBox(true); -}, -setPos: function(i) { - this.pos = i; - this.exp.wrapper.style[this.lt] = i +'px'; - - if (this.exp.outline) this.exp.outline.setPosition(); - -} -}; - -hs.Expander = function(a, params, custom, contentType) { - if (document.readyState && hs.ie && !hs.isReady) { - hs.addEventListener(document, 'ready', function() { - new hs.Expander(a, params, custom, contentType); - }); - return; - } - this.a = a; - this.custom = custom; - this.contentType = contentType || 'image'; - this.isHtml = (contentType == 'html'); - this.isImage = !this.isHtml; - - hs.continuePreloading = false; - this.overlays = []; - hs.init(); - var key = this.key = hs.expanders.length; - // override inline parameters - for (var i = 0; i < hs.overrides.length; i++) { - var name = hs.overrides[i]; - this[name] = params && typeof params[name] != 'undefined' ? - params[name] : hs[name]; - } - if (!this.src) this.src = a.href; - - // get thumb - var el = (params && params.thumbnailId) ? hs.$(params.thumbnailId) : a; - el = this.thumb = el.getElementsByTagName('img')[0] || el; - this.thumbsUserSetId = el.id || a.id; - - // check if already open - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].a == a) { - hs.expanders[i].focus(); - return false; - } - } - - // cancel other - if (!hs.allowSimultaneousLoading) for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].thumb != el && !hs.expanders[i].onLoadStarted) { - hs.expanders[i].cancelLoading(); - } - } - hs.expanders[key] = this; - if (!hs.allowMultipleInstances && !hs.upcoming) { - if (hs.expanders[key-1]) hs.expanders[key-1].close(); - if (typeof hs.focusKey != 'undefined' && hs.expanders[hs.focusKey]) - hs.expanders[hs.focusKey].close(); - } - - // initiate metrics - this.el = el; - this.tpos = this.pageOrigin || hs.getPosition(el); - hs.getPageSize(); - var x = this.x = new hs.Dimension(this, 'x'); - x.calcThumb(); - var y = this.y = new hs.Dimension(this, 'y'); - y.calcThumb(); - this.wrapper = hs.createElement( - 'div', { - id: 'highslide-wrapper-'+ this.key, - className: 'highslide-wrapper '+ this.wrapperClassName - }, { - visibility: 'hidden', - position: 'absolute', - zIndex: hs.zIndexCounter += 2 - }, null, true ); - - this.wrapper.onmouseover = this.wrapper.onmouseout = hs.wrapperMouseHandler; - if (this.contentType == 'image' && this.outlineWhileAnimating == 2) - this.outlineWhileAnimating = 0; - - // get the outline - if (!this.outlineType) { - this[this.contentType +'Create'](); - - } else if (hs.pendingOutlines[this.outlineType]) { - this.connectOutline(); - this[this.contentType +'Create'](); - - } else { - this.showLoading(); - var exp = this; - new hs.Outline(this.outlineType, - function () { - exp.connectOutline(); - exp[exp.contentType +'Create'](); - } - ); - } - return true; -}; - -hs.Expander.prototype = { -error : function(e) { - if (hs.debug) alert ('Line '+ e.lineNumber +': '+ e.message); - else window.location.href = this.src; -}, - -connectOutline : function() { - var outline = this.outline = hs.pendingOutlines[this.outlineType]; - outline.exp = this; - outline.table.style.zIndex = this.wrapper.style.zIndex - 1; - hs.pendingOutlines[this.outlineType] = null; -}, - -showLoading : function() { - if (this.onLoadStarted || this.loading) return; - - this.loading = hs.loading; - var exp = this; - this.loading.onclick = function() { - exp.cancelLoading(); - }; - var exp = this, - l = this.x.get('loadingPos') +'px', - t = this.y.get('loadingPos') +'px'; - setTimeout(function () { - if (exp.loading) hs.setStyles(exp.loading, { left: l, top: t, zIndex: hs.zIndexCounter++ })} - , 100); -}, - -imageCreate : function() { - var exp = this; - - var img = document.createElement('img'); - this.content = img; - img.onload = function () { - if (hs.expanders[exp.key]) exp.contentLoaded(); - }; - if (hs.blockRightClick) img.oncontextmenu = function() { return false; }; - img.className = 'highslide-image'; - hs.setStyles(img, { - visibility: 'hidden', - display: 'block', - position: 'absolute', - maxWidth: '9999px', - zIndex: 3 - }); - img.title = hs.lang.restoreTitle; - if (hs.safari && hs.uaVersion < 525) hs.container.appendChild(img); - if (hs.ie && hs.flushImgSize) img.src = null; - img.src = this.src; - - this.showLoading(); -}, - -htmlCreate : function () { - - this.content = hs.getCacheBinding(this.a); - if (!this.content) - this.content = hs.getNode(this.contentId); - if (!this.content) - this.content = hs.getSelfRendered(); - this.getInline(['maincontent']); - if (this.maincontent) { - var body = hs.getElementByClass(this.content, 'div', 'highslide-body'); - if (body) body.appendChild(this.maincontent); - this.maincontent.style.display = 'block'; - } - - var innerContent = this.innerContent = this.content; - - if (/(swf|iframe)/.test(this.objectType)) this.setObjContainerSize(innerContent); - - // the content tree - hs.container.appendChild(this.wrapper); - hs.setStyles( this.wrapper, { - position: 'static', - padding: '0 '+ hs.marginRight +'px 0 '+ hs.marginLeft +'px' - }); - this.content = hs.createElement( - 'div', { - className: 'highslide-html' - }, { - position: 'relative', - zIndex: 3, - height: 0, - overflow: 'hidden' - }, - this.wrapper - ); - this.mediumContent = hs.createElement('div', null, null, this.content, 1); - this.mediumContent.appendChild(innerContent); - - hs.setStyles (innerContent, { - position: 'relative', - display: 'block', - direction: hs.lang.cssDirection || '' - }); - if (this.width) innerContent.style.width = this.width +'px'; - if (this.height) hs.setStyles(innerContent, { - height: this.height +'px', - overflow: 'hidden' - }); - if (innerContent.offsetWidth < this.minWidth) - innerContent.style.width = this.minWidth +'px'; - - - - if (this.objectType == 'ajax' && !hs.getCacheBinding(this.a)) { - this.showLoading(); - var exp = this; - var ajax = new hs.Ajax(this.a, innerContent); - ajax.src = this.src; - ajax.onLoad = function () { if (hs.expanders[exp.key]) exp.contentLoaded(); }; - ajax.onError = function () { location.href = exp.src; }; - ajax.run(); - } - else - - if (this.objectType == 'iframe' && this.objectLoadTime == 'before') { - this.writeExtendedContent(); - } - else - this.contentLoaded(); -}, - -contentLoaded : function() { - try { - if (!this.content) return; - this.content.onload = null; - if (this.onLoadStarted) return; - else this.onLoadStarted = true; - - var x = this.x, y = this.y; - - if (this.loading) { - hs.setStyles(this.loading, { top: '-9999px' }); - this.loading = null; - } - if (this.isImage) { - x.full = this.content.width; - y.full = this.content.height; - - hs.setStyles(this.content, { - width: x.t +'px', - height: y.t +'px' - }); - this.wrapper.appendChild(this.content); - hs.container.appendChild(this.wrapper); - } else if (this.htmlGetSize) this.htmlGetSize(); - - x.calcBorders(); - y.calcBorders(); - - hs.setStyles (this.wrapper, { - left: (x.tpos + x.tb - x.cb) +'px', - top: (y.tpos + x.tb - y.cb) +'px' - }); - this.getOverlays(); - - var ratio = x.full / y.full; - x.calcExpanded(); - this.justify(x); - - y.calcExpanded(); - this.justify(y); - if (this.isHtml) this.htmlSizeOperations(); - if (this.overlayBox) this.sizeOverlayBox(0, 1); - - - if (this.allowSizeReduction) { - if (this.isImage) - this.correctRatio(ratio); - else this.fitOverlayBox(); - if (this.isImage && this.x.full > (this.x.imgSize || this.x.size)) { - this.createFullExpand(); - if (this.overlays.length == 1) this.sizeOverlayBox(); - } - } - this.show(); - - } catch (e) { - this.error(e); - } -}, - - -setObjContainerSize : function(parent, auto) { - var c = hs.getElementByClass(parent, 'DIV', 'highslide-body'); - if (/(iframe|swf)/.test(this.objectType)) { - if (this.objectWidth) c.style.width = this.objectWidth +'px'; - if (this.objectHeight) c.style.height = this.objectHeight +'px'; - } -}, - -writeExtendedContent : function () { - if (this.hasExtendedContent) return; - var exp = this; - this.body = hs.getElementByClass(this.innerContent, 'DIV', 'highslide-body'); - if (this.objectType == 'iframe') { - this.showLoading(); - var ruler = hs.clearing.cloneNode(1); - this.body.appendChild(ruler); - this.newWidth = this.innerContent.offsetWidth; - if (!this.objectWidth) this.objectWidth = ruler.offsetWidth; - var hDiff = this.innerContent.offsetHeight - this.body.offsetHeight, - h = this.objectHeight || hs.page.height - hDiff - hs.marginTop - hs.marginBottom, - onload = this.objectLoadTime == 'before' ? - ' onload="if (hs.expanders['+ this.key +']) hs.expanders['+ this.key +'].contentLoaded()" ' : ''; - this.body.innerHTML += ''; - this.ruler = this.body.getElementsByTagName('div')[0]; - this.iframe = this.body.getElementsByTagName('iframe')[0]; - - if (this.objectLoadTime == 'after') this.correctIframeSize(); - - } - if (this.objectType == 'swf') { - this.body.id = this.body.id || 'hs-flash-id-' + this.key; - var a = this.swfOptions; - if (!a.params) a.params = {}; - if (typeof a.params.wmode == 'undefined') a.params.wmode = 'transparent'; - if (swfobject) swfobject.embedSWF(this.src, this.body.id, this.objectWidth, this.objectHeight, - a.version || '7', a.expressInstallSwfurl, a.flashvars, a.params, a.attributes); - } - this.hasExtendedContent = true; -}, -htmlGetSize : function() { - if (this.iframe && !this.objectHeight) { // loadtime before - this.iframe.style.height = this.body.style.height = this.getIframePageHeight() +'px'; - } - this.innerContent.appendChild(hs.clearing); - if (!this.x.full) this.x.full = this.innerContent.offsetWidth; - this.y.full = this.innerContent.offsetHeight; - this.innerContent.removeChild(hs.clearing); - if (hs.ie && this.newHeight > parseInt(this.innerContent.currentStyle.height)) { // ie css bug - this.newHeight = parseInt(this.innerContent.currentStyle.height); - } - hs.setStyles( this.wrapper, { position: 'absolute', padding: '0'}); - hs.setStyles( this.content, { width: this.x.t +'px', height: this.y.t +'px'}); - -}, - -getIframePageHeight : function() { - var h; - try { - var doc = this.iDoc = this.iframe.contentDocument || this.iframe.contentWindow.document; - var clearing = doc.createElement('div'); - clearing.style.clear = 'both'; - doc.body.appendChild(clearing); - h = clearing.offsetTop; - if (hs.ie) h += parseInt(doc.body.currentStyle.marginTop) - + parseInt(doc.body.currentStyle.marginBottom) - 1; - } catch (e) { // other domain - h = 300; - } - return h; -}, -correctIframeSize : function () { - var wDiff = this.innerContent.offsetWidth - this.ruler.offsetWidth; - hs.discardElement(this.ruler); - if (wDiff < 0) wDiff = 0; - - var hDiff = this.innerContent.offsetHeight - this.iframe.offsetHeight; - if (this.iDoc && !this.objectHeight && !this.height && this.y.size == this.y.full) try { - this.iDoc.body.style.overflow = 'hidden'; - } catch (e) {} - hs.setStyles(this.iframe, { - width: Math.abs(this.x.size - wDiff) +'px', - height: Math.abs(this.y.size - hDiff) +'px' - }); - hs.setStyles(this.body, { - width: this.iframe.style.width, - height: this.iframe.style.height - }); - - this.scrollingContent = this.iframe; - this.scrollerDiv = this.scrollingContent; - -}, -htmlSizeOperations : function () { - - this.setObjContainerSize(this.innerContent); - - - if (this.objectType == 'swf' && this.objectLoadTime == 'before') this.writeExtendedContent(); - - // handle minimum size - if (this.x.size < this.x.full && !this.allowWidthReduction) this.x.size = this.x.full; - if (this.y.size < this.y.full && !this.allowHeightReduction) this.y.size = this.y.full; - this.scrollerDiv = this.innerContent; - hs.setStyles(this.mediumContent, { - position: 'relative', - width: this.x.size +'px' - }); - hs.setStyles(this.innerContent, { - border: 'none', - width: 'auto', - height: 'auto' - }); - var node = hs.getElementByClass(this.innerContent, 'DIV', 'highslide-body'); - if (node && !/(iframe|swf)/.test(this.objectType)) { - var cNode = node; // wrap to get true size - node = hs.createElement(cNode.nodeName, null, {overflow: 'hidden'}, null, true); - cNode.parentNode.insertBefore(node, cNode); - node.appendChild(hs.clearing); // IE6 - node.appendChild(cNode); - - var wDiff = this.innerContent.offsetWidth - node.offsetWidth; - var hDiff = this.innerContent.offsetHeight - node.offsetHeight; - node.removeChild(hs.clearing); - - var kdeBugCorr = hs.safari || navigator.vendor == 'KDE' ? 1 : 0; // KDE repainting bug - hs.setStyles(node, { - width: (this.x.size - wDiff - kdeBugCorr) +'px', - height: (this.y.size - hDiff) +'px', - overflow: 'auto', - position: 'relative' - } - ); - if (kdeBugCorr && cNode.offsetHeight > node.offsetHeight) { - node.style.width = (parseInt(node.style.width) + kdeBugCorr) + 'px'; - } - this.scrollingContent = node; - this.scrollerDiv = this.scrollingContent; - } - if (this.iframe && this.objectLoadTime == 'before') this.correctIframeSize(); - if (!this.scrollingContent && this.y.size < this.mediumContent.offsetHeight) this.scrollerDiv = this.content; - - if (this.scrollerDiv == this.content && !this.allowWidthReduction && !/(iframe|swf)/.test(this.objectType)) { - this.x.size += 17; // room for scrollbars - } - if (this.scrollerDiv && this.scrollerDiv.offsetHeight > this.scrollerDiv.parentNode.offsetHeight) { - setTimeout("try { hs.expanders["+ this.key +"].scrollerDiv.style.overflow = 'auto'; } catch(e) {}", - hs.expandDuration); - } -}, - -justify : function (p, moveOnly) { - var tgtArr, tgt = p.target, dim = p == this.x ? 'x' : 'y'; - - var hasMovedMin = false; - - var allowReduce = p.exp.allowSizeReduction; - p.pos = Math.round(p.pos - ((p.get('wsize') - p.t) / 2)); - if (p.pos < p.scroll + p.marginMin) { - p.pos = p.scroll + p.marginMin; - hasMovedMin = true; - } - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - if (p.pos + p.get('wsize') > p.scroll + p.clientSize - p.marginMax) { - if (!moveOnly && hasMovedMin && allowReduce) { - p.size = Math.min(p.size, p.get(dim == 'y' ? 'fitsize' : 'maxsize')); - } else if (p.get('wsize') < p.get('fitsize')) { - p.pos = p.scroll + p.clientSize - p.marginMax - p.get('wsize'); - } else { // image larger than viewport - p.pos = p.scroll + p.marginMin; - if (!moveOnly && allowReduce) p.size = p.get(dim == 'y' ? 'fitsize' : 'maxsize'); - } - } - - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - - - - if (p.pos < p.marginMin) { - var tmpMin = p.pos; - p.pos = p.marginMin; - - if (allowReduce && !moveOnly) p.size = p.size - (p.pos - tmpMin); - - } -}, - -correctRatio : function(ratio) { - var x = this.x, - y = this.y, - changed = false, - xSize = Math.min(x.full, x.size), - ySize = Math.min(y.full, y.size), - useBox = (this.useBox || hs.padToMinWidth); - - if (xSize / ySize > ratio) { // width greater - xSize = ySize * ratio; - if (xSize < x.minSize) { // below minWidth - xSize = x.minSize; - ySize = xSize / ratio; - } - changed = true; - - } else if (xSize / ySize < ratio) { // height greater - ySize = xSize / ratio; - changed = true; - } - - if (hs.padToMinWidth && x.full < x.minSize) { - x.imgSize = x.full; - y.size = y.imgSize = y.full; - } else if (this.useBox) { - x.imgSize = xSize; - y.imgSize = ySize; - } else { - x.size = xSize; - y.size = ySize; - } - changed = this.fitOverlayBox(this.useBox ? null : ratio, changed); - if (useBox && y.size < y.imgSize) { - y.imgSize = y.size; - x.imgSize = y.size * ratio; - } - if (changed || useBox) { - x.pos = x.tpos - x.cb + x.tb; - x.minSize = x.size; - this.justify(x, true); - - y.pos = y.tpos - y.cb + y.tb; - y.minSize = y.size; - this.justify(y, true); - if (this.overlayBox) this.sizeOverlayBox(); - } - - -}, -fitOverlayBox : function(ratio, changed) { - var x = this.x, y = this.y; - if (this.overlayBox && (this.isImage || this.allowHeightReduction)) { - while (y.size > this.minHeight && x.size > this.minWidth - && y.get('wsize') > y.get('fitsize')) { - y.size -= 10; - if (ratio) x.size = y.size * ratio; - this.sizeOverlayBox(0, 1); - changed = true; - } - } - return changed; -}, - -show : function () { - var x = this.x, y = this.y; - this.doShowHide('hidden'); - - // Apply size change - this.changeSize( - 1, { - wrapper: { - width : x.get('wsize'), - height : y.get('wsize'), - left: x.pos, - top: y.pos - }, - content: { - left: x.p1 + x.get('imgPad'), - top: y.p1 + y.get('imgPad'), - width:x.imgSize ||x.size, - height:y.imgSize ||y.size - } - }, - hs.expandDuration - ); -}, - -changeSize : function(up, to, dur) { - - if (this.outline && !this.outlineWhileAnimating) { - if (up) this.outline.setPosition(); - else this.outline.destroy( - (this.isHtml && this.preserveContent)); - } - - - if (!up) this.destroyOverlays(); - - var exp = this, - x = exp.x, - y = exp.y, - easing = this.easing; - if (!up) easing = this.easingClose || easing; - var after = up ? - function() { - - if (exp.outline) exp.outline.table.style.visibility = "visible"; - setTimeout(function() { - exp.afterExpand(); - }, 50); - } : - function() { - exp.afterClose(); - }; - if (up) hs.setStyles( this.wrapper, { - width: x.t +'px', - height: y.t +'px' - }); - if (up && this.isHtml) { - hs.setStyles(this.wrapper, { - left: (x.tpos - x.cb + x.tb) +'px', - top: (y.tpos - y.cb + y.tb) +'px' - }); - } - if (this.fadeInOut) { - hs.setStyles(this.wrapper, { opacity: up ? 0 : 1 }); - hs.extend(to.wrapper, { opacity: up }); - } - hs.animate( this.wrapper, to.wrapper, { - duration: dur, - easing: easing, - step: function(val, args) { - if (exp.outline && exp.outlineWhileAnimating && args.prop == 'top') { - var fac = up ? args.pos : 1 - args.pos; - var pos = { - w: x.t + (x.get('wsize') - x.t) * fac, - h: y.t + (y.get('wsize') - y.t) * fac, - x: x.tpos + (x.pos - x.tpos) * fac, - y: y.tpos + (y.pos - y.tpos) * fac - }; - exp.outline.setPosition(pos, 0, 1); - } - if (exp.isHtml) { - if (args.prop == 'left') - exp.mediumContent.style.left = (x.pos - val) +'px'; - if (args.prop == 'top') - exp.mediumContent.style.top = (y.pos - val) +'px'; - } - } - }); - hs.animate( this.content, to.content, dur, easing, after); - if (up) { - this.wrapper.style.visibility = 'visible'; - this.content.style.visibility = 'visible'; - if (this.isHtml) this.innerContent.style.visibility = 'visible'; - this.a.className += ' highslide-active-anchor'; - } -}, - - - - -afterExpand : function() { - this.isExpanded = true; - this.focus(); - - if (this.isHtml && this.objectLoadTime == 'after') this.writeExtendedContent(); - if (this.iframe) { - try { - var exp = this, - doc = this.iframe.contentDocument || this.iframe.contentWindow.document; - hs.addEventListener(doc, 'mousedown', function () { - if (hs.focusKey != exp.key) exp.focus(); - }); - } catch(e) {} - if (hs.ie && typeof this.isClosing != 'boolean') // first open - this.iframe.style.width = (this.objectWidth - 1) +'px'; // hasLayout - } - if (hs.upcoming && hs.upcoming == this.a) hs.upcoming = null; - this.prepareNextOutline(); - var p = hs.page, mX = hs.mouse.x + p.scrollLeft, mY = hs.mouse.y + p.scrollTop; - this.mouseIsOver = this.x.pos < mX && mX < this.x.pos + this.x.get('wsize') - && this.y.pos < mY && mY < this.y.pos + this.y.get('wsize'); - if (this.overlayBox) this.showOverlays(); - -}, - - -prepareNextOutline : function() { - var key = this.key; - var outlineType = this.outlineType; - new hs.Outline(outlineType, - function () { try { hs.expanders[key].preloadNext(); } catch (e) {} }); -}, - - -preloadNext : function() { - var next = this.getAdjacentAnchor(1); - if (next && next.onclick.toString().match(/hs\.expand/)) - var img = hs.createElement('img', { src: hs.getSrc(next) }); -}, - - -getAdjacentAnchor : function(op) { - var current = this.getAnchorIndex(), as = hs.anchors.groups[this.slideshowGroup || 'none']; - return (as && as[current + op]) || null; -}, - -getAnchorIndex : function() { - var arr = hs.getAnchors().groups[this.slideshowGroup || 'none']; - if (arr) for (var i = 0; i < arr.length; i++) { - if (arr[i] == this.a) return i; - } - return null; -}, - - -cancelLoading : function() { - hs.discardElement (this.wrapper); - hs.expanders[this.key] = null; - if (this.loading) hs.loading.style.left = '-9999px'; -}, - -writeCredits : function () { - this.credits = hs.createElement('a', { - href: hs.creditsHref, - target: hs.creditsTarget, - className: 'highslide-credits', - innerHTML: hs.lang.creditsText, - title: hs.lang.creditsTitle - }); - this.createOverlay({ - overlayId: this.credits, - position: this.creditsPosition || 'top left' - }); -}, - -getInline : function(types, addOverlay) { - for (var i = 0; i < types.length; i++) { - var type = types[i], s = null; - if (!this[type +'Id'] && this.thumbsUserSetId) - this[type +'Id'] = type +'-for-'+ this.thumbsUserSetId; - if (this[type +'Id']) this[type] = hs.getNode(this[type +'Id']); - if (!this[type] && !this[type +'Text'] && this[type +'Eval']) try { - s = eval(this[type +'Eval']); - } catch (e) {} - if (!this[type] && this[type +'Text']) { - s = this[type +'Text']; - } - if (!this[type] && !s) { - this[type] = hs.getNode(this.a['_'+ type + 'Id']); - if (!this[type]) { - var next = this.a.nextSibling; - while (next && !hs.isHsAnchor(next)) { - if ((new RegExp('highslide-'+ type)).test(next.className || null)) { - if (!next.id) this.a['_'+ type + 'Id'] = next.id = 'hsId'+ hs.idCounter++; - this[type] = hs.getNode(next.id); - break; - } - next = next.nextSibling; - } - } - } - - if (!this[type] && s) this[type] = hs.createElement('div', - { className: 'highslide-'+ type, innerHTML: s } ); - - if (addOverlay && this[type]) { - var o = { position: (type == 'heading') ? 'above' : 'below' }; - for (var x in this[type+'Overlay']) o[x] = this[type+'Overlay'][x]; - o.overlayId = this[type]; - this.createOverlay(o); - } - } -}, - - -// on end move and resize -doShowHide : function(visibility) { - if (hs.hideSelects) this.showHideElements('SELECT', visibility); - if (hs.hideIframes) this.showHideElements('IFRAME', visibility); - if (hs.geckoMac) this.showHideElements('*', visibility); -}, -showHideElements : function (tagName, visibility) { - var els = document.getElementsByTagName(tagName); - var prop = tagName == '*' ? 'overflow' : 'visibility'; - for (var i = 0; i < els.length; i++) { - if (prop == 'visibility' || (document.defaultView.getComputedStyle( - els[i], "").getPropertyValue('overflow') == 'auto' - || els[i].getAttribute('hidden-by') != null)) { - var hiddenBy = els[i].getAttribute('hidden-by'); - if (visibility == 'visible' && hiddenBy) { - hiddenBy = hiddenBy.replace('['+ this.key +']', ''); - els[i].setAttribute('hidden-by', hiddenBy); - if (!hiddenBy) els[i].style[prop] = els[i].origProp; - } else if (visibility == 'hidden') { // hide if behind - var elPos = hs.getPosition(els[i]); - elPos.w = els[i].offsetWidth; - elPos.h = els[i].offsetHeight; - - - var clearsX = (elPos.x + elPos.w < this.x.get('opos') - || elPos.x > this.x.get('opos') + this.x.get('osize')); - var clearsY = (elPos.y + elPos.h < this.y.get('opos') - || elPos.y > this.y.get('opos') + this.y.get('osize')); - var wrapperKey = hs.getWrapperKey(els[i]); - if (!clearsX && !clearsY && wrapperKey != this.key) { // element falls behind image - if (!hiddenBy) { - els[i].setAttribute('hidden-by', '['+ this.key +']'); - els[i].origProp = els[i].style[prop]; - els[i].style[prop] = 'hidden'; - - } else if (hiddenBy.indexOf('['+ this.key +']') == -1) { - els[i].setAttribute('hidden-by', hiddenBy + '['+ this.key +']'); - } - } else if ((hiddenBy == '['+ this.key +']' || hs.focusKey == wrapperKey) - && wrapperKey != this.key) { // on move - els[i].setAttribute('hidden-by', ''); - els[i].style[prop] = els[i].origProp || ''; - } else if (hiddenBy && hiddenBy.indexOf('['+ this.key +']') > -1) { - els[i].setAttribute('hidden-by', hiddenBy.replace('['+ this.key +']', '')); - } - - } - } - } -}, - -focus : function() { - this.wrapper.style.zIndex = hs.zIndexCounter += 2; - // blur others - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && i == hs.focusKey) { - var blurExp = hs.expanders[i]; - blurExp.content.className += ' highslide-'+ blurExp.contentType +'-blur'; - if (blurExp.isImage) { - blurExp.content.style.cursor = hs.ieLt7 ? 'hand' : 'pointer'; - blurExp.content.title = hs.lang.focusTitle; - } - } - } - - // focus this - if (this.outline) this.outline.table.style.zIndex - = this.wrapper.style.zIndex - 1; - this.content.className = 'highslide-'+ this.contentType; - if (this.isImage) { - this.content.title = hs.lang.restoreTitle; - - if (hs.restoreCursor) { - hs.styleRestoreCursor = window.opera ? 'pointer' : 'url('+ hs.graphicsDir + hs.restoreCursor +'), pointer'; - if (hs.ieLt7 && hs.uaVersion < 6) hs.styleRestoreCursor = 'hand'; - this.content.style.cursor = hs.styleRestoreCursor; - } - } - hs.focusKey = this.key; - hs.addEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); -}, -moveTo: function(x, y) { - this.x.setPos(x); - this.y.setPos(y); -}, -resize : function (e) { - var w, h, r = e.width / e.height; - w = Math.max(e.width + e.dX, Math.min(this.minWidth, this.x.full)); - if (this.isImage && Math.abs(w - this.x.full) < 12) w = this.x.full; - h = this.isHtml ? e.height + e.dY : w / r; - if (h < Math.min(this.minHeight, this.y.full)) { - h = Math.min(this.minHeight, this.y.full); - if (this.isImage) w = h * r; - } - this.resizeTo(w, h); -}, -resizeTo: function(w, h) { - this.y.setSize(h); - this.x.setSize(w); - this.wrapper.style.height = this.y.get('wsize') +'px'; -}, - -close : function() { - if (this.isClosing || !this.isExpanded) return; - this.isClosing = true; - - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - - try { - if (this.isHtml) this.htmlPrepareClose(); - this.content.style.cursor = 'default'; - this.changeSize( - 0, { - wrapper: { - width : this.x.t, - height : this.y.t, - left: this.x.tpos - this.x.cb + this.x.tb, - top: this.y.tpos - this.y.cb + this.y.tb - }, - content: { - left: 0, - top: 0, - width: this.x.t, - height: this.y.t - } - }, hs.restoreDuration - ); - } catch (e) { this.afterClose(); } -}, - -htmlPrepareClose : function() { - if (hs.geckoMac) { // bad redraws - if (!hs.mask) hs.mask = hs.createElement('div', null, - { position: 'absolute' }, hs.container); - hs.setStyles(hs.mask, { width: this.x.size +'px', height: this.y.size +'px', - left: this.x.pos +'px', top: this.y.pos +'px', display: 'block' }); - } - if (this.objectType == 'swf') try { hs.$(this.body.id).StopPlay(); } catch (e) {} - - if (this.objectLoadTime == 'after' && !this.preserveContent) this.destroyObject(); - if (this.scrollerDiv && this.scrollerDiv != this.scrollingContent) - this.scrollerDiv.style.overflow = 'hidden'; -}, - -destroyObject : function () { - if (hs.ie && this.iframe) - try { this.iframe.contentWindow.document.body.innerHTML = ''; } catch (e) {} - if (this.objectType == 'swf') swfobject.removeSWF(this.body.id); - this.body.innerHTML = ''; -}, - -sleep : function() { - if (this.outline) this.outline.table.style.display = 'none'; - this.releaseMask = null; - this.wrapper.style.display = 'none'; - this.isExpanded = false; - hs.push(hs.sleeping, this); -}, - -awake : function() {try { - - hs.expanders[this.key] = this; - - if (!hs.allowMultipleInstances &&hs.focusKey != this.key) { - try { hs.expanders[hs.focusKey].close(); } catch (e){} - } - - var z = hs.zIndexCounter++, stl = { display: '', zIndex: z }; - hs.setStyles (this.wrapper, stl); - this.isClosing = false; - - var o = this.outline || 0; - if (o) { - if (!this.outlineWhileAnimating) stl.visibility = 'hidden'; - hs.setStyles (o.table, stl); - } - - this.show(); -} catch (e) {} - - -}, - -createOverlay : function (o) { - var el = o.overlayId; - if (typeof el == 'string') el = hs.getNode(el); - if (o.html) el = hs.createElement('div', { innerHTML: o.html }); - if (!el || typeof el == 'string') return; - el.style.display = 'block'; - this.genOverlayBox(); - var width = o.width && /^[0-9]+(px|%)$/.test(o.width) ? o.width : 'auto'; - if (/^(left|right)panel$/.test(o.position) && !/^[0-9]+px$/.test(o.width)) width = '200px'; - var overlay = hs.createElement( - 'div', { - id: 'hsId'+ hs.idCounter++, - hsId: o.hsId - }, { - position: 'absolute', - visibility: 'hidden', - width: width, - direction: hs.lang.cssDirection || '', - opacity: 0 - },this.overlayBox, - true - ); - - overlay.appendChild(el); - hs.extend(overlay, { - opacity: 1, - offsetX: 0, - offsetY: 0, - dur: (o.fade === 0 || o.fade === false || (o.fade == 2 && hs.ie)) ? 0 : 250 - }); - hs.extend(overlay, o); - - - if (this.gotOverlays) { - this.positionOverlay(overlay); - if (!overlay.hideOnMouseOut || this.mouseIsOver) - hs.animate(overlay, { opacity: overlay.opacity }, overlay.dur); - } - hs.push(this.overlays, hs.idCounter - 1); -}, -positionOverlay : function(overlay) { - var p = overlay.position || 'middle center', - offX = overlay.offsetX, - offY = overlay.offsetY; - if (overlay.parentNode != this.overlayBox) this.overlayBox.appendChild(overlay); - if (/left$/.test(p)) overlay.style.left = offX +'px'; - - if (/center$/.test(p)) hs.setStyles (overlay, { - left: '50%', - marginLeft: (offX - Math.round(overlay.offsetWidth / 2)) +'px' - }); - - if (/right$/.test(p)) overlay.style.right = - offX +'px'; - - if (/^leftpanel$/.test(p)) { - hs.setStyles(overlay, { - right: '100%', - marginRight: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p1 = overlay.offsetWidth; - - } else if (/^rightpanel$/.test(p)) { - hs.setStyles(overlay, { - left: '100%', - marginLeft: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p2 = overlay.offsetWidth; - } - - if (/^top/.test(p)) overlay.style.top = offY +'px'; - if (/^middle/.test(p)) hs.setStyles (overlay, { - top: '50%', - marginTop: (offY - Math.round(overlay.offsetHeight / 2)) +'px' - }); - if (/^bottom/.test(p)) overlay.style.bottom = - offY +'px'; - if (/^above$/.test(p)) { - hs.setStyles(overlay, { - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - bottom: '100%', - marginBottom: this.y.cb +'px', - width: 'auto' - }); - this.y.p1 = overlay.offsetHeight; - - } else if (/^below$/.test(p)) { - hs.setStyles(overlay, { - position: 'relative', - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - top: '100%', - marginTop: this.y.cb +'px', - width: 'auto' - }); - this.y.p2 = overlay.offsetHeight; - overlay.style.position = 'absolute'; - } -}, - -getOverlays : function() { - this.getInline(['heading', 'caption'], true); - if (this.heading && this.dragByHeading) this.heading.className += ' highslide-move'; - if (hs.showCredits) this.writeCredits(); - for (var i = 0; i < hs.overlays.length; i++) { - var o = hs.overlays[i], tId = o.thumbnailId, sg = o.slideshowGroup; - if ((!tId && !sg) || (tId && tId == this.thumbsUserSetId) - || (sg && sg === this.slideshowGroup)) { - if (this.isImage || (this.isHtml && o.useOnHtml)) - this.createOverlay(o); - } - } - var os = []; - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - if (/panel$/.test(o.position)) this.positionOverlay(o); - else hs.push(os, o); - } - for (var i = 0; i < os.length; i++) this.positionOverlay(os[i]); - this.gotOverlays = true; -}, -genOverlayBox : function() { - if (!this.overlayBox) this.overlayBox = hs.createElement ( - 'div', { - className: this.wrapperClassName - }, { - position : 'absolute', - width: (this.x.size || (this.useBox ? this.width : null) - || this.x.full) +'px', - height: (this.y.size || this.y.full) +'px', - visibility : 'hidden', - overflow : 'hidden', - zIndex : hs.ie ? 4 : 'auto' - }, - hs.container, - true - ); -}, -sizeOverlayBox : function(doWrapper, doPanels) { - var overlayBox = this.overlayBox, - x = this.x, - y = this.y; - hs.setStyles( overlayBox, { - width: x.size +'px', - height: y.size +'px' - }); - if (doWrapper || doPanels) { - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - var ie6 = (hs.ieLt7 || document.compatMode == 'BackCompat'); - if (o && /^(above|below)$/.test(o.position)) { - if (ie6) { - o.style.width = (overlayBox.offsetWidth + 2 * x.cb - + x.p1 + x.p2) +'px'; - } - y[o.position == 'above' ? 'p1' : 'p2'] = o.offsetHeight; - } - if (o && ie6 && /^(left|right)panel$/.test(o.position)) { - o.style.height = (overlayBox.offsetHeight + 2* y.cb) +'px'; - } - } - } - if (doWrapper) { - hs.setStyles(this.content, { - top: y.p1 +'px' - }); - hs.setStyles(overlayBox, { - top: (y.p1 + y.cb) +'px' - }); - } -}, - -showOverlays : function() { - var b = this.overlayBox; - b.className = ''; - hs.setStyles(b, { - top: (this.y.p1 + this.y.cb) +'px', - left: (this.x.p1 + this.x.cb) +'px', - overflow : 'visible' - }); - if (hs.safari) b.style.visibility = 'visible'; - this.wrapper.appendChild (b); - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - o.style.zIndex = o.zIndex || 4; - if (!o.hideOnMouseOut || this.mouseIsOver) { - o.style.visibility = 'visible'; - hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: o.opacity }, o.dur); - } - } -}, - -destroyOverlays : function() { - if (!this.overlays.length) return; - if (this.isHtml && this.preserveContent) { - this.overlayBox.style.top = '-9999px'; - hs.container.appendChild(this.overlayBox); - } else - hs.discardElement(this.overlayBox); -}, - - - -createFullExpand : function () { - this.fullExpandLabel = hs.createElement( - 'a', { - href: 'javascript:hs.expanders['+ this.key +'].doFullExpand();', - title: hs.lang.fullExpandTitle, - className: 'highslide-full-expand' - } - ); - - this.createOverlay({ - overlayId: this.fullExpandLabel, - position: hs.fullExpandPosition, - hideOnMouseOut: true, - opacity: hs.fullExpandOpacity - }); -}, - -doFullExpand : function () { - try { - if (this.fullExpandLabel) hs.discardElement(this.fullExpandLabel); - - this.focus(); - var xSize = this.x.size, - ySize = this.y.size; - this.resizeTo(this.x.full, this.y.full); - - var xpos = this.x.pos - (this.x.size - xSize) / 2; - if (xpos < hs.marginLeft) xpos = hs.marginLeft; - - var ypos = this.y.pos - (this.y.size - ySize) / 2; - if (ypos < hs.marginTop) ypos = hs.marginTop; - - this.moveTo(xpos, ypos); - this.doShowHide('hidden'); - - } catch (e) { - this.error(e); - } -}, - - -afterClose : function () { - this.a.className = this.a.className.replace('highslide-active-anchor', ''); - - this.doShowHide('visible'); - - if (this.isHtml && this.preserveContent) { - this.sleep(); - } else { - if (this.outline && this.outlineWhileAnimating) this.outline.destroy(); - - hs.discardElement(this.wrapper); - } - if (hs.mask) hs.mask.style.display = 'none'; - - hs.expanders[this.key] = null; - hs.reOrder(); -} - -}; - - -// hs.Ajax object prototype -hs.Ajax = function (a, content, pre) { - this.a = a; - this.content = content; - this.pre = pre; -}; - -hs.Ajax.prototype = { -run : function () { - var xhr; - if (!this.src) this.src = hs.getSrc(this.a); - if (this.src.match('#')) { - var arr = this.src.split('#'); - this.src = arr[0]; - this.id = arr[1]; - } - if (hs.cachedGets[this.src]) { - this.cachedGet = hs.cachedGets[this.src]; - if (this.id) this.getElementContent(); - else this.loadHTML(); - return; - } - try { xhr = new XMLHttpRequest(); } - catch (e) { - try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } - catch (e) { - try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } - catch (e) { this.onError(); } - } - } - var pThis = this; - xhr.onreadystatechange = function() { - if(pThis.xhr.readyState == 4) { - if (pThis.id) pThis.getElementContent(); - else pThis.loadHTML(); - } - }; - var src = this.src; - this.xhr = xhr; - if (hs.forceAjaxReload) - src = src.replace(/$/, (/\?/.test(src) ? '&' : '?') +'dummy='+ (new Date()).getTime()); - xhr.open('GET', src, true); - xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); - xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - xhr.send(null); -}, - -getElementContent : function() { - hs.init(); - var attribs = window.opera || hs.ie6SSL ? { src: 'about:blank' } : null; - - this.iframe = hs.createElement('iframe', attribs, - { position: 'absolute', top: '-9999px' }, hs.container); - - this.loadHTML(); -}, - -loadHTML : function() { - var s = this.cachedGet || this.xhr.responseText, - regBody; - if (this.pre) hs.cachedGets[this.src] = s; - if (!hs.ie || hs.uaVersion >= 5.5) { - s = s.replace(new RegExp(']*>', 'gi'), '') - .replace(new RegExp(']*>.*?', 'gi'), ''); - if (this.iframe) { - var doc = this.iframe.contentDocument; - if (!doc && this.iframe.contentWindow) doc = this.iframe.contentWindow.document; - if (!doc) { // Opera - var pThis = this; - setTimeout(function() { pThis.loadHTML(); }, 25); - return; - } - doc.open(); - doc.write(s); - doc.close(); - try { s = doc.getElementById(this.id).innerHTML; } catch (e) { - try { s = this.iframe.document.getElementById(this.id).innerHTML; } catch (e) {} // opera - } - hs.discardElement(this.iframe); - } else { - regBody = /(]*>|<\/body>)/ig; - if (regBody.test(s)) s = s.split(regBody)[hs.ieLt9 ? 1 : 2]; - - } - } - hs.getElementByClass(this.content, 'DIV', 'highslide-body').innerHTML = s; - this.onLoad(); - for (var x in this) this[x] = null; -} -}; -hs.langDefaults = hs.lang; -// history -var HsExpander = hs.Expander; -if (hs.ie && window == window.top) { - (function () { - try { - document.documentElement.doScroll('left'); - } catch (e) { - setTimeout(arguments.callee, 50); - return; - } - hs.ready(); - })(); -} -hs.addEventListener(document, 'DOMContentLoaded', hs.ready); -hs.addEventListener(window, 'load', hs.ready); - -// set handlers -hs.addEventListener(document, 'ready', function() { - if (hs.expandCursor) { - var style = hs.createElement('style', { type: 'text/css' }, null, - document.getElementsByTagName('HEAD')[0]), - backCompat = document.compatMode == 'BackCompat'; - - - function addRule(sel, dec) { - if (hs.ie && (hs.uaVersion < 9 || backCompat)) { - var last = document.styleSheets[document.styleSheets.length - 1]; - if (typeof(last.addRule) == "object") last.addRule(sel, dec); - } else { - style.appendChild(document.createTextNode(sel + " {" + dec + "}")); - } - } - function fix(prop) { - return 'expression( ( ( ignoreMe = document.documentElement.'+ prop + - ' ? document.documentElement.'+ prop +' : document.body.'+ prop +' ) ) + \'px\' );'; - } - if (hs.expandCursor) addRule ('.highslide img', - 'cursor: url('+ hs.graphicsDir + hs.expandCursor +'), pointer !important;'); - } -}); -hs.addEventListener(window, 'resize', function() { - hs.getPageSize(); -}); -hs.addEventListener(document, 'mousemove', function(e) { - hs.mouse = { x: e.clientX, y: e.clientY }; -}); -hs.addEventListener(document, 'mousedown', hs.mouseClickHandler); -hs.addEventListener(document, 'mouseup', hs.mouseClickHandler); - -hs.addEventListener(document, 'ready', hs.getAnchors); -hs.addEventListener(window, 'load', hs.preloadImages); -hs.addEventListener(window, 'load', hs.preloadAjax); -} diff --git a/DeveloperAdoption/public/static/highslide/highslide/highslide-with-html.min.js b/DeveloperAdoption/public/static/highslide/highslide/highslide-with-html.min.js deleted file mode 100644 index aa2119f..0000000 --- a/DeveloperAdoption/public/static/highslide/highslide/highslide-with-html.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Name: Highslide JS - * Version: 4.1.13 (2011-10-06) - * Config: default +inline +ajax +iframe +flash - * Author: Torstein Hønsi - * Support: www.highslide.com/support - * License: www.highslide.com/#license - */ -if(!hs){var hs={lang:{cssDirection:"ltr",loadingText:"Loading...",loadingTitle:"Click to cancel",focusTitle:"Click to bring to front",fullExpandTitle:"Expand to actual size (f)",creditsText:"Powered by Highslide JS",creditsTitle:"Go to the Highslide JS homepage",previousText:"Previous",nextText:"Next",moveText:"Move",closeText:"Close",closeTitle:"Close (esc)",resizeTitle:"Resize",playText:"Play",playTitle:"Play slideshow (spacebar)",pauseText:"Pause",pauseTitle:"Pause slideshow (spacebar)",previousTitle:"Previous (arrow left)",nextTitle:"Next (arrow right)",moveTitle:"Move",fullExpandText:"1:1",restoreTitle:"Click to close image, click and drag to move. Use arrow keys for next and previous."},graphicsDir:"highslide/graphics/",expandCursor:"zoomin.cur",restoreCursor:"zoomout.cur",expandDuration:250,restoreDuration:250,marginLeft:15,marginRight:15,marginTop:15,marginBottom:15,zIndexCounter:1001,loadingOpacity:0.75,allowMultipleInstances:true,numberOfImagesToPreload:5,outlineWhileAnimating:2,outlineStartOffset:3,padToMinWidth:false,fullExpandPosition:"bottom right",fullExpandOpacity:1,showCredits:true,creditsHref:"http://highslide.com/",creditsTarget:"_self",enableKeyListener:true,openerTagNames:["a"],allowWidthReduction:false,allowHeightReduction:true,preserveContent:true,objectLoadTime:"before",cacheAjax:true,dragByHeading:true,minWidth:200,minHeight:200,allowSizeReduction:true,outlineType:"drop-shadow",skin:{contentWrapper:'
    '},preloadTheseImages:[],continuePreloading:true,expanders:[],overrides:["allowSizeReduction","useBox","outlineType","outlineWhileAnimating","captionId","captionText","captionEval","captionOverlay","headingId","headingText","headingEval","headingOverlay","creditsPosition","dragByHeading","width","height","contentId","allowWidthReduction","allowHeightReduction","preserveContent","maincontentId","maincontentText","maincontentEval","objectType","cacheAjax","objectWidth","objectHeight","objectLoadTime","swfOptions","wrapperClassName","minWidth","minHeight","maxWidth","maxHeight","pageOrigin","slideshowGroup","easing","easingClose","fadeInOut","src"],overlays:[],idCounter:0,oPos:{x:["leftpanel","left","center","right","rightpanel"],y:["above","top","middle","bottom","below"]},mouse:{},headingOverlay:{},captionOverlay:{},swfOptions:{flashvars:{},params:{},attributes:{}},timers:[],pendingOutlines:{},sleeping:[],preloadTheseAjax:[],cacheBindings:[],cachedGets:{},clones:{},onReady:[],uaVersion:/Trident\/4\.0/.test(navigator.userAgent)?8:parseFloat((navigator.userAgent.toLowerCase().match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1]),ie:(document.all&&!window.opera),safari:/Safari/.test(navigator.userAgent),geckoMac:/Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent),$:function(a){if(a){return document.getElementById(a)}},push:function(a,b){a[a.length]=b},createElement:function(a,f,e,d,c){var b=document.createElement(a);if(f){hs.extend(b,f)}if(c){hs.setStyles(b,{padding:0,border:"none",margin:0})}if(e){hs.setStyles(b,e)}if(d){d.appendChild(b)}return b},extend:function(b,c){for(var a in c){b[a]=c[a]}return b},setStyles:function(b,c){for(var a in c){if(hs.ieLt9&&a=="opacity"){if(c[a]>0.99){b.style.removeAttribute("filter")}else{b.style.filter="alpha(opacity="+(c[a]*100)+")"}}else{b.style[a]=c[a]}}},animate:function(f,a,d){var c,g,j;if(typeof d!="object"||d===null){var i=arguments;d={duration:i[2],easing:i[3],complete:i[4]}}if(typeof d.duration!="number"){d.duration=250}d.easing=Math[d.easing]||Math.easeInQuad;d.curAnim=hs.extend({},a);for(var b in a){var h=new hs.fx(f,d,b);c=parseFloat(hs.css(f,b))||0;g=parseFloat(a[b]);j=b!="opacity"?"px":"";h.custom(c,g,j)}},css:function(a,c){if(a.style[c]){return a.style[c]}else{if(document.defaultView){return document.defaultView.getComputedStyle(a,null).getPropertyValue(c)}else{if(c=="opacity"){c="filter"}var b=a.currentStyle[c.replace(/\-(\w)/g,function(e,d){return d.toUpperCase()})];if(c=="filter"){b=b.replace(/alpha\(opacity=([0-9]+)\)/,function(e,d){return d/100})}return b===""?1:b}}},getPageSize:function(){var f=document,b=window,e=f.compatMode&&f.compatMode!="BackCompat"?f.documentElement:f.body,g=hs.ie&&(hs.uaVersion<9||typeof pageXOffset=="undefined");var c=g?e.clientWidth:(f.documentElement.clientWidth||self.innerWidth),a=g?e.clientHeight:self.innerHeight;hs.page={width:c,height:a,scrollLeft:g?e.scrollLeft:pageXOffset,scrollTop:g?e.scrollTop:pageYOffset};return hs.page},getPosition:function(a){var b={x:a.offsetLeft,y:a.offsetTop};while(a.offsetParent){a=a.offsetParent;b.x+=a.offsetLeft;b.y+=a.offsetTop;if(a!=document.body&&a!=document.documentElement){b.x-=a.scrollLeft;b.y-=a.scrollTop}}return b},expand:function(b,h,f,d){if(!b){b=hs.createElement("a",null,{display:"none"},hs.container)}if(typeof b.getParams=="function"){return h}if(d=="html"){for(var c=0;cc){c=f;b=d}}}if(b==-1){hs.focusKey=-1}else{a[b].focus()}},getParam:function(b,d){b.getParams=b.onclick;var c=b.getParams?b.getParams():null;b.getParams=null;return(c&&typeof c[d]!="undefined")?c[d]:(typeof hs[d]!="undefined"?hs[d]:null)},getSrc:function(b){var c=hs.getParam(b,"src");if(c){return c}return b.href},getNode:function(e){var c=hs.$(e),d=hs.clones[e],b={};if(!c&&!d){return null}if(!d){d=c.cloneNode(true);d.id="";hs.clones[e]=d;return c}else{return d.cloneNode(true)}},discardElement:function(a){if(a){hs.garbageBin.appendChild(a)}hs.garbageBin.innerHTML=""},transit:function(a,d){var b=d||hs.getExpander();d=b;if(hs.upcoming){return false}else{hs.last=b}hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler);try{hs.upcoming=a;a.onclick()}catch(c){hs.last=hs.upcoming=null}try{d.close()}catch(c){}return false},previousOrNext:function(a,c){var b=hs.getExpander(a);if(b){return hs.transit(b.getAdjacentAnchor(c),b)}else{return false}},previous:function(a){return hs.previousOrNext(a,-1)},next:function(a){return hs.previousOrNext(a,1)},keyHandler:function(a){if(!a){a=window.event}if(!a.target){a.target=a.srcElement}if(typeof a.target.form!="undefined"){return true}var b=hs.getExpander();var c=null;switch(a.keyCode){case 70:if(b){b.doFullExpand()}return true;case 32:case 34:case 39:case 40:c=1;break;case 8:case 33:case 37:case 38:c=-1;break;case 27:case 13:c=0}if(c!==null){hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler);if(!hs.enableKeyListener){return true}if(a.preventDefault){a.preventDefault()}else{a.returnValue=false}if(b){if(c==0){b.close()}else{hs.previousOrNext(b.key,c)}return false}}return true},registerOverlay:function(a){hs.push(hs.overlays,hs.extend(a,{hsId:"hsId"+hs.idCounter++}))},getWrapperKey:function(c,b){var e,d=/^highslide-wrapper-([0-9]+)$/;e=c;while(e.parentNode){if(e.id&&d.test(e.id)){return e.id.replace(d,"$1")}e=e.parentNode}if(!b){e=c;while(e.parentNode){if(e.tagName&&hs.isHsAnchor(e)){for(var a=0;a1){return true}if(!d.target){d.target=d.srcElement}var b=d.target;while(b.parentNode&&!(/highslide-(image|move|html|resize)/.test(b.className))){b=b.parentNode}var f=hs.getExpander(b);if(f&&(f.isClosing||!f.isExpanded)){return true}if(f&&d.type=="mousedown"){if(d.target.form){return true}var a=b.className.match(/highslide-(image|move|resize)/);if(a){hs.dragArgs={exp:f,type:a[1],left:f.x.pos,width:f.x.size,top:f.y.pos,height:f.y.size,clickX:d.clientX,clickY:d.clientY};hs.addEventListener(document,"mousemove",hs.dragHandler);if(d.preventDefault){d.preventDefault()}if(/highslide-(image|html)-blur/.test(f.content.className)){f.focus();hs.hasFocused=true}return false}else{if(/highslide-html/.test(b.className)&&hs.focusKey!=f.key){f.focus();f.doShowHide("hidden")}}}else{if(d.type=="mouseup"){hs.removeEventListener(document,"mousemove",hs.dragHandler);if(hs.dragArgs){if(hs.styleRestoreCursor&&hs.dragArgs.type=="image"){hs.dragArgs.exp.content.style.cursor=hs.styleRestoreCursor}var c=hs.dragArgs.hasDragged;if(!c&&!hs.hasFocused&&!/(move|resize)/.test(hs.dragArgs.type)){f.close()}else{if(c||(!c&&hs.hasHtmlExpanders)){hs.dragArgs.exp.doShowHide("hidden")}}if(hs.dragArgs.exp.releaseMask){hs.dragArgs.exp.releaseMask.style.display="none"}hs.hasFocused=false;hs.dragArgs=null}else{if(/highslide-image-blur/.test(b.className)){b.style.cursor=hs.styleRestoreCursor}}}}return false},dragHandler:function(c){if(!hs.dragArgs){return true}if(!c){c=window.event}var b=hs.dragArgs,d=b.exp;if(d.iframe){if(!d.releaseMask){d.releaseMask=hs.createElement("div",null,{position:"absolute",width:d.x.size+"px",height:d.y.size+"px",left:d.x.cb+"px",top:d.y.cb+"px",zIndex:4,background:(hs.ieLt9?"white":"none"),opacity:0.01},d.wrapper,true)}if(d.releaseMask.style.display=="none"){d.releaseMask.style.display=""}}b.dX=c.clientX-b.clickX;b.dY=c.clientY-b.clickY;var f=Math.sqrt(Math.pow(b.dX,2)+Math.pow(b.dY,2));if(!b.hasDragged){b.hasDragged=(b.type!="image"&&f>0)||(f>(hs.dragSensitivity||5))}if(b.hasDragged&&c.clientX>5&&c.clientY>5){if(b.type=="resize"){d.resize(b)}else{d.moveTo(b.left+b.dX,b.top+b.dY);if(b.type=="image"){d.content.style.cursor="move"}}}return false},wrapperMouseHandler:function(c){try{if(!c){c=window.event}var b=/mouseover/i.test(c.type);if(!c.target){c.target=c.srcElement}if(!c.relatedTarget){c.relatedTarget=b?c.fromElement:c.toElement}var d=hs.getExpander(c.target);if(!d.isExpanded){return}if(!d||!c.relatedTarget||hs.getExpander(c.relatedTarget,true)==d||hs.dragArgs){return}for(var a=0;a=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var a=true;for(var b in this.options.curAnim){if(this.options.curAnim[b]!==true){a=false}}if(a){if(this.options.complete){this.options.complete.call(this.elem)}}return false}else{var e=c-this.startTime;this.state=e/this.options.duration;this.pos=this.options.easing(e,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};hs.extend(hs.fx,{step:{opacity:function(a){hs.setStyles(a.elem,{opacity:a.now})},_default:function(a){try{if(a.elem.style&&a.elem.style[a.prop]!=null){a.elem.style[a.prop]=a.now+a.unit}else{a.elem[a.prop]=a.now}}catch(b){}}}});hs.Outline=function(g,e){this.onLoad=e;this.outlineType=g;var a=hs.uaVersion,f;this.hasAlphaImageLoader=hs.ie&&hs.uaVersion<7;if(!g){if(e){e()}return}hs.init();this.table=hs.createElement("table",{cellSpacing:0},{visibility:"hidden",position:"absolute",borderCollapse:"collapse",width:0},hs.container,true);var b=hs.createElement("tbody",null,null,this.table,1);this.td=[];for(var c=0;c<=8;c++){if(c%3==0){f=hs.createElement("tr",null,{height:"auto"},b,true)}this.td[c]=hs.createElement("td",null,null,f,true);var d=c!=4?{lineHeight:0,fontSize:0}:{position:"relative"};hs.setStyles(this.td[c],d)}this.td[4].className=g+" highslide-outline";this.preloadGraphic()};hs.Outline.prototype={preloadGraphic:function(){var b=hs.graphicsDir+(hs.outlinesDir||"outlines/")+this.outlineType+".png";var a=hs.safari&&hs.uaVersion<525?hs.container:null;this.graphic=hs.createElement("img",null,{position:"absolute",top:"-9999px"},a,true);var c=this;this.graphic.onload=function(){c.onGraphicLoad()};this.graphic.src=b},onGraphicLoad:function(){var d=this.offset=this.graphic.width/4,f=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],c={height:(2*d)+"px",width:(2*d)+"px"};for(var b=0;b<=8;b++){if(f[b]){if(this.hasAlphaImageLoader){var a=(b==1||b==7)?"100%":this.graphic.width+"px";var e=hs.createElement("div",null,{width:"100%",height:"100%",position:"relative",overflow:"hidden"},this.td[b],true);hs.createElement("div",null,{filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+this.graphic.src+"')",position:"absolute",width:a,height:this.graphic.height+"px",left:(f[b][0]*d)+"px",top:(f[b][1]*d)+"px"},e,true)}else{hs.setStyles(this.td[b],{background:"url("+this.graphic.src+") "+(f[b][0]*d)+"px "+(f[b][1]*d)+"px"})}if(window.opera&&(b==3||b==5)){hs.createElement("div",null,c,this.td[b],true)}hs.setStyles(this.td[b],c)}}this.graphic=null;if(hs.pendingOutlines[this.outlineType]){hs.pendingOutlines[this.outlineType].destroy()}hs.pendingOutlines[this.outlineType]=this;if(this.onLoad){this.onLoad()}},setPosition:function(g,e,c,b,f){var d=this.exp,a=d.wrapper.style,e=e||0,g=g||{x:d.x.pos+e,y:d.y.pos+e,w:d.x.get("wsize")-2*e,h:d.y.get("wsize")-2*e};if(c){this.table.style.visibility=(g.h>=4*this.offset)?"visible":"hidden"}hs.setStyles(this.table,{left:(g.x-this.offset)+"px",top:(g.y-this.offset)+"px",width:(g.w+2*this.offset)+"px"});g.w-=2*this.offset;g.h-=2*this.offset;hs.setStyles(this.td[4],{width:g.w>=0?g.w+"px":0,height:g.h>=0?g.h+"px":0});if(this.hasAlphaImageLoader){this.td[3].style.height=this.td[5].style.height=this.td[4].style.height}},destroy:function(a){if(a){this.table.style.visibility="hidden"}else{hs.discardElement(this.table)}}};hs.Dimension=function(b,a){this.exp=b;this.dim=a;this.ucwh=a=="x"?"Width":"Height";this.wh=this.ucwh.toLowerCase();this.uclt=a=="x"?"Left":"Top";this.lt=this.uclt.toLowerCase();this.ucrb=a=="x"?"Right":"Bottom";this.rb=this.ucrb.toLowerCase();this.p1=this.p2=0};hs.Dimension.prototype={get:function(a){switch(a){case"loadingPos":return this.tpos+this.tb+(this.t-hs.loading["offset"+this.ucwh])/2;case"wsize":return this.size+2*this.cb+this.p1+this.p2;case"fitsize":return this.clientSize-this.marginMin-this.marginMax;case"maxsize":return this.get("fitsize")-2*this.cb-this.p1-this.p2;case"opos":return this.pos-(this.exp.outline?this.exp.outline.offset:0);case"osize":return this.get("wsize")+(this.exp.outline?2*this.exp.outline.offset:0);case"imgPad":return this.imgSize?Math.round((this.size-this.imgSize)/2):0}},calcBorders:function(){this.cb=(this.exp.content["offset"+this.ucwh]-this.t)/2;this.marginMax=hs["margin"+this.ucrb]},calcThumb:function(){this.t=this.exp.el[this.wh]?parseInt(this.exp.el[this.wh]):this.exp.el["offset"+this.ucwh];this.tpos=this.exp.tpos[this.dim];this.tb=(this.exp.el["offset"+this.ucwh]-this.t)/2;if(this.tpos==0||this.tpos==-1){this.tpos=(hs.page[this.wh]/2)+hs.page["scroll"+this.uclt]}},calcExpanded:function(){var a=this.exp;this.justify="auto";this.pos=this.tpos-this.cb+this.tb;if(this.maxHeight&&this.dim=="x"){a.maxWidth=Math.min(a.maxWidth||this.full,a.maxHeight*this.full/a.y.full)}this.size=Math.min(this.full,a["max"+this.ucwh]||this.full);this.minSize=a.allowSizeReduction?Math.min(a["min"+this.ucwh],this.full):this.full;if(a.isImage&&a.useBox){this.size=a[this.wh];this.imgSize=this.full}if(this.dim=="x"&&hs.padToMinWidth){this.minSize=a.minWidth}this.marginMin=hs["margin"+this.uclt];this.scroll=hs.page["scroll"+this.uclt];this.clientSize=hs.page[this.wh]},setSize:function(a){var f=this.exp;if(f.isImage&&(f.useBox||hs.padToMinWidth)){this.imgSize=a;this.size=Math.max(this.size,this.imgSize);f.content.style[this.lt]=this.get("imgPad")+"px"}else{this.size=a}f.content.style[this.wh]=a+"px";f.wrapper.style[this.wh]=this.get("wsize")+"px";if(f.outline){f.outline.setPosition()}if(f.releaseMask){f.releaseMask.style[this.wh]=a+"px"}if(this.dim=="y"&&f.iDoc&&f.body.style.height!="auto"){try{f.iDoc.body.style.overflow="auto"}catch(b){}}if(f.isHtml){var c=f.scrollerDiv;if(this.sizeDiff===undefined){this.sizeDiff=f.innerContent["offset"+this.ucwh]-c["offset"+this.ucwh]}c.style[this.wh]=(this.size-this.sizeDiff)+"px";if(this.dim=="x"){f.mediumContent.style.width="auto"}if(f.body){f.body.style[this.wh]="auto"}}if(this.dim=="x"&&f.overlayBox){f.sizeOverlayBox(true)}},setPos:function(a){this.pos=a;this.exp.wrapper.style[this.lt]=a+"px";if(this.exp.outline){this.exp.outline.setPosition()}}};hs.Expander=function(k,f,b,l){if(document.readyState&&hs.ie&&!hs.isReady){hs.addEventListener(document,"ready",function(){new hs.Expander(k,f,b,l)});return}this.a=k;this.custom=b;this.contentType=l||"image";this.isHtml=(l=="html");this.isImage=!this.isHtml;hs.continuePreloading=false;this.overlays=[];hs.init();var m=this.key=hs.expanders.length;for(var g=0;g(this.x.imgSize||this.x.size)){this.createFullExpand();if(this.overlays.length==1){this.sizeOverlayBox()}}}this.show()}catch(c){this.error(c)}},setObjContainerSize:function(a,d){var b=hs.getElementByClass(a,"DIV","highslide-body");if(/(iframe|swf)/.test(this.objectType)){if(this.objectWidth){b.style.width=this.objectWidth+"px"}if(this.objectHeight){b.style.height=this.objectHeight+"px"}}},writeExtendedContent:function(){if(this.hasExtendedContent){return}var f=this;this.body=hs.getElementByClass(this.innerContent,"DIV","highslide-body");if(this.objectType=="iframe"){this.showLoading();var g=hs.clearing.cloneNode(1);this.body.appendChild(g);this.newWidth=this.innerContent.offsetWidth;if(!this.objectWidth){this.objectWidth=g.offsetWidth}var c=this.innerContent.offsetHeight-this.body.offsetHeight,d=this.objectHeight||hs.page.height-c-hs.marginTop-hs.marginBottom,e=this.objectLoadTime=="before"?' onload="if (hs.expanders['+this.key+"]) hs.expanders["+this.key+'].contentLoaded()" ':"";this.body.innerHTML+='';this.ruler=this.body.getElementsByTagName("div")[0];this.iframe=this.body.getElementsByTagName("iframe")[0];if(this.objectLoadTime=="after"){this.correctIframeSize()}}if(this.objectType=="swf"){this.body.id=this.body.id||"hs-flash-id-"+this.key;var b=this.swfOptions;if(!b.params){b.params={}}if(typeof b.params.wmode=="undefined"){b.params.wmode="transparent"}if(swfobject){swfobject.embedSWF(this.src,this.body.id,this.objectWidth,this.objectHeight,b.version||"7",b.expressInstallSwfurl,b.flashvars,b.params,b.attributes)}}this.hasExtendedContent=true},htmlGetSize:function(){if(this.iframe&&!this.objectHeight){this.iframe.style.height=this.body.style.height=this.getIframePageHeight()+"px"}this.innerContent.appendChild(hs.clearing);if(!this.x.full){this.x.full=this.innerContent.offsetWidth}this.y.full=this.innerContent.offsetHeight;this.innerContent.removeChild(hs.clearing);if(hs.ie&&this.newHeight>parseInt(this.innerContent.currentStyle.height)){this.newHeight=parseInt(this.innerContent.currentStyle.height)}hs.setStyles(this.wrapper,{position:"absolute",padding:"0"});hs.setStyles(this.content,{width:this.x.t+"px",height:this.y.t+"px"})},getIframePageHeight:function(){var a;try{var d=this.iDoc=this.iframe.contentDocument||this.iframe.contentWindow.document;var b=d.createElement("div");b.style.clear="both";d.body.appendChild(b);a=b.offsetTop;if(hs.ie){a+=parseInt(d.body.currentStyle.marginTop)+parseInt(d.body.currentStyle.marginBottom)-1}}catch(c){a=300}return a},correctIframeSize:function(){var b=this.innerContent.offsetWidth-this.ruler.offsetWidth;hs.discardElement(this.ruler);if(b<0){b=0}var a=this.innerContent.offsetHeight-this.iframe.offsetHeight;if(this.iDoc&&!this.objectHeight&&!this.height&&this.y.size==this.y.full){try{this.iDoc.body.style.overflow="hidden"}catch(c){}}hs.setStyles(this.iframe,{width:Math.abs(this.x.size-b)+"px",height:Math.abs(this.y.size-a)+"px"});hs.setStyles(this.body,{width:this.iframe.style.width,height:this.iframe.style.height});this.scrollingContent=this.iframe;this.scrollerDiv=this.scrollingContent},htmlSizeOperations:function(){this.setObjContainerSize(this.innerContent);if(this.objectType=="swf"&&this.objectLoadTime=="before"){this.writeExtendedContent()}if(this.x.sizee.offsetHeight){e.style.width=(parseInt(e.style.width)+d)+"px"}this.scrollingContent=e;this.scrollerDiv=this.scrollingContent}if(this.iframe&&this.objectLoadTime=="before"){this.correctIframeSize()}if(!this.scrollingContent&&this.y.sizethis.scrollerDiv.parentNode.offsetHeight){setTimeout("try { hs.expanders["+this.key+"].scrollerDiv.style.overflow = 'auto'; } catch(e) {}",hs.expandDuration)}},justify:function(f,b){var g,h=f.target,e=f==this.x?"x":"y";var d=false;var a=f.exp.allowSizeReduction;f.pos=Math.round(f.pos-((f.get("wsize")-f.t)/2));if(f.posf.scroll+f.clientSize-f.marginMax){if(!b&&d&&a){f.size=Math.min(f.size,f.get(e=="y"?"fitsize":"maxsize"))}else{if(f.get("wsize")c){d=b*c;if(dthis.minHeight&&a.size>this.minWidth&&d.get("wsize")>d.get("fitsize")){d.size-=10;if(b){a.size=d.size*b}this.sizeOverlayBox(0,1);c=true}}return c},show:function(){var a=this.x,b=this.y;this.doShowHide("hidden");this.changeSize(1,{wrapper:{width:a.get("wsize"),height:b.get("wsize"),left:a.pos,top:b.pos},content:{left:a.p1+a.get("imgPad"),top:b.p1+b.get("imgPad"),width:a.imgSize||a.size,height:b.imgSize||b.size}},hs.expandDuration)},changeSize:function(b,h,c){if(this.outline&&!this.outlineWhileAnimating){if(b){this.outline.setPosition()}else{this.outline.destroy((this.isHtml&&this.preserveContent))}}if(!b){this.destroyOverlays()}var e=this,a=e.x,g=e.y,f=this.easing;if(!b){f=this.easingClose||f}var d=b?function(){if(e.outline){e.outline.table.style.visibility="visible"}setTimeout(function(){e.afterExpand()},50)}:function(){e.afterClose()};if(b){hs.setStyles(this.wrapper,{width:a.t+"px",height:g.t+"px"})}if(b&&this.isHtml){hs.setStyles(this.wrapper,{left:(a.tpos-a.cb+a.tb)+"px",top:(g.tpos-g.cb+g.tb)+"px"})}if(this.fadeInOut){hs.setStyles(this.wrapper,{opacity:b?0:1});hs.extend(h.wrapper,{opacity:b})}hs.animate(this.wrapper,h.wrapper,{duration:c,easing:f,step:function(k,i){if(e.outline&&e.outlineWhileAnimating&&i.prop=="top"){var j=b?i.pos:1-i.pos;var l={w:a.t+(a.get("wsize")-a.t)*j,h:g.t+(g.get("wsize")-g.t)*j,x:a.tpos+(a.pos-a.tpos)*j,y:g.tpos+(g.pos-g.tpos)*j};e.outline.setPosition(l,0,1)}if(e.isHtml){if(i.prop=="left"){e.mediumContent.style.left=(a.pos-k)+"px"}if(i.prop=="top"){e.mediumContent.style.top=(g.pos-k)+"px"}}}});hs.animate(this.content,h.content,c,f,d);if(b){this.wrapper.style.visibility="visible";this.content.style.visibility="visible";if(this.isHtml){this.innerContent.style.visibility="visible"}this.a.className+=" highslide-active-anchor"}},afterExpand:function(){this.isExpanded=true;this.focus();if(this.isHtml&&this.objectLoadTime=="after"){this.writeExtendedContent()}if(this.iframe){try{var g=this,f=this.iframe.contentDocument||this.iframe.contentWindow.document;hs.addEventListener(f,"mousedown",function(){if(hs.focusKey!=g.key){g.focus()}})}catch(d){}if(hs.ie&&typeof this.isClosing!="boolean"){this.iframe.style.width=(this.objectWidth-1)+"px"}}if(hs.upcoming&&hs.upcoming==this.a){hs.upcoming=null}this.prepareNextOutline();var c=hs.page,b=hs.mouse.x+c.scrollLeft,a=hs.mouse.y+c.scrollTop;this.mouseIsOver=this.x.posthis.x.get("opos")+this.x.get("osize"));var g=(k.y+k.hthis.y.get("opos")+this.y.get("osize"));var d=hs.getWrapperKey(e[f]);if(!j&&!g&&d!=this.key){if(!h){e[f].setAttribute("hidden-by","["+this.key+"]");e[f].origProp=e[f].style[a];e[f].style[a]="hidden"}else{if(h.indexOf("["+this.key+"]")==-1){e[f].setAttribute("hidden-by",h+"["+this.key+"]")}}}else{if((h=="["+this.key+"]"||hs.focusKey==d)&&d!=this.key){e[f].setAttribute("hidden-by","");e[f].style[a]=e[f].origProp||""}else{if(h&&h.indexOf("["+this.key+"]")>-1){e[f].setAttribute("hidden-by",h.replace("["+this.key+"]",""))}}}}}}}},focus:function(){this.wrapper.style.zIndex=hs.zIndexCounter+=2;for(var a=0;a=5.5){c=c.replace(new RegExp("]*>","gi"),"").replace(new RegExp("]*>.*?<\/script>","gi"),"");if(this.iframe){var f=this.iframe.contentDocument;if(!f&&this.iframe.contentWindow){f=this.iframe.contentWindow.document}if(!f){var g=this;setTimeout(function(){g.loadHTML()},25);return}f.open();f.write(c);f.close();try{c=f.getElementById(this.id).innerHTML}catch(d){try{c=this.iframe.document.getElementById(this.id).innerHTML}catch(d){}}hs.discardElement(this.iframe)}else{b=/(]*>|<\/body>)/ig;if(b.test(c)){c=c.split(b)[hs.ieLt9?1:2]}}}hs.getElementByClass(this.content,"DIV","highslide-body").innerHTML=c;this.onLoad();for(var a in this){this[a]=null}}};hs.langDefaults=hs.lang;var HsExpander=hs.Expander;if(hs.ie&&window==window.top){(function(){try{document.documentElement.doScroll("left")}catch(a){setTimeout(arguments.callee,50);return}hs.ready()})()}hs.addEventListener(document,"DOMContentLoaded",hs.ready);hs.addEventListener(window,"load",hs.ready);hs.addEventListener(document,"ready",function(){if(hs.expandCursor){var d=hs.createElement("style",{type:"text/css"},null,document.getElementsByTagName("HEAD")[0]),c=document.compatMode=="BackCompat";function b(f,g){if(hs.ie&&(hs.uaVersion<9||c)){var e=document.styleSheets[document.styleSheets.length-1];if(typeof(e.addRule)=="object"){e.addRule(f,g)}}else{d.appendChild(document.createTextNode(f+" {"+g+"}"))}}function a(e){return"expression( ( ( ignoreMe = document.documentElement."+e+" ? document.documentElement."+e+" : document.body."+e+" ) ) + 'px' );"}if(hs.expandCursor){b(".highslide img","cursor: url("+hs.graphicsDir+hs.expandCursor+"), pointer !important;")}}});hs.addEventListener(window,"resize",function(){hs.getPageSize()});hs.addEventListener(document,"mousemove",function(a){hs.mouse={x:a.clientX,y:a.clientY}});hs.addEventListener(document,"mousedown",hs.mouseClickHandler);hs.addEventListener(document,"mouseup",hs.mouseClickHandler);hs.addEventListener(document,"ready",hs.getAnchors);hs.addEventListener(window,"load",hs.preloadImages);hs.addEventListener(window,"load",hs.preloadAjax)}; \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/highslide/highslide-with-html.packed.js b/DeveloperAdoption/public/static/highslide/highslide/highslide-with-html.packed.js deleted file mode 100644 index 6febacf..0000000 --- a/DeveloperAdoption/public/static/highslide/highslide/highslide-with-html.packed.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Name: Highslide JS - * Version: 4.1.13 (2011-10-06) - * Config: default +inline +ajax +iframe +flash +packed - * Author: Torstein Hønsi - * Support: www.highslide.com/support - * License: www.highslide.com/#license - */ -eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q(!m){u m={1e:{89:\'8H\',8K:\'co...\',8G:\'6Q 2h cA\',9s:\'6Q 2h cB 2h c1\',9Y:\'bX 2h bT G (f)\',ag:\'c7 by 8g 8f\',9F:\'d3 2h d6 8g 8f dg\',91:\'8n\',8W:\'8e\',8R:\'9g\',8V:\'8j\',8U:\'8j (di)\',93:\'dj\',dd:\'8h\',d2:\'8h 8m (8l)\',cM:\'8k\',bR:\'8k 8m (8l)\',90:\'8n (6L 1f)\',8X:\'8e (6L 2G)\',8S:\'9g\',b8:\'1:1\',7h:\'6Q 2h 28 2D, aR 8Y aL 2h 3I. aH 6L aT W 1M 8Y 5n.\'},56:\'U/aN/\',5v:\'bG.6E\',4E:\'bB.6E\',7c:6j,a7:6j,4j:15,6m:15,3N:15,6f:15,4l:bt,8N:0.75,7m:J,71:5,3g:2,aZ:3,4M:1h,9Z:\'3E 2G\',9U:1,a1:J,9y:\'b2://U.b4/\',9E:\'aO\',8C:J,7B:[\'a\'],5D:1h,5A:J,48:J,31:\'4K\',82:J,7b:J,3O:8Z,4s:8Z,4I:J,1x:\'aS-aP\',8A:{8B:\'<1i 3n="U-aU"><92>\'+\'<3u 3n="U-5n">\'+\'\'+\'<2p>{m.1e.91}\'+\'\'+\'<3u 3n="U-1M">\'+\'\'+\'<2p>{m.1e.8W}\'+\'\'+\'<3u 3n="U-3I">\'+\'\'+\'<2p>{m.1e.8R}\'+\'\'+\'<3u 3n="U-28">\'+\'\'+\'<2p>{m.1e.8V}\'+\'\'+\'\'+\'<1i 3n="U-V">\'+\'<1i 3n="U-b0"><1i>\'+\'<2p 3n="U-3q" 2u="{m.1e.93}"><2p>\'+\'\'},4P:[],6n:J,P:[],6s:[\'4I\',\'2K\',\'1x\',\'3g\',\'b5\',\'bc\',\'aG\',\'9e\',\'aM\',\'b3\',\'bQ\',\'9c\',\'9K\',\'7b\',\'K\',\'M\',\'7f\',\'5D\',\'5A\',\'48\',\'bD\',\'bC\',\'bH\',\'2f\',\'82\',\'3i\',\'3J\',\'31\',\'7I\',\'78\',\'3O\',\'4s\',\'5X\',\'6N\',\'8d\',\'4h\',\'2g\',\'an\',\'am\',\'T\'],1Q:[],4y:0,bI:{x:[\'ad\',\'1f\',\'6H\',\'2G\',\'ac\'],y:[\'4U\',\'18\',\'6q\',\'3E\',\'6a\']},5R:{},9c:{},9e:{},7I:{al:{},1E:{},ay:{}},3t:[],3G:{},3C:[],5b:[],4o:[],5J:{},7k:{},6h:[],26:/bM\\/4\\.0/.16(46.5V)?8:6t((46.5V.5x().2Z(/.+(?:9f|bJ|bK|1L)[\\/: ]([\\d.]+)/)||[0,\'0\'])[1]),1L:(N.4F&&!1y.30),4X:/bL/.16(46.5V),7V:/bx.+9f:1\\.[0-8].+bi/.16(46.5V),$:B(1j){q(1j)D N.6F(1j)},20:B(1P,2R){1P[1P.1c]=2R},14:B(9b,3h,3l,4r,95){u C=N.14(9b);q(3h)m.3e(C,3h);q(95)m.Q(C,{6z:0,ap:\'24\',6V:0});q(3l)m.Q(C,3l);q(4r)4r.1G(C);D C},3e:B(C,3h){W(u x 3A 3h)C[x]=3h[x];D C},Q:B(C,3l){W(u x 3A 3l){q(m.2Y&&x==\'1B\'){q(3l[x]>0.99)C.F.bp(\'4C\');L C.F.4C=\'97(1B=\'+(3l[x]*2A)+\')\'}L C.F[x]=3l[x]}},41:B(C,1a,2P){u 3S,3Y,3P;q(1t 2P!=\'6W\'||2P===I){u 2S=aE;2P={3w:2S[2],2g:2S[3],83:2S[4]}}q(1t 2P.3w!=\'42\')2P.3w=6j;2P.2g=1r[2P.2g]||1r.8M;2P.5d=m.3e({},1a);W(u 2z 3A 1a){u e=1w m.1C(C,2P,2z);3S=6t(m.79(C,2z))||0;3Y=6t(1a[2z]);3P=2z!=\'1B\'?\'E\':\'\';e.2O(3S,3Y,3P)}},79:B(C,1a){q(C.F[1a]){D C.F[1a]}L q(N.87){D N.87.9k(C,I).9i(1a)}L{q(1a==\'1B\')1a=\'4C\';u 2R=C.4u[1a.2i(/\\-(\\w)/g,B(a,b){D b.bo()})];q(1a==\'4C\')2R=2R.2i(/97\\(1B=([0-9]+)\\)/,B(a,b){D b/2A});D 2R===\'\'?1:2R}},5y:B(){u d=N,w=1y,58=d.5G&&d.5G!=\'6M\'?d.44:d.V,2Y=m.1L&&(m.26<9||1t 8y==\'1X\');u K=2Y?58.8Q:(d.44.8Q||5o.bv),M=2Y?58.bu:5o.bm;m.3k={K:K,M:M,5T:2Y?58.5T:8y,5U:2Y?58.5U:bf};D m.3k},85:B(C){u p={x:C.8x,y:C.6G};3T(C.8p){C=C.8p;p.x+=C.8x;p.y+=C.6G;q(C!=N.V&&C!=N.44){p.x-=C.5T;p.y-=C.5U}}D p},53:B(a,1E,2O,R){q(!a)a=m.14(\'a\',I,{1O:\'24\'},m.1S);q(1t a.4V==\'B\')D 1E;q(R==\'2Q\'){W(u i=0;i7n){7n=1u;5g=i}}}q(5g==-1)m.2q=-1;L P[5g].3d()},3U:B(a,4R){a.4V=a.2M;u p=a.4V?a.4V():I;a.4V=I;D(p&&1t p[4R]!=\'1X\')?p[4R]:(1t m[4R]!=\'1X\'?m[4R]:I)},5m:B(a){u T=m.3U(a,\'T\');q(T)D T;D a.2v},3z:B(1j){u 1D=m.$(1j),3M=m.7k[1j],a={};q(!1D&&!3M)D I;q(!3M){3M=1D.61(J);3M.1j=\'\';m.7k[1j]=3M;D 1D}L{D 3M.61(J)}},3j:B(d){q(d)m.7g.1G(d);m.7g.2n=\'\'},8t:B(7F,A){u 3r=A||m.3v();A=3r;q(m.3B)D 1h;L m.3r=3r;m.4g(N,1y.30?\'5i\':\'5h\',m.4D);1m{m.3B=7F;7F.2M()}1l(e){m.3r=m.3B=I}1m{A.28()}1l(e){}D 1h},5k:B(C,2w){u A=m.3v(C);q(A)D m.8t(A.6B(2w),A);L D 1h},5n:B(C){D m.5k(C,-1)},1M:B(C){D m.5k(C,1)},4D:B(e){q(!e)e=1y.1Y;q(!e.2j)e.2j=e.6p;q(1t e.2j.7O!=\'1X\')D J;u A=m.3v();u 2w=I;8T(e.aI){1J 70:q(A)A.7i();D J;1J 32:1J 34:1J 39:1J 40:2w=1;7N;1J 8:1J 33:1J 37:1J 38:2w=-1;7N;1J 27:1J 13:2w=0}q(2w!==I){m.4g(N,1y.30?\'5i\':\'5h\',m.4D);q(!m.8C)D J;q(e.65)e.65();L e.aY=1h;q(A){q(2w==0){A.28()}L{m.5k(A.S,2w)}D 1h}}D J},b1:B(19){m.20(m.1Q,m.3e(19,{2F:\'2F\'+m.4y++}))},7S:B(7C,5M){u C,2t=/^U-Y-([0-9]+)$/;C=7C;3T(C.3a){q(C.1j&&2t.16(C.1j))D C.1j.2i(2t,"$1");C=C.3a}q(!5M){C=7C;3T(C.3a){q(C.4c&&m.5W(C)){W(u S=0;S1)D J;q(!e.2j)e.2j=e.6p;u C=e.2j;3T(C.3a&&!(/U-(2D|3I|2Q|3q)/.16(C.1p))){C=C.3a}u A=m.3v(C);q(A&&(A.4z||!A.4e))D J;q(A&&e.R==\'7H\'){q(e.2j.7O)D J;u 2Z=C.1p.2Z(/U-(2D|3I|3q)/);q(2Z){m.2a={A:A,R:2Z[1],1f:A.x.H,K:A.x.G,18:A.y.H,M:A.y.G,8J:e.5Q,8F:e.5f};m.1R(N,\'6o\',m.8a);q(e.65)e.65();q(/U-(2D|2Q)-7s/.16(A.O.1p)){A.3d();m.7p=J}D 1h}L q(/U-2Q/.16(C.1p)&&m.2q!=A.S){A.3d();A.4a(\'1n\')}}L q(e.R==\'9t\'){m.4g(N,\'6o\',m.8a);q(m.2a){q(m.4i&&m.2a.R==\'2D\')m.2a.A.O.F.3L=m.4i;u 3f=m.2a.3f;q(!3f&&!m.7p&&!/(3I|3q)/.16(m.2a.R)){A.28()}L q(3f||(!3f&&m.8O)){m.2a.A.4a(\'1n\')}q(m.2a.A.2W)m.2a.A.2W.F.1O=\'24\';m.7p=1h;m.2a=I}L q(/U-2D-7s/.16(C.1p)){C.F.3L=m.4i}}D 1h},8a:B(e){q(!m.2a)D J;q(!e)e=1y.1Y;u a=m.2a,A=a.A;q(A.11){q(!A.2W)A.2W=m.14(\'1i\',I,{1d:\'22\',K:A.x.G+\'E\',M:A.y.G+\'E\',1f:A.x.cb+\'E\',18:A.y.cb+\'E\',1u:4,94:(m.2Y?\'bh\':\'24\'),1B:0.cD},A.Y,J);q(A.2W.F.1O==\'24\')A.2W.F.1O=\'\'}a.5q=e.5Q-a.8J;a.5r=e.5f-a.8F;u 6A=1r.cU(1r.8E(a.5q,2)+1r.8E(a.5r,2));q(!a.3f)a.3f=(a.R!=\'2D\'&&6A>0)||(6A>(m.cR||5));q(a.3f&&e.5Q>5&&e.5f>5){q(a.R==\'3q\')A.3q(a);L{A.7x(a.1f+a.5q,a.18+a.5r);q(a.R==\'2D\')A.O.F.3L=\'3I\'}}D 1h},8c:B(e){1m{q(!e)e=1y.1Y;u 67=/cW/i.16(e.R);q(!e.2j)e.2j=e.6p;q(!e.6l)e.6l=67?e.cZ:e.cY;u A=m.3v(e.2j);q(!A.4e)D;q(!A||!e.6l||m.3v(e.6l,J)==A||m.2a)D;W(u i=0;i=k.1N.3w+k.84){k.3Q=k.3Y;k.H=k.80=1;k.7Q();k.1N.5d[k.1a]=J;u 86=J;W(u i 3A k.1N.5d)q(k.1N.5d[i]!==J)86=1h;q(86){q(k.1N.83)k.1N.83.8v(k.2k)}D 1h}L{u n=t-k.84;k.80=n/k.1N.3w;k.H=k.1N.2g(n,0,1,k.1N.3w);k.3Q=k.3S+((k.3Y-k.3S)*k.H);k.7Q()}D J}};m.3e(m.1C,{3o:{1B:B(1C){m.Q(1C.2k,{1B:1C.3Q})},8z:B(1C){1m{q(1C.2k.F&&1C.2k.F[1C.1a]!=I)1C.2k.F[1C.1a]=1C.3Q+1C.3P;L 1C.2k[1C.1a]=1C.3Q}1l(e){}}}});m.4L=B(1x,2J){k.2J=2J;k.1x=1x;u v=m.26,5O;k.6C=m.1L&&m.26<7;q(!1x){q(2J)2J();D}m.5N();k.2m=m.14(\'2m\',{d7:0},{1q:\'1n\',1d:\'22\',d8:\'dc\',K:0},m.1S,J);u 7W=m.14(\'7W\',I,I,k.2m,1);k.29=[];W(u i=0;i<=8;i++){q(i%3==0)5O=m.14(\'5O\',I,{M:\'1H\'},7W,J);k.29[i]=m.14(\'29\',I,I,5O,J);u F=i!=4?{db:0,da:0}:{1d:\'3K\'};m.Q(k.29[i],F)}k.29[4].1p=1x+\' U-1o\';k.8P()};m.4L.54={8P:B(){u T=m.56+(m.d9||"cL/")+k.1x+".cE";u 98=m.4X&&m.26<8i?m.1S:I;k.2X=m.14(\'1v\',I,{1d:\'22\',18:\'-3R\'},98,J);u 36=k;k.2X.3H=B(){36.96()};k.2X.T=T},96:B(){u o=k.1s=k.2X.K/4,H=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],1F={M:(2*o)+\'E\',K:(2*o)+\'E\'};W(u i=0;i<=8;i++){q(H[i]){q(k.6C){u w=(i==1||i==7)?\'2A%\':k.2X.K+\'E\';u 1i=m.14(\'1i\',I,{K:\'2A%\',M:\'2A%\',1d:\'3K\',1W:\'1n\'},k.29[i],J);m.14(\'1i\',I,{4C:"c6:c5.9M.c4(c8=c9, T=\'"+k.2X.T+"\')",1d:\'22\',K:w,M:k.2X.M+\'E\',1f:(H[i][0]*o)+\'E\',18:(H[i][1]*o)+\'E\'},1i,J)}L{m.Q(k.29[i],{94:\'6X(\'+k.2X.T+\') \'+(H[i][0]*o)+\'E \'+(H[i][1]*o)+\'E\'})}q(1y.30&&(i==3||i==5))m.14(\'1i\',I,1F,k.29[i],J);m.Q(k.29[i],1F)}}k.2X=I;q(m.3G[k.1x])m.3G[k.1x].5l();m.3G[k.1x]=k;q(k.2J)k.2J()},4B:B(H,1s,9a,3b,2g){u A=k.A,4A=A.Y.F,1s=1s||0,H=H||{x:A.x.H+1s,y:A.y.H+1s,w:A.x.1b(\'1K\')-2*1s,h:A.y.1b(\'1K\')-2*1s};q(9a)k.2m.F.1q=(H.h>=4*k.1s)?\'2l\':\'1n\';m.Q(k.2m,{1f:(H.x-k.1s)+\'E\',18:(H.y-k.1s)+\'E\',K:(H.w+2*k.1s)+\'E\'});H.w-=2*k.1s;H.h-=2*k.1s;m.Q(k.29[4],{K:H.w>=0?H.w+\'E\':0,M:H.h>=0?H.h+\'E\':0});q(k.6C)k.29[3].F.M=k.29[5].F.M=k.29[4].F.M},5l:B(9d){q(9d)k.2m.F.1q=\'1n\';L m.3j(k.2m)}};m.5t=B(A,1F){k.A=A;k.1F=1F;k.2H=1F==\'x\'?\'cd\':\'cc\';k.2C=k.2H.5x();k.4J=1F==\'x\'?\'ca\':\'c3\';k.6J=k.4J.5x();k.6P=1F==\'x\'?\'c2\':\'bV\';k.bU=k.6P.5x();k.1V=k.2U=0};m.5t.54={1b:B(S){8T(S){1J\'7R\':D k.1A+k.2s+(k.t-m.21[\'1s\'+k.2H])/2;1J\'1K\':D k.G+2*k.cb+k.1V+k.2U;1J\'4b\':D k.5E-k.3y-k.5F;1J\'6K\':D k.1b(\'4b\')-2*k.cb-k.1V-k.2U;1J\'4w\':D k.H-(k.A.1o?k.A.1o.1s:0);1J\'88\':D k.1b(\'1K\')+(k.A.1o?2*k.A.1o.1s:0);1J\'5u\':D k.1T?1r.5Y((k.G-k.1T)/2):0}},6v:B(){k.cb=(k.A.O[\'1s\'+k.2H]-k.t)/2;k.5F=m[\'6V\'+k.6P]},6y:B(){k.t=k.A.C[k.2C]?49(k.A.C[k.2C]):k.A.C[\'1s\'+k.2H];k.1A=k.A.1A[k.1F];k.2s=(k.A.C[\'1s\'+k.2H]-k.t)/2;q(k.1A==0||k.1A==-1){k.1A=(m.3k[k.2C]/2)+m.3k[\'3s\'+k.4J]}},6u:B(){u A=k.A;k.3X=\'1H\';k.H=k.1A-k.cb+k.2s;q(k.6N&&k.1F==\'x\')A.5X=1r.2L(A.5X||k.Z,A.6N*k.Z/A.y.Z);k.G=1r.2L(k.Z,A[\'7l\'+k.2H]||k.Z);k.2E=A.4I?1r.2L(A[\'2L\'+k.2H],k.Z):k.Z;q(A.2o&&A.2K){k.G=A[k.2C];k.1T=k.Z}q(k.1F==\'x\'&&m.4M)k.2E=A.3O;k.3y=m[\'6V\'+k.4J];k.3s=m.3k[\'3s\'+k.4J];k.5E=m.3k[k.2C]},7J:B(i){u A=k.A;q(A.2o&&(A.2K||m.4M)){k.1T=i;k.G=1r.7l(k.G,k.1T);A.O.F[k.6J]=k.1b(\'5u\')+\'E\'}L k.G=i;A.O.F[k.2C]=i+\'E\';A.Y.F[k.2C]=k.1b(\'1K\')+\'E\';q(A.1o)A.1o.4B();q(A.2W)A.2W.F[k.2C]=i+\'E\';q(k.1F==\'y\'&&A.4v&&A.V.F.M!=\'1H\')1m{A.4v.V.F.1W=\'1H\'}1l(e){}q(A.1Z){u d=A.2c;q(k.7a===1X)k.7a=A.1g[\'1s\'+k.2H]-d[\'1s\'+k.2H];d.F[k.2C]=(k.G-k.7a)+\'E\';q(k.1F==\'x\')A.3D.F.K=\'1H\';q(A.V)A.V.F[k.2C]=\'1H\'}q(k.1F==\'x\'&&A.1z)A.4m(J)},7j:B(i){k.H=i;k.A.Y.F[k.6J]=i+\'E\';q(k.A.1o)k.A.1o.4B()}};m.4S=B(a,1E,2O,2B){q(N.9r&&m.1L&&!m.6Z){m.1R(N,\'3p\',B(){1w m.4S(a,1E,2O,2B)});D}k.a=a;k.2O=2O;k.2B=2B||\'2D\';k.1Z=(2B==\'2Q\');k.2o=!k.1Z;m.6n=1h;k.1Q=[];m.5N();u S=k.S=m.P.1c;W(u i=0;i(k.x.1T||k.x.G)){k.9W();q(k.1Q.1c==1)k.4m()}}k.7M()}1l(e){k.7w(e)}},7d:B(4r,1H){u c=m.4d(4r,\'5H\',\'U-V\');q(/(11|3c)/.16(k.2f)){q(k.3i)c.F.K=k.3i+\'E\';q(k.3J)c.F.M=k.3J+\'E\'}},5S:B(){q(k.av)D;u A=k;k.V=m.4d(k.1g,\'5H\',\'U-V\');q(k.2f==\'11\'){k.4t();u 4n=m.2I.61(1);k.V.1G(4n);k.cn=k.1g.2e;q(!k.3i)k.3i=4n.2e;u 45=k.1g.1I-k.V.1I,h=k.3J||m.3k.M-45-m.3N-m.6f,3H=k.31==\'4K\'?\' 3H="q (m.P[\'+k.S+\']) m.P[\'+k.S+\'].4x()" \':\'\';k.V.2n+=\'<11 2z="m\'+(1w 5s()).59()+\'" cq="0" S="\'+k.S+\'" \'+\' F="K:\'+k.3i+\'E; M:\'+h+\'E" \'+3H+\' T="\'+k.T+\'" >\';k.4n=k.V.3x(\'1i\')[0];k.11=k.V.3x(\'11\')[0];q(k.31==\'4O\')k.6S()}q(k.2f==\'3c\'){k.V.1j=k.V.1j||\'m-cm-1j-\'+k.S;u a=k.7I;q(!a.1E)a.1E={};q(1t a.1E.aF==\'1X\')a.1E.aF=\'ci\';q(7D)7D.cj(k.T,k.V.1j,k.3i,k.3J,a.ck||\'7\',a.cC,a.al,a.1E,a.ay)}k.av=J},76:B(){q(k.11&&!k.3J){k.11.F.M=k.V.F.M=k.at()+\'E\'}k.1g.1G(m.2I);q(!k.x.Z)k.x.Z=k.1g.2e;k.y.Z=k.1g.1I;k.1g.aj(m.2I);q(m.1L&&k.au>49(k.1g.4u.M)){k.au=49(k.1g.4u.M)}m.Q(k.Y,{1d:\'22\',6z:\'0\'});m.Q(k.O,{K:k.x.t+\'E\',M:k.y.t+\'E\'})},at:B(){u h;1m{u 1U=k.4v=k.11.6r||k.11.52.N;u 2I=1U.14(\'1i\');2I.F.ar=\'aw\';1U.V.1G(2I);h=2I.6G;q(m.1L)h+=49(1U.V.4u.3N)+49(1U.V.4u.6f)-1}1l(e){h=bY}D h},6S:B(){u 4k=k.1g.2e-k.4n.2e;m.3j(k.4n);q(4k<0)4k=0;u 45=k.1g.1I-k.11.1I;q(k.4v&&!k.3J&&!k.M&&k.y.G==k.y.Z)1m{k.4v.V.F.1W=\'1n\'}1l(e){}m.Q(k.11,{K:1r.7u(k.x.G-4k)+\'E\',M:1r.7u(k.y.G-45)+\'E\'});m.Q(k.V,{K:k.11.F.K,M:k.11.F.M});k.4p=k.11;k.2c=k.4p},aq:B(){k.7d(k.1g);q(k.2f==\'3c\'&&k.31==\'4K\')k.5S();q(k.x.G1D.1I){1D.F.K=(49(1D.F.K)+5C)+\'E\'}k.4p=1D;k.2c=k.4p}q(k.11&&k.31==\'4K\')k.6S();q(!k.4p&&k.y.Gk.2c.3a.1I){4T("1m { m.P["+k.S+"].2c.F.1W = \'1H\'; } 1l(e) {}",m.7c)}},3X:B(p,3W){u bW,bS=p.2j,1F=p==k.x?\'x\':\'y\';u 6R=1h;u 3V=p.A.4I;p.H=1r.5Y(p.H-((p.1b(\'1K\')-p.t)/2));q(p.Hp.3s+p.5E-p.5F){q(!3W&&6R&&3V){p.G=1r.2L(p.G,p.1b(1F==\'y\'?\'4b\':\'6K\'))}L q(p.1b(\'1K\')2d){ 2r=2N*2d;q(2rk.4s&&x.G>k.3O&&y.1b(\'1K\')>y.1b(\'4b\')){y.G-=10;q(2d)x.G=y.G*2d;k.4m(0,1);2V=J}}D 2V},7M:B(){u x=k.x,y=k.y;k.4a(\'1n\');k.7z(1,{Y:{K:x.1b(\'1K\'),M:y.1b(\'1K\'),1f:x.H,18:y.H},O:{1f:x.1V+x.1b(\'5u\'),18:y.1V+y.1b(\'5u\'),K:x.1T||x.G,M:y.1T||y.G}},m.7c)},7z:B(2y,2h,3b){q(k.1o&&!k.3g){q(2y)k.1o.4B();L k.1o.5l((k.1Z&&k.48))}q(!2y)k.9V();u A=k,x=A.x,y=A.y,2g=k.2g;q(!2y)2g=k.an||2g;u 4O=2y?B(){q(A.1o)A.1o.2m.F.1q="2l";4T(B(){A.aC()},50)}:B(){A.7A()};q(2y)m.Q(k.Y,{K:x.t+\'E\',M:y.t+\'E\'});q(2y&&k.1Z){m.Q(k.Y,{1f:(x.1A-x.cb+x.2s)+\'E\',18:(y.1A-y.cb+y.2s)+\'E\'})}q(k.am){m.Q(k.Y,{1B:2y?0:1});m.3e(2h.Y,{1B:2y})}m.41(k.Y,2h.Y,{3w:3b,2g:2g,3o:B(2R,2S){q(A.1o&&A.3g&&2S.1a==\'18\'){u 4G=2y?2S.H:1-2S.H;u H={w:x.t+(x.1b(\'1K\')-x.t)*4G,h:y.t+(y.1b(\'1K\')-y.t)*4G,x:x.1A+(x.H-x.1A)*4G,y:y.1A+(y.H-y.1A)*4G};A.1o.4B(H,0,1)}q(A.1Z){q(2S.1a==\'1f\')A.3D.F.1f=(x.H-2R)+\'E\';q(2S.1a==\'18\')A.3D.F.18=(y.H-2R)+\'E\'}}});m.41(k.O,2h.O,3b,2g,4O);q(2y){k.Y.F.1q=\'2l\';k.O.F.1q=\'2l\';q(k.1Z)k.1g.F.1q=\'2l\';k.a.1p+=\' U-9T-9O\'}},aC:B(){k.4e=J;k.3d();q(k.1Z&&k.31==\'4O\')k.5S();q(k.11){1m{u A=k,1U=k.11.6r||k.11.52.N;m.1R(1U,\'7H\',B(){q(m.2q!=A.S)A.3d()})}1l(e){}q(m.1L&&1t k.4z!=\'ce\')k.11.F.K=(k.3i-1)+\'E\'}q(m.3B&&m.3B==k.a)m.3B=I;k.ax();u p=m.3k,6I=m.5R.x+p.5T,6D=m.5R.y+p.5U;k.6x=k.x.H<6I&&6Ik.x.1b(\'4w\')+k.x.1b(\'88\'));u 9p=(2T.y+2T.hk.y.1b(\'4w\')+k.y.1b(\'88\'));u 5c=m.7S(1k[i]);q(!9o&&!9p&&5c!=k.S){q(!23){1k[i].4N(\'1n-by\',\'[\'+k.S+\']\');1k[i].7q=1k[i].F[1a];1k[i].F[1a]=\'1n\'}L q(23.9v(\'[\'+k.S+\']\')==-1){1k[i].4N(\'1n-by\',23+\'[\'+k.S+\']\')}}L q((23==\'[\'+k.S+\']\'||m.2q==5c)&&5c!=k.S){1k[i].4N(\'1n-by\',\'\');1k[i].F[1a]=1k[i].7q||\'\'}L q(23&&23.9v(\'[\'+k.S+\']\')>-1){1k[i].4N(\'1n-by\',23.2i(\'[\'+k.S+\']\',\'\'))}}}}},3d:B(){k.Y.F.1u=m.4l+=2;W(u i=0;i=5.5){s=s.2i(1w 5P(\']*>\',\'aB\'),\'\').2i(1w 5P(\']*>.*?\',\'aB\'),\'\');q(k.11){u 1U=k.11.6r;q(!1U&&k.11.52)1U=k.11.52.N;q(!1U){u 36=k;4T(B(){36.4Y()},25);D}1U.ak();1U.bO(s);1U.28();1m{s=1U.6F(k.1j).2n}1l(e){1m{s=k.11.N.6F(k.1j).2n}1l(e){}}m.3j(k.11)}L{5I=/(]*>|<\\/V>)/ba;q(5I.16(s))s=s.az(5I)[m.2Y?1:2]}}m.4d(k.O,\'5H\',\'U-V\').2n=s;k.2J();W(u x 3A k)k[x]=I}};m.5z=m.1e;u b6=m.4S;q(m.1L&&1y==1y.18){(B(){1m{N.44.aW(\'1f\')}1l(e){4T(aE.aX,50);D}m.3p()})()}m.1R(N,\'b9\',m.3p);m.1R(1y,\'7o\',m.3p);m.1R(N,\'3p\',B(){q(m.5v){u F=m.14(\'F\',{R:\'aK/79\'},I,N.3x(\'aQ\')[0]),a2=N.5G==\'6M\';B 5B(6U,6T){q(m.1L&&(m.26<9||a2)){u 3r=N.a3[N.a3.1c-1];q(1t(3r.5B)=="6W")3r.5B(6U,6T)}L{F.1G(N.bb(6U+" {"+6T+"}"))}}B cT(1a){D\'cS( ( ( cV = N.44.\'+1a+\' ? N.44.\'+1a+\' : N.V.\'+1a+\' ) ) + \\\'E\\\' );\'}q(m.5v)5B(\'.U 1v\',\'3L: 6X(\'+m.56+m.5v+\'), 5w !d0;\')}});m.1R(1y,\'3q\',B(){m.5y()});m.1R(N,\'6o\',B(e){m.5R={x:e.5Q,y:e.5f}});m.1R(N,\'7H\',m.7K);m.1R(N,\'9t\',m.7K);m.1R(N,\'3p\',m.4Z);m.1R(1y,\'7o\',m.9u);m.1R(1y,\'7o\',m.af)}',62,827,'||||||||||||||||||||this||hs||||if||||var||||||exp|function|el|return|px|style|size|pos|null|true|width|else|height|document|content|expanders|setStyles|type|key|src|highslide|body|for||wrapper|full||iframe|||createElement||test||top|overlay|prop|get|length|position|lang|left|innerContent|false|div|id|els|catch|try|hidden|outline|className|visibility|Math|offset|typeof|zIndex|img|new|outlineType|window|overlayBox|tpos|opacity|fx|node|params|dim|appendChild|auto|offsetHeight|case|wsize|ie|next|options|display|arr|overlays|addEventListener|container|imgSize|doc|p1|overflow|undefined|event|isHtml|push|loading|absolute|hiddenBy|none||uaVersion||close|td|dragArgs|xhr|scrollerDiv|ratio|offsetWidth|objectType|easing|to|replace|target|elem|visible|table|innerHTML|isImage|span|focusKey|xSize|tb|re|title|href|op|ajax|up|name|100|contentType|wh|image|minSize|hsId|right|ucwh|clearing|onLoad|useBox|min|onclick|ySize|custom|opt|html|val|args|elPos|p2|changed|releaseMask|graphic|ieLt9|match|opera|objectLoadTime||||func|pThis||||parentNode|dur|swf|focus|extend|hasDragged|outlineWhileAnimating|attribs|objectWidth|discardElement|page|styles|groups|class|step|ready|resize|last|scroll|timers|li|getExpander|duration|getElementsByTagName|marginMin|getNode|in|upcoming|sleeping|mediumContent|bottom|ieLt7|pendingOutlines|onload|move|objectHeight|relative|cursor|clone|marginTop|minWidth|unit|now|9999px|start|while|getParam|allowReduce|moveOnly|justify|end|images||animate|number|Id|documentElement|hDiff|navigator|cNode|preserveContent|parseInt|doShowHide|fitsize|tagName|getElementByClass|isExpanded|blurExp|removeEventListener|slideshowGroup|styleRestoreCursor|marginLeft|wDiff|zIndexCounter|sizeOverlayBox|ruler|cacheBindings|scrollingContent|htmls|parent|minHeight|showLoading|currentStyle|iDoc|opos|contentLoaded|idCounter|isClosing|stl|setPosition|filter|keyHandler|restoreCursor|all|fac|block|allowSizeReduction|uclt|before|Outline|padToMinWidth|setAttribute|after|preloadTheseImages|on|param|Expander|setTimeout|above|getParams|createOverlay|safari|loadHTML|getAnchors||cache|contentWindow|expand|prototype|matches|graphicsDir|mask|iebody|getTime|showHideElements|preloadTheseAjax|wrapperKey|curAnim|gotoEnd|clientY|topmostKey|keydown|keypress|Ajax|previousOrNext|destroy|getSrc|previous|self|positionOverlay|dX|dY|Date|Dimension|imgPad|expandCursor|pointer|toLowerCase|getPageSize|langDefaults|allowHeightReduction|addRule|kdeBugCorr|allowWidthReduction|clientSize|marginMax|compatMode|DIV|regBody|cachedGets|anchors|pre|expOnly|init|tr|RegExp|clientX|mouse|writeExtendedContent|scrollLeft|scrollTop|userAgent|isHsAnchor|maxWidth|round|hideOnMouseOut|overlayId|cloneNode|offY|tId|offX|preventDefault|heading|over|preloadFullImage|fullExpandLabel|below|thumbsUserSetId|ypos|sg|onLoadStarted|marginBottom|os|onReady|maincontent|250|xpos|relatedTarget|marginRight|continuePreloading|mousemove|srcElement|middle|contentDocument|overrides|parseFloat|calcExpanded|calcBorders|cancelLoading|mouseIsOver|calcThumb|padding|distance|getAdjacentAnchor|hasAlphaImageLoader|mY|cur|getElementById|offsetTop|center|mX|lt|maxsize|arrow|BackCompat|maxHeight|thumbnailId|ucrb|Click|hasMovedMin|correctIframeSize|dec|sel|margin|object|url|fitOverlayBox|isReady||numberOfImagesToPreload|ie6|panel|doWrapper||htmlGetSize|getInline|wrapperClassName|css|sizeDiff|dragByHeading|expandDuration|setObjContainerSize|credits|contentId|garbageBin|restoreTitle|doFullExpand|setPos|clones|max|allowMultipleInstances|topZ|load|hasFocused|origProp|preloadAjaxElement|blur|getCacheBinding|abs|onError|error|moveTo|run|changeSize|afterClose|openerTagNames|element|swfobject|getSelfRendered|adj|resizeTo|mousedown|swfOptions|setSize|mouseClickHandler|string|show|break|form|Create|update|loadingPos|getWrapperKey|location|fade|geckoMac|tbody|types|getElementContent|Text|state|connectOutline|cacheAjax|complete|startTime|getPosition|done|defaultView|osize|cssDirection|dragHandler|direction|wrapperMouseHandler|pageOrigin|Next|JS|Highslide|Play|525|Close|Pause|spacebar|slideshow|Previous|thumb|offsetParent|from|timerId|orig|transit|updateAnchors|call|replaceLang|offsetLeft|pageXOffset|_default|skin|contentWrapper|enableKeyListener|htmlExpand|pow|clickY|loadingTitle|ltr|detachEvent|clickX|loadingText|focusTopmost|easeInQuad|loadingOpacity|hasHtmlExpanders|preloadGraphic|clientWidth|moveText|moveTitle|switch|closeTitle|closeText|nextText|nextTitle|and|200|previousTitle|previousText|ul|resizeTitle|background|nopad|onGraphicLoad|alpha|appendTo||vis|tag|headingOverlay|hide|captionOverlay|rv|Move|preloadNext|getPropertyValue|getAttribute|getComputedStyle|hideIframes|hideSelects|XMLHttpRequest|clearsX|clearsY|hand|readyState|focusTitle|mouseup|preloadImages|indexOf|Overlay|addOverlay|creditsHref|ie6SSL|getAnchorIndex|current|toString|cachedGet|creditsTarget|creditsTitle|_|nextSibling|Eval|setRequestHeader|creditsPosition|XMLHTTP|Microsoft|showOverlays|anchor|doPanels|genOverlayBox|gotOverlays|sleep|active|fullExpandOpacity|destroyOverlays|createFullExpand|javascript|fullExpandTitle|fullExpandPosition|writeCredits|showCredits|backCompat|styleSheets|destroyObject|htmlPrepareClose|ActiveXObject|restoreDuration|awake|offsetX|getOverlays|reOrder|rightpanel|leftpanel|offsetY|preloadAjax|creditsText|KDE|vendor|removeChild|open|flashvars|fadeInOut|easingClose|tmpMin|border|htmlSizeOperations|clear||getIframePageHeight|newHeight|hasExtendedContent|both|prepareNextOutline|attributes|split|correctRatio|gi|afterExpand|script|arguments|wmode|captionEval|Use|keyCode|button|text|drag|headingId|graphics|_self|shadow|HEAD|click|drop|keys|header|htmlE|doScroll|callee|returnValue|outlineStartOffset|footer|registerOverlay|http|headingText|com|captionId|HsExpander|xpand|fullExpandText|DOMContentLoaded|ig|createTextNode|captionText|forceAjaxReload|urlencoded|pageYOffset|send|white|Gecko|Type|application|www|innerHeight|link|toUpperCase|removeAttribute|responseText|blank|about|1001|clientHeight|innerWidth|Content|Macintosh||dummy|GET|zoomout|maincontentText|maincontentId|Msxml2|onreadystatechange|zoomin|maincontentEval|oPos|it|ra|Safari|Trident|With|write|Requested|headingEval|pauseTitle|tgt|actual|rb|Bottom|tgtArr|Expand|300|nodeName|insertBefore|front|Right|Top|AlphaImageLoader|DXImageTransform|progid|Powered|sizingMethod|scale|Left||Height|Width|boolean|allowSimultaneousLoading|onmouseover|flushImgSize|transparent|embedSWF|version|htmlCreate|flash|newWidth|Loading|static|frameborder|oncontextmenu|blockRightClick|Line|alert|debug|onmouseout|lineNumber|message|imageCreate|cancel|bring|expressInstallSwfurl|01|png|paddingTop|200px|https|protocol|1px|linearTween|outlines|pauseText|StopPlay|removeSWF|caption|useOnHtml|dragSensitivity|expression|fix|sqrt|ignoreMe|mouseover|attachEvent|toElement|fromElement|important|default|playTitle|Go|eval|SELECT|the|cellSpacing|borderCollapse|outlinesDir|fontSize|lineHeight|collapse|playText|IFRAME|clearInterval|homepage|splice|esc|Resize|setInterval'.split('|'),0,{})) diff --git a/DeveloperAdoption/public/static/highslide/highslide/highslide.css b/DeveloperAdoption/public/static/highslide/highslide/highslide.css deleted file mode 100644 index 365af97..0000000 --- a/DeveloperAdoption/public/static/highslide/highslide/highslide.css +++ /dev/null @@ -1,889 +0,0 @@ -/** -* @file: highslide.css -* @version: 4.1.13 -*/ -.highslide-container div { - font-family: Verdana, Helvetica; - font-size: 10pt; -} -.highslide-container table { - background: none; -} -.highslide { - outline: none; - text-decoration: none; -} -.highslide img { - border: 2px solid silver; -} -.highslide:hover img { - border-color: gray; -} -.highslide-active-anchor img { - visibility: hidden; -} -.highslide-gallery .highslide-active-anchor img { - border-color: black; - visibility: visible; - cursor: default; -} -.highslide-image { - border-width: 2px; - border-style: solid; - border-color: white; -} -.highslide-wrapper, .highslide-outline { - background: white; -} -.glossy-dark { - background: #111; -} - -.highslide-image-blur { -} -.highslide-number { - font-weight: bold; - color: gray; - font-size: .9em; -} -.highslide-caption { - display: none; - font-size: 1em; - padding: 5px; - /*background: white;*/ -} -.highslide-heading { - display: none; - font-weight: bold; - margin: 0.4em; -} -.highslide-dimming { - /*position: absolute;*/ - background: black; -} -a.highslide-full-expand { - background: url(graphics/fullexpand.gif) no-repeat; - display: block; - margin: 0 10px 10px 0; - width: 34px; - height: 34px; -} -.highslide-loading { - display: block; - color: black; - font-size: 9px; - font-weight: bold; - text-transform: uppercase; - text-decoration: none; - padding: 3px; - border: 1px solid white; - background-color: white; - padding-left: 22px; - background-image: url(graphics/loader.white.gif); - background-repeat: no-repeat; - background-position: 3px 1px; -} -a.highslide-credits, -a.highslide-credits i { - padding: 2px; - color: silver; - text-decoration: none; - font-size: 10px; -} -a.highslide-credits:hover, -a.highslide-credits:hover i { - color: white; - background-color: gray; -} -.highslide-move, .highslide-move * { - cursor: move; -} - -.highslide-viewport { - display: none; - position: fixed; - width: 100%; - height: 100%; - z-index: 1; - background: none; - left: 0; - top: 0; -} -.highslide-overlay { - display: none; -} -.hidden-container { - display: none; -} -/* Example of a semitransparent, offset closebutton */ -.closebutton { - position: relative; - top: -15px; - left: 15px; - width: 30px; - height: 30px; - cursor: pointer; - background: url(graphics/close.png); - /* NOTE! For IE6, you also need to update the highslide-ie6.css file. */ -} - -/*****************************************************************************/ -/* Thumbnail boxes for the galleries. */ -/* Remove these if you are not using a gallery. */ -/*****************************************************************************/ -.highslide-gallery ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.highslide-gallery ul li { - display: block; - position: relative; - float: left; - width: 106px; - height: 106px; - border: 1px solid silver; - background: #ededed; - margin: 2px; - padding: 0; - line-height: 0; - overflow: hidden; -} -.highslide-gallery ul a { - position: absolute; - top: 50%; - left: 50%; -} -.highslide-gallery ul img { - position: relative; - top: -50%; - left: -50%; -} -html>/**/body .highslide-gallery ul li { - display: table; - text-align: center; -} -html>/**/body .highslide-gallery ul li { - text-align: center; -} -html>/**/body .highslide-gallery ul a { - position: static; - display: table-cell; - vertical-align: middle; -} -html>/**/body .highslide-gallery ul img { - position: static; -} - -/*****************************************************************************/ -/* Controls for the galleries. */ -/* Remove these if you are not using a gallery */ -/*****************************************************************************/ -.highslide-controls { - width: 195px; - height: 40px; - background: url(graphics/controlbar-white.gif) 0 -90px no-repeat; - margin: 20px 15px 10px 0; -} -.highslide-controls ul { - position: relative; - left: 15px; - height: 40px; - list-style: none; - margin: 0; - padding: 0; - background: url(graphics/controlbar-white.gif) right -90px no-repeat; - -} -.highslide-controls li { - float: left; - padding: 5px 0; - margin:0; - list-style: none; -} -.highslide-controls a { - background-image: url(graphics/controlbar-white.gif); - display: block; - float: left; - height: 30px; - width: 30px; - outline: none; -} -.highslide-controls a.disabled { - cursor: default; -} -.highslide-controls a.disabled span { - cursor: default; -} -.highslide-controls a span { - /* hide the text for these graphic buttons */ - display: none; - cursor: pointer; -} - - -/* The CSS sprites for the controlbar - see http://www.google.com/search?q=css+sprites */ -.highslide-controls .highslide-previous a { - background-position: 0 0; -} -.highslide-controls .highslide-previous a:hover { - background-position: 0 -30px; -} -.highslide-controls .highslide-previous a.disabled { - background-position: 0 -60px !important; -} -.highslide-controls .highslide-play a { - background-position: -30px 0; -} -.highslide-controls .highslide-play a:hover { - background-position: -30px -30px; -} -.highslide-controls .highslide-play a.disabled { - background-position: -30px -60px !important; -} -.highslide-controls .highslide-pause a { - background-position: -60px 0; -} -.highslide-controls .highslide-pause a:hover { - background-position: -60px -30px; -} -.highslide-controls .highslide-next a { - background-position: -90px 0; -} -.highslide-controls .highslide-next a:hover { - background-position: -90px -30px; -} -.highslide-controls .highslide-next a.disabled { - background-position: -90px -60px !important; -} -.highslide-controls .highslide-move a { - background-position: -120px 0; -} -.highslide-controls .highslide-move a:hover { - background-position: -120px -30px; -} -.highslide-controls .highslide-full-expand a { - background-position: -150px 0; -} -.highslide-controls .highslide-full-expand a:hover { - background-position: -150px -30px; -} -.highslide-controls .highslide-full-expand a.disabled { - background-position: -150px -60px !important; -} -.highslide-controls .highslide-close a { - background-position: -180px 0; -} -.highslide-controls .highslide-close a:hover { - background-position: -180px -30px; -} - -/*****************************************************************************/ -/* Styles for the HTML popups */ -/* Remove these if you are not using Highslide HTML */ -/*****************************************************************************/ -.highslide-maincontent { - display: none; -} -.highslide-html { - background-color: white; -} -.mobile .highslide-html { - border: 1px solid silver; -} -.highslide-html-content { - display: none; - width: 400px; - padding: 0 5px 5px 5px; -} -.highslide-header { - padding-bottom: 5px; -} -.highslide-header ul { - margin: 0; - padding: 0; - text-align: right; -} -.highslide-header ul li { - display: inline; - padding-left: 1em; -} -.highslide-header ul li.highslide-previous, .highslide-header ul li.highslide-next { - display: none; -} -.highslide-header a { - font-weight: bold; - color: gray; - text-transform: uppercase; - text-decoration: none; -} -.highslide-header a:hover { - color: black; -} -.highslide-header .highslide-move a { - cursor: move; -} -.highslide-footer { - height: 16px; -} -.highslide-footer .highslide-resize { - display: block; - float: right; - margin-top: 5px; - height: 11px; - width: 11px; - background: url(graphics/resize.gif) no-repeat; -} -.highslide-footer .highslide-resize span { - display: none; -} -.highslide-body { -} -.highslide-resize { - cursor: nw-resize; -} - -/*****************************************************************************/ -/* Styles for the Individual wrapper class names. */ -/* See www.highslide.com/ref/hs.wrapperClassName */ -/* You can safely remove the class name themes you don't use */ -/*****************************************************************************/ - -/* hs.wrapperClassName = 'draggable-header' */ -.draggable-header .highslide-header { - height: 18px; - border-bottom: 1px solid #dddddd; -} -.draggable-header .highslide-heading { - position: absolute; - margin: 2px 0.4em; -} - -.draggable-header .highslide-header .highslide-move { - cursor: move; - display: block; - height: 16px; - position: absolute; - right: 24px; - top: 0; - width: 100%; - z-index: 1; -} -.draggable-header .highslide-header .highslide-move * { - display: none; -} -.draggable-header .highslide-header .highslide-close { - position: absolute; - right: 2px; - top: 2px; - z-index: 5; - padding: 0; -} -.draggable-header .highslide-header .highslide-close a { - display: block; - height: 16px; - width: 16px; - background-image: url(graphics/closeX.png); -} -.draggable-header .highslide-header .highslide-close a:hover { - background-position: 0 16px; -} -.draggable-header .highslide-header .highslide-close span { - display: none; -} -.draggable-header .highslide-maincontent { - padding-top: 1em; -} - -/* hs.wrapperClassName = 'titlebar' */ -.titlebar .highslide-header { - height: 18px; - border-bottom: 1px solid #dddddd; -} -.titlebar .highslide-heading { - position: absolute; - width: 90%; - margin: 1px 0 1px 5px; - color: #666666; -} - -.titlebar .highslide-header .highslide-move { - cursor: move; - display: block; - height: 16px; - position: absolute; - right: 24px; - top: 0; - width: 100%; - z-index: 1; -} -.titlebar .highslide-header .highslide-move * { - display: none; -} -.titlebar .highslide-header li { - position: relative; - top: 3px; - z-index: 2; - padding: 0 0 0 1em; -} -.titlebar .highslide-maincontent { - padding-top: 1em; -} - -/* hs.wrapperClassName = 'no-footer' */ -.no-footer .highslide-footer { - display: none; -} - -/* hs.wrapperClassName = 'wide-border' */ -.wide-border { - background: white; -} -.wide-border .highslide-image { - border-width: 10px; -} -.wide-border .highslide-caption { - padding: 0 10px 10px 10px; -} - -/* hs.wrapperClassName = 'borderless' */ -.borderless .highslide-image { - border: none; -} -.borderless .highslide-caption { - border-bottom: 1px solid white; - border-top: 1px solid white; - background: silver; -} - -/* hs.wrapperClassName = 'outer-glow' */ -.outer-glow { - background: #444; -} -.outer-glow .highslide-image { - border: 5px solid #444444; -} -.outer-glow .highslide-caption { - border: 5px solid #444444; - border-top: none; - padding: 5px; - background-color: gray; -} - -/* hs.wrapperClassName = 'colored-border' */ -.colored-border { - background: white; -} -.colored-border .highslide-image { - border: 2px solid green; -} -.colored-border .highslide-caption { - border: 2px solid green; - border-top: none; -} - -/* hs.wrapperClassName = 'dark' */ -.dark { - background: #111; -} -.dark .highslide-image { - border-color: black black #202020 black; - background: gray; -} -.dark .highslide-caption { - color: white; - background: #111; -} -.dark .highslide-controls, -.dark .highslide-controls ul, -.dark .highslide-controls a { - background-image: url(graphics/controlbar-black-border.gif); -} - -/* hs.wrapperClassName = 'floating-caption' */ -.floating-caption .highslide-caption { - position: absolute; - padding: 1em 0 0 0; - background: none; - color: white; - border: none; - font-weight: bold; -} - -/* hs.wrapperClassName = 'controls-in-heading' */ -.controls-in-heading .highslide-heading { - color: gray; - font-weight: bold; - height: 20px; - overflow: hidden; - cursor: default; - padding: 0 0 0 22px; - margin: 0; - background: url(graphics/icon.gif) no-repeat 0 1px; -} -.controls-in-heading .highslide-controls { - width: 105px; - height: 20px; - position: relative; - margin: 0; - top: -23px; - left: 7px; - background: none; -} -.controls-in-heading .highslide-controls ul { - position: static; - height: 20px; - background: none; -} -.controls-in-heading .highslide-controls li { - padding: 0; -} -.controls-in-heading .highslide-controls a { - background-image: url(graphics/controlbar-white-small.gif); - height: 20px; - width: 20px; -} - -.controls-in-heading .highslide-controls .highslide-move { - display: none; -} - -.controls-in-heading .highslide-controls .highslide-previous a { - background-position: 0 0; -} -.controls-in-heading .highslide-controls .highslide-previous a:hover { - background-position: 0 -20px; -} -.controls-in-heading .highslide-controls .highslide-previous a.disabled { - background-position: 0 -40px !important; -} -.controls-in-heading .highslide-controls .highslide-play a { - background-position: -20px 0; -} -.controls-in-heading .highslide-controls .highslide-play a:hover { - background-position: -20px -20px; -} -.controls-in-heading .highslide-controls .highslide-play a.disabled { - background-position: -20px -40px !important; -} -.controls-in-heading .highslide-controls .highslide-pause a { - background-position: -40px 0; -} -.controls-in-heading .highslide-controls .highslide-pause a:hover { - background-position: -40px -20px; -} -.controls-in-heading .highslide-controls .highslide-next a { - background-position: -60px 0; -} -.controls-in-heading .highslide-controls .highslide-next a:hover { - background-position: -60px -20px; -} -.controls-in-heading .highslide-controls .highslide-next a.disabled { - background-position: -60px -40px !important; -} -.controls-in-heading .highslide-controls .highslide-full-expand a { - background-position: -100px 0; -} -.controls-in-heading .highslide-controls .highslide-full-expand a:hover { - background-position: -100px -20px; -} -.controls-in-heading .highslide-controls .highslide-full-expand a.disabled { - background-position: -100px -40px !important; -} -.controls-in-heading .highslide-controls .highslide-close a { - background-position: -120px 0; -} -.controls-in-heading .highslide-controls .highslide-close a:hover { - background-position: -120px -20px; -} - -/*****************************************************************************/ -/* Styles for text based controls. */ -/* You can safely remove this if you don't use text based controls */ -/*****************************************************************************/ - -.text-controls .highslide-controls { - width: auto; - height: auto; - margin: 0; - text-align: center; - background: none; -} -.text-controls ul { - position: static; - background: none; - height: auto; - left: 0; -} -.text-controls .highslide-move { - display: none; -} -.text-controls li { - background-image: url(graphics/controlbar-text-buttons.png); - background-position: right top !important; - padding: 0; - margin-left: 15px; - display: block; - width: auto; -} -.text-controls a { - background: url(graphics/controlbar-text-buttons.png) no-repeat; - background-position: left top !important; - position: relative; - left: -10px; - display: block; - width: auto; - height: auto; - text-decoration: none !important; -} -.text-controls a span { - background: url(graphics/controlbar-text-buttons.png) no-repeat; - margin: 1px 2px 1px 10px; - display: block; - min-width: 4em; - height: 18px; - line-height: 18px; - padding: 1px 0 1px 18px; - color: #333; - font-family: "Trebuchet MS", Arial, sans-serif; - font-size: 12px; - font-weight: bold; - white-space: nowrap; -} -.text-controls .highslide-next { - margin-right: 1em; -} -.text-controls .highslide-full-expand a span { - min-width: 0; - margin: 1px 0; - padding: 1px 0 1px 10px; -} -.text-controls .highslide-close a span { - min-width: 0; -} -.text-controls a:hover span { - color: black; -} -.text-controls a.disabled span { - color: #999; -} - -.text-controls .highslide-previous span { - background-position: 0 -40px; -} -.text-controls .highslide-previous a.disabled { - background-position: left top !important; -} -.text-controls .highslide-previous a.disabled span { - background-position: 0 -140px; -} -.text-controls .highslide-play span { - background-position: 0 -60px; -} -.text-controls .highslide-play a.disabled { - background-position: left top !important; -} -.text-controls .highslide-play a.disabled span { - background-position: 0 -160px; -} -.text-controls .highslide-pause span { - background-position: 0 -80px; -} -.text-controls .highslide-next span { - background-position: 0 -100px; -} -.text-controls .highslide-next a.disabled { - background-position: left top !important; -} -.text-controls .highslide-next a.disabled span { - background-position: 0 -200px; -} -.text-controls .highslide-full-expand span { - background: none; -} -.text-controls .highslide-full-expand a.disabled { - background-position: left top !important; -} -.text-controls .highslide-close span { - background-position: 0 -120px; -} - - -/*****************************************************************************/ -/* Styles for the thumbstrip. */ -/* See www.highslide.com/ref/hs.addSlideshow */ -/* You can safely remove this if you don't use a thumbstrip */ -/*****************************************************************************/ - -.highslide-thumbstrip { - height: 100%; - direction: ltr; -} -.highslide-thumbstrip div { - overflow: hidden; -} -.highslide-thumbstrip table { - position: relative; - padding: 0; - border-collapse: collapse; -} -.highslide-thumbstrip td { - padding: 1px; - /*text-align: center;*/ -} -.highslide-thumbstrip a { - outline: none; -} -.highslide-thumbstrip img { - display: block; - border: 1px solid gray; - margin: 0 auto; -} -.highslide-thumbstrip .highslide-active-anchor img { - visibility: visible; -} -.highslide-thumbstrip .highslide-marker { - position: absolute; - width: 0; - height: 0; - border-width: 0; - border-style: solid; - border-color: transparent; /* change this to actual background color in highslide-ie6.css */ -} -.highslide-thumbstrip-horizontal div { - width: auto; - /* width: 100% breaks in small strips in IE */ -} -.highslide-thumbstrip-horizontal .highslide-scroll-up { - display: none; - position: absolute; - top: 3px; - left: 3px; - width: 25px; - height: 42px; -} -.highslide-thumbstrip-horizontal .highslide-scroll-up div { - margin-bottom: 10px; - cursor: pointer; - background: url(graphics/scrollarrows.png) left center no-repeat; - height: 42px; -} -.highslide-thumbstrip-horizontal .highslide-scroll-down { - display: none; - position: absolute; - top: 3px; - right: 3px; - width: 25px; - height: 42px; -} -.highslide-thumbstrip-horizontal .highslide-scroll-down div { - margin-bottom: 10px; - cursor: pointer; - background: url(graphics/scrollarrows.png) center right no-repeat; - height: 42px; -} -.highslide-thumbstrip-horizontal table { - margin: 2px 0 10px 0; -} -.highslide-viewport .highslide-thumbstrip-horizontal table { - margin-left: 10px; -} -.highslide-thumbstrip-horizontal img { - width: auto; - height: 40px; -} -.highslide-thumbstrip-horizontal .highslide-marker { - top: 47px; - border-left-width: 6px; - border-right-width: 6px; - border-bottom: 6px solid gray; -} -.highslide-viewport .highslide-thumbstrip-horizontal .highslide-marker { - margin-left: 10px; -} -.dark .highslide-thumbstrip-horizontal .highslide-marker, .highslide-viewport .highslide-thumbstrip-horizontal .highslide-marker { - border-bottom-color: white !important; -} - -.highslide-thumbstrip-vertical-overlay { - overflow: hidden !important; -} -.highslide-thumbstrip-vertical div { - height: 100%; -} -.highslide-thumbstrip-vertical a { - display: block; -} -.highslide-thumbstrip-vertical .highslide-scroll-up { - display: none; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 25px; -} -.highslide-thumbstrip-vertical .highslide-scroll-up div { - margin-left: 10px; - cursor: pointer; - background: url(graphics/scrollarrows.png) top center no-repeat; - height: 25px; -} -.highslide-thumbstrip-vertical .highslide-scroll-down { - display: none; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - height: 25px; -} -.highslide-thumbstrip-vertical .highslide-scroll-down div { - margin-left: 10px; - cursor: pointer; - background: url(graphics/scrollarrows.png) bottom center no-repeat; - height: 25px; -} -.highslide-thumbstrip-vertical table { - margin: 10px 0 0 10px; -} -.highslide-thumbstrip-vertical img { - width: 60px; /* t=5481 */ -} -.highslide-thumbstrip-vertical .highslide-marker { - left: 0; - margin-top: 8px; - border-top-width: 6px; - border-bottom-width: 6px; - border-left: 6px solid gray; -} -.dark .highslide-thumbstrip-vertical .highslide-marker, .highslide-viewport .highslide-thumbstrip-vertical .highslide-marker { - border-left-color: white; -} - -.highslide-viewport .highslide-thumbstrip-float { - overflow: auto; -} -.highslide-thumbstrip-float ul { - margin: 2px 0; - padding: 0; -} -.highslide-thumbstrip-float li { - display: block; - height: 60px; - margin: 0 2px; - list-style: none; - float: left; -} -.highslide-thumbstrip-float img { - display: inline; - border-color: silver; - max-height: 56px; -} -.highslide-thumbstrip-float .highslide-active-anchor img { - border-color: black; -} -.highslide-thumbstrip-float .highslide-scroll-up div, .highslide-thumbstrip-float .highslide-scroll-down div { - display: none; -} -.highslide-thumbstrip-float .highslide-marker { - display: none; -} \ No newline at end of file diff --git a/DeveloperAdoption/public/static/highslide/highslide/highslide.js b/DeveloperAdoption/public/static/highslide/highslide/highslide.js deleted file mode 100644 index 9c543a0..0000000 --- a/DeveloperAdoption/public/static/highslide/highslide/highslide.js +++ /dev/null @@ -1,1891 +0,0 @@ -/** - * Name: Highslide JS - * Version: 4.1.13 (2011-10-06) - * Config: default - * Author: Torstein Hønsi - * Support: www.highslide.com/support - * License: www.highslide.com/#license - */ -if (!hs) { var hs = { -// Language strings -lang : { - cssDirection: 'ltr', - loadingText : 'Loading...', - loadingTitle : 'Click to cancel', - focusTitle : 'Click to bring to front', - fullExpandTitle : 'Expand to actual size (f)', - creditsText : 'Powered by Highslide JS', - creditsTitle : 'Go to the Highslide JS homepage', - restoreTitle : 'Click to close image, click and drag to move. Use arrow keys for next and previous.' -}, -// See http://highslide.com/ref for examples of settings -graphicsDir : 'highslide/graphics/', -expandCursor : 'zoomin.cur', // null disables -restoreCursor : 'zoomout.cur', // null disables -expandDuration : 250, // milliseconds -restoreDuration : 250, -marginLeft : 15, -marginRight : 15, -marginTop : 15, -marginBottom : 15, -zIndexCounter : 1001, // adjust to other absolutely positioned elements -loadingOpacity : 0.75, -allowMultipleInstances: true, -numberOfImagesToPreload : 5, -outlineWhileAnimating : 2, // 0 = never, 1 = always, 2 = HTML only -outlineStartOffset : 3, // ends at 10 -padToMinWidth : false, // pad the popup width to make room for wide caption -fullExpandPosition : 'bottom right', -fullExpandOpacity : 1, -showCredits : true, // you can set this to false if you want -creditsHref : 'http://highslide.com/', -creditsTarget : '_self', -enableKeyListener : true, -openerTagNames : ['a'], // Add more to allow slideshow indexing - -dragByHeading: true, -minWidth: 200, -minHeight: 200, -allowSizeReduction: true, // allow the image to reduce to fit client size. If false, this overrides minWidth and minHeight -outlineType : 'drop-shadow', // set null to disable outlines -// END OF YOUR SETTINGS - - -// declare internal properties -preloadTheseImages : [], -continuePreloading: true, -expanders : [], -overrides : [ - 'allowSizeReduction', - 'useBox', - 'outlineType', - 'outlineWhileAnimating', - 'captionId', - 'captionText', - 'captionEval', - 'captionOverlay', - 'headingId', - 'headingText', - 'headingEval', - 'headingOverlay', - 'creditsPosition', - 'dragByHeading', - - 'width', - 'height', - - 'wrapperClassName', - 'minWidth', - 'minHeight', - 'maxWidth', - 'maxHeight', - 'pageOrigin', - 'slideshowGroup', - 'easing', - 'easingClose', - 'fadeInOut', - 'src' -], -overlays : [], -idCounter : 0, -oPos : { - x: ['leftpanel', 'left', 'center', 'right', 'rightpanel'], - y: ['above', 'top', 'middle', 'bottom', 'below'] -}, -mouse: {}, -headingOverlay: {}, -captionOverlay: {}, -timers : [], - -pendingOutlines : {}, -clones : {}, -onReady: [], -uaVersion: /Trident\/4\.0/.test(navigator.userAgent) ? 8 : - parseFloat((navigator.userAgent.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1]), -ie : (document.all && !window.opera), -//ie : navigator && /MSIE [678]/.test(navigator.userAgent), // ie9 compliant? -safari : /Safari/.test(navigator.userAgent), -geckoMac : /Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent), - -$ : function (id) { - if (id) return document.getElementById(id); -}, - -push : function (arr, val) { - arr[arr.length] = val; -}, - -createElement : function (tag, attribs, styles, parent, nopad) { - var el = document.createElement(tag); - if (attribs) hs.extend(el, attribs); - if (nopad) hs.setStyles(el, {padding: 0, border: 'none', margin: 0}); - if (styles) hs.setStyles(el, styles); - if (parent) parent.appendChild(el); - return el; -}, - -extend : function (el, attribs) { - for (var x in attribs) el[x] = attribs[x]; - return el; -}, - -setStyles : function (el, styles) { - for (var x in styles) { - if (hs.ieLt9 && x == 'opacity') { - if (styles[x] > 0.99) el.style.removeAttribute('filter'); - else el.style.filter = 'alpha(opacity='+ (styles[x] * 100) +')'; - } - else el.style[x] = styles[x]; - } -}, -animate: function(el, prop, opt) { - var start, - end, - unit; - if (typeof opt != 'object' || opt === null) { - var args = arguments; - opt = { - duration: args[2], - easing: args[3], - complete: args[4] - }; - } - if (typeof opt.duration != 'number') opt.duration = 250; - opt.easing = Math[opt.easing] || Math.easeInQuad; - opt.curAnim = hs.extend({}, prop); - for (var name in prop) { - var e = new hs.fx(el, opt , name ); - - start = parseFloat(hs.css(el, name)) || 0; - end = parseFloat(prop[name]); - unit = name != 'opacity' ? 'px' : ''; - - e.custom( start, end, unit ); - } -}, -css: function(el, prop) { - if (el.style[prop]) { - return el.style[prop]; - } else if (document.defaultView) { - return document.defaultView.getComputedStyle(el, null).getPropertyValue(prop); - - } else { - if (prop == 'opacity') prop = 'filter'; - var val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b){ return b.toUpperCase(); })]; - if (prop == 'filter') - val = val.replace(/alpha\(opacity=([0-9]+)\)/, - function (a, b) { return b / 100 }); - return val === '' ? 1 : val; - } -}, - -getPageSize : function () { - var d = document, w = window, iebody = d.compatMode && d.compatMode != 'BackCompat' - ? d.documentElement : d.body, - ieLt9 = hs.ie && (hs.uaVersion < 9 || typeof pageXOffset == 'undefined'); - - var width = ieLt9 ? iebody.clientWidth : - (d.documentElement.clientWidth || self.innerWidth), - height = ieLt9 ? iebody.clientHeight : self.innerHeight; - hs.page = { - width: width, - height: height, - scrollLeft: ieLt9 ? iebody.scrollLeft : pageXOffset, - scrollTop: ieLt9 ? iebody.scrollTop : pageYOffset - }; - return hs.page; -}, - -getPosition : function(el) { - var p = { x: el.offsetLeft, y: el.offsetTop }; - while (el.offsetParent) { - el = el.offsetParent; - p.x += el.offsetLeft; - p.y += el.offsetTop; - if (el != document.body && el != document.documentElement) { - p.x -= el.scrollLeft; - p.y -= el.scrollTop; - } - } - return p; -}, - -expand : function(a, params, custom, type) { - if (!a) a = hs.createElement('a', null, { display: 'none' }, hs.container); - if (typeof a.getParams == 'function') return params; - try { - new hs.Expander(a, params, custom); - return false; - } catch (e) { return true; } -}, - - -focusTopmost : function() { - var topZ = 0, - topmostKey = -1, - expanders = hs.expanders, - exp, - zIndex; - for (var i = 0; i < expanders.length; i++) { - exp = expanders[i]; - if (exp) { - zIndex = exp.wrapper.style.zIndex; - if (zIndex && zIndex > topZ) { - topZ = zIndex; - topmostKey = i; - } - } - } - if (topmostKey == -1) hs.focusKey = -1; - else expanders[topmostKey].focus(); -}, - -getParam : function (a, param) { - a.getParams = a.onclick; - var p = a.getParams ? a.getParams() : null; - a.getParams = null; - - return (p && typeof p[param] != 'undefined') ? p[param] : - (typeof hs[param] != 'undefined' ? hs[param] : null); -}, - -getSrc : function (a) { - var src = hs.getParam(a, 'src'); - if (src) return src; - return a.href; -}, - -getNode : function (id) { - var node = hs.$(id), clone = hs.clones[id], a = {}; - if (!node && !clone) return null; - if (!clone) { - clone = node.cloneNode(true); - clone.id = ''; - hs.clones[id] = clone; - return node; - } else { - return clone.cloneNode(true); - } -}, - -discardElement : function(d) { - if (d) hs.garbageBin.appendChild(d); - hs.garbageBin.innerHTML = ''; -}, -transit : function (adj, exp) { - var last = exp || hs.getExpander(); - exp = last; - if (hs.upcoming) return false; - else hs.last = last; - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - try { - hs.upcoming = adj; - adj.onclick(); - } catch (e){ - hs.last = hs.upcoming = null; - } - try { - exp.close(); - } catch (e) {} - return false; -}, - -previousOrNext : function (el, op) { - var exp = hs.getExpander(el); - if (exp) return hs.transit(exp.getAdjacentAnchor(op), exp); - else return false; -}, - -previous : function (el) { - return hs.previousOrNext(el, -1); -}, - -next : function (el) { - return hs.previousOrNext(el, 1); -}, - -keyHandler : function(e) { - if (!e) e = window.event; - if (!e.target) e.target = e.srcElement; // ie - if (typeof e.target.form != 'undefined') return true; // form element has focus - var exp = hs.getExpander(); - - var op = null; - switch (e.keyCode) { - case 70: // f - if (exp) exp.doFullExpand(); - return true; - case 32: // Space - case 34: // Page Down - case 39: // Arrow right - case 40: // Arrow down - op = 1; - break; - case 8: // Backspace - case 33: // Page Up - case 37: // Arrow left - case 38: // Arrow up - op = -1; - break; - case 27: // Escape - case 13: // Enter - op = 0; - } - if (op !== null) {hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - if (!hs.enableKeyListener) return true; - - if (e.preventDefault) e.preventDefault(); - else e.returnValue = false; - if (exp) { - if (op == 0) { - exp.close(); - } else { - hs.previousOrNext(exp.key, op); - } - return false; - } - } - return true; -}, - - -registerOverlay : function (overlay) { - hs.push(hs.overlays, hs.extend(overlay, { hsId: 'hsId'+ hs.idCounter++ } )); -}, - - -getWrapperKey : function (element, expOnly) { - var el, re = /^highslide-wrapper-([0-9]+)$/; - // 1. look in open expanders - el = element; - while (el.parentNode) { - if (el.id && re.test(el.id)) return el.id.replace(re, "$1"); - el = el.parentNode; - } - // 2. look in thumbnail - if (!expOnly) { - el = element; - while (el.parentNode) { - if (el.tagName && hs.isHsAnchor(el)) { - for (var key = 0; key < hs.expanders.length; key++) { - var exp = hs.expanders[key]; - if (exp && exp.a == el) return key; - } - } - el = el.parentNode; - } - } - return null; -}, - -getExpander : function (el, expOnly) { - if (typeof el == 'undefined') return hs.expanders[hs.focusKey] || null; - if (typeof el == 'number') return hs.expanders[el] || null; - if (typeof el == 'string') el = hs.$(el); - return hs.expanders[hs.getWrapperKey(el, expOnly)] || null; -}, - -isHsAnchor : function (a) { - return (a.onclick && a.onclick.toString().replace(/\s/g, ' ').match(/hs.(htmlE|e)xpand/)); -}, - -reOrder : function () { - for (var i = 0; i < hs.expanders.length; i++) - if (hs.expanders[i] && hs.expanders[i].isExpanded) hs.focusTopmost(); -}, - -mouseClickHandler : function(e) -{ - if (!e) e = window.event; - if (e.button > 1) return true; - if (!e.target) e.target = e.srcElement; - - var el = e.target; - while (el.parentNode - && !(/highslide-(image|move|html|resize)/.test(el.className))) - { - el = el.parentNode; - } - var exp = hs.getExpander(el); - if (exp && (exp.isClosing || !exp.isExpanded)) return true; - - if (exp && e.type == 'mousedown') { - if (e.target.form) return true; - var match = el.className.match(/highslide-(image|move|resize)/); - if (match) { - hs.dragArgs = { - exp: exp , - type: match[1], - left: exp.x.pos, - width: exp.x.size, - top: exp.y.pos, - height: exp.y.size, - clickX: e.clientX, - clickY: e.clientY - }; - - - hs.addEventListener(document, 'mousemove', hs.dragHandler); - if (e.preventDefault) e.preventDefault(); // FF - - if (/highslide-(image|html)-blur/.test(exp.content.className)) { - exp.focus(); - hs.hasFocused = true; - } - return false; - } - } else if (e.type == 'mouseup') { - - hs.removeEventListener(document, 'mousemove', hs.dragHandler); - - if (hs.dragArgs) { - if (hs.styleRestoreCursor && hs.dragArgs.type == 'image') - hs.dragArgs.exp.content.style.cursor = hs.styleRestoreCursor; - var hasDragged = hs.dragArgs.hasDragged; - - if (!hasDragged &&!hs.hasFocused && !/(move|resize)/.test(hs.dragArgs.type)) { - exp.close(); - } - else if (hasDragged || (!hasDragged && hs.hasHtmlExpanders)) { - hs.dragArgs.exp.doShowHide('hidden'); - } - hs.hasFocused = false; - hs.dragArgs = null; - - } else if (/highslide-image-blur/.test(el.className)) { - el.style.cursor = hs.styleRestoreCursor; - } - } - return false; -}, - -dragHandler : function(e) -{ - if (!hs.dragArgs) return true; - if (!e) e = window.event; - var a = hs.dragArgs, exp = a.exp; - - a.dX = e.clientX - a.clickX; - a.dY = e.clientY - a.clickY; - - var distance = Math.sqrt(Math.pow(a.dX, 2) + Math.pow(a.dY, 2)); - if (!a.hasDragged) a.hasDragged = (a.type != 'image' && distance > 0) - || (distance > (hs.dragSensitivity || 5)); - - if (a.hasDragged && e.clientX > 5 && e.clientY > 5) { - - if (a.type == 'resize') exp.resize(a); - else { - exp.moveTo(a.left + a.dX, a.top + a.dY); - if (a.type == 'image') exp.content.style.cursor = 'move'; - } - } - return false; -}, - -wrapperMouseHandler : function (e) { - try { - if (!e) e = window.event; - var over = /mouseover/i.test(e.type); - if (!e.target) e.target = e.srcElement; // ie - if (!e.relatedTarget) e.relatedTarget = - over ? e.fromElement : e.toElement; // ie - var exp = hs.getExpander(e.target); - if (!exp.isExpanded) return; - if (!exp || !e.relatedTarget || hs.getExpander(e.relatedTarget, true) == exp - || hs.dragArgs) return; - for (var i = 0; i < exp.overlays.length; i++) (function() { - var o = hs.$('hsId'+ exp.overlays[i]); - if (o && o.hideOnMouseOut) { - if (over) hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: over ? o.opacity : 0 }, o.dur); - } - })(); - } catch (e) {} -}, -addEventListener : function (el, event, func) { - if (el == document && event == 'ready') { - hs.push(hs.onReady, func); - } - try { - el.addEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - el.attachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = func; - } - } -}, - -removeEventListener : function (el, event, func) { - try { - el.removeEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = null; - } - } -}, - -preloadFullImage : function (i) { - if (hs.continuePreloading && hs.preloadTheseImages[i] && hs.preloadTheseImages[i] != 'undefined') { - var img = document.createElement('img'); - img.onload = function() { - img = null; - hs.preloadFullImage(i + 1); - }; - img.src = hs.preloadTheseImages[i]; - } -}, -preloadImages : function (number) { - if (number && typeof number != 'object') hs.numberOfImagesToPreload = number; - - var arr = hs.getAnchors(); - for (var i = 0; i < arr.images.length && i < hs.numberOfImagesToPreload; i++) { - hs.push(hs.preloadTheseImages, hs.getSrc(arr.images[i])); - } - - // preload outlines - if (hs.outlineType) new hs.Outline(hs.outlineType, function () { hs.preloadFullImage(0)} ); - else - - hs.preloadFullImage(0); - - // preload cursor - if (hs.restoreCursor) var cur = hs.createElement('img', { src: hs.graphicsDir + hs.restoreCursor }); -}, - - -init : function () { - if (!hs.container) { - - hs.ieLt7 = hs.ie && hs.uaVersion < 7; - hs.ieLt9 = hs.ie && hs.uaVersion < 9; - - hs.getPageSize(); - for (var x in hs.langDefaults) { - if (typeof hs[x] != 'undefined') hs.lang[x] = hs[x]; - else if (typeof hs.lang[x] == 'undefined' && typeof hs.langDefaults[x] != 'undefined') - hs.lang[x] = hs.langDefaults[x]; - } - - hs.container = hs.createElement('div', { - className: 'highslide-container' - }, { - position: 'absolute', - left: 0, - top: 0, - width: '100%', - zIndex: hs.zIndexCounter, - direction: 'ltr' - }, - document.body, - true - ); - hs.loading = hs.createElement('a', { - className: 'highslide-loading', - title: hs.lang.loadingTitle, - innerHTML: hs.lang.loadingText, - href: 'javascript:;' - }, { - position: 'absolute', - top: '-9999px', - opacity: hs.loadingOpacity, - zIndex: 1 - }, hs.container - ); - hs.garbageBin = hs.createElement('div', null, { display: 'none' }, hs.container); - - // http://www.robertpenner.com/easing/ - Math.linearTween = function (t, b, c, d) { - return c*t/d + b; - }; - Math.easeInQuad = function (t, b, c, d) { - return c*(t/=d)*t + b; - }; - - hs.hideSelects = hs.ieLt7; - hs.hideIframes = ((window.opera && hs.uaVersion < 9) || navigator.vendor == 'KDE' - || (hs.ieLt7 && hs.uaVersion < 5.5)); - } -}, -ready : function() { - if (hs.isReady) return; - hs.isReady = true; - for (var i = 0; i < hs.onReady.length; i++) hs.onReady[i](); -}, - -updateAnchors : function() { - var el, els, all = [], images = [],groups = {}, re; - - for (var i = 0; i < hs.openerTagNames.length; i++) { - els = document.getElementsByTagName(hs.openerTagNames[i]); - for (var j = 0; j < els.length; j++) { - el = els[j]; - re = hs.isHsAnchor(el); - if (re) { - hs.push(all, el); - if (re[0] == 'hs.expand') hs.push(images, el); - var g = hs.getParam(el, 'slideshowGroup') || 'none'; - if (!groups[g]) groups[g] = []; - hs.push(groups[g], el); - } - } - } - hs.anchors = { all: all, groups: groups, images: images }; - return hs.anchors; - -}, - -getAnchors : function() { - return hs.anchors || hs.updateAnchors(); -}, - - -close : function(el) { - var exp = hs.getExpander(el); - if (exp) exp.close(); - return false; -} -}; // end hs object -hs.fx = function( elem, options, prop ){ - this.options = options; - this.elem = elem; - this.prop = prop; - - if (!options.orig) options.orig = {}; -}; -hs.fx.prototype = { - update: function(){ - (hs.fx.step[this.prop] || hs.fx.step._default)(this); - - if (this.options.step) - this.options.step.call(this.elem, this.now, this); - - }, - custom: function(from, to, unit){ - this.startTime = (new Date()).getTime(); - this.start = from; - this.end = to; - this.unit = unit;// || this.unit || "px"; - this.now = this.start; - this.pos = this.state = 0; - - var self = this; - function t(gotoEnd){ - return self.step(gotoEnd); - } - - t.elem = this.elem; - - if ( t() && hs.timers.push(t) == 1 ) { - hs.timerId = setInterval(function(){ - var timers = hs.timers; - - for ( var i = 0; i < timers.length; i++ ) - if ( !timers[i]() ) - timers.splice(i--, 1); - - if ( !timers.length ) { - clearInterval(hs.timerId); - } - }, 13); - } - }, - step: function(gotoEnd){ - var t = (new Date()).getTime(); - if ( gotoEnd || t >= this.options.duration + this.startTime ) { - this.now = this.end; - this.pos = this.state = 1; - this.update(); - - this.options.curAnim[ this.prop ] = true; - - var done = true; - for ( var i in this.options.curAnim ) - if ( this.options.curAnim[i] !== true ) - done = false; - - if ( done ) { - if (this.options.complete) this.options.complete.call(this.elem); - } - return false; - } else { - var n = t - this.startTime; - this.state = n / this.options.duration; - this.pos = this.options.easing(n, 0, 1, this.options.duration); - this.now = this.start + ((this.end - this.start) * this.pos); - this.update(); - } - return true; - } - -}; - -hs.extend( hs.fx, { - step: { - - opacity: function(fx){ - hs.setStyles(fx.elem, { opacity: fx.now }); - }, - - _default: function(fx){ - try { - if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) - fx.elem.style[ fx.prop ] = fx.now + fx.unit; - else - fx.elem[ fx.prop ] = fx.now; - } catch (e) {} - } - } -}); - -hs.Outline = function (outlineType, onLoad) { - this.onLoad = onLoad; - this.outlineType = outlineType; - var v = hs.uaVersion, tr; - - this.hasAlphaImageLoader = hs.ie && hs.uaVersion < 7; - if (!outlineType) { - if (onLoad) onLoad(); - return; - } - - hs.init(); - this.table = hs.createElement( - 'table', { - cellSpacing: 0 - }, { - visibility: 'hidden', - position: 'absolute', - borderCollapse: 'collapse', - width: 0 - }, - hs.container, - true - ); - var tbody = hs.createElement('tbody', null, null, this.table, 1); - - this.td = []; - for (var i = 0; i <= 8; i++) { - if (i % 3 == 0) tr = hs.createElement('tr', null, { height: 'auto' }, tbody, true); - this.td[i] = hs.createElement('td', null, null, tr, true); - var style = i != 4 ? { lineHeight: 0, fontSize: 0} : { position : 'relative' }; - hs.setStyles(this.td[i], style); - } - this.td[4].className = outlineType +' highslide-outline'; - - this.preloadGraphic(); -}; - -hs.Outline.prototype = { -preloadGraphic : function () { - var src = hs.graphicsDir + (hs.outlinesDir || "outlines/")+ this.outlineType +".png"; - - var appendTo = hs.safari && hs.uaVersion < 525 ? hs.container : null; - this.graphic = hs.createElement('img', null, { position: 'absolute', - top: '-9999px' }, appendTo, true); // for onload trigger - - var pThis = this; - this.graphic.onload = function() { pThis.onGraphicLoad(); }; - - this.graphic.src = src; -}, - -onGraphicLoad : function () { - var o = this.offset = this.graphic.width / 4, - pos = [[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]], - dim = { height: (2*o) +'px', width: (2*o) +'px' }; - for (var i = 0; i <= 8; i++) { - if (pos[i]) { - if (this.hasAlphaImageLoader) { - var w = (i == 1 || i == 7) ? '100%' : this.graphic.width +'px'; - var div = hs.createElement('div', null, { width: '100%', height: '100%', position: 'relative', overflow: 'hidden'}, this.td[i], true); - hs.createElement ('div', null, { - filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+ this.graphic.src + "')", - position: 'absolute', - width: w, - height: this.graphic.height +'px', - left: (pos[i][0]*o)+'px', - top: (pos[i][1]*o)+'px' - }, - div, - true); - } else { - hs.setStyles(this.td[i], { background: 'url('+ this.graphic.src +') '+ (pos[i][0]*o)+'px '+(pos[i][1]*o)+'px'}); - } - - if (window.opera && (i == 3 || i ==5)) - hs.createElement('div', null, dim, this.td[i], true); - - hs.setStyles (this.td[i], dim); - } - } - this.graphic = null; - if (hs.pendingOutlines[this.outlineType]) hs.pendingOutlines[this.outlineType].destroy(); - hs.pendingOutlines[this.outlineType] = this; - if (this.onLoad) this.onLoad(); -}, - -setPosition : function (pos, offset, vis, dur, easing) { - var exp = this.exp, - stl = exp.wrapper.style, - offset = offset || 0, - pos = pos || { - x: exp.x.pos + offset, - y: exp.y.pos + offset, - w: exp.x.get('wsize') - 2 * offset, - h: exp.y.get('wsize') - 2 * offset - }; - if (vis) this.table.style.visibility = (pos.h >= 4 * this.offset) - ? 'visible' : 'hidden'; - hs.setStyles(this.table, { - left: (pos.x - this.offset) +'px', - top: (pos.y - this.offset) +'px', - width: (pos.w + 2 * this.offset) +'px' - }); - - pos.w -= 2 * this.offset; - pos.h -= 2 * this.offset; - hs.setStyles (this.td[4], { - width: pos.w >= 0 ? pos.w +'px' : 0, - height: pos.h >= 0 ? pos.h +'px' : 0 - }); - if (this.hasAlphaImageLoader) this.td[3].style.height - = this.td[5].style.height = this.td[4].style.height; - -}, - -destroy : function(hide) { - if (hide) this.table.style.visibility = 'hidden'; - else hs.discardElement(this.table); -} -}; - -hs.Dimension = function(exp, dim) { - this.exp = exp; - this.dim = dim; - this.ucwh = dim == 'x' ? 'Width' : 'Height'; - this.wh = this.ucwh.toLowerCase(); - this.uclt = dim == 'x' ? 'Left' : 'Top'; - this.lt = this.uclt.toLowerCase(); - this.ucrb = dim == 'x' ? 'Right' : 'Bottom'; - this.rb = this.ucrb.toLowerCase(); - this.p1 = this.p2 = 0; -}; -hs.Dimension.prototype = { -get : function(key) { - switch (key) { - case 'loadingPos': - return this.tpos + this.tb + (this.t - hs.loading['offset'+ this.ucwh]) / 2; - case 'wsize': - return this.size + 2 * this.cb + this.p1 + this.p2; - case 'fitsize': - return this.clientSize - this.marginMin - this.marginMax; - case 'maxsize': - return this.get('fitsize') - 2 * this.cb - this.p1 - this.p2 ; - case 'opos': - return this.pos - (this.exp.outline ? this.exp.outline.offset : 0); - case 'osize': - return this.get('wsize') + (this.exp.outline ? 2*this.exp.outline.offset : 0); - case 'imgPad': - return this.imgSize ? Math.round((this.size - this.imgSize) / 2) : 0; - - } -}, -calcBorders: function() { - // correct for borders - this.cb = (this.exp.content['offset'+ this.ucwh] - this.t) / 2; - - this.marginMax = hs['margin'+ this.ucrb]; -}, -calcThumb: function() { - this.t = this.exp.el[this.wh] ? parseInt(this.exp.el[this.wh]) : - this.exp.el['offset'+ this.ucwh]; - this.tpos = this.exp.tpos[this.dim]; - this.tb = (this.exp.el['offset'+ this.ucwh] - this.t) / 2; - if (this.tpos == 0 || this.tpos == -1) { - this.tpos = (hs.page[this.wh] / 2) + hs.page['scroll'+ this.uclt]; - }; -}, -calcExpanded: function() { - var exp = this.exp; - this.justify = 'auto'; - - - // size and position - this.pos = this.tpos - this.cb + this.tb; - - if (this.maxHeight && this.dim == 'x') - exp.maxWidth = Math.min(exp.maxWidth || this.full, exp.maxHeight * this.full / exp.y.full); - - this.size = Math.min(this.full, exp['max'+ this.ucwh] || this.full); - this.minSize = exp.allowSizeReduction ? - Math.min(exp['min'+ this.ucwh], this.full) :this.full; - if (exp.isImage && exp.useBox) { - this.size = exp[this.wh]; - this.imgSize = this.full; - } - if (this.dim == 'x' && hs.padToMinWidth) this.minSize = exp.minWidth; - this.marginMin = hs['margin'+ this.uclt]; - this.scroll = hs.page['scroll'+ this.uclt]; - this.clientSize = hs.page[this.wh]; -}, -setSize: function(i) { - var exp = this.exp; - if (exp.isImage && (exp.useBox || hs.padToMinWidth)) { - this.imgSize = i; - this.size = Math.max(this.size, this.imgSize); - exp.content.style[this.lt] = this.get('imgPad')+'px'; - } else - this.size = i; - - exp.content.style[this.wh] = i +'px'; - exp.wrapper.style[this.wh] = this.get('wsize') +'px'; - if (exp.outline) exp.outline.setPosition(); - if (this.dim == 'x' && exp.overlayBox) exp.sizeOverlayBox(true); -}, -setPos: function(i) { - this.pos = i; - this.exp.wrapper.style[this.lt] = i +'px'; - - if (this.exp.outline) this.exp.outline.setPosition(); - -} -}; - -hs.Expander = function(a, params, custom, contentType) { - if (document.readyState && hs.ie && !hs.isReady) { - hs.addEventListener(document, 'ready', function() { - new hs.Expander(a, params, custom, contentType); - }); - return; - } - this.a = a; - this.custom = custom; - this.contentType = contentType || 'image'; - this.isImage = !this.isHtml; - - hs.continuePreloading = false; - this.overlays = []; - hs.init(); - var key = this.key = hs.expanders.length; - // override inline parameters - for (var i = 0; i < hs.overrides.length; i++) { - var name = hs.overrides[i]; - this[name] = params && typeof params[name] != 'undefined' ? - params[name] : hs[name]; - } - if (!this.src) this.src = a.href; - - // get thumb - var el = (params && params.thumbnailId) ? hs.$(params.thumbnailId) : a; - el = this.thumb = el.getElementsByTagName('img')[0] || el; - this.thumbsUserSetId = el.id || a.id; - - // check if already open - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].a == a) { - hs.expanders[i].focus(); - return false; - } - } - - // cancel other - if (!hs.allowSimultaneousLoading) for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].thumb != el && !hs.expanders[i].onLoadStarted) { - hs.expanders[i].cancelLoading(); - } - } - hs.expanders[key] = this; - if (!hs.allowMultipleInstances && !hs.upcoming) { - if (hs.expanders[key-1]) hs.expanders[key-1].close(); - if (typeof hs.focusKey != 'undefined' && hs.expanders[hs.focusKey]) - hs.expanders[hs.focusKey].close(); - } - - // initiate metrics - this.el = el; - this.tpos = this.pageOrigin || hs.getPosition(el); - hs.getPageSize(); - var x = this.x = new hs.Dimension(this, 'x'); - x.calcThumb(); - var y = this.y = new hs.Dimension(this, 'y'); - y.calcThumb(); - this.wrapper = hs.createElement( - 'div', { - id: 'highslide-wrapper-'+ this.key, - className: 'highslide-wrapper '+ this.wrapperClassName - }, { - visibility: 'hidden', - position: 'absolute', - zIndex: hs.zIndexCounter += 2 - }, null, true ); - - this.wrapper.onmouseover = this.wrapper.onmouseout = hs.wrapperMouseHandler; - if (this.contentType == 'image' && this.outlineWhileAnimating == 2) - this.outlineWhileAnimating = 0; - - // get the outline - if (!this.outlineType) { - this[this.contentType +'Create'](); - - } else if (hs.pendingOutlines[this.outlineType]) { - this.connectOutline(); - this[this.contentType +'Create'](); - - } else { - this.showLoading(); - var exp = this; - new hs.Outline(this.outlineType, - function () { - exp.connectOutline(); - exp[exp.contentType +'Create'](); - } - ); - } - return true; -}; - -hs.Expander.prototype = { -error : function(e) { - if (hs.debug) alert ('Line '+ e.lineNumber +': '+ e.message); - else window.location.href = this.src; -}, - -connectOutline : function() { - var outline = this.outline = hs.pendingOutlines[this.outlineType]; - outline.exp = this; - outline.table.style.zIndex = this.wrapper.style.zIndex - 1; - hs.pendingOutlines[this.outlineType] = null; -}, - -showLoading : function() { - if (this.onLoadStarted || this.loading) return; - - this.loading = hs.loading; - var exp = this; - this.loading.onclick = function() { - exp.cancelLoading(); - }; - var exp = this, - l = this.x.get('loadingPos') +'px', - t = this.y.get('loadingPos') +'px'; - setTimeout(function () { - if (exp.loading) hs.setStyles(exp.loading, { left: l, top: t, zIndex: hs.zIndexCounter++ })} - , 100); -}, - -imageCreate : function() { - var exp = this; - - var img = document.createElement('img'); - this.content = img; - img.onload = function () { - if (hs.expanders[exp.key]) exp.contentLoaded(); - }; - if (hs.blockRightClick) img.oncontextmenu = function() { return false; }; - img.className = 'highslide-image'; - hs.setStyles(img, { - visibility: 'hidden', - display: 'block', - position: 'absolute', - maxWidth: '9999px', - zIndex: 3 - }); - img.title = hs.lang.restoreTitle; - if (hs.safari && hs.uaVersion < 525) hs.container.appendChild(img); - if (hs.ie && hs.flushImgSize) img.src = null; - img.src = this.src; - - this.showLoading(); -}, - -contentLoaded : function() { - try { - if (!this.content) return; - this.content.onload = null; - if (this.onLoadStarted) return; - else this.onLoadStarted = true; - - var x = this.x, y = this.y; - - if (this.loading) { - hs.setStyles(this.loading, { top: '-9999px' }); - this.loading = null; - } - x.full = this.content.width; - y.full = this.content.height; - - hs.setStyles(this.content, { - width: x.t +'px', - height: y.t +'px' - }); - this.wrapper.appendChild(this.content); - hs.container.appendChild(this.wrapper); - - x.calcBorders(); - y.calcBorders(); - - hs.setStyles (this.wrapper, { - left: (x.tpos + x.tb - x.cb) +'px', - top: (y.tpos + x.tb - y.cb) +'px' - }); - this.getOverlays(); - - var ratio = x.full / y.full; - x.calcExpanded(); - this.justify(x); - - y.calcExpanded(); - this.justify(y); - if (this.overlayBox) this.sizeOverlayBox(0, 1); - - - if (this.allowSizeReduction) { - this.correctRatio(ratio); - if (this.isImage && this.x.full > (this.x.imgSize || this.x.size)) { - this.createFullExpand(); - if (this.overlays.length == 1) this.sizeOverlayBox(); - } - } - this.show(); - - } catch (e) { - this.error(e); - } -}, - -justify : function (p, moveOnly) { - var tgtArr, tgt = p.target, dim = p == this.x ? 'x' : 'y'; - - var hasMovedMin = false; - - var allowReduce = p.exp.allowSizeReduction; - p.pos = Math.round(p.pos - ((p.get('wsize') - p.t) / 2)); - if (p.pos < p.scroll + p.marginMin) { - p.pos = p.scroll + p.marginMin; - hasMovedMin = true; - } - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - if (p.pos + p.get('wsize') > p.scroll + p.clientSize - p.marginMax) { - if (!moveOnly && hasMovedMin && allowReduce) { - p.size = Math.min(p.size, p.get(dim == 'y' ? 'fitsize' : 'maxsize')); - } else if (p.get('wsize') < p.get('fitsize')) { - p.pos = p.scroll + p.clientSize - p.marginMax - p.get('wsize'); - } else { // image larger than viewport - p.pos = p.scroll + p.marginMin; - if (!moveOnly && allowReduce) p.size = p.get(dim == 'y' ? 'fitsize' : 'maxsize'); - } - } - - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - - - - if (p.pos < p.marginMin) { - var tmpMin = p.pos; - p.pos = p.marginMin; - - if (allowReduce && !moveOnly) p.size = p.size - (p.pos - tmpMin); - - } -}, - -correctRatio : function(ratio) { - var x = this.x, - y = this.y, - changed = false, - xSize = Math.min(x.full, x.size), - ySize = Math.min(y.full, y.size), - useBox = (this.useBox || hs.padToMinWidth); - - if (xSize / ySize > ratio) { // width greater - xSize = ySize * ratio; - if (xSize < x.minSize) { // below minWidth - xSize = x.minSize; - ySize = xSize / ratio; - } - changed = true; - - } else if (xSize / ySize < ratio) { // height greater - ySize = xSize / ratio; - changed = true; - } - - if (hs.padToMinWidth && x.full < x.minSize) { - x.imgSize = x.full; - y.size = y.imgSize = y.full; - } else if (this.useBox) { - x.imgSize = xSize; - y.imgSize = ySize; - } else { - x.size = xSize; - y.size = ySize; - } - changed = this.fitOverlayBox(this.useBox ? null : ratio, changed); - if (useBox && y.size < y.imgSize) { - y.imgSize = y.size; - x.imgSize = y.size * ratio; - } - if (changed || useBox) { - x.pos = x.tpos - x.cb + x.tb; - x.minSize = x.size; - this.justify(x, true); - - y.pos = y.tpos - y.cb + y.tb; - y.minSize = y.size; - this.justify(y, true); - if (this.overlayBox) this.sizeOverlayBox(); - } - - -}, -fitOverlayBox : function(ratio, changed) { - var x = this.x, y = this.y; - if (this.overlayBox) { - while (y.size > this.minHeight && x.size > this.minWidth - && y.get('wsize') > y.get('fitsize')) { - y.size -= 10; - if (ratio) x.size = y.size * ratio; - this.sizeOverlayBox(0, 1); - changed = true; - } - } - return changed; -}, - -show : function () { - var x = this.x, y = this.y; - this.doShowHide('hidden'); - - // Apply size change - this.changeSize( - 1, { - wrapper: { - width : x.get('wsize'), - height : y.get('wsize'), - left: x.pos, - top: y.pos - }, - content: { - left: x.p1 + x.get('imgPad'), - top: y.p1 + y.get('imgPad'), - width:x.imgSize ||x.size, - height:y.imgSize ||y.size - } - }, - hs.expandDuration - ); -}, - -changeSize : function(up, to, dur) { - - if (this.outline && !this.outlineWhileAnimating) { - if (up) this.outline.setPosition(); - else this.outline.destroy(); - } - - - if (!up) this.destroyOverlays(); - - var exp = this, - x = exp.x, - y = exp.y, - easing = this.easing; - if (!up) easing = this.easingClose || easing; - var after = up ? - function() { - - if (exp.outline) exp.outline.table.style.visibility = "visible"; - setTimeout(function() { - exp.afterExpand(); - }, 50); - } : - function() { - exp.afterClose(); - }; - if (up) hs.setStyles( this.wrapper, { - width: x.t +'px', - height: y.t +'px' - }); - if (this.fadeInOut) { - hs.setStyles(this.wrapper, { opacity: up ? 0 : 1 }); - hs.extend(to.wrapper, { opacity: up }); - } - hs.animate( this.wrapper, to.wrapper, { - duration: dur, - easing: easing, - step: function(val, args) { - if (exp.outline && exp.outlineWhileAnimating && args.prop == 'top') { - var fac = up ? args.pos : 1 - args.pos; - var pos = { - w: x.t + (x.get('wsize') - x.t) * fac, - h: y.t + (y.get('wsize') - y.t) * fac, - x: x.tpos + (x.pos - x.tpos) * fac, - y: y.tpos + (y.pos - y.tpos) * fac - }; - exp.outline.setPosition(pos, 0, 1); - } - } - }); - hs.animate( this.content, to.content, dur, easing, after); - if (up) { - this.wrapper.style.visibility = 'visible'; - this.content.style.visibility = 'visible'; - this.a.className += ' highslide-active-anchor'; - } -}, - - - - -afterExpand : function() { - this.isExpanded = true; - this.focus(); - if (hs.upcoming && hs.upcoming == this.a) hs.upcoming = null; - this.prepareNextOutline(); - var p = hs.page, mX = hs.mouse.x + p.scrollLeft, mY = hs.mouse.y + p.scrollTop; - this.mouseIsOver = this.x.pos < mX && mX < this.x.pos + this.x.get('wsize') - && this.y.pos < mY && mY < this.y.pos + this.y.get('wsize'); - if (this.overlayBox) this.showOverlays(); - -}, - - -prepareNextOutline : function() { - var key = this.key; - var outlineType = this.outlineType; - new hs.Outline(outlineType, - function () { try { hs.expanders[key].preloadNext(); } catch (e) {} }); -}, - - -preloadNext : function() { - var next = this.getAdjacentAnchor(1); - if (next && next.onclick.toString().match(/hs\.expand/)) - var img = hs.createElement('img', { src: hs.getSrc(next) }); -}, - - -getAdjacentAnchor : function(op) { - var current = this.getAnchorIndex(), as = hs.anchors.groups[this.slideshowGroup || 'none']; - return (as && as[current + op]) || null; -}, - -getAnchorIndex : function() { - var arr = hs.getAnchors().groups[this.slideshowGroup || 'none']; - if (arr) for (var i = 0; i < arr.length; i++) { - if (arr[i] == this.a) return i; - } - return null; -}, - - -cancelLoading : function() { - hs.discardElement (this.wrapper); - hs.expanders[this.key] = null; - if (this.loading) hs.loading.style.left = '-9999px'; -}, - -writeCredits : function () { - this.credits = hs.createElement('a', { - href: hs.creditsHref, - target: hs.creditsTarget, - className: 'highslide-credits', - innerHTML: hs.lang.creditsText, - title: hs.lang.creditsTitle - }); - this.createOverlay({ - overlayId: this.credits, - position: this.creditsPosition || 'top left' - }); -}, - -getInline : function(types, addOverlay) { - for (var i = 0; i < types.length; i++) { - var type = types[i], s = null; - if (!this[type +'Id'] && this.thumbsUserSetId) - this[type +'Id'] = type +'-for-'+ this.thumbsUserSetId; - if (this[type +'Id']) this[type] = hs.getNode(this[type +'Id']); - if (!this[type] && !this[type +'Text'] && this[type +'Eval']) try { - s = eval(this[type +'Eval']); - } catch (e) {} - if (!this[type] && this[type +'Text']) { - s = this[type +'Text']; - } - if (!this[type] && !s) { - this[type] = hs.getNode(this.a['_'+ type + 'Id']); - if (!this[type]) { - var next = this.a.nextSibling; - while (next && !hs.isHsAnchor(next)) { - if ((new RegExp('highslide-'+ type)).test(next.className || null)) { - if (!next.id) this.a['_'+ type + 'Id'] = next.id = 'hsId'+ hs.idCounter++; - this[type] = hs.getNode(next.id); - break; - } - next = next.nextSibling; - } - } - } - - if (!this[type] && s) this[type] = hs.createElement('div', - { className: 'highslide-'+ type, innerHTML: s } ); - - if (addOverlay && this[type]) { - var o = { position: (type == 'heading') ? 'above' : 'below' }; - for (var x in this[type+'Overlay']) o[x] = this[type+'Overlay'][x]; - o.overlayId = this[type]; - this.createOverlay(o); - } - } -}, - - -// on end move and resize -doShowHide : function(visibility) { - if (hs.hideSelects) this.showHideElements('SELECT', visibility); - if (hs.hideIframes) this.showHideElements('IFRAME', visibility); - if (hs.geckoMac) this.showHideElements('*', visibility); -}, -showHideElements : function (tagName, visibility) { - var els = document.getElementsByTagName(tagName); - var prop = tagName == '*' ? 'overflow' : 'visibility'; - for (var i = 0; i < els.length; i++) { - if (prop == 'visibility' || (document.defaultView.getComputedStyle( - els[i], "").getPropertyValue('overflow') == 'auto' - || els[i].getAttribute('hidden-by') != null)) { - var hiddenBy = els[i].getAttribute('hidden-by'); - if (visibility == 'visible' && hiddenBy) { - hiddenBy = hiddenBy.replace('['+ this.key +']', ''); - els[i].setAttribute('hidden-by', hiddenBy); - if (!hiddenBy) els[i].style[prop] = els[i].origProp; - } else if (visibility == 'hidden') { // hide if behind - var elPos = hs.getPosition(els[i]); - elPos.w = els[i].offsetWidth; - elPos.h = els[i].offsetHeight; - - - var clearsX = (elPos.x + elPos.w < this.x.get('opos') - || elPos.x > this.x.get('opos') + this.x.get('osize')); - var clearsY = (elPos.y + elPos.h < this.y.get('opos') - || elPos.y > this.y.get('opos') + this.y.get('osize')); - var wrapperKey = hs.getWrapperKey(els[i]); - if (!clearsX && !clearsY && wrapperKey != this.key) { // element falls behind image - if (!hiddenBy) { - els[i].setAttribute('hidden-by', '['+ this.key +']'); - els[i].origProp = els[i].style[prop]; - els[i].style[prop] = 'hidden'; - - } else if (hiddenBy.indexOf('['+ this.key +']') == -1) { - els[i].setAttribute('hidden-by', hiddenBy + '['+ this.key +']'); - } - } else if ((hiddenBy == '['+ this.key +']' || hs.focusKey == wrapperKey) - && wrapperKey != this.key) { // on move - els[i].setAttribute('hidden-by', ''); - els[i].style[prop] = els[i].origProp || ''; - } else if (hiddenBy && hiddenBy.indexOf('['+ this.key +']') > -1) { - els[i].setAttribute('hidden-by', hiddenBy.replace('['+ this.key +']', '')); - } - - } - } - } -}, - -focus : function() { - this.wrapper.style.zIndex = hs.zIndexCounter += 2; - // blur others - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && i == hs.focusKey) { - var blurExp = hs.expanders[i]; - blurExp.content.className += ' highslide-'+ blurExp.contentType +'-blur'; - blurExp.content.style.cursor = hs.ieLt7 ? 'hand' : 'pointer'; - blurExp.content.title = hs.lang.focusTitle; - } - } - - // focus this - if (this.outline) this.outline.table.style.zIndex - = this.wrapper.style.zIndex - 1; - this.content.className = 'highslide-'+ this.contentType; - this.content.title = hs.lang.restoreTitle; - - if (hs.restoreCursor) { - hs.styleRestoreCursor = window.opera ? 'pointer' : 'url('+ hs.graphicsDir + hs.restoreCursor +'), pointer'; - if (hs.ieLt7 && hs.uaVersion < 6) hs.styleRestoreCursor = 'hand'; - this.content.style.cursor = hs.styleRestoreCursor; - } - - hs.focusKey = this.key; - hs.addEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); -}, -moveTo: function(x, y) { - this.x.setPos(x); - this.y.setPos(y); -}, -resize : function (e) { - var w, h, r = e.width / e.height; - w = Math.max(e.width + e.dX, Math.min(this.minWidth, this.x.full)); - if (this.isImage && Math.abs(w - this.x.full) < 12) w = this.x.full; - h = w / r; - if (h < Math.min(this.minHeight, this.y.full)) { - h = Math.min(this.minHeight, this.y.full); - if (this.isImage) w = h * r; - } - this.resizeTo(w, h); -}, -resizeTo: function(w, h) { - this.y.setSize(h); - this.x.setSize(w); - this.wrapper.style.height = this.y.get('wsize') +'px'; -}, - -close : function() { - if (this.isClosing || !this.isExpanded) return; - this.isClosing = true; - - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - - try { - this.content.style.cursor = 'default'; - this.changeSize( - 0, { - wrapper: { - width : this.x.t, - height : this.y.t, - left: this.x.tpos - this.x.cb + this.x.tb, - top: this.y.tpos - this.y.cb + this.y.tb - }, - content: { - left: 0, - top: 0, - width: this.x.t, - height: this.y.t - } - }, hs.restoreDuration - ); - } catch (e) { this.afterClose(); } -}, - -createOverlay : function (o) { - var el = o.overlayId; - if (typeof el == 'string') el = hs.getNode(el); - if (o.html) el = hs.createElement('div', { innerHTML: o.html }); - if (!el || typeof el == 'string') return; - el.style.display = 'block'; - this.genOverlayBox(); - var width = o.width && /^[0-9]+(px|%)$/.test(o.width) ? o.width : 'auto'; - if (/^(left|right)panel$/.test(o.position) && !/^[0-9]+px$/.test(o.width)) width = '200px'; - var overlay = hs.createElement( - 'div', { - id: 'hsId'+ hs.idCounter++, - hsId: o.hsId - }, { - position: 'absolute', - visibility: 'hidden', - width: width, - direction: hs.lang.cssDirection || '', - opacity: 0 - },this.overlayBox, - true - ); - - overlay.appendChild(el); - hs.extend(overlay, { - opacity: 1, - offsetX: 0, - offsetY: 0, - dur: (o.fade === 0 || o.fade === false || (o.fade == 2 && hs.ie)) ? 0 : 250 - }); - hs.extend(overlay, o); - - - if (this.gotOverlays) { - this.positionOverlay(overlay); - if (!overlay.hideOnMouseOut || this.mouseIsOver) - hs.animate(overlay, { opacity: overlay.opacity }, overlay.dur); - } - hs.push(this.overlays, hs.idCounter - 1); -}, -positionOverlay : function(overlay) { - var p = overlay.position || 'middle center', - offX = overlay.offsetX, - offY = overlay.offsetY; - if (overlay.parentNode != this.overlayBox) this.overlayBox.appendChild(overlay); - if (/left$/.test(p)) overlay.style.left = offX +'px'; - - if (/center$/.test(p)) hs.setStyles (overlay, { - left: '50%', - marginLeft: (offX - Math.round(overlay.offsetWidth / 2)) +'px' - }); - - if (/right$/.test(p)) overlay.style.right = - offX +'px'; - - if (/^leftpanel$/.test(p)) { - hs.setStyles(overlay, { - right: '100%', - marginRight: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p1 = overlay.offsetWidth; - - } else if (/^rightpanel$/.test(p)) { - hs.setStyles(overlay, { - left: '100%', - marginLeft: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p2 = overlay.offsetWidth; - } - - if (/^top/.test(p)) overlay.style.top = offY +'px'; - if (/^middle/.test(p)) hs.setStyles (overlay, { - top: '50%', - marginTop: (offY - Math.round(overlay.offsetHeight / 2)) +'px' - }); - if (/^bottom/.test(p)) overlay.style.bottom = - offY +'px'; - if (/^above$/.test(p)) { - hs.setStyles(overlay, { - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - bottom: '100%', - marginBottom: this.y.cb +'px', - width: 'auto' - }); - this.y.p1 = overlay.offsetHeight; - - } else if (/^below$/.test(p)) { - hs.setStyles(overlay, { - position: 'relative', - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - top: '100%', - marginTop: this.y.cb +'px', - width: 'auto' - }); - this.y.p2 = overlay.offsetHeight; - overlay.style.position = 'absolute'; - } -}, - -getOverlays : function() { - this.getInline(['heading', 'caption'], true); - if (this.heading && this.dragByHeading) this.heading.className += ' highslide-move'; - if (hs.showCredits) this.writeCredits(); - for (var i = 0; i < hs.overlays.length; i++) { - var o = hs.overlays[i], tId = o.thumbnailId, sg = o.slideshowGroup; - if ((!tId && !sg) || (tId && tId == this.thumbsUserSetId) - || (sg && sg === this.slideshowGroup)) { - this.createOverlay(o); - } - } - var os = []; - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - if (/panel$/.test(o.position)) this.positionOverlay(o); - else hs.push(os, o); - } - for (var i = 0; i < os.length; i++) this.positionOverlay(os[i]); - this.gotOverlays = true; -}, -genOverlayBox : function() { - if (!this.overlayBox) this.overlayBox = hs.createElement ( - 'div', { - className: this.wrapperClassName - }, { - position : 'absolute', - width: (this.x.size || (this.useBox ? this.width : null) - || this.x.full) +'px', - height: (this.y.size || this.y.full) +'px', - visibility : 'hidden', - overflow : 'hidden', - zIndex : hs.ie ? 4 : 'auto' - }, - hs.container, - true - ); -}, -sizeOverlayBox : function(doWrapper, doPanels) { - var overlayBox = this.overlayBox, - x = this.x, - y = this.y; - hs.setStyles( overlayBox, { - width: x.size +'px', - height: y.size +'px' - }); - if (doWrapper || doPanels) { - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - var ie6 = (hs.ieLt7 || document.compatMode == 'BackCompat'); - if (o && /^(above|below)$/.test(o.position)) { - if (ie6) { - o.style.width = (overlayBox.offsetWidth + 2 * x.cb - + x.p1 + x.p2) +'px'; - } - y[o.position == 'above' ? 'p1' : 'p2'] = o.offsetHeight; - } - if (o && ie6 && /^(left|right)panel$/.test(o.position)) { - o.style.height = (overlayBox.offsetHeight + 2* y.cb) +'px'; - } - } - } - if (doWrapper) { - hs.setStyles(this.content, { - top: y.p1 +'px' - }); - hs.setStyles(overlayBox, { - top: (y.p1 + y.cb) +'px' - }); - } -}, - -showOverlays : function() { - var b = this.overlayBox; - b.className = ''; - hs.setStyles(b, { - top: (this.y.p1 + this.y.cb) +'px', - left: (this.x.p1 + this.x.cb) +'px', - overflow : 'visible' - }); - if (hs.safari) b.style.visibility = 'visible'; - this.wrapper.appendChild (b); - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - o.style.zIndex = o.zIndex || 4; - if (!o.hideOnMouseOut || this.mouseIsOver) { - o.style.visibility = 'visible'; - hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: o.opacity }, o.dur); - } - } -}, - -destroyOverlays : function() { - if (!this.overlays.length) return; - hs.discardElement(this.overlayBox); -}, - - - -createFullExpand : function () { - this.fullExpandLabel = hs.createElement( - 'a', { - href: 'javascript:hs.expanders['+ this.key +'].doFullExpand();', - title: hs.lang.fullExpandTitle, - className: 'highslide-full-expand' - } - ); - - this.createOverlay({ - overlayId: this.fullExpandLabel, - position: hs.fullExpandPosition, - hideOnMouseOut: true, - opacity: hs.fullExpandOpacity - }); -}, - -doFullExpand : function () { - try { - if (this.fullExpandLabel) hs.discardElement(this.fullExpandLabel); - - this.focus(); - var xSize = this.x.size, - ySize = this.y.size; - this.resizeTo(this.x.full, this.y.full); - - var xpos = this.x.pos - (this.x.size - xSize) / 2; - if (xpos < hs.marginLeft) xpos = hs.marginLeft; - - var ypos = this.y.pos - (this.y.size - ySize) / 2; - if (ypos < hs.marginTop) ypos = hs.marginTop; - - this.moveTo(xpos, ypos); - this.doShowHide('hidden'); - - } catch (e) { - this.error(e); - } -}, - - -afterClose : function () { - this.a.className = this.a.className.replace('highslide-active-anchor', ''); - - this.doShowHide('visible'); - if (this.outline && this.outlineWhileAnimating) this.outline.destroy(); - - hs.discardElement(this.wrapper); - - hs.expanders[this.key] = null; - hs.reOrder(); -} - -}; -hs.langDefaults = hs.lang; -// history -var HsExpander = hs.Expander; -if (hs.ie && window == window.top) { - (function () { - try { - document.documentElement.doScroll('left'); - } catch (e) { - setTimeout(arguments.callee, 50); - return; - } - hs.ready(); - })(); -} -hs.addEventListener(document, 'DOMContentLoaded', hs.ready); -hs.addEventListener(window, 'load', hs.ready); - -// set handlers -hs.addEventListener(document, 'ready', function() { - if (hs.expandCursor) { - var style = hs.createElement('style', { type: 'text/css' }, null, - document.getElementsByTagName('HEAD')[0]), - backCompat = document.compatMode == 'BackCompat'; - - - function addRule(sel, dec) { - if (hs.ie && (hs.uaVersion < 9 || backCompat)) { - var last = document.styleSheets[document.styleSheets.length - 1]; - if (typeof(last.addRule) == "object") last.addRule(sel, dec); - } else { - style.appendChild(document.createTextNode(sel + " {" + dec + "}")); - } - } - function fix(prop) { - return 'expression( ( ( ignoreMe = document.documentElement.'+ prop + - ' ? document.documentElement.'+ prop +' : document.body.'+ prop +' ) ) + \'px\' );'; - } - if (hs.expandCursor) addRule ('.highslide img', - 'cursor: url('+ hs.graphicsDir + hs.expandCursor +'), pointer !important;'); - } -}); -hs.addEventListener(window, 'resize', function() { - hs.getPageSize(); -}); -hs.addEventListener(document, 'mousemove', function(e) { - hs.mouse = { x: e.clientX, y: e.clientY }; -}); -hs.addEventListener(document, 'mousedown', hs.mouseClickHandler); -hs.addEventListener(document, 'mouseup', hs.mouseClickHandler); - -hs.addEventListener(document, 'ready', hs.getAnchors); -hs.addEventListener(window, 'load', hs.preloadImages); -} diff --git a/DeveloperAdoption/public/static/highslide/highslide/highslide.min.js b/DeveloperAdoption/public/static/highslide/highslide/highslide.min.js deleted file mode 100644 index 2437ab7..0000000 --- a/DeveloperAdoption/public/static/highslide/highslide/highslide.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Name: Highslide JS - * Version: 4.1.13 (2011-10-06) - * Config: default - * Author: Torstein Hønsi - * Support: www.highslide.com/support - * License: www.highslide.com/#license - */ -if(!hs){var hs={lang:{cssDirection:"ltr",loadingText:"Loading...",loadingTitle:"Click to cancel",focusTitle:"Click to bring to front",fullExpandTitle:"Expand to actual size (f)",creditsText:"Powered by Highslide JS",creditsTitle:"Go to the Highslide JS homepage",restoreTitle:"Click to close image, click and drag to move. Use arrow keys for next and previous."},graphicsDir:"highslide/graphics/",expandCursor:"zoomin.cur",restoreCursor:"zoomout.cur",expandDuration:250,restoreDuration:250,marginLeft:15,marginRight:15,marginTop:15,marginBottom:15,zIndexCounter:1001,loadingOpacity:0.75,allowMultipleInstances:true,numberOfImagesToPreload:5,outlineWhileAnimating:2,outlineStartOffset:3,padToMinWidth:false,fullExpandPosition:"bottom right",fullExpandOpacity:1,showCredits:true,creditsHref:"http://highslide.com/",creditsTarget:"_self",enableKeyListener:true,openerTagNames:["a"],dragByHeading:true,minWidth:200,minHeight:200,allowSizeReduction:true,outlineType:"drop-shadow",preloadTheseImages:[],continuePreloading:true,expanders:[],overrides:["allowSizeReduction","useBox","outlineType","outlineWhileAnimating","captionId","captionText","captionEval","captionOverlay","headingId","headingText","headingEval","headingOverlay","creditsPosition","dragByHeading","width","height","wrapperClassName","minWidth","minHeight","maxWidth","maxHeight","pageOrigin","slideshowGroup","easing","easingClose","fadeInOut","src"],overlays:[],idCounter:0,oPos:{x:["leftpanel","left","center","right","rightpanel"],y:["above","top","middle","bottom","below"]},mouse:{},headingOverlay:{},captionOverlay:{},timers:[],pendingOutlines:{},clones:{},onReady:[],uaVersion:/Trident\/4\.0/.test(navigator.userAgent)?8:parseFloat((navigator.userAgent.toLowerCase().match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1]),ie:(document.all&&!window.opera),safari:/Safari/.test(navigator.userAgent),geckoMac:/Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent),$:function(a){if(a){return document.getElementById(a)}},push:function(a,b){a[a.length]=b},createElement:function(a,f,e,d,c){var b=document.createElement(a);if(f){hs.extend(b,f)}if(c){hs.setStyles(b,{padding:0,border:"none",margin:0})}if(e){hs.setStyles(b,e)}if(d){d.appendChild(b)}return b},extend:function(b,c){for(var a in c){b[a]=c[a]}return b},setStyles:function(b,c){for(var a in c){if(hs.ieLt9&&a=="opacity"){if(c[a]>0.99){b.style.removeAttribute("filter")}else{b.style.filter="alpha(opacity="+(c[a]*100)+")"}}else{b.style[a]=c[a]}}},animate:function(f,a,d){var c,g,j;if(typeof d!="object"||d===null){var i=arguments;d={duration:i[2],easing:i[3],complete:i[4]}}if(typeof d.duration!="number"){d.duration=250}d.easing=Math[d.easing]||Math.easeInQuad;d.curAnim=hs.extend({},a);for(var b in a){var h=new hs.fx(f,d,b);c=parseFloat(hs.css(f,b))||0;g=parseFloat(a[b]);j=b!="opacity"?"px":"";h.custom(c,g,j)}},css:function(a,c){if(a.style[c]){return a.style[c]}else{if(document.defaultView){return document.defaultView.getComputedStyle(a,null).getPropertyValue(c)}else{if(c=="opacity"){c="filter"}var b=a.currentStyle[c.replace(/\-(\w)/g,function(e,d){return d.toUpperCase()})];if(c=="filter"){b=b.replace(/alpha\(opacity=([0-9]+)\)/,function(e,d){return d/100})}return b===""?1:b}}},getPageSize:function(){var f=document,b=window,e=f.compatMode&&f.compatMode!="BackCompat"?f.documentElement:f.body,g=hs.ie&&(hs.uaVersion<9||typeof pageXOffset=="undefined");var c=g?e.clientWidth:(f.documentElement.clientWidth||self.innerWidth),a=g?e.clientHeight:self.innerHeight;hs.page={width:c,height:a,scrollLeft:g?e.scrollLeft:pageXOffset,scrollTop:g?e.scrollTop:pageYOffset};return hs.page},getPosition:function(a){var b={x:a.offsetLeft,y:a.offsetTop};while(a.offsetParent){a=a.offsetParent;b.x+=a.offsetLeft;b.y+=a.offsetTop;if(a!=document.body&&a!=document.documentElement){b.x-=a.scrollLeft;b.y-=a.scrollTop}}return b},expand:function(b,g,d,c){if(!b){b=hs.createElement("a",null,{display:"none"},hs.container)}if(typeof b.getParams=="function"){return g}try{new hs.Expander(b,g,d);return false}catch(f){return true}},focusTopmost:function(){var c=0,b=-1,a=hs.expanders,e,f;for(var d=0;dc){c=f;b=d}}}if(b==-1){hs.focusKey=-1}else{a[b].focus()}},getParam:function(b,d){b.getParams=b.onclick;var c=b.getParams?b.getParams():null;b.getParams=null;return(c&&typeof c[d]!="undefined")?c[d]:(typeof hs[d]!="undefined"?hs[d]:null)},getSrc:function(b){var c=hs.getParam(b,"src");if(c){return c}return b.href},getNode:function(e){var c=hs.$(e),d=hs.clones[e],b={};if(!c&&!d){return null}if(!d){d=c.cloneNode(true);d.id="";hs.clones[e]=d;return c}else{return d.cloneNode(true)}},discardElement:function(a){if(a){hs.garbageBin.appendChild(a)}hs.garbageBin.innerHTML=""},transit:function(a,d){var b=d||hs.getExpander();d=b;if(hs.upcoming){return false}else{hs.last=b}hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler);try{hs.upcoming=a;a.onclick()}catch(c){hs.last=hs.upcoming=null}try{d.close()}catch(c){}return false},previousOrNext:function(a,c){var b=hs.getExpander(a);if(b){return hs.transit(b.getAdjacentAnchor(c),b)}else{return false}},previous:function(a){return hs.previousOrNext(a,-1)},next:function(a){return hs.previousOrNext(a,1)},keyHandler:function(a){if(!a){a=window.event}if(!a.target){a.target=a.srcElement}if(typeof a.target.form!="undefined"){return true}var b=hs.getExpander();var c=null;switch(a.keyCode){case 70:if(b){b.doFullExpand()}return true;case 32:case 34:case 39:case 40:c=1;break;case 8:case 33:case 37:case 38:c=-1;break;case 27:case 13:c=0}if(c!==null){hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler);if(!hs.enableKeyListener){return true}if(a.preventDefault){a.preventDefault()}else{a.returnValue=false}if(b){if(c==0){b.close()}else{hs.previousOrNext(b.key,c)}return false}}return true},registerOverlay:function(a){hs.push(hs.overlays,hs.extend(a,{hsId:"hsId"+hs.idCounter++}))},getWrapperKey:function(c,b){var e,d=/^highslide-wrapper-([0-9]+)$/;e=c;while(e.parentNode){if(e.id&&d.test(e.id)){return e.id.replace(d,"$1")}e=e.parentNode}if(!b){e=c;while(e.parentNode){if(e.tagName&&hs.isHsAnchor(e)){for(var a=0;a1){return true}if(!d.target){d.target=d.srcElement}var b=d.target;while(b.parentNode&&!(/highslide-(image|move|html|resize)/.test(b.className))){b=b.parentNode}var f=hs.getExpander(b);if(f&&(f.isClosing||!f.isExpanded)){return true}if(f&&d.type=="mousedown"){if(d.target.form){return true}var a=b.className.match(/highslide-(image|move|resize)/);if(a){hs.dragArgs={exp:f,type:a[1],left:f.x.pos,width:f.x.size,top:f.y.pos,height:f.y.size,clickX:d.clientX,clickY:d.clientY};hs.addEventListener(document,"mousemove",hs.dragHandler);if(d.preventDefault){d.preventDefault()}if(/highslide-(image|html)-blur/.test(f.content.className)){f.focus();hs.hasFocused=true}return false}}else{if(d.type=="mouseup"){hs.removeEventListener(document,"mousemove",hs.dragHandler);if(hs.dragArgs){if(hs.styleRestoreCursor&&hs.dragArgs.type=="image"){hs.dragArgs.exp.content.style.cursor=hs.styleRestoreCursor}var c=hs.dragArgs.hasDragged;if(!c&&!hs.hasFocused&&!/(move|resize)/.test(hs.dragArgs.type)){f.close()}else{if(c||(!c&&hs.hasHtmlExpanders)){hs.dragArgs.exp.doShowHide("hidden")}}hs.hasFocused=false;hs.dragArgs=null}else{if(/highslide-image-blur/.test(b.className)){b.style.cursor=hs.styleRestoreCursor}}}}return false},dragHandler:function(c){if(!hs.dragArgs){return true}if(!c){c=window.event}var b=hs.dragArgs,d=b.exp;b.dX=c.clientX-b.clickX;b.dY=c.clientY-b.clickY;var f=Math.sqrt(Math.pow(b.dX,2)+Math.pow(b.dY,2));if(!b.hasDragged){b.hasDragged=(b.type!="image"&&f>0)||(f>(hs.dragSensitivity||5))}if(b.hasDragged&&c.clientX>5&&c.clientY>5){if(b.type=="resize"){d.resize(b)}else{d.moveTo(b.left+b.dX,b.top+b.dY);if(b.type=="image"){d.content.style.cursor="move"}}}return false},wrapperMouseHandler:function(c){try{if(!c){c=window.event}var b=/mouseover/i.test(c.type);if(!c.target){c.target=c.srcElement}if(!c.relatedTarget){c.relatedTarget=b?c.fromElement:c.toElement}var d=hs.getExpander(c.target);if(!d.isExpanded){return}if(!d||!c.relatedTarget||hs.getExpander(c.relatedTarget,true)==d||hs.dragArgs){return}for(var a=0;a=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var a=true;for(var b in this.options.curAnim){if(this.options.curAnim[b]!==true){a=false}}if(a){if(this.options.complete){this.options.complete.call(this.elem)}}return false}else{var e=c-this.startTime;this.state=e/this.options.duration;this.pos=this.options.easing(e,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};hs.extend(hs.fx,{step:{opacity:function(a){hs.setStyles(a.elem,{opacity:a.now})},_default:function(a){try{if(a.elem.style&&a.elem.style[a.prop]!=null){a.elem.style[a.prop]=a.now+a.unit}else{a.elem[a.prop]=a.now}}catch(b){}}}});hs.Outline=function(g,e){this.onLoad=e;this.outlineType=g;var a=hs.uaVersion,f;this.hasAlphaImageLoader=hs.ie&&hs.uaVersion<7;if(!g){if(e){e()}return}hs.init();this.table=hs.createElement("table",{cellSpacing:0},{visibility:"hidden",position:"absolute",borderCollapse:"collapse",width:0},hs.container,true);var b=hs.createElement("tbody",null,null,this.table,1);this.td=[];for(var c=0;c<=8;c++){if(c%3==0){f=hs.createElement("tr",null,{height:"auto"},b,true)}this.td[c]=hs.createElement("td",null,null,f,true);var d=c!=4?{lineHeight:0,fontSize:0}:{position:"relative"};hs.setStyles(this.td[c],d)}this.td[4].className=g+" highslide-outline";this.preloadGraphic()};hs.Outline.prototype={preloadGraphic:function(){var b=hs.graphicsDir+(hs.outlinesDir||"outlines/")+this.outlineType+".png";var a=hs.safari&&hs.uaVersion<525?hs.container:null;this.graphic=hs.createElement("img",null,{position:"absolute",top:"-9999px"},a,true);var c=this;this.graphic.onload=function(){c.onGraphicLoad()};this.graphic.src=b},onGraphicLoad:function(){var d=this.offset=this.graphic.width/4,f=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],c={height:(2*d)+"px",width:(2*d)+"px"};for(var b=0;b<=8;b++){if(f[b]){if(this.hasAlphaImageLoader){var a=(b==1||b==7)?"100%":this.graphic.width+"px";var e=hs.createElement("div",null,{width:"100%",height:"100%",position:"relative",overflow:"hidden"},this.td[b],true);hs.createElement("div",null,{filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+this.graphic.src+"')",position:"absolute",width:a,height:this.graphic.height+"px",left:(f[b][0]*d)+"px",top:(f[b][1]*d)+"px"},e,true)}else{hs.setStyles(this.td[b],{background:"url("+this.graphic.src+") "+(f[b][0]*d)+"px "+(f[b][1]*d)+"px"})}if(window.opera&&(b==3||b==5)){hs.createElement("div",null,c,this.td[b],true)}hs.setStyles(this.td[b],c)}}this.graphic=null;if(hs.pendingOutlines[this.outlineType]){hs.pendingOutlines[this.outlineType].destroy()}hs.pendingOutlines[this.outlineType]=this;if(this.onLoad){this.onLoad()}},setPosition:function(g,e,c,b,f){var d=this.exp,a=d.wrapper.style,e=e||0,g=g||{x:d.x.pos+e,y:d.y.pos+e,w:d.x.get("wsize")-2*e,h:d.y.get("wsize")-2*e};if(c){this.table.style.visibility=(g.h>=4*this.offset)?"visible":"hidden"}hs.setStyles(this.table,{left:(g.x-this.offset)+"px",top:(g.y-this.offset)+"px",width:(g.w+2*this.offset)+"px"});g.w-=2*this.offset;g.h-=2*this.offset;hs.setStyles(this.td[4],{width:g.w>=0?g.w+"px":0,height:g.h>=0?g.h+"px":0});if(this.hasAlphaImageLoader){this.td[3].style.height=this.td[5].style.height=this.td[4].style.height}},destroy:function(a){if(a){this.table.style.visibility="hidden"}else{hs.discardElement(this.table)}}};hs.Dimension=function(b,a){this.exp=b;this.dim=a;this.ucwh=a=="x"?"Width":"Height";this.wh=this.ucwh.toLowerCase();this.uclt=a=="x"?"Left":"Top";this.lt=this.uclt.toLowerCase();this.ucrb=a=="x"?"Right":"Bottom";this.rb=this.ucrb.toLowerCase();this.p1=this.p2=0};hs.Dimension.prototype={get:function(a){switch(a){case"loadingPos":return this.tpos+this.tb+(this.t-hs.loading["offset"+this.ucwh])/2;case"wsize":return this.size+2*this.cb+this.p1+this.p2;case"fitsize":return this.clientSize-this.marginMin-this.marginMax;case"maxsize":return this.get("fitsize")-2*this.cb-this.p1-this.p2;case"opos":return this.pos-(this.exp.outline?this.exp.outline.offset:0);case"osize":return this.get("wsize")+(this.exp.outline?2*this.exp.outline.offset:0);case"imgPad":return this.imgSize?Math.round((this.size-this.imgSize)/2):0}},calcBorders:function(){this.cb=(this.exp.content["offset"+this.ucwh]-this.t)/2;this.marginMax=hs["margin"+this.ucrb]},calcThumb:function(){this.t=this.exp.el[this.wh]?parseInt(this.exp.el[this.wh]):this.exp.el["offset"+this.ucwh];this.tpos=this.exp.tpos[this.dim];this.tb=(this.exp.el["offset"+this.ucwh]-this.t)/2;if(this.tpos==0||this.tpos==-1){this.tpos=(hs.page[this.wh]/2)+hs.page["scroll"+this.uclt]}},calcExpanded:function(){var a=this.exp;this.justify="auto";this.pos=this.tpos-this.cb+this.tb;if(this.maxHeight&&this.dim=="x"){a.maxWidth=Math.min(a.maxWidth||this.full,a.maxHeight*this.full/a.y.full)}this.size=Math.min(this.full,a["max"+this.ucwh]||this.full);this.minSize=a.allowSizeReduction?Math.min(a["min"+this.ucwh],this.full):this.full;if(a.isImage&&a.useBox){this.size=a[this.wh];this.imgSize=this.full}if(this.dim=="x"&&hs.padToMinWidth){this.minSize=a.minWidth}this.marginMin=hs["margin"+this.uclt];this.scroll=hs.page["scroll"+this.uclt];this.clientSize=hs.page[this.wh]},setSize:function(a){var b=this.exp;if(b.isImage&&(b.useBox||hs.padToMinWidth)){this.imgSize=a;this.size=Math.max(this.size,this.imgSize);b.content.style[this.lt]=this.get("imgPad")+"px"}else{this.size=a}b.content.style[this.wh]=a+"px";b.wrapper.style[this.wh]=this.get("wsize")+"px";if(b.outline){b.outline.setPosition()}if(this.dim=="x"&&b.overlayBox){b.sizeOverlayBox(true)}},setPos:function(a){this.pos=a;this.exp.wrapper.style[this.lt]=a+"px";if(this.exp.outline){this.exp.outline.setPosition()}}};hs.Expander=function(k,f,b,l){if(document.readyState&&hs.ie&&!hs.isReady){hs.addEventListener(document,"ready",function(){new hs.Expander(k,f,b,l)});return}this.a=k;this.custom=b;this.contentType=l||"image";this.isImage=!this.isHtml;hs.continuePreloading=false;this.overlays=[];hs.init();var m=this.key=hs.expanders.length;for(var g=0;g(this.x.imgSize||this.x.size)){this.createFullExpand();if(this.overlays.length==1){this.sizeOverlayBox()}}}this.show()}catch(c){this.error(c)}},justify:function(f,b){var g,h=f.target,e=f==this.x?"x":"y";var d=false;var a=f.exp.allowSizeReduction;f.pos=Math.round(f.pos-((f.get("wsize")-f.t)/2));if(f.posf.scroll+f.clientSize-f.marginMax){if(!b&&d&&a){f.size=Math.min(f.size,f.get(e=="y"?"fitsize":"maxsize"))}else{if(f.get("wsize")c){d=b*c;if(dthis.minHeight&&a.size>this.minWidth&&d.get("wsize")>d.get("fitsize")){d.size-=10;if(b){a.size=d.size*b}this.sizeOverlayBox(0,1);c=true}}return c},show:function(){var a=this.x,b=this.y;this.doShowHide("hidden");this.changeSize(1,{wrapper:{width:a.get("wsize"),height:b.get("wsize"),left:a.pos,top:b.pos},content:{left:a.p1+a.get("imgPad"),top:b.p1+b.get("imgPad"),width:a.imgSize||a.size,height:b.imgSize||b.size}},hs.expandDuration)},changeSize:function(b,h,c){if(this.outline&&!this.outlineWhileAnimating){if(b){this.outline.setPosition()}else{this.outline.destroy()}}if(!b){this.destroyOverlays()}var e=this,a=e.x,g=e.y,f=this.easing;if(!b){f=this.easingClose||f}var d=b?function(){if(e.outline){e.outline.table.style.visibility="visible"}setTimeout(function(){e.afterExpand()},50)}:function(){e.afterClose()};if(b){hs.setStyles(this.wrapper,{width:a.t+"px",height:g.t+"px"})}if(this.fadeInOut){hs.setStyles(this.wrapper,{opacity:b?0:1});hs.extend(h.wrapper,{opacity:b})}hs.animate(this.wrapper,h.wrapper,{duration:c,easing:f,step:function(k,i){if(e.outline&&e.outlineWhileAnimating&&i.prop=="top"){var j=b?i.pos:1-i.pos;var l={w:a.t+(a.get("wsize")-a.t)*j,h:g.t+(g.get("wsize")-g.t)*j,x:a.tpos+(a.pos-a.tpos)*j,y:g.tpos+(g.pos-g.tpos)*j};e.outline.setPosition(l,0,1)}}});hs.animate(this.content,h.content,c,f,d);if(b){this.wrapper.style.visibility="visible";this.content.style.visibility="visible";this.a.className+=" highslide-active-anchor"}},afterExpand:function(){this.isExpanded=true;this.focus();if(hs.upcoming&&hs.upcoming==this.a){hs.upcoming=null}this.prepareNextOutline();var c=hs.page,b=hs.mouse.x+c.scrollLeft,a=hs.mouse.y+c.scrollTop;this.mouseIsOver=this.x.posthis.x.get("opos")+this.x.get("osize"));var g=(k.y+k.hthis.y.get("opos")+this.y.get("osize"));var d=hs.getWrapperKey(e[f]);if(!j&&!g&&d!=this.key){if(!h){e[f].setAttribute("hidden-by","["+this.key+"]");e[f].origProp=e[f].style[a];e[f].style[a]="hidden"}else{if(h.indexOf("["+this.key+"]")==-1){e[f].setAttribute("hidden-by",h+"["+this.key+"]")}}}else{if((h=="["+this.key+"]"||hs.focusKey==d)&&d!=this.key){e[f].setAttribute("hidden-by","");e[f].style[a]=e[f].origProp||""}else{if(h&&h.indexOf("["+this.key+"]")>-1){e[f].setAttribute("hidden-by",h.replace("["+this.key+"]",""))}}}}}}}},focus:function(){this.wrapper.style.zIndex=hs.zIndexCounter+=2;for(var a=0;a35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q(!m){u m={1F:{8l:\'6P\',6K:\'93...\',6L:\'6b 1L 92\',7T:\'6b 1L 91 1L 8Z\',88:\'90 1L 94 I (f)\',8e:\'95 2t 6I 6F\',8b:\'9a 1L 98 6I 6F 97\',5V:\'6b 1L 2h 1Y, 96 6O 8Y 1L 3c. 8X 8Q 8P S 1A 6O 79.\'},47:\'1c/8O/\',4l:\'8M.6A\',3S:\'8N.6A\',84:5c,7y:5c,43:15,7J:15,48:15,7N:15,3L:8R,7g:0.75,8j:G,5U:5,2R:2,8S:3,3V:1a,7z:\'2S 2o\',7O:1,7W:G,8x:\'8W://1c.8V/\',8o:\'8U\',7e:G,5t:[\'a\'],68:G,3Y:6W,3K:6W,3N:G,1h:\'9b-9c\',3U:[],5j:G,N:[],5i:[\'3N\',\'2d\',\'1h\',\'2R\',\'9u\',\'9t\',\'9s\',\'6R\',\'9q\',\'9r\',\'9v\',\'6X\',\'89\',\'68\',\'M\',\'16\',\'60\',\'3Y\',\'3K\',\'4X\',\'5q\',\'8h\',\'3b\',\'1J\',\'85\',\'86\',\'1l\'],1v:[],3F:0,9w:{x:[\'8n\',\'18\',\'6c\',\'2o\',\'7x\'],y:[\'42\',\'W\',\'6a\',\'2S\',\'4r\']},4B:{},6X:{},6R:{},2A:[],2Q:{},6m:{},4a:[],1R:/9A\\/4\\.0/.14(3W.4V)?8:6g((3W.4V.58().2X(/.+(?:6V|9z|9y|1P)[\\/: ]([\\d.]+)/)||[0,\'0\'])[1]),1P:(L.3R&&!1n.2r),4D:/9x/.14(3W.4V),8y:/9p.+6V:1\\.[0-8].+9o/.14(3W.4V),$:A(1t){q(1t)C L.9h(1t)},2e:A(2c,2v){2c[2c.X]=2v},Z:A(6S,3a,2F,6f,6U){u B=L.Z(6S);q(3a)m.2q(B,3a);q(6U)m.T(B,{9f:0,9d:\'3r\',5h:0});q(2F)m.T(B,2F);q(6f)6f.2g(B);C B},2q:A(B,3a){S(u x 3v 3a)B[x]=3a[x];C B},T:A(B,2F){S(u x 3v 2F){q(m.2Y&&x==\'1o\'){q(2F[x]>0.99)B.F.9e(\'3P\');K B.F.3P=\'7k(1o=\'+(2F[x]*1V)+\')\'}K B.F[x]=2F[x]}},3p:A(B,Q,25){u 2O,3h,2M;q(1m 25!=\'5I\'||25===H){u 2y=87;25={2Z:2y[2],1J:2y[3],5y:2y[4]}}q(1m 25.2Z!=\'3g\')25.2Z=5c;25.1J=1d[25.1J]||1d.6Z;25.4c=m.2q({},Q);S(u 2b 3v Q){u e=1S m.1k(B,25,2b);2O=6g(m.5s(B,2b))||0;3h=6g(Q[2b]);2M=2b!=\'1o\'?\'D\':\'\';e.2z(2O,3h,2M)}},5s:A(B,Q){q(B.F[Q]){C B.F[Q]}K q(L.63){C L.63.8B(B,H).8s(Q)}K{q(Q==\'1o\')Q=\'3P\';u 2v=B.8L[Q.31(/\\-(\\w)/g,A(a,b){C b.9j()})];q(Q==\'3P\')2v=2v.31(/7k\\(1o=([0-9]+)\\)/,A(a,b){C b/1V});C 2v===\'\'?1:2v}},4N:A(){u d=L,w=1n,3D=d.5a&&d.5a!=\'5K\'?d.3i:d.4J,2Y=m.1P&&(m.1R<9||1m 71==\'1Z\');u M=2Y?3D.7j:(d.3i.7j||4H.9n),16=2Y?3D.9m:4H.9l;m.2J={M:M,16:16,4w:2Y?3D.4w:71,4y:2Y?3D.4y:9k};C m.2J},62:A(B){u p={x:B.7n,y:B.7s};3m(B.7m){B=B.7m;p.x+=B.7n;p.y+=B.7s;q(B!=L.4J&&B!=L.3i){p.x-=B.4w;p.y-=B.4y}}C p},4b:A(a,21,2z,J){q(!a)a=m.Z(\'a\',H,{3q:\'3r\'},m.20);q(1m a.3E==\'A\')C 21;1z{1S m.46(a,21,2z);C 1a}1C(e){C G}},7a:A(){u 5X=0,54=-1,N=m.N,z,1p;S(u i=0;i5X){5X=1p;54=i}}}q(54==-1)m.2u=-1;K N[54].3k()},5r:A(a,3J){a.3E=a.3x;u p=a.3E?a.3E():H;a.3E=H;C(p&&1m p[3J]!=\'1Z\')?p[3J]:(1m m[3J]!=\'1Z\'?m[3J]:H)},5l:A(a){u 1l=m.5r(a,\'1l\');q(1l)C 1l;C a.3y},3B:A(1t){u 4s=m.$(1t),2U=m.6m[1t],a={};q(!4s&&!2U)C H;q(!2U){2U=4s.7f(G);2U.1t=\'\';m.6m[1t]=2U;C 4s}K{C 2U.7f(G)}},3t:A(d){q(d)m.5k.2g(d);m.5k.3G=\'\'},74:A(66,z){u 2G=z||m.2C();z=2G;q(m.2W)C 1a;K m.2G=2G;m.3d(L,1n.2r?\'4R\':\'4T\',m.3H);1z{m.2W=66;66.3x()}1C(e){m.2G=m.2W=H}1z{z.2h()}1C(e){}C 1a},4e:A(B,1W){u z=m.2C(B);q(z)C m.74(z.5m(1W),z);K C 1a},79:A(B){C m.4e(B,-1)},1A:A(B){C m.4e(B,1)},3H:A(e){q(!e)e=1n.1G;q(!e.1M)e.1M=e.6x;q(1m e.1M.7c!=\'1Z\')C G;u z=m.2C();u 1W=H;7u(e.8F){1q 70:q(z)z.5M();C G;1q 32:1q 34:1q 39:1q 40:1W=1;6r;1q 8:1q 33:1q 37:1q 38:1W=-1;6r;1q 27:1q 13:1W=0}q(1W!==H){m.3d(L,1n.2r?\'4R\':\'4T\',m.3H);q(!m.7e)C G;q(e.4F)e.4F();K e.8E=1a;q(z){q(1W==0){z.2h()}K{m.4e(z.R,1W)}C 1a}}C G},8G:A(O){m.2e(m.1v,m.2q(O,{2a:\'2a\'+m.3F++}))},65:A(6l,4u){u B,30=/^1c-V-([0-9]+)$/;B=6l;3m(B.2V){q(B.1t&&30.14(B.1t))C B.1t.31(30,"$1");B=B.2V}q(!4u){B=6l;3m(B.2V){q(B.4g&&m.4E(B)){S(u R=0;R1)C G;q(!e.1M)e.1M=e.6x;u B=e.1M;3m(B.2V&&!(/1c-(1Y|3c|4Z|2T)/.14(B.1g))){B=B.2V}u z=m.2C(B);q(z&&(z.6k||!z.3C))C G;q(z&&e.J==\'7o\'){q(e.1M.7c)C G;u 2X=B.1g.2X(/1c-(1Y|3c|2T)/);q(2X){m.1U={z:z,J:2X[1],18:z.x.E,M:z.x.I,W:z.y.E,16:z.y.I,72:e.4z,76:e.4o};m.1D(L,\'6w\',m.6D);q(e.4F)e.4F();q(/1c-(1Y|4Z)-5W/.14(z.11.1g)){z.3k();m.6B=G}C 1a}}K q(e.J==\'7i\'){m.3d(L,\'6w\',m.6D);q(m.1U){q(m.3e&&m.1U.J==\'1Y\')m.1U.z.11.F.2N=m.3e;u 2E=m.1U.2E;q(!2E&&!m.6B&&!/(3c|2T)/.14(m.1U.J)){z.2h()}K q(2E||(!2E&&m.8C)){m.1U.z.45(\'1i\')}m.6B=1a;m.1U=H}K q(/1c-1Y-5W/.14(B.1g)){B.F.2N=m.3e}}C 1a},6D:A(e){q(!m.1U)C G;q(!e)e=1n.1G;u a=m.1U,z=a.z;a.5b=e.4z-a.72;a.6o=e.4o-a.76;u 6n=1d.a7(1d.7q(a.5b,2)+1d.7q(a.6o,2));q(!a.2E)a.2E=(a.J!=\'1Y\'&&6n>0)||(6n>(m.al||5));q(a.2E&&e.4z>5&&e.4o>5){q(a.J==\'2T\')z.2T(a);K{z.5v(a.18+a.5b,a.W+a.6o);q(a.J==\'1Y\')z.11.F.2N=\'3c\'}}C 1a},8g:A(e){1z{q(!e)e=1n.1G;u 4C=/ao/i.14(e.J);q(!e.1M)e.1M=e.6x;q(!e.4v)e.4v=4C?e.an:e.9C;u z=m.2C(e.1M);q(!z.3C)C;q(!z||!e.4v||m.2C(e.4v,G)==z||m.1U)C;S(u i=0;i=k.1w.2Z+k.5x){k.2I=k.3h;k.E=k.5E=1;k.5C();k.1w.4c[k.Q]=G;u 5z=G;S(u i 3v k.1w.4c)q(k.1w.4c[i]!==G)5z=1a;q(5z){q(k.1w.5y)k.1w.5y.77(k.1Q)}C 1a}K{u n=t-k.5x;k.5E=n/k.1w.2Z;k.E=k.1w.1J(n,0,1,k.1w.2Z);k.2I=k.2O+((k.3h-k.2O)*k.E);k.5C()}C G}};m.2q(m.1k,{2x:{1o:A(1k){m.T(1k.1Q,{1o:1k.2I})},7r:A(1k){1z{q(1k.1Q.F&&1k.1Q.F[1k.Q]!=H)1k.1Q.F[1k.Q]=1k.2I+1k.2M;K 1k.1Q[1k.Q]=1k.2I}1C(e){}}}});m.41=A(1h,2P){k.2P=2P;k.1h=1h;u v=m.1R,4Y;k.5J=m.1P&&m.1R<7;q(!1h){q(2P)2P();C}m.6y();k.28=m.Z(\'28\',{9V:0},{1b:\'1i\',1e:\'29\',9X:\'9Y\',M:0},m.20,G);u 5R=m.Z(\'5R\',H,H,k.28,1);k.1H=[];S(u i=0;i<=8;i++){q(i%3==0)4Y=m.Z(\'4Y\',H,{16:\'2l\'},5R,G);k.1H[i]=m.Z(\'1H\',H,H,4Y,G);u F=i!=4?{9Z:0,aF:0}:{1e:\'6j\'};m.T(k.1H[i],F)}k.1H[4].1g=1h+\' 1c-19\';k.7t()};m.41.53={7t:A(){u 1l=m.47+(m.9K||"9O/")+k.1h+".9N";u 6T=m.4D&&m.1R<7v?m.20:H;k.2k=m.Z(\'1f\',H,{1e:\'29\',W:\'-3X\'},6T,G);u 6E=k;k.2k.4S=A(){6E.6N()};k.2k.1l=1l},6N:A(){u o=k.1j=k.2k.M/4,E=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],1x={16:(2*o)+\'D\',M:(2*o)+\'D\'};S(u i=0;i<=8;i++){q(E[i]){q(k.5J){u w=(i==1||i==7)?\'1V%\':k.2k.M+\'D\';u 1O=m.Z(\'1O\',H,{M:\'1V%\',16:\'1V%\',1e:\'6j\',2L:\'1i\'},k.1H[i],G);m.Z(\'1O\',H,{3P:"a0:9U.9W.a1(a8=9I, 1l=\'"+k.2k.1l+"\')",1e:\'29\',M:w,16:k.2k.16+\'D\',18:(E[i][0]*o)+\'D\',W:(E[i][1]*o)+\'D\'},1O,G)}K{m.T(k.1H[i],{9J:\'5T(\'+k.2k.1l+\') \'+(E[i][0]*o)+\'D \'+(E[i][1]*o)+\'D\'})}q(1n.2r&&(i==3||i==5))m.Z(\'1O\',H,1x,k.1H[i],G);m.T(k.1H[i],1x)}}k.2k=H;q(m.2Q[k.1h])m.2Q[k.1h].4q();m.2Q[k.1h]=k;q(k.2P)k.2P()},3A:A(E,1j,6H,2p,1J){u z=k.z,9E=z.V.F,1j=1j||0,E=E||{x:z.x.E+1j,y:z.y.E+1j,w:z.x.P(\'1u\')-2*1j,h:z.y.P(\'1u\')-2*1j};q(6H)k.28.F.1b=(E.h>=4*k.1j)?\'1X\':\'1i\';m.T(k.28,{18:(E.x-k.1j)+\'D\',W:(E.y-k.1j)+\'D\',M:(E.w+2*k.1j)+\'D\'});E.w-=2*k.1j;E.h-=2*k.1j;m.T(k.1H[4],{M:E.w>=0?E.w+\'D\':0,16:E.h>=0?E.h+\'D\':0});q(k.5J)k.1H[3].F.16=k.1H[5].F.16=k.1H[4].F.16},4q:A(6Y){q(6Y)k.28.F.1b=\'1i\';K m.3t(k.28)}};m.4W=A(z,1x){k.z=z;k.1x=1x;k.2D=1x==\'x\'?\'ax\':\'av\';k.2w=k.2D.58();k.3O=1x==\'x\'?\'ar\':\'au\';k.5o=k.3O.58();k.5f=1x==\'x\'?\'az\':\'aA\';k.aG=k.5f.58();k.1B=k.2f=0};m.4W.53={P:A(R){7u(R){1q\'5O\':C k.1s+k.2j+(k.t-m.1E[\'1j\'+k.2D])/2;1q\'1u\':C k.I+2*k.Y+k.1B+k.2f;1q\'3o\':C k.55-k.2K-k.4I;1q\'5G\':C k.P(\'3o\')-2*k.Y-k.1B-k.2f;1q\'3Q\':C k.E-(k.z.19?k.z.19.1j:0);1q\'64\':C k.P(\'1u\')+(k.z.19?2*k.z.19.1j:0);1q\'4h\':C k.1y?1d.56((k.I-k.1y)/2):0}},5w:A(){k.Y=(k.z.11[\'1j\'+k.2D]-k.t)/2;k.4I=m[\'5h\'+k.5f]},5g:A(){k.t=k.z.B[k.2w]?aC(k.z.B[k.2w]):k.z.B[\'1j\'+k.2D];k.1s=k.z.1s[k.1x];k.2j=(k.z.B[\'1j\'+k.2D]-k.t)/2;q(k.1s==0||k.1s==-1){k.1s=(m.2J[k.2w]/2)+m.2J[\'2B\'+k.3O]}},5B:A(){u z=k.z;k.3n=\'2l\';k.E=k.1s-k.Y+k.2j;q(k.5q&&k.1x==\'x\')z.4X=1d.22(z.4X||k.U,z.5q*k.U/z.y.U);k.I=1d.22(k.U,z[\'67\'+k.2D]||k.U);k.1T=z.3N?1d.22(z[\'22\'+k.2D],k.U):k.U;q(z.3f&&z.2d){k.I=z[k.2w];k.1y=k.U}q(k.1x==\'x\'&&m.3V)k.1T=z.3Y;k.2K=m[\'5h\'+k.3O];k.2B=m.2J[\'2B\'+k.3O];k.55=m.2J[k.2w]},6h:A(i){u z=k.z;q(z.3f&&(z.2d||m.3V)){k.1y=i;k.I=1d.67(k.I,k.1y);z.11.F[k.5o]=k.P(\'4h\')+\'D\'}K k.I=i;z.11.F[k.2w]=i+\'D\';z.V.F[k.2w]=k.P(\'1u\')+\'D\';q(z.19)z.19.3A();q(k.1x==\'x\'&&z.1r)z.35(G)},5Z:A(i){k.E=i;k.z.V.F[k.5o]=i+\'D\';q(k.z.19)k.z.19.3A()}};m.46=A(a,21,2z,26){q(L.ab&&m.1P&&!m.5n){m.1D(L,\'2H\',A(){1S m.46(a,21,2z,26)});C}k.a=a;k.2z=2z;k.26=26||\'1Y\';k.3f=!k.ak;m.5j=1a;k.1v=[];m.6y();u R=k.R=m.N.X;S(u i=0;i(k.x.1y||k.x.I)){k.8p();q(k.1v.X==1)k.35()}}k.7U()}1C(e){k.5Q(e)}},3n:A(p,3l){u a5,a3=p.1M,1x=p==k.x?\'x\':\'y\';u 5D=1a;u 3s=p.z.3N;p.E=1d.56(p.E-((p.P(\'1u\')-p.t)/2));q(p.Ep.2B+p.55-p.4I){q(!3l&&5D&&3s){p.I=1d.22(p.I,p.P(1x==\'y\'?\'3o\':\'5G\'))}K q(p.P(\'1u\')1K){ 1N=24*1K;q(1Nk.3K&&x.I>k.3Y&&y.P(\'1u\')>y.P(\'3o\')){y.I-=10;q(1K)x.I=y.I*1K;k.35(0,1);2m=G}}C 2m},7U:A(){u x=k.x,y=k.y;k.45(\'1i\');k.6e(1,{V:{M:x.P(\'1u\'),16:y.P(\'1u\'),18:x.E,W:y.E},11:{18:x.1B+x.P(\'4h\'),W:y.1B+y.P(\'4h\'),M:x.1y||x.I,16:y.1y||y.I}},m.84)},6e:A(23,1L,2p){q(k.19&&!k.2R){q(23)k.19.3A();K k.19.4q()}q(!23)k.8v();u z=k,x=z.x,y=z.y,1J=k.1J;q(!23)1J=k.85||1J;u 7A=23?A(){q(z.19)z.19.28.F.1b="1X";5S(A(){z.7B()},50)}:A(){z.5P()};q(23)m.T(k.V,{M:x.t+\'D\',16:y.t+\'D\'});q(k.86){m.T(k.V,{1o:23?0:1});m.2q(1L.V,{1o:23})}m.3p(k.V,1L.V,{2Z:2p,1J:1J,2x:A(2v,2y){q(z.19&&z.2R&&2y.Q==\'W\'){u 3I=23?2y.E:1-2y.E;u E={w:x.t+(x.P(\'1u\')-x.t)*3I,h:y.t+(y.P(\'1u\')-y.t)*3I,x:x.1s+(x.E-x.1s)*3I,y:y.1s+(y.E-y.1s)*3I};z.19.3A(E,0,1)}}});m.3p(k.11,1L.11,2p,1J,7A);q(23){k.V.F.1b=\'1X\';k.11.F.1b=\'1X\';k.a.1g+=\' 1c-7P-7Q\'}},7B:A(){k.3C=G;k.3k();q(m.2W&&m.2W==k.a)m.2W=H;k.7w();u p=m.2J,5u=m.4B.x+p.4w,5p=m.4B.y+p.4y;k.6q=k.x.E<5u&&5uk.x.P(\'3Q\')+k.x.P(\'64\'));u 7M=(2n.y+2n.hk.y.P(\'3Q\')+k.y.P(\'64\'));u 4j=m.65(17[i]);q(!7G&&!7M&&4j!=k.R){q(!1I){17[i].3T(\'1i-2t\',\'[\'+k.R+\']\');17[i].61=17[i].F[Q];17[i].F[Q]=\'1i\'}K q(1I.7L(\'[\'+k.R+\']\')==-1){17[i].3T(\'1i-2t\',1I+\'[\'+k.R+\']\')}}K q((1I==\'[\'+k.R+\']\'||m.2u==4j)&&4j!=k.R){17[i].3T(\'1i-2t\',\'\');17[i].F[Q]=17[i].61||\'\'}K q(1I&&1I.7L(\'[\'+k.R+\']\')>-1){17[i].3T(\'1i-2t\',1I.31(\'[\'+k.R+\']\',\'\'))}}}}},3k:A(){k.V.F.1p=m.3L+=2;S(u i=0;i - - - - -Highslide JS - - - - -

    Highslide JS

    - - -

    Barebones samples

    -

    Go to one of these examples and modify the code to suit your needs:

    - -

    Highslide JS core

    - - -

    With Gallery

    - - -

    With HTML

    - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/static/ie.css b/DeveloperAdoption/public/static/ie.css deleted file mode 100644 index 61a5371..0000000 --- a/DeveloperAdoption/public/static/ie.css +++ /dev/null @@ -1,36 +0,0 @@ -/* ----------------------------------------------------------------------- - - - Blueprint CSS Framework 1.0 - http://blueprintcss.org - - * Copyright (c) 2007-Present. See LICENSE for more info. - * See README for instructions on how to use Blueprint. - * For credits and origins, see AUTHORS. - * This is a compressed file. See the sources in the 'src' directory. - ------------------------------------------------------------------------ */ - -/* ie.css */ -body {text-align:center;} -.container {text-align:left;} -* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 {display:inline;overflow-x:hidden;} -* html legend {margin:0px -8px 16px 0;padding:0;} -sup {vertical-align:text-top;} -sub {vertical-align:text-bottom;} -html>body p code {*white-space:normal;} -hr {margin:-8px auto 11px;} -img {-ms-interpolation-mode:bicubic;} -.clearfix, .container {display:inline-block;} -* html .clearfix, * html .container {height:1%;} -fieldset {padding-top:0;} -legend {margin-top:-0.2em;margin-bottom:1em;margin-left:-0.5em;} -textarea {overflow:auto;} -label {vertical-align:middle;position:relative;top:-0.25em;} -input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;} -input.text:focus, input.title:focus {border-color:#666;} -input.text, input.title, textarea, select {margin:0.5em 0;} -input.checkbox, input.radio {position:relative;top:.25em;} -form.inline div, form.inline p {vertical-align:middle;} -form.inline input.checkbox, form.inline input.radio, form.inline input.button, form.inline button {margin:0.5em 0;} -button, input.button {position:relative;top:0.25em;} \ No newline at end of file diff --git a/DeveloperAdoption/public/static/images/sc-1x1.gif b/DeveloperAdoption/public/static/images/sc-1x1.gif deleted file mode 100644 index 1d9a4f5..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-1x1.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-add-2.png b/DeveloperAdoption/public/static/images/sc-add-2.png deleted file mode 100644 index 3cd3b73..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-add-2.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-aligncenter.gif b/DeveloperAdoption/public/static/images/sc-aligncenter.gif deleted file mode 100644 index 79b6eec..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-aligncenter.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-alignleft.gif b/DeveloperAdoption/public/static/images/sc-alignleft.gif deleted file mode 100644 index d84d7b6..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-alignleft.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-alignright.gif b/DeveloperAdoption/public/static/images/sc-alignright.gif deleted file mode 100644 index 9f9ac59..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-alignright.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-bordersoff.gif b/DeveloperAdoption/public/static/images/sc-bordersoff.gif deleted file mode 100644 index f1b531b..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-bordersoff.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-borderson.gif b/DeveloperAdoption/public/static/images/sc-borderson.gif deleted file mode 100644 index 8d97b89..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-borderson.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-chooserarrow.gif b/DeveloperAdoption/public/static/images/sc-chooserarrow.gif deleted file mode 100644 index b9010e2..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-chooserarrow.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-commentbg.gif b/DeveloperAdoption/public/static/images/sc-commentbg.gif deleted file mode 100644 index 0b5e17a..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-commentbg.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-copy.gif b/DeveloperAdoption/public/static/images/sc-copy.gif deleted file mode 100644 index 6ce10fb..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-copy.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-cursorinsertleft.gif b/DeveloperAdoption/public/static/images/sc-cursorinsertleft.gif deleted file mode 100644 index 03e9769..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-cursorinsertleft.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-cursorinsertup.gif b/DeveloperAdoption/public/static/images/sc-cursorinsertup.gif deleted file mode 100644 index 03e9769..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-cursorinsertup.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-cut.gif b/DeveloperAdoption/public/static/images/sc-cut.gif deleted file mode 100644 index 85e4743..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-cut.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-defaultcolor.gif b/DeveloperAdoption/public/static/images/sc-defaultcolor.gif deleted file mode 100644 index e9d69cd..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-defaultcolor.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-delete.gif b/DeveloperAdoption/public/static/images/sc-delete.gif deleted file mode 100644 index abd2582..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-delete.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-deletecol.gif b/DeveloperAdoption/public/static/images/sc-deletecol.gif deleted file mode 100644 index 1b2daab..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-deletecol.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-deleterow.gif b/DeveloperAdoption/public/static/images/sc-deleterow.gif deleted file mode 100644 index c0ad72e..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-deleterow.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-divider1.gif b/DeveloperAdoption/public/static/images/sc-divider1.gif deleted file mode 100644 index 2f3ac5b..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-divider1.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-drag-handles.gif b/DeveloperAdoption/public/static/images/sc-drag-handles.gif deleted file mode 100644 index e2ffef1..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-drag-handles.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-drag-handles.png b/DeveloperAdoption/public/static/images/sc-drag-handles.png deleted file mode 100644 index b57b5a2..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-drag-handles.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-endcap-h.gif b/DeveloperAdoption/public/static/images/sc-endcap-h.gif deleted file mode 100644 index 900afd6..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-endcap-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-endcap-v.gif b/DeveloperAdoption/public/static/images/sc-endcap-v.gif deleted file mode 100644 index 3e6ba4f..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-endcap-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-filldown.gif b/DeveloperAdoption/public/static/images/sc-filldown.gif deleted file mode 100644 index 7f2d792..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-filldown.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-fillright.gif b/DeveloperAdoption/public/static/images/sc-fillright.gif deleted file mode 100644 index c9bc5c4..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-fillright.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-formuladialog.gif b/DeveloperAdoption/public/static/images/sc-formuladialog.gif deleted file mode 100644 index 404f991..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-formuladialog.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-insertcol.gif b/DeveloperAdoption/public/static/images/sc-insertcol.gif deleted file mode 100644 index 40ecd5f..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-insertcol.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-insertrow.gif b/DeveloperAdoption/public/static/images/sc-insertrow.gif deleted file mode 100644 index a70295e..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-insertrow.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-less-hd.gif b/DeveloperAdoption/public/static/images/sc-less-hd.gif deleted file mode 100644 index 689ebc9..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-less-hd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-less-hh.gif b/DeveloperAdoption/public/static/images/sc-less-hh.gif deleted file mode 100644 index f1d978e..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-less-hh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-less-hn.gif b/DeveloperAdoption/public/static/images/sc-less-hn.gif deleted file mode 100644 index 81245b8..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-less-hn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-less-vd.gif b/DeveloperAdoption/public/static/images/sc-less-vd.gif deleted file mode 100644 index 605801f..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-less-vd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-less-vh.gif b/DeveloperAdoption/public/static/images/sc-less-vh.gif deleted file mode 100644 index aa2de92..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-less-vh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-less-vn.gif b/DeveloperAdoption/public/static/images/sc-less-vn.gif deleted file mode 100644 index 88290ef..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-less-vn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-linkdialog.gif b/DeveloperAdoption/public/static/images/sc-linkdialog.gif deleted file mode 100644 index d206394..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-linkdialog.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-linkout.gif b/DeveloperAdoption/public/static/images/sc-linkout.gif deleted file mode 100644 index 9215def..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-linkout.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-logo.gif b/DeveloperAdoption/public/static/images/sc-logo.gif deleted file mode 100644 index b76d534..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-logo.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-main-h.gif b/DeveloperAdoption/public/static/images/sc-main-h.gif deleted file mode 100644 index 0b260ed..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-main-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-main-v.gif b/DeveloperAdoption/public/static/images/sc-main-v.gif deleted file mode 100644 index 0fb12bb..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-main-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-menu-dropdown.png b/DeveloperAdoption/public/static/images/sc-menu-dropdown.png deleted file mode 100644 index 938cee8..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-menu-dropdown.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-merge.gif b/DeveloperAdoption/public/static/images/sc-merge.gif deleted file mode 100644 index 5414251..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-merge.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-more-hd.gif b/DeveloperAdoption/public/static/images/sc-more-hd.gif deleted file mode 100644 index 2eb56e0..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-more-hd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-more-hh.gif b/DeveloperAdoption/public/static/images/sc-more-hh.gif deleted file mode 100644 index fc1059a..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-more-hh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-more-hn.gif b/DeveloperAdoption/public/static/images/sc-more-hn.gif deleted file mode 100644 index 7e07204..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-more-hn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-more-vd.gif b/DeveloperAdoption/public/static/images/sc-more-vd.gif deleted file mode 100644 index 055f4ac..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-more-vd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-more-vh.gif b/DeveloperAdoption/public/static/images/sc-more-vh.gif deleted file mode 100644 index 07acdf7..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-more-vh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-more-vn.gif b/DeveloperAdoption/public/static/images/sc-more-vn.gif deleted file mode 100644 index 922756d..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-more-vn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-movefrom.gif b/DeveloperAdoption/public/static/images/sc-movefrom.gif deleted file mode 100644 index 7f665eb..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-movefrom.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-movefromoff.gif b/DeveloperAdoption/public/static/images/sc-movefromoff.gif deleted file mode 100644 index 249fa99..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-movefromoff.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-moveinsert.gif b/DeveloperAdoption/public/static/images/sc-moveinsert.gif deleted file mode 100644 index f082171..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-moveinsert.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-moveinsertoff.gif b/DeveloperAdoption/public/static/images/sc-moveinsertoff.gif deleted file mode 100644 index 5d57594..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-moveinsertoff.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-movepaste.gif b/DeveloperAdoption/public/static/images/sc-movepaste.gif deleted file mode 100644 index 93108d1..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-movepaste.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-movepasteoff.gif b/DeveloperAdoption/public/static/images/sc-movepasteoff.gif deleted file mode 100644 index 5b919af..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-movepasteoff.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-multilinedialog.gif b/DeveloperAdoption/public/static/images/sc-multilinedialog.gif deleted file mode 100644 index 1e0d6d6..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-multilinedialog.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-paneslider-h.gif b/DeveloperAdoption/public/static/images/sc-paneslider-h.gif deleted file mode 100644 index 8cb31d4..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-paneslider-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-paneslider-v.gif b/DeveloperAdoption/public/static/images/sc-paneslider-v.gif deleted file mode 100644 index c4bcaee..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-paneslider-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-paste.gif b/DeveloperAdoption/public/static/images/sc-paste.gif deleted file mode 100644 index 1d80639..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-paste.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-pasteformats.gif b/DeveloperAdoption/public/static/images/sc-pasteformats.gif deleted file mode 100644 index 4c28a47..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-pasteformats.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-peerbg.gif b/DeveloperAdoption/public/static/images/sc-peerbg.gif deleted file mode 100644 index bef9c21..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-peerbg.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-range2.gif b/DeveloperAdoption/public/static/images/sc-range2.gif deleted file mode 100644 index e9d69cd..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-range2.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-recalc.gif b/DeveloperAdoption/public/static/images/sc-recalc.gif deleted file mode 100644 index 6e1ebb8..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-recalc.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-redo.gif b/DeveloperAdoption/public/static/images/sc-redo.gif deleted file mode 100644 index 37a6be7..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-redo.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-scrollarea-h.gif b/DeveloperAdoption/public/static/images/sc-scrollarea-h.gif deleted file mode 100644 index c12715b..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-scrollarea-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-scrollarea-v.gif b/DeveloperAdoption/public/static/images/sc-scrollarea-v.gif deleted file mode 100644 index df99311..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-scrollarea-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-sumdialog.gif b/DeveloperAdoption/public/static/images/sc-sumdialog.gif deleted file mode 100644 index f6bb9ad..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-sumdialog.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-swapcolors.gif b/DeveloperAdoption/public/static/images/sc-swapcolors.gif deleted file mode 100644 index 1139932..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-swapcolors.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-thumb-hd.gif b/DeveloperAdoption/public/static/images/sc-thumb-hd.gif deleted file mode 100644 index e3afbd2..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-thumb-hd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-thumb-hh.gif b/DeveloperAdoption/public/static/images/sc-thumb-hh.gif deleted file mode 100644 index 47237c2..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-thumb-hh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-thumb-hn.gif b/DeveloperAdoption/public/static/images/sc-thumb-hn.gif deleted file mode 100644 index a8e0f08..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-thumb-hn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-thumb-vd.gif b/DeveloperAdoption/public/static/images/sc-thumb-vd.gif deleted file mode 100644 index c900734..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-thumb-vd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-thumb-vh.gif b/DeveloperAdoption/public/static/images/sc-thumb-vh.gif deleted file mode 100644 index a3229c7..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-thumb-vh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-thumb-vn.gif b/DeveloperAdoption/public/static/images/sc-thumb-vn.gif deleted file mode 100644 index d528f43..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-thumb-vn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-trackingline-h.gif b/DeveloperAdoption/public/static/images/sc-trackingline-h.gif deleted file mode 100644 index efeff83..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-trackingline-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-trackingline-v.gif b/DeveloperAdoption/public/static/images/sc-trackingline-v.gif deleted file mode 100644 index ce6e8cb..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-trackingline-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-undo.gif b/DeveloperAdoption/public/static/images/sc-undo.gif deleted file mode 100644 index 997a24f..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-undo.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-unmerge.gif b/DeveloperAdoption/public/static/images/sc-unmerge.gif deleted file mode 100644 index a39a7e6..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-unmerge.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-wikiflag.gif b/DeveloperAdoption/public/static/images/sc-wikiflag.gif deleted file mode 100644 index caf0e3f..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-wikiflag.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/sc-wikilinkflag.gif b/DeveloperAdoption/public/static/images/sc-wikilinkflag.gif deleted file mode 100644 index 5ed3700..0000000 Binary files a/DeveloperAdoption/public/static/images/sc-wikilinkflag.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/images/spinner.gif b/DeveloperAdoption/public/static/images/spinner.gif deleted file mode 100644 index cc70a7a..0000000 Binary files a/DeveloperAdoption/public/static/images/spinner.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/imgsgraph.txt.chrome b/DeveloperAdoption/public/static/imgsgraph.txt.chrome deleted file mode 100644 index f32854a..0000000 --- a/DeveloperAdoption/public/static/imgsgraph.txt.chrome +++ /dev/null @@ -1,1091 +0,0 @@ -' - --------- - -' -1,4,4,7,5,9,10,20,30,40 - - - ---------- - - -html here - --------- -' -

    Flot Examples

    - -
    - -

    Simple example. You don't need to specify much to get an - attractive look. Put in a placeholder, make sure you set its - dimensions (otherwise the plot library will barf) and call the - plot function with the data. The axes are automatically - scaled.

    - --------- -'

    Flot Examples

    - -
    - -

    Here is an example with real data: military budgets for - various countries in constant (2005) million US dollars (source: SIPRI).

    - -

    Since all data is available client-side, it's pretty easy to - make the plot interactive. Try turning countries on/off with the - checkboxes below.

    - -

    Show:

    - - - ------------------ -

    Flot Examples

    - -
    - -

    One of the goals of Flot is to support user interactions. Try - pointing and clicking on the points.

    - -

    Mouse hovers at - (0, 0).

    - -

    A tooltip is easy to build with a bit of jQuery code and the - data returned from the plot.

    - -

    Enable tooltip

    - - ------------- -html here - ------------------- - -
    - - ----------- - -
    - - ---------------- -
    - - ---------- - -
    - ----------------- - -
    - ------------ - ------------ - -'

    Flot Examples

    - -
    - -

    Simple example. You don't need to specify much to get an - attractive look. Put in a placeholder, make sure you set its - dimensions (otherwise the plot library will barf) and call the - plot function with the data. The axes are automatically - scaled.

    - ----------- -

    hello

    - - ------- - -'Loading.. - - ---------- -Loading.. - - ---------- - -'Loading.. - - ------------- - - -$(function () { - -var dates = "B2,C2,D2,E2,F2" -var roe = "D23,E23,F23,G23,H23" -var roa = "D22,E22,F22,G22,H22" -var valsroe = SocialCalc.GetCellDataArray(roe,"dcf") -var valsroa = SocialCalc.GetCellDataArray(roa,"dcf") - -var rawdates = SocialCalc.GetCellDataArray(dates,"balance") - -var jdate = []; -var years = []; -SocialCalc.UserScriptData.dates = null -var min = 0; -if (SocialCalc.UserScriptData.dates == null) { - for (var c in rawdates) { - var d = rawdates[c] - var comps = d.split("/") - console.log(comps) - var jd = new Date(parseInt(comps[2]),parseInt(comps[0])-1,parseInt(comps[1])) - years.push(comps[2]); - var timestamp = jd.getTime() - if (min==0) { min = timestamp;} else { - if (min > timestamp) {min = timestamp;} - } - jdate.push(timestamp) - } - SocialCalc.UserScriptData.dates = jdate; -} else { - jdate = SocialCalc.UserScriptData.dates -} - - -var d1roe = [] -var d1roa = [] -var ticks = [] -for (var c in jdate) { - d1roe.push([jdate[c],valsroe[c]]) - d1roa.push([jdate[c],valsroa[c]]) - ticks.push([jdate[c],years[c]]) -} - - $.plot($("#placeholder1"), [ {data:d1roe,label:"ROE"}, - {data:d1roa, label:"ROA"} ], { - series: {stack: 0}, - xaxis: {ticks: ticks}, - ticks: ticks - }); - - - ------------------ -Highcharts example -'
    - - ----------- -
    - - - - - - - - - - - - ------------------ -Highcharts example -'
    - - ----------- - -
    - - - - - - - - - - - - diff --git a/DeveloperAdoption/public/static/jquery.flot.js b/DeveloperAdoption/public/static/jquery.flot.js deleted file mode 100644 index 6534a46..0000000 --- a/DeveloperAdoption/public/static/jquery.flot.js +++ /dev/null @@ -1,2119 +0,0 @@ -/* Javascript plotting library for jQuery, v. 0.6. - * - * Released under the MIT license by IOLA, December 2007. - * - */ - -// first an inline dependency, jquery.colorhelpers.js, we inline it here -// for convenience - -/* Plugin for jQuery for working with colors. - * - * Version 1.0. - * - * Inspiration from jQuery color animation plugin by John Resig. - * - * Released under the MIT license by Ole Laursen, October 2009. - * - * Examples: - * - * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() - * var c = $.color.extract($("#mydiv"), 'background-color'); - * console.log(c.r, c.g, c.b, c.a); - * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" - * - * Note that .scale() and .add() work in-place instead of returning - * new objects. - */ -(function(){jQuery.color={};jQuery.color.make=function(E,D,B,C){var F={};F.r=E||0;F.g=D||0;F.b=B||0;F.a=C!=null?C:1;F.add=function(I,H){for(var G=0;G=1){return"rgb("+[F.r,F.g,F.b].join(",")+")"}else{return"rgba("+[F.r,F.g,F.b,F.a].join(",")+")"}};F.normalize=function(){function G(I,J,H){return JH?H:J)}F.r=G(0,parseInt(F.r),255);F.g=G(0,parseInt(F.g),255);F.b=G(0,parseInt(F.b),255);F.a=G(0,F.a,1);return F};F.clone=function(){return jQuery.color.make(F.r,F.b,F.g,F.a)};return F.normalize()};jQuery.color.extract=function(C,B){var D;do{D=C.css(B).toLowerCase();if(D!=""&&D!="transparent"){break}C=C.parent()}while(!jQuery.nodeName(C.get(0),"body"));if(D=="rgba(0, 0, 0, 0)"){D="transparent"}return jQuery.color.parse(D)};jQuery.color.parse=function(E){var D,B=jQuery.color.make;if(D=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(E)){return B(parseInt(D[1],10),parseInt(D[2],10),parseInt(D[3],10))}if(D=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(E)){return B(parseInt(D[1],10),parseInt(D[2],10),parseInt(D[3],10),parseFloat(D[4]))}if(D=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(E)){return B(parseFloat(D[1])*2.55,parseFloat(D[2])*2.55,parseFloat(D[3])*2.55)}if(D=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(E)){return B(parseFloat(D[1])*2.55,parseFloat(D[2])*2.55,parseFloat(D[3])*2.55,parseFloat(D[4]))}if(D=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(E)){return B(parseInt(D[1],16),parseInt(D[2],16),parseInt(D[3],16))}if(D=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(E)){return B(parseInt(D[1]+D[1],16),parseInt(D[2]+D[2],16),parseInt(D[3]+D[3],16))}var C=jQuery.trim(E).toLowerCase();if(C=="transparent"){return B(255,255,255,0)}else{D=A[C];return B(D[0],D[1],D[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(); - -// the actual Flot code -(function($) { - function Plot(placeholder, data_, options_, plugins) { - // data is on the form: - // [ series1, series2 ... ] - // where series is either just the data as [ [x1, y1], [x2, y2], ... ] - // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... } - - var series = [], - options = { - // the color theme used for graphs - colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], - legend: { - show: true, - noColumns: 1, // number of colums in legend table - labelFormatter: null, // fn: string -> string - labelBoxBorderColor: "#ccc", // border color for the little label boxes - container: null, // container (as jQuery object) to put legend in, null means default on top of graph - position: "ne", // position of default legend container within plot - margin: 5, // distance from grid edge to default legend container within plot - backgroundColor: null, // null means auto-detect - backgroundOpacity: 0.85 // set to 0 to avoid background - }, - xaxis: { - mode: null, // null or "time" - transform: null, // null or f: number -> number to transform axis - inverseTransform: null, // if transform is set, this should be the inverse function - min: null, // min. value to show, null means set automatically - max: null, // max. value to show, null means set automatically - autoscaleMargin: null, // margin in % to add if auto-setting min/max - ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks - tickFormatter: null, // fn: number -> string - labelWidth: null, // size of tick labels in pixels - labelHeight: null, - - // mode specific options - tickDecimals: null, // no. of decimals, null means auto - tickSize: null, // number or [number, "unit"] - minTickSize: null, // number or [number, "unit"] - monthNames: null, // list of names of months - timeformat: null, // format string to use - twelveHourClock: false // 12 or 24 time in time mode - }, - yaxis: { - autoscaleMargin: 0.02 - }, - x2axis: { - autoscaleMargin: null - }, - y2axis: { - autoscaleMargin: 0.02 - }, - series: { - points: { - show: false, - radius: 3, - lineWidth: 2, // in pixels - fill: true, - fillColor: "#ffffff" - }, - lines: { - // we don't put in show: false so we can see - // whether lines were actively disabled - lineWidth: 2, // in pixels - fill: false, - fillColor: null, - steps: false - }, - bars: { - show: false, - lineWidth: 2, // in pixels - barWidth: 1, // in units of the x axis - fill: true, - fillColor: null, - align: "left", // or "center" - horizontal: false // when horizontal, left is now top - }, - shadowSize: 3 - }, - grid: { - show: true, - aboveData: false, - color: "#545454", // primary color used for outline and labels - backgroundColor: null, // null for transparent, else color - tickColor: "rgba(0,0,0,0.15)", // color used for the ticks - labelMargin: 5, // in pixels - borderWidth: 2, // in pixels - borderColor: null, // set if different from the grid color - markings: null, // array of ranges or fn: axes -> array of ranges - markingsColor: "#f4f4f4", - markingsLineWidth: 2, - // interactive stuff - clickable: false, - hoverable: false, - autoHighlight: true, // highlight in case mouse is near - mouseActiveRadius: 10 // how far the mouse can be away to activate an item - }, - hooks: {} - }, - canvas = null, // the canvas for the plot itself - overlay = null, // canvas for interactive stuff on top of plot - eventHolder = null, // jQuery object that events should be bound to - ctx = null, octx = null, - axes = { xaxis: {}, yaxis: {}, x2axis: {}, y2axis: {} }, - plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, - canvasWidth = 0, canvasHeight = 0, - plotWidth = 0, plotHeight = 0, - hooks = { - processOptions: [], - processRawData: [], - processDatapoints: [], - draw: [], - bindEvents: [], - drawOverlay: [] - }, - plot = this; - - // public functions - plot.setData = setData; - plot.setupGrid = setupGrid; - plot.draw = draw; - plot.getPlaceholder = function() { return placeholder; }; - plot.getCanvas = function() { return canvas; }; - plot.getPlotOffset = function() { return plotOffset; }; - plot.width = function () { return plotWidth; }; - plot.height = function () { return plotHeight; }; - plot.offset = function () { - var o = eventHolder.offset(); - o.left += plotOffset.left; - o.top += plotOffset.top; - return o; - }; - plot.getData = function() { return series; }; - plot.getAxes = function() { return axes; }; - plot.getOptions = function() { return options; }; - plot.highlight = highlight; - plot.unhighlight = unhighlight; - plot.triggerRedrawOverlay = triggerRedrawOverlay; - plot.pointOffset = function(point) { - return { left: parseInt(axisSpecToRealAxis(point, "xaxis").p2c(+point.x) + plotOffset.left), - top: parseInt(axisSpecToRealAxis(point, "yaxis").p2c(+point.y) + plotOffset.top) }; - }; - - - // public attributes - plot.hooks = hooks; - - // initialize - initPlugins(plot); - parseOptions(options_); - constructCanvas(); - setData(data_); - setupGrid(); - draw(); - bindEvents(); - - - function executeHooks(hook, args) { - args = [plot].concat(args); - for (var i = 0; i < hook.length; ++i) - hook[i].apply(this, args); - } - - function initPlugins() { - for (var i = 0; i < plugins.length; ++i) { - var p = plugins[i]; - p.init(plot); - if (p.options) - $.extend(true, options, p.options); - } - } - - function parseOptions(opts) { - $.extend(true, options, opts); - if (options.grid.borderColor == null) - options.grid.borderColor = options.grid.color; - // backwards compatibility, to be removed in future - if (options.xaxis.noTicks && options.xaxis.ticks == null) - options.xaxis.ticks = options.xaxis.noTicks; - if (options.yaxis.noTicks && options.yaxis.ticks == null) - options.yaxis.ticks = options.yaxis.noTicks; - if (options.grid.coloredAreas) - options.grid.markings = options.grid.coloredAreas; - if (options.grid.coloredAreasColor) - options.grid.markingsColor = options.grid.coloredAreasColor; - if (options.lines) - $.extend(true, options.series.lines, options.lines); - if (options.points) - $.extend(true, options.series.points, options.points); - if (options.bars) - $.extend(true, options.series.bars, options.bars); - if (options.shadowSize) - options.series.shadowSize = options.shadowSize; - - for (var n in hooks) - if (options.hooks[n] && options.hooks[n].length) - hooks[n] = hooks[n].concat(options.hooks[n]); - - executeHooks(hooks.processOptions, [options]); - } - - function setData(d) { - series = parseData(d); - fillInSeriesOptions(); - processData(); - } - - function parseData(d) { - var res = []; - for (var i = 0; i < d.length; ++i) { - var s = $.extend(true, {}, options.series); - - if (d[i].data) { - s.data = d[i].data; // move the data instead of deep-copy - delete d[i].data; - - $.extend(true, s, d[i]); - - d[i].data = s.data; - } - else - s.data = d[i]; - res.push(s); - } - - return res; - } - - function axisSpecToRealAxis(obj, attr) { - var a = obj[attr]; - if (!a || a == 1) - return axes[attr]; - if (typeof a == "number") - return axes[attr.charAt(0) + a + attr.slice(1)]; - return a; // assume it's OK - } - - function fillInSeriesOptions() { - var i; - - // collect what we already got of colors - var neededColors = series.length, - usedColors = [], - assignedColors = []; - for (i = 0; i < series.length; ++i) { - var sc = series[i].color; - if (sc != null) { - --neededColors; - if (typeof sc == "number") - assignedColors.push(sc); - else - usedColors.push($.color.parse(series[i].color)); - } - } - - // we might need to generate more colors if higher indices - // are assigned - for (i = 0; i < assignedColors.length; ++i) { - neededColors = Math.max(neededColors, assignedColors[i] + 1); - } - - // produce colors as needed - var colors = [], variation = 0; - i = 0; - while (colors.length < neededColors) { - var c; - if (options.colors.length == i) // check degenerate case - c = $.color.make(100, 100, 100); - else - c = $.color.parse(options.colors[i]); - - // vary color if needed - var sign = variation % 2 == 1 ? -1 : 1; - c.scale('rgb', 1 + sign * Math.ceil(variation / 2) * 0.2) - - // FIXME: if we're getting to close to something else, - // we should probably skip this one - colors.push(c); - - ++i; - if (i >= options.colors.length) { - i = 0; - ++variation; - } - } - - // fill in the options - var colori = 0, s; - for (i = 0; i < series.length; ++i) { - s = series[i]; - - // assign colors - if (s.color == null) { - s.color = colors[colori].toString(); - ++colori; - } - else if (typeof s.color == "number") - s.color = colors[s.color].toString(); - - // turn on lines automatically in case nothing is set - if (s.lines.show == null) { - var v, show = true; - for (v in s) - if (s[v].show) { - show = false; - break; - } - if (show) - s.lines.show = true; - } - - // setup axes - s.xaxis = axisSpecToRealAxis(s, "xaxis"); - s.yaxis = axisSpecToRealAxis(s, "yaxis"); - } - } - - function processData() { - var topSentry = Number.POSITIVE_INFINITY, - bottomSentry = Number.NEGATIVE_INFINITY, - i, j, k, m, length, - s, points, ps, x, y, axis, val, f, p; - - for (axis in axes) { - axes[axis].datamin = topSentry; - axes[axis].datamax = bottomSentry; - axes[axis].used = false; - } - - function updateAxis(axis, min, max) { - if (min < axis.datamin) - axis.datamin = min; - if (max > axis.datamax) - axis.datamax = max; - } - - for (i = 0; i < series.length; ++i) { - s = series[i]; - s.datapoints = { points: [] }; - - executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]); - } - - // first pass: clean and copy data - for (i = 0; i < series.length; ++i) { - s = series[i]; - - var data = s.data, format = s.datapoints.format; - - if (!format) { - format = []; - // find out how to copy - format.push({ x: true, number: true, required: true }); - format.push({ y: true, number: true, required: true }); - - if (s.bars.show) - format.push({ y: true, number: true, required: false, defaultValue: 0 }); - - s.datapoints.format = format; - } - - if (s.datapoints.pointsize != null) - continue; // already filled in - - if (s.datapoints.pointsize == null) - s.datapoints.pointsize = format.length; - - ps = s.datapoints.pointsize; - points = s.datapoints.points; - - insertSteps = s.lines.show && s.lines.steps; - s.xaxis.used = s.yaxis.used = true; - - for (j = k = 0; j < data.length; ++j, k += ps) { - p = data[j]; - - var nullify = p == null; - if (!nullify) { - for (m = 0; m < ps; ++m) { - val = p[m]; - f = format[m]; - - if (f) { - if (f.number && val != null) { - val = +val; // convert to number - if (isNaN(val)) - val = null; - } - - if (val == null) { - if (f.required) - nullify = true; - - if (f.defaultValue != null) - val = f.defaultValue; - } - } - - points[k + m] = val; - } - } - - if (nullify) { - for (m = 0; m < ps; ++m) { - val = points[k + m]; - if (val != null) { - f = format[m]; - // extract min/max info - if (f.x) - updateAxis(s.xaxis, val, val); - if (f.y) - updateAxis(s.yaxis, val, val); - } - points[k + m] = null; - } - } - else { - // a little bit of line specific stuff that - // perhaps shouldn't be here, but lacking - // better means... - if (insertSteps && k > 0 - && points[k - ps] != null - && points[k - ps] != points[k] - && points[k - ps + 1] != points[k + 1]) { - // copy the point to make room for a middle point - for (m = 0; m < ps; ++m) - points[k + ps + m] = points[k + m]; - - // middle point has same y - points[k + 1] = points[k - ps + 1]; - - // we've added a point, better reflect that - k += ps; - } - } - } - } - - // give the hooks a chance to run - for (i = 0; i < series.length; ++i) { - s = series[i]; - - executeHooks(hooks.processDatapoints, [ s, s.datapoints]); - } - - // second pass: find datamax/datamin for auto-scaling - for (i = 0; i < series.length; ++i) { - s = series[i]; - points = s.datapoints.points, - ps = s.datapoints.pointsize; - - var xmin = topSentry, ymin = topSentry, - xmax = bottomSentry, ymax = bottomSentry; - - for (j = 0; j < points.length; j += ps) { - if (points[j] == null) - continue; - - for (m = 0; m < ps; ++m) { - val = points[j + m]; - f = format[m]; - if (!f) - continue; - - if (f.x) { - if (val < xmin) - xmin = val; - if (val > xmax) - xmax = val; - } - if (f.y) { - if (val < ymin) - ymin = val; - if (val > ymax) - ymax = val; - } - } - } - - if (s.bars.show) { - // make sure we got room for the bar on the dancing floor - var delta = s.bars.align == "left" ? 0 : -s.bars.barWidth/2; - if (s.bars.horizontal) { - ymin += delta; - ymax += delta + s.bars.barWidth; - } - else { - xmin += delta; - xmax += delta + s.bars.barWidth; - } - } - - updateAxis(s.xaxis, xmin, xmax); - updateAxis(s.yaxis, ymin, ymax); - } - - for (axis in axes) { - if (axes[axis].datamin == topSentry) - axes[axis].datamin = null; - if (axes[axis].datamax == bottomSentry) - axes[axis].datamax = null; - } - } - - function constructCanvas() { - function makeCanvas(width, height) { - var c = document.createElement('canvas'); - c.width = width; - c.height = height; - if ($.browser.msie) // excanvas hack - c = window.G_vmlCanvasManager.initElement(c); - return c; - } - - canvasWidth = placeholder.width(); - canvasHeight = placeholder.height(); - placeholder.html(""); // clear placeholder - if (placeholder.css("position") == 'static') - placeholder.css("position", "relative"); // for positioning labels and overlay - - if (canvasWidth <= 0 || canvasHeight <= 0) - throw "Invalid dimensions for plot, width = " + canvasWidth + ", height = " + canvasHeight; - - if ($.browser.msie) // excanvas hack - window.G_vmlCanvasManager.init_(document); // make sure everything is setup - - // the canvas - canvas = $(makeCanvas(canvasWidth, canvasHeight)).appendTo(placeholder).get(0); - ctx = canvas.getContext("2d"); - - // overlay canvas for interactive features - overlay = $(makeCanvas(canvasWidth, canvasHeight)).css({ position: 'absolute', left: 0, top: 0 }).appendTo(placeholder).get(0); - octx = overlay.getContext("2d"); - octx.stroke(); - } - - function bindEvents() { - // we include the canvas in the event holder too, because IE 7 - // sometimes has trouble with the stacking order - eventHolder = $([overlay, canvas]); - - // bind events - if (options.grid.hoverable) - eventHolder.mousemove(onMouseMove); - - if (options.grid.clickable) - eventHolder.click(onClick); - - executeHooks(hooks.bindEvents, [eventHolder]); - } - - function setupGrid() { - function setTransformationHelpers(axis, o) { - function identity(x) { return x; } - - var s, m, t = o.transform || identity, - it = o.inverseTransform; - - // add transformation helpers - if (axis == axes.xaxis || axis == axes.x2axis) { - // precompute how much the axis is scaling a point - // in canvas space - s = axis.scale = plotWidth / (t(axis.max) - t(axis.min)); - m = t(axis.min); - - // data point to canvas coordinate - if (t == identity) // slight optimization - axis.p2c = function (p) { return (p - m) * s; }; - else - axis.p2c = function (p) { return (t(p) - m) * s; }; - // canvas coordinate to data point - if (!it) - axis.c2p = function (c) { return m + c / s; }; - else - axis.c2p = function (c) { return it(m + c / s); }; - } - else { - s = axis.scale = plotHeight / (t(axis.max) - t(axis.min)); - m = t(axis.max); - - if (t == identity) - axis.p2c = function (p) { return (m - p) * s; }; - else - axis.p2c = function (p) { return (m - t(p)) * s; }; - if (!it) - axis.c2p = function (c) { return m - c / s; }; - else - axis.c2p = function (c) { return it(m - c / s); }; - } - } - - function measureLabels(axis, axisOptions) { - var i, labels = [], l; - - axis.labelWidth = axisOptions.labelWidth; - axis.labelHeight = axisOptions.labelHeight; - - if (axis == axes.xaxis || axis == axes.x2axis) { - // to avoid measuring the widths of the labels, we - // construct fixed-size boxes and put the labels inside - // them, we don't need the exact figures and the - // fixed-size box content is easy to center - if (axis.labelWidth == null) - axis.labelWidth = canvasWidth / (axis.ticks.length > 0 ? axis.ticks.length : 1); - - // measure x label heights - if (axis.labelHeight == null) { - labels = []; - for (i = 0; i < axis.ticks.length; ++i) { - l = axis.ticks[i].label; - if (l) - labels.push('
    ' + l + '
    '); - } - - if (labels.length > 0) { - var dummyDiv = $('
    ' - + labels.join("") + '
    ').appendTo(placeholder); - axis.labelHeight = dummyDiv.height(); - dummyDiv.remove(); - } - } - } - else if (axis.labelWidth == null || axis.labelHeight == null) { - // calculate y label dimensions - for (i = 0; i < axis.ticks.length; ++i) { - l = axis.ticks[i].label; - if (l) - labels.push('
    ' + l + '
    '); - } - - if (labels.length > 0) { - var dummyDiv = $('
    ' - + labels.join("") + '
    ').appendTo(placeholder); - if (axis.labelWidth == null) - axis.labelWidth = dummyDiv.width(); - if (axis.labelHeight == null) - axis.labelHeight = dummyDiv.find("div").height(); - dummyDiv.remove(); - } - - } - - if (axis.labelWidth == null) - axis.labelWidth = 0; - if (axis.labelHeight == null) - axis.labelHeight = 0; - } - - function setGridSpacing() { - // get the most space needed around the grid for things - // that may stick out - var maxOutset = options.grid.borderWidth; - for (i = 0; i < series.length; ++i) - maxOutset = Math.max(maxOutset, 2 * (series[i].points.radius + series[i].points.lineWidth/2)); - - plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = maxOutset; - - var margin = options.grid.labelMargin + options.grid.borderWidth; - - if (axes.xaxis.labelHeight > 0) - plotOffset.bottom = Math.max(maxOutset, axes.xaxis.labelHeight + margin); - if (axes.yaxis.labelWidth > 0) - plotOffset.left = Math.max(maxOutset, axes.yaxis.labelWidth + margin); - if (axes.x2axis.labelHeight > 0) - plotOffset.top = Math.max(maxOutset, axes.x2axis.labelHeight + margin); - if (axes.y2axis.labelWidth > 0) - plotOffset.right = Math.max(maxOutset, axes.y2axis.labelWidth + margin); - - plotWidth = canvasWidth - plotOffset.left - plotOffset.right; - plotHeight = canvasHeight - plotOffset.bottom - plotOffset.top; - } - - var axis; - for (axis in axes) - setRange(axes[axis], options[axis]); - - if (options.grid.show) { - for (axis in axes) { - prepareTickGeneration(axes[axis], options[axis]); - setTicks(axes[axis], options[axis]); - measureLabels(axes[axis], options[axis]); - } - - setGridSpacing(); - } - else { - plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = 0; - plotWidth = canvasWidth; - plotHeight = canvasHeight; - } - - for (axis in axes) - setTransformationHelpers(axes[axis], options[axis]); - - if (options.grid.show) - insertLabels(); - - insertLegend(); - } - - function setRange(axis, axisOptions) { - var min = +(axisOptions.min != null ? axisOptions.min : axis.datamin), - max = +(axisOptions.max != null ? axisOptions.max : axis.datamax), - delta = max - min; - - if (delta == 0.0) { - // degenerate case - var widen = max == 0 ? 1 : 0.01; - - if (axisOptions.min == null) - min -= widen; - // alway widen max if we couldn't widen min to ensure we - // don't fall into min == max which doesn't work - if (axisOptions.max == null || axisOptions.min != null) - max += widen; - } - else { - // consider autoscaling - var margin = axisOptions.autoscaleMargin; - if (margin != null) { - if (axisOptions.min == null) { - min -= delta * margin; - // make sure we don't go below zero if all values - // are positive - if (min < 0 && axis.datamin != null && axis.datamin >= 0) - min = 0; - } - if (axisOptions.max == null) { - max += delta * margin; - if (max > 0 && axis.datamax != null && axis.datamax <= 0) - max = 0; - } - } - } - axis.min = min; - axis.max = max; - } - - function prepareTickGeneration(axis, axisOptions) { - // estimate number of ticks - var noTicks; - if (typeof axisOptions.ticks == "number" && axisOptions.ticks > 0) - noTicks = axisOptions.ticks; - else if (axis == axes.xaxis || axis == axes.x2axis) - // heuristic based on the model a*sqrt(x) fitted to - // some reasonable data points - noTicks = 0.3 * Math.sqrt(canvasWidth); - else - noTicks = 0.3 * Math.sqrt(canvasHeight); - - var delta = (axis.max - axis.min) / noTicks, - size, generator, unit, formatter, i, magn, norm; - - if (axisOptions.mode == "time") { - // pretty handling of time - - // map of app. size of time units in milliseconds - var timeUnitSize = { - "second": 1000, - "minute": 60 * 1000, - "hour": 60 * 60 * 1000, - "day": 24 * 60 * 60 * 1000, - "month": 30 * 24 * 60 * 60 * 1000, - "year": 365.2425 * 24 * 60 * 60 * 1000 - }; - - - // the allowed tick sizes, after 1 year we use - // an integer algorithm - var spec = [ - [1, "second"], [2, "second"], [5, "second"], [10, "second"], - [30, "second"], - [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], - [30, "minute"], - [1, "hour"], [2, "hour"], [4, "hour"], - [8, "hour"], [12, "hour"], - [1, "day"], [2, "day"], [3, "day"], - [0.25, "month"], [0.5, "month"], [1, "month"], - [2, "month"], [3, "month"], [6, "month"], - [1, "year"] - ]; - - var minSize = 0; - if (axisOptions.minTickSize != null) { - if (typeof axisOptions.tickSize == "number") - minSize = axisOptions.tickSize; - else - minSize = axisOptions.minTickSize[0] * timeUnitSize[axisOptions.minTickSize[1]]; - } - - for (i = 0; i < spec.length - 1; ++i) - if (delta < (spec[i][0] * timeUnitSize[spec[i][1]] - + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 - && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) - break; - size = spec[i][0]; - unit = spec[i][1]; - - // special-case the possibility of several years - if (unit == "year") { - magn = Math.pow(10, Math.floor(Math.log(delta / timeUnitSize.year) / Math.LN10)); - norm = (delta / timeUnitSize.year) / magn; - if (norm < 1.5) - size = 1; - else if (norm < 3) - size = 2; - else if (norm < 7.5) - size = 5; - else - size = 10; - - size *= magn; - } - - if (axisOptions.tickSize) { - size = axisOptions.tickSize[0]; - unit = axisOptions.tickSize[1]; - } - - generator = function(axis) { - var ticks = [], - tickSize = axis.tickSize[0], unit = axis.tickSize[1], - d = new Date(axis.min); - - var step = tickSize * timeUnitSize[unit]; - - if (unit == "second") - d.setUTCSeconds(floorInBase(d.getUTCSeconds(), tickSize)); - if (unit == "minute") - d.setUTCMinutes(floorInBase(d.getUTCMinutes(), tickSize)); - if (unit == "hour") - d.setUTCHours(floorInBase(d.getUTCHours(), tickSize)); - if (unit == "month") - d.setUTCMonth(floorInBase(d.getUTCMonth(), tickSize)); - if (unit == "year") - d.setUTCFullYear(floorInBase(d.getUTCFullYear(), tickSize)); - - // reset smaller components - d.setUTCMilliseconds(0); - if (step >= timeUnitSize.minute) - d.setUTCSeconds(0); - if (step >= timeUnitSize.hour) - d.setUTCMinutes(0); - if (step >= timeUnitSize.day) - d.setUTCHours(0); - if (step >= timeUnitSize.day * 4) - d.setUTCDate(1); - if (step >= timeUnitSize.year) - d.setUTCMonth(0); - - - var carry = 0, v = Number.NaN, prev; - do { - prev = v; - v = d.getTime(); - ticks.push({ v: v, label: axis.tickFormatter(v, axis) }); - if (unit == "month") { - if (tickSize < 1) { - // a bit complicated - we'll divide the month - // up but we need to take care of fractions - // so we don't end up in the middle of a day - d.setUTCDate(1); - var start = d.getTime(); - d.setUTCMonth(d.getUTCMonth() + 1); - var end = d.getTime(); - d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize); - carry = d.getUTCHours(); - d.setUTCHours(0); - } - else - d.setUTCMonth(d.getUTCMonth() + tickSize); - } - else if (unit == "year") { - d.setUTCFullYear(d.getUTCFullYear() + tickSize); - } - else - d.setTime(v + step); - } while (v < axis.max && v != prev); - - return ticks; - }; - - formatter = function (v, axis) { - var d = new Date(v); - - // first check global format - if (axisOptions.timeformat != null) - return $.plot.formatDate(d, axisOptions.timeformat, axisOptions.monthNames); - - var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; - var span = axis.max - axis.min; - var suffix = (axisOptions.twelveHourClock) ? " %p" : ""; - - if (t < timeUnitSize.minute) - fmt = "%h:%M:%S" + suffix; - else if (t < timeUnitSize.day) { - if (span < 2 * timeUnitSize.day) - fmt = "%h:%M" + suffix; - else - fmt = "%b %d %h:%M" + suffix; - } - else if (t < timeUnitSize.month) - fmt = "%b %d"; - else if (t < timeUnitSize.year) { - if (span < timeUnitSize.year) - fmt = "%b"; - else - fmt = "%b %y"; - } - else - fmt = "%y"; - - return $.plot.formatDate(d, fmt, axisOptions.monthNames); - }; - } - else { - // pretty rounding of base-10 numbers - var maxDec = axisOptions.tickDecimals; - var dec = -Math.floor(Math.log(delta) / Math.LN10); - if (maxDec != null && dec > maxDec) - dec = maxDec; - - magn = Math.pow(10, -dec); - norm = delta / magn; // norm is between 1.0 and 10.0 - - if (norm < 1.5) - size = 1; - else if (norm < 3) { - size = 2; - // special case for 2.5, requires an extra decimal - if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) { - size = 2.5; - ++dec; - } - } - else if (norm < 7.5) - size = 5; - else - size = 10; - - size *= magn; - - if (axisOptions.minTickSize != null && size < axisOptions.minTickSize) - size = axisOptions.minTickSize; - - if (axisOptions.tickSize != null) - size = axisOptions.tickSize; - - axis.tickDecimals = Math.max(0, (maxDec != null) ? maxDec : dec); - - generator = function (axis) { - var ticks = []; - - // spew out all possible ticks - var start = floorInBase(axis.min, axis.tickSize), - i = 0, v = Number.NaN, prev; - do { - prev = v; - v = start + i * axis.tickSize; - ticks.push({ v: v, label: axis.tickFormatter(v, axis) }); - ++i; - } while (v < axis.max && v != prev); - return ticks; - }; - - formatter = function (v, axis) { - return v.toFixed(axis.tickDecimals); - }; - } - - axis.tickSize = unit ? [size, unit] : size; - axis.tickGenerator = generator; - if ($.isFunction(axisOptions.tickFormatter)) - axis.tickFormatter = function (v, axis) { return "" + axisOptions.tickFormatter(v, axis); }; - else - axis.tickFormatter = formatter; - } - - function setTicks(axis, axisOptions) { - axis.ticks = []; - - if (!axis.used) - return; - - if (axisOptions.ticks == null) - axis.ticks = axis.tickGenerator(axis); - else if (typeof axisOptions.ticks == "number") { - if (axisOptions.ticks > 0) - axis.ticks = axis.tickGenerator(axis); - } - else if (axisOptions.ticks) { - var ticks = axisOptions.ticks; - - if ($.isFunction(ticks)) - // generate the ticks - ticks = ticks({ min: axis.min, max: axis.max }); - - // clean up the user-supplied ticks, copy them over - var i, v; - for (i = 0; i < ticks.length; ++i) { - var label = null; - var t = ticks[i]; - if (typeof t == "object") { - v = t[0]; - if (t.length > 1) - label = t[1]; - } - else - v = t; - if (label == null) - label = axis.tickFormatter(v, axis); - axis.ticks[i] = { v: v, label: label }; - } - } - - if (axisOptions.autoscaleMargin != null && axis.ticks.length > 0) { - // snap to ticks - if (axisOptions.min == null) - axis.min = Math.min(axis.min, axis.ticks[0].v); - if (axisOptions.max == null && axis.ticks.length > 1) - axis.max = Math.max(axis.max, axis.ticks[axis.ticks.length - 1].v); - } - } - - function draw() { - ctx.clearRect(0, 0, canvasWidth, canvasHeight); - - var grid = options.grid; - - if (grid.show && !grid.aboveData) - drawGrid(); - - for (var i = 0; i < series.length; ++i) - drawSeries(series[i]); - - executeHooks(hooks.draw, [ctx]); - - if (grid.show && grid.aboveData) - drawGrid(); - } - - function extractRange(ranges, coord) { - var firstAxis = coord + "axis", - secondaryAxis = coord + "2axis", - axis, from, to, reverse; - - if (ranges[firstAxis]) { - axis = axes[firstAxis]; - from = ranges[firstAxis].from; - to = ranges[firstAxis].to; - } - else if (ranges[secondaryAxis]) { - axis = axes[secondaryAxis]; - from = ranges[secondaryAxis].from; - to = ranges[secondaryAxis].to; - } - else { - // backwards-compat stuff - to be removed in future - axis = axes[firstAxis]; - from = ranges[coord + "1"]; - to = ranges[coord + "2"]; - } - - // auto-reverse as an added bonus - if (from != null && to != null && from > to) - return { from: to, to: from, axis: axis }; - - return { from: from, to: to, axis: axis }; - } - - function drawGrid() { - var i; - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - // draw background, if any - if (options.grid.backgroundColor) { - ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)"); - ctx.fillRect(0, 0, plotWidth, plotHeight); - } - - // draw markings - var markings = options.grid.markings; - if (markings) { - if ($.isFunction(markings)) - // xmin etc. are backwards-compatible, to be removed in future - markings = markings({ xmin: axes.xaxis.min, xmax: axes.xaxis.max, ymin: axes.yaxis.min, ymax: axes.yaxis.max, xaxis: axes.xaxis, yaxis: axes.yaxis, x2axis: axes.x2axis, y2axis: axes.y2axis }); - - for (i = 0; i < markings.length; ++i) { - var m = markings[i], - xrange = extractRange(m, "x"), - yrange = extractRange(m, "y"); - - // fill in missing - if (xrange.from == null) - xrange.from = xrange.axis.min; - if (xrange.to == null) - xrange.to = xrange.axis.max; - if (yrange.from == null) - yrange.from = yrange.axis.min; - if (yrange.to == null) - yrange.to = yrange.axis.max; - - // clip - if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || - yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) - continue; - - xrange.from = Math.max(xrange.from, xrange.axis.min); - xrange.to = Math.min(xrange.to, xrange.axis.max); - yrange.from = Math.max(yrange.from, yrange.axis.min); - yrange.to = Math.min(yrange.to, yrange.axis.max); - - if (xrange.from == xrange.to && yrange.from == yrange.to) - continue; - - // then draw - xrange.from = xrange.axis.p2c(xrange.from); - xrange.to = xrange.axis.p2c(xrange.to); - yrange.from = yrange.axis.p2c(yrange.from); - yrange.to = yrange.axis.p2c(yrange.to); - - if (xrange.from == xrange.to || yrange.from == yrange.to) { - // draw line - ctx.beginPath(); - ctx.strokeStyle = m.color || options.grid.markingsColor; - ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth; - //ctx.moveTo(Math.floor(xrange.from), yrange.from); - //ctx.lineTo(Math.floor(xrange.to), yrange.to); - ctx.moveTo(xrange.from, yrange.from); - ctx.lineTo(xrange.to, yrange.to); - ctx.stroke(); - } - else { - // fill area - ctx.fillStyle = m.color || options.grid.markingsColor; - ctx.fillRect(xrange.from, yrange.to, - xrange.to - xrange.from, - yrange.from - yrange.to); - } - } - } - - // draw the inner grid - ctx.lineWidth = 1; - ctx.strokeStyle = options.grid.tickColor; - ctx.beginPath(); - var v, axis = axes.xaxis; - for (i = 0; i < axis.ticks.length; ++i) { - v = axis.ticks[i].v; - if (v <= axis.min || v >= axes.xaxis.max) - continue; // skip those lying on the axes - - ctx.moveTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, 0); - ctx.lineTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, plotHeight); - } - - axis = axes.yaxis; - for (i = 0; i < axis.ticks.length; ++i) { - v = axis.ticks[i].v; - if (v <= axis.min || v >= axis.max) - continue; - - ctx.moveTo(0, Math.floor(axis.p2c(v)) + ctx.lineWidth/2); - ctx.lineTo(plotWidth, Math.floor(axis.p2c(v)) + ctx.lineWidth/2); - } - - axis = axes.x2axis; - for (i = 0; i < axis.ticks.length; ++i) { - v = axis.ticks[i].v; - if (v <= axis.min || v >= axis.max) - continue; - - ctx.moveTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, -5); - ctx.lineTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, 5); - } - - axis = axes.y2axis; - for (i = 0; i < axis.ticks.length; ++i) { - v = axis.ticks[i].v; - if (v <= axis.min || v >= axis.max) - continue; - - ctx.moveTo(plotWidth-5, Math.floor(axis.p2c(v)) + ctx.lineWidth/2); - ctx.lineTo(plotWidth+5, Math.floor(axis.p2c(v)) + ctx.lineWidth/2); - } - - ctx.stroke(); - - if (options.grid.borderWidth) { - // draw border - var bw = options.grid.borderWidth; - ctx.lineWidth = bw; - ctx.strokeStyle = options.grid.borderColor; - ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); - } - - ctx.restore(); - } - - function insertLabels() { - placeholder.find(".tickLabels").remove(); - - var html = ['
    ']; - - function addLabels(axis, labelGenerator) { - for (var i = 0; i < axis.ticks.length; ++i) { - var tick = axis.ticks[i]; - if (!tick.label || tick.v < axis.min || tick.v > axis.max) - continue; - html.push(labelGenerator(tick, axis)); - } - } - - var margin = options.grid.labelMargin + options.grid.borderWidth; - - addLabels(axes.xaxis, function (tick, axis) { - return '
    ' + tick.label + "
    "; - }); - - - addLabels(axes.yaxis, function (tick, axis) { - return '
    ' + tick.label + "
    "; - }); - - addLabels(axes.x2axis, function (tick, axis) { - return '
    ' + tick.label + "
    "; - }); - - addLabels(axes.y2axis, function (tick, axis) { - return '
    ' + tick.label + "
    "; - }); - - html.push('
    '); - - placeholder.append(html.join("")); - } - - function drawSeries(series) { - if (series.lines.show) - drawSeriesLines(series); - if (series.bars.show) - drawSeriesBars(series); - if (series.points.show) - drawSeriesPoints(series); - } - - function drawSeriesLines(series) { - function plotLine(datapoints, xoffset, yoffset, axisx, axisy) { - var points = datapoints.points, - ps = datapoints.pointsize, - prevx = null, prevy = null; - - ctx.beginPath(); - for (var i = ps; i < points.length; i += ps) { - var x1 = points[i - ps], y1 = points[i - ps + 1], - x2 = points[i], y2 = points[i + 1]; - - if (x1 == null || x2 == null) - continue; - - // clip with ymin - if (y1 <= y2 && y1 < axisy.min) { - if (y2 < axisy.min) - continue; // line segment is outside - // compute new intersection point - x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.min; - } - else if (y2 <= y1 && y2 < axisy.min) { - if (y1 < axisy.min) - continue; - x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.min; - } - - // clip with ymax - if (y1 >= y2 && y1 > axisy.max) { - if (y2 > axisy.max) - continue; - x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.max; - } - else if (y2 >= y1 && y2 > axisy.max) { - if (y1 > axisy.max) - continue; - x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.max; - } - - // clip with xmin - if (x1 <= x2 && x1 < axisx.min) { - if (x2 < axisx.min) - continue; - y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.min; - } - else if (x2 <= x1 && x2 < axisx.min) { - if (x1 < axisx.min) - continue; - y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.min; - } - - // clip with xmax - if (x1 >= x2 && x1 > axisx.max) { - if (x2 > axisx.max) - continue; - y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.max; - } - else if (x2 >= x1 && x2 > axisx.max) { - if (x1 > axisx.max) - continue; - y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.max; - } - - if (x1 != prevx || y1 != prevy) - ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); - - prevx = x2; - prevy = y2; - ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset); - } - ctx.stroke(); - } - - function plotLineArea(datapoints, axisx, axisy) { - var points = datapoints.points, - ps = datapoints.pointsize, - bottom = Math.min(Math.max(0, axisy.min), axisy.max), - top, lastX = 0, areaOpen = false; - - for (var i = ps; i < points.length; i += ps) { - var x1 = points[i - ps], y1 = points[i - ps + 1], - x2 = points[i], y2 = points[i + 1]; - - if (areaOpen && x1 != null && x2 == null) { - // close area - ctx.lineTo(axisx.p2c(lastX), axisy.p2c(bottom)); - ctx.fill(); - areaOpen = false; - continue; - } - - if (x1 == null || x2 == null) - continue; - - // clip x values - - // clip with xmin - if (x1 <= x2 && x1 < axisx.min) { - if (x2 < axisx.min) - continue; - y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.min; - } - else if (x2 <= x1 && x2 < axisx.min) { - if (x1 < axisx.min) - continue; - y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.min; - } - - // clip with xmax - if (x1 >= x2 && x1 > axisx.max) { - if (x2 > axisx.max) - continue; - y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.max; - } - else if (x2 >= x1 && x2 > axisx.max) { - if (x1 > axisx.max) - continue; - y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.max; - } - - if (!areaOpen) { - // open area - ctx.beginPath(); - ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom)); - areaOpen = true; - } - - // now first check the case where both is outside - if (y1 >= axisy.max && y2 >= axisy.max) { - ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); - ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); - lastX = x2; - continue; - } - else if (y1 <= axisy.min && y2 <= axisy.min) { - ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); - ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); - lastX = x2; - continue; - } - - // else it's a bit more complicated, there might - // be two rectangles and two triangles we need to fill - // in; to find these keep track of the current x values - var x1old = x1, x2old = x2; - - // and clip the y values, without shortcutting - - // clip with ymin - if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { - x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.min; - } - else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { - x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.min; - } - - // clip with ymax - if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { - x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.max; - } - else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { - x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.max; - } - - - // if the x value was changed we got a rectangle - // to fill - if (x1 != x1old) { - if (y1 <= axisy.min) - top = axisy.min; - else - top = axisy.max; - - ctx.lineTo(axisx.p2c(x1old), axisy.p2c(top)); - ctx.lineTo(axisx.p2c(x1), axisy.p2c(top)); - } - - // fill the triangles - ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1)); - ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); - - // fill the other rectangle if it's there - if (x2 != x2old) { - if (y2 <= axisy.min) - top = axisy.min; - else - top = axisy.max; - - ctx.lineTo(axisx.p2c(x2), axisy.p2c(top)); - ctx.lineTo(axisx.p2c(x2old), axisy.p2c(top)); - } - - lastX = Math.max(x2, x2old); - } - - if (areaOpen) { - ctx.lineTo(axisx.p2c(lastX), axisy.p2c(bottom)); - ctx.fill(); - } - } - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - ctx.lineJoin = "round"; - - var lw = series.lines.lineWidth, - sw = series.shadowSize; - // FIXME: consider another form of shadow when filling is turned on - if (lw > 0 && sw > 0) { - // draw shadow as a thick and thin line with transparency - ctx.lineWidth = sw; - ctx.strokeStyle = "rgba(0,0,0,0.1)"; - // position shadow at angle from the mid of line - var angle = Math.PI/18; - plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis); - ctx.lineWidth = sw/2; - plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis); - } - - ctx.lineWidth = lw; - ctx.strokeStyle = series.color; - var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight); - if (fillStyle) { - ctx.fillStyle = fillStyle; - plotLineArea(series.datapoints, series.xaxis, series.yaxis); - } - - if (lw > 0) - plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis); - ctx.restore(); - } - - function drawSeriesPoints(series) { - function plotPoints(datapoints, radius, fillStyle, offset, circumference, axisx, axisy) { - var points = datapoints.points, ps = datapoints.pointsize; - - for (var i = 0; i < points.length; i += ps) { - var x = points[i], y = points[i + 1]; - if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) - continue; - - ctx.beginPath(); - ctx.arc(axisx.p2c(x), axisy.p2c(y) + offset, radius, 0, circumference, false); - if (fillStyle) { - ctx.fillStyle = fillStyle; - ctx.fill(); - } - ctx.stroke(); - } - } - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - var lw = series.lines.lineWidth, - sw = series.shadowSize, - radius = series.points.radius; - if (lw > 0 && sw > 0) { - // draw shadow in two steps - var w = sw / 2; - ctx.lineWidth = w; - ctx.strokeStyle = "rgba(0,0,0,0.1)"; - plotPoints(series.datapoints, radius, null, w + w/2, Math.PI, - series.xaxis, series.yaxis); - - ctx.strokeStyle = "rgba(0,0,0,0.2)"; - plotPoints(series.datapoints, radius, null, w/2, Math.PI, - series.xaxis, series.yaxis); - } - - ctx.lineWidth = lw; - ctx.strokeStyle = series.color; - plotPoints(series.datapoints, radius, - getFillStyle(series.points, series.color), 0, 2 * Math.PI, - series.xaxis, series.yaxis); - ctx.restore(); - } - - function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal) { - var left, right, bottom, top, - drawLeft, drawRight, drawTop, drawBottom, - tmp; - - if (horizontal) { - drawBottom = drawRight = drawTop = true; - drawLeft = false; - left = b; - right = x; - top = y + barLeft; - bottom = y + barRight; - - // account for negative bars - if (right < left) { - tmp = right; - right = left; - left = tmp; - drawLeft = true; - drawRight = false; - } - } - else { - drawLeft = drawRight = drawTop = true; - drawBottom = false; - left = x + barLeft; - right = x + barRight; - bottom = b; - top = y; - - // account for negative bars - if (top < bottom) { - tmp = top; - top = bottom; - bottom = tmp; - drawBottom = true; - drawTop = false; - } - } - - // clip - if (right < axisx.min || left > axisx.max || - top < axisy.min || bottom > axisy.max) - return; - - if (left < axisx.min) { - left = axisx.min; - drawLeft = false; - } - - if (right > axisx.max) { - right = axisx.max; - drawRight = false; - } - - if (bottom < axisy.min) { - bottom = axisy.min; - drawBottom = false; - } - - if (top > axisy.max) { - top = axisy.max; - drawTop = false; - } - - left = axisx.p2c(left); - bottom = axisy.p2c(bottom); - right = axisx.p2c(right); - top = axisy.p2c(top); - - // fill the bar - if (fillStyleCallback) { - c.beginPath(); - c.moveTo(left, bottom); - c.lineTo(left, top); - c.lineTo(right, top); - c.lineTo(right, bottom); - c.fillStyle = fillStyleCallback(bottom, top); - c.fill(); - } - - // draw outline - if (drawLeft || drawRight || drawTop || drawBottom) { - c.beginPath(); - - // FIXME: inline moveTo is buggy with excanvas - c.moveTo(left, bottom + offset); - if (drawLeft) - c.lineTo(left, top + offset); - else - c.moveTo(left, top + offset); - if (drawTop) - c.lineTo(right, top + offset); - else - c.moveTo(right, top + offset); - if (drawRight) - c.lineTo(right, bottom + offset); - else - c.moveTo(right, bottom + offset); - if (drawBottom) - c.lineTo(left, bottom + offset); - else - c.moveTo(left, bottom + offset); - c.stroke(); - } - } - - function drawSeriesBars(series) { - function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) { - var points = datapoints.points, ps = datapoints.pointsize; - - for (var i = 0; i < points.length; i += ps) { - if (points[i] == null) - continue; - drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal); - } - } - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - // FIXME: figure out a way to add shadows (for instance along the right edge) - ctx.lineWidth = series.bars.lineWidth; - ctx.strokeStyle = series.color; - var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; - var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; - plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis); - ctx.restore(); - } - - function getFillStyle(filloptions, seriesColor, bottom, top) { - var fill = filloptions.fill; - if (!fill) - return null; - - if (filloptions.fillColor) - return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); - - var c = $.color.parse(seriesColor); - c.a = typeof fill == "number" ? fill : 0.4; - c.normalize(); - return c.toString(); - } - - function insertLegend() { - placeholder.find(".legend").remove(); - - if (!options.legend.show) - return; - - var fragments = [], rowStarted = false, - lf = options.legend.labelFormatter, s, label; - for (i = 0; i < series.length; ++i) { - s = series[i]; - label = s.label; - if (!label) - continue; - - if (i % options.legend.noColumns == 0) { - if (rowStarted) - fragments.push(''); - fragments.push(''); - rowStarted = true; - } - - if (lf) - label = lf(label, s); - - fragments.push( - '
    ' + - '' + label + ''); - } - if (rowStarted) - fragments.push(''); - - if (fragments.length == 0) - return; - - var table = '' + fragments.join("") + '
    '; - if (options.legend.container != null) - $(options.legend.container).html(table); - else { - var pos = "", - p = options.legend.position, - m = options.legend.margin; - if (m[0] == null) - m = [m, m]; - if (p.charAt(0) == "n") - pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; - else if (p.charAt(0) == "s") - pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; - if (p.charAt(1) == "e") - pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; - else if (p.charAt(1) == "w") - pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; - var legend = $('
    ' + table.replace('style="', 'style="position:absolute;' + pos +';') + '
    ').appendTo(placeholder); - if (options.legend.backgroundOpacity != 0.0) { - // put in the transparent background - // separately to avoid blended labels and - // label boxes - var c = options.legend.backgroundColor; - if (c == null) { - c = options.grid.backgroundColor; - if (c && typeof c == "string") - c = $.color.parse(c); - else - c = $.color.extract(legend, 'background-color'); - c.a = 1; - c = c.toString(); - } - var div = legend.children(); - $('
    ').prependTo(legend).css('opacity', options.legend.backgroundOpacity); - } - } - } - - - // interactive features - - var highlights = [], - redrawTimeout = null; - - // returns the data item the mouse is over, or null if none is found - function findNearbyItem(mouseX, mouseY, seriesFilter) { - var maxDistance = options.grid.mouseActiveRadius, - smallestDistance = maxDistance * maxDistance + 1, - item = null, foundPoint = false, i, j; - - for (i = 0; i < series.length; ++i) { - if (!seriesFilter(series[i])) - continue; - - var s = series[i], - axisx = s.xaxis, - axisy = s.yaxis, - points = s.datapoints.points, - ps = s.datapoints.pointsize, - mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster - my = axisy.c2p(mouseY), - maxx = maxDistance / axisx.scale, - maxy = maxDistance / axisy.scale; - - if (s.lines.show || s.points.show) { - for (j = 0; j < points.length; j += ps) { - var x = points[j], y = points[j + 1]; - if (x == null) - continue; - - // For points and lines, the cursor must be within a - // certain distance to the data point - if (x - mx > maxx || x - mx < -maxx || - y - my > maxy || y - my < -maxy) - continue; - - // We have to calculate distances in pixels, not in - // data units, because the scales of the axes may be different - var dx = Math.abs(axisx.p2c(x) - mouseX), - dy = Math.abs(axisy.p2c(y) - mouseY), - dist = dx * dx + dy * dy; // we save the sqrt - - // use <= to ensure last point takes precedence - // (last generally means on top of) - if (dist <= smallestDistance) { - smallestDistance = dist; - item = [i, j / ps]; - } - } - } - - if (s.bars.show && !item) { // no other point can be nearby - var barLeft = s.bars.align == "left" ? 0 : -s.bars.barWidth/2, - barRight = barLeft + s.bars.barWidth; - - for (j = 0; j < points.length; j += ps) { - var x = points[j], y = points[j + 1], b = points[j + 2]; - if (x == null) - continue; - - // for a bar graph, the cursor must be inside the bar - if (series[i].bars.horizontal ? - (mx <= Math.max(b, x) && mx >= Math.min(b, x) && - my >= y + barLeft && my <= y + barRight) : - (mx >= x + barLeft && mx <= x + barRight && - my >= Math.min(b, y) && my <= Math.max(b, y))) - item = [i, j / ps]; - } - } - } - - if (item) { - i = item[0]; - j = item[1]; - ps = series[i].datapoints.pointsize; - - return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps), - dataIndex: j, - series: series[i], - seriesIndex: i }; - } - - return null; - } - - function onMouseMove(e) { - if (options.grid.hoverable) - triggerClickHoverEvent("plothover", e, - function (s) { return s["hoverable"] != false; }); - } - - function onClick(e) { - triggerClickHoverEvent("plotclick", e, - function (s) { return s["clickable"] != false; }); - } - - // trigger click or hover event (they send the same parameters - // so we share their code) - function triggerClickHoverEvent(eventname, event, seriesFilter) { - var offset = eventHolder.offset(), - pos = { pageX: event.pageX, pageY: event.pageY }, - canvasX = event.pageX - offset.left - plotOffset.left, - canvasY = event.pageY - offset.top - plotOffset.top; - - if (axes.xaxis.used) - pos.x = axes.xaxis.c2p(canvasX); - if (axes.yaxis.used) - pos.y = axes.yaxis.c2p(canvasY); - if (axes.x2axis.used) - pos.x2 = axes.x2axis.c2p(canvasX); - if (axes.y2axis.used) - pos.y2 = axes.y2axis.c2p(canvasY); - - var item = findNearbyItem(canvasX, canvasY, seriesFilter); - - if (item) { - // fill in mouse pos for any listeners out there - item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left); - item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top); - } - - if (options.grid.autoHighlight) { - // clear auto-highlights - for (var i = 0; i < highlights.length; ++i) { - var h = highlights[i]; - if (h.auto == eventname && - !(item && h.series == item.series && h.point == item.datapoint)) - unhighlight(h.series, h.point); - } - - if (item) - highlight(item.series, item.datapoint, eventname); - } - - placeholder.trigger(eventname, [ pos, item ]); - } - - function triggerRedrawOverlay() { - if (!redrawTimeout) - redrawTimeout = setTimeout(drawOverlay, 30); - } - - function drawOverlay() { - redrawTimeout = null; - - // draw highlights - octx.save(); - octx.clearRect(0, 0, canvasWidth, canvasHeight); - octx.translate(plotOffset.left, plotOffset.top); - - var i, hi; - for (i = 0; i < highlights.length; ++i) { - hi = highlights[i]; - - if (hi.series.bars.show) - drawBarHighlight(hi.series, hi.point); - else - drawPointHighlight(hi.series, hi.point); - } - octx.restore(); - - executeHooks(hooks.drawOverlay, [octx]); - } - - function highlight(s, point, auto) { - if (typeof s == "number") - s = series[s]; - - if (typeof point == "number") - point = s.data[point]; - - var i = indexOfHighlight(s, point); - if (i == -1) { - highlights.push({ series: s, point: point, auto: auto }); - - triggerRedrawOverlay(); - } - else if (!auto) - highlights[i].auto = false; - } - - function unhighlight(s, point) { - if (s == null && point == null) { - highlights = []; - triggerRedrawOverlay(); - } - - if (typeof s == "number") - s = series[s]; - - if (typeof point == "number") - point = s.data[point]; - - var i = indexOfHighlight(s, point); - if (i != -1) { - highlights.splice(i, 1); - - triggerRedrawOverlay(); - } - } - - function indexOfHighlight(s, p) { - for (var i = 0; i < highlights.length; ++i) { - var h = highlights[i]; - if (h.series == s && h.point[0] == p[0] - && h.point[1] == p[1]) - return i; - } - return -1; - } - - function drawPointHighlight(series, point) { - var x = point[0], y = point[1], - axisx = series.xaxis, axisy = series.yaxis; - - if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) - return; - - var pointRadius = series.points.radius + series.points.lineWidth / 2; - octx.lineWidth = pointRadius; - octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); - var radius = 1.5 * pointRadius; - octx.beginPath(); - octx.arc(axisx.p2c(x), axisy.p2c(y), radius, 0, 2 * Math.PI, false); - octx.stroke(); - } - - function drawBarHighlight(series, point) { - octx.lineWidth = series.bars.lineWidth; - octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); - var fillStyle = $.color.parse(series.color).scale('a', 0.5).toString(); - var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; - drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth, - 0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal); - } - - function getColorOrGradient(spec, bottom, top, defaultColor) { - if (typeof spec == "string") - return spec; - else { - // assume this is a gradient spec; IE currently only - // supports a simple vertical gradient properly, so that's - // what we support too - var gradient = ctx.createLinearGradient(0, top, 0, bottom); - - for (var i = 0, l = spec.colors.length; i < l; ++i) { - var c = spec.colors[i]; - if (typeof c != "string") { - c = $.color.parse(defaultColor).scale('rgb', c.brightness); - c.a *= c.opacity; - c = c.toString(); - } - gradient.addColorStop(i / (l - 1), c); - } - - return gradient; - } - } - } - - $.plot = function(placeholder, data, options) { - var plot = new Plot($(placeholder), data, options, $.plot.plugins); - /*var t0 = new Date(); - var t1 = new Date(); - var tstr = "time used (msecs): " + (t1.getTime() - t0.getTime()) - if (window.console) - console.log(tstr); - else - alert(tstr);*/ - return plot; - }; - - $.plot.plugins = []; - - // returns a string with the date d formatted according to fmt - $.plot.formatDate = function(d, fmt, monthNames) { - var leftPad = function(n) { - n = "" + n; - return n.length == 1 ? "0" + n : n; - }; - - var r = []; - var escape = false; - var hours = d.getUTCHours(); - var isAM = hours < 12; - if (monthNames == null) - monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - - if (fmt.search(/%p|%P/) != -1) { - if (hours > 12) { - hours = hours - 12; - } else if (hours == 0) { - hours = 12; - } - } - for (var i = 0; i < fmt.length; ++i) { - var c = fmt.charAt(i); - - if (escape) { - switch (c) { - case 'h': c = "" + hours; break; - case 'H': c = leftPad(hours); break; - case 'M': c = leftPad(d.getUTCMinutes()); break; - case 'S': c = leftPad(d.getUTCSeconds()); break; - case 'd': c = "" + d.getUTCDate(); break; - case 'm': c = "" + (d.getUTCMonth() + 1); break; - case 'y': c = "" + d.getUTCFullYear(); break; - case 'b': c = "" + monthNames[d.getUTCMonth()]; break; - case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break; - case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break; - } - r.push(c); - escape = false; - } - else { - if (c == "%") - escape = true; - else - r.push(c); - } - } - return r.join(""); - }; - - // round to nearby lower multiple of base - function floorInBase(n, base) { - return base * Math.floor(n / base); - } - -})(jQuery); diff --git a/DeveloperAdoption/public/static/jquery.flot.min.js b/DeveloperAdoption/public/static/jquery.flot.min.js deleted file mode 100644 index 31f465b..0000000 --- a/DeveloperAdoption/public/static/jquery.flot.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){jQuery.color={};jQuery.color.make=function(G,H,J,I){var A={};A.r=G||0;A.g=H||0;A.b=J||0;A.a=I!=null?I:1;A.add=function(C,D){for(var E=0;E=1){return"rgb("+[A.r,A.g,A.b].join(",")+")"}else{return"rgba("+[A.r,A.g,A.b,A.a].join(",")+")"}};A.normalize=function(){function C(E,D,F){return DF?F:D)}A.r=C(0,parseInt(A.r),255);A.g=C(0,parseInt(A.g),255);A.b=C(0,parseInt(A.b),255);A.a=C(0,A.a,1);return A};A.clone=function(){return jQuery.color.make(A.r,A.b,A.g,A.a)};return A.normalize()};jQuery.color.extract=function(E,F){var A;do{A=E.css(F).toLowerCase();if(A!=""&&A!="transparent"){break}E=E.parent()}while(!jQuery.nodeName(E.get(0),"body"));if(A=="rgba(0, 0, 0, 0)"){A="transparent"}return jQuery.color.parse(A)};jQuery.color.parse=function(A){var F,H=jQuery.color.make;if(F=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(A)){return H(parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10))}if(F=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(A)){return H(parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10),parseFloat(F[4]))}if(F=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(A)){return H(parseFloat(F[1])*2.55,parseFloat(F[2])*2.55,parseFloat(F[3])*2.55)}if(F=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(A)){return H(parseFloat(F[1])*2.55,parseFloat(F[2])*2.55,parseFloat(F[3])*2.55,parseFloat(F[4]))}if(F=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(A)){return H(parseInt(F[1],16),parseInt(F[2],16),parseInt(F[3],16))}if(F=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(A)){return H(parseInt(F[1]+F[1],16),parseInt(F[2]+F[2],16),parseInt(F[3]+F[3],16))}var G=jQuery.trim(A).toLowerCase();if(G=="transparent"){return H(255,255,255,0)}else{F=B[G];return H(F[0],F[1],F[2])}};var B={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})();(function(C){function B(l,W,X,E){var O=[],g={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{mode:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,twelveHourClock:false},yaxis:{autoscaleMargin:0.02},x2axis:{autoscaleMargin:null},y2axis:{autoscaleMargin:0.02},series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false},shadowSize:3},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,tickColor:"rgba(0,0,0,0.15)",labelMargin:5,borderWidth:2,borderColor:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},hooks:{}},P=null,AC=null,AD=null,Y=null,AJ=null,s={xaxis:{},yaxis:{},x2axis:{},y2axis:{}},e={left:0,right:0,top:0,bottom:0},y=0,Q=0,I=0,t=0,L={processOptions:[],processRawData:[],processDatapoints:[],draw:[],bindEvents:[],drawOverlay:[]},G=this;G.setData=f;G.setupGrid=k;G.draw=AH;G.getPlaceholder=function(){return l};G.getCanvas=function(){return P};G.getPlotOffset=function(){return e};G.width=function(){return I};G.height=function(){return t};G.offset=function(){var AK=AD.offset();AK.left+=e.left;AK.top+=e.top;return AK};G.getData=function(){return O};G.getAxes=function(){return s};G.getOptions=function(){return g};G.highlight=AE;G.unhighlight=x;G.triggerRedrawOverlay=q;G.pointOffset=function(AK){return{left:parseInt(T(AK,"xaxis").p2c(+AK.x)+e.left),top:parseInt(T(AK,"yaxis").p2c(+AK.y)+e.top)}};G.hooks=L;b(G);r(X);c();f(W);k();AH();AG();function Z(AM,AK){AK=[G].concat(AK);for(var AL=0;AL=g.colors.length){AP=0;++AO}}var AQ=0,AW;for(AP=0;APAl.datamax){Al.datamax=Aj}}for(Ac=0;Ac0&&Ab[AZ-AX]!=null&&Ab[AZ-AX]!=Ab[AZ]&&Ab[AZ-AX+1]!=Ab[AZ+1]){for(AV=0;AVAU){AU=Ai}}if(Af.y){if(AiAd){Ad=Ai}}}}if(AR.bars.show){var Ag=AR.bars.align=="left"?0:-AR.bars.barWidth/2;if(AR.bars.horizontal){AY+=Ag;Ad+=Ag+AR.bars.barWidth}else{AS+=Ag;AU+=Ag+AR.bars.barWidth}}AN(AR.xaxis,AS,AU);AN(AR.yaxis,AY,Ad)}for(AK in s){if(s[AK].datamin==AW){s[AK].datamin=null}if(s[AK].datamax==AQ){s[AK].datamax=null}}}function c(){function AK(AM,AL){var AN=document.createElement("canvas");AN.width=AM;AN.height=AL;if(C.browser.msie){AN=window.G_vmlCanvasManager.initElement(AN)}return AN}y=l.width();Q=l.height();l.html("");if(l.css("position")=="static"){l.css("position","relative")}if(y<=0||Q<=0){throw"Invalid dimensions for plot, width = "+y+", height = "+Q}if(C.browser.msie){window.G_vmlCanvasManager.init_(document)}P=C(AK(y,Q)).appendTo(l).get(0);Y=P.getContext("2d");AC=C(AK(y,Q)).css({position:"absolute",left:0,top:0}).appendTo(l).get(0);AJ=AC.getContext("2d");AJ.stroke()}function AG(){AD=C([AC,P]);if(g.grid.hoverable){AD.mousemove(D)}if(g.grid.clickable){AD.click(d)}Z(L.bindEvents,[AD])}function k(){function AL(AT,AU){function AP(AV){return AV}var AS,AO,AQ=AU.transform||AP,AR=AU.inverseTransform;if(AT==s.xaxis||AT==s.x2axis){AS=AT.scale=I/(AQ(AT.max)-AQ(AT.min));AO=AQ(AT.min);if(AQ==AP){AT.p2c=function(AV){return(AV-AO)*AS}}else{AT.p2c=function(AV){return(AQ(AV)-AO)*AS}}if(!AR){AT.c2p=function(AV){return AO+AV/AS}}else{AT.c2p=function(AV){return AR(AO+AV/AS)}}}else{AS=AT.scale=t/(AQ(AT.max)-AQ(AT.min));AO=AQ(AT.max);if(AQ==AP){AT.p2c=function(AV){return(AO-AV)*AS}}else{AT.p2c=function(AV){return(AO-AQ(AV))*AS}}if(!AR){AT.c2p=function(AV){return AO-AV/AS}}else{AT.c2p=function(AV){return AR(AO-AV/AS)}}}}function AN(AR,AT){var AQ,AS=[],AP;AR.labelWidth=AT.labelWidth;AR.labelHeight=AT.labelHeight;if(AR==s.xaxis||AR==s.x2axis){if(AR.labelWidth==null){AR.labelWidth=y/(AR.ticks.length>0?AR.ticks.length:1)}if(AR.labelHeight==null){AS=[];for(AQ=0;AQ'+AP+"")}}if(AS.length>0){var AO=C('
    '+AS.join("")+'
    ').appendTo(l);AR.labelHeight=AO.height();AO.remove()}}}else{if(AR.labelWidth==null||AR.labelHeight==null){for(AQ=0;AQ'+AP+"")}}if(AS.length>0){var AO=C('
    '+AS.join("")+"
    ").appendTo(l);if(AR.labelWidth==null){AR.labelWidth=AO.width()}if(AR.labelHeight==null){AR.labelHeight=AO.find("div").height()}AO.remove()}}}if(AR.labelWidth==null){AR.labelWidth=0}if(AR.labelHeight==null){AR.labelHeight=0}}function AM(){var AP=g.grid.borderWidth;for(i=0;i0){e.bottom=Math.max(AP,s.xaxis.labelHeight+AO)}if(s.yaxis.labelWidth>0){e.left=Math.max(AP,s.yaxis.labelWidth+AO)}if(s.x2axis.labelHeight>0){e.top=Math.max(AP,s.x2axis.labelHeight+AO)}if(s.y2axis.labelWidth>0){e.right=Math.max(AP,s.y2axis.labelWidth+AO)}I=y-e.left-e.right;t=Q-e.bottom-e.top}var AK;for(AK in s){K(s[AK],g[AK])}if(g.grid.show){for(AK in s){F(s[AK],g[AK]);p(s[AK],g[AK]);AN(s[AK],g[AK])}AM()}else{e.left=e.right=e.top=e.bottom=0;I=y;t=Q}for(AK in s){AL(s[AK],g[AK])}if(g.grid.show){h()}AI()}function K(AN,AQ){var AM=+(AQ.min!=null?AQ.min:AN.datamin),AK=+(AQ.max!=null?AQ.max:AN.datamax),AP=AK-AM;if(AP==0){var AL=AK==0?1:0.01;if(AQ.min==null){AM-=AL}if(AQ.max==null||AQ.min!=null){AK+=AL}}else{var AO=AQ.autoscaleMargin;if(AO!=null){if(AQ.min==null){AM-=AP*AO;if(AM<0&&AN.datamin!=null&&AN.datamin>=0){AM=0}}if(AQ.max==null){AK+=AP*AO;if(AK>0&&AN.datamax!=null&&AN.datamax<=0){AK=0}}}}AN.min=AM;AN.max=AK}function F(AP,AS){var AO;if(typeof AS.ticks=="number"&&AS.ticks>0){AO=AS.ticks}else{if(AP==s.xaxis||AP==s.x2axis){AO=0.3*Math.sqrt(y)}else{AO=0.3*Math.sqrt(Q)}}var AX=(AP.max-AP.min)/AO,AZ,AT,AV,AW,AR,AM,AL;if(AS.mode=="time"){var AU={second:1000,minute:60*1000,hour:60*60*1000,day:24*60*60*1000,month:30*24*60*60*1000,year:365.2425*24*60*60*1000};var AY=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[0.25,"month"],[0.5,"month"],[1,"month"],[2,"month"],[3,"month"],[6,"month"],[1,"year"]];var AN=0;if(AS.minTickSize!=null){if(typeof AS.tickSize=="number"){AN=AS.tickSize}else{AN=AS.minTickSize[0]*AU[AS.minTickSize[1]]}}for(AR=0;AR=AN){break}}AZ=AY[AR][0];AV=AY[AR][1];if(AV=="year"){AM=Math.pow(10,Math.floor(Math.log(AX/AU.year)/Math.LN10));AL=(AX/AU.year)/AM;if(AL<1.5){AZ=1}else{if(AL<3){AZ=2}else{if(AL<7.5){AZ=5}else{AZ=10}}}AZ*=AM}if(AS.tickSize){AZ=AS.tickSize[0];AV=AS.tickSize[1]}AT=function(Ac){var Ah=[],Af=Ac.tickSize[0],Ai=Ac.tickSize[1],Ag=new Date(Ac.min);var Ab=Af*AU[Ai];if(Ai=="second"){Ag.setUTCSeconds(A(Ag.getUTCSeconds(),Af))}if(Ai=="minute"){Ag.setUTCMinutes(A(Ag.getUTCMinutes(),Af))}if(Ai=="hour"){Ag.setUTCHours(A(Ag.getUTCHours(),Af))}if(Ai=="month"){Ag.setUTCMonth(A(Ag.getUTCMonth(),Af))}if(Ai=="year"){Ag.setUTCFullYear(A(Ag.getUTCFullYear(),Af))}Ag.setUTCMilliseconds(0);if(Ab>=AU.minute){Ag.setUTCSeconds(0)}if(Ab>=AU.hour){Ag.setUTCMinutes(0)}if(Ab>=AU.day){Ag.setUTCHours(0)}if(Ab>=AU.day*4){Ag.setUTCDate(1)}if(Ab>=AU.year){Ag.setUTCMonth(0)}var Ak=0,Aj=Number.NaN,Ad;do{Ad=Aj;Aj=Ag.getTime();Ah.push({v:Aj,label:Ac.tickFormatter(Aj,Ac)});if(Ai=="month"){if(Af<1){Ag.setUTCDate(1);var Aa=Ag.getTime();Ag.setUTCMonth(Ag.getUTCMonth()+1);var Ae=Ag.getTime();Ag.setTime(Aj+Ak*AU.hour+(Ae-Aa)*Af);Ak=Ag.getUTCHours();Ag.setUTCHours(0)}else{Ag.setUTCMonth(Ag.getUTCMonth()+Af)}}else{if(Ai=="year"){Ag.setUTCFullYear(Ag.getUTCFullYear()+Af)}else{Ag.setTime(Aj+Ab)}}}while(AjAK){AQ=AK}AM=Math.pow(10,-AQ);AL=AX/AM;if(AL<1.5){AZ=1}else{if(AL<3){AZ=2;if(AL>2.25&&(AK==null||AQ+1<=AK)){AZ=2.5;++AQ}}else{if(AL<7.5){AZ=5}else{AZ=10}}}AZ*=AM;if(AS.minTickSize!=null&&AZ0){AO.ticks=AO.tickGenerator(AO)}}else{if(AQ.ticks){var AP=AQ.ticks;if(C.isFunction(AP)){AP=AP({min:AO.min,max:AO.max})}var AN,AK;for(AN=0;AN1){AL=AM[1]}}else{AK=AM}if(AL==null){AL=AO.tickFormatter(AK,AO)}AO.ticks[AN]={v:AK,label:AL}}}}}if(AQ.autoscaleMargin!=null&&AO.ticks.length>0){if(AQ.min==null){AO.min=Math.min(AO.min,AO.ticks[0].v)}if(AQ.max==null&&AO.ticks.length>1){AO.max=Math.max(AO.max,AO.ticks[AO.ticks.length-1].v)}}}function AH(){Y.clearRect(0,0,y,Q);var AL=g.grid;if(AL.show&&!AL.aboveData){S()}for(var AK=0;AKAP){return{from:AP,to:AQ,axis:AN}}return{from:AQ,to:AP,axis:AN}}function S(){var AO;Y.save();Y.translate(e.left,e.top);if(g.grid.backgroundColor){Y.fillStyle=R(g.grid.backgroundColor,t,0,"rgba(255, 255, 255, 0)");Y.fillRect(0,0,I,t)}var AL=g.grid.markings;if(AL){if(C.isFunction(AL)){AL=AL({xmin:s.xaxis.min,xmax:s.xaxis.max,ymin:s.yaxis.min,ymax:s.yaxis.max,xaxis:s.xaxis,yaxis:s.yaxis,x2axis:s.x2axis,y2axis:s.y2axis})}for(AO=0;AOAQ.axis.max||AN.toAN.axis.max){continue}AQ.from=Math.max(AQ.from,AQ.axis.min);AQ.to=Math.min(AQ.to,AQ.axis.max);AN.from=Math.max(AN.from,AN.axis.min);AN.to=Math.min(AN.to,AN.axis.max);if(AQ.from==AQ.to&&AN.from==AN.to){continue}AQ.from=AQ.axis.p2c(AQ.from);AQ.to=AQ.axis.p2c(AQ.to);AN.from=AN.axis.p2c(AN.from);AN.to=AN.axis.p2c(AN.to);if(AQ.from==AQ.to||AN.from==AN.to){Y.beginPath();Y.strokeStyle=AK.color||g.grid.markingsColor;Y.lineWidth=AK.lineWidth||g.grid.markingsLineWidth;Y.moveTo(AQ.from,AN.from);Y.lineTo(AQ.to,AN.to);Y.stroke()}else{Y.fillStyle=AK.color||g.grid.markingsColor;Y.fillRect(AQ.from,AN.to,AQ.to-AQ.from,AN.from-AN.to)}}}Y.lineWidth=1;Y.strokeStyle=g.grid.tickColor;Y.beginPath();var AM,AP=s.xaxis;for(AO=0;AO=s.xaxis.max){continue}Y.moveTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,0);Y.lineTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,t)}AP=s.yaxis;for(AO=0;AO=AP.max){continue}Y.moveTo(0,Math.floor(AP.p2c(AM))+Y.lineWidth/2);Y.lineTo(I,Math.floor(AP.p2c(AM))+Y.lineWidth/2)}AP=s.x2axis;for(AO=0;AO=AP.max){continue}Y.moveTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,-5);Y.lineTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,5)}AP=s.y2axis;for(AO=0;AO=AP.max){continue}Y.moveTo(I-5,Math.floor(AP.p2c(AM))+Y.lineWidth/2);Y.lineTo(I+5,Math.floor(AP.p2c(AM))+Y.lineWidth/2)}Y.stroke();if(g.grid.borderWidth){var AR=g.grid.borderWidth;Y.lineWidth=AR;Y.strokeStyle=g.grid.borderColor;Y.strokeRect(-AR/2,-AR/2,I+AR,t+AR)}Y.restore()}function h(){l.find(".tickLabels").remove();var AK=['
    '];function AM(AP,AQ){for(var AO=0;AOAP.max){continue}AK.push(AQ(AN,AP))}}var AL=g.grid.labelMargin+g.grid.borderWidth;AM(s.xaxis,function(AN,AO){return'
    '+AN.label+"
    "});AM(s.yaxis,function(AN,AO){return'
    '+AN.label+"
    "});AM(s.x2axis,function(AN,AO){return'
    '+AN.label+"
    "});AM(s.y2axis,function(AN,AO){return'
    '+AN.label+"
    "});AK.push("
    ");l.append(AK.join(""))}function AA(AK){if(AK.lines.show){a(AK)}if(AK.bars.show){n(AK)}if(AK.points.show){o(AK)}}function a(AN){function AM(AY,AZ,AR,Ad,Ac){var Ae=AY.points,AS=AY.pointsize,AW=null,AV=null;Y.beginPath();for(var AX=AS;AX=Aa&&Ab>Ac.max){if(Aa>Ac.max){continue}AU=(Ac.max-Ab)/(Aa-Ab)*(AT-AU)+AU;Ab=Ac.max}else{if(Aa>=Ab&&Aa>Ac.max){if(Ab>Ac.max){continue}AT=(Ac.max-Ab)/(Aa-Ab)*(AT-AU)+AU;Aa=Ac.max}}if(AU<=AT&&AU=AT&&AU>Ad.max){if(AT>Ad.max){continue}Ab=(Ad.max-AU)/(AT-AU)*(Aa-Ab)+Ab;AU=Ad.max}else{if(AT>=AU&&AT>Ad.max){if(AU>Ad.max){continue}Aa=(Ad.max-AU)/(AT-AU)*(Aa-Ab)+Ab;AT=Ad.max}}if(AU!=AW||Ab!=AV){Y.moveTo(Ad.p2c(AU)+AZ,Ac.p2c(Ab)+AR)}AW=AT;AV=Aa;Y.lineTo(Ad.p2c(AT)+AZ,Ac.p2c(Aa)+AR)}Y.stroke()}function AO(AX,Ae,Ac){var Af=AX.points,AR=AX.pointsize,AS=Math.min(Math.max(0,Ac.min),Ac.max),Aa,AV=0,Ad=false;for(var AW=AR;AW=AT&&AU>Ae.max){if(AT>Ae.max){continue}Ab=(Ae.max-AU)/(AT-AU)*(AZ-Ab)+Ab;AU=Ae.max}else{if(AT>=AU&&AT>Ae.max){if(AU>Ae.max){continue}AZ=(Ae.max-AU)/(AT-AU)*(AZ-Ab)+Ab;AT=Ae.max}}if(!Ad){Y.beginPath();Y.moveTo(Ae.p2c(AU),Ac.p2c(AS));Ad=true}if(Ab>=Ac.max&&AZ>=Ac.max){Y.lineTo(Ae.p2c(AU),Ac.p2c(Ac.max));Y.lineTo(Ae.p2c(AT),Ac.p2c(Ac.max));AV=AT;continue}else{if(Ab<=Ac.min&&AZ<=Ac.min){Y.lineTo(Ae.p2c(AU),Ac.p2c(Ac.min));Y.lineTo(Ae.p2c(AT),Ac.p2c(Ac.min));AV=AT;continue}}var Ag=AU,AY=AT;if(Ab<=AZ&&Ab=Ac.min){AU=(Ac.min-Ab)/(AZ-Ab)*(AT-AU)+AU;Ab=Ac.min}else{if(AZ<=Ab&&AZ=Ac.min){AT=(Ac.min-Ab)/(AZ-Ab)*(AT-AU)+AU;AZ=Ac.min}}if(Ab>=AZ&&Ab>Ac.max&&AZ<=Ac.max){AU=(Ac.max-Ab)/(AZ-Ab)*(AT-AU)+AU;Ab=Ac.max}else{if(AZ>=Ab&&AZ>Ac.max&&Ab<=Ac.max){AT=(Ac.max-Ab)/(AZ-Ab)*(AT-AU)+AU;AZ=Ac.max}}if(AU!=Ag){if(Ab<=Ac.min){Aa=Ac.min}else{Aa=Ac.max}Y.lineTo(Ae.p2c(Ag),Ac.p2c(Aa));Y.lineTo(Ae.p2c(AU),Ac.p2c(Aa))}Y.lineTo(Ae.p2c(AU),Ac.p2c(Ab));Y.lineTo(Ae.p2c(AT),Ac.p2c(AZ));if(AT!=AY){if(AZ<=Ac.min){Aa=Ac.min}else{Aa=Ac.max}Y.lineTo(Ae.p2c(AT),Ac.p2c(Aa));Y.lineTo(Ae.p2c(AY),Ac.p2c(Aa))}AV=Math.max(AT,AY)}if(Ad){Y.lineTo(Ae.p2c(AV),Ac.p2c(AS));Y.fill()}}Y.save();Y.translate(e.left,e.top);Y.lineJoin="round";var AP=AN.lines.lineWidth,AK=AN.shadowSize;if(AP>0&&AK>0){Y.lineWidth=AK;Y.strokeStyle="rgba(0,0,0,0.1)";var AQ=Math.PI/18;AM(AN.datapoints,Math.sin(AQ)*(AP/2+AK/2),Math.cos(AQ)*(AP/2+AK/2),AN.xaxis,AN.yaxis);Y.lineWidth=AK/2;AM(AN.datapoints,Math.sin(AQ)*(AP/2+AK/4),Math.cos(AQ)*(AP/2+AK/4),AN.xaxis,AN.yaxis)}Y.lineWidth=AP;Y.strokeStyle=AN.color;var AL=V(AN.lines,AN.color,0,t);if(AL){Y.fillStyle=AL;AO(AN.datapoints,AN.xaxis,AN.yaxis)}if(AP>0){AM(AN.datapoints,0,0,AN.xaxis,AN.yaxis)}Y.restore()}function o(AN){function AP(AU,AT,Ab,AR,AV,AZ,AY){var Aa=AU.points,AQ=AU.pointsize;for(var AS=0;ASAZ.max||AWAY.max){continue}Y.beginPath();Y.arc(AZ.p2c(AX),AY.p2c(AW)+AR,AT,0,AV,false);if(Ab){Y.fillStyle=Ab;Y.fill()}Y.stroke()}}Y.save();Y.translate(e.left,e.top);var AO=AN.lines.lineWidth,AL=AN.shadowSize,AK=AN.points.radius;if(AO>0&&AL>0){var AM=AL/2;Y.lineWidth=AM;Y.strokeStyle="rgba(0,0,0,0.1)";AP(AN.datapoints,AK,null,AM+AM/2,Math.PI,AN.xaxis,AN.yaxis);Y.strokeStyle="rgba(0,0,0,0.2)";AP(AN.datapoints,AK,null,AM/2,Math.PI,AN.xaxis,AN.yaxis)}Y.lineWidth=AO;Y.strokeStyle=AN.color;AP(AN.datapoints,AK,V(AN.points,AN.color),0,2*Math.PI,AN.xaxis,AN.yaxis);Y.restore()}function AB(AV,AU,Ad,AQ,AY,AN,AL,AT,AS,Ac,AZ){var AM,Ab,AR,AX,AO,AK,AW,AP,Aa;if(AZ){AP=AK=AW=true;AO=false;AM=Ad;Ab=AV;AX=AU+AQ;AR=AU+AY;if(AbAT.max||AXAS.max){return }if(AMAT.max){Ab=AT.max;AK=false}if(ARAS.max){AX=AS.max;AW=false}AM=AT.p2c(AM);AR=AS.p2c(AR);Ab=AT.p2c(Ab);AX=AS.p2c(AX);if(AL){Ac.beginPath();Ac.moveTo(AM,AR);Ac.lineTo(AM,AX);Ac.lineTo(Ab,AX);Ac.lineTo(Ab,AR);Ac.fillStyle=AL(AR,AX);Ac.fill()}if(AO||AK||AW||AP){Ac.beginPath();Ac.moveTo(AM,AR+AN);if(AO){Ac.lineTo(AM,AX+AN)}else{Ac.moveTo(AM,AX+AN)}if(AW){Ac.lineTo(Ab,AX+AN)}else{Ac.moveTo(Ab,AX+AN)}if(AK){Ac.lineTo(Ab,AR+AN)}else{Ac.moveTo(Ab,AR+AN)}if(AP){Ac.lineTo(AM,AR+AN)}else{Ac.moveTo(AM,AR+AN)}Ac.stroke()}}function n(AM){function AL(AS,AR,AU,AP,AT,AW,AV){var AX=AS.points,AO=AS.pointsize;for(var AQ=0;AQ")}AP.push("");AN=true}if(AV){AR=AV(AR,AU)}AP.push('
    '+AR+"")}if(AN){AP.push("")}if(AP.length==0){return }var AT=''+AP.join("")+"
    ";if(g.legend.container!=null){C(g.legend.container).html(AT)}else{var AQ="",AL=g.legend.position,AM=g.legend.margin;if(AM[0]==null){AM=[AM,AM]}if(AL.charAt(0)=="n"){AQ+="top:"+(AM[1]+e.top)+"px;"}else{if(AL.charAt(0)=="s"){AQ+="bottom:"+(AM[1]+e.bottom)+"px;"}}if(AL.charAt(1)=="e"){AQ+="right:"+(AM[0]+e.right)+"px;"}else{if(AL.charAt(1)=="w"){AQ+="left:"+(AM[0]+e.left)+"px;"}}var AS=C('
    '+AT.replace('style="','style="position:absolute;'+AQ+";")+"
    ").appendTo(l);if(g.legend.backgroundOpacity!=0){var AO=g.legend.backgroundColor;if(AO==null){AO=g.grid.backgroundColor;if(AO&&typeof AO=="string"){AO=C.color.parse(AO)}else{AO=C.color.extract(AS,"background-color")}AO.a=1;AO=AO.toString()}var AK=AS.children();C('
    ').prependTo(AS).css("opacity",g.legend.backgroundOpacity)}}}var w=[],J=null;function AF(AR,AP,AM){var AX=g.grid.mouseActiveRadius,Aj=AX*AX+1,Ah=null,Aa=false,Af,Ad;for(Af=0;AfAL||AT-AZ<-AL||AS-AW>AK||AS-AW<-AK){continue}var AV=Math.abs(AQ.p2c(AT)-AR),AU=Math.abs(AO.p2c(AS)-AP),Ab=AV*AV+AU*AU;if(Ab<=Aj){Aj=Ab;Ah=[Af,Ad/Ac]}}}if(AY.bars.show&&!Ah){var AN=AY.bars.align=="left"?0:-AY.bars.barWidth/2,Ag=AN+AY.bars.barWidth;for(Ad=0;Ad=Math.min(Ai,AT)&&AW>=AS+AN&&AW<=AS+Ag):(AZ>=AT+AN&&AZ<=AT+Ag&&AW>=Math.min(Ai,AS)&&AW<=Math.max(Ai,AS))){Ah=[Af,Ad/Ac]}}}}if(Ah){Af=Ah[0];Ad=Ah[1];Ac=O[Af].datapoints.pointsize;return{datapoint:O[Af].datapoints.points.slice(Ad*Ac,(Ad+1)*Ac),dataIndex:Ad,series:O[Af],seriesIndex:Af}}return null}function D(AK){if(g.grid.hoverable){H("plothover",AK,function(AL){return AL.hoverable!=false})}}function d(AK){H("plotclick",AK,function(AL){return AL.clickable!=false})}function H(AL,AK,AM){var AN=AD.offset(),AS={pageX:AK.pageX,pageY:AK.pageY},AQ=AK.pageX-AN.left-e.left,AO=AK.pageY-AN.top-e.top;if(s.xaxis.used){AS.x=s.xaxis.c2p(AQ)}if(s.yaxis.used){AS.y=s.yaxis.c2p(AO)}if(s.x2axis.used){AS.x2=s.x2axis.c2p(AQ)}if(s.y2axis.used){AS.y2=s.y2axis.c2p(AO)}var AT=AF(AQ,AO,AM);if(AT){AT.pageX=parseInt(AT.series.xaxis.p2c(AT.datapoint[0])+AN.left+e.left);AT.pageY=parseInt(AT.series.yaxis.p2c(AT.datapoint[1])+AN.top+e.top)}if(g.grid.autoHighlight){for(var AP=0;APAQ.max||ARAP.max){return }var AO=AN.points.radius+AN.points.lineWidth/2;AJ.lineWidth=AO;AJ.strokeStyle=C.color.parse(AN.color).scale("a",0.5).toString();var AK=1.5*AO;AJ.beginPath();AJ.arc(AQ.p2c(AL),AP.p2c(AR),AK,0,2*Math.PI,false);AJ.stroke()}function z(AN,AK){AJ.lineWidth=AN.bars.lineWidth;AJ.strokeStyle=C.color.parse(AN.color).scale("a",0.5).toString();var AM=C.color.parse(AN.color).scale("a",0.5).toString();var AL=AN.bars.align=="left"?0:-AN.bars.barWidth/2;AB(AK[0],AK[1],AK[2]||0,AL,AL+AN.bars.barWidth,0,function(){return AM},AN.xaxis,AN.yaxis,AJ,AN.bars.horizontal)}function R(AM,AL,AQ,AO){if(typeof AM=="string"){return AM}else{var AP=Y.createLinearGradient(0,AQ,0,AL);for(var AN=0,AK=AM.colors.length;AN12){K=K-12}else{if(K==0){K=12}}}for(var F=0;F1) - options.series.pie.tilt=1; - if (options.series.pie.tilt<0) - options.series.pie.tilt=0; - - // add processData hook to do transformations on the data - plot.hooks.processDatapoints.push(processDatapoints); - plot.hooks.drawOverlay.push(drawOverlay); - - // add draw hook - plot.hooks.draw.push(draw); - } - } - - // bind hoverable events - function bindEvents(plot, eventHolder) - { - var options = plot.getOptions(); - - if (options.series.pie.show && options.grid.hoverable) - eventHolder.unbind('mousemove').mousemove(onMouseMove); - - if (options.series.pie.show && options.grid.clickable) - eventHolder.unbind('click').click(onClick); - } - - - // debugging function that prints out an object - function alertObject(obj) - { - var msg = ''; - function traverse(obj, depth) - { - if (!depth) - depth = 0; - for (var i = 0; i < obj.length; ++i) - { - for (var j=0; jcanvas.width-maxRadius) - centerLeft = canvas.width-maxRadius; - } - - function fixData(data) - { - for (var i = 0; i < data.length; ++i) - { - if (typeof(data[i].data)=='number') - data[i].data = [[1,data[i].data]]; - else if (typeof(data[i].data)=='undefined' || typeof(data[i].data[0])=='undefined') - { - if (typeof(data[i].data)!='undefined' && typeof(data[i].data.label)!='undefined') - data[i].label = data[i].data.label; // fix weirdness coming from flot - data[i].data = [[1,0]]; - - } - } - return data; - } - - function combine(data) - { - data = fixData(data); - calcTotal(data); - var combined = 0; - var numCombined = 0; - var color = options.series.pie.combine.color; - - var newdata = []; - for (var i = 0; i < data.length; ++i) - { - // make sure its a number - data[i].data[0][1] = parseFloat(data[i].data[0][1]); - if (!data[i].data[0][1]) - data[i].data[0][1] = 0; - - if (data[i].data[0][1]/total<=options.series.pie.combine.threshold) - { - combined += data[i].data[0][1]; - numCombined++; - if (!color) - color = data[i].color; - } - else - { - newdata.push({ - data: [[1,data[i].data[0][1]]], - color: data[i].color, - label: data[i].label, - angle: (data[i].data[0][1]*(Math.PI*2))/total, - percent: (data[i].data[0][1]/total*100) - }); - } - } - if (numCombined>0) - newdata.push({ - data: [[1,combined]], - color: color, - label: options.series.pie.combine.label, - angle: (combined*(Math.PI*2))/total, - percent: (combined/total*100) - }); - return newdata; - } - - function draw(plot, newCtx) - { - if (!target) return; // if no series were passed - ctx = newCtx; - - setupPie(); - var slices = plot.getData(); - - var attempts = 0; - while (redraw && attempts0) - maxRadius *= shrink; - attempts += 1; - clear(); - if (options.series.pie.tilt<=0.8) - drawShadow(); - drawPie(); - } - if (attempts >= redrawAttempts) { - clear(); - target.prepend('
    Could not draw pie with labels contained inside canvas
    '); - } - - if ( plot.setSeries && plot.insertLegend ) - { - plot.setSeries(slices); - plot.insertLegend(); - } - - // we're actually done at this point, just defining internal functions at this point - - function clear() - { - ctx.clearRect(0,0,canvas.width,canvas.height); - target.children().filter('.pieLabel, .pieLabelBackground').remove(); - } - - function drawShadow() - { - var shadowLeft = 5; - var shadowTop = 15; - var edge = 10; - var alpha = 0.02; - - // set radius - if (options.series.pie.radius>1) - var radius = options.series.pie.radius; - else - var radius = maxRadius * options.series.pie.radius; - - if (radius>=(canvas.width/2)-shadowLeft || radius*options.series.pie.tilt>=(canvas.height/2)-shadowTop || radius<=edge) - return; // shadow would be outside canvas, so don't draw it - - ctx.save(); - ctx.translate(shadowLeft,shadowTop); - ctx.globalAlpha = alpha; - ctx.fillStyle = '#000'; - - // center and rotate to starting position - ctx.translate(centerLeft,centerTop); - ctx.scale(1, options.series.pie.tilt); - - //radius -= edge; - for (var i=1; i<=edge; i++) - { - ctx.beginPath(); - ctx.arc(0,0,radius,0,Math.PI*2,false); - ctx.fill(); - radius -= i; - } - - ctx.restore(); - } - - function drawPie() - { - startAngle = Math.PI*options.series.pie.startAngle; - - // set radius - if (options.series.pie.radius>1) - var radius = options.series.pie.radius; - else - var radius = maxRadius * options.series.pie.radius; - - // center and rotate to starting position - ctx.save(); - ctx.translate(centerLeft,centerTop); - ctx.scale(1, options.series.pie.tilt); - //ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera - - // draw slices - ctx.save(); - var currentAngle = startAngle; - for (var i = 0; i < slices.length; ++i) - { - slices[i].startAngle = currentAngle; - drawSlice(slices[i].angle, slices[i].color, true); - } - ctx.restore(); - - // draw slice outlines - ctx.save(); - ctx.lineWidth = options.series.pie.stroke.width; - currentAngle = startAngle; - for (var i = 0; i < slices.length; ++i) - drawSlice(slices[i].angle, options.series.pie.stroke.color, false); - ctx.restore(); - - // draw donut hole - drawDonutHole(ctx); - - // draw labels - if (options.series.pie.label.show) - drawLabels(); - - // restore to original state - ctx.restore(); - - function drawSlice(angle, color, fill) - { - if (angle<=0) - return; - - if (fill) - ctx.fillStyle = color; - else - { - ctx.strokeStyle = color; - ctx.lineJoin = 'round'; - } - - ctx.beginPath(); - if (Math.abs(angle - Math.PI*2) > 0.000000001) - ctx.moveTo(0,0); // Center of the pie - else if ($.browser.msie) - angle -= 0.0001; - //ctx.arc(0,0,radius,0,angle,false); // This doesn't work properly in Opera - ctx.arc(0,0,radius,currentAngle,currentAngle+angle,false); - ctx.closePath(); - //ctx.rotate(angle); // This doesn't work properly in Opera - currentAngle += angle; - - if (fill) - ctx.fill(); - else - ctx.stroke(); - } - - function drawLabels() - { - var currentAngle = startAngle; - - // set radius - if (options.series.pie.label.radius>1) - var radius = options.series.pie.label.radius; - else - var radius = maxRadius * options.series.pie.label.radius; - - for (var i = 0; i < slices.length; ++i) - { - if (slices[i].percent >= options.series.pie.label.threshold*100) - drawLabel(slices[i], currentAngle, i); - currentAngle += slices[i].angle; - } - - function drawLabel(slice, startAngle, index) - { - if (slice.data[0][1]==0) - return; - - // format label text - var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter; - if (lf) - text = lf(slice.label, slice); - else - text = slice.label; - if (plf) - text = plf(text, slice); - - var halfAngle = ((startAngle+slice.angle) + startAngle)/2; - var x = centerLeft + Math.round(Math.cos(halfAngle) * radius); - var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt; - - var html = '' + text + ""; - target.append(html); - var label = target.children('#pieLabel'+index); - var labelTop = (y - label.height()/2); - var labelLeft = (x - label.width()/2); - label.css('top', labelTop); - label.css('left', labelLeft); - - // check to make sure that the label is not outside the canvas - if (0-labelTop>0 || 0-labelLeft>0 || canvas.height-(labelTop+label.height())<0 || canvas.width-(labelLeft+label.width())<0) - redraw = true; - - if (options.series.pie.label.background.opacity != 0) { - // put in the transparent background separately to avoid blended labels and label boxes - var c = options.series.pie.label.background.color; - if (c == null) { - c = slice.color; - } - var pos = 'top:'+labelTop+'px;left:'+labelLeft+'px;'; - $('
    ').insertBefore(label).css('opacity', options.series.pie.label.background.opacity); - } - } // end individual label function - } // end drawLabels function - } // end drawPie function - } // end draw function - - // Placed here because it needs to be accessed from multiple locations - function drawDonutHole(layer) - { - // draw donut hole - if(options.series.pie.innerRadius > 0) - { - // subtract the center - layer.save(); - innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius; - layer.globalCompositeOperation = 'destination-out'; // this does not work with excanvas, but it will fall back to using the stroke color - layer.beginPath(); - layer.fillStyle = options.series.pie.stroke.color; - layer.arc(0,0,innerRadius,0,Math.PI*2,false); - layer.fill(); - layer.closePath(); - layer.restore(); - - // add inner stroke - layer.save(); - layer.beginPath(); - layer.strokeStyle = options.series.pie.stroke.color; - layer.arc(0,0,innerRadius,0,Math.PI*2,false); - layer.stroke(); - layer.closePath(); - layer.restore(); - // TODO: add extra shadow inside hole (with a mask) if the pie is tilted. - } - } - - //-- Additional Interactive related functions -- - - function isPointInPoly(poly, pt) - { - for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) - ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1])) - && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]) - && (c = !c); - return c; - } - - function findNearbySlice(mouseX, mouseY) - { - var slices = plot.getData(), - options = plot.getOptions(), - radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; - - for (var i = 0; i < slices.length; ++i) - { - var s = slices[i]; - - if(s.pie.show) - { - ctx.save(); - ctx.beginPath(); - ctx.moveTo(0,0); // Center of the pie - //ctx.scale(1, options.series.pie.tilt); // this actually seems to break everything when here. - ctx.arc(0,0,radius,s.startAngle,s.startAngle+s.angle,false); - ctx.closePath(); - x = mouseX-centerLeft; - y = mouseY-centerTop; - if(ctx.isPointInPath) - { - if (ctx.isPointInPath(mouseX-centerLeft, mouseY-centerTop)) - { - //alert('found slice!'); - ctx.restore(); - return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; - } - } - else - { - // excanvas for IE doesn;t support isPointInPath, this is a workaround. - p1X = (radius * Math.cos(s.startAngle)); - p1Y = (radius * Math.sin(s.startAngle)); - p2X = (radius * Math.cos(s.startAngle+(s.angle/4))); - p2Y = (radius * Math.sin(s.startAngle+(s.angle/4))); - p3X = (radius * Math.cos(s.startAngle+(s.angle/2))); - p3Y = (radius * Math.sin(s.startAngle+(s.angle/2))); - p4X = (radius * Math.cos(s.startAngle+(s.angle/1.5))); - p4Y = (radius * Math.sin(s.startAngle+(s.angle/1.5))); - p5X = (radius * Math.cos(s.startAngle+s.angle)); - p5Y = (radius * Math.sin(s.startAngle+s.angle)); - arrPoly = [[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,p5Y]]; - arrPoint = [x,y]; - // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt? - if(isPointInPoly(arrPoly, arrPoint)) - { - ctx.restore(); - return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; - } - } - ctx.restore(); - } - } - - return null; - } - - function onMouseMove(e) - { - triggerClickHoverEvent('plothover', e); - } - - function onClick(e) - { - triggerClickHoverEvent('plotclick', e); - } - - // trigger click or hover event (they send the same parameters so we share their code) - function triggerClickHoverEvent(eventname, e) - { - var offset = plot.offset(), - canvasX = parseInt(e.pageX - offset.left), - canvasY = parseInt(e.pageY - offset.top), - item = findNearbySlice(canvasX, canvasY); - - if (options.grid.autoHighlight) - { - // clear auto-highlights - for (var i = 0; i < highlights.length; ++i) - { - var h = highlights[i]; - if (h.auto == eventname && !(item && h.series == item.series)) - unhighlight(h.series); - } - } - - // highlight the slice - if (item) - highlight(item.series, eventname); - - // trigger any hover bind events - var pos = { pageX: e.pageX, pageY: e.pageY }; - target.trigger(eventname, [ pos, item ]); - } - - function highlight(s, auto) - { - if (typeof s == "number") - s = series[s]; - - var i = indexOfHighlight(s); - if (i == -1) - { - highlights.push({ series: s, auto: auto }); - plot.triggerRedrawOverlay(); - } - else if (!auto) - highlights[i].auto = false; - } - - function unhighlight(s) - { - if (s == null) - { - highlights = []; - plot.triggerRedrawOverlay(); - } - - if (typeof s == "number") - s = series[s]; - - var i = indexOfHighlight(s); - if (i != -1) - { - highlights.splice(i, 1); - plot.triggerRedrawOverlay(); - } - } - - function indexOfHighlight(s) - { - for (var i = 0; i < highlights.length; ++i) - { - var h = highlights[i]; - if (h.series == s) - return i; - } - return -1; - } - - function drawOverlay(plot, octx) - { - //alert(options.series.pie.radius); - var options = plot.getOptions(); - //alert(options.series.pie.radius); - - var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; - - octx.save(); - octx.translate(centerLeft, centerTop); - octx.scale(1, options.series.pie.tilt); - - for (i = 0; i < highlights.length; ++i) - drawHighlight(highlights[i].series); - - drawDonutHole(octx); - - octx.restore(); - - function drawHighlight(series) - { - if (series.angle < 0) return; - - //octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString(); - octx.fillStyle = "rgba(255, 255, 255, "+options.series.pie.highlight.opacity+")"; // this is temporary until we have access to parseColor - - octx.beginPath(); - if (Math.abs(series.angle - Math.PI*2) > 0.000000001) - octx.moveTo(0,0); // Center of the pie - octx.arc(0,0,radius,series.startAngle,series.startAngle+series.angle,false); - octx.closePath(); - octx.fill(); - } - - } - - } // end init (plugin body) - - // define pie specific options and their default values - var options = { - series: { - pie: { - show: false, - radius: 'auto', // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value) - innerRadius:0, /* for donut */ - startAngle: 3/2, - tilt: 1, - offset: { - top: 0, - left: 'auto' - }, - stroke: { - color: '#FFF', - width: 1 - }, - label: { - show: 'auto', - formatter: function(label, slice){ - return '
    '+label+'
    '+Math.round(slice.percent)+'%
    '; - }, // formatter function - radius: 1, // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value) - background: { - color: null, - opacity: 0 - }, - threshold: 0 // percentage at which to hide the label (i.e. the slice is too narrow) - }, - combine: { - threshold: -1, // percentage at which to combine little slices into one larger slice - color: null, // color to give the new slice (auto-generated if null) - label: 'Other' // label to give the new slice - }, - highlight: { - //color: '#FFF', // will add this functionality once parseColor is available - opacity: 0.5 - } - } - } - }; - - $.plot.plugins.push({ - init: init, - options: options, - name: "pie", - version: "1.0" - }); -})(jQuery); diff --git a/DeveloperAdoption/public/static/jquery.flot.stack.js b/DeveloperAdoption/public/static/jquery.flot.stack.js deleted file mode 100644 index a31d5dc..0000000 --- a/DeveloperAdoption/public/static/jquery.flot.stack.js +++ /dev/null @@ -1,184 +0,0 @@ -/* -Flot plugin for stacking data sets, i.e. putting them on top of each -other, for accumulative graphs. - -The plugin assumes the data is sorted on x (or y if stacking -horizontally). For line charts, it is assumed that if a line has an -undefined gap (from a null point), then the line above it should have -the same gap - insert zeros instead of "null" if you want another -behaviour. This also holds for the start and end of the chart. Note -that stacking a mix of positive and negative values in most instances -doesn't make sense (so it looks weird). - -Two or more series are stacked when their "stack" attribute is set to -the same key (which can be any number or string or just "true"). To -specify the default stack, you can set - - series: { - stack: null or true or key (number/string) - } - -or specify it for a specific series - - $.plot($("#placeholder"), [{ data: [ ... ], stack: true }]) - -The stacking order is determined by the order of the data series in -the array (later series end up on top of the previous). - -Internally, the plugin modifies the datapoints in each series, adding -an offset to the y value. For line series, extra data points are -inserted through interpolation. If there's a second y value, it's also -adjusted (e.g for bar charts or filled areas). -*/ - -(function ($) { - var options = { - series: { stack: null } // or number/string - }; - - function init(plot) { - function findMatchingSeries(s, allseries) { - var res = null - for (var i = 0; i < allseries.length; ++i) { - if (s == allseries[i]) - break; - - if (allseries[i].stack == s.stack) - res = allseries[i]; - } - - return res; - } - - function stackData(plot, s, datapoints) { - if (s.stack == null) - return; - - var other = findMatchingSeries(s, plot.getData()); - if (!other) - return; - - var ps = datapoints.pointsize, - points = datapoints.points, - otherps = other.datapoints.pointsize, - otherpoints = other.datapoints.points, - newpoints = [], - px, py, intery, qx, qy, bottom, - withlines = s.lines.show, - horizontal = s.bars.horizontal, - withbottom = ps > 2 && (horizontal ? datapoints.format[2].x : datapoints.format[2].y), - withsteps = withlines && s.lines.steps, - fromgap = true, - keyOffset = horizontal ? 1 : 0, - accumulateOffset = horizontal ? 0 : 1, - i = 0, j = 0, l; - - while (true) { - if (i >= points.length) - break; - - l = newpoints.length; - - if (points[i] == null) { - // copy gaps - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - i += ps; - } - else if (j >= otherpoints.length) { - // for lines, we can't use the rest of the points - if (!withlines) { - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - } - i += ps; - } - else if (otherpoints[j] == null) { - // oops, got a gap - for (m = 0; m < ps; ++m) - newpoints.push(null); - fromgap = true; - j += otherps; - } - else { - // cases where we actually got two points - px = points[i + keyOffset]; - py = points[i + accumulateOffset]; - qx = otherpoints[j + keyOffset]; - qy = otherpoints[j + accumulateOffset]; - bottom = 0; - - if (px == qx) { - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - - newpoints[l + accumulateOffset] += qy; - bottom = qy; - - i += ps; - j += otherps; - } - else if (px > qx) { - // we got past point below, might need to - // insert interpolated extra point - if (withlines && i > 0 && points[i - ps] != null) { - intery = py + (points[i - ps + accumulateOffset] - py) * (qx - px) / (points[i - ps + keyOffset] - px); - newpoints.push(qx); - newpoints.push(intery + qy); - for (m = 2; m < ps; ++m) - newpoints.push(points[i + m]); - bottom = qy; - } - - j += otherps; - } - else { // px < qx - if (fromgap && withlines) { - // if we come from a gap, we just skip this point - i += ps; - continue; - } - - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - - // we might be able to interpolate a point below, - // this can give us a better y - if (withlines && j > 0 && otherpoints[j - otherps] != null) - bottom = qy + (otherpoints[j - otherps + accumulateOffset] - qy) * (px - qx) / (otherpoints[j - otherps + keyOffset] - qx); - - newpoints[l + accumulateOffset] += bottom; - - i += ps; - } - - fromgap = false; - - if (l != newpoints.length && withbottom) - newpoints[l + 2] += bottom; - } - - // maintain the line steps invariant - if (withsteps && l != newpoints.length && l > 0 - && newpoints[l] != null - && newpoints[l] != newpoints[l - ps] - && newpoints[l + 1] != newpoints[l - ps + 1]) { - for (m = 0; m < ps; ++m) - newpoints[l + ps + m] = newpoints[l + m]; - newpoints[l + 1] = newpoints[l - ps + 1]; - } - } - - datapoints.points = newpoints; - } - - plot.hooks.processDatapoints.push(stackData); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'stack', - version: '1.2' - }); -})(jQuery); diff --git a/DeveloperAdoption/public/static/jquery.flot.threshold.multiple.js b/DeveloperAdoption/public/static/jquery.flot.threshold.multiple.js deleted file mode 100644 index d00390e..0000000 --- a/DeveloperAdoption/public/static/jquery.flot.threshold.multiple.js +++ /dev/null @@ -1,191 +0,0 @@ -/* -Flot plugin for specifying range of thresolds on data. -Controlled through the option "constraints" in a specific series - -usage - - $.plot($("#placeholder"), [{ data: [ ... ], constraints: [constraint1, constraint2]},{data:[...],constraints:[...]}]) - - where constraint1 = { - threshold: 2, - color: "rgb(0,0,0)", - evaluate : function(y,threshold){ return y < threshold; } - } - threshold -> y-limit on the plot. - evaluate -> the function which defines the limit.This function defines wheteher y < threshold or y > threshold. - color -> the color with which to plot portion of the graph which satisfies the limit condition. - - - -Internally, the plugin works by splitting the data into different series, one for each constraint. - -*/ -(function($){ - - function testing(){ - return "working"; - } - function init(plot){ - - function plotWithMultipleThresholds(plot,s,datapoints){ - if(s.data && s.data.length > 0 && s.constraints && s.constraints.length>0){ - var series = new Graph(s.data,s.constraints).getPlotData(); - for(var i=0;i= 0 ; i--) { - var constraint = this._constraints[i]; - if(null != constraint.threshold){ - var set = new Resolve(this._dataset).using(constraint.threshold, constraint.evaluate); - this._plotData.push( { - data : set, - color : constraint.color - }); - } - } - return this._plotData; - }; - - function Resolve(originalPonits) { - this._originalPoints = originalPonits; - this._data = []; - this._getPointOnThreshold = _getPointOnThreshold; - this.using = using ; - - function using(threshold, evaluate) { - var count = 0; - for ( var i = 0; i < this._originalPoints.length; i++) { - var currentPoint = this._originalPoints[i]; - if (evaluate(currentPoint[1],threshold)) { - if (i > 0 - && (this._data.length == 0 || this._data[count - 1] == null)) { - this._data[count++] = this._getPointOnThreshold(threshold,this._originalPoints[i - 1], currentPoint); - } - this._data[count++] = currentPoint; - } else { - if (this._data.length > 0 && this._data[count - 1] != null) { - this._data[count++] = this._getPointOnThreshold(threshold,this._originalPoints[i - 1], currentPoint); - this._data[count++] = null; - this._data[count++] = null; - } - } - } - return this._data; - } - - function _getPointOnThreshold(threshold, prevP, currP) { - var currentX = currP[0]; - var currentY = currP[1]; - - var prevX = prevP[0]; - var prevY = prevP[1]; - - var slope = (threshold - currentY) - / (prevY - currentY); - var xOnConstraintLine = slope * (prevX - currentX) + currentX; - - return [ xOnConstraintLine, threshold ]; - } - } - - function _getSortedConstraints(originalpoints,constraints){ - - var dataRange = _findMaxAndMin(originalpoints); - - if(undefined == dataRange)return []; - - var max = dataRange.max; - var min = dataRange.min; - var thresholdRanges = []; - var sortedConstraints = []; - for(var i = 0; i < constraints.length ; i++){ - var constraint = constraints[i]; - var range = 0; - if(constraint.evaluate(min,constraint.threshold)){ - range = Math.abs(constraint.threshold - min); - }else{ - range = Math.abs(max - constraint.threshold); - } - thresholdRanges.push({constraint:constraint,range:range}); - } - QuickSort(thresholdRanges,function(obj1,obj2){ return obj1.range < obj2.range;}); - for(var i=thresholdRanges.length-1;i>=0;i--){ - sortedConstraints[i] = thresholdRanges[i].constraint; - } - return sortedConstraints; - } - - function _findMaxAndMin(dataset){ - if(undefined == dataset)return undefined; - var arr = []; - for( var i=0;i left){ - var pivotIndex = Math.floor(( left + right )/2); - var pivotNewIndex = partition(array,left,right,pivotIndex,comparator); - sort(array, left, pivotNewIndex - 1,comparator); - sort(array, pivotNewIndex + 1, right,comparator); - - } - } - - function partition(array,left,right,pivotIndex,comparator){ - var pivot = array[pivotIndex]; - swap(array,pivotIndex,right); - var storeIndex = left; - for( var i= left ; i < right ; i++){ - if(comparator(array[i] , pivot)){ - swap(array,i,storeIndex); - storeIndex = storeIndex + 1; - } - } - swap(array,storeIndex,right); - - return storeIndex; - } - - function swap(array,index1,index2){ - var temp = array[index1]; - array[index1] = array[index2]; - array[index2] = temp; - } - } - - - plot.hooks.processRawData.push(plotWithMultipleThresholds); - } - -$.plot.plugins.push({ - init: init, - name: 'multiple.threshold', - version: '1.0' - }); -})(jQuery); - - diff --git a/DeveloperAdoption/public/static/jquery.flot.valuelabels.js b/DeveloperAdoption/public/static/jquery.flot.valuelabels.js deleted file mode 100644 index fac339b..0000000 --- a/DeveloperAdoption/public/static/jquery.flot.valuelabels.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Value Labels Plugin for flot. - * http://leonardoeloy.github.com/flot-valuelabels - * http://wiki.github.com/leonardoeloy/flot-valuelabels/ - * - * Using canvas.fillText instead of divs, which is better for printing - by Leonardo Eloy, March 2010. - * Tested with Flot 0.6 and JQuery 1.3.2. - * - * Original homepage: http://sites.google.com/site/petrsstuff/projects/flotvallab - * Released under the MIT license by Petr Blahos, December 2009. - */ -(function ($) { - var options = { - valueLabels: { - show: false, - showAsHtml: false, // Set to true if you wanna switch back to DIV usage (you need plot.css for this) - showLastValue: false // Use this to show the label only for the last value in the series - } - }; - - function init(plot) { - plot.hooks.draw.push(function (plot, ctx) { - if (!plot.getOptions().valueLabels.show) return; - - var showLastValue = plot.getOptions().valueLabels.showLastValue; - var showAsHtml = plot.getOptions().valueLabels.showAsHtml; - var ctx = plot.getCanvas().getContext("2d"); - $.each(plot.getData(), function(ii, series) { - // Workaround, since Flot doesn't set this value anymore - series.seriesIndex = ii; - if (showAsHtml) plot.getPlaceholder().find("#valueLabels"+ii).remove(); - var html = '
    '; - - var last_val = null; - var last_x = -1000; - var last_y = -1000; - for (var i = 0; i < series.data.length; ++i) { - if (series.data[i] == null || (showLastValue && i != series.data.length-1)) continue; - - var x = series.data[i][0], y = series.data[i][1]; - if (x < series.xaxis.min || x > series.xaxis.max || y < series.yaxis.min || y > series.yaxis.max) continue; - var val = y; - - if (series.valueLabelFunc) val = series.valueLabelFunc({ series: series, seriesIndex: ii, index: i }); - val = ""+val; - - if (val!=last_val || i==series.data.length-1) { - var xx = series.xaxis.p2c(x)+plot.getPlotOffset().left; - var yy = series.yaxis.p2c(y)-12+plot.getPlotOffset().top; - if (Math.abs(yy-last_y)>20 || last_x= plot.width()) x_pos = plot.width(); - - ctx.fillText(val, x_pos, y_pos); - } else { - var head = '
    ' + val + '
    '; - html+= head + "Light" + tail + head + tail; - } - } - } - } - - if (showAsHtml) { - html+= "
    "; - plot.getPlaceholder().append(html); - } - }); - }); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'valueLabels', - version: '1.1' - }); -})(jQuery); - diff --git a/DeveloperAdoption/public/static/jquery.min.js b/DeveloperAdoption/public/static/jquery.min.js deleted file mode 100644 index 48590ec..0000000 --- a/DeveloperAdoption/public/static/jquery.min.js +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Jun 30 14:16:56 2011 -0400 - */ -(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
    a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
    ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. -shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j -)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
    ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/DeveloperAdoption/public/static/jquery.sparkline.min.js b/DeveloperAdoption/public/static/jquery.sparkline.min.js deleted file mode 100644 index fe745b4..0000000 --- a/DeveloperAdoption/public/static/jquery.sparkline.min.js +++ /dev/null @@ -1,94 +0,0 @@ -/* jquery.sparkline 1.6 - http://omnipotent.net/jquery.sparkline/ -** Licensed under the New BSD License - see above site for details */ - -(function($){var defaults={common:{type:'line',lineColor:'#00f',fillColor:'#cdf',defaultPixelsPerValue:3,width:'auto',height:'auto',composite:false,tagValuesAttribute:'values',tagOptionsPrefix:'spark',enableTagOptions:false},line:{spotColor:'#f80',spotRadius:1.5,minSpotColor:'#f80',maxSpotColor:'#f80',lineWidth:1,normalRangeMin:undefined,normalRangeMax:undefined,normalRangeColor:'#ccc',drawNormalOnTop:false,chartRangeMin:undefined,chartRangeMax:undefined,chartRangeMinX:undefined,chartRangeMaxX:undefined},bar:{barColor:'#00f',negBarColor:'#f44',zeroColor:undefined,nullColor:undefined,zeroAxis:undefined,barWidth:4,barSpacing:1,chartRangeMax:undefined,chartRangeMin:undefined,chartRangeClip:false,colorMap:undefined},tristate:{barWidth:4,barSpacing:1,posBarColor:'#6f6',negBarColor:'#f44',zeroBarColor:'#999',colorMap:{}},discrete:{lineHeight:'auto',thresholdColor:undefined,thresholdValue:0,chartRangeMax:undefined,chartRangeMin:undefined,chartRangeClip:false},bullet:{targetColor:'red',targetWidth:3,performanceColor:'blue',rangeColors:['#D3DAFE','#A8B6FF','#7F94FF'],base:undefined},pie:{sliceColors:['#f00','#0f0','#00f']},box:{raw:false,boxLineColor:'black',boxFillColor:'#cdf',whiskerColor:'black',outlierLineColor:'#333',outlierFillColor:'white',medianColor:'red',showOutliers:true,outlierIQR:1.5,spotRadius:1.5,target:undefined,targetColor:'#4a2',chartRangeMax:undefined,chartRangeMin:undefined}};var VCanvas_base,VCanvas_canvas,VCanvas_vml;$.fn.simpledraw=function(width,height,use_existing){if(use_existing&&this[0].VCanvas){return this[0].VCanvas;} -if(width===undefined){width=$(this).innerWidth();} -if(height===undefined){height=$(this).innerHeight();} -if($.browser.hasCanvas){return new VCanvas_canvas(width,height,this);}else if($.browser.msie){return new VCanvas_vml(width,height,this);}else{return false;}};var pending=[];$.fn.sparkline=function(uservalues,userOptions){return this.each(function(){var options=new $.fn.sparkline.options(this,userOptions);var render=function(){var values,width,height;if(uservalues==='html'||uservalues===undefined){var vals=this.getAttribute(options.get('tagValuesAttribute'));if(vals===undefined||vals===null){vals=$(this).html();} -values=vals.replace(/(^\s*\s*$)|\s+/g,'').split(',');}else{values=uservalues;} -width=options.get('width')=='auto'?values.length*options.get('defaultPixelsPerValue'):options.get('width');if(options.get('height')=='auto'){if(!options.get('composite')||!this.VCanvas){var tmp=document.createElement('span');tmp.innerHTML='a';$(this).html(tmp);height=$(tmp).innerHeight();$(tmp).remove();}}else{height=options.get('height');} -$.fn.sparkline[options.get('type')].call(this,values,options,width,height);};if(($(this).html()&&$(this).is(':hidden'))||($.fn.jquery<"1.3.0"&&$(this).parents().is(':hidden'))||!$(this).parents('body').length){pending.push([this,render]);}else{render.call(this);}});};$.fn.sparkline.defaults=defaults;$.sparkline_display_visible=function(){for(var i=pending.length-1;i>=0;i--){var el=pending[i][0];if($(el).is(':visible')&&!$(el).parents().is(':hidden')){pending[i][1].call(el);pending.splice(i,1);}}};var UNSET_OPTION={};var normalizeValue=function(val){switch(val){case'undefined':val=undefined;break;case'null':val=null;break;case'true':val=true;break;case'false':val=false;break;default:var nf=parseFloat(val);if(val==nf){val=nf;}} -return val;};$.fn.sparkline.options=function(tag,userOptions){var extendedOptions;this.userOptions=userOptions=userOptions||{};this.tag=tag;this.tagValCache={};var defaults=$.fn.sparkline.defaults;var base=defaults.common;this.tagOptionsPrefix=userOptions.enableTagOptions&&(userOptions.tagOptionsPrefix||base.tagOptionsPrefix);var tagOptionType=this.getTagSetting('type');if(tagOptionType===UNSET_OPTION){extendedOptions=defaults[userOptions.type||base.type];}else{extendedOptions=defaults[tagOptionType];} -this.mergedOptions=$.extend({},base,extendedOptions,userOptions);};$.fn.sparkline.options.prototype.getTagSetting=function(key){var val,i,prefix=this.tagOptionsPrefix;if(prefix===false||prefix===undefined){return UNSET_OPTION;} -if(this.tagValCache.hasOwnProperty(key)){val=this.tagValCache.key;}else{val=this.tag.getAttribute(prefix+key);if(val===undefined||val===null){val=UNSET_OPTION;}else if(val.substr(0,1)=='['){val=val.substr(1,val.length-2).split(',');for(i=val.length;i--;){val[i]=normalizeValue(val[i].replace(/(^\s*)|(\s*$)/g,''));}}else if(val.substr(0,1)=='{'){var pairs=val.substr(1,val.length-2).split(',');val={};for(i=pairs.length;i--;){var keyval=pairs[i].split(':',2);val[keyval[0].replace(/(^\s*)|(\s*$)/g,'')]=normalizeValue(keyval[1].replace(/(^\s*)|(\s*$)/g,''));}}else{val=normalizeValue(val);} -this.tagValCache.key=val;} -return val;};$.fn.sparkline.options.prototype.get=function(key){var tagOption=this.getTagSetting(key);if(tagOption!==UNSET_OPTION){return tagOption;} -return this.mergedOptions[key];};$.fn.sparkline.line=function(values,options,width,height){var xvalues=[],yvalues=[],yminmax=[];for(var i=0;imaxy){maxy=normalRangeMax;}} -if(options.get('chartRangeMin')!==undefined&&(options.get('chartRangeClip')||options.get('chartRangeMin')maxy)){maxy=options.get('chartRangeMax');} -if(options.get('chartRangeMinX')!==undefined&&(options.get('chartRangeClipX')||options.get('chartRangeMinX')maxx)){maxx=options.get('chartRangeMaxX');} -var rangex=maxx-minx===0?1:maxx-minx;var rangey=maxy-miny===0?1:maxy-miny;var vl=yvalues.length-1;if(vl<1){this.innerHTML='';return;} -var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var canvas_width=target.pixel_width;var canvas_height=target.pixel_height;var canvas_top=0;var canvas_left=0;var spotRadius=options.get('spotRadius');if(spotRadius&&(canvas_width<(spotRadius*4)||canvas_height<(spotRadius*4))){spotRadius=0;} -if(spotRadius){if(options.get('minSpotColor')||(options.get('spotColor')&&yvalues[vl]==miny)){canvas_height-=Math.ceil(spotRadius);} -if(options.get('maxSpotColor')||(options.get('spotColor')&&yvalues[vl]==maxy)){canvas_height-=Math.ceil(spotRadius);canvas_top+=Math.ceil(spotRadius);} -if(options.get('minSpotColor')||options.get('maxSpotColor')&&(yvalues[0]==miny||yvalues[0]==maxy)){canvas_left+=Math.ceil(spotRadius);canvas_width-=Math.ceil(spotRadius);} -if(options.get('spotColor')||(options.get('minSpotColor')||options.get('maxSpotColor')&&(yvalues[vl]==miny||yvalues[vl]==maxy))){canvas_width-=Math.ceil(spotRadius);}} -canvas_height--;var drawNormalRange=function(){if(normalRangeMin!==undefined){var ytop=canvas_top+Math.round(canvas_height-(canvas_height*((normalRangeMax-miny)/rangey)));var height=Math.round((canvas_height*(normalRangeMax-normalRangeMin))/rangey);target.drawRect(canvas_left,ytop,canvas_width,height,undefined,options.get('normalRangeColor'));}};if(!options.get('drawNormalOnTop')){drawNormalRange();} -var path=[];var paths=[path];var x,y,vlen=yvalues.length;for(i=0;imaxy){y=maxy;} -if(!path.length){path.push([canvas_left+Math.round((x-minx)*(canvas_width/rangex)),canvas_top+canvas_height]);} -path.push([canvas_left+Math.round((x-minx)*(canvas_width/rangex)),canvas_top+Math.round(canvas_height-(canvas_height*((y-miny)/rangey)))]);}} -var lineshapes=[];var fillshapes=[];var plen=paths.length;for(i=0;i2){path[0]=[path[0][0],path[1][1]];} -lineshapes.push(path);} -plen=fillshapes.length;for(i=0;imax)){max=options.get('chartRangeMax');} -var zeroAxis=options.get('zeroAxis');if(zeroAxis===undefined){zeroAxis=min<0;} -var range=max-min===0?1:max-min;var colorMapByIndex,colorMapByValue;if($.isArray(options.get('colorMap'))){colorMapByIndex=options.get('colorMap');colorMapByValue=null;}else{colorMapByIndex=null;colorMapByValue=options.get('colorMap');} -var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var color,canvas_height=target.pixel_height,yzero=min<0&&zeroAxis?canvas_height-Math.round(canvas_height*(Math.abs(min)/range))-1:canvas_height-1;for(i=values.length;i--;){var x=i*(options.get('barWidth')+options.get('barSpacing')),y,val=values[i];if(val===null){if(options.get('nullColor')){color=options.get('nullColor');val=(zeroAxis&&min<0)?0:min;height=1;y=(zeroAxis&&min<0)?yzero:canvas_height-height;}else{continue;}}else{if(valmax){val=max;} -color=(val<0)?options.get('negBarColor'):options.get('barColor');if(zeroAxis&&min<0){height=Math.round(canvas_height*((Math.abs(val)/range)))+1;y=(val<0)?yzero:yzero-height;}else{height=Math.round(canvas_height*((val-min)/range))+1;y=canvas_height-height;} -if(val===0&&options.get('zeroColor')!==undefined){color=options.get('zeroColor');} -if(colorMapByValue&&colorMapByValue[val]){color=colorMapByValue[val];}else if(colorMapByIndex&&colorMapByIndex.length>i){color=colorMapByIndex[i];} -if(color===null){continue;}} -target.drawRect(x,y,options.get('barWidth')-1,height-1,color,color);}}else{this.innerHTML='';}};$.fn.sparkline.tristate=function(values,options,width,height){values=$.map(values,Number);width=(values.length*options.get('barWidth'))+((values.length-1)*options.get('barSpacing'));var colorMapByIndex,colorMapByValue;if($.isArray(options.get('colorMap'))){colorMapByIndex=options.get('colorMap');colorMapByValue=null;}else{colorMapByIndex=null;colorMapByValue=options.get('colorMap');} -var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var canvas_height=target.pixel_height,half_height=Math.round(canvas_height/2);for(var i=values.length;i--;){var x=i*(options.get('barWidth')+options.get('barSpacing')),y,color;if(values[i]<0){y=half_height;height=half_height-1;color=options.get('negBarColor');}else if(values[i]>0){y=0;height=half_height-1;color=options.get('posBarColor');}else{y=half_height-1;height=2;color=options.get('zeroBarColor');} -if(colorMapByValue&&colorMapByValue[values[i]]){color=colorMapByValue[values[i]];}else if(colorMapByIndex&&colorMapByIndex.length>i){color=colorMapByIndex[i];} -if(color===null){continue;} -target.drawRect(x,y,options.get('barWidth')-1,height-1,color,color);}}else{this.innerHTML='';}};$.fn.sparkline.discrete=function(values,options,width,height){values=$.map(values,Number);width=options.get('width')=='auto'?values.length*2:width;var interval=Math.floor(width/values.length);var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var canvas_height=target.pixel_height,line_height=options.get('lineHeight')=='auto'?Math.round(canvas_height*0.3):options.get('lineHeight'),pheight=canvas_height-line_height,min=Math.min.apply(Math,values),max=Math.max.apply(Math,values);if(options.get('chartRangeMin')!==undefined&&(options.get('chartRangeClip')||options.get('chartRangeMin')max)){max=options.get('chartRangeMax');} -var range=max-min;for(var i=values.length;i--;){var val=values[i];if(valmax){val=max;} -var x=(i*interval),ytop=Math.round(pheight-pheight*((val-min)/range));target.drawLine(x,ytop,x,ytop+line_height,(options.get('thresholdColor')&&val1){var canvas_width=target.pixel_width-Math.ceil(options.get('targetWidth')/2),canvas_height=target.pixel_height,min=Math.min.apply(Math,values),max=Math.max.apply(Math,values);if(options.get('base')===undefined){min=min<0?min:0;}else{min=options.get('base');} -var range=max-min;for(var i=2,vlen=values.length;i1){var canvas_width=target.pixel_width,canvas_height=target.pixel_height,radius=Math.floor(Math.min(canvas_width,canvas_height)/2),total=0,next=0,circle=2*Math.PI;for(var i=values.length;i--;){total+=values[i];} -if(options.get('offset')){next+=(2*Math.PI)*(options.get('offset')/360);} -var vlen=values.length;for(i=0;i0){end=next+(circle*(values[i]/total));} -target.drawPieSlice(radius,radius,radius,start,end,undefined,options.get('sliceColors')[i%options.get('sliceColors').length]);next=end;}}};var quartile=function(values,q){if(q==2){var vl2=Math.floor(values.length/2);return values.length%2?values[vl2]:(values[vl2]+values[vl2+1])/2;}else{var vl4=Math.floor(values.length/4);return values.length%2?(values[vl4*q]+values[vl4*q+1])/2:values[vl4*q];}};$.fn.sparkline.box=function(values,options,width,height){values=$.map(values,Number);width=options.get('width')=='auto'?'4.0em':width;var minvalue=options.get('chartRangeMin')===undefined?Math.min.apply(Math,values):options.get('chartRangeMin'),maxvalue=options.get('chartRangeMax')===undefined?Math.max.apply(Math,values):options.get('chartRangeMax'),target=$(this).simpledraw(width,height,options.get('composite')),vlen=values.length,lwhisker,loutlier,q1,q2,q3,rwhisker,routlier;if(target&&values.length>1){var canvas_width=target.pixel_width,canvas_height=target.pixel_height;if(options.get('raw')){if(options.get('showOutliers')&&values.length>5){loutlier=values[0];lwhisker=values[1];q1=values[2];q2=values[3];q3=values[4];rwhisker=values[5];routlier=values[6];}else{lwhisker=values[0];q1=values[1];q2=values[2];q3=values[3];rwhisker=values[4];}}else{values.sort(function(a,b){return a-b;});q1=quartile(values,1);q2=quartile(values,2);q3=quartile(values,3);var iqr=q3-q1;if(options.get('showOutliers')){lwhisker=undefined;rwhisker=undefined;for(var i=0;iq1-(iqr*options.get('outlierIQR'))){lwhisker=values[i];} -if(values[i]rwhisker){target.drawCircle((routlier-minvalue)*unitsize+canvas_left,canvas_height/2,options.get('spotRadius'),options.get('outlierLineColor'),options.get('outlierFillColor'));}} -target.drawRect(Math.round((q1-minvalue)*unitsize+canvas_left),Math.round(canvas_height*0.1),Math.round((q3-q1)*unitsize),Math.round(canvas_height*0.8),options.get('boxLineColor'),options.get('boxFillColor'));target.drawLine(Math.round((lwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),Math.round((q1-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),options.get('lineColor'));target.drawLine(Math.round((lwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/4),Math.round((lwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height-canvas_height/4),options.get('whiskerColor'));target.drawLine(Math.round((rwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),Math.round((q3-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),options.get('lineColor'));target.drawLine(Math.round((rwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/4),Math.round((rwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height-canvas_height/4),options.get('whiskerColor'));target.drawLine(Math.round((q2-minvalue)*unitsize+canvas_left),Math.round(canvas_height*0.1),Math.round((q2-minvalue)*unitsize+canvas_left),Math.round(canvas_height*0.9),options.get('medianColor'));if(options.get('target')){var size=Math.ceil(options.get('spotRadius'));target.drawLine(Math.round((options.get('target')-minvalue)*unitsize+canvas_left),Math.round((canvas_height/2)-size),Math.round((options.get('target')-minvalue)*unitsize+canvas_left),Math.round((canvas_height/2)+size),options.get('targetColor'));target.drawLine(Math.round((options.get('target')-minvalue)*unitsize+canvas_left-size),Math.round(canvas_height/2),Math.round((options.get('target')-minvalue)*unitsize+canvas_left+size),Math.round(canvas_height/2),options.get('targetColor'));}}else{this.innerHTML='';}};if($.browser.msie&&!document.namespaces.v){document.namespaces.add('v','urn:schemas-microsoft-com:vml','#default#VML');} -if($.browser.hasCanvas===undefined){var t=document.createElement('canvas');$.browser.hasCanvas=t.getContext!==undefined;} -VCanvas_base=function(width,height,target){};VCanvas_base.prototype={init:function(width,height,target){this.width=width;this.height=height;this.target=target;if(target[0]){target=target[0];} -target.VCanvas=this;},drawShape:function(path,lineColor,fillColor,lineWidth){alert('drawShape not implemented');},drawLine:function(x1,y1,x2,y2,lineColor,lineWidth){return this.drawShape([[x1,y1],[x2,y2]],lineColor,lineWidth);},drawCircle:function(x,y,radius,lineColor,fillColor){alert('drawCircle not implemented');},drawPieSlice:function(x,y,radius,startAngle,endAngle,lineColor,fillColor){alert('drawPieSlice not implemented');},drawRect:function(x,y,width,height,lineColor,fillColor){alert('drawRect not implemented');},getElement:function(){return this.canvas;},_insert:function(el,target){$(target).html(el);}};VCanvas_canvas=function(width,height,target){return this.init(width,height,target);};VCanvas_canvas.prototype=$.extend(new VCanvas_base(),{_super:VCanvas_base.prototype,init:function(width,height,target){this._super.init(width,height,target);this.canvas=document.createElement('canvas');if(target[0]){target=target[0];} -target.VCanvas=this;$(this.canvas).css({display:'inline-block',width:width,height:height,verticalAlign:'top'});this._insert(this.canvas,target);this.pixel_height=$(this.canvas).height();this.pixel_width=$(this.canvas).width();this.canvas.width=this.pixel_width;this.canvas.height=this.pixel_height;$(this.canvas).css({width:this.pixel_width,height:this.pixel_height});},_getContext:function(lineColor,fillColor,lineWidth){var context=this.canvas.getContext('2d');if(lineColor!==undefined){context.strokeStyle=lineColor;} -context.lineWidth=lineWidth===undefined?1:lineWidth;if(fillColor!==undefined){context.fillStyle=fillColor;} -return context;},drawShape:function(path,lineColor,fillColor,lineWidth){var context=this._getContext(lineColor,fillColor,lineWidth);context.beginPath();context.moveTo(path[0][0]+0.5,path[0][1]+0.5);for(var i=1,plen=path.length;i';this.canvas.insertAdjacentHTML('beforeEnd',groupel);this.group=$(this.canvas).children()[0];},drawShape:function(path,lineColor,fillColor,lineWidth){var vpath=[];for(var i=0,plen=path.length;i'+' ';this.group.insertAdjacentHTML('beforeEnd',vel);},drawCircle:function(x,y,radius,lineColor,fillColor){x-=radius+1;y-=radius+1;var stroke=lineColor===undefined?' stroked="false" ':' strokeWeight="1" strokeColor="'+lineColor+'" ';var fill=fillColor===undefined?' filled="false"':' fillColor="'+fillColor+'" filled="true" ';var vel='';this.group.insertAdjacentHTML('beforeEnd',vel);},drawPieSlice:function(x,y,radius,startAngle,endAngle,lineColor,fillColor){if(startAngle==endAngle){return;} -if((endAngle-startAngle)==(2*Math.PI)){startAngle=0.0;endAngle=(2*Math.PI);} -var startx=x+Math.round(Math.cos(startAngle)*radius);var starty=y+Math.round(Math.sin(startAngle)*radius);var endx=x+Math.round(Math.cos(endAngle)*radius);var endy=y+Math.round(Math.sin(endAngle)*radius);if(startx==endx&&starty==endy&&(endAngle-startAngle)'+' ';this.group.insertAdjacentHTML('beforeEnd',vel);},drawRect:function(x,y,width,height,lineColor,fillColor){return this.drawShape([[x,y],[x,y+height],[x+width,y+height],[x+width,y],[x,y]],lineColor,fillColor);}});})(jQuery); \ No newline at end of file diff --git a/DeveloperAdoption/public/static/json2.js b/DeveloperAdoption/public/static/json2.js deleted file mode 100644 index 6bdea10..0000000 --- a/DeveloperAdoption/public/static/json2.js +++ /dev/null @@ -1,482 +0,0 @@ -/* - http://www.JSON.org/json2.js - 2010-08-25 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date ? - 'Date(' + this[key] + ')' : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - -/*jslint evil: true, strict: false */ - -/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, - call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - -// Create a JSON object only if one does not already exist. We create the -// methods in a closure to avoid creating global variables. - -if (!this.JSON) { - this.JSON = {}; -} - -(function () { - - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - if (typeof Date.prototype.toJSON !== 'function') { - - Date.prototype.toJSON = function (key) { - - return isFinite(this.valueOf()) ? - this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z' : null; - }; - - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = function (key) { - return this.valueOf(); - }; - } - - var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; - - - function quote(string) { - -// If the string contains no control characters, no quote characters, and no -// backslash characters, then we can safely slap some quotes around it. -// Otherwise we must also replace the offending characters with safe escape -// sequences. - - escapable.lastIndex = 0; - return escapable.test(string) ? - '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : - '"' + string + '"'; - } - - - function str(key, holder) { - -// Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - -// If the value has a toJSON method, call it to obtain a replacement value. - - if (value && typeof value === 'object' && - typeof value.toJSON === 'function') { - value = value.toJSON(key); - } - -// If we were called with a replacer function, then call the replacer to -// obtain a replacement value. - - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } - -// What happens next depends on the value's type. - - switch (typeof value) { - case 'string': - return quote(value); - - case 'number': - -// JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : 'null'; - - case 'boolean': - case 'null': - -// If the value is a boolean or null, convert it to a string. Note: -// typeof null does not produce 'null'. The case is included here in -// the remote chance that this gets fixed someday. - - return String(value); - -// If the type is 'object', we might be dealing with an object or an array or -// null. - - case 'object': - -// Due to a specification blunder in ECMAScript, typeof null is 'object', -// so watch out for that case. - - if (!value) { - return 'null'; - } - -// Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - -// Is the value an array? - - if (Object.prototype.toString.apply(value) === '[object Array]') { - -// The value is an array. Stringify every element. Use null as a placeholder -// for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } - -// Join all of the elements together, separated with commas, and wrap them in -// brackets. - - v = partial.length === 0 ? '[]' : - gap ? '[\n' + gap + - partial.join(',\n' + gap) + '\n' + - mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - -// If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === 'string') { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } else { - -// Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - -// Join all of the member texts together, separated with commas, -// and wrap them in braces. - - v = partial.length === 0 ? '{}' : - gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + - mind + '}' : '{' + partial.join(',') + '}'; - gap = mind; - return v; - } - } - -// If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== 'function') { - JSON.stringify = function (value, replacer, space) { - -// The stringify method takes a value and an optional replacer, and an optional -// space parameter, and returns a JSON text. The replacer can be a function -// that can replace values, or an array of strings that will select the keys. -// A default replacer method can be provided. Use of the space parameter can -// produce text that is more easily readable. - - var i; - gap = ''; - indent = ''; - -// If the space parameter is a number, make an indent string containing that -// many spaces. - - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - -// If the space parameter is a string, it will be used as the indent string. - - } else if (typeof space === 'string') { - indent = space; - } - -// If there is a replacer, it must be a function or an array. -// Otherwise, throw an error. - - rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - -// Make a fake root object containing our value under the key of ''. -// Return the result of stringifying the value. - - return str('', {'': value}); - }; - } - - -// If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== 'function') { - JSON.parse = function (text, reviver) { - -// The parse method takes a text and an optional reviver function, and returns -// a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - -// The walk method is used to recursively walk the resulting structure so -// that modifications can be made. - - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - -// Parsing happens in four stages. In the first stage, we replace certain -// Unicode characters with escape sequences. JavaScript handles many characters -// incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return '\\u' + - ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - -// In the second stage, we run the text against regular expressions that look -// for non-JSON patterns. We are especially concerned with '()' and 'new' -// because they can cause invocation, and '=' because it can cause mutation. -// But just to be safe, we want to reject all unexpected forms. - -// We split the second stage into 4 regexp operations in order to work around -// crippling inefficiencies in IE's and Safari's regexp engines. First we -// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we -// replace all simple value tokens with ']' characters. Third, we delete all -// open brackets that follow a colon or comma or that begin the text. Finally, -// we look to see that the remaining characters are only whitespace or ']' or -// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if (/^[\],:{}\s]*$/ -.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') -.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') -.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { - -// In the third stage we use the eval function to compile the text into a -// JavaScript structure. The '{' operator is subject to a syntactic ambiguity -// in JavaScript: it can begin a block or an object literal. We wrap the text -// in parens to eliminate the ambiguity. - - j = eval('(' + text + ')'); - -// In the optional fourth stage, we recursively walk the new structure, passing -// each name/value pair to a reviver function for possible transformation. - - return typeof reviver === 'function' ? - walk({'': j}, '') : j; - } - -// If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError('JSON.parse'); - }; - } -}()); diff --git a/DeveloperAdoption/public/static/jsxgraphcore.js b/DeveloperAdoption/public/static/jsxgraphcore.js deleted file mode 100644 index c150316..0000000 --- a/DeveloperAdoption/public/static/jsxgraphcore.js +++ /dev/null @@ -1,26 +0,0 @@ -/* Version 0.83rc4 */ -/* - Copyright 2008-2011 - Matthias Ehmann, - Michael Gerhaeuser, - Carsten Miller, - Bianca Valentin, - Alfred Wassermann, - Peter Wilfahrt - - This file is part of JSXGraph. - - JSXGraph is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - JSXGraph is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with JSXGraph. If not, see . -*/ - var JXG={};(function(){var d,e;JXG.countDrawings=0;JXG.countTime=0;JXG.require=function(f){};JXG.rendererFiles=[];JXG.rendererFiles.svg="SVGRenderer";JXG.rendererFiles.vml="VMLRenderer";JXG.rendererFiles.canvas="CanvasRenderer";JXG.baseFiles=null;JXG.requirePath="";for(d=0;d0?h[0].length:0,w=h.length,v=this.matrix(q,p),u,t,x,r;for(u=0;u0?r[0].length:0;l=this.matrix(q,h);for(p=0;pz){z=d.abs(m[v][u]);h=v}}if(z<=e.Math.eps){return false}if(h>u){for(t=0;tm||j<0){return NaN}j=d.floor(j);m=d.floor(m);if(j===0||j===m){return 1}h=1;for(l=0;l0){return d.exp(h*d.log(d.abs(j)))}else{return NaN}}},squampow:function(k,j){var h;if(d.floor(j)===j){h=1;if(j<0){k=1/k;j*=-1}while(j!=0){if(j&1){h*=k}j>>=1;k*=k}return h}else{return this.pow(k,j)}},normalize:function(k){var h=2*k[3],l=k[4]/(h),m,j;k[5]=l;k[6]=-k[1]/h;k[7]=-k[2]/h;if(l===Infinity||isNaN(l)){m=d.sqrt(k[1]*k[1]+k[2]*k[2]);k[0]/=m;k[1]/=m;k[2]/=m;k[3]=0;k[4]=1}else{if(d.abs(l)>=1){k[0]=(k[6]*k[6]+k[7]*k[7]-l*l)/(2*l);k[1]=-k[6]/l;k[2]=-k[7]/l;k[3]=1/(2*l);k[4]=1}else{j=(l<=0)?(-1):(1);k[0]=j*(k[6]*k[6]+k[7]*k[7]-l*l)*0.5;k[1]=-j*k[6];k[2]=-j*k[7];k[3]=j/2;k[4]=j*l}}return k}}})(JXG,Math);JXG.Math.Numerics=(function(e,d){var f={rk4:{s:4,A:[[0,0,0,0],[0.5,0,0,0],[0,0.5,0,0],[0,0,1,0]],b:[1/6,1/3,1/3,1/6],c:[0,0.5,0.5,1]},heun:{s:2,A:[[0,0],[1,0]],b:[0.5,0.5],c:[0,1]},euler:{s:1,A:[[0]],b:[1],c:[0]}};return{Gauss:function(g,s){var u=e.Math.eps,h=g.length>0?g[0].length:0,q,t,r,p,m,l=function(v,n){var k=this[v];this[v]=this[n];this[n]=k};if((h!==s.length)||(h!==g.length)){throw new Error("JXG.Math.Numerics.Gauss: Dimensions don't match. A must be a square matrix and b must be of the same length as A.")}q=new Array(h);t=s.slice(0,h);for(r=0;rp;r--){if(d.abs(q[r][p])>u){if(d.abs(q[p][p])0?r[0].length:0;for(p=g-1;p>=0;p--){for(l=s-1;l>p;l--){h[p]-=r[p][l]*h[l]}h[p]/=r[p][p]}return h},gaussBareiss:function(v){var l,u,y,q,m,g,h,r,w,x=e.Math.eps;h=v.length;if(h<=0){return 0}if(v[0].length=x){break}}if(q==h){return 0}for(m=l;mr){r=g}v+=g;if(g>=B){g=d.atan2(2*h[s][q],h[s][s]-h[q][q])*0.5;t=d.sin(g);y=d.cos(g);for(p=0;pB&&u<2000);return[h,m]},NewtonCotes:function(g,k,h){var l=0,q=h&&typeof h.number_of_nodes==="number"?h.number_of_nodes:28,n={trapez:true,simpson:true,milne:true},r=h&&h.integration_type&&n.hasOwnProperty(h.integration_type)&&n[h.integration_type]?h.integration_type:"milne",p=(g[1]-g[0])/q,m,j,s;switch(r){case"trapez":l=(k(g[0])+k(g[1]))*0.5;m=g[0];for(j=0;j0){throw new Error("JSXGraph: INT_SIMPSON requires config.number_of_nodes dividable by 2.")}s=q/2;l=k(g[0])+k(g[1]);m=g[0];for(j=0;j0){throw new Error("JSXGraph: Error in INT_MILNE: config.number_of_nodes must be a multiple of 4")}s=q*0.25;l=7*(k(g[0])+k(g[1]));m=g[0];for(j=0;jm){q=this.D(p,j)(g);l+=2;if(d.abs(q)>m){g-=n/q}else{g+=(d.random()*0.2-1)}n=p.apply(j,[g]);l++;k++}return g},root:function(j,g,h){return this.fzero(j,g,h)},Neville:function(l){var h=[],g=function(m){return function(x,n){var q,w,y,z=e.Math.binomial,v=l.length,p=v-1,r=0,u=0;if(!n){y=1;for(q=0;q=0;m--){u[m]=(q[m]-(v[m+1]*u[m+1]))/p[m]}for(m=g-3;m>=0;m--){u[m+1]=u[m]}u[0]=0;u[g-1]=0;return u},splineEval:function(h,z,v,B){var k=d.min(z.length,v.length),p=1,m=false,A=[],r,q,w,u,t,s,g;if(e.isArray(h)){p=h.length;m=true}else{h=[h]}for(r=0;rz[k-1])){return NaN}for(q=1;q=0;k--){l=l.concat(["(",g[k].toPrecision(j),")"]);if(k>1){l=l.concat(["*",h,"",k,"<","/sup> + "])}else{if(k===1){l=l.concat(["*",h," + "])}}}return l.join("")},lagrangePolynomial:function(j){var g=[],h=function(w,l){var p,m,t,v,y,q=0,r=0,u,n;t=j.length;if(!l){for(p=0;p0&&e.isPoint(q[0])){j=1}else{throw new Error("JSXGraph: Can't create regressionPolynomial. Wrong parameters.")}}r=function(G,t){var w,v,D,A,F,u,E,H,C,z=q.length;C=d.floor(h());if(!t){if(j===1){n=[];m=[];for(w=0;w=0;w--){H=(H*G+g[w])}return H};r.getTerm=function(){return k};return r},bezier:function(j){var g,h=function(k){return function(m,l){var q=d.floor(m)*3,p=m%1,n=1-p;if(!l){g=d.floor(j.length/3)}if(m<0){return j[0][k]()}if(m>=g){return j[j.length-1][k]()}if(isNaN(m)){return NaN}return n*n*(n*j[q][k]()+3*p*j[q+1][k]())+(3*n*j[q+2][k]()+p*j[q+3][k]())*p*p}};return[h("X"),h("Y"),0,function(){return d.floor(j.length/3)}]},bspline:function(k,g){var l,n=[],m=function(s,p){var q,r=[];for(q=0;q=A){w=0}else{w=v[r+1]}y=B[r+u-1]-B[r];if(y==0){v[r]=0}else{v[r]=(z-B[r])/y*x}y=B[r+u]-B[r+1];if(y!=0){v[r]+=(B[r+u]-z)/y*w}}}return v},h=function(p){return function(w,r){var q=k.length,A,v,x,z=q-1,u=g;if(z<=0){return NaN}if(z+2<=u){u=z+1}if(w<=0){return k[0][p]()}if(w>=z-u+2){return k[z][p]()}l=m(z,u);x=d.floor(w)+u-1;n=j(w,l,z,u,x);A=0;for(v=x-u+1;v<=x;v++){if(v=0){A+=k[v][p]()*n[v]}}return A}};return[h("X"),h("Y"),0,function(){return k.length-1}]},D:function(k,l){var j=0.00001,g=1/(j*2);if(arguments.length==1||(arguments.length>1&&!e.exists(arguments[1]))){return function(h,m){return(k(h+j,m)-k(h-j,m))*g}}else{return function(h,m){return(k.apply(l,[h+j,m])-k.apply(l,[h-j,m]))*g}}},riemann:function(s,m,t,k,p){var l=[],A=[],r,q=0,z,w=k,u,h,v,g;m=d.floor(m);l[q]=w;A[q]=0;if(m>0){z=(p-k)/m;g=z*0.01;for(r=0;ru){u=v}}}}}}q++;l[q]=w;A[q]=u;q++;w+=z;if(t==="trapezodial"){u=s(w)}l[q]=w;A[q]=u;q++;l[q]=w;A[q]=0}}return[l,A]},riemannsum:function(p,k,r,j,l){var q=0,m,v,u=j,s,h,t,g;k=d.floor(k);if(k>0){v=(l-j)/k;g=v*0.01;for(m=0;ms){s=t}}}}}}}q+=v*s;u+=v}}return q},rungeKutta:function(g,H,p,m,G){var q=[],n=[],F=(p[1]-p[0])/m,v=p[0],J,E,D,B,A,C=H.length,w,u=[],z=0;if(e.isString(g)){g=f[g]||f.euler}w=g.s;for(J=0;J0){if(e.isArray(H)){return this.fminbr(G,[K,J],M)}else{return this.Newton(G,K,M)}}I=K;w=A;while(y=F&&d.abs(A)>d.abs(x)){t=I-J;if(K==I){l=x/A;v=t*l;s=1-l}else{s=A/w;l=x/w;k=x/A;v=k*(t*s*(s-l)-(J-K)*(l-1));s=(s-1)*(l-1)*(k-1)}if(v>0){s=-s}else{v=-v}if(v<(0.75*t*s-d.abs(F*s)*0.5)&&v0){m=F}else{m=-F}}K=J;A=x;J+=m;x=G.apply(M,[J]);B++;if((x>0&&w>0)||(x<0&&w<0)){I=K;w=A}y++}e.debug("fzero: maxiter="+g+" reached.");return J},fminbr:function(I,J,N){var M,K,m,u,s,h,k,j,A=(3-d.sqrt(5))*0.5,F=e.Math.eps,C=d.sqrt(e.Math.eps),g=50,E=0,z,L,H,n,D,B,y,l,G=0;if(!e.isArray(J)||J.length<2){throw new Error("JXG.Math.Numerics.fminbr: length of array x0 has to be at least two.")}M=J[0];K=J[1];u=M+A*(K-M);k=I.apply(N,[u]);G++;m=u;s=u;h=k;j=k;while(E=H){y=(m-s)*(h-k);B=(m-u)*(h-j);D=(m-u)*B-(m-s)*y;B=2*(B-y);if(B>0){D=-D}else{B=-B}if(d.abs(D)B*(M-m+2*H)&&D0){n=H}else{n=-H}}y=m+n;l=I.apply(N,[y]);G++;if(l<=h){if(y0){return this.sum(d)/d.length}else{return 0}};JXG.Math.Statistics.median=function(e){var f,d;if(e.length>0){f=e.slice(0,e.length);f.sort(function(h,g){return h-g});d=f.length;if(d%2==1){return f[parseInt(d*0.5)]}else{return(f[d*0.5-1]+f[d*0.5])*0.5}}else{return 0}};JXG.Math.Statistics.variance=function(f){var e,h,g,d;if(f.length>1){e=this.mean(f);h=0;for(g=0,d=f.length;g0){return this.mean(this.multiply(d,e))}else{return 0}};JXG.Math.Statistics.max=function(e){var g,f,d;if(e.length==0){return NaN}g=e[0];for(f=1,d=e.length;fg)?(e[f]):g}return g};JXG.Math.Statistics.min=function(e){var g,f,d;if(e.length==0){return NaN}g=e[0];for(f=1,d=e.length;f0){l=m[q].generatePolynomial();for(g=0;g0)){if((y.toOrigin!==e)&&(y.toOrigin!=null)&&C(y.toOrigin.id,n.listOfFreePoints)){k=y.toOrigin}else{k=n.listOfFreePoints[0]}v=k.symbolic.x;t=k.symbolic.y;for(D=0;D1)){if((y.to10!==e)&&(y.to10!=null)&&(y.to10.id!=y.toOrigin.id)&&C(y.to10.id,n.listOfFreePoints)){j=y.to10}else{if(n.listOfFreePoints[0].id==k.id){j=n.listOfFreePoints[1]}else{j=n.listOfFreePoints[0]}}p=d.Math.Geometry.rad([1,0],[0,0],[j.symbolic.x,j.symbolic.y]);E=Math.cos(-p);x=Math.sin(-p);for(D=0;Dd.Math.eps)){G=j.symbolic.x;for(D=0;Ds){l+=Math.PI}r=Math.cos(l)+q[1];p=Math.sin(l)+q[2];return new JXG.Coords(JXG.COORDS_BY_USER,[r,p],m)},reflection:function(q,m,f){var h=m.coords.usrCoords,r=q.point1.coords.usrCoords,g=q.point2.coords.usrCoords,e,l,d,j,n,k,p;if(!JXG.exists(f)){f=m.board}n=g[1]-r[1];k=g[2]-r[2];e=h[1]-r[1];l=h[2]-r[2];p=(n*l-k*e)/(n*n+k*k);d=h[1]+2*p*k;j=h[2]-2*p*n;return new JXG.Coords(JXG.COORDS_BY_USER,[d,j],f)},rotation:function(d,p,h,j){var l=p.coords.usrCoords,e=d.coords.usrCoords,g,n,k,q,f,m;if(!JXG.exists(j)){j=p.board}g=l[1]-e[1];n=l[2]-e[2];k=Math.cos(h);q=Math.sin(h);f=g*k-n*q+e[1];m=g*q+n*k+e[2];return new JXG.Coords(JXG.COORDS_BY_USER,[f,m],j)},perpendicular:function(s,q,j){var h=s.point1.coords.usrCoords,g=s.point2.coords.usrCoords,e=q.coords.usrCoords,n,m,l,r,k,f,d,p;if(!JXG.exists(j)){j=q.board}if(q==s.point1){n=h[1]+g[2]-h[2];m=h[2]-g[1]+h[1];l=true}else{if(q==s.point2){n=g[1]+h[2]-g[2];m=g[2]-h[1]+g[1];l=false}else{if(((Math.abs(h[1]-g[1])>JXG.Math.eps)&&(Math.abs(e[2]-(h[2]-g[2])*(e[1]-h[1])/(h[1]-g[1])-h[2])JXG.Math.eps&&(Math.abs(f[0])0){e=m.midpoint.Dist(z.point1);K=m.midpoint.Dist(z.point2);I=((e*e)+(D*D)-(K*K))/(2*D);B=(e*e)-(I*I);B=(B<0)?0:B;G=Math.sqrt(B);E=m.Radius();p=Math.sqrt((E*E)-G*G);C=J[1]-L[1];A=J[2]-L[2];k=g[1]+(G/D)*A;j=g[2]-(G/D)*C;e=(J[1]*A)-(J[2]*C);K=(k*C)+(j*A);F=(A*A)+(C*C);if(Math.abs(F)r){return[0]}else{if(v=d&&Math.abs(e[3])=d){return this.meetLineCircle(g,e,f,h)}else{return this.meetCircleCircle(g,e,f,h)}}}},meetLineLine:function(e,d,f,h){var g=JXG.Math.crossProduct(e,d);if(Math.abs(g[0])>JXG.Math.eps){g[1]/=g[0];g[2]/=g[0];g[0]=1}return new JXG.Coords(JXG.COORDS_BY_USER,g,h)},meetLineCircle:function(j,e,p,q){var v,u,s,r,l,h,g,f,m,w;if(e[4]=0){m=Math.sqrt(m);w=[(-g+m)/(2*h),(-g-m)/(2*h)];return((p==0)?new JXG.Coords(JXG.COORDS_BY_USER,[-w[0]*(-l[1])-r*l[0],-w[0]*l[0]-r*l[1]],q):new JXG.Coords(JXG.COORDS_BY_USER,[-w[1]*(-l[1])-r*l[0],-w[1]*l[0]-r*l[1]],q))}else{return new JXG.Coords(JXG.COORDS_BY_USER,[NaN,NaN],q)}},meetCircleCircle:function(f,d,e,g){var h;if(f[4]JXG.Math.eps&&m<10){B=A(q);z=-y(p);x=k(q);w=-j(p);g=B*w-z*x;q-=(w*v-z*u)/g;p-=(B*u-x*v)/g;v=t.X(q)-s.X(p);u=t.Y(q)-s.Y(p);r=v*v+u*u;m++}arguments.callee.t1memo=q;arguments.callee.t2memo=p;if(Math.abs(q)0.1&&Math.abs(f-g.X(l))>0.1&&Math.abs(d-g.Y(l))>0.1)){v=20;w=(g.maxX()-g.minX())/v;x=g.minX();for(u=0;u0.1&&Math.abs(f-g.X(l))>0.1&&Math.abs(d-g.Y(l))>0.1){break}x+=w}}p=l;arguments.callee.t2memo=p}if(Math.abs(h(p))>JXG.Math.eps){k=0}else{k=1}return(new JXG.Coords(JXG.COORDS_BY_USER,[k,g.X(p),g.Y(p)],j))},projectPointToCircle:function(m,d,f){var j=m.coords.distance(JXG.COORDS_BY_USER,d.midpoint.coords),e=m.coords.usrCoords,g=d.midpoint.coords.usrCoords,l,k,h;if(!JXG.exists(f)){f=m.board}if(Math.abs(j)r.maxX()){q=r.minX()+q-r.maxX()}C=new JXG.Coords(JXG.COORDS_BY_USER,[r.X(q),r.Y(q)],h)}else{if(r.curveType=="plot"){B=p;for(v=0;v=JXG.Math.eps){g=(A*z+e*d)/k;s=Math.sqrt(A*A+e*e-g*(A*z+e*d))}else{g=0;s=Math.sqrt(A*A+e*e)}if(g>=0&&g<=1&&sJXG.Math.eps){for(h=2;h>0;h--){v[l][h]/=v[l][0]}v[l][0]=1}}e=false;d=false;if(!r&&q.scrCoords[1]>=0&&q.scrCoords[1]<=g.board.canvasWidth&&q.scrCoords[2]>=0&&q.scrCoords[2]<=g.board.canvasHeight){e=true}if(!f&&p.scrCoords[1]>=0&&p.scrCoords[1]<=g.board.canvasWidth&&p.scrCoords[2]>=0&&p.scrCoords[2]<=g.board.canvasHeight){d=true}if(Math.abs(v[1][0])g.board.canvasHeight){k=v[2]}else{k=v[3]}}else{if(v[1][2]>g.board.canvasHeight){m=v[2];if(v[3][2]<0){k=v[0]}else{k=v[3]}}else{m=v[1];if(v[3][2]<0){k=v[0]}else{if(v[3][2]>g.board.canvasHeight){k=v[2]}else{k=v[3]}}}}}}m=new JXG.Coords(JXG.COORDS_BY_SCREEN,m.slice(1),g.board);k=new JXG.Coords(JXG.COORDS_BY_SCREEN,k.slice(1),g.board);if(!e&&!d){if(!r&&f&&!this.isSameDirection(q,p,m)&&!this.isSameDirection(q,p,k)){return}else{if(r&&!f&&!this.isSameDirection(p,q,m)&&!this.isSameDirection(p,q,k)){return}}}if(!e){if(!d){if(this.isSameDirection(q,p,m)){if(!this.isSameDirection(q,p,k)){t=m;u=k}else{if(JXG.Math.Geometry.affineDistance(p.usrCoords,m.usrCoords)=0&&k>=0){if((d>=0&&j>=0)||(d<=0&&j<=0)){g=true}}else{if(e<=0&&k<=0){if((d>=0&&j>=0)||(d<=0&&j<=0)){g=true}}}return g},updateTicks:function(e,g,d,h,f){},removeTicks:function(d){this.remove(this.getElementById(d.id+"_ticks"))},drawCurve:function(d){this.appendChildPrim(this.createPrim("path",d.id),d.layer);this.appendNodesToElement(d,"path");this.updateVisual(d,{shadow:true},true);this.updateCurve(d)},updateCurve:function(d){this.updateVisual(d);this.updatePathPrim(d.rendNode,this.updatePathStringPrim(d),d.board);this.makeArrows(d)},drawCircle:function(d){this.appendChildPrim(this.createPrim("ellipse",d.id),d.layer);this.appendNodesToElement(d,"ellipse");this.updateCircle(d)},updateCircle:function(e){this.updateVisual(e);var d=e.Radius();if(d>0&&!isNaN(d+e.midpoint.coords.scrCoords[1]+e.midpoint.coords.scrCoords[2])&&d*e.board.stretchX<20000){this.updateEllipsePrim(e.rendNode,e.midpoint.coords.scrCoords[1],e.midpoint.coords.scrCoords[2],(d*e.board.stretchX),(d*e.board.stretchY))}},drawPolygon:function(d){this.appendChildPrim(this.createPrim("polygon",d.id),d.layer);this.appendNodesToElement(d,"polygon");this.updatePolygon(d)},updatePolygon:function(d){this.updateVisual(d,{stroke:true,dash:true});this.updatePolygonPrim(d.rendNode,d)},drawText:function(d){var e;if(d.display=="html"){e=this.container.ownerDocument.createElement("div");e.style.position="absolute";e.style.color=d.visProp.strokeColor;e.className="JXGtext";e.style.zIndex="10";this.container.appendChild(e);e.setAttribute("id",this.container.id+"_"+d.id)}else{e=this.drawInternalText(d)}e.style.fontSize=d.board.options.text.fontSize+"px";d.rendNode=e;d.htmlStr="";this.updateText(d)},drawInternalText:function(d){},updateText:function(d){if(!d.visProp.visible){return}if(isNaN(d.coords.scrCoords[1]+d.coords.scrCoords[2])){return}this.updateTextStyle(d);if(d.display=="html"){d.rendNode.style.left=(d.coords.scrCoords[1])+"px";d.rendNode.style.top=(d.coords.scrCoords[2]-this.vOffsetText)+"px";d.updateText();if(d.htmlStr!=d.plaintextStr){d.rendNode.innerHTML=d.plaintextStr;if(d.board.options.text.useASCIIMathML){AMprocessNode(d.rendNode,false)}d.htmlStr=d.plaintextStr;if(d.board.options.text.useMathJax){MathJax.Hub.Typeset(d.rendNode)}}this.transformImage(d,d.transformations)}else{this.updateInternalText(d)}},updateInternalText:function(d){},updateTextStyle:function(e){var d;if(e.visProp.fontSize){if(typeof e.visProp.fontSize=="function"){d=e.visProp.fontSize();e.rendNode.style.fontSize=(d>0?d:0)}else{e.rendNode.style.fontSize=(e.visProp.fontSize)}}},drawImage:function(d){},updateImageURL:function(d){},updateImage:function(d){this.updateRectPrim(d.rendNode,d.coords.scrCoords[1],d.coords.scrCoords[2]-d.size[1],d.size[0],d.size[1]);this.updateImageURL(d);this.transformImage(d,d.transformations);this.updateVisual(d,{stroke:true,dash:true},true)},joinTransforms:function(d,n){var g=[[1,0,0],[0,1,0],[0,0,1]],l=[[1,0,0],[-d.board.origin.scrCoords[1],1,0],[-d.board.origin.scrCoords[2],0,1]],k=[[1,0,0],[0,1/d.board.stretchX,0],[0,0,-1/d.board.stretchY]],e=[[1,0,0],[0,d.board.stretchX,0],[0,0,-d.board.stretchY]],f=[[1,0,0],[d.board.origin.scrCoords[1],1,0],[d.board.origin.scrCoords[2],0,1]],h,j=n.length;for(h=0;hs.usrCoords[1]){y=n-1;break}}m=Math.ceil(s.usrCoords[2]);e=0;for(n=0;n<=p+1;n++){if(m-n/pg.usrCoords[2]){f=n-1;break}}x=Math.round((1/q)*t.stretchX);w=Math.round((1/p)*t.stretchY);u=new JXG.Coords(JXG.COORDS_BY_USER,[Math.ceil(g.usrCoords[1])-h/q,Math.floor(g.usrCoords[2])+f/p],t);r=new JXG.Coords(JXG.COORDS_BY_USER,[Math.floor(s.usrCoords[1])+y/q,Math.ceil(s.usrCoords[2])-e/p],t);v=this.drawVerticalGrid(u,r,x,t);this.appendChildPrim(v,t.options.layer.grid);if(!t.options.grid.snapToGrid){d=new Object();d.visProp={};d.rendNode=v;d.elementClass=JXG.OBJECT_CLASS_LINE;d.id="gridx";JXG.clearVisPropOld(d);this.setObjectStrokeColor(d,t.options.grid.gridColor,t.options.grid.gridOpacity)}else{d=new Object();d.visProp={};d.rendNode=v;d.elementClass=JXG.OBJECT_CLASS_LINE;d.id="gridx";JXG.clearVisPropOld(d);this.setObjectStrokeColor(d,"#FF8080",0.5)}this.setPropertyPrim(v,"stroke-width","0.4px");if(t.options.grid.gridDash){this.setGridDash("gridx")}v=this.drawHorizontalGrid(u,r,w,t);this.appendChildPrim(v,t.options.layer.grid);if(!t.options.grid.snapToGrid){d=new Object();d.visProp={};d.rendNode=v;d.elementClass=JXG.OBJECT_CLASS_LINE;d.id="gridy";JXG.clearVisPropOld(d);this.setObjectStrokeColor(d,t.options.grid.gridColor,t.options.grid.gridOpacity)}else{d=new Object();d.visProp={};d.rendNode=v;d.elementClass=JXG.OBJECT_CLASS_LINE;d.id="gridy";JXG.clearVisPropOld(d);this.setObjectStrokeColor(d,"#FF8080",0.5)}this.setPropertyPrim(v,"stroke-width","0.4px");if(t.options.grid.gridDash){this.setGridDash("gridy")}},removeGrid:function(d){this.remove(this.getElementById("gridx"));this.remove(this.getElementById("gridy"));d.options.grid.hasGrid=false},hide:function(d){},show:function(d){},setObjectStrokeWidth:function(e,d){},setObjectStrokeColor:function(f,d,e){},setObjectFillColor:function(f,d,e){},setDraft:function(e){if(!e.visProp.draft){return}var d=e.board.options.elements.draft.color,f=e.board.options.elements.draft.opacity;if(e.type==JXG.OBJECT_TYPE_POLYGON){this.setObjectFillColor(e,d,f)}else{if(e.elementClass==JXG.OBJECT_CLASS_POINT){this.setObjectFillColor(e,d,f)}else{this.setObjectFillColor(e,"none",0)}this.setObjectStrokeColor(e,d,f);this.setObjectStrokeWidth(e,e.board.options.elements.draft.strokeWidth)}},removeDraft:function(d){if(d.type==JXG.OBJECT_TYPE_POLYGON){this.setObjectFillColor(d,d.visProp.fillColor,d.visProp.fillColorOpacity)}else{if(d.type==JXG.OBJECT_CLASS_POINT){this.setObjectFillColor(d,d.visProp.fillColor,d.visProp.fillColorOpacity)}this.setObjectStrokeColor(d,d.visProp.strokeColor,d.visProp.strokeColorOpacity);this.setObjectStrokeWidth(d,d.visProp.strokeWidth)}},highlight:function(e){var d;if(!e.visProp.draft){if(e.type==JXG.OBJECT_CLASS_POINT){this.setObjectStrokeColor(e,e.visProp.highlightStrokeColor,e.visProp.highlightStrokeOpacity);this.setObjectFillColor(e,e.visProp.highlightStrokeColor,e.visProp.highlightStrokeOpacity)}else{if(e.type==JXG.OBJECT_TYPE_POLYGON){this.setObjectFillColor(e,e.visProp.highlightFillColor,e.visProp.highlightFillOpacity);for(d=0;d=JXG.Math.eps){e=(h*g+u*s)/t;q=h*h+u*u-e*(h*g+u*s)}else{e=0;q=h*h+u*u}if(e<0){q=h*h+u*u}else{if(e>1){h=v[1]-w[1];u=v[2]-w[2];q=h*h+u*u}}if(q>r){r=q;p=l}}return[Math.sqrt(r),p]},RDP:function(k,h,g,e,f){var d=this.findSplit(k,h,g);if(d[0]>e){this.RDP(k,h,d[1],e,f);this.RDP(k,d[1],g,e,f)}else{f.push(k[g])}},RamenDouglasPeuker:function(j,e){var g=[],h,f,d;d=j.length;h=0;while(hh&&isNaN(j[f].scrCoords[1]+j[f].scrCoords[2])){f--}if(!(h>f||h==d)){g[0]=j[h];this.RDP(j,h,f,e,g)}return g},setShadow:function(d){},updatePathStringPoint:function(f,d,e){},evaluate:function(d){if(JXG.isFunction(d)){return d()}else{return d}},setBuffering:function(){}}};JXG.FileReader=new function(){this.parseFileContent=function(d,f,h){this.request=false;var g;try{this.request=new XMLHttpRequest();if(h.toLowerCase()=="raw"){this.request.overrideMimeType("text/plain; charset=iso-8859-1")}else{this.request.overrideMimeType("text/xml; charset=iso-8859-1")}}catch(g){try{this.request=new ActiveXObject("Msxml2.XMLHTTP")}catch(g){try{this.request=new ActiveXObject("Microsoft.XMLHTTP")}catch(g){this.request=false}}}if(!this.request){alert("AJAX not activated!");return}this.request.open("GET",d,true);if(h.toLowerCase()=="raw"){this.cbp=function(){var e=this.request;if(e.readyState==4){f(e.responseText)}}}else{this.cbp=function(){var e=this.request;if(e.readyState==4){var j="";if(typeof e.responseStream!="undefined"&&(e.responseText.slice(0,2)=="PK"||JXG.Util.asciiCharCodeAt(e.responseText.slice(0,1),0)==31)){j=JXG.Util.Base64.decode(BinFileReader(e))}else{j=e.responseText}this.parseString(j,f,h,false)}}}this.cb=JXG.bind(this.cbp,this);this.request.onreadystatechange=this.cb;try{this.request.send(null)}catch(g){throw new Error("JSXGraph: problems opening "+d+" !")}};this.cleanWhitespace=function(d){var e=d.firstChild;while(e!=null){if(e.nodeType==3&&!/\S/.test(e.nodeValue)){d.removeChild(e)}else{if(e.nodeType==1){this.cleanWhitespace(e)}}e=e.nextSibling}};this.stringToXMLTree=function(e){if(typeof DOMParser=="undefined"){DOMParser=function(){};DOMParser.prototype.parseFromString=function(h,j){if(typeof ActiveXObject!="undefined"){var g=new ActiveXObject("MSXML.DomDocument");g.loadXML(h);return g}}}var f=new DOMParser();var d=f.parseFromString(e,"text/xml");this.cleanWhitespace(d);return d};this.parseString=function(h,f,j,e){var d,g;if(j.toLowerCase()=="cdy"||j.toLowerCase()=="cinderella"){if(e){h=JXG.Util.Base64.decode(h)}h=JXG.CinderellaReader.readCinderella(h,f);f.xmlString=h;return}if(j.toLowerCase()=="graph"){h=JXG.GraphReader.readGraph(h,f,false);return}if(j.toLowerCase()=="digraph"){h=JXG.GraphReader.readGraph(h,f,true);return}if(j.toLowerCase()=="geonext"){h=JXG.GeonextReader.prepareString(h)}if(j.toLowerCase()=="geogebra"){e=h.slice(0,2)!=="PK";h=JXG.GeogebraReader.prepareString(h,e)}if(j.toLowerCase()=="intergeo"){if(e){h=JXG.Util.Base64.decode(h)}h=JXG.IntergeoReader.prepareString(h)}f.xmlString=h;d=this.stringToXMLTree(h);this.readElements(d,f,j)};this.readElements=function(d,e,f){if(f.toLowerCase()=="geonext"){e.suspendUpdate();if(d.getElementsByTagName("GEONEXT").length!=0){JXG.GeonextReader.readGeonext(d,e)}e.unsuspendUpdate()}else{if(d.getElementsByTagName("geogebra").length!=0){JXG.GeogebraReader.readGeogebra(d,e)}else{if(f.toLowerCase()=="intergeo"){JXG.IntergeoReader.readIntergeo(d,e)}}}}};if(/msie/i.test(navigator.userAgent)&&!/opera/i.test(navigator.userAgent)){document.write(' - - - - -
    - -
    -

    Save As

    - -
    - -
    -
    - - -
    - -
    Submit
    - - Cancel -
    -
    - - - diff --git a/DeveloperAdoption/public/static/runappios43c/docactions.html b/DeveloperAdoption/public/static/runappios43c/docactions.html deleted file mode 100644 index fb86a48..0000000 --- a/DeveloperAdoption/public/static/runappios43c/docactions.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - -
    - -
    -
    Home
    -
    - -
    - -
    View
    -
    Delete
    - - -
    - -
    - - - - - diff --git a/DeveloperAdoption/public/static/runappios43c/dropbox.html b/DeveloperAdoption/public/static/runappios43c/dropbox.html deleted file mode 100644 index d457fba..0000000 --- a/DeveloperAdoption/public/static/runappios43c/dropbox.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - -
    -
    -
    -
    -
    Close
    -
    -
    -
    - -
    - -
    -
    -
    - - -
    -

    Sign in to Dropbox

    -
    -
    -
    - - diff --git a/DeveloperAdoption/public/static/runappios43c/dropboxList.html b/DeveloperAdoption/public/static/runappios43c/dropboxList.html deleted file mode 100644 index 8eeca7e..0000000 --- a/DeveloperAdoption/public/static/runappios43c/dropboxList.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - -
    - -
    -
    -
    - -
    Back
    -
    -
    -
    Move from Dropbox to Local
    -
    - -
    - -
    -
    -
    - -
    - -
      - -
    - - -
    -
    - - diff --git a/DeveloperAdoption/public/static/runappios43c/dropboxSaveLocal.html b/DeveloperAdoption/public/static/runappios43c/dropboxSaveLocal.html deleted file mode 100644 index 87234b8..0000000 --- a/DeveloperAdoption/public/static/runappios43c/dropboxSaveLocal.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - -
    - -
    - -
    -
    -
    Home
    -
    Back
    -
    - -
    -
    - Save from Dropbox to Local -
    -
    - -
    - -
    -
    - -
    -
    -
    - -
    - - - diff --git a/DeveloperAdoption/public/static/runappios43c/email.html b/DeveloperAdoption/public/static/runappios43c/email.html deleted file mode 100644 index 4d72fd2..0000000 --- a/DeveloperAdoption/public/static/runappios43c/email.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - -
    -
    - -
    -

    Email

    - -
    - - -
    -
    - - -
    -
    - - -
    - -
    - - - -
    - -
    -
    - -
    -
    - - - - diff --git a/DeveloperAdoption/public/static/runappios43c/file.html b/DeveloperAdoption/public/static/runappios43c/file.html deleted file mode 100644 index cda9282..0000000 --- a/DeveloperAdoption/public/static/runappios43c/file.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - -
    - - -
    -
    -
    -
    Home
    -
    -
    - Login to server -
    Logout from server
    -
    - -
    - -
    Login to Dropbox
    -
    Logout from Dropbox
    -
    -
    -
    - - -
    - - -
    - Local Storage -
    Save
    -
    Save As
    - - - List Files -
    - -
    - Dropbox - -
    Move to Dropbox
    - -
    List in Dropbox
    - - -
    - - -
    - Server - -
    Move files to server
    -
    List files in server
    - - -
    - -
    - Settings -
    -
    - - -
    -
    - - -
    -
    - Donate -
    -
    - - - - -
    -
    -
    - - - - - - -
    -
    - - - - - diff --git a/DeveloperAdoption/public/static/runappios43c/help.html b/DeveloperAdoption/public/static/runappios43c/help.html deleted file mode 100644 index ef1346b..0000000 --- a/DeveloperAdoption/public/static/runappios43c/help.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - -

    Show Help Here

    - - - -
    - diff --git a/DeveloperAdoption/public/static/runappios43c/index.html b/DeveloperAdoption/public/static/runappios43c/index.html deleted file mode 100644 index f3a963a..0000000 --- a/DeveloperAdoption/public/static/runappios43c/index.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - - - HelloWorld - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    -
    -
    -

    Email

    -

    Print

    -

    File

    -
    -
    - - - - -
    - Editing: default - - -
    - -
    - -
    - - -
    -
    - -
    editor goes here
    - - -
    - - - - - - - -
    - -
    -    -
    -

    Intro

    -

    Terms

    -

    Income
    Stat 1

    -

    Income
    Stat 2

    -

    Balance
    Sheet

    -

    Cash Flow
    Statement

    -

    Profit Loss
    Projection 1

    -

    Profit Loss
    Projection 2

    -
       -
    -
    - -
    - - - diff --git a/DeveloperAdoption/public/static/runappios43c/js/filedrag.js b/DeveloperAdoption/public/static/runappios43c/js/filedrag.js deleted file mode 100644 index 8ccbd67..0000000 --- a/DeveloperAdoption/public/static/runappios43c/js/filedrag.js +++ /dev/null @@ -1,86 +0,0 @@ -(function() { - - // getElementById - function $id(id) { - return document.getElementById(id); - } - - - // output information - function Output(msg) { - var m = $id("messages"); - m.innerHTML = msg + m.innerHTML; - } - - - // file drag hover - function FileDragHover(e) { - e.stopPropagation(); - e.preventDefault(); - e.target.className = (e.type == "dragover" ? "hover" : ""); - } - - - // file selection - function FileSelectHandler(e) { - - // cancel event and hover styling - FileDragHover(e); - - // fetch FileList object - var files = e.target.files || e.dataTransfer.files; - - // process all File objects - for (var i = 0, f; f = files[i]; i++) { - ParseFile(f); - } - - } - - - // output file information - function ParseFile(file) { - - Output( - "

    File information: " + file.name + - " type: " + file.type + - " size: " + file.size + - " bytes

    " - ); - - } - - - // initialize - function Init() { - - var fileselect = $id("fileselect"), - filedrag = $id("filedrag"), - submitbutton = $id("submitbutton"); - - // file select - fileselect.addEventListener("change", FileSelectHandler, false); - - // is XHR2 available? - var xhr = new XMLHttpRequest(); - if (xhr.upload) { - - // file drop - filedrag.addEventListener("dragover", FileDragHover, false); - filedrag.addEventListener("dragleave", FileDragHover, false); - filedrag.addEventListener("drop", FileSelectHandler, false); - filedrag.style.display = "block"; - - // remove submit button - submitbutton.style.display = "none"; - } - - } - - // call initialization file - if (window.File && window.FileList && window.FileReader) { - Init(); - } - - -})(); \ No newline at end of file diff --git a/DeveloperAdoption/public/static/runappios43c/js/stock/msndatasource.js b/DeveloperAdoption/public/static/runappios43c/js/stock/msndatasource.js deleted file mode 100644 index 984deca..0000000 --- a/DeveloperAdoption/public/static/runappios43c/js/stock/msndatasource.js +++ /dev/null @@ -1,299 +0,0 @@ - - -if (!AspiringStock) { - AspiringStock = {}; -} - -AspiringStock.msn = { -}; - -AspiringStock.msn.numtextrows = 1; - - -AspiringStock.msn.isFinancials = function(tab, type) { - return false; -}; - - -AspiringStock.msn.xbrlmap = { - "Period End Date" : "PeriodEndDate", - "Period Length" : "PeriodLength", - "Stmt Source" : "StmtSource", - "Stmt Source Date" : "StmtSourceDate", - "Stmt Update Type" : "StmtUpdateType", -// balance sheet -// "Cash and Short Term Investments" : "CashCashEquivalentsAndShortTermInvestments", - "Cash and Short Term Investments" : "CashAndEquivalents", - "Cash & Equivalents" : "CashEquivalents", - "Short Term Investments" : "ShortTermInvestments", - "Total Receivables, Net" : "AccountsReceivableNet", - "Accounts Receivable - Trade, Net" : "AccountsReceivableNet", - "Accounts Receivable - Trade, Gross" : "AccountsReceivableGross", - "Provision for Doubtful Accounts" : "ProvisionForDoubtfulAccounts", - - "Total Inventory" : "InventoryNet", - "Prepaid Expenses" : "PrepaidExpenses", - "Other Current Assets, Total" : "OtherCurrentAssets", - "Total Current Assets" : "TotalCurrentAssets", - "Property/Plant/Equipment, Total - Net" : "PropertyPlantAndEquipmentNet", - "Goodwill, Net" : "IntangibleAssetsGoodwill", - "Intangibles, Net" : "IntangibleAssetsExcludingGoodwillNet", - "Long Term Investments" : "LongTermInvestments", - "Note Receivable - Long Term" : "NoteReceivableLongTerm", - "Other Long Term Assets, Total" : "OtherAssetsNoncurrent", - "Other Assets, Total" : "OtherAssets", - " Total Assets" : "Assets", - "Accounts Payable" : "AccountsPayable", - "Payable/Accrued" : "AccruedPayable", - "Accrued Expenses" : "AccruedExpenses", - "Notes Payable/Short Term Debt" : "ShortTermDebtAmount", - "Current Port. of LT Debt/Capital Leases" : "CurrentPortionLongTermDebt", - "Other Current Liabilities, Total" : "OtherSundryLiabilitiesCurrent", - "Total Current Liabilities" : "LiabilitiesCurrent", - "Total Long Term Debt" : "LongTermDebt", - "Long Term Debt" : "LongTermDebtSubItem", - "Deferred Income Tax" : "DeferredIncomeTaxes", - "Minority Interest" : "MinorityInterestBalanceSheet", - "Other Liabilities, Total" : "OtherNoncurrentLiabilities", - "Total Liabilities" : "TotalLiabilities", - "Redeemable Preferred Stock" : "RedeemablePreferredStock", - "Preferred Stock - Non Redeemable, Net" : "NonRedeemablePreferredStock", - "Common Stock" : "StockholdersEquityClassCommonStock", - "Additional Paid-In Capital" : "AdditionalPaidCapital", - "Retained Earnings (Accumulated Deficit)" : "RetainedEarnings", - "Treasury Stock - Common" : "TreasuryStock", - "Other Equity, Total" : "OtherEquity", - "Total Equity" : "TotalEquity", - "Total Liabilities & Shareholders' Equity" : "LiabilitiesStockholdersEquity", - "Total Common Shares Outstanding" : "CommonStockSharesOutstanding", - "Total Preferred Shares Outstanding" : "PreferredStockSharesOutstanding", -//# income - "Total Revenue" : "OperatingRevenue", - "Revenue" : "RevenueSubItem", - "Other Revenue, Total" : "OtherRevenueTotal", - "Cost of Revenue, Total" : "CostOfRevenue", - "Gross Profit" : "GrossProfit", - // "Selling/General/Administrative Expenses" : "SellingGeneralAndAdministrativeExpense", - "Selling/General/Administrative Expenses, Total" : "SellingGeneralAndAdministrativeExpense", - "Research & Development" : "ResearchAndDevelopmentExpense", - "Depreciation/Amortization" : "DepreciationAndAmortization", - "Interest Expense (Income), Net Operating" : "TotalInterestExpense", - "Unusual Expense (Income)" : "OtherUnusualExpense", - "Other Operating Expenses, Total" : "OtherOperatingExpense", - "Operating Income" : "OperatingProfit", - "Interest Income (Expense), Net Non-Operating" : "InterestIncomeExpenseNet", - "Gain (Loss) on Sale of Assets" : "GainLossOnSaleOfOtherAssets", - "Other, Net" : "OtherIncomeLossNet", - "Income Before Tax" : "IncomeLossContinuingOperationsBeforeIncomeTaxes", - "Income Tax - Total" : "ProvisionIncomeTaxes", - "Income After Tax" : "IncomeAfterTax", - "Minority Interest" : "MinorityInterest", - "Equity In Affiliates" : "InvestmentAffiliates", - "U.S. GAAP Adjustment" : "UsGaapAdjustment", - "Net Income Before Extra. Items" : "NetIncomeBeforeExtraItems", - "Total Extraordinary Items" : "ExtraordinaryItemsGross" , - "Net Income" : "NetIncome", - "Total Adjustments to Net Income" : "AdjustmentsToNetIncome", - "Preferred Dividends" : "PreferredDividends", - "General Partners' Distributions" : "GeneralPartnersDistributions", - "Basic Weighted Average Shares" : "BasicSharesOutstanding", - "Basic EPS Excluding Extraordinary Items" : "EarningsPerShareBasicExclExtraItems", - "Basic EPS Including Extraordinary Items" : "EarningsPerShareBasicInclExtraItems", - "Diluted Weighted Average Shares" : "DilutedSharesOutstanding", - "Diluted EPS Excluding Extrordinary Items" : "DilutedEarningsPerShareNetIncomeExclExtraItems", - "Diluted EPS Including Extraordinary Items" : "DilutedEarningsPerShareNetIncomeInclExtraItems", - "Dividends per Share - Common Stock Primary Issue" : "CashDividendsPaidPerShare", - "Gross Dividends - Common Stock" : "PaymentsOfDividends", -//# "Interest Expense, Supplemental" : "SupplementalInterestExpense" - "Depreciation, Supplemental" : "SupplementalDepreciationAmortization", - "Normalized EBITDA" : "NormalizedEBITDA", - "Normalized EBIT" : "NormalizedEBIT", - "Normalized Income Before Tax" : "NormalizedIncomeBeforeTax", - "Normalized Income After Taxes" : "NormalizedIncomeAfterTax", - "Normalized Income Available to Common" : "NormalizedIncomeAvailableToCommonShareholders", - "Basic Normalized EPS" : "BasicNormalizedEarningsPerShare", - "Diluted Normalized EPS" : "DilutedNormalizedEarningsPerShare", - "Amortization of Intangibles" : "AmortizationOfIntangibles", -//# cashflow - "Net Income/Starting Line" : "NetIncomeStartingLine", - "Depreciation/Depletion" : "Depreciation", - "Amortization" : "Amortization", - "Deferred Taxes" : "DeferredIncomeTaxes", - "Non-Cash Items" : "NonCashItems", - "Unusual Items" : "NonCashItems-UnusualItems", - "Other Non-Cash Items" : "NonCashItems-OtherNonCashItems", - "Changes in Working Capital" : "ChangesinWorkingCapital", - "Accounts Receivable" : "ChangesinWorkingCapital-Accounts Receivable", - "Other Assets" : "ChangesinWorkingCapital-OtherAssets", - "Other Liabilities" : "ChangesinWorkingCapital-OtherLiabilities", - "Cash from Operating Activities" : "NetCashFlowsProvidedUsedOperatingActivities", - "Capital Expenditures" : "CapitalExpenditures", - "Purchase of Fixed Assets" : "CapitalExpenditures-PurchaseFixedAssets", - "Other Investing Cash Flow Items, Total" : "OtherInvestmentCashFlowItems", - "Acquisition of Business" : "AcquisitionOfBusiness", - "Sale/Maturity of Investment" : "SaleMaturityOfInvestment", - "Purchase of Investments" : "PurchaseOfInvestments", - "Other Investing Cash Flow" : "OtherInvestingCashFlow", - "Cash from Investing Activities" : "TotalCashInvesting", - "Financing Cash Flow Items" : "FinancingCashFlowItems", - "Other Financing Cash Flow" : "OtherFinancingCashFlow", - "Total Cash Dividends Paid" : "PaymentDividends", - // "Issuance (Retirement) of Stock, Net" : "IssueRetirementOfCommonStockNet", - "Issuance (Retirement) of Stock, Net" : "IssueStock", -// "Issuance (Retirement) of Debt, Net" : "NetIssueRetirementOfDebt", - "Issuance (Retirement) of Debt, Net" : "RepayDebt", - "Cash from Financing Activities" : "NetCashFlowsProvidedUsedFinancingActivities", - "Foreign Exchange Effects" : "ForeignExchangeEffects", - "Net Change in Cash" : "NetIncreaseDecreaseCashCashEquivalents", - "Net Cash - Beginning Balance" : "NetCashBeginningBalance", - "Net Cash - Ending Balance" : "NetCashEndingBalance" -} - - -AspiringStock.msn.urlbase = "http://investing.money.msn.com/investments"; - - -AspiringStock.msn.getUrl = function(ticker, type, period) { - var maptype = { "Income":"/stock-income-statement/", - "Balance":"/stock-balance-sheet/", - "CashFlow":"/stock-cash-flow/" - }; - url = AspiringStock.msn.urlbase+maptype[type]+"?symbol="+ticker+"&stmtView="+period; - console.log("loading ticker "+ticker); - console.log("url is:"+url); - return url; -}; - -AspiringStock.msn.getTable = function(table) { - //console.log(table); - var tab = new Array(); - var rows = table.getElementsByTagName('tr'); - //alert(rows.length); - if (rows.length < 8) { - return null; - } - for (var i=0; i 0) { - continue; - } else { - // get all the columns - var r = new Array(); - var cols = row.getElementsByTagName('td'); - for (var j=0; j 0) { - val = spans[0].innerHTML; - } else { - val = col.innerHTML; - } - val = AspiringStock.cleanString(val); - //normalize later - //if (j == 0) { - // var newval = AspiringStock.xbrlmap[val]; - // if (newval != null) { - // val = newval; - // } - //} - r.push(val); - } - // if all cols are nbsp, then skip this row entirely - if (AspiringStock.isNbspRow(r) != true) { - tab.push(r); - } - } - } - - return tab; -}; - -AspiringStock.msn.analyzeStatement = function(text) { - - var tab = null; - // strip out scripts - text = AspiringStock.stripScripts(text); - //alert(text); - //console.log(text); - - // load into a div in dom - - var tempdiv = document.getElementById("tickAnalyzerDiv"); - if (tempdiv == null) { - console.log("creating div") - tempdiv = document.createElement("div"); - tempdiv.id = "tickAnalyzerDiv"; - tempdiv.style.display = "none"; - } - - tempdiv.innerHTML = text; - - // console.log("in 1"); - // walk it to get the table - tables = tempdiv.getElementsByClassName('ftable'); - //alert(tables.length); - if (tables.length >=1 ) { - //alert(tables[1].innerHTML); - tab = AspiringStock.msn.getTable(tables[1]); - //console.log("in 2"); - AspiringStock.dumpTable(tab); - } else { - // there is a problem - // will return null in this case - } - - // print the table in tabular form - - - - return tab; -}; - -AspiringStock.msn.normalizeTable = function(tab, type) { -// convert the MSN table data into a normalized form -// - var map = {}; - - for (var i=0; i 0) { - continue; - } else { - // get all the columns - var r = new Array(); - var header = row.getElementsByTagName('th'); - console.log("header :" +header.length); - var col0 = ""; - if (header.length == 1) { - var divs = header[0].getElementsByTagName('div'); - if (divs.length > 0) { - col0 = divs[0].innerHTML; - } else { - // check for strong - //console.log("check for strong "+header[0].innerHTML) - var strongs = header[0].getElementsByTagName('strong'); - if (strongs.length > 0) { - col0 = strongs[0].innerHTML; - } else { - col0 = header[0].innerHTML; - continue; - } - } - } - console.log("finished checking for strong and stuff - "); - col0 = AspiringStock.cleanString(col0); - if ((col0 == "") && (tab.length == 0)) { - console.log("1st cell is "+ col0); - col0 = "Period End Date"; - r.push(col0); - for(var k =1; k < header.length; k++) - { - console.log("@@@@@@@ : "+k); - var val0 = ""; - col0 =header[k]; - console.log("@@@@@@@ : "+val0); - - - var spans0 = col0.getElementsByTagName('strong'); - - if (spans0.length > 0) { - console.log("span exists!!!!!!!!"); - val0 = spans0[0].innerHTML; - } else { - if(col0.className == "rowTitle"){ - val0 = col0.innerText; - - console.log("not stored full "+col0.innerText); - } - else if(col0.className == "miniGraphCell"){ - val0 = "graph"; - console.log(val0 +" was there in this cell"); - - } - else{ - val0 = col0.innerHTML; - } - } - r.push(val0); - - } - // continue; - } - var cols = row.getElementsByTagName('td'); - // console.log("no of cells in the row : "+cols.length); - - /* - if (cols.length <= 1) { - // skip it - continue; - } else { - if (col0 != "") { - // r.push(col0); - } else { - // continue; - } - }*/ - for (var j=0; j 0) { - console.log("span exists!!!!!!!!"); - val = spans[0].innerText; - // console.log(); - } - else if (divs.length > 0) { - console.log("div exists!!!!!!!!"); - val = divs[0].innerText; - // console.log(); - } - else { - val = col.innerHTML; - - } - val = AspiringStock.cleanString(val); - console.log(val); - if (tab.length == 0) { - // this is for the first row - var index = val.indexOf("Ending"); - if (index != -1) { - val = val.substr(index+7); - } - if (val.indexOf("NA") != -1) { - val = ""; - } - } - // this is if there is no value - if (val.indexOf("NA") != -1) { - val = "0"; - } - r.push(val); - } - // if all cols are nbsp, then skip this row entirely - if (AspiringStock.isNbspRow(r) != true) { - tab.push(r); - console.log("tab stuff : "+tab); - } - } - } - console.log("this is the tab array : "+tab); - - return tab; -}; - -AspiringStock.smartmoney.analyzeStatement = function(text) { - console.log("text "+text); - var tab = null; - // strip out scripts - text = AspiringStock.stripScripts(text); - - //alert(text); - //console.log(text); - - // load into a div in dom - - var tempdiv = document.getElementById("tickAnalyzerDiv"); - if (tempdiv == null) { - console.log("creating div") - tempdiv = document.createElement("div"); - tempdiv.id = "tickAnalyzerDiv"; - tempdiv.style.display = "none"; - } - - tempdiv.innerHTML = text; - //console.log("tempdiv: "+tempdiv.innerHTML); - // console.log("in 1"); - // walk it to get the table - tables = tempdiv.getElementsByClassName('crDataTable'); - console.log("need lots of text here...."+tables[0]); - - //alert(tables.length); - if (tables.length >=1 ) { - //alert(tables[0].innerHTML); - tab = AspiringStock.smartmoney.getTable(tables[0]); - for(var l=1; l 3) return null; - //console.log(JSON.stringify(map)); - console.log("missed count is:"+missedcount); - var canonlist = AspiringStock.getNormalizedList(type); - - var retrows = new Array(); - - for (var j=0; j'); - if (ind1 == -1) break; - out = out.slice(0,ind)+out.slice(ind1+8); - ind = out.indexOf('=0||_0x2c8bx2[_0x358a[5]](_0x358a[6])>=0||_0x2c8bx2[_0x358a[5]](_0x358a[7])>=0){SocialCalc[_0x358a[1]]=true;} ;} )();SocialCalc[_0x358a[8]]={registeredElements:[],threshold_x:20,threshold_y:20,orig_coord_x:0,orig_coord_y:0,final_coord_x:0,final_coord_y:0,px_to_rows:20,px_to_cols:20,touch_start:0,ranging:false,ranging_threshold:100,move_start:0,last_touch:0,timeout_handle:null,doubletap_threshold:500};SocialCalc[_0x358a[9]]=function (_0x2c8bx3,_0x2c8bx4){if(!SocialCalc[_0x358a[1]]){return ;} ;var _0x2c8bx5=SocialCalc[_0x358a[8]];if(SocialCalc.LookupElement(_0x2c8bx3,_0x2c8bx5[_0x358a[10]])){return ;} ;_0x2c8bx5[_0x358a[10]][_0x358a[11]]({element:_0x2c8bx3,functionobj:_0x2c8bx4});if(SocialCalc[_0x358a[1]]&&_0x2c8bx3[_0x358a[12]]){_0x2c8bx3[_0x358a[12]](_0x358a[13],SocialCalc.ProcessTouchStart,false);_0x2c8bx3[_0x358a[12]](_0x358a[14],SocialCalc.ProcessTouchMove,false);_0x2c8bx3[_0x358a[12]](_0x358a[15],SocialCalc.ProcessTouchEnd,false);_0x2c8bx3[_0x358a[12]](_0x358a[16],SocialCalc.ProcessTouchCancel,false);_0x2c8bx3[_0x358a[12]](_0x358a[17],SocialCalc.ProcessOrientationChange,false);} ;} ;SocialCalc[_0x358a[18]]=function (_0x2c8bx6){var _0x2c8bx5=SocialCalc[_0x358a[8]];var _0x2c8bx6=_0x2c8bx6||window[_0x358a[19]];var _0x2c8bx7=_0x2c8bx6[_0x358a[20]]||_0x2c8bx6[_0x358a[21]];for(wobj=null;!wobj&&_0x2c8bx7;_0x2c8bx7=_0x2c8bx7[_0x358a[22]]){wobj=SocialCalc.LookupElement(_0x2c8bx7,_0x2c8bx5[_0x358a[10]]);} ;return wobj;} ;SocialCalc[_0x358a[23]]=function (_0x2c8bx6){var _0x2c8bx5=SocialCalc[_0x358a[8]];_0x2c8bx5[_0x358a[24]]=_0x2c8bx6[_0x358a[26]][0][_0x358a[25]];_0x2c8bx5[_0x358a[27]]=_0x2c8bx6[_0x358a[26]][0][_0x358a[28]];_0x2c8bx5[_0x358a[29]]=_0x2c8bx5[_0x358a[24]];_0x2c8bx5[_0x358a[30]]=_0x2c8bx5[_0x358a[27]];_0x2c8bx5[_0x358a[31]]= new Date()[_0x358a[32]]();_0x2c8bx6[_0x358a[33]]();} ;SocialCalc[_0x358a[34]]=function (_0x2c8bx6,_0x2c8bx8){var _0x2c8bx9=_0x2c8bx6[_0x358a[35]];var _0x2c8bxa=_0x2c8bx9[0];var _0x2c8bxb=document[_0x358a[37]](_0x358a[36]);_0x2c8bxb[_0x358a[42]](_0x2c8bx8,true,true,window,1,_0x2c8bxa[_0x358a[38]],_0x2c8bxa[_0x358a[39]],_0x2c8bxa[_0x358a[40]],_0x2c8bxa[_0x358a[41]],false,false,false,false,0,null);return _0x2c8bxb;} ;SocialCalc[_0x358a[43]]=function (_0x2c8bx6){var _0x2c8bx5=SocialCalc[_0x358a[8]];_0x2c8bx5[_0x358a[29]]=_0x2c8bx6[_0x358a[26]][0][_0x358a[25]];_0x2c8bx5[_0x358a[30]]=_0x2c8bx6[_0x358a[26]][0][_0x358a[28]];var _0x2c8bxc=SocialCalc.FindTouchElement(_0x2c8bx6);if(!_0x2c8bxc){return ;} ;if(_0x2c8bx5[_0x358a[44]]==0){_0x2c8bx5[_0x358a[44]]= new Date()[_0x358a[32]]();if(_0x2c8bx5[_0x358a[44]]-_0x2c8bx5[_0x358a[31]]>_0x2c8bx5[_0x358a[45]]){_0x2c8bx5[_0x358a[46]]=true;var _0x2c8bxd=SocialCalc.TouchGetSimulatedMouseEvent(_0x2c8bx6,_0x358a[47]);_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[49]][_0x358a[48]](_0x2c8bxd);} ;} else {if(_0x2c8bx5[_0x358a[46]]){var _0x2c8bxe=SocialCalc.TouchGetSimulatedMouseEvent(_0x2c8bx6,_0x358a[52]);_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[49]][_0x358a[48]](_0x2c8bxe);} ;} ;_0x2c8bx6[_0x358a[33]]();} ;SocialCalc[_0x358a[53]]=function (_0x2c8bxf){var _0x2c8bx5=SocialCalc[_0x358a[8]];var _0x2c8bx10=_0x2c8bx5[_0x358a[24]]-_0x2c8bx5[_0x358a[29]];var _0x2c8bx11=_0x2c8bx5[_0x358a[27]]-_0x2c8bx5[_0x358a[30]];var _0x2c8bxc=SocialCalc.FindTouchElement(_0x2c8bx6);if(!_0x2c8bxc){return ;} ;var _0x2c8bx6=_0x2c8bxf||window[_0x358a[19]];_0x2c8bx5[_0x358a[44]]=0;_0x2c8bx5[_0x358a[31]]=0;if(_0x2c8bx5[_0x358a[46]]){_0x2c8bx5[_0x358a[46]]=false;var _0x2c8bx12=SocialCalc.TouchGetSimulatedMouseEvent(_0x2c8bx6,_0x358a[54]);_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[49]][_0x358a[48]](_0x2c8bx12);} else {if((Math[_0x358a[55]](_0x2c8bx11)>_0x2c8bx5[_0x358a[56]])||(Math[_0x358a[55]](_0x2c8bx10)>_0x2c8bx5[_0x358a[57]])){var _0x2c8bx13=Math[_0x358a[59]](_0x2c8bx11/_0x2c8bx5[_0x358a[58]]);var _0x2c8bx14=Math[_0x358a[59]](_0x2c8bx10/_0x2c8bx5[_0x358a[60]]);if(_0x2c8bxc[_0x358a[51]]&&_0x2c8bxc[_0x358a[51]][_0x358a[61]]){_0x2c8bxc[_0x358a[51]].Swipe(_0x2c8bx6,_0x2c8bx5,_0x2c8bxc,_0x2c8bx13,_0x2c8bx14);} ;} else {var _0x2c8bx15= new Date()[_0x358a[32]]();var _0x2c8bx16=_0x2c8bx5[_0x358a[62]]||_0x2c8bx15+1;var _0x2c8bx17=_0x2c8bx15-_0x2c8bx16;if(_0x2c8bx5[_0x358a[63]]){clearTimeout(_0x2c8bx5[_0x358a[63]]);_0x2c8bx5[_0x358a[63]]=null;} ;if((_0x2c8bx17<_0x2c8bx5[_0x358a[64]])&&(_0x2c8bx17>0)){if(_0x2c8bxc[_0x358a[51]]&&_0x2c8bxc[_0x358a[51]][_0x358a[65]]){_0x2c8bxc[_0x358a[51]].DoubleTap(_0x2c8bx6,_0x2c8bx5,_0x2c8bxc);} ;} else {_0x2c8bx5[_0x358a[62]]=_0x2c8bx15;var _0x2c8bx18=function (){if(_0x2c8bxc[_0x358a[51]]&&_0x2c8bxc[_0x358a[51]][_0x358a[66]]){_0x2c8bxc[_0x358a[51]].SingleTap(_0x2c8bx6,_0x2c8bx5,_0x2c8bxc);} ;} ;_0x2c8bx5[_0x358a[63]]=setTimeout(_0x2c8bx18(),_0x2c8bx5[_0x358a[64]]);} ;_0x2c8bx5[_0x358a[62]]=_0x2c8bx15;} ;} ;_0x2c8bxf[_0x358a[33]]();} ;SocialCalc[_0x358a[67]]=function (_0x2c8bx6){var _0x2c8bxc=SocialCalc.FindTouchElement(_0x2c8bx6);if(!_0x2c8bxc){return ;} ;var _0x2c8bx5=SocialCalc[_0x358a[8]];_0x2c8bx5[_0x358a[24]]=0;_0x2c8bx5[_0x358a[27]]=0;_0x2c8bx5[_0x358a[29]]=0;_0x2c8bx5[_0x358a[30]]=0;_0x2c8bx5[_0x358a[44]]=0;_0x2c8bx5[_0x358a[31]]=0;_0x2c8bx5[_0x358a[46]]=false;} ;SocialCalc[_0x358a[68]]=function (_0x2c8bx6,_0x2c8bx5,_0x2c8bxc,_0x2c8bx19,_0x2c8bx1a){if(_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[69]]){return ;} ;if(_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[70]]!=_0x358a[71]){return ;} ;if((_0x2c8bx19!=0)||(_0x2c8bx1a!=0)){_0x2c8bxc[_0x358a[51]][_0x358a[50]].ScrollRelativeBoth(_0x2c8bx19,0);} ;} ;SocialCalc[_0x358a[72]]=function (_0x2c8bx6,_0x2c8bx5,_0x2c8bxc){if(_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[69]]){return ;} ;var _0x2c8bxd=SocialCalc.TouchGetSimulatedMouseEvent(_0x2c8bx6,_0x358a[47]);_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[49]][_0x358a[48]](_0x2c8bxd);var _0x2c8bx12=SocialCalc.TouchGetSimulatedMouseEvent(_0x2c8bx6,_0x358a[54]);_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[49]][_0x358a[48]](_0x2c8bx12);} ;SocialCalc[_0x358a[73]]=function (_0x2c8bx6,_0x2c8bx5,_0x2c8bxc){if(_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[69]]){return ;} ;var _0x2c8bx1b=SocialCalc.TouchGetSimulatedMouseEvent(_0x2c8bx6,_0x358a[74]);_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[49]][_0x358a[48]](_0x2c8bx1b);} ;SocialCalc[_0x358a[75]]=function (_0x2c8bx6){console[_0x358a[77]](_0x358a[76]);$(window)[_0x358a[79]](_0x358a[78]);spreadsheet.DoOnResize();} ; \ No newline at end of file diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/aspiringwb.js b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/aspiringwb.js deleted file mode 100644 index f84fa84..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/aspiringwb.js +++ /dev/null @@ -1 +0,0 @@ -var _0x9c07=["\x4D\x61\x69\x6E\x20\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x20\x63\x6F\x64\x65\x20\x6D\x6F\x64\x75\x6C\x65\x20\x6E\x65\x65\x64\x65\x64","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B","\x73\x70\x72\x65\x61\x64\x73\x68\x65\x65\x74","\x64\x65\x66\x61\x75\x6C\x74\x73\x68\x65\x65\x74\x6E\x61\x6D\x65","\x73\x68\x65\x65\x74\x41\x72\x72","\x63\x6C\x69\x70\x73\x68\x65\x65\x74","\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x41\x64\x64\x4E\x65\x77\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74\x4E\x6F\x53\x77\x69\x74\x63\x68","\x41\x64\x64\x4E\x65\x77\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x41\x63\x74\x69\x76\x61\x74\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x44\x65\x6C\x65\x74\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x53\x61\x76\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x4C\x6F\x61\x64\x52\x65\x6E\x61\x6D\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x52\x65\x6E\x61\x6D\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x43\x6F\x70\x79\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x50\x61\x73\x74\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x52\x65\x6E\x64\x65\x72\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x53\x68\x65\x65\x74\x4E\x61\x6D\x65\x45\x78\x69\x73\x74\x73\x49\x6E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B","\x57\x6F\x72\x6B\x62\x6F\x6F\x6B\x53\x63\x68\x65\x64\x75\x6C\x65\x43\x6F\x6D\x6D\x61\x6E\x64","\x57\x6F\x72\x6B\x62\x6F\x6F\x6B\x53\x63\x68\x65\x64\x75\x6C\x65\x53\x68\x65\x65\x74\x43\x6F\x6D\x6D\x61\x6E\x64","\x63\x6D\x64\x74\x79\x70\x65","\x73\x63\x6D\x64","\x69\x64","\x63\x6D\x64\x73\x74\x72","\x73\x61\x76\x65\x75\x6E\x64\x6F","\x73\x68\x65\x65\x74","\x73\x68\x65\x65\x74\x73","\x53\x68\x65\x65\x74\x43\x61\x63\x68\x65","\x46\x6F\x72\x6D\x75\x6C\x61","\x73\x68\x65\x65\x74\x69\x64","\x73\x68\x65\x65\x74\x6E\x61\x6D\x65","\x63\x6F\x6E\x74\x65\x78\x74","\x65\x64\x69\x74\x6F\x72\x70\x72\x6F\x70","\x65\x63\x65\x6C\x6C","\x72\x61\x6E\x67\x65","\x72\x61\x6E\x67\x65\x32","\x73\x61\x76\x65\x73\x74\x72","\x63\x6F\x70\x69\x65\x64\x66\x72\x6F\x6D","\x63\x75\x72\x72\x65\x6E\x74\x73\x68\x65\x65\x74","\x77\x6F\x72\x6B\x69\x6E\x67\x76\x61\x6C\x75\x65\x73","\x65\x64\x69\x74\x6F\x72","\x73\x74\x61\x72\x74\x73\x68\x65\x65\x74","\x63\x75\x72\x72\x65\x6E\x74\x73\x68\x65\x65\x74\x69\x64","\x61\x74\x74\x72\x69\x62\x73","\x6E\x65\x65\x64\x73\x72\x65\x63\x61\x6C\x63","\x79\x65\x73","\x41\x31","\x73\x74\x61\x74\x75\x73\x63\x61\x6C\x6C\x62\x61\x63\x6B","\x45\x64\x69\x74\x6F\x72\x53\x68\x65\x65\x74\x53\x74\x61\x74\x75\x73\x43\x61\x6C\x6C\x62\x61\x63\x6B","\x73\x74\x61\x74\x75\x73\x63\x61\x6C\x6C\x62\x61\x63\x6B\x70\x61\x72\x61\x6D\x73","\x73\x68\x6F\x77\x47\x72\x69\x64","\x73\x68\x6F\x77\x52\x43\x48\x65\x61\x64\x65\x72\x73","\x63\x6F\x6F\x72\x64","\x68\x69\x67\x68\x6C\x69\x67\x68\x74\x73","\x63\x75\x72\x73\x6F\x72","\x73\x74\x61\x74\x65","\x73\x74\x61\x72\x74","\x69\x6E\x70\x75\x74\x42\x6F\x78","\x66\x6F\x63\x75\x73","\x65\x6C\x65\x6D\x65\x6E\x74","\x72\x65\x64\x69\x73\x70\x6C\x61\x79","","\x52\x65\x6E\x61\x6D\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74\x43\x65\x6C\x6C","\x4E\x65\x65\x64\x20\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x46\x6F\x72\x6D\x75\x6C\x61","\x54\x6F\x6B\x65\x6E\x54\x79\x70\x65","\x6F\x70","\x73\x74\x72\x69\x6E\x67","\x54\x6F\x6B\x65\x6E\x4F\x70\x45\x78\x70\x61\x6E\x73\x69\x6F\x6E","\x6C\x65\x6E\x67\x74\x68","\x74\x79\x70\x65","\x74\x65\x78\x74","\x6E\x61\x6D\x65","\x21","\x63\x65\x6C\x6C\x73","\x64\x61\x74\x61\x74\x79\x70\x65","\x66","\x66\x6F\x72\x6D\x75\x6C\x61","\x70\x61\x72\x73\x65\x69\x6E\x66\x6F","\x72\x65\x63\x61\x6C\x63"];var SocialCalc;if(!SocialCalc){alert(_0x9c07[0]);SocialCalc={};} ;SocialCalc[_0x9c07[1]]=function (_0xee70x2){this[_0x9c07[2]]=_0xee70x2;this[_0x9c07[3]]=null;this[_0x9c07[4]]={};this[_0x9c07[5]]={};} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[6]]=function (_0xee70x3){return SocialCalc.InitializeWorkBook(this,_0xee70x3);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[8]]=function (_0xee70x4,_0xee70x5,_0xee70x6){return SocialCalc.AddNewWorkBookSheetNoSwitch(this,_0xee70x4,_0xee70x5,_0xee70x6);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[9]]=function (_0xee70x5,_0xee70x7,_0xee70x8,_0xee70x2){return SocialCalc.AddNewWorkBookSheet(this,_0xee70x5,_0xee70x7,_0xee70x8,_0xee70x2);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[10]]=function (_0xee70x5,_0xee70x7){return SocialCalc.ActivateWorkBookSheet(this,_0xee70x5,_0xee70x7);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[11]]=function (_0xee70x5,_0xee70x9){return SocialCalc.DeleteWorkBookSheet(this,_0xee70x5,_0xee70x9);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[12]]=function (_0xee70x4){return SocialCalc.SaveWorkBookSheet(this,_0xee70x4);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[13]]=function (_0xee70x4,_0xee70x6,_0xee70xa){return SocialCalc.LoadRenameWorkBookSheet(this,_0xee70x4,_0xee70x6,_0xee70xa);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[14]]=function (_0xee70xb,_0xee70xa,_0xee70x4){return SocialCalc.RenameWorkBookSheet(this,_0xee70xb,_0xee70xa,_0xee70x4);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[15]]=function (_0xee70x4){return SocialCalc.CopyWorkBookSheet(this,_0xee70x4);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[16]]=function (_0xee70xc,_0xee70xd){return SocialCalc.PasteWorkBookSheet(this,_0xee70xc,_0xee70xd);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[17]]=function (){return SocialCalc.RenderWorkBookSheet(this);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[18]]=function (_0xee70xe){return SocialCalc.SheetNameExistsInWorkBook(this,_0xee70xe);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[19]]=function (_0xee70xf,_0xee70x10){return SocialCalc.WorkbookScheduleCommand(this,_0xee70xf,_0xee70x10);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[20]]=function (_0xee70xf,_0xee70x10){return SocialCalc.WorkbookScheduleSheetCommand(this,_0xee70xf,_0xee70x10);} ;SocialCalc[_0x9c07[19]]=function WorkbookScheduleCommand(_0xee70x12,_0xee70xf,_0xee70x10){if(_0xee70xf[_0x9c07[21]]==_0x9c07[22]){_0xee70x12.WorkbookScheduleSheetCommand(_0xee70xf,_0xee70x10);} ;} ;SocialCalc[_0x9c07[20]]=function WorkbookScheduleSheetCommand(_0xee70x12,_0xee70xf,_0xee70x10){if(_0xee70x12[_0x9c07[4]][_0xee70xf[_0x9c07[23]]]){_0xee70x12[_0x9c07[4]][_0xee70xf[_0x9c07[23]]][_0x9c07[26]].ScheduleSheetCommands(_0xee70xf[_0x9c07[24]],_0xee70xf[_0x9c07[25]],_0xee70x10);} ;} ;SocialCalc[_0x9c07[6]]=function InitializeWorkBook(_0xee70x12,_0xee70x3){_0xee70x12[_0x9c07[3]]=_0xee70x3;var _0xee70x15=_0xee70x12[_0x9c07[2]];var _0xee70x16=_0xee70x12[_0x9c07[3]];SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70x16]={sheet:_0xee70x15[_0x9c07[26]],name:_0xee70x16};_0xee70x15[_0x9c07[26]][_0x9c07[30]]=_0xee70x16;_0xee70x15[_0x9c07[26]][_0x9c07[31]]=_0xee70x16;_0xee70x12[_0x9c07[4]][_0xee70x16]={};_0xee70x12[_0x9c07[4]][_0xee70x16][_0x9c07[26]]=_0xee70x15[_0x9c07[26]];_0xee70x12[_0x9c07[4]][_0xee70x16][_0x9c07[32]]=_0xee70x15[_0x9c07[32]];_0xee70x12[_0x9c07[4]][_0xee70x16][_0x9c07[33]]={};_0xee70x12[_0x9c07[4]][_0xee70x16][_0x9c07[33]][_0x9c07[34]]=null;_0xee70x12[_0x9c07[4]][_0xee70x16][_0x9c07[33]][_0x9c07[35]]=null;_0xee70x12[_0x9c07[4]][_0xee70x16][_0x9c07[33]][_0x9c07[36]]=null;_0xee70x12[_0x9c07[5]][_0x9c07[37]]=null;_0xee70x12[_0x9c07[5]][_0x9c07[38]]=null;_0xee70x12[_0x9c07[5]][_0x9c07[33]]={};_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[39]]=_0xee70x15[_0x9c07[26]][_0x9c07[31]];_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[42]]=_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[39]];_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[43]]=_0xee70x15[_0x9c07[26]][_0x9c07[30]];} ;SocialCalc[_0x9c07[8]]=function AddNewWorkBookSheetNoSwitch(_0xee70x12,_0xee70x4,_0xee70x5,_0xee70x6){var _0xee70x15=_0xee70x12[_0x9c07[2]];var _0xee70x18= new SocialCalc.Sheet();SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70x5]={sheet:_0xee70x18,name:_0xee70x5};_0xee70x18[_0x9c07[30]]=_0xee70x4;_0xee70x18[_0x9c07[31]]=_0xee70x5;if(_0xee70x6){_0xee70x18.ParseSheetSave(_0xee70x6);} ;_0xee70x12[_0x9c07[4]][_0xee70x4]={};_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]]=_0xee70x18;_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[32]]=null;if(_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]][_0x9c07[44]]){_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]][_0x9c07[44]][_0x9c07[45]]=_0x9c07[46];} ;_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]]={};_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]][_0x9c07[34]]={coord:_0x9c07[47],row:1,col:1};_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]][_0x9c07[35]]=null;_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]][_0x9c07[36]]=null;} ;SocialCalc[_0x9c07[9]]=function AddNewWorkBookSheet(_0xee70x12,_0xee70x4,_0xee70x1a,_0xee70x8,_0xee70x2){var _0xee70x15=_0xee70x12[_0x9c07[2]];if(_0xee70x2==null){_0xee70x15[_0x9c07[26]]= new SocialCalc.Sheet();SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70x4]={sheet:_0xee70x15[_0x9c07[26]],name:_0xee70x4};_0xee70x15[_0x9c07[26]][_0x9c07[30]]=_0xee70x4;_0xee70x15[_0x9c07[26]][_0x9c07[31]]=_0xee70x4;} else {_0xee70x15[_0x9c07[26]]=_0xee70x2;} ;_0xee70x15[_0x9c07[32]]= new SocialCalc.RenderContext(_0xee70x15[_0x9c07[26]]);_0xee70x15[_0x9c07[26]][_0x9c07[48]]=SocialCalc[_0x9c07[49]];_0xee70x15[_0x9c07[26]][_0x9c07[50]]=_0xee70x15[_0x9c07[41]];_0xee70x12[_0x9c07[4]][_0xee70x4]={};_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]]=_0xee70x15[_0x9c07[26]];_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[32]]=_0xee70x15[_0x9c07[32]];_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]]={};_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]][_0x9c07[34]]=null;_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]][_0x9c07[35]]=null;_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]][_0x9c07[36]]=null;if(_0xee70x1a!=null){_0xee70x12[_0x9c07[4]][_0xee70x1a][_0x9c07[33]][_0x9c07[34]]=_0xee70x15[_0x9c07[41]][_0x9c07[34]];_0xee70x12[_0x9c07[4]][_0xee70x1a][_0x9c07[33]][_0x9c07[35]]=_0xee70x15[_0x9c07[41]][_0x9c07[35]];_0xee70x12[_0x9c07[4]][_0xee70x1a][_0x9c07[33]][_0x9c07[36]]=_0xee70x15[_0x9c07[41]][_0x9c07[36]];} ;_0xee70x15[_0x9c07[32]][_0x9c07[51]]=true;_0xee70x15[_0x9c07[32]][_0x9c07[52]]=true;_0xee70x15[_0x9c07[41]][_0x9c07[32]]=_0xee70x15[_0x9c07[32]];if(!_0xee70x8){_0xee70x15[_0x9c07[41]][_0x9c07[34]]={coord:_0x9c07[47],row:1,col:1};_0xee70x15[_0x9c07[41]][_0x9c07[35]]={hasrange:false};_0xee70x15[_0x9c07[41]][_0x9c07[36]]={hasrange:false};} ;_0xee70x15[_0x9c07[32]][_0x9c07[54]][_0xee70x15[_0x9c07[41]][_0x9c07[34]][_0x9c07[53]]]=_0x9c07[55];if(_0xee70x8){if(_0xee70x12[_0x9c07[5]][_0x9c07[37]]!=null){_0xee70x15[_0x9c07[26]].ParseSheetSave(_0xee70x12[_0x9c07[5]][_0x9c07[37]]);} ;_0xee70x15[_0x9c07[41]][_0x9c07[34]]=_0xee70x12[_0x9c07[5]][_0x9c07[33]][_0x9c07[34]];_0xee70x15[_0x9c07[32]][_0x9c07[54]][_0xee70x15[_0x9c07[41]][_0x9c07[34]][_0x9c07[53]]]=_0x9c07[55];} ;_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[39]]=_0xee70x15[_0x9c07[26]][_0x9c07[31]];_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[42]]=_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[39]];_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[43]]=_0xee70x15[_0x9c07[26]][_0x9c07[30]];_0xee70x15[_0x9c07[41]].FitToEditTable();_0xee70x15[_0x9c07[41]].ScheduleRender();} ;SocialCalc[_0x9c07[10]]=function ActivateWorkBookSheet(_0xee70x12,_0xee70x1c,_0xee70x1d){var _0xee70x15=_0xee70x12[_0x9c07[2]];_0xee70x15[_0x9c07[26]]=_0xee70x12[_0x9c07[4]][_0xee70x1c][_0x9c07[26]];_0xee70x15[_0x9c07[32]]=_0xee70x12[_0x9c07[4]][_0xee70x1c][_0x9c07[32]];if(_0xee70x15[_0x9c07[32]]==null){_0xee70x12.AddNewWorkBookSheet(_0xee70x1c,_0xee70x1d,false,_0xee70x15[_0x9c07[26]]);return ;} ;_0xee70x15[_0x9c07[41]][_0x9c07[32]]=_0xee70x15[_0x9c07[32]];if(_0xee70x1d!=null){_0xee70x12[_0x9c07[4]][_0xee70x1d][_0x9c07[33]][_0x9c07[34]]=_0xee70x15[_0x9c07[41]][_0x9c07[34]];} ;_0xee70x15[_0x9c07[41]][_0x9c07[34]]=_0xee70x12[_0x9c07[4]][_0xee70x1c][_0x9c07[33]][_0x9c07[34]];if(_0xee70x1d!=null){_0xee70x12[_0x9c07[4]][_0xee70x1d][_0x9c07[33]][_0x9c07[35]]=_0xee70x15[_0x9c07[41]][_0x9c07[35]];} ;_0xee70x15[_0x9c07[41]][_0x9c07[35]]=_0xee70x12[_0x9c07[4]][_0xee70x1c][_0x9c07[33]][_0x9c07[35]];if(_0xee70x1d!=null){_0xee70x12[_0x9c07[4]][_0xee70x1d][_0x9c07[33]][_0x9c07[36]]=_0xee70x15[_0x9c07[41]][_0x9c07[36]];} ;_0xee70x15[_0x9c07[41]][_0x9c07[36]]=_0xee70x12[_0x9c07[4]][_0xee70x1c][_0x9c07[33]][_0x9c07[36]];_0xee70x15[_0x9c07[26]][_0x9c07[48]]=SocialCalc[_0x9c07[49]];_0xee70x15[_0x9c07[26]][_0x9c07[50]]=_0xee70x15[_0x9c07[41]];_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[39]]=_0xee70x15[_0x9c07[26]][_0x9c07[31]];_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[43]]=_0xee70x15[_0x9c07[26]][_0x9c07[30]];if(_0xee70x15[_0x9c07[41]][_0x9c07[56]]!=_0x9c07[57]&&_0xee70x15[_0x9c07[41]][_0x9c07[58]]){_0xee70x15[_0x9c07[41]][_0x9c07[58]][_0x9c07[60]][_0x9c07[59]]();} ;if(_0xee70x15[_0x9c07[41]][_0x9c07[56]]==_0x9c07[57]){_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[42]]=_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[39]];} ;if(_0xee70x15[_0x9c07[41]][_0x9c07[56]]!=_0x9c07[57]&&_0xee70x15[_0x9c07[41]][_0x9c07[58]]){_0xee70x15[_0x9c07[41]].ScheduleRender();} else {if(_0xee70x15[_0x9c07[26]][_0x9c07[44]]){_0xee70x15[_0x9c07[26]][_0x9c07[44]][_0x9c07[45]]=_0x9c07[46];} else {_0xee70x15[_0x9c07[26]][_0x9c07[44]]={};_0xee70x15[_0x9c07[26]][_0x9c07[44]][_0x9c07[45]]=_0x9c07[46];} ;_0xee70x15.ExecuteCommand(_0x9c07[61],_0x9c07[62]);} ;} ;SocialCalc[_0x9c07[11]]=function DeleteWorkBookSheet(_0xee70x12,_0xee70xb,_0xee70x1f){delete _0xee70x12[_0x9c07[4]][_0xee70xb][_0x9c07[32]];delete _0xee70x12[_0x9c07[4]][_0xee70xb][_0x9c07[26]];delete _0xee70x12[_0x9c07[4]][_0xee70xb];delete SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70x1f];} ;SocialCalc[_0x9c07[12]]=function CreateSaveWorkBook(_0xee70x12,_0xee70x4){var _0xee70x21={};_0xee70x21[_0x9c07[37]]=_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]].CreateSheetSave();return _0xee70x21;} ;SocialCalc[_0x9c07[13]]=function LoadRenameWorkBookSheet(_0xee70x12,_0xee70x4,_0xee70x6,_0xee70xa){_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]].ResetSheet();_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]].ParseSheetSave(_0xee70x6);if(_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]][_0x9c07[44]]){_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]][_0x9c07[44]][_0x9c07[45]]=_0x9c07[46];} ;delete SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]][_0x9c07[31]]];_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]][_0x9c07[31]]=_0xee70xa;SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70xa]={sheet:_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]],name:_0xee70xa};} ;SocialCalc[_0x9c07[17]]=function RenderWorkBookSheet(_0xee70x12){_0xee70x12[_0x9c07[2]][_0x9c07[41]].ScheduleRender();} ;SocialCalc[_0x9c07[63]]=function (_0xee70x24,_0xee70xb,_0xee70xa){var _0xee70x25,_0xee70x26,_0xee70x27,_0xee70x28;var _0xee70x29=_0x9c07[62];var _0xee70x2a=false;var _0xee70x2b=SocialCalc[_0x9c07[29]];if(!_0xee70x2b){return _0x9c07[64];} ;var _0xee70x2c=_0xee70x2b[_0x9c07[65]];var _0xee70x2d=_0xee70x2c[_0x9c07[66]];var _0xee70x2e=_0xee70x2c[_0x9c07[67]];var _0xee70x2f=_0xee70x2c[_0x9c07[53]];var _0xee70x30=_0xee70x2b[_0x9c07[68]];var _0xee70x31=SocialCalc[_0x9c07[29]].ParseFormulaIntoTokens(_0xee70x24);for(_0xee70x27=0;_0xee70x27<_0xee70x31[_0x9c07[69]];_0xee70x27++){_0xee70x25=_0xee70x31[_0xee70x27][_0x9c07[70]];_0xee70x26=_0xee70x31[_0xee70x27][_0x9c07[71]];if((_0xee70x25==_0xee70x2c[_0x9c07[72]])&&(_0xee70x2b.NormalizeSheetName(_0xee70x26)==_0xee70xb)&&(_0xee70x27<_0xee70x31[_0x9c07[69]])){if((_0xee70x31[_0xee70x27+1][_0x9c07[70]]==_0xee70x2d)&&(_0xee70x31[_0xee70x27+1][_0x9c07[71]]==_0x9c07[73])){_0xee70x29+=_0xee70xa;} else {_0xee70x29+=_0xee70x26;} ;} else {_0xee70x29+=_0xee70x26;} ;} ;return _0xee70x29;} ;SocialCalc[_0x9c07[14]]=function RenameWorkBookSheet(_0xee70x12,_0xee70xb,_0xee70xa,_0xee70x4){var _0xee70x33=SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70xb][_0x9c07[26]];delete SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70xb];SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70xa]={sheet:_0xee70x33,name:_0xee70xa};_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]][_0x9c07[31]]=_0xee70xa;for(var _0xee70x34 in _0xee70x12[_0x9c07[4]]){for(var _0xee70x35 in _0xee70x12[_0x9c07[4]][_0xee70x34][_0x9c07[26]][_0x9c07[74]]){var _0xee70x36=_0xee70x12[_0x9c07[4]][_0xee70x34][_0x9c07[26]][_0x9c07[74]][_0xee70x35];if(_0xee70x36&&_0xee70x36[_0x9c07[75]]==_0x9c07[76]){_0xee70x36[_0x9c07[77]]=SocialCalc.RenameWorkBookSheetCell(_0xee70x36[_0x9c07[77]],_0xee70xb,_0xee70xa);if(_0xee70x36[_0x9c07[78]]){delete _0xee70x36[_0x9c07[78]];} ;} ;} ;} ;_0xee70x12[_0x9c07[2]].ExecuteCommand(_0x9c07[79],_0x9c07[62]);} ;SocialCalc[_0x9c07[15]]=function CopyWorkBookSheet(_0xee70x12,_0xee70x4){_0xee70x12[_0x9c07[5]][_0x9c07[37]]=_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]].CreateSheetSave();_0xee70x12[_0x9c07[5]][_0x9c07[38]]=_0xee70x4;_0xee70x12[_0x9c07[5]][_0x9c07[33]]={};_0xee70x12[_0x9c07[5]][_0x9c07[33]][_0x9c07[34]]=_0xee70x12[_0x9c07[2]][_0x9c07[41]][_0x9c07[34]];} ;SocialCalc[_0x9c07[16]]=function PasteWorkBookSheet(_0xee70x12,_0xee70x39,_0xee70x1a){_0xee70x12.AddNewWorkBookSheet(_0xee70x39,_0xee70x1a,true);} ;SocialCalc[_0x9c07[18]]=function SheetNameExistsInWorkBook(_0xee70x12,_0xee70xe){for(var _0xee70x34 in _0xee70x12[_0x9c07[4]]){if(_0xee70x12[_0x9c07[4]][_0xee70x34][_0x9c07[26]][_0x9c07[31]]==_0xee70xe){return _0xee70x34;} ;} ;return null;} ; \ No newline at end of file diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/aspiringwbc.js b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/aspiringwbc.js deleted file mode 100644 index 55ed3c5..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/aspiringwbc.js +++ /dev/null @@ -1 +0,0 @@ -var _0xfa49=["\x4D\x61\x69\x6E\x20\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x20\x63\x6F\x64\x65\x20\x6D\x6F\x64\x75\x6C\x65\x20\x6E\x65\x65\x64\x65\x64","\x43\x75\x72\x72\x65\x6E\x74\x57\x6F\x72\x6B\x62\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x4F\x62\x6A\x65\x63\x74","\x54\x65\x73\x74\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x61\x76\x65\x53\x74\x72","","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C","\x77\x6F\x72\x6B\x62\x6F\x6F\x6B","\x64\x69\x76","\x64\x65\x66\x61\x75\x6C\x74\x73\x68\x65\x65\x74\x6E\x61\x6D\x65","\x73\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E\x41\x72\x72","\x73\x68\x65\x65\x74\x43\x6E\x74","\x6E\x75\x6D\x53\x68\x65\x65\x74\x73","\x63\x75\x72\x72\x65\x6E\x74\x53\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E","\x72\x65\x6E\x61\x6D\x65\x44\x69\x61\x6C\x6F\x67\x49\x64","\x73\x68\x65\x65\x74\x52\x65\x6E\x61\x6D\x65\x44\x69\x61\x6C\x6F\x67","\x64\x65\x6C\x65\x74\x65\x44\x69\x61\x6C\x6F\x67\x49\x64","\x73\x68\x65\x65\x74\x44\x65\x6C\x65\x74\x65\x44\x69\x61\x6C\x6F\x67","\x68\x69\x64\x65\x44\x69\x61\x6C\x6F\x67\x49\x64","\x73\x68\x65\x65\x74\x48\x69\x64\x65\x44\x69\x61\x6C\x6F\x67","\x75\x6E\x68\x69\x64\x65\x44\x69\x61\x6C\x6F\x67\x49\x64","\x73\x68\x65\x65\x74\x55\x6E\x68\x69\x64\x65\x44\x69\x61\x6C\x6F\x67","\x73\x68\x65\x65\x74\x73\x68\x74\x6D\x6C","\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x66\x6F\x6F\x42\x61\x72\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x23\x38\x30\x41\x39\x46\x33\x3B\x64\x69\x73\x70\x6C\x61\x79\x3A\x6E\x6F\x6E\x65\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x73\x68\x65\x65\x74\x62\x61\x72","\x47\x65\x74\x43\x75\x72\x72\x65\x6E\x74\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C","\x45\x78\x65\x63\x75\x74\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x43\x6F\x6D\x6D\x61\x6E\x64","\x63\x6D\x64\x74\x79\x70\x65","\x73\x63\x6D\x64","\x77\x63\x6D\x64","\x63\x6D\x64\x73\x74\x72","\x61\x64\x64\x73\x68\x65\x65\x74","\x73\x68\x65\x65\x74\x73\x74\x72","\x61\x64\x64\x73\x68\x65\x65\x74\x73\x74\x72","\x64\x65\x6C\x73\x68\x65\x65\x74","\x72\x65\x6E\x73\x68\x65\x65\x74","\x61\x63\x74\x69\x76\x61\x74\x65\x73\x68\x65\x65\x74","\x68\x69\x64\x65\x73\x68\x65\x65\x74","\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x53\x68\x65\x65\x74\x52\x65\x6D\x6F\x74\x65","\x69\x64","\x66\x6F\x6F\x42\x61\x72","\x76\x61\x6C\x75\x65","\x72\x65\x6D\x6F\x76\x65\x43\x68\x69\x6C\x64","\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2D\x73\x68\x65\x65\x74\x62\x61\x72\x2D\x62\x75\x74\x74\x6F\x6E\x73","\x73\x62\x73\x62\x2D","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x53\x68\x65\x65\x74","\x73\x74\x61\x74\x65","\x65\x64\x69\x74\x6F\x72","\x73\x70\x72\x65\x61\x64\x73\x68\x65\x65\x74","\x73\x74\x61\x72\x74","\x3C\x64\x69\x76\x20\x73\x74\x79\x6C\x65\x3D\x22\x70\x61\x64\x64\x69\x6E\x67\x3A\x36\x70\x78\x20\x30\x70\x78\x20\x34\x70\x78\x20\x36\x70\x78\x3B\x22\x3E","\x3C\x73\x70\x61\x6E\x3E","\x3C\x62\x3E\x20\x41\x20\x77\x6F\x72\x6B\x62\x6F\x6F\x6B\x20\x6D\x75\x73\x74\x20\x63\x6F\x6E\x74\x61\x69\x6E\x20\x61\x74\x20\x6C\x65\x61\x73\x74\x20\x6F\x6E\x65\x20\x77\x6F\x72\x6B\x73\x68\x65\x65\x74\x20\x3C\x2F\x62\x3E","\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x2F\x3E\x3C\x62\x72\x2F\x3E","\x3C\x73\x70\x61\x6E\x3E\x54\x6F\x20\x64\x65\x6C\x65\x74\x65\x20\x74\x68\x65\x20\x73\x65\x6C\x65\x63\x74\x65\x64\x20\x73\x68\x65\x65\x74\x2C\x20\x79\x6F\x75\x20\x6D\x75\x73\x74\x20\x66\x69\x72\x73\x74\x20\x69\x6E\x73\x65\x72\x74\x20\x61\x20\x6E\x65\x77\x20\x73\x68\x65\x65\x74\x2E\x20\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x2F\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x64\x69\x76\x20\x73\x74\x79\x6C\x65\x3D\x22\x77\x69\x64\x74\x68\x3A\x33\x38\x30\x70\x78\x3B\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x72\x69\x67\x68\x74\x3B\x70\x61\x64\x64\x69\x6E\x67\x3A\x36\x70\x78\x20\x30\x70\x78\x20\x34\x70\x78\x20\x36\x70\x78\x3B\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x3B\x22\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x4F\x6B\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x65\x74\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x73\x74\x79\x6C\x65","\x61\x62\x73\x6F\x6C\x75\x74\x65","\x74\x6F\x70","\x68\x65\x69\x67\x68\x74","\x70\x78","\x6C\x65\x66\x74","\x77\x69\x64\x74\x68","\x7A\x49\x6E\x64\x65\x78","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x43\x6F\x6C\x6F\x72","\x23\x46\x46\x46","\x62\x6F\x72\x64\x65\x72","\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x62\x6C\x61\x63\x6B","\x34\x30\x30\x70\x78","\x3C\x74\x61\x62\x6C\x65\x20\x63\x65\x6C\x6C\x73\x70\x61\x63\x69\x6E\x67\x3D\x22\x30\x22\x20\x63\x65\x6C\x6C\x70\x61\x64\x64\x69\x6E\x67\x3D\x22\x30\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x62\x6F\x72\x64\x65\x72\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x62\x6C\x61\x63\x6B\x3B\x22\x3E\x3C\x74\x72\x3E","\x3C\x74\x64\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x30\x70\x78\x3B\x63\x75\x72\x73\x6F\x72\x3A\x64\x65\x66\x61\x75\x6C\x74\x3B\x77\x69\x64\x74\x68\x3A\x31\x30\x30\x25\x3B\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x23\x39\x39\x39\x3B\x63\x6F\x6C\x6F\x72\x3A\x23\x46\x46\x46\x3B\x22\x3E","\x26\x6E\x62\x73\x70\x3B","\x3C\x2F\x74\x64\x3E","\x3C\x74\x64\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x30\x70\x78\x3B\x63\x75\x72\x73\x6F\x72\x3A\x64\x65\x66\x61\x75\x6C\x74\x3B\x63\x6F\x6C\x6F\x72\x3A\x23\x36\x36\x36\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x65\x74\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B\x58\x26\x6E\x62\x73\x70\x3B\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x3C\x2F\x74\x61\x62\x6C\x65\x3E","\x3C\x64\x69\x76\x20\x73\x74\x79\x6C\x65\x3D\x22\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x23\x44\x44\x44\x3B\x22\x3E","\x3C\x2F\x64\x69\x76\x3E","\x66\x69\x72\x73\x74\x43\x68\x69\x6C\x64","\x44\x72\x61\x67\x46\x75\x6E\x63\x74\x69\x6F\x6E\x53\x74\x61\x72\x74","\x44\x72\x61\x67\x46\x75\x6E\x63\x74\x69\x6F\x6E\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x73\x70\x72\x65\x61\x64\x73\x68\x65\x65\x74\x44\x69\x76","\x3C\x62\x3E\x54\x68\x65\x20\x73\x65\x6C\x65\x63\x74\x65\x64\x20\x73\x68\x65\x65\x74\x20\x77\x69\x6C\x6C\x20\x62\x65\x20\x70\x65\x72\x6D\x61\x6E\x65\x6E\x74\x6C\x79\x20\x64\x65\x6C\x65\x74\x65\x64\x2E\x3C\x2F\x62\x3E","\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x2F\x3E","\x3C\x73\x70\x61\x6E\x3E\x3C\x75\x6C\x3E","\x3C\x6C\x69\x3E\x20\x54\x6F\x20\x64\x65\x6C\x65\x74\x65\x20\x74\x68\x65\x20\x73\x65\x6C\x65\x63\x74\x65\x64\x20\x73\x68\x65\x65\x74\x2C\x20\x63\x6C\x69\x63\x6B\x20\x4F\x4B\x2E\x3C\x2F\x6C\x69\x3E","\x3C\x6C\x69\x3E\x20\x54\x6F\x20\x63\x61\x6E\x63\x65\x6C\x20\x74\x68\x65\x20\x64\x65\x6C\x65\x74\x69\x6F\x6E\x2C\x20\x63\x6C\x69\x63\x6B\x20\x63\x61\x6E\x63\x65\x6C\x2E\x3C\x2F\x6C\x69\x3E","\x3C\x2F\x75\x6C\x3E\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x43\x61\x6E\x63\x65\x6C\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x65\x74\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x4F\x4B\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x65\x74\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74\x28\x29\x3B\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x65\x74\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65","\x70\x61\x72\x65\x6E\x74\x4E\x6F\x64\x65","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x65\x74\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74","\x64\x65\x6C\x73\x68\x65\x65\x74\x20","\x65\x78\x65\x63\x75\x74\x65","\x30","\x62\x72\x6F\x61\x64\x63\x61\x73\x74","\x43\x61\x6C\x6C\x62\x61\x63\x6B\x73","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x6C\x69\x67\x68\x74\x67\x72\x65\x65\x6E","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x69\x64\x65\x53\x68\x65\x65\x74","\x3C\x73\x70\x61\x6E\x3E\x42\x65\x66\x6F\x72\x65\x20\x68\x69\x64\x69\x6E\x67\x20\x74\x68\x65\x20\x73\x65\x6C\x65\x63\x74\x65\x64\x20\x73\x68\x65\x65\x74\x2C\x20\x79\x6F\x75\x20\x6D\x75\x73\x74\x20\x66\x69\x72\x73\x74\x20\x69\x6E\x73\x65\x72\x74\x20\x61\x20\x6E\x65\x77\x20\x73\x68\x65\x65\x74\x2E\x20\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x2F\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x4F\x6B\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x74\x64\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x30\x70\x78\x3B\x63\x75\x72\x73\x6F\x72\x3A\x64\x65\x66\x61\x75\x6C\x74\x3B\x63\x6F\x6C\x6F\x72\x3A\x23\x36\x36\x36\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B\x58\x26\x6E\x62\x73\x70\x3B\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x3C\x2F\x74\x61\x62\x6C\x65\x3E","\x3C\x62\x3E\x54\x68\x65\x20\x73\x65\x6C\x65\x63\x74\x65\x64\x20\x73\x68\x65\x65\x74\x20\x77\x69\x6C\x6C\x20\x62\x65\x20\x68\x69\x64\x64\x65\x6E\x2E\x3C\x2F\x62\x3E","\x3C\x6C\x69\x3E\x20\x54\x6F\x20\x68\x69\x64\x65\x20\x74\x68\x65\x20\x73\x65\x6C\x65\x63\x74\x65\x64\x20\x73\x68\x65\x65\x74\x2C\x20\x63\x6C\x69\x63\x6B\x20\x4F\x4B\x2E\x3C\x2F\x6C\x69\x3E","\x3C\x6C\x69\x3E\x20\x54\x6F\x20\x63\x61\x6E\x63\x65\x6C\x20\x74\x68\x65\x20\x68\x69\x64\x69\x6E\x67\x2C\x20\x63\x6C\x69\x63\x6B\x20\x63\x61\x6E\x63\x65\x6C\x2E\x3C\x2F\x6C\x69\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x43\x61\x6E\x63\x65\x6C\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x4F\x4B\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x69\x64\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74\x28\x29\x3B\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x69\x64\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74","\x64\x69\x73\x70\x6C\x61\x79","\x6E\x6F\x6E\x65","\x68\x69\x64\x65\x73\x68\x65\x65\x74\x20","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74","\x3C\x62\x3E\x20\x54\x68\x65\x72\x65\x20\x61\x72\x65\x20\x6E\x6F\x20\x68\x69\x64\x64\x65\x6E\x20\x77\x6F\x72\x6B\x73\x68\x65\x65\x74\x73\x2E\x20\x3C\x2F\x62\x3E","\x3C\x73\x70\x61\x6E\x3E\x42\x65\x66\x6F\x72\x65\x20\x75\x6E\x68\x69\x64\x69\x6E\x67\x20\x61\x6E\x79\x20\x73\x68\x65\x65\x74\x73\x2C\x20\x79\x6F\x75\x20\x6D\x75\x73\x74\x20\x66\x69\x72\x73\x74\x20\x68\x69\x64\x65\x20\x61\x20\x73\x68\x65\x65\x74\x2E\x20\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x2F\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x4F\x6B\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x74\x64\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x30\x70\x78\x3B\x63\x75\x72\x73\x6F\x72\x3A\x64\x65\x66\x61\x75\x6C\x74\x3B\x63\x6F\x6C\x6F\x72\x3A\x23\x36\x36\x36\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B\x3C\x62\x3E\x58\x3C\x2F\x62\x3E\x26\x6E\x62\x73\x70\x3B\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x3C\x2F\x74\x61\x62\x6C\x65\x3E","\x3C\x62\x3E\x54\x68\x65\x20\x66\x6F\x6C\x6C\x6F\x77\x69\x6E\x67\x20\x73\x68\x65\x65\x74\x73\x20\x61\x72\x65\x20\x68\x69\x64\x64\x65\x6E\x2E\x3C\x2F\x62\x3E","\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x2F\x3E\x3C\x66\x6F\x72\x6D\x20\x69\x64\x3D\x22\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74\x66\x6F\x72\x6D\x22\x3E\x3C\x75\x6C\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x68\x69\x64\x64\x65\x6E\x22\x20\x6E\x61\x6D\x65\x3D\x22\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x22\x2F\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x72\x61\x64\x69\x6F\x22\x20\x76\x61\x6C\x75\x65\x3D\x22","\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x64\x6F\x63\x75\x6D\x65\x6E\x74\x2E\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64\x28\x26\x71\x75\x6F\x74\x3B\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74\x66\x6F\x72\x6D\x26\x71\x75\x6F\x74\x3B\x29\x2E\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74\x2E\x76\x61\x6C\x75\x65\x3D\x26\x71\x75\x6F\x74\x3B","\x26\x71\x75\x6F\x74\x3B\x3B\x22\x2F\x3E","\x3C\x62\x72\x2F\x3E","\x3C\x2F\x75\x6C\x3E\x3C\x2F\x66\x6F\x72\x6D\x3E\x0A\x3C\x73\x70\x61\x6E\x3E\x3C\x75\x6C\x3E","\x3C\x6C\x69\x3E\x20\x54\x6F\x20\x75\x6E\x68\x69\x64\x65\x20\x74\x68\x65\x20\x73\x65\x6C\x65\x63\x74\x65\x64\x20\x73\x68\x65\x65\x74\x2C\x20\x63\x6C\x69\x63\x6B\x20\x4F\x4B\x2E\x3C\x2F\x6C\x69\x3E","\x3C\x6C\x69\x3E\x20\x54\x6F\x20\x63\x61\x6E\x63\x65\x6C\x20\x74\x68\x65\x20\x75\x6E\x68\x69\x64\x69\x6E\x67\x2C\x20\x63\x6C\x69\x63\x6B\x20\x63\x61\x6E\x63\x65\x6C\x2E\x3C\x2F\x6C\x69\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x43\x61\x6E\x63\x65\x6C\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x4F\x4B\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74\x28\x64\x6F\x63\x75\x6D\x65\x6E\x74\x2E\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64\x28\x26\x71\x75\x6F\x74\x3B\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74\x66\x6F\x72\x6D\x26\x71\x75\x6F\x74\x3B\x29\x2E\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74\x2E\x76\x61\x6C\x75\x65\x29\x3B\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x74\x64\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x30\x70\x78\x3B\x63\x75\x72\x73\x6F\x72\x3A\x64\x65\x66\x61\x75\x6C\x74\x3B\x63\x6F\x6C\x6F\x72\x3A\x23\x36\x36\x36\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B\x58\x26\x6E\x62\x73\x70\x3B\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x3C\x2F\x74\x61\x62\x6C\x65\x3E","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74","\x6C\x6F\x67","\x69\x6E\x6C\x69\x6E\x65","\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74\x20","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x41\x64\x64\x53\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E","\x69\x6E\x70\x75\x74","\x73\x68\x65\x65\x74","\x74\x79\x70\x65","\x62\x75\x74\x74\x6F\x6E","\x6E\x61\x6D\x65","\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x41\x63\x74\x69\x76\x61\x74\x65\x53\x68\x65\x65\x74\x28","\x27","\x29","\x6F\x6E\x63\x6C\x69\x63\x6B","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x41\x64\x64\x53\x68\x65\x65\x74","\x73\x68\x65\x65\x74\x31","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x41\x64\x64\x53\x68\x65\x65\x74\x52\x65\x6D\x6F\x74\x65","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x41\x63\x74\x69\x76\x61\x74\x65\x53\x68\x65\x65\x74","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x6C\x69\x67\x68\x74\x67\x72\x65\x65\x6E\x3B","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x74\x74\x70\x52\x65\x71\x75\x65\x73\x74","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x41\x6C\x65\x72\x74\x43\x6F\x6E\x74\x65\x6E\x74\x73","\x72\x65\x61\x64\x79\x53\x74\x61\x74\x65","\x73\x74\x61\x74\x75\x73","\x72\x65\x73\x70\x6F\x6E\x73\x65\x54\x65\x78\x74","\x63\x6C\x69\x70\x62\x6F\x61\x72\x64","\x43\x6C\x69\x70\x62\x6F\x61\x72\x64","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x41\x6A\x61\x78\x43\x61\x6C\x6C","\x69\x6E\x20\x61\x6A\x61\x78","\x58\x4D\x4C\x48\x74\x74\x70\x52\x65\x71\x75\x65\x73\x74","\x41\x63\x74\x69\x76\x65\x58\x4F\x62\x6A\x65\x63\x74","\x4D\x73\x78\x6D\x6C\x32\x2E\x58\x4D\x4C\x48\x54\x54\x50","\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x58\x4D\x4C\x48\x54\x54\x50","\x47\x69\x76\x69\x6E\x67\x20\x75\x70\x20\x3A\x28\x20\x43\x61\x6E\x6E\x6F\x74\x20\x63\x72\x65\x61\x74\x65\x20\x61\x6E\x20\x58\x4D\x4C\x48\x54\x54\x50\x20\x69\x6E\x73\x74\x61\x6E\x63\x65","\x6F\x6E\x72\x65\x61\x64\x79\x73\x74\x61\x74\x65\x63\x68\x61\x6E\x67\x65","\x50\x4F\x53\x54","\x6F\x70\x65\x6E","\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64","\x73\x65\x74\x52\x65\x71\x75\x65\x73\x74\x48\x65\x61\x64\x65\x72","\x73\x65\x6E\x64","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x53\x61\x76\x65\x53\x68\x65\x65\x74","\x6E\x75\x6D\x73\x68\x65\x65\x74\x73","\x63\x75\x72\x72\x65\x6E\x74\x69\x64","\x63\x75\x72\x72\x65\x6E\x74\x6E\x61\x6D\x65","\x73\x68\x65\x65\x74\x41\x72\x72","\x68\x69\x64\x64\x65\x6E","\x31","\x45\x64\x69\x74\x61\x62\x6C\x65\x43\x65\x6C\x6C\x73","\x61\x6C\x6C\x6F\x77","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x49\x6E\x73\x65\x72\x74\x57\x6F\x72\x6B\x62\x6F\x6F\x6B","\x70\x61\x72\x73\x65","\x73\x61\x76\x65\x73\x74\x72","\x65\x6E\x64","\x73\x75\x62\x73\x74\x72\x69\x6E\x67","\x65\x78\x69\x73\x74\x73","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x4C\x6F\x61\x64","\x73\x65\x74\x54\x69\x6D\x65\x6F\x75\x74","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x52\x65\x6E\x61\x6D\x65\x53\x68\x65\x65\x74","\x3C\x73\x70\x61\x6E\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x3E","\x52\x65\x6E\x61\x6D\x65\x2D","\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x3E","\x50\x6C\x65\x61\x73\x65\x20\x65\x6E\x73\x75\x72\x65\x20\x74\x68\x61\x74\x20\x79\x6F\x75\x20\x44\x4F\x20\x4E\x4F\x54\x20\x68\x61\x76\x65\x20\x41\x4E\x59\x20\x73\x70\x61\x63\x65\x73\x20\x69\x6E\x20\x74\x68\x65\x20\x73\x68\x65\x65\x74\x20\x6E\x61\x6D\x65\x2E","\x3C\x2F\x73\x70\x61\x6E\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x20\x69\x64\x3D\x22\x6E\x65\x77\x53\x68\x65\x65\x74\x4E\x61\x6D\x65\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x77\x69\x64\x74\x68\x3A\x33\x38\x30\x70\x78\x3B\x22\x20\x76\x61\x6C\x75\x65\x3D\x22","\x22\x3E\x3C\x62\x72\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x53\x75\x62\x6D\x69\x74\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x52\x65\x6E\x61\x6D\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x43\x61\x6E\x63\x65\x6C\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x52\x65\x6E\x61\x6D\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x74\x64\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x30\x70\x78\x3B\x63\x75\x72\x73\x6F\x72\x3A\x64\x65\x66\x61\x75\x6C\x74\x3B\x63\x6F\x6C\x6F\x72\x3A\x23\x36\x36\x36\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x52\x65\x6E\x61\x6D\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B\x58\x26\x6E\x62\x73\x70\x3B\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x3C\x2F\x74\x61\x62\x6C\x65\x3E","\x6E\x65\x77\x53\x68\x65\x65\x74\x4E\x61\x6D\x65","\x66\x6F\x63\x75\x73","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x52\x65\x6E\x61\x6D\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x52\x65\x6E\x61\x6D\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74","\x6C\x65\x6E\x67\x74\x68","\x20","\x69\x6E\x64\x65\x78\x4F\x66","\x41\x20\x73\x70\x61\x63\x65\x20\x77\x61\x73\x20\x66\x6F\x75\x6E\x64\x20\x69\x6E\x20\x74\x68\x65\x20\x6E\x65\x77\x20\x6E\x61\x6D\x65\x2E\x20\x50\x6C\x65\x61\x73\x65\x20\x65\x6E\x73\x75\x72\x65\x20\x74\x68\x61\x74\x20\x74\x68\x65\x20\x6E\x65\x77\x20\x6E\x61\x6D\x65\x20\x68\x61\x73\x20\x6E\x6F\x20\x73\x61\x70\x63\x65\x73","\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65","\x73\x68\x65\x65\x74\x6E\x61\x6D\x65","\x20\x61\x6C\x72\x65\x61\x64\x79\x20\x65\x78\x69\x73\x74\x73","\x72\x65\x6E\x73\x68\x65\x65\x74\x20","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x52\x65\x6E\x61\x6D\x65\x53\x68\x65\x65\x74\x52\x65\x6D\x6F\x74\x65","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x43\x72\x65\x61\x74\x65\x4E\x65\x77\x42\x6F\x6F\x6B","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x4E\x65\x77\x42\x6F\x6F\x6B","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x4D\x6F\x76\x65","\x70\x72\x65\x76\x69\x6F\x75\x73\x53\x69\x62\x6C\x69\x6E\x67","\x43\x61\x6E\x6E\x6F\x74\x20\x6D\x6F\x76\x65\x20\x6C\x65\x66\x74\x6D\x6F\x73\x74\x20\x53\x68\x65\x65\x74\x20\x66\x75\x72\x74\x68\x65\x72\x20\x74\x6F\x20\x74\x68\x65\x20\x6C\x65\x66\x74","\x6E\x65\x78\x74\x53\x69\x62\x6C\x69\x6E\x67","\x43\x61\x6E\x6E\x6F\x74\x20\x6D\x6F\x76\x65\x20\x72\x69\x67\x68\x74\x6D\x6F\x73\x74\x20\x53\x68\x65\x65\x74\x20\x66\x75\x72\x74\x68\x65\x72\x20\x74\x6F\x20\x74\x68\x65\x20\x72\x69\x67\x68\x74","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x4D\x6F\x76\x65\x4C\x65\x66\x74","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x4D\x6F\x76\x65\x52\x69\x67\x68\x74","\x72\x69\x67\x68\x74","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x43\x6F\x70\x79\x53\x68\x65\x65\x74","\x63\x6F\x70\x69\x65\x64\x20\x73\x68\x65\x65\x74\x3A","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x50\x61\x73\x74\x65\x53\x68\x65\x65\x74","\x63\x6C\x69\x70\x73\x68\x65\x65\x74","\x53\x68\x65\x65\x74\x42\x61\x72","\x62\x61\x73\x65\x44\x69\x76","\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2D\x73\x68\x65\x65\x74\x62\x61\x72","\x70\x72\x65\x62\x75\x74\x74\x6F\x6E\x73\x44\x69\x76","\x63\x73\x73\x54\x65\x78\x74","\x64\x69\x73\x70\x6C\x61\x79\x3A\x69\x6E\x6C\x69\x6E\x65\x3B","\x26\x6E\x62\x73\x70\x26\x6E\x62\x73\x70\x26\x6E\x62\x73\x70\x26\x6E\x62\x73\x70\x26\x6E\x62\x73\x70\x26\x6E\x62\x73\x70\x26\x6E\x62\x73\x70\x26\x6E\x62\x73\x70","\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2D\x73\x68\x65\x65\x74\x62\x61\x72\x2D\x70\x72\x65\x62\x75\x74\x74\x6F\x6E\x73","\x62\x75\x74\x74\x6F\x6E\x73\x44\x69\x76","\x62\x75\x74\x74\x6F\x6E\x41\x63\x74\x69\x6F\x6E\x73\x44\x69\x76","\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2D\x73\x68\x65\x65\x74\x62\x61\x72\x2D\x62\x75\x74\x74\x6F\x6E\x61\x63\x74\x69\x6F\x6E\x73","\x73\x62\x73\x62\x61\x2D\x61\x64\x64","\x61\x64\x64\x2D\x32\x2E\x70\x6E\x67","\x53\x68\x65\x65\x74\x42\x61\x72\x53\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E","\x65\x6C\x65","\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x3B\x64\x69\x73\x70\x6C\x61\x79\x3A\x69\x6E\x6C\x69\x6E\x65\x3B\x70\x61\x64\x64\x69\x6E\x67\x3A\x35\x70\x78\x20\x35\x70\x78\x20\x32\x70\x78\x20\x35\x70\x78\x3B\x62\x6F\x72\x64\x65\x72\x3A\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x23\x30\x30\x30\x3B","\x69\x6D\x67","\x2D\x69\x6D\x67","\x73\x72\x63","\x64\x65\x66\x61\x75\x6C\x74\x49\x6D\x61\x67\x65\x50\x72\x65\x66\x69\x78","\x43\x6F\x6E\x73\x74\x61\x6E\x74\x73","\x6D\x65\x6E\x75\x2D\x64\x72\x6F\x70\x64\x6F\x77\x6E\x2E\x70\x6E\x67","\x70\x61\x64\x64\x69\x6E\x67\x3A\x30\x70\x78\x20\x32\x70\x78\x3B\x77\x69\x64\x74\x68\x3A\x31\x36\x70\x78\x3B\x68\x65\x69\x67\x68\x74\x3A\x31\x36\x70\x78\x3B\x76\x65\x72\x74\x69\x63\x61\x6C\x2D\x61\x6C\x69\x67\x6E\x3A\x6D\x69\x64\x64\x6C\x65\x3B","\x77\x69\x64\x74\x68\x3A\x31\x36\x70\x78\x3B\x68\x65\x69\x67\x68\x74\x3A\x31\x36\x70\x78\x3B\x76\x65\x72\x74\x69\x63\x61\x6C\x2D\x61\x6C\x69\x67\x6E\x3A\x6D\x69\x64\x64\x6C\x65\x3B","\x64\x69\x73\x70\x6C\x61\x79\x3A\x69\x6E\x6C\x69\x6E\x65\x3B\x70\x61\x64\x64\x69\x6E\x67\x3A\x35\x70\x78\x20\x35\x70\x78\x20\x32\x70\x78\x20\x35\x70\x78\x3B","\x53\x68\x65\x65\x74\x42\x61\x72\x42\x75\x74\x74\x6F\x6E\x41\x63\x74\x69\x76\x61\x74\x65","\x69\x73\x61\x63\x74\x69\x76\x65","\x23\x43\x43\x43","\x73\x62\x73\x62\x2D\x6D\x65\x6E\x75","\x53\x68\x65\x65\x74\x42\x61\x72\x42\x75\x74\x74\x6F\x6E\x53\x65\x74\x4E\x61\x6D\x65","\x53\x68\x65\x65\x74\x42\x61\x72\x53\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E\x50\x72\x65\x73\x73","\x63\x6C\x69\x63\x6B\x65\x64\x73\x68\x65\x65\x74\x69\x64","\x53\x68\x65\x65\x74\x42\x61\x72\x53\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E\x4D\x65\x6E\x75\x49\x74\x65\x6D","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x70\x61\x64\x64\x69\x6E\x67\x3A\x33\x70\x78\x20\x34\x70\x78\x3B\x77\x69\x64\x74\x68\x3A\x31\x30\x30\x70\x78\x3B\x68\x65\x69\x67\x68\x74\x3A\x32\x30\x70\x78\x3B\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x23\x46\x46\x46\x3B","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x43\x6F\x6C\x6F\x72\x3A\x23\x46\x46\x46\x3B","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x43\x6F\x6C\x6F\x72\x3A\x23\x43\x43\x43\x3B","\x4D\x6F\x75\x73\x65\x44\x6F\x77\x6E","\x53\x68\x65\x65\x74\x42\x61\x72\x4D\x65\x6E\x75\x49\x74\x65\x6D\x50\x72\x65\x73\x73","\x73\x62\x73\x62\x5F\x64\x65\x6C\x65\x74\x65\x73\x68\x65\x65\x74","\x73\x62\x73\x62\x5F\x68\x69\x64\x65\x73\x68\x65\x65\x74","\x73\x62\x73\x62\x5F\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74","\x73\x62\x73\x62\x5F\x63\x6F\x70\x79\x73\x68\x65\x65\x74","\x73\x62\x73\x62\x5F\x6D\x6F\x76\x65\x6C\x65\x66\x74","\x73\x62\x73\x62\x5F\x6D\x6F\x76\x65\x72\x69\x67\x68\x74","\x73\x62\x73\x62\x5F\x70\x61\x73\x74\x65\x73\x68\x65\x65\x74","\x73\x62\x73\x62\x5F\x72\x65\x6E\x61\x6D\x65\x73\x68\x65\x65\x74","\x73\x62\x73\x62\x5F\x63\x6C\x6F\x73\x65\x6D\x65\x6E\x75","\x53\x68\x65\x65\x74\x42\x61\x72\x53\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E\x4D\x65\x6E\x75","\x62\x6F\x72\x64\x65\x72\x3A\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x23\x30\x30\x30\x3B\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3A\x61\x62\x73\x6F\x6C\x75\x74\x65\x3B\x74\x6F\x70\x3A\x32\x30\x30\x70\x78\x3B\x6C\x65\x66\x74\x3A\x30\x70\x78\x3B\x77\x69\x64\x74\x68\x3D\x31\x30\x30\x70\x78\x3B\x7A\x2D\x69\x6E\x64\x65\x78\x3A\x31\x32\x30","\x20\x44\x65\x6C\x65\x74\x65\x20\x53\x68\x65\x65\x74","\x20\x48\x69\x64\x65\x20\x53\x68\x65\x65\x74\x20","\x20\x55\x6E\x68\x69\x64\x65\x20\x53\x68\x65\x65\x74\x20","\x20\x52\x65\x6E\x61\x6D\x65\x20\x53\x68\x65\x65\x74\x20","\x20\x4D\x6F\x76\x65\x20\x4C\x65\x66\x74\x20","\x20\x4D\x6F\x76\x65\x20\x52\x69\x67\x68\x74\x20","\x20\x43\x6F\x70\x79\x20\x53\x68\x65\x65\x74\x20","\x20\x50\x61\x73\x74\x65\x20\x53\x68\x65\x65\x74\x20","\x20\x43\x61\x6E\x63\x65\x6C","\x74\x6F\x70\x6C\x65\x76\x65\x6C","\x53\x68\x65\x65\x74\x42\x61\x72\x53\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E\x4D\x65\x6E\x75\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x74\x65\x5F\x6C\x65\x73\x73\x62\x75\x74\x74\x6F\x6E\x68","\x73\x6C\x69\x63\x65","\x6F\x66\x66\x73\x65\x74\x4C\x65\x66\x74","\x53\x63\x72\x69\x70\x74\x49\x6E\x66\x6F","\x53\x63\x72\x69\x70\x74\x43\x68\x65\x63\x6B","\x3C\x21\x2D\x2D\x73\x63\x72\x69\x70\x74","\x73\x63\x72\x69\x70\x74\x2D\x2D\x3E","\x73\x63\x72\x69\x70\x74\x73","\x68\x61\x6E\x64\x6C\x65","\x45\x76\x61\x6C\x55\x73\x65\x72\x53\x63\x72\x69\x70\x74","\x68\x65\x61\x64","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x73\x42\x79\x54\x61\x67\x4E\x61\x6D\x65","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x73\x63\x72\x69\x70\x74","\x74\x65\x78\x74\x2F\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74","\x63\x72\x65\x61\x74\x65\x54\x65\x78\x74\x4E\x6F\x64\x65","\x74\x65\x78\x74","\x69\x6E\x73\x65\x72\x74\x42\x65\x66\x6F\x72\x65","\x45\x76\x61\x6C\x55\x73\x65\x72\x53\x63\x72\x69\x70\x74\x73","\x43\x61\x6C\x6C\x4F\x75\x74\x4F\x6E\x52\x65\x6E\x64\x65\x72\x43\x65\x6C\x6C","\x63\x65\x6C\x6C\x73","\x76\x61\x6C\x75\x65\x74\x79\x70\x65","\x61\x74\x74\x72\x69\x62\x73","\x63\x68\x61\x72\x41\x74","\x74","\x74\x65\x78\x74\x76\x61\x6C\x75\x65\x66\x6F\x72\x6D\x61\x74","\x76\x61\x6C\x75\x65\x66\x6F\x72\x6D\x61\x74\x73","\x64\x65\x66\x61\x75\x6C\x74\x74\x65\x78\x74\x76\x61\x6C\x75\x65\x66\x6F\x72\x6D\x61\x74","\x74\x65\x78\x74\x2D\x68\x74\x6D\x6C","\x73\x68\x65\x65\x74\x69\x64","\x47\x65\x74\x43\x65\x6C\x6C\x44\x61\x74\x61\x56\x61\x6C\x75\x65","\x21","\x64\x61\x74\x61\x76\x61\x6C\x75\x65","\x47\x65\x74\x43\x65\x6C\x6C\x44\x61\x74\x61\x41\x72\x72\x61\x79","\x2C","\x73\x70\x6C\x69\x74","\x70\x75\x73\x68","\x55\x73\x65\x72\x53\x63\x72\x69\x70\x74\x44\x61\x74\x61","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x52\x65\x63\x61\x6C\x63\x75\x6C\x61\x74\x65\x49\x6E\x66\x6F","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x52\x65\x63\x61\x6C\x63\x75\x6C\x61\x74\x65\x41\x6C\x6C","\x63\x75\x72\x72\x65\x6E\x74","\x63\x61\x6C\x63\x6F\x72\x64\x65\x72","\x73\x68\x65\x65\x74\x73","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x52\x65\x63\x61\x6C\x63\x75\x6C\x61\x74\x65\x53\x74\x65\x70","\x70\x61\x73\x73","\x53\x70\x69\x6E\x6E\x65\x72\x57\x61\x69\x74\x43\x72\x65\x61\x74\x65","\x77\x61\x69\x74\x6C\x6F\x61\x64\x69\x6E\x67\x73\x70\x69\x6E\x6E\x65\x72","\x35\x30\x70\x78","\x3C\x69\x6D\x67\x20\x73\x72\x63\x3D\x22\x73\x74\x61\x74\x69\x63\x2F\x69\x6D\x61\x67\x65\x73\x2F\x73\x70\x69\x6E\x6E\x65\x72\x2E\x67\x69\x66\x22\x20\x61\x6C\x74\x3D\x22\x4C\x6F\x61\x64\x69\x6E\x67\x2E\x2E\x2E\x22\x20\x2F\x3E","\x53\x70\x69\x6E\x6E\x65\x72\x57\x61\x69\x74\x48\x69\x64\x65","\x49\x73\x43\x6F\x6F\x72\x64\x45\x64\x69\x74\x61\x62\x6C\x65","\x49\x73\x43\x65\x6C\x6C\x45\x64\x69\x74\x61\x62\x6C\x65","\x63\x75\x72\x72\x65\x6E\x74\x73\x68\x65\x65\x74","\x77\x6F\x72\x6B\x69\x6E\x67\x76\x61\x6C\x75\x65\x73","\x63\x6F\x6F\x72\x64","\x65\x63\x65\x6C\x6C","\x49\x73\x53\x63\x72\x6F\x6C\x6C\x50\x6F\x73\x73\x69\x62\x6C\x65"];var SocialCalc;if(!SocialCalc){alert(_0xfa49[0]);SocialCalc={};} ;SocialCalc[_0xfa49[1]]=null;SocialCalc[_0xfa49[2]]=_0xfa49[3];SocialCalc[_0xfa49[4]]=function (_0xc8b2x2,_0xc8b2x3,_0xc8b2x4){this[_0xfa49[5]]=_0xc8b2x2;this[_0xfa49[6]]=_0xc8b2x3;this[_0xfa49[7]]=_0xc8b2x4;this[_0xfa49[8]]={};this[_0xfa49[9]]=0;this[_0xfa49[10]]=0;this[_0xfa49[11]]=null;this[_0xfa49[12]]=_0xfa49[13];this[_0xfa49[14]]=_0xfa49[15];this[_0xfa49[16]]=_0xfa49[17];this[_0xfa49[18]]=_0xfa49[19];this[_0xfa49[20]]=_0xfa49[21];SocialCalc[_0xfa49[1]]=this;this[_0xfa49[22]]= new SocialCalc.SheetBar();} ;SocialCalc[_0xfa49[4]][_0xfa49[24]][_0xfa49[23]]=function (){return SocialCalc.GetCurrentWorkBookControl();} ;SocialCalc[_0xfa49[4]][_0xfa49[24]][_0xfa49[25]]=function (){return SocialCalc.InitializeWorkBookControl(this);} ;SocialCalc[_0xfa49[4]][_0xfa49[24]][_0xfa49[26]]=function (_0xc8b2x5,_0xc8b2x6){return SocialCalc.ExecuteWorkBookControlCommand(this,_0xc8b2x5,_0xc8b2x6);} ;SocialCalc[_0xfa49[26]]=function (_0xc8b2x7,_0xc8b2x5,_0xc8b2x6){if(_0xc8b2x5[_0xfa49[27]]==_0xfa49[28]){_0xc8b2x7[_0xfa49[5]].WorkbookScheduleCommand(_0xc8b2x5,_0xc8b2x6);return ;} ;if(_0xc8b2x5[_0xfa49[27]]!=_0xfa49[29]){return ;} ;var _0xc8b2x8= new SocialCalc.Parse(_0xc8b2x5[_0xfa49[30]]);var _0xc8b2x9=_0xc8b2x8.NextToken();switch(_0xc8b2x9){case _0xfa49[31]:SocialCalc.WorkBookControlAddSheetRemote(null);break ;;case _0xfa49[33]:var _0xc8b2xa=_0xc8b2x5[_0xfa49[32]];SocialCalc.WorkBookControlAddSheetRemote(_0xc8b2xa);break ;;case _0xfa49[34]:var _0xc8b2xb=_0xc8b2x8.NextToken();SocialCalc.WorkBookControlDelSheetRemote(_0xc8b2xb);break ;;case _0xfa49[35]:var _0xc8b2xb=_0xc8b2x8.NextToken();var _0xc8b2xc=_0xc8b2x8.NextToken();var _0xc8b2xd=_0xc8b2x8.NextToken();SocialCalc.WorkBookControlRenameSheetRemote(_0xc8b2xb,_0xc8b2xc,_0xc8b2xd);break ;;case _0xfa49[36]:var _0xc8b2xb=_0xc8b2x8.NextToken();SocialCalc.WorkBookControlActivateSheet(_0xc8b2xb);break ;;case _0xfa49[37]:var _0xc8b2xb=_0xc8b2x8.NextToken();break ;;case _0xfa49[38]:var _0xc8b2xb=_0xc8b2x8.NextToken();break ;;} ;} ;SocialCalc[_0xfa49[23]]=function (){return SocialCalc[_0xfa49[1]];} ;SocialCalc[_0xfa49[25]]=function (_0xc8b2x7){var _0xc8b2xe=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2xe[_0xfa49[40]]=_0xc8b2x7[_0xfa49[20]];var _0xc8b2xf=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[6]]);_0xc8b2xf[_0xfa49[42]](_0xc8b2xe);SocialCalc.WorkBookControlAddSheet(false);} ;SocialCalc[_0xfa49[43]]=function (_0xc8b2xb){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2xb==_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]){SocialCalc.WorkBookControlDelSheet();return ;} ;var _0xc8b2xf=document[_0xfa49[41]](_0xfa49[45]);var _0xc8b2x10=document[_0xfa49[41]](_0xc8b2xb);var _0xc8b2x11=_0xc8b2x10[_0xfa49[44]];var _0xc8b2x12=_0xc8b2x10[_0xfa49[46]];delete _0xc8b2x7[_0xfa49[8]][_0xc8b2x11];_0xc8b2xf[_0xfa49[47]](_0xc8b2x10);var _0xc8b2x13=document[_0xfa49[41]](_0xfa49[48]);var _0xc8b2x14=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x11);_0xc8b2x13[_0xfa49[47]](_0xc8b2x14);_0xc8b2x7[_0xfa49[5]].DeleteWorkBookSheet(_0xc8b2x11,_0xc8b2x12);_0xc8b2x7[_0xfa49[10]]=_0xc8b2x7[_0xfa49[10]]-1;} ;SocialCalc[_0xfa49[50]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;if(_0xc8b2x7[_0xfa49[10]]==1){var _0xc8b2x15=_0xfa49[55]+_0xfa49[56]+_0xfa49[57]+_0xfa49[58];_0xc8b2x15+=_0xfa49[59];_0xc8b2x15+=_0xfa49[60]+_0xfa49[61];var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xc8b2x7[_0xfa49[14]];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=100;_0xc8b2x16[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];_0xc8b2x16[_0xfa49[63]][_0xfa49[73]]=_0xfa49[74];_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[75];_0xc8b2x16[_0xfa49[40]]=_0xfa49[76]+_0xfa49[77]+_0xfa49[78]+_0xfa49[79]+_0xfa49[80]+_0xfa49[81]+_0xc8b2x15+_0xfa49[82];SocialCalc.DragRegister(_0xc8b2x16[_0xfa49[83]][_0xfa49[83]][_0xfa49[83]][_0xfa49[83]],true,true,{MouseDown:SocialCalc[_0xfa49[84]],MouseMove:SocialCalc[_0xfa49[85]],MouseUp:SocialCalc[_0xfa49[85]],Disabled:null,positionobj:_0xc8b2x16});_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);return ;} ;var _0xc8b2xe=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[14]]);if(_0xc8b2xe){return ;} ;var _0xc8b2x18=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];var _0xc8b2x15=_0xfa49[55]+_0xfa49[56]+_0xfa49[87]+_0xfa49[88];_0xc8b2x15+=_0xfa49[89];_0xc8b2x15+=_0xfa49[90];_0xc8b2x15+=_0xfa49[91];_0xc8b2x15+=_0xfa49[92];_0xc8b2x15+=_0xfa49[60]+_0xfa49[93]+_0xfa49[94];var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xc8b2x7[_0xfa49[14]];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=100;_0xc8b2x16[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];_0xc8b2x16[_0xfa49[63]][_0xfa49[73]]=_0xfa49[74];_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[75];_0xc8b2x16[_0xfa49[40]]=_0xfa49[76]+_0xfa49[77]+_0xfa49[78]+_0xfa49[79]+_0xfa49[80]+_0xfa49[81]+_0xc8b2x15+_0xfa49[82];SocialCalc.DragRegister(_0xc8b2x16[_0xfa49[83]][_0xfa49[83]][_0xfa49[83]][_0xfa49[83]],true,true,{MouseDown:SocialCalc[_0xfa49[84]],MouseMove:SocialCalc[_0xfa49[85]],MouseUp:SocialCalc[_0xfa49[85]],Disabled:null,positionobj:_0xc8b2x16});_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);} ;SocialCalc[_0xfa49[95]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2x19=_0xc8b2x7[_0xfa49[5]][_0xfa49[53]];var _0xc8b2x1a=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[14]]);_0xc8b2x1a[_0xfa49[40]]=_0xfa49[3];SocialCalc.DragUnregister(_0xc8b2x1a);SocialCalc.KeyboardFocus();if(_0xc8b2x1a[_0xfa49[96]]){_0xc8b2x1a[_0xfa49[96]][_0xfa49[47]](_0xc8b2x1a);} ;} ;SocialCalc[_0xfa49[97]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();SocialCalc.WorkBookControlDeleteSheetHide();var _0xc8b2xf=document[_0xfa49[41]](_0xfa49[45]);var _0xc8b2x1b=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]);var _0xc8b2x1c=_0xc8b2x1b[_0xfa49[44]];var _0xc8b2x1d=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];delete _0xc8b2x7[_0xfa49[8]][_0xc8b2x1c];_0xc8b2xf[_0xfa49[47]](_0xc8b2x1b);var _0xc8b2x13=document[_0xfa49[41]](_0xfa49[48]);var _0xc8b2x14=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1b[_0xfa49[44]]);_0xc8b2x13[_0xfa49[47]](_0xc8b2x14);_0xc8b2x7[_0xfa49[11]]=null;_0xc8b2x7[_0xfa49[5]].DeleteWorkBookSheet(_0xc8b2x1c,_0xc8b2x1d);_0xc8b2x7[_0xfa49[10]]=_0xc8b2x7[_0xfa49[10]]-1;var _0xc8b2x1e=_0xfa49[98]+_0xc8b2x1c;SocialCalc[_0xfa49[102]][_0xfa49[101]](_0xfa49[99],{cmdtype:_0xfa49[29],id:_0xfa49[100],cmdstr:_0xc8b2x1e});for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){if(_0xc8b2x1f!=null){_0xc8b2x7[_0xfa49[11]]=_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f];_0xc8b2x7[_0xfa49[11]][_0xfa49[104]](_0xfa49[63],_0xfa49[103]);SocialCalc.SheetBarButtonActivate(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],true);break ;} ;} ;if(_0xc8b2x7[_0xfa49[11]]!=null){_0xc8b2x7[_0xfa49[5]].ActivateWorkBookSheet(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],null);} ;} ;SocialCalc[_0xfa49[105]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;if(_0xc8b2x7[_0xfa49[10]]==1){var _0xc8b2x15=_0xfa49[55]+_0xfa49[56]+_0xfa49[57]+_0xfa49[58];_0xc8b2x15+=_0xfa49[106];_0xc8b2x15+=_0xfa49[60]+_0xfa49[107];var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xc8b2x7[_0xfa49[16]];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=100;_0xc8b2x16[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];_0xc8b2x16[_0xfa49[63]][_0xfa49[73]]=_0xfa49[74];_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[75];_0xc8b2x16[_0xfa49[40]]=_0xfa49[76]+_0xfa49[77]+_0xfa49[78]+_0xfa49[79]+_0xfa49[108]+_0xfa49[81]+_0xc8b2x15+_0xfa49[82];SocialCalc.DragRegister(_0xc8b2x16[_0xfa49[83]][_0xfa49[83]][_0xfa49[83]][_0xfa49[83]],true,true,{MouseDown:SocialCalc[_0xfa49[84]],MouseMove:SocialCalc[_0xfa49[85]],MouseUp:SocialCalc[_0xfa49[85]],Disabled:null,positionobj:_0xc8b2x16});_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);return ;} ;var _0xc8b2xe=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[16]]);if(_0xc8b2xe){return ;} ;var _0xc8b2x18=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];var _0xc8b2x15=_0xfa49[55]+_0xfa49[56]+_0xfa49[109]+_0xfa49[88];_0xc8b2x15+=_0xfa49[89];_0xc8b2x15+=_0xfa49[110];_0xc8b2x15+=_0xfa49[111];_0xc8b2x15+=_0xfa49[92];_0xc8b2x15+=_0xfa49[60]+_0xfa49[112]+_0xfa49[113];var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xc8b2x7[_0xfa49[16]];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=100;_0xc8b2x16[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];_0xc8b2x16[_0xfa49[63]][_0xfa49[73]]=_0xfa49[74];_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[75];_0xc8b2x16[_0xfa49[40]]=_0xfa49[76]+_0xfa49[77]+_0xfa49[78]+_0xfa49[79]+_0xfa49[108]+_0xfa49[81]+_0xc8b2x15+_0xfa49[82];SocialCalc.DragRegister(_0xc8b2x16[_0xfa49[83]][_0xfa49[83]][_0xfa49[83]][_0xfa49[83]],true,true,{MouseDown:SocialCalc[_0xfa49[84]],MouseMove:SocialCalc[_0xfa49[85]],MouseUp:SocialCalc[_0xfa49[85]],Disabled:null,positionobj:_0xc8b2x16});_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);} ;SocialCalc[_0xfa49[114]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2x19=_0xc8b2x7[_0xfa49[5]][_0xfa49[53]];var _0xc8b2x1a=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[16]]);_0xc8b2x1a[_0xfa49[40]]=_0xfa49[3];SocialCalc.DragUnregister(_0xc8b2x1a);SocialCalc.KeyboardFocus();if(_0xc8b2x1a[_0xfa49[96]]){_0xc8b2x1a[_0xfa49[96]][_0xfa49[47]](_0xc8b2x1a);} ;} ;SocialCalc[_0xfa49[115]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();SocialCalc.WorkBookControlHideSheetHide();var _0xc8b2xf=document[_0xfa49[41]](_0xfa49[45]);var _0xc8b2x1b=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]);var _0xc8b2x1c=_0xc8b2x1b[_0xfa49[44]];var _0xc8b2x1d=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];var _0xc8b2x13=document[_0xfa49[41]](_0xfa49[48]);var _0xc8b2x14=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1b[_0xfa49[44]]);SocialCalc.SheetBarButtonActivate(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],false);_0xc8b2x14[_0xfa49[63]][_0xfa49[116]]=_0xfa49[117];_0xc8b2x7[_0xfa49[11]]=null;_0xc8b2x7[_0xfa49[10]]=_0xc8b2x7[_0xfa49[10]]-1;var _0xc8b2x1e=_0xfa49[118]+_0xc8b2x1c;SocialCalc[_0xfa49[102]][_0xfa49[101]](_0xfa49[99],{cmdtype:_0xfa49[29],id:_0xfa49[100],cmdstr:_0xc8b2x1e});for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){if(_0xc8b2x1f!=null&&document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1f)[_0xfa49[63]][_0xfa49[116]]!=_0xfa49[117]){_0xc8b2x7[_0xfa49[11]]=_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f];break ;} ;} ;if(_0xc8b2x7[_0xfa49[11]]!=null){_0xc8b2x7[_0xfa49[11]][_0xfa49[104]](_0xfa49[63],_0xfa49[103]);SocialCalc.SheetBarButtonActivate(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],true);_0xc8b2x7[_0xfa49[5]].ActivateWorkBookSheet(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],null);} ;} ;SocialCalc[_0xfa49[119]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;var _0xc8b2x20=0;for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){if(document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1f)[_0xfa49[63]][_0xfa49[116]]==_0xfa49[117]){_0xc8b2x20++;} ;} ;if(_0xc8b2x20==0){var _0xc8b2x15=_0xfa49[55]+_0xfa49[56]+_0xfa49[120]+_0xfa49[58];_0xc8b2x15+=_0xfa49[121];_0xc8b2x15+=_0xfa49[60]+_0xfa49[122];var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xc8b2x7[_0xfa49[18]];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=100;_0xc8b2x16[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];_0xc8b2x16[_0xfa49[63]][_0xfa49[73]]=_0xfa49[74];_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[75];_0xc8b2x16[_0xfa49[40]]=_0xfa49[76]+_0xfa49[77]+_0xfa49[78]+_0xfa49[79]+_0xfa49[123]+_0xfa49[81]+_0xc8b2x15+_0xfa49[82];SocialCalc.DragRegister(_0xc8b2x16[_0xfa49[83]][_0xfa49[83]][_0xfa49[83]][_0xfa49[83]],true,true,{MouseDown:SocialCalc[_0xfa49[84]],MouseMove:SocialCalc[_0xfa49[85]],MouseUp:SocialCalc[_0xfa49[85]],Disabled:null,positionobj:_0xc8b2x16});_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);return ;} ;var _0xc8b2xe=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[18]]);if(_0xc8b2xe){return ;} ;var _0xc8b2x18=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];var _0xc8b2x15=_0xfa49[55]+_0xfa49[56]+_0xfa49[124]+_0xfa49[125]+_0xfa49[126];for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){if(document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1f)[_0xfa49[63]][_0xfa49[116]]==_0xfa49[117]){_0xc8b2x15+=_0xfa49[127]+_0xc8b2x1f+_0xfa49[128]+_0xc8b2x1f+_0xfa49[129]+_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f][_0xfa49[46]]+_0xfa49[130];} ;} ;_0xc8b2x15+=_0xfa49[131];_0xc8b2x15+=_0xfa49[132];_0xc8b2x15+=_0xfa49[133];_0xc8b2x15+=_0xfa49[92];_0xc8b2x15+=_0xfa49[60]+_0xfa49[134]+_0xfa49[135];var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xc8b2x7[_0xfa49[18]];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=100;_0xc8b2x16[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];_0xc8b2x16[_0xfa49[63]][_0xfa49[73]]=_0xfa49[74];_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[75];_0xc8b2x16[_0xfa49[40]]=_0xfa49[76]+_0xfa49[77]+_0xfa49[78]+_0xfa49[79]+_0xfa49[136]+_0xfa49[81]+_0xc8b2x15+_0xfa49[82];SocialCalc.DragRegister(_0xc8b2x16[_0xfa49[83]][_0xfa49[83]][_0xfa49[83]][_0xfa49[83]],true,true,{MouseDown:SocialCalc[_0xfa49[84]],MouseMove:SocialCalc[_0xfa49[85]],MouseUp:SocialCalc[_0xfa49[85]],Disabled:null,positionobj:_0xc8b2x16});_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);} ;SocialCalc[_0xfa49[137]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2x19=_0xc8b2x7[_0xfa49[5]][_0xfa49[53]];var _0xc8b2x1a=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[18]]);_0xc8b2x1a[_0xfa49[40]]=_0xfa49[3];SocialCalc.DragUnregister(_0xc8b2x1a);SocialCalc.KeyboardFocus();if(_0xc8b2x1a[_0xfa49[96]]){_0xc8b2x1a[_0xfa49[96]][_0xfa49[47]](_0xc8b2x1a);} ;} ;SocialCalc[_0xfa49[138]]=function (_0xc8b2x1c){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();SocialCalc.WorkBookControlUnhideSheetHide();var _0xc8b2x1b=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]);var _0xc8b2x21=_0xc8b2x1b[_0xfa49[44]];var _0xc8b2x1d=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];_0xc8b2x7[_0xfa49[11]][_0xfa49[104]](_0xfa49[63],_0xfa49[3]);var _0xc8b2x22=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];console[_0xfa49[139]](_0xc8b2x22);SocialCalc.SheetBarButtonActivate(_0xc8b2x22,false);var _0xc8b2x14=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1c);_0xc8b2x14[_0xfa49[63]][_0xfa49[116]]=_0xfa49[140];_0xc8b2x7[_0xfa49[11]]=null;_0xc8b2x7[_0xfa49[10]]=_0xc8b2x7[_0xfa49[10]]+1;var _0xc8b2x1e=_0xfa49[141]+_0xc8b2x1c;SocialCalc[_0xfa49[102]][_0xfa49[101]](_0xfa49[99],{cmdtype:_0xfa49[29],id:_0xfa49[100],cmdstr:_0xc8b2x1e});for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){if(_0xc8b2x1f!=null&&document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1f)[_0xfa49[63]][_0xfa49[116]]!=_0xfa49[117]){_0xc8b2x7[_0xfa49[11]]=_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f];break ;} ;} ;if(_0xc8b2x7[_0xfa49[11]]!=null){_0xc8b2x7[_0xfa49[11]][_0xfa49[104]](_0xfa49[63],_0xfa49[103]);SocialCalc.SheetBarButtonActivate(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],true);_0xc8b2x7[_0xfa49[5]].ActivateWorkBookSheet(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],null);} ;} ;SocialCalc[_0xfa49[142]]=function (_0xc8b2x23,_0xc8b2xb){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2xe=document[_0xfa49[39]](_0xfa49[143]);var _0xc8b2x1c=null;if(_0xc8b2xb!=null){_0xc8b2x1c=_0xc8b2xb;} else {_0xc8b2x1c=_0xfa49[144]+(_0xc8b2x7[_0xfa49[9]]+1).toString();_0xc8b2x7[_0xfa49[9]]=_0xc8b2x7[_0xfa49[9]]+1;} ;_0xc8b2xe[_0xfa49[104]](_0xfa49[145],_0xfa49[146]);if(_0xc8b2x23==null){_0xc8b2xe[_0xfa49[104]](_0xfa49[46],_0xc8b2x1c);} else {_0xc8b2xe[_0xfa49[104]](_0xfa49[46],_0xc8b2x23);} ;_0xc8b2xe[_0xfa49[104]](_0xfa49[44],_0xc8b2x1c);_0xc8b2xe[_0xfa49[104]](_0xfa49[147],_0xc8b2x1c);var _0xc8b2x24=_0xfa49[148]+_0xfa49[149]+_0xc8b2x1c+_0xfa49[149]+_0xfa49[150];_0xc8b2xe[_0xfa49[104]](_0xfa49[151],_0xc8b2x24);_0xc8b2x7[_0xfa49[8]][_0xc8b2x1c]=_0xc8b2xe;var _0xc8b2xf=document[_0xfa49[41]](_0xfa49[45]);_0xc8b2xf[_0xfa49[42]](_0xc8b2xe);_0xc8b2x7[_0xfa49[10]]=_0xc8b2x7[_0xfa49[10]]+1;var _0xc8b2x25= new SocialCalc.SheetBarSheetButton(_0xfa49[49]+_0xc8b2x1c,(_0xc8b2x23?_0xc8b2x23:_0xc8b2x1c),document[_0xfa49[41]](_0xfa49[48]),{},{MouseDown:function (){SocialCalc.SheetBarSheetButtonPress(_0xc8b2x1c);} ,Repeat:function (){} ,Disabled:function (){} });return _0xc8b2xe;} ;SocialCalc[_0xfa49[152]]=function (_0xc8b2x26,_0xc8b2x23){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;var _0xc8b2xe=SocialCalc.WorkBookControlAddSheetButton(_0xc8b2x23);var _0xc8b2x22=_0xfa49[153];if(_0xc8b2x7[_0xfa49[11]]!=null){_0xc8b2x7[_0xfa49[11]][_0xfa49[104]](_0xfa49[63],_0xfa49[3]);_0xc8b2x22=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];SocialCalc.SheetBarButtonActivate(_0xc8b2x22,false);} ;_0xc8b2xe[_0xfa49[104]](_0xfa49[63],_0xfa49[103]);_0xc8b2x7[_0xfa49[11]]=_0xc8b2xe;var _0xc8b2x27=_0xc8b2xe[_0xfa49[44]];SocialCalc.SheetBarButtonActivate(_0xc8b2x27,true);if(_0xc8b2x26){_0xc8b2x7[_0xfa49[5]].AddNewWorkBookSheet(_0xc8b2x27,_0xc8b2x22,false);var _0xc8b2x1e=_0xfa49[31];SocialCalc[_0xfa49[102]][_0xfa49[101]](_0xfa49[99],{cmdtype:_0xfa49[29],id:_0xfa49[100],cmdstr:_0xc8b2x1e});} ;} ;SocialCalc[_0xfa49[154]]=function (_0xc8b2x28){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2xe=SocialCalc.WorkBookControlAddSheetButton();_0xc8b2x7[_0xfa49[5]].AddNewWorkBookSheetNoSwitch(_0xc8b2xe[_0xfa49[44]],_0xc8b2xe[_0xfa49[46]],_0xc8b2x28);} ;SocialCalc[_0xfa49[155]]=function (_0xc8b2x1c){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2xf=document[_0xfa49[41]](_0xc8b2x1c);_0xc8b2xf[_0xfa49[104]](_0xfa49[63],_0xfa49[156]);SocialCalc.SheetBarButtonActivate(_0xc8b2x1c,true);var _0xc8b2x22=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];if(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]!=_0xc8b2xf[_0xfa49[44]]){_0xc8b2x7[_0xfa49[11]][_0xfa49[104]](_0xfa49[63],_0xfa49[3]);SocialCalc.SheetBarButtonActivate(_0xc8b2x22,false);} ;_0xc8b2x7[_0xfa49[11]]=_0xc8b2xf;_0xc8b2x7[_0xfa49[5]].ActivateWorkBookSheet(_0xc8b2x1c,_0xc8b2x22);} ;SocialCalc[_0xfa49[157]]=null;SocialCalc[_0xfa49[158]]=function (){var _0xc8b2x29=_0xfa49[3];var _0xc8b2x2a=SocialCalc[_0xfa49[157]];if(_0xc8b2x2a[_0xfa49[159]]==4){try{if(_0xc8b2x2a[_0xfa49[160]]==200){_0xc8b2x29=_0xc8b2x2a[_0xfa49[161]]||_0xfa49[3];_0xc8b2x2a=null;} else {;;} ;} catch(e){} ;SocialCalc[_0xfa49[2]]=_0xc8b2x29;SocialCalc[_0xfa49[163]][_0xfa49[162]]=_0xc8b2x29;} ;} ;SocialCalc[_0xfa49[164]]=function (_0xc8b2x2b,_0xc8b2x2c){var _0xc8b2x2a=null;alert(_0xfa49[165]);if(window[_0xfa49[166]]){_0xc8b2x2a= new XMLHttpRequest();} else {if(window[_0xfa49[167]]){try{_0xc8b2x2a= new ActiveXObject(_0xfa49[168]);} catch(e){try{_0xc8b2x2a= new ActiveXObject(_0xfa49[169]);} catch(e){} ;} ;} ;} ;if(!_0xc8b2x2a){alert(_0xfa49[170]);return false;} ;SocialCalc[_0xfa49[157]]=_0xc8b2x2a;_0xc8b2x2a[_0xfa49[171]]=SocialCalc[_0xfa49[158]];_0xc8b2x2a[_0xfa49[173]](_0xfa49[172],document.URL,true);_0xc8b2x2a[_0xfa49[176]](_0xfa49[174],_0xfa49[175]);_0xc8b2x2a[_0xfa49[177]](_0xc8b2x2c);return true;} ;SocialCalc[_0xfa49[178]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2x2d={};_0xc8b2x2d[_0xfa49[179]]=_0xc8b2x7[_0xfa49[10]];_0xc8b2x2d[_0xfa49[180]]=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];_0xc8b2x2d[_0xfa49[181]]=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];_0xc8b2x2d[_0xfa49[182]]={};for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){var _0xc8b2xa=_0xc8b2x7[_0xfa49[5]].SaveWorkBookSheet(_0xc8b2x1f);_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f]={};_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[32]]=_0xc8b2xa;_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]]=_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f][_0xfa49[46]];_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[183]]=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1f)[_0xfa49[63]][_0xfa49[116]]==_0xfa49[117]?_0xfa49[184]:_0xfa49[100];} ;if(SocialCalc[_0xfa49[185]]&&SocialCalc[_0xfa49[185]][_0xfa49[186]]){_0xc8b2x2d[_0xfa49[185]]={};for(var _0xc8b2x2e in SocialCalc[_0xfa49[185]]){_0xc8b2x2d[_0xfa49[185]][_0xc8b2x2e]=SocialCalc[_0xfa49[185]][_0xc8b2x2e];} ;} ;SocialCalc[_0xfa49[2]]=JSON[_0xfa49[187]](_0xc8b2x2d);return SocialCalc[_0xfa49[2]];} ;SocialCalc[_0xfa49[188]]=function (_0xc8b2x28){var _0xc8b2x2d;if(_0xc8b2x28){_0xc8b2x2d=JSON[_0xfa49[189]](_0xc8b2x28);} ;var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();for(var _0xc8b2x1f in _0xc8b2x2d[_0xfa49[182]]){var _0xc8b2x28=_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[32]][_0xfa49[190]];var _0xc8b2x2f=_0xc8b2x7[_0xfa49[5]][_0xfa49[53]].DecodeSpreadsheetSave(_0xc8b2x28);if(_0xc8b2x2f){if(_0xc8b2x2f[_0xfa49[144]]){_0xc8b2x28=_0xc8b2x28[_0xfa49[192]](_0xc8b2x2f[_0xfa49[144]][_0xfa49[54]],_0xc8b2x2f[_0xfa49[144]][_0xfa49[191]]);} ;} ;var _0xc8b2x23=_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]];var _0xc8b2xb=_0xc8b2x7[_0xfa49[5]].SheetNameExistsInWorkBook(_0xc8b2x23);if(_0xc8b2xb){console[_0xfa49[139]](_0xc8b2x23+_0xfa49[193]);_0xc8b2x7[_0xfa49[5]].LoadRenameWorkBookSheet(_0xc8b2xb,_0xc8b2x28,_0xc8b2x23);} else {_0xc8b2xb=_0xfa49[144]+(_0xc8b2x7[_0xfa49[9]]+1).toString();_0xc8b2x7[_0xfa49[9]]=_0xc8b2x7[_0xfa49[9]]+1;SocialCalc.WorkBookControlAddSheetButton(_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]],_0xc8b2xb);_0xc8b2x7[_0xfa49[5]].AddNewWorkBookSheetNoSwitch(_0xc8b2xb,_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]],_0xc8b2x28);} ;} ;} ;SocialCalc[_0xfa49[194]]=function (_0xc8b2x28){var _0xc8b2x2d;if(_0xc8b2x28==_0xfa49[3]){return ;} ;if(_0xc8b2x28){_0xc8b2x2d=JSON[_0xfa49[189]](_0xc8b2x28);} else {_0xc8b2x2d=JSON[_0xfa49[189]](SocialCalc.TestWorkBookSaveStr);} ;var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();SocialCalc.WorkBookControlCreateNewBook();var _0xc8b2x30=true;var _0xc8b2x31=0;var _0xc8b2xb=null;var _0xc8b2x32=_0xc8b2x2d[_0xfa49[180]];for(var _0xc8b2x1f in _0xc8b2x2d[_0xfa49[182]]){if(_0xc8b2x31>_0xc8b2x2d[_0xfa49[179]]){break ;} ;var _0xc8b2x28=_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[32]][_0xfa49[190]];var _0xc8b2x2f=_0xc8b2x7[_0xfa49[5]][_0xfa49[53]].DecodeSpreadsheetSave(_0xc8b2x28);if(_0xc8b2x2f){if(_0xc8b2x2f[_0xfa49[144]]){_0xc8b2x28=_0xc8b2x28[_0xfa49[192]](_0xc8b2x2f[_0xfa49[144]][_0xfa49[54]],_0xc8b2x2f[_0xfa49[144]][_0xfa49[191]]);} ;} ;if(_0xc8b2x30){_0xc8b2x30=false;_0xc8b2xb=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];_0xc8b2x7[_0xfa49[11]][_0xfa49[46]]=_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]];SocialCalc.SheetBarButtonSetName(_0xc8b2xb,_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]]);_0xc8b2x7[_0xfa49[5]].LoadRenameWorkBookSheet(_0xc8b2xb,_0xc8b2x28,_0xc8b2x7[_0xfa49[11]][_0xfa49[46]]);_0xc8b2x32=_0xc8b2xb;} else {_0xc8b2xb=_0xfa49[144]+(_0xc8b2x7[_0xfa49[9]]+1).toString();_0xc8b2x7[_0xfa49[9]]=_0xc8b2x7[_0xfa49[9]]+1;SocialCalc.WorkBookControlAddSheetButton(_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]],_0xc8b2xb);_0xc8b2x7[_0xfa49[5]].AddNewWorkBookSheetNoSwitch(_0xc8b2xb,_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]],_0xc8b2x28);} ;if(_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[183]]==_0xfa49[184]){var _0xc8b2x14=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2xb);_0xc8b2x14[_0xfa49[63]][_0xfa49[116]]=_0xfa49[117];SocialCalc.SheetBarButtonActivate(_0xc8b2x1f,false);_0xc8b2x31=_0xc8b2x31-1;} ;if(_0xc8b2x1f==_0xc8b2x2d[_0xfa49[180]]){_0xc8b2x32=_0xc8b2xb;} ;_0xc8b2x31=_0xc8b2x31+1;} ;if(_0xc8b2x2d[_0xfa49[185]]){SocialCalc[_0xfa49[185]]={};for(var _0xc8b2x2e in _0xc8b2x2d[_0xfa49[185]]){SocialCalc[_0xfa49[185]][_0xc8b2x2e]=_0xc8b2x2d[_0xfa49[185]][_0xc8b2x2e];} ;} ;var _0xc8b2x33=function (){SocialCalc.WorkBookControlActivateSheet(_0xc8b2x32);} ;window[_0xfa49[195]](_0xc8b2x33,200);} ;SocialCalc[_0xfa49[196]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;var _0xc8b2xe=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[12]]);if(_0xc8b2xe){return ;} ;var _0xc8b2x18=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];var _0xc8b2x15=_0xfa49[55]+_0xfa49[197]+_0xfa49[198]+_0xc8b2x18+_0xfa49[199]+_0xfa49[197]+_0xfa49[200]+_0xfa49[201]+_0xfa49[202]+_0xc8b2x18+_0xfa49[203]+_0xfa49[82];_0xc8b2x15+=_0xfa49[60]+_0xfa49[204]+_0xfa49[205];var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xc8b2x7[_0xfa49[12]];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=100;_0xc8b2x16[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];_0xc8b2x16[_0xfa49[63]][_0xfa49[73]]=_0xfa49[74];_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[75];_0xc8b2x16[_0xfa49[40]]=_0xfa49[76]+_0xfa49[77]+_0xfa49[78]+_0xfa49[79]+_0xfa49[206]+_0xfa49[81]+_0xc8b2x15+_0xfa49[82];SocialCalc.DragRegister(_0xc8b2x16[_0xfa49[83]][_0xfa49[83]][_0xfa49[83]][_0xfa49[83]],true,true,{MouseDown:SocialCalc[_0xfa49[84]],MouseMove:SocialCalc[_0xfa49[85]],MouseUp:SocialCalc[_0xfa49[85]],Disabled:null,positionobj:_0xc8b2x16});_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);var _0xc8b2x1a=document[_0xfa49[41]](_0xfa49[207]);_0xc8b2x1a[_0xfa49[208]]();SocialCalc.CmdGotFocus(_0xc8b2x1a);} ;SocialCalc[_0xfa49[209]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2x19=_0xc8b2x7[_0xfa49[5]][_0xfa49[53]];var _0xc8b2x1a=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[12]]);_0xc8b2x1a[_0xfa49[40]]=_0xfa49[3];SocialCalc.DragUnregister(_0xc8b2x1a);SocialCalc.KeyboardFocus();if(_0xc8b2x1a[_0xfa49[96]]){_0xc8b2x1a[_0xfa49[96]][_0xfa49[47]](_0xc8b2x1a);} ;} ;SocialCalc[_0xfa49[210]]=function (){var _0xc8b2x1a=document[_0xfa49[41]](_0xfa49[207]);var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x1a[_0xfa49[46]][_0xfa49[211]]==0){_0xc8b2x1a[_0xfa49[208]]();return ;} ;var _0xc8b2xc=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];var _0xc8b2xd=_0xc8b2x1a[_0xfa49[46]];if(_0xc8b2xd[_0xfa49[213]](_0xfa49[212])!=-1){alert(_0xfa49[214]);return ;} ;SocialCalc.WorkBookControlRenameSheetHide();var _0xc8b2x34=_0xc8b2xd[_0xfa49[215]]();for(var _0xc8b2x1f in workbook[_0xfa49[182]]){console[_0xfa49[139]](workbook[_0xfa49[182]][_0xc8b2x1f][_0xfa49[144]][_0xfa49[216]]);if(workbook[_0xfa49[182]][_0xc8b2x1f][_0xfa49[144]][_0xfa49[216]]==_0xc8b2x34){alert(_0xc8b2xd+_0xfa49[217]);return ;} ;} ;_0xc8b2x7[_0xfa49[11]][_0xfa49[46]]=_0xc8b2x34;SocialCalc.SheetBarButtonSetName(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],_0xc8b2xd);_0xc8b2x7[_0xfa49[5]].RenameWorkBookSheet(_0xc8b2xc,_0xc8b2x34,_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]);var _0xc8b2x1e=_0xfa49[218]+_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]+_0xfa49[212]+_0xc8b2xc+_0xfa49[212]+_0xc8b2xd;SocialCalc[_0xfa49[102]][_0xfa49[101]](_0xfa49[99],{cmdtype:_0xfa49[29],id:_0xfa49[100],cmdstr:_0xc8b2x1e});} ;SocialCalc[_0xfa49[219]]=function (_0xc8b2xb,_0xc8b2xc,_0xc8b2xd){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2xf=document[_0xfa49[41]](_0xfa49[45]);var _0xc8b2x35=document[_0xfa49[41]](_0xc8b2xb);_0xc8b2x35[_0xfa49[46]]=_0xc8b2xd;SocialCalc.SheetBarButtonSetName(_0xc8b2xb,_0xc8b2xd);_0xc8b2x7[_0xfa49[5]].RenameWorkBookSheet(_0xc8b2xc,_0xc8b2xd,_0xc8b2xb);} ;SocialCalc[_0xfa49[220]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){if(_0xc8b2x1f!=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]){_0xc8b2x7[_0xfa49[5]].DeleteWorkBookSheet(_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f][_0xfa49[44]],_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f][_0xfa49[46]]);} ;} ;_0xc8b2x7[_0xfa49[5]].LoadRenameWorkBookSheet(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],_0xfa49[3],_0xc8b2x7[_0xfa49[5]][_0xfa49[7]]);for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){if(_0xc8b2x1f!=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]){var _0xc8b2xf=document[_0xfa49[41]](_0xfa49[45]);var _0xc8b2x1b=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f][_0xfa49[44]]);var _0xc8b2x1c=_0xc8b2x1b[_0xfa49[44]];delete _0xc8b2x7[_0xfa49[8]][_0xc8b2x1c];_0xc8b2xf[_0xfa49[47]](_0xc8b2x1b);var _0xc8b2x13=document[_0xfa49[41]](_0xfa49[48]);var _0xc8b2x14=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1c);_0xc8b2x13[_0xfa49[47]](_0xc8b2x14);_0xc8b2x7[_0xfa49[10]]=_0xc8b2x7[_0xfa49[10]]-1;} ;} ;_0xc8b2x7[_0xfa49[11]][_0xfa49[46]]=_0xc8b2x7[_0xfa49[5]][_0xfa49[7]];} ;SocialCalc[_0xfa49[221]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();SocialCalc.WorkBookControlCreateNewBook();_0xc8b2x7[_0xfa49[5]].RenderWorkBookSheet();} ;SocialCalc[_0xfa49[222]]=function (_0xc8b2x36){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;var _0xc8b2x37=_0xc8b2x7[_0xfa49[8]];var _0xc8b2x38={};var _0xc8b2xb=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];var _0xc8b2x39=document[_0xfa49[41]](_0xc8b2xb);var _0xc8b2x3a=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2xb);var _0xc8b2x3b=null;var _0xc8b2x3c=null;if(_0xc8b2x36==_0xfa49[68]){_0xc8b2x3b=_0xc8b2x39[_0xfa49[223]];_0xc8b2x3c=_0xc8b2x3a[_0xfa49[223]];if(!_0xc8b2x3c){alert(_0xfa49[224]);return ;} ;} else {_0xc8b2x3b=_0xc8b2x39[_0xfa49[225]];_0xc8b2x3c=_0xc8b2x3a[_0xfa49[225]];if(!_0xc8b2x3c){alert(_0xfa49[226]);return ;} ;} ;var _0xc8b2x3d=_0xc8b2xb;var _0xc8b2x3e=_0xc8b2x3b[_0xfa49[44]];var _0xc8b2x3f=_0xc8b2x39[_0xfa49[96]];var _0xc8b2x40=_0xc8b2x3a[_0xfa49[96]];var _0xc8b2x41={};var _0xc8b2x42={};for(button in _0xc8b2x37){_0xc8b2x42[button]=document[_0xfa49[41]](_0xfa49[49]+button);_0xc8b2x41[button]=document[_0xfa49[41]](button);_0xc8b2x40[_0xfa49[47]](document[_0xfa49[41]](_0xfa49[49]+button));_0xc8b2x3f[_0xfa49[47]](document[_0xfa49[41]](button));} ;for(button in _0xc8b2x37){if(button!=_0xc8b2x3d&&button!=_0xc8b2x3e){_0xc8b2x38[button]=_0xc8b2x37[button];_0xc8b2x40[_0xfa49[42]](_0xc8b2x42[button]);_0xc8b2x3f[_0xfa49[42]](_0xc8b2x41[button]);} else {if(button==_0xc8b2x3d){if(_0xc8b2x36==_0xfa49[68]){_0xc8b2x38[_0xc8b2x3d]=_0xc8b2x37[_0xc8b2x3d];_0xc8b2x38[_0xc8b2x3e]=_0xc8b2x37[_0xc8b2x3e];_0xc8b2x40[_0xfa49[42]](_0xc8b2x42[_0xc8b2x3d]);_0xc8b2x3f[_0xfa49[42]](_0xc8b2x41[_0xc8b2x3d]);_0xc8b2x40[_0xfa49[42]](_0xc8b2x42[_0xc8b2x3e]);_0xc8b2x3f[_0xfa49[42]](_0xc8b2x41[_0xc8b2x3e]);} else {_0xc8b2x38[_0xc8b2x3e]=_0xc8b2x37[_0xc8b2x3e];_0xc8b2x38[_0xc8b2x3d]=_0xc8b2x37[_0xc8b2x3d];_0xc8b2x40[_0xfa49[42]](_0xc8b2x42[_0xc8b2x3e]);_0xc8b2x3f[_0xfa49[42]](_0xc8b2x41[_0xc8b2x3e]);_0xc8b2x40[_0xfa49[42]](_0xc8b2x42[_0xc8b2x3d]);_0xc8b2x3f[_0xfa49[42]](_0xc8b2x41[_0xc8b2x3d]);} ;} ;} ;} ;_0xc8b2x7[_0xfa49[8]]=_0xc8b2x38;SocialCalc.SheetBarButtonActivate(_0xc8b2x3d,true);} ;SocialCalc[_0xfa49[227]]=function (){SocialCalc.WorkBookControlMove(_0xfa49[68]);} ;SocialCalc[_0xfa49[228]]=function (){SocialCalc.WorkBookControlMove(_0xfa49[229]);} ;SocialCalc[_0xfa49[230]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;_0xc8b2x7[_0xfa49[5]].CopyWorkBookSheet(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]);alert(_0xfa49[231]+_0xc8b2x7[_0xfa49[11]][_0xfa49[46]]);} ;SocialCalc[_0xfa49[232]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;var _0xc8b2x43=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];SocialCalc.WorkBookControlAddSheet(false);var _0xc8b2x44=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];_0xc8b2x7[_0xfa49[5]].PasteWorkBookSheet(_0xc8b2x44,_0xc8b2x43);var _0xc8b2x1e=_0xfa49[33];SocialCalc[_0xfa49[102]][_0xfa49[101]](_0xfa49[99],{cmdtype:_0xfa49[29],id:_0xfa49[100],cmdstr:_0xc8b2x1e,sheetstr:_0xc8b2x7[_0xfa49[5]][_0xfa49[233]][_0xfa49[190]]});} ;SocialCalc[_0xfa49[234]]=function (){this[_0xfa49[235]]=document[_0xfa49[41]](_0xfa49[236]);this[_0xfa49[237]]=document[_0xfa49[39]](_0xfa49[6]);this[_0xfa49[237]][_0xfa49[63]][_0xfa49[238]]=_0xfa49[239];this[_0xfa49[237]][_0xfa49[40]]=_0xfa49[240];this[_0xfa49[237]][_0xfa49[44]]=_0xfa49[241];this[_0xfa49[242]]=document[_0xfa49[39]](_0xfa49[6]);this[_0xfa49[242]][_0xfa49[44]]=_0xfa49[48];this[_0xfa49[242]][_0xfa49[63]][_0xfa49[238]]=_0xfa49[239];this[_0xfa49[243]]=document[_0xfa49[39]](_0xfa49[6]);this[_0xfa49[243]][_0xfa49[44]]=_0xfa49[244];this[_0xfa49[243]][_0xfa49[63]][_0xfa49[116]]=_0xfa49[140];var _0xc8b2x45= new SocialCalc.SheetBarSheetButton(_0xfa49[245],_0xfa49[245],this[_0xfa49[243]],{},{MouseDown:function (){var _0xc8b2x46=SocialCalc.WorkBookControlAddSheet(true);} },_0xfa49[246]);this[_0xfa49[235]][_0xfa49[42]](this[_0xfa49[237]]);this[_0xfa49[235]][_0xfa49[42]](this[_0xfa49[242]]);this[_0xfa49[235]][_0xfa49[42]](this[_0xfa49[243]]);} ;SocialCalc[_0xfa49[247]]=function (_0xc8b2x47,_0xc8b2x1c,_0xc8b2x48,_0xc8b2x49,_0xc8b2x4a,_0xc8b2x4b){this[_0xfa49[248]]=document[_0xfa49[39]](_0xfa49[6]);this[_0xfa49[248]][_0xfa49[44]]=_0xc8b2x47;this[_0xfa49[248]][_0xfa49[147]]=_0xc8b2x1c;if(!_0xc8b2x4b){this[_0xfa49[248]][_0xfa49[40]]=_0xc8b2x1c;this[_0xfa49[248]][_0xfa49[63]][_0xfa49[238]]=_0xfa49[249];_0xc8b2x4c=document[_0xfa49[39]](_0xfa49[250]);_0xc8b2x4c[_0xfa49[44]]=_0xc8b2x47+_0xfa49[251];_0xc8b2x4c[_0xfa49[252]]=SocialCalc[_0xfa49[254]][_0xfa49[253]]+_0xfa49[255];_0xc8b2x4c[_0xfa49[63]][_0xfa49[238]]=_0xfa49[256];this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x4c);SocialCalc.ButtonRegister(this[_0xfa49[248]],_0xc8b2x49,_0xc8b2x4a);SocialCalc.ButtonRegister(_0xc8b2x4c,_0xc8b2x49,_0xc8b2x4a);} else {var _0xc8b2x4c=document[_0xfa49[39]](_0xfa49[250]);_0xc8b2x4c[_0xfa49[252]]=SocialCalc[_0xfa49[254]][_0xfa49[253]]+_0xc8b2x4b;_0xc8b2x4c[_0xfa49[63]][_0xfa49[238]]=_0xfa49[257];this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x4c);this[_0xfa49[248]][_0xfa49[63]][_0xfa49[238]]=_0xfa49[258];SocialCalc.ButtonRegister(_0xc8b2x4c,_0xc8b2x49,_0xc8b2x4a);} ;_0xc8b2x48[_0xfa49[42]](this[_0xfa49[248]]);} ;SocialCalc[_0xfa49[259]]=function (_0xc8b2x47,_0xc8b2x4d){var _0xc8b2x4e=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x47);_0xc8b2x4e[_0xfa49[260]]=_0xc8b2x4d;if(_0xc8b2x4d){_0xc8b2x4e[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];var _0xc8b2x4c=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x47+_0xfa49[251]);if(!_0xc8b2x4c){_0xc8b2x4c=document[_0xfa49[39]](_0xfa49[250]);_0xc8b2x4c[_0xfa49[44]]=_0xfa49[49]+_0xc8b2x47+_0xfa49[251];_0xc8b2x4c[_0xfa49[252]]=SocialCalc[_0xfa49[254]][_0xfa49[253]]+_0xfa49[255];_0xc8b2x4c[_0xfa49[63]][_0xfa49[238]]=_0xfa49[256];} ;_0xc8b2x4e[_0xfa49[42]](_0xc8b2x4c);SocialCalc.ButtonRegister(_0xc8b2x4c,{},{MouseDown:function (){SocialCalc.SheetBarSheetButtonPress(_0xc8b2x47);} ,Repeat:function (){} ,Disabled:function (){} });} else {_0xc8b2x4e[_0xfa49[63]][_0xfa49[71]]=_0xfa49[261];var _0xc8b2x4c=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x47+_0xfa49[251]);if(_0xc8b2x4c){_0xc8b2x4e[_0xfa49[47]](_0xc8b2x4c);} ;} ;var _0xc8b2x4f=document[_0xfa49[41]](_0xfa49[262]);if(_0xc8b2x4f&&_0xc8b2x4f[_0xfa49[63]][_0xfa49[116]]!=_0xfa49[117]){_0xc8b2x4f[_0xfa49[63]][_0xfa49[116]]=_0xfa49[117];} ;} ;SocialCalc[_0xfa49[263]]=function (_0xc8b2x47,_0xc8b2x1c){var _0xc8b2x4e=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x47);_0xc8b2x4e[_0xfa49[147]]=_0xc8b2x1c;_0xc8b2x4e[_0xfa49[40]]=_0xc8b2x1c;if(_0xc8b2x4e[_0xfa49[260]]){SocialCalc.SheetBarButtonActivate(_0xc8b2x47,true);} ;} ;SocialCalc[_0xfa49[264]]=function (_0xc8b2x47){var _0xc8b2x4e=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x47);if(_0xc8b2x4e&&_0xc8b2x4e[_0xfa49[260]]){var _0xc8b2x4f=document[_0xfa49[41]](_0xfa49[262]);if(!_0xc8b2x4f){var _0xc8b2x50= new SocialCalc.SheetBarSheetButtonMenu(_0xfa49[262],_0xc8b2x47);} else {_0xc8b2x4f[_0xfa49[265]]=_0xc8b2x47;if(_0xc8b2x4f[_0xfa49[63]][_0xfa49[116]]==_0xfa49[117]){_0xc8b2x4f[_0xfa49[63]][_0xfa49[116]]=_0xfa49[140];SocialCalc.SheetBarSheetButtonMenuPosition(_0xc8b2x4f,_0xc8b2x47);} else {_0xc8b2x4f[_0xfa49[63]][_0xfa49[116]]=_0xfa49[117];} ;} ;} else {if(_0xc8b2x4e){SocialCalc.WorkBookControlActivateSheet(_0xc8b2x47);} ;} ;} ;SocialCalc[_0xfa49[266]]=function (_0xc8b2x47,_0xc8b2x51){this[_0xfa49[248]]=document[_0xfa49[39]](_0xfa49[6]);this[_0xfa49[248]][_0xfa49[44]]=_0xc8b2x47;this[_0xfa49[248]][_0xfa49[40]]=_0xc8b2x51;this[_0xfa49[248]][_0xfa49[267]]=_0xfa49[3];this[_0xfa49[248]][_0xfa49[63]][_0xfa49[238]]=_0xfa49[268];var _0xc8b2x49={normalstyle:_0xfa49[269],downstyle:_0xfa49[270],hoverstyle:_0xfa49[270]};var _0xc8b2x4a={MouseDown:function (){SocialCalc.SheetBarMenuItemPress(_0xc8b2x47);} ,Repeat:function (){} ,Disabled:function (){} };SocialCalc.ButtonRegister(this[_0xfa49[248]],_0xc8b2x49,_0xc8b2x4a);SocialCalc.TouchRegister(this[_0xfa49[248]],{SingleTap:_0xc8b2x4a[_0xfa49[271]]});return this[_0xfa49[248]];} ;SocialCalc[_0xfa49[272]]=function (_0xc8b2x47){var _0xc8b2x4f=document[_0xfa49[41]](_0xfa49[262]);if(!_0xc8b2x4f){return ;} ;var _0xc8b2x52=_0xc8b2x4f[_0xfa49[265]];switch(_0xc8b2x47){case _0xfa49[273]:SocialCalc.WorkBookControlDelSheet();break ;;case _0xfa49[274]:SocialCalc.WorkBookControlHideSheet();break ;;case _0xfa49[275]:SocialCalc.WorkBookControlUnhideSheet();break ;;case _0xfa49[276]:SocialCalc.WorkBookControlCopySheet();break ;;case _0xfa49[277]:SocialCalc.WorkBookControlMoveLeft();break ;;case _0xfa49[278]:SocialCalc.WorkBookControlMoveRight();break ;;case _0xfa49[279]:SocialCalc.WorkBookControlPasteSheet();break ;;case _0xfa49[280]:SocialCalc.WorkBookControlRenameSheet();break ;;case _0xfa49[281]:_0xc8b2x4f[_0xfa49[63]][_0xfa49[116]]=_0xfa49[117];break ;;default:break ;;} ;_0xc8b2x4f[_0xfa49[63]][_0xfa49[116]]=_0xfa49[117];} ;SocialCalc[_0xfa49[282]]=function (_0xc8b2x47,_0xc8b2x52){this[_0xfa49[248]]=document[_0xfa49[39]](_0xfa49[6]);this[_0xfa49[248]][_0xfa49[44]]=_0xc8b2x47;this[_0xfa49[248]][_0xfa49[267]]=_0xfa49[3];this[_0xfa49[248]][_0xfa49[265]]=_0xc8b2x52;this[_0xfa49[248]][_0xfa49[63]][_0xfa49[238]]=_0xfa49[283];var _0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[273],_0xfa49[284]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[274],_0xfa49[285]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[275],_0xfa49[286]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[280],_0xfa49[287]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[277],_0xfa49[288]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[278],_0xfa49[289]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[276],_0xfa49[290]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[279],_0xfa49[291]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[281],_0xfa49[292]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);SocialCalc.SheetBarSheetButtonMenuPosition(this[_0xfa49[248]],_0xc8b2x52);var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[293]][_0xfa49[42]](this[_0xfa49[248]]);} ;SocialCalc[_0xfa49[294]]=function (_0xc8b2x4f,_0xc8b2x52){var _0xc8b2x54=document[_0xfa49[41]](_0xfa49[295]);var _0xc8b2x4e=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x52);var _0xc8b2x55=_0xc8b2x54[_0xfa49[63]][_0xfa49[65]][_0xfa49[296]](0,-2)-220;var _0xc8b2x56=_0xc8b2x4e[_0xfa49[297]]+7;_0xc8b2x4f[_0xfa49[63]][_0xfa49[65]]=_0xc8b2x55+_0xfa49[67];_0xc8b2x4f[_0xfa49[63]][_0xfa49[68]]=_0xc8b2x56+_0xfa49[67];} ;SocialCalc[_0xfa49[298]]={scripts:{},handle:null};SocialCalc[_0xfa49[299]]=function (_0xc8b2xb,_0xc8b2x57,_0xc8b2x58){var _0xc8b2x59=_0xc8b2x58[_0xfa49[213]](_0xfa49[300]);var _0xc8b2x5a=_0xc8b2x58[_0xfa49[213]](_0xfa49[301]);if((_0xc8b2x59!=-1)&&(_0xc8b2x5a!=-1)){script=_0xc8b2x58[_0xfa49[296]](_0xc8b2x59+10,_0xc8b2x5a);SocialCalc[_0xfa49[298]][_0xfa49[302]][_0xc8b2x57]=script;if(SocialCalc[_0xfa49[298]][_0xfa49[303]]==null){SocialCalc[_0xfa49[298]][_0xfa49[303]]=window[_0xfa49[195]](SocialCalc.EvalUserScripts,500);} ;} ;} ;SocialCalc[_0xfa49[304]]=function (_0xc8b2x5b){var _0xc8b2x5c=document[_0xfa49[306]](_0xfa49[305])[0]||document[_0xfa49[307]];if(_0xc8b2x5b==_0xfa49[3]){return ;} ;var _0xc8b2x5d=document[_0xfa49[39]](_0xfa49[308]);_0xc8b2x5d[_0xfa49[145]]=_0xfa49[309];try{_0xc8b2x5d[_0xfa49[42]](document[_0xfa49[310]](_0xc8b2x5b));} catch(e){_0xc8b2x5d[_0xfa49[311]]=_0xc8b2x5b;} ;_0xc8b2x5c[_0xfa49[312]](_0xc8b2x5d,_0xc8b2x5c[_0xfa49[83]]);_0xc8b2x5c[_0xfa49[47]](_0xc8b2x5d);} ;SocialCalc[_0xfa49[313]]=function (){for(var _0xc8b2x5e in SocialCalc[_0xfa49[298]][_0xfa49[302]]){SocialCalc.EvalUserScript(SocialCalc[_0xfa49[298]][_0xfa49[302]][_0xc8b2x5e]);} ;SocialCalc[_0xfa49[298]][_0xfa49[303]]=null;SocialCalc[_0xfa49[298]][_0xfa49[302]]={};} ;SocialCalc[_0xfa49[314]]=function (_0xc8b2x5f,_0xc8b2x60,_0xc8b2x5e){var _0xc8b2x61=_0xc8b2x5f[_0xfa49[315]][_0xc8b2x5e];if(!_0xc8b2x61){return ;} ;var _0xc8b2x62=_0xc8b2x61[_0xfa49[316]]||_0xfa49[3];var _0xc8b2x63=_0xc8b2x62[_0xfa49[192]](1);var _0xc8b2x64=_0xc8b2x5f[_0xfa49[317]];_0xc8b2x62=_0xc8b2x62[_0xfa49[318]](0);if(_0xc8b2x62==_0xfa49[319]){valueformat=_0xc8b2x5f[_0xfa49[321]][_0xc8b2x61[_0xfa49[320]]-0]||_0xc8b2x5f[_0xfa49[321]][_0xc8b2x64[_0xfa49[322]]-0]||_0xfa49[3];if(valueformat==_0xfa49[323]){SocialCalc.ScriptCheck(_0xc8b2x5f[_0xfa49[324]],_0xc8b2x5e,_0xc8b2x60);} ;} ;} ;SocialCalc[_0xfa49[325]]=function (_0xc8b2x57){var _0xc8b2x23=null;var _0xc8b2xb=_0xfa49[3];var _0xc8b2x65=_0xc8b2x57[_0xfa49[213]](_0xfa49[326]);if(_0xc8b2x65!=-1){_0xc8b2x23=_0xc8b2x57[_0xfa49[296]](0,_0xc8b2x65);_0xc8b2x57=_0xc8b2x57[_0xfa49[296]](_0xc8b2x65+1);} ;var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x23==null){_0xc8b2xb=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];} else {_0xc8b2xb=_0xc8b2x7[_0xfa49[5]].SheetNameExistsInWorkBook(_0xc8b2x23);} ;if((_0xc8b2xb==null)||(_0xc8b2xb==_0xfa49[3])){return _0xfa49[100];} ;var _0xc8b2x5f=_0xc8b2x7[_0xfa49[5]][_0xfa49[182]][_0xc8b2xb][_0xfa49[144]];var _0xc8b2x61=_0xc8b2x5f[_0xfa49[315]][_0xc8b2x57];if(_0xc8b2x61){return _0xc8b2x61[_0xfa49[327]];} else {return 0;} ;} ;SocialCalc[_0xfa49[328]]=function (_0xc8b2x66,_0xc8b2x23){var _0xc8b2x67=[];var _0xc8b2x68=_0xc8b2x66[_0xfa49[330]](_0xfa49[329]);if(_0xc8b2x23==null){_0xc8b2x23=_0xfa49[3];} else {_0xc8b2x23=_0xc8b2x23+_0xfa49[326];} ;for(var _0xc8b2x69 in _0xc8b2x68){_0xc8b2x67[_0xfa49[331]](SocialCalc.GetCellDataValue(_0xc8b2x23+_0xc8b2x68[_0xc8b2x69]));} ;return _0xc8b2x67;} ;SocialCalc[_0xfa49[332]]={};SocialCalc[_0xfa49[333]]={sheets:[],calcorder:[],current:0,pass:0};SocialCalc[_0xfa49[334]]=function (){if((SocialCalc[_0xfa49[333]][_0xfa49[335]]!=0)||(SocialCalc[_0xfa49[333]][_0xfa49[336]][_0xfa49[211]]!=0)||(SocialCalc[_0xfa49[333]][_0xfa49[337]][_0xfa49[211]]!=0)){return ;} ;var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;SocialCalc[_0xfa49[333]][_0xfa49[335]]=0;for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[5]][_0xfa49[182]]){SocialCalc[_0xfa49[333]][_0xfa49[337]][_0xfa49[331]](_0xc8b2x1f);} ;var _0xc8b2x2e=0;for(var _0xc8b2x69=SocialCalc[_0xfa49[333]][_0xfa49[337]][_0xfa49[211]];_0xc8b2x69>0;_0xc8b2x69--){SocialCalc[_0xfa49[333]][_0xfa49[336]][_0xc8b2x2e]=SocialCalc[_0xfa49[333]][_0xfa49[337]][_0xc8b2x69-1];_0xc8b2x2e++;} ;window[_0xfa49[195]](SocialCalc.WorkBookRecalculateStep,500);} ;SocialCalc[_0xfa49[338]]=function (){if(SocialCalc[_0xfa49[333]][_0xfa49[335]]==SocialCalc[_0xfa49[333]][_0xfa49[336]][_0xfa49[211]]){SocialCalc[_0xfa49[333]][_0xfa49[335]]=0;SocialCalc[_0xfa49[333]][_0xfa49[336]]=[];SocialCalc[_0xfa49[333]][_0xfa49[337]]=[];if(SocialCalc[_0xfa49[333]][_0xfa49[339]]==1){SocialCalc[_0xfa49[333]][_0xfa49[339]]=0;SocialCalc.SpinnerWaitHide();return ;} else {SocialCalc[_0xfa49[333]][_0xfa49[339]]++;SocialCalc.WorkBookRecalculateAll();return ;} ;} ;var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2xb=SocialCalc[_0xfa49[333]][_0xfa49[336]][SocialCalc[_0xfa49[333]][_0xfa49[335]]];SocialCalc.WorkBookControlActivateSheet(_0xc8b2xb);SocialCalc[_0xfa49[333]][_0xfa49[335]]++;window[_0xfa49[195]](SocialCalc.WorkBookRecalculateStep,1000);} ;SocialCalc[_0xfa49[340]]=function (){var _0xc8b2x1a=document[_0xfa49[41]](_0xfa49[341]);if(_0xc8b2x1a){return ;} ;var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xfa49[341];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/2)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/2)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=110;_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[342];_0xc8b2x16[_0xfa49[63]][_0xfa49[66]]=_0xfa49[342];_0xc8b2x16[_0xfa49[40]]=_0xfa49[343];var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);} ;SocialCalc[_0xfa49[344]]=function (){var _0xc8b2x1a=document[_0xfa49[41]](_0xfa49[341]);if(_0xc8b2x1a){_0xc8b2x1a[_0xfa49[40]]=_0xfa49[3];if(_0xc8b2x1a[_0xfa49[96]]){_0xc8b2x1a[_0xfa49[96]][_0xfa49[47]](_0xc8b2x1a);} ;} ;} ;SocialCalc[_0xfa49[185]]={};SocialCalc[_0xfa49[185]][_0xfa49[186]]=false;SocialCalc[_0xfa49[185]][_0xfa49[315]]={};SocialCalc[_0xfa49[102]][_0xfa49[345]]=function (_0xc8b2x6a){if(!(SocialCalc[_0xfa49[185]][_0xfa49[186]])){return true;} ;if(SocialCalc[_0xfa49[185]][_0xfa49[315]][_0xc8b2x6a]){return true;} ;return false;} ;SocialCalc[_0xfa49[102]][_0xfa49[346]]=function (_0xc8b2x6b){var _0xc8b2x6c=_0xc8b2x6b[_0xfa49[348]][_0xfa49[347]]+_0xfa49[326]+_0xc8b2x6b[_0xfa49[350]][_0xfa49[349]];if(!(SocialCalc[_0xfa49[185]][_0xfa49[186]])){return true;} ;if(SocialCalc[_0xfa49[185]][_0xfa49[315]][_0xc8b2x6c]){return true;} ;return false;} ;SocialCalc[_0xfa49[351]]=function (_0xc8b2x6d,_0xc8b2x6e,_0xc8b2x6f,_0xc8b2x70,_0xc8b2x71,_0xc8b2x72){if(_0xc8b2x6f+10+_0xc8b2x71>_0xc8b2x6d){return false;} ;if(_0xc8b2x70+_0xc8b2x72>_0xc8b2x6e){return false;} ;return true;} ; \ No newline at end of file diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/autosave.js b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/autosave.js deleted file mode 100644 index a263b4c..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/autosave.js +++ /dev/null @@ -1,53 +0,0 @@ -// -// Autosave functionality -- this is the browser version that saves to the server -// -// External interfaces are from: -// SocialCalcTableEditor (for autosave upon edit) -// - -if (!Aspiring) { - console.log("aspiring not defined"); - var Aspiring = {}; -} -Aspiring.AutoSave = {}; -Aspiring.AutoSave.selectedFile = "default"; -Aspiring.AutoSave.autoSaveTimeoutId = null; -Aspiring.AutoSave.SaveTimeout = 10000; // 10 seconds - - -// This is called from the SocialCalcTableEditor -// EditorSaveEdit function -SocialCalc.Callbacks.editAutoSave = function() { - // start a timer - //console.log("in auto save"); - //var control = SocialCalc.GetCurrentWorkBookControl(); - //if (Aspiring.AutoSave.autoSaveTimeoutId != null) { - // console.log("timer already running"); - //} else { - // Aspiring.AutoSave.autoSaveTimeoutId = - // window.setTimeout(Aspiring.AutoSave.TimerExpiry, Aspiring.AutoSave.SaveTimeout ); - //} - Aspiring.AutoSave.TimerExpiry(); -} - -Aspiring.AutoSave.TimerExpiry = function() { - //console.log("auto save timer"); - - // save file - if ( Aspiring.AutoSave.selectedFile == "default") { - Aspiring.AutoSave.selectedFile = "Untitled"; - } - - var data = SocialCalc.WorkBookControlSaveSheet(); - - //console.log(data.length); - var encodedData = encodeURIComponent(data); - window.localStorage.setItem(Aspiring.getPathFromFilename(Aspiring.AutoSave.selectedFile), encodedData); - //Aspiring.AutoSave.autoSaveTimeoutId = null; - - updateFileName(Aspiring.AutoSave.selectedFile); - -}; - - - diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/formatnumber2.js b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/formatnumber2.js deleted file mode 100644 index 0cf3f94..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/formatnumber2.js +++ /dev/null @@ -1,950 +0,0 @@ -// -/* -// SocialCalc Number Formatting Library -// -// Part of the SocialCalc package. -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - -SocialCalc.FormatNumber = {}; - -SocialCalc.FormatNumber.format_definitions = {}; // Parsed formats are stored here globally - -// Most constants that are often customized for localization are in the SocialCalc.Constants module. -// If you use this module standalone, provide at least the "FormatNumber" values. -// - -// The following values may be customized externally for further localization of the format definitions themselves, -// but that would make them incompatible with other uses and is discouraged. -// - -SocialCalc.FormatNumber.separatorchar = ","; -SocialCalc.FormatNumber.decimalchar = "."; -SocialCalc.FormatNumber.daynames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; -SocialCalc.FormatNumber.daynames3 = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; -SocialCalc.FormatNumber.monthnames3 = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; -SocialCalc.FormatNumber.monthnames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", - "October", "November", "December"]; - -SocialCalc.FormatNumber.allowedcolors = - {BLACK: "#000000", BLUE: "#0000FF", CYAN: "#00FFFF", GREEN: "#00FF00", MAGENTA: "#FF00FF", - RED: "#FF0000", WHITE: "#FFFFFF", YELLOW: "#FFFF00"}; - -SocialCalc.FormatNumber.alloweddates = - {H: "h]", M: "m]", MM: "mm]", S: "s]", SS: "ss]"}; - -// Other constants - -SocialCalc.FormatNumber.commands = - {copy: 1, color: 2, integer_placeholder: 3, fraction_placeholder: 4, decimal: 5, - currency: 6, general:7, separator: 8, date: 9, comparison: 10, section: 11, style: 12}; - -SocialCalc.FormatNumber.datevalues = {julian_offset: 2415019, seconds_in_a_day: 24 * 60 * 60, seconds_in_an_hour: 60 * 60}; - -/* ******************* - - result = SocialCalc.FormatNumber.formatNumberWithFormat = function(rawvalue, format_string, currency_char) - -************************* */ - -SocialCalc.FormatNumber.formatNumberWithFormat = function(rawvalue, format_string, currency_char) { - - var scc = SocialCalc.Constants; - var scfn = SocialCalc.FormatNumber; - - var op, operandstr, fromend, cval, operandstrlc; - var startval, estartval; - var hrs, mins, secs, ehrs, emins, esecs, ampmstr, ymd; - var minOK, mpos; - var result=""; - var thisformat; - var section, gotcomparison, compop, compval, cpos, oppos; - var sectioninfo; - var i, decimalscale, scaledvalue, strvalue, strparts, integervalue, fractionvalue; - var integerdigits2, integerpos, fractionpos, textcolor, textstyle, separatorchar, decimalchar; - var value; // working copy to change sign, etc. - - rawvalue = rawvalue-0; // make sure a number - value = rawvalue; - if (!isFinite(value)) return "NaN"; - - var negativevalue = value < 0 ? 1 : 0; // determine sign, etc. - if (negativevalue) value = -value; - var zerovalue = value == 0 ? 1 : 0; - - currency_char = currency_char || scc.FormatNumber_DefaultCurrency; - - scfn.parse_format_string(scfn.format_definitions, format_string); // make sure format is parsed - thisformat = scfn.format_definitions[format_string]; // Get format structure - - if (!thisformat) throw "Format not parsed error!"; - - section = thisformat.sectioninfo.length - 1; // get number of sections - 1 - - if (thisformat.hascomparison) { // has comparisons - determine which section - section = 0; // set to which section we will use - gotcomparison = 0; // this section has no comparison - for (cpos=0; ;cpos++) { // scan for comparisons - op = thisformat.operators[cpos]; - operandstr = thisformat.operands[cpos]; // get next operator and operand - if (!op) { // at end with no match - if (gotcomparison) { // if comparison but no match - format_string = "General"; // use default of General - scfn.parse_format_string(scfn.format_definitions, format_string); - thisformat = scfn.format_definitions[format_string]; - section = 0; - } - break; // if no comparision, matches on this section - } - if (op == scfn.commands.section) { // end of section - if (!gotcomparison) { // no comparison, so it's a match - break; - } - gotcomparison = 0; - section++; // check out next one - continue; - } - if (op == scfn.commands.comparison) { // found a comparison - do we meet it? - i=operandstr.indexOf(":"); - compop=operandstr.substring(0,i); - compval=operandstr.substring(i+1)-0; - if ((compop == "<" && rawvalue < compval) || - (compop == "<=" && rawvalue <= compval) || - (compop == "=" && rawvalue == compval) || - (compop == "<>" && rawvalue != compval) || - (compop == ">=" && rawvalue >= compval) || - (compop == ">" && rawvalue > compval)) { // a match - break; - } - gotcomparison = 1; - } - } - } - else if (section > 0) { // more than one section (separated by ";") - if (section == 1) { // two sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } - else { - section = 0; // use first for all others - } - } - else if (section == 2) { // three sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } - else if (zerovalue) { - section = 2; // use third section for zero values - } - else { - section = 0; // use first for positive - } - } - } - - sectioninfo = thisformat.sectioninfo[section]; // look at values for our section - - if (sectioninfo.commas > 0) { // scale by thousands - for (i=0; i 0) { // do percent scaling - for (i=0; i=0) { // converted to scientific notation - return rawvalue+""; // Just return plain converted raw value - } - - strparts=strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - if (!strparts) return "NaN"; // if not a number - integervalue = strparts[1]; - if (!integervalue || integervalue=="0") integervalue=""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - - if (sectioninfo.hasdate) { // there are date placeholders - if (rawvalue < 0) { // bad date - return "??-???-?? ??:??:??"; - } - startval = (rawvalue-Math.floor(rawvalue)) * scfn.datevalues.seconds_in_a_day; // get date/time parts - estartval = rawvalue * scfn.datevalues.seconds_in_a_day; // do elapsed time version, too - hrs = Math.floor(startval / scfn.datevalues.seconds_in_an_hour); - ehrs = Math.floor(estartval / scfn.datevalues.seconds_in_an_hour); - startval = startval - hrs * scfn.datevalues.seconds_in_an_hour; - mins = Math.floor(startval / 60); - emins = Math.floor(estartval / 60); - secs = startval - mins * 60; - decimalscale = 1; // round appropriately depending if there is ss.0 - for (i=0; i= 60) { // handle round up into next second, minute, etc. - secs = 0; - mins++; emins++; - if (mins >= 60) { - mins = 0; - hrs++; ehrs++; - if (hrs >= 24) { - hrs = 0; - rawvalue++; - } - } - } - fractionvalue = (secs-Math.floor(secs))+""; // for "hh:mm:ss.000" - fractionvalue = fractionvalue.substring(2); // skip "0." - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian(Math.floor(rawvalue+scfn.datevalues.julian_offset)); - - minOK = 0; // says "m" can be minutes if true - mspos = sectioninfo.sectionstart; // m scan position in ops - for ( ; ; mspos++) { // scan for "m" and "mm" to see if any minutes fields, and am/pm - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op==scfn.commands.section) break; - if (op==scfn.commands.date) { - if ((operandstr.toLowerCase()=="am/pm" || operandstr.toLowerCase()=="a/p") && !ampmstr) { - if (hrs >= 12) { - hrs -= 12; - ampmstr = operandstr.toLowerCase()=="a/p" ? scc.s_FormatNumber_pm1 : scc.s_FormatNumber_pm; // "P" : "PM"; - } - else { - ampmstr = operandstr.toLowerCase()=="a/p" ? scc.s_FormatNumber_am1 : scc.s_FormatNumber_am; // "A" : "AM"; - } - if (operandstr.indexOf(ampmstr)<0) - ampmstr = ampmstr.toLowerCase(); // have case match case in format - } - if (minOK && (operandstr=="m" || operandstr=="mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr.charAt(0)=="h") { - minOK = 1; // m following h or hh or [h] is minutes not months - } - else { - minOK = 0; - } - } - else if (op!=scfn.commands.copy) { // copying chars can be between h and m - minOK = 0; - } - } - minOK = 0; - for (--mspos; ; mspos--) { // scan other way for s after m - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op==scfn.commands.section) break; - if (op==scfn.commands.date) { - if (minOK && (operandstr=="m" || operandstr=="mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr=="ss") { - minOK = 1; // m before ss is minutes not months - } - else { - minOK = 0; - } - } - else if (op!=scfn.commands.copy) { // copying chars can be between ss and m - minOK = 0; - } - } - } - - integerdigits2 = 0; // init counters, etc. - integerpos = 0; - fractionpos = 0; - textcolor = ""; - textstyle = ""; - separatorchar = scc.FormatNumber_separatorchar; - if (separatorchar.indexOf(" ")>=0) separatorchar = separatorchar.replace(/ /g, " "); - decimalchar = scc.FormatNumber_decimalchar; - if (decimalchar.indexOf(" ")>=0) decimalchar = decimalchar.replace(/ /g, " "); - - oppos = sectioninfo.sectionstart; - - while (op = thisformat.operators[oppos]) { // execute format - operandstr = thisformat.operands[oppos++]; // get next operator and operand - - if (op == scfn.commands.copy) { // put char in result - result += operandstr; - } - - else if (op == scfn.commands.color) { // set color - textcolor = operandstr; - } - - else if (op == scfn.commands.style) { // set style - textstyle = operandstr; - } - - else if (op == scfn.commands.integer_placeholder) { // insert number part - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - integerdigits2++; - if (integerdigits2 == 1) { // first one - if (integervalue.length > sectioninfo.integerdigits) { // see if integer wider than field - for (;integerpos < (integervalue.length - sectioninfo.integerdigits); integerpos++) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - } - if (integervalue.length < sectioninfo.integerdigits - && integerdigits2 <= sectioninfo.integerdigits - integervalue.length) { // field is wider than value - if (operandstr == "0" || operandstr == "?") { // fill with appropriate characters - result += operandstr == "0" ? "0" : " "; - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = sectioninfo.integerdigits - integerdigits2; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - else { // normal integer digit - add it - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - integerpos++; - } - } - else if (op == scfn.commands.fraction_placeholder) { // add fraction part of number - if (fractionpos >= fractionvalue.length) { - if (operandstr == "0" || operandstr == "?") { - result += operandstr == "0" ? "0" : " "; - } - } - else { - result += fractionvalue.charAt(fractionpos); - } - fractionpos++; - } - - else if (op == scfn.commands.decimal) { // decimal point - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += decimalchar; - } - - else if (op == scfn.commands.currency) { // currency symbol - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += operandstr; - } - - else if (op == scfn.commands.general) { // insert "General" conversion - - // *** Cut down number of significant digits to avoid floating point artifacts: - - if (value!=0) { // only if non-zero - var factor = Math.floor(Math.LOG10E * Math.log(value)); // get integer magnitude as a power of 10 - factor = Math.pow(10, 13-factor); // turn into scaling factor - value = Math.floor(factor * value + 0.5)/factor; // scale positive value, round, undo scaling - if (!isFinite(value)) return "NaN"; - } - if (negativevalue) { - result += "-"; - } - strvalue = value+""; // convert original value to string - if (strvalue.indexOf("e")>=0) { // converted to scientific notation - result += strvalue; - continue; - } - strparts=strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - integervalue = strparts[1]; - if (!integervalue || integervalue=="0") integervalue=""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - integerpos = 0; - fractionpos = 0; - if (integervalue.length) { - for (;integerpos < integervalue.length; integerpos++) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - else { - result += "0"; - } - if (fractionvalue.length) { - result += decimalchar; - for (;fractionpos < fractionvalue.length; fractionpos++) { - result += fractionvalue.charAt(fractionpos); - } - } - } - else if (op==scfn.commands.date) { // date placeholder - operandstrlc = operandstr.toLowerCase(); - if (operandstrlc=="y" || operandstrlc=="yy") { - result += (ymd.year+"").substring(2); - } - else if (operandstrlc=="yyyy") { - result += ymd.year+""; - } - else if (operandstrlc=="d") { - result += ymd.day+""; - } - else if (operandstrlc=="dd") { - cval = 1000 + ymd.day; - result += (cval+"").substr(2); - } - else if (operandstrlc=="ddd") { - cval = Math.floor(rawvalue+6) % 7; - result += scc.s_FormatNumber_daynames3[cval]; - } - else if (operandstrlc=="dddd") { - cval = Math.floor(rawvalue+6) % 7; - result += scc.s_FormatNumber_daynames[cval]; - } - else if (operandstrlc=="m") { - result += ymd.month+""; - } - else if (operandstrlc=="mm") { - cval = 1000 + ymd.month; - result += (cval+"").substr(2); - } - else if (operandstrlc=="mmm") { - result += scc.s_FormatNumber_monthnames3[ymd.month-1]; - } - else if (operandstrlc=="mmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month-1]; - } - else if (operandstrlc=="mmmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month-1].charAt(0); - } - else if (operandstrlc=="h") { - result += hrs+""; - } - else if (operandstrlc=="h]") { - result += ehrs+""; - } - else if (operandstrlc=="mmin") { - cval = (1000 + mins)+""; - result += cval.substr(2); - } - else if (operandstrlc=="mm]") { - if (emins < 100) { - cval = (1000 + emins)+""; - result += cval.substr(2); - } - else { - result += emins+""; - } - } - else if (operandstrlc=="min") { - result += mins+""; - } - else if (operandstrlc=="m]") { - result += emins+""; - } - else if (operandstrlc=="hh") { - cval = (1000 + hrs)+""; - result += cval.substr(2); - } - else if (operandstrlc=="s") { - cval = Math.floor(secs); - result += cval+""; - } - else if (operandstrlc=="ss") { - cval = (1000 + Math.floor(secs))+""; - result += cval.substr(2); - } - else if (operandstrlc=="am/pm" || operandstrlc=="a/p") { - result += ampmstr; - } - else if (operandstrlc=="ss]") { - if (esecs < 100) { - cval = (1000 + Math.floor(esecs))+""; - result += cval.substr(2); - } - else { - cval = Math.floor(esecs); - result += cval+""; - } - } - } - else if (op == scfn.commands.section) { // end of section - break; - } - - else if (op == scfn.commands.comparison) { // ignore - continue; - } - - else { - result += "!! Parse error !!"; - } - } - - if (textcolor) { - result = ''+result+''; - } - if (textstyle) { - result = ''+result+''; - } - - return result; - - }; - -/* ******************* - - SocialCalc.FormatNumber.parse_format_string(format_defs, format_string) - - Takes a format string (e.g., "#,##0.00_);(#,##0.00)") and fills in format_defs with the parsed info - - format_defs - ["#,##0.0"]->{} - elements in the hash are one hash for each format - .operators->[] - array of operators from parsing the format string (each a number) - .operands->[] - array of corresponding operators (each usually a string) - .sectioninfo->[] - one hash for each section of the format - .start - .integerdigits - .fractiondigits - .commas - .percent - .thousandssep - .hasdates - .hascomparison - true if any section has [<100], etc. - -************************* */ - -SocialCalc.FormatNumber.parse_format_string = function(format_defs, format_string) { - - var scfn = SocialCalc.FormatNumber; - - var thisformat, section, sectionfinfo; - var integerpart = 1; // start out in integer part - var lastwasinteger; // last char was an integer placeholder - var lastwasslash; // last char was a backslash - escaping following character - var lastwasasterisk; // repeat next char - var lastwasunderscore; // last char was _ which picks up following char for width - var inquote, quotestr; // processing a quoted string - var inbracket, bracketstr, bracketdata; // processing a bracketed string - var ingeneral, gpos; // checks for characters "General" - var ampmstr, part; // checks for characters "A/P" and "AM/PM" - var indate; // keeps track of date/time placeholders - var chpos; // character position being looked at - var ch; // character being looked at - - if (format_defs[format_string]) return; // already defined - nothing to do - - thisformat = {operators: [], operands: [], sectioninfo: [{}]}; // create info structure for this format - format_defs[format_string] = thisformat; // add to other format definitions - - section = 0; // start with section 0 - sectioninfo = thisformat.sectioninfo[section]; // get reference to info for current section - sectioninfo.sectionstart = 0; // position in operands that starts this section - sectioninfo.integerdigits = 0; // number of integer-part placeholders - sectioninfo.fractiondigits = 0; // fraction placeholders - sectioninfo.commas = 0; // commas encountered, to handle scaling - sectioninfo.percent = 0; // times to scale by 100 - - for (chpos=0; chpos=0) { - indate = ch; - } - else { - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } - } - - if (indate) { // last char was part of unsaved date placeholder - thisformat.operators.push(scfn.commands.date); - thisformat.operands.push(indate); - sectioninfo.hasdate = 1; - } - - return; - - } - - -/* ******************* - - bracketdata = SocialCalc.FormatNumber.parse_format_bracket(bracketstr) - - Takes a bracket contents (e.g., "RED", ">10") and returns an operator and operand - - bracketdata->{} - .operator - .operand - -************************* */ - -SocialCalc.FormatNumber.parse_format_bracket = function(bracketstr) { - - var scfn = SocialCalc.FormatNumber; - var scc = SocialCalc.Constants; - - var bracketdata={}; - var parts; - - if (bracketstr.charAt(0)=='$') { // currency - bracketdata.operator = scfn.commands.currency; - parts=bracketstr.match(/^\$(.+?)(\-.+?){0,1}$/); - if (parts) { - bracketdata.operand = parts[1] || scc.FormatNumber_defaultCurrency || '$'; - } - else { - bracketdata.operand = bracketstr.substring(1) || scc.FormatNumber_defaultCurrency || '$'; - } - } - else if (bracketstr=='?$') { - bracketdata.operator = scfn.commands.currency; - bracketdata.operand = '[?$]'; - } - else if (scfn.allowedcolors[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.color; - bracketdata.operand = scfn.allowedcolors[bracketstr.toUpperCase()]; - } - else if (parts=bracketstr.match(/^style=([^"]*)$/)) { // [style=...] - bracketdata.operator = scfn.commands.style; - bracketdata.operand = parts[1]; - } - else if (bracketstr==",") { - bracketdata.operator = scfn.commands.separator; - bracketdata.operand = bracketstr; - } - else if (scfn.alloweddates[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.date; - bracketdata.operand = scfn.alloweddates[bracketstr.toUpperCase()]; - } - else if (parts=bracketstr.match(/^[<>=]/)) { // comparison operator - parts=bracketstr.match(/^([<>=]+)(.+)$/); // split operator and value - bracketdata.operator = scfn.commands.comparison; - bracketdata.operand = parts[1]+":"+parts[2]; - } - else { // unknown bracket - bracketdata.operator = scfn.commands.copy; - bracketdata.operand = "["+bracketstr+"]"; - } - - return bracketdata; - - } - -/* ******************* - - juliandate = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, month, day) - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - - I= YEAR - J= MONTH - K= DAY -C - JD= K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12) - 2 /12-3*((I+4900+(J-14)/12)/100)/4 - -************************* */ - -SocialCalc.FormatNumber.convert_date_gregorian_to_julian = function(year, month, day) { - - var juliandate; - - juliandate = day-32075+SocialCalc.intFunc(1461*(year+4800+SocialCalc.intFunc((month-14)/12))/4); - juliandate += SocialCalc.intFunc(367*(month-2-SocialCalc.intFunc((month-14)/12)*12)/12); - juliandate = juliandate - SocialCalc.intFunc(3*SocialCalc.intFunc((year+4900+SocialCalc.intFunc((month-14)/12))/100)/4); - - return juliandate; - - } - - -/* ******************* - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian(juliandate) - - ymd->{} - .year - .month - .day - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - -************************* */ - -SocialCalc.FormatNumber.convert_date_julian_to_gregorian = function(juliandate) { - - var L, N, I, J, K; - - L = juliandate+68569; - N = Math.floor(4*L/146097); - L = L-Math.floor((146097*N+3)/4); - I = Math.floor(4000*(L+1)/1461001); - L = L-Math.floor(1461*I/4)+31; - J = Math.floor(80*L/2447); - K = L-Math.floor(2447*J/80); - L = Math.floor(J/11); - J = J+2-12*L; - I = 100*(N-49)+I+L; - - return {year:I, month:J, day:K}; - - } - -SocialCalc.intFunc = function(n) { - if (n < 0) { - return -Math.floor(-n); - } - else { - return Math.floor(n); - } - } - diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/formula1.js b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/formula1.js deleted file mode 100644 index 15ecebc..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/formula1.js +++ /dev/null @@ -1,4749 +0,0 @@ -// -/* -// SocialCalc Spreadsheet Formula Library -// -// Part of the SocialCalc package -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - // In any case, requires SocialCalc.Constants. - -SocialCalc.Formula = {}; - -// -// Formula constants for parsing: -// - - SocialCalc.Formula.ParseState = {num: 1, alpha: 2, coord: 3, string: 4, stringquote: 5, numexp1: 6, numexp2: 7, alphanumeric: 8, specialvalue:9}; - - SocialCalc.Formula.TokenType = {num: 1, coord: 2, op: 3, name: 4, error: 5, string: 6, space: 7}; - - SocialCalc.Formula.CharClass = {num: 1, numstart: 2, op: 3, eof: 4, alpha: 5, incoord: 6, error: 7, quote: 8, space: 9, specialstart: 10}; - - SocialCalc.Formula.CharClassTable = { - " ": 9, "!": 3, '"': 8, "#": 10, "$":6, "%":3, "&":3, "(": 3, ")": 3, "*": 3, "+": 3, ",": 3, "-": 3, ".": 2, "/": 3, - "0": 1, "1": 1, "2": 1, "3": 1, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "9": 1, - ":": 3, "<": 3, "=": 3, ">": 3, - "A": 5, "B": 5, "C": 5, "D": 5, "E": 5, "F": 5, "G": 5, "H": 5, "I": 5, "J": 5, "K": 5, "L": 5, "M": 5, "N": 5, - "O": 5, "P": 5, "Q": 5, "R": 5, "S": 5, "T": 5, "U": 5, "V": 5, "W": 5, "X": 5, "Y": 5, "Z": 5, - "^": 3, "_": 5, - "a": 5, "b": 5, "c": 5, "d": 5, "e": 5, "f": 5, "g": 5, "h": 5, "i": 5, "j": 5, "k": 5, "l": 5, "m": 5, "n": 5, - "o": 5, "p": 5, "q": 5, "r": 5, "s": 5, "t": 5, "u": 5, "v": 5, "w": 5, "x": 5, "y": 5, "z": 5 - }; - - SocialCalc.Formula.UpperCaseTable = { - "a": "A", "b": "B", "c": "C", "d": "D", "e": "E", "f": "F", "g": "G", "h": "H", "i": "I", "j": "J", "k": "K", "l": "L", "m": "M", - "n": "N", "o": "O", "p": "P", "q": "Q", "r": "R", "s": "S", "t": "T", "u": "U", "v": "V", "w": "W", "x": "X", "y": "Y", "z": "Z" - } - - SocialCalc.Formula.SpecialConstants = { // names that turn into constants for name lookup - "#NULL!": "0,e#NULL!", "#NUM!": "0,e#NUM!", "#DIV/0!": "0,e#DIV/0!", "#VALUE!": "0,e#VALUE!", - "#REF!": "0,e#REF!", "#NAME?": "0,e#NAME?"}; - - - // Operator Precedence table - // - // 1- !, 2- : ,, 3- M P, 4- %, 5- ^, 6- * /, 7- + -, 8- &, 9- < > = G(>=) L(<=) N(<>), - // Negative value means Right Associative - - SocialCalc.Formula.TokenPrecedence = { - "!": 1, - ":": 2, ",": 2, - "M": -3, "P": -3, - "%": 4, - "^": 5, - "*": 6, "/": 6, - "+": 7, "-": 7, - "&": 8, - "<": 9, ">": 9, "G": 9, "L": 9, "N": 9 - }; - - // Convert one-char token text to input text: - - SocialCalc.Formula.TokenOpExpansion = {'G': '>=', 'L': '<=', 'M': '-', 'N': '<>', 'P': '+'}; - - // - // Information about the resulting value types when doing operations on values (used by LookupResultType) - // - // Each object entry is an object with specific types with result type info as follows: - // - // 'type1a': '|type2a:resulta|type2b:resultb|... - // Type of t* or n* matches any of those types not listed - // Results may be a type or the numbers 1 or 2 specifying to return type1 or type2 - - - SocialCalc.Formula.TypeLookupTable = { - unaryminus: { 'n*': '|n*:1|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - unaryplus: { 'n*': '|n*:1|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - unarypercent: { 'n*': '|n:n%|n*:n|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - plus: { - 'n%': '|n%:n%|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nd': '|n%:n|nd:nd|nt:ndt|ndt:ndt|n$:n|n:nd|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nt': '|n%:n|nd:ndt|nt:nt|ndt:ndt|n$:n|n:nt|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'ndt': '|n%:n|nd:ndt|nt:ndt|ndt:ndt|n$:n|n:ndt|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'n$': '|n%:n|nd:n|nt:n|ndt:n|n$:n$|n:n$|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nl': '|n%:n|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'n': '|n%:n|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'b': '|n%:n%|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 't*': '|n*:e#VALUE!|t*:e#VALUE!|b:e#VALUE!|e*:2|', - 'e*': '|e*:1|n*:1|t*:1|b:1|' - }, - concat: { - 't': '|t:t|th:th|tw:tw|tl:t|t*:2|e*:2|', - 'th': '|t:th|th:th|tw:t|tl:th|t*:t|e*:2|', - 'tw': '|t:tw|th:t|tw:tw|tl:tw|t*:t|e*:2|', - 'tl': '|t:tl|th:th|tw:tw|tl:tl|t*:t|e*:2|', - 'e*': '|e*:1|n*:1|t*:1|' - }, - oneargnumeric: { 'n*': '|n*:n|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - twoargnumeric: { 'n*': '|n*:n|t*:e#VALUE!|e*:2|', 'e*': '|e*:1|n*:1|t*:1|', 't*': '|t*:e#VALUE!|n*:e#VALUE!|e*:2|'}, - propagateerror: { 'n*': '|n*:2|e*:2|', 'e*': '|e*:2|', 't*': '|t*:2|e*:2|', 'b': '|b:2|e*:2|'} - }; - -/* ******************* - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(line) - - Parses a text string as if it was a spreadsheet formula - - This uses a simple state machine run on each character in turn. - States remember whether a number is being gathered, etc. - The result is parseinfo which is an array with one entry for each token: - parseinfo[i] = { - text: "the characters making up the parsed token", - type: the type of the token (a number), - opcode: a single character version of an operator suitable for use in the - precedence table and distinguishing between unary and binary + and -. - -************************* */ - -SocialCalc.Formula.ParseFormulaIntoTokens = function(line) { - - var i, ch, chclass, haddecimal, last_token, last_token_type, last_token_text, t; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var parsestate = scf.ParseState; - var tokentype = scf.TokenType; - var charclass = scf.CharClass; - var charclasstable = scf.CharClassTable; - var uppercasetable = scf.UpperCaseTable; // much faster than toUpperCase function - var pushtoken = scf.ParsePushToken; - var coordregex = /^\$?[A-Z]{1,2}\$?[1-9]\d*$/i; - - var parseinfo = []; - var str = ""; - var state = 0; - var haddecimal = false; - - for (i=0; i<=line.length; i++) { - if (i0) { - last_token = parseinfo[parseinfo.length-1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - if (last_token_type == charclass.op) { - if (last_token_text == '<' || last_token_text == ">") { - str = last_token_text + str; - parseinfo.pop(); - if (parseinfo.length>0) { - last_token = parseinfo[parseinfo.length-1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - } - else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - } - } - } - else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - t = tokentype.op; - if ((parseinfo.length == 0) - || (last_token_type == charclass.op && last_token_text != ')' && last_token_text != '%')) { // Unary operator - if (str == '-') { // M is unary minus - str = "M"; - ch = "M"; - } - else if (str == '+') { // P is unary plus - str = "P"; - ch = "P"; - } - else if (str == ')' && last_token_text == '(') { // null arg list OK - ; - } - else if (str != '(') { // binary-op open-paren OK, others no - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } - else if (str.length > 1) { - if (str == '>=') { // G is >= - str = "G"; - ch = "G"; - } - else if (str == '<=') { // L is <= - str = "L"; - ch = "L"; - } - else if (str == '<>') { // N is <> - str = "N"; - ch = "N"; - } - else { - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } - pushtoken(parseinfo, str, t, ch); - state = 0; - } - else if (cclass == charclass.quote) { // starting a string - str = ""; - state = parsestate.string; - } - else if (cclass == charclass.space) { // store so can reconstruct spacing - pushtoken(parseinfo, " ", tokentype.space, 0); - } - else if (cclass == charclass.eof) { // ignore -- needed to have extra loop to close out other things - } - else { // unknown class - such as unknown char - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - } - } - } - - return parseinfo; - - } - -SocialCalc.Formula.ParsePushToken = function(parseinfo, ttext, ttype, topcode) { - - parseinfo.push({text: ttext, type: ttype, opcode: topcode}); - - } - -/* ******************* - - result = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, allowrangereturn) - - Does the calculation expressed in a parsed formula, returning a value, its type, and error info - returns: {value: value, type: valuetype, error: errortext}. - - If allowrangereturn is present and true, can return a range (e.g., "A1:A10" - translated from "A1|A10|") - -************************* */ - -SocialCalc.Formula.evaluate_parsed_formula = function(parseinfo, sheet, allowrangereturn) { - - var result; - - var scf = SocialCalc.Formula; - var tokentype = scf.TokenType; - - var revpolish; - var parsestack = []; - - var errortext = ""; - - revpolish = scf.ConvertInfixToPolish(parseinfo); // result is either an array or a string with error text - - result = scf.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn); - - return result; - -} - -// -// revpolish = SocialCalc.Formula.ConvertInfixToPolish(parseinfo) -// -// Convert infix to reverse polish notation -// -// Returns revpolish array with a sequence of references to tokens by number if successful. -// Errors return a string with the error. -// -// Based upon the algorithm shown in Wikipedia "Reverse Polish notation" article -// and then enhanced for additional spreadsheet things -// - -SocialCalc.Formula.ConvertInfixToPolish = function(parseinfo) { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var token_precedence = scf.TokenPrecedence; - - var revpolish = []; - var parsestack = []; - - var errortext = ""; - - var function_start = -1; - - var i, pii, ttype, ttext, tprecedence, tstackprecedence; - - for (i=0; i= 0 && tprecedence < tstackprecedence) { - break; - } - else if (tprecedence < 0) { - tprecedence = -tprecedence; - if (tstackprecedence < 0) tstackprecedence = -tstackprecedence; - if (tprecedence <= tstackprecedence) { - break; - } - } - revpolish.push(parsestack.pop()); - } - parsestack.push(i); - } - else if (ttype == tokentype.error) { - errortext = ttext; - break; - } - else { - errortext = "Internal error while processing parsed formula. "; - break; - } - } - while (parsestack.length>0) { - if (parseinfo[parsestack[parsestack.length-1]].text == '(') { - errortext = scc.s_parseerrmissingcloseparen; - break; - } - revpolish.push(parsestack.pop()); - } - - if (errortext) { - return errortext; - } - - return revpolish; - - } - - -// -// result = SocialCalc.Formula.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn) -// -// Execute reverse polish representation of formula -// -// Operand values are objects in the operand array with a "type" and an optional "value". -// Type can have these values (many are type and sub-type as two or more letters): -// "tw", "th", "t", "n", "nt", "coord", "range", "start", "eErrorType", "b" (blank) -// The value of a coord is in the form A57 or A57!sheetname -// The value of a range is coord|coord|number where number starts at 0 and is -// the offset of the next item to fetch if you are going through the range one by one -// The number starts as a null string ("A1|B3|") -// - -SocialCalc.Formula.EvaluatePolish = function(parseinfo, revpolish, sheet, allowrangereturn) { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var lookup_result_type = scf.LookupResultType; - var typelookup = scf.TypeLookupTable; - var operand_as_number = scf.OperandAsNumber; - var operand_as_text = scf.OperandAsText; - var operand_value_and_type = scf.OperandValueAndType; - var operands_as_coord_on_sheet = scf.OperandsAsCoordOnSheet; - var format_number_for_display = SocialCalc.format_number_for_display || function(v, t, f) {return v+"";}; - - var errortext = ""; - var function_start = -1; - var missingOperandError = {value: "", type: "e#VALUE!", error: scc.s_parseerrmissingoperand}; - - var operand = []; - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var i, rii, prii, ttype, ttext, value1, value2, tostype, tostype2, resulttype, valuetype, cond, vmatch, smatch; - - if (!parseinfo.length || (! (revpolish instanceof Array))) { - return ({value: "", type: "e#VALUE!", error: (typeof revpolish == "string" ? revpolish : "")}); - } - - for (i=0; i N (< <= = >= > <>) - - else if (ttext == "<" || ttext == "L" || ttext == "=" || ttext == "G" || ttext == ">" || ttext == "N") { - if (operand.length <= 1) { // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_value_and_type(sheet, operand); - value1 = operand_value_and_type(sheet, operand); - if (value1.type.charAt(0) == "n" && value2.type.charAt(0) == "n") { // compare two numbers - cond = 0; - if (ttext == "<") { cond = value1.value < value2.value ? 1 : 0; } - else if (ttext == "L") { cond = value1.value <= value2.value ? 1 : 0; } - else if (ttext == "=") { cond = value1.value == value2.value ? 1 : 0; } - else if (ttext == "G") { cond = value1.value >= value2.value ? 1 : 0; } - else if (ttext == ">") { cond = value1.value > value2.value ? 1 : 0; } - else if (ttext == "N") { cond = value1.value != value2.value ? 1 : 0; } - PushOperand("nl", cond); - } - else if (value1.type.charAt(0) == "e") { // error on left - PushOperand(value1.type, 0); - } - else if (value2.type.charAt(0) == "e") { // error on right - PushOperand(value2.type, 0); - } - else { // text maybe mixed with numbers or blank - tostype = value1.type.charAt(0); - tostype2 = value2.type.charAt(0); - if (tostype == "n") { - value1.value = format_number_for_display(value1.value, "n", ""); - } - else if (tostype == "b") { - value1.value = ""; - } - if (tostype2 == "n") { - value2.value = format_number_for_display(value2.value, "n", ""); - } - else if (tostype2 == "b") { - value2.value = ""; - } - cond = 0; - value1.value = value1.value.toLowerCase(); // ignore case - value2.value = value2.value.toLowerCase(); - if (ttext == "<") { cond = value1.value < value2.value ? 1 : 0; } - else if (ttext == "L") { cond = value1.value <= value2.value ? 1 : 0; } - else if (ttext == "=") { cond = value1.value == value2.value ? 1 : 0; } - else if (ttext == "G") { cond = value1.value >= value2.value ? 1 : 0; } - else if (ttext == ">") { cond = value1.value > value2.value ? 1 : 0; } - else if (ttext == "N") { cond = value1.value != value2.value ? 1 : 0; } - PushOperand("nl", cond); - } - } - - // Normal infix arithmethic operators: +, -. *, /, ^ - - else { // what's left are the normal infix arithmetic operators - if (operand.length <= 1) { // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_as_number(sheet, operand); - value1 = operand_as_number(sheet, operand); - if (ttext == '+') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value + value2.value); - } - else if (ttext == '-') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value - value2.value); - } - else if (ttext == '*') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value * value2.value); - } - else if (ttext == '/') { - if (value2.value != 0) { - PushOperand("n", value1.value / value2.value); // gives plain numeric result type - } - else { - PushOperand("e#DIV/0!", 0); - } - } - else if (ttext == '^') { - value1.value = Math.pow(value1.value, value2.value); - value1.type = "n"; // gives plain numeric result type - if (isNaN(value1.value)) { - value1.value = 0; - value1.type = "e#NUM!"; - } - PushOperand(value1.type, value1.value); - } - } - } - - // function or name - - else if (ttype == tokentype.name) { - errortext = scf.CalculateFunction(ttext, operand, sheet); - if (errortext) break; - } - - else { - errortext = scc.s_InternalError+"Unknown token "+ttype+" ("+ttext+"). "; - break; - } - } - - // look at final value and handle special cases - - value = operand[0] ? operand[0].value : ""; - tostype = operand[0] ? operand[0].type : ""; - - if (tostype == "name") { // name - expand it - value1 = SocialCalc.Formula.LookupName(sheet, value); - value = value1.value; - tostype = value1.type; - errortext = errortext || value1.error; - } - - if (tostype == "coord") { // the value is a coord reference, get its value and type - value1 = operand_value_and_type(sheet, operand); - value = value1.value; - tostype = value1.type; - if (tostype == "b") { - tostype = "n"; - value = 0; - } - } - - if (operand.length > 1 && !errortext) { // something left - error - errortext += scc.s_parseerrerrorinformula; - } - - // set return type - - valuetype = tostype; - - if (tostype.charAt(0) == "e") { // error value - errortext = errortext || tostype.substring(1) || scc.s_calcerrerrorvalueinformula; - } - else if (tostype == "range") { - vmatch = value.match(/^(.*)\|(.*)\|/); - smatch = vmatch[1].indexOf("!"); - if (smatch>=0) { // swap sheetname - vmatch[1] = vmatch[1].substring(smatch+1) + "!" + vmatch[1].substring(0, smatch).toUpperCase(); - } - else { - vmatch[1] = vmatch[1].toUpperCase(); - } - value = vmatch[1] + ":" + vmatch[2].toUpperCase(); - if (!allowrangereturn) { - errortext = scc.s_formularangeresult+" "+value; - } - } - - if (errortext && valuetype.charAt(0) != "e") { - value = errortext; - valuetype = "e"; - } - - // look for overflow - - if (valuetype.charAt(0) == "n" && (isNaN(value) || !isFinite(value))) { - value = 0; - valuetype = "e#NUM!"; - errortext = isNaN(value) ? scc.s_calcerrnumericnan: scc.s_calcerrnumericoverflow; - } - - return ({value: value, type: valuetype, error: errortext}); - - } - - -/* -# -# resulttype = SocialCalc.Formula.LookupResultType(type1, type2, typelookup); -# -# typelookup has values of the following form: -# -# typelookup{"typespec1"} = "|typespec2A:resultA|typespec2B:resultB|..." -# -# First type1 is looked up. If no match, then the first letter (major type) of type1 plus "*" is looked up -# resulttype is type1 if result is "1", type2 if result is "2", otherwise the value of result. -# -*/ - -SocialCalc.Formula.LookupResultType = function(type1, type2, typelookup) { - - var pos1, pos2, result; - - var table1 = typelookup[type1]; - - if (!table1) { - table1 = typelookup[type1.charAt(0)+'*']; - if (!table1) { - return "e#VALUE! (internal error, missing LookupResultType "+type1.charAt(0)+"*)"; // missing from table -- please add it - } - } - pos1 = table1.indexOf("|"+type2+":"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1+1); - if (pos2<0) return "e#VALUE! (internal error, incorrect LookupResultType "+table1+")"; - result = table1.substring(pos1+type2.length+2, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - pos1 = table1.indexOf("|"+type2.charAt(0)+"*:"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1+1); - if (pos2<0) return "e#VALUE! (internal error, incorrect LookupResultType "+table1+")"; - result = table1.substring(pos1+4, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - return "e#VALUE!"; - - } - -/* -# -# operandinfo = SocialCalc.Formula.TopOfStackValueAndType(sheet, operand) -# -# Returns top of stack value and type and then pops the stack. -# The result is {value: value, type: type, error: "only if bad error"} -# -*/ - -SocialCalc.Formula.TopOfStackValueAndType = function(sheet, operand) { - - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - if (!stacklen) { // make sure something is there - result.error = SocialCalc.Constants.s_InternalError+"no operand on stack"; - return result; - } - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - return result; - - } - - -/* -# -# operandinfo = OperandAsNumber(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns numeric value and type. -# Text values are treated as 0 if they can't be converted somehow. -# -*/ - -SocialCalc.Formula.OperandAsNumber = function(sheet, operand) { - - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "n") { - operandinfo.value = operandinfo.value-0; - } - else if (t == "b") { // blank cell - operandinfo.type = "n"; - operandinfo.value = 0; - } - else if (t == "e") { // error - operandinfo.value = 0; - } - else { - valueinfo = SocialCalc.DetermineValueType ? SocialCalc.DetermineValueType(operandinfo.value) : - {value: operandinfo.value-0, type: "n"}; // if without rest of SocialCalc - if (valueinfo.type.charAt(0) == "n") { - operandinfo.value = valueinfo.value-0; - operandinfo.type = valueinfo.type; - } - else { - operandinfo.value = 0; - operandinfo.type = valueinfo.type; - } - } - - return operandinfo; - - } - -/* -# -# operandinfo = OperandAsText(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns text value, preserving sub-type. -# -*/ - -SocialCalc.Formula.OperandAsText = function(sheet, operand) { - - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "t") { // any flavor of text returns as is - ; - } - else if (t == "n") { - operandinfo.value = SocialCalc.format_number_for_display ? - SocialCalc.format_number_for_display(operandinfo.value, operandinfo.type, "") : - operandinfo.value = operandinfo.value+""; - operandinfo.type = "t"; - } - else if (t == "b") { // blank - operandinfo.value = ""; - operandinfo.type = "t"; - } - else if (t == "e") { // error - operandinfo.value = ""; - } - else { - operand.value = operandinfo.value + ""; - operand.type = "t"; - } - - return operandinfo; - - } - -/* -# -# result = SocialCalc.Formula.OperandValueAndType(sheet, operand) -# -# Pops the top of stack and returns it, following a coord reference if necessary. -# The result is {value: value, type: type, error: "only if bad error"} -# Ranges are returned as if they were pushed onto the stack first coord first -# Also sets type with "t", "n", "th", etc., as appropriate -# -*/ - -SocialCalc.Formula.OperandValueAndType = function(sheet, operand) { - - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - if (!stacklen) { // make sure something is there - result.error = SocialCalc.Constants.s_InternalError+"no operand on stack"; - return result; - } - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - if (result.type == "range") { - result = scf.StepThroughRangeDown(operand, result.value); - } - - if (result.type == "coord") { // value is a coord reference - coordsheet = sheet; - pos = result.value.indexOf("!"); - if (pos != -1) { // sheet reference - coordsheet = scf.FindInSheetCache(result.value.substring(pos+1)); // get other sheet - if (coordsheet == null) { // unavailable - result.type = "e#REF!"; - result.error = SocialCalc.Constants.s_sheetunavailable+" "+result.value.substring(pos+1); - result.value = 0; - return result; - } - result.value = result.value.substring(0, pos); // get coord part - } - - if (coordsheet) { - cell = coordsheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - cellvtype = cell.valuetype; // get type of value in the cell it points to - result.value = cell.datavalue; - } - else { - cellvtype = "b"; - } - } - else { - cellvtype = "e#N/A"; - result.value = 0; - } - result.type = cellvtype || "b"; - if (result.type == "b") { // blank - result.value = 0; - } - } - - return result; - - } - -/* -# -# operandinfo = SocialCalc.Formula.OperandAsCoord(sheet, operand) -# -# Gets top of stack and pops it. -# Returns coord value. All others are treated as an error. -# -*/ - - -SocialCalc.Formula.OperandAsCoord = function(sheet, operand) { - - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - result = SocialCalc.Formula.LookupName(sheet, result.value); - } - if (result.type == "coord") { // value is a coord reference - return result; - } - else { - result.value = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - return result; - } -} - - -/* -# -# result = SocialCalc.Formula.OperandsAsCoordOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as sheetname!coord-or-name. -# Returns stack-style coord value (coord!sheetname, or coord!sheetname|coord|) with -# a type of coord or range. All others are treated as an error. -# If sheetname not available, sets result.error. -# -*/ - -SocialCalc.Formula.OperandsAsCoordOnSheet = function(sheet, operand) { - - var sheetname, othersheet, pos1, pos2; - var value1 = {}; - var result = {}; - var scf = SocialCalc.Formula; - - var stacklen = operand.length; - value1.value = operand[stacklen-1].value; // get top of stack - coord or name - value1.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - sheetname = scf.OperandAsSheetName(sheet, operand); // get sheetname as text - othersheet = scf.FindInSheetCache(sheetname.value); - if (othersheet == null) { // unavailable - result.type = "e#REF!"; - result.value = 0; - result.error = SocialCalc.Constants.s_sheetunavailable+" "+sheetname.value; - return result; - } - - if (value1.type == "name") { - value1 = scf.LookupName(othersheet, value1.value); - } - result.type = value1.type; - if (value1.type == "coord") { // value is a coord reference - result.value = value1.value + "!" + sheetname.value; // return in the format as used on stack - } - else if (value1.type == "range") { // value is a range reference - pos1 = value1.value.indexOf("|"); - pos2 = value1.value.indexOf("|", pos1+1); - result.value = value1.value.substring(0, pos1) + "!" + sheetname.value + - "|" + value1.value.substring(pos1+1, pos2) + "|"; - } - else if (value1.type.charAt(0)=="e") { - result.value = value1.value; - } - else { - result.error = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - result.value = 0; - } - return result; - - } - -/* -# -# result = SocialCalc.Formula.OperandsAsRangeOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as coord2-or-name:coord1. -# Name is evaluated on sheet of coord1. -# Returns result with "value" of stack-style range value (coord!sheetname|coord|) and -# "type" of "range". All others are treated as an error. -# -*/ - -SocialCalc.Formula.OperandsAsRangeOnSheet = function(sheet, operand) { - - var value1, othersheet, pos1, pos2; - var value2 = {}; - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var stacklen = operand.length; - value2.value = operand[stacklen-1].value; // get top of stack - coord or name for "right" side - value2.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - value1 = scf.OperandAsCoord(sheet, operand); // get "left" coord - if (value1.type != "coord") { // not a coord, which it must be - return {value: 0, type: "e#REF!"}; - } - - othersheet = sheet; - pos1 = value1.value.indexOf("!"); - if (pos1 != -1) { // sheet reference - pos2 = value1.value.indexOf("|", pos1+1); - if (pos2 < 0) pos2 = value1.value.length; - othersheet = scf.FindInSheetCache(value1.value.substring(pos1+1,pos2)); // get other sheet - if (othersheet == null) { // unavailable - return {value: 0, type: "e#REF!", errortext: scc.s_sheetunavailable+" "+value1.value.substring(pos1+1,pos2)}; - } - } - - if (value2.type == "name") { // coord:name is allowed, if name is just one cell - value2 = scf.LookupName(othersheet, value2.value); - } - - if (value2.type == "coord") { // value is a coord reference, so return the combined range - return {value: value1.value+"|"+value2.value+"|", type: "range"}; // return range in the format as used on stack - } - else { // bad form - return {value: scc.s_calcerrcellrefmissing, type: "e#REF!"}; - } - } - - -/* -# -# result = SocialCalc.Formula.OperandAsSheetName(sheet, operand) -# -# Gets top of stack and pops it. -# Returns sheetname value. All others are treated as an error. -# Accepts text, cell reference, and named value which is one of those two. -# -*/ - -SocialCalc.Formula.OperandAsSheetName = function(sheet, operand) { - - var nvalue, cell; - - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - nvalue = SocialCalc.Formula.LookupName(sheet, result.value); - if (!nvalue.value) { // not a known name - return bare name as the name value - return result; - } - result.value = nvalue.value; - result.type = nvalue.type; - } - if (result.type == "coord") { // value is a coord reference, follow it to find sheet name - cell = sheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - result.value = cell.datavalue; - result.type = cell.valuetype; - } - else { - result.value = ""; - result.type = "b"; - } - } - if (result.type.charAt(0) == "t") { // value is a string which could be a sheet name - return result; - } - else { - result.value = ""; - result.error = SocialCalc.Constants.s_calcerrsheetnamemissing; - return result; - } - - } - -// -// value = SocialCalc.Formula.LookupName(sheet, name) -// -// Returns value and type of a named value -// Names are case insensitive -// Names may have a definition which is a coord (A1), a range (A1:B7), or a formula (=OFFSET(A1,0,0,5,1)) -// Note: The range must not have sheet names ("!") in them. -// - -SocialCalc.Formula.LookupName = function(sheet, name) { - - var pos, specialc, parseinfo; - var names = sheet.names; - var value = {}; - var startedwalk = false; - - if (names[name.toUpperCase()]) { // is name defined? - - value.value = names[name.toUpperCase()].definition; // yes - - if (value.value.charAt(0) == "=") { // formula - if (!sheet.checknamecirc) { // are we possibly walking the name tree? - sheet.checknamecirc = {}; // not yet - startedwalk = true; // remember we are the reference that started it - } - else { - if (sheet.checknamecirc[name]) { // circular reference - value.type = "e#NAME?"; - value.error = SocialCalc.Constants.s_circularnameref+' "' + name + '".'; - return value; - } - } - sheet.checknamecirc[name] = true; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(value.value.substring(1)); - value = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, 1); // parse formula, allowing range return - - delete sheet.checknamecirc[name]; // done with us - if (startedwalk) { - delete sheet.checknamecirc; // done with walk - } - - if (value.type != "range") { - return value; - } - } - - pos = value.value.indexOf(":"); - if (pos != -1) { // range - value.type = "range"; - value.value = value.value.substring(0, pos) + "|" + value.value.substring(pos+1)+"|"; - value.value = value.value.toUpperCase(); - } - else { - value.type = "coord"; - value.value = value.value.toUpperCase(); - } - return value; - } - else if (specialc=SocialCalc.Formula.SpecialConstants[name.toUpperCase()]) { // special constant, like #REF! - pos = specialc.indexOf(","); - value.value = specialc.substring(0,pos)-0; - value.type = specialc.substring(pos+1); - return value; - } - else { - value.value = ""; - value.type = "e#NAME?"; - value.error = SocialCalc.Constants.s_calcerrunknownname+' "'+name+'"'; - return value; - } - } - -/* -# -# coord = SocialCalc.Formula.StepThroughRangeDown(operand, rangevalue) -# -# Returns next coord in a range, keeping track on the operand stack -# Goes from upper left across and down to bottom right. -# -*/ - -SocialCalc.Formula.StepThroughRangeDown = function(operand, rangevalue) { - - var value1, value2, sequence, pos1, pos2, sheet1, rp, c, r, count; - var scf = SocialCalc.Formula; - - pos1 = rangevalue.indexOf("|"); - pos2 = rangevalue.indexOf("|", pos1+1); - value1 = rangevalue.substring(0, pos1); - value2 = rangevalue.substring(pos1+1, pos2); - sequence = rangevalue.substring(pos2+1) - 0; - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1); - value1 = value1.substring(0, pos1); - } - else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - rp = scf.OrderRangeParts(value1, value2); - - count = 0; - for (r=rp.r1; r<=rp.r2; r++) { - for (c=rp.c1; c<=rp.c2; c++) { - count++; - if (count > sequence) { - if (r!=rp.r2 || c!=rp.c2) { // keep on stack until done - scf.PushOperand(operand, "range", value1+sheet1+"|"+value2+"|"+count); - } - return {value: SocialCalc.crToCoord(c, r)+sheet1, type: "coord"}; - } - } - } - } - -/* -# -# result = SocialCalc.Formula.DecodeRangeParts(sheetdata, range) -# -# Returns sheetdata for the sheet where the range is, as well as -# the number of the first column in the range, the number of columns, -# and equivalent row information: -# -# {sheetdata: sheet, sheetname: name-or-"", col1num: n, ncols: n, row1num: n, nrows: n} -# -# If any errors, a null result is returned. -# -*/ - -SocialCalc.Formula.DecodeRangeParts = function(sheetdata, range) { - - var value1, value2, pos1, pos2, sheet1, coordsheetdata, rp; - - var scf = SocialCalc.Formula; - - pos1 = range.indexOf("|"); - pos2 = range.indexOf("|", pos1+1); - value1 = range.substring(0, pos1); - value2 = range.substring(pos1+1, pos2); - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1+1); - value1 = value1.substring(0, pos1); - } - else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - coordsheetdata = sheetdata; - if (sheet1) { // sheet reference - coordsheetdata = scf.FindInSheetCache(sheet1); - if (coordsheetdata == null) { // unavailable - return null; - } - } - - rp = scf.OrderRangeParts(value1, value2); - - return {sheetdata: coordsheetdata, sheetname: sheet1, col1num: rp.c1, ncols: rp.c2-rp.c1+1, row1num: rp.r1, nrows: rp.r2-rp.r1+1} - - } - - -//********************* -// -// Function Handling -// -//********************* - -// List of functions -- Define after functions are defined -// -// SocialCalc.Formula.FunctionList["function_name"] = [function_subroutine, number_of_arguments, arg_def, func_def, func_class] -// function_subroutine takes arguments (fname, operand, foperand, sheet), returns -// errortext or null, pushing result on operand stack. -// number_of_arguments is: -// 0 = no arguments -// >0 = exactly that many arguments -// <0 = that many arguments (abs value) or more -// 100 = don't check -// -// arg_def, if present, is the name of the element in SocialCalc.Formula.FunctionArgDefs. -// func_def, if present, is a string explaining the function. If not, looked up in SocialCalc.Constants. -// func_class, if present, is the comma-separated names of the elements in SocialCalc.Formula.FunctionClasses. -// -// To add a function, just add it to this object. - - if (!SocialCalc.Formula.FunctionList) { // make sure it is defined (could have been in another module) - SocialCalc.Formula.FunctionList = {}; - } - - // FunctionClasses[classname] = {name: full-name-string, items: [sorted list of function names]}; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionClasses = null; // start null to say needs filling in - - // FunctionArgDef[argname] = explicit-string-for-arg-list; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionArgDefs = {}; - - -/* -# -# errortext = SocialCalc.Formula.CalculateFunction(fname, operand, sheet) -# -# Dispatches for function fname. -# -*/ - -SocialCalc.Formula.CalculateFunction = function(fname, operand, sheet) { - - var fobj, foperand, ffunc, argnum, ttext; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = ""; - - fobj = scf.FunctionList[fname]; - - if (fobj) { - foperand = []; - ffunc = fobj[0]; - argnum = fobj[1]; - scf.CopyFunctionArgs(operand, foperand); - if (argnum != 100) { - if (argnum < 0) { - if (foperand.length < -argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } - else { - if (foperand.length != argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } - } - errortext = ffunc(fname, operand, foperand, sheet); - } - - else { - ttext = fname; - - if (operand.length && operand[operand.length-1].type == "start") { // no arguments - name or zero arg function - operand.pop(); - scf.PushOperand(operand, "name", ttext); - } - - else { - errortext = SocialCalc.Constants.s_sheetfuncunknownfunction+" " + ttext +". "; - } - } - - return errortext; - -} - -// -// SocialCalc.Formula.PushOperand(operand, t, v) -// -// Pushes the type and value onto the operand stack -// - -SocialCalc.Formula.PushOperand = function(operand, t, v) { - - operand.push({type: t, value: v}); - - } - -// -// SocialCalc.Formula.CopyFunctionArgs(operand, foperand) -// -// Pops operands from operand and pushes on foperand up to function start -// reversing order in the process. -// - -SocialCalc.Formula.CopyFunctionArgs = function(operand, foperand) { - - var fobj, foperand, ffunc, argnum; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = null; - - while (operand.length>0 && operand[operand.length-1].type != "start") { // get each arg - foperand.push(operand.pop()); // copy it - } - operand.pop(); // get rid of "start" - - return; - - } - -// -// errortext = SocialCalc.Formula.FunctionArgsError(fname, operand) -// -// Pushes appropriate error on operand stack and returns errortext, including fname -// - -SocialCalc.Formula.FunctionArgsError = function(fname, operand) { - - var errortext = SocialCalc.Constants.s_calcerrincorrectargstofunction+" " + fname + ". "; - SocialCalc.Formula.PushOperand(operand, "e#VALUE!", errortext); - - return errortext; - - } - - -// -// errortext = SocialCalc.Formula.FunctionSpecificError(fname, operand, errortype, errortext) -// -// Pushes specified error and text on operand stack. -// - -SocialCalc.Formula.FunctionSpecificError = function(fname, operand, errortype, errortext) { - - SocialCalc.Formula.PushOperand(operand, errortype, errortext); - - return errortext; - - } - -// -// haserror = SocialCalc.Formula.CheckForErrorValue(operand, v) -// -// If v.type is an error, push it on operand stack and return true, otherwise return false. -// - -SocialCalc.Formula.CheckForErrorValue = function(operand, v) { - - if (v.type.charAt(0) == "e") { - operand.push(v); - return true; - } - else { - return false; - } - - } - -///////////////////////// -// -// FUNCTION INFORMATION ROUTINES -// - -// -// SocialCalc.Formula.FillFunctionInfo() -// -// Goes through function definitions and fills out FunctionArgDefs and FunctionClasses. -// Execute this after any changes to SocialCalc.Constants but before UI is used. -// - -SocialCalc.Formula.FillFunctionInfo = function() { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var fname, f, classes, cname, i; - - if (scf.FunctionClasses) { // only do once - return; - } - - for (fname in scf.FunctionList) { - f = scf.FunctionList[fname]; - if (f[2]) { // has an arg def - scf.FunctionArgDefs[f[2]] = scc["s_farg_"+f[2]] || ""; // get it from constants - } - if (!f[3]) { // no text def, see if in constants - if (scc["s_fdef_"+fname]) { - scf.FunctionList[fname][3] = scc["s_fdef_"+fname]; - } - } - } - - scf.FunctionClasses = {}; - - for (i=0; i 0) { - str = "v1"; - for (i=2; i<=nargs; i++) { - str += ", v"+i; - } - return str; - } - else if (nargs < 0) { - str = "v1"; - for (i=2; i<-nargs; i++) { - str += ", v"+i; - } - return str+", ..."; - } - else { - return "nargs: "+nargs; - } - } - - str = scf.FunctionArgDefs[adef] || adef; - - return str; - - } - - -///////////////////////// -// -// FUNCTION DEFINITIONS -// -// The standard function definitions follow. -// -// Note that some need SocialCalc.DetermineValueType to be defined. -// - -/* -# -# AVERAGE(v1,c1:c2,...) -# COUNT(v1,c1:c2,...) -# COUNTA(v1,c1:c2,...) -# COUNTBLANK(v1,c1:c2,...) -# MAX(v1,c1:c2,...) -# MIN(v1,c1:c2,...) -# PRODUCT(v1,c1:c2,...) -# STDEV(v1,c1:c2,...) -# STDEVP(v1,c1:c2,...) -# SUM(v1,c1:c2,...) -# VAR(v1,c1:c2,...) -# VARP(v1,c1:c2,...) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the dseries_functions, too. -# -*/ - -SocialCalc.Formula.SeriesFunctions = function(fname, operand, foperand, sheet) { - - var value1, t, v1; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - while (foperand.length > 0) { - value1 = operand_value_and_type(sheet, foperand); - t = value1.type.charAt(0); - if (t == "n") count += 1; - if (t != "b") counta += 1; - if (t == "b") countblank += 1; - - if (t == "n") { - v1 = value1.value-0; // get it as a number - sum += v1; - product *= v1; - maxval = (maxval!=undefined) ? (v1 > maxval ? v1 : maxval) : v1; - minval = (minval!=undefined) ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } - else { // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type(value1.type, resulttypesum || value1.type, typelookupplus); - } - else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "SUM": - PushOperand(resulttypesum, sum); - break; - - case "PRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "MIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "MAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "COUNT": - PushOperand("n", count); - break; - - case "COUNTA": - PushOperand("n", counta); - break; - - case "COUNTBLANK": - PushOperand("n", countblank); - break; - - case "AVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum/count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - } - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["AVERAGE"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNT"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNTA"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNTBLANK"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["MAX"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["MIN"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["PRODUCT"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["STDEV"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["STDEVP"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["SUM"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["VAR"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["VARP"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; - -/* -# -# DAVERAGE(databaserange, fieldname, criteriarange) -# DCOUNT(databaserange, fieldname, criteriarange) -# DCOUNTA(databaserange, fieldname, criteriarange) -# DGET(databaserange, fieldname, criteriarange) -# DMAX(databaserange, fieldname, criteriarange) -# DMIN(databaserange, fieldname, criteriarange) -# DPRODUCT(databaserange, fieldname, criteriarange) -# DSTDEV(databaserange, fieldname, criteriarange) -# DSTDEVP(databaserange, fieldname, criteriarange) -# DSUM(databaserange, fieldname, criteriarange) -# DVAR(databaserange, fieldname, criteriarange) -# DVARP(databaserange, fieldname, criteriarange) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the series_functions, too. -# -*/ - -SocialCalc.Formula.DSeriesFunctions = function(fname, operand, foperand, sheet) { - - var value1, tostype, cr, dbrange, fieldname, criteriarange, dbinfo, criteriainfo; - var fieldasnum, targetcol, i, j, k, cell, criteriafieldnums; - var testok, criteriacr, criteria, testcol, testcr; - var t; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var value1 = {}; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - dbrange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - fieldname = scf.OperandValueAndType(sheet, foperand); // get a value - criteriarange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - - if (dbrange.type != "range" || criteriarange.type != "range") { - return scf.FunctionArgsError(fname, operand); - } - - dbinfo = scf.DecodeRangeParts(sheet, dbrange.value); - criteriainfo = scf.DecodeRangeParts(sheet, criteriarange.value); - - fieldasnum = scf.FieldToColnum(dbinfo.sheetdata, dbinfo.col1num, dbinfo.ncols, dbinfo.row1num, fieldname.value, fieldname.type); - if (fieldasnum <= 0) { - PushOperand("e#VALUE!", 0); - return; - } - - targetcol = dbinfo.col1num + fieldasnum - 1; - criteriafieldnums = []; - - for (i=0; i maxval ? v1 : maxval) : v1; - minval = (minval!=undefined) ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } - else { // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type(value1.type, resulttypesum || value1.type, typelookupplus); - } - else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "DSUM": - PushOperand(resulttypesum, sum); - break; - - case "DPRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "DMIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "DMAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "DCOUNT": - PushOperand("n", count); - break; - - case "DCOUNTA": - PushOperand("n", counta); - break; - - case "DAVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum/count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DGET": - if (count == 1) { - PushOperand(resulttypesum, sum); - } - else if (count == 0) { - PushOperand("e#VALUE!", 0); - } - else { - PushOperand("e#NUM!", 0); - } - break; - - } - - return; - - } - -SocialCalc.Formula.FunctionList["DAVERAGE"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DCOUNT"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DCOUNTA"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DGET"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DMAX"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DMIN"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DPRODUCT"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSTDEV"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSTDEVP"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSUM"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DVAR"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DVARP"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; - -/* -# -# colnum = SocialCalc.Formula.FieldToColnum(sheet, col1num, ncols, row1num, fieldname, fieldtype) -# -# If fieldname is a number, uses it, otherwise looks up string in cells in row to find field number -# -# If not found, returns 0. -# -*/ - -SocialCalc.Formula.FieldToColnum = function(sheet, col1num, ncols, row1num, fieldname, fieldtype) { - - var colnum, cell, value; - - if (fieldtype.charAt(0) == "n") { // number - return it if legal - colnum = fieldname - 0; // make sure a number - if (colnum <= 0 || colnum > ncols) { - return 0; - } - return Math.floor(colnum); - } - - if (fieldtype.charAt(0) != "t") { // must be text otherwise - return 0; - } - - fieldname = fieldname ? fieldname.toLowerCase() : ""; - - for (colnum=0; colnum < ncols; colnum++) { // look through column headers for a match - cell = sheet.GetAssuredCell(SocialCalc.crToCoord(col1num+colnum, row1num)); - value = cell.datavalue; - value = (value+"").toLowerCase(); // ignore case - if (value == fieldname) { // match - return colnum+1; - } - } - return 0; // looked at all and no match - - } - - -/* -# -# HLOOKUP(value, range, row, [rangelookup]) -# VLOOKUP(value, range, col, [rangelookup]) -# MATCH(value, range, [rangelookup]) -# -*/ - -SocialCalc.Formula.LookupFunctions = function(fname, operand, foperand, sheet) { - - var lookupvalue, range, offset, rangelookup, offsetvalue, rangeinfo; - var c, r, cincr, rincr, previousOK, csave, rsave, cell, value, valuetype, cr, lookupvalue; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - lookupvalue = operand_value_and_type(sheet, foperand); - if (typeof lookupvalue.value == "string") { - lookupvalue.value = lookupvalue.value.toLowerCase(); - } - - range = scf.TopOfStackValueAndType(sheet, foperand); - - rangelookup = 1; // default to true or 1 - if (fname == "MATCH") { - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value - 0; - } - } - else { - offsetvalue = scf.OperandAsNumber(sheet, foperand); - if (offsetvalue.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - offsetvalue = Math.floor(offsetvalue.value); - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value ? 1 : 0; // convert to 1 or 0 - } - } - lookupvalue.type = lookupvalue.type.charAt(0); // only deal with general type - if (lookupvalue.type == "n") { // if number, make sure a number - lookupvalue.value = lookupvalue.value - 0; - } - - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - rangeinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (!rangeinfo) { - PushOperand("e#REF!", 0); - return; - } - - c = 0; - r = 0; - cincr = 0; - rincr = 0; - if (fname == "HLOOKUP") { - cincr = 1; - if (offsetvalue > rangeinfo.nrows) { - PushOperand("e#REF!", 0); - return; - } - } - else if (fname == "VLOOKUP") { - rincr = 1; - if (offsetvalue > rangeinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - } - else if (fname == "MATCH") { - if (rangeinfo.ncols > 1) { - if (rangeinfo.nrows > 1) { - PushOperand("e#N/A", 0); - return; - } - cincr = 1; - } - else { - rincr = 1; - } - } - else { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (offsetvalue < 1 && fname != "MATCH") { - PushOperand("e#VALUE!", 0); - return 0; - } - - previousOK; // if 1, previous test was <. If 2, also this one wasn't - - while (1) { - cr = SocialCalc.crToCoord(rangeinfo.col1num + c, rangeinfo.row1num + r); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype ? cell.valuetype.charAt(0) : "b"; // only deal with general types - if (valuetype == "n") { - value = value - 0; // make sure number - } - if (rangelookup) { // rangelookup type 1 or -1: look for within brackets for matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { // match - break; - } - if ((rangelookup > 0 && lookupvalue.value > value) - || (rangelookup < 0 && lookupvalue.value < value)) { // possible match: wait and see - previousOK = 1; - csave = c; // remember col and row of last OK - rsave = r; - } - else if (previousOK) { // last one was OK, this one isn't - previousOK = 2; - break; - } - } - - else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { // match - break; - } - if ((rangelookup > 0 && lookupvalue.value > value) - || (rangelookup < 0 && lookupvalue.value < value)) { // possible match: wait and see - previousOK = 1; - csave = c; - rsave = r; - } - else if (previousOK) { // last one was OK, this one isn't - previousOK = 2; - break; - } - } - } - else { // exact value matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { // match - break; - } - } - else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { // match - break; - } - } - } - - r += rincr; - c += cincr; - if (r >= rangeinfo.nrows || c >= rangeinfo.ncols) { // end of range to check, no exact match - if (previousOK) { // at least one could have been OK - previousOK = 2; - break; - } - PushOperand("e#N/A", 0); - return; - } - } - - if (previousOK == 2) { // back to last OK - r = rsave; - c = csave; - } - - if (fname == "MATCH") { - value = c + r + 1; // only one may be <> 0 - valuetype = "n"; - } - else { - cr = SocialCalc.crToCoord(rangeinfo.col1num+c+(fname == "VLOOKUP" ? offsetvalue-1 : 0), rangeinfo.row1num+r+(fname == "HLOOKUP" ? offsetvalue-1 : 0)); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype; - } - PushOperand(valuetype, value); - - return; - - } - -SocialCalc.Formula.FunctionList["HLOOKUP"] = [SocialCalc.Formula.LookupFunctions, -3, "hlookup", "", "lookup"]; -SocialCalc.Formula.FunctionList["MATCH"] = [SocialCalc.Formula.LookupFunctions, -2, "match", "", "lookup"]; -SocialCalc.Formula.FunctionList["VLOOKUP"] = [SocialCalc.Formula.LookupFunctions, -3, "vlookup", "", "lookup"]; - -/* -# -# INDEX(range, rownum, colnum) -# -*/ - -SocialCalc.Formula.IndexFunction = function(fname, operand, foperand, sheet) { - - var range, sheetname, indexinfo, rowindex, colindex, result, resulttype; - - var scf = SocialCalc.Formula; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - indexinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (indexinfo.sheetname) { - sheetname = "!" + indexinfo.sheetname; - } - else { - sheetname = ""; - } - - rowindex = {value:0}; - colindex = {value:0}; - - if (foperand.length) { // look for row number - rowindex = scf.OperandAsNumber(sheet, foperand); - if (rowindex.type.charAt(0) != "n" || rowindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { // look for col number - colindex = scf.OperandAsNumber(sheet, foperand); - if (colindex.type.charAt(0) != "n" || colindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - } - else { // col number missing - if (indexinfo.nrows == 1) { // if only one row, then rowindex is really colindex - colindex.value = rowindex.value; - rowindex.value = 0; - } - } - } - - if (rowindex.value > indexinfo.nrows || colindex.value > indexinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - - if (rowindex.value == 0) { - if (colindex.value == 0) { - if (indexinfo.nrows == 1 && indexinfo.ncols == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+indexinfo.ncols-1, indexinfo.row1num+indexinfo.nrows-1) + - "|"; - resulttype = "range"; - } - } - else { - if (indexinfo.nrows == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num+indexinfo.nrows-1) + - "|"; - resulttype = "range"; - } - } - } - else { - if (colindex.value == 0) { - if (indexinfo.ncols == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num+rowindex.value-1) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num+rowindex.value-1) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+indexinfo.ncols-1, indexinfo.row1num+rowindex.value-1) + - "|"; - resulttype = "range"; - } - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num+rowindex.value-1) + sheetname; - resulttype = "coord"; - } - } - - PushOperand(resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["INDEX"] = [SocialCalc.Formula.IndexFunction, -1, "index", "", "lookup"]; - -/* -# -# COUNTIF(c1:c2,"criteria") -# SUMIF(c1:c2,"criteria",[range2]) -# -*/ - -SocialCalc.Formula.CountifSumifFunctions = function(fname, operand, foperand, sheet) { - - var range, criteria, sumrange, f2operand, result, resulttype, value1, value2; - var sum = 0; - var resulttypesum = ""; - var count = 0; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range or coord - criteria = scf.OperandAsText(sheet, foperand); // get criteria - if (fname == "SUMIF") { - if (foperand.length == 1) { // three arg form of SUMIF - sumrange = scf.TopOfStackValueAndType(sheet, foperand); - } - else if (foperand.length == 0) { // two arg form - sumrange = {value: range.value, type: range.type}; - } - else { - scf.FunctionArgsError(fname, operand); - return 0; - } - } - else { - sumrange = {value: range.value, type: range.type}; - } - - if (criteria.type.charAt(0) == "n") { - criteria.value = criteria.value + ""; // make text - } - else if (criteria.type.charAt(0) == "e") { // error - criteria.value = null; - } - else if (criteria.type.charAt(0) == "b") { // blank here is undefined - criteria.value = null; - } - - if (range.type != "coord" && range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - if (fname == "SUMIF" && sumrange.type != "coord" && sumrange.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - foperand.push(range); - f2operand = []; // to allow for 3 arg form - f2operand.push(sumrange); - - while (foperand.length) { - value1 = operand_value_and_type(sheet, foperand); - value2 = operand_value_and_type(sheet, f2operand); - - if (!scf.TestCriteria(value1.value, value1.type, criteria.value)) { - continue; - } - - count += 1; - - if (value2.type.charAt(0) == "n") { - sum += value2.value-0; - resulttypesum = lookup_result_type(value2.type, resulttypesum || value2.type, typelookupplus); - } - else if (value2.type.charAt(0) == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value2.type; - } - } - - resulttypesum = resulttypesum || "n"; - - if (fname == "SUMIF") { - PushOperand(resulttypesum, sum); - } - else if (fname == "COUNTIF") { - PushOperand("n", count); - } - - return; - - } - -SocialCalc.Formula.FunctionList["COUNTIF"] = [SocialCalc.Formula.CountifSumifFunctions, 2, "rangec", "", "stat"]; -SocialCalc.Formula.FunctionList["SUMIF"] = [SocialCalc.Formula.CountifSumifFunctions, -2, "sumif", "", "stat"]; - -/* -# -# IF(cond,truevalue,falsevalue) -# -*/ - -SocialCalc.Formula.IfFunction = function(fname, operand, foperand, sheet) { - - var cond, t; - - cond = SocialCalc.Formula.OperandValueAndType(sheet, foperand); - t = cond.type.charAt(0); - if (t != "n" && t != "b") { - operand.push({type: "e#VALUE!", value: 0}); - return; - } - - if (!cond.value) foperand.pop(); - operand.push(foperand.pop()); - if (cond.value) foperand.pop(); - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["IF"] = [SocialCalc.Formula.IfFunction, 3, "iffunc", "", "test"]; - -/* -# -# DATE(year,month,day) -# -*/ - -SocialCalc.Formula.DateFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var year = scf.OperandAsNumber(sheet, foperand); - var month = scf.OperandAsNumber(sheet, foperand); - var day = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(year.type, month.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, day.type, scf.TypeLookupTable.twoargnumeric); - if (resulttype.charAt(0) == "n") { - result = SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - Math.floor(year.value), Math.floor(month.value), Math.floor(day.value) - ) - SocialCalc.FormatNumber.datevalues.julian_offset; - resulttype = "nd"; - } - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["DATE"] = [SocialCalc.Formula.DateFunction, 3, "date", "", "datetime"]; - -/* -# -# TIME(hour,minute,second) -# -*/ - -SocialCalc.Formula.TimeFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var hours = scf.OperandAsNumber(sheet, foperand); - var minutes = scf.OperandAsNumber(sheet, foperand); - var seconds = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(hours.type, minutes.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, seconds.type, scf.TypeLookupTable.twoargnumeric); - if (resulttype.charAt(0) == "n") { - result = ((hours.value * 60 * 60) + (minutes.value * 60) + seconds.value) / (24*60*60); - resulttype = "nt"; - } - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["TIME"] = [SocialCalc.Formula.TimeFunction, 3, "hms", "", "datetime"]; - -/* -# -# DAY(date) -# MONTH(date) -# YEAR(date) -# WEEKDAY(date, [type]) -# -*/ - -SocialCalc.Formula.DMYFunctions = function(fname, operand, foperand, sheet) { - - var ymd, dtype, doffset; - var scf = SocialCalc.Formula; - var result = 0; - - var datevalue = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(datevalue.type, datevalue.type, scf.TypeLookupTable.oneargnumeric); - - if (resulttype.charAt(0) == "n") { - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian( - Math.floor(datevalue.value + SocialCalc.FormatNumber.datevalues.julian_offset)); - switch (fname) { - case "DAY": - result = ymd.day; - break; - - case "MONTH": - result = ymd.month; - break; - - case "YEAR": - result = ymd.year; - break; - - case "WEEKDAY": - dtype = {value: 1}; - if (foperand.length) { // get type if present - dtype = scf.OperandAsNumber(sheet, foperand); - if (dtype.type.charAt(0) != "n" || dtype.value < 1 || dtype.value > 3) { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { // extra args - scf.FunctionArgsError(fname, operand); - return; - } - } - doffset = 6; - if (dtype.value > 1) { - doffset -= 1; - } - result = Math.floor(datevalue.value+doffset) % 7 + (dtype.value < 3 ? 1 : 0); - break; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["DAY"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["MONTH"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["YEAR"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["WEEKDAY"] = [SocialCalc.Formula.DMYFunctions, -1, "weekday", "", "datetime"]; - -/* -# -# HOUR(datetime) -# MINUTE(datetime) -# SECOND(datetime) -# -*/ - -SocialCalc.Formula.HMSFunctions = function(fname, operand, foperand, sheet) { - - var hours, minutes, seconds, fraction; - var scf = SocialCalc.Formula; - var result = 0; - - var datetime = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(datetime.type, datetime.type, scf.TypeLookupTable.oneargnumeric); - - if (resulttype.charAt(0) == "n") { - if (datetime.value < 0) { - scf.PushOperand(operand, "e#NUM!", 0); // must be non-negative - return; - } - fraction = datetime.value - Math.floor(datetime.value); // fraction of a day - fraction *= 24; - hours = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - minutes = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - seconds = Math.floor(fraction + (datetime.value >= 0 ? 0.5: -0.5)); - if (fname == "HOUR") { - result = hours; - } - else if (fname == "MINUTE") { - result = minutes; - } - else if (fname == "SECOND") { - result = seconds; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["HOUR"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["MINUTE"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["SECOND"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; - -/* -# -# EXACT(v1,v2) -# -*/ - -SocialCalc.Formula.ExactFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value1 = scf.OperandValueAndType(sheet, foperand); - var v1type = value1.type.charAt(0); - var value2 = scf.OperandValueAndType(sheet, foperand); - var v2type = value2.type.charAt(0); - - if (v1type == "t") { - if (v2type == "t") { - result = value1.value == value2.value ? 1 : 0; - } - else if (v2type == "b") { - result = value1.value.length ? 0 : 1; - } - else if (v2type == "n") { - result = value1.value == value2.value+"" ? 1 : 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "n") { - if (v2type == "n") { - result = value1.value-0 == value2.value-0 ? 1 : 0; - } - else if (v2type == "b") { - result = 0; - } - else if (v2type == "t") { - result = value1.value+"" == value2.value ? 1 : 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "b") { - if (v2type == "t") { - result = value2.value.length ? 0 : 1; - } - else if (v2type == "b") { - result = 1; - } - else if (v2type == "n") { - result = 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "e") { - result = value1.value; - resulttype = value1.type; - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["EXACT"] = [SocialCalc.Formula.ExactFunction, 2, "", "", "text"]; - -/* -# -# FIND(key,string,[start]) -# LEFT(string,[length]) -# LEN(string) -# LOWER(string) -# MID(string,start,length) -# PROPER(string) -# REPLACE(string,start,length,new) -# REPT(string,count) -# RIGHT(string,[length]) -# SUBSTITUTE(string,old,new,[which]) -# TRIM(string) -# UPPER(string) -# -*/ - -// SocialCalc.Formula.ArgList has an array for each function, one entry for each possible arg (up to max). -// Min args are specified in SocialCalc.Formula.FunctionList. -// If array element is 1 then it's a text argument, if it's 0 then it's numeric, if -1 then just get whatever's there -// Text values are manipulated as UTF-8, converting from and back to byte strings - -SocialCalc.Formula.ArgList = { - FIND: [1, 1, 0], - LEFT: [1, 0], - LEN: [1], - LOWER: [1], - MID: [1, 0, 0], - PROPER: [1], - REPLACE: [1, 0, 0, 1], - REPT: [1, 0], - RIGHT: [1, 0], - SUBSTITUTE: [1, 1, 1, 0], - TRIM: [1], - UPPER: [1] - }; - -SocialCalc.Formula.StringFunctions = function(fname, operand, foperand, sheet) { - - var i, value, offset, len, start, count; - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var numargs = foperand.length; - var argdef = scf.ArgList[fname]; - var operand_value = []; - var operand_type = []; - - for (i=1; i <= numargs; i++) { // go through each arg, get value and type, and check for errors - if (i > argdef.length) { // too many args - scf.FunctionArgsError(fname, operand); - return; - } - if (argdef[i-1] == 0) { - value = scf.OperandAsNumber(sheet, foperand); - } - else if (argdef[i-1] == 1) { - value = scf.OperandAsText(sheet, foperand); - } - else if (argdef[i-1] == -1) { - value = scf.OperandValueAndType(sheet, foperand); - } - operand_value[i] = value.value; - operand_type[i] = value.type; - if (value.type.charAt(0) == "e") { - scf.PushOperand(operand, value.type, result); - return; - } - } - - switch (fname) { - case "FIND": - offset = operand_type[3] ? operand_value[3]-1 : 0; - if (offset < 0) { - result = "Start is before string"; // !! not displayed, no need to translate - } - else { - result = operand_value[2].indexOf(operand_value[1], offset); // (null string matches first char) - if (result >= 0) { - result += 1; - resulttype = "n"; - } - else { - result = "Not found"; // !! not displayed, error is e#VALUE! - } - } - break; - - case "LEFT": - len = operand_type[2] ? operand_value[2]-0 : 1; - if (len < 0) { - result = "Negative length"; - } - else { - result = operand_value[1].substring(0, len); - resulttype = "t"; - } - break; - - case "LEN": - result = operand_value[1].length; - resulttype = "n"; - break; - - case "LOWER": - result = operand_value[1].toLowerCase(); - resulttype = "t"; - break; - - case "MID": - start = operand_value[2]-0; - len = operand_value[3]-0; - if (len < 1 || start < 1) { - result = "Bad arguments"; - } - else { - result = operand_value[1].substring(start-1, start+len-1); - resulttype = "t"; - } - break; - - case "PROPER": - result = operand_value[1].replace(/\b\w+\b/g, function(word) { - return word.substring(0,1).toUpperCase() + - word.substring(1); - }); // uppercase first character of words (see JavaScript, Flanagan, 5th edition, page 704) - resulttype = "t"; - break; - - case "REPLACE": - start = operand_value[2]-0; - len = operand_value[3]-0; - if (len < 0 || start < 1) { - result = "Bad arguments"; - } - else { - result = operand_value[1].substring(0, start-1) + operand_value[4] + - operand_value[1].substring(start-1+len); - resulttype = "t"; - } - break; - - case "REPT": - count = operand_value[2]-0; - if (count < 0) { - result = "Negative count"; - } - else { - result = ""; - for (; count > 0; count--) { - result += operand_value[1]; - } - resulttype = "t"; - } - break; - - case "RIGHT": - len = operand_type[2] ? operand_value[2]-0 : 1; - if (len < 0) { - result = "Negative length"; - } - else { - result = operand_value[1].slice(-len); - resulttype = "t"; - } - break; - - case "SUBSTITUTE": - fulltext = operand_value[1]; - oldtext = operand_value[2]; - newtext = operand_value[3]; - if (operand_value[4] != null) { - which = operand_value[4]-0; - if (which <= 0) { - result = "Non-positive instance number"; - break; - } - } - else { - which = 0; - } - count = 0; - oldpos = 0; - result = ""; - while (true) { - pos = fulltext.indexOf(oldtext, oldpos); - if (pos >= 0) { - count++; //!!!!!! old test just in case: if (count>1000) {alert(pos); break;} - result += fulltext.substring(oldpos, pos); - if (which==0) { - result += newtext; // substitute - } - else if (which==count) { - result += newtext + fulltext.substring(pos+oldtext.length); - break; - } - else { - result += oldtext; // leave as was - } - oldpos = pos + oldtext.length; - } - else { // no more - result += fulltext.substring(oldpos); - break; - } - } - resulttype = "t"; - break; - - case "TRIM": - result = operand_value[1]; - result = result.replace(/^ */, ""); - result = result.replace(/ *$/, ""); - result = result.replace(/ +/g, " "); - resulttype = "t"; - break; - - case "UPPER": - result = operand_value[1].toUpperCase(); - resulttype = "t"; - break; - - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["FIND"] = [SocialCalc.Formula.StringFunctions, -2, "find", "", "text"]; -SocialCalc.Formula.FunctionList["LEFT"] = [SocialCalc.Formula.StringFunctions, -2, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["LEN"] = [SocialCalc.Formula.StringFunctions, 1, "txt", "", "text"]; -SocialCalc.Formula.FunctionList["LOWER"] = [SocialCalc.Formula.StringFunctions, 1, "txt", "", "text"]; -SocialCalc.Formula.FunctionList["MID"] = [SocialCalc.Formula.StringFunctions, 3, "mid", "", "text"]; -SocialCalc.Formula.FunctionList["PROPER"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["REPLACE"] = [SocialCalc.Formula.StringFunctions, 4, "replace", "", "text"]; -SocialCalc.Formula.FunctionList["REPT"] = [SocialCalc.Formula.StringFunctions, 2, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["RIGHT"] = [SocialCalc.Formula.StringFunctions, -1, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["SUBSTITUTE"] = [SocialCalc.Formula.StringFunctions, -3, "subs", "", "text"]; -SocialCalc.Formula.FunctionList["TRIM"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["UPPER"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; - -/* -# -# is_functions: -# -# ISBLANK(value) -# ISERR(value) -# ISERROR(value) -# ISLOGICAL(value) -# ISNA(value) -# ISNONTEXT(value) -# ISNUMBER(value) -# ISTEXT(value) -# -*/ - -SocialCalc.Formula.IsFunctions = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - - case "ISBLANK": - result = value.type == "b" ? 1 : 0; - break; - - case "ISERR": - result = t == "e" ? (value.type == "e#N/A" ? 0 : 1) : 0; - break; - - case "ISERROR": - result = t == "e" ? 1 : 0; - break; - - case "ISLOGICAL": - result = value.type == "nl" ? 1 : 0; - break; - - case "ISNA": - result = value.type == "e#N/A" ? 1 : 0; - break; - - case "ISNONTEXT": - result = t == "t" ? 0 : 1; - break; - - case "ISNUMBER": - result = t == "n" ? 1 : 0; - break; - - case "ISTEXT": - result = t == "t" ? 1 : 0; - break; - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["ISBLANK"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISERR"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISERROR"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISLOGICAL"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNA"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNONTEXT"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNUMBER"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISTEXT"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; - -/* -# -# ntv_functions: -# -# N(value) -# T(value) -# VALUE(value) -# -*/ - -SocialCalc.Formula.NTVFunctions = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - - case "N": - result = t == "n" ? value.value-0 : 0; - resulttype = "n"; - break; - - case "T": - result = t == "t" ? value.value+"" : ""; - resulttype = "t"; - break; - - case "VALUE": - if (t == "n" || t == "b") { - result = value.value || 0; - resulttype = "n"; - } - else if (t == "t") { - value = SocialCalc.DetermineValueType(value.value); - if (value.type.charAt(0) != "n") { - result = 0; - resulttype = "e#VALUE!"; - } - else { - result = value.value-0; - resulttype = "n"; - } - } - break; - } - - if (t == "e") { // error trumps - resulttype = value.type; - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["N"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["T"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["VALUE"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "text"]; - -/* -# -# ABS(value) -# ACOS(value) -# ASIN(value) -# ATAN(value) -# COS(value) -# DEGREES(value) -# EVEN(value) -# EXP(value) -# FACT(value) -# INT(value) -# LN(value) -# LOG10(value) -# ODD(value) -# RADIANS(value) -# SIN(value) -# SQRT(value) -# TAN(value) -# -*/ - -SocialCalc.Formula.Math1Functions = function(fname, operand, foperand, sheet) { - - var v1, value, f; - var result = {}; - - var scf = SocialCalc.Formula; - - v1 = scf.OperandAsNumber(sheet, foperand); - value = v1.value; - result.type = scf.LookupResultType(v1.type, v1.type, scf.TypeLookupTable.oneargnumeric); - - if (result.type == "n") { - switch (fname) { - case "ABS": - value = Math.abs(value); - break; - - case "ACOS": - if (value >= -1 && value <= 1) { - value = Math.acos(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "ASIN": - if (value >= -1 && value <= 1) { - value = Math.asin(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "ATAN": - value = Math.atan(value); - break; - - case "COS": - value = Math.cos(value); - break; - - case "DEGREES": - value = value * 180/Math.PI; - break; - - case "EVEN": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (Math.floor(value + 1) % 2); - } - else { // integer - value = value + (value % 2); - } - if (v1.value < 0) value = -value; - break; - - case "EXP": - value = Math.exp(value); - break; - - case "FACT": - f = 1; - value = Math.floor(value); - for (;value>0;value--) { - f *= value; - } - value = f; - break; - - case "INT": - value = Math.floor(value); // spreadsheet INT is floor(), not int() - break; - - case "LN": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclnarg; - } - value = Math.log(value); - break; - - case "LOG10": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclog10arg; - } - value = Math.log(value)/Math.log(10); - break; - - case "ODD": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (1 - (Math.floor(value + 1) % 2)); - } - else { // integer - value = value + (1 - (value % 2)); - } - if (v1.value < 0) value = -value; - break; - - case "RADIANS": - value = value * Math.PI/180; - break; - - case "SIN": - value = Math.sin(value); - break; - - case "SQRT": - if (value >= 0) { - value = Math.sqrt(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "TAN": - if (Math.cos(value) != 0) { - value = Math.tan(value); - } - else { - result.type = "e#NUM!"; - } - break; - } - } - - result.value = value; - operand.push(result); - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["ABS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ACOS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ASIN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ATAN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["COS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["DEGREES"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["EVEN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["EXP"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["FACT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["INT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["LN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["LOG10"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ODD"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["RADIANS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["SIN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["SQRT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["TAN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; - - -/* -# -# ATAN2(x, y) -# MOD(a, b) -# POWER(a, b) -# TRUNC(value, precision) -# -*/ - -SocialCalc.Formula.Math2Functions = function(fname, operand, foperand, sheet) { - - var xval, yval, value, quotient, decimalscale, i; - var result = {}; - - var scf = SocialCalc.Formula; - - xval = scf.OperandAsNumber(sheet, foperand); - yval = scf.OperandAsNumber(sheet, foperand); - value = 0; - result.type = scf.LookupResultType(xval.type, yval.type, scf.TypeLookupTable.twoargnumeric); - - if (result.type == "n") { - switch (fname) { - case "ATAN2": - if (xval.value == 0 && yval.value == 0) { - result.type = "e#DIV/0!"; - } - else { - result.value = Math.atan2(yval.value, xval.value); - } - break; - - case "POWER": - result.value = Math.pow(xval.value, yval.value); - if (isNaN(result.value)) { - result.value = 0; - result.type = "e#NUM!"; - } - break; - - case "MOD": // en.wikipedia.org/wiki/Modulo_operation, etc. - if (yval.value == 0) { - result.type = "e#DIV/0!"; - } - else { - quotient = xval.value/yval.value; - quotient = Math.floor(quotient); - result.value = xval.value - (quotient * yval.value); - } - break; - - case "TRUNC": - decimalscale = 1; // cut down to required number of decimal digits - if (yval.value >= 0) { - yval.value = Math.floor(yval.value); - for (i=0; i 0) { - decimalscale = 1; // cut down to required number of decimal digits - value2.value = Math.floor(value2.value); - for (i=0; i 0 ) { - method = scf.OperandAsNumber(sheet, foperand); - } - if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (scf.CheckForErrorValue(operand, method)) return; - - depreciation = 0; // calculated for each period - accumulateddepreciation = 0; // accumulated by adding each period's - - for (i=1; i<=period.value-0 && i<=lifetime.value; i++) { // calculate for each period based on net from previous - depreciation = (cost.value - accumulateddepreciation) * (method.value / lifetime.value); - if (cost.value - accumulateddepreciation - depreciation < salvage.value) { // don't go lower than salvage value - depreciation = cost.value - accumulateddepreciation - salvage.value; - } - accumulateddepreciation += depreciation; - } - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["DDB"] = [SocialCalc.Formula.DDBFunction, -4, "ddb", "", "financial"]; - -/* -# -# SLN(cost,salvage,lifetime) -# -# Depreciation for each period by straight-line method -# See: http://en.wikipedia.org/wiki/Depreciation -# -*/ - -SocialCalc.Formula.SLNFunction = function(fname, operand, foperand, sheet) { - - var depreciation; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - - if (lifetime.value < 1) { - scf.FunctionSpecificError(fname, operand, "e#NUM!", SocialCalc.Constants.s_sheetfuncslnlife); - return 0; - } - - depreciation = (cost.value - salvage.value) / lifetime.value; - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["SLN"] = [SocialCalc.Formula.SLNFunction, 3, "csl", "", "financial"]; - -/* -# -# SYD(cost,salvage,lifetime,period) -# -# Depreciation by Sum of Year's Digits method -# -*/ - -SocialCalc.Formula.SYDFunction = function(fname, operand, foperand, sheet) { - - var depreciation, sumperiods; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - var period = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - if (scf.CheckForErrorValue(operand, period)) return; - - if (lifetime.value < 1 || period.value <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return 0; - } - - sumperiods = ((lifetime.value + 1) * lifetime.value)/2; // add up 1 through lifetime - depreciation = (cost.value - salvage.value) * (lifetime.value - period.value + 1) / sumperiods; // calc depreciation - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["SYD"] = [SocialCalc.Formula.SYDFunction, 4, "cslp", "", "financial"]; - -/* -# -# FV(rate, n, payment, [pv, [paytype]]) -# NPER(rate, payment, pv, [fv, [paytype]]) -# PMT(rate, n, pv, [fv, [paytype]]) -# PV(rate, n, payment, [fv, [paytype]]) -# RATE(n, payment, pv, [fv, [paytype, [guess]]]) -# -# Following the Open Document Format formula specification: -# -# PV = - Fv - (Payment * Nper) [if rate equals 0] -# Pv*(1+Rate)^Nper + Payment * (1 + Rate*PaymentType) * ( (1+Rate)^nper -1)/Rate + Fv = 0 -# -# For each function, the formulas are solved for the appropriate value (transformed using -# basic algebra). -# -*/ - -SocialCalc.Formula.InterestFunctions = function(fname, operand, foperand, sheet) { - - var resulttype, result, dval, eval, fval; - var pv, fv, rate, n, payment, paytype, guess, part1, part2, part3, part4, part5; - var olddelta, maxloop, tries, deltaepsilon, rate, oldrate, m; - - var scf = SocialCalc.Formula; - - var aval = scf.OperandAsNumber(sheet, foperand); - var bval = scf.OperandAsNumber(sheet, foperand); - var cval = scf.OperandAsNumber(sheet, foperand); - - resulttype = scf.LookupResultType(aval.type, bval.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, cval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - dval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, dval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - eval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, eval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - if (fname != "RATE") { // only rate has 6 possible args - scf.FunctionArgsError(fname, operand); - return 0; - } - fval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, fval.type, scf.TypeLookupTable.twoargnumeric); - } - } - } - - if (resulttype == "n") { - switch (fname) { - case "FV": // FV(rate, n, payment, [pv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - pv = dval!=null ? dval.value : 0; // get value if present, or use default - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == 0) { // simple calculation if no interest - fv = -pv - (payment * n); - } - else { - fv = -(pv*Math.pow(1+rate,n) + payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate); - } - result = fv; - resulttype = 'n$'; - break; - - case "NPER": // NPER(rate, payment, pv, [fv, [paytype]]) - rate = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == 0) { // simple calculation if no interest - if (payment == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - n = (pv + fv)/(-payment); - } - else { - part1 = payment * (1 + rate * paytype) / rate; - part2 = pv + part1; - if (part2 == 0 || rate <= -1) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part3 = (part1 - fv) / part2; - if (part3 <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part4 = Math.log(part3); - part5 = Math.log(1 + rate); // rate > -1 - n = part4/part5; - } - result = n; - resulttype = 'n'; - break; - - case "PMT": // PMT(rate, n, pv, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (n == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - else if (rate == 0) { // simple calculation if no interest - payment = (fv - pv)/n; - } - else { - payment = (0 - fv - pv*Math.pow(1+rate,n))/((1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate); - } - result = payment; - resulttype = 'n$'; - break; - - case "PV": // PV(rate, n, payment, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == -1) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - else if (rate == 0) { // simple calculation if no interest - pv = -fv - (payment * n); - } - else { - pv = (-fv - payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate)/(Math.pow(1+rate,n)); - } - result = pv; - resulttype = 'n$'; - break; - - case "RATE": // RATE(n, payment, pv, [fv, [paytype, [guess]]]) - n = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - guess = fval!=null ? fval.value : 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 100; - tries = 0; - delta = 1; - epsilon = 0.0000001; // this is close enough - rate = guess || 0.00000001; // zero is not allowed - while ((delta >= 0 ? delta : -delta) > epsilon && (rate != oldrate)) { - delta = fv + pv*Math.pow(1+rate,n) + payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate; - if (olddelta!=null) { - m = (delta - olddelta)/(rate - oldrate) || .001; // get slope (not zero) - oldrate = rate; - rate = rate - delta / m; // look for zero crossing - olddelta = delta; - } - else { // first time - no old values - oldrate = rate; - rate = 1.1 * rate; - olddelta = delta; - } - tries++; - if (tries >= maxloop) { // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - result = rate; - resulttype = 'n%'; - break; - } - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["FV"] = [SocialCalc.Formula.InterestFunctions, -3, "fv", "", "financial"]; -SocialCalc.Formula.FunctionList["NPER"] = [SocialCalc.Formula.InterestFunctions, -3, "nper", "", "financial"]; -SocialCalc.Formula.FunctionList["PMT"] = [SocialCalc.Formula.InterestFunctions, -3, "pmt", "", "financial"]; -SocialCalc.Formula.FunctionList["PV"] = [SocialCalc.Formula.InterestFunctions, -3, "pv", "", "financial"]; -SocialCalc.Formula.FunctionList["RATE"] = [SocialCalc.Formula.InterestFunctions, -3, "rate", "", "financial"]; - -/* -# -# NPV(rate,v1,v2,c1:c2,...) -# -*/ - -SocialCalc.Formula.NPVFunction = function(fname, operand, foperand, sheet) { - - var resulttypenpv, rate, sum, factor, value1; - - var scf = SocialCalc.Formula; - - var rate = scf.OperandAsNumber(sheet, foperand); - if (scf.CheckForErrorValue(operand, rate)) return; - - sum = 0; - resulttypenpv = "n"; - factor = 1; - - while (foperand.length) { - value1 = scf.OperandValueAndType(sheet, foperand); - if (value1.type.charAt(0) == "n") { - factor *= (1 + rate.value); - if (factor == 0) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - sum += value1.value / factor; - resulttypenpv = scf.LookupResultType(value1.type, resulttypenpv || value1.type, scf.TypeLookupTable.plus); - } - else if (value1.type.charAt(0) == "e" && resulttypenpv.charAt(0) != "e") { - resulttypenpv = value1.type; - break; - } - } - - if (resulttypenpv.charAt(0) == "n") { - resulttypenpv = 'n$'; - } - - scf.PushOperand(operand, resulttypenpv, sum); - - return; - - } - -SocialCalc.Formula.FunctionList["NPV"] = [SocialCalc.Formula.NPVFunction, -2, "npv", "", "financial"]; - -/* -# -# IRR(c1:c2,[guess]) -# -*/ - -SocialCalc.Formula.IRRFunction = function(fname, operand, foperand, sheet) { - - var value1, guess, oldsum, maxloop, tries, epsilon, rate, oldrate, m, sum, factor, i; - var rangeoperand = []; - var cashflows = []; - - var scf = SocialCalc.Formula; - - rangeoperand.push(foperand.pop()); // first operand is a range - - while (rangeoperand.length) { // get values from range so we can do iterative approximations - value1 = scf.OperandValueAndType(sheet, rangeoperand); - if (value1.type.charAt(0) == "n") { - cashflows.push(value1.value); - } - else if (value1.type.charAt(0) == "e") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - } - - if (!cashflows.length) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - - guess = {value: 0}; - - if (foperand.length) { // guess is provided - guess = scf.OperandAsNumber(sheet, foperand); - if (guess.type.charAt(0) != "n" && guess.type.charAt(0) != "b") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { // should be no more args - scf.FunctionArgsError(fname, operand); - return; - } - } - - guess.value = guess.value || 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 20; - tries = 0; - epsilon = 0.0000001; // this is close enough - rate = guess.value; - sum = 1; - - while ((sum >= 0 ? sum : -sum) > epsilon && (rate != oldrate)) { - sum = 0; - factor = 1; - for (i=0; i= maxloop) { // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - - scf.PushOperand(operand, 'n%', rate); - - return; - - } - -SocialCalc.Formula.FunctionList["IRR"] = [SocialCalc.Formula.IRRFunction, -1, "irr", "", "financial"]; - -// -// SHEET CACHE -// - -SocialCalc.Formula.SheetCache = { - - // Sheet data: Attributes are each sheet in the cache with values of an object with: - // - // sheet: sheet-obj (or null, meaning not found) - // recalcstate: constants.asloaded = as loaded - // constants.recalcing = being recalced now - // constants.recalcdone = recalc done - // name: name of sheet (in case just have object and don't know name) - // - - sheets: {}, - - // Waiting for loading: - // If sheet is not in cache, this is set to the sheetname being loaded - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForLoading: null, - - // Constants to use for setting sheets[*].recalcstate: - - constants: {asloaded: 0, recalcing: 1, recalcdone: 2}, - - loadsheet: null // (deprecated - use SocialCalc.RecalcInfo.LoadSheet) - - }; - -// -// othersheet = SocialCalc.Formula.FindInSheetCache(sheetname) -// -// Returns a SocialCalc.Sheet object corresponding to string sheetname -// or null if the sheet is not available or in error. -// -// Each sheet is loaded only once and then stored in a cache. -// Loading is handled elsewhere, e.g., in the recalc loop. -// - -SocialCalc.Formula.FindInSheetCache = function(sheetname) { - - var str; - var sfsc = SocialCalc.Formula.SheetCache; - - var nsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); // normalize different versions - - if (sfsc.sheets[nsheetname]) { // a sheet by that name is in the cache already - return sfsc.sheets[nsheetname].sheet; // return it - } - - if (sfsc.waitingForLoading) { // waiting already - only queue up one - return null; // return not found - } - - sfsc.waitingForLoading = nsheetname; // let recalc loop know that we have a sheet to load - - return null; // return not found - - } - -// -// newsheet = SocialCalc.Formula.AddSheetToCache(sheetname, str) -// -// Adds a new sheet to the sheet cache. -// Returns the sheet object filled out with the str (a saved sheet). -// - -SocialCalc.Formula.AddSheetToCache = function(sheetname, str) { - - var newsheet = null; - var sfsc = SocialCalc.Formula.SheetCache; - var sfscc = sfsc.constants; - var newsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); - - if (str) { - newsheet = new SocialCalc.Sheet(); - newsheet.ParseSheetSave(str); - } - - sfsc.sheets[newsheetname] = {sheet: newsheet, recalcstate: sfscc.asloaded, name: newsheetname}; - - SocialCalc.Formula.FreshnessInfo.sheets[newsheetname] = true; - - return newsheet; - - } - -// -// nsheet = SocialCalc.Formula.NormalizeSheetName(sheetname) -// - -SocialCalc.Formula.NormalizeSheetName = function(sheetname) { - - if (SocialCalc.Callbacks.NormalizeSheetName) { - return SocialCalc.Callbacks.NormalizeSheetName(sheetname); - } - else { - return sheetname.toLowerCase(); - } - } - -// -// REMOTE FUNCTION INFO -// - -SocialCalc.Formula.RemoteFunctionInfo = { - - // Waiting for server: - // If waiting for an XHR response from the server, this is set to some non-blank status text - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForServer: null - - }; - -// -// FRESHNESS INFO -// -// This information is generated during recalc. -// It may be used to help determine when the recalc data in a spreadsheet -// may be out of date. -// For example, it may be used to display a message like: -// "Dependent on sheet 'FOO' which was updated more recently than this printout" - -SocialCalc.Formula.FreshnessInfo = { - - // For each external sheet referenced successfully an attribute of that name with value true. - - sheets: {}, - - // For each volatile function that is called an attribute of that name with value true. - - volatile: {}, - - // Set to false when started and true when recalc completes - - recalc_completed: false - - }; - -SocialCalc.Formula.FreshnessInfoReset = function() { - - var scffi = SocialCalc.Formula.FreshnessInfo; - - scffi.sheets = {}; - scffi.volatile = {}; - scffi.recalc_completed = false; - - } - -// -// MISC ROUTINES -// - -// -// result = SocialCalc.Formula.PlainCoord(coord) -// -// Returns: coord without any $'s -// - -SocialCalc.Formula.PlainCoord = function(coord) { - - if (coord.indexOf("$") == -1) return coord; - - return coord.replace(/\$/g, ""); // remove any $'s - - } - -// -// result = SocialCalc.Formula.OrderRangeParts(coord1, coord2) -// -// Returns: {c1: col, r1: row, c2: col, r2 = row} with c1/r1 upper left -// - -SocialCalc.Formula.OrderRangeParts = function(coord1, coord2) { - - var cr1, cr2; - var result = {}; - - cr1 = SocialCalc.coordToCr(coord1); - cr2 = SocialCalc.coordToCr(coord2); - if (cr1.col > cr2.col) { result.c1 = cr2.col; result.c2 = cr1.col; } - else { result.c1 = cr1.col; result.c2 = cr2.col; } - if (cr1.row > cr2.row) { result.r1 = cr2.row; result.r2 = cr1.row; } - else { result.r1 = cr1.row; result.r2 = cr2.row; } - - return result; - - } - -// -// cond = SocialCalc.Formula.TestCriteria(value, type, criteria) -// -// Determines whether a value/type meets the criteria. -// A criteria can be a numeric value, text beginning with <, <=, =, >=, >, <>, text by itself is start of text to match. -// Used by a variety of functions, including the "D" functions (DSUM, etc.). -// -// Returns true or false -// - -SocialCalc.Formula.TestCriteria = function(value, type, criteria) { - - var comparitor, basestring, basevalue, cond, testvalue; - - if (criteria == null) { // undefined (e.g., error value) is always false - return false; - } - - criteria = criteria + ""; - comparitor = criteria.charAt(0); // look for comparitor - if (comparitor == "=" || comparitor == "<" || comparitor == ">") { - basestring = criteria.substring(1); - } - else { - comparitor = criteria.substring(0,2); - if (comparitor == "<=" || comparitor == "<>" || comparitor == ">=") { - basestring = criteria.substring(2); - } - else { - comparitor = "none"; - basestring = criteria; - } - } - - basevalue = SocialCalc.DetermineValueType(basestring); // get type of value being compared - if (!basevalue.type) { // no criteria base value given - if (comparitor == "none") { // blank criteria matches nothing - return false; - } - if (type.charAt(0) == "b") { // comparing to empty cell - if (comparitor == "=") { // empty equals empty - return true; - } - } - else { - if (comparitor == "<>") { // "something" does not equal empty - return true; - } - } - return false; // otherwise false - } - - cond = false; - - if (basevalue.type.charAt(0) == "n" && type.charAt(0) == "t") { // criteria is number, but value is text - testvalue = SocialCalc.DetermineValueType(value); - if (testvalue.type.charAt(0) == "n") { // could be number - make it one - value = testvalue.value; - type = testvalue.type; - } - } - - if (type.charAt(0) == "n" && basevalue.type.charAt(0) == "n") { // compare two numbers - value = value - 0; // make sure numbers - basevalue.value = basevalue.value - 0; - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - case "none": - cond = value == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } - - else if (type.charAt(0) == "e") { // error on left - cond = false; - } - - else if (basevalue.type.charAt(0) == "e") { // error on right - cond = false; - } - - else { // text, maybe mixed with number or blank - if (type.charAt(0) == "n") { - value = SocialCalc.format_number_for_display(value, "n", ""); - } - if (basevalue.type.charAt(0) == "n") { - return false; // if number and didn't match already, isn't a match - } - - value = value ? value.toLowerCase() : ""; - basevalue.value = basevalue.value ? basevalue.value.toLowerCase() : ""; - - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - cond = value == basevalue.value; - break; - - case "none": - cond = value.substring(0, basevalue.value.length) == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } - - return cond; - - } - diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/delete.png b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/delete.png deleted file mode 100644 index 903b660..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/delete.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/delete24.png b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/delete24.png deleted file mode 100644 index 2010ee8..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/delete24.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/14_128x128.png b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/14_128x128.png deleted file mode 100644 index 981e2a6..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/14_128x128.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/20_128x128.png b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/20_128x128.png deleted file mode 100644 index 37262a2..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/20_128x128.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/23_128x128.png b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/23_128x128.png deleted file mode 100644 index ddf28f0..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/23_128x128.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/cash-register-icon.png b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/cash-register-icon.png deleted file mode 100644 index 91f2239..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/cash-register-icon.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/spreadsheet-icon.png b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/spreadsheet-icon.png deleted file mode 100644 index 38a7392..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/icons/spreadsheet-icon.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-1x1.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-1x1.gif deleted file mode 100644 index 1d9a4f5..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-1x1.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-add-2.png b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-add-2.png deleted file mode 100644 index 3cd3b73..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-add-2.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-aligncenter.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-aligncenter.gif deleted file mode 100644 index 81fae2a..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-aligncenter.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-alignleft.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-alignleft.gif deleted file mode 100644 index 0f3fea7..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-alignleft.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-alignright.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-alignright.gif deleted file mode 100644 index c89e242..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-alignright.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-bordersoff.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-bordersoff.gif deleted file mode 100644 index ffad4a2..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-bordersoff.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-borderson.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-borderson.gif deleted file mode 100644 index 0224acc..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-borderson.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-chooserarrow.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-chooserarrow.gif deleted file mode 100644 index b9010e2..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-chooserarrow.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-commentbg.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-commentbg.gif deleted file mode 100644 index 0b5e17a..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-commentbg.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-copy.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-copy.gif deleted file mode 100644 index 4ed54d0..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-copy.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-cursorinsertleft.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-cursorinsertleft.gif deleted file mode 100644 index 03e9769..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-cursorinsertleft.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-cursorinsertup.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-cursorinsertup.gif deleted file mode 100644 index 03e9769..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-cursorinsertup.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-cut.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-cut.gif deleted file mode 100644 index cb906cc..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-cut.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-defaultcolor.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-defaultcolor.gif deleted file mode 100644 index e9d69cd..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-defaultcolor.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-delete.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-delete.gif deleted file mode 100644 index b8d18a7..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-delete.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-deletecol.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-deletecol.gif deleted file mode 100644 index 0242f70..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-deletecol.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-deleterow.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-deleterow.gif deleted file mode 100644 index 0ff543e..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-deleterow.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-divider1.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-divider1.gif deleted file mode 100644 index 2f3ac5b..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-divider1.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-drag-handles.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-drag-handles.gif deleted file mode 100644 index e2ffef1..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-drag-handles.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-drag-handles.png b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-drag-handles.png deleted file mode 100644 index b57b5a2..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-drag-handles.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-endcap-h.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-endcap-h.gif deleted file mode 100644 index 900afd6..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-endcap-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-endcap-v.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-endcap-v.gif deleted file mode 100644 index 3e6ba4f..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-endcap-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-filldown.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-filldown.gif deleted file mode 100644 index a0d6cba..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-filldown.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-fillright.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-fillright.gif deleted file mode 100644 index 5169a72..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-fillright.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-formuladialog.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-formuladialog.gif deleted file mode 100644 index 404f991..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-formuladialog.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-insertcol.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-insertcol.gif deleted file mode 100644 index 8be72e8..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-insertcol.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-insertrow.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-insertrow.gif deleted file mode 100644 index 28ab390..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-insertrow.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-hd.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-hd.gif deleted file mode 100644 index 689ebc9..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-hd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-hh.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-hh.gif deleted file mode 100644 index f1d978e..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-hh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-hn.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-hn.gif deleted file mode 100644 index 81245b8..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-hn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-vd.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-vd.gif deleted file mode 100644 index 605801f..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-vd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-vh.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-vh.gif deleted file mode 100644 index aa2de92..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-vh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-vn.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-vn.gif deleted file mode 100644 index 88290ef..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-less-vn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-linkdialog.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-linkdialog.gif deleted file mode 100644 index d206394..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-linkdialog.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-linkout.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-linkout.gif deleted file mode 100644 index 9215def..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-linkout.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-logo.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-logo.gif deleted file mode 100644 index b76d534..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-logo.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-main-h.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-main-h.gif deleted file mode 100644 index 0b260ed..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-main-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-main-v.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-main-v.gif deleted file mode 100644 index 0fb12bb..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-main-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-menu-dropdown.png b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-menu-dropdown.png deleted file mode 100644 index 938cee8..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-menu-dropdown.png and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-merge.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-merge.gif deleted file mode 100644 index 666b597..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-merge.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-hd.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-hd.gif deleted file mode 100644 index 2eb56e0..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-hd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-hh.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-hh.gif deleted file mode 100644 index fc1059a..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-hh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-hn.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-hn.gif deleted file mode 100644 index 7e07204..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-hn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-vd.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-vd.gif deleted file mode 100644 index 055f4ac..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-vd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-vh.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-vh.gif deleted file mode 100644 index 07acdf7..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-vh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-vn.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-vn.gif deleted file mode 100644 index 922756d..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-more-vn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-movefrom.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-movefrom.gif deleted file mode 100644 index 7f665eb..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-movefrom.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-movefromoff.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-movefromoff.gif deleted file mode 100644 index 1760f02..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-movefromoff.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-moveinsert.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-moveinsert.gif deleted file mode 100644 index f082171..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-moveinsert.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-moveinsertoff.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-moveinsertoff.gif deleted file mode 100644 index cbb4f30..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-moveinsertoff.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-movepaste.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-movepaste.gif deleted file mode 100644 index 93108d1..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-movepaste.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-movepasteoff.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-movepasteoff.gif deleted file mode 100644 index 254c572..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-movepasteoff.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-multilinedialog.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-multilinedialog.gif deleted file mode 100644 index 1e0d6d6..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-multilinedialog.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-paneslider-h.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-paneslider-h.gif deleted file mode 100644 index 8cb31d4..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-paneslider-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-paneslider-v.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-paneslider-v.gif deleted file mode 100644 index c4bcaee..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-paneslider-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-paste.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-paste.gif deleted file mode 100644 index e39f06c..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-paste.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-pasteformats.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-pasteformats.gif deleted file mode 100644 index 94b2f50..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-pasteformats.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-peerbg.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-peerbg.gif deleted file mode 100644 index bef9c21..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-peerbg.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-range2.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-range2.gif deleted file mode 100644 index e9d69cd..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-range2.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-recalc.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-recalc.gif deleted file mode 100644 index 6e1ebb8..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-recalc.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-redo.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-redo.gif deleted file mode 100644 index b14aca8..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-redo.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-scrollarea-h.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-scrollarea-h.gif deleted file mode 100644 index c12715b..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-scrollarea-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-scrollarea-v.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-scrollarea-v.gif deleted file mode 100644 index df99311..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-scrollarea-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-sumdialog.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-sumdialog.gif deleted file mode 100644 index f6bb9ad..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-sumdialog.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-swapcolors.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-swapcolors.gif deleted file mode 100644 index 49c6e80..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-swapcolors.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-hd.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-hd.gif deleted file mode 100644 index e3afbd2..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-hd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-hh.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-hh.gif deleted file mode 100644 index 47237c2..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-hh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-hn.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-hn.gif deleted file mode 100644 index a8e0f08..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-hn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-vd.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-vd.gif deleted file mode 100644 index c900734..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-vd.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-vh.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-vh.gif deleted file mode 100644 index a3229c7..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-vh.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-vn.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-vn.gif deleted file mode 100644 index d528f43..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-thumb-vn.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-trackingline-h.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-trackingline-h.gif deleted file mode 100644 index efeff83..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-trackingline-h.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-trackingline-v.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-trackingline-v.gif deleted file mode 100644 index ce6e8cb..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-trackingline-v.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-undo.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-undo.gif deleted file mode 100644 index 66a07f8..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-undo.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-unmerge.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-unmerge.gif deleted file mode 100644 index 7e0df32..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-unmerge.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-wikiflag.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-wikiflag.gif deleted file mode 100644 index caf0e3f..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-wikiflag.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-wikilinkflag.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-wikilinkflag.gif deleted file mode 100644 index 5ed3700..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/sc-wikilinkflag.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/spinner.gif b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/spinner.gif deleted file mode 100644 index cc70a7a..0000000 Binary files a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/images/spinner.gif and /dev/null differ diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/json2.js b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/json2.js deleted file mode 100644 index 6bdea10..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/json2.js +++ /dev/null @@ -1,482 +0,0 @@ -/* - http://www.JSON.org/json2.js - 2010-08-25 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date ? - 'Date(' + this[key] + ')' : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - -/*jslint evil: true, strict: false */ - -/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, - call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - -// Create a JSON object only if one does not already exist. We create the -// methods in a closure to avoid creating global variables. - -if (!this.JSON) { - this.JSON = {}; -} - -(function () { - - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - if (typeof Date.prototype.toJSON !== 'function') { - - Date.prototype.toJSON = function (key) { - - return isFinite(this.valueOf()) ? - this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z' : null; - }; - - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = function (key) { - return this.valueOf(); - }; - } - - var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; - - - function quote(string) { - -// If the string contains no control characters, no quote characters, and no -// backslash characters, then we can safely slap some quotes around it. -// Otherwise we must also replace the offending characters with safe escape -// sequences. - - escapable.lastIndex = 0; - return escapable.test(string) ? - '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : - '"' + string + '"'; - } - - - function str(key, holder) { - -// Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - -// If the value has a toJSON method, call it to obtain a replacement value. - - if (value && typeof value === 'object' && - typeof value.toJSON === 'function') { - value = value.toJSON(key); - } - -// If we were called with a replacer function, then call the replacer to -// obtain a replacement value. - - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } - -// What happens next depends on the value's type. - - switch (typeof value) { - case 'string': - return quote(value); - - case 'number': - -// JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : 'null'; - - case 'boolean': - case 'null': - -// If the value is a boolean or null, convert it to a string. Note: -// typeof null does not produce 'null'. The case is included here in -// the remote chance that this gets fixed someday. - - return String(value); - -// If the type is 'object', we might be dealing with an object or an array or -// null. - - case 'object': - -// Due to a specification blunder in ECMAScript, typeof null is 'object', -// so watch out for that case. - - if (!value) { - return 'null'; - } - -// Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - -// Is the value an array? - - if (Object.prototype.toString.apply(value) === '[object Array]') { - -// The value is an array. Stringify every element. Use null as a placeholder -// for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } - -// Join all of the elements together, separated with commas, and wrap them in -// brackets. - - v = partial.length === 0 ? '[]' : - gap ? '[\n' + gap + - partial.join(',\n' + gap) + '\n' + - mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - -// If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === 'string') { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } else { - -// Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - -// Join all of the member texts together, separated with commas, -// and wrap them in braces. - - v = partial.length === 0 ? '{}' : - gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + - mind + '}' : '{' + partial.join(',') + '}'; - gap = mind; - return v; - } - } - -// If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== 'function') { - JSON.stringify = function (value, replacer, space) { - -// The stringify method takes a value and an optional replacer, and an optional -// space parameter, and returns a JSON text. The replacer can be a function -// that can replace values, or an array of strings that will select the keys. -// A default replacer method can be provided. Use of the space parameter can -// produce text that is more easily readable. - - var i; - gap = ''; - indent = ''; - -// If the space parameter is a number, make an indent string containing that -// many spaces. - - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - -// If the space parameter is a string, it will be used as the indent string. - - } else if (typeof space === 'string') { - indent = space; - } - -// If there is a replacer, it must be a function or an array. -// Otherwise, throw an error. - - rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - -// Make a fake root object containing our value under the key of ''. -// Return the result of stringifying the value. - - return str('', {'': value}); - }; - } - - -// If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== 'function') { - JSON.parse = function (text, reviver) { - -// The parse method takes a text and an optional reviver function, and returns -// a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - -// The walk method is used to recursively walk the resulting structure so -// that modifications can be made. - - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - -// Parsing happens in four stages. In the first stage, we replace certain -// Unicode characters with escape sequences. JavaScript handles many characters -// incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return '\\u' + - ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - -// In the second stage, we run the text against regular expressions that look -// for non-JSON patterns. We are especially concerned with '()' and 'new' -// because they can cause invocation, and '=' because it can cause mutation. -// But just to be safe, we want to reject all unexpected forms. - -// We split the second stage into 4 regexp operations in order to work around -// crippling inefficiencies in IE's and Safari's regexp engines. First we -// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we -// replace all simple value tokens with ']' characters. Third, we delete all -// open brackets that follow a colon or comma or that begin the text. Finally, -// we look to see that the remaining characters are only whitespace or ']' or -// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if (/^[\],:{}\s]*$/ -.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') -.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') -.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { - -// In the third stage we use the eval function to compile the text into a -// JavaScript structure. The '{' operator is subject to a syntactic ambiguity -// in JavaScript: it can begin a block or an object literal. We wrap the text -// in parens to eliminate the ambiguity. - - j = eval('(' + text + ')'); - -// In the optional fourth stage, we recursively walk the new structure, passing -// each name/value pair to a reviver function for possible transformation. - - return typeof reviver === 'function' ? - walk({'': j}, '') : j; - } - -// If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError('JSON.parse'); - }; - } -}()); diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalc-3.js b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalc-3.js deleted file mode 100644 index fe55082..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalc-3.js +++ /dev/null @@ -1,5827 +0,0 @@ -// -// The main SocialCalc code module of the SocialCalc package -// -/* -// (c) Copyright 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - -/* - -**** Overview **** - -This is the beginning of a library of routines for displaying and editing spreadsheet -data in a browser. The HTML that includes this does not need to have anything -specific to the spreadsheet or editor already present -- everything is dynamically -added to the DOM by this code, including the rendered sheet and any editing controls. - -The library has a few parts. This is the main SocialCalc code module. -Other parts are the Table Editor module, the Formula module, and the Format Number module. -Note: The Table Editor module is licensed under a different license than this module. - -The class/object style is derived from O'Reilly's JavaScript by Flanagan, 5th Edition, -section 9.3, page 157. - -All of the data, object definitions, functions, etc., are stored as properties of the SocialCalc -object so as not to clutter up the global variables nor conflict with other names. - -A design goal (not tested yet for success) is to make it possible to have more than one -spreadsheet active on a page, perhaps even open for editing. It is assumed, though, that -there is only one mouse and one keyboard (a good assumption on most PCs today but not in the -new "touch and surface world" Apple and Microsoft are working towards). - -The testing has been on Windows Firefox (2 and 3), -Internet Explorer (6 and 7), Opera (9.23 and mainly later), Mac Safari (3.1), and Mac Firefox (2.0.0.6). -There are small issues with Firefox before 2.0 (cosmetic with drag handles) and larger ones -with Opera before 9.5 (the Delete key isn't recognized in some cases -- the 9.5 version was still -in beta and this bug affects other products like GMail, I believe). - -The data is stored in a SocialCalc.Sheet object. The data is organized in a form similar to that -used by SocialCalc 1.1.0. There is a function for converting a normal SocialCalc spreadsheet -save data string (the spreadsheet part of a SocialCalc data file) into this internal form. - -The SocialCalc.RenderContext class provides methods for rendering a table into the DOM representing -part of the spreadsheet. It is assumed that the spreadsheet could possibly be very large -and that rendering the whole thing at once could be too time consuming. It is also set up so -that it might be possible to have some of the sheet data only be loaded on demand (such as by Ajax). -The rendering can render cells to the right and below the already active area of the spreadsheet -so that you can scroll to that "clean" area without explicitly doing "add row/column". The class also -does simple operations such as "scrolling" within that table. The table may optionally include -row and column headers and may be split into panes. Most of the code assumes any number of panes, -but only the rightmost pane has scrolling code. In normal operation there would be one or two -panes horizontally and vertically. The panes may start on any row/column, though a given row/column -should only appear in one pane at a time (not all code enforces this, yet). - -The RenderContext is designed to be rendered as part of a SocialCalc.TableEditor. The TableEditor -includes the spreadsheet grid as well as scrollbars, pane sliders, and (eventually) editing controls. -The layout is dynamic and may be recomputed on the fly, such as in response to resizing the browser -window. - -The scrollbars and pane sliders are created using SocialCalc.TableControl objects. These in turn -make use of Dragging, ToolTip, Button, and MouseWheel functions. - -The keyboard input is handled by keyboard code. - -There are also some helper routines. - -More comments yet to come... - -*/ - - -var SocialCalc; -if (!SocialCalc) SocialCalc = {}; - -// ************************************* -// -// Shared values -// -// These are "global" values shared by the classes, including default settings -// -// ************************************* - -// Callbacks - -SocialCalc.Callbacks = { - - // The next two are used by SocialCalc.format_text_for_display - - // The function to expand wiki text - should be set if you want wikitext expansion - // The form is: expand_wiki(displayvalue, sheetobj, linkstyle, valueformat) - // valueformat is text-wiki followed by optional sub-formats, e.g., text-wikipagelink - - expand_wiki: null, - - expand_markup: function(displayvalue, sheetobj, linkstyle) // the old function to expand wiki text - may be replaced - {return SocialCalc.default_expand_markup(displayvalue, sheetobj, linkstyle);}, - - // MakePageLink is used to create the href for a link to another "page" - // The form is: MakePageLink(pagename, workspacename, linktyle, valueformat), returns string - - MakePageLink: null, - - // NormalizeSheetName is used to make different variations of sheetnames use the same cache slot - - NormalizeSheetName: null // use default - lowercase - - }; - -// Shared flags - - // none at present - - -// ************************************* -// -// Cell class: -// -// ************************************* - -// -// Class SocialCalc.Cell -// -// Usage: var s = new SocialCalc.Cell(coord); -// -// Cell attributes include: -// -// coord: the column/row as a string, e.g., "A1" -// datavalue: the value to be used for computation and formatting for display, -// string or numeric (tolerant of numbers stored as strings) -// datatype: if present, v=numeric value, t=text value, f=formula, -// or c=constant that is not a simple number (like "$1.20") -// formula: if present, the formula (without leading "=") for computation or the constant -// valuetype: first char is main type, the following are sub-types. -// Main types are b=blank cell, n=numeric, t=text, e=error -// Examples of using sub-types would be "nt" for a numeric time value, "n$" for currency, "nl" for logical -// displayvalue: if present, rendered version of datavalue with formatting attributes applied -// parseinfo: if present, cached parsed version of formula -// -// The following optional values, if present, are mainly used in rendering, overriding defaults: -// -// bt, br, bb, bl: number of border's definition -// layout: layout (vertical alignment, padding) definition number -// font: font definition number -// color: text color definition number -// bgcolor: background color definition number -// cellformat: cell format (horizontal alignment) definition number -// nontextvalueformat: custom format definition number for non-text values, e.g., numbers -// textvalueformat: custom format definition number for text values -// colspan, rowspan: number of cells to span for merged cells (only on main cell) -// cssc: custom css classname for cell, as text (no special chars) -// csss: custom css style definition -// mod: modification allowed flag "y" if present -// comment: cell comment string -// - -SocialCalc.Cell = function(coord) { - - this.coord = coord; - this.datavalue = ""; - this.datatype = null; - this.formula = ""; - this.valuetype = "b"; - - } - -// The types of cell properties -// -// Type 1: Base, Type 2: Attribute, Type 3: Special (e.g., displaystring, parseinfo) - -SocialCalc.CellProperties = { - coord: 1, datavalue: 1, datatype: 1, formula: 1, valuetype: 1, errors: 1, comment: 1, - bt: 2, br: 2, bb: 2, bl: 2, layout: 2, font: 2, color: 2, bgcolor: 2, - cellformat: 2, nontextvalueformat: 2, textvalueformat: 2, colspan: 2, rowspan: 2, - cssc: 2, csss: 2, mod: 2, - displaystring: 3, // used to cache rendered HTML of cell contents - parseinfo: 3, // used to cache parsed formulas - hcolspan: 3, hrowspan: 3 // spans taking hidden cols/rows into account (!!! NOT YET !!!) - }; - -SocialCalc.CellPropertiesTable = { - bt: "borderstyle", br: "borderstyle", bb: "borderstyle", bl: "borderstyle", - layout: "layout", font: "font", color: "color", bgcolor: "color", - cellformat: "cellformat", nontextvalueformat: "valueformat", textvalueformat: "valueformat" - }; - -// ************************************* -// -// Sheet class: -// -// ************************************* - -// -// Class SocialCalc.Sheet -// -// Usage: var s = new SocialCalc.Sheet(); -// - -SocialCalc.Sheet = function() { - - SocialCalc.ResetSheet(this); - - // Set other values: - // - // sheet.statuscallback(data, status, arg, this.statuscallbackparams) is called - // during recalc and commands. - // - // During recalc, data is the current recalcdata. - // The values for status and the corresponding arg are: - // - // calcorder, {coord: coord, total: celllist length, count: count} [0 or more times per recalc] - // calccheckdone, calclist length [once per recalc] - // calcstep, {coord: coord, total: calclist length, count: count} [0 or more times per recalc] - // calcloading, {sheetname: name-of-sheet} - // calcserverfunc, {funcname: name-of-function, coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds [once per recalc] - // - // During commands, data is SocialCalc.SheetCommandInfo. - // These values for status and arg are: - // - // cmdstart, cmdstr - // cmdend - // - - this.statuscallback = null; // routine called with cmdstart, calcstart, etc., status and args: - // sheet.statuscallback(data, status, arg, params) - this.statuscallbackparams = null; // parameters passed to that routine - - } - -// -// SocialCalc.ResetSheet(sheet) -// -// Resets (and/or initializes) sheet data values. -// - -SocialCalc.ResetSheet = function(sheet, reload) { - - // properties: - - sheet.cells = {}; // at least one for each non-blank cell: coord: cell-object - sheet.attribs = // sheet attributes - { - lastcol: 1, - lastrow: 1, - defaultlayout: 0 - }; - sheet.rowattribs = - { - hide: {}, // access by row number - height: {} - }; - sheet.colattribs = - { - width: {}, // access by col name - hide: {} - }; - sheet.names={}; // Each is: {desc: "optional description", definition: "B5, A1:B7, or =formula"} - sheet.layouts=[]; - sheet.layouthash={}; - sheet.fonts=[]; - sheet.fonthash={}; - sheet.colors=[]; - sheet.colorhash={}; - sheet.borderstyles=[]; - sheet.borderstylehash={}; - sheet.cellformats=[]; - sheet.cellformathash={}; - sheet.valueformats=[]; - sheet.valueformathash={}; - - sheet.copiedfrom = ""; // if a range, then this was loaded from a saved range as clipboard content - - sheet.changes = new SocialCalc.UndoStack(); - - sheet.renderneeded = false; - - sheet.changedrendervalues = true; // if true, spans and/or fonts have changed (set by ExecuteSheetCommand & GetStyle) - - sheet.recalcchangedavalue = false; // true if a recalc resulted in a change to a cell's calculated value - - } - -// Methods: - -SocialCalc.Sheet.prototype.ResetSheet = function() {SocialCalc.ResetSheet(this);}; -SocialCalc.Sheet.prototype.AddCell = function(newcell) {return this.cells[newcell.coord]=newcell;}; -SocialCalc.Sheet.prototype.GetAssuredCell = function(coord) { - return this.cells[coord] || this.AddCell(new SocialCalc.Cell(coord)); - }; -SocialCalc.Sheet.prototype.ParseSheetSave = function(savedsheet) {SocialCalc.ParseSheetSave(savedsheet,this);}; -SocialCalc.Sheet.prototype.CellFromStringParts = function(cell, parts, j) {return SocialCalc.CellFromStringParts(this, cell, parts, j);}; -SocialCalc.Sheet.prototype.CreateSheetSave = function(range, canonicalize) {return SocialCalc.CreateSheetSave(this, range, canonicalize);}; -SocialCalc.Sheet.prototype.CellToString = function(cell) {return SocialCalc.CellToString(this, cell);}; -SocialCalc.Sheet.prototype.CanonicalizeSheet = function(full) {return SocialCalc.CanonicalizeSheet(this, full);}; -SocialCalc.Sheet.prototype.EncodeCellAttributes = function(coord) {return SocialCalc.EncodeCellAttributes(this, coord);}; -SocialCalc.Sheet.prototype.EncodeSheetAttributes = function() {return SocialCalc.EncodeSheetAttributes(this);}; -SocialCalc.Sheet.prototype.DecodeCellAttributes = function(coord, attribs, range) {return SocialCalc.DecodeCellAttributes(this, coord, attribs, range);}; -SocialCalc.Sheet.prototype.DecodeSheetAttributes = function(attribs) {return SocialCalc.DecodeSheetAttributes(this, attribs);}; - -SocialCalc.Sheet.prototype.ScheduleSheetCommands = function(cmd, saveundo, isRemote) {return SocialCalc.ScheduleSheetCommands(this, cmd, saveundo, isRemote);}; -SocialCalc.Sheet.prototype.SheetUndo = function() {return SocialCalc.SheetUndo(this);}; -SocialCalc.Sheet.prototype.SheetRedo = function() {return SocialCalc.SheetRedo(this);}; -SocialCalc.Sheet.prototype.CreateAuditString = function() {return SocialCalc.CreateAuditString(this);}; -SocialCalc.Sheet.prototype.GetStyleNum = function(atype, style) {return SocialCalc.GetStyleNum(this, atype, style);}; -SocialCalc.Sheet.prototype.GetStyleString = function(atype, num) {return SocialCalc.GetStyleString(this, atype, num);}; -SocialCalc.Sheet.prototype.RecalcSheet = function() {return SocialCalc.RecalcSheet(this);}; - -// -// Sheet save format: -// -// linetype:param1:param2:... -// -// Linetypes are: -// -// version:versionname - version of this format. Currently 1.4. -// -// cell:coord:type:value...:type:value... - Types are as follows: -// -// v:value - straight numeric value -// t:value - straight text/wiki-text in cell, encoded to handle \, :, newlines -// vt:fulltype:value - value with value type/subtype -// vtf:fulltype:value:formulatext - formula resulting in value with value type/subtype, value and text encoded -// vtc:fulltype:value:valuetext - formatted text constant resulting in value with value type/subtype, value and text encoded -// vf:fvalue:formulatext - formula resulting in value, value and text encoded (obsolete: only pre format version 1.1) -// fvalue - first char is "N" for numeric value, "T" for text value, "H" for HTML value, rest is the value -// e:errortext - Error text. Non-blank means formula parsing/calculation results in error. -// b:topborder#:rightborder#:bottomborder#:leftborder# - border# in sheet border list or blank if none -// l:layout# - number in cell layout list -// f:font# - number in sheet fonts list -// c:color# - sheet color list index for text -// bg:color# - sheet color list index for background color -// cf:format# - sheet cell format number for explicit format (align:left, etc.) -// cvf:valueformat# - sheet cell value format number (obsolete: only pre format v1.2) -// tvf:valueformat# - sheet cell text value format number -// ntvf:valueformat# - sheet cell non-text value format number -// colspan:numcols - number of columns spanned in merged cell -// rowspan:numrows - number of rows spanned in merged cell -// cssc:classname - name of CSS class to be used for cell when published instead of one calculated here -// csss:styletext - explicit CSS style information, encoded to handle :, etc. -// mod:allow - if "y" allow modification of cell for live "view" recalc -// comment:value - encoded text of comment for this cell (added in v1.5) -// -// col: -// w:widthval - number, "auto" (no width in tag), number%, or blank (use default) -// hide: - yes/no, no is assumed if missing -// row: -// hide - yes/no, no is assumed if missing -// -// sheet: -// c:lastcol - number -// r:lastrow - number -// w:defaultcolwidth - number, "auto", number%, or blank (default->80) -// h:defaultrowheight - not used -// tf:format# - cell format number for sheet default for text values -// ntf:format# - cell format number for sheet default for non-text values (i.e., numbers) -// layout:layout# - default cell layout number in cell layout list -// font:font# - default font number in sheet font list -// vf:valueformat# - default number value format number in sheet valueformat list (obsolete: only pre format version 1.2) -// ntvf:valueformat# - default non-text (number) value format number in sheet valueformat list -// tvf:valueformat# - default text value format number in sheet valueformat list -// color:color# - default number for text color in sheet color list -// bgcolor:color# - default number for background color in sheet color list -// circularreferencecell:coord - cell coord with a circular reference -// recalc:value - on/off (on is default). If not "off", appropriate changes to the sheet cause a recalc -// needsrecalc:value - yes/no (no is default). If "yes", formula values are not up to date -// -// name:name:description:value - name definition, name in uppercase, with value being "B5", "A1:B7", or "=formula"; -// description and value are encoded. -// font:fontnum:value - text of font definition (style weight size family) for font fontnum -// "*" for "style weight", size, or family, means use default (first look to sheet, then builtin) -// color:colornum:rgbvalue - text of color definition (e.g., rgb(255,255,255)) for color colornum -// border:bordernum:value - text of border definition (thickness style color) for border bordernum -// layout:layoutnum:value - text of vertical alignment and padding style for cell layout layoutnum (* for default): -// vertical-alignment:vavalue;padding:topval rightval bottomval leftval; -// cellformat:cformatnum:value - text of cell alignment (left/center/right) for cellformat cformatnum -// valueformat:vformatnum:value - text of number format (see FormatValueForDisplay) for valueformat vformatnum (changed in v1.2) -// clipboardrange:upperleftcoord:bottomrightcoord - ignored -- from wikiCalc -// clipboard:coord:type:value:... - ignored -- from wikiCalc -// -// If this is clipboard contents, then there is also information to facilitate pasting: -// -// copiedfrom:upperleftcoord:bottomrightcoord - range from which this was copied -// - -// Functions: - -SocialCalc.ParseSheetSave = function(savedsheet,sheetobj) { - - var lines=savedsheet.split(/\r\n|\n/); - var parts=[]; - var line; - var i, j, t, v, coord, cell, attribs, name; - var scc = SocialCalc.Constants; - - for (i=0;i maxrow) maxrow = cr.row; - if (cr.col > maxcol) maxcol = cr.col; - } - } - - for (i=0; i maxrow) maxrow = cr; - } - } - a = {"hide": 1, "width": 1}; // look at explicit col settings - for (v in a) { - for (coord in sheetobj.colattribs[v]) { - cr = SocialCalc.coordToCr(coord+"1"); - if (cr.col > maxcol) maxcol = cr.col; - } - } - - for (an=0; an0, command loop waits for SocialCalc.ResumeFromCmdExtension() - -// statuscallback: null, // called during execution - obsolete: use sheet obj's -// statuscallbackparams: null - - }; - -// -// SocialCalc.ScheduleSheetCommands -// -// statuscallback is called at the beginning (cmdstart) and end (cmdend). -// - -SocialCalc.ScheduleSheetCommands = function(sheet, cmdstr, saveundo, isRemote) { - if (SocialCalc.Callbacks.broadcast && !isRemote) { - if (cmdstr != 'redisplay' && cmdstr != 'set sheet defaulttextvalueformat text-wiki' && - cmdstr != 'recalc') { - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"scmd", id:sheet.sheetid,cmdstr: cmdstr, saveundo: saveundo }); - } - } - - var sci = SocialCalc.SheetCommandInfo; - - sci.sheetobj = sheet; - sci.parseobj = new SocialCalc.Parse(cmdstr); - sci.saveundo = saveundo; - - if (sci.sheetobj.statuscallback) { // notify others if requested - sheet.statuscallback(sci, "cmdstart", "", sci.sheetobj.statuscallbackparams); - } - - if (sci.saveundo) { - sci.sheetobj.changes.PushChange(""); // add a step to undo stack - } - - sci.timerobj = window.setTimeout(SocialCalc.SheetCommandsTimerRoutine, sci.firsttimerdelay); - - } - -SocialCalc.SheetCommandsTimerRoutine = function() { - - var errortext; - var sci = SocialCalc.SheetCommandInfo; - var starttime = new Date(); - - sci.timerobj = null; - - while (!sci.parseobj.EOF()) { // go through all commands (separated by newlines) - - errortext = SocialCalc.ExecuteSheetCommand(sci.sheetobj, sci.parseobj, sci.saveundo); - if (errortext) alert(errortext); - - sci.parseobj.NextLine(); - - if (sci.cmdextensionbusy.length > 0) { // forced wait - if (sci.sheetobj.statuscallback) { // notify others if requested - sci.sheetobj.statuscallback(sci, "cmdextension", sci.cmdextensionbusy, sci.sheetobj.statuscallbackparams); - } - return; - } - - if (((new Date()) - starttime) >= sci.maxtimeslice) { // if taking too long, give up CPU for a while - sci.timerobj = window.setTimeout(SocialCalc.SheetCommandsTimerRoutine, sci.timerdelay); - return; - } - } - - if (sci.sheetobj.statuscallback) { // notify others if requested - sci.sheetobj.statuscallback(sci, "cmdend", "", sci.sheetobj.statuscallbackparams); - } - - } - -SocialCalc.ResumeFromCmdExtension = function() { - - var sci = SocialCalc.SheetCommandInfo; - - sci.cmdextensionbusy = ""; - - SocialCalc.SheetCommandsTimerRoutine(); - -} - -// -// errortext = SocialCalc.ExecuteSheetCommand(sheet, cmd, saveundo) -// -// cmd is a SocialCalc.Parse object. -// -// Executes commands that modify the sheet data. -// Sets sheet "needsrecalc" as needed. -// Sets sheet "changedrendervalues" as needed. -// -// The cmd string may be multiple commands, separated by newlines. In that case -// only one "step" is put on the undo stack representing all the commands. -// Note that because of this, in "set A1 text ..." and "set A1 comment ..." text is -// treated as encoded (newline => \n, \ => \b, : => \c). -// -// The commands are in the forms: -// -// set sheet attributename value (plus lastcol and lastrow) -// set 22 attributename value -// set B attributename value -// set A1 attributename value1 value2... (see each attribute in code for details) -// set A1:B5 attributename value1 value2... -// erase/copy/cut/paste/fillright/filldown A1:B5 all/formulas/format -// loadclipboard save-encoded-clipboard-data -// clearclipboard -// merge C3:F3 -// unmerge C3 -// insertcol/insertrow C5 -// deletecol/deleterow C5:E7 -// movepaste/moveinsert A1:B5 A8 all/formulas/format (if insert, destination must be in same rows or columns or else paste done) -// sort cr1:cr2 col1 up/down col2 up/down col3 up/down -// name define NAME definition -// name desc NAME description -// name delete NAME -// recalc -// redisplay -// changedrendervalues -// startcmdextension extension rest-of-command -// -// If saveundo is true, then undo information is saved in sheet.changes. -// - -SocialCalc.ExecuteSheetCommand = function(sheet, cmd, saveundo) { - - var cmdstr, cmd1, rest, what, attrib, num, pos, pos2, errortext, undostart, val; - var cr1, cr2, col, row, cr, cell, newcell; - var fillright, rowstart, colstart, crbase, rowoffset, coloffset, basecell; - var clipsheet, cliprange, numcols, numrows, attribtable; - var colend, rowend, newcolstart, newrowstart, newcolend, newrowend, rownext, colnext, colthis, cellnext; - var lastrow, lastcol, rowbefore, colbefore, oldformula, oldcr; - var cols, dirs, lastsortcol, i, sortlist, sortcells, sortvalues, sorttypes; - var sortfunction, slen, valtype, originalrow, sortedcr; - var name, v1, v2; - var cmdextension; - - var attribs = sheet.attribs; - var changes = sheet.changes; - var cellProperties = SocialCalc.CellProperties; - var scc = SocialCalc.Constants; - - var ParseRange = - function() { - var prange = SocialCalc.ParseRange(what); - cr1 = prange.cr1; - cr2 = prange.cr2; - if (cr2.col > attribs.lastcol) attribs.lastcol = cr2.col; - if (cr2.row > attribs.lastrow) attribs.lastrow = cr2.row; - }; - - errortext = ""; - - cmdstr = cmd.RestOfStringNoMove(); - if (saveundo) { - sheet.changes.AddDo(cmdstr); - } - - cmd1 = cmd.NextToken(); - - switch (cmd1) { - - case "set": - what = cmd.NextToken(); - attrib = cmd.NextToken(); - rest = cmd.RestOfString(); - undostart = "set "+what+" "+attrib; - - if (what=="sheet") { - sheet.renderneeded = true; - switch (attrib) { - case "defaultcolwidth": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]); - attribs[attrib] = rest; - break; - case "defaultcolor": - case "defaultbgcolor": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("color", attribs[attrib])); - attribs[attrib] = sheet.GetStyleNum("color", rest); - break; - case "defaultlayout": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("layout", attribs[attrib])); - attribs[attrib] = sheet.GetStyleNum("layout", rest); - break; - case "defaultfont": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("font", attribs[attrib])); - if (rest=="* * *") rest = ""; // all default - attribs[attrib] = sheet.GetStyleNum("font", rest); - break; - case "defaulttextformat": - case "defaultnontextformat": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("cellformat", attribs[attrib])); - attribs[attrib] = sheet.GetStyleNum("cellformat", rest); - break; - case "defaulttextvalueformat": - case "defaultnontextvalueformat": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("valueformat", attribs[attrib])); - attribs[attrib] = sheet.GetStyleNum("valueformat", rest); - for (cr in sheet.cells) { // forget all cached display strings - delete sheet.cells[cr].displaystring; - } - break; - case "lastcol": - case "lastrow": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]-0); - num = rest-0; - if (typeof num == "number") attribs[attrib] = num > 0 ? num : 1; - break; - case "recalc": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]); - if (rest == "off") { - attribs.recalc = rest; // manual recalc, not auto - } - else { // all values other than "off" mean "on" - delete attribs.recalc; - } - break; - default: - errortext = scc.s_escUnknownSheetCmd+cmdstr; - break; - } - } - - else if (/(^[A-Z])([A-Z])?(:[A-Z][A-Z]?){0,1}$/i.test(what)) { // col attributes - sheet.renderneeded = true; - what = what.toUpperCase(); - pos = what.indexOf(":"); - if (pos>=0) { - cr1 = SocialCalc.coordToCr(what.substring(0,pos)+"1"); - cr2 = SocialCalc.coordToCr(what.substring(pos+1)+"1"); - } - else { - cr1 = SocialCalc.coordToCr(what+"1"); - cr2 = cr1; - } - for (col=cr1.col; col <= cr2.col; col++) { - if (attrib=="width") { - cr = SocialCalc.rcColname(col); - if (saveundo) changes.AddUndo("set "+cr+" width", sheet.colattribs.width[cr]); - if (rest.length > 0 ) { - sheet.colattribs.width[cr] = rest; - } - else { - delete sheet.colattribs.width[cr]; - } - } - } - } - - // !!!!! need row attribs !!!! - - else if (/([a-z]){0,1}(\d+)/i.test(what)) { // cell attributes - ParseRange(); - if (cr1.row!=cr2.row || cr1.col!=cr2.col || sheet.celldisplayneeded || sheet.renderneeded) { // not one cell - sheet.renderneeded = true; - sheet.celldisplayneeded = ""; - } - else { - sheet.celldisplayneeded = SocialCalc.crToCoord(cr1.col, cr1.row); - } - for (row=cr1.row; row <= cr2.row; row++) { - for (col=cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - if (attrib=="value") { // set coord value type numeric-value - pos = rest.indexOf(" "); - cell.datavalue = rest.substring(pos+1)-0; - delete cell.errors; - cell.datatype = "v"; - cell.valuetype = rest.substring(0,pos); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="text") { // set coord text type text-value - pos = rest.indexOf(" "); - cell.datavalue = SocialCalc.decodeFromSave(rest.substring(pos+1)); - delete cell.errors; - cell.datatype = "t"; - cell.valuetype = rest.substring(0,pos); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="formula") { // set coord formula formula-body-less-initial-= - cell.datavalue = 0; // until recalc - delete cell.errors; - cell.datatype = "f"; - cell.valuetype = "e#N/A"; // until recalc - cell.formula = rest; - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="constant") { // set coord constant type numeric-value source-text - pos = rest.indexOf(" "); - pos2 = rest.substring(pos+1).indexOf(" "); - cell.datavalue = rest.substring(pos+1,pos+1+pos2)-0; - cell.valuetype = rest.substring(0,pos); - if (cell.valuetype.charAt(0)=="e") { // error - cell.errors = cell.valuetype.substring(1); - } - else { - delete cell.errors; - } - cell.datatype = "c"; - cell.formula = rest.substring(pos+pos2+2); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="empty") { // erase value - cell.datavalue = ""; - delete cell.errors; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="all") { // set coord all :this:val1:that:val2... - if (rest.length>0) { - cell = new SocialCalc.Cell(cr); - sheet.CellFromStringParts(cell, rest.split(":"), 1); - sheet.cells[cr] = cell; - } - else { - delete sheet.cells[cr]; - } - attribs.needsrecalc = "yes"; - } - else if (/^b[trbl]$/.test(attrib)) { // set coord bt 1px solid black - cell[attrib] = sheet.GetStyleNum("borderstyle", rest); - sheet.renderneeded = true; // affects more than just one cell - } - else if (attrib=="color" || attrib=="bgcolor") { - cell[attrib] = sheet.GetStyleNum("color", rest); - } - else if (attrib=="layout" || attrib=="cellformat") { - cell[attrib] = sheet.GetStyleNum(attrib, rest); - } - else if (attrib=="font") { // set coord font style weight size family - if (rest=="* * *") rest = ""; - cell[attrib] = sheet.GetStyleNum("font", rest); - } - else if (attrib=="textvalueformat" || attrib=="nontextvalueformat") { - cell[attrib] = sheet.GetStyleNum("valueformat", rest); - delete cell.displaystring; - } - else if (attrib=="cssc") { - rest = rest.replace(/[^a-zA-Z0-9\-]/g, ""); - cell.cssc = rest; - } - else if (attrib=="csss") { - rest = rest.replace(/\n/g, ""); - cell.csss = rest; - } - else if (attrib=="mod") { - rest = rest.replace(/[^yY]/g, "").toLowerCase(); - cell.mod = rest; - } - else if (attrib=="comment") { - cell.comment = SocialCalc.decodeFromSave(rest); - } - else { - errortext = scc.s_escUnknownSetCoordCmd+cmdstr; - } - } - } - - } - break; - - case "merge": - sheet.renderneeded = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - cell=sheet.GetAssuredCell(cr1.coord); - if (saveundo) changes.AddUndo("unmerge "+cr1.coord); - - if (cr2.col > cr1.col) cell.colspan = cr2.col - cr1.col + 1; - else delete cell.colspan; - if (cr2.row > cr1.row) cell.rowspan = cr2.row - cr1.row + 1; - else delete cell.rowspan; - - sheet.changedrendervalues = true; - - break; - - case "unmerge": - sheet.renderneeded = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - cell=sheet.GetAssuredCell(cr1.coord); - if (saveundo) changes.AddUndo("merge "+cr1.coord+":"+SocialCalc.crToCoord(cr1.col+(cell.colspan||1)-1, cr1.row+(cell.rowspan||1)-1)); - - delete cell.colspan; - delete cell.rowspan; - - sheet.changedrendervalues = true; - - break; - - case "erase": - case "cut": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - if (cmd1=="cut") { // save copy of whole thing before erasing - if (saveundo) changes.AddUndo("loadclipboard", SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard)); - SocialCalc.Clipboard.clipboard = SocialCalc.CreateSheetSave(sheet, what); - } - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - if (rest=="all") { - delete sheet.cells[cr]; - } - else if (rest == "formulas") { - cell.datavalue = ""; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - delete cell.errors; - delete cell.displaystring; - delete cell.parseinfo; - if (cell.comment) { // comments are considered content for erasing - delete cell.comment; - } - } - else if (rest == "formats") { - newcell = new SocialCalc.Cell(cr); // create a new cell without attributes - newcell.datavalue = cell.datavalue; // copy existing values - newcell.datatype = cell.datatype; - newcell.formula = cell.formula; - newcell.valuetype = cell.valuetype; - if (cell.comment) { - newcell.comment = cell.comment; - } - sheet.cells[cr] = newcell; // replace - } - } - } - attribs.needsrecalc = "yes"; - break; - - case "fillright": - case "filldown": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - if (cmd1 == "fillright") { - fillright = true; - rowstart = cr1.row; - colstart = cr1.col + 1; - } - else { - fillright = false; - rowstart = cr1.row + 1; - colstart = cr1.col; - } - for (row = rowstart; row <= cr2.row; row++) { - for (col = colstart; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - if (fillright) { - crbase = SocialCalc.crToCoord(cr1.col, row); - coloffset = col - colstart + 1; - rowoffset = 0; - } - else { - crbase = SocialCalc.crToCoord(col, cr1.row); - coloffset = 0; - rowoffset = row - rowstart + 1; - } - basecell = sheet.GetAssuredCell(crbase); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - if (cell.datatype == "f") { // offset relative coords, even in sheet references - cell.formula = SocialCalc.OffsetFormulaCoords(basecell.formula, coloffset, rowoffset); - } - else { - cell.formula = basecell.formula; - } - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - } - } - - attribs.needsrecalc = "yes"; - break; - - case "copy": - what = cmd.NextToken(); - rest = cmd.RestOfString(); - if (saveundo) changes.AddUndo("loadclipboard", SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard)); - SocialCalc.Clipboard.clipboard = SocialCalc.CreateSheetSave(sheet, what); - break; - - case "loadclipboard": - rest = cmd.RestOfString(); - if (saveundo) changes.AddUndo("loadclipboard", SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard)); - SocialCalc.Clipboard.clipboard = SocialCalc.decodeFromSave(rest); - break; - - case "clearclipboard": - if (saveundo) changes.AddUndo("loadclipboard", SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard)); - SocialCalc.Clipboard.clipboard = ""; - break; - - case "paste": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - if (!SocialCalc.Clipboard.clipboard) { - break; - } - clipsheet = new SocialCalc.Sheet(); // load clipboard contents as another sheet - clipsheet.ParseSheetSave(SocialCalc.Clipboard.clipboard); - cliprange = SocialCalc.ParseRange(clipsheet.copiedfrom); - coloffset = cr1.col - cliprange.cr1.col; // get sizes, etc. - rowoffset = cr1.row - cliprange.cr1.row; - numcols = cliprange.cr2.col - cliprange.cr1.col + 1; - numrows = cliprange.cr2.row - cliprange.cr1.row + 1; - if (cr1.col+numcols-1 > attribs.lastcol) attribs.lastcol = cr1.col+numcols-1; - if (cr1.row+numrows-1 > attribs.lastrow) attribs.lastrow = cr1.row+numrows-1; - - for (row = cr1.row; row < cr1.row+numrows; row++) { - for (col = cr1.col; col < cr1.col+numcols; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - crbase = SocialCalc.crToCoord(col-coloffset, row-rowoffset); - basecell = clipsheet.GetAssuredCell(crbase); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - attribtable = SocialCalc.CellPropertiesTable[attrib]; - if (attribtable && basecell[attrib]) { // table indexes to expand to strings since other sheet may have diff indexes - cell[attrib] = sheet.GetStyleNum(attribtable, clipsheet.GetStyleString(attribtable, basecell[attrib])); - } - else { // these are not table indexes - cell[attrib] = basecell[attrib]; - } - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - if (cell.datatype == "f") { // offset relative coords, even in sheet references - cell.formula = SocialCalc.OffsetFormulaCoords(basecell.formula, coloffset, rowoffset); - } - else { - cell.formula = basecell.formula; - } - delete cell.parseinfo; - cell.errors = basecell.errors; - if (basecell.comment) { // comments are pasted as part of content, though not filled, etc. - cell.comment = basecell.comment; - } - else if (cell.comment) { - delete cell.comment; - } - } - delete cell.displaystring; - } - } - - attribs.needsrecalc = "yes"; - break; - - case "sort": // sort cr1:cr2 col1 up/down col2 up/down col3 up/down - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - ParseRange(); - cols = []; // get columns and sort directions (or "") - dirs = []; - lastsortcol = 0; - for (i=0; i<=3; i++) { - cols[i] = cmd.NextToken(); - dirs[i] = cmd.NextToken(); - if (cols[i]) lastsortcol = i; - } - - sortcells = {}; // a copy of the data which will replace the original, but in the new order - sortlist = []; // an array of 0, 1, ..., nrows-1 needed for sorting - sortvalues = []; // values to be sorted corresponding to sortlist - sorttypes = []; // basic types of the values - - for (row = cr1.row; row <= cr2.row; row++) { // fill in the sort info - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.cells[cr]; - if (cell) { // only copy non-empty cells - sortcells[cr] = sheet.CellToString(cell); - if (saveundo) changes.AddUndo("set "+cr+" all", sortcells[cr]); - } - else { - if (saveundo) changes.AddUndo("set "+cr+" all"); - } - } - sortlist.push(sortlist.length); - sortvalues.push([]); - sorttypes.push([]); - slast = sorttypes.length-1; - for (i = 0; i <= lastsortcol; i++) { - cr = cols[i] + row; // get cr on this row in sort col - cell = sheet.GetAssuredCell(cr); - val = cell.datavalue; - valtype = cell.valuetype.charAt(0) || "b"; - if (valtype == "t") val = val.toLowerCase(); - sortvalues[slast].push(val); - sorttypes[slast].push(valtype); - } - } - - sortfunction = function(a, b) { // a comparison function that can handle all the type variations - var i, a1, b1, ta, cresult; - for (i=0; i<=lastsortcol; i++) { - if (dirs[i] == "up") { // handle sort direction - a1 = a; b1 = b; - } - else { - a1 = b; b1 = a; - } - ta = sorttypes[a1][i]; - tb = sorttypes[b1][i]; - if (ta == "t") { // numbers < text < errors, blank always last no matter what dir - if (tb == "t") { - a1 = sortvalues[a1][i]; - b1 = sortvalues[b1][i]; - cresult = a1 > b1 ? 1 : (a1 < b1 ? -1 : 0); - } - else if (tb == "n") { - cresult = 1; - } - else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } - else if (tb == "e") { - cresult = -1; - } - } - else if (ta == "n") { - if (tb == "t") { - cresult = -1; - } - else if (tb == "n") { - a1 = sortvalues[a1][i]-0; // force to numeric, just in case - b1 = sortvalues[b1][i]-0; - cresult = a1 > b1 ? 1 : (a1 < b1 ? -1 : 0); - } - else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } - else if (tb == "e") { - cresult = -1; - } - } - else if (ta == "e") { - if (tb == "e") { - a1 = sortvalues[a1][i]; - b1 = sortvalues[b1][i]; - cresult = a1 > b1 ? 1 : (a1 < b1 ? -1 : 0); - } - else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } - else { - cresult = 1; - } - } - else if (ta == "b") { - if (tb == "b") { - cresult = 0; - } - else { - cresult = dirs[i] == "up" ? 1 : -1; - } - } - if (cresult) { // return if tested not equal, otherwise do next column - return cresult; - } - } - cresult = a > b ? 1 : (a < b ? -1 : 0); // equal - return position in original to maintain it - return cresult; - } - - sortlist.sort(sortfunction); - - for (row = cr1.row; row <= cr2.row; row++) { // copy original rows into sorted positions - originalrow = sortlist[row-cr1.row]; // relative position where it was in original - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - sortedcr = SocialCalc.crToCoord(col, originalrow+cr1.row); // original cell to be put in new place - if (sortcells[sortedcr]) { - cell = new SocialCalc.Cell(cr); - sheet.CellFromStringParts(cell, sortcells[sortedcr].split(":"), 1); - if (cell.datatype == "f") { // offset coord refs, even to ***relative*** coords in other sheets - cell.formula = SocialCalc.OffsetFormulaCoords(cell.formula, 0, (row-cr1.row)-originalrow); - } - sheet.cells[cr] = cell; - } - else { - delete sheet.cells[cr]; - } - } - } - - attribs.needsrecalc = "yes"; - break; - - case "insertcol": - case "insertrow": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - - if (cmd1 == "insertcol") { - coloffset = 1; - colend = cr1.col; - rowoffset = 0; - rowend = 1; - newcolstart = cr1.col; - newcolend = cr1.col; - newrowstart = 1; - newrowend = attribs.lastrow; - if (saveundo) changes.AddUndo("deletecol "+cr1.coord); - } - else { - coloffset = 0; - colend = 1; - rowoffset = 1; - rowend = cr1.row; - newcolstart = 1; - newcolend = attribs.lastcol; - newrowstart = cr1.row; - newrowend = cr1.row; - if (saveundo) changes.AddUndo("deleterow "+cr1.coord); - } - - for (row=attribs.lastrow; row >= rowend; row--) { // copy the cells forward - for (col=attribs.lastcol; col >= colend; col--) { - crbase = SocialCalc.crToCoord(col, row); - cr = SocialCalc.crToCoord(col+coloffset, row+rowoffset); - if (!sheet.cells[crbase]) { // copying empty cell - delete sheet.cells[cr]; // delete anything that may have been there - } - else { // overwrite existing cell with moved contents - sheet.cells[cr] = sheet.cells[crbase]; - } - } - } - - for (row=newrowstart; row <= newrowend; row++) { // fill the "new" empty cells - for (col=newcolstart; col <= newcolend; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = new SocialCalc.Cell(cr); - sheet.cells[cr] = cell; - crbase = SocialCalc.crToCoord(col-coloffset, row-rowoffset); // copy attribs of the one before (0 gives you A or 1) - basecell = sheet.GetAssuredCell(crbase); - for (attrib in cellProperties) { - if (cellProperties[attrib] == 2) { // copy only format attributes - cell[attrib] = basecell[attrib]; - } - } - } - } - - for (cr in sheet.cells) { // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell && cell.datatype == "f") { - cell.formula = SocialCalc.AdjustFormulaCoords(cell.formula, cr1.col, coloffset, cr1.row, rowoffset); - } - if (cell) { - delete cell.parseinfo; - } - } - - for (name in sheet.names) { // update cell references to moved cells in names - if (sheet.names[name]) { // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = v2 + - SocialCalc.AdjustFormulaCoords(v1, cr1.col, coloffset, cr1.row, rowoffset); - } - } - - for (row = attribs.lastrow; row >= rowend && cmd1 == "insertrow"; row--) { // copy the row attributes forward - rownext = row + rowoffset; - for (attrib in sheet.rowattribs) { - val = sheet.rowattribs[attrib][row]; - if (sheet.rowattribs[attrib][rownext] != val) { // make assignment only if different - if (val) { - sheet.rowattribs[attrib][rownext] = val; - } - else { - delete sheet.rowattribs[attrib][rownext]; - } - } - } - } - - for (col = attribs.lastcol; col >= colend && cmd1 == "insertcol"; col--) { // copy the column attributes forward - colthis = SocialCalc.rcColname(col); - colnext = SocialCalc.rcColname(col + coloffset); - for (attrib in sheet.colattribs) { - val = sheet.colattribs[attrib][colthis]; - if (sheet.colattribs[attrib][colnext] != val) { // make assignment only if different - if (val) { - sheet.colattribs[attrib][colnext] = val; - } - else { - delete sheet.colattribs[attrib][colnext]; - } - } - } - } - - attribs.lastcol += coloffset; - attribs.lastrow += rowoffset; - attribs.needsrecalc = "yes"; - break; - - case "deletecol": - case "deleterow": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - lastcol = attribs.lastcol; // save old values since ParseRange sets... - lastrow = attribs.lastrow; - ParseRange(); - - if (cmd1 == "deletecol") { - coloffset = cr1.col - cr2.col - 1; - rowoffset = 0; - colstart = cr2.col + 1; - rowstart = 1; - } - else { - coloffset = 0; - rowoffset = cr1.row - cr2.row - 1; - colstart = 1; - rowstart = cr2.row + 1; - } - - for (row=rowstart; row <= lastrow - rowoffset; row++) { // copy the cells backwards - extra so no dup of last set - for (col=colstart; col <= lastcol - coloffset; col++) { - cr = SocialCalc.crToCoord(col+coloffset, row+rowoffset); - if (saveundo && (row cr2.col)) { - if (destcr.col < cr1.col) { // moving left - pushamount = cr1.col - destcr.col; - inserthoriz = -1; - } - else { - destcr.col -= 1; - coloffset = destcr.col - cr2.col; - pushamount = destcr.col - cr2.col; - inserthoriz = 1; - } - } - else if (coloffset==0 && (destcr.row < cr1.row || destcr.row > cr2.row)) { - if (destcr.row < cr1.row) { // moving up - pushamount = cr1.row - destcr.row; - insertvert = -1; - } - else { - destcr.row -= 1; - rowoffset = destcr.row - cr2.row; - pushamount = destcr.row - cr2.row; - insertvert = 1; - } - } - else { - cmd1 = "movepaste"; // not allowed right now - ignore - } - } - - // push any cells that need pushing - - movedto = {}; // remember what was moved where - - if (insertvert) { - for (row = 0; row < pushamount; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - if (insertvert < 0) { - crbase = SocialCalc.crToCoord(col, destcr.row+pushamount-row-1); // from cell - cr = SocialCalc.crToCoord(col, cr2.row-row); // to cell - } - else { - crbase = SocialCalc.crToCoord(col, destcr.row-pushamount+row+1); // from cell - cr = SocialCalc.crToCoord(col, cr1.row+row); // to cell - } - - basecell = sheet.GetAssuredCell(crbase); - if (saveundo) changes.AddUndo("set "+crbase+" all", sheet.CellToString(basecell)); - - cell = sheet.GetAssuredCell(cr); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - - movedto[crbase] = cr; // old crbase is now at cr - } - } - } - if (inserthoriz) { - for (col = 0; col < pushamount; col++) { - for (row = cr1.row; row <= cr2.row; row++) { - if (inserthoriz < 0) { - crbase = SocialCalc.crToCoord(destcr.col+pushamount-col-1, row); - cr = SocialCalc.crToCoord(cr2.col-col, row); - } - else { - crbase = SocialCalc.crToCoord(destcr.col-pushamount+col+1, row); - cr = SocialCalc.crToCoord(cr1.col+col, row); - } - - basecell = sheet.GetAssuredCell(crbase); - if (saveundo) changes.AddUndo("set "+crbase+" all", sheet.CellToString(basecell)); - - cell = sheet.GetAssuredCell(cr); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - - movedto[crbase] = cr; // old crbase is now at cr - } - } - } - - // paste moved cells into new place - - if (destcr.col+numcols-1 > attribs.lastcol) attribs.lastcol = destcr.col+numcols-1; - if (destcr.row+numrows-1 > attribs.lastrow) attribs.lastrow = destcr.row+numrows-1; - - for (row = cr1.row; row < cr1.row+numrows; row++) { - for (col = cr1.col; col < cr1.col+numcols; col++) { - cr = SocialCalc.crToCoord(col+coloffset, row+rowoffset); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - - crbase = SocialCalc.crToCoord(col, row); // get old cell to move - - movedto[crbase] = cr; // old crbase (moved cell) will now be at cr (destination) - - if (rest == "all" && !movingcells[crbase]) { // moving an empty cell - delete sheet.cells[cr]; // make the cell empty - continue; - } - - basecell = movingcells[crbase]; - if (!basecell) basecell = sheet.GetAssuredCell(crbase); - - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - if (basecell.comment) { // comments are pasted as part of content, though not filled, etc. - cell.comment = basecell.comment; - } - else if (cell.comment) { - delete cell.comment; - } - } - delete cell.displaystring; - } - } - - // do fixups - - for (cr in sheet.cells) { // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell) { - if (cell.datatype == "f") { - oldformula = cell.formula; - cell.formula = SocialCalc.ReplaceFormulaCoords(oldformula, movedto); - if (cell.formula != oldformula) { - delete cell.parseinfo; - if (saveundo && !movedto[cr]) { // moved cells are already saved for undo - changes.AddUndo("set "+cr+" formula "+oldformula); - } - } - } - else { - delete cell.parseinfo; - } - } - } - - for (name in sheet.names) { // update cell references to moved cells in names - if (sheet.names[name]) { // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - oldformula = v1; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = v2 + - SocialCalc.ReplaceFormulaCoords(v1, movedto); - if (saveundo && sheet.names[name].definition != oldformula) { // save changes - changes.AddUndo("name define "+name+" "+oldformula); - } - } - } - - attribs.needsrecalc = "yes"; - break; - - case "name": - what = cmd.NextToken(); - name = cmd.NextToken(); - rest = cmd.RestOfString(); - - name = name.toUpperCase().replace(/[^A-Z0-9_\.]/g, ""); - if (name == "") break; // must have something - - if (what == "define") { - if (rest == "") break; // must have something - if (sheet.names[name]) { // already exists - if (saveundo) changes.AddUndo("name define "+name+" "+sheet.names[name].definition); - sheet.names[name].definition = rest; - } - else { // new - if (saveundo) changes.AddUndo("name delete "+name); - sheet.names[name] = {definition: rest, desc: ""}; - } - } - else if (what == "desc") { - if (sheet.names[name]) { // must already exist - if (saveundo) changes.AddUndo("name desc "+name+" "+sheet.names[name].desc); - sheet.names[name].desc = rest; - } - } - else if (what == "delete") { - if (saveundo) { - if (sheet.names[name].desc) changes.AddUndo("name desc "+name+" "+sheet.names[name].desc); - changes.AddUndo("name define "+name+" "+sheet.names[name].definition); - } - delete sheet.names[name]; - } - attribs.needsrecalc = "yes"; - - break; - - case "recalc": - attribs.needsrecalc = "yes"; // request recalc - sheet.recalconce = true; // even if turned off - break; - - case "redisplay": - sheet.renderneeded = true; - break; - - case "changedrendervalues": // needed for undo sometimes - sheet.changedrendervalues = true; - break; - - case "startcmdextension": // startcmdextension extension rest-of-command - name = cmd.NextToken(); - cmdextension = SocialCalc.SheetCommandInfo.CmdExtensionCallbacks[name]; - if (cmdextension) { - cmdextension.func(name, cmdextension.data, sheet, cmd, saveundo); - } - break; - - default: - errortext = scc.s_escUnknownCmd+cmdstr; - break; - } - -/* For Debugging: -var ustack=""; -for (var i=0;i=0; i--) { // do them backwards - if (cmdstr) cmdstr += "\n"; // concatenate with separate lines - cmdstr += tos.undo[i]; - } - sheet.changes.Undo(); - sheet.ScheduleSheetCommands(cmdstr, false); // do undo operations - - } - -SocialCalc.SheetRedo = function(sheet) { - - var tos, i; - var didredo = sheet.changes.Redo(); - if (!didredo) { - sheet.ScheduleSheetCommands("", false); // schedule doing nothing - return; - } - tos = sheet.changes.TOS(); - var cmdstr = ""; - - for (i=0; tos && i= 0) { // quotes to double - updatedformula += '"' + ttext.replace(/"/, '""') + '"'; - } - else updatedformula += '"' + ttext + '"'; - } - else if (ttype == token_op) { - updatedformula += tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } - else { // leave everything else alone - updatedformula += ttext; - } - } - - return updatedformula; - - } - -// -// updatedformula = SocialCalc.AdjustFormulaCoords(formula, col, coloffset, row, rowoffset) -// -// Change all cell references to cells starting with col/row by offsets -// - -SocialCalc.AdjustFormulaCoords = function(formula, col, coloffset, row, rowoffset) { - - var ttype, ttext, i, newcr; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i=0; i=") - } - if (ttype == token_coord) { - cr = SocialCalc.coordToCr(ttext); - if ((coloffset < 0 && cr.col >= col && cr.col < col-coloffset) || - (rowoffset < 0 && cr.row >= row && cr.row < row-rowoffset)) { // refs to deleted cells become invalid - if (!sheetref) { - cr.col = 0; - cr.row = 0; - } - } - if (!sheetref) { - if (cr.col >= col) { - cr.col += coloffset; - } - if (cr.row >= row) { - cr.row += rowoffset; - } - } - if (ttext.charAt(0)=="$") { - newcr = "$"+SocialCalc.rcColname(cr.col); - } - else { - newcr = SocialCalc.rcColname(cr.col); - } - if (ttext.indexOf("$", 1)!=-1) { - newcr += "$" + cr.row; - } - else { - newcr += cr.row; - } - if (cr.row < 1 || cr.col < 1) { - newcr = "#REF!"; - } - ttext = newcr; - } - else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { // quotes to double - ttext = '"' + ttext.replace(/"/, '""') + '"'; - } - else ttext = '"' + ttext + '"'; - } - updatedformula += ttext; - } - - return updatedformula; - - } - -// -// updatedformula = SocialCalc.ReplaceFormulaCoords(formula, movedto) -// -// Change all cell references to cells that are keys in moveto to be to moveto[coord]. -// Don't change references to other sheets. -// Handle range extents specially. -// - -SocialCalc.ReplaceFormulaCoords = function(formula, movedto) { - - var ttype, ttext, i, newcr, coord; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i=0; i=") - } - if (ttype == token_coord) { - cr = SocialCalc.coordToCr(ttext); // get parts - coord = SocialCalc.crToCoord(cr.col, cr.row); // get "clean" reference - if (movedto[coord] && !sheetref) { // this is a reference to a moved cell - cr = SocialCalc.coordToCr(movedto[coord]); // get new row and col - if (ttext.charAt(0)=="$") { // copy absolute ref marks if present - newcr = "$"+SocialCalc.rcColname(cr.col); - } - else { - newcr = SocialCalc.rcColname(cr.col); - } - if (ttext.indexOf("$", 1)!=-1) { - newcr += "$" + cr.row; - } - else { - newcr += cr.row; - } - ttext = newcr; - } - } - else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { // quotes to double - ttext = '"' + ttext.replace(/"/, '""') + '"'; - } - else ttext = '"' + ttext + '"'; - } - updatedformula += ttext; - } - - return updatedformula; - - } - - -// ************************ -// -// Recalc Loop Code -// -// ************************ - -// -// How recalc works: -// -// !!!!!!!!!!!!!! -// - -// SocialCalc.RecalcInfo - object with global recalc info - -SocialCalc.RecalcInfo = { - - sheet: null, // which sheet is being recalced - - currentState: 0, // current state - state: {start_calc: 1, order: 2, calc: 3, start_wait: 4, done_wait: 5}, // allowed state values - - recalctimer: null, // value to cancel timer - maxtimeslice: 100, // maximum milliseconds per slice of recalc time before a wait - timeslicedelay: 1, // milliseconds to wait between recalc time slices - starttime: 0, // when recalc started - - // LoadSheet: a function that returns true if started a load or false if not. - // - - LoadSheet: function(sheetname) {return false;} // default returns not found - - } - -// SocialCalc.RecalcData - object with recalc info while determining recalc order and afterward - -SocialCalc.RecalcData = function() { // initialize a RecalcData object - - this.inrecalc = true; // if true, doing a recalc - this.celllist = []; // list with all potential cells to calculate - this.celllistitem = 0; // cell to check next when ordering - this.calclist = null; // object which is the chained list of cells to calculate - // each in the form of "coord: nextcoord" - // e.g., if B8 is calculated right after A8, then calclist.A8=="B8" - // if null, need to create the list - this.calclistlength = 0; // number of items in calclist - - this.firstcalc = null; // start of the calc list - a string or null - this.lastcalc = null; // last one on chain (used to add more to the end) - - this.nextcalc = null; // used to keep track during background recalc to make it restartable - this.count = 0; // number calculated - - // checkinfo is used when determining calc order: - - this.checkinfo = {}; // attributes are coords; if no attrib for a coord, it wasn't checked or doesn't need it - // values are RecalcCheckInfo objects while checking or TRUE when complete - - } - -// SocialCalc.RecalcCheckInfo - object that stores checking info while determining recalc order - -SocialCalc.RecalcCheckInfo = function() { // initialize a RecalcCheckInfo object - - this.oldcoord = null; // chain back up of cells referring to cells - this.parsepos = 0; // which token we are up to - - // range info - - this.inrange = false; // if true, in the process of checking a range of coords - this.inrangestart = false; // if true, have not yet filled in range loop values - this.cr1 = null; // range first coord as a cr object - this.cr2 = null; // range second coord as a cr object - this.c1 = null; // range extents - this.c2 = null; - this.r1 = null; - this.r2 = null; - this.c = null; // looping values - this.r = null; - - } - -// Recalc the entire sheet - -SocialCalc.RecalcSheet = function(sheet) { - - var coord, err, recalcdata; - var scri = SocialCalc.RecalcInfo; - - delete sheet.attribs.circularreferencecell; // reset recalc-wide things - SocialCalc.Formula.FreshnessInfoReset(); - - SocialCalc.RecalcClearTimeout(); - - scri.sheet = sheet; // set values needed by background recalc - scri.currentState = scri.state.start_calc; - - scri.starttime = new Date(); - - if (sheet.statuscallback) { - sheet.statuscallback(scri, "calcstart", null, sheet.statuscallbackparams); - } - - SocialCalc.RecalcSetTimeout(); - - } - -// -// SocialCalc.RecalcSetTimeout - set a timer for next recalc step -// - -SocialCalc.RecalcSetTimeout = function() { - - var scri = SocialCalc.RecalcInfo; - - scri.recalctimer = window.setTimeout(SocialCalc.RecalcTimerRoutine, scri.timeslicedelay); - - } - -// -// SocialCalc.RecalcClearTimeout - cancel any timeouts -// - -SocialCalc.RecalcClearTimeout = function() { - - var scri = SocialCalc.RecalcInfo; - - if (scri.recalctimer) { - window.clearTimeout(scri.recalctimer); - scri.recalctimer = null; - } - - } - - -// -// SocialCalc.RecalcLoadedSheet(sheetname, str, recalcneeded) -// -// Called when a sheet finishes loading with name, string, and t/f whether it should be recalced. -// If loaded sheet has sheet.attribs.recalc=="off", then no recalc done. -// If sheetname is null, then the sheetname waiting for will be used. -// - -SocialCalc.RecalcLoadedSheet = function(sheetname, str, recalcneeded) { - - var sheet; - var scri = SocialCalc.RecalcInfo; - var scf = SocialCalc.Formula; - - sheet = SocialCalc.Formula.AddSheetToCache(sheetname || scf.SheetCache.waitingForLoading, str); - - if (recalcneeded && sheet && sheet.attribs.recalc!="off") { // if recalcneeded, and not manual sheet, chain in this new sheet to recalc loop - sheet.previousrecalcsheet = scri.sheet; - scri.sheet = sheet; - scri.currentState = scri.state.start_calc; - } - scf.SheetCache.waitingForLoading = null; - - SocialCalc.RecalcSetTimeout(); - - } - - -// -// SocialCalc.RecalcTimerRoutine - handles the actual order determination and cell-by-cell recalculation in the background -// - -SocialCalc.RecalcTimerRoutine = function() { - - var eresult, cell, coord, err, status; - var starttime = new Date(); - var count = 0; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var scri = SocialCalc.RecalcInfo; - var sheet = scri.sheet; - if (!sheet) { - return; - } - var recalcdata = sheet.recalcdata; - - var do_statuscallback = function(status, arg) { // routine to do callback if required - if (sheet.statuscallback) { - sheet.statuscallback(recalcdata, status, arg, sheet.statuscallbackparams); - } - } - - SocialCalc.RecalcClearTimeout(); - - if (scri.currentState == scri.state.start_calc) { - - recalcdata = new SocialCalc.RecalcData(); - sheet.recalcdata = recalcdata; - - for (coord in sheet.cells) { // get list of cells to check for order - if (!coord) continue; - recalcdata.celllist.push(coord); - } - - recalcdata.calclist = {}; // start with empty list - scri.currentState = scri.state.order; // drop through to determining recalc order - } - - if (scri.currentState == scri.state.order) { - while (recalcdata.celllistitem < recalcdata.celllist.length) { // check all the cells to see if they should be on the list - coord = recalcdata.celllist[recalcdata.celllistitem++]; - err = SocialCalc.RecalcCheckCell(sheet, coord); - if (((new Date()) - starttime) >= scri.maxtimeslice) { // if taking too long, give up CPU for a while - do_statuscallback("calcorder", {coord: coord, total: recalcdata.celllist.length, count: recalcdata.celllistitem}); - SocialCalc.RecalcSetTimeout(); - return; - } - } - - do_statuscallback("calccheckdone", recalcdata.calclistlength); - - recalcdata.nextcalc = recalcdata.firstcalc; // start at the beginning of the recalc chain - scri.currentState = scri.state.calc; // loop through cells on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - if (scri.currentState == scri.state.start_wait) { // starting to wait for something - scri.currentState = scri.state.done_wait; // finished on next timer call - if (scri.LoadSheet) { - status = scri.LoadSheet(scf.SheetCache.waitingForLoading); - if (status) { // started a load operation - return; - } - } - SocialCalc.RecalcLoadedSheet(null, "", false); - return; - } - - if (scri.currentState == scri.state.done_wait) { - scri.currentState = scri.state.calc; // loop through cells on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - // otherwise should be scri.state.calc - - if (scri.currentState != scri.state.calc) { - alert("Recalc state error: "+scri.currentState+". Error in SocialCalc code."); - } - - coord = sheet.recalcdata.nextcalc; - while (coord) { - cell = sheet.cells[coord]; - eresult = scf.evaluate_parsed_formula(cell.parseinfo, sheet, false); - if (scf.SheetCache.waitingForLoading) { // wait until restarted - recalcdata.nextcalc = coord; // start with this cell again - recalcdata.count += count; - do_statuscallback("calcloading", {sheetname: scf.SheetCache.waitingForLoading}); - scri.currentState = scri.state.start_wait; // start load on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - if (scf.RemoteFunctionInfo.waitingForServer) { // wait until restarted - recalcdata.nextcalc = coord; // start with this cell again - recalcdata.count += count; - do_statuscallback("calcserverfunc", - {funcname: scf.RemoteFunctionInfo.waitingForServer, coord: coord, total: recalcdata.calclistlength, count: recalcdata.count}); - scri.currentState = scri.state.done_wait; // start load on next timer call - return; // return and wait for next recalc timer event - } - - if (cell.datavalue != eresult.value || - cell.valuetype != eresult.type) { // only update if changed from last time - cell.datavalue = eresult.value; - cell.valuetype = eresult.type; - delete cell.displaystring; - sheet.recalcchangedavalue = true; // remember something changed in case other code wants to know - } - if (eresult.error) { - cell.errors = eresult.error; - } - count++; - coord = sheet.recalcdata.calclist[coord]; - - if (((new Date()) - starttime) >= scri.maxtimeslice) { // if taking too long, give up CPU for a while - recalcdata.nextcalc = coord; // start with next cell on chain - recalcdata.count += count; - do_statuscallback("calcstep", {coord: coord, total: recalcdata.calclistlength, count: recalcdata.count}); - SocialCalc.RecalcSetTimeout(); - return; - } - } - - recalcdata.inrecalc = false; - - delete sheet.recalcdata; // save memory and clear out for name lookup formula evaluation - - delete sheet.attribs.needsrecalc; // remember recalc done - - scri.sheet = sheet.previousrecalcsheet || null; // chain back if doing recalc of loaded sheets - if (scri.sheet) { - scri.currentState = scri.state.calc; // start where we left off - SocialCalc.RecalcSetTimeout(); - return; - } - - scf.FreshnessInfo.recalc_completed = true; // say freshness info is complete - - do_statuscallback("calcfinished", (new Date()) - scri.starttime); - - } - - -// -// circref = SocialCalc.RecalcCheckCell(sheet, coord) -// -// Checks cell to put on calclist, looking at parsed tokens. -// Also checks cells this cell is dependent upon -// if it contains a formula with cell references. -// If circular reference, returns non-null. -// - -SocialCalc.RecalcCheckCell = function(sheet, startcoord) { - - var parseinfo, ttext, ttype, i, rangecoord, circref, value, pos, pos2, cell, coordvals; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_name = tokentype.name; - var token_coord = tokentype.coord; - - var recalcdata = sheet.recalcdata; - var checkinfo = recalcdata.checkinfo; - - var sheetref = false; // if true, a sheet reference is in effect, so don't check that - var oldcoord = null; // coord of formula that referred to this one when checking down the tree - var coord = startcoord; // the coord of the cell we are checking - - // Start with requested cell, and then continue down or up the dependency tree - // oldcoord (and checkinfo[coord].oldcoord) maintains the reference stack during the tree walk - // checkinfo[coord] maintains the stack of checking looping values, e.g., token number being checked - -mainloop: - while (coord) { - cell = sheet.cells[coord]; - coordvals = checkinfo[coord]; - - if (!cell || cell.datatype != "f" || // Don't calculate if not a formula - (coordvals && typeof coordvals != "object")) { // Don't calc if already calculated - coord = oldcoord; // go back up dependency tree to coord that referred to us - if (checkinfo[coord]) oldcoord = checkinfo[coord].oldcoord; - continue; - } - - if (!coordvals) { // do we have checking information about this cell? - coordvals = new SocialCalc.RecalcCheckInfo(); // no - make a place to hold it - checkinfo[coord] = coordvals; - } - - if (cell.errors) { // delete errors from previous recalcs - delete cell.errors; - } - - if (!cell.parseinfo) { // cache parsed formula - cell.parseinfo = scf.ParseFormulaIntoTokens(cell.formula); - } - parseinfo = cell.parseinfo; - - for (i=coordvals.parsepos; i coordvals.cr2.col) { coordvals.c1 = coordvals.cr2.col; coordvals.c2 = coordvals.cr1.col; } - else { coordvals.c1 = coordvals.cr1.col; coordvals.c2 = coordvals.cr2.col; } - coordvals.c = coordvals.c1 - 1; // start one before - - if (coordvals.cr1.row > coordvals.cr2.row) { coordvals.r1 = coordvals.cr2.row; coordvals.r2 = coordvals.cr1.row; } - else { coordvals.r1 = coordvals.cr1.row; coordvals.r2 = coordvals.cr2.row; } - coordvals.r = coordvals.r1; // start on this row - coordvals.inrangestart = false; - } - else { // not first time - } - coordvals.c += 1; // increment column - if (coordvals.c > coordvals.c2) { // finished the columns of this row - coordvals.r += 1; // increment row - if (coordvals.r > coordvals.r2) { // finished checking the entire range - coordvals.inrange = false; - continue; - } - coordvals.c = coordvals.c1; // start at the beginning of next row - } - rangecoord = SocialCalc.crToCoord(coordvals.c, coordvals.r); - - // now check that one - - coordvals.parsepos = i; // remember our position - coordvals.oldcoord = oldcoord; // remember back up chain - oldcoord = coord; // come back to us - coord = rangecoord; - if (checkinfo[coord] && typeof checkinfo[coord] == "object") { // Circular reference - cell.errors = SocialCalc.Constants.s_caccCircRef+startcoord; // set on original cell making the ref - checkinfo[startcoord] = true; // this one should be calculated once at this point - if (!recalcdata.firstcalc) { - recalcdata.firstcalc = startcoord; - } - else { - recalcdata.calclist[recalcdata.lastcalc] = startcoord; - } - recalcdata.lastcalc = startcoord; - recalcdata.calclistlength++; // count number on list - sheet.attribs.circularreferencecell = coord+"|"+oldcoord; // remember at least one circ ref - return cell.errors; - } - continue mainloop; - } - - ttype = parseinfo[i].type; // get token details - ttext = parseinfo[i].text; - if (ttype == token_op) { // references with sheet specifier are not checked - if (ttext == "!") { - sheetref = true; // found a sheet reference - } - else if (ttext != ":") { // for everything but a range, reset - sheetref = false; - } - } - - if (ttype == token_name) { // look for named range - value = scf.LookupName(sheet, ttext); - if (value.type == "range") { // only need to recurse here for range, which may be just one cell - pos = value.value.indexOf("|"); - if (pos != -1) { // range - check each cell - coordvals.cr1 = SocialCalc.coordToCr(value.value.substring(0,pos)); - pos2 = value.value.indexOf("|", pos+1); - coordvals.cr2 = SocialCalc.coordToCr(value.value.substring(pos+1,pos2)); - coordvals.inrange = true; - coordvals.inrangestart = true; - i = i-1; // back up so will start up again here - continue; - } - } - else if (value.type == "coord") { // just a coord - ttype = token_coord; // treat as a coord inline - ttext = value.value; // and then drop through to next test which should succeed - } - else { // not a defined name - probably a function - } - } - - if (ttype == token_coord) { // token is a coord - - if (i >= 2 // look for a range - && parseinfo[i-1].type == token_op && parseinfo[i-1].text == ':' - && parseinfo[i-2].type == token_coord - && !sheetref) { // Range -- check each cell - coordvals.cr1 = SocialCalc.coordToCr(parseinfo[i-2].text); // remember range extents - coordvals.cr2 = SocialCalc.coordToCr(ttext); - coordvals.inrange = true; // next time use the range looping code - coordvals.inrangestart = true; - i = i-1; // back up so will start up again here - continue; - } - - else if (!sheetref) { // Single cell reference - if (ttext.indexOf("$") != -1) ttext = ttext.replace(/\$/g, ""); // remove any $'s - coordvals.parsepos = i+1; // remember our position - come back on next token - coordvals.oldcoord = oldcoord; // remember back up chain - oldcoord = coord; // come back to us - coord = ttext; - if (checkinfo[coord] && typeof checkinfo[coord] == "object") { // Circular reference - cell.errors = SocialCalc.Constants.s_caccCircRef+startcoord; // set on original cell making the ref - checkinfo[startcoord] = true; // this one should be calculated once at this point - if (!recalcdata.firstcalc) { // add to calclist - recalcdata.firstcalc = startcoord; - } - else { - recalcdata.calclist[recalcdata.lastcalc] = startcoord; - } - recalcdata.lastcalc = startcoord; - recalcdata.calclistlength++; // count number on list - sheet.attribs.circularreferencecell = coord+"|"+oldcoord; // remember at least one circ ref - return cell.errors; - } - continue mainloop; - } - } - } - - sheetref = false; // make sure off when bump back up - - checkinfo[coord] = true; // this one is finished - if (!recalcdata.firstcalc) { // add to calclist - recalcdata.firstcalc = coord; - } - else { - recalcdata.calclist[recalcdata.lastcalc] = coord; - } - recalcdata.lastcalc = coord; - recalcdata.calclistlength++; // count number on list - - coord = oldcoord; // go back to the formula that referred to us and continue - oldcoord = checkinfo[coord] ? checkinfo[coord].oldcoord : null; - - } - - return ""; - - } - - -// ************************************* -// -// Parse class: -// -// Used by ExecuteSheetCommand to get elements of commands to execute. -// The string it works with consists of one or more lines each -// made up of one or more tokens separated by a delimiter. -// -// ************************************* - -// Initialize: set string to work with - -SocialCalc.Parse = function(str) { - - // properties: - - this.str = str; - this.pos = 0; - this.delimiter = " "; - this.lineEnd = str.indexOf("\n"); - if (this.lineEnd < 0) { - this.lineEnd = str.length; - } - - } - -// Return next token as a string - -SocialCalc.Parse.prototype.NextToken = function() { - if (this.pos < 0) return ""; - var pos2 = this.str.indexOf(this.delimiter, this.pos); - var pos1 = this.pos; - if (pos2 > this.lineEnd) { // don't go past end of line - pos2 = this.lineEnd; - } - if (pos2 >= 0) { - this.pos = pos2 + 1; - return this.str.substring(pos1, pos2); - } - else { - this.pos = this.lineEnd; - return this.str.substring(pos1, this.lineEnd); - } - } - -// Return everything from current point until end of line - -SocialCalc.Parse.prototype.RestOfString = function() { - var oldpos = this.pos; - if (this.pos < 0 || this.pos >= this.lineEnd) return ""; - this.pos = this.lineEnd; - return this.str.substring(oldpos, this.lineEnd); - } - -SocialCalc.Parse.prototype.RestOfStringNoMove = function() { - if (this.pos < 0 || this.pos >= this.lineEnd) return ""; - return this.str.substring(this.pos, this.lineEnd); - } - -// Move current point to next line - -SocialCalc.Parse.prototype.NextLine = function() { - this.pos = this.lineEnd + 1; - this.lineEnd = this.str.indexOf("\n", this.pos); - if (this.lineEnd < 0) { - this.lineEnd = this.str.length; - } - } - -// Check to see if at end of string with no more to process - -SocialCalc.Parse.prototype.EOF = function() { - if (this.pos < 0 || this.pos >= this.str.length) return true; - return false; - } - - -// ************************************* -// -// UndoStack class: -// -// Implements the behavior needed for a normal application's undo/redo stack. -// You add a new change sequence with PushChange. -// The type argument is a string that can be used to lookup some general string -// like "typing" or "setting attribute" for the menu prompts for undo/redo. -// -// You add the "do" steps with AddDo. The non-null, non-undefined arguments are -// joined together with " " to make a command string to be saved. -// -// You add the undo steps as commands for the most recent change with AddUndo. -// The non-null, non-undefined arguments are joined together with " " to make -// a command string to be saved. -// -// The Undo and Redo functions move the Top Of Stack pointer through the changes stack -// so you can undo and redo. Doing a new PushChange removes all undone items -// after TOS. -// -// You can push more things than you can undo if you want. -// There is a maximum to remember as the "did" stack for an audit trail (and as redo). This may be unlimited. -// There is a separate maximum to remember that can be undone. This may be smaller than maxRedo. -// -// ************************************* - -SocialCalc.UndoStack = function() { - - // properties: - - this.stack = []; // {command: [], type: type, undo: []} -- multiple dos and undos allowed - this.tos = -1; // top of stack position, used for undo/redo - this.maxRedo = 0; // Maximum size of redo stack (and audit trail which is this.stack[n].command) or zero if no limit - this.maxUndo = 50; // Maximum number of steps kept for undo (usually the memory intensive part) or zero if no limit - - } - -SocialCalc.UndoStack.prototype.PushChange = function(type) { // adding a new thing to the stack - while (this.stack.length > 0 && this.stack.length-1 > this.tos) { // pop off things not redone - this.stack.pop(); - } - this.stack.push({command: [], type: type, undo: []}); - if (this.maxRedo && this.stack.length > this.maxRedo) { // limit number kept as audit trail - this.stack.shift(); // remove the extra one - } - if (this.maxUndo && this.stack.length > this.maxUndo) { // need to trim excess undo info - this.stack[this.stack.length - this.maxUndo - 1].undo = []; // only need to remove one - } - this.tos = this.stack.length - 1; - } - -SocialCalc.UndoStack.prototype.AddDo = function() { - var args = []; - for (var i=0; i= 0) return this.stack[this.tos]; - else return null; - } - -SocialCalc.UndoStack.prototype.Undo = function() { - if (this.tos >= 0 && (!this.maxUndo || this.tos > this.stack.length - this.maxUndo - 1)) { - this.tos -= 1; - return true; - } - else { - return false; - } - } - -SocialCalc.UndoStack.prototype.Redo = function() { - if (this.tos < this.stack.length-1) { - this.tos += 1; - return true; - } - else { - return false; - } - } - -// ************************************* -// -// Clipboard Object: -// -// This is a single object. -// Stores the clipboard, which is shared by all active sheets. -// Like the undo stack, it does not persist from one editing session to another. -// -// ************************************* - -SocialCalc.Clipboard = { - - // properties: - - clipboard: "" // empty or string in save format with "copiedfrom:" set to a range - - } - - -// ************************************* -// -// RenderContext class: -// -// ************************************* - -SocialCalc.RenderContext = function(sheetobj) { - - var parts, num, s; - var attribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - // properties: - - this.sheetobj = sheetobj; - this.hideRowsCols = false; // Rendering with panes only works with "false" - // !!!! Note: not implemented yet in rendering, just saved as an attribute - this.showGrid = false; - this.showRCHeaders = false; - this.rownamewidth = scc.defaultRowNameWidth; - this.pixelsPerRow = scc.defaultAssumedRowHeight; - - this.cellskip = {}; // if present, coord of cell covering this cell - this.coordToCR = {}; // for cells starting spans, coordToCR[coord]={row:row, col:col} - this.colwidth = []; // precomputed column widths, taking into account defaults - this.totalwidth = 0; // precomputed total table width - - this.rowpanes = []; // for each pane, {first: firstrow, last: lastrow} - this.colpanes = []; // for each pane, {first: firstrow, last: lastrow} - this.maxcol=0; // max col and row to display, adding long spans, etc. - this.maxrow=0; - - this.highlights = {}; // for each cell with special display: coord:highlightType (see this.highlightTypes) - this.cursorsuffix = ""; // added to highlights[cr]=="cursor" to get type to lookup - - this.highlightTypes = // attributes to change when highlit - { - cursor: {style: scc.defaultHighlightTypeCursorStyle, className: scc.defaultHighlightTypeCursorClass}, - range: {style: scc.defaultHighlightTypeRangeStyle, className: scc.defaultHighlightTypeRangeClass}, - cursorinsertup: {style: "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-x;backgroundPosition:top left;backgroundImage:url("+scc.defaultImagePrefix+"cursorinsertup.gif);", className: scc.defaultHighlightTypeCursorClass}, - cursorinsertleft: {style: "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-y;backgroundPosition:top left;backgroundImage:url("+scc.defaultImagePrefix+"cursorinsertleft.gif);", className: scc.defaultHighlightTypeCursorClass}, - range2: {style: "color:#000;backgroundColor:#FFF;backgroundImage:url("+scc.defaultImagePrefix+"range2.gif);", className: ""} - } - - this.cellIDprefix = scc.defaultCellIDPrefix; // if non-null, each cell will render with an ID - - this.defaultlinkstyle = null; // default linkstyle object (allows you to pass values to link renderer) - this.defaultHTMLlinkstyle = {type: "html"}; // default linkstyle for standalone HTML - - // constants: - - this.defaultfontstyle = scc.defaultCellFontStyle; - this.defaultfontsize = scc.defaultCellFontSize; - this.defaultfontfamily = scc.defaultCellFontFamily; - - this.defaultlayout = scc.defaultCellLayout; - - this.defaultpanedividerwidth = scc.defaultPaneDividerWidth; - this.defaultpanedividerheight = scc.defaultPaneDividerHeight; - - this.gridCSS = scc.defaultGridCSS; - - this.commentClassName = scc.defaultCommentClass; // for cells with non-blank comments when this.showGrid is true - this.commentCSS = scc.defaultCommentStyle; // any combination of classnames and styles may be used - this.commentNoGridClassName = scc.defaultCommentNoGridClass; // for cells when this.showGrid is false - this.commentNoGridCSS = scc.defaultCommentNoGridStyle; // any combination of classnames and styles may be used - - this.classnames = // any combination of classnames and explicitStyles can be used - { - colname: scc.defaultColnameClass, - rowname: scc.defaultRownameClass, - selectedcolname: scc.defaultSelectedColnameClass, - selectedrowname: scc.defaultSelectedRownameClass, - upperleft: scc.defaultUpperLeftClass, - skippedcell: scc.defaultSkippedCellClass, - panedivider: scc.defaultPaneDividerClass - }; - - this.explicitStyles = // these may be used so you won't need a stylesheet with the classnames - { - colname: scc.defaultColnameStyle, - rowname: scc.defaultRownameStyle, - selectedcolname: scc.defaultSelectedColnameStyle, - selectedrowname: scc.defaultSelectedRownameStyle, - upperleft: scc.defaultUpperLeftStyle, - skippedcell: scc.defaultSkippedCellStyle, - panedivider: scc.defaultPaneDividerStyle - }; - - // processed info about cell skipping - - this.cellskip = null; - this.needcellskip = true; - - // precomputed values, filling in defaults indicated by "*" - - this.fonts=[]; // for each fontnum, {style: fs, weight: fw, size: fs, family: ff} - this.layouts=[]; // for each layout, "padding:Tpx Rpx Bpx Lpx;vertical-align:va;" - - this.needprecompute = true; // need to call PrecomputeSheetFontsAndLayouts - - // if have a sheet object, initialize constants and precomputed values - - if (sheetobj) { - this.rowpanes[0] = {first: 1, last: attribs.lastrow}; - this.colpanes[0] = {first: 1, last: attribs.lastcol}; - - } - else throw scc.s_rcMissingSheet; - - } - -// Methods: - -SocialCalc.RenderContext.prototype.PrecomputeSheetFontsAndLayouts = function() {SocialCalc.PrecomputeSheetFontsAndLayouts(this);}; -SocialCalc.RenderContext.prototype.CalculateCellSkipData = function() {SocialCalc.CalculateCellSkipData(this);}; -SocialCalc.RenderContext.prototype.CalculateColWidthData = function() {SocialCalc.CalculateColWidthData(this);}; -SocialCalc.RenderContext.prototype.SetRowPaneFirstLast = function(panenum, first, last) {this.rowpanes[panenum]={first:first, last:last};}; -SocialCalc.RenderContext.prototype.SetColPaneFirstLast = function(panenum, first, last) {this.colpanes[panenum]={first:first, last:last};}; -SocialCalc.RenderContext.prototype.CoordInPane = function(coord, rowpane, colpane) {return SocialCalc.CoordInPane(this, coord, rowpane, colpane);}; -SocialCalc.RenderContext.prototype.CellInPane = function(row, col, rowpane, colpane) {return SocialCalc.CellInPane(this, row, col, rowpane, colpane);}; -SocialCalc.RenderContext.prototype.InitializeTable = function(tableobj) {SocialCalc.InitializeTable(this, tableobj);}; -SocialCalc.RenderContext.prototype.RenderSheet = function(oldtable, linkstyle) {return SocialCalc.RenderSheet(this, oldtable, linkstyle);}; -SocialCalc.RenderContext.prototype.RenderColGroup = function() {return SocialCalc.RenderColGroup(this);}; -SocialCalc.RenderContext.prototype.RenderColHeaders = function() {return SocialCalc.RenderColHeaders(this);}; -SocialCalc.RenderContext.prototype.RenderSizingRow = function() {return SocialCalc.RenderSizingRow(this);}; -SocialCalc.RenderContext.prototype.RenderRow = function(rownum, rowpane, linkstyle) {return SocialCalc.RenderRow(this, rownum, rowpane, linkstyle);}; -SocialCalc.RenderContext.prototype.RenderSpacingRow = function() {return SocialCalc.RenderSpacingRow(this);}; -SocialCalc.RenderContext.prototype.RenderCell = function(rownum, colnum, rowpane, colpane, noElement, linkstyle) - {return SocialCalc.RenderCell(this, rownum, colnum, rowpane, colpane, noElement, linkstyle);}; - -// Functions: - -SocialCalc.PrecomputeSheetFontsAndLayouts = function(context) { - - var defaultfont, parts, layoutre, dparts, sparts, num, s, i; - var sheetobj = context.sheetobj; - var attribs = sheetobj.attribs; - - if (attribs.defaultfont) { - defaultfont = sheetobj.fonts[attribs.defaultfont]; - defaultfont = defaultfont.replace(/^\*/,SocialCalc.Constants.defaultCellFontStyle); - defaultfont = defaultfont.replace(/(.+)\*(.+)/,"$1"+SocialCalc.Constants.defaultCellFontSize+"$2"); - defaultfont = defaultfont.replace(/\*$/,SocialCalc.Constants.defaultCellFontFamily); - parts=defaultfont.match(/^(\S+? \S+?) (\S+?) (\S.*)$/); - context.defaultfontstyle = parts[1]; - context.defaultfontsize = parts[2]; - context.defaultfontfamily = parts[3]; - } - - for (num=1; num1 || rowspan>1) { - for (skiprow=row; skiprowcontext.maxrow) maxrow=skiprow; - if (skipcol>context.maxcol) maxcol=skipcol; - } - } - } - } - } - - context.needcellskip = false; - - } - -SocialCalc.CalculateColWidthData = function(context) { - - var colnum, colname, colwidth, totalwidth; - - var sheetobj=context.sheetobj; - var sheetcolattribs=sheetobj.colattribs; - - // Calculate column width data - - totalwidth=context.showRCHeaders ? context.rownamewidth-0 : 0; - for (colpane=0; colpane0)) ? (colwidth-0) : 10; - } - } - context.totalwidth = totalwidth; - - } - -SocialCalc.InitializeTable = function(context, tableobj) { - -/* - -Uses border-collapse so corners don't have holes -Note: IE and Firefox handle differently (IE adds borders and padding) -under border-collapse and Safari has problems with and wide text -Tablelayout "fixed" also leads to problems - -*/ - -/* - -*** Discussion *** - -The rendering assumes fixed column widths, even though SocialCalc allows "auto". -There may be issues with "auto" and it is hard to make it work cross-browser -with border-collapse, etc. - -This and the RenderSheet routine are where in the code the specifics of -table attributes and column size definitions are set. As the browsers settle down -and when we decide if we don't need auto width, we may want to revisit the way the -code does this (e.g., use table-layout:fixed). - -*/ - tableobj.style.borderCollapse="collapse"; - tableobj.cellSpacing="0"; - tableobj.cellPadding="0"; - - tableobj.style.width=context.totalwidth+"px"; - - } - -// -// tableobj = SocialCalc.RenderSheet(context, oldtable, linkstyle) -// -// Renders a render context returning a DOM table object. -// If there is an oldtable object, it replaces it in the parent node. -// If oldtable is null, it just returns the new one. -// The linkstyle is "" or null for editing rendering -// and optionally an object passed on to formatting code. -// - -SocialCalc.RenderSheet = function(context, oldtable, linkstyle) { - - var newrow, rowpane; - var tableobj, colgroupobj, tbodyobj, parentnode; - - // do precompute stuff if necessary - - if (context.sheetobj.changedrendervalues) { - context.needcellskip = true; - context.needprecompute = true; - context.sheetobj.changedrendervalues = false; - } - if (context.needcellskip) { - context.CalculateCellSkipData(); - } - if (context.needprecompute) { - context.PrecomputeSheetFontsAndLayouts(); - } - - context.CalculateColWidthData(); // always make sure col width values are up to date - - // make the table element and fill it in - - tableobj=document.createElement("table"); - context.InitializeTable(tableobj); - - colgroupobj=context.RenderColGroup(); - tableobj.appendChild(colgroupobj); - - tbodyobj=document.createElement("tbody"); - - tbodyobj.appendChild(context.RenderSizingRow()); - - if (context.showRCHeaders) { - newrow=context.RenderColHeaders(); - if (newrow) tbodyobj.appendChild(newrow); - } - - for (rowpane=0; rowpane position in Safari) - if (!SocialCalc.Constants.SCNoRowName) { - newcol.innerHTML=rownum+""; - } - result.appendChild(newcol); - } - - for (colpane=0; colpane1) { - span=1; - for (num=1; num1) { - span=1; - for (num=1; num panerowlimits.last) return false; - if (col < panecollimits.first || col > panecollimits.last) return false; - return true; - } - -SocialCalc.CreatePseudoElement = function() { - return {style:{cssText:""}, innerHTML: "", className: ""}; - } - - -// ************************************* -// -// Misc. functions: -// -// ************************************* - -SocialCalc.rcColname = function(c) { - - if (c > 702) c = 702; // maximum number of columns - ZZ - if (c < 1) c = 1; - var collow = (c - 1) % 26 + 65; - var colhigh = Math.floor((c - 1) / 26); - if (colhigh) - return String.fromCharCode(colhigh + 64) + String.fromCharCode(collow); - else - return String.fromCharCode(collow); - } - -SocialCalc.letters = ["A","B","C","D","E","F","G","H","I","J","K","L","M", - "N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]; - -SocialCalc.crToCoord = function(c, r) { - var result; - if (c < 1) c = 1; - if (c > 702) c = 702; // maximum number of columns - ZZ - if (r < 1) r = 1; - var collow = (c - 1) % 26; - var colhigh = Math.floor((c - 1) / 26); - if (colhigh) - result = SocialCalc.letters[colhigh-1] + SocialCalc.letters[collow] + r; - else - result = SocialCalc.letters[collow] + r; - return result; - } - -SocialCalc.coordToCol = {}; // too expensive to set in crToCoord since that is called so many times -SocialCalc.coordToRow = {}; - -SocialCalc.coordToCr = function(cr) { - var c, i, ch; - var r = SocialCalc.coordToRow[cr]; - if (r) return {row: r, col: SocialCalc.coordToCol[cr]}; - c=0;r=0; - for (i=0; i=97) c = 26*c + ch-96; - else if (ch>=65) c = 26*c + ch-64; - } - SocialCalc.coordToCol[cr] = c; - SocialCalc.coordToRow[cr] = r; - return {row: r, col: c}; - - } - -SocialCalc.ParseRange = function(range) { - var pos, cr, cr1, cr2; - if (!range) range = "A1:A1"; // error return, hopefully benign - range = range.toUpperCase(); - pos = range.indexOf(":"); - if (pos>=0) { - cr = range.substring(0,pos); - cr1 = SocialCalc.coordToCr(cr); - cr1.coord = cr; - cr = range.substring(pos+1); - cr2 = SocialCalc.coordToCr(cr); - cr2.coord = cr; - } - else { - cr1 = SocialCalc.coordToCr(range); - cr1.coord = range; - cr2 = SocialCalc.coordToCr(range); - cr2.coord = range; - } - return {cr1: cr1, cr2: cr2}; - } - -SocialCalc.decodeFromSave = function(s) { - if (typeof s != "string") return s; - if (s.indexOf("\\")==-1) return s; // for performace reasons: replace nothing takes up time - var r=s.replace(/\\c/g,":"); - r=r.replace(/\\n/g,"\n"); - return r.replace(/\\b/g,"\\"); - } - -SocialCalc.decodeFromAjax = function(s) { - if (typeof s != "string") return s; - if (s.indexOf("\\")==-1) return s; // for performace reasons: replace nothing takes up time - var r=s.replace(/\\c/g,":"); - r=r.replace(/\\n/g,"\n"); - r=r.replace(/\\e/g,"]]"); - return r.replace(/\\b/g,"\\"); - } - -SocialCalc.encodeForSave = function(s) { - if (typeof s != "string") return s; - if (s.indexOf("\\")!=-1) // for performace reasons: replace nothing takes up time - s=s.replace(/\\/g,"\\b"); - if (s.indexOf(":")!=-1) - s=s.replace(/:/g,"\\c"); - if (s.indexOf("\n")!=-1) - s=s.replace(/\n/g,"\\n"); - return s; - } - -// -// Returns estring where &, <, >, " are HTML escaped -// -SocialCalc.special_chars = function(string) { - - if (/[&<>"]/.test(string)) { // only do "slow" replaces if something to replace - string = string.replace(/&/g, "&"); - string = string.replace(//g, ">"); - string = string.replace(/"/g, """); - } - return string; - - } - -SocialCalc.Lookup = function(value, list) { - - for (i=0; i value) { - if (i>0) return i-1; - else return null; - } - } - return list.length-1; // if all smaller, matches last - - } - -// -// setStyles(element, cssText) -// -// Takes a pseudo style string (e.g., text-align must be textAlign) and sets -// the element's style value for each style name listed (leaving others unchanged). -// OK to call with null cssText. -// - -SocialCalc.setStyles = function (element, cssText) { - - var parts, part, pos, name, value; - - if (!cssText) return; - - parts = cssText.split(";"); - for (part=0; part'+dvsc+''; - } - else if (valueformat=="text-link") { // more extensive link capabilities for regular web links - displayvalue = SocialCalc.expand_text_link(displayvalue, sheetobj, linkstyle, valueformat); - } - else if (valueformat=="text-image") { // text is a URL for an image - dvue = encodeURI(displayvalue); - displayvalue = ''; - } - else if (valueformat.substring(0,12)=="text-custom:") { // construct a custom text format: @r = text raw, @s = special chars, @u = url encoded - dvsc = SocialCalc.special_chars(displayvalue); // do special chars - dvsc = dvsc.replace(/ /g, "  "); // keep multiple spaces - dvsc = dvsc.replace(/\n/g, "
    "); // keep line breaks - dvue = encodeURI(displayvalue); - textval={}; - textval.r = displayvalue; - textval.s = dvsc; - textval.u = dvue; - displayvalue = valueformat.substring(12); // remove "text-custom:" - displayvalue = displayvalue.replace(/@(r|s|u)/g, function(a,c){return textval[c];}); // replace placeholders - } - else if (valueformat.substring(0,6)=="custom") { // custom - displayvalue = SocialCalc.special_chars(displayvalue); // do special chars - displayvalue = displayvalue.replace(/ /g, "  "); // keep multiple spaces - displayvalue = displayvalue.replace(/\n/g, "
    "); // keep line breaks - displayvalue += " (custom format)"; - } - else if (valueformat=="hidden") { - displayvalue = " "; - } - else { // plain text - displayvalue = SocialCalc.special_chars(displayvalue); // do special chars - displayvalue = displayvalue.replace(/ /g, "  "); // keep multiple spaces - displayvalue = displayvalue.replace(/\n/g, "
    "); // keep line breaks - } - - return displayvalue; - - } - - -// -// displayvalue = format_number_for_display(rawvalue, valuetype, valueformat) -// - -SocialCalc.format_number_for_display = function(rawvalue, valuetype, valueformat) { - - var value, valuesubtype; - var scc = SocialCalc.Constants; - - value = rawvalue-0; - - valuesubtype = valuetype.substring(1); - - if (valueformat=="Auto" || valueformat=="") { // cases with default format - if (valuesubtype=="%") { // will display a % character - valueformat = "#,##0.0%"; - } - else if (valuesubtype=='$') { - valueformat = '[$]#,##0.00'; - } - else if (valuesubtype=='dt') { - valueformat = scc.defaultFormatdt; - } - else if (valuesubtype=='d') { - valueformat = scc.defaultFormatd; - } - else if (valuesubtype=='t') { - valueformat = scc.defaultFormatt; - } - else if (valuesubtype=='l') { - valueformat = 'logical'; - } - else { - valueformat = "General"; - } - } - - if (valueformat=="logical") { // do logical format - return value ? scc.defaultDisplayTRUE : scc.defaultDisplayFALSE; - } - - if (valueformat=="hidden") { // do hidden format - return " "; - } - - // Use format - - return SocialCalc.FormatNumber.formatNumberWithFormat(rawvalue, valueformat, ""); - - } - -// -// valueinfo = DetermineValueType(rawvalue) -// -// Takes a value and looks for special formatting like $, %, numbers, etc. -// Returns the value as a number or string and the type as {value: value, type: type}. -// Tries to follow the spec for spreadsheet function VALUE(v). -// - -SocialCalc.DetermineValueType = function(rawvalue) { - - var value = rawvalue + ""; - var type = "t"; - var tvalue, matches, year, hour, minute, second, denom, num, intgr, constr; - - tvalue = value.replace(/^\s+/, ""); // remove leading and trailing blanks - tvalue = tvalue.replace(/\s+$/, ""); - - if (value.length==0) { - type = ""; - } - else if (value.match(/^\s+$/)) { // just blanks - ; // leave type "t" - } - else if (tvalue.match(/^[-+]?\d*(?:\.)?\d*(?:[eE][-+]?\d+)?$/)) { // general number, including E - value = tvalue - 0; // try converting to number - if (isNaN(value)) { // leave alone - catches things like plain "-" - value = rawvalue + ""; - } - else { - type = "n"; - } - } - else if (tvalue.match(/^[-+]?\d*(?:\.)?\d*\s*%$/)) { // percent form: 15.1% - value = (tvalue.slice(0, -1) - 0) / 100; // convert and scale - type = "n%"; - } - else if (tvalue.match(/^[-+]?\$\s*\d*(?:\.)?\d*\s*$/) && tvalue.match(/\d/)) { // $ format: $1.49 - value = tvalue.replace(/\$/, "") - 0; - type = "n$"; - } - else if (tvalue.match(/^[-+]?(\d*,\d*)+(?:\.)?\d*$/)) { // number format ignoring commas: 1,234.49 - value = tvalue.replace(/,/g, "") - 0; - type = "n"; - } - else if (tvalue.match(/^[-+]?(\d*,\d*)+(?:\.)?\d*\s*%$/)) { // % with commas: 1,234.49% - value = (tvalue.replace(/[%,]/g, "") - 0) / 100; - type = "n%"; - } - else if (tvalue.match(/^[-+]?\$\s*(\d*,\d*)+(?:\.)?\d*$/) && tvalue.match(/\d/)) { // $ and commas: $1,234.49 - value = tvalue.replace(/[\$,]/g, "") - 0; - type = "n$"; - } - else if (matches=value.match(/^(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{1,4})\s*$/)) { // MM/DD/YYYY, MM/DD/YYYY - year = matches[3] - 0; - year = year < 1000 ? year + 2000 : year; - value = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, matches[1]-0, matches[2]-0)-2415019; - type = "nd"; - } - else if (matches=value.match(/^(\d{4})[\/\-](\d{1,2})[\/\-](\d{1,2})\s*$/)) { // YYYY-MM-DD, YYYY/MM/DD - year = matches[1]-0; - year = year < 1000 ? year + 2000 : year; - value = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, matches[2]-0, matches[3]-0)-2415019; - type = "nd"; - } - else if (matches=value.match(/^(\d{1,2}):(\d{1,2})\s*$/)) { // HH:MM - hour = matches[1]-0; - minute = matches[2]-0; - if (hour < 24 && minute < 60) { - value = hour/24 + minute/(24*60); - type = "nt"; - } - } - else if (matches=value.match(/^(\d{1,2}):(\d{1,2}):(\d{1,2})\s*$/)) { // HH:MM:SS - hour = matches[1]-0; - minute = matches[2]-0; - second = matches[3]-0; - if (hour < 24 && minute < 60 && second < 60) { - value = hour/24 + minute/(24*60) + second/(24*60*60); - type = "nt"; - } - } - else if (matches=value.match(/^\s*([-+]?\d+) (\d+)\/(\d+)\s*$/)) { // 1 1/2 - intgr = matches[1]-0; - num = matches[2]-0; - denom = matches[3]-0; - if (denom && denom > 0) { - value = intgr + (intgr < 0 ? -num/denom : num/denom); - type = "n"; - } - } - else if (constr=SocialCalc.InputConstants[value.toUpperCase()]) { // special constants, like "false" and #N/A - num = constr.indexOf(","); - value = constr.substring(0,num)-0; - type = constr.substring(num+1); - } - - else if (tvalue.length > 7 && tvalue.substring(0,7).toLowerCase()=="http://") { // URL - value = tvalue; - type = "tl"; - } - - return {value: value, type: type}; - - } - -SocialCalc.InputConstants = { // strings that turn into constants for SocialCalc.DetermineValueType - "TRUE": "1,nl", "FALSE": "0,nl", "#N/A": "0,e#N/A", "#NULL!": "0,e#NULL!", "#NUM!": "0,e#NUM!", - "#DIV/0!": "0,e#DIV/0!", "#VALUE!": "0,e#VALUE!", "#REF!": "0,e#REF!", "#NAME?": "0,e#NAME?"}; - -// -// result = default_expand_markup(displayvalue, sheetobj, linkstyle) -// -// Processes wiki-text -- this is a placeholder. -// Reference to here in SocialCalc.expand_markup should be replaced by application-specific routine. -// - -SocialCalc.default_expand_markup = function(displayvalue, sheetobj, linkstyle) { - - var result = displayvalue; - - result = SocialCalc.special_chars(result); // do special chars - result = result.replace(/ /g, "  "); // keep multiple spaces - result = result.replace(/\n/g, "
    "); // keep line breaks - - return result; // do very little by default - - result = result.replace(/('*)'''(.*?)'''/g, "$1$2<\/b>"); // Wiki-style bold/italics - result = result.replace(/''(.*?)''/g, "$1<\/i>"); - - return result; - - } - - -// -// result = SocialCalc.expand_text_link(displayvalue, sheetobj, linkstyle, valueformat) -// -// Parses link text (URL, descriptions, pagenames, workspace names) and returns HTML -// - -SocialCalc.expand_text_link = function(displayvalue, sheetobj, linkstyle, valueformat) { - - var desc, tb, str; - - var scc = SocialCalc.Constants; - - var url = ""; - var parts = SocialCalc.ParseCellLinkText(displayvalue+""); - - if (parts.desc) { - desc = SocialCalc.special_chars(parts.desc); - } - else { - desc = parts.pagename ? scc.defaultPageLinkFormatString : scc.defaultLinkFormatString; - } - - if (displayvalue.length > 7 && displayvalue.substring(0,7).toLowerCase()=="http://" - && displayvalue.charAt(displayvalue.length-1)!=">") { - desc = desc.substring(7); // remove http:// unless explicit - } - - tb = (parts.newwin || !linkstyle) ? ' target="_blank"' : ""; - - if (parts.pagename) { - if (SocialCalc.Callbacks.MakePageLink) { - url = SocialCalc.Callbacks.MakePageLink(parts.pagename, parts.workspacename, linkstyle, valueformat); - } -// else if (parts.workspace) { -// url = "/" + encodeURI(parts.workspace) + "/" + encodeURI(parts.pagename); -// } -// else { -// url = parts.pagename; -// } - } - else { - url = encodeURI(parts.url); - } - str = '' + desc + ''; - - return str; - - } - - -// -// result = SocialCalc.ParseCellLinkText(str) -// -// Given: url = http://www.someurl.com/more, desc = Some descriptive text -// -// Takes the following: -// -// url -// -// desc -// "desc" -// <<>> instead of <> => target="_blank" (new window) -// -// [page name] -// "desc"[page name] -// desc[page name] -// {workspace name [page name]} -// "desc"{workspace name [page name]} -// [[]] instead of [] => target="_blank" (new window) -// -// -// Returns: {url: url, desc: desc, newwin: t/f, pagename: pagename, workspace: workspace} -// - -SocialCalc.ParseCellLinkText = function(str) { - - var result = {url: "", desc: "", newwin: false, pagename: "", workspace: ""}; - - var pageform = false; - var urlend = str.length - 1; - var descstart = 0; - var lastlt = str.lastIndexOf("<"); - var lastbrkt = str.lastIndexOf("["); - var lastbrace = str.lastIndexOf("{"); - var descend = -1; - - if ((str.charAt(urlend) != ">" || lastlt == -1) - && (str.charAt(urlend) != "]" || lastbrkt == -1) - && (str.charAt(urlend) != "}" || str.charAt(urlend-1) != "]" || - lastbrace == -1 || lastbrkt == -1 || lastbrkt < lastbrace)) { // plain url - urlend++; - descend = urlend; - } - else { // some markup - if (str.charAt(urlend)==">") { // url form - descend = lastlt - 1; - if (lastlt > 0 && str.charAt(descend) == "<" && str.charAt(urlend-1) == ">") { - descend--; - urlend--; - result.newwin = true; - } - } - - else if (str.charAt(urlend)=="]") { // plain page form - descend = lastbrkt - 1; - pageform = true; - if (lastbrkt > 0 && str.charAt(descend) == "[" && str.charAt(urlend-1) == "]") { - descend--; - urlend--; - result.newwin = true; - } - } - - else if (str.charAt(urlend)=="}") { // page and workspace form - descend = lastbrace - 1; - pageform = true; - wsend = lastbrkt; - urlend--; - if (lastbrkt > 0 && str.charAt(lastbrkt-1) == "[" && str.charAt(urlend-1) == "]") { - wsend = lastbrkt-1; - urlend--; - result.newwin = true; - } - if (str.charAt(wsend-1)==" ") { // trim trailing space in workspace name - wsend--; - } - result.workspace = str.substring(lastbrace+1, wsend) || ""; - } - - if (str.charAt(descend)==" ") { // trim trailing space on desc - descend--; - } - - if (str.charAt(descstart) == '"' && str.charAt(descend) == '"') { - descstart++; - descend--; - } - } - - if (pageform) { - result.pagename = str.substring(lastbrkt+1, urlend) || ""; - } - else { - result.url = str.substring(lastlt+1, urlend) || ""; - } - - if (descend >= descstart) { - result.desc = str.substring(descstart, descend+1); - } - - return result; - - } - - -// -// result = SocialCalc.ConvertSaveToOtherFormat(savestr, outputformat, dorecalc) -// -// Returns a string in the specificed format: "scsave", "html", "csv", "tab" (tab delimited) -// If dorecalc is true, performs a recalc after loading (NO: obsolete!). -// - -SocialCalc.ConvertSaveToOtherFormat = function(savestr, outputformat, dorecalc) { - - var sheet, context, clipextents, div, ele, row, col, cr, cell, str; - - var result = ""; - - if (outputformat == "scsave") { - return savestr; - } - - if (savestr == "") { - return ""; - } - - sheet = new SocialCalc.Sheet(); - sheet.ParseSheetSave(savestr); - - if (dorecalc) { - // no longer supported as of 9/10/08 - // Recalc is now async, so can't do it this way - throw("SocialCalc.ConvertSaveToOtherFormat: Not doing recalc."); - } - - if (sheet.copiedfrom) { - clipextents = SocialCalc.ParseRange(sheet.copiedfrom); - } - else { - clipextents = {cr1: {row: 1, col: 1}, cr2: {row: sheet.attribs.lastrow, col: sheet.attribs.lastcol}}; - } - - if (outputformat == "html") { - context=new SocialCalc.RenderContext(sheet); - if (sheet.copiedfrom) { - context.rowpanes[0] = {first: clipextents.cr1.row, last: clipextents.cr2.row}; - context.colpanes[0] = {first: clipextents.cr1.col, last: clipextents.cr2.col}; - } - div = document.createElement("div"); - ele = context.RenderSheet(null, context.defaultHTMLlinkstyle); - div.appendChild(ele); - delete context; - delete sheet; - result = div.innerHTML; - delete ele; - delete div; - return result; - } - - for (row = clipextents.cr1.row; row <= clipextents.cr2.row; row++) { - for (col = clipextents.cr1.col; col <= clipextents.cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - - if (cell.errors) { - str = cell.errors; - } - else { - str = cell.datavalue+""; // get value as text - } - - if (outputformat == "csv") { - if (str.indexOf('"')!=-1) { - str = str.replace(/"/g, '""'); // double quotes - } - if (/[, \n"]/.test(str)) { - str = '"' + str + '"'; // add quotes - } - if (col>clipextents.cr1.col) { - str = "," + str; // add commas - } - } - else if (outputformat == "tab") { - if (str.indexOf('\n')!=-1) { // if multiple lines - if (str.indexOf('"')!=-1) { - str = str.replace(/"/g, '""'); // double quotes - } - str = '"' + str + '"'; // add quotes - } - if (col>clipextents.cr1.col) { - str = "\t" + str; // add tabs - } - } - result += str; - } - result += "\n"; - } - - return result; - - } - - -// -// result = SocialCalc.ConvertOtherFormatToSave(inputstr, inputformat) -// -// Returns a string converted from the specified format: "scsave", "csv", "tab" (tab delimited) -// - -SocialCalc.ConvertOtherFormatToSave = function(inputstr, inputformat) { - - var sheet, context, lines, i, line, value, inquote, j, ch, values, row, col, cr, maxc; - - var result = ""; - - var AddCell = function() { - col++; - if (col>maxc) maxc = col; - cr = SocialCalc.crToCoord(col, row); - SocialCalc.SetConvertedCell(sheet, cr, value); - value = ""; - } - - if (inputformat == "scsave") { - return inputstr; - } - - sheet = new SocialCalc.Sheet(); - - lines = inputstr.split(/\r\n|\n/); - - maxc = 0; - if (inputformat == "csv") { - row = 0; - inquote = false; - for (i=0; i0) { - sheet.attribs.lastrow = row; - sheet.attribs.lastcol = maxc; - result = sheet.CreateSheetSave("A1:"+SocialCalc.crToCoord(maxc, row)); - } - } - - if (inputformat == "tab") { - row = 0; - inquote = false; - for (i=0; i0) { - sheet.attribs.lastrow = row; - sheet.attribs.lastcol = maxc; - result = sheet.CreateSheetSave("A1:"+SocialCalc.crToCoord(maxc, row)); - } - } - - return result; - - } - -// -// SocialCalc.SetConvertedCell(sheet, cr, rawvalue) -// -// Sets the cell cr with a value and type determined from rawvalue -// - -SocialCalc.SetConvertedCell = function(sheet, cr, rawvalue) { - - var cell, value; - - cell = sheet.GetAssuredCell(cr); - - value = SocialCalc.DetermineValueType(rawvalue); - - if (value.type == 'n' && value.value == rawvalue) { // check that we don't need "constant" to remember original value - cell.datatype = "v"; - cell.valuetype = "n"; - cell.datavalue = value.value; - } - else if (value.type.charAt(0) == 't') { // text of some sort but left unchanged - cell.datatype = "t"; - cell.valuetype = value.type; - cell.datavalue = value.value; - } - else { // special number types - cell.datatype = "c"; - cell.valuetype = value.type; - cell.datavalue = value.value; - cell.formula = rawvalue; - } - - } - diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalc.css b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalc.css deleted file mode 100644 index 78f4dc5..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalc.css +++ /dev/null @@ -1,49 +0,0 @@ -/* -// The optional default CSS style sheet for the SocialCalc package. -// SocialCalc can run without a style sheet (the default) or with one. -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -*/ - -.defaultPeer {background-repeat:no-repeat;background-position:top left;background-image:url(images/sc-peerbg.gif);} -.defaultComment {background-repeat:no-repeat;background-position:top right;background-image:url(static/images/sc-commentbg.gif);} -.defaultCommentNoGridStyle {} -.defaultHighlightTypeCursor {color:#FFF;background-color:#A6A6A6;} -.defaultHighlightTypeRange {color:#000;background-color:#E5E5E5;} -.defaultColname {font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;} -.defaultSelectedColname {font-size:small;text-align:center;color:#FFFFFF;background-color:#404040;cursor:e-resize;} -.defaultRowname {font-size:small;text-align:right;color:#FFFFFF;background-color:#808080;} -.defaultSelectedRowname {font-size:small;text-align:right;color:#FFFFFF;background-color:#404040;} -.defaultUpperLeft {font-size:small;} -.defaultSkippedCell {font-size:small;background-color:#CCC;} -.defaultPaneDivider {font-size:small;background-color:#ECECEC;padding:0px;} -.cteGriddiv {} -.defaultInputEcho {background-color:#FFD;border:1px solid #884; - font-size:small;padding:2px 10px 1px 2px;cursor:default;} -.TCmain {background-color:#EEE;} -.TCendcap {background-color:#FFF;} -.TCpaneslider {background-color:#CCC;} -.TClessbutton {background-color:#AAA;} -.TCmorebutton {background-color:#AAA;} -.TCscrollarea {background-color:#DDD;} -.TCthumb {background-color:#CCC;} -.TCPStrackingline {overflow:hidden;position:absolute;z-index:100;} -.TCTDFSthumbstatus {height:20px;width:auto;border:1px solid black;padding:2px; - background-color:#FFF;font-size:small;position:absolute;z-index:100;} -.TDpopupElement {border:1px solid black;padding:1px 2px 2px 2px;text-align:center;background-color:#FFF; - font-size:7pt;font-family:Verdana,Arial,Helvetica,sans-serif; - position:absolute;width:auto;z-index:110;} - - diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalcconstants.js b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalcconstants.js deleted file mode 100644 index 2c2ae5b..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalcconstants.js +++ /dev/null @@ -1,834 +0,0 @@ -// -/* -// The module of the SocialCalc package with customizable constants, strings, etc. -// This is where most of the common localizations are done. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - -var SocialCalc; -if (!SocialCalc) SocialCalc = {}; - -// ************************************* -// -// TO LEARN HOW TO LOCALIZE OR CUSTOMIZE SOCIALCALC, PLEASE READ THIS: -// -// The constants are all properties of the SocialCalc.Constants object. -// They are grouped here by what they are for, which module uses them, etc. -// -// Properties whose names start with "s_" are strings, or arrays of strings, -// that are good candidates for translation from the English. -// -// Other properties relate to visual settings, localization parameters, etc. -// -// These values are not used when SocialCalc modules are first loaded. -// They may be modified before the first use of the routines that use them, -// e.g., before creating SocialCalc objects. -// -// The exceptions are: -// TooltipOffsetX and TooltipOffsetY, as described with their definitions. -// -// SocialCalc IS NOT DESIGNED FOR USE WITH A TRANSLATION FUNCTION each time a string -// is used. Instead, language translations may be done by modifying this object. -// -// To customize SocialCalc, you may either replace this file with a modified version -// or you can overwrite the values before use. An example would be to -// iterate over all the properties looking for names that start with "s_" and -// use some other mechanism to obtain a localized string and replace the values -// here with those translated values. -// -// There is also a function, SocialCalc.ConstantsSetClasses, that may be used -// to easily switch SocialCalc from using explicit CSS styles for many things -// to using CSS classes. See the function, below, for more information. -// -// ************************************* - -SocialCalc.Constants = { - -// -// Main SocialCalc module, socialcalc-3.js: -// - - //*** Common Constants - - textdatadefaulttype: "t", // This sets the default type for text on reading source file - // It should normally be "t" - - //*** Common error messages - - s_BrowserNotSupported: "Browser not supported.", // error thrown if browser can't handle events like IE or Firefox. - s_InternalError: "Internal SocialCalc error (probably an internal bug): ", // hopefully unlikely, but a test failed - - //*** SocialCalc.ParseSheetSave - - // Errors thrown on unexpected value in save file: - - s_pssUnknownColType: "Unknown col type item", - s_pssUnknownRowType: "Unknown row type item", - s_pssUnknownLineType: "Unknown line type", - - //*** SocialCalc.CellFromStringParts - - // Error thrown on unexpected value in save file: - - s_cfspUnknownCellType: "Unknown cell type item", - - //*** SocialCalc.CanonicalizeSheet - - doCanonicalizeSheet: true, // if true, do the canonicalization calculations - - //*** ExecuteSheetCommand - - s_escUnknownSheetCmd: "Unknown sheet command: ", - s_escUnknownSetCoordCmd: "Unknown set coord command: ", - s_escUnknownCmd: "Unknown command: ", - - //*** SocialCalc.CheckAndCalcCell - - s_caccCircRef: "Circular reference to ", // circular reference found during recalc - - //*** SocialCalc.RenderContext - - defaultRowNameWidth: "30", // used to set minimum width of the row header column - a string in pixels - defaultAssumedRowHeight: 15, // used when guessing row heights - number - defaultCellIDPrefix: "cell_", // if non-null, each cell will render with an ID starting with this - - // Default sheet display values - - defaultCellLayout: "padding:2px 2px 1px 2px;vertical-align:top;", - defaultCellFontStyle: "normal normal", - defaultCellFontSize: "small", - defaultCellFontFamily: "Verdana,Arial,Helvetica,sans-serif", - - defaultPaneDividerWidth: "2", // a string - defaultPaneDividerHeight: "3", // a string - - defaultGridCSS: "1px solid #C0C0C0;", // used as style to set each border when grid enabled (was #ECECEC) - - defaultCommentClass: "", // class added to cells with non-null comments when grid enabled - defaultCommentStyle: "background-repeat:no-repeat;background-position:top right;background-image:url(images/sc-commentbg.gif);", // style added to cells with non-null comments when grid enabled - defaultCommentNoGridClass: "", // class added to cells with non-null comments when grid not enabled - defaultCommentNoGridStyle: "", // style added to cells with non-null comments when grid not enabled - - defaultColWidth: "80", // text - defaultMinimumColWidth: 10, // numeric - - // For each of the following default sheet display values at least one of class and/or style are needed - - defaultHighlightTypeCursorClass: "", - // defaultHighlightTypeCursorStyle: "color:#FFF;backgroundColor:#A6A6A6;", - defaultHighlightTypeCursorStyle: "", - defaultHighlightTypeRangeClass: "", - //defaultHighlightTypeRangeStyle: "color:#000;backgroundColor:#E5E5E5;", - defaultHighlightTypeRangeStyle: "", - - defaultColnameClass: "", // regular column heading letters, needs a cursor property - defaultColnameStyle: "font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;", - defaultSelectedColnameClass: "", // column with selected cell, needs a cursor property - defaultSelectedColnameStyle: "font-size:small;text-align:center;color:#FFFFFF;background-color:#404040;cursor:e-resize;", - defaultRownameClass: "", // regular row heading numbers - defaultRownameStyle: "font-size:small;text-align:right;color:#FFFFFF;background-color:#808080;", - defaultSelectedRownameClass: "", // column with selected cell, needs a cursor property - defaultSelectedRownameStyle: "font-size:small;text-align:right;color:#FFFFFF;background-color:#404040;", - defaultUpperLeftClass: "", // Corner cell in upper left - defaultUpperLeftStyle: "font-size:small;", - defaultSkippedCellClass: "", // used if present for spanned cells peeking into a pane (at least one of class/style needed) - defaultSkippedCellStyle: "font-size:small;background-color:#CCC", // used if present - defaultPaneDividerClass: "", // used if present for the look of the space between panes (at least one of class/style needed) - defaultPaneDividerStyle: "font-size:small;background-color:#C0C0C0;padding:0px;", // used if present - - s_rcMissingSheet: "Render Context must have a sheet object", // unlikely thrown error - - //*** SocialCalc.format_text_for_display - - defaultLinkFormatString: 'Link', // used for format "text-link"; you could make this an img tag if desired -// defaultLinkFormatString: 'Link out', - defaultPageLinkFormatString: 'Page', // used for format "text-link"; you could make this an img tag if desired - - //*** SocialCalc.format_number_for_display - - defaultFormatdt: 'd-mmm-yyyy h:mm:ss', - defaultFormatd: 'd-mmm-yyyy', - defaultFormatt: '[h]:mm:ss', - defaultDisplayTRUE: 'TRUE', // how TRUE shows when rendered - defaultDisplayFALSE: 'FALSE', - -// -// SocialCalc Table Editor module, socialcalctableeditor.js: -// - - //*** SocialCalc.TableEditor - - defaultImagePrefix: "images/sc-", // URL prefix for images (e.g., "/images/sc") - defaultTableEditorIDPrefix: "te_", // if present, many TableEditor elements are assigned IDs with this prefix - defaultPageUpDnAmount: 15, // number of rows to move cursor on PgUp/PgDn keys (numeric) - - AllowCtrlS: true, // turns on Ctrl-S trapdoor for setting custom numeric formats and commands if true - - //*** SocialCalc.CreateTableEditor - - defaultTableControlThickness: 20, // the short size for the scrollbars, etc. (numeric in pixels) - cteGriddivClass: "", // if present, the class for the TableEditor griddiv element - - //** SocialCalc.EditorGetStatuslineString -- strings shown on status line - - s_statusline_executing: "Executing...", - s_statusline_displaying: "Displaying...", - s_statusline_ordering: "Ordering...", - s_statusline_calculating: "Calculating...", - s_statusline_calculatingls: "Calculating... Loading Sheet...", - s_statusline_doingserverfunc: "doing server function ", - s_statusline_incell: " in cell ", - s_statusline_calcstart: "Calculation start...", - s_statusline_sum: "SUM", - s_statusline_recalcneeded: '(Recalc needed)', - s_statusline_circref: 'Circular reference: ', - - //** SocialCalc.InputBoxDisplayCellContents - - s_inputboxdisplaymultilinetext: "[Multi-line text: Click icon on right to edit]", - - //** SocialCalc.InputEcho - - defaultInputEchoClass: "", // if present, the class of the popup inputEcho div - defaultInputEchoStyle: "filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;border:1px solid #884;"+ - "fontSize:small;padding:2px 10px 1px 2px;cursor:default;", // if present, pseudo style - defaultInputEchoPromptClass: "", // if present, the class of the popup inputEcho div - defaultInputEchoPromptStyle: "filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;"+ - "borderLeft:1px solid #884;borderRight:1px solid #884;borderBottom:1px solid #884;"+ - "fontSize:small;fontStyle:italic;padding:2px 10px 1px 2px;cursor:default;", // if present, pseudo style - - //** SocialCalc.InputEchoText - - ietUnknownFunction: "Unknown function ", // displayed when typing "=unknown(" - - //** SocialCalc.CellHandles - - CH_radius1: 29.0, // extent of inner circle within 90px image - CH_radius2: 41.0, // extent of outer circle within 90px image - s_CHfillAllTooltip: "Fill Contents and Formats Down/Right", // tooltip for fill all handle - s_CHfillContentsTooltip: "Fill Contents Only Down/Right", // tooltip for fill formulas handle - s_CHmovePasteAllTooltip: "Move Contents and Formats", // etc. - s_CHmovePasteContentsTooltip: "Move Contents Only", - s_CHmoveInsertAllTooltip: "Slide Contents and Formats within Row/Col", - s_CHmoveInsertContentsTooltip: "Slide Contents within Row/Col", - s_CHindicatorOperationLookup: {"Fill": "Fill", "FillC": "Fill Contents", - "Move": "Move", "MoveI": "Slide", - "MoveC": "Move Contents", "MoveIC": "Slide Contents"}, // short form of operation to follow drag - s_CHindicatorDirectionLookup: {"Down": " Down", "Right": " Right", - "Horizontal": " Horizontal", "Vertical": " Vertical"}, // direction that modifies operation during drag - - //*** SocialCalc.TableControl - - defaultTCSliderThickness: 9, // length of pane slider (numeric in pixels) - defaultTCButtonThickness: 20, // length of scroll +/- buttons (numeric in pixels) - defaultTCThumbThickness: 15, // length of thumb (numeric in pixels) - - //*** SocialCalc.CreateTableControl - - TCmainStyle: "backgroundColor:#EEE;", // if present, pseudo style (text-align is textAlign) for main div of a table control - TCmainClass: "", // if present, the CSS class of the main div for a table control - TCendcapStyle: "backgroundColor:#FFF;", // backgroundColor may be used while waiting for image that may not come - TCendcapClass: "", - TCpanesliderStyle: "backgroundColor:#CCC;", - TCpanesliderClass: "", - s_panesliderTooltiph: "Drag to lock pane vertically", // tooltip for horizontal table control pane slider - s_panesliderTooltipv: "Drag to lock pane horizontally", - TClessbuttonStyle: "backgroundColor:#AAA;", - TClessbuttonClass: "", - TClessbuttonRepeatWait: 300, // in milliseconds - TClessbuttonRepeatInterval: 20,//100, // in milliseconds - TCmorebuttonStyle: "backgroundColor:#AAA;", - TCmorebuttonClass: "", - TCmorebuttonRepeatWait: 300, // in milliseconds - TCmorebuttonRepeatInterval: 20,//100, // in milliseconds - TCscrollareaStyle: "backgroundColor:#DDD;", - TCscrollareaClass: "", - TCscrollareaRepeatWait: 500, // in milliseconds - TCscrollareaRepeatInterval: 100, // in milliseconds - TCthumbClass: "", - TCthumbStyle: "backgroundColor:#CCC;", - - //*** SocialCalc.TCPSDragFunctionStart - - TCPStrackinglineClass: "", // at least one of class/style for pane slider tracking line display in table control - TCPStrackinglineStyle: "overflow:hidden;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCPStrackinglineThickness: "2px", // narrow dimension of trackling line (string with units) - - - //*** SocialCalc.TCTDragFunctionStart - - TCTDFSthumbstatusvClass: "", // at least one of class/style for vertical thumb dragging status display in table control - TCTDFSthumbstatusvStyle: "height:20px;width:auto;border:3px solid #808080;overflow:hidden;"+ - "backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCTDFSthumbstatushClass: "", // at least one of class/style for horizontal thumb dragging status display in table control - TCTDFSthumbstatushStyle: "height:20px;width:auto;border:1px solid black;padding:2px;"+ - "backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCTDFSthumbstatusrownumClass: "", // at least one of class/style for thumb dragging status display in table control - TCTDFSthumbstatusrownumStyle: "color:#FFF;background-color:#808080;font-size:small;white-space:nowrap;padding:3px;", // if present, real style - TCTDFStopOffsetv: 0, // offsets for thumbstatus display while dragging - TCTDFSleftOffsetv: -80, - s_TCTDFthumbstatusPrefixv: "Row ", // Text Control Drag Function text before row number - TCTDFStopOffseth: -30, - TCTDFSleftOffseth: 0, - s_TCTDFthumbstatusPrefixh: "Col ", // Text Control Drag Function text before col number - - //*** SocialCalc.TooltipInfo - - // Note: These two values are used to set the TooltipInfo initial values when the code is first read in. - // Modifying them here after loading has no effect -- you need to modify SocialCalc.TooltipInfo directly - // to dynamically set them. This is different than most other constants which may be modified until use. - - TooltipOffsetX: 2, // offset in pixels from mouse position (to right on left side of screen, to left on right) - TooltipOffsetY: 10, // offset in pixels above mouse position for lower edge - - //*** SocialCalc.TooltipDisplay - - TDpopupElementClass: "", // at least one of class/style for tooltip display - TDpopupElementStyle: "border:1px solid black;padding:1px 2px 2px 2px;textAlign:center;backgroundColor:#FFF;"+ - "fontSize:7pt;fontFamily:Verdana,Arial,Helvetica,sans-serif;"+ - "position:absolute;width:auto;zIndex:110;", - // if present, pseudo style (text-align is textAlign) - - -// -// SocialCalc Spreadsheet Control module, socialcalcspreadsheetcontrol.js: -// - - //*** SocialCalc.SpreadsheetControl - - SCToolbarbackground: "background-color:#404040;", - SCTabbackground: "background-color:#CCC;", - SCTabselectedCSS: "font-size:small;padding:6px 30px 6px 8px;color:#FFF;background-color:#404040;cursor:default;border-right:1px solid #CCC;", - SCTabplainCSS: "font-size:small;padding:6px 30px 6px 8px;color:#FFF;background-color:#808080;cursor:default;border-right:1px solid #CCC;", - SCToolbartext: "font-size:x-small;font-weight:bold;color:#FFF;padding-bottom:4px;", - - SCFormulabarheight: 40, // in pixels, will contain a text input box - - SCStatuslineheight: 20, // in pixels - SCStatuslineCSS: "font-size:10px;padding:3px 0px;", - - - // workbook - doWorkBook: true, - SCSheetBarHeight: 25, - SCSheetBarBackground: "background-color:#CCC;", - SCSheetBarCSS: "background-color:#CCC;", - SCSheetBarWidth: "70%", - - SCCellHandlesDisable: true, - SCNoInputEcho: true, // do we need an input echo ? - s_inputboxdisplaynoteditable: "[not editable]", - SCNoRowName: true, - SCNoRanging: true, - SCNoQuoteInInputBox: true, - // Constants for default Format tab (settings) - // - // *** EVEN THOUGH THESE DON'T START WITH s_: *** - // - // These should be carefully checked for localization. Make sure you understand what they do and how they work! - // The first part of "first:second|first:second|..." is what is displayed and the second is the value to be used. - // The value is normally not translated -- only the displayed part. The [cancel], [break], etc., are not translated -- - // they are commands to SocialCalc.SettingsControls.PopupListInitialize - - SCFormatNumberFormats: "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Auto w/ commas!:[,]General|[break]:|"+ - "00:00|000:000|0000:0000|00000:00000|[break]:|%loc!Formula!:formula|%loc!Hidden!:hidden|[newcol]:"+ - "1234:0|1,234:#,##0|1,234.5:#,##0.0|1,234.56:#,##0.00|1,234.567:#,##0.000|1,234.5678:#,##0.0000|"+ - "[break]:|1,234%:#,##0%|1,234.5%:#,##0.0%|1,234.56%:#,##0.00%|"+ - "[newcol]:|$1,234:$#,##0|$1,234.5:$#,##0.0|$1,234.56:$#,##0.00|[break]:|"+ - "(1,234):#,##0_);(#,##0)|(1,234.5):#,##0.0_);(#,##0.0)|(1,234.56):#,##0.00_);(#,##0.00)|[break]:|"+ - "($1,234):#,##0_);($#,##0)|($1,234.5):$#,##0.0_);($#,##0.0)|($1,234.56):$#,##0.00_);($#,##0.00)|"+ - "[newcol]:|1/4/06:m/d/yy|01/04/2006:mm/dd/yyyy|2006-01-04:yyyy-mm-dd|4-Jan-06:d-mmm-yy|04-Jan-2006:dd-mmm-yyyy|January 4, 2006:mmmm d, yyyy|"+ - "[break]:|1\\c23:h:mm|1\\c23 PM:h:mm AM/PM|1\\c23\\c45:h:mm:ss|01\\c23\\c45:hh:mm:ss|26\\c23 (h\\cm):[hh]:mm|69\\c45 (m\\cs):[mm]:ss|69 (s):[ss]|"+ - "[newcol]:|2006-01-04 01\\c23\\c45:yyyy-mm-dd hh:mm:ss|January 4, 2006:mmmm d, yyyy hh:mm:ss|Wed:ddd|Wednesday:dddd|", - SCFormatTextFormats: "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Plain Text!:text-plain|"+ - "HTML:text-html|%loc!Wikitext!:text-wiki|%loc!Link!:text-link|%loc!Formula!:formula|%loc!Hidden!:hidden|", - SCFormatPadsizes: "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!No padding!:0px|"+ - "[newcol]:|1 pixel:1px|2 pixels:2px|3 pixels:3px|4 pixels:4px|5 pixels:5px|"+ - "6 pixels:6px|7 pixels:7px|8 pixels:8px|[newcol]:|9 pixels:9px|10 pixels:10px|11 pixels:11px|"+ - "12 pixels:12px|13 pixels:13px|14 pixels:14px|16 pixels:16px|"+ - "18 pixels:18px|[newcol]:|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|", - SCFormatFontsizes: "[cancel]:|[break]:|%loc!Default!:|[custom]:|X-Small:x-small|Small:small|Medium:medium|Large:large|X-Large:x-large|"+ - "[newcol]:|6pt:6pt|7pt:7pt|8pt:8pt|9pt:9pt|10pt:10pt|11pt:11pt|12pt:12pt|14pt:14pt|16pt:16pt|"+ - "[newcol]:|18pt:18pt|20pt:20pt|22pt:22pt|24pt:24pt|28pt:28pt|36pt:36pt|48pt:48pt|72pt:72pt|"+ - "[newcol]:|8 pixels:8px|9 pixels:9px|10 pixels:10px|11 pixels:11px|"+ - "12 pixels:12px|13 pixels:13px|14 pixels:14px|[newcol]:|16 pixels:16px|"+ - "18 pixels:18px|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|", - SCFormatFontfamilies: "[cancel]:|[break]:|%loc!Default!:|[custom]:|Verdana:Verdana,Arial,Helvetica,sans-serif|"+ - "Arial:arial,helvetica,sans-serif|Courier:'Courier New',Courier,monospace|", - SCFormatFontlook: "[cancel]:|[break]:|%loc!Default!:|%loc!Normal!:normal normal|%loc!Bold!:normal bold|%loc!Italic!:italic normal|"+ - "%loc!Bold Italic!:italic bold", - SCFormatTextAlignhoriz: "[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|", - SCFormatNumberAlignhoriz: "[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|", - SCFormatAlignVertical: "[cancel]:|[break]:|%loc!Default!:|%loc!Top!:top|%loc!Middle!:middle|%loc!Bottom!:bottom|", - SCFormatColwidth: "[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|"+ - "20 pixels:20|40:40|60:60|80:80|100:100|120:120|140:140|160:160|"+ - "[newcol]:|180 pixels:180|200:200|220:220|240:240|260:260|280:280|300:300|", - SCFormatRecalc: "[cancel]:|[break]:|%loc!Auto!:|%loc!Manual!:off|", - - //*** SocialCalc.InitializeSpreadsheetControl - - ISCButtonBorderNormal: "#404040", - ISCButtonBorderHover: "#999", - ISCButtonBorderDown: "#FFF", - ISCButtonDownBackground: "#888", - - //*** SocialCalc.SettingsControls.PopupListInitialize - - s_PopupListCancel: "[Cancel]", - s_PopupListCustom: "Custom", - - // *** - // - // s_loc_ constants accessed by SocialCalc.LocalizeString and SocialCalc.LocalizeSubstrings - // - // Used extensively by socialcalcspreadsheetcontrol.js - // - // *** - - s_loc_align_center: "Align Center", - s_loc_align_left: "Align Left", - s_loc_align_right: "Align Right", - s_loc_alignment: "Alignment", - s_loc_audit: "Audit", - s_loc_audit_trail_this_session: "Audit Trail This Session", - s_loc_auto: "Auto", - s_loc_auto_sum: "Auto Sum", - s_loc_auto_wX_commas: "Auto w/ commas", - s_loc_automatic: "Automatic", - s_loc_background: "Background", - s_loc_bold: "Bold", - s_loc_bold_XampX_italics: "Bold & Italics", - s_loc_bold_italic: "Bold Italic", - s_loc_borders: "Borders", - s_loc_borders_off: "Borders Off", - s_loc_borders_on: "Borders On", - s_loc_bottom: "Bottom", - s_loc_bottom_border: "Bottom Border", - s_loc_cell_settings: "CELL SETTINGS", - s_loc_csv_format: "CSV format", - s_loc_cancel: "Cancel", - s_loc_category: "Category", - s_loc_center: "Center", - s_loc_clear: "Clear", - s_loc_clear_socialcalc_clipboard: "Clear SocialCalc Clipboard", - s_loc_clipboard: "Clipboard", - s_loc_color: "Color", - s_loc_column_: "Column ", - s_loc_comment: "Comment", - s_loc_copy: "Copy", - s_loc_custom: "Custom", - s_loc_cut: "Cut", - s_loc_default: "Default", - s_loc_default_alignment: "Default Alignment", - s_loc_default_column_width: "Default Column Width", - s_loc_default_font: "Default Font", - s_loc_default_format: "Default Format", - s_loc_default_padding: "Default Padding", - s_loc_delete: "Delete", - s_loc_delete_column: "Delete Column", - s_loc_delete_contents: "Delete Contents", - s_loc_delete_row: "Delete Row", - s_loc_description: "Description", - s_loc_display_clipboard_in: "Display Clipboard in", - s_loc_down: "Down", - s_loc_edit: "Edit", - s_loc_existing_names: "Existing Names", - s_loc_family: "Family", - s_loc_fill_down: "Fill Down", - s_loc_fill_right: "Fill Right", - s_loc_font: "Font", - s_loc_format: "Format", - s_loc_formula: "Formula", - s_loc_function_list: "Function List", - s_loc_functions: "Functions", - s_loc_grid: "Grid", - s_loc_hidden: "Hidden", - s_loc_horizontal: "Horizontal", - s_loc_insert_column: "Insert Column", - s_loc_insert_row: "Insert Row", - s_loc_italic: "Italic", - s_loc_last_sort: "Last Sort", - s_loc_left: "Left", - s_loc_left_border: "Left Border", - s_loc_link: "Link", - s_loc_link_input_box: "Link Input Box", - s_loc_list: "List", - s_loc_load_socialcalc_clipboard_with_this: "Load SocialCalc Clipboard With This", - s_loc_major_sort: "Major Sort", - s_loc_manual: "Manual", - s_loc_merge_cells: "Merge Cells", - s_loc_middle: "Middle", - s_loc_minor_sort: "Minor Sort", - s_loc_move_insert: "Move Insert", - s_loc_move_paste: "Move Paste", - s_loc_multiXline_input_box: "Multi-line Input Box", - s_loc_name: "Name", - s_loc_names: "Names", - s_loc_no_padding: "No padding", - s_loc_normal: "Normal", - s_loc_number: "Number", - s_loc_number_horizontal: "Number Horizontal", - s_loc_ok: "OK", - s_loc_padding: "Padding", - s_loc_page_name: "Page Name", - s_loc_paste: "Paste", - s_loc_paste_formats: "Paste Formats", - s_loc_plain_text: "Plain Text", - s_loc_recalc: "Recalc", - s_loc_recalculation: "Recalculation", - s_loc_redo: "Redo", - s_loc_right: "Right", - s_loc_right_border: "Right Border", - s_loc_sheet_settings: "SHEET SETTINGS", - s_loc_save: "Save", - s_loc_save_to: "Save to", - s_loc_set_cell_contents: "Set Cell Contents", - s_loc_set_cells_to_sort: "Set Cells To Sort", - s_loc_set_value_to: "Set Value To", - s_loc_set_to_link_format: "Set to Link format", - s_loc_setXclear_move_from: "Set/Clear Move From", - s_loc_show_cell_settings: "Show Cell Settings", - s_loc_show_sheet_settings: "Show Sheet Settings", - s_loc_show_in_new_browser_window: "Show in new browser window", - s_loc_size: "Size", - s_loc_socialcalcXsave_format: "SocialCalc-save format", - s_loc_sort: "Sort", - s_loc_sort_: "Sort ", - s_loc_sort_cells: "Sort Cells", - s_loc_swap_colors: "Swap Colors", - s_loc_tabXdelimited_format: "Tab-delimited format", - s_loc_text: "Text", - s_loc_text_horizontal: "Text Horizontal", - s_loc_this_is_aXbrXsample: "This is a
    sample", - s_loc_top: "Top", - s_loc_top_border: "Top Border", - s_loc_undone_steps: "UNDONE STEPS", - s_loc_url: "URL", - s_loc_undo: "Undo", - s_loc_unmerge_cells: "Unmerge Cells", - s_loc_up: "Up", - s_loc_value: "Value", - s_loc_vertical: "Vertical", - s_loc_wikitext: "Wikitext", - s_loc_workspace: "Workspace", - s_loc_XnewX: "[New]", - s_loc_XnoneX: "[None]", - s_loc_Xselect_rangeX: "[select range]", - -// -// SocialCalc Spreadsheet Viewer module, socialcalcviewer.js: -// - - //*** SocialCalc.SpreadsheetViewer - - SVStatuslineheight: 20, // in pixels - SVStatuslineCSS: "font-size:10px;padding:3px 0px;", - -// -// SocialCalc Format Number module, formatnumber2.js: -// - - FormatNumber_separatorchar: ",", // the thousands separator character when formatting numbers for display - FormatNumber_decimalchar: ".", // the decimal separator character when formatting numbers for display - FormatNumber_defaultCurrency: "$", // the currency string used if none specified - - // The following constants are arrays of strings with the short (3 character) and full names of days and months - - s_FormatNumber_daynames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - s_FormatNumber_daynames3: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - s_FormatNumber_monthnames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", - "October", "November", "December"], - s_FormatNumber_monthnames3: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - s_FormatNumber_am: "AM", - s_FormatNumber_am1: "A", - s_FormatNumber_pm: "PM", - s_FormatNumber_pm1: "P", - -// -// SocialCalc Spreadsheet Formula module, formula1.js: -// - - s_parseerrexponent: "Improperly formed number exponent", - s_parseerrchar: "Unexpected character in formula", - s_parseerrstring: "Improperly formed string", - s_parseerrspecialvalue: "Improperly formed special value", - s_parseerrtwoops: "Error in formula (two operators inappropriately in a row)", - s_parseerrmissingopenparen: "Missing open parenthesis in list with comma(s). ", - s_parseerrcloseparennoopen: "Closing parenthesis without open parenthesis. ", - s_parseerrmissingcloseparen: "Missing close parenthesis. ", - s_parseerrmissingoperand: "Missing operand. ", - s_parseerrerrorinformula: "Error in formula.", - s_calcerrerrorvalueinformula: "Error value in formula", - s_parseerrerrorinformulabadval: "Error in formula resulting in bad value", - s_formularangeresult: "Formula results in range value:", - s_calcerrnumericnan: "Formula results in an bad numeric value", - s_calcerrnumericoverflow: "Numeric overflow", - s_sheetunavailable: "Sheet unavailable:", // when FindSheetInCache returns null - s_calcerrcellrefmissing: "Cell reference missing when expected.", - s_calcerrsheetnamemissing: "Sheet name missing when expected.", - s_circularnameref: "Circular name reference to name", - s_calcerrunknownname: "Unknown name", - s_calcerrincorrectargstofunction: "Incorrect arguments to function", - s_sheetfuncunknownfunction: "Unknown function", - s_sheetfunclnarg: "LN argument must be greater than 0", - s_sheetfunclog10arg: "LOG10 argument must be greater than 0", - s_sheetfunclogsecondarg: "LOG second argument must be numeric greater than 0", - s_sheetfunclogfirstarg: "LOG first argument must be greater than 0", - s_sheetfuncroundsecondarg: "ROUND second argument must be numeric", - s_sheetfuncddblife: "DDB life must be greater than 1", - s_sheetfuncslnlife: "SLN life must be greater than 1", - - // Function definition text - - s_fdef_ABS: 'Absolute value function. ', - s_fdef_ACOS: 'Trigonometric arccosine function. ', - s_fdef_AND: 'True if all arguments are true. ', - s_fdef_ASIN: 'Trigonometric arcsine function. ', - s_fdef_ATAN: 'Trigonometric arctan function. ', - s_fdef_ATAN2: 'Trigonometric arc tangent function (result is in radians). ', - s_fdef_AVERAGE: 'Averages the values. ', - s_fdef_CHOOSE: 'Returns the value specified by the index. The values may be ranges of cells. ', - s_fdef_COLUMNS: 'Returns the number of columns in the range. ', - s_fdef_COS: 'Trigonometric cosine function (value is in radians). ', - s_fdef_COUNT: 'Counts the number of numeric values, not blank, text, or error. ', - s_fdef_COUNTA: 'Counts the number of non-blank values. ', - s_fdef_COUNTBLANK: 'Counts the number of blank values. (Note: "" is not blank.) ', - s_fdef_COUNTIF: '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). ', - s_fdef_DATE: '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. ', - s_fdef_DAVERAGE: 'Averages the values in the specified field in records that meet the criteria. ', - s_fdef_DAY: 'Returns the day of month for a date value. ', - s_fdef_DCOUNT: 'Counts the number of numeric values, not blank, text, or error, in the specified field in records that meet the criteria. ', - s_fdef_DCOUNTA: 'Counts the number of non-blank values in the specified field in records that meet the criteria. ', - s_fdef_DDB: 'Returns the amount of depreciation at the given period of time (the default factor is 2 for double-declining balance). ', - s_fdef_DEGREES: 'Converts value in radians into degrees. ', - s_fdef_DGET: 'Returns the value of the specified field in the single record that meets the criteria. ', - s_fdef_DMAX: 'Returns the maximum of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DMIN: 'Returns the maximum of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DPRODUCT: 'Returns the result of multiplying the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DSTDEV: 'Returns the sample standard deviation of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DSTDEVP: 'Returns the standard deviation of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DSUM: 'Returns the sum of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DVAR: 'Returns the sample variance of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DVARP: 'Returns the variance of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_EVEN: 'Rounds the value up in magnitude to the nearest even integer. ', - s_fdef_EXACT: 'Returns "true" if the values are exactly the same, including case, type, etc. ', - s_fdef_EXP: 'Returns e raised to the value power. ', - s_fdef_FACT: 'Returns factorial of the value. ', - s_fdef_FALSE: 'Returns the logical value "false". ', - s_fdef_FIND: 'Returns the starting position within string2 of the first occurrence of string1 at or after "start". If start is omitted, 1 is assumed. ', - s_fdef_FV: '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). ', - s_fdef_HLOOKUP: '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. ', - s_fdef_HOUR: 'Returns the hour portion of a time or date/time value. ', - s_fdef_IF: 'Results in true-value if logical-expression is TRUE or non-zero, otherwise results in false-value. ', - s_fdef_INDEX: '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)). ', - s_fdef_INT: 'Returns the value rounded down to the nearest integer (towards -infinity). ', - s_fdef_IRR: '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%). ', - s_fdef_ISBLANK: 'Returns "true" if the value is a reference to a blank cell. ', - s_fdef_ISERR: 'Returns "true" if the value is of type "Error" but not "NA". ', - s_fdef_ISERROR: 'Returns "true" if the value is of type "Error". ', - s_fdef_ISLOGICAL: 'Returns "true" if the value is of type "Logical" (true/false). ', - s_fdef_ISNA: 'Returns "true" if the value is the error type "NA". ', - s_fdef_ISNONTEXT: 'Returns "true" if the value is not of type "Text". ', - s_fdef_ISNUMBER: 'Returns "true" if the value is of type "Number" (including logical values). ', - s_fdef_ISTEXT: 'Returns "true" if the value is of type "Text". ', - s_fdef_LEFT: 'Returns the specified number of characters from the text value. If count is omitted, 1 is assumed. ', - s_fdef_LEN: 'Returns the number of characters in the text value. ', - s_fdef_LN: 'Returns the natural logarithm of the value. ', - s_fdef_LOG: 'Returns the logarithm of the value using the specified base. ', - s_fdef_LOG10: 'Returns the base 10 logarithm of the value. ', - s_fdef_LOWER: 'Returns the text value with all uppercase characters converted to lowercase. ', - s_fdef_MATCH: '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. ', - s_fdef_MAX: 'Returns the maximum of the numeric values. ', - s_fdef_MID: 'Returns the specified number of characters from the text value starting from the specified position. ', - s_fdef_MIN: 'Returns the minimum of the numeric values. ', - s_fdef_MINUTE: 'Returns the minute portion of a time or date/time value. ', - s_fdef_MOD: 'Returns the remainder of the first value divided by the second. ', - s_fdef_MONTH: 'Returns the month part of a date value. ', - s_fdef_N: 'Returns the value if it is a numeric value otherwise an error. ', - s_fdef_NA: 'Returns the #N/A error value which propagates through most operations. ', - s_fdef_NOT: 'Returns FALSE if value is true, and TRUE if it is false. ', - s_fdef_NOW: 'Returns the current date/time. ', - s_fdef_NPER: '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. ', - s_fdef_NPV: '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. ', - s_fdef_ODD: 'Rounds the value up in magnitude to the nearest odd integer. ', - s_fdef_OR: 'True if any argument is true ', - s_fdef_PI: 'The value 3.1415926... ', - s_fdef_PMT: '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). ', - s_fdef_POWER: 'Returns the first value raised to the second value power. ', - s_fdef_PRODUCT: 'Returns the result of multiplying the numeric values. ', - s_fdef_PROPER: 'Returns the text value with the first letter of each word converted to uppercase and the others to lowercase. ', - s_fdef_PV: '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). ', - s_fdef_RADIANS: 'Converts value in degrees into radians. ', - s_fdef_RATE: '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%). ', - s_fdef_REPLACE: 'Returns text1 with the specified number of characters starting from the specified position replaced by text2. ', - s_fdef_REPT: 'Returns the text repeated the specified number of times. ', - s_fdef_RIGHT: 'Returns the specified number of characters from the text value starting from the end. If count is omitted, 1 is assumed. ', - s_fdef_ROUND: '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). ', - s_fdef_ROWS: 'Returns the number of rows in the range. ', - s_fdef_SECOND: 'Returns the second portion of a time or date/time value (truncated to an integer). ', - s_fdef_SIN: 'Trigonometric sine function (value is in radians) ', - s_fdef_SLN: 'Returns the amount of depreciation at each period of time using the straight-line method. ', - s_fdef_SQRT: 'Square root of the value ', - s_fdef_STDEV: 'Returns the sample standard deviation of the numeric values. ', - s_fdef_STDEVP: 'Returns the standard deviation of the numeric values. ', - s_fdef_SUBSTITUTE: 'Returns text1 with the all occurrences of oldtext replaced by newtext. If "occurrence" is present, then only that occurrence is replaced. ', - s_fdef_SUM: 'Adds the numeric values. The values to the sum function may be ranges in the form similar to A1:B5. ', - s_fdef_SUMIF: '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. ', - s_fdef_SYD: 'Depreciation by Sum of Year\'s Digits method. ', - s_fdef_T: 'Returns the text value or else a null string. ', - s_fdef_TAN: 'Trigonometric tangent function (value is in radians) ', - s_fdef_TIME: 'Returns the time value given the specified hour, minute, and second. ', - s_fdef_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. ', - s_fdef_TRIM: 'Returns the text value with leading, trailing, and repeated spaces removed. ', - s_fdef_TRUE: 'Returns the logical value "true". ', - s_fdef_TRUNC: 'Truncates the value to the specified number of decimal places. If precision is negative, truncate to powers of 10. ', - s_fdef_UPPER: 'Returns the text value with all lowercase characters converted to uppercase. ', - s_fdef_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. ', - s_fdef_VAR: 'Returns the sample variance of the numeric values. ', - s_fdef_VARP: 'Returns the variance of the numeric values. ', - s_fdef_VLOOKUP: '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. ', - s_fdef_WEEKDAY: '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. ', - s_fdef_YEAR: 'Returns the year part of a date value. ', - - s_farg_v: "value", - s_farg_vn: "value1, value2, ...", - s_farg_xy: "valueX, valueY", - s_farg_choose: "index, value1, value2, ...", - s_farg_range: "range", - s_farg_rangec: "range, criteria", - s_farg_date: "year, month, day", - s_farg_dfunc: "databaserange, fieldname, criteriarange", - s_farg_ddb: "cost, salvage, lifetime, period [, factor]", - s_farg_find: "string1, string2 [, start]", - s_farg_fv: "rate, n, payment, [pv, [paytype]]", - s_farg_hlookup: "value, range, row, [rangelookup]", - s_farg_iffunc: "logical-expression, true-value, false-value", - s_farg_index: "range, rownum, colnum", - s_farg_irr: "range, [guess]", - s_farg_tc: "text, count", - s_farg_log: "value, base", - s_farg_match: "value, range, [rangelookup]", - s_farg_mid: "text, start, length", - s_farg_nper: "rate, payment, pv, [fv, [paytype]]", - s_farg_npv: "rate, value1, value2, ...", - s_farg_pmt: "rate, n, pv, [fv, [paytype]]", - s_farg_pv: "rate, n, payment, [fv, [paytype]]", - s_farg_rate: "n, payment, pv, [fv, [paytype, [guess]]]", - s_farg_replace: "text1, start, length, text2", - s_farg_vp: "value, [precision]", - s_farg_valpre: "value, precision", - s_farg_csl: "cost, salvage, lifetime", - s_farg_cslp: "cost, salvage, lifetime, period", - s_farg_subs: "text1, oldtext, newtext [, occurrence]", - s_farg_sumif: "range1, criteria [, range2]", - s_farg_hms: "hour, minute, second", - s_farg_txt: "text", - s_farg_vlookup: "value, range, col, [rangelookup]", - s_farg_weekday: "date, [type]", - s_farg_dt: "date", - - function_classlist: ["all", "stat", "lookup", "datetime", "financial", "test", "math", "text"], // order of function classes - - s_fclass_all: "All", - s_fclass_stat: "Statistics", - s_fclass_lookup: "Lookup", - s_fclass_datetime: "Date & Time", - s_fclass_financial: "Financial", - s_fclass_test: "Test", - s_fclass_math: "Math", - s_fclass_text: "Text", - - lastone: null - - }; - -// Default classnames for use with SocialCalc.ConstantsSetClasses: - -SocialCalc.ConstantsDefaultClasses = { - defaultComment: "", - defaultCommentNoGrid: "", - defaultHighlightTypeCursor: "", - defaultHighlightTypeRange: "", - defaultColname: "", - defaultSelectedColname: "", - defaultRowname: "", - defaultSelectedRowname: "", - defaultUpperLeft: "", - defaultSkippedCell: "", - defaultPaneDivider: "", - cteGriddiv: "", // this one has no Style version with it - defaultInputEcho: {classname: "", style: "filter:alpha(opacity=90);opacity:.9;"}, // so FireFox won't show warning - TCmain: "", - TCendcap: "", - TCpaneslider: "", - TClessbutton: "", - TCmorebutton: "", - TCscrollarea: "", - TCthumb: "", - TCPStrackingline: "", - TCTDFSthumbstatus: "", - TDpopupElement: "" - }; - -// -// SocialCalc.ConstantsSetClasses(prefix) -// -// This routine goes through all of the xyzClass/xyzStyle pairs and sets the Class to a default and -// turns off the Style, if present. The prefix is put before each default. -// The list of items to set is in SocialCalc.ConstantsDefaultClasses. The names there -// correspond to the "xyz" parts. If there is a value, it is the default to set. If the -// default is a null, no change is made. If the default is the null string (""), the -// name of the item is used (e.g., "defaultComment" would use the classname "defaultComment"). -// If the default is an object, then it expects {classname: classname, style: stylestring} - this -// lets you combine both. -// - -SocialCalc.ConstantsSetClasses = function(prefix) { - - var defaults = SocialCalc.ConstantsDefaultClasses; - var scc = SocialCalc.Constants; - var item; - - prefix = prefix || ""; - - for (item in defaults) { - if (typeof defaults[item] == "string") { - scc[item+"Class"] = prefix + (defaults[item] || item); - if (scc[item+"Style"] !== undefined) { - scc[item+"Style"] = ""; - } - } - else if (typeof defaults[item] == "object") { - scc[item+"Class"] = prefix + (defaults[item].classname || item); - scc[item+"Style"] = defaults[item].style; - } - } - } - diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalcpopup.js b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalcpopup.js deleted file mode 100644 index a19e4da..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalcpopup.js +++ /dev/null @@ -1,1618 +0,0 @@ -// -/* -// The module of the SocialCalc package for the optional popup menus in socialcalcspreadsheetcontrol.js -// -// (c) Copyright 2009 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// -*/ - - var SocialCalc; // All values are stored in the master SocialCalc object - if (!SocialCalc) { - SocialCalc = {}; - } - - // The main Popup data -- there is only one set - - SocialCalc.Popup = {}; - - // Routines and values for each type of control, indexed by type name - // The value for each is an object constructed as follows: - // - // Create = function(type, id, attribs) - // Initialize = function(type, id, data) - // SetValue = function(type, id, value) - // GetValue = function(type, id) returns value - // SetDisabled = function(type, id, t/f) - // Show = function(type, id) - // Hide = function(type, id) - // Cancel = function(type, id) - // Reset = function(type) - // - // data = object to hold type-specific data - // - - SocialCalc.Popup.Types = {}; - - // Definitions for each individual control, indexed by id - // The value for each is an object constructed as follows: - // - // type: type name of the control - // value: current value of the control (usually a string, but can depend on type) - // data: object with type-specific items - // - - SocialCalc.Popup.Controls = {}; - - // System-wide values of currently active control - // - // id: id of current control or null - // - - SocialCalc.Popup.Current = {}; - - // Other values used by the Popup system - // - - SocialCalc.Popup.imagePrefix = "images/sc-"; // image prefix - - // Override this for localization - - SocialCalc.Popup.LocalizeString = function(str) {return str;}; - - -// * * * * * * * * * * * * * * * * -// -// GENERAL ROUTINES -// -// * * * * * * * * * * * * * * * * - -// -// SocialCalc.Popup.Create(type, id, attribs) -// -// Creates a control of type "type" as the children of document element "id" using "attribs" -// - -SocialCalc.Popup.Create = function(type, id, attribs) { - - var pt = SocialCalc.Popup.Types[type]; - if (pt && pt.Create) { - pt.Create(type, id, attribs); - } - - } - - -// -// SocialCalc.Popup.SetValue(id, value) -// -// Sets the value of control. -// - -SocialCalc.Popup.SetValue = function(id, value) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - var pt = spt[type]; - var spcdata = spc[id].data; - - if (pt && pt.Create) { - pt.SetValue(type, id, value); - if (spcdata.attribs && spcdata.attribs.changedcallback) { - spcdata.attribs.changedcallback(spcdata.attribs, id, value); - } - } - - } - - -// -// SocialCalc.Popup.SetDisabled(id, disabled) -// -// Sets whether the control is disabled (true) or not (false). -// - -SocialCalc.Popup.SetDisabled = function(id, disabled) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - if (sp.Current.id && id == sp.Current.id) { - pt.Hide(type, sp.Current.id); - sp.Current.id = null; - } - pt.SetDisabled(type, id, disabled); - } - - } - - -// -// SocialCalc.Popup.GetValue(id) -// -// Returns the value of control. -// - -SocialCalc.Popup.GetValue = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - return pt.GetValue(type, id); - } - - return null; - - } - - -// -// SocialCalc.Popup.Initialize(id, data) -// -// Gives "data" to the appropriate initialization code. -// - -SocialCalc.Popup.Initialize = function(id, data) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Initialize) { - pt.Initialize(type, id, data); - } - - } - - -// -// SocialCalc.Popup.Reset(type) -// -// Resets Popup, such as when turning to page. -// - -SocialCalc.Popup.Reset = function(type) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (spt[type].Reset) spt[type].Reset(type); - - } - - -// -// SocialCalc.Popup.CClick(id) -// -// Should be called when the user clicks on a control to do the popup -// - -SocialCalc.Popup.CClick = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - if (spc[id].data && spc[id].data.disabled) return; - - var type = spc[id].type; - - var pt = spt[type]; - - if (sp.Current.id) { - spt[spc[sp.Current.id].type].Hide(type, sp.Current.id); - if (id == sp.Current.id) { // same one - done - sp.Current.id = null; - return; - } - } - - if (pt && pt.Show) { - pt.Show(type, id); - } - - sp.Current.id = id; - - } - - -// -// SocialCalc.Popup.Close() -// -// Used to close any open popup. -// - -SocialCalc.Popup.Close = function() { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - sp.CClick(sp.Current.id); - - } - -// -// SocialCalc.Popup.Cancel() -// -// Closes Popup and restores old value -// - -SocialCalc.Popup.Cancel = function() { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - var type = spc[sp.Current.id].type; - - var pt = spt[type]; - - pt.Cancel(type, sp.Current.id); - - sp.Current.id = null; - - } - -// -// ele = SocialCalc.Popup.CreatePopupDiv(id, attribs) -// -// Utility function to create the main popup div of width attribs.width. -// If attribs.title, create one with that text, and optionally attribs.moveable. -// - -SocialCalc.Popup.CreatePopupDiv = function(id, attribs) { - - var pos, ele; - - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = document.createElement("div"); - main.style.position = "absolute"; - - pos = SocialCalc.GetElementPositionWithScroll(spcdata.mainele); - - main.style.top = (pos.top+spcdata.mainele.offsetHeight)+"px"; - main.style.left = (pos.left)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - if (attribs.width) { - main.style.width = attribs.width; - } - - spcdata.mainele.appendChild(main); - - if (attribs.title) { - main.innerHTML = ''+ - ''+ - '
    '+attribs.title+' X 
    '; - - if (attribs.moveable) { - spcdata.dragregistered = main.firstChild.firstChild.firstChild.firstChild; - SocialCalc.DragRegister(spcdata.dragregistered, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - } - } - - return main; - - } - -// -// SocialCalc.Popup.EnsurePosition(id, container) -// -// Utility function to make sure popup is positioned completely within container (both element objects) -// and appropriate with respect to the main element controlling the popup. -// - -SocialCalc.Popup.EnsurePosition = function(id, container) { - - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = spcdata.mainele.firstChild; - if (!main) {alert("No main popup element firstChild.");return}; - var popup = spcdata.popupele; - - function GetLayoutValues(ele) { - var r = SocialCalc.GetElementPositionWithScroll(ele); - r.height = ele.offsetHeight; - r.width = ele.offsetWidth; - r.bottom = r.top+r.height; - r.right = r.left+r.width; - return r; - } - - var p = GetLayoutValues(popup); - var c = GetLayoutValues(container); - var m = GetLayoutValues(main); - var t = 0; // type of placement -//addmsg("popup t/r/b/l/h/w= "+p.top+"/"+p.right+"/"+p.bottom+"/"+p.left+"/"+p.height+"/"+p.width); -//addmsg("container t/r/b/l/h/w= "+c.top+"/"+c.right+"/"+c.bottom+"/"+c.left+"/"+c.height+"/"+c.width); -//addmsg("main t/r/b/l/h/w= "+m.top+"/"+m.right+"/"+m.bottom+"/"+m.left+"/"+m.height+"/"+m.width); - - // Check various layout cases in priority order - - if (m.bottom+p.height < c.bottom && m.left+p.width < c.right) { // normal case: room on bottom and right - popup.style.top = m.bottom + "px"; - popup.style.left = m.left + "px"; - t = 1; - } - - else if (m.top-p.height > c.top && m.left+p.width < c.right) { // room on top and right - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = m.left + "px"; - t = 2; - } - - else if (m.bottom+p.height < c.bottom && m.right-p.width > c.left) { // room on bottom and left - popup.style.top = m.bottom + "px"; - popup.style.left = (m.right-p.width) + "px"; - t = 3; - } - - else if (m.top-p.height > c.top && m.right-p.width > c.left) { // room on top and left - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = (m.right-p.width) + "px"; - t = 4; - } - - else if (m.bottom+p.height < c.bottom && p.width < c.width) { // room on bottom and middle - popup.style.top = m.bottom + "px"; - popup.style.left = (c.left+Math.floor((c.width-p.width)/2)) + "px"; - t = 5; - } - - else if (m.top-p.height > c.top && p.width < c.width) { // room on top and middle - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = (c.left+Math.floor((c.width-p.width)/2)) + "px"; - t = 6; - } - - else if (p.height < c.height && m.right+p.width < c.right) { // room on middle and right - popup.style.top = (c.top+Math.floor((c.height-p.height)/2)) + "px"; - popup.style.left = m.right + "px"; - t = 7; - } - - else if (p.height < c.height && m.left-p.width > c.left) { // room on middle and left - popup.style.top = (c.top+Math.floor((c.height-p.height)/2)) + "px"; - popup.style.left = (m.left-p.width) + "px"; - t = 8; - } - - else { // nothing works, so leave as it is - } -//addmsg("Popup layout "+t); - -} - -// -// ele = SocialCalc.Popup.DestroyPopupDiv(ele, dragregistered) -// -// Utility function to get rid of the main popup div. -// - -SocialCalc.Popup.DestroyPopupDiv = function(ele, dragregistered) { - - if (!ele) return; - - ele.innerHTML = ""; - - SocialCalc.DragUnregister(dragregistered); // OK to do this even if not registered - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - } - -// -// Color Utility Functions -// - -SocialCalc.Popup.RGBToHex = function(val) { - - var sp = SocialCalc.Popup; - - if (val=="") { - return "000000"; - } - var rgbvals = val.match(/(\d+)\D+(\d+)\D+(\d+)/); - if (rgbvals) { - return sp.ToHex(rgbvals[1])+sp.ToHex(rgbvals[2])+sp.ToHex(rgbvals[3]); - } - else { - return "000000"; - } - } - -SocialCalc.Popup.HexDigits="0123456789ABCDEF"; - -SocialCalc.Popup.ToHex = function(num) { - var sp = SocialCalc.Popup; - var first=Math.floor(num / 16); - var second=num % 16; - return sp.HexDigits.charAt(first)+sp.HexDigits.charAt(second); - } - -SocialCalc.Popup.FromHex = function(str) { - - var sp = SocialCalc.Popup; - var first = sp.HexDigits.indexOf(str.charAt(0).toUpperCase()); - var second = sp.HexDigits.indexOf(str.charAt(1).toUpperCase()); - return ((first>=0)?first:0)*16+((second>=0)?second:0); - } - -SocialCalc.Popup.HexToRGB = function(val) { - - var sp = SocialCalc.Popup; - - return "rgb("+sp.FromHex(val.substring(1,3))+","+sp.FromHex(val.substring(3,5))+","+sp.FromHex(val.substring(5,7))+")"; - - } - -SocialCalc.Popup.makeRGB = function(r, g, b) { - return "rgb("+(r>0?r:0)+","+(g>0?g:0)+","+(b>0?b:0)+")"; - } - -SocialCalc.Popup.splitRGB = function(rgb) { - var parts = rgb.match(/(\d+)\D+(\d+)\D+(\d+)\D/); - if (!parts) { - return {r:0, g:0, b:0}; - } - else { - return {r: parts[1]-0, g: parts[2]-0, b: parts[3]-0}; - } - } - -// * * * * * * * * * * * * * * * * -// -// ROUTINES FOR EACH TYPE -// -// * * * * * * * * * * * * * * * * - -// -// List -// -// type: List -// value: value of control, -// display: "value to display", -// custom: true if custom value, -// disabled: t/f, -// attribs: { -// title: "popup title string", -// moveable: t/f, -// width: optional width, e.g., "100px", -// ensureWithin: optional element object to ensure popup fits within if possible -// changedcallback: optional function(attribs, id, newvalue), -// ... -// } -// data: { -// ncols: calculated number of columns -// options: [ -// {o: option-name, v: value-to-return, -// a: {option attribs} // optional: {skip: true, custom: true, cancel: true, newcol: true} -// }, -// ...] -// } -// -// popupele: gets popup element object when created -// contentele: gets element created with all the content -// listdiv: gets div with list of items -// customele: gets input element with custom value -// dragregistered: gets element, if any, registered as draggable -// - -SocialCalc.Popup.Types.List = {}; - -SocialCalc.Popup.Types.List.Create = function(type, id, attribs) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - var spcid = {type: type, value: "", display: "", data: {}}; - if (spc[id]) { return;} - spc[id] = spcid; - var spcdata = spcid.data; - - spcdata.attribs = attribs || {}; - - var ele = document.getElementById(id); - if (!ele) {alert("Missing element "+id); return;} - - spcdata.mainele = ele; - - ele.innerHTML = ''; - - spcdata.options = []; // set to nothing - use Initialize to fill - - } - -SocialCalc.Popup.Types.List.SetValue = function(type, id, value) { - - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - spcdata.value = value; - spcdata.custom = false; - - for (i=0; i'; - - spcdata.customele = ele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = ele; - } - else { - str = SocialCalc.Popup.Types.List.MakeList(type, id); - - ele = document.createElement("div"); - ele.innerHTML = '
    '+str+'
    '; - - spcdata.customele = null; - spcdata.listdiv = ele.firstChild; - spcdata.contentele = ele; - } - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = true; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - -SocialCalc.Popup.Types.List.MakeList = function(type, id) { - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data - - var str = ''; - var td = '
    '; - - str += td; - - spcdata.ncols = 1; - - for (i=0; i'+td; - spcdata.ncols += 1; - continue; - } - if (o.a.skip) { - str += '
    '+o.o+'
    '; - continue; - } - } - if (o.v == spcdata.value && !(o.a && (o.a.custom || o.a.cancel))) { // matches value - bg = "background-color:#DDF;"; - } - else { - bg = ""; - } - str += '
    '+o.o+'
    '; - } - - str += "
    "; - - return str; - - } - - -SocialCalc.Popup.Types.List.MakeCustom = function(type, id) { - - var SPLoc = SocialCalc.Popup.LocalizeString; - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - var val = spcdata.value; - val = SocialCalc.special_chars(val); - - str = '

    '+ - '

    '+ - ''+ - ''+ - ''+ - '
    '; - - return str; - - } - - -SocialCalc.Popup.Types.List.ItemClicked = function(id, num) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var a = spcdata.options[num].a; - - if (a && a.custom) { - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeCustom("List", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = nele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - return; - } - - if (a && a.cancel) { - SocialCalc.Popup.Close(); - return; - } - - SocialCalc.Popup.SetValue(id, spcdata.options[num].v); - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.List.CustomToList = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeList("List", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = null; - spcdata.listdiv = nele.firstChild; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - } - - -SocialCalc.Popup.Types.List.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.customele.value); - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.List.MouseMove = function(id, ele) { - - var col, i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var list = spcdata.listdiv; - - if (!list) return; - - var rowele = list.firstChild.firstChild.firstChild; // div.table.tbody.tr - - for (col=0; col '; - - } - -SocialCalc.Popup.Types.ColorChooser.SetValue = function(type, id, value) { - - var i, img, pos; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.value = value; - spcdata.custom = false; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (spcdata.value) { - spcdata.mainele.firstChild.style.backgroundColor = spcdata.value; - if (spca.backgroundImage) { - img = "url("+sp.imagePrefix+spca.backgroundImage+")"; - } - else { - img = ""; - } - pos = "center center"; - } - else { - spcdata.mainele.firstChild.style.backgroundColor = "#FFF"; - if (spca.backgroundImageDefault) { - img = "url("+sp.imagePrefix+spca.backgroundImageDefault+")"; - pos = "center center"; - } - else { - img = "url("+sp.imagePrefix+"defaultcolor.gif)"; - pos = "left top"; - } - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } - - } - - -SocialCalc.Popup.Types.ColorChooser.SetDisabled = function(type, id, disabled) { - - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.disabled = disabled; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (disabled) { - spcdata.mainele.firstChild.style.backgroundColor = "#DDD"; - if (spca.backgroundImageDisabled) { - img = "url("+sp.imagePrefix+spca.backgroundImageDisabled+")"; - pos = "center center"; - } - else { - img = "url("+sp.imagePrefix+"defaultcolor.gif)"; - pos = "left top"; - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } - else { - sp.SetValue(id, spcdata.value); - } - } - - } - - -SocialCalc.Popup.Types.ColorChooser.GetValue = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - return spcdata.value; - - } - - -SocialCalc.Popup.Types.ColorChooser.Initialize = function(type, id, data) { - - var a; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - for (a in data.attribs) { - spcdata.attribs[a] = data.attribs[a]; - } - - if (data.value) { // if has a value, set to it - sp.SetValue(id, data.value); - } - - } - - -SocialCalc.Popup.Types.ColorChooser.Reset = function(type) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (sp.Current.id && spc[sp.Current.id].type == type) { // we have a popup - spt[type].Hide(type, sp.Current.id); - sp.Current.id = null; - } - - } - - -SocialCalc.Popup.Types.ColorChooser.Show = function(type, id) { - - var i, ele, mainele; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data - - var str = ""; - - spcdata.oldvalue = spcdata.value; // remember starting value - - spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs); - - if (spcdata.custom) { - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom(type, id); - - ele = document.createElement("div"); - ele.innerHTML = '
    '+str+'
    '; - - spcdata.customele = ele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = ele; - } - else { - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid(type, id); - - ele = document.createElement("div"); - ele.style.padding = "3px"; - ele.style.backgroundColor = "#CCC"; - ele.appendChild(mainele); - - spcdata.customele = null; - spcdata.contentele = ele; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - -SocialCalc.Popup.Types.ColorChooser.MakeCustom = function(type, id) { - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var SPLoc = sp.LocalizeString; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - str = '

    '+ - '#

    '+ - ''+ - ''+ - '
    '; - - return str; - - } - - -SocialCalc.Popup.Types.ColorChooser.ItemClicked = function(id, num) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.ColorChooser.CustomToList = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - } - - -SocialCalc.Popup.Types.ColorChooser.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.customele.value); - - sp.Close(); - - } - - -SocialCalc.Popup.Types.ColorChooser.Hide = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered); - spcdata.popupele = null; - - } - - -SocialCalc.Popup.Types.ColorChooser.Cancel = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.oldvalue); // reset to old value - - SocialCalc.Popup.Types.ColorChooser.Hide(type, id); - - } - - -SocialCalc.Popup.Types.ColorChooser.CreateGrid = function (type, id) { - - var ele, pos, row, rowele, col, g; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var SPLoc = sp.LocalizeString; - var spcdata = spc[id].data; - spcdata.grid = {}; - var grid = spcdata.grid; - - var mainele = document.createElement("div"); - - ele = document.createElement("table"); - ele.cellSpacing = 0; - ele.cellPadding = 0; - ele.style.width = "100px"; - grid.table = ele; - - ele = document.createElement("tbody"); - grid.table.appendChild(ele); - grid.tbody = ele; - - for (row=0; row<16; row++) { - rowele = document.createElement("tr"); - for (col=0; col<5; col++) { - g = {}; - grid[row+","+col] = g; - ele = document.createElement("td"); - ele.style.fontSize = "1px"; - ele.innerHTML = " "; - ele.style.height = "10px"; - if (col<=1) { - ele.style.width = "17px"; - ele.style.borderRight = "3px solid white"; - } - else { - ele.style.width = "20px"; - ele.style.backgroundRepeat = "no-repeat"; - } - rowele.appendChild(ele); - g.ele = ele; - } - grid.tbody.appendChild(rowele); - } - mainele.appendChild(grid.table); - - ele = document.createElement("div"); - ele.style.marginTop = "3px"; - ele.innerHTML = ''+ - ''+ - ''+ - ''+ - '
     #'+SPLoc("OK")+'
    '; - grid.defaultbox = ele.firstChild.firstChild.firstChild.childNodes[0]; - grid.defaultbox.onclick = spt.ColorChooser.DefaultClicked; - grid.custom = ele.firstChild.firstChild.firstChild.childNodes[1]; - grid.custom.onclick = spt.ColorChooser.CustomClicked; - grid.msg = ele.firstChild.firstChild.firstChild.childNodes[2]; - grid.msg.onclick = spt.ColorChooser.CloseOK; - mainele.appendChild(ele); - - grid.table.onmousedown = spt.ColorChooser.GridMouseDown; - - spt.ColorChooser.DetermineColors(id); - spt.ColorChooser.SetColors(id); - - return mainele; - - } - -SocialCalc.Popup.Types.ColorChooser.gridToG = function(grid, row, col) { - - return grid[row+","+col]; - - } - -SocialCalc.Popup.Types.ColorChooser.DetermineColors = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - var col, row; - var rgb = sp.splitRGB(spcdata.value); - var color; - - col = 2; - row = 16-Math.floor((rgb.r+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(17*(15-row),0,0); - } - - col = 3; - row = 16-Math.floor((rgb.g+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(0,17*(15-row),0); - } - - col = 4; - row = 16-Math.floor((rgb.b+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(0,0,17*(15-row)); - } - - col = 1; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(17*(15-row),17*(15-row),17*(15-row)); - } - - col = 0; - var steps = [0, 68, 153, 204, 255]; - var commonrgb = ["400", "310", "420", "440", "442", "340", "040", "042", "032", "044", "024", "004", "204", "314", "402", "414"]; - var x; - for (row=0; row<16; row++) { - x = commonrgb[row]; - sptc.gridToG(grid,row,col).rgb = "rgb("+steps[x.charAt(0)-0]+","+steps[x.charAt(1)-0]+","+steps[x.charAt(2)-0]+")"; - } - - } - -SocialCalc.Popup.Types.ColorChooser.SetColors = function(id) { - - var row, col, g, ele, rgb; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - for (row=0; row<16; row++) { - for (col=0; col<5; col++) { - g = sptc.gridToG(grid,row, col); - g.ele.style.backgroundColor = g.rgb; - g.ele.title = sp.RGBToHex(g.rgb); - if (grid["selectedrow"+col]==row) { - g.ele.style.backgroundImage = "url("+sp.imagePrefix+"chooserarrow.gif)"; - } - else { - g.ele.style.backgroundImage = ""; - } - } - } - - sp.SetValue(id, spcdata.value); - - grid.msg.style.backgroundColor = spcdata.value; - rgb = sp.splitRGB(spcdata.value || "rgb(255,255,255)"); - if (rgb.r+rgb.g+rgb.b < 220) { - grid.msg.style.color = "#FFF"; - } - else { - grid.msg.style.color = "#000"; - } - if (!spcdata.value) { // default - grid.msg.style.backgroundColor = "#FFF"; - grid.msg.style.backgroundImage = "url("+sp.imagePrefix+"defaultcolor.gif)"; - grid.msg.title = "Default"; - } - else { - grid.msg.style.backgroundImage = ""; - grid.msg.title = sp.RGBToHex(spcdata.value); - } - - } - -SocialCalc.Popup.Types.ColorChooser.GridMouseDown = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - var grid = spcdata.grid; - - switch (event.type) { - case "mousedown": - grid.mousedown = true; - break; - case "mouseup": - grid.mousedown = false; - break; - case "mousemove": - if (!grid.mousedown) { - return; - } - break; - } - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - var gpos = SocialCalc.GetElementPosition(grid.table); - var row = Math.floor((clientY-gpos.top-2)/10); // -2 is to split the diff btw IE & FF - row = row < 0 ? 0 : row; - var col = Math.floor((clientX-gpos.left)/20); - row = row < 0 ? 0 : (row > 15 ? 15 : row); - col = col < 0 ? 0 : (col > 4 ? 4 : col); - var color = sptc.gridToG(grid,row,col).ele.style.backgroundColor; - var newrgb = sp.splitRGB(color); - var oldrgb = sp.splitRGB(spcdata.value); - - switch (col) { - case 2: - spcdata.value = sp.makeRGB(newrgb.r, oldrgb.g, oldrgb.b); - break; - case 3: - spcdata.value = sp.makeRGB(oldrgb.r, newrgb.g, oldrgb.b); - break; - case 4: - spcdata.value = sp.makeRGB(oldrgb.r, oldrgb.g, newrgb.b); - break; - case 0: - case 1: - spcdata.value = color; - } - - sptc.DetermineColors(id); - sptc.SetColors(id); - - } - - -SocialCalc.Popup.Types.ColorChooser.ControlClicked = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var cid = sp.Current.id; - if (!cid || id != cid) { - sp.CClick(id); - return; - } - - sptc.CloseOK(); - - } - -SocialCalc.Popup.Types.ColorChooser.DefaultClicked = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - spcdata.value = ""; - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - - } - -SocialCalc.Popup.Types.ColorChooser.CustomClicked = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - var oele, str, nele; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom("ColorChooser", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = nele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - spcdata.customele.value = sp.RGBToHex(spcdata.value); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - - -SocialCalc.Popup.Types.ColorChooser.CustomToGrid = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#"+spcdata.customele.value)); - - var oele, mainele, nele; - - oele = spcdata.contentele; - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid("ColorChooser", id); - nele = document.createElement("div"); - nele.style.padding = "3px"; - nele.style.backgroundColor = "#CCC"; - nele.appendChild(mainele); - spcdata.customele = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - } - - -SocialCalc.Popup.Types.ColorChooser.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#"+spcdata.customele.value)); - - SocialCalc.Popup.Close(); - - } - -SocialCalc.Popup.Types.ColorChooser.CloseOK = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - - } - diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalcspreadsheetcontrol.js b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalcspreadsheetcontrol.js deleted file mode 100644 index 2e1f77d..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalcspreadsheetcontrol.js +++ /dev/null @@ -1,3687 +0,0 @@ -// -// SocialCalcSpreadsheetControl -// -/* -// The code module of the SocialCalc package that lets you embed a spreadsheet -// control with toolbar, etc., into a web page. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript SpreadsheetControl. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the SpreadsheetControl is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/ - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); - } - -// ************************************* -// -// SpreadsheetControl class: -// -// ************************************* - -// Global constants: - - SocialCalc.CurrentSpreadsheetControlObject = null; // right now there can only be one active at a time - - -// Constructor: - -SocialCalc.SpreadsheetControl = function() { - - var scc = SocialCalc.Constants; - - // Properties: - - this.parentNode = null; - this.spreadsheetDiv = null; - this.requestedHeight = 0; - this.requestedWidth = 0; - this.requestedSpaceBelow = 0; - this.height = 0; - this.width = 0; - this.viewheight = 0; // calculated amount for views below toolbar, etc. - - // Tab definitions: An array where each tab is an object of the form: - // - // name: "name", - // text: "text-on-tab", - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext - // Other replacements from spreadsheet.tabreplacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // view: "viewname", // view to show when selected; "sheet" or missing/null is spreadsheet - // oncreate: function(spreadsheet, tab-name), // called when first created to initialize - // onclick: function(spreadsheet, tab-name), missing/null is sheet default - // onclickFocus: text, // spreadsheet.idPrefix+text is given the focus if present instead of normal KeyboardFocus - // or if text isn't a string, that value (e.g., true) is used for SocialCalc.CmdGotFocus - // onunclick: function(spreadsheet, tab-name), missing/null is sheet default - - this.tabs = []; - this.tabnums = {}; // when adding tabs, add tab-name: array-index to this object - this.tabreplacements = {}; // see use above - this.currentTab = -1; // currently selected tab index in this.tabs or -1 (maintained by SocialCalc.SetTab) - - // View definitions: An object where each view is an object of the form: - // - // name: "name", // localized when first set using SocialCalc.LocalizeString - // element: node-in-the-dom, // filled in when initialized - // replacements: {}, // see below - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext, "%img.": spreadsheet.imagePrefix, - // SocialCalc.LocalizeSubstring replacements ("%loc!string!" and "%ssc!constant-name!") - // Other replacements from viewobject.replacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // divStyle: attributes for sheet div (SocialCalc.setStyles format) - // oncreate: function(spreadsheet, viewobject), // called when first created to initialize - // needsresize: true/false/null, // if true, do resize calc after displaying - // onresize: function(spreadsheet, viewobject), // called if needs resize - // values: {} // optional values to share with onclick handlers, etc. - // - // There is always a "sheet" view. - - this.views = {}; // {viewname: view-object, ...} - - // Dynamic properties: - - this.sheet = null; - this.context = null; - this.editor = null; - - this.spreadsheetDiv = null; - this.editorDiv = null; - - this.sortrange = ""; // remembered range for sort tab - - this.moverange = ""; // remembered range from movefrom used by movepaste/moveinsert - - // Constants: - - this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-" - this.multipartBoundary = "SocialCalcSpreadsheetControlSave"; // boundary used by SpreadsheetControlCreateSpreadsheetSave - this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src - - this.toolbarbackground = scc.SCToolbarbackground; - this.tabbackground = scc.SCTabbackground; // "background-color:#CCC;"; - this.tabselectedCSS = scc.SCTabselectedCSS; - this.tabplainCSS = scc.SCTabplainCSS; - this.toolbartext = scc.SCToolbartext; - - this.formulabarheight = scc.SCFormulabarheight; // in pixels, will contain a text input box - - - if (scc.doWorkBook) { - this.sheetbarheight = scc.SCSheetBarHeight; - this.sheetbarCSS = scc.SCSheetBarCSS; - } else { - this.sheetbarheight = 0; - } - - - this.statuslineheight = scc.SCStatuslineheight; // in pixels - this.statuslineCSS = scc.SCStatuslineCSS; - - // Callbacks: - - this.ExportCallback = null; // a function called for Clipboard Export button: this.ExportCallback(spreadsheet_control_object) - - // Initialization Code: - - this.sheet = new SocialCalc.Sheet(); - this.context = new SocialCalc.RenderContext(this.sheet); - this.context.showGrid=true; - this.context.showRCHeaders=true; - this.editor = new SocialCalc.TableEditor(this.context); - this.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetControlStatuslineCallback, - params: {statuslineid: this.idPrefix+"statusline", - recalcid1: this.idPrefix+"divider_recalc", - recalcid2: this.idPrefix+"button_recalc"}}; - - SocialCalc.CurrentSpreadsheetControlObject = this; // remember this for rendezvousing on events - - this.editor.MoveECellCallback.movefrom = function(editor) { - var cr; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - spreadsheet.context.cursorsuffix = ""; - if (editor.range2.hasrange && !editor.cellhandles.noCursorSuffix) { - if (editor.ecell.row==editor.range2.top && (editor.ecell.coleditor.range2.right+1)) { - spreadsheet.context.cursorsuffix = "insertleft"; - } - if (editor.ecell.col==editor.range2.left && (editor.ecell.roweditor.range2.bottom+1)) { - spreadsheet.context.cursorsuffix = "insertup"; - } - } - }; - - // formula bar buttons - - this.formulabuttons = { - formulafunctions: {image: "formuladialog.gif", tooltip: "Functions", // tooltips are localized when set below - command: SocialCalc.SpreadsheetControl.DoFunctionList}, - multilineinput: {image: "multilinedialog.gif", tooltip: "Multi-line Input Box", - command: SocialCalc.SpreadsheetControl.DoMultiline}, - link: {image: "linkdialog.gif", tooltip: "Link Input Box", - command: SocialCalc.SpreadsheetControl.DoLink}, - sum: {image: "sumdialog.gif", tooltip: "Auto Sum", - command: SocialCalc.SpreadsheetControl.DoSum}, -/* image: {image: "sumdialog.gif", tooltip: "Insert", - command: SocialCalc.Images.Insert }*/ - } - - // Default tabs: - - // Edit - - this.tabnums.edit = this.tabs.length; - this.tabs.push({name: "edit", text: "Edit", html: - '
    '+ -' '+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -''+ -' '+ -'    '+ -''+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -' '+ -' '+ -' '+ -'    '+ -' '+ -' '+ -'    '+ -' '+ -' '+ -'  '+ -' '+ -'    '+ -' '+ - '
    ', - oncreate: null, //function(spreadsheet, viewobject) {SocialCalc.DoCmd(null, "fill-rowcolstuff");}, - onclick: null}); - - // Settings (Format) - - this.tabnums.settings = this.tabs.length; - this.tabs.push({name: "settings", text: "Format", html: - '', - view: "settings", - onclick: function(s, t) { - SocialCalc.SettingsControls.idPrefix = s.idPrefix; // used to get color chooser div - SocialCalc.SettingControlReset(); - var sheetattribs = s.sheet.EncodeSheetAttributes(); - var cellattribs = s.sheet.EncodeCellAttributes(s.editor.ecell.coord); - SocialCalc.SettingsControlLoadPanel(s.views.settings.values.sheetspanel, sheetattribs); - SocialCalc.SettingsControlLoadPanel(s.views.settings.values.cellspanel, cellattribs); - document.getElementById(s.idPrefix+"settingsecell").innerHTML = s.editor.ecell.coord; - SocialCalc.SpreadsheetControlSettingsSwitch("cell"); - s.views.settings.element.style.height = s.viewheight+"px"; - s.views.settings.element.firstChild.style.height = s.viewheight+"px"; - - var range; // set save message - if (s.editor.range.hasrange) { - range = SocialCalc.crToCoord(s.editor.range.left, s.editor.range.top) + ":" + - SocialCalc.crToCoord(s.editor.range.right, s.editor.range.bottom); - } - else { - range = s.editor.ecell.coord; - } - document.getElementById(s.idPrefix+"settings-savecell").value = SocialCalc.LocalizeString("Save to")+": "+range; - }, - onclickFocus: true - }); - - this.views["settings"] = {name: "settings", values: {}, - oncreate: function(s, viewobj) { - var scc = SocialCalc.Constants; - - viewobj.values.sheetspanel = { -// name: "sheet", - colorchooser: {id: s.idPrefix+"scolorchooser"}, - formatnumber: {setting: "numberformat", type: "PopupList", id: s.idPrefix+"formatnumber", - initialdata: scc.SCFormatNumberFormats}, - formattext: {setting: "textformat", type: "PopupList", id: s.idPrefix+"formattext", - initialdata: scc.SCFormatTextFormats}, - fontfamily: {setting: "fontfamily", type: "PopupList", id: s.idPrefix+"fontfamily", - initialdata: scc.SCFormatFontfamilies}, - fontlook: {setting: "fontlook", type: "PopupList", id: s.idPrefix+"fontlook", - initialdata: scc.SCFormatFontlook}, - fontsize: {setting: "fontsize", type: "PopupList", id: s.idPrefix+"fontsize", - initialdata: scc.SCFormatFontsizes}, - textalignhoriz: {setting: "textalignhoriz", type: "PopupList", id: s.idPrefix+"textalignhoriz", - initialdata: scc.SCFormatTextAlignhoriz}, - numberalignhoriz: {setting: "numberalignhoriz", type: "PopupList", id: s.idPrefix+"numberalignhoriz", - initialdata: scc.SCFormatNumberAlignhoriz}, - alignvert: {setting: "alignvert", type: "PopupList", id: s.idPrefix+"alignvert", - initialdata: scc.SCFormatAlignVertical}, - textcolor: {setting: "textcolor", type: "ColorChooser", id: s.idPrefix+"textcolor"}, - bgcolor: {setting: "bgcolor", type: "ColorChooser", id: s.idPrefix+"bgcolor"}, - padtop: {setting: "padtop", type: "PopupList", id: s.idPrefix+"padtop", - initialdata: scc.SCFormatPadsizes}, - padright: {setting: "padright", type: "PopupList", id: s.idPrefix+"padright", - initialdata: scc.SCFormatPadsizes}, - padbottom: {setting: "padbottom", type: "PopupList", id: s.idPrefix+"padbottom", - initialdata: scc.SCFormatPadsizes}, - padleft: {setting: "padleft", type: "PopupList", id: s.idPrefix+"padleft", - initialdata: scc.SCFormatPadsizes}, - colwidth: {setting: "colwidth", type: "PopupList", id: s.idPrefix+"colwidth", - initialdata: scc.SCFormatColwidth}, - recalc: {setting: "recalc", type: "PopupList", id: s.idPrefix+"recalc", - initialdata: scc.SCFormatRecalc} - }; - viewobj.values.cellspanel = { - name: "cell", - colorchooser: {id: s.idPrefix+"scolorchooser"}, - cformatnumber: {setting: "numberformat", type: "PopupList", id: s.idPrefix+"cformatnumber", - initialdata: scc.SCFormatNumberFormats}, - cformattext: {setting: "textformat", type: "PopupList", id: s.idPrefix+"cformattext", - initialdata: scc.SCFormatTextFormats}, - cfontfamily: {setting: "fontfamily", type: "PopupList", id: s.idPrefix+"cfontfamily", - initialdata: scc.SCFormatFontfamilies}, - cfontlook: {setting: "fontlook", type: "PopupList", id: s.idPrefix+"cfontlook", - initialdata: scc.SCFormatFontlook}, - cfontsize: {setting: "fontsize", type: "PopupList", id: s.idPrefix+"cfontsize", - initialdata: scc.SCFormatFontsizes}, - calignhoriz: {setting: "alignhoriz", type: "PopupList", id: s.idPrefix+"calignhoriz", - initialdata: scc.SCFormatTextAlignhoriz}, - calignvert: {setting: "alignvert", type: "PopupList", id: s.idPrefix+"calignvert", - initialdata: scc.SCFormatAlignVertical}, - ctextcolor: {setting: "textcolor", type: "ColorChooser", id: s.idPrefix+"ctextcolor"}, - cbgcolor: {setting: "bgcolor", type: "ColorChooser", id: s.idPrefix+"cbgcolor"}, - cbt: {setting: "bt", type: "BorderSide", id: s.idPrefix+"cbt"}, - cbr: {setting: "br", type: "BorderSide", id: s.idPrefix+"cbr"}, - cbb: {setting: "bb", type: "BorderSide", id: s.idPrefix+"cbb"}, - cbl: {setting: "bl", type: "BorderSide", id: s.idPrefix+"cbl"}, - cpadtop: {setting: "padtop", type: "PopupList", id: s.idPrefix+"cpadtop", - initialdata: scc.SCFormatPadsizes}, - cpadright: {setting: "padright", type: "PopupList", id: s.idPrefix+"cpadright", - initialdata: scc.SCFormatPadsizes}, - cpadbottom: {setting: "padbottom", type: "PopupList", id: s.idPrefix+"cpadbottom", - initialdata: scc.SCFormatPadsizes}, - cpadleft: {setting: "padleft", type: "PopupList", id: s.idPrefix+"cpadleft", - initialdata: scc.SCFormatPadsizes} - }; - - SocialCalc.SettingsControlInitializePanel(viewobj.values.sheetspanel); - SocialCalc.SettingsControlInitializePanel(viewobj.values.cellspanel); - }, - replacements: { - itemtitle: {regex: /\%itemtitle\./g, replacement: 'style="padding:12px 10px 0px 10px;font-weight:bold;text-align:right;vertical-align:top;font-size:small;"'}, - sectiontitle: {regex: /\%sectiontitle\./g, replacement: 'style="padding:16px 10px 0px 0px;font-weight:bold;vertical-align:top;font-size:small;color:#C00;"'}, - parttitle: {regex: /\%parttitle\./g, replacement: 'style="font-weight:bold;font-size:x-small;padding:0px 0px 3px 0px;"'}, - itembody: {regex: /\%itembody\./g, replacement: 'style="padding:12px 0px 0px 0px;vertical-align:top;font-size:small;"'}, - bodypart: {regex: /\%bodypart\./g, replacement: 'style="padding:0px 10px 0px 0px;font-size:small;vertical-align:top;"'} - }, - divStyle: "border:1px solid black;overflow:auto;", - html: - ''+ -''+ -'
    '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -'

    %loc!Format!:
    '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Number!
    '+ -' '+ -'
    '+ -'
    %loc!Text!
    '+ -' '+ -'
    '+ -'

    %loc!Alignment!:
    '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Horizontal!
    '+ -' '+ -'
    '+ -'
    %loc!Vertical!
    '+ -' '+ -'
    '+ -'

    %loc!Font!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Family!
    '+ -' '+ -'
    '+ -'
    %loc!Bold & Italics!
    '+ -' '+ -'
    '+ -'
    %loc!Size!
    '+ -' '+ -'
    '+ -'
    %loc!Color!
    '+ -'
    '+ -'
    '+ -'
    %loc!Background!
    '+ -'
    '+ -'
    '+ -'

    %loc!Borders!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    %loc!Top Border!
    %loc!Right Border!
    %loc!Bottom Border!
    %loc!Left Border!
    '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        
    '+ -'

    %loc!Padding!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Top!
    '+ -' '+ -'
    '+ -'
    %loc!Right!
    '+ -' '+ -'
    '+ -'
    %loc!Bottom!
    '+ -' '+ -'
    '+ -'
    %loc!Left!
    '+ -' '+ -'
    '+ -'
    '+ -'
    '+ -'
    '+ -' '+ -' '+ -'
    %loc!This is a
    sample!
    -1234.5
    '+ -'
    '+ -'
    '+ -'
    ' - }; - - // Sort - - this.tabnums.sort = this.tabs.length; - this.tabs.push({name: "sort", text: "Sort", html: - ' ', - onclick: SocialCalc.SpreadsheetControlSortOnclick}); - this.editor.SettingsCallbacks.sort = {save: SocialCalc.SpreadsheetControlSortSave, load: SocialCalc.SpreadsheetControlSortLoad}; - - // Audit - - this.tabnums.audit = this.tabs.length; - this.tabs.push({name: "audit", text: "Audit", html: - '', - view: "audit", - onclick: - function(s, t) { - var SCLoc = SocialCalc.LocalizeString; - var i, j; - var str = '
    '+SCLoc("Audit Trail This Session")+':

    '; - var stack = s.sheet.changes.stack; - var tos = s.sheet.changes.tos; - for (i=0; i'; - for (j=0; j"; - } - } - s.views.audit.element.innerHTML = str+"
    "; - SocialCalc.CmdGotFocus(true); - }, - onclickFocus: true - }); - - this.views["audit"] = {name: "audit", - divStyle: "border:1px solid black;overflow:auto;", - html: 'Audit Trail' - }; - - // Comment - - this.tabnums.comment = this.tabs.length; - this.tabs.push({name: "comment", text: "Comment", html: - '', - view: "sheet", - onclick: SocialCalc.SpreadsheetControlCommentOnclick, - onunclick: SocialCalc.SpreadsheetControlCommentOnunclick - }); - - // Names - - this.tabnums.names = this.tabs.length; - this.tabs.push({name: "names", text: "Names", html: - '', - view: "sheet", - onclick: SocialCalc.SpreadsheetControlNamesOnclick, - onunclick: SocialCalc.SpreadsheetControlNamesOnunclick - }); - - // Clipboard - - this.tabnums.clipboard = this.tabs.length; - this.tabs.push({name: "clipboard", text: "Clipboard", html: - '', - view: "clipboard", - onclick: SocialCalc.SpreadsheetControlClipboardOnclick, - onclickFocus: "clipboardtext" - }); - - this.views["clipboard"] = {name: "clipboard", divStyle: "overflow:auto;", html: - '
    '+ - ' %loc!Display Clipboard in!:'+ - ' %loc!Tab-delimited format!  '+ - ' %loc!CSV format!  '+ - ' %loc!SocialCalc-save format!'+ - '
    '+ - '   '+ - '   '+ - '
    '+ - ' ' - }; - - return; - - } - -// Methods: - -SocialCalc.SpreadsheetControl.prototype.InitializeSpreadsheetControl = - function(node, height, width, spacebelow) {return SocialCalc.InitializeSpreadsheetControl(this, node, height, width, spacebelow);}; -SocialCalc.SpreadsheetControl.prototype.DoOnResize = function() {return SocialCalc.DoOnResize(this);}; -SocialCalc.SpreadsheetControl.prototype.SizeSSDiv = function() {return SocialCalc.SizeSSDiv(this);}; -SocialCalc.SpreadsheetControl.prototype.ExecuteCommand = - function(combostr, sstr) {return SocialCalc.SpreadsheetControlExecuteCommand(this, combostr, sstr);}; -SocialCalc.SpreadsheetControl.prototype.CreateSheetHTML = - function() {return SocialCalc.SpreadsheetControlCreateSheetHTML(this);}; -SocialCalc.SpreadsheetControl.prototype.CreateSpreadsheetSave = - function(otherparts) {return SocialCalc.SpreadsheetControlCreateSpreadsheetSave(this, otherparts);}; -SocialCalc.SpreadsheetControl.prototype.DecodeSpreadsheetSave = - function(str) {return SocialCalc.SpreadsheetControlDecodeSpreadsheetSave(this, str);}; -SocialCalc.SpreadsheetControl.prototype.CreateCellHTML = - function(coord) {return SocialCalc.SpreadsheetControlCreateCellHTML(this, coord);}; -SocialCalc.SpreadsheetControl.prototype.CreateCellHTMLSave = - function(range) {return SocialCalc.SpreadsheetControlCreateCellHTMLSave(this, range);}; - - -// Sheet Methods to make things a little easier: - -SocialCalc.SpreadsheetControl.prototype.ParseSheetSave = function(str) {return this.sheet.ParseSheetSave(str);}; -SocialCalc.SpreadsheetControl.prototype.CreateSheetSave = function() {return this.sheet.CreateSheetSave();}; - - -// Functions: - -// -// InitializeSpreadsheetControl(spreadsheet, node, height, width, spacebelow) -// -// Creates the control elements and makes them the child of node (string or element). -// If present, height and width specify size. -// If either is 0 or null (missing), the maximum that fits on the screen -// (taking spacebelow into account) is used. -// -// Displays the tabs and creates the views (other than "sheet"). -// The first tab is set as selected, but onclick is not invoked. -// -// You should do a redisplay or recalc (which redisplays) after running this. -// - -SocialCalc.InitializeSpreadsheetControl = function(spreadsheet, node, height, width, spacebelow) { - - var scc = SocialCalc.Constants; - var SCLoc = SocialCalc.LocalizeString; - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var html, child, i, vname, v, style, button, bele; - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - spreadsheet.requestedHeight = height; - spreadsheet.requestedWidth = width; - spreadsheet.requestedSpaceBelow = spacebelow; - - if (typeof node == "string") node = document.getElementById(node); - - if (node == null) { - alert("SocialCalc.SpreadsheetControl not given parent node."); - } - - spreadsheet.parentNode = node; - - // create node to hold spreadsheet control - - spreadsheet.spreadsheetDiv = document.createElement("div"); - - spreadsheet.SizeSSDiv(); // calculate and fill in the size values - - for (child=node.firstChild; child!=null; child=node.firstChild) { - node.removeChild(child); - } - - // create the tabbed UI at the top - - html = '
    '; - - for (i=0; i'+ - ''; - - for (i=0; i' + SCLoc(tabs[i].text) + ''; - } - - html += '
    '; - - spreadsheet.currentTab = 0; // this is where we started - - for (style in spreadsheet.tabreplacements) { - html = html.replace(spreadsheet.tabreplacements[style].regex, spreadsheet.tabreplacements[style].replacement); - } - html = html.replace(/\%s\./g, "SocialCalc."); - html = html.replace(/\%id\./g, spreadsheet.idPrefix); - html = html.replace(/\%tbt\./g, spreadsheet.toolbartext); - html = html.replace(/\%img\./g, spreadsheet.imagePrefix); - - html = SCLocSS(html); // localize with %loc!string! and %scc!constant! - - spreadsheet.spreadsheetDiv.innerHTML = html; - - node.appendChild(spreadsheet.spreadsheetDiv); - - // Initialize SocialCalc buttons - -spreadsheet.Buttons = { - button_undo: {tooltip: "Undo", command: "undo"}, - button_redo: {tooltip: "Redo", command: "redo"}, - button_copy: {tooltip: "Copy", command: "copy"}, - button_cut: {tooltip: "Cut", command: "cut"}, - button_paste: {tooltip: "Paste", command: "paste"}, - button_pasteformats: {tooltip: "Paste Formats", command: "pasteformats"}, - button_delete: {tooltip: "Delete Contents", command: "delete"}, - button_filldown: {tooltip: "Fill Down", command: "filldown"}, - button_fillright: {tooltip: "Fill Right", command: "fillright"}, - button_movefrom: {tooltip: "Set/Clear Move From", command: "movefrom"}, - button_movepaste: {tooltip: "Move Paste", command: "movepaste"}, - button_moveinsert: {tooltip: "Move Insert", command: "moveinsert"}, - button_alignleft: {tooltip: "Align Left", command: "align-left"}, - button_aligncenter: {tooltip: "Align Center", command: "align-center"}, - button_alignright: {tooltip: "Align Right", command: "align-right"}, - button_borderon: {tooltip: "Borders On", command: "borderon"}, - button_borderoff: {tooltip: "Borders Off", command: "borderoff"}, - button_swapcolors: {tooltip: "Swap Colors", command: "swapcolors"}, - button_merge: {tooltip: "Merge Cells", command: "merge"}, - button_unmerge: {tooltip: "Unmerge Cells", command: "unmerge"}, - button_insertrow: {tooltip: "Insert Row", command: "insertrow"}, - button_insertcol: {tooltip: "Insert Column", command: "insertcol"}, - button_deleterow: {tooltip: "Delete Row", command: "deleterow"}, - button_deletecol: {tooltip: "Delete Column", command: "deletecol"}, - button_recalc: {tooltip: "Recalc", command: "recalc"} - } - - for (button in spreadsheet.Buttons) { - bele = document.getElementById(spreadsheet.idPrefix+button); - if (!bele) {/*alert("Button "+(spreadsheet.idPrefix+button)+" missing");*/ continue;} - bele.style.border = "1px solid "+scc.ISCButtonBorderNormal; - SocialCalc.TooltipRegister(bele, SCLoc(spreadsheet.Buttons[button].tooltip), {}); - SocialCalc.ButtonRegister(bele, - {normalstyle: "border:1px solid "+scc.ISCButtonBorderNormal+";backgroundColor:"+scc.ISCButtonBorderNormal+";", - hoverstyle: "border:1px solid "+scc.ISCButtonBorderHover+";backgroundColor:"+scc.ISCButtonBorderNormal+";", - downstyle: "border:1px solid "+scc.ISCButtonBorderDown+";backgroundColor:"+scc.ISCButtonDownBackground+";"}, - {MouseDown: SocialCalc.DoButtonCmd, command: spreadsheet.Buttons[button].command}); - } - - // create formula bar - - spreadsheet.dummyFormulaDiv = document.createElement("div"); - spreadsheet.dummyFormulaDiv.style.height = spreadsheet.formulabarheight + "px"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.dummyFormulaDiv); - - spreadsheet.formulabarDiv = document.createElement("div"); - spreadsheet.formulabarDiv.id = "formulabardiv"; - spreadsheet.formulabarDiv.style.height = spreadsheet.formulabarheight + "px"; - spreadsheet.formulabarDiv.innerHTML = ''; //' '; - //spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - var inputbox = new SocialCalc.InputBox(spreadsheet.formulabarDiv.firstChild, spreadsheet.editor); - - //bele = document.createElement("img"); - // bele.id = "testtest"; - // bele.src = "lib/aspiring/images/delete24.png"; - // bele.style.verticalAlign = "middle"; - //bele.style.border = "1px solid #FFF"; - //bele.style.marginLeft = "4px"; - // bele.style.display = "none"; - // SocialCalc.ButtonRegister(bele, - // {normalstyle: "", - // hoverstyle: "", - // downstyle: ""}, - // {MouseDown: SocialCalc.InputLineClearText}); - - - //spreadsheet.formulabarDiv.appendChild(bele); - - /* - for (button in spreadsheet.formulabuttons) { - bele = document.createElement("img"); - bele.id = spreadsheet.idPrefix+button; - bele.src = spreadsheet.imagePrefix+spreadsheet.formulabuttons[button].image; - bele.style.verticalAlign = "middle"; - bele.style.border = "1px solid #FFF"; - bele.style.marginLeft = "4px"; - SocialCalc.TooltipRegister(bele, SCLoc(spreadsheet.formulabuttons[button].tooltip), {}); - SocialCalc.ButtonRegister(bele, - {normalstyle: "border:1px solid #FFF;backgroundColor:#FFF;", - hoverstyle: "border:1px solid #CCC;backgroundColor:#FFF;", - downstyle: "border:1px solid #000;backgroundColor:#FFF;"}, - {MouseDown: spreadsheet.formulabuttons[button].command}); - spreadsheet.formulabarDiv.appendChild(bele); - } - */ - // initialize tabs that need it - - for (i=0; i 1 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 1; // restore what was there if reasonable - sele = document.getElementById(spreadsheet.idPrefix+"minorsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col=range.cr1.col; col<=range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = oldindex > 0 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 0; // default to [none] - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col=range.cr1.col; col<=range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = oldindex > 0 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 0; // default to [none] - - } - -// -// SocialCalc.CmdGotFocus(obj) -// -// Sets SocialCalc.Keyboard.passThru: obj should be element with focus or "true" -// - -SocialCalc.CmdGotFocus = function(obj) { - - SocialCalc.Keyboard.passThru = obj; - - } - - -// -// SocialCalc.DoButtonCmd(e, buttoninfo, bobj) -// - -SocialCalc.DoButtonCmd = function(e, buttoninfo, bobj) { - - SocialCalc.DoCmd(bobj.element, bobj.functionobj.command); - - } - -// -// SocialCalc.DoCmd(obj, which) -// -// xxx -// - -SocialCalc.DoCmd = function(obj, which) { - - var combostr, sstr, cl, i, clele, slist, slistele, str, sele, rele, lele, ele, sortrange, nrange, rparts; - var sheet, cell, color, bgcolor, defaultcolor, defaultbgcolor; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - switch (which) { - case "undo": - spreadsheet.ExecuteCommand("undo", ""); - break; - - case "redo": - spreadsheet.ExecuteCommand("redo", ""); - break; - - case "fill-rowcolstuff": - case "fill-text": - cl = which.substring(5); - clele = document.getElementById(spreadsheet.idPrefix+cl+"list"); - clele.length = 0; - for (i=0; i0) { - rele = document.getElementById(spreadsheet.idPrefix+"minorsortup"); - str += " "+sele.options[sele.selectedIndex].value + (rele.checked ? " up" : " down"); - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (sele.selectedIndex>0) { - rele = document.getElementById(spreadsheet.idPrefix+"lastsortup"); - str += " "+sele.options[sele.selectedIndex].value + (rele.checked ? " up" : " down"); - } - spreadsheet.ExecuteCommand(str, ""); - break; - - case "merge": - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - if (editor.range.hasrange) { // set ecell to upper left - editor.MoveECell(SocialCalc.crToCoord(editor.range.left, editor.range.top)); - editor.RangeRemove(); - } - break; - - case "movefrom": - if (editor.range2.hasrange) { // toggle if already there - spreadsheet.context.cursorsuffix = ""; - editor.Range2Remove(); - spreadsheet.ExecuteCommand("redisplay", ""); - } - else if (editor.range.hasrange) { // set range2 to range or one cell - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.MoveECell(SocialCalc.crToCoord(editor.range.left, editor.range.top)); - } - else { - editor.range2.top = editor.ecell.row; - editor.range2.right = editor.ecell.col; - editor.range2.bottom = editor.ecell.row; - editor.range2.left = editor.ecell.col; - editor.range2.hasrange = true; - } - str = editor.range2.hasrange ? "" : "off"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movefrom"); - ele.src=spreadsheet.imagePrefix+"movefrom"+str+".gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movepaste"); - ele.src=spreadsheet.imagePrefix+"movepaste"+str+".gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_moveinsert"); - ele.src=spreadsheet.imagePrefix+"moveinsert"+str+".gif"; - if (editor.range2.hasrange) editor.RangeRemove(); - break; - - case "movepaste": - case "moveinsert": - if (editor.range2.hasrange) { - spreadsheet.context.cursorsuffix = ""; - combostr = which+" "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord; - spreadsheet.ExecuteCommand(combostr, ""); - editor.Range2Remove(); - ele = document.getElementById(spreadsheet.idPrefix+"button_movefrom"); - ele.src=spreadsheet.imagePrefix+"movefromoff.gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movepaste"); - ele.src=spreadsheet.imagePrefix+"movepasteoff.gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_moveinsert"); - ele.src=spreadsheet.imagePrefix+"moveinsertoff.gif"; - } - break; - - case "swapcolors": - sheet = spreadsheet.sheet; - cell = sheet.GetAssuredCell(editor.ecell.coord); - defaultcolor = sheet.attribs.defaultcolor ? sheet.colors[sheet.attribs.defaultcolor] : "rgb(0,0,0)"; - defaultbgcolor = sheet.attribs.defaultbgcolor ? sheet.colors[sheet.attribs.defaultbgcolor] : "rgb(255,255,255)"; - color = cell.color ? sheet.colors[cell.color] : defaultcolor; // get color - if (color == defaultbgcolor) color = ""; // going to swap, so if same as background default, use default - bgcolor = cell.bgcolor ? sheet.colors[cell.bgcolor] : defaultbgcolor; - if (bgcolor == defaultcolor) bgcolor = ""; // going to swap, so if same as foreground default, use default - spreadsheet.ExecuteCommand("set %C color "+bgcolor+"%Nset %C bgcolor "+color, ""); - break; - - default: - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - break; - } - - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - - } - -SocialCalc.SpreadsheetCmdLookup = { - 'copy': 'copy %C all', - 'cut': 'cut %C all', - 'paste': 'paste %C all', - 'pasteformats': 'paste %C formats', - 'delete': 'erase %C formulas', - 'filldown': 'filldown %C all', - 'fillright': 'fillright %C all', - 'erase': 'erase %C all', - 'borderon': 'set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S', - 'borderoff': 'set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S', - 'merge': 'merge %C', - 'unmerge': 'unmerge %C', - 'align-left': 'set %C cellformat left', - 'align-center': 'set %C cellformat center', - 'align-right': 'set %C cellformat right', - 'align-default': 'set %C cellformat', - 'insertrow': 'insertrow %C', - 'insertcol': 'insertcol %C', - 'deleterow': 'deleterow %C', - 'deletecol': 'deletecol %C', - 'undo': 'undo', - 'redo': 'redo', - 'recalc': 'recalc' - } - -SocialCalc.SpreadsheetCmdSLookup = { - 'borderon': '1px solid rgb(0,0,0)', - 'borderoff': '' - } - -/******* NO LONGER USED - -SocialCalc.SpreadsheetCmdTable = { - cmd: [ - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"}, - {t:"Copy", s:"all", c:"copy %C %S"}, - {t:"Cut", s:"all", c:"cut %C %S"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Merge Cells", s:"none", c:"merge %C"}, - {t:"Unmerge", s:"none", c:"unmerge %C"}, - {t:"Sort", s:"sortcol", c:"sort %R %S"}, - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Cell Borders", s:"borderOnOff", c:"set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S"}, - {t:"Column Width", s:"colWidths", c:"set %W width %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"}, - {t:"Default Column Width", s:"colWidths", c:"set sheet defaultcolwidth %S"} - ], - rowcolstuff: [ - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"} - ], - text: [ - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Text Format", s:"tvf", c:"set %C textvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Text Format", s:"tvf", c:"set sheet defaulttextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"} - ], - slists: { - "colors": [ - {t:"Default", s:""}, - {t:"Black", s:"rgb(0,0,0)"}, - {t:"Dark Gray", s:"rgb(102,102,102)"}, // #666 - {t:"Gray", s:"rgb(204,204,204)"}, // #CCC - {t:"White", s:"rgb(255,255,255)"}, - {t:"Red", s:"rgb(255,0,0)"}, - {t:"Dark Red", s:"rgb(153,0,0)"}, - {t:"Orange", s:"rgb(255,153,0)"}, - {t:"Yellow", s:"rgb(255,255,0)"}, - {t:"Light Yellow", s:"rgb(255,255,204)"}, - {t:"Green", s:"rgb(0,255,0)"}, - {t:"Dark Green", s:"rgb(0,153,0)"}, - {t:"Blue", s:"rgb(0,0,255)"}, - {t:"Dark Blue", s:"rgb(0,0,153)"}, - {t:"Light Blue", s:"rgb(204,204,255)"} - ], - "fonts": [ // style weight size family - {t:"Default", s:""}, - {t:"Bold", s:"normal bold * *"}, - {t:"Italic", s:"italic normal * *"}, - {t:"Small", s:"* small *"}, - {t:"Medium", s:"* medium *"}, - {t:"Large", s:"* large *"}, - {t:"Bold Small", s:"normal bold small *"}, - {t:"Bold Medium", s:"normal bold medium *"}, - {t:"Bold Large", s:"normal bold large *"} - ], - "cellformat": [ - {t:"Default", s:""}, - {t:"Left", s:"left"}, - {t:"Right", s:"right"}, - {t:"Center", s:"center"} - ], - "borderOnOff": [ - {t:"On", s:"1px solid rgb(0,0,0)"}, - {t:"Off", s:""} - ], - "colWidths": [ - {t:"Default", s:""}, - {t:"20", s:"20"}, - {t:"40", s:"40"}, - {t:"60", s:"60"}, - {t:"80", s:"80"}, - {t:"100", s:"100"}, - {t:"120", s:"120"}, - {t:"140", s:"140"}, - {t:"160", s:"160"}, - {t:"180", s:"180"}, - {t:"200", s:"200"}, - {t:"220", s:"220"}, - {t:"240", s:"240"}, - {t:"260", s:"260"}, - {t:"280", s:"280"}, - {t:"300", s:"300"} - ], - "ntvf": [ - {t:"Default", s:""}, - {t:"1234", s:"0"}, - {t:"1,234", s:"#,##0"}, - {t:"1,234.5", s:"#,##0.0"}, - {t:"1,234.56", s:"#,##0.00"}, - {t:"1,234.567", s:"#,##0.000"}, - {t:"1,234%", s:"#,##0%"}, - {t:"1,234.5%", s:"#,##0.0%"}, - {t:"(1,234)", s:"#,##0_);(#,##0)"}, - {t:"(1,234.5)", s:"#,##0.0_);(#,##0.0)"}, - {t:"(1,234.56)", s:"#,##0.00_);(#,##0.00)"}, - {t:"00", s:"00"}, - {t:"000", s:"000"}, - {t:"0000", s:"0000"}, - {t:"$1,234.56", s:"$#,##0.00"}, - {t:"2006-01-04", s:"yyyy-mm-dd"}, - {t:"01:23:45", s:"hh:mm:ss"}, - {t:"2006-01-04 01:23:45", s:"yyyy-mm-dd hh:mm:ss"}, - {t:"Hidden", s:"hidden"} - ], - "tvf": [ - {t:"Default", s:""}, - {t:"Automatic", s:"general"}, - {t:"Plain Text", s:"text-plain"}, - {t:"HTML", s:"text-html"}, - {t:"Wiki", s:"text-wiki"}, - {t:"Hidden", s:"hidden"} - ], - "ffal": [ // Formulas, Formats, All - {t:"All", s:"all"}, - {t:"Contents", s:"formulas"}, - {t:"Formats", s:"formats"} - ], - "all": [ // All - {t:"All", s:"all"} - ], - "rowcol": [ - {t:"Row", s:"row"}, - {t:"Column", s:"col"} - ], - "sortcol": [ - {t:"A up", s:"A up"}, - {t:"B up", s:"B up"}, - {t:"C up", s:"C up"}, - {t:"A down", s:"A down"}, - {t:"B down", s:"B down"}, - {t:"C down", s:"C down"}, - {t:"A, B, C up", s:"A up B up C up"} - ], - "none": [ // nothing - {t:" ", s:" "} - ] - } - } -*********/ - -// -// SocialCalc.SpreadsheetControlExecuteCommand(obj, combostr, sstr) -// -// xxx -// - -SocialCalc.SpreadsheetControlExecuteCommand = function(obj, combostr, sstr) { - - var i, commands; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var eobj = spreadsheet.editor; - - var str = {}; - str.P = "%"; - str.N = "\n" - if (eobj.range.hasrange) { - str.R = SocialCalc.crToCoord(eobj.range.left, eobj.range.top)+ - ":"+SocialCalc.crToCoord(eobj.range.right, eobj.range.bottom); - str.C = str.R; - str.W = SocialCalc.rcColname(eobj.range.left) + ":" + SocialCalc.rcColname(eobj.range.right); - } - else { - str.C = eobj.ecell.coord; - str.R = eobj.ecell.coord+":"+eobj.ecell.coord; - str.W = SocialCalc.rcColname(SocialCalc.coordToCr(eobj.ecell.coord).col); - } - str.S = sstr; - combostr = combostr.replace(/%C/g, str.C); - combostr = combostr.replace(/%R/g, str.R); - combostr = combostr.replace(/%N/g, str.N); - combostr = combostr.replace(/%S/g, str.S); - combostr = combostr.replace(/%W/g, str.W); - combostr = combostr.replace(/%P/g, str.P); - - eobj.EditorScheduleSheetCommands(combostr, true, false); - - } - -// -// result = SocialCalc.SpreadsheetControlCreateSheetHTML(spreadsheet) -// -// Returns the HTML representation of the whole spreadsheet -// - -SocialCalc.SpreadsheetControlCreateSheetHTML = function(spreadsheet) { - - var context, div, ele; - - var result = ""; - - context = new SocialCalc.RenderContext(spreadsheet.sheet); - div = document.createElement("div"); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - result = div.innerHTML; - delete ele; - delete div; - return result; - - } - -// -// result = SocialCalc.SpreadsheetControlCreateCellHTML(spreadsheet, coord, linkstyle) -// -// Returns the HTML representation of a cell. Blank is "", not " ". -// - -SocialCalc.SpreadsheetControlCreateCellHTML = function(spreadsheet, coord, linkstyle) { - - var result = ""; - var cell = spreadsheet.sheet.cells[coord]; - - if (!cell) return ""; - - if (cell.displaystring == undefined) { - result = SocialCalc.FormatValueForDisplay(spreadsheet.sheet, cell.datavalue, coord, (linkstyle || spreadsheet.context.defaultHTMLlinkstyle)); - } - else { - result = cell.displaystring; - } - - if (result == " ") result = ""; - - return result; - - } - -// -// result = SocialCalc.SpreadsheetControlCreateCellHTMLSave(spreadsheet, range, linkstyle) -// -// Returns the HTML representation of a range of cells, or the whole sheet if range is null. -// The form is: -// version:1.0 -// coord:cell-HTML -// coord:cell-HTML -// ... -// -// Empty cells are skipped. The cell-HTML is encoded with ":"=>"\c", newline=>"\n", and "\"=>"\b". -// - -SocialCalc.SpreadsheetControlCreateCellHTMLSave = function(spreadsheet, range, linkstyle) { - - var cr1, cr2, row, col, coord, cell, cellHTML; - var result = []; - var prange; - - if (range) { - prange = SocialCalc.ParseRange(range); - } - else { - prange = {cr1: {row: 1, col:1}, - cr2: {row: spreadsheet.sheet.attribs.lastrow, col: spreadsheet.sheet.attribs.lastcol}}; - } - cr1 = prange.cr1; - cr2 = prange.cr2; - - result.push("version:1.0"); - - for (row=cr1.row; row <= cr2.row; row++) { - for (col=cr1.col; col <= cr2.col; col++) { - coord = SocialCalc.crToCoord(col, row); - cell=spreadsheet.sheet.cells[coord]; - if (!cell) continue; - if (cell.displaystring == undefined) { - cellHTML = SocialCalc.FormatValueForDisplay(spreadsheet.sheet, cell.datavalue, coord, (linkstyle || spreadsheet.context.defaultHTMLlinkstyle)); - } - else { - cellHTML = cell.displaystring; - } - if (cellHTML == " ") continue; - result.push(coord+":"+SocialCalc.encodeForSave(cellHTML)); - } - } - - result.push(""); // one extra to get extra \n - return result.join("\n"); - } - -// -// Formula Bar Button Routines -// - -SocialCalc.SpreadsheetControl.DoFunctionList = function() { - - var i, cname, str, f, ele; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var fcl = scc.function_classlist; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - scf.FillFunctionInfo(); - - str = '
    %loc!Category!
    '+ - '
      %loc!Functions!
    '+ - '
    '+ - '
    '+SocialCalc.SpreadsheetControl.GetFunctionInfoStr(scf.FunctionClasses[fcl[0]].items[0])+'
    '+ - '
    '+ - ' '+ - '
    '+ - '
    '; - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - str = ''+ - ''+ - '
    '+" %loc!Function List!"+' X 
    '+ - '
    '+str+'
    '; - - str = SocialCalc.LocalizeSubstrings(str); - - main.innerHTML = str; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"name"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide; if All, letter scrolls to there - - } - -SocialCalc.SpreadsheetControl.GetFunctionNamesStr = function(cname) { - - var i, f; - var scf = SocialCalc.Formula; - var str = ""; - - f = scf.FunctionClasses[cname]; - for (i=0; i':'>')+f.items[i]+''; - } - - return str; - - } - -SocialCalc.SpreadsheetControl.FillFunctionNames = function(cname, ele) { - - var i, f; - var scf = SocialCalc.Formula; - - ele.length = 0; - f = scf.FunctionClasses[cname]; - for (i=0; i
    "; - str += scsc(f[3]); - - return str; - - } - -SocialCalc.SpreadsheetControl.FunctionClassChosen = function(cname) { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - var scf = SocialCalc.Formula; - - SocialCalc.SpreadsheetControl.FillFunctionNames(cname, document.getElementById(idp+"name")); - - SocialCalc.SpreadsheetControl.FunctionChosen(scf.FunctionClasses[cname].items[0]); - - } - -SocialCalc.SpreadsheetControl.FunctionChosen = function(fname) { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - - document.getElementById(idp+"desc").innerHTML = SocialCalc.SpreadsheetControl.GetFunctionInfoStr(fname); - - } - -SocialCalc.SpreadsheetControl.HideFunctions = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById(spreadsheet.idPrefix+"functiondialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - } - -SocialCalc.SpreadsheetControl.DoFunctionPaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var ele = document.getElementById(spreadsheet.idPrefix+"functionname"); - var mele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - var text = ele.value+"("; - - SocialCalc.SpreadsheetControl.HideFunctions(); - - if (mele) { // multi-line editing is in progress - mele.value += text; - mele.focus(); - SocialCalc.CmdGotFocus(mele); - } - else { - editor.EditorAddToInput(text, "="); - } - - } - - -SocialCalc.SpreadsheetControl.DoMultiline = function() { - - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var str, ele, text; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"multiline"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - text = SocialCalc.special_chars(text); - - str = ''+ - '
    '+ - SCLocSS(' '+ - ' '+ - '
    '+ - ''); - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+ - SCLocSS(" %loc!Multi-line Input Box!")+' X 
    '+ - '
    '+str+'
    '; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"textarea"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide? - - } - - -SocialCalc.SpreadsheetControl.HideMultiline = function() { - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinedialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - - } - -SocialCalc.SpreadsheetControl.DoMultilineClear = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - ele.value = ""; - ele.focus(); - - } - - -SocialCalc.SpreadsheetControl.DoMultilinePaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - var text = ele.value; - - SocialCalc.SpreadsheetControl.HideMultiline(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - editor.EditorSaveEdit(text); - - } - - -SocialCalc.SpreadsheetControl.DoLink = function() { - - var SCLoc = SocialCalc.LocalizeString; - - var str, ele, text, cell, setformat, popup; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"link"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - if (text.charAt(0)=="'") { - text = text.slice(1); - } - - var parts = SocialCalc.ParseCellLinkText(text); - - text = SocialCalc.special_chars(text); - - cell = spreadsheet.sheet.cells[editor.ecell.coord]; - if (!cell || !cell.textvalueformat) { // set to link format, but don't override - setformat = " checked"; - } - else { - setformat = ""; - } - - popup = parts.newwin ? " checked" : ""; - - str = '
    '+ - ''+SCLoc("Description")+'
    '+ - '
    '+ - ''+SCLoc("URL")+'
    '+ - '
    '; - if (SocialCalc.Callbacks.MakePageLink) { // only show if handling pagenames here - str += ''+SCLoc("Page Name")+'
    '+ - '
    '+ - ''+SCLoc("Workspace")+'
    '+ - '
    '; - } - str += SocialCalc.LocalizeSubstrings(' '+ - '%loc!Set to Link format!
    '+ - ' '+ - '%loc!Show in new browser window!'+ - '
    '+ - '
    '+ - ' '+ - ' '+ - '
    '+ - ''); - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+SCLoc("Link Input Box")+' X 
    '+ - '
    '+str+'
    '; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"url"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide? - - } - - -SocialCalc.SpreadsheetControl.HideLink = function() { - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix+"linkdialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - - } - -SocialCalc.SpreadsheetControl.DoLinkClear = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - document.getElementById(spreadsheet.idPrefix+"linkdesc").value = ""; - document.getElementById(spreadsheet.idPrefix+"linkpagename").value = ""; - document.getElementById(spreadsheet.idPrefix+"linkworkspace").value = ""; - - var ele = document.getElementById(spreadsheet.idPrefix+"linkurl"); - ele.value = ""; - ele.focus(); - - } - - -SocialCalc.SpreadsheetControl.DoLinkPaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var descele = document.getElementById(spreadsheet.idPrefix+"linkdesc"); - var urlele = document.getElementById(spreadsheet.idPrefix+"linkurl"); - var pagenameele = document.getElementById(spreadsheet.idPrefix+"linkpagename"); - var workspaceele = document.getElementById(spreadsheet.idPrefix+"linkworkspace"); - var formatele = document.getElementById(spreadsheet.idPrefix+"linkformat"); - var popupele = document.getElementById(spreadsheet.idPrefix+"linkpopup"); - - var text = ""; - - var ltsym, gtsym, obsym, cbsym; - - if (popupele.checked) { - ltsym = "<<"; gtsym = ">>"; obsym = "[["; cbsym = "]]"; - } - else { - ltsym = "<"; gtsym = ">"; obsym = "["; cbsym = "]"; - } - - if (pagenameele && pagenameele.value) { - if (workspaceele.value) { - text = descele.value+"{"+workspaceele.value+obsym+pagenameele.value+cbsym+"}"; - } - else { - text = descele.value+obsym+pagenameele.value+cbsym; - } - } - else { - text = descele.value+ltsym+urlele.value+gtsym; - } - - SocialCalc.SpreadsheetControl.HideLink(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - if (formatele.checked) { - SocialCalc.SpreadsheetControlExecuteCommand(null, "set %C textvalueformat text-link", ""); - } - - editor.EditorSaveEdit(text); - - } - -SocialCalc.SpreadsheetControl.DoSum = function() { - - var cmd, cell, row, col, sel, cr, foundvalue; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var sheet = editor.context.sheetobj; - - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - cmd = "set "+SocialCalc.crToCoord(editor.range.right, editor.range.bottom+1)+ - " formula sum("+sel+")"; - } - else { - row = editor.ecell.row - 1; - col = editor.ecell.col; - if (row<=1) { - cmd = "set "+editor.ecell.coord+" constant e#REF! 0 #REF!"; - } - else { - foundvalue = false; - while (row>0) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (!cell.datatype || cell.datatype=="t") { - if (foundvalue) { - row++; - break; - } - } - else { - foundvalue = true; - } - row--; - } - cmd = "set "+editor.ecell.coord+" formula sum("+ - SocialCalc.crToCoord(col,row)+":"+SocialCalc.crToCoord(col, editor.ecell.row-1)+")"; - } - } - - editor.EditorScheduleSheetCommands(cmd, true, false); - - } - - -// -// TAB Routines -// - -// Sort - -SocialCalc.SpreadsheetControlSortOnclick = function(s, t) { - - var name, i; - var namelist = []; - var nl = document.getElementById(s.idPrefix+"sortlist"); - SocialCalc.LoadColumnChoosers(s); - s.editor.RangeChangeCallback.sort = SocialCalc.UpdateSortRangeProposal; - - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - nl.options[0] = new Option(SocialCalc.LocalizeString("[select range]")); - for (i=0; i0) { - rele = document.getElementById(spreadsheet.idPrefix+"minorsortup"); - str += ":"+sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } - else { - str += "::"; - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (sele.selectedIndex>0) { - rele = document.getElementById(spreadsheet.idPrefix+"lastsortup"); - str += ":"+sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } - else { - str += "::"; - } - return str+"\n"; - } - -SocialCalc.SpreadsheetControlSortLoad = function(editor, setting, line, flags) { - var parts, ele; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - parts = line.split(":"); - spreadsheet.sortrange = SocialCalc.decodeFromSave(parts[1]); - ele = document.getElementById(spreadsheet.idPrefix+"sortbutton"); - if (spreadsheet.sortrange) { - ele.value = SocialCalc.LocalizeString("Sort ")+spreadsheet.sortrange; - ele.style.visibility = "visible"; - } - else { - ele.style.visibility = "hidden"; - } - SocialCalc.LoadColumnChoosers(spreadsheet); - - sele = document.getElementById(spreadsheet.idPrefix+"majorsort"); - sele.selectedIndex = parts[2]-0; - document.getElementById(spreadsheet.idPrefix+"majorsort"+parts[3]).checked = true; - sele = document.getElementById(spreadsheet.idPrefix+"minorsort"); - if (parts[4]) { - sele.selectedIndex = parts[4]-0; - document.getElementById(spreadsheet.idPrefix+"minorsort"+parts[5]).checked = true; - } - else { - sele.selectedIndex = 0; - document.getElementById(spreadsheet.idPrefix+"minorsortup").checked = true; - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (parts[6]) { - sele.selectedIndex = parts[6]-0; - document.getElementById(spreadsheet.idPrefix+"lastsort"+parts[7]).checked = true; - } - else { - sele.selectedIndex = 0; - document.getElementById(spreadsheet.idPrefix+"lastsortup").checked = true; - } - - return true; - } - -// Comment - -SocialCalc.SpreadsheetControlCommentOnclick = function(s, t) { - s.editor.MoveECellCallback.comment = SocialCalc.SpreadsheetControlCommentMoveECell; - SocialCalc.SpreadsheetControlCommentDisplay(s, t); - SocialCalc.KeyboardFocus(); - return; - } - -SocialCalc.SpreadsheetControlCommentDisplay = function(s, t) { - var c = ""; - if (s.editor.ecell && s.editor.ecell.coord && s.sheet.cells[s.editor.ecell.coord]) { - c = s.sheet.cells[s.editor.ecell.coord].comment || ""; - } - document.getElementById(s.idPrefix+"commenttext").value = c; - } - -SocialCalc.SpreadsheetControlCommentMoveECell = function(editor) { - SocialCalc.SpreadsheetControlCommentDisplay(SocialCalc.GetSpreadsheetControlObject(), "comment"); - } - -SocialCalc.SpreadsheetControlCommentSet = function() { - var s=SocialCalc.GetSpreadsheetControlObject(); - s.ExecuteCommand("set %C comment "+SocialCalc.encodeForSave(document.getElementById(s.idPrefix+"commenttext").value)); - var cell=SocialCalc.GetEditorCellElement(s.editor, s.editor.ecell.row, s.editor.ecell.col); - s.editor.UpdateCellCSS(cell, s.editor.ecell.row, s.editor.ecell.col); - SocialCalc.KeyboardFocus(); - } - -SocialCalc.SpreadsheetControlCommentOnunclick = function(s, t) { - delete s.editor.MoveECellCallback.comment; - } - -// Names - -SocialCalc.SpreadsheetControlNamesOnclick = function(s, t) { - document.getElementById(s.idPrefix+"namesname").value = ""; - document.getElementById(s.idPrefix+"namesdesc").value = ""; - document.getElementById(s.idPrefix+"namesvalue").value = ""; - s.editor.RangeChangeCallback.names = SocialCalc.SpreadsheetControlNamesRangeChange; - s.editor.MoveECellCallback.names = SocialCalc.SpreadsheetControlNamesRangeChange; - SocialCalc.SpreadsheetControlNamesRangeChange(s.editor); - SocialCalc.SpreadsheetControlNamesFillNameList(); - SocialCalc.SpreadsheetControlNamesChangedName(); - } - -SocialCalc.SpreadsheetControlNamesFillNameList = function() { - var SCLoc = SocialCalc.LocalizeString; - var name, i; - var namelist = []; - var s=SocialCalc.GetSpreadsheetControlObject(); - var nl = document.getElementById(s.idPrefix+"nameslist"); - var currentname = document.getElementById(s.idPrefix+"namesname").value.toUpperCase().replace(/[^A-Z0-9_\.]/g, ""); - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - if (namelist.length > 0) { - nl.options[0] = new Option(SCLoc("[New]")); - } - else { - nl.options[0] = new Option(SCLoc("[None]")); - } - for (i=0; i 0) { - strtoedit = SocialCalc.special_chars(SocialCalc.OtherSaveParts[whichpart] || ""); - } - else { - strtoedit = "Listing of Parts\n"; - for (partname in SocialCalc.OtherSaveParts) { - strtoedit += SocialCalc.special_chars("\nPart: "+partname+"\n=====\n"+SocialCalc.OtherSaveParts[partname]+"\n"); - } - } - var editbox = document.createElement("div"); - editbox.style.cssText = "position:absolute;z-index:500;width:300px;height:300px;left:100px;top:200px;border:1px solid black;background-color:#EEE;text-align:center;"; - editbox.id = "socialcalc-editbox"; - editbox.innerHTML = whichpart+'



    '; - document.body.appendChild(editbox); - - var ebta = document.getElementById("socialcalc-editbox-textarea"); - ebta.focus(); - SocialCalc.CmdGotFocus(ebta); - - } - -SocialCalc.CtrlSEditorDone = function(idprefix, whichpart) { - - var edittextarea = document.getElementById(idprefix+"-textarea"); - var text = edittextarea.value; - if (whichpart.length > 0) { - if (text.length > 0) { - SocialCalc.OtherSaveParts[whichpart] = text; - } - else { - delete SocialCalc.OtherSaveParts[whichpart]; - } - } - - var editbox = document.getElementById(idprefix); - SocialCalc.KeyboardFocus(); - editbox.parentNode.removeChild(editbox); - - } - diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalctableeditor.js b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalctableeditor.js deleted file mode 100644 index 24179b3..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalctableeditor.js +++ /dev/null @@ -1,6599 +0,0 @@ -// -// SocialCalcTableEditor -// -/* -// The code module of the SocialCalc package that displays a scrolling grid with panes -// and handles keyboard and mouse I/O. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript TableEditor. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the TableEditor is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/xoattrib - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { // created here, too, in case load order is wrong, but main routines are required - SocialCalc = {}; - } - -// ************************************* -// -// Table Editor class: -// -// ************************************* - -// Constructor: - -SocialCalc.TableEditor = function(context) { - - var scc = SocialCalc.Constants; - - // Properties: - - this.context = context; // editing context - this.toplevel = null; // top level HTML element for this table editor - this.fullgrid = null; // rendered editing context - - this.noEdit = false; // if true, disable all edit UI and make read-only - - this.width = null; - this.tablewidth = null; - this.height = null; - this.tableheight = null; - - this.inputBox = null; - this.inputEcho = null; - this.verticaltablecontrol = null; - this.horizontaltablecontrol = null; - - this.logo = null; - - this.cellhandles = null; - - // Dynamic properties: - - this.timeout = null; // if non-null, timer id for position calculations - this.busy = false; // true when executing command, calculating, etc. - this.ensureecell = false; // if true, ensure ecell is visible after timeout - this.deferredCommands = []; // commands to execute after busy, in form: {cmdstr: "cmds", saveundo: t/f} - - this.gridposition = null; // screen coords of full grid - this.headposition = null; // screen coords of upper left of grid within header rows - this.firstscrollingrow = null; // row number of top row in last (the scrolling) pane - this.firstscrollingrowtop = null; // position of top row in last (the scrolling) pane - this.lastnonscrollingrow = null; // row number of last displayed row in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblerow = null; // used for paging down - this.firstscrollingcol = null; // column number of top col in last (the scrolling) pane - this.firstscrollingcolleft = null; // position of top col in last (the scrolling) pane - this.lastnonscrollingcol = null; // col number of last displayed column in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblecol = null; // used for paging right - - this.rowpositions = []; // screen positions of the top of some rows - this.colpositions = []; // screen positions of the left side of some rows - this.rowheight = []; // size in pixels of each row when last checked, or null/undefined, for page up - this.colwidth = []; // size in pixels of each column when last checked, or null/undefined, for page left - - this.ecell = null; // either null or {coord: c, row: r, col: c} - this.state = "start"; // the keyboard states: see EditorProcessKey - - this.workingvalues = {}; // values used during keyboard editing, etc. - - // Constants: - - this.imageprefix = scc.defaultImagePrefix; // URL prefix for images (e.g., "/images/sc") - this.idPrefix = scc.defaultTableEditorIDPrefix; - this.pageUpDnAmount = scc.defaultPageUpDnAmount; // number of rows to move cursor on PgUp/PgDn keys (numeric) - - // Callbacks - - // recalcFunction: if present, function(editor) {...}, called to do a recalc - // Default (sheet.RecalcSheet) does all the right stuff. - - this.recalcFunction = function(editor) { - if (editor.context.sheetobj.RecalcSheet) { - editor.context.sheetobj.RecalcSheet(SocialCalc.EditorSheetStatusCallback, editor); - } - else return null; - }; - - // ctrlkeyFunction: if present, function(editor, charname) {...}, called to handle ctrl-V, etc., at top level - // Returns true (pass through for continued processing) or false (stop processing this key). - - this.ctrlkeyFunction = function(editor, charname) { - - var ta, ha, cell, position, cmd, sel, cliptext; - - switch (charname) { - case "[ctrl-c]": - case "[ctrl-x]": - ta = editor.pasteTextarea; - ta.value = ""; - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = (position.left-1)+"px"; - ta.style.top = (position.top-1)+"px"; - } - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - else { - sel = editor.ecell.coord; - } - - // get what to copy to clipboard - cliptext = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), "tab"); - - if (charname == "[ctrl-c]" || editor.noEdit || (SocialCalc.Callbacks.IsCellEditable && (!SocialCalc.Callbacks.IsCellEditable(editor)))) { // if copy or cut but in no edit - cmd = "copy "+sel+" formulas"; - } - else { // [ctrl-x] - cmd = "cut "+sel+" formulas"; - } - editor.EditorScheduleSheetCommands(cmd, true, false); // queue up command to put on SocialCalc clipboard - - /* Copy as HTML: This fails rather badly as it won't paste into Notepad as tab-delimited text. Oh well. - - ha = editor.pasteHTMLarea; - if (editor.range.hasrange) { - cell = SocialCalc.GetEditorCellElement(editor, editor.range.top, editor.range.left); - } - else { - cell = SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - } - if (cell) position = SocialCalc.GetElementPosition(cell.element); - - if (ha) { - if (position) { - ha.style.left = (position.left-1)+"px"; - ha.style.top = (position.top-1)+"px"; - } - ha.style.visibility="visible"; - cliptext = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), "html"); - ha.innerHTML = cliptext.replace(/]*>[\d\D]*?<\/tr\b[^>]*>/i, ''); - ha.focus(); - - var range = document.body.createControlRange(); - range.addElement(ha.childNodes[0]); - range.select(); - } - */ - ta.style.display = "block"; - ta.value = cliptext; // must follow "block" setting for Webkit - ta.focus(); - ta.select(); - window.setTimeout(function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; // in case not loaded - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - /* - var ha = editor.pasteHTMLarea; - if (ha) { - ha.blur(); - ha.innerHTML = ''; - ha.style.visibility = 'hidden'; - } - */ - var ta = editor.pasteTextarea; - ta.blur(); - ta.style.display = "none"; - SocialCalc.KeyboardFocus(); - }, 200); - - return true; - - case "[ctrl-v]": - if (editor.noEdit) return true; // not if no edit - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - var showPasteTextArea = function() { - ta = editor.pasteTextarea; - ta.value = ""; - - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = (position.left-1)+"px"; - ta.style.top = (position.top-1)+"px"; - } - ta.style.display = "block"; - ta.value = ""; // must follow "block" setting for Webkit - ta.focus(); - }; - - ha = editor.pasteHTMLarea; - if (ha) { - /* Pasting via HTML - Currently IE only */ - ha.style.visibility = "visible"; - ha.focus(); - } - else { - showPasteTextArea(); - } - window.setTimeout(function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var value = null; - var isPasteSameAsClipboard = false; - - ha = editor.pasteHTMLarea; - if (ha) { - /* IE: We append a U+FFFC to every TD that's not the last of its row, - * then we obtain innerText, then turn U+FFFC back to \t, - * thereby preserving the cell separations (which gets discarded - * if we simply paste via textarea. - */ - var _ObjectReplacementCharacter_ = String.fromCharCode(0xFFFC); - var html = ha.innerHTML; - - if (html.search(/<(?![Bb][Rr])[A-Za-z]/) >= 0) { - /* HTML Paste: Mark TDs with U+FFFC accordingly.. */ - ha.innerHTML = html.replace( - /(?:<\/[Tt][Dd]>)/g, - _ObjectReplacementCharacter_ - ); - } - else { - /* Text Paste: In IE, \t is transformed into  , so replace them with U+FFFC. */ - ha.innerHTML = html.replace( - /&[Nn][Bb][Ss][Pp];/g, - _ObjectReplacementCharacter_ - ); - } - - value = ha.innerText.replace(new RegExp(_ObjectReplacementCharacter_, 'g'), '\t'); - - ha.innerHTML = ''; - ha.blur(); - ha.style.visibility = "hidden"; - } - else { - var ta = editor.pasteTextarea; - value = ta.value; - ta.blur(); - ta.style.display = "none"; - } - - value = value.replace(/\r\n/g, "\n").replace(/\n?$/, '\n'); - var clipstr = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.Clipboard.clipboard, "tab"); - if (value == clipstr || (value.length-clipstr.length==1 && value.substring(0,value.length-1)==clipstr)) { - isPasteSameAsClipboard = true; - } - - var cmd = ""; - // pastes SocialCalc clipboard if did a Ctrl-C and contents still the same - // Webkit adds an extra blank line, so need to allow for that - if (!isPasteSameAsClipboard) { - cmd = "loadclipboard "+ - SocialCalc.encodeForSave(SocialCalc.ConvertOtherFormatToSave(value, "tab")) + "\n"; - } - var cr; - if (editor.range.hasrange) { - cr = SocialCalc.crToCoord(editor.range.left, editor.range.top); - } - else { - cr = editor.ecell.coord; - } - cmd += "paste "+cr+" formulas"; - editor.EditorScheduleSheetCommands(cmd, true, false); - SocialCalc.KeyboardFocus(); - }, 200); - return true; - - case "[ctrl-z]": - editor.EditorScheduleSheetCommands("undo", true, false); - return false; - - case "[ctrl-s]": // !!!! temporary hack - window.setTimeout( - function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var sheet = editor.context.sheetobj; - var cell = sheet.GetAssuredCell(editor.ecell.coord); - var ntvf = cell.nontextvalueformat ? sheet.valueformats[cell.nontextvalueformat-0] || "" : ""; - var newntvf = window.prompt("Advanced Feature:\n\nCustom Numeric Format or Command", ntvf); - if (newntvf != null) { // not cancelled - if (newntvf.match(/^cmd:/)) { - cmd = newntvf.substring(4); // execute as command - } - else if (newntvf.match(/^edit:/)) { - cmd = newntvf.substring(5); // execute as command - if (SocialCalc.CtrlSEditor) { - SocialCalc.CtrlSEditor(cmd); - } - return; - } - else { - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - else { - sel = editor.ecell.coord; - } - cmd = "set "+sel+" nontextvalueformat "+newntvf; - } - editor.EditorScheduleSheetCommands(cmd, true, false); - } - }, - 200); - return false; - - default: - break; - } - return true; - }; - - // Set sheet's status callback: - - context.sheetobj.statuscallback = SocialCalc.EditorSheetStatusCallback; - context.sheetobj.statuscallbackparams = this; // this object: the table editor object - - - // StatusCallback: all values are called at appropriate times, add with unique name, delete when done - // - // Each value must be an object in the form of: - // - // func: function(editor, status, arg, params) {...}, - // params: params value to call func with - // - // The values for status and arg are: - // - // all the SocialCalc RecalcSheet statuscallbacks, including: - // - // calccheckdone, calclist length - // calcorder, {coord: coord, total: celllist length, count: count} - // calcstep, {coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds - // - // the command callbacks, like cmdstart and cmdend - // cmdendnorender - // - // calcstart, null - // moveecell, new ecell coord - // rangechange, "coord:coord" or "coord" or "" - // specialkey, keyname ("[esc]") - // - - this.StatusCallback = {}; - - - this.MoveECellCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.RangeChangeCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.SettingsCallbacks = {}; // See SocialCalc.SaveEditorSettings - - // Set initial cursor - - this.ecell = {coord: "A1", row: 1, col: 1}; - context.highlights[this.ecell.coord] = "cursor"; - - // Initialize range data - // Range has at least hasrange (true/false). - // It may also have: anchorcoord, anchorrow, anchorcol, top, bottom, left, and right. - - this.range = {hasrange: false}; - - // Initialize range2 data (used to show selections, such as for move) - // Range2 has at least hasrange (true/false). - // It may also have: top, bottom, left, and right. - - this.range2 = {hasrange: false}; - - } - -// Methods: - -SocialCalc.TableEditor.prototype.CreateTableEditor = function(width, height) {return SocialCalc.CreateTableEditor(this, width, height);}; -SocialCalc.TableEditor.prototype.ResizeTableEditor = function(width, height) {return SocialCalc.ResizeTableEditor(this, width, height);}; - -SocialCalc.TableEditor.prototype.SaveEditorSettings = function() {return SocialCalc.SaveEditorSettings(this);}; -SocialCalc.TableEditor.prototype.LoadEditorSettings = function(str, flags) {return SocialCalc.LoadEditorSettings(this, str, flags);}; - -SocialCalc.TableEditor.prototype.EditorRenderSheet = function() {SocialCalc.EditorRenderSheet(this);}; -SocialCalc.TableEditor.prototype.EditorScheduleSheetCommands = function(cmdstr, saveundo, ignorebusy) {SocialCalc.EditorScheduleSheetCommands(this, cmdstr, saveundo, ignorebusy);}; -SocialCalc.TableEditor.prototype.ScheduleSheetCommands = function(cmdstr, saveundo) { - this.context.sheetobj.ScheduleSheetCommands(cmdstr, saveundo); - }; -SocialCalc.TableEditor.prototype.SheetUndo = function() { - this.context.sheetobj.SheetUndo(); - }; -SocialCalc.TableEditor.prototype.SheetRedo = function() { - this.context.sheetobj.SheetRedo(); - }; -SocialCalc.TableEditor.prototype.EditorStepSet = function(status, arg) {SocialCalc.EditorStepSet(this, status, arg);}; -SocialCalc.TableEditor.prototype.GetStatuslineString = function(status, arg, params) {return SocialCalc.EditorGetStatuslineString(this, status, arg, params);}; - -SocialCalc.TableEditor.prototype.EditorMouseRegister = function() {return SocialCalc.EditorMouseRegister(this);}; -SocialCalc.TableEditor.prototype.EditorMouseUnregister = function() {return SocialCalc.EditorMouseUnregister(this);}; -SocialCalc.TableEditor.prototype.EditorMouseRange = function(coord) {return SocialCalc.EditorMouseRange(this, coord);}; - -SocialCalc.TableEditor.prototype.EditorProcessKey = function(ch, e) {return SocialCalc.EditorProcessKey(this, ch, e);}; -SocialCalc.TableEditor.prototype.EditorAddToInput = function(str, prefix) {return SocialCalc.EditorAddToInput(this, str, prefix);}; -SocialCalc.TableEditor.prototype.DisplayCellContents = function() {return SocialCalc.EditorDisplayCellContents(this);}; -SocialCalc.TableEditor.prototype.EditorSaveEdit = function(text) {return SocialCalc.EditorSaveEdit(this, text);}; -SocialCalc.TableEditor.prototype.EditorApplySetCommandsToRange = function(cmdline, type) {return SocialCalc.EditorApplySetCommandsToRange(this, cmdline, type);}; - -SocialCalc.TableEditor.prototype.MoveECellWithKey = function(ch) {return SocialCalc.MoveECellWithKey(this, ch);}; -SocialCalc.TableEditor.prototype.MoveECell = function(newcell) {return SocialCalc.MoveECell(this, newcell);}; -SocialCalc.TableEditor.prototype.ReplaceCell = function(cell, row, col) {SocialCalc.ReplaceCell(this, cell, row, col);}; -SocialCalc.TableEditor.prototype.UpdateCellCSS = function(cell, row, col) {SocialCalc.UpdateCellCSS(this, cell, row, col);}; -SocialCalc.TableEditor.prototype.SetECellHeaders = function(selected) {SocialCalc.SetECellHeaders(this, selected);}; -SocialCalc.TableEditor.prototype.EnsureECellVisible = function() {SocialCalc.EnsureECellVisible(this);}; -SocialCalc.TableEditor.prototype.RangeAnchor = function(coord) {SocialCalc.RangeAnchor(this, coord);}; -SocialCalc.TableEditor.prototype.RangeExtend = function(coord) {SocialCalc.RangeExtend(this, coord);}; -SocialCalc.TableEditor.prototype.RangeRemove = function() {SocialCalc.RangeRemove(this);}; -SocialCalc.TableEditor.prototype.Range2Remove = function() {SocialCalc.Range2Remove(this);}; - -SocialCalc.TableEditor.prototype.FitToEditTable = function() {SocialCalc.FitToEditTable(this);}; -SocialCalc.TableEditor.prototype.CalculateEditorPositions = function() {SocialCalc.CalculateEditorPositions(this);}; -SocialCalc.TableEditor.prototype.ScheduleRender = function() {SocialCalc.ScheduleRender(this);}; -SocialCalc.TableEditor.prototype.DoRenderStep = function() {SocialCalc.DoRenderStep(this);}; -SocialCalc.TableEditor.prototype.SchedulePositionCalculations = function() {SocialCalc.SchedulePositionCalculations(this);}; -SocialCalc.TableEditor.prototype.DoPositionCalculations = function() {SocialCalc.DoPositionCalculations(this);}; -SocialCalc.TableEditor.prototype.CalculateRowPositions = function(panenum, positions, sizes) {return SocialCalc.CalculateRowPositions(this, panenum, positions, sizes);}; -SocialCalc.TableEditor.prototype.CalculateColPositions = function(panenum, positions, sizes) {return SocialCalc.CalculateColPositions(this, panenum, positions, sizes);}; - -SocialCalc.TableEditor.prototype.ScrollRelative = function(vertical, amount) {SocialCalc.ScrollRelative(this, vertical, amount);}; -SocialCalc.TableEditor.prototype.ScrollRelativeBoth = function(vamount, hamount) {SocialCalc.ScrollRelativeBoth(this, vamount, hamount);}; -SocialCalc.TableEditor.prototype.PageRelative = function(vertical, direction) {SocialCalc.PageRelative(this, vertical, direction);}; -SocialCalc.TableEditor.prototype.LimitLastPanes = function() {SocialCalc.LimitLastPanes(this);}; - -SocialCalc.TableEditor.prototype.ScrollTableUpOneRow = function() {return SocialCalc.ScrollTableUpOneRow(this);}; -SocialCalc.TableEditor.prototype.ScrollTableDownOneRow = function() {return SocialCalc.ScrollTableDownOneRow(this);}; -SocialCalc.TableEditor.prototype.ScrollTableLeftOneCol = function() {return SocialCalc.ScrollTableLeftOneCol(this);}; -SocialCalc.TableEditor.prototype.ScrollTableRightOneCol = function() {return SocialCalc.ScrollTableRightOneCol(this);}; - -// Functions: - -SocialCalc.CreateTableEditor = function(editor, width, height) { - - var scc = SocialCalc.Constants; - var AssignID = SocialCalc.AssignID; - - editor.toplevel = document.createElement("div"); - editor.width = width; - editor.height = height; - - editor.griddiv = document.createElement("div"); - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width=editor.tablewidth+"px"; - editor.griddiv.style.height=editor.tableheight+"px"; - editor.griddiv.style.overflow="hidden"; - editor.griddiv.style.cursor="default"; - if (scc.cteGriddivClass) editor.griddiv.className = scc.cteGriddivClass; - AssignID(editor, editor.griddiv, "griddiv"); - - editor.FitToEditTable(); - - editor.EditorRenderSheet(); - - editor.griddiv.appendChild(editor.fullgrid); - - editor.verticaltablecontrol = new SocialCalc.TableControl(editor, true, editor.tableheight); - editor.verticaltablecontrol.CreateTableControl(); - AssignID(editor, editor.verticaltablecontrol.main, "tablecontrolv"); - - editor.horizontaltablecontrol = new SocialCalc.TableControl(editor, false, editor.tablewidth); - editor.horizontaltablecontrol.CreateTableControl(); - AssignID(editor, editor.horizontaltablecontrol.main, "tablecontrolh"); - - var table, tbody, tr, td, img, anchor, ta, ha; - - table = document.createElement("table"); - editor.layouttable = table; - table.cellSpacing = 0; - table.cellPadding = 0; - AssignID(editor, table, "layouttable"); - - tbody = document.createElement("tbody"); - table.appendChild(tbody); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - td.appendChild(editor.griddiv); - tr.appendChild(td); - td = document.createElement("td"); - //td.appendChild(editor.verticaltablecontrol.main); - tr.appendChild(td); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - //td.appendChild(editor.horizontaltablecontrol.main); - tr.appendChild(td); - - td = document.createElement("td"); // logo display: Required by CPAL License for this code! - //td.style.background="url("+editor.imageprefix+"logo.gif) no-repeat center center"; - td.innerHTML = "
    "; - tr.appendChild(td); - editor.logo = td; - AssignID(editor, editor.logo, "logo"); - SocialCalc.TooltipRegister(td.firstChild.firstChild, "SocialCalc", null); - - editor.toplevel.appendChild(editor.layouttable); - - if (!editor.noEdit) { - editor.inputEcho = new SocialCalc.InputEcho(editor); - AssignID(editor, editor.inputEcho.main, "inputecho"); - } - - editor.cellhandles = new SocialCalc.CellHandles(editor); - - ta = document.createElement("textarea"); // used for ctrl-c/ctrl-v where an invisible text area is needed - SocialCalc.setStyles(ta, "display:none;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);"); - ta.value = ""; - editor.pasteTextarea = ta; - AssignID(editor, editor.pasteTextarea, "pastetextarea"); - - if (navigator.userAgent.match(/Safari\//) &&!navigator.userAgent.match(/Chrome\//)) { // special code for Safari 5 change - window.removeEventListener('beforepaste', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforepaste', SocialCalc.SafariPasteFunction, false); - window.removeEventListener('beforecopy', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforecopy', SocialCalc.SafariPasteFunction, false); - window.removeEventListener('beforecut', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforecut', SocialCalc.SafariPasteFunction, false); - } - - editor.toplevel.appendChild(editor.pasteTextarea); - - var div = document.createElement("div"); - div.innerHTML = '
    '; - if (div.firstChild.nodeType == 1) { - /* We are running in IE -- Using HTML-based area for Ctrl-V */ - ha = document.createElement("div"); // used for ctrl-v where an invisible html area is needed - editor.pasteHTMLarea = ha; - editor.toplevel.appendChild(editor.pasteHTMLarea); - ha.contentEditable = true; - AssignID(editor, editor.pasteHTMLarea, "pastehtmlarea"); - SocialCalc.setStyles(ha, "display:block;visibility:hidden;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);overflow:hidden"); - } - - SocialCalc.MouseWheelRegister(editor.toplevel, {WheelMove: SocialCalc.EditorProcessMouseWheel, editor: editor}); - - if (SocialCalc.HasTouch) { - SocialCalc.TouchRegister(editor.toplevel, {Swipe: SocialCalc.EditorProcessSwipe, - DoubleTap: SocialCalc.EditorProcessDoubleTap, - SingleTap: SocialCalc.EditorProcessSingleTap, - editor: editor}); - } - - if (editor.inputBox) { // this seems to fix an obscure bug with Firefox 2 Mac where Ctrl-V doesn't get fired right - if (editor.inputBox.element) { - editor.inputBox.element.focus(); - editor.inputBox.element.blur(); - } - } - SocialCalc.KeyboardSetFocus(editor); - - // do status reporting things - - SocialCalc.EditorSheetStatusCallback(null, "startup", null, editor); - - // done - - return editor.toplevel; - - } - -// Special code needed for change that occurred with Safari 5 that made paste not work for some reason - -SocialCalc.SafariPasteFunction = function(e) { - e.preventDefault(); - } - -// -// SocialCalc.ResizeTableEditor(editor, width, height) -// -// Move things around as appropriate and resize -// - -SocialCalc.ResizeTableEditor = function(editor, width, height) { - - var scc = SocialCalc.Constants; - - editor.width = width; - editor.height = height; - - editor.toplevel.style.width = width+"px"; - editor.toplevel.style.height = height+"px"; - - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width=editor.tablewidth+"px"; - editor.griddiv.style.height=editor.tableheight+"px"; - - editor.verticaltablecontrol.main.style.height = editor.tableheight + "px"; - editor.horizontaltablecontrol.main.style.width = editor.tablewidth + "px"; - - editor.FitToEditTable(); - - editor.ScheduleRender(); - - return; - - } - -// -// str = SaveEditorSettings(editor) -// -// Returns a string representation of the pane settings, etc. -// -// The format is: -// -// version:1.0 -// rowpane:panenumber:firstnum:lastnum -// colpane:panenumber:firstnum:lastnum -// ecell:coord -- if set -// range:anchorcoord:top:bottom:left:right -- if set -// -// You can add additional values to be saved by using editor.SettingsCallbacks: -// -// editor.SettingsCallbacks["item-name"] = {save: savefunction, load: loadfunction} -// -// where savefunction(editor, "item-name") returns a string with the new lines to be added to the saved settings -// which include the trailing newlines, and loadfunction(editor, "item-name", line, flags) is given the line to process -// without the trailing newlines. -// - -SocialCalc.SaveEditorSettings = function(editor) { - - var i, setting; - var context = editor.context; - var range = editor.range; - var result = ""; - - result += "version:1.0\n"; - - for (i=0; i'; - } - - return sstr; - - } - - -// -// Mouse stuff -// - -SocialCalc.EditorMouseInfo = { - - // The registeredElements array is used to identify editor grid in which the mouse is doing things. - - // One item for each active editor, each an object with: - // .element, .editor - - registeredElements: [], - - editor: null, // editor being processed (between mousedown and mouseup) - element: null, // element being processed - - ignore: false, // if true, mousedowns are ignored - - mousedowncoord: "", // coord where mouse went down for drag range - mouselastcoord: "", // coord where mouse last was during drag - mouseresizecol: "", // col being resized - mouseresizeclientx: null, // where resize started - mouseresizedisplay: null // element tracking new size - } - -// -// EditorMouseRegister(editor) -// - -SocialCalc.EditorMouseRegister = function(editor) { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var element = editor.fullgrid; - var i; - - for (i=0; i=^".indexOf(inputtext.slice(-1))>=0 && inputtext.slice(0,1)=="=") || - (inputtext == "=")) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { // if in pointing operation - if (coord) { - if (range.hasrange) { - var sheetpref = (wval.currentsheet == wval.startsheet)?"":wval.currentsheet+"!"; - editor.inputBox.SetText(wval.partialexpr + sheetpref+ SocialCalc.crToCoord(range.left, range.top) + ":" + sheetpref + - SocialCalc.crToCoord(range.right, range.bottom)); - } - else { - var sheetpref = (wval.currentsheet == wval.startsheet)?"":wval.currentsheet+"!"; - editor.inputBox.SetText(wval.partialexpr + sheetpref+coord); - } - } - } - else { // not in point -- done editing - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - } - break; - - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - break; - } - } - -SocialCalc.ProcessEditorMouseMove = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat(editor, result); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - if (result.coord!=mouseinfo.mouselastcoord) { - if (!e.shiftKey && !editor.range.hasrange) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - } - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - mouseinfo.mouselastcoord = result.coord; - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.ProcessEditorMouseUp = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result) return; - - if (!result.coord) result.coord = editor.ecell.coord; - - if (editor.range.hasrange) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - else if (result.coord && result.coord!=mouseinfo.mousedowncoord) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.ProcessEditorMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.ProcessEditorMouseUp, true); - } - else if (element.detachEvent) { // IE - element.detachEvent("onlosecapture", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmouseup", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmousemove", SocialCalc.ProcessEditorMouseMove); - element.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - - } - - -SocialCalc.ProcessEditorColsizeMouseDown = function(e, ele, result) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - mouseinfo.mouseresizecolnum = result.coltoresize; // remember col being resized - mouseinfo.mouseresizecol = SocialCalc.rcColname(result.coltoresize); - mouseinfo.mousedownclientx = clientX; - - var sizedisplay = document.createElement("div"); - mouseinfo.mouseresizedisplay = sizedisplay; - sizedisplay.style.width = "auto"; - sizedisplay.style.position = "absolute"; - sizedisplay.style.zIndex = 100; - sizedisplay.style.top = (editor.headposition.top+0)+"px"; - sizedisplay.style.left = editor.colpositions[result.coltoresize]+"px"; - sizedisplay.innerHTML = ''+ - '
     
    '+ - editor.context.colwidth[mouseinfo.mouseresizecolnum] + '
    '; - SocialCalc.setStyles(sizedisplay.firstChild.lastChild.firstChild.childNodes[0], "filter:alpha(opacity=85);opacity:.85;"); // so no warning msg with Firefox about filter - - editor.toplevel.appendChild(sizedisplay); - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mousemove", SocialCalc.ProcessEditorColsizeMouseMove, true); // capture everywhere - document.addEventListener("mouseup", SocialCalc.ProcessEditorColsizeMouseUp, true); // capture everywhere - } - else if (editor.toplevel.attachEvent) { // IE 5+ - editor.toplevel.setCapture(); - editor.toplevel.attachEvent("onmousemove", SocialCalc.ProcessEditorColsizeMouseMove); - editor.toplevel.attachEvent("onmouseup", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.attachEvent("onlosecapture", SocialCalc.ProcessEditorColsizeMouseUp); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - } - - -SocialCalc.ProcessEditorColsizeMouseMove = function(e) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - var newsize = (editor.context.colwidth[mouseinfo.mouseresizecolnum]-0) + (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) newsize = SocialCalc.Constants.defaultMinimumColWidth; - - var sizedisplay = mouseinfo.mouseresizedisplay; -// sizedisplay.firstChild.lastChild.firstChild.childNodes[1].firstChild.innerHTML = newsize+""; -// sizedisplay.firstChild.lastChild.firstChild.childNodes[0].firstChild.style.width = (newsize-2)+"px"; - sizedisplay.innerHTML = ''+ - '
     
    '+ - newsize + '
    '; - SocialCalc.setStyles(sizedisplay.firstChild.lastChild.firstChild.childNodes[0], "filter:alpha(opacity=85);opacity:.85;"); // so no warning msg with Firefox about filter - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.ProcessEditorColsizeMouseUp = function(e) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - element = mouseinfo.element; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.ProcessEditorColsizeMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.ProcessEditorColsizeMouseUp, true); - } - else if (editor.toplevel.detachEvent) { // IE - editor.toplevel.detachEvent("onlosecapture", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.detachEvent("onmouseup", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.detachEvent("onmousemove", SocialCalc.ProcessEditorColsizeMouseMove); - editor.toplevel.releaseCapture(); - } - - var newsize = (editor.context.colwidth[mouseinfo.mouseresizecolnum]-0) + (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) newsize = SocialCalc.Constants.defaultMinimumColWidth; - - editor.EditorScheduleSheetCommands("set "+mouseinfo.mouseresizecol+" width "+newsize, true, false); - - if (editor.timeout) window.clearTimeout(editor.timeout); - editor.timeout = window.setTimeout(SocialCalc.FinishColsize, 1); // wait - Firefox 2 has a bug otherwise with next mousedown - - return false; - - } - - -SocialCalc.FinishColsize = function() { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; - - editor.toplevel.removeChild(mouseinfo.mouseresizedisplay); - mouseinfo.mouseresizedisplay = null; - -// editor.FitToEditTable(); -// editor.EditorRenderSheet(); -// editor.SchedulePositionCalculations(); - - mouseinfo.editor = null; - - return; - - } - -// -// Handle auto-repeat of dragging the cursor into the borders of the sheet -// - -SocialCalc.AutoRepeatInfo = { - - timer: null, // timer object for repeating - mouseinfo: null, // result from SocialCalc.GridMousePosition - repeatinterval: 1000, // milliseconds to wait between repeats - editor: null, // editor object to use when it repeats - repeatcallback: null // used instead of default when repeating (e.g., for cellhandles) - // called as: repeatcallback(newcoord, direction) - -}; - -// Control auto-repeat. If mouseinfo==null, cancel. - -SocialCalc.SetDragAutoRepeat = function(editor, mouseinfo, callback) { - - var repeatinfo = SocialCalc.AutoRepeatInfo; - var coord, direction; - - repeatinfo.repeatcallback = callback; // null in regular case - - if (!mouseinfo) { // cancel - if (repeatinfo.timer) { // If was repeating, stop - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - repeatinfo.mouseinfo = null; - return; // done - } - - repeatinfo.editor = editor; - - if (repeatinfo.mouseinfo) { // check for change while repeating - if (mouseinfo.rowheader || mouseinfo.rowfooter) { - if (mouseinfo.row != repeatinfo.mouseinfo.row) { // changed row while dragging sidewards - coord = SocialCalc.crToCoord(editor.ecell.col, mouseinfo.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } - else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } - else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } - else { - editor.MoveECell(coord); - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } - else if (mouseinfo.colheader || mouseinfo.colfooter) { - if (mouseinfo.col != repeatinfo.mouseinfo.col) { // changed col while dragging vertically - coord = SocialCalc.crToCoord(mouseinfo.col, editor.ecell.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } - else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } - else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } - else { - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } - } - - repeatinfo.mouseinfo = mouseinfo; - - if (mouseinfo.distance < 5) repeatinfo.repeatinterval = 333; - else if (mouseinfo.distance < 10) repeatinfo.repeatinterval = 250; - else if (mouseinfo.distance < 25) repeatinfo.repeatinterval = 100; - else if (mouseinfo.distance < 35) repeatinfo.repeatinterval = 75; - else { // too far - stop repeating - if (repeatinfo.timer) { // if repeating, cancel it - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - return; - } - - if (!repeatinfo.timer) { // start if not already running - repeatinfo.timer = window.setTimeout(SocialCalc.DragAutoRepeat, repeatinfo.repeatinterval); - } - - return; - - } - -// -// DragAutoRepeat() -// - -SocialCalc.DragAutoRepeat = function() { - - var repeatinfo = SocialCalc.AutoRepeatInfo; - var mouseinfo = repeatinfo.mouseinfo; - - var direction, coord, cr; - - if (mouseinfo.rowheader) direction = "left"; - else if (mouseinfo.rowfooter) direction = "right"; - else if (mouseinfo.colheader) direction = "up"; - else if (mouseinfo.colfooter) direction = "down"; - - if (repeatinfo.repeatcallback) { - cr = SocialCalc.coordToCr(repeatinfo.editor.ecell.coord); - if (direction == "left" && cr.col > 1) cr.col--; - else if (direction == "right") cr.col++; - else if (direction == "up" && cr.row > 1) cr.row--; - else if (direction == "down") cr.row++; - coord = SocialCalc.crToCoord(cr.col, cr.row); - repeatinfo.repeatcallback(coord, direction); - } - else { - coord = repeatinfo.editor.MoveECellWithKey("[a"+direction+"]shifted"); - if (coord) repeatinfo.editor.EditorMouseRange(coord); - } - - repeatinfo.timer = window.setTimeout(SocialCalc.DragAutoRepeat, repeatinfo.repeatinterval); - - } - -// -// Handling Clicking -// - -SocialCalc.ProcessEditorDblClick = function(e) { - - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var mobj; - - if (mouseinfo.ignore) return; // ignore this - - for (mobj=null; !mobj && ele; ele=ele.parentNode) { // go up tree looking for one of our elements - mobj = SocialCalc.LookupElement(ele, mouseinfo.registeredElements); - } - if (!mobj) { - mouseinfo.editor = null; - return; // not one of our elements - } - - editor = mobj.editor; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); - if (!result || !result.coord) return; // not within cell area - ignore - - mouseinfo.editor = editor; // remember for later - mouseinfo.element = ele; - range = editor.range; - - sheetobj = editor.context.sheetobj; - - switch (editor.state) { - case "start": - SocialCalc.EditorOpenCellEdit(editor); - break; - - case "input": - break; - - default: - break; - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.EditorOpenCellEdit = function(editor) { - - var wval; - - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no input box, so no editing (happens on noEdit) - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - if (editor.inputBox.element.disabled) return true; // multi-line: ignore - if (editor.inputBox.element.style.display == 'none') { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "editecell", null, editor.StatusCallback[f].params); - } - return true; // no inputBox display, so no editing - } - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - - editor.state = "inputboxdirect"; - - editor.inputBox.SetText(""); - editor.inputBox.DisplayCellContents(); - editor.inputBox.Select("end"); - wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - - return; - - } - - -SocialCalc.EditorProcessKey = function(editor, ch, e) { - - var result, cell, cellobj, valueinfo, fch, coord, inputtext, f; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - var range = editor.range; - - if (typeof ch != "string") ch = ""; - - switch (editor.state) { - case "start": - if (e.shiftKey && ch.substr(0,2)=="[a") { - ch = ch + "shifted"; - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a" || ch.substr(0,3)=="[pg" || ch=="[home]") { - result = editor.MoveECellWithKey(ch); - return !result; - } - if (ch=="[del]" || ch=="[backspace]") { - if (!editor.noEdit) { - editor.EditorApplySetCommandsToRange("empty", ""); - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - break; - } - if (ch=="[esc]") { - if (range.hasrange) { - editor.RangeRemove(); - editor.MoveECell(range.anchorcoord); - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "specialkey", ch, editor.StatusCallback[f].params); - } - } - return false; - } - - if (ch=="[f2]") { - if (editor.noEdit) return true; - SocialCalc.EditorOpenCellEdit(editor); - return false; - } - - if ((ch.length>1 && ch.substr(0,1)=="[") || ch.length==0) { // some control key - if (editor.ctrlkeyFunction && ch.length>0) { - return editor.ctrlkeyFunction(editor, ch); - } - else { - return true; - } - } - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no inputBox so no editing - if (editor.inputBox.element.style.display == 'none') { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "editecell", ch, editor.StatusCallback[f].params); - } - return true; // no inputBox display, so no editing - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - editor.inputBox.element.disabled = false; // make sure editable - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - editor.inputBox.SetText(ch); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (editor.inputBox.skipOne) return false; // ignore a key already handled - if (ch=="[esc]" || ch=="[enter]" || ch=="[tab]" || (ch && ch.substr(0,2)=="[a")) { - if (("(+-*/,:!&<>=^".indexOf(inputtext.slice(-1))>=0 && inputtext.slice(0,1)=="=") || - (inputtext == "=")) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { // if in pointing operation - if (e.shiftKey && ch.substr(0,2)=="[a") { - ch = ch + "shifted"; - } - coord = editor.MoveECellWithKey(ch); - if (coord) { - if (range.hasrange) { - editor.inputBox.SetText(wval.partialexpr + SocialCalc.crToCoord(range.left, range.top) + ":" + - SocialCalc.crToCoord(range.right, range.bottom)); - } - else { - editor.inputBox.SetText(wval.partialexpr + coord); - } - return false; - } - } - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch != "[esc]") { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a") { - editor.MoveECellWithKey(ch); - } - } - else { - editor.inputBox.DisplayCellContents(); - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - break; - } - if (wval.partialexpr && ch=="[backspace]") { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - return false; - } - if (ch=="[f2]") return false; - if (range.hasrange) { - editor.RangeRemove(); - } - editor.MoveECell(wval.ecoord); - if (wval.partialexpr) { - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - wval.partialexpr = ""; // not pointing - } - return true; - - case "inputboxdirect": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (ch=="[esc]" || ch=="[enter]" || ch=="[tab]") { - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch == "[esc]") { - editor.inputBox.DisplayCellContents(); - } - else { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a") { - editor.MoveECellWithKey(ch); - } - } - break; - } - if (ch=="[f2]") return false; - return true; - - case "skip-and-start": - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - return false; - - default: - return true; - } - - return false; - - } - -SocialCalc.EditorAddToInput = function(editor, str, prefix) { - - var wval = editor.workingvalues; - - if (editor.noEdit) return; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - - switch (editor.state) { - case "start": - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.element.disabled = false; // make sure editable and overwrite old - editor.inputBox.Focus(); - editor.inputBox.SetText((prefix||"")+str); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.focus(); - if (wval.partialexpr) { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - editor.inputBox.SetText(editor.inputBox.GetText()+str); - break; - - default: - break; - } - - } - - -SocialCalc.EditorDisplayCellContents = function(editor) { - - if (editor.inputBox) editor.inputBox.DisplayCellContents(); - - } - -SocialCalc.EditorSaveEdit = function(editor, text) { - - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - type = "text t"; - value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord)+""; - if (value == oldvalue) { // no change - return; - } - if ("'"+value == oldvalue) { - return; - } - - if (SocialCalc.Callbacks.editAutoSave) { - console.log("editAutoSave"); - SocialCalc.Callbacks.editAutoSave(); - } - - - fch = value.charAt(0); - if (fch=="=" && value.indexOf("\n")==-1) { - type = "formula"; - value = value.substring(1); - } - else if (fch=="'") { - type = "text t"; - value = value.substring(1); - } - else if (value.length==0) { - type = "empty"; - } - else { - valueinfo = SocialCalc.DetermineValueType(value) - if (valueinfo.type=="n" && value==(valueinfo.value+"")) { // see if don't need "constant" - type = "value n"; - } - else if (valueinfo.type.charAt(0)=="t") { - type = "text "+valueinfo.type; - } - else if (valueinfo.type=="") { - type = "text t"; - } - else { - type = "constant "+valueinfo.type+" "+valueinfo.value; - } - } - - if (type.charAt(0)=="t") { // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && (wval.currentsheet != wval.startsheet)) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " +wval.startsheetid; - control.ExecuteWorkBookControlCommand( { cmdtype:"wcmd", id:"0", cmdstr: cmdstr} - ,false) - } - - cmdline = "set "+wval.ecoord+" "+type+" "+value; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - - } - -// -// SocialCalc.EditorApplySetCommandsToRange(editor, cmd) -// -// Takes ecell or range and does a "set" command with cmd. -// - -SocialCalc.EditorApplySetCommandsToRange = function(editor, cmd) { - - var cell, row, col, line, errortext; - - var sheetobj = editor.context.sheetobj; - var ecell = editor.ecell; - var range = editor.range; - - if (range.hasrange) { - coord = SocialCalc.crToCoord(range.left, range.top)+":"+SocialCalc.crToCoord(range.right, range.bottom); - line = "set "+coord+" "+cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } - else { - line = "set "+ecell.coord+" "+cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } - - editor.DisplayCellContents(); - - } - -SocialCalc.EditorProcessMouseWheel = function(event, delta, mousewheelinfo, wobj) { - - if (wobj.functionobj.editor.busy) return; // ignore if busy - - if (delta > 0) { - wobj.functionobj.editor.ScrollRelative(true, -1); - } - if (delta < 0) { - wobj.functionobj.editor.ScrollRelative(true, +1); - } - - } - -// -// GridMousePosition(editor, clientX, clientY) -// -// Returns an object with row and col numbers and coord (spans handled for coords), -// and rowheader/colheader true if in header (where coord will be undefined). -// If in colheader, will return coltoresize if on appropriate place in col header. -// Also, there is rowfooter (on right) and colfooter (on bottom). -// In row/col header/footer, returns "distance" as pixels over the edge. -// - -SocialCalc.GridMousePosition = function(editor, clientX, clientY) { - - var row, col, colpane; - var result = {}; - - for (row=1; rowclientY) { - break; - } - } - for (col=1; colclientX) { - break; - } - } - - result.row = row; - result.col = col; - - if (editor.headposition) { - if (clientX < editor.headposition.left && clientX >= editor.gridposition.left) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } - else if (clientY < editor.headposition.top && clientY > editor.gridposition.top) { // > because of sizing row - result.colheader = true; - result.distance = editor.headposition.top - clientY; - result.coltoresize = col-(editor.colpositions[col]+editor.colwidth[col]/2>clientX?1:0) || 1; - for (colpane=0; colpane= editor.context.colpanes[colpane].first && - result.coltoresize <= editor.context.colpanes[colpane].last) { // visible column - return result; - } - } - delete result.coltoresize; - return result; - } - else if (clientX >= editor.verticaltablecontrol.controlborder) { - result.rowfooter = true; - result.distance = clientX - editor.verticaltablecontrol.controlborder; - return result; - } - else if (clientY >= editor.horizontaltablecontrol.controlborder) { - result.colfooter = true; - result.distance = clientY - editor.horizontaltablecontrol.controlborder; - return result; - } - else if (clientX < editor.gridposition.left) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } - else if (clientY <= editor.gridposition.top) { - result.colheader = true; - result.distance = editor.headposition.top - clientY; - return result; - } - else { - result.coord = SocialCalc.crToCoord(result.col, result.row); - if (editor.context.cellskip[result.coord]) { // handle skipped cells - result.coord = editor.context.cellskip[result.coord]; - } - return result; - } - } - - return null; - - } - -// -// GetEditorCellElement(editor, row, col) -// -// Returns an object with element, the table cell element in the DOM that corresponds to row and column, -// as well as rowpane and colpane, the panes with the cell. -// If no such element, then returns null; -// - -SocialCalc.GetEditorCellElement = function(editor, row, col) { - - var rowpane, colpane, c, coord; - var rowindex = 0; - var colindex = 0; - - for (rowpane=0; rowpane= editor.context.rowpanes[rowpane].first && row <= editor.context.rowpanes[rowpane].last) { - for (colpane=0; colpane= editor.context.colpanes[colpane].first && col <= editor.context.colpanes[colpane].last) { - rowindex += row - editor.context.rowpanes[rowpane].first + 2; - for (c=editor.context.colpanes[colpane].first; c<=col; c++) { - coord=editor.context.cellskip[SocialCalc.crToCoord(c,row)]; - if (!coord || !editor.context.CoordInPane(coord, rowpane, colpane)) // don't count col-spanned cells - colindex++; - } - return { - element: editor.griddiv.firstChild.lastChild.childNodes[rowindex].childNodes[colindex], - rowpane: rowpane, colpane: colpane}; - } - for (c=editor.context.colpanes[colpane].first; c<=editor.context.colpanes[colpane].last; c++) { - coord=editor.context.cellskip[SocialCalc.crToCoord(c,row)]; - if (!coord || !editor.context.CoordInPane(coord, rowpane, colpane)) // don't count col-spanned cells - colindex++; - } - colindex += 1; - } - } - rowindex += editor.context.rowpanes[rowpane].last - editor.context.rowpanes[rowpane].first + 1 + 1; - } - - return null; -} - -// -// cellcoord = MoveECellWithKey(editor, ch) -// -// Processes an arrow key, etc., moving the edit cell. -// If not a movement key, returns null. -// - -SocialCalc.MoveECellWithKey = function(editor, ch) { - - var coord, row, col, cell; - var shifted = false; - - if (!editor.ecell) { - return null; - } - - if (ch.slice(-7)=="shifted") { - ch = ch.slice(0,-7); - shifted = true; - } - - row = editor.ecell.row; - col = editor.ecell.col; - cell = editor.context.sheetobj.cells[editor.ecell.coord]; - - switch (ch) { - case "[adown]": - row += (cell && cell.rowspan) || 1; - break; - case "[aup]": - row--; - break; - case "[pgdn]": - row += editor.pageUpDnAmount - 1 + ((cell && cell.rowspan) || 1); - break; - case "[pgup]": - row -= editor.pageUpDnAmount; - break; - case "[aright]": - col += (cell && cell.colspan) || 1; - break; - case "[aleft]": - col--; - break; - case "[home]": - row = 1; - col = 1; - break; - default: - return null; - } - - if (!editor.range.hasrange) { - if (shifted) - editor.RangeAnchor(); - } - - coord = editor.MoveECell(SocialCalc.crToCoord(col, row)); - - if (editor.range.hasrange) { - if (shifted) - editor.RangeExtend(); - else - editor.RangeRemove(); - } - - return coord; - - } - -// -// cellcoord = MoveECell(editor, newecell) -// -// Takes a coordinate and returns the new edit cell coordinate (which may be -// different if newecell is covered by a span). -// - -SocialCalc.MoveECell = function(editor, newcell) { - - var cell, f; - - var highlights = editor.context.highlights; - - if (editor.ecell) { - if (editor.ecell.coord==newcell) return newcell; // already there - don't do anything and don't tell anybody - - if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast('ecell', { original: editor.ecell.coord, ecell: newcell }); - } - - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - delete highlights[editor.ecell.coord]; - if (editor.range2.hasrange && - editor.ecell.row>=editor.range2.top && editor.ecell.row<=editor.range2.bottom && - editor.ecell.col>=editor.range2.left && editor.ecell.col<=editor.range2.right) { - highlights[editor.ecell.coord] = "range2"; - } - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders(""); // set to regular col/rowname styles - editor.cellhandles.ShowCellHandles(false); - } - else if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast('ecell', { ecell: newcell }); - } - newcell = editor.context.cellskip[newcell] || newcell; - editor.ecell = SocialCalc.coordToCr(newcell); - editor.ecell.coord = newcell; - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - highlights[newcell] = "cursor"; - - for (f in editor.MoveECellCallback) { // let others know - editor.MoveECellCallback[f](editor); - } - - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders("selected"); - - for (f in editor.StatusCallback) { // let status line, etc., know - editor.StatusCallback[f].func(editor, "moveecell", newcell, editor.StatusCallback[f].params); - } - - if (editor.busy) { - editor.ensureecell = true; // wait for when not busy - } - else { - editor.ensureecell = false; - editor.EnsureECellVisible(); - } - - return newcell; - - } - -SocialCalc.EnsureECellVisible = function(editor) { - - var vamount = 0; - var hamount = 0; - - if (editor.ecell.row > editor.lastnonscrollingrow) { - if (editor.ecell.row < editor.firstscrollingrow) { - vamount = editor.ecell.row - editor.firstscrollingrow; - } - else if (editor.ecell.row > editor.lastvisiblerow) { - vamount = editor.ecell.row - editor.lastvisiblerow; - } - } - if (editor.ecell.col > editor.lastnonscrollingcol) { - if (editor.ecell.col < editor.firstscrollingcol) { - hamount = editor.ecell.col - editor.firstscrollingcol; - } - else if (editor.ecell.col > editor.lastvisiblecol) { - hamount = editor.ecell.col- editor.lastvisiblecol; - } - } - - if (vamount!=0 || hamount!=0) { - editor.ScrollRelativeBoth(vamount, hamount); - } - else { - editor.cellhandles.ShowCellHandles(true); - } - - } - -SocialCalc.ReplaceCell = function(editor, cell, row, col) { - - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell(row, col, cell.rowpane, cell.colpane, true, null); - if (newelement) { - // Don't use a real element and replaceChild, which seems to have focus issues with IE, Firefox, and speed issues - cell.element.innerHTML = newelement.innerHTML; - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a]!="cssText") - cell.element.style[a] = newelement.style[a]; - } - } - } - - -SocialCalc.UpdateCellCSS = function(editor, cell, row, col) { - - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell(row, col, cell.rowpane, cell.colpane, true, null); - if (newelement) { - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a]!="cssText") - cell.element.style[a] = newelement.style[a]; - } - } - } - - -SocialCalc.SetECellHeaders = function(editor, selected) { - - var ecell = editor.ecell; - var context = editor.context; - - var rowpane, colpane, first, last; - var rowindex = 0; - var colindex = 0; - var headercell; - - if (!ecell) return; - - for (rowpane=0; rowpane= first && ecell.row <= last) { - headercell = editor.fullgrid.childNodes[1].childNodes[2+rowindex+ecell.row-first].childNodes[0]; - if (headercell) { - if (context.classnames) headercell.className=context.classnames[selected+"rowname"]; - if (context.explicitStyles) headercell.style.cssText=context.explicitStyles[selected+"rowname"]; - headercell.style.verticalAlign="top"; // to get around Safari making top of centered row number be - // considered top of row (and can't get position in Safari) - } - } - rowindex += last - first + 1 + 1; - } - - for (colpane=0; colpane= first && ecell.col <= last) { - headercell = editor.fullgrid.childNodes[1].childNodes[1].childNodes[1+colindex+ecell.col-first]; - if (headercell) { - if (context.classnames) headercell.className=context.classnames[selected+"colname"]; - if (context.explicitStyles) headercell.style.cssText=context.explicitStyles[selected+"colname"]; - } - } - colindex += last - first + 1 + 1; - } - } - -// -// RangeAnchor(editor, ecoord) -// -// Sets the anchor of a range to ecoord (or ecell if missing). -// - -SocialCalc.RangeAnchor = function(editor, ecoord) { - - if (editor.range.hasrange) { - editor.RangeRemove(); - } - - editor.RangeExtend(ecoord); - - } - -// -// RangeExtend(editor, ecoord) -// -// Sets the other corner of the range to ecoord or, if missing, ecell. -// - -SocialCalc.RangeExtend = function(editor, ecoord) { - - var a, cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - var ecell; - if (ecoord) { - ecell = SocialCalc.coordToCr(ecoord); - ecell.coord = ecoord; - } - else ecell = editor.ecell; - - if (!ecell) return; // just in case - if (SocialCalc.Constants.SCNoRanging) return; - - if (!range.hasrange) { // called without RangeAnchor... - range.anchorcoord = ecell.coord; - range.anchorrow = ecell.row; - range.top = ecell.row; - range.bottom = ecell.row; - range.anchorcol = ecell.col; - range.left = ecell.col; - range.right = ecell.col; - range.hasrange = true; - } - - if (range.anchorrow < ecell.row) { - range.top = range.anchorrow; - range.bottom = ecell.row; - } - else { - range.top = ecell.row; - range.bottom = range.anchorrow; - } - if (range.anchorcol < ecell.col) { - range.left = range.anchorcol; - range.right = ecell.col; - } - else { - range.left = ecell.col; - range.right = range.anchorcol; - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - highlights[coord] = "unrange"; - break; - case "range2": - highlights[coord] = "unrange2"; - break; - } - } - - for (row=range.top; row<=range.bottom; row++) { - for (col=range.left; col<=range.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange": - highlights[coord] = "range"; - break; - case "cursor": - break; - case "unrange2": - default: - highlights[coord] = "newrange"; - break; - } - } - } - - for (row=range2.top; range2.hasrange && row<=range2.bottom; row++) { - for (col=range2.left; col<=range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange2": - highlights[coord] = "range2"; - break; - case "range": - case "newrange": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - - switch (highlights[coord]) { - case "unrange": - delete highlights[coord]; - break; - case "newrange": - highlights[coord] = "range"; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "range": - case "range2": - case "cursor": - continue; - } - - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - - } - - for (f in editor.RangeChangeCallback) { // let others know - editor.RangeChangeCallback[f](editor); - } - - // create range/coord string and do status callback - - coord = SocialCalc.crToCoord(editor.range.left, editor.range.top); - if (editor.range.left!=editor.range.right || editor.range.top!=editor.range.bottom) { // more than one cell - coord += ":" + SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "rangechange", coord, editor.StatusCallback[f].params); - } - - return; - - } - -// -// RangeRemove(editor) -// -// Turns off the range. -// - -SocialCalc.RangeRemove = function(editor) { - - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - if (!range.hasrange && !range2.hasrange) return; - - for (row=range2.top; range2.hasrange && row<=range2.bottom; row++) { - for (col=range2.left; col<=range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "range": - highlights[coord] = "newrange2"; - break; - case "range2": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - delete highlights[coord]; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell=SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range.hasrange = false; - - for (f in editor.RangeChangeCallback) { // let others know - editor.RangeChangeCallback[f](editor); - } - - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "rangechange", "", editor.StatusCallback[f].params); - } - - return; - - } - -// -// Range2Remove(editor) -// -// Turns off the range2. -// - -SocialCalc.Range2Remove = function(editor) { - - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range2 = editor.range2; - - if (!range2.hasrange) return; - - for (coord in highlights) { - switch (highlights[coord]) { - case "range2": - delete highlights[coord]; - break; - case "range": - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell=SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range2.hasrange = false; - - return; - - } - -// -// FitToEditTable(editor) -// -// Figure out (through column width declarations and approximation of pixels per row) -// how many rendered rows and columns you need to be at least a little larger than -// the editor's editing area. -// - -SocialCalc.FitToEditTable = function(editor) { - - var colnum, colname, colwidth, totalwidth, totalrows, rowpane, needed; - - var context=editor.context; - var sheetobj=context.sheetobj; - var sheetcolattribs=sheetobj.colattribs; - - // Calculate column width data - - totalwidth=context.showRCHeaders ? context.rownamewidth-0 : 0; - for (colpane=0; colpane0)) ? (colwidth-0) : 10; - } - } - - for (colnum=context.colpanes[colpane].first; colnum<=10000; colnum++) { //!!! max for safety, but makes that col max!!! - colname=SocialCalc.rcColname(colnum); - colwidth = sheetobj.colattribs.width[colname] || sheetobj.attribs.defaultcolwidth || SocialCalc.Constants.defaultColWidth; - if (colwidth=="blank" || colwidth=="auto") colwidth=""; - totalwidth+=(colwidth && ((colwidth-0)>0)) ? (colwidth-0) : 10; - if (totalwidth > editor.tablewidth) break; - } - - context.colpanes[colpane].last = colnum; - - // Calculate row height data - - totalrows=context.showRCHeaders ? 1 : 0; - for (rowpane=0; rowpaneeditor.gridposition.top+editor.tableheight) break; - } - editor.lastvisiblerow = i-1; - - editor.colpositions = []; - for (colpane=0; colpaneeditor.gridposition.left+editor.tablewidth) break; - } - editor.lastvisiblecol = i-1; - - editor.firstscrollingrow = editor.context.rowpanes[editor.context.rowpanes.length-1].first; - editor.firstscrollingrowtop = editor.rowpositions[editor.firstscrollingrow] || editor.headposition.top; - editor.lastnonscrollingrow = editor.context.rowpanes.length-1 > 0 ? - editor.context.rowpanes[editor.context.rowpanes.length-2].last : 0; - editor.firstscrollingcol = editor.context.colpanes[editor.context.colpanes.length-1].first; - editor.firstscrollingcolleft = editor.colpositions[editor.firstscrollingcol] || editor.headposition.left; - editor.lastnonscrollingcol = editor.context.colpanes.length-1 > 0 ? - editor.context.colpanes[editor.context.colpanes.length-2].last : 0; - - // Now do the table controls - - editor.verticaltablecontrol.ComputeTableControlPositions(); - editor.horizontaltablecontrol.ComputeTableControlPositions(); - } - -// -// ScheduleRender(editor) -// -// Do a series of timeouts to render the sheet, wait for background layout and -// rendering by the browser, and then update editor visuals, sliders, etc. -// - -SocialCalc.ScheduleRender = function(editor) { - - if (editor.timeout) window.clearTimeout(editor.timeout); // in case called more than once, just use latest - - SocialCalc.EditorSheetStatusCallback(null, "schedrender", null, editor); - SocialCalc.EditorStepInfo.editor = editor; - editor.timeout = window.setTimeout(SocialCalc.DoRenderStep, 1); - - } - -// DoRenderStep() -// - -SocialCalc.DoRenderStep = function() { - - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - editor.EditorRenderSheet(); - - SocialCalc.EditorSheetStatusCallback(null, "renderdone", null, editor); - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - - } - -// -// SocialCalc.SchedulePositionCalculations(editor) -// - -SocialCalc.SchedulePositionCalculations = function(editor) { - - SocialCalc.EditorStepInfo.editor = editor; - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - - } - -// DoPositionCalculations(editor) -// -// Update editor visuals, sliders, etc. -// -// Note: Only call this after the DOM objects have been modified and rendered! -// - -SocialCalc.DoPositionCalculations = function() { - - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - var ok = false; - try { - editor.CalculateEditorPositions(); - ok = true; - } catch (e) {} - - if (!ok) { - if (typeof $ != 'undefined') { - $(window).trigger('resize'); - setTimeout( SocialCalc.DoPositionCalculations, 400); - } - return; /* Workaround IE6 partial-initialized-DOM bug */ - } - - editor.verticaltablecontrol.PositionTableControlElements(); - editor.horizontaltablecontrol.PositionTableControlElements(); - - SocialCalc.EditorSheetStatusCallback(null, "doneposcalc", null, editor); - - if (editor.ensureecell && editor.ecell && !editor.deferredCommands.length) { // don't do if deferred cmd to execute - editor.ensureecell = false; - editor.EnsureECellVisible(); // this could cause another redisplay - } - - editor.cellhandles.ShowCellHandles(true); - - -//!!! Need to now check to see if this positioned controls out of the editing area -//!!! (such as when there is a large wrapped cell and it pushes the pane boundary too far down). - - if (SocialCalc.Callbacks.broadcast) SocialCalc.Callbacks.broadcast('ask.ecell'); - } - -SocialCalc.CalculateRowPositions = function(editor, panenum, positions, sizes) { - - var toprow, rowpane, rownum, offset, trowobj, cellposition; - - var context=editor.context; - var sheetobj=context.sheetobj; - - var tbodyobj; - - if (!context.showRCHeaders) throw("Needs showRCHeaders=true"); - - tbodyobj=editor.fullgrid.lastChild; - - // Calculate start of this pane as row in this table: - - toprow = 2; - for (rowpane=0; rowpane1 ? context.rowpanes[vplen-2].last+1 : 1; // don't scroll past here - if (context.rowpanes[vplen-1].first+vamount < vlimit) { // limit amount - vamount = (-context.rowpanes[vplen-1].first) + vlimit; - } - - var hplen=context.colpanes.length; - var hlimit = hplen>1 ? context.colpanes[hplen-2].last+1 : 1; // don't scroll past here - - if (context.colpanes[hplen-1].first+hamount < hlimit) { // limit amount - hamount = (-context.colpanes[hplen-1].first) + hlimit; - } - - if (SocialCalc.IsScrollPossible && !SocialCalc.IsScrollPossible(editor.context.sheetobj.attribs.lastrow, editor.context.sheetobj.attribs.lastcol,context.rowpanes[vplen-1].first, -context.colpanes[hplen-1].first,vamount,hamount)) { - return; - } - - if ((vamount==1 || vamount==-1) && hamount==0) { // special case quick scrolls - if (vamount==1) { - editor.ScrollTableUpOneRow(); - } - else { - editor.ScrollTableDownOneRow(); - } - if (editor.ecell) editor.SetECellHeaders("selected"); - editor.SchedulePositionCalculations(); - return; - } - - - // Do a gross move and render - - if (vamount!=0 || hamount!=0) { - context.rowpanes[vplen-1].first += vamount; - context.rowpanes[vplen-1].last += vamount; - context.colpanes[hplen-1].first += hamount; - context.colpanes[hplen-1].last += hamount; - editor.FitToEditTable(); - editor.ScheduleRender(); - } - - } - - -// PageRelative(editor, vertical, direction) -// -// If vertical true, pages up(direction is -)/down(+), else left(-)/right(+) - -SocialCalc.PageRelative = function(editor, vertical, direction) { - - var context=editor.context; - var panes=vertical ? "rowpanes" : "colpanes"; - var lastpane=context[panes][context[panes].length-1]; - var lastvisible=vertical ? "lastvisiblerow" : "lastvisiblecol"; - var sizearray=vertical ? editor.rowheight : editor.colwidth; - var defaultsize=vertical ? SocialCalc.Constants.defaultAssumedRowHeight : SocialCalc.Constants.defaultColWidth; - var size, newfirst, totalsize, current; - - if (direction > 0) { // down/right - newfirst = editor[lastvisible]; - if (newfirst == lastpane.first) newfirst += 1; // move at least one - } - else { - if (vertical) { // calculate amount to scroll - totalsize = editor.tableheight - (editor.firstscrollingrowtop - editor.gridposition.top); - } - else { - totalsize = editor.tablewidth - (editor.firstscrollingcolleft - editor.gridposition.left); - } - totalsize -= sizearray[editor[lastvisible]] > 0 ? sizearray[editor[lastvisible]] : defaultsize; - - for (newfirst=lastpane.first-1; newfirst>0; newfirst--) { - size = sizearray[newfirst] > 0 ? sizearray[newfirst] : defaultsize; - if (totalsize < size) break; - totalsize -= size; - } - - current = lastpane.first; - if (newfirst >= current) newfirst = current-1; // move at least 1 - if (newfirst < 1) newfirst = 1; - } - - lastpane.first = newfirst; - lastpane.last = newfirst+1; - editor.LimitLastPanes(); - editor.FitToEditTable(); - editor.ScheduleRender(); - - } - -// LimitLastPanes(editor) -// -// Makes sure that the "first" of the last panes isn't before the last of the previous pane -// - -SocialCalc.LimitLastPanes = function(editor) { - - var context=editor.context; - var plen; - - plen = context.rowpanes.length; - if (plen>1 && context.rowpanes[plen-1].first <= context.rowpanes[plen-2].last) - context.rowpanes[plen-1].first = context.rowpanes[plen-2].last+1; - - plen = context.colpanes.length; - if (plen>1 && context.colpanes[plen-1].first <= context.colpanes[plen-2].last) - context.colpanes[plen-1].first = context.colpanes[plen-2].last+1; - - } - -SocialCalc.ScrollTableUpOneRow = function(editor) { - - var toprow, rowpane, rownum, colnum, colpane, cell, oldrownum, maxspan, newbottomrow, newrow, oldchild, bottomrownum; - var rowneedsrefresh={}; - - var context=editor.context; - var sheetobj=context.sheetobj; - var tableobj=editor.fullgrid; - - var tbodyobj; - - tbodyobj=tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane=0; rowpanemaxrowspan) maxrowspan=cell.rowspan; - } - } - - if (maxrowspan>1) { - for (rownum=1; rownum= context.rowpanes[rowpane].last) break; - newrow=context.RenderRow(rownum+oldrownum, rowpane); - oldchild=tbodyobj.childNodes[toprow+rownum-1]; - tbodyobj.replaceChild(newrow,oldchild); - } - } - - // if added a row that includes rowspans from above, update the size of those to include new row - - bottomrownum=context.rowpanes[rowpane].last; - - for (colpane=0; colpane1) rowneedsrefresh[rownum]=true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow=context.RenderRow(rownum, rowpane); - oldchild=tbodyobj.childNodes[(toprow+(rownum-context.rowpanes[rowpane].first))]; - tbodyobj.replaceChild(newrow,oldchild); - } - - return tableobj; - } - -SocialCalc.ScrollTableDownOneRow = function(editor) { - - var toprow, rowpane, rownum, colnum, colpane, cell, newrownum, maxspan, newbottomrow, newrow, oldchild, bottomrownum; - var rowneedsrefresh={}; - - var context=editor.context; - var sheetobj=context.sheetobj; - var tableobj=editor.fullgrid; - - var tbodyobj; - - tbodyobj=tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane=0; rowpanemaxrowspan) maxrowspan=cell.rowspan; - } - } - - if (maxrowspan>1) { - for (rownum=1; rownum context.rowpanes[rowpane].last) break; - newrow=context.RenderRow(rownum+newrownum, rowpane); - oldchild=tbodyobj.childNodes[toprow+rownum]; - tbodyobj.replaceChild(newrow,oldchild); - } - } - - // if last row now includes rowspans or rowspans from above, update the size of those to remove deleted row - - bottomrownum=context.rowpanes[rowpane].last; - - for (colpane=0; colpane1) { - rowneedsrefresh[bottomrownum]=true; // need to update this row - continue; - } - coord=context.cellskip[SocialCalc.crToCoord(colnum, bottomrownum)]; - if (!coord) continue; // only look at spanned cells - rownum=context.coordToCR[coord].row-0; - if (rownum==bottomrownum || - rownum1) rowneedsrefresh[rownum]=true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow=context.RenderRow(rownum, rowpane); - oldchild=tbodyobj.childNodes[(toprow+(rownum-context.rowpanes[rowpane].first))]; - tbodyobj.replaceChild(newrow,oldchild); - } - - return tableobj; - } - - -// ************************************* -// -// InputBox class: -// -// This class deals with the text box for editing cell contents. -// It mainly controls a user input box for typed content and is used to interact with -// the keyboard code, etc. -// -// You can use this inside a formula bar control of some sort. -// You create this after you have created a table editor object (but not necessarily -// done the CreateTableEditor method). -// -// When the user starts typing text, or double-clicks on a cell, this object -// comes into play. -// -// The element given when this is first constructed should be an input HTMLElement or -// something that acts like one. Check the code here to see what is done to it. -// -// ************************************* - -SocialCalc.InputBox = function(element, editor) { - - if (!element) return; // invoked without enough data to work - - this.element = element; // the input element associated with this InputBox - this.editor = editor; // the TableEditor this belongs to - this.inputEcho = null; - - editor.inputBox = this; - - element.onmousedown = SocialCalc.InputBoxOnMouseDown; - - editor.MoveECellCallback.formulabar = function(e){ - if (e.state!="start") { return; }// if not in normal keyboard mode don't replace formula bar - editor.inputBox.DisplayCellContents(e.ecell.coord); - }; - } - - -// Methods: - -SocialCalc.InputBox.prototype.DisplayCellContents = function(coord) {SocialCalc.InputBoxDisplayCellContents(this, coord);}; -SocialCalc.InputBox.prototype.ShowInputBox = function(show) {this.editor.inputEcho.ShowInputEcho(show);}; -SocialCalc.InputBox.prototype.GetText = function() {return this.element.value;}; -SocialCalc.InputBox.prototype.SetText = function(newtext) { - if (!this.element) return; - this.element.value=newtext; - - if (!SocialCalc.Constants.SCNoInputEcho) { - this.editor.inputEcho.SetText(newtext+"_"); - } - -}; -SocialCalc.InputBox.prototype.Focus = function() {SocialCalc.InputBoxFocus(this);}; -SocialCalc.InputBox.prototype.Blur = function() {return this.element.blur();}; -SocialCalc.InputBox.prototype.Select = function(t) { - if (!this.element) return; - switch (t) { - case "end": - if (document.selection && document.selection.createRange) { - /* IE 4+ - Safer than setting .selectionEnd as it also works for Textareas. */ - var range = document.selection.createRange().duplicate(); - range.moveToElementText(this.element); - range.collapse(false); - range.select(); - } else if (this.element.selectionStart!=undefined) { - this.element.selectionStart=this.element.value.length; - this.element.selectionEnd=this.element.value.length; - } - break; - } - }; - -// Functions: - -// -// SocialCalc.InputBoxDisplayCellContents(inputbox, coord) -// -// Sets input box to the contents of the specified cell (or ecell if null). -// - -SocialCalc.InputBoxDisplayCellContents = function(inputbox, coord) { - - var scc = SocialCalc.Constants; - - if (!inputbox) return; - if (!coord) coord = inputbox.editor.ecell.coord; - var text = SocialCalc.GetCellContents(inputbox.editor.context.sheetobj, coord); - if (text.indexOf("\n")!=-1) { - //text = scc.s_inputboxdisplaymultilinetext; - text = scc.s_inputboxdisplaynoteditable; - inputbox.element.disabled = true; - SocialCalc.ToggleInputLineButtons(false); - } - else if (!SocialCalc.Callbacks.IsCellEditable(inputbox.editor)) { - text = scc.s_inputboxdisplaynoteditable; - SocialCalc.ToggleInputLineButtons(false); - inputbox.element.disabled = true; - inputbox.element.style.display = "none"; - - } - else { - - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; -cell=SocialCalc.GetEditorCellElement(inputbox.editor, inputbox.editor.ecell.row, inputbox.editor.ecell.col); - var left = "100px"; - var top = "100px"; - var width = 100; - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - left = (position.left-4)+"px"; - top = (position.top-3)+"px"; - width = cell.element.offsetWidth; - } -var ele = document.getElementById(spreadsheet.formulabarDiv.id); -if (ele) { -spreadsheet.spreadsheetDiv.removeChild(spreadsheet.formulabarDiv); -} -spreadsheet.formulabarDiv.style.left = left; -spreadsheet.formulabarDiv.style.top = top; -//spreadsheet.formulabarDiv.style.width = "30px"; -//spreadsheet.formulabarDiv.style.fontSize = "10px"; -spreadsheet.formulabarDiv.style.zIndex = 100; -spreadsheet.formulabarDiv.style.position = "absolute"; -var input = spreadsheet.formulabarDiv.firstChild; -input.style.fontSize="100%"; -//console.log("cell width ="+width) -input.size = ""+(width/8) - -input.style.borderBottomColor = "#306eff"; -input.style.borderBottomLeftRadius = "3px"; -input.style.borderBottomRightRadius = "3px"; -input.style.borderBottomStyle = "solid"; -input.style.borderBottomWidth = "2px"; -input.style.borderLeftColor = "#306eff"; -input.style.borderLeftStyle = "solid"; -input.style.borderLeftWidth = "2px"; -input.style.borderRightColor = "#306eff"; -input.style.borderRightStyle = "solid"; -input.style.borderRightWidth = "2px"; -input.style.borderTopColor = "#306eff"; -input.style.borderTopLeftRadius = "3px"; -input.style.borderTopRightRadius = "3px"; -input.style.borderTopStyle = "solid"; -input.style.borderTopWidth = "2px"; - - -//console.log("cell width ="+width) -input.size = ""+(width/9) - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - - - inputbox.element.disabled = false; - inputbox.element.style.display = "inline"; - SocialCalc.ToggleInputLineButtons(true); - - } - if (scc.SCNoQuoteInInputBox && (text.substring(0,1) == "'")) { - text = text.substring(1); - } - inputbox.SetText(text); - - } - -// -// SocialCalc.InputBoxFocus(inputbox) -// -// Call this to have the input box get the focus and respond to keystrokes -// but still pass them off to SocialCalc.ProcessKey. -// - -SocialCalc.InputBoxFocus = function(inputbox) { - - if (!inputbox) return; - inputbox.element.focus(); - var editor = inputbox.editor; - editor.state = "input"; - var wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - - }; - -// -// SocialCalc.InputBoxOnMouseDown(e) -// -// This is called when the input box gets the focus. It then responds to keystrokes -// and pass them off to SocialCalc.ProcessKey, but in a different editing state. -// - -SocialCalc.InputBoxOnMouseDown = function(e) { - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var wval = editor.workingvalues; - - switch (editor.state) { - case "start": - editor.state="inputboxdirect"; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.inputEcho.ShowInputEcho(true); - break; - - case "input": - wval.partialexpr = ""; // make sure not pointing - editor.MoveECell(wval.ecoord); - editor.state="inputboxdirect"; - SocialCalc.KeyboardFocus(); // may have come here from outside of grid - break; - - case "inputboxdirect": - break; - } - } - - -// ************************************* -// -// InputEcho class: -// -// This object creates and controls an element that echos what's in the InputBox during editing -// It is draggable. -// -// ************************************* - -SocialCalc.InputEcho = function(editor) { - - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - this.text = ""; // current value of what is displayed - this.interval = null; // timer handle - - this.container = null; // element containing main echo as well as prompt line - this.main = null; // main echo area - this.prompt = null; - - this.functionbox = null; // function chooser dialog - - this.container = document.createElement("div"); - SocialCalc.setStyles(this.container, "display:none;position:absolute;zIndex:10;"); - - this.topprompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) this.topprompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) SocialCalc.setStyles(this.topprompt, scc.defaultInputEchoPromptStyle); - this.topprompt.innerHTML = ""; - - this.container.appendChild(this.topprompt); - - - this.main = document.createElement("div"); - - if (scc.defaultInputEchoClass) this.main.className = scc.defaultInputEchoClass; - if (scc.defaultInputEchoStyle) SocialCalc.setStyles(this.main, scc.defaultInputEchoStyle); - - this.main.innerHTML = " "; - - this.container.appendChild(this.main); - - this.prompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) this.prompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) SocialCalc.setStyles(this.prompt, scc.defaultInputEchoPromptStyle); - this.prompt.innerHTML = ""; - - this.container.appendChild(this.prompt); - - SocialCalc.DragRegister(this.main, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: this.container}); - - editor.toplevel.appendChild(this.container); - - } - -// Methods: - -SocialCalc.InputEcho.prototype.ShowInputEcho = function(show) {return SocialCalc.ShowInputEcho(this, show);}; -SocialCalc.InputEcho.prototype.SetText = function(str) {return SocialCalc.SetInputEchoText(this, str);}; - -// Functions: - -SocialCalc.ShowInputEcho = function(inputecho, show) { - - var cell, position; - var editor = inputecho.editor; - - if (!editor) return; - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - if (show) { - editor.cellhandles.ShowCellHandles(false); - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - inputecho.container.style.left = (position.left-1)+"px"; - inputecho.container.style.top = (position.top-1)+"px"; - } - inputecho.container.style.display = "block"; - if (inputecho.interval) window.clearInterval(inputecho.interval); // just in case - inputecho.interval = window.setInterval(SocialCalc.InputEchoHeartbeat, 50); - - } - else { - if (inputecho.interval) window.clearInterval(inputecho.interval); - inputecho.container.style.display = "none"; - inputecho.topprompt.innerHTML = ""; - - } - -} - -SocialCalc.SetInputEchoText = function(inputecho, str) { - - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - var scc = SocialCalc.Constants; - var fname, fstr; - var newstr = SocialCalc.special_chars(str); - newstr = newstr.replace(/\n/g,"
    "); - - if (inputecho.text != newstr) { - inputecho.main.innerHTML = newstr; - inputecho.text = newstr; - } - - - - var parts = str.match(/.*[\+\-\*\/\&\^\<\>\=\,\(]([A-Za-z][A-ZA-z]\w*?)\([^\)]*$/); - if (str.charAt(0)=="=" && parts) { - fname = parts[1].toUpperCase(); - if (SocialCalc.Formula.FunctionList[fname]) { - SocialCalc.Formula.FillFunctionInfo(); // make sure filled - fstr = SocialCalc.special_chars(fname+"("+SocialCalc.Formula.FunctionArgString(fname)+")"); - } - else { - fstr = scc.ietUnknownFunction+fname; - } - if (inputecho.prompt.innerHTML != fstr) { - inputecho.prompt.innerHTML = fstr; - inputecho.prompt.style.display = "block"; - } - } - else if (inputecho.prompt.style.display != "none") { - inputecho.prompt.innerHTML = ""; - inputecho.prompt.style.display = "none"; - } - - var editor = inputecho.editor; - - - if (editor.workingvalues.currentsheet != - editor.workingvalues.startsheet) { - - var promptstr = "Editing:"+editor.workingvalues.startsheet+"!"+editor.workingvalues.ecoord; - if (promptstr != inputecho.topprompt.innerHTML) { - inputecho.topprompt.innerHTML = "Editing:"+editor.workingvalues.startsheet+"!"+editor.workingvalues.ecoord; - inputecho.topprompt.style.display = "block"; - } - } else { - if (inputecho.topprompt.style.display != "none") { - inputecho.topprompt.innerHTML = ""; - inputecho.topprompt.style.display = "none"; - } - } -} - -SocialCalc.InputEchoHeartbeat = function() { - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - if (editor.state == "inputboxdirect") { - editor.inputEcho.SetText(editor.inputBox.GetText()+"_"); - } - -} - -SocialCalc.InputEchoMouseDown = function(e) { - var event = e || window.event; - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - -// if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 -// else event.cancelBubble = true; // IE 5+ -// if (event.preventDefault) event.preventDefault(); // DOM Level 2 -// else event.returnValue = false; // IE 5+ - - editor.inputBox.element.focus(); - -// return false; - }; - - -// ************************************* -// -// CellHandles class: -// -// This object creates and controls the elements around the cursor cell for dragging, etc. -// -// ************************************* - -SocialCalc.CellHandles = function(editor) { - - var scc = SocialCalc.Constants; - var functions; - - if (editor.noEdit) return; // leave us with nothing - if (scc.SCCellHandlesDisable) return; - - this.editor = editor; // the TableEditor this belongs to - - this.noCursorSuffix = false; - - this.movedmouse = false; // used to detect no-op - - this.draghandle = document.createElement("div"); - SocialCalc.setStyles(this.draghandle, "display:none;position:absolute;zIndex:8;border:1px solid white;width:4px;height:4px;fontSize:1px;backgroundColor:#0E93D8;cursor:default;"); - this.draghandle.innerHTML = ' '; - editor.toplevel.appendChild(this.draghandle); - SocialCalc.AssignID(editor, this.draghandle, "draghandle"); - - var imagetype = "png"; - if (navigator.userAgent.match(/MSIE 6\.0/)) { - imagetype = "gif"; - } - - this.dragpalette = document.createElement("div"); - SocialCalc.setStyles(this.dragpalette, "display:none;position:absolute;zIndex:8;width:90px;height:90px;fontSize:1px;textAlign:center;cursor:default;"+ - "backgroundImage:url("+SocialCalc.Constants.defaultImagePrefix+"drag-handles."+imagetype+");"); - this.dragpalette.innerHTML = ' '; - editor.toplevel.appendChild(this.dragpalette); - SocialCalc.AssignID(editor, this.dragpalette, "dragpalette"); - - this.dragtooltip = document.createElement("div"); - SocialCalc.setStyles(this.dragtooltip, "display:none;position:absolute;zIndex:9;border:1px solid black;width:100px;height:auto;fontSize:10px;backgroundColor:#FFFFFF;"); - this.dragtooltip.innerHTML = ' '; - editor.toplevel.appendChild(this.dragtooltip); - SocialCalc.AssignID(editor, this.dragtooltip, "dragtooltip"); - - this.fillinghandle = document.createElement("div"); - SocialCalc.setStyles(this.fillinghandle, "display:none;position:absolute;zIndex:9;border:1px solid black;width:auto;height:14px;fontSize:10px;backgroundColor:#FFFFFF;"); - this.fillinghandle.innerHTML = ' '; - editor.toplevel.appendChild(this.fillinghandle); - SocialCalc.AssignID(editor, this.fillinghandle, "fillinghandle"); - - if (this.draghandle.addEventListener) { // DOM Level 2 -- Firefox, et al - this.draghandle.addEventListener("mousemove", SocialCalc.CellHandlesMouseMoveOnHandle, false); - this.dragpalette.addEventListener("mousedown", SocialCalc.CellHandlesMouseDown, false); - this.dragpalette.addEventListener("mousemove", SocialCalc.CellHandlesMouseMoveOnHandle, false); - } - else if (this.draghandle.attachEvent) { // IE 5+ - this.draghandle.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMoveOnHandle); - this.dragpalette.attachEvent("onmousedown", SocialCalc.CellHandlesMouseDown); - this.dragpalette.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMoveOnHandle); - } - else { // don't handle this - throw "Browser not supported"; - } - - } - -// Methods: - -SocialCalc.CellHandles.prototype.ShowCellHandles = function(show, moveshow) {return SocialCalc.ShowCellHandles(this, show, moveshow);}; - -// Functions: - -SocialCalc.ShowCellHandles = function(cellhandles, show, moveshow) { - - var cell, cell2, position, position2; - var editor = cellhandles.editor; - var doshow = false; - var row, col, viewport; - - if (!editor) return; - - do { // a block that can you can "break" out of easily - - if (!show) break; - - row = editor.ecell.row; - col = editor.ecell.col; - - if (editor.state != "start") break; - if (row >= editor.lastvisiblerow) break; - if (col >= editor.lastvisiblecol) break; - if (row < editor.firstscrollingrow) break; - if (col < editor.firstscrollingcol) break; - - if (editor.rowpositions[row+1]+20>editor.horizontaltablecontrol.controlborder) { - break; - } - if (editor.rowpositions[row+1]-10editor.verticaltablecontrol.controlborder) { - break; - } - if (editor.colpositions[col+1]-30= left && x < left+width/2 && y >= top && y < top+height/2) { // upper left - if (len <= segtable[0]) v = -1; - else if (len <= segtable[1]) v = 1; - } - if (x >= left+width/2 && x < left+width && y >= top && y < top+height/2) { // upper right - if (len <= segtable[0]) v = -2; - else if (len <= segtable[1]) v = 2; - } - if (x >= left+width/2 && x < left+width && y >= top+height/2 && y < top+height) { // bottom right - if (len <= segtable[0]) v = -3; - else if (len <= segtable[1]) v = 3; - } - if (x >= left && x < left+width/2 && y >= top+height/2 && y < top+height) { // bottom right - if (len <= segtable[0]) v = -4; - else if (len <= segtable[1]) v = 4; - } - return v; - } - - while (true) { - if (x >= left && x < left+width/2 && y >= top && y < top+height/2) { // upper left - quadrant += "1"; - v = table[0]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - height = height/2; - continue; - } - if (x >= left+width/2 && x < left+width && y >= top && y < top+height/2) { // upper right - quadrant += "2"; - v = table[1]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - left = left+width; - height = height/2; - continue; - } - if (x >= left+width/2 && x < left+width && y >= top+height/2 && y < top+height) { // bottom right - quadrant += "3"; - v = table[2]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - left = left + width; - height = height/2; - top = top + height; - continue; - } - if (x >= left && x < left+width/2 && y >= top+height/2 && y < top+height) { // bottom right - quadrant += "4"; - v = table[3]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - height = height/2; - top = top + height; - continue; - } - return 0; // didn't match - } - -//addmsg((x-divWithMouseHit.offsetLeft)+","+(y-divWithMouseHit.offsetTop)+"="+quadrant+" "+v); - return v; - -} - -SocialCalc.CellHandlesHoverTimeout = function() { - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.timer) { - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - editor.cellhandles.ShowCellHandles(true, false); // hide move handles - -} - -SocialCalc.CellHandlesTooltipsTimeout = function() { - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - - var whichhandle = cellhandles.tooltipswhichhandle; - if (whichhandle==0) { // off of active part of palette - SocialCalc.CellHandlesHoverTimeout(); - return; - } - if (whichhandle==-3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillAllTooltip; - } - else if (whichhandle==3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillContentsTooltip; - } - else if (whichhandle==-2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteAllTooltip; - } - else if (whichhandle==-4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertAllTooltip; - } - else if (whichhandle==2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteContentsTooltip; - } - else if (whichhandle==4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertContentsTooltip; - } - else { - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - return; - } - - cellhandles.dragtooltip.style.display = "block"; - -} - -SocialCalc.CellHandlesMouseDown = function(e) { - - var scc = SocialCalc.Constants; - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (editor.busy) return; // don't do anything when busy (is this correct?) - - var cellhandles = editor.cellhandles; - - cellhandles.movedmouse = false; // detect no-op - - if (cellhandles.timer) { // cancel timer - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - - range = editor.range; - - var whichhandle = SocialCalc.SegmentDivHit([scc.CH_radius1, scc.CH_radius2], editor.cellhandles.dragpalette, clientX, clientY); - if (whichhandle==1 || whichhandle==-1 || whichhandle==0) { - cellhandles.ShowCellHandles(true, false); // hide move handles - return; - } - - mouseinfo.ignore = true; // stop other code from looking at the mouse - - if (whichhandle==-3) { - cellhandles.dragtype = "Fill"; -// mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==3) { - cellhandles.dragtype = "FillC"; -// mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==-2) { - cellhandles.dragtype = "Move"; -// mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } - else if (whichhandle==-4) { - cellhandles.dragtype = "MoveI"; -// mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==2) { - cellhandles.dragtype = "MoveC"; -// mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } - else if (whichhandle==4) { - cellhandles.dragtype = "MoveIC"; -// mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } - - cellhandles.filltype = null; - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - break; - - case "Move": - case "MoveI": - case "MoveC": - case "MoveIC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.RangeRemove(); - break; - - default: - return; // not for us - } - - cellhandles.fillinghandle.style.left = (clientX)+"px"; - cellhandles.fillinghandle.style.top = (clientY - 17)+"px"; - cellhandles.fillinghandle.innerHTML = scc.s_CHindicatorOperationLookup[cellhandles.dragtype]+ - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - cellhandles.ShowCellHandles(true, false); // hide move handles - cellhandles.mouseDown = true; - - mouseinfo.editor = editor; // remember for later - - coord = editor.ecell.coord; // start with cell with handles - - cellhandles.startingcoord = coord; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - - mouseinfo.mouselastcoord = coord; - - SocialCalc.KeyboardSetFocus(editor); - - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mousemove", SocialCalc.CellHandlesMouseMove, true); // capture everywhere - document.addEventListener("mouseup", SocialCalc.CellHandlesMouseUp, true); // capture everywhere - } - else if (cellhandles.draghandle.attachEvent) { // IE 5+ - cellhandles.draghandle.setCapture(); - cellhandles.draghandle.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMove); - cellhandles.draghandle.attachEvent("onmouseup", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.attachEvent("onlosecapture", SocialCalc.CellHandlesMouseUp); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - -SocialCalc.CellHandlesMouseMove = function(e) { - - var scc = SocialCalc.Constants; - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - var crstart, crend, cr, c, r; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat(editor, result, SocialCalc.CellHandlesDragAutoRepeat); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - - - cellhandles.movedmouse = true; // did move, so not no-op - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - - if (result.coord == cellhandles.startingcoord) { // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } - else { - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Down") { // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } - else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } - else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Down"; - } - else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Right"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - c = editor.range2.right - editor.range2.left + result.col; - r = editor.range2.bottom - editor.range2.top + result.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (result.coord == cellhandles.startingcoord) { // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } - else { - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Vertical") { // coerse to that - crend.col = editor.range2.left; - if (crend.row>=editor.range2.top && crend.row<=editor.range2.bottom+1) crend.row = editor.range2.bottom+2; - } - else { - crend.row = editor.range2.top; - if (crend.col>=editor.range2.left && crend.col<=editor.range2.right+1) crend.col = editor.range2.right+2; - } - } - else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Vertical"; - } - else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Horizontal"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - if (!cellhandles.filltype) { // no fill type - editor.RangeRemove(); - } - else { - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - } - break; - - } - - - cellhandles.fillinghandle.style.left = (clientX)+"px"; - cellhandles.fillinghandle.style.top = (clientY - 17)+"px"; - cellhandles.fillinghandle.innerHTML = scc.s_CHindicatorOperationLookup[cellhandles.dragtype]+ - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - mouseinfo.mouselastcoord = result.coord; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - -SocialCalc.CellHandlesDragAutoRepeat = function(coord, direction) { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - var crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - var crend = SocialCalc.coordToCr(coord); - - var newcoord, c, r; - - var vscroll = 0; - var hscroll = 0; - - if (direction == "left") hscroll = -1; - else if (direction == "right") hscroll = 1; - else if (direction == "up") vscroll = -1; - else if (direction == "down") vscroll = 1; - editor.ScrollRelativeBoth(vscroll, hscroll); - - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Down") { // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } - else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } - else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord!=mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - c = editor.range2.right - editor.range2.left + editor.ecell.col; - r = editor.range2.bottom - editor.range2.top + editor.ecell.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Vertical") { // coerse to that - crend.col = editor.range2.left; - if (crend.row>=editor.range2.top && crend.row<=editor.range2.bottom+1) crend.row = editor.range2.bottom+2; - } - else { - crend.row = editor.range2.top; - if (crend.col>=editor.range2.left && crend.col<=editor.range2.right+1) crend.col = editor.range2.right+2; - } - } - else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord!=mouseinfo.mouselastcoord) { - editor.MoveECell(newcoord); - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - } - - mouseinfo.mouselastcoord = newcoord; - - } - -SocialCalc.CellHandlesMouseUp = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval, cstr, cmdtype, cmdtype2; - var crstart, crend; - var sizec, sizer, deltac, deltar; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - mouseinfo.ignore = false; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - cellhandles.mouseDown = false; - cellhandles.noCursorSuffix = false; - - cellhandles.fillinghandle.style.display = "none"; - - if (!result) result = {}; - if (!result.coord) result.coord = editor.ecell.coord; - - switch (cellhandles.dragtype) { - case "Fill": - case "Move": - case "MoveI": - cmdtype2 = " all"; - break; - case "FillC": - case "MoveC": - case "MoveIC": - cmdtype2 = " formulas"; - break; - } - - if (!cellhandles.movedmouse) { // didn't move: just leave one cell selected - cellhandles.dragtype = "Nothing"; - } - - switch (cellhandles.dragtype) { - case "Nothing": - editor.Range2Remove(); - editor.RangeRemove(); - break; - - case "Fill": - case "FillC": - - crstart = SocialCalc.coordToCr(cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - if (cellhandles.filltype) { - if (cellhandles.filltype=="Down") { - crend.col = crstart.col; - } - else { - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - - editor.MoveECell(result.coord); - editor.RangeExtend(); - - if (editor.cellhandles.filltype=="Right") { - cmdtype = "right"; - } - else { - cmdtype = "down"; - } - cstr = "fill"+cmdtype+" "+SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom)+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - break; - - case "Move": - case "MoveC": - editor.context.cursorsuffix = ""; - cstr = "movepaste "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - - break; - - case "MoveI": - case "MoveIC": - editor.context.cursorsuffix = ""; - sizec = editor.range2.right - editor.range2.left; - sizer = editor.range2.bottom - editor.range2.top; - deltac = editor.ecell.col - editor.range2.left; - deltar = editor.ecell.row - editor.range2.top; - cstr = "moveinsert "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - editor.RangeRemove(); - if (editor.cellhandles.filltype==" Horizontal" && deltac > 0) { - editor.MoveECell(SocialCalc.crToCoord(editor.ecell.col-sizec-1, editor.ecell.row)); - } - else if (editor.cellhandles.filltype==" Vertical" && deltar > 0) { - editor.MoveECell(SocialCalc.crToCoord(editor.ecell.col, editor.ecell.row-sizer-1)); - } - editor.RangeAnchor(SocialCalc.crToCoord(editor.ecell.col+sizec, editor.ecell.row+sizer)); - editor.RangeExtend(); - - break; - - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.CellHandlesMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.CellHandlesMouseUp, true); - } - else if (cellhandles.draghandle.detachEvent) { // IE - cellhandles.draghandle.detachEvent("onlosecapture", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.detachEvent("onmouseup", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.detachEvent("onmousemove", SocialCalc.CellHandlesMouseMove); - cellhandles.draghandle.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - - } - -// ************************************* -// -// TableControl class: -// -// This class deals with the horizontal and verical scrollbars and pane sliders. -// -// +--------------+ -// | Endcap | -// +- - - - - - - + -// | | -// +--------------+ -// | Pane Slider | -// +--------------+ -// | | -// | Less Button | -// | | -// +--------------+ -// | Scroll Area | -// | | -// | | -// +--------------+ -// | Thumb | -// +--------------+ -// | | -// +--------------+ -// | | -// | More Button | -// | | -// +--------------+ -// -// ************************************* - -SocialCalc.TableControl = function(editor, vertical, size) { - - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - - this.vertical = vertical; // true if vertical control, false if horizontal - this.size = size; // length in pixels - - this.main = null; // main element containing all the others - this.endcap = null; // the area at the top/left between the end and the pane slider - this.paneslider = null; // the slider to adjust the pane split - this.lessbutton = null; // the top/left scroll button - this.morebutton = null; // the bottom/right scroll button - this.scrollarea = null; // the area between the scroll buttons - this.thumb = null; // the sliding thing in the scrollarea - - // computed position values: - - this.controlborder = null; // left or top screen position for vertical or horizontal control - this.endcapstart = null; // top or left screen position for vertical or horizontal control - this.panesliderstart = null; - this.lessbuttonstart = null; - this.morebuttonstart = null; - this.scrollareastart = null; - this.scrollareaend = null; - this.scrollareasize = null; - this.thumbpos = null; - - // constants: - - this.controlthickness = scc.defaultTableControlThickness; // other dimension of complete control in pixels - this.sliderthickness = scc.defaultTCSliderThickness; - this.buttonthickness = scc.defaultTCButtonThickness; - this.thumbthickness = scc.defaultTCThumbThickness; - this.minscrollingpanesize = this.buttonthickness+this.buttonthickness+this.thumbthickness+20; // the 20 is to leave a little space - - } - -// Methods: - -SocialCalc.TableControl.prototype.CreateTableControl = function() {return SocialCalc.CreateTableControl(this);}; -SocialCalc.TableControl.prototype.PositionTableControlElements = function() {SocialCalc.PositionTableControlElements(this);}; -SocialCalc.TableControl.prototype.ComputeTableControlPositions = function() {SocialCalc.ComputeTableControlPositions(this);}; - -// Functions: - -SocialCalc.CreateTableControl = function(control) { - - var s, functions, params; - var AssignID = SocialCalc.AssignID; - var setStyles = SocialCalc.setStyles; - var scc = SocialCalc.Constants; - var TooltipRegister = function(element, etype, vh) { - if (scc["s_"+etype+"Tooltip"+vh]) { - SocialCalc.TooltipRegister(element, scc["s_"+etype+"Tooltip"+vh], null); - } - } - - var imageprefix = control.editor.imageprefix; - var vh = control.vertical ? "v" : "h"; - - control.main = document.createElement("div"); - s = control.main.style; - s.height = (control.vertical ? control.size : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.size)+"px"; - s.zIndex = 0; - setStyles(control.main, scc.TCmainStyle); - s.backgroundImage="url("+imageprefix+"main-"+vh+".gif)"; - if (scc.TCmainClass) control.main.className = scc.TCmainClass; - - control.main.style.display="none"; // wait for layout - - control.endcap = document.createElement("div"); - s = control.endcap.style; - s.height = control.controlthickness+"px"; - s.width = control.controlthickness+"px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.endcap, scc.TCendcapStyle); - s.backgroundImage="url("+imageprefix+"endcap-"+vh+".gif)"; - if (scc.TCendcapClass) control.endcap.className = scc.TCendcapClass; - AssignID(control.editor, control.endcap, "endcap"+vh); - - control.main.appendChild(control.endcap); - - control.paneslider = document.createElement("div"); - s = control.paneslider.style; - s.height = (control.vertical ? control.sliderthickness : control.controlthickness)+"px"; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.width = (control.vertical ? control.controlthickness : control.sliderthickness)+"px"; - s.position = "absolute"; - s[control.vertical?"top":"left"] = "4px"; - s.zIndex = 3; - setStyles(control.paneslider, scc.TCpanesliderStyle); - s.backgroundImage="url("+imageprefix+"paneslider-"+vh+".gif)"; - if (scc.TCpanesliderClass) control.paneslider.className = scc.TCpanesliderClass; - AssignID(control.editor, control.paneslider, "paneslider"+vh); - TooltipRegister(control.paneslider, "paneslider", vh); - - functions = {MouseDown:SocialCalc.TCPSDragFunctionStart, - MouseMove: SocialCalc.TCPSDragFunctionMove, - MouseUp: SocialCalc.TCPSDragFunctionStop, - Disabled: function() {return control.editor.busy;}}; - - functions.control = control; // make sure this is there - - SocialCalc.DragRegister(control.paneslider, control.vertical, !control.vertical, functions); - - control.main.appendChild(control.paneslider); - - control.lessbutton = document.createElement("div"); - s = control.lessbutton.style; - s.height = (control.vertical ? control.buttonthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.buttonthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.lessbutton, scc.TClessbuttonStyle); - s.backgroundImage="url("+imageprefix+"less-"+vh+"n.gif)" - if (scc.TClessbuttonClass) control.lessbutton.className = scc.TClessbuttonClass; - AssignID(control.editor, control.lessbutton, "lessbutton"+vh); - - params = {repeatwait:scc.TClessbuttonRepeatWait, repeatinterval:scc.TClessbuttonRepeatInterval, - normalstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"n.gif);", - downstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"d.gif);", - hoverstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"h.gif);"}; - functions = {MouseDown:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, -1);}, - Repeat:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, -1);}, - Disabled: function() {return control.editor.busy;}}; - - SocialCalc.ButtonRegister(control.lessbutton, params, functions); - - control.main.appendChild(control.lessbutton); - - control.morebutton = document.createElement("div"); - s = control.morebutton.style; - s.height = (control.vertical ? control.buttonthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.buttonthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.morebutton, scc.TCmorebuttonStyle); - s.backgroundImage="url("+imageprefix+"more-"+vh+"n.gif)" - if (scc.TCmorebuttonClass) control.morebutton.className = scc.TCmorebuttonClass; - AssignID(control.editor, control.morebutton, "morebutton"+vh); - - params = {repeatwait:scc.TCmorebuttonRepeatWait, repeatinterval:scc.TCmorebuttonRepeatInterval, - normalstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"n.gif);", - downstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"d.gif);", - hoverstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"h.gif);"}; - functions = {MouseDown:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, +1);}, - Repeat:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, +1);}, - Disabled: function() {return control.editor.busy;}}; - - SocialCalc.ButtonRegister(control.morebutton, params, functions); - - control.main.appendChild(control.morebutton); - - control.scrollarea = document.createElement("div"); - s = control.scrollarea.style; - s.height = control.controlthickness+"px"; - s.width = control.controlthickness+"px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.scrollarea, scc.TCscrollareaStyle); - s.backgroundImage="url("+imageprefix+"scrollarea-"+vh+".gif)"; - if (scc.TCscrollareaClass) control.scrollarea.className = scc.TCscrollareaClass; - AssignID(control.editor, control.scrollarea, "scrollarea"+vh); - - params = {repeatwait:scc.TCscrollareaRepeatWait, repeatinterval:scc.TCscrollareaRepeatWait}; - functions = {MouseDown:SocialCalc.ScrollAreaClick, Repeat:SocialCalc.ScrollAreaClick, - Disabled: function() {return control.editor.busy;}}; - functions.control = control; - - SocialCalc.ButtonRegister(control.scrollarea, params, functions); - - control.main.appendChild(control.scrollarea); - - control.thumb = document.createElement("div"); - s = control.thumb.style; - s.height = (control.vertical ? control.thumbthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.thumbthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.thumb, scc.TCthumbStyle); - control.thumb.style.backgroundImage="url("+imageprefix+"thumb-"+vh+"n.gif)"; - if (scc.TCthumbClass) control.thumb.className = scc.TCthumbClass; - AssignID(control.editor, control.thumb, "thumb"+vh); - - functions = {MouseDown:SocialCalc.TCTDragFunctionStart, - MouseMove: SocialCalc.TCTDragFunctionMove, - MouseUp: SocialCalc.TCTDragFunctionStop, - Disabled: function() {return control.editor.busy;}}; - functions.control = control; // make sure this is there - SocialCalc.DragRegister(control.thumb, control.vertical, !control.vertical, functions); - - params = {normalstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"n.gif)", name:"Thumb", - downstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"d.gif)", - hoverstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"h.gif)"}; - SocialCalc.ButtonRegister(control.thumb, params, null); // give it button-like visual behavior - - control.main.appendChild(control.thumb); - - return control.main; - -} - -// -// ScrollAreaClick - Button function to process pageup/down clicks -// - -SocialCalc.ScrollAreaClick = function(e, buttoninfo, bobj) { - - var control = bobj.functionobj.control; - var bposition = SocialCalc.GetElementPosition(bobj.element); - var clickpos = control.vertical ? buttoninfo.clientY : buttoninfo.clientX; - if (control.editor.busy) { // ignore if busy - wait for next repeat - return; - } - control.editor.PageRelative(control.vertical, clickpos > control.thumbpos ? 1 : -1); - - return; - -} - -// -// PositionTableControlElements -// - -SocialCalc.PositionTableControlElements = function(control) { - - var border, realend, thumbpos; - - var editor = control.editor; - - if (control.vertical) { - border = control.controlborder+"px"; - control.endcap.style.top = control.endcapstart+"px"; - control.endcap.style.left = border; - control.paneslider.style.top = control.panesliderstart+"px"; - control.paneslider.style.left = border - control.lessbutton.style.top = control.lessbuttonstart+"px"; - control.lessbutton.style.left = border; - control.morebutton.style.top = control.morebuttonstart+"px"; - control.morebutton.style.left = border; - control.scrollarea.style.top = control.scrollareastart+"px"; - control.scrollarea.style.left = border; - control.scrollarea.style.height = control.scrollareasize+"px"; - realend = Math.max(editor.context.sheetobj.attribs.lastrow, editor.firstscrollingrow+1); - thumbpos = ((editor.firstscrollingrow-(editor.lastnonscrollingrow+1))*(control.scrollareasize-3*control.thumbthickness))/ - (realend-(editor.lastnonscrollingrow+1))+control.scrollareastart-1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.top = thumbpos+"px"; - control.thumb.style.left = border; - } - else { - border = control.controlborder+"px"; - control.endcap.style.left = control.endcapstart+"px"; - control.endcap.style.top = border; - control.paneslider.style.left = control.panesliderstart+"px"; - control.paneslider.style.top = border - control.lessbutton.style.left = control.lessbuttonstart+"px"; - control.lessbutton.style.top = border; - control.morebutton.style.left = control.morebuttonstart+"px"; - control.morebutton.style.top = border; - control.scrollarea.style.left = control.scrollareastart+"px"; - control.scrollarea.style.top = border; - control.scrollarea.style.width = control.scrollareasize+"px"; - realend = Math.max(editor.context.sheetobj.attribs.lastcol, editor.firstscrollingcol+1); - thumbpos = ((editor.firstscrollingcol-(editor.lastnonscrollingcol+1))*(control.scrollareasize-control.thumbthickness))/ - (realend-editor.lastnonscrollingcol)+control.scrollareastart-1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.left = thumbpos+"px"; - control.thumb.style.top = border; - } - control.thumbpos = thumbpos; - control.main.style.display="block"; - - } - -// -// ComputeTableControlPositions -// -// This routine computes the screen positions and other values needed for laying out -// the table control elements. -// - -SocialCalc.ComputeTableControlPositions = function(control) { - - var editor = control.editor; - - if (!editor.gridposition || !editor.headposition) throw("Can't compute table control positions before editor positions"); - - if (control.vertical) { - control.controlborder = editor.gridposition.left+editor.tablewidth; // border=left position - control.endcapstart = editor.gridposition.top; // start=top position - control.panesliderstart = editor.firstscrollingrowtop-control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingrowtop-1; - control.morebuttonstart = editor.gridposition.top+editor.tableheight-control.buttonthickness; - control.scrollareastart = editor.firstscrollingrowtop-1+control.buttonthickness; - control.scrollareaend = control.morebuttonstart-1; - control.scrollareasize = control.scrollareaend-control.scrollareastart+1; - } - else { - control.controlborder = editor.gridposition.top+editor.tableheight; // border=top position - control.endcapstart = editor.gridposition.left; // start=left position - control.panesliderstart = editor.firstscrollingcolleft-control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingcolleft-1; - control.morebuttonstart = editor.gridposition.left+editor.tablewidth-control.buttonthickness; - control.scrollareastart = editor.firstscrollingcolleft-1+control.buttonthickness; - control.scrollareaend = control.morebuttonstart-1; - control.scrollareasize = control.scrollareaend-control.scrollareastart+1; - } - } - -////// TCPS - TableControl Pan Slider methods - -// -// TCPSDragFunctionStart(event, draginfo, dobj) -// -// TableControlPaneSlider function for starting drag -// - -SocialCalc.TCPSDragFunctionStart = function(event, draginfo, dobj) { - - var editor = dobj.functionobj.control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - draginfo.trackingline = document.createElement("div"); - draginfo.trackingline.style.height = dobj.vertical ? scc.TCPStrackinglineThickness : - (editor.tableheight-(editor.headposition.top-editor.gridposition.top))+"px"; - draginfo.trackingline.style.width = dobj.vertical ? - (editor.tablewidth-(editor.headposition.left-editor.gridposition.left))+"px" : scc.TCPStrackinglineThickness; - draginfo.trackingline.style.backgroundImage="url("+editor.imageprefix+"trackingline-"+(dobj.vertical?"v":"h")+".gif)";; - if (scc.TCPStrackinglineClass) draginfo.trackingline.className = scc.TCPStrackinglineClass; - SocialCalc.setStyles(draginfo.trackingline, scc.TCPStrackinglineStyle); - - if (dobj.vertical) { - row = SocialCalc.Lookup(draginfo.clientY+dobj.functionobj.control.sliderthickness, editor.rowpositions); - draginfo.trackingline.style.top = (editor.rowpositions[row] || editor.headposition.top)+"px"; - draginfo.trackingline.style.left = editor.headposition.left+"px"; - if (editor.context.rowpanes.length-1) { // has 2 already - editor.context.SetRowPaneFirstLast(1, editor.context.rowpanes[0].last+1, editor.context.rowpanes[0].last+1); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } - else { - col = SocialCalc.Lookup(draginfo.clientX+dobj.functionobj.control.sliderthickness, editor.colpositions); - draginfo.trackingline.style.top = editor.headposition.top+"px"; - draginfo.trackingline.style.left = (editor.colpositions[col] || editor.headposition.left)+"px"; - if (editor.context.colpanes.length-1) { // has 2 already - editor.context.SetColPaneFirstLast(1, editor.context.colpanes[0].last+1, editor.context.colpanes[0].last+1); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } - - editor.griddiv.appendChild(draginfo.trackingline); - - } - -// -// TCPSDragFunctionMove(event, draginfo, dobj) -// - -SocialCalc.TCPSDragFunctionMove = function(event, draginfo, dobj) { - - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup(draginfo.clientY+sliderthickness, editor.rowpositions); - draginfo.trackingline.style.top = (editor.rowpositions[row] || editor.headposition.top)+"px"; - } - else { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup(draginfo.clientX+sliderthickness, editor.colpositions); - draginfo.trackingline.style.left = (editor.colpositions[col] || editor.headposition.left)+"px"; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - - } - -// -// TCPSDragFunctionStop(event, draginfo, dobj) -// - -SocialCalc.TCPSDragFunctionStop = function(event, draginfo, dobj) { - - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup(draginfo.clientY+sliderthickness, editor.rowpositions); - if (row>editor.context.sheetobj.attribs.lastrow) row=editor.context.sheetobj.attribs.lastrow; // can't extend sheet here - if (!row || row<=editor.context.rowpanes[0].first) { // set to no panes, leaving first pane settings - if (editor.context.rowpanes.length>1) editor.context.rowpanes.length = 1; - } - else if (editor.context.rowpanes.length-1) { // has 2 already - if (!editor.timeout) { // not waiting for position calc (so positions could be wrong) - editor.context.SetRowPaneFirstLast(0, editor.context.rowpanes[0].first, row-1); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } - else { - editor.context.SetRowPaneFirstLast(0, editor.context.rowpanes[0].first, row-1); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } - else { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup(draginfo.clientX+sliderthickness, editor.colpositions); - if (col>editor.context.sheetobj.attribs.lastcol) col=editor.context.sheetobj.attribs.lastcol; // can't extend sheet here - if (!col || col<=editor.context.colpanes[0].first) { // set to no panes, leaving first pane settings - if (editor.context.colpanes.length>1) editor.context.colpanes.length = 1; - } - else if (editor.context.colpanes.length-1) { // has 2 already - if (!editor.timeout) { // not waiting for position calc (so positions could be wrong) - editor.context.SetColPaneFirstLast(0, editor.context.colpanes[0].first, col-1); - editor.context.SetColPaneFirstLast(1, col, col); - } - } - else { - editor.context.SetColPaneFirstLast(0, editor.context.colpanes[0].first, col-1); - editor.context.SetColPaneFirstLast(1, col, col); - } - } - - editor.FitToEditTable(); - - editor.griddiv.removeChild(draginfo.trackingline); - - editor.ScheduleRender(); - - } - -////// TCT - TableControl Thumb methods - -//!!!! Note: Need to make start use same code as move/stop for determining row/col, since stop will set that -//!!!! Note: Need to make start/move/stop use positioning code that corresponds closer to -//!!!! ComputeTableControlPositions calculations. - -// -// TCTDragFunctionStart(event, draginfo, dobj) -// -// TableControlThumb function for starting drag -// - -SocialCalc.TCTDragFunctionStart = function(event, draginfo, dobj) { - - var rowpane, colpane, row, col; - - var control = dobj.functionobj.control; - var editor = control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - if (draginfo.thumbstatus) { // get rid of old one if mouseup was out of window - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - } - - draginfo.thumbstatus = document.createElement("div"); - - if (dobj.vertical) { - if (scc.TCTDFSthumbstatusvClass) draginfo.thumbstatus.className = scc.TCTDFSthumbstatusvClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatusvStyle); - draginfo.thumbstatus.style.top = (draginfo.clientY+scc.TCTDFStopOffsetv)+"px"; - draginfo.thumbstatus.style.left = (control.controlborder-10-(editor.tablewidth/2))+"px"; - draginfo.thumbstatus.style.width = (editor.tablewidth/2)+"px"; - - draginfo.thumbcontext = new SocialCalc.RenderContext(editor.context.sheetobj); - draginfo.thumbcontext.showGrid = true; - draginfo.thumbcontext.rowpanes = [{first: 1, last: 1}]; - var pane = editor.context.colpanes[editor.context.colpanes.length-1]; - draginfo.thumbcontext.colpanes = [{first: pane.first, last: pane.last}]; - draginfo.thumbstatus.innerHTML = '
    msg
    preview
    '; - draginfo.thumbstatus.rowmsgele = draginfo.thumbstatus.firstChild.firstChild.firstChild.firstChild.firstChild; - draginfo.thumbstatus.rowpreviewele = draginfo.thumbstatus.firstChild.firstChild.firstChild.childNodes[1].firstChild; - editor.toplevel.appendChild(draginfo.thumbstatus); - SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, editor.firstscrollingrow || 1); - } - else { - if (scc.TCTDFSthumbstatushClass) draginfo.thumbstatus.className = scc.TCTDFSthumbstatushClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatushStyle); - draginfo.thumbstatus.style.top = (control.controlborder+scc.TCTDFStopOffseth)+"px"; - draginfo.thumbstatus.style.left = (draginfo.clientX+scc.TCTDFSleftOffseth)+"px"; - editor.toplevel.appendChild(draginfo.thumbstatus); - draginfo.thumbstatus.innerHTML = scc.s_TCTDFthumbstatusPrefixh+SocialCalc.rcColname(editor.firstscrollingcol); - } - - } - - -// -// SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, row) -// -// Render partial row -// - -SocialCalc.TCTDragFunctionRowSetStatus = function(draginfo, editor, row) { - - var scc = SocialCalc.Constants; - var msg = scc.s_TCTDFthumbstatusPrefixv+row+" "; - - draginfo.thumbstatus.rowmsgele.innerHTML = msg; - - draginfo.thumbcontext.rowpanes = [{first: row, last: row}]; - draginfo.thumbrowshown = row; - - var ele = draginfo.thumbcontext.RenderSheet(draginfo.thumbstatus.rowpreviewele.firstChild, {type: "html"}); - - } - - -// -// TCTDragFunctionMove(event, draginfo, dobj) -// - -SocialCalc.TCTDragFunctionMove = function(event, draginfo, dobj) { - - var first, msg; - var control = dobj.functionobj.control; - var thumbthickness = control.thumbthickness; - var editor = control.editor; - var scc = SocialCalc.Constants; - - if (dobj.vertical) { - if (draginfo.clientY > control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2) - draginfo.clientY = control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2; - if (draginfo.clientY < control.scrollareastart - draginfo.offsetY - 1) - draginfo.clientY = control.scrollareastart - draginfo.offsetY - 1; - draginfo.thumbstatus.style.top = draginfo.clientY+"px"; - - first = - ((draginfo.clientY+draginfo.offsetY-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastrow-editor.lastnonscrollingrow) - + editor.lastnonscrollingrow + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) first = editor.context.sheetobj.attribs.lastrow; -// msg = scc.s_TCTDFthumbstatusPrefixv+first; - if (first != draginfo.thumbrowshown) { - SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, first); - } - } - else { - if (draginfo.clientX > control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2) - draginfo.clientX = control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2; - if (draginfo.clientX < control.scrollareastart - draginfo.offsetX - 1) - draginfo.clientX = control.scrollareastart - draginfo.offsetX - 1; - draginfo.thumbstatus.style.left = draginfo.clientX+"px"; - - first = - ((draginfo.clientX+draginfo.offsetX-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastcol-editor.lastnonscrollingcol) - + editor.lastnonscrollingcol + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) first = editor.context.sheetobj.attribs.lastcol; - msg = scc.s_TCTDFthumbstatusPrefixh+SocialCalc.rcColname(first); - draginfo.thumbstatus.innerHTML = msg; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - - } - -// -// TCTDragFunctionStop(event, draginfo, dobj) -// - -SocialCalc.TCTDragFunctionStop = function(event, draginfo, dobj) { - - var first; - var control = dobj.functionobj.control; - var editor = control.editor; - - if (dobj.vertical) { - first = - ((draginfo.clientY+draginfo.offsetY-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastrow-editor.lastnonscrollingrow) - + editor.lastnonscrollingrow + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) first = editor.context.sheetobj.attribs.lastrow; - - editor.context.SetRowPaneFirstLast(editor.context.rowpanes.length-1, first, first+1); - } - else { - first = - ((draginfo.clientX+draginfo.offsetX-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastcol-editor.lastnonscrollingcol) - + editor.lastnonscrollingcol + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) first = editor.context.sheetobj.attribs.lastcol; - - editor.context.SetColPaneFirstLast(editor.context.colpanes.length-1, first, first+1); - } - - editor.FitToEditTable(); - - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - - editor.ScheduleRender(); - - } - -// ************************************* -// -// Dragging functions: -// -// ************************************* - -SocialCalc.DragInfo = { - - // There is only one of these -- no "new" is done. - // Only one dragging operation can be active at a time. - // The registeredElements array is used to decide which item to drag. - - // One item for each draggable thing, each an object with: - // .element, .vertical, .horizontal, .functionobj - - registeredElements: [], - - // Items used during a drag - - draggingElement: null, // item being processed (.element is the actual element) - startX: 0, - startY: 0, - startZ: 0, - clientX: 0, // modifyable version to restrict movement - clientY: 0, - offsetX: 0, - offsetY: 0, - horizontalScroll: 0, // retrieved at drag start - verticalScroll: 0 - - } - -// -// DragRegister(element, vertical, horizontal, functionobj) - make element draggable -// -// The functionobj defaults to moving the element contrained only by vertical and horizontal settings. -// - -SocialCalc.DragRegister = function(element, vertical, horizontal, functionobj) { - - var draginfo = SocialCalc.DragInfo; - - if (!functionobj) { - functionobj = {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null}; - } - - draginfo.registeredElements.push( - {element: element, vertical: vertical, horizontal: horizontal, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.DragMouseDown, false); - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousedown", SocialCalc.DragMouseDown); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - } - -// -// DragUnregister(element) - remove object from list -// - -SocialCalc.DragUnregister = function(element) { - - var draginfo = SocialCalc.DragInfo; - - var i; - - if (!element) return; - - for (i=0; i tooltipinfo.viewport.width/2) { // on right side of screen - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY)+"px"; - tooltipinfo.popupElement.style.right = (tooltipinfo.viewport.width - tooltipinfo.clientX + offsetX)+"px"; - } - else { // on left side of screen - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY)+"px"; - tooltipinfo.popupElement.style.left = (tooltipinfo.clientX + offsetX)+"px"; - } - - if (tooltipinfo.clientY < 50) { // make sure fits on screen if nothing above grid - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY - 50)+"px"; - } - - document.body.appendChild(tooltipinfo.popupElement); - - } - -// -// TooltipHide() -// - -SocialCalc.TooltipHide = function() { - - var tooltipinfo = SocialCalc.TooltipInfo; - - if (tooltipinfo.popupElement) { - tooltipinfo.popupElement.parentNode.removeChild(tooltipinfo.popupElement); - tooltipinfo.popupElement = null; - } - - } - -// -// TooltipWaitDone() -// - -SocialCalc.TooltipWaitDone = function() { - - var tooltipinfo = SocialCalc.TooltipInfo; - - tooltipinfo.timer = null; - - SocialCalc.TooltipDisplay(tooltipinfo.tooltipElement); - - } - - -// ************************************* -// -// Button functions: -// -// ************************************* - -SocialCalc.ButtonInfo = { - - // There is only one of these -- no "new" is done. - // Only one button operation can be active at a time. - // The registeredElements array is used to identify items. - - // One item for each clickable element, each an object with: - // .element, .normalstyle, .hoverstyle, .downstyle, .repeatinterval, .functionobj - // - // .functionobj is an object with optional function objects for: - // mouseover, mouseout, mousedown, repeatinterval, mouseup, disabled - - registeredElements: [], - - // Items used during hover over an element, clicking, repeating, etc. - - buttonElement: null, // item being processed, hover or down (.element is the actual element) - doingHover: false, // true if mouse is over one of our elements - buttonDown: false, // true if button down and buttonElement not null - timer: null, // timer object for repeating - - // Used while processing an event - - horizontalScroll: 0, - verticalScroll: 0, - clientX: 0, - clientY: 0 - - } - -// -// ButtonRegister(element, paramobj, functionobj) - make element clickable -// -// The arguments (other than element) may be null (meaning no change for style and no repeat) -// The paramobj has the optional normalstyle, hoverstyle, downstyle, repeatwait, repeatinterval settings - -SocialCalc.ButtonRegister = function(element, paramobj, functionobj) { - - var buttoninfo = SocialCalc.ButtonInfo; - - if (!paramobj) paramobj = {}; - - buttoninfo.registeredElements.push( - {name: paramobj.name, element: element, normalstyle: paramobj.normalstyle, hoverstyle: paramobj.hoverstyle, downstyle: paramobj.downstyle, - repeatwait: paramobj.repeatwait, repeatinterval: paramobj.repeatinterval, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.ButtonMouseDown, false); - element.addEventListener("mouseover", SocialCalc.ButtonMouseOver, false); - element.addEventListener("mouseout", SocialCalc.ButtonMouseOut, false); - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousedown", SocialCalc.ButtonMouseDown); - element.attachEvent("onmouseover", SocialCalc.ButtonMouseOver); - element.attachEvent("onmouseout", SocialCalc.ButtonMouseOut); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - - } - -// -// ButtonMouseOver(event) -// - -SocialCalc.ButtonMouseOver = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (!bobj) return; - - if (buttoninfo.buttonDown) { - if (buttoninfo.buttonElement==bobj) { - buttoninfo.doingHover = true; // keep track whether we are on the pressed button or not - } - return; - } - - if (buttoninfo.buttonElement && - buttoninfo.buttonElement!=bobj && buttoninfo.doingHover) { // moved to a new one, undo hover there - SocialCalc.setStyles(buttoninfo.buttonElement.element, buttoninfo.buttonElement.normalstyle); - } - - buttoninfo.buttonElement = bobj; // remember this one is hovering - buttoninfo.doingHover = true; - - SocialCalc.setStyles(bobj.element, bobj.hoverstyle); // set style (if provided) - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOver) bobj.functionobj.MouseOver(e, buttoninfo, bobj); - - return; - - } - -// -// ButtonMouseOut(event) -// - -SocialCalc.ButtonMouseOut = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - if (buttoninfo.buttonDown) { - buttoninfo.doingHover = false; // keep track of overs and outs - return; - } - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (buttoninfo.doingHover) { // if there was a hover, undo it - if (buttoninfo.buttonElement) - SocialCalc.setStyles(buttoninfo.buttonElement.element, buttoninfo.buttonElement.normalstyle); - buttoninfo.buttonElement = null; - buttoninfo.doingHover = false; - } - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOut) bobj.functionobj.MouseOut(e, buttoninfo, bobj); - - return; - - } - -// -// ButtonMouseDown(event) -// - -SocialCalc.ButtonMouseDown = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var viewportinfo = SocialCalc.GetViewportInfo(); - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (!bobj) return; // not one of our elements - - if (bobj && bobj.functionobj && bobj.functionobj.Disabled) { - if (bobj.functionobj.Disabled(e, buttoninfo, bobj)) { - return; - } - } - - buttoninfo.buttonElement = bobj; - buttoninfo.buttonDown = true; - - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.downstyle); - - // Register event handler for mouse up - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mouseup", SocialCalc.ButtonMouseUp, true); // capture everywhere - } - else if (bobj.element.attachEvent) { // IE 5+ - bobj.element.setCapture(); - bobj.element.attachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.attachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - } - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - buttoninfo.horizontalScroll = viewportinfo.horizontalScroll; - buttoninfo.verticalScroll = viewportinfo.verticalScroll; - buttoninfo.clientX = e.clientX + buttoninfo.horizontalScroll; // get document-relative coordinates - buttoninfo.clientY = e.clientY + buttoninfo.verticalScroll; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseDown) bobj.functionobj.MouseDown(e, buttoninfo, bobj); - - if (bobj.repeatwait) { // if a repeat wait is set, then starting waiting for first repetition - buttoninfo.timer = window.setTimeout(SocialCalc.ButtonRepeat, bobj.repeatwait); - } - - return; - - } - -// -// ButtonMouseUp(event) -// - -SocialCalc.ButtonMouseUp = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (buttoninfo.timer) { // if repeating, cancel it - window.clearTimeout(buttoninfo.timer); // cancel timer - buttoninfo.timer = null; - } - - if (!buttoninfo.buttonDown) return; // already did this (e.g., in IE, releaseCapture fires losecapture) - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mouseup", SocialCalc.ButtonMouseUp, true); - } - else if (document.detachEvent) { // IE - bobj.element.detachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - bobj.element.detachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.releaseCapture(); - } - - if (buttoninfo.buttonElement.downstyle) { - if (buttoninfo.doingHover) - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.hoverstyle); - else - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.normalstyle); - } - - buttoninfo.buttonDown = false; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseUp) bobj.functionobj.MouseUp(e, buttoninfo, bobj); - - } - -// -// ButtonRepeat() -// - -SocialCalc.ButtonRepeat = function() { - - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (!bobj) return; - - if (bobj && bobj.functionobj && bobj.functionobj.Repeat) bobj.functionobj.Repeat(null, buttoninfo, bobj); - - buttoninfo.timer = window.setTimeout(SocialCalc.ButtonRepeat, bobj.repeatinterval || 100); - - } - -// ************************************* -// -// MouseWheel functions: -// -// ************************************* - -SocialCalc.MouseWheelInfo = { - - // There is only one of these -- no "new" is done. - // The mousewheel only affects the one area the mouse pointer is over - // The registeredElements array is used to identify items. - - // One item for each element to respond to the mousewheel, each an object with: - // .element, .functionobj - - registeredElements: [] - - } - -// -// MouseWheelRegister(element, functionobj) - make element respond to mousewheel -// - -SocialCalc.MouseWheelRegister = function(element, functionobj) { - - var mousewheelinfo = SocialCalc.MouseWheelInfo; - - mousewheelinfo.registeredElements.push( - {element: element, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("DOMMouseScroll", SocialCalc.ProcessMouseWheel, false); - element.addEventListener("mousewheel", SocialCalc.ProcessMouseWheel, false); // Opera needs this - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousewheel", SocialCalc.ProcessMouseWheel); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - - } - -SocialCalc.ProcessMouseWheel = function(e) { - - var event = e || window.event; - var delta; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - var mousewheelinfo = SocialCalc.MouseWheelInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var wobj; - - for (wobj=null; !wobj && ele; ele=ele.parentNode) { // go up tree looking for one of our elements - wobj = SocialCalc.LookupElement(ele, mousewheelinfo.registeredElements); - } - if (!wobj) return; // not one of our elements - - if (event.wheelDelta) { - delta = event.wheelDelta/120; - } - else delta = -event.detail/3; - if (!delta) delta = 0; - - if (wobj.functionobj && wobj.functionobj.WheelMove) wobj.functionobj.WheelMove(event, delta, mousewheelinfo, wobj); - - if (event.preventDefault) event.preventDefault(); - event.returnValue = false; - - } - -// ************************************* -// -// Keyboard functions: -// -// For more information about keyboard handling, see: http://unixpapa.com/js/key.html -// -// ************************************* - -SocialCalc.keyboardTables = { - - specialKeysCommon: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - specialKeysIE: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - controlKeysIE: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]" - }, - - specialKeysOpera: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", - 45: "[ins]", // issues with releases before 9.5 - same as "-" ("-" changed in 9.5) - 46: "[del]", // issues with releases before 9.5 - same as "." ("." changed in 9.5) - 113: "[f2]" - }, - - controlKeysOpera: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]" - }, - - specialKeysSafari: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 63232: "[aup]", 63233: "[adown]", - 63234: "[aleft]", 63235: "[aright]", 63272: "[del]", 63273: "[home]", 63275: "[end]", 63276: "[pgup]", - 63277: "[pgdn]", 63237: "[f2]" - }, - - controlKeysSafari: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]" - }, - - ignoreKeysSafari: { - 63236: "[f1]", 63238: "[f3]", 63239: "[f4]", 63240: "[f5]", 63241: "[f6]", 63242: "[f7]", - 63243: "[f8]", 63244: "[f9]", 63245: "[f10]", 63246: "[f11]", 63247: "[f12]", 63289: "[numlock]" - }, - - specialKeysFirefox: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - controlKeysFirefox: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]" - }, - - ignoreKeysFirefox: { - 16: "[shift]", 17: "[ctrl]", 18: "[alt]", 20: "[capslock]", 19: "[pause]", 44: "[printscreen]", - 91: "[windows]", 92: "[windows]", 112: "[f1]", 114: "[f3]", 115: "[f4]", 116: "[f5]", - 117: "[f6]", 118: "[f7]", 119: "[f8]", 120: "[f9]", 121: "[f10]", 122: "[f11]", 123: "[f12]", - 144: "[numlock]", 145: "[scrolllock]", 224: "[cmd]" - } - } - -SocialCalc.Keyboard = { - areListener: false, // if true, we have been installed as a listener for keyboard events - focusTable: null, // the table editor object that gets keystrokes or null - passThru: null, // if not null, control element with focus to pass keyboard events to (has blur method), or "true" - didProcessKey: false, // did SocialCalc.ProcessKey in keydown - statusFromProcessKey: false, // the status from the keydown SocialCalc.ProcessKey - repeatingKeyPress: false, // some browsers (Opera, Gecko Mac) repeat special keys as KeyPress not KeyDown - chForProcessKey: "" // remember so can do repeat in those cases - }; - -SocialCalc.KeyboardSetFocus = function(editor) { - - SocialCalc.Keyboard.focusTable = editor; - - if (!SocialCalc.Keyboard.areListener) { - document.onkeydown = SocialCalc.ProcessKeyDown; - document.onkeypress = SocialCalc.ProcessKeyPress; - SocialCalc.Keyboard.areListener = true; - } - if (SocialCalc.Keyboard.passThru) { - if (SocialCalc.Keyboard.passThru.blur) { - SocialCalc.Keyboard.passThru.blur(); - } - SocialCalc.Keyboard.passThru = null; - } - window.focus(); - } - -SocialCalc.KeyboardFocus = function() { - - SocialCalc.Keyboard.passThru = null; - window.focus(); - - } - -SocialCalc.ProcessKeyDown = function(e) { - - var kt = SocialCalc.keyboardTables; - kt.didProcessKey = false; // always start false - kt.statusFromProcessKey = false; - kt.repeatingKeyPress = false; - - var ch=""; - var status=true; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - // IE and Safari 3.1+ won't fire keyPress, so check for special keys here. - if (e.which==undefined || (typeof e.keyIdentifier == "string")) { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { - if (e.ctrlKey) { - ch=kt.controlKeysIE[e.keyCode]; - } - if (!ch) - return true; - } - status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - } - - else { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { -// return true; - if (e.ctrlKey || e.metaKey) { - ch=kt.controlKeysIE[e.keyCode]; // this works here - } - if (!ch) - return true; - } - - status = SocialCalc.ProcessKey(ch, e); // process the key - kt.didProcessKey = true; // remember what happened - kt.statusFromProcessKey = status; - kt.chForProcessKey = ch; - } - - return status; - - } - -SocialCalc.ProcessKeyPress = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - - e = e || window.event; - - if (SocialCalc.Keyboard.passThru) return; // ignore - if (kt.didProcessKey) { // already processed this key - if (kt.repeatingKeyPress) { - return SocialCalc.ProcessKey(kt.chForProcessKey, e); // process the same key as on KeyDown - } - else { - kt.repeatingKeyPress = true; // see if get another KeyPress before KeyDown - return kt.statusFromProcessKey; // do what it said to do - } - } - - if (e.which==undefined) { // IE - // Note: Esc and Enter will come through here, too, if not stopped at KeyDown - ch=String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) - } - - else { // not IE - if (!e.which) - return false; // ignore - special key - if (e.charCode==undefined) { // Opera - if (e.which!=0) { // character - if (e.which<32 || e.which==144) { // special char (144 is numlock) - ch = kt.specialKeysOpera[e.which]; - if (ch) { - return true; - } - } - else { - if (e.ctrlKey) { - ch=kt.controlKeysOpera[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - else { // special char - return true; - } - } - - else if (e.keyCode==0 && e.charCode==0) { // OLPC Fn key or something - return; // ignore - } - - else if (e.keyCode==e.charCode) { // Safari - ch = kt.specialKeysSafari[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysSafari[e.keyCode]) // pass this through - return true; - if (e.metaKey) { - ch=kt.controlKeysSafari[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - - else { // Firefox - if (kt.specialKeysFirefox[e.keyCode]) { - return true; - } - ch = String.fromCharCode(e.which); - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysFirefox[e.which]; - } - } - } - - var status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - - return status; - - } - -/* - * - * OLD ProcessKeyDown and ProcessKeyPress -- replaced for handling newer browsers, including Safari 3.1 and Opera 9.5 - * - -SocialCalc.ProcessKeyDown = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - var status=true; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - if (e.which==undefined) { // IE - ch = kt.specialKeysIE[e.keyCode]; - if (!ch) { - if (e.ctrlKey) { - ch=kt.controlKeysIE[e.keyCode]; - } - if (!ch) - return true; - } - - status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - } - - else { // don't do anything for other browsers - wait for keyPress - ; // special key repeats are done as keypress in those browsers - } - - return status; - - } - -SocialCalc.ProcessKeyPress = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - if (e.which==undefined) { // IE - // Note: Esc and Enter will come through here, too, if not stopped at KeyDown - ch=String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) - } - - else { // not IE - if (e.charCode==undefined) { // Opera - if (e.which!=0) { // character - if (e.which<32) { // special char - ch = kt.specialKeysOpera[e.keyCode]; - if (!ch) - return true; - } - else { - if (e.ctrlKey) { - ch=kt.controlKeysOpera[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - else { // special char - ch = kt.specialKeysOpera[e.keyCode]; - if (!ch) - return true; - } - } - - else if (e.keyCode==0 && e.charCode==0) { // OLPC Fn key or something - return; // ignore - } - - else if (e.keyCode==e.charCode) { // Safari - ch = kt.specialKeysSafari[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysSafari[e.keyCode]) // pass this through - return true; - if (e.metaKey) { - ch=kt.controlKeysSafari[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - - else { // Firefox - ch = kt.specialKeysFirefox[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysFirefox[e.keyCode]) // pass this through - return true; - if (e.which) { // normal char - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysFirefox[e.which]; - } - else { - ch = String.fromCharCode(e.which); - } - } - else { // usually a special char - return true; // old Firefox gives extra, empty keyPress for "/" - ignore - } - } - } - } - - var status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - - return status; - - } -*/ - -// -// status = SocialCalc.ProcessKey(ch, e) -// -// Take a key representation as a character string and dispatch to appropriate routine -// - -SocialCalc.ProcessKey = function (ch, e) { - - var ft = SocialCalc.Keyboard.focusTable; - - if (!ft) return true; // we're not handling it -- let browser do default - - return ft.EditorProcessKey(ch, e); - - } - - diff --git a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalcviewer.js b/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalcviewer.js deleted file mode 100644 index 7abcf8b..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/aspiring/socialcalcviewer.js +++ /dev/null @@ -1,687 +0,0 @@ -// -// SocialCalcViewer -// -/* -// The code module of the SocialCalc package that lets you embed a spreadsheet viewer -// with an optional simple toolbar into a web page. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript SpreadsheetViewer. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the SpreadsheetViewer is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/ - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); - } - -// ************************************* -// -// SpreadsheetViewer class: -// -// ************************************* - -// Global constants: - - SocialCalc.CurrentSpreadsheetViewerObject = null; // right now there can only be one active at a time - - -// Constructor: - -SocialCalc.SpreadsheetViewer = function() { - - var scc = SocialCalc.Constants; - - // Properties: - - this.parentNode = null; - this.spreadsheetDiv = null; - this.requestedHeight = 0; - this.requestedWidth = 0; - this.requestedSpaceBelow = 0; - this.height = 0; - this.width = 0; - this.viewheight = 0; // calculated amount for views below toolbar, etc. - - // Dynamic properties: - - this.sheet = null; - this.context = null; - this.editor = null; - - this.spreadsheetDiv = null; - this.editorDiv = null; - - this.sortrange = ""; // remembered range for sort tab - - // Constants: - - this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-" - this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src - - this.statuslineheight = scc.SVStatuslineheight; // in pixels - this.statuslineCSS = scc.SVStatuslineCSS; - - // Callbacks: - - // Initialization Code: - - this.sheet = new SocialCalc.Sheet(); - this.context = new SocialCalc.RenderContext(this.sheet); - this.context.showGrid=true; - this.context.showRCHeaders=true; - this.editor = new SocialCalc.TableEditor(this.context); - this.editor.noEdit = true; - this.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetViewerStatuslineCallback, - params: {}}; - this.hasStatusLine = true; // default -// this.statuslineHTML = '
    {status}Will be link
    '; - this.statuslineHTML = '
    {status} 
    '; - this.statuslineFull = true; - this.noRecalc = true; // don't do a recalc when loaded, so no need for external sheet routines - - // Repeating macro info - - this.repeatingMacroTimer = null; - this.repeatingMacroInterval = 60; // default to 60 seconds - this.repeatingMacroCommands = ""; // what to execute - - - SocialCalc.CurrentSpreadsheetViewerObject = this; // remember this for rendezvousing on events - - return; - - } - -// Methods: - -SocialCalc.SpreadsheetViewer.prototype.InitializeSpreadsheetViewer = - function(node, height, width, spacebelow) {return SocialCalc.InitializeSpreadsheetViewer(this, node, height, width, spacebelow);}; -SocialCalc.SpreadsheetViewer.prototype.LoadSave = function(str) {return SocialCalc.SpreadsheetViewerLoadSave(this, str);}; -SocialCalc.SpreadsheetViewer.prototype.DoOnResize = function() {return SocialCalc.DoOnResize(this);}; -SocialCalc.SpreadsheetViewer.prototype.SizeSSDiv = function() {return SocialCalc.SizeSSDiv(this);}; -SocialCalc.SpreadsheetViewer.prototype.DecodeSpreadsheetSave = - function(str) {return SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave(this, str);}; - -// Sheet Methods to make things a little easier: - -SocialCalc.SpreadsheetViewer.prototype.ParseSheetSave = function(str) {return this.sheet.ParseSheetSave(str);}; - - -// Functions: - -// -// InitializeSpreadsheetViewer(spreadsheet, node, height, width, spacebelow) -// -// Creates the control elements and makes them the child of node (string or element). -// If present, height and width specify size. -// If either is 0 or null (missing), the maximum that fits on the screen -// (taking spacebelow into account) is used. -// -// You should do a redisplay or recalc (which redisplays) after running this. -// - -SocialCalc.InitializeSpreadsheetViewer = function(spreadsheet, node, height, width, spacebelow) { - - var scc = SocialCalc.Constants; - var SCLoc = SocialCalc.LocalizeString; - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var html, child, i, vname, v, style, button, bele; - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - spreadsheet.requestedHeight = height; - spreadsheet.requestedWidth = width; - spreadsheet.requestedSpaceBelow = spacebelow; - - if (typeof node == "string") node = document.getElementById(node); - - if (node == null) { - alert("SocialCalc.SpreadsheetControl not given parent node."); - } - - spreadsheet.parentNode = node; - - // create node to hold spreadsheet view - - spreadsheet.spreadsheetDiv = document.createElement("div"); - - spreadsheet.SizeSSDiv(); // calculate and fill in the size values - - for (child=node.firstChild; child!=null; child=node.firstChild) { - node.removeChild(child); - } - - node.appendChild(spreadsheet.spreadsheetDiv); - - // create sheet div - - spreadsheet.nonviewheight = spreadsheet.hasStatusLine ? spreadsheet.statuslineheight : 0; - spreadsheet.viewheight = spreadsheet.height-spreadsheet.nonviewheight; - spreadsheet.editorDiv=spreadsheet.editor.CreateTableEditor(spreadsheet.width, spreadsheet.viewheight); - - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.editorDiv); - - // create statusline - - if (spreadsheet.hasStatusLine) { - spreadsheet.statuslineDiv = document.createElement("div"); - spreadsheet.statuslineDiv.style.cssText = spreadsheet.statuslineCSS; - spreadsheet.statuslineDiv.style.height = spreadsheet.statuslineheight - - (spreadsheet.statuslineDiv.style.paddingTop.slice(0,-2)-0) - - (spreadsheet.statuslineDiv.style.paddingBottom.slice(0,-2)-0) + "px"; - spreadsheet.statuslineDiv.id = spreadsheet.idPrefix+"statusline"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.statuslineDiv); - spreadsheet.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetViewerStatuslineCallback, - params: {spreadsheetobj:spreadsheet}}; - } - - // done - refresh screen needed - - return; - - } - -SocialCalc.SpreadsheetViewerLoadSave = function(spreadsheet, savestr) { - - var rmstr, pos, t, t2; - - var parts = spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - spreadsheet.sheet.ResetSheet(); - spreadsheet.sheet.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) { // executed now - spreadsheet.editor.EditorScheduleSheetCommands(savestr.substring(parts.startupmacro.start, parts.startupmacro.end), false, true); - } - if (parts.repeatingmacro) { // first line tells how many seconds before first execution. Last cmd must be "cmdextension repeatmacro delay" to continue repeating. - rmstr = savestr.substring(parts.repeatingmacro.start, parts.repeatingmacro.end); - rmstr = rmstr.replace("\r", ""); // make sure no CR, only LF - pos = rmstr.indexOf("\n"); - if (pos > 0) { - t = rmstr.substring(0, pos)-0; // get number - t2 = t; -// if (!(t > 0)) t = 60; // handles NAN, too - spreadsheet.repeatingMacroInterval = t; - spreadsheet.repeatingMacroCommands = rmstr.substring(pos+1); - if (t2 > 0) { // zero means don't start yet - spreadsheet.repeatingMacroTimer = window.setTimeout(SocialCalc.SpreadsheetViewerDoRepeatingMacro, spreadsheet.repeatingMacroInterval * 1000); - } - } - } - } - if (spreadsheet.editor.context.sheetobj.attribs.recalc=="off" || spreadsheet.noRecalc) { - spreadsheet.editor.ScheduleRender(); - } - else { - spreadsheet.editor.EditorScheduleSheetCommands("recalc"); - } - } - -// -// SocialCalc.SpreadsheetViewerDoRepeatingMacro -// -// Called by a timer. Executes repeatingMacroCommands once. -// Use the "startcmdextension repeatmacro delay" command last to schedule this again. -// - -SocialCalc.SpreadsheetViewerDoRepeatingMacro = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - var editor = spreadsheet.editor; - - spreadsheet.repeatingMacroTimer = null; - - SocialCalc.SheetCommandInfo.CmdExtensionCallbacks.repeatmacro = {func:SocialCalc.SpreadsheetViewerRepeatMacroCommand, data:null}; - - editor.EditorScheduleSheetCommands(spreadsheet.repeatingMacroCommands); - -} - -SocialCalc.SpreadsheetViewerRepeatMacroCommand = function(name, data, sheet, cmd, saveundo) { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - - var rest = cmd.RestOfString(); - var t = rest-0; // get number - if (!(t > 0)) t = spreadsheet.repeatingMacroInterval; // handles NAN, too, using last value - spreadsheet.repeatingMacroInterval = t; - - spreadsheet.repeatingMacroTimer = window.setTimeout(SocialCalc.SpreadsheetViewerDoRepeatingMacro, spreadsheet.repeatingMacroInterval * 1000); - -} - -SocialCalc.SpreadsheetViewerStopRepeatingMacro = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - - if (spreadsheet.repeatingMacroTimer) { - window.clearTimeout(spreadsheet.repeatingMacroTimer); - spreadsheet.repeatingMacroTimer = null; - } -} - -// -// SocialCalc.SpreadsheetViewerDoButtonCmd(e, buttoninfo, bobj) -// -// xxx -// - -SocialCalc.SpreadsheetViewerDoButtonCmd = function(e, buttoninfo, bobj) { - - var obj = bobj.element; - var which = bobj.functionobj.command; - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - var editor = spreadsheet.editor; - - switch (which) { - case "recalc": - editor.EditorScheduleSheetCommands("recalc"); - break; - - default: - break; - } - - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - - } - - -// -// outstr = SocialCalc.LocalizeString(str) -// -// SocialCalc function to make localization easier. -// If str is "Text to localize", it returns -// SocialCalc.Constants.s_loc_text_to_localize if -// it exists, or else with just "Text to localize". -// Note that spaces are replaced with "_" and other special -// chars with "X" in the name of the constant (e.g., "A & B" -// would look for SocialCalc.Constants.s_loc_a_X_b. -// - -SocialCalc.LocalizeString = function(str) { - var cstr = SocialCalc.LocalizeStringList[str]; // found already this session? - if (!cstr) { // no - look up - cstr = SocialCalc.Constants["s_loc_"+str.toLowerCase().replace(/\s/g, "_").replace(/\W/g, "X")] || str; - SocialCalc.LocalizeStringList[str] = cstr; - } - return cstr; - } - -SocialCalc.LocalizeStringList = {}; // a list of strings to localize accumulated by the routine - -// -// outstr = SocialCalc.LocalizeSubstrings(str) -// -// SocialCalc function to make localization easier using %loc and %scc. -// -// Replaces sections of str with: -// %loc!Text to localize! -// with SocialCalc.Constants.s_loc_text_to_localize if -// it exists, or else with just "Text to localize". -// Note that spaces are replaced with "_" and other special -// chars with "X" in the name of the constant (e.g., %loc!A & B! -// would look for SocialCalc.Constants.s_loc_a_X_b. -// Uses SocialCalc.LocalizeString for this. -// -// Replaces sections of str with: -// %ssc!constant-name! -// with SocialCalc.Constants.constant-name. -// If the constant doesn't exist, throws and alert. -// - -SocialCalc.LocalizeSubstrings = function(str) { - - var SCLoc = SocialCalc.LocalizeString; - - return str.replace(/%(loc|ssc)!(.*?)!/g, function(a, t, c) { - if (t=="ssc") { - return SocialCalc.Constants[c] || alert("Missing constant: "+c); - } - else { - return SCLoc(c); - } - }); - - } - -// -// obj = GetSpreadsheetViewerObject() -// -// Returns the current spreadsheet view object -// - -SocialCalc.GetSpreadsheetViewerObject = function() { - - var csvo = SocialCalc.CurrentSpreadsheetViewerObject; - if (csvo) return csvo; - - throw ("No current SpreadsheetViewer object."); - - } - - -// -// SocialCalc.DoOnResize(spreadsheet) -// -// Processes an onResize event, setting the different views. -// - -SocialCalc.DoOnResize = function(spreadsheet) { - - var v; - var views = spreadsheet.views; - - var needresize = spreadsheet.SizeSSDiv(); - if (!needresize) return; - - for (vname in views) { - v = views[vname].element; - v.style.width = spreadsheet.width + "px"; - v.style.height = (spreadsheet.height-spreadsheet.nonviewheight) + "px"; - } - - spreadsheet.editor.ResizeTableEditor(spreadsheet.width, spreadsheet.height-spreadsheet.nonviewheight); - - } - - -// -// resized = SocialCalc.SizeSSDiv(spreadsheet) -// -// Figures out a reasonable size for the spreadsheet, given any requested values and viewport. -// Sets ssdiv to that. -// Return true if different than existing values. -// - -SocialCalc.SizeSSDiv = function(spreadsheet) { - - var sizes, pos, resized, nodestyle, newval; - var fudgefactorX = 10; // for IE - var fudgefactorY = 10; - - resized = false; - - sizes = SocialCalc.GetViewportInfo(); - pos = SocialCalc.GetElementPosition(spreadsheet.parentNode); - pos.bottom = 0; - pos.right = 0; - - nodestyle = spreadsheet.parentNode.style; - - if (nodestyle.marginTop) { - pos.top += nodestyle.marginTop.slice(0,-2)-0; - } - if (nodestyle.marginBottom) { - pos.bottom += nodestyle.marginBottom.slice(0,-2)-0; - } - if (nodestyle.marginLeft) { - pos.left += nodestyle.marginLeft.slice(0,-2)-0; - } - if (nodestyle.marginRight) { - pos.right += nodestyle.marginRight.slice(0,-2)-0; - } - - newval = spreadsheet.requestedHeight || - sizes.height - (pos.top + pos.bottom + fudgefactorY) - - (spreadsheet.requestedSpaceBelow || 0); - if (spreadsheet.height != newval) { - spreadsheet.height = newval; - spreadsheet.spreadsheetDiv.style.height = newval + "px"; - resized = true; - } - newval = spreadsheet.requestedWidth || - sizes.width - (pos.left + pos.right + fudgefactorX) || 700; - if (spreadsheet.width != newval) { - spreadsheet.width = newval; - spreadsheet.spreadsheetDiv.style.width = newval + "px"; - resized = true; - } - - return resized; - - } - - -// -// SocialCalc.SpreadsheetViewerStatuslineCallback -// - -SocialCalc.SpreadsheetViewerStatuslineCallback = function(editor, status, arg, params) { - - var spreadsheet = params.spreadsheetobj; - var slstr = ""; - - if (spreadsheet && spreadsheet.statuslineDiv) { - if (spreadsheet.statuslineFull) { - slstr = editor.GetStatuslineString(status, arg, params); - } - else { - slstr = editor.ecell.coord; - } - slstr = spreadsheet.statuslineHTML.replace(/\{status\}/, slstr); - spreadsheet.statuslineDiv.innerHTML = slstr; - } - - switch (status) { - case "cmdendnorender": - case "calcfinished": - case "doneposcalc": - break; // not updating Recalc button since no toolbar - - default: - break; - } - - } - - -// -// SocialCalc.CmdGotFocus(obj) -// -// Sets SocialCalc.Keyboard.passThru: obj should be element with focus or "true" -// - -SocialCalc.CmdGotFocus = function(obj) { - - SocialCalc.Keyboard.passThru = obj; - - } - - -// -// result = SocialCalc.SpreadsheetViewerCreateSheetHTML(spreadsheet) -// -// Returns the HTML representation of the whole spreadsheet -// - -SocialCalc.SpreadsheetViewerCreateSheetHTML = function(spreadsheet) { - - var context, div, ele; - - var result = ""; - - context = new SocialCalc.RenderContext(spreadsheet.sheet); - div = document.createElement("div"); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - result = div.innerHTML; - delete ele; - delete div; - return result; - - } - - -/////////////////////// -// -// LOAD ROUTINE -// -/////////////////////// - -// -// parts = SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave(spreadsheet, str) -// -// Separates the parts from a spreadsheet save string, returning an object with the sub-strings. -// -// {type1: {start: startpos, end: endpos}, type2:...} -// - -SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave = function(spreadsheet, str) { - - var pos1, mpregex, searchinfo, boundary, boundaryregex, blanklineregex, start, ending, lines, i, lines, p, pnun; - var parts = {}; - var partlist = []; - -var hasreturnonly = /[^\n]\r[^\n]/; -if (hasreturnonly.test(str)) { -str = str.replace(/([^\n])\r([^\n])/g, "$1\r\n$2"); -} - pos1 = str.search(/^MIME-Version:\s1\.0/mi); - if (pos1 < 0) return parts; - - mpregex = /^Content-Type:\s*multipart\/mixed;\s*boundary=(\S+)/mig; - mpregex.lastIndex = pos1; - - searchinfo = mpregex.exec(str); - if (mpregex.lastIndex <= 0) return parts; - boundary = searchinfo[1]; - - boundaryregex = new RegExp("^--"+boundary+"(?:\r\n|\n)", "mg"); - boundaryregex.lastIndex = mpregex.lastIndex; - - searchinfo = boundaryregex.exec(str); // find header top boundary - blanklineregex = /(?:\r\n|\n)(?:\r\n|\n)/gm; - blanklineregex.lastIndex = boundaryregex.lastIndex; - searchinfo = blanklineregex.exec(str); // skip to after blank line - if (!searchinfo) return parts; - start = blanklineregex.lastIndex; - boundaryregex.lastIndex = start; - searchinfo = boundaryregex.exec(str); // find end of header - if (!searchinfo) return parts; - ending = searchinfo.index; - - lines = str.substring(start, ending).split(/\r\n|\n/); // get header as lines - for (i=0;i'+ -//'
    '+ -//''+ -//''+ -//''+ - -// ''+ -// ''+ -// ''+ - -//''+ -//''+ -//'
    '+ -//''; - - SocialCalc.CurrentWorkbookControlObject = this; - this.sheetbar = new SocialCalc.SheetBar(); -} - -// methods -SocialCalc.WorkBookControl.prototype.GetCurrentWorkBookControl = function() {return SocialCalc.GetCurrentWorkBookControl();}; -SocialCalc.WorkBookControl.prototype.InitializeWorkBookControl = function() {return SocialCalc.InitializeWorkBookControl(this);}; - - -SocialCalc.WorkBookControl.prototype.ExecuteWorkBookControlCommand = function(cmd, isremote) { - return SocialCalc.ExecuteWorkBookControlCommand(this, cmd, isremote); -} - -SocialCalc.ExecuteWorkBookControlCommand = function(control, cmd, isremote) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - //if (!isremote) { - // return; - //} - - if (cmd.cmdtype == "scmd") { - // dispatch a sheet command - control.workbook.WorkbookScheduleCommand(cmd, isremote); - return; - - } - - if (cmd.cmdtype != "wcmd") { - return; - } - - var parseobj = new SocialCalc.Parse(cmd.cmdstr); - - var cmd1 = parseobj.NextToken(); - - switch (cmd1) { - case "addsheet": - SocialCalc.WorkBookControlAddSheetRemote(null); - break; - - case "addsheetstr": - var sheetstr = cmd.sheetstr; - SocialCalc.WorkBookControlAddSheetRemote(sheetstr); - break; - - case "delsheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlDelSheetRemote(sheetid); - break; - - case "rensheet": - var sheetid = parseobj.NextToken(); - var oldname = parseobj.NextToken(); - var newname = parseobj.NextToken(); - SocialCalc.WorkBookControlRenameSheetRemote(sheetid, oldname, newname); - break; - - case "activatesheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlActivateSheet(sheetid); - break; - - case "hidesheet": - var sheetid = parseobj.NextToken(); - - break; - - case "unhidesheet": - var sheetid = parseobj.NextToken(); - - break; - } -} - -SocialCalc.GetCurrentWorkBookControl = function() { - return SocialCalc.CurrentWorkbookControlObject; -} - -SocialCalc.InitializeWorkBookControl = function(control) { - var element = document.createElement("div"); - element.innerHTML = control.sheetshtml; - var foo = document.getElementById(control.div); - foo.appendChild(element); - //var element2 = document.createElement("div"); - //element2.innerHTML = control.buttonshtml; - //foo.appendChild(element2); - SocialCalc.WorkBookControlAddSheet(false); // this is for the default sheet -} - -SocialCalc.WorkBookControlDelSheetRemote = function(sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (sheetid == control.currentSheetButton.id) { - // the active sheet is being deleted - SocialCalc.WorkBookControlDelSheet(); - return; - } - // some non active sheet is being deleted - var foo = document.getElementById("fooBar"); - var deletedbutton = document.getElementById(sheetid); - - var did = deletedbutton.id; - var dname = deletedbutton.value; - delete control.sheetButtonArr[did]; - - foo.removeChild(deletedbutton); - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+did); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - // delete the sheet - control.workbook.DeleteWorkBookSheet(did, dname); - control.numSheets = control.numSheets-1; - -} - -// assumes that the current active sheet is being deleted -SocialCalc.WorkBookControlDelSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } -if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='To delete the selected sheet, you must first insert a new sheet.
    '; -str +='
    '+ - '
    '; - var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the deletion of the sheet - // the popup has two buttons : Confirm and Cancel -var element = document.getElementById(control.deleteDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+ 'The selected sheet will be permanently deleted.'+ '
    '; -str +='
      '; - str +='
    • To delete the selected sheet, click OK.
    • '; - str +='
    • To cancel the deletion, click cancel.
    • '; -str+='
    '; -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.WorkBookControlDeleteSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.deleteDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlDeleteSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlDeleteSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.currentSheetButton = null; - // delete the sheets - control.workbook.DeleteWorkBookSheet(name, curname); - control.numSheets = control.numSheets-1; - - var cmdstr = "delsheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true) - break; - } - } - if (control.currentSheetButton != null) { - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } -} - -// assumes that the current active sheet is being hidden -SocialCalc.WorkBookControlHideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='Before hiding the selected sheet, you must first insert a new sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the hiding of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.hideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The selected sheet will be hidden.'+ '
    '; - str +='
      '; - str +='
    • To hide the selected sheet, click OK.
    • '; - str +='
    • To cancel the hiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - -SocialCalc.WorkBookControlHideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.hideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlHideSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlHideSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, false); - sheetbarbutton.style.display="none"; - control.currentSheetButton = null; - // delete the sheets - - control.numSheets = control.numSheets-1; - - var cmdstr = "hidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - -// displays all hidden sheets, and then unhides whatever is selected -SocialCalc.WorkBookControlUnhideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - - var unhiddencount = 0; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - unhiddencount++; - } - } - - if(unhiddencount==0) { //no hidden sheets, error message here - var str = '
    '+ - ''+' There are no hidden worksheets. ' + '

    '; - str +='Before unhiding any sheets, you must first hide a sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - var element = document.getElementById(control.unhideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The following sheets are hidden.'+ '
      ' + - ''; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - str += '' + control.sheetButtonArr[sheet].value +'
      '; - } - } - - str +='
    \n
      '; - str +='
    • To unhide the selected sheet, click OK.
    • '; - str +='
    • To cancel the unhiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - - - -SocialCalc.WorkBookControlUnhideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.unhideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} - - -SocialCalc.WorkBookControlUnhideSheetSubmit = function(name) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlUnhideSheetHide(); - var current = document.getElementById(control.currentSheetButton.id); - - var curid = current.id; - var curname = control.currentSheetButton.value; - - control.currentSheetButton.setAttribute("style",""); - var old = control.currentSheetButton.id; - console.log(old); - SocialCalc.SheetBarButtonActivate(old, false); - - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unhide the button - sheetbarbutton.style.display = "inline"; - control.currentSheetButton = null; - - control.numSheets = control.numSheets+1; - - var cmdstr = "unhidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - - - -SocialCalc.WorkBookControlAddSheetButton = function(sheetname, sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - //Create an input type dynamically. - var element = document.createElement("input"); - - var name = null; - - if (sheetid != null) { - name = sheetid - } else { - name = "sheet"+ (control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt + 1; - } - - //Assign different attributes to the element. - element.setAttribute("type", "button"); - if (sheetname == null) { - element.setAttribute("value", name); - } else { - element.setAttribute("value", sheetname); - } - element.setAttribute("id", name); - element.setAttribute("name", name); - - var fnname = "SocialCalc.WorkBookControlActivateSheet("+"'"+name+"'"+")"; - - element.setAttribute("onclick",fnname); - - control.sheetButtonArr[name] = element; - - - var foo = document.getElementById("fooBar"); - - //Append the element in page (in span). - foo.appendChild(element); - - control.numSheets = control.numSheets + 1; - - var el = new SocialCalc.SheetBarSheetButton("sbsb-"+name, (sheetname?sheetname:name), - document.getElementById("SocialCalc-sheetbar-buttons"), - { - //normalstyle: "border:1px solid #000;backgroundColor:#FFF;", - //downstyle: "border:1px solid #000;backgroundColor:#CCC;", - //hoverstyle: "border:1px solid #000;backgroundColor:#FFF;" - }, - { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(name);}, - Repeat:function(){}, - Disabled: function() {} - } - ); - - return element; -} - -SocialCalc.WorkBookControlAddSheet = function(addworksheet, sheetname){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(sheetname); - - // then change the highlight - - var old="sheet1"; - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style", ""); - old = control.currentSheetButton.id; - SocialCalc.SheetBarButtonActivate(old, false); - } - - element.setAttribute("style","background-color:lightgreen"); - control.currentSheetButton = element; - var newsheetid = element.id; - SocialCalc.SheetBarButtonActivate(newsheetid, true); - - // create the sheet - if (addworksheet) { - control.workbook.AddNewWorkBookSheet(newsheetid, old, false); - // broadcast an add command here - var cmdstr = "addsheet" - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - } - -} - -SocialCalc.WorkBookControlAddSheetRemote = function(savestr){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(); - - // add the sheet, dont switch to it - control.workbook.AddNewWorkBookSheetNoSwitch(element.id, - element.value, savestr); -} - - -SocialCalc.WorkBookControlActivateSheet = function(name) { - - //alert("in activate sheet="+name) - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById(name); - foo.setAttribute("style","background-color:lightgreen;"); - SocialCalc.SheetBarButtonActivate(name, true) - - var old = control.currentSheetButton.id; - if (control.currentSheetButton.id != foo.id) { - control.currentSheetButton.setAttribute("style", ""); - SocialCalc.SheetBarButtonActivate(old, false) - } - - control.currentSheetButton = foo; - - control.workbook.ActivateWorkBookSheet(name, old); - -} - -SocialCalc.WorkBookControlHttpRequest = null; - -SocialCalc.WorkBookControlAlertContents = function(){ - - var loadedstr = ""; - var http_request = SocialCalc.WorkBookControlHttpRequest; - - if (http_request.readyState == 4) { - //addmsg("received:" + http_request.responseText.length + " chars"); - try { - if (http_request.status == 200) { - loadedstr = http_request.responseText || ""; - http_request = null; - } - else { - ; - } - } - catch (e) { - } - // do something with loaded str - //alert("loaded="+loadedstr); - SocialCalc.TestWorkBookSaveStr = loadedstr; - SocialCalc.Clipboard.clipboard = loadedstr; - } -} - - -SocialCalc.WorkBookControlAjaxCall = function(url, contents) { - - var http_request = null; - - alert("in ajax") - if (window.XMLHttpRequest) { // Mozilla, Safari,... - http_request = new XMLHttpRequest(); - } - else - if (window.ActiveXObject) { // IE - try { - http_request = new ActiveXObject("Msxml2.XMLHTTP"); - } - catch (e) { - try { - http_request = new ActiveXObject("Microsoft.XMLHTTP"); - } - catch (e) { - } - } - } - if (!http_request) { - alert('Giving up :( Cannot create an XMLHTTP instance'); - return false; - } - - // Make the actual request - SocialCalc.WorkBookControlHttpRequest = http_request; - - http_request.onreadystatechange = SocialCalc.WorkBookControlAlertContents; - http_request.open('POST', document.URL, true); // async - http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - http_request.send(contents); - - return true; - -} - -SocialCalc.WorkBookControlSaveSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetsave = {}; - - sheetsave.numsheets = control.numSheets; - sheetsave.currentid = control.currentSheetButton.id; - sheetsave.currentname = control.currentSheetButton.value; - - sheetsave.sheetArr = {} - for (var sheet in control.sheetButtonArr) { - var sheetstr = control.workbook.SaveWorkBookSheet(sheet); - sheetsave.sheetArr[sheet] = {} - sheetsave.sheetArr[sheet].sheetstr = sheetstr; - sheetsave.sheetArr[sheet].name = control.sheetButtonArr[sheet].value; - sheetsave.sheetArr[sheet].hidden = document.getElementById("sbsb-" + sheet).style.display == "none" ? "1" : "0"; - } - - // Save the editable cells if specified - if (SocialCalc.EditableCells && SocialCalc.EditableCells.allow) { - sheetsave.EditableCells = {}; - for (var i in SocialCalc.EditableCells) { - sheetsave.EditableCells[i] = SocialCalc.EditableCells[i]; - } - } - - var d = new Date(); - sheetsave["timestamp"] = d.toString(); - - - if (SocialCalc.saveAppData) { - SocialCalc.saveAppData(); - } - - if (SocialCalc.AppData) { - console.log("saving appdata") - sheetsave.AppData = {}; - for (var i in SocialCalc.AppData) { - sheetsave.AppData[i] = SocialCalc.AppData[i]; - } - } else { - sheetsave.AppData = null; - console.log("did not save appdata") - } - - - - SocialCalc.TestWorkBookSaveStr = JSON.stringify(sheetsave); - //alert(SocialCalc.TestWorkBookSaveStr); - // send it to the backend - // SocialCalc.WorkBookControlAjaxCall("/", "&sheetdata="+encodeURIComponent(SocialCalc.TestWorkBookSaveStr)); - return SocialCalc.TestWorkBookSaveStr; -} - - -// insert another workbook into an existing workbook -// assumption is at least 1 sheet exists in existing workbook -// sheets with same names will be overwritten ! -SocialCalc.WorkBookControlInsertWorkbook = function(savestr, sheetsave) { - var sheetsave - if (savestr) { - sheetsave = JSON.parse(savestr); - } - var control = SocialCalc.GetCurrentWorkBookControl(); - for (var sheet in sheetsave.sheetArr) { - - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end) - } - } - // check if sheetname already exists - var sheetname = sheetsave.sheetArr[sheet].name - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - if (sheetid) { - console.log(sheetname+"exists") - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, sheetname) - } - else { - //just test-brand new insert first - sheetid = "sheet"+(control.sheetCnt+1).toString() - control.sheetCnt = control.sheetCnt+1 - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid) - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr) - - } - } - - if(sheetsave.AppData) { - console.log("appdata found"); - SocialCalc.AppData = {}; - for (var i in sheetsave.AppData) { - SocialCalc.AppData[i] = sheetsave.AppData[i]; - } - } else { - console.log("appdata NOT found"); - SocialCalc.AppData = null; - } - - -} - -SocialCalc.WorkBookControlLoad = function(savestr){ - - var sheetsave; - - if (savestr == "") return; - - if (savestr) { - sheetsave = JSON.parse(savestr); - } else { - sheetsave = JSON.parse(SocialCalc.TestWorkBookSaveStr); - } - //alert(sheetsave.currentid+","+sheetsave.currentname) - - // first create a new workbook - var control = SocialCalc.GetCurrentWorkBookControl(); - - SocialCalc.WorkBookControlCreateNewBook(); - - // at this point there is one sheet, and 1 button - // create the sequence of buttons, and sheets - var firstrun = true; - var newbuttons = 0 - var sheetid = null; - var currentsheetid = sheetsave.currentid; - //alert("button="+newbuttons) - for (var sheet in sheetsave.sheetArr) { - //alert(sheet); - if (newbuttons > sheetsave.numsheets) { - break; - } - //alert("button="+newbuttons) - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - if (firstrun) { - firstrun=false; - // set the first button's name correctly - sheetid = control.currentSheetButton.id; - control.currentSheetButton.value = sheetsave.sheetArr[sheet].name; - SocialCalc.SheetBarButtonSetName(sheetid, sheetsave.sheetArr[sheet].name); - // set the sheet data for the first sheet which already exists - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, control.currentSheetButton.value); - // need to also set the formula cache - currentsheetid = sheetid; - } - else { - sheetid = "sheet"+(control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt+1; - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr); - } - if(sheetsave.sheetArr[sheet].hidden=="1") { - // unregister with mouse ? etc - var sheetbarbutton = document.getElementById("sbsb-" + sheetid); - sheetbarbutton.style.display="none"; - SocialCalc.SheetBarButtonActivate(sheet, false); - newbuttons= newbuttons - 1; - } - if (sheet == sheetsave.currentid) { - currentsheetid = sheetid - } - newbuttons = newbuttons + 1; - } - // Save the user script data - if (sheetsave.EditableCells) { - SocialCalc.EditableCells = {}; - for (var i in sheetsave.EditableCells) { - SocialCalc.EditableCells[i] = sheetsave.EditableCells[i]; - } - } - - if(sheetsave.AppData) { - console.log("appdata found"); - SocialCalc.AppData = {}; - for (var i in sheetsave.AppData) { - SocialCalc.AppData[i] = sheetsave.AppData[i]; - } - } else { - console.log("appdata NOT found"); - SocialCalc.AppData = null; - } - - - var timeoutFn = function() { - SocialCalc.WorkBookControlActivateSheet(currentsheetid); - }; - window.setTimeout(timeoutFn, 200); -} - - -SocialCalc.WorkBookControlRenameSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // do a popup to get the new name of the sheet - // the popup has an input element with submit, and cancel buttons - var element = document.getElementById(control.renameDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+'Rename-'+ currentsheet + '
    '+ - '' + 'Please ensure that you DO NOT have ANY spaces in the sheet name.' + '' + - '
    '+'
    '; - -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.renameDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - -var ele = document.getElementById("newSheetName"); -ele.focus(); -SocialCalc.CmdGotFocus(ele); - -} - -SocialCalc.WorkBookControlRenameSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.renameDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlRenameSheetSubmit = function(){ - -// this handles all the rename action -var ele = document.getElementById("newSheetName"); -//console.log(ele.value); -var control = SocialCalc.GetCurrentWorkBookControl(); -if (ele.value.length == 0) { - ele.focus(); - return; -} -var oldname = control.currentSheetButton.value; -var newname = ele.value; -if(newname.indexOf(" ")!=-1) { - alert("A space was found in the new name. Please ensure that the new name has no sapces"); - return; - } -SocialCalc.WorkBookControlRenameSheetHide(); -// verify newname does not clash with any existing sheet name -// if so reject -var smallname = newname.toLowerCase();//converting to lower case to normalise -//console.log(smallname + " old " + ele.value); -for (var sheet in workbook.sheetArr) { - console.log(workbook.sheetArr[sheet].sheet.sheetname);//checking in sheetarr for repeated names - if (workbook.sheetArr[sheet].sheet.sheetname == smallname) { - alert(newname+" already exists"); - return; - } - } // variation of Case in letters of a sheet name will give an error if smallname is used. - -control.currentSheetButton.value = smallname; - -SocialCalc.SheetBarButtonSetName (control.currentSheetButton.id, newname); - -// perform a rename for formula references to this sheet in all the -// sheets in the workbook -control.workbook.RenameWorkBookSheet(oldname, smallname, control.currentSheetButton.id); - - var cmdstr = "rensheet "+control.currentSheetButton.id+" "+oldname+" "+newname; - //console.log(cmdstr); - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - -} - -SocialCalc.WorkBookControlRenameSheetRemote = function(sheetid, oldname, newname) { - //console.log("rename sheet ",sheetid, oldname, newname) - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById("fooBar"); - var renbutton = document.getElementById(sheetid); - - renbutton.value = newname; - - SocialCalc.SheetBarButtonSetName(sheetid, newname); - -control.workbook.RenameWorkBookSheet(oldname, newname, sheetid); - -} - - -SocialCalc.WorkBookControlCreateNewBook = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // delete all the sheets except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - control.workbook.DeleteWorkBookSheet(control.sheetButtonArr[sheet].id, control.sheetButtonArr[sheet].value); - } - } - // Reset that 1 sheet - - control.workbook.LoadRenameWorkBookSheet(control.currentSheetButton.id, "", control.workbook.defaultsheetname) - - - // delete all the buttons except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.sheetButtonArr[sheet].id); - - var name = current.id; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - control.numSheets = control.numSheets - 1; - } - } - // rename that button - control.currentSheetButton.value = control.workbook.defaultsheetname; - //alert("done new workbook") -} - -SocialCalc.WorkBookControlNewBook = function() { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlCreateNewBook(); - control.workbook.RenderWorkBookSheet(); -} - - -SocialCalc.WorkBookControlMove = function(direction){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - return; - } - var sheetArr = control.sheetButtonArr; - var newSheetArr = {}; - var sheetid = control.currentSheetButton.id; - - var curr_button = document.getElementById(sheetid); - var curr_sb_button = document.getElementById("sbsb-"+sheetid); - var sib_button = null; - var sib_sb_button = null; - if (direction == "left") { - sib_button = curr_button.previousSibling; - sib_sb_button = curr_sb_button.previousSibling; - if(!sib_sb_button) { - alert("Cannot move leftmost Sheet further to the left"); - return; - } - } - else { - sib_button = curr_button.nextSibling; - sib_sb_button = curr_sb_button.nextSibling; - if(!sib_sb_button) { - alert("Cannot move rightmost Sheet further to the right"); - return; - } - } - var currid = sheetid; - var sibid = sib_button.id; - var parent = curr_button.parentNode; - var sb_parent = curr_sb_button.parentNode; - - var cloned = {}; - var clonedsb = {}; - for(button in sheetArr) { - clonedsb[button] = document.getElementById("sbsb-"+button); - cloned[button] = document.getElementById(button); - sb_parent.removeChild(document.getElementById("sbsb-"+button)); - parent.removeChild(document.getElementById(button)); - } - for(button in sheetArr) { - if(button != currid && button != sibid) { - newSheetArr[button] = sheetArr[button]; - sb_parent.appendChild(clonedsb[button]); - parent.appendChild(cloned[button]); - } - else if(button == currid) { - if (direction == "left") { - newSheetArr[currid] = sheetArr[currid]; - newSheetArr[sibid] = sheetArr[sibid]; - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - } else { - newSheetArr[sibid] = sheetArr[sibid]; - newSheetArr[currid] = sheetArr[currid]; - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - } - } - } - control.sheetButtonArr = newSheetArr; - SocialCalc.SheetBarButtonActivate(currid,true); -} - -SocialCalc.WorkBookControlMoveLeft = function(){ - SocialCalc.WorkBookControlMove("left"); -} -SocialCalc.WorkBookControlMoveRight = function(){ - SocialCalc.WorkBookControlMove("right"); -} - - - -SocialCalc.WorkBookControlCopySheet = function(){ - - //alert("in copy"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - control.workbook.CopyWorkBookSheet(control.currentSheetButton.id); - - alert("copied sheet:"+control.currentSheetButton.value); -} - -SocialCalc.WorkBookControlPasteSheet = function() { - - //alert("in paste"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - var oldid = control.currentSheetButton.id; - - SocialCalc.WorkBookControlAddSheet(false); - - var newid = control.currentSheetButton.id; - - //alert(newid+oldid); - - control.workbook.PasteWorkBookSheet(newid, oldid); - - var cmdstr = "addsheetstr"; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr, sheetstr: control.workbook.clipsheet.savestr}); - -} - -SocialCalc.SheetBar = function() { - this.baseDiv = document.getElementById("SocialCalc-sheetbar"); - - this.prebuttonsDiv = document.createElement("div"); - this.prebuttonsDiv.style.cssText = "display:inline;"; - this.prebuttonsDiv.innerHTML="        "; - this.prebuttonsDiv.id = "SocialCalc-sheetbar-prebuttons"; - - this.buttonsDiv = document.createElement("div"); - this.buttonsDiv.id = "SocialCalc-sheetbar-buttons"; - this.buttonsDiv.style.cssText = "display:inline;"; - - this.buttonActionsDiv = document.createElement("div"); - this.buttonActionsDiv.id = "SocialCalc-sheetbar-buttonactions"; - this.buttonActionsDiv.style.display = "inline"; - var addbutton = new SocialCalc.SheetBarSheetButton("sbsba-add", "sbsba-add", this.buttonActionsDiv, - {}, - { - MouseDown:function(){var abc=SocialCalc.WorkBookControlAddSheet(true);} - }, - "add-2.png"); - - - this.baseDiv.appendChild(this.prebuttonsDiv); - this.baseDiv.appendChild(this.buttonsDiv); - this.baseDiv.appendChild(this.buttonActionsDiv); -} - -// define a new class for sheetbarsheetbutton - -SocialCalc.SheetBarSheetButton = function(id, name, parentdiv, params, functions, img) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.name = name; - if (!img) { - this.ele.innerHTML = name; - this.ele.style.cssText = "font-size:small;display:inline;padding:5px 5px 2px 5px;border:1px solid #000;"; - imgele = document.createElement("img"); - imgele.id = id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - SocialCalc.ButtonRegister(this.ele, params, functions); - SocialCalc.ButtonRegister(imgele, params, functions); - } else { - var imgele = document.createElement("img"); - imgele.src = SocialCalc.Constants.defaultImagePrefix +img; - imgele.style.cssText = "width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - this.ele.style.cssText = "display:inline;padding:5px 5px 2px 5px;"; - SocialCalc.ButtonRegister(imgele, params, functions); - } - parentdiv.appendChild(this.ele); -} - -SocialCalc.SheetBarButtonActivate = function(id, active) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.isactive = active; - if (active) { - sbbutton.style.backgroundColor = "#FFF"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (!imgele) { - imgele = document.createElement("img"); - imgele.id = "sbsb-"+id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - } - sbbutton.appendChild(imgele); - SocialCalc.ButtonRegister(imgele, {}, { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(id);}, - Repeat:function(){}, - Disabled: function() {} - } ); - } - else { - sbbutton.style.backgroundColor = "#CCC"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (imgele) { - sbbutton.removeChild(imgele); - } - } - var menu = document.getElementById("sbsb-menu"); - if (menu && menu.style.display != "none") { - menu.style.display = "none"; - } -} - -SocialCalc.SheetBarButtonSetName = function(id, name) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.name = name; - sbbutton.innerHTML = name; - if (sbbutton.isactive) { - SocialCalc.SheetBarButtonActivate(id, true); - } -} - - -SocialCalc.SheetBarSheetButtonPress = function(id) { - //console.log("button press") - var sbbutton = document.getElementById("sbsb-"+id); - if (sbbutton && sbbutton.isactive) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) { - var sbsbm = new SocialCalc.SheetBarSheetButtonMenu("sbsb-menu", id); - } else { - menu.clickedsheetid = id; - if (menu.style.display == "none") { - menu.style.display = "inline"; - SocialCalc.SheetBarSheetButtonMenuPosition(menu, id); - } else { - menu.style.display = "none"; - } - } - - } else if (sbbutton) { - SocialCalc.WorkBookControlActivateSheet(id); - } - -} - - -// define a new class for sheetbarsheet button menu item - -SocialCalc.SheetBarSheetButtonMenuItem = function(id, t) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.innerHTML = t; - this.ele.className = ""; - this.ele.style.cssText = "padding:3px 4px;width:100px;height:20px;background-color:#FFF;"; - - var params = { - normalstyle: "backgroundColor:#FFF;", - downstyle: "backgroundColor:#CCC;", - hoverstyle: "backgroundColor:#CCC;"}; - var functions = {MouseDown:function(){SocialCalc.SheetBarMenuItemPress(id);}, - Repeat:function(){}, - Disabled: function() {}}; - - SocialCalc.ButtonRegister(this.ele, params, functions); - - SocialCalc.TouchRegister(this.ele, {SingleTap:functions.MouseDown}); - - return this.ele; - -} - -SocialCalc.SheetBarMenuItemPress = function(id) { - - var menu = document.getElementById("sbsb-menu"); - if (!menu) return; - - var clickedsheetid = menu.clickedsheetid; - - switch(id) { - case "sbsb_deletesheet": - //console.log("delete "+clickedsheetid); - SocialCalc.WorkBookControlDelSheet(); - break; - case "sbsb_hidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlHideSheet(); - break; - case "sbsb_unhidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlUnhideSheet(); - break; - case "sbsb_copysheet": - //console.log("copy "+clickedsheetid); - SocialCalc.WorkBookControlCopySheet(); - break; - case "sbsb_moveleft": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveLeft(); - break; - case "sbsb_moveright": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveRight(); - break; - - case "sbsb_pastesheet": - //console.log("paste "+clickedsheetid); - SocialCalc.WorkBookControlPasteSheet(); - break; - case "sbsb_renamesheet": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlRenameSheet(); - break; - case "sbsb_closemenu": - //console.log("rename "+clickedsheetid); - menu.style.display = "none"; - break; - default: - break; - } - menu.style.display = "none"; - -} - -// define a new class for sheetbarsheet button menu -SocialCalc.SheetBarSheetButtonMenu = function(id, clickedsheetid) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.className = ""; - this.ele.clickedsheetid = clickedsheetid; - this.ele.style.cssText = "border:1px solid #000;position:absolute;top:200px;left:0px;width=100px;z-index:120"; - - var ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_deletesheet"," Delete Sheet"); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_hidesheet"," Hide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_unhidesheet"," Unhide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_renamesheet"," Rename Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveleft"," Move Left "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveright"," Move Right "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_copysheet"," Copy Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_pastesheet"," Paste Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_closemenu"," Cancel"); - this.ele.appendChild(ele1); - - - SocialCalc.SheetBarSheetButtonMenuPosition(this.ele, clickedsheetid); - - //var clickedsheet = document.getElementById(clickedsheetid); - //var position = SocialCalc.GetElementPosition(clickedsheet); - //console.log(clickedsheet.offsetHeight,clickedsheet.offsetWidth,clickedsheet.offsetLeft, clickedsheet.offsetTop); - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.editor.toplevel.appendChild(this.ele); - - - - - -} - -// position the sheet menu -SocialCalc.SheetBarSheetButtonMenuPosition = function(menu, clickedsheetid) { - - var hlessbutton = document.getElementById("te_lessbuttonh"); - - //console.log(hlessbutton.style.top, hlessbutton.style.left); - - var sbbutton = document.getElementById("sbsb-"+clickedsheetid); - - //console.log(sbbutton.offsetLeft,clickedsheetid); - - var top = hlessbutton.style.top.slice(0,-2)-220; - var left = sbbutton.offsetLeft+7; - - menu.style.top = top+"px"; - menu.style.left = left+"px"; - - //console.log(menu.style.top, menu.style.left); -} - -SocialCalc.ScriptInfo = { - scripts : {}, - handle:null -}; - -SocialCalc.ScriptCheck = function(sheetid, coord, text) { -var commentstart = text.indexOf(""); -if ((commentstart != -1) && (commentend != -1)) { - script = text.slice(commentstart+10,commentend); - //alert(script); - SocialCalc.ScriptInfo.scripts[coord] = script; - if (SocialCalc.ScriptInfo.handle == null) { - SocialCalc.ScriptInfo.handle = - window.setTimeout(SocialCalc.EvalUserScripts,500); - } - //alert(coord+"-"+sheetid); -} -} - -SocialCalc.EvalUserScript = function(data) { - var head = document.getElementsByTagName("head")[0] || - document.documentElement; - - if (data == "") return; - - var script = document.createElement("script"); - - script.type = "text/javascript"; - try { - // doesn't work on ie... - script.appendChild(document.createTextNode(data)); - } catch(e) { - // IE has funky script nodes - script.text = data; - } - - head.insertBefore(script, head.firstChild); - head.removeChild(script); -} - -SocialCalc.EvalUserScripts = function() { -for (var cr in SocialCalc.ScriptInfo.scripts) { - SocialCalc.EvalUserScript(SocialCalc.ScriptInfo.scripts[cr]); - //console.log(cr,SocialCalc.ScriptInfo.scripts[cr]) -} -SocialCalc.ScriptInfo.handle = null; -SocialCalc.ScriptInfo.scripts = {}; -} - -SocialCalc.CallOutOnRenderCell = function(sheetobj, value, cr) { -var cell=sheetobj.cells[cr]; -if (!cell) return; -var valuetype = cell.valuetype || ""; // get type of value to determine formatting -var valuesubtype = valuetype.substring(1); -var sheetattribs=sheetobj.attribs; -valuetype = valuetype.charAt(0); -if (valuetype=="t") { - valueformat = sheetobj.valueformats[cell.textvalueformat-0] || sheetobj.valueformats[sheetattribs.defaulttextvalueformat-0] || ""; - if (valueformat == "text-html") {SocialCalc.ScriptCheck(sheetobj.sheetid,cr,value);} -} -} - -SocialCalc.GetCellDataValue = function(coord) { - - var sheetname = null; - var sheetid = ""; - var bindex = coord.indexOf("!"); - if (bindex != -1) { - sheetname = coord.slice(0,bindex); - coord = coord.slice(bindex+1); - //console.log(sheetname,coord) - } - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (sheetname == null) { - sheetid = control.currentSheetButton.id - } else { - sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - } - - if ((sheetid == null) || (sheetid == "")) { - return "0"; - } - - var sheetobj = control.workbook.sheetArr[sheetid].sheet - - var cell = sheetobj.cells[coord] - - if (cell) {return cell.datavalue;} else {return 0;} -} - -SocialCalc.GetCellDataArray = function(coordstr,sheetname) { - var vals = [] - var coords = coordstr.split(","); - if (sheetname == null) { sheetname=""; } - else { - sheetname = sheetname+"!"; - } - for (var c in coords) { - - vals.push(SocialCalc.GetCellDataValue(sheetname+coords[c])); - } - return vals; -} - -SocialCalc.UserScriptData = {} - - -SocialCalc.WorkBookRecalculateInfo = { - sheets : [], - calcorder: [], - current: 0, - pass: 0 -}; - -SocialCalc.WorkBookRecalculateAll = function() { - // do it from the last sheet to the first sheet - // using the recalc-done signal to trigger the next sheet - - // if already in the middle of a recalculate-all, ignore this. - if ((SocialCalc.WorkBookRecalculateInfo.current != 0) || - (SocialCalc.WorkBookRecalculateInfo.calcorder.length != 0) || - (SocialCalc.WorkBookRecalculateInfo.sheets.length != 0)) { - return; - } - - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - SocialCalc.WorkBookRecalculateInfo.current = 0; - - for (var sheet in control.workbook.sheetArr) { - SocialCalc.WorkBookRecalculateInfo.sheets.push(sheet); - } - - var i = 0; - for (var c=SocialCalc.WorkBookRecalculateInfo.sheets.length; - c>0; c--) { - SocialCalc.WorkBookRecalculateInfo.calcorder[i] = - SocialCalc.WorkBookRecalculateInfo.sheets[c-1]; - i++; - } - - $.mobile.showPageLoadingMsg(); - window.setTimeout(SocialCalc.WorkBookRecalculateStep,500); -} - -SocialCalc.WorkBookRecalculateStep = function() { - if (SocialCalc.WorkBookRecalculateInfo.current == - SocialCalc.WorkBookRecalculateInfo.calcorder.length) { - SocialCalc.WorkBookRecalculateInfo.current = 0; - SocialCalc.WorkBookRecalculateInfo.calcorder = []; - SocialCalc.WorkBookRecalculateInfo.sheets = []; - if (SocialCalc.WorkBookRecalculateInfo.pass == - 1) { - SocialCalc.WorkBookRecalculateInfo.pass = 0; - //SocialCalc.SpinnerWaitHide(); - //alert("load done"); - $.mobile.hidePageLoadingMsg(); - - return; - } else { - SocialCalc.WorkBookRecalculateInfo.pass++; - SocialCalc.WorkBookRecalculateAll(); - return; - } - } - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert("recalculate "+ - // SocialCalc.WorkBookRecalculateInfo.calcorder[ - // SocialCalc.WorkBookRecalculateInfo.current] - // ); - var sheetid = -SocialCalc.WorkBookRecalculateInfo.calcorder[ - SocialCalc.WorkBookRecalculateInfo.current]; - SocialCalc.WorkBookControlActivateSheet(sheetid); - SocialCalc.WorkBookRecalculateInfo.current++; - - - window.setTimeout(SocialCalc.WorkBookRecalculateStep,1000); -} - - -SocialCalc.SpinnerWaitCreate = function() { - // if the div exists already just use it - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - return; - } - var main = document.createElement("div"); - main.id = "waitloadingspinner"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - main.style.top = (vp.height/2)+"px"; - main.style.left = (vp.width/2)+"px"; - main.style.zIndex = 110; - - main.style.width='50px' - main.style.height = '50px' - main.innerHTML = 'Loading...'; - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.SpinnerWaitHide = function() { - // if the div exists already just use it - -var ele = document.getElementById("waitloadingspinner"); -if (ele) { - ele.innerHTML = ""; - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} -} - -SocialCalc.EditableCells = {}; -SocialCalc.EditableCells.allow = false; -SocialCalc.EditableCells.cells = {}; - -SocialCalc.Callbacks.IsCoordEditable = function(sheetcoord) { - if (!(SocialCalc.EditableCells.allow)) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[sheetcoord]) { - // by default all cells are editable - return true; - } - - return false; -} - -SocialCalc.Callbacks.IsCellEditable = function(editor) { - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - if (!(SocialCalc.EditableCells.allow)) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[cellname]) { - // by default all cells are editable - return true; - } - - return false; -} - -SocialCalc.IsScrollPossible = function(lastrow, lastcol, - curr_vpos, curr_hpos, - vamount, hamount - ) { - //return false; - //console.log(lastrow+","+lastcol); - //console.log(curr_vpos+","+curr_hpos); - //console.log(vamount+","+hamount); - - if (curr_vpos+10+vamount > lastrow ) { - return false; - } - if (curr_hpos+hamount > lastcol) { - return false; - } - return true; -} - - -SocialCalc.Callbacks.CheckConstraints = function(editor, value) -{ - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - if (!SocialCalc.EditableCells.constraints) {return true;}; - var constraint = SocialCalc.EditableCells.constraints[cellname]; - //alert(JSON.stringify(constraint)) - if (constraint != null) { - switch (constraint[0]) { - case "numeric": - // check that value is numeric - var val = parseInt(value); - var low = parseInt(constraint[1]); - var high = parseInt(constraint[2]); - var text = ""; - if (constraint.length > 3) { - text = constraint[3]; - } - console.log(val+" "+text+","+high); - - if (isNaN(val)) { - var msg = "please input a number"; - window.plugins.Prompt.show( - msg, - saveAsCancel, - saveAsCancel, - "nope", // ok button title - not used - "OK", // cancel button title - "no" - ); - return false; - } - - if (val < low) { - var msg = text +" must be at least "+low; - window.plugins.Prompt.show( - msg, - saveAsCancel, - saveAsCancel, - "nope", // ok button title - not used - "OK", // cancel button title - "no" - ); - - return false; - } - - if (val > high) { - var msg = text + " must be atmost "+high; - window.plugins.Prompt.show( - msg, - saveAsCancel, - saveAsCancel, - "nope", // ok button title - not used - "OK", // cancel button title - "no" - ); - - return false; - } - if (Aspiring.appSpecificInputValidation && !Aspiring.appSpecificInputValidation(cellname, val)) { - return false; - } - break; - case "float": - var val = parseFloat(value); - var low = parseFloat(constraint[1]); - var high = parseFloat(constraint[2]); - var text = ""; - if (constraint.length > 3) { - text = constraint[3]; - } - //alert(val) - if (isNaN(val)) { - var msg = "please input a number"; - window.plugins.Prompt.show( - msg, - saveAsCancel, - saveAsCancel, - "nope", // ok button title - not used - "OK", // cancel button title - "no" - ); - return false; - - } - if (val < low) { - var msg = text +" must be at least "+low; - window.plugins.Prompt.show( - msg, - saveAsCancel, - saveAsCancel, - "nope", // ok button title - not used - "OK", // cancel button title - "no" - ); - - return false; - - } - if (val > high) { - var msg = text + " must be atmost "+high; - window.plugins.Prompt.show( - msg, - saveAsCancel, - saveAsCancel, - "nope", // ok button title - not used - "OK", // cancel button title - "no" - ); - - return false; - - } - if (Aspiring.appSpecificInputValidation && !Aspiring.appSpecificInputValidation(cellname, val)) { - return false; - } - break; - case "percent": - break; - } - } - return true; -} - - -// this is for checkmark toggling -SocialCalc.Callbacks.ToggleCell = function(cellname){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - var sheetid = control.currentSheetButton.id; - var sheetobj = control.workbook.sheetArr[sheetid].sheet; - var cell = sheetobj.cells[cellname]; - var sheetname = sheetobj.sheetname; - - // check if cell is in constraints - - - var constraint = SocialCalc.EditableCells.constraints[sheetname+"!"+cellname]; - if (!constraint || (constraint[0] != "tc")) { - return; - } - - // console.log(sheetname); - // console.log(cellname); - - var cellinner = document.getElementById("cell_"+cellname) - - - - if ((cellinner.innerHTML.indexOf(" ") != -1)) { - // set the value to the img value - cellinner.innerHTML = '
    ' - if (cell) {//cell.displaystring = '
    ' ; - //cell.datavalue = '
    ' ; - //console.log("found cell") - cell.displaystring = '
    ' ; - cell.datavalue = '
    ' ; - //http://img689.imageshack.us/img689/9234/checkmark.png - } - } - else { - // set the value to a space - cellinner.innerHTML = "
     
    "; - if (cell) {cell.datavalue = "
     
    ";cell.displaystring = "
     
    ";} - } - -} - -SocialCalc.WorkbookControlCreateSheetHTML = function(sheetlist) { - - var context, div, ele; - - var result = ""; - - var control = SocialCalc.GetCurrentWorkBookControl(); - - div = document.createElement("div"); - - if (!sheetlist) { - context = new SocialCalc.RenderContext(spreadsheet.sheet); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - } else { - for (var sheetid in sheetlist) { - //console.log("getting html for "+sheetid) - context = new SocialCalc.RenderContext(control.workbook.sheetArr[sheetid].sheet); - ele = context.RenderSheet(null, {type: "html"}); - delete context; - div.appendChild(ele); - } - } - - result = div.innerHTML; - delete ele; - delete div; - //console.log(result); - return result; - -} - - -SocialCalc.GetSheetFromCoord = function(crd, sheetobj) { - var bindex = crd.indexOf("!"); - var sheetname = null; - if (bindex != -1) { - sheetname = crd.slice(0,bindex); - var control = SocialCalc.GetCurrentWorkBookControl(); - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname.toLowerCase()); - if ((sheetid == null) || (sheetid == "")) { - return sheetobj; - } - return control.workbook.sheetArr[sheetid].sheet; - } - return sheetobj; -}; -SocialCalc.GetCellFromCoord = function(crd, sheetobj) { - var bindex = crd.indexOf("!"); - var sheetname = null; - if (bindex != -1) { - sheetname = crd.slice(0,bindex); - crd = crd.slice(bindex+1); - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname.toLowerCase()); - - if ((sheetid == null) || (sheetid == "")) { - return null; - } - sheetobj = control.workbook.sheetArr[sheetid].sheet; - } - return sheetobj.cells[crd]; -}; - - - - - - - - - - - diff --git a/DeveloperAdoption/public/static/runappios43c/lib/dropbox/OAuthSimple.js b/DeveloperAdoption/public/static/runappios43c/lib/dropbox/OAuthSimple.js deleted file mode 100644 index f2b9c94..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/dropbox/OAuthSimple.js +++ /dev/null @@ -1,477 +0,0 @@ -/* OAuthSimple - * A simpler version of OAuth - * - * author: jr conlin - * mail: src@anticipatr.com - * copyright: unitedHeroes.net - * version: 1.2 - * url: http://unitedHeroes.net/OAuthSimple - * - * Copyright (c) 2011, unitedHeroes.net - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the unitedHeroes.net nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY UNITEDHEROES.NET ''AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL UNITEDHEROES.NET BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -var OAuthSimple; - -if (OAuthSimple === undefined) -{ - /* Simple OAuth - * - * This class only builds the OAuth elements, it does not do the actual - * transmission or reception of the tokens. It does not validate elements - * of the token. It is for client use only. - * - * api_key is the API key, also known as the OAuth consumer key - * shared_secret is the shared secret (duh). - * - * Both the api_key and shared_secret are generally provided by the site - * offering OAuth services. You need to specify them at object creation - * because nobody ing uses OAuth without that minimal set of - * signatures. - * - * If you want to use the higher order security that comes from the - * OAuth token (sorry, I don't provide the functions to fetch that because - * sites aren't horribly consistent about how they offer that), you need to - * pass those in either with .signatures() or as an argument to the - * .sign() or .getHeaderString() functions. - * - * Example: - - var oauthObject = OAuthSimple().sign({path:'http://example.com/rest/', - parameters: 'foo=bar&gorp=banana', - signatures:{ - api_key:'12345abcd', - shared_secret:'xyz-5309' - }}); - document.getElementById('someLink').href=oauthObject.signed_url; - - * - * that will sign as a "GET" using "SHA1-MAC" the url. If you need more than - * that, read on, McDuff. - */ - - /** OAuthSimple creator - * - * Create an instance of OAuthSimple - * - * @param api_key {string} The API Key (sometimes referred to as the consumer key) This value is usually supplied by the site you wish to use. - * @param shared_secret (string) The shared secret. This value is also usually provided by the site you wish to use. - */ - OAuthSimple = function (consumer_key,shared_secret) - { -/* if (api_key == undefined) - throw("Missing argument: api_key (oauth_consumer_key) for OAuthSimple. This is usually provided by the hosting site."); - if (shared_secret == undefined) - throw("Missing argument: shared_secret (shared secret) for OAuthSimple. This is usually provided by the hosting site."); -*/ var self = {}; - self._secrets={}; - - - // General configuration options. - if (consumer_key !== undefined) { - self._secrets['consumer_key'] = consumer_key; - } - if (shared_secret !== undefined) { - self._secrets['shared_secret'] = shared_secret; - } - self._default_signature_method= "HMAC-SHA1"; - self._action = "GET"; - self._nonce_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - self._parameters={}; - - - self.reset = function() { - this._parameters={}; - this._path=undefined; - this.sbs=undefined; - return this; - }; - - /** set the parameters either from a hash or a string - * - * @param {string,object} List of parameters for the call, this can either be a URI string (e.g. "foo=bar&gorp=banana" or an object/hash) - */ - self.setParameters = function (parameters) { - if (parameters === undefined) { - parameters = {}; - } - if (typeof(parameters) == 'string') { - parameters=this._parseParameterString(parameters); - } - this._parameters = this._merge(parameters,this._parameters); - if (this._parameters['oauth_nonce'] === undefined) { - this._getNonce(); - } - if (this._parameters['oauth_timestamp'] === undefined) { - this._getTimestamp(); - } - if (this._parameters['oauth_method'] === undefined) { - this.setSignatureMethod(); - } - if (this._parameters['oauth_consumer_key'] === undefined) { - this._getApiKey(); - } - if(this._parameters['oauth_token'] === undefined) { - this._getAccessToken(); - } - if(this._parameters['oauth_version'] === undefined) { - this._parameters['oauth_version']=='1.0'; - } - - return this; - }; - - /** convienence method for setParameters - * - * @param parameters {string,object} See .setParameters - */ - self.setQueryString = function (parameters) { - return this.setParameters(parameters); - }; - - /** Set the target URL (does not include the parameters) - * - * @param path {string} the fully qualified URI (excluding query arguments) (e.g "http://example.org/foo") - */ - self.setURL = function (path) { - if (path == '') { - throw ('No path specified for OAuthSimple.setURL'); - } - this._path = path; - return this; - }; - - /** convienence method for setURL - * - * @param path {string} see .setURL - */ - self.setPath = function(path){ - return this.setURL(path); - }; - - /** set the "action" for the url, (e.g. GET,POST, DELETE, etc.) - * - * @param action {string} HTTP Action word. - */ - self.setAction = function(action) { - if (action === undefined) { - action="GET"; - } - action = action.toUpperCase(); - if (action.match('[^A-Z]')) { - throw ('Invalid action specified for OAuthSimple.setAction'); - } - this._action = action; - return this; - }; - - /** set the signatures (as well as validate the ones you have) - * - * @param signatures {object} object/hash of the token/signature pairs {api_key:, shared_secret:, oauth_token: oauth_secret:} - */ - self.signatures = function(signatures) { - if (signatures) - { - this._secrets = this._merge(signatures,this._secrets); - } - // Aliases - if (this._secrets['api_key']) { - this._secrets.consumer_key = this._secrets.api_key; - } - if (this._secrets['access_token']) { - this._secrets.oauth_token = this._secrets.access_token; - } - if (this._secrets['access_secret']) { - this._secrets.oauth_secret = this._secrets.access_secret; - } - if (this._secrets['oauth_token_secret']) { - this._secrets.oauth_secret = this._secrets.oauth_token_secret; - } - // Gauntlet - if (this._secrets.consumer_key === undefined) { - throw('Missing required consumer_key in OAuthSimple.signatures'); - } - if (this._secrets.shared_secret === undefined) { - throw('Missing required shared_secret in OAuthSimple.signatures'); - } - if ((this._secrets.oauth_token !== undefined) && (this._secrets.oauth_secret === undefined)) { - throw('Missing oauth_secret for supplied oauth_token in OAuthSimple.signatures'); - } - return this; - }; - - self.setTokensAndSecrets = function(signatures) { - return this.signatures(signatures); - }; - - /** set the signature method (currently only Plaintext or SHA-MAC1) - * - * @param method {string} Method of signing the transaction (only PLAINTEXT and SHA-MAC1 allowed for now) - */ - self.setSignatureMethod = function(method) { - if (method === undefined) { - method = this._default_signature_method; - } - //TODO: accept things other than PlainText or SHA-MAC1 - if (method.toUpperCase().match(/(PLAINTEXT|HMAC-SHA1)/) === undefined) { - throw ('Unknown signing method specified for OAuthSimple.setSignatureMethod'); - } - this._parameters['oauth_signature_method']= method.toUpperCase(); - return this; - }; - - /** sign the request - * - * note: all arguments are optional, provided you've set them using the - * other helper functions. - * - * @param args {object} hash of arguments for the call - * {action:, path:, parameters:, method:, signatures:} - * all arguments are optional. - */ - self.sign = function (args) { - if (args === undefined) { - args = {}; - } - // Set any given parameters - if(args['action'] !== undefined) { - this.setAction(args['action']); - } - if (args['path'] !== undefined) { - this.setPath(args['path']); - } - if (args['method'] !== undefined) { - this.setSignatureMethod(args['method']); - } - this.signatures(args['signatures']); - this.setParameters(args['parameters']); - // check the parameters - var normParams = this._normalizedParameters(); - this._parameters['oauth_signature']=this._generateSignature(normParams); - return { - parameters: this._parameters, - signature: this._oauthEscape(this._parameters['oauth_signature']), - signed_url: this._path + '?' + this._normalizedParameters(), - header: this.getHeaderString() - }; - }; - - /** Return a formatted "header" string - * - * NOTE: This doesn't set the "Authorization: " prefix, which is required. - * I don't set it because various set header functions prefer different - * ways to do that. - * - * @param args {object} see .sign - */ - self.getHeaderString = function(args) { - if (this._parameters['oauth_signature'] === undefined) { - this.sign(args); - } - - var j,pName,pLength,result = 'OAuth '; - for (pName in this._parameters) - { - if (pName.match(/^oauth/) === undefined) { - continue; - } - if ((this._parameters[pName]) instanceof Array) - { - pLength = this._parameters[pName].length; - for (j=0;j>16)+(y>>16)+(l>>16);return(m<<16)|(l&0xFFFF);}function _r(n,c){return(n<>>(32-c));}function _c(x,l){x[l>>5]|=0x80<<(24-l%32);x[((l+64>>9)<<4)+15]=l;var w=[80],a=1732584193,b=-271733879,c=-1732584194,d=271733878,e=-1009589776;for(var i=0;i>5]|=(s.charCodeAt(i/8)&m)<<(32-_z-i%32);}return b;}function _h(k,d){var b=_b(k);if(b.length>16){b=_c(b,k.length*_z);}var p=[16],o=[16];for(var i=0;i<16;i++){p[i]=b[i]^0x36363636;o[i]=b[i]^0x5C5C5C5C;}var h=_c(p.concat(_b(d)),512+d.length*_z);return _c(o.concat(h),512+160);}function _n(b){var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s='';for(var i=0;i>2]>>8*(3-i%4))&0xFF)<<16)|(((b[i+1>>2]>>8*(3-(i+1)%4))&0xFF)<<8)|((b[i+2>>2]>>8*(3-(i+2)%4))&0xFF);for(var j=0;j<4;j++){if(i*8+j*6>b.length*32){s+=_p;}else{s+=t.charAt((r>>6*(3-j))&0x3F);}}}return s;}function _x(k,d){return _n(_h(k,d));}return _x(k,d); - } - - - self._normalizedParameters = function() { - var elements = new Array(), - paramNames = [], - i=0, - ra =0; - for (var paramName in this._parameters) - { - if (ra++ > 1000) { - throw('runaway 1'); - } - paramNames.unshift(paramName); - } - paramNames = paramNames.sort(); - pLen = paramNames.length; - for (;i 1000) { - throw('runaway 1'); - } - elements.push(this._oauthEscape(paramName) + '=' + - this._oauthEscape(sorted[j])); - } - continue; - } - elements.push(this._oauthEscape(paramName) + '=' + - this._oauthEscape(this._parameters[paramName])); - } - return elements.join('&'); - }; - - self._generateSignature = function() { - - var secretKey = this._oauthEscape(this._secrets.shared_secret)+'&'+ - this._oauthEscape(this._secrets.oauth_secret); - if (this._parameters['oauth_signature_method'] == 'PLAINTEXT') - { - return secretKey; - } - if (this._parameters['oauth_signature_method'] == 'HMAC-SHA1') - { - var sigString = this._oauthEscape(this._action)+'&'+this._oauthEscape(this._path)+'&'+this._oauthEscape(this._normalizedParameters()); - return this.b64_hmac_sha1(secretKey,sigString); - } - return null; - }; - - self._merge = function(source,target) { - if (source == undefined) - source = {}; - if (target == undefined) - target = {}; - for (var key in source) { - target[key] = source[key]; - } - return target; - } - - return self; - }; -} diff --git a/DeveloperAdoption/public/static/runappios43c/lib/dropbox/dropbox.js b/DeveloperAdoption/public/static/runappios43c/lib/dropbox/dropbox.js deleted file mode 100644 index a3a924a..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/dropbox/dropbox.js +++ /dev/null @@ -1,306 +0,0 @@ -/* * - * Dropbox Javascript API v1.0 * - * Copyright Ayush Goyal 2012 * - * * - * Uses the Javascript OAuth library by Rob Griffiths aka bytespider * - * https://github.com/bytespider/jsOAuth * - * * - * Licensed under the Apache License, Version 2.0 (the "License"); * - * you may not use this file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, software * - * distributed under the License is distributed on an "AS IS" BASIS, * - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * - * See the License for the specific language governing permissions and * - * limitations under the License. */ - -var dropbox = {}; - -//Change to your own Dropbox API keys -dropbox.consumerKey = "v6idq5t8xavq1cz"; -dropbox.consumerSecret = "62mo4p5i2skxzb2"; - -//access Token Epire Limit in milliseconds -accessTokenExpireLimit = 2505600000; - -//Set to "dropbox" if your application has been given full Dropbox folder access -dropbox.accessType = "sandbox"; - -dropbox.htmlAccessStorageKey = "accessTokenKeyIsLooooooooooooooooooongEnough"; -/*-------------------No editing required beneath this line-------------------*/ - -// function to setup dropbox.oauth object -dropbox.setupoauth = function(userEmail,userPass,success,failure){ - - failure = (typeof(failure) == 'function')? failure:dropbox.log; - console.log(userEmail); - console.log(userPass); - var requestURL = "https://api.dropbox.com/1/oauth/request_token"; - var authorizeURL = "https://www.dropbox.com/1/oauth/authorize"; - var accessURL = "https://api.dropbox.com/1/oauth/access_token"; - var loginURL = "https://www.dropbox.com/login"; - - var config = { - requestTokenUrl: requestURL, - authorizationUrl:authorizeURL, - accessTokenUrl: accessURL, - consumerKey : dropbox.consumerKey, - consumerSecret: dropbox.consumerSecret, - }; - - var loginData = { - login_email:userEmail, - login_password: userPass, - login_submit:"Sign in", - }; - console.log(loginData); - - oauth = OAuth(config); - oauth.fetchRequestToken(function(url){ - - //Split OAuth requestToken for later use - try{ - - var requestTokenTemp = url.split('?'); - requestTokenTemp = requestTokenTemp[1].split('&'); - var requestTokenSecret = requestTokenTemp[0].split('='); - requestTokenSecret = requestTokenSecret[1]; - var requestToken = requestTokenTemp[1].split('='); - requestToken = requestToken[1]; - } - catch(error){ - var errorObj = {}; - errorObj.text = '{"error":"Connection could not be established."}'; - failure(errorObj); - return; - } - var accessData={ - oauth_token:requestToken, - oauth_token_secret:requestTokenSecret - }; - - // for testing - console.log(requestToken + " " + requestTokenSecret); - - //Login in dropbox - oauth.post(loginURL,loginData,function(data){ - oauth.get(url,function(data){ - console.log(data); - textString = data.text; - pos = textString.search("TOKEN"); - relevent = textString.slice(pos,pos+40); - pos2 = relevent.search(","); - relevent = relevent.slice(0,pos2); - releventArray = relevent.split("'"); - authorizeToken = releventArray[1] - allowData = {allow_access : "Continue", - oauth_token:requestToken, - t : authorizeToken - } - oauth.post(url,allowData,function(data){ - - //Get Access Token - oauth.post(accessURL,accessData,function(data){ - - //Split OAuth AcessToken for later use - var accessTokenTemp=data["text"].split("&"); - var accessTokenSecret = accessTokenTemp[0].split('='); - accessTokenSecret = accessTokenSecret[1]; - var accessToken = accessTokenTemp[1].split('='); - accessToken = accessToken[1]; - - oauth.setAccessToken(accessToken, accessTokenSecret); - var dateValue = new Date(); - dateValue = dateValue.getTime(); - var accessTokenString = accessToken + '&' + accessTokenSecret + '&' +dateValue; - window.localStorage.setItem(dropbox.htmlAccessStorageKey,accessTokenString); - - //setup OAuth object - dropbox.oauth = oauth; - - //run the success function - if(typeof(success)=="function") - success(); - },failure); - - },failure); - },failure); - },failure); - },failure); -} - -dropbox.setupHtml5Oauth = function(){ - var accessDetails = window.localStorage.getItem(dropbox.htmlAccessStorageKey); - if(accessDetails){ - accessDetails = accessDetails.split('&'); - var config = { - consumerKey : dropbox.consumerKey, - consumerSecret: dropbox.consumerSecret, - }; - - var dateValue = new Date(); - dateValue = dateValue.getTime(); - accessDetails[2] = parseInt(accessDetails[2]); - if(dateValue - accessDetails[2] < accessTokenExpireLimit ){ - var oauth = OAuth(config); - oauth.setAccessToken(accessDetails[0], accessDetails[1]); - dropbox.oauth = oauth; - return true; - } - else{ - window.localStorage.removeItem(dropbox.htmlAccessStorageKey); - return false; - } - } - else - return false; -} - - -//function to get metadata about folder/file from dropbox -dropbox.getMetadata = function(location,success,failure){ - location = (typeof(location) == 'undefined')? null:location; - success = (typeof(success) == 'function')? success:dropbox.log; - failure = (typeof(failure) == 'function')? failure:dropbox.log; - - var metaURL = "https://api.dropbox.com/1/metadata/"+ dropbox.accessType + "/"; - if(location){ - metaURL = metaURL+location; - } - - dropbox.oauth.getJSON(metaURL,success,failure); -} - -//function to get dropbox AccountInfo -dropbox.getAccountInfo = function(){ - var accountInfoURL = "https://api.dropbox.com/1/account/info"; - - dropbox.oauth.getJSON(accountInfoURL,function(data){dropbox.getAccountInfo.Info = data;}, - dropbox.log); - -} - -//function to get contents of a file from dropbox(not download) -dropbox.getFile = function(path,success,failure){ - - success = (typeof(success) == 'function')? success:dropbox.log; - failure = (typeof(failure) == 'function')? failure:dropbox.log; - - - var getURL = "https://api-content.dropbox.com/1/files/"+ dropbox.accessType + "/"; - if(path){ - getURL = getURL+path; - } - dropbox.oauth.get(encodeURI(getURL),success,failure); - -} - -//function to generate download Url of a file from dropbox -dropbox.downloadFile = function(path){ - var getURL = "https://api-content.dropbox.com/1/files/"+ dropbox.accessType + "/"; - if(path){ - getURL = getURL+path; - } - var downloadURL = dropbox.signedUrl(getURL,""); - console.log(downloadURL); - return downloadURL; -} - - -// funtion to upload File -dropbox.uploadFile = function(path,fileObj,overwrite,success,failure){ - - - path = (typeof(path) == 'undefined')? null:path; //path of folder to upload file - - //upload URL - var uploadURL="https://api-content.dropbox.com/1/files_put/"+ dropbox.accessType + "/"; - if (path!= null && path!=""){ - uploadURL = uploadURL + path + '/' + fileObj.name; - } - else{ - uploadURL = uploadURL + fileObj.name; - } - - success = (typeof(success)=="function")?success:dropbox.log; - failure = (typeof(success)=="function")?failure:dropbox.log; - - - var options = { - method: 'PUT', - url: encodeURI(uploadURL), - success: success, - failure: failure, - headers: { - "Content-Type": fileObj.mimeType, - "Content-length": fileObj.length, - "overwrite":overwrite - }, - data: fileObj.string - }; - dropbox.oauth.request(options); - - -} - -//delete URL -dropbox.deletePath = function(path,success,failure){ - - - path = (typeof(path) == 'undefined')? null:path; //path of folder to upload file - success = (typeof(success) == 'function')? success:dropbox.log; - failure = (typeof(failure) == 'function')? failure:dropbox.log; - - //delete URL - var deleteURL="https://api.dropbox.com/1/fileops/delete"; - - if (path!= null && path!=""){ - - var options = { - method: 'POST', - url: encodeURI(deleteURL), - success: success, - failure: dropbox.log, - data: { - "path":path, - "root": dropbox.accessType - } - }; - dropbox.oauth.request(options); - } -} - -// general failure log -dropbox.log = function(data){ - console.log(data); -}; - - -// Get signed oauth url using OAuthSimple Library -dropbox.signedUrl = function(url,argumentsAsString){ - var accessTokenKey = dropbox.oauth.getAccessTokenKey(); - var accessTokenSecret = dropbox.oauth.getAccessTokenSecret(); - var resultUrl =(new OAuthSimple()).sign({path:url, - parameters:argumentsAsString, - signatures:{ - 'consumer_key':dropbox.consumerKey, 'shared_secret':dropbox.consumerSecret, - 'access_token':accessTokenKey,'access_secret':accessTokenSecret}}); - return resultUrl; -} - - -dropbox.file = function (id){ - var fileElement = document.getElementById(id); - - var fileObj = new Object(); - fileObj.name = fileElement.files[0].name; - fileObj.file = fileElement.files[0]; - fileObj.length = fileElement.files[0].size; - fileObj.mimeType = fileElement.files[0].type; - //fileObj.reader = new FileReader(); - //fileObj.reader.readAsBinaryString(fileElement.files[0]); - return fileObj; -} \ No newline at end of file diff --git a/DeveloperAdoption/public/static/runappios43c/lib/dropbox/dropboxHandler.js b/DeveloperAdoption/public/static/runappios43c/lib/dropbox/dropboxHandler.js deleted file mode 100644 index 85839a2..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/dropbox/dropboxHandler.js +++ /dev/null @@ -1,491 +0,0 @@ -dropboxHandler = {}; - -//Not used -// dropboxHandler.getAutheticated = function(success,failure){ -// $.mobile.changePage("dropbox.html"); -// console.log(success); -// console.log(failure); -// $('#dropboxLogin').live('pageshow',function(event){ -// $("#dropboxLoginButton").unbind(); -// $("#password").val(""); -// $("#dropboxLoginButton").click(function(){ -// var userEmail = $("#email").val(); -// var userPass = $("#password").val(); -// console.log(userEmail); -// console.log(userPass); -// $.mobile.pageLoading(); -// dropbox.setupoauth(userEmail,userPass,success,failure); - -// }); -// }); -// }; - -$('#filePage').live( 'pagebeforeshow',function(event){ - if(window.sessionStorage.getItem('dbLogin')) - { - $("#dropboxLoginButton").hide(); - $("#dropboxLogoutButton").show(); - } - else - { - $("#dropboxLoginButton").show(); - $("#dropboxLogoutButton").hide(); - } -}); - -//Get the authorization URL from Dropbox, and redirect the user to that URL, a boolean variable 'dbLogin' will be stored in -//session storage to indicate whether the user is logged in or not, in the onBodyLoad function in the runappios43.html file -dropboxHandler.login = function() { - $.ajax({ - type: 'GET', - url: "/dropbox", - data: {action: 'dropbox-auth-start'}, - dataType: 'json', - success: function(data) { - window.location.replace(data.url); - }, - error: function(e) { - alert("Unable to get auth URL"); - } - }); -}; - -//Delete the dropbox authentication token from cache/cookies and remove the dbLogin boolean variable from sessionStorage -dropboxHandler.logout = function(){ - $.ajax({ - type: 'GET', - url: "/dropbox", - data: {action: 'logout' }, - dataType: 'json', - success: function(data) { - window.sessionStorage.removeItem('dbLogin'); - alert("You have been logged out from dropbox"); - $("#dropboxLoginButton").show(); - $("#dropboxLogoutButton").hide(); - }, - error: function(e) { - alert("Unable to log out from Dropbox"); - } - }); -}; - -//Save the current sheet in dropbox -dropboxHandler.save = function() { - promptConfirm = function(fileStr) { - var fileObj = {}; - fileObj.mimeType = "text/plain"; - fileObj.name = fileStr; - - if (fileObj.name != 'null' && fileObj.name.length < 30){ - - var fileData = SocialCalc.WorkBookControlSaveSheet(); - - //fileObj.name += ".msc.txt"; - fileObj.string = encodeURIComponent(fileData); - // fileObj.length = fileObj.string.length; - - var success = function(){ - $.mobile.pageLoading(true); - alert("File saved in Dropbox"); - }; - - var failure = function(){ - $.mobile.pageLoading(true); - alert("File could not be saved in Dropbox"); - }; - - if(window.sessionStorage.getItem('dbLogin')) { - $.mobile.pageLoading(); - fileObj.action = 'upload'; - $.postJSON('/dropbox', fileObj, success, failure); - } - else - { - alert("Please login to dropbox"); - } - } - else if(fileObj.name.length >=30){ - alert("File name should be less than 30 characters"); - } - - else - { - alert("Invalid file name"); - } - }; - var fileName = window.prompt("Enter File Name"); - if (fileName) - { - promptConfirm(fileName); - } -} - -//Get the list of files in the user's dropbox folder, add them to the list with ID dropboxList, and then redirect to the -//dropboxList.html page -dropboxHandler.populateList = function(){ -$.mobile.pageLoading(); - -dropboxHandler.list = Array(); - success = function(data) { - if(data.contents.length == 0) { - $.mobile.pageLoading(true); - alert("No file in Dropbox"); - $.mobile.changePage('file.html'); - } - else { - for (item in data.contents) { - var str = data.contents[item].path; - // str = str.slice(1,-8); - dropboxHandler.list.push(str); - } - - $.mobile.pageLoading(true); - - $('#dropboxFileList').live( 'pagebeforeshow',function(event){ - $("#dropboxList").empty(); - for (item in dropboxHandler.list){ - var str = dropboxHandler.list[item]; - // console.log(str); - name = str.slice(1,-8) - $("#dropboxList").append( - '
  • '+ - '
    '+ - '
    '+ - '

    '+name+'

    '+ - '
    '+ - '
    '+ - '
    '+ - ''+ - ''+ - ''+ - '
    '+ - '
  • '); - } - $("#dropboxFileList *" ).page(); - $("#dropboxList").listview("refresh"); - //This was missing earlier - $("#dropboxList").show(); - }); - // console.log(dropboxHandler.list); - //this did not work - // $.mobile.changePage("dropboxList.html",{ transition: "pop"}); - - //So I had to do this. This code will replace the runappios43c/file.html?v=xs84c code with runappios43c/dropboxLogin.html - var url = window.location.href; - url = url.slice(0, url.indexOf('runappios43c')); - url += "runappios43c/dropboxList.html"; - // console.log("Final url: "+url); - - // $.mobile.changePage(url,{ transition: "pop"}); - window.location.replace(url); - } - - } - - failure = function (data){ - $.mobile.pageLoading(true); - console.log(data); - errorObj= JSON.parse(data.text); - console.log(errorObj); - errorStr = dropboxHandler.errorString(errorObj.error); - console.log(errorStr); - navigator.notification.alert("Connection was unsuccessful\n" + errorStr,null,applicationName); - alert("Connection was unsuccessful"); - } - - if(window.sessionStorage.getItem('dbLogin')) { - $.mobile.pageLoading(); - var message = {} - message.action = "listdir" - $.postJSON('/dropbox', message, success); - } - else{ - alert("Please login to Dropbox first."); - } -} - - -//This function will load the sheetdata from dropbox, and display it in the web app -dropboxHandler.View= function(str){ - $.mobile.pageLoading(); - success = function(data){ - - var fileContent = data.text; - $.mobile.pageLoading(true); - SocialCalc.WorkBookControlInsertWorkbook(decodeURIComponent(fileContent)); - SocialCalc.GetCurrentWorkBookControl().workbook.spreadsheet.editor.state = "start"; - SocialCalc.GetCurrentWorkBookControl().workbook.spreadsheet.ExecuteCommand('redisplay', ''); - $.mobile.changePage("#indexPage",{ transition: "pop"}); - } - str = decodeURI(str); - // var strFname = str +".msc"; - // var strFname = str +".msc.txt"; - var strFname = str; - console.log(strFname); - - var message = {} - message.action = "view" - message.fname = strFname; - $.postJSON('/dropbox', message, success); -} - -//function to handle delete in fileList -dropboxHandler.Delete = function (str) { - str = decodeURI(str); - - var deleteConfirm = function() { - $.mobile.pageLoading(); - // var fileNameStr = str + ".msc"; - var fileNameStr = str; - success = function(data) { - $.mobile.pageLoading(true); - var filterfunc = function(index) { - if($(this).find('h2').text() == str) - return true; - else - return false; - }; - $("#dropboxList li").filter(filterfunc).remove(); - if($("#dropboxList li").length ==0) { - $("#dropboxList").append('
  • No files in Dropbox
  • '); - } - alert("File deleted!"); - console.log(data); - }; - - failure = function(data) { - $.mobile.pageLoading(true); - alert("File could not be deleted"); - console.log(data); - }; - - var message = {} - message.action = "delete" - message.fname = fileNameStr; - - $.ajax({ - url: '/dropbox', - type: 'POST', - data: message, - dataType: 'json', - success: success, - error: failure - }); - } - - var confirm = window.confirm("Are you sure you want to delete the file '"+str+"' from Dropbox?"); - if (confirm) - { - deleteConfirm(); - } -}; - -dropboxHandler.saveLocal = function(str){ - $.mobile.pageLoading(); - var success = function(data) { - - var fileContent = data.text; - $.mobile.pageLoading(true); - // window.localStorage.setItem(str ,fileContent); - // cloud save the file !! - if (strFname[0] == '/') - { - strFname = strFname.slice(1, strFname.length); - } - if (strFname.indexOf('.msc')) - { - strFname = strFname.slice(0, strFname.indexOf('.msc')); - } - console.log("Saving as: "+strFname); - var message = {} - message.action = "savefile" - message.appname = Aspiring.appname - message.fname = strFname - message.data = fileContent - - $.postJSON("/webapp", message, function(response) { - result = response["result"] - if (result == "ok") { - // set the top right file to selected file - updateFileName(strFname); - alert("Saved "+strFname) - } else { - alert("Save failed "+strFname) - } - }); - // alert("File moved to local storage successfully"); - } - - var failure = function(data) { - $.mobile.pageLoading(true); - alert("File could not be saved"); - console.log(data); - }; - - // dropbox.getFile(strFname,success); - str = decodeURI(str); - // var strFname = str +".msc"; - // var strFname = str +".msc.txt"; - var strFname = str; - // console.log(strFname); - - var message = {} - message.action = "view" - message.fname = strFname; - $.postJSON('/dropbox', message, success); -} - -dropboxHandler.saveLocalPage = function() { - - $('#dropboxSaveList').live( 'pagebeforeshow',function(event) { - $("#dropboxCheckList").empty(); - var fieldElement = $('
    '); - for (item in dropboxHandler.list) { - var str = dropboxHandler.list[item]; - var checkboxElement = $(''+ - ''); - fieldElement.append(checkboxElement); - } - var divElement = $('
    '); - divElement.append(fieldElement); - divElement.page(); - $("#dropboxCheckList").append(divElement).trigger('create'); - }); - $.mobile.changePage("dropboxSaveLocal.html"); - //var url = window.location.href; - //url = url.slice(0, url.indexOf('runappios43c')); - //url += "runappios43c/dropboxSaveLocal.html"; - - //window.location.replace(url); - -}; - -dropboxHandler.saveLocalMultiple = function(str){ - $.mobile.pageLoading(); - var fileNames = []; - - $("#dropboxCheckList :checked").each( - function(index){ - var fileName = encodeURI($(this).attr("id").slice(9)); - // fileName = fileName + ".msc"; - fileNames.push(fileName); - }); - - dropboxHandler.recursiveSave(fileNames); - -} - -dropboxHandler.recursiveSave= function(fileNames){ - - if(fileNames.length!=0) { - var strFname = fileNames.pop(); - // dropbox.getFile(fileName,function(data){ - // var fileContent = data.text; - // var str = fileName.slice(0,-4); - // window.localStorage.setItem(str,fileContent); - // dropboxHandler.recursiveSave(fileNames); - // },function(data){ - // $.mobile.pageLoading(true); - // // navigator.notification.alert("Error occured while saving file",null,applicationName); - // alert("Error occured while saving file"); - // console.log(data); - // }); - - $.mobile.pageLoading(); - var success = function(data) { - console.log(data); - var fileContent = data.text; - $.mobile.pageLoading(true); - // window.localStorage.setItem(str ,fileContent); - // cloud save the file !! - if (strFname[0] == '/') - { - strFname = strFname.slice(1, strFname.length); - } - if (strFname.indexOf('.msc')) - { - strFname = strFname.slice(0, strFname.indexOf('.msc')); - } - console.log("Saving as: "+strFname); - var message = {} - message.action = "savefile" - message.appname = Aspiring.appname - message.fname = strFname - message.data = fileContent - console.log("Saving file "+strFname+" in cloud"); - - $.ajax({ - url: '/webapp', - type: 'POST', - data: message, - dataType: 'json', - success: function (response) { - if (response) - { - result = response["result"] - if (result == "ok") { - // set the top right file to selected file - updateFileName(strFname); - alert("Saved "+strFname); - dropboxHandler.recursiveSave(fileNames); - } else { - alert("Save failed "+strFname); - dropboxHandler.recursiveSave(fileNames); - } - } - else - { - alert("Unable to save file: "+strFname); - } - }, - error: function (e) { - alert("Save failed "+strFname); - dropboxHandler.recursiveSave(fileNames); - } - }); - } - - var failure = function(data) { - $.mobile.pageLoading(true); - alert("File could not be saved"); - console.log(data); - }; - - strFname = decodeURI(strFname); - // var strFname = fileName +".msc"; - // var strFname = fileName +".msc.txt"; - // var strFname = fileName; - - var message = {} - message.action = "view" - message.fname = strFname; - console.log("Getting file "+strFname+" from dropbox"); - console.log(message); - - $.ajax({ - url: '/dropbox', - type: 'POST', - data: message, - dataType: 'json', - success: success, - error: failure - }); - - } - else{ - $.mobile.pageLoading(true); - // navigator.notification.alert("Files saved successfully",null,applicationName); - alert("Files saved successfully"); - } -} - -dropboxHandler.errorString = function(str){ - if(str == "Token is not an authorized request token."){ - return "Login Error"; - } - if(str == "Connection could not be established."){ - return "Connection could not be established. Check your Internet Connectivity."; - } - - return "Undefined Error"; -} \ No newline at end of file diff --git a/DeveloperAdoption/public/static/runappios43c/lib/dropbox/dropboxHandler_amazon.js b/DeveloperAdoption/public/static/runappios43c/lib/dropbox/dropboxHandler_amazon.js deleted file mode 100644 index 8d7e2f5..0000000 --- a/DeveloperAdoption/public/static/runappios43c/lib/dropbox/dropboxHandler_amazon.js +++ /dev/null @@ -1,562 +0,0 @@ -dropboxHandler = {}; - - -$('#dropboxlogin').live( 'pagebeforeshow',function(event){ - - var ele = document.getElementById("dropboxiframe") - ele.innerHTML = ''; -} -function GraphHorizontalBar(spreadsheet, range, gview, gtype, helpflag) { - - var maxheight, totalwidth, color, nitems, byrow, maxval, minval, i, cr, cr1, cell, val, extra, eachwidth, str, thisbar; - var values = []; - var labels = []; - - if (helpflag || !range) { - str = '

    '+ - 'This is the help text for graph type: '+SocialCalc.GraphTypesInfo[gtype].display+'.

    '+ - 'The Graph tab displays a very simple bar graph representation of the cells currently selected as a range to graph '+ - '(either in a single row across or column down). '+ - 'If the range is a single row or column, and if the row above (or column to the left) has values, those values are used as labels. '+ - 'Otherwise the cell coordinates are used (e.g., B5). '+ - 'This is a very early, minimal implementation for demonstration purposes. '+ - '

    '; - - gview.innerHTML = str; - - return; - } - - if (range.left==range.right) { // down - nitems = range.bottom - range.top + 1; - byrow = true; - } - else { - nitems = range.right - range.left + 1; - byrow = false; - } - - str = ""; - - maxheight = (spreadsheet.height-spreadsheet.nonviewheight)-50; - totalwidth = spreadsheet.width-30; - minval = null; - maxval = null; - - for (i=0; ival) minval = val; - values.push(val); - cell = spreadsheet.sheet.GetAssuredCell(cr1); - if ((range.right==range.left || range.top==range.bottom) && (cell.valuetype.charAt(0) == "t" || cell.valuetype.charAt(0) == "n")) { - labels.push(cell.datavalue+""); - } - else { - labels.push(val+""); - } - } - } - if(maxval < 0){ maxval = 0; } - if(minval > 0){ minval = 0; } - str = '
    '; - gview.innerHTML = str; - var profChartVals = new Array(); - var profChartLabels = new Array(); - - var canv = document.getElementById("myBarCanvas"); - var ctx = canv.getContext('2d'); - //deprecated mozTextStyle is used by the laptop's rendering engine - ctx.mozTextStyle = "10pt bold Arial"; - var maxheight = canv.height - 60; - totalwidth = canv.width; - var colors = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]; - var barColor= colors[Math.round(Math.random()*14)] + '' + colors[Math.round(Math.random()*14)] + ''+ colors[Math.round(Math.random()*14)]+ '' + colors[Math.round(Math.random()*14)]+ '' + colors[Math.round(Math.random()*14)]+ '' + colors[Math.round(Math.random()*14)]; - ctx.fillStyle = "#" + barColor; - var colorList = [barColor]; - eachwidth = Math.floor(maxheight / (values.length || 1))-4 || 1; - var zeroLine = totalwidth * (maxval / (maxval-minval)) - 5; - zeroLine = canv.width - zeroLine + 40; - ctx.lineWidth = 5; - ctx.moveTo(zeroLine,0); - ctx.lineTo(zeroLine,canv.height); - ctx.stroke(); - var yScale = totalwidth / (maxval-minval) * 4.4/5; - for (i=0; i 0){ - ctx.translate(zeroLine-22,45); - } - else{ - ctx.translate(zeroLine+15,45); - } - ctx.mozDrawText(labels[0]); - for (i=1; i 0)&&(values[i-1] < 0)){ - ctx.translate(-37,eachwidth); - } - else{ - if((values[i] < 0)&&(values[i-1] > 0)){ - ctx.translate(37,eachwidth); - } - else{ - ctx.translate(0,eachwidth); - } - } - ctx.mozDrawText(labels[i]); - } - - //order a Google Charts API image - var gChart = document.getElementById("googleBarChart"); - var zeroLine = (-1*minval) * yScale / (canv.width); - profChartUrl = 'chs=300x250&cht=bhs&chd=t:' + profChartVals.join(",") + "&chxt=x,y&chxl=1:|" + profChartLabels.reverse().join("|") + "|&chxr=0," + minval + "," + maxval + "&chp=" + zeroLine + "&chbh=a&chm=r,000000,0," + zeroLine + "," + (zeroLine + 0.005) + "&chco=" + colorList.join("|"); - gChart.innerHTML = ''; -} - -function MakePieChart(spreadsheet, range, gview, gtype, helpflag){ - var maxheight, totalwidth, color, nitems, byrow, maxval, minval, i, cr, cr1, cell, val, extra, eachwidth, str, thisbar; - var values = []; - var labels = []; - var total = 0; - - // collect the selected values and labels - if (range.left==range.right) { // down - nitems = range.bottom - range.top + 1; - byrow = true; - } - else { - nitems = range.right - range.left + 1; - byrow = false; - } - - // find total to be distributed over 2 Pi radians - for (i=0; i 1.5)&&(centralRad < 4.6)){ leftBias = 55; } - - ctx.translate(centerX + Math.cos(centralRad) * textRad - leftBias, centerY + Math.sin(centralRad) * textRad); - //deprecated mozDrawText is needed for the laptop's rendering engine - ctx.mozDrawText(labels[i] + " (" + Math.round(values[i]/total*100) + "%)"); - //this operation allows canvas to continue drawing - ctx.translate(-1*centerX - Math.cos(centralRad)*textRad + leftBias,-1*centerY - Math.sin(centralRad) * textRad); - ctx.fillRect(1,1,1,1); - ctx.closePath(); - profChartLabels += "|" + labels[i]; - - //prepare for next arc - lastStart += arcRads; - } - //replace HTML canvas with its PNG image - var realCanv = document.getElementById("canvImg"); - realCanv.src = canv.toDataURL(); - - //request a Google Charts API image - var gChart = document.getElementById("googleChart"); - profChartUrl = 'chs=300x145&cht=p&chd=t:' + profChartUrl.substring(1) + '&chl=' + profChartLabels.substring(1); - gChart.innerHTML = ''; -} - -function MakeLineChart(spreadsheet, range, gview, gtype, helpflag, isResize){ - var nitems, byrow, maxval, minval, i, cr, cr1, cell, val, extra, str, maxX, minX; - var values = []; - var labels = []; - var total = 0; - var colors = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]; - var shapes = ["s","o","c"]; - - // collect the selected values and labels - if (range.left==range.right) { // down - nitems = range.bottom - range.top + 1; - byrow = true; - } - else { - nitems = range.right - range.left + 1; - byrow = false; - } - - //if the user has set the min/max values, use them - if(isResize){ - try{ minX = 1 * document.getElementById("SocialCalc-graphMinX").value; } - catch(e){ minX = null; } - try{ maxX = 1 * document.getElementById("SocialCalc-graphMaxX").value; } - catch(e){ maxX = null; } - try{ minval = 1 * document.getElementById("SocialCalc-graphMinY").value; } - catch(e){ minval = null; } - try{ maxval = 1 * document.getElementById("SocialCalc-graphMaxY").value; } - catch(e){ maxval = null; } - } - - var evenlySpaced = false; - for (i=0; ival) && !isResize){ minval = val; } - values.push(val); - cell = spreadsheet.sheet.GetAssuredCell(cr1); - if ((range.right==range.left || range.top==range.bottom) && (cell.valuetype.charAt(0) == "t" || cell.valuetype.charAt(0) == "n")) { - labels.push(cell.datavalue+""); - if ((maxX==null || maxXcell.datavalue) && !isResize){ minX = cell.datavalue; } - } - else { - labels.push(cr); - evenlySpaced = true; - } - } - } - // create evenly-spaced X values if none were given - if(evenlySpaced){ - for(var i=0; i (labels[i-1] * 1)){ - //draw line to the next point - ctx.moveTo(lastX,topY-lastY); - ctx.lineTo((scaleFactorX * (labels[i] - minX)) + 20, topY-(scaleFactorY * (values[i] - minval) + 20)); - ctx.stroke(); - } - else{ - //start a new line - drawColor = "#" + colors[Math.round(Math.random()*14)] + '' + colors[Math.round(Math.random()*14)] + '' + colors[Math.round(Math.random()*14)] + '' + colors[Math.round(Math.random()*14)] + '' + colors[Math.round(Math.random()*14)] + '' + colors[Math.round(Math.random()*14)]; - ctx.strokeStyle = drawColor; - ctx.fillStyle = drawColor; - colorArray.push(drawColor.replace("#","")); - ctx.beginPath(); - } - - //calculate canvas coordinates for next point - lastX = scaleFactorX * (labels[i] - minX) + 20; - lastY = scaleFactorY * (values[i] - minval) + 20; - // draw different shapes - if((colorArray.length-1)%3 == 0){ - //square - ctx.fillRect(lastX-3,topY-lastY-3,6,6); - } - else if((colorArray.length-1)%3 == 1){ - //circle - ctx.beginPath(); - ctx.arc(lastX,topY-lastY,3,0,Math.PI * 2,false); - ctx.fill(); - } - else{ - // + sign - ctx.fillRect(lastX,topY-lastY-3,2,8); - ctx.fillRect(lastX-3,topY-lastY,8,2); - } - // update Google chart - if((labels[i] * 1) > (labels[i-1] * 1)){ - //add a point to the current line - profChart[profChart.length-2] += "," + Math.floor(lastX/canv.width*100); - profChart[profChart.length-1] += "," + Math.floor(lastY/canv.height*100); - } - else{ - //add a new line - var newIndex = profChart.length; - profChart[newIndex] = Math.floor(lastX/canv.width*100); - profChart[newIndex+1] = Math.floor(lastY/canv.height*100); - } - } - ctx.stroke(); - //colorMarkings stores the colors of the lines and orders input points to be marked - var colorMarkings = "&chco=" + colorArray.join(",") + "&chm="; - for(var i=0;i= 0){ - //draw X=0 axis on both canvas and Google chart - ctx.beginPath(); - ctx.strokeStyle = "#000000"; - ctx.moveTo(0,canv.height-(scaleFactorY * -1 * minval + 20)); - ctx.lineTo(canv.width,canv.height-(scaleFactorY * -1 * minval + 20)); - ctx.stroke(); - var graphPlace = 1-((canv.height-(scaleFactorY * -1 * minval + 20)) / canv.height); - colorMarkings += "|r,000000,0," + graphPlace + "," + (graphPlace + 0.005) - } - if(minX <= 0 && maxX >= 0){ - //draw Y=0 axis on both canvas and Google chart - ctx.beginPath(); - ctx.strokeStyle = "#000000"; - ctx.moveTo(scaleFactorX * -1 * minX + 20, 0); - ctx.lineTo(scaleFactorX * -1 * minX + 20, canv.height); - ctx.stroke(); - var graphPlace = (scaleFactorX * -1 * minX + 20) / canv.width; - colorMarkings += "|R,000000,0," + graphPlace + "," + (graphPlace + 0.005) - } - var gChart = document.getElementById("googleLineChart"); - //add margin to sides of Google chart - minX -= (maxX-minX)/23; - maxX += (maxX-minX)/23; - minval -= (maxval-minval)/18; - maxval += (maxval-minval)/18; - profChartUrl = 'chs=300x250' + colorMarkings + '&cht=lxy&chxt=x,y&chxr=0,' + minX + ',' + maxX + '|1,' + minval + ',' + maxval + '&chd=t:' + profChart.join("|"); - gChart.innerHTML = ''; -} - -function MakeScatterChart(spreadsheet, range, gview, gtype, helpflag, isResize){ - var nitems, byrow, maxval, minval, i, cr, cr1, cell, val, extra, str, maxX, minX, dotSizes; - var values = []; - var labels = []; - var total = 0; - var colors = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]; - - // collect the selected values and labels - if (range.left==range.right) { // down - nitems = range.bottom - range.top + 1; - byrow = true; - } - else { - nitems = range.right - range.left + 1; - byrow = false; - } - - //if the user has set the min/max values, use them - if(isResize){ - try{ minX = 1 * document.getElementById("SocialCalc-graphMinX").value; } - catch(e){ minX = null; } - try{ maxX = 1 * document.getElementById("SocialCalc-graphMaxX").value; } - catch(e){ maxX = null; } - try{ minval = 1 * document.getElementById("SocialCalc-graphMinY").value; } - catch(e){ minval = null; } - try{ maxval = 1 * document.getElementById("SocialCalc-graphMaxY").value; } - catch(e){ maxval = null; } - } - - var evenlySpaced = false; - dotSizes = new Array(); - for (i=0; ival) && !isResize){ minval = val; } - values.push(val); - cell = spreadsheet.sheet.GetAssuredCell(cr1); - if ((range.right==range.left || range.top==range.bottom) && (cell.valuetype.charAt(0) == "t" || cell.valuetype.charAt(0) == "n")) { - labels.push(cell.datavalue+""); - if ((maxX==null || maxXcell.datavalue) && !isResize){ minX = cell.datavalue; } - } - else { - labels.push(cr); - evenlySpaced = true; - } - cell = spreadsheet.sheet.GetAssuredCell(cr2); - if ((range.right==range.left || range.top==range.bottom) && (cell.valuetype.charAt(0) == "t" || cell.valuetype.charAt(0) == "n")) { - dotSizes.push(cell.datavalue+""); - } - else { - dotSizes.push("5"); - } - } - } - // create evenly-spaced X values if none were given - if(evenlySpaced){ - for(var i=0; i= 0){ - //draw X=0 axis on both canvas and Google chart - ctx.beginPath(); - ctx.strokeStyle = "#000000"; - ctx.moveTo(0,canv.height-(scaleFactorY * -1 * minval + 20)); - ctx.lineTo(canv.width,canv.height-(scaleFactorY * -1 * minval + 20)); - ctx.stroke(); - var graphPlace = 1-((canv.height-(scaleFactorY * -1 * minval + 20)) / canv.height); - colorMarkings += "|r,000000,0," + graphPlace + "," + (graphPlace + 0.005) - } - if(minX <= 0 && maxX >= 0){ - //draw Y=0 axis on both canvas and Google chart - ctx.beginPath(); - ctx.strokeStyle = "#000000"; - ctx.moveTo(scaleFactorX * -1 * minX + 20, 0); - ctx.lineTo(scaleFactorX * -1 * minX + 20, canv.height); - ctx.stroke(); - var graphPlace = (scaleFactorX * -1 * minX + 20) / canv.width; - colorMarkings += "|R,000000,0," + graphPlace + "," + (graphPlace + 0.005) - } - var gChart = document.getElementById("googleScatterChart"); - //add margin to sides of Google chart - minX -= (maxX-minX)/23; - maxX += (maxX-minX)/23; - minval -= (maxval-minval)/18; - maxval += (maxval-minval)/18; - profChartUrl = 'chs=300x250' + colorMarkings + '&cht=s&chxt=x,y&chxr=0,' + minX + ',' + maxX + '|1,' + minval + ',' + maxval + '&chd=t:' + profChart.join("|"); - gChart.innerHTML = ''; -} \ No newline at end of file diff --git a/DeveloperAdoption/public/static/socialcalcimages.js b/DeveloperAdoption/public/static/socialcalcimages.js deleted file mode 100644 index 3a1d43a..0000000 --- a/DeveloperAdoption/public/static/socialcalcimages.js +++ /dev/null @@ -1,141 +0,0 @@ -var SocialCalc; -var SocialCalc; -if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; -} -if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); -} - -SocialCalc.getCellDetails = function (str) { - var col=""; - var i =-1; - var char; - var code = 0; - while(true) { - char = str.charCodeAt(++i); - if(char >=65 && char <=90) { - code = 26 * code + (char - 64); - col = col + str.charAt(i); - } - else { - break; - } - } - var row = str.substring(i); - var arr = []; - arr.push(code); - arr.push(parseInt(row)); - arr.push(col); - arr.push(row); - return arr; -} - -SocialCalc.getRange = function (str) { - var strarr = str.split(":"); - var arr = []; - arr.push(SocialCalc.getCellDetails(strarr[0])); - arr.push(SocialCalc.getCellDetails(strarr[1])); - var range = []; - range.push(arr[1][0] - arr[0][0] + 1); - range.push(arr[1][1] - arr[0][1] + 1); - return range; -} - - - -SocialCalc.Images = function() { - this.hieght = 0; - this.width = 0; - } - -SocialCalc.Images.Insert = function() { - document.getElementById("EmbedImage").style.display = "inline"; - SocialCalc.CmdGotFocus(document.getElementById('image-embed-range')); - } - -SocialCalc.Images.showImgForm = function(value) { - var x = value + "ImgForm"; - document.getElementById("localImgForm").style.display = "none"; - document.getElementById("urlImgForm").style.display = "none"; - document.getElementById(x).style.display = "inline"; - if(value = 'url') { - var txtBox = document.getElementById("imgurl"); - SocialCalc.CmdGotFocus(txtBox); - } - document.getElementById("image-embed-submit-button").style.display = "inline"; - document.getElementById("image-embed-cancel-button").style.display = "inline"; - } - -SocialCalc.Images.handleFileSelect = function(evt) { - var files = evt.target.files; - for (var i = 0, f; f = files[i]; i++) { - console.log(f); - if (!f.type.match('image.*')) { - continue; - } - var reader = new FileReader(); - // Need a closure to capture the file information. - reader.onload = (function(theFile) { - return function(e) { - document.getElementById("file-image-holder").src = e.target.result; - document.getElementById("file-image-holder").style.display = "inline"; - document.getElementById("file-text-holder").style.display = "none"; - var img = document.getElementById('file-image-holder'); - img.setAttribute("class","thumb"); - img.setAttribute("src",e.target.result); - img.setAttribute("title",theFile.title); - }; - })(f); - reader.readAsDataURL(f); - } - } - -SocialCalc.Images.getUrlImage = function () { - var str = document.getElementById("imgurl").value; - document.getElementById("url-image-holder").src = str; - document.getElementById("url-image-holder").style.display = "inline"; - document.getElementById("url-text-holder").style.display = "none"; - } - -SocialCalc.Images.Embed = function () { - var ifi = document.getElementById("img-file-inp"); - var fih = document.getElementById("file-image-holder"); - var uih = document.getElementById("url-image-holder"); - var ier = document.getElementById("image-embed-range"); - var imgsource = uih.width!=0?uih:fih; - var width = imgsource.width; - var height = imgsource.width; - - var colrange = width/SocialCalc.Constants.defaultColWidth; - var rowrange = height/20; - - var arr = SocialCalc.getRange(ier.value); - var height = 20 * arr[1]; - var str = ''; - - var spl = ier.value.split(":")[0]; - - var cmdk="merge "+ier.value+"\n"+"set "+spl+" textvalueformat text-html"+"\n"+"set "+spl+" text t "+str; - console.log(cmdk); - - SocialCalc.ScheduleSheetCommands(workbook.sheetArr[""+SocialCalc.GetCurrentWorkBookControl().currentSheetButton.id+""].sheet,cmdk,true,true) ; - - //cleanup - ifi.value = ""; - fih.src = ""; - fih.style.display = "none"; - uih.src = ""; - ier.value = ""; - uih.style.display = "none"; - document.getElementById("imgurl").value = ""; - document.getElementById("localImgForm").style.display = "none"; - document.getElementById("urlImgForm").style.display = "none"; - document.getElementById("embed-button").style.display = "none"; - document.getElementById("EmbedImage").style.display = "none"; - } - -SocialCalc.Images.hideImgForm = function(value) { - document.getElementById("EmbedImage").style.display = "none"; - } \ No newline at end of file diff --git a/DeveloperAdoption/public/static/socialcalcpopup.js b/DeveloperAdoption/public/static/socialcalcpopup.js deleted file mode 100644 index 33af813..0000000 --- a/DeveloperAdoption/public/static/socialcalcpopup.js +++ /dev/null @@ -1,1618 +0,0 @@ -// -/* -// The module of the SocialCalc package for the optional popup menus in socialcalcspreadsheetcontrol.js -// -// (c) Copyright 2009 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// -*/ - - var SocialCalc; // All values are stored in the master SocialCalc object - if (!SocialCalc) { - SocialCalc = {}; - } - - // The main Popup data -- there is only one set - - SocialCalc.Popup = {}; - - // Routines and values for each type of control, indexed by type name - // The value for each is an object constructed as follows: - // - // Create = function(type, id, attribs) - // Initialize = function(type, id, data) - // SetValue = function(type, id, value) - // GetValue = function(type, id) returns value - // SetDisabled = function(type, id, t/f) - // Show = function(type, id) - // Hide = function(type, id) - // Cancel = function(type, id) - // Reset = function(type) - // - // data = object to hold type-specific data - // - - SocialCalc.Popup.Types = {}; - - // Definitions for each individual control, indexed by id - // The value for each is an object constructed as follows: - // - // type: type name of the control - // value: current value of the control (usually a string, but can depend on type) - // data: object with type-specific items - // - - SocialCalc.Popup.Controls = {}; - - // System-wide values of currently active control - // - // id: id of current control or null - // - - SocialCalc.Popup.Current = {}; - - // Other values used by the Popup system - // - - SocialCalc.Popup.imagePrefix = "images/sc-"; // image prefix - - // Override this for localization - - SocialCalc.Popup.LocalizeString = function(str) {return str;}; - - -// * * * * * * * * * * * * * * * * -// -// GENERAL ROUTINES -// -// * * * * * * * * * * * * * * * * - -// -// SocialCalc.Popup.Create(type, id, attribs) -// -// Creates a control of type "type" as the children of document element "id" using "attribs" -// - -SocialCalc.Popup.Create = function(type, id, attribs) { - - var pt = SocialCalc.Popup.Types[type]; - if (pt && pt.Create) { - pt.Create(type, id, attribs); - } - - } - - -// -// SocialCalc.Popup.SetValue(id, value) -// -// Sets the value of control. -// - -SocialCalc.Popup.SetValue = function(id, value) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - var pt = spt[type]; - var spcdata = spc[id].data; - - if (pt && pt.Create) { - pt.SetValue(type, id, value); - if (spcdata.attribs && spcdata.attribs.changedcallback) { - spcdata.attribs.changedcallback(spcdata.attribs, id, value); - } - } - - } - - -// -// SocialCalc.Popup.SetDisabled(id, disabled) -// -// Sets whether the control is disabled (true) or not (false). -// - -SocialCalc.Popup.SetDisabled = function(id, disabled) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - if (sp.Current.id && id == sp.Current.id) { - pt.Hide(type, sp.Current.id); - sp.Current.id = null; - } - pt.SetDisabled(type, id, disabled); - } - - } - - -// -// SocialCalc.Popup.GetValue(id) -// -// Returns the value of control. -// - -SocialCalc.Popup.GetValue = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - return pt.GetValue(type, id); - } - - return null; - - } - - -// -// SocialCalc.Popup.Initialize(id, data) -// -// Gives "data" to the appropriate initialization code. -// - -SocialCalc.Popup.Initialize = function(id, data) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Initialize) { - pt.Initialize(type, id, data); - } - - } - - -// -// SocialCalc.Popup.Reset(type) -// -// Resets Popup, such as when turning to page. -// - -SocialCalc.Popup.Reset = function(type) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (spt[type].Reset) spt[type].Reset(type); - - } - - -// -// SocialCalc.Popup.CClick(id) -// -// Should be called when the user clicks on a control to do the popup -// - -SocialCalc.Popup.CClick = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - if (spc[id].data && spc[id].data.disabled) return; - - var type = spc[id].type; - - var pt = spt[type]; - - if (sp.Current.id) { - spt[spc[sp.Current.id].type].Hide(type, sp.Current.id); - if (id == sp.Current.id) { // same one - done - sp.Current.id = null; - return; - } - } - - if (pt && pt.Show) { - pt.Show(type, id); - } - - sp.Current.id = id; - - } - - -// -// SocialCalc.Popup.Close() -// -// Used to close any open popup. -// - -SocialCalc.Popup.Close = function() { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - sp.CClick(sp.Current.id); - - } - -// -// SocialCalc.Popup.Cancel() -// -// Closes Popup and restores old value -// - -SocialCalc.Popup.Cancel = function() { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - var type = spc[sp.Current.id].type; - - var pt = spt[type]; - - pt.Cancel(type, sp.Current.id); - - sp.Current.id = null; - - } - -// -// ele = SocialCalc.Popup.CreatePopupDiv(id, attribs) -// -// Utility function to create the main popup div of width attribs.width. -// If attribs.title, create one with that text, and optionally attribs.moveable. -// - -SocialCalc.Popup.CreatePopupDiv = function(id, attribs) { - - var pos, ele; - - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = document.createElement("div"); - main.style.position = "absolute"; - - pos = SocialCalc.GetElementPositionWithScroll(spcdata.mainele); - - main.style.top = (pos.top+spcdata.mainele.offsetHeight)+"px"; - main.style.left = (pos.left)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - if (attribs.width) { - main.style.width = attribs.width; - } - - spcdata.mainele.appendChild(main); - - if (attribs.title) { - main.innerHTML = ''+ - ''+ - '
    '+attribs.title+' X 
    '; - - if (attribs.moveable) { - spcdata.dragregistered = main.firstChild.firstChild.firstChild.firstChild; - SocialCalc.DragRegister(spcdata.dragregistered, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - } - } - - return main; - - } - -// -// SocialCalc.Popup.EnsurePosition(id, container) -// -// Utility function to make sure popup is positioned completely within container (both element objects) -// and appropriate with respect to the main element controlling the popup. -// - -SocialCalc.Popup.EnsurePosition = function(id, container) { - - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = spcdata.mainele.firstChild; - if (!main) {alert("No main popup element firstChild.");return}; - var popup = spcdata.popupele; - - function GetLayoutValues(ele) { - var r = SocialCalc.GetElementPositionWithScroll(ele); - r.height = ele.offsetHeight; - r.width = ele.offsetWidth; - r.bottom = r.top+r.height; - r.right = r.left+r.width; - return r; - } - - var p = GetLayoutValues(popup); - var c = GetLayoutValues(container); - var m = GetLayoutValues(main); - var t = 0; // type of placement -//addmsg("popup t/r/b/l/h/w= "+p.top+"/"+p.right+"/"+p.bottom+"/"+p.left+"/"+p.height+"/"+p.width); -//addmsg("container t/r/b/l/h/w= "+c.top+"/"+c.right+"/"+c.bottom+"/"+c.left+"/"+c.height+"/"+c.width); -//addmsg("main t/r/b/l/h/w= "+m.top+"/"+m.right+"/"+m.bottom+"/"+m.left+"/"+m.height+"/"+m.width); - - // Check various layout cases in priority order - - if (m.bottom+p.height < c.bottom && m.left+p.width < c.right) { // normal case: room on bottom and right - popup.style.top = m.bottom + "px"; - popup.style.left = m.left + "px"; - t = 1; - } - - else if (m.top-p.height > c.top && m.left+p.width < c.right) { // room on top and right - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = m.left + "px"; - t = 2; - } - - else if (m.bottom+p.height < c.bottom && m.right-p.width > c.left) { // room on bottom and left - popup.style.top = m.bottom + "px"; - popup.style.left = (m.right-p.width) + "px"; - t = 3; - } - - else if (m.top-p.height > c.top && m.right-p.width > c.left) { // room on top and left - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = (m.right-p.width) + "px"; - t = 4; - } - - else if (m.bottom+p.height < c.bottom && p.width < c.width) { // room on bottom and middle - popup.style.top = m.bottom + "px"; - popup.style.left = (c.left+Math.floor((c.width-p.width)/2)) + "px"; - t = 5; - } - - else if (m.top-p.height > c.top && p.width < c.width) { // room on top and middle - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = (c.left+Math.floor((c.width-p.width)/2)) + "px"; - t = 6; - } - - else if (p.height < c.height && m.right+p.width < c.right) { // room on middle and right - popup.style.top = (c.top+Math.floor((c.height-p.height)/2)) + "px"; - popup.style.left = m.right + "px"; - t = 7; - } - - else if (p.height < c.height && m.left-p.width > c.left) { // room on middle and left - popup.style.top = (c.top+Math.floor((c.height-p.height)/2)) + "px"; - popup.style.left = (m.left-p.width) + "px"; - t = 8; - } - - else { // nothing works, so leave as it is - } -//addmsg("Popup layout "+t); - -} - -// -// ele = SocialCalc.Popup.DestroyPopupDiv(ele, dragregistered) -// -// Utility function to get rid of the main popup div. -// - -SocialCalc.Popup.DestroyPopupDiv = function(ele, dragregistered) { - - if (!ele) return; - - ele.innerHTML = ""; - - SocialCalc.DragUnregister(dragregistered); // OK to do this even if not registered - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - } - -// -// Color Utility Functions -// - -SocialCalc.Popup.RGBToHex = function(val) { - - var sp = SocialCalc.Popup; - - if (val=="") { - return "000000"; - } - var rgbvals = val.match(/(\d+)\D+(\d+)\D+(\d+)/); - if (rgbvals) { - return sp.ToHex(rgbvals[1])+sp.ToHex(rgbvals[2])+sp.ToHex(rgbvals[3]); - } - else { - return "000000"; - } - } - -SocialCalc.Popup.HexDigits="0123456789ABCDEF"; - -SocialCalc.Popup.ToHex = function(num) { - var sp = SocialCalc.Popup; - var first=Math.floor(num / 16); - var second=num % 16; - return sp.HexDigits.charAt(first)+sp.HexDigits.charAt(second); - } - -SocialCalc.Popup.FromHex = function(str) { - - var sp = SocialCalc.Popup; - var first = sp.HexDigits.indexOf(str.charAt(0).toUpperCase()); - var second = sp.HexDigits.indexOf(str.charAt(1).toUpperCase()); - return ((first>=0)?first:0)*16+((second>=0)?second:0); - } - -SocialCalc.Popup.HexToRGB = function(val) { - - var sp = SocialCalc.Popup; - - return "rgb("+sp.FromHex(val.substring(1,3))+","+sp.FromHex(val.substring(3,5))+","+sp.FromHex(val.substring(5,7))+")"; - - } - -SocialCalc.Popup.makeRGB = function(r, g, b) { - return "rgb("+(r>0?r:0)+","+(g>0?g:0)+","+(b>0?b:0)+")"; - } - -SocialCalc.Popup.splitRGB = function(rgb) { - var parts = rgb.match(/(\d+)\D+(\d+)\D+(\d+)\D/); - if (!parts) { - return {r:0, g:0, b:0}; - } - else { - return {r: parts[1]-0, g: parts[2]-0, b: parts[3]-0}; - } - } - -// * * * * * * * * * * * * * * * * -// -// ROUTINES FOR EACH TYPE -// -// * * * * * * * * * * * * * * * * - -// -// List -// -// type: List -// value: value of control, -// display: "value to display", -// custom: true if custom value, -// disabled: t/f, -// attribs: { -// title: "popup title string", -// moveable: t/f, -// width: optional width, e.g., "100px", -// ensureWithin: optional element object to ensure popup fits within if possible -// changedcallback: optional function(attribs, id, newvalue), -// ... -// } -// data: { -// ncols: calculated number of columns -// options: [ -// {o: option-name, v: value-to-return, -// a: {option attribs} // optional: {skip: true, custom: true, cancel: true, newcol: true} -// }, -// ...] -// } -// -// popupele: gets popup element object when created -// contentele: gets element created with all the content -// listdiv: gets div with list of items -// customele: gets input element with custom value -// dragregistered: gets element, if any, registered as draggable -// - -SocialCalc.Popup.Types.List = {}; - -SocialCalc.Popup.Types.List.Create = function(type, id, attribs) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - var spcid = {type: type, value: "", display: "", data: {}}; - if (spc[id]) {alert("Already created "+id); return;} - spc[id] = spcid; - var spcdata = spcid.data; - - spcdata.attribs = attribs || {}; - - var ele = document.getElementById(id); - if (!ele) {alert("Missing element "+id); return;} - - spcdata.mainele = ele; - - ele.innerHTML = ''; - - spcdata.options = []; // set to nothing - use Initialize to fill - - } - -SocialCalc.Popup.Types.List.SetValue = function(type, id, value) { - - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - spcdata.value = value; - spcdata.custom = false; - - for (i=0; i'; - - spcdata.customele = ele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = ele; - } - else { - str = SocialCalc.Popup.Types.List.MakeList(type, id); - - ele = document.createElement("div"); - ele.innerHTML = '
    '+str+'
    '; - - spcdata.customele = null; - spcdata.listdiv = ele.firstChild; - spcdata.contentele = ele; - } - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = true; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - -SocialCalc.Popup.Types.List.MakeList = function(type, id) { - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data - - var str = ''; - var td = '
    '; - - str += td; - - spcdata.ncols = 1; - - for (i=0; i'+td; - spcdata.ncols += 1; - continue; - } - if (o.a.skip) { - str += '
    '+o.o+'
    '; - continue; - } - } - if (o.v == spcdata.value && !(o.a && (o.a.custom || o.a.cancel))) { // matches value - bg = "background-color:#DDF;"; - } - else { - bg = ""; - } - str += '
    '+o.o+'
    '; - } - - str += "
    "; - - return str; - - } - - -SocialCalc.Popup.Types.List.MakeCustom = function(type, id) { - - var SPLoc = SocialCalc.Popup.LocalizeString; - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - var val = spcdata.value; - val = SocialCalc.special_chars(val); - - str = '

    '+ - '

    '+ - ''+ - ''+ - ''+ - '
    '; - - return str; - - } - - -SocialCalc.Popup.Types.List.ItemClicked = function(id, num) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var a = spcdata.options[num].a; - - if (a && a.custom) { - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeCustom("List", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = nele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - return; - } - - if (a && a.cancel) { - SocialCalc.Popup.Close(); - return; - } - - SocialCalc.Popup.SetValue(id, spcdata.options[num].v); - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.List.CustomToList = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeList("List", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = null; - spcdata.listdiv = nele.firstChild; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - } - - -SocialCalc.Popup.Types.List.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.customele.value); - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.List.MouseMove = function(id, ele) { - - var col, i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var list = spcdata.listdiv; - - if (!list) return; - - var rowele = list.firstChild.firstChild.firstChild; // div.table.tbody.tr - - for (col=0; col '; - - } - -SocialCalc.Popup.Types.ColorChooser.SetValue = function(type, id, value) { - - var i, img, pos; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.value = value; - spcdata.custom = false; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (spcdata.value) { - spcdata.mainele.firstChild.style.backgroundColor = spcdata.value; - if (spca.backgroundImage) { - img = "url("+sp.imagePrefix+spca.backgroundImage+")"; - } - else { - img = ""; - } - pos = "center center"; - } - else { - spcdata.mainele.firstChild.style.backgroundColor = "#FFF"; - if (spca.backgroundImageDefault) { - img = "url("+sp.imagePrefix+spca.backgroundImageDefault+")"; - pos = "center center"; - } - else { - img = "url("+sp.imagePrefix+"defaultcolor.gif)"; - pos = "left top"; - } - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } - - } - - -SocialCalc.Popup.Types.ColorChooser.SetDisabled = function(type, id, disabled) { - - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.disabled = disabled; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (disabled) { - spcdata.mainele.firstChild.style.backgroundColor = "#DDD"; - if (spca.backgroundImageDisabled) { - img = "url("+sp.imagePrefix+spca.backgroundImageDisabled+")"; - pos = "center center"; - } - else { - img = "url("+sp.imagePrefix+"defaultcolor.gif)"; - pos = "left top"; - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } - else { - sp.SetValue(id, spcdata.value); - } - } - - } - - -SocialCalc.Popup.Types.ColorChooser.GetValue = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - return spcdata.value; - - } - - -SocialCalc.Popup.Types.ColorChooser.Initialize = function(type, id, data) { - - var a; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - for (a in data.attribs) { - spcdata.attribs[a] = data.attribs[a]; - } - - if (data.value) { // if has a value, set to it - sp.SetValue(id, data.value); - } - - } - - -SocialCalc.Popup.Types.ColorChooser.Reset = function(type) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (sp.Current.id && spc[sp.Current.id].type == type) { // we have a popup - spt[type].Hide(type, sp.Current.id); - sp.Current.id = null; - } - - } - - -SocialCalc.Popup.Types.ColorChooser.Show = function(type, id) { - - var i, ele, mainele; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data - - var str = ""; - - spcdata.oldvalue = spcdata.value; // remember starting value - - spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs); - - if (spcdata.custom) { - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom(type, id); - - ele = document.createElement("div"); - ele.innerHTML = '
    '+str+'
    '; - - spcdata.customele = ele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = ele; - } - else { - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid(type, id); - - ele = document.createElement("div"); - ele.style.padding = "3px"; - ele.style.backgroundColor = "#CCC"; - ele.appendChild(mainele); - - spcdata.customele = null; - spcdata.contentele = ele; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - -SocialCalc.Popup.Types.ColorChooser.MakeCustom = function(type, id) { - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var SPLoc = sp.LocalizeString; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - str = '

    '+ - '#

    '+ - ''+ - ''+ - '
    '; - - return str; - - } - - -SocialCalc.Popup.Types.ColorChooser.ItemClicked = function(id, num) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.ColorChooser.CustomToList = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - } - - -SocialCalc.Popup.Types.ColorChooser.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.customele.value); - - sp.Close(); - - } - - -SocialCalc.Popup.Types.ColorChooser.Hide = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered); - spcdata.popupele = null; - - } - - -SocialCalc.Popup.Types.ColorChooser.Cancel = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.oldvalue); // reset to old value - - SocialCalc.Popup.Types.ColorChooser.Hide(type, id); - - } - - -SocialCalc.Popup.Types.ColorChooser.CreateGrid = function (type, id) { - - var ele, pos, row, rowele, col, g; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var SPLoc = sp.LocalizeString; - var spcdata = spc[id].data; - spcdata.grid = {}; - var grid = spcdata.grid; - - var mainele = document.createElement("div"); - - ele = document.createElement("table"); - ele.cellSpacing = 0; - ele.cellPadding = 0; - ele.style.width = "100px"; - grid.table = ele; - - ele = document.createElement("tbody"); - grid.table.appendChild(ele); - grid.tbody = ele; - - for (row=0; row<16; row++) { - rowele = document.createElement("tr"); - for (col=0; col<5; col++) { - g = {}; - grid[row+","+col] = g; - ele = document.createElement("td"); - ele.style.fontSize = "1px"; - ele.innerHTML = " "; - ele.style.height = "10px"; - if (col<=1) { - ele.style.width = "17px"; - ele.style.borderRight = "3px solid white"; - } - else { - ele.style.width = "20px"; - ele.style.backgroundRepeat = "no-repeat"; - } - rowele.appendChild(ele); - g.ele = ele; - } - grid.tbody.appendChild(rowele); - } - mainele.appendChild(grid.table); - - ele = document.createElement("div"); - ele.style.marginTop = "3px"; - ele.innerHTML = ''+ - ''+ - ''+ - ''+ - '
     #'+SPLoc("OK")+'
    '; - grid.defaultbox = ele.firstChild.firstChild.firstChild.childNodes[0]; - grid.defaultbox.onclick = spt.ColorChooser.DefaultClicked; - grid.custom = ele.firstChild.firstChild.firstChild.childNodes[1]; - grid.custom.onclick = spt.ColorChooser.CustomClicked; - grid.msg = ele.firstChild.firstChild.firstChild.childNodes[2]; - grid.msg.onclick = spt.ColorChooser.CloseOK; - mainele.appendChild(ele); - - grid.table.onmousedown = spt.ColorChooser.GridMouseDown; - - spt.ColorChooser.DetermineColors(id); - spt.ColorChooser.SetColors(id); - - return mainele; - - } - -SocialCalc.Popup.Types.ColorChooser.gridToG = function(grid, row, col) { - - return grid[row+","+col]; - - } - -SocialCalc.Popup.Types.ColorChooser.DetermineColors = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - var col, row; - var rgb = sp.splitRGB(spcdata.value); - var color; - - col = 2; - row = 16-Math.floor((rgb.r+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(17*(15-row),0,0); - } - - col = 3; - row = 16-Math.floor((rgb.g+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(0,17*(15-row),0); - } - - col = 4; - row = 16-Math.floor((rgb.b+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(0,0,17*(15-row)); - } - - col = 1; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(17*(15-row),17*(15-row),17*(15-row)); - } - - col = 0; - var steps = [0, 68, 153, 204, 255]; - var commonrgb = ["400", "310", "420", "440", "442", "340", "040", "042", "032", "044", "024", "004", "204", "314", "402", "414"]; - var x; - for (row=0; row<16; row++) { - x = commonrgb[row]; - sptc.gridToG(grid,row,col).rgb = "rgb("+steps[x.charAt(0)-0]+","+steps[x.charAt(1)-0]+","+steps[x.charAt(2)-0]+")"; - } - - } - -SocialCalc.Popup.Types.ColorChooser.SetColors = function(id) { - - var row, col, g, ele, rgb; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - for (row=0; row<16; row++) { - for (col=0; col<5; col++) { - g = sptc.gridToG(grid,row, col); - g.ele.style.backgroundColor = g.rgb; - g.ele.title = sp.RGBToHex(g.rgb); - if (grid["selectedrow"+col]==row) { - g.ele.style.backgroundImage = "url("+sp.imagePrefix+"chooserarrow.gif)"; - } - else { - g.ele.style.backgroundImage = ""; - } - } - } - - sp.SetValue(id, spcdata.value); - - grid.msg.style.backgroundColor = spcdata.value; - rgb = sp.splitRGB(spcdata.value || "rgb(255,255,255)"); - if (rgb.r+rgb.g+rgb.b < 220) { - grid.msg.style.color = "#FFF"; - } - else { - grid.msg.style.color = "#000"; - } - if (!spcdata.value) { // default - grid.msg.style.backgroundColor = "#FFF"; - grid.msg.style.backgroundImage = "url("+sp.imagePrefix+"defaultcolor.gif)"; - grid.msg.title = "Default"; - } - else { - grid.msg.style.backgroundImage = ""; - grid.msg.title = sp.RGBToHex(spcdata.value); - } - - } - -SocialCalc.Popup.Types.ColorChooser.GridMouseDown = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - var grid = spcdata.grid; - - switch (event.type) { - case "mousedown": - grid.mousedown = true; - break; - case "mouseup": - grid.mousedown = false; - break; - case "mousemove": - if (!grid.mousedown) { - return; - } - break; - } - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - var gpos = SocialCalc.GetElementPosition(grid.table); - var row = Math.floor((clientY-gpos.top-2)/10); // -2 is to split the diff btw IE & FF - row = row < 0 ? 0 : row; - var col = Math.floor((clientX-gpos.left)/20); - row = row < 0 ? 0 : (row > 15 ? 15 : row); - col = col < 0 ? 0 : (col > 4 ? 4 : col); - var color = sptc.gridToG(grid,row,col).ele.style.backgroundColor; - var newrgb = sp.splitRGB(color); - var oldrgb = sp.splitRGB(spcdata.value); - - switch (col) { - case 2: - spcdata.value = sp.makeRGB(newrgb.r, oldrgb.g, oldrgb.b); - break; - case 3: - spcdata.value = sp.makeRGB(oldrgb.r, newrgb.g, oldrgb.b); - break; - case 4: - spcdata.value = sp.makeRGB(oldrgb.r, oldrgb.g, newrgb.b); - break; - case 0: - case 1: - spcdata.value = color; - } - - sptc.DetermineColors(id); - sptc.SetColors(id); - - } - - -SocialCalc.Popup.Types.ColorChooser.ControlClicked = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var cid = sp.Current.id; - if (!cid || id != cid) { - sp.CClick(id); - return; - } - - sptc.CloseOK(); - - } - -SocialCalc.Popup.Types.ColorChooser.DefaultClicked = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - spcdata.value = ""; - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - - } - -SocialCalc.Popup.Types.ColorChooser.CustomClicked = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - var oele, str, nele; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom("ColorChooser", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = nele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - spcdata.customele.value = sp.RGBToHex(spcdata.value); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - - -SocialCalc.Popup.Types.ColorChooser.CustomToGrid = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#"+spcdata.customele.value)); - - var oele, mainele, nele; - - oele = spcdata.contentele; - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid("ColorChooser", id); - nele = document.createElement("div"); - nele.style.padding = "3px"; - nele.style.backgroundColor = "#CCC"; - nele.appendChild(mainele); - spcdata.customele = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - } - - -SocialCalc.Popup.Types.ColorChooser.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#"+spcdata.customele.value)); - - SocialCalc.Popup.Close(); - - } - -SocialCalc.Popup.Types.ColorChooser.CloseOK = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - - } - diff --git a/DeveloperAdoption/public/static/socialcalcspreadsheetcontrol.js b/DeveloperAdoption/public/static/socialcalcspreadsheetcontrol.js deleted file mode 100644 index 6d7c113..0000000 --- a/DeveloperAdoption/public/static/socialcalcspreadsheetcontrol.js +++ /dev/null @@ -1,3697 +0,0 @@ -// -// SocialCalcSpreadsheetControl -// -/* -// The code module of the SocialCalc package that lets you embed a spreadsheet -// control with toolbar, etc., into a web page. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript SpreadsheetControl. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the SpreadsheetControl is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/ - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); - } - -// ************************************* -// -// SpreadsheetControl class: -// -// ************************************* - -// Global constants: - - SocialCalc.CurrentSpreadsheetControlObject = null; // right now there can only be one active at a time - - -// Constructor: - -SocialCalc.SpreadsheetControl = function() { - - var scc = SocialCalc.Constants; - - // Properties: - - this.parentNode = null; - this.spreadsheetDiv = null; - this.requestedHeight = 0; - this.requestedWidth = 0; - this.requestedSpaceBelow = 0; - this.height = 0; - this.width = 0; - this.viewheight = 0; // calculated amount for views below toolbar, etc. - - // Tab definitions: An array where each tab is an object of the form: - // - // name: "name", - // text: "text-on-tab", - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext - // Other replacements from spreadsheet.tabreplacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // view: "viewname", // view to show when selected; "sheet" or missing/null is spreadsheet - // oncreate: function(spreadsheet, tab-name), // called when first created to initialize - // onclick: function(spreadsheet, tab-name), missing/null is sheet default - // onclickFocus: text, // spreadsheet.idPrefix+text is given the focus if present instead of normal KeyboardFocus - // or if text isn't a string, that value (e.g., true) is used for SocialCalc.CmdGotFocus - // onunclick: function(spreadsheet, tab-name), missing/null is sheet default - - this.tabs = []; - this.tabnums = {}; // when adding tabs, add tab-name: array-index to this object - this.tabreplacements = {}; // see use above - this.currentTab = -1; // currently selected tab index in this.tabs or -1 (maintained by SocialCalc.SetTab) - - // View definitions: An object where each view is an object of the form: - // - // name: "name", // localized when first set using SocialCalc.LocalizeString - // element: node-in-the-dom, // filled in when initialized - // replacements: {}, // see below - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext, "%img.": spreadsheet.imagePrefix, - // SocialCalc.LocalizeSubstring replacements ("%loc!string!" and "%ssc!constant-name!") - // Other replacements from viewobject.replacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // divStyle: attributes for sheet div (SocialCalc.setStyles format) - // oncreate: function(spreadsheet, viewobject), // called when first created to initialize - // needsresize: true/false/null, // if true, do resize calc after displaying - // onresize: function(spreadsheet, viewobject), // called if needs resize - // values: {} // optional values to share with onclick handlers, etc. - // - // There is always a "sheet" view. - - this.views = {}; // {viewname: view-object, ...} - - // Dynamic properties: - - this.sheet = null; - this.context = null; - this.editor = null; - - this.spreadsheetDiv = null; - this.editorDiv = null; - - this.sortrange = ""; // remembered range for sort tab - - this.moverange = ""; // remembered range from movefrom used by movepaste/moveinsert - - // Constants: - - this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-" - this.multipartBoundary = "SocialCalcSpreadsheetControlSave"; // boundary used by SpreadsheetControlCreateSpreadsheetSave - this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src - - this.toolbarbackground = scc.SCToolbarbackground; - this.tabbackground = scc.SCTabbackground; // "background-color:#CCC;"; - this.tabselectedCSS = scc.SCTabselectedCSS; - this.tabplainCSS = scc.SCTabplainCSS; - this.toolbartext = scc.SCToolbartext; - - this.formulabarheight = scc.SCFormulabarheight; // in pixels, will contain a text input box - - - if (scc.doWorkBook) { - this.sheetbarheight = scc.SCSheetBarHeight; - this.sheetbarCSS = scc.SCSheetBarCSS; - } else { - this.sheetbarheight = 0; - } - - - this.statuslineheight = scc.SCStatuslineheight; // in pixels - this.statuslineCSS = scc.SCStatuslineCSS; - - // Callbacks: - - this.ExportCallback = null; // a function called for Clipboard Export button: this.ExportCallback(spreadsheet_control_object) - - // Initialization Code: - - this.sheet = new SocialCalc.Sheet(); - this.context = new SocialCalc.RenderContext(this.sheet); - this.context.showGrid=true; - this.context.showRCHeaders=true; - this.editor = new SocialCalc.TableEditor(this.context); - this.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetControlStatuslineCallback, - params: {statuslineid: this.idPrefix+"statusline", - recalcid1: this.idPrefix+"divider_recalc", - recalcid2: this.idPrefix+"button_recalc"}}; - - SocialCalc.CurrentSpreadsheetControlObject = this; // remember this for rendezvousing on events - - this.editor.MoveECellCallback.movefrom = function(editor) { - var cr; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - spreadsheet.context.cursorsuffix = ""; - if (editor.range2.hasrange && !editor.cellhandles.noCursorSuffix) { - if (editor.ecell.row==editor.range2.top && (editor.ecell.coleditor.range2.right+1)) { - spreadsheet.context.cursorsuffix = "insertleft"; - } - if (editor.ecell.col==editor.range2.left && (editor.ecell.roweditor.range2.bottom+1)) { - spreadsheet.context.cursorsuffix = "insertup"; - } - } - }; - - // formula bar buttons - - this.formulabuttons = { - formulafunctions: {image: "formuladialog.gif", tooltip: "Functions", // tooltips are localized when set below - command: SocialCalc.SpreadsheetControl.DoFunctionList}, - multilineinput: {image: "multilinedialog.gif", tooltip: "Multi-line Input Box", - command: SocialCalc.SpreadsheetControl.DoMultiline}, - link: {image: "linkdialog.gif", tooltip: "Link Input Box", - command: SocialCalc.SpreadsheetControl.DoLink}, - sum: {image: "sumdialog.gif", tooltip: "Auto Sum", - command: SocialCalc.SpreadsheetControl.DoSum} -//, -// image: {image: "sumdialog.gif", tooltip: "Insert", -// command: SocialCalc.Images.Insert } - } - - // Default tabs: - - // Edit - - this.tabnums.edit = this.tabs.length; - this.tabs.push({name: "edit", text: "Edit", html: - '
    '+ -' '+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -''+ -' '+ -'    '+ -''+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -' '+ -' '+ -' '+ -'    '+ -' '+ -' '+ -'    '+ -' '+ -' '+ -'  '+ -' '+ -'    '+ -' '+ - '
    ', - oncreate: null, //function(spreadsheet, viewobject) {SocialCalc.DoCmd(null, "fill-rowcolstuff");}, - onclick: null}); - - // Settings (Format) - - this.tabnums.settings = this.tabs.length; - this.tabs.push({name: "settings", text: "Format", html: - '', - view: "settings", - onclick: function(s, t) { - SocialCalc.SettingsControls.idPrefix = s.idPrefix; // used to get color chooser div - SocialCalc.SettingControlReset(); - var sheetattribs = s.sheet.EncodeSheetAttributes(); - var cellattribs = s.sheet.EncodeCellAttributes(s.editor.ecell.coord); - if (SocialCalc.Callbacks.GetCellEditableAttribs) - SocialCalc.Callbacks.GetCellEditableAttribs(cellattribs,s.editor.ecell.coord) - SocialCalc.SettingsControlLoadPanel(s.views.settings.values.sheetspanel, sheetattribs); - SocialCalc.SettingsControlLoadPanel(s.views.settings.values.cellspanel, cellattribs); - document.getElementById(s.idPrefix+"settingsecell").innerHTML = s.editor.ecell.coord; - SocialCalc.SpreadsheetControlSettingsSwitch("cell"); - s.views.settings.element.style.height = s.viewheight+"px"; - s.views.settings.element.firstChild.style.height = s.viewheight+"px"; - - var range; // set save message - if (s.editor.range.hasrange) { - range = SocialCalc.crToCoord(s.editor.range.left, s.editor.range.top) + ":" + - SocialCalc.crToCoord(s.editor.range.right, s.editor.range.bottom); - } - else { - range = s.editor.ecell.coord; - } - document.getElementById(s.idPrefix+"settings-savecell").value = SocialCalc.LocalizeString("Save to")+": "+range; - }, - onclickFocus: true - }); - - this.views["settings"] = {name: "settings", values: {}, - oncreate: function(s, viewobj) { - var scc = SocialCalc.Constants; - - viewobj.values.sheetspanel = { -// name: "sheet", - colorchooser: {id: s.idPrefix+"scolorchooser"}, - formatnumber: {setting: "numberformat", type: "PopupList", id: s.idPrefix+"formatnumber", - initialdata: scc.SCFormatNumberFormats}, - formattext: {setting: "textformat", type: "PopupList", id: s.idPrefix+"formattext", - initialdata: scc.SCFormatTextFormats}, - fontfamily: {setting: "fontfamily", type: "PopupList", id: s.idPrefix+"fontfamily", - initialdata: scc.SCFormatFontfamilies}, - fontlook: {setting: "fontlook", type: "PopupList", id: s.idPrefix+"fontlook", - initialdata: scc.SCFormatFontlook}, - fontsize: {setting: "fontsize", type: "PopupList", id: s.idPrefix+"fontsize", - initialdata: scc.SCFormatFontsizes}, - textalignhoriz: {setting: "textalignhoriz", type: "PopupList", id: s.idPrefix+"textalignhoriz", - initialdata: scc.SCFormatTextAlignhoriz}, - numberalignhoriz: {setting: "numberalignhoriz", type: "PopupList", id: s.idPrefix+"numberalignhoriz", - initialdata: scc.SCFormatNumberAlignhoriz}, - alignvert: {setting: "alignvert", type: "PopupList", id: s.idPrefix+"alignvert", - initialdata: scc.SCFormatAlignVertical}, - textcolor: {setting: "textcolor", type: "ColorChooser", id: s.idPrefix+"textcolor"}, - bgcolor: {setting: "bgcolor", type: "ColorChooser", id: s.idPrefix+"bgcolor"}, - padtop: {setting: "padtop", type: "PopupList", id: s.idPrefix+"padtop", - initialdata: scc.SCFormatPadsizes}, - padright: {setting: "padright", type: "PopupList", id: s.idPrefix+"padright", - initialdata: scc.SCFormatPadsizes}, - padbottom: {setting: "padbottom", type: "PopupList", id: s.idPrefix+"padbottom", - initialdata: scc.SCFormatPadsizes}, - padleft: {setting: "padleft", type: "PopupList", id: s.idPrefix+"padleft", - initialdata: scc.SCFormatPadsizes}, - colwidth: {setting: "colwidth", type: "PopupList", id: s.idPrefix+"colwidth", - initialdata: scc.SCFormatColwidth}, - recalc: {setting: "recalc", type: "PopupList", id: s.idPrefix+"recalc", - initialdata: scc.SCFormatRecalc} - }; - viewobj.values.cellspanel = { - name: "cell", - colorchooser: {id: s.idPrefix+"scolorchooser"}, - cformatnumber: {setting: "numberformat", type: "PopupList", id: s.idPrefix+"cformatnumber", - initialdata: scc.SCFormatNumberFormats}, - cformattext: {setting: "textformat", type: "PopupList", id: s.idPrefix+"cformattext", - initialdata: scc.SCFormatTextFormats}, - cfontfamily: {setting: "fontfamily", type: "PopupList", id: s.idPrefix+"cfontfamily", - initialdata: scc.SCFormatFontfamilies}, - cfontlook: {setting: "fontlook", type: "PopupList", id: s.idPrefix+"cfontlook", - initialdata: scc.SCFormatFontlook}, - cfontsize: {setting: "fontsize", type: "PopupList", id: s.idPrefix+"cfontsize", - initialdata: scc.SCFormatFontsizes}, - calignhoriz: {setting: "alignhoriz", type: "PopupList", id: s.idPrefix+"calignhoriz", - initialdata: scc.SCFormatTextAlignhoriz}, - calignvert: {setting: "alignvert", type: "PopupList", id: s.idPrefix+"calignvert", - initialdata: scc.SCFormatAlignVertical}, - ctextcolor: {setting: "textcolor", type: "ColorChooser", id: s.idPrefix+"ctextcolor"}, - cbgcolor: {setting: "bgcolor", type: "ColorChooser", id: s.idPrefix+"cbgcolor"}, - cbt: {setting: "bt", type: "BorderSide", id: s.idPrefix+"cbt"}, - cbr: {setting: "br", type: "BorderSide", id: s.idPrefix+"cbr"}, - cbb: {setting: "bb", type: "BorderSide", id: s.idPrefix+"cbb"}, - cbl: {setting: "bl", type: "BorderSide", id: s.idPrefix+"cbl"}, - cpadtop: {setting: "padtop", type: "PopupList", id: s.idPrefix+"cpadtop", - initialdata: scc.SCFormatPadsizes}, - cpadright: {setting: "padright", type: "PopupList", id: s.idPrefix+"cpadright", - initialdata: scc.SCFormatPadsizes}, - cpadbottom: {setting: "padbottom", type: "PopupList", id: s.idPrefix+"cpadbottom", - initialdata: scc.SCFormatPadsizes}, - cpadleft: {setting: "padleft", type: "PopupList", id: s.idPrefix+"cpadleft", - initialdata: scc.SCFormatPadsizes}, - ceditable: {setting: "ceditable", type: "PopupList", id: s.idPrefix+"ceditable", - initialdata: scc.SCFormatEditable}, - constraints: {setting: "cconstraints", type: "PopupList", id: s.idPrefix+"cconstraints", - initialdata: scc.SCFormatConstraints} - }; - - SocialCalc.SettingsControlInitializePanel(viewobj.values.sheetspanel); - SocialCalc.SettingsControlInitializePanel(viewobj.values.cellspanel); - }, - replacements: { - itemtitle: {regex: /\%itemtitle\./g, replacement: 'style="padding:12px 10px 0px 10px;font-weight:bold;text-align:right;vertical-align:top;font-size:small;"'}, - sectiontitle: {regex: /\%sectiontitle\./g, replacement: 'style="padding:16px 10px 0px 0px;font-weight:bold;vertical-align:top;font-size:small;color:#C00;"'}, - parttitle: {regex: /\%parttitle\./g, replacement: 'style="font-weight:bold;font-size:x-small;padding:0px 0px 3px 0px;"'}, - itembody: {regex: /\%itembody\./g, replacement: 'style="padding:12px 0px 0px 0px;vertical-align:top;font-size:small;"'}, - bodypart: {regex: /\%bodypart\./g, replacement: 'style="padding:0px 10px 0px 0px;font-size:small;vertical-align:top;"'} - }, - divStyle: "border:1px solid black;overflow:auto;", - html: - ''+ -''+ -'
    '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -'

    %loc!Format!:
    '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Number!
    '+ -' '+ -'
    '+ -'
    %loc!Text!
    '+ -' '+ -'
    '+ -'

    %loc!Alignment!:
    '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Horizontal!
    '+ -' '+ -'
    '+ -'
    %loc!Vertical!
    '+ -' '+ -'
    '+ -'

    %loc!Font!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Family!
    '+ -' '+ -'
    '+ -'
    %loc!Bold & Italics!
    '+ -' '+ -'
    '+ -'
    %loc!Size!
    '+ -' '+ -'
    '+ -'
    %loc!Color!
    '+ -'
    '+ -'
    '+ -'
    %loc!Background!
    '+ -'
    '+ -'
    '+ -'

    %loc!Borders!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    %loc!Top Border!
    %loc!Right Border!
    %loc!Bottom Border!
    %loc!Left Border!
    '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        
    '+ -'

    %loc!Padding!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Top!
    '+ -' '+ -'
    '+ -'
    %loc!Right!
    '+ -' '+ -'
    '+ -'
    %loc!Bottom!
    '+ -' '+ -'
    '+ -'
    %loc!Left!
    '+ -' '+ -'
    '+ -'

    %loc!Editable!:
    '+ -' '+ -' '+ -'
    '+ -'
     
    '+ -' '+ -'
    '+ -'

    %loc!Constraints!:
    '+ -' '+ -' '+ -'
    '+ -'
     
    '+ -' '+ -'
    '+ -'
    '+ -'
    '+ -'
    '+ -' '+ -' '+ -'
    %loc!This is a
    sample!
    -1234.5
    '+ -'
    '+ -'
    '+ -'
    ' - }; - - // Sort - - this.tabnums.sort = this.tabs.length; - this.tabs.push({name: "sort", text: "Sort", html: - ' ', - onclick: SocialCalc.SpreadsheetControlSortOnclick}); - this.editor.SettingsCallbacks.sort = {save: SocialCalc.SpreadsheetControlSortSave, load: SocialCalc.SpreadsheetControlSortLoad}; - - // Audit - - this.tabnums.audit = this.tabs.length; - this.tabs.push({name: "audit", text: "Audit", html: - '', - view: "audit", - onclick: - function(s, t) { - var SCLoc = SocialCalc.LocalizeString; - var i, j; - var str = '
    '+SCLoc("Audit Trail This Session")+':

    '; - var stack = s.sheet.changes.stack; - var tos = s.sheet.changes.tos; - for (i=0; i'; - for (j=0; j"; - } - } - s.views.audit.element.innerHTML = str+"
    "; - SocialCalc.CmdGotFocus(true); - }, - onclickFocus: true - }); - - this.views["audit"] = {name: "audit", - divStyle: "border:1px solid black;overflow:auto;", - html: 'Audit Trail' - }; - - // Comment - - this.tabnums.comment = this.tabs.length; - this.tabs.push({name: "comment", text: "Comment", html: - '', - view: "sheet", - onclick: SocialCalc.SpreadsheetControlCommentOnclick, - onunclick: SocialCalc.SpreadsheetControlCommentOnunclick - }); - - // Names - - this.tabnums.names = this.tabs.length; - this.tabs.push({name: "names", text: "Names", html: - '', - view: "sheet", - onclick: SocialCalc.SpreadsheetControlNamesOnclick, - onunclick: SocialCalc.SpreadsheetControlNamesOnunclick - }); - - // Clipboard - - this.tabnums.clipboard = this.tabs.length; - this.tabs.push({name: "clipboard", text: "Clipboard", html: - '', - view: "clipboard", - onclick: SocialCalc.SpreadsheetControlClipboardOnclick, - onclickFocus: "clipboardtext" - }); - - this.views["clipboard"] = {name: "clipboard", divStyle: "overflow:auto;", html: - '
    '+ - ' %loc!Display Clipboard in!:'+ - ' %loc!Tab-delimited format!  '+ - ' %loc!CSV format!  '+ - ' %loc!SocialCalc-save format!'+ - '
    '+ - '   '+ - '   '+ - '
    '+ - ' ' - }; - - return; - - } - -// Methods: - -SocialCalc.SpreadsheetControl.prototype.InitializeSpreadsheetControl = - function(node, height, width, spacebelow) {return SocialCalc.InitializeSpreadsheetControl(this, node, height, width, spacebelow);}; -SocialCalc.SpreadsheetControl.prototype.DoOnResize = function() {return SocialCalc.DoOnResize(this);}; -SocialCalc.SpreadsheetControl.prototype.SizeSSDiv = function() {return SocialCalc.SizeSSDiv(this);}; -SocialCalc.SpreadsheetControl.prototype.ExecuteCommand = - function(combostr, sstr) {return SocialCalc.SpreadsheetControlExecuteCommand(this, combostr, sstr);}; -SocialCalc.SpreadsheetControl.prototype.CreateSheetHTML = - function() {return SocialCalc.SpreadsheetControlCreateSheetHTML(this);}; -SocialCalc.SpreadsheetControl.prototype.CreateSpreadsheetSave = - function(otherparts) {return SocialCalc.SpreadsheetControlCreateSpreadsheetSave(this, otherparts);}; -SocialCalc.SpreadsheetControl.prototype.DecodeSpreadsheetSave = - function(str) {return SocialCalc.SpreadsheetControlDecodeSpreadsheetSave(this, str);}; -SocialCalc.SpreadsheetControl.prototype.CreateCellHTML = - function(coord) {return SocialCalc.SpreadsheetControlCreateCellHTML(this, coord);}; -SocialCalc.SpreadsheetControl.prototype.CreateCellHTMLSave = - function(range) {return SocialCalc.SpreadsheetControlCreateCellHTMLSave(this, range);}; - - -// Sheet Methods to make things a little easier: - -SocialCalc.SpreadsheetControl.prototype.ParseSheetSave = function(str) {return this.sheet.ParseSheetSave(str);}; -SocialCalc.SpreadsheetControl.prototype.CreateSheetSave = function() {return this.sheet.CreateSheetSave();}; - - -// Functions: - -// -// InitializeSpreadsheetControl(spreadsheet, node, height, width, spacebelow) -// -// Creates the control elements and makes them the child of node (string or element). -// If present, height and width specify size. -// If either is 0 or null (missing), the maximum that fits on the screen -// (taking spacebelow into account) is used. -// -// Displays the tabs and creates the views (other than "sheet"). -// The first tab is set as selected, but onclick is not invoked. -// -// You should do a redisplay or recalc (which redisplays) after running this. -// - -SocialCalc.InitializeSpreadsheetControl = function(spreadsheet, node, height, width, spacebelow) { - - var scc = SocialCalc.Constants; - var SCLoc = SocialCalc.LocalizeString; - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var html, child, i, vname, v, style, button, bele; - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - spreadsheet.requestedHeight = height; - spreadsheet.requestedWidth = width; - spreadsheet.requestedSpaceBelow = spacebelow; - - if (typeof node == "string") node = document.getElementById(node); - - if (node == null) { - alert("SocialCalc.SpreadsheetControl not given parent node."); - } - - spreadsheet.parentNode = node; - - // create node to hold spreadsheet control - - spreadsheet.spreadsheetDiv = document.createElement("div"); - - spreadsheet.SizeSSDiv(); // calculate and fill in the size values - - for (child=node.firstChild; child!=null; child=node.firstChild) { - node.removeChild(child); - } - - // create the tabbed UI at the top - - html = '
    '; - - for (i=0; i'+ - ''; - - for (i=0; i' + SCLoc(tabs[i].text) + ''; - } - - html += '
    '; - - spreadsheet.currentTab = 0; // this is where we started - - for (style in spreadsheet.tabreplacements) { - html = html.replace(spreadsheet.tabreplacements[style].regex, spreadsheet.tabreplacements[style].replacement); - } - html = html.replace(/\%s\./g, "SocialCalc."); - html = html.replace(/\%id\./g, spreadsheet.idPrefix); - html = html.replace(/\%tbt\./g, spreadsheet.toolbartext); - html = html.replace(/\%img\./g, spreadsheet.imagePrefix); - - html = SCLocSS(html); // localize with %loc!string! and %scc!constant! - - spreadsheet.spreadsheetDiv.innerHTML = html; - - node.appendChild(spreadsheet.spreadsheetDiv); - - // Initialize SocialCalc buttons - -spreadsheet.Buttons = { - button_undo: {tooltip: "Undo", command: "undo"}, - button_redo: {tooltip: "Redo", command: "redo"}, - button_copy: {tooltip: "Copy", command: "copy"}, - button_cut: {tooltip: "Cut", command: "cut"}, - button_paste: {tooltip: "Paste", command: "paste"}, - button_pasteformats: {tooltip: "Paste Formats", command: "pasteformats"}, - button_delete: {tooltip: "Delete Contents", command: "delete"}, - button_filldown: {tooltip: "Fill Down", command: "filldown"}, - button_fillright: {tooltip: "Fill Right", command: "fillright"}, - button_movefrom: {tooltip: "Set/Clear Move From", command: "movefrom"}, - button_movepaste: {tooltip: "Move Paste", command: "movepaste"}, - button_moveinsert: {tooltip: "Move Insert", command: "moveinsert"}, - button_alignleft: {tooltip: "Align Left", command: "align-left"}, - button_aligncenter: {tooltip: "Align Center", command: "align-center"}, - button_alignright: {tooltip: "Align Right", command: "align-right"}, - button_borderon: {tooltip: "Borders On", command: "borderon"}, - button_borderoff: {tooltip: "Borders Off", command: "borderoff"}, - button_swapcolors: {tooltip: "Swap Colors", command: "swapcolors"}, - button_merge: {tooltip: "Merge Cells", command: "merge"}, - button_unmerge: {tooltip: "Unmerge Cells", command: "unmerge"}, - button_insertrow: {tooltip: "Insert Row", command: "insertrow"}, - button_insertcol: {tooltip: "Insert Column", command: "insertcol"}, - button_deleterow: {tooltip: "Delete Row", command: "deleterow"}, - button_deletecol: {tooltip: "Delete Column", command: "deletecol"}, - button_recalc: {tooltip: "Recalc", command: "recalc"} - } - - for (button in spreadsheet.Buttons) { - bele = document.getElementById(spreadsheet.idPrefix+button); - if (!bele) {alert("Button "+(spreadsheet.idPrefix+button)+" missing"); continue;} - bele.style.border = "1px solid "+scc.ISCButtonBorderNormal; - SocialCalc.TooltipRegister(bele, SCLoc(spreadsheet.Buttons[button].tooltip), {}); - SocialCalc.ButtonRegister(bele, - {normalstyle: "border:1px solid "+scc.ISCButtonBorderNormal+";backgroundColor:"+scc.ISCButtonBorderNormal+";", - hoverstyle: "border:1px solid "+scc.ISCButtonBorderHover+";backgroundColor:"+scc.ISCButtonBorderNormal+";", - downstyle: "border:1px solid "+scc.ISCButtonBorderDown+";backgroundColor:"+scc.ISCButtonDownBackground+";"}, - {MouseDown: SocialCalc.DoButtonCmd, command: spreadsheet.Buttons[button].command}); - } - - // create formula bar - - spreadsheet.formulabarDiv = document.createElement("div"); - spreadsheet.formulabarDiv.style.height = spreadsheet.formulabarheight + "px"; - spreadsheet.formulabarDiv.innerHTML = ' '; //' '; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - var inputbox = new SocialCalc.InputBox(spreadsheet.formulabarDiv.firstChild, spreadsheet.editor); - - for (button in spreadsheet.formulabuttons) { - bele = document.createElement("img"); - bele.id = spreadsheet.idPrefix+button; - bele.src = spreadsheet.imagePrefix+spreadsheet.formulabuttons[button].image; - bele.style.verticalAlign = "middle"; - bele.style.border = "1px solid #FFF"; - bele.style.marginLeft = "4px"; - SocialCalc.TooltipRegister(bele, SCLoc(spreadsheet.formulabuttons[button].tooltip), {}); - SocialCalc.ButtonRegister(bele, - {normalstyle: "border:1px solid #FFF;backgroundColor:#FFF;", - hoverstyle: "border:1px solid #CCC;backgroundColor:#FFF;", - downstyle: "border:1px solid #000;backgroundColor:#FFF;"}, - {MouseDown: spreadsheet.formulabuttons[button].command}); - spreadsheet.formulabarDiv.appendChild(bele); - } - - // initialize tabs that need it - - for (i=0; i 1 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 1; // restore what was there if reasonable - sele = document.getElementById(spreadsheet.idPrefix+"minorsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col=range.cr1.col; col<=range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = oldindex > 0 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 0; // default to [none] - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col=range.cr1.col; col<=range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = oldindex > 0 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 0; // default to [none] - - } - -// -// SocialCalc.CmdGotFocus(obj) -// -// Sets SocialCalc.Keyboard.passThru: obj should be element with focus or "true" -// - -SocialCalc.CmdGotFocus = function(obj) { - - SocialCalc.Keyboard.passThru = obj; - - } - - -// -// SocialCalc.DoButtonCmd(e, buttoninfo, bobj) -// - -SocialCalc.DoButtonCmd = function(e, buttoninfo, bobj) { - - SocialCalc.DoCmd(bobj.element, bobj.functionobj.command); - - } - -// -// SocialCalc.DoCmd(obj, which) -// -// xxx -// - -SocialCalc.DoCmd = function(obj, which) { - - var combostr, sstr, cl, i, clele, slist, slistele, str, sele, rele, lele, ele, sortrange, nrange, rparts; - var sheet, cell, color, bgcolor, defaultcolor, defaultbgcolor; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - switch (which) { - case "undo": - spreadsheet.ExecuteCommand("undo", ""); - break; - - case "redo": - spreadsheet.ExecuteCommand("redo", ""); - break; - - case "fill-rowcolstuff": - case "fill-text": - cl = which.substring(5); - clele = document.getElementById(spreadsheet.idPrefix+cl+"list"); - clele.length = 0; - for (i=0; i0) { - rele = document.getElementById(spreadsheet.idPrefix+"minorsortup"); - str += " "+sele.options[sele.selectedIndex].value + (rele.checked ? " up" : " down"); - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (sele.selectedIndex>0) { - rele = document.getElementById(spreadsheet.idPrefix+"lastsortup"); - str += " "+sele.options[sele.selectedIndex].value + (rele.checked ? " up" : " down"); - } - spreadsheet.ExecuteCommand(str, ""); - break; - - case "merge": - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - if (editor.range.hasrange) { // set ecell to upper left - editor.MoveECell(SocialCalc.crToCoord(editor.range.left, editor.range.top)); - editor.RangeRemove(); - } - break; - - case "movefrom": - if (editor.range2.hasrange) { // toggle if already there - spreadsheet.context.cursorsuffix = ""; - editor.Range2Remove(); - spreadsheet.ExecuteCommand("redisplay", ""); - } - else if (editor.range.hasrange) { // set range2 to range or one cell - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.MoveECell(SocialCalc.crToCoord(editor.range.left, editor.range.top)); - } - else { - editor.range2.top = editor.ecell.row; - editor.range2.right = editor.ecell.col; - editor.range2.bottom = editor.ecell.row; - editor.range2.left = editor.ecell.col; - editor.range2.hasrange = true; - } - str = editor.range2.hasrange ? "" : "off"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movefrom"); - ele.src=spreadsheet.imagePrefix+"movefrom"+str+".gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movepaste"); - ele.src=spreadsheet.imagePrefix+"movepaste"+str+".gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_moveinsert"); - ele.src=spreadsheet.imagePrefix+"moveinsert"+str+".gif"; - if (editor.range2.hasrange) editor.RangeRemove(); - break; - - case "movepaste": - case "moveinsert": - if (editor.range2.hasrange) { - spreadsheet.context.cursorsuffix = ""; - combostr = which+" "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord; - spreadsheet.ExecuteCommand(combostr, ""); - editor.Range2Remove(); - ele = document.getElementById(spreadsheet.idPrefix+"button_movefrom"); - ele.src=spreadsheet.imagePrefix+"movefromoff.gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movepaste"); - ele.src=spreadsheet.imagePrefix+"movepasteoff.gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_moveinsert"); - ele.src=spreadsheet.imagePrefix+"moveinsertoff.gif"; - } - break; - - case "swapcolors": - sheet = spreadsheet.sheet; - cell = sheet.GetAssuredCell(editor.ecell.coord); - defaultcolor = sheet.attribs.defaultcolor ? sheet.colors[sheet.attribs.defaultcolor] : "rgb(0,0,0)"; - defaultbgcolor = sheet.attribs.defaultbgcolor ? sheet.colors[sheet.attribs.defaultbgcolor] : "rgb(255,255,255)"; - color = cell.color ? sheet.colors[cell.color] : defaultcolor; // get color - if (color == defaultbgcolor) color = ""; // going to swap, so if same as background default, use default - bgcolor = cell.bgcolor ? sheet.colors[cell.bgcolor] : defaultbgcolor; - if (bgcolor == defaultcolor) bgcolor = ""; // going to swap, so if same as foreground default, use default - spreadsheet.ExecuteCommand("set %C color "+bgcolor+"%Nset %C bgcolor "+color, ""); - break; - - default: - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - break; - } - - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - - } - -SocialCalc.SpreadsheetCmdLookup = { - 'copy': 'copy %C all', - 'cut': 'cut %C all', - 'paste': 'paste %C all', - 'pasteformats': 'paste %C formats', - 'delete': 'erase %C formulas', - 'filldown': 'filldown %C all', - 'fillright': 'fillright %C all', - 'erase': 'erase %C all', - 'borderon': 'set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S', - 'borderoff': 'set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S', - 'merge': 'merge %C', - 'unmerge': 'unmerge %C', - 'align-left': 'set %C cellformat left', - 'align-center': 'set %C cellformat center', - 'align-right': 'set %C cellformat right', - 'align-default': 'set %C cellformat', - 'insertrow': 'insertrow %C', - 'insertcol': 'insertcol %C', - 'deleterow': 'deleterow %C', - 'deletecol': 'deletecol %C', - 'undo': 'undo', - 'redo': 'redo', - 'recalc': 'recalc' - } - -SocialCalc.SpreadsheetCmdSLookup = { - 'borderon': '1px solid rgb(0,0,0)', - 'borderoff': '' - } - -/******* NO LONGER USED - -SocialCalc.SpreadsheetCmdTable = { - cmd: [ - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"}, - {t:"Copy", s:"all", c:"copy %C %S"}, - {t:"Cut", s:"all", c:"cut %C %S"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Merge Cells", s:"none", c:"merge %C"}, - {t:"Unmerge", s:"none", c:"unmerge %C"}, - {t:"Sort", s:"sortcol", c:"sort %R %S"}, - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Cell Borders", s:"borderOnOff", c:"set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S"}, - {t:"Column Width", s:"colWidths", c:"set %W width %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"}, - {t:"Default Column Width", s:"colWidths", c:"set sheet defaultcolwidth %S"} - ], - rowcolstuff: [ - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"} - ], - text: [ - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Text Format", s:"tvf", c:"set %C textvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Text Format", s:"tvf", c:"set sheet defaulttextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"} - ], - slists: { - "colors": [ - {t:"Default", s:""}, - {t:"Black", s:"rgb(0,0,0)"}, - {t:"Dark Gray", s:"rgb(102,102,102)"}, // #666 - {t:"Gray", s:"rgb(204,204,204)"}, // #CCC - {t:"White", s:"rgb(255,255,255)"}, - {t:"Red", s:"rgb(255,0,0)"}, - {t:"Dark Red", s:"rgb(153,0,0)"}, - {t:"Orange", s:"rgb(255,153,0)"}, - {t:"Yellow", s:"rgb(255,255,0)"}, - {t:"Light Yellow", s:"rgb(255,255,204)"}, - {t:"Green", s:"rgb(0,255,0)"}, - {t:"Dark Green", s:"rgb(0,153,0)"}, - {t:"Blue", s:"rgb(0,0,255)"}, - {t:"Dark Blue", s:"rgb(0,0,153)"}, - {t:"Light Blue", s:"rgb(204,204,255)"} - ], - "fonts": [ // style weight size family - {t:"Default", s:""}, - {t:"Bold", s:"normal bold * *"}, - {t:"Italic", s:"italic normal * *"}, - {t:"Small", s:"* small *"}, - {t:"Medium", s:"* medium *"}, - {t:"Large", s:"* large *"}, - {t:"Bold Small", s:"normal bold small *"}, - {t:"Bold Medium", s:"normal bold medium *"}, - {t:"Bold Large", s:"normal bold large *"} - ], - "cellformat": [ - {t:"Default", s:""}, - {t:"Left", s:"left"}, - {t:"Right", s:"right"}, - {t:"Center", s:"center"} - ], - "borderOnOff": [ - {t:"On", s:"1px solid rgb(0,0,0)"}, - {t:"Off", s:""} - ], - "colWidths": [ - {t:"Default", s:""}, - {t:"20", s:"20"}, - {t:"40", s:"40"}, - {t:"60", s:"60"}, - {t:"80", s:"80"}, - {t:"100", s:"100"}, - {t:"120", s:"120"}, - {t:"140", s:"140"}, - {t:"160", s:"160"}, - {t:"180", s:"180"}, - {t:"200", s:"200"}, - {t:"220", s:"220"}, - {t:"240", s:"240"}, - {t:"260", s:"260"}, - {t:"280", s:"280"}, - {t:"300", s:"300"} - ], - "ntvf": [ - {t:"Default", s:""}, - {t:"1234", s:"0"}, - {t:"1,234", s:"#,##0"}, - {t:"1,234.5", s:"#,##0.0"}, - {t:"1,234.56", s:"#,##0.00"}, - {t:"1,234.567", s:"#,##0.000"}, - {t:"1,234%", s:"#,##0%"}, - {t:"1,234.5%", s:"#,##0.0%"}, - {t:"(1,234)", s:"#,##0_);(#,##0)"}, - {t:"(1,234.5)", s:"#,##0.0_);(#,##0.0)"}, - {t:"(1,234.56)", s:"#,##0.00_);(#,##0.00)"}, - {t:"00", s:"00"}, - {t:"000", s:"000"}, - {t:"0000", s:"0000"}, - {t:"$1,234.56", s:"$#,##0.00"}, - {t:"2006-01-04", s:"yyyy-mm-dd"}, - {t:"01:23:45", s:"hh:mm:ss"}, - {t:"2006-01-04 01:23:45", s:"yyyy-mm-dd hh:mm:ss"}, - {t:"Hidden", s:"hidden"} - ], - "tvf": [ - {t:"Default", s:""}, - {t:"Automatic", s:"general"}, - {t:"Plain Text", s:"text-plain"}, - {t:"HTML", s:"text-html"}, - {t:"Wiki", s:"text-wiki"}, - {t:"Hidden", s:"hidden"} - ], - "ffal": [ // Formulas, Formats, All - {t:"All", s:"all"}, - {t:"Contents", s:"formulas"}, - {t:"Formats", s:"formats"} - ], - "all": [ // All - {t:"All", s:"all"} - ], - "rowcol": [ - {t:"Row", s:"row"}, - {t:"Column", s:"col"} - ], - "sortcol": [ - {t:"A up", s:"A up"}, - {t:"B up", s:"B up"}, - {t:"C up", s:"C up"}, - {t:"A down", s:"A down"}, - {t:"B down", s:"B down"}, - {t:"C down", s:"C down"}, - {t:"A, B, C up", s:"A up B up C up"} - ], - "none": [ // nothing - {t:" ", s:" "} - ] - } - } -*********/ - -// -// SocialCalc.SpreadsheetControlExecuteCommand(obj, combostr, sstr) -// -// xxx -// - -SocialCalc.SpreadsheetControlExecuteCommand = function(obj, combostr, sstr) { - - var i, commands; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var eobj = spreadsheet.editor; - - var str = {}; - str.P = "%"; - str.N = "\n" - if (eobj.range.hasrange) { - str.R = SocialCalc.crToCoord(eobj.range.left, eobj.range.top)+ - ":"+SocialCalc.crToCoord(eobj.range.right, eobj.range.bottom); - str.C = str.R; - str.W = SocialCalc.rcColname(eobj.range.left) + ":" + SocialCalc.rcColname(eobj.range.right); - } - else { - str.C = eobj.ecell.coord; - str.R = eobj.ecell.coord+":"+eobj.ecell.coord; - str.W = SocialCalc.rcColname(SocialCalc.coordToCr(eobj.ecell.coord).col); - } - str.S = sstr; - combostr = combostr.replace(/%C/g, str.C); - combostr = combostr.replace(/%R/g, str.R); - combostr = combostr.replace(/%N/g, str.N); - combostr = combostr.replace(/%S/g, str.S); - combostr = combostr.replace(/%W/g, str.W); - combostr = combostr.replace(/%P/g, str.P); - - eobj.EditorScheduleSheetCommands(combostr, true, false); - - } - -// -// result = SocialCalc.SpreadsheetControlCreateSheetHTML(spreadsheet) -// -// Returns the HTML representation of the whole spreadsheet -// - -SocialCalc.SpreadsheetControlCreateSheetHTML = function(spreadsheet) { - - var context, div, ele; - - var result = ""; - - context = new SocialCalc.RenderContext(spreadsheet.sheet); - div = document.createElement("div"); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - result = div.innerHTML; - delete ele; - delete div; - return result; - - } - -// -// result = SocialCalc.SpreadsheetControlCreateCellHTML(spreadsheet, coord, linkstyle) -// -// Returns the HTML representation of a cell. Blank is "", not " ". -// - -SocialCalc.SpreadsheetControlCreateCellHTML = function(spreadsheet, coord, linkstyle) { - - var result = ""; - var cell = spreadsheet.sheet.cells[coord]; - - if (!cell) return ""; - - if (cell.displaystring == undefined) { - result = SocialCalc.FormatValueForDisplay(spreadsheet.sheet, cell.datavalue, coord, (linkstyle || spreadsheet.context.defaultHTMLlinkstyle)); - } - else { - result = cell.displaystring; - } - - if (result == " ") result = ""; - - return result; - - } - -// -// result = SocialCalc.SpreadsheetControlCreateCellHTMLSave(spreadsheet, range, linkstyle) -// -// Returns the HTML representation of a range of cells, or the whole sheet if range is null. -// The form is: -// version:1.0 -// coord:cell-HTML -// coord:cell-HTML -// ... -// -// Empty cells are skipped. The cell-HTML is encoded with ":"=>"\c", newline=>"\n", and "\"=>"\b". -// - -SocialCalc.SpreadsheetControlCreateCellHTMLSave = function(spreadsheet, range, linkstyle) { - - var cr1, cr2, row, col, coord, cell, cellHTML; - var result = []; - var prange; - - if (range) { - prange = SocialCalc.ParseRange(range); - } - else { - prange = {cr1: {row: 1, col:1}, - cr2: {row: spreadsheet.sheet.attribs.lastrow, col: spreadsheet.sheet.attribs.lastcol}}; - } - cr1 = prange.cr1; - cr2 = prange.cr2; - - result.push("version:1.0"); - - for (row=cr1.row; row <= cr2.row; row++) { - for (col=cr1.col; col <= cr2.col; col++) { - coord = SocialCalc.crToCoord(col, row); - cell=spreadsheet.sheet.cells[coord]; - if (!cell) continue; - if (cell.displaystring == undefined) { - cellHTML = SocialCalc.FormatValueForDisplay(spreadsheet.sheet, cell.datavalue, coord, (linkstyle || spreadsheet.context.defaultHTMLlinkstyle)); - } - else { - cellHTML = cell.displaystring; - } - if (cellHTML == " ") continue; - result.push(coord+":"+SocialCalc.encodeForSave(cellHTML)); - } - } - - result.push(""); // one extra to get extra \n - return result.join("\n"); - } - -// -// Formula Bar Button Routines -// - -SocialCalc.SpreadsheetControl.DoFunctionList = function() { - - var i, cname, str, f, ele; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var fcl = scc.function_classlist; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - scf.FillFunctionInfo(); - - str = '
    %loc!Category!
    '+ - '
      %loc!Functions!
    '+ - '
    '+ - '
    '+SocialCalc.SpreadsheetControl.GetFunctionInfoStr(scf.FunctionClasses[fcl[0]].items[0])+'
    '+ - '
    '+ - ' '+ - '
    '+ - '
    '; - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - str = ''+ - ''+ - '
    '+" %loc!Function List!"+' X 
    '+ - '
    '+str+'
    '; - - str = SocialCalc.LocalizeSubstrings(str); - - main.innerHTML = str; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"name"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide; if All, letter scrolls to there - - } - -SocialCalc.SpreadsheetControl.GetFunctionNamesStr = function(cname) { - - var i, f; - var scf = SocialCalc.Formula; - var str = ""; - - f = scf.FunctionClasses[cname]; - for (i=0; i':'>')+f.items[i]+''; - } - - return str; - - } - -SocialCalc.SpreadsheetControl.FillFunctionNames = function(cname, ele) { - - var i, f; - var scf = SocialCalc.Formula; - - ele.length = 0; - f = scf.FunctionClasses[cname]; - for (i=0; i
    "; - str += scsc(f[3]); - - return str; - - } - -SocialCalc.SpreadsheetControl.FunctionClassChosen = function(cname) { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - var scf = SocialCalc.Formula; - - SocialCalc.SpreadsheetControl.FillFunctionNames(cname, document.getElementById(idp+"name")); - - SocialCalc.SpreadsheetControl.FunctionChosen(scf.FunctionClasses[cname].items[0]); - - } - -SocialCalc.SpreadsheetControl.FunctionChosen = function(fname) { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - - document.getElementById(idp+"desc").innerHTML = SocialCalc.SpreadsheetControl.GetFunctionInfoStr(fname); - - } - -SocialCalc.SpreadsheetControl.HideFunctions = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById(spreadsheet.idPrefix+"functiondialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - } - -SocialCalc.SpreadsheetControl.DoFunctionPaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var ele = document.getElementById(spreadsheet.idPrefix+"functionname"); - var mele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - var text = ele.value+"("; - - SocialCalc.SpreadsheetControl.HideFunctions(); - - if (mele) { // multi-line editing is in progress - mele.value += text; - mele.focus(); - SocialCalc.CmdGotFocus(mele); - } - else { - editor.EditorAddToInput(text, "="); - } - - } - - -SocialCalc.SpreadsheetControl.DoMultiline = function() { - - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var str, ele, text; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"multiline"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - text = SocialCalc.special_chars(text); - - str = ''+ - '
    '+ - SCLocSS(' '+ - ' '+ - '
    '+ - ''); - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+ - SCLocSS(" %loc!Multi-line Input Box!")+' X 
    '+ - '
    '+str+'
    '; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"textarea"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide? - - } - - -SocialCalc.SpreadsheetControl.HideMultiline = function() { - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinedialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - - } - -SocialCalc.SpreadsheetControl.DoMultilineClear = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - ele.value = ""; - ele.focus(); - - } - - -SocialCalc.SpreadsheetControl.DoMultilinePaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - var text = ele.value; - - SocialCalc.SpreadsheetControl.HideMultiline(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - editor.EditorSaveEdit(text); - - } - - -SocialCalc.SpreadsheetControl.DoLink = function() { - - var SCLoc = SocialCalc.LocalizeString; - - var str, ele, text, cell, setformat, popup; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"link"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - if (text.charAt(0)=="'") { - text = text.slice(1); - } - - var parts = SocialCalc.ParseCellLinkText(text); - - text = SocialCalc.special_chars(text); - - cell = spreadsheet.sheet.cells[editor.ecell.coord]; - if (!cell || !cell.textvalueformat) { // set to link format, but don't override - setformat = " checked"; - } - else { - setformat = ""; - } - - popup = parts.newwin ? " checked" : ""; - - str = '
    '+ - ''+SCLoc("Description")+'
    '+ - '
    '+ - ''+SCLoc("URL")+'
    '+ - '
    '; - if (SocialCalc.Callbacks.MakePageLink) { // only show if handling pagenames here - str += ''+SCLoc("Page Name")+'
    '+ - '
    '+ - ''+SCLoc("Workspace")+'
    '+ - '
    '; - } - str += SocialCalc.LocalizeSubstrings(' '+ - '%loc!Set to Link format!
    '+ - ' '+ - '%loc!Show in new browser window!'+ - '
    '+ - '
    '+ - ' '+ - ' '+ - '
    '+ - ''); - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+SCLoc("Link Input Box")+' X 
    '+ - '
    '+str+'
    '; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"url"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide? - - } - - -SocialCalc.SpreadsheetControl.HideLink = function() { - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix+"linkdialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - - } - -SocialCalc.SpreadsheetControl.DoLinkClear = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - document.getElementById(spreadsheet.idPrefix+"linkdesc").value = ""; - document.getElementById(spreadsheet.idPrefix+"linkpagename").value = ""; - document.getElementById(spreadsheet.idPrefix+"linkworkspace").value = ""; - - var ele = document.getElementById(spreadsheet.idPrefix+"linkurl"); - ele.value = ""; - ele.focus(); - - } - - -SocialCalc.SpreadsheetControl.DoLinkPaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var descele = document.getElementById(spreadsheet.idPrefix+"linkdesc"); - var urlele = document.getElementById(spreadsheet.idPrefix+"linkurl"); - var pagenameele = document.getElementById(spreadsheet.idPrefix+"linkpagename"); - var workspaceele = document.getElementById(spreadsheet.idPrefix+"linkworkspace"); - var formatele = document.getElementById(spreadsheet.idPrefix+"linkformat"); - var popupele = document.getElementById(spreadsheet.idPrefix+"linkpopup"); - - var text = ""; - - var ltsym, gtsym, obsym, cbsym; - - if (popupele.checked) { - ltsym = "<<"; gtsym = ">>"; obsym = "[["; cbsym = "]]"; - } - else { - ltsym = "<"; gtsym = ">"; obsym = "["; cbsym = "]"; - } - - if (pagenameele && pagenameele.value) { - if (workspaceele.value) { - text = descele.value+"{"+workspaceele.value+obsym+pagenameele.value+cbsym+"}"; - } - else { - text = descele.value+obsym+pagenameele.value+cbsym; - } - } - else { - text = descele.value+ltsym+urlele.value+gtsym; - } - - SocialCalc.SpreadsheetControl.HideLink(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - if (formatele.checked) { - SocialCalc.SpreadsheetControlExecuteCommand(null, "set %C textvalueformat text-link", ""); - } - - editor.EditorSaveEdit(text); - - } - -SocialCalc.SpreadsheetControl.DoSum = function() { - - var cmd, cell, row, col, sel, cr, foundvalue; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var sheet = editor.context.sheetobj; - - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - cmd = "set "+SocialCalc.crToCoord(editor.range.right, editor.range.bottom+1)+ - " formula sum("+sel+")"; - } - else { - row = editor.ecell.row - 1; - col = editor.ecell.col; - if (row<=1) { - cmd = "set "+editor.ecell.coord+" constant e#REF! 0 #REF!"; - } - else { - foundvalue = false; - while (row>0) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (!cell.datatype || cell.datatype=="t") { - if (foundvalue) { - row++; - break; - } - } - else { - foundvalue = true; - } - row--; - } - cmd = "set "+editor.ecell.coord+" formula sum("+ - SocialCalc.crToCoord(col,row)+":"+SocialCalc.crToCoord(col, editor.ecell.row-1)+")"; - } - } - - editor.EditorScheduleSheetCommands(cmd, true, false); - - } - - -// -// TAB Routines -// - -// Sort - -SocialCalc.SpreadsheetControlSortOnclick = function(s, t) { - - var name, i; - var namelist = []; - var nl = document.getElementById(s.idPrefix+"sortlist"); - SocialCalc.LoadColumnChoosers(s); - s.editor.RangeChangeCallback.sort = SocialCalc.UpdateSortRangeProposal; - - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - nl.options[0] = new Option(SocialCalc.LocalizeString("[select range]")); - for (i=0; i0) { - rele = document.getElementById(spreadsheet.idPrefix+"minorsortup"); - str += ":"+sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } - else { - str += "::"; - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (sele.selectedIndex>0) { - rele = document.getElementById(spreadsheet.idPrefix+"lastsortup"); - str += ":"+sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } - else { - str += "::"; - } - return str+"\n"; - } - -SocialCalc.SpreadsheetControlSortLoad = function(editor, setting, line, flags) { - var parts, ele; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - parts = line.split(":"); - spreadsheet.sortrange = SocialCalc.decodeFromSave(parts[1]); - ele = document.getElementById(spreadsheet.idPrefix+"sortbutton"); - if (spreadsheet.sortrange) { - ele.value = SocialCalc.LocalizeString("Sort ")+spreadsheet.sortrange; - ele.style.visibility = "visible"; - } - else { - ele.style.visibility = "hidden"; - } - SocialCalc.LoadColumnChoosers(spreadsheet); - - sele = document.getElementById(spreadsheet.idPrefix+"majorsort"); - sele.selectedIndex = parts[2]-0; - document.getElementById(spreadsheet.idPrefix+"majorsort"+parts[3]).checked = true; - sele = document.getElementById(spreadsheet.idPrefix+"minorsort"); - if (parts[4]) { - sele.selectedIndex = parts[4]-0; - document.getElementById(spreadsheet.idPrefix+"minorsort"+parts[5]).checked = true; - } - else { - sele.selectedIndex = 0; - document.getElementById(spreadsheet.idPrefix+"minorsortup").checked = true; - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (parts[6]) { - sele.selectedIndex = parts[6]-0; - document.getElementById(spreadsheet.idPrefix+"lastsort"+parts[7]).checked = true; - } - else { - sele.selectedIndex = 0; - document.getElementById(spreadsheet.idPrefix+"lastsortup").checked = true; - } - - return true; - } - -// Comment - -SocialCalc.SpreadsheetControlCommentOnclick = function(s, t) { - s.editor.MoveECellCallback.comment = SocialCalc.SpreadsheetControlCommentMoveECell; - SocialCalc.SpreadsheetControlCommentDisplay(s, t); - SocialCalc.KeyboardFocus(); - return; - } - -SocialCalc.SpreadsheetControlCommentDisplay = function(s, t) { - var c = ""; - if (s.editor.ecell && s.editor.ecell.coord && s.sheet.cells[s.editor.ecell.coord]) { - c = s.sheet.cells[s.editor.ecell.coord].comment || ""; - } - document.getElementById(s.idPrefix+"commenttext").value = c; - } - -SocialCalc.SpreadsheetControlCommentMoveECell = function(editor) { - SocialCalc.SpreadsheetControlCommentDisplay(SocialCalc.GetSpreadsheetControlObject(), "comment"); - } - -SocialCalc.SpreadsheetControlCommentSet = function() { - var s=SocialCalc.GetSpreadsheetControlObject(); - s.ExecuteCommand("set %C comment "+SocialCalc.encodeForSave(document.getElementById(s.idPrefix+"commenttext").value)); - var cell=SocialCalc.GetEditorCellElement(s.editor, s.editor.ecell.row, s.editor.ecell.col); - s.editor.UpdateCellCSS(cell, s.editor.ecell.row, s.editor.ecell.col); - SocialCalc.KeyboardFocus(); - } - -SocialCalc.SpreadsheetControlCommentOnunclick = function(s, t) { - delete s.editor.MoveECellCallback.comment; - } - -// Names - -SocialCalc.SpreadsheetControlNamesOnclick = function(s, t) { - document.getElementById(s.idPrefix+"namesname").value = ""; - document.getElementById(s.idPrefix+"namesdesc").value = ""; - document.getElementById(s.idPrefix+"namesvalue").value = ""; - s.editor.RangeChangeCallback.names = SocialCalc.SpreadsheetControlNamesRangeChange; - s.editor.MoveECellCallback.names = SocialCalc.SpreadsheetControlNamesRangeChange; - SocialCalc.SpreadsheetControlNamesRangeChange(s.editor); - SocialCalc.SpreadsheetControlNamesFillNameList(); - SocialCalc.SpreadsheetControlNamesChangedName(); - } - -SocialCalc.SpreadsheetControlNamesFillNameList = function() { - var SCLoc = SocialCalc.LocalizeString; - var name, i; - var namelist = []; - var s=SocialCalc.GetSpreadsheetControlObject(); - var nl = document.getElementById(s.idPrefix+"nameslist"); - var currentname = document.getElementById(s.idPrefix+"namesname").value.toUpperCase().replace(/[^A-Z0-9_\.]/g, ""); - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - if (namelist.length > 0) { - nl.options[0] = new Option(SCLoc("[New]")); - } - else { - nl.options[0] = new Option(SCLoc("[None]")); - } - for (i=0; i 0) { - strtoedit = SocialCalc.special_chars(SocialCalc.OtherSaveParts[whichpart] || ""); - } - else { - strtoedit = "Listing of Parts\n"; - for (partname in SocialCalc.OtherSaveParts) { - strtoedit += SocialCalc.special_chars("\nPart: "+partname+"\n=====\n"+SocialCalc.OtherSaveParts[partname]+"\n"); - } - } - var editbox = document.createElement("div"); - editbox.style.cssText = "position:absolute;z-index:500;width:300px;height:300px;left:100px;top:200px;border:1px solid black;background-color:#EEE;text-align:center;"; - editbox.id = "socialcalc-editbox"; - editbox.innerHTML = whichpart+'



    '; - document.body.appendChild(editbox); - - var ebta = document.getElementById("socialcalc-editbox-textarea"); - ebta.focus(); - SocialCalc.CmdGotFocus(ebta); - - } - -SocialCalc.CtrlSEditorDone = function(idprefix, whichpart) { - - var edittextarea = document.getElementById(idprefix+"-textarea"); - var text = edittextarea.value; - if (whichpart.length > 0) { - if (text.length > 0) { - SocialCalc.OtherSaveParts[whichpart] = text; - } - else { - delete SocialCalc.OtherSaveParts[whichpart]; - } - } - - var editbox = document.getElementById(idprefix); - SocialCalc.KeyboardFocus(); - editbox.parentNode.removeChild(editbox); - - } - diff --git a/DeveloperAdoption/public/static/socialcalctableeditor.js b/DeveloperAdoption/public/static/socialcalctableeditor.js deleted file mode 100644 index 9d8d0c0..0000000 --- a/DeveloperAdoption/public/static/socialcalctableeditor.js +++ /dev/null @@ -1,6524 +0,0 @@ -// -// SocialCalcTableEditor -// -/* -// The code module of the SocialCalc package that displays a scrolling grid with panes -// and handles keyboard and mouse I/O. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript TableEditor. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the TableEditor is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/xoattrib - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { // created here, too, in case load order is wrong, but main routines are required - SocialCalc = {}; - } - -// ************************************* -// -// Table Editor class: -// -// ************************************* - -// Constructor: - -SocialCalc.TableEditor = function(context) { - - var scc = SocialCalc.Constants; - - // Properties: - - this.context = context; // editing context - this.toplevel = null; // top level HTML element for this table editor - this.fullgrid = null; // rendered editing context - - this.noEdit = false; // if true, disable all edit UI and make read-only - - this.width = null; - this.tablewidth = null; - this.height = null; - this.tableheight = null; - - this.inputBox = null; - this.inputEcho = null; - this.verticaltablecontrol = null; - this.horizontaltablecontrol = null; - - this.logo = null; - - this.cellhandles = null; - - // Dynamic properties: - - this.timeout = null; // if non-null, timer id for position calculations - this.busy = false; // true when executing command, calculating, etc. - this.ensureecell = false; // if true, ensure ecell is visible after timeout - this.deferredCommands = []; // commands to execute after busy, in form: {cmdstr: "cmds", saveundo: t/f} - - this.gridposition = null; // screen coords of full grid - this.headposition = null; // screen coords of upper left of grid within header rows - this.firstscrollingrow = null; // row number of top row in last (the scrolling) pane - this.firstscrollingrowtop = null; // position of top row in last (the scrolling) pane - this.lastnonscrollingrow = null; // row number of last displayed row in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblerow = null; // used for paging down - this.firstscrollingcol = null; // column number of top col in last (the scrolling) pane - this.firstscrollingcolleft = null; // position of top col in last (the scrolling) pane - this.lastnonscrollingcol = null; // col number of last displayed column in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblecol = null; // used for paging right - - this.rowpositions = []; // screen positions of the top of some rows - this.colpositions = []; // screen positions of the left side of some rows - this.rowheight = []; // size in pixels of each row when last checked, or null/undefined, for page up - this.colwidth = []; // size in pixels of each column when last checked, or null/undefined, for page left - - this.ecell = null; // either null or {coord: c, row: r, col: c} - this.state = "start"; // the keyboard states: see EditorProcessKey - - this.workingvalues = {}; // values used during keyboard editing, etc. - - // Constants: - - this.imageprefix = scc.defaultImagePrefix; // URL prefix for images (e.g., "/images/sc") - this.idPrefix = scc.defaultTableEditorIDPrefix; - this.pageUpDnAmount = scc.defaultPageUpDnAmount; // number of rows to move cursor on PgUp/PgDn keys (numeric) - - // Callbacks - - // recalcFunction: if present, function(editor) {...}, called to do a recalc - // Default (sheet.RecalcSheet) does all the right stuff. - - this.recalcFunction = function(editor) { - if (editor.context.sheetobj.RecalcSheet) { - editor.context.sheetobj.RecalcSheet(SocialCalc.EditorSheetStatusCallback, editor); - } - else return null; - }; - - // ctrlkeyFunction: if present, function(editor, charname) {...}, called to handle ctrl-V, etc., at top level - // Returns true (pass through for continued processing) or false (stop processing this key). - - this.ctrlkeyFunction = function(editor, charname) { - - var ta, ha, cell, position, cmd, sel, cliptext; - - switch (charname) { - case "[ctrl-c]": - case "[ctrl-x]": - ta = editor.pasteTextarea; - ta.value = ""; - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = (position.left-1)+"px"; - ta.style.top = (position.top-1)+"px"; - } - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - else { - sel = editor.ecell.coord; - } - - // get what to copy to clipboard - cliptext = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), "tab"); - - if (charname == "[ctrl-c]" || editor.noEdit || (SocialCalc.Callbacks.IsCellEditable && (!SocialCalc.Callbacks.IsCellEditable(editor)))) { // if copy or cut but in no edit - cmd = "copy "+sel+" formulas"; - } - else { // [ctrl-x] - cmd = "cut "+sel+" formulas"; - } - editor.EditorScheduleSheetCommands(cmd, true, false); // queue up command to put on SocialCalc clipboard - - /* Copy as HTML: This fails rather badly as it won't paste into Notepad as tab-delimited text. Oh well. - - ha = editor.pasteHTMLarea; - if (editor.range.hasrange) { - cell = SocialCalc.GetEditorCellElement(editor, editor.range.top, editor.range.left); - } - else { - cell = SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - } - if (cell) position = SocialCalc.GetElementPosition(cell.element); - - if (ha) { - if (position) { - ha.style.left = (position.left-1)+"px"; - ha.style.top = (position.top-1)+"px"; - } - ha.style.visibility="visible"; - cliptext = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), "html"); - ha.innerHTML = cliptext.replace(/]*>[\d\D]*?<\/tr\b[^>]*>/i, ''); - ha.focus(); - - var range = document.body.createControlRange(); - range.addElement(ha.childNodes[0]); - range.select(); - } - */ - ta.style.display = "block"; - ta.value = cliptext; // must follow "block" setting for Webkit - ta.focus(); - ta.select(); - window.setTimeout(function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; // in case not loaded - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - /* - var ha = editor.pasteHTMLarea; - if (ha) { - ha.blur(); - ha.innerHTML = ''; - ha.style.visibility = 'hidden'; - } - */ - var ta = editor.pasteTextarea; - ta.blur(); - ta.style.display = "none"; - SocialCalc.KeyboardFocus(); - }, 200); - - return true; - - case "[ctrl-v]": - if (editor.noEdit) return true; // not if no edit - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - var showPasteTextArea = function() { - ta = editor.pasteTextarea; - ta.value = ""; - - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = (position.left-1)+"px"; - ta.style.top = (position.top-1)+"px"; - } - ta.style.display = "block"; - ta.value = ""; // must follow "block" setting for Webkit - ta.focus(); - }; - - ha = editor.pasteHTMLarea; - if (ha) { - /* Pasting via HTML - Currently IE only */ - ha.style.visibility = "visible"; - ha.focus(); - } - else { - showPasteTextArea(); - } - window.setTimeout(function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var value = null; - var isPasteSameAsClipboard = false; - - ha = editor.pasteHTMLarea; - if (ha) { - /* IE: We append a U+FFFC to every TD that's not the last of its row, - * then we obtain innerText, then turn U+FFFC back to \t, - * thereby preserving the cell separations (which gets discarded - * if we simply paste via textarea. - */ - var _ObjectReplacementCharacter_ = String.fromCharCode(0xFFFC); - var html = ha.innerHTML; - - if (html.search(/<(?![Bb][Rr])[A-Za-z]/) >= 0) { - /* HTML Paste: Mark TDs with U+FFFC accordingly.. */ - ha.innerHTML = html.replace( - /(?:<\/[Tt][Dd]>)/g, - _ObjectReplacementCharacter_ - ); - } - else { - /* Text Paste: In IE, \t is transformed into  , so replace them with U+FFFC. */ - ha.innerHTML = html.replace( - /&[Nn][Bb][Ss][Pp];/g, - _ObjectReplacementCharacter_ - ); - } - - value = ha.innerText.replace(new RegExp(_ObjectReplacementCharacter_, 'g'), '\t'); - - ha.innerHTML = ''; - ha.blur(); - ha.style.visibility = "hidden"; - } - else { - var ta = editor.pasteTextarea; - value = ta.value; - ta.blur(); - ta.style.display = "none"; - } - - value = value.replace(/\r\n/g, "\n").replace(/\n?$/, '\n'); - var clipstr = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.Clipboard.clipboard, "tab"); - if (value == clipstr || (value.length-clipstr.length==1 && value.substring(0,value.length-1)==clipstr)) { - isPasteSameAsClipboard = true; - } - - var cmd = ""; - // pastes SocialCalc clipboard if did a Ctrl-C and contents still the same - // Webkit adds an extra blank line, so need to allow for that - if (!isPasteSameAsClipboard) { - cmd = "loadclipboard "+ - SocialCalc.encodeForSave(SocialCalc.ConvertOtherFormatToSave(value, "tab")) + "\n"; - } - var cr; - if (editor.range.hasrange) { - cr = SocialCalc.crToCoord(editor.range.left, editor.range.top); - } - else { - cr = editor.ecell.coord; - } - cmd += "paste "+cr+" formulas"; - editor.EditorScheduleSheetCommands(cmd, true, false); - SocialCalc.KeyboardFocus(); - }, 200); - return true; - - case "[ctrl-z]": - editor.EditorScheduleSheetCommands("undo", true, false); - return false; - - case "[ctrl-s]": // !!!! temporary hack - window.setTimeout( - function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var sheet = editor.context.sheetobj; - var cell = sheet.GetAssuredCell(editor.ecell.coord); - var ntvf = cell.nontextvalueformat ? sheet.valueformats[cell.nontextvalueformat-0] || "" : ""; - var newntvf = window.prompt("Advanced Feature:\n\nCustom Numeric Format or Command", ntvf); - if (newntvf != null) { // not cancelled - if (newntvf.match(/^cmd:/)) { - cmd = newntvf.substring(4); // execute as command - } - else if (newntvf.match(/^edit:/)) { - cmd = newntvf.substring(5); // execute as command - if (SocialCalc.CtrlSEditor) { - SocialCalc.CtrlSEditor(cmd); - } - return; - } - else { - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - else { - sel = editor.ecell.coord; - } - cmd = "set "+sel+" nontextvalueformat "+newntvf; - } - editor.EditorScheduleSheetCommands(cmd, true, false); - } - }, - 200); - return false; - - default: - break; - } - return true; - }; - - // Set sheet's status callback: - - context.sheetobj.statuscallback = SocialCalc.EditorSheetStatusCallback; - context.sheetobj.statuscallbackparams = this; // this object: the table editor object - - - // StatusCallback: all values are called at appropriate times, add with unique name, delete when done - // - // Each value must be an object in the form of: - // - // func: function(editor, status, arg, params) {...}, - // params: params value to call func with - // - // The values for status and arg are: - // - // all the SocialCalc RecalcSheet statuscallbacks, including: - // - // calccheckdone, calclist length - // calcorder, {coord: coord, total: celllist length, count: count} - // calcstep, {coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds - // - // the command callbacks, like cmdstart and cmdend - // cmdendnorender - // - // calcstart, null - // moveecell, new ecell coord - // rangechange, "coord:coord" or "coord" or "" - // specialkey, keyname ("[esc]") - // - - this.StatusCallback = {}; - - - this.MoveECellCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.RangeChangeCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.SettingsCallbacks = {}; // See SocialCalc.SaveEditorSettings - - // Set initial cursor - - this.ecell = {coord: "A1", row: 1, col: 1}; - context.highlights[this.ecell.coord] = "cursor"; - - // Initialize range data - // Range has at least hasrange (true/false). - // It may also have: anchorcoord, anchorrow, anchorcol, top, bottom, left, and right. - - this.range = {hasrange: false}; - - // Initialize range2 data (used to show selections, such as for move) - // Range2 has at least hasrange (true/false). - // It may also have: top, bottom, left, and right. - - this.range2 = {hasrange: false}; - - } - -// Methods: - -SocialCalc.TableEditor.prototype.CreateTableEditor = function(width, height) {return SocialCalc.CreateTableEditor(this, width, height);}; -SocialCalc.TableEditor.prototype.ResizeTableEditor = function(width, height) {return SocialCalc.ResizeTableEditor(this, width, height);}; - -SocialCalc.TableEditor.prototype.SaveEditorSettings = function() {return SocialCalc.SaveEditorSettings(this);}; -SocialCalc.TableEditor.prototype.LoadEditorSettings = function(str, flags) {return SocialCalc.LoadEditorSettings(this, str, flags);}; - -SocialCalc.TableEditor.prototype.EditorRenderSheet = function() {SocialCalc.EditorRenderSheet(this);}; -SocialCalc.TableEditor.prototype.EditorScheduleSheetCommands = function(cmdstr, saveundo, ignorebusy) {SocialCalc.EditorScheduleSheetCommands(this, cmdstr, saveundo, ignorebusy);}; -SocialCalc.TableEditor.prototype.ScheduleSheetCommands = function(cmdstr, saveundo) { - this.context.sheetobj.ScheduleSheetCommands(cmdstr, saveundo); - }; -SocialCalc.TableEditor.prototype.SheetUndo = function() { - this.context.sheetobj.SheetUndo(); - }; -SocialCalc.TableEditor.prototype.SheetRedo = function() { - this.context.sheetobj.SheetRedo(); - }; -SocialCalc.TableEditor.prototype.EditorStepSet = function(status, arg) {SocialCalc.EditorStepSet(this, status, arg);}; -SocialCalc.TableEditor.prototype.GetStatuslineString = function(status, arg, params) {return SocialCalc.EditorGetStatuslineString(this, status, arg, params);}; - -SocialCalc.TableEditor.prototype.EditorMouseRegister = function() {return SocialCalc.EditorMouseRegister(this);}; -SocialCalc.TableEditor.prototype.EditorMouseUnregister = function() {return SocialCalc.EditorMouseUnregister(this);}; -SocialCalc.TableEditor.prototype.EditorMouseRange = function(coord) {return SocialCalc.EditorMouseRange(this, coord);}; - -SocialCalc.TableEditor.prototype.EditorProcessKey = function(ch, e) {return SocialCalc.EditorProcessKey(this, ch, e);}; -SocialCalc.TableEditor.prototype.EditorAddToInput = function(str, prefix) {return SocialCalc.EditorAddToInput(this, str, prefix);}; -SocialCalc.TableEditor.prototype.DisplayCellContents = function() {return SocialCalc.EditorDisplayCellContents(this);}; -SocialCalc.TableEditor.prototype.EditorSaveEdit = function(text) {return SocialCalc.EditorSaveEdit(this, text);}; -SocialCalc.TableEditor.prototype.EditorApplySetCommandsToRange = function(cmdline, type) {return SocialCalc.EditorApplySetCommandsToRange(this, cmdline, type);}; - -SocialCalc.TableEditor.prototype.MoveECellWithKey = function(ch) {return SocialCalc.MoveECellWithKey(this, ch);}; -SocialCalc.TableEditor.prototype.MoveECell = function(newcell) {return SocialCalc.MoveECell(this, newcell);}; -SocialCalc.TableEditor.prototype.ReplaceCell = function(cell, row, col) {SocialCalc.ReplaceCell(this, cell, row, col);}; -SocialCalc.TableEditor.prototype.UpdateCellCSS = function(cell, row, col) {SocialCalc.UpdateCellCSS(this, cell, row, col);}; -SocialCalc.TableEditor.prototype.SetECellHeaders = function(selected) {SocialCalc.SetECellHeaders(this, selected);}; -SocialCalc.TableEditor.prototype.EnsureECellVisible = function() {SocialCalc.EnsureECellVisible(this);}; -SocialCalc.TableEditor.prototype.RangeAnchor = function(coord) {SocialCalc.RangeAnchor(this, coord);}; -SocialCalc.TableEditor.prototype.RangeExtend = function(coord) {SocialCalc.RangeExtend(this, coord);}; -SocialCalc.TableEditor.prototype.RangeRemove = function() {SocialCalc.RangeRemove(this);}; -SocialCalc.TableEditor.prototype.Range2Remove = function() {SocialCalc.Range2Remove(this);}; - -SocialCalc.TableEditor.prototype.FitToEditTable = function() {SocialCalc.FitToEditTable(this);}; -SocialCalc.TableEditor.prototype.CalculateEditorPositions = function() {SocialCalc.CalculateEditorPositions(this);}; -SocialCalc.TableEditor.prototype.ScheduleRender = function() {SocialCalc.ScheduleRender(this);}; -SocialCalc.TableEditor.prototype.DoRenderStep = function() {SocialCalc.DoRenderStep(this);}; -SocialCalc.TableEditor.prototype.SchedulePositionCalculations = function() {SocialCalc.SchedulePositionCalculations(this);}; -SocialCalc.TableEditor.prototype.DoPositionCalculations = function() {SocialCalc.DoPositionCalculations(this);}; -SocialCalc.TableEditor.prototype.CalculateRowPositions = function(panenum, positions, sizes) {return SocialCalc.CalculateRowPositions(this, panenum, positions, sizes);}; -SocialCalc.TableEditor.prototype.CalculateColPositions = function(panenum, positions, sizes) {return SocialCalc.CalculateColPositions(this, panenum, positions, sizes);}; - -SocialCalc.TableEditor.prototype.ScrollRelative = function(vertical, amount) {SocialCalc.ScrollRelative(this, vertical, amount);}; -SocialCalc.TableEditor.prototype.ScrollRelativeBoth = function(vamount, hamount) {SocialCalc.ScrollRelativeBoth(this, vamount, hamount);}; -SocialCalc.TableEditor.prototype.PageRelative = function(vertical, direction) {SocialCalc.PageRelative(this, vertical, direction);}; -SocialCalc.TableEditor.prototype.LimitLastPanes = function() {SocialCalc.LimitLastPanes(this);}; - -SocialCalc.TableEditor.prototype.ScrollTableUpOneRow = function() {return SocialCalc.ScrollTableUpOneRow(this);}; -SocialCalc.TableEditor.prototype.ScrollTableDownOneRow = function() {return SocialCalc.ScrollTableDownOneRow(this);}; -SocialCalc.TableEditor.prototype.ScrollTableLeftOneCol = function() {return SocialCalc.ScrollTableLeftOneCol(this);}; -SocialCalc.TableEditor.prototype.ScrollTableRightOneCol = function() {return SocialCalc.ScrollTableRightOneCol(this);}; - -// Functions: - -SocialCalc.CreateTableEditor = function(editor, width, height) { - - var scc = SocialCalc.Constants; - var AssignID = SocialCalc.AssignID; - - editor.toplevel = document.createElement("div"); - editor.width = width; - editor.height = height; - - editor.griddiv = document.createElement("div"); - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width=editor.tablewidth+"px"; - editor.griddiv.style.height=editor.tableheight+"px"; - editor.griddiv.style.overflow="hidden"; - editor.griddiv.style.cursor="default"; - if (scc.cteGriddivClass) editor.griddiv.className = scc.cteGriddivClass; - AssignID(editor, editor.griddiv, "griddiv"); - - editor.FitToEditTable(); - - editor.EditorRenderSheet(); - - editor.griddiv.appendChild(editor.fullgrid); - - editor.verticaltablecontrol = new SocialCalc.TableControl(editor, true, editor.tableheight); - editor.verticaltablecontrol.CreateTableControl(); - AssignID(editor, editor.verticaltablecontrol.main, "tablecontrolv"); - - editor.horizontaltablecontrol = new SocialCalc.TableControl(editor, false, editor.tablewidth); - editor.horizontaltablecontrol.CreateTableControl(); - AssignID(editor, editor.horizontaltablecontrol.main, "tablecontrolh"); - - var table, tbody, tr, td, img, anchor, ta, ha; - - table = document.createElement("table"); - editor.layouttable = table; - table.cellSpacing = 0; - table.cellPadding = 0; - AssignID(editor, table, "layouttable"); - - tbody = document.createElement("tbody"); - table.appendChild(tbody); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - td.appendChild(editor.griddiv); - tr.appendChild(td); - td = document.createElement("td"); - td.appendChild(editor.verticaltablecontrol.main); - tr.appendChild(td); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - td.appendChild(editor.horizontaltablecontrol.main); - tr.appendChild(td); - - td = document.createElement("td"); // logo display: Required by CPAL License for this code! - td.style.background="url("+editor.imageprefix+"logo.gif) no-repeat center center"; - td.innerHTML = "
    "; - tr.appendChild(td); - editor.logo = td; - AssignID(editor, editor.logo, "logo"); - SocialCalc.TooltipRegister(td.firstChild.firstChild, "SocialCalc", null); - - editor.toplevel.appendChild(editor.layouttable); - - if (!editor.noEdit) { - editor.inputEcho = new SocialCalc.InputEcho(editor); - AssignID(editor, editor.inputEcho.main, "inputecho"); - } - - editor.cellhandles = new SocialCalc.CellHandles(editor); - - ta = document.createElement("textarea"); // used for ctrl-c/ctrl-v where an invisible text area is needed - SocialCalc.setStyles(ta, "display:none;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);"); - ta.value = ""; - editor.pasteTextarea = ta; - AssignID(editor, editor.pasteTextarea, "pastetextarea"); - - if (navigator.userAgent.match(/Safari\//) &&!navigator.userAgent.match(/Chrome\//)) { // special code for Safari 5 change - window.removeEventListener('beforepaste', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforepaste', SocialCalc.SafariPasteFunction, false); - window.removeEventListener('beforecopy', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforecopy', SocialCalc.SafariPasteFunction, false); - window.removeEventListener('beforecut', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforecut', SocialCalc.SafariPasteFunction, false); - } - - editor.toplevel.appendChild(editor.pasteTextarea); - - var div = document.createElement("div"); - div.innerHTML = '
    '; - if (div.firstChild.nodeType == 1) { - /* We are running in IE -- Using HTML-based area for Ctrl-V */ - ha = document.createElement("div"); // used for ctrl-v where an invisible html area is needed - editor.pasteHTMLarea = ha; - editor.toplevel.appendChild(editor.pasteHTMLarea); - ha.contentEditable = true; - AssignID(editor, editor.pasteHTMLarea, "pastehtmlarea"); - SocialCalc.setStyles(ha, "display:block;visibility:hidden;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);overflow:hidden"); - } - - SocialCalc.MouseWheelRegister(editor.toplevel, {WheelMove: SocialCalc.EditorProcessMouseWheel, editor: editor}); - - if (SocialCalc.HasTouch) { - SocialCalc.TouchRegister(editor.toplevel, {Swipe: SocialCalc.EditorProcessSwipe, - DoubleTap: SocialCalc.EditorProcessDoubleTap, - SingleTap: SocialCalc.EditorProcessSingleTap, - editor: editor}); - } - - if (editor.inputBox) { // this seems to fix an obscure bug with Firefox 2 Mac where Ctrl-V doesn't get fired right - if (editor.inputBox.element) { - editor.inputBox.element.focus(); - editor.inputBox.element.blur(); - } - } - SocialCalc.KeyboardSetFocus(editor); - - // do status reporting things - - SocialCalc.EditorSheetStatusCallback(null, "startup", null, editor); - - // done - - return editor.toplevel; - - } - -// Special code needed for change that occurred with Safari 5 that made paste not work for some reason - -SocialCalc.SafariPasteFunction = function(e) { - e.preventDefault(); - } - -// -// SocialCalc.ResizeTableEditor(editor, width, height) -// -// Move things around as appropriate and resize -// - -SocialCalc.ResizeTableEditor = function(editor, width, height) { - - var scc = SocialCalc.Constants; - - editor.width = width; - editor.height = height; - - editor.toplevel.style.width = width+"px"; - editor.toplevel.style.height = height+"px"; - - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width=editor.tablewidth+"px"; - editor.griddiv.style.height=editor.tableheight+"px"; - - editor.verticaltablecontrol.main.style.height = editor.tableheight + "px"; - editor.horizontaltablecontrol.main.style.width = editor.tablewidth + "px"; - - editor.FitToEditTable(); - - editor.ScheduleRender(); - - return; - - } - -// -// str = SaveEditorSettings(editor) -// -// Returns a string representation of the pane settings, etc. -// -// The format is: -// -// version:1.0 -// rowpane:panenumber:firstnum:lastnum -// colpane:panenumber:firstnum:lastnum -// ecell:coord -- if set -// range:anchorcoord:top:bottom:left:right -- if set -// -// You can add additional values to be saved by using editor.SettingsCallbacks: -// -// editor.SettingsCallbacks["item-name"] = {save: savefunction, load: loadfunction} -// -// where savefunction(editor, "item-name") returns a string with the new lines to be added to the saved settings -// which include the trailing newlines, and loadfunction(editor, "item-name", line, flags) is given the line to process -// without the trailing newlines. -// - -SocialCalc.SaveEditorSettings = function(editor) { - - var i, setting; - var context = editor.context; - var range = editor.range; - var result = ""; - - result += "version:1.0\n"; - - for (i=0; i'; - } - - return sstr; - - } - - -// -// Mouse stuff -// - -SocialCalc.EditorMouseInfo = { - - // The registeredElements array is used to identify editor grid in which the mouse is doing things. - - // One item for each active editor, each an object with: - // .element, .editor - - registeredElements: [], - - editor: null, // editor being processed (between mousedown and mouseup) - element: null, // element being processed - - ignore: false, // if true, mousedowns are ignored - - mousedowncoord: "", // coord where mouse went down for drag range - mouselastcoord: "", // coord where mouse last was during drag - mouseresizecol: "", // col being resized - mouseresizeclientx: null, // where resize started - mouseresizedisplay: null // element tracking new size - } - -// -// EditorMouseRegister(editor) -// - -SocialCalc.EditorMouseRegister = function(editor) { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var element = editor.fullgrid; - var i; - - for (i=0; i=^".indexOf(inputtext.slice(-1))>=0 && inputtext.slice(0,1)=="=") || - (inputtext == "=")) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { // if in pointing operation - if (coord) { - if (range.hasrange) { - var sheetpref = (wval.currentsheet == wval.startsheet)?"":wval.currentsheet+"!"; - editor.inputBox.SetText(wval.partialexpr + sheetpref+ SocialCalc.crToCoord(range.left, range.top) + ":" + sheetpref + - SocialCalc.crToCoord(range.right, range.bottom)); - } - else { - var sheetpref = (wval.currentsheet == wval.startsheet)?"":wval.currentsheet+"!"; - editor.inputBox.SetText(wval.partialexpr + sheetpref+coord); - } - } - } - else { // not in point -- done editing - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - } - break; - - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - break; - } - } - -SocialCalc.ProcessEditorMouseMove = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat(editor, result); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - if (result.coord!=mouseinfo.mouselastcoord) { - if (!e.shiftKey && !editor.range.hasrange) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - } - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - mouseinfo.mouselastcoord = result.coord; - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.ProcessEditorMouseUp = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result) return; - - if (!result.coord) result.coord = editor.ecell.coord; - - if (editor.range.hasrange) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - else if (result.coord && result.coord!=mouseinfo.mousedowncoord) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.ProcessEditorMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.ProcessEditorMouseUp, true); - } - else if (element.detachEvent) { // IE - element.detachEvent("onlosecapture", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmouseup", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmousemove", SocialCalc.ProcessEditorMouseMove); - element.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - - } - - -SocialCalc.ProcessEditorColsizeMouseDown = function(e, ele, result) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - mouseinfo.mouseresizecolnum = result.coltoresize; // remember col being resized - mouseinfo.mouseresizecol = SocialCalc.rcColname(result.coltoresize); - mouseinfo.mousedownclientx = clientX; - - var sizedisplay = document.createElement("div"); - mouseinfo.mouseresizedisplay = sizedisplay; - sizedisplay.style.width = "auto"; - sizedisplay.style.position = "absolute"; - sizedisplay.style.zIndex = 100; - sizedisplay.style.top = (editor.headposition.top+0)+"px"; - sizedisplay.style.left = editor.colpositions[result.coltoresize]+"px"; - sizedisplay.innerHTML = ''+ - '
     
    '+ - editor.context.colwidth[mouseinfo.mouseresizecolnum] + '
    '; - SocialCalc.setStyles(sizedisplay.firstChild.lastChild.firstChild.childNodes[0], "filter:alpha(opacity=85);opacity:.85;"); // so no warning msg with Firefox about filter - - editor.toplevel.appendChild(sizedisplay); - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mousemove", SocialCalc.ProcessEditorColsizeMouseMove, true); // capture everywhere - document.addEventListener("mouseup", SocialCalc.ProcessEditorColsizeMouseUp, true); // capture everywhere - } - else if (editor.toplevel.attachEvent) { // IE 5+ - editor.toplevel.setCapture(); - editor.toplevel.attachEvent("onmousemove", SocialCalc.ProcessEditorColsizeMouseMove); - editor.toplevel.attachEvent("onmouseup", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.attachEvent("onlosecapture", SocialCalc.ProcessEditorColsizeMouseUp); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - } - - -SocialCalc.ProcessEditorColsizeMouseMove = function(e) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - var newsize = (editor.context.colwidth[mouseinfo.mouseresizecolnum]-0) + (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) newsize = SocialCalc.Constants.defaultMinimumColWidth; - - var sizedisplay = mouseinfo.mouseresizedisplay; -// sizedisplay.firstChild.lastChild.firstChild.childNodes[1].firstChild.innerHTML = newsize+""; -// sizedisplay.firstChild.lastChild.firstChild.childNodes[0].firstChild.style.width = (newsize-2)+"px"; - sizedisplay.innerHTML = ''+ - '
     
    '+ - newsize + '
    '; - SocialCalc.setStyles(sizedisplay.firstChild.lastChild.firstChild.childNodes[0], "filter:alpha(opacity=85);opacity:.85;"); // so no warning msg with Firefox about filter - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.ProcessEditorColsizeMouseUp = function(e) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - element = mouseinfo.element; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.ProcessEditorColsizeMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.ProcessEditorColsizeMouseUp, true); - } - else if (editor.toplevel.detachEvent) { // IE - editor.toplevel.detachEvent("onlosecapture", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.detachEvent("onmouseup", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.detachEvent("onmousemove", SocialCalc.ProcessEditorColsizeMouseMove); - editor.toplevel.releaseCapture(); - } - - var newsize = (editor.context.colwidth[mouseinfo.mouseresizecolnum]-0) + (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) newsize = SocialCalc.Constants.defaultMinimumColWidth; - - editor.EditorScheduleSheetCommands("set "+mouseinfo.mouseresizecol+" width "+newsize, true, false); - - if (editor.timeout) window.clearTimeout(editor.timeout); - editor.timeout = window.setTimeout(SocialCalc.FinishColsize, 1); // wait - Firefox 2 has a bug otherwise with next mousedown - - return false; - - } - - -SocialCalc.FinishColsize = function() { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; - - editor.toplevel.removeChild(mouseinfo.mouseresizedisplay); - mouseinfo.mouseresizedisplay = null; - -// editor.FitToEditTable(); -// editor.EditorRenderSheet(); -// editor.SchedulePositionCalculations(); - - mouseinfo.editor = null; - - return; - - } - -// -// Handle auto-repeat of dragging the cursor into the borders of the sheet -// - -SocialCalc.AutoRepeatInfo = { - - timer: null, // timer object for repeating - mouseinfo: null, // result from SocialCalc.GridMousePosition - repeatinterval: 1000, // milliseconds to wait between repeats - editor: null, // editor object to use when it repeats - repeatcallback: null // used instead of default when repeating (e.g., for cellhandles) - // called as: repeatcallback(newcoord, direction) - -}; - -// Control auto-repeat. If mouseinfo==null, cancel. - -SocialCalc.SetDragAutoRepeat = function(editor, mouseinfo, callback) { - - var repeatinfo = SocialCalc.AutoRepeatInfo; - var coord, direction; - - repeatinfo.repeatcallback = callback; // null in regular case - - if (!mouseinfo) { // cancel - if (repeatinfo.timer) { // If was repeating, stop - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - repeatinfo.mouseinfo = null; - return; // done - } - - repeatinfo.editor = editor; - - if (repeatinfo.mouseinfo) { // check for change while repeating - if (mouseinfo.rowheader || mouseinfo.rowfooter) { - if (mouseinfo.row != repeatinfo.mouseinfo.row) { // changed row while dragging sidewards - coord = SocialCalc.crToCoord(editor.ecell.col, mouseinfo.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } - else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } - else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } - else { - editor.MoveECell(coord); - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } - else if (mouseinfo.colheader || mouseinfo.colfooter) { - if (mouseinfo.col != repeatinfo.mouseinfo.col) { // changed col while dragging vertically - coord = SocialCalc.crToCoord(mouseinfo.col, editor.ecell.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } - else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } - else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } - else { - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } - } - - repeatinfo.mouseinfo = mouseinfo; - - if (mouseinfo.distance < 5) repeatinfo.repeatinterval = 333; - else if (mouseinfo.distance < 10) repeatinfo.repeatinterval = 250; - else if (mouseinfo.distance < 25) repeatinfo.repeatinterval = 100; - else if (mouseinfo.distance < 35) repeatinfo.repeatinterval = 75; - else { // too far - stop repeating - if (repeatinfo.timer) { // if repeating, cancel it - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - return; - } - - if (!repeatinfo.timer) { // start if not already running - repeatinfo.timer = window.setTimeout(SocialCalc.DragAutoRepeat, repeatinfo.repeatinterval); - } - - return; - - } - -// -// DragAutoRepeat() -// - -SocialCalc.DragAutoRepeat = function() { - - var repeatinfo = SocialCalc.AutoRepeatInfo; - var mouseinfo = repeatinfo.mouseinfo; - - var direction, coord, cr; - - if (mouseinfo.rowheader) direction = "left"; - else if (mouseinfo.rowfooter) direction = "right"; - else if (mouseinfo.colheader) direction = "up"; - else if (mouseinfo.colfooter) direction = "down"; - - if (repeatinfo.repeatcallback) { - cr = SocialCalc.coordToCr(repeatinfo.editor.ecell.coord); - if (direction == "left" && cr.col > 1) cr.col--; - else if (direction == "right") cr.col++; - else if (direction == "up" && cr.row > 1) cr.row--; - else if (direction == "down") cr.row++; - coord = SocialCalc.crToCoord(cr.col, cr.row); - repeatinfo.repeatcallback(coord, direction); - } - else { - coord = repeatinfo.editor.MoveECellWithKey("[a"+direction+"]shifted"); - if (coord) repeatinfo.editor.EditorMouseRange(coord); - } - - repeatinfo.timer = window.setTimeout(SocialCalc.DragAutoRepeat, repeatinfo.repeatinterval); - - } - -// -// Handling Clicking -// - -SocialCalc.ProcessEditorDblClick = function(e) { - - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var mobj; - - if (mouseinfo.ignore) return; // ignore this - - for (mobj=null; !mobj && ele; ele=ele.parentNode) { // go up tree looking for one of our elements - mobj = SocialCalc.LookupElement(ele, mouseinfo.registeredElements); - } - if (!mobj) { - mouseinfo.editor = null; - return; // not one of our elements - } - - editor = mobj.editor; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); - if (!result || !result.coord) return; // not within cell area - ignore - - mouseinfo.editor = editor; // remember for later - mouseinfo.element = ele; - range = editor.range; - - sheetobj = editor.context.sheetobj; - - switch (editor.state) { - case "start": - SocialCalc.EditorOpenCellEdit(editor); - break; - - case "input": - break; - - default: - break; - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.EditorOpenCellEdit = function(editor) { - - var wval; - - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no input box, so no editing (happens on noEdit) - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - if (editor.inputBox.element.disabled) return true; // multi-line: ignore - if (editor.inputBox.element.style.display == 'none') { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "editecell", null, editor.StatusCallback[f].params); - } - return true; // no inputBox display, so no editing - } - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - if (SocialCalc.HasTouch) { - editor.state = "input"; - } else { - editor.state = "inputboxdirect"; - } - editor.inputBox.SetText(""); - editor.inputBox.DisplayCellContents(); - editor.inputBox.Select("end"); - wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - - return; - - } - - -SocialCalc.EditorProcessKey = function(editor, ch, e) { - - var result, cell, cellobj, valueinfo, fch, coord, inputtext, f; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - var range = editor.range; - - if (typeof ch != "string") ch = ""; - - switch (editor.state) { - case "start": - if (e.shiftKey && ch.substr(0,2)=="[a") { - ch = ch + "shifted"; - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a" || ch.substr(0,3)=="[pg" || ch=="[home]") { - result = editor.MoveECellWithKey(ch); - return !result; - } - if (ch=="[del]" || ch=="[backspace]") { - if (!editor.noEdit) { - editor.EditorApplySetCommandsToRange("empty", ""); - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - break; - } - if (ch=="[esc]") { - if (range.hasrange) { - editor.RangeRemove(); - editor.MoveECell(range.anchorcoord); - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "specialkey", ch, editor.StatusCallback[f].params); - } - } - return false; - } - - if (ch=="[f2]") { - if (editor.noEdit) return true; - SocialCalc.EditorOpenCellEdit(editor); - return false; - } - - if ((ch.length>1 && ch.substr(0,1)=="[") || ch.length==0) { // some control key - if (editor.ctrlkeyFunction && ch.length>0) { - return editor.ctrlkeyFunction(editor, ch); - } - else { - return true; - } - } - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no inputBox so no editing - if (editor.inputBox.element.style.display == 'none') { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "editecell", ch, editor.StatusCallback[f].params); - } - return true; // no inputBox display, so no editing - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - editor.inputBox.element.disabled = false; // make sure editable - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - editor.inputBox.SetText(ch); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (editor.inputBox.skipOne) return false; // ignore a key already handled - if (ch=="[esc]" || ch=="[enter]" || ch=="[tab]" || (ch && ch.substr(0,2)=="[a")) { - if (("(+-*/,:!&<>=^".indexOf(inputtext.slice(-1))>=0 && inputtext.slice(0,1)=="=") || - (inputtext == "=")) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { // if in pointing operation - if (e.shiftKey && ch.substr(0,2)=="[a") { - ch = ch + "shifted"; - } - coord = editor.MoveECellWithKey(ch); - if (coord) { - if (range.hasrange) { - editor.inputBox.SetText(wval.partialexpr + SocialCalc.crToCoord(range.left, range.top) + ":" + - SocialCalc.crToCoord(range.right, range.bottom)); - } - else { - editor.inputBox.SetText(wval.partialexpr + coord); - } - return false; - } - } - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch != "[esc]") { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a") { - editor.MoveECellWithKey(ch); - } - } - else { - editor.inputBox.DisplayCellContents(); - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - break; - } - if (wval.partialexpr && ch=="[backspace]") { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - return false; - } - if (ch=="[f2]") return false; - if (range.hasrange) { - editor.RangeRemove(); - } - editor.MoveECell(wval.ecoord); - if (wval.partialexpr) { - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - wval.partialexpr = ""; // not pointing - } - return true; - - case "inputboxdirect": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (ch=="[esc]" || ch=="[enter]" || ch=="[tab]") { - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch == "[esc]") { - editor.inputBox.DisplayCellContents(); - } - else { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a") { - editor.MoveECellWithKey(ch); - } - } - break; - } - if (ch=="[f2]") return false; - return true; - - case "skip-and-start": - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - return false; - - default: - return true; - } - - return false; - - } - -SocialCalc.EditorAddToInput = function(editor, str, prefix) { - - var wval = editor.workingvalues; - - if (editor.noEdit) return; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - - switch (editor.state) { - case "start": - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.element.disabled = false; // make sure editable and overwrite old - editor.inputBox.Focus(); - editor.inputBox.SetText((prefix||"")+str); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.focus(); - if (wval.partialexpr) { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - editor.inputBox.SetText(editor.inputBox.GetText()+str); - break; - - default: - break; - } - - } - - -SocialCalc.EditorDisplayCellContents = function(editor) { - - if (editor.inputBox) editor.inputBox.DisplayCellContents(); - - } - -SocialCalc.EditorSaveEdit = function(editor, text) { - - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - type = "text t"; - value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord)+""; - if (value == oldvalue) { // no change - return; - } - - if (!SocialCalc.Callbacks.CheckConstraints(editor,value)) { - return true; - } - - if (SocialCalc.Callbacks.editAutoSave) { - SocialCalc.Callbacks.editAutoSave(); - } - - fch = value.charAt(0); - if (fch=="=" && value.indexOf("\n")==-1) { - type = "formula"; - value = value.substring(1); - } - else if (fch=="'") { - type = "text t"; - value = value.substring(1); - } - else if (value.length==0) { - type = "empty"; - } - else { - valueinfo = SocialCalc.DetermineValueType(value) - if (valueinfo.type=="n" && value==(valueinfo.value+"")) { // see if don't need "constant" - type = "value n"; - } - else if (valueinfo.type.charAt(0)=="t") { - type = "text "+valueinfo.type; - } - else if (valueinfo.type=="") { - type = "text t"; - } - else { - type = "constant "+valueinfo.type+" "+valueinfo.value; - } - } - - if (type.charAt(0)=="t") { // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && (wval.currentsheet != wval.startsheet)) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " +wval.startsheetid; - control.ExecuteWorkBookControlCommand( { cmdtype:"wcmd", id:"0", cmdstr: cmdstr} - ,false) - } - - cmdline = "set "+wval.ecoord+" "+type+" "+value; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - - } - -// -// SocialCalc.EditorApplySetCommandsToRange(editor, cmd) -// -// Takes ecell or range and does a "set" command with cmd. -// - -SocialCalc.EditorApplySetCommandsToRange = function(editor, cmd) { - - var cell, row, col, line, errortext; - - var sheetobj = editor.context.sheetobj; - var ecell = editor.ecell; - var range = editor.range; - - if (range.hasrange) { - coord = SocialCalc.crToCoord(range.left, range.top)+":"+SocialCalc.crToCoord(range.right, range.bottom); - line = "set "+coord+" "+cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } - else { - line = "set "+ecell.coord+" "+cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } - - editor.DisplayCellContents(); - - } - -SocialCalc.EditorProcessMouseWheel = function(event, delta, mousewheelinfo, wobj) { - - if (wobj.functionobj.editor.busy) return; // ignore if busy - - if (delta > 0) { - wobj.functionobj.editor.ScrollRelative(true, -1); - } - if (delta < 0) { - wobj.functionobj.editor.ScrollRelative(true, +1); - } - - } - -// -// GridMousePosition(editor, clientX, clientY) -// -// Returns an object with row and col numbers and coord (spans handled for coords), -// and rowheader/colheader true if in header (where coord will be undefined). -// If in colheader, will return coltoresize if on appropriate place in col header. -// Also, there is rowfooter (on right) and colfooter (on bottom). -// In row/col header/footer, returns "distance" as pixels over the edge. -// - -SocialCalc.GridMousePosition = function(editor, clientX, clientY) { - - var row, col, colpane; - var result = {}; - - for (row=1; rowclientY) { - break; - } - } - for (col=1; colclientX) { - break; - } - } - - result.row = row; - result.col = col; - - if (editor.headposition) { - if (clientX < editor.headposition.left && clientX >= editor.gridposition.left) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } - else if (clientY < editor.headposition.top && clientY > editor.gridposition.top) { // > because of sizing row - result.colheader = true; - result.distance = editor.headposition.top - clientY; - result.coltoresize = col-(editor.colpositions[col]+editor.colwidth[col]/2>clientX?1:0) || 1; - for (colpane=0; colpane= editor.context.colpanes[colpane].first && - result.coltoresize <= editor.context.colpanes[colpane].last) { // visible column - return result; - } - } - delete result.coltoresize; - return result; - } - else if (clientX >= editor.verticaltablecontrol.controlborder) { - result.rowfooter = true; - result.distance = clientX - editor.verticaltablecontrol.controlborder; - return result; - } - else if (clientY >= editor.horizontaltablecontrol.controlborder) { - result.colfooter = true; - result.distance = clientY - editor.horizontaltablecontrol.controlborder; - return result; - } - else if (clientX < editor.gridposition.left) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } - else if (clientY <= editor.gridposition.top) { - result.colheader = true; - result.distance = editor.headposition.top - clientY; - return result; - } - else { - result.coord = SocialCalc.crToCoord(result.col, result.row); - if (editor.context.cellskip[result.coord]) { // handle skipped cells - result.coord = editor.context.cellskip[result.coord]; - } - return result; - } - } - - return null; - - } - -// -// GetEditorCellElement(editor, row, col) -// -// Returns an object with element, the table cell element in the DOM that corresponds to row and column, -// as well as rowpane and colpane, the panes with the cell. -// If no such element, then returns null; -// - -SocialCalc.GetEditorCellElement = function(editor, row, col) { - - var rowpane, colpane, c, coord; - var rowindex = 0; - var colindex = 0; - - for (rowpane=0; rowpane= editor.context.rowpanes[rowpane].first && row <= editor.context.rowpanes[rowpane].last) { - for (colpane=0; colpane= editor.context.colpanes[colpane].first && col <= editor.context.colpanes[colpane].last) { - rowindex += row - editor.context.rowpanes[rowpane].first + 2; - for (c=editor.context.colpanes[colpane].first; c<=col; c++) { - coord=editor.context.cellskip[SocialCalc.crToCoord(c,row)]; - if (!coord || !editor.context.CoordInPane(coord, rowpane, colpane)) // don't count col-spanned cells - colindex++; - } - return { - element: editor.griddiv.firstChild.lastChild.childNodes[rowindex].childNodes[colindex], - rowpane: rowpane, colpane: colpane}; - } - for (c=editor.context.colpanes[colpane].first; c<=editor.context.colpanes[colpane].last; c++) { - coord=editor.context.cellskip[SocialCalc.crToCoord(c,row)]; - if (!coord || !editor.context.CoordInPane(coord, rowpane, colpane)) // don't count col-spanned cells - colindex++; - } - colindex += 1; - } - } - rowindex += editor.context.rowpanes[rowpane].last - editor.context.rowpanes[rowpane].first + 1 + 1; - } - - return null; -} - -// -// cellcoord = MoveECellWithKey(editor, ch) -// -// Processes an arrow key, etc., moving the edit cell. -// If not a movement key, returns null. -// - -SocialCalc.MoveECellWithKey = function(editor, ch) { - - var coord, row, col, cell; - var shifted = false; - - if (!editor.ecell) { - return null; - } - - if (ch.slice(-7)=="shifted") { - ch = ch.slice(0,-7); - shifted = true; - } - - row = editor.ecell.row; - col = editor.ecell.col; - cell = editor.context.sheetobj.cells[editor.ecell.coord]; - - switch (ch) { - case "[adown]": - row += (cell && cell.rowspan) || 1; - break; - case "[aup]": - row--; - break; - case "[pgdn]": - row += editor.pageUpDnAmount - 1 + ((cell && cell.rowspan) || 1); - break; - case "[pgup]": - row -= editor.pageUpDnAmount; - break; - case "[aright]": - col += (cell && cell.colspan) || 1; - break; - case "[aleft]": - col--; - break; - case "[home]": - row = 1; - col = 1; - break; - default: - return null; - } - - if (!editor.range.hasrange) { - if (shifted) - editor.RangeAnchor(); - } - - coord = editor.MoveECell(SocialCalc.crToCoord(col, row)); - - if (editor.range.hasrange) { - if (shifted) - editor.RangeExtend(); - else - editor.RangeRemove(); - } - - return coord; - - } - -// -// cellcoord = MoveECell(editor, newecell) -// -// Takes a coordinate and returns the new edit cell coordinate (which may be -// different if newecell is covered by a span). -// - -SocialCalc.MoveECell = function(editor, newcell) { - - var cell, f; - - var highlights = editor.context.highlights; - - if (editor.ecell) { - if (editor.ecell.coord==newcell) return newcell; // already there - don't do anything and don't tell anybody - - if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast('ecell', { original: editor.ecell.coord, ecell: newcell }); - } - - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - delete highlights[editor.ecell.coord]; - if (editor.range2.hasrange && - editor.ecell.row>=editor.range2.top && editor.ecell.row<=editor.range2.bottom && - editor.ecell.col>=editor.range2.left && editor.ecell.col<=editor.range2.right) { - highlights[editor.ecell.coord] = "range2"; - } - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders(""); // set to regular col/rowname styles - editor.cellhandles.ShowCellHandles(false); - } - else if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast('ecell', { ecell: newcell }); - } - newcell = editor.context.cellskip[newcell] || newcell; - editor.ecell = SocialCalc.coordToCr(newcell); - editor.ecell.coord = newcell; - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - highlights[newcell] = "cursor"; - - for (f in editor.MoveECellCallback) { // let others know - editor.MoveECellCallback[f](editor); - } - - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders("selected"); - - for (f in editor.StatusCallback) { // let status line, etc., know - editor.StatusCallback[f].func(editor, "moveecell", newcell, editor.StatusCallback[f].params); - } - - if (editor.busy) { - editor.ensureecell = true; // wait for when not busy - } - else { - editor.ensureecell = false; - editor.EnsureECellVisible(); - } - - return newcell; - - } - -SocialCalc.EnsureECellVisible = function(editor) { - - var vamount = 0; - var hamount = 0; - - if (editor.ecell.row > editor.lastnonscrollingrow) { - if (editor.ecell.row < editor.firstscrollingrow) { - vamount = editor.ecell.row - editor.firstscrollingrow; - } - else if (editor.ecell.row > editor.lastvisiblerow) { - vamount = editor.ecell.row - editor.lastvisiblerow; - } - } - if (editor.ecell.col > editor.lastnonscrollingcol) { - if (editor.ecell.col < editor.firstscrollingcol) { - hamount = editor.ecell.col - editor.firstscrollingcol; - } - else if (editor.ecell.col > editor.lastvisiblecol) { - hamount = editor.ecell.col- editor.lastvisiblecol; - } - } - - if (vamount!=0 || hamount!=0) { - editor.ScrollRelativeBoth(vamount, hamount); - } - else { - editor.cellhandles.ShowCellHandles(true); - } - - } - -SocialCalc.ReplaceCell = function(editor, cell, row, col) { - - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell(row, col, cell.rowpane, cell.colpane, true, null); - if (newelement) { - // Don't use a real element and replaceChild, which seems to have focus issues with IE, Firefox, and speed issues - cell.element.innerHTML = newelement.innerHTML; - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a]!="cssText") - cell.element.style[a] = newelement.style[a]; - } - } - } - - -SocialCalc.UpdateCellCSS = function(editor, cell, row, col) { - - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell(row, col, cell.rowpane, cell.colpane, true, null); - if (newelement) { - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a]!="cssText") - cell.element.style[a] = newelement.style[a]; - } - } - } - - -SocialCalc.SetECellHeaders = function(editor, selected) { - - var ecell = editor.ecell; - var context = editor.context; - - var rowpane, colpane, first, last; - var rowindex = 0; - var colindex = 0; - var headercell; - - if (!ecell) return; - - for (rowpane=0; rowpane= first && ecell.row <= last) { - headercell = editor.fullgrid.childNodes[1].childNodes[2+rowindex+ecell.row-first].childNodes[0]; - if (headercell) { - if (context.classnames) headercell.className=context.classnames[selected+"rowname"]; - if (context.explicitStyles) headercell.style.cssText=context.explicitStyles[selected+"rowname"]; - headercell.style.verticalAlign="top"; // to get around Safari making top of centered row number be - // considered top of row (and can't get position in Safari) - } - } - rowindex += last - first + 1 + 1; - } - - for (colpane=0; colpane= first && ecell.col <= last) { - headercell = editor.fullgrid.childNodes[1].childNodes[1].childNodes[1+colindex+ecell.col-first]; - if (headercell) { - if (context.classnames) headercell.className=context.classnames[selected+"colname"]; - if (context.explicitStyles) headercell.style.cssText=context.explicitStyles[selected+"colname"]; - } - } - colindex += last - first + 1 + 1; - } - } - -// -// RangeAnchor(editor, ecoord) -// -// Sets the anchor of a range to ecoord (or ecell if missing). -// - -SocialCalc.RangeAnchor = function(editor, ecoord) { - - if (editor.range.hasrange) { - editor.RangeRemove(); - } - - editor.RangeExtend(ecoord); - - } - -// -// RangeExtend(editor, ecoord) -// -// Sets the other corner of the range to ecoord or, if missing, ecell. -// - -SocialCalc.RangeExtend = function(editor, ecoord) { - - var a, cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - var ecell; - if (ecoord) { - ecell = SocialCalc.coordToCr(ecoord); - ecell.coord = ecoord; - } - else ecell = editor.ecell; - - if (!ecell) return; // just in case - - if (!range.hasrange) { // called without RangeAnchor... - range.anchorcoord = ecell.coord; - range.anchorrow = ecell.row; - range.top = ecell.row; - range.bottom = ecell.row; - range.anchorcol = ecell.col; - range.left = ecell.col; - range.right = ecell.col; - range.hasrange = true; - } - - if (range.anchorrow < ecell.row) { - range.top = range.anchorrow; - range.bottom = ecell.row; - } - else { - range.top = ecell.row; - range.bottom = range.anchorrow; - } - if (range.anchorcol < ecell.col) { - range.left = range.anchorcol; - range.right = ecell.col; - } - else { - range.left = ecell.col; - range.right = range.anchorcol; - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - highlights[coord] = "unrange"; - break; - case "range2": - highlights[coord] = "unrange2"; - break; - } - } - - for (row=range.top; row<=range.bottom; row++) { - for (col=range.left; col<=range.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange": - highlights[coord] = "range"; - break; - case "cursor": - break; - case "unrange2": - default: - highlights[coord] = "newrange"; - break; - } - } - } - - for (row=range2.top; range2.hasrange && row<=range2.bottom; row++) { - for (col=range2.left; col<=range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange2": - highlights[coord] = "range2"; - break; - case "range": - case "newrange": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - - switch (highlights[coord]) { - case "unrange": - delete highlights[coord]; - break; - case "newrange": - highlights[coord] = "range"; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "range": - case "range2": - case "cursor": - continue; - } - - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - - } - - for (f in editor.RangeChangeCallback) { // let others know - editor.RangeChangeCallback[f](editor); - } - - // create range/coord string and do status callback - - coord = SocialCalc.crToCoord(editor.range.left, editor.range.top); - if (editor.range.left!=editor.range.right || editor.range.top!=editor.range.bottom) { // more than one cell - coord += ":" + SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "rangechange", coord, editor.StatusCallback[f].params); - } - - return; - - } - -// -// RangeRemove(editor) -// -// Turns off the range. -// - -SocialCalc.RangeRemove = function(editor) { - - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - if (!range.hasrange && !range2.hasrange) return; - - for (row=range2.top; range2.hasrange && row<=range2.bottom; row++) { - for (col=range2.left; col<=range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "range": - highlights[coord] = "newrange2"; - break; - case "range2": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - delete highlights[coord]; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell=SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range.hasrange = false; - - for (f in editor.RangeChangeCallback) { // let others know - editor.RangeChangeCallback[f](editor); - } - - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "rangechange", "", editor.StatusCallback[f].params); - } - - return; - - } - -// -// Range2Remove(editor) -// -// Turns off the range2. -// - -SocialCalc.Range2Remove = function(editor) { - - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range2 = editor.range2; - - if (!range2.hasrange) return; - - for (coord in highlights) { - switch (highlights[coord]) { - case "range2": - delete highlights[coord]; - break; - case "range": - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell=SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range2.hasrange = false; - - return; - - } - -// -// FitToEditTable(editor) -// -// Figure out (through column width declarations and approximation of pixels per row) -// how many rendered rows and columns you need to be at least a little larger than -// the editor's editing area. -// - -SocialCalc.FitToEditTable = function(editor) { - - var colnum, colname, colwidth, totalwidth, totalrows, rowpane, needed; - - var context=editor.context; - var sheetobj=context.sheetobj; - var sheetcolattribs=sheetobj.colattribs; - - // Calculate column width data - - totalwidth=context.showRCHeaders ? context.rownamewidth-0 : 0; - for (colpane=0; colpane0)) ? (colwidth-0) : 10; - } - } - - for (colnum=context.colpanes[colpane].first; colnum<=10000; colnum++) { //!!! max for safety, but makes that col max!!! - colname=SocialCalc.rcColname(colnum); - colwidth = sheetobj.colattribs.width[colname] || sheetobj.attribs.defaultcolwidth || SocialCalc.Constants.defaultColWidth; - if (colwidth=="blank" || colwidth=="auto") colwidth=""; - totalwidth+=(colwidth && ((colwidth-0)>0)) ? (colwidth-0) : 10; - if (totalwidth > editor.tablewidth) break; - } - - context.colpanes[colpane].last = colnum; - - // Calculate row height data - - totalrows=context.showRCHeaders ? 1 : 0; - for (rowpane=0; rowpaneeditor.gridposition.top+editor.tableheight) break; - } - editor.lastvisiblerow = i-1; - - editor.colpositions = []; - for (colpane=0; colpaneeditor.gridposition.left+editor.tablewidth) break; - } - editor.lastvisiblecol = i-1; - - editor.firstscrollingrow = editor.context.rowpanes[editor.context.rowpanes.length-1].first; - editor.firstscrollingrowtop = editor.rowpositions[editor.firstscrollingrow] || editor.headposition.top; - editor.lastnonscrollingrow = editor.context.rowpanes.length-1 > 0 ? - editor.context.rowpanes[editor.context.rowpanes.length-2].last : 0; - editor.firstscrollingcol = editor.context.colpanes[editor.context.colpanes.length-1].first; - editor.firstscrollingcolleft = editor.colpositions[editor.firstscrollingcol] || editor.headposition.left; - editor.lastnonscrollingcol = editor.context.colpanes.length-1 > 0 ? - editor.context.colpanes[editor.context.colpanes.length-2].last : 0; - - // Now do the table controls - - editor.verticaltablecontrol.ComputeTableControlPositions(); - editor.horizontaltablecontrol.ComputeTableControlPositions(); - } - -// -// ScheduleRender(editor) -// -// Do a series of timeouts to render the sheet, wait for background layout and -// rendering by the browser, and then update editor visuals, sliders, etc. -// - -SocialCalc.ScheduleRender = function(editor) { - - if (editor.timeout) window.clearTimeout(editor.timeout); // in case called more than once, just use latest - - SocialCalc.EditorSheetStatusCallback(null, "schedrender", null, editor); - SocialCalc.EditorStepInfo.editor = editor; - editor.timeout = window.setTimeout(SocialCalc.DoRenderStep, 1); - - } - -// DoRenderStep() -// - -SocialCalc.DoRenderStep = function() { - - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - editor.EditorRenderSheet(); - - SocialCalc.EditorSheetStatusCallback(null, "renderdone", null, editor); - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - - } - -// -// SocialCalc.SchedulePositionCalculations(editor) -// - -SocialCalc.SchedulePositionCalculations = function(editor) { - - SocialCalc.EditorStepInfo.editor = editor; - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - - } - -// DoPositionCalculations(editor) -// -// Update editor visuals, sliders, etc. -// -// Note: Only call this after the DOM objects have been modified and rendered! -// - -SocialCalc.DoPositionCalculations = function() { - - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - var ok = false; - try { - editor.CalculateEditorPositions(); - ok = true; - } catch (e) {} - - if (!ok) { - if (typeof $ != 'undefined') { - $(window).trigger('resize'); - setTimeout( SocialCalc.DoPositionCalculations, 400); - } - return; /* Workaround IE6 partial-initialized-DOM bug */ - } - - editor.verticaltablecontrol.PositionTableControlElements(); - editor.horizontaltablecontrol.PositionTableControlElements(); - - SocialCalc.EditorSheetStatusCallback(null, "doneposcalc", null, editor); - - if (editor.ensureecell && editor.ecell && !editor.deferredCommands.length) { // don't do if deferred cmd to execute - editor.ensureecell = false; - editor.EnsureECellVisible(); // this could cause another redisplay - } - - editor.cellhandles.ShowCellHandles(true); - - -//!!! Need to now check to see if this positioned controls out of the editing area -//!!! (such as when there is a large wrapped cell and it pushes the pane boundary too far down). - - if (SocialCalc.Callbacks.broadcast) SocialCalc.Callbacks.broadcast('ask.ecell'); - } - -SocialCalc.CalculateRowPositions = function(editor, panenum, positions, sizes) { - - var toprow, rowpane, rownum, offset, trowobj, cellposition; - - var context=editor.context; - var sheetobj=context.sheetobj; - - var tbodyobj; - - if (!context.showRCHeaders) throw("Needs showRCHeaders=true"); - - tbodyobj=editor.fullgrid.lastChild; - - // Calculate start of this pane as row in this table: - - toprow = 2; - for (rowpane=0; rowpane1 ? context.rowpanes[vplen-2].last+1 : 1; // don't scroll past here - if (context.rowpanes[vplen-1].first+vamount < vlimit) { // limit amount - vamount = (-context.rowpanes[vplen-1].first) + vlimit; - } - - var hplen=context.colpanes.length; - var hlimit = hplen>1 ? context.colpanes[hplen-2].last+1 : 1; // don't scroll past here - if (context.colpanes[hplen-1].first+hamount < hlimit) { // limit amount - hamount = (-context.colpanes[hplen-1].first) + hlimit; - } - - if ((vamount==1 || vamount==-1) && hamount==0) { // special case quick scrolls - if (vamount==1) { - editor.ScrollTableUpOneRow(); - } - else { - editor.ScrollTableDownOneRow(); - } - if (editor.ecell) editor.SetECellHeaders("selected"); - editor.SchedulePositionCalculations(); - return; - } - - // Do a gross move and render - - if (vamount!=0 || hamount!=0) { - context.rowpanes[vplen-1].first += vamount; - context.rowpanes[vplen-1].last += vamount; - context.colpanes[hplen-1].first += hamount; - context.colpanes[hplen-1].last += hamount; - editor.FitToEditTable(); - editor.ScheduleRender(); - } - - } - - -// PageRelative(editor, vertical, direction) -// -// If vertical true, pages up(direction is -)/down(+), else left(-)/right(+) - -SocialCalc.PageRelative = function(editor, vertical, direction) { - - var context=editor.context; - var panes=vertical ? "rowpanes" : "colpanes"; - var lastpane=context[panes][context[panes].length-1]; - var lastvisible=vertical ? "lastvisiblerow" : "lastvisiblecol"; - var sizearray=vertical ? editor.rowheight : editor.colwidth; - var defaultsize=vertical ? SocialCalc.Constants.defaultAssumedRowHeight : SocialCalc.Constants.defaultColWidth; - var size, newfirst, totalsize, current; - - if (direction > 0) { // down/right - newfirst = editor[lastvisible]; - if (newfirst == lastpane.first) newfirst += 1; // move at least one - } - else { - if (vertical) { // calculate amount to scroll - totalsize = editor.tableheight - (editor.firstscrollingrowtop - editor.gridposition.top); - } - else { - totalsize = editor.tablewidth - (editor.firstscrollingcolleft - editor.gridposition.left); - } - totalsize -= sizearray[editor[lastvisible]] > 0 ? sizearray[editor[lastvisible]] : defaultsize; - - for (newfirst=lastpane.first-1; newfirst>0; newfirst--) { - size = sizearray[newfirst] > 0 ? sizearray[newfirst] : defaultsize; - if (totalsize < size) break; - totalsize -= size; - } - - current = lastpane.first; - if (newfirst >= current) newfirst = current-1; // move at least 1 - if (newfirst < 1) newfirst = 1; - } - - lastpane.first = newfirst; - lastpane.last = newfirst+1; - editor.LimitLastPanes(); - editor.FitToEditTable(); - editor.ScheduleRender(); - - } - -// LimitLastPanes(editor) -// -// Makes sure that the "first" of the last panes isn't before the last of the previous pane -// - -SocialCalc.LimitLastPanes = function(editor) { - - var context=editor.context; - var plen; - - plen = context.rowpanes.length; - if (plen>1 && context.rowpanes[plen-1].first <= context.rowpanes[plen-2].last) - context.rowpanes[plen-1].first = context.rowpanes[plen-2].last+1; - - plen = context.colpanes.length; - if (plen>1 && context.colpanes[plen-1].first <= context.colpanes[plen-2].last) - context.colpanes[plen-1].first = context.colpanes[plen-2].last+1; - - } - -SocialCalc.ScrollTableUpOneRow = function(editor) { - - var toprow, rowpane, rownum, colnum, colpane, cell, oldrownum, maxspan, newbottomrow, newrow, oldchild, bottomrownum; - var rowneedsrefresh={}; - - var context=editor.context; - var sheetobj=context.sheetobj; - var tableobj=editor.fullgrid; - - var tbodyobj; - - tbodyobj=tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane=0; rowpanemaxrowspan) maxrowspan=cell.rowspan; - } - } - - if (maxrowspan>1) { - for (rownum=1; rownum= context.rowpanes[rowpane].last) break; - newrow=context.RenderRow(rownum+oldrownum, rowpane); - oldchild=tbodyobj.childNodes[toprow+rownum-1]; - tbodyobj.replaceChild(newrow,oldchild); - } - } - - // if added a row that includes rowspans from above, update the size of those to include new row - - bottomrownum=context.rowpanes[rowpane].last; - - for (colpane=0; colpane1) rowneedsrefresh[rownum]=true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow=context.RenderRow(rownum, rowpane); - oldchild=tbodyobj.childNodes[(toprow+(rownum-context.rowpanes[rowpane].first))]; - tbodyobj.replaceChild(newrow,oldchild); - } - - return tableobj; - } - -SocialCalc.ScrollTableDownOneRow = function(editor) { - - var toprow, rowpane, rownum, colnum, colpane, cell, newrownum, maxspan, newbottomrow, newrow, oldchild, bottomrownum; - var rowneedsrefresh={}; - - var context=editor.context; - var sheetobj=context.sheetobj; - var tableobj=editor.fullgrid; - - var tbodyobj; - - tbodyobj=tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane=0; rowpanemaxrowspan) maxrowspan=cell.rowspan; - } - } - - if (maxrowspan>1) { - for (rownum=1; rownum context.rowpanes[rowpane].last) break; - newrow=context.RenderRow(rownum+newrownum, rowpane); - oldchild=tbodyobj.childNodes[toprow+rownum]; - tbodyobj.replaceChild(newrow,oldchild); - } - } - - // if last row now includes rowspans or rowspans from above, update the size of those to remove deleted row - - bottomrownum=context.rowpanes[rowpane].last; - - for (colpane=0; colpane1) { - rowneedsrefresh[bottomrownum]=true; // need to update this row - continue; - } - coord=context.cellskip[SocialCalc.crToCoord(colnum, bottomrownum)]; - if (!coord) continue; // only look at spanned cells - rownum=context.coordToCR[coord].row-0; - if (rownum==bottomrownum || - rownum1) rowneedsrefresh[rownum]=true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow=context.RenderRow(rownum, rowpane); - oldchild=tbodyobj.childNodes[(toprow+(rownum-context.rowpanes[rowpane].first))]; - tbodyobj.replaceChild(newrow,oldchild); - } - - return tableobj; - } - - -// ************************************* -// -// InputBox class: -// -// This class deals with the text box for editing cell contents. -// It mainly controls a user input box for typed content and is used to interact with -// the keyboard code, etc. -// -// You can use this inside a formula bar control of some sort. -// You create this after you have created a table editor object (but not necessarily -// done the CreateTableEditor method). -// -// When the user starts typing text, or double-clicks on a cell, this object -// comes into play. -// -// The element given when this is first constructed should be an input HTMLElement or -// something that acts like one. Check the code here to see what is done to it. -// -// ************************************* - -SocialCalc.InputBox = function(element, editor) { - - if (!element) return; // invoked without enough data to work - - this.element = element; // the input element associated with this InputBox - this.editor = editor; // the TableEditor this belongs to - this.inputEcho = null; - - editor.inputBox = this; - - element.onmousedown = SocialCalc.InputBoxOnMouseDown; - - editor.MoveECellCallback.formulabar = function(e){ - if (e.state!="start") return; // if not in normal keyboard mode don't replace formula bar - editor.inputBox.DisplayCellContents(e.ecell.coord); - }; - } - - -// Methods: - -SocialCalc.InputBox.prototype.DisplayCellContents = function(coord) {SocialCalc.InputBoxDisplayCellContents(this, coord);}; -SocialCalc.InputBox.prototype.ShowInputBox = function(show) {this.editor.inputEcho.ShowInputEcho(show);}; -SocialCalc.InputBox.prototype.GetText = function() {return this.element.value;}; -SocialCalc.InputBox.prototype.SetText = function(newtext) { - if (!this.element) return; - this.element.value=newtext; - if (!SocialCalc.HasTouch) { - this.editor.inputEcho.SetText(newtext+"_"); - } else { - this.editor.inputEcho.SetText(newtext); - } -}; -SocialCalc.InputBox.prototype.Focus = function() {SocialCalc.InputBoxFocus(this);}; -SocialCalc.InputBox.prototype.Blur = function() {return this.element.blur();}; -SocialCalc.InputBox.prototype.Select = function(t) { - if (!this.element) return; - switch (t) { - case "end": - if (document.selection && document.selection.createRange) { - /* IE 4+ - Safer than setting .selectionEnd as it also works for Textareas. */ - var range = document.selection.createRange().duplicate(); - range.moveToElementText(this.element); - range.collapse(false); - range.select(); - } else if (this.element.selectionStart!=undefined) { - this.element.selectionStart=this.element.value.length; - this.element.selectionEnd=this.element.value.length; - } - break; - } - }; - -// Functions: - -// -// SocialCalc.InputBoxDisplayCellContents(inputbox, coord) -// -// Sets input box to the contents of the specified cell (or ecell if null). -// - -SocialCalc.InputBoxDisplayCellContents = function(inputbox, coord) { - - var scc = SocialCalc.Constants; - - if (!inputbox) return; - if (!coord) coord = inputbox.editor.ecell.coord; - var text = SocialCalc.GetCellContents(inputbox.editor.context.sheetobj, coord); - if (text.indexOf("\n")!=-1) { - text = scc.s_inputboxdisplaymultilinetext; - inputbox.element.disabled = true; - } - else { - inputbox.element.disabled = false; - } - inputbox.SetText(text); - - } - -// -// SocialCalc.InputBoxFocus(inputbox) -// -// Call this to have the input box get the focus and respond to keystrokes -// but still pass them off to SocialCalc.ProcessKey. -// - -SocialCalc.InputBoxFocus = function(inputbox) { - - if (!inputbox) return; - inputbox.element.focus(); - var editor = inputbox.editor; - editor.state = "input"; - var wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - - }; - -// -// SocialCalc.InputBoxOnMouseDown(e) -// -// This is called when the input box gets the focus. It then responds to keystrokes -// and pass them off to SocialCalc.ProcessKey, but in a different editing state. -// - -SocialCalc.InputBoxOnMouseDown = function(e) { - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var wval = editor.workingvalues; - - switch (editor.state) { - case "start": - editor.state="inputboxdirect"; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.inputEcho.ShowInputEcho(true); - break; - - case "input": - wval.partialexpr = ""; // make sure not pointing - editor.MoveECell(wval.ecoord); - editor.state="inputboxdirect"; - SocialCalc.KeyboardFocus(); // may have come here from outside of grid - break; - - case "inputboxdirect": - break; - } - } - - -// ************************************* -// -// InputEcho class: -// -// This object creates and controls an element that echos what's in the InputBox during editing -// It is draggable. -// -// ************************************* - -SocialCalc.InputEcho = function(editor) { - - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - this.text = ""; // current value of what is displayed - this.interval = null; // timer handle - - this.container = null; // element containing main echo as well as prompt line - this.main = null; // main echo area - this.prompt = null; - - this.functionbox = null; // function chooser dialog - - this.container = document.createElement("div"); - SocialCalc.setStyles(this.container, "display:none;position:absolute;zIndex:10;"); - - this.topprompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) this.topprompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) SocialCalc.setStyles(this.topprompt, scc.defaultInputEchoPromptStyle); - this.topprompt.innerHTML = ""; - - this.container.appendChild(this.topprompt); - - - this.main = document.createElement("div"); - if (SocialCalc.HasTouch) { - this.maininput = document.createElement("input"); - } - if (scc.defaultInputEchoClass) this.main.className = scc.defaultInputEchoClass; - if (scc.defaultInputEchoStyle) SocialCalc.setStyles(this.main, scc.defaultInputEchoStyle); - if (SocialCalc.HasTouch) { - this.main.appendChild(this.maininput); - } else { - this.main.innerHTML = " "; - } - - - this.container.appendChild(this.main); - - this.prompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) this.prompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) SocialCalc.setStyles(this.prompt, scc.defaultInputEchoPromptStyle); - this.prompt.innerHTML = ""; - - this.container.appendChild(this.prompt); - - SocialCalc.DragRegister(this.main, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: this.container}); - - editor.toplevel.appendChild(this.container); - - } - -// Methods: - -SocialCalc.InputEcho.prototype.ShowInputEcho = function(show) {return SocialCalc.ShowInputEcho(this, show);}; -SocialCalc.InputEcho.prototype.SetText = function(str) {return SocialCalc.SetInputEchoText(this, str);}; - -// Functions: - -SocialCalc.ShowInputEcho = function(inputecho, show) { - - var cell, position; - var editor = inputecho.editor; - - if (!editor) return; - - if (show) { - editor.cellhandles.ShowCellHandles(false); - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - inputecho.container.style.left = (position.left-1)+"px"; - inputecho.container.style.top = (position.top-1)+"px"; - } - inputecho.container.style.display = "block"; - if (inputecho.interval) window.clearInterval(inputecho.interval); // just in case - inputecho.interval = window.setInterval(SocialCalc.InputEchoHeartbeat, 50); - if (SocialCalc.HasTouch) { - inputecho.maininput.focus(); - } - } - else { - if (inputecho.interval) window.clearInterval(inputecho.interval); - inputecho.container.style.display = "none"; - inputecho.topprompt.innerHTML = ""; - if (SocialCalc.HasTouch) { - inputecho.maininput.blur(); - inputecho.maininput.value = ""; - } - } - -} - -SocialCalc.SetInputEchoText = function(inputecho, str) { - - var scc = SocialCalc.Constants; - var fname, fstr; - var newstr = SocialCalc.special_chars(str); - newstr = newstr.replace(/\n/g,"
    "); - - if (!SocialCalc.HasTouch) { - if (inputecho.text != newstr) { - inputecho.main.innerHTML = newstr; - inputecho.text = newstr; - } - } else { - if (inputecho.maininput.value != newstr) { - inputecho.maininput.value = newstr; - } - } - - var parts = str.match(/.*[\+\-\*\/\&\^\<\>\=\,\(]([A-Za-z][A-ZA-z]\w*?)\([^\)]*$/); - if (str.charAt(0)=="=" && parts) { - fname = parts[1].toUpperCase(); - if (SocialCalc.Formula.FunctionList[fname]) { - SocialCalc.Formula.FillFunctionInfo(); // make sure filled - fstr = SocialCalc.special_chars(fname+"("+SocialCalc.Formula.FunctionArgString(fname)+")"); - } - else { - fstr = scc.ietUnknownFunction+fname; - } - if (inputecho.prompt.innerHTML != fstr) { - inputecho.prompt.innerHTML = fstr; - inputecho.prompt.style.display = "block"; - } - } - else if (inputecho.prompt.style.display != "none") { - inputecho.prompt.innerHTML = ""; - inputecho.prompt.style.display = "none"; - } - - var editor = inputecho.editor; - - - if (editor.workingvalues.currentsheet != - editor.workingvalues.startsheet) { - - var promptstr = "Editing:"+editor.workingvalues.startsheet+"!"+editor.workingvalues.ecoord; - if (promptstr != inputecho.topprompt.innerHTML) { - inputecho.topprompt.innerHTML = "Editing:"+editor.workingvalues.startsheet+"!"+editor.workingvalues.ecoord; - inputecho.topprompt.style.display = "block"; - } - } else { - if (inputecho.topprompt.style.display != "none") { - inputecho.topprompt.innerHTML = ""; - inputecho.topprompt.style.display = "none"; - } - } -} - -SocialCalc.InputEchoHeartbeat = function() { - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (! SocialCalc.HasTouch || editor.state == "inputboxdirect") { - editor.inputEcho.SetText(editor.inputBox.GetText()+"_"); - } else { - editor.inputBox.element.value = editor.inputEcho.maininput.value; - } - -} - -SocialCalc.InputEchoMouseDown = function(e) { - var event = e || window.event; - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - -// if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 -// else event.cancelBubble = true; // IE 5+ -// if (event.preventDefault) event.preventDefault(); // DOM Level 2 -// else event.returnValue = false; // IE 5+ - - editor.inputBox.element.focus(); - -// return false; - }; - - -// ************************************* -// -// CellHandles class: -// -// This object creates and controls the elements around the cursor cell for dragging, etc. -// -// ************************************* - -SocialCalc.CellHandles = function(editor) { - - var scc = SocialCalc.Constants; - var functions; - - if (editor.noEdit) return; // leave us with nothing - - this.editor = editor; // the TableEditor this belongs to - - this.noCursorSuffix = false; - - this.movedmouse = false; // used to detect no-op - - this.draghandle = document.createElement("div"); - SocialCalc.setStyles(this.draghandle, "display:none;position:absolute;zIndex:8;border:1px solid white;width:4px;height:4px;fontSize:1px;backgroundColor:#0E93D8;cursor:default;"); - this.draghandle.innerHTML = ' '; - editor.toplevel.appendChild(this.draghandle); - SocialCalc.AssignID(editor, this.draghandle, "draghandle"); - - var imagetype = "png"; - if (navigator.userAgent.match(/MSIE 6\.0/)) { - imagetype = "gif"; - } - - this.dragpalette = document.createElement("div"); - SocialCalc.setStyles(this.dragpalette, "display:none;position:absolute;zIndex:8;width:90px;height:90px;fontSize:1px;textAlign:center;cursor:default;"+ - "backgroundImage:url("+SocialCalc.Constants.defaultImagePrefix+"drag-handles."+imagetype+");"); - this.dragpalette.innerHTML = ' '; - editor.toplevel.appendChild(this.dragpalette); - SocialCalc.AssignID(editor, this.dragpalette, "dragpalette"); - - this.dragtooltip = document.createElement("div"); - SocialCalc.setStyles(this.dragtooltip, "display:none;position:absolute;zIndex:9;border:1px solid black;width:100px;height:auto;fontSize:10px;backgroundColor:#FFFFFF;"); - this.dragtooltip.innerHTML = ' '; - editor.toplevel.appendChild(this.dragtooltip); - SocialCalc.AssignID(editor, this.dragtooltip, "dragtooltip"); - - this.fillinghandle = document.createElement("div"); - SocialCalc.setStyles(this.fillinghandle, "display:none;position:absolute;zIndex:9;border:1px solid black;width:auto;height:14px;fontSize:10px;backgroundColor:#FFFFFF;"); - this.fillinghandle.innerHTML = ' '; - editor.toplevel.appendChild(this.fillinghandle); - SocialCalc.AssignID(editor, this.fillinghandle, "fillinghandle"); - - if (this.draghandle.addEventListener) { // DOM Level 2 -- Firefox, et al - this.draghandle.addEventListener("mousemove", SocialCalc.CellHandlesMouseMoveOnHandle, false); - this.dragpalette.addEventListener("mousedown", SocialCalc.CellHandlesMouseDown, false); - this.dragpalette.addEventListener("mousemove", SocialCalc.CellHandlesMouseMoveOnHandle, false); - } - else if (this.draghandle.attachEvent) { // IE 5+ - this.draghandle.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMoveOnHandle); - this.dragpalette.attachEvent("onmousedown", SocialCalc.CellHandlesMouseDown); - this.dragpalette.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMoveOnHandle); - } - else { // don't handle this - throw "Browser not supported"; - } - - } - -// Methods: - -SocialCalc.CellHandles.prototype.ShowCellHandles = function(show, moveshow) {return SocialCalc.ShowCellHandles(this, show, moveshow);}; - -// Functions: - -SocialCalc.ShowCellHandles = function(cellhandles, show, moveshow) { - - var cell, cell2, position, position2; - var editor = cellhandles.editor; - var doshow = false; - var row, col, viewport; - - if (!editor) return; - - do { // a block that can you can "break" out of easily - - if (!show) break; - - row = editor.ecell.row; - col = editor.ecell.col; - - if (editor.state != "start") break; - if (row >= editor.lastvisiblerow) break; - if (col >= editor.lastvisiblecol) break; - if (row < editor.firstscrollingrow) break; - if (col < editor.firstscrollingcol) break; - - if (editor.rowpositions[row+1]+20>editor.horizontaltablecontrol.controlborder) { - break; - } - if (editor.rowpositions[row+1]-10editor.verticaltablecontrol.controlborder) { - break; - } - if (editor.colpositions[col+1]-30= left && x < left+width/2 && y >= top && y < top+height/2) { // upper left - if (len <= segtable[0]) v = -1; - else if (len <= segtable[1]) v = 1; - } - if (x >= left+width/2 && x < left+width && y >= top && y < top+height/2) { // upper right - if (len <= segtable[0]) v = -2; - else if (len <= segtable[1]) v = 2; - } - if (x >= left+width/2 && x < left+width && y >= top+height/2 && y < top+height) { // bottom right - if (len <= segtable[0]) v = -3; - else if (len <= segtable[1]) v = 3; - } - if (x >= left && x < left+width/2 && y >= top+height/2 && y < top+height) { // bottom right - if (len <= segtable[0]) v = -4; - else if (len <= segtable[1]) v = 4; - } - return v; - } - - while (true) { - if (x >= left && x < left+width/2 && y >= top && y < top+height/2) { // upper left - quadrant += "1"; - v = table[0]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - height = height/2; - continue; - } - if (x >= left+width/2 && x < left+width && y >= top && y < top+height/2) { // upper right - quadrant += "2"; - v = table[1]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - left = left+width; - height = height/2; - continue; - } - if (x >= left+width/2 && x < left+width && y >= top+height/2 && y < top+height) { // bottom right - quadrant += "3"; - v = table[2]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - left = left + width; - height = height/2; - top = top + height; - continue; - } - if (x >= left && x < left+width/2 && y >= top+height/2 && y < top+height) { // bottom right - quadrant += "4"; - v = table[3]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - height = height/2; - top = top + height; - continue; - } - return 0; // didn't match - } - -//addmsg((x-divWithMouseHit.offsetLeft)+","+(y-divWithMouseHit.offsetTop)+"="+quadrant+" "+v); - return v; - -} - -SocialCalc.CellHandlesHoverTimeout = function() { - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.timer) { - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - editor.cellhandles.ShowCellHandles(true, false); // hide move handles - -} - -SocialCalc.CellHandlesTooltipsTimeout = function() { - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - - var whichhandle = cellhandles.tooltipswhichhandle; - if (whichhandle==0) { // off of active part of palette - SocialCalc.CellHandlesHoverTimeout(); - return; - } - if (whichhandle==-3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillAllTooltip; - } - else if (whichhandle==3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillContentsTooltip; - } - else if (whichhandle==-2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteAllTooltip; - } - else if (whichhandle==-4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertAllTooltip; - } - else if (whichhandle==2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteContentsTooltip; - } - else if (whichhandle==4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertContentsTooltip; - } - else { - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - return; - } - - cellhandles.dragtooltip.style.display = "block"; - -} - -SocialCalc.CellHandlesMouseDown = function(e) { - - var scc = SocialCalc.Constants; - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (editor.busy) return; // don't do anything when busy (is this correct?) - - var cellhandles = editor.cellhandles; - - cellhandles.movedmouse = false; // detect no-op - - if (cellhandles.timer) { // cancel timer - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - - range = editor.range; - - var whichhandle = SocialCalc.SegmentDivHit([scc.CH_radius1, scc.CH_radius2], editor.cellhandles.dragpalette, clientX, clientY); - if (whichhandle==1 || whichhandle==-1 || whichhandle==0) { - cellhandles.ShowCellHandles(true, false); // hide move handles - return; - } - - mouseinfo.ignore = true; // stop other code from looking at the mouse - - if (whichhandle==-3) { - cellhandles.dragtype = "Fill"; -// mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==3) { - cellhandles.dragtype = "FillC"; -// mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==-2) { - cellhandles.dragtype = "Move"; -// mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } - else if (whichhandle==-4) { - cellhandles.dragtype = "MoveI"; -// mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==2) { - cellhandles.dragtype = "MoveC"; -// mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } - else if (whichhandle==4) { - cellhandles.dragtype = "MoveIC"; -// mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } - - cellhandles.filltype = null; - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - break; - - case "Move": - case "MoveI": - case "MoveC": - case "MoveIC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.RangeRemove(); - break; - - default: - return; // not for us - } - - cellhandles.fillinghandle.style.left = (clientX)+"px"; - cellhandles.fillinghandle.style.top = (clientY - 17)+"px"; - cellhandles.fillinghandle.innerHTML = scc.s_CHindicatorOperationLookup[cellhandles.dragtype]+ - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - cellhandles.ShowCellHandles(true, false); // hide move handles - cellhandles.mouseDown = true; - - mouseinfo.editor = editor; // remember for later - - coord = editor.ecell.coord; // start with cell with handles - - cellhandles.startingcoord = coord; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - - mouseinfo.mouselastcoord = coord; - - SocialCalc.KeyboardSetFocus(editor); - - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mousemove", SocialCalc.CellHandlesMouseMove, true); // capture everywhere - document.addEventListener("mouseup", SocialCalc.CellHandlesMouseUp, true); // capture everywhere - } - else if (cellhandles.draghandle.attachEvent) { // IE 5+ - cellhandles.draghandle.setCapture(); - cellhandles.draghandle.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMove); - cellhandles.draghandle.attachEvent("onmouseup", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.attachEvent("onlosecapture", SocialCalc.CellHandlesMouseUp); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - -SocialCalc.CellHandlesMouseMove = function(e) { - - var scc = SocialCalc.Constants; - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - var crstart, crend, cr, c, r; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat(editor, result, SocialCalc.CellHandlesDragAutoRepeat); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - - - cellhandles.movedmouse = true; // did move, so not no-op - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - - if (result.coord == cellhandles.startingcoord) { // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } - else { - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Down") { // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } - else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } - else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Down"; - } - else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Right"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - c = editor.range2.right - editor.range2.left + result.col; - r = editor.range2.bottom - editor.range2.top + result.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (result.coord == cellhandles.startingcoord) { // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } - else { - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Vertical") { // coerse to that - crend.col = editor.range2.left; - if (crend.row>=editor.range2.top && crend.row<=editor.range2.bottom+1) crend.row = editor.range2.bottom+2; - } - else { - crend.row = editor.range2.top; - if (crend.col>=editor.range2.left && crend.col<=editor.range2.right+1) crend.col = editor.range2.right+2; - } - } - else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Vertical"; - } - else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Horizontal"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - if (!cellhandles.filltype) { // no fill type - editor.RangeRemove(); - } - else { - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - } - break; - - } - - - cellhandles.fillinghandle.style.left = (clientX)+"px"; - cellhandles.fillinghandle.style.top = (clientY - 17)+"px"; - cellhandles.fillinghandle.innerHTML = scc.s_CHindicatorOperationLookup[cellhandles.dragtype]+ - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - mouseinfo.mouselastcoord = result.coord; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - -SocialCalc.CellHandlesDragAutoRepeat = function(coord, direction) { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - var crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - var crend = SocialCalc.coordToCr(coord); - - var newcoord, c, r; - - var vscroll = 0; - var hscroll = 0; - - if (direction == "left") hscroll = -1; - else if (direction == "right") hscroll = 1; - else if (direction == "up") vscroll = -1; - else if (direction == "down") vscroll = 1; - editor.ScrollRelativeBoth(vscroll, hscroll); - - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Down") { // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } - else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } - else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord!=mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - c = editor.range2.right - editor.range2.left + editor.ecell.col; - r = editor.range2.bottom - editor.range2.top + editor.ecell.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Vertical") { // coerse to that - crend.col = editor.range2.left; - if (crend.row>=editor.range2.top && crend.row<=editor.range2.bottom+1) crend.row = editor.range2.bottom+2; - } - else { - crend.row = editor.range2.top; - if (crend.col>=editor.range2.left && crend.col<=editor.range2.right+1) crend.col = editor.range2.right+2; - } - } - else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord!=mouseinfo.mouselastcoord) { - editor.MoveECell(newcoord); - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - } - - mouseinfo.mouselastcoord = newcoord; - - } - -SocialCalc.CellHandlesMouseUp = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval, cstr, cmdtype, cmdtype2; - var crstart, crend; - var sizec, sizer, deltac, deltar; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - mouseinfo.ignore = false; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - cellhandles.mouseDown = false; - cellhandles.noCursorSuffix = false; - - cellhandles.fillinghandle.style.display = "none"; - - if (!result) result = {}; - if (!result.coord) result.coord = editor.ecell.coord; - - switch (cellhandles.dragtype) { - case "Fill": - case "Move": - case "MoveI": - cmdtype2 = " all"; - break; - case "FillC": - case "MoveC": - case "MoveIC": - cmdtype2 = " formulas"; - break; - } - - if (!cellhandles.movedmouse) { // didn't move: just leave one cell selected - cellhandles.dragtype = "Nothing"; - } - - switch (cellhandles.dragtype) { - case "Nothing": - editor.Range2Remove(); - editor.RangeRemove(); - break; - - case "Fill": - case "FillC": - - crstart = SocialCalc.coordToCr(cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - if (cellhandles.filltype) { - if (cellhandles.filltype=="Down") { - crend.col = crstart.col; - } - else { - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - - editor.MoveECell(result.coord); - editor.RangeExtend(); - - if (editor.cellhandles.filltype=="Right") { - cmdtype = "right"; - } - else { - cmdtype = "down"; - } - cstr = "fill"+cmdtype+" "+SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom)+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - break; - - case "Move": - case "MoveC": - editor.context.cursorsuffix = ""; - cstr = "movepaste "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - - break; - - case "MoveI": - case "MoveIC": - editor.context.cursorsuffix = ""; - sizec = editor.range2.right - editor.range2.left; - sizer = editor.range2.bottom - editor.range2.top; - deltac = editor.ecell.col - editor.range2.left; - deltar = editor.ecell.row - editor.range2.top; - cstr = "moveinsert "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - editor.RangeRemove(); - if (editor.cellhandles.filltype==" Horizontal" && deltac > 0) { - editor.MoveECell(SocialCalc.crToCoord(editor.ecell.col-sizec-1, editor.ecell.row)); - } - else if (editor.cellhandles.filltype==" Vertical" && deltar > 0) { - editor.MoveECell(SocialCalc.crToCoord(editor.ecell.col, editor.ecell.row-sizer-1)); - } - editor.RangeAnchor(SocialCalc.crToCoord(editor.ecell.col+sizec, editor.ecell.row+sizer)); - editor.RangeExtend(); - - break; - - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.CellHandlesMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.CellHandlesMouseUp, true); - } - else if (cellhandles.draghandle.detachEvent) { // IE - cellhandles.draghandle.detachEvent("onlosecapture", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.detachEvent("onmouseup", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.detachEvent("onmousemove", SocialCalc.CellHandlesMouseMove); - cellhandles.draghandle.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - - } - -// ************************************* -// -// TableControl class: -// -// This class deals with the horizontal and verical scrollbars and pane sliders. -// -// +--------------+ -// | Endcap | -// +- - - - - - - + -// | | -// +--------------+ -// | Pane Slider | -// +--------------+ -// | | -// | Less Button | -// | | -// +--------------+ -// | Scroll Area | -// | | -// | | -// +--------------+ -// | Thumb | -// +--------------+ -// | | -// +--------------+ -// | | -// | More Button | -// | | -// +--------------+ -// -// ************************************* - -SocialCalc.TableControl = function(editor, vertical, size) { - - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - - this.vertical = vertical; // true if vertical control, false if horizontal - this.size = size; // length in pixels - - this.main = null; // main element containing all the others - this.endcap = null; // the area at the top/left between the end and the pane slider - this.paneslider = null; // the slider to adjust the pane split - this.lessbutton = null; // the top/left scroll button - this.morebutton = null; // the bottom/right scroll button - this.scrollarea = null; // the area between the scroll buttons - this.thumb = null; // the sliding thing in the scrollarea - - // computed position values: - - this.controlborder = null; // left or top screen position for vertical or horizontal control - this.endcapstart = null; // top or left screen position for vertical or horizontal control - this.panesliderstart = null; - this.lessbuttonstart = null; - this.morebuttonstart = null; - this.scrollareastart = null; - this.scrollareaend = null; - this.scrollareasize = null; - this.thumbpos = null; - - // constants: - - this.controlthickness = scc.defaultTableControlThickness; // other dimension of complete control in pixels - this.sliderthickness = scc.defaultTCSliderThickness; - this.buttonthickness = scc.defaultTCButtonThickness; - this.thumbthickness = scc.defaultTCThumbThickness; - this.minscrollingpanesize = this.buttonthickness+this.buttonthickness+this.thumbthickness+20; // the 20 is to leave a little space - - } - -// Methods: - -SocialCalc.TableControl.prototype.CreateTableControl = function() {return SocialCalc.CreateTableControl(this);}; -SocialCalc.TableControl.prototype.PositionTableControlElements = function() {SocialCalc.PositionTableControlElements(this);}; -SocialCalc.TableControl.prototype.ComputeTableControlPositions = function() {SocialCalc.ComputeTableControlPositions(this);}; - -// Functions: - -SocialCalc.CreateTableControl = function(control) { - - var s, functions, params; - var AssignID = SocialCalc.AssignID; - var setStyles = SocialCalc.setStyles; - var scc = SocialCalc.Constants; - var TooltipRegister = function(element, etype, vh) { - if (scc["s_"+etype+"Tooltip"+vh]) { - SocialCalc.TooltipRegister(element, scc["s_"+etype+"Tooltip"+vh], null); - } - } - - var imageprefix = control.editor.imageprefix; - var vh = control.vertical ? "v" : "h"; - - control.main = document.createElement("div"); - s = control.main.style; - s.height = (control.vertical ? control.size : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.size)+"px"; - s.zIndex = 0; - setStyles(control.main, scc.TCmainStyle); - s.backgroundImage="url("+imageprefix+"main-"+vh+".gif)"; - if (scc.TCmainClass) control.main.className = scc.TCmainClass; - - control.main.style.display="none"; // wait for layout - - control.endcap = document.createElement("div"); - s = control.endcap.style; - s.height = control.controlthickness+"px"; - s.width = control.controlthickness+"px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.endcap, scc.TCendcapStyle); - s.backgroundImage="url("+imageprefix+"endcap-"+vh+".gif)"; - if (scc.TCendcapClass) control.endcap.className = scc.TCendcapClass; - AssignID(control.editor, control.endcap, "endcap"+vh); - - control.main.appendChild(control.endcap); - - control.paneslider = document.createElement("div"); - s = control.paneslider.style; - s.height = (control.vertical ? control.sliderthickness : control.controlthickness)+"px"; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.width = (control.vertical ? control.controlthickness : control.sliderthickness)+"px"; - s.position = "absolute"; - s[control.vertical?"top":"left"] = "4px"; - s.zIndex = 3; - setStyles(control.paneslider, scc.TCpanesliderStyle); - s.backgroundImage="url("+imageprefix+"paneslider-"+vh+".gif)"; - if (scc.TCpanesliderClass) control.paneslider.className = scc.TCpanesliderClass; - AssignID(control.editor, control.paneslider, "paneslider"+vh); - TooltipRegister(control.paneslider, "paneslider", vh); - - functions = {MouseDown:SocialCalc.TCPSDragFunctionStart, - MouseMove: SocialCalc.TCPSDragFunctionMove, - MouseUp: SocialCalc.TCPSDragFunctionStop, - Disabled: function() {return control.editor.busy;}}; - - functions.control = control; // make sure this is there - - SocialCalc.DragRegister(control.paneslider, control.vertical, !control.vertical, functions); - - control.main.appendChild(control.paneslider); - - control.lessbutton = document.createElement("div"); - s = control.lessbutton.style; - s.height = (control.vertical ? control.buttonthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.buttonthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.lessbutton, scc.TClessbuttonStyle); - s.backgroundImage="url("+imageprefix+"less-"+vh+"n.gif)" - if (scc.TClessbuttonClass) control.lessbutton.className = scc.TClessbuttonClass; - AssignID(control.editor, control.lessbutton, "lessbutton"+vh); - - params = {repeatwait:scc.TClessbuttonRepeatWait, repeatinterval:scc.TClessbuttonRepeatInterval, - normalstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"n.gif);", - downstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"d.gif);", - hoverstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"h.gif);"}; - functions = {MouseDown:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, -1);}, - Repeat:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, -1);}, - Disabled: function() {return control.editor.busy;}}; - - SocialCalc.ButtonRegister(control.lessbutton, params, functions); - - control.main.appendChild(control.lessbutton); - - control.morebutton = document.createElement("div"); - s = control.morebutton.style; - s.height = (control.vertical ? control.buttonthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.buttonthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.morebutton, scc.TCmorebuttonStyle); - s.backgroundImage="url("+imageprefix+"more-"+vh+"n.gif)" - if (scc.TCmorebuttonClass) control.morebutton.className = scc.TCmorebuttonClass; - AssignID(control.editor, control.morebutton, "morebutton"+vh); - - params = {repeatwait:scc.TCmorebuttonRepeatWait, repeatinterval:scc.TCmorebuttonRepeatInterval, - normalstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"n.gif);", - downstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"d.gif);", - hoverstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"h.gif);"}; - functions = {MouseDown:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, +1);}, - Repeat:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, +1);}, - Disabled: function() {return control.editor.busy;}}; - - SocialCalc.ButtonRegister(control.morebutton, params, functions); - - control.main.appendChild(control.morebutton); - - control.scrollarea = document.createElement("div"); - s = control.scrollarea.style; - s.height = control.controlthickness+"px"; - s.width = control.controlthickness+"px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.scrollarea, scc.TCscrollareaStyle); - s.backgroundImage="url("+imageprefix+"scrollarea-"+vh+".gif)"; - if (scc.TCscrollareaClass) control.scrollarea.className = scc.TCscrollareaClass; - AssignID(control.editor, control.scrollarea, "scrollarea"+vh); - - params = {repeatwait:scc.TCscrollareaRepeatWait, repeatinterval:scc.TCscrollareaRepeatWait}; - functions = {MouseDown:SocialCalc.ScrollAreaClick, Repeat:SocialCalc.ScrollAreaClick, - Disabled: function() {return control.editor.busy;}}; - functions.control = control; - - SocialCalc.ButtonRegister(control.scrollarea, params, functions); - - control.main.appendChild(control.scrollarea); - - control.thumb = document.createElement("div"); - s = control.thumb.style; - s.height = (control.vertical ? control.thumbthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.thumbthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.thumb, scc.TCthumbStyle); - control.thumb.style.backgroundImage="url("+imageprefix+"thumb-"+vh+"n.gif)"; - if (scc.TCthumbClass) control.thumb.className = scc.TCthumbClass; - AssignID(control.editor, control.thumb, "thumb"+vh); - - functions = {MouseDown:SocialCalc.TCTDragFunctionStart, - MouseMove: SocialCalc.TCTDragFunctionMove, - MouseUp: SocialCalc.TCTDragFunctionStop, - Disabled: function() {return control.editor.busy;}}; - functions.control = control; // make sure this is there - SocialCalc.DragRegister(control.thumb, control.vertical, !control.vertical, functions); - - params = {normalstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"n.gif)", name:"Thumb", - downstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"d.gif)", - hoverstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"h.gif)"}; - SocialCalc.ButtonRegister(control.thumb, params, null); // give it button-like visual behavior - - control.main.appendChild(control.thumb); - - return control.main; - -} - -// -// ScrollAreaClick - Button function to process pageup/down clicks -// - -SocialCalc.ScrollAreaClick = function(e, buttoninfo, bobj) { - - var control = bobj.functionobj.control; - var bposition = SocialCalc.GetElementPosition(bobj.element); - var clickpos = control.vertical ? buttoninfo.clientY : buttoninfo.clientX; - if (control.editor.busy) { // ignore if busy - wait for next repeat - return; - } - control.editor.PageRelative(control.vertical, clickpos > control.thumbpos ? 1 : -1); - - return; - -} - -// -// PositionTableControlElements -// - -SocialCalc.PositionTableControlElements = function(control) { - - var border, realend, thumbpos; - - var editor = control.editor; - - if (control.vertical) { - border = control.controlborder+"px"; - control.endcap.style.top = control.endcapstart+"px"; - control.endcap.style.left = border; - control.paneslider.style.top = control.panesliderstart+"px"; - control.paneslider.style.left = border - control.lessbutton.style.top = control.lessbuttonstart+"px"; - control.lessbutton.style.left = border; - control.morebutton.style.top = control.morebuttonstart+"px"; - control.morebutton.style.left = border; - control.scrollarea.style.top = control.scrollareastart+"px"; - control.scrollarea.style.left = border; - control.scrollarea.style.height = control.scrollareasize+"px"; - realend = Math.max(editor.context.sheetobj.attribs.lastrow, editor.firstscrollingrow+1); - thumbpos = ((editor.firstscrollingrow-(editor.lastnonscrollingrow+1))*(control.scrollareasize-3*control.thumbthickness))/ - (realend-(editor.lastnonscrollingrow+1))+control.scrollareastart-1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.top = thumbpos+"px"; - control.thumb.style.left = border; - } - else { - border = control.controlborder+"px"; - control.endcap.style.left = control.endcapstart+"px"; - control.endcap.style.top = border; - control.paneslider.style.left = control.panesliderstart+"px"; - control.paneslider.style.top = border - control.lessbutton.style.left = control.lessbuttonstart+"px"; - control.lessbutton.style.top = border; - control.morebutton.style.left = control.morebuttonstart+"px"; - control.morebutton.style.top = border; - control.scrollarea.style.left = control.scrollareastart+"px"; - control.scrollarea.style.top = border; - control.scrollarea.style.width = control.scrollareasize+"px"; - realend = Math.max(editor.context.sheetobj.attribs.lastcol, editor.firstscrollingcol+1); - thumbpos = ((editor.firstscrollingcol-(editor.lastnonscrollingcol+1))*(control.scrollareasize-control.thumbthickness))/ - (realend-editor.lastnonscrollingcol)+control.scrollareastart-1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.left = thumbpos+"px"; - control.thumb.style.top = border; - } - control.thumbpos = thumbpos; - control.main.style.display="block"; - - } - -// -// ComputeTableControlPositions -// -// This routine computes the screen positions and other values needed for laying out -// the table control elements. -// - -SocialCalc.ComputeTableControlPositions = function(control) { - - var editor = control.editor; - - if (!editor.gridposition || !editor.headposition) throw("Can't compute table control positions before editor positions"); - - if (control.vertical) { - control.controlborder = editor.gridposition.left+editor.tablewidth; // border=left position - control.endcapstart = editor.gridposition.top; // start=top position - control.panesliderstart = editor.firstscrollingrowtop-control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingrowtop-1; - control.morebuttonstart = editor.gridposition.top+editor.tableheight-control.buttonthickness; - control.scrollareastart = editor.firstscrollingrowtop-1+control.buttonthickness; - control.scrollareaend = control.morebuttonstart-1; - control.scrollareasize = control.scrollareaend-control.scrollareastart+1; - } - else { - control.controlborder = editor.gridposition.top+editor.tableheight; // border=top position - control.endcapstart = editor.gridposition.left; // start=left position - control.panesliderstart = editor.firstscrollingcolleft-control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingcolleft-1; - control.morebuttonstart = editor.gridposition.left+editor.tablewidth-control.buttonthickness; - control.scrollareastart = editor.firstscrollingcolleft-1+control.buttonthickness; - control.scrollareaend = control.morebuttonstart-1; - control.scrollareasize = control.scrollareaend-control.scrollareastart+1; - } - } - -////// TCPS - TableControl Pan Slider methods - -// -// TCPSDragFunctionStart(event, draginfo, dobj) -// -// TableControlPaneSlider function for starting drag -// - -SocialCalc.TCPSDragFunctionStart = function(event, draginfo, dobj) { - - var editor = dobj.functionobj.control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - draginfo.trackingline = document.createElement("div"); - draginfo.trackingline.style.height = dobj.vertical ? scc.TCPStrackinglineThickness : - (editor.tableheight-(editor.headposition.top-editor.gridposition.top))+"px"; - draginfo.trackingline.style.width = dobj.vertical ? - (editor.tablewidth-(editor.headposition.left-editor.gridposition.left))+"px" : scc.TCPStrackinglineThickness; - draginfo.trackingline.style.backgroundImage="url("+editor.imageprefix+"trackingline-"+(dobj.vertical?"v":"h")+".gif)";; - if (scc.TCPStrackinglineClass) draginfo.trackingline.className = scc.TCPStrackinglineClass; - SocialCalc.setStyles(draginfo.trackingline, scc.TCPStrackinglineStyle); - - if (dobj.vertical) { - row = SocialCalc.Lookup(draginfo.clientY+dobj.functionobj.control.sliderthickness, editor.rowpositions); - draginfo.trackingline.style.top = (editor.rowpositions[row] || editor.headposition.top)+"px"; - draginfo.trackingline.style.left = editor.headposition.left+"px"; - if (editor.context.rowpanes.length-1) { // has 2 already - editor.context.SetRowPaneFirstLast(1, editor.context.rowpanes[0].last+1, editor.context.rowpanes[0].last+1); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } - else { - col = SocialCalc.Lookup(draginfo.clientX+dobj.functionobj.control.sliderthickness, editor.colpositions); - draginfo.trackingline.style.top = editor.headposition.top+"px"; - draginfo.trackingline.style.left = (editor.colpositions[col] || editor.headposition.left)+"px"; - if (editor.context.colpanes.length-1) { // has 2 already - editor.context.SetColPaneFirstLast(1, editor.context.colpanes[0].last+1, editor.context.colpanes[0].last+1); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } - - editor.griddiv.appendChild(draginfo.trackingline); - - } - -// -// TCPSDragFunctionMove(event, draginfo, dobj) -// - -SocialCalc.TCPSDragFunctionMove = function(event, draginfo, dobj) { - - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup(draginfo.clientY+sliderthickness, editor.rowpositions); - draginfo.trackingline.style.top = (editor.rowpositions[row] || editor.headposition.top)+"px"; - } - else { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup(draginfo.clientX+sliderthickness, editor.colpositions); - draginfo.trackingline.style.left = (editor.colpositions[col] || editor.headposition.left)+"px"; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - - } - -// -// TCPSDragFunctionStop(event, draginfo, dobj) -// - -SocialCalc.TCPSDragFunctionStop = function(event, draginfo, dobj) { - - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup(draginfo.clientY+sliderthickness, editor.rowpositions); - if (row>editor.context.sheetobj.attribs.lastrow) row=editor.context.sheetobj.attribs.lastrow; // can't extend sheet here - if (!row || row<=editor.context.rowpanes[0].first) { // set to no panes, leaving first pane settings - if (editor.context.rowpanes.length>1) editor.context.rowpanes.length = 1; - } - else if (editor.context.rowpanes.length-1) { // has 2 already - if (!editor.timeout) { // not waiting for position calc (so positions could be wrong) - editor.context.SetRowPaneFirstLast(0, editor.context.rowpanes[0].first, row-1); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } - else { - editor.context.SetRowPaneFirstLast(0, editor.context.rowpanes[0].first, row-1); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } - else { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup(draginfo.clientX+sliderthickness, editor.colpositions); - if (col>editor.context.sheetobj.attribs.lastcol) col=editor.context.sheetobj.attribs.lastcol; // can't extend sheet here - if (!col || col<=editor.context.colpanes[0].first) { // set to no panes, leaving first pane settings - if (editor.context.colpanes.length>1) editor.context.colpanes.length = 1; - } - else if (editor.context.colpanes.length-1) { // has 2 already - if (!editor.timeout) { // not waiting for position calc (so positions could be wrong) - editor.context.SetColPaneFirstLast(0, editor.context.colpanes[0].first, col-1); - editor.context.SetColPaneFirstLast(1, col, col); - } - } - else { - editor.context.SetColPaneFirstLast(0, editor.context.colpanes[0].first, col-1); - editor.context.SetColPaneFirstLast(1, col, col); - } - } - - editor.FitToEditTable(); - - editor.griddiv.removeChild(draginfo.trackingline); - - editor.ScheduleRender(); - - } - -////// TCT - TableControl Thumb methods - -//!!!! Note: Need to make start use same code as move/stop for determining row/col, since stop will set that -//!!!! Note: Need to make start/move/stop use positioning code that corresponds closer to -//!!!! ComputeTableControlPositions calculations. - -// -// TCTDragFunctionStart(event, draginfo, dobj) -// -// TableControlThumb function for starting drag -// - -SocialCalc.TCTDragFunctionStart = function(event, draginfo, dobj) { - - var rowpane, colpane, row, col; - - var control = dobj.functionobj.control; - var editor = control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - if (draginfo.thumbstatus) { // get rid of old one if mouseup was out of window - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - } - - draginfo.thumbstatus = document.createElement("div"); - - if (dobj.vertical) { - if (scc.TCTDFSthumbstatusvClass) draginfo.thumbstatus.className = scc.TCTDFSthumbstatusvClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatusvStyle); - draginfo.thumbstatus.style.top = (draginfo.clientY+scc.TCTDFStopOffsetv)+"px"; - draginfo.thumbstatus.style.left = (control.controlborder-10-(editor.tablewidth/2))+"px"; - draginfo.thumbstatus.style.width = (editor.tablewidth/2)+"px"; - - draginfo.thumbcontext = new SocialCalc.RenderContext(editor.context.sheetobj); - draginfo.thumbcontext.showGrid = true; - draginfo.thumbcontext.rowpanes = [{first: 1, last: 1}]; - var pane = editor.context.colpanes[editor.context.colpanes.length-1]; - draginfo.thumbcontext.colpanes = [{first: pane.first, last: pane.last}]; - draginfo.thumbstatus.innerHTML = '
    msg
    preview
    '; - draginfo.thumbstatus.rowmsgele = draginfo.thumbstatus.firstChild.firstChild.firstChild.firstChild.firstChild; - draginfo.thumbstatus.rowpreviewele = draginfo.thumbstatus.firstChild.firstChild.firstChild.childNodes[1].firstChild; - editor.toplevel.appendChild(draginfo.thumbstatus); - SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, editor.firstscrollingrow || 1); - } - else { - if (scc.TCTDFSthumbstatushClass) draginfo.thumbstatus.className = scc.TCTDFSthumbstatushClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatushStyle); - draginfo.thumbstatus.style.top = (control.controlborder+scc.TCTDFStopOffseth)+"px"; - draginfo.thumbstatus.style.left = (draginfo.clientX+scc.TCTDFSleftOffseth)+"px"; - editor.toplevel.appendChild(draginfo.thumbstatus); - draginfo.thumbstatus.innerHTML = scc.s_TCTDFthumbstatusPrefixh+SocialCalc.rcColname(editor.firstscrollingcol); - } - - } - - -// -// SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, row) -// -// Render partial row -// - -SocialCalc.TCTDragFunctionRowSetStatus = function(draginfo, editor, row) { - - var scc = SocialCalc.Constants; - var msg = scc.s_TCTDFthumbstatusPrefixv+row+" "; - - draginfo.thumbstatus.rowmsgele.innerHTML = msg; - - draginfo.thumbcontext.rowpanes = [{first: row, last: row}]; - draginfo.thumbrowshown = row; - - var ele = draginfo.thumbcontext.RenderSheet(draginfo.thumbstatus.rowpreviewele.firstChild, {type: "html"}); - - } - - -// -// TCTDragFunctionMove(event, draginfo, dobj) -// - -SocialCalc.TCTDragFunctionMove = function(event, draginfo, dobj) { - - var first, msg; - var control = dobj.functionobj.control; - var thumbthickness = control.thumbthickness; - var editor = control.editor; - var scc = SocialCalc.Constants; - - if (dobj.vertical) { - if (draginfo.clientY > control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2) - draginfo.clientY = control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2; - if (draginfo.clientY < control.scrollareastart - draginfo.offsetY - 1) - draginfo.clientY = control.scrollareastart - draginfo.offsetY - 1; - draginfo.thumbstatus.style.top = draginfo.clientY+"px"; - - first = - ((draginfo.clientY+draginfo.offsetY-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastrow-editor.lastnonscrollingrow) - + editor.lastnonscrollingrow + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) first = editor.context.sheetobj.attribs.lastrow; -// msg = scc.s_TCTDFthumbstatusPrefixv+first; - if (first != draginfo.thumbrowshown) { - SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, first); - } - } - else { - if (draginfo.clientX > control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2) - draginfo.clientX = control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2; - if (draginfo.clientX < control.scrollareastart - draginfo.offsetX - 1) - draginfo.clientX = control.scrollareastart - draginfo.offsetX - 1; - draginfo.thumbstatus.style.left = draginfo.clientX+"px"; - - first = - ((draginfo.clientX+draginfo.offsetX-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastcol-editor.lastnonscrollingcol) - + editor.lastnonscrollingcol + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) first = editor.context.sheetobj.attribs.lastcol; - msg = scc.s_TCTDFthumbstatusPrefixh+SocialCalc.rcColname(first); - draginfo.thumbstatus.innerHTML = msg; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - - } - -// -// TCTDragFunctionStop(event, draginfo, dobj) -// - -SocialCalc.TCTDragFunctionStop = function(event, draginfo, dobj) { - - var first; - var control = dobj.functionobj.control; - var editor = control.editor; - - if (dobj.vertical) { - first = - ((draginfo.clientY+draginfo.offsetY-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastrow-editor.lastnonscrollingrow) - + editor.lastnonscrollingrow + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) first = editor.context.sheetobj.attribs.lastrow; - - editor.context.SetRowPaneFirstLast(editor.context.rowpanes.length-1, first, first+1); - } - else { - first = - ((draginfo.clientX+draginfo.offsetX-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastcol-editor.lastnonscrollingcol) - + editor.lastnonscrollingcol + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) first = editor.context.sheetobj.attribs.lastcol; - - editor.context.SetColPaneFirstLast(editor.context.colpanes.length-1, first, first+1); - } - - editor.FitToEditTable(); - - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - - editor.ScheduleRender(); - - } - -// ************************************* -// -// Dragging functions: -// -// ************************************* - -SocialCalc.DragInfo = { - - // There is only one of these -- no "new" is done. - // Only one dragging operation can be active at a time. - // The registeredElements array is used to decide which item to drag. - - // One item for each draggable thing, each an object with: - // .element, .vertical, .horizontal, .functionobj - - registeredElements: [], - - // Items used during a drag - - draggingElement: null, // item being processed (.element is the actual element) - startX: 0, - startY: 0, - startZ: 0, - clientX: 0, // modifyable version to restrict movement - clientY: 0, - offsetX: 0, - offsetY: 0, - horizontalScroll: 0, // retrieved at drag start - verticalScroll: 0 - - } - -// -// DragRegister(element, vertical, horizontal, functionobj) - make element draggable -// -// The functionobj defaults to moving the element contrained only by vertical and horizontal settings. -// - -SocialCalc.DragRegister = function(element, vertical, horizontal, functionobj) { - - var draginfo = SocialCalc.DragInfo; - - if (!functionobj) { - functionobj = {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null}; - } - - draginfo.registeredElements.push( - {element: element, vertical: vertical, horizontal: horizontal, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.DragMouseDown, false); - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousedown", SocialCalc.DragMouseDown); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - } - -// -// DragUnregister(element) - remove object from list -// - -SocialCalc.DragUnregister = function(element) { - - var draginfo = SocialCalc.DragInfo; - - var i; - - if (!element) return; - - for (i=0; i tooltipinfo.viewport.width/2) { // on right side of screen - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY)+"px"; - tooltipinfo.popupElement.style.right = (tooltipinfo.viewport.width - tooltipinfo.clientX + offsetX)+"px"; - } - else { // on left side of screen - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY)+"px"; - tooltipinfo.popupElement.style.left = (tooltipinfo.clientX + offsetX)+"px"; - } - - if (tooltipinfo.clientY < 50) { // make sure fits on screen if nothing above grid - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY - 50)+"px"; - } - - document.body.appendChild(tooltipinfo.popupElement); - - } - -// -// TooltipHide() -// - -SocialCalc.TooltipHide = function() { - - var tooltipinfo = SocialCalc.TooltipInfo; - - if (tooltipinfo.popupElement) { - tooltipinfo.popupElement.parentNode.removeChild(tooltipinfo.popupElement); - tooltipinfo.popupElement = null; - } - - } - -// -// TooltipWaitDone() -// - -SocialCalc.TooltipWaitDone = function() { - - var tooltipinfo = SocialCalc.TooltipInfo; - - tooltipinfo.timer = null; - - SocialCalc.TooltipDisplay(tooltipinfo.tooltipElement); - - } - - -// ************************************* -// -// Button functions: -// -// ************************************* - -SocialCalc.ButtonInfo = { - - // There is only one of these -- no "new" is done. - // Only one button operation can be active at a time. - // The registeredElements array is used to identify items. - - // One item for each clickable element, each an object with: - // .element, .normalstyle, .hoverstyle, .downstyle, .repeatinterval, .functionobj - // - // .functionobj is an object with optional function objects for: - // mouseover, mouseout, mousedown, repeatinterval, mouseup, disabled - - registeredElements: [], - - // Items used during hover over an element, clicking, repeating, etc. - - buttonElement: null, // item being processed, hover or down (.element is the actual element) - doingHover: false, // true if mouse is over one of our elements - buttonDown: false, // true if button down and buttonElement not null - timer: null, // timer object for repeating - - // Used while processing an event - - horizontalScroll: 0, - verticalScroll: 0, - clientX: 0, - clientY: 0 - - } - -// -// ButtonRegister(element, paramobj, functionobj) - make element clickable -// -// The arguments (other than element) may be null (meaning no change for style and no repeat) -// The paramobj has the optional normalstyle, hoverstyle, downstyle, repeatwait, repeatinterval settings - -SocialCalc.ButtonRegister = function(element, paramobj, functionobj) { - - var buttoninfo = SocialCalc.ButtonInfo; - - if (!paramobj) paramobj = {}; - - buttoninfo.registeredElements.push( - {name: paramobj.name, element: element, normalstyle: paramobj.normalstyle, hoverstyle: paramobj.hoverstyle, downstyle: paramobj.downstyle, - repeatwait: paramobj.repeatwait, repeatinterval: paramobj.repeatinterval, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.ButtonMouseDown, false); - element.addEventListener("mouseover", SocialCalc.ButtonMouseOver, false); - element.addEventListener("mouseout", SocialCalc.ButtonMouseOut, false); - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousedown", SocialCalc.ButtonMouseDown); - element.attachEvent("onmouseover", SocialCalc.ButtonMouseOver); - element.attachEvent("onmouseout", SocialCalc.ButtonMouseOut); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - - } - -// -// ButtonMouseOver(event) -// - -SocialCalc.ButtonMouseOver = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (!bobj) return; - - if (buttoninfo.buttonDown) { - if (buttoninfo.buttonElement==bobj) { - buttoninfo.doingHover = true; // keep track whether we are on the pressed button or not - } - return; - } - - if (buttoninfo.buttonElement && - buttoninfo.buttonElement!=bobj && buttoninfo.doingHover) { // moved to a new one, undo hover there - SocialCalc.setStyles(buttoninfo.buttonElement.element, buttoninfo.buttonElement.normalstyle); - } - - buttoninfo.buttonElement = bobj; // remember this one is hovering - buttoninfo.doingHover = true; - - SocialCalc.setStyles(bobj.element, bobj.hoverstyle); // set style (if provided) - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOver) bobj.functionobj.MouseOver(e, buttoninfo, bobj); - - return; - - } - -// -// ButtonMouseOut(event) -// - -SocialCalc.ButtonMouseOut = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - if (buttoninfo.buttonDown) { - buttoninfo.doingHover = false; // keep track of overs and outs - return; - } - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (buttoninfo.doingHover) { // if there was a hover, undo it - if (buttoninfo.buttonElement) - SocialCalc.setStyles(buttoninfo.buttonElement.element, buttoninfo.buttonElement.normalstyle); - buttoninfo.buttonElement = null; - buttoninfo.doingHover = false; - } - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOut) bobj.functionobj.MouseOut(e, buttoninfo, bobj); - - return; - - } - -// -// ButtonMouseDown(event) -// - -SocialCalc.ButtonMouseDown = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var viewportinfo = SocialCalc.GetViewportInfo(); - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (!bobj) return; // not one of our elements - - if (bobj && bobj.functionobj && bobj.functionobj.Disabled) { - if (bobj.functionobj.Disabled(e, buttoninfo, bobj)) { - return; - } - } - - buttoninfo.buttonElement = bobj; - buttoninfo.buttonDown = true; - - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.downstyle); - - // Register event handler for mouse up - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mouseup", SocialCalc.ButtonMouseUp, true); // capture everywhere - } - else if (bobj.element.attachEvent) { // IE 5+ - bobj.element.setCapture(); - bobj.element.attachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.attachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - } - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - buttoninfo.horizontalScroll = viewportinfo.horizontalScroll; - buttoninfo.verticalScroll = viewportinfo.verticalScroll; - buttoninfo.clientX = e.clientX + buttoninfo.horizontalScroll; // get document-relative coordinates - buttoninfo.clientY = e.clientY + buttoninfo.verticalScroll; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseDown) bobj.functionobj.MouseDown(e, buttoninfo, bobj); - - if (bobj.repeatwait) { // if a repeat wait is set, then starting waiting for first repetition - buttoninfo.timer = window.setTimeout(SocialCalc.ButtonRepeat, bobj.repeatwait); - } - - return; - - } - -// -// ButtonMouseUp(event) -// - -SocialCalc.ButtonMouseUp = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (buttoninfo.timer) { // if repeating, cancel it - window.clearTimeout(buttoninfo.timer); // cancel timer - buttoninfo.timer = null; - } - - if (!buttoninfo.buttonDown) return; // already did this (e.g., in IE, releaseCapture fires losecapture) - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mouseup", SocialCalc.ButtonMouseUp, true); - } - else if (document.detachEvent) { // IE - bobj.element.detachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - bobj.element.detachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.releaseCapture(); - } - - if (buttoninfo.buttonElement.downstyle) { - if (buttoninfo.doingHover) - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.hoverstyle); - else - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.normalstyle); - } - - buttoninfo.buttonDown = false; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseUp) bobj.functionobj.MouseUp(e, buttoninfo, bobj); - - } - -// -// ButtonRepeat() -// - -SocialCalc.ButtonRepeat = function() { - - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (!bobj) return; - - if (bobj && bobj.functionobj && bobj.functionobj.Repeat) bobj.functionobj.Repeat(null, buttoninfo, bobj); - - buttoninfo.timer = window.setTimeout(SocialCalc.ButtonRepeat, bobj.repeatinterval || 100); - - } - -// ************************************* -// -// MouseWheel functions: -// -// ************************************* - -SocialCalc.MouseWheelInfo = { - - // There is only one of these -- no "new" is done. - // The mousewheel only affects the one area the mouse pointer is over - // The registeredElements array is used to identify items. - - // One item for each element to respond to the mousewheel, each an object with: - // .element, .functionobj - - registeredElements: [] - - } - -// -// MouseWheelRegister(element, functionobj) - make element respond to mousewheel -// - -SocialCalc.MouseWheelRegister = function(element, functionobj) { - - var mousewheelinfo = SocialCalc.MouseWheelInfo; - - mousewheelinfo.registeredElements.push( - {element: element, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("DOMMouseScroll", SocialCalc.ProcessMouseWheel, false); - element.addEventListener("mousewheel", SocialCalc.ProcessMouseWheel, false); // Opera needs this - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousewheel", SocialCalc.ProcessMouseWheel); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - - } - -SocialCalc.ProcessMouseWheel = function(e) { - - var event = e || window.event; - var delta; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - var mousewheelinfo = SocialCalc.MouseWheelInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var wobj; - - for (wobj=null; !wobj && ele; ele=ele.parentNode) { // go up tree looking for one of our elements - wobj = SocialCalc.LookupElement(ele, mousewheelinfo.registeredElements); - } - if (!wobj) return; // not one of our elements - - if (event.wheelDelta) { - delta = event.wheelDelta/120; - } - else delta = -event.detail/3; - if (!delta) delta = 0; - - if (wobj.functionobj && wobj.functionobj.WheelMove) wobj.functionobj.WheelMove(event, delta, mousewheelinfo, wobj); - - if (event.preventDefault) event.preventDefault(); - event.returnValue = false; - - } - -// ************************************* -// -// Keyboard functions: -// -// For more information about keyboard handling, see: http://unixpapa.com/js/key.html -// -// ************************************* - -SocialCalc.keyboardTables = { - - specialKeysCommon: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - specialKeysIE: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - controlKeysIE: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]" - }, - - specialKeysOpera: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", - 45: "[ins]", // issues with releases before 9.5 - same as "-" ("-" changed in 9.5) - 46: "[del]", // issues with releases before 9.5 - same as "." ("." changed in 9.5) - 113: "[f2]" - }, - - controlKeysOpera: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]" - }, - - specialKeysSafari: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 63232: "[aup]", 63233: "[adown]", - 63234: "[aleft]", 63235: "[aright]", 63272: "[del]", 63273: "[home]", 63275: "[end]", 63276: "[pgup]", - 63277: "[pgdn]", 63237: "[f2]" - }, - - controlKeysSafari: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]" - }, - - ignoreKeysSafari: { - 63236: "[f1]", 63238: "[f3]", 63239: "[f4]", 63240: "[f5]", 63241: "[f6]", 63242: "[f7]", - 63243: "[f8]", 63244: "[f9]", 63245: "[f10]", 63246: "[f11]", 63247: "[f12]", 63289: "[numlock]" - }, - - specialKeysFirefox: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - controlKeysFirefox: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]" - }, - - ignoreKeysFirefox: { - 16: "[shift]", 17: "[ctrl]", 18: "[alt]", 20: "[capslock]", 19: "[pause]", 44: "[printscreen]", - 91: "[windows]", 92: "[windows]", 112: "[f1]", 114: "[f3]", 115: "[f4]", 116: "[f5]", - 117: "[f6]", 118: "[f7]", 119: "[f8]", 120: "[f9]", 121: "[f10]", 122: "[f11]", 123: "[f12]", - 144: "[numlock]", 145: "[scrolllock]", 224: "[cmd]" - } - } - -SocialCalc.Keyboard = { - areListener: false, // if true, we have been installed as a listener for keyboard events - focusTable: null, // the table editor object that gets keystrokes or null - passThru: null, // if not null, control element with focus to pass keyboard events to (has blur method), or "true" - didProcessKey: false, // did SocialCalc.ProcessKey in keydown - statusFromProcessKey: false, // the status from the keydown SocialCalc.ProcessKey - repeatingKeyPress: false, // some browsers (Opera, Gecko Mac) repeat special keys as KeyPress not KeyDown - chForProcessKey: "" // remember so can do repeat in those cases - }; - -SocialCalc.KeyboardSetFocus = function(editor) { - - SocialCalc.Keyboard.focusTable = editor; - - if (!SocialCalc.Keyboard.areListener) { - document.onkeydown = SocialCalc.ProcessKeyDown; - document.onkeypress = SocialCalc.ProcessKeyPress; - SocialCalc.Keyboard.areListener = true; - } - if (SocialCalc.Keyboard.passThru) { - if (SocialCalc.Keyboard.passThru.blur) { - SocialCalc.Keyboard.passThru.blur(); - } - SocialCalc.Keyboard.passThru = null; - } - window.focus(); - } - -SocialCalc.KeyboardFocus = function() { - - SocialCalc.Keyboard.passThru = null; - window.focus(); - - } - -SocialCalc.ProcessKeyDown = function(e) { - - var kt = SocialCalc.keyboardTables; - kt.didProcessKey = false; // always start false - kt.statusFromProcessKey = false; - kt.repeatingKeyPress = false; - - var ch=""; - var status=true; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - // IE and Safari 3.1+ won't fire keyPress, so check for special keys here. - if (e.which==undefined || (typeof e.keyIdentifier == "string")) { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { - if (e.ctrlKey) { - ch=kt.controlKeysIE[e.keyCode]; - } - if (!ch) - return true; - } - status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - } - - else { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { -// return true; - if (e.ctrlKey || e.metaKey) { - ch=kt.controlKeysIE[e.keyCode]; // this works here - } - if (!ch) - return true; - } - - status = SocialCalc.ProcessKey(ch, e); // process the key - kt.didProcessKey = true; // remember what happened - kt.statusFromProcessKey = status; - kt.chForProcessKey = ch; - } - - return status; - - } - -SocialCalc.ProcessKeyPress = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - - e = e || window.event; - - if (SocialCalc.Keyboard.passThru) return; // ignore - if (kt.didProcessKey) { // already processed this key - if (kt.repeatingKeyPress) { - return SocialCalc.ProcessKey(kt.chForProcessKey, e); // process the same key as on KeyDown - } - else { - kt.repeatingKeyPress = true; // see if get another KeyPress before KeyDown - return kt.statusFromProcessKey; // do what it said to do - } - } - - if (e.which==undefined) { // IE - // Note: Esc and Enter will come through here, too, if not stopped at KeyDown - ch=String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) - } - - else { // not IE - if (!e.which) - return false; // ignore - special key - if (e.charCode==undefined) { // Opera - if (e.which!=0) { // character - if (e.which<32 || e.which==144) { // special char (144 is numlock) - ch = kt.specialKeysOpera[e.which]; - if (ch) { - return true; - } - } - else { - if (e.ctrlKey) { - ch=kt.controlKeysOpera[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - else { // special char - return true; - } - } - - else if (e.keyCode==0 && e.charCode==0) { // OLPC Fn key or something - return; // ignore - } - - else if (e.keyCode==e.charCode) { // Safari - ch = kt.specialKeysSafari[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysSafari[e.keyCode]) // pass this through - return true; - if (e.metaKey) { - ch=kt.controlKeysSafari[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - - else { // Firefox - if (kt.specialKeysFirefox[e.keyCode]) { - return true; - } - ch = String.fromCharCode(e.which); - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysFirefox[e.which]; - } - } - } - - var status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - - return status; - - } - -/* - * - * OLD ProcessKeyDown and ProcessKeyPress -- replaced for handling newer browsers, including Safari 3.1 and Opera 9.5 - * - -SocialCalc.ProcessKeyDown = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - var status=true; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - if (e.which==undefined) { // IE - ch = kt.specialKeysIE[e.keyCode]; - if (!ch) { - if (e.ctrlKey) { - ch=kt.controlKeysIE[e.keyCode]; - } - if (!ch) - return true; - } - - status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - } - - else { // don't do anything for other browsers - wait for keyPress - ; // special key repeats are done as keypress in those browsers - } - - return status; - - } - -SocialCalc.ProcessKeyPress = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - if (e.which==undefined) { // IE - // Note: Esc and Enter will come through here, too, if not stopped at KeyDown - ch=String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) - } - - else { // not IE - if (e.charCode==undefined) { // Opera - if (e.which!=0) { // character - if (e.which<32) { // special char - ch = kt.specialKeysOpera[e.keyCode]; - if (!ch) - return true; - } - else { - if (e.ctrlKey) { - ch=kt.controlKeysOpera[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - else { // special char - ch = kt.specialKeysOpera[e.keyCode]; - if (!ch) - return true; - } - } - - else if (e.keyCode==0 && e.charCode==0) { // OLPC Fn key or something - return; // ignore - } - - else if (e.keyCode==e.charCode) { // Safari - ch = kt.specialKeysSafari[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysSafari[e.keyCode]) // pass this through - return true; - if (e.metaKey) { - ch=kt.controlKeysSafari[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - - else { // Firefox - ch = kt.specialKeysFirefox[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysFirefox[e.keyCode]) // pass this through - return true; - if (e.which) { // normal char - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysFirefox[e.which]; - } - else { - ch = String.fromCharCode(e.which); - } - } - else { // usually a special char - return true; // old Firefox gives extra, empty keyPress for "/" - ignore - } - } - } - } - - var status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - - return status; - - } -*/ - -// -// status = SocialCalc.ProcessKey(ch, e) -// -// Take a key representation as a character string and dispatch to appropriate routine -// - -SocialCalc.ProcessKey = function (ch, e) { - - var ft = SocialCalc.Keyboard.focusTable; - - if (!ft) return true; // we're not handling it -- let browser do default - - return ft.EditorProcessKey(ch, e); - - } - - diff --git a/DeveloperAdoption/public/static/socialcalctouch.js b/DeveloperAdoption/public/static/socialcalctouch.js deleted file mode 100644 index 79cbe8a..0000000 --- a/DeveloperAdoption/public/static/socialcalctouch.js +++ /dev/null @@ -1,350 +0,0 @@ -// -// socialcalctouch adds touch gestures to SocialCalc -// -// As a start, touch gestures are modeled similar to -// mouse events -// -// Author: Ramu Ramamurthy -// -// -// - -// -// -// To initialize, SocialCalc.CreateTableEditor must call -// SocialCalc.TouchRegister(editor.toplevel, {Swipe: SocialCalc.EditorProcessSwipe, editor: editor}); -// Also, any element create inside the grid needs to be touch registered for it to work -// this includes buttons, etc -// -// TestCases: -// 1) tap to point to cell, and to move edit-cell -// 2) double-tap on a cell to open edit-box, then tap on edit box to pullup keyboard -// -- when editing, tap on any other cell to be done with edit -// *** figure out escape to cancel edit versus return to accept edit -// -- when editing, and if = seen than tapping on cell puts the cell name into the edit box -// 3) tap on input box on top opens edit on cell -// tap on any cell accepts and finishes this edit -// *** need a way to cancel the edit versus accept the edit -// -// 4) tap on a cell and move finger starts a range -// removing finger completes the range -// tap on cell cancels range -// -// 5) a swipe action scrolls the sheet -// swipe up/dn scrolls up/dn -// swipe lt/rt scrolls lt/rt -// -// -// Wishlist: -// 1) smooth scroll will be nice (in addition to swipe) -- using a two-touch pan ? -// - - -var SocialCalc; -if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; -} - -// ************************************* -// -// Touch functions: -// -// ************************************* - -SocialCalc.HasTouch = false; - -(function() { - // platform specific registration - var agent = navigator.userAgent.toLowerCase(); - - if(agent.indexOf('iphone') >= 0 || agent.indexOf('ipad') >= 0 || agent.indexOf('android') >= 0){ - SocialCalc.HasTouch = true; - } -})(); - - - -SocialCalc.TouchInfo = { - - // In sequence the following will be implemented - // swipe up/dn, left/right will scroll up/dn/left/right respectively - // - // touch on a cell will move ecell to that cell - // repeated touch on a cell will start edit on that cell - // touch on another cell will cancel edit if it was in progress (?) - // etc - // - // touch on buttons will activate the buttons - // - // The registeredElements array is used to identify items. - - // One item for each element to respond to the touch, each an object with: - // .element, .functionobj - - registeredElements: [], - - // for swipe - threshold_x : 20, - threshold_y : 20, - - orig_coord_x : 0, - orig_coord_y : 0, - final_coord_x : 0, - final_coord_y : 0, - - px_to_rows : 20, // 20 pixels is 1 row scroll - px_to_cols : 20, // 20 pixels is 1 col scroll - - touch_start : 0, - ranging : false, - ranging_threshold : 100, - move_start: 0, - - last_touch : 0, - timeout_handle : null, - doubletap_threshold: 500 // max milliseconds between taps - -}; - - -// -// TouchRegister(element, functionobj) - make element respond to touch -// - -SocialCalc.TouchRegister = function(element, functionobj) { - - - if (!SocialCalc.HasTouch) { - return; - } - - var touchinfo = SocialCalc.TouchInfo; - - if (SocialCalc.LookupElement(element, touchinfo.registeredElements)) { - // already registered - return; - } - - - touchinfo.registeredElements.push({ - element: element, - functionobj: functionobj - } - ); - - if (SocialCalc.HasTouch && element.addEventListener) { // Webkit based (?) - element.addEventListener("touchstart", SocialCalc.ProcessTouchStart, false); - element.addEventListener("touchmove", SocialCalc.ProcessTouchMove, false); - element.addEventListener("touchend", SocialCalc.ProcessTouchEnd, false); - element.addEventListener("touchcancel", SocialCalc.ProcessTouchCancel, false); - //element.addEventListener("onorientationchange", SocialCalc.ProcessOrientationChange, false); - } -}; - -SocialCalc.FindTouchElement = function(event) { - - var touchinfo = SocialCalc.TouchInfo; - - var event = event || window.event; - - var ele = event.target || event.srcElement; // investigate - - for (wobj=null; !wobj && ele; ele=ele.parentNode) { // investigate - wobj = SocialCalc.LookupElement(ele, touchinfo.registeredElements); - } - - return wobj; - -} - -SocialCalc.ProcessTouchStart = function(event) { - - var touchinfo = SocialCalc.TouchInfo; - touchinfo.orig_coord_x = event.targetTouches[0].pageX; - touchinfo.orig_coord_y = event.targetTouches[0].pageY; - - touchinfo.final_coord_x = touchinfo.orig_coord_x; - touchinfo.final_coord_y = touchinfo.orig_coord_y; - - touchinfo.touch_start = new Date().getTime() - - event.preventDefault(); -}; - -SocialCalc.TouchGetSimulatedMouseEvent = function(event, mouse_evt_name) { - var touches = event.changedTouches; - var first = touches[0]; - var simulatedEvent = document.createEvent("MouseEvent"); - simulatedEvent.initMouseEvent(mouse_evt_name, true, true, window, 1, - first.screenX, first.screenY, - first.clientX, first.clientY, false, - false, false, false, 0, null); - return simulatedEvent; -} - -SocialCalc.ProcessTouchMove = function(event) { - - - var touchinfo = SocialCalc.TouchInfo; - touchinfo.final_coord_x = event.targetTouches[0].pageX; - touchinfo.final_coord_y = event.targetTouches[0].pageY; - - - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) return; // not one of our elements - - if (touchinfo.move_start == 0) { - touchinfo.move_start = new Date().getTime(); - if (touchinfo.move_start - touchinfo.touch_start > touchinfo.ranging_threshold) { - // This is a delayed move - // send a mouse down event - // This is for ranging and dragging - - touchinfo.ranging = true; - var mouseDn = SocialCalc.TouchGetSimulatedMouseEvent(event, "mousedown"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDn); - } - } else if (touchinfo.ranging) { - // already ranging - // send a mouse move event - - var mouseMv = SocialCalc.TouchGetSimulatedMouseEvent(event, "mousemove"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseMv); - } - - event.preventDefault(); -}; - -SocialCalc.ProcessTouchEnd = function(e) { - - var touchinfo = SocialCalc.TouchInfo; - - var changeX = touchinfo.orig_coord_x - touchinfo.final_coord_x; - var changeY = touchinfo.orig_coord_y - touchinfo.final_coord_y; - - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) return; // not one of our elements - - var event = e || window.event; - - touchinfo.move_start = 0; - touchinfo.touch_start = 0; - - if (touchinfo.ranging) { - // in ranging, and dragging - // send a mouseup event - touchinfo.ranging = false; - var mouseUp = SocialCalc.TouchGetSimulatedMouseEvent(event, "mouseup"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseUp); - - } else if ( (Math.abs(changeY) > touchinfo.threshold_y) || - (Math.abs(changeX) > touchinfo.threshold_x) ) { - - // check for swipe - - var amount_y = Math.floor(changeY / touchinfo.px_to_rows); - var amount_x = Math.floor(changeX / touchinfo.px_to_cols); - if (wobj.functionobj && wobj.functionobj.Swipe) { - wobj.functionobj.Swipe(event, touchinfo, wobj, amount_y, amount_x); - } - - } else { - - // detect a double tap - var now = new Date().getTime() - var lasttouch = touchinfo.last_touch || now + 1 - var delta = now - lasttouch; - if (touchinfo.timeout_handle) { - clearTimeout(touchinfo.timeout_handle); - touchinfo.timeout_handle = null; - } - - if ((delta < touchinfo.doubletap_threshold) && (delta > 0)) { - // doubletap seen - if (wobj.functionobj && wobj.functionobj.DoubleTap) { - wobj.functionobj.DoubleTap(event, touchinfo, wobj); - } - } else { - // this is a single tap - touchinfo.last_touch = now; - var timeoutFn = function() { - if (wobj.functionobj && wobj.functionobj.SingleTap) { - wobj.functionobj.SingleTap(event, touchinfo, wobj); - } - }; - touchinfo.timeout_handle = setTimeout(timeoutFn(), touchinfo.doubletap_threshold); - } - touchinfo.last_touch = now; - } - e.preventDefault(); -}; - -SocialCalc.ProcessTouchCancel = function(event) { - - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) { - return; // do default behavior - } - - var touchinfo = SocialCalc.TouchInfo; - touchinfo.orig_coord_x = 0; - touchinfo.orig_coord_y = 0; - touchinfo.final_coord_x = 0; - touchinfo.final_coord_y = 0; - touchinfo.move_start = 0; - touchinfo.touch_start = 0; - touchinfo.ranging = false; -}; - -SocialCalc.EditorProcessSwipe = function(event, touchinfo, wobj, swipevert, swipehoriz) { - - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - - if ((swipevert != 0) || (swipehoriz != 0) ) { - - wobj.functionobj.editor.ScrollRelativeBoth(swipevert,swipehoriz); - - } - -}; - - -SocialCalc.EditorProcessSingleTap = function(event, touchinfo, wobj) { - - - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - - // send mouse down - var mouseDn = SocialCalc.TouchGetSimulatedMouseEvent(event, "mousedown"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDn); - - // then send mouse up - var mouseUp = SocialCalc.TouchGetSimulatedMouseEvent(event, "mouseup"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseUp); - -}; - - -SocialCalc.EditorProcessDoubleTap = function(event, touchinfo, wobj) { - - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - // simulate a mouse double click - var mouseDblClick = SocialCalc.TouchGetSimulatedMouseEvent(event, "dblclick"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDblClick); - -}; - - -SocialCalc.ProcessOrientationChange = function(event) { - alert(window.orientation); -}; diff --git a/DeveloperAdoption/public/static/socialcalcviewer.js b/DeveloperAdoption/public/static/socialcalcviewer.js deleted file mode 100644 index 7abcf8b..0000000 --- a/DeveloperAdoption/public/static/socialcalcviewer.js +++ /dev/null @@ -1,687 +0,0 @@ -// -// SocialCalcViewer -// -/* -// The code module of the SocialCalc package that lets you embed a spreadsheet viewer -// with an optional simple toolbar into a web page. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript SpreadsheetViewer. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the SpreadsheetViewer is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/ - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); - } - -// ************************************* -// -// SpreadsheetViewer class: -// -// ************************************* - -// Global constants: - - SocialCalc.CurrentSpreadsheetViewerObject = null; // right now there can only be one active at a time - - -// Constructor: - -SocialCalc.SpreadsheetViewer = function() { - - var scc = SocialCalc.Constants; - - // Properties: - - this.parentNode = null; - this.spreadsheetDiv = null; - this.requestedHeight = 0; - this.requestedWidth = 0; - this.requestedSpaceBelow = 0; - this.height = 0; - this.width = 0; - this.viewheight = 0; // calculated amount for views below toolbar, etc. - - // Dynamic properties: - - this.sheet = null; - this.context = null; - this.editor = null; - - this.spreadsheetDiv = null; - this.editorDiv = null; - - this.sortrange = ""; // remembered range for sort tab - - // Constants: - - this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-" - this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src - - this.statuslineheight = scc.SVStatuslineheight; // in pixels - this.statuslineCSS = scc.SVStatuslineCSS; - - // Callbacks: - - // Initialization Code: - - this.sheet = new SocialCalc.Sheet(); - this.context = new SocialCalc.RenderContext(this.sheet); - this.context.showGrid=true; - this.context.showRCHeaders=true; - this.editor = new SocialCalc.TableEditor(this.context); - this.editor.noEdit = true; - this.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetViewerStatuslineCallback, - params: {}}; - this.hasStatusLine = true; // default -// this.statuslineHTML = '
    {status}Will be link
    '; - this.statuslineHTML = '
    {status} 
    '; - this.statuslineFull = true; - this.noRecalc = true; // don't do a recalc when loaded, so no need for external sheet routines - - // Repeating macro info - - this.repeatingMacroTimer = null; - this.repeatingMacroInterval = 60; // default to 60 seconds - this.repeatingMacroCommands = ""; // what to execute - - - SocialCalc.CurrentSpreadsheetViewerObject = this; // remember this for rendezvousing on events - - return; - - } - -// Methods: - -SocialCalc.SpreadsheetViewer.prototype.InitializeSpreadsheetViewer = - function(node, height, width, spacebelow) {return SocialCalc.InitializeSpreadsheetViewer(this, node, height, width, spacebelow);}; -SocialCalc.SpreadsheetViewer.prototype.LoadSave = function(str) {return SocialCalc.SpreadsheetViewerLoadSave(this, str);}; -SocialCalc.SpreadsheetViewer.prototype.DoOnResize = function() {return SocialCalc.DoOnResize(this);}; -SocialCalc.SpreadsheetViewer.prototype.SizeSSDiv = function() {return SocialCalc.SizeSSDiv(this);}; -SocialCalc.SpreadsheetViewer.prototype.DecodeSpreadsheetSave = - function(str) {return SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave(this, str);}; - -// Sheet Methods to make things a little easier: - -SocialCalc.SpreadsheetViewer.prototype.ParseSheetSave = function(str) {return this.sheet.ParseSheetSave(str);}; - - -// Functions: - -// -// InitializeSpreadsheetViewer(spreadsheet, node, height, width, spacebelow) -// -// Creates the control elements and makes them the child of node (string or element). -// If present, height and width specify size. -// If either is 0 or null (missing), the maximum that fits on the screen -// (taking spacebelow into account) is used. -// -// You should do a redisplay or recalc (which redisplays) after running this. -// - -SocialCalc.InitializeSpreadsheetViewer = function(spreadsheet, node, height, width, spacebelow) { - - var scc = SocialCalc.Constants; - var SCLoc = SocialCalc.LocalizeString; - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var html, child, i, vname, v, style, button, bele; - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - spreadsheet.requestedHeight = height; - spreadsheet.requestedWidth = width; - spreadsheet.requestedSpaceBelow = spacebelow; - - if (typeof node == "string") node = document.getElementById(node); - - if (node == null) { - alert("SocialCalc.SpreadsheetControl not given parent node."); - } - - spreadsheet.parentNode = node; - - // create node to hold spreadsheet view - - spreadsheet.spreadsheetDiv = document.createElement("div"); - - spreadsheet.SizeSSDiv(); // calculate and fill in the size values - - for (child=node.firstChild; child!=null; child=node.firstChild) { - node.removeChild(child); - } - - node.appendChild(spreadsheet.spreadsheetDiv); - - // create sheet div - - spreadsheet.nonviewheight = spreadsheet.hasStatusLine ? spreadsheet.statuslineheight : 0; - spreadsheet.viewheight = spreadsheet.height-spreadsheet.nonviewheight; - spreadsheet.editorDiv=spreadsheet.editor.CreateTableEditor(spreadsheet.width, spreadsheet.viewheight); - - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.editorDiv); - - // create statusline - - if (spreadsheet.hasStatusLine) { - spreadsheet.statuslineDiv = document.createElement("div"); - spreadsheet.statuslineDiv.style.cssText = spreadsheet.statuslineCSS; - spreadsheet.statuslineDiv.style.height = spreadsheet.statuslineheight - - (spreadsheet.statuslineDiv.style.paddingTop.slice(0,-2)-0) - - (spreadsheet.statuslineDiv.style.paddingBottom.slice(0,-2)-0) + "px"; - spreadsheet.statuslineDiv.id = spreadsheet.idPrefix+"statusline"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.statuslineDiv); - spreadsheet.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetViewerStatuslineCallback, - params: {spreadsheetobj:spreadsheet}}; - } - - // done - refresh screen needed - - return; - - } - -SocialCalc.SpreadsheetViewerLoadSave = function(spreadsheet, savestr) { - - var rmstr, pos, t, t2; - - var parts = spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - spreadsheet.sheet.ResetSheet(); - spreadsheet.sheet.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) { // executed now - spreadsheet.editor.EditorScheduleSheetCommands(savestr.substring(parts.startupmacro.start, parts.startupmacro.end), false, true); - } - if (parts.repeatingmacro) { // first line tells how many seconds before first execution. Last cmd must be "cmdextension repeatmacro delay" to continue repeating. - rmstr = savestr.substring(parts.repeatingmacro.start, parts.repeatingmacro.end); - rmstr = rmstr.replace("\r", ""); // make sure no CR, only LF - pos = rmstr.indexOf("\n"); - if (pos > 0) { - t = rmstr.substring(0, pos)-0; // get number - t2 = t; -// if (!(t > 0)) t = 60; // handles NAN, too - spreadsheet.repeatingMacroInterval = t; - spreadsheet.repeatingMacroCommands = rmstr.substring(pos+1); - if (t2 > 0) { // zero means don't start yet - spreadsheet.repeatingMacroTimer = window.setTimeout(SocialCalc.SpreadsheetViewerDoRepeatingMacro, spreadsheet.repeatingMacroInterval * 1000); - } - } - } - } - if (spreadsheet.editor.context.sheetobj.attribs.recalc=="off" || spreadsheet.noRecalc) { - spreadsheet.editor.ScheduleRender(); - } - else { - spreadsheet.editor.EditorScheduleSheetCommands("recalc"); - } - } - -// -// SocialCalc.SpreadsheetViewerDoRepeatingMacro -// -// Called by a timer. Executes repeatingMacroCommands once. -// Use the "startcmdextension repeatmacro delay" command last to schedule this again. -// - -SocialCalc.SpreadsheetViewerDoRepeatingMacro = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - var editor = spreadsheet.editor; - - spreadsheet.repeatingMacroTimer = null; - - SocialCalc.SheetCommandInfo.CmdExtensionCallbacks.repeatmacro = {func:SocialCalc.SpreadsheetViewerRepeatMacroCommand, data:null}; - - editor.EditorScheduleSheetCommands(spreadsheet.repeatingMacroCommands); - -} - -SocialCalc.SpreadsheetViewerRepeatMacroCommand = function(name, data, sheet, cmd, saveundo) { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - - var rest = cmd.RestOfString(); - var t = rest-0; // get number - if (!(t > 0)) t = spreadsheet.repeatingMacroInterval; // handles NAN, too, using last value - spreadsheet.repeatingMacroInterval = t; - - spreadsheet.repeatingMacroTimer = window.setTimeout(SocialCalc.SpreadsheetViewerDoRepeatingMacro, spreadsheet.repeatingMacroInterval * 1000); - -} - -SocialCalc.SpreadsheetViewerStopRepeatingMacro = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - - if (spreadsheet.repeatingMacroTimer) { - window.clearTimeout(spreadsheet.repeatingMacroTimer); - spreadsheet.repeatingMacroTimer = null; - } -} - -// -// SocialCalc.SpreadsheetViewerDoButtonCmd(e, buttoninfo, bobj) -// -// xxx -// - -SocialCalc.SpreadsheetViewerDoButtonCmd = function(e, buttoninfo, bobj) { - - var obj = bobj.element; - var which = bobj.functionobj.command; - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - var editor = spreadsheet.editor; - - switch (which) { - case "recalc": - editor.EditorScheduleSheetCommands("recalc"); - break; - - default: - break; - } - - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - - } - - -// -// outstr = SocialCalc.LocalizeString(str) -// -// SocialCalc function to make localization easier. -// If str is "Text to localize", it returns -// SocialCalc.Constants.s_loc_text_to_localize if -// it exists, or else with just "Text to localize". -// Note that spaces are replaced with "_" and other special -// chars with "X" in the name of the constant (e.g., "A & B" -// would look for SocialCalc.Constants.s_loc_a_X_b. -// - -SocialCalc.LocalizeString = function(str) { - var cstr = SocialCalc.LocalizeStringList[str]; // found already this session? - if (!cstr) { // no - look up - cstr = SocialCalc.Constants["s_loc_"+str.toLowerCase().replace(/\s/g, "_").replace(/\W/g, "X")] || str; - SocialCalc.LocalizeStringList[str] = cstr; - } - return cstr; - } - -SocialCalc.LocalizeStringList = {}; // a list of strings to localize accumulated by the routine - -// -// outstr = SocialCalc.LocalizeSubstrings(str) -// -// SocialCalc function to make localization easier using %loc and %scc. -// -// Replaces sections of str with: -// %loc!Text to localize! -// with SocialCalc.Constants.s_loc_text_to_localize if -// it exists, or else with just "Text to localize". -// Note that spaces are replaced with "_" and other special -// chars with "X" in the name of the constant (e.g., %loc!A & B! -// would look for SocialCalc.Constants.s_loc_a_X_b. -// Uses SocialCalc.LocalizeString for this. -// -// Replaces sections of str with: -// %ssc!constant-name! -// with SocialCalc.Constants.constant-name. -// If the constant doesn't exist, throws and alert. -// - -SocialCalc.LocalizeSubstrings = function(str) { - - var SCLoc = SocialCalc.LocalizeString; - - return str.replace(/%(loc|ssc)!(.*?)!/g, function(a, t, c) { - if (t=="ssc") { - return SocialCalc.Constants[c] || alert("Missing constant: "+c); - } - else { - return SCLoc(c); - } - }); - - } - -// -// obj = GetSpreadsheetViewerObject() -// -// Returns the current spreadsheet view object -// - -SocialCalc.GetSpreadsheetViewerObject = function() { - - var csvo = SocialCalc.CurrentSpreadsheetViewerObject; - if (csvo) return csvo; - - throw ("No current SpreadsheetViewer object."); - - } - - -// -// SocialCalc.DoOnResize(spreadsheet) -// -// Processes an onResize event, setting the different views. -// - -SocialCalc.DoOnResize = function(spreadsheet) { - - var v; - var views = spreadsheet.views; - - var needresize = spreadsheet.SizeSSDiv(); - if (!needresize) return; - - for (vname in views) { - v = views[vname].element; - v.style.width = spreadsheet.width + "px"; - v.style.height = (spreadsheet.height-spreadsheet.nonviewheight) + "px"; - } - - spreadsheet.editor.ResizeTableEditor(spreadsheet.width, spreadsheet.height-spreadsheet.nonviewheight); - - } - - -// -// resized = SocialCalc.SizeSSDiv(spreadsheet) -// -// Figures out a reasonable size for the spreadsheet, given any requested values and viewport. -// Sets ssdiv to that. -// Return true if different than existing values. -// - -SocialCalc.SizeSSDiv = function(spreadsheet) { - - var sizes, pos, resized, nodestyle, newval; - var fudgefactorX = 10; // for IE - var fudgefactorY = 10; - - resized = false; - - sizes = SocialCalc.GetViewportInfo(); - pos = SocialCalc.GetElementPosition(spreadsheet.parentNode); - pos.bottom = 0; - pos.right = 0; - - nodestyle = spreadsheet.parentNode.style; - - if (nodestyle.marginTop) { - pos.top += nodestyle.marginTop.slice(0,-2)-0; - } - if (nodestyle.marginBottom) { - pos.bottom += nodestyle.marginBottom.slice(0,-2)-0; - } - if (nodestyle.marginLeft) { - pos.left += nodestyle.marginLeft.slice(0,-2)-0; - } - if (nodestyle.marginRight) { - pos.right += nodestyle.marginRight.slice(0,-2)-0; - } - - newval = spreadsheet.requestedHeight || - sizes.height - (pos.top + pos.bottom + fudgefactorY) - - (spreadsheet.requestedSpaceBelow || 0); - if (spreadsheet.height != newval) { - spreadsheet.height = newval; - spreadsheet.spreadsheetDiv.style.height = newval + "px"; - resized = true; - } - newval = spreadsheet.requestedWidth || - sizes.width - (pos.left + pos.right + fudgefactorX) || 700; - if (spreadsheet.width != newval) { - spreadsheet.width = newval; - spreadsheet.spreadsheetDiv.style.width = newval + "px"; - resized = true; - } - - return resized; - - } - - -// -// SocialCalc.SpreadsheetViewerStatuslineCallback -// - -SocialCalc.SpreadsheetViewerStatuslineCallback = function(editor, status, arg, params) { - - var spreadsheet = params.spreadsheetobj; - var slstr = ""; - - if (spreadsheet && spreadsheet.statuslineDiv) { - if (spreadsheet.statuslineFull) { - slstr = editor.GetStatuslineString(status, arg, params); - } - else { - slstr = editor.ecell.coord; - } - slstr = spreadsheet.statuslineHTML.replace(/\{status\}/, slstr); - spreadsheet.statuslineDiv.innerHTML = slstr; - } - - switch (status) { - case "cmdendnorender": - case "calcfinished": - case "doneposcalc": - break; // not updating Recalc button since no toolbar - - default: - break; - } - - } - - -// -// SocialCalc.CmdGotFocus(obj) -// -// Sets SocialCalc.Keyboard.passThru: obj should be element with focus or "true" -// - -SocialCalc.CmdGotFocus = function(obj) { - - SocialCalc.Keyboard.passThru = obj; - - } - - -// -// result = SocialCalc.SpreadsheetViewerCreateSheetHTML(spreadsheet) -// -// Returns the HTML representation of the whole spreadsheet -// - -SocialCalc.SpreadsheetViewerCreateSheetHTML = function(spreadsheet) { - - var context, div, ele; - - var result = ""; - - context = new SocialCalc.RenderContext(spreadsheet.sheet); - div = document.createElement("div"); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - result = div.innerHTML; - delete ele; - delete div; - return result; - - } - - -/////////////////////// -// -// LOAD ROUTINE -// -/////////////////////// - -// -// parts = SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave(spreadsheet, str) -// -// Separates the parts from a spreadsheet save string, returning an object with the sub-strings. -// -// {type1: {start: startpos, end: endpos}, type2:...} -// - -SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave = function(spreadsheet, str) { - - var pos1, mpregex, searchinfo, boundary, boundaryregex, blanklineregex, start, ending, lines, i, lines, p, pnun; - var parts = {}; - var partlist = []; - -var hasreturnonly = /[^\n]\r[^\n]/; -if (hasreturnonly.test(str)) { -str = str.replace(/([^\n])\r([^\n])/g, "$1\r\n$2"); -} - pos1 = str.search(/^MIME-Version:\s1\.0/mi); - if (pos1 < 0) return parts; - - mpregex = /^Content-Type:\s*multipart\/mixed;\s*boundary=(\S+)/mig; - mpregex.lastIndex = pos1; - - searchinfo = mpregex.exec(str); - if (mpregex.lastIndex <= 0) return parts; - boundary = searchinfo[1]; - - boundaryregex = new RegExp("^--"+boundary+"(?:\r\n|\n)", "mg"); - boundaryregex.lastIndex = mpregex.lastIndex; - - searchinfo = boundaryregex.exec(str); // find header top boundary - blanklineregex = /(?:\r\n|\n)(?:\r\n|\n)/gm; - blanklineregex.lastIndex = boundaryregex.lastIndex; - searchinfo = blanklineregex.exec(str); // skip to after blank line - if (!searchinfo) return parts; - start = blanklineregex.lastIndex; - boundaryregex.lastIndex = start; - searchinfo = boundaryregex.exec(str); // find end of header - if (!searchinfo) return parts; - ending = searchinfo.index; - - lines = str.substring(start, ending).split(/\r\n|\n/); // get header as lines - for (i=0;i'+ -//'
    '+ -//''+ -//''+ -//''+ - -// ''+ -// ''+ -// ''+ - -//''+ -//''+ -//'
    '+ -//''; - - SocialCalc.CurrentWorkbookControlObject = this; - this.sheetbar = new SocialCalc.SheetBar(); -} - -// methods -SocialCalc.WorkBookControl.prototype.GetCurrentWorkBookControl = function() {return SocialCalc.GetCurrentWorkBookControl();}; -SocialCalc.WorkBookControl.prototype.InitializeWorkBookControl = function() {return SocialCalc.InitializeWorkBookControl(this);}; - - -SocialCalc.WorkBookControl.prototype.ExecuteWorkBookControlCommand = function(cmd, isremote) { - return SocialCalc.ExecuteWorkBookControlCommand(this, cmd, isremote); -} - -SocialCalc.ExecuteWorkBookControlCommand = function(control, cmd, isremote) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - //if (!isremote) { - // return; - //} - - if (cmd.cmdtype == "scmd") { - // dispatch a sheet command - control.workbook.WorkbookScheduleCommand(cmd, isremote); - return; - - } - - if (cmd.cmdtype != "wcmd") { - return; - } - - var parseobj = new SocialCalc.Parse(cmd.cmdstr); - - var cmd1 = parseobj.NextToken(); - - switch (cmd1) { - case "addsheet": - SocialCalc.WorkBookControlAddSheetRemote(null); - break; - - case "addsheetstr": - var sheetstr = cmd.sheetstr; - SocialCalc.WorkBookControlAddSheetRemote(sheetstr); - break; - - case "delsheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlDelSheetRemote(sheetid); - break; - - case "rensheet": - var sheetid = parseobj.NextToken(); - var oldname = parseobj.NextToken(); - var newname = parseobj.NextToken(); - SocialCalc.WorkBookControlRenameSheetRemote(sheetid, oldname, newname); - break; - - case "activatesheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlActivateSheet(sheetid); - break; - - case "hidesheet": - var sheetid = parseobj.NextToken(); - - break; - - case "unhidesheet": - var sheetid = parseobj.NextToken(); - - break; - } -} - -SocialCalc.GetCurrentWorkBookControl = function() { - return SocialCalc.CurrentWorkbookControlObject; -} - -SocialCalc.InitializeWorkBookControl = function(control) { - var element = document.createElement("div"); - element.innerHTML = control.sheetshtml; - var foo = document.getElementById(control.div); - foo.appendChild(element); - //var element2 = document.createElement("div"); - //element2.innerHTML = control.buttonshtml; - //foo.appendChild(element2); - SocialCalc.WorkBookControlAddSheet(false); // this is for the default sheet -} - -SocialCalc.WorkBookControlDelSheetRemote = function(sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (sheetid == control.currentSheetButton.id) { - // the active sheet is being deleted - SocialCalc.WorkBookControlDelSheet(); - return; - } - // some non active sheet is being deleted - var foo = document.getElementById("fooBar"); - var deletedbutton = document.getElementById(sheetid); - - var did = deletedbutton.id; - var dname = deletedbutton.value; - delete control.sheetButtonArr[did]; - - foo.removeChild(deletedbutton); - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+did); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - // delete the sheet - control.workbook.DeleteWorkBookSheet(did, dname); - control.numSheets = control.numSheets-1; - -} - -// assumes that the current active sheet is being deleted -SocialCalc.WorkBookControlDelSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } -if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='To delete the selected sheet, you must first insert a new sheet.
    '; -str +='
    '+ - '
    '; - var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the deletion of the sheet - // the popup has two buttons : Confirm and Cancel -var element = document.getElementById(control.deleteDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+ 'The selected sheet will be permanently deleted.'+ '
    '; -str +='
      '; - str +='
    • To delete the selected sheet, click OK.
    • '; - str +='
    • To cancel the deletion, click cancel.
    • '; -str+='
    '; -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.WorkBookControlDeleteSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.deleteDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlDeleteSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlDeleteSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.currentSheetButton = null; - // delete the sheets - control.workbook.DeleteWorkBookSheet(name, curname); - control.numSheets = control.numSheets-1; - - var cmdstr = "delsheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true) - break; - } - } - if (control.currentSheetButton != null) { - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } -} - -// assumes that the current active sheet is being hidden -SocialCalc.WorkBookControlHideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='Before hiding the selected sheet, you must first insert a new sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the hiding of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.hideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The selected sheet will be hidden.'+ '
    '; - str +='
      '; - str +='
    • To hide the selected sheet, click OK.
    • '; - str +='
    • To cancel the hiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - -SocialCalc.WorkBookControlHideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.hideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlHideSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlHideSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, false); - sheetbarbutton.style.display="none"; - control.currentSheetButton = null; - // delete the sheets - - control.numSheets = control.numSheets-1; - - var cmdstr = "hidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - -// displays all hidden sheets, and then unhides whatever is selected -SocialCalc.WorkBookControlUnhideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - - var unhiddencount = 0; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - unhiddencount++; - } - } - - if(unhiddencount==0) { //no hidden sheets, error message here - var str = '
    '+ - ''+' There are no hidden worksheets. ' + '

    '; - str +='Before unhiding any sheets, you must first hide a sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - var element = document.getElementById(control.unhideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The following sheets are hidden.'+ '
      ' + - ''; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - str += '' + control.sheetButtonArr[sheet].value +'
      '; - } - } - - str +='
    \n
      '; - str +='
    • To unhide the selected sheet, click OK.
    • '; - str +='
    • To cancel the unhiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - - - -SocialCalc.WorkBookControlUnhideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.unhideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} - - -SocialCalc.WorkBookControlUnhideSheetSubmit = function(name) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlUnhideSheetHide(); - var current = document.getElementById(control.currentSheetButton.id); - - var curid = current.id; - var curname = control.currentSheetButton.value; - - control.currentSheetButton.setAttribute("style",""); - var old = control.currentSheetButton.id; - console.log(old); - SocialCalc.SheetBarButtonActivate(old, false); - - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unhide the button - sheetbarbutton.style.display = "inline"; - control.currentSheetButton = null; - - control.numSheets = control.numSheets+1; - - var cmdstr = "unhidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - - - -SocialCalc.WorkBookControlAddSheetButton = function(sheetname, sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - //Create an input type dynamically. - var element = document.createElement("input"); - - var name = null; - - if (sheetid != null) { - name = sheetid - } else { - name = "sheet"+ (control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt + 1; - } - - //Assign different attributes to the element. - element.setAttribute("type", "button"); - if (sheetname == null) { - element.setAttribute("value", name); - } else { - element.setAttribute("value", sheetname); - } - element.setAttribute("id", name); - element.setAttribute("name", name); - - var fnname = "SocialCalc.WorkBookControlActivateSheet("+"'"+name+"'"+")"; - - element.setAttribute("onclick",fnname); - - control.sheetButtonArr[name] = element; - - - var foo = document.getElementById("fooBar"); - - //Append the element in page (in span). - foo.appendChild(element); - - control.numSheets = control.numSheets + 1; - - var el = new SocialCalc.SheetBarSheetButton("sbsb-"+name, (sheetname?sheetname:name), - document.getElementById("SocialCalc-sheetbar-buttons"), - { - //normalstyle: "border:1px solid #000;backgroundColor:#FFF;", - //downstyle: "border:1px solid #000;backgroundColor:#CCC;", - //hoverstyle: "border:1px solid #000;backgroundColor:#FFF;" - }, - { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(name);}, - Repeat:function(){}, - Disabled: function() {} - } - ); - - return element; -} - -SocialCalc.WorkBookControlAddSheet = function(addworksheet, sheetname){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(sheetname); - - // then change the highlight - - var old="sheet1"; - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style", ""); - old = control.currentSheetButton.id; - SocialCalc.SheetBarButtonActivate(old, false); - } - - element.setAttribute("style","background-color:lightgreen"); - control.currentSheetButton = element; - var newsheetid = element.id; - SocialCalc.SheetBarButtonActivate(newsheetid, true); - - // create the sheet - if (addworksheet) { - control.workbook.AddNewWorkBookSheet(newsheetid, old, false); - // broadcast an add command here - var cmdstr = "addsheet" - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - } - -} - -SocialCalc.WorkBookControlAddSheetRemote = function(savestr){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(); - - // add the sheet, dont switch to it - control.workbook.AddNewWorkBookSheetNoSwitch(element.id, - element.value, savestr); -} - - -SocialCalc.WorkBookControlActivateSheet = function(name) { - - //alert("in activate sheet="+name) - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById(name); - foo.setAttribute("style","background-color:lightgreen;"); - SocialCalc.SheetBarButtonActivate(name, true) - - var old = control.currentSheetButton.id; - if (control.currentSheetButton.id != foo.id) { - control.currentSheetButton.setAttribute("style", ""); - SocialCalc.SheetBarButtonActivate(old, false) - } - - control.currentSheetButton = foo; - - control.workbook.ActivateWorkBookSheet(name, old); - -} - -SocialCalc.WorkBookControlHttpRequest = null; - -SocialCalc.WorkBookControlAlertContents = function(){ - - var loadedstr = ""; - var http_request = SocialCalc.WorkBookControlHttpRequest; - - if (http_request.readyState == 4) { - //addmsg("received:" + http_request.responseText.length + " chars"); - try { - if (http_request.status == 200) { - loadedstr = http_request.responseText || ""; - http_request = null; - } - else { - ; - } - } - catch (e) { - } - // do something with loaded str - //alert("loaded="+loadedstr); - SocialCalc.TestWorkBookSaveStr = loadedstr; - SocialCalc.Clipboard.clipboard = loadedstr; - } -} - - -SocialCalc.WorkBookControlAjaxCall = function(url, contents) { - - var http_request = null; - - alert("in ajax") - if (window.XMLHttpRequest) { // Mozilla, Safari,... - http_request = new XMLHttpRequest(); - } - else - if (window.ActiveXObject) { // IE - try { - http_request = new ActiveXObject("Msxml2.XMLHTTP"); - } - catch (e) { - try { - http_request = new ActiveXObject("Microsoft.XMLHTTP"); - } - catch (e) { - } - } - } - if (!http_request) { - alert('Giving up :( Cannot create an XMLHTTP instance'); - return false; - } - - // Make the actual request - SocialCalc.WorkBookControlHttpRequest = http_request; - - http_request.onreadystatechange = SocialCalc.WorkBookControlAlertContents; - http_request.open('POST', document.URL, true); // async - http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - http_request.send(contents); - - return true; - -} - -SocialCalc.WorkBookControlSaveSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetsave = {}; - - sheetsave.numsheets = control.numSheets; - sheetsave.currentid = control.currentSheetButton.id; - sheetsave.currentname = control.currentSheetButton.value; - - sheetsave.sheetArr = {} - for (var sheet in control.sheetButtonArr) { - var sheetstr = control.workbook.SaveWorkBookSheet(sheet); - sheetsave.sheetArr[sheet] = {} - sheetsave.sheetArr[sheet].sheetstr = sheetstr; - sheetsave.sheetArr[sheet].name = control.sheetButtonArr[sheet].value; - sheetsave.sheetArr[sheet].hidden = document.getElementById("sbsb-" + sheet).style.display == "none" ? "1" : "0"; - } - - // Save the editable cells if specified - if (SocialCalc.EditableCells && SocialCalc.EditableCells.allow) { - sheetsave.EditableCells = {}; - for (var i in SocialCalc.EditableCells) { - sheetsave.EditableCells[i] = SocialCalc.EditableCells[i]; - } - } - - SocialCalc.TestWorkBookSaveStr = JSON.stringify(sheetsave); - //alert(SocialCalc.TestWorkBookSaveStr); - // send it to the backend - // SocialCalc.WorkBookControlAjaxCall("/", "&sheetdata="+encodeURIComponent(SocialCalc.TestWorkBookSaveStr)); - return SocialCalc.TestWorkBookSaveStr; -} - - -// insert another workbook into an existing workbook -// assumption is at least 1 sheet exists in existing workbook -// sheets with same names will be overwritten ! -SocialCalc.WorkBookControlInsertWorkbook = function(savestr, sheetsave) { - if (savestr) { - sheetsave = JSON.parse(savestr); - } - var control = SocialCalc.GetCurrentWorkBookControl(); - for (var sheet in sheetsave.sheetArr) { - - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end) - } - } - // check if sheetname already exists - var sheetname = sheetsave.sheetArr[sheet].name - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - if (sheetid) { - //alert(sheetname+"exists") - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, sheetname) - } - else { - //just test-brand new insert first - sheetid = "sheet"+(control.sheetCnt+1).toString() - control.sheetCnt = control.sheetCnt+1 - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid) - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr) - - } - } - -} - -SocialCalc.WorkBookControlLoad = function(savestr){ - - var sheetsave; - - if (savestr == "") return; - - if (savestr) { - sheetsave = JSON.parse(savestr); - } else { - sheetsave = JSON.parse(SocialCalc.TestWorkBookSaveStr); - } - //alert(sheetsave.currentid+","+sheetsave.currentname) - - // first create a new workbook - var control = SocialCalc.GetCurrentWorkBookControl(); - - SocialCalc.WorkBookControlCreateNewBook(); - - // at this point there is one sheet, and 1 button - // create the sequence of buttons, and sheets - var firstrun = true; - var newbuttons = 0 - var sheetid = null; - var currentsheetid = sheetsave.currentid; - //alert("button="+newbuttons) - for (var sheet in sheetsave.sheetArr) { - //alert(sheet); - if (newbuttons > sheetsave.numsheets) { - break; - } - //alert("button="+newbuttons) - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - if (firstrun) { - firstrun=false; - // set the first button's name correctly - sheetid = control.currentSheetButton.id; - control.currentSheetButton.value = sheetsave.sheetArr[sheet].name; - SocialCalc.SheetBarButtonSetName(sheetid, sheetsave.sheetArr[sheet].name); - // set the sheet data for the first sheet which already exists - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, control.currentSheetButton.value); - // need to also set the formula cache - currentsheetid = sheetid; - } - else { - sheetid = "sheet"+(control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt+1; - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr); - } - if(sheetsave.sheetArr[sheet].hidden=="1") { - // unregister with mouse ? etc - var sheetbarbutton = document.getElementById("sbsb-" + sheetid); - sheetbarbutton.style.display="none"; - SocialCalc.SheetBarButtonActivate(sheet, false); - newbuttons= newbuttons - 1; - } - if (sheet == sheetsave.currentid) { - currentsheetid = sheetid - } - newbuttons = newbuttons + 1; - } - // Save the user script data - if (sheetsave.EditableCells) { - SocialCalc.EditableCells = {}; - for (var i in sheetsave.EditableCells) { - SocialCalc.EditableCells[i] = sheetsave.EditableCells[i]; - } - } - var timeoutFn = function() { - SocialCalc.WorkBookControlActivateSheet(currentsheetid); - }; - window.setTimeout(timeoutFn, 200); -} - - -SocialCalc.WorkBookControlRenameSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // do a popup to get the new name of the sheet - // the popup has an input element with submit, and cancel buttons - var element = document.getElementById(control.renameDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+'Rename-'+ currentsheet + '
    '+ - '' + 'Please ensure that you DO NOT have ANY spaces in the sheet name.' + '' + - '
    '+'
    '; - -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.renameDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - -var ele = document.getElementById("newSheetName"); -ele.focus(); -SocialCalc.CmdGotFocus(ele); - -} - -SocialCalc.WorkBookControlRenameSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.renameDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlRenameSheetSubmit = function(){ - -// this handles all the rename action -var ele = document.getElementById("newSheetName"); -//console.log(ele.value); -var control = SocialCalc.GetCurrentWorkBookControl(); -if (ele.value.length == 0) { - ele.focus(); - return; -} -var oldname = control.currentSheetButton.value; -var newname = ele.value; -if(newname.indexOf(" ")!=-1) { - alert("A space was found in the new name. Please ensure that the new name has no sapces"); - return; - } -SocialCalc.WorkBookControlRenameSheetHide(); -// verify newname does not clash with any existing sheet name -// if so reject -var smallname = newname.toLowerCase();//converting to lower case to normalise -//console.log(smallname + " old " + ele.value); -for (var sheet in workbook.sheetArr) { - console.log(workbook.sheetArr[sheet].sheet.sheetname);//checking in sheetarr for repeated names - if (workbook.sheetArr[sheet].sheet.sheetname == smallname) { - alert(newname+" already exists"); - return; - } - } // variation of Case in letters of a sheet name will give an error if smallname is used. -// prevent a sheetname prefixed with sheet -if (smallname.indexOf("sheet") == 0) { - alert("sheetname cannot start with 'sheet'"); - return; -} - - -control.currentSheetButton.value = smallname; - -SocialCalc.SheetBarButtonSetName (control.currentSheetButton.id, newname); - -// perform a rename for formula references to this sheet in all the -// sheets in the workbook -control.workbook.RenameWorkBookSheet(oldname, smallname, control.currentSheetButton.id); - - var cmdstr = "rensheet "+control.currentSheetButton.id+" "+oldname+" "+newname; - //console.log(cmdstr); - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - -} - -SocialCalc.WorkBookControlRenameSheetRemote = function(sheetid, oldname, newname) { - //console.log("rename sheet ",sheetid, oldname, newname) - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById("fooBar"); - var renbutton = document.getElementById(sheetid); - - renbutton.value = newname; - - SocialCalc.SheetBarButtonSetName(sheetid, newname); - -control.workbook.RenameWorkBookSheet(oldname, newname, sheetid); - -} - - -SocialCalc.WorkBookControlCreateNewBook = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // delete all the sheets except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - control.workbook.DeleteWorkBookSheet(control.sheetButtonArr[sheet].id, control.sheetButtonArr[sheet].value); - } - } - // Reset that 1 sheet - - control.workbook.LoadRenameWorkBookSheet(control.currentSheetButton.id, "", control.workbook.defaultsheetname) - - - // delete all the buttons except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.sheetButtonArr[sheet].id); - - var name = current.id; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - control.numSheets = control.numSheets - 1; - } - } - // rename that button - control.currentSheetButton.value = control.workbook.defaultsheetname; - //alert("done new workbook") -} - -SocialCalc.WorkBookControlNewBook = function() { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlCreateNewBook(); - control.workbook.RenderWorkBookSheet(); -} - - -SocialCalc.WorkBookControlMove = function(direction){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - return; - } - var sheetArr = control.sheetButtonArr; - var newSheetArr = {}; - var sheetid = control.currentSheetButton.id; - - var curr_button = document.getElementById(sheetid); - var curr_sb_button = document.getElementById("sbsb-"+sheetid); - var sib_button = null; - var sib_sb_button = null; - if (direction == "left") { - sib_button = curr_button.previousSibling; - sib_sb_button = curr_sb_button.previousSibling; - if(!sib_sb_button) { - alert("Cannot move leftmost Sheet further to the left"); - return; - } - } - else { - sib_button = curr_button.nextSibling; - sib_sb_button = curr_sb_button.nextSibling; - if(!sib_sb_button) { - alert("Cannot move rightmost Sheet further to the right"); - return; - } - } - var currid = sheetid; - var sibid = sib_button.id; - var parent = curr_button.parentNode; - var sb_parent = curr_sb_button.parentNode; - - var cloned = {}; - var clonedsb = {}; - for(button in sheetArr) { - clonedsb[button] = document.getElementById("sbsb-"+button); - cloned[button] = document.getElementById(button); - sb_parent.removeChild(document.getElementById("sbsb-"+button)); - parent.removeChild(document.getElementById(button)); - } - for(button in sheetArr) { - if(button != currid && button != sibid) { - newSheetArr[button] = sheetArr[button]; - sb_parent.appendChild(clonedsb[button]); - parent.appendChild(cloned[button]); - } - else if(button == currid) { - if (direction == "left") { - newSheetArr[currid] = sheetArr[currid]; - newSheetArr[sibid] = sheetArr[sibid]; - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - } else { - newSheetArr[sibid] = sheetArr[sibid]; - newSheetArr[currid] = sheetArr[currid]; - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - } - } - } - control.sheetButtonArr = newSheetArr; - SocialCalc.SheetBarButtonActivate(currid,true); -} - -SocialCalc.WorkBookControlMoveLeft = function(){ - SocialCalc.WorkBookControlMove("left"); -} -SocialCalc.WorkBookControlMoveRight = function(){ - SocialCalc.WorkBookControlMove("right"); -} - - - -SocialCalc.WorkBookControlCopySheet = function(){ - - //alert("in copy"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - control.workbook.CopyWorkBookSheet(control.currentSheetButton.id); - - alert("copied sheet:"+control.currentSheetButton.value); -} - -SocialCalc.WorkBookControlPasteSheet = function() { - - //alert("in paste"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - var oldid = control.currentSheetButton.id; - - SocialCalc.WorkBookControlAddSheet(false); - - var newid = control.currentSheetButton.id; - - //alert(newid+oldid); - - control.workbook.PasteWorkBookSheet(newid, oldid); - - var cmdstr = "addsheetstr"; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr, sheetstr: control.workbook.clipsheet.savestr}); - -} - -SocialCalc.SheetBar = function() { - this.baseDiv = document.getElementById("SocialCalc-sheetbar"); - - this.prebuttonsDiv = document.createElement("div"); - this.prebuttonsDiv.style.cssText = "display:inline;"; - this.prebuttonsDiv.innerHTML="        "; - this.prebuttonsDiv.id = "SocialCalc-sheetbar-prebuttons"; - - this.buttonsDiv = document.createElement("div"); - this.buttonsDiv.id = "SocialCalc-sheetbar-buttons"; - this.buttonsDiv.style.cssText = "display:inline;"; - - this.buttonActionsDiv = document.createElement("div"); - this.buttonActionsDiv.id = "SocialCalc-sheetbar-buttonactions"; - this.buttonActionsDiv.style.display = "inline"; - var addbutton = new SocialCalc.SheetBarSheetButton("sbsba-add", "sbsba-add", this.buttonActionsDiv, - {}, - { - MouseDown:function(){var abc=SocialCalc.WorkBookControlAddSheet(true);} - }, - "add-2.png"); - - - this.baseDiv.appendChild(this.prebuttonsDiv); - this.baseDiv.appendChild(this.buttonsDiv); - this.baseDiv.appendChild(this.buttonActionsDiv); -} - -// define a new class for sheetbarsheetbutton - -SocialCalc.SheetBarSheetButton = function(id, name, parentdiv, params, functions, img) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.name = name; - if (!img) { - this.ele.innerHTML = name; - this.ele.style.cssText = "font-size:small;display:inline;padding:5px 5px 2px 5px;border:1px solid #000;"; - imgele = document.createElement("img"); - imgele.id = id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - SocialCalc.ButtonRegister(this.ele, params, functions); - SocialCalc.ButtonRegister(imgele, params, functions); - } else { - var imgele = document.createElement("img"); - imgele.src = SocialCalc.Constants.defaultImagePrefix +img; - imgele.style.cssText = "width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - this.ele.style.cssText = "display:inline;padding:5px 5px 2px 5px;"; - SocialCalc.ButtonRegister(imgele, params, functions); - } - parentdiv.appendChild(this.ele); -} - -SocialCalc.SheetBarButtonActivate = function(id, active) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.isactive = active; - if (active) { - sbbutton.style.backgroundColor = "#FFF"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (!imgele) { - imgele = document.createElement("img"); - imgele.id = "sbsb-"+id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - } - sbbutton.appendChild(imgele); - SocialCalc.ButtonRegister(imgele, {}, { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(id);}, - Repeat:function(){}, - Disabled: function() {} - } ); - } - else { - sbbutton.style.backgroundColor = "#CCC"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (imgele) { - sbbutton.removeChild(imgele); - } - } - var menu = document.getElementById("sbsb-menu"); - if (menu && menu.style.display != "none") { - menu.style.display = "none"; - } -} - -SocialCalc.SheetBarButtonSetName = function(id, name) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.name = name; - sbbutton.innerHTML = name; - if (sbbutton.isactive) { - SocialCalc.SheetBarButtonActivate(id, true); - } -} - - -SocialCalc.SheetBarSheetButtonPress = function(id) { - //console.log("button press") - var sbbutton = document.getElementById("sbsb-"+id); - if (sbbutton && sbbutton.isactive) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) { - var sbsbm = new SocialCalc.SheetBarSheetButtonMenu("sbsb-menu", id); - } else { - menu.clickedsheetid = id; - if (menu.style.display == "none") { - menu.style.display = "inline"; - SocialCalc.SheetBarSheetButtonMenuPosition(menu, id); - } else { - menu.style.display = "none"; - } - } - - } else if (sbbutton) { - SocialCalc.WorkBookControlActivateSheet(id); - } - -} - - -// define a new class for sheetbarsheet button menu item - -SocialCalc.SheetBarSheetButtonMenuItem = function(id, t) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.innerHTML = t; - this.ele.className = ""; - this.ele.style.cssText = "padding:3px 4px;width:100px;height:20px;background-color:#FFF;"; - - var params = { - normalstyle: "backgroundColor:#FFF;", - downstyle: "backgroundColor:#CCC;", - hoverstyle: "backgroundColor:#CCC;"}; - var functions = {MouseDown:function(){SocialCalc.SheetBarMenuItemPress(id);}, - Repeat:function(){}, - Disabled: function() {}}; - - SocialCalc.ButtonRegister(this.ele, params, functions); - - if (SocialCalc.TouchRegister) { - SocialCalc.TouchRegister(this.ele, {SingleTap:functions.MouseDown}); - } - - return this.ele; - -} - -SocialCalc.SheetBarMenuItemPress = function(id) { - - var menu = document.getElementById("sbsb-menu"); - if (!menu) return; - - var clickedsheetid = menu.clickedsheetid; - - switch(id) { - case "sbsb_deletesheet": - //console.log("delete "+clickedsheetid); - SocialCalc.WorkBookControlDelSheet(); - break; - case "sbsb_hidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlHideSheet(); - break; - case "sbsb_unhidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlUnhideSheet(); - break; - case "sbsb_copysheet": - //console.log("copy "+clickedsheetid); - SocialCalc.WorkBookControlCopySheet(); - break; - case "sbsb_moveleft": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveLeft(); - break; - case "sbsb_moveright": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveRight(); - break; - - case "sbsb_pastesheet": - //console.log("paste "+clickedsheetid); - SocialCalc.WorkBookControlPasteSheet(); - break; - case "sbsb_renamesheet": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlRenameSheet(); - break; - case "sbsb_closemenu": - //console.log("rename "+clickedsheetid); - menu.style.display = "none"; - break; - default: - break; - } - menu.style.display = "none"; - -} - -// define a new class for sheetbarsheet button menu -SocialCalc.SheetBarSheetButtonMenu = function(id, clickedsheetid) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.className = ""; - this.ele.clickedsheetid = clickedsheetid; - this.ele.style.cssText = "border:1px solid #000;position:absolute;top:200px;left:0px;width=100px;z-index:120"; - - var ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_deletesheet"," Delete Sheet"); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_hidesheet"," Hide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_unhidesheet"," Unhide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_renamesheet"," Rename Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveleft"," Move Left "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveright"," Move Right "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_copysheet"," Copy Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_pastesheet"," Paste Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_closemenu"," Cancel"); - this.ele.appendChild(ele1); - - - SocialCalc.SheetBarSheetButtonMenuPosition(this.ele, clickedsheetid); - - //var clickedsheet = document.getElementById(clickedsheetid); - //var position = SocialCalc.GetElementPosition(clickedsheet); - //console.log(clickedsheet.offsetHeight,clickedsheet.offsetWidth,clickedsheet.offsetLeft, clickedsheet.offsetTop); - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.editor.toplevel.appendChild(this.ele); - - - - - -} - -// position the sheet menu -SocialCalc.SheetBarSheetButtonMenuPosition = function(menu, clickedsheetid) { - - var hlessbutton = document.getElementById("te_lessbuttonh"); - - //console.log(hlessbutton.style.top, hlessbutton.style.left); - - var sbbutton = document.getElementById("sbsb-"+clickedsheetid); - - //console.log(sbbutton.offsetLeft,clickedsheetid); - - var top = hlessbutton.style.top.slice(0,-2)-220; - var left = sbbutton.offsetLeft+7; - - menu.style.top = top+"px"; - menu.style.left = left+"px"; - - //console.log(menu.style.top, menu.style.left); -} - -SocialCalc.ScriptInfo = { - scripts : {}, - handle:null -}; - -SocialCalc.ScriptCheck = function(sheetid, coord, text) { -var commentstart = text.indexOf(""); -if ((commentstart != -1) && (commentend != -1)) { - script = text.slice(commentstart+10,commentend); - //alert(script); - SocialCalc.ScriptInfo.scripts[coord] = script; - if (SocialCalc.ScriptInfo.handle == null) { - SocialCalc.ScriptInfo.handle = - window.setTimeout(SocialCalc.EvalUserScripts,500); - } - //alert(coord+"-"+sheetid); -} -} - -SocialCalc.EvalUserScript = function(data) { - var head = document.getElementsByTagName("head")[0] || - document.documentElement; - - if (data == "") return; - - var script = document.createElement("script"); - - script.type = "text/javascript"; - try { - // doesn't work on ie... - script.appendChild(document.createTextNode(data)); - } catch(e) { - // IE has funky script nodes - script.text = data; - } - - head.insertBefore(script, head.firstChild); - head.removeChild(script); -} - -SocialCalc.EvalUserScripts = function() { -for (var cr in SocialCalc.ScriptInfo.scripts) { - SocialCalc.EvalUserScript(SocialCalc.ScriptInfo.scripts[cr]); - //console.log(cr,SocialCalc.ScriptInfo.scripts[cr]) -} -SocialCalc.ScriptInfo.handle = null; -SocialCalc.ScriptInfo.scripts = {}; -} - -SocialCalc.CallOutOnRenderCell = function(sheetobj, value, cr) { -var cell=sheetobj.cells[cr]; -if (!cell) return; -var valuetype = cell.valuetype || ""; // get type of value to determine formatting -var valuesubtype = valuetype.substring(1); -var sheetattribs=sheetobj.attribs; -valuetype = valuetype.charAt(0); -if (valuetype=="t") { - valueformat = sheetobj.valueformats[cell.textvalueformat-0] || sheetobj.valueformats[sheetattribs.defaulttextvalueformat-0] || ""; - if (valueformat == "text-html") {SocialCalc.ScriptCheck(sheetobj.sheetid,cr,value);} -} -} - -SocialCalc.GetCellDataValue = function(coord) { - - var sheetname = null; - var sheetid = ""; - var bindex = coord.indexOf("!"); - if (bindex != -1) { - sheetname = coord.slice(0,bindex); - coord = coord.slice(bindex+1); - //console.log(sheetname,coord) - } - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (sheetname == null) { - sheetid = control.currentSheetButton.id - } else { - sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - } - - if ((sheetid == null) || (sheetid == "")) { - return "0"; - } - - var sheetobj = control.workbook.sheetArr[sheetid].sheet - - var cell = sheetobj.cells[coord] - - if (cell) {return cell.datavalue;} else {return 0;} -} - -SocialCalc.GetCellDataArray = function(coordstr,sheetname) { - var vals = [] - var coords = coordstr.split(","); - if (sheetname == null) { sheetname=""; } - else { - sheetname = sheetname+"!"; - } - for (var c in coords) { - - vals.push(SocialCalc.GetCellDataValue(sheetname+coords[c])); - } - return vals; -} - -SocialCalc.UserScriptData = {} - - -SocialCalc.WorkBookRecalculateInfo = { - sheets : [], - calcorder: [], - current: 0, - pass: 0 -}; - -SocialCalc.WorkBookRecalculateAll = function() { - // do it from the last sheet to the first sheet - // using the recalc-done signal to trigger the next sheet - - // if already in the middle of a recalculate-all, ignore this. - if ((SocialCalc.WorkBookRecalculateInfo.current != 0) || - (SocialCalc.WorkBookRecalculateInfo.calcorder.length != 0) || - (SocialCalc.WorkBookRecalculateInfo.sheets.length != 0)) { - return; - } - - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - SocialCalc.WorkBookRecalculateInfo.current = 0; - - for (var sheet in control.workbook.sheetArr) { - SocialCalc.WorkBookRecalculateInfo.sheets.push(sheet); - } - - var i = 0; - for (var c=SocialCalc.WorkBookRecalculateInfo.sheets.length; - c>0; c--) { - SocialCalc.WorkBookRecalculateInfo.calcorder[i] = - SocialCalc.WorkBookRecalculateInfo.sheets[c-1]; - i++; - } - window.setTimeout(SocialCalc.WorkBookRecalculateStep,500); -} - -SocialCalc.WorkBookRecalculateStep = function() { - if (SocialCalc.WorkBookRecalculateInfo.current == - SocialCalc.WorkBookRecalculateInfo.calcorder.length) { - SocialCalc.WorkBookRecalculateInfo.current = 0; - SocialCalc.WorkBookRecalculateInfo.calcorder = []; - SocialCalc.WorkBookRecalculateInfo.sheets = []; - if (SocialCalc.WorkBookRecalculateInfo.pass == - 1) { - SocialCalc.WorkBookRecalculateInfo.pass = 0; - SocialCalc.SpinnerWaitHide(); - //alert("load done"); - return; - } else { - SocialCalc.WorkBookRecalculateInfo.pass++; - SocialCalc.WorkBookRecalculateAll(); - return; - } - } - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert("recalculate "+ - // SocialCalc.WorkBookRecalculateInfo.calcorder[ - // SocialCalc.WorkBookRecalculateInfo.current] - // ); - var sheetid = -SocialCalc.WorkBookRecalculateInfo.calcorder[ - SocialCalc.WorkBookRecalculateInfo.current]; - SocialCalc.WorkBookControlActivateSheet(sheetid); - SocialCalc.WorkBookRecalculateInfo.current++; - - - window.setTimeout(SocialCalc.WorkBookRecalculateStep,1000); -} - - -SocialCalc.SpinnerWaitCreate = function() { - // if the div exists already just use it - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - return; - } - var main = document.createElement("div"); - main.id = "waitloadingspinner"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - main.style.top = (vp.height/2)+"px"; - main.style.left = (vp.width/2)+"px"; - main.style.zIndex = 110; - - main.style.width='50px' - main.style.height = '50px' - main.innerHTML = 'Loading...'; - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.SpinnerWaitHide = function() { - // if the div exists already just use it - -var ele = document.getElementById("waitloadingspinner"); -if (ele) { - ele.innerHTML = ""; - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} -} - -SocialCalc.EditableCells = {}; -SocialCalc.EditableCells.allow = false; -SocialCalc.EditableCells.cells = {}; -SocialCalc.EditableCells.constraints = {}; - -SocialCalc.Callbacks.IsCellEditable = function(editor) { - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - - if (!(SocialCalc.EditableCells.allow)) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[cellname]) { - // by default all cells are editable - return true; - } - return false; -} - -SocialCalc.Callbacks.CheckConstraints = function(editor, value) -{ - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - var constraint = SocialCalc.EditableCells.constraints[cellname]; - //alert(JSON.stringify(constraint)) - if (constraint != null) { - switch (constraint[0]) { - case "numeric": - // check that value is numeric - var val = parseInt(value); - var low = parseInt(constraint[1]); - var high = parseInt(constraint[2]); - var text = ""; - if (constraint.length > 3) { - text = constraint[3]; - } - //alert(val) - if (isNaN(val)) { - //Aspiring.showPopUp("please input a number"); - alert("please input a number"); - return false; - } - if (val < low) { - //Aspiring.showPopUp(text +" must be at least "+low); - alert(text +" must be at least "+low); - return false; - } - if (val > high) { - //Aspiring.showPopUp(text + " must be atmost "+high); - alert(text + " must be atmost "+high); - return false; - } - if (Aspiring.appSpecificInputValidation && !Aspiring.appSpecificInputValidation(cellname, val)) { - return false; - } - break; - case "float": - var val = parseFloat(value); - var low = parseFloat(constraint[1]); - var high = parseFloat(constraint[2]); - var text = ""; - if (constraint.length > 3) { - text = constraint[3]; - } - //alert(val) - if (isNaN(val)) { - //Aspiring.showPopUp("please input a number"); - alert("please input a number"); - return false; - } - if (val < low) { - //Aspiring.showPopUp(text +" must be at least "+low); - alert(text +" must be at least "+low); - return false; - } - if (val > high) { - //Aspiring.showPopUp(text + " must be atmost "+high); - alert(text + " must be atmost "+high); - return false; - } - if (Aspiring.appSpecificInputValidation && !Aspiring.appSpecificInputValidation(cellname, val)) { - return false; - } - break; - - case "percent": - break; - } - } - return true; - -} - -// this is for checkmark toggling -SocialCalc.Callbacks.ToggleCell = function() -{ - // check what the current ecell is - var control = SocialCalc.GetCurrentWorkBookControl(); - - var editor = control.workbook.spreadsheet.editor; - - var cellname = editor.ecell.coord; - - var value = SocialCalc.GetCellDataValue(cellname); - - console.log(cellname) - console.log(value) - - var cmdstr = ""; - if (value.indexOf(" ") != -1) { - // set the value to the img value - //cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - - } else { - // set the value to a space - cmdstr = "set " + cellname + ' text t
     
    ' + "\n"; - } - - var sheetid = control.currentSheetButton.id - console.log(sheetid) - console.log(cmdstr) - cmd = {cmdtype:"scmd", id:sheetid, cmdstr: cmdstr, saveundo: false}; - control.ExecuteWorkBookControlCommand(cmd, false); - -} - - -SocialCalc.WorkbookControlCreateSheetHTML = function(sheetlist) { - - var context, div, ele; - - var result = ""; - - var control = SocialCalc.GetCurrentWorkBookControl(); - - div = document.createElement("div"); - - if (!sheetlist) { - context = new SocialCalc.RenderContext(spreadsheet.sheet); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - } else { - for (var sheetid in sheetlist) { - context = control.workbook.sheetArr[sheetid].context; - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - } - } - - result = div.innerHTML; - delete ele; - delete div; - return result; - - } \ No newline at end of file diff --git a/DeveloperAdoption/public/static/socialcalcworkbookcontrol.js b/DeveloperAdoption/public/static/socialcalcworkbookcontrol.js deleted file mode 100644 index 44411ad..0000000 --- a/DeveloperAdoption/public/static/socialcalcworkbookcontrol.js +++ /dev/null @@ -1,2015 +0,0 @@ -// -// Workbook Control controls workbook actions (add/del/rename etc) and can appear at the -// bottom of the screen (?). Right now its just a proof of concept -// and appears at the top of the screen -// -// Author: Ramu Ramamurthy -// -// - -var SocialCalc; -if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; -} - -SocialCalc.CurrentWorkbookControlObject = null; - -SocialCalc.TestWorkBookSaveStr = ""; - - -// Constructor: - -SocialCalc.WorkBookControl = function(book, divid, defaultsheetname) { - - this.workbook = book; - this.div = divid; - this.defaultsheetname = defaultsheetname; - this.sheetButtonArr = {}; - this.sheetCnt = 0; - this.numSheets = 0; - this.currentSheetButton = null; - this.renameDialogId = "sheetRenameDialog"; - this.deleteDialogId = "sheetDeleteDialog"; - this.hideDialogId = "sheetHideDialog"; - this.unhideDialogId = "sheetUnhideDialog"; - - this.sheetshtml = ''; - -//this.buttonshtml = -//'
    '+ -//'
    '+ -//''+ -//''+ -//''+ - -// ''+ -// ''+ -// ''+ - -//''+ -//''+ -//'
    '+ -//'
    '; - - SocialCalc.CurrentWorkbookControlObject = this; - this.sheetbar = new SocialCalc.SheetBar(); -} - -// methods -SocialCalc.WorkBookControl.prototype.GetCurrentWorkBookControl = function() {return SocialCalc.GetCurrentWorkBookControl();}; -SocialCalc.WorkBookControl.prototype.InitializeWorkBookControl = function() {return SocialCalc.InitializeWorkBookControl(this);}; - - -SocialCalc.WorkBookControl.prototype.ExecuteWorkBookControlCommand = function(cmd, isremote) { - return SocialCalc.ExecuteWorkBookControlCommand(this, cmd, isremote); -} - -SocialCalc.ExecuteWorkBookControlCommand = function(control, cmd, isremote) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - //if (!isremote) { - // return; - //} - - if (cmd.cmdtype == "scmd") { - // dispatch a sheet command - control.workbook.WorkbookScheduleCommand(cmd, isremote); - return; - - } - - if (cmd.cmdtype != "wcmd") { - return; - } - - var parseobj = new SocialCalc.Parse(cmd.cmdstr); - - var cmd1 = parseobj.NextToken(); - - switch (cmd1) { - case "addsheet": - SocialCalc.WorkBookControlAddSheetRemote(null); - break; - - case "addsheetstr": - var sheetstr = cmd.sheetstr; - SocialCalc.WorkBookControlAddSheetRemote(sheetstr); - break; - - case "delsheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlDelSheetRemote(sheetid); - break; - - case "rensheet": - var sheetid = parseobj.NextToken(); - var oldname = parseobj.NextToken(); - var newname = parseobj.NextToken(); - SocialCalc.WorkBookControlRenameSheetRemote(sheetid, oldname, newname); - break; - - case "activatesheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlActivateSheet(sheetid); - break; - - case "hidesheet": - var sheetid = parseobj.NextToken(); - - break; - - case "unhidesheet": - var sheetid = parseobj.NextToken(); - - break; - } -} - -SocialCalc.GetCurrentWorkBookControl = function() { - return SocialCalc.CurrentWorkbookControlObject; -} - -SocialCalc.InitializeWorkBookControl = function(control) { - var element = document.createElement("div"); - element.innerHTML = control.sheetshtml; - var foo = document.getElementById(control.div); - foo.appendChild(element); - //var element2 = document.createElement("div"); - //element2.innerHTML = control.buttonshtml; - //foo.appendChild(element2); - SocialCalc.WorkBookControlAddSheet(false); // this is for the default sheet -} - -SocialCalc.WorkBookControlDelSheetRemote = function(sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (sheetid == control.currentSheetButton.id) { - // the active sheet is being deleted - SocialCalc.WorkBookControlDelSheet(); - return; - } - // some non active sheet is being deleted - var foo = document.getElementById("fooBar"); - var deletedbutton = document.getElementById(sheetid); - - var did = deletedbutton.id; - var dname = deletedbutton.value; - delete control.sheetButtonArr[did]; - - foo.removeChild(deletedbutton); - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+did); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - // delete the sheet - control.workbook.DeleteWorkBookSheet(did, dname); - control.numSheets = control.numSheets-1; - -} - -// assumes that the current active sheet is being deleted -SocialCalc.WorkBookControlDelSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } -if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='To delete the selected sheet, you must first insert a new sheet.
    '; -str +='
    '+ - '
    '; - var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the deletion of the sheet - // the popup has two buttons : Confirm and Cancel -var element = document.getElementById(control.deleteDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+ 'The selected sheet will be permanently deleted.'+ '
    '; -str +='
      '; - str +='
    • To delete the selected sheet, click OK.
    • '; - str +='
    • To cancel the deletion, click cancel.
    • '; -str+='
    '; -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.WorkBookControlDeleteSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.deleteDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlDeleteSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlDeleteSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.currentSheetButton = null; - // delete the sheets - control.workbook.DeleteWorkBookSheet(name, curname); - control.numSheets = control.numSheets-1; - - var cmdstr = "delsheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true) - break; - } - } - if (control.currentSheetButton != null) { - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } -} - -// assumes that the current active sheet is being hidden -SocialCalc.WorkBookControlHideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='Before hiding the selected sheet, you must first insert a new sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the hiding of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.hideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The selected sheet will be hidden.'+ '
    '; - str +='
      '; - str +='
    • To hide the selected sheet, click OK.
    • '; - str +='
    • To cancel the hiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - -SocialCalc.WorkBookControlHideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.hideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlHideSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlHideSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, false); - sheetbarbutton.style.display="none"; - control.currentSheetButton = null; - // delete the sheets - - control.numSheets = control.numSheets-1; - - var cmdstr = "hidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - -// displays all hidden sheets, and then unhides whatever is selected -SocialCalc.WorkBookControlUnhideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - - var unhiddencount = 0; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - unhiddencount++; - } - } - - if(unhiddencount==0) { //no hidden sheets, error message here - var str = '
    '+ - ''+' There are no hidden worksheets. ' + '

    '; - str +='Before unhiding any sheets, you must first hide a sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - var element = document.getElementById(control.unhideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The following sheets are hidden.'+ '
      ' + - ''; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - str += '' + control.sheetButtonArr[sheet].value +'
      '; - } - } - - str +='
    \n
      '; - str +='
    • To unhide the selected sheet, click OK.
    • '; - str +='
    • To cancel the unhiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - - - -SocialCalc.WorkBookControlUnhideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.unhideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} - - -SocialCalc.WorkBookControlUnhideSheetSubmit = function(name) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlUnhideSheetHide(); - var current = document.getElementById(control.currentSheetButton.id); - - var curid = current.id; - var curname = control.currentSheetButton.value; - - control.currentSheetButton.setAttribute("style",""); - var old = control.currentSheetButton.id; - console.log(old); - SocialCalc.SheetBarButtonActivate(old, false); - - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unhide the button - sheetbarbutton.style.display = "inline"; - control.currentSheetButton = null; - - control.numSheets = control.numSheets+1; - - var cmdstr = "unhidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - - - -SocialCalc.WorkBookControlAddSheetButton = function(sheetname, sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - //Create an input type dynamically. - var element = document.createElement("input"); - - var name = null; - - if (sheetid != null) { - name = sheetid - } else { - name = "sheet"+ (control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt + 1; - } - - //Assign different attributes to the element. - element.setAttribute("type", "button"); - if (sheetname == null) { - element.setAttribute("value", name); - } else { - element.setAttribute("value", sheetname); - } - element.setAttribute("id", name); - element.setAttribute("name", name); - - var fnname = "SocialCalc.WorkBookControlActivateSheet("+"'"+name+"'"+")"; - - element.setAttribute("onclick",fnname); - - control.sheetButtonArr[name] = element; - - - var foo = document.getElementById("fooBar"); - - //Append the element in page (in span). - foo.appendChild(element); - - control.numSheets = control.numSheets + 1; - - var el = new SocialCalc.SheetBarSheetButton("sbsb-"+name, (sheetname?sheetname:name), - document.getElementById("SocialCalc-sheetbar-buttons"), - { - //normalstyle: "border:1px solid #000;backgroundColor:#FFF;", - //downstyle: "border:1px solid #000;backgroundColor:#CCC;", - //hoverstyle: "border:1px solid #000;backgroundColor:#FFF;" - }, - { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(name);}, - Repeat:function(){}, - Disabled: function() {} - } - ); - - return element; -} - -SocialCalc.WorkBookControlAddSheet = function(addworksheet, sheetname){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(sheetname); - - // then change the highlight - - var old="sheet1"; - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style", ""); - old = control.currentSheetButton.id; - SocialCalc.SheetBarButtonActivate(old, false); - } - - element.setAttribute("style","background-color:lightgreen"); - control.currentSheetButton = element; - var newsheetid = element.id; - SocialCalc.SheetBarButtonActivate(newsheetid, true); - - // create the sheet - if (addworksheet) { - control.workbook.AddNewWorkBookSheet(newsheetid, old, false); - // broadcast an add command here - var cmdstr = "addsheet" - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - } - -} - -SocialCalc.WorkBookControlAddSheetRemote = function(savestr){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(); - - // add the sheet, dont switch to it - control.workbook.AddNewWorkBookSheetNoSwitch(element.id, - element.value, savestr); -} - - -SocialCalc.WorkBookControlActivateSheet = function(name) { - - //alert("in activate sheet="+name) - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById(name); - foo.setAttribute("style","background-color:lightgreen;"); - SocialCalc.SheetBarButtonActivate(name, true) - - var old = control.currentSheetButton.id; - if (control.currentSheetButton.id != foo.id) { - control.currentSheetButton.setAttribute("style", ""); - SocialCalc.SheetBarButtonActivate(old, false) - } - - control.currentSheetButton = foo; - - control.workbook.ActivateWorkBookSheet(name, old); - -} - -SocialCalc.WorkBookControlHttpRequest = null; - -SocialCalc.WorkBookControlAlertContents = function(){ - - var loadedstr = ""; - var http_request = SocialCalc.WorkBookControlHttpRequest; - - if (http_request.readyState == 4) { - //addmsg("received:" + http_request.responseText.length + " chars"); - try { - if (http_request.status == 200) { - loadedstr = http_request.responseText || ""; - http_request = null; - } - else { - ; - } - } - catch (e) { - } - // do something with loaded str - //alert("loaded="+loadedstr); - SocialCalc.TestWorkBookSaveStr = loadedstr; - SocialCalc.Clipboard.clipboard = loadedstr; - } -} - - -SocialCalc.WorkBookControlAjaxCall = function(url, contents) { - - var http_request = null; - - alert("in ajax") - if (window.XMLHttpRequest) { // Mozilla, Safari,... - http_request = new XMLHttpRequest(); - } - else - if (window.ActiveXObject) { // IE - try { - http_request = new ActiveXObject("Msxml2.XMLHTTP"); - } - catch (e) { - try { - http_request = new ActiveXObject("Microsoft.XMLHTTP"); - } - catch (e) { - } - } - } - if (!http_request) { - alert('Giving up :( Cannot create an XMLHTTP instance'); - return false; - } - - // Make the actual request - SocialCalc.WorkBookControlHttpRequest = http_request; - - http_request.onreadystatechange = SocialCalc.WorkBookControlAlertContents; - http_request.open('POST', document.URL, true); // async - http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - http_request.send(contents); - - return true; - -} - -SocialCalc.WorkBookControlSaveSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetsave = {}; - - sheetsave.numsheets = control.numSheets; - sheetsave.currentid = control.currentSheetButton.id; - sheetsave.currentname = control.currentSheetButton.value; - - sheetsave.sheetArr = {} - for (var sheet in control.sheetButtonArr) { - var sheetstr = control.workbook.SaveWorkBookSheet(sheet); - sheetsave.sheetArr[sheet] = {} - sheetsave.sheetArr[sheet].sheetstr = sheetstr; - sheetsave.sheetArr[sheet].name = control.sheetButtonArr[sheet].value; - sheetsave.sheetArr[sheet].hidden = document.getElementById("sbsb-" + sheet).style.display == "none" ? "1" : "0"; - } - - // Save the editable cells if specified - if (SocialCalc.EditableCells && SocialCalc.EditableCells.allow) { - sheetsave.EditableCells = {}; - for (var i in SocialCalc.EditableCells) { - sheetsave.EditableCells[i] = SocialCalc.EditableCells[i]; - } - } - - SocialCalc.TestWorkBookSaveStr = JSON.stringify(sheetsave); - //alert(SocialCalc.TestWorkBookSaveStr); - // send it to the backend - // SocialCalc.WorkBookControlAjaxCall("/", "&sheetdata="+encodeURIComponent(SocialCalc.TestWorkBookSaveStr)); - return SocialCalc.TestWorkBookSaveStr; -} - - -// insert another workbook into an existing workbook -// assumption is at least 1 sheet exists in existing workbook -// sheets with same names will be overwritten ! -SocialCalc.WorkBookControlInsertWorkbook = function(savestr, sheetsave) { - if (savestr) { - sheetsave = JSON.parse(savestr); - } - var control = SocialCalc.GetCurrentWorkBookControl(); - for (var sheet in sheetsave.sheetArr) { - - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end) - } - } - // check if sheetname already exists - var sheetname = sheetsave.sheetArr[sheet].name - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - if (sheetid) { - //alert(sheetname+"exists") - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, sheetname) - } - else { - //just test-brand new insert first - sheetid = "sheet"+(control.sheetCnt+1).toString() - control.sheetCnt = control.sheetCnt+1 - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid) - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr) - - } - } - -} - -SocialCalc.WorkBookControlLoad = function(savestr){ - - var sheetsave; - - if (savestr == "") return; - - if (savestr) { - sheetsave = JSON.parse(savestr); - } else { - sheetsave = JSON.parse(SocialCalc.TestWorkBookSaveStr); - } - //alert(sheetsave.currentid+","+sheetsave.currentname) - - // first create a new workbook - var control = SocialCalc.GetCurrentWorkBookControl(); - - SocialCalc.WorkBookControlCreateNewBook(); - - // at this point there is one sheet, and 1 button - // create the sequence of buttons, and sheets - var firstrun = true; - var newbuttons = 0 - var sheetid = null; - var currentsheetid = sheetsave.currentid; - //alert("button="+newbuttons) - for (var sheet in sheetsave.sheetArr) { - //alert(sheet); - if (newbuttons > sheetsave.numsheets) { - break; - } - //alert("button="+newbuttons) - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - if (firstrun) { - firstrun=false; - // set the first button's name correctly - sheetid = control.currentSheetButton.id; - control.currentSheetButton.value = sheetsave.sheetArr[sheet].name; - SocialCalc.SheetBarButtonSetName(sheetid, sheetsave.sheetArr[sheet].name); - // set the sheet data for the first sheet which already exists - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, control.currentSheetButton.value); - // need to also set the formula cache - currentsheetid = sheetid; - } - else { - sheetid = "sheet"+(control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt+1; - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr); - } - if(sheetsave.sheetArr[sheet].hidden=="1") { - // unregister with mouse ? etc - var sheetbarbutton = document.getElementById("sbsb-" + sheetid); - sheetbarbutton.style.display="none"; - SocialCalc.SheetBarButtonActivate(sheet, false); - newbuttons= newbuttons - 1; - } - if (sheet == sheetsave.currentid) { - currentsheetid = sheetid - } - newbuttons = newbuttons + 1; - } - // Save the user script data - if (sheetsave.EditableCells) { - SocialCalc.EditableCells = {}; - for (var i in sheetsave.EditableCells) { - SocialCalc.EditableCells[i] = sheetsave.EditableCells[i]; - } - } - var timeoutFn = function() { - SocialCalc.WorkBookControlActivateSheet(currentsheetid); - }; - window.setTimeout(timeoutFn, 200); -} - - -SocialCalc.WorkBookControlRenameSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // do a popup to get the new name of the sheet - // the popup has an input element with submit, and cancel buttons - var element = document.getElementById(control.renameDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+'Rename-'+ currentsheet + '
    '+ - '' + 'Please ensure that you DO NOT have ANY spaces in the sheet name.' + '' + - '
    '+'
    '; - -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.renameDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - -var ele = document.getElementById("newSheetName"); -ele.focus(); -SocialCalc.CmdGotFocus(ele); - -} - -SocialCalc.WorkBookControlRenameSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.renameDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlRenameSheetSubmit = function(){ - -// this handles all the rename action -var ele = document.getElementById("newSheetName"); -//console.log(ele.value); -var control = SocialCalc.GetCurrentWorkBookControl(); -if (ele.value.length == 0) { - ele.focus(); - return; -} -var oldname = control.currentSheetButton.value; -var newname = ele.value; -if(newname.indexOf(" ")!=-1) { - alert("A space was found in the new name. Please ensure that the new name has no sapces"); - return; - } -SocialCalc.WorkBookControlRenameSheetHide(); -// verify newname does not clash with any existing sheet name -// if so reject -var smallname = newname.toLowerCase();//converting to lower case to normalise -//console.log(smallname + " old " + ele.value); -for (var sheet in workbook.sheetArr) { - console.log(workbook.sheetArr[sheet].sheet.sheetname);//checking in sheetarr for repeated names - if (workbook.sheetArr[sheet].sheet.sheetname == smallname) { - alert(newname+" already exists"); - return; - } - } // variation of Case in letters of a sheet name will give an error if smallname is used. -// prevent a sheetname prefixed with sheet -if (smallname.indexOf("sheet") == 0) { - alert("sheetname cannot start with 'sheet'"); - return; -} - - -control.currentSheetButton.value = smallname; - -SocialCalc.SheetBarButtonSetName (control.currentSheetButton.id, newname); - -// perform a rename for formula references to this sheet in all the -// sheets in the workbook -control.workbook.RenameWorkBookSheet(oldname, smallname, control.currentSheetButton.id); - - var cmdstr = "rensheet "+control.currentSheetButton.id+" "+oldname+" "+newname; - //console.log(cmdstr); - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - -} - -SocialCalc.WorkBookControlRenameSheetRemote = function(sheetid, oldname, newname) { - //console.log("rename sheet ",sheetid, oldname, newname) - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById("fooBar"); - var renbutton = document.getElementById(sheetid); - - renbutton.value = newname; - - SocialCalc.SheetBarButtonSetName(sheetid, newname); - -control.workbook.RenameWorkBookSheet(oldname, newname, sheetid); - -} - - -SocialCalc.WorkBookControlCreateNewBook = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // delete all the sheets except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - control.workbook.DeleteWorkBookSheet(control.sheetButtonArr[sheet].id, control.sheetButtonArr[sheet].value); - } - } - // Reset that 1 sheet - - control.workbook.LoadRenameWorkBookSheet(control.currentSheetButton.id, "", control.workbook.defaultsheetname) - - - // delete all the buttons except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.sheetButtonArr[sheet].id); - - var name = current.id; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - control.numSheets = control.numSheets - 1; - } - } - // rename that button - control.currentSheetButton.value = control.workbook.defaultsheetname; - //alert("done new workbook") -} - -SocialCalc.WorkBookControlNewBook = function() { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlCreateNewBook(); - control.workbook.RenderWorkBookSheet(); -} - - -SocialCalc.WorkBookControlMove = function(direction){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - return; - } - var sheetArr = control.sheetButtonArr; - var newSheetArr = {}; - var sheetid = control.currentSheetButton.id; - - var curr_button = document.getElementById(sheetid); - var curr_sb_button = document.getElementById("sbsb-"+sheetid); - var sib_button = null; - var sib_sb_button = null; - if (direction == "left") { - sib_button = curr_button.previousSibling; - sib_sb_button = curr_sb_button.previousSibling; - if(!sib_sb_button) { - alert("Cannot move leftmost Sheet further to the left"); - return; - } - } - else { - sib_button = curr_button.nextSibling; - sib_sb_button = curr_sb_button.nextSibling; - if(!sib_sb_button) { - alert("Cannot move rightmost Sheet further to the right"); - return; - } - } - var currid = sheetid; - var sibid = sib_button.id; - var parent = curr_button.parentNode; - var sb_parent = curr_sb_button.parentNode; - - var cloned = {}; - var clonedsb = {}; - for(button in sheetArr) { - clonedsb[button] = document.getElementById("sbsb-"+button); - cloned[button] = document.getElementById(button); - sb_parent.removeChild(document.getElementById("sbsb-"+button)); - parent.removeChild(document.getElementById(button)); - } - for(button in sheetArr) { - if(button != currid && button != sibid) { - newSheetArr[button] = sheetArr[button]; - sb_parent.appendChild(clonedsb[button]); - parent.appendChild(cloned[button]); - } - else if(button == currid) { - if (direction == "left") { - newSheetArr[currid] = sheetArr[currid]; - newSheetArr[sibid] = sheetArr[sibid]; - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - } else { - newSheetArr[sibid] = sheetArr[sibid]; - newSheetArr[currid] = sheetArr[currid]; - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - } - } - } - control.sheetButtonArr = newSheetArr; - SocialCalc.SheetBarButtonActivate(currid,true); -} - -SocialCalc.WorkBookControlMoveLeft = function(){ - SocialCalc.WorkBookControlMove("left"); -} -SocialCalc.WorkBookControlMoveRight = function(){ - SocialCalc.WorkBookControlMove("right"); -} - - - -SocialCalc.WorkBookControlCopySheet = function(){ - - //alert("in copy"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - control.workbook.CopyWorkBookSheet(control.currentSheetButton.id); - - alert("copied sheet:"+control.currentSheetButton.value); -} - -SocialCalc.WorkBookControlPasteSheet = function() { - - //alert("in paste"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - var oldid = control.currentSheetButton.id; - - SocialCalc.WorkBookControlAddSheet(false); - - var newid = control.currentSheetButton.id; - - //alert(newid+oldid); - - control.workbook.PasteWorkBookSheet(newid, oldid); - - var cmdstr = "addsheetstr"; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr, sheetstr: control.workbook.clipsheet.savestr}); - -} - -SocialCalc.SheetBar = function() { - this.baseDiv = document.getElementById("SocialCalc-sheetbar"); - - this.prebuttonsDiv = document.createElement("div"); - this.prebuttonsDiv.style.cssText = "display:inline;"; - this.prebuttonsDiv.innerHTML="        "; - this.prebuttonsDiv.id = "SocialCalc-sheetbar-prebuttons"; - - this.buttonsDiv = document.createElement("div"); - this.buttonsDiv.id = "SocialCalc-sheetbar-buttons"; - this.buttonsDiv.style.cssText = "display:inline;"; - - this.buttonActionsDiv = document.createElement("div"); - this.buttonActionsDiv.id = "SocialCalc-sheetbar-buttonactions"; - this.buttonActionsDiv.style.display = "inline"; - var addbutton = new SocialCalc.SheetBarSheetButton("sbsba-add", "sbsba-add", this.buttonActionsDiv, - {}, - { - MouseDown:function(){var abc=SocialCalc.WorkBookControlAddSheet(true);} - }, - "add-2.png"); - - - this.baseDiv.appendChild(this.prebuttonsDiv); - this.baseDiv.appendChild(this.buttonsDiv); - this.baseDiv.appendChild(this.buttonActionsDiv); -} - -// define a new class for sheetbarsheetbutton - -SocialCalc.SheetBarSheetButton = function(id, name, parentdiv, params, functions, img) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.name = name; - if (!img) { - this.ele.innerHTML = name; - this.ele.style.cssText = "font-size:small;display:inline;padding:5px 5px 2px 5px;border:1px solid #000;"; - imgele = document.createElement("img"); - imgele.id = id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - SocialCalc.ButtonRegister(this.ele, params, functions); - SocialCalc.ButtonRegister(imgele, params, functions); - } else { - var imgele = document.createElement("img"); - imgele.src = SocialCalc.Constants.defaultImagePrefix +img; - imgele.style.cssText = "width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - this.ele.style.cssText = "display:inline;padding:5px 5px 2px 5px;"; - SocialCalc.ButtonRegister(imgele, params, functions); - } - parentdiv.appendChild(this.ele); -} - -SocialCalc.SheetBarButtonActivate = function(id, active) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.isactive = active; - if (active) { - sbbutton.style.backgroundColor = "#FFF"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (!imgele) { - imgele = document.createElement("img"); - imgele.id = "sbsb-"+id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - } - sbbutton.appendChild(imgele); - SocialCalc.ButtonRegister(imgele, {}, { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(id);}, - Repeat:function(){}, - Disabled: function() {} - } ); - } - else { - sbbutton.style.backgroundColor = "#CCC"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (imgele) { - sbbutton.removeChild(imgele); - } - } - var menu = document.getElementById("sbsb-menu"); - if (menu && menu.style.display != "none") { - menu.style.display = "none"; - } -} - -SocialCalc.SheetBarButtonSetName = function(id, name) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.name = name; - sbbutton.innerHTML = name; - if (sbbutton.isactive) { - SocialCalc.SheetBarButtonActivate(id, true); - } -} - - -SocialCalc.SheetBarSheetButtonPress = function(id) { - //console.log("button press") - var sbbutton = document.getElementById("sbsb-"+id); - if (sbbutton && sbbutton.isactive) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) { - var sbsbm = new SocialCalc.SheetBarSheetButtonMenu("sbsb-menu", id); - } else { - menu.clickedsheetid = id; - if (menu.style.display == "none") { - menu.style.display = "inline"; - SocialCalc.SheetBarSheetButtonMenuPosition(menu, id); - } else { - menu.style.display = "none"; - } - } - - } else if (sbbutton) { - SocialCalc.WorkBookControlActivateSheet(id); - } - -} - - -// define a new class for sheetbarsheet button menu item - -SocialCalc.SheetBarSheetButtonMenuItem = function(id, t) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.innerHTML = t; - this.ele.className = ""; - this.ele.style.cssText = "padding:3px 4px;width:100px;height:20px;background-color:#FFF;"; - - var params = { - normalstyle: "backgroundColor:#FFF;", - downstyle: "backgroundColor:#CCC;", - hoverstyle: "backgroundColor:#CCC;"}; - var functions = {MouseDown:function(){SocialCalc.SheetBarMenuItemPress(id);}, - Repeat:function(){}, - Disabled: function() {}}; - - SocialCalc.ButtonRegister(this.ele, params, functions); - - if (SocialCalc.TouchRegister) { - SocialCalc.TouchRegister(this.ele, {SingleTap:functions.MouseDown}); - } - - return this.ele; - -} - -SocialCalc.SheetBarMenuItemPress = function(id) { - - var menu = document.getElementById("sbsb-menu"); - if (!menu) return; - - var clickedsheetid = menu.clickedsheetid; - - switch(id) { - case "sbsb_deletesheet": - //console.log("delete "+clickedsheetid); - SocialCalc.WorkBookControlDelSheet(); - break; - case "sbsb_hidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlHideSheet(); - break; - case "sbsb_unhidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlUnhideSheet(); - break; - case "sbsb_copysheet": - //console.log("copy "+clickedsheetid); - SocialCalc.WorkBookControlCopySheet(); - break; - case "sbsb_moveleft": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveLeft(); - break; - case "sbsb_moveright": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveRight(); - break; - - case "sbsb_pastesheet": - //console.log("paste "+clickedsheetid); - SocialCalc.WorkBookControlPasteSheet(); - break; - case "sbsb_renamesheet": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlRenameSheet(); - break; - case "sbsb_closemenu": - //console.log("rename "+clickedsheetid); - menu.style.display = "none"; - break; - default: - break; - } - menu.style.display = "none"; - -} - -// define a new class for sheetbarsheet button menu -SocialCalc.SheetBarSheetButtonMenu = function(id, clickedsheetid) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.className = ""; - this.ele.clickedsheetid = clickedsheetid; - this.ele.style.cssText = "border:1px solid #000;position:absolute;top:200px;left:0px;width=100px;z-index:120"; - - var ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_deletesheet"," Delete Sheet"); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_hidesheet"," Hide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_unhidesheet"," Unhide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_renamesheet"," Rename Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveleft"," Move Left "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveright"," Move Right "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_copysheet"," Copy Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_pastesheet"," Paste Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_closemenu"," Cancel"); - this.ele.appendChild(ele1); - - - SocialCalc.SheetBarSheetButtonMenuPosition(this.ele, clickedsheetid); - - //var clickedsheet = document.getElementById(clickedsheetid); - //var position = SocialCalc.GetElementPosition(clickedsheet); - //console.log(clickedsheet.offsetHeight,clickedsheet.offsetWidth,clickedsheet.offsetLeft, clickedsheet.offsetTop); - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.editor.toplevel.appendChild(this.ele); - - - - - -} - -// position the sheet menu -SocialCalc.SheetBarSheetButtonMenuPosition = function(menu, clickedsheetid) { - - var hlessbutton = document.getElementById("te_lessbuttonh"); - - //console.log(hlessbutton.style.top, hlessbutton.style.left); - - var sbbutton = document.getElementById("sbsb-"+clickedsheetid); - - //console.log(sbbutton.offsetLeft,clickedsheetid); - - var top = hlessbutton.style.top.slice(0,-2)-220; - var left = sbbutton.offsetLeft+7; - - menu.style.top = top+"px"; - menu.style.left = left+"px"; - - //console.log(menu.style.top, menu.style.left); -} - -SocialCalc.ScriptInfo = { - scripts : {}, - handle:null -}; - -SocialCalc.ScriptCheck = function(sheetid, coord, text) { -var commentstart = text.indexOf(""); -if ((commentstart != -1) && (commentend != -1)) { - script = text.slice(commentstart+10,commentend); - //alert(script); - SocialCalc.ScriptInfo.scripts[coord] = script; - if (SocialCalc.ScriptInfo.handle == null) { - SocialCalc.ScriptInfo.handle = - window.setTimeout(SocialCalc.EvalUserScripts,500); - } - //alert(coord+"-"+sheetid); -} -} - -SocialCalc.EvalUserScript = function(data) { - var head = document.getElementsByTagName("head")[0] || - document.documentElement; - - if (data == "") return; - - var script = document.createElement("script"); - - script.type = "text/javascript"; - try { - // doesn't work on ie... - script.appendChild(document.createTextNode(data)); - } catch(e) { - // IE has funky script nodes - script.text = data; - } - - head.insertBefore(script, head.firstChild); - head.removeChild(script); -} - -SocialCalc.EvalUserScripts = function() { -for (var cr in SocialCalc.ScriptInfo.scripts) { - SocialCalc.EvalUserScript(SocialCalc.ScriptInfo.scripts[cr]); - //console.log(cr,SocialCalc.ScriptInfo.scripts[cr]) -} -SocialCalc.ScriptInfo.handle = null; -SocialCalc.ScriptInfo.scripts = {}; -} - -SocialCalc.CallOutOnRenderCell = function(sheetobj, value, cr) { -var cell=sheetobj.cells[cr]; -if (!cell) return; -var valuetype = cell.valuetype || ""; // get type of value to determine formatting -var valuesubtype = valuetype.substring(1); -var sheetattribs=sheetobj.attribs; -valuetype = valuetype.charAt(0); -if (valuetype=="t") { - valueformat = sheetobj.valueformats[cell.textvalueformat-0] || sheetobj.valueformats[sheetattribs.defaulttextvalueformat-0] || ""; - if (valueformat == "text-html") {SocialCalc.ScriptCheck(sheetobj.sheetid,cr,value);} -} -} - -SocialCalc.GetCellDataValue = function(coord) { - - var sheetname = null; - var sheetid = ""; - var bindex = coord.indexOf("!"); - if (bindex != -1) { - sheetname = coord.slice(0,bindex); - coord = coord.slice(bindex+1); - //console.log(sheetname,coord) - } - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (sheetname == null) { - sheetid = control.currentSheetButton.id - } else { - sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - } - - if ((sheetid == null) || (sheetid == "")) { - return "0"; - } - - var sheetobj = control.workbook.sheetArr[sheetid].sheet - - var cell = sheetobj.cells[coord] - - if (cell) {return cell.datavalue;} else {return 0;} -} - -SocialCalc.GetCellDataArray = function(coordstr,sheetname) { - var vals = [] - var coords = coordstr.split(","); - if (sheetname == null) { sheetname=""; } - else { - sheetname = sheetname+"!"; - } - for (var c in coords) { - - vals.push(SocialCalc.GetCellDataValue(sheetname+coords[c])); - } - return vals; -} - -SocialCalc.UserScriptData = {} - - -SocialCalc.WorkBookRecalculateInfo = { - sheets : [], - calcorder: [], - current: 0, - pass: 0 -}; - -SocialCalc.WorkBookRecalculateAll = function() { - // do it from the last sheet to the first sheet - // using the recalc-done signal to trigger the next sheet - - // if already in the middle of a recalculate-all, ignore this. - if ((SocialCalc.WorkBookRecalculateInfo.current != 0) || - (SocialCalc.WorkBookRecalculateInfo.calcorder.length != 0) || - (SocialCalc.WorkBookRecalculateInfo.sheets.length != 0)) { - return; - } - - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - SocialCalc.WorkBookRecalculateInfo.current = 0; - - for (var sheet in control.workbook.sheetArr) { - SocialCalc.WorkBookRecalculateInfo.sheets.push(sheet); - } - - var i = 0; - for (var c=SocialCalc.WorkBookRecalculateInfo.sheets.length; - c>0; c--) { - SocialCalc.WorkBookRecalculateInfo.calcorder[i] = - SocialCalc.WorkBookRecalculateInfo.sheets[c-1]; - i++; - } - window.setTimeout(SocialCalc.WorkBookRecalculateStep,500); -} - -SocialCalc.WorkBookRecalculateStep = function() { - if (SocialCalc.WorkBookRecalculateInfo.current == - SocialCalc.WorkBookRecalculateInfo.calcorder.length) { - SocialCalc.WorkBookRecalculateInfo.current = 0; - SocialCalc.WorkBookRecalculateInfo.calcorder = []; - SocialCalc.WorkBookRecalculateInfo.sheets = []; - if (SocialCalc.WorkBookRecalculateInfo.pass == - 1) { - SocialCalc.WorkBookRecalculateInfo.pass = 0; - SocialCalc.SpinnerWaitHide(); - //alert("load done"); - return; - } else { - SocialCalc.WorkBookRecalculateInfo.pass++; - SocialCalc.WorkBookRecalculateAll(); - return; - } - } - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert("recalculate "+ - // SocialCalc.WorkBookRecalculateInfo.calcorder[ - // SocialCalc.WorkBookRecalculateInfo.current] - // ); - var sheetid = -SocialCalc.WorkBookRecalculateInfo.calcorder[ - SocialCalc.WorkBookRecalculateInfo.current]; - SocialCalc.WorkBookControlActivateSheet(sheetid); - SocialCalc.WorkBookRecalculateInfo.current++; - - - window.setTimeout(SocialCalc.WorkBookRecalculateStep,1000); -} - - -SocialCalc.SpinnerWaitCreate = function() { - // if the div exists already just use it - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - return; - } - var main = document.createElement("div"); - main.id = "waitloadingspinner"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - main.style.top = (vp.height/2)+"px"; - main.style.left = (vp.width/2)+"px"; - main.style.zIndex = 110; - - main.style.width='50px' - main.style.height = '50px' - main.innerHTML = 'Loading...'; - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.SpinnerWaitHide = function() { - // if the div exists already just use it - -var ele = document.getElementById("waitloadingspinner"); -if (ele) { - ele.innerHTML = ""; - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} -} - -SocialCalc.EditableCells = {}; -SocialCalc.EditableCells.allow = false; -SocialCalc.EditableCells.cells = {}; -SocialCalc.EditableCells.constraints = {}; - -SocialCalc.Callbacks.IsCellEditable = function(editor) { - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - - if (!(SocialCalc.EditableCells.allow)) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[cellname]) { - // by default all cells are editable - return true; - } - return false; -} - -SocialCalc.Callbacks.GetCellEditableAttribs = function(attribs, coord) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var editor = control.workbook.spreadsheet.editor; - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - - console.log(cellname) - if (!(SocialCalc.EditableCells.allow)) { - // by default all cells are editable - attribs["ceditable"] = {def: true, val: ""}; - attribs["cconstraints"] = {def: true, val: ""}; - return ; - } else if (SocialCalc.EditableCells.cells[cellname]) { - attribs["ceditable"] = {def: false, val: "yes"}; - } else { - attribs["ceditable"] = {def: false, val: "no"}; - } - /* - if (SocialCalc.EditableCells.constraints[cellname]) { - attribs["cconstraints"] = {def: false, val: SocialCalc.EditableCells.constraints[cellname]}; - } else { - attribs["cconstraints"] = {def: true, val: ""}; - } - */ - attribs["cconstraints"] = {def: true, val: ""}; - -} - -SocialCalc.Callbacks.SetCellEditableAttribs = function(coord, attribs, range) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var editor = control.workbook.spreadsheet.editor; - var sheetname = editor.workingvalues.currentsheet - - if (range) { - var lis = range.split(":"); - var obj1 = SocialCalc.coordToCr(lis[0]); - var obj2 = SocialCalc.coordToCr(lis[1]); - var i=0; - var j=0; - for (i=obj1.col;i<=obj2.col;i++) { - for (j=obj1.row; j<=obj2.row; j++) { - var cellname = sheetname+"!"+SocialCalc.crToCoord(i,j) - if (!attribs["ceditable"].def && attribs["ceditable"].val == "yes") { - SocialCalc.EditableCells.allow = true - SocialCalc.EditableCells.cells[cellname] = true; - } - if (!attribs["ceditable"].def && attribs["ceditable"].val == "no") { - delete SocialCalc.EditableCells.cells[cellname]; - if (!SocialCalc.EditableCells.cells.length) { - SocialCalc.EditableCells.allow = false - } - } - /* - if (!attribs["cconstraints"].def) { - SocialCalc.EditableCells.constraints[cellname] = attribs["cconstraints"].val; - SocialCalc.EditableCells.allow = true - } - */ - } - } - - } else { - var cellname = sheetname+"!"+editor.ecell.coord; - - if (!attribs["ceditable"].def && attribs["ceditable"].val == "yes") { - SocialCalc.EditableCells.allow = true - SocialCalc.EditableCells.cells[cellname] = true; - } - if (!attribs["ceditable"].def && attribs["ceditable"].val == "no") { - delete SocialCalc.EditableCells.cells[cellname]; - if (!SocialCalc.EditableCells.cells.length) { - SocialCalc.EditableCells.allow = false - } - } - /* - if (!attribs["cconstraints"].def) { - SocialCalc.EditableCells.constraints[cellname] = attribs["cconstraints"].val; - SocialCalc.EditableCells.allow = true - } - */ - } -} - -SocialCalc.Callbacks.CheckConstraints = function(editor, value) -{ - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - var constraint = SocialCalc.EditableCells.constraints[cellname]; - //alert(JSON.stringify(constraint)) - if (constraint != null) { - switch (constraint[0]) { - case "numeric": - // check that value is numeric - var val = parseInt(value); - var low = parseInt(constraint[1]); - var high = parseInt(constraint[2]); - var text = ""; - if (constraint.length > 3) { - text = constraint[3]; - } - //alert(val) - if (isNaN(val)) { - //Aspiring.showPopUp("please input a number"); - alert("please input a number"); - return false; - } - if (val < low) { - //Aspiring.showPopUp(text +" must be at least "+low); - alert(text +" must be at least "+low); - return false; - } - if (val > high) { - //Aspiring.showPopUp(text + " must be atmost "+high); - alert(text + " must be atmost "+high); - return false; - } - if (Aspiring.appSpecificInputValidation && !Aspiring.appSpecificInputValidation(cellname, val)) { - return false; - } - break; - case "float": - var val = parseFloat(value); - var low = parseFloat(constraint[1]); - var high = parseFloat(constraint[2]); - var text = ""; - if (constraint.length > 3) { - text = constraint[3]; - } - //alert(val) - if (isNaN(val)) { - //Aspiring.showPopUp("please input a number"); - alert("please input a number"); - return false; - } - if (val < low) { - //Aspiring.showPopUp(text +" must be at least "+low); - alert(text +" must be at least "+low); - return false; - } - if (val > high) { - //Aspiring.showPopUp(text + " must be atmost "+high); - alert(text + " must be atmost "+high); - return false; - } - if (Aspiring.appSpecificInputValidation && !Aspiring.appSpecificInputValidation(cellname, val)) { - return false; - } - break; - - case "percent": - break; - } - } - return true; - -} - -// this is for checkmark toggling -SocialCalc.Callbacks.ToggleCell = function() -{ - // check what the current ecell is - var control = SocialCalc.GetCurrentWorkBookControl(); - - var editor = control.workbook.spreadsheet.editor; - - var cellname = editor.ecell.coord; - - var value = SocialCalc.GetCellDataValue(cellname); - if(typeof value !== Array) return - - console.log(cellname) - console.log(value) - - var cmdstr = ""; - if (value.indexOf(" ") != -1) { - // set the value to the img value - //cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - - } else { - // set the value to a space - cmdstr = "set " + cellname + ' text t
     
    ' + "\n"; - } - - var sheetid = control.currentSheetButton.id - console.log(sheetid) - console.log(cmdstr) - cmd = {cmdtype:"scmd", id:sheetid, cmdstr: cmdstr, saveundo: false}; - control.ExecuteWorkBookControlCommand(cmd, false); - -} - - -SocialCalc.WorkbookControlCreateSheetHTML = function(sheetlist) { - - var context, div, ele; - - var result = ""; - - var control = SocialCalc.GetCurrentWorkBookControl(); - - div = document.createElement("div"); - - if (!sheetlist) { - context = new SocialCalc.RenderContext(spreadsheet.sheet); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - } else { - for (var sheetid in sheetlist) { - context = control.workbook.sheetArr[sheetid].context; - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - } - } - - result = div.innerHTML; - delete ele; - delete div; - return result; - - } \ No newline at end of file diff --git a/DeveloperAdoption/public/static/socialcalcworkbookcontrol.js.orig b/DeveloperAdoption/public/static/socialcalcworkbookcontrol.js.orig deleted file mode 100644 index 6bdb435..0000000 --- a/DeveloperAdoption/public/static/socialcalcworkbookcontrol.js.orig +++ /dev/null @@ -1,1912 +0,0 @@ -// -// Workbook Control controls workbook actions (add/del/rename etc) and can appear at the -// bottom of the screen (?). Right now its just a proof of concept -// and appears at the top of the screen -// -// Author: Ramu Ramamurthy -// -// - -var SocialCalc; -if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; -} - -SocialCalc.CurrentWorkbookControlObject = null; - -SocialCalc.TestWorkBookSaveStr = ""; - - -// Constructor: - -SocialCalc.WorkBookControl = function(book, divid, defaultsheetname) { - - this.workbook = book; - this.div = divid; - this.defaultsheetname = defaultsheetname; - this.sheetButtonArr = {}; - this.sheetCnt = 0; - this.numSheets = 0; - this.currentSheetButton = null; - this.renameDialogId = "sheetRenameDialog"; - this.deleteDialogId = "sheetDeleteDialog"; - this.hideDialogId = "sheetHideDialog"; - this.unhideDialogId = "sheetUnhideDialog"; - - this.sheetshtml = ''; - -//this.buttonshtml = -//'
    '+ -//'
    '+ -//''+ -//''+ -//''+ - -// ''+ -// ''+ -// ''+ - -//''+ -//''+ -//'
    '+ -//'
    '; - - SocialCalc.CurrentWorkbookControlObject = this; - this.sheetbar = new SocialCalc.SheetBar(); -} - -// methods -SocialCalc.WorkBookControl.prototype.GetCurrentWorkBookControl = function() {return SocialCalc.GetCurrentWorkBookControl();}; -SocialCalc.WorkBookControl.prototype.InitializeWorkBookControl = function() {return SocialCalc.InitializeWorkBookControl(this);}; - - -SocialCalc.WorkBookControl.prototype.ExecuteWorkBookControlCommand = function(cmd, isremote) { - return SocialCalc.ExecuteWorkBookControlCommand(this, cmd, isremote); -} - -SocialCalc.ExecuteWorkBookControlCommand = function(control, cmd, isremote) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - //if (!isremote) { - // return; - //} - - if (cmd.cmdtype == "scmd") { - // dispatch a sheet command - control.workbook.WorkbookScheduleCommand(cmd, isremote); - return; - - } - - if (cmd.cmdtype != "wcmd") { - return; - } - - var parseobj = new SocialCalc.Parse(cmd.cmdstr); - - var cmd1 = parseobj.NextToken(); - - switch (cmd1) { - case "addsheet": - SocialCalc.WorkBookControlAddSheetRemote(null); - break; - - case "addsheetstr": - var sheetstr = cmd.sheetstr; - SocialCalc.WorkBookControlAddSheetRemote(sheetstr); - break; - - case "delsheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlDelSheetRemote(sheetid); - break; - - case "rensheet": - var sheetid = parseobj.NextToken(); - var oldname = parseobj.NextToken(); - var newname = parseobj.NextToken(); - SocialCalc.WorkBookControlRenameSheetRemote(sheetid, oldname, newname); - break; - - case "activatesheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlActivateSheet(sheetid); - break; - - case "hidesheet": - var sheetid = parseobj.NextToken(); - - break; - - case "unhidesheet": - var sheetid = parseobj.NextToken(); - - break; - } -} - -SocialCalc.GetCurrentWorkBookControl = function() { - return SocialCalc.CurrentWorkbookControlObject; -} - -SocialCalc.InitializeWorkBookControl = function(control) { - var element = document.createElement("div"); - element.innerHTML = control.sheetshtml; - var foo = document.getElementById(control.div); - foo.appendChild(element); - //var element2 = document.createElement("div"); - //element2.innerHTML = control.buttonshtml; - //foo.appendChild(element2); - SocialCalc.WorkBookControlAddSheet(false); // this is for the default sheet -} - -SocialCalc.WorkBookControlDelSheetRemote = function(sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (sheetid == control.currentSheetButton.id) { - // the active sheet is being deleted - SocialCalc.WorkBookControlDelSheet(); - return; - } - // some non active sheet is being deleted - var foo = document.getElementById("fooBar"); - var deletedbutton = document.getElementById(sheetid); - - var did = deletedbutton.id; - var dname = deletedbutton.value; - delete control.sheetButtonArr[did]; - - foo.removeChild(deletedbutton); - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+did); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - // delete the sheet - control.workbook.DeleteWorkBookSheet(did, dname); - control.numSheets = control.numSheets-1; - -} - -// assumes that the current active sheet is being deleted -SocialCalc.WorkBookControlDelSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } -if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='To delete the selected sheet, you must first insert a new sheet.
    '; -str +='
    '+ - '
    '; - var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the deletion of the sheet - // the popup has two buttons : Confirm and Cancel -var element = document.getElementById(control.deleteDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+ 'The selected sheet will be permanently deleted.'+ '
    '; -str +='
      '; - str +='
    • To delete the selected sheet, click OK.
    • '; - str +='
    • To cancel the deletion, click cancel.
    • '; -str+='
    '; -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.WorkBookControlDeleteSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.deleteDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlDeleteSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlDeleteSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.currentSheetButton = null; - // delete the sheets - control.workbook.DeleteWorkBookSheet(name, curname); - control.numSheets = control.numSheets-1; - - var cmdstr = "delsheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true) - break; - } - } - if (control.currentSheetButton != null) { - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } -} - -// assumes that the current active sheet is being hidden -SocialCalc.WorkBookControlHideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='Before hiding the selected sheet, you must first insert a new sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the hiding of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.hideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The selected sheet will be hidden.'+ '
    '; - str +='
      '; - str +='
    • To hide the selected sheet, click OK.
    • '; - str +='
    • To cancel the hiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - -SocialCalc.WorkBookControlHideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.hideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlHideSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlHideSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, false); - sheetbarbutton.style.display="none"; - control.currentSheetButton = null; - // delete the sheets - - control.numSheets = control.numSheets-1; - - var cmdstr = "hidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - -// displays all hidden sheets, and then unhides whatever is selected -SocialCalc.WorkBookControlUnhideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - - var unhiddencount = 0; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - unhiddencount++; - } - } - - if(unhiddencount==0) { //no hidden sheets, error message here - var str = '
    '+ - ''+' There are no hidden worksheets. ' + '

    '; - str +='Before unhiding any sheets, you must first hide a sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - var element = document.getElementById(control.unhideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The following sheets are hidden.'+ '
      ' + - ''; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - str += '' + control.sheetButtonArr[sheet].value +'
      '; - } - } - - str +='
    \n
      '; - str +='
    • To unhide the selected sheet, click OK.
    • '; - str +='
    • To cancel the unhiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - - - -SocialCalc.WorkBookControlUnhideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.unhideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} - - -SocialCalc.WorkBookControlUnhideSheetSubmit = function(name) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlUnhideSheetHide(); - var current = document.getElementById(control.currentSheetButton.id); - - var curid = current.id; - var curname = control.currentSheetButton.value; - - control.currentSheetButton.setAttribute("style",""); - var old = control.currentSheetButton.id; - console.log(old); - SocialCalc.SheetBarButtonActivate(old, false); - - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unhide the button - sheetbarbutton.style.display = "inline"; - control.currentSheetButton = null; - - control.numSheets = control.numSheets+1; - - var cmdstr = "unhidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - - - -SocialCalc.WorkBookControlAddSheetButton = function(sheetname, sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - //Create an input type dynamically. - var element = document.createElement("input"); - - var name = null; - - if (sheetid != null) { - name = sheetid - } else { - name = "sheet"+ (control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt + 1; - } - - //Assign different attributes to the element. - element.setAttribute("type", "button"); - if (sheetname == null) { - element.setAttribute("value", name); - } else { - element.setAttribute("value", sheetname); - } - element.setAttribute("id", name); - element.setAttribute("name", name); - - var fnname = "SocialCalc.WorkBookControlActivateSheet("+"'"+name+"'"+")"; - - element.setAttribute("onclick",fnname); - - control.sheetButtonArr[name] = element; - - - var foo = document.getElementById("fooBar"); - - //Append the element in page (in span). - foo.appendChild(element); - - control.numSheets = control.numSheets + 1; - - var el = new SocialCalc.SheetBarSheetButton("sbsb-"+name, (sheetname?sheetname:name), - document.getElementById("SocialCalc-sheetbar-buttons"), - { - //normalstyle: "border:1px solid #000;backgroundColor:#FFF;", - //downstyle: "border:1px solid #000;backgroundColor:#CCC;", - //hoverstyle: "border:1px solid #000;backgroundColor:#FFF;" - }, - { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(name);}, - Repeat:function(){}, - Disabled: function() {} - } - ); - - return element; -} - -SocialCalc.WorkBookControlAddSheet = function(addworksheet, sheetname){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(sheetname); - - // then change the highlight - - var old="sheet1"; - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style", ""); - old = control.currentSheetButton.id; - SocialCalc.SheetBarButtonActivate(old, false); - } - - element.setAttribute("style","background-color:lightgreen"); - control.currentSheetButton = element; - var newsheetid = element.id; - SocialCalc.SheetBarButtonActivate(newsheetid, true); - - // create the sheet - if (addworksheet) { - control.workbook.AddNewWorkBookSheet(newsheetid, old, false); - // broadcast an add command here - var cmdstr = "addsheet" - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - } - -} - -SocialCalc.WorkBookControlAddSheetRemote = function(savestr){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(); - - // add the sheet, dont switch to it - control.workbook.AddNewWorkBookSheetNoSwitch(element.id, - element.value, savestr); -} - - -SocialCalc.WorkBookControlActivateSheet = function(name) { - - //alert("in activate sheet="+name) - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById(name); - foo.setAttribute("style","background-color:lightgreen;"); - SocialCalc.SheetBarButtonActivate(name, true) - - var old = control.currentSheetButton.id; - if (control.currentSheetButton.id != foo.id) { - control.currentSheetButton.setAttribute("style", ""); - SocialCalc.SheetBarButtonActivate(old, false) - } - - control.currentSheetButton = foo; - - control.workbook.ActivateWorkBookSheet(name, old); - -} - -SocialCalc.WorkBookControlHttpRequest = null; - -SocialCalc.WorkBookControlAlertContents = function(){ - - var loadedstr = ""; - var http_request = SocialCalc.WorkBookControlHttpRequest; - - if (http_request.readyState == 4) { - //addmsg("received:" + http_request.responseText.length + " chars"); - try { - if (http_request.status == 200) { - loadedstr = http_request.responseText || ""; - http_request = null; - } - else { - ; - } - } - catch (e) { - } - // do something with loaded str - //alert("loaded="+loadedstr); - SocialCalc.TestWorkBookSaveStr = loadedstr; - SocialCalc.Clipboard.clipboard = loadedstr; - } -} - - -SocialCalc.WorkBookControlAjaxCall = function(url, contents) { - - var http_request = null; - - alert("in ajax") - if (window.XMLHttpRequest) { // Mozilla, Safari,... - http_request = new XMLHttpRequest(); - } - else - if (window.ActiveXObject) { // IE - try { - http_request = new ActiveXObject("Msxml2.XMLHTTP"); - } - catch (e) { - try { - http_request = new ActiveXObject("Microsoft.XMLHTTP"); - } - catch (e) { - } - } - } - if (!http_request) { - alert('Giving up :( Cannot create an XMLHTTP instance'); - return false; - } - - // Make the actual request - SocialCalc.WorkBookControlHttpRequest = http_request; - - http_request.onreadystatechange = SocialCalc.WorkBookControlAlertContents; - http_request.open('POST', document.URL, true); // async - http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - http_request.send(contents); - - return true; - -} - -SocialCalc.WorkBookControlSaveSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetsave = {}; - - sheetsave.numsheets = control.numSheets; - sheetsave.currentid = control.currentSheetButton.id; - sheetsave.currentname = control.currentSheetButton.value; - - sheetsave.sheetArr = {} - for (var sheet in control.sheetButtonArr) { - var sheetstr = control.workbook.SaveWorkBookSheet(sheet); - sheetsave.sheetArr[sheet] = {} - sheetsave.sheetArr[sheet].sheetstr = sheetstr; - sheetsave.sheetArr[sheet].name = control.sheetButtonArr[sheet].value; - sheetsave.sheetArr[sheet].hidden = document.getElementById("sbsb-" + sheet).style.display == "none" ? "1" : "0"; - } - - // Save the editable cells if specified - if (SocialCalc.EditableCells && SocialCalc.EditableCells.allow) { - sheetsave.EditableCells = {}; - for (var i in SocialCalc.EditableCells) { - sheetsave.EditableCells[i] = SocialCalc.EditableCells[i]; - } - } - - SocialCalc.TestWorkBookSaveStr = JSON.stringify(sheetsave); - //alert(SocialCalc.TestWorkBookSaveStr); - // send it to the backend - // SocialCalc.WorkBookControlAjaxCall("/", "&sheetdata="+encodeURIComponent(SocialCalc.TestWorkBookSaveStr)); - return SocialCalc.TestWorkBookSaveStr; -} - - -// insert another workbook into an existing workbook -// assumption is at least 1 sheet exists in existing workbook -// sheets with same names will be overwritten ! -SocialCalc.WorkBookControlInsertWorkbook = function(savestr) { - var sheetsave - if (savestr) { - sheetsave = JSON.parse(savestr); - } - var control = SocialCalc.GetCurrentWorkBookControl(); - for (var sheet in sheetsave.sheetArr) { - - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end) - } - } - // check if sheetname already exists - var sheetname = sheetsave.sheetArr[sheet].name - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - if (sheetid) { - //alert(sheetname+"exists") - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, sheetname) - } - else { - //just test-brand new insert first - sheetid = "sheet"+(control.sheetCnt+1).toString() - control.sheetCnt = control.sheetCnt+1 - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid) - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr) - - } - } - -} - -SocialCalc.WorkBookControlLoad = function(savestr){ - - var sheetsave; - - if (savestr == "") return; - - if (savestr) { - sheetsave = JSON.parse(savestr); - } else { - sheetsave = JSON.parse(SocialCalc.TestWorkBookSaveStr); - } - //alert(sheetsave.currentid+","+sheetsave.currentname) - - // first create a new workbook - var control = SocialCalc.GetCurrentWorkBookControl(); - - SocialCalc.WorkBookControlCreateNewBook(); - - // at this point there is one sheet, and 1 button - // create the sequence of buttons, and sheets - var firstrun = true; - var newbuttons = 0 - var sheetid = null; - var currentsheetid = sheetsave.currentid; - //alert("button="+newbuttons) - for (var sheet in sheetsave.sheetArr) { - //alert(sheet); - if (newbuttons > sheetsave.numsheets) { - break; - } - //alert("button="+newbuttons) - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - if (firstrun) { - firstrun=false; - // set the first button's name correctly - sheetid = control.currentSheetButton.id; - control.currentSheetButton.value = sheetsave.sheetArr[sheet].name; - SocialCalc.SheetBarButtonSetName(sheetid, sheetsave.sheetArr[sheet].name); - // set the sheet data for the first sheet which already exists - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, control.currentSheetButton.value); - // need to also set the formula cache - currentsheetid = sheetid; - } - else { - sheetid = "sheet"+(control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt+1; - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr); - } - if(sheetsave.sheetArr[sheet].hidden=="1") { - // unregister with mouse ? etc - var sheetbarbutton = document.getElementById("sbsb-" + sheetid); - sheetbarbutton.style.display="none"; - SocialCalc.SheetBarButtonActivate(sheet, false); - newbuttons= newbuttons - 1; - } - if (sheet == sheetsave.currentid) { - currentsheetid = sheetid - } - newbuttons = newbuttons + 1; - } - // Save the user script data - if (sheetsave.EditableCells) { - SocialCalc.EditableCells = {}; - for (var i in sheetsave.EditableCells) { - SocialCalc.EditableCells[i] = sheetsave.EditableCells[i]; - } - } - var timeoutFn = function() { - SocialCalc.WorkBookControlActivateSheet(currentsheetid); - }; - window.setTimeout(timeoutFn, 200); -} - - -SocialCalc.WorkBookControlRenameSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // do a popup to get the new name of the sheet - // the popup has an input element with submit, and cancel buttons - var element = document.getElementById(control.renameDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+'Rename-'+ currentsheet + '
    '+ - '' + 'Please ensure that you DO NOT have ANY spaces in the sheet name.' + '' + - '
    '+'
    '; - -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.renameDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - -var ele = document.getElementById("newSheetName"); -ele.focus(); -SocialCalc.CmdGotFocus(ele); - -} - -SocialCalc.WorkBookControlRenameSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.renameDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlRenameSheetSubmit = function(){ - -<<<<<<< HEAD - // this handles all the rename action - var ele = document.getElementById("newSheetName"); - //alert(ele.value); - var control = SocialCalc.GetCurrentWorkBookControl(); - if (ele.value.length == 0) { - ele.focus(); - return; - } - var oldname = control.currentSheetButton.value; - var newname = ele.value; - - - SocialCalc.WorkBookControlRenameSheetHide(); - // verify newname does not clash with any existing sheet name - // if so reject - for (var sheet in control.sheetButtonArr) { - if (control.sheetButtonArr[sheet].value == newname) { - alert(newname+" already exists"); - return; - } - } - - control.currentSheetButton.value = newname; -======= -// this handles all the rename action -var ele = document.getElementById("newSheetName"); -//console.log(ele.value); -var control = SocialCalc.GetCurrentWorkBookControl(); -if (ele.value.length == 0) { - ele.focus(); - return; -} -var oldname = control.currentSheetButton.value; -var newname = ele.value; -if(newname.indexOf(" ")!=-1) { - alert("A space was found in the new name. Please ensure that the new name has no sapces"); - return; - } -SocialCalc.WorkBookControlRenameSheetHide(); -// verify newname does not clash with any existing sheet name -// if so reject -var smallname = newname.toLowerCase();//converting to lower case to normalise -//console.log(smallname + " old " + ele.value); -for (var sheet in workbook.sheetArr) { - console.log(workbook.sheetArr[sheet].sheet.sheetname);//checking in sheetarr for repeated names - if (workbook.sheetArr[sheet].sheet.sheetname == smallname) { - alert(newname+" already exists"); - return; - } - } // variation of Case in letters of a sheet name will give an error if smallname is used. ->>>>>>> 7da15749846142f38019a2c86828e1c9a1a6de12 - -control.currentSheetButton.value = smallname; - -<<<<<<< HEAD - // perform a rename for formula references to this sheet in all the - // sheets in the workbook - control.workbook.RenameWorkBookSheet(oldname, ele.value, control.currentSheetButton.id); - - var cmdstr = "rensheet "+control.currentSheetButton.id+" "+oldname+" "+newname; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - -======= -SocialCalc.SheetBarButtonSetName (control.currentSheetButton.id, newname); - -// perform a rename for formula references to this sheet in all the -// sheets in the workbook -control.workbook.RenameWorkBookSheet(oldname, smallname, control.currentSheetButton.id); - - var cmdstr = "rensheet "+control.currentSheetButton.id+" "+oldname+" "+newname; - //console.log(cmdstr); - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - ->>>>>>> 7da15749846142f38019a2c86828e1c9a1a6de12 -} - -SocialCalc.WorkBookControlRenameSheetRemote = function(sheetid, oldname, newname) { - //console.log("rename sheet ",sheetid, oldname, newname) - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById("fooBar"); - var renbutton = document.getElementById(sheetid); - - renbutton.value = newname; - - SocialCalc.SheetBarButtonSetName(sheetid, newname); - -control.workbook.RenameWorkBookSheet(oldname, newname, sheetid); - -} - - -SocialCalc.WorkBookControlCreateNewBook = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // delete all the sheets except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - control.workbook.DeleteWorkBookSheet(control.sheetButtonArr[sheet].id, control.sheetButtonArr[sheet].value); - } - } - // Reset that 1 sheet - - control.workbook.LoadRenameWorkBookSheet(control.currentSheetButton.id, "", control.workbook.defaultsheetname) - - - // delete all the buttons except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.sheetButtonArr[sheet].id); - - var name = current.id; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - control.numSheets = control.numSheets - 1; - } - } - // rename that button - control.currentSheetButton.value = control.workbook.defaultsheetname; - //alert("done new workbook") -} - -SocialCalc.WorkBookControlNewBook = function() { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlCreateNewBook(); - control.workbook.RenderWorkBookSheet(); -} - - -SocialCalc.WorkBookControlMove = function(direction){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - return; - } - var sheetArr = control.sheetButtonArr; - var newSheetArr = {}; - var sheetid = control.currentSheetButton.id; - - var curr_button = document.getElementById(sheetid); - var curr_sb_button = document.getElementById("sbsb-"+sheetid); - var sib_button = null; - var sib_sb_button = null; - if (direction == "left") { - sib_button = curr_button.previousSibling; - sib_sb_button = curr_sb_button.previousSibling; - if(!sib_sb_button) { - alert("Cannot move leftmost Sheet further to the left"); - return; - } - } - else { - sib_button = curr_button.nextSibling; - sib_sb_button = curr_sb_button.nextSibling; - if(!sib_sb_button) { - alert("Cannot move rightmost Sheet further to the right"); - return; - } - } - var currid = sheetid; - var sibid = sib_button.id; - var parent = curr_button.parentNode; - var sb_parent = curr_sb_button.parentNode; - - var cloned = {}; - var clonedsb = {}; - for(button in sheetArr) { - clonedsb[button] = document.getElementById("sbsb-"+button); - cloned[button] = document.getElementById(button); - sb_parent.removeChild(document.getElementById("sbsb-"+button)); - parent.removeChild(document.getElementById(button)); - } - for(button in sheetArr) { - if(button != currid && button != sibid) { - newSheetArr[button] = sheetArr[button]; - sb_parent.appendChild(clonedsb[button]); - parent.appendChild(cloned[button]); - } - else if(button == currid) { - if (direction == "left") { - newSheetArr[currid] = sheetArr[currid]; - newSheetArr[sibid] = sheetArr[sibid]; - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - } else { - newSheetArr[sibid] = sheetArr[sibid]; - newSheetArr[currid] = sheetArr[currid]; - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - } - } - } - control.sheetButtonArr = newSheetArr; - SocialCalc.SheetBarButtonActivate(currid,true); -} - -SocialCalc.WorkBookControlMoveLeft = function(){ - SocialCalc.WorkBookControlMove("left"); -} -SocialCalc.WorkBookControlMoveRight = function(){ - SocialCalc.WorkBookControlMove("right"); -} - - - -SocialCalc.WorkBookControlCopySheet = function(){ - - //alert("in copy"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - control.workbook.CopyWorkBookSheet(control.currentSheetButton.id); - - alert("copied sheet:"+control.currentSheetButton.value); -} - -SocialCalc.WorkBookControlPasteSheet = function() { - - //alert("in paste"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - var oldid = control.currentSheetButton.id; - - SocialCalc.WorkBookControlAddSheet(false); - - var newid = control.currentSheetButton.id; - - //alert(newid+oldid); - - control.workbook.PasteWorkBookSheet(newid, oldid); - - var cmdstr = "addsheetstr"; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr, sheetstr: control.workbook.clipsheet.savestr}); - -} - -SocialCalc.SheetBar = function() { - this.baseDiv = document.getElementById("SocialCalc-sheetbar"); - - this.prebuttonsDiv = document.createElement("div"); - this.prebuttonsDiv.style.cssText = "display:inline;"; - this.prebuttonsDiv.innerHTML="        "; - this.prebuttonsDiv.id = "SocialCalc-sheetbar-prebuttons"; - - this.buttonsDiv = document.createElement("div"); - this.buttonsDiv.id = "SocialCalc-sheetbar-buttons"; - this.buttonsDiv.style.cssText = "display:inline;"; - - this.buttonActionsDiv = document.createElement("div"); - this.buttonActionsDiv.id = "SocialCalc-sheetbar-buttonactions"; - this.buttonActionsDiv.style.display = "inline"; - var addbutton = new SocialCalc.SheetBarSheetButton("sbsba-add", "sbsba-add", this.buttonActionsDiv, - {}, - { - MouseDown:function(){var abc=SocialCalc.WorkBookControlAddSheet(true);} - }, - "add-2.png"); - - - this.baseDiv.appendChild(this.prebuttonsDiv); - this.baseDiv.appendChild(this.buttonsDiv); - this.baseDiv.appendChild(this.buttonActionsDiv); -} - -// define a new class for sheetbarsheetbutton - -SocialCalc.SheetBarSheetButton = function(id, name, parentdiv, params, functions, img) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.name = name; - if (!img) { - this.ele.innerHTML = name; - this.ele.style.cssText = "font-size:small;display:inline;padding:5px 5px 2px 5px;border:1px solid #000;"; - imgele = document.createElement("img"); - imgele.id = id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - SocialCalc.ButtonRegister(this.ele, params, functions); - SocialCalc.ButtonRegister(imgele, params, functions); - } else { - var imgele = document.createElement("img"); - imgele.src = SocialCalc.Constants.defaultImagePrefix +img; - imgele.style.cssText = "width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - this.ele.style.cssText = "display:inline;padding:5px 5px 2px 5px;"; - SocialCalc.ButtonRegister(imgele, params, functions); - } - parentdiv.appendChild(this.ele); -} - -SocialCalc.SheetBarButtonActivate = function(id, active) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.isactive = active; - if (active) { - sbbutton.style.backgroundColor = "#FFF"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (!imgele) { - imgele = document.createElement("img"); - imgele.id = "sbsb-"+id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - } - sbbutton.appendChild(imgele); - SocialCalc.ButtonRegister(imgele, {}, { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(id);}, - Repeat:function(){}, - Disabled: function() {} - } ); - } - else { - sbbutton.style.backgroundColor = "#CCC"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (imgele) { - sbbutton.removeChild(imgele); - } - } - var menu = document.getElementById("sbsb-menu"); - if (menu && menu.style.display != "none") { - menu.style.display = "none"; - } -} - -SocialCalc.SheetBarButtonSetName = function(id, name) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.name = name; - sbbutton.innerHTML = name; - if (sbbutton.isactive) { - SocialCalc.SheetBarButtonActivate(id, true); - } -} - - -SocialCalc.SheetBarSheetButtonPress = function(id) { - //console.log("button press") - var sbbutton = document.getElementById("sbsb-"+id); - if (sbbutton && sbbutton.isactive) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) { - var sbsbm = new SocialCalc.SheetBarSheetButtonMenu("sbsb-menu", id); - } else { - menu.clickedsheetid = id; - if (menu.style.display == "none") { - menu.style.display = "inline"; - SocialCalc.SheetBarSheetButtonMenuPosition(menu, id); - } else { - menu.style.display = "none"; - } - } - - } else if (sbbutton) { - SocialCalc.WorkBookControlActivateSheet(id); - } - -} - - -// define a new class for sheetbarsheet button menu item - -SocialCalc.SheetBarSheetButtonMenuItem = function(id, t) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.innerHTML = t; - this.ele.className = ""; - this.ele.style.cssText = "padding:3px 4px;width:100px;height:20px;background-color:#FFF;"; - - var params = { - normalstyle: "backgroundColor:#FFF;", - downstyle: "backgroundColor:#CCC;", - hoverstyle: "backgroundColor:#CCC;"}; - var functions = {MouseDown:function(){SocialCalc.SheetBarMenuItemPress(id);}, - Repeat:function(){}, - Disabled: function() {}}; - - SocialCalc.ButtonRegister(this.ele, params, functions); - - SocialCalc.TouchRegister(this.ele, {SingleTap:functions.MouseDown}); - - return this.ele; - -} - -SocialCalc.SheetBarMenuItemPress = function(id) { - - var menu = document.getElementById("sbsb-menu"); - if (!menu) return; - - var clickedsheetid = menu.clickedsheetid; - - switch(id) { - case "sbsb_deletesheet": - //console.log("delete "+clickedsheetid); - SocialCalc.WorkBookControlDelSheet(); - break; - case "sbsb_hidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlHideSheet(); - break; - case "sbsb_unhidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlUnhideSheet(); - break; - case "sbsb_copysheet": - //console.log("copy "+clickedsheetid); - SocialCalc.WorkBookControlCopySheet(); - break; - case "sbsb_moveleft": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveLeft(); - break; - case "sbsb_moveright": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveRight(); - break; - - case "sbsb_pastesheet": - //console.log("paste "+clickedsheetid); - SocialCalc.WorkBookControlPasteSheet(); - break; - case "sbsb_renamesheet": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlRenameSheet(); - break; - case "sbsb_closemenu": - //console.log("rename "+clickedsheetid); - menu.style.display = "none"; - break; - default: - break; - } - menu.style.display = "none"; - -} - -// define a new class for sheetbarsheet button menu -SocialCalc.SheetBarSheetButtonMenu = function(id, clickedsheetid) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.className = ""; - this.ele.clickedsheetid = clickedsheetid; - this.ele.style.cssText = "border:1px solid #000;position:absolute;top:200px;left:0px;width=100px;z-index:120"; - - var ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_deletesheet"," Delete Sheet"); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_hidesheet"," Hide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_unhidesheet"," Unhide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_renamesheet"," Rename Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveleft"," Move Left "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveright"," Move Right "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_copysheet"," Copy Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_pastesheet"," Paste Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_closemenu"," Cancel"); - this.ele.appendChild(ele1); - - - SocialCalc.SheetBarSheetButtonMenuPosition(this.ele, clickedsheetid); - - //var clickedsheet = document.getElementById(clickedsheetid); - //var position = SocialCalc.GetElementPosition(clickedsheet); - //console.log(clickedsheet.offsetHeight,clickedsheet.offsetWidth,clickedsheet.offsetLeft, clickedsheet.offsetTop); - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.editor.toplevel.appendChild(this.ele); - - - - - -} - -// position the sheet menu -SocialCalc.SheetBarSheetButtonMenuPosition = function(menu, clickedsheetid) { - - var hlessbutton = document.getElementById("te_lessbuttonh"); - - //console.log(hlessbutton.style.top, hlessbutton.style.left); - - var sbbutton = document.getElementById("sbsb-"+clickedsheetid); - - //console.log(sbbutton.offsetLeft,clickedsheetid); - - var top = hlessbutton.style.top.slice(0,-2)-220; - var left = sbbutton.offsetLeft+7; - - menu.style.top = top+"px"; - menu.style.left = left+"px"; - - //console.log(menu.style.top, menu.style.left); -} - -SocialCalc.ScriptInfo = { - scripts : {}, - handle:null -}; - -SocialCalc.ScriptCheck = function(sheetid, coord, text) { -var commentstart = text.indexOf(""); -if ((commentstart != -1) && (commentend != -1)) { - script = text.slice(commentstart+10,commentend); - //alert(script); - SocialCalc.ScriptInfo.scripts[coord] = script; - if (SocialCalc.ScriptInfo.handle == null) { - SocialCalc.ScriptInfo.handle = - window.setTimeout(SocialCalc.EvalUserScripts,500); - } - //alert(coord+"-"+sheetid); -} -} - -SocialCalc.EvalUserScript = function(data) { - var head = document.getElementsByTagName("head")[0] || - document.documentElement; - - if (data == "") return; - - var script = document.createElement("script"); - - script.type = "text/javascript"; - try { - // doesn't work on ie... - script.appendChild(document.createTextNode(data)); - } catch(e) { - // IE has funky script nodes - script.text = data; - } - - head.insertBefore(script, head.firstChild); - head.removeChild(script); -} - -SocialCalc.EvalUserScripts = function() { -for (var cr in SocialCalc.ScriptInfo.scripts) { - SocialCalc.EvalUserScript(SocialCalc.ScriptInfo.scripts[cr]); - //console.log(cr,SocialCalc.ScriptInfo.scripts[cr]) -} -SocialCalc.ScriptInfo.handle = null; -SocialCalc.ScriptInfo.scripts = {}; -} - -SocialCalc.CallOutOnRenderCell = function(sheetobj, value, cr) { -var cell=sheetobj.cells[cr]; -if (!cell) return; -var valuetype = cell.valuetype || ""; // get type of value to determine formatting -var valuesubtype = valuetype.substring(1); -var sheetattribs=sheetobj.attribs; -valuetype = valuetype.charAt(0); -if (valuetype=="t") { - valueformat = sheetobj.valueformats[cell.textvalueformat-0] || sheetobj.valueformats[sheetattribs.defaulttextvalueformat-0] || ""; - if (valueformat == "text-html") {SocialCalc.ScriptCheck(sheetobj.sheetid,cr,value);} -} -} - -SocialCalc.GetCellDataValue = function(coord) { - - var sheetname = null; - var sheetid = ""; - var bindex = coord.indexOf("!"); - if (bindex != -1) { - sheetname = coord.slice(0,bindex); - coord = coord.slice(bindex+1); - //console.log(sheetname,coord) - } - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (sheetname == null) { - sheetid = control.currentSheetButton.id - } else { - sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - } - - if ((sheetid == null) || (sheetid == "")) { - return "0"; - } - - var sheetobj = control.workbook.sheetArr[sheetid].sheet - - var cell = sheetobj.cells[coord] - - if (cell) {return cell.datavalue;} else {return 0;} -} - -SocialCalc.GetCellDataArray = function(coordstr,sheetname) { - var vals = [] - var coords = coordstr.split(","); - if (sheetname == null) { sheetname=""; } - else { - sheetname = sheetname+"!"; - } - for (var c in coords) { - - vals.push(SocialCalc.GetCellDataValue(sheetname+coords[c])); - } - return vals; -} - -SocialCalc.UserScriptData = {} - - -SocialCalc.WorkBookRecalculateInfo = { - sheets : [], - calcorder: [], - current: 0, - pass: 0 -}; - -SocialCalc.WorkBookRecalculateAll = function() { - // do it from the last sheet to the first sheet - // using the recalc-done signal to trigger the next sheet - - // if already in the middle of a recalculate-all, ignore this. - if ((SocialCalc.WorkBookRecalculateInfo.current != 0) || - (SocialCalc.WorkBookRecalculateInfo.calcorder.length != 0) || - (SocialCalc.WorkBookRecalculateInfo.sheets.length != 0)) { - return; - } - - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - SocialCalc.WorkBookRecalculateInfo.current = 0; - - for (var sheet in control.workbook.sheetArr) { - SocialCalc.WorkBookRecalculateInfo.sheets.push(sheet); - } - - var i = 0; - for (var c=SocialCalc.WorkBookRecalculateInfo.sheets.length; - c>0; c--) { - SocialCalc.WorkBookRecalculateInfo.calcorder[i] = - SocialCalc.WorkBookRecalculateInfo.sheets[c-1]; - i++; - } - window.setTimeout(SocialCalc.WorkBookRecalculateStep,500); -} - -SocialCalc.WorkBookRecalculateStep = function() { - if (SocialCalc.WorkBookRecalculateInfo.current == - SocialCalc.WorkBookRecalculateInfo.calcorder.length) { - SocialCalc.WorkBookRecalculateInfo.current = 0; - SocialCalc.WorkBookRecalculateInfo.calcorder = []; - SocialCalc.WorkBookRecalculateInfo.sheets = []; - if (SocialCalc.WorkBookRecalculateInfo.pass == - 1) { - SocialCalc.WorkBookRecalculateInfo.pass = 0; - SocialCalc.SpinnerWaitHide(); - //alert("load done"); - return; - } else { - SocialCalc.WorkBookRecalculateInfo.pass++; - SocialCalc.WorkBookRecalculateAll(); - return; - } - } - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert("recalculate "+ - // SocialCalc.WorkBookRecalculateInfo.calcorder[ - // SocialCalc.WorkBookRecalculateInfo.current] - // ); - var sheetid = -SocialCalc.WorkBookRecalculateInfo.calcorder[ - SocialCalc.WorkBookRecalculateInfo.current]; - SocialCalc.WorkBookControlActivateSheet(sheetid); - SocialCalc.WorkBookRecalculateInfo.current++; - - - window.setTimeout(SocialCalc.WorkBookRecalculateStep,1000); -} - - -SocialCalc.SpinnerWaitCreate = function() { - // if the div exists already just use it - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - return; - } - var main = document.createElement("div"); - main.id = "waitloadingspinner"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - main.style.top = (vp.height/2)+"px"; - main.style.left = (vp.width/2)+"px"; - main.style.zIndex = 110; - - main.style.width='50px' - main.style.height = '50px' - main.innerHTML = 'Loading...'; - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.SpinnerWaitHide = function() { - // if the div exists already just use it - -var ele = document.getElementById("waitloadingspinner"); -if (ele) { - ele.innerHTML = ""; - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} -} - -SocialCalc.EditableCells = {}; -SocialCalc.EditableCells.allow = false; -SocialCalc.EditableCells.cells = {}; -SocialCalc.EditableCells.constraints = {}; - -SocialCalc.Callbacks.IsCellEditable = function(editor) { - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - - if (!(SocialCalc.EditableCells.allow)) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[cellname]) { - // by default all cells are editable - return true; - } - return false; -} - -SocialCalc.Callbacks.CheckConstraints = function(editor, value) -{ - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - var constraint = SocialCalc.EditableCells.constraints[cellname]; - //alert(JSON.stringify(constraint)) - if (constraint != null) { - switch (constraint[0]) { - case "numeric": - // check that value is numeric - var val = parseInt(value); - //alert(val) - if (isNaN(val)) { - alert("please input a number"); - return false; - } - - break; - case "percent": - break; - } - } - return true; -} - -// this is for checkmark toggling -SocialCalc.Callbacks.ToggleCell = function() -{ - // check what the current ecell is - var control = SocialCalc.GetCurrentWorkBookControl(); - - var editor = control.workbook.spreadsheet.editor; - - var cellname = editor.ecell.coord; - - var value = SocialCalc.GetCellDataValue(cellname); - - console.log(cellname) - console.log(value) - - var cmdstr = ""; - if (value.indexOf(" ") != -1) { - // set the value to the img value - //cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - - } else { - // set the value to a space - cmdstr = "set " + cellname + ' text t
     
    ' + "\n"; - } - - var sheetid = control.currentSheetButton.id - console.log(sheetid) - console.log(cmdstr) - cmd = {cmdtype:"scmd", id:sheetid, cmdstr: cmdstr, saveundo: false}; - control.ExecuteWorkBookControlCommand(cmd, false); - -} - - -SocialCalc.WorkbookControlCreateSheetHTML = function(sheetlist) { - - var context, div, ele; - - var result = ""; - - var control = SocialCalc.GetCurrentWorkBookControl(); - - div = document.createElement("div"); - - if (!sheetlist) { - context = new SocialCalc.RenderContext(spreadsheet.sheet); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - } else { - for (var sheetid in sheetlist) { - context = control.workbook.sheetArr[sheetid].context; - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - } - } - - result = div.innerHTML; - delete ele; - delete div; - return result; - - } \ No newline at end of file diff --git a/DeveloperAdoption/public/static/statements.js b/DeveloperAdoption/public/static/statements.js deleted file mode 100644 index bc2424a..0000000 --- a/DeveloperAdoption/public/static/statements.js +++ /dev/null @@ -1,573 +0,0 @@ - -if (!Aspiring) { - var Aspiring = {}; -} - - -Aspiring.tickerInfo = { - state: 1, - error: false, - errorReason: "", - loading: false, - ticker: "", - rawData: {}, - Income: "", - Balance: "", - CashFlow: "", - tickData: "", - datasources: [Aspiring.smartmoney, Aspiring.msn],//[Aspiring.smartmoney],//,Aspiring.msn],//, // Aspiring.smartmoney], - currentDataSource: 0, - isFinancialsSupported: 1, - options: null -}; - -Aspiring.getDataSource = function() { - return Aspiring.tickerInfo.datasources[Aspiring.tickerInfo.currentDataSource]; -}; - -Aspiring.clearTickerInfo = function() { - Aspiring.tickerInfo.error = false; - Aspiring.tickerInfo.errorReason = ""; - Aspiring.tickerInfo.loading = false; - Aspiring.tickerInfo.state = 1; - Aspiring.tickerInfo.ticker = ""; - Aspiring.tickerInfo.Income = ""; - Aspiring.tickerInfo.Balance = ""; - Aspiring.tickerInfo.CashFlow = ""; - Aspiring.tickerInfo.tickData = ""; - Aspiring.tickerInfo.currentDataSource = 0; - Aspiring.tickerInfo.options = null; - Aspiring.tickerInfo.rawData = {}; -} - -Aspiring.buildSheetSave = function() { - // build sheet data from the tickerInfo as a json object - // which can be embedded into the spreadsheet - - var sheetsave = {}; - sheetsave.numsheets = 4; - sheetsave.currentid = "sheet1"; - sheetsave.currentname = "data"; - sheetsave.sheetArr = {}; - - sheetsave.sheetArr.sheet1 = {}; - sheetsave.sheetArr.sheet1.sheetstr = {}; - sheetsave.sheetArr.sheet1.sheetstr.savestr = Aspiring.tickerInfo.tickData; - sheetsave.sheetArr.sheet1.name = "data"; - - sheetsave.sheetArr.sheet2 = {}; - sheetsave.sheetArr.sheet2.sheetstr = {}; - sheetsave.sheetArr.sheet2.sheetstr.savestr = Aspiring.tickerInfo.Balance; - sheetsave.sheetArr.sheet2.name = "balance"; - - sheetsave.sheetArr.sheet3 = {}; - sheetsave.sheetArr.sheet3.sheetstr = {}; - sheetsave.sheetArr.sheet3.sheetstr.savestr = Aspiring.tickerInfo.Income; - sheetsave.sheetArr.sheet3.name = "income"; - - sheetsave.sheetArr.sheet4 = {}; - sheetsave.sheetArr.sheet4.sheetstr = {}; - sheetsave.sheetArr.sheet4.sheetstr.savestr = Aspiring.tickerInfo.CashFlow; - sheetsave.sheetArr.sheet4.name = "cashflow"; - - - return sheetsave; - -} - -Aspiring.stripScripts = function(html) { - console.log("in strip scripts") - var out = html; - var ind = out.indexOf(''); - if (ind1 == -1) break; - out = out.slice(0,ind)+out.slice(ind1+8); - ind = out.indexOf(' - - - - test graph - - - - - - - - - - - - -
    editor goes here
    -
    - - - - - - diff --git a/DeveloperAdoption/public/static/testhighcharts.html b/DeveloperAdoption/public/static/testhighcharts.html deleted file mode 100644 index cdf6943..0000000 --- a/DeveloperAdoption/public/static/testhighcharts.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - -SocialCalc 0.8.1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - -
    -
    editor goes here
    -
    -
    - - - - - diff --git a/DeveloperAdoption/public/static/testsparklines.html b/DeveloperAdoption/public/static/testsparklines.html deleted file mode 100644 index 808a70f..0000000 --- a/DeveloperAdoption/public/static/testsparklines.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - -SocialCalc 0.8.1 - - - - - - - - - - - - - - - - - - - - -
    -
    - -
    -
    editor goes here
    -
    -
    - - - - - diff --git a/DeveloperAdoption/public/static/testworkbook.html b/DeveloperAdoption/public/static/testworkbook.html deleted file mode 100644 index b93f662..0000000 --- a/DeveloperAdoption/public/static/testworkbook.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - -SocialCalc 0.8.1 - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - -
    -
    editor goes here
    -
    -
    - - - - - diff --git a/DeveloperAdoption/public/static/urlJump.html b/DeveloperAdoption/public/static/urlJump.html deleted file mode 100644 index f94d9a9..0000000 --- a/DeveloperAdoption/public/static/urlJump.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/DeveloperAdoption/public/vercel.svg b/DeveloperAdoption/public/vercel.svg deleted file mode 100644 index d2f8422..0000000 --- a/DeveloperAdoption/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/DeveloperAdoption/tailwind.config.js b/DeveloperAdoption/tailwind.config.js deleted file mode 100644 index 78ebc4e..0000000 --- a/DeveloperAdoption/tailwind.config.js +++ /dev/null @@ -1,18 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: [ - "./pages/**/*.{js,ts,jsx,tsx,mdx}", - "./components/**/*.{js,ts,jsx,tsx,mdx}", - "./app/**/*.{js,ts,jsx,tsx,mdx}", - ], - theme: { - extend: { - backgroundImage: { - "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", - "gradient-conic": - "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", - }, - }, - }, - plugins: [], -}; diff --git a/FIL-RetroPGF.md b/FIL-RetroPGF.md deleted file mode 100644 index b65fa44..0000000 --- a/FIL-RetroPGF.md +++ /dev/null @@ -1,51 +0,0 @@ -# Public Goods Initiative – Web3 Billing and Invoicing System for Government Institutions - -**Project Category:** Public Goods / Web3 DApp - -**Project Description:** -A cross-platform Web3 billing and invoicing system for government universities and schools, implemented as Ionic and React apps with token-gated and non-gated access. The DApp integrates with Filecoin and Storacha for decentralized storage, enabling secure invoice saving, versioning, and email/CSV export features. It empowers institutions with transparency, reduces administrative costs, and ensures long-term integrity of invoicing data. - -**Impact since November 2024:** -- Enabled secure storage of invoices on Filecoin and Storacha, supporting both token-gated and non-gated access. -- Deployed PPT utility token across Filecoin, Optimism, Arbitrum, Polygon, and other chains to power DApp operations. -- Integrated subscription and email/export features for workflow automation. -- Provided cross-platform access via PWA, iOS, and Android using Ionic and React frameworks. - -## Repositories - -**Ionic Versions** -- No Token Gated: [fil-token-gated-dapp-de-storage](https://github.com/seetadev/fil-token-gated-dapp-de-storage) -- Token Gated: [fil-token-gated-dapp-storacha](https://github.com/seetadev/fil-token-gated-dapp-storacha) -- Email & Export with subscription alert (main): [Invoice-PPT-Subscribe-Storacha-Storage](https://github.com/seetadev/Invoice-PPT-Subscribe-Storacha-Storage/tree/main) -- Email & Export with subscription alert (v2): [Invoice-PPT-Subscribe-Storacha-Storage v2](https://github.com/seetadev/Invoice-PPT-Subscribe-Storacha-Storage/tree/v2) - -**React Versions** -- No Token Gated: [web3-medical-invoice-storacha](https://github.com/seetadev/web3-medical-invoice-storacha) -- Token Gated: [web3-invoice-token-gated-storacha](https://github.com/seetadev/web3-invoice-token-gated-storacha) - -**Forked Versions by Contributor Chaitu Tatipamula** -- Ionic & React forked repos available for both token-gated and non-gated access. - -## Vercel Deployments - -**Ionic Versions** -- No Token Gated: [https://fil-token-gated-dapp-de-storage.vercel.app](https://fil-token-gated-dapp-de-storage.vercel.app) -- Token Gated: [https://fil-token-gated-dapp-storacha.vercel.app](https://fil-token-gated-dapp-storacha.vercel.app) - -**React Versions** -- No Token Gated: [https://web3-medical-invoice-storacha.vercel.app](https://web3-medical-invoice-storacha.vercel.app) -- Token Gated: [https://web3-invoice-token-gated-storacha.vercel.app](https://web3-invoice-token-gated-storacha.vercel.app) - -## Screencasts / Demos -- **Ionic:** Upload & Retrieve, Email & Export, Subscription Test -- **React:** Pure React version, Token Gated Upload & Retrieve -- **Additional Attachments:** AI Agents_Invoice with Storacha storage - -## Filecoin Storage / Integration -- Filecoin Calibnet & Mainnet deployments with PPT token & Medical Invoice contract -- Filecoin Mainnet DApp: -- Contract addresses & Sushiswap liquidity pool details available in documentation. - -## Supporting Links & Documentation -- Deployment Instructions: [Contracts Repo](https://github.com/Chaitu-Tatipamula/Contracts.git) -- LIT KYC Module: [https://github.com/seetadev/web3-kyc-lit/tree/dev](https://github.com/seetadev/web3-kyc-lit/tree/dev) diff --git a/FUNDING.json b/FUNDING.json deleted file mode 100644 index 48d98a3..0000000 --- a/FUNDING.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "drips": { - "filecoin": { - "ownedBy": "0x856c29E91eb30b8D9154a74a543dcC8D970D5D15" - } - } -} diff --git a/Govt-Billing-Angular/.gitignore b/Govt-Billing-Angular/.gitignore deleted file mode 100644 index f1252e5..0000000 --- a/Govt-Billing-Angular/.gitignore +++ /dev/null @@ -1,31 +0,0 @@ -# Specifies intentionally untracked files to ignore when using Git -# http://git-scm.com/docs/gitignore - -*~ -*.sw[mnpcod] -.tmp -*.tmp -*.tmp.* -*.sublime-project -*.sublime-workspace -.DS_Store -Thumbs.db -UserInterfaceState.xcuserstate -$RECYCLE.BIN/ - -*.log -log.txt -npm-debug.log* - -/.idea -/.ionic -/.sass-cache -/.sourcemaps -/.versions -/.vscode -/coverage -/dist -node_modules -/platforms -/plugins -/www diff --git a/Govt-Billing-Angular/.gradle/5.6.4/fileChanges/last-build.bin b/Govt-Billing-Angular/.gradle/5.6.4/fileChanges/last-build.bin deleted file mode 100644 index f76dd23..0000000 Binary files a/Govt-Billing-Angular/.gradle/5.6.4/fileChanges/last-build.bin and /dev/null differ diff --git a/Govt-Billing-Angular/.gradle/5.6.4/fileHashes/fileHashes.lock b/Govt-Billing-Angular/.gradle/5.6.4/fileHashes/fileHashes.lock deleted file mode 100644 index 1a21ece..0000000 Binary files a/Govt-Billing-Angular/.gradle/5.6.4/fileHashes/fileHashes.lock and /dev/null differ diff --git a/Govt-Billing-Angular/.gradle/5.6.4/gc.properties b/Govt-Billing-Angular/.gradle/5.6.4/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/Govt-Billing-Angular/Android app apk.apk b/Govt-Billing-Angular/Android app apk.apk deleted file mode 100644 index 89bc275..0000000 Binary files a/Govt-Billing-Angular/Android app apk.apk and /dev/null differ diff --git a/Govt-Billing-Angular/README.md b/Govt-Billing-Angular/README.md deleted file mode 100644 index f2feb38..0000000 --- a/Govt-Billing-Angular/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# Govt Billing_v5 using Angular -Ionic v5 for Govt Billing app using Angular framework - -### Follow the following steps to run the Invoice Suite Billing App in your system: - -- **Install [Node & npm](https://ionicframework.com/docs/intro/environment#node-npm) on your system
    ** -Almost all tooling for modern JavaScript projects is based in [Node.js](https://ionicframework.com/docs/reference/glossary#node). The [download page](https://nodejs.org/en/download/) has prebuilt installation packages for all platforms. We recommend selecting the LTS version to ensure best compatibility. -Node is bundled with [npm](https://ionicframework.com/docs/reference/glossary#npm), the package manager for JavaScript. -To verify the installation, open a new terminal window and run: - - ``` - $ node --version - $ npm --version - ``` -- **Install [Git](https://ionicframework.com/docs/intro/environment#git)
    ** -Although not required, the version control system [Git](https://ionicframework.com/docs/reference/glossary#git) is highly recommended. -Git is often accompanied by a Git Host, such as [GitHub](https://github.com/), in which case additional setup is required. Follow the tutorial from the Git Host's documentation to set up Git: - - GitHub: [Set up Git](https://help.github.com/en/articles/set-up-git) - - GitLab: [Installing Git](https://docs.gitlab.com/ee/topics/git/how_to_install_git) - - Bitbucket: [Install Git](https://www.atlassian.com/git/tutorials/install-git) - - Otherwise, follow the [official installation instructions](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git). The command-line utility can be downloaded from the [download page](https://git-scm.com/downloads). -To verify the installation, open a new terminal window and run: - - ``` - $ git --version - ``` - -- **Install the [Ionic CLI](https://ionicframework.com/docs/intro/cli#install-the-ionic-cli)
    ** -Before proceeding, make sure your computer has [Node.js](https://ionicframework.com/docs/reference/glossary#node) installed. See [these instructions](https://ionicframework.com/docs/intro/environment) to set up an environment for Ionic. -Install the Ionic CLI with npm: - - ``` - $ npm install -g @ionic/cli - ``` -- **Install [Ionic Tooling](https://ionicframework.com/docs/angular/your-first-app#install-ionic-tooling)
    ** -Run the following in the command line terminal to install the Ionic CLI (`ionic`), `native-run`, used to run native binaries on devices and simulators/emulators, and `cordova-res`, used to generate native app icons and splash screens: - > To open a terminal in Visual Studio Code, go to Terminal -> New Terminal. - - ``` - $ npm install -g @ionic/cli native-run cordova-res - ``` -- **Go to the desired folder where you want to work on this app and clone this repository by :
    ** - ``` - git clone https URL of the repo - ``` - > Please setup your github account in the terminal to clone this private repository - -- **Run the following command to run the application in your browser:
    ** - ``` - $ ionic serve - ``` -- **To build an Android App:
    ** -Open the project folder in Terminal and run the following commands: - ``` - $ ionic build - ``` - If an folder named "android" doesn't exist already then run the following command else skip to next:
    - ``` - $ ionic cap add android - ```
    - android folder at the root of the project is created. It is an entirely standalone native projects that should be considered part of your Ionic app (i.e., check them into source control, edit them using their native tooling, etc.). -Every time you perform a build (e.g. `ionic build`) that updates your web directory (default: `www`), you'll need to copy those changes into your native projects: - - ``` - $ ionic cap copy - ``` - >Note: After making updates to the native portion of the code (such as adding a new plugin), use the `sync` command: - ``` - $ ionic cap sync - ``` -- **[Android Deployment](https://ionicframework.com/docs/angular/your-first-app/6-deploying-mobile#android-deployment)
    ** -Capacitor Android apps are configured and managed through Android Studio. Before running this app on an Android device, there's a couple of steps to complete. -First, run the Capacitor `open` command, which opens the native Android project in Android Studio: - - ``` - $ ionic cap open android - ``` - Within Android Studio, click the "Run" button, select the attached Android device, then click OK to build, install, and launch the app on your device. - -- **iOS Deployment:
    ** -Follow this link : [iOS Deployment for Ionic Apps](https://ionicframework.com/docs/angular/your-first-app/6-deploying-mobile#ios-deployment) - -- **Points to be noted:
    ** -The socialcalc package used here is pulled from my github repository, not from npm as the module required for the project is customized so I have fetched this module from my github repo - diff --git a/Govt-Billing-Angular/android/.gitignore b/Govt-Billing-Angular/android/.gitignore deleted file mode 100644 index 64a88fb..0000000 --- a/Govt-Billing-Angular/android/.gitignore +++ /dev/null @@ -1,91 +0,0 @@ -# NPM renames .gitignore to .npmignore -# In order to prevent that, we remove the initial "." -# And the CLI then renames it - -# Using Android gitignore template: https://github.com/github/gitignore/blob/master/Android.gitignore - -# Built application files -*.apk -*.ap_ -*.aab - -# Files for the ART/Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ -release/ - -# Gradle files -.gradle/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# IntelliJ -*.iml -.idea/workspace.xml -.idea/tasks.xml -.idea/gradle.xml -.idea/assetWizardSettings.xml -.idea/dictionaries -.idea/libraries -# Android Studio 3 in .gitignore file. -.idea/caches -.idea/modules.xml -# Comment next line if keeping position of elements in Navigation Editor is relevant for you -.idea/navEditor.xml - -# Keystore files -# Uncomment the following lines if you do not want to check your keystore files in. -#*.jks -#*.keystore - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild - -# Freeline -freeline.py -freeline/ -freeline_project_description.json - -# fastlane -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output -fastlane/readme.md - -# Version control -vcs.xml - -# lint -lint/intermediates/ -lint/generated/ -lint/outputs/ -lint/tmp/ -# lint/reports/ - -# Cordova plugins for Capacitor -capacitor-cordova-android-plugins - -# Copied web assets -app/src/main/assets/public diff --git a/Govt-Billing-Angular/android/.idea/codeStyles/Project.xml b/Govt-Billing-Angular/android/.idea/codeStyles/Project.xml deleted file mode 100644 index 681f41a..0000000 --- a/Govt-Billing-Angular/android/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - -
    - - - - xmlns:android - - ^$ - - - -
    -
    - - - - xmlns:.* - - ^$ - - - BY_NAME - -
    -
    - - - - .*:id - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:name - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - name - - ^$ - - - -
    -
    - - - - style - - ^$ - - - -
    -
    - - - - .* - - ^$ - - - BY_NAME - -
    -
    - - - - .* - - http://schemas.android.com/apk/res/android - - - ANDROID_ATTRIBUTE_ORDER - -
    -
    - - - - .* - - .* - - - BY_NAME - -
    -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/Govt-Billing-Angular/android/.idea/jarRepositories.xml b/Govt-Billing-Angular/android/.idea/jarRepositories.xml deleted file mode 100644 index e34606c..0000000 --- a/Govt-Billing-Angular/android/.idea/jarRepositories.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Govt-Billing-Angular/android/.idea/misc.xml b/Govt-Billing-Angular/android/.idea/misc.xml deleted file mode 100644 index 7bfef59..0000000 --- a/Govt-Billing-Angular/android/.idea/misc.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/Govt-Billing-Angular/android/.idea/runConfigurations.xml b/Govt-Billing-Angular/android/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/Govt-Billing-Angular/android/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Govt-Billing-Angular/android/app/.npmignore b/Govt-Billing-Angular/android/app/.npmignore deleted file mode 100644 index 043df80..0000000 --- a/Govt-Billing-Angular/android/app/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -/build/* -!/build/.npmkeep diff --git a/Govt-Billing-Angular/android/app/build.gradle b/Govt-Billing-Angular/android/app/build.gradle deleted file mode 100644 index 4ceda60..0000000 --- a/Govt-Billing-Angular/android/app/build.gradle +++ /dev/null @@ -1,46 +0,0 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion rootProject.ext.compileSdkVersion - defaultConfig { - applicationId "com.mridulchaba.com" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -repositories { - flatDir{ - dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' - } -} - -dependencies { - implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" - implementation project(':capacitor-android') - testImplementation "junit:junit:$junitVersion" - androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" - androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" - implementation project(':capacitor-cordova-android-plugins') -} - -apply from: 'capacitor.build.gradle' - -try { - def servicesJSON = file('google-services.json') - if (servicesJSON.text) { - apply plugin: 'com.google.gms.google-services' - } -} catch(Exception e) { - logger.warn("google-services.json not found, google-services plugin not applied. Push Notifications won't work") -} \ No newline at end of file diff --git a/Govt-Billing-Angular/android/app/capacitor.build.gradle b/Govt-Billing-Angular/android/app/capacitor.build.gradle deleted file mode 100644 index 8ac573f..0000000 --- a/Govt-Billing-Angular/android/app/capacitor.build.gradle +++ /dev/null @@ -1,22 +0,0 @@ -// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN - -android { - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } -} - -apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" -dependencies { - - implementation "com.android.support:support-v4:27.+" - implementation "com.android.support:support-v4:27.+" - implementation "com.android.support:support-v4:27.+" - implementation "com.android.support:support-v4:27.+" -} - - -if (hasProperty('postBuildExtras')) { - postBuildExtras() -} diff --git a/Govt-Billing-Angular/android/app/proguard-rules.pro b/Govt-Billing-Angular/android/app/proguard-rules.pro deleted file mode 100644 index f1b4245..0000000 --- a/Govt-Billing-Angular/android/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/Govt-Billing-Angular/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/Govt-Billing-Angular/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java deleted file mode 100644 index 8834b0a..0000000 --- a/Govt-Billing-Angular/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.getcapacitor.myapp; - -import android.content.Context; - -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() throws Exception { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - - assertEquals("com.getcapacitor.app", appContext.getPackageName()); - } -} diff --git a/Govt-Billing-Angular/android/app/src/main/AndroidManifest.xml b/Govt-Billing-Angular/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index de4d615..0000000 --- a/Govt-Billing-Angular/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Govt-Billing-Angular/android/app/src/main/assets/capacitor.config.json b/Govt-Billing-Angular/android/app/src/main/assets/capacitor.config.json deleted file mode 100644 index 69d2687..0000000 --- a/Govt-Billing-Angular/android/app/src/main/assets/capacitor.config.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "appId": "com.mridulchaba.com", - "appName": "MyApp", - "bundledWebRuntime": false, - "npmClient": "npm", - "webDir": "www", - "plugins": { - "SplashScreen": { - "launchShowDuration": 0 - } - }, - "cordova": { - "preferences": { - "ScrollEnabled": "false", - "android-minSdkVersion": "19", - "BackupWebStorage": "none", - "SplashMaintainAspectRatio": "true", - "FadeSplashScreenDuration": "300", - "SplashShowOnlyFirstTime": "false", - "SplashScreen": "screen", - "SplashScreenDelay": "3000" - } - } -} diff --git a/Govt-Billing-Angular/android/app/src/main/java/com/mridulchaba/com/MainActivity.java b/Govt-Billing-Angular/android/app/src/main/java/com/mridulchaba/com/MainActivity.java deleted file mode 100644 index a664b2f..0000000 --- a/Govt-Billing-Angular/android/app/src/main/java/com/mridulchaba/com/MainActivity.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.mridulchaba.com; - -import android.os.Bundle; - -import com.getcapacitor.BridgeActivity; -import com.getcapacitor.Plugin; - -import java.util.ArrayList; - -public class MainActivity extends BridgeActivity { - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // Initializes the Bridge - this.init(savedInstanceState, new ArrayList>() {{ - // Additional plugins you've installed go here - // Ex: add(TotallyAwesomePlugin.class); - }}); - } -} diff --git a/Govt-Billing-Angular/android/app/src/main/res/drawable-land-hdpi/splash.png b/Govt-Billing-Angular/android/app/src/main/res/drawable-land-hdpi/splash.png deleted file mode 100644 index e31573b..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/drawable-land-hdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/drawable-land-mdpi/splash.png b/Govt-Billing-Angular/android/app/src/main/res/drawable-land-mdpi/splash.png deleted file mode 100644 index f7a6492..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/drawable-land-mdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/drawable-land-xhdpi/splash.png b/Govt-Billing-Angular/android/app/src/main/res/drawable-land-xhdpi/splash.png deleted file mode 100644 index 8077255..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/drawable-land-xhdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/Govt-Billing-Angular/android/app/src/main/res/drawable-land-xxhdpi/splash.png deleted file mode 100644 index 14c6c8f..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/drawable-land-xxhdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/Govt-Billing-Angular/android/app/src/main/res/drawable-land-xxxhdpi/splash.png deleted file mode 100644 index 244ca25..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/drawable-land-xxxhdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/drawable-port-hdpi/splash.png b/Govt-Billing-Angular/android/app/src/main/res/drawable-port-hdpi/splash.png deleted file mode 100644 index 74faaa5..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/drawable-port-hdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/drawable-port-mdpi/splash.png b/Govt-Billing-Angular/android/app/src/main/res/drawable-port-mdpi/splash.png deleted file mode 100644 index e944f4a..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/drawable-port-mdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/drawable-port-xhdpi/splash.png b/Govt-Billing-Angular/android/app/src/main/res/drawable-port-xhdpi/splash.png deleted file mode 100644 index 564a82f..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/drawable-port-xhdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/Govt-Billing-Angular/android/app/src/main/res/drawable-port-xxhdpi/splash.png deleted file mode 100644 index bfabe68..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/drawable-port-xxhdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/Govt-Billing-Angular/android/app/src/main/res/drawable-port-xxxhdpi/splash.png deleted file mode 100644 index 6929071..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/drawable-port-xxxhdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Govt-Billing-Angular/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index c7bd21d..0000000 --- a/Govt-Billing-Angular/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/Govt-Billing-Angular/android/app/src/main/res/drawable/ic_launcher_background.xml b/Govt-Billing-Angular/android/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index d5fccc5..0000000 --- a/Govt-Billing-Angular/android/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Govt-Billing-Angular/android/app/src/main/res/drawable/splash.png b/Govt-Billing-Angular/android/app/src/main/res/drawable/splash.png deleted file mode 100644 index f7a6492..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/drawable/splash.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/layout/activity_main.xml b/Govt-Billing-Angular/android/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index b5ad138..0000000 --- a/Govt-Billing-Angular/android/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Govt-Billing-Angular/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 036d09b..0000000 --- a/Govt-Billing-Angular/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Govt-Billing-Angular/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 036d09b..0000000 --- a/Govt-Billing-Angular/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index c023e50..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index 2127973..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index b441f37..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 72905b8..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index 8ed0605..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 9502e47..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 4d1e077..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index df0f158..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 853db04..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 6cdf97c..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 2960cbb..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 8e3093a..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 46de6e2..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index d2ea9ab..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index a40d73e..0000000 Binary files a/Govt-Billing-Angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/Govt-Billing-Angular/android/app/src/main/res/values/ic_launcher_background.xml b/Govt-Billing-Angular/android/app/src/main/res/values/ic_launcher_background.xml deleted file mode 100644 index c5d5899..0000000 --- a/Govt-Billing-Angular/android/app/src/main/res/values/ic_launcher_background.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #FFFFFF - \ No newline at end of file diff --git a/Govt-Billing-Angular/android/app/src/main/res/values/strings.xml b/Govt-Billing-Angular/android/app/src/main/res/values/strings.xml deleted file mode 100644 index fb2c8ea..0000000 --- a/Govt-Billing-Angular/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - MyApp - MyApp - com.mridulchaba.com - com.mridulchaba.com - diff --git a/Govt-Billing-Angular/android/app/src/main/res/values/styles.xml b/Govt-Billing-Angular/android/app/src/main/res/values/styles.xml deleted file mode 100644 index bb45498..0000000 --- a/Govt-Billing-Angular/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/Govt-Billing-Angular/android/app/src/main/res/xml/config.xml b/Govt-Billing-Angular/android/app/src/main/res/xml/config.xml deleted file mode 100644 index b89ea1d..0000000 --- a/Govt-Billing-Angular/android/app/src/main/res/xml/config.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Govt-Billing-Angular/android/app/src/main/res/xml/file_paths.xml b/Govt-Billing-Angular/android/app/src/main/res/xml/file_paths.xml deleted file mode 100644 index bd0c4d8..0000000 --- a/Govt-Billing-Angular/android/app/src/main/res/xml/file_paths.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Govt-Billing-Angular/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/Govt-Billing-Angular/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java deleted file mode 100644 index 4a45edf..0000000 --- a/Govt-Billing-Angular/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.getcapacitor.myapp; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() throws Exception { - assertEquals(4, 2 + 2); - } -} diff --git a/Govt-Billing-Angular/android/build.gradle b/Govt-Billing-Angular/android/build.gradle deleted file mode 100644 index 979d9dd..0000000 --- a/Govt-Billing-Angular/android/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - - repositories { - google() - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:4.0.0' - classpath 'com.google.gms:google-services:4.3.3' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -apply from: "variables.gradle" - -allprojects { - repositories { - google() - jcenter() - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/Govt-Billing-Angular/android/capacitor.settings.gradle b/Govt-Billing-Angular/android/capacitor.settings.gradle deleted file mode 100644 index 9a5fa87..0000000 --- a/Govt-Billing-Angular/android/capacitor.settings.gradle +++ /dev/null @@ -1,3 +0,0 @@ -// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN -include ':capacitor-android' -project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') diff --git a/Govt-Billing-Angular/android/gradle.properties b/Govt-Billing-Angular/android/gradle.properties deleted file mode 100644 index 2dbcb07..0000000 --- a/Govt-Billing-Angular/android/gradle.properties +++ /dev/null @@ -1,21 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true - -# Supports AndroidX -android.useAndroidX=true -android.enableJetifier=true \ No newline at end of file diff --git a/Govt-Billing-Angular/android/gradle/wrapper/gradle-wrapper.jar b/Govt-Billing-Angular/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 13372ae..0000000 Binary files a/Govt-Billing-Angular/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/Govt-Billing-Angular/android/gradle/wrapper/gradle-wrapper.properties b/Govt-Billing-Angular/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 3953a3a..0000000 --- a/Govt-Billing-Angular/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Wed Jul 08 18:17:30 IST 2020 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/Govt-Billing-Angular/android/gradlew b/Govt-Billing-Angular/android/gradlew deleted file mode 100644 index 9d82f78..0000000 --- a/Govt-Billing-Angular/android/gradlew +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/Govt-Billing-Angular/android/gradlew.bat b/Govt-Billing-Angular/android/gradlew.bat deleted file mode 100644 index 8a0b282..0000000 --- a/Govt-Billing-Angular/android/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/Govt-Billing-Angular/android/settings.gradle b/Govt-Billing-Angular/android/settings.gradle deleted file mode 100644 index 3b4431d..0000000 --- a/Govt-Billing-Angular/android/settings.gradle +++ /dev/null @@ -1,5 +0,0 @@ -include ':app' -include ':capacitor-cordova-android-plugins' -project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') - -apply from: 'capacitor.settings.gradle' \ No newline at end of file diff --git a/Govt-Billing-Angular/android/variables.gradle b/Govt-Billing-Angular/android/variables.gradle deleted file mode 100644 index acfd26c..0000000 --- a/Govt-Billing-Angular/android/variables.gradle +++ /dev/null @@ -1,16 +0,0 @@ -ext { - minSdkVersion = 21 - compileSdkVersion = 29 - targetSdkVersion = 29 - androidxAppCompatVersion = '1.1.0' - androidxCoreVersion = '1.2.0' - androidxMaterialVersion = '1.1.0-rc02' - androidxBrowserVersion = '1.2.0' - androidxLocalbroadcastmanagerVersion = '1.0.0' - firebaseMessagingVersion = '20.1.2' - playServicesLocationVersion = '17.0.0' - junitVersion = '4.12' - androidxJunitVersion = '1.1.1' - androidxEspressoCoreVersion = '3.2.0' - cordovaAndroidVersion = '7.0.0' -} \ No newline at end of file diff --git a/Govt-Billing-Angular/angular.json b/Govt-Billing-Angular/angular.json deleted file mode 100644 index 784b4bf..0000000 --- a/Govt-Billing-Angular/angular.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "defaultProject": "app", - "newProjectRoot": "projects", - "projects": { - "app": { - "root": "", - "sourceRoot": "src", - "projectType": "application", - "prefix": "app", - "schematics": {}, - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "outputPath": "www", - "index": "src/index.html", - "main": "src/main.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "tsconfig.app.json", - "assets": [ - { - "glob": "**/*", - "input": "src/assets", - "output": "assets" - }, - { - "glob": "**/*.svg", - "input": "node_modules/ionicons/dist/ionicons/svg", - "output": "./svg" - } - ], - "styles": [ - { - "input": "src/theme/variables.scss" - }, - { - "input": "src/global.scss" - } - ], - "scripts": [] - }, - "configurations": { - "production": { - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "extractCss": true, - "namedChunks": false, - "aot": true, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "budgets": [ - { - "type": "initial", - "maximumWarning": "2mb", - "maximumError": "5mb" - } - ] - }, - "ci": { - "progress": false - } - } - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "app:build" - }, - "configurations": { - "production": { - "browserTarget": "app:build:production" - }, - "ci": { - "progress": false - } - } - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "app:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "main": "src/test.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "tsconfig.spec.json", - "karmaConfig": "karma.conf.js", - "styles": [], - "scripts": [], - "assets": [ - { - "glob": "favicon.ico", - "input": "src/", - "output": "/" - }, - { - "glob": "**/*", - "input": "src/assets", - "output": "/assets" - } - ] - }, - "configurations": { - "ci": { - "progress": false, - "watch": false - } - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": [ - "tsconfig.app.json", - "tsconfig.spec.json", - "e2e/tsconfig.json" - ], - "exclude": ["**/node_modules/**"] - } - }, - "e2e": { - "builder": "@angular-devkit/build-angular:protractor", - "options": { - "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "app:serve" - }, - "configurations": { - "production": { - "devServerTarget": "app:serve:production" - }, - "ci": { - "devServerTarget": "app:serve:ci" - } - } - }, - "ionic-cordova-build": { - "builder": "@ionic/angular-toolkit:cordova-build", - "options": { - "browserTarget": "app:build" - }, - "configurations": { - "production": { - "browserTarget": "app:build:production" - } - } - }, - "ionic-cordova-serve": { - "builder": "@ionic/angular-toolkit:cordova-serve", - "options": { - "cordovaBuildTarget": "app:ionic-cordova-build", - "devServerTarget": "app:serve" - }, - "configurations": { - "production": { - "cordovaBuildTarget": "app:ionic-cordova-build:production", - "devServerTarget": "app:serve:production" - } - } - } - } - } - }, - "cli": { - "defaultCollection": "@ionic/angular-toolkit" - }, - "schematics": { - "@ionic/angular-toolkit:component": { - "styleext": "scss" - }, - "@ionic/angular-toolkit:page": { - "styleext": "scss" - } - } -} diff --git a/Govt-Billing-Angular/browserslist b/Govt-Billing-Angular/browserslist deleted file mode 100644 index b15c7fa..0000000 --- a/Govt-Billing-Angular/browserslist +++ /dev/null @@ -1,12 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -> 0.5% -last 2 versions -Firefox ESR -not dead -not IE 9-11 # For IE 9-11 support, remove 'not'. diff --git a/Govt-Billing-Angular/capacitor.config.json b/Govt-Billing-Angular/capacitor.config.json deleted file mode 100644 index 69d2687..0000000 --- a/Govt-Billing-Angular/capacitor.config.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "appId": "com.mridulchaba.com", - "appName": "MyApp", - "bundledWebRuntime": false, - "npmClient": "npm", - "webDir": "www", - "plugins": { - "SplashScreen": { - "launchShowDuration": 0 - } - }, - "cordova": { - "preferences": { - "ScrollEnabled": "false", - "android-minSdkVersion": "19", - "BackupWebStorage": "none", - "SplashMaintainAspectRatio": "true", - "FadeSplashScreenDuration": "300", - "SplashShowOnlyFirstTime": "false", - "SplashScreen": "screen", - "SplashScreenDelay": "3000" - } - } -} diff --git a/Govt-Billing-Angular/config.xml b/Govt-Billing-Angular/config.xml deleted file mode 100644 index de828b6..0000000 --- a/Govt-Billing-Angular/config.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - MyApp - An awesome Ionic/Cordova app. - Ionic Framework Team - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Govt-Billing-Angular/e2e/protractor.conf.js b/Govt-Billing-Angular/e2e/protractor.conf.js deleted file mode 100644 index b95b8f5..0000000 --- a/Govt-Billing-Angular/e2e/protractor.conf.js +++ /dev/null @@ -1,28 +0,0 @@ -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const { SpecReporter } = require('jasmine-spec-reporter'); - -exports.config = { - allScriptsTimeout: 11000, - specs: [ - './src/**/*.e2e-spec.ts' - ], - capabilities: { - 'browserName': 'chrome' - }, - directConnect: true, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function() {} - }, - onPrepare() { - require('ts-node').register({ - project: require('path').join(__dirname, './tsconfig.json') - }); - jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); - } -}; diff --git a/Govt-Billing-Angular/e2e/src/app.e2e-spec.ts b/Govt-Billing-Angular/e2e/src/app.e2e-spec.ts deleted file mode 100644 index 33efa08..0000000 --- a/Govt-Billing-Angular/e2e/src/app.e2e-spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { AppPage } from './app.po'; - -describe('new App', () => { - let page: AppPage; - - beforeEach(() => { - page = new AppPage(); - }); - - it('should be blank', () => { - page.navigateTo(); - expect(page.getParagraphText()).toContain('Start with Ionic UI Components'); - }); -}); diff --git a/Govt-Billing-Angular/e2e/src/app.po.ts b/Govt-Billing-Angular/e2e/src/app.po.ts deleted file mode 100644 index c121fd9..0000000 --- a/Govt-Billing-Angular/e2e/src/app.po.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { browser, by, element } from 'protractor'; - -export class AppPage { - navigateTo() { - return browser.get('/'); - } - - getParagraphText() { - return element(by.deepCss('app-root ion-content')).getText(); - } -} diff --git a/Govt-Billing-Angular/e2e/tsconfig.json b/Govt-Billing-Angular/e2e/tsconfig.json deleted file mode 100644 index 77d311e..0000000 --- a/Govt-Billing-Angular/e2e/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/app", - "module": "commonjs", - "target": "es5", - "types": [ - "jasmine", - "jasminewd2", - "node" - ] - } -} diff --git a/Govt-Billing-Angular/ionic.config.json b/Govt-Billing-Angular/ionic.config.json deleted file mode 100644 index d42347e..0000000 --- a/Govt-Billing-Angular/ionic.config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "BlockchainBilling_v5", - "integrations": { - "capacitor": {}, - "cordova": {} - }, - "type": "angular" -} diff --git a/Govt-Billing-Angular/ios/.gitignore b/Govt-Billing-Angular/ios/.gitignore deleted file mode 100644 index 0f29771..0000000 --- a/Govt-Billing-Angular/ios/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# NPM renames .gitignore to .npmignore -# In order to prevent that, we remove the initial "." -# And the CLI then renames it - -App/build -App/Pods -App/public -App/Podfile.lock -xcuserdata - -# Cordova plugins for Capacitor -capacitor-cordova-ios-plugins - diff --git a/Govt-Billing-Angular/ios/App/App.xcodeproj/project.pbxproj b/Govt-Billing-Angular/ios/App/App.xcodeproj/project.pbxproj deleted file mode 100644 index a0b3ac5..0000000 --- a/Govt-Billing-Angular/ios/App/App.xcodeproj/project.pbxproj +++ /dev/null @@ -1,418 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 48; - objects = { - -/* Begin PBXBuildFile section */ - 2FAD9763203C412B000D30F8 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2FAD9762203C412B000D30F8 /* config.xml */; }; - 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 50379B222058CBB4000EE86E /* capacitor.config.json */; }; - 504EC3081FED79650016851F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504EC3071FED79650016851F /* AppDelegate.swift */; }; - 504EC30D1FED79650016851F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30B1FED79650016851F /* Main.storyboard */; }; - 504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; }; - 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; - 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; - A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = ""; }; - 50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = ""; }; - 504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 504EC3071FED79650016851F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 504EC30C1FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 504EC30E1FED79650016851F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = SOURCE_ROOT; }; - AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = ""; }; - FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 504EC3011FED79650016851F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */ = { - isa = PBXGroup; - children = ( - AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 504EC2FB1FED79650016851F = { - isa = PBXGroup; - children = ( - 504EC3061FED79650016851F /* App */, - 504EC3051FED79650016851F /* Products */, - 7F8756D8B27F46E3366F6CEA /* Pods */, - 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */, - ); - sourceTree = ""; - }; - 504EC3051FED79650016851F /* Products */ = { - isa = PBXGroup; - children = ( - 504EC3041FED79650016851F /* App.app */, - ); - name = Products; - sourceTree = ""; - }; - 504EC3061FED79650016851F /* App */ = { - isa = PBXGroup; - children = ( - 50379B222058CBB4000EE86E /* capacitor.config.json */, - 504EC3071FED79650016851F /* AppDelegate.swift */, - 504EC30B1FED79650016851F /* Main.storyboard */, - 504EC30E1FED79650016851F /* Assets.xcassets */, - 504EC3101FED79650016851F /* LaunchScreen.storyboard */, - 504EC3131FED79650016851F /* Info.plist */, - 2FAD9762203C412B000D30F8 /* config.xml */, - 50B271D01FEDC1A000F3C39B /* public */, - ); - path = App; - sourceTree = ""; - }; - 7F8756D8B27F46E3366F6CEA /* Pods */ = { - isa = PBXGroup; - children = ( - FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */, - AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 504EC3031FED79650016851F /* App */ = { - isa = PBXNativeTarget; - buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */; - buildPhases = ( - 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */, - 504EC3001FED79650016851F /* Sources */, - 504EC3011FED79650016851F /* Frameworks */, - 504EC3021FED79650016851F /* Resources */, - 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */, - E46B1E0B173BB3FF0376FE0B /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = App; - productName = App; - productReference = 504EC3041FED79650016851F /* App.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 504EC2FC1FED79650016851F /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 0920; - TargetAttributes = { - 504EC3031FED79650016851F = { - CreatedOnToolsVersion = 9.2; - LastSwiftMigration = 1100; - ProvisioningStyle = Automatic; - }; - }; - }; - buildConfigurationList = 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */; - compatibilityVersion = "Xcode 8.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 504EC2FB1FED79650016851F; - productRefGroup = 504EC3051FED79650016851F /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 504EC3031FED79650016851F /* App */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 504EC3021FED79650016851F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */, - 50B271D11FEDC1A000F3C39B /* public in Resources */, - 504EC30F1FED79650016851F /* Assets.xcassets in Resources */, - 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */, - 504EC30D1FED79650016851F /* Main.storyboard in Resources */, - 2FAD9763203C412B000D30F8 /* config.xml in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - E46B1E0B173BB3FF0376FE0B /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 504EC3001FED79650016851F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 504EC3081FED79650016851F /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 504EC30B1FED79650016851F /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 504EC30C1FED79650016851F /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 504EC3101FED79650016851F /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 504EC3111FED79650016851F /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 504EC3141FED79650016851F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 504EC3151FED79650016851F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 504EC3171FED79650016851F /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = App/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; - PRODUCT_BUNDLE_IDENTIFIER = com.mridulchaba.com; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG USE_PUSH"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 504EC3181FED79650016851F /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = App/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.mridulchaba.com; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = USE_PUSH; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 504EC3141FED79650016851F /* Debug */, - 504EC3151FED79650016851F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 504EC3171FED79650016851F /* Debug */, - 504EC3181FED79650016851F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 504EC2FC1FED79650016851F /* Project object */; -} diff --git a/Govt-Billing-Angular/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Govt-Billing-Angular/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 42daef8..0000000 --- a/Govt-Billing-Angular/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Govt-Billing-Angular/ios/App/App.xcworkspace/contents.xcworkspacedata b/Govt-Billing-Angular/ios/App/App.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index b301e82..0000000 --- a/Govt-Billing-Angular/ios/App/App.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/Govt-Billing-Angular/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Govt-Billing-Angular/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/Govt-Billing-Angular/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/Govt-Billing-Angular/ios/App/App/AppDelegate.swift b/Govt-Billing-Angular/ios/App/App/AppDelegate.swift deleted file mode 100644 index 92c0fc1..0000000 --- a/Govt-Billing-Angular/ios/App/App/AppDelegate.swift +++ /dev/null @@ -1,74 +0,0 @@ -import UIKit -import Capacitor - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { - // Called when the app was launched with a url. Feel free to add additional processing here, - // but if you want the App API to support tracking app url opens, make sure to keep this call - return CAPBridge.handleOpenUrl(url, options) - } - - func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { - // Called when the app was launched with an activity, including Universal Links. - // Feel free to add additional processing here, but if you want the App API to support - // tracking app url opens, make sure to keep this call - return CAPBridge.handleContinueActivity(userActivity, restorationHandler) - } - - override func touchesBegan(_ touches: Set, with event: UIEvent?) { - super.touchesBegan(touches, with: event) - - let statusBarRect = UIApplication.shared.statusBarFrame - guard let touchPoint = event?.allTouches?.first?.location(in: self.window) else { return } - - if statusBarRect.contains(touchPoint) { - NotificationCenter.default.post(CAPBridge.statusBarTappedNotification) - } - } - - #if USE_PUSH - - func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { - NotificationCenter.default.post(name: Notification.Name(CAPNotifications.DidRegisterForRemoteNotificationsWithDeviceToken.name()), object: deviceToken) - } - - func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { - NotificationCenter.default.post(name: Notification.Name(CAPNotifications.DidFailToRegisterForRemoteNotificationsWithError.name()), object: error) - } - -#endif - -} - diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png deleted file mode 100644 index 2f50374..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png deleted file mode 100644 index dd72c1c..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png deleted file mode 100644 index dd72c1c..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png deleted file mode 100644 index 7fbf0a8..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png deleted file mode 100644 index f996ea1..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png deleted file mode 100644 index bb2935f..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png deleted file mode 100644 index bb2935f..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png deleted file mode 100644 index 21d16e5..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png deleted file mode 100644 index dd72c1c..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png deleted file mode 100644 index ff07545..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png deleted file mode 100644 index ff07545..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png deleted file mode 100644 index 3401fa8..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png deleted file mode 100644 index adf6ba0..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png deleted file mode 100644 index ffd0da7..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png deleted file mode 100644 index 90aea7c..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png deleted file mode 100644 index 2f5eafb..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png deleted file mode 100644 index 89c8d04..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png deleted file mode 100644 index ef541c9..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 90eea7e..0000000 --- a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "AppIcon-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "AppIcon-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "AppIcon-29x29@2x-1.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "AppIcon-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "AppIcon-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "AppIcon-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "AppIcon-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "AppIcon-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "AppIcon-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "AppIcon-20x20@2x-1.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "AppIcon-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "AppIcon-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "AppIcon-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "AppIcon-40x40@2x-1.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "AppIcon-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "AppIcon-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "AppIcon-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "AppIcon-512@2x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Contents.json b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json deleted file mode 100644 index d7d96a6..0000000 --- a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "splash-2732x2732-2.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "splash-2732x2732-1.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "splash-2732x2732.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png deleted file mode 100644 index 33ea6c9..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png deleted file mode 100644 index 33ea6c9..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png b/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png deleted file mode 100644 index 33ea6c9..0000000 Binary files a/Govt-Billing-Angular/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png and /dev/null differ diff --git a/Govt-Billing-Angular/ios/App/App/Base.lproj/LaunchScreen.storyboard b/Govt-Billing-Angular/ios/App/App/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 412ea5f..0000000 --- a/Govt-Billing-Angular/ios/App/App/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Govt-Billing-Angular/ios/App/App/Base.lproj/Main.storyboard b/Govt-Billing-Angular/ios/App/App/Base.lproj/Main.storyboard deleted file mode 100644 index b44df7b..0000000 --- a/Govt-Billing-Angular/ios/App/App/Base.lproj/Main.storyboard +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/Govt-Billing-Angular/ios/App/App/Info.plist b/Govt-Billing-Angular/ios/App/App/Info.plist deleted file mode 100644 index 37f9f43..0000000 --- a/Govt-Billing-Angular/ios/App/App/Info.plist +++ /dev/null @@ -1,77 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - MyApp - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleURLTypes - - - CFBundleURLName - com.getcapacitor.capacitor - CFBundleURLSchemes - - capacitor - - - - CFBundleVersion - 1 - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - - NSCameraUsageDescription - To Take Photos and Video - NSLocationAlwaysUsageDescription - Always allow Geolocation? - NSLocationWhenInUseUsageDescription - Allow Geolocation? - NSMicrophoneUsageDescription - To Record Audio With Video - NSPhotoLibraryAddUsageDescription - Store camera photos to camera - NSPhotoLibraryUsageDescription - To Pick Photos from Library - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/Govt-Billing-Angular/ios/App/App/capacitor.config.json b/Govt-Billing-Angular/ios/App/App/capacitor.config.json deleted file mode 100644 index 69d2687..0000000 --- a/Govt-Billing-Angular/ios/App/App/capacitor.config.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "appId": "com.mridulchaba.com", - "appName": "MyApp", - "bundledWebRuntime": false, - "npmClient": "npm", - "webDir": "www", - "plugins": { - "SplashScreen": { - "launchShowDuration": 0 - } - }, - "cordova": { - "preferences": { - "ScrollEnabled": "false", - "android-minSdkVersion": "19", - "BackupWebStorage": "none", - "SplashMaintainAspectRatio": "true", - "FadeSplashScreenDuration": "300", - "SplashShowOnlyFirstTime": "false", - "SplashScreen": "screen", - "SplashScreenDelay": "3000" - } - } -} diff --git a/Govt-Billing-Angular/ios/App/App/config.xml b/Govt-Billing-Angular/ios/App/App/config.xml deleted file mode 100644 index 5db47d7..0000000 --- a/Govt-Billing-Angular/ios/App/App/config.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Govt-Billing-Angular/ios/App/Podfile b/Govt-Billing-Angular/ios/App/Podfile deleted file mode 100644 index 0c9cbba..0000000 --- a/Govt-Billing-Angular/ios/App/Podfile +++ /dev/null @@ -1,21 +0,0 @@ -platform :ios, '11.0' -use_frameworks! - -# workaround to avoid Xcode caching of Pods that requires -# Product -> Clean Build Folder after new Cordova plugins installed -# Requires CocoaPods 1.6 or newer -install! 'cocoapods', :disable_input_output_paths => true - -def capacitor_pods - # Automatic Capacitor Pod dependencies, do not delete - pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' - pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' - pod 'CordovaPlugins', :path => '../capacitor-cordova-ios-plugins' - pod 'CordovaPluginsResources', :path => '../capacitor-cordova-ios-plugins' - # Do not delete -end - -target 'App' do - capacitor_pods - # Add your Pods here -end diff --git a/Govt-Billing-Angular/karma.conf.js b/Govt-Billing-Angular/karma.conf.js deleted file mode 100644 index ffd7c16..0000000 --- a/Govt-Billing-Angular/karma.conf.js +++ /dev/null @@ -1,31 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - -module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - require('@angular-devkit/build-angular/plugins/karma') - ], - client: { - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - dir: require('path').join(__dirname, '../coverage'), - reports: ['html', 'lcovonly', 'text-summary'], - fixWebpackSourcePaths: true - }, - reporters: ['progress', 'kjhtml'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false - }); -}; diff --git a/Govt-Billing-Angular/package-lock.json b/Govt-Billing-Angular/package-lock.json deleted file mode 100644 index b6205e6..0000000 --- a/Govt-Billing-Angular/package-lock.json +++ /dev/null @@ -1,15340 +0,0 @@ -{ - "name": "home-budget", - "version": "0.0.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@angular-devkit/architect": { - "version": "0.901.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.9.tgz", - "integrity": "sha512-Xokyh7bv4qICHpb5Xui1jPTi6ZZvzR5tbTIxT0DFWqw16TEkFgkNubQsW6mFSR3g3CXdySMfOwWExfa/rE1ggA==", - "dev": true, - "requires": { - "@angular-devkit/core": "9.1.9", - "rxjs": "6.5.4" - }, - "dependencies": { - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - } - } - }, - "@angular-devkit/build-angular": { - "version": "0.901.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.9.tgz", - "integrity": "sha512-eC6iZQR5tr9dz/SkR3/3Y8Fau/2IzEfHlFCf2mqsOLkbc0MWyM/3RcuZQhRGdVOyzDCIbfzJGY0N3ejkEn2EUg==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.901.9", - "@angular-devkit/build-optimizer": "0.901.9", - "@angular-devkit/build-webpack": "0.901.9", - "@angular-devkit/core": "9.1.9", - "@babel/core": "7.9.0", - "@babel/generator": "7.9.3", - "@babel/preset-env": "7.9.0", - "@babel/template": "7.8.6", - "@jsdevtools/coverage-istanbul-loader": "3.0.3", - "@ngtools/webpack": "9.1.9", - "ajv": "6.12.0", - "autoprefixer": "9.7.4", - "babel-loader": "8.0.6", - "browserslist": "^4.9.1", - "cacache": "15.0.0", - "caniuse-lite": "^1.0.30001032", - "circular-dependency-plugin": "5.2.0", - "copy-webpack-plugin": "6.0.2", - "core-js": "3.6.4", - "css-loader": "3.5.1", - "cssnano": "4.1.10", - "file-loader": "6.0.0", - "find-cache-dir": "3.3.1", - "glob": "7.1.6", - "jest-worker": "25.1.0", - "karma-source-map-support": "1.4.0", - "less": "3.11.3", - "less-loader": "5.0.0", - "license-webpack-plugin": "2.1.4", - "loader-utils": "2.0.0", - "mini-css-extract-plugin": "0.9.0", - "minimatch": "3.0.4", - "open": "7.0.3", - "parse5": "4.0.0", - "postcss": "7.0.27", - "postcss-import": "12.0.1", - "postcss-loader": "3.0.0", - "raw-loader": "4.0.0", - "regenerator-runtime": "0.13.5", - "rimraf": "3.0.2", - "rollup": "2.1.0", - "rxjs": "6.5.4", - "sass": "1.26.3", - "sass-loader": "8.0.2", - "semver": "7.1.3", - "source-map": "0.7.3", - "source-map-loader": "0.2.4", - "speed-measure-webpack-plugin": "1.3.1", - "style-loader": "1.1.3", - "stylus": "0.54.7", - "stylus-loader": "3.0.2", - "terser": "4.6.10", - "terser-webpack-plugin": "3.0.3", - "tree-kill": "1.2.2", - "webpack": "4.42.0", - "webpack-dev-middleware": "3.7.2", - "webpack-dev-server": "3.11.0", - "webpack-merge": "4.2.2", - "webpack-sources": "1.4.3", - "webpack-subresource-integrity": "1.4.0", - "worker-plugin": "4.0.3" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "open": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", - "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "dev": true - } - } - }, - "@angular-devkit/build-optimizer": { - "version": "0.901.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.9.tgz", - "integrity": "sha512-AcDhE7RHmaVEaDB02MHp1PR2gdUg3+G/12pDC3GeAlfP1GD/sVBpcqPL6DHFp0dMm/FsvSfVSaXpzD7jZBeIKQ==", - "dev": true, - "requires": { - "loader-utils": "2.0.0", - "source-map": "0.7.3", - "tslib": "1.11.1", - "typescript": "3.6.5", - "webpack-sources": "1.4.3" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true - }, - "typescript": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.5.tgz", - "integrity": "sha512-BEjlc0Z06ORZKbtcxGrIvvwYs5hAnuo6TKdNFL55frVDlB+na3z5bsLhFaIxmT+dPWgBIjMo6aNnTOgHHmHgiQ==", - "dev": true - } - } - }, - "@angular-devkit/build-webpack": { - "version": "0.901.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.9.tgz", - "integrity": "sha512-Bha9LruitixhtJm72FGzqfDfgsOsrMT3EbNSql2muyoELIYbLDOvNZjcDD06CPcOAWSg6/tH9caOTFS2Zj9yOw==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.901.9", - "@angular-devkit/core": "9.1.9", - "rxjs": "6.5.4" - }, - "dependencies": { - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - } - } - }, - "@angular-devkit/core": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.9.tgz", - "integrity": "sha512-SWgBh4an/Vezjw2BZ5S+bKvuK5lH6gOtR8d5YjN9vxpJSZ0GimrGjfnLlWOkwWAsU8jfn4JzofECUHwX/7EW6Q==", - "dev": true, - "requires": { - "ajv": "6.12.0", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.5.4", - "source-map": "0.7.3" - }, - "dependencies": { - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - } - } - }, - "@angular-devkit/schematics": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.9.tgz", - "integrity": "sha512-aKuMmS3wshOTl9+01jiB50ml09fRN1WfOOtoNqwvKTEi87DrT6Mn3l0eVQo8PJK/bIq/FBmPgsIl2nsETiBSxg==", - "dev": true, - "requires": { - "@angular-devkit/core": "9.1.9", - "ora": "4.0.3", - "rxjs": "6.5.4" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.3.0.tgz", - "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "ora": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz", - "integrity": "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.2.0", - "is-interactive": "^1.0.0", - "log-symbols": "^3.0.0", - "mute-stream": "0.0.8", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@angular/cli": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.9.tgz", - "integrity": "sha512-k8C0OY3oHoixd3buCgF8+VFe8YZGSGiprnbVMEF2WJHUUw87lPCu/d7dbID3AtVwdKdAB275rAt6IZEIzXInbw==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.901.9", - "@angular-devkit/core": "9.1.9", - "@angular-devkit/schematics": "9.1.9", - "@schematics/angular": "9.1.9", - "@schematics/update": "0.901.9", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.1", - "debug": "4.1.1", - "ini": "1.3.5", - "inquirer": "7.1.0", - "npm-package-arg": "8.0.1", - "npm-pick-manifest": "6.0.0", - "open": "7.0.3", - "pacote": "9.5.12", - "read-package-tree": "5.3.1", - "rimraf": "3.0.2", - "semver": "7.1.3", - "symbol-observable": "1.2.0", - "universal-analytics": "0.4.20", - "uuid": "7.0.2" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", - "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "uuid": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz", - "integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw==", - "dev": true - } - } - }, - "@angular/common": { - "version": "9.1.11", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.11.tgz", - "integrity": "sha512-Vh5lF7zWwDK9RedmYXUc8vUXyrecR3j1mAWlTlnmcHYxxFThPzN/dr0slQcPi6nyJn0EmyRKUGvAoZx4rIb7wg==" - }, - "@angular/compiler": { - "version": "9.1.11", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.11.tgz", - "integrity": "sha512-MbVheCG0U8gt6xtiipau20N26mD2sXjLChVmRKgO6rbDruxboNMZfEd94q9NP9JRaUsVnjXvY7GMDldoymdXig==", - "dev": true - }, - "@angular/compiler-cli": { - "version": "9.1.11", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.11.tgz", - "integrity": "sha512-9qIxbtpRXOQnRm6inxCa5HuH87MSuMzuceD0YBVzl8v+vLtewon9KXYMmF4kTBhWa/LEa8FrajljLh0azf3VLg==", - "dev": true, - "requires": { - "canonical-path": "1.0.0", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "dependency-graph": "^0.7.2", - "fs-extra": "4.0.2", - "magic-string": "^0.25.0", - "minimist": "^1.2.0", - "reflect-metadata": "^0.1.2", - "semver": "^6.3.0", - "source-map": "^0.6.1", - "sourcemap-codec": "^1.4.8", - "yargs": "15.3.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "fs-extra": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", - "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", - "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.0" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "@angular/core": { - "version": "9.1.11", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.11.tgz", - "integrity": "sha512-KAlEedBo761O1aeoTJVziOSHi8Fttk9ipvbDZXYT/o0W/KdVwubxP34g9t5aD8LCcF8+L0z4VLw++HjdJAUpwg==" - }, - "@angular/forms": { - "version": "9.1.11", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.11.tgz", - "integrity": "sha512-t4WHrh6ot1r8zdV+3fJz7g9rCok77c9CiIevhH2dR/idxD+HtFR0wqmcBQzsn+rNVB0f0TiSHDrj+TeELIFyWw==" - }, - "@angular/language-service": { - "version": "9.1.11", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.1.11.tgz", - "integrity": "sha512-jfm4etbqldj6MTwECwyoAs7tXEAR8K/8P8dBZnsELhY+V8oFidTJI3NY52PB3Ym7leSPorYdOAeUMMuQfPaVxg==", - "dev": true - }, - "@angular/platform-browser": { - "version": "9.1.11", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.11.tgz", - "integrity": "sha512-KDxoiFhW4UD+EqchcKpQVSLwg9Rd3JbWytZLchFV6nH8BFnshfJtw2tyPT8bMhFVG9n9zSR4QSGaozWgoDs9mw==" - }, - "@angular/platform-browser-dynamic": { - "version": "9.1.11", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.11.tgz", - "integrity": "sha512-Qw3rfVFF0Wtu+UwraqKPCgTA3uoNPGf4vKSfuCuXTrG0p7j+3mCP59aUv5gGH7GV1UQ++jZRx5pbWF43zrC8Hw==" - }, - "@angular/router": { - "version": "9.1.11", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.11.tgz", - "integrity": "sha512-D6CCDeSK/F6dWSB/a1g/zB072xG5LadLSV8afQ57oX1KHePx21LcoRG4tUtFMMHh/jZXRc9pMQIR1/9FrrXF3Q==" - }, - "@babel/code-frame": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", - "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.3" - } - }, - "@babel/compat-data": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.3.tgz", - "integrity": "sha512-BDIfJ9uNZuI0LajPfoYV28lX8kyCPMHY6uY4WH1lJdcicmAfxCK5ASzaeV0D/wsUaRH/cLk+amuxtC37sZ8TUg==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz", - "integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==", - "dev": true, - "requires": { - "@babel/types": "^7.9.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz", - "integrity": "sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.3.tgz", - "integrity": "sha512-lo4XXRnBlU6eRM92FkiZxpo1xFLmv3VsPFk61zJKMm7XYJfwqXHsYJTY6agoc4a3L8QPw1HqWehO18coZgbT6A==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.3", - "@babel/types": "^7.10.3" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz", - "integrity": "sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.10.1", - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz", - "integrity": "sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-regex": "^7.10.1", - "regexpu-core": "^4.7.0" - } - }, - "@babel/helper-define-map": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.3.tgz", - "integrity": "sha512-bxRzDi4Sin/k0drWCczppOhov1sBSdBvXJObM1NLHQzjhXhwRtn7aRWGvLJWCYbuu2qUk3EKs6Ci9C9ps8XokQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.3", - "@babel/types": "^7.10.3", - "lodash": "^4.17.13" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.3.tgz", - "integrity": "sha512-0nKcR64XrOC3lsl+uhD15cwxPvaB6QKUDlD84OT9C3myRbhJqTMYir69/RWItUvHpharv0eJ/wk7fl34ONSwZw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.10.3", - "@babel/types": "^7.10.3" - } - }, - "@babel/helper-function-name": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", - "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.3", - "@babel/template": "^7.10.3", - "@babel/types": "^7.10.3" - }, - "dependencies": { - "@babel/template": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", - "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/parser": "^7.10.3", - "@babel/types": "^7.10.3" - } - } - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", - "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.3" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.3.tgz", - "integrity": "sha512-9JyafKoBt5h20Yv1+BXQMdcXXavozI1vt401KBiRc2qzUepbVnd7ogVNymY1xkQN9fekGwfxtotH2Yf5xsGzgg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.3" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz", - "integrity": "sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.3" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.3.tgz", - "integrity": "sha512-Jtqw5M9pahLSUWA+76nhK9OG8nwYXzhQzVIGFoNaHnXF/r4l7kz4Fl0UAW7B6mqC5myoJiBP5/YQlXQTMfHI9w==", - "dev": true, - "requires": { - "@babel/types": "^7.10.3" - } - }, - "@babel/helper-module-transforms": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", - "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/template": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", - "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/parser": "^7.10.3", - "@babel/types": "^7.10.3" - } - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz", - "integrity": "sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", - "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==", - "dev": true - }, - "@babel/helper-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz", - "integrity": "sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==", - "dev": true, - "requires": { - "lodash": "^4.17.13" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.3.tgz", - "integrity": "sha512-sLB7666ARbJUGDO60ZormmhQOyqMX/shKBXZ7fy937s+3ID8gSrneMvKSSb+8xIM5V7Vn6uNVtOY1vIm26XLtA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-wrap-function": "^7.10.1", - "@babel/template": "^7.10.3", - "@babel/traverse": "^7.10.3", - "@babel/types": "^7.10.3" - }, - "dependencies": { - "@babel/template": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", - "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/parser": "^7.10.3", - "@babel/types": "^7.10.3" - } - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", - "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" - }, - "dependencies": { - "@babel/template": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", - "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/parser": "^7.10.3", - "@babel/types": "^7.10.3" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", - "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz", - "integrity": "sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - }, - "dependencies": { - "@babel/template": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", - "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/parser": "^7.10.3", - "@babel/types": "^7.10.3" - } - } - } - }, - "@babel/helpers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", - "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - }, - "dependencies": { - "@babel/template": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", - "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/parser": "^7.10.3", - "@babel/types": "^7.10.3" - } - } - } - }, - "@babel/highlight": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", - "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.3", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", - "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.3.tgz", - "integrity": "sha512-WUUWM7YTOudF4jZBAJIW9D7aViYC/Fn0Pln4RIHlQALyno3sXSjqmTA4Zy1TKC2D49RCR8Y/Pn4OIUtEypK3CA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.3", - "@babel/helper-remap-async-to-generator": "^7.10.3", - "@babel/plugin-syntax-async-generators": "^7.8.0" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz", - "integrity": "sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz", - "integrity": "sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz", - "integrity": "sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz", - "integrity": "sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-numeric-separator": "^7.10.1" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.3.tgz", - "integrity": "sha512-ZZh5leCIlH9lni5bU/wB/UcjtcVLgR8gc+FAgW2OOY+m9h1II3ItTO1/cewNUcsIDZSYcSaz/rYVls+Fb0ExVQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.1" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz", - "integrity": "sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.3.tgz", - "integrity": "sha512-yyG3n9dJ1vZ6v5sfmIlMMZ8azQoqx/5/nZTSWX1td6L1H1bsjzA8TInDChpafCZiJkeOFzp/PtrfigAQXxI1Ng==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz", - "integrity": "sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz", - "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz", - "integrity": "sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz", - "integrity": "sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz", - "integrity": "sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-remap-async-to-generator": "^7.10.1" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz", - "integrity": "sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz", - "integrity": "sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "lodash": "^4.17.13" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.3.tgz", - "integrity": "sha512-irEX0ChJLaZVC7FvvRoSIxJlmk0IczFLcwaRXUArBKYHCHbOhe57aG8q3uw/fJsoSXvZhjRX960hyeAGlVBXZw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-define-map": "^7.10.3", - "@babel/helper-function-name": "^7.10.3", - "@babel/helper-optimise-call-expression": "^7.10.3", - "@babel/helper-plugin-utils": "^7.10.3", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.3.tgz", - "integrity": "sha512-GWzhaBOsdbjVFav96drOz7FzrcEW6AP5nax0gLIpstiFaI3LOb2tAg06TimaWU6YKOfUACK3FVrxPJ4GSc5TgA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.3" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz", - "integrity": "sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz", - "integrity": "sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz", - "integrity": "sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz", - "integrity": "sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz", - "integrity": "sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz", - "integrity": "sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz", - "integrity": "sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz", - "integrity": "sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz", - "integrity": "sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz", - "integrity": "sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.3.tgz", - "integrity": "sha512-GWXWQMmE1GH4ALc7YXW56BTh/AlzvDWhUNn9ArFF0+Cz5G8esYlVbXfdyHa1xaD1j+GnBoCeoQNlwtZTVdiG/A==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.10.3", - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.3", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz", - "integrity": "sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.3.tgz", - "integrity": "sha512-I3EH+RMFyVi8Iy/LekQm948Z4Lz4yKT7rK+vuCAeRm0kTa6Z5W7xuhRxDNJv0FPya/her6AUgrDITb70YHtTvA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz", - "integrity": "sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz", - "integrity": "sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz", - "integrity": "sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz", - "integrity": "sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.3.tgz", - "integrity": "sha512-H5kNeW0u8mbk0qa1jVIVTeJJL6/TJ81ltD4oyPx0P499DhMJrTmmIFCmJ3QloGpQG8K9symccB7S7SJpCKLwtw==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz", - "integrity": "sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz", - "integrity": "sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz", - "integrity": "sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz", - "integrity": "sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-regex": "^7.10.1" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.3.tgz", - "integrity": "sha512-yaBn9OpxQra/bk0/CaA4wr41O0/Whkg6nqjqApcinxM7pro51ojhX6fv1pimAnVjVfDy14K0ULoRL70CA9jWWA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.3" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz", - "integrity": "sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz", - "integrity": "sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/preset-env": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", - "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.9.0", - "@babel/helper-compilation-targets": "^7.8.7", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-numeric-separator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.9.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.9.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.8.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.9.0", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.9.0", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.9.0", - "@babel/plugin-transform-modules-commonjs": "^7.9.0", - "@babel/plugin-transform-modules-systemjs": "^7.9.0", - "@babel/plugin-transform-modules-umd": "^7.9.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.7", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.7", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.9.0", - "browserslist": "^4.9.1", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", - "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.3.tgz", - "integrity": "sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" - } - }, - "@babel/traverse": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", - "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/generator": "^7.10.3", - "@babel/helper-function-name": "^7.10.3", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.3", - "@babel/types": "^7.10.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/generator": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", - "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", - "dev": true, - "requires": { - "@babel/types": "^7.10.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", - "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.3", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@capacitor/android": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-2.2.0.tgz", - "integrity": "sha512-mFRGfaA/crSHH6P8PYAIDBXL4LFCsjgRhSqzfTMo1+PPnDsZ77Wy01FtB1EN5JVCRgb+Y1YIChcbf5F2Qn5ZjQ==" - }, - "@capacitor/cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-2.2.0.tgz", - "integrity": "sha512-JyqBixUOIfJ1FEuT6v9B9yoejL1+Y7tk/eTiKXs4wUOSb2RTwbXUfy4CozteaY72UP9TvvL+duXk3qeyny7/vQ==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "commander": "^2.12.2", - "compare-versions": "^3.1.0", - "fs-extra": "^4.0.3", - "inquirer": "6.3.1", - "open": "^6.1.0", - "ora": "^1.3.0", - "plist": "^3.0.1", - "semver": "^5.4.1", - "which": "^1.3.0", - "xml2js": "^0.4.19" - } - }, - "@capacitor/core": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-2.1.2.tgz", - "integrity": "sha512-oi+n23h9cJ/yaeMIlrnoeCV5p7pv2XWdT+cXzwh9j72LV+Y/oSGcNgFWGEAR/B1UVlv6LnLLQSs9CUXhNlh+Nw==", - "requires": { - "tslib": "^1.9.0" - } - }, - "@capacitor/ios": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-2.2.0.tgz", - "integrity": "sha512-mMz09NG7PYygoAtPJEBRiCjANHRfFT5WcTrFxILRYsgrLct4LhZ7ejaj9En3NGCvwnTG/J+89U2nxxlw2WisOw==" - }, - "@ionic-native/camera": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@ionic-native/camera/-/camera-5.27.0.tgz", - "integrity": "sha512-LcRlnDRnMHa+w5u2jpZIdXW6OcYyNz+CZL/G9idj9sdhCObAnqgm4eeutpBKulWQ9Ioh4548uPrxrOX7KYV0Fw==", - "requires": { - "@types/cordova": "^0.0.34" - } - }, - "@ionic-native/core": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-5.27.0.tgz", - "integrity": "sha512-qJcZJtXaXUpwKTMzLc6tGitHJVYQCcSlx2XNQUiKyck47g98Xxo8D0zgHoRiCQvApOqw1iEKzh6xs5PLkmcXqw==", - "requires": { - "@types/cordova": "^0.0.34" - } - }, - "@ionic-native/email-composer": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@ionic-native/email-composer/-/email-composer-5.27.0.tgz", - "integrity": "sha512-QMfi3GS+13TO59tcx8qRNx+XaCoXNNDeZJEhacB9B35kXZKEdrC8lz2xxYabSoUPDNg9zuGkiQbjxXdlvWfg9g==", - "requires": { - "@types/cordova": "^0.0.34" - } - }, - "@ionic-native/in-app-browser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@ionic-native/in-app-browser/-/in-app-browser-5.27.0.tgz", - "integrity": "sha512-qk7O0wvUN96DklhAxiEmmZu30+jfnvIDPeTaFek1Fq0xHrCjkZnkv31zWRKKUrgDk+wslrSEvs6hplvBERLfMQ==", - "requires": { - "@types/cordova": "^0.0.34" - } - }, - "@ionic-native/in-app-purchase": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@ionic-native/in-app-purchase/-/in-app-purchase-5.27.0.tgz", - "integrity": "sha512-cajQEm6qCqp/2lHJavKrWo6U9/rr17Pzengamx/KU7wFmGgM7+fBUUJYAbJ2YEyekojhgKcMFSaTWQNUXdURUw==", - "requires": { - "@types/cordova": "^0.0.34" - } - }, - "@ionic-native/network": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@ionic-native/network/-/network-5.27.0.tgz", - "integrity": "sha512-aS3noiqL/2GjWsgCS44OyZq6qmIt2fDk8mwJ+uyrz8ES4Fdk0zWxdxFpDB5LVxaY1IiXiGcj7bOW3aG6WzPeHg==", - "requires": { - "@types/cordova": "^0.0.34" - } - }, - "@ionic-native/printer": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@ionic-native/printer/-/printer-5.27.0.tgz", - "integrity": "sha512-PzVFtc8Od3kgnL41lQqaQJylluw4HkmskFUXS5aLa1esMOXGVExxITxoH4fGqHiaQQaJVWMNsniyy/Gbw06QLA==", - "requires": { - "@types/cordova": "^0.0.34" - } - }, - "@ionic-native/social-sharing": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@ionic-native/social-sharing/-/social-sharing-5.27.0.tgz", - "integrity": "sha512-1RKHPVZB3nqJMXszERijLWEptWwCNM/N1f9tAEX6zxvTz72dvYi+w24RF58IZJwVWQccUSY3yUv7fOCZkaNT6A==", - "requires": { - "@types/cordova": "^0.0.34" - } - }, - "@ionic-native/splash-screen": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@ionic-native/splash-screen/-/splash-screen-5.27.0.tgz", - "integrity": "sha512-SZO5FjarVztlEBYJQsJv7NvZk+jRhElatruVpxMk4r8uuNL52Zt3TaPaGngwvI3tGHB42+l0rOsIusiBaIsSrA==", - "requires": { - "@types/cordova": "^0.0.34" - } - }, - "@ionic-native/status-bar": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@ionic-native/status-bar/-/status-bar-5.27.0.tgz", - "integrity": "sha512-N0NIZTbi5KSA0GwTWsaJJLsve6ANQ+cy141+oUCXFPjtCYXyp1mOGcFiAE2UiI/N8SpmcLlV53zYhqIP8ish2Q==", - "requires": { - "@types/cordova": "^0.0.34" - } - }, - "@ionic/angular": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-5.2.3.tgz", - "integrity": "sha512-s1qCmaOSBOXUe+2YyUKd7ynoSzAA9C35KyWa4X5JRhbLraVHHvOXMSyo5ckKm3ZSEkOvSDorg3wIbdVC/R3oRw==", - "requires": { - "@ionic/core": "5.2.3", - "tslib": "^1.9.3" - } - }, - "@ionic/angular-toolkit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ionic/angular-toolkit/-/angular-toolkit-2.2.0.tgz", - "integrity": "sha512-sT3GokCa5CVrtLsijcTWEm5tbUB3CcJ1ucC9NlIcAZG+dh3oQ7zK2gS7U3xdbSR1cNO+y2TBVNVyY0xSiI+Rbg==", - "dev": true, - "requires": { - "@schematics/angular": ">=8.0.0", - "cheerio": "1.0.0-rc.3", - "colorette": "1.1.0", - "copy-webpack-plugin": "5.1.1", - "tslib": "^1.9.0", - "ws": "^7.0.1" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "copy-webpack-plugin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", - "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", - "dev": true, - "requires": { - "cacache": "^12.0.3", - "find-cache-dir": "^2.1.0", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "is-glob": "^4.0.1", - "loader-utils": "^1.2.3", - "minimatch": "^3.0.4", - "normalize-path": "^3.0.0", - "p-limit": "^2.2.1", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "webpack-log": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "ws": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", - "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", - "dev": true - } - } - }, - "@ionic/core": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.2.3.tgz", - "integrity": "sha512-EUGicoQfWZV9//sstNkssFxvSaM7zXIG2EbOZVKX+2l7sWkUC39lO9CBZoMyafSppEZT1hMsY1R3coVkGQefEg==", - "requires": { - "ionicons": "^5.1.2", - "tslib": "^1.10.0" - } - }, - "@ionic/storage": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ionic/storage/-/storage-2.2.0.tgz", - "integrity": "sha512-2pszrzmI+fAar2Rx0WmJDVpc15D1k5tvLkB49NLYWJ2pOMaO/3/vp7mg/mEbg3rdsPE9FRbYI6vdKjQ2pP1EWA==", - "requires": { - "localforage": "1.7.1", - "localforage-cordovasqlitedriver": "1.7.0", - "tslib": "^1.7.1" - } - }, - "@ionic/utils-array": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.3.tgz", - "integrity": "sha512-IV7oK7kj6UZEkZ5lbS78gNSUSTqZtLOEKu9G+MqBpRTX+YKKnmsAxQuvZrnsy/pHmzJ7aKlj1V0gNAFO6w/NOA==", - "requires": { - "debug": "^4.0.0", - "tslib": "1.11.2" - }, - "dependencies": { - "tslib": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", - "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==" - } - } - }, - "@ionic/utils-fs": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.3.tgz", - "integrity": "sha512-xMZhlB1XgZQchvKZFQt6NcKgLsCdSTt3lmU0Gl0HIWdGHjwI5QSyLCYPTvfa8Wm4vCn7XYiMy05bWxWtY0+FxQ==", - "requires": { - "debug": "^4.0.0", - "fs-extra": "^9.0.0", - "through2": "^3.0.0", - "tslib": "1.11.2" - }, - "dependencies": { - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - }, - "tslib": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", - "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==" - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true - }, - "@jsdevtools/coverage-istanbul-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.3.tgz", - "integrity": "sha512-TAdNkeGB5Fe4Og+ZkAr1Kvn9by2sfL44IAHFtxlh1BA1XJ5cLpO9iSNki5opWESv3l3vSHsZ9BNKuqFKbEbFaA==", - "dev": true, - "requires": { - "convert-source-map": "^1.7.0", - "istanbul-lib-instrument": "^4.0.1", - "loader-utils": "^1.4.0", - "merge-source-map": "^1.1.0", - "schema-utils": "^2.6.4" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "@ngtools/webpack": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.9.tgz", - "integrity": "sha512-7UzRL54JcK1m2PvgpchV26TF9OYipj/8+dygdjaidqOyQujWpHncdtq/ScbUsoJ44nHjIRJPhaGE00NLpWZvnA==", - "dev": true, - "requires": { - "@angular-devkit/core": "9.1.9", - "enhanced-resolve": "4.1.1", - "rxjs": "6.5.4", - "webpack-sources": "1.4.3" - }, - "dependencies": { - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@npmcli/move-file": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", - "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "@schematics/angular": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.9.tgz", - "integrity": "sha512-c8YGZ6pDfr8IDD1qaOjlEBAkEz14KFSxDj0hCWs0xIM0py513tu5sW8+ziYxGG4bgqpsgVR/KAxuY78iBfUVag==", - "dev": true, - "requires": { - "@angular-devkit/core": "9.1.9", - "@angular-devkit/schematics": "9.1.9" - } - }, - "@schematics/update": { - "version": "0.901.9", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.9.tgz", - "integrity": "sha512-VChX0VO/oyfCF3y+HjMTU2qN3vGgJYxEI1V+Q9aAlwl95t3GAufuaFY1CNW3YV4XkYIjD88e3yWl8d5yO4qf4w==", - "dev": true, - "requires": { - "@angular-devkit/core": "9.1.9", - "@angular-devkit/schematics": "9.1.9", - "@yarnpkg/lockfile": "1.1.0", - "ini": "1.3.5", - "npm-package-arg": "^8.0.0", - "pacote": "9.5.12", - "rxjs": "6.5.4", - "semver": "7.1.3", - "semver-intersect": "1.4.0" - }, - "dependencies": { - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "dev": true - } - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, - "@types/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/jasmine": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.10.tgz", - "integrity": "sha512-3F8qpwBAiVc5+HPJeXJpbrl+XjawGmciN5LgiO7Gv1pl1RHtjoMNqZpqEksaPJW05ViKe8snYInRs6xB25Xdew==", - "dev": true - }, - "@types/jasminewd2": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", - "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", - "dev": true, - "requires": { - "@types/jasmine": "*" - } - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "12.12.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.47.tgz", - "integrity": "sha512-yzBInQFhdY8kaZmqoL2+3U5dSTMrKaYcb561VU+lDzAYvqt+2lojvBEy+hmpSNuXnPTx7m9+04CzWYOUqWME2A==", - "dev": true - }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", - "dev": true - }, - "@types/selenium-webdriver": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", - "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", - "dev": true - }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", - "dev": true - }, - "@types/webpack-sources": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", - "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==" - } - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" - }, - "adm-zip": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", - "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==", - "dev": true - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.0.tgz", - "integrity": "sha512-eyoaac3btgU8eJlvh01En8OCKzRqlLe2G5jDsCr3RiE2uLGMEEB1aaGwVVpwR8M95956tGH6R+9edC++OvzaVw==", - "dev": true - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "app-root-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", - "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", - "dev": true - }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "autoprefixer": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", - "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", - "dev": true, - "requires": { - "browserslist": "^4.8.3", - "caniuse-lite": "^1.0.30001020", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.26", - "postcss-value-parser": "^4.0.2" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", - "dev": true - }, - "axobject-query": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", - "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7" - } - }, - "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", - "dev": true, - "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "pify": "^4.0.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, - "big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bl": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", - "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, - "blocking-proxy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", - "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "bplist-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", - "integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=", - "requires": { - "big-integer": "^1.6.7" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - } - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } - } - }, - "browserify": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.1.tgz", - "integrity": "sha512-EQX0h59Pp+0GtSRb5rL6OTfrttlzv+uyaUVlK6GX3w11SQ0jKPKyjC/54RhPR2ib2KmfcELM06e8FxcI5XNU2A==", - "requires": { - "JSONStream": "^1.0.3", - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.0.0", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "stream-http": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", - "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "requires": { - "process": "~0.11.0" - } - }, - "tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", - "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.2", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", - "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001043", - "electron-to-chromium": "^1.3.413", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" - } - }, - "browserstack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz", - "integrity": "sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw==", - "dev": true, - "requires": { - "https-proxy-agent": "^2.2.1" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.0.tgz", - "integrity": "sha512-L0JpXHhplbJSiDGzyJJnJCTL7er7NzbBgxzVqLswEb4bO91Zbv17OUMuUeu/q0ZwKn3V+1HM4wb9tO4eVE/K8g==", - "dev": true, - "requires": { - "chownr": "^1.1.2", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^8.0.0", - "tar": "^6.0.1", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cached-path-relative": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001085", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001085.tgz", - "integrity": "sha512-x0YRFRE0pmOD90z+9Xk7jwO58p4feVNXP+U8kWV+Uo/HADyrgESlepzIkUqPgaXkpyceZU6siM1gsK7sHgplqA==", - "dev": true - }, - "canonical-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", - "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - } - } - }, - "chokidar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", - "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-dependency-plugin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", - "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-spinners": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", - "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", - "dev": true - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "codelyzer": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz", - "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==", - "dev": true, - "requires": { - "app-root-path": "^2.2.1", - "aria-query": "^3.0.0", - "axobject-query": "2.0.2", - "css-selector-tokenizer": "^0.7.1", - "cssauron": "^1.4.0", - "damerau-levenshtein": "^1.0.4", - "semver-dsl": "^1.0.1", - "source-map": "^0.5.7", - "sprintf-js": "^1.1.2" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", - "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==", - "dev": true - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.2.tgz", - "integrity": "sha512-9Gm8X0c6eXlKnmltMPFCBeGOKjtcRIyTt4VaO3k1TkNgVTe5Ov2lYsYVuyLp0kp8DItO3apewflM+1GYgh6V2Q==", - "dev": true, - "requires": { - "cacache": "^15.0.4", - "fast-glob": "^3.2.2", - "find-cache-dir": "^3.3.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.1", - "loader-utils": "^2.0.0", - "normalize-path": "^3.0.0", - "p-limit": "^2.3.0", - "schema-utils": "^2.7.0", - "serialize-javascript": "^3.1.0", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "cacache": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.4.tgz", - "integrity": "sha512-YlnKQqTbD/6iyoJvEY3KJftjrdBYroCbxxYXzhOzsFLWlp6KX4BOlEf4mTx0cMUfVaTS3ENL2QtDWeRYoGLkkw==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - } - } - }, - "cordova-plugin-camera": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cordova-plugin-camera/-/cordova-plugin-camera-4.1.0.tgz", - "integrity": "sha512-fCLhWjWYn49q3X5xaypAPgTz6MAWSKFFQvD2Gpi5SuVlrRPRphtX2jIqR2zCBuDTBR082QVnlc+yUDXt65Mjgw==" - }, - "cordova-plugin-dialogs": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/cordova-plugin-dialogs/-/cordova-plugin-dialogs-2.0.2.tgz", - "integrity": "sha512-FUHI6eEVeoz2VkxbF0P56QlUQLGzXcvw3i4xuXyM9gEct6Y+FA3Xzgl2pJTZcTg5wRqLWzN08kgNoHPkom15pw==" - }, - "cordova-plugin-email-composer": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/cordova-plugin-email-composer/-/cordova-plugin-email-composer-0.9.2.tgz", - "integrity": "sha512-w8eQZ6lbYWut13o/Cprixmacfyq5hds7DAjuTL34eQhyWWd/DA/o6ziiyY3So2ZOozeQ4DxQpyPN4BiqUKcyew==" - }, - "cordova-plugin-inappbrowser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cordova-plugin-inappbrowser/-/cordova-plugin-inappbrowser-4.0.0.tgz", - "integrity": "sha512-w2LZzdF3R4G/EqVZ9aWch9Pksk76uw6/S5wFP1sgn7zjsSDpJBb/JhazLnioN1NZmZiCUBbROv1S4+9JCkeCgA==" - }, - "cordova-plugin-inapppurchase": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cordova-plugin-inapppurchase/-/cordova-plugin-inapppurchase-1.2.0.tgz", - "integrity": "sha1-L1l3f/TgJt4E+KX026eJi2Pb07M=" - }, - "cordova-plugin-network-information": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/cordova-plugin-network-information/-/cordova-plugin-network-information-2.0.2.tgz", - "integrity": "sha512-NwO3qDBNL/vJxUxBTPNOA1HvkDf9eTeGH8JSZiwy1jq2W2mJKQEDBwqWkaEQS19Yd/MQTiw0cykxg5D7u4J6cQ==" - }, - "cordova-plugin-printer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/cordova-plugin-printer/-/cordova-plugin-printer-0.8.0.tgz", - "integrity": "sha512-Olu2SuCedztO6PtXoHwA4J/emOxZlj64Ya9aZhcxoXJITG+RDF6Nb3oThcpYPTa73+py+gPF7r19lv3Q8RR/Nw==" - }, - "cordova-plugin-x-socialsharing": { - "version": "5.6.8", - "resolved": "https://registry.npmjs.org/cordova-plugin-x-socialsharing/-/cordova-plugin-x-socialsharing-5.6.8.tgz", - "integrity": "sha512-R31ZQq00YNzLBwUM4VTE/uKhh/T0GEMuz/MZOw/Pu5AYIAAQkd7EMqFVhMtKs7wfHl1koiRz8+6nLDb19r2tBQ==" - }, - "cordova-res": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/cordova-res/-/cordova-res-0.15.1.tgz", - "integrity": "sha512-qD4yrlVZpv4X3W3BnVDEmRVt6ZzZmFr4fIqc8lhxbVEuYb9/N3lXP9lAm7wGC323QBwYfQE4zGeyuUvnOkbJ8w==", - "requires": { - "@ionic/utils-array": "^2.1.1", - "@ionic/utils-fs": "^3.0.0", - "debug": "^4.1.1", - "elementtree": "^0.1.7", - "sharp": "^0.25.1", - "tslib": "^1.9.3" - } - }, - "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", - "dev": true - }, - "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", - "dev": true, - "requires": { - "browserslist": "^4.8.5", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - } - }, - "css-loader": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.1.tgz", - "integrity": "sha512-0G4CbcZzQ9D1Q6ndOfjFuMDo8uLYMu5vc9Abs5ztyHcKvmil6GJrMiNjzzi3tQvUF+mVRuDg7bE6Oc0Prolgig==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.27", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.3", - "schema-utils": "^2.6.5", - "semver": "^6.3.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "css-parse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", - "dev": true, - "requires": { - "css": "^2.0.0" - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", - "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2", - "regexpu-core": "^4.6.0" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", - "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", - "dev": true - }, - "cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", - "dev": true, - "requires": { - "through": "X.X.X" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", - "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", - "dev": true, - "requires": { - "css-tree": "1.0.0-alpha.39" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", - "dev": true, - "requires": { - "mdn-data": "2.0.6", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", - "dev": true - }, - "dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", - "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - } - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "dependency-graph": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", - "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", - "dev": true - }, - "deps-sort": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", - "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", - "requires": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - } - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "requires": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - } - }, - "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "requires": { - "readable-stream": "^2.0.2" - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.480", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.480.tgz", - "integrity": "sha512-wnuUfQCBMAdzu5Xe+F4FjaRK+6ToG6WvwG72s8k/3E6b+hoGVYGiQE7JD1NhiCMcqF3+wV+c2vAnaLGRSSWVqA==", - "dev": true - }, - "elementtree": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", - "integrity": "sha1-mskb5uUvtuYkTE5UpKw+2K6OKcA=", - "requires": { - "sax": "1.1.4" - }, - "dependencies": { - "sax": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", - "integrity": "sha1-dLbTPJrh4AFRDxeakRaFiPGu2qk=" - } - } - }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", - "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "0.3.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "^7.1.2" - }, - "dependencies": { - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "ws": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", - "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", - "dev": true - } - } - }, - "engine.io-client": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", - "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", - "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", - "dev": true - }, - "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promise-plugin": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/es6-promise-plugin/-/es6-promise-plugin-4.2.2.tgz", - "integrity": "sha512-uoA4aVplXI9oqUYJFBAVRwAqIN9/n9JgrTAUGX3qPbnSZVE5yY1+6/MsoN5f4xsaPO62WjPHOdtts6okMN6tNA==" - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.1.tgz", - "integrity": "sha512-Q8t2YZ+0e0pc7NRVj3B4tSQ9rim1oi4Fh46k2xhJ2qOiEwhQfdjyEQddWdj7ZFaKmU+5104vn1qrcjEPWq+bgQ==", - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true - } - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "requires": { - "pend": "~1.2.0" - } - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-loader": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", - "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.6.5" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz", - "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "form-serializer": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/form-serializer/-/form-serializer-2.5.0.tgz", - "integrity": "sha1-yuovrLwbzuf2VdkTZwcTPz+staM=" - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true - }, - "get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz", - "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==", - "dev": true, - "requires": { - "lru-cache": "^5.1.1" - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "requires": { - "source-map": "~0.5.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "inquirer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", - "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.11", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - } - }, - "insert-module-globals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", - "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", - "requires": { - "JSONStream": "^1.0.3", - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ionicons": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-5.1.2.tgz", - "integrity": "sha512-zO7ZgbBbXhpA7cXO2rDzTNdcCqErjg1Sprq/ossTvaiV0MriOjRE7JO3EGvYjDTPzF9YALGpvLXqCgsRT0tprA==" - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", - "dev": true - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isbinaryfile": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", - "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-api": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.7.tgz", - "integrity": "sha512-LYTOa2UrYFyJ/aSczZi/6lBykVMjCCvUmT64gOe+jPZFy4w6FYfPGqFT2IiQ2BxVHHDOvCD7qrIXb0EOh4uGWw==", - "dev": true, - "requires": { - "async": "^2.6.2", - "compare-versions": "^3.4.0", - "fileset": "^2.0.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.5", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "minimatch": "^3.0.4", - "once": "^1.4.0" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0" - } - }, - "jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", - "dev": true, - "requires": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.8.0" - }, - "dependencies": { - "jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", - "dev": true - } - } - }, - "jasmine-core": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", - "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", - "dev": true - }, - "jasmine-spec-reporter": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", - "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", - "dev": true, - "requires": { - "colors": "1.1.2" - } - }, - "jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", - "dev": true - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jetifier": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.6.tgz", - "integrity": "sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ==" - }, - "jquery": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", - "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jszip": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", - "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, - "karma": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/karma/-/karma-5.0.9.tgz", - "integrity": "sha512-dUA5z7Lo7G4FRSe1ZAXqOINEEWxmCjDBbfRBmU/wYlSMwxUQJP/tEEP90yJt3Uqo03s9rCgVnxtlfq+uDhxSPg==", - "dev": true, - "requires": { - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.0.0", - "colors": "^1.4.0", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "flatted": "^2.0.2", - "glob": "^7.1.6", - "graceful-fs": "^4.2.4", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.6", - "lodash": "^4.17.15", - "log4js": "^6.2.1", - "mime": "^2.4.5", - "minimatch": "^3.0.4", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^2.3.0", - "source-map": "^0.6.1", - "tmp": "0.2.1", - "ua-parser-js": "0.7.21", - "yargs": "^15.3.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "karma-chrome-launcher": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", - "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", - "dev": true, - "requires": { - "which": "^1.2.1" - } - }, - "karma-coverage-istanbul-reporter": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz", - "integrity": "sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A==", - "dev": true, - "requires": { - "istanbul-api": "^2.1.6", - "minimatch": "^3.0.4" - } - }, - "karma-jasmine": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-3.0.3.tgz", - "integrity": "sha512-80iBR8/hLFY2Uw3S2GG6EndWtMCGMJjrCYNwYROWsJFVTjWrRSsLqcA2ye+U3ygW5sjOQo8f+78L8cGUxjC/+A==", - "dev": true, - "requires": { - "jasmine-core": "^3.5.0" - } - }, - "karma-jasmine-html-reporter": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", - "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", - "dev": true - }, - "karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, - "requires": { - "source-map-support": "^0.5.5" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "labeled-stream-splicer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", - "requires": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "less": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/less/-/less-3.11.3.tgz", - "integrity": "sha512-VkZiTDdtNEzXA3LgjQiC3D7/ejleBPFVvq+aRI9mIj+Zhmif5TvFPM244bT4rzkvOCvJ9q4zAztok1M7Nygagw==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0", - "tslib": "^1.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "less-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", - "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^4.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "license-webpack-plugin": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.4.tgz", - "integrity": "sha512-1Xq72fmPbTg5KofXs+yI5L4QqPFjQ6mZxoeI6D7gfiEDOtaEIk6PGrdLaej90bpDqKNHNxlQ/MW4tMAL6xMPJQ==", - "dev": true, - "requires": { - "@types/webpack-sources": "^0.1.5", - "webpack-sources": "^1.2.0" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "localforage": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.7.1.tgz", - "integrity": "sha1-5JJ+BCMCuGTbMPMhHxO1xvDell0=", - "requires": { - "lie": "3.1.1" - }, - "dependencies": { - "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", - "requires": { - "immediate": "~3.0.5" - } - } - } - }, - "localforage-cordovasqlitedriver": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/localforage-cordovasqlitedriver/-/localforage-cordovasqlitedriver-1.7.0.tgz", - "integrity": "sha1-i5OVd1nuaI06WNW6fAR39sy1ODg=", - "requires": { - "localforage": ">=1.5.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "log4js": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", - "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", - "dev": true, - "requires": { - "date-format": "^3.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.1", - "rfdc": "^1.1.4", - "streamroller": "^2.2.4" - } - }, - "loglevel": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", - "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-fetch-happen": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", - "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", - "dev": true, - "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" - }, - "dependencies": { - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - } - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - } - } - }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" - }, - "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz", - "integrity": "sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", - "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "module-deps": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.2.tgz", - "integrity": "sha512-a9y6yDv5u5I4A+IPHTnqFxcaKr4p50/zxTjcQJaX2ws9tN/W6J6YXnEKhqRyPhl494dkcxx951onSKVezmI+3w==", - "requires": { - "JSONStream": "^1.0.3", - "browser-resolve": "^1.7.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "native-run": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/native-run/-/native-run-1.0.0.tgz", - "integrity": "sha512-BKHQM9oXRY7mIlOHex1EAeTJeg1Gy6EJEKvt1bWyrb387dcFYCIVGdCqKmbQXg4OjHrJw2caDrHoN9y7U9y2+A==", - "requires": { - "@ionic/utils-fs": "^3.0.0", - "debug": "^4.1.1", - "elementtree": "^0.1.7", - "ini": "^1.3.5", - "node-ioslib": "0.0.9", - "split2": "^3.1.0", - "through2": "^3.0.0", - "tslib": "^1.9.3", - "yauzl": "^2.10.0" - }, - "dependencies": { - "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - } - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-abi": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.18.0.tgz", - "integrity": "sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw==", - "requires": { - "semver": "^5.4.1" - } - }, - "node-addon-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.0.tgz", - "integrity": "sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg==" - }, - "node-fetch-npm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", - "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", - "dev": true - }, - "node-ioslib": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/node-ioslib/-/node-ioslib-0.0.9.tgz", - "integrity": "sha512-rHRbH1glQ+mmC8EuBLl89OO/WjicAUszW3OKRzzHdedVyWZ/yD3eg3GzHkaNgWtTwFl/0x29OyC4aQp7LdYlYA==", - "requires": { - "bplist-parser": "^0.1.1", - "debug": "^4.1.1", - "plist": "^3.0.1", - "tslib": "^1.9.3" - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-releases": { - "version": "1.1.58", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", - "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", - "dev": true - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-install-checks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", - "dev": true, - "requires": { - "semver": "^7.1.1" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "npm-package-arg": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", - "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", - "dev": true, - "requires": { - "hosted-git-info": "^3.0.2", - "semver": "^7.0.0", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "dev": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.0.0.tgz", - "integrity": "sha512-PdJpXMvjqt4nftNEDpCgjBUF8yI3Q3MyuAmVB9nemnnCg32F4BPL/JFBfdj8DubgHCYUFQhtLWmBPvdsFtjWMg==", - "dev": true, - "requires": { - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.0.0", - "semver": "^7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "npm-registry-fetch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.4.tgz", - "integrity": "sha512-6jb34hX/iYNQebqWUHtU8YF6Cjb1H6ouTFPClYsyiW6lpFkljTpdeftm53rRojtja1rKAvKNIIiTS5Sjpw4wsA==", - "dev": true, - "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "dev": true, - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", - "dev": true - }, - "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "ora": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-1.4.0.tgz", - "integrity": "sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==", - "dev": true, - "requires": { - "chalk": "^2.1.0", - "cli-cursor": "^2.1.0", - "cli-spinners": "^1.0.1", - "log-symbols": "^2.1.0" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pacote": { - "version": "9.5.12", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", - "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.3", - "cacache": "^12.0.2", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.3", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-normalize-package-bin": "^1.0.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^3.0.0", - "npm-registry-fetch": "^4.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" - }, - "dependencies": { - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "dev": true, - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "npm-pick-manifest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "requires": { - "path-platform": "~0.11.15" - } - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - } - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "plist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", - "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", - "requires": { - "base64-js": "^1.2.3", - "xmlbuilder": "^9.0.7", - "xmldom": "0.1.x" - } - }, - "portfinder": { - "version": "1.0.26", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", - "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", - "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-import": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", - "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "postcss-value-parser": "^3.2.3", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", - "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", - "dev": true, - "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.16", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.0" - } - }, - "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", - "dev": true, - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "prebuild-install": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.5.tgz", - "integrity": "sha512-YmMO7dph9CYKi5IR/BzjOJlRzpxGGVo1EsLSUZ0mt/Mq0HWZIHOKHHcHdT69yG54C9m6i45GpItwRHpk0Py7Uw==", - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp": "^0.5.1", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - } - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-retry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", - "dev": true, - "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - }, - "dependencies": { - "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", - "dev": true - } - } - }, - "protoduck": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", - "dev": true, - "requires": { - "genfun": "^5.0.0" - } - }, - "protractor": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.4.tgz", - "integrity": "sha512-BaL4vePgu3Vfa/whvTUAlgaCAId4uNSGxIFSCXMgj7LMYENPWLp85h5RBi9pdpX/bWQ8SF6flP7afmi2TC4eHw==", - "dev": true, - "requires": { - "@types/q": "^0.0.32", - "@types/selenium-webdriver": "^3.0.0", - "blocking-proxy": "^1.0.0", - "browserstack": "^1.5.1", - "chalk": "^1.1.3", - "glob": "^7.0.3", - "jasmine": "2.8.0", - "jasminewd2": "^2.1.0", - "q": "1.4.1", - "saucelabs": "^1.5.0", - "selenium-webdriver": "3.6.0", - "source-map-support": "~0.4.0", - "webdriver-js-extender": "2.1.0", - "webdriver-manager": "^12.0.6", - "yargs": "^12.0.5" - }, - "dependencies": { - "@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "webdriver-manager": { - "version": "12.1.7", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", - "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", - "dev": true, - "requires": { - "adm-zip": "^0.4.9", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "^1.2.0", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } - } - }, - "raw-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.0.tgz", - "integrity": "sha512-iINUOYvl1cGEmfoaLjnZXt4bKfT2LJnZZib5N/LLyAphC+Dd11vNP9CNVb38j+SAJpFI1uo8j9frmih53ASy7Q==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "requires": { - "readable-stream": "^2.0.2" - } - }, - "read-package-json": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz", - "integrity": "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==", - "dev": true, - "requires": { - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "json-parse-better-errors": "^1.0.1", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" - } - }, - "read-package-tree": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", - "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", - "dev": true, - "requires": { - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "util-promisify": "^2.1.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, - "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", - "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4", - "private": "^0.1.8" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "remove-use-strict": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/remove-use-strict/-/remove-use-strict-1.0.0.tgz", - "integrity": "sha512-jhMtDEeIqIALT2XSksWffV3HQ3yOTDCK/IM6/BaX4zRqX5eFrmsxrnZIu2sN1Eux29/uUhF3DsQZc6/Le5p6fg==", - "requires": { - "escodegen": "~1.12.0", - "esprima": "~4.0.1", - "estraverse": "~4.3.0", - "lodash": "~4.17.15" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rollup": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.1.0.tgz", - "integrity": "sha512-gfE1455AEazVVTJoeQtcOq/U6GSxwoj4XPSWVsuWmgIxj7sBQNLDOSA82PbdMe+cP8ql8fR1jogPFe8Wg8g4SQ==", - "dev": true, - "requires": { - "fsevents": "~2.1.2" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass": { - "version": "1.26.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.3.tgz", - "integrity": "sha512-5NMHI1+YFYw4sN3yfKjpLuV9B5l7MqQ6FlkTcC4FT+oHbBRUZoSjHrrt/mE0nFXJyY2kQtU9ou9HxvFVjLFuuw==", - "dev": true, - "requires": { - "chokidar": ">=2.0.0 <4.0.0" - } - }, - "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "saucelabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", - "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", - "dev": true, - "requires": { - "https-proxy-agent": "^2.2.1" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - } - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dev": true, - "requires": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, - "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", - "dev": true, - "requires": { - "node-forge": "0.9.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", - "dev": true, - "requires": { - "semver": "^5.3.0" - } - }, - "semver-intersect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", - "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", - "dev": true, - "requires": { - "semver": "^5.0.0" - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "sharp": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.25.4.tgz", - "integrity": "sha512-umSzJJ1oBwIOfwFFt/fJ7JgCva9FvrEU2cbbm7u/3hSDZhXvkME8WE5qpaJqLIe2Har5msF5UG4CzYlEg5o3BQ==", - "requires": { - "color": "^3.1.2", - "detect-libc": "^1.0.3", - "node-addon-api": "^3.0.0", - "npmlog": "^4.1.2", - "prebuild-install": "^5.3.4", - "semver": "^7.3.2", - "simple-get": "^4.0.0", - "tar": "^6.0.2", - "tunnel-agent": "^0.6.0" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - } - } - }, - "shasum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", - "requires": { - "json-stable-stringify": "~0.0.0", - "sha.js": "~2.4.4" - } - }, - "shasum-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", - "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", - "requires": { - "fast-safe-stringify": "^2.0.7" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", - "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - } - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - } - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - } - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "socialcalc": { - "version": "git+https://github.com/mridulchaba/socialcalc.git#42bf68514546d4db5ee41f76841791297737dcb5", - "from": "git+https://github.com/mridulchaba/socialcalc.git" - }, - "socket.io": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", - "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", - "dev": true, - "requires": { - "debug": "~4.1.0", - "engine.io": "~3.4.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.3.0", - "socket.io-parser": "~3.4.0" - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", - "dev": true - }, - "socket.io-client": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", - "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "engine.io-client": "~3.4.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "socket.io-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", - "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - } - } - }, - "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.4.0", - "websocket-driver": "0.6.5" - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - } - } - }, - "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", - "dev": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "dev": true, - "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "source-map-loader": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", - "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", - "dev": true, - "requires": { - "async": "^2.5.0", - "loader-utils": "^1.1.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "speed-measure-webpack-plugin": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz", - "integrity": "sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "split2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.1.1.tgz", - "integrity": "sha512-emNzr1s7ruq4N+1993yht631/JH+jaj0NYBosuKmLcq+JkGQ9MmTw1RB1fGaTCzUuseRIClrlSLHRNYGwWQ58Q==", - "requires": { - "readable-stream": "^3.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", - "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, - "streamroller": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", - "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", - "dev": true, - "requires": { - "date-format": "^2.1.0", - "debug": "^4.1.1", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "style-loader": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", - "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.6.4" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "stylus": { - "version": "0.54.7", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz", - "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==", - "dev": true, - "requires": { - "css-parse": "~2.0.0", - "debug": "~3.1.0", - "glob": "^7.1.3", - "mkdirp": "~0.5.x", - "safer-buffer": "^2.1.2", - "sax": "~1.2.4", - "semver": "^6.0.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "stylus-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", - "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "lodash.clonedeep": "^4.5.0", - "when": "~3.6.x" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "requires": { - "minimist": "^1.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - }, - "syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "requires": { - "acorn-node": "^1.2.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tar": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", - "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.0", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } - }, - "tar-fs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", - "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "tar-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", - "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", - "requires": { - "bl": "^4.0.1", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "terser": { - "version": "4.6.10", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.10.tgz", - "integrity": "sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.3.tgz", - "integrity": "sha512-bZFnotuIKq5Rqzrs+qIwFzGdKdffV9epG5vDSEbYzvKAhPeR5RbbrQysfPgbIIMhNAQtZD2hGwBfSKUXjXZZZw==", - "dev": true, - "requires": { - "cacache": "^15.0.4", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.0.0", - "p-limit": "^2.3.0", - "schema-utils": "^2.6.6", - "serialize-javascript": "^3.1.0", - "source-map": "^0.6.1", - "terser": "^4.6.13", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "cacache": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.4.tgz", - "integrity": "sha512-YlnKQqTbD/6iyoJvEY3KJftjrdBYroCbxxYXzhOzsFLWlp6KX4BOlEf4mTx0cMUfVaTS3ENL2QtDWeRYoGLkkw==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-worker": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", - "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - } - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "ts-node": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", - "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "^3.0.0" - } - }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - }, - "tslint": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz", - "integrity": "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.10.0", - "tsutils": "^2.29.0" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", - "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", - "dev": true - }, - "umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==" - }, - "undeclared-identifiers": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", - "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", - "requires": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universal-analytics": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", - "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", - "dev": true, - "requires": { - "debug": "^3.0.0", - "request": "^2.88.0", - "uuid": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util-promisify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", - "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "dev": true, - "requires": { - "builtins": "^1.0.3" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true - }, - "watchpack": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", - "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", - "dev": true, - "requires": { - "chokidar": "^3.4.0", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - } - }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webdriver-js-extender": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", - "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", - "dev": true, - "requires": { - "@types/selenium-webdriver": "^3.0.0", - "selenium-webdriver": "^3.0.1" - } - }, - "webpack": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", - "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "terser-webpack-plugin": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", - "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^3.1.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "webpack-subresource-integrity": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.4.0.tgz", - "integrity": "sha512-GB1kB/LwAWC3CxwcedGhMkxGpNZxSheCe1q+KJP1bakuieAdX/rGHEcf5zsEzhKXpqsGqokgsDoD9dIkr61VDQ==", - "dev": true, - "requires": { - "webpack-sources": "^1.3.0" - } - }, - "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", - "dev": true, - "requires": { - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "when": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", - "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "worker-plugin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-4.0.3.tgz", - "integrity": "sha512-7hFDYWiKcE3yHZvemsoM9lZis/PzurHAEX1ej8PLCu818Rt6QqUAiDdxHPCKZctzmhqzPpcFSgvMCiPbtooqAg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "dependencies": { - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - } - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - }, - "xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "zone.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", - "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==" - } - } -} diff --git a/Govt-Billing-Angular/package.json b/Govt-Billing-Angular/package.json deleted file mode 100644 index c74c1b7..0000000 --- a/Govt-Billing-Angular/package.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "name": "home-budget", - "version": "0.0.1", - "author": "Ionic Framework", - "homepage": "https://ionicframework.com/", - "scripts": { - "ng": "ng", - "start": "ng serve", - "build": "ng build", - "test": "ng test", - "lint": "ng lint", - "e2e": "ng e2e" - }, - "private": true, - "dependencies": { - "@angular/common": "~9.1.6", - "@angular/core": "~9.1.6", - "@angular/forms": "~9.1.6", - "@angular/platform-browser": "~9.1.6", - "@angular/platform-browser-dynamic": "~9.1.6", - "@angular/router": "~9.1.6", - "@capacitor/android": "^2.2.0", - "@capacitor/core": "^2.1.2", - "@capacitor/ios": "^2.2.0", - "@ionic-native/camera": "^5.27.0", - "@ionic-native/core": "^5.0.7", - "@ionic-native/email-composer": "^5.27.0", - "@ionic-native/in-app-browser": "^5.27.0", - "@ionic-native/in-app-purchase": "^5.27.0", - "@ionic-native/network": "^5.27.0", - "@ionic-native/printer": "^5.27.0", - "@ionic-native/social-sharing": "^5.27.0", - "@ionic-native/splash-screen": "^5.0.0", - "@ionic-native/status-bar": "^5.0.0", - "@ionic/angular": "^5.0.0", - "@ionic/storage": "^2.2.0", - "browserify": "^16.5.1", - "cordova-plugin-camera": "^4.1.0", - "cordova-plugin-dialogs": "^2.0.2", - "cordova-plugin-email-composer": "^0.9.2", - "cordova-plugin-inappbrowser": "^4.0.0", - "cordova-plugin-inapppurchase": "^1.2.0", - "cordova-plugin-network-information": "^2.0.2", - "cordova-plugin-printer": "^0.8.0", - "cordova-plugin-x-socialsharing": "^5.6.8", - "cordova-res": "^0.15.1", - "es6-promise-plugin": "^4.2.2", - "form-serializer": "^2.5.0", - "jetifier": "^1.6.6", - "jquery": "^3.5.1", - "native-run": "^1.0.0", - "remove-use-strict": "^1.0.0", - "rxjs": "~6.5.1", - "socialcalc": "git+https://github.com/mridulchaba/socialcalc.git", - "tslib": "^1.10.0", - "zone.js": "~0.10.2" - }, - "devDependencies": { - "@angular-devkit/build-angular": "~0.901.5", - "@angular/cli": "~9.1.5", - "@angular/compiler": "~9.1.6", - "@angular/compiler-cli": "~9.1.6", - "@angular/language-service": "~9.1.6", - "@capacitor/cli": "^2.2.0", - "@ionic/angular-toolkit": "^2.1.1", - "@types/jasmine": "~3.5.0", - "@types/jasminewd2": "~2.0.3", - "@types/node": "^12.11.1", - "codelyzer": "^5.1.2", - "jasmine-core": "~3.5.0", - "jasmine-spec-reporter": "~4.2.1", - "karma": "~5.0.0", - "karma-chrome-launcher": "~3.1.0", - "karma-coverage-istanbul-reporter": "~2.1.0", - "karma-jasmine": "~3.0.1", - "karma-jasmine-html-reporter": "^1.4.2", - "protractor": "~5.4.3", - "ts-node": "~8.3.0", - "tslint": "~6.1.0", - "typescript": "~3.8.3" - }, - "description": "An Ionic project", - "cordova": { - "plugins": { - "cordova-plugin-printer": {}, - "cordova-plugin-email-composer": {}, - "cordova-plugin-x-socialsharing": {}, - "cordova-plugin-camera": {}, - "cordova-plugin-network-information": {}, - "cordova-plugin-inapppurchase": {}, - "cordova-plugin-inappbrowser": {} - } - } -} diff --git a/Govt-Billing-Angular/removed from package json.txt b/Govt-Billing-Angular/removed from package json.txt deleted file mode 100644 index 0c62386..0000000 --- a/Govt-Billing-Angular/removed from package json.txt +++ /dev/null @@ -1,2 +0,0 @@ - "gulf-editor-socialcalc": "git+https://github.com/gulf/gulf-editor-socialcalc.git", - "socialcalc": "git+https://github.com/marcelklehr/socialcalc.git", diff --git a/Govt-Billing-Angular/resources/README.md b/Govt-Billing-Angular/resources/README.md deleted file mode 100644 index 46c696e..0000000 --- a/Govt-Billing-Angular/resources/README.md +++ /dev/null @@ -1,8 +0,0 @@ -These are Cordova resources. You can replace icon.png and splash.png and run -`ionic cordova resources` to generate custom icons and splash screens for your -app. See `ionic cordova resources --help` for details. - -Cordova reference documentation: - -- Icons: https://cordova.apache.org/docs/en/latest/config_ref/images.html -- Splash Screens: https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-splashscreen/ diff --git a/Govt-Billing-Angular/resources/android/icon/drawable-hdpi-icon.png b/Govt-Billing-Angular/resources/android/icon/drawable-hdpi-icon.png deleted file mode 100644 index 3f84fc1..0000000 Binary files a/Govt-Billing-Angular/resources/android/icon/drawable-hdpi-icon.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/icon/drawable-ldpi-icon.png b/Govt-Billing-Angular/resources/android/icon/drawable-ldpi-icon.png deleted file mode 100644 index 3de9b4f..0000000 Binary files a/Govt-Billing-Angular/resources/android/icon/drawable-ldpi-icon.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/icon/drawable-mdpi-icon.png b/Govt-Billing-Angular/resources/android/icon/drawable-mdpi-icon.png deleted file mode 100644 index 4b455d3..0000000 Binary files a/Govt-Billing-Angular/resources/android/icon/drawable-mdpi-icon.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/icon/drawable-xhdpi-icon.png b/Govt-Billing-Angular/resources/android/icon/drawable-xhdpi-icon.png deleted file mode 100644 index fe47ccc..0000000 Binary files a/Govt-Billing-Angular/resources/android/icon/drawable-xhdpi-icon.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/icon/drawable-xxhdpi-icon.png b/Govt-Billing-Angular/resources/android/icon/drawable-xxhdpi-icon.png deleted file mode 100644 index 391b4af..0000000 Binary files a/Govt-Billing-Angular/resources/android/icon/drawable-xxhdpi-icon.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/icon/drawable-xxxhdpi-icon.png b/Govt-Billing-Angular/resources/android/icon/drawable-xxxhdpi-icon.png deleted file mode 100644 index 09e50b7..0000000 Binary files a/Govt-Billing-Angular/resources/android/icon/drawable-xxxhdpi-icon.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/splash/drawable-land-hdpi-screen.png b/Govt-Billing-Angular/resources/android/splash/drawable-land-hdpi-screen.png deleted file mode 100644 index 74abe28..0000000 Binary files a/Govt-Billing-Angular/resources/android/splash/drawable-land-hdpi-screen.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/splash/drawable-land-ldpi-screen.png b/Govt-Billing-Angular/resources/android/splash/drawable-land-ldpi-screen.png deleted file mode 100644 index b224ba8..0000000 Binary files a/Govt-Billing-Angular/resources/android/splash/drawable-land-ldpi-screen.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/splash/drawable-land-mdpi-screen.png b/Govt-Billing-Angular/resources/android/splash/drawable-land-mdpi-screen.png deleted file mode 100644 index f18770e..0000000 Binary files a/Govt-Billing-Angular/resources/android/splash/drawable-land-mdpi-screen.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/splash/drawable-land-xhdpi-screen.png b/Govt-Billing-Angular/resources/android/splash/drawable-land-xhdpi-screen.png deleted file mode 100644 index 76eab0d..0000000 Binary files a/Govt-Billing-Angular/resources/android/splash/drawable-land-xhdpi-screen.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/splash/drawable-land-xxhdpi-screen.png b/Govt-Billing-Angular/resources/android/splash/drawable-land-xxhdpi-screen.png deleted file mode 100644 index b15925d..0000000 Binary files a/Govt-Billing-Angular/resources/android/splash/drawable-land-xxhdpi-screen.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/splash/drawable-land-xxxhdpi-screen.png b/Govt-Billing-Angular/resources/android/splash/drawable-land-xxxhdpi-screen.png deleted file mode 100644 index 4b22b8b..0000000 Binary files a/Govt-Billing-Angular/resources/android/splash/drawable-land-xxxhdpi-screen.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/splash/drawable-port-hdpi-screen.png b/Govt-Billing-Angular/resources/android/splash/drawable-port-hdpi-screen.png deleted file mode 100644 index c0c981b..0000000 Binary files a/Govt-Billing-Angular/resources/android/splash/drawable-port-hdpi-screen.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/splash/drawable-port-ldpi-screen.png b/Govt-Billing-Angular/resources/android/splash/drawable-port-ldpi-screen.png deleted file mode 100644 index dfba932..0000000 Binary files a/Govt-Billing-Angular/resources/android/splash/drawable-port-ldpi-screen.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/splash/drawable-port-mdpi-screen.png b/Govt-Billing-Angular/resources/android/splash/drawable-port-mdpi-screen.png deleted file mode 100644 index e5129fd..0000000 Binary files a/Govt-Billing-Angular/resources/android/splash/drawable-port-mdpi-screen.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/splash/drawable-port-xhdpi-screen.png b/Govt-Billing-Angular/resources/android/splash/drawable-port-xhdpi-screen.png deleted file mode 100644 index 14ec839..0000000 Binary files a/Govt-Billing-Angular/resources/android/splash/drawable-port-xhdpi-screen.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/splash/drawable-port-xxhdpi-screen.png b/Govt-Billing-Angular/resources/android/splash/drawable-port-xxhdpi-screen.png deleted file mode 100644 index 4df256f..0000000 Binary files a/Govt-Billing-Angular/resources/android/splash/drawable-port-xxhdpi-screen.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/splash/drawable-port-xxxhdpi-screen.png b/Govt-Billing-Angular/resources/android/splash/drawable-port-xxxhdpi-screen.png deleted file mode 100644 index 53f97f9..0000000 Binary files a/Govt-Billing-Angular/resources/android/splash/drawable-port-xxxhdpi-screen.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/android/xml/network_security_config.xml b/Govt-Billing-Angular/resources/android/xml/network_security_config.xml deleted file mode 100644 index de61259..0000000 --- a/Govt-Billing-Angular/resources/android/xml/network_security_config.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - localhost - - diff --git a/Govt-Billing-Angular/resources/icon.png b/Govt-Billing-Angular/resources/icon.png deleted file mode 100644 index bee7766..0000000 Binary files a/Govt-Billing-Angular/resources/icon.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-1024.png b/Govt-Billing-Angular/resources/ios/icon/icon-1024.png deleted file mode 100644 index be633f4..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-1024.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-20.png b/Govt-Billing-Angular/resources/ios/icon/icon-20.png deleted file mode 100644 index 08993e0..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-20.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-20@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon-20@2x.png deleted file mode 100644 index acbecd2..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-20@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-20@3x.png b/Govt-Billing-Angular/resources/ios/icon/icon-20@3x.png deleted file mode 100644 index 00de715..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-20@3x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-24@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon-24@2x.png deleted file mode 100644 index 4b455d3..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-24@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-27.5@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon-27.5@2x.png deleted file mode 100644 index c623f27..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-27.5@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-29.png b/Govt-Billing-Angular/resources/ios/icon/icon-29.png deleted file mode 100644 index 8a55da5..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-29.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-29@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon-29@2x.png deleted file mode 100644 index 185277b..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-29@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-29@3x.png b/Govt-Billing-Angular/resources/ios/icon/icon-29@3x.png deleted file mode 100644 index 3393f84..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-29@3x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-40.png b/Govt-Billing-Angular/resources/ios/icon/icon-40.png deleted file mode 100644 index acbecd2..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-40.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-40@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon-40@2x.png deleted file mode 100644 index 61d82a7..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-40@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-40@3x.png b/Govt-Billing-Angular/resources/ios/icon/icon-40@3x.png deleted file mode 100644 index cc349de..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-40@3x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-44@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon-44@2x.png deleted file mode 100644 index 00a2ff3..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-44@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-50.png b/Govt-Billing-Angular/resources/ios/icon/icon-50.png deleted file mode 100644 index 9e9a5c1..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-50.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-50@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon-50@2x.png deleted file mode 100644 index fe547b1..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-50@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-60.png b/Govt-Billing-Angular/resources/ios/icon/icon-60.png deleted file mode 100644 index 00de715..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-60.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-60@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon-60@2x.png deleted file mode 100644 index cc349de..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-60@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-60@3x.png b/Govt-Billing-Angular/resources/ios/icon/icon-60@3x.png deleted file mode 100644 index 3898828..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-60@3x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-72.png b/Govt-Billing-Angular/resources/ios/icon/icon-72.png deleted file mode 100644 index 3f84fc1..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-72.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-72@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon-72@2x.png deleted file mode 100644 index 391b4af..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-72@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-76.png b/Govt-Billing-Angular/resources/ios/icon/icon-76.png deleted file mode 100644 index 971034a..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-76.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-76@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon-76@2x.png deleted file mode 100644 index b538930..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-76@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-83.5@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon-83.5@2x.png deleted file mode 100644 index 5f8dbb2..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-83.5@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-86@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon-86@2x.png deleted file mode 100644 index 9798fc2..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-86@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-98@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon-98@2x.png deleted file mode 100644 index 5ebd9db..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-98@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-small.png b/Govt-Billing-Angular/resources/ios/icon/icon-small.png deleted file mode 100644 index 8a55da5..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-small.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-small@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon-small@2x.png deleted file mode 100644 index 185277b..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-small@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon-small@3x.png b/Govt-Billing-Angular/resources/ios/icon/icon-small@3x.png deleted file mode 100644 index 3393f84..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon-small@3x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon.png b/Govt-Billing-Angular/resources/ios/icon/icon.png deleted file mode 100644 index a90d46c..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/icon/icon@2x.png b/Govt-Billing-Angular/resources/ios/icon/icon@2x.png deleted file mode 100644 index 946c6ce..0000000 Binary files a/Govt-Billing-Angular/resources/ios/icon/icon@2x.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default-2436h.png b/Govt-Billing-Angular/resources/ios/splash/Default-2436h.png deleted file mode 100644 index bdbeb9d..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default-2436h.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default-568h@2x~iphone.png b/Govt-Billing-Angular/resources/ios/splash/Default-568h@2x~iphone.png deleted file mode 100644 index 5e9edf6..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default-568h@2x~iphone.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default-667h.png b/Govt-Billing-Angular/resources/ios/splash/Default-667h.png deleted file mode 100644 index 2843fb3..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default-667h.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default-736h.png b/Govt-Billing-Angular/resources/ios/splash/Default-736h.png deleted file mode 100644 index 21f2d42..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default-736h.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default-Landscape-2436h.png b/Govt-Billing-Angular/resources/ios/splash/Default-Landscape-2436h.png deleted file mode 100644 index 763ae78..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default-Landscape-2436h.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default-Landscape-736h.png b/Govt-Billing-Angular/resources/ios/splash/Default-Landscape-736h.png deleted file mode 100644 index 9c069f7..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default-Landscape-736h.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default-Landscape@2x~ipad.png b/Govt-Billing-Angular/resources/ios/splash/Default-Landscape@2x~ipad.png deleted file mode 100644 index 35407a9..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default-Landscape@2x~ipad.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default-Landscape@~ipadpro.png b/Govt-Billing-Angular/resources/ios/splash/Default-Landscape@~ipadpro.png deleted file mode 100644 index 75de9e0..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default-Landscape@~ipadpro.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default-Landscape~ipad.png b/Govt-Billing-Angular/resources/ios/splash/Default-Landscape~ipad.png deleted file mode 100644 index b74bbf6..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default-Landscape~ipad.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default-Portrait@2x~ipad.png b/Govt-Billing-Angular/resources/ios/splash/Default-Portrait@2x~ipad.png deleted file mode 100644 index d0c33f7..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default-Portrait@2x~ipad.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default-Portrait@~ipadpro.png b/Govt-Billing-Angular/resources/ios/splash/Default-Portrait@~ipadpro.png deleted file mode 100644 index 363dd1c..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default-Portrait@~ipadpro.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default-Portrait~ipad.png b/Govt-Billing-Angular/resources/ios/splash/Default-Portrait~ipad.png deleted file mode 100644 index aad1deb..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default-Portrait~ipad.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default@2x~iphone.png b/Govt-Billing-Angular/resources/ios/splash/Default@2x~iphone.png deleted file mode 100644 index f0f16ef..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default@2x~iphone.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default@2x~universal~anyany.png b/Govt-Billing-Angular/resources/ios/splash/Default@2x~universal~anyany.png deleted file mode 100644 index c8fcc8f..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default@2x~universal~anyany.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/ios/splash/Default~iphone.png b/Govt-Billing-Angular/resources/ios/splash/Default~iphone.png deleted file mode 100644 index e5129fd..0000000 Binary files a/Govt-Billing-Angular/resources/ios/splash/Default~iphone.png and /dev/null differ diff --git a/Govt-Billing-Angular/resources/splash.png b/Govt-Billing-Angular/resources/splash.png deleted file mode 100644 index 960cb82..0000000 Binary files a/Govt-Billing-Angular/resources/splash.png and /dev/null differ diff --git a/Govt-Billing-Angular/src/app/app-data.ts b/Govt-Billing-Angular/src/app/app-data.ts deleted file mode 100644 index 80087c0..0000000 --- a/Govt-Billing-Angular/src/app/app-data.ts +++ /dev/null @@ -1,4143 +0,0 @@ -export let APP_NAME = "Invoice Suite"; - -export let LINK = - "https://itunes.apple.com/us/app/check-book-register/id488517738?ls=1&mt=8"; - -export let DATA = { - ledger: { - iPad: { - msc: { - numsheets: 4, - currentid: "sheet1", - currentname: "typei", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE:b:1:1:1:1:f:6:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:t::b:2::2::l:1:f:7\ncell:G2:t::b:2::2::l:1:f:7\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2:::2:l:3:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:2::::l:1:f:7\ncell:G3:b:2:2:::l:3:f:7\ncell:A4:b::2:::l:3:f:7\ncell:B4:b::::2:l:3:f:3\ncell:C4:t:INVOICE # \\c:f:2:cf:2\ncell:D4:v:1:f:2:cf:2\ncell:F4:tvf:4:rowspan:4\ncell:G4:b::2:::l:3:f:7\ncell:A5:b::2:::l:3:f:7\ncell:B5:b::::2:l:3:f:4\ncell:F5:t::l:2:f:7\ncell:G5:t::b::1:::l:2:f:7\ncell:A6:b::2:::l:3:f:7\ncell:B6:b::::2:l:3:f:4\ncell:C6:t:INVOICE DATE\\c:f:2:cf:2\ncell:D6:f:2:cf:2:ntvf:3\ncell:F6:l:2:f:7\ncell:G6:b::1:::l:2:f:7\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::::2:l:3:f:4\ncell:G7:b::2:::l:3:f:7\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::::2:l:3:f:4\ncell:G8:b::2:::l:3:f:7\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::::2:l:3:f:4\ncell:C9:t:BILL TO\\c:l:3:f:2\ncell:E9:t:FROM\\c:f:2:cf:2\ncell:G9:b::2:::l:3:f:7\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::::2:l:3:f:3\ncell:C10:t:[Name]:f:1:cf:2:colspan:2\ncell:E10:t:[Name]:f:1:cf:2:colspan:2\ncell:G10:b::2:::l:3:f:7\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:E11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:G11:b::2:::l:3:f:7\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:E12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:G12:b::2:::l:3:f:7\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:Phone\\c:f:1:cf:2:colspan:2\ncell:E13:t:Phone\\c:f:1:cf:2:colspan:2\ncell:G13:b::2:::l:3:f:7\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::::2:l:3:f:3:cf:2\ncell:C14:b:::2::l:1:f:7\ncell:D14:b:::2::l:3:f:3:cf:2\ncell:E14:b:::2::l:1:f:7\ncell:F14:b:::2::l:1:f:7\ncell:G14:b::2:::l:3:f:7\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::2::2:l:3:f:7\ncell:C15:t:Description:b:1::1:1:f:2:cf:1:colspan:3\ncell:D15:t:Description:b:1::1::l:3:f:3:cf:2:colspan:2:rowspan:1\ncell:E15:t::b:2:2:2::l:1:f:7\ncell:F15:t:Amount:b:1:1:1:1:f:2:cf:1\ncell:G15:b::2::2:l:3:f:7\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::2::2:l:3:f:7\ncell:C16:b:1:1::1:f:1:cf:2:colspan:3\ncell:D16:b:1:1:::l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:E16:t::b:2:2:2::l:1:f:7\ncell:F16:b:1:1:::f:1:ntvf:1\ncell:G16:b::2::2:l:3:f:7\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::2::2:l:3:f:7:cf:2\ncell:C17:b::1::1:f:1:cf:2:colspan:3\ncell:D17:b::1:::l:1:f:7:colspan:2\ncell:E17:l:1:f:7\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::2::2:l:3:f:7\ncell:A18:b::2:::l:3:f:7\ncell:B18:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C18:b::1::1:f:1:cf:2:colspan:3\ncell:D18:b::1:::colspan:2\ncell:F18:b::1:::f:1:ntvf:1\ncell:G18:b::2::2:l:3:f:7\ncell:A19:b::2:::l:3:f:7\ncell:B19:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C19:b::1::1:f:1:cf:2:colspan:3\ncell:D19:b::1:::colspan:2\ncell:F19:b::1:::f:1:ntvf:1\ncell:G19:b::2::2:l:3:f:7\ncell:A20:b::2:::l:3:f:7\ncell:B20:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C20:b::1::1:f:1:cf:2:colspan:3\ncell:D20:b::1:::colspan:2\ncell:F20:b::1:::f:1:ntvf:1\ncell:G20:b::2::2:l:3:f:7\ncell:A21:b::2:::l:3:f:7\ncell:B21:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C21:b::1::1:f:1:cf:2:colspan:3\ncell:D21:b::1:::colspan:2\ncell:F21:b::1:::f:1:ntvf:1\ncell:G21:b::2::2:l:3:f:7\ncell:A22:b::2:::l:3:f:7\ncell:B22:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C22:b::1::1:f:1:cf:2:colspan:3\ncell:D22:b::1:::colspan:2\ncell:F22:b::1:::f:1:ntvf:1\ncell:G22:b::2::2:l:3:f:7\ncell:A23:b::2:::l:3:f:7\ncell:B23:b::2::2:l:3:f:7:cf:2\ncell:C23:b::1::1:f:1:cf:2:colspan:3\ncell:D23:b::1:::colspan:2\ncell:F23:b::1:::f:1:ntvf:1\ncell:G23:b::2::2:l:3:f:7\ncell:A24:b::2:::l:3:f:7\ncell:B24:b::2::2:l:3:f:7:cf:2\ncell:C24:b::1::1:f:1:cf:2:colspan:3\ncell:D24:b::1:::colspan:2\ncell:F24:b::1:::f:1:ntvf:1\ncell:G24:b::2::2:l:3:f:7\ncell:A25:b::2:::l:3:f:7\ncell:B25:b::2::2:l:3:f:7:cf:2\ncell:C25:b::1::1:f:1:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:1:ntvf:1\ncell:G25:b::2::2:l:3:f:7\ncell:A26:b::2:::l:3:f:7\ncell:B26:b::2::2:l:3:f:7:cf:2\ncell:C26:b::1::1:f:1:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:1:ntvf:1\ncell:G26:b::2::2:l:3:f:7\ncell:A27:b::2:::l:3:f:7\ncell:B27:b::2::2:l:3:f:7:cf:2\ncell:C27:b::1::1:f:1:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:1:ntvf:1\ncell:G27:b::2::2:l:3:f:7\ncell:A28:b::2:::l:3:f:4\ncell:B28:b::2::2:l:3:f:7:cf:2\ncell:C28:b::1:1:1:f:1:cf:2:colspan:3\ncell:D28:b::1:1::l:3:f:7:cf:2:colspan:2\ncell:E28:b:::2::l:3:f:7:cf:2\ncell:F28:b::1:1::f:1:ntvf:1\ncell:G28:b::2::2:l:3:f:7\ncell:A29:b::2:::l:3:f:3\ncell:B29:b::2::2:l:3:f:3\ncell:C29:t:TOTAL:b:1:1:1:1:f:5:cf:2:colspan:3\ncell:D29:b:2::2::l:3:f:8:cf:2\ncell:E29:b:2:2:2::l:3:f:8:cf:2\ncell:F29:vtf:n:0:SUM(F16\\cF28):b:1:1:1::f:5:ntvf:1\ncell:G29:b::2::2:l:3:f:4\ncell:A30:b::2:::l:3:f:7\ncell:B30:b::::2:l:3:f:3:cf:2\ncell:C30:b:2::::l:1:f:7\ncell:D30:b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:7\ncell:F30:b:2::::l:1:f:7\ncell:G30:b::2:::l:3:f:3\ncell:A31:b::2:::l:3:f:7\ncell:B31:b::::2:l:3:f:7\ncell:D31:tvf:4:rowspan:4\ncell:G31:b::2:::l:3:f:7\ncell:A32:b::2:::l:3:f:7\ncell:B32:b::::2:l:3:f:7\ncell:G32:b::2:::l:3:f:7\ncell:A33:b::2:::l:3:f:7\ncell:B33:b::::2:l:3:f:7\ncell:G33:b::2:::l:3:f:7\ncell:A34:b::2:::l:3:f:7\ncell:B34:b::::2:l:3:f:7\ncell:G34:b::2:::l:3:f:7\ncell:A35:b::2:::l:3:f:7\ncell:B35:b:::2:2:l:3:f:7\ncell:C35:b:::2::l:3:f:7\ncell:D35:b:::2::l:3:f:7\ncell:E35:b:::2::l:3:f:7\ncell:F35:b:::2::l:3:f:7\ncell:G35:b::2:2::l:3:f:7\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncell:F36:b:1:::\ncell:G36:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:105\ncol:D:w:182\ncol:E:w:110\ncol:F:w:115\ncol:G:w:65\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:7:r:36:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:normal bold * Trebuchet MS\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 12pt Arial\nfont:5:normal bold 12pt Trebuchet MS\nfont:6:normal bold 14pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "typei", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - 'version:1.5\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE:b:1:1:1:1:l:3:f:6:cf:1:colspan:8\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:t::b:2::2::l:1:f:7\ncell:G2:b:2::2::l:1:f:7\ncell:H2:b:2::2::l:1:f:7\ncell:I2:t::b:2::2::l:1:f:7\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2:::2:l:3:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:2::::l:1:f:7\ncell:G3:b:2::::l:1:f:7\ncell:H3:b:2::::l:1:f:7\ncell:I3:b:2:2:::l:3:f:7\ncell:A4:b::2:::l:3:f:7\ncell:B4:b::::2:l:3:f:3\ncell:C4:t:INVOICE # \\c:f:2:cf:2\ncell:D4:v:1:f:2:cf:2\ncell:F4:tvf:5:colspan:2:rowspan:4\ncell:I4:b::2:::l:3:f:7\ncell:A5:b::2:::l:3:f:7\ncell:B5:b::::2:l:3:f:4\ncell:F5:t::l:2:f:7\ncell:G5:l:2:f:7\ncell:H5:l:2:f:7\ncell:I5:t::b::1:::l:2:f:7\ncell:A6:b::2:::l:3:f:7\ncell:B6:b::::2:l:3:f:4\ncell:C6:t:INVOICE DATE\\c:f:2:cf:2\ncell:D6:f:2:cf:2:ntvf:4\ncell:F6:l:2:f:7\ncell:G6:l:2:f:7\ncell:H6:l:2:f:7\ncell:I6:b::1:::l:2:f:7\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::::2:l:3:f:4\ncell:I7:b::2:::l:3:f:7\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::::2:l:3:f:4\ncell:I8:b::2:::l:3:f:7\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::::2:l:3:f:4\ncell:C9:t:BILL TO\\c:f:2\ncell:E9:t:FROM\\c:f:2:cf:2\ncell:F9:colspan:3\ncell:I9:b::2:::l:3:f:7\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::::2:l:3:f:3\ncell:C10:t:[Name]:f:1:cf:2:colspan:2\ncell:E10:t:[Name]:f:1:cf:2:colspan:4\ncell:I10:b::2:::l:3:f:7\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:E11:t:[Street Address]:f:1:colspan:4\ncell:I11:b::2:::l:3:f:7\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:E12:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:I12:b::2:::l:3:f:7\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:Phone\\c :f:1:cf:2:colspan:2\ncell:E13:t:Phone\\c :f:1:cf:2:colspan:4\ncell:I13:b::2:::l:3:f:7\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::::2:l:3:f:3:cf:2\ncell:C14:b:::2::l:1:f:7\ncell:D14:b:::2::l:3:f:3:cf:2\ncell:E14:b:::2::l:1:f:7\ncell:F14:b:::2::l:1:f:7\ncell:G14:b:::2::l:1:f:7\ncell:H14:b:::2::l:1:f:7\ncell:I14:b::2:::l:3:f:7\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::2::2:l:3:f:7\ncell:C15:t:Description:b:1:1:1:1:f:2:cf:1:colspan:3\ncell:D15:t:Description:b:2::2:2:l:3:f:3:cf:2:colspan:2:rowspan:1\ncell:E15:t::b:2:2:2::l:1:f:7\ncell:F15:t:Hours:b:1:1:1:1:f:2:cf:1\ncell:G15:t:Rate:b:1:1:1:1:f:2:cf:1\ncell:H15:t:Amount:b:1:1:1:1:f:2:cf:1\ncell:I15:b::2::2:l:3:f:7\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::2::2:l:3:f:7\ncell:C16:b:1:1::1:f:1:cf:2:colspan:3\ncell:D16:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:E16:t::b:2:2:2::l:1:f:7\ncell:F16:b:1:1:::f:1:ntvf:1\ncell:G16:b:1:1:::f:1:ntvf:1\ncell:H16:vtf:t::IF(F16*G16>0,F16*G16,""):b:1:1:::f:1:ntvf:1\ncell:I16:b::2::2:l:3:f:7\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::2::2:l:3:f:7:cf:2\ncell:C17:b::1::1:f:1:cf:2:colspan:3\ncell:D17:b::1::1:l:1:f:7:colspan:2\ncell:E17:l:1:f:7\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::1:::f:1:ntvf:1\ncell:H17:vtf:t::IF(F17*G17>0,F17*G17,""):b::1:::f:1:ntvf:1\ncell:I17:b::2::2:l:3:f:7\ncell:A18:b::2:::l:3:f:7\ncell:B18:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C18:b::1::1:f:1:cf:2:colspan:3\ncell:D18:b::1::1:colspan:2\ncell:F18:b::1:::f:1:ntvf:1\ncell:G18:b::1:::f:1:ntvf:1\ncell:H18:vtf:t::IF(F18*G18>0,F18*G18,""):b::1:::f:1:ntvf:1\ncell:I18:b::2::2:l:3:f:7\ncell:A19:b::2:::l:3:f:7\ncell:B19:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C19:b::1::1:f:1:cf:2:colspan:3\ncell:D19:b::1::1:colspan:2\ncell:F19:b::1:::f:1:ntvf:1\ncell:G19:b::1:::f:1:ntvf:1\ncell:H19:vtf:t::IF(F19*G19>0,F19*G19,""):b::1:::f:1:ntvf:1\ncell:I19:b::2::2:l:3:f:7\ncell:A20:b::2:::l:3:f:7\ncell:B20:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C20:b::1::1:f:1:cf:2:colspan:3\ncell:D20:b::1::1:colspan:2\ncell:F20:b::1:::f:1:ntvf:1\ncell:G20:b::1:::f:1:ntvf:1\ncell:H20:vtf:t::IF(F20*G20>0,F20*G20,""):b::1:::f:1:ntvf:1\ncell:I20:b::2::2:l:3:f:7\ncell:A21:b::2:::l:3:f:7\ncell:B21:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C21:b::1::1:f:1:cf:2:colspan:3\ncell:D21:b::1::1:colspan:2\ncell:F21:b::1:::f:1:ntvf:1\ncell:G21:b::1:::f:1:ntvf:1\ncell:H21:vtf:t::IF(F21*G21>0,F21*G21,""):b::1:::f:1:ntvf:1\ncell:I21:b::2::2:l:3:f:7\ncell:A22:b::2:::l:3:f:7\ncell:B22:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C22:b::1::1:f:1:cf:2:colspan:3\ncell:D22:b::1::1:colspan:2\ncell:F22:b::1:::f:1:ntvf:1\ncell:G22:b::1:::f:1:ntvf:1\ncell:H22:vtf:t::IF(F22*G22>0,F22*G22,""):b::1:::f:1:ntvf:1\ncell:I22:b::2::2:l:3:f:7\ncell:A23:b::2:::l:3:f:7\ncell:B23:b::2::2:l:3:f:7:cf:2\ncell:C23:b::1::1:f:1:cf:2:colspan:3\ncell:D23:b::1::1:colspan:2\ncell:F23:b::1:::f:1:ntvf:1\ncell:G23:b::1:::f:1:ntvf:1\ncell:H23:vtf:t::IF(F23*G23>0,F23*G23,""):b::1:::f:1:ntvf:1\ncell:I23:b::2::2:l:3:f:7\ncell:A24:b::2:::l:3:f:7\ncell:B24:b::2::2:l:3:f:7:cf:2\ncell:C24:b::1::1:f:1:cf:2:colspan:3\ncell:D24:b::1::1:colspan:2\ncell:F24:b::1:::f:1:ntvf:1\ncell:G24:b::1:::f:1:ntvf:1\ncell:H24:vtf:t::IF(F24*G24>0,F24*G24,""):b::1:::f:1:ntvf:1\ncell:I24:b::2::2:l:3:f:7\ncell:A25:b::2:::l:3:f:7\ncell:B25:b::2::2:l:3:f:7:cf:2\ncell:C25:b::1::1:f:1:cf:2:colspan:3\ncell:D25:b::1::1:colspan:2\ncell:F25:b::1:::f:1:ntvf:1\ncell:G25:b::1:::f:1:ntvf:1\ncell:H25:vtf:t::IF(F25*G25>0,F25*G25,""):b::1:::f:1:ntvf:1\ncell:I25:b::2::2:l:3:f:7\ncell:A26:b::2:::l:3:f:7\ncell:B26:b::2::2:l:3:f:7:cf:2\ncell:C26:b::1::1:f:1:cf:2:colspan:3\ncell:D26:b::1::1:colspan:2\ncell:F26:b::1:::f:1:ntvf:1\ncell:G26:b::1:::f:1:ntvf:1\ncell:H26:vtf:t::IF(F26*G26>0,F26*G26,""):b::1:::f:1:ntvf:1\ncell:I26:b::2::2:l:3:f:7\ncell:A27:b::2:::l:3:f:7\ncell:B27:b::2::2:l:3:f:7:cf:2\ncell:C27:b::1::1:f:1:cf:2:colspan:3\ncell:D27:b::1::1:colspan:2\ncell:F27:b::1:::f:1:ntvf:1\ncell:G27:b::1:::f:1:ntvf:1\ncell:H27:vtf:t::IF(F27*G27>0,F27*G27,""):b::1:::f:1:ntvf:1\ncell:I27:b::2::2:l:3:f:7\ncell:A28:b::2:::l:3:f:4\ncell:B28:b::2::2:l:3:f:7:cf:2\ncell:C28:b::1:1:1:f:1:cf:2:colspan:3\ncell:D28:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:E28:b:::2::l:3:f:7:cf:2\ncell:F28:b::1:1::f:1:ntvf:1\ncell:G28:b::1:1::f:1:ntvf:1\ncell:H28:vtf:t::IF(F28*G28>0,F28*G28,""):b::1:::f:1:ntvf:1\ncell:I28:b::2::2:l:3:f:7\ncell:A29:b::2:::l:3:f:3\ncell:B29:b::2::2:l:3:f:3\ncell:C29:t:TOTAL:b:1:1:1:1:l:3:f:5:cf:2:colspan:5\ncell:D29:b:2::2::l:3:f:8:cf:2\ncell:E29:b:2:2:2::l:3:f:8:cf:2\ncell:F29:vtf:n:0:SUM(F16\\cF28):b:2:2:2::l:3:f:4:ntvf:2\ncell:G29:b:2:2:2::l:3:f:4:ntvf:2\ncell:H29:vtf:n:0:SUM(H16\\cH28):b:1:1:1::f:5:ntvf:1\ncell:I29:b::2::2:l:3:f:4\ncell:A30:b::2:::l:3:f:7\ncell:B30:b::::2:l:3:f:3:cf:2\ncell:C30:b:2::::l:1:f:7\ncell:D30:b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:7\ncell:F30:b:2::::l:1:f:7\ncell:G30:b:2::::l:1:f:7\ncell:H30:b:2::::l:1:f:7\ncell:I30:b::2:::l:3:f:3\ncell:A31:b::2:::l:3:f:7\ncell:B31:b::::2:l:3:f:7\ncell:D31:tvf:5:rowspan:4\ncell:I31:b::2:::l:3:f:7\ncell:A32:b::2:::l:3:f:7\ncell:B32:b::::2:l:3:f:7\ncell:I32:b::2:::l:3:f:7\ncell:A33:b::2:::l:3:f:7\ncell:B33:b::::2:l:3:f:7\ncell:I33:b::2:::l:3:f:7\ncell:A34:b::2:::l:3:f:7\ncell:B34:b::::2:l:3:f:7\ncell:I34:b::2:::l:3:f:7\ncell:A35:b::2:::l:3:f:7\ncell:B35:b:::2:2:l:3:f:7\ncell:C35:b:::2::l:3:f:7\ncell:D35:b:::2::l:3:f:7\ncell:E35:b:::2::l:3:f:7\ncell:F35:b:::2::l:3:f:7\ncell:G35:b:::2::l:3:f:7\ncell:H35:b:::2::l:3:f:7\ncell:I35:b::2:2::l:3:f:7\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncell:F36:b:1:::\ncell:G36:b:1:::\ncell:H36:b:1:::\ncell:I36:b:1:::\ncol:A:w:26\ncol:B:w:28\ncol:C:w:96\ncol:D:w:203\ncol:E:w:51\ncol:F:w:50\ncol:G:w:58\ncol:H:w:80\ncol:I:w:28\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:9:r:36:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:normal bold * Trebuchet MS\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 12pt Arial\nfont:5:normal bold 12pt Trebuchet MS\nfont:6:normal bold 14pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00;(#,##0.00)\nvalueformat:3:d-mmm\nvalueformat:4:m/d/yy\nvalueformat:5:text-html\n', - }, - name: "typeii", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:l:3\ncell:B2:t:[Company Name]:l:1:f:3:cf:2:colspan:3\ncell:C2:t::l:2:f:9\ncell:D2:t::l:2:f:9\ncell:E2:l:1:f:7:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:9\ncell:B3:t:[Company Slogan]:f:4:cf:2:colspan:3\ncell:C3:t::l:2:f:9\ncell:D3:t::l:2:f:9\ncell:B4:f:2:colspan:2\ncell:F4:tvf:4:rowspan:4\ncell:B5:t:[Street Address]:f:1:cf:2:colspan:2\ncell:F5:l:1:f:6\ncell:G5:l:1:f:10:cf:1\ncell:B6:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:G6:l:1:f:9\ncell:B7:t:Phone\\c :f:1:cf:2:colspan:2\ncell:B8:t:Email\\c:f:1:cf:2:colspan:2\ncell:B9:colspan:2\ncell:F9:t:DATE \\c:l:1:f:6:cf:2\ncell:G9:l:1:f:10:cf:2:ntvf:3\ncell:B10:t:BILL TO\\c:f:5:c:1:bg:3:cf:2:colspan:2\ncell:F10:t:INVOICE # \\c:l:1:f:6:cf:2\ncell:G10:v:1:l:1:f:10:cf:2\ncell:B11:t:[Name]:f:1:cf:2:colspan:2\ncell:B12:t:[Company Name]:f:1:cf:2:colspan:2\ncell:F12:t: \ncell:B13:t:[Street Address]:f:1:cf:2:colspan:2\ncell:B14:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:B15:t:Phone\\c :f:1:cf:2:colspan:2\ncell:A17:b::1::\ncell:B17:t:DESCRIPTION:b:1:1:1:1:l:1:f:6:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C17:t::l:2:f:9\ncell:D17:t::l:2:f:9\ncell:E17:t::l:2:f:9\ncell:F17:t::l:2:f:9\ncell:G17:t:AMOUNT:b:1:1:1::l:1:f:6:c:1:bg:3:cf:1\ncell:A18:b::1::\ncell:B18:b:1:1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C18:t::l:2:f:9\ncell:D18:t::l:2:f:9\ncell:E18:t::l:2:f:9\ncell:F18:t::b::2:::l:1:f:9\ncell:G18:b::1::1:f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C19:t::l:2:f:9\ncell:D19:t::l:2:f:9\ncell:E19:t::l:2:f:9\ncell:F19:t::b::2:::l:1:f:9\ncell:G19:b::1::1:f:1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C20:t::l:2:f:9\ncell:D20:t::l:2:f:9\ncell:E20:t::l:2:f:9\ncell:F20:t::b::2:::l:1:f:9\ncell:G20:b::1::1:f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C21:t::l:2:f:9\ncell:D21:t::l:2:f:9\ncell:E21:t::l:2:f:9\ncell:F21:t::b::2:::l:1:f:9\ncell:G21:b::1::1:f:1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C22:t::l:2:f:9\ncell:D22:t::l:2:f:9\ncell:E22:t::l:2:f:9\ncell:F22:t::b::2:::l:1:f:9\ncell:G22:b::1::1:f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:9\ncell:D23:t::l:2:f:9\ncell:E23:t::l:2:f:9\ncell:F23:t::b::2:::l:1:f:9\ncell:G23:b::1::1:f:1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:9\ncell:D24:t::l:2:f:9\ncell:E24:t::l:2:f:9\ncell:F24:t::b::2:::l:1:f:9\ncell:G24:b::1::1:f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:9\ncell:D25:t::l:2:f:9\ncell:E25:t::l:2:f:9\ncell:F25:t::b::2:::l:1:f:9\ncell:G25:b::1::1:f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:9\ncell:D26:t::l:2:f:9\ncell:E26:t::l:2:f:9\ncell:F26:t::b::2:::l:1:f:9\ncell:G26:b::1::1:f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:9\ncell:D27:t::l:2:f:9\ncell:E27:t::l:2:f:9\ncell:F27:t::b::2:::l:1:f:9\ncell:G27:b::1::1:f:1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:9\ncell:D28:t::l:2:f:9\ncell:E28:t::l:2:f:9\ncell:F28:t::b::2:::l:1:f:9\ncell:G28:b::1::1:f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:f:1:cf:2:colspan:5:rowspan:1\ncell:C29:t::b:::2::l:1:f:9\ncell:D29:t::b:::2::l:1:f:9\ncell:E29:t::b:::2::l:1:f:9\ncell:F29:t::b::2:2::l:1:f:9\ncell:G29:b::1:1:1:f:1:ntvf:1\ncell:B30:b:2::::l:1:f:9\ncell:C30:b:2::::l:1:f:9\ncell:D30:b:2::::l:1:f:9\ncell:E30:b:2::::l:1:f:10\ncell:F30:t:Subtotal:b:2::::l:1:f:10\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::f:8:ntvf:1\ncell:B31:t:NOTES:b:::2::l:1:f:6:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:9\ncell:D31:t::b:::2::l:1:f:9\ncell:F31:t:Tax Rate:l:1:f:1\ncell:G31:v:0:f:1:ntvf:2\ncell:B32:b:1::::f:1:cf:2:colspan:3\ncell:C32:t::b:2::::l:1:f:9\ncell:D32:t::b:2::::l:1:f:9\ncell:F32:t:Tax:l:1:f:1\ncell:G32:vtf:n:0:G31*G30:f:1:ntvf:1\ncell:B33:f:1:cf:2:colspan:3\ncell:C33:t::l:2:f:9\ncell:D33:t::l:2:f:9\ncell:F33:t:Other:b:::1::l:1:f:1\ncell:G33:v:0:b:::1::f:1:ntvf:1\ncell:B34:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:2:f:9\ncell:D34:t::l:2:f:9\ncell:F34:t:TOTAL:b:2::::l:1:f:6\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::::f:5:ntvf:1\ncell:C36:tvf:4:colspan:5:rowspan:7\ncol:A:w:40\ncol:B:w:232\ncol:C:w:53\ncol:D:w:90\ncol:E:w:54\ncol:F:w:91\ncol:G:w:99\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nsheet:c:7:r:36:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 16pt Trebuchet MS\nfont:4:italic normal * Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 28pt Trebuchet MS\nfont:8:normal normal * Trebuchet MS\nfont:9:normal normal 10pt Arial\nfont:10:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "typeiii", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:3\ncell:B2:t:[Company Name]:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C2:t::l:2:f:7\ncell:D2:t::l:2:f:7\ncell:F2:t:INVOICE:l:1:f:6:c:1:cf:2:colspan:2\ncell:G2:t::l:2:f:7\ncell:B3:t:[Company slogan]:f:3:cf:2:colspan:3:rowspan:1\ncell:C3:t::l:2:f:7\ncell:D3:t::l:2:f:7\ncell:B4:cf:2:colspan:3:rowspan:1\ncell:F4:tvf:4:rowspan:4\ncell:B5:t:[Street Address]:f:1:cf:2:colspan:3:rowspan:1\ncell:F5:l:1:f:5\ncell:G5:l:1:f:8:cf:1\ncell:B6:t:[City, State, Zip]:f:1:cf:2:colspan:3:rowspan:1\ncell:G6:l:1:f:7\ncell:B7:t:Phone\\c :f:1:cf:2:colspan:3:rowspan:1\ncell:B8:t:Email\\c:f:1:cf:2:colspan:3:rowspan:1\ncell:B9:cf:2:colspan:3:rowspan:1\ncell:B10:t:BILL TO\\c:l:1:f:5:bg:2:cf:2:colspan:2\ncell:F10:t:DATE\\c:l:1:f:5:cf:2\ncell:G10:l:1:f:8:cf:2:ntvf:3\ncell:B11:t:[Name]:f:1:cf:2:colspan:3:rowspan:1\ncell:F11:t:INVOICE # \\c:l:1:f:5:cf:2\ncell:G11:v:1:l:1:f:8:cf:2\ncell:B12:t:[Company Name]:f:1:cf:2:colspan:3:rowspan:1\ncell:J12:tvf:4\ncell:B13:t:[Street Address]:f:1:cf:2:colspan:3:rowspan:1\ncell:B14:t:[City, State, Zip]:f:1:cf:2:colspan:3:rowspan:1\ncell:B15:t:Phone\\c :f:1:cf:2:colspan:3:rowspan:1\ncell:B16:cf:2:colspan:3:rowspan:1\ncell:A17:b::1::\ncell:B17:t:DESCRIPTION:b:1:1:1:1:l:1:f:5:bg:2:cf:1:colspan:3:rowspan:1\ncell:C17:t::b:1::1::l:1:f:7:bg:2\ncell:D17:t::b:1::1::l:1:f:7:bg:2\ncell:E17:t:HOURS:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:F17:t:RATE:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:G17:t:AMOUNT:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:A18:b::1::\ncell:B18:b:1:1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C18:t::b:2::::l:1:f:7\ncell:D18:t::b:2:2:::l:1:f:7\ncell:E18:b:1:1::1:f:1:ntvf:1\ncell:F18:b:1:1::1:f:1:ntvf:1\ncell:G18:vtf:t::IF(E18*F18>0,E18*F18,""):b:1:1:::f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C19:t::l:2:f:7\ncell:D19:t::b::2:::l:1:f:7\ncell:E19:b::1::1:f:1:ntvf:1\ncell:F19:b::1::1:f:1:ntvf:1\ncell:G19:vtf:t::IF(E19*F19>0,E19*F19,""):b::1:::f:1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C20:t::l:2:f:7\ncell:D20:t::b::2:::l:1:f:7\ncell:E20:b::1::1:f:1:ntvf:1\ncell:F20:b::1::1:f:1:ntvf:1\ncell:G20:vtf:t::IF(E20*F20>0,E20*F20,""):b::1:::f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C21:t::l:2:f:7\ncell:D21:t::b::2:::l:1:f:7\ncell:E21:b::1::1:f:1:ntvf:1\ncell:F21:b::1::1:f:1:ntvf:1\ncell:G21:vtf:t::IF(E21*F21>0,E21*F21,""):b::1:::f:1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C22:t::l:2:f:7\ncell:D22:t::b::2:::l:1:f:7\ncell:E22:b::1::1:f:1:ntvf:1\ncell:F22:b::1::1:f:1:ntvf:1\ncell:G22:vtf:t::IF(E22*F22>0,E22*F22,""):b::1:::f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C23:t::l:2:f:7\ncell:D23:t::b::2:::l:1:f:7\ncell:E23:b::1::1:f:1:ntvf:1\ncell:F23:b::1::1:f:1:ntvf:1\ncell:G23:vtf:t::IF(E23*F23>0,E23*F23,""):b::1:::f:1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C24:t::l:2:f:7\ncell:D24:t::b::2:::l:1:f:7\ncell:E24:b::1::1:f:1:ntvf:1\ncell:F24:b::1::1:f:1:ntvf:1\ncell:G24:vtf:t::IF(E24*F24>0,E24*F24,""):b::1:::f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C25:t::l:2:f:7\ncell:D25:t::b::2:::l:1:f:7\ncell:E25:b::1::1:f:1:ntvf:1\ncell:F25:b::1::1:f:1:ntvf:1\ncell:G25:vtf:t::IF(E25*F25>0,E25*F25,""):b::1:::f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C26:t::l:2:f:7\ncell:D26:t::b::2:::l:1:f:7\ncell:E26:b::1::1:f:1:ntvf:1\ncell:F26:b::1::1:f:1:ntvf:1\ncell:G26:vtf:t::IF(E26*F26>0,E26*F26,""):b::1:::f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C27:t::l:2:f:7\ncell:D27:t::b::2:::l:1:f:7\ncell:E27:b::1::1:f:1:ntvf:1\ncell:F27:b::1::1:f:1:ntvf:1\ncell:G27:vtf:t::IF(E27*F27>0,E27*F27,""):b::1:::f:1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C28:t::l:2:f:7\ncell:D28:t::b::2:::l:1:f:7\ncell:E28:b::1::1:f:1:ntvf:1\ncell:F28:b::1::1:f:1:ntvf:1\ncell:G28:vtf:t::IF(E28*F28>0,E28*F28,""):b::1:::f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C29:t::b:::2::l:1:f:7\ncell:D29:t::b::2:2::l:1:f:7\ncell:E29:b::1:1:1:f:1:ntvf:1\ncell:F29:b::1:1:1:f:1:ntvf:1\ncell:G29:vtf:t::IF(E29*F29>0,E29*F29,""):b::1:::f:1:ntvf:1\ncell:B30:b:2::::l:1:f:8:cf:1:colspan:3:rowspan:1\ncell:C30:t::b:2::::l:1:f:7\ncell:D30:t::b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:8\ncell:F30:t:Subtotal:b:1::::f:1\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::f:1:ntvf:1\ncell:B31:t:NOTES:b:::2::l:1:f:5:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:7\ncell:D31:t::b:::2::l:1:f:7\ncell:F31:t:Tax Rate:f:1\ncell:G31:v:0:f:1:ntvf:2\ncell:B32:b:1::::f:1:cf:2:colspan:3:rowspan:1\ncell:C32:t::b:2::::l:1:f:7\ncell:D32:t::b:2::::l:1:f:7\ncell:F32:t:Tax:f:1\ncell:G32:vtf:n:0:G31*G30:f:1:ntvf:1\ncell:B33:f:1:cf:2:colspan:3:rowspan:1\ncell:C33:t::l:2:f:7\ncell:D33:t::l:2:f:7\ncell:F33:t:Other:b:::1::l:1:f:1\ncell:G33:v:0:b:::1::f:1:ntvf:1\ncell:B34:f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:2:f:7\ncell:D34:t::l:2:f:7\ncell:F34:t:TOTAL:b:1::::l:1:f:4\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::::f:4:ntvf:1\ncell:B35:b:2::::l:1:f:7\ncell:C35:b:2::::l:1:f:7\ncell:D35:b:2::::l:1:f:7\ncell:C36:tvf:4:colspan:5:rowspan:7\ncol:A:w:40\ncol:B:w:194\ncol:C:w:128\ncol:D:w:60\ncol:E:w:65\ncol:F:w:95\ncol:G:w:90\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:10:r:36:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0,0,0)\ncolor:2:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 16pt Trebuchet MS\nfont:3:italic normal * Trebuchet MS\nfont:4:normal bold * Trebuchet MS\nfont:5:normal bold 10pt Trebuchet MS\nfont:6:normal bold 28pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "typeiv", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "typei!C10": true, - "typei!B2": true, - "typei!C11": true, - "typei!C12": true, - "typei!C13": true, - "typei!D9": true, - "typei!D4": true, - "typei!D6": true, - "typei!E10": true, - "typei!E11": true, - "typei!E12": true, - "typei!E13": true, - "typei!F9": true, - "typei!C16": true, - "typei!C17": true, - "typei!C18": true, - "typei!C19": true, - "typei!C20": true, - "typei!C21": true, - "typei!C22": true, - "typei!C23": true, - "typei!C24": true, - "typei!C25": true, - "typei!C26": true, - "typei!C27": true, - "typei!C28": true, - "typei!F16": true, - "typei!F17": true, - "typei!F18": true, - "typei!F19": true, - "typei!F20": true, - "typei!F21": true, - "typei!F22": true, - "typei!F23": true, - "typei!F24": true, - "typei!F25": true, - "typei!F26": true, - "typei!F27": true, - "typei!F28": true, - "typei!E35": true, - "typeii!B2": true, - "typeii!D4": true, - "typeii!C10": true, - "typeii!C11": true, - "typeii!C12": true, - "typeii!C13": true, - "typeii!D9": true, - "typeii!E10": true, - "typeii!E11": true, - "typeii!E12": true, - "typeii!E13": true, - "typeii!F9": true, - "typeii!C16": true, - "typeii!C17": true, - "typeii!C18": true, - "typeii!C19": true, - "typeii!C20": true, - "typeii!C21": true, - "typeii!C22": true, - "typeii!C23": true, - "typeii!C24": true, - "typeii!C25": true, - "typeii!C26": true, - "typeii!C27": true, - "typeii!C28": true, - "typeii!F16": true, - "typeii!F17": true, - "typeii!F18": true, - "typeii!F19": true, - "typeii!F20": true, - "typeii!F21": true, - "typeii!F22": true, - "typeii!F23": true, - "typeii!F24": true, - "typeii!F25": true, - "typeii!F26": true, - "typeii!F27": true, - "typeii!F28": true, - "typeii!G16": true, - "typeii!G17": true, - "typeii!G18": true, - "typeii!G19": true, - "typeii!G20": true, - "typeii!G21": true, - "typeii!G22": true, - "typeii!G23": true, - "typeii!G24": true, - "typeii!G25": true, - "typeii!G26": true, - "typeii!G27": true, - "typeii!G28": true, - "typeii!E35": true, - "typeiii!G9": true, - "typeiii!G10": true, - "typeiii!B2": true, - "typeiii!B3": true, - "typeiii!B4": true, - "typeiii!B5": true, - "typeiii!B6": true, - "typeiii!B7": true, - "typeiii!B8": true, - "typeiii!B9": true, - "typeiii!B11": true, - "typeiii!B12": true, - "typeiii!B13": true, - "typeiii!B14": true, - "typeiii!B15": true, - "typeiii!B18": true, - "typeiii!B19": true, - "typeiii!B20": true, - "typeiii!B21": true, - "typeiii!B22": true, - "typeiii!B23": true, - "typeiii!B24": true, - "typeiii!B25": true, - "typeiii!B26": true, - "typeiii!B27": true, - "typeiii!B28": true, - "typeiii!B29": true, - "typeiii!G18": true, - "typeiii!G19": true, - "typeiii!G20": true, - "typeiii!G21": true, - "typeiii!G22": true, - "typeiii!G23": true, - "typeiii!G24": true, - "typeiii!G25": true, - "typeiii!G26": true, - "typeiii!G27": true, - "typeiii!G28": true, - "typeiii!G29": true, - "typeiii!B32": true, - "typeiii!B33": true, - "typeiii!B34": true, - "typeiii!G31": true, - "typeiii!G33": true, - "typeiii!B37": true, - "typeiv!G9": true, - "typeiv!G10": true, - "typeiv!B2": true, - "typeiv!B3": true, - "typeiv!B4": true, - "typeiv!B5": true, - "typeiv!B6": true, - "typeiv!B7": true, - "typeiv!B8": true, - "typeiv!B11": true, - "typeiv!B12": true, - "typeiv!B13": true, - "typeiv!B14": true, - "typeiv!B15": true, - "typeiv!B16": true, - "typeiv!B18": true, - "typeiv!B19": true, - "typeiv!B20": true, - "typeiv!B21": true, - "typeiv!B22": true, - "typeiv!B23": true, - "typeiv!B24": true, - "typeiv!B25": true, - "typeiv!B26": true, - "typeiv!B27": true, - "typeiv!B28": true, - "typeiv!B29": true, - "typeiv!E18": true, - "typeiv!E19": true, - "typeiv!E20": true, - "typeiv!E21": true, - "typeiv!E22": true, - "typeiv!E23": true, - "typeiv!E24": true, - "typeiv!E25": true, - "typeiv!E26": true, - "typeiv!E27": true, - "typeiv!E28": true, - "typeiv!E29": true, - "typeiv!F18": true, - "typeiv!F19": true, - "typeiv!F2": true, - "typeiv!F20": true, - "typeiv!F21": true, - "typeiv!F22": true, - "typeiv!F23": true, - "typeiv!F24": true, - "typeiv!F25": true, - "typeiv!F26": true, - "typeiv!F27": true, - "typeiv!F28": true, - "typeiv!F29": true, - "typeiv!B32": true, - "typeiv!B33": true, - "typeiv!B34": true, - "typeiv!G31": true, - "typeiv!G33": true, - "typeiv!B37": true, - "typeii!F15": true, - "typeii!G15": true, - "typeiv!E17": true, - "typeiv!F17": true, - "typeii!D6": true, - "typeiv!G11": true, - "typei!C4": true, - "typeii!C4": true, - "typeiii!F10": true, - "typeiv!F11": true, - "typeiv!F10": true, - "typeiii!F9": true, - "typeii!C6": true, - "typei!C6": true, - "typei!F4": true, - "typeii!F4": true, - "typeiii!F4": true, - "typeiii!F2": true, - "typeiv!F4": true, - "typei!F29": true, - "typeii!H29": true, - "typeiii!G30": true, - "typeiii!G34": true, - "typeiv!G30": true, - "typeiv!G34": true, - }, - constraints: {}, - }, - }, - footers: [ - { name: "Invoice 1", index: 1, isActive: true }, - { name: "Invoice 2", index: 2, isActive: false }, - { name: "Company Invoice 1", index: 3, isActive: false }, - { name: "Company Invoice 2", index: 4, isActive: false }, - ], - }, - default: { - msc: { - numsheets: 4, - currentid: "sheet1", - currentname: "typei", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE:b:1:1:1:1:f:6:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:t::b:2::2::l:1:f:7\ncell:G2:t::b:2::2::l:1:f:7\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2:::2:l:3:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:2::::l:1:f:7\ncell:G3:b:2:2:::l:3:f:7\ncell:A4:b::2:::l:3:f:7\ncell:B4:b::::2:l:3:f:3\ncell:C4:t:INVOICE # \\c:f:2:cf:2\ncell:D4:v:1:f:2:cf:2\ncell:F4:tvf:4:rowspan:4\ncell:G4:b::2:::l:3:f:7\ncell:A5:b::2:::l:3:f:7\ncell:B5:b::::2:l:3:f:4\ncell:F5:t::l:2:f:7\ncell:G5:t::b::1:::l:2:f:7\ncell:A6:b::2:::l:3:f:7\ncell:B6:b::::2:l:3:f:4\ncell:C6:t:INVOICE DATE\\c:f:2:cf:2\ncell:D6:f:2:cf:2:ntvf:3\ncell:F6:l:2:f:7\ncell:G6:b::1:::l:2:f:7\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::::2:l:3:f:4\ncell:G7:b::2:::l:3:f:7\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::::2:l:3:f:4\ncell:G8:b::2:::l:3:f:7\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::::2:l:3:f:4\ncell:C9:t:BILL TO\\c:l:3:f:2\ncell:E9:t:FROM\\c:f:2:cf:2\ncell:G9:b::2:::l:3:f:7\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::::2:l:3:f:3\ncell:C10:t:[Name]:f:1:cf:2:colspan:2\ncell:E10:t:[Name]:f:1:cf:2:colspan:2\ncell:G10:b::2:::l:3:f:7\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:E11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:G11:b::2:::l:3:f:7\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:E12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:G12:b::2:::l:3:f:7\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:Phone\\c:f:1:cf:2:colspan:2\ncell:E13:t:Phone\\c:f:1:cf:2:colspan:2\ncell:G13:b::2:::l:3:f:7\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::::2:l:3:f:3:cf:2\ncell:C14:b:::2::l:1:f:7\ncell:D14:b:::2::l:3:f:3:cf:2\ncell:E14:b:::2::l:1:f:7\ncell:F14:b:::2::l:1:f:7\ncell:G14:b::2:::l:3:f:7\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::2::2:l:3:f:7\ncell:C15:t:Description:b:1::1:1:f:2:cf:1:colspan:3\ncell:D15:t:Description:b:1::1::l:3:f:3:cf:2:colspan:2:rowspan:1\ncell:E15:t::b:2:2:2::l:1:f:7\ncell:F15:t:Amount:b:1:1:1:1:f:2:cf:1\ncell:G15:b::2::2:l:3:f:7\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::2::2:l:3:f:7\ncell:C16:b:1:1::1:f:1:cf:2:colspan:3\ncell:D16:b:1:1:::l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:E16:t::b:2:2:2::l:1:f:7\ncell:F16:b:1:1:::f:1:ntvf:1\ncell:G16:b::2::2:l:3:f:7\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::2::2:l:3:f:7:cf:2\ncell:C17:b::1::1:f:1:cf:2:colspan:3\ncell:D17:b::1:::l:1:f:7:colspan:2\ncell:E17:l:1:f:7\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::2::2:l:3:f:7\ncell:A18:b::2:::l:3:f:7\ncell:B18:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C18:b::1::1:f:1:cf:2:colspan:3\ncell:D18:b::1:::colspan:2\ncell:F18:b::1:::f:1:ntvf:1\ncell:G18:b::2::2:l:3:f:7\ncell:A19:b::2:::l:3:f:7\ncell:B19:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C19:b::1::1:f:1:cf:2:colspan:3\ncell:D19:b::1:::colspan:2\ncell:F19:b::1:::f:1:ntvf:1\ncell:G19:b::2::2:l:3:f:7\ncell:A20:b::2:::l:3:f:7\ncell:B20:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C20:b::1::1:f:1:cf:2:colspan:3\ncell:D20:b::1:::colspan:2\ncell:F20:b::1:::f:1:ntvf:1\ncell:G20:b::2::2:l:3:f:7\ncell:A21:b::2:::l:3:f:7\ncell:B21:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C21:b::1::1:f:1:cf:2:colspan:3\ncell:D21:b::1:::colspan:2\ncell:F21:b::1:::f:1:ntvf:1\ncell:G21:b::2::2:l:3:f:7\ncell:A22:b::2:::l:3:f:7\ncell:B22:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C22:b::1::1:f:1:cf:2:colspan:3\ncell:D22:b::1:::colspan:2\ncell:F22:b::1:::f:1:ntvf:1\ncell:G22:b::2::2:l:3:f:7\ncell:A23:b::2:::l:3:f:7\ncell:B23:b::2::2:l:3:f:7:cf:2\ncell:C23:b::1::1:f:1:cf:2:colspan:3\ncell:D23:b::1:::colspan:2\ncell:F23:b::1:::f:1:ntvf:1\ncell:G23:b::2::2:l:3:f:7\ncell:A24:b::2:::l:3:f:7\ncell:B24:b::2::2:l:3:f:7:cf:2\ncell:C24:b::1::1:f:1:cf:2:colspan:3\ncell:D24:b::1:::colspan:2\ncell:F24:b::1:::f:1:ntvf:1\ncell:G24:b::2::2:l:3:f:7\ncell:A25:b::2:::l:3:f:7\ncell:B25:b::2::2:l:3:f:7:cf:2\ncell:C25:b::1::1:f:1:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:1:ntvf:1\ncell:G25:b::2::2:l:3:f:7\ncell:A26:b::2:::l:3:f:7\ncell:B26:b::2::2:l:3:f:7:cf:2\ncell:C26:b::1::1:f:1:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:1:ntvf:1\ncell:G26:b::2::2:l:3:f:7\ncell:A27:b::2:::l:3:f:7\ncell:B27:b::2::2:l:3:f:7:cf:2\ncell:C27:b::1::1:f:1:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:1:ntvf:1\ncell:G27:b::2::2:l:3:f:7\ncell:A28:b::2:::l:3:f:4\ncell:B28:b::2::2:l:3:f:7:cf:2\ncell:C28:b::1:1:1:f:1:cf:2:colspan:3\ncell:D28:b::1:1::l:3:f:7:cf:2:colspan:2\ncell:E28:b:::2::l:3:f:7:cf:2\ncell:F28:b::1:1::f:1:ntvf:1\ncell:G28:b::2::2:l:3:f:7\ncell:A29:b::2:::l:3:f:3\ncell:B29:b::2::2:l:3:f:3\ncell:C29:t:TOTAL:b:1:1:1:1:f:5:cf:2:colspan:3\ncell:D29:b:2::2::l:3:f:8:cf:2\ncell:E29:b:2:2:2::l:3:f:8:cf:2\ncell:F29:vtf:n:0:SUM(F16\\cF28):b:1:1:1::f:5:ntvf:1\ncell:G29:b::2::2:l:3:f:4\ncell:A30:b::2:::l:3:f:7\ncell:B30:b::::2:l:3:f:3:cf:2\ncell:C30:b:2::::l:1:f:7\ncell:D30:b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:7\ncell:F30:b:2::::l:1:f:7\ncell:G30:b::2:::l:3:f:3\ncell:A31:b::2:::l:3:f:7\ncell:B31:b::::2:l:3:f:7\ncell:D31:tvf:4:rowspan:4\ncell:G31:b::2:::l:3:f:7\ncell:A32:b::2:::l:3:f:7\ncell:B32:b::::2:l:3:f:7\ncell:G32:b::2:::l:3:f:7\ncell:A33:b::2:::l:3:f:7\ncell:B33:b::::2:l:3:f:7\ncell:G33:b::2:::l:3:f:7\ncell:A34:b::2:::l:3:f:7\ncell:B34:b::::2:l:3:f:7\ncell:G34:b::2:::l:3:f:7\ncell:A35:b::2:::l:3:f:7\ncell:B35:b:::2:2:l:3:f:7\ncell:C35:b:::2::l:3:f:7\ncell:D35:b:::2::l:3:f:7\ncell:E35:b:::2::l:3:f:7\ncell:F35:b:::2::l:3:f:7\ncell:G35:b::2:2::l:3:f:7\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncell:F36:b:1:::\ncell:G36:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:105\ncol:D:w:182\ncol:E:w:110\ncol:F:w:115\ncol:G:w:65\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:7:r:36:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:normal bold * Trebuchet MS\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 12pt Arial\nfont:5:normal bold 12pt Trebuchet MS\nfont:6:normal bold 14pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "typei", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - 'version:1.5\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE:b:1:1:1:1:l:3:f:6:cf:1:colspan:8\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:t::b:2::2::l:1:f:7\ncell:G2:b:2::2::l:1:f:7\ncell:H2:b:2::2::l:1:f:7\ncell:I2:t::b:2::2::l:1:f:7\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2:::2:l:3:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:2::::l:1:f:7\ncell:G3:b:2::::l:1:f:7\ncell:H3:b:2::::l:1:f:7\ncell:I3:b:2:2:::l:3:f:7\ncell:A4:b::2:::l:3:f:7\ncell:B4:b::::2:l:3:f:3\ncell:C4:t:INVOICE # \\c:f:2:cf:2\ncell:D4:v:1:f:2:cf:2\ncell:F4:tvf:5:colspan:2:rowspan:4\ncell:I4:b::2:::l:3:f:7\ncell:A5:b::2:::l:3:f:7\ncell:B5:b::::2:l:3:f:4\ncell:F5:t::l:2:f:7\ncell:G5:l:2:f:7\ncell:H5:l:2:f:7\ncell:I5:t::b::1:::l:2:f:7\ncell:A6:b::2:::l:3:f:7\ncell:B6:b::::2:l:3:f:4\ncell:C6:t:INVOICE DATE\\c:f:2:cf:2\ncell:D6:f:2:cf:2:ntvf:4\ncell:F6:l:2:f:7\ncell:G6:l:2:f:7\ncell:H6:l:2:f:7\ncell:I6:b::1:::l:2:f:7\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::::2:l:3:f:4\ncell:I7:b::2:::l:3:f:7\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::::2:l:3:f:4\ncell:I8:b::2:::l:3:f:7\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::::2:l:3:f:4\ncell:C9:t:BILL TO\\c:f:2\ncell:E9:t:FROM\\c:f:2:cf:2\ncell:F9:colspan:3\ncell:I9:b::2:::l:3:f:7\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::::2:l:3:f:3\ncell:C10:t:[Name]:f:1:cf:2:colspan:2\ncell:E10:t:[Name]:f:1:cf:2:colspan:4\ncell:I10:b::2:::l:3:f:7\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:E11:t:[Street Address]:f:1:colspan:4\ncell:I11:b::2:::l:3:f:7\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:E12:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:I12:b::2:::l:3:f:7\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:Phone\\c :f:1:cf:2:colspan:2\ncell:E13:t:Phone\\c :f:1:cf:2:colspan:4\ncell:I13:b::2:::l:3:f:7\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::::2:l:3:f:3:cf:2\ncell:C14:b:::2::l:1:f:7\ncell:D14:b:::2::l:3:f:3:cf:2\ncell:E14:b:::2::l:1:f:7\ncell:F14:b:::2::l:1:f:7\ncell:G14:b:::2::l:1:f:7\ncell:H14:b:::2::l:1:f:7\ncell:I14:b::2:::l:3:f:7\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::2::2:l:3:f:7\ncell:C15:t:Description:b:1:1:1:1:f:2:cf:1:colspan:3\ncell:D15:t:Description:b:2::2:2:l:3:f:3:cf:2:colspan:2:rowspan:1\ncell:E15:t::b:2:2:2::l:1:f:7\ncell:F15:t:Hours:b:1:1:1:1:f:2:cf:1\ncell:G15:t:Rate:b:1:1:1:1:f:2:cf:1\ncell:H15:t:Amount:b:1:1:1:1:f:2:cf:1\ncell:I15:b::2::2:l:3:f:7\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::2::2:l:3:f:7\ncell:C16:b:1:1::1:f:1:cf:2:colspan:3\ncell:D16:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:E16:t::b:2:2:2::l:1:f:7\ncell:F16:b:1:1:::f:1:ntvf:1\ncell:G16:b:1:1:::f:1:ntvf:1\ncell:H16:vtf:t::IF(F16*G16>0,F16*G16,""):b:1:1:::f:1:ntvf:1\ncell:I16:b::2::2:l:3:f:7\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::2::2:l:3:f:7:cf:2\ncell:C17:b::1::1:f:1:cf:2:colspan:3\ncell:D17:b::1::1:l:1:f:7:colspan:2\ncell:E17:l:1:f:7\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::1:::f:1:ntvf:1\ncell:H17:vtf:t::IF(F17*G17>0,F17*G17,""):b::1:::f:1:ntvf:1\ncell:I17:b::2::2:l:3:f:7\ncell:A18:b::2:::l:3:f:7\ncell:B18:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C18:b::1::1:f:1:cf:2:colspan:3\ncell:D18:b::1::1:colspan:2\ncell:F18:b::1:::f:1:ntvf:1\ncell:G18:b::1:::f:1:ntvf:1\ncell:H18:vtf:t::IF(F18*G18>0,F18*G18,""):b::1:::f:1:ntvf:1\ncell:I18:b::2::2:l:3:f:7\ncell:A19:b::2:::l:3:f:7\ncell:B19:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C19:b::1::1:f:1:cf:2:colspan:3\ncell:D19:b::1::1:colspan:2\ncell:F19:b::1:::f:1:ntvf:1\ncell:G19:b::1:::f:1:ntvf:1\ncell:H19:vtf:t::IF(F19*G19>0,F19*G19,""):b::1:::f:1:ntvf:1\ncell:I19:b::2::2:l:3:f:7\ncell:A20:b::2:::l:3:f:7\ncell:B20:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C20:b::1::1:f:1:cf:2:colspan:3\ncell:D20:b::1::1:colspan:2\ncell:F20:b::1:::f:1:ntvf:1\ncell:G20:b::1:::f:1:ntvf:1\ncell:H20:vtf:t::IF(F20*G20>0,F20*G20,""):b::1:::f:1:ntvf:1\ncell:I20:b::2::2:l:3:f:7\ncell:A21:b::2:::l:3:f:7\ncell:B21:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C21:b::1::1:f:1:cf:2:colspan:3\ncell:D21:b::1::1:colspan:2\ncell:F21:b::1:::f:1:ntvf:1\ncell:G21:b::1:::f:1:ntvf:1\ncell:H21:vtf:t::IF(F21*G21>0,F21*G21,""):b::1:::f:1:ntvf:1\ncell:I21:b::2::2:l:3:f:7\ncell:A22:b::2:::l:3:f:7\ncell:B22:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C22:b::1::1:f:1:cf:2:colspan:3\ncell:D22:b::1::1:colspan:2\ncell:F22:b::1:::f:1:ntvf:1\ncell:G22:b::1:::f:1:ntvf:1\ncell:H22:vtf:t::IF(F22*G22>0,F22*G22,""):b::1:::f:1:ntvf:1\ncell:I22:b::2::2:l:3:f:7\ncell:A23:b::2:::l:3:f:7\ncell:B23:b::2::2:l:3:f:7:cf:2\ncell:C23:b::1::1:f:1:cf:2:colspan:3\ncell:D23:b::1::1:colspan:2\ncell:F23:b::1:::f:1:ntvf:1\ncell:G23:b::1:::f:1:ntvf:1\ncell:H23:vtf:t::IF(F23*G23>0,F23*G23,""):b::1:::f:1:ntvf:1\ncell:I23:b::2::2:l:3:f:7\ncell:A24:b::2:::l:3:f:7\ncell:B24:b::2::2:l:3:f:7:cf:2\ncell:C24:b::1::1:f:1:cf:2:colspan:3\ncell:D24:b::1::1:colspan:2\ncell:F24:b::1:::f:1:ntvf:1\ncell:G24:b::1:::f:1:ntvf:1\ncell:H24:vtf:t::IF(F24*G24>0,F24*G24,""):b::1:::f:1:ntvf:1\ncell:I24:b::2::2:l:3:f:7\ncell:A25:b::2:::l:3:f:7\ncell:B25:b::2::2:l:3:f:7:cf:2\ncell:C25:b::1::1:f:1:cf:2:colspan:3\ncell:D25:b::1::1:colspan:2\ncell:F25:b::1:::f:1:ntvf:1\ncell:G25:b::1:::f:1:ntvf:1\ncell:H25:vtf:t::IF(F25*G25>0,F25*G25,""):b::1:::f:1:ntvf:1\ncell:I25:b::2::2:l:3:f:7\ncell:A26:b::2:::l:3:f:7\ncell:B26:b::2::2:l:3:f:7:cf:2\ncell:C26:b::1::1:f:1:cf:2:colspan:3\ncell:D26:b::1::1:colspan:2\ncell:F26:b::1:::f:1:ntvf:1\ncell:G26:b::1:::f:1:ntvf:1\ncell:H26:vtf:t::IF(F26*G26>0,F26*G26,""):b::1:::f:1:ntvf:1\ncell:I26:b::2::2:l:3:f:7\ncell:A27:b::2:::l:3:f:7\ncell:B27:b::2::2:l:3:f:7:cf:2\ncell:C27:b::1::1:f:1:cf:2:colspan:3\ncell:D27:b::1::1:colspan:2\ncell:F27:b::1:::f:1:ntvf:1\ncell:G27:b::1:::f:1:ntvf:1\ncell:H27:vtf:t::IF(F27*G27>0,F27*G27,""):b::1:::f:1:ntvf:1\ncell:I27:b::2::2:l:3:f:7\ncell:A28:b::2:::l:3:f:4\ncell:B28:b::2::2:l:3:f:7:cf:2\ncell:C28:b::1:1:1:f:1:cf:2:colspan:3\ncell:D28:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:E28:b:::2::l:3:f:7:cf:2\ncell:F28:b::1:1::f:1:ntvf:1\ncell:G28:b::1:1::f:1:ntvf:1\ncell:H28:vtf:t::IF(F28*G28>0,F28*G28,""):b::1:::f:1:ntvf:1\ncell:I28:b::2::2:l:3:f:7\ncell:A29:b::2:::l:3:f:3\ncell:B29:b::2::2:l:3:f:3\ncell:C29:t:TOTAL:b:1:1:1:1:l:3:f:5:cf:2:colspan:5\ncell:D29:b:2::2::l:3:f:8:cf:2\ncell:E29:b:2:2:2::l:3:f:8:cf:2\ncell:F29:vtf:n:0:SUM(F16\\cF28):b:2:2:2::l:3:f:4:ntvf:2\ncell:G29:b:2:2:2::l:3:f:4:ntvf:2\ncell:H29:vtf:n:0:SUM(H16\\cH28):b:1:1:1::f:5:ntvf:1\ncell:I29:b::2::2:l:3:f:4\ncell:A30:b::2:::l:3:f:7\ncell:B30:b::::2:l:3:f:3:cf:2\ncell:C30:b:2::::l:1:f:7\ncell:D30:b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:7\ncell:F30:b:2::::l:1:f:7\ncell:G30:b:2::::l:1:f:7\ncell:H30:b:2::::l:1:f:7\ncell:I30:b::2:::l:3:f:3\ncell:A31:b::2:::l:3:f:7\ncell:B31:b::::2:l:3:f:7\ncell:D31:tvf:5:rowspan:4\ncell:I31:b::2:::l:3:f:7\ncell:A32:b::2:::l:3:f:7\ncell:B32:b::::2:l:3:f:7\ncell:I32:b::2:::l:3:f:7\ncell:A33:b::2:::l:3:f:7\ncell:B33:b::::2:l:3:f:7\ncell:I33:b::2:::l:3:f:7\ncell:A34:b::2:::l:3:f:7\ncell:B34:b::::2:l:3:f:7\ncell:I34:b::2:::l:3:f:7\ncell:A35:b::2:::l:3:f:7\ncell:B35:b:::2:2:l:3:f:7\ncell:C35:b:::2::l:3:f:7\ncell:D35:b:::2::l:3:f:7\ncell:E35:b:::2::l:3:f:7\ncell:F35:b:::2::l:3:f:7\ncell:G35:b:::2::l:3:f:7\ncell:H35:b:::2::l:3:f:7\ncell:I35:b::2:2::l:3:f:7\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncell:F36:b:1:::\ncell:G36:b:1:::\ncell:H36:b:1:::\ncell:I36:b:1:::\ncol:A:w:26\ncol:B:w:28\ncol:C:w:96\ncol:D:w:203\ncol:E:w:51\ncol:F:w:50\ncol:G:w:58\ncol:H:w:80\ncol:I:w:28\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:9:r:36:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:normal bold * Trebuchet MS\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 12pt Arial\nfont:5:normal bold 12pt Trebuchet MS\nfont:6:normal bold 14pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00;(#,##0.00)\nvalueformat:3:d-mmm\nvalueformat:4:m/d/yy\nvalueformat:5:text-html\n', - }, - name: "typeii", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:l:3\ncell:B2:t:[Company Name]:l:1:f:3:cf:2:colspan:3\ncell:C2:t::l:2:f:9\ncell:D2:t::l:2:f:9\ncell:E2:l:1:f:7:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:9\ncell:B3:t:[Company Slogan]:f:4:cf:2:colspan:3\ncell:C3:t::l:2:f:9\ncell:D3:t::l:2:f:9\ncell:B4:f:2:colspan:2\ncell:F4:tvf:4:rowspan:4\ncell:B5:t:[Street Address]:f:1:cf:2:colspan:2\ncell:F5:l:1:f:6\ncell:G5:l:1:f:10:cf:1\ncell:B6:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:G6:l:1:f:9\ncell:B7:t:Phone\\c :f:1:cf:2:colspan:2\ncell:B8:t:Email\\c:f:1:cf:2:colspan:2\ncell:B9:colspan:2\ncell:F9:t:DATE \\c:l:1:f:6:cf:2\ncell:G9:l:1:f:10:cf:2:ntvf:3\ncell:B10:t:BILL TO\\c:f:5:c:1:bg:3:cf:2:colspan:2\ncell:F10:t:INVOICE # \\c:l:1:f:6:cf:2\ncell:G10:v:1:l:1:f:10:cf:2\ncell:B11:t:[Name]:f:1:cf:2:colspan:2\ncell:B12:t:[Company Name]:f:1:cf:2:colspan:2\ncell:F12:t: \ncell:B13:t:[Street Address]:f:1:cf:2:colspan:2\ncell:B14:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:B15:t:Phone\\c :f:1:cf:2:colspan:2\ncell:A17:b::1::\ncell:B17:t:DESCRIPTION:b:1:1:1:1:l:1:f:6:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C17:t::l:2:f:9\ncell:D17:t::l:2:f:9\ncell:E17:t::l:2:f:9\ncell:F17:t::l:2:f:9\ncell:G17:t:AMOUNT:b:1:1:1::l:1:f:6:c:1:bg:3:cf:1\ncell:A18:b::1::\ncell:B18:b:1:1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C18:t::l:2:f:9\ncell:D18:t::l:2:f:9\ncell:E18:t::l:2:f:9\ncell:F18:t::b::2:::l:1:f:9\ncell:G18:b::1::1:f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C19:t::l:2:f:9\ncell:D19:t::l:2:f:9\ncell:E19:t::l:2:f:9\ncell:F19:t::b::2:::l:1:f:9\ncell:G19:b::1::1:f:1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C20:t::l:2:f:9\ncell:D20:t::l:2:f:9\ncell:E20:t::l:2:f:9\ncell:F20:t::b::2:::l:1:f:9\ncell:G20:b::1::1:f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C21:t::l:2:f:9\ncell:D21:t::l:2:f:9\ncell:E21:t::l:2:f:9\ncell:F21:t::b::2:::l:1:f:9\ncell:G21:b::1::1:f:1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C22:t::l:2:f:9\ncell:D22:t::l:2:f:9\ncell:E22:t::l:2:f:9\ncell:F22:t::b::2:::l:1:f:9\ncell:G22:b::1::1:f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:9\ncell:D23:t::l:2:f:9\ncell:E23:t::l:2:f:9\ncell:F23:t::b::2:::l:1:f:9\ncell:G23:b::1::1:f:1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:9\ncell:D24:t::l:2:f:9\ncell:E24:t::l:2:f:9\ncell:F24:t::b::2:::l:1:f:9\ncell:G24:b::1::1:f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:9\ncell:D25:t::l:2:f:9\ncell:E25:t::l:2:f:9\ncell:F25:t::b::2:::l:1:f:9\ncell:G25:b::1::1:f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:9\ncell:D26:t::l:2:f:9\ncell:E26:t::l:2:f:9\ncell:F26:t::b::2:::l:1:f:9\ncell:G26:b::1::1:f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:9\ncell:D27:t::l:2:f:9\ncell:E27:t::l:2:f:9\ncell:F27:t::b::2:::l:1:f:9\ncell:G27:b::1::1:f:1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:9\ncell:D28:t::l:2:f:9\ncell:E28:t::l:2:f:9\ncell:F28:t::b::2:::l:1:f:9\ncell:G28:b::1::1:f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:f:1:cf:2:colspan:5:rowspan:1\ncell:C29:t::b:::2::l:1:f:9\ncell:D29:t::b:::2::l:1:f:9\ncell:E29:t::b:::2::l:1:f:9\ncell:F29:t::b::2:2::l:1:f:9\ncell:G29:b::1:1:1:f:1:ntvf:1\ncell:B30:b:2::::l:1:f:9\ncell:C30:b:2::::l:1:f:9\ncell:D30:b:2::::l:1:f:9\ncell:E30:b:2::::l:1:f:10\ncell:F30:t:Subtotal:b:2::::l:1:f:10\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::f:8:ntvf:1\ncell:B31:t:NOTES:b:::2::l:1:f:6:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:9\ncell:D31:t::b:::2::l:1:f:9\ncell:F31:t:Tax Rate:l:1:f:1\ncell:G31:v:0:f:1:ntvf:2\ncell:B32:b:1::::f:1:cf:2:colspan:3\ncell:C32:t::b:2::::l:1:f:9\ncell:D32:t::b:2::::l:1:f:9\ncell:F32:t:Tax:l:1:f:1\ncell:G32:vtf:n:0:G31*G30:f:1:ntvf:1\ncell:B33:f:1:cf:2:colspan:3\ncell:C33:t::l:2:f:9\ncell:D33:t::l:2:f:9\ncell:F33:t:Other:b:::1::l:1:f:1\ncell:G33:v:0:b:::1::f:1:ntvf:1\ncell:B34:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:2:f:9\ncell:D34:t::l:2:f:9\ncell:F34:t:TOTAL:b:2::::l:1:f:6\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::::f:5:ntvf:1\ncell:C36:tvf:4:colspan:5:rowspan:7\ncol:A:w:40\ncol:B:w:232\ncol:C:w:53\ncol:D:w:90\ncol:E:w:54\ncol:F:w:91\ncol:G:w:99\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nsheet:c:7:r:36:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 16pt Trebuchet MS\nfont:4:italic normal * Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 28pt Trebuchet MS\nfont:8:normal normal * Trebuchet MS\nfont:9:normal normal 10pt Arial\nfont:10:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "typeiii", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:3\ncell:B2:t:[Company Name]:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C2:t::l:2:f:7\ncell:D2:t::l:2:f:7\ncell:F2:t:INVOICE:l:1:f:6:c:1:cf:2:colspan:2\ncell:G2:t::l:2:f:7\ncell:B3:t:[Company slogan]:f:3:cf:2:colspan:3:rowspan:1\ncell:C3:t::l:2:f:7\ncell:D3:t::l:2:f:7\ncell:B4:cf:2:colspan:3:rowspan:1\ncell:F4:tvf:4:rowspan:4\ncell:B5:t:[Street Address]:f:1:cf:2:colspan:3:rowspan:1\ncell:F5:l:1:f:5\ncell:G5:l:1:f:8:cf:1\ncell:B6:t:[City, State, Zip]:f:1:cf:2:colspan:3:rowspan:1\ncell:G6:l:1:f:7\ncell:B7:t:Phone\\c :f:1:cf:2:colspan:3:rowspan:1\ncell:B8:t:Email\\c:f:1:cf:2:colspan:3:rowspan:1\ncell:B9:cf:2:colspan:3:rowspan:1\ncell:B10:t:BILL TO\\c:l:1:f:5:bg:2:cf:2:colspan:2\ncell:F10:t:DATE\\c:l:1:f:5:cf:2\ncell:G10:l:1:f:8:cf:2:ntvf:3\ncell:B11:t:[Name]:f:1:cf:2:colspan:3:rowspan:1\ncell:F11:t:INVOICE # \\c:l:1:f:5:cf:2\ncell:G11:v:1:l:1:f:8:cf:2\ncell:B12:t:[Company Name]:f:1:cf:2:colspan:3:rowspan:1\ncell:J12:tvf:4\ncell:B13:t:[Street Address]:f:1:cf:2:colspan:3:rowspan:1\ncell:B14:t:[City, State, Zip]:f:1:cf:2:colspan:3:rowspan:1\ncell:B15:t:Phone\\c :f:1:cf:2:colspan:3:rowspan:1\ncell:B16:cf:2:colspan:3:rowspan:1\ncell:A17:b::1::\ncell:B17:t:DESCRIPTION:b:1:1:1:1:l:1:f:5:bg:2:cf:1:colspan:3:rowspan:1\ncell:C17:t::b:1::1::l:1:f:7:bg:2\ncell:D17:t::b:1::1::l:1:f:7:bg:2\ncell:E17:t:HOURS:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:F17:t:RATE:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:G17:t:AMOUNT:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:A18:b::1::\ncell:B18:b:1:1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C18:t::b:2::::l:1:f:7\ncell:D18:t::b:2:2:::l:1:f:7\ncell:E18:b:1:1::1:f:1:ntvf:1\ncell:F18:b:1:1::1:f:1:ntvf:1\ncell:G18:vtf:t::IF(E18*F18>0,E18*F18,""):b:1:1:::f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C19:t::l:2:f:7\ncell:D19:t::b::2:::l:1:f:7\ncell:E19:b::1::1:f:1:ntvf:1\ncell:F19:b::1::1:f:1:ntvf:1\ncell:G19:vtf:t::IF(E19*F19>0,E19*F19,""):b::1:::f:1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C20:t::l:2:f:7\ncell:D20:t::b::2:::l:1:f:7\ncell:E20:b::1::1:f:1:ntvf:1\ncell:F20:b::1::1:f:1:ntvf:1\ncell:G20:vtf:t::IF(E20*F20>0,E20*F20,""):b::1:::f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C21:t::l:2:f:7\ncell:D21:t::b::2:::l:1:f:7\ncell:E21:b::1::1:f:1:ntvf:1\ncell:F21:b::1::1:f:1:ntvf:1\ncell:G21:vtf:t::IF(E21*F21>0,E21*F21,""):b::1:::f:1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C22:t::l:2:f:7\ncell:D22:t::b::2:::l:1:f:7\ncell:E22:b::1::1:f:1:ntvf:1\ncell:F22:b::1::1:f:1:ntvf:1\ncell:G22:vtf:t::IF(E22*F22>0,E22*F22,""):b::1:::f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C23:t::l:2:f:7\ncell:D23:t::b::2:::l:1:f:7\ncell:E23:b::1::1:f:1:ntvf:1\ncell:F23:b::1::1:f:1:ntvf:1\ncell:G23:vtf:t::IF(E23*F23>0,E23*F23,""):b::1:::f:1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C24:t::l:2:f:7\ncell:D24:t::b::2:::l:1:f:7\ncell:E24:b::1::1:f:1:ntvf:1\ncell:F24:b::1::1:f:1:ntvf:1\ncell:G24:vtf:t::IF(E24*F24>0,E24*F24,""):b::1:::f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C25:t::l:2:f:7\ncell:D25:t::b::2:::l:1:f:7\ncell:E25:b::1::1:f:1:ntvf:1\ncell:F25:b::1::1:f:1:ntvf:1\ncell:G25:vtf:t::IF(E25*F25>0,E25*F25,""):b::1:::f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C26:t::l:2:f:7\ncell:D26:t::b::2:::l:1:f:7\ncell:E26:b::1::1:f:1:ntvf:1\ncell:F26:b::1::1:f:1:ntvf:1\ncell:G26:vtf:t::IF(E26*F26>0,E26*F26,""):b::1:::f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C27:t::l:2:f:7\ncell:D27:t::b::2:::l:1:f:7\ncell:E27:b::1::1:f:1:ntvf:1\ncell:F27:b::1::1:f:1:ntvf:1\ncell:G27:vtf:t::IF(E27*F27>0,E27*F27,""):b::1:::f:1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C28:t::l:2:f:7\ncell:D28:t::b::2:::l:1:f:7\ncell:E28:b::1::1:f:1:ntvf:1\ncell:F28:b::1::1:f:1:ntvf:1\ncell:G28:vtf:t::IF(E28*F28>0,E28*F28,""):b::1:::f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C29:t::b:::2::l:1:f:7\ncell:D29:t::b::2:2::l:1:f:7\ncell:E29:b::1:1:1:f:1:ntvf:1\ncell:F29:b::1:1:1:f:1:ntvf:1\ncell:G29:vtf:t::IF(E29*F29>0,E29*F29,""):b::1:::f:1:ntvf:1\ncell:B30:b:2::::l:1:f:8:cf:1:colspan:3:rowspan:1\ncell:C30:t::b:2::::l:1:f:7\ncell:D30:t::b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:8\ncell:F30:t:Subtotal:b:1::::f:1\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::f:1:ntvf:1\ncell:B31:t:NOTES:b:::2::l:1:f:5:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:7\ncell:D31:t::b:::2::l:1:f:7\ncell:F31:t:Tax Rate:f:1\ncell:G31:v:0:f:1:ntvf:2\ncell:B32:b:1::::f:1:cf:2:colspan:3:rowspan:1\ncell:C32:t::b:2::::l:1:f:7\ncell:D32:t::b:2::::l:1:f:7\ncell:F32:t:Tax:f:1\ncell:G32:vtf:n:0:G31*G30:f:1:ntvf:1\ncell:B33:f:1:cf:2:colspan:3:rowspan:1\ncell:C33:t::l:2:f:7\ncell:D33:t::l:2:f:7\ncell:F33:t:Other:b:::1::l:1:f:1\ncell:G33:v:0:b:::1::f:1:ntvf:1\ncell:B34:f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:2:f:7\ncell:D34:t::l:2:f:7\ncell:F34:t:TOTAL:b:1::::l:1:f:4\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::::f:4:ntvf:1\ncell:B35:b:2::::l:1:f:7\ncell:C35:b:2::::l:1:f:7\ncell:D35:b:2::::l:1:f:7\ncell:C36:tvf:4:colspan:5:rowspan:7\ncol:A:w:40\ncol:B:w:194\ncol:C:w:128\ncol:D:w:60\ncol:E:w:65\ncol:F:w:95\ncol:G:w:90\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:10:r:36:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0,0,0)\ncolor:2:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 16pt Trebuchet MS\nfont:3:italic normal * Trebuchet MS\nfont:4:normal bold * Trebuchet MS\nfont:5:normal bold 10pt Trebuchet MS\nfont:6:normal bold 28pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "typeiv", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "typei!C10": true, - "typei!B2": true, - "typei!C11": true, - "typei!C12": true, - "typei!C13": true, - "typei!D9": true, - "typei!D4": true, - "typei!D6": true, - "typei!E10": true, - "typei!E11": true, - "typei!E12": true, - "typei!E13": true, - "typei!F9": true, - "typei!C16": true, - "typei!C17": true, - "typei!C18": true, - "typei!C19": true, - "typei!C20": true, - "typei!C21": true, - "typei!C22": true, - "typei!C23": true, - "typei!C24": true, - "typei!C25": true, - "typei!C26": true, - "typei!C27": true, - "typei!C28": true, - "typei!F16": true, - "typei!F17": true, - "typei!F18": true, - "typei!F19": true, - "typei!F20": true, - "typei!F21": true, - "typei!F22": true, - "typei!F23": true, - "typei!F24": true, - "typei!F25": true, - "typei!F26": true, - "typei!F27": true, - "typei!F28": true, - "typei!E35": true, - "typeii!B2": true, - "typeii!D4": true, - "typeii!C10": true, - "typeii!C11": true, - "typeii!C12": true, - "typeii!C13": true, - "typeii!D9": true, - "typeii!E10": true, - "typeii!E11": true, - "typeii!E12": true, - "typeii!E13": true, - "typeii!F9": true, - "typeii!C16": true, - "typeii!C17": true, - "typeii!C18": true, - "typeii!C19": true, - "typeii!C20": true, - "typeii!C21": true, - "typeii!C22": true, - "typeii!C23": true, - "typeii!C24": true, - "typeii!C25": true, - "typeii!C26": true, - "typeii!C27": true, - "typeii!C28": true, - "typeii!F16": true, - "typeii!F17": true, - "typeii!F18": true, - "typeii!F19": true, - "typeii!F20": true, - "typeii!F21": true, - "typeii!F22": true, - "typeii!F23": true, - "typeii!F24": true, - "typeii!F25": true, - "typeii!F26": true, - "typeii!F27": true, - "typeii!F28": true, - "typeii!G16": true, - "typeii!G17": true, - "typeii!G18": true, - "typeii!G19": true, - "typeii!G20": true, - "typeii!G21": true, - "typeii!G22": true, - "typeii!G23": true, - "typeii!G24": true, - "typeii!G25": true, - "typeii!G26": true, - "typeii!G27": true, - "typeii!G28": true, - "typeii!E35": true, - "typeiii!G9": true, - "typeiii!G10": true, - "typeiii!B2": true, - "typeiii!B3": true, - "typeiii!B4": true, - "typeiii!B5": true, - "typeiii!B6": true, - "typeiii!B7": true, - "typeiii!B8": true, - "typeiii!B9": true, - "typeiii!B11": true, - "typeiii!B12": true, - "typeiii!B13": true, - "typeiii!B14": true, - "typeiii!B15": true, - "typeiii!B18": true, - "typeiii!B19": true, - "typeiii!B20": true, - "typeiii!B21": true, - "typeiii!B22": true, - "typeiii!B23": true, - "typeiii!B24": true, - "typeiii!B25": true, - "typeiii!B26": true, - "typeiii!B27": true, - "typeiii!B28": true, - "typeiii!B29": true, - "typeiii!G18": true, - "typeiii!G19": true, - "typeiii!G20": true, - "typeiii!G21": true, - "typeiii!G22": true, - "typeiii!G23": true, - "typeiii!G24": true, - "typeiii!G25": true, - "typeiii!G26": true, - "typeiii!G27": true, - "typeiii!G28": true, - "typeiii!G29": true, - "typeiii!B32": true, - "typeiii!B33": true, - "typeiii!B34": true, - "typeiii!G31": true, - "typeiii!G33": true, - "typeiii!B37": true, - "typeiv!G9": true, - "typeiv!G10": true, - "typeiv!B2": true, - "typeiv!B3": true, - "typeiv!B4": true, - "typeiv!B5": true, - "typeiv!B6": true, - "typeiv!B7": true, - "typeiv!B8": true, - "typeiv!B11": true, - "typeiv!B12": true, - "typeiv!B13": true, - "typeiv!B14": true, - "typeiv!B15": true, - "typeiv!B16": true, - "typeiv!B18": true, - "typeiv!B19": true, - "typeiv!B20": true, - "typeiv!B21": true, - "typeiv!B22": true, - "typeiv!B23": true, - "typeiv!B24": true, - "typeiv!B25": true, - "typeiv!B26": true, - "typeiv!B27": true, - "typeiv!B28": true, - "typeiv!B29": true, - "typeiv!E18": true, - "typeiv!E19": true, - "typeiv!E20": true, - "typeiv!E21": true, - "typeiv!E22": true, - "typeiv!E23": true, - "typeiv!E24": true, - "typeiv!E25": true, - "typeiv!E26": true, - "typeiv!E27": true, - "typeiv!E28": true, - "typeiv!E29": true, - "typeiv!F18": true, - "typeiv!F19": true, - "typeiv!F2": true, - "typeiv!F20": true, - "typeiv!F21": true, - "typeiv!F22": true, - "typeiv!F23": true, - "typeiv!F24": true, - "typeiv!F25": true, - "typeiv!F26": true, - "typeiv!F27": true, - "typeiv!F28": true, - "typeiv!F29": true, - "typeiv!B32": true, - "typeiv!B33": true, - "typeiv!B34": true, - "typeiv!G31": true, - "typeiv!G33": true, - "typeiv!B37": true, - "typeii!F15": true, - "typeii!G15": true, - "typeiv!E17": true, - "typeiv!F17": true, - "typeii!D6": true, - "typeiv!G11": true, - "typei!C4": true, - "typeii!C4": true, - "typeiii!F10": true, - "typeiv!F11": true, - "typeiv!F10": true, - "typeiii!F9": true, - "typeii!C6": true, - "typei!C6": true, - "typei!F4": true, - "typeii!F4": true, - "typeiii!F4": true, - "typeiii!F2": true, - "typeiv!F4": true, - "typei!F29": true, - "typeii!H29": true, - "typeiii!G30": true, - "typeiii!G34": true, - "typeiv!G30": true, - "typeiv!G34": true, - }, - constraints: {}, - }, - }, - footers: [ - { name: "Invoice 1", index: 1, isActive: true }, - { name: "Invoice 2", index: 2, isActive: false }, - { name: "Company Invoice 1", index: 3, isActive: false }, - { name: "Company Invoice 2", index: 4, isActive: false }, - ], - }, - iPhone: { - msc: { - numsheets: 5, - currentid: "sheet1", - currentname: "inv1", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:10\ncell:C1:b:::2::l:1:f:10\ncell:D1:b:::2::l:1:f:10\ncell:E1:b:::2::l:1:f:10\ncell:F1:b:::2::l:1:f:10\ncell:G1:b:::2::l:1:f:10\ncell:A2:b::2:::l:1:f:10\ncell:B2:t:INVOICE:b:1:1:1:1:f:13:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:10\ncell:D2:t::b:2::2::l:1:f:10\ncell:E2:t::b:2::2::l:1:f:10\ncell:F2:t::b:2::2::l:1:f:10\ncell:G2:t::b:2::2::l:1:f:10\ncell:A3:b::2:::l:3:f:10\ncell:B3:b:2:::2:l:3:f:10\ncell:C3:b:2::::l:1:f:10\ncell:D3:b:2::::l:1:f:10\ncell:E3:b:2::::l:1:f:10\ncell:F3:b:2::::l:1:f:10\ncell:G3:b:2:2:::l:3:f:10\ncell:A4:b::2:::l:3:f:10\ncell:B4:b::::2:l:3:f:6\ncell:C4:t:BILL TO\\c:f:9:colspan:2\ncell:E4:f:5:cf:2\ncell:G4:b::2:::l:3:f:10\ncell:A5:b::2:::l:3:f:10\ncell:B5:b::::2:l:3:f:7\ncell:C5:t:[Name]:f:9:cf:2:colspan:3\ncell:E5:f:1:cf:2\ncell:F5:t::l:2:f:10:tvf:4:rowspan:6\ncell:G5:t::b::1:::l:2:f:10\ncell:A6:b::2:::l:3:f:10\ncell:B6:b::::2:l:3:f:7\ncell:C6:t:[Street Address]:f:9:cf:2:colspan:3\ncell:E6:f:1:cf:2\ncell:F6:l:2:f:10\ncell:G6:b::1:::l:2:f:10\ncell:A7:b::2:::l:3:f:10\ncell:B7:b::::2:l:3:f:7\ncell:C7:t:[City, State, Zip]:f:9:cf:2:colspan:3\ncell:E7:f:1:cf:2\ncell:G7:b::2:::l:3:f:10\ncell:A8:b::2:::l:3:f:10\ncell:B8:b::::2:l:3:f:7\ncell:C8:t:Phone\\c:f:9:cf:2:colspan:3\ncell:D8:f:8:cf:2\ncell:E8:f:1:cf:2\ncell:G8:b::2:::l:3:f:10\ncell:A9:b::2:::l:3:f:10\ncell:B9:b::::2:l:3:f:7\ncell:C9:t:Email\\c:f:9:cf:2:colspan:3\ncell:E9:f:1:cf:2\ncell:G9:b::2:::l:3:f:10\ncell:A10:b::2:::l:3:f:10\ncell:B10:b::::2:l:3:f:7\ncell:C10:colspan:2\ncell:G10:b::2:::l:3:f:10\ncell:A11:b::2:::l:3:f:10\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:FROM\\c:f:9:colspan:2\ncell:E11:f:8:colspan:2\ncell:G11:b::2:::l:3:f:10\ncell:A12:b::2:::l:3:f:10\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[Name]:f:9:colspan:4\ncell:E12:colspan:2\ncell:G12:b::2:::l:3:f:10\ncell:A13:b::2:::l:3:f:10\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:[Street Address]:f:9:colspan:4\ncell:E13:colspan:2\ncell:G13:b::2:::l:3:f:10\ncell:A14:b::2:::l:3:f:10\ncell:B14:b::::2:l:3:f:7\ncell:C14:t:[City, State, Zip]:f:9:colspan:4\ncell:E14:colspan:2\ncell:G14:b::2:::l:3:f:10\ncell:A15:b::2:::l:3:f:10\ncell:B15:b::::2:l:3:f:7\ncell:C15:t:Phone\\c:f:9:colspan:4\ncell:D15:f:8:cf:2:colspan:3\ncell:E15:colspan:2\ncell:G15:b::2:::l:3:f:10\ncell:A16:b::2:::l:3:f:10\ncell:B16:b::::2:l:3:f:7\ncell:C16:t:Email\\c:f:9:colspan:4\ncell:E16:colspan:2\ncell:G16:b::2:::l:3:f:10\ncell:A17:b::2:::l:3:f:10\ncell:B17:b::::2:l:3:f:6\ncell:G17:b::2:::l:3:f:10\ncell:A18:b::2:::l:3:f:10\ncell:B18:b::::2:l:3:f:10\ncell:C18:t:INVOICE #\\c:f:9:cf:2:colspan:4\ncell:D18:v:1:l:4:f:9:cf:2:colspan:3\ncell:G18:b::2:::l:3:f:10\ncell:A19:b::2:::l:3:f:10\ncell:B19:b::::2:l:3:f:10\ncell:G19:b::2:::l:3:f:10\ncell:A20:b::2:::l:3:f:10\ncell:B20:b::::2:l:3:f:10\ncell:C20:t:DATE\\c:f:9:cf:2\ncell:D20:vtf:nd:42081:TODAY():f:9:cf:2:ntvf:3:colspan:2\ncell:G20:b::2:::l:3:f:10\ncell:A21:b::2:::l:3:f:10\ncell:B21:b::::2:l:3:f:6:cf:2\ncell:C21:b:::2::l:1:f:10\ncell:D21:b:::2::l:3:f:6:cf:2\ncell:E21:b:::2::l:1:f:10\ncell:F21:b:::2::l:1:f:10\ncell:G21:b::2:::l:3:f:10\ncell:A22:b::2:::l:3:f:10\ncell:B22:b::2::2:l:3:f:10\ncell:C22:t:Description:b:1::1:1:f:9:cf:1:colspan:3\ncell:D22:t:Description:b:1::1::l:3:f:6:cf:2:colspan:2:rowspan:1\ncell:E22:t::b:2:2:2::l:1:f:10\ncell:F22:t:Amount:b:1:1:1:1:f:9:cf:1\ncell:G22:b::2::2:l:3:f:10\ncell:A23:b::2:::l:3:f:10\ncell:B23:b::2::2:l:3:f:10\ncell:C23:b:1:1::1:f:2:cf:2:colspan:3\ncell:D23:b:1:1:::l:3:f:10:cf:2:colspan:2:rowspan:1\ncell:E23:t::b:2:2:2::l:1:f:10\ncell:F23:b:1:1:::f:2:ntvf:1\ncell:G23:b::2::2:l:3:f:10\ncell:A24:b::2:::l:3:f:10\ncell:B24:b::2::2:l:3:f:10:cf:2\ncell:C24:b::1::1:f:2:cf:2:colspan:3\ncell:D24:b::1:::l:1:f:10:colspan:2\ncell:E24:l:1:f:10\ncell:F24:b::1:::f:2:ntvf:1\ncell:G24:b::2::2:l:3:f:10\ncell:A25:b::2:::l:3:f:10\ncell:B25:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C25:b::1::1:f:2:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:2:ntvf:1\ncell:G25:b::2::2:l:3:f:10\ncell:A26:b::2:::l:3:f:10\ncell:B26:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C26:b::1::1:f:2:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:2:ntvf:1\ncell:G26:b::2::2:l:3:f:10\ncell:A27:b::2:::l:3:f:10\ncell:B27:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C27:b::1::1:f:2:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:2:ntvf:1\ncell:G27:b::2::2:l:3:f:10\ncell:A28:b::2:::l:3:f:10\ncell:B28:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C28:b::1::1:f:2:cf:2:colspan:3\ncell:D28:b::1:::colspan:2\ncell:F28:b::1:::f:2:ntvf:1\ncell:G28:b::2::2:l:3:f:10\ncell:A29:b::2:::l:3:f:10\ncell:B29:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C29:b::1::1:f:2:cf:2:colspan:3\ncell:D29:b::1:::colspan:2\ncell:F29:b::1:::f:2:ntvf:1\ncell:G29:b::2::2:l:3:f:10\ncell:A30:b::2:::l:3:f:10\ncell:B30:b::2::2:l:3:f:10:cf:2\ncell:C30:b::1::1:f:2:cf:2:colspan:3\ncell:D30:b::1:::colspan:2\ncell:F30:b::1:::f:2:ntvf:1\ncell:G30:b::2::2:l:3:f:10\ncell:A31:b::2:::l:3:f:10\ncell:B31:b::2::2:l:3:f:10:cf:2\ncell:C31:b::1::1:f:2:cf:2:colspan:3\ncell:D31:b::1:::colspan:2\ncell:F31:b::1:::f:2:ntvf:1\ncell:G31:b::2::2:l:3:f:10\ncell:A32:b::2:::l:3:f:10\ncell:B32:b::2::2:l:3:f:10:cf:2\ncell:C32:b::1::1:f:2:cf:2:colspan:3\ncell:D32:b::1:::colspan:2\ncell:F32:b::1:::f:2:ntvf:1\ncell:G32:b::2::2:l:3:f:10\ncell:A33:b::2:::l:3:f:10\ncell:B33:b::2::2:l:3:f:10:cf:2\ncell:C33:b::1::1:f:2:cf:2:colspan:3\ncell:D33:b::1:::colspan:2\ncell:F33:b::1:::f:2:ntvf:1\ncell:G33:b::2::2:l:3:f:10\ncell:A34:b::2:::l:3:f:10\ncell:B34:b::2::2:l:3:f:10:cf:2\ncell:C34:b::1::1:f:2:cf:2:colspan:3\ncell:D34:b::1:::colspan:2\ncell:F34:b::1:::f:2:ntvf:1\ncell:G34:b::2::2:l:3:f:10\ncell:A35:b::2:::l:3:f:7\ncell:B35:b::2::2:l:3:f:10:cf:2\ncell:C35:b::1:1:1:f:2:cf:2:colspan:3\ncell:D35:b::1:1::l:3:f:10:cf:2:colspan:2\ncell:E35:b:::2::l:3:f:10:cf:2\ncell:F35:b::1:1::f:2:ntvf:1\ncell:G35:b::2::2:l:3:f:10\ncell:A36:b::2:::l:3:f:6\ncell:B36:b::2::2:l:3:f:6\ncell:C36:t:TOTAL:b:1:1:1:1:f:11:cf:2:colspan:3\ncell:D36:b:2::2::l:3:f:12:cf:2\ncell:E36:b:2:2:2::l:3:f:12:cf:2\ncell:F36:vtf:n:0:SUM(F23\\cF35):b:1:1:1::f:11:ntvf:1\ncell:G36:b::2::2:l:3:f:7\ncell:A37:b::2:::l:3:f:10\ncell:B37:b::::2:l:3:f:6:cf:2\ncell:C37:b:2::::l:1:f:10\ncell:D37:b:2::::l:1:f:10\ncell:E37:b:2::::l:1:f:10\ncell:F37:b:2::::l:1:f:10\ncell:G37:b::2:::l:3:f:6\ncell:A38:b::2:::l:3:f:10\ncell:B38:b::::2:l:3:f:10\ncell:G38:b::2:::l:3:f:10\ncell:A39:b::2:::l:3:f:10\ncell:B39:b::::2:l:3:f:10:cf:2\ncell:C39:t:Thank you for your business:f:4:cf:1:colspan:4\ncell:D39:t:Thank you for your business:colspan:3\ncell:E39:t:Thank you for your business:f:3:colspan:2\ncell:F39:t::l:2:f:10\ncell:G39:b::2:::l:3:f:10\ncell:A40:b::2:::l:3:f:10\ncell:B40:b::::2:l:3:f:10\ncell:G40:b::2:::l:3:f:10\ncell:A41:b::2:::l:3:f:10\ncell:B41:b:::2:2:l:3:f:10\ncell:C41:b:::2::l:3:f:10\ncell:D41:b:::2::l:3:f:10\ncell:E41:b:::2::l:3:f:10\ncell:F41:b:::2::l:3:f:10\ncell:G41:b::2:2::l:3:f:10\ncell:B42:b:1:::\ncell:C42:b:1:::\ncell:D42:b:1:::\ncell:E42:b:1:::\ncell:F42:b:1:::\ncell:G42:b:1:::\ncol:A:w:10\ncol:B:w:10\ncol:C:w:62\ncol:D:w:73\ncol:E:w:15\ncol:F:w:68\ncol:G:w:10\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:15.75\nrow:36:h:15.75\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nsheet:c:7:r:42:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:* 9pt Trebuchet MS\nfont:3:italic bold * Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Arial\nfont:7:normal bold 12pt Arial\nfont:8:normal normal * *\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 11pt Trebuchet MS\nfont:12:normal normal 12pt Arial\nfont:13:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nlayout:4:padding:* * * 4px;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv1", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - "version:1.5\ncell:B2:t:INVOICE:l:1:f:9:cf:1:colspan:6\ncell:C2:t::l:2:f:13\ncell:D2:t::l:2:f:13\ncell:E2:l:1:f:10:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:8:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:13\ncell:B3:f:6:cf:2:colspan:4\ncell:C3:t::l:2:f:13\ncell:D3:t::l:2:f:13\ncell:F3:l:1:f:7:cf:2\ncell:G3:l:1:f:14:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:14:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:14:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:3:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:7:cf:2:colspan:2\ncell:G5:l:1:f:14:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:7:cf:2:colspan:2\ncell:G6:l:1:f:14:cf:2\ncell:B7:t:FROM\\c:f:12\ncell:F7:l:1:f:7:cf:2:tvf:4:colspan:2:rowspan:6\ncell:G7:l:1:f:14:cf:2\ncell:B8:t:[Company Name]:f:3:colspan:4\ncell:F8:l:1:f:7:cf:2:colspan:2\ncell:G8:l:1:f:14:cf:2\ncell:B9:t:[Street Address]:f:1:cf:2:colspan:4\ncell:F9:l:1:f:7\ncell:G9:l:1:f:14:cf:1\ncell:B10:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:G10:l:1:f:13\ncell:B11:t:Phone\\c :f:1:cf:2:colspan:4\ncell:B12:t:Email\\c:f:1:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:11:cf:2\ncell:B15:t:[Name]:f:1:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:1:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:1:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:1:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:1:cf:2:colspan:6\ncell:B20:t:Email\\c:f:1:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:14:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:13\ncell:D22:t::l:2:f:13\ncell:E22:t::l:2:f:13\ncell:F22:t::l:2:f:13\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:14:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:b:1:1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:4\ncell:D23:t::l:2:f:4\ncell:E23:t::l:2:f:4\ncell:F23:t::b::2:::l:1:f:4\ncell:G23:b::1::1:f:4:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:4\ncell:D24:t::l:2:f:4\ncell:E24:t::l:2:f:4\ncell:F24:t::b::2:::l:1:f:4\ncell:G24:b::1::1:f:4:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:4\ncell:D25:t::l:2:f:4\ncell:E25:t::l:2:f:4\ncell:F25:t::b::2:::l:1:f:4\ncell:G25:b::1::1:f:4:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:4\ncell:D26:t::l:2:f:4\ncell:E26:t::l:2:f:4\ncell:F26:t::b::2:::l:1:f:4\ncell:G26:b::1::1:f:4:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:4\ncell:D27:t::l:2:f:4\ncell:E27:t::l:2:f:4\ncell:F27:t::b::2:::l:1:f:4\ncell:G27:b::1::1:f:4:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:4\ncell:D28:t::l:2:f:4\ncell:E28:t::l:2:f:4\ncell:F28:t::b::2:::l:1:f:4\ncell:G28:b::1::1:f:4:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:4\ncell:D29:t::l:2:f:4\ncell:E29:t::l:2:f:4\ncell:F29:t::b::2:::l:1:f:4\ncell:G29:b::1::1:f:4:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:4\ncell:D30:t::l:2:f:4\ncell:E30:t::l:2:f:4\ncell:F30:t::b::2:::l:1:f:4\ncell:G30:b::1::1:f:4:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:4\ncell:D31:t::l:2:f:4\ncell:E31:t::l:2:f:4\ncell:F31:t::b::2:::l:1:f:4\ncell:G31:b::1::1:f:4:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:4\ncell:D32:t::l:2:f:4\ncell:E32:t::l:2:f:4\ncell:F32:t::b::2:::l:1:f:4\ncell:G32:b::1::1:f:4:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C33:t::l:2:f:4\ncell:D33:t::l:2:f:4\ncell:E33:t::l:2:f:4\ncell:F33:t::b::2:::l:1:f:4\ncell:G33:b::1::1:f:4:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C34:l:2:f:4\ncell:D34:l:2:f:4\ncell:E34:l:2:f:4\ncell:F34:b::2:::l:1:f:4\ncell:G34:b::1::1:f:4:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:f:4:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:4\ncell:D35:t::b:::2::l:1:f:4\ncell:E35:t::b:::2::l:1:f:4\ncell:F35:t::b::2:2::l:1:f:4\ncell:G35:b::1:1:1:f:4:ntvf:1\ncell:B36:b:2::::l:1:f:13\ncell:C36:b:2::::l:1:f:13\ncell:D36:b:2::::l:1:f:13\ncell:E36:b:2::::l:1:f:14\ncell:F36:t:Subtotal:b:2::::l:1:f:11\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:11:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:14:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:13\ncell:D37:t::b:::2::l:1:f:13\ncell:F37:t:Tax Rate:l:1:f:11\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:13\ncell:D38:t::b:2::::l:1:f:13\ncell:F38:t:Tax:l:1:f:11\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:13\ncell:D39:t::l:2:f:13\ncell:F39:t:Other:b:::1::l:1:f:11\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:13\ncell:D40:t::l:2:f:13\ncell:F40:t:TOTAL:b:1::::l:1:f:14\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:11:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:5:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:13\ncell:D43:t::l:2:f:13\ncell:E43:t::l:2:f:13\ncell:F43:t::l:2:f:13\ncell:G43:t::l:2:f:13\ncol:A:w:10\ncol:B:w:90\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:45\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 10pt Trebuchet MS\nfont:4:* 9pt Trebuchet MS\nfont:5:italic bold 10pt Trebuchet MS\nfont:6:italic normal * Trebuchet MS\nfont:7:normal bold 10pt Trebuchet MS\nfont:8:normal bold 14pt Trebuchet MS\nfont:9:normal bold 16pt Trebuchet MS\nfont:10:normal bold 28pt Trebuchet MS\nfont:11:normal normal * Trebuchet MS\nfont:12:normal normal 10pt *\nfont:13:normal normal 10pt Arial\nfont:14:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv2", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - 'version:1.5\ncell:B2:t:INVOICE:l:1:f:12:cf:1:colspan:6\ncell:C2:t::l:2:f:10\ncell:D2:t::l:2:f:10\ncell:E2:l:1:f:8:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:10\ncell:B3:f:5:cf:2:colspan:4\ncell:C3:t::l:2:f:10\ncell:D3:t::l:2:f:10\ncell:F3:l:1:f:6:cf:2\ncell:G3:l:1:f:11:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:11:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:11:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:9:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:6:cf:2:colspan:2\ncell:G5:l:1:f:11:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:6:cf:2:colspan:2\ncell:G6:l:1:f:11:cf:2\ncell:B7:t:FROM\\c:f:11\ncell:F7:l:1:f:6:cf:2:colspan:2\ncell:G7:l:1:f:11:cf:2\ncell:B8:t:[Company Name]:f:9:colspan:4\ncell:F8:l:1:f:6:cf:2:tvf:4:colspan:2:rowspan:5\ncell:G8:l:1:f:11:cf:2\ncell:B9:t:[Street Address]:f:9:cf:2:colspan:4\ncell:F9:l:1:f:6\ncell:G9:l:1:f:11:cf:1\ncell:B10:t:[City, State, Zip]:f:9:cf:2:colspan:4\ncell:G10:l:1:f:10\ncell:B11:t:Phone\\c :f:9:cf:2:colspan:4\ncell:B12:t:Email\\c:f:9:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:9:cf:2\ncell:B15:t:[Name]:f:9:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:9:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:9:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:9:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:9:cf:2:colspan:6\ncell:B20:t:Email\\c:f:9:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:11:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:10\ncell:D22:t::l:2:f:10\ncell:E22:t::l:2:f:10\ncell:F22:t::l:2:f:10\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:11:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), sheet7!B6, inv3!B6)):b:1:1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:3\ncell:D23:t::l:2:f:3\ncell:E23:t::l:2:f:3\ncell:F23:t::b::2:::l:1:f:3\ncell:G23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), (sheet7!E6*sheet7!F6), (inv3!E6*inv3!F6))):b::1::1:f:3:ntvf:1\ncell:A24:b::1::\ncell:B24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), SHEET7!B7, INV3!B7)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:3\ncell:D24:t::l:2:f:3\ncell:E24:t::l:2:f:3\ncell:F24:t::b::2:::l:1:f:3\ncell:G24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), (SHEET7!E7*SHEET7!F7), (INV3!E7*INV3!F7))):b::1::1:f:3:ntvf:1\ncell:A25:b::1::\ncell:B25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), SHEET7!B8, INV3!B8)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:3\ncell:D25:t::l:2:f:3\ncell:E25:t::l:2:f:3\ncell:F25:t::b::2:::l:1:f:3\ncell:G25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), (SHEET7!E8*SHEET7!F8), (INV3!E8*INV3!F8))):b::1::1:f:3:ntvf:1\ncell:A26:b::1::\ncell:B26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), SHEET7!B9, INV3!B9)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:3\ncell:D26:t::l:2:f:3\ncell:E26:t::l:2:f:3\ncell:F26:t::b::2:::l:1:f:3\ncell:G26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), (SHEET7!E9*SHEET7!F9), (INV3!E9*INV3!F9))):b::1::1:f:3:ntvf:1\ncell:A27:b::1::\ncell:B27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), SHEET7!B10, INV3!B10)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:3\ncell:D27:t::l:2:f:3\ncell:E27:t::l:2:f:3\ncell:F27:t::b::2:::l:1:f:3\ncell:G27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), (SHEET7!E10*SHEET7!F10), (INV3!E10*INV3!F10))):b::1::1:f:3:ntvf:1\ncell:A28:b::1::\ncell:B28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), SHEET7!B11, INV3!B11)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:3\ncell:D28:t::l:2:f:3\ncell:E28:t::l:2:f:3\ncell:F28:t::b::2:::l:1:f:3\ncell:G28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), (SHEET7!E11*SHEET7!F11), (INV3!E11*INV3!F11))):b::1::1:f:3:ntvf:1\ncell:A29:b::1::\ncell:B29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), SHEET7!B12, INV3!B12)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:3\ncell:D29:t::l:2:f:3\ncell:E29:t::l:2:f:3\ncell:F29:t::b::2:::l:1:f:3\ncell:G29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), (SHEET7!E12*SHEET7!F12), (INV3!E12*INV3!F12))):b::1::1:f:3:ntvf:1\ncell:A30:b::1::\ncell:B30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), SHEET7!B13, INV3!B13)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:3\ncell:D30:t::l:2:f:3\ncell:E30:t::l:2:f:3\ncell:F30:t::b::2:::l:1:f:3\ncell:G30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), (SHEET7!E13*SHEET7!F13), (INV3!E13*INV3!F13))):b::1::1:f:3:ntvf:1\ncell:A31:b::1::\ncell:B31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), SHEET7!B14, INV3!B14)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:3\ncell:D31:t::l:2:f:3\ncell:E31:t::l:2:f:3\ncell:F31:t::b::2:::l:1:f:3\ncell:G31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), (SHEET7!E14*SHEET7!F14), (INV3!E14*INV3!F14))):b::1::1:f:3:ntvf:1\ncell:A32:b::1::\ncell:B32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), SHEET7!B15, INV3!B15)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:3\ncell:D32:t::l:2:f:3\ncell:E32:t::l:2:f:3\ncell:F32:t::b::2:::l:1:f:3\ncell:G32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), (SHEET7!E15*SHEET7!F15), (INV3!E15*INV3!F15))):b::1::1:f:3:ntvf:1\ncell:A33:b::1::\ncell:B33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), SHEET7!B16, INV3!B16)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C33:l:2:f:3\ncell:D33:l:2:f:3\ncell:E33:l:2:f:3\ncell:F33:b::2:::l:1:f:3\ncell:G33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), (SHEET7!E16*SHEET7!F16), (INV3!E16*INV3!F16))):b::1::1:f:3:ntvf:1\ncell:A34:b::1::\ncell:B34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), SHEET7!B17, INV3!B17)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C34:t::l:2:f:3\ncell:D34:t::l:2:f:3\ncell:E34:t::l:2:f:3\ncell:F34:t::b::2:::l:1:f:3\ncell:G34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), (SHEET7!E17*SHEET7!F17), (INV3!E17*INV3!F17))):b::1::1:f:3:ntvf:1\ncell:A35:b::1::\ncell:B35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), SHEET7!B18, INV3!B18)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:3\ncell:D35:t::b:::2::l:1:f:3\ncell:E35:t::b:::2::l:1:f:3\ncell:F35:t::b::2:2::l:1:f:3\ncell:G35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), (SHEET7!E18*SHEET7!F18), (INV3!E18*INV3!F18))):b::1::1:f:3:ntvf:1\ncell:B36:b:2::::l:1:f:10\ncell:C36:b:2::::l:1:f:10\ncell:D36:b:2::::l:1:f:10\ncell:E36:b:2::::l:1:f:11\ncell:F36:t:Subtotal:b:2::::l:1:f:9\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:9:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:11:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:10\ncell:D37:t::b:::2::l:1:f:10\ncell:F37:t:Tax Rate:l:1:f:9\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:10\ncell:D38:t::b:2::::l:1:f:10\ncell:F38:t:Tax:l:1:f:9\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:10\ncell:D39:t::l:2:f:10\ncell:F39:t:Other:b:::1::l:1:f:9\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:10\ncell:D40:t::l:2:f:10\ncell:F40:t:TOTAL:b:1::::l:1:f:11\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:9:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:4:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:10\ncell:D43:t::l:2:f:10\ncell:E43:t::l:2:f:10\ncell:F43:t::l:2:f:10\ncell:G43:t::l:2:f:10\ncol:A:w:10\ncol:B:w:65\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:53\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 9pt Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:italic normal * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 14pt Trebuchet MS\nfont:8:normal bold 28pt Trebuchet MS\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 10pt Trebuchet MS\nfont:12:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "sheet6", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Hours:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Rate:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "inv3", - hidden: "0", - }, - sheet5: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Qty.:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Price:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "sheet7", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "inv1!B2": true, - "inv1!C5": true, - "inv1!C6": true, - "inv1!C7": true, - "inv1!C8": true, - "inv1!C9": true, - "inv1!C11": true, - "inv1!C12": true, - "inv1!C13": true, - "inv1!C14": true, - "inv1!C15": true, - "inv1!C16": true, - "inv1!C18": true, - "inv1!C20": true, - "inv1!D20": true, - "inv1!C23": true, - "inv1!C24": true, - "inv1!C25": true, - "inv1!C26": true, - "inv1!C27": true, - "inv1!C28": true, - "inv1!C29": true, - "inv1!C30": true, - "inv1!C31": true, - "inv1!C32": true, - "inv1!C33": true, - "inv1!C34": true, - "inv1!C35": true, - "inv1!F23": true, - "inv1!F24": true, - "inv1!F25": true, - "inv1!F26": true, - "inv1!F27": true, - "inv1!F28": true, - "inv1!F29": true, - "inv1!F30": true, - "inv1!F31": true, - "inv1!F32": true, - "inv1!F33": true, - "inv1!F34": true, - "inv1!F35": true, - "inv2!B2": true, - "inv2!F4": true, - "inv2!G4": true, - "inv2!B5": true, - "inv2!B7": true, - "inv2!B8": true, - "inv2!B9": true, - "inv2!B10": true, - "inv2!B11": true, - "inv2!B12": true, - "inv2!B14": true, - "inv2!B15": true, - "inv2!B16": true, - "inv2!B17": true, - "inv2!B18": true, - "inv2!B19": true, - "inv2!B20": true, - "inv2!B23": true, - "inv2!B24": true, - "inv2!B25": true, - "inv2!B26": true, - "inv2!B27": true, - "inv2!B28": true, - "inv2!B29": true, - "inv2!B30": true, - "inv2!B31": true, - "inv2!B32": true, - "inv2!B33": true, - "inv2!B34": true, - "inv2!B35": true, - "inv2!G23": true, - "inv2!G24": true, - "inv2!G25": true, - "inv2!G26": true, - "inv2!G27": true, - "inv2!G28": true, - "inv2!G29": true, - "inv2!G30": true, - "inv2!G31": true, - "inv2!G32": true, - "inv2!G33": true, - "inv2!G34": true, - "inv2!G35": true, - "inv2!B38": true, - "inv2!B39": true, - "inv2!B40": true, - "inv2!F36": true, - "inv2!G37": true, - "inv2!F37": true, - "inv2!F39": true, - "inv2!G39": true, - "inv2!F38": true, - "sheet6!B2": true, - "sheet6!F4": true, - "sheet6!G4": true, - "sheet6!B5": true, - "sheet6!B7": true, - "sheet6!B8": true, - "sheet6!B9": true, - "sheet6!B10": true, - "sheet6!B11": true, - "sheet6!B12": true, - "sheet6!B14": true, - "sheet6!B15": true, - "sheet6!B16": true, - "sheet6!B17": true, - "sheet6!B18": true, - "sheet6!B19": true, - "sheet6!B20": true, - "sheet6!B38": true, - "sheet6!B39": true, - "sheet6!B40": true, - "sheet6!F36": true, - "sheet6!G37": true, - "sheet6!F37": true, - "sheet6!F39": true, - "sheet6!G39": true, - "sheet6!F38": true, - "inv3!B2": true, - "inv3!B6": true, - "inv3!B7": true, - "inv3!B8": true, - "inv3!B9": true, - "inv3!B10": true, - "inv3!B11": true, - "inv3!B12": true, - "inv3!B13": true, - "inv3!B14": true, - "inv3!B15": true, - "inv3!B16": true, - "inv3!B17": true, - "inv3!B18": true, - "inv3!E6": true, - "inv3!E7": true, - "inv3!E8": true, - "inv3!E9": true, - "inv3!E10": true, - "inv3!E11": true, - "inv3!E12": true, - "inv3!E13": true, - "inv3!E14": true, - "inv3!E15": true, - "inv3!E16": true, - "inv3!E17": true, - "inv3!E18": true, - "inv3!F6": true, - "inv3!F7": true, - "inv3!F8": true, - "inv3!F9": true, - "inv3!F10": true, - "inv3!F11": true, - "inv3!F12": true, - "inv3!F13": true, - "inv3!F14": true, - "inv3!F15": true, - "inv3!F16": true, - "inv3!F17": true, - "inv3!F18": true, - "sheet7!F6": true, - "sheet7!F7": true, - "sheet7!F8": true, - "sheet7!F9": true, - "sheet7!F10": true, - "sheet7!F11": true, - "sheet7!F12": true, - "sheet7!F13": true, - "sheet7!F14": true, - "sheet7!F15": true, - "sheet7!F16": true, - "sheet7!F17": true, - "sheet7!F18": true, - "sheet7!E6": true, - "sheet7!E7": true, - "sheet7!E8": true, - "sheet7!E9": true, - "sheet7!E10": true, - "sheet7!E11": true, - "sheet7!E12": true, - "sheet7!E13": true, - "sheet7!E14": true, - "sheet7!E15": true, - "sheet7!E16": true, - "sheet7!E17": true, - "sheet7!E18": true, - "sheet7!B6": true, - "sheet7!B2": true, - "sheet7!B7": true, - "sheet7!B8": true, - "sheet7!B9": true, - "sheet7!B10": true, - "sheet7!B11": true, - "sheet7!B12": true, - "sheet7!B13": true, - "sheet7!B14": true, - "sheet7!B15": true, - "sheet7!B16": true, - "sheet7!B17": true, - "sheet7!B18": true, - "inv1!D8": true, - "inv1!D15": true, - "inv1!D18": true, - "inv2!C5": true, - "sheet6!C5": true, - }, - constraints: { - "inv1!C5": ["prompttext", "0", "1e10", "Name"], - "inv1!C6": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C7": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C8": ["prompttext", "0", "1e10", "Phone"], - "inv1!C9": ["promptemail", "0", "1e10", "Email"], - "inv1!C11": ["prompttext", "0", "1e10", "From"], - "inv1!C12": ["prompttext", "0", "1e10", "Name"], - "inv1!C13": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C14": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C15": ["prompttext", "0", "1e10", "Phone"], - "inv1!C16": ["promptemail", "0", "1e10", "Email"], - "inv1!C18": ["prompttext", "0", "1e10", "Invoice #"], - "inv1!C20": ["prompttext", "0", "1e10", "Date"], - "inv1!D20": ["prompttext", "0", "1e10", "Date"], - "inv1!C23": ["prompttext", "0", "1e10", "Description"], - "inv1!C24": ["prompttext", "0", "1e10", "Description"], - "inv1!C25": ["prompttext", "0", "1e10", "Description"], - "inv1!C26": ["prompttext", "0", "1e10", "Description"], - "inv1!C27": ["prompttext", "0", "1e10", "Description"], - "inv1!C28": ["prompttext", "0", "1e10", "Description"], - "inv1!C29": ["prompttext", "0", "1e10", "Description"], - "inv1!C30": ["prompttext", "0", "1e10", "Description"], - "inv1!C31": ["prompttext", "0", "1e10", "Description"], - "inv1!C32": ["prompttext", "0", "1e10", "Description"], - "inv1!C33": ["prompttext", "0", "1e10", "Description"], - "inv1!C34": ["prompttext", "0", "1e10", "Description"], - "inv1!C35": ["prompttext", "0", "1e10", "Description"], - "inv1!F23": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F24": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F25": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F26": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F27": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F28": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F29": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F30": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F31": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F32": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F33": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F34": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B2": ["prompttext", "0", "1e10", "Invoice"], - "inv2!F4": ["prompttext", "0", "1e10", "Date"], - "inv2!G4": ["prompttext", "0", "1e10", "Date"], - "inv2!B5": ["prompttext", "0", "1e10", "Invoice #"], - "inv2!B7": ["prompttext", "0", "1e10", "From"], - "inv2!B8": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B9": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B11": ["prompttext", "0", "1e10", "Phone"], - "inv2!B12": ["promptemail", "0", "1e10", "Email"], - "inv2!B14": ["prompttext", "0", "1e10", "Bill To"], - "inv2!B15": ["prompttext", "0", "1e10", "Name"], - "inv2!B16": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B17": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B19": ["prompttext", "0", "1e10", "Phone"], - "inv2!B20": ["promptemail", "0", "1e10", "Email"], - "inv2!B23": ["prompttext", "0", "1e10", "Description"], - "inv2!B24": ["prompttext", "0", "1e10", "Description"], - "inv2!B25": ["prompttext", "0", "1e10", "Description"], - "inv2!B26": ["prompttext", "0", "1e10", "Description"], - "inv2!B27": ["prompttext", "0", "1e10", "Description"], - "inv2!B28": ["prompttext", "0", "1e10", "Description"], - "inv2!B29": ["prompttext", "0", "1e10", "Description"], - "inv2!B30": ["prompttext", "0", "1e10", "Description"], - "inv2!B31": ["prompttext", "0", "1e10", "Description"], - "inv2!B32": ["prompttext", "0", "1e10", "Description"], - "inv2!B33": ["prompttext", "0", "1e10", "Description"], - "inv2!B34": ["prompttext", "0", "1e10", "Description"], - "inv2!B35": ["prompttext", "0", "1e10", "Description"], - "inv2!G23": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G24": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G25": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G26": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G27": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G28": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G29": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G30": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G31": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G32": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G33": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G34": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B38": ["prompttext", "0", "1e10", "Notes"], - "inv2!B39": ["prompttext", "0", "1e10", "Notes"], - "inv2!B40": ["prompttext", "0", "1e10", "Notes"], - "inv2!F36": ["prompttext", "0", "1e10", "Subtotal"], - "inv2!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "inv2!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "inv2!F39": ["prompttext", "0", "1e10", "Other"], - "inv2!G39": ["promptdecimal", "0", "1e10", "Other"], - "inv2!F38": ["prompttext", "0", "1e10", "Tax"], - "sheet6!B2": ["prompttext", "0", "1e10", "Invoice"], - "sheet6!F4": ["prompttext", "0", "1e10", "Date"], - "sheet6!G4": ["prompttext", "0", "1e10", "Date"], - "sheet6!B5": ["prompttext", "0", "1e10", "Invoice #"], - "sheet6!B7": ["prompttext", "0", "1e10", "From"], - "sheet6!B8": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B9": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B11": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B12": ["promptemail", "0", "1e10", "Email"], - "sheet6!B14": ["prompttext", "0", "1e10", "Bill To"], - "sheet6!B15": ["prompttext", "0", "1e10", "Name"], - "sheet6!B16": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B17": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B19": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B20": ["promptemail", "0", "1e10", "Email"], - "sheet6!B38": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B39": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B40": ["prompttext", "0", "1e10", "Notes"], - "sheet6!F36": ["prompttext", "0", "1e10", "Subtotal"], - "sheet6!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "sheet6!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "sheet6!F39": ["prompttext", "0", "1e10", "Other"], - "sheet6!G39": ["promptdecimal", "0", "1e10", "Other"], - "sheet6!F38": ["prompttext", "0", "1e10", "Tax"], - "inv3!B6": ["prompttext", "0", "1e10", "Description"], - "inv3!B7": ["prompttext", "0", "1e10", "Description"], - "inv3!B8": ["prompttext", "0", "1e10", "Description"], - "inv3!B9": ["prompttext", "0", "1e10", "Description"], - "inv3!B10": ["prompttext", "0", "1e10", "Description"], - "inv3!B11": ["prompttext", "0", "1e10", "Description"], - "inv3!B12": ["prompttext", "0", "1e10", "Description"], - "inv3!B13": ["prompttext", "0", "1e10", "Description"], - "inv3!B14": ["prompttext", "0", "1e10", "Description"], - "inv3!B15": ["prompttext", "0", "1e10", "Description"], - "inv3!B16": ["prompttext", "0", "1e10", "Description"], - "inv3!B17": ["prompttext", "0", "1e10", "Description"], - "inv3!B18": ["prompttext", "0", "1e10", "Description"], - "sheet7!B6": ["prompttext", "0", "1e10", "Description"], - "sheet7!B7": ["prompttext", "0", "1e10", "Description"], - "sheet7!B8": ["prompttext", "0", "1e10", "Description"], - "sheet7!B9": ["prompttext", "0", "1e10", "Description"], - "sheet7!B10": ["prompttext", "0", "1e10", "Description"], - "sheet7!B11": ["prompttext", "0", "1e10", "Description"], - "sheet7!B12": ["prompttext", "0", "1e10", "Description"], - "sheet7!B13": ["prompttext", "0", "1e10", "Description"], - "sheet7!B14": ["prompttext", "0", "1e10", "Description"], - "sheet7!B15": ["prompttext", "0", "1e10", "Description"], - "sheet7!B16": ["prompttext", "0", "1e10", "Description"], - "sheet7!B17": ["prompttext", "0", "1e10", "Description"], - "sheet7!B18": ["prompttext", "0", "1e10", "Description"], - "inv1!D8": ["prompttext", "0", "1e10", "Phone"], - "inv1!D15": ["prompttext", "0", "1e10", "Phone"], - "inv1!D18": ["promptnumeric", "0", "1e10", "Invoice#"], - "inv2!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet6!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet7!E6": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E7": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E8": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E9": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E10": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E11": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E12": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E13": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E14": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E15": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E16": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E17": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E18": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!F6": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F7": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F8": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F9": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F10": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F11": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F12": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F13": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F14": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F15": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F16": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F17": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F18": ["promptdecimal", "0", "1e10", "Price"], - "inv3!E6": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E7": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E8": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E9": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E10": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E11": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E12": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E13": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E14": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E15": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E16": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E17": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E18": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!F6": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F7": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F8": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F9": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F10": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F11": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F12": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F13": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F14": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F15": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F16": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F17": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F18": ["promptdecimal", "0", "1e10", "Rate"], - }, - }, - }, - footers: [ - { name: "Type1", index: 1, isActive: true }, - { name: "Type2", index: 2, isActive: false }, - { name: "Type3", index: 3, isActive: false }, - { name: "Detail1", index: 4, isActive: false }, - { name: "Detail2", index: 5, isActive: false }, - ], - }, - iPod: { - msc: { - numsheets: 5, - currentid: "sheet1", - currentname: "inv1", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:10\ncell:C1:b:::2::l:1:f:10\ncell:D1:b:::2::l:1:f:10\ncell:E1:b:::2::l:1:f:10\ncell:F1:b:::2::l:1:f:10\ncell:G1:b:::2::l:1:f:10\ncell:A2:b::2:::l:1:f:10\ncell:B2:t:INVOICE:b:1:1:1:1:f:13:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:10\ncell:D2:t::b:2::2::l:1:f:10\ncell:E2:t::b:2::2::l:1:f:10\ncell:F2:t::b:2::2::l:1:f:10\ncell:G2:t::b:2::2::l:1:f:10\ncell:A3:b::2:::l:3:f:10\ncell:B3:b:2:::2:l:3:f:10\ncell:C3:b:2::::l:1:f:10\ncell:D3:b:2::::l:1:f:10\ncell:E3:b:2::::l:1:f:10\ncell:F3:b:2::::l:1:f:10\ncell:G3:b:2:2:::l:3:f:10\ncell:A4:b::2:::l:3:f:10\ncell:B4:b::::2:l:3:f:6\ncell:C4:t:BILL TO\\c:f:9:colspan:2\ncell:E4:f:5:cf:2\ncell:G4:b::2:::l:3:f:10\ncell:A5:b::2:::l:3:f:10\ncell:B5:b::::2:l:3:f:7\ncell:C5:t:[Name]:f:9:cf:2:colspan:3\ncell:E5:f:1:cf:2\ncell:F5:t::l:2:f:10:tvf:4:rowspan:6\ncell:G5:t::b::1:::l:2:f:10\ncell:A6:b::2:::l:3:f:10\ncell:B6:b::::2:l:3:f:7\ncell:C6:t:[Street Address]:f:9:cf:2:colspan:3\ncell:E6:f:1:cf:2\ncell:F6:l:2:f:10\ncell:G6:b::1:::l:2:f:10\ncell:A7:b::2:::l:3:f:10\ncell:B7:b::::2:l:3:f:7\ncell:C7:t:[City, State, Zip]:f:9:cf:2:colspan:3\ncell:E7:f:1:cf:2\ncell:G7:b::2:::l:3:f:10\ncell:A8:b::2:::l:3:f:10\ncell:B8:b::::2:l:3:f:7\ncell:C8:t:Phone\\c:f:9:cf:2:colspan:3\ncell:D8:f:8:cf:2\ncell:E8:f:1:cf:2\ncell:G8:b::2:::l:3:f:10\ncell:A9:b::2:::l:3:f:10\ncell:B9:b::::2:l:3:f:7\ncell:C9:t:Email\\c:f:9:cf:2:colspan:3\ncell:E9:f:1:cf:2\ncell:G9:b::2:::l:3:f:10\ncell:A10:b::2:::l:3:f:10\ncell:B10:b::::2:l:3:f:7\ncell:C10:colspan:2\ncell:G10:b::2:::l:3:f:10\ncell:A11:b::2:::l:3:f:10\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:FROM\\c:f:9:colspan:2\ncell:E11:f:8:colspan:2\ncell:G11:b::2:::l:3:f:10\ncell:A12:b::2:::l:3:f:10\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[Name]:f:9:colspan:4\ncell:E12:colspan:2\ncell:G12:b::2:::l:3:f:10\ncell:A13:b::2:::l:3:f:10\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:[Street Address]:f:9:colspan:4\ncell:E13:colspan:2\ncell:G13:b::2:::l:3:f:10\ncell:A14:b::2:::l:3:f:10\ncell:B14:b::::2:l:3:f:7\ncell:C14:t:[City, State, Zip]:f:9:colspan:4\ncell:E14:colspan:2\ncell:G14:b::2:::l:3:f:10\ncell:A15:b::2:::l:3:f:10\ncell:B15:b::::2:l:3:f:7\ncell:C15:t:Phone\\c:f:9:colspan:4\ncell:D15:f:8:cf:2:colspan:3\ncell:E15:colspan:2\ncell:G15:b::2:::l:3:f:10\ncell:A16:b::2:::l:3:f:10\ncell:B16:b::::2:l:3:f:7\ncell:C16:t:Email\\c:f:9:colspan:4\ncell:E16:colspan:2\ncell:G16:b::2:::l:3:f:10\ncell:A17:b::2:::l:3:f:10\ncell:B17:b::::2:l:3:f:6\ncell:G17:b::2:::l:3:f:10\ncell:A18:b::2:::l:3:f:10\ncell:B18:b::::2:l:3:f:10\ncell:C18:t:INVOICE #\\c:f:9:cf:2:colspan:4\ncell:D18:v:1:l:4:f:9:cf:2:colspan:3\ncell:G18:b::2:::l:3:f:10\ncell:A19:b::2:::l:3:f:10\ncell:B19:b::::2:l:3:f:10\ncell:G19:b::2:::l:3:f:10\ncell:A20:b::2:::l:3:f:10\ncell:B20:b::::2:l:3:f:10\ncell:C20:t:DATE\\c:f:9:cf:2\ncell:D20:vtf:nd:42081:TODAY():f:9:cf:2:ntvf:3:colspan:2\ncell:G20:b::2:::l:3:f:10\ncell:A21:b::2:::l:3:f:10\ncell:B21:b::::2:l:3:f:6:cf:2\ncell:C21:b:::2::l:1:f:10\ncell:D21:b:::2::l:3:f:6:cf:2\ncell:E21:b:::2::l:1:f:10\ncell:F21:b:::2::l:1:f:10\ncell:G21:b::2:::l:3:f:10\ncell:A22:b::2:::l:3:f:10\ncell:B22:b::2::2:l:3:f:10\ncell:C22:t:Description:b:1::1:1:f:9:cf:1:colspan:3\ncell:D22:t:Description:b:1::1::l:3:f:6:cf:2:colspan:2:rowspan:1\ncell:E22:t::b:2:2:2::l:1:f:10\ncell:F22:t:Amount:b:1:1:1:1:f:9:cf:1\ncell:G22:b::2::2:l:3:f:10\ncell:A23:b::2:::l:3:f:10\ncell:B23:b::2::2:l:3:f:10\ncell:C23:b:1:1::1:f:2:cf:2:colspan:3\ncell:D23:b:1:1:::l:3:f:10:cf:2:colspan:2:rowspan:1\ncell:E23:t::b:2:2:2::l:1:f:10\ncell:F23:b:1:1:::f:2:ntvf:1\ncell:G23:b::2::2:l:3:f:10\ncell:A24:b::2:::l:3:f:10\ncell:B24:b::2::2:l:3:f:10:cf:2\ncell:C24:b::1::1:f:2:cf:2:colspan:3\ncell:D24:b::1:::l:1:f:10:colspan:2\ncell:E24:l:1:f:10\ncell:F24:b::1:::f:2:ntvf:1\ncell:G24:b::2::2:l:3:f:10\ncell:A25:b::2:::l:3:f:10\ncell:B25:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C25:b::1::1:f:2:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:2:ntvf:1\ncell:G25:b::2::2:l:3:f:10\ncell:A26:b::2:::l:3:f:10\ncell:B26:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C26:b::1::1:f:2:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:2:ntvf:1\ncell:G26:b::2::2:l:3:f:10\ncell:A27:b::2:::l:3:f:10\ncell:B27:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C27:b::1::1:f:2:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:2:ntvf:1\ncell:G27:b::2::2:l:3:f:10\ncell:A28:b::2:::l:3:f:10\ncell:B28:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C28:b::1::1:f:2:cf:2:colspan:3\ncell:D28:b::1:::colspan:2\ncell:F28:b::1:::f:2:ntvf:1\ncell:G28:b::2::2:l:3:f:10\ncell:A29:b::2:::l:3:f:10\ncell:B29:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C29:b::1::1:f:2:cf:2:colspan:3\ncell:D29:b::1:::colspan:2\ncell:F29:b::1:::f:2:ntvf:1\ncell:G29:b::2::2:l:3:f:10\ncell:A30:b::2:::l:3:f:10\ncell:B30:b::2::2:l:3:f:10:cf:2\ncell:C30:b::1::1:f:2:cf:2:colspan:3\ncell:D30:b::1:::colspan:2\ncell:F30:b::1:::f:2:ntvf:1\ncell:G30:b::2::2:l:3:f:10\ncell:A31:b::2:::l:3:f:10\ncell:B31:b::2::2:l:3:f:10:cf:2\ncell:C31:b::1::1:f:2:cf:2:colspan:3\ncell:D31:b::1:::colspan:2\ncell:F31:b::1:::f:2:ntvf:1\ncell:G31:b::2::2:l:3:f:10\ncell:A32:b::2:::l:3:f:10\ncell:B32:b::2::2:l:3:f:10:cf:2\ncell:C32:b::1::1:f:2:cf:2:colspan:3\ncell:D32:b::1:::colspan:2\ncell:F32:b::1:::f:2:ntvf:1\ncell:G32:b::2::2:l:3:f:10\ncell:A33:b::2:::l:3:f:10\ncell:B33:b::2::2:l:3:f:10:cf:2\ncell:C33:b::1::1:f:2:cf:2:colspan:3\ncell:D33:b::1:::colspan:2\ncell:F33:b::1:::f:2:ntvf:1\ncell:G33:b::2::2:l:3:f:10\ncell:A34:b::2:::l:3:f:10\ncell:B34:b::2::2:l:3:f:10:cf:2\ncell:C34:b::1::1:f:2:cf:2:colspan:3\ncell:D34:b::1:::colspan:2\ncell:F34:b::1:::f:2:ntvf:1\ncell:G34:b::2::2:l:3:f:10\ncell:A35:b::2:::l:3:f:7\ncell:B35:b::2::2:l:3:f:10:cf:2\ncell:C35:b::1:1:1:f:2:cf:2:colspan:3\ncell:D35:b::1:1::l:3:f:10:cf:2:colspan:2\ncell:E35:b:::2::l:3:f:10:cf:2\ncell:F35:b::1:1::f:2:ntvf:1\ncell:G35:b::2::2:l:3:f:10\ncell:A36:b::2:::l:3:f:6\ncell:B36:b::2::2:l:3:f:6\ncell:C36:t:TOTAL:b:1:1:1:1:f:11:cf:2:colspan:3\ncell:D36:b:2::2::l:3:f:12:cf:2\ncell:E36:b:2:2:2::l:3:f:12:cf:2\ncell:F36:vtf:n:0:SUM(F23\\cF35):b:1:1:1::f:11:ntvf:1\ncell:G36:b::2::2:l:3:f:7\ncell:A37:b::2:::l:3:f:10\ncell:B37:b::::2:l:3:f:6:cf:2\ncell:C37:b:2::::l:1:f:10\ncell:D37:b:2::::l:1:f:10\ncell:E37:b:2::::l:1:f:10\ncell:F37:b:2::::l:1:f:10\ncell:G37:b::2:::l:3:f:6\ncell:A38:b::2:::l:3:f:10\ncell:B38:b::::2:l:3:f:10\ncell:G38:b::2:::l:3:f:10\ncell:A39:b::2:::l:3:f:10\ncell:B39:b::::2:l:3:f:10:cf:2\ncell:C39:t:Thank you for your business:f:4:cf:1:colspan:4\ncell:D39:t:Thank you for your business:colspan:3\ncell:E39:t:Thank you for your business:f:3:colspan:2\ncell:F39:t::l:2:f:10\ncell:G39:b::2:::l:3:f:10\ncell:A40:b::2:::l:3:f:10\ncell:B40:b::::2:l:3:f:10\ncell:G40:b::2:::l:3:f:10\ncell:A41:b::2:::l:3:f:10\ncell:B41:b:::2:2:l:3:f:10\ncell:C41:b:::2::l:3:f:10\ncell:D41:b:::2::l:3:f:10\ncell:E41:b:::2::l:3:f:10\ncell:F41:b:::2::l:3:f:10\ncell:G41:b::2:2::l:3:f:10\ncell:B42:b:1:::\ncell:C42:b:1:::\ncell:D42:b:1:::\ncell:E42:b:1:::\ncell:F42:b:1:::\ncell:G42:b:1:::\ncol:A:w:10\ncol:B:w:10\ncol:C:w:62\ncol:D:w:73\ncol:E:w:15\ncol:F:w:68\ncol:G:w:10\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:15.75\nrow:36:h:15.75\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nsheet:c:7:r:42:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:* 9pt Trebuchet MS\nfont:3:italic bold * Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Arial\nfont:7:normal bold 12pt Arial\nfont:8:normal normal * *\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 11pt Trebuchet MS\nfont:12:normal normal 12pt Arial\nfont:13:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nlayout:4:padding:* * * 4px;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv1", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - "version:1.5\ncell:B2:t:INVOICE:l:1:f:9:cf:1:colspan:6\ncell:C2:t::l:2:f:13\ncell:D2:t::l:2:f:13\ncell:E2:l:1:f:10:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:8:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:13\ncell:B3:f:6:cf:2:colspan:4\ncell:C3:t::l:2:f:13\ncell:D3:t::l:2:f:13\ncell:F3:l:1:f:7:cf:2\ncell:G3:l:1:f:14:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:14:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:14:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:3:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:7:cf:2:colspan:2\ncell:G5:l:1:f:14:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:7:cf:2:colspan:2\ncell:G6:l:1:f:14:cf:2\ncell:B7:t:FROM\\c:f:12\ncell:F7:l:1:f:7:cf:2:tvf:4:colspan:2:rowspan:6\ncell:G7:l:1:f:14:cf:2\ncell:B8:t:[Company Name]:f:3:colspan:4\ncell:F8:l:1:f:7:cf:2:colspan:2\ncell:G8:l:1:f:14:cf:2\ncell:B9:t:[Street Address]:f:1:cf:2:colspan:4\ncell:F9:l:1:f:7\ncell:G9:l:1:f:14:cf:1\ncell:B10:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:G10:l:1:f:13\ncell:B11:t:Phone\\c :f:1:cf:2:colspan:4\ncell:B12:t:Email\\c:f:1:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:11:cf:2\ncell:B15:t:[Name]:f:1:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:1:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:1:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:1:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:1:cf:2:colspan:6\ncell:B20:t:Email\\c:f:1:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:14:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:13\ncell:D22:t::l:2:f:13\ncell:E22:t::l:2:f:13\ncell:F22:t::l:2:f:13\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:14:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:b:1:1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:4\ncell:D23:t::l:2:f:4\ncell:E23:t::l:2:f:4\ncell:F23:t::b::2:::l:1:f:4\ncell:G23:b::1::1:f:4:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:4\ncell:D24:t::l:2:f:4\ncell:E24:t::l:2:f:4\ncell:F24:t::b::2:::l:1:f:4\ncell:G24:b::1::1:f:4:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:4\ncell:D25:t::l:2:f:4\ncell:E25:t::l:2:f:4\ncell:F25:t::b::2:::l:1:f:4\ncell:G25:b::1::1:f:4:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:4\ncell:D26:t::l:2:f:4\ncell:E26:t::l:2:f:4\ncell:F26:t::b::2:::l:1:f:4\ncell:G26:b::1::1:f:4:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:4\ncell:D27:t::l:2:f:4\ncell:E27:t::l:2:f:4\ncell:F27:t::b::2:::l:1:f:4\ncell:G27:b::1::1:f:4:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:4\ncell:D28:t::l:2:f:4\ncell:E28:t::l:2:f:4\ncell:F28:t::b::2:::l:1:f:4\ncell:G28:b::1::1:f:4:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:4\ncell:D29:t::l:2:f:4\ncell:E29:t::l:2:f:4\ncell:F29:t::b::2:::l:1:f:4\ncell:G29:b::1::1:f:4:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:4\ncell:D30:t::l:2:f:4\ncell:E30:t::l:2:f:4\ncell:F30:t::b::2:::l:1:f:4\ncell:G30:b::1::1:f:4:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:4\ncell:D31:t::l:2:f:4\ncell:E31:t::l:2:f:4\ncell:F31:t::b::2:::l:1:f:4\ncell:G31:b::1::1:f:4:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:4\ncell:D32:t::l:2:f:4\ncell:E32:t::l:2:f:4\ncell:F32:t::b::2:::l:1:f:4\ncell:G32:b::1::1:f:4:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C33:t::l:2:f:4\ncell:D33:t::l:2:f:4\ncell:E33:t::l:2:f:4\ncell:F33:t::b::2:::l:1:f:4\ncell:G33:b::1::1:f:4:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C34:l:2:f:4\ncell:D34:l:2:f:4\ncell:E34:l:2:f:4\ncell:F34:b::2:::l:1:f:4\ncell:G34:b::1::1:f:4:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:f:4:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:4\ncell:D35:t::b:::2::l:1:f:4\ncell:E35:t::b:::2::l:1:f:4\ncell:F35:t::b::2:2::l:1:f:4\ncell:G35:b::1:1:1:f:4:ntvf:1\ncell:B36:b:2::::l:1:f:13\ncell:C36:b:2::::l:1:f:13\ncell:D36:b:2::::l:1:f:13\ncell:E36:b:2::::l:1:f:14\ncell:F36:t:Subtotal:b:2::::l:1:f:11\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:11:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:14:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:13\ncell:D37:t::b:::2::l:1:f:13\ncell:F37:t:Tax Rate:l:1:f:11\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:13\ncell:D38:t::b:2::::l:1:f:13\ncell:F38:t:Tax:l:1:f:11\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:13\ncell:D39:t::l:2:f:13\ncell:F39:t:Other:b:::1::l:1:f:11\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:13\ncell:D40:t::l:2:f:13\ncell:F40:t:TOTAL:b:1::::l:1:f:14\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:11:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:5:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:13\ncell:D43:t::l:2:f:13\ncell:E43:t::l:2:f:13\ncell:F43:t::l:2:f:13\ncell:G43:t::l:2:f:13\ncol:A:w:10\ncol:B:w:90\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:45\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 10pt Trebuchet MS\nfont:4:* 9pt Trebuchet MS\nfont:5:italic bold 10pt Trebuchet MS\nfont:6:italic normal * Trebuchet MS\nfont:7:normal bold 10pt Trebuchet MS\nfont:8:normal bold 14pt Trebuchet MS\nfont:9:normal bold 16pt Trebuchet MS\nfont:10:normal bold 28pt Trebuchet MS\nfont:11:normal normal * Trebuchet MS\nfont:12:normal normal 10pt *\nfont:13:normal normal 10pt Arial\nfont:14:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv2", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - 'version:1.5\ncell:B2:t:INVOICE:l:1:f:12:cf:1:colspan:6\ncell:C2:t::l:2:f:10\ncell:D2:t::l:2:f:10\ncell:E2:l:1:f:8:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:10\ncell:B3:f:5:cf:2:colspan:4\ncell:C3:t::l:2:f:10\ncell:D3:t::l:2:f:10\ncell:F3:l:1:f:6:cf:2\ncell:G3:l:1:f:11:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:11:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:11:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:9:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:6:cf:2:colspan:2\ncell:G5:l:1:f:11:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:6:cf:2:colspan:2\ncell:G6:l:1:f:11:cf:2\ncell:B7:t:FROM\\c:f:11\ncell:F7:l:1:f:6:cf:2:colspan:2\ncell:G7:l:1:f:11:cf:2\ncell:B8:t:[Company Name]:f:9:colspan:4\ncell:F8:l:1:f:6:cf:2:tvf:4:colspan:2:rowspan:5\ncell:G8:l:1:f:11:cf:2\ncell:B9:t:[Street Address]:f:9:cf:2:colspan:4\ncell:F9:l:1:f:6\ncell:G9:l:1:f:11:cf:1\ncell:B10:t:[City, State, Zip]:f:9:cf:2:colspan:4\ncell:G10:l:1:f:10\ncell:B11:t:Phone\\c :f:9:cf:2:colspan:4\ncell:B12:t:Email\\c:f:9:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:9:cf:2\ncell:B15:t:[Name]:f:9:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:9:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:9:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:9:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:9:cf:2:colspan:6\ncell:B20:t:Email\\c:f:9:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:11:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:10\ncell:D22:t::l:2:f:10\ncell:E22:t::l:2:f:10\ncell:F22:t::l:2:f:10\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:11:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), sheet7!B6, inv3!B6)):b:1:1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:3\ncell:D23:t::l:2:f:3\ncell:E23:t::l:2:f:3\ncell:F23:t::b::2:::l:1:f:3\ncell:G23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), (sheet7!E6*sheet7!F6), (inv3!E6*inv3!F6))):b::1::1:f:3:ntvf:1\ncell:A24:b::1::\ncell:B24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), SHEET7!B7, INV3!B7)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:3\ncell:D24:t::l:2:f:3\ncell:E24:t::l:2:f:3\ncell:F24:t::b::2:::l:1:f:3\ncell:G24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), (SHEET7!E7*SHEET7!F7), (INV3!E7*INV3!F7))):b::1::1:f:3:ntvf:1\ncell:A25:b::1::\ncell:B25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), SHEET7!B8, INV3!B8)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:3\ncell:D25:t::l:2:f:3\ncell:E25:t::l:2:f:3\ncell:F25:t::b::2:::l:1:f:3\ncell:G25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), (SHEET7!E8*SHEET7!F8), (INV3!E8*INV3!F8))):b::1::1:f:3:ntvf:1\ncell:A26:b::1::\ncell:B26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), SHEET7!B9, INV3!B9)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:3\ncell:D26:t::l:2:f:3\ncell:E26:t::l:2:f:3\ncell:F26:t::b::2:::l:1:f:3\ncell:G26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), (SHEET7!E9*SHEET7!F9), (INV3!E9*INV3!F9))):b::1::1:f:3:ntvf:1\ncell:A27:b::1::\ncell:B27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), SHEET7!B10, INV3!B10)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:3\ncell:D27:t::l:2:f:3\ncell:E27:t::l:2:f:3\ncell:F27:t::b::2:::l:1:f:3\ncell:G27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), (SHEET7!E10*SHEET7!F10), (INV3!E10*INV3!F10))):b::1::1:f:3:ntvf:1\ncell:A28:b::1::\ncell:B28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), SHEET7!B11, INV3!B11)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:3\ncell:D28:t::l:2:f:3\ncell:E28:t::l:2:f:3\ncell:F28:t::b::2:::l:1:f:3\ncell:G28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), (SHEET7!E11*SHEET7!F11), (INV3!E11*INV3!F11))):b::1::1:f:3:ntvf:1\ncell:A29:b::1::\ncell:B29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), SHEET7!B12, INV3!B12)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:3\ncell:D29:t::l:2:f:3\ncell:E29:t::l:2:f:3\ncell:F29:t::b::2:::l:1:f:3\ncell:G29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), (SHEET7!E12*SHEET7!F12), (INV3!E12*INV3!F12))):b::1::1:f:3:ntvf:1\ncell:A30:b::1::\ncell:B30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), SHEET7!B13, INV3!B13)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:3\ncell:D30:t::l:2:f:3\ncell:E30:t::l:2:f:3\ncell:F30:t::b::2:::l:1:f:3\ncell:G30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), (SHEET7!E13*SHEET7!F13), (INV3!E13*INV3!F13))):b::1::1:f:3:ntvf:1\ncell:A31:b::1::\ncell:B31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), SHEET7!B14, INV3!B14)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:3\ncell:D31:t::l:2:f:3\ncell:E31:t::l:2:f:3\ncell:F31:t::b::2:::l:1:f:3\ncell:G31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), (SHEET7!E14*SHEET7!F14), (INV3!E14*INV3!F14))):b::1::1:f:3:ntvf:1\ncell:A32:b::1::\ncell:B32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), SHEET7!B15, INV3!B15)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:3\ncell:D32:t::l:2:f:3\ncell:E32:t::l:2:f:3\ncell:F32:t::b::2:::l:1:f:3\ncell:G32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), (SHEET7!E15*SHEET7!F15), (INV3!E15*INV3!F15))):b::1::1:f:3:ntvf:1\ncell:A33:b::1::\ncell:B33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), SHEET7!B16, INV3!B16)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C33:l:2:f:3\ncell:D33:l:2:f:3\ncell:E33:l:2:f:3\ncell:F33:b::2:::l:1:f:3\ncell:G33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), (SHEET7!E16*SHEET7!F16), (INV3!E16*INV3!F16))):b::1::1:f:3:ntvf:1\ncell:A34:b::1::\ncell:B34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), SHEET7!B17, INV3!B17)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C34:t::l:2:f:3\ncell:D34:t::l:2:f:3\ncell:E34:t::l:2:f:3\ncell:F34:t::b::2:::l:1:f:3\ncell:G34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), (SHEET7!E17*SHEET7!F17), (INV3!E17*INV3!F17))):b::1::1:f:3:ntvf:1\ncell:A35:b::1::\ncell:B35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), SHEET7!B18, INV3!B18)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:3\ncell:D35:t::b:::2::l:1:f:3\ncell:E35:t::b:::2::l:1:f:3\ncell:F35:t::b::2:2::l:1:f:3\ncell:G35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), (SHEET7!E18*SHEET7!F18), (INV3!E18*INV3!F18))):b::1::1:f:3:ntvf:1\ncell:B36:b:2::::l:1:f:10\ncell:C36:b:2::::l:1:f:10\ncell:D36:b:2::::l:1:f:10\ncell:E36:b:2::::l:1:f:11\ncell:F36:t:Subtotal:b:2::::l:1:f:9\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:9:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:11:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:10\ncell:D37:t::b:::2::l:1:f:10\ncell:F37:t:Tax Rate:l:1:f:9\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:10\ncell:D38:t::b:2::::l:1:f:10\ncell:F38:t:Tax:l:1:f:9\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:10\ncell:D39:t::l:2:f:10\ncell:F39:t:Other:b:::1::l:1:f:9\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:10\ncell:D40:t::l:2:f:10\ncell:F40:t:TOTAL:b:1::::l:1:f:11\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:9:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:4:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:10\ncell:D43:t::l:2:f:10\ncell:E43:t::l:2:f:10\ncell:F43:t::l:2:f:10\ncell:G43:t::l:2:f:10\ncol:A:w:10\ncol:B:w:65\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:53\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 9pt Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:italic normal * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 14pt Trebuchet MS\nfont:8:normal bold 28pt Trebuchet MS\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 10pt Trebuchet MS\nfont:12:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "sheet6", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Hours:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Rate:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "inv3", - hidden: "0", - }, - sheet5: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Qty.:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Price:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "sheet7", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "inv1!B2": true, - "inv1!C5": true, - "inv1!C6": true, - "inv1!C7": true, - "inv1!C8": true, - "inv1!C9": true, - "inv1!C11": true, - "inv1!C12": true, - "inv1!C13": true, - "inv1!C14": true, - "inv1!C15": true, - "inv1!C16": true, - "inv1!C18": true, - "inv1!C20": true, - "inv1!D20": true, - "inv1!C23": true, - "inv1!C24": true, - "inv1!C25": true, - "inv1!C26": true, - "inv1!C27": true, - "inv1!C28": true, - "inv1!C29": true, - "inv1!C30": true, - "inv1!C31": true, - "inv1!C32": true, - "inv1!C33": true, - "inv1!C34": true, - "inv1!C35": true, - "inv1!F23": true, - "inv1!F24": true, - "inv1!F25": true, - "inv1!F26": true, - "inv1!F27": true, - "inv1!F28": true, - "inv1!F29": true, - "inv1!F30": true, - "inv1!F31": true, - "inv1!F32": true, - "inv1!F33": true, - "inv1!F34": true, - "inv1!F35": true, - "inv2!B2": true, - "inv2!F4": true, - "inv2!G4": true, - "inv2!B5": true, - "inv2!B7": true, - "inv2!B8": true, - "inv2!B9": true, - "inv2!B10": true, - "inv2!B11": true, - "inv2!B12": true, - "inv2!B14": true, - "inv2!B15": true, - "inv2!B16": true, - "inv2!B17": true, - "inv2!B18": true, - "inv2!B19": true, - "inv2!B20": true, - "inv2!B23": true, - "inv2!B24": true, - "inv2!B25": true, - "inv2!B26": true, - "inv2!B27": true, - "inv2!B28": true, - "inv2!B29": true, - "inv2!B30": true, - "inv2!B31": true, - "inv2!B32": true, - "inv2!B33": true, - "inv2!B34": true, - "inv2!B35": true, - "inv2!G23": true, - "inv2!G24": true, - "inv2!G25": true, - "inv2!G26": true, - "inv2!G27": true, - "inv2!G28": true, - "inv2!G29": true, - "inv2!G30": true, - "inv2!G31": true, - "inv2!G32": true, - "inv2!G33": true, - "inv2!G34": true, - "inv2!G35": true, - "inv2!B38": true, - "inv2!B39": true, - "inv2!B40": true, - "inv2!F36": true, - "inv2!G37": true, - "inv2!F37": true, - "inv2!F39": true, - "inv2!G39": true, - "inv2!F38": true, - "sheet6!B2": true, - "sheet6!F4": true, - "sheet6!G4": true, - "sheet6!B5": true, - "sheet6!B7": true, - "sheet6!B8": true, - "sheet6!B9": true, - "sheet6!B10": true, - "sheet6!B11": true, - "sheet6!B12": true, - "sheet6!B14": true, - "sheet6!B15": true, - "sheet6!B16": true, - "sheet6!B17": true, - "sheet6!B18": true, - "sheet6!B19": true, - "sheet6!B20": true, - "sheet6!B38": true, - "sheet6!B39": true, - "sheet6!B40": true, - "sheet6!F36": true, - "sheet6!G37": true, - "sheet6!F37": true, - "sheet6!F39": true, - "sheet6!G39": true, - "sheet6!F38": true, - "inv3!B2": true, - "inv3!B6": true, - "inv3!B7": true, - "inv3!B8": true, - "inv3!B9": true, - "inv3!B10": true, - "inv3!B11": true, - "inv3!B12": true, - "inv3!B13": true, - "inv3!B14": true, - "inv3!B15": true, - "inv3!B16": true, - "inv3!B17": true, - "inv3!B18": true, - "inv3!E6": true, - "inv3!E7": true, - "inv3!E8": true, - "inv3!E9": true, - "inv3!E10": true, - "inv3!E11": true, - "inv3!E12": true, - "inv3!E13": true, - "inv3!E14": true, - "inv3!E15": true, - "inv3!E16": true, - "inv3!E17": true, - "inv3!E18": true, - "inv3!F6": true, - "inv3!F7": true, - "inv3!F8": true, - "inv3!F9": true, - "inv3!F10": true, - "inv3!F11": true, - "inv3!F12": true, - "inv3!F13": true, - "inv3!F14": true, - "inv3!F15": true, - "inv3!F16": true, - "inv3!F17": true, - "inv3!F18": true, - "sheet7!F6": true, - "sheet7!F7": true, - "sheet7!F8": true, - "sheet7!F9": true, - "sheet7!F10": true, - "sheet7!F11": true, - "sheet7!F12": true, - "sheet7!F13": true, - "sheet7!F14": true, - "sheet7!F15": true, - "sheet7!F16": true, - "sheet7!F17": true, - "sheet7!F18": true, - "sheet7!E6": true, - "sheet7!E7": true, - "sheet7!E8": true, - "sheet7!E9": true, - "sheet7!E10": true, - "sheet7!E11": true, - "sheet7!E12": true, - "sheet7!E13": true, - "sheet7!E14": true, - "sheet7!E15": true, - "sheet7!E16": true, - "sheet7!E17": true, - "sheet7!E18": true, - "sheet7!B6": true, - "sheet7!B2": true, - "sheet7!B7": true, - "sheet7!B8": true, - "sheet7!B9": true, - "sheet7!B10": true, - "sheet7!B11": true, - "sheet7!B12": true, - "sheet7!B13": true, - "sheet7!B14": true, - "sheet7!B15": true, - "sheet7!B16": true, - "sheet7!B17": true, - "sheet7!B18": true, - "inv1!D8": true, - "inv1!D15": true, - "inv1!D18": true, - "inv2!C5": true, - "sheet6!C5": true, - }, - constraints: { - "inv1!C5": ["prompttext", "0", "1e10", "Name"], - "inv1!C6": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C7": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C8": ["prompttext", "0", "1e10", "Phone"], - "inv1!C9": ["promptemail", "0", "1e10", "Email"], - "inv1!C11": ["prompttext", "0", "1e10", "From"], - "inv1!C12": ["prompttext", "0", "1e10", "Name"], - "inv1!C13": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C14": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C15": ["prompttext", "0", "1e10", "Phone"], - "inv1!C16": ["promptemail", "0", "1e10", "Email"], - "inv1!C18": ["prompttext", "0", "1e10", "Invoice #"], - "inv1!C20": ["prompttext", "0", "1e10", "Date"], - "inv1!D20": ["prompttext", "0", "1e10", "Date"], - "inv1!C23": ["prompttext", "0", "1e10", "Description"], - "inv1!C24": ["prompttext", "0", "1e10", "Description"], - "inv1!C25": ["prompttext", "0", "1e10", "Description"], - "inv1!C26": ["prompttext", "0", "1e10", "Description"], - "inv1!C27": ["prompttext", "0", "1e10", "Description"], - "inv1!C28": ["prompttext", "0", "1e10", "Description"], - "inv1!C29": ["prompttext", "0", "1e10", "Description"], - "inv1!C30": ["prompttext", "0", "1e10", "Description"], - "inv1!C31": ["prompttext", "0", "1e10", "Description"], - "inv1!C32": ["prompttext", "0", "1e10", "Description"], - "inv1!C33": ["prompttext", "0", "1e10", "Description"], - "inv1!C34": ["prompttext", "0", "1e10", "Description"], - "inv1!C35": ["prompttext", "0", "1e10", "Description"], - "inv1!F23": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F24": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F25": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F26": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F27": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F28": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F29": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F30": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F31": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F32": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F33": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F34": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B2": ["prompttext", "0", "1e10", "Invoice"], - "inv2!F4": ["prompttext", "0", "1e10", "Date"], - "inv2!G4": ["prompttext", "0", "1e10", "Date"], - "inv2!B5": ["prompttext", "0", "1e10", "Invoice #"], - "inv2!B7": ["prompttext", "0", "1e10", "From"], - "inv2!B8": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B9": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B11": ["prompttext", "0", "1e10", "Phone"], - "inv2!B12": ["promptemail", "0", "1e10", "Email"], - "inv2!B14": ["prompttext", "0", "1e10", "Bill To"], - "inv2!B15": ["prompttext", "0", "1e10", "Name"], - "inv2!B16": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B17": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B19": ["prompttext", "0", "1e10", "Phone"], - "inv2!B20": ["promptemail", "0", "1e10", "Email"], - "inv2!B23": ["prompttext", "0", "1e10", "Description"], - "inv2!B24": ["prompttext", "0", "1e10", "Description"], - "inv2!B25": ["prompttext", "0", "1e10", "Description"], - "inv2!B26": ["prompttext", "0", "1e10", "Description"], - "inv2!B27": ["prompttext", "0", "1e10", "Description"], - "inv2!B28": ["prompttext", "0", "1e10", "Description"], - "inv2!B29": ["prompttext", "0", "1e10", "Description"], - "inv2!B30": ["prompttext", "0", "1e10", "Description"], - "inv2!B31": ["prompttext", "0", "1e10", "Description"], - "inv2!B32": ["prompttext", "0", "1e10", "Description"], - "inv2!B33": ["prompttext", "0", "1e10", "Description"], - "inv2!B34": ["prompttext", "0", "1e10", "Description"], - "inv2!B35": ["prompttext", "0", "1e10", "Description"], - "inv2!G23": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G24": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G25": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G26": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G27": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G28": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G29": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G30": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G31": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G32": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G33": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G34": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B38": ["prompttext", "0", "1e10", "Notes"], - "inv2!B39": ["prompttext", "0", "1e10", "Notes"], - "inv2!B40": ["prompttext", "0", "1e10", "Notes"], - "inv2!F36": ["prompttext", "0", "1e10", "Subtotal"], - "inv2!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "inv2!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "inv2!F39": ["prompttext", "0", "1e10", "Other"], - "inv2!G39": ["promptdecimal", "0", "1e10", "Other"], - "inv2!F38": ["prompttext", "0", "1e10", "Tax"], - "sheet6!B2": ["prompttext", "0", "1e10", "Invoice"], - "sheet6!F4": ["prompttext", "0", "1e10", "Date"], - "sheet6!G4": ["prompttext", "0", "1e10", "Date"], - "sheet6!B5": ["prompttext", "0", "1e10", "Invoice #"], - "sheet6!B7": ["prompttext", "0", "1e10", "From"], - "sheet6!B8": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B9": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B11": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B12": ["promptemail", "0", "1e10", "Email"], - "sheet6!B14": ["prompttext", "0", "1e10", "Bill To"], - "sheet6!B15": ["prompttext", "0", "1e10", "Name"], - "sheet6!B16": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B17": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B19": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B20": ["promptemail", "0", "1e10", "Email"], - "sheet6!B38": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B39": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B40": ["prompttext", "0", "1e10", "Notes"], - "sheet6!F36": ["prompttext", "0", "1e10", "Subtotal"], - "sheet6!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "sheet6!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "sheet6!F39": ["prompttext", "0", "1e10", "Other"], - "sheet6!G39": ["promptdecimal", "0", "1e10", "Other"], - "sheet6!F38": ["prompttext", "0", "1e10", "Tax"], - "inv3!B6": ["prompttext", "0", "1e10", "Description"], - "inv3!B7": ["prompttext", "0", "1e10", "Description"], - "inv3!B8": ["prompttext", "0", "1e10", "Description"], - "inv3!B9": ["prompttext", "0", "1e10", "Description"], - "inv3!B10": ["prompttext", "0", "1e10", "Description"], - "inv3!B11": ["prompttext", "0", "1e10", "Description"], - "inv3!B12": ["prompttext", "0", "1e10", "Description"], - "inv3!B13": ["prompttext", "0", "1e10", "Description"], - "inv3!B14": ["prompttext", "0", "1e10", "Description"], - "inv3!B15": ["prompttext", "0", "1e10", "Description"], - "inv3!B16": ["prompttext", "0", "1e10", "Description"], - "inv3!B17": ["prompttext", "0", "1e10", "Description"], - "inv3!B18": ["prompttext", "0", "1e10", "Description"], - "sheet7!B6": ["prompttext", "0", "1e10", "Description"], - "sheet7!B7": ["prompttext", "0", "1e10", "Description"], - "sheet7!B8": ["prompttext", "0", "1e10", "Description"], - "sheet7!B9": ["prompttext", "0", "1e10", "Description"], - "sheet7!B10": ["prompttext", "0", "1e10", "Description"], - "sheet7!B11": ["prompttext", "0", "1e10", "Description"], - "sheet7!B12": ["prompttext", "0", "1e10", "Description"], - "sheet7!B13": ["prompttext", "0", "1e10", "Description"], - "sheet7!B14": ["prompttext", "0", "1e10", "Description"], - "sheet7!B15": ["prompttext", "0", "1e10", "Description"], - "sheet7!B16": ["prompttext", "0", "1e10", "Description"], - "sheet7!B17": ["prompttext", "0", "1e10", "Description"], - "sheet7!B18": ["prompttext", "0", "1e10", "Description"], - "inv1!D8": ["prompttext", "0", "1e10", "Phone"], - "inv1!D15": ["prompttext", "0", "1e10", "Phone"], - "inv1!D18": ["promptnumeric", "0", "1e10", "Invoice#"], - "inv2!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet6!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet7!E6": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E7": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E8": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E9": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E10": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E11": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E12": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E13": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E14": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E15": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E16": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E17": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E18": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!F6": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F7": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F8": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F9": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F10": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F11": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F12": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F13": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F14": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F15": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F16": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F17": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F18": ["promptdecimal", "0", "1e10", "Price"], - "inv3!E6": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E7": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E8": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E9": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E10": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E11": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E12": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E13": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E14": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E15": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E16": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E17": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E18": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!F6": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F7": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F8": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F9": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F10": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F11": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F12": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F13": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F14": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F15": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F16": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F17": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F18": ["promptdecimal", "0", "1e10", "Rate"], - }, - }, - }, - footers: [ - { name: "Type1", index: 1, isActive: true }, - { name: "Type2", index: 2, isActive: false }, - { name: "Type3", index: 3, isActive: false }, - { name: "Detail1", index: 4, isActive: false }, - { name: "Detail2", index: 5, isActive: false }, - ], - }, - android: { - msc: { - numsheets: 5, - currentid: "sheet1", - currentname: "inv1", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:10\ncell:C1:b:::2::l:1:f:10\ncell:D1:b:::2::l:1:f:10\ncell:E1:b:::2::l:1:f:10\ncell:F1:b:::2::l:1:f:10\ncell:G1:b:::2::l:1:f:10\ncell:A2:b::2:::l:1:f:10\ncell:B2:t:INVOICE:b:1:1:1:1:f:13:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:10\ncell:D2:t::b:2::2::l:1:f:10\ncell:E2:t::b:2::2::l:1:f:10\ncell:F2:t::b:2::2::l:1:f:10\ncell:G2:t::b:2::2::l:1:f:10\ncell:A3:b::2:::l:3:f:10\ncell:B3:b:2:::2:l:3:f:10\ncell:C3:b:2::::l:1:f:10\ncell:D3:b:2::::l:1:f:10\ncell:E3:b:2::::l:1:f:10\ncell:F3:b:2::::l:1:f:10\ncell:G3:b:2:2:::l:3:f:10\ncell:A4:b::2:::l:3:f:10\ncell:B4:b::::2:l:3:f:6\ncell:C4:t:BILL TO\\c:f:9:colspan:2\ncell:E4:f:5:cf:2\ncell:G4:b::2:::l:3:f:10\ncell:A5:b::2:::l:3:f:10\ncell:B5:b::::2:l:3:f:7\ncell:C5:t:[Name]:f:9:cf:2:colspan:3\ncell:E5:f:1:cf:2\ncell:F5:t::l:2:f:10:tvf:4:rowspan:6\ncell:G5:t::b::1:::l:2:f:10\ncell:A6:b::2:::l:3:f:10\ncell:B6:b::::2:l:3:f:7\ncell:C6:t:[Street Address]:f:9:cf:2:colspan:3\ncell:E6:f:1:cf:2\ncell:F6:l:2:f:10\ncell:G6:b::1:::l:2:f:10\ncell:A7:b::2:::l:3:f:10\ncell:B7:b::::2:l:3:f:7\ncell:C7:t:[City, State, Zip]:f:9:cf:2:colspan:3\ncell:E7:f:1:cf:2\ncell:G7:b::2:::l:3:f:10\ncell:A8:b::2:::l:3:f:10\ncell:B8:b::::2:l:3:f:7\ncell:C8:t:Phone\\c:f:9:cf:2:colspan:3\ncell:D8:f:8:cf:2\ncell:E8:f:1:cf:2\ncell:G8:b::2:::l:3:f:10\ncell:A9:b::2:::l:3:f:10\ncell:B9:b::::2:l:3:f:7\ncell:C9:t:Email\\c:f:9:cf:2:colspan:3\ncell:E9:f:1:cf:2\ncell:G9:b::2:::l:3:f:10\ncell:A10:b::2:::l:3:f:10\ncell:B10:b::::2:l:3:f:7\ncell:C10:colspan:2\ncell:G10:b::2:::l:3:f:10\ncell:A11:b::2:::l:3:f:10\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:FROM\\c:f:9:colspan:2\ncell:E11:f:8:colspan:2\ncell:G11:b::2:::l:3:f:10\ncell:A12:b::2:::l:3:f:10\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[Name]:f:9:colspan:4\ncell:E12:colspan:2\ncell:G12:b::2:::l:3:f:10\ncell:A13:b::2:::l:3:f:10\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:[Street Address]:f:9:colspan:4\ncell:E13:colspan:2\ncell:G13:b::2:::l:3:f:10\ncell:A14:b::2:::l:3:f:10\ncell:B14:b::::2:l:3:f:7\ncell:C14:t:[City, State, Zip]:f:9:colspan:4\ncell:E14:colspan:2\ncell:G14:b::2:::l:3:f:10\ncell:A15:b::2:::l:3:f:10\ncell:B15:b::::2:l:3:f:7\ncell:C15:t:Phone\\c:f:9:colspan:4\ncell:D15:f:8:cf:2:colspan:3\ncell:E15:colspan:2\ncell:G15:b::2:::l:3:f:10\ncell:A16:b::2:::l:3:f:10\ncell:B16:b::::2:l:3:f:7\ncell:C16:t:Email\\c:f:9:colspan:4\ncell:E16:colspan:2\ncell:G16:b::2:::l:3:f:10\ncell:A17:b::2:::l:3:f:10\ncell:B17:b::::2:l:3:f:6\ncell:G17:b::2:::l:3:f:10\ncell:A18:b::2:::l:3:f:10\ncell:B18:b::::2:l:3:f:10\ncell:C18:t:INVOICE #\\c:f:9:cf:2:colspan:4\ncell:D18:v:1:l:4:f:9:cf:2:colspan:3\ncell:G18:b::2:::l:3:f:10\ncell:A19:b::2:::l:3:f:10\ncell:B19:b::::2:l:3:f:10\ncell:G19:b::2:::l:3:f:10\ncell:A20:b::2:::l:3:f:10\ncell:B20:b::::2:l:3:f:10\ncell:C20:t:DATE\\c:f:9:cf:2\ncell:D20:vtf:nd:42081:TODAY():f:9:cf:2:ntvf:3:colspan:2\ncell:G20:b::2:::l:3:f:10\ncell:A21:b::2:::l:3:f:10\ncell:B21:b::::2:l:3:f:6:cf:2\ncell:C21:b:::2::l:1:f:10\ncell:D21:b:::2::l:3:f:6:cf:2\ncell:E21:b:::2::l:1:f:10\ncell:F21:b:::2::l:1:f:10\ncell:G21:b::2:::l:3:f:10\ncell:A22:b::2:::l:3:f:10\ncell:B22:b::2::2:l:3:f:10\ncell:C22:t:Description:b:1::1:1:f:9:cf:1:colspan:3\ncell:D22:t:Description:b:1::1::l:3:f:6:cf:2:colspan:2:rowspan:1\ncell:E22:t::b:2:2:2::l:1:f:10\ncell:F22:t:Amount:b:1:1:1:1:f:9:cf:1\ncell:G22:b::2::2:l:3:f:10\ncell:A23:b::2:::l:3:f:10\ncell:B23:b::2::2:l:3:f:10\ncell:C23:b:1:1::1:f:2:cf:2:colspan:3\ncell:D23:b:1:1:::l:3:f:10:cf:2:colspan:2:rowspan:1\ncell:E23:t::b:2:2:2::l:1:f:10\ncell:F23:b:1:1:::f:2:ntvf:1\ncell:G23:b::2::2:l:3:f:10\ncell:A24:b::2:::l:3:f:10\ncell:B24:b::2::2:l:3:f:10:cf:2\ncell:C24:b::1::1:f:2:cf:2:colspan:3\ncell:D24:b::1:::l:1:f:10:colspan:2\ncell:E24:l:1:f:10\ncell:F24:b::1:::f:2:ntvf:1\ncell:G24:b::2::2:l:3:f:10\ncell:A25:b::2:::l:3:f:10\ncell:B25:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C25:b::1::1:f:2:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:2:ntvf:1\ncell:G25:b::2::2:l:3:f:10\ncell:A26:b::2:::l:3:f:10\ncell:B26:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C26:b::1::1:f:2:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:2:ntvf:1\ncell:G26:b::2::2:l:3:f:10\ncell:A27:b::2:::l:3:f:10\ncell:B27:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C27:b::1::1:f:2:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:2:ntvf:1\ncell:G27:b::2::2:l:3:f:10\ncell:A28:b::2:::l:3:f:10\ncell:B28:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C28:b::1::1:f:2:cf:2:colspan:3\ncell:D28:b::1:::colspan:2\ncell:F28:b::1:::f:2:ntvf:1\ncell:G28:b::2::2:l:3:f:10\ncell:A29:b::2:::l:3:f:10\ncell:B29:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C29:b::1::1:f:2:cf:2:colspan:3\ncell:D29:b::1:::colspan:2\ncell:F29:b::1:::f:2:ntvf:1\ncell:G29:b::2::2:l:3:f:10\ncell:A30:b::2:::l:3:f:10\ncell:B30:b::2::2:l:3:f:10:cf:2\ncell:C30:b::1::1:f:2:cf:2:colspan:3\ncell:D30:b::1:::colspan:2\ncell:F30:b::1:::f:2:ntvf:1\ncell:G30:b::2::2:l:3:f:10\ncell:A31:b::2:::l:3:f:10\ncell:B31:b::2::2:l:3:f:10:cf:2\ncell:C31:b::1::1:f:2:cf:2:colspan:3\ncell:D31:b::1:::colspan:2\ncell:F31:b::1:::f:2:ntvf:1\ncell:G31:b::2::2:l:3:f:10\ncell:A32:b::2:::l:3:f:10\ncell:B32:b::2::2:l:3:f:10:cf:2\ncell:C32:b::1::1:f:2:cf:2:colspan:3\ncell:D32:b::1:::colspan:2\ncell:F32:b::1:::f:2:ntvf:1\ncell:G32:b::2::2:l:3:f:10\ncell:A33:b::2:::l:3:f:10\ncell:B33:b::2::2:l:3:f:10:cf:2\ncell:C33:b::1::1:f:2:cf:2:colspan:3\ncell:D33:b::1:::colspan:2\ncell:F33:b::1:::f:2:ntvf:1\ncell:G33:b::2::2:l:3:f:10\ncell:A34:b::2:::l:3:f:10\ncell:B34:b::2::2:l:3:f:10:cf:2\ncell:C34:b::1::1:f:2:cf:2:colspan:3\ncell:D34:b::1:::colspan:2\ncell:F34:b::1:::f:2:ntvf:1\ncell:G34:b::2::2:l:3:f:10\ncell:A35:b::2:::l:3:f:7\ncell:B35:b::2::2:l:3:f:10:cf:2\ncell:C35:b::1:1:1:f:2:cf:2:colspan:3\ncell:D35:b::1:1::l:3:f:10:cf:2:colspan:2\ncell:E35:b:::2::l:3:f:10:cf:2\ncell:F35:b::1:1::f:2:ntvf:1\ncell:G35:b::2::2:l:3:f:10\ncell:A36:b::2:::l:3:f:6\ncell:B36:b::2::2:l:3:f:6\ncell:C36:t:TOTAL:b:1:1:1:1:f:11:cf:2:colspan:3\ncell:D36:b:2::2::l:3:f:12:cf:2\ncell:E36:b:2:2:2::l:3:f:12:cf:2\ncell:F36:vtf:n:0:SUM(F23\\cF35):b:1:1:1::f:11:ntvf:1\ncell:G36:b::2::2:l:3:f:7\ncell:A37:b::2:::l:3:f:10\ncell:B37:b::::2:l:3:f:6:cf:2\ncell:C37:b:2::::l:1:f:10\ncell:D37:b:2::::l:1:f:10\ncell:E37:b:2::::l:1:f:10\ncell:F37:b:2::::l:1:f:10\ncell:G37:b::2:::l:3:f:6\ncell:A38:b::2:::l:3:f:10\ncell:B38:b::::2:l:3:f:10\ncell:G38:b::2:::l:3:f:10\ncell:A39:b::2:::l:3:f:10\ncell:B39:b::::2:l:3:f:10:cf:2\ncell:C39:t:Thank you for your business:f:4:cf:1:colspan:4\ncell:D39:t:Thank you for your business:colspan:3\ncell:E39:t:Thank you for your business:f:3:colspan:2\ncell:F39:t::l:2:f:10\ncell:G39:b::2:::l:3:f:10\ncell:A40:b::2:::l:3:f:10\ncell:B40:b::::2:l:3:f:10\ncell:G40:b::2:::l:3:f:10\ncell:A41:b::2:::l:3:f:10\ncell:B41:b:::2:2:l:3:f:10\ncell:C41:b:::2::l:3:f:10\ncell:D41:b:::2::l:3:f:10\ncell:E41:b:::2::l:3:f:10\ncell:F41:b:::2::l:3:f:10\ncell:G41:b::2:2::l:3:f:10\ncell:B42:b:1:::\ncell:C42:b:1:::\ncell:D42:b:1:::\ncell:E42:b:1:::\ncell:F42:b:1:::\ncell:G42:b:1:::\ncol:A:w:10\ncol:B:w:10\ncol:C:w:62\ncol:D:w:73\ncol:E:w:15\ncol:F:w:68\ncol:G:w:10\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:15.75\nrow:36:h:15.75\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nsheet:c:7:r:42:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:* 9pt Trebuchet MS\nfont:3:italic bold * Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Arial\nfont:7:normal bold 12pt Arial\nfont:8:normal normal * *\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 11pt Trebuchet MS\nfont:12:normal normal 12pt Arial\nfont:13:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nlayout:4:padding:* * * 4px;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv1", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - "version:1.5\ncell:B2:t:INVOICE:l:1:f:9:cf:1:colspan:6\ncell:C2:t::l:2:f:13\ncell:D2:t::l:2:f:13\ncell:E2:l:1:f:10:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:8:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:13\ncell:B3:f:6:cf:2:colspan:4\ncell:C3:t::l:2:f:13\ncell:D3:t::l:2:f:13\ncell:F3:l:1:f:7:cf:2\ncell:G3:l:1:f:14:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:14:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:14:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:3:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:7:cf:2:colspan:2\ncell:G5:l:1:f:14:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:7:cf:2:colspan:2\ncell:G6:l:1:f:14:cf:2\ncell:B7:t:FROM\\c:f:12\ncell:F7:l:1:f:7:cf:2:tvf:4:colspan:2:rowspan:6\ncell:G7:l:1:f:14:cf:2\ncell:B8:t:[Company Name]:f:3:colspan:4\ncell:F8:l:1:f:7:cf:2:colspan:2\ncell:G8:l:1:f:14:cf:2\ncell:B9:t:[Street Address]:f:1:cf:2:colspan:4\ncell:F9:l:1:f:7\ncell:G9:l:1:f:14:cf:1\ncell:B10:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:G10:l:1:f:13\ncell:B11:t:Phone\\c :f:1:cf:2:colspan:4\ncell:B12:t:Email\\c:f:1:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:11:cf:2\ncell:B15:t:[Name]:f:1:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:1:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:1:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:1:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:1:cf:2:colspan:6\ncell:B20:t:Email\\c:f:1:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:14:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:13\ncell:D22:t::l:2:f:13\ncell:E22:t::l:2:f:13\ncell:F22:t::l:2:f:13\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:14:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:b:1:1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:4\ncell:D23:t::l:2:f:4\ncell:E23:t::l:2:f:4\ncell:F23:t::b::2:::l:1:f:4\ncell:G23:b::1::1:f:4:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:4\ncell:D24:t::l:2:f:4\ncell:E24:t::l:2:f:4\ncell:F24:t::b::2:::l:1:f:4\ncell:G24:b::1::1:f:4:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:4\ncell:D25:t::l:2:f:4\ncell:E25:t::l:2:f:4\ncell:F25:t::b::2:::l:1:f:4\ncell:G25:b::1::1:f:4:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:4\ncell:D26:t::l:2:f:4\ncell:E26:t::l:2:f:4\ncell:F26:t::b::2:::l:1:f:4\ncell:G26:b::1::1:f:4:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:4\ncell:D27:t::l:2:f:4\ncell:E27:t::l:2:f:4\ncell:F27:t::b::2:::l:1:f:4\ncell:G27:b::1::1:f:4:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:4\ncell:D28:t::l:2:f:4\ncell:E28:t::l:2:f:4\ncell:F28:t::b::2:::l:1:f:4\ncell:G28:b::1::1:f:4:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:4\ncell:D29:t::l:2:f:4\ncell:E29:t::l:2:f:4\ncell:F29:t::b::2:::l:1:f:4\ncell:G29:b::1::1:f:4:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:4\ncell:D30:t::l:2:f:4\ncell:E30:t::l:2:f:4\ncell:F30:t::b::2:::l:1:f:4\ncell:G30:b::1::1:f:4:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:4\ncell:D31:t::l:2:f:4\ncell:E31:t::l:2:f:4\ncell:F31:t::b::2:::l:1:f:4\ncell:G31:b::1::1:f:4:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:4\ncell:D32:t::l:2:f:4\ncell:E32:t::l:2:f:4\ncell:F32:t::b::2:::l:1:f:4\ncell:G32:b::1::1:f:4:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C33:t::l:2:f:4\ncell:D33:t::l:2:f:4\ncell:E33:t::l:2:f:4\ncell:F33:t::b::2:::l:1:f:4\ncell:G33:b::1::1:f:4:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C34:l:2:f:4\ncell:D34:l:2:f:4\ncell:E34:l:2:f:4\ncell:F34:b::2:::l:1:f:4\ncell:G34:b::1::1:f:4:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:f:4:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:4\ncell:D35:t::b:::2::l:1:f:4\ncell:E35:t::b:::2::l:1:f:4\ncell:F35:t::b::2:2::l:1:f:4\ncell:G35:b::1:1:1:f:4:ntvf:1\ncell:B36:b:2::::l:1:f:13\ncell:C36:b:2::::l:1:f:13\ncell:D36:b:2::::l:1:f:13\ncell:E36:b:2::::l:1:f:14\ncell:F36:t:Subtotal:b:2::::l:1:f:11\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:11:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:14:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:13\ncell:D37:t::b:::2::l:1:f:13\ncell:F37:t:Tax Rate:l:1:f:11\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:13\ncell:D38:t::b:2::::l:1:f:13\ncell:F38:t:Tax:l:1:f:11\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:13\ncell:D39:t::l:2:f:13\ncell:F39:t:Other:b:::1::l:1:f:11\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:13\ncell:D40:t::l:2:f:13\ncell:F40:t:TOTAL:b:1::::l:1:f:14\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:11:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:5:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:13\ncell:D43:t::l:2:f:13\ncell:E43:t::l:2:f:13\ncell:F43:t::l:2:f:13\ncell:G43:t::l:2:f:13\ncol:A:w:10\ncol:B:w:90\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:45\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 10pt Trebuchet MS\nfont:4:* 9pt Trebuchet MS\nfont:5:italic bold 10pt Trebuchet MS\nfont:6:italic normal * Trebuchet MS\nfont:7:normal bold 10pt Trebuchet MS\nfont:8:normal bold 14pt Trebuchet MS\nfont:9:normal bold 16pt Trebuchet MS\nfont:10:normal bold 28pt Trebuchet MS\nfont:11:normal normal * Trebuchet MS\nfont:12:normal normal 10pt *\nfont:13:normal normal 10pt Arial\nfont:14:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv2", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - 'version:1.5\ncell:B2:t:INVOICE:l:1:f:12:cf:1:colspan:6\ncell:C2:t::l:2:f:10\ncell:D2:t::l:2:f:10\ncell:E2:l:1:f:8:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:10\ncell:B3:f:5:cf:2:colspan:4\ncell:C3:t::l:2:f:10\ncell:D3:t::l:2:f:10\ncell:F3:l:1:f:6:cf:2\ncell:G3:l:1:f:11:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:11:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:11:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:9:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:6:cf:2:colspan:2\ncell:G5:l:1:f:11:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:6:cf:2:colspan:2\ncell:G6:l:1:f:11:cf:2\ncell:B7:t:FROM\\c:f:11\ncell:F7:l:1:f:6:cf:2:colspan:2\ncell:G7:l:1:f:11:cf:2\ncell:B8:t:[Company Name]:f:9:colspan:4\ncell:F8:l:1:f:6:cf:2:tvf:4:colspan:2:rowspan:5\ncell:G8:l:1:f:11:cf:2\ncell:B9:t:[Street Address]:f:9:cf:2:colspan:4\ncell:F9:l:1:f:6\ncell:G9:l:1:f:11:cf:1\ncell:B10:t:[City, State, Zip]:f:9:cf:2:colspan:4\ncell:G10:l:1:f:10\ncell:B11:t:Phone\\c :f:9:cf:2:colspan:4\ncell:B12:t:Email\\c:f:9:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:9:cf:2\ncell:B15:t:[Name]:f:9:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:9:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:9:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:9:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:9:cf:2:colspan:6\ncell:B20:t:Email\\c:f:9:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:11:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:10\ncell:D22:t::l:2:f:10\ncell:E22:t::l:2:f:10\ncell:F22:t::l:2:f:10\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:11:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), sheet7!B6, inv3!B6)):b:1:1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:3\ncell:D23:t::l:2:f:3\ncell:E23:t::l:2:f:3\ncell:F23:t::b::2:::l:1:f:3\ncell:G23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), (sheet7!E6*sheet7!F6), (inv3!E6*inv3!F6))):b::1::1:f:3:ntvf:1\ncell:A24:b::1::\ncell:B24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), SHEET7!B7, INV3!B7)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:3\ncell:D24:t::l:2:f:3\ncell:E24:t::l:2:f:3\ncell:F24:t::b::2:::l:1:f:3\ncell:G24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), (SHEET7!E7*SHEET7!F7), (INV3!E7*INV3!F7))):b::1::1:f:3:ntvf:1\ncell:A25:b::1::\ncell:B25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), SHEET7!B8, INV3!B8)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:3\ncell:D25:t::l:2:f:3\ncell:E25:t::l:2:f:3\ncell:F25:t::b::2:::l:1:f:3\ncell:G25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), (SHEET7!E8*SHEET7!F8), (INV3!E8*INV3!F8))):b::1::1:f:3:ntvf:1\ncell:A26:b::1::\ncell:B26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), SHEET7!B9, INV3!B9)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:3\ncell:D26:t::l:2:f:3\ncell:E26:t::l:2:f:3\ncell:F26:t::b::2:::l:1:f:3\ncell:G26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), (SHEET7!E9*SHEET7!F9), (INV3!E9*INV3!F9))):b::1::1:f:3:ntvf:1\ncell:A27:b::1::\ncell:B27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), SHEET7!B10, INV3!B10)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:3\ncell:D27:t::l:2:f:3\ncell:E27:t::l:2:f:3\ncell:F27:t::b::2:::l:1:f:3\ncell:G27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), (SHEET7!E10*SHEET7!F10), (INV3!E10*INV3!F10))):b::1::1:f:3:ntvf:1\ncell:A28:b::1::\ncell:B28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), SHEET7!B11, INV3!B11)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:3\ncell:D28:t::l:2:f:3\ncell:E28:t::l:2:f:3\ncell:F28:t::b::2:::l:1:f:3\ncell:G28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), (SHEET7!E11*SHEET7!F11), (INV3!E11*INV3!F11))):b::1::1:f:3:ntvf:1\ncell:A29:b::1::\ncell:B29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), SHEET7!B12, INV3!B12)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:3\ncell:D29:t::l:2:f:3\ncell:E29:t::l:2:f:3\ncell:F29:t::b::2:::l:1:f:3\ncell:G29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), (SHEET7!E12*SHEET7!F12), (INV3!E12*INV3!F12))):b::1::1:f:3:ntvf:1\ncell:A30:b::1::\ncell:B30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), SHEET7!B13, INV3!B13)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:3\ncell:D30:t::l:2:f:3\ncell:E30:t::l:2:f:3\ncell:F30:t::b::2:::l:1:f:3\ncell:G30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), (SHEET7!E13*SHEET7!F13), (INV3!E13*INV3!F13))):b::1::1:f:3:ntvf:1\ncell:A31:b::1::\ncell:B31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), SHEET7!B14, INV3!B14)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:3\ncell:D31:t::l:2:f:3\ncell:E31:t::l:2:f:3\ncell:F31:t::b::2:::l:1:f:3\ncell:G31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), (SHEET7!E14*SHEET7!F14), (INV3!E14*INV3!F14))):b::1::1:f:3:ntvf:1\ncell:A32:b::1::\ncell:B32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), SHEET7!B15, INV3!B15)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:3\ncell:D32:t::l:2:f:3\ncell:E32:t::l:2:f:3\ncell:F32:t::b::2:::l:1:f:3\ncell:G32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), (SHEET7!E15*SHEET7!F15), (INV3!E15*INV3!F15))):b::1::1:f:3:ntvf:1\ncell:A33:b::1::\ncell:B33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), SHEET7!B16, INV3!B16)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C33:l:2:f:3\ncell:D33:l:2:f:3\ncell:E33:l:2:f:3\ncell:F33:b::2:::l:1:f:3\ncell:G33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), (SHEET7!E16*SHEET7!F16), (INV3!E16*INV3!F16))):b::1::1:f:3:ntvf:1\ncell:A34:b::1::\ncell:B34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), SHEET7!B17, INV3!B17)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C34:t::l:2:f:3\ncell:D34:t::l:2:f:3\ncell:E34:t::l:2:f:3\ncell:F34:t::b::2:::l:1:f:3\ncell:G34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), (SHEET7!E17*SHEET7!F17), (INV3!E17*INV3!F17))):b::1::1:f:3:ntvf:1\ncell:A35:b::1::\ncell:B35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), SHEET7!B18, INV3!B18)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:3\ncell:D35:t::b:::2::l:1:f:3\ncell:E35:t::b:::2::l:1:f:3\ncell:F35:t::b::2:2::l:1:f:3\ncell:G35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), (SHEET7!E18*SHEET7!F18), (INV3!E18*INV3!F18))):b::1::1:f:3:ntvf:1\ncell:B36:b:2::::l:1:f:10\ncell:C36:b:2::::l:1:f:10\ncell:D36:b:2::::l:1:f:10\ncell:E36:b:2::::l:1:f:11\ncell:F36:t:Subtotal:b:2::::l:1:f:9\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:9:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:11:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:10\ncell:D37:t::b:::2::l:1:f:10\ncell:F37:t:Tax Rate:l:1:f:9\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:10\ncell:D38:t::b:2::::l:1:f:10\ncell:F38:t:Tax:l:1:f:9\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:10\ncell:D39:t::l:2:f:10\ncell:F39:t:Other:b:::1::l:1:f:9\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:10\ncell:D40:t::l:2:f:10\ncell:F40:t:TOTAL:b:1::::l:1:f:11\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:9:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:4:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:10\ncell:D43:t::l:2:f:10\ncell:E43:t::l:2:f:10\ncell:F43:t::l:2:f:10\ncell:G43:t::l:2:f:10\ncol:A:w:10\ncol:B:w:65\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:53\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 9pt Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:italic normal * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 14pt Trebuchet MS\nfont:8:normal bold 28pt Trebuchet MS\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 10pt Trebuchet MS\nfont:12:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "sheet6", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Hours:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Rate:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "inv3", - hidden: "0", - }, - sheet5: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Qty.:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Price:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "sheet7", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "inv1!B2": true, - "inv1!C5": true, - "inv1!C6": true, - "inv1!C7": true, - "inv1!C8": true, - "inv1!C9": true, - "inv1!C11": true, - "inv1!C12": true, - "inv1!C13": true, - "inv1!C14": true, - "inv1!C15": true, - "inv1!C16": true, - "inv1!C18": true, - "inv1!C20": true, - "inv1!D20": true, - "inv1!C23": true, - "inv1!C24": true, - "inv1!C25": true, - "inv1!C26": true, - "inv1!C27": true, - "inv1!C28": true, - "inv1!C29": true, - "inv1!C30": true, - "inv1!C31": true, - "inv1!C32": true, - "inv1!C33": true, - "inv1!C34": true, - "inv1!C35": true, - "inv1!F23": true, - "inv1!F24": true, - "inv1!F25": true, - "inv1!F26": true, - "inv1!F27": true, - "inv1!F28": true, - "inv1!F29": true, - "inv1!F30": true, - "inv1!F31": true, - "inv1!F32": true, - "inv1!F33": true, - "inv1!F34": true, - "inv1!F35": true, - "inv2!B2": true, - "inv2!F4": true, - "inv2!G4": true, - "inv2!B5": true, - "inv2!B7": true, - "inv2!B8": true, - "inv2!B9": true, - "inv2!B10": true, - "inv2!B11": true, - "inv2!B12": true, - "inv2!B14": true, - "inv2!B15": true, - "inv2!B16": true, - "inv2!B17": true, - "inv2!B18": true, - "inv2!B19": true, - "inv2!B20": true, - "inv2!B23": true, - "inv2!B24": true, - "inv2!B25": true, - "inv2!B26": true, - "inv2!B27": true, - "inv2!B28": true, - "inv2!B29": true, - "inv2!B30": true, - "inv2!B31": true, - "inv2!B32": true, - "inv2!B33": true, - "inv2!B34": true, - "inv2!B35": true, - "inv2!G23": true, - "inv2!G24": true, - "inv2!G25": true, - "inv2!G26": true, - "inv2!G27": true, - "inv2!G28": true, - "inv2!G29": true, - "inv2!G30": true, - "inv2!G31": true, - "inv2!G32": true, - "inv2!G33": true, - "inv2!G34": true, - "inv2!G35": true, - "inv2!B38": true, - "inv2!B39": true, - "inv2!B40": true, - "inv2!F36": true, - "inv2!G37": true, - "inv2!F37": true, - "inv2!F39": true, - "inv2!G39": true, - "inv2!F38": true, - "sheet6!B2": true, - "sheet6!F4": true, - "sheet6!G4": true, - "sheet6!B5": true, - "sheet6!B7": true, - "sheet6!B8": true, - "sheet6!B9": true, - "sheet6!B10": true, - "sheet6!B11": true, - "sheet6!B12": true, - "sheet6!B14": true, - "sheet6!B15": true, - "sheet6!B16": true, - "sheet6!B17": true, - "sheet6!B18": true, - "sheet6!B19": true, - "sheet6!B20": true, - "sheet6!B38": true, - "sheet6!B39": true, - "sheet6!B40": true, - "sheet6!F36": true, - "sheet6!G37": true, - "sheet6!F37": true, - "sheet6!F39": true, - "sheet6!G39": true, - "sheet6!F38": true, - "inv3!B2": true, - "inv3!B6": true, - "inv3!B7": true, - "inv3!B8": true, - "inv3!B9": true, - "inv3!B10": true, - "inv3!B11": true, - "inv3!B12": true, - "inv3!B13": true, - "inv3!B14": true, - "inv3!B15": true, - "inv3!B16": true, - "inv3!B17": true, - "inv3!B18": true, - "inv3!E6": true, - "inv3!E7": true, - "inv3!E8": true, - "inv3!E9": true, - "inv3!E10": true, - "inv3!E11": true, - "inv3!E12": true, - "inv3!E13": true, - "inv3!E14": true, - "inv3!E15": true, - "inv3!E16": true, - "inv3!E17": true, - "inv3!E18": true, - "inv3!F6": true, - "inv3!F7": true, - "inv3!F8": true, - "inv3!F9": true, - "inv3!F10": true, - "inv3!F11": true, - "inv3!F12": true, - "inv3!F13": true, - "inv3!F14": true, - "inv3!F15": true, - "inv3!F16": true, - "inv3!F17": true, - "inv3!F18": true, - "sheet7!F6": true, - "sheet7!F7": true, - "sheet7!F8": true, - "sheet7!F9": true, - "sheet7!F10": true, - "sheet7!F11": true, - "sheet7!F12": true, - "sheet7!F13": true, - "sheet7!F14": true, - "sheet7!F15": true, - "sheet7!F16": true, - "sheet7!F17": true, - "sheet7!F18": true, - "sheet7!E6": true, - "sheet7!E7": true, - "sheet7!E8": true, - "sheet7!E9": true, - "sheet7!E10": true, - "sheet7!E11": true, - "sheet7!E12": true, - "sheet7!E13": true, - "sheet7!E14": true, - "sheet7!E15": true, - "sheet7!E16": true, - "sheet7!E17": true, - "sheet7!E18": true, - "sheet7!B6": true, - "sheet7!B2": true, - "sheet7!B7": true, - "sheet7!B8": true, - "sheet7!B9": true, - "sheet7!B10": true, - "sheet7!B11": true, - "sheet7!B12": true, - "sheet7!B13": true, - "sheet7!B14": true, - "sheet7!B15": true, - "sheet7!B16": true, - "sheet7!B17": true, - "sheet7!B18": true, - "inv1!D8": true, - "inv1!D15": true, - "inv1!D18": true, - "inv2!C5": true, - "sheet6!C5": true, - }, - constraints: { - "inv1!C5": ["prompttext", "0", "1e10", "Name"], - "inv1!C6": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C7": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C8": ["prompttext", "0", "1e10", "Phone"], - "inv1!C9": ["promptemail", "0", "1e10", "Email"], - "inv1!C11": ["prompttext", "0", "1e10", "From"], - "inv1!C12": ["prompttext", "0", "1e10", "Name"], - "inv1!C13": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C14": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C15": ["prompttext", "0", "1e10", "Phone"], - "inv1!C16": ["promptemail", "0", "1e10", "Email"], - "inv1!C18": ["prompttext", "0", "1e10", "Invoice #"], - "inv1!C20": ["prompttext", "0", "1e10", "Date"], - "inv1!D20": ["prompttext", "0", "1e10", "Date"], - "inv1!C23": ["prompttext", "0", "1e10", "Description"], - "inv1!C24": ["prompttext", "0", "1e10", "Description"], - "inv1!C25": ["prompttext", "0", "1e10", "Description"], - "inv1!C26": ["prompttext", "0", "1e10", "Description"], - "inv1!C27": ["prompttext", "0", "1e10", "Description"], - "inv1!C28": ["prompttext", "0", "1e10", "Description"], - "inv1!C29": ["prompttext", "0", "1e10", "Description"], - "inv1!C30": ["prompttext", "0", "1e10", "Description"], - "inv1!C31": ["prompttext", "0", "1e10", "Description"], - "inv1!C32": ["prompttext", "0", "1e10", "Description"], - "inv1!C33": ["prompttext", "0", "1e10", "Description"], - "inv1!C34": ["prompttext", "0", "1e10", "Description"], - "inv1!C35": ["prompttext", "0", "1e10", "Description"], - "inv1!F23": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F24": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F25": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F26": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F27": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F28": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F29": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F30": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F31": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F32": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F33": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F34": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B2": ["prompttext", "0", "1e10", "Invoice"], - "inv2!F4": ["prompttext", "0", "1e10", "Date"], - "inv2!G4": ["prompttext", "0", "1e10", "Date"], - "inv2!B5": ["prompttext", "0", "1e10", "Invoice #"], - "inv2!B7": ["prompttext", "0", "1e10", "From"], - "inv2!B8": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B9": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B11": ["prompttext", "0", "1e10", "Phone"], - "inv2!B12": ["promptemail", "0", "1e10", "Email"], - "inv2!B14": ["prompttext", "0", "1e10", "Bill To"], - "inv2!B15": ["prompttext", "0", "1e10", "Name"], - "inv2!B16": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B17": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B19": ["prompttext", "0", "1e10", "Phone"], - "inv2!B20": ["promptemail", "0", "1e10", "Email"], - "inv2!B23": ["prompttext", "0", "1e10", "Description"], - "inv2!B24": ["prompttext", "0", "1e10", "Description"], - "inv2!B25": ["prompttext", "0", "1e10", "Description"], - "inv2!B26": ["prompttext", "0", "1e10", "Description"], - "inv2!B27": ["prompttext", "0", "1e10", "Description"], - "inv2!B28": ["prompttext", "0", "1e10", "Description"], - "inv2!B29": ["prompttext", "0", "1e10", "Description"], - "inv2!B30": ["prompttext", "0", "1e10", "Description"], - "inv2!B31": ["prompttext", "0", "1e10", "Description"], - "inv2!B32": ["prompttext", "0", "1e10", "Description"], - "inv2!B33": ["prompttext", "0", "1e10", "Description"], - "inv2!B34": ["prompttext", "0", "1e10", "Description"], - "inv2!B35": ["prompttext", "0", "1e10", "Description"], - "inv2!G23": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G24": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G25": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G26": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G27": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G28": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G29": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G30": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G31": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G32": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G33": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G34": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B38": ["prompttext", "0", "1e10", "Notes"], - "inv2!B39": ["prompttext", "0", "1e10", "Notes"], - "inv2!B40": ["prompttext", "0", "1e10", "Notes"], - "inv2!F36": ["prompttext", "0", "1e10", "Subtotal"], - "inv2!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "inv2!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "inv2!F39": ["prompttext", "0", "1e10", "Other"], - "inv2!G39": ["promptdecimal", "0", "1e10", "Other"], - "inv2!F38": ["prompttext", "0", "1e10", "Tax"], - "sheet6!B2": ["prompttext", "0", "1e10", "Invoice"], - "sheet6!F4": ["prompttext", "0", "1e10", "Date"], - "sheet6!G4": ["prompttext", "0", "1e10", "Date"], - "sheet6!B5": ["prompttext", "0", "1e10", "Invoice #"], - "sheet6!B7": ["prompttext", "0", "1e10", "From"], - "sheet6!B8": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B9": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B11": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B12": ["promptemail", "0", "1e10", "Email"], - "sheet6!B14": ["prompttext", "0", "1e10", "Bill To"], - "sheet6!B15": ["prompttext", "0", "1e10", "Name"], - "sheet6!B16": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B17": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B19": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B20": ["promptemail", "0", "1e10", "Email"], - "sheet6!B38": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B39": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B40": ["prompttext", "0", "1e10", "Notes"], - "sheet6!F36": ["prompttext", "0", "1e10", "Subtotal"], - "sheet6!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "sheet6!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "sheet6!F39": ["prompttext", "0", "1e10", "Other"], - "sheet6!G39": ["promptdecimal", "0", "1e10", "Other"], - "sheet6!F38": ["prompttext", "0", "1e10", "Tax"], - "inv3!B6": ["prompttext", "0", "1e10", "Description"], - "inv3!B7": ["prompttext", "0", "1e10", "Description"], - "inv3!B8": ["prompttext", "0", "1e10", "Description"], - "inv3!B9": ["prompttext", "0", "1e10", "Description"], - "inv3!B10": ["prompttext", "0", "1e10", "Description"], - "inv3!B11": ["prompttext", "0", "1e10", "Description"], - "inv3!B12": ["prompttext", "0", "1e10", "Description"], - "inv3!B13": ["prompttext", "0", "1e10", "Description"], - "inv3!B14": ["prompttext", "0", "1e10", "Description"], - "inv3!B15": ["prompttext", "0", "1e10", "Description"], - "inv3!B16": ["prompttext", "0", "1e10", "Description"], - "inv3!B17": ["prompttext", "0", "1e10", "Description"], - "inv3!B18": ["prompttext", "0", "1e10", "Description"], - "sheet7!B6": ["prompttext", "0", "1e10", "Description"], - "sheet7!B7": ["prompttext", "0", "1e10", "Description"], - "sheet7!B8": ["prompttext", "0", "1e10", "Description"], - "sheet7!B9": ["prompttext", "0", "1e10", "Description"], - "sheet7!B10": ["prompttext", "0", "1e10", "Description"], - "sheet7!B11": ["prompttext", "0", "1e10", "Description"], - "sheet7!B12": ["prompttext", "0", "1e10", "Description"], - "sheet7!B13": ["prompttext", "0", "1e10", "Description"], - "sheet7!B14": ["prompttext", "0", "1e10", "Description"], - "sheet7!B15": ["prompttext", "0", "1e10", "Description"], - "sheet7!B16": ["prompttext", "0", "1e10", "Description"], - "sheet7!B17": ["prompttext", "0", "1e10", "Description"], - "sheet7!B18": ["prompttext", "0", "1e10", "Description"], - "inv1!D8": ["prompttext", "0", "1e10", "Phone"], - "inv1!D15": ["prompttext", "0", "1e10", "Phone"], - "inv1!D18": ["promptnumeric", "0", "1e10", "Invoice#"], - "inv2!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet6!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet7!E6": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E7": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E8": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E9": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E10": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E11": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E12": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E13": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E14": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E15": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E16": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E17": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E18": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!F6": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F7": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F8": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F9": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F10": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F11": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F12": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F13": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F14": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F15": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F16": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F17": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F18": ["promptdecimal", "0", "1e10", "Price"], - "inv3!E6": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E7": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E8": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E9": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E10": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E11": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E12": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E13": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E14": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E15": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E16": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E17": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E18": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!F6": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F7": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F8": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F9": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F10": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F11": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F12": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F13": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F14": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F15": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F16": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F17": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F18": ["promptdecimal", "0", "1e10", "Rate"], - }, - }, - }, - footers: [ - { name: "Type1", index: 1, isActive: true }, - { name: "Type2", index: 2, isActive: false }, - { name: "Type3", index: 3, isActive: false }, - { name: "Detail1", index: 4, isActive: false }, - { name: "Detail2", index: 5, isActive: false }, - ], - }, - }, - home: { - iPad: { - msc: { - numsheets: 4, - currentid: "sheet1", - currentname: "typei", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE:b:1:1:1:1:f:6:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:t::b:2::2::l:1:f:7\ncell:G2:t::b:2::2::l:1:f:7\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2:::2:l:3:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:2::::l:1:f:7\ncell:G3:b:2:2:::l:3:f:7\ncell:A4:b::2:::l:3:f:7\ncell:B4:b::::2:l:3:f:3\ncell:C4:t:INVOICE # \\c:f:2:cf:2\ncell:D4:v:1:f:2:cf:2\ncell:F4:tvf:4:rowspan:4\ncell:G4:b::2:::l:3:f:7\ncell:A5:b::2:::l:3:f:7\ncell:B5:b::::2:l:3:f:4\ncell:F5:t::l:2:f:7\ncell:G5:t::b::1:::l:2:f:7\ncell:A6:b::2:::l:3:f:7\ncell:B6:b::::2:l:3:f:4\ncell:C6:t:INVOICE DATE\\c:f:2:cf:2\ncell:D6:f:2:cf:2:ntvf:3\ncell:F6:l:2:f:7\ncell:G6:b::1:::l:2:f:7\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::::2:l:3:f:4\ncell:G7:b::2:::l:3:f:7\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::::2:l:3:f:4\ncell:G8:b::2:::l:3:f:7\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::::2:l:3:f:4\ncell:C9:t:BILL TO\\c:l:3:f:2\ncell:E9:t:FROM\\c:f:2:cf:2\ncell:G9:b::2:::l:3:f:7\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::::2:l:3:f:3\ncell:C10:t:[Name]:f:1:cf:2:colspan:2\ncell:E10:t:[Name]:f:1:cf:2:colspan:2\ncell:G10:b::2:::l:3:f:7\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:E11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:G11:b::2:::l:3:f:7\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:E12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:G12:b::2:::l:3:f:7\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:Phone\\c:f:1:cf:2:colspan:2\ncell:E13:t:Phone\\c:f:1:cf:2:colspan:2\ncell:G13:b::2:::l:3:f:7\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::::2:l:3:f:3:cf:2\ncell:C14:b:::2::l:1:f:7\ncell:D14:b:::2::l:3:f:3:cf:2\ncell:E14:b:::2::l:1:f:7\ncell:F14:b:::2::l:1:f:7\ncell:G14:b::2:::l:3:f:7\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::2::2:l:3:f:7\ncell:C15:t:Description:b:1::1:1:f:2:cf:1:colspan:3\ncell:D15:t:Description:b:1::1::l:3:f:3:cf:2:colspan:2:rowspan:1\ncell:E15:t::b:2:2:2::l:1:f:7\ncell:F15:t:Amount:b:1:1:1:1:f:2:cf:1\ncell:G15:b::2::2:l:3:f:7\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::2::2:l:3:f:7\ncell:C16:b:1:1::1:f:1:cf:2:colspan:3\ncell:D16:b:1:1:::l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:E16:t::b:2:2:2::l:1:f:7\ncell:F16:b:1:1:::f:1:ntvf:1\ncell:G16:b::2::2:l:3:f:7\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::2::2:l:3:f:7:cf:2\ncell:C17:b::1::1:f:1:cf:2:colspan:3\ncell:D17:b::1:::l:1:f:7:colspan:2\ncell:E17:l:1:f:7\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::2::2:l:3:f:7\ncell:A18:b::2:::l:3:f:7\ncell:B18:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C18:b::1::1:f:1:cf:2:colspan:3\ncell:D18:b::1:::colspan:2\ncell:F18:b::1:::f:1:ntvf:1\ncell:G18:b::2::2:l:3:f:7\ncell:A19:b::2:::l:3:f:7\ncell:B19:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C19:b::1::1:f:1:cf:2:colspan:3\ncell:D19:b::1:::colspan:2\ncell:F19:b::1:::f:1:ntvf:1\ncell:G19:b::2::2:l:3:f:7\ncell:A20:b::2:::l:3:f:7\ncell:B20:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C20:b::1::1:f:1:cf:2:colspan:3\ncell:D20:b::1:::colspan:2\ncell:F20:b::1:::f:1:ntvf:1\ncell:G20:b::2::2:l:3:f:7\ncell:A21:b::2:::l:3:f:7\ncell:B21:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C21:b::1::1:f:1:cf:2:colspan:3\ncell:D21:b::1:::colspan:2\ncell:F21:b::1:::f:1:ntvf:1\ncell:G21:b::2::2:l:3:f:7\ncell:A22:b::2:::l:3:f:7\ncell:B22:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C22:b::1::1:f:1:cf:2:colspan:3\ncell:D22:b::1:::colspan:2\ncell:F22:b::1:::f:1:ntvf:1\ncell:G22:b::2::2:l:3:f:7\ncell:A23:b::2:::l:3:f:7\ncell:B23:b::2::2:l:3:f:7:cf:2\ncell:C23:b::1::1:f:1:cf:2:colspan:3\ncell:D23:b::1:::colspan:2\ncell:F23:b::1:::f:1:ntvf:1\ncell:G23:b::2::2:l:3:f:7\ncell:A24:b::2:::l:3:f:7\ncell:B24:b::2::2:l:3:f:7:cf:2\ncell:C24:b::1::1:f:1:cf:2:colspan:3\ncell:D24:b::1:::colspan:2\ncell:F24:b::1:::f:1:ntvf:1\ncell:G24:b::2::2:l:3:f:7\ncell:A25:b::2:::l:3:f:7\ncell:B25:b::2::2:l:3:f:7:cf:2\ncell:C25:b::1::1:f:1:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:1:ntvf:1\ncell:G25:b::2::2:l:3:f:7\ncell:A26:b::2:::l:3:f:7\ncell:B26:b::2::2:l:3:f:7:cf:2\ncell:C26:b::1::1:f:1:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:1:ntvf:1\ncell:G26:b::2::2:l:3:f:7\ncell:A27:b::2:::l:3:f:7\ncell:B27:b::2::2:l:3:f:7:cf:2\ncell:C27:b::1::1:f:1:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:1:ntvf:1\ncell:G27:b::2::2:l:3:f:7\ncell:A28:b::2:::l:3:f:4\ncell:B28:b::2::2:l:3:f:7:cf:2\ncell:C28:b::1:1:1:f:1:cf:2:colspan:3\ncell:D28:b::1:1::l:3:f:7:cf:2:colspan:2\ncell:E28:b:::2::l:3:f:7:cf:2\ncell:F28:b::1:1::f:1:ntvf:1\ncell:G28:b::2::2:l:3:f:7\ncell:A29:b::2:::l:3:f:3\ncell:B29:b::2::2:l:3:f:3\ncell:C29:t:TOTAL:b:1:1:1:1:f:5:cf:2:colspan:3\ncell:D29:b:2::2::l:3:f:8:cf:2\ncell:E29:b:2:2:2::l:3:f:8:cf:2\ncell:F29:vtf:n:0:SUM(F16\\cF28):b:1:1:1::f:5:ntvf:1\ncell:G29:b::2::2:l:3:f:4\ncell:A30:b::2:::l:3:f:7\ncell:B30:b::::2:l:3:f:3:cf:2\ncell:C30:b:2::::l:1:f:7\ncell:D30:b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:7\ncell:F30:b:2::::l:1:f:7\ncell:G30:b::2:::l:3:f:3\ncell:A31:b::2:::l:3:f:7\ncell:B31:b::::2:l:3:f:7\ncell:D31:tvf:4:rowspan:4\ncell:G31:b::2:::l:3:f:7\ncell:A32:b::2:::l:3:f:7\ncell:B32:b::::2:l:3:f:7\ncell:G32:b::2:::l:3:f:7\ncell:A33:b::2:::l:3:f:7\ncell:B33:b::::2:l:3:f:7\ncell:G33:b::2:::l:3:f:7\ncell:A34:b::2:::l:3:f:7\ncell:B34:b::::2:l:3:f:7\ncell:G34:b::2:::l:3:f:7\ncell:A35:b::2:::l:3:f:7\ncell:B35:b:::2:2:l:3:f:7\ncell:C35:b:::2::l:3:f:7\ncell:D35:b:::2::l:3:f:7\ncell:E35:b:::2::l:3:f:7\ncell:F35:b:::2::l:3:f:7\ncell:G35:b::2:2::l:3:f:7\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncell:F36:b:1:::\ncell:G36:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:105\ncol:D:w:182\ncol:E:w:110\ncol:F:w:115\ncol:G:w:65\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:7:r:36:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:normal bold * Trebuchet MS\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 12pt Arial\nfont:5:normal bold 12pt Trebuchet MS\nfont:6:normal bold 14pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "typei", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - 'version:1.5\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE:b:1:1:1:1:l:3:f:6:cf:1:colspan:8\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:t::b:2::2::l:1:f:7\ncell:G2:b:2::2::l:1:f:7\ncell:H2:b:2::2::l:1:f:7\ncell:I2:t::b:2::2::l:1:f:7\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2:::2:l:3:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:2::::l:1:f:7\ncell:G3:b:2::::l:1:f:7\ncell:H3:b:2::::l:1:f:7\ncell:I3:b:2:2:::l:3:f:7\ncell:A4:b::2:::l:3:f:7\ncell:B4:b::::2:l:3:f:3\ncell:C4:t:INVOICE # \\c:f:2:cf:2\ncell:D4:v:1:f:2:cf:2\ncell:F4:tvf:5:colspan:2:rowspan:4\ncell:I4:b::2:::l:3:f:7\ncell:A5:b::2:::l:3:f:7\ncell:B5:b::::2:l:3:f:4\ncell:F5:t::l:2:f:7\ncell:G5:l:2:f:7\ncell:H5:l:2:f:7\ncell:I5:t::b::1:::l:2:f:7\ncell:A6:b::2:::l:3:f:7\ncell:B6:b::::2:l:3:f:4\ncell:C6:t:INVOICE DATE\\c:f:2:cf:2\ncell:D6:f:2:cf:2:ntvf:4\ncell:F6:l:2:f:7\ncell:G6:l:2:f:7\ncell:H6:l:2:f:7\ncell:I6:b::1:::l:2:f:7\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::::2:l:3:f:4\ncell:I7:b::2:::l:3:f:7\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::::2:l:3:f:4\ncell:I8:b::2:::l:3:f:7\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::::2:l:3:f:4\ncell:C9:t:BILL TO\\c:f:2\ncell:E9:t:FROM\\c:f:2:cf:2\ncell:F9:colspan:3\ncell:I9:b::2:::l:3:f:7\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::::2:l:3:f:3\ncell:C10:t:[Name]:f:1:cf:2:colspan:2\ncell:E10:t:[Name]:f:1:cf:2:colspan:4\ncell:I10:b::2:::l:3:f:7\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:E11:t:[Street Address]:f:1:colspan:4\ncell:I11:b::2:::l:3:f:7\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:E12:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:I12:b::2:::l:3:f:7\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:Phone\\c :f:1:cf:2:colspan:2\ncell:E13:t:Phone\\c :f:1:cf:2:colspan:4\ncell:I13:b::2:::l:3:f:7\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::::2:l:3:f:3:cf:2\ncell:C14:b:::2::l:1:f:7\ncell:D14:b:::2::l:3:f:3:cf:2\ncell:E14:b:::2::l:1:f:7\ncell:F14:b:::2::l:1:f:7\ncell:G14:b:::2::l:1:f:7\ncell:H14:b:::2::l:1:f:7\ncell:I14:b::2:::l:3:f:7\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::2::2:l:3:f:7\ncell:C15:t:Description:b:1:1:1:1:f:2:cf:1:colspan:3\ncell:D15:t:Description:b:2::2:2:l:3:f:3:cf:2:colspan:2:rowspan:1\ncell:E15:t::b:2:2:2::l:1:f:7\ncell:F15:t:Hours:b:1:1:1:1:f:2:cf:1\ncell:G15:t:Rate:b:1:1:1:1:f:2:cf:1\ncell:H15:t:Amount:b:1:1:1:1:f:2:cf:1\ncell:I15:b::2::2:l:3:f:7\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::2::2:l:3:f:7\ncell:C16:b:1:1::1:f:1:cf:2:colspan:3\ncell:D16:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:E16:t::b:2:2:2::l:1:f:7\ncell:F16:b:1:1:::f:1:ntvf:1\ncell:G16:b:1:1:::f:1:ntvf:1\ncell:H16:vtf:t::IF(F16*G16>0,F16*G16,""):b:1:1:::f:1:ntvf:1\ncell:I16:b::2::2:l:3:f:7\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::2::2:l:3:f:7:cf:2\ncell:C17:b::1::1:f:1:cf:2:colspan:3\ncell:D17:b::1::1:l:1:f:7:colspan:2\ncell:E17:l:1:f:7\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::1:::f:1:ntvf:1\ncell:H17:vtf:t::IF(F17*G17>0,F17*G17,""):b::1:::f:1:ntvf:1\ncell:I17:b::2::2:l:3:f:7\ncell:A18:b::2:::l:3:f:7\ncell:B18:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C18:b::1::1:f:1:cf:2:colspan:3\ncell:D18:b::1::1:colspan:2\ncell:F18:b::1:::f:1:ntvf:1\ncell:G18:b::1:::f:1:ntvf:1\ncell:H18:vtf:t::IF(F18*G18>0,F18*G18,""):b::1:::f:1:ntvf:1\ncell:I18:b::2::2:l:3:f:7\ncell:A19:b::2:::l:3:f:7\ncell:B19:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C19:b::1::1:f:1:cf:2:colspan:3\ncell:D19:b::1::1:colspan:2\ncell:F19:b::1:::f:1:ntvf:1\ncell:G19:b::1:::f:1:ntvf:1\ncell:H19:vtf:t::IF(F19*G19>0,F19*G19,""):b::1:::f:1:ntvf:1\ncell:I19:b::2::2:l:3:f:7\ncell:A20:b::2:::l:3:f:7\ncell:B20:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C20:b::1::1:f:1:cf:2:colspan:3\ncell:D20:b::1::1:colspan:2\ncell:F20:b::1:::f:1:ntvf:1\ncell:G20:b::1:::f:1:ntvf:1\ncell:H20:vtf:t::IF(F20*G20>0,F20*G20,""):b::1:::f:1:ntvf:1\ncell:I20:b::2::2:l:3:f:7\ncell:A21:b::2:::l:3:f:7\ncell:B21:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C21:b::1::1:f:1:cf:2:colspan:3\ncell:D21:b::1::1:colspan:2\ncell:F21:b::1:::f:1:ntvf:1\ncell:G21:b::1:::f:1:ntvf:1\ncell:H21:vtf:t::IF(F21*G21>0,F21*G21,""):b::1:::f:1:ntvf:1\ncell:I21:b::2::2:l:3:f:7\ncell:A22:b::2:::l:3:f:7\ncell:B22:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C22:b::1::1:f:1:cf:2:colspan:3\ncell:D22:b::1::1:colspan:2\ncell:F22:b::1:::f:1:ntvf:1\ncell:G22:b::1:::f:1:ntvf:1\ncell:H22:vtf:t::IF(F22*G22>0,F22*G22,""):b::1:::f:1:ntvf:1\ncell:I22:b::2::2:l:3:f:7\ncell:A23:b::2:::l:3:f:7\ncell:B23:b::2::2:l:3:f:7:cf:2\ncell:C23:b::1::1:f:1:cf:2:colspan:3\ncell:D23:b::1::1:colspan:2\ncell:F23:b::1:::f:1:ntvf:1\ncell:G23:b::1:::f:1:ntvf:1\ncell:H23:vtf:t::IF(F23*G23>0,F23*G23,""):b::1:::f:1:ntvf:1\ncell:I23:b::2::2:l:3:f:7\ncell:A24:b::2:::l:3:f:7\ncell:B24:b::2::2:l:3:f:7:cf:2\ncell:C24:b::1::1:f:1:cf:2:colspan:3\ncell:D24:b::1::1:colspan:2\ncell:F24:b::1:::f:1:ntvf:1\ncell:G24:b::1:::f:1:ntvf:1\ncell:H24:vtf:t::IF(F24*G24>0,F24*G24,""):b::1:::f:1:ntvf:1\ncell:I24:b::2::2:l:3:f:7\ncell:A25:b::2:::l:3:f:7\ncell:B25:b::2::2:l:3:f:7:cf:2\ncell:C25:b::1::1:f:1:cf:2:colspan:3\ncell:D25:b::1::1:colspan:2\ncell:F25:b::1:::f:1:ntvf:1\ncell:G25:b::1:::f:1:ntvf:1\ncell:H25:vtf:t::IF(F25*G25>0,F25*G25,""):b::1:::f:1:ntvf:1\ncell:I25:b::2::2:l:3:f:7\ncell:A26:b::2:::l:3:f:7\ncell:B26:b::2::2:l:3:f:7:cf:2\ncell:C26:b::1::1:f:1:cf:2:colspan:3\ncell:D26:b::1::1:colspan:2\ncell:F26:b::1:::f:1:ntvf:1\ncell:G26:b::1:::f:1:ntvf:1\ncell:H26:vtf:t::IF(F26*G26>0,F26*G26,""):b::1:::f:1:ntvf:1\ncell:I26:b::2::2:l:3:f:7\ncell:A27:b::2:::l:3:f:7\ncell:B27:b::2::2:l:3:f:7:cf:2\ncell:C27:b::1::1:f:1:cf:2:colspan:3\ncell:D27:b::1::1:colspan:2\ncell:F27:b::1:::f:1:ntvf:1\ncell:G27:b::1:::f:1:ntvf:1\ncell:H27:vtf:t::IF(F27*G27>0,F27*G27,""):b::1:::f:1:ntvf:1\ncell:I27:b::2::2:l:3:f:7\ncell:A28:b::2:::l:3:f:4\ncell:B28:b::2::2:l:3:f:7:cf:2\ncell:C28:b::1:1:1:f:1:cf:2:colspan:3\ncell:D28:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:E28:b:::2::l:3:f:7:cf:2\ncell:F28:b::1:1::f:1:ntvf:1\ncell:G28:b::1:1::f:1:ntvf:1\ncell:H28:vtf:t::IF(F28*G28>0,F28*G28,""):b::1:::f:1:ntvf:1\ncell:I28:b::2::2:l:3:f:7\ncell:A29:b::2:::l:3:f:3\ncell:B29:b::2::2:l:3:f:3\ncell:C29:t:TOTAL:b:1:1:1:1:l:3:f:5:cf:2:colspan:5\ncell:D29:b:2::2::l:3:f:8:cf:2\ncell:E29:b:2:2:2::l:3:f:8:cf:2\ncell:F29:vtf:n:0:SUM(F16\\cF28):b:2:2:2::l:3:f:4:ntvf:2\ncell:G29:b:2:2:2::l:3:f:4:ntvf:2\ncell:H29:vtf:n:0:SUM(H16\\cH28):b:1:1:1::f:5:ntvf:1\ncell:I29:b::2::2:l:3:f:4\ncell:A30:b::2:::l:3:f:7\ncell:B30:b::::2:l:3:f:3:cf:2\ncell:C30:b:2::::l:1:f:7\ncell:D30:b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:7\ncell:F30:b:2::::l:1:f:7\ncell:G30:b:2::::l:1:f:7\ncell:H30:b:2::::l:1:f:7\ncell:I30:b::2:::l:3:f:3\ncell:A31:b::2:::l:3:f:7\ncell:B31:b::::2:l:3:f:7\ncell:D31:tvf:5:rowspan:4\ncell:I31:b::2:::l:3:f:7\ncell:A32:b::2:::l:3:f:7\ncell:B32:b::::2:l:3:f:7\ncell:I32:b::2:::l:3:f:7\ncell:A33:b::2:::l:3:f:7\ncell:B33:b::::2:l:3:f:7\ncell:I33:b::2:::l:3:f:7\ncell:A34:b::2:::l:3:f:7\ncell:B34:b::::2:l:3:f:7\ncell:I34:b::2:::l:3:f:7\ncell:A35:b::2:::l:3:f:7\ncell:B35:b:::2:2:l:3:f:7\ncell:C35:b:::2::l:3:f:7\ncell:D35:b:::2::l:3:f:7\ncell:E35:b:::2::l:3:f:7\ncell:F35:b:::2::l:3:f:7\ncell:G35:b:::2::l:3:f:7\ncell:H35:b:::2::l:3:f:7\ncell:I35:b::2:2::l:3:f:7\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncell:F36:b:1:::\ncell:G36:b:1:::\ncell:H36:b:1:::\ncell:I36:b:1:::\ncol:A:w:26\ncol:B:w:28\ncol:C:w:96\ncol:D:w:203\ncol:E:w:51\ncol:F:w:50\ncol:G:w:58\ncol:H:w:80\ncol:I:w:28\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:9:r:36:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:normal bold * Trebuchet MS\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 12pt Arial\nfont:5:normal bold 12pt Trebuchet MS\nfont:6:normal bold 14pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00;(#,##0.00)\nvalueformat:3:d-mmm\nvalueformat:4:m/d/yy\nvalueformat:5:text-html\n', - }, - name: "typeii", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:l:3\ncell:B2:t:[Company Name]:l:1:f:3:cf:2:colspan:3\ncell:C2:t::l:2:f:9\ncell:D2:t::l:2:f:9\ncell:E2:l:1:f:7:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:9\ncell:B3:t:[Company Slogan]:f:4:cf:2:colspan:3\ncell:C3:t::l:2:f:9\ncell:D3:t::l:2:f:9\ncell:B4:f:2:colspan:2\ncell:F4:tvf:4:rowspan:4\ncell:B5:t:[Street Address]:f:1:cf:2:colspan:2\ncell:F5:l:1:f:6\ncell:G5:l:1:f:10:cf:1\ncell:B6:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:G6:l:1:f:9\ncell:B7:t:Phone\\c :f:1:cf:2:colspan:2\ncell:B8:t:Email\\c:f:1:cf:2:colspan:2\ncell:B9:colspan:2\ncell:F9:t:DATE \\c:l:1:f:6:cf:2\ncell:G9:l:1:f:10:cf:2:ntvf:3\ncell:B10:t:BILL TO\\c:f:5:c:1:bg:3:cf:2:colspan:2\ncell:F10:t:INVOICE # \\c:l:1:f:6:cf:2\ncell:G10:v:1:l:1:f:10:cf:2\ncell:B11:t:[Name]:f:1:cf:2:colspan:2\ncell:B12:t:[Company Name]:f:1:cf:2:colspan:2\ncell:F12:t: \ncell:B13:t:[Street Address]:f:1:cf:2:colspan:2\ncell:B14:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:B15:t:Phone\\c :f:1:cf:2:colspan:2\ncell:A17:b::1::\ncell:B17:t:DESCRIPTION:b:1:1:1:1:l:1:f:6:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C17:t::l:2:f:9\ncell:D17:t::l:2:f:9\ncell:E17:t::l:2:f:9\ncell:F17:t::l:2:f:9\ncell:G17:t:AMOUNT:b:1:1:1::l:1:f:6:c:1:bg:3:cf:1\ncell:A18:b::1::\ncell:B18:b:1:1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C18:t::l:2:f:9\ncell:D18:t::l:2:f:9\ncell:E18:t::l:2:f:9\ncell:F18:t::b::2:::l:1:f:9\ncell:G18:b::1::1:f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C19:t::l:2:f:9\ncell:D19:t::l:2:f:9\ncell:E19:t::l:2:f:9\ncell:F19:t::b::2:::l:1:f:9\ncell:G19:b::1::1:f:1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C20:t::l:2:f:9\ncell:D20:t::l:2:f:9\ncell:E20:t::l:2:f:9\ncell:F20:t::b::2:::l:1:f:9\ncell:G20:b::1::1:f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C21:t::l:2:f:9\ncell:D21:t::l:2:f:9\ncell:E21:t::l:2:f:9\ncell:F21:t::b::2:::l:1:f:9\ncell:G21:b::1::1:f:1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C22:t::l:2:f:9\ncell:D22:t::l:2:f:9\ncell:E22:t::l:2:f:9\ncell:F22:t::b::2:::l:1:f:9\ncell:G22:b::1::1:f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:9\ncell:D23:t::l:2:f:9\ncell:E23:t::l:2:f:9\ncell:F23:t::b::2:::l:1:f:9\ncell:G23:b::1::1:f:1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:9\ncell:D24:t::l:2:f:9\ncell:E24:t::l:2:f:9\ncell:F24:t::b::2:::l:1:f:9\ncell:G24:b::1::1:f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:9\ncell:D25:t::l:2:f:9\ncell:E25:t::l:2:f:9\ncell:F25:t::b::2:::l:1:f:9\ncell:G25:b::1::1:f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:9\ncell:D26:t::l:2:f:9\ncell:E26:t::l:2:f:9\ncell:F26:t::b::2:::l:1:f:9\ncell:G26:b::1::1:f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:9\ncell:D27:t::l:2:f:9\ncell:E27:t::l:2:f:9\ncell:F27:t::b::2:::l:1:f:9\ncell:G27:b::1::1:f:1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:9\ncell:D28:t::l:2:f:9\ncell:E28:t::l:2:f:9\ncell:F28:t::b::2:::l:1:f:9\ncell:G28:b::1::1:f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:f:1:cf:2:colspan:5:rowspan:1\ncell:C29:t::b:::2::l:1:f:9\ncell:D29:t::b:::2::l:1:f:9\ncell:E29:t::b:::2::l:1:f:9\ncell:F29:t::b::2:2::l:1:f:9\ncell:G29:b::1:1:1:f:1:ntvf:1\ncell:B30:b:2::::l:1:f:9\ncell:C30:b:2::::l:1:f:9\ncell:D30:b:2::::l:1:f:9\ncell:E30:b:2::::l:1:f:10\ncell:F30:t:Subtotal:b:2::::l:1:f:10\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::f:8:ntvf:1\ncell:B31:t:NOTES:b:::2::l:1:f:6:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:9\ncell:D31:t::b:::2::l:1:f:9\ncell:F31:t:Tax Rate:l:1:f:1\ncell:G31:v:0:f:1:ntvf:2\ncell:B32:b:1::::f:1:cf:2:colspan:3\ncell:C32:t::b:2::::l:1:f:9\ncell:D32:t::b:2::::l:1:f:9\ncell:F32:t:Tax:l:1:f:1\ncell:G32:vtf:n:0:G31*G30:f:1:ntvf:1\ncell:B33:f:1:cf:2:colspan:3\ncell:C33:t::l:2:f:9\ncell:D33:t::l:2:f:9\ncell:F33:t:Other:b:::1::l:1:f:1\ncell:G33:v:0:b:::1::f:1:ntvf:1\ncell:B34:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:2:f:9\ncell:D34:t::l:2:f:9\ncell:F34:t:TOTAL:b:2::::l:1:f:6\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::::f:5:ntvf:1\ncell:C36:tvf:4:colspan:5:rowspan:7\ncol:A:w:40\ncol:B:w:232\ncol:C:w:53\ncol:D:w:90\ncol:E:w:54\ncol:F:w:91\ncol:G:w:99\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nsheet:c:7:r:36:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 16pt Trebuchet MS\nfont:4:italic normal * Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 28pt Trebuchet MS\nfont:8:normal normal * Trebuchet MS\nfont:9:normal normal 10pt Arial\nfont:10:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "typeiii", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:3\ncell:B2:t:[Company Name]:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C2:t::l:2:f:7\ncell:D2:t::l:2:f:7\ncell:F2:t:INVOICE:l:1:f:6:c:1:cf:2:colspan:2\ncell:G2:t::l:2:f:7\ncell:B3:t:[Company slogan]:f:3:cf:2:colspan:3:rowspan:1\ncell:C3:t::l:2:f:7\ncell:D3:t::l:2:f:7\ncell:B4:cf:2:colspan:3:rowspan:1\ncell:F4:tvf:4:rowspan:4\ncell:B5:t:[Street Address]:f:1:cf:2:colspan:3:rowspan:1\ncell:F5:l:1:f:5\ncell:G5:l:1:f:8:cf:1\ncell:B6:t:[City, State, Zip]:f:1:cf:2:colspan:3:rowspan:1\ncell:G6:l:1:f:7\ncell:B7:t:Phone\\c :f:1:cf:2:colspan:3:rowspan:1\ncell:B8:t:Email\\c:f:1:cf:2:colspan:3:rowspan:1\ncell:B9:cf:2:colspan:3:rowspan:1\ncell:B10:t:BILL TO\\c:l:1:f:5:bg:2:cf:2:colspan:2\ncell:F10:t:DATE\\c:l:1:f:5:cf:2\ncell:G10:l:1:f:8:cf:2:ntvf:3\ncell:B11:t:[Name]:f:1:cf:2:colspan:3:rowspan:1\ncell:F11:t:INVOICE # \\c:l:1:f:5:cf:2\ncell:G11:v:1:l:1:f:8:cf:2\ncell:B12:t:[Company Name]:f:1:cf:2:colspan:3:rowspan:1\ncell:J12:tvf:4\ncell:B13:t:[Street Address]:f:1:cf:2:colspan:3:rowspan:1\ncell:B14:t:[City, State, Zip]:f:1:cf:2:colspan:3:rowspan:1\ncell:B15:t:Phone\\c :f:1:cf:2:colspan:3:rowspan:1\ncell:B16:cf:2:colspan:3:rowspan:1\ncell:A17:b::1::\ncell:B17:t:DESCRIPTION:b:1:1:1:1:l:1:f:5:bg:2:cf:1:colspan:3:rowspan:1\ncell:C17:t::b:1::1::l:1:f:7:bg:2\ncell:D17:t::b:1::1::l:1:f:7:bg:2\ncell:E17:t:HOURS:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:F17:t:RATE:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:G17:t:AMOUNT:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:A18:b::1::\ncell:B18:b:1:1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C18:t::b:2::::l:1:f:7\ncell:D18:t::b:2:2:::l:1:f:7\ncell:E18:b:1:1::1:f:1:ntvf:1\ncell:F18:b:1:1::1:f:1:ntvf:1\ncell:G18:vtf:t::IF(E18*F18>0,E18*F18,""):b:1:1:::f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C19:t::l:2:f:7\ncell:D19:t::b::2:::l:1:f:7\ncell:E19:b::1::1:f:1:ntvf:1\ncell:F19:b::1::1:f:1:ntvf:1\ncell:G19:vtf:t::IF(E19*F19>0,E19*F19,""):b::1:::f:1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C20:t::l:2:f:7\ncell:D20:t::b::2:::l:1:f:7\ncell:E20:b::1::1:f:1:ntvf:1\ncell:F20:b::1::1:f:1:ntvf:1\ncell:G20:vtf:t::IF(E20*F20>0,E20*F20,""):b::1:::f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C21:t::l:2:f:7\ncell:D21:t::b::2:::l:1:f:7\ncell:E21:b::1::1:f:1:ntvf:1\ncell:F21:b::1::1:f:1:ntvf:1\ncell:G21:vtf:t::IF(E21*F21>0,E21*F21,""):b::1:::f:1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C22:t::l:2:f:7\ncell:D22:t::b::2:::l:1:f:7\ncell:E22:b::1::1:f:1:ntvf:1\ncell:F22:b::1::1:f:1:ntvf:1\ncell:G22:vtf:t::IF(E22*F22>0,E22*F22,""):b::1:::f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C23:t::l:2:f:7\ncell:D23:t::b::2:::l:1:f:7\ncell:E23:b::1::1:f:1:ntvf:1\ncell:F23:b::1::1:f:1:ntvf:1\ncell:G23:vtf:t::IF(E23*F23>0,E23*F23,""):b::1:::f:1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C24:t::l:2:f:7\ncell:D24:t::b::2:::l:1:f:7\ncell:E24:b::1::1:f:1:ntvf:1\ncell:F24:b::1::1:f:1:ntvf:1\ncell:G24:vtf:t::IF(E24*F24>0,E24*F24,""):b::1:::f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C25:t::l:2:f:7\ncell:D25:t::b::2:::l:1:f:7\ncell:E25:b::1::1:f:1:ntvf:1\ncell:F25:b::1::1:f:1:ntvf:1\ncell:G25:vtf:t::IF(E25*F25>0,E25*F25,""):b::1:::f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C26:t::l:2:f:7\ncell:D26:t::b::2:::l:1:f:7\ncell:E26:b::1::1:f:1:ntvf:1\ncell:F26:b::1::1:f:1:ntvf:1\ncell:G26:vtf:t::IF(E26*F26>0,E26*F26,""):b::1:::f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C27:t::l:2:f:7\ncell:D27:t::b::2:::l:1:f:7\ncell:E27:b::1::1:f:1:ntvf:1\ncell:F27:b::1::1:f:1:ntvf:1\ncell:G27:vtf:t::IF(E27*F27>0,E27*F27,""):b::1:::f:1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C28:t::l:2:f:7\ncell:D28:t::b::2:::l:1:f:7\ncell:E28:b::1::1:f:1:ntvf:1\ncell:F28:b::1::1:f:1:ntvf:1\ncell:G28:vtf:t::IF(E28*F28>0,E28*F28,""):b::1:::f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C29:t::b:::2::l:1:f:7\ncell:D29:t::b::2:2::l:1:f:7\ncell:E29:b::1:1:1:f:1:ntvf:1\ncell:F29:b::1:1:1:f:1:ntvf:1\ncell:G29:vtf:t::IF(E29*F29>0,E29*F29,""):b::1:::f:1:ntvf:1\ncell:B30:b:2::::l:1:f:8:cf:1:colspan:3:rowspan:1\ncell:C30:t::b:2::::l:1:f:7\ncell:D30:t::b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:8\ncell:F30:t:Subtotal:b:1::::f:1\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::f:1:ntvf:1\ncell:B31:t:NOTES:b:::2::l:1:f:5:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:7\ncell:D31:t::b:::2::l:1:f:7\ncell:F31:t:Tax Rate:f:1\ncell:G31:v:0:f:1:ntvf:2\ncell:B32:b:1::::f:1:cf:2:colspan:3:rowspan:1\ncell:C32:t::b:2::::l:1:f:7\ncell:D32:t::b:2::::l:1:f:7\ncell:F32:t:Tax:f:1\ncell:G32:vtf:n:0:G31*G30:f:1:ntvf:1\ncell:B33:f:1:cf:2:colspan:3:rowspan:1\ncell:C33:t::l:2:f:7\ncell:D33:t::l:2:f:7\ncell:F33:t:Other:b:::1::l:1:f:1\ncell:G33:v:0:b:::1::f:1:ntvf:1\ncell:B34:f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:2:f:7\ncell:D34:t::l:2:f:7\ncell:F34:t:TOTAL:b:1::::l:1:f:4\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::::f:4:ntvf:1\ncell:B35:b:2::::l:1:f:7\ncell:C35:b:2::::l:1:f:7\ncell:D35:b:2::::l:1:f:7\ncell:C36:tvf:4:colspan:5:rowspan:7\ncol:A:w:40\ncol:B:w:194\ncol:C:w:128\ncol:D:w:60\ncol:E:w:65\ncol:F:w:95\ncol:G:w:90\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:10:r:36:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0,0,0)\ncolor:2:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 16pt Trebuchet MS\nfont:3:italic normal * Trebuchet MS\nfont:4:normal bold * Trebuchet MS\nfont:5:normal bold 10pt Trebuchet MS\nfont:6:normal bold 28pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "typeiv", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "typei!C10": true, - "typei!B2": true, - "typei!C11": true, - "typei!C12": true, - "typei!C13": true, - "typei!D9": true, - "typei!D4": true, - "typei!D6": true, - "typei!E10": true, - "typei!E11": true, - "typei!E12": true, - "typei!E13": true, - "typei!F9": true, - "typei!C16": true, - "typei!C17": true, - "typei!C18": true, - "typei!C19": true, - "typei!C20": true, - "typei!C21": true, - "typei!C22": true, - "typei!C23": true, - "typei!C24": true, - "typei!C25": true, - "typei!C26": true, - "typei!C27": true, - "typei!C28": true, - "typei!F16": true, - "typei!F17": true, - "typei!F18": true, - "typei!F19": true, - "typei!F20": true, - "typei!F21": true, - "typei!F22": true, - "typei!F23": true, - "typei!F24": true, - "typei!F25": true, - "typei!F26": true, - "typei!F27": true, - "typei!F28": true, - "typei!E35": true, - "typeii!B2": true, - "typeii!D4": true, - "typeii!C10": true, - "typeii!C11": true, - "typeii!C12": true, - "typeii!C13": true, - "typeii!D9": true, - "typeii!E10": true, - "typeii!E11": true, - "typeii!E12": true, - "typeii!E13": true, - "typeii!F9": true, - "typeii!C16": true, - "typeii!C17": true, - "typeii!C18": true, - "typeii!C19": true, - "typeii!C20": true, - "typeii!C21": true, - "typeii!C22": true, - "typeii!C23": true, - "typeii!C24": true, - "typeii!C25": true, - "typeii!C26": true, - "typeii!C27": true, - "typeii!C28": true, - "typeii!F16": true, - "typeii!F17": true, - "typeii!F18": true, - "typeii!F19": true, - "typeii!F20": true, - "typeii!F21": true, - "typeii!F22": true, - "typeii!F23": true, - "typeii!F24": true, - "typeii!F25": true, - "typeii!F26": true, - "typeii!F27": true, - "typeii!F28": true, - "typeii!G16": true, - "typeii!G17": true, - "typeii!G18": true, - "typeii!G19": true, - "typeii!G20": true, - "typeii!G21": true, - "typeii!G22": true, - "typeii!G23": true, - "typeii!G24": true, - "typeii!G25": true, - "typeii!G26": true, - "typeii!G27": true, - "typeii!G28": true, - "typeii!E35": true, - "typeiii!G9": true, - "typeiii!G10": true, - "typeiii!B2": true, - "typeiii!B3": true, - "typeiii!B4": true, - "typeiii!B5": true, - "typeiii!B6": true, - "typeiii!B7": true, - "typeiii!B8": true, - "typeiii!B9": true, - "typeiii!B11": true, - "typeiii!B12": true, - "typeiii!B13": true, - "typeiii!B14": true, - "typeiii!B15": true, - "typeiii!B18": true, - "typeiii!B19": true, - "typeiii!B20": true, - "typeiii!B21": true, - "typeiii!B22": true, - "typeiii!B23": true, - "typeiii!B24": true, - "typeiii!B25": true, - "typeiii!B26": true, - "typeiii!B27": true, - "typeiii!B28": true, - "typeiii!B29": true, - "typeiii!G18": true, - "typeiii!G19": true, - "typeiii!G20": true, - "typeiii!G21": true, - "typeiii!G22": true, - "typeiii!G23": true, - "typeiii!G24": true, - "typeiii!G25": true, - "typeiii!G26": true, - "typeiii!G27": true, - "typeiii!G28": true, - "typeiii!G29": true, - "typeiii!B32": true, - "typeiii!B33": true, - "typeiii!B34": true, - "typeiii!G31": true, - "typeiii!G33": true, - "typeiii!B37": true, - "typeiv!G9": true, - "typeiv!G10": true, - "typeiv!B2": true, - "typeiv!B3": true, - "typeiv!B4": true, - "typeiv!B5": true, - "typeiv!B6": true, - "typeiv!B7": true, - "typeiv!B8": true, - "typeiv!B11": true, - "typeiv!B12": true, - "typeiv!B13": true, - "typeiv!B14": true, - "typeiv!B15": true, - "typeiv!B16": true, - "typeiv!B18": true, - "typeiv!B19": true, - "typeiv!B20": true, - "typeiv!B21": true, - "typeiv!B22": true, - "typeiv!B23": true, - "typeiv!B24": true, - "typeiv!B25": true, - "typeiv!B26": true, - "typeiv!B27": true, - "typeiv!B28": true, - "typeiv!B29": true, - "typeiv!E18": true, - "typeiv!E19": true, - "typeiv!E20": true, - "typeiv!E21": true, - "typeiv!E22": true, - "typeiv!E23": true, - "typeiv!E24": true, - "typeiv!E25": true, - "typeiv!E26": true, - "typeiv!E27": true, - "typeiv!E28": true, - "typeiv!E29": true, - "typeiv!F18": true, - "typeiv!F19": true, - "typeiv!F2": true, - "typeiv!F20": true, - "typeiv!F21": true, - "typeiv!F22": true, - "typeiv!F23": true, - "typeiv!F24": true, - "typeiv!F25": true, - "typeiv!F26": true, - "typeiv!F27": true, - "typeiv!F28": true, - "typeiv!F29": true, - "typeiv!B32": true, - "typeiv!B33": true, - "typeiv!B34": true, - "typeiv!G31": true, - "typeiv!G33": true, - "typeiv!B37": true, - "typeii!F15": true, - "typeii!G15": true, - "typeiv!E17": true, - "typeiv!F17": true, - "typeii!D6": true, - "typeiv!G11": true, - "typei!C4": true, - "typeii!C4": true, - "typeiii!F10": true, - "typeiv!F11": true, - "typeiv!F10": true, - "typeiii!F9": true, - "typeii!C6": true, - "typei!C6": true, - "typei!F4": true, - "typeii!F4": true, - "typeiii!F4": true, - "typeiii!F2": true, - "typeiv!F4": true, - "typei!F29": true, - "typeii!H29": true, - "typeiii!G30": true, - "typeiii!G34": true, - "typeiv!G30": true, - "typeiv!G34": true, - }, - constraints: {}, - }, - }, - footers: [ - { name: "Invoice 1", index: 1, isActive: true }, - { name: "Invoice 2", index: 2, isActive: false }, - { name: "Company Invoice 1", index: 3, isActive: false }, - { name: "Company Invoice 2", index: 4, isActive: false }, - ], - }, - default: { - msc: { - numsheets: 4, - currentid: "sheet1", - currentname: "typei", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE:b:1:1:1:1:f:6:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:t::b:2::2::l:1:f:7\ncell:G2:t::b:2::2::l:1:f:7\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2:::2:l:3:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:2::::l:1:f:7\ncell:G3:b:2:2:::l:3:f:7\ncell:A4:b::2:::l:3:f:7\ncell:B4:b::::2:l:3:f:3\ncell:C4:t:INVOICE # \\c:f:2:cf:2\ncell:D4:v:1:f:2:cf:2\ncell:F4:tvf:4:rowspan:4\ncell:G4:b::2:::l:3:f:7\ncell:A5:b::2:::l:3:f:7\ncell:B5:b::::2:l:3:f:4\ncell:F5:t::l:2:f:7\ncell:G5:t::b::1:::l:2:f:7\ncell:A6:b::2:::l:3:f:7\ncell:B6:b::::2:l:3:f:4\ncell:C6:t:INVOICE DATE\\c:f:2:cf:2\ncell:D6:f:2:cf:2:ntvf:3\ncell:F6:l:2:f:7\ncell:G6:b::1:::l:2:f:7\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::::2:l:3:f:4\ncell:G7:b::2:::l:3:f:7\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::::2:l:3:f:4\ncell:G8:b::2:::l:3:f:7\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::::2:l:3:f:4\ncell:C9:t:BILL TO\\c:l:3:f:2\ncell:E9:t:FROM\\c:f:2:cf:2\ncell:G9:b::2:::l:3:f:7\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::::2:l:3:f:3\ncell:C10:t:[Name]:f:1:cf:2:colspan:2\ncell:E10:t:[Name]:f:1:cf:2:colspan:2\ncell:G10:b::2:::l:3:f:7\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:E11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:G11:b::2:::l:3:f:7\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:E12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:G12:b::2:::l:3:f:7\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:Phone\\c:f:1:cf:2:colspan:2\ncell:E13:t:Phone\\c:f:1:cf:2:colspan:2\ncell:G13:b::2:::l:3:f:7\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::::2:l:3:f:3:cf:2\ncell:C14:b:::2::l:1:f:7\ncell:D14:b:::2::l:3:f:3:cf:2\ncell:E14:b:::2::l:1:f:7\ncell:F14:b:::2::l:1:f:7\ncell:G14:b::2:::l:3:f:7\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::2::2:l:3:f:7\ncell:C15:t:Description:b:1::1:1:f:2:cf:1:colspan:3\ncell:D15:t:Description:b:1::1::l:3:f:3:cf:2:colspan:2:rowspan:1\ncell:E15:t::b:2:2:2::l:1:f:7\ncell:F15:t:Amount:b:1:1:1:1:f:2:cf:1\ncell:G15:b::2::2:l:3:f:7\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::2::2:l:3:f:7\ncell:C16:b:1:1::1:f:1:cf:2:colspan:3\ncell:D16:b:1:1:::l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:E16:t::b:2:2:2::l:1:f:7\ncell:F16:b:1:1:::f:1:ntvf:1\ncell:G16:b::2::2:l:3:f:7\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::2::2:l:3:f:7:cf:2\ncell:C17:b::1::1:f:1:cf:2:colspan:3\ncell:D17:b::1:::l:1:f:7:colspan:2\ncell:E17:l:1:f:7\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::2::2:l:3:f:7\ncell:A18:b::2:::l:3:f:7\ncell:B18:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C18:b::1::1:f:1:cf:2:colspan:3\ncell:D18:b::1:::colspan:2\ncell:F18:b::1:::f:1:ntvf:1\ncell:G18:b::2::2:l:3:f:7\ncell:A19:b::2:::l:3:f:7\ncell:B19:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C19:b::1::1:f:1:cf:2:colspan:3\ncell:D19:b::1:::colspan:2\ncell:F19:b::1:::f:1:ntvf:1\ncell:G19:b::2::2:l:3:f:7\ncell:A20:b::2:::l:3:f:7\ncell:B20:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C20:b::1::1:f:1:cf:2:colspan:3\ncell:D20:b::1:::colspan:2\ncell:F20:b::1:::f:1:ntvf:1\ncell:G20:b::2::2:l:3:f:7\ncell:A21:b::2:::l:3:f:7\ncell:B21:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C21:b::1::1:f:1:cf:2:colspan:3\ncell:D21:b::1:::colspan:2\ncell:F21:b::1:::f:1:ntvf:1\ncell:G21:b::2::2:l:3:f:7\ncell:A22:b::2:::l:3:f:7\ncell:B22:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C22:b::1::1:f:1:cf:2:colspan:3\ncell:D22:b::1:::colspan:2\ncell:F22:b::1:::f:1:ntvf:1\ncell:G22:b::2::2:l:3:f:7\ncell:A23:b::2:::l:3:f:7\ncell:B23:b::2::2:l:3:f:7:cf:2\ncell:C23:b::1::1:f:1:cf:2:colspan:3\ncell:D23:b::1:::colspan:2\ncell:F23:b::1:::f:1:ntvf:1\ncell:G23:b::2::2:l:3:f:7\ncell:A24:b::2:::l:3:f:7\ncell:B24:b::2::2:l:3:f:7:cf:2\ncell:C24:b::1::1:f:1:cf:2:colspan:3\ncell:D24:b::1:::colspan:2\ncell:F24:b::1:::f:1:ntvf:1\ncell:G24:b::2::2:l:3:f:7\ncell:A25:b::2:::l:3:f:7\ncell:B25:b::2::2:l:3:f:7:cf:2\ncell:C25:b::1::1:f:1:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:1:ntvf:1\ncell:G25:b::2::2:l:3:f:7\ncell:A26:b::2:::l:3:f:7\ncell:B26:b::2::2:l:3:f:7:cf:2\ncell:C26:b::1::1:f:1:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:1:ntvf:1\ncell:G26:b::2::2:l:3:f:7\ncell:A27:b::2:::l:3:f:7\ncell:B27:b::2::2:l:3:f:7:cf:2\ncell:C27:b::1::1:f:1:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:1:ntvf:1\ncell:G27:b::2::2:l:3:f:7\ncell:A28:b::2:::l:3:f:4\ncell:B28:b::2::2:l:3:f:7:cf:2\ncell:C28:b::1:1:1:f:1:cf:2:colspan:3\ncell:D28:b::1:1::l:3:f:7:cf:2:colspan:2\ncell:E28:b:::2::l:3:f:7:cf:2\ncell:F28:b::1:1::f:1:ntvf:1\ncell:G28:b::2::2:l:3:f:7\ncell:A29:b::2:::l:3:f:3\ncell:B29:b::2::2:l:3:f:3\ncell:C29:t:TOTAL:b:1:1:1:1:f:5:cf:2:colspan:3\ncell:D29:b:2::2::l:3:f:8:cf:2\ncell:E29:b:2:2:2::l:3:f:8:cf:2\ncell:F29:vtf:n:0:SUM(F16\\cF28):b:1:1:1::f:5:ntvf:1\ncell:G29:b::2::2:l:3:f:4\ncell:A30:b::2:::l:3:f:7\ncell:B30:b::::2:l:3:f:3:cf:2\ncell:C30:b:2::::l:1:f:7\ncell:D30:b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:7\ncell:F30:b:2::::l:1:f:7\ncell:G30:b::2:::l:3:f:3\ncell:A31:b::2:::l:3:f:7\ncell:B31:b::::2:l:3:f:7\ncell:D31:tvf:4:rowspan:4\ncell:G31:b::2:::l:3:f:7\ncell:A32:b::2:::l:3:f:7\ncell:B32:b::::2:l:3:f:7\ncell:G32:b::2:::l:3:f:7\ncell:A33:b::2:::l:3:f:7\ncell:B33:b::::2:l:3:f:7\ncell:G33:b::2:::l:3:f:7\ncell:A34:b::2:::l:3:f:7\ncell:B34:b::::2:l:3:f:7\ncell:G34:b::2:::l:3:f:7\ncell:A35:b::2:::l:3:f:7\ncell:B35:b:::2:2:l:3:f:7\ncell:C35:b:::2::l:3:f:7\ncell:D35:b:::2::l:3:f:7\ncell:E35:b:::2::l:3:f:7\ncell:F35:b:::2::l:3:f:7\ncell:G35:b::2:2::l:3:f:7\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncell:F36:b:1:::\ncell:G36:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:105\ncol:D:w:182\ncol:E:w:110\ncol:F:w:115\ncol:G:w:65\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:7:r:36:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:normal bold * Trebuchet MS\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 12pt Arial\nfont:5:normal bold 12pt Trebuchet MS\nfont:6:normal bold 14pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "typei", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - 'version:1.5\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE:b:1:1:1:1:l:3:f:6:cf:1:colspan:8\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:t::b:2::2::l:1:f:7\ncell:G2:b:2::2::l:1:f:7\ncell:H2:b:2::2::l:1:f:7\ncell:I2:t::b:2::2::l:1:f:7\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2:::2:l:3:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:2::::l:1:f:7\ncell:G3:b:2::::l:1:f:7\ncell:H3:b:2::::l:1:f:7\ncell:I3:b:2:2:::l:3:f:7\ncell:A4:b::2:::l:3:f:7\ncell:B4:b::::2:l:3:f:3\ncell:C4:t:INVOICE # \\c:f:2:cf:2\ncell:D4:v:1:f:2:cf:2\ncell:F4:tvf:5:colspan:2:rowspan:4\ncell:I4:b::2:::l:3:f:7\ncell:A5:b::2:::l:3:f:7\ncell:B5:b::::2:l:3:f:4\ncell:F5:t::l:2:f:7\ncell:G5:l:2:f:7\ncell:H5:l:2:f:7\ncell:I5:t::b::1:::l:2:f:7\ncell:A6:b::2:::l:3:f:7\ncell:B6:b::::2:l:3:f:4\ncell:C6:t:INVOICE DATE\\c:f:2:cf:2\ncell:D6:f:2:cf:2:ntvf:4\ncell:F6:l:2:f:7\ncell:G6:l:2:f:7\ncell:H6:l:2:f:7\ncell:I6:b::1:::l:2:f:7\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::::2:l:3:f:4\ncell:I7:b::2:::l:3:f:7\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::::2:l:3:f:4\ncell:I8:b::2:::l:3:f:7\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::::2:l:3:f:4\ncell:C9:t:BILL TO\\c:f:2\ncell:E9:t:FROM\\c:f:2:cf:2\ncell:F9:colspan:3\ncell:I9:b::2:::l:3:f:7\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::::2:l:3:f:3\ncell:C10:t:[Name]:f:1:cf:2:colspan:2\ncell:E10:t:[Name]:f:1:cf:2:colspan:4\ncell:I10:b::2:::l:3:f:7\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:E11:t:[Street Address]:f:1:colspan:4\ncell:I11:b::2:::l:3:f:7\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:E12:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:I12:b::2:::l:3:f:7\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:Phone\\c :f:1:cf:2:colspan:2\ncell:E13:t:Phone\\c :f:1:cf:2:colspan:4\ncell:I13:b::2:::l:3:f:7\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::::2:l:3:f:3:cf:2\ncell:C14:b:::2::l:1:f:7\ncell:D14:b:::2::l:3:f:3:cf:2\ncell:E14:b:::2::l:1:f:7\ncell:F14:b:::2::l:1:f:7\ncell:G14:b:::2::l:1:f:7\ncell:H14:b:::2::l:1:f:7\ncell:I14:b::2:::l:3:f:7\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::2::2:l:3:f:7\ncell:C15:t:Description:b:1:1:1:1:f:2:cf:1:colspan:3\ncell:D15:t:Description:b:2::2:2:l:3:f:3:cf:2:colspan:2:rowspan:1\ncell:E15:t::b:2:2:2::l:1:f:7\ncell:F15:t:Hours:b:1:1:1:1:f:2:cf:1\ncell:G15:t:Rate:b:1:1:1:1:f:2:cf:1\ncell:H15:t:Amount:b:1:1:1:1:f:2:cf:1\ncell:I15:b::2::2:l:3:f:7\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::2::2:l:3:f:7\ncell:C16:b:1:1::1:f:1:cf:2:colspan:3\ncell:D16:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:E16:t::b:2:2:2::l:1:f:7\ncell:F16:b:1:1:::f:1:ntvf:1\ncell:G16:b:1:1:::f:1:ntvf:1\ncell:H16:vtf:t::IF(F16*G16>0,F16*G16,""):b:1:1:::f:1:ntvf:1\ncell:I16:b::2::2:l:3:f:7\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::2::2:l:3:f:7:cf:2\ncell:C17:b::1::1:f:1:cf:2:colspan:3\ncell:D17:b::1::1:l:1:f:7:colspan:2\ncell:E17:l:1:f:7\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::1:::f:1:ntvf:1\ncell:H17:vtf:t::IF(F17*G17>0,F17*G17,""):b::1:::f:1:ntvf:1\ncell:I17:b::2::2:l:3:f:7\ncell:A18:b::2:::l:3:f:7\ncell:B18:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C18:b::1::1:f:1:cf:2:colspan:3\ncell:D18:b::1::1:colspan:2\ncell:F18:b::1:::f:1:ntvf:1\ncell:G18:b::1:::f:1:ntvf:1\ncell:H18:vtf:t::IF(F18*G18>0,F18*G18,""):b::1:::f:1:ntvf:1\ncell:I18:b::2::2:l:3:f:7\ncell:A19:b::2:::l:3:f:7\ncell:B19:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C19:b::1::1:f:1:cf:2:colspan:3\ncell:D19:b::1::1:colspan:2\ncell:F19:b::1:::f:1:ntvf:1\ncell:G19:b::1:::f:1:ntvf:1\ncell:H19:vtf:t::IF(F19*G19>0,F19*G19,""):b::1:::f:1:ntvf:1\ncell:I19:b::2::2:l:3:f:7\ncell:A20:b::2:::l:3:f:7\ncell:B20:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C20:b::1::1:f:1:cf:2:colspan:3\ncell:D20:b::1::1:colspan:2\ncell:F20:b::1:::f:1:ntvf:1\ncell:G20:b::1:::f:1:ntvf:1\ncell:H20:vtf:t::IF(F20*G20>0,F20*G20,""):b::1:::f:1:ntvf:1\ncell:I20:b::2::2:l:3:f:7\ncell:A21:b::2:::l:3:f:7\ncell:B21:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C21:b::1::1:f:1:cf:2:colspan:3\ncell:D21:b::1::1:colspan:2\ncell:F21:b::1:::f:1:ntvf:1\ncell:G21:b::1:::f:1:ntvf:1\ncell:H21:vtf:t::IF(F21*G21>0,F21*G21,""):b::1:::f:1:ntvf:1\ncell:I21:b::2::2:l:3:f:7\ncell:A22:b::2:::l:3:f:7\ncell:B22:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C22:b::1::1:f:1:cf:2:colspan:3\ncell:D22:b::1::1:colspan:2\ncell:F22:b::1:::f:1:ntvf:1\ncell:G22:b::1:::f:1:ntvf:1\ncell:H22:vtf:t::IF(F22*G22>0,F22*G22,""):b::1:::f:1:ntvf:1\ncell:I22:b::2::2:l:3:f:7\ncell:A23:b::2:::l:3:f:7\ncell:B23:b::2::2:l:3:f:7:cf:2\ncell:C23:b::1::1:f:1:cf:2:colspan:3\ncell:D23:b::1::1:colspan:2\ncell:F23:b::1:::f:1:ntvf:1\ncell:G23:b::1:::f:1:ntvf:1\ncell:H23:vtf:t::IF(F23*G23>0,F23*G23,""):b::1:::f:1:ntvf:1\ncell:I23:b::2::2:l:3:f:7\ncell:A24:b::2:::l:3:f:7\ncell:B24:b::2::2:l:3:f:7:cf:2\ncell:C24:b::1::1:f:1:cf:2:colspan:3\ncell:D24:b::1::1:colspan:2\ncell:F24:b::1:::f:1:ntvf:1\ncell:G24:b::1:::f:1:ntvf:1\ncell:H24:vtf:t::IF(F24*G24>0,F24*G24,""):b::1:::f:1:ntvf:1\ncell:I24:b::2::2:l:3:f:7\ncell:A25:b::2:::l:3:f:7\ncell:B25:b::2::2:l:3:f:7:cf:2\ncell:C25:b::1::1:f:1:cf:2:colspan:3\ncell:D25:b::1::1:colspan:2\ncell:F25:b::1:::f:1:ntvf:1\ncell:G25:b::1:::f:1:ntvf:1\ncell:H25:vtf:t::IF(F25*G25>0,F25*G25,""):b::1:::f:1:ntvf:1\ncell:I25:b::2::2:l:3:f:7\ncell:A26:b::2:::l:3:f:7\ncell:B26:b::2::2:l:3:f:7:cf:2\ncell:C26:b::1::1:f:1:cf:2:colspan:3\ncell:D26:b::1::1:colspan:2\ncell:F26:b::1:::f:1:ntvf:1\ncell:G26:b::1:::f:1:ntvf:1\ncell:H26:vtf:t::IF(F26*G26>0,F26*G26,""):b::1:::f:1:ntvf:1\ncell:I26:b::2::2:l:3:f:7\ncell:A27:b::2:::l:3:f:7\ncell:B27:b::2::2:l:3:f:7:cf:2\ncell:C27:b::1::1:f:1:cf:2:colspan:3\ncell:D27:b::1::1:colspan:2\ncell:F27:b::1:::f:1:ntvf:1\ncell:G27:b::1:::f:1:ntvf:1\ncell:H27:vtf:t::IF(F27*G27>0,F27*G27,""):b::1:::f:1:ntvf:1\ncell:I27:b::2::2:l:3:f:7\ncell:A28:b::2:::l:3:f:4\ncell:B28:b::2::2:l:3:f:7:cf:2\ncell:C28:b::1:1:1:f:1:cf:2:colspan:3\ncell:D28:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:E28:b:::2::l:3:f:7:cf:2\ncell:F28:b::1:1::f:1:ntvf:1\ncell:G28:b::1:1::f:1:ntvf:1\ncell:H28:vtf:t::IF(F28*G28>0,F28*G28,""):b::1:::f:1:ntvf:1\ncell:I28:b::2::2:l:3:f:7\ncell:A29:b::2:::l:3:f:3\ncell:B29:b::2::2:l:3:f:3\ncell:C29:t:TOTAL:b:1:1:1:1:l:3:f:5:cf:2:colspan:5\ncell:D29:b:2::2::l:3:f:8:cf:2\ncell:E29:b:2:2:2::l:3:f:8:cf:2\ncell:F29:vtf:n:0:SUM(F16\\cF28):b:2:2:2::l:3:f:4:ntvf:2\ncell:G29:b:2:2:2::l:3:f:4:ntvf:2\ncell:H29:vtf:n:0:SUM(H16\\cH28):b:1:1:1::f:5:ntvf:1\ncell:I29:b::2::2:l:3:f:4\ncell:A30:b::2:::l:3:f:7\ncell:B30:b::::2:l:3:f:3:cf:2\ncell:C30:b:2::::l:1:f:7\ncell:D30:b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:7\ncell:F30:b:2::::l:1:f:7\ncell:G30:b:2::::l:1:f:7\ncell:H30:b:2::::l:1:f:7\ncell:I30:b::2:::l:3:f:3\ncell:A31:b::2:::l:3:f:7\ncell:B31:b::::2:l:3:f:7\ncell:D31:tvf:5:rowspan:4\ncell:I31:b::2:::l:3:f:7\ncell:A32:b::2:::l:3:f:7\ncell:B32:b::::2:l:3:f:7\ncell:I32:b::2:::l:3:f:7\ncell:A33:b::2:::l:3:f:7\ncell:B33:b::::2:l:3:f:7\ncell:I33:b::2:::l:3:f:7\ncell:A34:b::2:::l:3:f:7\ncell:B34:b::::2:l:3:f:7\ncell:I34:b::2:::l:3:f:7\ncell:A35:b::2:::l:3:f:7\ncell:B35:b:::2:2:l:3:f:7\ncell:C35:b:::2::l:3:f:7\ncell:D35:b:::2::l:3:f:7\ncell:E35:b:::2::l:3:f:7\ncell:F35:b:::2::l:3:f:7\ncell:G35:b:::2::l:3:f:7\ncell:H35:b:::2::l:3:f:7\ncell:I35:b::2:2::l:3:f:7\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncell:F36:b:1:::\ncell:G36:b:1:::\ncell:H36:b:1:::\ncell:I36:b:1:::\ncol:A:w:26\ncol:B:w:28\ncol:C:w:96\ncol:D:w:203\ncol:E:w:51\ncol:F:w:50\ncol:G:w:58\ncol:H:w:80\ncol:I:w:28\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:9:r:36:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:normal bold * Trebuchet MS\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 12pt Arial\nfont:5:normal bold 12pt Trebuchet MS\nfont:6:normal bold 14pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00;(#,##0.00)\nvalueformat:3:d-mmm\nvalueformat:4:m/d/yy\nvalueformat:5:text-html\n', - }, - name: "typeii", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:l:3\ncell:B2:t:[Company Name]:l:1:f:3:cf:2:colspan:3\ncell:C2:t::l:2:f:9\ncell:D2:t::l:2:f:9\ncell:E2:l:1:f:7:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:9\ncell:B3:t:[Company Slogan]:f:4:cf:2:colspan:3\ncell:C3:t::l:2:f:9\ncell:D3:t::l:2:f:9\ncell:B4:f:2:colspan:2\ncell:F4:tvf:4:rowspan:4\ncell:B5:t:[Street Address]:f:1:cf:2:colspan:2\ncell:F5:l:1:f:6\ncell:G5:l:1:f:10:cf:1\ncell:B6:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:G6:l:1:f:9\ncell:B7:t:Phone\\c :f:1:cf:2:colspan:2\ncell:B8:t:Email\\c:f:1:cf:2:colspan:2\ncell:B9:colspan:2\ncell:F9:t:DATE \\c:l:1:f:6:cf:2\ncell:G9:l:1:f:10:cf:2:ntvf:3\ncell:B10:t:BILL TO\\c:f:5:c:1:bg:3:cf:2:colspan:2\ncell:F10:t:INVOICE # \\c:l:1:f:6:cf:2\ncell:G10:v:1:l:1:f:10:cf:2\ncell:B11:t:[Name]:f:1:cf:2:colspan:2\ncell:B12:t:[Company Name]:f:1:cf:2:colspan:2\ncell:F12:t: \ncell:B13:t:[Street Address]:f:1:cf:2:colspan:2\ncell:B14:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:B15:t:Phone\\c :f:1:cf:2:colspan:2\ncell:A17:b::1::\ncell:B17:t:DESCRIPTION:b:1:1:1:1:l:1:f:6:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C17:t::l:2:f:9\ncell:D17:t::l:2:f:9\ncell:E17:t::l:2:f:9\ncell:F17:t::l:2:f:9\ncell:G17:t:AMOUNT:b:1:1:1::l:1:f:6:c:1:bg:3:cf:1\ncell:A18:b::1::\ncell:B18:b:1:1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C18:t::l:2:f:9\ncell:D18:t::l:2:f:9\ncell:E18:t::l:2:f:9\ncell:F18:t::b::2:::l:1:f:9\ncell:G18:b::1::1:f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C19:t::l:2:f:9\ncell:D19:t::l:2:f:9\ncell:E19:t::l:2:f:9\ncell:F19:t::b::2:::l:1:f:9\ncell:G19:b::1::1:f:1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C20:t::l:2:f:9\ncell:D20:t::l:2:f:9\ncell:E20:t::l:2:f:9\ncell:F20:t::b::2:::l:1:f:9\ncell:G20:b::1::1:f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C21:t::l:2:f:9\ncell:D21:t::l:2:f:9\ncell:E21:t::l:2:f:9\ncell:F21:t::b::2:::l:1:f:9\ncell:G21:b::1::1:f:1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C22:t::l:2:f:9\ncell:D22:t::l:2:f:9\ncell:E22:t::l:2:f:9\ncell:F22:t::b::2:::l:1:f:9\ncell:G22:b::1::1:f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:9\ncell:D23:t::l:2:f:9\ncell:E23:t::l:2:f:9\ncell:F23:t::b::2:::l:1:f:9\ncell:G23:b::1::1:f:1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:9\ncell:D24:t::l:2:f:9\ncell:E24:t::l:2:f:9\ncell:F24:t::b::2:::l:1:f:9\ncell:G24:b::1::1:f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:9\ncell:D25:t::l:2:f:9\ncell:E25:t::l:2:f:9\ncell:F25:t::b::2:::l:1:f:9\ncell:G25:b::1::1:f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:9\ncell:D26:t::l:2:f:9\ncell:E26:t::l:2:f:9\ncell:F26:t::b::2:::l:1:f:9\ncell:G26:b::1::1:f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:9\ncell:D27:t::l:2:f:9\ncell:E27:t::l:2:f:9\ncell:F27:t::b::2:::l:1:f:9\ncell:G27:b::1::1:f:1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:9\ncell:D28:t::l:2:f:9\ncell:E28:t::l:2:f:9\ncell:F28:t::b::2:::l:1:f:9\ncell:G28:b::1::1:f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:f:1:cf:2:colspan:5:rowspan:1\ncell:C29:t::b:::2::l:1:f:9\ncell:D29:t::b:::2::l:1:f:9\ncell:E29:t::b:::2::l:1:f:9\ncell:F29:t::b::2:2::l:1:f:9\ncell:G29:b::1:1:1:f:1:ntvf:1\ncell:B30:b:2::::l:1:f:9\ncell:C30:b:2::::l:1:f:9\ncell:D30:b:2::::l:1:f:9\ncell:E30:b:2::::l:1:f:10\ncell:F30:t:Subtotal:b:2::::l:1:f:10\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::f:8:ntvf:1\ncell:B31:t:NOTES:b:::2::l:1:f:6:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:9\ncell:D31:t::b:::2::l:1:f:9\ncell:F31:t:Tax Rate:l:1:f:1\ncell:G31:v:0:f:1:ntvf:2\ncell:B32:b:1::::f:1:cf:2:colspan:3\ncell:C32:t::b:2::::l:1:f:9\ncell:D32:t::b:2::::l:1:f:9\ncell:F32:t:Tax:l:1:f:1\ncell:G32:vtf:n:0:G31*G30:f:1:ntvf:1\ncell:B33:f:1:cf:2:colspan:3\ncell:C33:t::l:2:f:9\ncell:D33:t::l:2:f:9\ncell:F33:t:Other:b:::1::l:1:f:1\ncell:G33:v:0:b:::1::f:1:ntvf:1\ncell:B34:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:2:f:9\ncell:D34:t::l:2:f:9\ncell:F34:t:TOTAL:b:2::::l:1:f:6\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::::f:5:ntvf:1\ncell:C36:tvf:4:colspan:5:rowspan:7\ncol:A:w:40\ncol:B:w:232\ncol:C:w:53\ncol:D:w:90\ncol:E:w:54\ncol:F:w:91\ncol:G:w:99\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nsheet:c:7:r:36:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 16pt Trebuchet MS\nfont:4:italic normal * Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 28pt Trebuchet MS\nfont:8:normal normal * Trebuchet MS\nfont:9:normal normal 10pt Arial\nfont:10:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "typeiii", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:3\ncell:B2:t:[Company Name]:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C2:t::l:2:f:7\ncell:D2:t::l:2:f:7\ncell:F2:t:INVOICE:l:1:f:6:c:1:cf:2:colspan:2\ncell:G2:t::l:2:f:7\ncell:B3:t:[Company slogan]:f:3:cf:2:colspan:3:rowspan:1\ncell:C3:t::l:2:f:7\ncell:D3:t::l:2:f:7\ncell:B4:cf:2:colspan:3:rowspan:1\ncell:F4:tvf:4:rowspan:4\ncell:B5:t:[Street Address]:f:1:cf:2:colspan:3:rowspan:1\ncell:F5:l:1:f:5\ncell:G5:l:1:f:8:cf:1\ncell:B6:t:[City, State, Zip]:f:1:cf:2:colspan:3:rowspan:1\ncell:G6:l:1:f:7\ncell:B7:t:Phone\\c :f:1:cf:2:colspan:3:rowspan:1\ncell:B8:t:Email\\c:f:1:cf:2:colspan:3:rowspan:1\ncell:B9:cf:2:colspan:3:rowspan:1\ncell:B10:t:BILL TO\\c:l:1:f:5:bg:2:cf:2:colspan:2\ncell:F10:t:DATE\\c:l:1:f:5:cf:2\ncell:G10:l:1:f:8:cf:2:ntvf:3\ncell:B11:t:[Name]:f:1:cf:2:colspan:3:rowspan:1\ncell:F11:t:INVOICE # \\c:l:1:f:5:cf:2\ncell:G11:v:1:l:1:f:8:cf:2\ncell:B12:t:[Company Name]:f:1:cf:2:colspan:3:rowspan:1\ncell:J12:tvf:4\ncell:B13:t:[Street Address]:f:1:cf:2:colspan:3:rowspan:1\ncell:B14:t:[City, State, Zip]:f:1:cf:2:colspan:3:rowspan:1\ncell:B15:t:Phone\\c :f:1:cf:2:colspan:3:rowspan:1\ncell:B16:cf:2:colspan:3:rowspan:1\ncell:A17:b::1::\ncell:B17:t:DESCRIPTION:b:1:1:1:1:l:1:f:5:bg:2:cf:1:colspan:3:rowspan:1\ncell:C17:t::b:1::1::l:1:f:7:bg:2\ncell:D17:t::b:1::1::l:1:f:7:bg:2\ncell:E17:t:HOURS:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:F17:t:RATE:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:G17:t:AMOUNT:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:A18:b::1::\ncell:B18:b:1:1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C18:t::b:2::::l:1:f:7\ncell:D18:t::b:2:2:::l:1:f:7\ncell:E18:b:1:1::1:f:1:ntvf:1\ncell:F18:b:1:1::1:f:1:ntvf:1\ncell:G18:vtf:t::IF(E18*F18>0,E18*F18,""):b:1:1:::f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C19:t::l:2:f:7\ncell:D19:t::b::2:::l:1:f:7\ncell:E19:b::1::1:f:1:ntvf:1\ncell:F19:b::1::1:f:1:ntvf:1\ncell:G19:vtf:t::IF(E19*F19>0,E19*F19,""):b::1:::f:1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C20:t::l:2:f:7\ncell:D20:t::b::2:::l:1:f:7\ncell:E20:b::1::1:f:1:ntvf:1\ncell:F20:b::1::1:f:1:ntvf:1\ncell:G20:vtf:t::IF(E20*F20>0,E20*F20,""):b::1:::f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C21:t::l:2:f:7\ncell:D21:t::b::2:::l:1:f:7\ncell:E21:b::1::1:f:1:ntvf:1\ncell:F21:b::1::1:f:1:ntvf:1\ncell:G21:vtf:t::IF(E21*F21>0,E21*F21,""):b::1:::f:1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C22:t::l:2:f:7\ncell:D22:t::b::2:::l:1:f:7\ncell:E22:b::1::1:f:1:ntvf:1\ncell:F22:b::1::1:f:1:ntvf:1\ncell:G22:vtf:t::IF(E22*F22>0,E22*F22,""):b::1:::f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C23:t::l:2:f:7\ncell:D23:t::b::2:::l:1:f:7\ncell:E23:b::1::1:f:1:ntvf:1\ncell:F23:b::1::1:f:1:ntvf:1\ncell:G23:vtf:t::IF(E23*F23>0,E23*F23,""):b::1:::f:1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C24:t::l:2:f:7\ncell:D24:t::b::2:::l:1:f:7\ncell:E24:b::1::1:f:1:ntvf:1\ncell:F24:b::1::1:f:1:ntvf:1\ncell:G24:vtf:t::IF(E24*F24>0,E24*F24,""):b::1:::f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C25:t::l:2:f:7\ncell:D25:t::b::2:::l:1:f:7\ncell:E25:b::1::1:f:1:ntvf:1\ncell:F25:b::1::1:f:1:ntvf:1\ncell:G25:vtf:t::IF(E25*F25>0,E25*F25,""):b::1:::f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C26:t::l:2:f:7\ncell:D26:t::b::2:::l:1:f:7\ncell:E26:b::1::1:f:1:ntvf:1\ncell:F26:b::1::1:f:1:ntvf:1\ncell:G26:vtf:t::IF(E26*F26>0,E26*F26,""):b::1:::f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C27:t::l:2:f:7\ncell:D27:t::b::2:::l:1:f:7\ncell:E27:b::1::1:f:1:ntvf:1\ncell:F27:b::1::1:f:1:ntvf:1\ncell:G27:vtf:t::IF(E27*F27>0,E27*F27,""):b::1:::f:1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C28:t::l:2:f:7\ncell:D28:t::b::2:::l:1:f:7\ncell:E28:b::1::1:f:1:ntvf:1\ncell:F28:b::1::1:f:1:ntvf:1\ncell:G28:vtf:t::IF(E28*F28>0,E28*F28,""):b::1:::f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C29:t::b:::2::l:1:f:7\ncell:D29:t::b::2:2::l:1:f:7\ncell:E29:b::1:1:1:f:1:ntvf:1\ncell:F29:b::1:1:1:f:1:ntvf:1\ncell:G29:vtf:t::IF(E29*F29>0,E29*F29,""):b::1:::f:1:ntvf:1\ncell:B30:b:2::::l:1:f:8:cf:1:colspan:3:rowspan:1\ncell:C30:t::b:2::::l:1:f:7\ncell:D30:t::b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:8\ncell:F30:t:Subtotal:b:1::::f:1\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::f:1:ntvf:1\ncell:B31:t:NOTES:b:::2::l:1:f:5:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:7\ncell:D31:t::b:::2::l:1:f:7\ncell:F31:t:Tax Rate:f:1\ncell:G31:v:0:f:1:ntvf:2\ncell:B32:b:1::::f:1:cf:2:colspan:3:rowspan:1\ncell:C32:t::b:2::::l:1:f:7\ncell:D32:t::b:2::::l:1:f:7\ncell:F32:t:Tax:f:1\ncell:G32:vtf:n:0:G31*G30:f:1:ntvf:1\ncell:B33:f:1:cf:2:colspan:3:rowspan:1\ncell:C33:t::l:2:f:7\ncell:D33:t::l:2:f:7\ncell:F33:t:Other:b:::1::l:1:f:1\ncell:G33:v:0:b:::1::f:1:ntvf:1\ncell:B34:f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:2:f:7\ncell:D34:t::l:2:f:7\ncell:F34:t:TOTAL:b:1::::l:1:f:4\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::::f:4:ntvf:1\ncell:B35:b:2::::l:1:f:7\ncell:C35:b:2::::l:1:f:7\ncell:D35:b:2::::l:1:f:7\ncell:C36:tvf:4:colspan:5:rowspan:7\ncol:A:w:40\ncol:B:w:194\ncol:C:w:128\ncol:D:w:60\ncol:E:w:65\ncol:F:w:95\ncol:G:w:90\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:10:r:36:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0,0,0)\ncolor:2:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 16pt Trebuchet MS\nfont:3:italic normal * Trebuchet MS\nfont:4:normal bold * Trebuchet MS\nfont:5:normal bold 10pt Trebuchet MS\nfont:6:normal bold 28pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "typeiv", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "typei!C10": true, - "typei!B2": true, - "typei!C11": true, - "typei!C12": true, - "typei!C13": true, - "typei!D9": true, - "typei!D4": true, - "typei!D6": true, - "typei!E10": true, - "typei!E11": true, - "typei!E12": true, - "typei!E13": true, - "typei!F9": true, - "typei!C16": true, - "typei!C17": true, - "typei!C18": true, - "typei!C19": true, - "typei!C20": true, - "typei!C21": true, - "typei!C22": true, - "typei!C23": true, - "typei!C24": true, - "typei!C25": true, - "typei!C26": true, - "typei!C27": true, - "typei!C28": true, - "typei!F16": true, - "typei!F17": true, - "typei!F18": true, - "typei!F19": true, - "typei!F20": true, - "typei!F21": true, - "typei!F22": true, - "typei!F23": true, - "typei!F24": true, - "typei!F25": true, - "typei!F26": true, - "typei!F27": true, - "typei!F28": true, - "typei!E35": true, - "typeii!B2": true, - "typeii!D4": true, - "typeii!C10": true, - "typeii!C11": true, - "typeii!C12": true, - "typeii!C13": true, - "typeii!D9": true, - "typeii!E10": true, - "typeii!E11": true, - "typeii!E12": true, - "typeii!E13": true, - "typeii!F9": true, - "typeii!C16": true, - "typeii!C17": true, - "typeii!C18": true, - "typeii!C19": true, - "typeii!C20": true, - "typeii!C21": true, - "typeii!C22": true, - "typeii!C23": true, - "typeii!C24": true, - "typeii!C25": true, - "typeii!C26": true, - "typeii!C27": true, - "typeii!C28": true, - "typeii!F16": true, - "typeii!F17": true, - "typeii!F18": true, - "typeii!F19": true, - "typeii!F20": true, - "typeii!F21": true, - "typeii!F22": true, - "typeii!F23": true, - "typeii!F24": true, - "typeii!F25": true, - "typeii!F26": true, - "typeii!F27": true, - "typeii!F28": true, - "typeii!G16": true, - "typeii!G17": true, - "typeii!G18": true, - "typeii!G19": true, - "typeii!G20": true, - "typeii!G21": true, - "typeii!G22": true, - "typeii!G23": true, - "typeii!G24": true, - "typeii!G25": true, - "typeii!G26": true, - "typeii!G27": true, - "typeii!G28": true, - "typeii!E35": true, - "typeiii!G9": true, - "typeiii!G10": true, - "typeiii!B2": true, - "typeiii!B3": true, - "typeiii!B4": true, - "typeiii!B5": true, - "typeiii!B6": true, - "typeiii!B7": true, - "typeiii!B8": true, - "typeiii!B9": true, - "typeiii!B11": true, - "typeiii!B12": true, - "typeiii!B13": true, - "typeiii!B14": true, - "typeiii!B15": true, - "typeiii!B18": true, - "typeiii!B19": true, - "typeiii!B20": true, - "typeiii!B21": true, - "typeiii!B22": true, - "typeiii!B23": true, - "typeiii!B24": true, - "typeiii!B25": true, - "typeiii!B26": true, - "typeiii!B27": true, - "typeiii!B28": true, - "typeiii!B29": true, - "typeiii!G18": true, - "typeiii!G19": true, - "typeiii!G20": true, - "typeiii!G21": true, - "typeiii!G22": true, - "typeiii!G23": true, - "typeiii!G24": true, - "typeiii!G25": true, - "typeiii!G26": true, - "typeiii!G27": true, - "typeiii!G28": true, - "typeiii!G29": true, - "typeiii!B32": true, - "typeiii!B33": true, - "typeiii!B34": true, - "typeiii!G31": true, - "typeiii!G33": true, - "typeiii!B37": true, - "typeiv!G9": true, - "typeiv!G10": true, - "typeiv!B2": true, - "typeiv!B3": true, - "typeiv!B4": true, - "typeiv!B5": true, - "typeiv!B6": true, - "typeiv!B7": true, - "typeiv!B8": true, - "typeiv!B11": true, - "typeiv!B12": true, - "typeiv!B13": true, - "typeiv!B14": true, - "typeiv!B15": true, - "typeiv!B16": true, - "typeiv!B18": true, - "typeiv!B19": true, - "typeiv!B20": true, - "typeiv!B21": true, - "typeiv!B22": true, - "typeiv!B23": true, - "typeiv!B24": true, - "typeiv!B25": true, - "typeiv!B26": true, - "typeiv!B27": true, - "typeiv!B28": true, - "typeiv!B29": true, - "typeiv!E18": true, - "typeiv!E19": true, - "typeiv!E20": true, - "typeiv!E21": true, - "typeiv!E22": true, - "typeiv!E23": true, - "typeiv!E24": true, - "typeiv!E25": true, - "typeiv!E26": true, - "typeiv!E27": true, - "typeiv!E28": true, - "typeiv!E29": true, - "typeiv!F18": true, - "typeiv!F19": true, - "typeiv!F2": true, - "typeiv!F20": true, - "typeiv!F21": true, - "typeiv!F22": true, - "typeiv!F23": true, - "typeiv!F24": true, - "typeiv!F25": true, - "typeiv!F26": true, - "typeiv!F27": true, - "typeiv!F28": true, - "typeiv!F29": true, - "typeiv!B32": true, - "typeiv!B33": true, - "typeiv!B34": true, - "typeiv!G31": true, - "typeiv!G33": true, - "typeiv!B37": true, - "typeii!F15": true, - "typeii!G15": true, - "typeiv!E17": true, - "typeiv!F17": true, - "typeii!D6": true, - "typeiv!G11": true, - "typei!C4": true, - "typeii!C4": true, - "typeiii!F10": true, - "typeiv!F11": true, - "typeiv!F10": true, - "typeiii!F9": true, - "typeii!C6": true, - "typei!C6": true, - "typei!F4": true, - "typeii!F4": true, - "typeiii!F4": true, - "typeiii!F2": true, - "typeiv!F4": true, - "typei!F29": true, - "typeii!H29": true, - "typeiii!G30": true, - "typeiii!G34": true, - "typeiv!G30": true, - "typeiv!G34": true, - }, - constraints: {}, - }, - }, - footers: [ - { name: "Invoice 1", index: 1, isActive: true }, - { name: "Invoice 2", index: 2, isActive: false }, - { name: "Company Invoice 1", index: 3, isActive: false }, - { name: "Company Invoice 2", index: 4, isActive: false }, - ], - }, - iPhone: { - msc: { - numsheets: 5, - currentid: "sheet1", - currentname: "inv1", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:10\ncell:C1:b:::2::l:1:f:10\ncell:D1:b:::2::l:1:f:10\ncell:E1:b:::2::l:1:f:10\ncell:F1:b:::2::l:1:f:10\ncell:G1:b:::2::l:1:f:10\ncell:A2:b::2:::l:1:f:10\ncell:B2:t:INVOICE:b:1:1:1:1:f:13:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:10\ncell:D2:t::b:2::2::l:1:f:10\ncell:E2:t::b:2::2::l:1:f:10\ncell:F2:t::b:2::2::l:1:f:10\ncell:G2:t::b:2::2::l:1:f:10\ncell:A3:b::2:::l:3:f:10\ncell:B3:b:2:::2:l:3:f:10\ncell:C3:b:2::::l:1:f:10\ncell:D3:b:2::::l:1:f:10\ncell:E3:b:2::::l:1:f:10\ncell:F3:b:2::::l:1:f:10\ncell:G3:b:2:2:::l:3:f:10\ncell:A4:b::2:::l:3:f:10\ncell:B4:b::::2:l:3:f:6\ncell:C4:t:BILL TO\\c:f:9:colspan:2\ncell:E4:f:5:cf:2\ncell:G4:b::2:::l:3:f:10\ncell:A5:b::2:::l:3:f:10\ncell:B5:b::::2:l:3:f:7\ncell:C5:t:[Name]:f:9:cf:2:colspan:3\ncell:E5:f:1:cf:2\ncell:F5:t::l:2:f:10:tvf:4:rowspan:6\ncell:G5:t::b::1:::l:2:f:10\ncell:A6:b::2:::l:3:f:10\ncell:B6:b::::2:l:3:f:7\ncell:C6:t:[Street Address]:f:9:cf:2:colspan:3\ncell:E6:f:1:cf:2\ncell:F6:l:2:f:10\ncell:G6:b::1:::l:2:f:10\ncell:A7:b::2:::l:3:f:10\ncell:B7:b::::2:l:3:f:7\ncell:C7:t:[City, State, Zip]:f:9:cf:2:colspan:3\ncell:E7:f:1:cf:2\ncell:G7:b::2:::l:3:f:10\ncell:A8:b::2:::l:3:f:10\ncell:B8:b::::2:l:3:f:7\ncell:C8:t:Phone\\c:f:9:cf:2:colspan:3\ncell:D8:f:8:cf:2\ncell:E8:f:1:cf:2\ncell:G8:b::2:::l:3:f:10\ncell:A9:b::2:::l:3:f:10\ncell:B9:b::::2:l:3:f:7\ncell:C9:t:Email\\c:f:9:cf:2:colspan:3\ncell:E9:f:1:cf:2\ncell:G9:b::2:::l:3:f:10\ncell:A10:b::2:::l:3:f:10\ncell:B10:b::::2:l:3:f:7\ncell:C10:colspan:2\ncell:G10:b::2:::l:3:f:10\ncell:A11:b::2:::l:3:f:10\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:FROM\\c:f:9:colspan:2\ncell:E11:f:8:colspan:2\ncell:G11:b::2:::l:3:f:10\ncell:A12:b::2:::l:3:f:10\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[Name]:f:9:colspan:4\ncell:E12:colspan:2\ncell:G12:b::2:::l:3:f:10\ncell:A13:b::2:::l:3:f:10\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:[Street Address]:f:9:colspan:4\ncell:E13:colspan:2\ncell:G13:b::2:::l:3:f:10\ncell:A14:b::2:::l:3:f:10\ncell:B14:b::::2:l:3:f:7\ncell:C14:t:[City, State, Zip]:f:9:colspan:4\ncell:E14:colspan:2\ncell:G14:b::2:::l:3:f:10\ncell:A15:b::2:::l:3:f:10\ncell:B15:b::::2:l:3:f:7\ncell:C15:t:Phone\\c:f:9:colspan:4\ncell:D15:f:8:cf:2:colspan:3\ncell:E15:colspan:2\ncell:G15:b::2:::l:3:f:10\ncell:A16:b::2:::l:3:f:10\ncell:B16:b::::2:l:3:f:7\ncell:C16:t:Email\\c:f:9:colspan:4\ncell:E16:colspan:2\ncell:G16:b::2:::l:3:f:10\ncell:A17:b::2:::l:3:f:10\ncell:B17:b::::2:l:3:f:6\ncell:G17:b::2:::l:3:f:10\ncell:A18:b::2:::l:3:f:10\ncell:B18:b::::2:l:3:f:10\ncell:C18:t:INVOICE #\\c:f:9:cf:2:colspan:4\ncell:D18:v:1:l:4:f:9:cf:2:colspan:3\ncell:G18:b::2:::l:3:f:10\ncell:A19:b::2:::l:3:f:10\ncell:B19:b::::2:l:3:f:10\ncell:G19:b::2:::l:3:f:10\ncell:A20:b::2:::l:3:f:10\ncell:B20:b::::2:l:3:f:10\ncell:C20:t:DATE\\c:f:9:cf:2\ncell:D20:vtf:nd:42081:TODAY():f:9:cf:2:ntvf:3:colspan:2\ncell:G20:b::2:::l:3:f:10\ncell:A21:b::2:::l:3:f:10\ncell:B21:b::::2:l:3:f:6:cf:2\ncell:C21:b:::2::l:1:f:10\ncell:D21:b:::2::l:3:f:6:cf:2\ncell:E21:b:::2::l:1:f:10\ncell:F21:b:::2::l:1:f:10\ncell:G21:b::2:::l:3:f:10\ncell:A22:b::2:::l:3:f:10\ncell:B22:b::2::2:l:3:f:10\ncell:C22:t:Description:b:1::1:1:f:9:cf:1:colspan:3\ncell:D22:t:Description:b:1::1::l:3:f:6:cf:2:colspan:2:rowspan:1\ncell:E22:t::b:2:2:2::l:1:f:10\ncell:F22:t:Amount:b:1:1:1:1:f:9:cf:1\ncell:G22:b::2::2:l:3:f:10\ncell:A23:b::2:::l:3:f:10\ncell:B23:b::2::2:l:3:f:10\ncell:C23:b:1:1::1:f:2:cf:2:colspan:3\ncell:D23:b:1:1:::l:3:f:10:cf:2:colspan:2:rowspan:1\ncell:E23:t::b:2:2:2::l:1:f:10\ncell:F23:b:1:1:::f:2:ntvf:1\ncell:G23:b::2::2:l:3:f:10\ncell:A24:b::2:::l:3:f:10\ncell:B24:b::2::2:l:3:f:10:cf:2\ncell:C24:b::1::1:f:2:cf:2:colspan:3\ncell:D24:b::1:::l:1:f:10:colspan:2\ncell:E24:l:1:f:10\ncell:F24:b::1:::f:2:ntvf:1\ncell:G24:b::2::2:l:3:f:10\ncell:A25:b::2:::l:3:f:10\ncell:B25:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C25:b::1::1:f:2:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:2:ntvf:1\ncell:G25:b::2::2:l:3:f:10\ncell:A26:b::2:::l:3:f:10\ncell:B26:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C26:b::1::1:f:2:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:2:ntvf:1\ncell:G26:b::2::2:l:3:f:10\ncell:A27:b::2:::l:3:f:10\ncell:B27:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C27:b::1::1:f:2:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:2:ntvf:1\ncell:G27:b::2::2:l:3:f:10\ncell:A28:b::2:::l:3:f:10\ncell:B28:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C28:b::1::1:f:2:cf:2:colspan:3\ncell:D28:b::1:::colspan:2\ncell:F28:b::1:::f:2:ntvf:1\ncell:G28:b::2::2:l:3:f:10\ncell:A29:b::2:::l:3:f:10\ncell:B29:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C29:b::1::1:f:2:cf:2:colspan:3\ncell:D29:b::1:::colspan:2\ncell:F29:b::1:::f:2:ntvf:1\ncell:G29:b::2::2:l:3:f:10\ncell:A30:b::2:::l:3:f:10\ncell:B30:b::2::2:l:3:f:10:cf:2\ncell:C30:b::1::1:f:2:cf:2:colspan:3\ncell:D30:b::1:::colspan:2\ncell:F30:b::1:::f:2:ntvf:1\ncell:G30:b::2::2:l:3:f:10\ncell:A31:b::2:::l:3:f:10\ncell:B31:b::2::2:l:3:f:10:cf:2\ncell:C31:b::1::1:f:2:cf:2:colspan:3\ncell:D31:b::1:::colspan:2\ncell:F31:b::1:::f:2:ntvf:1\ncell:G31:b::2::2:l:3:f:10\ncell:A32:b::2:::l:3:f:10\ncell:B32:b::2::2:l:3:f:10:cf:2\ncell:C32:b::1::1:f:2:cf:2:colspan:3\ncell:D32:b::1:::colspan:2\ncell:F32:b::1:::f:2:ntvf:1\ncell:G32:b::2::2:l:3:f:10\ncell:A33:b::2:::l:3:f:10\ncell:B33:b::2::2:l:3:f:10:cf:2\ncell:C33:b::1::1:f:2:cf:2:colspan:3\ncell:D33:b::1:::colspan:2\ncell:F33:b::1:::f:2:ntvf:1\ncell:G33:b::2::2:l:3:f:10\ncell:A34:b::2:::l:3:f:10\ncell:B34:b::2::2:l:3:f:10:cf:2\ncell:C34:b::1::1:f:2:cf:2:colspan:3\ncell:D34:b::1:::colspan:2\ncell:F34:b::1:::f:2:ntvf:1\ncell:G34:b::2::2:l:3:f:10\ncell:A35:b::2:::l:3:f:7\ncell:B35:b::2::2:l:3:f:10:cf:2\ncell:C35:b::1:1:1:f:2:cf:2:colspan:3\ncell:D35:b::1:1::l:3:f:10:cf:2:colspan:2\ncell:E35:b:::2::l:3:f:10:cf:2\ncell:F35:b::1:1::f:2:ntvf:1\ncell:G35:b::2::2:l:3:f:10\ncell:A36:b::2:::l:3:f:6\ncell:B36:b::2::2:l:3:f:6\ncell:C36:t:TOTAL:b:1:1:1:1:f:11:cf:2:colspan:3\ncell:D36:b:2::2::l:3:f:12:cf:2\ncell:E36:b:2:2:2::l:3:f:12:cf:2\ncell:F36:vtf:n:0:SUM(F23\\cF35):b:1:1:1::f:11:ntvf:1\ncell:G36:b::2::2:l:3:f:7\ncell:A37:b::2:::l:3:f:10\ncell:B37:b::::2:l:3:f:6:cf:2\ncell:C37:b:2::::l:1:f:10\ncell:D37:b:2::::l:1:f:10\ncell:E37:b:2::::l:1:f:10\ncell:F37:b:2::::l:1:f:10\ncell:G37:b::2:::l:3:f:6\ncell:A38:b::2:::l:3:f:10\ncell:B38:b::::2:l:3:f:10\ncell:G38:b::2:::l:3:f:10\ncell:A39:b::2:::l:3:f:10\ncell:B39:b::::2:l:3:f:10:cf:2\ncell:C39:t:Thank you for your business:f:4:cf:1:colspan:4\ncell:D39:t:Thank you for your business:colspan:3\ncell:E39:t:Thank you for your business:f:3:colspan:2\ncell:F39:t::l:2:f:10\ncell:G39:b::2:::l:3:f:10\ncell:A40:b::2:::l:3:f:10\ncell:B40:b::::2:l:3:f:10\ncell:G40:b::2:::l:3:f:10\ncell:A41:b::2:::l:3:f:10\ncell:B41:b:::2:2:l:3:f:10\ncell:C41:b:::2::l:3:f:10\ncell:D41:b:::2::l:3:f:10\ncell:E41:b:::2::l:3:f:10\ncell:F41:b:::2::l:3:f:10\ncell:G41:b::2:2::l:3:f:10\ncell:B42:b:1:::\ncell:C42:b:1:::\ncell:D42:b:1:::\ncell:E42:b:1:::\ncell:F42:b:1:::\ncell:G42:b:1:::\ncol:A:w:10\ncol:B:w:10\ncol:C:w:62\ncol:D:w:73\ncol:E:w:15\ncol:F:w:68\ncol:G:w:10\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:15.75\nrow:36:h:15.75\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nsheet:c:7:r:42:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:* 9pt Trebuchet MS\nfont:3:italic bold * Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Arial\nfont:7:normal bold 12pt Arial\nfont:8:normal normal * *\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 11pt Trebuchet MS\nfont:12:normal normal 12pt Arial\nfont:13:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nlayout:4:padding:* * * 4px;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv1", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - "version:1.5\ncell:B2:t:INVOICE:l:1:f:9:cf:1:colspan:6\ncell:C2:t::l:2:f:13\ncell:D2:t::l:2:f:13\ncell:E2:l:1:f:10:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:8:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:13\ncell:B3:f:6:cf:2:colspan:4\ncell:C3:t::l:2:f:13\ncell:D3:t::l:2:f:13\ncell:F3:l:1:f:7:cf:2\ncell:G3:l:1:f:14:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:14:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:14:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:3:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:7:cf:2:colspan:2\ncell:G5:l:1:f:14:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:7:cf:2:colspan:2\ncell:G6:l:1:f:14:cf:2\ncell:B7:t:FROM\\c:f:12\ncell:F7:l:1:f:7:cf:2:tvf:4:colspan:2:rowspan:6\ncell:G7:l:1:f:14:cf:2\ncell:B8:t:[Company Name]:f:3:colspan:4\ncell:F8:l:1:f:7:cf:2:colspan:2\ncell:G8:l:1:f:14:cf:2\ncell:B9:t:[Street Address]:f:1:cf:2:colspan:4\ncell:F9:l:1:f:7\ncell:G9:l:1:f:14:cf:1\ncell:B10:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:G10:l:1:f:13\ncell:B11:t:Phone\\c :f:1:cf:2:colspan:4\ncell:B12:t:Email\\c:f:1:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:11:cf:2\ncell:B15:t:[Name]:f:1:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:1:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:1:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:1:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:1:cf:2:colspan:6\ncell:B20:t:Email\\c:f:1:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:14:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:13\ncell:D22:t::l:2:f:13\ncell:E22:t::l:2:f:13\ncell:F22:t::l:2:f:13\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:14:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:b:1:1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:4\ncell:D23:t::l:2:f:4\ncell:E23:t::l:2:f:4\ncell:F23:t::b::2:::l:1:f:4\ncell:G23:b::1::1:f:4:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:4\ncell:D24:t::l:2:f:4\ncell:E24:t::l:2:f:4\ncell:F24:t::b::2:::l:1:f:4\ncell:G24:b::1::1:f:4:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:4\ncell:D25:t::l:2:f:4\ncell:E25:t::l:2:f:4\ncell:F25:t::b::2:::l:1:f:4\ncell:G25:b::1::1:f:4:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:4\ncell:D26:t::l:2:f:4\ncell:E26:t::l:2:f:4\ncell:F26:t::b::2:::l:1:f:4\ncell:G26:b::1::1:f:4:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:4\ncell:D27:t::l:2:f:4\ncell:E27:t::l:2:f:4\ncell:F27:t::b::2:::l:1:f:4\ncell:G27:b::1::1:f:4:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:4\ncell:D28:t::l:2:f:4\ncell:E28:t::l:2:f:4\ncell:F28:t::b::2:::l:1:f:4\ncell:G28:b::1::1:f:4:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:4\ncell:D29:t::l:2:f:4\ncell:E29:t::l:2:f:4\ncell:F29:t::b::2:::l:1:f:4\ncell:G29:b::1::1:f:4:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:4\ncell:D30:t::l:2:f:4\ncell:E30:t::l:2:f:4\ncell:F30:t::b::2:::l:1:f:4\ncell:G30:b::1::1:f:4:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:4\ncell:D31:t::l:2:f:4\ncell:E31:t::l:2:f:4\ncell:F31:t::b::2:::l:1:f:4\ncell:G31:b::1::1:f:4:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:4\ncell:D32:t::l:2:f:4\ncell:E32:t::l:2:f:4\ncell:F32:t::b::2:::l:1:f:4\ncell:G32:b::1::1:f:4:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C33:t::l:2:f:4\ncell:D33:t::l:2:f:4\ncell:E33:t::l:2:f:4\ncell:F33:t::b::2:::l:1:f:4\ncell:G33:b::1::1:f:4:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C34:l:2:f:4\ncell:D34:l:2:f:4\ncell:E34:l:2:f:4\ncell:F34:b::2:::l:1:f:4\ncell:G34:b::1::1:f:4:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:f:4:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:4\ncell:D35:t::b:::2::l:1:f:4\ncell:E35:t::b:::2::l:1:f:4\ncell:F35:t::b::2:2::l:1:f:4\ncell:G35:b::1:1:1:f:4:ntvf:1\ncell:B36:b:2::::l:1:f:13\ncell:C36:b:2::::l:1:f:13\ncell:D36:b:2::::l:1:f:13\ncell:E36:b:2::::l:1:f:14\ncell:F36:t:Subtotal:b:2::::l:1:f:11\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:11:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:14:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:13\ncell:D37:t::b:::2::l:1:f:13\ncell:F37:t:Tax Rate:l:1:f:11\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:13\ncell:D38:t::b:2::::l:1:f:13\ncell:F38:t:Tax:l:1:f:11\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:13\ncell:D39:t::l:2:f:13\ncell:F39:t:Other:b:::1::l:1:f:11\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:13\ncell:D40:t::l:2:f:13\ncell:F40:t:TOTAL:b:1::::l:1:f:14\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:11:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:5:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:13\ncell:D43:t::l:2:f:13\ncell:E43:t::l:2:f:13\ncell:F43:t::l:2:f:13\ncell:G43:t::l:2:f:13\ncol:A:w:10\ncol:B:w:90\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:45\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 10pt Trebuchet MS\nfont:4:* 9pt Trebuchet MS\nfont:5:italic bold 10pt Trebuchet MS\nfont:6:italic normal * Trebuchet MS\nfont:7:normal bold 10pt Trebuchet MS\nfont:8:normal bold 14pt Trebuchet MS\nfont:9:normal bold 16pt Trebuchet MS\nfont:10:normal bold 28pt Trebuchet MS\nfont:11:normal normal * Trebuchet MS\nfont:12:normal normal 10pt *\nfont:13:normal normal 10pt Arial\nfont:14:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv2", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - 'version:1.5\ncell:B2:t:INVOICE:l:1:f:12:cf:1:colspan:6\ncell:C2:t::l:2:f:10\ncell:D2:t::l:2:f:10\ncell:E2:l:1:f:8:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:10\ncell:B3:f:5:cf:2:colspan:4\ncell:C3:t::l:2:f:10\ncell:D3:t::l:2:f:10\ncell:F3:l:1:f:6:cf:2\ncell:G3:l:1:f:11:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:11:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:11:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:9:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:6:cf:2:colspan:2\ncell:G5:l:1:f:11:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:6:cf:2:colspan:2\ncell:G6:l:1:f:11:cf:2\ncell:B7:t:FROM\\c:f:11\ncell:F7:l:1:f:6:cf:2:colspan:2\ncell:G7:l:1:f:11:cf:2\ncell:B8:t:[Company Name]:f:9:colspan:4\ncell:F8:l:1:f:6:cf:2:tvf:4:colspan:2:rowspan:5\ncell:G8:l:1:f:11:cf:2\ncell:B9:t:[Street Address]:f:9:cf:2:colspan:4\ncell:F9:l:1:f:6\ncell:G9:l:1:f:11:cf:1\ncell:B10:t:[City, State, Zip]:f:9:cf:2:colspan:4\ncell:G10:l:1:f:10\ncell:B11:t:Phone\\c :f:9:cf:2:colspan:4\ncell:B12:t:Email\\c:f:9:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:9:cf:2\ncell:B15:t:[Name]:f:9:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:9:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:9:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:9:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:9:cf:2:colspan:6\ncell:B20:t:Email\\c:f:9:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:11:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:10\ncell:D22:t::l:2:f:10\ncell:E22:t::l:2:f:10\ncell:F22:t::l:2:f:10\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:11:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), sheet7!B6, inv3!B6)):b:1:1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:3\ncell:D23:t::l:2:f:3\ncell:E23:t::l:2:f:3\ncell:F23:t::b::2:::l:1:f:3\ncell:G23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), (sheet7!E6*sheet7!F6), (inv3!E6*inv3!F6))):b::1::1:f:3:ntvf:1\ncell:A24:b::1::\ncell:B24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), SHEET7!B7, INV3!B7)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:3\ncell:D24:t::l:2:f:3\ncell:E24:t::l:2:f:3\ncell:F24:t::b::2:::l:1:f:3\ncell:G24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), (SHEET7!E7*SHEET7!F7), (INV3!E7*INV3!F7))):b::1::1:f:3:ntvf:1\ncell:A25:b::1::\ncell:B25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), SHEET7!B8, INV3!B8)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:3\ncell:D25:t::l:2:f:3\ncell:E25:t::l:2:f:3\ncell:F25:t::b::2:::l:1:f:3\ncell:G25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), (SHEET7!E8*SHEET7!F8), (INV3!E8*INV3!F8))):b::1::1:f:3:ntvf:1\ncell:A26:b::1::\ncell:B26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), SHEET7!B9, INV3!B9)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:3\ncell:D26:t::l:2:f:3\ncell:E26:t::l:2:f:3\ncell:F26:t::b::2:::l:1:f:3\ncell:G26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), (SHEET7!E9*SHEET7!F9), (INV3!E9*INV3!F9))):b::1::1:f:3:ntvf:1\ncell:A27:b::1::\ncell:B27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), SHEET7!B10, INV3!B10)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:3\ncell:D27:t::l:2:f:3\ncell:E27:t::l:2:f:3\ncell:F27:t::b::2:::l:1:f:3\ncell:G27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), (SHEET7!E10*SHEET7!F10), (INV3!E10*INV3!F10))):b::1::1:f:3:ntvf:1\ncell:A28:b::1::\ncell:B28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), SHEET7!B11, INV3!B11)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:3\ncell:D28:t::l:2:f:3\ncell:E28:t::l:2:f:3\ncell:F28:t::b::2:::l:1:f:3\ncell:G28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), (SHEET7!E11*SHEET7!F11), (INV3!E11*INV3!F11))):b::1::1:f:3:ntvf:1\ncell:A29:b::1::\ncell:B29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), SHEET7!B12, INV3!B12)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:3\ncell:D29:t::l:2:f:3\ncell:E29:t::l:2:f:3\ncell:F29:t::b::2:::l:1:f:3\ncell:G29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), (SHEET7!E12*SHEET7!F12), (INV3!E12*INV3!F12))):b::1::1:f:3:ntvf:1\ncell:A30:b::1::\ncell:B30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), SHEET7!B13, INV3!B13)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:3\ncell:D30:t::l:2:f:3\ncell:E30:t::l:2:f:3\ncell:F30:t::b::2:::l:1:f:3\ncell:G30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), (SHEET7!E13*SHEET7!F13), (INV3!E13*INV3!F13))):b::1::1:f:3:ntvf:1\ncell:A31:b::1::\ncell:B31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), SHEET7!B14, INV3!B14)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:3\ncell:D31:t::l:2:f:3\ncell:E31:t::l:2:f:3\ncell:F31:t::b::2:::l:1:f:3\ncell:G31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), (SHEET7!E14*SHEET7!F14), (INV3!E14*INV3!F14))):b::1::1:f:3:ntvf:1\ncell:A32:b::1::\ncell:B32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), SHEET7!B15, INV3!B15)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:3\ncell:D32:t::l:2:f:3\ncell:E32:t::l:2:f:3\ncell:F32:t::b::2:::l:1:f:3\ncell:G32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), (SHEET7!E15*SHEET7!F15), (INV3!E15*INV3!F15))):b::1::1:f:3:ntvf:1\ncell:A33:b::1::\ncell:B33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), SHEET7!B16, INV3!B16)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C33:l:2:f:3\ncell:D33:l:2:f:3\ncell:E33:l:2:f:3\ncell:F33:b::2:::l:1:f:3\ncell:G33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), (SHEET7!E16*SHEET7!F16), (INV3!E16*INV3!F16))):b::1::1:f:3:ntvf:1\ncell:A34:b::1::\ncell:B34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), SHEET7!B17, INV3!B17)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C34:t::l:2:f:3\ncell:D34:t::l:2:f:3\ncell:E34:t::l:2:f:3\ncell:F34:t::b::2:::l:1:f:3\ncell:G34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), (SHEET7!E17*SHEET7!F17), (INV3!E17*INV3!F17))):b::1::1:f:3:ntvf:1\ncell:A35:b::1::\ncell:B35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), SHEET7!B18, INV3!B18)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:3\ncell:D35:t::b:::2::l:1:f:3\ncell:E35:t::b:::2::l:1:f:3\ncell:F35:t::b::2:2::l:1:f:3\ncell:G35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), (SHEET7!E18*SHEET7!F18), (INV3!E18*INV3!F18))):b::1::1:f:3:ntvf:1\ncell:B36:b:2::::l:1:f:10\ncell:C36:b:2::::l:1:f:10\ncell:D36:b:2::::l:1:f:10\ncell:E36:b:2::::l:1:f:11\ncell:F36:t:Subtotal:b:2::::l:1:f:9\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:9:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:11:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:10\ncell:D37:t::b:::2::l:1:f:10\ncell:F37:t:Tax Rate:l:1:f:9\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:10\ncell:D38:t::b:2::::l:1:f:10\ncell:F38:t:Tax:l:1:f:9\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:10\ncell:D39:t::l:2:f:10\ncell:F39:t:Other:b:::1::l:1:f:9\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:10\ncell:D40:t::l:2:f:10\ncell:F40:t:TOTAL:b:1::::l:1:f:11\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:9:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:4:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:10\ncell:D43:t::l:2:f:10\ncell:E43:t::l:2:f:10\ncell:F43:t::l:2:f:10\ncell:G43:t::l:2:f:10\ncol:A:w:10\ncol:B:w:65\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:53\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 9pt Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:italic normal * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 14pt Trebuchet MS\nfont:8:normal bold 28pt Trebuchet MS\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 10pt Trebuchet MS\nfont:12:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "sheet6", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Hours:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Rate:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "inv3", - hidden: "0", - }, - sheet5: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Qty.:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Price:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "sheet7", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "inv1!B2": true, - "inv1!C5": true, - "inv1!C6": true, - "inv1!C7": true, - "inv1!C8": true, - "inv1!C9": true, - "inv1!C11": true, - "inv1!C12": true, - "inv1!C13": true, - "inv1!C14": true, - "inv1!C15": true, - "inv1!C16": true, - "inv1!C18": true, - "inv1!C20": true, - "inv1!D20": true, - "inv1!C23": true, - "inv1!C24": true, - "inv1!C25": true, - "inv1!C26": true, - "inv1!C27": true, - "inv1!C28": true, - "inv1!C29": true, - "inv1!C30": true, - "inv1!C31": true, - "inv1!C32": true, - "inv1!C33": true, - "inv1!C34": true, - "inv1!C35": true, - "inv1!F23": true, - "inv1!F24": true, - "inv1!F25": true, - "inv1!F26": true, - "inv1!F27": true, - "inv1!F28": true, - "inv1!F29": true, - "inv1!F30": true, - "inv1!F31": true, - "inv1!F32": true, - "inv1!F33": true, - "inv1!F34": true, - "inv1!F35": true, - "inv2!B2": true, - "inv2!F4": true, - "inv2!G4": true, - "inv2!B5": true, - "inv2!B7": true, - "inv2!B8": true, - "inv2!B9": true, - "inv2!B10": true, - "inv2!B11": true, - "inv2!B12": true, - "inv2!B14": true, - "inv2!B15": true, - "inv2!B16": true, - "inv2!B17": true, - "inv2!B18": true, - "inv2!B19": true, - "inv2!B20": true, - "inv2!B23": true, - "inv2!B24": true, - "inv2!B25": true, - "inv2!B26": true, - "inv2!B27": true, - "inv2!B28": true, - "inv2!B29": true, - "inv2!B30": true, - "inv2!B31": true, - "inv2!B32": true, - "inv2!B33": true, - "inv2!B34": true, - "inv2!B35": true, - "inv2!G23": true, - "inv2!G24": true, - "inv2!G25": true, - "inv2!G26": true, - "inv2!G27": true, - "inv2!G28": true, - "inv2!G29": true, - "inv2!G30": true, - "inv2!G31": true, - "inv2!G32": true, - "inv2!G33": true, - "inv2!G34": true, - "inv2!G35": true, - "inv2!B38": true, - "inv2!B39": true, - "inv2!B40": true, - "inv2!F36": true, - "inv2!G37": true, - "inv2!F37": true, - "inv2!F39": true, - "inv2!G39": true, - "inv2!F38": true, - "sheet6!B2": true, - "sheet6!F4": true, - "sheet6!G4": true, - "sheet6!B5": true, - "sheet6!B7": true, - "sheet6!B8": true, - "sheet6!B9": true, - "sheet6!B10": true, - "sheet6!B11": true, - "sheet6!B12": true, - "sheet6!B14": true, - "sheet6!B15": true, - "sheet6!B16": true, - "sheet6!B17": true, - "sheet6!B18": true, - "sheet6!B19": true, - "sheet6!B20": true, - "sheet6!B38": true, - "sheet6!B39": true, - "sheet6!B40": true, - "sheet6!F36": true, - "sheet6!G37": true, - "sheet6!F37": true, - "sheet6!F39": true, - "sheet6!G39": true, - "sheet6!F38": true, - "inv3!B2": true, - "inv3!B6": true, - "inv3!B7": true, - "inv3!B8": true, - "inv3!B9": true, - "inv3!B10": true, - "inv3!B11": true, - "inv3!B12": true, - "inv3!B13": true, - "inv3!B14": true, - "inv3!B15": true, - "inv3!B16": true, - "inv3!B17": true, - "inv3!B18": true, - "inv3!E6": true, - "inv3!E7": true, - "inv3!E8": true, - "inv3!E9": true, - "inv3!E10": true, - "inv3!E11": true, - "inv3!E12": true, - "inv3!E13": true, - "inv3!E14": true, - "inv3!E15": true, - "inv3!E16": true, - "inv3!E17": true, - "inv3!E18": true, - "inv3!F6": true, - "inv3!F7": true, - "inv3!F8": true, - "inv3!F9": true, - "inv3!F10": true, - "inv3!F11": true, - "inv3!F12": true, - "inv3!F13": true, - "inv3!F14": true, - "inv3!F15": true, - "inv3!F16": true, - "inv3!F17": true, - "inv3!F18": true, - "sheet7!F6": true, - "sheet7!F7": true, - "sheet7!F8": true, - "sheet7!F9": true, - "sheet7!F10": true, - "sheet7!F11": true, - "sheet7!F12": true, - "sheet7!F13": true, - "sheet7!F14": true, - "sheet7!F15": true, - "sheet7!F16": true, - "sheet7!F17": true, - "sheet7!F18": true, - "sheet7!E6": true, - "sheet7!E7": true, - "sheet7!E8": true, - "sheet7!E9": true, - "sheet7!E10": true, - "sheet7!E11": true, - "sheet7!E12": true, - "sheet7!E13": true, - "sheet7!E14": true, - "sheet7!E15": true, - "sheet7!E16": true, - "sheet7!E17": true, - "sheet7!E18": true, - "sheet7!B6": true, - "sheet7!B2": true, - "sheet7!B7": true, - "sheet7!B8": true, - "sheet7!B9": true, - "sheet7!B10": true, - "sheet7!B11": true, - "sheet7!B12": true, - "sheet7!B13": true, - "sheet7!B14": true, - "sheet7!B15": true, - "sheet7!B16": true, - "sheet7!B17": true, - "sheet7!B18": true, - "inv1!D8": true, - "inv1!D15": true, - "inv1!D18": true, - "inv2!C5": true, - "sheet6!C5": true, - }, - constraints: { - "inv1!C5": ["prompttext", "0", "1e10", "Name"], - "inv1!C6": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C7": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C8": ["prompttext", "0", "1e10", "Phone"], - "inv1!C9": ["promptemail", "0", "1e10", "Email"], - "inv1!C11": ["prompttext", "0", "1e10", "From"], - "inv1!C12": ["prompttext", "0", "1e10", "Name"], - "inv1!C13": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C14": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C15": ["prompttext", "0", "1e10", "Phone"], - "inv1!C16": ["promptemail", "0", "1e10", "Email"], - "inv1!C18": ["prompttext", "0", "1e10", "Invoice #"], - "inv1!C20": ["prompttext", "0", "1e10", "Date"], - "inv1!D20": ["prompttext", "0", "1e10", "Date"], - "inv1!C23": ["prompttext", "0", "1e10", "Description"], - "inv1!C24": ["prompttext", "0", "1e10", "Description"], - "inv1!C25": ["prompttext", "0", "1e10", "Description"], - "inv1!C26": ["prompttext", "0", "1e10", "Description"], - "inv1!C27": ["prompttext", "0", "1e10", "Description"], - "inv1!C28": ["prompttext", "0", "1e10", "Description"], - "inv1!C29": ["prompttext", "0", "1e10", "Description"], - "inv1!C30": ["prompttext", "0", "1e10", "Description"], - "inv1!C31": ["prompttext", "0", "1e10", "Description"], - "inv1!C32": ["prompttext", "0", "1e10", "Description"], - "inv1!C33": ["prompttext", "0", "1e10", "Description"], - "inv1!C34": ["prompttext", "0", "1e10", "Description"], - "inv1!C35": ["prompttext", "0", "1e10", "Description"], - "inv1!F23": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F24": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F25": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F26": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F27": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F28": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F29": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F30": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F31": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F32": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F33": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F34": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B2": ["prompttext", "0", "1e10", "Invoice"], - "inv2!F4": ["prompttext", "0", "1e10", "Date"], - "inv2!G4": ["prompttext", "0", "1e10", "Date"], - "inv2!B5": ["prompttext", "0", "1e10", "Invoice #"], - "inv2!B7": ["prompttext", "0", "1e10", "From"], - "inv2!B8": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B9": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B11": ["prompttext", "0", "1e10", "Phone"], - "inv2!B12": ["promptemail", "0", "1e10", "Email"], - "inv2!B14": ["prompttext", "0", "1e10", "Bill To"], - "inv2!B15": ["prompttext", "0", "1e10", "Name"], - "inv2!B16": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B17": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B19": ["prompttext", "0", "1e10", "Phone"], - "inv2!B20": ["promptemail", "0", "1e10", "Email"], - "inv2!B23": ["prompttext", "0", "1e10", "Description"], - "inv2!B24": ["prompttext", "0", "1e10", "Description"], - "inv2!B25": ["prompttext", "0", "1e10", "Description"], - "inv2!B26": ["prompttext", "0", "1e10", "Description"], - "inv2!B27": ["prompttext", "0", "1e10", "Description"], - "inv2!B28": ["prompttext", "0", "1e10", "Description"], - "inv2!B29": ["prompttext", "0", "1e10", "Description"], - "inv2!B30": ["prompttext", "0", "1e10", "Description"], - "inv2!B31": ["prompttext", "0", "1e10", "Description"], - "inv2!B32": ["prompttext", "0", "1e10", "Description"], - "inv2!B33": ["prompttext", "0", "1e10", "Description"], - "inv2!B34": ["prompttext", "0", "1e10", "Description"], - "inv2!B35": ["prompttext", "0", "1e10", "Description"], - "inv2!G23": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G24": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G25": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G26": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G27": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G28": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G29": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G30": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G31": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G32": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G33": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G34": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B38": ["prompttext", "0", "1e10", "Notes"], - "inv2!B39": ["prompttext", "0", "1e10", "Notes"], - "inv2!B40": ["prompttext", "0", "1e10", "Notes"], - "inv2!F36": ["prompttext", "0", "1e10", "Subtotal"], - "inv2!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "inv2!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "inv2!F39": ["prompttext", "0", "1e10", "Other"], - "inv2!G39": ["promptdecimal", "0", "1e10", "Other"], - "inv2!F38": ["prompttext", "0", "1e10", "Tax"], - "sheet6!B2": ["prompttext", "0", "1e10", "Invoice"], - "sheet6!F4": ["prompttext", "0", "1e10", "Date"], - "sheet6!G4": ["prompttext", "0", "1e10", "Date"], - "sheet6!B5": ["prompttext", "0", "1e10", "Invoice #"], - "sheet6!B7": ["prompttext", "0", "1e10", "From"], - "sheet6!B8": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B9": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B11": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B12": ["promptemail", "0", "1e10", "Email"], - "sheet6!B14": ["prompttext", "0", "1e10", "Bill To"], - "sheet6!B15": ["prompttext", "0", "1e10", "Name"], - "sheet6!B16": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B17": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B19": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B20": ["promptemail", "0", "1e10", "Email"], - "sheet6!B38": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B39": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B40": ["prompttext", "0", "1e10", "Notes"], - "sheet6!F36": ["prompttext", "0", "1e10", "Subtotal"], - "sheet6!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "sheet6!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "sheet6!F39": ["prompttext", "0", "1e10", "Other"], - "sheet6!G39": ["promptdecimal", "0", "1e10", "Other"], - "sheet6!F38": ["prompttext", "0", "1e10", "Tax"], - "inv3!B6": ["prompttext", "0", "1e10", "Description"], - "inv3!B7": ["prompttext", "0", "1e10", "Description"], - "inv3!B8": ["prompttext", "0", "1e10", "Description"], - "inv3!B9": ["prompttext", "0", "1e10", "Description"], - "inv3!B10": ["prompttext", "0", "1e10", "Description"], - "inv3!B11": ["prompttext", "0", "1e10", "Description"], - "inv3!B12": ["prompttext", "0", "1e10", "Description"], - "inv3!B13": ["prompttext", "0", "1e10", "Description"], - "inv3!B14": ["prompttext", "0", "1e10", "Description"], - "inv3!B15": ["prompttext", "0", "1e10", "Description"], - "inv3!B16": ["prompttext", "0", "1e10", "Description"], - "inv3!B17": ["prompttext", "0", "1e10", "Description"], - "inv3!B18": ["prompttext", "0", "1e10", "Description"], - "sheet7!B6": ["prompttext", "0", "1e10", "Description"], - "sheet7!B7": ["prompttext", "0", "1e10", "Description"], - "sheet7!B8": ["prompttext", "0", "1e10", "Description"], - "sheet7!B9": ["prompttext", "0", "1e10", "Description"], - "sheet7!B10": ["prompttext", "0", "1e10", "Description"], - "sheet7!B11": ["prompttext", "0", "1e10", "Description"], - "sheet7!B12": ["prompttext", "0", "1e10", "Description"], - "sheet7!B13": ["prompttext", "0", "1e10", "Description"], - "sheet7!B14": ["prompttext", "0", "1e10", "Description"], - "sheet7!B15": ["prompttext", "0", "1e10", "Description"], - "sheet7!B16": ["prompttext", "0", "1e10", "Description"], - "sheet7!B17": ["prompttext", "0", "1e10", "Description"], - "sheet7!B18": ["prompttext", "0", "1e10", "Description"], - "inv1!D8": ["prompttext", "0", "1e10", "Phone"], - "inv1!D15": ["prompttext", "0", "1e10", "Phone"], - "inv1!D18": ["promptnumeric", "0", "1e10", "Invoice#"], - "inv2!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet6!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet7!E6": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E7": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E8": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E9": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E10": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E11": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E12": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E13": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E14": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E15": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E16": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E17": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E18": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!F6": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F7": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F8": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F9": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F10": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F11": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F12": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F13": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F14": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F15": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F16": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F17": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F18": ["promptdecimal", "0", "1e10", "Price"], - "inv3!E6": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E7": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E8": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E9": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E10": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E11": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E12": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E13": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E14": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E15": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E16": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E17": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E18": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!F6": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F7": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F8": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F9": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F10": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F11": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F12": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F13": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F14": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F15": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F16": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F17": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F18": ["promptdecimal", "0", "1e10", "Rate"], - }, - }, - }, - footers: [ - { name: "Type1", index: 1, isActive: true }, - { name: "Type2", index: 2, isActive: false }, - { name: "Type3", index: 3, isActive: false }, - { name: "Detail1", index: 4, isActive: false }, - { name: "Detail2", index: 5, isActive: false }, - ], - }, - iPod: { - msc: { - numsheets: 5, - currentid: "sheet1", - currentname: "inv1", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:10\ncell:C1:b:::2::l:1:f:10\ncell:D1:b:::2::l:1:f:10\ncell:E1:b:::2::l:1:f:10\ncell:F1:b:::2::l:1:f:10\ncell:G1:b:::2::l:1:f:10\ncell:A2:b::2:::l:1:f:10\ncell:B2:t:INVOICE:b:1:1:1:1:f:13:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:10\ncell:D2:t::b:2::2::l:1:f:10\ncell:E2:t::b:2::2::l:1:f:10\ncell:F2:t::b:2::2::l:1:f:10\ncell:G2:t::b:2::2::l:1:f:10\ncell:A3:b::2:::l:3:f:10\ncell:B3:b:2:::2:l:3:f:10\ncell:C3:b:2::::l:1:f:10\ncell:D3:b:2::::l:1:f:10\ncell:E3:b:2::::l:1:f:10\ncell:F3:b:2::::l:1:f:10\ncell:G3:b:2:2:::l:3:f:10\ncell:A4:b::2:::l:3:f:10\ncell:B4:b::::2:l:3:f:6\ncell:C4:t:BILL TO\\c:f:9:colspan:2\ncell:E4:f:5:cf:2\ncell:G4:b::2:::l:3:f:10\ncell:A5:b::2:::l:3:f:10\ncell:B5:b::::2:l:3:f:7\ncell:C5:t:[Name]:f:9:cf:2:colspan:3\ncell:E5:f:1:cf:2\ncell:F5:t::l:2:f:10:tvf:4:rowspan:6\ncell:G5:t::b::1:::l:2:f:10\ncell:A6:b::2:::l:3:f:10\ncell:B6:b::::2:l:3:f:7\ncell:C6:t:[Street Address]:f:9:cf:2:colspan:3\ncell:E6:f:1:cf:2\ncell:F6:l:2:f:10\ncell:G6:b::1:::l:2:f:10\ncell:A7:b::2:::l:3:f:10\ncell:B7:b::::2:l:3:f:7\ncell:C7:t:[City, State, Zip]:f:9:cf:2:colspan:3\ncell:E7:f:1:cf:2\ncell:G7:b::2:::l:3:f:10\ncell:A8:b::2:::l:3:f:10\ncell:B8:b::::2:l:3:f:7\ncell:C8:t:Phone\\c:f:9:cf:2:colspan:3\ncell:D8:f:8:cf:2\ncell:E8:f:1:cf:2\ncell:G8:b::2:::l:3:f:10\ncell:A9:b::2:::l:3:f:10\ncell:B9:b::::2:l:3:f:7\ncell:C9:t:Email\\c:f:9:cf:2:colspan:3\ncell:E9:f:1:cf:2\ncell:G9:b::2:::l:3:f:10\ncell:A10:b::2:::l:3:f:10\ncell:B10:b::::2:l:3:f:7\ncell:C10:colspan:2\ncell:G10:b::2:::l:3:f:10\ncell:A11:b::2:::l:3:f:10\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:FROM\\c:f:9:colspan:2\ncell:E11:f:8:colspan:2\ncell:G11:b::2:::l:3:f:10\ncell:A12:b::2:::l:3:f:10\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[Name]:f:9:colspan:4\ncell:E12:colspan:2\ncell:G12:b::2:::l:3:f:10\ncell:A13:b::2:::l:3:f:10\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:[Street Address]:f:9:colspan:4\ncell:E13:colspan:2\ncell:G13:b::2:::l:3:f:10\ncell:A14:b::2:::l:3:f:10\ncell:B14:b::::2:l:3:f:7\ncell:C14:t:[City, State, Zip]:f:9:colspan:4\ncell:E14:colspan:2\ncell:G14:b::2:::l:3:f:10\ncell:A15:b::2:::l:3:f:10\ncell:B15:b::::2:l:3:f:7\ncell:C15:t:Phone\\c:f:9:colspan:4\ncell:D15:f:8:cf:2:colspan:3\ncell:E15:colspan:2\ncell:G15:b::2:::l:3:f:10\ncell:A16:b::2:::l:3:f:10\ncell:B16:b::::2:l:3:f:7\ncell:C16:t:Email\\c:f:9:colspan:4\ncell:E16:colspan:2\ncell:G16:b::2:::l:3:f:10\ncell:A17:b::2:::l:3:f:10\ncell:B17:b::::2:l:3:f:6\ncell:G17:b::2:::l:3:f:10\ncell:A18:b::2:::l:3:f:10\ncell:B18:b::::2:l:3:f:10\ncell:C18:t:INVOICE #\\c:f:9:cf:2:colspan:4\ncell:D18:v:1:l:4:f:9:cf:2:colspan:3\ncell:G18:b::2:::l:3:f:10\ncell:A19:b::2:::l:3:f:10\ncell:B19:b::::2:l:3:f:10\ncell:G19:b::2:::l:3:f:10\ncell:A20:b::2:::l:3:f:10\ncell:B20:b::::2:l:3:f:10\ncell:C20:t:DATE\\c:f:9:cf:2\ncell:D20:vtf:nd:42081:TODAY():f:9:cf:2:ntvf:3:colspan:2\ncell:G20:b::2:::l:3:f:10\ncell:A21:b::2:::l:3:f:10\ncell:B21:b::::2:l:3:f:6:cf:2\ncell:C21:b:::2::l:1:f:10\ncell:D21:b:::2::l:3:f:6:cf:2\ncell:E21:b:::2::l:1:f:10\ncell:F21:b:::2::l:1:f:10\ncell:G21:b::2:::l:3:f:10\ncell:A22:b::2:::l:3:f:10\ncell:B22:b::2::2:l:3:f:10\ncell:C22:t:Description:b:1::1:1:f:9:cf:1:colspan:3\ncell:D22:t:Description:b:1::1::l:3:f:6:cf:2:colspan:2:rowspan:1\ncell:E22:t::b:2:2:2::l:1:f:10\ncell:F22:t:Amount:b:1:1:1:1:f:9:cf:1\ncell:G22:b::2::2:l:3:f:10\ncell:A23:b::2:::l:3:f:10\ncell:B23:b::2::2:l:3:f:10\ncell:C23:b:1:1::1:f:2:cf:2:colspan:3\ncell:D23:b:1:1:::l:3:f:10:cf:2:colspan:2:rowspan:1\ncell:E23:t::b:2:2:2::l:1:f:10\ncell:F23:b:1:1:::f:2:ntvf:1\ncell:G23:b::2::2:l:3:f:10\ncell:A24:b::2:::l:3:f:10\ncell:B24:b::2::2:l:3:f:10:cf:2\ncell:C24:b::1::1:f:2:cf:2:colspan:3\ncell:D24:b::1:::l:1:f:10:colspan:2\ncell:E24:l:1:f:10\ncell:F24:b::1:::f:2:ntvf:1\ncell:G24:b::2::2:l:3:f:10\ncell:A25:b::2:::l:3:f:10\ncell:B25:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C25:b::1::1:f:2:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:2:ntvf:1\ncell:G25:b::2::2:l:3:f:10\ncell:A26:b::2:::l:3:f:10\ncell:B26:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C26:b::1::1:f:2:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:2:ntvf:1\ncell:G26:b::2::2:l:3:f:10\ncell:A27:b::2:::l:3:f:10\ncell:B27:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C27:b::1::1:f:2:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:2:ntvf:1\ncell:G27:b::2::2:l:3:f:10\ncell:A28:b::2:::l:3:f:10\ncell:B28:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C28:b::1::1:f:2:cf:2:colspan:3\ncell:D28:b::1:::colspan:2\ncell:F28:b::1:::f:2:ntvf:1\ncell:G28:b::2::2:l:3:f:10\ncell:A29:b::2:::l:3:f:10\ncell:B29:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C29:b::1::1:f:2:cf:2:colspan:3\ncell:D29:b::1:::colspan:2\ncell:F29:b::1:::f:2:ntvf:1\ncell:G29:b::2::2:l:3:f:10\ncell:A30:b::2:::l:3:f:10\ncell:B30:b::2::2:l:3:f:10:cf:2\ncell:C30:b::1::1:f:2:cf:2:colspan:3\ncell:D30:b::1:::colspan:2\ncell:F30:b::1:::f:2:ntvf:1\ncell:G30:b::2::2:l:3:f:10\ncell:A31:b::2:::l:3:f:10\ncell:B31:b::2::2:l:3:f:10:cf:2\ncell:C31:b::1::1:f:2:cf:2:colspan:3\ncell:D31:b::1:::colspan:2\ncell:F31:b::1:::f:2:ntvf:1\ncell:G31:b::2::2:l:3:f:10\ncell:A32:b::2:::l:3:f:10\ncell:B32:b::2::2:l:3:f:10:cf:2\ncell:C32:b::1::1:f:2:cf:2:colspan:3\ncell:D32:b::1:::colspan:2\ncell:F32:b::1:::f:2:ntvf:1\ncell:G32:b::2::2:l:3:f:10\ncell:A33:b::2:::l:3:f:10\ncell:B33:b::2::2:l:3:f:10:cf:2\ncell:C33:b::1::1:f:2:cf:2:colspan:3\ncell:D33:b::1:::colspan:2\ncell:F33:b::1:::f:2:ntvf:1\ncell:G33:b::2::2:l:3:f:10\ncell:A34:b::2:::l:3:f:10\ncell:B34:b::2::2:l:3:f:10:cf:2\ncell:C34:b::1::1:f:2:cf:2:colspan:3\ncell:D34:b::1:::colspan:2\ncell:F34:b::1:::f:2:ntvf:1\ncell:G34:b::2::2:l:3:f:10\ncell:A35:b::2:::l:3:f:7\ncell:B35:b::2::2:l:3:f:10:cf:2\ncell:C35:b::1:1:1:f:2:cf:2:colspan:3\ncell:D35:b::1:1::l:3:f:10:cf:2:colspan:2\ncell:E35:b:::2::l:3:f:10:cf:2\ncell:F35:b::1:1::f:2:ntvf:1\ncell:G35:b::2::2:l:3:f:10\ncell:A36:b::2:::l:3:f:6\ncell:B36:b::2::2:l:3:f:6\ncell:C36:t:TOTAL:b:1:1:1:1:f:11:cf:2:colspan:3\ncell:D36:b:2::2::l:3:f:12:cf:2\ncell:E36:b:2:2:2::l:3:f:12:cf:2\ncell:F36:vtf:n:0:SUM(F23\\cF35):b:1:1:1::f:11:ntvf:1\ncell:G36:b::2::2:l:3:f:7\ncell:A37:b::2:::l:3:f:10\ncell:B37:b::::2:l:3:f:6:cf:2\ncell:C37:b:2::::l:1:f:10\ncell:D37:b:2::::l:1:f:10\ncell:E37:b:2::::l:1:f:10\ncell:F37:b:2::::l:1:f:10\ncell:G37:b::2:::l:3:f:6\ncell:A38:b::2:::l:3:f:10\ncell:B38:b::::2:l:3:f:10\ncell:G38:b::2:::l:3:f:10\ncell:A39:b::2:::l:3:f:10\ncell:B39:b::::2:l:3:f:10:cf:2\ncell:C39:t:Thank you for your business:f:4:cf:1:colspan:4\ncell:D39:t:Thank you for your business:colspan:3\ncell:E39:t:Thank you for your business:f:3:colspan:2\ncell:F39:t::l:2:f:10\ncell:G39:b::2:::l:3:f:10\ncell:A40:b::2:::l:3:f:10\ncell:B40:b::::2:l:3:f:10\ncell:G40:b::2:::l:3:f:10\ncell:A41:b::2:::l:3:f:10\ncell:B41:b:::2:2:l:3:f:10\ncell:C41:b:::2::l:3:f:10\ncell:D41:b:::2::l:3:f:10\ncell:E41:b:::2::l:3:f:10\ncell:F41:b:::2::l:3:f:10\ncell:G41:b::2:2::l:3:f:10\ncell:B42:b:1:::\ncell:C42:b:1:::\ncell:D42:b:1:::\ncell:E42:b:1:::\ncell:F42:b:1:::\ncell:G42:b:1:::\ncol:A:w:10\ncol:B:w:10\ncol:C:w:62\ncol:D:w:73\ncol:E:w:15\ncol:F:w:68\ncol:G:w:10\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:15.75\nrow:36:h:15.75\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nsheet:c:7:r:42:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:* 9pt Trebuchet MS\nfont:3:italic bold * Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Arial\nfont:7:normal bold 12pt Arial\nfont:8:normal normal * *\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 11pt Trebuchet MS\nfont:12:normal normal 12pt Arial\nfont:13:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nlayout:4:padding:* * * 4px;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv1", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - "version:1.5\ncell:B2:t:INVOICE:l:1:f:9:cf:1:colspan:6\ncell:C2:t::l:2:f:13\ncell:D2:t::l:2:f:13\ncell:E2:l:1:f:10:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:8:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:13\ncell:B3:f:6:cf:2:colspan:4\ncell:C3:t::l:2:f:13\ncell:D3:t::l:2:f:13\ncell:F3:l:1:f:7:cf:2\ncell:G3:l:1:f:14:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:14:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:14:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:3:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:7:cf:2:colspan:2\ncell:G5:l:1:f:14:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:7:cf:2:colspan:2\ncell:G6:l:1:f:14:cf:2\ncell:B7:t:FROM\\c:f:12\ncell:F7:l:1:f:7:cf:2:tvf:4:colspan:2:rowspan:6\ncell:G7:l:1:f:14:cf:2\ncell:B8:t:[Company Name]:f:3:colspan:4\ncell:F8:l:1:f:7:cf:2:colspan:2\ncell:G8:l:1:f:14:cf:2\ncell:B9:t:[Street Address]:f:1:cf:2:colspan:4\ncell:F9:l:1:f:7\ncell:G9:l:1:f:14:cf:1\ncell:B10:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:G10:l:1:f:13\ncell:B11:t:Phone\\c :f:1:cf:2:colspan:4\ncell:B12:t:Email\\c:f:1:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:11:cf:2\ncell:B15:t:[Name]:f:1:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:1:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:1:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:1:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:1:cf:2:colspan:6\ncell:B20:t:Email\\c:f:1:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:14:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:13\ncell:D22:t::l:2:f:13\ncell:E22:t::l:2:f:13\ncell:F22:t::l:2:f:13\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:14:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:b:1:1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:4\ncell:D23:t::l:2:f:4\ncell:E23:t::l:2:f:4\ncell:F23:t::b::2:::l:1:f:4\ncell:G23:b::1::1:f:4:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:4\ncell:D24:t::l:2:f:4\ncell:E24:t::l:2:f:4\ncell:F24:t::b::2:::l:1:f:4\ncell:G24:b::1::1:f:4:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:4\ncell:D25:t::l:2:f:4\ncell:E25:t::l:2:f:4\ncell:F25:t::b::2:::l:1:f:4\ncell:G25:b::1::1:f:4:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:4\ncell:D26:t::l:2:f:4\ncell:E26:t::l:2:f:4\ncell:F26:t::b::2:::l:1:f:4\ncell:G26:b::1::1:f:4:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:4\ncell:D27:t::l:2:f:4\ncell:E27:t::l:2:f:4\ncell:F27:t::b::2:::l:1:f:4\ncell:G27:b::1::1:f:4:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:4\ncell:D28:t::l:2:f:4\ncell:E28:t::l:2:f:4\ncell:F28:t::b::2:::l:1:f:4\ncell:G28:b::1::1:f:4:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:4\ncell:D29:t::l:2:f:4\ncell:E29:t::l:2:f:4\ncell:F29:t::b::2:::l:1:f:4\ncell:G29:b::1::1:f:4:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:4\ncell:D30:t::l:2:f:4\ncell:E30:t::l:2:f:4\ncell:F30:t::b::2:::l:1:f:4\ncell:G30:b::1::1:f:4:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:4\ncell:D31:t::l:2:f:4\ncell:E31:t::l:2:f:4\ncell:F31:t::b::2:::l:1:f:4\ncell:G31:b::1::1:f:4:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:4\ncell:D32:t::l:2:f:4\ncell:E32:t::l:2:f:4\ncell:F32:t::b::2:::l:1:f:4\ncell:G32:b::1::1:f:4:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C33:t::l:2:f:4\ncell:D33:t::l:2:f:4\ncell:E33:t::l:2:f:4\ncell:F33:t::b::2:::l:1:f:4\ncell:G33:b::1::1:f:4:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C34:l:2:f:4\ncell:D34:l:2:f:4\ncell:E34:l:2:f:4\ncell:F34:b::2:::l:1:f:4\ncell:G34:b::1::1:f:4:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:f:4:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:4\ncell:D35:t::b:::2::l:1:f:4\ncell:E35:t::b:::2::l:1:f:4\ncell:F35:t::b::2:2::l:1:f:4\ncell:G35:b::1:1:1:f:4:ntvf:1\ncell:B36:b:2::::l:1:f:13\ncell:C36:b:2::::l:1:f:13\ncell:D36:b:2::::l:1:f:13\ncell:E36:b:2::::l:1:f:14\ncell:F36:t:Subtotal:b:2::::l:1:f:11\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:11:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:14:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:13\ncell:D37:t::b:::2::l:1:f:13\ncell:F37:t:Tax Rate:l:1:f:11\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:13\ncell:D38:t::b:2::::l:1:f:13\ncell:F38:t:Tax:l:1:f:11\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:13\ncell:D39:t::l:2:f:13\ncell:F39:t:Other:b:::1::l:1:f:11\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:13\ncell:D40:t::l:2:f:13\ncell:F40:t:TOTAL:b:1::::l:1:f:14\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:11:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:5:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:13\ncell:D43:t::l:2:f:13\ncell:E43:t::l:2:f:13\ncell:F43:t::l:2:f:13\ncell:G43:t::l:2:f:13\ncol:A:w:10\ncol:B:w:90\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:45\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 10pt Trebuchet MS\nfont:4:* 9pt Trebuchet MS\nfont:5:italic bold 10pt Trebuchet MS\nfont:6:italic normal * Trebuchet MS\nfont:7:normal bold 10pt Trebuchet MS\nfont:8:normal bold 14pt Trebuchet MS\nfont:9:normal bold 16pt Trebuchet MS\nfont:10:normal bold 28pt Trebuchet MS\nfont:11:normal normal * Trebuchet MS\nfont:12:normal normal 10pt *\nfont:13:normal normal 10pt Arial\nfont:14:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv2", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - 'version:1.5\ncell:B2:t:INVOICE:l:1:f:12:cf:1:colspan:6\ncell:C2:t::l:2:f:10\ncell:D2:t::l:2:f:10\ncell:E2:l:1:f:8:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:10\ncell:B3:f:5:cf:2:colspan:4\ncell:C3:t::l:2:f:10\ncell:D3:t::l:2:f:10\ncell:F3:l:1:f:6:cf:2\ncell:G3:l:1:f:11:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:11:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:11:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:9:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:6:cf:2:colspan:2\ncell:G5:l:1:f:11:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:6:cf:2:colspan:2\ncell:G6:l:1:f:11:cf:2\ncell:B7:t:FROM\\c:f:11\ncell:F7:l:1:f:6:cf:2:colspan:2\ncell:G7:l:1:f:11:cf:2\ncell:B8:t:[Company Name]:f:9:colspan:4\ncell:F8:l:1:f:6:cf:2:tvf:4:colspan:2:rowspan:5\ncell:G8:l:1:f:11:cf:2\ncell:B9:t:[Street Address]:f:9:cf:2:colspan:4\ncell:F9:l:1:f:6\ncell:G9:l:1:f:11:cf:1\ncell:B10:t:[City, State, Zip]:f:9:cf:2:colspan:4\ncell:G10:l:1:f:10\ncell:B11:t:Phone\\c :f:9:cf:2:colspan:4\ncell:B12:t:Email\\c:f:9:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:9:cf:2\ncell:B15:t:[Name]:f:9:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:9:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:9:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:9:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:9:cf:2:colspan:6\ncell:B20:t:Email\\c:f:9:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:11:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:10\ncell:D22:t::l:2:f:10\ncell:E22:t::l:2:f:10\ncell:F22:t::l:2:f:10\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:11:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), sheet7!B6, inv3!B6)):b:1:1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:3\ncell:D23:t::l:2:f:3\ncell:E23:t::l:2:f:3\ncell:F23:t::b::2:::l:1:f:3\ncell:G23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), (sheet7!E6*sheet7!F6), (inv3!E6*inv3!F6))):b::1::1:f:3:ntvf:1\ncell:A24:b::1::\ncell:B24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), SHEET7!B7, INV3!B7)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:3\ncell:D24:t::l:2:f:3\ncell:E24:t::l:2:f:3\ncell:F24:t::b::2:::l:1:f:3\ncell:G24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), (SHEET7!E7*SHEET7!F7), (INV3!E7*INV3!F7))):b::1::1:f:3:ntvf:1\ncell:A25:b::1::\ncell:B25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), SHEET7!B8, INV3!B8)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:3\ncell:D25:t::l:2:f:3\ncell:E25:t::l:2:f:3\ncell:F25:t::b::2:::l:1:f:3\ncell:G25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), (SHEET7!E8*SHEET7!F8), (INV3!E8*INV3!F8))):b::1::1:f:3:ntvf:1\ncell:A26:b::1::\ncell:B26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), SHEET7!B9, INV3!B9)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:3\ncell:D26:t::l:2:f:3\ncell:E26:t::l:2:f:3\ncell:F26:t::b::2:::l:1:f:3\ncell:G26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), (SHEET7!E9*SHEET7!F9), (INV3!E9*INV3!F9))):b::1::1:f:3:ntvf:1\ncell:A27:b::1::\ncell:B27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), SHEET7!B10, INV3!B10)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:3\ncell:D27:t::l:2:f:3\ncell:E27:t::l:2:f:3\ncell:F27:t::b::2:::l:1:f:3\ncell:G27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), (SHEET7!E10*SHEET7!F10), (INV3!E10*INV3!F10))):b::1::1:f:3:ntvf:1\ncell:A28:b::1::\ncell:B28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), SHEET7!B11, INV3!B11)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:3\ncell:D28:t::l:2:f:3\ncell:E28:t::l:2:f:3\ncell:F28:t::b::2:::l:1:f:3\ncell:G28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), (SHEET7!E11*SHEET7!F11), (INV3!E11*INV3!F11))):b::1::1:f:3:ntvf:1\ncell:A29:b::1::\ncell:B29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), SHEET7!B12, INV3!B12)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:3\ncell:D29:t::l:2:f:3\ncell:E29:t::l:2:f:3\ncell:F29:t::b::2:::l:1:f:3\ncell:G29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), (SHEET7!E12*SHEET7!F12), (INV3!E12*INV3!F12))):b::1::1:f:3:ntvf:1\ncell:A30:b::1::\ncell:B30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), SHEET7!B13, INV3!B13)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:3\ncell:D30:t::l:2:f:3\ncell:E30:t::l:2:f:3\ncell:F30:t::b::2:::l:1:f:3\ncell:G30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), (SHEET7!E13*SHEET7!F13), (INV3!E13*INV3!F13))):b::1::1:f:3:ntvf:1\ncell:A31:b::1::\ncell:B31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), SHEET7!B14, INV3!B14)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:3\ncell:D31:t::l:2:f:3\ncell:E31:t::l:2:f:3\ncell:F31:t::b::2:::l:1:f:3\ncell:G31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), (SHEET7!E14*SHEET7!F14), (INV3!E14*INV3!F14))):b::1::1:f:3:ntvf:1\ncell:A32:b::1::\ncell:B32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), SHEET7!B15, INV3!B15)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:3\ncell:D32:t::l:2:f:3\ncell:E32:t::l:2:f:3\ncell:F32:t::b::2:::l:1:f:3\ncell:G32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), (SHEET7!E15*SHEET7!F15), (INV3!E15*INV3!F15))):b::1::1:f:3:ntvf:1\ncell:A33:b::1::\ncell:B33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), SHEET7!B16, INV3!B16)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C33:l:2:f:3\ncell:D33:l:2:f:3\ncell:E33:l:2:f:3\ncell:F33:b::2:::l:1:f:3\ncell:G33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), (SHEET7!E16*SHEET7!F16), (INV3!E16*INV3!F16))):b::1::1:f:3:ntvf:1\ncell:A34:b::1::\ncell:B34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), SHEET7!B17, INV3!B17)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C34:t::l:2:f:3\ncell:D34:t::l:2:f:3\ncell:E34:t::l:2:f:3\ncell:F34:t::b::2:::l:1:f:3\ncell:G34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), (SHEET7!E17*SHEET7!F17), (INV3!E17*INV3!F17))):b::1::1:f:3:ntvf:1\ncell:A35:b::1::\ncell:B35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), SHEET7!B18, INV3!B18)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:3\ncell:D35:t::b:::2::l:1:f:3\ncell:E35:t::b:::2::l:1:f:3\ncell:F35:t::b::2:2::l:1:f:3\ncell:G35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), (SHEET7!E18*SHEET7!F18), (INV3!E18*INV3!F18))):b::1::1:f:3:ntvf:1\ncell:B36:b:2::::l:1:f:10\ncell:C36:b:2::::l:1:f:10\ncell:D36:b:2::::l:1:f:10\ncell:E36:b:2::::l:1:f:11\ncell:F36:t:Subtotal:b:2::::l:1:f:9\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:9:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:11:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:10\ncell:D37:t::b:::2::l:1:f:10\ncell:F37:t:Tax Rate:l:1:f:9\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:10\ncell:D38:t::b:2::::l:1:f:10\ncell:F38:t:Tax:l:1:f:9\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:10\ncell:D39:t::l:2:f:10\ncell:F39:t:Other:b:::1::l:1:f:9\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:10\ncell:D40:t::l:2:f:10\ncell:F40:t:TOTAL:b:1::::l:1:f:11\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:9:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:4:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:10\ncell:D43:t::l:2:f:10\ncell:E43:t::l:2:f:10\ncell:F43:t::l:2:f:10\ncell:G43:t::l:2:f:10\ncol:A:w:10\ncol:B:w:65\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:53\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 9pt Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:italic normal * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 14pt Trebuchet MS\nfont:8:normal bold 28pt Trebuchet MS\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 10pt Trebuchet MS\nfont:12:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "sheet6", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Hours:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Rate:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "inv3", - hidden: "0", - }, - sheet5: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Qty.:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Price:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "sheet7", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "inv1!B2": true, - "inv1!C5": true, - "inv1!C6": true, - "inv1!C7": true, - "inv1!C8": true, - "inv1!C9": true, - "inv1!C11": true, - "inv1!C12": true, - "inv1!C13": true, - "inv1!C14": true, - "inv1!C15": true, - "inv1!C16": true, - "inv1!C18": true, - "inv1!C20": true, - "inv1!D20": true, - "inv1!C23": true, - "inv1!C24": true, - "inv1!C25": true, - "inv1!C26": true, - "inv1!C27": true, - "inv1!C28": true, - "inv1!C29": true, - "inv1!C30": true, - "inv1!C31": true, - "inv1!C32": true, - "inv1!C33": true, - "inv1!C34": true, - "inv1!C35": true, - "inv1!F23": true, - "inv1!F24": true, - "inv1!F25": true, - "inv1!F26": true, - "inv1!F27": true, - "inv1!F28": true, - "inv1!F29": true, - "inv1!F30": true, - "inv1!F31": true, - "inv1!F32": true, - "inv1!F33": true, - "inv1!F34": true, - "inv1!F35": true, - "inv2!B2": true, - "inv2!F4": true, - "inv2!G4": true, - "inv2!B5": true, - "inv2!B7": true, - "inv2!B8": true, - "inv2!B9": true, - "inv2!B10": true, - "inv2!B11": true, - "inv2!B12": true, - "inv2!B14": true, - "inv2!B15": true, - "inv2!B16": true, - "inv2!B17": true, - "inv2!B18": true, - "inv2!B19": true, - "inv2!B20": true, - "inv2!B23": true, - "inv2!B24": true, - "inv2!B25": true, - "inv2!B26": true, - "inv2!B27": true, - "inv2!B28": true, - "inv2!B29": true, - "inv2!B30": true, - "inv2!B31": true, - "inv2!B32": true, - "inv2!B33": true, - "inv2!B34": true, - "inv2!B35": true, - "inv2!G23": true, - "inv2!G24": true, - "inv2!G25": true, - "inv2!G26": true, - "inv2!G27": true, - "inv2!G28": true, - "inv2!G29": true, - "inv2!G30": true, - "inv2!G31": true, - "inv2!G32": true, - "inv2!G33": true, - "inv2!G34": true, - "inv2!G35": true, - "inv2!B38": true, - "inv2!B39": true, - "inv2!B40": true, - "inv2!F36": true, - "inv2!G37": true, - "inv2!F37": true, - "inv2!F39": true, - "inv2!G39": true, - "inv2!F38": true, - "sheet6!B2": true, - "sheet6!F4": true, - "sheet6!G4": true, - "sheet6!B5": true, - "sheet6!B7": true, - "sheet6!B8": true, - "sheet6!B9": true, - "sheet6!B10": true, - "sheet6!B11": true, - "sheet6!B12": true, - "sheet6!B14": true, - "sheet6!B15": true, - "sheet6!B16": true, - "sheet6!B17": true, - "sheet6!B18": true, - "sheet6!B19": true, - "sheet6!B20": true, - "sheet6!B38": true, - "sheet6!B39": true, - "sheet6!B40": true, - "sheet6!F36": true, - "sheet6!G37": true, - "sheet6!F37": true, - "sheet6!F39": true, - "sheet6!G39": true, - "sheet6!F38": true, - "inv3!B2": true, - "inv3!B6": true, - "inv3!B7": true, - "inv3!B8": true, - "inv3!B9": true, - "inv3!B10": true, - "inv3!B11": true, - "inv3!B12": true, - "inv3!B13": true, - "inv3!B14": true, - "inv3!B15": true, - "inv3!B16": true, - "inv3!B17": true, - "inv3!B18": true, - "inv3!E6": true, - "inv3!E7": true, - "inv3!E8": true, - "inv3!E9": true, - "inv3!E10": true, - "inv3!E11": true, - "inv3!E12": true, - "inv3!E13": true, - "inv3!E14": true, - "inv3!E15": true, - "inv3!E16": true, - "inv3!E17": true, - "inv3!E18": true, - "inv3!F6": true, - "inv3!F7": true, - "inv3!F8": true, - "inv3!F9": true, - "inv3!F10": true, - "inv3!F11": true, - "inv3!F12": true, - "inv3!F13": true, - "inv3!F14": true, - "inv3!F15": true, - "inv3!F16": true, - "inv3!F17": true, - "inv3!F18": true, - "sheet7!F6": true, - "sheet7!F7": true, - "sheet7!F8": true, - "sheet7!F9": true, - "sheet7!F10": true, - "sheet7!F11": true, - "sheet7!F12": true, - "sheet7!F13": true, - "sheet7!F14": true, - "sheet7!F15": true, - "sheet7!F16": true, - "sheet7!F17": true, - "sheet7!F18": true, - "sheet7!E6": true, - "sheet7!E7": true, - "sheet7!E8": true, - "sheet7!E9": true, - "sheet7!E10": true, - "sheet7!E11": true, - "sheet7!E12": true, - "sheet7!E13": true, - "sheet7!E14": true, - "sheet7!E15": true, - "sheet7!E16": true, - "sheet7!E17": true, - "sheet7!E18": true, - "sheet7!B6": true, - "sheet7!B2": true, - "sheet7!B7": true, - "sheet7!B8": true, - "sheet7!B9": true, - "sheet7!B10": true, - "sheet7!B11": true, - "sheet7!B12": true, - "sheet7!B13": true, - "sheet7!B14": true, - "sheet7!B15": true, - "sheet7!B16": true, - "sheet7!B17": true, - "sheet7!B18": true, - "inv1!D8": true, - "inv1!D15": true, - "inv1!D18": true, - "inv2!C5": true, - "sheet6!C5": true, - }, - constraints: { - "inv1!C5": ["prompttext", "0", "1e10", "Name"], - "inv1!C6": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C7": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C8": ["prompttext", "0", "1e10", "Phone"], - "inv1!C9": ["promptemail", "0", "1e10", "Email"], - "inv1!C11": ["prompttext", "0", "1e10", "From"], - "inv1!C12": ["prompttext", "0", "1e10", "Name"], - "inv1!C13": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C14": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C15": ["prompttext", "0", "1e10", "Phone"], - "inv1!C16": ["promptemail", "0", "1e10", "Email"], - "inv1!C18": ["prompttext", "0", "1e10", "Invoice #"], - "inv1!C20": ["prompttext", "0", "1e10", "Date"], - "inv1!D20": ["prompttext", "0", "1e10", "Date"], - "inv1!C23": ["prompttext", "0", "1e10", "Description"], - "inv1!C24": ["prompttext", "0", "1e10", "Description"], - "inv1!C25": ["prompttext", "0", "1e10", "Description"], - "inv1!C26": ["prompttext", "0", "1e10", "Description"], - "inv1!C27": ["prompttext", "0", "1e10", "Description"], - "inv1!C28": ["prompttext", "0", "1e10", "Description"], - "inv1!C29": ["prompttext", "0", "1e10", "Description"], - "inv1!C30": ["prompttext", "0", "1e10", "Description"], - "inv1!C31": ["prompttext", "0", "1e10", "Description"], - "inv1!C32": ["prompttext", "0", "1e10", "Description"], - "inv1!C33": ["prompttext", "0", "1e10", "Description"], - "inv1!C34": ["prompttext", "0", "1e10", "Description"], - "inv1!C35": ["prompttext", "0", "1e10", "Description"], - "inv1!F23": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F24": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F25": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F26": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F27": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F28": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F29": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F30": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F31": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F32": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F33": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F34": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B2": ["prompttext", "0", "1e10", "Invoice"], - "inv2!F4": ["prompttext", "0", "1e10", "Date"], - "inv2!G4": ["prompttext", "0", "1e10", "Date"], - "inv2!B5": ["prompttext", "0", "1e10", "Invoice #"], - "inv2!B7": ["prompttext", "0", "1e10", "From"], - "inv2!B8": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B9": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B11": ["prompttext", "0", "1e10", "Phone"], - "inv2!B12": ["promptemail", "0", "1e10", "Email"], - "inv2!B14": ["prompttext", "0", "1e10", "Bill To"], - "inv2!B15": ["prompttext", "0", "1e10", "Name"], - "inv2!B16": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B17": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B19": ["prompttext", "0", "1e10", "Phone"], - "inv2!B20": ["promptemail", "0", "1e10", "Email"], - "inv2!B23": ["prompttext", "0", "1e10", "Description"], - "inv2!B24": ["prompttext", "0", "1e10", "Description"], - "inv2!B25": ["prompttext", "0", "1e10", "Description"], - "inv2!B26": ["prompttext", "0", "1e10", "Description"], - "inv2!B27": ["prompttext", "0", "1e10", "Description"], - "inv2!B28": ["prompttext", "0", "1e10", "Description"], - "inv2!B29": ["prompttext", "0", "1e10", "Description"], - "inv2!B30": ["prompttext", "0", "1e10", "Description"], - "inv2!B31": ["prompttext", "0", "1e10", "Description"], - "inv2!B32": ["prompttext", "0", "1e10", "Description"], - "inv2!B33": ["prompttext", "0", "1e10", "Description"], - "inv2!B34": ["prompttext", "0", "1e10", "Description"], - "inv2!B35": ["prompttext", "0", "1e10", "Description"], - "inv2!G23": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G24": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G25": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G26": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G27": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G28": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G29": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G30": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G31": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G32": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G33": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G34": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B38": ["prompttext", "0", "1e10", "Notes"], - "inv2!B39": ["prompttext", "0", "1e10", "Notes"], - "inv2!B40": ["prompttext", "0", "1e10", "Notes"], - "inv2!F36": ["prompttext", "0", "1e10", "Subtotal"], - "inv2!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "inv2!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "inv2!F39": ["prompttext", "0", "1e10", "Other"], - "inv2!G39": ["promptdecimal", "0", "1e10", "Other"], - "inv2!F38": ["prompttext", "0", "1e10", "Tax"], - "sheet6!B2": ["prompttext", "0", "1e10", "Invoice"], - "sheet6!F4": ["prompttext", "0", "1e10", "Date"], - "sheet6!G4": ["prompttext", "0", "1e10", "Date"], - "sheet6!B5": ["prompttext", "0", "1e10", "Invoice #"], - "sheet6!B7": ["prompttext", "0", "1e10", "From"], - "sheet6!B8": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B9": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B11": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B12": ["promptemail", "0", "1e10", "Email"], - "sheet6!B14": ["prompttext", "0", "1e10", "Bill To"], - "sheet6!B15": ["prompttext", "0", "1e10", "Name"], - "sheet6!B16": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B17": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B19": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B20": ["promptemail", "0", "1e10", "Email"], - "sheet6!B38": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B39": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B40": ["prompttext", "0", "1e10", "Notes"], - "sheet6!F36": ["prompttext", "0", "1e10", "Subtotal"], - "sheet6!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "sheet6!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "sheet6!F39": ["prompttext", "0", "1e10", "Other"], - "sheet6!G39": ["promptdecimal", "0", "1e10", "Other"], - "sheet6!F38": ["prompttext", "0", "1e10", "Tax"], - "inv3!B6": ["prompttext", "0", "1e10", "Description"], - "inv3!B7": ["prompttext", "0", "1e10", "Description"], - "inv3!B8": ["prompttext", "0", "1e10", "Description"], - "inv3!B9": ["prompttext", "0", "1e10", "Description"], - "inv3!B10": ["prompttext", "0", "1e10", "Description"], - "inv3!B11": ["prompttext", "0", "1e10", "Description"], - "inv3!B12": ["prompttext", "0", "1e10", "Description"], - "inv3!B13": ["prompttext", "0", "1e10", "Description"], - "inv3!B14": ["prompttext", "0", "1e10", "Description"], - "inv3!B15": ["prompttext", "0", "1e10", "Description"], - "inv3!B16": ["prompttext", "0", "1e10", "Description"], - "inv3!B17": ["prompttext", "0", "1e10", "Description"], - "inv3!B18": ["prompttext", "0", "1e10", "Description"], - "sheet7!B6": ["prompttext", "0", "1e10", "Description"], - "sheet7!B7": ["prompttext", "0", "1e10", "Description"], - "sheet7!B8": ["prompttext", "0", "1e10", "Description"], - "sheet7!B9": ["prompttext", "0", "1e10", "Description"], - "sheet7!B10": ["prompttext", "0", "1e10", "Description"], - "sheet7!B11": ["prompttext", "0", "1e10", "Description"], - "sheet7!B12": ["prompttext", "0", "1e10", "Description"], - "sheet7!B13": ["prompttext", "0", "1e10", "Description"], - "sheet7!B14": ["prompttext", "0", "1e10", "Description"], - "sheet7!B15": ["prompttext", "0", "1e10", "Description"], - "sheet7!B16": ["prompttext", "0", "1e10", "Description"], - "sheet7!B17": ["prompttext", "0", "1e10", "Description"], - "sheet7!B18": ["prompttext", "0", "1e10", "Description"], - "inv1!D8": ["prompttext", "0", "1e10", "Phone"], - "inv1!D15": ["prompttext", "0", "1e10", "Phone"], - "inv1!D18": ["promptnumeric", "0", "1e10", "Invoice#"], - "inv2!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet6!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet7!E6": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E7": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E8": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E9": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E10": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E11": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E12": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E13": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E14": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E15": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E16": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E17": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E18": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!F6": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F7": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F8": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F9": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F10": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F11": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F12": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F13": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F14": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F15": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F16": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F17": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F18": ["promptdecimal", "0", "1e10", "Price"], - "inv3!E6": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E7": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E8": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E9": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E10": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E11": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E12": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E13": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E14": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E15": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E16": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E17": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E18": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!F6": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F7": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F8": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F9": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F10": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F11": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F12": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F13": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F14": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F15": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F16": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F17": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F18": ["promptdecimal", "0", "1e10", "Rate"], - }, - }, - }, - footers: [ - { name: "Type1", index: 1, isActive: true }, - { name: "Type2", index: 2, isActive: false }, - { name: "Type3", index: 3, isActive: false }, - { name: "Detail1", index: 4, isActive: false }, - { name: "Detail2", index: 5, isActive: false }, - ], - }, - android: { - msc: { - numsheets: 5, - currentid: "sheet1", - currentname: "inv1", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:10\ncell:C1:b:::2::l:1:f:10\ncell:D1:b:::2::l:1:f:10\ncell:E1:b:::2::l:1:f:10\ncell:F1:b:::2::l:1:f:10\ncell:G1:b:::2::l:1:f:10\ncell:A2:b::2:::l:1:f:10\ncell:B2:t:INVOICE:b:1:1:1:1:f:13:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:10\ncell:D2:t::b:2::2::l:1:f:10\ncell:E2:t::b:2::2::l:1:f:10\ncell:F2:t::b:2::2::l:1:f:10\ncell:G2:t::b:2::2::l:1:f:10\ncell:A3:b::2:::l:3:f:10\ncell:B3:b:2:::2:l:3:f:10\ncell:C3:b:2::::l:1:f:10\ncell:D3:b:2::::l:1:f:10\ncell:E3:b:2::::l:1:f:10\ncell:F3:b:2::::l:1:f:10\ncell:G3:b:2:2:::l:3:f:10\ncell:A4:b::2:::l:3:f:10\ncell:B4:b::::2:l:3:f:6\ncell:C4:t:BILL TO\\c:f:9:colspan:2\ncell:E4:f:5:cf:2\ncell:G4:b::2:::l:3:f:10\ncell:A5:b::2:::l:3:f:10\ncell:B5:b::::2:l:3:f:7\ncell:C5:t:[Name]:f:9:cf:2:colspan:3\ncell:E5:f:1:cf:2\ncell:F5:t::l:2:f:10:tvf:4:rowspan:6\ncell:G5:t::b::1:::l:2:f:10\ncell:A6:b::2:::l:3:f:10\ncell:B6:b::::2:l:3:f:7\ncell:C6:t:[Street Address]:f:9:cf:2:colspan:3\ncell:E6:f:1:cf:2\ncell:F6:l:2:f:10\ncell:G6:b::1:::l:2:f:10\ncell:A7:b::2:::l:3:f:10\ncell:B7:b::::2:l:3:f:7\ncell:C7:t:[City, State, Zip]:f:9:cf:2:colspan:3\ncell:E7:f:1:cf:2\ncell:G7:b::2:::l:3:f:10\ncell:A8:b::2:::l:3:f:10\ncell:B8:b::::2:l:3:f:7\ncell:C8:t:Phone\\c:f:9:cf:2:colspan:3\ncell:D8:f:8:cf:2\ncell:E8:f:1:cf:2\ncell:G8:b::2:::l:3:f:10\ncell:A9:b::2:::l:3:f:10\ncell:B9:b::::2:l:3:f:7\ncell:C9:t:Email\\c:f:9:cf:2:colspan:3\ncell:E9:f:1:cf:2\ncell:G9:b::2:::l:3:f:10\ncell:A10:b::2:::l:3:f:10\ncell:B10:b::::2:l:3:f:7\ncell:C10:colspan:2\ncell:G10:b::2:::l:3:f:10\ncell:A11:b::2:::l:3:f:10\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:FROM\\c:f:9:colspan:2\ncell:E11:f:8:colspan:2\ncell:G11:b::2:::l:3:f:10\ncell:A12:b::2:::l:3:f:10\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[Name]:f:9:colspan:4\ncell:E12:colspan:2\ncell:G12:b::2:::l:3:f:10\ncell:A13:b::2:::l:3:f:10\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:[Street Address]:f:9:colspan:4\ncell:E13:colspan:2\ncell:G13:b::2:::l:3:f:10\ncell:A14:b::2:::l:3:f:10\ncell:B14:b::::2:l:3:f:7\ncell:C14:t:[City, State, Zip]:f:9:colspan:4\ncell:E14:colspan:2\ncell:G14:b::2:::l:3:f:10\ncell:A15:b::2:::l:3:f:10\ncell:B15:b::::2:l:3:f:7\ncell:C15:t:Phone\\c:f:9:colspan:4\ncell:D15:f:8:cf:2:colspan:3\ncell:E15:colspan:2\ncell:G15:b::2:::l:3:f:10\ncell:A16:b::2:::l:3:f:10\ncell:B16:b::::2:l:3:f:7\ncell:C16:t:Email\\c:f:9:colspan:4\ncell:E16:colspan:2\ncell:G16:b::2:::l:3:f:10\ncell:A17:b::2:::l:3:f:10\ncell:B17:b::::2:l:3:f:6\ncell:G17:b::2:::l:3:f:10\ncell:A18:b::2:::l:3:f:10\ncell:B18:b::::2:l:3:f:10\ncell:C18:t:INVOICE #\\c:f:9:cf:2:colspan:4\ncell:D18:v:1:l:4:f:9:cf:2:colspan:3\ncell:G18:b::2:::l:3:f:10\ncell:A19:b::2:::l:3:f:10\ncell:B19:b::::2:l:3:f:10\ncell:G19:b::2:::l:3:f:10\ncell:A20:b::2:::l:3:f:10\ncell:B20:b::::2:l:3:f:10\ncell:C20:t:DATE\\c:f:9:cf:2\ncell:D20:vtf:nd:42081:TODAY():f:9:cf:2:ntvf:3:colspan:2\ncell:G20:b::2:::l:3:f:10\ncell:A21:b::2:::l:3:f:10\ncell:B21:b::::2:l:3:f:6:cf:2\ncell:C21:b:::2::l:1:f:10\ncell:D21:b:::2::l:3:f:6:cf:2\ncell:E21:b:::2::l:1:f:10\ncell:F21:b:::2::l:1:f:10\ncell:G21:b::2:::l:3:f:10\ncell:A22:b::2:::l:3:f:10\ncell:B22:b::2::2:l:3:f:10\ncell:C22:t:Description:b:1::1:1:f:9:cf:1:colspan:3\ncell:D22:t:Description:b:1::1::l:3:f:6:cf:2:colspan:2:rowspan:1\ncell:E22:t::b:2:2:2::l:1:f:10\ncell:F22:t:Amount:b:1:1:1:1:f:9:cf:1\ncell:G22:b::2::2:l:3:f:10\ncell:A23:b::2:::l:3:f:10\ncell:B23:b::2::2:l:3:f:10\ncell:C23:b:1:1::1:f:2:cf:2:colspan:3\ncell:D23:b:1:1:::l:3:f:10:cf:2:colspan:2:rowspan:1\ncell:E23:t::b:2:2:2::l:1:f:10\ncell:F23:b:1:1:::f:2:ntvf:1\ncell:G23:b::2::2:l:3:f:10\ncell:A24:b::2:::l:3:f:10\ncell:B24:b::2::2:l:3:f:10:cf:2\ncell:C24:b::1::1:f:2:cf:2:colspan:3\ncell:D24:b::1:::l:1:f:10:colspan:2\ncell:E24:l:1:f:10\ncell:F24:b::1:::f:2:ntvf:1\ncell:G24:b::2::2:l:3:f:10\ncell:A25:b::2:::l:3:f:10\ncell:B25:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C25:b::1::1:f:2:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:2:ntvf:1\ncell:G25:b::2::2:l:3:f:10\ncell:A26:b::2:::l:3:f:10\ncell:B26:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C26:b::1::1:f:2:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:2:ntvf:1\ncell:G26:b::2::2:l:3:f:10\ncell:A27:b::2:::l:3:f:10\ncell:B27:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C27:b::1::1:f:2:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:2:ntvf:1\ncell:G27:b::2::2:l:3:f:10\ncell:A28:b::2:::l:3:f:10\ncell:B28:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C28:b::1::1:f:2:cf:2:colspan:3\ncell:D28:b::1:::colspan:2\ncell:F28:b::1:::f:2:ntvf:1\ncell:G28:b::2::2:l:3:f:10\ncell:A29:b::2:::l:3:f:10\ncell:B29:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C29:b::1::1:f:2:cf:2:colspan:3\ncell:D29:b::1:::colspan:2\ncell:F29:b::1:::f:2:ntvf:1\ncell:G29:b::2::2:l:3:f:10\ncell:A30:b::2:::l:3:f:10\ncell:B30:b::2::2:l:3:f:10:cf:2\ncell:C30:b::1::1:f:2:cf:2:colspan:3\ncell:D30:b::1:::colspan:2\ncell:F30:b::1:::f:2:ntvf:1\ncell:G30:b::2::2:l:3:f:10\ncell:A31:b::2:::l:3:f:10\ncell:B31:b::2::2:l:3:f:10:cf:2\ncell:C31:b::1::1:f:2:cf:2:colspan:3\ncell:D31:b::1:::colspan:2\ncell:F31:b::1:::f:2:ntvf:1\ncell:G31:b::2::2:l:3:f:10\ncell:A32:b::2:::l:3:f:10\ncell:B32:b::2::2:l:3:f:10:cf:2\ncell:C32:b::1::1:f:2:cf:2:colspan:3\ncell:D32:b::1:::colspan:2\ncell:F32:b::1:::f:2:ntvf:1\ncell:G32:b::2::2:l:3:f:10\ncell:A33:b::2:::l:3:f:10\ncell:B33:b::2::2:l:3:f:10:cf:2\ncell:C33:b::1::1:f:2:cf:2:colspan:3\ncell:D33:b::1:::colspan:2\ncell:F33:b::1:::f:2:ntvf:1\ncell:G33:b::2::2:l:3:f:10\ncell:A34:b::2:::l:3:f:10\ncell:B34:b::2::2:l:3:f:10:cf:2\ncell:C34:b::1::1:f:2:cf:2:colspan:3\ncell:D34:b::1:::colspan:2\ncell:F34:b::1:::f:2:ntvf:1\ncell:G34:b::2::2:l:3:f:10\ncell:A35:b::2:::l:3:f:7\ncell:B35:b::2::2:l:3:f:10:cf:2\ncell:C35:b::1:1:1:f:2:cf:2:colspan:3\ncell:D35:b::1:1::l:3:f:10:cf:2:colspan:2\ncell:E35:b:::2::l:3:f:10:cf:2\ncell:F35:b::1:1::f:2:ntvf:1\ncell:G35:b::2::2:l:3:f:10\ncell:A36:b::2:::l:3:f:6\ncell:B36:b::2::2:l:3:f:6\ncell:C36:t:TOTAL:b:1:1:1:1:f:11:cf:2:colspan:3\ncell:D36:b:2::2::l:3:f:12:cf:2\ncell:E36:b:2:2:2::l:3:f:12:cf:2\ncell:F36:vtf:n:0:SUM(F23\\cF35):b:1:1:1::f:11:ntvf:1\ncell:G36:b::2::2:l:3:f:7\ncell:A37:b::2:::l:3:f:10\ncell:B37:b::::2:l:3:f:6:cf:2\ncell:C37:b:2::::l:1:f:10\ncell:D37:b:2::::l:1:f:10\ncell:E37:b:2::::l:1:f:10\ncell:F37:b:2::::l:1:f:10\ncell:G37:b::2:::l:3:f:6\ncell:A38:b::2:::l:3:f:10\ncell:B38:b::::2:l:3:f:10\ncell:G38:b::2:::l:3:f:10\ncell:A39:b::2:::l:3:f:10\ncell:B39:b::::2:l:3:f:10:cf:2\ncell:C39:t:Thank you for your business:f:4:cf:1:colspan:4\ncell:D39:t:Thank you for your business:colspan:3\ncell:E39:t:Thank you for your business:f:3:colspan:2\ncell:F39:t::l:2:f:10\ncell:G39:b::2:::l:3:f:10\ncell:A40:b::2:::l:3:f:10\ncell:B40:b::::2:l:3:f:10\ncell:G40:b::2:::l:3:f:10\ncell:A41:b::2:::l:3:f:10\ncell:B41:b:::2:2:l:3:f:10\ncell:C41:b:::2::l:3:f:10\ncell:D41:b:::2::l:3:f:10\ncell:E41:b:::2::l:3:f:10\ncell:F41:b:::2::l:3:f:10\ncell:G41:b::2:2::l:3:f:10\ncell:B42:b:1:::\ncell:C42:b:1:::\ncell:D42:b:1:::\ncell:E42:b:1:::\ncell:F42:b:1:::\ncell:G42:b:1:::\ncol:A:w:10\ncol:B:w:10\ncol:C:w:62\ncol:D:w:73\ncol:E:w:15\ncol:F:w:68\ncol:G:w:10\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:15.75\nrow:36:h:15.75\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nsheet:c:7:r:42:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:* 9pt Trebuchet MS\nfont:3:italic bold * Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Arial\nfont:7:normal bold 12pt Arial\nfont:8:normal normal * *\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 11pt Trebuchet MS\nfont:12:normal normal 12pt Arial\nfont:13:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nlayout:4:padding:* * * 4px;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv1", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - "version:1.5\ncell:B2:t:INVOICE:l:1:f:9:cf:1:colspan:6\ncell:C2:t::l:2:f:13\ncell:D2:t::l:2:f:13\ncell:E2:l:1:f:10:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:8:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:13\ncell:B3:f:6:cf:2:colspan:4\ncell:C3:t::l:2:f:13\ncell:D3:t::l:2:f:13\ncell:F3:l:1:f:7:cf:2\ncell:G3:l:1:f:14:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:14:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:14:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:3:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:7:cf:2:colspan:2\ncell:G5:l:1:f:14:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:7:cf:2:colspan:2\ncell:G6:l:1:f:14:cf:2\ncell:B7:t:FROM\\c:f:12\ncell:F7:l:1:f:7:cf:2:tvf:4:colspan:2:rowspan:6\ncell:G7:l:1:f:14:cf:2\ncell:B8:t:[Company Name]:f:3:colspan:4\ncell:F8:l:1:f:7:cf:2:colspan:2\ncell:G8:l:1:f:14:cf:2\ncell:B9:t:[Street Address]:f:1:cf:2:colspan:4\ncell:F9:l:1:f:7\ncell:G9:l:1:f:14:cf:1\ncell:B10:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:G10:l:1:f:13\ncell:B11:t:Phone\\c :f:1:cf:2:colspan:4\ncell:B12:t:Email\\c:f:1:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:11:cf:2\ncell:B15:t:[Name]:f:1:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:1:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:1:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:1:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:1:cf:2:colspan:6\ncell:B20:t:Email\\c:f:1:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:14:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:13\ncell:D22:t::l:2:f:13\ncell:E22:t::l:2:f:13\ncell:F22:t::l:2:f:13\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:14:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:b:1:1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:4\ncell:D23:t::l:2:f:4\ncell:E23:t::l:2:f:4\ncell:F23:t::b::2:::l:1:f:4\ncell:G23:b::1::1:f:4:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:4\ncell:D24:t::l:2:f:4\ncell:E24:t::l:2:f:4\ncell:F24:t::b::2:::l:1:f:4\ncell:G24:b::1::1:f:4:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:4\ncell:D25:t::l:2:f:4\ncell:E25:t::l:2:f:4\ncell:F25:t::b::2:::l:1:f:4\ncell:G25:b::1::1:f:4:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:4\ncell:D26:t::l:2:f:4\ncell:E26:t::l:2:f:4\ncell:F26:t::b::2:::l:1:f:4\ncell:G26:b::1::1:f:4:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:4\ncell:D27:t::l:2:f:4\ncell:E27:t::l:2:f:4\ncell:F27:t::b::2:::l:1:f:4\ncell:G27:b::1::1:f:4:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:4\ncell:D28:t::l:2:f:4\ncell:E28:t::l:2:f:4\ncell:F28:t::b::2:::l:1:f:4\ncell:G28:b::1::1:f:4:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:4\ncell:D29:t::l:2:f:4\ncell:E29:t::l:2:f:4\ncell:F29:t::b::2:::l:1:f:4\ncell:G29:b::1::1:f:4:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:4\ncell:D30:t::l:2:f:4\ncell:E30:t::l:2:f:4\ncell:F30:t::b::2:::l:1:f:4\ncell:G30:b::1::1:f:4:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:4\ncell:D31:t::l:2:f:4\ncell:E31:t::l:2:f:4\ncell:F31:t::b::2:::l:1:f:4\ncell:G31:b::1::1:f:4:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:4\ncell:D32:t::l:2:f:4\ncell:E32:t::l:2:f:4\ncell:F32:t::b::2:::l:1:f:4\ncell:G32:b::1::1:f:4:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C33:t::l:2:f:4\ncell:D33:t::l:2:f:4\ncell:E33:t::l:2:f:4\ncell:F33:t::b::2:::l:1:f:4\ncell:G33:b::1::1:f:4:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C34:l:2:f:4\ncell:D34:l:2:f:4\ncell:E34:l:2:f:4\ncell:F34:b::2:::l:1:f:4\ncell:G34:b::1::1:f:4:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:f:4:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:4\ncell:D35:t::b:::2::l:1:f:4\ncell:E35:t::b:::2::l:1:f:4\ncell:F35:t::b::2:2::l:1:f:4\ncell:G35:b::1:1:1:f:4:ntvf:1\ncell:B36:b:2::::l:1:f:13\ncell:C36:b:2::::l:1:f:13\ncell:D36:b:2::::l:1:f:13\ncell:E36:b:2::::l:1:f:14\ncell:F36:t:Subtotal:b:2::::l:1:f:11\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:11:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:14:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:13\ncell:D37:t::b:::2::l:1:f:13\ncell:F37:t:Tax Rate:l:1:f:11\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:13\ncell:D38:t::b:2::::l:1:f:13\ncell:F38:t:Tax:l:1:f:11\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:13\ncell:D39:t::l:2:f:13\ncell:F39:t:Other:b:::1::l:1:f:11\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:13\ncell:D40:t::l:2:f:13\ncell:F40:t:TOTAL:b:1::::l:1:f:14\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:11:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:5:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:13\ncell:D43:t::l:2:f:13\ncell:E43:t::l:2:f:13\ncell:F43:t::l:2:f:13\ncell:G43:t::l:2:f:13\ncol:A:w:10\ncol:B:w:90\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:45\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 10pt Trebuchet MS\nfont:4:* 9pt Trebuchet MS\nfont:5:italic bold 10pt Trebuchet MS\nfont:6:italic normal * Trebuchet MS\nfont:7:normal bold 10pt Trebuchet MS\nfont:8:normal bold 14pt Trebuchet MS\nfont:9:normal bold 16pt Trebuchet MS\nfont:10:normal bold 28pt Trebuchet MS\nfont:11:normal normal * Trebuchet MS\nfont:12:normal normal 10pt *\nfont:13:normal normal 10pt Arial\nfont:14:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv2", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - 'version:1.5\ncell:B2:t:INVOICE:l:1:f:12:cf:1:colspan:6\ncell:C2:t::l:2:f:10\ncell:D2:t::l:2:f:10\ncell:E2:l:1:f:8:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:10\ncell:B3:f:5:cf:2:colspan:4\ncell:C3:t::l:2:f:10\ncell:D3:t::l:2:f:10\ncell:F3:l:1:f:6:cf:2\ncell:G3:l:1:f:11:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:11:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:11:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:9:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:6:cf:2:colspan:2\ncell:G5:l:1:f:11:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:6:cf:2:colspan:2\ncell:G6:l:1:f:11:cf:2\ncell:B7:t:FROM\\c:f:11\ncell:F7:l:1:f:6:cf:2:colspan:2\ncell:G7:l:1:f:11:cf:2\ncell:B8:t:[Company Name]:f:9:colspan:4\ncell:F8:l:1:f:6:cf:2:tvf:4:colspan:2:rowspan:5\ncell:G8:l:1:f:11:cf:2\ncell:B9:t:[Street Address]:f:9:cf:2:colspan:4\ncell:F9:l:1:f:6\ncell:G9:l:1:f:11:cf:1\ncell:B10:t:[City, State, Zip]:f:9:cf:2:colspan:4\ncell:G10:l:1:f:10\ncell:B11:t:Phone\\c :f:9:cf:2:colspan:4\ncell:B12:t:Email\\c:f:9:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:9:cf:2\ncell:B15:t:[Name]:f:9:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:9:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:9:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:9:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:9:cf:2:colspan:6\ncell:B20:t:Email\\c:f:9:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:11:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:10\ncell:D22:t::l:2:f:10\ncell:E22:t::l:2:f:10\ncell:F22:t::l:2:f:10\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:11:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), sheet7!B6, inv3!B6)):b:1:1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:3\ncell:D23:t::l:2:f:3\ncell:E23:t::l:2:f:3\ncell:F23:t::b::2:::l:1:f:3\ncell:G23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), (sheet7!E6*sheet7!F6), (inv3!E6*inv3!F6))):b::1::1:f:3:ntvf:1\ncell:A24:b::1::\ncell:B24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), SHEET7!B7, INV3!B7)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:3\ncell:D24:t::l:2:f:3\ncell:E24:t::l:2:f:3\ncell:F24:t::b::2:::l:1:f:3\ncell:G24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), (SHEET7!E7*SHEET7!F7), (INV3!E7*INV3!F7))):b::1::1:f:3:ntvf:1\ncell:A25:b::1::\ncell:B25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), SHEET7!B8, INV3!B8)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:3\ncell:D25:t::l:2:f:3\ncell:E25:t::l:2:f:3\ncell:F25:t::b::2:::l:1:f:3\ncell:G25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), (SHEET7!E8*SHEET7!F8), (INV3!E8*INV3!F8))):b::1::1:f:3:ntvf:1\ncell:A26:b::1::\ncell:B26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), SHEET7!B9, INV3!B9)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:3\ncell:D26:t::l:2:f:3\ncell:E26:t::l:2:f:3\ncell:F26:t::b::2:::l:1:f:3\ncell:G26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), (SHEET7!E9*SHEET7!F9), (INV3!E9*INV3!F9))):b::1::1:f:3:ntvf:1\ncell:A27:b::1::\ncell:B27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), SHEET7!B10, INV3!B10)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:3\ncell:D27:t::l:2:f:3\ncell:E27:t::l:2:f:3\ncell:F27:t::b::2:::l:1:f:3\ncell:G27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), (SHEET7!E10*SHEET7!F10), (INV3!E10*INV3!F10))):b::1::1:f:3:ntvf:1\ncell:A28:b::1::\ncell:B28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), SHEET7!B11, INV3!B11)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:3\ncell:D28:t::l:2:f:3\ncell:E28:t::l:2:f:3\ncell:F28:t::b::2:::l:1:f:3\ncell:G28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), (SHEET7!E11*SHEET7!F11), (INV3!E11*INV3!F11))):b::1::1:f:3:ntvf:1\ncell:A29:b::1::\ncell:B29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), SHEET7!B12, INV3!B12)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:3\ncell:D29:t::l:2:f:3\ncell:E29:t::l:2:f:3\ncell:F29:t::b::2:::l:1:f:3\ncell:G29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), (SHEET7!E12*SHEET7!F12), (INV3!E12*INV3!F12))):b::1::1:f:3:ntvf:1\ncell:A30:b::1::\ncell:B30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), SHEET7!B13, INV3!B13)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:3\ncell:D30:t::l:2:f:3\ncell:E30:t::l:2:f:3\ncell:F30:t::b::2:::l:1:f:3\ncell:G30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), (SHEET7!E13*SHEET7!F13), (INV3!E13*INV3!F13))):b::1::1:f:3:ntvf:1\ncell:A31:b::1::\ncell:B31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), SHEET7!B14, INV3!B14)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:3\ncell:D31:t::l:2:f:3\ncell:E31:t::l:2:f:3\ncell:F31:t::b::2:::l:1:f:3\ncell:G31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), (SHEET7!E14*SHEET7!F14), (INV3!E14*INV3!F14))):b::1::1:f:3:ntvf:1\ncell:A32:b::1::\ncell:B32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), SHEET7!B15, INV3!B15)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:3\ncell:D32:t::l:2:f:3\ncell:E32:t::l:2:f:3\ncell:F32:t::b::2:::l:1:f:3\ncell:G32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), (SHEET7!E15*SHEET7!F15), (INV3!E15*INV3!F15))):b::1::1:f:3:ntvf:1\ncell:A33:b::1::\ncell:B33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), SHEET7!B16, INV3!B16)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C33:l:2:f:3\ncell:D33:l:2:f:3\ncell:E33:l:2:f:3\ncell:F33:b::2:::l:1:f:3\ncell:G33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), (SHEET7!E16*SHEET7!F16), (INV3!E16*INV3!F16))):b::1::1:f:3:ntvf:1\ncell:A34:b::1::\ncell:B34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), SHEET7!B17, INV3!B17)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C34:t::l:2:f:3\ncell:D34:t::l:2:f:3\ncell:E34:t::l:2:f:3\ncell:F34:t::b::2:::l:1:f:3\ncell:G34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), (SHEET7!E17*SHEET7!F17), (INV3!E17*INV3!F17))):b::1::1:f:3:ntvf:1\ncell:A35:b::1::\ncell:B35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), SHEET7!B18, INV3!B18)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:3\ncell:D35:t::b:::2::l:1:f:3\ncell:E35:t::b:::2::l:1:f:3\ncell:F35:t::b::2:2::l:1:f:3\ncell:G35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), (SHEET7!E18*SHEET7!F18), (INV3!E18*INV3!F18))):b::1::1:f:3:ntvf:1\ncell:B36:b:2::::l:1:f:10\ncell:C36:b:2::::l:1:f:10\ncell:D36:b:2::::l:1:f:10\ncell:E36:b:2::::l:1:f:11\ncell:F36:t:Subtotal:b:2::::l:1:f:9\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:9:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:11:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:10\ncell:D37:t::b:::2::l:1:f:10\ncell:F37:t:Tax Rate:l:1:f:9\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:10\ncell:D38:t::b:2::::l:1:f:10\ncell:F38:t:Tax:l:1:f:9\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:10\ncell:D39:t::l:2:f:10\ncell:F39:t:Other:b:::1::l:1:f:9\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:10\ncell:D40:t::l:2:f:10\ncell:F40:t:TOTAL:b:1::::l:1:f:11\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:9:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:4:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:10\ncell:D43:t::l:2:f:10\ncell:E43:t::l:2:f:10\ncell:F43:t::l:2:f:10\ncell:G43:t::l:2:f:10\ncol:A:w:10\ncol:B:w:65\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:53\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 9pt Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:italic normal * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 14pt Trebuchet MS\nfont:8:normal bold 28pt Trebuchet MS\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 10pt Trebuchet MS\nfont:12:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "sheet6", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Hours:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Rate:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "inv3", - hidden: "0", - }, - sheet5: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Qty.:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Price:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "sheet7", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "inv1!B2": true, - "inv1!C5": true, - "inv1!C6": true, - "inv1!C7": true, - "inv1!C8": true, - "inv1!C9": true, - "inv1!C11": true, - "inv1!C12": true, - "inv1!C13": true, - "inv1!C14": true, - "inv1!C15": true, - "inv1!C16": true, - "inv1!C18": true, - "inv1!C20": true, - "inv1!D20": true, - "inv1!C23": true, - "inv1!C24": true, - "inv1!C25": true, - "inv1!C26": true, - "inv1!C27": true, - "inv1!C28": true, - "inv1!C29": true, - "inv1!C30": true, - "inv1!C31": true, - "inv1!C32": true, - "inv1!C33": true, - "inv1!C34": true, - "inv1!C35": true, - "inv1!F23": true, - "inv1!F24": true, - "inv1!F25": true, - "inv1!F26": true, - "inv1!F27": true, - "inv1!F28": true, - "inv1!F29": true, - "inv1!F30": true, - "inv1!F31": true, - "inv1!F32": true, - "inv1!F33": true, - "inv1!F34": true, - "inv1!F35": true, - "inv2!B2": true, - "inv2!F4": true, - "inv2!G4": true, - "inv2!B5": true, - "inv2!B7": true, - "inv2!B8": true, - "inv2!B9": true, - "inv2!B10": true, - "inv2!B11": true, - "inv2!B12": true, - "inv2!B14": true, - "inv2!B15": true, - "inv2!B16": true, - "inv2!B17": true, - "inv2!B18": true, - "inv2!B19": true, - "inv2!B20": true, - "inv2!B23": true, - "inv2!B24": true, - "inv2!B25": true, - "inv2!B26": true, - "inv2!B27": true, - "inv2!B28": true, - "inv2!B29": true, - "inv2!B30": true, - "inv2!B31": true, - "inv2!B32": true, - "inv2!B33": true, - "inv2!B34": true, - "inv2!B35": true, - "inv2!G23": true, - "inv2!G24": true, - "inv2!G25": true, - "inv2!G26": true, - "inv2!G27": true, - "inv2!G28": true, - "inv2!G29": true, - "inv2!G30": true, - "inv2!G31": true, - "inv2!G32": true, - "inv2!G33": true, - "inv2!G34": true, - "inv2!G35": true, - "inv2!B38": true, - "inv2!B39": true, - "inv2!B40": true, - "inv2!F36": true, - "inv2!G37": true, - "inv2!F37": true, - "inv2!F39": true, - "inv2!G39": true, - "inv2!F38": true, - "sheet6!B2": true, - "sheet6!F4": true, - "sheet6!G4": true, - "sheet6!B5": true, - "sheet6!B7": true, - "sheet6!B8": true, - "sheet6!B9": true, - "sheet6!B10": true, - "sheet6!B11": true, - "sheet6!B12": true, - "sheet6!B14": true, - "sheet6!B15": true, - "sheet6!B16": true, - "sheet6!B17": true, - "sheet6!B18": true, - "sheet6!B19": true, - "sheet6!B20": true, - "sheet6!B38": true, - "sheet6!B39": true, - "sheet6!B40": true, - "sheet6!F36": true, - "sheet6!G37": true, - "sheet6!F37": true, - "sheet6!F39": true, - "sheet6!G39": true, - "sheet6!F38": true, - "inv3!B2": true, - "inv3!B6": true, - "inv3!B7": true, - "inv3!B8": true, - "inv3!B9": true, - "inv3!B10": true, - "inv3!B11": true, - "inv3!B12": true, - "inv3!B13": true, - "inv3!B14": true, - "inv3!B15": true, - "inv3!B16": true, - "inv3!B17": true, - "inv3!B18": true, - "inv3!E6": true, - "inv3!E7": true, - "inv3!E8": true, - "inv3!E9": true, - "inv3!E10": true, - "inv3!E11": true, - "inv3!E12": true, - "inv3!E13": true, - "inv3!E14": true, - "inv3!E15": true, - "inv3!E16": true, - "inv3!E17": true, - "inv3!E18": true, - "inv3!F6": true, - "inv3!F7": true, - "inv3!F8": true, - "inv3!F9": true, - "inv3!F10": true, - "inv3!F11": true, - "inv3!F12": true, - "inv3!F13": true, - "inv3!F14": true, - "inv3!F15": true, - "inv3!F16": true, - "inv3!F17": true, - "inv3!F18": true, - "sheet7!F6": true, - "sheet7!F7": true, - "sheet7!F8": true, - "sheet7!F9": true, - "sheet7!F10": true, - "sheet7!F11": true, - "sheet7!F12": true, - "sheet7!F13": true, - "sheet7!F14": true, - "sheet7!F15": true, - "sheet7!F16": true, - "sheet7!F17": true, - "sheet7!F18": true, - "sheet7!E6": true, - "sheet7!E7": true, - "sheet7!E8": true, - "sheet7!E9": true, - "sheet7!E10": true, - "sheet7!E11": true, - "sheet7!E12": true, - "sheet7!E13": true, - "sheet7!E14": true, - "sheet7!E15": true, - "sheet7!E16": true, - "sheet7!E17": true, - "sheet7!E18": true, - "sheet7!B6": true, - "sheet7!B2": true, - "sheet7!B7": true, - "sheet7!B8": true, - "sheet7!B9": true, - "sheet7!B10": true, - "sheet7!B11": true, - "sheet7!B12": true, - "sheet7!B13": true, - "sheet7!B14": true, - "sheet7!B15": true, - "sheet7!B16": true, - "sheet7!B17": true, - "sheet7!B18": true, - "inv1!D8": true, - "inv1!D15": true, - "inv1!D18": true, - "inv2!C5": true, - "sheet6!C5": true, - }, - constraints: { - "inv1!C5": ["prompttext", "0", "1e10", "Name"], - "inv1!C6": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C7": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C8": ["prompttext", "0", "1e10", "Phone"], - "inv1!C9": ["promptemail", "0", "1e10", "Email"], - "inv1!C11": ["prompttext", "0", "1e10", "From"], - "inv1!C12": ["prompttext", "0", "1e10", "Name"], - "inv1!C13": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C14": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C15": ["prompttext", "0", "1e10", "Phone"], - "inv1!C16": ["promptemail", "0", "1e10", "Email"], - "inv1!C18": ["prompttext", "0", "1e10", "Invoice #"], - "inv1!C20": ["prompttext", "0", "1e10", "Date"], - "inv1!D20": ["prompttext", "0", "1e10", "Date"], - "inv1!C23": ["prompttext", "0", "1e10", "Description"], - "inv1!C24": ["prompttext", "0", "1e10", "Description"], - "inv1!C25": ["prompttext", "0", "1e10", "Description"], - "inv1!C26": ["prompttext", "0", "1e10", "Description"], - "inv1!C27": ["prompttext", "0", "1e10", "Description"], - "inv1!C28": ["prompttext", "0", "1e10", "Description"], - "inv1!C29": ["prompttext", "0", "1e10", "Description"], - "inv1!C30": ["prompttext", "0", "1e10", "Description"], - "inv1!C31": ["prompttext", "0", "1e10", "Description"], - "inv1!C32": ["prompttext", "0", "1e10", "Description"], - "inv1!C33": ["prompttext", "0", "1e10", "Description"], - "inv1!C34": ["prompttext", "0", "1e10", "Description"], - "inv1!C35": ["prompttext", "0", "1e10", "Description"], - "inv1!F23": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F24": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F25": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F26": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F27": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F28": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F29": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F30": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F31": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F32": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F33": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F34": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B2": ["prompttext", "0", "1e10", "Invoice"], - "inv2!F4": ["prompttext", "0", "1e10", "Date"], - "inv2!G4": ["prompttext", "0", "1e10", "Date"], - "inv2!B5": ["prompttext", "0", "1e10", "Invoice #"], - "inv2!B7": ["prompttext", "0", "1e10", "From"], - "inv2!B8": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B9": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B11": ["prompttext", "0", "1e10", "Phone"], - "inv2!B12": ["promptemail", "0", "1e10", "Email"], - "inv2!B14": ["prompttext", "0", "1e10", "Bill To"], - "inv2!B15": ["prompttext", "0", "1e10", "Name"], - "inv2!B16": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B17": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B19": ["prompttext", "0", "1e10", "Phone"], - "inv2!B20": ["promptemail", "0", "1e10", "Email"], - "inv2!B23": ["prompttext", "0", "1e10", "Description"], - "inv2!B24": ["prompttext", "0", "1e10", "Description"], - "inv2!B25": ["prompttext", "0", "1e10", "Description"], - "inv2!B26": ["prompttext", "0", "1e10", "Description"], - "inv2!B27": ["prompttext", "0", "1e10", "Description"], - "inv2!B28": ["prompttext", "0", "1e10", "Description"], - "inv2!B29": ["prompttext", "0", "1e10", "Description"], - "inv2!B30": ["prompttext", "0", "1e10", "Description"], - "inv2!B31": ["prompttext", "0", "1e10", "Description"], - "inv2!B32": ["prompttext", "0", "1e10", "Description"], - "inv2!B33": ["prompttext", "0", "1e10", "Description"], - "inv2!B34": ["prompttext", "0", "1e10", "Description"], - "inv2!B35": ["prompttext", "0", "1e10", "Description"], - "inv2!G23": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G24": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G25": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G26": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G27": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G28": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G29": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G30": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G31": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G32": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G33": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G34": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B38": ["prompttext", "0", "1e10", "Notes"], - "inv2!B39": ["prompttext", "0", "1e10", "Notes"], - "inv2!B40": ["prompttext", "0", "1e10", "Notes"], - "inv2!F36": ["prompttext", "0", "1e10", "Subtotal"], - "inv2!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "inv2!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "inv2!F39": ["prompttext", "0", "1e10", "Other"], - "inv2!G39": ["promptdecimal", "0", "1e10", "Other"], - "inv2!F38": ["prompttext", "0", "1e10", "Tax"], - "sheet6!B2": ["prompttext", "0", "1e10", "Invoice"], - "sheet6!F4": ["prompttext", "0", "1e10", "Date"], - "sheet6!G4": ["prompttext", "0", "1e10", "Date"], - "sheet6!B5": ["prompttext", "0", "1e10", "Invoice #"], - "sheet6!B7": ["prompttext", "0", "1e10", "From"], - "sheet6!B8": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B9": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B11": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B12": ["promptemail", "0", "1e10", "Email"], - "sheet6!B14": ["prompttext", "0", "1e10", "Bill To"], - "sheet6!B15": ["prompttext", "0", "1e10", "Name"], - "sheet6!B16": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B17": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B19": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B20": ["promptemail", "0", "1e10", "Email"], - "sheet6!B38": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B39": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B40": ["prompttext", "0", "1e10", "Notes"], - "sheet6!F36": ["prompttext", "0", "1e10", "Subtotal"], - "sheet6!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "sheet6!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "sheet6!F39": ["prompttext", "0", "1e10", "Other"], - "sheet6!G39": ["promptdecimal", "0", "1e10", "Other"], - "sheet6!F38": ["prompttext", "0", "1e10", "Tax"], - "inv3!B6": ["prompttext", "0", "1e10", "Description"], - "inv3!B7": ["prompttext", "0", "1e10", "Description"], - "inv3!B8": ["prompttext", "0", "1e10", "Description"], - "inv3!B9": ["prompttext", "0", "1e10", "Description"], - "inv3!B10": ["prompttext", "0", "1e10", "Description"], - "inv3!B11": ["prompttext", "0", "1e10", "Description"], - "inv3!B12": ["prompttext", "0", "1e10", "Description"], - "inv3!B13": ["prompttext", "0", "1e10", "Description"], - "inv3!B14": ["prompttext", "0", "1e10", "Description"], - "inv3!B15": ["prompttext", "0", "1e10", "Description"], - "inv3!B16": ["prompttext", "0", "1e10", "Description"], - "inv3!B17": ["prompttext", "0", "1e10", "Description"], - "inv3!B18": ["prompttext", "0", "1e10", "Description"], - "sheet7!B6": ["prompttext", "0", "1e10", "Description"], - "sheet7!B7": ["prompttext", "0", "1e10", "Description"], - "sheet7!B8": ["prompttext", "0", "1e10", "Description"], - "sheet7!B9": ["prompttext", "0", "1e10", "Description"], - "sheet7!B10": ["prompttext", "0", "1e10", "Description"], - "sheet7!B11": ["prompttext", "0", "1e10", "Description"], - "sheet7!B12": ["prompttext", "0", "1e10", "Description"], - "sheet7!B13": ["prompttext", "0", "1e10", "Description"], - "sheet7!B14": ["prompttext", "0", "1e10", "Description"], - "sheet7!B15": ["prompttext", "0", "1e10", "Description"], - "sheet7!B16": ["prompttext", "0", "1e10", "Description"], - "sheet7!B17": ["prompttext", "0", "1e10", "Description"], - "sheet7!B18": ["prompttext", "0", "1e10", "Description"], - "inv1!D8": ["prompttext", "0", "1e10", "Phone"], - "inv1!D15": ["prompttext", "0", "1e10", "Phone"], - "inv1!D18": ["promptnumeric", "0", "1e10", "Invoice#"], - "inv2!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet6!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet7!E6": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E7": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E8": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E9": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E10": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E11": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E12": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E13": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E14": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E15": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E16": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E17": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E18": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!F6": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F7": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F8": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F9": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F10": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F11": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F12": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F13": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F14": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F15": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F16": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F17": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F18": ["promptdecimal", "0", "1e10", "Price"], - "inv3!E6": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E7": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E8": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E9": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E10": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E11": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E12": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E13": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E14": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E15": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E16": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E17": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E18": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!F6": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F7": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F8": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F9": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F10": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F11": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F12": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F13": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F14": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F15": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F16": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F17": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F18": ["promptdecimal", "0", "1e10", "Rate"], - }, - }, - }, - footers: [ - { name: "Type1", index: 1, isActive: true }, - { name: "Type2", index: 2, isActive: false }, - { name: "Type3", index: 3, isActive: false }, - { name: "Detail1", index: 4, isActive: false }, - { name: "Detail2", index: 5, isActive: false }, - ], - }, - }, -}; - -/* Logo coordinates */ -export let LOGO = { - iPad: { - sheet1: "F4", - sheet2: "F4", - sheet3: "F4", - sheet4: "F4", - }, - iPhone: { - sheet1: "F5", - sheet2: "F7", - sheet3: "F8", - sheet4: null, - sheet5: null, - }, - iPod: { - sheet1: "F5", - sheet2: "F7", - sheet3: "F8", - sheet4: null, - sheet5: null, - }, - android: { - sheet1: "F5", - sheet2: "F7", - sheet3: "F8", - sheet4: null, - sheet5: null, - }, - defualt: { - sheet1: "F4", - sheet2: "F4", - sheet3: "F4", - sheet4: "F4", - }, -}; - -/* Sheet options */ - -export let SHEET_SCHEME = { - grey: { - val1: 221, - val2: 221, - val3: 221, - }, - white: { - val1: 255, - val2: 255, - val3: 255, - }, - green: { - val1: 231, - val2: 243, - val3: 239, - }, - blue: { - val1: 230, - val2: 230, - val3: 250, - }, -}; - -export let COLOR_SCHEME = { - iPad: { - sheet1: { lower: 17, upper: 27, start_col: "C", end_col: "F" }, - sheet2: { lower: 17, upper: 27, start_col: "C", end_col: "H" }, - sheet3: { lower: 19, upper: 29, start_col: "B", end_col: "G" }, - sheet4: { lower: 19, upper: 29, start_col: "B", end_col: "G" }, - }, - iPhone: { - sheet1: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - sheet2: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - sheet3: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - sheet4: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - sheet5: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - }, - iPod: { - sheet1: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - sheet2: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - sheet3: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - sheet4: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - sheet5: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - }, - android: { - sheet1: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - sheet2: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - sheet3: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - sheet4: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - sheet5: { lower: 6, upper: 30, start_col: "B", end_col: "I" }, - }, - default: { - sheet1: { lower: 17, upper: 27, start_col: "C", end_col: "F" }, - sheet2: { lower: 17, upper: 27, start_col: "C", end_col: "H" }, - sheet3: { lower: 19, upper: 29, start_col: "B", end_col: "G" }, - sheet4: { lower: 19, upper: 29, start_col: "B", end_col: "G" }, - }, -}; - -export let FONT_SCHEME = { - iPad: { - sheet1: { lower: 4, upper: 35, start_col: "C", end_col: "G" }, - sheet2: { lower: 4, upper: 35, start_col: "C", end_col: "G" }, - sheet3: { lower: 4, upper: 35, start_col: "B", end_col: "G" }, - sheet4: { lower: 4, upper: 35, start_col: "B", end_col: "G" }, - }, - iPhone: { - sheet1: { lower: 2, upper: 43, start_col: "B", end_col: "G" }, - sheet2: { lower: 2, upper: 43, start_col: "B", end_col: "G" }, - sheet3: { lower: 2, upper: 43, start_col: "B", end_col: "G" }, - sheet4: { lower: 2, upper: 43, start_col: "B", end_col: "G" }, - sheet5: { lower: 2, upper: 43, start_col: "B", end_col: "G" }, - }, - iPod: { - sheet1: { lower: 2, upper: 43, start_col: "B", end_col: "G" }, - sheet2: { lower: 2, upper: 43, start_col: "B", end_col: "G" }, - sheet3: { lower: 2, upper: 43, start_col: "B", end_col: "G" }, - sheet4: { lower: 2, upper: 43, start_col: "B", end_col: "G" }, - sheet5: { lower: 2, upper: 43, start_col: "B", end_col: "G" }, - }, - default: { - sheet1: { lower: 4, upper: 35, start_col: "C", end_col: "G" }, - sheet2: { lower: 4, upper: 35, start_col: "C", end_col: "G" }, - sheet3: { lower: 4, upper: 35, start_col: "B", end_col: "G" }, - sheet4: { lower: 4, upper: 35, start_col: "B", end_col: "G" }, - }, -}; - -export let FONT_OPTIONS = { - e: "font normal bold 14px arial,helvetica,sans-serif", - f: "font italic normal 14px arial,helvetica,sans-serif", - g: "font italic bold 14px arial,helvetica,sans-serif", - "10": "font * 10px arial,helvetica,sans-serif", - "12": "font * 12px arial,helvetica,sans-serif", - "14": "font * 14px arial,helvetica,sans-serif", - "16": "font * 16px arial,helvetica,sans-serif", -}; - -/* Inapp purchase */ -export let INAPP_ITEMS = [ - "2014inv10Pdf", - "2014inv25Pdf", - "2014inv50Pdf", - "2014inv100Pdf", - "2014inv10ft", - "2015inv10fb", - "2015inv10tw", - "2015inv10wa", - "2015inv10sms", - "2015inv10save", - "2015invCloud", - "2015invSavePrintEmail", - "2015inv500SavePrintEmail", - "2015inv1000SavePrintEmail", -]; - -export let PDF_10 = "2014inv10Pdf"; - -export let PDF_25 = "2014inv25Pdf"; - -export let PDF_50 = "2014inv50Pdf"; - -export let PDF_100 = "2014inv100Pdf"; - -export let SHARE_PDF = "2014inv10ft"; - -export let FB_10 = "2015inv10fb"; - -export let TW_10 = "2015inv10tw"; - -export let WA_10 = "2015inv10wa"; - -export let SMS_10 = "2015inv10sms"; - -export let SAVE_PDF = "2015inv10save"; - -export let CLOUD_SAVE = "2015invCloud"; - -export let SPE_10 = "2015invSavePrintEmail"; - -export let SPE_500 = "2015inv500SavePrintEmail"; - -export let SPE_1000 = "2015inv1000SavePrintEmail"; - -export let INAPPLOCAL = [ - { Feature: "10Pdf", Id: "2014inv10Pdf", Purchase: "No", Consumed: 0, Own: 0 }, - { Feature: "25Pdf", Id: "2014inv25Pdf", Purchase: "No", Consumed: 0, Own: 0 }, - { Feature: "50Pdf", Id: "2014inv50Pdf", Purchase: "No", Consumed: 0, Own: 0 }, - { - Feature: "100Pdf", - Id: "2014inv100Pdf", - Purchase: "No", - Consumed: 0, - Own: 0, - }, - { Feature: "10Fb", Id: "2015inv10fb", Purchase: "No", Consumed: 0, Own: 0 }, - { Feature: "10Tw", Id: "2015inv10tw", Purchase: "No", Consumed: 0, Own: 0 }, - { Feature: "10Wa", Id: "2015inv10wa", Purchase: "No", Consumed: 0, Own: 0 }, - { Feature: "10Sms", Id: "2015inv10sms", Purchase: "No", Consumed: 0, Own: 0 }, - { - Feature: "10iBooks", - Id: "2015inv10save", - Purchase: "No", - Consumed: 0, - Own: 0, - }, - { - Feature: "email-print-save", - Id: "2015invSavePrintEmail", - Purchase: "Yes", - Consumed: 0, - Own: 10, - }, - { - Feature: "email-second-print-save", - Id: "2015inv500SavePrintEmail", - Purchase: "No", - Consumed: 0, - Own: 0, - }, - { - Feature: "email-third-print-save", - Id: "2015inv1000SavePrintEmail", - Purchase: "No", - Consumed: 0, - Own: 0, - }, -]; - -export let CLOUDINAPP = [ - { Feature: "save", Id: "2015invCloud", Purchase: "Yes", Consumed: 0, Own: 5 }, -]; diff --git a/Govt-Billing-Angular/src/app/app-routing.module.ts b/Govt-Billing-Angular/src/app/app-routing.module.ts deleted file mode 100644 index f084c29..0000000 --- a/Govt-Billing-Angular/src/app/app-routing.module.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { NgModule } from "@angular/core"; -import { PreloadAllModules, RouterModule, Routes } from "@angular/router"; - -const routes: Routes = [ - // { - // path: "", - // redirectTo: "tabs", - // pathMatch: "full", - // }, - { - path: '', - redirectTo: 'tabs/home', - pathMatch: 'full' - }, - { - path: '', - loadChildren: () => import('./tabs/tabs.module').then(m => m.TabsPageModule) - } - // { - // path: "home", - // loadChildren: () => - // import("./home/home.module").then((m) => m.HomePageModule), - // }, - - // { - // path: "inapp-purchase", - // loadChildren: () => - // import("./inapp-purchase/inapp-purchase.module").then( - // (m) => m.InappPurchasePageModule - // ), - // }, - // { - // path: "list", - // loadChildren: () => - // import("./list/list.module").then((m) => m.ListPageModule), - // }, - // { - // path: "login-modal", - // loadChildren: () => - // import("./login-modal/login-modal.module").then( - // (m) => m.LoginModalPageModule - // ), - // }, - // { - // path: "menu", - // loadChildren: () => - // import("./menu/menu.module").then((m) => m.MenuPageModule), - // }, - // { - // path: "tabs", - // loadChildren: () => - // import("./tabs/tabs.module").then((m) => m.TabsPageModule), - // }, -]; - -@NgModule({ - imports: [ - RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules }), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/Govt-Billing-Angular/src/app/app.component.html b/Govt-Billing-Angular/src/app/app.component.html deleted file mode 100644 index 301f75a..0000000 --- a/Govt-Billing-Angular/src/app/app.component.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Govt-Billing-Angular/src/app/app.component.scss b/Govt-Billing-Angular/src/app/app.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/Govt-Billing-Angular/src/app/app.component.spec.ts b/Govt-Billing-Angular/src/app/app.component.spec.ts deleted file mode 100644 index 2bd6389..0000000 --- a/Govt-Billing-Angular/src/app/app.component.spec.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { TestBed, async } from '@angular/core/testing'; - -import { Platform } from '@ionic/angular'; -import { SplashScreen } from '@ionic-native/splash-screen/ngx'; -import { StatusBar } from '@ionic-native/status-bar/ngx'; - -import { AppComponent } from './app.component'; - -describe('AppComponent', () => { - - let statusBarSpy, splashScreenSpy, platformReadySpy, platformSpy; - - beforeEach(async(() => { - statusBarSpy = jasmine.createSpyObj('StatusBar', ['styleDefault']); - splashScreenSpy = jasmine.createSpyObj('SplashScreen', ['hide']); - platformReadySpy = Promise.resolve(); - platformSpy = jasmine.createSpyObj('Platform', { ready: platformReadySpy }); - - TestBed.configureTestingModule({ - declarations: [AppComponent], - schemas: [CUSTOM_ELEMENTS_SCHEMA], - providers: [ - { provide: StatusBar, useValue: statusBarSpy }, - { provide: SplashScreen, useValue: splashScreenSpy }, - { provide: Platform, useValue: platformSpy }, - ], - }).compileComponents(); - })); - - it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.debugElement.componentInstance; - expect(app).toBeTruthy(); - }); - - it('should initialize the app', async () => { - TestBed.createComponent(AppComponent); - expect(platformSpy.ready).toHaveBeenCalled(); - await platformReadySpy; - expect(statusBarSpy.styleDefault).toHaveBeenCalled(); - expect(splashScreenSpy.hide).toHaveBeenCalled(); - }); - - // TODO: add more tests! - -}); diff --git a/Govt-Billing-Angular/src/app/app.component.ts b/Govt-Billing-Angular/src/app/app.component.ts deleted file mode 100644 index 17674bc..0000000 --- a/Govt-Billing-Angular/src/app/app.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { TabsPage } from "./tabs/tabs.page"; -import { Component } from "@angular/core"; - -import { Platform } from "@ionic/angular"; -import { SplashScreen } from "@ionic-native/splash-screen/ngx"; -import { StatusBar } from "@ionic-native/status-bar/ngx"; - -@Component({ - selector: "app-root", - templateUrl: "app.component.html", - styleUrls: ["app.component.scss"], -}) -export class AppComponent { - // rootPage: any = TabsPage; - constructor( - private platform: Platform, - private splashScreen: SplashScreen, - private statusBar: StatusBar - ) { - this.initializeApp(); - } - - initializeApp() { - this.platform.ready().then(() => { - this.statusBar.styleDefault(); - this.splashScreen.hide(); - }); - } -} diff --git a/Govt-Billing-Angular/src/app/app.module.ts b/Govt-Billing-Angular/src/app/app.module.ts deleted file mode 100644 index 89fe01a..0000000 --- a/Govt-Billing-Angular/src/app/app.module.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { HomePage } from "./home/home.page"; -import { TabsPage } from "./tabs/tabs.page"; -import { InappPurchasePage } from "./inapp-purchase/inapp-purchase.page"; -// import { HomePage } from "./home.page_20200702204333"; -import { MenuPage } from "./menu/menu.page"; -import { ListPage } from "./list/list.page"; -import { LoginModalPage } from "./login-modal/login-modal.page"; -import { InappPurchaseService } from "./inapp-purchase.service"; -import { CloudServiceService } from "./cloud-service.service"; -import { LocalServiceService } from "./local-service.service"; -import { NgModule } from "@angular/core"; -import { BrowserModule } from "@angular/platform-browser"; -import { RouteReuseStrategy } from "@angular/router"; - -import { IonicModule, IonicRouteStrategy } from "@ionic/angular"; -import { SplashScreen } from "@ionic-native/splash-screen/ngx"; -import { StatusBar } from "@ionic-native/status-bar/ngx"; -import { HttpClientModule } from "@angular/common/http"; -import { IonicStorageModule } from "@ionic/storage"; -import { Storage } from "@ionic/storage"; -import { Printer } from "@ionic-native/printer/ngx"; -import { AppComponent } from "./app.component"; -import { AppRoutingModule } from "./app-routing.module"; -import { EmailComposer } from "@ionic-native/email-composer/ngx"; -import { SocialSharing } from "@ionic-native/social-sharing/ngx"; -import { Camera } from "@ionic-native/camera/ngx"; -import { Network } from "@ionic-native/network/ngx"; -import { InAppPurchase } from "@ionic-native/in-app-purchase/ngx"; -import { InAppBrowser } from "@ionic-native/in-app-browser/ngx"; - -@NgModule({ - declarations: [ - AppComponent, - LoginModalPage, - // ListPage, - // MenuPage, - // HomePage, - // LoginModalPage, - // InappPurchasePage, - // TabsPage, - ], - entryComponents: [ - AppComponent, - // ListPage, - // MenuPage, - // HomePage, - LoginModalPage, - // InappPurchasePage, - // TabsPage, - ], - imports: [ - BrowserModule, - IonicModule.forRoot(), - AppRoutingModule, - HttpClientModule, - FormsModule, - ReactiveFormsModule, - IonicStorageModule.forRoot(), - ], - providers: [ - Printer, - InAppPurchase, - Network, - InAppBrowser, - Camera, - SocialSharing, - EmailComposer, - StatusBar, - LocalServiceService, - CloudServiceService, - InappPurchaseService, - SplashScreen, - { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, - ], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/Govt-Billing-Angular/src/app/cloud-service.service.spec.ts b/Govt-Billing-Angular/src/app/cloud-service.service.spec.ts deleted file mode 100644 index 49ac6a0..0000000 --- a/Govt-Billing-Angular/src/app/cloud-service.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { CloudServiceService } from './cloud-service.service'; - -describe('CloudServiceService', () => { - let service: CloudServiceService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(CloudServiceService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/Govt-Billing-Angular/src/app/cloud-service.service.ts b/Govt-Billing-Angular/src/app/cloud-service.service.ts deleted file mode 100644 index 99742d1..0000000 --- a/Govt-Billing-Angular/src/app/cloud-service.service.ts +++ /dev/null @@ -1,160 +0,0 @@ -import { HttpClient, HttpParams, HttpHeaders } from "@angular/common/http"; -import { Injectable } from "@angular/core"; -let BASE_URL = "http://aspiringapps.com/api"; -// import "rxjs/add/operator/map"; -import { map } from "rxjs/operators"; -import { Observable } from "rxjs"; - -@Injectable({ - providedIn: "root", -}) -export class CloudServiceService { - constructor(private http: HttpClient) { - console.log("Cloud service entered"); - } - createPDF(content: any) { - // alert(content); - let url = BASE_URL + "/htmltopdf"; - // alert(url); - let body = JSON.stringify({ content: content }); - const headers = new HttpHeaders().set("content-type", "application/json"); - // let headers = new Headers({ "Content-Type": "application/json" }); - // const options = { - // headers: new HttpParams().set('headers', headers); - // } - // options.params.set('headers', headers); - // new Requestopt({ headers: headers }); - - // map - return this.http - .post(url, body, { headers: headers }) - .pipe(map((res: { json: () => any }) => res.json())); - } - auth(data: any, action: string) { - let url = BASE_URL + "/" + action; - let body = JSON.stringify({ data: data }); - // let headers = new Headers({ "Content-Type": "application/json" }); - // let options = new RequestOptions({ headers: headers }); - - // return this.http.post(url, body, options).map((res) => res.json()); - const headers = new HttpHeaders().set("content-type", "application/json"); - - return this.http - .post(url, body, { headers: headers }) - .pipe(map((res: { json: () => any }) => res.json())); - } - logout() { - let url = BASE_URL + "/logout"; - // let headers = new Headers({ "Content-Type": "application/json" }); - // let options = new RequestOptions({ headers: headers }); - - // return this.http.post(url, "", options).map((res) => res.json()); - const headers = new HttpHeaders().set("content-type", "application/json"); - - return this.http - .post(url, "", { headers: headers }) - .pipe(map((res: { json: () => any }) => res.json())); - } - - saveToServer(data: { appname: string; filename: any; content: string }) { - let url = BASE_URL + "/save"; - let body = JSON.stringify({ data: data }); - // let headers = new Headers({ "Content-Type": "application/json" }); - // let options = new RequestOptions({ headers: headers }); - - // return this.http.post(url, body, options).map((res) => res.json()); - const headers = new HttpHeaders().set("content-type", "application/json"); - - return this.http - .post(url, body, { headers: headers }) - .pipe(map((res: { json: () => any }) => res.json())); - } - listFiles(appname: string) { - let url = BASE_URL + "/list"; - // let params: URLSearchParams = new URLSearchParams(); - // params.set("appname", appname); - return this.http - .get(url, { - params: { - appname: appname, - }, - }) - .pipe(map((res: { json: () => any }) => res.json())); - } - - saveMultiple(appname: any, data: any) { - let url = BASE_URL + "/saveMutiple"; - let body = JSON.stringify({ appname: appname, data: data }); - // let headers = new Headers({ "Content-Type": "application/json" }); - // let options = new RequestOptions({ headers: headers }); - - // return this.http.post(url, body, options).map((res) => res.json()); - const headers = new HttpHeaders().set("content-type", "application/json"); - - return this.http - .post(url, body, { headers: headers }) - .pipe(map((res: { json: () => any }) => res.json())); - } - moveLocal(appname: any, args: any) { - let url = BASE_URL + "/moveLocal"; - // let params: URLSearchParams = new URLSearchParams(); - // params.set("appname", appname); - // params.set("args", args); - return this.http - .get(url, { - params: { - appname: appname, - args: args, - }, - }) - .pipe(map((res: { json: () => any }) => res.json())); - // return this.http.get(url, { search: params }).map((res) => res.json()); - } - deleteFile(filename: any, appname: any) { - // let headers = new Headers({ "Content-Type": "application/json" }); - // let options = new RequestOptions({ headers: headers }); - const headers = new HttpHeaders().set("content-type", "application/json"); - - return this.http - .delete(`${BASE_URL}/delete?appname=${appname}&filename=${filename}`, { - headers: headers, - }) - .pipe(map((res: { json: () => any }) => res.json())); - } - - restore(appname: string, key: string) { - let url = BASE_URL + "/purchases"; - // let params: URLSearchParams = new URLSearchParams(); - // params.set("appname", appname); - // params.set("key", key); - return this.http - .get(url, { - params: { - appname: appname, - key: key, - }, - }) - .pipe(map((res: { json: () => any }) => res.json())); - - // .map((res) => res.json()); - } - handleError(error: { error: any }) { - console.error(JSON.stringify(error)); - return Observable.throw(error.error || "Server error"); - } - - putLogoURL(appname: string, content: string) { - let suffix = "jpeg"; - let url = BASE_URL + "/logo"; - let body = JSON.stringify({ content: content, suffix: suffix }); - // let headers = new Headers({ "Content-Type": "application/json" }); - // let options = new RequestOptions({ headers: headers }); - - // return this.http.post(url, body, options).map((res) => res.json()); - const headers = new HttpHeaders().set("content-type", "application/json"); - - return this.http - .post(url, body, { headers: headers }) - .pipe(map((res: { json: () => any }) => res.json())); - } -} diff --git a/Govt-Billing-Angular/src/app/home/home-routing.module.ts b/Govt-Billing-Angular/src/app/home/home-routing.module.ts deleted file mode 100644 index 29c3f60..0000000 --- a/Govt-Billing-Angular/src/app/home/home-routing.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { HomePage } from './home.page'; - -const routes: Routes = [ - { - path: '', - component: HomePage, - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class HomePageRoutingModule {} diff --git a/Govt-Billing-Angular/src/app/home/home.module.ts b/Govt-Billing-Angular/src/app/home/home.module.ts deleted file mode 100644 index a554f01..0000000 --- a/Govt-Billing-Angular/src/app/home/home.module.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { IonicModule } from '@ionic/angular'; -import { FormsModule } from '@angular/forms'; -import { HomePage } from './home.page'; - -import { HomePageRoutingModule } from './home-routing.module'; - - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - IonicModule, - HomePageRoutingModule - ], - declarations: [HomePage] -}) -export class HomePageModule {} diff --git a/Govt-Billing-Angular/src/app/home/home.page.html b/Govt-Billing-Angular/src/app/home/home.page.html deleted file mode 100644 index aca9042..0000000 --- a/Govt-Billing-Angular/src/app/home/home.page.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - {{ selectedFile }}(*) - -
    - - - {{footer.name}} - - -
    -
    -
    - - -
    -
    -
    -
    diff --git a/Govt-Billing-Angular/src/app/home/home.page.scss b/Govt-Billing-Angular/src/app/home/home.page.scss deleted file mode 100644 index 8993e7c..0000000 --- a/Govt-Billing-Angular/src/app/home/home.page.scss +++ /dev/null @@ -1,27 +0,0 @@ -#container { - text-align: center; - - position: absolute; - left: 0; - right: 0; - top: 50%; - transform: translateY(-50%); -} - -#container strong { - font-size: 20px; - line-height: 26px; -} - -#container p { - font-size: 16px; - line-height: 22px; - - color: #8c8c8c; - - margin: 0; -} - -#container a { - text-decoration: none; -} \ No newline at end of file diff --git a/Govt-Billing-Angular/src/app/home/home.page.spec.ts b/Govt-Billing-Angular/src/app/home/home.page.spec.ts deleted file mode 100644 index 68caa9a..0000000 --- a/Govt-Billing-Angular/src/app/home/home.page.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { IonicModule } from '@ionic/angular'; - -import { HomePage } from './home.page'; - -describe('HomePage', () => { - let component: HomePage; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ HomePage ], - imports: [IonicModule.forRoot()] - }).compileComponents(); - - fixture = TestBed.createComponent(HomePage); - component = fixture.componentInstance; - fixture.detectChanges(); - })); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/Govt-Billing-Angular/src/app/home/home.page.ts b/Govt-Billing-Angular/src/app/home/home.page.ts deleted file mode 100644 index 59b45c4..0000000 --- a/Govt-Billing-Angular/src/app/home/home.page.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { DATA } from "./../app-data"; -import { LocalServiceService, File } from "./../local-service.service"; -import { Component, ViewChild, ElementRef, AfterViewInit } from "@angular/core"; -import { Router } from "@angular/router"; -import { NavController, AlertController } from "@ionic/angular"; -import * as AppGeneral from "socialcalc/AppGeneral"; - -@Component({ - selector: "app-home", - templateUrl: "home.page.html", - styleUrls: ["home.page.scss"], -}) -export class HomePage { - @ViewChild("tableeditor") defaultContent: ElementRef; - - footers: any = []; - msc: any; - tableeditor: any; - selectedFile: string; - selectedFileInterval: any; - saveInterval: any; - - constructor( - private router: Router, - private navCtrl: NavController, - private localService: LocalServiceService, - private alertCtrl: AlertController - ) { - console.log("hello"); - // this.msc = DATA["home"][AppGeneral.getDeviceType()]["msc"]; - this.msc = DATA["home"]["android"]["msc"]; - // this.footers = DATA["home"][AppGeneral.getDeviceType()]["footers"]; - this.footers = DATA["home"]["android"]["footers"]; - this.localService.getSelectedFile().then((selectedFile) => { - this.selectedFile = selectedFile; - }); - } - ionViewWillEnter() { - console.log("home ion view will enter"); - this.selectedFileInterval = setInterval(() => { - this.localService.getSelectedFile().then((selectedFile) => { - this.selectedFile = selectedFile; - }); - }, 2000); - - this.saveInterval = setInterval(() => { - // console.log("Entering..") - this.localService.getSelectedFile().then((selectedFile) => { - if (selectedFile == "default") { - selectedFile = "Untitled"; - let content = encodeURIComponent(AppGeneral.getSpreadsheetContent()); - this.localService.saveFile( - new File( - new Date().toString(), - new Date().toString(), - content, - selectedFile - ) - ); - this.localService.setSelectedFile(selectedFile); - return; - } - let name = selectedFile; - let content = encodeURIComponent(AppGeneral.getSpreadsheetContent()); - this.localService.getFile(name).then((data) => { - let password = data.password; - let created = new Date(data.created).toString(); - this.localService.saveFile( - new File(created, new Date().toString(), content, name, password) - ); - this.localService.setSelectedFile(name); - }); - }); - }, 1000); - } - ionViewWillLeave() { - clearInterval(this.selectedFileInterval); - this.localService.getSelectedFile().then((selectedFile) => { - if (selectedFile == "Untitled") { - this.presentAlert( - "Save file", - "File temporary saved. Please click Save As in Menu to save file" - ); - } - }); - clearInterval(this.saveInterval); - } - ngAfterViewInit() { - console.log("ngafterviewinint"); - var tableeditor: HTMLDivElement = this.defaultContent.nativeElement; - this.tableeditor = tableeditor; - console.log("ngafterviewinint1"); - - this.localService.getSelectedFile().then((selectedFile) => { - if (selectedFile == "default" || !selectedFile) { - AppGeneral.initializeApp(tableeditor, JSON.stringify(this.msc)); - console.log("ngafterviewinint2"); - } else { - this.localService.getFile(this.selectedFile).then((data) => { - AppGeneral.initializeApp( - tableeditor, - decodeURIComponent(data.content) - ); - console.log("ngafterviewinint3"); - }); - } - }); - } - - activateFooter(footer: { index: any }) { - AppGeneral.activateFooterButton(footer.index); - // console.log("activating: "+footer.index+", name:"+footer.name); - for (var i in this.footers) { - if (this.footers[i].index == footer.index) { - this.footers[i].isActive = true; - } else { - this.footers[i].isActive = false; - } - } - } - - presentAlert(title: string, subtitle: string) { - let alert = this.alertCtrl - .create({ - header: title, - message: subtitle, - buttons: [ - { - text: "Okay", - }, - ], - }) - .then((alertEl) => { - alertEl.present(); - }); - } -} diff --git a/Govt-Billing-Angular/src/app/inapp-purchase.service.spec.ts b/Govt-Billing-Angular/src/app/inapp-purchase.service.spec.ts deleted file mode 100644 index 58f5726..0000000 --- a/Govt-Billing-Angular/src/app/inapp-purchase.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { InappPurchaseService } from './inapp-purchase.service'; - -describe('InappPurchaseService', () => { - let service: InappPurchaseService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(InappPurchaseService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/Govt-Billing-Angular/src/app/inapp-purchase.service.ts b/Govt-Billing-Angular/src/app/inapp-purchase.service.ts deleted file mode 100644 index 01b3e27..0000000 --- a/Govt-Billing-Angular/src/app/inapp-purchase.service.ts +++ /dev/null @@ -1,565 +0,0 @@ -import { HttpClient } from "@angular/common/http"; -import { Injectable } from "@angular/core"; -import { INAPPLOCAL, INAPP_ITEMS, CLOUDINAPP } from "./app-data"; -import { InAppPurchase } from "@ionic-native/in-app-purchase/ngx"; -import { map } from "rxjs/operators"; -import { Observable } from "rxjs"; -import { Storage } from "@ionic/storage"; - -import { - PDF_10, - PDF_25, - PDF_50, - PDF_100, - SPE_10, - SPE_500, - SPE_1000, - SAVE_PDF, - FB_10, - TW_10, - WA_10, - SMS_10, -} from "./app-data"; - -@Injectable({ - providedIn: "root", -}) -export class InappPurchaseService { - constructor( - // public http: HttpClient, - public storage: Storage, - public iap: InAppPurchase - ) { - this.storage = storage; - } - loadItems() { - return this.iap.getProducts(INAPP_ITEMS); - } - - setInappItems(items) { - this.storage.set("inapplocal", items); - } - - getInappItems() { - return this.storage.get("inapplocal").then((items) => { - if (!items) { - this.setInappItems(INAPPLOCAL); - return INAPPLOCAL; - } - return items; - }); - } - - setCloudItem(item) { - this.storage.set("cloudInapp", item); - } - getCloudItem() { - return this.storage.get("cloudInapp").then((items) => { - if (!items) { - this.setInappItems(CLOUDINAPP); - return CLOUDINAPP; - } - return items; - }); - } - - purchaseItem(id) { - return this.iap.buy(id); - } - - displayItems() { - return Observable.create((observer) => { - // execute here - var itemsArray = new Array(); - this.getInappItems().then((items) => { - console.log(JSON.stringify(items)); - for (var i in items) { - var units = 0; - var desc = ""; - var price = 0; - var icon = ""; - var status = false; - - switch (items[i].Feature) { - case "10Pdf": - desc = "Send 10 PDFs"; - price = 0.99; - icon = "document"; - break; - case "25Pdf": - desc = "Send 25 PDFs"; - price = 1.99; - icon = "document"; - break; - case "50Pdf": - desc = "Send 50 PDFs"; - price = 2.99; - icon = "document"; - break; - case "100Pdf": - desc = "Send 100 PDFs"; - price = 3.99; - icon = "document"; - break; - case "10Fb": - desc = "Share 10 PDFs via Facebook"; - price = 0.99; - icon = "logo-facebook"; - break; - case "10Tw": - desc = "Share 10 PDFs via Twitter"; - price = 0.99; - icon = "logo-twitter"; - break; - case "10Wa": - desc = "Share 10 PDFs via WhatsApp"; - price = 0.99; - icon = "logo-whatsapp"; - break; - case "10Sms": - desc = "Share 10 PDFs via SMS"; - price = 0.99; - icon = "contact"; - break; - case "10iBooks": - /*desc = 'Email 10 PDFs via Gmail'; - price = 0.99; - icon = 'logo-google'; - break;*/ - continue; - case "email-print-save": - desc = "10 times Email, Print and Save as"; - price = 0.99; - icon = "more"; - break; - case "email-second-print-save": - desc = "500 times Email, Print and Save as"; - price = 3.99; - icon = "more"; - break; - - case "email-third-print-save": - desc = "1000 times Email, Print and Save as"; - price = 6.99; - icon = "more"; - break; - } - - units = parseInt(items[i].Own) - parseInt(items[i].Consumed); - if (units > 0 && items[i].Purchase == "Yes") { - status = true; - } - - if (items[i].Feature != "10iBooks") { - itemsArray.push({ - name: items[i].Feature, - units: units, - id: items[i].Id, - desc: desc, - price: price, - icon: icon, - status: status, - }); - } - } - - /*if(window.localStorage.getItem("cloudInapp")){ - self.cloudInapp = JSON.parse(self.getCloudInapp()); - desc = "Sync and backup to server"; - price = 0.99; - icon = 'cloud-upload'; - var units = parseInt(self.cloudInapp[0].Own)-parseInt(self.cloudInapp[0].Consumed); - if(units > 0 && self.cloudInapp[0].Purchase == 'Yes'){ - status = true; - } - - itemsArray.push({name: self.cloudInapp[0].Feature, units: units, id: self.cloudInapp[0].Id, desc: desc, price: price, icon: icon, status: status }); - }*/ - }); - observer.next(itemsArray); - observer.complete(); - }); - } - - /* APIs for inapp items*/ - incrementCounter(index) { - return this.getInappItems().then((products) => { - var consumed = products[index].Consumed; - consumed++; - if (consumed == products[index].Own) { - products[index].Purchase = "No"; - products[index].Consumed = 0; - products[index].Own = 0; - } else { - products[index].Consumed = consumed; - } - - var left = - parseInt(products[index].Own) - parseInt(products[index].Consumed); - console.log( - "Product index " + index + " updated: " + JSON.stringify(products) - ); - this.setInappItems(products); - return left; - }); - } - - isPDFAvailable() { - return this.getInappItems().then((products) => { - for (var i = 0; i < 4; i++) { - if (products[i].Purchase == "Yes") { - var units = - parseInt(products[i].Own) - parseInt(products[i].Consumed); - console.log("Export PDF units: " + units); - if (units > 0) return true; - } - } - return false; - }); - } - - updatePDF() { - return Observable.create((observer) => { - let that = this; - this.getInappItems().then((products) => { - // console.log(products); - for (var i = 0; i < 4; i++) { - if (products[i].Purchase == "Yes") { - that.incrementCounter(i).then((units) => { - observer.next(units); - observer.complete(); - }); - } - } - }); - }); - } - - isFbSharePDFAvailable() { - return this.getInappItems().then((products) => { - // 4 is the index of the products - if (products[4].Purchase == "Yes") { - let units = parseInt(products[4].Own) - parseInt(products[4].Consumed); - console.log("Share PDF units: " + units); - if (units > 0) return true; - } - }); - } - - updateFbSharePDF() { - return Observable.create((observer) => { - this.incrementCounter(4).then((units) => { - observer.next(units); - observer.complete(); - }); - }); - } - - isTwSharePDFAvailable() { - return this.getInappItems().then((products) => { - // 4 is the index of the products - if (products[5].Purchase == "Yes") { - let units = parseInt(products[5].Own) - parseInt(products[5].Consumed); - console.log("Share PDF units: " + units); - if (units > 0) return true; - } - }); - } - - updateTwSharePDF() { - return Observable.create((observer) => { - this.incrementCounter(5).then((units) => { - observer.next(units); - observer.complete(); - }); - }); - } - - isWaSharePDFAvailable() { - return this.getInappItems().then((products) => { - // 4 is the index of the products - if (products[6].Purchase == "Yes") { - let units = parseInt(products[6].Own) - parseInt(products[6].Consumed); - console.log("Share PDF units: " + units); - if (units > 0) return true; - } - }); - } - - updateWaSharePDF() { - return Observable.create((observer) => { - this.incrementCounter(6).then((units) => { - observer.next(units); - observer.complete(); - }); - }); - } - - isSmsSharePDFAvailable() { - return this.getInappItems().then((products) => { - // 4 is the index of the products - if (products[7].Purchase == "Yes") { - let units = parseInt(products[7].Own) - parseInt(products[7].Consumed); - console.log("Share PDF units: " + units); - if (units > 0) return true; - } - }); - } - - updateSmsSharePDF() { - return Observable.create((observer) => { - this.incrementCounter(7).then((units) => { - observer.next(units); - observer.complete(); - }); - }); - } - - isSharePDFAvailable() { - return this.getInappItems().then((products) => { - // 4 is the index of the products - if (products[4].Purchase == "Yes") { - let units = parseInt(products[4].Own) - parseInt(products[4].Consumed); - console.log("Share PDF units: " + units); - if (units > 0) return true; - } else if (products[5].Purchase == "Yes") { - let units = parseInt(products[5].Own) - parseInt(products[5].Consumed); - console.log("Share PDF units: " + units); - if (units > 0) return true; - } else if (products[6].Purchase == "Yes") { - let units = parseInt(products[6].Own) - parseInt(products[6].Consumed); - console.log("Share PDF units: " + units); - if (units > 0) return true; - } else if (products[7].Purchase == "Yes") { - let units = parseInt(products[7].Own) - parseInt(products[7].Consumed); - console.log("Share PDF units: " + units); - if (units > 0) return true; - } else return false; - }); - } - - updateSharePDF() { - return Observable.create((observer) => { - this.incrementCounter(4).then((units) => { - observer.next(units); - observer.complete(); - }); - }); - } - - /*isSavePDFAvailable(){ // For client-side PDF - return this.getInappItems().then(products =>{ - // 6 is the index of the products - if(products[6].Purchase == "Yes"){ - let units = parseInt(products[6].Own) - parseInt(products[6].Consumed); - if(units > 0) return true; - else return false; - } - else return false; - }); - } - - updateSavePDF(){ - return this.incrementCounter(6); - }*/ - - isSavePrintEmailAvailable() { - return this.getInappItems().then((products) => { - // 4 is the index of the products - if (products[9].Purchase == "Yes") { - let units = parseInt(products[9].Own) - parseInt(products[9].Consumed); - if (units > 0) return true; - } else if (products[10].Purchase == "Yes") { - let units = - parseInt(products[10].Own) - parseInt(products[10].Consumed); - if (units > 0) return true; - } else if (products[11].Purchase == "Yes") { - let units = - parseInt(products[11].Own) - parseInt(products[11].Consumed); - if (units > 0) return true; - } - - return false; - }); - } - - updateSavePrintEmail() { - return Observable.create((observer) => { - let that = this; - this.getInappItems().then((products) => { - // console.log(products); - let itemConsumed = 9; - if ( - products[9].Purchase == "Yes" && - products[9].Consumed <= products[9].Own - ) { - itemConsumed = 9; - } else if ( - products[10].Purchase == "Yes" && - products[10].Consumed <= products[10].Own - ) { - itemConsumed = 10; - } else if ( - products[11].Purchase == "Yes" && - products[11].Consumed <= products[11].Own - ) { - itemConsumed = 11; - } else { - console.log("No email, print and save as"); - return; - } - that.incrementCounter(itemConsumed).then((units) => { - observer.next(units); - observer.complete(); - }); - }); - }); - } - - successCallback(id) { - return Observable.create((observer) => { - this.getInappItems().then((products) => { - switch (id) { - case PDF_10: - products[0].Purchase = "Yes"; - products[0].Own = 10 + (products[0].Own - products[0].Consumed); - products[0].Consumed = 0; - console.log("owned: " + id + ", units: " + products[0].Own); - break; - - case PDF_25: - products[1].Purchase = "Yes"; - products[1].Own = 25 + (products[1].Own - products[1].Consumed); - products[1].Consumed = 0; - console.log("owned: " + id + ", units: " + products[1].Own); - break; - - case PDF_50: - products[2].Purchase = "Yes"; - products[2].Own = 50 + (products[2].Own - products[2].Consumed); - products[2].Consumed = 0; - console.log("owned: " + id + ", units: " + products[2].Own); - break; - - case PDF_100: - products[3].Purchase = "Yes"; - products[3].Own = 100 + (products[3].Own - products[3].Consumed); - products[3].Consumed = 0; - console.log("owned: " + id + ", units: " + products[3].Own); - break; - - /*case SHARE_PDF: - products[4].Purchase="Yes"; - products[4].Own= 10 + (products[4].Own - products[4].Consumed); - products[4].Consumed = 0; - console.log('owned: '+id+', units: '+products[4].Own); - break;*/ - - case FB_10: - products[4].Purchase = "Yes"; - products[4].Own = 10 + (products[4].Own - products[4].Consumed); - products[4].Consumed = 0; - console.log("owned: " + id + ", units: " + products[4].Own); - break; - - case TW_10: - products[5].Purchase = "Yes"; - products[5].Own = 10 + (products[5].Own - products[5].Consumed); - products[5].Consumed = 0; - console.log("owned: " + id + ", units: " + products[5].Own); - break; - - case WA_10: - products[6].Purchase = "Yes"; - products[6].Own = 10 + (products[6].Own - products[6].Consumed); - products[6].Consumed = 0; - console.log("owned: " + id + ", units: " + products[6].Own); - break; - - case SMS_10: - products[7].Purchase = "Yes"; - products[7].Own = 10 + (products[7].Own - products[7].Consumed); - products[7].Consumed = 0; - console.log("owned: " + id + ", units: " + products[7].Own); - break; - - case SPE_10: - let left_10 = 0; - if (products[10].Purchase == "Yes") { - left_10 = products[10].Own - products[10].Consumed; - products[10].Consumed = 0; - products[10].Own = 0; - products[10].Purchase = "No"; - } - if (products[11].Purchase == "Yes") { - left_10 = left_10 + (products[11].Own - products[11].Consumed); - products[11].Consumed = 0; - products[11].Own = 0; - products[11].Purchase = "No"; - } - - products[9].Purchase = "Yes"; - products[9].Own = - 10 + left_10 + (products[9].Own - products[9].Consumed); - console.log("owned now: " + products[9].Own); - products[9].Consumed = 0; - break; - - case SPE_500: - let left_500 = 0; - if (products[9].Purchase == "Yes") { - left_500 = products[9].Own - products[9].Consumed; - products[9].Consumed = 0; - products[9].Own = 0; - products[9].Purchase = "No"; - } - if (products[11].Purchase == "Yes") { - left_500 = left_500 + (products[11].Own - products[11].Consumed); - products[11].Consumed = 0; - products[11].Own = 0; - products[11].Purchase = "No"; - } - - products[10].Purchase = "Yes"; - products[10].Own = - 500 + left_500 + (products[10].Own - products[10].Consumed); - console.log("owned now: " + products[10].Own); - products[10].Consumed = 0; - break; - - case SPE_1000: - let left_1000 = 0; - if (products[9].Purchase == "Yes") { - left_1000 = products[10].Own - products[10].Consumed; - products[10].Consumed = 0; - products[10].Own = 0; - products[10].Purchase = "No"; - } - if (products[9].Purchase == "Yes") { - left_1000 = left_1000 + (products[9].Own - products[9].Consumed); - products[9].Consumed = 0; - products[9].Own = 0; - products[9].Purchase = "No"; - } - - products[11].Purchase = "Yes"; - products[11].Own = - 1000 + left_1000 + (products[11].Own - products[11].Consumed); - console.log("owned now: " + products[11].Own); - products[11].Consumed = 0; - break; - - case SAVE_PDF: //Client-side PDF - break; - - default: - break; - } - - this.setInappItems(products); - observer.next(products); - observer.complete(); - }); - }); - } -} diff --git a/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase-routing.module.ts b/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase-routing.module.ts deleted file mode 100644 index 7dc0df9..0000000 --- a/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase-routing.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; - -import { InappPurchasePage } from './inapp-purchase.page'; - -const routes: Routes = [ - { - path: '', - component: InappPurchasePage - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class InappPurchasePageRoutingModule {} diff --git a/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase.module.ts b/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase.module.ts deleted file mode 100644 index bc38321..0000000 --- a/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; - -import { IonicModule } from '@ionic/angular'; - -import { InappPurchasePageRoutingModule } from './inapp-purchase-routing.module'; - -import { InappPurchasePage } from './inapp-purchase.page'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - IonicModule, - InappPurchasePageRoutingModule - ], - declarations: [InappPurchasePage] -}) -export class InappPurchasePageModule {} diff --git a/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase.page.html b/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase.page.html deleted file mode 100644 index f6a9c9e..0000000 --- a/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase.page.html +++ /dev/null @@ -1,42 +0,0 @@ - - - In-app purchase - - - - - - - - - - - -

    {{ item.desc }}

    -

    Price: $ {{ item.price }}

    -

    - In-app Active: - - {{ item.units }} units left - - - {{ item.units }} units left - -

    -
    -
    -
    - - - -
    -  Loading products... -
    -
    -
    diff --git a/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase.page.scss b/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase.page.scss deleted file mode 100644 index e69de29..0000000 diff --git a/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase.page.spec.ts b/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase.page.spec.ts deleted file mode 100644 index daf4e77..0000000 --- a/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase.page.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { IonicModule } from '@ionic/angular'; - -import { InappPurchasePage } from './inapp-purchase.page'; - -describe('InappPurchasePage', () => { - let component: InappPurchasePage; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ InappPurchasePage ], - imports: [IonicModule.forRoot()] - }).compileComponents(); - - fixture = TestBed.createComponent(InappPurchasePage); - component = fixture.componentInstance; - fixture.detectChanges(); - })); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase.page.ts b/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase.page.ts deleted file mode 100644 index 0770f3f..0000000 --- a/Govt-Billing-Angular/src/app/inapp-purchase/inapp-purchase.page.ts +++ /dev/null @@ -1,218 +0,0 @@ -import { ActionSheetController } from "@ionic/angular"; -import { ToastController } from "@ionic/angular"; -import { InappPurchaseService } from "./../inapp-purchase.service"; -import { NavController, Platform } from "@ionic/angular"; -import { Component, OnInit } from "@angular/core"; -import { - PDF_10, - PDF_25, - PDF_50, - PDF_100, - SPE_10, - SPE_500, - SPE_1000, -} from "../app-data"; -import { Network } from "@ionic-native/network/ngx"; - -@Component({ - selector: "app-inapp-purchase", - templateUrl: "./inapp-purchase.page.html", - styleUrls: ["./inapp-purchase.page.scss"], -}) -export class InappPurchasePage implements OnInit { - items: any = []; - loaded: any; - - constructor( - public navCtrl: NavController, - public platform: Platform, - public inapp: InappPurchaseService, - public toastCtrl: ToastController, - public actionSheetCtrl: ActionSheetController, - public network: Network - ) { - this.loaded = false; - } - - ngOnInit() {} - ionViewWillEnter() { - // console.log('Hello InappPurchasePage Page'); - this.inapp.displayItems().subscribe((items) => { - this.items = items; - }); - - if (!this.loaded) { - this.inapp.loadItems().then( - (products) => { - this.loaded = true; - }, - (error) => { - console.log("Error while loading: " + JSON.stringify(error)); - } - ); - } - - this.platform.ready().then(() => { - // watch network for a connection - this.network.onConnect().subscribe(() => { - console.log("network connected!"); - setTimeout(() => { - if (this.network.type == "unknown") { - console.log("No network connection.Connect and continue"); - this.loaded = false; - } else { - console.log("Loaded=>" + this.loaded); - if (!this.loaded) { - this.inapp.loadItems().then( - (products) => { - this.loaded = true; - }, - (error) => { - console.log("Error while loading: " + JSON.stringify(error)); - } - ); - } - } - }, 3000); - }); - - this.network.onDisconnect().subscribe(() => { - console.log("No network connection.Connect and continue"); - this.loaded = false; - }); - }); - } - - loadProducts() { - this.inapp.loadItems().then( - (products) => { - this.loaded = true; - }, - (error) => { - console.log("Error while loading: " + JSON.stringify(error)); - } - ); - } - - buyItem(id) { - if (!this.loaded) { - this.loadProducts(); - } - let that = this; - this.inapp.getInappItems().then((products) => { - switch (id) { - case PDF_10: - case PDF_25: - case PDF_50: - case PDF_100: - for (var i = 0; i < 4; i++) { - if (products[i].Purchase == "Yes") { - that.showToast("PDFs already purchased"); - return; - } - } - break; - - case SPE_10: - case SPE_500: - case SPE_1000: - if (products[9].Purchase == "Yes") { - if (products[9].Own - products[9].Consumed > 3) { - that.showToast("Please consume the remaining units"); - return; - } else if (products[10].Own - products[10].Consumed > 30) { - that.showToast("Please consume the remaining units"); - return; - } else if (products[11].Own - products[11].Consumed > 30) { - that.showToast("Please consume the remaining units"); - return; - } - } else if (products[10].Purchase == "Yes") { - if (products[9].Own - products[9].Consumed > 3) { - that.showToast("Please consume the remaining units"); - return; - } else if (products[10].Own - products[10].Consumed > 30) { - that.showToast("Please consume the remaining units"); - return; - } else if (products[11].Own - products[11].Consumed > 30) { - that.showToast("Please consume the remaining units"); - return; - } - } else if (products[11].Purchase == "Yes") { - if (products[9].Own - products[9].Consumed > 3) { - that.showToast("Please consume the remaining units"); - return; - } else if (products[10].Own - products[10].Consumed > 30) { - that.showToast("Please consume the remaining units"); - return; - } else if (products[11].Own - products[11].Consumed > 30) { - that.showToast("Please consume the remaining units"); - return; - } - } - break; - - default: - break; - } - - this.inapp.purchaseItem(id).then((data) => { - // console.log(JSON.stringify(data)); - this.inapp.successCallback(id).subscribe((sucesss) => { - console.log("Purchase successful. Product updated. "); - that.inapp.displayItems().subscribe((items) => { - that.items = items; - }); - }); - }); - }); - } - - showActionForInapp(item) { - let actionSheet = this.actionSheetCtrl - .create({ - header: "More Options", - buttons: [ - { - text: "Buy", - handler: () => { - console.log("buy clicked"); - this.buyItem(item.id); - }, - }, - { - text: "Cancel", - role: "cancel", - handler: () => { - console.log("Cancel clicked"); - }, - }, - ], - }) - .then((actionEl) => { - actionEl.present(); - }); - // actionSheet.present(); - } - - doRefresh(refresher) { - this.inapp.displayItems().subscribe((items) => { - this.items = items; - refresher.complete(); - }); - } - - async showToast(message) { - let toast = await this.toastCtrl.create({ - message: message, - duration: 3000, - position: "bottom", - }); - - toast.dismiss(() => { - // console.log('Dismissed toast'); - }); - - toast.present(); - } -} diff --git a/Govt-Billing-Angular/src/app/list/list-routing.module.ts b/Govt-Billing-Angular/src/app/list/list-routing.module.ts deleted file mode 100644 index 625bb53..0000000 --- a/Govt-Billing-Angular/src/app/list/list-routing.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; - -import { ListPage } from './list.page'; - -const routes: Routes = [ - { - path: '', - component: ListPage - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class ListPageRoutingModule {} diff --git a/Govt-Billing-Angular/src/app/list/list.module.ts b/Govt-Billing-Angular/src/app/list/list.module.ts deleted file mode 100644 index 232a97b..0000000 --- a/Govt-Billing-Angular/src/app/list/list.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; - -import { IonicModule } from '@ionic/angular'; - -import { ListPageRoutingModule } from './list-routing.module'; - -import { ListPage } from './list.page'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - IonicModule, - ListPageRoutingModule - ], - declarations: [ListPage] -}) -export class ListPageModule {} diff --git a/Govt-Billing-Angular/src/app/list/list.page.html b/Govt-Billing-Angular/src/app/list/list.page.html deleted file mode 100644 index bd1b9e5..0000000 --- a/Govt-Billing-Angular/src/app/list/list.page.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - Device Files - - - Server Files - - - - - - - - - - - - - - - - - - - -
    - - -
    - - {{ deviceFile.name }} - - -
    -
    - - - - -

    {{ deviceFile.name }}

    - -

    - {{ deviceFile.modified }} -

    -
    -
    -
    -
    -
    - - - -
    - - {{ cloudFile.name }} - - -
    - -
    - -

    {{ cloudFile.name }}

    - -

    - {{ cloudFile.timestamp }} -

    -
    -
    -
    -
    -
    -
    - -
    -
    -
    - - - - - -   Move to Server - -   Move to - Local - - - diff --git a/Govt-Billing-Angular/src/app/list/list.page.scss b/Govt-Billing-Angular/src/app/list/list.page.scss deleted file mode 100644 index e69de29..0000000 diff --git a/Govt-Billing-Angular/src/app/list/list.page.spec.ts b/Govt-Billing-Angular/src/app/list/list.page.spec.ts deleted file mode 100644 index b63f894..0000000 --- a/Govt-Billing-Angular/src/app/list/list.page.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { IonicModule } from '@ionic/angular'; - -import { ListPage } from './list.page'; - -describe('ListPage', () => { - let component: ListPage; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ListPage ], - imports: [IonicModule.forRoot()] - }).compileComponents(); - - fixture = TestBed.createComponent(ListPage); - component = fixture.componentInstance; - fixture.detectChanges(); - })); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/Govt-Billing-Angular/src/app/list/list.page.ts b/Govt-Billing-Angular/src/app/list/list.page.ts deleted file mode 100644 index 76d6869..0000000 --- a/Govt-Billing-Angular/src/app/list/list.page.ts +++ /dev/null @@ -1,557 +0,0 @@ -import { Router } from "@angular/router"; -import { AlertController } from "@ionic/angular"; -import { ToastController } from "@ionic/angular"; -import { CloudServiceService } from "./../cloud-service.service"; -import { LocalServiceService, File } from "./../local-service.service"; -import { NavController, ActionSheetController } from "@ionic/angular"; -import { Component, OnInit } from "@angular/core"; -import { DATA, APP_NAME } from "./../app-data"; -import * as AppGeneral from "socialcalc/AppGeneral"; - -@Component({ - selector: "app-list", - templateUrl: "./list.page.html", - styleUrls: ["./list.page.scss"], -}) -export class ListPage implements OnInit { - deviceFiles: any = []; - filesSegment: any; - selectClicked: any; - activeSegment: any; - cachedList: any = []; - msc: any; - request: any = {}; - cloudFiles: any = []; - - constructor( - public navCtrl: NavController, - public localService: LocalServiceService, - public cloudService: CloudServiceService, - public actionSheetCtrl: ActionSheetController, - public toastCtrl: ToastController, - public alertCtrl: AlertController, - private router: Router - ) { - this.filesSegment = "local"; - this.activeSegment = "local"; - this.request.done = true; - this.selectClicked = false; - this.msc = DATA["home"][AppGeneral.getDeviceType()]["msc"]; - } - - ngOnInit() {} - - loadLocalFiles() { - this.activeSegment = "local"; - this.localService.getAllFiles().then( - (data) => { - // console.log(JSON.stringify(data)); - this.deviceFiles = data; - }, - (err) => console.log(err) - ); - } - - loadServerFiles() { - this.activeSegment = "server"; - - if (this.cloudFiles != "") { - // alert(JSON.stringify(this.cloudFiles)); - this.cachedList = this.cloudFiles; - return this.cloudFiles; - } - - this.request.done = false; - this.cloudService.listFiles(APP_NAME).subscribe( - (data) => { - this.request.done = true; - // console.log(data); - if (data.result == "ok") { - let serverFiles = data.data; - // console.log(JSON.stringify(serverFiles)); - for (var i in data.data) { - // console.log(i); - let name = i; - console.log(name); - let res = decodeURIComponent(serverFiles[i]); - // console.log(res); - var fileobj = JSON.parse(res); - var timestamp = new Date().toLocaleString(); - if (fileobj["timestamp"]) { - timestamp = new Date(fileobj["timestamp"]).toLocaleString(); - } - this.cloudFiles.push({ - name: name, - timestamp: timestamp, - checked: false, - data: serverFiles[i], - }); - // console.log("cloud: "+JSON.stringify(this.cloudFiles)); - } - // console.log("cloud: "+JSON.stringify(this.cloudFiles)); - this.cachedList = this.cloudFiles; - return this.cloudFiles; - } else if (data.result == "fatal") { - // return data.result; - this.catchFatalError(); - } - }, - (error) => { - this.request.done = true; - console.log(JSON.stringify(error)); - } - ); - } - - ionViewWillEnter() { - this.loadLocalFiles(); - } - - selectTab(index: number) { - // var t: Tabs = this.navCtrl.parent; - // setTimeout(() => { - // t.select(index); - // }, 2000); - this.router.navigateByUrl("/tabs/home"); - } - - editFile(file) { - if (this.filesSegment == "local") { - if (file == "default") { - AppGeneral.viewFile("default", JSON.stringify(this.msc)); - this.localService.setSelectedFile(file); - this.showToast("Loading file " + file + "..."); - this.router.navigateByUrl("/tabs/home"); - - // this.selectTab(0); - } else { - this.localService.getPassword(file).then((hasPassword) => { - if (hasPassword === undefined) { - console.log("Is not password protected"); - this.localService.getFile(file).then((data) => { - AppGeneral.viewFile(file, decodeURIComponent(data.content)); - this.localService.setSelectedFile(file); - this.showToast("Loading file " + file + "..."); - this.router.navigateByUrl("/tabs/home"); - - // this.selectTab(0); - }); - } else { - let alert = this.alertCtrl - .create({ - header: "Enter password", - inputs: [ - { - name: "password", - placeholder: "Password", - type: "password", - }, - ], - buttons: [ - { - text: "Cancel", - role: "cancel", - handler: (data) => { - console.log("Cancel clicked"); - }, - }, - { - text: "Ok", - handler: (data) => { - if (data.password == hasPassword) { - console.log("Password is correct"); - this.localService.getFile(file).then((data) => { - AppGeneral.viewFile( - file, - decodeURIComponent(data.content) - ); - this.localService.setSelectedFile(file); - this.showToast("Loading file " + file + "..."); - this.router.navigateByUrl("/tabs/home"); - - // this.selectTab(0); - }); - } else { - console.log("Password is incorrect"); - this.showToast("Incorrect password. Try again! "); - } - }, - }, - ], - }) - .then((alertEl) => { - alertEl.present(); - }); - // alert.present(); - } - }); - } - } else { - this.showToast("Move file to local to edit"); - } - } - deleteFile(file) { - if (this.filesSegment == "local") { - if (file == "default") { - this.showToast("Cannot delete default file!"); - return false; - } - - let alert = this.alertCtrl - .create({ - header: "Cofirm delete", - // title: "Confirm delete", - message: "Do you want to delete this file?", - buttons: [ - { - text: "Cancel", - role: "cancel", - handler: () => { - console.log("Cancel clicked"); - }, - }, - { - text: "Delete", - handler: () => { - console.log("Delete clicked"); - this.localService.getPassword(file).then((hasPassword) => { - if (hasPassword === undefined) { - console.log("Is not password protected"); - this.localService.deleteFile(file); - setTimeout(() => { - this.loadLocalFiles(); - }, 1000); - this.showToast(file + " deleted successfully!"); - AppGeneral.viewFile("default", JSON.stringify(this.msc)); - this.localService.setSelectedFile("default"); - } else { - let alert = this.alertCtrl - .create({ - header: "Enter password", - inputs: [ - { - name: "password", - placeholder: "Password", - type: "password", - }, - ], - buttons: [ - { - text: "Cancel", - role: "cancel", - handler: (data) => { - console.log("Cancel clicked"); - }, - }, - { - text: "Ok", - handler: (data) => { - if (data.password == hasPassword) { - console.log("Password is correct"); - this.localService.deleteFile(file); - setTimeout(() => { - this.loadLocalFiles(); - }, 1000); - this.showToast(file + " deleted successfully!"); - AppGeneral.viewFile( - "default", - JSON.stringify(this.msc) - ); - this.localService.setSelectedFile("default"); - } else { - console.log("Password is incorrect"); - this.showToast( - "Incorrect password. Try again! " - ); - } - }, - }, - ], - }) - .then((alertEl) => { - alertEl.present(); - }); - // alert.present(); - } - }); - }, - }, - ], - }) - .then((alertEl) => { - alertEl.present(); - }); - // alert.present(); - } else { - let alert = this.alertCtrl - .create({ - header: "Confirm delete", - message: "Do you want to delete this file?", - buttons: [ - { - text: "Cancel", - role: "cancel", - handler: () => { - console.log("Cancel clicked"); - }, - }, - { - text: "Delete", - handler: () => { - console.log("Delete clicked"); - this.request.done = false; - this.cloudService.deleteFile(file, APP_NAME).subscribe( - (data) => { - this.request.done = true; - console.log(data.result); - if (data.result == "ok") { - this.showToast("Delete successful"); - let index = 0; - for (var i in this.cloudFiles) { - if (this.cloudFiles[i].name == file) { - console.log("Found " + file); - this.cloudFiles.splice(index, 1); - } - index++; - } - // this.loadServerFiles(); - } - if (data.result == "fatal") { - this.catchFatalError(); - } - }, - (error) => { - this.request.done = true; - console.log(JSON.stringify(error)); - } - ); - }, - }, - ], - }) - .then((alterEl) => { - alterEl.present(); - }); - // alert.present(); - } - } - - showActionForFile(file) { - let actionSheet = this.actionSheetCtrl - .create({ - header: "More Options", - buttons: [ - { - text: "Delete", - role: "destructive", - handler: () => { - console.log("delete clicked"); - this.deleteFile(file.name); - }, - }, - { - text: "Edit", - handler: () => { - console.log("edit clicked"); - this.editFile(file.name); - }, - }, - { - text: "Cancel", - role: "cancel", - handler: () => { - console.log("Cancel clicked"); - }, - }, - ], - }) - .then((actionEl) => { - actionEl.present(); - }); - // actionSheet.present(); - } - - getResults(ev: any) { - if (this.filesSegment == "local") { - this.localService.getAllFiles().then( - (data) => { - // console.log(JSON.stringify(data)); - this.deviceFiles = data; - let val = ev.target.value; - // if the value is an empty string don't filter the items - if (val && val.trim() != "") { - this.deviceFiles = this.deviceFiles.filter((item) => { - return item.name.toLowerCase().indexOf(val.toLowerCase()) > -1; - }); - } - }, - (err) => console.log(err) - ); - } else { - this.cloudFiles = this.cachedList; - let val = ev.target.value; - // if the value is an empty string don't filter the items - if (val && val.trim() != "") { - this.cloudFiles = this.cloudFiles.filter((item) => { - return item.name.toLowerCase().indexOf(val.toLowerCase()) > -1; - }); - } - } - } - - doRefresh(refresher) { - let action = this.filesSegment; - - console.log("Begin async operation for ", action); - - if (action == "local") { - this.localService.getAllFiles().then( - (data) => { - // console.log(JSON.stringify(data)); - this.deviceFiles = data; - refresher.complete(); - }, - (err) => console.log(err) - ); - } else { - this.cloudFiles = []; - this.loadServerFiles(); - setTimeout(() => { - // console.log('Async operation has ended'); - refresher.complete(); - }, 2000); - } - } - - moveToServer() { - let that = this; - let oldList = this.deviceFiles; - let fileNames = []; - for (var i in oldList) { - if (oldList[i].checked == true && oldList[i].name != "default") { - fileNames.push(oldList[i].name); - } - } - let filesData: any = {}; - for (let i in fileNames) { - this.localService.getFile(fileNames[i]).then((data) => { - // console.log(JSON.stringify(data)); - filesData[fileNames[i]] = data.content; - }); - } - setTimeout(() => { - // console.log(filesData); - this.request.done = false; - this.cloudService.saveMultiple(APP_NAME, filesData).subscribe( - (data) => { - that.request.done = true; - console.log(data.length); - if (data.result == "fatal") { - that.catchFatalError(); - } - that.showToast("Files successfully saved!"); - }, - (error) => { - this.request.done = true; - console.log(JSON.stringify(error)); - } - ); - }, 1000); - } - - moveToLocal() { - let that = this; - let oldList = this.cloudFiles; - let fileNames = []; - for (let i in oldList) { - if (oldList[i].checked == true && oldList[i].name != "default") { - fileNames.push(oldList[i].name); - } - } - - (function saveFilesToLocal(fileNames) { - if (fileNames.length != 0) { - let filename = fileNames.pop(); // file to copy - //console.log(filename); - var isExistsInLocal = function (filename) { - for (let i in that.deviceFiles) { - if (filename == that.deviceFiles[i].name) { - return true; - } - } - return false; - }; - - var doSave = function (filename) { - for (let i in that.cloudFiles) { - if (filename == that.cloudFiles[i].name) { - console.log("saving " + filename + " to local"); - let content = that.cloudFiles[i].data; - let modified = new Date( - JSON.parse(decodeURIComponent(content))["timestamp"] - ).toString(); - that.localService.saveFile( - new File(new Date().toString(), modified, content, filename) - ); - that.showToast(filename + " saved successfully"); - saveFilesToLocal(fileNames); - } - } - }; - - if (isExistsInLocal(filename)) { - console.log(filename + " exists in local.Overwrite?"); - let confirm = that.alertCtrl - .create({ - header: "Overwrite", - message: - filename + - " exists in local. Do you want to overwrite this file?", - buttons: [ - { - text: "No", - role: "cancel", - handler: () => { - console.log("No clicked. Moving on..."); - saveFilesToLocal(fileNames); - }, - }, - { - text: "Yes", - handler: () => { - console.log("Yes clicked. Carry on..."); - doSave(filename); - }, - }, - ], - }) - .then((alertEl) => { - alertEl.present(); - }); - // confirm.present(); - } else { - doSave(filename); - } - } - })(fileNames); - } - - async showToast(message) { - let toast = await this.toastCtrl.create({ - message: message, - duration: 3000, - position: "bottom", - }); - - toast.dismiss(() => { - console.log("Dismissed toast"); - }); - - toast.present(); - } - - catchFatalError() { - this.localService.deleteToken(); - this.showToast("Session expired. Login to continue"); - } -} diff --git a/Govt-Billing-Angular/src/app/local-service.service.spec.ts b/Govt-Billing-Angular/src/app/local-service.service.spec.ts deleted file mode 100644 index 9144cc0..0000000 --- a/Govt-Billing-Angular/src/app/local-service.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { LocalServiceService } from './local-service.service'; - -describe('LocalServiceService', () => { - let service: LocalServiceService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(LocalServiceService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/Govt-Billing-Angular/src/app/local-service.service.ts b/Govt-Billing-Angular/src/app/local-service.service.ts deleted file mode 100644 index 6896ac8..0000000 --- a/Govt-Billing-Angular/src/app/local-service.service.ts +++ /dev/null @@ -1,178 +0,0 @@ -import { Storage } from "@ionic/storage"; -import { Injectable } from "@angular/core"; -import { HttpClient } from "@angular/common/http"; -import { DATA } from "./app-data"; -// import { IonicStorageModule } from "@ionic/Storage"; - -@Injectable({ - providedIn: "root", -}) -export class File { - created: string; - modified: string; - name: string; - content: string; - password: string; - constructor( - created: string, - modified: string, - content: string, - name: string, - password?: string - ) { - this.created = created; - this.modified = modified; - this.content = content; - this.name = name; - this.password = password; - } -} - -@Injectable({ - providedIn: "root", -}) -export class LocalServiceService { - public selectedFile: string; - public token: string; - - constructor(public http: HttpClient, public storage: Storage) { - this.storage = storage; - this.getSelectedFile().then((selectedFile) => { - this.selectedFile = selectedFile; - }); - this.token = null; - } - - saveFile(file: File) { - // console.log(file.password); - let fileData = { - created: file.created, - modified: file.modified, - content: file.content, - password: file.password, - }; - this.storage.set(file.name, fileData); - } - - getAllFiles() { - var files = new Array(); - - this.storage.forEach((value, key, index) => { - // console.log(JSON.stringify(value)); - switch (key) { - case "selectedFile": - case "choice": - case "inapplocal": - case "token": - case "cloudInapp": - case "cellArray": - case "logoArray": - case "inapp": - case "imgs": - case "didTutorial": - case "share": - case "flag": - case "inappPurchase": - case "cloudInapp": - case "sk_receiptForProduct": - case "sk_receiptForTransaction": - // do nothing... - break; - - default: - if (!value.password) { - files.push({ - name: key, - created: value.created, - modified: new Date(value.modified).toLocaleString(), - content: decodeURIComponent(value.content), - password: false, - }); - } else { - files.push({ - name: key, - created: value.created, - modified: new Date(value.modified).toLocaleString(), - content: decodeURIComponent(value.content), - password: value.password, - }); - } - break; - } - }); - - return new Promise((resolve, reject) => { - setTimeout(() => { - // console.log(JSON.stringify(files)); - files.push({ - name: "default", - created: new Date().toLocaleString(), - modified: new Date().toLocaleString(), - content: JSON.stringify( - // DATA["home"][AppGeneral.getDeviceType()]["msc"] - DATA["home"]["android"]["msc"] - ), - }); - resolve(files); - }, 500); - }); - } - - getFile(name: string) { - return this.storage.get(name); - } - - deleteFile(name: string) { - this.storage.remove(name); - } - - getPassword(name: string) { - // console.log("filename is=> "+name); - return this.storage.forEach((value, key, index) => { - if (key == name) { - // console.log("Key is=> " + key); - // console.log(value.password === undefined); - return value.password; - } - }); - } - - setSelectedFile(selectedFile) { - this.storage.set("selectedFile", selectedFile); - this.selectedFile = selectedFile; - // console.log("selectedFile updated: "+selectedFile); - } - - getSelectedFile() { - return this.storage.get("selectedFile").then((name) => { - if (!name) { - this.storage.set("selectedFile", "default"); - name = "default"; - } - this.selectedFile = name; - return this.selectedFile; - }); - } - - getToken() { - return this.storage.get("token").then((token) => { - if (!token) { - this.token = null; - return null; - } else { - this.token = token; - return this.token; - } - }); - } - - setToken(token) { - this.storage.set("token", token); - this.token = token; - console.log("token updated: " + token); - } - - deleteToken() { - this.storage.remove("token"); - } -} diff --git a/Govt-Billing-Angular/src/app/login-modal/login-modal-routing.module.ts b/Govt-Billing-Angular/src/app/login-modal/login-modal-routing.module.ts deleted file mode 100644 index 8c114a5..0000000 --- a/Govt-Billing-Angular/src/app/login-modal/login-modal-routing.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; - -import { LoginModalPage } from './login-modal.page'; - -const routes: Routes = [ - { - path: '', - component: LoginModalPage - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class LoginModalPageRoutingModule {} diff --git a/Govt-Billing-Angular/src/app/login-modal/login-modal.module.ts b/Govt-Billing-Angular/src/app/login-modal/login-modal.module.ts deleted file mode 100644 index 7d00d04..0000000 --- a/Govt-Billing-Angular/src/app/login-modal/login-modal.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { FormBuilder } from "@angular/forms"; -import { NgModule } from "@angular/core"; -import { CommonModule } from "@angular/common"; -import { FormsModule } from "@angular/forms"; - -import { IonicModule } from "@ionic/angular"; - -import { LoginModalPageRoutingModule } from "./login-modal-routing.module"; - -import { LoginModalPage } from "./login-modal.page"; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - IonicModule, - FormBuilder, - LoginModalPageRoutingModule, - ], - declarations: [LoginModalPage], -}) -export class LoginModalPageModule {} diff --git a/Govt-Billing-Angular/src/app/login-modal/login-modal.page.html b/Govt-Billing-Angular/src/app/login-modal/login-modal.page.html deleted file mode 100644 index 627226a..0000000 --- a/Govt-Billing-Angular/src/app/login-modal/login-modal.page.html +++ /dev/null @@ -1,81 +0,0 @@ - - - Login - - Cancel - - - - - - -
    - - Email - - - - - Password - - - - - - Log in - - - - -
    - - - - - Register - - - - - - - - - - - -
    -
    -
    -
    diff --git a/Govt-Billing-Angular/src/app/login-modal/login-modal.page.scss b/Govt-Billing-Angular/src/app/login-modal/login-modal.page.scss deleted file mode 100644 index e69de29..0000000 diff --git a/Govt-Billing-Angular/src/app/login-modal/login-modal.page.spec.ts b/Govt-Billing-Angular/src/app/login-modal/login-modal.page.spec.ts deleted file mode 100644 index 0f0cc70..0000000 --- a/Govt-Billing-Angular/src/app/login-modal/login-modal.page.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { IonicModule } from '@ionic/angular'; - -import { LoginModalPage } from './login-modal.page'; - -describe('LoginModalPage', () => { - let component: LoginModalPage; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ LoginModalPage ], - imports: [IonicModule.forRoot()] - }).compileComponents(); - - fixture = TestBed.createComponent(LoginModalPage); - component = fixture.componentInstance; - fixture.detectChanges(); - })); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/Govt-Billing-Angular/src/app/login-modal/login-modal.page.ts b/Govt-Billing-Angular/src/app/login-modal/login-modal.page.ts deleted file mode 100644 index 556c655..0000000 --- a/Govt-Billing-Angular/src/app/login-modal/login-modal.page.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { ModalController } from "@ionic/angular"; -import { CloudServiceService } from "./../cloud-service.service"; -import { NavController } from "@ionic/angular"; -import { Component, OnInit } from "@angular/core"; -import { FormGroup, FormBuilder, Validators } from "@angular/forms"; -import { APP_NAME } from "../app-data"; - -@Component({ - selector: "app-login-modal", - templateUrl: "./login-modal.page.html", - styleUrls: ["./login-modal.page.scss"], -}) -export class LoginModalPage implements OnInit { - loginForm: FormGroup; - emailChanged: boolean = false; - passwordChanged: boolean = false; - status: any = {}; - request: any = {}; - constructor( - public navCtrl: NavController, - public modalCtrl: ModalController, - public formBuilder: FormBuilder, - public cloudService: CloudServiceService - ) { - this.loginForm = formBuilder.group({ - email: ["", Validators.required], - password: ["", Validators.required], - }); - - this.cloudService = cloudService; - this.request.done = true; - } - - ngOnInit() {} - - ionViewDidLoad() { - // console.log('Hello LoginModalPage Page'); - } - - // dismiss() { - // console.log("Dismissing modal with data: " + JSON.stringify(this.status)); - // if (!this.status) { - // this.modalCtrl.dismiss(""); - // } else { - // this.modalCtrl.dismiss(this.status); - // } - // } - - onCancel() { - this.modalCtrl.dismiss(null, "cancel"); - } - doAction(action: string) { - let appname = APP_NAME; - let emailadd = this.loginForm.value.email; - emailadd = emailadd.toLowerCase(); - console.log(emailadd); - let data = { - email: emailadd, - password: this.loginForm.value.password, - appname: appname, - }; - console.log(JSON.stringify(data)); - this.request.done = false; - this.cloudService.auth(data, action).subscribe( - (success) => { - this.request.done = true; - console.log("Auth: " + JSON.stringify(success)); - let result = success.result; - this.status = { status: result, user: success.user, action: action }; - // this.dismiss(); - console.log( - "Dismissing modal with data: " + JSON.stringify(this.status) - ); - - this.modalCtrl.dismiss({ - loginData: { - status: result, - user: success.user, - action: action, - }, - }); - }, - (error) => { - console.log(JSON.stringify(error)); - this.request.done = true; - console.log( - "Dismissing modal with data: " + JSON.stringify(this.status) - ); - - // this.dismiss(); - this.modalCtrl.dismiss({ - loginData: { - status: "", - user: "", - action: action, - }, - }); - } - ); - } -} diff --git a/Govt-Billing-Angular/src/app/menu/menu-routing.module.ts b/Govt-Billing-Angular/src/app/menu/menu-routing.module.ts deleted file mode 100644 index 9a48245..0000000 --- a/Govt-Billing-Angular/src/app/menu/menu-routing.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; - -import { MenuPage } from './menu.page'; - -const routes: Routes = [ - { - path: '', - component: MenuPage - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class MenuPageRoutingModule {} diff --git a/Govt-Billing-Angular/src/app/menu/menu.module.ts b/Govt-Billing-Angular/src/app/menu/menu.module.ts deleted file mode 100644 index 0a35204..0000000 --- a/Govt-Billing-Angular/src/app/menu/menu.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { NgModule } from "@angular/core"; -import { CommonModule } from "@angular/common"; -import { FormsModule } from "@angular/forms"; - -import { IonicModule } from "@ionic/angular"; - -import { MenuPageRoutingModule } from "./menu-routing.module"; -// import { Printer } from '@ionic-native/printer/ngx'; -import { MenuPage } from "./menu.page"; - -@NgModule({ - imports: [CommonModule, FormsModule, IonicModule, MenuPageRoutingModule], - declarations: [MenuPage], - // providers: [ - // Printer - // ] -}) -export class MenuPageModule {} diff --git a/Govt-Billing-Angular/src/app/menu/menu.page.html b/Govt-Billing-Angular/src/app/menu/menu.page.html deleted file mode 100644 index 20b0585..0000000 --- a/Govt-Billing-Angular/src/app/menu/menu.page.html +++ /dev/null @@ -1,119 +0,0 @@ - - - Menu - - - - - - Options - - - -    New File - - -    Save - - -    Save As - - -    Save As - Password - - -    Print - - -    Print Workbook - - -    Add/Remove Logo - - - - - - - Share - - - - -    Email - - -    Email Workbook - - -     Export as CSV - - -     Export as PDF - - - -     Export Workbook as PDF - - - -    Share - - - - - - {{ applicationName }} WEB - - - - -    {{ setting.label }} - - - - - -    Save to - Server - - -
    - - - SUPPORT - - - -    Write to Us - - -    Refer to a friend - - -    Visit Us - -
    diff --git a/Govt-Billing-Angular/src/app/menu/menu.page.scss b/Govt-Billing-Angular/src/app/menu/menu.page.scss deleted file mode 100644 index e69de29..0000000 diff --git a/Govt-Billing-Angular/src/app/menu/menu.page.spec.ts b/Govt-Billing-Angular/src/app/menu/menu.page.spec.ts deleted file mode 100644 index a3919fc..0000000 --- a/Govt-Billing-Angular/src/app/menu/menu.page.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { IonicModule } from '@ionic/angular'; - -import { MenuPage } from './menu.page'; - -describe('MenuPage', () => { - let component: MenuPage; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ MenuPage ], - imports: [IonicModule.forRoot()] - }).compileComponents(); - - fixture = TestBed.createComponent(MenuPage); - component = fixture.componentInstance; - fixture.detectChanges(); - })); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/Govt-Billing-Angular/src/app/menu/menu.page.ts b/Govt-Billing-Angular/src/app/menu/menu.page.ts deleted file mode 100644 index 967fdc0..0000000 --- a/Govt-Billing-Angular/src/app/menu/menu.page.ts +++ /dev/null @@ -1,1200 +0,0 @@ -import { Router } from "@angular/router"; -import { LoginModalPage } from "./../login-modal/login-modal.page"; -import { async } from "@angular/core/testing"; -import { InappPurchaseService } from "./../inapp-purchase.service"; -import { CloudServiceService } from "./../cloud-service.service"; -import { LocalServiceService, File } from "./../local-service.service"; -import { AlertController, ModalController } from "@ionic/angular"; -import { NavController, ToastController } from "@ionic/angular"; -import { Component, OnInit } from "@angular/core"; -import { Printer, PrintOptions } from "@ionic-native/printer/ngx"; -import { EmailComposer } from "@ionic-native/email-composer/ngx"; -import { SocialSharing } from "@ionic-native/social-sharing/ngx"; -import { DATA, APP_NAME, LINK, LOGO } from "../app-data"; -import * as AppGeneral from "socialcalc/AppGeneral"; -import { InAppBrowser } from "@ionic-native/in-app-browser/ngx"; -import { Camera, CameraOptions } from "@ionic-native/camera/ngx"; - -const IMG_LINK = "www/assets/img/icon.png"; -@Component({ - selector: "app-menu", - templateUrl: "./menu.page.html", - styleUrls: ["./menu.page.scss"], -}) -export class MenuPage implements OnInit { - msc: any; - request: any = {}; - applicationName: string; - radioOpen: any; - radioResult: any; - setting: any = {}; - constructor( - public navCtrl: NavController, - public toastCtrl: ToastController, - public alertCtrl: AlertController, - public localService: LocalServiceService, - public printer: Printer, - public emailComposer: EmailComposer, - public cloudService: CloudServiceService, - public socialSharing: SocialSharing, - public modalCtrl: ModalController, - public iab: InAppBrowser, - public camera: Camera, - public inapp: InappPurchaseService, - private router: Router - ) { - this.msc = DATA["home"][AppGeneral.getDeviceType()]["msc"]; - this.request = { - pdf: { done: true }, - allpdf: { done: true }, - save: { done: true }, - sharepdf: { done: true }, - logo: { done: true }, - }; - this.applicationName = APP_NAME; - this.getSettingsForUser().then((setting) => { - this.setting = setting; - }); - } - newFile() { - AppGeneral.viewFile("default", JSON.stringify(this.msc)); - this.showToast("Loading new file...."); - this.router.navigateByUrl("/tabs/home"); - // console.log("Entering home"); - // var t: Tabs = this.navCtrl.parent; - // setTimeout(() => { - // t.select(0); - // }, 2000); - } - updateFile() { - if (this.localService.selectedFile == "default") { - this.showToast("Cannot update default file!"); - return false; - } - this.localService.getSelectedFile().then((selectedFile) => { - let name = selectedFile; - let content = encodeURIComponent(AppGeneral.getSpreadsheetContent()); - this.localService.getFile(name).then((data) => { - let created = new Date(data.created).toString(); - this.localService.saveFile( - new File(created, new Date().toString(), content, name) - ); - this.localService.setSelectedFile(name); - this.showToast(name + " successfully updated!"); - }); - }); - } - saveAs() { - /*let avail = false; - this.inapp.isSavePrintEmailAvailable().then(success =>{ - avail = success; - console.log("Save as available ? "+success); - if(!avail){ - this.showAlert('Save As', 'Please purchase Save as, Print and Email from the In-app purchase tab to continue'); - return; - } - });*/ - AppGeneral.saveAs().then( - (filename) => { - console.log(filename); - if (!this.validateName(filename)) return; - filename = this.formatString(filename); - console.log("continue saving " + filename); - var content = encodeURIComponent(AppGeneral.getSpreadsheetContent()); - // console.log(content); - this.localService.saveFile( - new File( - new Date().toString(), - new Date().toString(), - content, - filename - ) - ); - this.localService.setSelectedFile(filename); - this.showToast(filename + " successfully saved!"); - - /*this.inapp.updateSavePrintEmail().subscribe(units =>{ - console.log("updatePDF: "+units+" left"); - this.showToast("You have "+units+" units left"); - if(units <= 3){ - this.showAlert("Save as","You have limited number of times remaining for doing Save as ,Print and Email.Kindly buy from the In-app purchase tab"); - } - });*/ - }, - (err) => JSON.stringify(err) - ); - } - - /********* Save as Password protected file ******/ - saveAsPassword() { - let alert = this.alertCtrl - .create({ - header: "Save as Password Protected file", - // title: - inputs: [ - { - name: "filename", - placeholder: "Filename", - }, - { - name: "password", - placeholder: "Password", - type: "password", - }, - ], - buttons: [ - { - text: "Cancel", - role: "cancel", - handler: (data) => { - console.log("Cancel clicked"); - }, - }, - { - text: "Save as", - handler: (data) => { - if (this.validateName(data.filename)) { - if (this.validatePassword(data.password)) { - // console.log("Filename & Password valid"+data.filename+' & '+data.password); - data.filename = this.formatString(data.filename); - console.log("continue saving " + data.filename); - var content = encodeURIComponent( - AppGeneral.getSpreadsheetContent() - ); - // console.log(content); - this.localService.saveFile( - new File( - new Date().toString(), - new Date().toString(), - content, - data.filename, - data.password - ) - ); - this.localService.setSelectedFile(data.filename); - this.showToast(data.filename + " successfully saved!"); - } - } else { - this.showToast("Filename or password is invalid"); - } - }, - }, - ], - }) - .then((alertEl) => { - alertEl.present(); - }); - - // alert.present(); - - /* - this.localService.saveFile(new File(new Date().toString(), new Date().toString(), content, filename)); - this.localService.setSelectedFile(filename); - this.showToast(filename+' successfully saved!'); - */ - } - - /********* Print starts here ********/ - print(option) { - let that = this; - let avail = false; - this.inapp.isSavePrintEmailAvailable().then((success) => { - avail = success; - console.log("Print available ? " + success); - /*if(!avail){ - this.showAlert('Print', 'Please purchase Save as, Print and Email from the In-app purchase tab to continue'); - return; - }*/ - - let content = ""; - if (option == "all") { - content = AppGeneral.getAllHTMLContent(this.msc); - } else { - content = AppGeneral.getCurrentHTMLContent(); - } - - this.printer.isAvailable().then( - (onsuccess: any) => { - let options: PrintOptions = { - name: APP_NAME + ".html", - printer: "printer007", - duplex: true, - orientation: "landscape", - monochrome: true, - // landscape: true, - // grayscale: true, - }; - - this.printer.print(content, options).then( - (value: any) => { - console.log("value:" + value); - /*that.inapp.updateSavePrintEmail().subscribe(units =>{ - console.log("updatePDF: "+units+" left"); - that.showToast("You have "+units+" units left"); - if(units <= 3){ - that.showAlert("Print","You have limited number of times remaining for doing Save as ,Print and Email.Kindly buy from the In-app purchase tab"); - } - });*/ - }, - (error) => { - console.log("error:", error); - } - ); - }, - (err) => { - console.log("err:", err); - } - ); - }); - } - - email(option) { - let that = this; - let avail = false; - this.inapp.isSavePrintEmailAvailable().then((success) => { - avail = success; - console.log("Email available ? " + success); - /*if(!avail){ - this.showAlert('Email', 'Please purchase Save as, Print and Email from the In-app purchase tab to continue'); - return; - }*/ - - var content; - var subject; - if (option == "all") { - content = AppGeneral.getAllHTMLContent(this.msc); - subject = APP_NAME + " workbook attached"; - } else { - content = AppGeneral.getCurrentHTMLContent(); - subject = APP_NAME + " attached"; - } - - let email = { - to: "", - cc: "", - subject: subject, - body: content, - isHtml: true, - }; - - this.emailComposer.open(email).then(() => { - console.log("Email sent!"); - /*that.inapp.updateSavePrintEmail().subscribe(units =>{ - console.log("updatePDF: "+units+" left"); - that.showToast("You have "+units+" units left"); - if(units <= 3){ - that.showAlert("Email","You have limited number of times remaining for doing Save as ,Print and Email.Kindly buy from the In-app purchase tab"); - } - });*/ - }); - }); - } - exportAsPDF(option) { - let that = this; - let avail = false; - this.inapp.isPDFAvailable().then((success) => { - avail = success; - console.log("Export PDF available ? " + success); - /*if(!avail){ - this.showAlert('Export as PDF', 'Please purchase Export as PDF from the In-app purchase tab to continue'); - return; - }*/ - - var content; - if (option == "all") { - content = AppGeneral.getAllHTMLContent(this.msc); - this.request.allpdf.done = false; - } else { - content = AppGeneral.getCurrentHTMLContent(); - this.request.pdf.done = false; - } - - this.cloudService.createPDF(content).subscribe( - (data) => { - var subject; - if (option == "one") { - this.request.pdf.done = true; - subject = APP_NAME + " PDF link available"; - } else { - this.request.allpdf.done = true; - subject = APP_NAME + " workbook PDF link available"; - } - let result = data.result; - if (result == "ok") { - let pdfurl = data.pdfurl; - console.log(pdfurl); - this.openEmailComposer(pdfurl, subject); - /*this.inapp.updatePDF().subscribe(units =>{ - console.log("updatePDF: "+units+" left"); - that.showToast("You have "+units+" units left"); - });*/ - } - }, - (error) => { - if (option == "one") { - this.request.pdf.done = true; - } else { - this.request.allpdf.done = true; - } - console.log(JSON.stringify(error)); - } - ); //Cloudservice - }); - } - - openEmailComposer(content, subject) { - let email = { - to: "", - cc: "", - subject: subject, - body: content, - isHtml: true, - }; - - this.emailComposer.open(email).then(() => { - console.log("Email sent!"); - }); - } - - share() { - let alert = this.alertCtrl - .create({ - header: "Share PDF via", - inputs: [ - { - type: "radio", - label: "Facebook", - value: "facebook", - checked: false, - }, - { - type: "radio", - label: "Twitter", - value: "twitter", - checked: false, - }, - { - type: "radio", - label: "WhatsApp", - value: "whatsapp", - checked: false, - }, - { - type: "radio", - label: "SMS", - value: "sms", - checked: false, - }, - ], - buttons: [ - { - text: "Cancel", - role: "cancel", - }, - { - text: "Ok", - handler: (shareVia) => { - this.radioOpen = false; - this.radioResult = shareVia; - // console.log(shareVia); - var content = AppGeneral.getCurrentHTMLContent(); - this.request.sharepdf.done = false; - this.cloudService.createPDF(content).subscribe( - (data) => { - let result = data.result; - this.request.sharepdf.done = true; - if (result == "ok") { - let pdfurl = data.pdfurl; - this.sharePDF(pdfurl, shareVia); - } - }, - (error) => { - this.request.sharepdf.done = true; - console.log(JSON.stringify(error)); - } - ); - }, - }, - ], - }) - .then((alertEl) => { - alertEl.present(); - }); - // alert.setTitle("Share PDF via"); - - // alert.addInput({ - // type: "radio", - // label: "Facebook", - // value: "facebook", - // checked: false, - // }); - // alert.addInput({ - // type: "radio", - // label: "Twitter", - // value: "twitter", - // checked: false, - // }); - // alert.addInput({ - // type: "radio", - // label: "WhatsApp", - // value: "whatsapp", - // checked: false, - // }); - // alert.addInput({ - // type: "radio", - // label: "SMS", - // value: "sms", - // checked: false, - // }); - - // alert.addButton("Cancel"); - // alert.addButton({ - // text: "OK", - // handler: (shareVia) => { - // this.radioOpen = false; - // this.radioResult = shareVia; - // // console.log(shareVia); - // var content = AppGeneral.getCurrentHTMLContent(); - // this.request.sharepdf.done = false; - // this.cloudService.createPDF(content).subscribe( - // (data) => { - // let result = data.result; - // this.request.sharepdf.done = true; - // if (result == "ok") { - // let pdfurl = data.pdfurl; - // this.sharePDF(pdfurl, shareVia); - // } - // }, - // (error) => { - // this.request.sharepdf.done = true; - // console.log(JSON.stringify(error)); - // } - // ); - // }, - // }); - - // alert.present(); - } - - sharePDF(pdfurl, shareVia) { - var self = this; - let avail = false; - var fName = APP_NAME; - - switch (shareVia) { - case "facebook": - this.inapp.isFbSharePDFAvailable().then((success) => { - avail = success; - console.log("Share PDF available ? " + avail); - /*if(!avail){ - this.showAlert('Share PDF', 'Please purchase Share PDF from the In-app purchase tab to continue'); - return; - }*/ - - this.socialSharing - .shareViaFacebook(fName + " PDF link available", IMG_LINK, pdfurl) - .then(() => { - console.log("share via facebook done"); - - /*self.inapp.updateFbSharePDF().subscribe(units =>{ - console.log("updateSharePDF: "+units+" :left"); - self.showToast('You have '+units+' units remaining. '); - }); */ - }) - .catch(() => { - this.showToast("Cannot share via Facebook!"); - }); - }); - - break; - - case "twitter": - this.inapp.isTwSharePDFAvailable().then((success) => { - avail = success; - console.log("Share PDF available ? " + avail); - /*if(!avail){ - this.showAlert('Share PDF', 'Please purchase Share PDF from the In-app purchase tab to continue'); - return; - }*/ - - this.socialSharing - .shareViaTwitter(fName + " PDF link available", IMG_LINK, pdfurl) - .then(() => { - console.log("Twitter done"); - - /*self.inapp.updateTwSharePDF().subscribe(units =>{ - console.log("updateSharePDF: "+units+" :left"); - self.showToast('You have '+units+' units remaining. '); - }); */ - }) - .catch(() => { - this.showToast("Cannot share via Twitter!"); - }); - }); - break; - - case "whatsapp": - this.inapp.isWaSharePDFAvailable().then((success) => { - avail = success; - console.log("Share PDF available ? " + avail); - /*if(!avail){ - this.showAlert('Share PDF', 'Please purchase Share PDF from the In-app purchase tab to continue'); - return; - }*/ - this.socialSharing - .shareViaWhatsApp(fName + " PDF link available", IMG_LINK, pdfurl) - .then(() => { - console.log("WhatsApp done"); - - /*self.inapp.updateWaSharePDF().subscribe(units =>{ - console.log("updateSharePDF: "+units+" :left"); - self.showToast('You have '+units+' units remaining. '); - }); */ - }) - .catch(() => { - this.showToast("Cannot share via WhatsApp!"); - }); - }); - break; - - case "sms": - this.inapp.isSmsSharePDFAvailable().then((success) => { - avail = success; - console.log("Share PDF available ? " + avail); - /*if(!avail){ - this.showAlert('Share PDF', 'Please purchase Share PDF from the In-app purchase tab to continue'); - return; - }*/ - this.socialSharing - .shareViaSMS(pdfurl, "") - .then(() => { - console.log("SMS done"); - /*self.inapp.updateSmsSharePDF().subscribe(units =>{ - console.log("updateSharePDF: "+units+" :left"); - self.showToast('You have '+units+' units remaining. '); - }); */ - }) - .catch(() => { - this.showToast("Cannot share via SMS!"); - }); - }); - break; - - default: - console.log("Share via not mentioned"); - break; - } - } - - exportAsCsv() { - let content = AppGeneral.getCSVContent(); - let email = { - to: "", - cc: "", - subject: APP_NAME + " CSV attached", - body: content, - isHtml: true, - }; - - this.emailComposer.open(email).then(() => { - console.log("Email sent!"); - }); - } - - /** Save to server */ - ionViewWillEnter() { - this.getSettingsForUser().then((setting) => { - this.setting = setting; - }); - } - - getSettingsForUser() { - return this.localService.getToken().then((token) => { - if (token != null) { - return { status: true, label: APP_NAME + " Web" }; - } else { - return { status: false, label: "Login to Web" }; - } - }); - } - - saveToServer() { - let that = this; - this.localService.getSelectedFile().then((selectedFile) => { - let name = selectedFile; - let content = encodeURIComponent(AppGeneral.getSpreadsheetContent()); - if (selectedFile == "Untitled" || selectedFile == "default") { - let alert = this.alertCtrl - .create({ - header: "Enter the filename", - // title: "Enter the filename", - inputs: [ - { - name: "name", - placeholder: "Filename", - }, - ], - buttons: [ - { - text: "Cancel", - role: "cancel", - handler: (data) => { - console.log("Cancel clicked"); - }, - }, - { - text: "Save", - handler: (data) => { - if (!this.validateName(data.name)) return; - data.name = this.formatString(data.name); - console.log("continue saving " + data.name); - - let args = { - appname: APP_NAME, - filename: data.name, - content: content, - }; - - this.request.save.done = false; - this.cloudService.saveToServer(args).subscribe( - (response) => { - this.request.save.done = true; - console.log(response); - if (response.result == "ok") { - that.showToast(data.name + " saved successfully!"); - } else if (response.result == "fatal") { - this.catchFatalError(); - } - }, - (error) => { - this.request.save.done = true; - console.log(JSON.stringify(error)); - } - ); - }, - }, - ], - }) - .then((alertEl) => { - alertEl.present(); - }); - // alert.present(); - } else { - // Update File - let args = { - appname: APP_NAME, - filename: name, - content: content, - }; - - this.request.save.done = false; - this.cloudService.saveToServer(args).subscribe( - (response) => { - this.request.save.done = true; - console.log(response); - if (response.result == "ok") { - that.showToast(name + " saved successfully!"); - } else if (response.result == "fatal") { - this.catchFatalError(); - } - }, - (error) => { - this.request.save.done = true; - console.log(JSON.stringify(error)); - } - ); - } - }); - } - - async toggleSettings(setting) { - console.log("Toggle: " + setting.status); - - switch (setting.status) { - case true: - this.localService.getToken().then((token) => { - if (token === null) { - this.modalCtrl - .create({ - component: LoginModalPage, - }) - .then((modalEl) => { - modalEl.present(); - return modalEl.onDidDismiss(); - }) - .then((resultdata) => { - let action = ""; - // console.log(resultdata.data); - // console.log("ld"); - let data = resultdata.data; - if (data.action == "login") action = "Login"; - else action = "Registration"; - if (data.status == "ok" && data.user) { - this.setting.label = APP_NAME + " Web"; - this.setting.status = true; - this.showToast(action + " successful!"); - this.localService.setToken(data.user); - } else if (data.status == "exists") { - this.setting.label = "Login to Web"; - this.setting.status = false; - this.showToast("User already exists.Log in to continue"); - } else if (data.status == "no") { - this.setting.label = "Login to Web"; - this.setting.status = false; - this.showToast("User does not exists. Register to continue"); - } else { - this.setting.label = "Login to Web"; - this.setting.status = false; - this.showToast(action + " failed.Try again"); - } - }); - } - }); - break; - - case false: - this.localService.getToken().then((token) => { - if (token == null) { - this.setting.label = "Login to Web"; - this.setting.status = false; - return; - } - let confirm = this.alertCtrl - .create({ - header: "Log out?", - subHeader: "Do you want to Log out?", - buttons: [ - { - text: "Cancel", - handler: () => { - console.log("Cancel clicked"); - this.setting.label = APP_NAME + " Web"; - this.setting.status = true; - }, - }, - { - text: "Yes", - handler: () => { - console.log("Yes clicked"); - this.cloudService.logout().subscribe( - (data) => { - if (data.result == "ok") { - this.showToast("Logout successful!"); - this.setting.label = "Login to Web"; - this.localService.deleteToken(); - this.setting.status = false; - } - }, - (error) => { - console.log(JSON.stringify(error)); - } - ); - }, - }, - ], - }) - .then((alertEl) => { - alertEl.present(); - }); - // confirm.present(); - }); - break; - - default: - break; - } - } - - catchFatalError() { - this.setting.label = "Login to Web"; - this.localService.deleteToken(); - this.setting.status = false; - this.showToast("Session expired. Login to continue"); - } - - /* Logo and Signature */ - addLogo() { - let alert = this.alertCtrl - .create({ - header: "Logo", - subHeader: "Do you want to add or remove logo?", - // title: "Logo", - // message: "Do you Add or Remove Logo?", - buttons: [ - { - text: "Remove", - handler: () => { - console.log("Remove clicked"); - AppGeneral.removeLogo(LOGO[AppGeneral.getDeviceType()]).then( - (ok: any) => { - this.showToast("Logo removed successfully"); - } - ); - }, - }, - { - text: "Add", - handler: () => { - console.log("Add clicked"); - let confirm = this.alertCtrl - .create({ - header: "Complete action using", - // title: "Complete action using", - subHeader: "Do you want to add image from Camera or Photos?", - buttons: [ - { - text: "Camera", - handler: () => { - console.log("Camera clicked"); - let options = { - quality: 50, - destinationType: this.camera.DestinationType.DATA_URL, - sourceType: this.camera.PictureSourceType.CAMERA, - }; - this.sendLogoToServer(options); - }, - }, - { - text: "Photos", - handler: () => { - console.log("Photos clicked"); - let options = { - quality: 50, - destinationType: this.camera.DestinationType.DATA_URL, - sourceType: this.camera.PictureSourceType - .PHOTOLIBRARY, - }; - this.sendLogoToServer(options); - }, - }, - { - text: "Cancel", - role: "cancel", - handler: () => { - console.log("Cancel clicked"); - }, - }, - ], - }) - .then((alertEl) => { - alertEl.present(); - }); - // confirm.present(); - }, - }, - { - text: "Cancel", - role: "cancel", - handler: () => { - console.log("Cancel clicked"); - }, - }, - ], - }) - .then((alertEl) => { - alertEl.present(); - }); - // alert.present(); - } - - sendLogoToServer(options) { - this.camera.getPicture(options).then( - (imageData) => { - // imageData is either a base64 encoded string or a file URI - // If it's base64: - if (!imageData) return; - let base64Image = "data:image/jpeg;base64," + imageData; - // console.log(base64Image); - this.request.logo.done = false; - this.cloudService - .putLogoURL(APP_NAME, base64Image) - .subscribe((data) => { - // console.log(JSON.stringify(data)); - this.request.logo.done = true; - if (data.result == "ok") { - this.addLogoToApp(data.imgurl); - } - }); - }, - (err) => { - // Handle error - } - ); - } - - addLogoToApp(link) { - // console.log(link); - AppGeneral.addLogo(LOGO[AppGeneral.getDeviceType()], link).then((ok) => { - this.showToast("Logo added successfully"); - }); - } - - /*** Supprt ***/ - write() { - let email = { - to: "", - cc: "", - subject: APP_NAME + ": Please share your feedback", - body: "", - isHtml: true, - }; - - this.emailComposer.open(email).then(() => { - console.log("Email sent!"); - }); - } - - visit() { - // window.open('http://aspiringapps.com','_blank'); - let browser = this.iab.create("https://aspiringapps.com"); - setTimeout(() => { - browser.close(); - }, 3000); - } - - refer() { - let alert = this.alertCtrl - .create({ - header: "Refer to a friend", - inputs: [ - { - type: "radio", - label: "Facebook", - value: "facebook", - checked: false, - }, - { - type: "radio", - label: "Twitter", - value: "twitter", - checked: false, - }, - { - type: "radio", - label: "Email", - value: "email", - checked: false, - }, - ], - buttons: [ - { - text: "Cancel", - role: "cancel", - // handler - }, - { - text: "Share", - handler: (shareVia) => { - this.radioOpen = false; - this.radioResult = shareVia; - let content = LINK; - if (shareVia == "twitter") { - this.socialSharing - .shareViaTwitter( - APP_NAME + " on the App Store", - "www/assets/img/icon.png", - content - ) - .then(() => { - console.log("Twitter done"); - }) - .catch(() => { - // this.showToast('Cannot share via Twitter!'); - }); - } else if (shareVia == "facebook") { - this.socialSharing - .shareViaFacebook( - APP_NAME + " on the App Store", - "www/assets/img/icon.png", - content - ) - .then(() => { - console.log("share via facebook done"); - }) - .catch(() => { - // this.showToast('Cannot share via Facebook!'); - }); - } else { - this.socialSharing - .canShareViaEmail() - .then(() => { - this.socialSharing - .shareViaEmail( - content, - APP_NAME + " on the App Store", - null, - null, - null, - null - ) - .then(() => {}) - .catch(() => {}); - }) - .catch(() => { - console.log("email failed"); - }); - } - }, - }, - ], - }) - .then((alertEl) => { - alertEl.present(); - }); - // alert.setTitle("Refer to a friend"); - - // alert.addInput({ - // type: "radio", - // label: "Facebook", - // value: "facebook", - // checked: false, - // }); - // alert.addInput({ - // type: "radio", - // label: "Twitter", - // value: "twitter", - // checked: false, - // }); - // alert.addInput({ - // type: "radio", - // label: "Email", - // value: "email", - // checked: false, - // }); - - // alert.addButton("Cancel"); - // alert.addButton({ - // text: "OK", - // handler: (shareVia) => { - // this.radioOpen = false; - // this.radioResult = shareVia; - // let content = LINK; - // if (shareVia == "twitter") { - // this.socialSharing - // .shareViaTwitter( - // APP_NAME + " on the App Store", - // "www/assets/img/icon.png", - // content - // ) - // .then(() => { - // console.log("Twitter done"); - // }) - // .catch(() => { - // // this.showToast('Cannot share via Twitter!'); - // }); - // } else if (shareVia == "facebook") { - // this.socialSharing - // .shareViaFacebook( - // APP_NAME + " on the App Store", - // "www/assets/img/icon.png", - // content - // ) - // .then(() => { - // console.log("share via facebook done"); - // }) - // .catch(() => { - // // this.showToast('Cannot share via Facebook!'); - // }); - // } else { - // this.socialSharing - // .canShareViaEmail() - // .then(() => { - // this.socialSharing - // .shareViaEmail( - // content, - // APP_NAME + " on the App Store", - // null, - // null, - // null, - // null - // ) - // .then(() => {}) - // .catch(() => {}); - // }) - // .catch(() => { - // console.log("email failed"); - // }); - // } - // }, - // }); - // alert.present(); - } - - /* Utility functions */ - /********* Show toast starts here *********/ - async showToast(message: string) { - let toast = await this.toastCtrl.create({ - message: message, - duration: 3000, - position: "bottom", - }); - - toast.dismiss(() => { - console.log("Dismissed toast"); - }); - // toast.onDidDismiss(() => { - // console.log("Dismissed toast"); - // }); - - toast.present(); - } - - validateName(filename: string) { - /* Returns true if filename is valid */ - filename = filename.trim(); - if (filename == "default" || filename == "Untitled") { - this.showToast("Cannot update default file!"); - return false; - } else if (filename == "" || !filename) { - this.showToast("Filename cannot be empty"); - return false; - } else if (filename.length > 30) { - this.showToast("Filename too long"); - return false; - } else if (/^[a-zA-Z0-9- ]*$/.test(filename) == false) { - this.showToast("Special Characters cannot be used"); - return false; - } - return true; - } - - validatePassword(password) { - password = password.trim(); - if (password == "" || !password) { - this.showToast("Password cannot be empty"); - return false; - } else if (password.length > 30) { - this.showToast("Password too long"); - return false; - } - return true; - } - - formatString(filename) { - /* Remove whitespaces */ - while (filename.indexOf(" ") != -1) { - filename = filename.replace(" ", ""); - } - return filename; - } - - showAlert(title: any, subtitle: any) { - let alert = this.alertCtrl - .create({ - header: title, - message: subtitle, - buttons: [ - { - text: "Okay", - }, - ], - }) - .then((alertEl) => { - alertEl.present(); - }); - } - - ngOnInit() { - console.log("hello"); - } -} diff --git a/Govt-Billing-Angular/src/app/tabs/tabs-routing.module.ts b/Govt-Billing-Angular/src/app/tabs/tabs-routing.module.ts deleted file mode 100644 index 4410609..0000000 --- a/Govt-Billing-Angular/src/app/tabs/tabs-routing.module.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { NgModule } from "@angular/core"; -import { Routes, RouterModule } from "@angular/router"; - -import { TabsPage } from "./tabs.page"; - -const routes: Routes = [ - { - path: "tabs", - component: TabsPage, - children: [ - { - path: '', - redirectTo: 'home', - pathMatch: 'full' - }, - { - path: "home", - loadChildren: () => - import("../home/home.module").then((m) => m.HomePageModule), - }, - { - path: "menu", - loadChildren: () => - import("../menu/menu.module").then((m) => m.MenuPageModule), - }, - { - path: "files", - loadChildren: () => - import("../list/list.module").then((m) => m.ListPageModule), - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class TabsPageRoutingModule {} diff --git a/Govt-Billing-Angular/src/app/tabs/tabs.module.ts b/Govt-Billing-Angular/src/app/tabs/tabs.module.ts deleted file mode 100644 index bfac02e..0000000 --- a/Govt-Billing-Angular/src/app/tabs/tabs.module.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { NgModule } from "@angular/core"; -import { CommonModule } from "@angular/common"; -import { FormsModule } from "@angular/forms"; - -import { IonicModule } from "@ionic/angular"; - -import { TabsPageRoutingModule } from "./tabs-routing.module"; - -import { TabsPage } from "./tabs.page"; - -@NgModule({ - imports: [CommonModule, FormsModule, IonicModule, TabsPageRoutingModule], - declarations: [TabsPage], -}) -export class TabsPageModule {} diff --git a/Govt-Billing-Angular/src/app/tabs/tabs.page.html b/Govt-Billing-Angular/src/app/tabs/tabs.page.html deleted file mode 100644 index 9b00a56..0000000 --- a/Govt-Billing-Angular/src/app/tabs/tabs.page.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - Home - - - - - Menu - - - - - Files - - - diff --git a/Govt-Billing-Angular/src/app/tabs/tabs.page.scss b/Govt-Billing-Angular/src/app/tabs/tabs.page.scss deleted file mode 100644 index e69de29..0000000 diff --git a/Govt-Billing-Angular/src/app/tabs/tabs.page.spec.ts b/Govt-Billing-Angular/src/app/tabs/tabs.page.spec.ts deleted file mode 100644 index 472b870..0000000 --- a/Govt-Billing-Angular/src/app/tabs/tabs.page.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { IonicModule } from '@ionic/angular'; - -import { TabsPage } from './tabs.page'; - -describe('TabsPage', () => { - let component: TabsPage; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ TabsPage ], - imports: [IonicModule.forRoot()] - }).compileComponents(); - - fixture = TestBed.createComponent(TabsPage); - component = fixture.componentInstance; - fixture.detectChanges(); - })); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/Govt-Billing-Angular/src/app/tabs/tabs.page.ts b/Govt-Billing-Angular/src/app/tabs/tabs.page.ts deleted file mode 100644 index 8e43467..0000000 --- a/Govt-Billing-Angular/src/app/tabs/tabs.page.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { InappPurchasePage } from "./../inapp-purchase/inapp-purchase.page"; -import { ListPage } from "./../list/list.page"; -import { MenuPage } from "./../menu/menu.page"; -import { HomePage } from "./../home/home.page"; -import { Component, OnInit } from "@angular/core"; - -@Component({ - selector: "app-tabs", - templateUrl: "./tabs.page.html", - styleUrls: ["./tabs.page.scss"], -}) -export class TabsPage implements OnInit { - tab1Root = HomePage; - tab2Root = MenuPage; - tab3Root = ListPage; - tab4Root = InappPurchasePage; - constructor() {} - - ngOnInit() {} -} diff --git a/Govt-Billing-Angular/src/assets/icon/favicon.png b/Govt-Billing-Angular/src/assets/icon/favicon.png deleted file mode 100644 index 51888a7..0000000 Binary files a/Govt-Billing-Angular/src/assets/icon/favicon.png and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/delete.png b/Govt-Billing-Angular/src/assets/images/delete.png deleted file mode 100644 index 903b660..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/delete.png and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/delete24.png b/Govt-Billing-Angular/src/assets/images/delete24.png deleted file mode 100644 index 2010ee8..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/delete24.png and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/icons/14_128x128.png b/Govt-Billing-Angular/src/assets/images/icons/14_128x128.png deleted file mode 100644 index 981e2a6..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/icons/14_128x128.png and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/icons/20_128x128.png b/Govt-Billing-Angular/src/assets/images/icons/20_128x128.png deleted file mode 100644 index 37262a2..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/icons/20_128x128.png and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/icons/23_128x128.png b/Govt-Billing-Angular/src/assets/images/icons/23_128x128.png deleted file mode 100644 index ddf28f0..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/icons/23_128x128.png and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/icons/cash-register-icon.png b/Govt-Billing-Angular/src/assets/images/icons/cash-register-icon.png deleted file mode 100644 index 91f2239..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/icons/cash-register-icon.png and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/icons/spreadsheet-icon.png b/Govt-Billing-Angular/src/assets/images/icons/spreadsheet-icon.png deleted file mode 100644 index 38a7392..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/icons/spreadsheet-icon.png and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-1x1.gif b/Govt-Billing-Angular/src/assets/images/sc-1x1.gif deleted file mode 100644 index 1d9a4f5..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-1x1.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-add-2.png b/Govt-Billing-Angular/src/assets/images/sc-add-2.png deleted file mode 100644 index 3cd3b73..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-add-2.png and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-aligncenter.gif b/Govt-Billing-Angular/src/assets/images/sc-aligncenter.gif deleted file mode 100644 index 81fae2a..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-aligncenter.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-alignleft.gif b/Govt-Billing-Angular/src/assets/images/sc-alignleft.gif deleted file mode 100644 index 0f3fea7..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-alignleft.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-alignright.gif b/Govt-Billing-Angular/src/assets/images/sc-alignright.gif deleted file mode 100644 index c89e242..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-alignright.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-bordersoff.gif b/Govt-Billing-Angular/src/assets/images/sc-bordersoff.gif deleted file mode 100644 index ffad4a2..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-bordersoff.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-borderson.gif b/Govt-Billing-Angular/src/assets/images/sc-borderson.gif deleted file mode 100644 index 0224acc..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-borderson.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-chooserarrow.gif b/Govt-Billing-Angular/src/assets/images/sc-chooserarrow.gif deleted file mode 100644 index b9010e2..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-chooserarrow.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-commentbg.gif b/Govt-Billing-Angular/src/assets/images/sc-commentbg.gif deleted file mode 100644 index 0b5e17a..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-commentbg.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-copy.gif b/Govt-Billing-Angular/src/assets/images/sc-copy.gif deleted file mode 100644 index 4ed54d0..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-copy.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-cursorinsertleft.gif b/Govt-Billing-Angular/src/assets/images/sc-cursorinsertleft.gif deleted file mode 100644 index 03e9769..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-cursorinsertleft.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-cursorinsertup.gif b/Govt-Billing-Angular/src/assets/images/sc-cursorinsertup.gif deleted file mode 100644 index 03e9769..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-cursorinsertup.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-cut.gif b/Govt-Billing-Angular/src/assets/images/sc-cut.gif deleted file mode 100644 index cb906cc..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-cut.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-defaultcolor.gif b/Govt-Billing-Angular/src/assets/images/sc-defaultcolor.gif deleted file mode 100644 index e9d69cd..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-defaultcolor.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-delete.gif b/Govt-Billing-Angular/src/assets/images/sc-delete.gif deleted file mode 100644 index b8d18a7..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-delete.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-deletecol.gif b/Govt-Billing-Angular/src/assets/images/sc-deletecol.gif deleted file mode 100644 index 0242f70..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-deletecol.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-deleterow.gif b/Govt-Billing-Angular/src/assets/images/sc-deleterow.gif deleted file mode 100644 index 0ff543e..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-deleterow.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-divider1.gif b/Govt-Billing-Angular/src/assets/images/sc-divider1.gif deleted file mode 100644 index 2f3ac5b..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-divider1.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-drag-handles.gif b/Govt-Billing-Angular/src/assets/images/sc-drag-handles.gif deleted file mode 100644 index e2ffef1..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-drag-handles.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-drag-handles.png b/Govt-Billing-Angular/src/assets/images/sc-drag-handles.png deleted file mode 100644 index b57b5a2..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-drag-handles.png and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-endcap-h.gif b/Govt-Billing-Angular/src/assets/images/sc-endcap-h.gif deleted file mode 100644 index 900afd6..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-endcap-h.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-endcap-v.gif b/Govt-Billing-Angular/src/assets/images/sc-endcap-v.gif deleted file mode 100644 index 3e6ba4f..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-endcap-v.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-filldown.gif b/Govt-Billing-Angular/src/assets/images/sc-filldown.gif deleted file mode 100644 index a0d6cba..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-filldown.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-fillright.gif b/Govt-Billing-Angular/src/assets/images/sc-fillright.gif deleted file mode 100644 index 5169a72..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-fillright.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-formuladialog.gif b/Govt-Billing-Angular/src/assets/images/sc-formuladialog.gif deleted file mode 100644 index 404f991..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-formuladialog.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-insertcol.gif b/Govt-Billing-Angular/src/assets/images/sc-insertcol.gif deleted file mode 100644 index 8be72e8..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-insertcol.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-insertrow.gif b/Govt-Billing-Angular/src/assets/images/sc-insertrow.gif deleted file mode 100644 index 28ab390..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-insertrow.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-less-hd.gif b/Govt-Billing-Angular/src/assets/images/sc-less-hd.gif deleted file mode 100644 index 689ebc9..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-less-hd.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-less-hh.gif b/Govt-Billing-Angular/src/assets/images/sc-less-hh.gif deleted file mode 100644 index f1d978e..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-less-hh.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-less-hn.gif b/Govt-Billing-Angular/src/assets/images/sc-less-hn.gif deleted file mode 100644 index 81245b8..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-less-hn.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-less-vd.gif b/Govt-Billing-Angular/src/assets/images/sc-less-vd.gif deleted file mode 100644 index 605801f..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-less-vd.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-less-vh.gif b/Govt-Billing-Angular/src/assets/images/sc-less-vh.gif deleted file mode 100644 index aa2de92..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-less-vh.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-less-vn.gif b/Govt-Billing-Angular/src/assets/images/sc-less-vn.gif deleted file mode 100644 index 88290ef..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-less-vn.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-linkdialog.gif b/Govt-Billing-Angular/src/assets/images/sc-linkdialog.gif deleted file mode 100644 index d206394..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-linkdialog.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-linkout.gif b/Govt-Billing-Angular/src/assets/images/sc-linkout.gif deleted file mode 100644 index 9215def..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-linkout.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-logo.gif b/Govt-Billing-Angular/src/assets/images/sc-logo.gif deleted file mode 100644 index b76d534..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-logo.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-main-h.gif b/Govt-Billing-Angular/src/assets/images/sc-main-h.gif deleted file mode 100644 index 0b260ed..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-main-h.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-main-v.gif b/Govt-Billing-Angular/src/assets/images/sc-main-v.gif deleted file mode 100644 index 0fb12bb..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-main-v.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-menu-dropdown.png b/Govt-Billing-Angular/src/assets/images/sc-menu-dropdown.png deleted file mode 100644 index 938cee8..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-menu-dropdown.png and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-merge.gif b/Govt-Billing-Angular/src/assets/images/sc-merge.gif deleted file mode 100644 index 666b597..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-merge.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-more-hd.gif b/Govt-Billing-Angular/src/assets/images/sc-more-hd.gif deleted file mode 100644 index 2eb56e0..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-more-hd.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-more-hh.gif b/Govt-Billing-Angular/src/assets/images/sc-more-hh.gif deleted file mode 100644 index fc1059a..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-more-hh.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-more-hn.gif b/Govt-Billing-Angular/src/assets/images/sc-more-hn.gif deleted file mode 100644 index 7e07204..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-more-hn.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-more-vd.gif b/Govt-Billing-Angular/src/assets/images/sc-more-vd.gif deleted file mode 100644 index 055f4ac..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-more-vd.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-more-vh.gif b/Govt-Billing-Angular/src/assets/images/sc-more-vh.gif deleted file mode 100644 index 07acdf7..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-more-vh.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-more-vn.gif b/Govt-Billing-Angular/src/assets/images/sc-more-vn.gif deleted file mode 100644 index 922756d..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-more-vn.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-movefrom.gif b/Govt-Billing-Angular/src/assets/images/sc-movefrom.gif deleted file mode 100644 index 7f665eb..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-movefrom.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-movefromoff.gif b/Govt-Billing-Angular/src/assets/images/sc-movefromoff.gif deleted file mode 100644 index 1760f02..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-movefromoff.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-moveinsert.gif b/Govt-Billing-Angular/src/assets/images/sc-moveinsert.gif deleted file mode 100644 index f082171..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-moveinsert.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-moveinsertoff.gif b/Govt-Billing-Angular/src/assets/images/sc-moveinsertoff.gif deleted file mode 100644 index cbb4f30..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-moveinsertoff.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-movepaste.gif b/Govt-Billing-Angular/src/assets/images/sc-movepaste.gif deleted file mode 100644 index 93108d1..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-movepaste.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-movepasteoff.gif b/Govt-Billing-Angular/src/assets/images/sc-movepasteoff.gif deleted file mode 100644 index 254c572..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-movepasteoff.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-multilinedialog.gif b/Govt-Billing-Angular/src/assets/images/sc-multilinedialog.gif deleted file mode 100644 index 1e0d6d6..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-multilinedialog.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-paneslider-h.gif b/Govt-Billing-Angular/src/assets/images/sc-paneslider-h.gif deleted file mode 100644 index 8cb31d4..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-paneslider-h.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-paneslider-v.gif b/Govt-Billing-Angular/src/assets/images/sc-paneslider-v.gif deleted file mode 100644 index c4bcaee..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-paneslider-v.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-paste.gif b/Govt-Billing-Angular/src/assets/images/sc-paste.gif deleted file mode 100644 index e39f06c..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-paste.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-pasteformats.gif b/Govt-Billing-Angular/src/assets/images/sc-pasteformats.gif deleted file mode 100644 index 94b2f50..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-pasteformats.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-peerbg.gif b/Govt-Billing-Angular/src/assets/images/sc-peerbg.gif deleted file mode 100644 index bef9c21..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-peerbg.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-range2.gif b/Govt-Billing-Angular/src/assets/images/sc-range2.gif deleted file mode 100644 index e9d69cd..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-range2.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-recalc.gif b/Govt-Billing-Angular/src/assets/images/sc-recalc.gif deleted file mode 100644 index 6e1ebb8..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-recalc.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-redo.gif b/Govt-Billing-Angular/src/assets/images/sc-redo.gif deleted file mode 100644 index b14aca8..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-redo.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-scrollarea-h.gif b/Govt-Billing-Angular/src/assets/images/sc-scrollarea-h.gif deleted file mode 100644 index c12715b..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-scrollarea-h.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-scrollarea-v.gif b/Govt-Billing-Angular/src/assets/images/sc-scrollarea-v.gif deleted file mode 100644 index df99311..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-scrollarea-v.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-sumdialog.gif b/Govt-Billing-Angular/src/assets/images/sc-sumdialog.gif deleted file mode 100644 index f6bb9ad..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-sumdialog.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-swapcolors.gif b/Govt-Billing-Angular/src/assets/images/sc-swapcolors.gif deleted file mode 100644 index 49c6e80..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-swapcolors.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-thumb-hd.gif b/Govt-Billing-Angular/src/assets/images/sc-thumb-hd.gif deleted file mode 100644 index e3afbd2..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-thumb-hd.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-thumb-hh.gif b/Govt-Billing-Angular/src/assets/images/sc-thumb-hh.gif deleted file mode 100644 index 47237c2..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-thumb-hh.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-thumb-hn.gif b/Govt-Billing-Angular/src/assets/images/sc-thumb-hn.gif deleted file mode 100644 index a8e0f08..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-thumb-hn.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-thumb-vd.gif b/Govt-Billing-Angular/src/assets/images/sc-thumb-vd.gif deleted file mode 100644 index c900734..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-thumb-vd.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-thumb-vh.gif b/Govt-Billing-Angular/src/assets/images/sc-thumb-vh.gif deleted file mode 100644 index a3229c7..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-thumb-vh.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-thumb-vn.gif b/Govt-Billing-Angular/src/assets/images/sc-thumb-vn.gif deleted file mode 100644 index d528f43..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-thumb-vn.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-trackingline-h.gif b/Govt-Billing-Angular/src/assets/images/sc-trackingline-h.gif deleted file mode 100644 index efeff83..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-trackingline-h.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-trackingline-v.gif b/Govt-Billing-Angular/src/assets/images/sc-trackingline-v.gif deleted file mode 100644 index ce6e8cb..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-trackingline-v.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-undo.gif b/Govt-Billing-Angular/src/assets/images/sc-undo.gif deleted file mode 100644 index 66a07f8..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-undo.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-unmerge.gif b/Govt-Billing-Angular/src/assets/images/sc-unmerge.gif deleted file mode 100644 index 7e0df32..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-unmerge.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-wikiflag.gif b/Govt-Billing-Angular/src/assets/images/sc-wikiflag.gif deleted file mode 100644 index caf0e3f..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-wikiflag.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/sc-wikilinkflag.gif b/Govt-Billing-Angular/src/assets/images/sc-wikilinkflag.gif deleted file mode 100644 index 5ed3700..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/sc-wikilinkflag.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/images/spinner.gif b/Govt-Billing-Angular/src/assets/images/spinner.gif deleted file mode 100644 index cc70a7a..0000000 Binary files a/Govt-Billing-Angular/src/assets/images/spinner.gif and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/img/icon copy.png b/Govt-Billing-Angular/src/assets/img/icon copy.png deleted file mode 100644 index d94dff4..0000000 Binary files a/Govt-Billing-Angular/src/assets/img/icon copy.png and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/img/icon.png b/Govt-Billing-Angular/src/assets/img/icon.png deleted file mode 100644 index d94dff4..0000000 Binary files a/Govt-Billing-Angular/src/assets/img/icon.png and /dev/null differ diff --git a/Govt-Billing-Angular/src/assets/shapes.svg b/Govt-Billing-Angular/src/assets/shapes.svg deleted file mode 100644 index d370b4d..0000000 --- a/Govt-Billing-Angular/src/assets/shapes.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Govt-Billing-Angular/src/environments/environment.prod.ts b/Govt-Billing-Angular/src/environments/environment.prod.ts deleted file mode 100644 index 3612073..0000000 --- a/Govt-Billing-Angular/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true -}; diff --git a/Govt-Billing-Angular/src/environments/environment.ts b/Govt-Billing-Angular/src/environments/environment.ts deleted file mode 100644 index 7b4f817..0000000 --- a/Govt-Billing-Angular/src/environments/environment.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - -export const environment = { - production: false -}; - -/* - * For easier debugging in development mode, you can import the following file - * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. - * - * This import should be commented out in production mode because it will have a negative impact - * on performance if an error is thrown. - */ -// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/Govt-Billing-Angular/src/global.scss b/Govt-Billing-Angular/src/global.scss deleted file mode 100644 index d854de8..0000000 --- a/Govt-Billing-Angular/src/global.scss +++ /dev/null @@ -1,26 +0,0 @@ -/* - * App Global CSS - * ---------------------------------------------------------------------------- - * Put style rules here that you want to apply globally. These styles are for - * the entire app and not just one component. Additionally, this file can be - * used as an entry point to import other CSS/Sass files to be included in the - * output CSS. - * For more information on global stylesheets, visit the documentation: - * https://ionicframework.com/docs/layout/global-stylesheets - */ - -/* Core CSS required for Ionic components to work properly */ -@import "~@ionic/angular/css/core.css"; - -/* Basic CSS for apps built with Ionic */ -@import "~@ionic/angular/css/normalize.css"; -@import "~@ionic/angular/css/structure.css"; -@import "~@ionic/angular/css/typography.css"; -@import '~@ionic/angular/css/display.css'; - -/* Optional CSS utils that can be commented out */ -@import "~@ionic/angular/css/padding.css"; -@import "~@ionic/angular/css/float-elements.css"; -@import "~@ionic/angular/css/text-alignment.css"; -@import "~@ionic/angular/css/text-transformation.css"; -@import "~@ionic/angular/css/flex-utils.css"; diff --git a/Govt-Billing-Angular/src/index.html b/Govt-Billing-Angular/src/index.html deleted file mode 100644 index 3f25b01..0000000 --- a/Govt-Billing-Angular/src/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Ionic App - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Govt-Billing-Angular/src/main.ts b/Govt-Billing-Angular/src/main.ts deleted file mode 100644 index 91ec6da..0000000 --- a/Govt-Billing-Angular/src/main.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { enableProdMode } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { AppModule } from './app/app.module'; -import { environment } from './environments/environment'; - -if (environment.production) { - enableProdMode(); -} - -platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.log(err)); diff --git a/Govt-Billing-Angular/src/polyfills.ts b/Govt-Billing-Angular/src/polyfills.ts deleted file mode 100644 index 316184e..0000000 --- a/Govt-Billing-Angular/src/polyfills.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags.ts'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -import './zone-flags'; - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ - -import 'zone.js/dist/zone'; // Included with Angular CLI. - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/Govt-Billing-Angular/src/test.ts b/Govt-Billing-Angular/src/test.ts deleted file mode 100644 index 1631789..0000000 --- a/Govt-Billing-Angular/src/test.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file is required by karma.conf.js and loads recursively all the .spec and framework files - -import 'zone.js/dist/zone-testing'; -import { getTestBed } from '@angular/core/testing'; -import { - BrowserDynamicTestingModule, - platformBrowserDynamicTesting -} from '@angular/platform-browser-dynamic/testing'; - -declare const require: any; - -// First, initialize the Angular testing environment. -getTestBed().initTestEnvironment( - BrowserDynamicTestingModule, - platformBrowserDynamicTesting() -); -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().map(context); diff --git a/Govt-Billing-Angular/src/theme/variables.scss b/Govt-Billing-Angular/src/theme/variables.scss deleted file mode 100644 index 63d627f..0000000 --- a/Govt-Billing-Angular/src/theme/variables.scss +++ /dev/null @@ -1,228 +0,0 @@ -// Ionic Variables and Theming. For more info, please see: -// http://ionicframework.com/docs/theming/ - -/** Ionic CSS Variables **/ -:root { - /** primary **/ - --ion-color-primary: #3880ff; - --ion-color-primary-rgb: 56, 128, 255; - --ion-color-primary-contrast: #ffffff; - --ion-color-primary-contrast-rgb: 255, 255, 255; - --ion-color-primary-shade: #3171e0; - --ion-color-primary-tint: #4c8dff; - - /** secondary **/ - --ion-color-secondary: #3dc2ff; - --ion-color-secondary-rgb: 61, 194, 255; - --ion-color-secondary-contrast: #ffffff; - --ion-color-secondary-contrast-rgb: 255, 255, 255; - --ion-color-secondary-shade: #36abe0; - --ion-color-secondary-tint: #50c8ff; - - /** tertiary **/ - --ion-color-tertiary: #5260ff; - --ion-color-tertiary-rgb: 82, 96, 255; - --ion-color-tertiary-contrast: #ffffff; - --ion-color-tertiary-contrast-rgb: 255, 255, 255; - --ion-color-tertiary-shade: #4854e0; - --ion-color-tertiary-tint: #6370ff; - - /** success **/ - --ion-color-success: #2dd36f; - --ion-color-success-rgb: 45, 211, 111; - --ion-color-success-contrast: #ffffff; - --ion-color-success-contrast-rgb: 255, 255, 255; - --ion-color-success-shade: #28ba62; - --ion-color-success-tint: #42d77d; - - /** warning **/ - --ion-color-warning: #ffc409; - --ion-color-warning-rgb: 255, 196, 9; - --ion-color-warning-contrast: #000000; - --ion-color-warning-contrast-rgb: 0, 0, 0; - --ion-color-warning-shade: #e0ac08; - --ion-color-warning-tint: #ffca22; - - /** danger **/ - --ion-color-danger: #eb445a; - --ion-color-danger-rgb: 235, 68, 90; - --ion-color-danger-contrast: #ffffff; - --ion-color-danger-contrast-rgb: 255, 255, 255; - --ion-color-danger-shade: #cf3c4f; - --ion-color-danger-tint: #ed576b; - - /** dark **/ - --ion-color-dark: #222428; - --ion-color-dark-rgb: 34, 36, 40; - --ion-color-dark-contrast: #ffffff; - --ion-color-dark-contrast-rgb: 255, 255, 255; - --ion-color-dark-shade: #1e2023; - --ion-color-dark-tint: #383a3e; - - /** medium **/ - --ion-color-medium: #92949c; - --ion-color-medium-rgb: 146, 148, 156; - --ion-color-medium-contrast: #ffffff; - --ion-color-medium-contrast-rgb: 255, 255, 255; - --ion-color-medium-shade: #808289; - --ion-color-medium-tint: #9d9fa6; - - /** light **/ - --ion-color-light: #f4f5f8; - --ion-color-light-rgb: 244, 245, 248; - --ion-color-light-contrast: #000000; - --ion-color-light-contrast-rgb: 0, 0, 0; - --ion-color-light-shade: #d7d8da; - --ion-color-light-tint: #f5f6f9; -} - -@media (prefers-color-scheme: dark) { - /* - * Dark Colors - * ------------------------------------------- - */ - - body { - --ion-color-primary: #428cff; - --ion-color-primary-rgb: 66,140,255; - --ion-color-primary-contrast: #ffffff; - --ion-color-primary-contrast-rgb: 255,255,255; - --ion-color-primary-shade: #3a7be0; - --ion-color-primary-tint: #5598ff; - - --ion-color-secondary: #50c8ff; - --ion-color-secondary-rgb: 80,200,255; - --ion-color-secondary-contrast: #ffffff; - --ion-color-secondary-contrast-rgb: 255,255,255; - --ion-color-secondary-shade: #46b0e0; - --ion-color-secondary-tint: #62ceff; - - --ion-color-tertiary: #6a64ff; - --ion-color-tertiary-rgb: 106,100,255; - --ion-color-tertiary-contrast: #ffffff; - --ion-color-tertiary-contrast-rgb: 255,255,255; - --ion-color-tertiary-shade: #5d58e0; - --ion-color-tertiary-tint: #7974ff; - - --ion-color-success: #2fdf75; - --ion-color-success-rgb: 47,223,117; - --ion-color-success-contrast: #000000; - --ion-color-success-contrast-rgb: 0,0,0; - --ion-color-success-shade: #29c467; - --ion-color-success-tint: #44e283; - - --ion-color-warning: #ffd534; - --ion-color-warning-rgb: 255,213,52; - --ion-color-warning-contrast: #000000; - --ion-color-warning-contrast-rgb: 0,0,0; - --ion-color-warning-shade: #e0bb2e; - --ion-color-warning-tint: #ffd948; - - --ion-color-danger: #ff4961; - --ion-color-danger-rgb: 255,73,97; - --ion-color-danger-contrast: #ffffff; - --ion-color-danger-contrast-rgb: 255,255,255; - --ion-color-danger-shade: #e04055; - --ion-color-danger-tint: #ff5b71; - - --ion-color-dark: #f4f5f8; - --ion-color-dark-rgb: 244,245,248; - --ion-color-dark-contrast: #000000; - --ion-color-dark-contrast-rgb: 0,0,0; - --ion-color-dark-shade: #d7d8da; - --ion-color-dark-tint: #f5f6f9; - - --ion-color-medium: #989aa2; - --ion-color-medium-rgb: 152,154,162; - --ion-color-medium-contrast: #000000; - --ion-color-medium-contrast-rgb: 0,0,0; - --ion-color-medium-shade: #86888f; - --ion-color-medium-tint: #a2a4ab; - - --ion-color-light: #222428; - --ion-color-light-rgb: 34,36,40; - --ion-color-light-contrast: #ffffff; - --ion-color-light-contrast-rgb: 255,255,255; - --ion-color-light-shade: #1e2023; - --ion-color-light-tint: #383a3e; - } - - /* - * iOS Dark Theme - * ------------------------------------------- - */ - - .ios body { - --ion-background-color: #000000; - --ion-background-color-rgb: 0,0,0; - - --ion-text-color: #ffffff; - --ion-text-color-rgb: 255,255,255; - - --ion-color-step-50: #0d0d0d; - --ion-color-step-100: #1a1a1a; - --ion-color-step-150: #262626; - --ion-color-step-200: #333333; - --ion-color-step-250: #404040; - --ion-color-step-300: #4d4d4d; - --ion-color-step-350: #595959; - --ion-color-step-400: #666666; - --ion-color-step-450: #737373; - --ion-color-step-500: #808080; - --ion-color-step-550: #8c8c8c; - --ion-color-step-600: #999999; - --ion-color-step-650: #a6a6a6; - --ion-color-step-700: #b3b3b3; - --ion-color-step-750: #bfbfbf; - --ion-color-step-800: #cccccc; - --ion-color-step-850: #d9d9d9; - --ion-color-step-900: #e6e6e6; - --ion-color-step-950: #f2f2f2; - - --ion-toolbar-background: #0d0d0d; - - --ion-item-background: #000000; - } - - - /* - * Material Design Dark Theme - * ------------------------------------------- - */ - - .md body { - --ion-background-color: #121212; - --ion-background-color-rgb: 18,18,18; - - --ion-text-color: #ffffff; - --ion-text-color-rgb: 255,255,255; - - --ion-border-color: #222222; - - --ion-color-step-50: #1e1e1e; - --ion-color-step-100: #2a2a2a; - --ion-color-step-150: #363636; - --ion-color-step-200: #414141; - --ion-color-step-250: #4d4d4d; - --ion-color-step-300: #595959; - --ion-color-step-350: #656565; - --ion-color-step-400: #717171; - --ion-color-step-450: #7d7d7d; - --ion-color-step-500: #898989; - --ion-color-step-550: #949494; - --ion-color-step-600: #a0a0a0; - --ion-color-step-650: #acacac; - --ion-color-step-700: #b8b8b8; - --ion-color-step-750: #c4c4c4; - --ion-color-step-800: #d0d0d0; - --ion-color-step-850: #dbdbdb; - --ion-color-step-900: #e7e7e7; - --ion-color-step-950: #f3f3f3; - - --ion-item-background: #1e1e1e; - - --ion-toolbar-background: #1f1f1f; - - --ion-tab-bar-background: #1f1f1f; - } -} \ No newline at end of file diff --git a/Govt-Billing-Angular/src/zone-flags.ts b/Govt-Billing-Angular/src/zone-flags.ts deleted file mode 100644 index e999ae9..0000000 --- a/Govt-Billing-Angular/src/zone-flags.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Prevents Angular change detection from - * running with certain Web Component callbacks - */ -(window as any).__Zone_disable_customElements = true; diff --git a/Govt-Billing-Angular/tsconfig.app.json b/Govt-Billing-Angular/tsconfig.app.json deleted file mode 100644 index 91b32f2..0000000 --- a/Govt-Billing-Angular/tsconfig.app.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/app", - "types": [] - }, - "files": [ - "src/main.ts", - "src/polyfills.ts" - ], - "include": [ - "src/**/*.ts", - "src/**/*.d.ts" - ], - "exclude": [ - "src/**/*.spec.ts" - ] -} diff --git a/Govt-Billing-Angular/tsconfig.json b/Govt-Billing-Angular/tsconfig.json deleted file mode 100644 index be2532c..0000000 --- a/Govt-Billing-Angular/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compileOnSave": false, - "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "downlevelIteration": true, - "experimentalDecorators": true, - "module": "esnext", - "moduleResolution": "node", - "importHelpers": true, - "target": "es2015", - "lib": ["es2018", "dom"], - "strict": false - }, - "angularCompilerOptions": { - "fullTemplateTypeCheck": false, - "strictInjectionParameters": false, - "noImplicitAny": false, - "strictTemplates": false - }, - "include": ["src/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/Govt-Billing-Angular/tsconfig.spec.json b/Govt-Billing-Angular/tsconfig.spec.json deleted file mode 100644 index b5bda53..0000000 --- a/Govt-Billing-Angular/tsconfig.spec.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/spec", - "types": [ - "jasmine", - "node" - ] - }, - "files": [ - "src/test.ts", - "src/polyfills.ts" - ], - "include": [ - "src/**/*.spec.ts", - "src/**/*.d.ts" - ] -} \ No newline at end of file diff --git a/Govt-Billing-Angular/tslint.json b/Govt-Billing-Angular/tslint.json deleted file mode 100644 index 21329f4..0000000 --- a/Govt-Billing-Angular/tslint.json +++ /dev/null @@ -1,149 +0,0 @@ -{ - "extends": "tslint:recommended", - "rules": { - "align": { - "options": [ - "parameters", - "statements" - ] - }, - "array-type": false, - "arrow-return-shorthand": true, - "curly": true, - "deprecation": { - "severity": "warning" - }, - "component-class-suffix": [true, "Page", "Component"], - "contextual-lifecycle": true, - "directive-class-suffix": true, - "directive-selector": [ - true, - "attribute", - "app", - "camelCase" - ], - "component-selector": [ - true, - "element", - "app", - "kebab-case" - ], - "eofline": true, - "import-blacklist": [ - true, - "rxjs/Rx" - ], - "import-spacing": true, - "indent": { - "options": [ - "spaces" - ] - }, - "max-classes-per-file": false, - "max-line-length": [ - true, - 140 - ], - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-empty": false, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-non-null-assertion": true, - "no-redundant-jsdoc": true, - "no-switch-case-fall-through": true, - "no-var-requires": false, - "object-literal-key-quotes": [ - true, - "as-needed" - ], - "quotemark": [ - true, - "single" - ], - "semicolon": { - "options": [ - "always" - ] - }, - "space-before-function-paren": { - "options": { - "anonymous": "never", - "asyncArrow": "always", - "constructor": "never", - "method": "never", - "named": "never" - } - }, - "typedef-whitespace": { - "options": [ - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - }, - { - "call-signature": "onespace", - "index-signature": "onespace", - "parameter": "onespace", - "property-declaration": "onespace", - "variable-declaration": "onespace" - } - ] - }, - "variable-name": { - "options": [ - "ban-keywords", - "check-format", - "allow-pascal-case" - ] - }, - "whitespace": { - "options": [ - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type", - "check-typecast" - ] - }, - "no-conflicting-lifecycle": true, - "no-host-metadata-property": true, - "no-input-rename": true, - "no-inputs-metadata-property": true, - "no-output-native": true, - "no-output-on-prefix": true, - "no-output-rename": true, - "no-outputs-metadata-property": true, - "template-banana-in-box": true, - "template-no-negated-async": true, - "use-lifecycle-interface": true, - "use-pipe-transform-interface": true, - "object-literal-sort-keys": false - }, - "rulesDirectory": [ - "codelyzer" - ] -} \ No newline at end of file diff --git a/Govt-Billing-Angular/typings/socialcalc.d.ts b/Govt-Billing-Angular/typings/socialcalc.d.ts deleted file mode 100644 index 2479ace..0000000 --- a/Govt-Billing-Angular/typings/socialcalc.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module "socialcalc/AppGeneral"; diff --git a/Govt-Billing-React-Ad-Subscriptions/.browserslistrc b/Govt-Billing-React-Ad-Subscriptions/.browserslistrc deleted file mode 100644 index ade7392..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/.browserslistrc +++ /dev/null @@ -1,6 +0,0 @@ -Chrome >=79 -ChromeAndroid >=79 -Firefox >=70 -Edge >=79 -Safari >=14 -iOS >=14 \ No newline at end of file diff --git a/Govt-Billing-React-Ad-Subscriptions/.env.example b/Govt-Billing-React-Ad-Subscriptions/.env.example deleted file mode 100644 index 7738878..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/.env.example +++ /dev/null @@ -1,9 +0,0 @@ -VITE_FIREBASE_VITE_APP_TITLE="firebase app title" -VITE_FIREBASE_API_KEY="firebase_key" -VITE_FIREBASE_AUTH_DOMAIN="domain_name.firebaseapp.com" -VITE_FIREBASE_PROJECT_ID="project_id" -VITE_FIREBASE_STORAGE_BUCKET="storage_bucket" -VITE_FIREBASE_MESSAGING_SENDER_ID="sender_id" -VITE_FIREBASE_APP_ID="firebase_app_id" -IOS_AD_ID= -ANDROID_AD_ID= diff --git a/Govt-Billing-React-Ad-Subscriptions/.eslintrc.js b/Govt-Billing-React-Ad-Subscriptions/.eslintrc.js deleted file mode 100644 index af472a1..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/.eslintrc.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - root: true, - env: { - node: true - }, - 'extends': [ - 'plugin:react/recommended', - 'eslint:recommended' - ], - parserOptions: { - ecmaVersion: 2020 - }, - rules: { - 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', - 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', - } -} diff --git a/Govt-Billing-React-Ad-Subscriptions/.gitignore b/Govt-Billing-React-Ad-Subscriptions/.gitignore deleted file mode 100644 index 1986cff..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/dist - -# misc -.DS_Store -.env -.env.local -.env.development.local -.env.test.local -.env.production.local -/.vscode/* -!/.vscode/extensions.json -.idea - -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Optional eslint cache -.eslintcache diff --git a/Govt-Billing-React-Ad-Subscriptions/.vscode/extensions.json b/Govt-Billing-React-Ad-Subscriptions/.vscode/extensions.json deleted file mode 100644 index ffcebbe..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/.vscode/extensions.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "recommendations": [ - "ionic.ionic" - ] -} diff --git a/Govt-Billing-React-Ad-Subscriptions/README.md b/Govt-Billing-React-Ad-Subscriptions/README.md deleted file mode 100644 index 6ee0c12..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# Project Migration and Fixes - -This project involves the migration of an Ionic v5 app with outdated dependencies to Ionic v7 using Vite as the build tool. The process included transferring code and addressing various issues encountered during the migration. - -## Migration Steps - -- Create a new Ionic Vite app: - -```bash -npx create-ionic-vite@latest -``` - -- Transfer code from the original Ionic v5 project to the new Vite-based project. - -- Fix errors encountered during the migration process by addressing them one by one. - -## Integration of SocialCalc - -During the integration of SocialCalc, an issue arose when switching from UMD to ES6 imports. Although the code worked on the web, it failed on an Android emulator due to the unavailability of the window object. - -To resolve this, the UMD module was re-implemented, and the window object was defined in the SocialCalc file. Additionally, the SocialCalc file's outdated code lacked variable declarations. To make these variables available at the top of the scope, the var keyword was used. - -## Android Emulator Compatibility Fix - -To make the project compatible with an Android emulator, ensure that variables are declared at the top of the scope in the SocialCalc file. This step is essential for addressing issues related to the unavailability of the window object on the Android platform. - -## Running the Project on Web - -To build an APK from the codebase, follow these steps: - -- Install Node.js if not already installed. - -- Clone the repository: - -```bash -git clone REPO_URL -``` - -- Navigate to the project directory: - -```bash -cd REPO_NAME -``` - -- Install project dependencies: - -```bash -npm install -``` - -- Install the Ionic CLI globally: - -```bash -npm install -g @ionic/cli -``` - -- Setup a firebase project and add the firebase configuration in the `.env` file in the format given in the `.env.example` - -- Serve the application: - -```bash -ionic serve -``` - -These steps will set up the project and allow you to test it in a development environment. - -## Running the Project on Android Device - -- Install Android Studio if not already installed. - -- Sync android codebase - -```bash -ionic cap sync android -``` - -- Opening the Project in android Studio - -```bash -ionic cap open android -``` - -Now you can run the app on a physical device or a virtual emulator, you can also build the app from the menu bar - -## Running the Project on IOS Device - -- Install XCode and XCode CLI if not already installed. - -- Sync ios codebase - -```bash -ionic cap sync ios -``` - -- Opening the Project in XCode - -```bash -ionic cap open ios -``` - -Now you can run the app on a physical device or a virtual emulator, you can also build the app from the menu bar diff --git a/Govt-Billing-React-Ad-Subscriptions/android/.gitignore b/Govt-Billing-React-Ad-Subscriptions/android/.gitignore deleted file mode 100644 index 48354a3..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/.gitignore +++ /dev/null @@ -1,101 +0,0 @@ -# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore - -# Built application files -*.apk -*.aar -*.ap_ -*.aab - -# Files for the ART/Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ -# Uncomment the following line in case you need and you don't have the release build type files in your app -# release/ - -# Gradle files -.gradle/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# IntelliJ -*.iml -.idea/workspace.xml -.idea/tasks.xml -.idea/gradle.xml -.idea/assetWizardSettings.xml -.idea/dictionaries -.idea/libraries -# Android Studio 3 in .gitignore file. -.idea/caches -.idea/modules.xml -# Comment next line if keeping position of elements in Navigation Editor is relevant for you -.idea/navEditor.xml - -# Keystore files -# Uncomment the following lines if you do not want to check your keystore files in. -#*.jks -#*.keystore - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild -.cxx/ - -# Google Services (e.g. APIs or Firebase) -# google-services.json - -# Freeline -freeline.py -freeline/ -freeline_project_description.json - -# fastlane -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output -fastlane/readme.md - -# Version control -vcs.xml - -# lint -lint/intermediates/ -lint/generated/ -lint/outputs/ -lint/tmp/ -# lint/reports/ - -# Android Profiling -*.hprof - -# Cordova plugins for Capacitor -capacitor-cordova-android-plugins - -# Copied web assets -app/src/main/assets/public - -# Generated Config files -app/src/main/assets/capacitor.config.json -app/src/main/assets/capacitor.plugins.json -app/src/main/res/xml/config.xml diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/.gitignore b/Govt-Billing-React-Ad-Subscriptions/android/app/.gitignore deleted file mode 100644 index 043df80..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build/* -!/build/.npmkeep diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/build.gradle b/Govt-Billing-React-Ad-Subscriptions/android/app/build.gradle deleted file mode 100644 index 8e2f21f..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/build.gradle +++ /dev/null @@ -1,54 +0,0 @@ -apply plugin: 'com.android.application' - -android { - namespace "io.ionic.starter" - compileSdkVersion rootProject.ext.compileSdkVersion - defaultConfig { - applicationId "io.ionic.starter" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - aaptOptions { - // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. - // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 - ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' - } - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -repositories { - flatDir{ - dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' - } -} - -dependencies { - implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" - implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" - implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" - implementation project(':capacitor-android') - testImplementation "junit:junit:$junitVersion" - androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" - androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" - implementation project(':capacitor-cordova-android-plugins') -} - -apply from: 'capacitor.build.gradle' - -try { - def servicesJSON = file('google-services.json') - if (servicesJSON.text) { - apply plugin: 'com.google.gms.google-services' - } -} catch(Exception e) { - logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") -} diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/capacitor.build.gradle b/Govt-Billing-React-Ad-Subscriptions/android/app/capacitor.build.gradle deleted file mode 100644 index 20e5021..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/capacitor.build.gradle +++ /dev/null @@ -1,25 +0,0 @@ -// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN - -android { - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } -} - -apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" -dependencies { - implementation project(':capacitor-community-admob') - implementation project(':capacitor-app') - implementation project(':capacitor-haptics') - implementation project(':capacitor-keyboard') - implementation project(':capacitor-preferences') - implementation project(':capacitor-status-bar') - implementation project(':capacitor-email-composer') - -} - - -if (hasProperty('postBuildExtras')) { - postBuildExtras() -} diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/proguard-rules.pro b/Govt-Billing-React-Ad-Subscriptions/android/app/proguard-rules.pro deleted file mode 100644 index f1b4245..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/Govt-Billing-React-Ad-Subscriptions/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java deleted file mode 100644 index f2c2217..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.getcapacitor.myapp; - -import static org.junit.Assert.*; - -import android.content.Context; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.platform.app.InstrumentationRegistry; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - - @Test - public void useAppContext() throws Exception { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - - assertEquals("com.getcapacitor.app", appContext.getPackageName()); - } -} diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/AndroidManifest.xml b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index a182233..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/java/io/ionic/starter/MainActivity.java b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/java/io/ionic/starter/MainActivity.java deleted file mode 100644 index 73e3a98..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/java/io/ionic/starter/MainActivity.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.ionic.starter; - -import com.getcapacitor.BridgeActivity; - -public class MainActivity extends BridgeActivity {} diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-hdpi/splash.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-hdpi/splash.png deleted file mode 100644 index e31573b..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-hdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-mdpi/splash.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-mdpi/splash.png deleted file mode 100644 index f7a6492..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-mdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-xhdpi/splash.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-xhdpi/splash.png deleted file mode 100644 index 8077255..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-xhdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-xxhdpi/splash.png deleted file mode 100644 index 14c6c8f..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-xxhdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-xxxhdpi/splash.png deleted file mode 100644 index 244ca25..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-land-xxxhdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-hdpi/splash.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-hdpi/splash.png deleted file mode 100644 index 74faaa5..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-hdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-mdpi/splash.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-mdpi/splash.png deleted file mode 100644 index e944f4a..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-mdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-xhdpi/splash.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-xhdpi/splash.png deleted file mode 100644 index 564a82f..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-xhdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-xxhdpi/splash.png deleted file mode 100644 index bfabe68..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-xxhdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-xxxhdpi/splash.png deleted file mode 100644 index 6929071..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-port-xxxhdpi/splash.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index c7bd21d..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable/ic_launcher_background.xml b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index d5fccc5..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable/splash.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable/splash.png deleted file mode 100644 index f7a6492..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/drawable/splash.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/layout/activity_main.xml b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index b5ad138..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 036d09b..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 036d09b..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index c023e50..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index 2127973..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index b441f37..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 72905b8..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index 8ed0605..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 9502e47..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 4d1e077..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index df0f158..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 853db04..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 6cdf97c..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 2960cbb..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 8e3093a..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 46de6e2..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index d2ea9ab..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index a40d73e..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/values/ic_launcher_background.xml b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/values/ic_launcher_background.xml deleted file mode 100644 index c5d5899..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/values/ic_launcher_background.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #FFFFFF - \ No newline at end of file diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/values/strings.xml b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 2b9eebd..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - GovtInvoiceNew - GovtInvoiceNew - io.ionic.starter - io.ionic.starter - ca-app-pub-6225630378781545~3239994823 - diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/values/styles.xml b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/values/styles.xml deleted file mode 100644 index be874e5..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/xml/file_paths.xml b/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/xml/file_paths.xml deleted file mode 100644 index bd0c4d8..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/src/main/res/xml/file_paths.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Govt-Billing-React-Ad-Subscriptions/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/Govt-Billing-React-Ad-Subscriptions/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java deleted file mode 100644 index 0297327..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.getcapacitor.myapp; - -import static org.junit.Assert.*; - -import org.junit.Test; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - - @Test - public void addition_isCorrect() throws Exception { - assertEquals(4, 2 + 2); - } -} diff --git a/Govt-Billing-React-Ad-Subscriptions/android/build.gradle b/Govt-Billing-React-Ad-Subscriptions/android/build.gradle deleted file mode 100644 index 9cc72cb..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - - repositories { - google() - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:8.0.0' - classpath 'com.google.gms:google-services:4.3.15' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -apply from: "variables.gradle" - -allprojects { - repositories { - google() - mavenCentral() - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/Govt-Billing-React-Ad-Subscriptions/android/capacitor.settings.gradle b/Govt-Billing-React-Ad-Subscriptions/android/capacitor.settings.gradle deleted file mode 100644 index 20211c9..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/capacitor.settings.gradle +++ /dev/null @@ -1,24 +0,0 @@ -// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN -include ':capacitor-android' -project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') - -include ':capacitor-community-admob' -project(':capacitor-community-admob').projectDir = new File('../node_modules/@capacitor-community/admob/android') - -include ':capacitor-app' -project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android') - -include ':capacitor-haptics' -project(':capacitor-haptics').projectDir = new File('../node_modules/@capacitor/haptics/android') - -include ':capacitor-keyboard' -project(':capacitor-keyboard').projectDir = new File('../node_modules/@capacitor/keyboard/android') - -include ':capacitor-preferences' -project(':capacitor-preferences').projectDir = new File('../node_modules/@capacitor/preferences/android') - -include ':capacitor-status-bar' -project(':capacitor-status-bar').projectDir = new File('../node_modules/@capacitor/status-bar/android') - -include ':capacitor-email-composer' -project(':capacitor-email-composer').projectDir = new File('../node_modules/capacitor-email-composer/android') diff --git a/Govt-Billing-React-Ad-Subscriptions/android/gradle.properties b/Govt-Billing-React-Ad-Subscriptions/android/gradle.properties deleted file mode 100644 index 2e87c52..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/gradle.properties +++ /dev/null @@ -1,22 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true - -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true diff --git a/Govt-Billing-React-Ad-Subscriptions/android/gradle/wrapper/gradle-wrapper.jar b/Govt-Billing-React-Ad-Subscriptions/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index ccebba7..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/android/gradle/wrapper/gradle-wrapper.properties b/Govt-Billing-React-Ad-Subscriptions/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 761b8f0..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-all.zip -networkTimeout=10000 -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/Govt-Billing-React-Ad-Subscriptions/android/gradlew b/Govt-Billing-React-Ad-Subscriptions/android/gradlew deleted file mode 100755 index 79a61d4..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/gradlew +++ /dev/null @@ -1,244 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/Govt-Billing-React-Ad-Subscriptions/android/gradlew.bat b/Govt-Billing-React-Ad-Subscriptions/android/gradlew.bat deleted file mode 100644 index 6689b85..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/gradlew.bat +++ /dev/null @@ -1,92 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/Govt-Billing-React-Ad-Subscriptions/android/settings.gradle b/Govt-Billing-React-Ad-Subscriptions/android/settings.gradle deleted file mode 100644 index 3b4431d..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/settings.gradle +++ /dev/null @@ -1,5 +0,0 @@ -include ':app' -include ':capacitor-cordova-android-plugins' -project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') - -apply from: 'capacitor.settings.gradle' \ No newline at end of file diff --git a/Govt-Billing-React-Ad-Subscriptions/android/variables.gradle b/Govt-Billing-React-Ad-Subscriptions/android/variables.gradle deleted file mode 100644 index 5946ada..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/android/variables.gradle +++ /dev/null @@ -1,16 +0,0 @@ -ext { - minSdkVersion = 22 - compileSdkVersion = 33 - targetSdkVersion = 33 - androidxActivityVersion = '1.7.0' - androidxAppCompatVersion = '1.6.1' - androidxCoordinatorLayoutVersion = '1.2.0' - androidxCoreVersion = '1.10.0' - androidxFragmentVersion = '1.5.6' - coreSplashScreenVersion = '1.0.0' - androidxWebkitVersion = '1.6.1' - junitVersion = '4.13.2' - androidxJunitVersion = '1.1.5' - androidxEspressoCoreVersion = '3.5.1' - cordovaAndroidVersion = '10.1.1' -} \ No newline at end of file diff --git a/Govt-Billing-React-Ad-Subscriptions/capacitor.config.ts b/Govt-Billing-React-Ad-Subscriptions/capacitor.config.ts deleted file mode 100644 index 2ad78aa..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/capacitor.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { CapacitorConfig } from '@capacitor/cli'; - -const config: CapacitorConfig = { - appId: 'io.ionic.starter', - appName: 'GovtInvoiceNew', - webDir: 'dist', - server: { - androidScheme: 'https' - } -}; - -export default config; diff --git a/Govt-Billing-React-Ad-Subscriptions/index.html b/Govt-Billing-React-Ad-Subscriptions/index.html deleted file mode 100644 index d4d35b6..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/index.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - Ionic App - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - diff --git a/Govt-Billing-React-Ad-Subscriptions/ionic.config.json b/Govt-Billing-React-Ad-Subscriptions/ionic.config.json deleted file mode 100644 index bc6720d..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ionic.config.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "GovtInvoiceNew", - "integrations": { - "capacitor": {} - }, - "type": "react-vite" -} diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/.gitignore b/Govt-Billing-React-Ad-Subscriptions/ios/.gitignore deleted file mode 100644 index f470299..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ios/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -App/build -App/Pods -App/output -App/App/public -DerivedData -xcuserdata - -# Cordova plugins for Capacitor -capacitor-cordova-ios-plugins - -# Generated Config files -App/App/capacitor.config.json -App/App/config.xml diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App.xcodeproj/project.pbxproj b/Govt-Billing-React-Ad-Subscriptions/ios/App/App.xcodeproj/project.pbxproj deleted file mode 100644 index b609deb..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ios/App/App.xcodeproj/project.pbxproj +++ /dev/null @@ -1,422 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 48; - objects = { - -/* Begin PBXBuildFile section */ - 2FAD9763203C412B000D30F8 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2FAD9762203C412B000D30F8 /* config.xml */; }; - 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 50379B222058CBB4000EE86E /* capacitor.config.json */; }; - 504EC3081FED79650016851F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504EC3071FED79650016851F /* AppDelegate.swift */; }; - 504EC30D1FED79650016851F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30B1FED79650016851F /* Main.storyboard */; }; - 504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; }; - 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; - 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; - A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = ""; }; - 50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = ""; }; - 504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 504EC3071FED79650016851F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 504EC30C1FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 504EC30E1FED79650016851F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; - AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = ""; }; - FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 504EC3011FED79650016851F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */ = { - isa = PBXGroup; - children = ( - AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 504EC2FB1FED79650016851F = { - isa = PBXGroup; - children = ( - 504EC3061FED79650016851F /* App */, - 504EC3051FED79650016851F /* Products */, - 7F8756D8B27F46E3366F6CEA /* Pods */, - 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */, - ); - sourceTree = ""; - }; - 504EC3051FED79650016851F /* Products */ = { - isa = PBXGroup; - children = ( - 504EC3041FED79650016851F /* App.app */, - ); - name = Products; - sourceTree = ""; - }; - 504EC3061FED79650016851F /* App */ = { - isa = PBXGroup; - children = ( - 50379B222058CBB4000EE86E /* capacitor.config.json */, - 504EC3071FED79650016851F /* AppDelegate.swift */, - 504EC30B1FED79650016851F /* Main.storyboard */, - 504EC30E1FED79650016851F /* Assets.xcassets */, - 504EC3101FED79650016851F /* LaunchScreen.storyboard */, - 504EC3131FED79650016851F /* Info.plist */, - 2FAD9762203C412B000D30F8 /* config.xml */, - 50B271D01FEDC1A000F3C39B /* public */, - ); - path = App; - sourceTree = ""; - }; - 7F8756D8B27F46E3366F6CEA /* Pods */ = { - isa = PBXGroup; - children = ( - FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */, - AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 504EC3031FED79650016851F /* App */ = { - isa = PBXNativeTarget; - buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */; - buildPhases = ( - 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */, - 504EC3001FED79650016851F /* Sources */, - 504EC3011FED79650016851F /* Frameworks */, - 504EC3021FED79650016851F /* Resources */, - 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */, - 64047759D81A3CDA4B72852B /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = App; - productName = App; - productReference = 504EC3041FED79650016851F /* App.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 504EC2FC1FED79650016851F /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 0920; - TargetAttributes = { - 504EC3031FED79650016851F = { - CreatedOnToolsVersion = 9.2; - LastSwiftMigration = 1100; - ProvisioningStyle = Automatic; - }; - }; - }; - buildConfigurationList = 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */; - compatibilityVersion = "Xcode 8.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 504EC2FB1FED79650016851F; - productRefGroup = 504EC3051FED79650016851F /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 504EC3031FED79650016851F /* App */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 504EC3021FED79650016851F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */, - 50B271D11FEDC1A000F3C39B /* public in Resources */, - 504EC30F1FED79650016851F /* Assets.xcassets in Resources */, - 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */, - 504EC30D1FED79650016851F /* Main.storyboard in Resources */, - 2FAD9763203C412B000D30F8 /* config.xml in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 64047759D81A3CDA4B72852B /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 504EC3001FED79650016851F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 504EC3081FED79650016851F /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 504EC30B1FED79650016851F /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 504EC30C1FED79650016851F /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 504EC3101FED79650016851F /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 504EC3111FED79650016851F /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 504EC3141FED79650016851F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 504EC3151FED79650016851F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 504EC3171FED79650016851F /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - INFOPLIST_FILE = App/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; - PRODUCT_BUNDLE_IDENTIFIER = io.ionic.starter; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 504EC3181FED79650016851F /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - INFOPLIST_FILE = App/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = io.ionic.starter; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 504EC3141FED79650016851F /* Debug */, - 504EC3151FED79650016851F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 504EC3171FED79650016851F /* Debug */, - 504EC3181FED79650016851F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 504EC2FC1FED79650016851F /* Project object */; -} diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Govt-Billing-React-Ad-Subscriptions/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 42daef8..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App.xcworkspace/contents.xcworkspacedata b/Govt-Billing-React-Ad-Subscriptions/ios/App/App.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index b301e82..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ios/App/App.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Govt-Billing-React-Ad-Subscriptions/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/AppDelegate.swift b/Govt-Billing-React-Ad-Subscriptions/ios/App/App/AppDelegate.swift deleted file mode 100644 index c3cd83b..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/AppDelegate.swift +++ /dev/null @@ -1,49 +0,0 @@ -import UIKit -import Capacitor - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { - // Called when the app was launched with a url. Feel free to add additional processing here, - // but if you want the App API to support tracking app url opens, make sure to keep this call - return ApplicationDelegateProxy.shared.application(app, open: url, options: options) - } - - func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { - // Called when the app was launched with an activity, including Universal Links. - // Feel free to add additional processing here, but if you want the App API to support - // tracking app url opens, make sure to keep this call - return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) - } - -} diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png deleted file mode 100644 index adf6ba0..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 9b7d382..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "images" : [ - { - "filename" : "AppIcon-512@2x.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Contents.json b/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json b/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json deleted file mode 100644 index d7d96a6..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "splash-2732x2732-2.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "splash-2732x2732-1.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "splash-2732x2732.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png b/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png deleted file mode 100644 index 33ea6c9..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png b/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png deleted file mode 100644 index 33ea6c9..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png b/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png deleted file mode 100644 index 33ea6c9..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Base.lproj/LaunchScreen.storyboard b/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index e7ae5d7..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Base.lproj/Main.storyboard b/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Base.lproj/Main.storyboard deleted file mode 100644 index b44df7b..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Base.lproj/Main.storyboard +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Info.plist b/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Info.plist deleted file mode 100644 index e7aa335..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ios/App/App/Info.plist +++ /dev/null @@ -1,63 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - GovtInvoiceNew - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - LSRequiresIPhoneOS - - GADIsAdManagerApp - - GADApplicationIdentifier - ca-app-pub-6225630378781545~9582041897 -SKAdNetworkItems - - - SKAdNetworkIdentifier - cstr6suwn9.skadnetwork - - -NSUserTrackingUsageDescription -Helps us to improve ad quality. - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/Podfile b/Govt-Billing-React-Ad-Subscriptions/ios/App/Podfile deleted file mode 100644 index 263e636..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ios/App/Podfile +++ /dev/null @@ -1,30 +0,0 @@ -require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers' - -platform :ios, '13.0' -use_frameworks! - -# workaround to avoid Xcode caching of Pods that requires -# Product -> Clean Build Folder after new Cordova plugins installed -# Requires CocoaPods 1.6 or newer -install! 'cocoapods', :disable_input_output_paths => true - -def capacitor_pods - pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' - pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' - pod 'CapacitorCommunityAdmob', :path => '../../node_modules/@capacitor-community/admob' - pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app' - pod 'CapacitorHaptics', :path => '../../node_modules/@capacitor/haptics' - pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard' - pod 'CapacitorPreferences', :path => '../../node_modules/@capacitor/preferences' - pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar' - pod 'CapacitorEmailComposer', :path => '../../node_modules/capacitor-email-composer' -end - -target 'App' do - capacitor_pods - # Add your Pods here -end - -post_install do |installer| - assertDeploymentTarget(installer) -end diff --git a/Govt-Billing-React-Ad-Subscriptions/ios/App/Podfile.lock b/Govt-Billing-React-Ad-Subscriptions/ios/App/Podfile.lock deleted file mode 100644 index cee7033..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/ios/App/Podfile.lock +++ /dev/null @@ -1,75 +0,0 @@ -PODS: - - Capacitor (5.7.0): - - CapacitorCordova - - CapacitorApp (5.0.7): - - Capacitor - - CapacitorCommunityAdmob (6.0.0): - - Capacitor - - Google-Mobile-Ads-SDK (= 11.3.0) - - CapacitorCordova (5.7.0) - - CapacitorEmailComposer (5.0.0): - - Capacitor - - CapacitorHaptics (5.0.7): - - Capacitor - - CapacitorKeyboard (5.0.8): - - Capacitor - - CapacitorPreferences (5.0.7): - - Capacitor - - CapacitorStatusBar (5.0.7): - - Capacitor - - Google-Mobile-Ads-SDK (11.3.0): - - GoogleUserMessagingPlatform (>= 1.1) - - GoogleUserMessagingPlatform (2.5.0) - -DEPENDENCIES: - - "Capacitor (from `../../node_modules/@capacitor/ios`)" - - "CapacitorApp (from `../../node_modules/@capacitor/app`)" - - "CapacitorCommunityAdmob (from `../../node_modules/@capacitor-community/admob`)" - - "CapacitorCordova (from `../../node_modules/@capacitor/ios`)" - - CapacitorEmailComposer (from `../../node_modules/capacitor-email-composer`) - - "CapacitorHaptics (from `../../node_modules/@capacitor/haptics`)" - - "CapacitorKeyboard (from `../../node_modules/@capacitor/keyboard`)" - - "CapacitorPreferences (from `../../node_modules/@capacitor/preferences`)" - - "CapacitorStatusBar (from `../../node_modules/@capacitor/status-bar`)" - -SPEC REPOS: - trunk: - - Google-Mobile-Ads-SDK - - GoogleUserMessagingPlatform - -EXTERNAL SOURCES: - Capacitor: - :path: "../../node_modules/@capacitor/ios" - CapacitorApp: - :path: "../../node_modules/@capacitor/app" - CapacitorCommunityAdmob: - :path: "../../node_modules/@capacitor-community/admob" - CapacitorCordova: - :path: "../../node_modules/@capacitor/ios" - CapacitorEmailComposer: - :path: "../../node_modules/capacitor-email-composer" - CapacitorHaptics: - :path: "../../node_modules/@capacitor/haptics" - CapacitorKeyboard: - :path: "../../node_modules/@capacitor/keyboard" - CapacitorPreferences: - :path: "../../node_modules/@capacitor/preferences" - CapacitorStatusBar: - :path: "../../node_modules/@capacitor/status-bar" - -SPEC CHECKSUMS: - Capacitor: fc155ee2ee45a2093d716f13cf5aa5a865e2d85a - CapacitorApp: 17fecd0e6cb23feafac7eb0939417389038b0979 - CapacitorCommunityAdmob: 59456f0c29033d710ef90ef81044ad0eeab3caf6 - CapacitorCordova: e825fce1a2e14e4b5730641c7e098dccf74397b7 - CapacitorEmailComposer: 551949d4269197efc9f0d51a19c0d2d06e7fb452 - CapacitorHaptics: 7c7c206f0c96a628fed073830c96d28c4b2e772e - CapacitorKeyboard: aec619a578235c6ce279075009a2689c2cf5c42c - CapacitorPreferences: 77ac427e98db83bace772455f8ba447430382c4c - CapacitorStatusBar: f390fbb49b82ffb754ea4b3cf71dc8b048baf3e7 - Google-Mobile-Ads-SDK: 301a16c461c331ba34ff4dab40a22ab7c147af61 - GoogleUserMessagingPlatform: 6b4f48a370e77ce121d034c908cc6ee4fdafaf13 - -PODFILE CHECKSUM: d35965e4a22258f6d9bfa721013b04d26930b66d - -COCOAPODS: 1.15.2 diff --git a/Govt-Billing-React-Ad-Subscriptions/package-lock.json b/Govt-Billing-React-Ad-Subscriptions/package-lock.json deleted file mode 100644 index 365fbe8..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/package-lock.json +++ /dev/null @@ -1,12621 +0,0 @@ -{ - "name": "GovtInvoiceNew", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "GovtInvoiceNew", - "version": "0.0.1", - "dependencies": { - "@capacitor-community/admob": "^6.0.0", - "@capacitor/android": "5.7.0", - "@capacitor/app": "5.0.7", - "@capacitor/core": "5.7.0", - "@capacitor/haptics": "5.0.7", - "@capacitor/ios": "5.7.0", - "@capacitor/keyboard": "5.0.8", - "@capacitor/preferences": "^5.0.7", - "@capacitor/status-bar": "5.0.7", - "@ionic-native/printer": "^5.36.0", - "@ionic/react": "^7.0.0", - "@ionic/react-router": "^7.0.0", - "@types/react-router": "^5.1.20", - "@types/react-router-dom": "^5.3.3", - "capacitor-email-composer": "^5.0.0", - "firebase": "^10.8.1", - "ionicons": "^7.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router": "^5.3.4", - "react-router-dom": "^5.3.4", - "vite-plugin-commonjs": "^0.10.1" - }, - "devDependencies": { - "@capacitor/cli": "^5.7.0", - "@originjs/vite-plugin-commonjs": "^1.0.3", - "@testing-library/dom": ">=7.21.4", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^14.0.0", - "@testing-library/user-event": "^14.4.3", - "@types/react": "^18.0.27", - "@types/react-dom": "^18.0.10", - "@vite-pwa/assets-generator": "^0.2.4", - "@vitejs/plugin-legacy": "^5.0.0", - "@vitejs/plugin-react": "^4.0.1", - "cypress": "^13.5.0", - "eslint": "^8.35.0", - "eslint-plugin-react": "^7.32.2", - "jsdom": "^22.1.0", - "terser": "^5.4.0", - "typescript": "^5.1.6", - "vite": "^5.0.0", - "vite-plugin-pwa": "^0.19.0", - "vitest": "^0.34.6" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", - "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", - "dev": true - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@antfu/utils": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.7.tgz", - "integrity": "sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz", - "integrity": "sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", - "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", - "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", - "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.9", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.9", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@canvas/image-data": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.0.0.tgz", - "integrity": "sha512-BxOqI5LgsIQP1odU5KMwV9yoijleOPzHL18/YvNqF9KFSGF2K/DLlYAbDQsWqd/1nbaFuSkYD/191dpMtNh4vw==", - "dev": true - }, - "node_modules/@capacitor-community/admob": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@capacitor-community/admob/-/admob-6.0.0.tgz", - "integrity": "sha512-coM3dx9Xw2fQgMCXAvR76Mv+Fe1C6JFA8A7k+7FJ1ZbJbN/y9DW7A7bF8EBcFdTyDa2LjDRIDxmjzHZYYgDl0g==", - "dependencies": { - "@capacitor/core": "^6.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@capacitor-community/admob/node_modules/@capacitor/core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-6.1.2.tgz", - "integrity": "sha512-xFy1/4qLFLp5WCIzIhtwUuVNNoz36+V7/BzHmLqgVJcvotc4MMjswW/TshnPQaLLujEOaLkA4h8ZJ0uoK3ImGg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@capacitor/android": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-5.7.0.tgz", - "integrity": "sha512-0bnG1dqfT/nTjzMeHF/a5kF8mqGjHrPLADNqn41seWDfb2ch6AMiKUHsmHpEOWmGIrWOM25qNTrTOytoCSpuXg==", - "peerDependencies": { - "@capacitor/core": "^5.7.0" - } - }, - "node_modules/@capacitor/app": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-5.0.7.tgz", - "integrity": "sha512-oad0jwQu+vgQDukeS9UV56yG10dlxkAGGl26IQpZlTmg3dTI9qSJtvhmlLfkF0nEtoj5IsVQUPE+NLH1oZkgGQ==", - "peerDependencies": { - "@capacitor/core": "^5.0.0" - } - }, - "node_modules/@capacitor/cli": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-5.7.0.tgz", - "integrity": "sha512-md6217RXFQwSNo9vr1gDgBqR88MJaQVwu3C5W3bpWlmajhec6NUR7yT7QNcBWErhCIJfqOOqXu4ZSSShndF0ug==", - "dev": true, - "dependencies": { - "@ionic/cli-framework-output": "^2.2.5", - "@ionic/utils-fs": "^3.1.6", - "@ionic/utils-subprocess": "^2.1.11", - "@ionic/utils-terminal": "^2.3.3", - "commander": "^9.3.0", - "debug": "^4.3.4", - "env-paths": "^2.2.0", - "kleur": "^4.1.4", - "native-run": "^2.0.0", - "open": "^8.4.0", - "plist": "^3.0.5", - "prompts": "^2.4.2", - "rimraf": "^4.4.1", - "semver": "^7.3.7", - "tar": "^6.1.11", - "tslib": "^2.4.0", - "xml2js": "^0.5.0" - }, - "bin": { - "cap": "bin/capacitor", - "capacitor": "bin/capacitor" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@capacitor/cli/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@capacitor/cli/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/@capacitor/cli/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@capacitor/cli/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@capacitor/cli/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@capacitor/cli/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@capacitor/cli/node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "dev": true, - "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@capacitor/cli/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@capacitor/cli/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@capacitor/core": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.7.0.tgz", - "integrity": "sha512-wa9Fao+Axa1t2ZERMyQD9r0xyfglQyC4DHQKintzKaIqcRuVe9J31TmfD3IxROYi9LGpY4X8cq4m4bjb0W94Qg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@capacitor/haptics": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@capacitor/haptics/-/haptics-5.0.7.tgz", - "integrity": "sha512-/j+7Qa4BxQA5aOU43cwXuiudfSXfoHFsAVfcehH5DkSjxLykZKWHEuE4uFJXqdkSIbAHjS37D0Sde6ENP6G/MA==", - "peerDependencies": { - "@capacitor/core": "^5.0.0" - } - }, - "node_modules/@capacitor/ios": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-5.7.0.tgz", - "integrity": "sha512-zoEdsYQHI1zz2vjKsTpu5bSfxQQ5jrk3Qs6Op9MYcckZZ2QWIs0YpL99p+zODXNpkkyLG73NXEIrOjvyI9jx8A==", - "peerDependencies": { - "@capacitor/core": "^5.7.0" - } - }, - "node_modules/@capacitor/keyboard": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-5.0.8.tgz", - "integrity": "sha512-XYyBzGlzjgLPqyPVdu5McGLYV6+G2efVR4I3l5cF1B27M6U/oFqv9CQU74WNG08nee28bfccboNpv6eWCLYn1A==", - "peerDependencies": { - "@capacitor/core": "^5.0.0" - } - }, - "node_modules/@capacitor/preferences": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@capacitor/preferences/-/preferences-5.0.7.tgz", - "integrity": "sha512-JvfGP1m8nITWEFdBpKR9HXNeBjLKwO0q1pry7Z5lYrYmCrbyRBLWzaGZGll8py4KmGWL3F5+PZvhrpT4gPoeAQ==", - "peerDependencies": { - "@capacitor/core": "^5.0.0" - } - }, - "node_modules/@capacitor/status-bar": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-5.0.7.tgz", - "integrity": "sha512-KblB3gV2LDMEjx3fQoNBAzxb+Tr+2mv68SfFLLDCMiMUD3Eile2TAWRWd1yxy496pDFTOs2BJtup8++iuuuJ/w==", - "peerDependencies": { - "@capacitor/core": "^5.0.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cypress/request": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", - "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "http-signature": "~1.3.6", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "performance-now": "^2.1.0", - "qs": "6.10.4", - "safe-buffer": "^5.1.2", - "tough-cookie": "^4.1.3", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" - } - }, - "node_modules/@cypress/xvfb/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@firebase/analytics": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.1.tgz", - "integrity": "sha512-5mnH1aQa99J5lZMJwTNzIoRc4yGXHf+fOn+EoEWhCDA3XGPweGHcylCbqq+G1wVJmfILL57fohDMa8ftMZ+44g==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/installations": "0.6.5", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/analytics-compat": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.7.tgz", - "integrity": "sha512-17VCly4P0VFBDqaaal7m1nhyYQwsygtaTpSsnc51sFPRrr9XIYtnD8ficon9fneEGEoJQ2g7OtASvhwX9EbK8g==", - "dependencies": { - "@firebase/analytics": "0.10.1", - "@firebase/analytics-types": "0.8.0", - "@firebase/component": "0.6.5", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/analytics-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", - "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" - }, - "node_modules/@firebase/app": { - "version": "0.9.28", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.28.tgz", - "integrity": "sha512-MS0+EtNixrwJbVDs5Bt/lhUhzeWGUtUoP6X+zYZck5GAZwI5g4F91noVA9oIXlFlpn6Q1xIbiaHA2GwGk7/7Ag==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", - "idb": "7.1.1", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/app-check": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.2.tgz", - "integrity": "sha512-A2B5+ldOguYAeqW1quFN5qNdruSNRrg4W59ag1Eq6QzxuHNIkrE+TrapfrW/z5NYFjCxAYqr/unVCgmk80Dwcg==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/app-check-compat": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.9.tgz", - "integrity": "sha512-7LxyupQ8XeEHRh72mO+tqm69kHT6KbWi2KtFMGedJ6tNbwzFzojcXESMKN8RpADXbYoQgY3loWMJjMx4r2Zt7w==", - "dependencies": { - "@firebase/app-check": "0.8.2", - "@firebase/app-check-types": "0.5.0", - "@firebase/component": "0.6.5", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", - "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" - }, - "node_modules/@firebase/app-check-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", - "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" - }, - "node_modules/@firebase/app-compat": { - "version": "0.2.28", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.28.tgz", - "integrity": "sha512-Mr2NbeM1Oaayuw5unUAMzt+7/MN+e2uklT1l87D+ZLJl2UvhZAZmMt74GjEI9N3sDYKMeszSbszBqtJ1fGVafQ==", - "dependencies": { - "@firebase/app": "0.9.28", - "@firebase/component": "0.6.5", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/app-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", - "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" - }, - "node_modules/@firebase/auth": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.6.1.tgz", - "integrity": "sha512-oOuQVOxtxKr+kTTqEkkI2qXIeGbkNLpA8FzO030LF4KXmMcETqsPaIqw7Aw1Y4Zl82l1qpZtpc4vN4Da2qZdfQ==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0", - "undici": "5.28.3" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^1.18.1" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/@firebase/auth-compat": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.3.tgz", - "integrity": "sha512-2pVtVEvu8P7SF6jSPfLPKWUClQFj+StqAZ0fD/uQ6mv8DyWn7AuuANFEu7Pv96JPcaL6Gy9jC5dFqjpptjqSRA==", - "dependencies": { - "@firebase/auth": "1.6.1", - "@firebase/auth-types": "0.12.0", - "@firebase/component": "0.6.5", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0", - "undici": "5.28.3" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", - "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" - }, - "node_modules/@firebase/auth-types": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", - "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/component": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.5.tgz", - "integrity": "sha512-2tVDk1ixi12sbDmmfITK8lxSjmcb73BMF6Qwc3U44hN/J1Fi1QY/Hnnb6klFlbB9/G16a3J3d4nXykye2EADTw==", - "dependencies": { - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.3.tgz", - "integrity": "sha512-9fjqLt9JzL46gw9+NRqsgQEMjgRwfd8XtzcKqG+UYyhVeFCdVRQ0Wp6Dw/dvYHnbH5vNEKzNv36dcB4p+PIAAA==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.0", - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.5", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.3.tgz", - "integrity": "sha512-7tHEOcMbK5jJzHWyphPux4osogH/adWwncxdMxdBpB9g1DNIyY4dcz1oJdlkXGM/i/AjUBesZsd5CuwTRTBNTw==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/database": "1.0.3", - "@firebase/database-types": "1.0.1", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-types": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.1.tgz", - "integrity": "sha512-Tmcmx5XgiI7UVF/4oGg2P3AOTfq3WKEPsm2yf+uXtN7uG/a4WTWhVMrXGYRY2ZUL1xPxv9V33wQRJ+CcrUhVXw==", - "dependencies": { - "@firebase/app-types": "0.9.0", - "@firebase/util": "1.9.4" - } - }, - "node_modules/@firebase/firestore": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.4.3.tgz", - "integrity": "sha512-Ix61zbeuTsHf0WFbk6+67n89Vzd9M8MMTdnz7c7z+BRE3BS5Vuc3gX5ZcHFjqPkQJ7rpLB1egHsYe4Przp5C2g==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", - "@firebase/webchannel-wrapper": "0.10.5", - "@grpc/grpc-js": "~1.9.0", - "@grpc/proto-loader": "^0.7.8", - "tslib": "^2.1.0", - "undici": "5.28.3" - }, - "engines": { - "node": ">=10.10.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/firestore-compat": { - "version": "0.3.26", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.26.tgz", - "integrity": "sha512-dNrKiH5Cn6ItANV9nJI2Y0msKBj/skO7skDlRo/BUSQE1DKbNzumxpJEz+PK/PV1nTegnRgVvs47gpQeVWXtYQ==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/firestore": "4.4.3", - "@firebase/firestore-types": "3.0.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/firestore-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", - "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/functions": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.2.tgz", - "integrity": "sha512-2NULTYOZbu0rXczwfYdqQH0w1FmmYrKjTy1YPQSHLCAkMBdfewoKmVm4Lyo2vRn0H9ZndciLY7NszKDFt9MKCQ==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.0", - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.5", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0", - "undici": "5.28.3" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/functions-compat": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.8.tgz", - "integrity": "sha512-VDHSw6UOu8RxfgAY/q8e+Jn+9Fh60Fc28yck0yfMsi2e0BiWgonIMWkFspFGGLgOJebTHl+hc+9v91rhzU6xlg==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/functions": "0.11.2", - "@firebase/functions-types": "0.6.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/functions-types": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", - "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" - }, - "node_modules/@firebase/installations": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.5.tgz", - "integrity": "sha512-0xxnQWw8rSRzu0ZOCkZaO+MJ0LkDAfwwTB2Z1SxRK6FAz5xkxD1ZUwM0WbCRni49PKubCrZYOJ6yg7tSjU7AKA==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/util": "1.9.4", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/installations-compat": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.5.tgz", - "integrity": "sha512-usvoIaog5CHEw082HXLrKAZ1qd4hIC3N/LDe2NqBgI3pkGE/7auLVM4Gn5gvyryp0x8z/IP1+d9fkGUj2OaGLQ==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/installations": "0.6.5", - "@firebase/installations-types": "0.5.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/installations-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", - "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", - "peerDependencies": { - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/logger": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", - "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/messaging": { - "version": "0.12.6", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.6.tgz", - "integrity": "sha512-IORsPp9IPWq4j4yEhTOZ6GAGi3gQwGc+4yexmTAlya+qeBRSdRnJg2iIU/aj+tcKDQYr9RQuQPgHHOdFIx//vA==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/installations": "0.6.5", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.4", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/messaging-compat": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.6.tgz", - "integrity": "sha512-Q2xC1s4L7Vpss7P7Gy6GuIS+xmJrf/vm9+gX76IK1Bo1TjoKwleCLHt1LHkPz5Rvqg5pTgzzI8qqPhBpZosFCg==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/messaging": "0.12.6", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/messaging-interop-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", - "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" - }, - "node_modules/@firebase/performance": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.5.tgz", - "integrity": "sha512-OzAGcWhOqEFH9GdwUuY0oC5FSlnMejcnmSAhR+EjpI7exdDvixyLyCR4txjSHYNTbumrFBG+EP8GO11CNXRaJA==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/installations": "0.6.5", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/performance-compat": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.5.tgz", - "integrity": "sha512-jJwJkVyDcIMBaVGrZ6CRGs4m5FCZsWB5QCWYI3FdsHyIa9/TfteNDilxj9wGciF2naFIHDW7TgE69U5dAH9Ktg==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/logger": "0.4.0", - "@firebase/performance": "0.6.5", - "@firebase/performance-types": "0.2.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/performance-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", - "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" - }, - "node_modules/@firebase/remote-config": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.5.tgz", - "integrity": "sha512-rGLqc/4OmxrS39RA9kgwa6JmgWytQuMo+B8pFhmGp3d++x2Hf9j+MLQfhOLyyUo64fNw20J19mLXhrXvKHsjZQ==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/installations": "0.6.5", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/remote-config-compat": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.5.tgz", - "integrity": "sha512-ImkNnLuGrD/bylBHDJigSY6LMwRrwt37wQbsGZhWG4QQ6KLzHzSf0nnFRRFvkOZodEUE57Ib8l74d6Yn/6TDUQ==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/logger": "0.4.0", - "@firebase/remote-config": "0.4.5", - "@firebase/remote-config-types": "0.3.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/remote-config-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", - "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" - }, - "node_modules/@firebase/storage": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.2.tgz", - "integrity": "sha512-MzanOBcxDx9oOwDaDPMuiYxd6CxcN1xZm+os5uNE3C1itbRKLhM9rzpODDKWzcbnHHFtXk3Q3lsK/d3Xa1WYYw==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0", - "undici": "5.28.3" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/storage-compat": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.5.tgz", - "integrity": "sha512-5dJXfY5NxCF5NAk4dLvJqC+m6cgcf0Fr29nrMHwhwI34pBheQq2PdRZqALsqZCES9dnHTuFNlqGQDpLr+Ph4rw==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/storage": "0.12.2", - "@firebase/storage-types": "0.8.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/storage-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", - "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/util": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.4.tgz", - "integrity": "sha512-WLonYmS1FGHT97TsUmRN3qnTh5TeeoJp1Gg5fithzuAgdZOUtsYECfy7/noQ3llaguios8r5BuXSEiK82+UrxQ==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/webchannel-wrapper": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.5.tgz", - "integrity": "sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg==" - }, - "node_modules/@grpc/grpc-js": { - "version": "1.9.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", - "integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==", - "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", - "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@ionic-native/core": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-5.36.0.tgz", - "integrity": "sha512-lOrkktadlKYbYf1LrDyAtsu1JnQ0oCCdkOU7iHQ8oXnNOkMwobFfD2m62F1CoOr0u9LIkpYnZSPjng8lZbmbNw==", - "peer": true, - "dependencies": { - "@types/cordova": "latest" - }, - "peerDependencies": { - "rxjs": "^5.5.0 || ^6.5.0" - } - }, - "node_modules/@ionic-native/printer": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/@ionic-native/printer/-/printer-5.36.0.tgz", - "integrity": "sha512-O4j+OWMEp09V13oZyTDcLS4tyVVf608mEr2vfvMZK+5pMnnW1H+5H9z6xBjj33sDAV/9r/91tFfwt0HgezdvhQ==", - "dependencies": { - "@types/cordova": "latest" - }, - "peerDependencies": { - "@ionic-native/core": "^5.1.0", - "rxjs": "^5.5.0 || ^6.5.0" - } - }, - "node_modules/@ionic/cli-framework-output": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", - "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", - "dev": true, - "dependencies": { - "@ionic/utils-terminal": "2.3.5", - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/core": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-7.7.1.tgz", - "integrity": "sha512-Su4VFwztN8vKyHsIgHMmzQ1ZrIajNzMR7hg2fcv15Y2yrzLpK06PcUf9QutBM9KyP0wQIngwfnO68vrAnqR+xQ==", - "dependencies": { - "@stencil/core": "^4.12.0", - "ionicons": "^7.2.2", - "tslib": "^2.1.0" - } - }, - "node_modules/@ionic/react": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-7.7.1.tgz", - "integrity": "sha512-rfTUAUSqVMzg+R1CEMclSOLwXByJ06qtRXhpyVvJetQFUUVHA8inHdULTJqKN10c0XeZr+WyapGX04IktB9WfQ==", - "dependencies": { - "@ionic/core": "7.7.1", - "ionicons": "^7.0.0", - "tslib": "*" - }, - "peerDependencies": { - "react": ">=16.8.6", - "react-dom": ">=16.8.6" - } - }, - "node_modules/@ionic/react-router": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@ionic/react-router/-/react-router-7.7.1.tgz", - "integrity": "sha512-xmCI1+3PBc7pPjFyI6ABgGferD7KvyPu8tVgT9Q3qwDzVyN+zVsqjPyRCqYUsIuDRcteRQfIkC3677rn8VrpQg==", - "dependencies": { - "@ionic/react": "7.7.1", - "tslib": "*" - }, - "peerDependencies": { - "react": ">=16.8.6", - "react-dom": ">=16.8.6", - "react-router": "^5.0.1", - "react-router-dom": "^5.0.1" - } - }, - "node_modules/@ionic/utils-array": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", - "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", - "dev": true, - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-fs": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", - "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", - "dev": true, - "dependencies": { - "@types/fs-extra": "^8.0.0", - "debug": "^4.0.0", - "fs-extra": "^9.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-object": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", - "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", - "dev": true, - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-process": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.11.tgz", - "integrity": "sha512-Uavxn+x8j3rDlZEk1X7YnaN6wCgbCwYQOeIjv/m94i1dzslqWhqIHEqxEyeE8HsT5Negboagg7GtQiABy+BLbA==", - "dev": true, - "dependencies": { - "@ionic/utils-object": "2.1.6", - "@ionic/utils-terminal": "2.3.4", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "tree-kill": "^1.2.2", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-process/node_modules/@ionic/utils-terminal": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.4.tgz", - "integrity": "sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==", - "dev": true, - "dependencies": { - "@types/slice-ansi": "^4.0.0", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "slice-ansi": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "tslib": "^2.0.1", - "untildify": "^4.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-process/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/@ionic/utils-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.6.tgz", - "integrity": "sha512-4+Kitey1lTA1yGtnigeYNhV/0tggI3lWBMjC7tBs1K9GXa/q7q4CtOISppdh8QgtOhrhAXS2Igp8rbko/Cj+lA==", - "dev": true, - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-subprocess": { - "version": "2.1.14", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.14.tgz", - "integrity": "sha512-nGYvyGVjU0kjPUcSRFr4ROTraT3w/7r502f5QJEsMRKTqa4eEzCshtwRk+/mpASm0kgBN5rrjYA5A/OZg8ahqg==", - "dev": true, - "dependencies": { - "@ionic/utils-array": "2.1.6", - "@ionic/utils-fs": "3.1.7", - "@ionic/utils-process": "2.1.11", - "@ionic/utils-stream": "3.1.6", - "@ionic/utils-terminal": "2.3.4", - "cross-spawn": "^7.0.3", - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-terminal": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.4.tgz", - "integrity": "sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==", - "dev": true, - "dependencies": { - "@types/slice-ansi": "^4.0.0", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "slice-ansi": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "tslib": "^2.0.1", - "untildify": "^4.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-subprocess/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/@ionic/utils-terminal": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", - "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", - "dev": true, - "dependencies": { - "@types/slice-ansi": "^4.0.0", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "slice-ansi": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "tslib": "^2.0.1", - "untildify": "^4.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-terminal/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@originjs/vite-plugin-commonjs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@originjs/vite-plugin-commonjs/-/vite-plugin-commonjs-1.0.3.tgz", - "integrity": "sha512-KuEXeGPptM2lyxdIEJ4R11+5ztipHoE7hy8ClZt3PYaOVQ/pyngd2alaSrPnwyFeOW1UagRBaQ752aA1dTMdOQ==", - "dev": true, - "dependencies": { - "esbuild": "^0.14.14" - } - }, - "node_modules/@originjs/vite-plugin-commonjs/node_modules/@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@originjs/vite-plugin-commonjs/node_modules/esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.10.0.tgz", - "integrity": "sha512-/MeDQmcD96nVoRumKUljsYOLqfv1YFJps+0pTrb2Z9Nl/w5qNUysMaWQsrd1mvAlNT4yza1iVyIu4Q4AgF6V3A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.10.0.tgz", - "integrity": "sha512-lvu0jK97mZDJdpZKDnZI93I0Om8lSDaiPx3OiCk0RXn3E8CMPJNS/wxjAvSJJzhhZpfjXsjLWL8LnS6qET4VNQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.10.0.tgz", - "integrity": "sha512-uFpayx8I8tyOvDkD7X6n0PriDRWxcqEjqgtlxnUA/G9oS93ur9aZ8c8BEpzFmsed1TH5WZNG5IONB8IiW90TQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.10.0.tgz", - "integrity": "sha512-nIdCX03qFKoR/MwQegQBK+qZoSpO3LESurVAC6s6jazLA1Mpmgzo3Nj3H1vydXp/JM29bkCiuF7tDuToj4+U9Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.10.0.tgz", - "integrity": "sha512-Fz7a+y5sYhYZMQFRkOyCs4PLhICAnxRX/GnWYReaAoruUzuRtcf+Qnw+T0CoAWbHCuz2gBUwmWnUgQ67fb3FYw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.10.0.tgz", - "integrity": "sha512-yPtF9jIix88orwfTi0lJiqINnlWo6p93MtZEoaehZnmCzEmLL0eqjA3eGVeyQhMtxdV+Mlsgfwhh0+M/k1/V7Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.10.0.tgz", - "integrity": "sha512-9GW9yA30ib+vfFiwjX+N7PnjTnCMiUffhWj4vkG4ukYv1kJ4T9gHNg8zw+ChsOccM27G9yXrEtMScf1LaCuoWQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.10.0.tgz", - "integrity": "sha512-X1ES+V4bMq2ws5fF4zHornxebNxMXye0ZZjUrzOrf7UMx1d6wMQtfcchZ8SqUnQPPHdOyOLW6fTcUiFgHFadRA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.10.0.tgz", - "integrity": "sha512-w/5OpT2EnI/Xvypw4FIhV34jmNqU5PZjZue2l2Y3ty1Ootm3SqhI+AmfhlUYGBTd9JnpneZCDnt3uNOiOBkMyw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.10.0.tgz", - "integrity": "sha512-q/meftEe3QlwQiGYxD9rWwB21DoKQ9Q8wA40of/of6yGHhZuGfZO0c3WYkN9dNlopHlNT3mf5BPsUSxoPuVQaw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.10.0.tgz", - "integrity": "sha512-NrR6667wlUfP0BHaEIKgYM/2va+Oj+RjZSASbBMnszM9k+1AmliRjHc3lJIiOehtSSjqYiO7R6KLNrWOX+YNSQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.10.0.tgz", - "integrity": "sha512-FV0Tpt84LPYDduIDcXvEC7HKtyXxdvhdAOvOeWMWbQNulxViH2O07QXkT/FffX4FqEI02jEbCJbr+YcuKdyyMg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.10.0.tgz", - "integrity": "sha512-OZoJd+o5TaTSQeFFQ6WjFCiltiYVjIdsXxwu/XZ8qRpsvMQr4UsVrE5UyT9RIvsnuF47DqkJKhhVZ2Q9YW9IpQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@stencil/core": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.12.1.tgz", - "integrity": "sha512-l7UUCEV+4Yr1i6BL2DGSQPAzM3x/V4Fx9n9Z0/gdAgX11I25xY0MnH5jbQ69ug6ms/8KUV6SouS1R7MjjM/JnQ==", - "bin": { - "stencil": "bin/stencil" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.10.0" - } - }, - "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "dev": true, - "dependencies": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", - "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", - "dev": true, - "dependencies": { - "@adobe/css-tools": "^4.0.1", - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=8", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/react": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.2.1.tgz", - "integrity": "sha512-sGdjws32ai5TLerhvzThYFbpnF9XtL65Cjf+gB0Dhr29BGqK+mAeN7SURSdu+eqgET4ANcWoC7FQpkaiGvBr+A==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^9.0.0", - "@types/react-dom": "^18.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@testing-library/user-event": { - "version": "14.5.2", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", - "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", - "dev": true, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/chai": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", - "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", - "dev": true - }, - "node_modules/@types/chai-subset": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.5.tgz", - "integrity": "sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==", - "dev": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/cordova": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-11.0.3.tgz", - "integrity": "sha512-kyuRQ40/NWQVhqGIHq78Ehu2Bf9Mlg0LhmSmis6ZFJK7z933FRfYi8tHe/k/0fB+PGfCf95rJC6TO7dopaFvAg==" - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/fs-extra": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", - "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jest/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@types/jest/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.11.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.17.tgz", - "integrity": "sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" - }, - "node_modules/@types/react": { - "version": "18.2.55", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.55.tgz", - "integrity": "sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", - "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", - "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", - "dev": true - }, - "node_modules/@types/sizzle": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", - "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==", - "dev": true - }, - "node_modules/@types/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.9", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", - "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", - "dev": true, - "dependencies": { - "@types/jest": "*" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vite-pwa/assets-generator": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@vite-pwa/assets-generator/-/assets-generator-0.2.4.tgz", - "integrity": "sha512-DXyPLPR/IpbZPSpo1amZEPghY/ziIwpTUKNaz0v1xG+ELzCXmrVQhVzEMqr2JLSqRxjc+UzKfGJA/YdUuaao3w==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "colorette": "^2.0.20", - "consola": "^3.2.3", - "sharp": "^0.32.6", - "sharp-ico": "^0.1.5", - "unconfig": "^0.3.11" - }, - "bin": { - "pwa-assets-generator": "bin/pwa-assets-generator.mjs" - }, - "engines": { - "node": ">=16.14.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vitejs/plugin-legacy": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-5.3.0.tgz", - "integrity": "sha512-BhW+WcJmEgW5G/1UQRiVQ7wz9/ZPnxqzExT9n0zAk4RlqQQ/26udIeXzdU8+03AGnaF61wmZlCspexgEnxFWMA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.7", - "@babel/preset-env": "^7.23.8", - "browserslist": "^4.22.2", - "core-js": "^3.35.0", - "esbuild-plugin-browserslist": "^0.10.0", - "magic-string": "^0.30.5", - "regenerator-runtime": "^0.14.1", - "systemjs": "^6.14.3" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "peerDependencies": { - "terser": "^5.4.0", - "vite": "^5.0.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" - } - }, - "node_modules/@vitest/expect": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz", - "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==", - "dev": true, - "dependencies": { - "@vitest/spy": "0.34.6", - "@vitest/utils": "0.34.6", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz", - "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==", - "dev": true, - "dependencies": { - "@vitest/utils": "0.34.6", - "p-limit": "^4.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/snapshot": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz", - "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==", - "dev": true, - "dependencies": { - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vitest/snapshot/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@vitest/snapshot/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/@vitest/spy": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz", - "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==", - "dev": true, - "dependencies": { - "tinyspy": "^2.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz", - "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==", - "dev": true, - "dependencies": { - "diff-sequences": "^29.4.3", - "loupe": "^2.3.6", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vitest/utils/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@vitest/utils/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, - "node_modules/b4a": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", - "dev": true - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", - "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0", - "core-js-compat": "^3.34.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/bare-events": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.0.tgz", - "integrity": "sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==", - "dev": true, - "optional": true - }, - "node_modules/bare-fs": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.2.0.tgz", - "integrity": "sha512-+VhW202E9eTVGkX7p+TNXtZC4RTzj9JfJW7PtfIbZ7mIQ/QT9uOafQTx7lx2n9ERmWsXvLHF4hStAFn4gl2mQw==", - "dev": true, - "optional": true, - "dependencies": { - "bare-events": "^2.0.0", - "bare-os": "^2.0.0", - "bare-path": "^2.0.0", - "streamx": "^2.13.0" - } - }, - "node_modules/bare-os": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.2.0.tgz", - "integrity": "sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==", - "dev": true, - "optional": true - }, - "node_modules/bare-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.0.tgz", - "integrity": "sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==", - "dev": true, - "optional": true, - "dependencies": { - "bare-os": "^2.1.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/blob-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", - "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", - "dev": true - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "dev": true, - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cachedir": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", - "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/call-bind": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz", - "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "set-function-length": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001585", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz", - "integrity": "sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/capacitor-email-composer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/capacitor-email-composer/-/capacitor-email-composer-5.0.0.tgz", - "integrity": "sha512-00TTahQg6BPcUfqoC5BTtP56jQ3fVvV1qQbjTKC8bfcUTO/ARWI6ka/clAZRXa27ZvwqO2cnRsTwyLTiHipgEA==", - "peerDependencies": { - "@capacitor/core": "^5.0.0" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dev": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/core-js": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.1.tgz", - "integrity": "sha512-IgdsbxNyMskrTFxa9lWHyMwAJU5gXOPP+1yO+K59d50VLVAIDAbs7gIv705KzALModfK3ZrSZTPNpC0PQgIZuw==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", - "dev": true, - "dependencies": { - "browserslist": "^4.22.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", - "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", - "dev": true, - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/cypress": { - "version": "13.6.4", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.6.4.tgz", - "integrity": "sha512-pYJjCfDYB+hoOoZuhysbbYhEmNW7DEDsqn+ToCLwuVowxUXppIWRr7qk4TVRIU471ksfzyZcH+mkoF0CQUKnpw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@cypress/request": "^3.0.0", - "@cypress/xvfb": "^1.2.4", - "@types/sinonjs__fake-timers": "8.1.1", - "@types/sizzle": "^2.3.2", - "arch": "^2.2.0", - "blob-util": "^2.0.2", - "bluebird": "^3.7.2", - "buffer": "^5.6.0", - "cachedir": "^2.3.0", - "chalk": "^4.1.0", - "check-more-types": "^2.24.0", - "cli-cursor": "^3.1.0", - "cli-table3": "~0.6.1", - "commander": "^6.2.1", - "common-tags": "^1.8.0", - "dayjs": "^1.10.4", - "debug": "^4.3.4", - "enquirer": "^2.3.6", - "eventemitter2": "6.4.7", - "execa": "4.1.0", - "executable": "^4.1.1", - "extract-zip": "2.0.1", - "figures": "^3.2.0", - "fs-extra": "^9.1.0", - "getos": "^3.2.1", - "is-ci": "^3.0.0", - "is-installed-globally": "~0.4.0", - "lazy-ass": "^1.6.0", - "listr2": "^3.8.3", - "lodash": "^4.17.21", - "log-symbols": "^4.0.0", - "minimist": "^1.2.8", - "ospath": "^1.2.2", - "pretty-bytes": "^5.6.0", - "process": "^0.11.10", - "proxy-from-env": "1.0.0", - "request-progress": "^3.0.0", - "semver": "^7.5.3", - "supports-color": "^8.1.1", - "tmp": "~0.2.1", - "untildify": "^4.0.0", - "yauzl": "^2.10.0" - }, - "bin": { - "cypress": "bin/cypress" - }, - "engines": { - "node": "^16.0.0 || ^18.0.0 || >=20.0.0" - } - }, - "node_modules/cypress/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cypress/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cypress/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/cypress/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-urls": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", - "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "node_modules/decode-bmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/decode-bmp/-/decode-bmp-0.2.1.tgz", - "integrity": "sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA==", - "dev": true, - "dependencies": { - "@canvas/image-data": "^1.0.0", - "to-data-view": "^1.1.0" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/decode-ico": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/decode-ico/-/decode-ico-0.4.1.tgz", - "integrity": "sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA==", - "dev": true, - "dependencies": { - "@canvas/image-data": "^1.0.0", - "decode-bmp": "^0.2.0", - "to-data-view": "^1.1.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz", - "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.2", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.665", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.665.tgz", - "integrity": "sha512-UpyCWObBoD+nSZgOC2ToaIdZB0r9GhqT2WahPKiSki6ckkSuKhQNso8V2PrFcHBMleI/eqbKgVQgVC4Wni4ilw==", - "dev": true - }, - "node_modules/elementtree": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", - "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", - "dev": true, - "dependencies": { - "sax": "1.1.4" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.16.tgz", - "integrity": "sha512-CREG2A9Vq7bpDRnldhFcMKuKArvkZtsH6Y0DHOHVg49qhf+LD8uEdUM3OkOAICv0EziGtDEnQtqY2/mfBILpFw==", - "dev": true, - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.1", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-plugin-browserslist": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/esbuild-plugin-browserslist/-/esbuild-plugin-browserslist-0.10.0.tgz", - "integrity": "sha512-rZWFcp3l+73xDiJB+Vl9UqP1VVs+L4E0lygbwJl6UTmW2qQago7DLT56hBu0vocH/TtZsAcRHj0+qHqkkB5Gww==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "zod": "^3.21.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "browserslist": "^4.21.8", - "esbuild": "~0.19.2" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter2": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", - "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", - "dev": true - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, - "dependencies": { - "pify": "^2.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/firebase": { - "version": "10.8.1", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.8.1.tgz", - "integrity": "sha512-4B2jzhU/aumfKL446MG41/T5+t+9d9urf5XGrjC0HRQUm4Ya/amV48HBchnje69ExaJP5f2WxO9OX3wh9ee4wA==", - "dependencies": { - "@firebase/analytics": "0.10.1", - "@firebase/analytics-compat": "0.2.7", - "@firebase/app": "0.9.28", - "@firebase/app-check": "0.8.2", - "@firebase/app-check-compat": "0.3.9", - "@firebase/app-compat": "0.2.28", - "@firebase/app-types": "0.9.0", - "@firebase/auth": "1.6.1", - "@firebase/auth-compat": "0.5.3", - "@firebase/database": "1.0.3", - "@firebase/database-compat": "1.0.3", - "@firebase/firestore": "4.4.3", - "@firebase/firestore-compat": "0.3.26", - "@firebase/functions": "0.11.2", - "@firebase/functions-compat": "0.3.8", - "@firebase/installations": "0.6.5", - "@firebase/installations-compat": "0.2.5", - "@firebase/messaging": "0.12.6", - "@firebase/messaging-compat": "0.2.6", - "@firebase/performance": "0.6.5", - "@firebase/performance-compat": "0.2.5", - "@firebase/remote-config": "0.4.5", - "@firebase/remote-config-compat": "0.2.5", - "@firebase/storage": "0.12.2", - "@firebase/storage-compat": "0.3.5", - "@firebase/util": "1.9.4" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dev": true, - "dependencies": { - "async": "^3.2.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.14.1" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/ico-endec": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ico-endec/-/ico-endec-0.1.6.tgz", - "integrity": "sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ==", - "dev": true - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ionicons": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.2.2.tgz", - "integrity": "sha512-I3iYIfc9Q9FRifWyFSwTAvbEABWlWY32i0sAVDDPGYnaIZVugkLCZFbEcrphW6ixVPg8tt1oLwalo/JJwbEqnA==", - "dependencies": { - "@stencil/core": "^4.0.3" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "node_modules/jsdom": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", - "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "cssstyle": "^3.0.0", - "data-urls": "^4.0.0", - "decimal.js": "^10.4.3", - "domexception": "^4.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.4", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.1", - "ws": "^8.13.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true, - "engines": { - "node": "> 0.8" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/listr2": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", - "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.1", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "node_modules/mlly": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", - "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", - "dev": true, - "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, - "node_modules/native-run": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.1.tgz", - "integrity": "sha512-XfG1FBZLM50J10xH9361whJRC9SHZ0Bub4iNRhhI61C8Jv0e1ud19muex6sNKB51ibQNUJNuYn25MuYET/rE6w==", - "dev": true, - "dependencies": { - "@ionic/utils-fs": "^3.1.7", - "@ionic/utils-terminal": "^2.3.4", - "bplist-parser": "^0.3.2", - "debug": "^4.3.4", - "elementtree": "^0.1.7", - "ini": "^4.1.1", - "plist": "^3.1.0", - "split2": "^4.2.0", - "through2": "^4.0.2", - "tslib": "^2.6.2", - "yauzl": "^2.10.0" - }, - "bin": { - "native-run": "bin/native-run" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/native-run/node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-abi": { - "version": "3.56.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.56.0.tgz", - "integrity": "sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "dev": true - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", - "dev": true - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prompts/node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/protobufjs": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", - "dev": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.10.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", - "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", - "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0", - "get-intrinsic": "^1.2.3", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "dev": true, - "dependencies": { - "throttleit": "^1.0.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.10.0.tgz", - "integrity": "sha512-t2v9G2AKxcQ8yrG+WGxctBes1AomT0M4ND7jTFBCVPXQ/WFTvNSefIrNSmLKhIKBrvN8SG+CZslimJcT3W2u2g==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.10.0", - "@rollup/rollup-android-arm64": "4.10.0", - "@rollup/rollup-darwin-arm64": "4.10.0", - "@rollup/rollup-darwin-x64": "4.10.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.10.0", - "@rollup/rollup-linux-arm64-gnu": "4.10.0", - "@rollup/rollup-linux-arm64-musl": "4.10.0", - "@rollup/rollup-linux-riscv64-gnu": "4.10.0", - "@rollup/rollup-linux-x64-gnu": "4.10.0", - "@rollup/rollup-linux-x64-musl": "4.10.0", - "@rollup/rollup-win32-arm64-msvc": "4.10.0", - "@rollup/rollup-win32-ia32-msvc": "4.10.0", - "@rollup/rollup-win32-x64-msvc": "4.10.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "dev": true - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "peer": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "peer": true - }, - "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sax": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", - "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", - "dev": true - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.2", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/sharp-ico": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/sharp-ico/-/sharp-ico-0.1.5.tgz", - "integrity": "sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q==", - "dev": true, - "dependencies": { - "decode-ico": "*", - "ico-endec": "*", - "sharp": "*" - } - }, - "node_modules/sharp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sharp/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sharp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", - "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "dev": true, - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/streamx": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz", - "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==", - "dev": true, - "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", - "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", - "dev": true, - "dependencies": { - "acorn": "^8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/systemjs": { - "version": "6.14.3", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.14.3.tgz", - "integrity": "sha512-hQv45irdhXudAOr8r6SVSpJSGtogdGZUbJBRKCE5nsIS7tsxxvnIHqT4IOPWj+P+HcSzeWzHlGCGpmhPDIKe+w==", - "dev": true - }, - "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-fs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", - "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", - "dev": true, - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/throttleit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", - "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/tinybench": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", - "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", - "dev": true - }, - "node_modules/tinypool": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", - "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/to-data-view": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", - "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "dev": true, - "dependencies": { - "punycode": "^2.3.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz", - "integrity": "sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", - "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", - "dev": true - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unconfig": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.3.11.tgz", - "integrity": "sha512-bV/nqePAKv71v3HdVUn6UefbsDKQWRX+bJIkiSm0+twIds6WiD2bJLWWT3i214+J/B4edufZpG2w7Y63Vbwxow==", - "dev": true, - "dependencies": { - "@antfu/utils": "^0.7.6", - "defu": "^6.1.2", - "jiti": "^1.20.0", - "mlly": "^1.4.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/undici": { - "version": "5.28.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", - "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/vite": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.1.tgz", - "integrity": "sha512-wclpAgY3F1tR7t9LL5CcHC41YPkQIpKUGeIuT8MdNwNZr6OqOTLs7JX5vIHAtzqLWXts0T+GDrh9pN2arneKqg==", - "dev": true, - "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz", - "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.4.0", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-commonjs": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/vite-plugin-commonjs/-/vite-plugin-commonjs-0.10.1.tgz", - "integrity": "sha512-taP8R9kYGlCW5OzkVR0UIWRCnG6rSxeWWuA7tnU5b9t5MniibOnDY219NhisTeDhJAeGT8cEnrhVWZ9A5yD+vg==", - "dependencies": { - "acorn": "^8.8.2", - "fast-glob": "^3.2.12", - "magic-string": "^0.30.1", - "vite-plugin-dynamic-import": "^1.5.0" - } - }, - "node_modules/vite-plugin-dynamic-import": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/vite-plugin-dynamic-import/-/vite-plugin-dynamic-import-1.5.0.tgz", - "integrity": "sha512-Qp85c+AVJmLa8MLni74U4BDiWpUeFNx7NJqbGZyR2XJOU7mgW0cb7nwlAMucFyM4arEd92Nfxp4j44xPi6Fu7g==", - "dependencies": { - "acorn": "^8.8.2", - "es-module-lexer": "^1.2.1", - "fast-glob": "^3.2.12", - "magic-string": "^0.30.1" - } - }, - "node_modules/vite-plugin-pwa": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.19.0.tgz", - "integrity": "sha512-Unfb4Jk/ka4HELtpMLIPCmGcW4LFT+CL7Ri1/Of1544CVKXS2ftP91kUkNzkzeI1sGpOdVGuxprVLB9NjMoCAA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "pretty-bytes": "^6.1.1", - "workbox-build": "^7.0.0", - "workbox-window": "^7.0.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vite-pwa/assets-generator": "^0.2.4", - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0", - "workbox-build": "^7.0.0", - "workbox-window": "^7.0.0" - }, - "peerDependenciesMeta": { - "@vite-pwa/assets-generator": { - "optional": true - } - } - }, - "node_modules/vite-plugin-pwa/node_modules/pretty-bytes": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", - "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", - "dev": true, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz", - "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==", - "dev": true, - "dependencies": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.34.6", - "@vitest/runner": "0.34.6", - "@vitest/snapshot": "0.34.6", - "@vitest/spy": "0.34.6", - "@vitest/utils": "0.34.6", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.10", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.7.0", - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", - "vite-node": "0.34.6", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", - "happy-dom": "*", - "jsdom": "*", - "playwright": "*", - "safaridriver": "*", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } - } - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", - "dev": true, - "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/workbox-background-sync": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.0.0.tgz", - "integrity": "sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==", - "dev": true, - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "7.0.0" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.0.0.tgz", - "integrity": "sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==", - "dev": true, - "dependencies": { - "workbox-core": "7.0.0" - } - }, - "node_modules/workbox-build": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.0.0.tgz", - "integrity": "sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==", - "dev": true, - "dependencies": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "7.0.0", - "workbox-broadcast-update": "7.0.0", - "workbox-cacheable-response": "7.0.0", - "workbox-core": "7.0.0", - "workbox-expiration": "7.0.0", - "workbox-google-analytics": "7.0.0", - "workbox-navigation-preload": "7.0.0", - "workbox-precaching": "7.0.0", - "workbox-range-requests": "7.0.0", - "workbox-recipes": "7.0.0", - "workbox-routing": "7.0.0", - "workbox-strategies": "7.0.0", - "workbox-streams": "7.0.0", - "workbox-sw": "7.0.0", - "workbox-window": "7.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "dev": true, - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "node_modules/workbox-build/node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } - } - }, - "node_modules/workbox-build/node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/workbox-build/node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/workbox-build/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/workbox-build/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/workbox-build/node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/workbox-build/node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/workbox-build/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "node_modules/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/workbox-cacheable-response": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.0.0.tgz", - "integrity": "sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==", - "dev": true, - "dependencies": { - "workbox-core": "7.0.0" - } - }, - "node_modules/workbox-core": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.0.0.tgz", - "integrity": "sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==", - "dev": true - }, - "node_modules/workbox-expiration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.0.0.tgz", - "integrity": "sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==", - "dev": true, - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "7.0.0" - } - }, - "node_modules/workbox-google-analytics": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.0.0.tgz", - "integrity": "sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==", - "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", - "dev": true, - "dependencies": { - "workbox-background-sync": "7.0.0", - "workbox-core": "7.0.0", - "workbox-routing": "7.0.0", - "workbox-strategies": "7.0.0" - } - }, - "node_modules/workbox-navigation-preload": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.0.0.tgz", - "integrity": "sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==", - "dev": true, - "dependencies": { - "workbox-core": "7.0.0" - } - }, - "node_modules/workbox-precaching": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.0.0.tgz", - "integrity": "sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==", - "dev": true, - "dependencies": { - "workbox-core": "7.0.0", - "workbox-routing": "7.0.0", - "workbox-strategies": "7.0.0" - } - }, - "node_modules/workbox-range-requests": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.0.0.tgz", - "integrity": "sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==", - "dev": true, - "dependencies": { - "workbox-core": "7.0.0" - } - }, - "node_modules/workbox-recipes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.0.0.tgz", - "integrity": "sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==", - "dev": true, - "dependencies": { - "workbox-cacheable-response": "7.0.0", - "workbox-core": "7.0.0", - "workbox-expiration": "7.0.0", - "workbox-precaching": "7.0.0", - "workbox-routing": "7.0.0", - "workbox-strategies": "7.0.0" - } - }, - "node_modules/workbox-routing": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.0.0.tgz", - "integrity": "sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==", - "dev": true, - "dependencies": { - "workbox-core": "7.0.0" - } - }, - "node_modules/workbox-strategies": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.0.0.tgz", - "integrity": "sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==", - "dev": true, - "dependencies": { - "workbox-core": "7.0.0" - } - }, - "node_modules/workbox-streams": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.0.0.tgz", - "integrity": "sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==", - "dev": true, - "dependencies": { - "workbox-core": "7.0.0", - "workbox-routing": "7.0.0" - } - }, - "node_modules/workbox-sw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.0.0.tgz", - "integrity": "sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==", - "dev": true - }, - "node_modules/workbox-window": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.0.0.tgz", - "integrity": "sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==", - "dev": true, - "dependencies": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "7.0.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "src/components/socialcalc": { - "version": "1.0.0", - "extraneous": true, - "license": "MIT" - } - } -} diff --git a/Govt-Billing-React-Ad-Subscriptions/package.json b/Govt-Billing-React-Ad-Subscriptions/package.json deleted file mode 100644 index 8950458..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "GovtInvoiceNew", - "private": true, - "version": "0.0.1", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview", - "test.e2e": "cypress run", - "test.unit": "vitest", - "lint": "eslint", - "generate-pwa-assets": "pwa-assets-generator" - }, - "dependencies": { - "@capacitor-community/admob": "^6.0.0", - "@capacitor/android": "5.7.0", - "@capacitor/app": "5.0.7", - "@capacitor/core": "5.7.0", - "@capacitor/haptics": "5.0.7", - "@capacitor/ios": "5.7.0", - "@capacitor/keyboard": "5.0.8", - "@capacitor/preferences": "^5.0.7", - "@capacitor/status-bar": "5.0.7", - "@ionic-native/printer": "^5.36.0", - "@ionic/react": "^7.0.0", - "@ionic/react-router": "^7.0.0", - "@types/react-router": "^5.1.20", - "@types/react-router-dom": "^5.3.3", - "capacitor-email-composer": "^5.0.0", - "firebase": "^10.8.1", - "ionicons": "^7.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router": "^5.3.4", - "react-router-dom": "^5.3.4", - "vite-plugin-commonjs": "^0.10.1" - }, - "devDependencies": { - "@capacitor/cli": "^5.7.0", - "@originjs/vite-plugin-commonjs": "^1.0.3", - "@testing-library/dom": ">=7.21.4", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^14.0.0", - "@testing-library/user-event": "^14.4.3", - "@types/react": "^18.0.27", - "@types/react-dom": "^18.0.10", - "@vite-pwa/assets-generator": "^0.2.4", - "@vitejs/plugin-legacy": "^5.0.0", - "@vitejs/plugin-react": "^4.0.1", - "cypress": "^13.5.0", - "eslint": "^8.35.0", - "eslint-plugin-react": "^7.32.2", - "jsdom": "^22.1.0", - "terser": "^5.4.0", - "typescript": "^5.1.6", - "vite": "^5.0.0", - "vite-plugin-pwa": "^0.19.0", - "vitest": "^0.34.6" - }, - "description": "An Ionic project" -} diff --git a/Govt-Billing-React-Ad-Subscriptions/public/SocialCalc.js b/Govt-Billing-React-Ad-Subscriptions/public/SocialCalc.js deleted file mode 100644 index 0a5fd4f..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/public/SocialCalc.js +++ /dev/null @@ -1,32423 +0,0 @@ -/* eslint-disable */ -// Taken from https://github.com/umdjs/umd/blob/master/templates/returnExports.js -// (c) by The UMD contributors -// MIT License: https://github.com/umdjs/umd/blob/master/LICENSE.md -(function (root, factory) { - if (typeof define === "function" && define.amd) { - // AMD. Register as an anonymous module. - define([], function () { - return (root.SocialCalc = factory.call(root, root)); - }); - } else if (typeof module === "object" && module.exports) { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = root.SocialCalc = factory.call(root, root); - } else { - // Browser globals (root is window) - root.SocialCalc = factory.call(root, root); - } -})(typeof self !== "undefined" ? self : this, function (window) { - // console.log(root) - // console.log(window) - var window = this; - var SocialCalc = {}; - - // - /* -// The module of the SocialCalc package with customizable constants, strings, etc. -// This is where most of the common localizations are done. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - // - /* -// The module of the SocialCalc package with customizable constants, strings, etc. -// This is where most of the common localizations are done. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; - - // ************************************* - // - // TO LEARN HOW TO LOCALIZE OR CUSTOMIZE SOCIALCALC, PLEASE READ THIS: - // - // The constants are all properties of the SocialCalc.Constants object. - // They are grouped here by what they are for, which module uses them, etc. - // - // Properties whose names start with "s_" are strings, or arrays of strings, - // that are good candidates for translation from the English. - // - // Other properties relate to visual settings, localization parameters, etc. - // - // These values are not used when SocialCalc modules are first loaded. - // They may be modified before the first use of the routines that use them, - // e.g., before creating SocialCalc objects. - // - // The exceptions are: - // TooltipOffsetX and TooltipOffsetY, as described with their definitions. - // - // SocialCalc IS NOT DESIGNED FOR USE WITH A TRANSLATION FUNCTION each time a string - // is used. Instead, language translations may be done by modifying this object. - // - // To customize SocialCalc, you may either replace this file with a modified version - // or you can overwrite the values before use. An example would be to - // iterate over all the properties looking for names that start with "s_" and - // use some other mechanism to obtain a localized string and replace the values - // here with those translated values. - // - // There is also a function, SocialCalc.ConstantsSetClasses, that may be used - // to easily switch SocialCalc from using explicit CSS styles for many things - // to using CSS classes. See the function, below, for more information. - // - // ************************************* - - SocialCalc.Constants = { - // - // Main SocialCalc module, socialcalc-3.js: - // - - //*** Common Constants - - textdatadefaulttype: "t", // This sets the default type for text on reading source file - // It should normally be "t" - - //*** Common error messages - - s_BrowserNotSupported: "Browser not supported.", // error thrown if browser can't handle events like IE or Firefox. - s_InternalError: "Internal SocialCalc error (probably an internal bug): ", // hopefully unlikely, but a test failed - - //*** SocialCalc.ParseSheetSave - - // Errors thrown on unexpected value in save file: - - s_pssUnknownColType: "Unknown col type item", - s_pssUnknownRowType: "Unknown row type item", - s_pssUnknownLineType: "Unknown line type", - - //*** SocialCalc.CellFromStringParts - - // Error thrown on unexpected value in save file: - - s_cfspUnknownCellType: "Unknown cell type item", - - //*** SocialCalc.CanonicalizeSheet - - doCanonicalizeSheet: true, // if true, do the canonicalization calculations - - //*** ExecuteSheetCommand - - s_escUnknownSheetCmd: "Unknown sheet command: ", - s_escUnknownSetCoordCmd: "Unknown set coord command: ", - s_escUnknownCmd: "Unknown command: ", - - //*** SocialCalc.CheckAndCalcCell - - s_caccCircRef: "Circular reference to ", // circular reference found during recalc - - //*** SocialCalc.RenderContext - - defaultRowNameWidth: "30", // used to set minimum width of the row header column - a string in pixels - defaultAssumedRowHeight: 15, // used when guessing row heights - number - defaultCellIDPrefix: "cell_", // if non-null, each cell will render with an ID starting with this - - // Default sheet display values - - defaultCellLayout: "padding:2px 2px 1px 2px;vertical-align:top;", - defaultCellFontStyle: "normal normal", - defaultCellFontSize: "small", - defaultCellFontFamily: "Verdana,Arial,Helvetica,sans-serif", - - defaultPaneDividerWidth: "2", // a string - defaultPaneDividerHeight: "3", // a string - - defaultGridCSS: "1px solid #C0C0C0;", // used as style to set each border when grid enabled (was #ECECEC) - - defaultCommentClass: "", // class added to cells with non-null comments when grid enabled - defaultCommentStyle: - "background-repeat:no-repeat;background-position:top right;background-image:url(www/assets/images/sc_commentbg.gif);", // style added to cells with non-null comments when grid enabled - defaultCommentNoGridClass: "", // class added to cells with non-null comments when grid not enabled - defaultCommentNoGridStyle: "", // style added to cells with non-null comments when grid not enabled - - defaultColWidth: "80", // text - defaultMinimumColWidth: 10, // numeric - - // For each of the following default sheet display values at least one of class and/or style are needed - - defaultHighlightTypeCursorClass: "", - // defaultHighlightTypeCursorStyle: "color:#FFF;backgroundColor:#A6A6A6;", - defaultHighlightTypeCursorStyle: "", - defaultHighlightTypeRangeClass: "", - //defaultHighlightTypeRangeStyle: "color:#000;backgroundColor:#E5E5E5;", - defaultHighlightTypeRangeStyle: "", - - defaultColnameClass: "", // regular column heading letters, needs a cursor property - defaultColnameStyle: - "font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;", - defaultSelectedColnameClass: "", // column with selected cell, needs a cursor property - defaultSelectedColnameStyle: - "font-size:small;text-align:center;color:#FFFFFF;background-color:#404040;cursor:e-resize;", - defaultRownameClass: "", // regular row heading numbers - defaultRownameStyle: - "font-size:small;text-align:right;color:#FFFFFF;background-color:#808080;", - defaultSelectedRownameClass: "", // column with selected cell, needs a cursor property - defaultSelectedRownameStyle: - "font-size:small;text-align:right;color:#FFFFFF;background-color:#404040;", - defaultUpperLeftClass: "", // Corner cell in upper left - defaultUpperLeftStyle: - "font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;", - defaultSkippedCellClass: "", // used if present for spanned cells peeking into a pane (at least one of class/style needed) - defaultSkippedCellStyle: "font-size:small;background-color:#CCC", // used if present - defaultPaneDividerClass: "", // used if present for the look of the space between panes (at least one of class/style needed) - defaultPaneDividerStyle: - "font-size:small;background-color:#C0C0C0;padding:0px;", // used if present - - s_rcMissingSheet: "Render Context must have a sheet object", // unlikely thrown error - - //*** SocialCalc.format_text_for_display - - defaultLinkFormatString: - 'Link', // used for format "text-link"; you could make this an img tag if desired - // defaultLinkFormatString: 'Link out', - defaultPageLinkFormatString: - 'Page', // used for format "text-link"; you could make this an img tag if desired - - //*** SocialCalc.format_number_for_display - - defaultFormatdt: "d-mmm-yyyy h:mm:ss", - defaultFormatd: "d-mmm-yyyy", - defaultFormatt: "[h]:mm:ss", - defaultDisplayTRUE: "TRUE", // how TRUE shows when rendered - defaultDisplayFALSE: "FALSE", - - // - // SocialCalc Table Editor module, socialcalctableeditor.js: - // - - //*** SocialCalc.TableEditor - - defaultImagePrefix: "www/assets/images/sc_", // URL prefix for images (e.g., "/www/assets/images/sc") - defaultTableEditorIDPrefix: "te_", // if present, many TableEditor elements are assigned IDs with this prefix - defaultPageUpDnAmount: 15, // number of rows to move cursor on PgUp/PgDn keys (numeric) - - AllowCtrlS: true, // turns on Ctrl-S trapdoor for setting custom numeric formats and commands if true - - //*** SocialCalc.CreateTableEditor - - defaultTableControlThickness: 0, // the short size for the scrollbars, etc. (numeric in pixels) - cteGriddivClass: "", // if present, the class for the TableEditor griddiv element - - //** SocialCalc.EditorGetStatuslineString -- strings shown on status line - - s_statusline_executing: "Executing...", - s_statusline_displaying: "Displaying...", - s_statusline_ordering: "Ordering...", - s_statusline_calculating: "Calculating...", - s_statusline_calculatingls: "Calculating... Loading Sheet...", - s_statusline_doingserverfunc: "doing server function ", - s_statusline_incell: " in cell ", - s_statusline_calcstart: "Calculation start...", - s_statusline_sum: "SUM", - s_statusline_recalcneeded: - '(Recalc needed)', - s_statusline_circref: 'Circular reference: ', - - //** SocialCalc.InputBoxDisplayCellContents - - s_inputboxdisplaymultilinetext: - "[Multi-line text: Click icon on right to edit]", - - //** SocialCalc.InputEcho - - defaultInputEchoClass: "", // if present, the class of the popup inputEcho div - defaultInputEchoStyle: - "filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;border:1px solid #884;" + - "fontSize:small;padding:2px 10px 1px 2px;cursor:default;", // if present, pseudo style - defaultInputEchoPromptClass: "", // if present, the class of the popup inputEcho div - defaultInputEchoPromptStyle: - "filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;" + - "borderLeft:1px solid #884;borderRight:1px solid #884;borderBottom:1px solid #884;" + - "fontSize:small;fontStyle:italic;padding:2px 10px 1px 2px;cursor:default;", // if present, pseudo style - - //** SocialCalc.InputEchoText - - ietUnknownFunction: "Unknown function ", // displayed when typing "=unknown(" - - //** SocialCalc.CellHandles - - CH_radius1: 29.0, // extent of inner circle within 90px image - CH_radius2: 41.0, // extent of outer circle within 90px image - s_CHfillAllTooltip: "Fill Contents and Formats Down/Right", // tooltip for fill all handle - s_CHfillContentsTooltip: "Fill Contents Only Down/Right", // tooltip for fill formulas handle - s_CHmovePasteAllTooltip: "Move Contents and Formats", // etc. - s_CHmovePasteContentsTooltip: "Move Contents Only", - s_CHmoveInsertAllTooltip: "Slide Contents and Formats within Row/Col", - s_CHmoveInsertContentsTooltip: "Slide Contents within Row/Col", - s_CHindicatorOperationLookup: { - Fill: "Fill", - FillC: "Fill Contents", - Move: "Move", - MoveI: "Slide", - MoveC: "Move Contents", - MoveIC: "Slide Contents", - }, // short form of operation to follow drag - s_CHindicatorDirectionLookup: { - Down: " Down", - Right: " Right", - Horizontal: " Horizontal", - Vertical: " Vertical", - }, // direction that modifies operation during drag - - //*** SocialCalc.TableControl - - defaultTCSliderThickness: 9, // length of pane slider (numeric in pixels) - defaultTCButtonThickness: 20, // length of scroll +/- buttons (numeric in pixels) - defaultTCThumbThickness: 15, // length of thumb (numeric in pixels) - - //*** SocialCalc.CreateTableControl - - TCmainStyle: "backgroundColor:#EEE;", // if present, pseudo style (text-align is textAlign) for main div of a table control - TCmainClass: "", // if present, the CSS class of the main div for a table control - TCendcapStyle: "backgroundColor:#FFF;", // backgroundColor may be used while waiting for image that may not come - TCendcapClass: "", - TCpanesliderStyle: "backgroundColor:#CCC;", - TCpanesliderClass: "", - s_panesliderTooltiph: "Drag to lock pane vertically", // tooltip for horizontal table control pane slider - s_panesliderTooltipv: "Drag to lock pane horizontally", - TClessbuttonStyle: "backgroundColor:#AAA;", - TClessbuttonClass: "", - TClessbuttonRepeatWait: 300, // in milliseconds - TClessbuttonRepeatInterval: 20, //100, // in milliseconds - TCmorebuttonStyle: "backgroundColor:#AAA;", - TCmorebuttonClass: "", - TCmorebuttonRepeatWait: 300, // in milliseconds - TCmorebuttonRepeatInterval: 20, //100, // in milliseconds - TCscrollareaStyle: "backgroundColor:#DDD;", - TCscrollareaClass: "", - TCscrollareaRepeatWait: 500, // in milliseconds - TCscrollareaRepeatInterval: 100, // in milliseconds - TCthumbClass: "", - TCthumbStyle: "backgroundColor:#CCC;", - - //*** SocialCalc.TCPSDragFunctionStart - - TCPStrackinglineClass: "", // at least one of class/style for pane slider tracking line display in table control - TCPStrackinglineStyle: "overflow:hidden;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCPStrackinglineThickness: "2px", // narrow dimension of trackling line (string with units) - - //*** SocialCalc.TCTDragFunctionStart - - TCTDFSthumbstatusvClass: "", // at least one of class/style for vertical thumb dragging status display in table control - TCTDFSthumbstatusvStyle: - "height:20px;width:auto;border:3px solid #808080;overflow:hidden;" + - "backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCTDFSthumbstatushClass: "", // at least one of class/style for horizontal thumb dragging status display in table control - TCTDFSthumbstatushStyle: - "height:20px;width:auto;border:1px solid black;padding:2px;" + - "backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCTDFSthumbstatusrownumClass: "", // at least one of class/style for thumb dragging status display in table control - TCTDFSthumbstatusrownumStyle: - "color:#FFF;background-color:#808080;font-size:small;white-space:nowrap;padding:3px;", // if present, real style - TCTDFStopOffsetv: 0, // offsets for thumbstatus display while dragging - TCTDFSleftOffsetv: -80, - s_TCTDFthumbstatusPrefixv: "Row ", // Text Control Drag Function text before row number - TCTDFStopOffseth: -30, - TCTDFSleftOffseth: 0, - s_TCTDFthumbstatusPrefixh: "Col ", // Text Control Drag Function text before col number - - //*** SocialCalc.TooltipInfo - - // Note: These two values are used to set the TooltipInfo initial values when the code is first read in. - // Modifying them here after loading has no effect -- you need to modify SocialCalc.TooltipInfo directly - // to dynamically set them. This is different than most other constants which may be modified until use. - - TooltipOffsetX: 2, // offset in pixels from mouse position (to right on left side of screen, to left on right) - TooltipOffsetY: 10, // offset in pixels above mouse position for lower edge - - //*** SocialCalc.TooltipDisplay - - TDpopupElementClass: "", // at least one of class/style for tooltip display - TDpopupElementStyle: - "border:1px solid black;padding:1px 2px 2px 2px;textAlign:center;backgroundColor:#FFF;" + - "fontSize:7pt;fontFamily:Verdana,Arial,Helvetica,sans-serif;" + - "position:absolute;width:auto;zIndex:110;", - // if present, pseudo style (text-align is textAlign) - - // - // SocialCalc Spreadsheet Control module, socialcalcspreadsheetcontrol.js: - // - - //*** SocialCalc.SpreadsheetControl - - SCToolbarbackground: "background-color:#404040;", - SCTabbackground: "background-color:#CCC;", - SCTabselectedCSS: - "font-size:small;padding:6px 30px 6px 8px;color:#FFF;background-color:#404040;cursor:default;border-right:1px solid #CCC;", - SCTabplainCSS: - "font-size:small;padding:6px 30px 6px 8px;color:#FFF;background-color:#808080;cursor:default;border-right:1px solid #CCC;", - SCToolbartext: - "font-size:x-small;font-weight:bold;color:#FFF;padding-bottom:4px;", - - SCFormulabarheight: 0, // in pixels, will contain a text input box - - SCStatuslineheight: 20, // in pixels - SCStatuslineCSS: "font-size:10px;padding:3px 0px;", - - // workbook - doWorkBook: true, - SCSheetBarHeight: 25, - SCSheetBarBackground: "background-color:#CCC;", - SCSheetBarCSS: "background-color:#CCC;", - SCSheetBarWidth: "70%", - - SCCellHandlesDisable: true, - SCNoInputEcho: true, // do we need an input echo ? - s_inputboxdisplaynoteditable: "[not editable]", - SCNoRowName: true, - SCNoRanging: true, - SCNoQuoteInInputBox: true, - // Constants for default Format tab (settings) - // - // *** EVEN THOUGH THESE DON'T START WITH s_: *** - // - // These should be carefully checked for localization. Make sure you understand what they do and how they work! - // The first part of "first:second|first:second|..." is what is displayed and the second is the value to be used. - // The value is normally not translated -- only the displayed part. The [cancel], [break], etc., are not translated -- - // they are commands to SocialCalc.SettingsControls.PopupListInitialize - - SCFormatNumberFormats: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Auto w/ commas!:[,]General|[break]:|" + - "00:00|000:000|0000:0000|00000:00000|[break]:|%loc!Formula!:formula|%loc!Hidden!:hidden|[newcol]:" + - "1234:0|1,234:#,##0|1,234.5:#,##0.0|1,234.56:#,##0.00|1,234.567:#,##0.000|1,234.5678:#,##0.0000|" + - "[break]:|1,234%:#,##0%|1,234.5%:#,##0.0%|1,234.56%:#,##0.00%|" + - "[newcol]:|$1,234:$#,##0|$1,234.5:$#,##0.0|$1,234.56:$#,##0.00|[break]:|" + - "(1,234):#,##0_);(#,##0)|(1,234.5):#,##0.0_);(#,##0.0)|(1,234.56):#,##0.00_);(#,##0.00)|[break]:|" + - "($1,234):#,##0_);($#,##0)|($1,234.5):$#,##0.0_);($#,##0.0)|($1,234.56):$#,##0.00_);($#,##0.00)|" + - "[newcol]:|1/4/06:m/d/yy|01/04/2006:mm/dd/yyyy|2006-01-04:yyyy-mm-dd|4-Jan-06:d-mmm-yy|04-Jan-2006:dd-mmm-yyyy|January 4, 2006:mmmm d, yyyy|" + - "[break]:|1\\c23:h:mm|1\\c23 PM:h:mm AM/PM|1\\c23\\c45:h:mm:ss|01\\c23\\c45:hh:mm:ss|26\\c23 (h\\cm):[hh]:mm|69\\c45 (m\\cs):[mm]:ss|69 (s):[ss]|" + - "[newcol]:|2006-01-04 01\\c23\\c45:yyyy-mm-dd hh:mm:ss|January 4, 2006:mmmm d, yyyy hh:mm:ss|Wed:ddd|Wednesday:dddd|", - SCFormatTextFormats: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Plain Text!:text-plain|" + - "HTML:text-html|%loc!Wikitext!:text-wiki|%loc!Link!:text-link|%loc!Formula!:formula|%loc!Hidden!:hidden|", - SCFormatPadsizes: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!No padding!:0px|" + - "[newcol]:|1 pixel:1px|2 pixels:2px|3 pixels:3px|4 pixels:4px|5 pixels:5px|" + - "6 pixels:6px|7 pixels:7px|8 pixels:8px|[newcol]:|9 pixels:9px|10 pixels:10px|11 pixels:11px|" + - "12 pixels:12px|13 pixels:13px|14 pixels:14px|16 pixels:16px|" + - "18 pixels:18px|[newcol]:|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|", - SCFormatFontsizes: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|X-Small:x-small|Small:small|Medium:medium|Large:large|X-Large:x-large|" + - "[newcol]:|6pt:6pt|7pt:7pt|8pt:8pt|9pt:9pt|10pt:10pt|11pt:11pt|12pt:12pt|14pt:14pt|16pt:16pt|" + - "[newcol]:|18pt:18pt|20pt:20pt|22pt:22pt|24pt:24pt|28pt:28pt|36pt:36pt|48pt:48pt|72pt:72pt|" + - "[newcol]:|8 pixels:8px|9 pixels:9px|10 pixels:10px|11 pixels:11px|" + - "12 pixels:12px|13 pixels:13px|14 pixels:14px|[newcol]:|16 pixels:16px|" + - "18 pixels:18px|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|", - SCFormatFontfamilies: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|Verdana:Verdana,Arial,Helvetica,sans-serif|" + - "Arial:arial,helvetica,sans-serif|Courier:'Courier New',Courier,monospace|", - SCFormatFontlook: - "[cancel]:|[break]:|%loc!Default!:|%loc!Normal!:normal normal|%loc!Bold!:normal bold|%loc!Italic!:italic normal|" + - "%loc!Bold Italic!:italic bold", - SCFormatTextAlignhoriz: - "[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|", - SCFormatNumberAlignhoriz: - "[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|", - SCFormatAlignVertical: - "[cancel]:|[break]:|%loc!Default!:|%loc!Top!:top|%loc!Middle!:middle|%loc!Bottom!:bottom|", - SCFormatColwidth: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|" + - "20 pixels:20|40:40|60:60|80:80|100:100|120:120|140:140|160:160|" + - "[newcol]:|180 pixels:180|200:200|220:220|240:240|260:260|280:280|300:300|", - SCFormatRecalc: "[cancel]:|[break]:|%loc!Auto!:|%loc!Manual!:off|", - - //*** SocialCalc.InitializeSpreadsheetControl - - ISCButtonBorderNormal: "#404040", - ISCButtonBorderHover: "#999", - ISCButtonBorderDown: "#FFF", - ISCButtonDownBackground: "#888", - - //*** SocialCalc.SettingsControls.PopupListInitialize - - s_PopupListCancel: "[Cancel]", - s_PopupListCustom: "Custom", - - // *** - // - // s_loc_ constants accessed by SocialCalc.LocalizeString and SocialCalc.LocalizeSubstrings - // - // Used extensively by socialcalcspreadsheetcontrol.js - // - // *** - - s_loc_align_center: "Align Center", - s_loc_align_left: "Align Left", - s_loc_align_right: "Align Right", - s_loc_alignment: "Alignment", - s_loc_audit: "Audit", - s_loc_audit_trail_this_session: "Audit Trail This Session", - s_loc_auto: "Auto", - s_loc_auto_sum: "Auto Sum", - s_loc_auto_wX_commas: "Auto w/ commas", - s_loc_automatic: "Automatic", - s_loc_background: "Background", - s_loc_bold: "Bold", - s_loc_bold_XampX_italics: "Bold & Italics", - s_loc_bold_italic: "Bold Italic", - s_loc_borders: "Borders", - s_loc_borders_off: "Borders Off", - s_loc_borders_on: "Borders On", - s_loc_bottom: "Bottom", - s_loc_bottom_border: "Bottom Border", - s_loc_cell_settings: "CELL SETTINGS", - s_loc_csv_format: "CSV format", - s_loc_cancel: "Cancel", - s_loc_category: "Category", - s_loc_center: "Center", - s_loc_clear: "Clear", - s_loc_clear_socialcalc_clipboard: "Clear SocialCalc Clipboard", - s_loc_clipboard: "Clipboard", - s_loc_color: "Color", - s_loc_column_: "Column ", - s_loc_comment: "Comment", - s_loc_copy: "Copy", - s_loc_custom: "Custom", - s_loc_cut: "Cut", - s_loc_default: "Default", - s_loc_default_alignment: "Default Alignment", - s_loc_default_column_width: "Default Column Width", - s_loc_default_font: "Default Font", - s_loc_default_format: "Default Format", - s_loc_default_padding: "Default Padding", - s_loc_delete: "Delete", - s_loc_delete_column: "Delete Column", - s_loc_delete_contents: "Delete Contents", - s_loc_delete_row: "Delete Row", - s_loc_description: "Description", - s_loc_display_clipboard_in: "Display Clipboard in", - s_loc_down: "Down", - s_loc_edit: "Edit", - s_loc_existing_names: "Existing Names", - s_loc_family: "Family", - s_loc_fill_down: "Fill Down", - s_loc_fill_right: "Fill Right", - s_loc_font: "Font", - s_loc_format: "Format", - s_loc_formula: "Formula", - s_loc_function_list: "Function List", - s_loc_functions: "Functions", - s_loc_grid: "Grid", - s_loc_hidden: "Hidden", - s_loc_horizontal: "Horizontal", - s_loc_insert_column: "Insert Column", - s_loc_insert_row: "Insert Row", - s_loc_italic: "Italic", - s_loc_last_sort: "Last Sort", - s_loc_left: "Left", - s_loc_left_border: "Left Border", - s_loc_link: "Link", - s_loc_link_input_box: "Link Input Box", - s_loc_list: "List", - s_loc_load_socialcalc_clipboard_with_this: - "Load SocialCalc Clipboard With This", - s_loc_major_sort: "Major Sort", - s_loc_manual: "Manual", - s_loc_merge_cells: "Merge Cells", - s_loc_middle: "Middle", - s_loc_minor_sort: "Minor Sort", - s_loc_move_insert: "Move Insert", - s_loc_move_paste: "Move Paste", - s_loc_multiXline_input_box: "Multi-line Input Box", - s_loc_name: "Name", - s_loc_names: "Names", - s_loc_no_padding: "No padding", - s_loc_normal: "Normal", - s_loc_number: "Number", - s_loc_number_horizontal: "Number Horizontal", - s_loc_ok: "OK", - s_loc_padding: "Padding", - s_loc_page_name: "Page Name", - s_loc_paste: "Paste", - s_loc_paste_formats: "Paste Formats", - s_loc_plain_text: "Plain Text", - s_loc_recalc: "Recalc", - s_loc_recalculation: "Recalculation", - s_loc_redo: "Redo", - s_loc_right: "Right", - s_loc_right_border: "Right Border", - s_loc_sheet_settings: "SHEET SETTINGS", - s_loc_save: "Save", - s_loc_save_to: "Save to", - s_loc_set_cell_contents: "Set Cell Contents", - s_loc_set_cells_to_sort: "Set Cells To Sort", - s_loc_set_value_to: "Set Value To", - s_loc_set_to_link_format: "Set to Link format", - s_loc_setXclear_move_from: "Set/Clear Move From", - s_loc_show_cell_settings: "Show Cell Settings", - s_loc_show_sheet_settings: "Show Sheet Settings", - s_loc_show_in_new_browser_window: "Show in new browser window", - s_loc_size: "Size", - s_loc_socialcalcXsave_format: "SocialCalc-save format", - s_loc_sort: "Sort", - s_loc_sort_: "Sort ", - s_loc_sort_cells: "Sort Cells", - s_loc_swap_colors: "Swap Colors", - s_loc_tabXdelimited_format: "Tab-delimited format", - s_loc_text: "Text", - s_loc_text_horizontal: "Text Horizontal", - s_loc_this_is_aXbrXsample: "This is a
    sample", - s_loc_top: "Top", - s_loc_top_border: "Top Border", - s_loc_undone_steps: "UNDONE STEPS", - s_loc_url: "URL", - s_loc_undo: "Undo", - s_loc_unmerge_cells: "Unmerge Cells", - s_loc_up: "Up", - s_loc_value: "Value", - s_loc_vertical: "Vertical", - s_loc_wikitext: "Wikitext", - s_loc_workspace: "Workspace", - s_loc_XnewX: "[New]", - s_loc_XnoneX: "[None]", - s_loc_Xselect_rangeX: "[select range]", - - // - // SocialCalc Spreadsheet Viewer module, socialcalcviewer.js: - // - - //*** SocialCalc.SpreadsheetViewer - - SVStatuslineheight: 20, // in pixels - SVStatuslineCSS: "font-size:10px;padding:3px 0px;", - - // - // SocialCalc Format Number module, formatnumber2.js: - // - - FormatNumber_separatorchar: ",", // the thousands separator character when formatting numbers for display - FormatNumber_decimalchar: ".", // the decimal separator character when formatting numbers for display - FormatNumber_defaultCurrency: "$", // the currency string used if none specified - - // The following constants are arrays of strings with the short (3 character) and full names of days and months - - s_FormatNumber_daynames: [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - ], - s_FormatNumber_daynames3: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - s_FormatNumber_monthnames: [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ], - s_FormatNumber_monthnames3: [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - ], - s_FormatNumber_am: "AM", - s_FormatNumber_am1: "A", - s_FormatNumber_pm: "PM", - s_FormatNumber_pm1: "P", - - // - // SocialCalc Spreadsheet Formula module, formula1.js: - // - - s_parseerrexponent: "Improperly formed number exponent", - s_parseerrchar: "Unexpected character in formula", - s_parseerrstring: "Improperly formed string", - s_parseerrspecialvalue: "Improperly formed special value", - s_parseerrtwoops: - "Error in formula (two operators inappropriately in a row)", - s_parseerrmissingopenparen: - "Missing open parenthesis in list with comma(s). ", - s_parseerrcloseparennoopen: - "Closing parenthesis without open parenthesis. ", - s_parseerrmissingcloseparen: "Missing close parenthesis. ", - s_parseerrmissingoperand: "Missing operand. ", - s_parseerrerrorinformula: "Error in formula.", - s_calcerrerrorvalueinformula: "Error value in formula", - s_parseerrerrorinformulabadval: "Error in formula resulting in bad value", - s_formularangeresult: "Formula results in range value:", - s_calcerrnumericnan: "Formula results in an bad numeric value", - s_calcerrnumericoverflow: "Numeric overflow", - s_sheetunavailable: "Sheet unavailable:", // when FindSheetInCache returns null - s_calcerrcellrefmissing: "Cell reference missing when expected.", - s_calcerrsheetnamemissing: "Sheet name missing when expected.", - s_circularnameref: "Circular name reference to name", - s_calcerrunknownname: "Unknown name", - s_calcerrincorrectargstofunction: "Incorrect arguments to function", - s_sheetfuncunknownfunction: "Unknown function", - s_sheetfunclnarg: "LN argument must be greater than 0", - s_sheetfunclog10arg: "LOG10 argument must be greater than 0", - s_sheetfunclogsecondarg: - "LOG second argument must be numeric greater than 0", - s_sheetfunclogfirstarg: "LOG first argument must be greater than 0", - s_sheetfuncroundsecondarg: "ROUND second argument must be numeric", - s_sheetfuncddblife: "DDB life must be greater than 1", - s_sheetfuncslnlife: "SLN life must be greater than 1", - - // Function definition text - - s_fdef_ABS: "Absolute value function. ", - s_fdef_ACOS: "Trigonometric arccosine function. ", - s_fdef_AND: "True if all arguments are true. ", - s_fdef_ASIN: "Trigonometric arcsine function. ", - s_fdef_ATAN: "Trigonometric arctan function. ", - s_fdef_ATAN2: "Trigonometric arc tangent function (result is in radians). ", - s_fdef_AVERAGE: "Averages the values. ", - s_fdef_CHOOSE: - "Returns the value specified by the index. The values may be ranges of cells. ", - s_fdef_COLUMNS: "Returns the number of columns in the range. ", - s_fdef_COS: "Trigonometric cosine function (value is in radians). ", - s_fdef_COUNT: - "Counts the number of numeric values, not blank, text, or error. ", - s_fdef_COUNTA: "Counts the number of non-blank values. ", - s_fdef_COUNTBLANK: - 'Counts the number of blank values. (Note: "" is not blank.) ', - s_fdef_COUNTIF: - '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). ', - s_fdef_DATE: - '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. ', - s_fdef_DAVERAGE: - "Averages the values in the specified field in records that meet the criteria. ", - s_fdef_DAY: "Returns the day of month for a date value. ", - s_fdef_DCOUNT: - "Counts the number of numeric values, not blank, text, or error, in the specified field in records that meet the criteria. ", - s_fdef_DCOUNTA: - "Counts the number of non-blank values in the specified field in records that meet the criteria. ", - s_fdef_DDB: - "Returns the amount of depreciation at the given period of time (the default factor is 2 for double-declining balance). ", - s_fdef_DEGREES: "Converts value in radians into degrees. ", - s_fdef_DGET: - "Returns the value of the specified field in the single record that meets the criteria. ", - s_fdef_DMAX: - "Returns the maximum of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DMIN: - "Returns the maximum of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DPRODUCT: - "Returns the result of multiplying the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DSTDEV: - "Returns the sample standard deviation of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DSTDEVP: - "Returns the standard deviation of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DSUM: - "Returns the sum of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DVAR: - "Returns the sample variance of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DVARP: - "Returns the variance of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_EVEN: - "Rounds the value up in magnitude to the nearest even integer. ", - s_fdef_EXACT: - 'Returns "true" if the values are exactly the same, including case, type, etc. ', - s_fdef_EXP: "Returns e raised to the value power. ", - s_fdef_FACT: "Returns factorial of the value. ", - s_fdef_FALSE: 'Returns the logical value "false". ', - s_fdef_FIND: - 'Returns the starting position within string2 of the first occurrence of string1 at or after "start". If start is omitted, 1 is assumed. ', - s_fdef_FV: - "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). ", - s_fdef_HLOOKUP: - "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. ", - s_fdef_HOUR: "Returns the hour portion of a time or date/time value. ", - s_fdef_IF: - "Results in true-value if logical-expression is TRUE or non-zero, otherwise results in false-value. ", - s_fdef_INDEX: - "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)). ", - s_fdef_INT: - "Returns the value rounded down to the nearest integer (towards -infinity). ", - s_fdef_IRR: - "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%). ", - s_fdef_ISBLANK: - 'Returns "true" if the value is a reference to a blank cell. ', - s_fdef_ISERR: - 'Returns "true" if the value is of type "Error" but not "NA". ', - s_fdef_ISERROR: 'Returns "true" if the value is of type "Error". ', - s_fdef_ISLOGICAL: - 'Returns "true" if the value is of type "Logical" (true/false). ', - s_fdef_ISNA: 'Returns "true" if the value is the error type "NA". ', - s_fdef_ISNONTEXT: 'Returns "true" if the value is not of type "Text". ', - s_fdef_ISNUMBER: - 'Returns "true" if the value is of type "Number" (including logical values). ', - s_fdef_ISTEXT: 'Returns "true" if the value is of type "Text". ', - s_fdef_LEFT: - "Returns the specified number of characters from the text value. If count is omitted, 1 is assumed. ", - s_fdef_LEN: "Returns the number of characters in the text value. ", - s_fdef_LN: "Returns the natural logarithm of the value. ", - s_fdef_LOG: "Returns the logarithm of the value using the specified base. ", - s_fdef_LOG10: "Returns the base 10 logarithm of the value. ", - s_fdef_LOWER: - "Returns the text value with all uppercase characters converted to lowercase. ", - s_fdef_MATCH: - "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. ", - s_fdef_MAX: "Returns the maximum of the numeric values. ", - s_fdef_MID: - "Returns the specified number of characters from the text value starting from the specified position. ", - s_fdef_MIN: "Returns the minimum of the numeric values. ", - s_fdef_MINUTE: "Returns the minute portion of a time or date/time value. ", - s_fdef_MOD: - "Returns the remainder of the first value divided by the second. ", - s_fdef_MONTH: "Returns the month part of a date value. ", - s_fdef_N: "Returns the value if it is a numeric value otherwise an error. ", - s_fdef_NA: - "Returns the #N/A error value which propagates through most operations. ", - s_fdef_NOT: "Returns FALSE if value is true, and TRUE if it is false. ", - s_fdef_NOW: "Returns the current date/time. ", - s_fdef_NPER: - "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. ", - s_fdef_NPV: - "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. ", - s_fdef_ODD: "Rounds the value up in magnitude to the nearest odd integer. ", - s_fdef_OR: "True if any argument is true ", - s_fdef_PI: "The value 3.1415926... ", - s_fdef_PMT: - "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). ", - s_fdef_POWER: "Returns the first value raised to the second value power. ", - s_fdef_PRODUCT: "Returns the result of multiplying the numeric values. ", - s_fdef_PROPER: - "Returns the text value with the first letter of each word converted to uppercase and the others to lowercase. ", - s_fdef_PV: - "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). ", - s_fdef_RADIANS: "Converts value in degrees into radians. ", - s_fdef_RATE: - "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%). ", - s_fdef_REPLACE: - "Returns text1 with the specified number of characters starting from the specified position replaced by text2. ", - s_fdef_REPT: "Returns the text repeated the specified number of times. ", - s_fdef_RIGHT: - "Returns the specified number of characters from the text value starting from the end. If count is omitted, 1 is assumed. ", - s_fdef_ROUND: - "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). ", - s_fdef_ROWS: "Returns the number of rows in the range. ", - s_fdef_SECOND: - "Returns the second portion of a time or date/time value (truncated to an integer). ", - s_fdef_SIN: "Trigonometric sine function (value is in radians) ", - s_fdef_SLN: - "Returns the amount of depreciation at each period of time using the straight-line method. ", - s_fdef_SQRT: "Square root of the value ", - s_fdef_STDEV: - "Returns the sample standard deviation of the numeric values. ", - s_fdef_STDEVP: "Returns the standard deviation of the numeric values. ", - s_fdef_SUBSTITUTE: - 'Returns text1 with the all occurrences of oldtext replaced by newtext. If "occurrence" is present, then only that occurrence is replaced. ', - s_fdef_SUM: - "Adds the numeric values. The values to the sum function may be ranges in the form similar to A1:B5. ", - s_fdef_SUMIF: - '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. ', - s_fdef_SYD: "Depreciation by Sum of Year's Digits method. ", - s_fdef_T: "Returns the text value or else a null string. ", - s_fdef_TAN: "Trigonometric tangent function (value is in radians) ", - s_fdef_TIME: - "Returns the time value given the specified hour, minute, and second. ", - s_fdef_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. ', - s_fdef_TRIM: - "Returns the text value with leading, trailing, and repeated spaces removed. ", - s_fdef_TRUE: 'Returns the logical value "true". ', - s_fdef_TRUNC: - "Truncates the value to the specified number of decimal places. If precision is negative, truncate to powers of 10. ", - s_fdef_UPPER: - "Returns the text value with all lowercase characters converted to uppercase. ", - s_fdef_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. ", - s_fdef_VAR: "Returns the sample variance of the numeric values. ", - s_fdef_VARP: "Returns the variance of the numeric values. ", - s_fdef_VLOOKUP: - "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. ", - s_fdef_WEEKDAY: - "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. ", - s_fdef_YEAR: "Returns the year part of a date value. ", - - s_farg_v: "value", - s_farg_vn: "value1, value2, ...", - s_farg_xy: "valueX, valueY", - s_farg_choose: "index, value1, value2, ...", - s_farg_range: "range", - s_farg_rangec: "range, criteria", - s_farg_date: "year, month, day", - s_farg_dfunc: "databaserange, fieldname, criteriarange", - s_farg_ddb: "cost, salvage, lifetime, period [, factor]", - s_farg_find: "string1, string2 [, start]", - s_farg_fv: "rate, n, payment, [pv, [paytype]]", - s_farg_hlookup: "value, range, row, [rangelookup]", - s_farg_iffunc: "logical-expression, true-value, false-value", - s_farg_index: "range, rownum, colnum", - s_farg_irr: "range, [guess]", - s_farg_tc: "text, count", - s_farg_log: "value, base", - s_farg_match: "value, range, [rangelookup]", - s_farg_mid: "text, start, length", - s_farg_nper: "rate, payment, pv, [fv, [paytype]]", - s_farg_npv: "rate, value1, value2, ...", - s_farg_pmt: "rate, n, pv, [fv, [paytype]]", - s_farg_pv: "rate, n, payment, [fv, [paytype]]", - s_farg_rate: "n, payment, pv, [fv, [paytype, [guess]]]", - s_farg_replace: "text1, start, length, text2", - s_farg_vp: "value, [precision]", - s_farg_valpre: "value, precision", - s_farg_csl: "cost, salvage, lifetime", - s_farg_cslp: "cost, salvage, lifetime, period", - s_farg_subs: "text1, oldtext, newtext [, occurrence]", - s_farg_sumif: "range1, criteria [, range2]", - s_farg_hms: "hour, minute, second", - s_farg_txt: "text", - s_farg_vlookup: "value, range, col, [rangelookup]", - s_farg_weekday: "date, [type]", - s_farg_dt: "date", - - function_classlist: [ - "all", - "stat", - "lookup", - "datetime", - "financial", - "test", - "math", - "text", - ], // order of function classes - - s_fclass_all: "All", - s_fclass_stat: "Statistics", - s_fclass_lookup: "Lookup", - s_fclass_datetime: "Date & Time", - s_fclass_financial: "Financial", - s_fclass_test: "Test", - s_fclass_math: "Math", - s_fclass_text: "Text", - - lastone: null, - }; - - // Default classnames for use with SocialCalc.ConstantsSetClasses: - - SocialCalc.ConstantsDefaultClasses = { - defaultComment: "", - defaultCommentNoGrid: "", - defaultHighlightTypeCursor: "", - defaultHighlightTypeRange: "", - defaultColname: "", - defaultSelectedColname: "", - defaultRowname: "", - defaultSelectedRowname: "", - defaultUpperLeft: "", - defaultSkippedCell: "", - defaultPaneDivider: "", - cteGriddiv: "", // this one has no Style version with it - defaultInputEcho: { - classname: "", - style: "filter:alpha(opacity=90);opacity:.9;", - }, // so FireFox won't show warning - TCmain: "", - TCendcap: "", - TCpaneslider: "", - TClessbutton: "", - TCmorebutton: "", - TCscrollarea: "", - TCthumb: "", - TCPStrackingline: "", - TCTDFSthumbstatus: "", - TDpopupElement: "", - }; - - // - // SocialCalc.ConstantsSetClasses(prefix) - // - // This routine goes through all of the xyzClass/xyzStyle pairs and sets the Class to a default and - // turns off the Style, if present. The prefix is put before each default. - // The list of items to set is in SocialCalc.ConstantsDefaultClasses. The names there - // correspond to the "xyz" parts. If there is a value, it is the default to set. If the - // default is a null, no change is made. If the default is the null string (""), the - // name of the item is used (e.g., "defaultComment" would use the classname "defaultComment"). - // If the default is an object, then it expects {classname: classname, style: stylestring} - this - // lets you combine both. - // - - SocialCalc.ConstantsSetClasses = function (prefix) { - var defaults = SocialCalc.ConstantsDefaultClasses; - var scc = SocialCalc.Constants; - var item; - - prefix = prefix || ""; - - for (item in defaults) { - if (typeof defaults[item] == "string") { - scc[item + "Class"] = prefix + (defaults[item] || item); - if (scc[item + "Style"] !== undefined) { - scc[item + "Style"] = ""; - } - } else if (typeof defaults[item] == "object") { - scc[item + "Class"] = prefix + (defaults[item].classname || item); - scc[item + "Style"] = defaults[item].style; - } - } - }; - - // - // The main SocialCalc code module of the SocialCalc package - // - /* -// (c) Copyright 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - /* - -**** Overview **** - -This is the beginning of a library of routines for displaying and editing spreadsheet -data in a browser. The HTML that includes this does not need to have anything -specific to the spreadsheet or editor already present -- everything is dynamically -added to the DOM by this code, including the rendered sheet and any editing controls. - -The library has a few parts. This is the main SocialCalc code module. -Other parts are the Table Editor module, the Formula module, and the Format Number module. -Note: The Table Editor module is licensed under a different license than this module. - -The class/object style is derived from O'Reilly's JavaScript by Flanagan, 5th Edition, -section 9.3, page 157. - -All of the data, object definitions, functions, etc., are stored as properties of the SocialCalc -object so as not to clutter up the global variables nor conflict with other names. - -A design goal (not tested yet for success) is to make it possible to have more than one -spreadsheet active on a page, perhaps even open for editing. It is assumed, though, that -there is only one mouse and one keyboard (a good assumption on most PCs today but not in the -new "touch and surface world" Apple and Microsoft are working towards). - -The testing has been on Windows Firefox (2 and 3), -Internet Explorer (6 and 7), Opera (9.23 and mainly later), Mac Safari (3.1), and Mac Firefox (2.0.0.6). -There are small issues with Firefox before 2.0 (cosmetic with drag handles) and larger ones -with Opera before 9.5 (the Delete key isn't recognized in some cases -- the 9.5 version was still -in beta and this bug affects other products like GMail, I believe). - -The data is stored in a SocialCalc.Sheet object. The data is organized in a form similar to that -used by SocialCalc 1.1.0. There is a function for converting a normal SocialCalc spreadsheet -save data string (the spreadsheet part of a SocialCalc data file) into this internal form. - -The SocialCalc.RenderContext class provides methods for rendering a table into the DOM representing -part of the spreadsheet. It is assumed that the spreadsheet could possibly be very large -and that rendering the whole thing at once could be too time consuming. It is also set up so -that it might be possible to have some of the sheet data only be loaded on demand (such as by Ajax). -The rendering can render cells to the right and below the already active area of the spreadsheet -so that you can scroll to that "clean" area without explicitly doing "add row/column". The class also -does simple operations such as "scrolling" within that table. The table may optionally include -row and column headers and may be split into panes. Most of the code assumes any number of panes, -but only the rightmost pane has scrolling code. In normal operation there would be one or two -panes horizontally and vertically. The panes may start on any row/column, though a given row/column -should only appear in one pane at a time (not all code enforces this, yet). - -The RenderContext is designed to be rendered as part of a SocialCalc.TableEditor. The TableEditor -includes the spreadsheet grid as well as scrollbars, pane sliders, and (eventually) editing controls. -The layout is dynamic and may be recomputed on the fly, such as in response to resizing the browser -window. - -The scrollbars and pane sliders are created using SocialCalc.TableControl objects. These in turn -make use of Dragging, ToolTip, Button, and MouseWheel functions. - -The keyboard input is handled by keyboard code. - -There are also some helper routines. - -More comments yet to come... - -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; - - // ************************************* - // - // Shared values - // - // These are "global" values shared by the classes, including default settings - // - // ************************************* - - // Callbacks - - SocialCalc.Callbacks = { - // The next two are used by SocialCalc.format_text_for_display - - // The function to expand wiki text - should be set if you want wikitext expansion - // The form is: expand_wiki(displayvalue, sheetobj, linkstyle, valueformat) - // valueformat is text-wiki followed by optional sub-formats, e.g., text-wikipagelink - - expand_wiki: null, - - expand_markup: function ( - displayvalue, - sheetobj, - linkstyle // the old function to expand wiki text - may be replaced - ) { - return SocialCalc.default_expand_markup( - displayvalue, - sheetobj, - linkstyle - ); - }, - - // MakePageLink is used to create the href for a link to another "page" - // The form is: MakePageLink(pagename, workspacename, linktyle, valueformat), returns string - - MakePageLink: null, - - // NormalizeSheetName is used to make different variations of sheetnames use the same cache slot - - NormalizeSheetName: null, // use default - lowercase - }; - - // Shared flags - - // none at present - - // ************************************* - // - // Cell class: - // - // ************************************* - - // - // Class SocialCalc.Cell - // - // Usage: var s = new SocialCalc.Cell(coord); - // - // Cell attributes include: - // - // coord: the column/row as a string, e.g., "A1" - // datavalue: the value to be used for computation and formatting for display, - // string or numeric (tolerant of numbers stored as strings) - // datatype: if present, v=numeric value, t=text value, f=formula, - // or c=constant that is not a simple number (like "$1.20") - // formula: if present, the formula (without leading "=") for computation or the constant - // valuetype: first char is main type, the following are sub-types. - // Main types are b=blank cell, n=numeric, t=text, e=error - // Examples of using sub-types would be "nt" for a numeric time value, "n$" for currency, "nl" for logical - // displayvalue: if present, rendered version of datavalue with formatting attributes applied - // parseinfo: if present, cached parsed version of formula - // - // The following optional values, if present, are mainly used in rendering, overriding defaults: - // - // bt, br, bb, bl: number of border's definition - // layout: layout (vertical alignment, padding) definition number - // font: font definition number - // color: text color definition number - // bgcolor: background color definition number - // cellformat: cell format (horizontal alignment) definition number - // nontextvalueformat: custom format definition number for non-text values, e.g., numbers - // textvalueformat: custom format definition number for text values - // colspan, rowspan: number of cells to span for merged cells (only on main cell) - // cssc: custom css classname for cell, as text (no special chars) - // csss: custom css style definition - // mod: modification allowed flag "y" if present - // comment: cell comment string - // - - SocialCalc.Cell = function (coord) { - this.coord = coord; - this.datavalue = ""; - this.datatype = null; - this.formula = ""; - this.valuetype = "b"; - }; - - // The types of cell properties - // - // Type 1: Base, Type 2: Attribute, Type 3: Special (e.g., displaystring, parseinfo) - - SocialCalc.CellProperties = { - coord: 1, - datavalue: 1, - datatype: 1, - formula: 1, - valuetype: 1, - errors: 1, - comment: 1, - bt: 2, - br: 2, - bb: 2, - bl: 2, - layout: 2, - font: 2, - color: 2, - bgcolor: 2, - cellformat: 2, - nontextvalueformat: 2, - textvalueformat: 2, - colspan: 2, - rowspan: 2, - cssc: 2, - csss: 2, - mod: 2, - displaystring: 3, // used to cache rendered HTML of cell contents - parseinfo: 3, // used to cache parsed formulas - hcolspan: 3, - hrowspan: 3, // spans taking hidden cols/rows into account (!!! NOT YET !!!) - }; - - SocialCalc.CellPropertiesTable = { - bt: "borderstyle", - br: "borderstyle", - bb: "borderstyle", - bl: "borderstyle", - layout: "layout", - font: "font", - color: "color", - bgcolor: "color", - cellformat: "cellformat", - nontextvalueformat: "valueformat", - textvalueformat: "valueformat", - }; - - // ************************************* - // - // Sheet class: - // - // ************************************* - - // - // Class SocialCalc.Sheet - // - // Usage: var s = new SocialCalc.Sheet(); - // - - SocialCalc.Sheet = function () { - SocialCalc.ResetSheet(this); - - // Set other values: - // - // sheet.statuscallback(data, status, arg, this.statuscallbackparams) is called - // during recalc and commands. - // - // During recalc, data is the current recalcdata. - // The values for status and the corresponding arg are: - // - // calcorder, {coord: coord, total: celllist length, count: count} [0 or more times per recalc] - // calccheckdone, calclist length [once per recalc] - // calcstep, {coord: coord, total: calclist length, count: count} [0 or more times per recalc] - // calcloading, {sheetname: name-of-sheet} - // calcserverfunc, {funcname: name-of-function, coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds [once per recalc] - // - // During commands, data is SocialCalc.SheetCommandInfo. - // These values for status and arg are: - // - // cmdstart, cmdstr - // cmdend - // - - this.statuscallback = null; // routine called with cmdstart, calcstart, etc., status and args: - // sheet.statuscallback(data, status, arg, params) - this.statuscallbackparams = null; // parameters passed to that routine - }; - - // - // SocialCalc.ResetSheet(sheet) - // - // Resets (and/or initializes) sheet data values. - // - - SocialCalc.ResetSheet = function (sheet, reload) { - // properties: - - sheet.cells = {}; // at least one for each non-blank cell: coord: cell-object - sheet.attribs = - // sheet attributes - { - lastcol: 1, - lastrow: 1, - defaultlayout: 0, - }; - sheet.rowattribs = { - hide: {}, // access by row number - height: {}, - }; - sheet.colattribs = { - width: {}, // access by col name - hide: {}, - }; - sheet.names = {}; // Each is: {desc: "optional description", definition: "B5, A1:B7, or =formula"} - sheet.layouts = []; - sheet.layouthash = {}; - sheet.fonts = []; - sheet.fonthash = {}; - sheet.colors = []; - sheet.colorhash = {}; - sheet.borderstyles = []; - sheet.borderstylehash = {}; - sheet.cellformats = []; - sheet.cellformathash = {}; - sheet.valueformats = []; - sheet.valueformathash = {}; - - sheet.copiedfrom = ""; // if a range, then this was loaded from a saved range as clipboard content - - sheet.changes = new SocialCalc.UndoStack(); - - sheet.renderneeded = false; - - sheet.changedrendervalues = true; // if true, spans and/or fonts have changed (set by ExecuteSheetCommand & GetStyle) - - sheet.recalcchangedavalue = false; // true if a recalc resulted in a change to a cell's calculated value - }; - - // Methods: - - SocialCalc.Sheet.prototype.ResetSheet = function () { - SocialCalc.ResetSheet(this); - }; - SocialCalc.Sheet.prototype.AddCell = function (newcell) { - return (this.cells[newcell.coord] = newcell); - }; - SocialCalc.Sheet.prototype.GetAssuredCell = function (coord) { - return this.cells[coord] || this.AddCell(new SocialCalc.Cell(coord)); - }; - SocialCalc.Sheet.prototype.ParseSheetSave = function (savedsheet) { - SocialCalc.ParseSheetSave(savedsheet, this); - }; - SocialCalc.Sheet.prototype.CellFromStringParts = function (cell, parts, j) { - return SocialCalc.CellFromStringParts(this, cell, parts, j); - }; - SocialCalc.Sheet.prototype.CreateSheetSave = function (range, canonicalize) { - return SocialCalc.CreateSheetSave(this, range, canonicalize); - }; - SocialCalc.Sheet.prototype.CellToString = function (cell) { - return SocialCalc.CellToString(this, cell); - }; - SocialCalc.Sheet.prototype.CanonicalizeSheet = function (full) { - return SocialCalc.CanonicalizeSheet(this, full); - }; - SocialCalc.Sheet.prototype.EncodeCellAttributes = function (coord) { - return SocialCalc.EncodeCellAttributes(this, coord); - }; - SocialCalc.Sheet.prototype.EncodeSheetAttributes = function () { - return SocialCalc.EncodeSheetAttributes(this); - }; - SocialCalc.Sheet.prototype.DecodeCellAttributes = function ( - coord, - attribs, - range - ) { - return SocialCalc.DecodeCellAttributes(this, coord, attribs, range); - }; - SocialCalc.Sheet.prototype.DecodeSheetAttributes = function (attribs) { - return SocialCalc.DecodeSheetAttributes(this, attribs); - }; - - SocialCalc.Sheet.prototype.ScheduleSheetCommands = function ( - cmd, - saveundo, - isRemote - ) { - return SocialCalc.ScheduleSheetCommands(this, cmd, saveundo, isRemote); - }; - SocialCalc.Sheet.prototype.SheetUndo = function () { - return SocialCalc.SheetUndo(this); - }; - SocialCalc.Sheet.prototype.SheetRedo = function () { - return SocialCalc.SheetRedo(this); - }; - SocialCalc.Sheet.prototype.CreateAuditString = function () { - return SocialCalc.CreateAuditString(this); - }; - SocialCalc.Sheet.prototype.GetStyleNum = function (atype, style) { - return SocialCalc.GetStyleNum(this, atype, style); - }; - SocialCalc.Sheet.prototype.GetStyleString = function (atype, num) { - return SocialCalc.GetStyleString(this, atype, num); - }; - SocialCalc.Sheet.prototype.RecalcSheet = function () { - return SocialCalc.RecalcSheet(this); - }; - - // - // Sheet save format: - // - // linetype:param1:param2:... - // - // Linetypes are: - // - // version:versionname - version of this format. Currently 1.4. - // - // cell:coord:type:value...:type:value... - Types are as follows: - // - // v:value - straight numeric value - // t:value - straight text/wiki-text in cell, encoded to handle \, :, newlines - // vt:fulltype:value - value with value type/subtype - // vtf:fulltype:value:formulatext - formula resulting in value with value type/subtype, value and text encoded - // vtc:fulltype:value:valuetext - formatted text constant resulting in value with value type/subtype, value and text encoded - // vf:fvalue:formulatext - formula resulting in value, value and text encoded (obsolete: only pre format version 1.1) - // fvalue - first char is "N" for numeric value, "T" for text value, "H" for HTML value, rest is the value - // e:errortext - Error text. Non-blank means formula parsing/calculation results in error. - // b:topborder#:rightborder#:bottomborder#:leftborder# - border# in sheet border list or blank if none - // l:layout# - number in cell layout list - // f:font# - number in sheet fonts list - // c:color# - sheet color list index for text - // bg:color# - sheet color list index for background color - // cf:format# - sheet cell format number for explicit format (align:left, etc.) - // cvf:valueformat# - sheet cell value format number (obsolete: only pre format v1.2) - // tvf:valueformat# - sheet cell text value format number - // ntvf:valueformat# - sheet cell non-text value format number - // colspan:numcols - number of columns spanned in merged cell - // rowspan:numrows - number of rows spanned in merged cell - // cssc:classname - name of CSS class to be used for cell when published instead of one calculated here - // csss:styletext - explicit CSS style information, encoded to handle :, etc. - // mod:allow - if "y" allow modification of cell for live "view" recalc - // comment:value - encoded text of comment for this cell (added in v1.5) - // - // col: - // w:widthval - number, "auto" (no width in tag), number%, or blank (use default) - // hide: - yes/no, no is assumed if missing - // row: - // hide - yes/no, no is assumed if missing - // - // sheet: - // c:lastcol - number - // r:lastrow - number - // w:defaultcolwidth - number, "auto", number%, or blank (default->80) - // h:defaultrowheight - not used - // tf:format# - cell format number for sheet default for text values - // ntf:format# - cell format number for sheet default for non-text values (i.e., numbers) - // layout:layout# - default cell layout number in cell layout list - // font:font# - default font number in sheet font list - // vf:valueformat# - default number value format number in sheet valueformat list (obsolete: only pre format version 1.2) - // ntvf:valueformat# - default non-text (number) value format number in sheet valueformat list - // tvf:valueformat# - default text value format number in sheet valueformat list - // color:color# - default number for text color in sheet color list - // bgcolor:color# - default number for background color in sheet color list - // circularreferencecell:coord - cell coord with a circular reference - // recalc:value - on/off (on is default). If not "off", appropriate changes to the sheet cause a recalc - // needsrecalc:value - yes/no (no is default). If "yes", formula values are not up to date - // - // name:name:description:value - name definition, name in uppercase, with value being "B5", "A1:B7", or "=formula"; - // description and value are encoded. - // font:fontnum:value - text of font definition (style weight size family) for font fontnum - // "*" for "style weight", size, or family, means use default (first look to sheet, then builtin) - // color:colornum:rgbvalue - text of color definition (e.g., rgb(255,255,255)) for color colornum - // border:bordernum:value - text of border definition (thickness style color) for border bordernum - // layout:layoutnum:value - text of vertical alignment and padding style for cell layout layoutnum (* for default): - // vertical-alignment:vavalue;padding:topval rightval bottomval leftval; - // cellformat:cformatnum:value - text of cell alignment (left/center/right) for cellformat cformatnum - // valueformat:vformatnum:value - text of number format (see FormatValueForDisplay) for valueformat vformatnum (changed in v1.2) - // clipboardrange:upperleftcoord:bottomrightcoord - ignored -- from wikiCalc - // clipboard:coord:type:value:... - ignored -- from wikiCalc - // - // If this is clipboard contents, then there is also information to facilitate pasting: - // - // copiedfrom:upperleftcoord:bottomrightcoord - range from which this was copied - // - - // Functions: - - SocialCalc.ParseSheetSave = function (savedsheet, sheetobj) { - var lines = savedsheet.split(/\r\n|\n/); - var parts = []; - var line; - var i, j, t, v, coord, cell, attribs, name; - var scc = SocialCalc.Constants; - - for (i = 0; i < lines.length; i++) { - line = lines[i]; - parts = line.split(":"); - switch (parts[0]) { - case "cell": - cell = sheetobj.GetAssuredCell(parts[1]); - j = 2; - sheetobj.CellFromStringParts(cell, parts, j); - break; - - case "col": - coord = parts[1]; - j = 2; - while ((t = parts[j++])) { - switch (t) { - case "w": - sheetobj.colattribs.width[coord] = parts[j++]; // must be text - could be auto or %, etc. - break; - case "hide": - sheetobj.colattribs.hide[coord] = parts[j++]; - break; - default: - throw scc.s_pssUnknownColType + " '" + t + "'"; - break; - } - } - break; - - case "row": - coord = parts[1] - 0; - j = 2; - while ((t = parts[j++])) { - switch (t) { - case "h": - sheetobj.rowattribs.height[coord] = parts[j++] - 0; - break; - case "hide": - sheetobj.rowattribs.hide[coord] = parts[j++]; - break; - default: - throw scc.s_pssUnknownRowType + " '" + t + "'"; - break; - } - } - break; - - case "sheet": - attribs = sheetobj.attribs; - j = 1; - while ((t = parts[j++])) { - switch (t) { - case "c": - attribs.lastcol = parts[j++] - 0; - break; - case "r": - attribs.lastrow = parts[j++] - 0; - break; - case "w": - attribs.defaultcolwidth = parts[j++] + ""; - break; - case "h": - attribs.defaultrowheight = parts[j++] - 0; - break; - case "tf": - attribs.defaulttextformat = parts[j++] - 0; - break; - case "ntf": - attribs.defaultnontextformat = parts[j++] - 0; - break; - case "layout": - attribs.defaultlayout = parts[j++] - 0; - break; - case "font": - attribs.defaultfont = parts[j++] - 0; - break; - case "tvf": - attribs.defaulttextvalueformat = parts[j++] - 0; - break; - case "ntvf": - attribs.defaultnontextvalueformat = parts[j++] - 0; - break; - case "color": - attribs.defaultcolor = parts[j++] - 0; - break; - case "bgcolor": - attribs.defaultbgcolor = parts[j++] - 0; - break; - case "circularreferencecell": - attribs.circularreferencecell = parts[j++]; - break; - case "recalc": - attribs.recalc = parts[j++]; - break; - case "needsrecalc": - attribs.needsrecalc = parts[j++]; - break; - default: - j += 1; - break; - } - } - break; - - case "name": - name = SocialCalc.decodeFromSave(parts[1]).toUpperCase(); - sheetobj.names[name] = { desc: SocialCalc.decodeFromSave(parts[2]) }; - sheetobj.names[name].definition = SocialCalc.decodeFromSave(parts[3]); - break; - - case "layout": - parts = lines[i].match(/^layout\:(\d+)\:(.+)$/); // layouts can have ":" in them - sheetobj.layouts[parts[1] - 0] = parts[2]; - sheetobj.layouthash[parts[2]] = parts[1] - 0; - break; - - case "font": - sheetobj.fonts[parts[1] - 0] = parts[2]; - sheetobj.fonthash[parts[2]] = parts[1] - 0; - break; - - case "color": - sheetobj.colors[parts[1] - 0] = parts[2]; - sheetobj.colorhash[parts[2]] = parts[1] - 0; - break; - - case "border": - sheetobj.borderstyles[parts[1] - 0] = parts[2]; - sheetobj.borderstylehash[parts[2]] = parts[1] - 0; - break; - - case "cellformat": - v = SocialCalc.decodeFromSave(parts[2]); - sheetobj.cellformats[parts[1] - 0] = v; - sheetobj.cellformathash[v] = parts[1] - 0; - break; - - case "valueformat": - v = SocialCalc.decodeFromSave(parts[2]); - sheetobj.valueformats[parts[1] - 0] = v; - sheetobj.valueformathash[v] = parts[1] - 0; - break; - - case "version": - break; - - case "copiedfrom": - sheetobj.copiedfrom = parts[1] + ":" + parts[2]; - break; - - case "clipboardrange": // in save versions up to 1.3. Ignored. - case "clipboard": - break; - - case "": - break; - - default: - alert(scc.s_pssUnknownLineType + " '" + parts[0] + "'"); - throw scc.s_pssUnknownLineType + " '" + parts[0] + "'"; - break; - } - parts = null; - } - }; - - // - // SocialCalc.CellFromStringParts(sheet, cell, parts, j) - // - // Takes string that has been split by ":" in parts, starting at item j, - // and fills in cell assuming save format. - // - - SocialCalc.CellFromStringParts = function (sheet, cell, parts, j) { - var cell, t, v; - - while ((t = parts[j++])) { - switch (t) { - case "v": - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - cell.datatype = "v"; - cell.valuetype = "n"; - break; - case "t": - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - cell.datatype = "t"; - cell.valuetype = SocialCalc.Constants.textdatadefaulttype; - break; - case "vt": - v = parts[j++]; - cell.valuetype = v; - if (v.charAt(0) == "n") { - cell.datatype = "v"; - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - } else { - cell.datatype = "t"; - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - } - break; - case "vtf": - v = parts[j++]; - cell.valuetype = v; - if (v.charAt(0) == "n") { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - } else { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - } - cell.formula = SocialCalc.decodeFromSave(parts[j++]); - cell.datatype = "f"; - break; - case "vtc": - v = parts[j++]; - cell.valuetype = v; - if (v.charAt(0) == "n") { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - } else { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - } - cell.formula = SocialCalc.decodeFromSave(parts[j++]); - cell.datatype = "c"; - break; - case "e": - cell.errors = SocialCalc.decodeFromSave(parts[j++]); - break; - case "b": - cell.bt = parts[j++] - 0; - cell.br = parts[j++] - 0; - cell.bb = parts[j++] - 0; - cell.bl = parts[j++] - 0; - break; - case "l": - cell.layout = parts[j++] - 0; - break; - case "f": - cell.font = parts[j++] - 0; - break; - case "c": - cell.color = parts[j++] - 0; - break; - case "bg": - cell.bgcolor = parts[j++] - 0; - break; - case "cf": - cell.cellformat = parts[j++] - 0; - break; - case "ntvf": - cell.nontextvalueformat = parts[j++] - 0; - break; - case "tvf": - cell.textvalueformat = parts[j++] - 0; - break; - case "colspan": - cell.colspan = parts[j++] - 0; - break; - case "rowspan": - cell.rowspan = parts[j++] - 0; - break; - case "cssc": - cell.cssc = parts[j++]; - break; - case "csss": - cell.csss = SocialCalc.decodeFromSave(parts[j++]); - break; - case "mod": - j += 1; - break; - case "comment": - cell.comment = SocialCalc.decodeFromSave(parts[j++]); - break; - default: - throw SocialCalc.Constants.s_cfspUnknownCellType + " '" + t + "'"; - break; - } - } - }; - - SocialCalc.sheetfields = [ - "defaultrowheight", - "defaultcolwidth", - "circularreferencecell", - "recalc", - "needsrecalc", - ]; - SocialCalc.sheetfieldsshort = [ - "h", - "w", - "circularreferencecell", - "recalc", - "needsrecalc", - ]; - - SocialCalc.sheetfieldsxlat = [ - "defaulttextformat", - "defaultnontextformat", - "defaulttextvalueformat", - "defaultnontextvalueformat", - "defaultcolor", - "defaultbgcolor", - "defaultfont", - "defaultlayout", - ]; - SocialCalc.sheetfieldsxlatshort = [ - "tf", - "ntf", - "tvf", - "ntvf", - "color", - "bgcolor", - "font", - "layout", - ]; - SocialCalc.sheetfieldsxlatxlt = [ - "cellformat", - "cellformat", - "valueformat", - "valueformat", - "color", - "color", - "font", - "layout", - ]; - - // - // sheetstr = SocialCalc.CreateSheetSave(sheetobj, range, canonicalize) - // - // Creates a text representation of the sheetobj data. - // If the range is present then only those cells are saved - // (as clipboard data with "copiedfrom" set). - // - - SocialCalc.CreateSheetSave = function (sheetobj, range, canonicalize) { - var cell, - cr1, - cr2, - row, - col, - coord, - attrib, - line, - value, - formula, - i, - t, - r, - b, - l, - name, - blanklen; - var result = []; - - var prange; - - sheetobj.CanonicalizeSheet( - canonicalize || SocialCalc.Constants.doCanonicalizeSheet - ); - var xlt = sheetobj.xlt; - - if (range) { - prange = SocialCalc.ParseRange(range); - } else { - prange = { - cr1: { row: 1, col: 1 }, - cr2: { row: xlt.maxrow, col: xlt.maxcol }, - }; - } - cr1 = prange.cr1; - cr2 = prange.cr2; - - result.push("version:1.5"); - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - coord = SocialCalc.crToCoord(col, row); - cell = sheetobj.cells[coord]; - if (!cell) continue; - line = sheetobj.CellToString(cell); - if (line.length == 0) continue; // ignore completely empty cells - line = "cell:" + coord + line; - result.push(line); - } - } - - for (col = 1; col <= xlt.maxcol; col++) { - coord = SocialCalc.rcColname(col); - if (sheetobj.colattribs.width[coord]) - result.push("col:" + coord + ":w:" + sheetobj.colattribs.width[coord]); - if (sheetobj.colattribs.hide[coord]) - result.push( - "col:" + coord + ":hide:" + sheetobj.colattribs.hide[coord] - ); - } - - for (row = 1; row <= xlt.maxrow; row++) { - if (sheetobj.rowattribs.height[row]) - result.push("row:" + row + ":h:" + sheetobj.rowattribs.height[row]); - if (sheetobj.rowattribs.hide[row]) - result.push("row:" + row + ":hide:" + sheetobj.rowattribs.hide[row]); - } - - line = "sheet:c:" + xlt.maxcol + ":r:" + xlt.maxrow; - - for (i = 0; i < SocialCalc.sheetfields.length; i++) { - // non-xlated values - value = SocialCalc.encodeForSave( - sheetobj.attribs[SocialCalc.sheetfields[i]] - ); - if (value) line += ":" + SocialCalc.sheetfieldsshort[i] + ":" + value; - } - for (i = 0; i < SocialCalc.sheetfieldsxlat.length; i++) { - // xlated values - value = sheetobj.attribs[SocialCalc.sheetfieldsxlat[i]]; - if (value) - line += - ":" + - SocialCalc.sheetfieldsxlatshort[i] + - ":" + - xlt[SocialCalc.sheetfieldsxlatxlt[i] + "sxlat"][value]; - } - - result.push(line); - - for (i = 1; i < xlt.newborderstyles.length; i++) { - result.push("border:" + i + ":" + xlt.newborderstyles[i]); - } - - for (i = 1; i < xlt.newcellformats.length; i++) { - result.push( - "cellformat:" + - i + - ":" + - SocialCalc.encodeForSave(xlt.newcellformats[i]) - ); - } - - for (i = 1; i < xlt.newcolors.length; i++) { - result.push("color:" + i + ":" + xlt.newcolors[i]); - } - - for (i = 1; i < xlt.newfonts.length; i++) { - result.push("font:" + i + ":" + xlt.newfonts[i]); - } - - for (i = 1; i < xlt.newlayouts.length; i++) { - result.push("layout:" + i + ":" + xlt.newlayouts[i]); - } - - for (i = 1; i < xlt.newvalueformats.length; i++) { - result.push( - "valueformat:" + - i + - ":" + - SocialCalc.encodeForSave(xlt.newvalueformats[i]) - ); - } - - for (i = 0; i < xlt.namesorder.length; i++) { - name = xlt.namesorder[i]; - result.push( - "name:" + - SocialCalc.encodeForSave(name).toUpperCase() + - ":" + - SocialCalc.encodeForSave(sheetobj.names[name].desc) + - ":" + - SocialCalc.encodeForSave(sheetobj.names[name].definition) - ); - } - - if (range) { - result.push( - "copiedfrom:" + - SocialCalc.crToCoord(cr1.col, cr1.row) + - ":" + - SocialCalc.crToCoord(cr2.col, cr2.row) - ); - } - - result.push(""); // one extra to get extra \n - - delete sheetobj.xlt; // clean up - - return result.join("\n"); - }; - - // - // line = SocialCalc.CellToString(sheet, cell) - // - - SocialCalc.CellToString = function (sheet, cell) { - var cell, line, value, formula, t, r, b, l, xlt; - - line = ""; - - if (!cell) return line; - - value = SocialCalc.encodeForSave(cell.datavalue); - if (cell.datatype == "v") { - if (cell.valuetype == "n") line += ":v:" + value; - else line += ":vt:" + cell.valuetype + ":" + value; - } else if (cell.datatype == "t") { - if (cell.valuetype == SocialCalc.Constants.textdatadefaulttype) - line += ":t:" + value; - else line += ":vt:" + cell.valuetype + ":" + value; - } else { - formula = SocialCalc.encodeForSave(cell.formula); - if (cell.datatype == "f") { - line += ":vtf:" + cell.valuetype + ":" + value + ":" + formula; - } else if (cell.datatype == "c") { - line += ":vtc:" + cell.valuetype + ":" + value + ":" + formula; - } - } - if (cell.errors) { - line += ":e:" + SocialCalc.encodeForSave(cell.errors); - } - t = cell.bt || ""; - r = cell.br || ""; - b = cell.bb || ""; - l = cell.bl || ""; - - if (sheet.xlt) { - // if have canonical save info - xlt = sheet.xlt; - if (t || r || b || l) - line += - ":b:" + - xlt.borderstylesxlat[t || 0] + - ":" + - xlt.borderstylesxlat[r || 0] + - ":" + - xlt.borderstylesxlat[b || 0] + - ":" + - xlt.borderstylesxlat[l || 0]; - if (cell.layout) line += ":l:" + xlt.layoutsxlat[cell.layout]; - if (cell.font) line += ":f:" + xlt.fontsxlat[cell.font]; - if (cell.color) line += ":c:" + xlt.colorsxlat[cell.color]; - if (cell.bgcolor) line += ":bg:" + xlt.colorsxlat[cell.bgcolor]; - if (cell.cellformat) - line += ":cf:" + xlt.cellformatsxlat[cell.cellformat]; - if (cell.textvalueformat) - line += ":tvf:" + xlt.valueformatsxlat[cell.textvalueformat]; - if (cell.nontextvalueformat) - line += ":ntvf:" + xlt.valueformatsxlat[cell.nontextvalueformat]; - } else { - if (t || r || b || l) line += ":b:" + t + ":" + r + ":" + b + ":" + l; - if (cell.layout) line += ":l:" + cell.layout; - if (cell.font) line += ":f:" + cell.font; - if (cell.color) line += ":c:" + cell.color; - if (cell.bgcolor) line += ":bg:" + cell.bgcolor; - if (cell.cellformat) line += ":cf:" + cell.cellformat; - if (cell.textvalueformat) line += ":tvf:" + cell.textvalueformat; - if (cell.nontextvalueformat) line += ":ntvf:" + cell.nontextvalueformat; - } - if (cell.colspan) line += ":colspan:" + cell.colspan; - if (cell.rowspan) line += ":rowspan:" + cell.rowspan; - if (cell.cssc) line += ":cssc:" + cell.cssc; - if (cell.csss) line += ":csss:" + SocialCalc.encodeForSave(cell.csss); - if (cell.mod) line += ":mod:" + cell.mod; - if (cell.comment) - line += ":comment:" + SocialCalc.encodeForSave(cell.comment); - - return line; - }; - - // - // SocialCalc.CanonicalizeSheet(sheetobj, full) - // - // Goes through the sheet and fills in sheetobj.xlt with the following: - // - // .maxrow, .maxcol - lastrow and lastcol are as small as possible - // .newlayouts - new version of sheetobj.layouts without unused ones and all in ascending order - // .layoutsxlat - maps old layouts index to new one - // same ".new" and ".xlat" for fonts, colors, borderstyles, cell and value formats - // .namesorder - array with names sorted - // - // If full or SocialCalc.Constants.doCanonicalizeSheet are not true, then the values will leave things unchanged (to save time, etc.) - // - // sheetobj.xlt should be deleted when you are finished using it - // - - SocialCalc.CanonicalizeSheet = function (sheetobj, full) { - var l, coord, cr, cell, filled, an, a, newa, newxlat, used, ahash, i, v; - var maxrow = 0; - var maxcol = 0; - var alist = [ - "borderstyle", - "cellformat", - "color", - "font", - "layout", - "valueformat", - ]; - - var xlt = {}; - - xlt.namesorder = []; // always return a sorted list - for (a in sheetobj.names) { - xlt.namesorder.push(a); - } - xlt.namesorder.sort(); - - if (!SocialCalc.Constants.doCanonicalizeSheet || !full) { - // return make-no-changes values if not wanted - for (an = 0; an < alist.length; an++) { - a = alist[an]; - xlt["new" + a + "s"] = sheetobj[a + "s"]; - l = sheetobj[a + "s"].length; - newxlat = new Array(l); - newxlat[0] = ""; - for (i = 1; i < l; i++) { - newxlat[i] = i; - } - xlt[a + "sxlat"] = newxlat; - } - - xlt.maxrow = sheetobj.attribs.lastrow; - xlt.maxcol = sheetobj.attribs.lastcol; - - sheetobj.xlt = xlt; - - return; - } - - for (an = 0; an < alist.length; an++) { - a = alist[an]; - xlt[a + "sUsed"] = {}; - } - - var colorsUsed = xlt.colorsUsed; - var borderstylesUsed = xlt.borderstylesUsed; - var fontsUsed = xlt.fontsUsed; - var layoutsUsed = xlt.layoutsUsed; - var cellformatsUsed = xlt.cellformatsUsed; - var valueformatsUsed = xlt.valueformatsUsed; - - for (coord in sheetobj.cells) { - // check all cells to see which values are used - cr = SocialCalc.coordToCr(coord); - cell = sheetobj.cells[coord]; - filled = false; - - if (cell.valuetype && cell.valuetype != "b") filled = true; - - if (cell.color) { - colorsUsed[cell.color] = 1; - filled = true; - } - - if (cell.bgcolor) { - colorsUsed[cell.bgcolor] = 1; - filled = true; - } - - if (cell.bt) { - borderstylesUsed[cell.bt] = 1; - filled = true; - } - if (cell.br) { - borderstylesUsed[cell.br] = 1; - filled = true; - } - if (cell.bb) { - borderstylesUsed[cell.bb] = 1; - filled = true; - } - if (cell.bl) { - borderstylesUsed[cell.bl] = 1; - filled = true; - } - - if (cell.layout) { - layoutsUsed[cell.layout] = 1; - filled = true; - } - - if (cell.font) { - fontsUsed[cell.font] = 1; - filled = true; - } - - if (cell.cellformat) { - cellformatsUsed[cell.cellformat] = 1; - filled = true; - } - - if (cell.textvalueformat) { - valueformatsUsed[cell.textvalueformat] = 1; - filled = true; - } - - if (cell.nontextvalueformat) { - valueformatsUsed[cell.nontextvalueformat] = 1; - filled = true; - } - - if (filled) { - if (cr.row > maxrow) maxrow = cr.row; - if (cr.col > maxcol) maxcol = cr.col; - } - } - - for (i = 0; i < SocialCalc.sheetfieldsxlat.length; i++) { - // do sheet values, too - v = sheetobj.attribs[SocialCalc.sheetfieldsxlat[i]]; - if (v) { - xlt[SocialCalc.sheetfieldsxlatxlt[i] + "sUsed"][v] = 1; - } - } - - a = { height: 1, hide: 1 }; // look at explicit row settings - for (v in a) { - for (cr in sheetobj.rowattribs[v]) { - if (cr > maxrow) maxrow = cr; - } - } - a = { hide: 1, width: 1 }; // look at explicit col settings - for (v in a) { - for (coord in sheetobj.colattribs[v]) { - cr = SocialCalc.coordToCr(coord + "1"); - if (cr.col > maxcol) maxcol = cr.col; - } - } - - for (an = 0; an < alist.length; an++) { - // go through the attribs we want - a = alist[an]; - - newa = []; - used = xlt[a + "sUsed"]; - for (v in used) { - newa.push(sheetobj[a + "s"][v]); - } - newa.sort(); - newa.unshift(""); - - newxlat = [""]; - ahash = sheetobj[a + "hash"]; - - for (i = 1; i < newa.length; i++) { - newxlat[ahash[newa[i]]] = i; - } - - xlt[a + "sxlat"] = newxlat; - xlt["new" + a + "s"] = newa; - } - - xlt.maxrow = maxrow || 1; - xlt.maxcol = maxcol || 1; - - sheetobj.xlt = xlt; // leave for use by caller - }; - - // - // result = SocialCalc.EncodeCellAttributes(sheet, coord) - // - // Returns the cell's attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - - SocialCalc.EncodeCellAttributes = function (sheet, coord) { - var value, i, b, bb, parts; - var result = {}; - - var InitAttrib = function (name) { - result[name] = { def: true, val: "" }; - }; - - var InitAttribs = function (namelist) { - for (var i = 0; i < namelist.length; i++) { - InitAttrib(namelist[i]); - } - }; - - var SetAttrib = function (name, v) { - result[name].def = false; - result[name].val = v || ""; - }; - - var SetAttribStar = function (name, v) { - if (v == "*") return; - result[name].def = false; - result[name].val = v; - }; - - var cell = sheet.GetAssuredCell(coord); - - // cellformat: alignhoriz - - InitAttrib("alignhoriz"); - if (cell.cellformat) { - SetAttrib("alignhoriz", sheet.cellformats[cell.cellformat]); - } - - // layout: alignvert, padtop, padright, padbottom, padleft - - InitAttribs(["alignvert", "padtop", "padright", "padbottom", "padleft"]); - if (cell.layout) { - parts = sheet.layouts[cell.layout].match( - /^padding:\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+);vertical-align:\s*(\S+);/ - ); - SetAttribStar("padtop", parts[1]); - SetAttribStar("padright", parts[2]); - SetAttribStar("padbottom", parts[3]); - SetAttribStar("padleft", parts[4]); - SetAttribStar("alignvert", parts[5]); - } - - // font: fontfamily, fontlook, fontsize - - InitAttribs(["fontfamily", "fontlook", "fontsize"]); - if (cell.font) { - parts = sheet.fonts[cell.font].match(/^(\*|\S+? \S+?) (\S+?) (\S.*)$/); - SetAttribStar("fontfamily", parts[3]); - SetAttribStar("fontsize", parts[2]); - SetAttribStar("fontlook", parts[1]); - } - - // color: textcolor - - InitAttrib("textcolor"); - if (cell.color) { - SetAttrib("textcolor", sheet.colors[cell.color]); - } - - // bgcolor: bgcolor - - InitAttrib("bgcolor"); - if (cell.bgcolor) { - SetAttrib("bgcolor", sheet.colors[cell.bgcolor]); - } - - // formatting: numberformat, textformat - - InitAttribs(["numberformat", "textformat"]); - if (cell.nontextvalueformat) { - SetAttrib("numberformat", sheet.valueformats[cell.nontextvalueformat]); - } - if (cell.textvalueformat) { - SetAttrib("textformat", sheet.valueformats[cell.textvalueformat]); - } - - // merges: colspan, rowspan - - InitAttribs(["colspan", "rowspan"]); - SetAttrib("colspan", cell.colspan || 1); - SetAttrib("rowspan", cell.rowspan || 1); - - // borders: bXthickness, bXstyle, bXcolor for X = t, r, b, and l - - for (i = 0; i < 4; i++) { - b = "trbl".charAt(i); - bb = "b" + b; - InitAttrib(bb); - SetAttrib(bb, cell[bb] ? sheet.borderstyles[cell[bb]] : ""); - InitAttrib(bb + "thickness"); - InitAttrib(bb + "style"); - InitAttrib(bb + "color"); - if (cell[bb]) { - parts = sheet.borderstyles[cell[bb]].match(/(\S+)\s+(\S+)\s+(\S.+)/); - SetAttrib(bb + "thickness", parts[1]); - SetAttrib(bb + "style", parts[2]); - SetAttrib(bb + "color", parts[3]); - } - } - - // misc: cssc, csss, mod - - InitAttribs(["cssc", "csss", "mod"]); - SetAttrib("cssc", cell.cssc || ""); - SetAttrib("csss", cell.csss || ""); - SetAttrib("mod", cell.mod || "n"); - - return result; - }; - - // - // result = SocialCalc.EncodeSheetAttributes(sheet) - // - // Returns the sheet's attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - - SocialCalc.EncodeSheetAttributes = function (sheet) { - var value; - var attribs = sheet.attribs; - var result = {}; - - var InitAttrib = function (name) { - result[name] = { def: true, val: "" }; - }; - - var InitAttribs = function (namelist) { - for (var i = 0; i < namelist.length; i++) { - InitAttrib(namelist[i]); - } - }; - - var SetAttrib = function (name, v) { - result[name].def = false; - result[name].val = v || value; - }; - - var SetAttribStar = function (name, v) { - if (v == "*") return; - result[name].def = false; - result[name].val = v; - }; - - // sizes: colwidth, rowheight - - InitAttrib("colwidth"); - if (attribs.defaultcolwidth) { - SetAttrib("colwidth", attribs.defaultcolwidth); - } - - InitAttrib("rowheight"); - if (attribs.rowheight) { - SetAttrib("rowheight", attribs.defaultrowheight); - } - - // cellformat: textalignhoriz, numberalignhoriz - - InitAttrib("textalignhoriz"); - if (attribs.defaulttextformat) { - SetAttrib("textalignhoriz", sheet.cellformats[attribs.defaulttextformat]); - } - - InitAttrib("numberalignhoriz"); - if (attribs.defaultnontextformat) { - SetAttrib( - "numberalignhoriz", - sheet.cellformats[attribs.defaultnontextformat] - ); - } - - // layout: alignvert, padtop, padright, padbottom, padleft - - InitAttribs(["alignvert", "padtop", "padright", "padbottom", "padleft"]); - if (attribs.defaultlayout) { - parts = sheet.layouts[attribs.defaultlayout].match( - /^padding:\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+);vertical-align:\s*(\S+);/ - ); - SetAttribStar("padtop", parts[1]); - SetAttribStar("padright", parts[2]); - SetAttribStar("padbottom", parts[3]); - SetAttribStar("padleft", parts[4]); - SetAttribStar("alignvert", parts[5]); - } - - // font: fontfamily, fontlook, fontsize - - InitAttribs(["fontfamily", "fontlook", "fontsize"]); - if (attribs.defaultfont) { - parts = sheet.fonts[attribs.defaultfont].match( - /^(\*|\S+? \S+?) (\S+?) (\S.*)$/ - ); - SetAttribStar("fontfamily", parts[3]); - SetAttribStar("fontsize", parts[2]); - SetAttribStar("fontlook", parts[1]); - } - - // color: textcolor - - InitAttrib("textcolor"); - if (attribs.defaultcolor) { - SetAttrib("textcolor", sheet.colors[attribs.defaultcolor]); - } - - // bgcolor: bgcolor - - InitAttrib("bgcolor"); - if (attribs.defaultbgcolor) { - SetAttrib("bgcolor", sheet.colors[attribs.defaultbgcolor]); - } - - // formatting: numberformat, textformat - - InitAttribs(["numberformat", "textformat"]); - if (attribs.defaultnontextvalueformat) { - SetAttrib( - "numberformat", - sheet.valueformats[attribs.defaultnontextvalueformat] - ); - } - if (attribs.defaulttextvalueformat) { - SetAttrib( - "textformat", - sheet.valueformats[attribs.defaulttextvalueformat] - ); - } - - // recalc: recalc - - InitAttrib("recalc"); - if (attribs.recalc) { - SetAttrib("recalc", attribs.recalc); - } - - return result; - }; - - // - // cmdstr = SocialCalc.DecodeCellAttributes(sheet, coord, attribs, range) - // - // Takes cell attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - // and returns the sheet commands to make the actual attributes correspond. - // Returns a non-null string if any commands are to be executed, null otherwise. - // - // If range is provided, the commands are executed on the whole range. - // - - SocialCalc.DecodeCellAttributes = function (sheet, coord, newattribs, range) { - var value, b, bb; - - var cell = sheet.GetAssuredCell(coord); - - var changed = false; - - var CheckChanges = function (attribname, oldval, cmdname) { - var val; - if (newattribs[attribname]) { - if (newattribs[attribname].def) { - val = ""; - } else { - val = newattribs[attribname].val; - } - if (val != (oldval || "")) { - DoCmd(cmdname + " " + val); - } - } - }; - - var cmdstr = ""; - - var DoCmd = function (str) { - if (cmdstr) cmdstr += "\n"; - cmdstr += "set " + (range || coord) + " " + str; - changed = true; - }; - - // cellformat: alignhoriz - - CheckChanges( - "alignhoriz", - sheet.cellformats[cell.cellformat], - "cellformat" - ); - - // layout: alignvert, padtop, padright, padbottom, padleft - - if ( - !newattribs.alignvert.def || - !newattribs.padtop.def || - !newattribs.padright.def || - !newattribs.padbottom.def || - !newattribs.padleft.def - ) { - value = - "padding:" + - (newattribs.padtop.def ? "* " : newattribs.padtop.val + " ") + - (newattribs.padright.def ? "* " : newattribs.padright.val + " ") + - (newattribs.padbottom.def ? "* " : newattribs.padbottom.val + " ") + - (newattribs.padleft.def ? "*" : newattribs.padleft.val) + - ";vertical-align:" + - (newattribs.alignvert.def ? "*;" : newattribs.alignvert.val + ";"); - } else { - value = ""; - } - - if (value != (sheet.layouts[cell.layout] || "")) { - DoCmd("layout " + value); - } - - // font: fontfamily, fontlook, fontsize - - if ( - !newattribs.fontlook.def || - !newattribs.fontsize.def || - !newattribs.fontfamily.def - ) { - value = - (newattribs.fontlook.def ? "* " : newattribs.fontlook.val + " ") + - (newattribs.fontsize.def ? "* " : newattribs.fontsize.val + " ") + - (newattribs.fontfamily.def ? "*" : newattribs.fontfamily.val); - } else { - value = ""; - } - - if (value != (sheet.fonts[cell.font] || "")) { - DoCmd("font " + value); - } - - // color: textcolor - - CheckChanges("textcolor", sheet.colors[cell.color], "color"); - - // bgcolor: bgcolor - - CheckChanges("bgcolor", sheet.colors[cell.bgcolor], "bgcolor"); - - // formatting: numberformat, textformat - - CheckChanges( - "numberformat", - sheet.valueformats[cell.nontextvalueformat], - "nontextvalueformat" - ); - - CheckChanges( - "textformat", - sheet.valueformats[cell.textvalueformat], - "textvalueformat" - ); - - // merges: colspan, rowspan - NOT HANDLED: IGNORED! - - // borders: bX for X = t, r, b, and l; bXthickness, bXstyle, bXcolor ignored - - for (var i = 0; i < 4; i++) { - b = "trbl".charAt(i); - bb = "b" + b; - CheckChanges(bb, sheet.borderstyles[cell[bb]], bb); - } - - // misc: cssc, csss, mod - - CheckChanges("cssc", cell.cssc, "cssc"); - - CheckChanges("csss", cell.csss, "csss"); - - if (newattribs.mod) { - if (newattribs.mod.def) { - value = "n"; - } else { - value = newattribs.mod.val; - } - if (value != (cell.mod || "n")) { - if (value == "n") value = ""; // restrict to "y" and "" normally - DoCmd("mod " + value); - } - } - - // if any changes return command(s) - - if (changed) { - return cmdstr; - } else { - return null; - } - }; - - // - // changed = SocialCalc.DecodeSheetAttributes(sheet, newattribs) - // - // Takes sheet attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - // and returns the sheet commands to make the actual attributes correspond. - // Returns a non-null string if any commands were executed, null otherwise. - // - - SocialCalc.DecodeSheetAttributes = function (sheet, newattribs) { - var value; - var attribs = sheet.attribs; - var changed = false; - - var CheckChanges = function (attribname, oldval, cmdname) { - var val; - if (newattribs[attribname]) { - if (newattribs[attribname].def) { - val = ""; - } else { - val = newattribs[attribname].val; - } - if (val != (oldval || "")) { - DoCmd(cmdname + " " + val); - } - } - }; - - var cmdstr = ""; - - var DoCmd = function (str) { - if (cmdstr) cmdstr += "\n"; - cmdstr += "set sheet " + str; - changed = true; - }; - - // sizes: colwidth, rowheight - - CheckChanges("colwidth", attribs.defaultcolwidth, "defaultcolwidth"); - - CheckChanges("rowheight", attribs.defaultrowheight, "defaultrowheight"); - - // cellformat: textalignhoriz, numberalignhoriz - - CheckChanges( - "textalignhoriz", - sheet.cellformats[attribs.defaulttextformat], - "defaulttextformat" - ); - - CheckChanges( - "numberalignhoriz", - sheet.cellformats[attribs.defaultnontextformat], - "defaultnontextformat" - ); - - // layout: alignvert, padtop, padright, padbottom, padleft - - if ( - !newattribs.alignvert.def || - !newattribs.padtop.def || - !newattribs.padright.def || - !newattribs.padbottom.def || - !newattribs.padleft.def - ) { - value = - "padding:" + - (newattribs.padtop.def ? "* " : newattribs.padtop.val + " ") + - (newattribs.padright.def ? "* " : newattribs.padright.val + " ") + - (newattribs.padbottom.def ? "* " : newattribs.padbottom.val + " ") + - (newattribs.padleft.def ? "*" : newattribs.padleft.val) + - ";vertical-align:" + - (newattribs.alignvert.def ? "*;" : newattribs.alignvert.val + ";"); - } else { - value = ""; - } - - if (value != (sheet.layouts[attribs.defaultlayout] || "")) { - DoCmd("defaultlayout " + value); - } - - // font: fontfamily, fontlook, fontsize - - if ( - !newattribs.fontlook.def || - !newattribs.fontsize.def || - !newattribs.fontfamily.def - ) { - value = - (newattribs.fontlook.def ? "* " : newattribs.fontlook.val + " ") + - (newattribs.fontsize.def ? "* " : newattribs.fontsize.val + " ") + - (newattribs.fontfamily.def ? "*" : newattribs.fontfamily.val); - } else { - value = ""; - } - - if (value != (sheet.fonts[attribs.defaultfont] || "")) { - DoCmd("defaultfont " + value); - } - - // color: textcolor - - CheckChanges( - "textcolor", - sheet.colors[attribs.defaultcolor], - "defaultcolor" - ); - - // bgcolor: bgcolor - - CheckChanges( - "bgcolor", - sheet.colors[attribs.defaultbgcolor], - "defaultbgcolor" - ); - - // formatting: numberformat, textformat - - CheckChanges( - "numberformat", - sheet.valueformats[attribs.defaultnontextvalueformat], - "defaultnontextvalueformat" - ); - - CheckChanges( - "textformat", - sheet.valueformats[attribs.defaulttextvalueformat], - "defaulttextvalueformat" - ); - - // recalc: recalc - - CheckChanges("recalc", sheet.attribs.recalc, "recalc"); - - // if any changes return command(s) - - if (changed) { - return cmdstr; - } else { - return null; - } - }; - - // ************************************* - // - // Sheet command routines - // - // ************************************* - - // - // SocialCalc.SheetCommandInfo - object with information used during command execution - // - - SocialCalc.SheetCommandInfo = { - // only one of these - - sheetobj: null, // sheet being operated on - parseobj: null, // SocialCalc.Parse object with the command string, etc. - timerobj: null, // used for timeslicing - firsttimerdelay: 50, // wait before starting cmds (for Chrome - to give time to update) - timerdelay: 1, // wait between slices - maxtimeslice: 100, // do another slice after this many milliseconds - saveundo: false, // arg for ExecuteSheetCommand - - CmdExtensionCallbacks: {}, // for startcmdextension, in form: cmdname, {func:function(cmdname, data, sheet, SocialCalc.Parse object, saveundo), data:whatever} - cmdextensionbusy: "", // if length>0, command loop waits for SocialCalc.ResumeFromCmdExtension() - - // statuscallback: null, // called during execution - obsolete: use sheet obj's - // statuscallbackparams: null - }; - - // - // SocialCalc.ScheduleSheetCommands - // - // statuscallback is called at the beginning (cmdstart) and end (cmdend). - // - - SocialCalc.ScheduleSheetCommands = function ( - sheet, - cmdstr, - saveundo, - isRemote - ) { - if (SocialCalc.Callbacks.broadcast && !isRemote) { - if ( - cmdstr != "redisplay" && - cmdstr != "set sheet defaulttextvalueformat text-wiki" && - cmdstr != "recalc" - ) { - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "scmd", - id: sheet.sheetid, - cmdstr: cmdstr, - saveundo: saveundo, - }); - } - } - - var sci = SocialCalc.SheetCommandInfo; - - sci.sheetobj = sheet; - sci.parseobj = new SocialCalc.Parse(cmdstr); - sci.saveundo = saveundo; - - if (sci.sheetobj.statuscallback) { - // notify others if requested - sheet.statuscallback( - sci, - "cmdstart", - "", - sci.sheetobj.statuscallbackparams - ); - } - - if (sci.saveundo) { - sci.sheetobj.changes.PushChange(""); // add a step to undo stack - } - - sci.timerobj = window.setTimeout( - SocialCalc.SheetCommandsTimerRoutine, - sci.firsttimerdelay - ); - }; - - SocialCalc.SheetCommandsTimerRoutine = function () { - var errortext; - var sci = SocialCalc.SheetCommandInfo; - var starttime = new Date(); - - sci.timerobj = null; - - while (!sci.parseobj.EOF()) { - // go through all commands (separated by newlines) - - errortext = SocialCalc.ExecuteSheetCommand( - sci.sheetobj, - sci.parseobj, - sci.saveundo - ); - if (errortext) alert(errortext); - - sci.parseobj.NextLine(); - - if (sci.cmdextensionbusy.length > 0) { - // forced wait - if (sci.sheetobj.statuscallback) { - // notify others if requested - sci.sheetobj.statuscallback( - sci, - "cmdextension", - sci.cmdextensionbusy, - sci.sheetobj.statuscallbackparams - ); - } - return; - } - - if (new Date() - starttime >= sci.maxtimeslice) { - // if taking too long, give up CPU for a while - sci.timerobj = window.setTimeout( - SocialCalc.SheetCommandsTimerRoutine, - sci.timerdelay - ); - return; - } - } - - if (sci.sheetobj.statuscallback) { - // notify others if requested - sci.sheetobj.statuscallback( - sci, - "cmdend", - "", - sci.sheetobj.statuscallbackparams - ); - } - }; - - SocialCalc.ResumeFromCmdExtension = function () { - var sci = SocialCalc.SheetCommandInfo; - - sci.cmdextensionbusy = ""; - - SocialCalc.SheetCommandsTimerRoutine(); - }; - - // - // errortext = SocialCalc.ExecuteSheetCommand(sheet, cmd, saveundo) - // - // cmd is a SocialCalc.Parse object. - // - // Executes commands that modify the sheet data. - // Sets sheet "needsrecalc" as needed. - // Sets sheet "changedrendervalues" as needed. - // - // The cmd string may be multiple commands, separated by newlines. In that case - // only one "step" is put on the undo stack representing all the commands. - // Note that because of this, in "set A1 text ..." and "set A1 comment ..." text is - // treated as encoded (newline => \n, \ => \b, : => \c). - // - // The commands are in the forms: - // - // set sheet attributename value (plus lastcol and lastrow) - // set 22 attributename value - // set B attributename value - // set A1 attributename value1 value2... (see each attribute in code for details) - // set A1:B5 attributename value1 value2... - // erase/copy/cut/paste/fillright/filldown A1:B5 all/formulas/format - // loadclipboard save-encoded-clipboard-data - // clearclipboard - // merge C3:F3 - // unmerge C3 - // insertcol/insertrow C5 - // deletecol/deleterow C5:E7 - // movepaste/moveinsert A1:B5 A8 all/formulas/format (if insert, destination must be in same rows or columns or else paste done) - // sort cr1:cr2 col1 up/down col2 up/down col3 up/down - // name define NAME definition - // name desc NAME description - // name delete NAME - // recalc - // redisplay - // changedrendervalues - // startcmdextension extension rest-of-command - // - // If saveundo is true, then undo information is saved in sheet.changes. - // - - SocialCalc.ExecuteSheetCommand = function (sheet, cmd, saveundo) { - var cmdstr, - cmd1, - rest, - what, - attrib, - num, - pos, - pos2, - errortext, - undostart, - val; - var cr1, cr2, col, row, cr, cell, newcell; - var fillright, rowstart, colstart, crbase, rowoffset, coloffset, basecell; - var clipsheet, cliprange, numcols, numrows, attribtable; - var colend, - rowend, - newcolstart, - newrowstart, - newcolend, - newrowend, - rownext, - colnext, - colthis, - cellnext; - var lastrow, lastcol, rowbefore, colbefore, oldformula, oldcr; - var cols, dirs, lastsortcol, i, sortlist, sortcells, sortvalues, sorttypes; - var sortfunction, slen, valtype, originalrow, sortedcr; - var name, v1, v2; - var cmdextension; - - var attribs = sheet.attribs; - var changes = sheet.changes; - var cellProperties = SocialCalc.CellProperties; - var scc = SocialCalc.Constants; - - var ParseRange = function () { - var prange = SocialCalc.ParseRange(what); - cr1 = prange.cr1; - cr2 = prange.cr2; - if (cr2.col > attribs.lastcol) attribs.lastcol = cr2.col; - if (cr2.row > attribs.lastrow) attribs.lastrow = cr2.row; - }; - - errortext = ""; - - cmdstr = cmd.RestOfStringNoMove(); - if (saveundo) { - sheet.changes.AddDo(cmdstr); - } - - cmd1 = cmd.NextToken(); - - switch (cmd1) { - case "set": - what = cmd.NextToken(); - attrib = cmd.NextToken(); - rest = cmd.RestOfString(); - undostart = "set " + what + " " + attrib; - - if (what == "sheet") { - sheet.renderneeded = true; - switch (attrib) { - case "defaultcolwidth": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]); - attribs[attrib] = rest; - break; - case "defaultcolor": - case "defaultbgcolor": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("color", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("color", rest); - break; - case "defaultlayout": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("layout", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("layout", rest); - break; - case "defaultfont": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("font", attribs[attrib]) - ); - if (rest == "* * *") rest = ""; // all default - attribs[attrib] = sheet.GetStyleNum("font", rest); - break; - case "defaulttextformat": - case "defaultnontextformat": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("cellformat", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("cellformat", rest); - break; - case "defaulttextvalueformat": - case "defaultnontextvalueformat": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("valueformat", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("valueformat", rest); - for (cr in sheet.cells) { - // forget all cached display strings - delete sheet.cells[cr].displaystring; - } - break; - case "lastcol": - case "lastrow": - if (saveundo) changes.AddUndo(undostart, attribs[attrib] - 0); - num = rest - 0; - if (typeof num == "number") attribs[attrib] = num > 0 ? num : 1; - break; - case "recalc": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]); - if (rest == "off") { - attribs.recalc = rest; // manual recalc, not auto - } else { - // all values other than "off" mean "on" - delete attribs.recalc; - } - break; - default: - errortext = scc.s_escUnknownSheetCmd + cmdstr; - break; - } - } else if (/(^[A-Z])([A-Z])?(:[A-Z][A-Z]?){0,1}$/i.test(what)) { - // col attributes - sheet.renderneeded = true; - what = what.toUpperCase(); - pos = what.indexOf(":"); - if (pos >= 0) { - cr1 = SocialCalc.coordToCr(what.substring(0, pos) + "1"); - cr2 = SocialCalc.coordToCr(what.substring(pos + 1) + "1"); - } else { - cr1 = SocialCalc.coordToCr(what + "1"); - cr2 = cr1; - } - for (col = cr1.col; col <= cr2.col; col++) { - if (attrib == "width") { - cr = SocialCalc.rcColname(col); - if (saveundo) - changes.AddUndo( - "set " + cr + " width", - sheet.colattribs.width[cr] - ); - if (rest.length > 0) { - sheet.colattribs.width[cr] = rest; - } else { - delete sheet.colattribs.width[cr]; - } - } - } - } - - // !!!!! need row attribs !!!! - else if (/([a-z]){0,1}(\d+)/i.test(what)) { - // cell attributes - ParseRange(); - if ( - cr1.row != cr2.row || - cr1.col != cr2.col || - sheet.celldisplayneeded || - sheet.renderneeded - ) { - // not one cell - sheet.renderneeded = true; - sheet.celldisplayneeded = ""; - } else { - sheet.celldisplayneeded = SocialCalc.crToCoord(cr1.col, cr1.row); - } - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - if (attrib == "value") { - // set coord value type numeric-value - pos = rest.indexOf(" "); - cell.datavalue = rest.substring(pos + 1) - 0; - delete cell.errors; - cell.datatype = "v"; - cell.valuetype = rest.substring(0, pos); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "text") { - // set coord text type text-value - pos = rest.indexOf(" "); - cell.datavalue = SocialCalc.decodeFromSave( - rest.substring(pos + 1) - ); - delete cell.errors; - cell.datatype = "t"; - cell.valuetype = rest.substring(0, pos); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "formula") { - // set coord formula formula-body-less-initial-= - cell.datavalue = 0; // until recalc - delete cell.errors; - cell.datatype = "f"; - cell.valuetype = "e#N/A"; // until recalc - cell.formula = rest; - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "constant") { - // set coord constant type numeric-value source-text - pos = rest.indexOf(" "); - pos2 = rest.substring(pos + 1).indexOf(" "); - cell.datavalue = rest.substring(pos + 1, pos + 1 + pos2) - 0; - cell.valuetype = rest.substring(0, pos); - if (cell.valuetype.charAt(0) == "e") { - // error - cell.errors = cell.valuetype.substring(1); - } else { - delete cell.errors; - } - cell.datatype = "c"; - cell.formula = rest.substring(pos + pos2 + 2); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "empty") { - // erase value - cell.datavalue = ""; - delete cell.errors; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "all") { - // set coord all :this:val1:that:val2... - if (rest.length > 0) { - cell = new SocialCalc.Cell(cr); - sheet.CellFromStringParts(cell, rest.split(":"), 1); - sheet.cells[cr] = cell; - } else { - delete sheet.cells[cr]; - } - attribs.needsrecalc = "yes"; - } else if (/^b[trbl]$/.test(attrib)) { - // set coord bt 1px solid black - cell[attrib] = sheet.GetStyleNum("borderstyle", rest); - sheet.renderneeded = true; // affects more than just one cell - } else if (attrib == "color" || attrib == "bgcolor") { - cell[attrib] = sheet.GetStyleNum("color", rest); - } else if (attrib == "layout" || attrib == "cellformat") { - cell[attrib] = sheet.GetStyleNum(attrib, rest); - } else if (attrib == "font") { - // set coord font style weight size family - if (rest == "* * *") rest = ""; - cell[attrib] = sheet.GetStyleNum("font", rest); - } else if ( - attrib == "textvalueformat" || - attrib == "nontextvalueformat" - ) { - cell[attrib] = sheet.GetStyleNum("valueformat", rest); - delete cell.displaystring; - } else if (attrib == "cssc") { - rest = rest.replace(/[^a-zA-Z0-9\-]/g, ""); - cell.cssc = rest; - } else if (attrib == "csss") { - rest = rest.replace(/\n/g, ""); - cell.csss = rest; - } else if (attrib == "mod") { - rest = rest.replace(/[^yY]/g, "").toLowerCase(); - cell.mod = rest; - } else if (attrib == "comment") { - cell.comment = SocialCalc.decodeFromSave(rest); - } else { - errortext = scc.s_escUnknownSetCoordCmd + cmdstr; - } - } - } - } - break; - - case "merge": - sheet.renderneeded = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - cell = sheet.GetAssuredCell(cr1.coord); - if (saveundo) changes.AddUndo("unmerge " + cr1.coord); - - if (cr2.col > cr1.col) cell.colspan = cr2.col - cr1.col + 1; - else delete cell.colspan; - if (cr2.row > cr1.row) cell.rowspan = cr2.row - cr1.row + 1; - else delete cell.rowspan; - - sheet.changedrendervalues = true; - - break; - - case "unmerge": - sheet.renderneeded = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - cell = sheet.GetAssuredCell(cr1.coord); - if (saveundo) - changes.AddUndo( - "merge " + - cr1.coord + - ":" + - SocialCalc.crToCoord( - cr1.col + (cell.colspan || 1) - 1, - cr1.row + (cell.rowspan || 1) - 1 - ) - ); - - delete cell.colspan; - delete cell.rowspan; - - sheet.changedrendervalues = true; - - break; - - case "erase": - case "cut": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - if (cmd1 == "cut") { - // save copy of whole thing before erasing - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = SocialCalc.CreateSheetSave( - sheet, - what - ); - } - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - if (rest == "all") { - delete sheet.cells[cr]; - } else if (rest == "formulas") { - cell.datavalue = ""; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - delete cell.errors; - delete cell.displaystring; - delete cell.parseinfo; - if (cell.comment) { - // comments are considered content for erasing - delete cell.comment; - } - } else if (rest == "formats") { - newcell = new SocialCalc.Cell(cr); // create a new cell without attributes - newcell.datavalue = cell.datavalue; // copy existing values - newcell.datatype = cell.datatype; - newcell.formula = cell.formula; - newcell.valuetype = cell.valuetype; - if (cell.comment) { - newcell.comment = cell.comment; - } - sheet.cells[cr] = newcell; // replace - } - } - } - attribs.needsrecalc = "yes"; - break; - - case "fillright": - case "filldown": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - if (cmd1 == "fillright") { - fillright = true; - rowstart = cr1.row; - colstart = cr1.col + 1; - } else { - fillright = false; - rowstart = cr1.row + 1; - colstart = cr1.col; - } - for (row = rowstart; row <= cr2.row; row++) { - for (col = colstart; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - if (fillright) { - crbase = SocialCalc.crToCoord(cr1.col, row); - coloffset = col - colstart + 1; - rowoffset = 0; - } else { - crbase = SocialCalc.crToCoord(col, cr1.row); - coloffset = 0; - rowoffset = row - rowstart + 1; - } - basecell = sheet.GetAssuredCell(crbase); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - if (cell.datatype == "f") { - // offset relative coords, even in sheet references - cell.formula = SocialCalc.OffsetFormulaCoords( - basecell.formula, - coloffset, - rowoffset - ); - } else { - cell.formula = basecell.formula; - } - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - } - } - - attribs.needsrecalc = "yes"; - break; - - case "copy": - what = cmd.NextToken(); - rest = cmd.RestOfString(); - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = SocialCalc.CreateSheetSave( - sheet, - what - ); - break; - - case "loadclipboard": - rest = cmd.RestOfString(); - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = SocialCalc.decodeFromSave(rest); - break; - - case "clearclipboard": - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = ""; - break; - - case "paste": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - if (!SocialCalc.Clipboard.clipboard) { - break; - } - clipsheet = new SocialCalc.Sheet(); // load clipboard contents as another sheet - clipsheet.ParseSheetSave(SocialCalc.Clipboard.clipboard); - cliprange = SocialCalc.ParseRange(clipsheet.copiedfrom); - coloffset = cr1.col - cliprange.cr1.col; // get sizes, etc. - rowoffset = cr1.row - cliprange.cr1.row; - numcols = cliprange.cr2.col - cliprange.cr1.col + 1; - numrows = cliprange.cr2.row - cliprange.cr1.row + 1; - if (cr1.col + numcols - 1 > attribs.lastcol) - attribs.lastcol = cr1.col + numcols - 1; - if (cr1.row + numrows - 1 > attribs.lastrow) - attribs.lastrow = cr1.row + numrows - 1; - - for (row = cr1.row; row < cr1.row + numrows; row++) { - for (col = cr1.col; col < cr1.col + numcols; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - crbase = SocialCalc.crToCoord(col - coloffset, row - rowoffset); - basecell = clipsheet.GetAssuredCell(crbase); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - attribtable = SocialCalc.CellPropertiesTable[attrib]; - if (attribtable && basecell[attrib]) { - // table indexes to expand to strings since other sheet may have diff indexes - cell[attrib] = sheet.GetStyleNum( - attribtable, - clipsheet.GetStyleString(attribtable, basecell[attrib]) - ); - } else { - // these are not table indexes - cell[attrib] = basecell[attrib]; - } - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - if (cell.datatype == "f") { - // offset relative coords, even in sheet references - cell.formula = SocialCalc.OffsetFormulaCoords( - basecell.formula, - coloffset, - rowoffset - ); - } else { - cell.formula = basecell.formula; - } - delete cell.parseinfo; - cell.errors = basecell.errors; - if (basecell.comment) { - // comments are pasted as part of content, though not filled, etc. - cell.comment = basecell.comment; - } else if (cell.comment) { - delete cell.comment; - } - } - delete cell.displaystring; - } - } - - attribs.needsrecalc = "yes"; - break; - - case "sort": // sort cr1:cr2 col1 up/down col2 up/down col3 up/down - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - ParseRange(); - cols = []; // get columns and sort directions (or "") - dirs = []; - lastsortcol = 0; - for (i = 0; i <= 3; i++) { - cols[i] = cmd.NextToken(); - dirs[i] = cmd.NextToken(); - if (cols[i]) lastsortcol = i; - } - - sortcells = {}; // a copy of the data which will replace the original, but in the new order - sortlist = []; // an array of 0, 1, ..., nrows-1 needed for sorting - sortvalues = []; // values to be sorted corresponding to sortlist - sorttypes = []; // basic types of the values - - for (row = cr1.row; row <= cr2.row; row++) { - // fill in the sort info - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.cells[cr]; - if (cell) { - // only copy non-empty cells - sortcells[cr] = sheet.CellToString(cell); - if (saveundo) - changes.AddUndo("set " + cr + " all", sortcells[cr]); - } else { - if (saveundo) changes.AddUndo("set " + cr + " all"); - } - } - sortlist.push(sortlist.length); - sortvalues.push([]); - sorttypes.push([]); - slast = sorttypes.length - 1; - for (i = 0; i <= lastsortcol; i++) { - cr = cols[i] + row; // get cr on this row in sort col - cell = sheet.GetAssuredCell(cr); - val = cell.datavalue; - valtype = cell.valuetype.charAt(0) || "b"; - if (valtype == "t") val = val.toLowerCase(); - sortvalues[slast].push(val); - sorttypes[slast].push(valtype); - } - } - - sortfunction = function (a, b) { - // a comparison function that can handle all the type variations - var i, a1, b1, ta, cresult; - for (i = 0; i <= lastsortcol; i++) { - if (dirs[i] == "up") { - // handle sort direction - a1 = a; - b1 = b; - } else { - a1 = b; - b1 = a; - } - ta = sorttypes[a1][i]; - tb = sorttypes[b1][i]; - if (ta == "t") { - // numbers < text < errors, blank always last no matter what dir - if (tb == "t") { - a1 = sortvalues[a1][i]; - b1 = sortvalues[b1][i]; - cresult = a1 > b1 ? 1 : a1 < b1 ? -1 : 0; - } else if (tb == "n") { - cresult = 1; - } else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } else if (tb == "e") { - cresult = -1; - } - } else if (ta == "n") { - if (tb == "t") { - cresult = -1; - } else if (tb == "n") { - a1 = sortvalues[a1][i] - 0; // force to numeric, just in case - b1 = sortvalues[b1][i] - 0; - cresult = a1 > b1 ? 1 : a1 < b1 ? -1 : 0; - } else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } else if (tb == "e") { - cresult = -1; - } - } else if (ta == "e") { - if (tb == "e") { - a1 = sortvalues[a1][i]; - b1 = sortvalues[b1][i]; - cresult = a1 > b1 ? 1 : a1 < b1 ? -1 : 0; - } else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } else { - cresult = 1; - } - } else if (ta == "b") { - if (tb == "b") { - cresult = 0; - } else { - cresult = dirs[i] == "up" ? 1 : -1; - } - } - if (cresult) { - // return if tested not equal, otherwise do next column - return cresult; - } - } - cresult = a > b ? 1 : a < b ? -1 : 0; // equal - return position in original to maintain it - return cresult; - }; - - sortlist.sort(sortfunction); - - for (row = cr1.row; row <= cr2.row; row++) { - // copy original rows into sorted positions - originalrow = sortlist[row - cr1.row]; // relative position where it was in original - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - sortedcr = SocialCalc.crToCoord(col, originalrow + cr1.row); // original cell to be put in new place - if (sortcells[sortedcr]) { - cell = new SocialCalc.Cell(cr); - sheet.CellFromStringParts( - cell, - sortcells[sortedcr].split(":"), - 1 - ); - if (cell.datatype == "f") { - // offset coord refs, even to ***relative*** coords in other sheets - cell.formula = SocialCalc.OffsetFormulaCoords( - cell.formula, - 0, - row - cr1.row - originalrow - ); - } - sheet.cells[cr] = cell; - } else { - delete sheet.cells[cr]; - } - } - } - - attribs.needsrecalc = "yes"; - break; - - case "insertcol": - case "insertrow": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - - if (cmd1 == "insertcol") { - coloffset = 1; - colend = cr1.col; - rowoffset = 0; - rowend = 1; - newcolstart = cr1.col; - newcolend = cr1.col; - newrowstart = 1; - newrowend = attribs.lastrow; - if (saveundo) changes.AddUndo("deletecol " + cr1.coord); - } else { - coloffset = 0; - colend = 1; - rowoffset = 1; - rowend = cr1.row; - newcolstart = 1; - newcolend = attribs.lastcol; - newrowstart = cr1.row; - newrowend = cr1.row; - if (saveundo) changes.AddUndo("deleterow " + cr1.coord); - } - - for (row = attribs.lastrow; row >= rowend; row--) { - // copy the cells forward - for (col = attribs.lastcol; col >= colend; col--) { - crbase = SocialCalc.crToCoord(col, row); - cr = SocialCalc.crToCoord(col + coloffset, row + rowoffset); - if (!sheet.cells[crbase]) { - // copying empty cell - delete sheet.cells[cr]; // delete anything that may have been there - } else { - // overwrite existing cell with moved contents - sheet.cells[cr] = sheet.cells[crbase]; - } - } - } - - for (row = newrowstart; row <= newrowend; row++) { - // fill the "new" empty cells - for (col = newcolstart; col <= newcolend; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = new SocialCalc.Cell(cr); - sheet.cells[cr] = cell; - crbase = SocialCalc.crToCoord(col - coloffset, row - rowoffset); // copy attribs of the one before (0 gives you A or 1) - basecell = sheet.GetAssuredCell(crbase); - for (attrib in cellProperties) { - if (cellProperties[attrib] == 2) { - // copy only format attributes - cell[attrib] = basecell[attrib]; - } - } - } - } - - for (cr in sheet.cells) { - // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell && cell.datatype == "f") { - cell.formula = SocialCalc.AdjustFormulaCoords( - cell.formula, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - } - if (cell) { - delete cell.parseinfo; - } - } - - for (name in sheet.names) { - // update cell references to moved cells in names - if (sheet.names[name]) { - // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = - v2 + - SocialCalc.AdjustFormulaCoords( - v1, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - } - } - - for ( - row = attribs.lastrow; - row >= rowend && cmd1 == "insertrow"; - row-- - ) { - // copy the row attributes forward - rownext = row + rowoffset; - for (attrib in sheet.rowattribs) { - val = sheet.rowattribs[attrib][row]; - if (sheet.rowattribs[attrib][rownext] != val) { - // make assignment only if different - if (val) { - sheet.rowattribs[attrib][rownext] = val; - } else { - delete sheet.rowattribs[attrib][rownext]; - } - } - } - } - - for ( - col = attribs.lastcol; - col >= colend && cmd1 == "insertcol"; - col-- - ) { - // copy the column attributes forward - colthis = SocialCalc.rcColname(col); - colnext = SocialCalc.rcColname(col + coloffset); - for (attrib in sheet.colattribs) { - val = sheet.colattribs[attrib][colthis]; - if (sheet.colattribs[attrib][colnext] != val) { - // make assignment only if different - if (val) { - sheet.colattribs[attrib][colnext] = val; - } else { - delete sheet.colattribs[attrib][colnext]; - } - } - } - } - - attribs.lastcol += coloffset; - attribs.lastrow += rowoffset; - attribs.needsrecalc = "yes"; - break; - - case "deletecol": - case "deleterow": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - lastcol = attribs.lastcol; // save old values since ParseRange sets... - lastrow = attribs.lastrow; - ParseRange(); - - if (cmd1 == "deletecol") { - coloffset = cr1.col - cr2.col - 1; - rowoffset = 0; - colstart = cr2.col + 1; - rowstart = 1; - } else { - coloffset = 0; - rowoffset = cr1.row - cr2.row - 1; - colstart = 1; - rowstart = cr2.row + 1; - } - - for (row = rowstart; row <= lastrow - rowoffset; row++) { - // copy the cells backwards - extra so no dup of last set - for (col = colstart; col <= lastcol - coloffset; col++) { - cr = SocialCalc.crToCoord(col + coloffset, row + rowoffset); - if ( - saveundo && - (row < rowstart - rowoffset || col < colstart - coloffset) - ) { - // save cells that are overwritten as undo info - cell = sheet.cells[cr]; - if (!cell) { - // empty cell - changes.AddUndo("erase " + cr + " all"); - } else { - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - } - } - crbase = SocialCalc.crToCoord(col, row); - cell = sheet.cells[crbase]; - if (!cell) { - // copying empty cell - delete sheet.cells[cr]; // delete anything that may have been there - } else { - // overwrite existing cell with moved contents - sheet.cells[cr] = cell; - } - } - } - - //!!! multiple deletes isn't setting #REF!; need to fix up #REF!'s on undo but only those! - - for (cr in sheet.cells) { - // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell) { - if (cell.datatype == "f") { - oldformula = cell.formula; - cell.formula = SocialCalc.AdjustFormulaCoords( - oldformula, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - if (cell.formula != oldformula) { - delete cell.parseinfo; - if (saveundo && cell.formula.indexOf("#REF!") != -1) { - // save old version only if removed coord - oldcr = SocialCalc.coordToCr(cr); - changes.AddUndo( - "set " + - SocialCalc.rcColname(oldcr.col - coloffset) + - (oldcr.row - rowoffset) + - " formula " + - oldformula - ); - } - } - } else { - delete cell.parseinfo; - } - } - } - - for (name in sheet.names) { - // update cell references to moved cells in names - if (sheet.names[name]) { - // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = - v2 + - SocialCalc.AdjustFormulaCoords( - v1, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - } - } - - for ( - row = rowstart; - row <= lastrow - rowoffset && cmd1 == "deleterow"; - row++ - ) { - // copy the row attributes backwards - rowbefore = row + rowoffset; - for (attrib in sheet.rowattribs) { - val = sheet.rowattribs[attrib][row]; - if (sheet.rowattribs[attrib][rowbefore] != val) { - // make assignment only if different - if (saveundo) - changes.AddUndo( - "set " + rowbefore + " " + attrib, - sheet.rowattribs[attrib][rowbefore] - ); - if (val) { - sheet.rowattribs[attrib][rowbefore] = val; - } else { - delete sheet.rowattribs[attrib][rowbefore]; - } - } - } - } - - for ( - col = colstart; - col <= lastcol - coloffset && cmd1 == "deletecol"; - col++ - ) { - // copy the column attributes backwards - colthis = SocialCalc.rcColname(col); - colbefore = SocialCalc.rcColname(col + coloffset); - for (attrib in sheet.colattribs) { - val = sheet.colattribs[attrib][colthis]; - if (sheet.colattribs[attrib][colbefore] != val) { - // make assignment only if different - if (saveundo) - changes.AddUndo( - "set " + colbefore + " " + attrib, - sheet.colattribs[attrib][colbefore] - ); - if (val) { - sheet.colattribs[attrib][colbefore] = val; - } else { - delete sheet.colattribs[attrib][colbefore]; - } - } - } - } - - if (saveundo) { - if (cmd1 == "deletecol") { - for (col = cr1.col; col <= cr2.col; col++) { - changes.AddUndo("insertcol " + SocialCalc.rcColname(col)); - } - } else { - for (row = cr1.row; row <= cr2.row; row++) { - changes.AddUndo("insertrow " + row); - } - } - } - - if (cmd1 == "deletecol") { - if (cr1.col <= lastcol) { - // shrink sheet unless deleted phantom cols off the end - if (cr2.col <= lastcol) { - attribs.lastcol += coloffset; - } else { - attribs.lastcol = cr1.col - 1; - } - } - } else { - if (cr1.row <= lastrow) { - // shrink sheet unless deleted phantom rows off the end - if (cr2.row <= lastrow) { - attribs.lastrow += rowoffset; - } else { - attribs.lastrow = cr1.row - 1; - } - } - } - attribs.needsrecalc = "yes"; - break; - - case "movepaste": - case "moveinsert": - var movingcells, - dest, - destcr, - inserthoriz, - insertvert, - pushamount, - movedto; - - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - dest = cmd.NextToken(); - rest = cmd.RestOfString(); // rest is all/formulas/formats - if (rest == "") rest = "all"; - - ParseRange(); - - destcr = SocialCalc.coordToCr(dest); - - coloffset = destcr.col - cr1.col; - rowoffset = destcr.row - cr1.row; - numcols = cr2.col - cr1.col + 1; - numrows = cr2.row - cr1.row + 1; - - // get a copy of moving cells and erase from where they were - - movingcells = {}; - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - - if (!sheet.cells[cr]) { - // if had nothing - continue; // don't save anything - } - movingcells[cr] = new SocialCalc.Cell(cr); // create new cell to copy - - for (attrib in cellProperties) { - // go through each property - if (typeof cell[attrib] === undefined) { - // don't copy undefined things and no need to delete - continue; - } else { - movingcells[cr][attrib] = cell[attrib]; // copy for potential moving - } - if (rest == "all") { - delete cell[attrib]; - } - if (rest == "formulas") { - if ( - cellProperties[attrib] == 1 || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } - } - if (rest == "formats") { - if (cellProperties[attrib] == 2) { - delete cell[attrib]; - } - } - } - if (rest == "formulas") { - // leave pristene deleted cell - cell.datavalue = ""; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - } - if (rest == "all") { - // leave nothing for move all - delete sheet.cells[cr]; - } - } - } - - // if moveinsert, check destination OK, and calculate pushing parameters - - if (cmd1 == "moveinsert") { - inserthoriz = false; - insertvert = false; - if ( - rowoffset == 0 && - (destcr.col < cr1.col || destcr.col > cr2.col) - ) { - if (destcr.col < cr1.col) { - // moving left - pushamount = cr1.col - destcr.col; - inserthoriz = -1; - } else { - destcr.col -= 1; - coloffset = destcr.col - cr2.col; - pushamount = destcr.col - cr2.col; - inserthoriz = 1; - } - } else if ( - coloffset == 0 && - (destcr.row < cr1.row || destcr.row > cr2.row) - ) { - if (destcr.row < cr1.row) { - // moving up - pushamount = cr1.row - destcr.row; - insertvert = -1; - } else { - destcr.row -= 1; - rowoffset = destcr.row - cr2.row; - pushamount = destcr.row - cr2.row; - insertvert = 1; - } - } else { - cmd1 = "movepaste"; // not allowed right now - ignore - } - } - - // push any cells that need pushing - - movedto = {}; // remember what was moved where - - if (insertvert) { - for (row = 0; row < pushamount; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - if (insertvert < 0) { - crbase = SocialCalc.crToCoord( - col, - destcr.row + pushamount - row - 1 - ); // from cell - cr = SocialCalc.crToCoord(col, cr2.row - row); // to cell - } else { - crbase = SocialCalc.crToCoord( - col, - destcr.row - pushamount + row + 1 - ); // from cell - cr = SocialCalc.crToCoord(col, cr1.row + row); // to cell - } - - basecell = sheet.GetAssuredCell(crbase); - if (saveundo) - changes.AddUndo( - "set " + crbase + " all", - sheet.CellToString(basecell) - ); - - cell = sheet.GetAssuredCell(cr); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - - movedto[crbase] = cr; // old crbase is now at cr - } - } - } - if (inserthoriz) { - for (col = 0; col < pushamount; col++) { - for (row = cr1.row; row <= cr2.row; row++) { - if (inserthoriz < 0) { - crbase = SocialCalc.crToCoord( - destcr.col + pushamount - col - 1, - row - ); - cr = SocialCalc.crToCoord(cr2.col - col, row); - } else { - crbase = SocialCalc.crToCoord( - destcr.col - pushamount + col + 1, - row - ); - cr = SocialCalc.crToCoord(cr1.col + col, row); - } - - basecell = sheet.GetAssuredCell(crbase); - if (saveundo) - changes.AddUndo( - "set " + crbase + " all", - sheet.CellToString(basecell) - ); - - cell = sheet.GetAssuredCell(cr); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - - movedto[crbase] = cr; // old crbase is now at cr - } - } - } - - // paste moved cells into new place - - if (destcr.col + numcols - 1 > attribs.lastcol) - attribs.lastcol = destcr.col + numcols - 1; - if (destcr.row + numrows - 1 > attribs.lastrow) - attribs.lastrow = destcr.row + numrows - 1; - - for (row = cr1.row; row < cr1.row + numrows; row++) { - for (col = cr1.col; col < cr1.col + numcols; col++) { - cr = SocialCalc.crToCoord(col + coloffset, row + rowoffset); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - - crbase = SocialCalc.crToCoord(col, row); // get old cell to move - - movedto[crbase] = cr; // old crbase (moved cell) will now be at cr (destination) - - if (rest == "all" && !movingcells[crbase]) { - // moving an empty cell - delete sheet.cells[cr]; // make the cell empty - continue; - } - - basecell = movingcells[crbase]; - if (!basecell) basecell = sheet.GetAssuredCell(crbase); - - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - if (basecell.comment) { - // comments are pasted as part of content, though not filled, etc. - cell.comment = basecell.comment; - } else if (cell.comment) { - delete cell.comment; - } - } - delete cell.displaystring; - } - } - - // do fixups - - for (cr in sheet.cells) { - // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell) { - if (cell.datatype == "f") { - oldformula = cell.formula; - cell.formula = SocialCalc.ReplaceFormulaCoords( - oldformula, - movedto - ); - if (cell.formula != oldformula) { - delete cell.parseinfo; - if (saveundo && !movedto[cr]) { - // moved cells are already saved for undo - changes.AddUndo("set " + cr + " formula " + oldformula); - } - } - } else { - delete cell.parseinfo; - } - } - } - - for (name in sheet.names) { - // update cell references to moved cells in names - if (sheet.names[name]) { - // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - oldformula = v1; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = - v2 + SocialCalc.ReplaceFormulaCoords(v1, movedto); - if (saveundo && sheet.names[name].definition != oldformula) { - // save changes - changes.AddUndo("name define " + name + " " + oldformula); - } - } - } - - attribs.needsrecalc = "yes"; - break; - - case "name": - what = cmd.NextToken(); - name = cmd.NextToken(); - rest = cmd.RestOfString(); - - name = name.toUpperCase().replace(/[^A-Z0-9_\.]/g, ""); - if (name == "") break; // must have something - - if (what == "define") { - if (rest == "") break; // must have something - if (sheet.names[name]) { - // already exists - if (saveundo) - changes.AddUndo( - "name define " + name + " " + sheet.names[name].definition - ); - sheet.names[name].definition = rest; - } else { - // new - if (saveundo) changes.AddUndo("name delete " + name); - sheet.names[name] = { definition: rest, desc: "" }; - } - } else if (what == "desc") { - if (sheet.names[name]) { - // must already exist - if (saveundo) - changes.AddUndo( - "name desc " + name + " " + sheet.names[name].desc - ); - sheet.names[name].desc = rest; - } - } else if (what == "delete") { - if (saveundo) { - if (sheet.names[name].desc) - changes.AddUndo( - "name desc " + name + " " + sheet.names[name].desc - ); - changes.AddUndo( - "name define " + name + " " + sheet.names[name].definition - ); - } - delete sheet.names[name]; - } - attribs.needsrecalc = "yes"; - - break; - - case "recalc": - attribs.needsrecalc = "yes"; // request recalc - sheet.recalconce = true; // even if turned off - break; - - case "redisplay": - sheet.renderneeded = true; - break; - - case "changedrendervalues": // needed for undo sometimes - sheet.changedrendervalues = true; - break; - - case "startcmdextension": // startcmdextension extension rest-of-command - name = cmd.NextToken(); - cmdextension = SocialCalc.SheetCommandInfo.CmdExtensionCallbacks[name]; - if (cmdextension) { - cmdextension.func(name, cmdextension.data, sheet, cmd, saveundo); - } - break; - - default: - errortext = scc.s_escUnknownCmd + cmdstr; - break; - } - - /* For Debugging: -var ustack=""; -for (var i=0;i= 0; i--) { - // do them backwards - if (cmdstr) cmdstr += "\n"; // concatenate with separate lines - cmdstr += tos.undo[i]; - } - sheet.changes.Undo(); - sheet.ScheduleSheetCommands(cmdstr, false); // do undo operations - }; - - SocialCalc.SheetRedo = function (sheet) { - var tos, i; - var didredo = sheet.changes.Redo(); - if (!didredo) { - sheet.ScheduleSheetCommands("", false); // schedule doing nothing - return; - } - tos = sheet.changes.TOS(); - var cmdstr = ""; - - for (i = 0; tos && i < tos.command.length; i++) { - if (cmdstr) cmdstr += "\n"; // concatenate with separate lines - cmdstr += tos.command[i]; - } - sheet.ScheduleSheetCommands(cmdstr, false); // do undo operations - }; - - SocialCalc.CreateAuditString = function (sheet) { - var i, j; - var result = ""; - var stack = sheet.changes.stack; - var tos = sheet.changes.tos; - for (i = 0; i <= tos; i++) { - for (j = 0; j < stack[i].command.length; j++) { - result += stack[i].command[j] + "\n"; - } - } - - return result; - }; - - SocialCalc.GetStyleNum = function (sheet, atype, style) { - var num; - - if (style.length == 0) return 0; // null means use zero, which means default or global default - - num = sheet[atype + "hash"][style]; - if (!num) { - if (sheet[atype + "s"].length < 1) sheet[atype + "s"].push(""); - num = sheet[atype + "s"].push(style) - 1; - sheet[atype + "hash"][style] = num; - sheet.changedrendervalues = true; - } - return num; - }; - - SocialCalc.GetStyleString = function (sheet, atype, num) { - if (!num) return null; // zero, null, and undefined return null - - return sheet[atype + "s"][num]; - }; - - // - // updatedformula = SocialCalc.OffsetFormulaCoords(formula, coloffset, rowoffset) - // - // Change relative cell references by offsets (even those to other worksheets so fill, paste, sort work as expected). - // If not what you want, use absolute references. - // - - SocialCalc.OffsetFormulaCoords = function (formula, coloffset, rowoffset) { - var parseinfo, ttext, ttype, i, cr, newcr; - var updatedformula = ""; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = scf.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - if (ttype == token_coord) { - newcr = ""; - cr = SocialCalc.coordToCr(ttext); - if (ttext.charAt(0) != "$") { - // add col offset unless absolute column - cr.col += coloffset; - } else { - newcr += "$"; - } - newcr += SocialCalc.rcColname(cr.col); - if (ttext.indexOf("$", 1) == -1) { - // add row offset unless absolute row - cr.row += rowoffset; - } else { - newcr += "$"; - } - newcr += cr.row; - if (cr.row < 1 || cr.col < 1) { - newcr = "#REF!"; - } - updatedformula += newcr; - } else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { - // quotes to double - updatedformula += '"' + ttext.replace(/"/, '""') + '"'; - } else updatedformula += '"' + ttext + '"'; - } else if (ttype == token_op) { - updatedformula += tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } else { - // leave everything else alone - updatedformula += ttext; - } - } - - return updatedformula; - }; - - // - // updatedformula = SocialCalc.AdjustFormulaCoords(formula, col, coloffset, row, rowoffset) - // - // Change all cell references to cells starting with col/row by offsets - // - - SocialCalc.AdjustFormulaCoords = function ( - formula, - col, - coloffset, - row, - rowoffset - ) { - var ttype, ttext, i, newcr; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - if (ttype == token_op) { - // references with sheet specifier are not offset - if (ttext == "!") { - sheetref = true; // found a sheet reference - } else if (ttext != ":") { - // for everything but a range, reset - sheetref = false; - } - ttext = tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } - if (ttype == token_coord) { - cr = SocialCalc.coordToCr(ttext); - if ( - (coloffset < 0 && cr.col >= col && cr.col < col - coloffset) || - (rowoffset < 0 && cr.row >= row && cr.row < row - rowoffset) - ) { - // refs to deleted cells become invalid - if (!sheetref) { - cr.col = 0; - cr.row = 0; - } - } - if (!sheetref) { - if (cr.col >= col) { - cr.col += coloffset; - } - if (cr.row >= row) { - cr.row += rowoffset; - } - } - if (ttext.charAt(0) == "$") { - newcr = "$" + SocialCalc.rcColname(cr.col); - } else { - newcr = SocialCalc.rcColname(cr.col); - } - if (ttext.indexOf("$", 1) != -1) { - newcr += "$" + cr.row; - } else { - newcr += cr.row; - } - if (cr.row < 1 || cr.col < 1) { - newcr = "#REF!"; - } - ttext = newcr; - } else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { - // quotes to double - ttext = '"' + ttext.replace(/"/, '""') + '"'; - } else ttext = '"' + ttext + '"'; - } - updatedformula += ttext; - } - - return updatedformula; - }; - - // - // updatedformula = SocialCalc.ReplaceFormulaCoords(formula, movedto) - // - // Change all cell references to cells that are keys in moveto to be to moveto[coord]. - // Don't change references to other sheets. - // Handle range extents specially. - // - - SocialCalc.ReplaceFormulaCoords = function (formula, movedto) { - var ttype, ttext, i, newcr, coord; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - if (ttype == token_op) { - // references with sheet specifier are not change - if (ttext == "!") { - sheetref = true; // found a sheet reference - } else if (ttext != ":") { - // for everything but a range, reset - sheetref = false; - } - - //!!!! HANDLE RANGE EXTENT MOVES - - ttext = tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } - if (ttype == token_coord) { - cr = SocialCalc.coordToCr(ttext); // get parts - coord = SocialCalc.crToCoord(cr.col, cr.row); // get "clean" reference - if (movedto[coord] && !sheetref) { - // this is a reference to a moved cell - cr = SocialCalc.coordToCr(movedto[coord]); // get new row and col - if (ttext.charAt(0) == "$") { - // copy absolute ref marks if present - newcr = "$" + SocialCalc.rcColname(cr.col); - } else { - newcr = SocialCalc.rcColname(cr.col); - } - if (ttext.indexOf("$", 1) != -1) { - newcr += "$" + cr.row; - } else { - newcr += cr.row; - } - ttext = newcr; - } - } else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { - // quotes to double - ttext = '"' + ttext.replace(/"/, '""') + '"'; - } else ttext = '"' + ttext + '"'; - } - updatedformula += ttext; - } - - return updatedformula; - }; - - // ************************ - // - // Recalc Loop Code - // - // ************************ - - // - // How recalc works: - // - // !!!!!!!!!!!!!! - // - - // SocialCalc.RecalcInfo - object with global recalc info - - SocialCalc.RecalcInfo = { - sheet: null, // which sheet is being recalced - - currentState: 0, // current state - state: { start_calc: 1, order: 2, calc: 3, start_wait: 4, done_wait: 5 }, // allowed state values - - recalctimer: null, // value to cancel timer - maxtimeslice: 100, // maximum milliseconds per slice of recalc time before a wait - timeslicedelay: 1, // milliseconds to wait between recalc time slices - starttime: 0, // when recalc started - - // LoadSheet: a function that returns true if started a load or false if not. - // - - LoadSheet: function (sheetname) { - return false; - }, // default returns not found - }; - - // SocialCalc.RecalcData - object with recalc info while determining recalc order and afterward - - SocialCalc.RecalcData = function () { - // initialize a RecalcData object - - this.inrecalc = true; // if true, doing a recalc - this.celllist = []; // list with all potential cells to calculate - this.celllistitem = 0; // cell to check next when ordering - this.calclist = null; // object which is the chained list of cells to calculate - // each in the form of "coord: nextcoord" - // e.g., if B8 is calculated right after A8, then calclist.A8=="B8" - // if null, need to create the list - this.calclistlength = 0; // number of items in calclist - - this.firstcalc = null; // start of the calc list - a string or null - this.lastcalc = null; // last one on chain (used to add more to the end) - - this.nextcalc = null; // used to keep track during background recalc to make it restartable - this.count = 0; // number calculated - - // checkinfo is used when determining calc order: - - this.checkinfo = {}; // attributes are coords; if no attrib for a coord, it wasn't checked or doesn't need it - // values are RecalcCheckInfo objects while checking or TRUE when complete - }; - - // SocialCalc.RecalcCheckInfo - object that stores checking info while determining recalc order - - SocialCalc.RecalcCheckInfo = function () { - // initialize a RecalcCheckInfo object - - this.oldcoord = null; // chain back up of cells referring to cells - this.parsepos = 0; // which token we are up to - - // range info - - this.inrange = false; // if true, in the process of checking a range of coords - this.inrangestart = false; // if true, have not yet filled in range loop values - this.cr1 = null; // range first coord as a cr object - this.cr2 = null; // range second coord as a cr object - this.c1 = null; // range extents - this.c2 = null; - this.r1 = null; - this.r2 = null; - this.c = null; // looping values - this.r = null; - }; - - // Recalc the entire sheet - - SocialCalc.RecalcSheet = function (sheet) { - var coord, err, recalcdata; - var scri = SocialCalc.RecalcInfo; - - delete sheet.attribs.circularreferencecell; // reset recalc-wide things - SocialCalc.Formula.FreshnessInfoReset(); - - SocialCalc.RecalcClearTimeout(); - - scri.sheet = sheet; // set values needed by background recalc - scri.currentState = scri.state.start_calc; - - scri.starttime = new Date(); - - if (sheet.statuscallback) { - sheet.statuscallback(scri, "calcstart", null, sheet.statuscallbackparams); - } - - SocialCalc.RecalcSetTimeout(); - }; - - // - // SocialCalc.RecalcSetTimeout - set a timer for next recalc step - // - - SocialCalc.RecalcSetTimeout = function () { - var scri = SocialCalc.RecalcInfo; - - scri.recalctimer = window.setTimeout( - SocialCalc.RecalcTimerRoutine, - scri.timeslicedelay - ); - }; - - // - // SocialCalc.RecalcClearTimeout - cancel any timeouts - // - - SocialCalc.RecalcClearTimeout = function () { - var scri = SocialCalc.RecalcInfo; - - if (scri.recalctimer) { - window.clearTimeout(scri.recalctimer); - scri.recalctimer = null; - } - }; - - // - // SocialCalc.RecalcLoadedSheet(sheetname, str, recalcneeded) - // - // Called when a sheet finishes loading with name, string, and t/f whether it should be recalced. - // If loaded sheet has sheet.attribs.recalc=="off", then no recalc done. - // If sheetname is null, then the sheetname waiting for will be used. - // - - SocialCalc.RecalcLoadedSheet = function (sheetname, str, recalcneeded) { - var sheet; - var scri = SocialCalc.RecalcInfo; - var scf = SocialCalc.Formula; - - sheet = SocialCalc.Formula.AddSheetToCache( - sheetname || scf.SheetCache.waitingForLoading, - str - ); - - if (recalcneeded && sheet && sheet.attribs.recalc != "off") { - // if recalcneeded, and not manual sheet, chain in this new sheet to recalc loop - sheet.previousrecalcsheet = scri.sheet; - scri.sheet = sheet; - scri.currentState = scri.state.start_calc; - } - scf.SheetCache.waitingForLoading = null; - - SocialCalc.RecalcSetTimeout(); - }; - - // - // SocialCalc.RecalcTimerRoutine - handles the actual order determination and cell-by-cell recalculation in the background - // - - SocialCalc.RecalcTimerRoutine = function () { - var eresult, cell, coord, err, status; - var starttime = new Date(); - var count = 0; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var scri = SocialCalc.RecalcInfo; - var sheet = scri.sheet; - if (!sheet) { - return; - } - var recalcdata = sheet.recalcdata; - - var do_statuscallback = function (status, arg) { - // routine to do callback if required - if (sheet.statuscallback) { - sheet.statuscallback( - recalcdata, - status, - arg, - sheet.statuscallbackparams - ); - } - }; - - SocialCalc.RecalcClearTimeout(); - - if (scri.currentState == scri.state.start_calc) { - recalcdata = new SocialCalc.RecalcData(); - sheet.recalcdata = recalcdata; - - for (coord in sheet.cells) { - // get list of cells to check for order - if (!coord) continue; - recalcdata.celllist.push(coord); - } - - recalcdata.calclist = {}; // start with empty list - scri.currentState = scri.state.order; // drop through to determining recalc order - } - - if (scri.currentState == scri.state.order) { - while (recalcdata.celllistitem < recalcdata.celllist.length) { - // check all the cells to see if they should be on the list - coord = recalcdata.celllist[recalcdata.celllistitem++]; - err = SocialCalc.RecalcCheckCell(sheet, coord); - if (new Date() - starttime >= scri.maxtimeslice) { - // if taking too long, give up CPU for a while - do_statuscallback("calcorder", { - coord: coord, - total: recalcdata.celllist.length, - count: recalcdata.celllistitem, - }); - SocialCalc.RecalcSetTimeout(); - return; - } - } - - do_statuscallback("calccheckdone", recalcdata.calclistlength); - - recalcdata.nextcalc = recalcdata.firstcalc; // start at the beginning of the recalc chain - scri.currentState = scri.state.calc; // loop through cells on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - if (scri.currentState == scri.state.start_wait) { - // starting to wait for something - scri.currentState = scri.state.done_wait; // finished on next timer call - if (scri.LoadSheet) { - status = scri.LoadSheet(scf.SheetCache.waitingForLoading); - if (status) { - // started a load operation - return; - } - } - SocialCalc.RecalcLoadedSheet(null, "", false); - return; - } - - if (scri.currentState == scri.state.done_wait) { - scri.currentState = scri.state.calc; // loop through cells on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - // otherwise should be scri.state.calc - - if (scri.currentState != scri.state.calc) { - alert( - "Recalc state error: " + - scri.currentState + - ". Error in SocialCalc code." - ); - } - - coord = sheet.recalcdata.nextcalc; - while (coord) { - cell = sheet.cells[coord]; - eresult = scf.evaluate_parsed_formula(cell.parseinfo, sheet, false); - if (scf.SheetCache.waitingForLoading) { - // wait until restarted - recalcdata.nextcalc = coord; // start with this cell again - recalcdata.count += count; - do_statuscallback("calcloading", { - sheetname: scf.SheetCache.waitingForLoading, - }); - scri.currentState = scri.state.start_wait; // start load on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - if (scf.RemoteFunctionInfo.waitingForServer) { - // wait until restarted - recalcdata.nextcalc = coord; // start with this cell again - recalcdata.count += count; - do_statuscallback("calcserverfunc", { - funcname: scf.RemoteFunctionInfo.waitingForServer, - coord: coord, - total: recalcdata.calclistlength, - count: recalcdata.count, - }); - scri.currentState = scri.state.done_wait; // start load on next timer call - return; // return and wait for next recalc timer event - } - - if (cell.datavalue != eresult.value || cell.valuetype != eresult.type) { - // only update if changed from last time - cell.datavalue = eresult.value; - cell.valuetype = eresult.type; - delete cell.displaystring; - sheet.recalcchangedavalue = true; // remember something changed in case other code wants to know - } - if (eresult.error) { - cell.errors = eresult.error; - } - count++; - coord = sheet.recalcdata.calclist[coord]; - - if (new Date() - starttime >= scri.maxtimeslice) { - // if taking too long, give up CPU for a while - recalcdata.nextcalc = coord; // start with next cell on chain - recalcdata.count += count; - do_statuscallback("calcstep", { - coord: coord, - total: recalcdata.calclistlength, - count: recalcdata.count, - }); - SocialCalc.RecalcSetTimeout(); - return; - } - } - - recalcdata.inrecalc = false; - - delete sheet.recalcdata; // save memory and clear out for name lookup formula evaluation - - delete sheet.attribs.needsrecalc; // remember recalc done - - scri.sheet = sheet.previousrecalcsheet || null; // chain back if doing recalc of loaded sheets - if (scri.sheet) { - scri.currentState = scri.state.calc; // start where we left off - SocialCalc.RecalcSetTimeout(); - return; - } - - scf.FreshnessInfo.recalc_completed = true; // say freshness info is complete - - do_statuscallback("calcfinished", new Date() - scri.starttime); - }; - - // - // circref = SocialCalc.RecalcCheckCell(sheet, coord) - // - // Checks cell to put on calclist, looking at parsed tokens. - // Also checks cells this cell is dependent upon - // if it contains a formula with cell references. - // If circular reference, returns non-null. - // - - SocialCalc.RecalcCheckCell = function (sheet, startcoord) { - var parseinfo, - ttext, - ttype, - i, - rangecoord, - circref, - value, - pos, - pos2, - cell, - coordvals; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_name = tokentype.name; - var token_coord = tokentype.coord; - - var recalcdata = sheet.recalcdata; - var checkinfo = recalcdata.checkinfo; - - var sheetref = false; // if true, a sheet reference is in effect, so don't check that - var oldcoord = null; // coord of formula that referred to this one when checking down the tree - var coord = startcoord; // the coord of the cell we are checking - - // Start with requested cell, and then continue down or up the dependency tree - // oldcoord (and checkinfo[coord].oldcoord) maintains the reference stack during the tree walk - // checkinfo[coord] maintains the stack of checking looping values, e.g., token number being checked - - mainloop: while (coord) { - cell = sheet.cells[coord]; - coordvals = checkinfo[coord]; - - if ( - !cell || - cell.datatype != "f" || // Don't calculate if not a formula - (coordvals && typeof coordvals != "object") - ) { - // Don't calc if already calculated - coord = oldcoord; // go back up dependency tree to coord that referred to us - if (checkinfo[coord]) oldcoord = checkinfo[coord].oldcoord; - continue; - } - - if (!coordvals) { - // do we have checking information about this cell? - coordvals = new SocialCalc.RecalcCheckInfo(); // no - make a place to hold it - checkinfo[coord] = coordvals; - } - - if (cell.errors) { - // delete errors from previous recalcs - delete cell.errors; - } - - if (!cell.parseinfo) { - // cache parsed formula - cell.parseinfo = scf.ParseFormulaIntoTokens(cell.formula); - } - parseinfo = cell.parseinfo; - - for (i = coordvals.parsepos; i < parseinfo.length; i++) { - // go through each token in formula - - if (coordvals.inrange) { - // processing a range of coords - if (coordvals.inrangestart) { - // first time - fill in other values - if (coordvals.cr1.col > coordvals.cr2.col) { - coordvals.c1 = coordvals.cr2.col; - coordvals.c2 = coordvals.cr1.col; - } else { - coordvals.c1 = coordvals.cr1.col; - coordvals.c2 = coordvals.cr2.col; - } - coordvals.c = coordvals.c1 - 1; // start one before - - if (coordvals.cr1.row > coordvals.cr2.row) { - coordvals.r1 = coordvals.cr2.row; - coordvals.r2 = coordvals.cr1.row; - } else { - coordvals.r1 = coordvals.cr1.row; - coordvals.r2 = coordvals.cr2.row; - } - coordvals.r = coordvals.r1; // start on this row - coordvals.inrangestart = false; - } else { - // not first time - } - coordvals.c += 1; // increment column - if (coordvals.c > coordvals.c2) { - // finished the columns of this row - coordvals.r += 1; // increment row - if (coordvals.r > coordvals.r2) { - // finished checking the entire range - coordvals.inrange = false; - continue; - } - coordvals.c = coordvals.c1; // start at the beginning of next row - } - rangecoord = SocialCalc.crToCoord(coordvals.c, coordvals.r); - - // now check that one - - coordvals.parsepos = i; // remember our position - coordvals.oldcoord = oldcoord; // remember back up chain - oldcoord = coord; // come back to us - coord = rangecoord; - if (checkinfo[coord] && typeof checkinfo[coord] == "object") { - // Circular reference - cell.errors = SocialCalc.Constants.s_caccCircRef + startcoord; // set on original cell making the ref - checkinfo[startcoord] = true; // this one should be calculated once at this point - if (!recalcdata.firstcalc) { - recalcdata.firstcalc = startcoord; - } else { - recalcdata.calclist[recalcdata.lastcalc] = startcoord; - } - recalcdata.lastcalc = startcoord; - recalcdata.calclistlength++; // count number on list - sheet.attribs.circularreferencecell = coord + "|" + oldcoord; // remember at least one circ ref - return cell.errors; - } - continue mainloop; - } - - ttype = parseinfo[i].type; // get token details - ttext = parseinfo[i].text; - if (ttype == token_op) { - // references with sheet specifier are not checked - if (ttext == "!") { - sheetref = true; // found a sheet reference - } else if (ttext != ":") { - // for everything but a range, reset - sheetref = false; - } - } - - if (ttype == token_name) { - // look for named range - value = scf.LookupName(sheet, ttext); - if (value.type == "range") { - // only need to recurse here for range, which may be just one cell - pos = value.value.indexOf("|"); - if (pos != -1) { - // range - check each cell - coordvals.cr1 = SocialCalc.coordToCr( - value.value.substring(0, pos) - ); - pos2 = value.value.indexOf("|", pos + 1); - coordvals.cr2 = SocialCalc.coordToCr( - value.value.substring(pos + 1, pos2) - ); - coordvals.inrange = true; - coordvals.inrangestart = true; - i = i - 1; // back up so will start up again here - continue; - } - } else if (value.type == "coord") { - // just a coord - ttype = token_coord; // treat as a coord inline - ttext = value.value; // and then drop through to next test which should succeed - } else { - // not a defined name - probably a function - } - } - - if (ttype == token_coord) { - // token is a coord - - if ( - i >= 2 && // look for a range - parseinfo[i - 1].type == token_op && - parseinfo[i - 1].text == ":" && - parseinfo[i - 2].type == token_coord && - !sheetref - ) { - // Range -- check each cell - coordvals.cr1 = SocialCalc.coordToCr(parseinfo[i - 2].text); // remember range extents - coordvals.cr2 = SocialCalc.coordToCr(ttext); - coordvals.inrange = true; // next time use the range looping code - coordvals.inrangestart = true; - i = i - 1; // back up so will start up again here - continue; - } else if (!sheetref) { - // Single cell reference - if (ttext.indexOf("$") != -1) ttext = ttext.replace(/\$/g, ""); // remove any $'s - coordvals.parsepos = i + 1; // remember our position - come back on next token - coordvals.oldcoord = oldcoord; // remember back up chain - oldcoord = coord; // come back to us - coord = ttext; - if (checkinfo[coord] && typeof checkinfo[coord] == "object") { - // Circular reference - cell.errors = SocialCalc.Constants.s_caccCircRef + startcoord; // set on original cell making the ref - checkinfo[startcoord] = true; // this one should be calculated once at this point - if (!recalcdata.firstcalc) { - // add to calclist - recalcdata.firstcalc = startcoord; - } else { - recalcdata.calclist[recalcdata.lastcalc] = startcoord; - } - recalcdata.lastcalc = startcoord; - recalcdata.calclistlength++; // count number on list - sheet.attribs.circularreferencecell = coord + "|" + oldcoord; // remember at least one circ ref - return cell.errors; - } - continue mainloop; - } - } - } - - sheetref = false; // make sure off when bump back up - - checkinfo[coord] = true; // this one is finished - if (!recalcdata.firstcalc) { - // add to calclist - recalcdata.firstcalc = coord; - } else { - recalcdata.calclist[recalcdata.lastcalc] = coord; - } - recalcdata.lastcalc = coord; - recalcdata.calclistlength++; // count number on list - - coord = oldcoord; // go back to the formula that referred to us and continue - oldcoord = checkinfo[coord] ? checkinfo[coord].oldcoord : null; - } - - return ""; - }; - - // ************************************* - // - // Parse class: - // - // Used by ExecuteSheetCommand to get elements of commands to execute. - // The string it works with consists of one or more lines each - // made up of one or more tokens separated by a delimiter. - // - // ************************************* - - // Initialize: set string to work with - - SocialCalc.Parse = function (str) { - // properties: - - this.str = str; - this.pos = 0; - this.delimiter = " "; - this.lineEnd = str.indexOf("\n"); - if (this.lineEnd < 0) { - this.lineEnd = str.length; - } - }; - - // Return next token as a string - - SocialCalc.Parse.prototype.NextToken = function () { - if (this.pos < 0) return ""; - var pos2 = this.str.indexOf(this.delimiter, this.pos); - var pos1 = this.pos; - if (pos2 > this.lineEnd) { - // don't go past end of line - pos2 = this.lineEnd; - } - if (pos2 >= 0) { - this.pos = pos2 + 1; - return this.str.substring(pos1, pos2); - } else { - this.pos = this.lineEnd; - return this.str.substring(pos1, this.lineEnd); - } - }; - - // Return everything from current point until end of line - - SocialCalc.Parse.prototype.RestOfString = function () { - var oldpos = this.pos; - if (this.pos < 0 || this.pos >= this.lineEnd) return ""; - this.pos = this.lineEnd; - return this.str.substring(oldpos, this.lineEnd); - }; - - SocialCalc.Parse.prototype.RestOfStringNoMove = function () { - if (this.pos < 0 || this.pos >= this.lineEnd) return ""; - return this.str.substring(this.pos, this.lineEnd); - }; - - // Move current point to next line - - SocialCalc.Parse.prototype.NextLine = function () { - this.pos = this.lineEnd + 1; - this.lineEnd = this.str.indexOf("\n", this.pos); - if (this.lineEnd < 0) { - this.lineEnd = this.str.length; - } - }; - - // Check to see if at end of string with no more to process - - SocialCalc.Parse.prototype.EOF = function () { - if (this.pos < 0 || this.pos >= this.str.length) return true; - return false; - }; - - // ************************************* - // - // UndoStack class: - // - // Implements the behavior needed for a normal application's undo/redo stack. - // You add a new change sequence with PushChange. - // The type argument is a string that can be used to lookup some general string - // like "typing" or "setting attribute" for the menu prompts for undo/redo. - // - // You add the "do" steps with AddDo. The non-null, non-undefined arguments are - // joined together with " " to make a command string to be saved. - // - // You add the undo steps as commands for the most recent change with AddUndo. - // The non-null, non-undefined arguments are joined together with " " to make - // a command string to be saved. - // - // The Undo and Redo functions move the Top Of Stack pointer through the changes stack - // so you can undo and redo. Doing a new PushChange removes all undone items - // after TOS. - // - // You can push more things than you can undo if you want. - // There is a maximum to remember as the "did" stack for an audit trail (and as redo). This may be unlimited. - // There is a separate maximum to remember that can be undone. This may be smaller than maxRedo. - // - // ************************************* - - SocialCalc.UndoStack = function () { - // properties: - - this.stack = []; // {command: [], type: type, undo: []} -- multiple dos and undos allowed - this.tos = -1; // top of stack position, used for undo/redo - this.maxRedo = 0; // Maximum size of redo stack (and audit trail which is this.stack[n].command) or zero if no limit - this.maxUndo = 50; // Maximum number of steps kept for undo (usually the memory intensive part) or zero if no limit - }; - - SocialCalc.UndoStack.prototype.PushChange = function (type) { - // adding a new thing to the stack - while (this.stack.length > 0 && this.stack.length - 1 > this.tos) { - // pop off things not redone - this.stack.pop(); - } - this.stack.push({ command: [], type: type, undo: [] }); - if (this.maxRedo && this.stack.length > this.maxRedo) { - // limit number kept as audit trail - this.stack.shift(); // remove the extra one - } - if (this.maxUndo && this.stack.length > this.maxUndo) { - // need to trim excess undo info - this.stack[this.stack.length - this.maxUndo - 1].undo = []; // only need to remove one - } - this.tos = this.stack.length - 1; - }; - - SocialCalc.UndoStack.prototype.AddDo = function () { - var args = []; - for (var i = 0; i < arguments.length; i++) { - if (arguments[i] != null) args.push(arguments[i]); // ignore null or undefined - } - var cmd = args.join(" "); - this.stack[this.stack.length - 1].command.push(cmd); - }; - - SocialCalc.UndoStack.prototype.AddUndo = function () { - var args = []; - for (var i = 0; i < arguments.length; i++) { - if (arguments[i] != null) args.push(arguments[i]); // ignore null or undefined - } - var cmd = args.join(" "); - this.stack[this.stack.length - 1].undo.push(cmd); - }; - - SocialCalc.UndoStack.prototype.TOS = function () { - if (this.tos >= 0) return this.stack[this.tos]; - else return null; - }; - - SocialCalc.UndoStack.prototype.Undo = function () { - if ( - this.tos >= 0 && - (!this.maxUndo || this.tos > this.stack.length - this.maxUndo - 1) - ) { - this.tos -= 1; - return true; - } else { - return false; - } - }; - - SocialCalc.UndoStack.prototype.Redo = function () { - if (this.tos < this.stack.length - 1) { - this.tos += 1; - return true; - } else { - return false; - } - }; - - // ************************************* - // - // Clipboard Object: - // - // This is a single object. - // Stores the clipboard, which is shared by all active sheets. - // Like the undo stack, it does not persist from one editing session to another. - // - // ************************************* - - SocialCalc.Clipboard = { - // properties: - - clipboard: "", // empty or string in save format with "copiedfrom:" set to a range - }; - - // ************************************* - // - // RenderContext class: - // - // ************************************* - - SocialCalc.RenderContext = function (sheetobj) { - var parts, num, s; - var attribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - // properties: - - this.sheetobj = sheetobj; - this.hideRowsCols = false; // Rendering with panes only works with "false" - // !!!! Note: not implemented yet in rendering, just saved as an attribute - this.showGrid = false; - this.showRCHeaders = false; - this.rownamewidth = scc.defaultRowNameWidth; - this.pixelsPerRow = scc.defaultAssumedRowHeight; - - this.cellskip = {}; // if present, coord of cell covering this cell - this.coordToCR = {}; // for cells starting spans, coordToCR[coord]={row:row, col:col} - this.colwidth = []; // precomputed column widths, taking into account defaults - this.totalwidth = 0; // precomputed total table width - - this.rowpanes = []; // for each pane, {first: firstrow, last: lastrow} - this.colpanes = []; // for each pane, {first: firstrow, last: lastrow} - this.maxcol = 0; // max col and row to display, adding long spans, etc. - this.maxrow = 0; - - this.highlights = {}; // for each cell with special display: coord:highlightType (see this.highlightTypes) - this.cursorsuffix = ""; // added to highlights[cr]=="cursor" to get type to lookup - - this.highlightTypes = - // attributes to change when highlit - { - cursor: { - style: scc.defaultHighlightTypeCursorStyle, - className: scc.defaultHighlightTypeCursorClass, - }, - range: { - style: scc.defaultHighlightTypeRangeStyle, - className: scc.defaultHighlightTypeRangeClass, - }, - cursorinsertup: { - style: - "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-x;backgroundPosition:top left;backgroundImage:url(" + - scc.defaultImagePrefix + - "cursorinsertup.gif);", - className: scc.defaultHighlightTypeCursorClass, - }, - cursorinsertleft: { - style: - "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-y;backgroundPosition:top left;backgroundImage:url(" + - scc.defaultImagePrefix + - "cursorinsertleft.gif);", - className: scc.defaultHighlightTypeCursorClass, - }, - range2: { - style: - "color:#000;backgroundColor:#FFF;backgroundImage:url(" + - scc.defaultImagePrefix + - "range2.gif);", - className: "", - }, - }; - - this.cellIDprefix = scc.defaultCellIDPrefix; // if non-null, each cell will render with an ID - - this.defaultlinkstyle = null; // default linkstyle object (allows you to pass values to link renderer) - this.defaultHTMLlinkstyle = { type: "html" }; // default linkstyle for standalone HTML - - // constants: - - this.defaultfontstyle = scc.defaultCellFontStyle; - this.defaultfontsize = scc.defaultCellFontSize; - this.defaultfontfamily = scc.defaultCellFontFamily; - - this.defaultlayout = scc.defaultCellLayout; - - this.defaultpanedividerwidth = scc.defaultPaneDividerWidth; - this.defaultpanedividerheight = scc.defaultPaneDividerHeight; - - this.gridCSS = scc.defaultGridCSS; - - this.commentClassName = scc.defaultCommentClass; // for cells with non-blank comments when this.showGrid is true - this.commentCSS = scc.defaultCommentStyle; // any combination of classnames and styles may be used - this.commentNoGridClassName = scc.defaultCommentNoGridClass; // for cells when this.showGrid is false - this.commentNoGridCSS = scc.defaultCommentNoGridStyle; // any combination of classnames and styles may be used - - this.classnames = - // any combination of classnames and explicitStyles can be used - { - colname: scc.defaultColnameClass, - rowname: scc.defaultRownameClass, - selectedcolname: scc.defaultSelectedColnameClass, - selectedrowname: scc.defaultSelectedRownameClass, - upperleft: scc.defaultUpperLeftClass, - skippedcell: scc.defaultSkippedCellClass, - panedivider: scc.defaultPaneDividerClass, - }; - - this.explicitStyles = - // these may be used so you won't need a stylesheet with the classnames - { - colname: scc.defaultColnameStyle, - rowname: scc.defaultRownameStyle, - selectedcolname: scc.defaultSelectedColnameStyle, - selectedrowname: scc.defaultSelectedRownameStyle, - upperleft: scc.defaultUpperLeftStyle, - skippedcell: scc.defaultSkippedCellStyle, - panedivider: scc.defaultPaneDividerStyle, - }; - - // processed info about cell skipping - - this.cellskip = null; - this.needcellskip = true; - - // precomputed values, filling in defaults indicated by "*" - - this.fonts = []; // for each fontnum, {style: fs, weight: fw, size: fs, family: ff} - this.layouts = []; // for each layout, "padding:Tpx Rpx Bpx Lpx;vertical-align:va;" - - this.needprecompute = true; // need to call PrecomputeSheetFontsAndLayouts - - // if have a sheet object, initialize constants and precomputed values - - if (sheetobj) { - this.rowpanes[0] = { first: 1, last: attribs.lastrow }; - this.colpanes[0] = { first: 1, last: attribs.lastcol }; - } else throw scc.s_rcMissingSheet; - }; - - // Methods: - - SocialCalc.RenderContext.prototype.PrecomputeSheetFontsAndLayouts = - function () { - SocialCalc.PrecomputeSheetFontsAndLayouts(this); - }; - SocialCalc.RenderContext.prototype.CalculateCellSkipData = function () { - SocialCalc.CalculateCellSkipData(this); - }; - SocialCalc.RenderContext.prototype.CalculateColWidthData = function () { - SocialCalc.CalculateColWidthData(this); - }; - SocialCalc.RenderContext.prototype.SetRowPaneFirstLast = function ( - panenum, - first, - last - ) { - this.rowpanes[panenum] = { first: first, last: last }; - }; - SocialCalc.RenderContext.prototype.SetColPaneFirstLast = function ( - panenum, - first, - last - ) { - this.colpanes[panenum] = { first: first, last: last }; - }; - SocialCalc.RenderContext.prototype.CoordInPane = function ( - coord, - rowpane, - colpane - ) { - return SocialCalc.CoordInPane(this, coord, rowpane, colpane); - }; - SocialCalc.RenderContext.prototype.CellInPane = function ( - row, - col, - rowpane, - colpane - ) { - return SocialCalc.CellInPane(this, row, col, rowpane, colpane); - }; - SocialCalc.RenderContext.prototype.InitializeTable = function (tableobj) { - SocialCalc.InitializeTable(this, tableobj); - }; - SocialCalc.RenderContext.prototype.RenderSheet = function ( - oldtable, - linkstyle - ) { - return SocialCalc.RenderSheet(this, oldtable, linkstyle); - }; - SocialCalc.RenderContext.prototype.RenderColGroup = function () { - return SocialCalc.RenderColGroup(this); - }; - SocialCalc.RenderContext.prototype.RenderColHeaders = function () { - return SocialCalc.RenderColHeaders(this); - }; - SocialCalc.RenderContext.prototype.RenderSizingRow = function () { - return SocialCalc.RenderSizingRow(this); - }; - SocialCalc.RenderContext.prototype.RenderRow = function ( - rownum, - rowpane, - linkstyle - ) { - return SocialCalc.RenderRow(this, rownum, rowpane, linkstyle); - }; - SocialCalc.RenderContext.prototype.RenderSpacingRow = function () { - return SocialCalc.RenderSpacingRow(this); - }; - SocialCalc.RenderContext.prototype.RenderCell = function ( - rownum, - colnum, - rowpane, - colpane, - noElement, - linkstyle - ) { - return SocialCalc.RenderCell( - this, - rownum, - colnum, - rowpane, - colpane, - noElement, - linkstyle - ); - }; - - // Functions: - - SocialCalc.PrecomputeSheetFontsAndLayouts = function (context) { - var defaultfont, parts, layoutre, dparts, sparts, num, s, i; - var sheetobj = context.sheetobj; - var attribs = sheetobj.attribs; - - if (attribs.defaultfont) { - defaultfont = sheetobj.fonts[attribs.defaultfont]; - defaultfont = defaultfont.replace( - /^\*/, - SocialCalc.Constants.defaultCellFontStyle - ); - defaultfont = defaultfont.replace( - /(.+)\*(.+)/, - "$1" + SocialCalc.Constants.defaultCellFontSize + "$2" - ); - defaultfont = defaultfont.replace( - /\*$/, - SocialCalc.Constants.defaultCellFontFamily - ); - parts = defaultfont.match(/^(\S+? \S+?) (\S+?) (\S.*)$/); - context.defaultfontstyle = parts[1]; - context.defaultfontsize = parts[2]; - context.defaultfontfamily = parts[3]; - } - - for (num = 1; num < sheetobj.fonts.length; num++) { - // precompute fonts by filling in the *'s - s = sheetobj.fonts[num]; - s = s.replace(/^\*/, context.defaultfontstyle); - s = s.replace(/(.+)\*(.+)/, "$1" + context.defaultfontsize + "$2"); - s = s.replace(/\*$/, context.defaultfontfamily); - parts = s.match(/^(\S+?) (\S+?) (\S+?) (\S.*)$/); - context.fonts[num] = { - style: parts[1], - weight: parts[2], - size: parts[3], - family: parts[4], - }; - } - - layoutre = - /^padding:\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+);vertical-align:\s*(\S+);/; - dparts = SocialCalc.Constants.defaultCellLayout.match(layoutre); // get built-in defaults - - if (attribs.defaultlayout) { - sparts = sheetobj.layouts[attribs.defaultlayout].match(layoutre); // get sheet defaults, if set - } else { - sparts = ["", "*", "*", "*", "*", "*"]; - } - - for (num = 1; num < sheetobj.layouts.length; num++) { - // precompute layouts by filling in the *'s - s = sheetobj.layouts[num]; - parts = s.match(layoutre); - for (i = 1; i <= 5; i++) { - if (parts[i] == "*") { - parts[i] = sparts[i] != "*" ? sparts[i] : dparts[i]; // if *, sheet default or built-in - } - } - context.layouts[num] = - "padding:" + - parts[1] + - " " + - parts[2] + - " " + - parts[3] + - " " + - parts[4] + - ";vertical-align:" + - parts[5] + - ";"; - } - - context.needprecompute = false; - }; - - SocialCalc.CalculateCellSkipData = function (context) { - var row, - col, - coord, - cell, - contextcell, - colspan, - rowspan, - skiprow, - skipcol, - skipcoord; - - var sheetobj = context.sheetobj; - var sheetrowattribs = sheetobj.rowattribs; - var sheetcolattribs = sheetobj.colattribs; - context.maxrow = 0; - context.maxcol = 0; - context.cellskip = {}; // reset - - // Calculate cellskip data - var maxrow, maxcol; - - for (row = 1; row <= sheetobj.attribs.lastrow; row++) { - for (col = 1; col <= sheetobj.attribs.lastcol; col++) { - // look for spans and set cellskip for skipped cells - coord = SocialCalc.crToCoord(col, row); - cell = sheetobj.cells[coord]; - // don't look at undefined cells (they have no spans) or skipped cells - if (cell === undefined || context.cellskip[coord]) continue; - colspan = cell.colspan || 1; - rowspan = cell.rowspan || 1; - if (colspan > 1 || rowspan > 1) { - for (skiprow = row; skiprow < row + rowspan; skiprow++) { - for (skipcol = col; skipcol < col + colspan; skipcol++) { - // do the setting on individual cells - skipcoord = SocialCalc.crToCoord(skipcol, skiprow); - if (skipcoord == coord) { - // for coord, remember row and col - context.coordToCR[coord] = { row: row, col: col }; - } else { - // for other cells, flag with coord of here - context.cellskip[skipcoord] = coord; - } - if (skiprow > context.maxrow) maxrow = skiprow; - if (skipcol > context.maxcol) maxcol = skipcol; - } - } - } - } - } - - context.needcellskip = false; - }; - - SocialCalc.CalculateColWidthData = function (context) { - var colnum, colname, colwidth, totalwidth; - - var sheetobj = context.sheetobj; - var sheetcolattribs = sheetobj.colattribs; - - // Calculate column width data - - totalwidth = context.showRCHeaders ? context.rownamewidth - 0 : 0; - for (var colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - colname = SocialCalc.rcColname(colnum); - colwidth = - sheetobj.colattribs.width[colname] || - sheetobj.attribs.defaultcolwidth || - SocialCalc.Constants.defaultColWidth; - if (colwidth == "blank" || colwidth == "auto") colwidth = ""; - context.colwidth[colnum] = colwidth + ""; - totalwidth += colwidth && colwidth - 0 > 0 ? colwidth - 0 : 10; - } - } - context.totalwidth = totalwidth; - }; - - SocialCalc.InitializeTable = function (context, tableobj) { - /* - -Uses border-collapse so corners don't have holes -Note: IE and Firefox handle differently (IE adds borders and padding) -under border-collapse and Safari has problems with and wide text -Tablelayout "fixed" also leads to problems - -*/ - - /* - -*** Discussion *** - -The rendering assumes fixed column widths, even though SocialCalc allows "auto". -There may be issues with "auto" and it is hard to make it work cross-browser -with border-collapse, etc. - -This and the RenderSheet routine are where in the code the specifics of -table attributes and column size definitions are set. As the browsers settle down -and when we decide if we don't need auto width, we may want to revisit the way the -code does this (e.g., use table-layout:fixed). - -*/ - tableobj.style.borderCollapse = "collapse"; - tableobj.cellSpacing = "0"; - tableobj.cellPadding = "0"; - - tableobj.style.width = context.totalwidth + "px"; - }; - - // - // tableobj = SocialCalc.RenderSheet(context, oldtable, linkstyle) - // - // Renders a render context returning a DOM table object. - // If there is an oldtable object, it replaces it in the parent node. - // If oldtable is null, it just returns the new one. - // The linkstyle is "" or null for editing rendering - // and optionally an object passed on to formatting code. - // - - SocialCalc.RenderSheet = function (context, oldtable, linkstyle) { - var newrow, rowpane; - var tableobj, colgroupobj, tbodyobj, parentnode; - - // do precompute stuff if necessary - - if (context.sheetobj.changedrendervalues) { - context.needcellskip = true; - context.needprecompute = true; - context.sheetobj.changedrendervalues = false; - } - if (context.needcellskip) { - context.CalculateCellSkipData(); - } - if (context.needprecompute) { - context.PrecomputeSheetFontsAndLayouts(); - } - - context.CalculateColWidthData(); // always make sure col width values are up to date - - // make the table element and fill it in - - tableobj = document.createElement("table"); - context.InitializeTable(tableobj); - - colgroupobj = context.RenderColGroup(); - tableobj.appendChild(colgroupobj); - - tbodyobj = document.createElement("tbody"); - - tbodyobj.appendChild(context.RenderSizingRow()); - - if (context.showRCHeaders) { - newrow = context.RenderColHeaders(); - if (newrow) tbodyobj.appendChild(newrow); - } - - for (rowpane = 0; rowpane < context.rowpanes.length; rowpane++) { - for ( - var rownum = context.rowpanes[rowpane].first; - rownum <= context.rowpanes[rowpane].last; - rownum++ - ) { - newrow = context.RenderRow(rownum, rowpane, linkstyle); - tbodyobj.appendChild(newrow); - } - if (rowpane < context.rowpanes.length - 1) { - newrow = context.RenderSpacingRow(); - tbodyobj.appendChild(newrow); - } - } - - tableobj.appendChild(tbodyobj); - - if (oldtable) { - parentnode = oldtable.parentNode; - if (parentnode) parentnode.replaceChild(tableobj, oldtable); - } - - SocialCalc.EvalUserScripts(); - - return tableobj; - }; - - SocialCalc.RenderRow = function (context, rownum, rowpane, linkstyle) { - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - var colnum, newcol, colpane, newdiv; - - if (context.showRCHeaders) { - newcol = document.createElement("td"); - if (context.classnames) newcol.className = context.classnames.rowname; - if (context.explicitStyles) - newcol.style.cssText = context.explicitStyles.rowname; - newcol.width = context.rownamewidth; - newcol.style.verticalAlign = "top"; // to get around Safari making top of centered row number be - // considered top of row (and can't get position in Safari) - if (!SocialCalc.Constants.SCNoRowName) { - newcol.innerHTML = rownum + ""; - } - result.appendChild(newcol); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = context.RenderCell( - rownum, - colnum, - rowpane, - colpane, - null, - linkstyle - ); - if (newcol) result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("td"); - newcol.width = context.defaultpanedividerwidth; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - newdiv = document.createElement("div"); // for Firefox to avoid squishing - newdiv.style.width = context.defaultpanedividerwidth + "px"; - newdiv.style.overflow = "hidden"; - newcol.appendChild(newdiv); - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderSpacingRow = function (context) { - var colnum, newcol, colpane, w; - - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - - if (context.showRCHeaders) { - newcol = document.createElement("td"); - newcol.width = context.rownamewidth; - newcol.height = context.defaultpanedividerheight; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - result.appendChild(newcol); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = document.createElement("td"); - w = context.colwidth[colnum]; - if (w) newcol.width = w; - newcol.height = context.defaultpanedividerheight; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - if (newcol) result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("td"); - newcol.width = context.defaultpanedividerwidth; - newcol.height = context.defaultpanedividerheight; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderColHeaders = function (context) { - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - var colnum, newcol; - - if (!context.showRCHeaders) return null; - - newcol = document.createElement("td"); - if (context.classnames) newcol.className = context.classnames.upperleft; - if (context.explicitStyles) - newcol.style.cssText = context.explicitStyles.upperleft; - newcol.width = context.rownamewidth; - result.appendChild(newcol); - - for (var colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = document.createElement("td"); - if (context.classnames) newcol.className = context.classnames.colname; - if (context.explicitStyles) - newcol.style.cssText = context.explicitStyles.colname; - if (SocialCalc.Constants.SCNoColNames) { - // newcol.innerHTML=" "; - // newcol.innerHTML=""; - } else { - newcol.innerHTML = SocialCalc.rcColname(colnum); - } - result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("td"); - newcol.width = context.defaultpanedividerwidth; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderColGroup = function (context) { - var colpane, colnum, newcol, t; - var sheetobj = context.sheetobj; - - var result = document.createElement("colgroup"); - - if (context.showRCHeaders) { - newcol = document.createElement("col"); - newcol.width = context.rownamewidth; - result.appendChild(newcol); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = document.createElement("col"); - t = context.colwidth[colnum]; - if (t) newcol.width = t; - result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("col"); - newcol.width = context.defaultpanedividerwidth; - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderSizingRow = function (context) { - var colpane, colnum, newcell, t; - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - - if (context.showRCHeaders) { - newcell = document.createElement("td"); - newcell.style.width = context.rownamewidth + "px"; - newcell.height = "1"; - result.appendChild(newcell); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcell = document.createElement("td"); - t = context.colwidth[colnum]; - if (t) newcell.width = t; - newcell.height = "1"; - result.appendChild(newcell); - } - if (colpane < context.colpanes.length - 1) { - newcell = document.createElement("td"); - newcell.width = context.defaultpanedividerwidth; - newcell.height = "1"; - result.appendChild(newcell); - } - } - return result; - }; - - SocialCalc.RenderCell = function ( - context, - rownum, - colnum, - rowpane, - colpane, - noElement, - linkstyle - ) { - var sheetobj = context.sheetobj; - - var num, t, result, span, stylename, cell, sheetattribs, scdefaults; - var stylestr = ""; - - rownum = rownum - 0; // make sure a number - colnum = colnum - 0; - - var coord = SocialCalc.crToCoord(colnum, rownum); - - if (context.cellskip[coord]) { - // skip if within a span - if (context.CoordInPane(context.cellskip[coord], rowpane, colpane)) { - return null; // span starts in this pane -- so just skip - } - result = noElement - ? SocialCalc.CreatePseudoElement() - : document.createElement("td"); // span start is scrolled away, so make a special cell - if (context.classnames.skippedcell) - result.className = context.classnames.skippedcell; - if (context.explicitStyles.skippedcell) - result.style.cssText = context.explicitStyles.skippedcell; - result.innerHTML = " "; // put something there so height is OK - // !!! Really need to add borders in case there isn't anything else shown in the pane to get height - return result; - } - - result = noElement - ? SocialCalc.CreatePseudoElement() - : document.createElement("td"); - - if (context.cellIDprefix) { - result.id = context.cellIDprefix + coord; - } - - cell = sheetobj.cells[coord]; - - if (!cell) { - cell = new SocialCalc.Cell(coord); - } - - sheetattribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - if (cell.colspan > 1) { - span = 1; - for (num = 1; num < cell.colspan; num++) { - if ( - sheetobj.colattribs.hide[SocialCalc.rcColname(colnum + num)] != - "yes" && - context.CellInPane(rownum, colnum + num, rowpane, colpane) - ) { - span++; - } - } - result.colSpan = span; - } - - if (cell.rowspan > 1) { - span = 1; - for (num = 1; num < cell.rowspan; num++) { - if ( - sheetobj.rowattribs.hide[rownum + num + ""] != "yes" && - context.CellInPane(rownum + num, colnum, rowpane, colpane) - ) - span++; - } - result.rowSpan = span; - } - - if (cell.displaystring == undefined) { - // cache the display value - cell.displaystring = SocialCalc.FormatValueForDisplay( - sheetobj, - cell.datavalue, - coord, - linkstyle || context.defaultlinkstyle - ); - } else { - // callout to execute scripts if needed - SocialCalc.CallOutOnRenderCell(sheetobj, cell.datavalue, coord); - } - result.innerHTML = cell.displaystring; - - num = cell.layout || sheetattribs.defaultlayout; - if (num) { - stylestr += context.layouts[num]; // use precomputed layout with "*"'s filled in - } else { - stylestr += scc.defaultCellLayout; - } - - num = cell.font || sheetattribs.defaultfont; - if (num) { - // get expanded font strings in context - t = context.fonts[num]; // do each - plain "font:" style sets all sorts of other values, too (Safari font-stretch problem on cssText) - stylestr += - "font-style:" + - t.style + - ";font-weight:" + - t.weight + - ";font-size:" + - t.size + - ";font-family:" + - t.family + - ";"; - } else { - if (scc.defaultCellFontSize) { - stylestr += "font-size:" + scc.defaultCellFontSize + ";"; - } - if (scc.defaultCellFontFamily) { - stylestr += "font-family:" + scc.defaultCellFontFamily + ";"; - } - } - - num = cell.color || sheetattribs.defaultcolor; - if (num) stylestr += "color:" + sheetobj.colors[num] + ";"; - - num = cell.bgcolor || sheetattribs.defaultbgcolor; - if (num) stylestr += "background-color:" + sheetobj.colors[num] + ";"; - - num = cell.cellformat; - if (num) { - stylestr += "text-align:" + sheetobj.cellformats[num] + ";"; - } else { - t = cell.valuetype.charAt(0); - if (t == "t") { - num = sheetattribs.defaulttextformat; - if (num) stylestr += "text-align:" + sheetobj.cellformats[num] + ";"; - } else if ((t = "n")) { - num = sheetattribs.defaultnontextformat; - if (num) { - stylestr += "text-align:" + sheetobj.cellformats[num] + ";"; - } else { - stylestr += "text-align:right;"; - } - } else stylestr += "text-align:left;"; - } - - num = cell.bt; - if (num) stylestr += "border-top:" + sheetobj.borderstyles[num] + ";"; - - num = cell.br; - if (num) stylestr += "border-right:" + sheetobj.borderstyles[num] + ";"; - else if (context.showGrid) { - if ( - context.CellInPane( - rownum, - colnum + (cell.colspan || 1), - rowpane, - colpane - ) - ) - t = SocialCalc.crToCoord(colnum + (cell.colspan || 1), rownum); - else t = "nomatch"; - if (context.cellskip[t]) t = context.cellskip[t]; - if (!sheetobj.cells[t] || !sheetobj.cells[t].bl) - stylestr += "border-right:" + context.gridCSS; - } - - num = cell.bb; - if (num) stylestr += "border-bottom:" + sheetobj.borderstyles[num] + ";"; - else if (context.showGrid) { - if ( - context.CellInPane( - rownum + (cell.rowspan || 1), - colnum, - rowpane, - colpane - ) - ) - t = SocialCalc.crToCoord(colnum, rownum + (cell.rowspan || 1)); - else t = "nomatch"; - if (context.cellskip[t]) t = context.cellskip[t]; - if (!sheetobj.cells[t] || !sheetobj.cells[t].bt) - stylestr += "border-bottom:" + context.gridCSS; - } - - num = cell.bl; - if (num) stylestr += "border-left:" + sheetobj.borderstyles[num] + ";"; - - if (cell.comment) { - if (context.showGrid) { - if (context.commentClassName) { - result.className = - (result.className ? result.className + " " : "") + - context.commentClassName; - } - stylestr += context.commentCSS; - } else { - if (context.commentNoGridClassName) { - result.className = - (result.className ? result.className + " " : "") + - context.commentNoGridClassName; - } - stylestr += context.commentNoGridCSS; - } - } - - result.style.cssText = stylestr; - - //!!!!!!!!! - // NOTE: csss and cssc are not supported yet. - // csss needs to be parsed into pieces to override just the attributes specified, not all with assignment to cssText. - // cssc just needs to set the className. - - t = context.highlights[coord]; - if (t) { - // this is a highlit cell: Override style appropriately - if (t == "cursor") t += context.cursorsuffix; // cursor can take alternative forms - if (context.highlightTypes[t].className) { - result.className = - (result.className ? result.className + " " : "") + - context.highlightTypes[t].className; - } - // only if cell is editable, set the cursor class - if ( - t == "cursor" && - SocialCalc.Callbacks.IsCoordEditable && - !SocialCalc.Callbacks.IsCoordEditable( - context.sheetobj.sheetname + "!" + coord - ) - ) { - SocialCalc.setStyles(result, ""); - } else { - SocialCalc.setStyles(result, context.highlightTypes[t].style); - } - } - - return result; - }; - - SocialCalc.CoordInPane = function (context, coord, rowpane, colpane) { - var coordToCR = context.coordToCR[coord]; - if (!coordToCR || !coordToCR.row || !coordToCR.col) - throw "Bad coordToCR for " + coord; - return context.CellInPane(coordToCR.row, coordToCR.col, rowpane, colpane); - }; - - SocialCalc.CellInPane = function (context, row, col, rowpane, colpane) { - var panerowlimits = context.rowpanes[rowpane]; - var panecollimits = context.colpanes[colpane]; - if (!panerowlimits || !panecollimits) - throw "CellInPane called with unknown panes " + rowpane + "/" + colpane; - if (row < panerowlimits.first || row > panerowlimits.last) return false; - if (col < panecollimits.first || col > panecollimits.last) return false; - return true; - }; - - SocialCalc.CreatePseudoElement = function () { - return { style: { cssText: "" }, innerHTML: "", className: "" }; - }; - - // ************************************* - // - // Misc. functions: - // - // ************************************* - - SocialCalc.rcColname = function (c) { - if (c > 702) c = 702; // maximum number of columns - ZZ - if (c < 1) c = 1; - var collow = ((c - 1) % 26) + 65; - var colhigh = Math.floor((c - 1) / 26); - if (colhigh) - return String.fromCharCode(colhigh + 64) + String.fromCharCode(collow); - else return String.fromCharCode(collow); - }; - - SocialCalc.letters = [ - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - ]; - - SocialCalc.crToCoord = function (c, r) { - var result; - if (c < 1) c = 1; - if (c > 702) c = 702; // maximum number of columns - ZZ - if (r < 1) r = 1; - var collow = (c - 1) % 26; - var colhigh = Math.floor((c - 1) / 26); - if (colhigh) - result = SocialCalc.letters[colhigh - 1] + SocialCalc.letters[collow] + r; - else result = SocialCalc.letters[collow] + r; - return result; - }; - - SocialCalc.coordToCol = {}; // too expensive to set in crToCoord since that is called so many times - SocialCalc.coordToRow = {}; - - SocialCalc.coordToCr = function (cr) { - var c, i, ch; - var r = SocialCalc.coordToRow[cr]; - if (r) return { row: r, col: SocialCalc.coordToCol[cr] }; - c = 0; - r = 0; - for (i = 0; i < cr.length; i++) { - // this was faster than using regexes; assumes well-formed - ch = cr.charCodeAt(i); - if (ch == 36); - else if (ch <= 57) - // skip $'s - r = 10 * r + ch - 48; - else if (ch >= 97) c = 26 * c + ch - 96; - else if (ch >= 65) c = 26 * c + ch - 64; - } - SocialCalc.coordToCol[cr] = c; - SocialCalc.coordToRow[cr] = r; - return { row: r, col: c }; - }; - - SocialCalc.ParseRange = function (range) { - var pos, cr, cr1, cr2; - if (!range) range = "A1:A1"; // error return, hopefully benign - range = range.toUpperCase(); - pos = range.indexOf(":"); - if (pos >= 0) { - cr = range.substring(0, pos); - cr1 = SocialCalc.coordToCr(cr); - cr1.coord = cr; - cr = range.substring(pos + 1); - cr2 = SocialCalc.coordToCr(cr); - cr2.coord = cr; - } else { - cr1 = SocialCalc.coordToCr(range); - cr1.coord = range; - cr2 = SocialCalc.coordToCr(range); - cr2.coord = range; - } - return { cr1: cr1, cr2: cr2 }; - }; - - SocialCalc.decodeFromSave = function (s) { - if (typeof s != "string") return s; - if (s.indexOf("\\") == -1) return s; // for performace reasons: replace nothing takes up time - var r = s.replace(/\\c/g, ":"); - r = r.replace(/\\n/g, "\n"); - return r.replace(/\\b/g, "\\"); - }; - - SocialCalc.decodeFromAjax = function (s) { - if (typeof s != "string") return s; - if (s.indexOf("\\") == -1) return s; // for performace reasons: replace nothing takes up time - var r = s.replace(/\\c/g, ":"); - r = r.replace(/\\n/g, "\n"); - r = r.replace(/\\e/g, "]]"); - return r.replace(/\\b/g, "\\"); - }; - - SocialCalc.encodeForSave = function (s) { - if (typeof s != "string") return s; - if (s.indexOf("\\") != -1) - // for performace reasons: replace nothing takes up time - s = s.replace(/\\/g, "\\b"); - if (s.indexOf(":") != -1) s = s.replace(/:/g, "\\c"); - if (s.indexOf("\n") != -1) s = s.replace(/\n/g, "\\n"); - return s; - }; - - // - // Returns estring where &, <, >, " are HTML escaped - // - SocialCalc.special_chars = function (string) { - if (/[&<>"]/.test(string)) { - // only do "slow" replaces if something to replace - string = string.replace(/&/g, "&"); - string = string.replace(//g, ">"); - string = string.replace(/"/g, """); - } - return string; - }; - - SocialCalc.Lookup = function (value, list) { - for (i = 0; i < list.length; i++) { - if (list[i] > value) { - if (i > 0) return i - 1; - else return null; - } - } - return list.length - 1; // if all smaller, matches last - }; - - // - // setStyles(element, cssText) - // - // Takes a pseudo style string (e.g., text-align must be textAlign) and sets - // the element's style value for each style name listed (leaving others unchanged). - // OK to call with null cssText. - // - - SocialCalc.setStyles = function (element, cssText) { - var parts, part, pos, name, value; - - if (!cssText) return; - - parts = cssText.split(";"); - for (part = 0; part < parts.length; part++) { - pos = parts[part].indexOf(":"); // find first colon (could be one in url) - if (pos != -1) { - name = parts[part].substring(0, pos); - value = parts[part].substring(pos + 1); - if (name && value) { - // if non-null name and value, set style - element.style[name] = value; - } - } - // namevalue = parts[part].split(":"); - // if (namevalue[0]) element.style[namevalue[0]] = namevalue[1]; - } - }; - - // - // GetViewportInfo() - returns object with viewport width and height, and scroll offsets - // - // Flanagan, JavaScript, 5th Edition, page 276 - // - - SocialCalc.GetViewportInfo = function () { - var result = {}; - - if (window.innerWidth) { - // all but IE - result.width = window.innerWidth; - result.height = window.innerHeight; - result.horizontalScroll = window.pageXOffset; - result.verticalScroll = window.pageYOffset; - } else { - if (document.documentElement && document.documentElement.clientWidth) { - result.width = document.documentElement.clientWidth; - result.height = document.documentElement.clientHeight; - result.horizontalScroll = document.documentElement.scrollLeft; - result.verticalScroll = document.documentElement.scrollTop; - } else if (document.body.clientWidth) { - result.width = document.body.clientWidth; - result.height = document.body.clientHeight; - result.horizontalScroll = document.body.scrollLeft; - result.verticalScroll = document.body.scrollTop; - } - } - - return result; - }; - - // - // GetElementPosition(element) - returns object with left and top position of the element in the document - // - // Goodman's JavaScript & DHTML Cookbook, 2nd Edition, page 415 - // - - SocialCalc.GetElementPosition = function (element) { - var offsetLeft = 0; - var offsetTop = 0; - while (element) { - offsetLeft += element.offsetLeft; - offsetTop += element.offsetTop; - element = element.offsetParent; - } - return { left: offsetLeft, top: offsetTop }; - }; - - // - // GetElementPositionWithScroll(element) - returns object with left and top position of the element in the document - // - // Takes into account scroll offsets by going through entire tree - // - - SocialCalc.GetElementPositionWithScroll = function (element) { - var offsetLeft = 0; - var offsetTop = 0; - var offsetElement = element; - while (element) { - if (element.tagName == "HTML") break; - if (element == offsetElement) { - offsetLeft += element.offsetLeft; - offsetTop += element.offsetTop; - offsetElement = element.offsetParent; - } - if (element.scrollLeft) { - offsetLeft -= element.scrollLeft; - } - if (element.scrollTop) { - offsetTop -= element.scrollTop; - } - element = element.parentNode; - } - return { left: offsetLeft, top: offsetTop }; - }; - - // - // LookupElement(element, array) - returns array element which is an object with "element" of element - // - - SocialCalc.LookupElement = function (element, array) { - var i; - for (i = 0; i < array.length; i++) { - if (array[i].element == element) return array[i]; - } - return null; - }; - - // - // AssignID(obj, element, id) - Optionally assigns an ID with a prefix to the element - // - - SocialCalc.AssignID = function (obj, element, id) { - if (obj.idPrefix) { - // Object must have a non-empty idPrefix attribute - element.id = obj.idPrefix + id; - } - }; - - // - // SocialCalc.GetCellContents(sheetobj, coord) - // - // Returns the contents (value, formula, constant, etc.) of a cell - // with appropriate prefix ("'", "=", etc.) - // - - SocialCalc.GetCellContents = function (sheetobj, coord) { - var result = ""; - var cellobj = sheetobj.cells[coord]; - if (cellobj) { - switch (cellobj.datatype) { - case "v": - result = cellobj.datavalue + ""; - break; - case "t": - result = "'" + cellobj.datavalue; - break; - case "f": - result = "=" + cellobj.formula; - break; - case "c": - result = cellobj.formula; - break; - default: - break; - } - } - - return result; - }; - - // - // Routines translated from the SocialCalc 1.1.0 Perl code: - // - // (Makes use of the FormatNumber JavaScript code translated from the Perl.) - // - - // - // displayvalue = FormatValueForDisplay(sheetobj, value, cr, linkstyle) - // - // Returns a string, in HTML, for the contents of a cell. - // - // The value is a either numeric or text, the cr is the coord of the cell - // (its cell properties are used to determine formatting), and linkstyle - // is a value passed to wiki-text expansion routines specifying the - // purpose of the rendering so, for example, links can be rendered differently - // during edit than with plain HTML. - // - - SocialCalc.FormatValueForDisplay = function (sheetobj, value, cr, linkstyle) { - var valueformat, has_parens, has_commas, valuetype, valuesubtype; - var displayvalue; - - var sheetattribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - var cell = sheetobj.cells[cr]; - - if (!cell) { - // get an empty cell if not there - cell = new SocialCalc.Cell(cr); - } - - displayvalue = value; - - valuetype = cell.valuetype || ""; // get type of value to determine formatting - valuesubtype = valuetype.substring(1); - valuetype = valuetype.charAt(0); - - if (cell.errors || valuetype == "e") { - displayvalue = cell.errors || valuesubtype || "Error in cell"; - return displayvalue; - } - - if (valuetype == "t") { - valueformat = - sheetobj.valueformats[cell.textvalueformat - 0] || - sheetobj.valueformats[sheetattribs.defaulttextvalueformat - 0] || - ""; - if (valueformat == "formula") { - if (cell.datatype == "f") { - displayvalue = - SocialCalc.special_chars("=" + cell.formula) || " "; - } else if (cell.datatype == "c") { - displayvalue = - SocialCalc.special_chars("'" + cell.formula) || " "; - } else { - displayvalue = - SocialCalc.special_chars("'" + displayvalue) || " "; - } - return displayvalue; - } - displayvalue = SocialCalc.format_text_for_display( - displayvalue, - cell.valuetype, - valueformat, - sheetobj, - linkstyle - ); - if (valueformat == "text-html") - SocialCalc.ScriptCheck(sheetobj.sheetid, cr, value); - } else if (valuetype == "n") { - valueformat = cell.nontextvalueformat; - if (valueformat == null || valueformat == "") { - // - valueformat = sheetattribs.defaultnontextvalueformat; - } - valueformat = sheetobj.valueformats[valueformat - 0]; - if (valueformat == null || valueformat == "none") { - valueformat = ""; - } - if (valueformat == "formula") { - if (cell.datatype == "f") { - displayvalue = - SocialCalc.special_chars("=" + cell.formula) || " "; - } else if (cell.datatype == "c") { - displayvalue = - SocialCalc.special_chars("'" + cell.formula) || " "; - } else { - displayvalue = - SocialCalc.special_chars("'" + displayvalue) || " "; - } - return displayvalue; - } else if (valueformat == "forcetext") { - if (cell.datatype == "f") { - displayvalue = - SocialCalc.special_chars("=" + cell.formula) || " "; - } else if (cell.datatype == "c") { - displayvalue = SocialCalc.special_chars(cell.formula) || " "; - } else { - displayvalue = SocialCalc.special_chars(displayvalue) || " "; - } - return displayvalue; - } - - displayvalue = SocialCalc.format_number_for_display( - displayvalue, - cell.valuetype, - valueformat - ); - } else { - // unknown type - probably blank - displayvalue = " "; - } - - return displayvalue; - }; - - // - // displayvalue = format_text_for_display(rawvalue, valuetype, valueformat, sheetobj, linkstyle) - // - - SocialCalc.format_text_for_display = function ( - rawvalue, - valuetype, - valueformat, - sheetobj, - linkstyle - ) { - var valueformat, valuesubtype, dvsc, dvue, textval; - var displayvalue; - - valuesubtype = valuetype.substring(1); - - displayvalue = rawvalue; - - if (valueformat == "none" || valueformat == null) valueformat = ""; - if (!/^(text-|custom|hidden)/.test(valueformat)) valueformat = ""; - if (valueformat == "" || valueformat == "General") { - // determine format from type - if (valuesubtype == "h") valueformat = "text-html"; - if (valuesubtype == "w" || valuesubtype == "r") valueformat = "text-wiki"; - if (valuesubtype == "l") valueformat = "text-link"; - if (!valuesubtype) valueformat = "text-plain"; - } - if (valueformat == "text-html") { - // HTML - output as it as is - } else if ( - SocialCalc.Callbacks.expand_wiki && - /^text-wiki/.test(valueformat) - ) { - // do general wiki markup - displayvalue = SocialCalc.Callbacks.expand_wiki( - displayvalue, - sheetobj, - linkstyle, - valueformat - ); - } else if (valueformat == "text-wiki") { - // Wiki-text - encode then output - displayvalue = SocialCalc.special_chars(displayvalue); - } else if (valueformat == "text-wiki") { - // wiki text - displayvalue = - (SocialCalc.Callbacks.expand_markup && - SocialCalc.Callbacks.expand_markup( - displayvalue, - sheetobj, - linkstyle - )) || // do old wiki markup - SocialCalc.special_chars(displayvalue); - } else if (valueformat == "text-url") { - // text is a URL for a link - dvsc = SocialCalc.special_chars(displayvalue); - dvue = encodeURI(displayvalue); - displayvalue = '' + dvsc + ""; - } else if (valueformat == "text-link") { - // more extensive link capabilities for regular web links - displayvalue = SocialCalc.expand_text_link( - displayvalue, - sheetobj, - linkstyle, - valueformat - ); - } else if (valueformat == "text-image") { - // text is a URL for an image - dvue = encodeURI(displayvalue); - displayvalue = ''; - } else if (valueformat.substring(0, 12) == "text-custom:") { - // construct a custom text format: @r = text raw, @s = special chars, @u = url encoded - dvsc = SocialCalc.special_chars(displayvalue); // do special chars - dvsc = dvsc.replace(/ /g, "  "); // keep multiple spaces - dvsc = dvsc.replace(/\n/g, "
    "); // keep line breaks - dvue = encodeURI(displayvalue); - textval = {}; - textval.r = displayvalue; - textval.s = dvsc; - textval.u = dvue; - displayvalue = valueformat.substring(12); // remove "text-custom:" - displayvalue = displayvalue.replace(/@(r|s|u)/g, function (a, c) { - return textval[c]; - }); // replace placeholders - } else if (valueformat.substring(0, 6) == "custom") { - // custom - displayvalue = SocialCalc.special_chars(displayvalue); // do special chars - displayvalue = displayvalue.replace(/ /g, "  "); // keep multiple spaces - displayvalue = displayvalue.replace(/\n/g, "
    "); // keep line breaks - displayvalue += " (custom format)"; - } else if (valueformat == "hidden") { - displayvalue = " "; - } else { - // plain text - displayvalue = SocialCalc.special_chars(displayvalue); // do special chars - displayvalue = displayvalue.replace(/ /g, "  "); // keep multiple spaces - displayvalue = displayvalue.replace(/\n/g, "
    "); // keep line breaks - } - - return displayvalue; - }; - - // - // displayvalue = format_number_for_display(rawvalue, valuetype, valueformat) - // - - SocialCalc.format_number_for_display = function ( - rawvalue, - valuetype, - valueformat - ) { - var value, valuesubtype; - var scc = SocialCalc.Constants; - - value = rawvalue - 0; - - valuesubtype = valuetype.substring(1); - - if (valueformat == "Auto" || valueformat == "") { - // cases with default format - if (valuesubtype == "%") { - // will display a % character - valueformat = "#,##0.0%"; - } else if (valuesubtype == "$") { - valueformat = "[$]#,##0.00"; - } else if (valuesubtype == "dt") { - valueformat = scc.defaultFormatdt; - } else if (valuesubtype == "d") { - valueformat = scc.defaultFormatd; - } else if (valuesubtype == "t") { - valueformat = scc.defaultFormatt; - } else if (valuesubtype == "l") { - valueformat = "logical"; - } else { - valueformat = "General"; - } - } - - if (valueformat == "logical") { - // do logical format - return value ? scc.defaultDisplayTRUE : scc.defaultDisplayFALSE; - } - - if (valueformat == "hidden") { - // do hidden format - return " "; - } - - // Use format - - return SocialCalc.FormatNumber.formatNumberWithFormat( - rawvalue, - valueformat, - "" - ); - }; - - // - // valueinfo = DetermineValueType(rawvalue) - // - // Takes a value and looks for special formatting like $, %, numbers, etc. - // Returns the value as a number or string and the type as {value: value, type: type}. - // Tries to follow the spec for spreadsheet function VALUE(v). - // - - SocialCalc.DetermineValueType = function (rawvalue) { - var value = rawvalue + ""; - var type = "t"; - var tvalue, matches, year, hour, minute, second, denom, num, intgr, constr; - - tvalue = value.replace(/^\s+/, ""); // remove leading and trailing blanks - tvalue = tvalue.replace(/\s+$/, ""); - - if (value.length == 0) { - type = ""; - } else if (value.match(/^\s+$/)) { - // just blanks - // leave type "t" - } else if (tvalue.match(/^[-+]?\d*(?:\.)?\d*(?:[eE][-+]?\d+)?$/)) { - // general number, including E - value = tvalue - 0; // try converting to number - if (isNaN(value)) { - // leave alone - catches things like plain "-" - value = rawvalue + ""; - } else { - type = "n"; - } - } else if (tvalue.match(/^[-+]?\d*(?:\.)?\d*\s*%$/)) { - // percent form: 15.1% - value = (tvalue.slice(0, -1) - 0) / 100; // convert and scale - type = "n%"; - } else if ( - tvalue.match(/^[-+]?\$\s*\d*(?:\.)?\d*\s*$/) && - tvalue.match(/\d/) - ) { - // $ format: $1.49 - value = tvalue.replace(/\$/, "") - 0; - type = "n$"; - } else if (tvalue.match(/^[-+]?(\d*,\d*)+(?:\.)?\d*$/)) { - // number format ignoring commas: 1,234.49 - value = tvalue.replace(/,/g, "") - 0; - type = "n"; - } else if (tvalue.match(/^[-+]?(\d*,\d*)+(?:\.)?\d*\s*%$/)) { - // % with commas: 1,234.49% - value = (tvalue.replace(/[%,]/g, "") - 0) / 100; - type = "n%"; - } else if ( - tvalue.match(/^[-+]?\$\s*(\d*,\d*)+(?:\.)?\d*$/) && - tvalue.match(/\d/) - ) { - // $ and commas: $1,234.49 - value = tvalue.replace(/[\$,]/g, "") - 0; - type = "n$"; - } else if ( - (matches = value.match(/^(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{1,4})\s*$/)) - ) { - // MM/DD/YYYY, MM/DD/YYYY - year = matches[3] - 0; - year = year < 1000 ? year + 2000 : year; - value = - SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - year, - matches[1] - 0, - matches[2] - 0 - ) - 2415019; - type = "nd"; - } else if ( - (matches = value.match(/^(\d{4})[\/\-](\d{1,2})[\/\-](\d{1,2})\s*$/)) - ) { - // YYYY-MM-DD, YYYY/MM/DD - year = matches[1] - 0; - year = year < 1000 ? year + 2000 : year; - value = - SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - year, - matches[2] - 0, - matches[3] - 0 - ) - 2415019; - type = "nd"; - } else if ((matches = value.match(/^(\d{1,2}):(\d{1,2})\s*$/))) { - // HH:MM - hour = matches[1] - 0; - minute = matches[2] - 0; - if (hour < 24 && minute < 60) { - value = hour / 24 + minute / (24 * 60); - type = "nt"; - } - } else if ((matches = value.match(/^(\d{1,2}):(\d{1,2}):(\d{1,2})\s*$/))) { - // HH:MM:SS - hour = matches[1] - 0; - minute = matches[2] - 0; - second = matches[3] - 0; - if (hour < 24 && minute < 60 && second < 60) { - value = hour / 24 + minute / (24 * 60) + second / (24 * 60 * 60); - type = "nt"; - } - } else if ((matches = value.match(/^\s*([-+]?\d+) (\d+)\/(\d+)\s*$/))) { - // 1 1/2 - intgr = matches[1] - 0; - num = matches[2] - 0; - denom = matches[3] - 0; - if (denom && denom > 0) { - value = intgr + (intgr < 0 ? -num / denom : num / denom); - type = "n"; - } - } else if ((constr = SocialCalc.InputConstants[value.toUpperCase()])) { - // special constants, like "false" and #N/A - num = constr.indexOf(","); - value = constr.substring(0, num) - 0; - type = constr.substring(num + 1); - } else if ( - tvalue.length > 7 && - tvalue.substring(0, 7).toLowerCase() == "http://" - ) { - // URL - value = tvalue; - type = "tl"; - } - - return { value: value, type: type }; - }; - - SocialCalc.InputConstants = { - // strings that turn into constants for SocialCalc.DetermineValueType - TRUE: "1,nl", - FALSE: "0,nl", - "#N/A": "0,e#N/A", - "#NULL!": "0,e#NULL!", - "#NUM!": "0,e#NUM!", - "#DIV/0!": "0,e#DIV/0!", - "#VALUE!": "0,e#VALUE!", - "#REF!": "0,e#REF!", - "#NAME?": "0,e#NAME?", - }; - - // - // result = default_expand_markup(displayvalue, sheetobj, linkstyle) - // - // Processes wiki-text -- this is a placeholder. - // Reference to here in SocialCalc.expand_markup should be replaced by application-specific routine. - // - - SocialCalc.default_expand_markup = function ( - displayvalue, - sheetobj, - linkstyle - ) { - var result = displayvalue; - - result = SocialCalc.special_chars(result); // do special chars - result = result.replace(/ /g, "  "); // keep multiple spaces - result = result.replace(/\n/g, "
    "); // keep line breaks - - return result; // do very little by default - - result = result.replace(/('*)'''(.*?)'''/g, "$1$2"); // Wiki-style bold/italics - result = result.replace(/''(.*?)''/g, "$1"); - - return result; - }; - - // - // result = SocialCalc.expand_text_link(displayvalue, sheetobj, linkstyle, valueformat) - // - // Parses link text (URL, descriptions, pagenames, workspace names) and returns HTML - // - - SocialCalc.expand_text_link = function ( - displayvalue, - sheetobj, - linkstyle, - valueformat - ) { - var desc, tb, str; - - var scc = SocialCalc.Constants; - - var url = ""; - var parts = SocialCalc.ParseCellLinkText(displayvalue + ""); - - if (parts.desc) { - desc = SocialCalc.special_chars(parts.desc); - } else { - desc = parts.pagename - ? scc.defaultPageLinkFormatString - : scc.defaultLinkFormatString; - } - - if ( - displayvalue.length > 7 && - displayvalue.substring(0, 7).toLowerCase() == "http://" && - displayvalue.charAt(displayvalue.length - 1) != ">" - ) { - desc = desc.substring(7); // remove http:// unless explicit - } - - tb = parts.newwin || !linkstyle ? ' target="_blank"' : ""; - - if (parts.pagename) { - if (SocialCalc.Callbacks.MakePageLink) { - url = SocialCalc.Callbacks.MakePageLink( - parts.pagename, - parts.workspacename, - linkstyle, - valueformat - ); - } - // else if (parts.workspace) { - // url = "/" + encodeURI(parts.workspace) + "/" + encodeURI(parts.pagename); - // } - // else { - // url = parts.pagename; - // } - } else { - url = encodeURI(parts.url); - } - str = '" + desc + ""; - - return str; - }; - - // - // result = SocialCalc.ParseCellLinkText(str) - // - // Given: url = http://www.someurl.com/more, desc = Some descriptive text - // - // Takes the following: - // - // url - // - // desc - // "desc" - // <<>> instead of <> => target="_blank" (new window) - // - // [page name] - // "desc"[page name] - // desc[page name] - // {workspace name [page name]} - // "desc"{workspace name [page name]} - // [[]] instead of [] => target="_blank" (new window) - // - // - // Returns: {url: url, desc: desc, newwin: t/f, pagename: pagename, workspace: workspace} - // - - SocialCalc.ParseCellLinkText = function (str) { - var result = { - url: "", - desc: "", - newwin: false, - pagename: "", - workspace: "", - }; - - var pageform = false; - var urlend = str.length - 1; - var descstart = 0; - var lastlt = str.lastIndexOf("<"); - var lastbrkt = str.lastIndexOf("["); - var lastbrace = str.lastIndexOf("{"); - var descend = -1; - - if ( - (str.charAt(urlend) != ">" || lastlt == -1) && - (str.charAt(urlend) != "]" || lastbrkt == -1) && - (str.charAt(urlend) != "}" || - str.charAt(urlend - 1) != "]" || - lastbrace == -1 || - lastbrkt == -1 || - lastbrkt < lastbrace) - ) { - // plain url - urlend++; - descend = urlend; - } else { - // some markup - if (str.charAt(urlend) == ">") { - // url form - descend = lastlt - 1; - if ( - lastlt > 0 && - str.charAt(descend) == "<" && - str.charAt(urlend - 1) == ">" - ) { - descend--; - urlend--; - result.newwin = true; - } - } else if (str.charAt(urlend) == "]") { - // plain page form - descend = lastbrkt - 1; - pageform = true; - if ( - lastbrkt > 0 && - str.charAt(descend) == "[" && - str.charAt(urlend - 1) == "]" - ) { - descend--; - urlend--; - result.newwin = true; - } - } else if (str.charAt(urlend) == "}") { - // page and workspace form - descend = lastbrace - 1; - pageform = true; - wsend = lastbrkt; - urlend--; - if ( - lastbrkt > 0 && - str.charAt(lastbrkt - 1) == "[" && - str.charAt(urlend - 1) == "]" - ) { - wsend = lastbrkt - 1; - urlend--; - result.newwin = true; - } - if (str.charAt(wsend - 1) == " ") { - // trim trailing space in workspace name - wsend--; - } - result.workspace = str.substring(lastbrace + 1, wsend) || ""; - } - - if (str.charAt(descend) == " ") { - // trim trailing space on desc - descend--; - } - - if (str.charAt(descstart) == '"' && str.charAt(descend) == '"') { - descstart++; - descend--; - } - } - - if (pageform) { - result.pagename = str.substring(lastbrkt + 1, urlend) || ""; - } else { - result.url = str.substring(lastlt + 1, urlend) || ""; - } - - if (descend >= descstart) { - result.desc = str.substring(descstart, descend + 1); - } - - return result; - }; - - // - // result = SocialCalc.ConvertSaveToOtherFormat(savestr, outputformat, dorecalc) - // - // Returns a string in the specificed format: "scsave", "html", "csv", "tab" (tab delimited) - // If dorecalc is true, performs a recalc after loading (NO: obsolete!). - // - - SocialCalc.ConvertSaveToOtherFormat = function ( - savestr, - outputformat, - dorecalc - ) { - var sheet, context, clipextents, div, ele, row, col, cr, cell, str; - - var result = ""; - - if (outputformat == "scsave") { - return savestr; - } - - if (savestr == "") { - return ""; - } - - sheet = new SocialCalc.Sheet(); - sheet.ParseSheetSave(savestr); - - if (dorecalc) { - // no longer supported as of 9/10/08 - // Recalc is now async, so can't do it this way - throw "SocialCalc.ConvertSaveToOtherFormat: Not doing recalc."; - } - - if (sheet.copiedfrom) { - clipextents = SocialCalc.ParseRange(sheet.copiedfrom); - } else { - clipextents = { - cr1: { row: 1, col: 1 }, - cr2: { row: sheet.attribs.lastrow, col: sheet.attribs.lastcol }, - }; - } - - if (outputformat == "html") { - context = new SocialCalc.RenderContext(sheet); - if (sheet.copiedfrom) { - context.rowpanes[0] = { - first: clipextents.cr1.row, - last: clipextents.cr2.row, - }; - context.colpanes[0] = { - first: clipextents.cr1.col, - last: clipextents.cr2.col, - }; - } - div = document.createElement("div"); - ele = context.RenderSheet(null, context.defaultHTMLlinkstyle); - div.appendChild(ele); - context = undefined; - sheet = undefined; - result = div.innerHTML; - ele = undefined; - div = undefined; - return result; - } - - for (row = clipextents.cr1.row; row <= clipextents.cr2.row; row++) { - for (col = clipextents.cr1.col; col <= clipextents.cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - - if (cell.errors) { - str = cell.errors; - } else { - str = cell.datavalue + ""; // get value as text - } - - if (outputformat == "csv") { - if (str.indexOf('"') != -1) { - str = str.replace(/"/g, '""'); // double quotes - } - if (/[, \n"]/.test(str)) { - str = '"' + str + '"'; // add quotes - } - if (col > clipextents.cr1.col) { - str = "," + str; // add commas - } - } else if (outputformat == "tab") { - if (str.indexOf("\n") != -1) { - // if multiple lines - if (str.indexOf('"') != -1) { - str = str.replace(/"/g, '""'); // double quotes - } - str = '"' + str + '"'; // add quotes - } - if (col > clipextents.cr1.col) { - str = "\t" + str; // add tabs - } - } - result += str; - } - result += "\n"; - } - - return result; - }; - - // - // result = SocialCalc.ConvertOtherFormatToSave(inputstr, inputformat) - // - // Returns a string converted from the specified format: "scsave", "csv", "tab" (tab delimited) - // - - SocialCalc.ConvertOtherFormatToSave = function (inputstr, inputformat) { - var sheet, - context, - lines, - i, - line, - value, - inquote, - j, - ch, - values, - row, - col, - cr, - maxc; - - var result = ""; - - var AddCell = function () { - col++; - if (col > maxc) maxc = col; - cr = SocialCalc.crToCoord(col, row); - SocialCalc.SetConvertedCell(sheet, cr, value); - value = ""; - }; - - if (inputformat == "scsave") { - return inputstr; - } - - sheet = new SocialCalc.Sheet(); - - lines = inputstr.split(/\r\n|\n/); - - maxc = 0; - if (inputformat == "csv") { - row = 0; - inquote = false; - for (i = 0; i < lines.length; i++) { - if (i == lines.length - 1 && lines[i] == "") { - // extra null line - ignore - break; - } - if (inquote) { - // if inquote, just continue from where left off - value += "\n"; - } else { - // otherwise next row - value = ""; - row++; - col = 0; - } - line = lines[i]; - for (j = 0; j < line.length; j++) { - ch = line.charAt(j); - if (ch == '"') { - if (inquote) { - if (j < line.length - 1 && line.charAt(j + 1) == '"') { - // double quotes - j++; // skip the second one - value += '"'; // add one quote - } else { - inquote = false; - if (j == line.length - 1) { - // at end of line - AddCell(); - } - } - } else { - inquote = true; - } - continue; - } - if (ch == "," && !inquote) { - AddCell(); - } else { - value += ch; - } - if (j == line.length - 1 && !inquote) { - AddCell(); - } - } - } - if (maxc > 0) { - sheet.attribs.lastrow = row; - sheet.attribs.lastcol = maxc; - result = sheet.CreateSheetSave("A1:" + SocialCalc.crToCoord(maxc, row)); - } - } - - if (inputformat == "tab") { - row = 0; - inquote = false; - for (i = 0; i < lines.length; i++) { - if (i == lines.length - 1 && lines[i] == "") { - // extra null line - ignore - break; - } - if (inquote) { - // if inquote, just continue from where left off - value += "\n"; - } else { - // otherwise next row - value = ""; - row++; - col = 0; - } - line = lines[i]; - for (j = 0; j < line.length; j++) { - ch = line.charAt(j); - if (ch == '"') { - if (inquote) { - if (j < line.length - 1) { - if (line.charAt(j + 1) == '"') { - // double quotes - j++; // skip the second one - value += '"'; // add one quote - } else if (line.charAt(j + 1) == "\t") { - // end of quoted item - j++; - inquote = false; - AddCell(); - } - } else { - // at end of line - inquote = false; - AddCell(); - } - continue; - } - if (value == "") { - // quote at start of item - inquote = true; - continue; - } - } - if (ch == "\t" && !inquote) { - AddCell(); - } else { - value += ch; - } - if (j == line.length - 1 && !inquote) { - AddCell(); - } - } - } - if (maxc > 0) { - sheet.attribs.lastrow = row; - sheet.attribs.lastcol = maxc; - result = sheet.CreateSheetSave("A1:" + SocialCalc.crToCoord(maxc, row)); - } - } - - return result; - }; - - // - // SocialCalc.SetConvertedCell(sheet, cr, rawvalue) - // - // Sets the cell cr with a value and type determined from rawvalue - // - - SocialCalc.SetConvertedCell = function (sheet, cr, rawvalue) { - var cell, value; - - cell = sheet.GetAssuredCell(cr); - - value = SocialCalc.DetermineValueType(rawvalue); - - if (value.type == "n" && value.value == rawvalue) { - // check that we don't need "constant" to remember original value - cell.datatype = "v"; - cell.valuetype = "n"; - cell.datavalue = value.value; - } else if (value.type.charAt(0) == "t") { - // text of some sort but left unchanged - cell.datatype = "t"; - cell.valuetype = value.type; - cell.datavalue = value.value; - } else { - // special number types - cell.datatype = "c"; - cell.valuetype = value.type; - cell.datavalue = value.value; - cell.formula = rawvalue; - } - }; - - // - // socialcalctouch adds touch gestures to SocialCalc - // - // As a start, touch gestures are modeled similar to - // mouse events - // - // Author: Ramu Ramamurthy - // - // - // - - // - // - // To initialize, SocialCalc.CreateTableEditor must call - // SocialCalc.TouchRegister(editor.toplevel, {Swipe: SocialCalc.EditorProcessSwipe, editor: editor}); - // Also, any element create inside the grid needs to be touch registered for it to work - // this includes buttons, etc - // - // TestCases: - // 1) tap to point to cell, and to move edit-cell - // 2) double-tap on a cell to open edit-box, then tap on edit box to pullup keyboard - // -- when editing, tap on any other cell to be done with edit - // *** figure out escape to cancel edit versus return to accept edit - // -- when editing, and if = seen than tapping on cell puts the cell name into the edit box - // 3) tap on input box on top opens edit on cell - // tap on any cell accepts and finishes this edit - // *** need a way to cancel the edit versus accept the edit - // - // 4) tap on a cell and move finger starts a range - // removing finger completes the range - // tap on cell cancels range - // - // 5) a swipe action scrolls the sheet - // swipe up/dn scrolls up/dn - // swipe lt/rt scrolls lt/rt - // - // - // Wishlist: - // 1) smooth scroll will be nice (in addition to swipe) -- using a two-touch pan ? - // - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - - // ************************************* - // - // Touch functions: - // - // ************************************* - - SocialCalc.HasTouch = false; - - (function () { - // platform specific registration - var agent = navigator.userAgent.toLowerCase(); - - if ( - agent.indexOf("iphone") >= 0 || - agent.indexOf("ipad") >= 0 || - agent.indexOf("android") >= 0 - ) { - SocialCalc.HasTouch = true; - } - })(); - - SocialCalc.TouchInfo = { - // In sequence the following will be implemented - // swipe up/dn, left/right will scroll up/dn/left/right respectively - // - // touch on a cell will move ecell to that cell - // repeated touch on a cell will start edit on that cell - // touch on another cell will cancel edit if it was in progress (?) - // etc - // - // touch on buttons will activate the buttons - // - // The registeredElements array is used to identify items. - - // One item for each element to respond to the touch, each an object with: - // .element, .functionobj - - registeredElements: [], - - // for swipe - threshold_x: 20, - threshold_y: 20, - - orig_coord_x: 0, - orig_coord_y: 0, - final_coord_x: 0, - final_coord_y: 0, - - px_to_rows: 20, // 20 pixels is 1 row scroll - px_to_cols: 20, // 20 pixels is 1 col scroll - - touch_start: 0, - ranging: false, - ranging_threshold: 100, - move_start: 0, - - last_touch: 0, - timeout_handle: null, - doubletap_threshold: 500, // max milliseconds between taps - }; - - // - // TouchRegister(element, functionobj) - make element respond to touch - // - - SocialCalc.TouchRegister = function (element, functionobj) { - if (!SocialCalc.HasTouch) { - return; - } - - var touchinfo = SocialCalc.TouchInfo; - - if (SocialCalc.LookupElement(element, touchinfo.registeredElements)) { - // already registered - return; - } - - touchinfo.registeredElements.push({ - element: element, - functionobj: functionobj, - }); - - if (SocialCalc.HasTouch && element.addEventListener) { - // Webkit based (?) - element.addEventListener( - "touchstart", - SocialCalc.ProcessTouchStart, - false - ); - element.addEventListener("touchmove", SocialCalc.ProcessTouchMove, false); - element.addEventListener("touchend", SocialCalc.ProcessTouchEnd, false); - element.addEventListener( - "touchcancel", - SocialCalc.ProcessTouchCancel, - false - ); - // element.addEventListener("orientationchange", SocialCalc.ProcessOrientationChange, false); - } - }; - - SocialCalc.FindTouchElement = function (event) { - var touchinfo = SocialCalc.TouchInfo; - - var event = event || window.event; - - var ele = event.target || event.srcElement; // investigate - - for (var wobj = null; !wobj && ele; ele = ele.parentNode) { - // investigate - wobj = SocialCalc.LookupElement(ele, touchinfo.registeredElements); - } - - return wobj; - }; - - SocialCalc.ProcessTouchStart = function (event) { - var touchinfo = SocialCalc.TouchInfo; - touchinfo.orig_coord_x = event.targetTouches[0].pageX; - touchinfo.orig_coord_y = event.targetTouches[0].pageY; - - touchinfo.final_coord_x = touchinfo.orig_coord_x; - touchinfo.final_coord_y = touchinfo.orig_coord_y; - - touchinfo.touch_start = new Date().getTime(); - - event.preventDefault(); - }; - - SocialCalc.TouchGetSimulatedMouseEvent = function (event, mouse_evt_name) { - var touches = event.changedTouches; - var first = touches[0]; - var simulatedEvent = document.createEvent("MouseEvent"); - simulatedEvent.initMouseEvent( - mouse_evt_name, - true, - true, - window, - 1, - first.screenX, - first.screenY, - first.clientX, - first.clientY, - false, - false, - false, - false, - 0, - null - ); - return simulatedEvent; - }; - - SocialCalc.ProcessTouchMove = function (event) { - var touchinfo = SocialCalc.TouchInfo; - touchinfo.final_coord_x = event.targetTouches[0].pageX; - touchinfo.final_coord_y = event.targetTouches[0].pageY; - - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) return; // not one of our elements - - if (touchinfo.move_start == 0) { - touchinfo.move_start = new Date().getTime(); - if ( - touchinfo.move_start - touchinfo.touch_start > - touchinfo.ranging_threshold - ) { - // This is a delayed move - // send a mouse down event - // This is for ranging and dragging - - touchinfo.ranging = true; - var mouseDn = SocialCalc.TouchGetSimulatedMouseEvent( - event, - "mousedown" - ); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDn); - } - } else if (touchinfo.ranging) { - // already ranging - // send a mouse move event - - var mouseMv = SocialCalc.TouchGetSimulatedMouseEvent(event, "mousemove"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseMv); - } - - event.preventDefault(); - }; - - SocialCalc.ProcessTouchEnd = function (e) { - var touchinfo = SocialCalc.TouchInfo; - - var changeX = touchinfo.orig_coord_x - touchinfo.final_coord_x; - var changeY = touchinfo.orig_coord_y - touchinfo.final_coord_y; - - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) return; // not one of our elements - - var event = e || window.event; - - touchinfo.move_start = 0; - touchinfo.touch_start = 0; - - if (touchinfo.ranging) { - // in ranging, and dragging - // send a mouseup event - touchinfo.ranging = false; - var mouseUp = SocialCalc.TouchGetSimulatedMouseEvent(event, "mouseup"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseUp); - } else if ( - Math.abs(changeY) > touchinfo.threshold_y || - Math.abs(changeX) > touchinfo.threshold_x - ) { - // check for swipe - - var amount_y = Math.floor(changeY / touchinfo.px_to_rows); - var amount_x = Math.floor(changeX / touchinfo.px_to_cols); - if (wobj.functionobj && wobj.functionobj.Swipe) { - wobj.functionobj.Swipe(event, touchinfo, wobj, amount_y, amount_x); - } - } else { - // detect a double tap - var now = new Date().getTime(); - var lasttouch = touchinfo.last_touch || now + 1; - var delta = now - lasttouch; - if (touchinfo.timeout_handle) { - clearTimeout(touchinfo.timeout_handle); - touchinfo.timeout_handle = null; - } - - if (delta < touchinfo.doubletap_threshold && delta > 0) { - // doubletap seen - if (wobj.functionobj && wobj.functionobj.DoubleTap) { - wobj.functionobj.DoubleTap(event, touchinfo, wobj); - } - } else { - // this is a single tap - touchinfo.last_touch = now; - var timeoutFn = function () { - if (wobj.functionobj && wobj.functionobj.SingleTap) { - wobj.functionobj.SingleTap(event, touchinfo, wobj); - } - }; - touchinfo.timeout_handle = setTimeout( - timeoutFn(), - touchinfo.doubletap_threshold - ); - } - touchinfo.last_touch = now; - } - e.preventDefault(); - }; - - SocialCalc.ProcessTouchCancel = function (event) { - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) { - return; // do default behavior - } - - var touchinfo = SocialCalc.TouchInfo; - touchinfo.orig_coord_x = 0; - touchinfo.orig_coord_y = 0; - touchinfo.final_coord_x = 0; - touchinfo.final_coord_y = 0; - touchinfo.move_start = 0; - touchinfo.touch_start = 0; - touchinfo.ranging = false; - }; - - SocialCalc.EditorProcessSwipe = function ( - event, - touchinfo, - wobj, - swipevert, - swipehoriz - ) { - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - - if (wobj.functionobj.editor.state != "start") { - return; // ignore if cell being edited - } - - if (swipevert != 0 || swipehoriz != 0) { - //wobj.functionobj.editor.ScrollRelativeBoth(swipevert,swipehoriz); - wobj.functionobj.editor.ScrollRelativeBoth(swipevert, 0); //ignore horiz swipes entirely - } - }; - - SocialCalc.EditorProcessSingleTap = function (event, touchinfo, wobj) { - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - - // send mouse down - var mouseDn = SocialCalc.TouchGetSimulatedMouseEvent(event, "mousedown"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDn); - - // then send mouse up - var mouseUp = SocialCalc.TouchGetSimulatedMouseEvent(event, "mouseup"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseUp); - }; - - SocialCalc.EditorProcessDoubleTap = function (event, touchinfo, wobj) { - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - // simulate a mouse double click - var mouseDblClick = SocialCalc.TouchGetSimulatedMouseEvent( - event, - "dblclick" - ); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDblClick); - }; - - SocialCalc.ProcessOrientationChange = function (event) { - console.log("orientation change"); - //var height = $(window).height(); - //var width = $(window).width(); - - //console.log("width="+width+",height="+height) - - // $(window).trigger( "orientationchange.htmlclass" ); - // spreadsheet.DoOnResize(); - }; - - // - // SocialCalcTableEditor - // - /* - // The code module of the SocialCalc package that displays a scrolling grid with panes - // and handles keyboard and mouse I/O. - // - // (c) Copyright 2008, 2009, 2010 Socialtext, Inc. - // All Rights Reserved. - // - */ - - /* - - LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - - EXHIBIT A. Common Public Attribution License Version 1.0. - - The contents of this file are subject to the Common Public Attribution License Version 1.0 (the - "License"); you may not use this file except in compliance with the License. You may obtain a copy - of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but - Sections 14 and 15 have been added to cover use of software over a computer network and provide for - limited attribution for the Original Developer. In addition, Exhibit A has been modified to be - consistent with Exhibit B. - - Software distributed under the License 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 Original Code is SocialCalc JavaScript TableEditor. - - The Original Developer is the Initial Developer. - - The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by - Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - - Contributor: Dan Bricklin. - - - EXHIBIT B. Attribution Information - - When the TableEditor is producing and/or controlling the display the Graphic Image must be - displayed on the screen visible to the user in a manner comparable to that in the - Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for - that image. The image must be linked to the Attribution URL so as to access that page - when clicked. If the user interface includes a prominent "about" display which includes - factual prominent attribution in a form similar to that in the "about" display included - with the Original Code, including Socialtext copyright notices and URLs, then the image - need not be linked to the Attribution URL but the "tool-tip" is still required. - - Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - - Attribution Phrase (not exceeding 10 words): SocialCalc - - Attribution URL: http://www.socialcalc.org/xoattrib - - Graphic Image: The contents of the sc-logo.gif file in the Original Code or - a suitable replacement from http://www.socialcalc.org/licenses specified as - being for SocialCalc. - - Display of Attribution Information is required in Larger Works which are defined - in the CPAL as a work which combines Covered Code or portions thereof with code - not governed by the terms of the CPAL. - - */ - - // - // Some of the other files in the SocialCalc package are licensed under - // different licenses. Please note the licenses of the modules you use. - // - // Code History: - // - // 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. - // All Rights Reserved. - // Portions (c) Copyright 2007 Socialtext, Inc. - // All Rights Reserved. - // The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. - // wikiCalc 1.0 was written by Software Garden, Inc. - // Unless otherwise specified, referring to "SocialCalc" in comments refers to this - // JavaScript version of the code, not the SocialCalc Perl code. - // - - /* - - See the comments in the main SocialCalc code module file of the SocialCalc package. - - */ - - var SocialCalc; - if (!SocialCalc) { - // created here, too, in case load order is wrong, but main routines are required - SocialCalc = {}; - } - - // ************************************* - // - // Table Editor class: - // - // ************************************* - - // Constructor: - - SocialCalc.TableEditor = function (context) { - var scc = SocialCalc.Constants; - - // Properties: - - this.context = context; // editing context - this.toplevel = null; // top level HTML element for this table editor - this.fullgrid = null; // rendered editing context - - this.noEdit = false; // if true, disable all edit UI and make read-only - - this.width = null; - this.tablewidth = null; - this.height = null; - this.tableheight = null; - - this.inputBox = null; - this.inputEcho = null; - this.verticaltablecontrol = null; - this.horizontaltablecontrol = null; - - this.logo = null; - - this.cellhandles = null; - - // Dynamic properties: - - this.timeout = null; // if non-null, timer id for position calculations - this.busy = false; // true when executing command, calculating, etc. - this.ensureecell = false; // if true, ensure ecell is visible after timeout - this.deferredCommands = []; // commands to execute after busy, in form: {cmdstr: "cmds", saveundo: t/f} - - this.gridposition = null; // screen coords of full grid - this.headposition = null; // screen coords of upper left of grid within header rows - this.firstscrollingrow = null; // row number of top row in last (the scrolling) pane - this.firstscrollingrowtop = null; // position of top row in last (the scrolling) pane - this.lastnonscrollingrow = null; // row number of last displayed row in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblerow = null; // used for paging down - this.firstscrollingcol = null; // column number of top col in last (the scrolling) pane - this.firstscrollingcolleft = null; // position of top col in last (the scrolling) pane - this.lastnonscrollingcol = null; // col number of last displayed column in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblecol = null; // used for paging right - - this.rowpositions = []; // screen positions of the top of some rows - this.colpositions = []; // screen positions of the left side of some rows - this.rowheight = []; // size in pixels of each row when last checked, or null/undefined, for page up - this.colwidth = []; // size in pixels of each column when last checked, or null/undefined, for page left - - this.ecell = null; // either null or {coord: c, row: r, col: c} - this.state = "start"; // the keyboard states: see EditorProcessKey - - this.workingvalues = {}; // values used during keyboard editing, etc. - - // Constants: - - this.imageprefix = scc.defaultImagePrefix; // URL prefix for images (e.g., "/www/assets/images/sc") - this.idPrefix = scc.defaultTableEditorIDPrefix; - this.pageUpDnAmount = scc.defaultPageUpDnAmount; // number of rows to move cursor on PgUp/PgDn keys (numeric) - - // Callbacks - - // recalcFunction: if present, function(editor) {...}, called to do a recalc - // Default (sheet.RecalcSheet) does all the right stuff. - - this.recalcFunction = function (editor) { - if (editor.context.sheetobj.RecalcSheet) { - editor.context.sheetobj.RecalcSheet( - SocialCalc.EditorSheetStatusCallback, - editor - ); - } else return null; - }; - - // ctrlkeyFunction: if present, function(editor, charname) {...}, called to handle ctrl-V, etc., at top level - // Returns true (pass through for continued processing) or false (stop processing this key). - - this.ctrlkeyFunction = function (editor, charname) { - var ta, ha, cell, position, cmd, sel, cliptext; - - switch (charname) { - case "[ctrl-c]": - case "[ctrl-x]": - ta = editor.pasteTextarea; - ta.value = ""; - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = position.left - 1 + "px"; - ta.style.top = position.top - 1 + "px"; - } - if (editor.range.hasrange) { - sel = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - sel = editor.ecell.coord; - } - - // get what to copy to clipboard - cliptext = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), - "tab" - ); - - if ( - charname == "[ctrl-c]" || - editor.noEdit || - (SocialCalc.Callbacks.IsCellEditable && - !SocialCalc.Callbacks.IsCellEditable(editor)) - ) { - // if copy or cut but in no edit - cmd = "copy " + sel + " formulas"; - } else { - // [ctrl-x] - cmd = "cut " + sel + " formulas"; - } - editor.EditorScheduleSheetCommands(cmd, true, false); // queue up command to put on SocialCalc clipboard - - /* Copy as HTML: This fails rather badly as it won't paste into Notepad as tab-delimited text. Oh well. - -ha = editor.pasteHTMLarea; -if (editor.range.hasrange) { -cell = SocialCalc.GetEditorCellElement(editor, editor.range.top, editor.range.left); -} -else { -cell = SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); -} -if (cell) position = SocialCalc.GetElementPosition(cell.element); - -if (ha) { -if (position) { -ha.style.left = (position.left-1)+"px"; -ha.style.top = (position.top-1)+"px"; -} -ha.style.visibility="visible"; -cliptext = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), "html"); -ha.innerHTML = cliptext.replace(/]*>[\d\D]*?<\/tr\b[^>]*>/i, ''); -ha.focus(); - -var range = document.body.createControlRange(); -range.addElement(ha.childNodes[0]); -range.select(); -} -*/ - ta.style.display = "block"; - ta.value = cliptext; // must follow "block" setting for Webkit - ta.focus(); - ta.select(); - window.setTimeout(function () { - if (!SocialCalc.GetSpreadsheetControlObject) return; // in case not loaded - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - /* -var ha = editor.pasteHTMLarea; -if (ha) { -ha.blur(); -ha.innerHTML = ''; -ha.style.visibility = 'hidden'; -} -*/ - var ta = editor.pasteTextarea; - ta.blur(); - ta.style.display = "none"; - SocialCalc.KeyboardFocus(); - }, 200); - - return true; - - case "[ctrl-v]": - if (editor.noEdit) return true; // not if no edit - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - var showPasteTextArea = function () { - ta = editor.pasteTextarea; - ta.value = ""; - - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = position.left - 1 + "px"; - ta.style.top = position.top - 1 + "px"; - } - ta.style.display = "block"; - ta.value = ""; // must follow "block" setting for Webkit - ta.focus(); - }; - - ha = editor.pasteHTMLarea; - if (ha) { - /* Pasting via HTML - Currently IE only */ - ha.style.visibility = "visible"; - ha.focus(); - } else { - showPasteTextArea(); - } - window.setTimeout(function () { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var value = null; - var isPasteSameAsClipboard = false; - - ha = editor.pasteHTMLarea; - if (ha) { - /* IE: We append a U+FFFC to every TD that's not the last of its row, - * then we obtain innerText, then turn U+FFFC back to \t, - * thereby preserving the cell separations (which gets discarded - * if we simply paste via textarea. - */ - var _ObjectReplacementCharacter_ = String.fromCharCode(0xfffc); - var html = ha.innerHTML; - - if (html.search(/<(?![Bb][Rr])[A-Za-z]/) >= 0) { - /* HTML Paste: Mark TDs with U+FFFC accordingly.. */ - ha.innerHTML = html.replace( - /(?:<\/[Tt][Dd]>)/g, - _ObjectReplacementCharacter_ - ); - } else { - /* Text Paste: In IE, \t is transformed into  , so replace them with U+FFFC. */ - ha.innerHTML = html.replace( - /&[Nn][Bb][Ss][Pp];/g, - _ObjectReplacementCharacter_ - ); - } - - value = ha.innerText.replace( - new RegExp(_ObjectReplacementCharacter_, "g"), - "\t" - ); - - ha.innerHTML = ""; - ha.blur(); - ha.style.visibility = "hidden"; - } else { - var ta = editor.pasteTextarea; - value = ta.value; - ta.blur(); - ta.style.display = "none"; - } - - value = value.replace(/\r\n/g, "\n").replace(/\n?$/, "\n"); - var clipstr = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.Clipboard.clipboard, - "tab" - ); - if ( - value == clipstr || - (value.length - clipstr.length == 1 && - value.substring(0, value.length - 1) == clipstr) - ) { - isPasteSameAsClipboard = true; - } - - var cmd = ""; - // pastes SocialCalc clipboard if did a Ctrl-C and contents still the same - // Webkit adds an extra blank line, so need to allow for that - if (!isPasteSameAsClipboard) { - cmd = - "loadclipboard " + - SocialCalc.encodeForSave( - SocialCalc.ConvertOtherFormatToSave(value, "tab") - ) + - "\n"; - } - var cr; - if (editor.range.hasrange) { - cr = SocialCalc.crToCoord(editor.range.left, editor.range.top); - } else { - cr = editor.ecell.coord; - } - cmd += "paste " + cr + " formulas"; - editor.EditorScheduleSheetCommands(cmd, true, false); - SocialCalc.KeyboardFocus(); - }, 200); - return true; - - case "[ctrl-z]": - editor.EditorScheduleSheetCommands("undo", true, false); - return false; - - case "[ctrl-s]": // !!!! temporary hack - window.setTimeout(function () { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var sheet = editor.context.sheetobj; - var cell = sheet.GetAssuredCell(editor.ecell.coord); - var ntvf = cell.nontextvalueformat - ? sheet.valueformats[cell.nontextvalueformat - 0] || "" - : ""; - var newntvf = window.prompt( - "Advanced Feature:\n\nCustom Numeric Format or Command", - ntvf - ); - if (newntvf != null) { - // not cancelled - if (newntvf.match(/^cmd:/)) { - cmd = newntvf.substring(4); // execute as command - } else if (newntvf.match(/^edit:/)) { - cmd = newntvf.substring(5); // execute as command - if (SocialCalc.CtrlSEditor) { - SocialCalc.CtrlSEditor(cmd); - } - return; - } else { - if (editor.range.hasrange) { - sel = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord( - editor.range.right, - editor.range.bottom - ); - } else { - sel = editor.ecell.coord; - } - cmd = "set " + sel + " nontextvalueformat " + newntvf; - } - editor.EditorScheduleSheetCommands(cmd, true, false); - } - }, 200); - return false; - - default: - break; - } - return true; - }; - - // Set sheet's status callback: - - context.sheetobj.statuscallback = SocialCalc.EditorSheetStatusCallback; - context.sheetobj.statuscallbackparams = this; // this object: the table editor object - - // StatusCallback: all values are called at appropriate times, add with unique name, delete when done - // - // Each value must be an object in the form of: - // - // func: function(editor, status, arg, params) {...}, - // params: params value to call func with - // - // The values for status and arg are: - // - // all the SocialCalc RecalcSheet statuscallbacks, including: - // - // calccheckdone, calclist length - // calcorder, {coord: coord, total: celllist length, count: count} - // calcstep, {coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds - // - // the command callbacks, like cmdstart and cmdend - // cmdendnorender - // - // calcstart, null - // moveecell, new ecell coord - // rangechange, "coord:coord" or "coord" or "" - // specialkey, keyname ("[esc]") - // - - this.StatusCallback = {}; - - this.MoveECellCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.RangeChangeCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.SettingsCallbacks = {}; // See SocialCalc.SaveEditorSettings - - // Set initial cursor - - this.ecell = { coord: "A1", row: 1, col: 1 }; - context.highlights[this.ecell.coord] = "cursor"; - - // Initialize range data - // Range has at least hasrange (true/false). - // It may also have: anchorcoord, anchorrow, anchorcol, top, bottom, left, and right. - - this.range = { hasrange: false }; - - // Initialize range2 data (used to show selections, such as for move) - // Range2 has at least hasrange (true/false). - // It may also have: top, bottom, left, and right. - - this.range2 = { hasrange: false }; - }; - - // Methods: - - SocialCalc.TableEditor.prototype.CreateTableEditor = function ( - width, - height - ) { - return SocialCalc.CreateTableEditor(this, width, height); - }; - SocialCalc.TableEditor.prototype.ResizeTableEditor = function ( - width, - height - ) { - return SocialCalc.ResizeTableEditor(this, width, height); - }; - - SocialCalc.TableEditor.prototype.SaveEditorSettings = function () { - return SocialCalc.SaveEditorSettings(this); - }; - SocialCalc.TableEditor.prototype.LoadEditorSettings = function (str, flags) { - return SocialCalc.LoadEditorSettings(this, str, flags); - }; - - SocialCalc.TableEditor.prototype.EditorRenderSheet = function () { - SocialCalc.EditorRenderSheet(this); - }; - SocialCalc.TableEditor.prototype.EditorScheduleSheetCommands = function ( - cmdstr, - saveundo, - ignorebusy - ) { - SocialCalc.EditorScheduleSheetCommands(this, cmdstr, saveundo, ignorebusy); - }; - SocialCalc.TableEditor.prototype.ScheduleSheetCommands = function ( - cmdstr, - saveundo - ) { - this.context.sheetobj.ScheduleSheetCommands(cmdstr, saveundo); - }; - SocialCalc.TableEditor.prototype.SheetUndo = function () { - this.context.sheetobj.SheetUndo(); - }; - SocialCalc.TableEditor.prototype.SheetRedo = function () { - this.context.sheetobj.SheetRedo(); - }; - SocialCalc.TableEditor.prototype.EditorStepSet = function (status, arg) { - SocialCalc.EditorStepSet(this, status, arg); - }; - SocialCalc.TableEditor.prototype.GetStatuslineString = function ( - status, - arg, - params - ) { - return SocialCalc.EditorGetStatuslineString(this, status, arg, params); - }; - - SocialCalc.TableEditor.prototype.EditorMouseRegister = function () { - return SocialCalc.EditorMouseRegister(this); - }; - SocialCalc.TableEditor.prototype.EditorMouseUnregister = function () { - return SocialCalc.EditorMouseUnregister(this); - }; - SocialCalc.TableEditor.prototype.EditorMouseRange = function (coord) { - return SocialCalc.EditorMouseRange(this, coord); - }; - - SocialCalc.TableEditor.prototype.EditorProcessKey = function (ch, e) { - return SocialCalc.EditorProcessKey(this, ch, e); - }; - SocialCalc.TableEditor.prototype.EditorAddToInput = function (str, prefix) { - return SocialCalc.EditorAddToInput(this, str, prefix); - }; - SocialCalc.TableEditor.prototype.DisplayCellContents = function () { - return SocialCalc.EditorDisplayCellContents(this); - }; - SocialCalc.TableEditor.prototype.EditorSaveEdit = function (text) { - return SocialCalc.EditorSaveEdit(this, text); - }; - SocialCalc.TableEditor.prototype.EditorApplySetCommandsToRange = function ( - cmdline, - type - ) { - return SocialCalc.EditorApplySetCommandsToRange(this, cmdline, type); - }; - - SocialCalc.TableEditor.prototype.MoveECellWithKey = function (ch) { - return SocialCalc.MoveECellWithKey(this, ch); - }; - SocialCalc.TableEditor.prototype.MoveECell = function (newcell) { - return SocialCalc.MoveECell(this, newcell); - }; - SocialCalc.TableEditor.prototype.ReplaceCell = function (cell, row, col) { - SocialCalc.ReplaceCell(this, cell, row, col); - }; - SocialCalc.TableEditor.prototype.UpdateCellCSS = function (cell, row, col) { - SocialCalc.UpdateCellCSS(this, cell, row, col); - }; - SocialCalc.TableEditor.prototype.SetECellHeaders = function (selected) { - SocialCalc.SetECellHeaders(this, selected); - }; - SocialCalc.TableEditor.prototype.EnsureECellVisible = function () { - SocialCalc.EnsureECellVisible(this); - }; - SocialCalc.TableEditor.prototype.RangeAnchor = function (coord) { - SocialCalc.RangeAnchor(this, coord); - }; - SocialCalc.TableEditor.prototype.RangeExtend = function (coord) { - SocialCalc.RangeExtend(this, coord); - }; - SocialCalc.TableEditor.prototype.RangeRemove = function () { - SocialCalc.RangeRemove(this); - }; - SocialCalc.TableEditor.prototype.Range2Remove = function () { - SocialCalc.Range2Remove(this); - }; - - SocialCalc.TableEditor.prototype.FitToEditTable = function () { - SocialCalc.FitToEditTable(this); - }; - SocialCalc.TableEditor.prototype.CalculateEditorPositions = function () { - SocialCalc.CalculateEditorPositions(this); - }; - SocialCalc.TableEditor.prototype.ScheduleRender = function () { - SocialCalc.ScheduleRender(this); - }; - SocialCalc.TableEditor.prototype.DoRenderStep = function () { - SocialCalc.DoRenderStep(this); - }; - SocialCalc.TableEditor.prototype.SchedulePositionCalculations = function () { - SocialCalc.SchedulePositionCalculations(this); - }; - SocialCalc.TableEditor.prototype.DoPositionCalculations = function () { - SocialCalc.DoPositionCalculations(this); - }; - SocialCalc.TableEditor.prototype.CalculateRowPositions = function ( - panenum, - positions, - sizes - ) { - return SocialCalc.CalculateRowPositions(this, panenum, positions, sizes); - }; - SocialCalc.TableEditor.prototype.CalculateColPositions = function ( - panenum, - positions, - sizes - ) { - return SocialCalc.CalculateColPositions(this, panenum, positions, sizes); - }; - - SocialCalc.TableEditor.prototype.ScrollRelative = function ( - vertical, - amount - ) { - SocialCalc.ScrollRelative(this, vertical, amount); - }; - SocialCalc.TableEditor.prototype.ScrollRelativeBoth = function ( - vamount, - hamount - ) { - SocialCalc.ScrollRelativeBoth(this, vamount, hamount); - }; - SocialCalc.TableEditor.prototype.PageRelative = function ( - vertical, - direction - ) { - SocialCalc.PageRelative(this, vertical, direction); - }; - SocialCalc.TableEditor.prototype.LimitLastPanes = function () { - SocialCalc.LimitLastPanes(this); - }; - - SocialCalc.TableEditor.prototype.ScrollTableUpOneRow = function () { - return SocialCalc.ScrollTableUpOneRow(this); - }; - SocialCalc.TableEditor.prototype.ScrollTableDownOneRow = function () { - return SocialCalc.ScrollTableDownOneRow(this); - }; - SocialCalc.TableEditor.prototype.ScrollTableLeftOneCol = function () { - return SocialCalc.ScrollTableLeftOneCol(this); - }; - SocialCalc.TableEditor.prototype.ScrollTableRightOneCol = function () { - return SocialCalc.ScrollTableRightOneCol(this); - }; - - //contact prototype - SocialCalc.TableEditor.prototype.EditorChangecontact = function ( - text, - name, - phone, - email, - street, - city, - company, - val - ) { - return SocialCalc.EditorChangecontact( - this, - text, - name, - phone, - email, - street, - city, - company, - val - ); - }; - SocialCalc.TableEditor.prototype.EditorChangecolorFromWidget = function ( - text - ) { - return SocialCalc.EditorChangecolorFromWidget(this, text); - }; - SocialCalc.TableEditor.prototype.EditorChangeSheetcolor = function (text) { - return SocialCalc.EditorChangeSheetcolor(this, text); - }; - - SocialCalc.TableEditor.prototype.EditorChangefontFromWidget = function ( - text - ) { - return SocialCalc.EditorChangefontFromWidget(this, text); - }; - SocialCalc.TableEditor.prototype.EditorChangeSheetfont = function (text) { - return SocialCalc.EditorChangeSheetfont(this, text); - }; - SocialCalc.TableEditor.prototype.EditorCut = function (text, no_of_cells) { - return SocialCalc.EditorCut(this, text, no_of_cells); - }; - SocialCalc.TableEditor.prototype.EditorClearSheet = function ( - text, - cell_to_clear - ) { - return SocialCalc.EditorClearSheet(this, text, cell_to_clear); - }; - - // Functions: - - SocialCalc.CreateTableEditor = function (editor, width, height) { - var scc = SocialCalc.Constants; - var AssignID = SocialCalc.AssignID; - - editor.toplevel = document.createElement("div"); - editor.width = width; - editor.height = height; - - editor.griddiv = document.createElement("div"); - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width = editor.tablewidth + "px"; - editor.griddiv.style.height = editor.tableheight + "px"; - editor.griddiv.style.overflow = "hidden"; - editor.griddiv.style.cursor = "default"; - if (scc.cteGriddivClass) editor.griddiv.className = scc.cteGriddivClass; - AssignID(editor, editor.griddiv, "griddiv"); - - editor.FitToEditTable(); - - editor.EditorRenderSheet(); - - editor.griddiv.appendChild(editor.fullgrid); - - editor.verticaltablecontrol = new SocialCalc.TableControl( - editor, - true, - editor.tableheight - ); - editor.verticaltablecontrol.CreateTableControl(); - AssignID(editor, editor.verticaltablecontrol.main, "tablecontrolv"); - - editor.horizontaltablecontrol = new SocialCalc.TableControl( - editor, - false, - editor.tablewidth - ); - editor.horizontaltablecontrol.CreateTableControl(); - AssignID(editor, editor.horizontaltablecontrol.main, "tablecontrolh"); - - var table, tbody, tr, td, img, anchor, ta, ha; - - table = document.createElement("table"); - editor.layouttable = table; - table.cellSpacing = 0; - table.cellPadding = 0; - AssignID(editor, table, "layouttable"); - - tbody = document.createElement("tbody"); - table.appendChild(tbody); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - td.appendChild(editor.griddiv); - tr.appendChild(td); - td = document.createElement("td"); - //td.appendChild(editor.verticaltablecontrol.main); - tr.appendChild(td); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - //td.appendChild(editor.horizontaltablecontrol.main); - tr.appendChild(td); - - td = document.createElement("td"); // logo display: Required by CPAL License for this code! - //td.style.background="url("+editor.imageprefix+"logo.gif) no-repeat center center"; - td.innerHTML = - "
    "; - tr.appendChild(td); - editor.logo = td; - AssignID(editor, editor.logo, "logo"); - SocialCalc.TooltipRegister(td.firstChild.firstChild, "SocialCalc", null); - - editor.toplevel.appendChild(editor.layouttable); - - if (!editor.noEdit) { - editor.inputEcho = new SocialCalc.InputEcho(editor); - AssignID(editor, editor.inputEcho.main, "inputecho"); - } - - editor.cellhandles = new SocialCalc.CellHandles(editor); - - ta = document.createElement("textarea"); // used for ctrl-c/ctrl-v where an invisible text area is needed - SocialCalc.setStyles( - ta, - "display:none;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);" - ); - ta.value = ""; - editor.pasteTextarea = ta; - AssignID(editor, editor.pasteTextarea, "pastetextarea"); - - if ( - navigator.userAgent.match(/Safari\//) && - !navigator.userAgent.match(/Chrome\//) - ) { - // special code for Safari 5 change - window.removeEventListener( - "beforepaste", - SocialCalc.SafariPasteFunction, - false - ); - window.addEventListener( - "beforepaste", - SocialCalc.SafariPasteFunction, - false - ); - window.removeEventListener( - "beforecopy", - SocialCalc.SafariPasteFunction, - false - ); - window.addEventListener( - "beforecopy", - SocialCalc.SafariPasteFunction, - false - ); - window.removeEventListener( - "beforecut", - SocialCalc.SafariPasteFunction, - false - ); - window.addEventListener( - "beforecut", - SocialCalc.SafariPasteFunction, - false - ); - } - - editor.toplevel.appendChild(editor.pasteTextarea); - - var div = document.createElement("div"); - div.innerHTML = "
    "; - if (div.firstChild.nodeType == 1) { - /* We are running in IE -- Using HTML-based area for Ctrl-V */ - ha = document.createElement("div"); // used for ctrl-v where an invisible html area is needed - editor.pasteHTMLarea = ha; - editor.toplevel.appendChild(editor.pasteHTMLarea); - ha.contentEditable = true; - AssignID(editor, editor.pasteHTMLarea, "pastehtmlarea"); - SocialCalc.setStyles( - ha, - "display:block;visibility:hidden;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);overflow:hidden" - ); - } - - SocialCalc.MouseWheelRegister(editor.toplevel, { - WheelMove: SocialCalc.EditorProcessMouseWheel, - editor: editor, - }); - - if (SocialCalc.HasTouch) { - SocialCalc.TouchRegister(editor.toplevel, { - Swipe: SocialCalc.EditorProcessSwipe, - DoubleTap: SocialCalc.EditorProcessDoubleTap, - SingleTap: SocialCalc.EditorProcessSingleTap, - editor: editor, - }); - } - - if (editor.inputBox) { - // this seems to fix an obscure bug with Firefox 2 Mac where Ctrl-V doesn't get fired right - if (editor.inputBox.element) { - editor.inputBox.element.focus(); - editor.inputBox.element.blur(); - } - } - SocialCalc.KeyboardSetFocus(editor); - - // do status reporting things - - SocialCalc.EditorSheetStatusCallback(null, "startup", null, editor); - - // done - - return editor.toplevel; - }; - - // Special code needed for change that occurred with Safari 5 that made paste not work for some reason - - SocialCalc.SafariPasteFunction = function (e) { - e.preventDefault(); - }; - - // - // SocialCalc.ResizeTableEditor(editor, width, height) - // - // Move things around as appropriate and resize - // - - SocialCalc.ResizeTableEditor = function (editor, width, height) { - var scc = SocialCalc.Constants; - - editor.width = width; - editor.height = height; - - editor.toplevel.style.width = width + "px"; - editor.toplevel.style.height = height + "px"; - - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width = editor.tablewidth + "px"; - editor.griddiv.style.height = editor.tableheight + "px"; - - editor.verticaltablecontrol.main.style.height = editor.tableheight + "px"; - editor.horizontaltablecontrol.main.style.width = editor.tablewidth + "px"; - - editor.FitToEditTable(); - - editor.ScheduleRender(); - - return; - }; - - // - // str = SaveEditorSettings(editor) - // - // Returns a string representation of the pane settings, etc. - // - // The format is: - // - // version:1.0 - // rowpane:panenumber:firstnum:lastnum - // colpane:panenumber:firstnum:lastnum - // ecell:coord -- if set - // range:anchorcoord:top:bottom:left:right -- if set - // - // You can add additional values to be saved by using editor.SettingsCallbacks: - // - // editor.SettingsCallbacks["item-name"] = {save: savefunction, load: loadfunction} - // - // where savefunction(editor, "item-name") returns a string with the new lines to be added to the saved settings - // which include the trailing newlines, and loadfunction(editor, "item-name", line, flags) is given the line to process - // without the trailing newlines. - // - - SocialCalc.SaveEditorSettings = function (editor) { - var i, setting; - var context = editor.context; - var range = editor.range; - var result = ""; - - result += "version:1.0\n"; - - for (i = 0; i < context.rowpanes.length; i++) { - result += - "rowpane:" + - i + - ":" + - context.rowpanes[i].first + - ":" + - context.rowpanes[i].last + - "\n"; - } - for (i = 0; i < context.colpanes.length; i++) { - result += - "colpane:" + - i + - ":" + - context.colpanes[i].first + - ":" + - context.colpanes[i].last + - "\n"; - } - - if (editor.ecell) { - result += "ecell:" + editor.ecell.coord + "\n"; - } - - if (range.hasrange) { - result += - "range:" + - range.anchorcoord + - ":" + - range.top + - ":" + - range.bottom + - ":" + - range.left + - ":" + - range.right + - "\n"; - } - - for (setting in editor.SettingsCallbacks) { - result += editor.SettingsCallbacks[setting].save(editor, setting); - } - - return result; - }; - - // - // LoadEditorSettings(editor, str, flags) - // - // Sets the editor settings based on str. See SocialCalc.SaveEditorSettings for more details. - // Unrecognized lines are ignored. - // - - SocialCalc.LoadEditorSettings = function (editor, str, flags) { - var lines = str.split(/\r\n|\n/); - var parts = []; - var line, i, cr, row, col, coord, setting; - var context = editor.context; - var highlights, range; - - context.rowpanes = [{ first: 1, last: 1 }]; // reset to start - context.colpanes = [{ first: 1, last: 1 }]; - editor.ecell = null; - editor.range = { hasrange: false }; - editor.range2 = { hasrange: false }; - range = editor.range; - context.highlights = {}; - highlights = context.highlights; - - for (i = 0; i < lines.length; i++) { - line = lines[i]; - parts = line.split(":"); - setting = parts[0]; - switch (setting) { - case "version": - break; - - case "rowpane": - context.rowpanes[parts[1] - 0] = { - first: parts[2] - 0, - last: parts[3] - 0, - }; - break; - - case "colpane": - context.colpanes[parts[1] - 0] = { - first: parts[2] - 0, - last: parts[3] - 0, - }; - break; - - case "ecell": - editor.ecell = SocialCalc.coordToCr(parts[1]); - editor.ecell.coord = parts[1]; - highlights[parts[1]] = "cursor"; - break; - - case "range": - range.hasrange = true; - range.anchorcoord = parts[1]; - cr = SocialCalc.coordToCr(range.anchorcoord); - range.anchorrow = cr.row; - range.anchorcol = cr.col; - range.top = parts[2] - 0; - range.bottom = parts[3] - 0; - range.left = parts[4] - 0; - range.right = parts[5] - 0; - for (row = range.top; row <= range.bottom; row++) { - for (col = range.left; col <= range.right; col++) { - coord = SocialCalc.crToCoord(col, row); - if (highlights[coord] != "cursor") { - highlights[coord] = "range"; - } - } - } - break; - - default: - if (editor.SettingsCallbacks[setting]) { - editor.SettingsCallbacks[setting].load( - editor, - setting, - line, - flags - ); - } - break; - } - } - - return; - }; - - // - // EditorRenderSheet(editor) - // - // Renders the sheet and updates editor.fullgrid. - // Sets event handlers. - // - - SocialCalc.EditorRenderSheet = function (editor) { - editor.EditorMouseUnregister(); - - editor.fullgrid = editor.context.RenderSheet(editor.fullgrid); - - if (editor.ecell) editor.SetECellHeaders("selected"); - - SocialCalc.AssignID(editor, editor.fullgrid, "fullgrid"); // give it an id - - editor.EditorMouseRegister(); - }; - - // - // EditorScheduleSheetCommands(editor, cmdstr, saveundo, ignorebusy) - // - - SocialCalc.EditorScheduleSheetCommands = function ( - editor, - cmdstr, - saveundo, - ignorebusy - ) { - if (editor.state != "start" && !ignorebusy) { - // ignore commands if editing a cell - return; - } - - if (editor.busy && !ignorebusy) { - // hold off on commands if doing one - editor.deferredCommands.push({ cmdstr: cmdstr, saveundo: saveundo }); - return; - } - - switch (cmdstr) { - case "recalc": - case "redisplay": - editor.context.sheetobj.ScheduleSheetCommands(cmdstr, false); - break; - - case "undo": - editor.SheetUndo(); - break; - - case "redo": - editor.SheetRedo(); - break; - - default: - editor.context.sheetobj.ScheduleSheetCommands(cmdstr, saveundo); - break; - } - }; - - // - // EditorSheetStatusCallback(recalcdata, status, arg, editor) - // - // Called during recalc, executing commands, etc. - // - - SocialCalc.EditorSheetStatusCallback = function ( - recalcdata, - status, - arg, - editor - ) { - var f, cell, dcmd; - var sheetobj = editor.context.sheetobj; - var cr; - - var signalstatus = function (s) { - for (f in editor.StatusCallback) { - if (editor.StatusCallback[f].func) { - editor.StatusCallback[f].func( - editor, - s, - arg, - editor.StatusCallback[f].params - ); - } - } - }; - - switch (status) { - case "startup": - break; - - case "cmdstart": - editor.busy = true; - sheetobj.celldisplayneeded = ""; - break; - - case "cmdextension": - break; - - case "cmdend": - signalstatus(status); - - if (sheetobj.changedrendervalues) { - editor.context.PrecomputeSheetFontsAndLayouts(); - editor.context.CalculateCellSkipData(); - sheetobj.changedrendervalues = false; - } - - if (sheetobj.celldisplayneeded && !sheetobj.renderneeded) { - cr = SocialCalc.coordToCr(sheetobj.celldisplayneeded); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.ReplaceCell(cell, cr.row, cr.col); - } - - if (editor.deferredCommands.length) { - dcmd = editor.deferredCommands.shift(); - editor.EditorScheduleSheetCommands(dcmd.cmdstr, dcmd.saveundo, true); - return; - } - - if ( - sheetobj.attribs.needsrecalc && - (sheetobj.attribs.recalc != "off" || sheetobj.recalconce) && - editor.recalcFunction - ) { - editor.FitToEditTable(); - sheetobj.renderneeded = false; // recalc will force a render - if (sheetobj.recalconce) delete sheetobj.recalconce; // only do once - editor.recalcFunction(editor); - } else { - if (sheetobj.renderneeded) { - editor.FitToEditTable(); - sheetobj.renderneeded = false; - editor.ScheduleRender(); - } else { - editor.SchedulePositionCalculations(); // just in case command changed positions - // editor.busy = false; - // signalstatus("cmdendnorender"); - } - } - return; - - case "calcstart": - editor.busy = true; - break; - - case "calccheckdone": - case "calcorder": - case "calcstep": - case "calcloading": - case "calcserverfunc": - break; - - case "calcfinished": - signalstatus(status); - editor.ScheduleRender(); - return; - - case "schedrender": - editor.busy = true; // in case got here without cmd or recalc - break; - - case "renderdone": - break; - - case "schedposcalc": - editor.busy = true; // in case got here without cmd or recalc - break; - - case "doneposcalc": - if (editor.deferredCommands.length) { - signalstatus(status); - dcmd = editor.deferredCommands.shift(); - editor.EditorScheduleSheetCommands(dcmd.cmdstr, dcmd.saveundo, true); - } else { - editor.busy = false; - signalstatus(status); - if (editor.state == "start") editor.DisplayCellContents(); // make sure up to date - } - return; - - default: - addmsg("Unknown status: " + status); - break; - } - - signalstatus(status); - - return; - }; - - // Timer-driven steps for use with SocialCalc.EditorSheetStatusCallback - - SocialCalc.EditorStepInfo = { - // status: "", // saved value to pass to callback - editor: null, // for callback - // arg: null, // for callback - // timerobj: null - }; - - /* - SocialCalc.EditorStepSet = function(editor, status, arg) { - var esi = SocialCalc.EditorStepInfo; - addmsg("step: "+status); - if (esi.timerobj) { - alert("Already waiting. Old/new: "+esi.status+"/"+status); - } - esi.editor = editor; - esi.status = status; - esi.timerobj = window.setTimeout(SocialCalc.EditorStepDone, 1); - } - - SocialCalc.EditorStepDone = function() { - var esi = SocialCalc.EditorStepInfo; - esi.timerobj = null; - SocialCalc.EditorSheetStatusCallback(null, esi.status, null, esi.editor); - } - */ - - // - // str = SocialCalc.EditorGetStatuslineString(editor, status, arg, params) - // - // Assumes params is an object where it can use "calculating" and "command" - // to keep track of state. - // Returns string for status line. - // - - SocialCalc.EditorGetStatuslineString = function ( - editor, - status, - arg, - params - ) { - var scc = SocialCalc.Constants; - - var sstr, progress, coord, circ, r, c, cell, sum, ele; - - progress = ""; - - switch (status) { - case "moveecell": - case "rangechange": - case "startup": - break; - case "cmdstart": - params.command = true; - document.body.style.cursor = "progress"; - editor.griddiv.style.cursor = "progress"; - progress = scc.s_statusline_executing; - break; - case "cmdextension": - progress = "Command Extension: " + arg; - break; - case "cmdend": - params.command = false; - break; - case "schedrender": - progress = scc.s_statusline_displaying; - break; - case "renderdone": - progress = " "; - break; - case "schedposcalc": - progress = scc.s_statusline_displaying; - break; - case "cmdendnorender": - case "doneposcalc": - document.body.style.cursor = "default"; - editor.griddiv.style.cursor = "default"; - break; - case "calcorder": - progress = - scc.s_statusline_ordering + - Math.floor((100 * arg.count) / (arg.total || 1)) + - "%"; - break; - case "calcstep": - progress = - scc.s_statusline_calculating + - Math.floor((100 * arg.count) / (arg.total || 1)) + - "%"; - break; - case "calcloading": - progress = scc.s_statusline_calculatingls + ": " + arg.sheetname; - break; - case "calcserverfunc": - progress = - scc.s_statusline_calculating + - Math.floor((100 * arg.count) / (arg.total || 1)) + - "%, " + - scc.s_statusline_doingserverfunc + - arg.funcname + - scc.s_statusline_incell + - arg.coord; - break; - case "calcstart": - params.calculating = true; - document.body.style.cursor = "progress"; - editor.griddiv.style.cursor = "progress"; // griddiv has an explicit cursor style - progress = scc.s_statusline_calcstart; - break; - case "calccheckdone": - break; - case "calcfinished": - params.calculating = false; - break; - default: - progress = status; - break; - } - - if (!progress && params.calculating) { - progress = scc.s_statusline_calculating; - } - - // if there is a range, calculate sum (not during busy times) - if ( - !params.calculating && - !params.command && - !progress && - editor.range.hasrange && - (editor.range.left != editor.range.right || - editor.range.top != editor.range.bottom) - ) { - sum = 0; - for (r = editor.range.top; r <= editor.range.bottom; r++) { - for (c = editor.range.left; c <= editor.range.right; c++) { - cell = editor.context.sheetobj.cells[SocialCalc.crToCoord(c, r)]; - if (!cell) continue; - if (cell.valuetype && cell.valuetype.charAt(0) == "n") { - sum += cell.datavalue - 0; - } - } - } - - sum = SocialCalc.FormatNumber.formatNumberWithFormat( - sum, - "[,]General", - "" - ); - - coord = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - progress = - coord + - " (" + - (editor.range.right - editor.range.left + 1) + - "x" + - (editor.range.bottom - editor.range.top + 1) + - ") " + - scc.s_statusline_sum + - "=" + - sum + - " " + - progress; - } - sstr = editor.ecell.coord + "   " + progress; - - if ( - !params.calculating && - editor.context.sheetobj.attribs.needsrecalc == "yes" - ) { - sstr += "   " + scc.s_statusline_recalcneeded; - } - - circ = editor.context.sheetobj.attribs.circularreferencecell; - if (circ) { - circ = circ.replace(/\|/, " referenced by "); - sstr += "   " + scc.s_statusline_circref + circ + "
    "; - } - - return sstr; - }; - - // - // Mouse stuff - // - - SocialCalc.EditorMouseInfo = { - // The registeredElements array is used to identify editor grid in which the mouse is doing things. - - // One item for each active editor, each an object with: - // .element, .editor - - registeredElements: [], - - editor: null, // editor being processed (between mousedown and mouseup) - element: null, // element being processed - - ignore: false, // if true, mousedowns are ignored - - mousedowncoord: "", // coord where mouse went down for drag range - mouselastcoord: "", // coord where mouse last was during drag - mouseresizecol: "", // col being resized - mouseresizeclientx: null, // where resize started - mouseresizedisplay: null, // element tracking new size - }; - - // - // EditorMouseRegister(editor) - // - - SocialCalc.EditorMouseRegister = function (editor) { - var mouseinfo = SocialCalc.EditorMouseInfo; - var element = editor.fullgrid; - var i; - - for (i = 0; i < mouseinfo.registeredElements.length; i++) { - if (mouseinfo.registeredElements[i].editor == editor) { - if (mouseinfo.registeredElements[i].element == element) { - return; // already set - don't do it again - } - break; - } - } - - if (i < mouseinfo.registeredElements.length) { - mouseinfo.registeredElements[i].element = element; - } else { - mouseinfo.registeredElements.push({ element: element, editor: editor }); - } - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener( - "mousedown", - SocialCalc.ProcessEditorMouseDown, - false - ); - element.addEventListener( - "dblclick", - SocialCalc.ProcessEditorDblClick, - false - ); - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousedown", SocialCalc.ProcessEditorMouseDown); - element.attachEvent("ondblclick", SocialCalc.ProcessEditorDblClick); - } else { - // don't handle this - throw "Browser not supported"; - } - - mouseinfo.ignore = false; // just in case - - return; - }; - - // - // EditorMouseUnregister(editor) - // - - SocialCalc.EditorMouseUnregister = function (editor) { - var mouseinfo = SocialCalc.EditorMouseInfo; - var element = editor.fullgrid; - var i, oldelement; - - for (i = 0; i < mouseinfo.registeredElements.length; i++) { - if (mouseinfo.registeredElements[i].editor == editor) { - break; - } - } - - if (i < mouseinfo.registeredElements.length) { - oldelement = mouseinfo.registeredElements[i].element; // remove old handlers - if (oldelement.removeEventListener) { - // DOM Level 2 - oldelement.removeEventListener( - "mousedown", - SocialCalc.ProcessEditorMouseDown, - false - ); - oldelement.removeEventListener( - "dblclick", - SocialCalc.ProcessEditorDblClick, - false - ); - } else if (oldelement.detachEvent) { - // IE - oldelement.detachEvent( - "onmousedown", - SocialCalc.ProcessEditorMouseDown - ); - oldelement.detachEvent("ondblclick", SocialCalc.ProcessEditorDblClick); - } - mouseinfo.registeredElements.splice(i, 1); - } - - return; - }; - - SocialCalc.ProcessEditorMouseDown = function (e) { - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var mobj; - - if (mouseinfo.ignore) return; // ignore this - - for (mobj = null; !mobj && ele; ele = ele.parentNode) { - // go up tree looking for one of our elements - mobj = SocialCalc.LookupElement(ele, mouseinfo.registeredElements); - } - if (!mobj) { - mouseinfo.editor = null; - return; // not one of our elements - } - - editor = mobj.editor; - mouseinfo.element = ele; - range = editor.range; - result = SocialCalc.GridMousePosition(editor, clientX, clientY); - - if (!result || result.rowheader) return; // not on a cell or col header - mouseinfo.editor = editor; // remember for later - - if (result.colheader && result.coltoresize) { - // col header - do drag resize - SocialCalc.ProcessEditorColsizeMouseDown(e, ele, result); - return; - } - - if (!result.coord) return; // not us - - if (!range.hasrange) { - if (e.shiftKey) editor.RangeAnchor(); - } - - SocialCalc.Callbacks.ToggleCell(result.coord); - coord = editor.MoveECell(result.coord); - - if (range.hasrange) { - if (e.shiftKey) editor.RangeExtend(); - else editor.RangeRemove(); - } - - mouseinfo.mousedowncoord = coord; // remember if starting drag range select - mouseinfo.mouselastcoord = coord; - - editor.EditorMouseRange(coord); - - SocialCalc.KeyboardSetFocus(editor); - if (editor.state != "start" && editor.inputBox) - editor.inputBox.element.focus(); - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.ProcessEditorMouseMove, - true - ); // capture everywhere - document.addEventListener( - "mouseup", - SocialCalc.ProcessEditorMouseUp, - true - ); // capture everywhere - } else if (ele.attachEvent) { - // IE 5+ - ele.setCapture(); - ele.attachEvent("onmousemove", SocialCalc.ProcessEditorMouseMove); - ele.attachEvent("onmouseup", SocialCalc.ProcessEditorMouseUp); - ele.attachEvent("onlosecapture", SocialCalc.ProcessEditorMouseUp); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.EditorMouseRange = function (editor, coord) { - var inputtext, wval; - var range = editor.range; - - switch ( - editor.state // editing a cell - shouldn't get here if no inputBox - ) { - case "input": - inputtext = editor.inputBox.GetText(); - wval = editor.workingvalues; - if ( - ("(+-*/,:!&<>=^".indexOf(inputtext.slice(-1)) >= 0 && - inputtext.slice(0, 1) == "=") || - inputtext == "=" - ) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { - // if in pointing operation - if (coord) { - if (range.hasrange) { - var sheetpref = - wval.currentsheet == wval.startsheet - ? "" - : wval.currentsheet + "!"; - editor.inputBox.SetText( - wval.partialexpr + - sheetpref + - SocialCalc.crToCoord(range.left, range.top) + - ":" + - sheetpref + - SocialCalc.crToCoord(range.right, range.bottom) - ); - } else { - var sheetpref = - wval.currentsheet == wval.startsheet - ? "" - : wval.currentsheet + "!"; - editor.inputBox.SetText(wval.partialexpr + sheetpref + coord); - } - } - } else { - // not in point -- done editing - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - } - break; - - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - break; - } - }; - - SocialCalc.ProcessEditorMouseMove = function (e) { - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat(editor, result); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - if (result.coord != mouseinfo.mouselastcoord) { - if (!e.shiftKey && !editor.range.hasrange) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - } - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - mouseinfo.mouselastcoord = result.coord; - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.ProcessEditorMouseUp = function (e) { - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result) return; - - if (!result.coord) result.coord = editor.ecell.coord; - - if (editor.range.hasrange) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } else if (result.coord && result.coord != mouseinfo.mousedowncoord) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener( - "mousemove", - SocialCalc.ProcessEditorMouseMove, - true - ); - document.removeEventListener( - "mouseup", - SocialCalc.ProcessEditorMouseUp, - true - ); - } else if (element.detachEvent) { - // IE - element.detachEvent("onlosecapture", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmouseup", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmousemove", SocialCalc.ProcessEditorMouseMove); - element.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - }; - - SocialCalc.ProcessEditorColsizeMouseDown = function (e, ele, result) { - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - mouseinfo.mouseresizecolnum = result.coltoresize; // remember col being resized - mouseinfo.mouseresizecol = SocialCalc.rcColname(result.coltoresize); - mouseinfo.mousedownclientx = clientX; - - var sizedisplay = document.createElement("div"); - mouseinfo.mouseresizedisplay = sizedisplay; - sizedisplay.style.width = "auto"; - sizedisplay.style.position = "absolute"; - sizedisplay.style.zIndex = 100; - sizedisplay.style.top = editor.headposition.top + 0 + "px"; - sizedisplay.style.left = editor.colpositions[result.coltoresize] + "px"; - sizedisplay.innerHTML = - '' + - '
     
    ' + - editor.context.colwidth[mouseinfo.mouseresizecolnum] + - "
    "; - SocialCalc.setStyles( - sizedisplay.firstChild.lastChild.firstChild.childNodes[0], - "filter:alpha(opacity=85);opacity:.85;" - ); // so no warning msg with Firefox about filter - - editor.toplevel.appendChild(sizedisplay); - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.ProcessEditorColsizeMouseMove, - true - ); // capture everywhere - document.addEventListener( - "mouseup", - SocialCalc.ProcessEditorColsizeMouseUp, - true - ); // capture everywhere - } else if (editor.toplevel.attachEvent) { - // IE 5+ - editor.toplevel.setCapture(); - editor.toplevel.attachEvent( - "onmousemove", - SocialCalc.ProcessEditorColsizeMouseMove - ); - editor.toplevel.attachEvent( - "onmouseup", - SocialCalc.ProcessEditorColsizeMouseUp - ); - editor.toplevel.attachEvent( - "onlosecapture", - SocialCalc.ProcessEditorColsizeMouseUp - ); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.ProcessEditorColsizeMouseMove = function (e) { - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - var newsize = - editor.context.colwidth[mouseinfo.mouseresizecolnum] - - 0 + - (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) - newsize = SocialCalc.Constants.defaultMinimumColWidth; - - var sizedisplay = mouseinfo.mouseresizedisplay; - // sizedisplay.firstChild.lastChild.firstChild.childNodes[1].firstChild.innerHTML = newsize+""; - // sizedisplay.firstChild.lastChild.firstChild.childNodes[0].firstChild.style.width = (newsize-2)+"px"; - sizedisplay.innerHTML = - '' + - '
     
    ' + - newsize + - "
    "; - SocialCalc.setStyles( - sizedisplay.firstChild.lastChild.firstChild.childNodes[0], - "filter:alpha(opacity=85);opacity:.85;" - ); // so no warning msg with Firefox about filter - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.ProcessEditorColsizeMouseUp = function (e) { - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - element = mouseinfo.element; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener( - "mousemove", - SocialCalc.ProcessEditorColsizeMouseMove, - true - ); - document.removeEventListener( - "mouseup", - SocialCalc.ProcessEditorColsizeMouseUp, - true - ); - } else if (editor.toplevel.detachEvent) { - // IE - editor.toplevel.detachEvent( - "onlosecapture", - SocialCalc.ProcessEditorColsizeMouseUp - ); - editor.toplevel.detachEvent( - "onmouseup", - SocialCalc.ProcessEditorColsizeMouseUp - ); - editor.toplevel.detachEvent( - "onmousemove", - SocialCalc.ProcessEditorColsizeMouseMove - ); - editor.toplevel.releaseCapture(); - } - - var newsize = - editor.context.colwidth[mouseinfo.mouseresizecolnum] - - 0 + - (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) - newsize = SocialCalc.Constants.defaultMinimumColWidth; - - editor.EditorScheduleSheetCommands( - "set " + mouseinfo.mouseresizecol + " width " + newsize, - true, - false - ); - - if (editor.timeout) window.clearTimeout(editor.timeout); - editor.timeout = window.setTimeout(SocialCalc.FinishColsize, 1); // wait - Firefox 2 has a bug otherwise with next mousedown - - return false; - }; - - SocialCalc.FinishColsize = function () { - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; - - editor.toplevel.removeChild(mouseinfo.mouseresizedisplay); - mouseinfo.mouseresizedisplay = null; - - // editor.FitToEditTable(); - // editor.EditorRenderSheet(); - // editor.SchedulePositionCalculations(); - - mouseinfo.editor = null; - - return; - }; - - // - // Handle auto-repeat of dragging the cursor into the borders of the sheet - // - - SocialCalc.AutoRepeatInfo = { - timer: null, // timer object for repeating - mouseinfo: null, // result from SocialCalc.GridMousePosition - repeatinterval: 1000, // milliseconds to wait between repeats - editor: null, // editor object to use when it repeats - repeatcallback: null, // used instead of default when repeating (e.g., for cellhandles) - // called as: repeatcallback(newcoord, direction) - }; - - // Control auto-repeat. If mouseinfo==null, cancel. - - SocialCalc.SetDragAutoRepeat = function (editor, mouseinfo, callback) { - var repeatinfo = SocialCalc.AutoRepeatInfo; - var coord, direction; - - repeatinfo.repeatcallback = callback; // null in regular case - - if (!mouseinfo) { - // cancel - if (repeatinfo.timer) { - // If was repeating, stop - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - repeatinfo.mouseinfo = null; - return; // done - } - - repeatinfo.editor = editor; - - if (repeatinfo.mouseinfo) { - // check for change while repeating - if (mouseinfo.rowheader || mouseinfo.rowfooter) { - if (mouseinfo.row != repeatinfo.mouseinfo.row) { - // changed row while dragging sidewards - coord = SocialCalc.crToCoord(editor.ecell.col, mouseinfo.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } else { - editor.MoveECell(coord); - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } else if (mouseinfo.colheader || mouseinfo.colfooter) { - if (mouseinfo.col != repeatinfo.mouseinfo.col) { - // changed col while dragging vertically - coord = SocialCalc.crToCoord(mouseinfo.col, editor.ecell.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } else { - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } - } - - repeatinfo.mouseinfo = mouseinfo; - - if (mouseinfo.distance < 5) repeatinfo.repeatinterval = 333; - else if (mouseinfo.distance < 10) repeatinfo.repeatinterval = 250; - else if (mouseinfo.distance < 25) repeatinfo.repeatinterval = 100; - else if (mouseinfo.distance < 35) repeatinfo.repeatinterval = 75; - else { - // too far - stop repeating - if (repeatinfo.timer) { - // if repeating, cancel it - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - return; - } - - if (!repeatinfo.timer) { - // start if not already running - repeatinfo.timer = window.setTimeout( - SocialCalc.DragAutoRepeat, - repeatinfo.repeatinterval - ); - } - - return; - }; - - // - // DragAutoRepeat() - // - - SocialCalc.DragAutoRepeat = function () { - var repeatinfo = SocialCalc.AutoRepeatInfo; - var mouseinfo = repeatinfo.mouseinfo; - - var direction, coord, cr; - - if (mouseinfo.rowheader) direction = "left"; - else if (mouseinfo.rowfooter) direction = "right"; - else if (mouseinfo.colheader) direction = "up"; - else if (mouseinfo.colfooter) direction = "down"; - - if (repeatinfo.repeatcallback) { - cr = SocialCalc.coordToCr(repeatinfo.editor.ecell.coord); - if (direction == "left" && cr.col > 1) cr.col--; - else if (direction == "right") cr.col++; - else if (direction == "up" && cr.row > 1) cr.row--; - else if (direction == "down") cr.row++; - coord = SocialCalc.crToCoord(cr.col, cr.row); - repeatinfo.repeatcallback(coord, direction); - } else { - coord = repeatinfo.editor.MoveECellWithKey("[a" + direction + "]shifted"); - if (coord) repeatinfo.editor.EditorMouseRange(coord); - } - - repeatinfo.timer = window.setTimeout( - SocialCalc.DragAutoRepeat, - repeatinfo.repeatinterval - ); - }; - - // - // Handling Clicking - // - - SocialCalc.ProcessEditorDblClick = function (e) { - var editor, result, coord, textarea, wval, range, sheetobj; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var mobj; - - if (mouseinfo.ignore) return; // ignore this - - for (mobj = null; !mobj && ele; ele = ele.parentNode) { - // go up tree looking for one of our elements - mobj = SocialCalc.LookupElement(ele, mouseinfo.registeredElements); - } - if (!mobj) { - mouseinfo.editor = null; - return; // not one of our elements - } - - editor = mobj.editor; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); - if (!result || !result.coord) return; // not within cell area - ignore - - mouseinfo.editor = editor; // remember for later - mouseinfo.element = ele; - range = editor.range; - - sheetobj = editor.context.sheetobj; - - switch (editor.state) { - case "start": - SocialCalc.EditorOpenCellEdit(editor); - break; - - case "input": - break; - - default: - break; - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.EditorOpenCellEdit = function (editor) { - var wval; - - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no input box, so no editing (happens on noEdit) - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - if (editor.inputBox.element.disabled) return true; // multi-line: ignore - if (editor.inputBox.element.style.display == "none") { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "editecell", - null, - editor.StatusCallback[f].params - ); - } - return true; // no inputBox display, so no editing - } - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - - editor.state = "inputboxdirect"; - - editor.inputBox.SetText(""); - editor.inputBox.DisplayCellContents(); - editor.inputBox.Select("end"); - wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - - return; - }; - - SocialCalc.EditorProcessKey = function (editor, ch, e) { - var result, cell, cellobj, valueinfo, fch, coord, inputtext, f; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - var range = editor.range; - - if (typeof ch != "string") ch = ""; - - switch (editor.state) { - case "start": - if (e.shiftKey && ch.substr(0, 2) == "[a") { - ch = ch + "shifted"; - } - if (ch == "[enter]") ch = "[adown]"; - if (ch == "[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if ( - ch.substr(0, 2) == "[a" || - ch.substr(0, 3) == "[pg" || - ch == "[home]" - ) { - result = editor.MoveECellWithKey(ch); - return !result; - } - if (ch == "[del]" || ch == "[backspace]") { - if (!editor.noEdit) { - editor.EditorApplySetCommandsToRange("empty", ""); - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - break; - } - if (ch == "[esc]") { - if (range.hasrange) { - editor.RangeRemove(); - editor.MoveECell(range.anchorcoord); - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "specialkey", - ch, - editor.StatusCallback[f].params - ); - } - } - return false; - } - - if (ch == "[f2]") { - if (editor.noEdit) return true; - SocialCalc.EditorOpenCellEdit(editor); - return false; - } - - if ((ch.length > 1 && ch.substr(0, 1) == "[") || ch.length == 0) { - // some control key - if (editor.ctrlkeyFunction && ch.length > 0) { - return editor.ctrlkeyFunction(editor, ch); - } else { - return true; - } - } - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no inputBox so no editing - if (editor.inputBox.element.style.display == "none") { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "editecell", - ch, - editor.StatusCallback[f].params - ); - } - return true; // no inputBox display, so no editing - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - editor.inputBox.element.disabled = false; // make sure editable - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - editor.inputBox.SetText(ch); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (editor.inputBox.skipOne) return false; // ignore a key already handled - if ( - ch == "[esc]" || - ch == "[enter]" || - ch == "[tab]" || - (ch && ch.substr(0, 2) == "[a") - ) { - if ( - ("(+-*/,:!&<>=^".indexOf(inputtext.slice(-1)) >= 0 && - inputtext.slice(0, 1) == "=") || - inputtext == "=" - ) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { - // if in pointing operation - if (e.shiftKey && ch.substr(0, 2) == "[a") { - ch = ch + "shifted"; - } - coord = editor.MoveECellWithKey(ch); - if (coord) { - if (range.hasrange) { - editor.inputBox.SetText( - wval.partialexpr + - SocialCalc.crToCoord(range.left, range.top) + - ":" + - SocialCalc.crToCoord(range.right, range.bottom) - ); - } else { - editor.inputBox.SetText(wval.partialexpr + coord); - } - return false; - } - } - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch != "[esc]") { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch == "[enter]") ch = "[adown]"; - if (ch == "[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0, 2) == "[a") { - editor.MoveECellWithKey(ch); - } - } else { - editor.inputBox.DisplayCellContents(); - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - break; - } - if (wval.partialexpr && ch == "[backspace]") { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - return false; - } - if (ch == "[f2]") return false; - if (range.hasrange) { - editor.RangeRemove(); - } - editor.MoveECell(wval.ecoord); - if (wval.partialexpr) { - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - wval.partialexpr = ""; // not pointing - } - return true; - - case "inputboxdirect": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (ch == "[esc]" || ch == "[enter]" || ch == "[tab]") { - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch == "[esc]") { - editor.inputBox.DisplayCellContents(); - } else { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch == "[enter]") ch = "[adown]"; - if (ch == "[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0, 2) == "[a") { - editor.MoveECellWithKey(ch); - } - } - break; - } - if (ch == "[f2]") return false; - return true; - - case "skip-and-start": - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - return false; - - default: - return true; - } - - return false; - }; - - SocialCalc.EditorAddToInput = function (editor, str, prefix) { - var wval = editor.workingvalues; - - if (editor.noEdit) return; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - switch (editor.state) { - case "start": - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.element.disabled = false; // make sure editable and overwrite old - editor.inputBox.Focus(); - editor.inputBox.SetText((prefix || "") + str); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.focus(); - if (wval.partialexpr) { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - editor.inputBox.SetText(editor.inputBox.GetText() + str); - break; - - default: - break; - } - }; - - SocialCalc.EditorDisplayCellContents = function (editor) { - if (editor.inputBox) editor.inputBox.DisplayCellContents(); - }; - var arr = []; - SocialCalc.EditorSaveEdit = function (editor, text) { - //console.log("editorSaveEdit"); - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - type = "text t"; - //changes for prompt - - value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord) + ""; - //console.log("old:"+oldvalue) - //console.log("new:"+value) - if (value == oldvalue) { - // no change - return; - } - if ("'" + value == oldvalue) { - return; - } - - fch = value.charAt(0); - if (fch == "=" && value.indexOf("\n") == -1) { - type = "formula"; - value = value.substring(1); - } else if (fch == "'") { - type = "text t"; - value = value.substring(1); - } else if (value.length == 0) { - type = "empty"; - } else { - valueinfo = SocialCalc.DetermineValueType(value); - if (valueinfo.type == "n" && value == valueinfo.value + "") { - // see if don't need "constant" - type = "value n"; - } else if (valueinfo.type.charAt(0) == "t") { - type = "text " + valueinfo.type; - } else if (valueinfo.type == "") { - type = "text t"; - } else { - type = "constant " + valueinfo.type + " " + valueinfo.value; - } - } - - if (type.charAt(0) == "t") { - // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - cmdline = "set " + wval.ecoord + " " + type + " " + value; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - }; - - // - // SocialCalc.EditorApplySetCommandsToRange(editor, cmd) - // - // Takes ecell or range and does a "set" command with cmd. - // - - SocialCalc.EditorApplySetCommandsToRange = function (editor, cmd) { - var cell, row, col, line, errortext; - - var sheetobj = editor.context.sheetobj; - var ecell = editor.ecell; - var range = editor.range; - - if (range.hasrange) { - coord = - SocialCalc.crToCoord(range.left, range.top) + - ":" + - SocialCalc.crToCoord(range.right, range.bottom); - line = "set " + coord + " " + cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } else { - line = "set " + ecell.coord + " " + cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } - - editor.DisplayCellContents(); - }; - - SocialCalc.EditorProcessMouseWheel = function ( - event, - delta, - mousewheelinfo, - wobj - ) { - if (wobj.functionobj.editor.busy) return; // ignore if busy - - if (delta > 0) { - wobj.functionobj.editor.ScrollRelative(true, -1); - } - if (delta < 0) { - wobj.functionobj.editor.ScrollRelative(true, +1); - } - }; - - // - // GridMousePosition(editor, clientX, clientY) - // - // Returns an object with row and col numbers and coord (spans handled for coords), - // and rowheader/colheader true if in header (where coord will be undefined). - // If in colheader, will return coltoresize if on appropriate place in col header. - // Also, there is rowfooter (on right) and colfooter (on bottom). - // In row/col header/footer, returns "distance" as pixels over the edge. - // - - SocialCalc.GridMousePosition = function (editor, clientX, clientY) { - var row, col, colpane; - var result = {}; - - for (row = 1; row < editor.rowpositions.length; row++) { - if (!editor.rowheight[row]) continue; // not rendered yet -- may be above or below us - if (editor.rowpositions[row] + editor.rowheight[row] > clientY) { - break; - } - } - for (col = 1; col < editor.colpositions.length; col++) { - if (!editor.colwidth[col]) continue; - if (editor.colpositions[col] + editor.colwidth[col] > clientX) { - break; - } - } - - result.row = row; - result.col = col; - - if (editor.headposition) { - if ( - clientX < editor.headposition.left && - clientX >= editor.gridposition.left - ) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } else if ( - clientY < editor.headposition.top && - clientY > editor.gridposition.top - ) { - // > because of sizing row - result.colheader = true; - result.distance = editor.headposition.top - clientY; - result.coltoresize = - col - - (editor.colpositions[col] + editor.colwidth[col] / 2 > clientX - ? 1 - : 0) || 1; - for (colpane = 0; colpane < editor.context.colpanes.length; colpane++) { - if ( - result.coltoresize >= editor.context.colpanes[colpane].first && - result.coltoresize <= editor.context.colpanes[colpane].last - ) { - // visible column - return result; - } - } - delete result.coltoresize; - return result; - } else if (clientX >= editor.verticaltablecontrol.controlborder) { - result.rowfooter = true; - result.distance = clientX - editor.verticaltablecontrol.controlborder; - return result; - } else if (clientY >= editor.horizontaltablecontrol.controlborder) { - result.colfooter = true; - result.distance = clientY - editor.horizontaltablecontrol.controlborder; - return result; - } else if (clientX < editor.gridposition.left) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } else if (clientY <= editor.gridposition.top) { - result.colheader = true; - result.distance = editor.headposition.top - clientY; - return result; - } else { - result.coord = SocialCalc.crToCoord(result.col, result.row); - if (editor.context.cellskip[result.coord]) { - // handle skipped cells - result.coord = editor.context.cellskip[result.coord]; - } - return result; - } - } - - return null; - }; - - // - // GetEditorCellElement(editor, row, col) - // - // Returns an object with element, the table cell element in the DOM that corresponds to row and column, - // as well as rowpane and colpane, the panes with the cell. - // If no such element, then returns null; - // - - SocialCalc.GetEditorCellElement = function (editor, row, col) { - var rowpane, colpane, c, coord; - var rowindex = 0; - var colindex = 0; - - for (rowpane = 0; rowpane < editor.context.rowpanes.length; rowpane++) { - if ( - row >= editor.context.rowpanes[rowpane].first && - row <= editor.context.rowpanes[rowpane].last - ) { - for (colpane = 0; colpane < editor.context.colpanes.length; colpane++) { - if ( - col >= editor.context.colpanes[colpane].first && - col <= editor.context.colpanes[colpane].last - ) { - rowindex += row - editor.context.rowpanes[rowpane].first + 2; - for (c = editor.context.colpanes[colpane].first; c <= col; c++) { - coord = editor.context.cellskip[SocialCalc.crToCoord(c, row)]; - if ( - !coord || - !editor.context.CoordInPane(coord, rowpane, colpane) - ) - // don't count col-spanned cells - colindex++; - } - return { - element: - editor.griddiv.firstChild.lastChild.childNodes[rowindex] - .childNodes[colindex], - rowpane: rowpane, - colpane: colpane, - }; - } - for ( - c = editor.context.colpanes[colpane].first; - c <= editor.context.colpanes[colpane].last; - c++ - ) { - coord = editor.context.cellskip[SocialCalc.crToCoord(c, row)]; - if (!coord || !editor.context.CoordInPane(coord, rowpane, colpane)) - // don't count col-spanned cells - colindex++; - } - colindex += 1; - } - } - rowindex += - editor.context.rowpanes[rowpane].last - - editor.context.rowpanes[rowpane].first + - 1 + - 1; - } - - return null; - }; - - // - // cellcoord = MoveECellWithKey(editor, ch) - // - // Processes an arrow key, etc., moving the edit cell. - // If not a movement key, returns null. - // - - SocialCalc.MoveECellWithKey = function (editor, ch) { - var coord, row, col, cell; - var shifted = false; - - if (!editor.ecell) { - return null; - } - - if (ch.slice(-7) == "shifted") { - ch = ch.slice(0, -7); - shifted = true; - } - - row = editor.ecell.row; - col = editor.ecell.col; - cell = editor.context.sheetobj.cells[editor.ecell.coord]; - - switch (ch) { - case "[adown]": - row += (cell && cell.rowspan) || 1; - break; - case "[aup]": - row--; - break; - case "[pgdn]": - row += editor.pageUpDnAmount - 1 + ((cell && cell.rowspan) || 1); - break; - case "[pgup]": - row -= editor.pageUpDnAmount; - break; - case "[aright]": - col += (cell && cell.colspan) || 1; - break; - case "[aleft]": - col--; - break; - case "[home]": - row = 1; - col = 1; - break; - default: - return null; - } - - if (!editor.range.hasrange) { - if (shifted) editor.RangeAnchor(); - } - - coord = editor.MoveECell(SocialCalc.crToCoord(col, row)); - - if (editor.range.hasrange) { - if (shifted) editor.RangeExtend(); - else editor.RangeRemove(); - } - - return coord; - }; - - // - // cellcoord = MoveECell(editor, newecell) - // - // Takes a coordinate and returns the new edit cell coordinate (which may be - // different if newecell is covered by a span). - // - - SocialCalc.MoveECell = function (editor, newcell) { - var cell, f; - - var highlights = editor.context.highlights; - - if (editor.ecell) { - //changes for prompt - if (editor.ecell.coord == newcell) return newcell; - - if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast("ecell", { - original: editor.ecell.coord, - ecell: newcell, - }); - } - - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - delete highlights[editor.ecell.coord]; - if ( - editor.range2.hasrange && - editor.ecell.row >= editor.range2.top && - editor.ecell.row <= editor.range2.bottom && - editor.ecell.col >= editor.range2.left && - editor.ecell.col <= editor.range2.right - ) { - highlights[editor.ecell.coord] = "range2"; - } - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders(""); // set to regular col/rowname styles - editor.cellhandles.ShowCellHandles(false); - } else if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast("ecell", { ecell: newcell }); - } - newcell = editor.context.cellskip[newcell] || newcell; - editor.ecell = SocialCalc.coordToCr(newcell); - editor.ecell.coord = newcell; - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - highlights[newcell] = "cursor"; - - for (f in editor.MoveECellCallback) { - // let others know - editor.MoveECellCallback[f](editor); - } - - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders("selected"); - - for (f in editor.StatusCallback) { - // let status line, etc., know - editor.StatusCallback[f].func( - editor, - "moveecell", - newcell, - editor.StatusCallback[f].params - ); - } - - if (editor.busy) { - editor.ensureecell = true; // wait for when not busy - } else { - editor.ensureecell = false; - editor.EnsureECellVisible(); - } - - return newcell; - }; - - SocialCalc.EnsureECellVisible = function (editor) { - var vamount = 0; - var hamount = 0; - - if (editor.ecell.row > editor.lastnonscrollingrow) { - if (editor.ecell.row < editor.firstscrollingrow) { - vamount = editor.ecell.row - editor.firstscrollingrow; - } else if (editor.ecell.row > editor.lastvisiblerow) { - vamount = editor.ecell.row - editor.lastvisiblerow; - } - } - if (editor.ecell.col > editor.lastnonscrollingcol) { - if (editor.ecell.col < editor.firstscrollingcol) { - hamount = editor.ecell.col - editor.firstscrollingcol; - } else if (editor.ecell.col > editor.lastvisiblecol) { - hamount = editor.ecell.col - editor.lastvisiblecol; - } - } - - if (vamount != 0 || hamount != 0) { - editor.ScrollRelativeBoth(vamount, hamount); - } else { - editor.cellhandles.ShowCellHandles(true); - } - }; - - SocialCalc.ReplaceCell = function (editor, cell, row, col) { - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell( - row, - col, - cell.rowpane, - cell.colpane, - true, - null - ); - if (newelement) { - // Don't use a real element and replaceChild, which seems to have focus issues with IE, Firefox, and speed issues - cell.element.innerHTML = newelement.innerHTML; - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a] != "cssText") - cell.element.style[a] = newelement.style[a]; - } - } - }; - - SocialCalc.UpdateCellCSS = function (editor, cell, row, col) { - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell( - row, - col, - cell.rowpane, - cell.colpane, - true, - null - ); - if (newelement) { - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a] != "cssText") - cell.element.style[a] = newelement.style[a]; - } - } - }; - - SocialCalc.SetECellHeaders = function (editor, selected) { - var ecell = editor.ecell; - var context = editor.context; - - var rowpane, colpane, first, last; - var rowindex = 0; - var colindex = 0; - var headercell; - - if (!ecell) return; - - for (rowpane = 0; rowpane < context.rowpanes.length; rowpane++) { - first = context.rowpanes[rowpane].first; - last = context.rowpanes[rowpane].last; - if (ecell.row >= first && ecell.row <= last) { - headercell = - editor.fullgrid.childNodes[1].childNodes[ - 2 + rowindex + ecell.row - first - ].childNodes[0]; - if (headercell) { - if (context.classnames) - headercell.className = context.classnames[selected + "rowname"]; - if (context.explicitStyles) - headercell.style.cssText = - context.explicitStyles[selected + "rowname"]; - headercell.style.verticalAlign = "top"; // to get around Safari making top of centered row number be - // considered top of row (and can't get position in Safari) - } - } - rowindex += last - first + 1 + 1; - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - first = context.colpanes[colpane].first; - last = context.colpanes[colpane].last; - if (ecell.col >= first && ecell.col <= last) { - headercell = - editor.fullgrid.childNodes[1].childNodes[1].childNodes[ - 1 + colindex + ecell.col - first - ]; - if (headercell) { - if (context.classnames) - headercell.className = context.classnames[selected + "colname"]; - if (context.explicitStyles) - headercell.style.cssText = - context.explicitStyles[selected + "colname"]; - } - } - colindex += last - first + 1 + 1; - } - }; - - // - // RangeAnchor(editor, ecoord) - // - // Sets the anchor of a range to ecoord (or ecell if missing). - // - - SocialCalc.RangeAnchor = function (editor, ecoord) { - if (editor.range.hasrange) { - editor.RangeRemove(); - } - - editor.RangeExtend(ecoord); - }; - - // - // RangeExtend(editor, ecoord) - // - // Sets the other corner of the range to ecoord or, if missing, ecell. - // - - SocialCalc.RangeExtend = function (editor, ecoord) { - var a, cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - var ecell; - if (ecoord) { - ecell = SocialCalc.coordToCr(ecoord); - ecell.coord = ecoord; - } else ecell = editor.ecell; - - if (!ecell) return; // just in case - if (SocialCalc.Constants.SCNoRanging) return; - - if (!range.hasrange) { - // called without RangeAnchor... - range.anchorcoord = ecell.coord; - range.anchorrow = ecell.row; - range.top = ecell.row; - range.bottom = ecell.row; - range.anchorcol = ecell.col; - range.left = ecell.col; - range.right = ecell.col; - range.hasrange = true; - } - - if (range.anchorrow < ecell.row) { - range.top = range.anchorrow; - range.bottom = ecell.row; - } else { - range.top = ecell.row; - range.bottom = range.anchorrow; - } - if (range.anchorcol < ecell.col) { - range.left = range.anchorcol; - range.right = ecell.col; - } else { - range.left = ecell.col; - range.right = range.anchorcol; - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - highlights[coord] = "unrange"; - break; - case "range2": - highlights[coord] = "unrange2"; - break; - } - } - - for (row = range.top; row <= range.bottom; row++) { - for (col = range.left; col <= range.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange": - highlights[coord] = "range"; - break; - case "cursor": - break; - case "unrange2": - default: - highlights[coord] = "newrange"; - break; - } - } - } - - for (row = range2.top; range2.hasrange && row <= range2.bottom; row++) { - for (col = range2.left; col <= range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange2": - highlights[coord] = "range2"; - break; - case "range": - case "newrange": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "unrange": - delete highlights[coord]; - break; - case "newrange": - highlights[coord] = "range"; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "range": - case "range2": - case "cursor": - continue; - } - - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - for (f in editor.RangeChangeCallback) { - // let others know - editor.RangeChangeCallback[f](editor); - } - - // create range/coord string and do status callback - - coord = SocialCalc.crToCoord(editor.range.left, editor.range.top); - if ( - editor.range.left != editor.range.right || - editor.range.top != editor.range.bottom - ) { - // more than one cell - coord += - ":" + SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "rangechange", - coord, - editor.StatusCallback[f].params - ); - } - - return; - }; - - // - // RangeRemove(editor) - // - // Turns off the range. - // - - SocialCalc.RangeRemove = function (editor) { - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - if (!range.hasrange && !range2.hasrange) return; - - for (row = range2.top; range2.hasrange && row <= range2.bottom; row++) { - for (col = range2.left; col <= range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "range": - highlights[coord] = "newrange2"; - break; - case "range2": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - delete highlights[coord]; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range.hasrange = false; - - for (f in editor.RangeChangeCallback) { - // let others know - editor.RangeChangeCallback[f](editor); - } - - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "rangechange", - "", - editor.StatusCallback[f].params - ); - } - - return; - }; - - // - // Range2Remove(editor) - // - // Turns off the range2. - // - - SocialCalc.Range2Remove = function (editor) { - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range2 = editor.range2; - - if (!range2.hasrange) return; - - for (coord in highlights) { - switch (highlights[coord]) { - case "range2": - delete highlights[coord]; - break; - case "range": - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range2.hasrange = false; - - return; - }; - - // - // FitToEditTable(editor) - // - // Figure out (through column width declarations and approximation of pixels per row) - // how many rendered rows and columns you need to be at least a little larger than - // the editor's editing area. - // - - SocialCalc.FitToEditTable = function (editor) { - var colnum, colname, colwidth, totalwidth, totalrows, rowpane, needed; - - var context = editor.context; - var sheetobj = context.sheetobj; - var sheetcolattribs = sheetobj.colattribs; - - // Calculate column width data - - totalwidth = context.showRCHeaders ? context.rownamewidth - 0 : 0; - for (var colpane = 0; colpane < context.colpanes.length - 1; colpane++) { - // Get width of all but last pane - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - colname = SocialCalc.rcColname(colnum); - colwidth = - sheetobj.colattribs.width[colname] || - sheetobj.attribs.defaultcolwidth || - SocialCalc.Constants.defaultColWidth; - if (colwidth == "blank" || colwidth == "auto") colwidth = ""; - totalwidth += colwidth && colwidth - 0 > 0 ? colwidth - 0 : 10; - } - } - - for (colnum = context.colpanes[colpane].first; colnum <= 10000; colnum++) { - //!!! max for safety, but makes that col max!!! - colname = SocialCalc.rcColname(colnum); - colwidth = - sheetobj.colattribs.width[colname] || - sheetobj.attribs.defaultcolwidth || - SocialCalc.Constants.defaultColWidth; - if (colwidth == "blank" || colwidth == "auto") colwidth = ""; - totalwidth += colwidth && colwidth - 0 > 0 ? colwidth - 0 : 10; - if (totalwidth > editor.tablewidth) break; - } - - context.colpanes[colpane].last = colnum; - - // Calculate row height data - - totalrows = context.showRCHeaders ? 1 : 0; - for (rowpane = 0; rowpane < context.rowpanes.length - 1; rowpane++) { - // count all panes but last one - totalrows += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 1; - } - - needed = editor.tableheight - totalrows * context.pixelsPerRow; // estimate amount needed - - context.rowpanes[rowpane].last = - context.rowpanes[rowpane].first + - Math.floor(needed / context.pixelsPerRow) + - 1; - }; - - // - // CalculateEditorPositions(editor) - // - // Calculate the screen positions and other values of various editing elements - // These values change and need to be recomputed when the pane first/last or cell contents change, - // as well as new column widths, etc. - // - // Note: Only call this after the grid has been rendered! You may have to wait for a timeout... - // - - SocialCalc.CalculateEditorPositions = function (editor) { - var rowpane, colpane, i; - - editor.gridposition = SocialCalc.GetElementPosition(editor.griddiv); - editor.headposition = SocialCalc.GetElementPosition( - editor.griddiv.firstChild.lastChild.childNodes[2].childNodes[1] - ); // 3rd tr 2nd td - - editor.rowpositions = []; - for (rowpane = 0; rowpane < editor.context.rowpanes.length; rowpane++) { - editor.CalculateRowPositions( - rowpane, - editor.rowpositions, - editor.rowheight - ); - } - for (i = 0; i < editor.rowpositions.length; i++) { - if (editor.rowpositions[i] > editor.gridposition.top + editor.tableheight) - break; - } - editor.lastvisiblerow = i - 1; - - editor.colpositions = []; - for (colpane = 0; colpane < editor.context.colpanes.length; colpane++) { - editor.CalculateColPositions( - colpane, - editor.colpositions, - editor.colwidth - ); - } - for (i = 0; i < editor.colpositions.length; i++) { - if (editor.colpositions[i] > editor.gridposition.left + editor.tablewidth) - break; - } - editor.lastvisiblecol = i - 1; - - editor.firstscrollingrow = - editor.context.rowpanes[editor.context.rowpanes.length - 1].first; - editor.firstscrollingrowtop = - editor.rowpositions[editor.firstscrollingrow] || editor.headposition.top; - editor.lastnonscrollingrow = - editor.context.rowpanes.length - 1 > 0 - ? editor.context.rowpanes[editor.context.rowpanes.length - 2].last - : 0; - editor.firstscrollingcol = - editor.context.colpanes[editor.context.colpanes.length - 1].first; - editor.firstscrollingcolleft = - editor.colpositions[editor.firstscrollingcol] || editor.headposition.left; - editor.lastnonscrollingcol = - editor.context.colpanes.length - 1 > 0 - ? editor.context.colpanes[editor.context.colpanes.length - 2].last - : 0; - - // Now do the table controls - - editor.verticaltablecontrol.ComputeTableControlPositions(); - editor.horizontaltablecontrol.ComputeTableControlPositions(); - }; - - // - // ScheduleRender(editor) - // - // Do a series of timeouts to render the sheet, wait for background layout and - // rendering by the browser, and then update editor visuals, sliders, etc. - // - - SocialCalc.ScheduleRender = function (editor) { - if (editor.timeout) window.clearTimeout(editor.timeout); // in case called more than once, just use latest - - SocialCalc.EditorSheetStatusCallback(null, "schedrender", null, editor); - SocialCalc.EditorStepInfo.editor = editor; - editor.timeout = window.setTimeout(SocialCalc.DoRenderStep, 1); - }; - - // DoRenderStep() - // - - SocialCalc.DoRenderStep = function () { - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - editor.EditorRenderSheet(); - - SocialCalc.EditorSheetStatusCallback(null, "renderdone", null, editor); - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - }; - - // - // SocialCalc.SchedulePositionCalculations(editor) - // - - SocialCalc.SchedulePositionCalculations = function (editor) { - SocialCalc.EditorStepInfo.editor = editor; - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - }; - - // DoPositionCalculations(editor) - // - // Update editor visuals, sliders, etc. - // - // Note: Only call this after the DOM objects have been modified and rendered! - // - - SocialCalc.DoPositionCalculations = function () { - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - var ok = false; - try { - editor.CalculateEditorPositions(); - ok = true; - } catch (e) {} - - if (!ok) { - if (typeof $ != "undefined") { - $(window).trigger("resize"); - setTimeout(SocialCalc.DoPositionCalculations, 400); - } - return; /* Workaround IE6 partial-initialized-DOM bug */ - } - - editor.verticaltablecontrol.PositionTableControlElements(); - editor.horizontaltablecontrol.PositionTableControlElements(); - - SocialCalc.EditorSheetStatusCallback(null, "doneposcalc", null, editor); - - if (editor.ensureecell && editor.ecell && !editor.deferredCommands.length) { - // don't do if deferred cmd to execute - editor.ensureecell = false; - editor.EnsureECellVisible(); // this could cause another redisplay - } - - editor.cellhandles.ShowCellHandles(true); - - //!!! Need to now check to see if this positioned controls out of the editing area - //!!! (such as when there is a large wrapped cell and it pushes the pane boundary too far down). - - if (SocialCalc.Callbacks.broadcast) - SocialCalc.Callbacks.broadcast("ask.ecell"); - }; - - SocialCalc.CalculateRowPositions = function ( - editor, - panenum, - positions, - sizes - ) { - var toprow, rowpane, rownum, offset, trowobj, cellposition; - - var context = editor.context; - var sheetobj = context.sheetobj; - - var tbodyobj; - - if (!context.showRCHeaders) throw "Needs showRCHeaders=true"; - - tbodyobj = editor.fullgrid.lastChild; - - // Calculate start of this pane as row in this table: - - toprow = 2; - for (rowpane = 0; rowpane < panenum; rowpane++) { - toprow += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 2; // skip pane and spacing row - } - - offset = 0; - for ( - rownum = context.rowpanes[rowpane].first; - rownum <= context.rowpanes[rowpane].last; - rownum++ - ) { - trowobj = tbodyobj.childNodes[toprow + offset]; - offset++; - cellposition = SocialCalc.GetElementPosition(trowobj.firstChild); - - // Safari has problem: If a cell in the row is high, cell 1 is centered and it returns top of centered part - // but if you get position of row element, it always returns the same value (not the row's) - // So we require row number to be vertical aligned to top - - if (!positions[rownum]) { - positions[rownum] = cellposition.top; // first one takes precedence - sizes[rownum] = trowobj.firstChild.offsetHeight; - } - } - - return; - }; - - SocialCalc.CalculateColPositions = function ( - editor, - panenum, - positions, - sizes - ) { - var leftcol, colpane, colnum, offset, trowobj, cellposition; - - var context = editor.context; - var sheetobj = context.sheetobj; - - var tbodyobj; - - if (!context.showRCHeaders) throw "Needs showRCHeaders=true"; - - tbodyobj = editor.fullgrid.lastChild; - - // Calculate start of this pane as column in this table: - - leftcol = 1; - for (colpane = 0; colpane < panenum; colpane++) { - leftcol += - context.colpanes[colpane].last - context.colpanes[colpane].first + 2; // skip pane and spacing col - } - - trowobj = tbodyobj.childNodes[1]; // get heading row, which has all columns - offset = 0; - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - cellposition = SocialCalc.GetElementPosition( - trowobj.childNodes[leftcol + offset] - ); - if (!positions[colnum]) { - positions[colnum] = cellposition.left; // first one takes precedence - if (trowobj.childNodes[leftcol + offset]) { - sizes[colnum] = trowobj.childNodes[leftcol + offset].offsetWidth; - } - } - offset++; - } - - return; - }; - - // ScrollRelative(editor, vertical, amount) - // - // If vertical true, scrolls up(-)/down(+), else left(-)/right(+) - - SocialCalc.ScrollRelative = function (editor, vertical, amount) { - if (vertical) { - editor.ScrollRelativeBoth(amount, 0); - } else { - editor.ScrollRelativeBoth(0, amount); - } - return; - }; - - // ScrollRelativeBoth(editor, vamount, hamount) - // - // Does both with one render - - SocialCalc.ScrollRelativeBoth = function (editor, vamount, hamount) { - var context = editor.context; - - var vplen = context.rowpanes.length; - var vlimit = vplen > 1 ? context.rowpanes[vplen - 2].last + 1 : 1; // don't scroll past here - if (context.rowpanes[vplen - 1].first + vamount < vlimit) { - // limit amount - vamount = -context.rowpanes[vplen - 1].first + vlimit; - } - - var hplen = context.colpanes.length; - var hlimit = hplen > 1 ? context.colpanes[hplen - 2].last + 1 : 1; // don't scroll past here - - if (context.colpanes[hplen - 1].first + hamount < hlimit) { - // limit amount - hamount = -context.colpanes[hplen - 1].first + hlimit; - } - - if ( - SocialCalc.IsScrollPossible && - !SocialCalc.IsScrollPossible( - editor.context.sheetobj.attribs.lastrow, - editor.context.sheetobj.attribs.lastcol, - context.rowpanes[vplen - 1].first, - context.colpanes[hplen - 1].first, - vamount, - hamount - ) - ) { - return; - } - - if ((vamount == 1 || vamount == -1) && hamount == 0) { - // special case quick scrolls - if (vamount == 1) { - editor.ScrollTableUpOneRow(); - } else { - editor.ScrollTableDownOneRow(); - } - if (editor.ecell) editor.SetECellHeaders("selected"); - editor.SchedulePositionCalculations(); - return; - } - - // Do a gross move and render - - if (vamount != 0 || hamount != 0) { - context.rowpanes[vplen - 1].first += vamount; - context.rowpanes[vplen - 1].last += vamount; - context.colpanes[hplen - 1].first += hamount; - context.colpanes[hplen - 1].last += hamount; - editor.FitToEditTable(); - editor.ScheduleRender(); - } - }; - - // PageRelative(editor, vertical, direction) - // - // If vertical true, pages up(direction is -)/down(+), else left(-)/right(+) - - SocialCalc.PageRelative = function (editor, vertical, direction) { - var context = editor.context; - var panes = vertical ? "rowpanes" : "colpanes"; - var lastpane = context[panes][context[panes].length - 1]; - var lastvisible = vertical ? "lastvisiblerow" : "lastvisiblecol"; - var sizearray = vertical ? editor.rowheight : editor.colwidth; - var defaultsize = vertical - ? SocialCalc.Constants.defaultAssumedRowHeight - : SocialCalc.Constants.defaultColWidth; - var size, newfirst, totalsize, current; - - if (direction > 0) { - // down/right - newfirst = editor[lastvisible]; - if (newfirst == lastpane.first) newfirst += 1; // move at least one - } else { - if (vertical) { - // calculate amount to scroll - totalsize = - editor.tableheight - - (editor.firstscrollingrowtop - editor.gridposition.top); - } else { - totalsize = - editor.tablewidth - - (editor.firstscrollingcolleft - editor.gridposition.left); - } - totalsize -= - sizearray[editor[lastvisible]] > 0 - ? sizearray[editor[lastvisible]] - : defaultsize; - - for (newfirst = lastpane.first - 1; newfirst > 0; newfirst--) { - size = sizearray[newfirst] > 0 ? sizearray[newfirst] : defaultsize; - if (totalsize < size) break; - totalsize -= size; - } - - current = lastpane.first; - if (newfirst >= current) newfirst = current - 1; // move at least 1 - if (newfirst < 1) newfirst = 1; - } - - lastpane.first = newfirst; - lastpane.last = newfirst + 1; - editor.LimitLastPanes(); - editor.FitToEditTable(); - editor.ScheduleRender(); - }; - - // LimitLastPanes(editor) - // - // Makes sure that the "first" of the last panes isn't before the last of the previous pane - // - - SocialCalc.LimitLastPanes = function (editor) { - var context = editor.context; - var plen; - - plen = context.rowpanes.length; - if ( - plen > 1 && - context.rowpanes[plen - 1].first <= context.rowpanes[plen - 2].last - ) - context.rowpanes[plen - 1].first = context.rowpanes[plen - 2].last + 1; - - plen = context.colpanes.length; - if ( - plen > 1 && - context.colpanes[plen - 1].first <= context.colpanes[plen - 2].last - ) - context.colpanes[plen - 1].first = context.colpanes[plen - 2].last + 1; - }; - - SocialCalc.ScrollTableUpOneRow = function (editor) { - var toprow, - rowpane, - rownum, - colnum, - colpane, - cell, - oldrownum, - maxspan, - newbottomrow, - newrow, - oldchild, - bottomrownum; - var rowneedsrefresh = {}; - - var context = editor.context; - var sheetobj = context.sheetobj; - var tableobj = editor.fullgrid; - - var tbodyobj; - - tbodyobj = tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane = 0; rowpane < context.rowpanes.length - 1; rowpane++) { - toprow += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 2; // skip pane and spacing row - } - - tbodyobj.removeChild(tbodyobj.childNodes[toprow]); - - context.rowpanes[rowpane].first++; - context.rowpanes[rowpane].last++; - editor.FitToEditTable(); - context.CalculateColWidthData(); // Just in case, since normally done in RenderSheet - - newbottomrow = context.RenderRow(context.rowpanes[rowpane].last, rowpane); - tbodyobj.appendChild(newbottomrow); - - // if scrolled off a row with starting rowspans, replace rows for the largest rowspan - - var maxrowspan = 1; - oldrownum = context.rowpanes[rowpane].first - 1; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - var coord = SocialCalc.crToCoord(colnum, oldrownum); - if (context.cellskip[coord]) continue; - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > maxrowspan) maxrowspan = cell.rowspan; - } - } - - if (maxrowspan > 1) { - for (rownum = 1; rownum < maxrowspan; rownum++) { - if (rownum + oldrownum >= context.rowpanes[rowpane].last) break; - newrow = context.RenderRow(rownum + oldrownum, rowpane); - oldchild = tbodyobj.childNodes[toprow + rownum - 1]; - tbodyobj.replaceChild(newrow, oldchild); - } - } - - // if added a row that includes rowspans from above, update the size of those to include new row - - bottomrownum = context.rowpanes[rowpane].last; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - coord = context.cellskip[SocialCalc.crToCoord(colnum, bottomrownum)]; - if (!coord) continue; // only look at spanned cells - rownum = context.coordToCR[coord].row - 0; - if ( - rownum == context.rowpanes[rowpane].last || - rownum < context.rowpanes[rowpane].first - ) - continue; // this row (colspan) or starts above pane - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > 1) rowneedsrefresh[rownum] = true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow = context.RenderRow(rownum, rowpane); - oldchild = - tbodyobj.childNodes[ - toprow + (rownum - context.rowpanes[rowpane].first) - ]; - tbodyobj.replaceChild(newrow, oldchild); - } - - return tableobj; - }; - - SocialCalc.ScrollTableDownOneRow = function (editor) { - var toprow, - rowpane, - rownum, - colnum, - colpane, - cell, - newrownum, - maxspan, - newbottomrow, - newrow, - oldchild, - bottomrownum, - maxrowspan, - coord; - var rowneedsrefresh = {}; - - var context = editor.context; - var sheetobj = context.sheetobj; - var tableobj = editor.fullgrid; - - var tbodyobj; - - tbodyobj = tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane = 0; rowpane < context.rowpanes.length - 1; rowpane++) { - toprow += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 2; // skip pane and spacing row - } - - tbodyobj.removeChild( - tbodyobj.childNodes[ - toprow + - (context.rowpanes[rowpane].last - context.rowpanes[rowpane].first) - ] - ); - - context.rowpanes[rowpane].first--; - context.rowpanes[rowpane].last--; - editor.FitToEditTable(); - context.CalculateColWidthData(); // Just in case, since normally done in RenderSheet - - newrow = context.RenderRow(context.rowpanes[rowpane].first, rowpane); - tbodyobj.insertBefore(newrow, tbodyobj.childNodes[toprow]); - - // if inserted a row with starting rowspans, replace rows for the largest rowspan - - maxrowspan = 1; - newrownum = context.rowpanes[rowpane].first; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - coord = SocialCalc.crToCoord(colnum, newrownum); - if (context.cellskip[coord]) continue; - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > maxrowspan) maxrowspan = cell.rowspan; - } - } - - if (maxrowspan > 1) { - for (rownum = 1; rownum < maxrowspan; rownum++) { - if (rownum + newrownum > context.rowpanes[rowpane].last) break; - newrow = context.RenderRow(rownum + newrownum, rowpane); - oldchild = tbodyobj.childNodes[toprow + rownum]; - tbodyobj.replaceChild(newrow, oldchild); - } - } - - // if last row now includes rowspans or rowspans from above, update the size of those to remove deleted row - - bottomrownum = context.rowpanes[rowpane].last; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - coord = SocialCalc.crToCoord(colnum, bottomrownum); - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > 1) { - rowneedsrefresh[bottomrownum] = true; // need to update this row - continue; - } - coord = context.cellskip[SocialCalc.crToCoord(colnum, bottomrownum)]; - if (!coord) continue; // only look at spanned cells - rownum = context.coordToCR[coord].row - 0; - if (rownum == bottomrownum || rownum < context.rowpanes[rowpane].first) - continue; // this row (colspan) or starts above pane - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > 1) rowneedsrefresh[rownum] = true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow = context.RenderRow(rownum, rowpane); - oldchild = - tbodyobj.childNodes[ - toprow + (rownum - context.rowpanes[rowpane].first) - ]; - tbodyobj.replaceChild(newrow, oldchild); - } - - return tableobj; - }; - - // ************************************* - // - // InputBox class: - // - // This class deals with the text box for editing cell contents. - // It mainly controls a user input box for typed content and is used to interact with - // the keyboard code, etc. - // - // You can use this inside a formula bar control of some sort. - // You create this after you have created a table editor object (but not necessarily - // done the CreateTableEditor method). - // - // When the user starts typing text, or double-clicks on a cell, this object - // comes into play. - // - // The element given when this is first constructed should be an input HTMLElement or - // something that acts like one. Check the code here to see what is done to it. - // - // ************************************* - - SocialCalc.InputBox = function (element, editor) { - if (!element) return; // invoked without enough data to work - - this.element = element; // the input element associated with this InputBox - this.editor = editor; // the TableEditor this belongs to - this.inputEcho = null; - - editor.inputBox = this; - - element.onmousedown = SocialCalc.InputBoxOnMouseDown; - - editor.MoveECellCallback.formulabar = function (e) { - if (e.state != "start") { - return; - } // if not in normal keyboard mode don't replace formula bar - editor.inputBox.DisplayCellContents(e.ecell.coord); - }; - }; - - // Methods: - - SocialCalc.InputBox.prototype.DisplayCellContents = function (coord) { - SocialCalc.InputBoxDisplayCellContents(this, coord); - }; - SocialCalc.InputBox.prototype.ShowInputBox = function (show) { - this.editor.inputEcho.ShowInputEcho(show); - }; - SocialCalc.InputBox.prototype.GetText = function () { - return this.element.value; - }; - SocialCalc.InputBox.prototype.SetText = function (newtext) { - if (!this.element) return; - this.element.value = newtext; - - if (!SocialCalc.Constants.SCNoInputEcho) { - this.editor.inputEcho.SetText(newtext + "_"); - } - }; - SocialCalc.InputBox.prototype.Focus = function () { - SocialCalc.InputBoxFocus(this); - }; - SocialCalc.InputBox.prototype.Blur = function () { - return this.element.blur(); - }; - SocialCalc.InputBox.prototype.Select = function (t) { - if (!this.element) return; - switch (t) { - case "end": - if (document.selection && document.selection.createRange) { - /* IE 4+ - Safer than setting .selectionEnd as it also works for Textareas. */ - var range = document.selection.createRange().duplicate(); - range.moveToElementText(this.element); - range.collapse(false); - range.select(); - } else if (this.element.selectionStart != undefined) { - this.element.selectionStart = this.element.value.length; - this.element.selectionEnd = this.element.value.length; - } - break; - } - }; - - // Functions: - - // - // SocialCalc.InputBoxDisplayCellContents(inputbox, coord) - // - // Sets input box to the contents of the specified cell (or ecell if null). - // - var CoordForColorChange; - var editCoord; - SocialCalc.InputBoxDisplayCellContents = function (inputbox, coord) { - var scc = SocialCalc.Constants; - var cell, position; - - if (!inputbox) return; - - //changes for prompt - if (!coord) { - coord = inputbox.editor.ecell.coord; - } - var text = SocialCalc.GetCellContents( - inputbox.editor.context.sheetobj, - coord - ); - if (text.indexOf("\n") != -1) { - //text = scc.s_inputboxdisplaymultilinetext; - text = scc.s_inputboxdisplaynoteditable; - inputbox.element.disabled = true; - SocialCalc.ToggleInputLineButtons(false); - } else if (!SocialCalc.Callbacks.IsCellEditable(inputbox.editor)) { - text = scc.s_inputboxdisplaynoteditable; - SocialCalc.ToggleInputLineButtons(false); - inputbox.element.disabled = true; - inputbox.element.style.display = "none"; - } else { - CoordForColorChange = coord; - editCoord = coord; - - //changes for prompt - - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - cell = SocialCalc.GetEditorCellElement( - inputbox.editor, - inputbox.editor.ecell.row, - inputbox.editor.ecell.col - ); - var left = "100px"; - var top = "100px"; - var width = 100; - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - left = position.left - 2 + "px"; - top = position.top - 7 + "px"; - width = cell.element.offsetWidth; - } - if (!cell || width == 0) { - //scrolled off screen - SocialCalc.ToggleInputLineButtons(false); - inputbox.element.disabled = true; - inputbox.element.style.display = "none"; - // do nothing - return; - } - var ele = document.getElementById(spreadsheet.formulabarDiv.id); - if (ele) { - spreadsheet.spreadsheetDiv.removeChild(spreadsheet.formulabarDiv); - } - spreadsheet.formulabarDiv.style.left = left; - spreadsheet.formulabarDiv.style.top = top; - //spreadsheet.formulabarDiv.style.width = "30px"; - //spreadsheet.formulabarDiv.style.fontSize = "10px"; - spreadsheet.formulabarDiv.style.zIndex = 100; - spreadsheet.formulabarDiv.style.position = "absolute"; - var input = spreadsheet.formulabarDiv.firstChild; - //changes for prompt - - input.style.fontSize = "100%"; - input.style.backgroundColor = "transparent"; - - input.style.borderBottomColor = "#306eff"; - input.style.borderBottomLeftRadius = "3px"; - input.style.borderBottomRightRadius = "3px"; - input.style.borderBottomStyle = "solid"; - input.style.borderBottomWidth = "2px"; - input.style.borderLeftColor = "#306eff"; - input.style.borderLeftStyle = "solid"; - input.style.borderLeftWidth = "2px"; - input.style.borderRightColor = "#306eff"; - input.style.borderRightStyle = "solid"; - input.style.borderRightWidth = "2px"; - input.style.borderTopColor = "#306eff"; - input.style.borderTopLeftRadius = "3px"; - input.style.borderTopRightRadius = "3px"; - input.style.borderTopStyle = "solid"; - input.style.borderTopWidth = "2px"; - - //console.log("cell width ="+width) - //changes for prompt - - input.size = "" + width / 8; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - - inputbox.element.disabled = false; - inputbox.element.style.display = "inline"; - SocialCalc.ToggleInputLineButtons(true); - } - if (scc.SCNoQuoteInInputBox && text.substring(0, 1) == "'") { - text = text.substring(1); - } - inputbox.SetText(text); - // autoSave(selectedFile); - }; - - // - // SocialCalc.InputBoxFocus(inputbox) - // - // Call this to have the input box get the focus and respond to keystrokes - // but still pass them off to SocialCalc.ProcessKey. - // - - SocialCalc.InputBoxFocus = function (inputbox) { - if (!inputbox) return; - inputbox.element.focus(); - var editor = inputbox.editor; - editor.state = "input"; - var wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - }; - - // - // SocialCalc.InputBoxOnMouseDown(e) - // - // This is called when the input box gets the focus. It then responds to keystrokes - // and pass them off to SocialCalc.ProcessKey, but in a different editing state. - // - - SocialCalc.InputBoxOnMouseDown = function (e) { - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var wval = editor.workingvalues; - - switch (editor.state) { - case "start": - editor.state = "inputboxdirect"; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.inputEcho.ShowInputEcho(true); - break; - - case "input": - wval.partialexpr = ""; // make sure not pointing - editor.MoveECell(wval.ecoord); - editor.state = "inputboxdirect"; - SocialCalc.KeyboardFocus(); // may have come here from outside of grid - break; - - case "inputboxdirect": - break; - } - }; - - // ************************************* - // - // InputEcho class: - // - // This object creates and controls an element that echos what's in the InputBox during editing - // It is draggable. - // - // ************************************* - - SocialCalc.InputEcho = function (editor) { - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - this.text = ""; // current value of what is displayed - this.interval = null; // timer handle - - this.container = null; // element containing main echo as well as prompt line - this.main = null; // main echo area - this.prompt = null; - - this.functionbox = null; // function chooser dialog - - this.container = document.createElement("div"); - SocialCalc.setStyles( - this.container, - "display:none;position:absolute;zIndex:10;" - ); - - this.topprompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) - this.topprompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) - SocialCalc.setStyles(this.topprompt, scc.defaultInputEchoPromptStyle); - this.topprompt.innerHTML = ""; - - this.container.appendChild(this.topprompt); - - this.main = document.createElement("div"); - - if (scc.defaultInputEchoClass) - this.main.className = scc.defaultInputEchoClass; - if (scc.defaultInputEchoStyle) - SocialCalc.setStyles(this.main, scc.defaultInputEchoStyle); - - this.main.innerHTML = " "; - - this.container.appendChild(this.main); - - this.prompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) - this.prompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) - SocialCalc.setStyles(this.prompt, scc.defaultInputEchoPromptStyle); - this.prompt.innerHTML = ""; - - this.container.appendChild(this.prompt); - - SocialCalc.DragRegister(this.main, true, true, { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: this.container, - }); - - editor.toplevel.appendChild(this.container); - }; - - // Methods: - - SocialCalc.InputEcho.prototype.ShowInputEcho = function (show) { - return SocialCalc.ShowInputEcho(this, show); - }; - SocialCalc.InputEcho.prototype.SetText = function (str) { - return SocialCalc.SetInputEchoText(this, str); - }; - - // Functions: - - SocialCalc.ShowInputEcho = function (inputecho, show) { - var cell, position; - var editor = inputecho.editor; - - if (!editor) return; - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - if (show) { - editor.cellhandles.ShowCellHandles(false); - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - inputecho.container.style.left = position.left - 1 + "px"; - inputecho.container.style.top = position.top - 1 + "px"; - } - inputecho.container.style.display = "block"; - if (inputecho.interval) window.clearInterval(inputecho.interval); // just in case - inputecho.interval = window.setInterval( - SocialCalc.InputEchoHeartbeat, - 50 - ); - } else { - if (inputecho.interval) window.clearInterval(inputecho.interval); - inputecho.container.style.display = "none"; - inputecho.topprompt.innerHTML = ""; - } - }; - - SocialCalc.SetInputEchoText = function (inputecho, str) { - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - var scc = SocialCalc.Constants; - var fname, fstr; - var newstr = SocialCalc.special_chars(str); - newstr = newstr.replace(/\n/g, "
    "); - - if (inputecho.text != newstr) { - inputecho.main.innerHTML = newstr; - inputecho.text = newstr; - } - - var parts = str.match( - /.*[\+\-\*\/\&\^\<\>\=\,\(]([A-Za-z][A-ZA-z]\w*?)\([^\)]*$/ - ); - if (str.charAt(0) == "=" && parts) { - fname = parts[1].toUpperCase(); - if (SocialCalc.Formula.FunctionList[fname]) { - SocialCalc.Formula.FillFunctionInfo(); // make sure filled - fstr = SocialCalc.special_chars( - fname + "(" + SocialCalc.Formula.FunctionArgString(fname) + ")" - ); - } else { - fstr = scc.ietUnknownFunction + fname; - } - if (inputecho.prompt.innerHTML != fstr) { - inputecho.prompt.innerHTML = fstr; - inputecho.prompt.style.display = "block"; - } - } else if (inputecho.prompt.style.display != "none") { - inputecho.prompt.innerHTML = ""; - inputecho.prompt.style.display = "none"; - } - - var editor = inputecho.editor; - - if (editor.workingvalues.currentsheet != editor.workingvalues.startsheet) { - var promptstr = - "Editing:" + - editor.workingvalues.startsheet + - "!" + - editor.workingvalues.ecoord; - if (promptstr != inputecho.topprompt.innerHTML) { - inputecho.topprompt.innerHTML = - "Editing:" + - editor.workingvalues.startsheet + - "!" + - editor.workingvalues.ecoord; - inputecho.topprompt.style.display = "block"; - } - } else { - if (inputecho.topprompt.style.display != "none") { - inputecho.topprompt.innerHTML = ""; - inputecho.topprompt.style.display = "none"; - } - } - }; - - SocialCalc.InputEchoHeartbeat = function () { - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - if (editor.state == "inputboxdirect") { - editor.inputEcho.SetText(editor.inputBox.GetText() + "_"); - } - }; - - SocialCalc.InputEchoMouseDown = function (e) { - var event = e || window.event; - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - // if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - // else event.cancelBubble = true; // IE 5+ - // if (event.preventDefault) event.preventDefault(); // DOM Level 2 - // else event.returnValue = false; // IE 5+ - - editor.inputBox.element.focus(); - - // return false; - }; - - // ************************************* - // - // CellHandles class: - // - // This object creates and controls the elements around the cursor cell for dragging, etc. - // - // ************************************* - - SocialCalc.CellHandles = function (editor) { - var scc = SocialCalc.Constants; - var functions; - - if (editor.noEdit) return; // leave us with nothing - if (scc.SCCellHandlesDisable) return; - - this.editor = editor; // the TableEditor this belongs to - - this.noCursorSuffix = false; - - this.movedmouse = false; // used to detect no-op - - this.draghandle = document.createElement("div"); - SocialCalc.setStyles( - this.draghandle, - "display:none;position:absolute;zIndex:8;border:1px solid white;width:4px;height:4px;fontSize:1px;backgroundColor:#0E93D8;cursor:default;" - ); - this.draghandle.innerHTML = " "; - editor.toplevel.appendChild(this.draghandle); - SocialCalc.AssignID(editor, this.draghandle, "draghandle"); - - var imagetype = "png"; - if (navigator.userAgent.match(/MSIE 6\.0/)) { - imagetype = "gif"; - } - - this.dragpalette = document.createElement("div"); - SocialCalc.setStyles( - this.dragpalette, - "display:none;position:absolute;zIndex:8;width:90px;height:90px;fontSize:1px;textAlign:center;cursor:default;" + - "backgroundImage:url(" + - SocialCalc.Constants.defaultImagePrefix + - "drag-handles." + - imagetype + - ");" - ); - this.dragpalette.innerHTML = " "; - editor.toplevel.appendChild(this.dragpalette); - SocialCalc.AssignID(editor, this.dragpalette, "dragpalette"); - - this.dragtooltip = document.createElement("div"); - SocialCalc.setStyles( - this.dragtooltip, - "display:none;position:absolute;zIndex:9;border:1px solid black;width:100px;height:auto;fontSize:10px;backgroundColor:#FFFFFF;" - ); - this.dragtooltip.innerHTML = " "; - editor.toplevel.appendChild(this.dragtooltip); - SocialCalc.AssignID(editor, this.dragtooltip, "dragtooltip"); - - this.fillinghandle = document.createElement("div"); - SocialCalc.setStyles( - this.fillinghandle, - "display:none;position:absolute;zIndex:9;border:1px solid black;width:auto;height:14px;fontSize:10px;backgroundColor:#FFFFFF;" - ); - this.fillinghandle.innerHTML = " "; - editor.toplevel.appendChild(this.fillinghandle); - SocialCalc.AssignID(editor, this.fillinghandle, "fillinghandle"); - - if (this.draghandle.addEventListener) { - // DOM Level 2 -- Firefox, et al - this.draghandle.addEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMoveOnHandle, - false - ); - this.dragpalette.addEventListener( - "mousedown", - SocialCalc.CellHandlesMouseDown, - false - ); - this.dragpalette.addEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMoveOnHandle, - false - ); - } else if (this.draghandle.attachEvent) { - // IE 5+ - this.draghandle.attachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMoveOnHandle - ); - this.dragpalette.attachEvent( - "onmousedown", - SocialCalc.CellHandlesMouseDown - ); - this.dragpalette.attachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMoveOnHandle - ); - } else { - // don't handle this - throw "Browser not supported"; - } - }; - - // Methods: - - SocialCalc.CellHandles.prototype.ShowCellHandles = function (show, moveshow) { - return SocialCalc.ShowCellHandles(this, show, moveshow); - }; - - // Functions: - - SocialCalc.ShowCellHandles = function (cellhandles, show, moveshow) { - var cell, cell2, position, position2; - var editor = cellhandles.editor; - var doshow = false; - var row, col, viewport; - - if (!editor) return; - - do { - // a block that can you can "break" out of easily - - if (!show) break; - - row = editor.ecell.row; - col = editor.ecell.col; - - if (editor.state != "start") break; - if (row >= editor.lastvisiblerow) break; - if (col >= editor.lastvisiblecol) break; - if (row < editor.firstscrollingrow) break; - if (col < editor.firstscrollingcol) break; - - if ( - editor.rowpositions[row + 1] + 20 > - editor.horizontaltablecontrol.controlborder - ) { - break; - } - if (editor.rowpositions[row + 1] - 10 < editor.headposition.top) { - break; - } - if ( - editor.colpositions[col + 1] + 20 > - editor.verticaltablecontrol.controlborder - ) { - break; - } - if (editor.colpositions[col + 1] - 30 < editor.headposition.left) { - break; - } - - cellhandles.draghandle.style.left = - editor.colpositions[col + 1] - 1 + "px"; - cellhandles.draghandle.style.top = - editor.rowpositions[row + 1] - 1 + "px"; - cellhandles.draghandle.style.display = "block"; - - if (moveshow) { - cellhandles.draghandle.style.display = "none"; - cellhandles.dragpalette.style.left = - editor.colpositions[col + 1] - 45 + "px"; - cellhandles.dragpalette.style.top = - editor.rowpositions[row + 1] - 45 + "px"; - cellhandles.dragpalette.style.display = "block"; - viewport = SocialCalc.GetViewportInfo(); - cellhandles.dragtooltip.style.right = - viewport.width - (editor.colpositions[col + 1] - 1) + "px"; - cellhandles.dragtooltip.style.bottom = - viewport.height - (editor.rowpositions[row + 1] - 1) + "px"; - cellhandles.dragtooltip.style.display = "none"; - } - - doshow = true; - } while (false); // only do once - - if (!doshow) { - cellhandles.draghandle.style.display = "none"; - } - if (!moveshow) { - cellhandles.dragpalette.style.display = "none"; - cellhandles.dragtooltip.style.display = "none"; - } - }; - - SocialCalc.CellHandlesMouseMoveOnHandle = function (e) { - var scc = SocialCalc.Constants; - - var event = e || window.event; - var target = event.target || event.srcElement; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (!cellhandles.editor) return true; // no handles - - if (!editor.cellhandles.mouseDown) { - editor.cellhandles.ShowCellHandles(true, true); // show move handles, too - - if (target == cellhandles.dragpalette) { - var whichhandle = SocialCalc.SegmentDivHit( - [scc.CH_radius1, scc.CH_radius2], - editor.cellhandles.dragpalette, - clientX, - clientY - ); - if (whichhandle == 0) { - // off of active part of palette - SocialCalc.CellHandlesHoverTimeout(); - return; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - cellhandles.tooltipswhichhandle = whichhandle; - cellhandles.tooltipstimer = window.setTimeout( - SocialCalc.CellHandlesTooltipsTimeout, - 700 - ); - } - - if (cellhandles.timer) { - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - cellhandles.timer = window.setTimeout( - SocialCalc.CellHandlesHoverTimeout, - 3000 - ); - } - - return; - }; - - // - // whichsegment = SocialCalc.SegmentDivHit(segtable, divWithMouseHit, x, y) - // - // Takes segtable = [upperleft quadrant, upperright, bottomright, bottomleft] - // where each quadrant is either: - // 0 = ignore hits here - // number = return this value - // array = a new segtable for this subquadrant - // - // Alternatively, segtable can be: - // [radius 1, radius 2] and it returns 0 if no hit, - // -1, -2, -3, -4 for inner quadrants, and +1...+4 for outer quadrants - // - - SocialCalc.SegmentDivHit = function (segtable, divWithMouseHit, x, y) { - var width = divWithMouseHit.offsetWidth; - var height = divWithMouseHit.offsetHeight; - var left = divWithMouseHit.offsetLeft; - var top = divWithMouseHit.offsetTop; - var v = 0; - var table = segtable; - var len = Math.sqrt( - Math.pow(x - left - (width / 2.0 - 0.5), 2) + - Math.pow(y - top - (height / 2.0 - 0.5), 2) - ); - - if (table.length == 2) { - // type 2 segtable - if ( - x >= left && - x < left + width / 2 && - y >= top && - y < top + height / 2 - ) { - // upper left - if (len <= segtable[0]) v = -1; - else if (len <= segtable[1]) v = 1; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top && - y < top + height / 2 - ) { - // upper right - if (len <= segtable[0]) v = -2; - else if (len <= segtable[1]) v = 2; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - if (len <= segtable[0]) v = -3; - else if (len <= segtable[1]) v = 3; - } - if ( - x >= left && - x < left + width / 2 && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - if (len <= segtable[0]) v = -4; - else if (len <= segtable[1]) v = 4; - } - return v; - } - - while (true) { - if ( - x >= left && - x < left + width / 2 && - y >= top && - y < top + height / 2 - ) { - // upper left - quadrant += "1"; - v = table[0]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - height = height / 2; - continue; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top && - y < top + height / 2 - ) { - // upper right - quadrant += "2"; - v = table[1]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - left = left + width; - height = height / 2; - continue; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - quadrant += "3"; - v = table[2]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - left = left + width; - height = height / 2; - top = top + height; - continue; - } - if ( - x >= left && - x < left + width / 2 && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - quadrant += "4"; - v = table[3]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - height = height / 2; - top = top + height; - continue; - } - return 0; // didn't match - } - - //addmsg((x-divWithMouseHit.offsetLeft)+","+(y-divWithMouseHit.offsetTop)+"="+quadrant+" "+v); - return v; - }; - - SocialCalc.CellHandlesHoverTimeout = function () { - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.timer) { - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - editor.cellhandles.ShowCellHandles(true, false); // hide move handles - }; - - SocialCalc.CellHandlesTooltipsTimeout = function () { - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - - var whichhandle = cellhandles.tooltipswhichhandle; - if (whichhandle == 0) { - // off of active part of palette - SocialCalc.CellHandlesHoverTimeout(); - return; - } - if (whichhandle == -3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillAllTooltip; - } else if (whichhandle == 3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillContentsTooltip; - } else if (whichhandle == -2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteAllTooltip; - } else if (whichhandle == -4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertAllTooltip; - } else if (whichhandle == 2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteContentsTooltip; - } else if (whichhandle == 4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertContentsTooltip; - } else { - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - return; - } - - cellhandles.dragtooltip.style.display = "block"; - }; - - SocialCalc.CellHandlesMouseDown = function (e) { - var scc = SocialCalc.Constants; - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (editor.busy) return; // don't do anything when busy (is this correct?) - - var cellhandles = editor.cellhandles; - - cellhandles.movedmouse = false; // detect no-op - - if (cellhandles.timer) { - // cancel timer - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - - range = editor.range; - - var whichhandle = SocialCalc.SegmentDivHit( - [scc.CH_radius1, scc.CH_radius2], - editor.cellhandles.dragpalette, - clientX, - clientY - ); - if (whichhandle == 1 || whichhandle == -1 || whichhandle == 0) { - cellhandles.ShowCellHandles(true, false); // hide move handles - return; - } - - mouseinfo.ignore = true; // stop other code from looking at the mouse - - if (whichhandle == -3) { - cellhandles.dragtype = "Fill"; - // mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } else if (whichhandle == 3) { - cellhandles.dragtype = "FillC"; - // mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } else if (whichhandle == -2) { - cellhandles.dragtype = "Move"; - // mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } else if (whichhandle == -4) { - cellhandles.dragtype = "MoveI"; - // mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } else if (whichhandle == 2) { - cellhandles.dragtype = "MoveC"; - // mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } else if (whichhandle == 4) { - cellhandles.dragtype = "MoveIC"; - // mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } - - cellhandles.filltype = null; - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - break; - - case "Move": - case "MoveI": - case "MoveC": - case "MoveIC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.RangeRemove(); - break; - - default: - return; // not for us - } - - cellhandles.fillinghandle.style.left = clientX + "px"; - cellhandles.fillinghandle.style.top = clientY - 17 + "px"; - cellhandles.fillinghandle.innerHTML = - scc.s_CHindicatorOperationLookup[cellhandles.dragtype] + - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - cellhandles.ShowCellHandles(true, false); // hide move handles - cellhandles.mouseDown = true; - - mouseinfo.editor = editor; // remember for later - - coord = editor.ecell.coord; // start with cell with handles - - cellhandles.startingcoord = coord; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - - mouseinfo.mouselastcoord = coord; - - SocialCalc.KeyboardSetFocus(editor); - - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMove, - true - ); // capture everywhere - document.addEventListener("mouseup", SocialCalc.CellHandlesMouseUp, true); // capture everywhere - } else if (cellhandles.draghandle.attachEvent) { - // IE 5+ - cellhandles.draghandle.setCapture(); - cellhandles.draghandle.attachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMove - ); - cellhandles.draghandle.attachEvent( - "onmouseup", - SocialCalc.CellHandlesMouseUp - ); - cellhandles.draghandle.attachEvent( - "onlosecapture", - SocialCalc.CellHandlesMouseUp - ); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.CellHandlesMouseMove = function (e) { - var scc = SocialCalc.Constants; - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - var crstart, crend, cr, c, r; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat( - editor, - result, - SocialCalc.CellHandlesDragAutoRepeat - ); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - - cellhandles.movedmouse = true; // did move, so not no-op - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (result.coord == cellhandles.startingcoord) { - // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } else { - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Down") { - // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Down"; - } else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Right"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord != mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (result.coord != mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - c = editor.range2.right - editor.range2.left + result.col; - r = editor.range2.bottom - editor.range2.top + result.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (result.coord == cellhandles.startingcoord) { - // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } else { - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Vertical") { - // coerse to that - crend.col = editor.range2.left; - if ( - crend.row >= editor.range2.top && - crend.row <= editor.range2.bottom + 1 - ) - crend.row = editor.range2.bottom + 2; - } else { - crend.row = editor.range2.top; - if ( - crend.col >= editor.range2.left && - crend.col <= editor.range2.right + 1 - ) - crend.col = editor.range2.right + 2; - } - } else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Vertical"; - } else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Horizontal"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord != mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - if (!cellhandles.filltype) { - // no fill type - editor.RangeRemove(); - } else { - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - } - break; - } - - cellhandles.fillinghandle.style.left = clientX + "px"; - cellhandles.fillinghandle.style.top = clientY - 17 + "px"; - cellhandles.fillinghandle.innerHTML = - scc.s_CHindicatorOperationLookup[cellhandles.dragtype] + - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - mouseinfo.mouselastcoord = result.coord; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.CellHandlesDragAutoRepeat = function (coord, direction) { - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - var crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - var crend = SocialCalc.coordToCr(coord); - - var newcoord, c, r; - - var vscroll = 0; - var hscroll = 0; - - if (direction == "left") hscroll = -1; - else if (direction == "right") hscroll = 1; - else if (direction == "up") vscroll = -1; - else if (direction == "down") vscroll = 1; - editor.ScrollRelativeBoth(vscroll, hscroll); - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Down") { - // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord != mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (coord != mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - c = editor.range2.right - editor.range2.left + editor.ecell.col; - r = editor.range2.bottom - editor.range2.top + editor.ecell.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Vertical") { - // coerse to that - crend.col = editor.range2.left; - if ( - crend.row >= editor.range2.top && - crend.row <= editor.range2.bottom + 1 - ) - crend.row = editor.range2.bottom + 2; - } else { - crend.row = editor.range2.top; - if ( - crend.col >= editor.range2.left && - crend.col <= editor.range2.right + 1 - ) - crend.col = editor.range2.right + 2; - } - } else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord != mouseinfo.mouselastcoord) { - editor.MoveECell(newcoord); - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - } - - mouseinfo.mouselastcoord = newcoord; - }; - - SocialCalc.CellHandlesMouseUp = function (e) { - var editor, - element, - result, - coord, - now, - textarea, - sheetobj, - cellobj, - wval, - cstr, - cmdtype, - cmdtype2; - var crstart, crend; - var sizec, sizer, deltac, deltar; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - mouseinfo.ignore = false; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - cellhandles.mouseDown = false; - cellhandles.noCursorSuffix = false; - - cellhandles.fillinghandle.style.display = "none"; - - if (!result) result = {}; - if (!result.coord) result.coord = editor.ecell.coord; - - switch (cellhandles.dragtype) { - case "Fill": - case "Move": - case "MoveI": - cmdtype2 = " all"; - break; - case "FillC": - case "MoveC": - case "MoveIC": - cmdtype2 = " formulas"; - break; - } - - if (!cellhandles.movedmouse) { - // didn't move: just leave one cell selected - cellhandles.dragtype = "Nothing"; - } - - switch (cellhandles.dragtype) { - case "Nothing": - editor.Range2Remove(); - editor.RangeRemove(); - break; - - case "Fill": - case "FillC": - crstart = SocialCalc.coordToCr(cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - if (cellhandles.filltype) { - if (cellhandles.filltype == "Down") { - crend.col = crstart.col; - } else { - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - - editor.MoveECell(result.coord); - editor.RangeExtend(); - - if (editor.cellhandles.filltype == "Right") { - cmdtype = "right"; - } else { - cmdtype = "down"; - } - cstr = - "fill" + - cmdtype + - " " + - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom) + - cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - break; - - case "Move": - case "MoveC": - editor.context.cursorsuffix = ""; - cstr = - "movepaste " + - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + - ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) + - " " + - editor.ecell.coord + - cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - - break; - - case "MoveI": - case "MoveIC": - editor.context.cursorsuffix = ""; - sizec = editor.range2.right - editor.range2.left; - sizer = editor.range2.bottom - editor.range2.top; - deltac = editor.ecell.col - editor.range2.left; - deltar = editor.ecell.row - editor.range2.top; - cstr = - "moveinsert " + - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + - ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) + - " " + - editor.ecell.coord + - cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - editor.RangeRemove(); - if (editor.cellhandles.filltype == " Horizontal" && deltac > 0) { - editor.MoveECell( - SocialCalc.crToCoord(editor.ecell.col - sizec - 1, editor.ecell.row) - ); - } else if (editor.cellhandles.filltype == " Vertical" && deltar > 0) { - editor.MoveECell( - SocialCalc.crToCoord(editor.ecell.col, editor.ecell.row - sizer - 1) - ); - } - editor.RangeAnchor( - SocialCalc.crToCoord( - editor.ecell.col + sizec, - editor.ecell.row + sizer - ) - ); - editor.RangeExtend(); - - break; - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMove, - true - ); - document.removeEventListener( - "mouseup", - SocialCalc.CellHandlesMouseUp, - true - ); - } else if (cellhandles.draghandle.detachEvent) { - // IE - cellhandles.draghandle.detachEvent( - "onlosecapture", - SocialCalc.CellHandlesMouseUp - ); - cellhandles.draghandle.detachEvent( - "onmouseup", - SocialCalc.CellHandlesMouseUp - ); - cellhandles.draghandle.detachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMove - ); - cellhandles.draghandle.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - }; - - // ************************************* - // - // TableControl class: - // - // This class deals with the horizontal and verical scrollbars and pane sliders. - // - // +--------------+ - // | Endcap | - // +- - - - - - - + - // | | - // +--------------+ - // | Pane Slider | - // +--------------+ - // | | - // | Less Button | - // | | - // +--------------+ - // | Scroll Area | - // | | - // | | - // +--------------+ - // | Thumb | - // +--------------+ - // | | - // +--------------+ - // | | - // | More Button | - // | | - // +--------------+ - // - // ************************************* - - SocialCalc.TableControl = function (editor, vertical, size) { - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - - this.vertical = vertical; // true if vertical control, false if horizontal - this.size = size; // length in pixels - - this.main = null; // main element containing all the others - this.endcap = null; // the area at the top/left between the end and the pane slider - this.paneslider = null; // the slider to adjust the pane split - this.lessbutton = null; // the top/left scroll button - this.morebutton = null; // the bottom/right scroll button - this.scrollarea = null; // the area between the scroll buttons - this.thumb = null; // the sliding thing in the scrollarea - - // computed position values: - - this.controlborder = null; // left or top screen position for vertical or horizontal control - this.endcapstart = null; // top or left screen position for vertical or horizontal control - this.panesliderstart = null; - this.lessbuttonstart = null; - this.morebuttonstart = null; - this.scrollareastart = null; - this.scrollareaend = null; - this.scrollareasize = null; - this.thumbpos = null; - - // constants: - - this.controlthickness = scc.defaultTableControlThickness; // other dimension of complete control in pixels - this.sliderthickness = scc.defaultTCSliderThickness; - this.buttonthickness = scc.defaultTCButtonThickness; - this.thumbthickness = scc.defaultTCThumbThickness; - this.minscrollingpanesize = - this.buttonthickness + this.buttonthickness + this.thumbthickness + 20; // the 20 is to leave a little space - }; - - // Methods: - - SocialCalc.TableControl.prototype.CreateTableControl = function () { - return SocialCalc.CreateTableControl(this); - }; - SocialCalc.TableControl.prototype.PositionTableControlElements = function () { - SocialCalc.PositionTableControlElements(this); - }; - SocialCalc.TableControl.prototype.ComputeTableControlPositions = function () { - SocialCalc.ComputeTableControlPositions(this); - }; - - // Functions: - - SocialCalc.CreateTableControl = function (control) { - var s, functions, params; - var AssignID = SocialCalc.AssignID; - var setStyles = SocialCalc.setStyles; - var scc = SocialCalc.Constants; - var TooltipRegister = function (element, etype, vh) { - if (scc["s_" + etype + "Tooltip" + vh]) { - SocialCalc.TooltipRegister( - element, - scc["s_" + etype + "Tooltip" + vh], - null - ); - } - }; - - var imageprefix = control.editor.imageprefix; - var vh = control.vertical ? "v" : "h"; - - control.main = document.createElement("div"); - s = control.main.style; - s.height = - (control.vertical ? control.size : control.controlthickness) + "px"; - s.width = - (control.vertical ? control.controlthickness : control.size) + "px"; - s.zIndex = 0; - setStyles(control.main, scc.TCmainStyle); - s.backgroundImage = "url(" + imageprefix + "main-" + vh + ".gif)"; - if (scc.TCmainClass) control.main.className = scc.TCmainClass; - - control.main.style.display = "none"; // wait for layout - - control.endcap = document.createElement("div"); - s = control.endcap.style; - s.height = control.controlthickness + "px"; - s.width = control.controlthickness + "px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.endcap, scc.TCendcapStyle); - s.backgroundImage = "url(" + imageprefix + "endcap-" + vh + ".gif)"; - if (scc.TCendcapClass) control.endcap.className = scc.TCendcapClass; - AssignID(control.editor, control.endcap, "endcap" + vh); - - control.main.appendChild(control.endcap); - - control.paneslider = document.createElement("div"); - s = control.paneslider.style; - s.height = - (control.vertical ? control.sliderthickness : control.controlthickness) + - "px"; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.width = - (control.vertical ? control.controlthickness : control.sliderthickness) + - "px"; - s.position = "absolute"; - s[control.vertical ? "top" : "left"] = "4px"; - s.zIndex = 3; - setStyles(control.paneslider, scc.TCpanesliderStyle); - s.backgroundImage = "url(" + imageprefix + "paneslider-" + vh + ".gif)"; - if (scc.TCpanesliderClass) - control.paneslider.className = scc.TCpanesliderClass; - AssignID(control.editor, control.paneslider, "paneslider" + vh); - TooltipRegister(control.paneslider, "paneslider", vh); - - functions = { - MouseDown: SocialCalc.TCPSDragFunctionStart, - MouseMove: SocialCalc.TCPSDragFunctionMove, - MouseUp: SocialCalc.TCPSDragFunctionStop, - Disabled: function () { - return control.editor.busy; - }, - }; - - functions.control = control; // make sure this is there - - SocialCalc.DragRegister( - control.paneslider, - control.vertical, - !control.vertical, - functions - ); - - control.main.appendChild(control.paneslider); - - control.lessbutton = document.createElement("div"); - s = control.lessbutton.style; - s.height = - (control.vertical ? control.buttonthickness : control.controlthickness) + - "px"; - s.width = - (control.vertical ? control.controlthickness : control.buttonthickness) + - "px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.lessbutton, scc.TClessbuttonStyle); - s.backgroundImage = "url(" + imageprefix + "less-" + vh + "n.gif)"; - if (scc.TClessbuttonClass) - control.lessbutton.className = scc.TClessbuttonClass; - AssignID(control.editor, control.lessbutton, "lessbutton" + vh); - - params = { - repeatwait: scc.TClessbuttonRepeatWait, - repeatinterval: scc.TClessbuttonRepeatInterval, - normalstyle: - "backgroundImage:url(" + imageprefix + "less-" + vh + "n.gif);", - downstyle: - "backgroundImage:url(" + imageprefix + "less-" + vh + "d.gif);", - hoverstyle: - "backgroundImage:url(" + imageprefix + "less-" + vh + "h.gif);", - }; - functions = { - MouseDown: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, -1); - }, - Repeat: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, -1); - }, - Disabled: function () { - return control.editor.busy; - }, - }; - - SocialCalc.ButtonRegister(control.lessbutton, params, functions); - - control.main.appendChild(control.lessbutton); - - control.morebutton = document.createElement("div"); - s = control.morebutton.style; - s.height = - (control.vertical ? control.buttonthickness : control.controlthickness) + - "px"; - s.width = - (control.vertical ? control.controlthickness : control.buttonthickness) + - "px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.morebutton, scc.TCmorebuttonStyle); - s.backgroundImage = "url(" + imageprefix + "more-" + vh + "n.gif)"; - if (scc.TCmorebuttonClass) - control.morebutton.className = scc.TCmorebuttonClass; - AssignID(control.editor, control.morebutton, "morebutton" + vh); - - params = { - repeatwait: scc.TCmorebuttonRepeatWait, - repeatinterval: scc.TCmorebuttonRepeatInterval, - normalstyle: - "backgroundImage:url(" + imageprefix + "more-" + vh + "n.gif);", - downstyle: - "backgroundImage:url(" + imageprefix + "more-" + vh + "d.gif);", - hoverstyle: - "backgroundImage:url(" + imageprefix + "more-" + vh + "h.gif);", - }; - functions = { - MouseDown: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, +1); - }, - Repeat: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, +1); - }, - Disabled: function () { - return control.editor.busy; - }, - }; - - SocialCalc.ButtonRegister(control.morebutton, params, functions); - - control.main.appendChild(control.morebutton); - - control.scrollarea = document.createElement("div"); - s = control.scrollarea.style; - s.height = control.controlthickness + "px"; - s.width = control.controlthickness + "px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.scrollarea, scc.TCscrollareaStyle); - s.backgroundImage = "url(" + imageprefix + "scrollarea-" + vh + ".gif)"; - if (scc.TCscrollareaClass) - control.scrollarea.className = scc.TCscrollareaClass; - AssignID(control.editor, control.scrollarea, "scrollarea" + vh); - - params = { - repeatwait: scc.TCscrollareaRepeatWait, - repeatinterval: scc.TCscrollareaRepeatWait, - }; - functions = { - MouseDown: SocialCalc.ScrollAreaClick, - Repeat: SocialCalc.ScrollAreaClick, - Disabled: function () { - return control.editor.busy; - }, - }; - functions.control = control; - - SocialCalc.ButtonRegister(control.scrollarea, params, functions); - - control.main.appendChild(control.scrollarea); - - control.thumb = document.createElement("div"); - s = control.thumb.style; - s.height = - (control.vertical ? control.thumbthickness : control.controlthickness) + - "px"; - s.width = - (control.vertical ? control.controlthickness : control.thumbthickness) + - "px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.thumb, scc.TCthumbStyle); - control.thumb.style.backgroundImage = - "url(" + imageprefix + "thumb-" + vh + "n.gif)"; - if (scc.TCthumbClass) control.thumb.className = scc.TCthumbClass; - AssignID(control.editor, control.thumb, "thumb" + vh); - - functions = { - MouseDown: SocialCalc.TCTDragFunctionStart, - MouseMove: SocialCalc.TCTDragFunctionMove, - MouseUp: SocialCalc.TCTDragFunctionStop, - Disabled: function () { - return control.editor.busy; - }, - }; - functions.control = control; // make sure this is there - SocialCalc.DragRegister( - control.thumb, - control.vertical, - !control.vertical, - functions - ); - - params = { - normalstyle: - "backgroundImage:url(" + imageprefix + "thumb-" + vh + "n.gif)", - name: "Thumb", - downstyle: - "backgroundImage:url(" + imageprefix + "thumb-" + vh + "d.gif)", - hoverstyle: - "backgroundImage:url(" + imageprefix + "thumb-" + vh + "h.gif)", - }; - SocialCalc.ButtonRegister(control.thumb, params, null); // give it button-like visual behavior - - control.main.appendChild(control.thumb); - - return control.main; - }; - - // - // ScrollAreaClick - Button function to process pageup/down clicks - // - - SocialCalc.ScrollAreaClick = function (e, buttoninfo, bobj) { - var control = bobj.functionobj.control; - var bposition = SocialCalc.GetElementPosition(bobj.element); - var clickpos = control.vertical ? buttoninfo.clientY : buttoninfo.clientX; - if (control.editor.busy) { - // ignore if busy - wait for next repeat - return; - } - control.editor.PageRelative( - control.vertical, - clickpos > control.thumbpos ? 1 : -1 - ); - - return; - }; - - // - // PositionTableControlElements - // - - SocialCalc.PositionTableControlElements = function (control) { - var border, realend, thumbpos; - - var editor = control.editor; - - if (control.vertical) { - border = control.controlborder + "px"; - control.endcap.style.top = control.endcapstart + "px"; - control.endcap.style.left = border; - control.paneslider.style.top = control.panesliderstart + "px"; - control.paneslider.style.left = border; - control.lessbutton.style.top = control.lessbuttonstart + "px"; - control.lessbutton.style.left = border; - control.morebutton.style.top = control.morebuttonstart + "px"; - control.morebutton.style.left = border; - control.scrollarea.style.top = control.scrollareastart + "px"; - control.scrollarea.style.left = border; - control.scrollarea.style.height = control.scrollareasize + "px"; - realend = Math.max( - editor.context.sheetobj.attribs.lastrow, - editor.firstscrollingrow + 1 - ); - thumbpos = - ((editor.firstscrollingrow - (editor.lastnonscrollingrow + 1)) * - (control.scrollareasize - 3 * control.thumbthickness)) / - (realend - (editor.lastnonscrollingrow + 1)) + - control.scrollareastart - - 1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.top = thumbpos + "px"; - control.thumb.style.left = border; - } else { - border = control.controlborder + "px"; - control.endcap.style.left = control.endcapstart + "px"; - control.endcap.style.top = border; - control.paneslider.style.left = control.panesliderstart + "px"; - control.paneslider.style.top = border; - control.lessbutton.style.left = control.lessbuttonstart + "px"; - control.lessbutton.style.top = border; - control.morebutton.style.left = control.morebuttonstart + "px"; - control.morebutton.style.top = border; - control.scrollarea.style.left = control.scrollareastart + "px"; - control.scrollarea.style.top = border; - control.scrollarea.style.width = control.scrollareasize + "px"; - realend = Math.max( - editor.context.sheetobj.attribs.lastcol, - editor.firstscrollingcol + 1 - ); - thumbpos = - ((editor.firstscrollingcol - (editor.lastnonscrollingcol + 1)) * - (control.scrollareasize - control.thumbthickness)) / - (realend - editor.lastnonscrollingcol) + - control.scrollareastart - - 1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.left = thumbpos + "px"; - control.thumb.style.top = border; - } - control.thumbpos = thumbpos; - control.main.style.display = "block"; - }; - - // - // ComputeTableControlPositions - // - // This routine computes the screen positions and other values needed for laying out - // the table control elements. - // - - SocialCalc.ComputeTableControlPositions = function (control) { - var editor = control.editor; - - if (!editor.gridposition || !editor.headposition) - throw "Can't compute table control positions before editor positions"; - - if (control.vertical) { - control.controlborder = editor.gridposition.left + editor.tablewidth; // border=left position - control.endcapstart = editor.gridposition.top; // start=top position - control.panesliderstart = - editor.firstscrollingrowtop - control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingrowtop - 1; - control.morebuttonstart = - editor.gridposition.top + editor.tableheight - control.buttonthickness; - control.scrollareastart = - editor.firstscrollingrowtop - 1 + control.buttonthickness; - control.scrollareaend = control.morebuttonstart - 1; - control.scrollareasize = - control.scrollareaend - control.scrollareastart + 1; - } else { - control.controlborder = editor.gridposition.top + editor.tableheight; // border=top position - control.endcapstart = editor.gridposition.left; // start=left position - control.panesliderstart = - editor.firstscrollingcolleft - control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingcolleft - 1; - control.morebuttonstart = - editor.gridposition.left + editor.tablewidth - control.buttonthickness; - control.scrollareastart = - editor.firstscrollingcolleft - 1 + control.buttonthickness; - control.scrollareaend = control.morebuttonstart - 1; - control.scrollareasize = - control.scrollareaend - control.scrollareastart + 1; - } - }; - - ////// TCPS - TableControl Pan Slider methods - - // - // TCPSDragFunctionStart(event, draginfo, dobj) - // - // TableControlPaneSlider function for starting drag - // - - SocialCalc.TCPSDragFunctionStart = function (event, draginfo, dobj) { - var editor = dobj.functionobj.control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - draginfo.trackingline = document.createElement("div"); - draginfo.trackingline.style.height = dobj.vertical - ? scc.TCPStrackinglineThickness - : editor.tableheight - - (editor.headposition.top - editor.gridposition.top) + - "px"; - draginfo.trackingline.style.width = dobj.vertical - ? editor.tablewidth - - (editor.headposition.left - editor.gridposition.left) + - "px" - : scc.TCPStrackinglineThickness; - draginfo.trackingline.style.backgroundImage = - "url(" + - editor.imageprefix + - "trackingline-" + - (dobj.vertical ? "v" : "h") + - ".gif)"; - if (scc.TCPStrackinglineClass) - draginfo.trackingline.className = scc.TCPStrackinglineClass; - SocialCalc.setStyles(draginfo.trackingline, scc.TCPStrackinglineStyle); - - if (dobj.vertical) { - row = SocialCalc.Lookup( - draginfo.clientY + dobj.functionobj.control.sliderthickness, - editor.rowpositions - ); - draginfo.trackingline.style.top = - (editor.rowpositions[row] || editor.headposition.top) + "px"; - draginfo.trackingline.style.left = editor.headposition.left + "px"; - if (editor.context.rowpanes.length - 1) { - // has 2 already - editor.context.SetRowPaneFirstLast( - 1, - editor.context.rowpanes[0].last + 1, - editor.context.rowpanes[0].last + 1 - ); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } else { - col = SocialCalc.Lookup( - draginfo.clientX + dobj.functionobj.control.sliderthickness, - editor.colpositions - ); - draginfo.trackingline.style.top = editor.headposition.top + "px"; - draginfo.trackingline.style.left = - (editor.colpositions[col] || editor.headposition.left) + "px"; - if (editor.context.colpanes.length - 1) { - // has 2 already - editor.context.SetColPaneFirstLast( - 1, - editor.context.colpanes[0].last + 1, - editor.context.colpanes[0].last + 1 - ); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } - - editor.griddiv.appendChild(draginfo.trackingline); - }; - - // - // TCPSDragFunctionMove(event, draginfo, dobj) - // - - SocialCalc.TCPSDragFunctionMove = function (event, draginfo, dobj) { - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup( - draginfo.clientY + sliderthickness, - editor.rowpositions - ); - draginfo.trackingline.style.top = - (editor.rowpositions[row] || editor.headposition.top) + "px"; - } else { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup( - draginfo.clientX + sliderthickness, - editor.colpositions - ); - draginfo.trackingline.style.left = - (editor.colpositions[col] || editor.headposition.left) + "px"; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - }; - - // - // TCPSDragFunctionStop(event, draginfo, dobj) - // - - SocialCalc.TCPSDragFunctionStop = function (event, draginfo, dobj) { - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup( - draginfo.clientY + sliderthickness, - editor.rowpositions - ); - if (row > editor.context.sheetobj.attribs.lastrow) - row = editor.context.sheetobj.attribs.lastrow; // can't extend sheet here - if (!row || row <= editor.context.rowpanes[0].first) { - // set to no panes, leaving first pane settings - if (editor.context.rowpanes.length > 1) - editor.context.rowpanes.length = 1; - } else if (editor.context.rowpanes.length - 1) { - // has 2 already - if (!editor.timeout) { - // not waiting for position calc (so positions could be wrong) - editor.context.SetRowPaneFirstLast( - 0, - editor.context.rowpanes[0].first, - row - 1 - ); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } else { - editor.context.SetRowPaneFirstLast( - 0, - editor.context.rowpanes[0].first, - row - 1 - ); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } else { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup( - draginfo.clientX + sliderthickness, - editor.colpositions - ); - if (col > editor.context.sheetobj.attribs.lastcol) - col = editor.context.sheetobj.attribs.lastcol; // can't extend sheet here - if (!col || col <= editor.context.colpanes[0].first) { - // set to no panes, leaving first pane settings - if (editor.context.colpanes.length > 1) - editor.context.colpanes.length = 1; - } else if (editor.context.colpanes.length - 1) { - // has 2 already - if (!editor.timeout) { - // not waiting for position calc (so positions could be wrong) - editor.context.SetColPaneFirstLast( - 0, - editor.context.colpanes[0].first, - col - 1 - ); - editor.context.SetColPaneFirstLast(1, col, col); - } - } else { - editor.context.SetColPaneFirstLast( - 0, - editor.context.colpanes[0].first, - col - 1 - ); - editor.context.SetColPaneFirstLast(1, col, col); - } - } - - editor.FitToEditTable(); - - editor.griddiv.removeChild(draginfo.trackingline); - - editor.ScheduleRender(); - }; - - ////// TCT - TableControl Thumb methods - - //!!!! Note: Need to make start use same code as move/stop for determining row/col, since stop will set that - //!!!! Note: Need to make start/move/stop use positioning code that corresponds closer to - //!!!! ComputeTableControlPositions calculations. - - // - // TCTDragFunctionStart(event, draginfo, dobj) - // - // TableControlThumb function for starting drag - // - - SocialCalc.TCTDragFunctionStart = function (event, draginfo, dobj) { - var rowpane, colpane, row, col; - - var control = dobj.functionobj.control; - var editor = control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - if (draginfo.thumbstatus) { - // get rid of old one if mouseup was out of window - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) - draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - } - - draginfo.thumbstatus = document.createElement("div"); - - if (dobj.vertical) { - if (scc.TCTDFSthumbstatusvClass) - draginfo.thumbstatus.className = scc.TCTDFSthumbstatusvClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatusvStyle); - draginfo.thumbstatus.style.top = - draginfo.clientY + scc.TCTDFStopOffsetv + "px"; - draginfo.thumbstatus.style.left = - control.controlborder - 10 - editor.tablewidth / 2 + "px"; - draginfo.thumbstatus.style.width = editor.tablewidth / 2 + "px"; - - draginfo.thumbcontext = new SocialCalc.RenderContext( - editor.context.sheetobj - ); - draginfo.thumbcontext.showGrid = true; - draginfo.thumbcontext.rowpanes = [{ first: 1, last: 1 }]; - var pane = editor.context.colpanes[editor.context.colpanes.length - 1]; - draginfo.thumbcontext.colpanes = [{ first: pane.first, last: pane.last }]; - draginfo.thumbstatus.innerHTML = - '
    msg
    preview
    '; - draginfo.thumbstatus.rowmsgele = - draginfo.thumbstatus.firstChild.firstChild.firstChild.firstChild.firstChild; - draginfo.thumbstatus.rowpreviewele = - draginfo.thumbstatus.firstChild.firstChild.firstChild.childNodes[1].firstChild; - editor.toplevel.appendChild(draginfo.thumbstatus); - SocialCalc.TCTDragFunctionRowSetStatus( - draginfo, - editor, - editor.firstscrollingrow || 1 - ); - } else { - if (scc.TCTDFSthumbstatushClass) - draginfo.thumbstatus.className = scc.TCTDFSthumbstatushClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatushStyle); - draginfo.thumbstatus.style.top = - control.controlborder + scc.TCTDFStopOffseth + "px"; - draginfo.thumbstatus.style.left = - draginfo.clientX + scc.TCTDFSleftOffseth + "px"; - editor.toplevel.appendChild(draginfo.thumbstatus); - draginfo.thumbstatus.innerHTML = - scc.s_TCTDFthumbstatusPrefixh + - SocialCalc.rcColname(editor.firstscrollingcol); - } - }; - - // - // SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, row) - // - // Render partial row - // - - SocialCalc.TCTDragFunctionRowSetStatus = function (draginfo, editor, row) { - var scc = SocialCalc.Constants; - var msg = scc.s_TCTDFthumbstatusPrefixv + row + " "; - - draginfo.thumbstatus.rowmsgele.innerHTML = msg; - - draginfo.thumbcontext.rowpanes = [{ first: row, last: row }]; - draginfo.thumbrowshown = row; - - var ele = draginfo.thumbcontext.RenderSheet( - draginfo.thumbstatus.rowpreviewele.firstChild, - { type: "html" } - ); - }; - - // - // TCTDragFunctionMove(event, draginfo, dobj) - // - - SocialCalc.TCTDragFunctionMove = function (event, draginfo, dobj) { - var first, msg; - var control = dobj.functionobj.control; - var thumbthickness = control.thumbthickness; - var editor = control.editor; - var scc = SocialCalc.Constants; - - if (dobj.vertical) { - if ( - draginfo.clientY > - control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2 - ) - draginfo.clientY = - control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2; - if (draginfo.clientY < control.scrollareastart - draginfo.offsetY - 1) - draginfo.clientY = control.scrollareastart - draginfo.offsetY - 1; - draginfo.thumbstatus.style.top = draginfo.clientY + "px"; - - first = - ((draginfo.clientY + draginfo.offsetY - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastrow - - editor.lastnonscrollingrow) + - editor.lastnonscrollingrow + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) - first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) - first = editor.context.sheetobj.attribs.lastrow; - // msg = scc.s_TCTDFthumbstatusPrefixv+first; - if (first != draginfo.thumbrowshown) { - SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, first); - } - } else { - if ( - draginfo.clientX > - control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2 - ) - draginfo.clientX = - control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2; - if (draginfo.clientX < control.scrollareastart - draginfo.offsetX - 1) - draginfo.clientX = control.scrollareastart - draginfo.offsetX - 1; - draginfo.thumbstatus.style.left = draginfo.clientX + "px"; - - first = - ((draginfo.clientX + draginfo.offsetX - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastcol - - editor.lastnonscrollingcol) + - editor.lastnonscrollingcol + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) - first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) - first = editor.context.sheetobj.attribs.lastcol; - msg = scc.s_TCTDFthumbstatusPrefixh + SocialCalc.rcColname(first); - draginfo.thumbstatus.innerHTML = msg; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - }; - - // - // TCTDragFunctionStop(event, draginfo, dobj) - // - - SocialCalc.TCTDragFunctionStop = function (event, draginfo, dobj) { - var first; - var control = dobj.functionobj.control; - var editor = control.editor; - - if (dobj.vertical) { - first = - ((draginfo.clientY + draginfo.offsetY - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastrow - - editor.lastnonscrollingrow) + - editor.lastnonscrollingrow + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) - first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) - first = editor.context.sheetobj.attribs.lastrow; - - editor.context.SetRowPaneFirstLast( - editor.context.rowpanes.length - 1, - first, - first + 1 - ); - } else { - first = - ((draginfo.clientX + draginfo.offsetX - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastcol - - editor.lastnonscrollingcol) + - editor.lastnonscrollingcol + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) - first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) - first = editor.context.sheetobj.attribs.lastcol; - - editor.context.SetColPaneFirstLast( - editor.context.colpanes.length - 1, - first, - first + 1 - ); - } - - editor.FitToEditTable(); - - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) - draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - - editor.ScheduleRender(); - }; - - // ************************************* - // - // Dragging functions: - // - // ************************************* - - SocialCalc.DragInfo = { - // There is only one of these -- no "new" is done. - // Only one dragging operation can be active at a time. - // The registeredElements array is used to decide which item to drag. - - // One item for each draggable thing, each an object with: - // .element, .vertical, .horizontal, .functionobj - - registeredElements: [], - - // Items used during a drag - - draggingElement: null, // item being processed (.element is the actual element) - startX: 0, - startY: 0, - startZ: 0, - clientX: 0, // modifyable version to restrict movement - clientY: 0, - offsetX: 0, - offsetY: 0, - horizontalScroll: 0, // retrieved at drag start - verticalScroll: 0, - }; - - // - // DragRegister(element, vertical, horizontal, functionobj) - make element draggable - // - // The functionobj defaults to moving the element contrained only by vertical and horizontal settings. - // - - SocialCalc.DragRegister = function ( - element, - vertical, - horizontal, - functionobj - ) { - var draginfo = SocialCalc.DragInfo; - - if (!functionobj) { - functionobj = { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - }; - } - - draginfo.registeredElements.push({ - element: element, - vertical: vertical, - horizontal: horizontal, - functionobj: functionobj, - }); - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.DragMouseDown, false); - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousedown", SocialCalc.DragMouseDown); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - }; - - // - // DragUnregister(element) - remove object from list - // - - SocialCalc.DragUnregister = function (element) { - var draginfo = SocialCalc.DragInfo; - - var i; - - if (!element) return; - - for (i = 0; i < draginfo.registeredElements.length; i++) { - if (draginfo.registeredElements[i].element == element) { - draginfo.registeredElements.splice(i, 1); - if (element.removeEventListener) { - // DOM Level 2 -- Firefox, et al - element.removeEventListener( - "mousedown", - SocialCalc.DragMouseDown, - false - ); - } else { - // IE 5+ - element.detachEvent("onmousedown", SocialCalc.DragMouseDown); - } - return; - } - } - - return; // ignore if not in list - }; - - // - // DragMouseDown(event) - // - - SocialCalc.DragMouseDown = function (event) { - var e = event || window.event; - - var draginfo = SocialCalc.DragInfo; - - var dobj = SocialCalc.LookupElement( - e.target || e.srcElement, - draginfo.registeredElements - ); - if (!dobj) return; - - if (dobj && dobj.functionobj && dobj.functionobj.Disabled) { - if (dobj.functionobj.Disabled(e, draginfo, dobj)) { - return; - } - } - - draginfo.draggingElement = dobj; - - var viewportinfo = SocialCalc.GetViewportInfo(); - draginfo.horizontalScroll = viewportinfo.horizontalScroll; - draginfo.verticalScroll = viewportinfo.verticalScroll; - - draginfo.clientX = e.clientX + draginfo.horizontalScroll; // get document-relative coordinates - draginfo.clientY = e.clientY + draginfo.verticalScroll; - draginfo.startX = draginfo.clientX; - draginfo.startY = draginfo.clientY; - draginfo.startZ = dobj.element.style.zIndex; - draginfo.offsetX = 0; - draginfo.offsetY = 0; - - dobj.element.style.zIndex = "100"; - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener("mousemove", SocialCalc.DragMouseMove, true); // capture everywhere - document.addEventListener("mouseup", SocialCalc.DragMouseUp, true); - } else if (dobj.element.attachEvent) { - // IE 5+ - dobj.element.setCapture(); - dobj.element.attachEvent("onmousemove", SocialCalc.DragMouseMove); - dobj.element.attachEvent("onmouseup", SocialCalc.DragMouseUp); - dobj.element.attachEvent("onlosecapture", SocialCalc.DragMouseUp); - } - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - if (dobj && dobj.functionobj && dobj.functionobj.MouseDown) - dobj.functionobj.MouseDown(e, draginfo, dobj); - - return false; - }; - - // - // DragMouseMove(event) - // - - SocialCalc.DragMouseMove = function (event) { - var e = event || window.event; - - var draginfo = SocialCalc.DragInfo; - draginfo.clientX = e.clientX + draginfo.horizontalScroll; - draginfo.clientY = e.clientY + draginfo.verticalScroll; - - var dobj = draginfo.draggingElement; - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - - if (dobj && dobj.functionobj && dobj.functionobj.MouseMove) - dobj.functionobj.MouseMove(e, draginfo, dobj); - - return false; - }; - - // - // DragMouseUp(event) - // - - SocialCalc.DragMouseUp = function (event) { - var e = event || window.event; - - var draginfo = SocialCalc.DragInfo; - draginfo.clientX = e.clientX + draginfo.horizontalScroll; - draginfo.clientY = e.clientY + draginfo.verticalScroll; - - var dobj = draginfo.draggingElement; - - dobj.element.style.zIndex = draginfo.startZ; - - if (dobj && dobj.functionobj && dobj.functionobj.MouseUp) - dobj.functionobj.MouseUp(e, draginfo, dobj); - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.DragMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.DragMouseUp, true); - // Note: In old (1.5?) versions of Firefox, this causes the browser to skip the MouseUp for - // the button code. https://bugzilla.mozilla.org/show_bug.cgi?id=174320 - // Firefox 1.5 is <1% share (http://marketshare.hitslink.com/report.aspx?qprid=7) - } else if (dobj.element.detachEvent) { - // IE - dobj.element.detachEvent("onlosecapture", SocialCalc.DragMouseUp); - dobj.element.detachEvent("onmouseup", SocialCalc.DragMouseUp); - dobj.element.detachEvent("onmousemove", SocialCalc.DragMouseMove); - dobj.element.releaseCapture(); - } - - draginfo.draggingElement = null; - - return false; - }; - - // - // DragFunctionStart(event, draginfo, dobj) - // - - SocialCalc.DragFunctionStart = function (event, draginfo, dobj) { - var val; - var element = dobj.functionobj.positionobj || dobj.element; - - val = element.style.top.match(/\d*/); - draginfo.offsetY = (val ? val[0] - 0 : 0) - draginfo.clientY; - val = element.style.left.match(/\d*/); - draginfo.offsetX = (val ? val[0] - 0 : 0) - draginfo.clientX; - }; - - // - // DragFunctionPosition(event, draginfo, dobj) - // - - SocialCalc.DragFunctionPosition = function (event, draginfo, dobj) { - var element = dobj.functionobj.positionobj || dobj.element; - - if (dobj.vertical) - element.style.top = draginfo.clientY + draginfo.offsetY + "px"; - if (dobj.horizontal) - element.style.left = draginfo.clientX + draginfo.offsetX + "px"; - }; - - // ************************************* - // - // Tooltip functions: - // - // ************************************* - - SocialCalc.TooltipInfo = { - // There is only one of these -- no "new" is done. - // Only one tooltip operation can be active at a time. - // The registeredElements array is used to identify items. - - // One item for each element with a tooltip, each an object with: - // .element, .tiptext, .functionobj - // Currently .functionobj can only contain .offsetx and .offsety. - // If present they are used instead of the default ones. - - registeredElements: [], - - registered: false, // if true, an event handler has been registered for this functionality - - // Items used during hover over an element - - tooltipElement: null, // item being processed (.element is the actual element) - timer: null, // timer object waiting to see if holding over element - popupElement: null, // tooltip element being displayed - clientX: 0, // modifyable version to restrict movement - clientY: 0, - offsetX: SocialCalc.Constants.TooltipOffsetX, // modifyable version to allow positioning - offsetY: SocialCalc.Constants.TooltipOffsetY, - }; - - // - // TooltipRegister(element, tiptext, functionobj) - make element have a tooltip - // - - SocialCalc.TooltipRegister = function (element, tiptext, functionobj) { - var tooltipinfo = SocialCalc.TooltipInfo; - tooltipinfo.registeredElements.push({ - element: element, - tiptext: tiptext, - functionobj: functionobj, - }); - - if (tooltipinfo.registered) return; // only need to add event listener once - - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.TooltipMouseMove, - false - ); - } else if (document.attachEvent) { - // IE 5+ - document.attachEvent("onmousemove", SocialCalc.TooltipMouseMove); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - tooltipinfo.registered = true; // remember - - return; - }; - - // - // TooltipMouseMove(event) - // - - SocialCalc.TooltipMouseMove = function (event) { - var e = event || window.event; - - var tooltipinfo = SocialCalc.TooltipInfo; - - tooltipinfo.viewport = SocialCalc.GetViewportInfo(); - tooltipinfo.clientX = e.clientX + tooltipinfo.viewport.horizontalScroll; - tooltipinfo.clientY = e.clientY + tooltipinfo.viewport.verticalScroll; - - var tobj = SocialCalc.LookupElement( - e.target || e.srcElement, - tooltipinfo.registeredElements - ); - - if (tooltipinfo.timer) { - // waiting to see if holding still: didn't hold still - window.clearTimeout(tooltipinfo.timer); // cancel timer - tooltipinfo.timer = null; - } - - if (tooltipinfo.popupElement) { - // currently displaying a tip: hide it - SocialCalc.TooltipHide(); - } - - tooltipinfo.tooltipElement = tobj || null; - - if (!tobj || SocialCalc.ButtonInfo.buttonDown) return; // if not an object with a tip or a "button" is down, ignore - - tooltipinfo.timer = window.setTimeout(SocialCalc.TooltipWaitDone, 700); - - if (tooltipinfo.tooltipElement.element.addEventListener) { - // Register event for mouse down which cancels tooltip stuff - tooltipinfo.tooltipElement.element.addEventListener( - "mousedown", - SocialCalc.TooltipMouseDown, - false - ); - } else if (tooltipinfo.tooltipElement.element.attachEvent) { - // IE - tooltipinfo.tooltipElement.element.attachEvent( - "onmousedown", - SocialCalc.TooltipMouseDown - ); - } - - return; - }; - - // - // TooltipMouseDown(event) - // - - SocialCalc.TooltipMouseDown = function (event) { - var e = event || window.event; - - var tooltipinfo = SocialCalc.TooltipInfo; - - if (tooltipinfo.timer) { - window.clearTimeout(tooltipinfo.timer); // cancel timer - tooltipinfo.timer = null; - } - - if (tooltipinfo.popupElement) { - // currently displaying a tip: hide it - SocialCalc.TooltipHide(); - } - - if (tooltipinfo.tooltipElement) { - if (tooltipinfo.tooltipElement.element.removeEventListener) { - // DOM Level 2 -- Firefox, et al - tooltipinfo.tooltipElement.element.removeEventListener( - "mousedown", - SocialCalc.TooltipMouseDown, - false - ); - } else if (tooltipinfo.tooltipElement.element.attachEvent) { - // IE 5+ - tooltipinfo.tooltipElement.element.detachEvent( - "onmousedown", - SocialCalc.TooltipMouseDown - ); - } - tooltipinfo.tooltipElement = null; - } - - return; - }; - - // - // TooltipDisplay(tobj) - // - - SocialCalc.TooltipDisplay = function (tobj) { - var tooltipinfo = SocialCalc.TooltipInfo; - var scc = SocialCalc.Constants; - var offsetX = - tobj.functionobj && typeof tobj.functionobj.offsetx == "number" - ? tobj.functionobj.offsetx - : tooltipinfo.offsetX; - var offsetY = - tobj.functionobj && typeof tobj.functionobj.offsety == "number" - ? tobj.functionobj.offsety - : tooltipinfo.offsetY; - - tooltipinfo.popupElement = document.createElement("div"); - if (scc.TDpopupElementClass) - tooltipinfo.popupElement.className = scc.TDpopupElementClass; - SocialCalc.setStyles(tooltipinfo.popupElement, scc.TDpopupElementStyle); - - tooltipinfo.popupElement.innerHTML = tobj.tiptext; - - if (tooltipinfo.clientX > tooltipinfo.viewport.width / 2) { - // on right side of screen - tooltipinfo.popupElement.style.bottom = - tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY + "px"; - tooltipinfo.popupElement.style.right = - tooltipinfo.viewport.width - tooltipinfo.clientX + offsetX + "px"; - } else { - // on left side of screen - tooltipinfo.popupElement.style.bottom = - tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY + "px"; - tooltipinfo.popupElement.style.left = - tooltipinfo.clientX + offsetX + "px"; - } - - if (tooltipinfo.clientY < 50) { - // make sure fits on screen if nothing above grid - tooltipinfo.popupElement.style.bottom = - tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY - 50 + "px"; - } - - document.body.appendChild(tooltipinfo.popupElement); - }; - - // - // TooltipHide() - // - - SocialCalc.TooltipHide = function () { - var tooltipinfo = SocialCalc.TooltipInfo; - - if (tooltipinfo.popupElement) { - tooltipinfo.popupElement.parentNode.removeChild(tooltipinfo.popupElement); - tooltipinfo.popupElement = null; - } - }; - - // - // TooltipWaitDone() - // - - SocialCalc.TooltipWaitDone = function () { - var tooltipinfo = SocialCalc.TooltipInfo; - - tooltipinfo.timer = null; - - SocialCalc.TooltipDisplay(tooltipinfo.tooltipElement); - }; - - // ************************************* - // - // Button functions: - // - // ************************************* - - SocialCalc.ButtonInfo = { - // There is only one of these -- no "new" is done. - // Only one button operation can be active at a time. - // The registeredElements array is used to identify items. - - // One item for each clickable element, each an object with: - // .element, .normalstyle, .hoverstyle, .downstyle, .repeatinterval, .functionobj - // - // .functionobj is an object with optional function objects for: - // mouseover, mouseout, mousedown, repeatinterval, mouseup, disabled - - registeredElements: [], - - // Items used during hover over an element, clicking, repeating, etc. - - buttonElement: null, // item being processed, hover or down (.element is the actual element) - doingHover: false, // true if mouse is over one of our elements - buttonDown: false, // true if button down and buttonElement not null - timer: null, // timer object for repeating - - // Used while processing an event - - horizontalScroll: 0, - verticalScroll: 0, - clientX: 0, - clientY: 0, - }; - - // - // ButtonRegister(element, paramobj, functionobj) - make element clickable - // - // The arguments (other than element) may be null (meaning no change for style and no repeat) - // The paramobj has the optional normalstyle, hoverstyle, downstyle, repeatwait, repeatinterval settings - - SocialCalc.ButtonRegister = function (element, paramobj, functionobj) { - var buttoninfo = SocialCalc.ButtonInfo; - - if (!paramobj) paramobj = {}; - - buttoninfo.registeredElements.push({ - name: paramobj.name, - element: element, - normalstyle: paramobj.normalstyle, - hoverstyle: paramobj.hoverstyle, - downstyle: paramobj.downstyle, - repeatwait: paramobj.repeatwait, - repeatinterval: paramobj.repeatinterval, - functionobj: functionobj, - }); - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.ButtonMouseDown, false); - element.addEventListener("mouseover", SocialCalc.ButtonMouseOver, false); - element.addEventListener("mouseout", SocialCalc.ButtonMouseOut, false); - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousedown", SocialCalc.ButtonMouseDown); - element.attachEvent("onmouseover", SocialCalc.ButtonMouseOver); - element.attachEvent("onmouseout", SocialCalc.ButtonMouseOut); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - }; - - // - // ButtonMouseOver(event) - // - - SocialCalc.ButtonMouseOver = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var bobj = SocialCalc.LookupElement( - e.target || e.srcElement, - buttoninfo.registeredElements - ); - - if (!bobj) return; - - if (buttoninfo.buttonDown) { - if (buttoninfo.buttonElement == bobj) { - buttoninfo.doingHover = true; // keep track whether we are on the pressed button or not - } - return; - } - - if ( - buttoninfo.buttonElement && - buttoninfo.buttonElement != bobj && - buttoninfo.doingHover - ) { - // moved to a new one, undo hover there - SocialCalc.setStyles( - buttoninfo.buttonElement.element, - buttoninfo.buttonElement.normalstyle - ); - } - - buttoninfo.buttonElement = bobj; // remember this one is hovering - buttoninfo.doingHover = true; - - SocialCalc.setStyles(bobj.element, bobj.hoverstyle); // set style (if provided) - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOver) - bobj.functionobj.MouseOver(e, buttoninfo, bobj); - - return; - }; - - // - // ButtonMouseOut(event) - // - - SocialCalc.ButtonMouseOut = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - if (buttoninfo.buttonDown) { - buttoninfo.doingHover = false; // keep track of overs and outs - return; - } - - var bobj = SocialCalc.LookupElement( - e.target || e.srcElement, - buttoninfo.registeredElements - ); - - if (buttoninfo.doingHover) { - // if there was a hover, undo it - if (buttoninfo.buttonElement) - SocialCalc.setStyles( - buttoninfo.buttonElement.element, - buttoninfo.buttonElement.normalstyle - ); - buttoninfo.buttonElement = null; - buttoninfo.doingHover = false; - } - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOut) - bobj.functionobj.MouseOut(e, buttoninfo, bobj); - - return; - }; - - // - // ButtonMouseDown(event) - // - - SocialCalc.ButtonMouseDown = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var viewportinfo = SocialCalc.GetViewportInfo(); - - var bobj = SocialCalc.LookupElement( - e.target || e.srcElement, - buttoninfo.registeredElements - ); - - if (!bobj) return; // not one of our elements - - if (bobj && bobj.functionobj && bobj.functionobj.Disabled) { - if (bobj.functionobj.Disabled(e, buttoninfo, bobj)) { - return; - } - } - - buttoninfo.buttonElement = bobj; - buttoninfo.buttonDown = true; - - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.downstyle); - - // Register event handler for mouse up - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener("mouseup", SocialCalc.ButtonMouseUp, true); // capture everywhere - } else if (bobj.element.attachEvent) { - // IE 5+ - bobj.element.setCapture(); - bobj.element.attachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.attachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - } - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - buttoninfo.horizontalScroll = viewportinfo.horizontalScroll; - buttoninfo.verticalScroll = viewportinfo.verticalScroll; - buttoninfo.clientX = e.clientX + buttoninfo.horizontalScroll; // get document-relative coordinates - buttoninfo.clientY = e.clientY + buttoninfo.verticalScroll; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseDown) - bobj.functionobj.MouseDown(e, buttoninfo, bobj); - - if (bobj.repeatwait) { - // if a repeat wait is set, then starting waiting for first repetition - buttoninfo.timer = window.setTimeout( - SocialCalc.ButtonRepeat, - bobj.repeatwait - ); - } - - return; - }; - - // - // ButtonMouseUp(event) - // - - SocialCalc.ButtonMouseUp = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (buttoninfo.timer) { - // if repeating, cancel it - window.clearTimeout(buttoninfo.timer); // cancel timer - buttoninfo.timer = null; - } - - if (!buttoninfo.buttonDown) return; // already did this (e.g., in IE, releaseCapture fires losecapture) - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener("mouseup", SocialCalc.ButtonMouseUp, true); - } else if (document.detachEvent) { - // IE - bobj.element.detachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - bobj.element.detachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.releaseCapture(); - } - - if (buttoninfo.buttonElement.downstyle) { - if (buttoninfo.doingHover) - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.hoverstyle); - else - SocialCalc.setStyles( - bobj.element, - buttoninfo.buttonElement.normalstyle - ); - } - - buttoninfo.buttonDown = false; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseUp) - bobj.functionobj.MouseUp(e, buttoninfo, bobj); - }; - - // - // ButtonRepeat() - // - - SocialCalc.ButtonRepeat = function () { - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (!bobj) return; - - if (bobj && bobj.functionobj && bobj.functionobj.Repeat) - bobj.functionobj.Repeat(null, buttoninfo, bobj); - - buttoninfo.timer = window.setTimeout( - SocialCalc.ButtonRepeat, - bobj.repeatinterval || 100 - ); - }; - - // ************************************* - // - // MouseWheel functions: - // - // ************************************* - - SocialCalc.MouseWheelInfo = { - // There is only one of these -- no "new" is done. - // The mousewheel only affects the one area the mouse pointer is over - // The registeredElements array is used to identify items. - - // One item for each element to respond to the mousewheel, each an object with: - // .element, .functionobj - - registeredElements: [], - }; - - // - // MouseWheelRegister(element, functionobj) - make element respond to mousewheel - // - - SocialCalc.MouseWheelRegister = function (element, functionobj) { - var mousewheelinfo = SocialCalc.MouseWheelInfo; - - mousewheelinfo.registeredElements.push({ - element: element, - functionobj: functionobj, - }); - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener( - "DOMMouseScroll", - SocialCalc.ProcessMouseWheel, - false - ); - element.addEventListener( - "mousewheel", - SocialCalc.ProcessMouseWheel, - false - ); // Opera needs this - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousewheel", SocialCalc.ProcessMouseWheel); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - }; - - SocialCalc.ProcessMouseWheel = function (e) { - var event = e || window.event; - var delta, coord; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - var mousewheelinfo = SocialCalc.MouseWheelInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var wobj; - - for (wobj = null; !wobj && ele; ele = ele.parentNode) { - // go up tree looking for one of our elements - wobj = SocialCalc.LookupElement(ele, mousewheelinfo.registeredElements); - } - if (!wobj) return; // not one of our elements - - if (event.wheelDelta) { - delta = event.wheelDelta / 120; - } else delta = -event.detail / 3; - if (!delta) delta = 0; - - if (wobj.functionobj && wobj.functionobj.WheelMove) - wobj.functionobj.WheelMove(event, delta, mousewheelinfo, wobj); - - if (event.preventDefault) event.preventDefault(); - event.returnValue = false; - }; - - // ************************************* - // - // Keyboard functions: - // - // For more information about keyboard handling, see: http://unixpapa.com/js/key.html - // - // ************************************* - - SocialCalc.keyboardTables = { - specialKeysCommon: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", - 46: "[del]", - 113: "[f2]", - }, - - specialKeysIE: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", - 46: "[del]", - 113: "[f2]", - }, - - controlKeysIE: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]", - }, - - specialKeysOpera: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", // issues with releases before 9.5 - same as "-" ("-" changed in 9.5) - 46: "[del]", // issues with releases before 9.5 - same as "." ("." changed in 9.5) - 113: "[f2]", - }, - - controlKeysOpera: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]", - }, - - specialKeysSafari: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 63232: "[aup]", - 63233: "[adown]", - 63234: "[aleft]", - 63235: "[aright]", - 63272: "[del]", - 63273: "[home]", - 63275: "[end]", - 63276: "[pgup]", - 63277: "[pgdn]", - 63237: "[f2]", - }, - - controlKeysSafari: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]", - }, - - ignoreKeysSafari: { - 63236: "[f1]", - 63238: "[f3]", - 63239: "[f4]", - 63240: "[f5]", - 63241: "[f6]", - 63242: "[f7]", - 63243: "[f8]", - 63244: "[f9]", - 63245: "[f10]", - 63246: "[f11]", - 63247: "[f12]", - 63289: "[numlock]", - }, - - specialKeysFirefox: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", - 46: "[del]", - 113: "[f2]", - }, - - controlKeysFirefox: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]", - }, - - ignoreKeysFirefox: { - 16: "[shift]", - 17: "[ctrl]", - 18: "[alt]", - 20: "[capslock]", - 19: "[pause]", - 44: "[printscreen]", - 91: "[windows]", - 92: "[windows]", - 112: "[f1]", - 114: "[f3]", - 115: "[f4]", - 116: "[f5]", - 117: "[f6]", - 118: "[f7]", - 119: "[f8]", - 120: "[f9]", - 121: "[f10]", - 122: "[f11]", - 123: "[f12]", - 144: "[numlock]", - 145: "[scrolllock]", - 224: "[cmd]", - }, - }; - - SocialCalc.Keyboard = { - areListener: false, // if true, we have been installed as a listener for keyboard events - focusTable: null, // the table editor object that gets keystrokes or null - passThru: null, // if not null, control element with focus to pass keyboard events to (has blur method), or "true" - didProcessKey: false, // did SocialCalc.ProcessKey in keydown - statusFromProcessKey: false, // the status from the keydown SocialCalc.ProcessKey - repeatingKeyPress: false, // some browsers (Opera, Gecko Mac) repeat special keys as KeyPress not KeyDown - chForProcessKey: "", // remember so can do repeat in those cases - }; - - SocialCalc.KeyboardSetFocus = function (editor) { - SocialCalc.Keyboard.focusTable = editor; - - if (!SocialCalc.Keyboard.areListener) { - document.onkeydown = SocialCalc.ProcessKeyDown; - document.onkeypress = SocialCalc.ProcessKeyPress; - SocialCalc.Keyboard.areListener = true; - } - if (SocialCalc.Keyboard.passThru) { - if (SocialCalc.Keyboard.passThru.blur) { - SocialCalc.Keyboard.passThru.blur(); - } - SocialCalc.Keyboard.passThru = null; - } - window.focus(); - }; - - SocialCalc.KeyboardFocus = function () { - SocialCalc.Keyboard.passThru = null; - window.focus(); - }; - - SocialCalc.ProcessKeyDown = function (e) { - var kt = SocialCalc.keyboardTables; - kt.didProcessKey = false; // always start false - kt.statusFromProcessKey = false; - kt.repeatingKeyPress = false; - - var ch = ""; - var status = true; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - // IE and Safari 3.1+ won't fire keyPress, so check for special keys here. - if (e.which == undefined || typeof e.keyIdentifier == "string") { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { - if (e.ctrlKey) { - ch = kt.controlKeysIE[e.keyCode]; - } - if (!ch) return true; - } - status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - } else { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { - // return true; - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysIE[e.keyCode]; // this works here - } - if (!ch) return true; - } - - status = SocialCalc.ProcessKey(ch, e); // process the key - kt.didProcessKey = true; // remember what happened - kt.statusFromProcessKey = status; - kt.chForProcessKey = ch; - } - - return status; - }; - - SocialCalc.ProcessKeyPress = function (e) { - var kt = SocialCalc.keyboardTables; - - var ch = ""; - - e = e || window.event; - - if (SocialCalc.Keyboard.passThru) return; // ignore - if (kt.didProcessKey) { - // already processed this key - if (kt.repeatingKeyPress) { - return SocialCalc.ProcessKey(kt.chForProcessKey, e); // process the same key as on KeyDown - } else { - kt.repeatingKeyPress = true; // see if get another KeyPress before KeyDown - return kt.statusFromProcessKey; // do what it said to do - } - } - - if (e.which == undefined) { - // IE - // Note: Esc and Enter will come through here, too, if not stopped at KeyDown - ch = String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) - } else { - // not IE - if (!e.which) return false; // ignore - special key - if (e.charCode == undefined) { - // Opera - if (e.which != 0) { - // character - if (e.which < 32 || e.which == 144) { - // special char (144 is numlock) - ch = kt.specialKeysOpera[e.which]; - if (ch) { - return true; - } - } else { - if (e.ctrlKey) { - ch = kt.controlKeysOpera[e.keyCode]; - } else { - ch = String.fromCharCode(e.which); - } - } - } else { - // special char - return true; - } - } else if (e.keyCode == 0 && e.charCode == 0) { - // OLPC Fn key or something - return; // ignore - } else if (e.keyCode == e.charCode) { - // Safari - ch = kt.specialKeysSafari[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysSafari[e.keyCode]) - // pass this through - return true; - if (e.metaKey) { - ch = kt.controlKeysSafari[e.keyCode]; - } else { - ch = String.fromCharCode(e.which); - } - } - } else { - // Firefox - if (kt.specialKeysFirefox[e.keyCode]) { - return true; - } - ch = String.fromCharCode(e.which); - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysFirefox[e.which]; - } - } - } - - var status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - - return status; - }; - - /* -* -* OLD ProcessKeyDown and ProcessKeyPress -- replaced for handling newer browsers, including Safari 3.1 and Opera 9.5 -* - -SocialCalc.ProcessKeyDown = function(e) { - -var kt = SocialCalc.keyboardTables; - -var ch=""; -var status=true; - -if (SocialCalc.Keyboard.passThru) return; // ignore - -e = e || window.event; - -if (e.which==undefined) { // IE -ch = kt.specialKeysIE[e.keyCode]; -if (!ch) { -if (e.ctrlKey) { -ch=kt.controlKeysIE[e.keyCode]; -} -if (!ch) -return true; -} - -status = SocialCalc.ProcessKey(ch, e); - -if (!status) { -if (e.preventDefault) e.preventDefault(); -e.returnValue = false; -} -} - -else { // don't do anything for other browsers - wait for keyPress -; // special key repeats are done as keypress in those browsers -} - -return status; - -} - -SocialCalc.ProcessKeyPress = function(e) { - -var kt = SocialCalc.keyboardTables; - -var ch=""; - -if (SocialCalc.Keyboard.passThru) return; // ignore - -e = e || window.event; - -if (e.which==undefined) { // IE -// Note: Esc and Enter will come through here, too, if not stopped at KeyDown -ch=String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) -} - -else { // not IE -if (e.charCode==undefined) { // Opera -if (e.which!=0) { // character -if (e.which<32) { // special char -ch = kt.specialKeysOpera[e.keyCode]; -if (!ch) -return true; -} -else { -if (e.ctrlKey) { -ch=kt.controlKeysOpera[e.keyCode]; -} -else { -ch = String.fromCharCode(e.which); -} -} -} -else { // special char -ch = kt.specialKeysOpera[e.keyCode]; -if (!ch) -return true; -} -} - -else if (e.keyCode==0 && e.charCode==0) { // OLPC Fn key or something -return; // ignore -} - -else if (e.keyCode==e.charCode) { // Safari -ch = kt.specialKeysSafari[e.keyCode]; -if (!ch) { -if (kt.ignoreKeysSafari[e.keyCode]) // pass this through -return true; -if (e.metaKey) { -ch=kt.controlKeysSafari[e.keyCode]; -} -else { -ch = String.fromCharCode(e.which); -} -} -} - -else { // Firefox -ch = kt.specialKeysFirefox[e.keyCode]; -if (!ch) { -if (kt.ignoreKeysFirefox[e.keyCode]) // pass this through -return true; -if (e.which) { // normal char -if (e.ctrlKey || e.metaKey) { -ch = kt.controlKeysFirefox[e.which]; -} -else { -ch = String.fromCharCode(e.which); -} -} -else { // usually a special char -return true; // old Firefox gives extra, empty keyPress for "/" - ignore -} -} -} -} - -var status = SocialCalc.ProcessKey(ch, e); - -if (!status) { -if (e.preventDefault) e.preventDefault(); -e.returnValue = false; -} - -return status; - -} -*/ - - // - // status = SocialCalc.ProcessKey(ch, e) - // - // Take a key representation as a character string and dispatch to appropriate routine - // - - SocialCalc.ProcessKey = function (ch, e) { - var ft = SocialCalc.Keyboard.focusTable; - - if (!ft) return true; // we're not handling it -- let browser do default - - return ft.EditorProcessKey(ch, e); - }; - - // For Contact - SocialCalc.EditorChangecontact = function ( - editor, - text, - name, - phone, - email, - street, - city, - company, - val - ) { - // alert('changecontact called'); - //var wval = editor.workingvalues; - if (name != "") { - cmdline = "set " + name + " " + "text t" + " " + contactname; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - cmdline = "set " + phone + " " + "text t" + " " + contactphoneNumber; - editor.EditorScheduleSheetCommands(cmdline, true, false); - if (email != "") { - cmdline = "set " + email + " " + "text t" + " " + contactemail; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - cmdline = "set " + street + " " + "text t" + " " + contactStreet; - editor.EditorScheduleSheetCommands(cmdline, true, false); - cmdline = "set " + city + " " + "text t" + " " + contactcity; - editor.EditorScheduleSheetCommands(cmdline, true, false); - if (val == "y") { - cmdline = "set " + company + " " + "text t" + " " + contactcompany; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - - return; - }; - - //changes by mini for font and color - - SocialCalc.EditorChangeSheetcolor = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - type = "text t"; - //value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - value = text; - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord) + ""; - if (value == oldvalue) { - // no change - return; - } - fch = value.charAt(0); - if (fch == "=" && value.indexOf("\n") == -1) { - type = "formula"; - value = value.substring(1); - } else if (fch == "'") { - type = "text t"; - value = value.substring(1); - } else if (value.length == 0) { - type = "empty"; - } else { - valueinfo = SocialCalc.DetermineValueType(value); - if (valueinfo.type == "n" && value == valueinfo.value + "") { - // see if don't need "constant" - type = "value n"; - } else if (valueinfo.type.charAt(0) == "t") { - type = "text " + valueinfo.type; - } else if (valueinfo.type == "") { - type = "text t"; - } else { - type = "constant " + valueinfo.type + " " + valueinfo.value; - } - } - - if (type.charAt(0) == "t") { - // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - //cmdline = "set "+wval.ecoord+" "+"font"+" "+value; - cmdline = "set " + "sheet" + " " + "defaultcolor" + " " + value; - //cmdline = "set "+"sheet"+" "+"defaultcolor green"; - //var control = SocialCalc.GetCurrentWorkBookControl(); - //alert('u reach sheet' + " "+control.workbook.sheetArr["sheet1"].sheet); - //cmdline = "set "+sheetobj+" "+"font"+" "+value; - //cmdline="set "+ control.workbook.sheetArr["sheet1"].sheet+" color blue" ; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - }; - - SocialCalc.EditorChangecolorFromWidget = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - if (!CoordForColorChange) { - alert("No active cell"); - return; - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - cmdline = "set " + CoordForColorChange + " " + "color" + " " + text; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - }; - - SocialCalc.EditorChangefontFromWidget = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - if (!CoordForColorChange) { - alert("No active cell"); - return; - } - //alert(CoordForColorChange); - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - //cmdline = "set "+CoordForColorChange+" "+"font"+" "+text; - //editor.EditorScheduleSheetCommands(cmdline, true, false); - var value = text; - if (value == "a") { - cmdline = "set " + CoordForColorChange + " font * 12px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "b") { - cmdline = "set " + CoordForColorChange + " font * 14px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "c") { - cmdline = "set " + CoordForColorChange + " font * 16px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "d") { - cmdline = "set " + CoordForColorChange + " font * 18px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - - return; - }; - - SocialCalc.EditorChangeSheetfont = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - type = "text t"; - //value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - value = text; - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord) + ""; - if (value == oldvalue) { - // no change - return; - } - fch = value.charAt(0); - if (fch == "=" && value.indexOf("\n") == -1) { - type = "formula"; - value = value.substring(1); - } else if (fch == "'") { - type = "text t"; - value = value.substring(1); - } else if (value.length == 0) { - type = "empty"; - } else { - valueinfo = SocialCalc.DetermineValueType(value); - if (valueinfo.type == "n" && value == valueinfo.value + "") { - // see if don't need "constant" - type = "value n"; - } else if (valueinfo.type.charAt(0) == "t") { - type = "text " + valueinfo.type; - } else if (valueinfo.type == "") { - type = "text t"; - } else { - type = "constant " + valueinfo.type + " " + valueinfo.value; - } - } - - if (type.charAt(0) == "t") { - // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - //cmdline = "set "+wval.ecoord+" "+"font"+" "+value; - //cmdline = "set "+"sheet"+" "+"defaultcolor"+" "+ value; - - //cmdline = "set "+"sheet"+" "+"defaultfont"+" * "+value+" *"; - - //cmdline = "set sheet defaultfont normal normal "+value +" *"; - //cmdline="set sheet defaultfont"; - // alert(cmdline); - //editor.EditorScheduleSheetCommands(cmdline, true, false); - if (value == "a") { - cmdline = "set sheet defaultfont * 12px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "b") { - cmdline = "set sheet defaultfont * 14px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "c") { - cmdline = "set sheet defaultfont * 16px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "d") { - cmdline = "set sheet defaultfont * 18px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - - //cmdline = ""+"set sheet defaultfont * 8pt *"; - //cmdline = "set "+"sheet"+" "+"defaultcolor green"; - //var control = SocialCalc.GetCurrentWorkBookControl(); - //alert('u reach sheet' + " "+control.workbook.sheetArr["sheet1"].sheet); - //cmdline = "set "+sheetobj+" "+"font"+" "+value; - //cmdline="set "+ control.workbook.sheetArr["sheet1"].sheet+" color blue" ; - - return; - }; - - SocialCalc.EditorCut = function (editor, value) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - if (value == "a") { - cmdline = "cut " + editCoord + " all"; - } else if (value == "b") { - cmdline = "copy " + editCoord + " all"; - } else if (value == "c") { - cmdline = "paste " + editCoord + " all"; - } else if (value == "d") { - cmdline = "erase " + editCoord + " formulas"; - } - editor.EditorScheduleSheetCommands(cmdline, true, false); - }; - - SocialCalc.EditorClearSheet = function (editor, cell_to_clear) { - //alert("clear"); - var cmdline; - var coord = cell_to_clear; - cmdline = "erase " + coord + " formulas"; - //console.log(cmdline); - editor.EditorScheduleSheetCommands(cmdline, true, false); - }; - - // - /* -// SocialCalc Number Formatting Library -// -// Part of the SocialCalc package. -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - - SocialCalc.FormatNumber = {}; - - SocialCalc.FormatNumber.format_definitions = {}; // Parsed formats are stored here globally - - // Most constants that are often customized for localization are in the SocialCalc.Constants module. - // If you use this module standalone, provide at least the "FormatNumber" values. - // - - // The following values may be customized externally for further localization of the format definitions themselves, - // but that would make them incompatible with other uses and is discouraged. - // - - SocialCalc.FormatNumber.separatorchar = ","; - SocialCalc.FormatNumber.decimalchar = "."; - SocialCalc.FormatNumber.daynames = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - ]; - SocialCalc.FormatNumber.daynames3 = [ - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - ]; - SocialCalc.FormatNumber.monthnames3 = [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - ]; - SocialCalc.FormatNumber.monthnames = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ]; - - SocialCalc.FormatNumber.allowedcolors = { - BLACK: "#000000", - BLUE: "#0000FF", - CYAN: "#00FFFF", - GREEN: "#00FF00", - MAGENTA: "#FF00FF", - RED: "#FF0000", - WHITE: "#FFFFFF", - YELLOW: "#FFFF00", - }; - - SocialCalc.FormatNumber.alloweddates = { - H: "h]", - M: "m]", - MM: "mm]", - S: "s]", - SS: "ss]", - }; - - // Other constants - - SocialCalc.FormatNumber.commands = { - copy: 1, - color: 2, - integer_placeholder: 3, - fraction_placeholder: 4, - decimal: 5, - currency: 6, - general: 7, - separator: 8, - date: 9, - comparison: 10, - section: 11, - style: 12, - }; - - SocialCalc.FormatNumber.datevalues = { - julian_offset: 2415019, - seconds_in_a_day: 24 * 60 * 60, - seconds_in_an_hour: 60 * 60, - }; - - /* ******************* - - result = SocialCalc.FormatNumber.formatNumberWithFormat = function(rawvalue, format_string, currency_char) - -************************* */ - - SocialCalc.FormatNumber.formatNumberWithFormat = function ( - rawvalue, - format_string, - currency_char - ) { - var scc = SocialCalc.Constants; - var scfn = SocialCalc.FormatNumber; - - var op, operandstr, fromend, cval, operandstrlc; - var startval, estartval; - var hrs, mins, secs, ehrs, emins, esecs, ampmstr, ymd; - var minOK, mpos; - var result = ""; - var thisformat; - var section, gotcomparison, compop, compval, cpos, oppos; - var sectioninfo; - var i, - decimalscale, - scaledvalue, - strvalue, - strparts, - integervalue, - fractionvalue; - var integerdigits2, - integerpos, - fractionpos, - textcolor, - textstyle, - separatorchar, - decimalchar; - var value; // working copy to change sign, etc. - var mspos; - rawvalue = rawvalue - 0; // make sure a number - value = rawvalue; - if (!isFinite(value)) return "NaN"; - - var negativevalue = value < 0 ? 1 : 0; // determine sign, etc. - if (negativevalue) value = -value; - var zerovalue = value == 0 ? 1 : 0; - - currency_char = currency_char || scc.FormatNumber_DefaultCurrency; - - scfn.parse_format_string(scfn.format_definitions, format_string); // make sure format is parsed - thisformat = scfn.format_definitions[format_string]; // Get format structure - - if (!thisformat) throw "Format not parsed error!"; - - section = thisformat.sectioninfo.length - 1; // get number of sections - 1 - - if (thisformat.hascomparison) { - // has comparisons - determine which section - section = 0; // set to which section we will use - gotcomparison = 0; // this section has no comparison - for (cpos = 0; ; cpos++) { - // scan for comparisons - op = thisformat.operators[cpos]; - operandstr = thisformat.operands[cpos]; // get next operator and operand - if (!op) { - // at end with no match - if (gotcomparison) { - // if comparison but no match - format_string = "General"; // use default of General - scfn.parse_format_string(scfn.format_definitions, format_string); - thisformat = scfn.format_definitions[format_string]; - section = 0; - } - break; // if no comparision, matches on this section - } - if (op == scfn.commands.section) { - // end of section - if (!gotcomparison) { - // no comparison, so it's a match - break; - } - gotcomparison = 0; - section++; // check out next one - continue; - } - if (op == scfn.commands.comparison) { - // found a comparison - do we meet it? - i = operandstr.indexOf(":"); - compop = operandstr.substring(0, i); - compval = operandstr.substring(i + 1) - 0; - if ( - (compop == "<" && rawvalue < compval) || - (compop == "<=" && rawvalue <= compval) || - (compop == "=" && rawvalue == compval) || - (compop == "<>" && rawvalue != compval) || - (compop == ">=" && rawvalue >= compval) || - (compop == ">" && rawvalue > compval) - ) { - // a match - break; - } - gotcomparison = 1; - } - } - } else if (section > 0) { - // more than one section (separated by ";") - if (section == 1) { - // two sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } else { - section = 0; // use first for all others - } - } else if (section == 2) { - // three sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } else if (zerovalue) { - section = 2; // use third section for zero values - } else { - section = 0; // use first for positive - } - } - } - - sectioninfo = thisformat.sectioninfo[section]; // look at values for our section - - if (sectioninfo.commas > 0) { - // scale by thousands - for (i = 0; i < sectioninfo.commas; i++) { - value /= 1000; - } - } - if (sectioninfo.percent > 0) { - // do percent scaling - for (i = 0; i < sectioninfo.percent; i++) { - value *= 100; - } - } - - decimalscale = 1; // cut down to required number of decimal digits - for (i = 0; i < sectioninfo.fractiondigits; i++) { - decimalscale *= 10; - } - scaledvalue = Math.floor(value * decimalscale + 0.5); - scaledvalue = scaledvalue / decimalscale; - - if (typeof scaledvalue != "number") return "NaN"; - if (!isFinite(scaledvalue)) return "NaN"; - - strvalue = scaledvalue + ""; // convert to string (Number.toFixed doesn't do all we need) - - // strvalue = value.toFixed(sectioninfo.fractiondigits); // cut down to required number of decimal digits - // and convert to string - - if ( - scaledvalue == 0 && - (sectioninfo.fractiondigits || sectioninfo.integerdigits) - ) { - negativevalue = 0; // no "-0" unless using multiple sections or General - } - - if (strvalue.indexOf("e") >= 0) { - // converted to scientific notation - return rawvalue + ""; // Just return plain converted raw value - } - - strparts = strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - if (!strparts) return "NaN"; // if not a number - integervalue = strparts[1]; - if (!integervalue || integervalue == "0") integervalue = ""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - - if (sectioninfo.hasdate) { - // there are date placeholders - if (rawvalue < 0) { - // bad date - return "??-???-?? ??:??:??"; - } - startval = - (rawvalue - Math.floor(rawvalue)) * scfn.datevalues.seconds_in_a_day; // get date/time parts - estartval = rawvalue * scfn.datevalues.seconds_in_a_day; // do elapsed time version, too - hrs = Math.floor(startval / scfn.datevalues.seconds_in_an_hour); - ehrs = Math.floor(estartval / scfn.datevalues.seconds_in_an_hour); - startval = startval - hrs * scfn.datevalues.seconds_in_an_hour; - mins = Math.floor(startval / 60); - emins = Math.floor(estartval / 60); - secs = startval - mins * 60; - decimalscale = 1; // round appropriately depending if there is ss.0 - for (i = 0; i < sectioninfo.fractiondigits; i++) { - decimalscale *= 10; - } - secs = Math.floor(secs * decimalscale + 0.5); - secs = secs / decimalscale; - esecs = Math.floor(estartval * decimalscale + 0.5); - esecs = esecs / decimalscale; - if (secs >= 60) { - // handle round up into next second, minute, etc. - secs = 0; - mins++; - emins++; - if (mins >= 60) { - mins = 0; - hrs++; - ehrs++; - if (hrs >= 24) { - hrs = 0; - rawvalue++; - } - } - } - fractionvalue = secs - Math.floor(secs) + ""; // for "hh:mm:ss.000" - fractionvalue = fractionvalue.substring(2); // skip "0." - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian( - Math.floor(rawvalue + scfn.datevalues.julian_offset) - ); - - minOK = 0; // says "m" can be minutes if true - var mspos = sectioninfo.sectionstart; // m scan position in ops - for (; ; mspos++) { - // scan for "m" and "mm" to see if any minutes fields, and am/pm - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op == scfn.commands.section) break; - if (op == scfn.commands.date) { - if ( - (operandstr.toLowerCase() == "am/pm" || - operandstr.toLowerCase() == "a/p") && - !ampmstr - ) { - if (hrs >= 12) { - hrs -= 12; - ampmstr = - operandstr.toLowerCase() == "a/p" - ? scc.s_FormatNumber_pm1 - : scc.s_FormatNumber_pm; // "P" : "PM"; - } else { - ampmstr = - operandstr.toLowerCase() == "a/p" - ? scc.s_FormatNumber_am1 - : scc.s_FormatNumber_am; // "A" : "AM"; - } - if (operandstr.indexOf(ampmstr) < 0) - ampmstr = ampmstr.toLowerCase(); // have case match case in format - } - if (minOK && (operandstr == "m" || operandstr == "mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr.charAt(0) == "h") { - minOK = 1; // m following h or hh or [h] is minutes not months - } else { - minOK = 0; - } - } else if (op != scfn.commands.copy) { - // copying chars can be between h and m - minOK = 0; - } - } - minOK = 0; - for (--mspos; ; mspos--) { - // scan other way for s after m - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op == scfn.commands.section) break; - if (op == scfn.commands.date) { - if (minOK && (operandstr == "m" || operandstr == "mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr == "ss") { - minOK = 1; // m before ss is minutes not months - } else { - minOK = 0; - } - } else if (op != scfn.commands.copy) { - // copying chars can be between ss and m - minOK = 0; - } - } - } - - integerdigits2 = 0; // init counters, etc. - integerpos = 0; - fractionpos = 0; - textcolor = ""; - textstyle = ""; - separatorchar = scc.FormatNumber_separatorchar; - if (separatorchar.indexOf(" ") >= 0) - separatorchar = separatorchar.replace(/ /g, " "); - decimalchar = scc.FormatNumber_decimalchar; - if (decimalchar.indexOf(" ") >= 0) - decimalchar = decimalchar.replace(/ /g, " "); - - oppos = sectioninfo.sectionstart; - - while ((op = thisformat.operators[oppos])) { - // execute format - operandstr = thisformat.operands[oppos++]; // get next operator and operand - - if (op == scfn.commands.copy) { - // put char in result - result += operandstr; - } else if (op == scfn.commands.color) { - // set color - textcolor = operandstr; - } else if (op == scfn.commands.style) { - // set style - textstyle = operandstr; - } else if (op == scfn.commands.integer_placeholder) { - // insert number part - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - integerdigits2++; - if (integerdigits2 == 1) { - // first one - if (integervalue.length > sectioninfo.integerdigits) { - // see if integer wider than field - for ( - ; - integerpos < integervalue.length - sectioninfo.integerdigits; - integerpos++ - ) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - } - if ( - integervalue.length < sectioninfo.integerdigits && - integerdigits2 <= sectioninfo.integerdigits - integervalue.length - ) { - // field is wider than value - if (operandstr == "0" || operandstr == "?") { - // fill with appropriate characters - result += operandstr == "0" ? "0" : " "; - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = sectioninfo.integerdigits - integerdigits2; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } else { - // normal integer digit - add it - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - integerpos++; - } - } else if (op == scfn.commands.fraction_placeholder) { - // add fraction part of number - if (fractionpos >= fractionvalue.length) { - if (operandstr == "0" || operandstr == "?") { - result += operandstr == "0" ? "0" : " "; - } - } else { - result += fractionvalue.charAt(fractionpos); - } - fractionpos++; - } else if (op == scfn.commands.decimal) { - // decimal point - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += decimalchar; - } else if (op == scfn.commands.currency) { - // currency symbol - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += operandstr; - } else if (op == scfn.commands.general) { - // insert "General" conversion - - // *** Cut down number of significant digits to avoid floating point artifacts: - - if (value != 0) { - // only if non-zero - var factor = Math.floor(Math.LOG10E * Math.log(value)); // get integer magnitude as a power of 10 - factor = Math.pow(10, 13 - factor); // turn into scaling factor - value = Math.floor(factor * value + 0.5) / factor; // scale positive value, round, undo scaling - if (!isFinite(value)) return "NaN"; - } - if (negativevalue) { - result += "-"; - } - strvalue = value + ""; // convert original value to string - if (strvalue.indexOf("e") >= 0) { - // converted to scientific notation - result += strvalue; - continue; - } - strparts = strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - integervalue = strparts[1]; - if (!integervalue || integervalue == "0") integervalue = ""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - integerpos = 0; - fractionpos = 0; - if (integervalue.length) { - for (; integerpos < integervalue.length; integerpos++) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } else { - result += "0"; - } - if (fractionvalue.length) { - result += decimalchar; - for (; fractionpos < fractionvalue.length; fractionpos++) { - result += fractionvalue.charAt(fractionpos); - } - } - } else if (op == scfn.commands.date) { - // date placeholder - operandstrlc = operandstr.toLowerCase(); - if (operandstrlc == "y" || operandstrlc == "yy") { - result += (ymd.year + "").substring(2); - } else if (operandstrlc == "yyyy") { - result += ymd.year + ""; - } else if (operandstrlc == "d") { - result += ymd.day + ""; - } else if (operandstrlc == "dd") { - cval = 1000 + ymd.day; - result += (cval + "").substr(2); - } else if (operandstrlc == "ddd") { - cval = Math.floor(rawvalue + 6) % 7; - result += scc.s_FormatNumber_daynames3[cval]; - } else if (operandstrlc == "dddd") { - cval = Math.floor(rawvalue + 6) % 7; - result += scc.s_FormatNumber_daynames[cval]; - } else if (operandstrlc == "m") { - result += ymd.month + ""; - } else if (operandstrlc == "mm") { - cval = 1000 + ymd.month; - result += (cval + "").substr(2); - } else if (operandstrlc == "mmm") { - result += scc.s_FormatNumber_monthnames3[ymd.month - 1]; - } else if (operandstrlc == "mmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month - 1]; - } else if (operandstrlc == "mmmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month - 1].charAt(0); - } else if (operandstrlc == "h") { - result += hrs + ""; - } else if (operandstrlc == "h]") { - result += ehrs + ""; - } else if (operandstrlc == "mmin") { - cval = 1000 + mins + ""; - result += cval.substr(2); - } else if (operandstrlc == "mm]") { - if (emins < 100) { - cval = 1000 + emins + ""; - result += cval.substr(2); - } else { - result += emins + ""; - } - } else if (operandstrlc == "min") { - result += mins + ""; - } else if (operandstrlc == "m]") { - result += emins + ""; - } else if (operandstrlc == "hh") { - cval = 1000 + hrs + ""; - result += cval.substr(2); - } else if (operandstrlc == "s") { - cval = Math.floor(secs); - result += cval + ""; - } else if (operandstrlc == "ss") { - cval = 1000 + Math.floor(secs) + ""; - result += cval.substr(2); - } else if (operandstrlc == "am/pm" || operandstrlc == "a/p") { - result += ampmstr; - } else if (operandstrlc == "ss]") { - if (esecs < 100) { - cval = 1000 + Math.floor(esecs) + ""; - result += cval.substr(2); - } else { - cval = Math.floor(esecs); - result += cval + ""; - } - } - } else if (op == scfn.commands.section) { - // end of section - break; - } else if (op == scfn.commands.comparison) { - // ignore - continue; - } else { - result += "!! Parse error !!"; - } - } - - if (textcolor) { - result = '' + result + ""; - } - if (textstyle) { - result = '' + result + ""; - } - - return result; - }; - - /* ******************* - - SocialCalc.FormatNumber.parse_format_string(format_defs, format_string) - - Takes a format string (e.g., "#,##0.00_);(#,##0.00)") and fills in format_defs with the parsed info - - format_defs - ["#,##0.0"]->{} - elements in the hash are one hash for each format - .operators->[] - array of operators from parsing the format string (each a number) - .operands->[] - array of corresponding operators (each usually a string) - .sectioninfo->[] - one hash for each section of the format - .start - .integerdigits - .fractiondigits - .commas - .percent - .thousandssep - .hasdates - .hascomparison - true if any section has [<100], etc. - -************************* */ - - SocialCalc.FormatNumber.parse_format_string = function ( - format_defs, - format_string - ) { - var scfn = SocialCalc.FormatNumber; - - var thisformat, section, sectionfinfo; - var integerpart = 1; // start out in integer part - var lastwasinteger; // last char was an integer placeholder - var lastwasslash; // last char was a backslash - escaping following character - var lastwasasterisk; // repeat next char - var lastwasunderscore; // last char was _ which picks up following char for width - var inquote, quotestr; // processing a quoted string - var inbracket, bracketstr, bracketdata; // processing a bracketed string - var ingeneral, gpos; // checks for characters "General" - var ampmstr, part; // checks for characters "A/P" and "AM/PM" - var indate; // keeps track of date/time placeholders - var chpos; // character position being looked at - var ch; // character being looked at - var sectioninfo; - - if (format_defs[format_string]) return; // already defined - nothing to do - - thisformat = { operators: [], operands: [], sectioninfo: [{}] }; // create info structure for this format - format_defs[format_string] = thisformat; // add to other format definitions - - section = 0; // start with section 0 - sectioninfo = thisformat.sectioninfo[section]; // get reference to info for current section - sectioninfo.sectionstart = 0; // position in operands that starts this section - sectioninfo.integerdigits = 0; // number of integer-part placeholders - sectioninfo.fractiondigits = 0; // fraction placeholders - sectioninfo.commas = 0; // commas encountered, to handle scaling - sectioninfo.percent = 0; // times to scale by 100 - - for (chpos = 0; chpos < format_string.length; chpos++) { - // parse - ch = format_string.charAt(chpos); // get next char to examine - if (inquote) { - if (ch == '"') { - inquote = 0; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(quotestr); - continue; - } - quotestr += ch; - continue; - } - if (inbracket) { - if (ch == "]") { - inbracket = 0; - bracketdata = - SocialCalc.FormatNumber.parse_format_bracket(bracketstr); - if (bracketdata.operator == scfn.commands.separator) { - sectioninfo.thousandssep = 1; // explicit [,] - continue; - } - if (bracketdata.operator == scfn.commands.date) { - sectioninfo.hasdate = 1; - } - if (bracketdata.operator == scfn.commands.comparison) { - thisformat.hascomparison = 1; - } - thisformat.operators.push(bracketdata.operator); - thisformat.operands.push(bracketdata.operand); - continue; - } - bracketstr += ch; - continue; - } - if (lastwasslash) { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - lastwasslash = false; - continue; - } - if (lastwasasterisk) { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch + ch + ch + ch + ch); // do 5 of them since no real tabs - lastwasasterisk = false; - continue; - } - if (lastwasunderscore) { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(" "); - lastwasunderscore = false; - continue; - } - if (ingeneral) { - if ("general".charAt(ingeneral) == ch.toLowerCase()) { - ingeneral++; - if (ingeneral == 7) { - thisformat.operators.push(scfn.commands.general); - thisformat.operands.push(ch); - ingeneral = 0; - } - continue; - } - ingeneral = 0; - } - if (indate) { - // last char was part of a date placeholder - if (indate.charAt(0) == ch) { - // another of the same char - indate += ch; // accumulate it - continue; - } - thisformat.operators.push(scfn.commands.date); // something else, save date info - thisformat.operands.push(indate); - sectioninfo.hasdate = 1; - indate = ""; - } - if (ampmstr) { - ampmstr += ch; - part = ampmstr.toLowerCase(); - if ( - part != "am/pm".substring(0, part.length) && - part != "a/p".substring(0, part.length) - ) { - ampstr = ""; - } else if (part == "am/pm" || part == "a/p") { - thisformat.operators.push(scfn.commands.date); - thisformat.operands.push(ampmstr); - ampmstr = ""; - } - continue; - } - if (ch == "#" || ch == "0" || ch == "?") { - // placeholder - if (integerpart) { - sectioninfo.integerdigits++; - if (sectioninfo.commas) { - // comma inside of integer placeholders - sectioninfo.thousandssep = 1; // any number is thousands separator - sectioninfo.commas = 0; // reset count of "thousand" factors - } - lastwasinteger = 1; - thisformat.operators.push(scfn.commands.integer_placeholder); - thisformat.operands.push(ch); - } else { - sectioninfo.fractiondigits++; - thisformat.operators.push(scfn.commands.fraction_placeholder); - thisformat.operands.push(ch); - } - } else if (ch == ".") { - // decimal point - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.decimal); - thisformat.operands.push(ch); - integerpart = 0; - } else if (ch == "$") { - // currency char - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.currency); - thisformat.operands.push(ch); - } else if (ch == ",") { - if (lastwasinteger) { - sectioninfo.commas++; - } else { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } - } else if (ch == "%") { - lastwasinteger = 0; - sectioninfo.percent++; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } else if (ch == '"') { - lastwasinteger = 0; - inquote = 1; - quotestr = ""; - } else if (ch == "[") { - lastwasinteger = 0; - inbracket = 1; - bracketstr = ""; - } else if (ch == "\\") { - lastwasslash = 1; - lastwasinteger = 0; - } else if (ch == "*") { - lastwasasterisk = 1; - lastwasinteger = 0; - } else if (ch == "_") { - lastwasunderscore = 1; - lastwasinteger = 0; - } else if (ch == ";") { - section++; // start next section - thisformat.sectioninfo[section] = {}; // create a new section - sectioninfo = thisformat.sectioninfo[section]; // get reference to info for current section - sectioninfo.sectionstart = 1 + thisformat.operators.length; // remember where it starts - sectioninfo.integerdigits = 0; // number of integer-part placeholders - sectioninfo.fractiondigits = 0; // fraction placeholders - sectioninfo.commas = 0; // commas encountered, to handle scaling - sectioninfo.percent = 0; // times to scale by 100 - integerpart = 1; // reset for new section - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.section); - thisformat.operands.push(ch); - } else if (ch.toLowerCase() == "g") { - ingeneral = 1; - lastwasinteger = 0; - } else if (ch.toLowerCase() == "a") { - ampmstr = ch; - lastwasinteger = 0; - } else if ("dmyhHs".indexOf(ch) >= 0) { - indate = ch; - } else { - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } - } - - if (indate) { - // last char was part of unsaved date placeholder - thisformat.operators.push(scfn.commands.date); - thisformat.operands.push(indate); - sectioninfo.hasdate = 1; - } - - return; - }; - - /* ******************* - - bracketdata = SocialCalc.FormatNumber.parse_format_bracket(bracketstr) - - Takes a bracket contents (e.g., "RED", ">10") and returns an operator and operand - - bracketdata->{} - .operator - .operand - -************************* */ - - SocialCalc.FormatNumber.parse_format_bracket = function (bracketstr) { - var scfn = SocialCalc.FormatNumber; - var scc = SocialCalc.Constants; - - var bracketdata = {}; - var parts; - - if (bracketstr.charAt(0) == "$") { - // currency - bracketdata.operator = scfn.commands.currency; - parts = bracketstr.match(/^\$(.+?)(\-.+?){0,1}$/); - if (parts) { - bracketdata.operand = - parts[1] || scc.FormatNumber_defaultCurrency || "$"; - } else { - bracketdata.operand = - bracketstr.substring(1) || scc.FormatNumber_defaultCurrency || "$"; - } - } else if (bracketstr == "?$") { - bracketdata.operator = scfn.commands.currency; - bracketdata.operand = "[?$]"; - } else if (scfn.allowedcolors[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.color; - bracketdata.operand = scfn.allowedcolors[bracketstr.toUpperCase()]; - } else if ((parts = bracketstr.match(/^style=([^"]*)$/))) { - // [style=...] - bracketdata.operator = scfn.commands.style; - bracketdata.operand = parts[1]; - } else if (bracketstr == ",") { - bracketdata.operator = scfn.commands.separator; - bracketdata.operand = bracketstr; - } else if (scfn.alloweddates[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.date; - bracketdata.operand = scfn.alloweddates[bracketstr.toUpperCase()]; - } else if ((parts = bracketstr.match(/^[<>=]/))) { - // comparison operator - parts = bracketstr.match(/^([<>=]+)(.+)$/); // split operator and value - bracketdata.operator = scfn.commands.comparison; - bracketdata.operand = parts[1] + ":" + parts[2]; - } else { - // unknown bracket - bracketdata.operator = scfn.commands.copy; - bracketdata.operand = "[" + bracketstr + "]"; - } - - return bracketdata; - }; - - /* ******************* - - juliandate = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, month, day) - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - - I= YEAR - J= MONTH - K= DAY -C - JD= K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12) - 2 /12-3*((I+4900+(J-14)/12)/100)/4 - -************************* */ - - SocialCalc.FormatNumber.convert_date_gregorian_to_julian = function ( - year, - month, - day - ) { - var juliandate; - - juliandate = - day - - 32075 + - SocialCalc.intFunc( - (1461 * (year + 4800 + SocialCalc.intFunc((month - 14) / 12))) / 4 - ); - juliandate += SocialCalc.intFunc( - (367 * (month - 2 - SocialCalc.intFunc((month - 14) / 12) * 12)) / 12 - ); - juliandate = - juliandate - - SocialCalc.intFunc( - (3 * - SocialCalc.intFunc( - (year + 4900 + SocialCalc.intFunc((month - 14) / 12)) / 100 - )) / - 4 - ); - - return juliandate; - }; - - /* ******************* - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian(juliandate) - - ymd->{} - .year - .month - .day - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - -************************* */ - - SocialCalc.FormatNumber.convert_date_julian_to_gregorian = function ( - juliandate - ) { - var L, N, I, J, K; - - L = juliandate + 68569; - N = Math.floor((4 * L) / 146097); - L = L - Math.floor((146097 * N + 3) / 4); - I = Math.floor((4000 * (L + 1)) / 1461001); - L = L - Math.floor((1461 * I) / 4) + 31; - J = Math.floor((80 * L) / 2447); - K = L - Math.floor((2447 * J) / 80); - L = Math.floor(J / 11); - J = J + 2 - 12 * L; - I = 100 * (N - 49) + I + L; - - return { year: I, month: J, day: K }; - }; - - SocialCalc.intFunc = function (n) { - if (n < 0) { - return -Math.floor(-n); - } else { - return Math.floor(n); - } - }; - - // - /* -// SocialCalc Spreadsheet Formula Library -// -// Part of the SocialCalc package -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - // In any case, requires SocialCalc.Constants. - - SocialCalc.Formula = {}; - - // - // Formula constants for parsing: - // - - SocialCalc.Formula.ParseState = { - num: 1, - alpha: 2, - coord: 3, - string: 4, - stringquote: 5, - numexp1: 6, - numexp2: 7, - alphanumeric: 8, - specialvalue: 9, - }; - - SocialCalc.Formula.TokenType = { - num: 1, - coord: 2, - op: 3, - name: 4, - error: 5, - string: 6, - space: 7, - }; - - SocialCalc.Formula.CharClass = { - num: 1, - numstart: 2, - op: 3, - eof: 4, - alpha: 5, - incoord: 6, - error: 7, - quote: 8, - space: 9, - specialstart: 10, - }; - - SocialCalc.Formula.CharClassTable = { - " ": 9, - "!": 3, - '"': 8, - "#": 10, - $: 6, - "%": 3, - "&": 3, - "(": 3, - ")": 3, - "*": 3, - "+": 3, - ",": 3, - "-": 3, - ".": 2, - "/": 3, - 0: 1, - 1: 1, - 2: 1, - 3: 1, - 4: 1, - 5: 1, - 6: 1, - 7: 1, - 8: 1, - 9: 1, - ":": 3, - "<": 3, - "=": 3, - ">": 3, - A: 5, - B: 5, - C: 5, - D: 5, - E: 5, - F: 5, - G: 5, - H: 5, - I: 5, - J: 5, - K: 5, - L: 5, - M: 5, - N: 5, - O: 5, - P: 5, - Q: 5, - R: 5, - S: 5, - T: 5, - U: 5, - V: 5, - W: 5, - X: 5, - Y: 5, - Z: 5, - "^": 3, - _: 5, - a: 5, - b: 5, - c: 5, - d: 5, - e: 5, - f: 5, - g: 5, - h: 5, - i: 5, - j: 5, - k: 5, - l: 5, - m: 5, - n: 5, - o: 5, - p: 5, - q: 5, - r: 5, - s: 5, - t: 5, - u: 5, - v: 5, - w: 5, - x: 5, - y: 5, - z: 5, - }; - - SocialCalc.Formula.UpperCaseTable = { - a: "A", - b: "B", - c: "C", - d: "D", - e: "E", - f: "F", - g: "G", - h: "H", - i: "I", - j: "J", - k: "K", - l: "L", - m: "M", - n: "N", - o: "O", - p: "P", - q: "Q", - r: "R", - s: "S", - t: "T", - u: "U", - v: "V", - w: "W", - x: "X", - y: "Y", - z: "Z", - }; - - SocialCalc.Formula.SpecialConstants = { - // names that turn into constants for name lookup - "#NULL!": "0,e#NULL!", - "#NUM!": "0,e#NUM!", - "#DIV/0!": "0,e#DIV/0!", - "#VALUE!": "0,e#VALUE!", - "#REF!": "0,e#REF!", - "#NAME?": "0,e#NAME?", - }; - - // Operator Precedence table - // - // 1- !, 2- : ,, 3- M P, 4- %, 5- ^, 6- * /, 7- + -, 8- &, 9- < > = G(>=) L(<=) N(<>), - // Negative value means Right Associative - - SocialCalc.Formula.TokenPrecedence = { - "!": 1, - ":": 2, - ",": 2, - M: -3, - P: -3, - "%": 4, - "^": 5, - "*": 6, - "/": 6, - "+": 7, - "-": 7, - "&": 8, - "<": 9, - ">": 9, - G: 9, - L: 9, - N: 9, - }; - - // Convert one-char token text to input text: - - SocialCalc.Formula.TokenOpExpansion = { - G: ">=", - L: "<=", - M: "-", - N: "<>", - P: "+", - }; - - // - // Information about the resulting value types when doing operations on values (used by LookupResultType) - // - // Each object entry is an object with specific types with result type info as follows: - // - // 'type1a': '|type2a:resulta|type2b:resultb|... - // Type of t* or n* matches any of those types not listed - // Results may be a type or the numbers 1 or 2 specifying to return type1 or type2 - - SocialCalc.Formula.TypeLookupTable = { - unaryminus: { - "n*": "|n*:1|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - unaryplus: { - "n*": "|n*:1|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - unarypercent: { - "n*": "|n:n%|n*:n|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - plus: { - "n%": "|n%:n%|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - nd: "|n%:n|nd:nd|nt:ndt|ndt:ndt|n$:n|n:nd|n*:n|b:n|e*:2|t*:e#VALUE!|", - nt: "|n%:n|nd:ndt|nt:nt|ndt:ndt|n$:n|n:nt|n*:n|b:n|e*:2|t*:e#VALUE!|", - ndt: "|n%:n|nd:ndt|nt:ndt|ndt:ndt|n$:n|n:ndt|n*:n|b:n|e*:2|t*:e#VALUE!|", - n$: "|n%:n|nd:n|nt:n|ndt:n|n$:n$|n:n$|n*:n|b:n|e*:2|t*:e#VALUE!|", - nl: "|n%:n|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - n: "|n%:n|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - b: "|n%:n%|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - "t*": "|n*:e#VALUE!|t*:e#VALUE!|b:e#VALUE!|e*:2|", - "e*": "|e*:1|n*:1|t*:1|b:1|", - }, - concat: { - t: "|t:t|th:th|tw:tw|tl:t|t*:2|e*:2|", - th: "|t:th|th:th|tw:t|tl:th|t*:t|e*:2|", - tw: "|t:tw|th:t|tw:tw|tl:tw|t*:t|e*:2|", - tl: "|t:tl|th:th|tw:tw|tl:tl|t*:t|e*:2|", - "e*": "|e*:1|n*:1|t*:1|", - }, - oneargnumeric: { - "n*": "|n*:n|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - twoargnumeric: { - "n*": "|n*:n|t*:e#VALUE!|e*:2|", - "e*": "|e*:1|n*:1|t*:1|", - "t*": "|t*:e#VALUE!|n*:e#VALUE!|e*:2|", - }, - propagateerror: { - "n*": "|n*:2|e*:2|", - "e*": "|e*:2|", - "t*": "|t*:2|e*:2|", - b: "|b:2|e*:2|", - }, - }; - - /* ******************* - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(line) - - Parses a text string as if it was a spreadsheet formula - - This uses a simple state machine run on each character in turn. - States remember whether a number is being gathered, etc. - The result is parseinfo which is an array with one entry for each token: - parseinfo[i] = { - text: "the characters making up the parsed token", - type: the type of the token (a number), - opcode: a single character version of an operator suitable for use in the - precedence table and distinguishing between unary and binary + and -. - -************************* */ - - SocialCalc.Formula.ParseFormulaIntoTokens = function (line) { - var i, - ch, - chclass, - haddecimal, - last_token, - last_token_type, - last_token_text, - t; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var parsestate = scf.ParseState; - var tokentype = scf.TokenType; - var charclass = scf.CharClass; - var charclasstable = scf.CharClassTable; - var uppercasetable = scf.UpperCaseTable; // much faster than toUpperCase function - var pushtoken = scf.ParsePushToken; - var coordregex = /^\$?[A-Z]{1,2}\$?[1-9]\d*$/i; - - var parseinfo = []; - var str = ""; - var state = 0; - var haddecimal = false; - var cclass; - - for (i = 0; i <= line.length; i++) { - if (i < line.length) { - ch = line.charAt(i); - cclass = charclasstable[ch]; - } else { - ch = ""; - cclass = charclass.eof; - } - - if (state == parsestate.num) { - if (cclass == charclass.num) { - str += ch; - } else if (cclass == charclass.numstart && !haddecimal) { - haddecimal = true; - str += ch; - } else if (ch == "E" || ch == "e") { - str += ch; - haddecimal = false; - state = parsestate.numexp1; - } else { - // end of number - save it - pushtoken(parseinfo, str, tokentype.num, 0); - haddecimal = false; - state = 0; - } - } - - if (state == parsestate.numexp1) { - if (cclass == parsestate.num) { - state = parsestate.numexp2; - } else if ( - (ch == "+" || ch == "-") && - uppercasetable[str.charAt(str.length - 1)] == "E" - ) { - str += ch; - } else if (ch == "E" || ch == "e") { - } else { - pushtoken(parseinfo, scc.s_parseerrexponent, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.numexp2) { - if (cclass == charclass.num) { - str += ch; - } else { - // end of number - save it - pushtoken(parseinfo, str, tokentype.num, 0); - state = 0; - } - } - - if (state == parsestate.alpha) { - if (cclass == charclass.num) { - state = parsestate.coord; - } else if (cclass == charclass.alpha || ch == ".") { - // alpha may be letters, numbers, "_", or "." - str += ch; - } else if (cclass == charclass.incoord) { - state = parsestate.coord; - } else if ( - cclass == charclass.op || - cclass == charclass.numstart || - cclass == charclass.space || - cclass == charclass.eof - ) { - pushtoken(parseinfo, str.toUpperCase(), tokentype.name, 0); - state = 0; - } else { - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.coord) { - if (cclass == charclass.num) { - str += ch; - } else if (cclass == charclass.incoord) { - str += ch; - } else if (cclass == charclass.alpha) { - state = parsestate.alphanumeric; - } else if ( - cclass == charclass.op || - cclass == charclass.numstart || - cclass == charclass.eof || - cclass == charclass.space - ) { - if (coordregex.test(str)) { - t = tokentype.coord; - } else { - t = tokentype.name; - } - pushtoken(parseinfo, str.toUpperCase(), t, 0); - state = 0; - } else { - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.alphanumeric) { - if (cclass == charclass.num || cclass == charclass.alpha) { - str += ch; - } else if ( - cclass == charclass.op || - cclass == charclass.numstart || - cclass == charclass.space || - cclass == charclass.eof - ) { - pushtoken(parseinfo, str.toUpperCase(), tokentype.name, 0); - state = 0; - } else { - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.string) { - if (cclass == charclass.quote) { - state = parsestate.stringquote; // got quote in string: is it doubled (quote in string) or by itself (end of string)? - } else if (cclass == charclass.eof) { - pushtoken(parseinfo, scc.s_parseerrstring, tokentype.error, 0); - state = 0; - } else { - str += ch; - } - } else if (state == parsestate.stringquote) { - // note else if here - if (cclass == charclass.quote) { - str += '"'; - state = parsestate.string; // double quote: add one then continue getting string - } else { - // something else -- end of string - pushtoken(parseinfo, str, tokentype.string, 0); - state = 0; // drop through to process - } - } else if (state == parsestate.specialvalue) { - // special values like #REF! - if (str.charAt(str.length - 1) == "!") { - // done - save value as a name - pushtoken(parseinfo, str, tokentype.name, 0); - state = 0; // drop through to process - } else if (cclass == charclass.eof) { - pushtoken(parseinfo, scc.s_parseerrspecialvalue, tokentype.error, 0); - state = 0; - } else { - str += ch; - } - } - - if (state == 0) { - if (cclass == charclass.num) { - str = ch; - state = parsestate.num; - } else if (cclass == charclass.numstart) { - str = ch; - haddecimal = true; - state = parsestate.num; - } else if (cclass == charclass.alpha || cclass == charclass.incoord) { - str = ch; - state = parsestate.alpha; - } else if (cclass == charclass.specialstart) { - str = ch; - state = parsestate.specialvalue; - } else if (cclass == charclass.op) { - str = ch; - if (parseinfo.length > 0) { - last_token = parseinfo[parseinfo.length - 1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - if (last_token_type == charclass.op) { - if (last_token_text == "<" || last_token_text == ">") { - str = last_token_text + str; - parseinfo.pop(); - if (parseinfo.length > 0) { - last_token = parseinfo[parseinfo.length - 1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - } else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - } - } - } else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - t = tokentype.op; - if ( - parseinfo.length == 0 || - (last_token_type == charclass.op && - last_token_text != ")" && - last_token_text != "%") - ) { - // Unary operator - if (str == "-") { - // M is unary minus - str = "M"; - ch = "M"; - } else if (str == "+") { - // P is unary plus - str = "P"; - ch = "P"; - } else if (str == ")" && last_token_text == "(") { - // null arg list OK - } else if (str != "(") { - // binary-op open-paren OK, others no - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } else if (str.length > 1) { - if (str == ">=") { - // G is >= - str = "G"; - ch = "G"; - } else if (str == "<=") { - // L is <= - str = "L"; - ch = "L"; - } else if (str == "<>") { - // N is <> - str = "N"; - ch = "N"; - } else { - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } - pushtoken(parseinfo, str, t, ch); - state = 0; - } else if (cclass == charclass.quote) { - // starting a string - str = ""; - state = parsestate.string; - } else if (cclass == charclass.space) { - // store so can reconstruct spacing - pushtoken(parseinfo, " ", tokentype.space, 0); - } else if (cclass == charclass.eof) { - // ignore -- needed to have extra loop to close out other things - } else { - // unknown class - such as unknown char - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - } - } - } - - return parseinfo; - }; - - SocialCalc.Formula.ParsePushToken = function ( - parseinfo, - ttext, - ttype, - topcode - ) { - parseinfo.push({ text: ttext, type: ttype, opcode: topcode }); - }; - - /* ******************* - - result = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, allowrangereturn) - - Does the calculation expressed in a parsed formula, returning a value, its type, and error info - returns: {value: value, type: valuetype, error: errortext}. - - If allowrangereturn is present and true, can return a range (e.g., "A1:A10" - translated from "A1|A10|") - -************************* */ - - SocialCalc.Formula.evaluate_parsed_formula = function ( - parseinfo, - sheet, - allowrangereturn - ) { - var result; - - var scf = SocialCalc.Formula; - var tokentype = scf.TokenType; - - var revpolish; - var parsestack = []; - - var errortext = ""; - - revpolish = scf.ConvertInfixToPolish(parseinfo); // result is either an array or a string with error text - - result = scf.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn); - - return result; - }; - - // - // revpolish = SocialCalc.Formula.ConvertInfixToPolish(parseinfo) - // - // Convert infix to reverse polish notation - // - // Returns revpolish array with a sequence of references to tokens by number if successful. - // Errors return a string with the error. - // - // Based upon the algorithm shown in Wikipedia "Reverse Polish notation" article - // and then enhanced for additional spreadsheet things - // - - SocialCalc.Formula.ConvertInfixToPolish = function (parseinfo) { - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var token_precedence = scf.TokenPrecedence; - - var revpolish = []; - var parsestack = []; - - var errortext = ""; - - var function_start = -1; - - var i, pii, ttype, ttext, tprecedence, tstackprecedence; - - for (i = 0; i < parseinfo.length; i++) { - pii = parseinfo[i]; - ttype = pii.type; - ttext = pii.text; - if ( - ttype == tokentype.num || - ttype == tokentype.coord || - ttype == tokentype.string - ) { - revpolish.push(i); - } else if (ttype == tokentype.name) { - parsestack.push(i); - revpolish.push(function_start); - } else if (ttype == tokentype.space) { - // ignore - continue; - } else if (ttext == ",") { - while ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].text != "(" - ) { - revpolish.push(parsestack.pop()); - } - if (parsestack.length == 0) { - // no ( -- error - errortext = scc.s_parseerrmissingopenparen; - break; - } - } else if (ttext == "(") { - parsestack.push(i); - } else if (ttext == ")") { - while ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].text != "(" - ) { - revpolish.push(parsestack.pop()); - } - if (parsestack.length == 0) { - // no ( -- error - errortext = scc.s_parseerrcloseparennoopen; - break; - } - parsestack.pop(); - if ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].type == tokentype.name - ) { - revpolish.push(parsestack.pop()); - } - } else if (ttype == tokentype.op) { - if ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].type == tokentype.name - ) { - revpolish.push(parsestack.pop()); - } - while ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].type == tokentype.op && - parseinfo[parsestack[parsestack.length - 1]].text != "(" - ) { - tprecedence = token_precedence[pii.opcode]; - tstackprecedence = - token_precedence[ - parseinfo[parsestack[parsestack.length - 1]].opcode - ]; - if (tprecedence >= 0 && tprecedence < tstackprecedence) { - break; - } else if (tprecedence < 0) { - tprecedence = -tprecedence; - if (tstackprecedence < 0) tstackprecedence = -tstackprecedence; - if (tprecedence <= tstackprecedence) { - break; - } - } - revpolish.push(parsestack.pop()); - } - parsestack.push(i); - } else if (ttype == tokentype.error) { - errortext = ttext; - break; - } else { - errortext = "Internal error while processing parsed formula. "; - break; - } - } - while (parsestack.length > 0) { - if (parseinfo[parsestack[parsestack.length - 1]].text == "(") { - errortext = scc.s_parseerrmissingcloseparen; - break; - } - revpolish.push(parsestack.pop()); - } - - if (errortext) { - return errortext; - } - - return revpolish; - }; - - // - // result = SocialCalc.Formula.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn) - // - // Execute reverse polish representation of formula - // - // Operand values are objects in the operand array with a "type" and an optional "value". - // Type can have these values (many are type and sub-type as two or more letters): - // "tw", "th", "t", "n", "nt", "coord", "range", "start", "eErrorType", "b" (blank) - // The value of a coord is in the form A57 or A57!sheetname - // The value of a range is coord|coord|number where number starts at 0 and is - // the offset of the next item to fetch if you are going through the range one by one - // The number starts as a null string ("A1|B3|") - // - - SocialCalc.Formula.EvaluatePolish = function ( - parseinfo, - revpolish, - sheet, - allowrangereturn - ) { - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var lookup_result_type = scf.LookupResultType; - var typelookup = scf.TypeLookupTable; - var operand_as_number = scf.OperandAsNumber; - var operand_as_text = scf.OperandAsText; - var operand_value_and_type = scf.OperandValueAndType; - var operands_as_coord_on_sheet = scf.OperandsAsCoordOnSheet; - var format_number_for_display = - SocialCalc.format_number_for_display || - function (v, t, f) { - return v + ""; - }; - - var errortext = ""; - var function_start = -1; - var missingOperandError = { - value: "", - type: "e#VALUE!", - error: scc.s_parseerrmissingoperand, - }; - var value; - - var operand = []; - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - var i, - rii, - prii, - ttype, - ttext, - value1, - value2, - tostype, - tostype2, - resulttype, - valuetype, - cond, - vmatch, - smatch; - - if (!parseinfo.length || !(revpolish instanceof Array)) { - return { - value: "", - type: "e#VALUE!", - error: typeof revpolish == "string" ? revpolish : "", - }; - } - - for (i = 0; i < revpolish.length; i++) { - rii = revpolish[i]; - if (rii == function_start) { - // Remember the start of a function argument list - PushOperand("start", 0); - continue; - } - - prii = parseinfo[rii]; - ttype = prii.type; - ttext = prii.text; - - if (ttype == tokentype.num) { - PushOperand("n", ttext - 0); - } else if (ttype == tokentype.coord) { - PushOperand("coord", ttext); - } else if (ttype == tokentype.string) { - PushOperand("t", ttext); - } else if (ttype == tokentype.op) { - if (operand.length <= 0) { - // Nothing on the stack... - return missingOperandError; - break; // done - } - - // Unary minus - - if (ttext == "M") { - value1 = operand_as_number(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.unaryminus - ); - PushOperand(resulttype, -value1.value); - } - - // Unary plus - else if (ttext == "P") { - value1 = operand_as_number(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.unaryplus - ); - PushOperand(resulttype, value1.value); - } - - // Unary % - percent, left associative - else if (ttext == "%") { - value1 = operand_as_number(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.unarypercent - ); - PushOperand(resulttype, 0.01 * value1.value); - } - - // & - string concatenate - else if (ttext == "&") { - if (operand.length <= 1) { - // Need at least two things on the stack... - return missingOperandError; - } - value2 = operand_as_text(sheet, operand); - value1 = operand_as_text(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.concat - ); - PushOperand(resulttype, value1.value + value2.value); - } - - // : - Range constructor - else if (ttext == ":") { - if (operand.length <= 1) { - // Need at least two things on the stack... - return missingOperandError; - } - value1 = scf.OperandsAsRangeOnSheet(sheet, operand); // get coords even if use name on other sheet - if (value1.error) { - // not available - errortext = errortext || value1.error; - } - PushOperand(value1.type, value1.value); // push sheetname with range on that sheet - } - - // ! - sheetname!coord - else if (ttext == "!") { - if (operand.length <= 1) { - // Need at least two things on the stack... - return missingOperandError; - } - value1 = operands_as_coord_on_sheet(sheet, operand); // get coord even if name on other sheet - if (value1.error) { - // not available - errortext = errortext || value1.error; - } - PushOperand(value1.type, value1.value); // push sheetname with coord or range on that sheet - } - - // Comparison operators: < L = G > N (< <= = >= > <>) - else if ( - ttext == "<" || - ttext == "L" || - ttext == "=" || - ttext == "G" || - ttext == ">" || - ttext == "N" - ) { - if (operand.length <= 1) { - // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_value_and_type(sheet, operand); - value1 = operand_value_and_type(sheet, operand); - if (value1.type.charAt(0) == "n" && value2.type.charAt(0) == "n") { - // compare two numbers - cond = 0; - if (ttext == "<") { - cond = value1.value < value2.value ? 1 : 0; - } else if (ttext == "L") { - cond = value1.value <= value2.value ? 1 : 0; - } else if (ttext == "=") { - cond = value1.value == value2.value ? 1 : 0; - } else if (ttext == "G") { - cond = value1.value >= value2.value ? 1 : 0; - } else if (ttext == ">") { - cond = value1.value > value2.value ? 1 : 0; - } else if (ttext == "N") { - cond = value1.value != value2.value ? 1 : 0; - } - PushOperand("nl", cond); - } else if (value1.type.charAt(0) == "e") { - // error on left - PushOperand(value1.type, 0); - } else if (value2.type.charAt(0) == "e") { - // error on right - PushOperand(value2.type, 0); - } else { - // text maybe mixed with numbers or blank - tostype = value1.type.charAt(0); - tostype2 = value2.type.charAt(0); - if (tostype == "n") { - value1.value = format_number_for_display(value1.value, "n", ""); - } else if (tostype == "b") { - value1.value = ""; - } - if (tostype2 == "n") { - value2.value = format_number_for_display(value2.value, "n", ""); - } else if (tostype2 == "b") { - value2.value = ""; - } - cond = 0; - value1.value = value1.value.toLowerCase(); // ignore case - value2.value = value2.value.toLowerCase(); - if (ttext == "<") { - cond = value1.value < value2.value ? 1 : 0; - } else if (ttext == "L") { - cond = value1.value <= value2.value ? 1 : 0; - } else if (ttext == "=") { - cond = value1.value == value2.value ? 1 : 0; - } else if (ttext == "G") { - cond = value1.value >= value2.value ? 1 : 0; - } else if (ttext == ">") { - cond = value1.value > value2.value ? 1 : 0; - } else if (ttext == "N") { - cond = value1.value != value2.value ? 1 : 0; - } - PushOperand("nl", cond); - } - } - - // Normal infix arithmethic operators: +, -. *, /, ^ - else { - // what's left are the normal infix arithmetic operators - if (operand.length <= 1) { - // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_as_number(sheet, operand); - value1 = operand_as_number(sheet, operand); - if (ttext == "+") { - resulttype = lookup_result_type( - value1.type, - value2.type, - typelookup.plus - ); - PushOperand(resulttype, value1.value + value2.value); - } else if (ttext == "-") { - resulttype = lookup_result_type( - value1.type, - value2.type, - typelookup.plus - ); - PushOperand(resulttype, value1.value - value2.value); - } else if (ttext == "*") { - resulttype = lookup_result_type( - value1.type, - value2.type, - typelookup.plus - ); - PushOperand(resulttype, value1.value * value2.value); - } else if (ttext == "/") { - if (value2.value != 0) { - PushOperand("n", value1.value / value2.value); // gives plain numeric result type - } else { - PushOperand("e#DIV/0!", 0); - } - } else if (ttext == "^") { - value1.value = Math.pow(value1.value, value2.value); - value1.type = "n"; // gives plain numeric result type - if (isNaN(value1.value)) { - value1.value = 0; - value1.type = "e#NUM!"; - } - PushOperand(value1.type, value1.value); - } - } - } - - // function or name - else if (ttype == tokentype.name) { - errortext = scf.CalculateFunction(ttext, operand, sheet); - if (errortext) break; - } else { - errortext = - scc.s_InternalError + "Unknown token " + ttype + " (" + ttext + "). "; - break; - } - } - - // look at final value and handle special cases - - value = operand[0] ? operand[0].value : ""; - tostype = operand[0] ? operand[0].type : ""; - - if (tostype == "name") { - // name - expand it - value1 = SocialCalc.Formula.LookupName(sheet, value); - value = value1.value; - tostype = value1.type; - errortext = errortext || value1.error; - } - - if (tostype == "coord") { - // the value is a coord reference, get its value and type - value1 = operand_value_and_type(sheet, operand); - value = value1.value; - tostype = value1.type; - if (tostype == "b") { - tostype = "n"; - value = 0; - } - } - - if (operand.length > 1 && !errortext) { - // something left - error - errortext += scc.s_parseerrerrorinformula; - } - - // set return type - - valuetype = tostype; - - if (tostype.charAt(0) == "e") { - // error value - errortext = - errortext || tostype.substring(1) || scc.s_calcerrerrorvalueinformula; - } else if (tostype == "range") { - vmatch = value.match(/^(.*)\|(.*)\|/); - smatch = vmatch[1].indexOf("!"); - if (smatch >= 0) { - // swap sheetname - vmatch[1] = - vmatch[1].substring(smatch + 1) + - "!" + - vmatch[1].substring(0, smatch).toUpperCase(); - } else { - vmatch[1] = vmatch[1].toUpperCase(); - } - value = vmatch[1] + ":" + vmatch[2].toUpperCase(); - if (!allowrangereturn) { - errortext = scc.s_formularangeresult + " " + value; - } - } - - if (errortext && valuetype.charAt(0) != "e") { - value = errortext; - valuetype = "e"; - } - - // look for overflow - - if (valuetype.charAt(0) == "n" && (isNaN(value) || !isFinite(value))) { - value = 0; - valuetype = "e#NUM!"; - errortext = isNaN(value) - ? scc.s_calcerrnumericnan - : scc.s_calcerrnumericoverflow; - } - - return { value: value, type: valuetype, error: errortext }; - }; - - /* -# -# resulttype = SocialCalc.Formula.LookupResultType(type1, type2, typelookup); -# -# typelookup has values of the following form: -# -# typelookup{"typespec1"} = "|typespec2A:resultA|typespec2B:resultB|..." -# -# First type1 is looked up. If no match, then the first letter (major type) of type1 plus "*" is looked up -# resulttype is type1 if result is "1", type2 if result is "2", otherwise the value of result. -# -*/ - - SocialCalc.Formula.LookupResultType = function (type1, type2, typelookup) { - var pos1, pos2, result; - - var table1 = typelookup[type1]; - - if (!table1) { - table1 = typelookup[type1.charAt(0) + "*"]; - if (!table1) { - return ( - "e#VALUE! (internal error, missing LookupResultType " + - type1.charAt(0) + - "*)" - ); // missing from table -- please add it - } - } - pos1 = table1.indexOf("|" + type2 + ":"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1 + 1); - if (pos2 < 0) - return ( - "e#VALUE! (internal error, incorrect LookupResultType " + table1 + ")" - ); - result = table1.substring(pos1 + type2.length + 2, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - pos1 = table1.indexOf("|" + type2.charAt(0) + "*:"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1 + 1); - if (pos2 < 0) - return ( - "e#VALUE! (internal error, incorrect LookupResultType " + table1 + ")" - ); - result = table1.substring(pos1 + 4, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - return "e#VALUE!"; - }; - - /* -# -# operandinfo = SocialCalc.Formula.TopOfStackValueAndType(sheet, operand) -# -# Returns top of stack value and type and then pops the stack. -# The result is {value: value, type: type, error: "only if bad error"} -# -*/ - - SocialCalc.Formula.TopOfStackValueAndType = function (sheet, operand) { - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - if (!stacklen) { - // make sure something is there - result.error = - SocialCalc.Constants.s_InternalError + "no operand on stack"; - return result; - } - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - return result; - }; - - /* -# -# operandinfo = OperandAsNumber(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns numeric value and type. -# Text values are treated as 0 if they can't be converted somehow. -# -*/ - - SocialCalc.Formula.OperandAsNumber = function (sheet, operand) { - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "n") { - operandinfo.value = operandinfo.value - 0; - } else if (t == "b") { - // blank cell - operandinfo.type = "n"; - operandinfo.value = 0; - } else if (t == "e") { - // error - operandinfo.value = 0; - } else { - valueinfo = SocialCalc.DetermineValueType - ? SocialCalc.DetermineValueType(operandinfo.value) - : { value: operandinfo.value - 0, type: "n" }; // if without rest of SocialCalc - if (valueinfo.type.charAt(0) == "n") { - operandinfo.value = valueinfo.value - 0; - operandinfo.type = valueinfo.type; - } else { - operandinfo.value = 0; - operandinfo.type = valueinfo.type; - } - } - - return operandinfo; - }; - - /* -# -# operandinfo = OperandAsText(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns text value, preserving sub-type. -# -*/ - - SocialCalc.Formula.OperandAsText = function (sheet, operand) { - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "t") { - // any flavor of text returns as is - } else if (t == "n") { - operandinfo.value = SocialCalc.format_number_for_display - ? SocialCalc.format_number_for_display( - operandinfo.value, - operandinfo.type, - "" - ) - : (operandinfo.value = operandinfo.value + ""); - operandinfo.type = "t"; - } else if (t == "b") { - // blank - operandinfo.value = ""; - operandinfo.type = "t"; - } else if (t == "e") { - // error - operandinfo.value = ""; - } else { - operand.value = operandinfo.value + ""; - operand.type = "t"; - } - - return operandinfo; - }; - - /* -# -# result = SocialCalc.Formula.OperandValueAndType(sheet, operand) -# -# Pops the top of stack and returns it, following a coord reference if necessary. -# The result is {value: value, type: type, error: "only if bad error"} -# Ranges are returned as if they were pushed onto the stack first coord first -# Also sets type with "t", "n", "th", etc., as appropriate -# -*/ - - SocialCalc.Formula.OperandValueAndType = function (sheet, operand) { - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - if (!stacklen) { - // make sure something is there - result.error = - SocialCalc.Constants.s_InternalError + "no operand on stack"; - return result; - } - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - if (result.type == "range") { - result = scf.StepThroughRangeDown(operand, result.value); - } - - if (result.type == "coord") { - // value is a coord reference - coordsheet = sheet; - pos = result.value.indexOf("!"); - if (pos != -1) { - // sheet reference - coordsheet = scf.FindInSheetCache(result.value.substring(pos + 1)); // get other sheet - if (coordsheet == null) { - // unavailable - result.type = "e#REF!"; - result.error = - SocialCalc.Constants.s_sheetunavailable + - " " + - result.value.substring(pos + 1); - result.value = 0; - return result; - } - result.value = result.value.substring(0, pos); // get coord part - } - - if (coordsheet) { - cell = coordsheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - cellvtype = cell.valuetype; // get type of value in the cell it points to - result.value = cell.datavalue; - } else { - cellvtype = "b"; - } - } else { - cellvtype = "e#N/A"; - result.value = 0; - } - result.type = cellvtype || "b"; - if (result.type == "b") { - // blank - result.value = 0; - } - } - - return result; - }; - - /* -# -# operandinfo = SocialCalc.Formula.OperandAsCoord(sheet, operand) -# -# Gets top of stack and pops it. -# Returns coord value. All others are treated as an error. -# -*/ - - SocialCalc.Formula.OperandAsCoord = function (sheet, operand) { - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - result = SocialCalc.Formula.LookupName(sheet, result.value); - } - if (result.type == "coord") { - // value is a coord reference - return result; - } else { - result.value = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - return result; - } - }; - - /* -# -# result = SocialCalc.Formula.OperandsAsCoordOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as sheetname!coord-or-name. -# Returns stack-style coord value (coord!sheetname, or coord!sheetname|coord|) with -# a type of coord or range. All others are treated as an error. -# If sheetname not available, sets result.error. -# -*/ - - SocialCalc.Formula.OperandsAsCoordOnSheet = function (sheet, operand) { - var sheetname, othersheet, pos1, pos2; - var value1 = {}; - var result = {}; - var scf = SocialCalc.Formula; - - var stacklen = operand.length; - value1.value = operand[stacklen - 1].value; // get top of stack - coord or name - value1.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - sheetname = scf.OperandAsSheetName(sheet, operand); // get sheetname as text - othersheet = scf.FindInSheetCache(sheetname.value); - if (othersheet == null) { - // unavailable - result.type = "e#REF!"; - result.value = 0; - result.error = - SocialCalc.Constants.s_sheetunavailable + " " + sheetname.value; - return result; - } - - if (value1.type == "name") { - value1 = scf.LookupName(othersheet, value1.value); - } - result.type = value1.type; - if (value1.type == "coord") { - // value is a coord reference - result.value = value1.value + "!" + sheetname.value; // return in the format as used on stack - } else if (value1.type == "range") { - // value is a range reference - pos1 = value1.value.indexOf("|"); - pos2 = value1.value.indexOf("|", pos1 + 1); - result.value = - value1.value.substring(0, pos1) + - "!" + - sheetname.value + - "|" + - value1.value.substring(pos1 + 1, pos2) + - "|"; - } else if (value1.type.charAt(0) == "e") { - result.value = value1.value; - } else { - result.error = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - result.value = 0; - } - return result; - }; - - /* -# -# result = SocialCalc.Formula.OperandsAsRangeOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as coord2-or-name:coord1. -# Name is evaluated on sheet of coord1. -# Returns result with "value" of stack-style range value (coord!sheetname|coord|) and -# "type" of "range". All others are treated as an error. -# -*/ - - SocialCalc.Formula.OperandsAsRangeOnSheet = function (sheet, operand) { - var value1, othersheet, pos1, pos2; - var value2 = {}; - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var stacklen = operand.length; - value2.value = operand[stacklen - 1].value; // get top of stack - coord or name for "right" side - value2.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - value1 = scf.OperandAsCoord(sheet, operand); // get "left" coord - if (value1.type != "coord") { - // not a coord, which it must be - return { value: 0, type: "e#REF!" }; - } - - othersheet = sheet; - pos1 = value1.value.indexOf("!"); - if (pos1 != -1) { - // sheet reference - pos2 = value1.value.indexOf("|", pos1 + 1); - if (pos2 < 0) pos2 = value1.value.length; - othersheet = scf.FindInSheetCache(value1.value.substring(pos1 + 1, pos2)); // get other sheet - if (othersheet == null) { - // unavailable - return { - value: 0, - type: "e#REF!", - errortext: - scc.s_sheetunavailable + - " " + - value1.value.substring(pos1 + 1, pos2), - }; - } - } - - if (value2.type == "name") { - // coord:name is allowed, if name is just one cell - value2 = scf.LookupName(othersheet, value2.value); - } - - if (value2.type == "coord") { - // value is a coord reference, so return the combined range - return { value: value1.value + "|" + value2.value + "|", type: "range" }; // return range in the format as used on stack - } else { - // bad form - return { value: scc.s_calcerrcellrefmissing, type: "e#REF!" }; - } - }; - - /* -# -# result = SocialCalc.Formula.OperandAsSheetName(sheet, operand) -# -# Gets top of stack and pops it. -# Returns sheetname value. All others are treated as an error. -# Accepts text, cell reference, and named value which is one of those two. -# -*/ - - SocialCalc.Formula.OperandAsSheetName = function (sheet, operand) { - var nvalue, cell; - - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - nvalue = SocialCalc.Formula.LookupName(sheet, result.value); - if (!nvalue.value) { - // not a known name - return bare name as the name value - return result; - } - result.value = nvalue.value; - result.type = nvalue.type; - } - if (result.type == "coord") { - // value is a coord reference, follow it to find sheet name - cell = sheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - result.value = cell.datavalue; - result.type = cell.valuetype; - } else { - result.value = ""; - result.type = "b"; - } - } - if (result.type.charAt(0) == "t") { - // value is a string which could be a sheet name - return result; - } else { - result.value = ""; - result.error = SocialCalc.Constants.s_calcerrsheetnamemissing; - return result; - } - }; - - // - // value = SocialCalc.Formula.LookupName(sheet, name) - // - // Returns value and type of a named value - // Names are case insensitive - // Names may have a definition which is a coord (A1), a range (A1:B7), or a formula (=OFFSET(A1,0,0,5,1)) - // Note: The range must not have sheet names ("!") in them. - // - - SocialCalc.Formula.LookupName = function (sheet, name) { - var pos, specialc, parseinfo; - var names = sheet.names; - var value = {}; - var startedwalk = false; - - if (names[name.toUpperCase()]) { - // is name defined? - - value.value = names[name.toUpperCase()].definition; // yes - - if (value.value.charAt(0) == "=") { - // formula - if (!sheet.checknamecirc) { - // are we possibly walking the name tree? - sheet.checknamecirc = {}; // not yet - startedwalk = true; // remember we are the reference that started it - } else { - if (sheet.checknamecirc[name]) { - // circular reference - value.type = "e#NAME?"; - value.error = - SocialCalc.Constants.s_circularnameref + ' "' + name + '".'; - return value; - } - } - sheet.checknamecirc[name] = true; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens( - value.value.substring(1) - ); - value = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, 1); // parse formula, allowing range return - - delete sheet.checknamecirc[name]; // done with us - if (startedwalk) { - delete sheet.checknamecirc; // done with walk - } - - if (value.type != "range") { - return value; - } - } - - pos = value.value.indexOf(":"); - if (pos != -1) { - // range - value.type = "range"; - value.value = - value.value.substring(0, pos) + - "|" + - value.value.substring(pos + 1) + - "|"; - value.value = value.value.toUpperCase(); - } else { - value.type = "coord"; - value.value = value.value.toUpperCase(); - } - return value; - } else if ( - (specialc = SocialCalc.Formula.SpecialConstants[name.toUpperCase()]) - ) { - // special constant, like #REF! - pos = specialc.indexOf(","); - value.value = specialc.substring(0, pos) - 0; - value.type = specialc.substring(pos + 1); - return value; - } else { - value.value = ""; - value.type = "e#NAME?"; - value.error = - SocialCalc.Constants.s_calcerrunknownname + ' "' + name + '"'; - return value; - } - }; - - /* -# -# coord = SocialCalc.Formula.StepThroughRangeDown(operand, rangevalue) -# -# Returns next coord in a range, keeping track on the operand stack -# Goes from upper left across and down to bottom right. -# -*/ - - SocialCalc.Formula.StepThroughRangeDown = function (operand, rangevalue) { - var value1, value2, sequence, pos1, pos2, sheet1, rp, c, r, count; - var scf = SocialCalc.Formula; - - pos1 = rangevalue.indexOf("|"); - pos2 = rangevalue.indexOf("|", pos1 + 1); - value1 = rangevalue.substring(0, pos1); - value2 = rangevalue.substring(pos1 + 1, pos2); - sequence = rangevalue.substring(pos2 + 1) - 0; - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1); - value1 = value1.substring(0, pos1); - } else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - rp = scf.OrderRangeParts(value1, value2); - - count = 0; - for (r = rp.r1; r <= rp.r2; r++) { - for (c = rp.c1; c <= rp.c2; c++) { - count++; - if (count > sequence) { - if (r != rp.r2 || c != rp.c2) { - // keep on stack until done - scf.PushOperand( - operand, - "range", - value1 + sheet1 + "|" + value2 + "|" + count - ); - } - return { value: SocialCalc.crToCoord(c, r) + sheet1, type: "coord" }; - } - } - } - }; - - /* -# -# result = SocialCalc.Formula.DecodeRangeParts(sheetdata, range) -# -# Returns sheetdata for the sheet where the range is, as well as -# the number of the first column in the range, the number of columns, -# and equivalent row information: -# -# {sheetdata: sheet, sheetname: name-or-"", col1num: n, ncols: n, row1num: n, nrows: n} -# -# If any errors, a null result is returned. -# -*/ - - SocialCalc.Formula.DecodeRangeParts = function (sheetdata, range) { - var value1, value2, pos1, pos2, sheet1, coordsheetdata, rp; - - var scf = SocialCalc.Formula; - - pos1 = range.indexOf("|"); - pos2 = range.indexOf("|", pos1 + 1); - value1 = range.substring(0, pos1); - value2 = range.substring(pos1 + 1, pos2); - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1 + 1); - value1 = value1.substring(0, pos1); - } else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - coordsheetdata = sheetdata; - if (sheet1) { - // sheet reference - coordsheetdata = scf.FindInSheetCache(sheet1); - if (coordsheetdata == null) { - // unavailable - return null; - } - } - - rp = scf.OrderRangeParts(value1, value2); - - return { - sheetdata: coordsheetdata, - sheetname: sheet1, - col1num: rp.c1, - ncols: rp.c2 - rp.c1 + 1, - row1num: rp.r1, - nrows: rp.r2 - rp.r1 + 1, - }; - }; - - //********************* - // - // Function Handling - // - //********************* - - // List of functions -- Define after functions are defined - // - // SocialCalc.Formula.FunctionList["function_name"] = [function_subroutine, number_of_arguments, arg_def, func_def, func_class] - // function_subroutine takes arguments (fname, operand, foperand, sheet), returns - // errortext or null, pushing result on operand stack. - // number_of_arguments is: - // 0 = no arguments - // >0 = exactly that many arguments - // <0 = that many arguments (abs value) or more - // 100 = don't check - // - // arg_def, if present, is the name of the element in SocialCalc.Formula.FunctionArgDefs. - // func_def, if present, is a string explaining the function. If not, looked up in SocialCalc.Constants. - // func_class, if present, is the comma-separated names of the elements in SocialCalc.Formula.FunctionClasses. - // - // To add a function, just add it to this object. - - if (!SocialCalc.Formula.FunctionList) { - // make sure it is defined (could have been in another module) - SocialCalc.Formula.FunctionList = {}; - } - - // FunctionClasses[classname] = {name: full-name-string, items: [sorted list of function names]}; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionClasses = null; // start null to say needs filling in - - // FunctionArgDef[argname] = explicit-string-for-arg-list; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionArgDefs = {}; - - /* -# -# errortext = SocialCalc.Formula.CalculateFunction(fname, operand, sheet) -# -# Dispatches for function fname. -# -*/ - - SocialCalc.Formula.CalculateFunction = function (fname, operand, sheet) { - var fobj, foperand, ffunc, argnum, ttext; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = ""; - - fobj = scf.FunctionList[fname]; - - if (fobj) { - foperand = []; - ffunc = fobj[0]; - argnum = fobj[1]; - scf.CopyFunctionArgs(operand, foperand); - if (argnum != 100) { - if (argnum < 0) { - if (foperand.length < -argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } else { - if (foperand.length != argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } - } - errortext = ffunc(fname, operand, foperand, sheet); - } else { - ttext = fname; - - if (operand.length && operand[operand.length - 1].type == "start") { - // no arguments - name or zero arg function - operand.pop(); - scf.PushOperand(operand, "name", ttext); - } else { - errortext = - SocialCalc.Constants.s_sheetfuncunknownfunction + " " + ttext + ". "; - } - } - - return errortext; - }; - - // - // SocialCalc.Formula.PushOperand(operand, t, v) - // - // Pushes the type and value onto the operand stack - // - - SocialCalc.Formula.PushOperand = function (operand, t, v) { - operand.push({ type: t, value: v }); - }; - - // - // SocialCalc.Formula.CopyFunctionArgs(operand, foperand) - // - // Pops operands from operand and pushes on foperand up to function start - // reversing order in the process. - // - - SocialCalc.Formula.CopyFunctionArgs = function (operand, foperand) { - var fobj, foperand, ffunc, argnum; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = null; - - while (operand.length > 0 && operand[operand.length - 1].type != "start") { - // get each arg - foperand.push(operand.pop()); // copy it - } - operand.pop(); // get rid of "start" - - return; - }; - - // - // errortext = SocialCalc.Formula.FunctionArgsError(fname, operand) - // - // Pushes appropriate error on operand stack and returns errortext, including fname - // - - SocialCalc.Formula.FunctionArgsError = function (fname, operand) { - var errortext = - SocialCalc.Constants.s_calcerrincorrectargstofunction + - " " + - fname + - ". "; - SocialCalc.Formula.PushOperand(operand, "e#VALUE!", errortext); - - return errortext; - }; - - // - // errortext = SocialCalc.Formula.FunctionSpecificError(fname, operand, errortype, errortext) - // - // Pushes specified error and text on operand stack. - // - - SocialCalc.Formula.FunctionSpecificError = function ( - fname, - operand, - errortype, - errortext - ) { - SocialCalc.Formula.PushOperand(operand, errortype, errortext); - - return errortext; - }; - - // - // haserror = SocialCalc.Formula.CheckForErrorValue(operand, v) - // - // If v.type is an error, push it on operand stack and return true, otherwise return false. - // - - SocialCalc.Formula.CheckForErrorValue = function (operand, v) { - if (v.type.charAt(0) == "e") { - operand.push(v); - return true; - } else { - return false; - } - }; - - ///////////////////////// - // - // FUNCTION INFORMATION ROUTINES - // - - // - // SocialCalc.Formula.FillFunctionInfo() - // - // Goes through function definitions and fills out FunctionArgDefs and FunctionClasses. - // Execute this after any changes to SocialCalc.Constants but before UI is used. - // - - SocialCalc.Formula.FillFunctionInfo = function () { - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var fname, f, classes, cname, i; - - if (scf.FunctionClasses) { - // only do once - return; - } - - for (fname in scf.FunctionList) { - f = scf.FunctionList[fname]; - if (f[2]) { - // has an arg def - scf.FunctionArgDefs[f[2]] = scc["s_farg_" + f[2]] || ""; // get it from constants - } - if (!f[3]) { - // no text def, see if in constants - if (scc["s_fdef_" + fname]) { - scf.FunctionList[fname][3] = scc["s_fdef_" + fname]; - } - } - } - - scf.FunctionClasses = {}; - - for (i = 0; i < scc.function_classlist.length; i++) { - cname = scc.function_classlist[i]; - scf.FunctionClasses[cname] = { - name: scc["s_fclass_" + cname], - items: [], - }; - } - - for (fname in scf.FunctionList) { - f = scf.FunctionList[fname]; - classes = f[4] ? f[4].split(",") : []; // get classes - classes.push("all"); - for (i = 0; i < classes.length; i++) { - cname = classes[i]; - scf.FunctionClasses[cname].items.push(fname); - } - } - for (cname in scf.FunctionClasses) { - scf.FunctionClasses[cname].items.sort(); - } - }; - - // - // str = SocialCalc.Formula.FunctionArgString(fname) - // - // Returns a string representing the arguments to function fname. - // - - SocialCalc.Formula.FunctionArgString = function (fname) { - var scf = SocialCalc.Formula; - var fdata = scf.FunctionList[fname]; - var nargs, i, str; - - var adef = fdata[2]; - - if (!adef) { - nargs = fdata[1]; - if (nargs == 0) { - adef = " "; - } else if (nargs > 0) { - str = "v1"; - for (i = 2; i <= nargs; i++) { - str += ", v" + i; - } - return str; - } else if (nargs < 0) { - str = "v1"; - for (i = 2; i < -nargs; i++) { - str += ", v" + i; - } - return str + ", ..."; - } else { - return "nargs: " + nargs; - } - } - - str = scf.FunctionArgDefs[adef] || adef; - - return str; - }; - - ///////////////////////// - // - // FUNCTION DEFINITIONS - // - // The standard function definitions follow. - // - // Note that some need SocialCalc.DetermineValueType to be defined. - // - - /* -# -# AVERAGE(v1,c1:c2,...) -# COUNT(v1,c1:c2,...) -# COUNTA(v1,c1:c2,...) -# COUNTBLANK(v1,c1:c2,...) -# MAX(v1,c1:c2,...) -# MIN(v1,c1:c2,...) -# PRODUCT(v1,c1:c2,...) -# STDEV(v1,c1:c2,...) -# STDEVP(v1,c1:c2,...) -# SUM(v1,c1:c2,...) -# VAR(v1,c1:c2,...) -# VARP(v1,c1:c2,...) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the dseries_functions, too. -# -*/ - - SocialCalc.Formula.SeriesFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var value1, t, v1; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - while (foperand.length > 0) { - value1 = operand_value_and_type(sheet, foperand); - t = value1.type.charAt(0); - if (t == "n") count += 1; - if (t != "b") counta += 1; - if (t == "b") countblank += 1; - - if (t == "n") { - v1 = value1.value - 0; // get it as a number - sum += v1; - product *= v1; - maxval = maxval != undefined ? (v1 > maxval ? v1 : maxval) : v1; - minval = minval != undefined ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { - // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } else { - // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type( - value1.type, - resulttypesum || value1.type, - typelookupplus - ); - } else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "SUM": - PushOperand(resulttypesum, sum); - break; - - case "PRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "MIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "MAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "COUNT": - PushOperand("n", count); - break; - - case "COUNTA": - PushOperand("n", counta); - break; - - case "COUNTBLANK": - PushOperand("n", countblank); - break; - - case "AVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - } - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["AVERAGE"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["COUNT"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["COUNTA"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["COUNTBLANK"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["MAX"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["MIN"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["PRODUCT"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["STDEV"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["STDEVP"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["SUM"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["VAR"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["VARP"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - - /* -# -# DAVERAGE(databaserange, fieldname, criteriarange) -# DCOUNT(databaserange, fieldname, criteriarange) -# DCOUNTA(databaserange, fieldname, criteriarange) -# DGET(databaserange, fieldname, criteriarange) -# DMAX(databaserange, fieldname, criteriarange) -# DMIN(databaserange, fieldname, criteriarange) -# DPRODUCT(databaserange, fieldname, criteriarange) -# DSTDEV(databaserange, fieldname, criteriarange) -# DSTDEVP(databaserange, fieldname, criteriarange) -# DSUM(databaserange, fieldname, criteriarange) -# DVAR(databaserange, fieldname, criteriarange) -# DVARP(databaserange, fieldname, criteriarange) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the series_functions, too. -# -*/ - - SocialCalc.Formula.DSeriesFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var value1, - tostype, - cr, - dbrange, - fieldname, - criteriarange, - dbinfo, - criteriainfo; - var fieldasnum, targetcol, i, j, k, cell, criteriafieldnums; - var testok, criteriacr, criteria, testcol, testcr; - var t; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - var value1 = {}; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - dbrange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - fieldname = scf.OperandValueAndType(sheet, foperand); // get a value - criteriarange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - - if (dbrange.type != "range" || criteriarange.type != "range") { - return scf.FunctionArgsError(fname, operand); - } - - dbinfo = scf.DecodeRangeParts(sheet, dbrange.value); - criteriainfo = scf.DecodeRangeParts(sheet, criteriarange.value); - - fieldasnum = scf.FieldToColnum( - dbinfo.sheetdata, - dbinfo.col1num, - dbinfo.ncols, - dbinfo.row1num, - fieldname.value, - fieldname.type - ); - if (fieldasnum <= 0) { - PushOperand("e#VALUE!", 0); - return; - } - - targetcol = dbinfo.col1num + fieldasnum - 1; - criteriafieldnums = []; - - for (i = 0; i < criteriainfo.ncols; i++) { - // get criteria field colnums - cell = criteriainfo.sheetdata.GetAssuredCell( - SocialCalc.crToCoord(criteriainfo.col1num + i, criteriainfo.row1num) - ); - criterianum = scf.FieldToColnum( - dbinfo.sheetdata, - dbinfo.col1num, - dbinfo.ncols, - dbinfo.row1num, - cell.datavalue, - cell.valuetype - ); - if (criterianum <= 0) { - PushOperand("e#VALUE!", 0); - return; - } - criteriafieldnums.push(dbinfo.col1num + criterianum - 1); - } - - for (i = 1; i < dbinfo.nrows; i++) { - // go through each row of the database - testok = false; - CRITERIAROW: for (j = 1; j < criteriainfo.nrows; j++) { - // go through each criteria row - for (k = 0; k < criteriainfo.ncols; k++) { - // look at each column - criteriacr = SocialCalc.crToCoord( - criteriainfo.col1num + k, - criteriainfo.row1num + j - ); // where criteria is - cell = criteriainfo.sheetdata.GetAssuredCell(criteriacr); - criteria = cell.datavalue; - if (typeof criteria == "string" && criteria.length == 0) continue; // blank items are OK - testcol = criteriafieldnums[k]; - testcr = SocialCalc.crToCoord(testcol, dbinfo.row1num + i); // cell to check - cell = criteriainfo.sheetdata.GetAssuredCell(testcr); - if ( - !scf.TestCriteria(cell.datavalue, cell.valuetype || "b", criteria) - ) { - continue CRITERIAROW; // does not meet criteria - check next row - } - } - testok = true; // met all the criteria - break CRITERIAROW; - } - if (!testok) { - continue; - } - - cr = SocialCalc.crToCoord(targetcol, dbinfo.row1num + i); // get cell of this row to do the function on - cell = dbinfo.sheetdata.GetAssuredCell(cr); - - value1.value = cell.datavalue; - value1.type = cell.valuetype; - t = value1.type.charAt(0); - if (t == "n") count += 1; - if (t != "b") counta += 1; - if (t == "b") countblank += 1; - - if (t == "n") { - v1 = value1.value - 0; // get it as a number - sum += v1; - product *= v1; - maxval = maxval != undefined ? (v1 > maxval ? v1 : maxval) : v1; - minval = minval != undefined ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { - // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } else { - // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type( - value1.type, - resulttypesum || value1.type, - typelookupplus - ); - } else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "DSUM": - PushOperand(resulttypesum, sum); - break; - - case "DPRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "DMIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "DMAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "DCOUNT": - PushOperand("n", count); - break; - - case "DCOUNTA": - PushOperand("n", counta); - break; - - case "DAVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DGET": - if (count == 1) { - PushOperand(resulttypesum, sum); - } else if (count == 0) { - PushOperand("e#VALUE!", 0); - } else { - PushOperand("e#NUM!", 0); - } - break; - } - - return; - }; - - SocialCalc.Formula.FunctionList["DAVERAGE"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DCOUNT"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DCOUNTA"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DGET"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DMAX"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DMIN"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DPRODUCT"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DSTDEV"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DSTDEVP"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DSUM"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DVAR"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DVARP"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - - /* -# -# colnum = SocialCalc.Formula.FieldToColnum(sheet, col1num, ncols, row1num, fieldname, fieldtype) -# -# If fieldname is a number, uses it, otherwise looks up string in cells in row to find field number -# -# If not found, returns 0. -# -*/ - - SocialCalc.Formula.FieldToColnum = function ( - sheet, - col1num, - ncols, - row1num, - fieldname, - fieldtype - ) { - var colnum, cell, value; - - if (fieldtype.charAt(0) == "n") { - // number - return it if legal - colnum = fieldname - 0; // make sure a number - if (colnum <= 0 || colnum > ncols) { - return 0; - } - return Math.floor(colnum); - } - - if (fieldtype.charAt(0) != "t") { - // must be text otherwise - return 0; - } - - fieldname = fieldname ? fieldname.toLowerCase() : ""; - - for (colnum = 0; colnum < ncols; colnum++) { - // look through column headers for a match - cell = sheet.GetAssuredCell( - SocialCalc.crToCoord(col1num + colnum, row1num) - ); - value = cell.datavalue; - value = (value + "").toLowerCase(); // ignore case - if (value == fieldname) { - // match - return colnum + 1; - } - } - return 0; // looked at all and no match - }; - - /* -# -# HLOOKUP(value, range, row, [rangelookup]) -# VLOOKUP(value, range, col, [rangelookup]) -# MATCH(value, range, [rangelookup]) -# -*/ - - SocialCalc.Formula.LookupFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var lookupvalue, range, offset, rangelookup, offsetvalue, rangeinfo; - var c, - r, - cincr, - rincr, - previousOK, - csave, - rsave, - cell, - value, - valuetype, - cr, - lookupvalue; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - lookupvalue = operand_value_and_type(sheet, foperand); - if (typeof lookupvalue.value == "string") { - lookupvalue.value = lookupvalue.value.toLowerCase(); - } - - range = scf.TopOfStackValueAndType(sheet, foperand); - - rangelookup = 1; // default to true or 1 - if (fname == "MATCH") { - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value - 0; - } - } else { - offsetvalue = scf.OperandAsNumber(sheet, foperand); - if (offsetvalue.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - offsetvalue = Math.floor(offsetvalue.value); - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value ? 1 : 0; // convert to 1 or 0 - } - } - lookupvalue.type = lookupvalue.type.charAt(0); // only deal with general type - if (lookupvalue.type == "n") { - // if number, make sure a number - lookupvalue.value = lookupvalue.value - 0; - } - - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - rangeinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (!rangeinfo) { - PushOperand("e#REF!", 0); - return; - } - - c = 0; - r = 0; - cincr = 0; - rincr = 0; - if (fname == "HLOOKUP") { - cincr = 1; - if (offsetvalue > rangeinfo.nrows) { - PushOperand("e#REF!", 0); - return; - } - } else if (fname == "VLOOKUP") { - rincr = 1; - if (offsetvalue > rangeinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - } else if (fname == "MATCH") { - if (rangeinfo.ncols > 1) { - if (rangeinfo.nrows > 1) { - PushOperand("e#N/A", 0); - return; - } - cincr = 1; - } else { - rincr = 1; - } - } else { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (offsetvalue < 1 && fname != "MATCH") { - PushOperand("e#VALUE!", 0); - return 0; - } - - previousOK; // if 1, previous test was <. If 2, also this one wasn't - - while (1) { - cr = SocialCalc.crToCoord(rangeinfo.col1num + c, rangeinfo.row1num + r); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype ? cell.valuetype.charAt(0) : "b"; // only deal with general types - if (valuetype == "n") { - value = value - 0; // make sure number - } - if (rangelookup) { - // rangelookup type 1 or -1: look for within brackets for matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { - // match - break; - } - if ( - (rangelookup > 0 && lookupvalue.value > value) || - (rangelookup < 0 && lookupvalue.value < value) - ) { - // possible match: wait and see - previousOK = 1; - csave = c; // remember col and row of last OK - rsave = r; - } else if (previousOK) { - // last one was OK, this one isn't - previousOK = 2; - break; - } - } else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { - // match - break; - } - if ( - (rangelookup > 0 && lookupvalue.value > value) || - (rangelookup < 0 && lookupvalue.value < value) - ) { - // possible match: wait and see - previousOK = 1; - csave = c; - rsave = r; - } else if (previousOK) { - // last one was OK, this one isn't - previousOK = 2; - break; - } - } - } else { - // exact value matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { - // match - break; - } - } else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { - // match - break; - } - } - } - - r += rincr; - c += cincr; - if (r >= rangeinfo.nrows || c >= rangeinfo.ncols) { - // end of range to check, no exact match - if (previousOK) { - // at least one could have been OK - previousOK = 2; - break; - } - PushOperand("e#N/A", 0); - return; - } - } - - if (previousOK == 2) { - // back to last OK - r = rsave; - c = csave; - } - - if (fname == "MATCH") { - value = c + r + 1; // only one may be <> 0 - valuetype = "n"; - } else { - cr = SocialCalc.crToCoord( - rangeinfo.col1num + c + (fname == "VLOOKUP" ? offsetvalue - 1 : 0), - rangeinfo.row1num + r + (fname == "HLOOKUP" ? offsetvalue - 1 : 0) - ); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype; - } - PushOperand(valuetype, value); - - return; - }; - - SocialCalc.Formula.FunctionList["HLOOKUP"] = [ - SocialCalc.Formula.LookupFunctions, - -3, - "hlookup", - "", - "lookup", - ]; - SocialCalc.Formula.FunctionList["MATCH"] = [ - SocialCalc.Formula.LookupFunctions, - -2, - "match", - "", - "lookup", - ]; - SocialCalc.Formula.FunctionList["VLOOKUP"] = [ - SocialCalc.Formula.LookupFunctions, - -3, - "vlookup", - "", - "lookup", - ]; - - /* -# -# INDEX(range, rownum, colnum) -# -*/ - - SocialCalc.Formula.IndexFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var range, sheetname, indexinfo, rowindex, colindex, result, resulttype; - - var scf = SocialCalc.Formula; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - indexinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (indexinfo.sheetname) { - sheetname = "!" + indexinfo.sheetname; - } else { - sheetname = ""; - } - - rowindex = { value: 0 }; - colindex = { value: 0 }; - - if (foperand.length) { - // look for row number - rowindex = scf.OperandAsNumber(sheet, foperand); - if (rowindex.type.charAt(0) != "n" || rowindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - // look for col number - colindex = scf.OperandAsNumber(sheet, foperand); - if (colindex.type.charAt(0) != "n" || colindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - } else { - // col number missing - if (indexinfo.nrows == 1) { - // if only one row, then rowindex is really colindex - colindex.value = rowindex.value; - rowindex.value = 0; - } - } - } - - if (rowindex.value > indexinfo.nrows || colindex.value > indexinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - - if (rowindex.value == 0) { - if (colindex.value == 0) { - if (indexinfo.nrows == 1 && indexinfo.ncols == 1) { - result = - SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + - sheetname; - resulttype = "coord"; - } else { - result = - SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + - sheetname + - "|" + - SocialCalc.crToCoord( - indexinfo.col1num + indexinfo.ncols - 1, - indexinfo.row1num + indexinfo.nrows - 1 - ) + - "|"; - resulttype = "range"; - } - } else { - if (indexinfo.nrows == 1) { - result = - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num - ) + sheetname; - resulttype = "coord"; - } else { - result = - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num - ) + - sheetname + - "|" + - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num + indexinfo.nrows - 1 - ) + - "|"; - resulttype = "range"; - } - } - } else { - if (colindex.value == 0) { - if (indexinfo.ncols == 1) { - result = - SocialCalc.crToCoord( - indexinfo.col1num, - indexinfo.row1num + rowindex.value - 1 - ) + sheetname; - resulttype = "coord"; - } else { - result = - SocialCalc.crToCoord( - indexinfo.col1num, - indexinfo.row1num + rowindex.value - 1 - ) + - sheetname + - "|" + - SocialCalc.crToCoord( - indexinfo.col1num + indexinfo.ncols - 1, - indexinfo.row1num + rowindex.value - 1 - ) + - "|"; - resulttype = "range"; - } - } else { - result = - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num + rowindex.value - 1 - ) + sheetname; - resulttype = "coord"; - } - } - - PushOperand(resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["INDEX"] = [ - SocialCalc.Formula.IndexFunction, - -1, - "index", - "", - "lookup", - ]; - - /* -# -# COUNTIF(c1:c2,"criteria") -# SUMIF(c1:c2,"criteria",[range2]) -# -*/ - - SocialCalc.Formula.CountifSumifFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var range, - criteria, - sumrange, - f2operand, - result, - resulttype, - value1, - value2; - var sum = 0; - var resulttypesum = ""; - var count = 0; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range or coord - criteria = scf.OperandAsText(sheet, foperand); // get criteria - if (fname == "SUMIF") { - if (foperand.length == 1) { - // three arg form of SUMIF - sumrange = scf.TopOfStackValueAndType(sheet, foperand); - } else if (foperand.length == 0) { - // two arg form - sumrange = { value: range.value, type: range.type }; - } else { - scf.FunctionArgsError(fname, operand); - return 0; - } - } else { - sumrange = { value: range.value, type: range.type }; - } - - if (criteria.type.charAt(0) == "n") { - criteria.value = criteria.value + ""; // make text - } else if (criteria.type.charAt(0) == "e") { - // error - criteria.value = null; - } else if (criteria.type.charAt(0) == "b") { - // blank here is undefined - criteria.value = null; - } - - if (range.type != "coord" && range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - if ( - fname == "SUMIF" && - sumrange.type != "coord" && - sumrange.type != "range" - ) { - scf.FunctionArgsError(fname, operand); - return 0; - } - - foperand.push(range); - f2operand = []; // to allow for 3 arg form - f2operand.push(sumrange); - - while (foperand.length) { - value1 = operand_value_and_type(sheet, foperand); - value2 = operand_value_and_type(sheet, f2operand); - - if (!scf.TestCriteria(value1.value, value1.type, criteria.value)) { - continue; - } - - count += 1; - - if (value2.type.charAt(0) == "n") { - sum += value2.value - 0; - resulttypesum = lookup_result_type( - value2.type, - resulttypesum || value2.type, - typelookupplus - ); - } else if ( - value2.type.charAt(0) == "e" && - resulttypesum.charAt(0) != "e" - ) { - resulttypesum = value2.type; - } - } - - resulttypesum = resulttypesum || "n"; - - if (fname == "SUMIF") { - PushOperand(resulttypesum, sum); - } else if (fname == "COUNTIF") { - PushOperand("n", count); - } - - return; - }; - - SocialCalc.Formula.FunctionList["COUNTIF"] = [ - SocialCalc.Formula.CountifSumifFunctions, - 2, - "rangec", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["SUMIF"] = [ - SocialCalc.Formula.CountifSumifFunctions, - -2, - "sumif", - "", - "stat", - ]; - - /* -# -# IF(cond,truevalue,falsevalue) -# -*/ - - SocialCalc.Formula.IfFunction = function (fname, operand, foperand, sheet) { - var cond, t; - - cond = SocialCalc.Formula.OperandValueAndType(sheet, foperand); - t = cond.type.charAt(0); - if (t != "n" && t != "b") { - operand.push({ type: "e#VALUE!", value: 0 }); - return; - } - - if (!cond.value) foperand.pop(); - operand.push(foperand.pop()); - if (cond.value) foperand.pop(); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["IF"] = [ - SocialCalc.Formula.IfFunction, - 3, - "iffunc", - "", - "test", - ]; - - /* -# -# DATE(year,month,day) -# -*/ - - SocialCalc.Formula.DateFunction = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var year = scf.OperandAsNumber(sheet, foperand); - var month = scf.OperandAsNumber(sheet, foperand); - var day = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - year.type, - month.type, - scf.TypeLookupTable.twoargnumeric - ); - resulttype = scf.LookupResultType( - resulttype, - day.type, - scf.TypeLookupTable.twoargnumeric - ); - if (resulttype.charAt(0) == "n") { - result = - SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - Math.floor(year.value), - Math.floor(month.value), - Math.floor(day.value) - ) - SocialCalc.FormatNumber.datevalues.julian_offset; - resulttype = "nd"; - } - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["DATE"] = [ - SocialCalc.Formula.DateFunction, - 3, - "date", - "", - "datetime", - ]; - - /* -# -# TIME(hour,minute,second) -# -*/ - - SocialCalc.Formula.TimeFunction = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var hours = scf.OperandAsNumber(sheet, foperand); - var minutes = scf.OperandAsNumber(sheet, foperand); - var seconds = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - hours.type, - minutes.type, - scf.TypeLookupTable.twoargnumeric - ); - resulttype = scf.LookupResultType( - resulttype, - seconds.type, - scf.TypeLookupTable.twoargnumeric - ); - if (resulttype.charAt(0) == "n") { - result = - (hours.value * 60 * 60 + minutes.value * 60 + seconds.value) / - (24 * 60 * 60); - resulttype = "nt"; - } - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["TIME"] = [ - SocialCalc.Formula.TimeFunction, - 3, - "hms", - "", - "datetime", - ]; - - /* -# -# DAY(date) -# MONTH(date) -# YEAR(date) -# WEEKDAY(date, [type]) -# -*/ - - SocialCalc.Formula.DMYFunctions = function (fname, operand, foperand, sheet) { - var ymd, dtype, doffset; - var scf = SocialCalc.Formula; - var result = 0; - - var datevalue = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - datevalue.type, - datevalue.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (resulttype.charAt(0) == "n") { - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian( - Math.floor( - datevalue.value + SocialCalc.FormatNumber.datevalues.julian_offset - ) - ); - switch (fname) { - case "DAY": - result = ymd.day; - break; - - case "MONTH": - result = ymd.month; - break; - - case "YEAR": - result = ymd.year; - break; - - case "WEEKDAY": - dtype = { value: 1 }; - if (foperand.length) { - // get type if present - dtype = scf.OperandAsNumber(sheet, foperand); - if ( - dtype.type.charAt(0) != "n" || - dtype.value < 1 || - dtype.value > 3 - ) { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { - // extra args - scf.FunctionArgsError(fname, operand); - return; - } - } - doffset = 6; - if (dtype.value > 1) { - doffset -= 1; - } - result = - (Math.floor(datevalue.value + doffset) % 7) + - (dtype.value < 3 ? 1 : 0); - break; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["DAY"] = [ - SocialCalc.Formula.DMYFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["MONTH"] = [ - SocialCalc.Formula.DMYFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["YEAR"] = [ - SocialCalc.Formula.DMYFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["WEEKDAY"] = [ - SocialCalc.Formula.DMYFunctions, - -1, - "weekday", - "", - "datetime", - ]; - - /* -# -# HOUR(datetime) -# MINUTE(datetime) -# SECOND(datetime) -# -*/ - - SocialCalc.Formula.HMSFunctions = function (fname, operand, foperand, sheet) { - var hours, minutes, seconds, fraction; - var scf = SocialCalc.Formula; - var result = 0; - - var datetime = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - datetime.type, - datetime.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (resulttype.charAt(0) == "n") { - if (datetime.value < 0) { - scf.PushOperand(operand, "e#NUM!", 0); // must be non-negative - return; - } - fraction = datetime.value - Math.floor(datetime.value); // fraction of a day - fraction *= 24; - hours = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - minutes = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - seconds = Math.floor(fraction + (datetime.value >= 0 ? 0.5 : -0.5)); - if (fname == "HOUR") { - result = hours; - } else if (fname == "MINUTE") { - result = minutes; - } else if (fname == "SECOND") { - result = seconds; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["HOUR"] = [ - SocialCalc.Formula.HMSFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["MINUTE"] = [ - SocialCalc.Formula.HMSFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["SECOND"] = [ - SocialCalc.Formula.HMSFunctions, - 1, - "v", - "", - "datetime", - ]; - - /* -# -# EXACT(v1,v2) -# -*/ - - SocialCalc.Formula.ExactFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value1 = scf.OperandValueAndType(sheet, foperand); - var v1type = value1.type.charAt(0); - var value2 = scf.OperandValueAndType(sheet, foperand); - var v2type = value2.type.charAt(0); - - if (v1type == "t") { - if (v2type == "t") { - result = value1.value == value2.value ? 1 : 0; - } else if (v2type == "b") { - result = value1.value.length ? 0 : 1; - } else if (v2type == "n") { - result = value1.value == value2.value + "" ? 1 : 0; - } else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } else { - result = 0; - } - } else if (v1type == "n") { - if (v2type == "n") { - result = value1.value - 0 == value2.value - 0 ? 1 : 0; - } else if (v2type == "b") { - result = 0; - } else if (v2type == "t") { - result = value1.value + "" == value2.value ? 1 : 0; - } else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } else { - result = 0; - } - } else if (v1type == "b") { - if (v2type == "t") { - result = value2.value.length ? 0 : 1; - } else if (v2type == "b") { - result = 1; - } else if (v2type == "n") { - result = 0; - } else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } else { - result = 0; - } - } else if (v1type == "e") { - result = value1.value; - resulttype = value1.type; - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["EXACT"] = [ - SocialCalc.Formula.ExactFunction, - 2, - "", - "", - "text", - ]; - - /* -# -# FIND(key,string,[start]) -# LEFT(string,[length]) -# LEN(string) -# LOWER(string) -# MID(string,start,length) -# PROPER(string) -# REPLACE(string,start,length,new) -# REPT(string,count) -# RIGHT(string,[length]) -# SUBSTITUTE(string,old,new,[which]) -# TRIM(string) -# UPPER(string) -# -*/ - - // SocialCalc.Formula.ArgList has an array for each function, one entry for each possible arg (up to max). - // Min args are specified in SocialCalc.Formula.FunctionList. - // If array element is 1 then it's a text argument, if it's 0 then it's numeric, if -1 then just get whatever's there - // Text values are manipulated as UTF-8, converting from and back to byte strings - - SocialCalc.Formula.ArgList = { - FIND: [1, 1, 0], - LEFT: [1, 0], - LEN: [1], - LOWER: [1], - MID: [1, 0, 0], - PROPER: [1], - REPLACE: [1, 0, 0, 1], - REPT: [1, 0], - RIGHT: [1, 0], - SUBSTITUTE: [1, 1, 1, 0], - TRIM: [1], - UPPER: [1], - }; - - SocialCalc.Formula.StringFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var i, value, offset, len, start, count; - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var numargs = foperand.length; - var argdef = scf.ArgList[fname]; - var operand_value = []; - var operand_type = []; - - for (i = 1; i <= numargs; i++) { - // go through each arg, get value and type, and check for errors - if (i > argdef.length) { - // too many args - scf.FunctionArgsError(fname, operand); - return; - } - if (argdef[i - 1] == 0) { - value = scf.OperandAsNumber(sheet, foperand); - } else if (argdef[i - 1] == 1) { - value = scf.OperandAsText(sheet, foperand); - } else if (argdef[i - 1] == -1) { - value = scf.OperandValueAndType(sheet, foperand); - } - operand_value[i] = value.value; - operand_type[i] = value.type; - if (value.type.charAt(0) == "e") { - scf.PushOperand(operand, value.type, result); - return; - } - } - - switch (fname) { - case "FIND": - offset = operand_type[3] ? operand_value[3] - 1 : 0; - if (offset < 0) { - result = "Start is before string"; // !! not displayed, no need to translate - } else { - result = operand_value[2].indexOf(operand_value[1], offset); // (null string matches first char) - if (result >= 0) { - result += 1; - resulttype = "n"; - } else { - result = "Not found"; // !! not displayed, error is e#VALUE! - } - } - break; - - case "LEFT": - len = operand_type[2] ? operand_value[2] - 0 : 1; - if (len < 0) { - result = "Negative length"; - } else { - result = operand_value[1].substring(0, len); - resulttype = "t"; - } - break; - - case "LEN": - result = operand_value[1].length; - resulttype = "n"; - break; - - case "LOWER": - result = operand_value[1].toLowerCase(); - resulttype = "t"; - break; - - case "MID": - start = operand_value[2] - 0; - len = operand_value[3] - 0; - if (len < 1 || start < 1) { - result = "Bad arguments"; - } else { - result = operand_value[1].substring(start - 1, start + len - 1); - resulttype = "t"; - } - break; - - case "PROPER": - result = operand_value[1].replace(/\b\w+\b/g, function (word) { - return word.substring(0, 1).toUpperCase() + word.substring(1); - }); // uppercase first character of words (see JavaScript, Flanagan, 5th edition, page 704) - resulttype = "t"; - break; - - case "REPLACE": - start = operand_value[2] - 0; - len = operand_value[3] - 0; - if (len < 0 || start < 1) { - result = "Bad arguments"; - } else { - result = - operand_value[1].substring(0, start - 1) + - operand_value[4] + - operand_value[1].substring(start - 1 + len); - resulttype = "t"; - } - break; - - case "REPT": - count = operand_value[2] - 0; - if (count < 0) { - result = "Negative count"; - } else { - result = ""; - for (; count > 0; count--) { - result += operand_value[1]; - } - resulttype = "t"; - } - break; - - case "RIGHT": - len = operand_type[2] ? operand_value[2] - 0 : 1; - if (len < 0) { - result = "Negative length"; - } else { - result = operand_value[1].slice(-len); - resulttype = "t"; - } - break; - - case "SUBSTITUTE": - fulltext = operand_value[1]; - oldtext = operand_value[2]; - newtext = operand_value[3]; - if (operand_value[4] != null) { - which = operand_value[4] - 0; - if (which <= 0) { - result = "Non-positive instance number"; - break; - } - } else { - which = 0; - } - count = 0; - oldpos = 0; - result = ""; - while (true) { - pos = fulltext.indexOf(oldtext, oldpos); - if (pos >= 0) { - count++; //!!!!!! old test just in case: if (count>1000) {alert(pos); break;} - result += fulltext.substring(oldpos, pos); - if (which == 0) { - result += newtext; // substitute - } else if (which == count) { - result += newtext + fulltext.substring(pos + oldtext.length); - break; - } else { - result += oldtext; // leave as was - } - oldpos = pos + oldtext.length; - } else { - // no more - result += fulltext.substring(oldpos); - break; - } - } - resulttype = "t"; - break; - - case "TRIM": - result = operand_value[1]; - result = result.replace(/^ */, ""); - result = result.replace(/ *$/, ""); - result = result.replace(/ +/g, " "); - resulttype = "t"; - break; - - case "UPPER": - result = operand_value[1].toUpperCase(); - resulttype = "t"; - break; - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["FIND"] = [ - SocialCalc.Formula.StringFunctions, - -2, - "find", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["LEFT"] = [ - SocialCalc.Formula.StringFunctions, - -2, - "tc", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["LEN"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "txt", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["LOWER"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "txt", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["MID"] = [ - SocialCalc.Formula.StringFunctions, - 3, - "mid", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["PROPER"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "v", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["REPLACE"] = [ - SocialCalc.Formula.StringFunctions, - 4, - "replace", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["REPT"] = [ - SocialCalc.Formula.StringFunctions, - 2, - "tc", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["RIGHT"] = [ - SocialCalc.Formula.StringFunctions, - -1, - "tc", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["SUBSTITUTE"] = [ - SocialCalc.Formula.StringFunctions, - -3, - "subs", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["TRIM"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "v", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["UPPER"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "v", - "", - "text", - ]; - - /* -# -# is_functions: -# -# ISBLANK(value) -# ISERR(value) -# ISERROR(value) -# ISLOGICAL(value) -# ISNA(value) -# ISNONTEXT(value) -# ISNUMBER(value) -# ISTEXT(value) -# -*/ - - SocialCalc.Formula.IsFunctions = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - case "ISBLANK": - result = value.type == "b" ? 1 : 0; - break; - - case "ISERR": - result = t == "e" ? (value.type == "e#N/A" ? 0 : 1) : 0; - break; - - case "ISERROR": - result = t == "e" ? 1 : 0; - break; - - case "ISLOGICAL": - result = value.type == "nl" ? 1 : 0; - break; - - case "ISNA": - result = value.type == "e#N/A" ? 1 : 0; - break; - - case "ISNONTEXT": - result = t == "t" ? 0 : 1; - break; - - case "ISNUMBER": - result = t == "n" ? 1 : 0; - break; - - case "ISTEXT": - result = t == "t" ? 1 : 0; - break; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["ISBLANK"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISERR"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISERROR"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISLOGICAL"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISNA"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISNONTEXT"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISNUMBER"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISTEXT"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - - /* -# -# ntv_functions: -# -# N(value) -# T(value) -# VALUE(value) -# -*/ - - SocialCalc.Formula.NTVFunctions = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - case "N": - result = t == "n" ? value.value - 0 : 0; - resulttype = "n"; - break; - - case "T": - result = t == "t" ? value.value + "" : ""; - resulttype = "t"; - break; - - case "VALUE": - if (t == "n" || t == "b") { - result = value.value || 0; - resulttype = "n"; - } else if (t == "t") { - value = SocialCalc.DetermineValueType(value.value); - if (value.type.charAt(0) != "n") { - result = 0; - resulttype = "e#VALUE!"; - } else { - result = value.value - 0; - resulttype = "n"; - } - } - break; - } - - if (t == "e") { - // error trumps - resulttype = value.type; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["N"] = [ - SocialCalc.Formula.NTVFunctions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["T"] = [ - SocialCalc.Formula.NTVFunctions, - 1, - "v", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["VALUE"] = [ - SocialCalc.Formula.NTVFunctions, - 1, - "v", - "", - "text", - ]; - - /* -# -# ABS(value) -# ACOS(value) -# ASIN(value) -# ATAN(value) -# COS(value) -# DEGREES(value) -# EVEN(value) -# EXP(value) -# FACT(value) -# INT(value) -# LN(value) -# LOG10(value) -# ODD(value) -# RADIANS(value) -# SIN(value) -# SQRT(value) -# TAN(value) -# -*/ - - SocialCalc.Formula.Math1Functions = function ( - fname, - operand, - foperand, - sheet - ) { - var v1, value, f; - var result = {}; - - var scf = SocialCalc.Formula; - - v1 = scf.OperandAsNumber(sheet, foperand); - value = v1.value; - result.type = scf.LookupResultType( - v1.type, - v1.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (result.type == "n") { - switch (fname) { - case "ABS": - value = Math.abs(value); - break; - - case "ACOS": - if (value >= -1 && value <= 1) { - value = Math.acos(value); - } else { - result.type = "e#NUM!"; - } - break; - - case "ASIN": - if (value >= -1 && value <= 1) { - value = Math.asin(value); - } else { - result.type = "e#NUM!"; - } - break; - - case "ATAN": - value = Math.atan(value); - break; - - case "COS": - value = Math.cos(value); - break; - - case "DEGREES": - value = (value * 180) / Math.PI; - break; - - case "EVEN": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (Math.floor(value + 1) % 2); - } else { - // integer - value = value + (value % 2); - } - if (v1.value < 0) value = -value; - break; - - case "EXP": - value = Math.exp(value); - break; - - case "FACT": - f = 1; - value = Math.floor(value); - for (; value > 0; value--) { - f *= value; - } - value = f; - break; - - case "INT": - value = Math.floor(value); // spreadsheet INT is floor(), not int() - break; - - case "LN": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclnarg; - } - value = Math.log(value); - break; - - case "LOG10": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclog10arg; - } - value = Math.log(value) / Math.log(10); - break; - - case "ODD": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (1 - (Math.floor(value + 1) % 2)); - } else { - // integer - value = value + (1 - (value % 2)); - } - if (v1.value < 0) value = -value; - break; - - case "RADIANS": - value = (value * Math.PI) / 180; - break; - - case "SIN": - value = Math.sin(value); - break; - - case "SQRT": - if (value >= 0) { - value = Math.sqrt(value); - } else { - result.type = "e#NUM!"; - } - break; - - case "TAN": - if (Math.cos(value) != 0) { - value = Math.tan(value); - } else { - result.type = "e#NUM!"; - } - break; - } - } - - result.value = value; - operand.push(result); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["ABS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ACOS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ASIN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ATAN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["COS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["DEGREES"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["EVEN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["EXP"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["FACT"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["INT"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["LN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["LOG10"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ODD"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["RADIANS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["SIN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["SQRT"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["TAN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - - /* -# -# ATAN2(x, y) -# MOD(a, b) -# POWER(a, b) -# TRUNC(value, precision) -# -*/ - - SocialCalc.Formula.Math2Functions = function ( - fname, - operand, - foperand, - sheet - ) { - var xval, yval, value, quotient, decimalscale, i; - var result = {}; - - var scf = SocialCalc.Formula; - - xval = scf.OperandAsNumber(sheet, foperand); - yval = scf.OperandAsNumber(sheet, foperand); - value = 0; - result.type = scf.LookupResultType( - xval.type, - yval.type, - scf.TypeLookupTable.twoargnumeric - ); - - if (result.type == "n") { - switch (fname) { - case "ATAN2": - if (xval.value == 0 && yval.value == 0) { - result.type = "e#DIV/0!"; - } else { - result.value = Math.atan2(yval.value, xval.value); - } - break; - - case "POWER": - result.value = Math.pow(xval.value, yval.value); - if (isNaN(result.value)) { - result.value = 0; - result.type = "e#NUM!"; - } - break; - - case "MOD": // en.wikipedia.org/wiki/Modulo_operation, etc. - if (yval.value == 0) { - result.type = "e#DIV/0!"; - } else { - quotient = xval.value / yval.value; - quotient = Math.floor(quotient); - result.value = xval.value - quotient * yval.value; - } - break; - - case "TRUNC": - decimalscale = 1; // cut down to required number of decimal digits - if (yval.value >= 0) { - yval.value = Math.floor(yval.value); - for (i = 0; i < yval.value; i++) { - decimalscale *= 10; - } - result.value = - Math.floor(Math.abs(xval.value) * decimalscale) / decimalscale; - } else if (yval.value < 0) { - yval.value = Math.floor(-yval.value); - for (i = 0; i < yval.value; i++) { - decimalscale *= 10; - } - result.value = - Math.floor(Math.abs(xval.value) / decimalscale) * decimalscale; - } - if (xval.value < 0) { - result.value = -result.value; - } - } - } - - operand.push(result); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["ATAN2"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "xy", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["MOD"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["POWER"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["TRUNC"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "valpre", - "", - "math", - ]; - - /* -# -# LOG(value,[base]) -# -*/ - - SocialCalc.Formula.LogFunction = function (fname, operand, foperand, sheet) { - var value, value2; - var result = {}; - - var scf = SocialCalc.Formula; - - result.value = 0; - - value = scf.OperandAsNumber(sheet, foperand); - result.type = scf.LookupResultType( - value.type, - value.type, - scf.TypeLookupTable.oneargnumeric - ); - if (foperand.length == 1) { - value2 = scf.OperandAsNumber(sheet, foperand); - if (value2.type.charAt(0) != "n" || value2.value <= 0) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfunclogsecondarg - ); - return 0; - } - } else if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } else { - value2 = { value: Math.E, type: "n" }; - } - - if (result.type == "n") { - if (value.value <= 0) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfunclogfirstarg - ); - return 0; - } - result.value = Math.log(value.value) / Math.log(value2.value); - } - - operand.push(result); - - return; - }; - - SocialCalc.Formula.FunctionList["LOG"] = [ - SocialCalc.Formula.LogFunction, - -1, - "log", - "", - "math", - ]; - - /* -# -# ROUND(value,[precision]) -# -*/ - - SocialCalc.Formula.RoundFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var value2, decimalscale, scaledvalue, i; - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var value = scf.OperandValueAndType(sheet, foperand); - var resulttype = scf.LookupResultType( - value.type, - value.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (foperand.length == 1) { - value2 = scf.OperandValueAndType(sheet, foperand); - if (value2.type.charAt(0) != "n") { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfuncroundsecondarg - ); - return 0; - } - } else if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } else { - value2 = { value: 0, type: "n" }; // if no second arg, assume 0 for simple round - } - - if (resulttype == "n") { - value2.value = value2.value - 0; - if (value2.value == 0) { - result = Math.round(value.value); - } else if (value2.value > 0) { - decimalscale = 1; // cut down to required number of decimal digits - value2.value = Math.floor(value2.value); - for (i = 0; i < value2.value; i++) { - decimalscale *= 10; - } - scaledvalue = Math.round(value.value * decimalscale); - result = scaledvalue / decimalscale; - } else if (value2.value < 0) { - decimalscale = 1; // cut down to required number of decimal digits - value2.value = Math.floor(-value2.value); - for (i = 0; i < value2.value; i++) { - decimalscale *= 10; - } - scaledvalue = Math.round(value.value / decimalscale); - result = scaledvalue * decimalscale; - } - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["ROUND"] = [ - SocialCalc.Formula.RoundFunction, - -1, - "vp", - "", - "math", - ]; - - /* -# -# AND(v1,c1:c2,...) -# OR(v1,c1:c2,...) -# -*/ - - SocialCalc.Formula.AndOrFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var value1, result; - - var scf = SocialCalc.Formula; - var resulttype = ""; - - if (fname == "AND") { - result = 1; - } else if (fname == "OR") { - result = 0; - } - - while (foperand.length) { - value1 = scf.OperandValueAndType(sheet, foperand); - if (value1.type.charAt(0) == "n") { - value1.value = value1.value - 0; - if (fname == "AND") { - result = value1.value != 0 ? result : 0; - } else if (fname == "OR") { - result = value1.value != 0 ? 1 : result; - } - resulttype = scf.LookupResultType( - value1.type, - resulttype || "nl", - scf.TypeLookupTable.propagateerror - ); - } else if (value1.type.charAt(0) == "e" && resulttype.charAt(0) != "e") { - resulttype = value1.type; - } - } - if (resulttype.length < 1) { - resulttype = "e#VALUE!"; - result = 0; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["AND"] = [ - SocialCalc.Formula.AndOrFunctions, - -1, - "vn", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["OR"] = [ - SocialCalc.Formula.AndOrFunctions, - -1, - "vn", - "", - "test", - ]; - - /* -# -# NOT(value) -# -*/ - - SocialCalc.Formula.NotFunction = function (fname, operand, foperand, sheet) { - var result = 0; - var scf = SocialCalc.Formula; - var value = scf.OperandValueAndType(sheet, foperand); - var resulttype = scf.LookupResultType( - value.type, - value.type, - scf.TypeLookupTable.propagateerror - ); - - if (value.type.charAt(0) == "n" || value.type == "b") { - result = value.value - 0 != 0 ? 0 : 1; // do the "not" operation - resulttype = "nl"; - } else if (value.type.charAt(0) == "t") { - resulttype = "e#VALUE!"; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["NOT"] = [ - SocialCalc.Formula.NotFunction, - 1, - "v", - "", - "test", - ]; - - /* -# -# CHOOSE(index,value1,value2,...) -# -*/ - - SocialCalc.Formula.ChooseFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var resulttype, count, value1; - var result = 0; - var scf = SocialCalc.Formula; - - var cindex = scf.OperandAsNumber(sheet, foperand); - - if (cindex.type.charAt(0) != "n") { - cindex.value = 0; - } - cindex.value = Math.floor(cindex.value); - - count = 0; - while (foperand.length) { - value1 = scf.TopOfStackValueAndType(sheet, foperand); - count += 1; - if (cindex.value == count) { - result = value1.value; - resulttype = value1.type; - break; - } - } - if (resulttype) { - // found something - scf.PushOperand(operand, resulttype, result); - } else { - scf.PushOperand(operand, "e#VALUE!", 0); - } - - return; - }; - - SocialCalc.Formula.FunctionList["CHOOSE"] = [ - SocialCalc.Formula.ChooseFunction, - -2, - "choose", - "", - "lookup", - ]; - - /* -# -# COLUMNS(c1:c2) -# ROWS(c1:c2) -# -*/ - - SocialCalc.Formula.ColumnsRowsFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var resulttype, rangeinfo; - var result = 0; - var scf = SocialCalc.Formula; - - var value1 = scf.TopOfStackValueAndType(sheet, foperand); - - if (value1.type == "coord") { - result = 1; - resulttype = "n"; - } else if (value1.type == "range") { - rangeinfo = scf.DecodeRangeParts(sheet, value1.value); - if (fname == "COLUMNS") { - result = rangeinfo.ncols; - } else if (fname == "ROWS") { - result = rangeinfo.nrows; - } - resulttype = "n"; - } else { - result = 0; - resulttype = "e#VALUE!"; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["COLUMNS"] = [ - SocialCalc.Formula.ColumnsRowsFunctions, - 1, - "range", - "", - "lookup", - ]; - SocialCalc.Formula.FunctionList["ROWS"] = [ - SocialCalc.Formula.ColumnsRowsFunctions, - 1, - "range", - "", - "lookup", - ]; - - /* -# -# FALSE() -# NA() -# NOW() -# PI() -# TODAY() -# TRUE() -# -*/ - - SocialCalc.Formula.ZeroArgFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var startval, tzoffset, start_1_1_1970, seconds_in_a_day, nowdays; - var result = { value: 0 }; - - switch (fname) { - case "FALSE": - result.type = "nl"; - result.value = 0; - break; - - case "NA": - result.type = "e#N/A"; - break; - - case "NOW": - startval = new Date(); - tzoffset = startval.getTimezoneOffset(); - startval = startval.getTime() / 1000; // convert to seconds - start_1_1_1970 = 25569; // Day number of 1/1/1970 starting with 1/1/1900 as 1 - seconds_in_a_day = 24 * 60 * 60; - nowdays = - start_1_1_1970 + startval / seconds_in_a_day - tzoffset / (24 * 60); - result.value = nowdays; - result.type = "ndt"; - SocialCalc.Formula.FreshnessInfo.volatile.NOW = true; // remember - break; - - case "PI": - result.type = "n"; - result.value = Math.PI; - break; - - case "TODAY": - startval = new Date(); - tzoffset = startval.getTimezoneOffset(); - startval = startval.getTime() / 1000; // convert to seconds - start_1_1_1970 = 25569; // Day number of 1/1/1970 starting with 1/1/1900 as 1 - seconds_in_a_day = 24 * 60 * 60; - nowdays = - start_1_1_1970 + startval / seconds_in_a_day - tzoffset / (24 * 60); - result.value = Math.floor(nowdays); - result.type = "nd"; - SocialCalc.Formula.FreshnessInfo.volatile.TODAY = true; // remember - break; - - case "TRUE": - result.type = "nl"; - result.value = 1; - break; - } - - operand.push(result); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["FALSE"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["NA"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["NOW"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["PI"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["TODAY"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["TRUE"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "test", - ]; - - // - // * * * * * FINANCIAL FUNCTIONS * * * * * - // - - /* -# -# DDB(cost,salvage,lifetime,period,[method]) -# -# Depreciation, method defaults to 2 for double-declining balance -# See: http://en.wikipedia.org/wiki/Depreciation -# -*/ - - SocialCalc.Formula.DDBFunction = function (fname, operand, foperand, sheet) { - var method, depreciation, accumulateddepreciation, i; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - var period = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - if (scf.CheckForErrorValue(operand, period)) return; - - if (lifetime.value < 1) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfuncddblife - ); - return 0; - } - - method = { value: 2, type: "n" }; - if (foperand.length > 0) { - method = scf.OperandAsNumber(sheet, foperand); - } - if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (scf.CheckForErrorValue(operand, method)) return; - - depreciation = 0; // calculated for each period - accumulateddepreciation = 0; // accumulated by adding each period's - - for (i = 1; i <= period.value - 0 && i <= lifetime.value; i++) { - // calculate for each period based on net from previous - depreciation = - (cost.value - accumulateddepreciation) * - (method.value / lifetime.value); - if (cost.value - accumulateddepreciation - depreciation < salvage.value) { - // don't go lower than salvage value - depreciation = cost.value - accumulateddepreciation - salvage.value; - } - accumulateddepreciation += depreciation; - } - - scf.PushOperand(operand, "n$", depreciation); - - return; - }; - - SocialCalc.Formula.FunctionList["DDB"] = [ - SocialCalc.Formula.DDBFunction, - -4, - "ddb", - "", - "financial", - ]; - - /* -# -# SLN(cost,salvage,lifetime) -# -# Depreciation for each period by straight-line method -# See: http://en.wikipedia.org/wiki/Depreciation -# -*/ - - SocialCalc.Formula.SLNFunction = function (fname, operand, foperand, sheet) { - var depreciation; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - - if (lifetime.value < 1) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfuncslnlife - ); - return 0; - } - - depreciation = (cost.value - salvage.value) / lifetime.value; - - scf.PushOperand(operand, "n$", depreciation); - - return; - }; - - SocialCalc.Formula.FunctionList["SLN"] = [ - SocialCalc.Formula.SLNFunction, - 3, - "csl", - "", - "financial", - ]; - - /* -# -# SYD(cost,salvage,lifetime,period) -# -# Depreciation by Sum of Year's Digits method -# -*/ - - SocialCalc.Formula.SYDFunction = function (fname, operand, foperand, sheet) { - var depreciation, sumperiods; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - var period = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - if (scf.CheckForErrorValue(operand, period)) return; - - if (lifetime.value < 1 || period.value <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return 0; - } - - sumperiods = ((lifetime.value + 1) * lifetime.value) / 2; // add up 1 through lifetime - depreciation = - ((cost.value - salvage.value) * (lifetime.value - period.value + 1)) / - sumperiods; // calc depreciation - - scf.PushOperand(operand, "n$", depreciation); - - return; - }; - - SocialCalc.Formula.FunctionList["SYD"] = [ - SocialCalc.Formula.SYDFunction, - 4, - "cslp", - "", - "financial", - ]; - - /* -# -# FV(rate, n, payment, [pv, [paytype]]) -# NPER(rate, payment, pv, [fv, [paytype]]) -# PMT(rate, n, pv, [fv, [paytype]]) -# PV(rate, n, payment, [fv, [paytype]]) -# RATE(n, payment, pv, [fv, [paytype, [guess]]]) -# -# Following the Open Document Format formula specification: -# -# PV = - Fv - (Payment * Nper) [if rate equals 0] -# Pv*(1+Rate)^Nper + Payment * (1 + Rate*PaymentType) * ( (1+Rate)^nper -1)/Rate + Fv = 0 -# -# For each function, the formulas are solved for the appropriate value (transformed using -# basic algebra). -# -*/ - - SocialCalc.Formula.InterestFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var resulttype, result, dval, evalue, fval; - var pv, - fv, - rate, - n, - payment, - paytype, - guess, - part1, - part2, - part3, - part4, - part5; - var olddelta, maxloop, tries, deltaepsilon, rate, oldrate, m; - - var scf = SocialCalc.Formula; - - var aval = scf.OperandAsNumber(sheet, foperand); - var bval = scf.OperandAsNumber(sheet, foperand); - var cval = scf.OperandAsNumber(sheet, foperand); - - resulttype = scf.LookupResultType( - aval.type, - bval.type, - scf.TypeLookupTable.twoargnumeric - ); - resulttype = scf.LookupResultType( - resulttype, - cval.type, - scf.TypeLookupTable.twoargnumeric - ); - if (foperand.length) { - // optional arguments - dval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType( - resulttype, - dval.type, - scf.TypeLookupTable.twoargnumeric - ); - if (foperand.length) { - // optional arguments - evalue = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType( - resulttype, - evalue.type, - scf.TypeLookupTable.twoargnumeric - ); - if (foperand.length) { - // optional arguments - if (fname != "RATE") { - // only rate has 6 possible args - scf.FunctionArgsError(fname, operand); - return 0; - } - fval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType( - resulttype, - fval.type, - scf.TypeLookupTable.twoargnumeric - ); - } - } - } - - if (resulttype == "n") { - switch (fname) { - case "FV": // FV(rate, n, payment, [pv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - pv = dval != null ? dval.value : 0; // get value if present, or use default - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - if (rate == 0) { - // simple calculation if no interest - fv = -pv - payment * n; - } else { - fv = -( - pv * Math.pow(1 + rate, n) + - (payment * (1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / - rate - ); - } - result = fv; - resulttype = "n$"; - break; - - case "NPER": // NPER(rate, payment, pv, [fv, [paytype]]) - rate = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - if (rate == 0) { - // simple calculation if no interest - if (payment == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - n = (pv + fv) / -payment; - } else { - part1 = (payment * (1 + rate * paytype)) / rate; - part2 = pv + part1; - if (part2 == 0 || rate <= -1) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part3 = (part1 - fv) / part2; - if (part3 <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part4 = Math.log(part3); - part5 = Math.log(1 + rate); // rate > -1 - n = part4 / part5; - } - result = n; - resulttype = "n"; - break; - - case "PMT": // PMT(rate, n, pv, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - pv = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - if (n == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } else if (rate == 0) { - // simple calculation if no interest - payment = (fv - pv) / n; - } else { - payment = - (0 - fv - pv * Math.pow(1 + rate, n)) / - (((1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / rate); - } - result = payment; - resulttype = "n$"; - break; - - case "PV": // PV(rate, n, payment, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (eval.value ? 1 : 0) : 0; - if (rate == -1) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } else if (rate == 0) { - // simple calculation if no interest - pv = -fv - payment * n; - } else { - pv = - (-fv - - (payment * (1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / - rate) / - Math.pow(1 + rate, n); - } - result = pv; - resulttype = "n$"; - break; - - case "RATE": // RATE(n, payment, pv, [fv, [paytype, [guess]]]) - n = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - guess = fval != null ? fval.value : 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 100; - tries = 0; - delta = 1; - epsilon = 0.0000001; // this is close enough - rate = guess || 0.00000001; // zero is not allowed - while ((delta >= 0 ? delta : -delta) > epsilon && rate != oldrate) { - delta = - fv + - pv * Math.pow(1 + rate, n) + - (payment * (1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / - rate; - if (olddelta != null) { - m = (delta - olddelta) / (rate - oldrate) || 0.001; // get slope (not zero) - oldrate = rate; - rate = rate - delta / m; // look for zero crossing - olddelta = delta; - } else { - // first time - no old values - oldrate = rate; - rate = 1.1 * rate; - olddelta = delta; - } - tries++; - if (tries >= maxloop) { - // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - result = rate; - resulttype = "n%"; - break; - } - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["FV"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "fv", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["NPER"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "nper", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["PMT"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "pmt", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["PV"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "pv", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["RATE"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "rate", - "", - "financial", - ]; - - /* -# -# NPV(rate,v1,v2,c1:c2,...) -# -*/ - - SocialCalc.Formula.NPVFunction = function (fname, operand, foperand, sheet) { - var resulttypenpv, rate, sum, factor, value1; - - var scf = SocialCalc.Formula; - - var rate = scf.OperandAsNumber(sheet, foperand); - if (scf.CheckForErrorValue(operand, rate)) return; - - sum = 0; - resulttypenpv = "n"; - factor = 1; - - while (foperand.length) { - value1 = scf.OperandValueAndType(sheet, foperand); - if (value1.type.charAt(0) == "n") { - factor *= 1 + rate.value; - if (factor == 0) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - sum += value1.value / factor; - resulttypenpv = scf.LookupResultType( - value1.type, - resulttypenpv || value1.type, - scf.TypeLookupTable.plus - ); - } else if ( - value1.type.charAt(0) == "e" && - resulttypenpv.charAt(0) != "e" - ) { - resulttypenpv = value1.type; - break; - } - } - - if (resulttypenpv.charAt(0) == "n") { - resulttypenpv = "n$"; - } - - scf.PushOperand(operand, resulttypenpv, sum); - - return; - }; - - SocialCalc.Formula.FunctionList["NPV"] = [ - SocialCalc.Formula.NPVFunction, - -2, - "npv", - "", - "financial", - ]; - - /* -# -# IRR(c1:c2,[guess]) -# -*/ - - SocialCalc.Formula.IRRFunction = function (fname, operand, foperand, sheet) { - var value1, - guess, - oldsum, - maxloop, - tries, - epsilon, - rate, - oldrate, - m, - sum, - factor, - i; - var rangeoperand = []; - var cashflows = []; - - var scf = SocialCalc.Formula; - - rangeoperand.push(foperand.pop()); // first operand is a range - - while (rangeoperand.length) { - // get values from range so we can do iterative approximations - value1 = scf.OperandValueAndType(sheet, rangeoperand); - if (value1.type.charAt(0) == "n") { - cashflows.push(value1.value); - } else if (value1.type.charAt(0) == "e") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - } - - if (!cashflows.length) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - - guess = { value: 0 }; - - if (foperand.length) { - // guess is provided - guess = scf.OperandAsNumber(sheet, foperand); - if (guess.type.charAt(0) != "n" && guess.type.charAt(0) != "b") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { - // should be no more args - scf.FunctionArgsError(fname, operand); - return; - } - } - - guess.value = guess.value || 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 20; - tries = 0; - epsilon = 0.0000001; // this is close enough - rate = guess.value; - sum = 1; - - while ((sum >= 0 ? sum : -sum) > epsilon && rate != oldrate) { - sum = 0; - factor = 1; - for (i = 0; i < cashflows.length; i++) { - factor *= 1 + rate; - if (factor == 0) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - sum += cashflows[i] / factor; - } - - if (oldsum != null) { - m = (sum - oldsum) / (rate - oldrate); // get slope - oldrate = rate; - rate = rate - sum / m; // look for zero crossing - oldsum = sum; - } else { - // first time - no old values - oldrate = rate; - rate = 1.1 * rate; - oldsum = sum; - } - tries++; - if (tries >= maxloop) { - // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - - scf.PushOperand(operand, "n%", rate); - - return; - }; - - SocialCalc.Formula.FunctionList["IRR"] = [ - SocialCalc.Formula.IRRFunction, - -1, - "irr", - "", - "financial", - ]; - - // - // SHEET CACHE - // - - SocialCalc.Formula.SheetCache = { - // Sheet data: Attributes are each sheet in the cache with values of an object with: - // - // sheet: sheet-obj (or null, meaning not found) - // recalcstate: constants.asloaded = as loaded - // constants.recalcing = being recalced now - // constants.recalcdone = recalc done - // name: name of sheet (in case just have object and don't know name) - // - - sheets: {}, - - // Waiting for loading: - // If sheet is not in cache, this is set to the sheetname being loaded - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForLoading: null, - - // Constants to use for setting sheets[*].recalcstate: - - constants: { asloaded: 0, recalcing: 1, recalcdone: 2 }, - - loadsheet: null, // (deprecated - use SocialCalc.RecalcInfo.LoadSheet) - }; - - // - // othersheet = SocialCalc.Formula.FindInSheetCache(sheetname) - // - // Returns a SocialCalc.Sheet object corresponding to string sheetname - // or null if the sheet is not available or in error. - // - // Each sheet is loaded only once and then stored in a cache. - // Loading is handled elsewhere, e.g., in the recalc loop. - // - - SocialCalc.Formula.FindInSheetCache = function (sheetname) { - var str; - var sfsc = SocialCalc.Formula.SheetCache; - - var nsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); // normalize different versions - - if (sfsc.sheets[nsheetname]) { - // a sheet by that name is in the cache already - return sfsc.sheets[nsheetname].sheet; // return it - } - - if (sfsc.waitingForLoading) { - // waiting already - only queue up one - return null; // return not found - } - - sfsc.waitingForLoading = nsheetname; // let recalc loop know that we have a sheet to load - - return null; // return not found - }; - - // - // newsheet = SocialCalc.Formula.AddSheetToCache(sheetname, str) - // - // Adds a new sheet to the sheet cache. - // Returns the sheet object filled out with the str (a saved sheet). - // - - SocialCalc.Formula.AddSheetToCache = function (sheetname, str) { - var newsheet = null; - var sfsc = SocialCalc.Formula.SheetCache; - var sfscc = sfsc.constants; - var newsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); - - if (str) { - newsheet = new SocialCalc.Sheet(); - newsheet.ParseSheetSave(str); - } - - sfsc.sheets[newsheetname] = { - sheet: newsheet, - recalcstate: sfscc.asloaded, - name: newsheetname, - }; - - SocialCalc.Formula.FreshnessInfo.sheets[newsheetname] = true; - - return newsheet; - }; - - // - // nsheet = SocialCalc.Formula.NormalizeSheetName(sheetname) - // - - SocialCalc.Formula.NormalizeSheetName = function (sheetname) { - if (SocialCalc.Callbacks.NormalizeSheetName) { - return SocialCalc.Callbacks.NormalizeSheetName(sheetname); - } else { - return sheetname.toLowerCase(); - } - }; - - // - // REMOTE FUNCTION INFO - // - - SocialCalc.Formula.RemoteFunctionInfo = { - // Waiting for server: - // If waiting for an XHR response from the server, this is set to some non-blank status text - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForServer: null, - }; - - // - // FRESHNESS INFO - // - // This information is generated during recalc. - // It may be used to help determine when the recalc data in a spreadsheet - // may be out of date. - // For example, it may be used to display a message like: - // "Dependent on sheet 'FOO' which was updated more recently than this printout" - - SocialCalc.Formula.FreshnessInfo = { - // For each external sheet referenced successfully an attribute of that name with value true. - - sheets: {}, - - // For each volatile function that is called an attribute of that name with value true. - - volatile: {}, - - // Set to false when started and true when recalc completes - - recalc_completed: false, - }; - - SocialCalc.Formula.FreshnessInfoReset = function () { - var scffi = SocialCalc.Formula.FreshnessInfo; - - scffi.sheets = {}; - scffi.volatile = {}; - scffi.recalc_completed = false; - }; - - // - // MISC ROUTINES - // - - // - // result = SocialCalc.Formula.PlainCoord(coord) - // - // Returns: coord without any $'s - // - - SocialCalc.Formula.PlainCoord = function (coord) { - if (coord.indexOf("$") == -1) return coord; - - return coord.replace(/\$/g, ""); // remove any $'s - }; - - // - // result = SocialCalc.Formula.OrderRangeParts(coord1, coord2) - // - // Returns: {c1: col, r1: row, c2: col, r2 = row} with c1/r1 upper left - // - - SocialCalc.Formula.OrderRangeParts = function (coord1, coord2) { - var cr1, cr2; - var result = {}; - - cr1 = SocialCalc.coordToCr(coord1); - cr2 = SocialCalc.coordToCr(coord2); - if (cr1.col > cr2.col) { - result.c1 = cr2.col; - result.c2 = cr1.col; - } else { - result.c1 = cr1.col; - result.c2 = cr2.col; - } - if (cr1.row > cr2.row) { - result.r1 = cr2.row; - result.r2 = cr1.row; - } else { - result.r1 = cr1.row; - result.r2 = cr2.row; - } - - return result; - }; - - // - // cond = SocialCalc.Formula.TestCriteria(value, type, criteria) - // - // Determines whether a value/type meets the criteria. - // A criteria can be a numeric value, text beginning with <, <=, =, >=, >, <>, text by itself is start of text to match. - // Used by a variety of functions, including the "D" functions (DSUM, etc.). - // - // Returns true or false - // - - SocialCalc.Formula.TestCriteria = function (value, type, criteria) { - var comparitor, basestring, basevalue, cond, testvalue; - - if (criteria == null) { - // undefined (e.g., error value) is always false - return false; - } - - criteria = criteria + ""; - comparitor = criteria.charAt(0); // look for comparitor - if (comparitor == "=" || comparitor == "<" || comparitor == ">") { - basestring = criteria.substring(1); - } else { - comparitor = criteria.substring(0, 2); - if (comparitor == "<=" || comparitor == "<>" || comparitor == ">=") { - basestring = criteria.substring(2); - } else { - comparitor = "none"; - basestring = criteria; - } - } - - basevalue = SocialCalc.DetermineValueType(basestring); // get type of value being compared - if (!basevalue.type) { - // no criteria base value given - if (comparitor == "none") { - // blank criteria matches nothing - return false; - } - if (type.charAt(0) == "b") { - // comparing to empty cell - if (comparitor == "=") { - // empty equals empty - return true; - } - } else { - if (comparitor == "<>") { - // "something" does not equal empty - return true; - } - } - return false; // otherwise false - } - - cond = false; - - if (basevalue.type.charAt(0) == "n" && type.charAt(0) == "t") { - // criteria is number, but value is text - testvalue = SocialCalc.DetermineValueType(value); - if (testvalue.type.charAt(0) == "n") { - // could be number - make it one - value = testvalue.value; - type = testvalue.type; - } - } - - if (type.charAt(0) == "n" && basevalue.type.charAt(0) == "n") { - // compare two numbers - value = value - 0; // make sure numbers - basevalue.value = basevalue.value - 0; - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - case "none": - cond = value == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } else if (type.charAt(0) == "e") { - // error on left - cond = false; - } else if (basevalue.type.charAt(0) == "e") { - // error on right - cond = false; - } else { - // text, maybe mixed with number or blank - if (type.charAt(0) == "n") { - value = SocialCalc.format_number_for_display(value, "n", ""); - } - if (basevalue.type.charAt(0) == "n") { - return false; // if number and didn't match already, isn't a match - } - - value = value ? value.toLowerCase() : ""; - basevalue.value = basevalue.value ? basevalue.value.toLowerCase() : ""; - - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - cond = value == basevalue.value; - break; - - case "none": - cond = value.substring(0, basevalue.value.length) == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } - - return cond; - }; - - // - /* -// The module of the SocialCalc package for the optional popup menus in socialcalcspreadsheetcontrol.js -// -// (c) Copyright 2009 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// -*/ - - var SocialCalc; // All values are stored in the master SocialCalc object - if (!SocialCalc) { - SocialCalc = {}; - } - - // The main Popup data -- there is only one set - - SocialCalc.Popup = {}; - - // Routines and values for each type of control, indexed by type name - // The value for each is an object constructed as follows: - // - // Create = function(type, id, attribs) - // Initialize = function(type, id, data) - // SetValue = function(type, id, value) - // GetValue = function(type, id) returns value - // SetDisabled = function(type, id, t/f) - // Show = function(type, id) - // Hide = function(type, id) - // Cancel = function(type, id) - // Reset = function(type) - // - // data = object to hold type-specific data - // - - SocialCalc.Popup.Types = {}; - - // Definitions for each individual control, indexed by id - // The value for each is an object constructed as follows: - // - // type: type name of the control - // value: current value of the control (usually a string, but can depend on type) - // data: object with type-specific items - // - - SocialCalc.Popup.Controls = {}; - - // System-wide values of currently active control - // - // id: id of current control or null - // - - SocialCalc.Popup.Current = {}; - - // Other values used by the Popup system - // - - SocialCalc.Popup.imagePrefix = "www/assets/images/sc_"; // image prefix - - // Override this for localization - - SocialCalc.Popup.LocalizeString = function (str) { - return str; - }; - - // * * * * * * * * * * * * * * * * - // - // GENERAL ROUTINES - // - // * * * * * * * * * * * * * * * * - - // - // SocialCalc.Popup.Create(type, id, attribs) - // - // Creates a control of type "type" as the children of document element "id" using "attribs" - // - - SocialCalc.Popup.Create = function (type, id, attribs) { - var pt = SocialCalc.Popup.Types[type]; - if (pt && pt.Create) { - pt.Create(type, id, attribs); - } - }; - - // - // SocialCalc.Popup.SetValue(id, value) - // - // Sets the value of control. - // - - SocialCalc.Popup.SetValue = function (id, value) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - var pt = spt[type]; - var spcdata = spc[id].data; - - if (pt && pt.Create) { - pt.SetValue(type, id, value); - if (spcdata.attribs && spcdata.attribs.changedcallback) { - spcdata.attribs.changedcallback(spcdata.attribs, id, value); - } - } - }; - - // - // SocialCalc.Popup.SetDisabled(id, disabled) - // - // Sets whether the control is disabled (true) or not (false). - // - - SocialCalc.Popup.SetDisabled = function (id, disabled) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - if (sp.Current.id && id == sp.Current.id) { - pt.Hide(type, sp.Current.id); - sp.Current.id = null; - } - pt.SetDisabled(type, id, disabled); - } - }; - - // - // SocialCalc.Popup.GetValue(id) - // - // Returns the value of control. - // - - SocialCalc.Popup.GetValue = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - return pt.GetValue(type, id); - } - - return null; - }; - - // - // SocialCalc.Popup.Initialize(id, data) - // - // Gives "data" to the appropriate initialization code. - // - - SocialCalc.Popup.Initialize = function (id, data) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Initialize) { - pt.Initialize(type, id, data); - } - }; - - // - // SocialCalc.Popup.Reset(type) - // - // Resets Popup, such as when turning to page. - // - - SocialCalc.Popup.Reset = function (type) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (spt[type].Reset) spt[type].Reset(type); - }; - - // - // SocialCalc.Popup.CClick(id) - // - // Should be called when the user clicks on a control to do the popup - // - - SocialCalc.Popup.CClick = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - if (spc[id].data && spc[id].data.disabled) return; - - var type = spc[id].type; - - var pt = spt[type]; - - if (sp.Current.id) { - spt[spc[sp.Current.id].type].Hide(type, sp.Current.id); - if (id == sp.Current.id) { - // same one - done - sp.Current.id = null; - return; - } - } - - if (pt && pt.Show) { - pt.Show(type, id); - } - - sp.Current.id = id; - }; - - // - // SocialCalc.Popup.Close() - // - // Used to close any open popup. - // - - SocialCalc.Popup.Close = function () { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - sp.CClick(sp.Current.id); - }; - - // - // SocialCalc.Popup.Cancel() - // - // Closes Popup and restores old value - // - - SocialCalc.Popup.Cancel = function () { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - var type = spc[sp.Current.id].type; - - var pt = spt[type]; - - pt.Cancel(type, sp.Current.id); - - sp.Current.id = null; - }; - - // - // ele = SocialCalc.Popup.CreatePopupDiv(id, attribs) - // - // Utility function to create the main popup div of width attribs.width. - // If attribs.title, create one with that text, and optionally attribs.moveable. - // - - SocialCalc.Popup.CreatePopupDiv = function (id, attribs) { - var pos, ele; - - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = document.createElement("div"); - main.style.position = "absolute"; - - pos = SocialCalc.GetElementPositionWithScroll(spcdata.mainele); - - main.style.top = pos.top + spcdata.mainele.offsetHeight + "px"; - main.style.left = pos.left + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - if (attribs.width) { - main.style.width = attribs.width; - } - - spcdata.mainele.appendChild(main); - - if (attribs.title) { - main.innerHTML = - '' + - '" + - '
    ' + - attribs.title + - " X 
    '; - - if (attribs.moveable) { - spcdata.dragregistered = - main.firstChild.firstChild.firstChild.firstChild; - SocialCalc.DragRegister(spcdata.dragregistered, true, true, { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - }); - } - } - - return main; - }; - - // - // SocialCalc.Popup.EnsurePosition(id, container) - // - // Utility function to make sure popup is positioned completely within container (both element objects) - // and appropriate with respect to the main element controlling the popup. - // - - SocialCalc.Popup.EnsurePosition = function (id, container) { - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = spcdata.mainele.firstChild; - if (!main) { - alert("No main popup element firstChild."); - return; - } - var popup = spcdata.popupele; - - function GetLayoutValues(ele) { - var r = SocialCalc.GetElementPositionWithScroll(ele); - r.height = ele.offsetHeight; - r.width = ele.offsetWidth; - r.bottom = r.top + r.height; - r.right = r.left + r.width; - return r; - } - - var p = GetLayoutValues(popup); - var c = GetLayoutValues(container); - var m = GetLayoutValues(main); - var t = 0; // type of placement - //addmsg("popup t/r/b/l/h/w= "+p.top+"/"+p.right+"/"+p.bottom+"/"+p.left+"/"+p.height+"/"+p.width); - //addmsg("container t/r/b/l/h/w= "+c.top+"/"+c.right+"/"+c.bottom+"/"+c.left+"/"+c.height+"/"+c.width); - //addmsg("main t/r/b/l/h/w= "+m.top+"/"+m.right+"/"+m.bottom+"/"+m.left+"/"+m.height+"/"+m.width); - - // Check various layout cases in priority order - - if (m.bottom + p.height < c.bottom && m.left + p.width < c.right) { - // normal case: room on bottom and right - popup.style.top = m.bottom + "px"; - popup.style.left = m.left + "px"; - t = 1; - } else if (m.top - p.height > c.top && m.left + p.width < c.right) { - // room on top and right - popup.style.top = m.top - p.height + "px"; - popup.style.left = m.left + "px"; - t = 2; - } else if (m.bottom + p.height < c.bottom && m.right - p.width > c.left) { - // room on bottom and left - popup.style.top = m.bottom + "px"; - popup.style.left = m.right - p.width + "px"; - t = 3; - } else if (m.top - p.height > c.top && m.right - p.width > c.left) { - // room on top and left - popup.style.top = m.top - p.height + "px"; - popup.style.left = m.right - p.width + "px"; - t = 4; - } else if (m.bottom + p.height < c.bottom && p.width < c.width) { - // room on bottom and middle - popup.style.top = m.bottom + "px"; - popup.style.left = c.left + Math.floor((c.width - p.width) / 2) + "px"; - t = 5; - } else if (m.top - p.height > c.top && p.width < c.width) { - // room on top and middle - popup.style.top = m.top - p.height + "px"; - popup.style.left = c.left + Math.floor((c.width - p.width) / 2) + "px"; - t = 6; - } else if (p.height < c.height && m.right + p.width < c.right) { - // room on middle and right - popup.style.top = c.top + Math.floor((c.height - p.height) / 2) + "px"; - popup.style.left = m.right + "px"; - t = 7; - } else if (p.height < c.height && m.left - p.width > c.left) { - // room on middle and left - popup.style.top = c.top + Math.floor((c.height - p.height) / 2) + "px"; - popup.style.left = m.left - p.width + "px"; - t = 8; - } else { - // nothing works, so leave as it is - } - //addmsg("Popup layout "+t); - }; - - // - // ele = SocialCalc.Popup.DestroyPopupDiv(ele, dragregistered) - // - // Utility function to get rid of the main popup div. - // - - SocialCalc.Popup.DestroyPopupDiv = function (ele, dragregistered) { - if (!ele) return; - - ele.innerHTML = ""; - - SocialCalc.DragUnregister(dragregistered); // OK to do this even if not registered - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - // - // Color Utility Functions - // - - SocialCalc.Popup.RGBToHex = function (val) { - var sp = SocialCalc.Popup; - - if (val == "") { - return "000000"; - } - var rgbvals = val.match(/(\d+)\D+(\d+)\D+(\d+)/); - if (rgbvals) { - return sp.ToHex(rgbvals[1]) + sp.ToHex(rgbvals[2]) + sp.ToHex(rgbvals[3]); - } else { - return "000000"; - } - }; - - SocialCalc.Popup.HexDigits = "0123456789ABCDEF"; - - SocialCalc.Popup.ToHex = function (num) { - var sp = SocialCalc.Popup; - var first = Math.floor(num / 16); - var second = num % 16; - return sp.HexDigits.charAt(first) + sp.HexDigits.charAt(second); - }; - - SocialCalc.Popup.FromHex = function (str) { - var sp = SocialCalc.Popup; - var first = sp.HexDigits.indexOf(str.charAt(0).toUpperCase()); - var second = sp.HexDigits.indexOf(str.charAt(1).toUpperCase()); - return (first >= 0 ? first : 0) * 16 + (second >= 0 ? second : 0); - }; - - SocialCalc.Popup.HexToRGB = function (val) { - var sp = SocialCalc.Popup; - - return ( - "rgb(" + - sp.FromHex(val.substring(1, 3)) + - "," + - sp.FromHex(val.substring(3, 5)) + - "," + - sp.FromHex(val.substring(5, 7)) + - ")" - ); - }; - - SocialCalc.Popup.makeRGB = function (r, g, b) { - return ( - "rgb(" + - (r > 0 ? r : 0) + - "," + - (g > 0 ? g : 0) + - "," + - (b > 0 ? b : 0) + - ")" - ); - }; - - SocialCalc.Popup.splitRGB = function (rgb) { - var parts = rgb.match(/(\d+)\D+(\d+)\D+(\d+)\D/); - if (!parts) { - return { r: 0, g: 0, b: 0 }; - } else { - return { r: parts[1] - 0, g: parts[2] - 0, b: parts[3] - 0 }; - } - }; - - // * * * * * * * * * * * * * * * * - // - // ROUTINES FOR EACH TYPE - // - // * * * * * * * * * * * * * * * * - - // - // List - // - // type: List - // value: value of control, - // display: "value to display", - // custom: true if custom value, - // disabled: t/f, - // attribs: { - // title: "popup title string", - // moveable: t/f, - // width: optional width, e.g., "100px", - // ensureWithin: optional element object to ensure popup fits within if possible - // changedcallback: optional function(attribs, id, newvalue), - // ... - // } - // data: { - // ncols: calculated number of columns - // options: [ - // {o: option-name, v: value-to-return, - // a: {option attribs} // optional: {skip: true, custom: true, cancel: true, newcol: true} - // }, - // ...] - // } - // - // popupele: gets popup element object when created - // contentele: gets element created with all the content - // listdiv: gets div with list of items - // customele: gets input element with custom value - // dragregistered: gets element, if any, registered as draggable - // - - SocialCalc.Popup.Types.List = {}; - - SocialCalc.Popup.Types.List.Create = function (type, id, attribs) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - var spcid = { type: type, value: "", display: "", data: {} }; - if (spc[id]) { - return; - } - spc[id] = spcid; - var spcdata = spcid.data; - - spcdata.attribs = attribs || {}; - - var ele = document.getElementById(id); - if (!ele) { - alert("Missing element " + id); - return; - } - - spcdata.mainele = ele; - - ele.innerHTML = - ''; - - spcdata.options = []; // set to nothing - use Initialize to fill - }; - - SocialCalc.Popup.Types.List.SetValue = function (type, id, value) { - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - spcdata.value = value; - spcdata.custom = false; - - for (i = 0; i < spcdata.options.length; i++) { - o = spcdata.options[i]; - if (o.a) { - if (o.a.skip || o.a.custom || o.a.cancel) { - continue; - } - } - if (o.v == spcdata.value) { - // matches value - spcdata.display = o.o; - break; - } - } - if (i == spcdata.options.length) { - // none found - spcdata.display = "Custom"; - spcdata.custom = true; - } - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.value = spcdata.display; - } - }; - - SocialCalc.Popup.Types.List.SetDisabled = function (type, id, disabled) { - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - spcdata.disabled = disabled; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = disabled; - } - }; - - SocialCalc.Popup.Types.List.GetValue = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - return spcdata.value; - }; - - // data is: {value: initial value, attribs: {attribs stuff}, options: [{o: option-name, v: value-to-return, a: optional-attribs}, ...]} - - SocialCalc.Popup.Types.List.Initialize = function (type, id, data) { - var a; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - for (a in data.attribs) { - spcdata.attribs[a] = data.attribs[a]; - } - - spcdata.options = data ? data.options : []; - - if (data.value) { - // if has a value, set to it - sp.SetValue(id, data.value); - } - }; - - SocialCalc.Popup.Types.List.Reset = function (type) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (sp.Current.id && spc[sp.Current.id].type == type) { - // we have a popup - spt[type].Hide(type, sp.Current.id); - sp.Current.id = null; - } - }; - - SocialCalc.Popup.Types.List.Show = function (type, id) { - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var str = ""; - - spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs); - - if (spcdata.custom) { - str = SocialCalc.Popup.Types.List.MakeCustom(type, id); - - ele = document.createElement("div"); - ele.innerHTML = - '
    ' + - str + - "
    "; - - spcdata.customele = ele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = ele; - } else { - str = SocialCalc.Popup.Types.List.MakeList(type, id); - - ele = document.createElement("div"); - ele.innerHTML = - '
    ' + str + "
    "; - - spcdata.customele = null; - spcdata.listdiv = ele.firstChild; - spcdata.contentele = ele; - } - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = true; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.List.MakeList = function (type, id) { - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var str = ''; - var td = '" + td + "    " + "" + td; - spcdata.ncols += 1; - continue; - } - if (o.a.skip) { - str += - '
    ' + - o.o + - "
    "; - continue; - } - } - if (o.v == spcdata.value && !(o.a && (o.a.custom || o.a.cancel))) { - // matches value - bg = "background-color:#DDF;"; - } else { - bg = ""; - } - str += - '
    " + - o.o + - "
    "; - } - - str += "
    '; - - str += td; - - spcdata.ncols = 1; - - for (i = 0; i < spcdata.options.length; i++) { - o = spcdata.options[i]; - if (o.a) { - if (o.a.newcol) { - str += "
    "; - - return str; - }; - - SocialCalc.Popup.Types.List.MakeCustom = function (type, id) { - var SPLoc = SocialCalc.Popup.LocalizeString; - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - var val = spcdata.value; - val = SocialCalc.special_chars(val); - - str = - '

    ' + - '

    ' + - "" + - "" + - "' + - "
    "; - - return str; - }; - - SocialCalc.Popup.Types.List.ItemClicked = function (id, num) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var a = spcdata.options[num].a; - - if (a && a.custom) { - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeCustom("List", id); - nele = document.createElement("div"); - nele.innerHTML = - '
    ' + - str + - "
    "; - spcdata.customele = nele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - return; - } - - if (a && a.cancel) { - SocialCalc.Popup.Close(); - return; - } - - SocialCalc.Popup.SetValue(id, spcdata.options[num].v); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.List.CustomToList = function (id) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeList("List", id); - nele = document.createElement("div"); - nele.innerHTML = - '
    ' + str + "
    "; - spcdata.customele = null; - spcdata.listdiv = nele.firstChild; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.List.CustomOK = function (id) { - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.customele.value); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.List.MouseMove = function (id, ele) { - var col, i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var list = spcdata.listdiv; - - if (!list) return; - - var rowele = list.firstChild.firstChild.firstChild; // div.table.tbody.tr - - for (col = 0; col < spcdata.ncols; col++) { - for (i = 0; i < rowele.childNodes[col * 2].childNodes.length; i++) { - rowele.childNodes[col * 2].childNodes[i].style.backgroundColor = "#FFF"; - } - } - - ele.style.backgroundColor = "#DDF"; - }; - - SocialCalc.Popup.Types.List.Hide = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered); - spcdata.popupele = null; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = false; - } - }; - - SocialCalc.Popup.Types.List.Cancel = function (type, id) { - SocialCalc.Popup.Types.List.Hide(type, id); - }; - - // - // ColorChooser - // - // type: ColorChooser - // value: value of control as "rgb(r,g,b)" or "" if default, - // oldvalue: starting value to reset to on close, - // display: "value to display" as hex color value, - // custom: true if custom value, - // disabled: t/f, - // attribs: { - // title: "popup title string", - // moveable: t/f, - // width: optional width, e.g., "100px", of popup chooser - // ensureWithin: optional element object to ensure popup fits within if possible - // sampleWidth: optional width, e.g., "20px", - // sampleHeight: optional height, e.g., "20px", - // backgroundImage: optional background image for sample (transparent where want to show current color), e.g., "colorbg.gif" - // backgroundImageDefault: optional background image for sample when default (transparent shows white) - // backgroundImageDisabled: optional background image for sample when disabled (transparent shows gray) - // changedcallback: optional function(attribs, id, newvalue), - // ... - // } - // data: { - // } - // - // popupele: gets popup element object when created - // contentele: gets element created with all the content - // customele: gets input element with custom value - // - - SocialCalc.Popup.Types.ColorChooser = {}; - - SocialCalc.Popup.Types.ColorChooser.Create = function (type, id, attribs) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - var spcid = { type: type, value: "", display: "", data: {} }; - if (spc[id]) { - return; - } - spc[id] = spcid; - var spcdata = spcid.data; - - spcdata.attribs = attribs || {}; - var spca = spcdata.attribs; - - spcdata.value = ""; - - var ele = document.getElementById(id); - if (!ele) { - alert("Missing element " + id); - return; - } - - spcdata.mainele = ele; - - ele.innerHTML = - '
     
    "; - }; - - SocialCalc.Popup.Types.ColorChooser.SetValue = function (type, id, value) { - var i, img, pos; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.value = value; - spcdata.custom = false; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (spcdata.value) { - spcdata.mainele.firstChild.style.backgroundColor = spcdata.value; - if (spca.backgroundImage) { - img = "url(" + sp.imagePrefix + spca.backgroundImage + ")"; - } else { - img = ""; - } - pos = "center center"; - } else { - spcdata.mainele.firstChild.style.backgroundColor = "#FFF"; - if (spca.backgroundImageDefault) { - img = "url(" + sp.imagePrefix + spca.backgroundImageDefault + ")"; - pos = "center center"; - } else { - img = "url(" + sp.imagePrefix + "defaultcolor.gif)"; - pos = "left top"; - } - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } - }; - - SocialCalc.Popup.Types.ColorChooser.SetDisabled = function ( - type, - id, - disabled - ) { - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.disabled = disabled; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (disabled) { - spcdata.mainele.firstChild.style.backgroundColor = "#DDD"; - if (spca.backgroundImageDisabled) { - img = "url(" + sp.imagePrefix + spca.backgroundImageDisabled + ")"; - pos = "center center"; - } else { - img = "url(" + sp.imagePrefix + "defaultcolor.gif)"; - pos = "left top"; - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } else { - sp.SetValue(id, spcdata.value); - } - } - }; - - SocialCalc.Popup.Types.ColorChooser.GetValue = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - return spcdata.value; - }; - - SocialCalc.Popup.Types.ColorChooser.Initialize = function (type, id, data) { - var a; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - for (a in data.attribs) { - spcdata.attribs[a] = data.attribs[a]; - } - - if (data.value) { - // if has a value, set to it - sp.SetValue(id, data.value); - } - }; - - SocialCalc.Popup.Types.ColorChooser.Reset = function (type) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (sp.Current.id && spc[sp.Current.id].type == type) { - // we have a popup - spt[type].Hide(type, sp.Current.id); - sp.Current.id = null; - } - }; - - SocialCalc.Popup.Types.ColorChooser.Show = function (type, id) { - var i, ele, mainele; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var str = ""; - - spcdata.oldvalue = spcdata.value; // remember starting value - - spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs); - - if (spcdata.custom) { - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom(type, id); - - ele = document.createElement("div"); - ele.innerHTML = - '
    ' + - str + - "
    "; - - spcdata.customele = ele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = ele; - } else { - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid(type, id); - - ele = document.createElement("div"); - ele.style.padding = "3px"; - ele.style.backgroundColor = "#CCC"; - ele.appendChild(mainele); - - spcdata.customele = null; - spcdata.contentele = ele; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.ColorChooser.MakeCustom = function (type, id) { - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var SPLoc = sp.LocalizeString; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - str = - '

    ' + - '#

    ' + - "" + - "" + - "
    "; - - return str; - }; - - SocialCalc.Popup.Types.ColorChooser.ItemClicked = function (id, num) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.CustomToList = function (id) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - }; - - SocialCalc.Popup.Types.ColorChooser.CustomOK = function (id) { - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.customele.value); - - sp.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.Hide = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered); - spcdata.popupele = null; - }; - - SocialCalc.Popup.Types.ColorChooser.Cancel = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.oldvalue); // reset to old value - - SocialCalc.Popup.Types.ColorChooser.Hide(type, id); - }; - - SocialCalc.Popup.Types.ColorChooser.CreateGrid = function (type, id) { - var ele, pos, row, rowele, col, g; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var SPLoc = sp.LocalizeString; - var spcdata = spc[id].data; - spcdata.grid = {}; - var grid = spcdata.grid; - - var mainele = document.createElement("div"); - - ele = document.createElement("table"); - ele.cellSpacing = 0; - ele.cellPadding = 0; - ele.style.width = "100px"; - grid.table = ele; - - ele = document.createElement("tbody"); - grid.table.appendChild(ele); - grid.tbody = ele; - - for (row = 0; row < 16; row++) { - rowele = document.createElement("tr"); - for (col = 0; col < 5; col++) { - g = {}; - grid[row + "," + col] = g; - ele = document.createElement("td"); - ele.style.fontSize = "1px"; - ele.innerHTML = " "; - ele.style.height = "10px"; - if (col <= 1) { - ele.style.width = "17px"; - ele.style.borderRight = "3px solid white"; - } else { - ele.style.width = "20px"; - ele.style.backgroundRepeat = "no-repeat"; - } - rowele.appendChild(ele); - g.ele = ele; - } - grid.tbody.appendChild(rowele); - } - mainele.appendChild(grid.table); - - ele = document.createElement("div"); - ele.style.marginTop = "3px"; - ele.innerHTML = - '' + - '' + - '' + - '" + - "
     #' + - SPLoc("OK") + - "
    "; - grid.defaultbox = ele.firstChild.firstChild.firstChild.childNodes[0]; - grid.defaultbox.onclick = spt.ColorChooser.DefaultClicked; - grid.custom = ele.firstChild.firstChild.firstChild.childNodes[1]; - grid.custom.onclick = spt.ColorChooser.CustomClicked; - grid.msg = ele.firstChild.firstChild.firstChild.childNodes[2]; - grid.msg.onclick = spt.ColorChooser.CloseOK; - mainele.appendChild(ele); - - grid.table.onmousedown = spt.ColorChooser.GridMouseDown; - - spt.ColorChooser.DetermineColors(id); - spt.ColorChooser.SetColors(id); - - return mainele; - }; - - SocialCalc.Popup.Types.ColorChooser.gridToG = function (grid, row, col) { - return grid[row + "," + col]; - }; - - SocialCalc.Popup.Types.ColorChooser.DetermineColors = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - var col, row; - var rgb = sp.splitRGB(spcdata.value); - var color; - - col = 2; - row = 16 - Math.floor((rgb.r + 16) / 16); - grid["selectedrow" + col] = row; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB(17 * (15 - row), 0, 0); - } - - col = 3; - row = 16 - Math.floor((rgb.g + 16) / 16); - grid["selectedrow" + col] = row; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB(0, 17 * (15 - row), 0); - } - - col = 4; - row = 16 - Math.floor((rgb.b + 16) / 16); - grid["selectedrow" + col] = row; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB(0, 0, 17 * (15 - row)); - } - - col = 1; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB( - 17 * (15 - row), - 17 * (15 - row), - 17 * (15 - row) - ); - } - - col = 0; - var steps = [0, 68, 153, 204, 255]; - var commonrgb = [ - "400", - "310", - "420", - "440", - "442", - "340", - "040", - "042", - "032", - "044", - "024", - "004", - "204", - "314", - "402", - "414", - ]; - var x; - for (row = 0; row < 16; row++) { - x = commonrgb[row]; - sptc.gridToG(grid, row, col).rgb = - "rgb(" + - steps[x.charAt(0) - 0] + - "," + - steps[x.charAt(1) - 0] + - "," + - steps[x.charAt(2) - 0] + - ")"; - } - }; - - SocialCalc.Popup.Types.ColorChooser.SetColors = function (id) { - var row, col, g, ele, rgb; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - for (row = 0; row < 16; row++) { - for (col = 0; col < 5; col++) { - g = sptc.gridToG(grid, row, col); - g.ele.style.backgroundColor = g.rgb; - g.ele.title = sp.RGBToHex(g.rgb); - if (grid["selectedrow" + col] == row) { - g.ele.style.backgroundImage = - "url(" + sp.imagePrefix + "chooserarrow.gif)"; - } else { - g.ele.style.backgroundImage = ""; - } - } - } - - sp.SetValue(id, spcdata.value); - - grid.msg.style.backgroundColor = spcdata.value; - rgb = sp.splitRGB(spcdata.value || "rgb(255,255,255)"); - if (rgb.r + rgb.g + rgb.b < 220) { - grid.msg.style.color = "#FFF"; - } else { - grid.msg.style.color = "#000"; - } - if (!spcdata.value) { - // default - grid.msg.style.backgroundColor = "#FFF"; - grid.msg.style.backgroundImage = - "url(" + sp.imagePrefix + "defaultcolor.gif)"; - grid.msg.title = "Default"; - } else { - grid.msg.style.backgroundImage = ""; - grid.msg.title = sp.RGBToHex(spcdata.value); - } - }; - - SocialCalc.Popup.Types.ColorChooser.GridMouseDown = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - var grid = spcdata.grid; - - switch (event.type) { - case "mousedown": - grid.mousedown = true; - break; - case "mouseup": - grid.mousedown = false; - break; - case "mousemove": - if (!grid.mousedown) { - return; - } - break; - } - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - var gpos = SocialCalc.GetElementPosition(grid.table); - var row = Math.floor((clientY - gpos.top - 2) / 10); // -2 is to split the diff btw IE & FF - row = row < 0 ? 0 : row; - var col = Math.floor((clientX - gpos.left) / 20); - row = row < 0 ? 0 : row > 15 ? 15 : row; - col = col < 0 ? 0 : col > 4 ? 4 : col; - var color = sptc.gridToG(grid, row, col).ele.style.backgroundColor; - var newrgb = sp.splitRGB(color); - var oldrgb = sp.splitRGB(spcdata.value); - - switch (col) { - case 2: - spcdata.value = sp.makeRGB(newrgb.r, oldrgb.g, oldrgb.b); - break; - case 3: - spcdata.value = sp.makeRGB(oldrgb.r, newrgb.g, oldrgb.b); - break; - case 4: - spcdata.value = sp.makeRGB(oldrgb.r, oldrgb.g, newrgb.b); - break; - case 0: - case 1: - spcdata.value = color; - } - - sptc.DetermineColors(id); - sptc.SetColors(id); - }; - - SocialCalc.Popup.Types.ColorChooser.ControlClicked = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var cid = sp.Current.id; - if (!cid || id != cid) { - sp.CClick(id); - return; - } - - sptc.CloseOK(); - }; - - SocialCalc.Popup.Types.ColorChooser.DefaultClicked = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - spcdata.value = ""; - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.CustomClicked = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - var oele, str, nele; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom("ColorChooser", id); - nele = document.createElement("div"); - nele.innerHTML = - '
    ' + - str + - "
    "; - spcdata.customele = nele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - spcdata.customele.value = sp.RGBToHex(spcdata.value); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.ColorChooser.CustomToGrid = function (id) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#" + spcdata.customele.value)); - - var oele, mainele, nele; - - oele = spcdata.contentele; - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid( - "ColorChooser", - id - ); - nele = document.createElement("div"); - nele.style.padding = "3px"; - nele.style.backgroundColor = "#CCC"; - nele.appendChild(mainele); - spcdata.customele = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.ColorChooser.CustomOK = function (id) { - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#" + spcdata.customele.value)); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.CloseOK = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - }; - - // - // SocialCalcSpreadsheetControl - // - /* -// The code module of the SocialCalc package that lets you embed a spreadsheet -// control with toolbar, etc., into a web page. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - - /* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript SpreadsheetControl. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the SpreadsheetControl is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/ - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - - // - // Some of the other files in the SocialCalc package are licensed under - // different licenses. Please note the licenses of the modules you use. - // - // Code History: - // - // Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. - // Unless otherwise specified, referring to "SocialCalc" in comments refers to this - // JavaScript version of the code, not the SocialCalc Perl code. - // - - /* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); - } - - // ************************************* - // - // SpreadsheetControl class: - // - // ************************************* - - // Global constants: - - SocialCalc.CurrentSpreadsheetControlObject = null; // right now there can only be one active at a time - - // Constructor: - - SocialCalc.SpreadsheetControl = function () { - var scc = SocialCalc.Constants; - - // Properties: - - this.parentNode = null; - this.spreadsheetDiv = null; - this.requestedHeight = 0; - this.requestedWidth = 0; - this.requestedSpaceBelow = 0; - this.height = 0; - this.width = 0; - this.viewheight = 0; // calculated amount for views below toolbar, etc. - - // Tab definitions: An array where each tab is an object of the form: - // - // name: "name", - // text: "text-on-tab", - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext - // Other replacements from spreadsheet.tabreplacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // view: "viewname", // view to show when selected; "sheet" or missing/null is spreadsheet - // oncreate: function(spreadsheet, tab-name), // called when first created to initialize - // onclick: function(spreadsheet, tab-name), missing/null is sheet default - // onclickFocus: text, // spreadsheet.idPrefix+text is given the focus if present instead of normal KeyboardFocus - // or if text isn't a string, that value (e.g., true) is used for SocialCalc.CmdGotFocus - // onunclick: function(spreadsheet, tab-name), missing/null is sheet default - - this.tabs = []; - this.tabnums = {}; // when adding tabs, add tab-name: array-index to this object - this.tabreplacements = {}; // see use above - this.currentTab = -1; // currently selected tab index in this.tabs or -1 (maintained by SocialCalc.SetTab) - - // View definitions: An object where each view is an object of the form: - // - // name: "name", // localized when first set using SocialCalc.LocalizeString - // element: node-in-the-dom, // filled in when initialized - // replacements: {}, // see below - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext, "%img.": spreadsheet.imagePrefix, - // SocialCalc.LocalizeSubstring replacements ("%loc!string!" and "%ssc!constant-name!") - // Other replacements from viewobject.replacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // divStyle: attributes for sheet div (SocialCalc.setStyles format) - // oncreate: function(spreadsheet, viewobject), // called when first created to initialize - // needsresize: true/false/null, // if true, do resize calc after displaying - // onresize: function(spreadsheet, viewobject), // called if needs resize - // values: {} // optional values to share with onclick handlers, etc. - // - // There is always a "sheet" view. - - this.views = {}; // {viewname: view-object, ...} - - // Dynamic properties: - - this.sheet = null; - this.context = null; - this.editor = null; - - this.spreadsheetDiv = null; - this.editorDiv = null; - - this.sortrange = ""; // remembered range for sort tab - - this.moverange = ""; // remembered range from movefrom used by movepaste/moveinsert - - // Constants: - - this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-" - this.multipartBoundary = "SocialCalcSpreadsheetControlSave"; // boundary used by SpreadsheetControlCreateSpreadsheetSave - this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src - - this.toolbarbackground = scc.SCToolbarbackground; - this.tabbackground = scc.SCTabbackground; // "background-color:#CCC;"; - this.tabselectedCSS = scc.SCTabselectedCSS; - this.tabplainCSS = scc.SCTabplainCSS; - this.toolbartext = scc.SCToolbartext; - - this.formulabarheight = scc.SCFormulabarheight; // in pixels, will contain a text input box - - if (scc.doWorkBook) { - this.sheetbarheight = scc.SCSheetBarHeight; - this.sheetbarCSS = scc.SCSheetBarCSS; - } else { - this.sheetbarheight = 0; - } - - this.statuslineheight = scc.SCStatuslineheight; // in pixels - this.statuslineCSS = scc.SCStatuslineCSS; - - // Callbacks: - - this.ExportCallback = null; // a function called for Clipboard Export button: this.ExportCallback(spreadsheet_control_object) - - // Initialization Code: - - this.sheet = new SocialCalc.Sheet(); - this.context = new SocialCalc.RenderContext(this.sheet); - this.context.showGrid = true; - this.context.showRCHeaders = true; - this.editor = new SocialCalc.TableEditor(this.context); - this.editor.StatusCallback.statusline = { - func: SocialCalc.SpreadsheetControlStatuslineCallback, - params: { - statuslineid: this.idPrefix + "statusline", - recalcid1: this.idPrefix + "divider_recalc", - recalcid2: this.idPrefix + "button_recalc", - }, - }; - - SocialCalc.CurrentSpreadsheetControlObject = this; // remember this for rendezvousing on events - - this.editor.MoveECellCallback.movefrom = function (editor) { - var cr; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - spreadsheet.context.cursorsuffix = ""; - if (editor.range2.hasrange && !editor.cellhandles.noCursorSuffix) { - if ( - editor.ecell.row == editor.range2.top && - (editor.ecell.col < editor.range2.left || - editor.ecell.col > editor.range2.right + 1) - ) { - spreadsheet.context.cursorsuffix = "insertleft"; - } - if ( - editor.ecell.col == editor.range2.left && - (editor.ecell.row < editor.range2.top || - editor.ecell.row > editor.range2.bottom + 1) - ) { - spreadsheet.context.cursorsuffix = "insertup"; - } - } - }; - - // formula bar buttons - - this.formulabuttons = { - formulafunctions: { - image: "formuladialog.gif", - tooltip: "Functions", // tooltips are localized when set below - command: SocialCalc.SpreadsheetControl.DoFunctionList, - }, - multilineinput: { - image: "multilinedialog.gif", - tooltip: "Multi-line Input Box", - command: SocialCalc.SpreadsheetControl.DoMultiline, - }, - link: { - image: "linkdialog.gif", - tooltip: "Link Input Box", - command: SocialCalc.SpreadsheetControl.DoLink, - }, - sum: { - image: "sumdialog.gif", - tooltip: "Auto Sum", - command: SocialCalc.SpreadsheetControl.DoSum, - }, - /* image: {image: "sumdialog.gif", tooltip: "Insert", - command: SocialCalc.Images.Insert }*/ - }; - - // Default tabs: - - // Edit - - this.tabnums.edit = this.tabs.length; - this.tabs.push({ - name: "edit", - text: "Edit", - html: - '
    ' + - ' ' + - ' ' + - '    ' + - '' + - ' ' + - ' ' + - '    ' + - '' + - ' ' + - '    ' + - '' + - ' ' + - '    ' + - '' + - ' ' + - ' ' + - '    ' + - '' + - ' ' + - ' ' + - '    ' + - ' ' + - ' ' + - ' ' + - '    ' + - ' ' + - ' ' + - '    ' + - ' ' + - ' ' + - '  ' + - ' ' + - '    ' + - ' ' + - "
    ", - oncreate: null, //function(spreadsheet, viewobject) {SocialCalc.DoCmd(null, "fill-rowcolstuff");}, - onclick: null, - }); - - // Settings (Format) - - this.tabnums.settings = this.tabs.length; - this.tabs.push({ - name: "settings", - text: "Format", - html: - '", - view: "settings", - onclick: function (s, t) { - SocialCalc.SettingsControls.idPrefix = s.idPrefix; // used to get color chooser div - SocialCalc.SettingControlReset(); - var sheetattribs = s.sheet.EncodeSheetAttributes(); - var cellattribs = s.sheet.EncodeCellAttributes(s.editor.ecell.coord); - SocialCalc.SettingsControlLoadPanel( - s.views.settings.values.sheetspanel, - sheetattribs - ); - SocialCalc.SettingsControlLoadPanel( - s.views.settings.values.cellspanel, - cellattribs - ); - document.getElementById(s.idPrefix + "settingsecell").innerHTML = - s.editor.ecell.coord; - SocialCalc.SpreadsheetControlSettingsSwitch("cell"); - s.views.settings.element.style.height = s.viewheight + "px"; - s.views.settings.element.firstChild.style.height = s.viewheight + "px"; - - var range; // set save message - if (s.editor.range.hasrange) { - range = - SocialCalc.crToCoord(s.editor.range.left, s.editor.range.top) + - ":" + - SocialCalc.crToCoord(s.editor.range.right, s.editor.range.bottom); - } else { - range = s.editor.ecell.coord; - } - document.getElementById(s.idPrefix + "settings-savecell").value = - SocialCalc.LocalizeString("Save to") + ": " + range; - }, - onclickFocus: true, - }); - - this.views["settings"] = { - name: "settings", - values: {}, - oncreate: function (s, viewobj) { - var scc = SocialCalc.Constants; - - viewobj.values.sheetspanel = { - // name: "sheet", - colorchooser: { id: s.idPrefix + "scolorchooser" }, - formatnumber: { - setting: "numberformat", - type: "PopupList", - id: s.idPrefix + "formatnumber", - initialdata: scc.SCFormatNumberFormats, - }, - formattext: { - setting: "textformat", - type: "PopupList", - id: s.idPrefix + "formattext", - initialdata: scc.SCFormatTextFormats, - }, - fontfamily: { - setting: "fontfamily", - type: "PopupList", - id: s.idPrefix + "fontfamily", - initialdata: scc.SCFormatFontfamilies, - }, - fontlook: { - setting: "fontlook", - type: "PopupList", - id: s.idPrefix + "fontlook", - initialdata: scc.SCFormatFontlook, - }, - fontsize: { - setting: "fontsize", - type: "PopupList", - id: s.idPrefix + "fontsize", - initialdata: scc.SCFormatFontsizes, - }, - textalignhoriz: { - setting: "textalignhoriz", - type: "PopupList", - id: s.idPrefix + "textalignhoriz", - initialdata: scc.SCFormatTextAlignhoriz, - }, - numberalignhoriz: { - setting: "numberalignhoriz", - type: "PopupList", - id: s.idPrefix + "numberalignhoriz", - initialdata: scc.SCFormatNumberAlignhoriz, - }, - alignvert: { - setting: "alignvert", - type: "PopupList", - id: s.idPrefix + "alignvert", - initialdata: scc.SCFormatAlignVertical, - }, - textcolor: { - setting: "textcolor", - type: "ColorChooser", - id: s.idPrefix + "textcolor", - }, - bgcolor: { - setting: "bgcolor", - type: "ColorChooser", - id: s.idPrefix + "bgcolor", - }, - padtop: { - setting: "padtop", - type: "PopupList", - id: s.idPrefix + "padtop", - initialdata: scc.SCFormatPadsizes, - }, - padright: { - setting: "padright", - type: "PopupList", - id: s.idPrefix + "padright", - initialdata: scc.SCFormatPadsizes, - }, - padbottom: { - setting: "padbottom", - type: "PopupList", - id: s.idPrefix + "padbottom", - initialdata: scc.SCFormatPadsizes, - }, - padleft: { - setting: "padleft", - type: "PopupList", - id: s.idPrefix + "padleft", - initialdata: scc.SCFormatPadsizes, - }, - colwidth: { - setting: "colwidth", - type: "PopupList", - id: s.idPrefix + "colwidth", - initialdata: scc.SCFormatColwidth, - }, - recalc: { - setting: "recalc", - type: "PopupList", - id: s.idPrefix + "recalc", - initialdata: scc.SCFormatRecalc, - }, - }; - viewobj.values.cellspanel = { - name: "cell", - colorchooser: { id: s.idPrefix + "scolorchooser" }, - cformatnumber: { - setting: "numberformat", - type: "PopupList", - id: s.idPrefix + "cformatnumber", - initialdata: scc.SCFormatNumberFormats, - }, - cformattext: { - setting: "textformat", - type: "PopupList", - id: s.idPrefix + "cformattext", - initialdata: scc.SCFormatTextFormats, - }, - cfontfamily: { - setting: "fontfamily", - type: "PopupList", - id: s.idPrefix + "cfontfamily", - initialdata: scc.SCFormatFontfamilies, - }, - cfontlook: { - setting: "fontlook", - type: "PopupList", - id: s.idPrefix + "cfontlook", - initialdata: scc.SCFormatFontlook, - }, - cfontsize: { - setting: "fontsize", - type: "PopupList", - id: s.idPrefix + "cfontsize", - initialdata: scc.SCFormatFontsizes, - }, - calignhoriz: { - setting: "alignhoriz", - type: "PopupList", - id: s.idPrefix + "calignhoriz", - initialdata: scc.SCFormatTextAlignhoriz, - }, - calignvert: { - setting: "alignvert", - type: "PopupList", - id: s.idPrefix + "calignvert", - initialdata: scc.SCFormatAlignVertical, - }, - ctextcolor: { - setting: "textcolor", - type: "ColorChooser", - id: s.idPrefix + "ctextcolor", - }, - cbgcolor: { - setting: "bgcolor", - type: "ColorChooser", - id: s.idPrefix + "cbgcolor", - }, - cbt: { setting: "bt", type: "BorderSide", id: s.idPrefix + "cbt" }, - cbr: { setting: "br", type: "BorderSide", id: s.idPrefix + "cbr" }, - cbb: { setting: "bb", type: "BorderSide", id: s.idPrefix + "cbb" }, - cbl: { setting: "bl", type: "BorderSide", id: s.idPrefix + "cbl" }, - cpadtop: { - setting: "padtop", - type: "PopupList", - id: s.idPrefix + "cpadtop", - initialdata: scc.SCFormatPadsizes, - }, - cpadright: { - setting: "padright", - type: "PopupList", - id: s.idPrefix + "cpadright", - initialdata: scc.SCFormatPadsizes, - }, - cpadbottom: { - setting: "padbottom", - type: "PopupList", - id: s.idPrefix + "cpadbottom", - initialdata: scc.SCFormatPadsizes, - }, - cpadleft: { - setting: "padleft", - type: "PopupList", - id: s.idPrefix + "cpadleft", - initialdata: scc.SCFormatPadsizes, - }, - }; - - SocialCalc.SettingsControlInitializePanel(viewobj.values.sheetspanel); - SocialCalc.SettingsControlInitializePanel(viewobj.values.cellspanel); - }, - replacements: { - itemtitle: { - regex: /\%itemtitle\./g, - replacement: - 'style="padding:12px 10px 0px 10px;font-weight:bold;text-align:right;vertical-align:top;font-size:small;"', - }, - sectiontitle: { - regex: /\%sectiontitle\./g, - replacement: - 'style="padding:16px 10px 0px 0px;font-weight:bold;vertical-align:top;font-size:small;color:#C00;"', - }, - parttitle: { - regex: /\%parttitle\./g, - replacement: - 'style="font-weight:bold;font-size:x-small;padding:0px 0px 3px 0px;"', - }, - itembody: { - regex: /\%itembody\./g, - replacement: - 'style="padding:12px 0px 0px 0px;vertical-align:top;font-size:small;"', - }, - bodypart: { - regex: /\%bodypart\./g, - replacement: - 'style="padding:0px 10px 0px 0px;font-size:small;vertical-align:top;"', - }, - }, - divStyle: "border:1px solid black;overflow:auto;", - html: - '' + - '' + - '
    ' + - '' + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - '' + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "

    %loc!Format!:
    " + - ' ' + - " " + - " " + - "
    " + - "
    %loc!Number!
    " + - ' ' + - "
    " + - "
    %loc!Text!
    " + - ' ' + - "
    " + - "

    %loc!Alignment!:
    " + - ' ' + - " " + - " " + - "
    " + - "
    %loc!Horizontal!
    " + - ' ' + - "
    " + - "
    %loc!Vertical!
    " + - ' ' + - "
    " + - "

    %loc!Font!:
    " + - ' ' + - " " + - " " + - " " + - " " + - " " + - "
    " + - "
    %loc!Family!
    " + - ' ' + - "
    " + - "
    %loc!Bold & Italics!
    " + - ' ' + - "
    " + - "
    %loc!Size!
    " + - ' ' + - "
    " + - "
    %loc!Color!
    " + - '
    ' + - "
    " + - "
    %loc!Background!
    " + - '
    ' + - "
    " + - "

    %loc!Borders!:
    " + - ' ' + - ' ' + - ' ' + - ' ' + - ' ' + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - "
    %loc!Top Border!
    %loc!Right Border!
    %loc!Bottom Border!
    %loc!Left Border!
    " + - ' ' + - " " + - '
    ' + - "
        " + - ' ' + - " " + - '
    ' + - "
        " + - ' ' + - " " + - '
    ' + - "
        " + - ' ' + - " " + - '
    ' + - "
        
    " + - "

    %loc!Padding!:
    " + - ' ' + - " " + - " " + - " " + - " " + - "
    " + - "
    %loc!Top!
    " + - ' ' + - "
    " + - "
    %loc!Right!
    " + - ' ' + - "
    " + - "
    %loc!Bottom!
    " + - ' ' + - "
    " + - "
    %loc!Left!
    " + - ' ' + - "
    " + - "
    " + - '
    ' + - '
    ' + - ' ' + - ' ' + - "
    %loc!This is a
    sample!
    -1234.5
    " + - "
    " + - "
    " + - "
    ", - }; - - // Sort - - this.tabnums.sort = this.tabs.length; - this.tabs.push({ - name: "sort", - text: "Sort", - html: - ' ", - onclick: SocialCalc.SpreadsheetControlSortOnclick, - }); - this.editor.SettingsCallbacks.sort = { - save: SocialCalc.SpreadsheetControlSortSave, - load: SocialCalc.SpreadsheetControlSortLoad, - }; - - // Audit - - this.tabnums.audit = this.tabs.length; - this.tabs.push({ - name: "audit", - text: "Audit", - html: - '", - view: "audit", - onclick: function (s, t) { - var SCLoc = SocialCalc.LocalizeString; - var i, j; - var str = - '
    ' + - SCLoc("Audit Trail This Session") + - ":

    "; - var stack = s.sheet.changes.stack; - var tos = s.sheet.changes.tos; - for (i = 0; i < stack.length; i++) { - if (i == tos + 1) - str += - '
    ' + - SCLoc("UNDONE STEPS") + - ":
    "; - for (j = 0; j < stack[i].command.length; j++) { - str += SocialCalc.special_chars(stack[i].command[j]) + "
    "; - } - } - s.views.audit.element.innerHTML = str + "
    "; - SocialCalc.CmdGotFocus(true); - }, - onclickFocus: true, - }); - - this.views["audit"] = { - name: "audit", - divStyle: "border:1px solid black;overflow:auto;", - html: "Audit Trail", - }; - - // Comment - - this.tabnums.comment = this.tabs.length; - this.tabs.push({ - name: "comment", - text: "Comment", - html: - '", - view: "sheet", - onclick: SocialCalc.SpreadsheetControlCommentOnclick, - onunclick: SocialCalc.SpreadsheetControlCommentOnunclick, - }); - - // Names - - this.tabnums.names = this.tabs.length; - this.tabs.push({ - name: "names", - text: "Names", - html: - '", - view: "sheet", - onclick: SocialCalc.SpreadsheetControlNamesOnclick, - onunclick: SocialCalc.SpreadsheetControlNamesOnunclick, - }); - - // Clipboard - - this.tabnums.clipboard = this.tabs.length; - this.tabs.push({ - name: "clipboard", - text: "Clipboard", - html: - '", - view: "clipboard", - onclick: SocialCalc.SpreadsheetControlClipboardOnclick, - onclickFocus: "clipboardtext", - }); - - this.views["clipboard"] = { - name: "clipboard", - divStyle: "overflow:auto;", - html: - '
    ' + - " %loc!Display Clipboard in!:" + - ' %loc!Tab-delimited format!  ' + - ' %loc!CSV format!  ' + - ' %loc!SocialCalc-save format!' + - "
    " + - '   ' + - '   ' + - "
    " + - ' ', - }; - - return; - }; - - // Methods: - - SocialCalc.SpreadsheetControl.prototype.InitializeSpreadsheetControl = - function (node, height, width, spacebelow) { - return SocialCalc.InitializeSpreadsheetControl( - this, - node, - height, - width, - spacebelow - ); - }; - SocialCalc.SpreadsheetControl.prototype.DoOnResize = function () { - return SocialCalc.DoOnResize(this); - }; - SocialCalc.SpreadsheetControl.prototype.SizeSSDiv = function () { - return SocialCalc.SizeSSDiv(this); - }; - SocialCalc.SpreadsheetControl.prototype.ExecuteCommand = function ( - combostr, - sstr - ) { - return SocialCalc.SpreadsheetControlExecuteCommand(this, combostr, sstr); - }; - SocialCalc.SpreadsheetControl.prototype.CreateSheetHTML = function () { - return SocialCalc.SpreadsheetControlCreateSheetHTML(this); - }; - SocialCalc.SpreadsheetControl.prototype.CreateSpreadsheetSave = function ( - otherparts - ) { - return SocialCalc.SpreadsheetControlCreateSpreadsheetSave(this, otherparts); - }; - SocialCalc.SpreadsheetControl.prototype.DecodeSpreadsheetSave = function ( - str - ) { - return SocialCalc.SpreadsheetControlDecodeSpreadsheetSave(this, str); - }; - SocialCalc.SpreadsheetControl.prototype.CreateCellHTML = function (coord) { - return SocialCalc.SpreadsheetControlCreateCellHTML(this, coord); - }; - SocialCalc.SpreadsheetControl.prototype.CreateCellHTMLSave = function ( - range - ) { - return SocialCalc.SpreadsheetControlCreateCellHTMLSave(this, range); - }; - - // Sheet Methods to make things a little easier: - - SocialCalc.SpreadsheetControl.prototype.ParseSheetSave = function (str) { - return this.sheet.ParseSheetSave(str); - }; - SocialCalc.SpreadsheetControl.prototype.CreateSheetSave = function () { - return this.sheet.CreateSheetSave(); - }; - - // Functions: - - // - // InitializeSpreadsheetControl(spreadsheet, node, height, width, spacebelow) - // - // Creates the control elements and makes them the child of node (string or element). - // If present, height and width specify size. - // If either is 0 or null (missing), the maximum that fits on the screen - // (taking spacebelow into account) is used. - // - // Displays the tabs and creates the views (other than "sheet"). - // The first tab is set as selected, but onclick is not invoked. - // - // You should do a redisplay or recalc (which redisplays) after running this. - // - - SocialCalc.InitializeSpreadsheetControl = function ( - spreadsheet, - node, - height, - width, - spacebelow - ) { - var scc = SocialCalc.Constants; - var SCLoc = SocialCalc.LocalizeString; - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var html, child, i, vname, v, style, button, bele; - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - spreadsheet.requestedHeight = height; - spreadsheet.requestedWidth = width; - spreadsheet.requestedSpaceBelow = spacebelow; - - if (typeof node == "string") node = document.getElementById(node); - - if (node == null) { - alert("SocialCalc.SpreadsheetControl not given parent node."); - } - - spreadsheet.parentNode = node; - - // create node to hold spreadsheet control - - spreadsheet.spreadsheetDiv = document.createElement("div"); - - spreadsheet.SizeSSDiv(); // calculate and fill in the size values - - for (child = node.firstChild; child != null; child = node.firstChild) { - node.removeChild(child); - } - - // create the tabbed UI at the top - - html = - '
    '; - - for (i = 0; i < tabs.length; i++) { - html += tabs[i].html; - } - - html += - "
    " + - '
    ' + - ''; - - for (i = 0; i < tabs.length; i++) { - html += - ' "; - } - - html += "
    ' + - SCLoc(tabs[i].text) + - "
    "; - - spreadsheet.currentTab = 0; // this is where we started - - for (style in spreadsheet.tabreplacements) { - html = html.replace( - spreadsheet.tabreplacements[style].regex, - spreadsheet.tabreplacements[style].replacement - ); - } - html = html.replace(/\%s\./g, "SocialCalc."); - html = html.replace(/\%id\./g, spreadsheet.idPrefix); - html = html.replace(/\%tbt\./g, spreadsheet.toolbartext); - html = html.replace(/\%img\./g, spreadsheet.imagePrefix); - - html = SCLocSS(html); // localize with %loc!string! and %scc!constant! - - spreadsheet.spreadsheetDiv.innerHTML = html; - - node.appendChild(spreadsheet.spreadsheetDiv); - - // Initialize SocialCalc buttons - - spreadsheet.Buttons = { - button_undo: { tooltip: "Undo", command: "undo" }, - button_redo: { tooltip: "Redo", command: "redo" }, - button_copy: { tooltip: "Copy", command: "copy" }, - button_cut: { tooltip: "Cut", command: "cut" }, - button_paste: { tooltip: "Paste", command: "paste" }, - button_pasteformats: { - tooltip: "Paste Formats", - command: "pasteformats", - }, - button_delete: { tooltip: "Delete Contents", command: "delete" }, - button_filldown: { tooltip: "Fill Down", command: "filldown" }, - button_fillright: { tooltip: "Fill Right", command: "fillright" }, - button_movefrom: { tooltip: "Set/Clear Move From", command: "movefrom" }, - button_movepaste: { tooltip: "Move Paste", command: "movepaste" }, - button_moveinsert: { tooltip: "Move Insert", command: "moveinsert" }, - button_alignleft: { tooltip: "Align Left", command: "align-left" }, - button_aligncenter: { tooltip: "Align Center", command: "align-center" }, - button_alignright: { tooltip: "Align Right", command: "align-right" }, - button_borderon: { tooltip: "Borders On", command: "borderon" }, - button_borderoff: { tooltip: "Borders Off", command: "borderoff" }, - button_swapcolors: { tooltip: "Swap Colors", command: "swapcolors" }, - button_merge: { tooltip: "Merge Cells", command: "merge" }, - button_unmerge: { tooltip: "Unmerge Cells", command: "unmerge" }, - button_insertrow: { tooltip: "Insert Row", command: "insertrow" }, - button_insertcol: { tooltip: "Insert Column", command: "insertcol" }, - button_deleterow: { tooltip: "Delete Row", command: "deleterow" }, - button_deletecol: { tooltip: "Delete Column", command: "deletecol" }, - button_recalc: { tooltip: "Recalc", command: "recalc" }, - }; - - for (button in spreadsheet.Buttons) { - bele = document.getElementById(spreadsheet.idPrefix + button); - if (!bele) { - /*alert("Button "+(spreadsheet.idPrefix+button)+" missing");*/ continue; - } - bele.style.border = "1px solid " + scc.ISCButtonBorderNormal; - SocialCalc.TooltipRegister( - bele, - SCLoc(spreadsheet.Buttons[button].tooltip), - {} - ); - SocialCalc.ButtonRegister( - bele, - { - normalstyle: - "border:1px solid " + - scc.ISCButtonBorderNormal + - ";backgroundColor:" + - scc.ISCButtonBorderNormal + - ";", - hoverstyle: - "border:1px solid " + - scc.ISCButtonBorderHover + - ";backgroundColor:" + - scc.ISCButtonBorderNormal + - ";", - downstyle: - "border:1px solid " + - scc.ISCButtonBorderDown + - ";backgroundColor:" + - scc.ISCButtonDownBackground + - ";", - }, - { - MouseDown: SocialCalc.DoButtonCmd, - command: spreadsheet.Buttons[button].command, - } - ); - } - - // create formula bar - - spreadsheet.dummyFormulaDiv = document.createElement("div"); - spreadsheet.dummyFormulaDiv.style.height = - spreadsheet.formulabarheight + "px"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.dummyFormulaDiv); - - spreadsheet.formulabarDiv = document.createElement("div"); - spreadsheet.formulabarDiv.id = "formulabardiv"; - spreadsheet.formulabarDiv.style.height = - spreadsheet.formulabarheight + "px"; - spreadsheet.formulabarDiv.innerHTML = - ''; //' '; - //spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - var inputbox = new SocialCalc.InputBox( - spreadsheet.formulabarDiv.firstChild, - spreadsheet.editor - ); - - bele = document.createElement("img"); - bele.id = "testtest"; - bele.src = "lib/aspiring/www/assets/images/delete24.png"; - bele.style.verticalAlign = "middle"; - //bele.style.border = "1px solid #FFF"; - //bele.style.marginLeft = "4px"; - bele.style.display = "none"; - SocialCalc.ButtonRegister( - bele, - { normalstyle: "", hoverstyle: "", downstyle: "" }, - { MouseDown: SocialCalc.InputLineClearText } - ); - - // spreadsheet.formulabarDiv.appendChild(bele); - - /* - for (button in spreadsheet.formulabuttons) { - bele = document.createElement("img"); - bele.id = spreadsheet.idPrefix+button; - bele.src = spreadsheet.imagePrefix+spreadsheet.formulabuttons[button].image; - bele.style.verticalAlign = "middle"; - bele.style.border = "1px solid #FFF"; - bele.style.marginLeft = "4px"; - SocialCalc.TooltipRegister(bele, SCLoc(spreadsheet.formulabuttons[button].tooltip), {}); - SocialCalc.ButtonRegister(bele, - {normalstyle: "border:1px solid #FFF;backgroundColor:#FFF;", - hoverstyle: "border:1px solid #CCC;backgroundColor:#FFF;", - downstyle: "border:1px solid #000;backgroundColor:#FFF;"}, - {MouseDown: spreadsheet.formulabuttons[button].command}); - spreadsheet.formulabarDiv.appendChild(bele); - } - */ - // initialize tabs that need it - - for (i = 0; i < tabs.length; i++) { - // execute any tab-specific initialization code - if (tabs[i].oncreate) { - tabs[i].oncreate(spreadsheet, tabs[i].name); - } - } - - // create sheet view and others - if (!scc.doWorkBook) { - spreadsheet.nonviewheight = - spreadsheet.statuslineheight + - spreadsheet.spreadsheetDiv.firstChild.offsetHeight + - spreadsheet.spreadsheetDiv.lastChild.offsetHeight; - } else { - spreadsheet.nonviewheight = - 28 + - spreadsheet.sheetbarheight + - spreadsheet.spreadsheetDiv.firstChild.offsetHeight + - spreadsheet.spreadsheetDiv.lastChild.offsetHeight; - } - spreadsheet.viewheight = spreadsheet.height - spreadsheet.nonviewheight; - spreadsheet.editorDiv = spreadsheet.editor.CreateTableEditor( - spreadsheet.width, - spreadsheet.viewheight - ); - - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.editorDiv); - - for (vname in views) { - html = views[vname].html; - for (style in views[vname].replacements) { - html = html.replace( - views[vname].replacements[style].regex, - views[vname].replacements[style].replacement - ); - } - html = html.replace(/\%s\./g, "SocialCalc."); - html = html.replace(/\%id\./g, spreadsheet.idPrefix); - html = html.replace(/\%tbt\./g, spreadsheet.toolbartext); - html = html.replace(/\%img\./g, spreadsheet.imagePrefix); - v = document.createElement("div"); - SocialCalc.setStyles(v, views[vname].divStyle); - v.style.display = "none"; - v.style.width = spreadsheet.width + "px"; - v.style.height = spreadsheet.viewheight + "px"; - - html = SCLocSS(html); // localize with %loc!string!, etc. - - v.innerHTML = html; - spreadsheet.spreadsheetDiv.appendChild(v); - views[vname].element = v; - if (views[vname].oncreate) { - views[vname].oncreate(spreadsheet, views[vname]); - } - } - - views.sheet = { name: "sheet", element: spreadsheet.editorDiv }; - - // create statusline - - if (!scc.doWorkBook) { - spreadsheet.statuslineDiv = document.createElement("div"); - spreadsheet.statuslineDiv.style.cssText = spreadsheet.statuslineCSS; - // spreadsheet.statuslineDiv.style.height = spreadsheet.statuslineheight + "px"; // didn't take padding into account! - spreadsheet.statuslineDiv.style.height = - spreadsheet.statuslineheight - - (spreadsheet.statuslineDiv.style.paddingTop.slice(0, -2) - 0) - - (spreadsheet.statuslineDiv.style.paddingBottom.slice(0, -2) - 0) + - "px"; - spreadsheet.statuslineDiv.id = spreadsheet.idPrefix + "statusline"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.statuslineDiv); - } else { - SocialCalc.CreateSheetStatusBar(spreadsheet, scc); - } - - // done - refresh screen needed - - return; - }; - - SocialCalc.CreateSheetStatusBar = function (spreadsheet, scc) { - // create sheetbar - if (!scc.doWorkBook) { - return; - } - - // create a table with 1 row, containing 3 columns, 1 for sheetbar, 1 for separator, 1 for statusline - - spreadsheet.sheetstatusbarDiv = document.createElement("div"); - spreadsheet.sheetstatusbarDiv.style.height = - spreadsheet.sheetbarheight + 3 + "px"; - spreadsheet.sheetstatusbarDiv.style.backgroundColor = "#CCC"; - spreadsheet.sheetstatusbarDiv.id = spreadsheet.idPrefix + "sheetstatusbar"; - - spreadsheet.sheetbarDiv = document.createElement("div"); - //spreadsheet.sheetbarDiv.style.cssText = spreadsheet.sheetbarCSS; - spreadsheet.sheetbarDiv.id = spreadsheet.idPrefix + "sheetbar"; - - spreadsheet.statuslineDiv = document.createElement("div"); - spreadsheet.statuslineDiv.style.cssText = spreadsheet.statuslineCSS; - spreadsheet.statuslineDiv.id = spreadsheet.idPrefix + "statusline"; - - var table = document.createElement("table"); - spreadsheet.sheetstatusbartable = table; - table.cellSpacing = 0; - table.cellPadding = 0; - table.width = "100%"; - - var tbody = document.createElement("tbody"); - table.appendChild(tbody); - - var tr = document.createElement("tr"); - tbody.appendChild(tr); - var td = document.createElement("td"); - td.appendChild(spreadsheet.sheetbarDiv); - td.width = scc.SCSheetBarWidth; - tr.appendChild(td); - - td = document.createElement("td"); - td.innerHTML = " | "; - td.width = "1%"; - tr.appendChild(td); - - td = document.createElement("td"); - td.appendChild(spreadsheet.statuslineDiv); - tr.appendChild(td); - - spreadsheet.sheetstatusbarDiv.appendChild(table); - - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.sheetstatusbarDiv); - - spreadsheet.sheetstatusbarDiv.style.display = "none"; - }; - - // - // outstr = SocialCalc.LocalizeString(str) - // - // SocialCalc function to make localization easier. - // If str is "Text to localize", it returns - // SocialCalc.Constants.s_loc_text_to_localize if - // it exists, or else with just "Text to localize". - // Note that spaces are replaced with "_" and other special - // chars with "X" in the name of the constant (e.g., "A & B" - // would look for SocialCalc.Constants.s_loc_a_X_b. - // - - SocialCalc.LocalizeString = function (str) { - var cstr = SocialCalc.LocalizeStringList[str]; // found already this session? - if (!cstr) { - // no - look up - cstr = - SocialCalc.Constants[ - "s_loc_" + str.toLowerCase().replace(/\s/g, "_").replace(/\W/g, "X") - ] || str; - SocialCalc.LocalizeStringList[str] = cstr; - } - return cstr; - }; - - SocialCalc.LocalizeStringList = {}; // a list of strings to localize accumulated by the routine - - // - // outstr = SocialCalc.LocalizeSubstrings(str) - // - // SocialCalc function to make localization easier using %loc and %scc. - // - // Replaces sections of str with: - // %loc!Text to localize! - // with SocialCalc.Constants.s_loc_text_to_localize if - // it exists, or else with just "Text to localize". - // Note that spaces are replaced with "_" and other special - // chars with "X" in the name of the constant (e.g., %loc!A & B! - // would look for SocialCalc.Constants.s_loc_a_X_b. - // Uses SocialCalc.LocalizeString for this. - // - // Replaces sections of str with: - // %ssc!constant-name! - // with SocialCalc.Constants.constant-name. - // If the constant doesn't exist, throws and alert. - // - - SocialCalc.LocalizeSubstrings = function (str) { - var SCLoc = SocialCalc.LocalizeString; - - return str.replace(/%(loc|ssc)!(.*?)!/g, function (a, t, c) { - if (t == "ssc") { - return SocialCalc.Constants[c] || alert("Missing constant: " + c); - } else { - return SCLoc(c); - } - }); - }; - - // - // obj = GetSpreadsheetControlObject() - // - // Returns the current spreadsheet control object - // - - SocialCalc.GetSpreadsheetControlObject = function () { - var csco = SocialCalc.CurrentSpreadsheetControlObject; - if (csco) return csco; - - // throw ("No current SpreadsheetControl object."); - }; - - // - // SocialCalc.DoOnResize(spreadsheet) - // - // Processes an onResize event, setting the different views. - // - - SocialCalc.DoOnResize = function (spreadsheet) { - var v; - var views = spreadsheet.views; - - var needresize = spreadsheet.SizeSSDiv(); - if (!needresize) return; - - for (vname in views) { - v = views[vname].element; - v.style.width = spreadsheet.width + "px"; - v.style.height = spreadsheet.height - spreadsheet.nonviewheight + "px"; - } - - spreadsheet.editor.ResizeTableEditor( - spreadsheet.width, - spreadsheet.height - spreadsheet.nonviewheight - ); - }; - - // - // resized = SocialCalc.SizeSSDiv(spreadsheet) - // - // Figures out a reasonable size for the spreadsheet, given any requested values and viewport. - // Sets ssdiv to that. - // Return true if different than existing values. - // - - SocialCalc.SizeSSDiv = function (spreadsheet) { - var sizes, pos, resized, nodestyle, newval; - var fudgefactorX = 10; // for IE - var fudgefactorY = 10; - - resized = false; - - sizes = SocialCalc.GetViewportInfo(); - pos = SocialCalc.GetElementPosition(spreadsheet.parentNode); - pos.bottom = 0; - pos.right = 0; - - nodestyle = spreadsheet.parentNode.style; - - if (nodestyle.marginTop) { - pos.top += nodestyle.marginTop.slice(0, -2) - 0; - } - if (nodestyle.marginBottom) { - pos.bottom += nodestyle.marginBottom.slice(0, -2) - 0; - } - if (nodestyle.marginLeft) { - pos.left += nodestyle.marginLeft.slice(0, -2) - 0; - } - if (nodestyle.marginRight) { - pos.right += nodestyle.marginRight.slice(0, -2) - 0; - } - - newval = - spreadsheet.requestedHeight || - sizes.height - - (pos.top + pos.bottom + fudgefactorY) - - (spreadsheet.requestedSpaceBelow || 0); - if (spreadsheet.height != newval) { - spreadsheet.height = newval; - spreadsheet.spreadsheetDiv.style.height = newval + "px"; - resized = true; - } - newval = - spreadsheet.requestedWidth || - sizes.width - (pos.left + pos.right + fudgefactorX) || - 700; - if (spreadsheet.width != newval) { - spreadsheet.width = newval; - spreadsheet.spreadsheetDiv.style.width = newval + "px"; - resized = true; - } - - return resized; - }; - - // - // SocialCalc.SetTab(obj) - // - // The obj argument is either a string with the tab name or a DOM element with an ID - // - - SocialCalc.SetTab = function (obj) { - var newtab, tname, newtabnum, newview, i, vname, ele; - var menutabs = {}; - var tools = {}; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - if (typeof obj == "string") { - newtab = obj; - } else { - newtab = obj.id.slice(spreadsheet.idPrefix.length, -3); - } - - if ( - spreadsheet.editor.busy && // if busy and switching from "sheet", ignore - (!tabs[spreadsheet.currentTab].view || - tabs[spreadsheet.currentTab].view == "sheet") - ) { - for (i = 0; i < tabs.length; i++) { - if (tabs[i].name == newtab && tabs[i].view && tabs[i].view != "sheet") { - return; - } - } - } - - if (spreadsheet.tabs[spreadsheet.currentTab].onunclick) { - spreadsheet.tabs[spreadsheet.currentTab].onunclick( - spreadsheet, - spreadsheet.tabs[spreadsheet.currentTab].name - ); - } - - for (i = 0; i < tabs.length; i++) { - tname = tabs[i].name; - menutabs[tname] = document.getElementById( - spreadsheet.idPrefix + tname + "tab" - ); - tools[tname] = document.getElementById( - spreadsheet.idPrefix + tname + "tools" - ); - if (tname == newtab) { - newtabnum = i; - tools[tname].style.display = "block"; - menutabs[tname].style.cssText = spreadsheet.tabselectedCSS; - } else { - tools[tname].style.display = "none"; - menutabs[tname].style.cssText = spreadsheet.tabplainCSS; - } - } - - spreadsheet.currentTab = newtabnum; - - if (tabs[newtabnum].onclick) { - tabs[newtabnum].onclick(spreadsheet, newtab); - } - - for (vname in views) { - if ( - (!tabs[newtabnum].view && vname == "sheet") || - tabs[newtabnum].view == vname - ) { - views[vname].element.style.display = "block"; - newview = vname; - } else { - views[vname].element.style.display = "none"; - } - } - - if (tabs[newtabnum].onclickFocus) { - ele = tabs[newtabnum].onclickFocus; - if (typeof ele == "string") { - ele = document.getElementById(spreadsheet.idPrefix + ele); - ele.focus(); - } - SocialCalc.CmdGotFocus(ele); - } else { - SocialCalc.KeyboardFocus(); - } - - if (views[newview].needsresize && views[newview].onresize) { - views[newview].needsresize = false; - views[newview].onresize(spreadsheet, views[newview]); - } - - if (newview == "sheet") { - spreadsheet.statuslineDiv.style.display = "block"; - spreadsheet.editor.ScheduleRender(); - } else { - spreadsheet.statuslineDiv.style.display = "none"; - } - - return; - }; - - // - // SocialCalc.SpreadsheetControlStatuslineCallback - // - - SocialCalc.SpreadsheetControlStatuslineCallback = function ( - editor, - status, - arg, - params - ) { - var rele1, rele2; - - var ele = document.getElementById(params.statuslineid); - - if (ele) { - ele.innerHTML = editor.GetStatuslineString(status, arg, params); - } - - switch (status) { - case "cmdendnorender": - case "calcfinished": - case "doneposcalc": - rele1 = document.getElementById(params.recalcid1); - rele2 = document.getElementById(params.recalcid2); - if (!rele1 || !rele2) break; - if (editor.context.sheetobj.attribs.needsrecalc == "yes") { - rele1.style.display = "inline"; - rele2.style.display = "inline"; - } else { - rele1.style.display = "none"; - rele2.style.display = "none"; - } - break; - - default: - break; - } - }; - - // - // SocialCalc.UpdateSortRangeProposal(editor) - // - // Updates sort range proposed in the UI in element idPrefix+sortlist - // - - SocialCalc.UpdateSortRangeProposal = function (editor) { - var ele = document.getElementById( - SocialCalc.GetSpreadsheetControlObject().idPrefix + "sortlist" - ); - if (editor.range.hasrange) { - ele.options[0].text = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - ele.options[0].text = SocialCalc.LocalizeString("[select range]"); - } - }; - - // - // SocialCalc.LoadColumnChoosers(spreadsheet) - // - // Updates list of columns for choosing which to sort for Major, Minor, and Last sort - // - - SocialCalc.LoadColumnChoosers = function (spreadsheet) { - var SCLoc = SocialCalc.LocalizeString; - - var sortrange, nrange, rparts, col, colname, sele, oldindex; - - if (spreadsheet.sortrange && spreadsheet.sortrange.indexOf(":") == -1) { - // sortrange is a named range - nrange = SocialCalc.Formula.LookupName( - spreadsheet.sheet, - spreadsheet.sortrange || "" - ); - if (nrange.type == "range") { - rparts = nrange.value.match(/^(.*)\|(.*)\|$/); - sortrange = rparts[1] + ":" + rparts[2]; - } else { - sortrange = "A1:A1"; - } - } else { - sortrange = spreadsheet.sortrange; - } - var range = SocialCalc.ParseRange(sortrange); - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col = range.cr1.col; col <= range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option( - SCLoc("Column ") + colname, - colname - ); - } - sele.selectedIndex = - oldindex > 1 && oldindex <= range.cr2.col - range.cr1.col + 1 - ? oldindex - : 1; // restore what was there if reasonable - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col = range.cr1.col; col <= range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = - oldindex > 0 && oldindex <= range.cr2.col - range.cr1.col + 1 - ? oldindex - : 0; // default to [none] - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col = range.cr1.col; col <= range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = - oldindex > 0 && oldindex <= range.cr2.col - range.cr1.col + 1 - ? oldindex - : 0; // default to [none] - }; - - // - // SocialCalc.CmdGotFocus(obj) - // - // Sets SocialCalc.Keyboard.passThru: obj should be element with focus or "true" - // - - SocialCalc.CmdGotFocus = function (obj) { - SocialCalc.Keyboard.passThru = obj; - }; - - // - // SocialCalc.DoButtonCmd(e, buttoninfo, bobj) - // - - SocialCalc.DoButtonCmd = function (e, buttoninfo, bobj) { - SocialCalc.DoCmd(bobj.element, bobj.functionobj.command); - }; - - // - // SocialCalc.DoCmd(obj, which) - // - // xxx - // - - SocialCalc.DoCmd = function (obj, which) { - var combostr, - sstr, - cl, - i, - clele, - slist, - slistele, - str, - sele, - rele, - lele, - ele, - sortrange, - nrange, - rparts; - var sheet, cell, color, bgcolor, defaultcolor, defaultbgcolor; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - switch (which) { - case "undo": - spreadsheet.ExecuteCommand("undo", ""); - break; - - case "redo": - spreadsheet.ExecuteCommand("redo", ""); - break; - - case "fill-rowcolstuff": - case "fill-text": - cl = which.substring(5); - clele = document.getElementById(spreadsheet.idPrefix + cl + "list"); - clele.length = 0; - for (i = 0; i < SocialCalc.SpreadsheetCmdTable[cl].length; i++) { - clele.options[i] = new Option( - SocialCalc.SpreadsheetCmdTable[cl][i].t - ); - } - which = "changed-" + cl; // fall through to changed code - - case "changed-rowcolstuff": - case "changed-text": - cl = which.substring(8); - clele = document.getElementById(spreadsheet.idPrefix + cl + "list"); - slist = - SocialCalc.SpreadsheetCmdTable.slists[ - SocialCalc.SpreadsheetCmdTable[cl][clele.selectedIndex].s - ]; // get sList for this command - slistele = document.getElementById(spreadsheet.idPrefix + cl + "slist"); - slistele.length = 0; // reset - for (i = 0; i < (slist.length || 0); i++) { - slistele.options[i] = new Option(slist[i].t, slist[i].s); - } - return; // nothing else to do - - case "ok-rowcolstuff": - case "ok-text": - cl = which.substring(3); - clele = document.getElementById(spreadsheet.idPrefix + cl + "list"); - slistele = document.getElementById(spreadsheet.idPrefix + cl + "slist"); - combostr = SocialCalc.SpreadsheetCmdTable[cl][clele.selectedIndex].c; - sstr = slistele[slistele.selectedIndex].value; - SocialCalc.SpreadsheetControlExecuteCommand(obj, combostr, sstr); - break; - - case "ok-setsort": - lele = document.getElementById(spreadsheet.idPrefix + "sortlist"); - if (lele.selectedIndex == 0) { - if (editor.range.hasrange) { - spreadsheet.sortrange = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - spreadsheet.sortrange = - editor.ecell.coord + ":" + editor.ecell.coord; - } - } else { - spreadsheet.sortrange = lele.options[lele.selectedIndex].value; - } - ele = document.getElementById(spreadsheet.idPrefix + "sortbutton"); - ele.value = SocialCalc.LocalizeString("Sort ") + spreadsheet.sortrange; - ele.style.visibility = "visible"; - SocialCalc.LoadColumnChoosers(spreadsheet); - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - return; - - case "dosort": - if (spreadsheet.sortrange && spreadsheet.sortrange.indexOf(":") == -1) { - // sortrange is a named range - nrange = SocialCalc.Formula.LookupName( - spreadsheet.sheet, - spreadsheet.sortrange || "" - ); - if (nrange.type != "range") return; - rparts = nrange.value.match(/^(.*)\|(.*)\|$/); - sortrange = rparts[1] + ":" + rparts[2]; - } else { - sortrange = spreadsheet.sortrange; - } - if (sortrange == "A1:A1") return; - str = "sort " + sortrange + " "; - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - rele = document.getElementById(spreadsheet.idPrefix + "majorsortup"); - str += - sele.options[sele.selectedIndex].value + - (rele.checked ? " up" : " down"); - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "minorsortup"); - str += - " " + - sele.options[sele.selectedIndex].value + - (rele.checked ? " up" : " down"); - } - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "lastsortup"); - str += - " " + - sele.options[sele.selectedIndex].value + - (rele.checked ? " up" : " down"); - } - spreadsheet.ExecuteCommand(str, ""); - break; - - case "merge": - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - if (editor.range.hasrange) { - // set ecell to upper left - editor.MoveECell( - SocialCalc.crToCoord(editor.range.left, editor.range.top) - ); - editor.RangeRemove(); - } - break; - - case "movefrom": - if (editor.range2.hasrange) { - // toggle if already there - spreadsheet.context.cursorsuffix = ""; - editor.Range2Remove(); - spreadsheet.ExecuteCommand("redisplay", ""); - } else if (editor.range.hasrange) { - // set range2 to range or one cell - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.MoveECell( - SocialCalc.crToCoord(editor.range.left, editor.range.top) - ); - } else { - editor.range2.top = editor.ecell.row; - editor.range2.right = editor.ecell.col; - editor.range2.bottom = editor.ecell.row; - editor.range2.left = editor.ecell.col; - editor.range2.hasrange = true; - } - str = editor.range2.hasrange ? "" : "off"; - ele = document.getElementById(spreadsheet.idPrefix + "button_movefrom"); - ele.src = spreadsheet.imagePrefix + "movefrom" + str + ".gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_movepaste" - ); - ele.src = spreadsheet.imagePrefix + "movepaste" + str + ".gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_moveinsert" - ); - ele.src = spreadsheet.imagePrefix + "moveinsert" + str + ".gif"; - if (editor.range2.hasrange) editor.RangeRemove(); - break; - - case "movepaste": - case "moveinsert": - if (editor.range2.hasrange) { - spreadsheet.context.cursorsuffix = ""; - combostr = - which + - " " + - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + - ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) + - " " + - editor.ecell.coord; - spreadsheet.ExecuteCommand(combostr, ""); - editor.Range2Remove(); - ele = document.getElementById( - spreadsheet.idPrefix + "button_movefrom" - ); - ele.src = spreadsheet.imagePrefix + "movefromoff.gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_movepaste" - ); - ele.src = spreadsheet.imagePrefix + "movepasteoff.gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_moveinsert" - ); - ele.src = spreadsheet.imagePrefix + "moveinsertoff.gif"; - } - break; - - case "swapcolors": - sheet = spreadsheet.sheet; - cell = sheet.GetAssuredCell(editor.ecell.coord); - defaultcolor = sheet.attribs.defaultcolor - ? sheet.colors[sheet.attribs.defaultcolor] - : "rgb(0,0,0)"; - defaultbgcolor = sheet.attribs.defaultbgcolor - ? sheet.colors[sheet.attribs.defaultbgcolor] - : "rgb(255,255,255)"; - color = cell.color ? sheet.colors[cell.color] : defaultcolor; // get color - if (color == defaultbgcolor) color = ""; // going to swap, so if same as background default, use default - bgcolor = cell.bgcolor ? sheet.colors[cell.bgcolor] : defaultbgcolor; - if (bgcolor == defaultcolor) bgcolor = ""; // going to swap, so if same as foreground default, use default - spreadsheet.ExecuteCommand( - "set %C color " + bgcolor + "%Nset %C bgcolor " + color, - "" - ); - break; - - default: - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - break; - } - - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - }; - - SocialCalc.SpreadsheetCmdLookup = { - copy: "copy %C all", - cut: "cut %C all", - paste: "paste %C all", - pasteformats: "paste %C formats", - delete: "erase %C formulas", - filldown: "filldown %C all", - fillright: "fillright %C all", - erase: "erase %C all", - borderon: "set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S", - borderoff: "set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S", - merge: "merge %C", - unmerge: "unmerge %C", - "align-left": "set %C cellformat left", - "align-center": "set %C cellformat center", - "align-right": "set %C cellformat right", - "align-default": "set %C cellformat", - insertrow: "insertrow %C", - insertcol: "insertcol %C", - deleterow: "deleterow %C", - deletecol: "deletecol %C", - undo: "undo", - redo: "redo", - recalc: "recalc", - }; - - SocialCalc.SpreadsheetCmdSLookup = { - borderon: "1px solid rgb(0,0,0)", - borderoff: "", - }; - - /******* NO LONGER USED - -SocialCalc.SpreadsheetCmdTable = { - cmd: [ - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"}, - {t:"Copy", s:"all", c:"copy %C %S"}, - {t:"Cut", s:"all", c:"cut %C %S"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Merge Cells", s:"none", c:"merge %C"}, - {t:"Unmerge", s:"none", c:"unmerge %C"}, - {t:"Sort", s:"sortcol", c:"sort %R %S"}, - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Cell Borders", s:"borderOnOff", c:"set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S"}, - {t:"Column Width", s:"colWidths", c:"set %W width %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"}, - {t:"Default Column Width", s:"colWidths", c:"set sheet defaultcolwidth %S"} - ], - rowcolstuff: [ - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"} - ], - text: [ - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Text Format", s:"tvf", c:"set %C textvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Text Format", s:"tvf", c:"set sheet defaulttextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"} - ], - slists: { - "colors": [ - {t:"Default", s:""}, - {t:"Black", s:"rgb(0,0,0)"}, - {t:"Dark Gray", s:"rgb(102,102,102)"}, // #666 - {t:"Gray", s:"rgb(204,204,204)"}, // #CCC - {t:"White", s:"rgb(255,255,255)"}, - {t:"Red", s:"rgb(255,0,0)"}, - {t:"Dark Red", s:"rgb(153,0,0)"}, - {t:"Orange", s:"rgb(255,153,0)"}, - {t:"Yellow", s:"rgb(255,255,0)"}, - {t:"Light Yellow", s:"rgb(255,255,204)"}, - {t:"Green", s:"rgb(0,255,0)"}, - {t:"Dark Green", s:"rgb(0,153,0)"}, - {t:"Blue", s:"rgb(0,0,255)"}, - {t:"Dark Blue", s:"rgb(0,0,153)"}, - {t:"Light Blue", s:"rgb(204,204,255)"} - ], - "fonts": [ // style weight size family - {t:"Default", s:""}, - {t:"Bold", s:"normal bold * *"}, - {t:"Italic", s:"italic normal * *"}, - {t:"Small", s:"* small *"}, - {t:"Medium", s:"* medium *"}, - {t:"Large", s:"* large *"}, - {t:"Bold Small", s:"normal bold small *"}, - {t:"Bold Medium", s:"normal bold medium *"}, - {t:"Bold Large", s:"normal bold large *"} - ], - "cellformat": [ - {t:"Default", s:""}, - {t:"Left", s:"left"}, - {t:"Right", s:"right"}, - {t:"Center", s:"center"} - ], - "borderOnOff": [ - {t:"On", s:"1px solid rgb(0,0,0)"}, - {t:"Off", s:""} - ], - "colWidths": [ - {t:"Default", s:""}, - {t:"20", s:"20"}, - {t:"40", s:"40"}, - {t:"60", s:"60"}, - {t:"80", s:"80"}, - {t:"100", s:"100"}, - {t:"120", s:"120"}, - {t:"140", s:"140"}, - {t:"160", s:"160"}, - {t:"180", s:"180"}, - {t:"200", s:"200"}, - {t:"220", s:"220"}, - {t:"240", s:"240"}, - {t:"260", s:"260"}, - {t:"280", s:"280"}, - {t:"300", s:"300"} - ], - "ntvf": [ - {t:"Default", s:""}, - {t:"1234", s:"0"}, - {t:"1,234", s:"#,##0"}, - {t:"1,234.5", s:"#,##0.0"}, - {t:"1,234.56", s:"#,##0.00"}, - {t:"1,234.567", s:"#,##0.000"}, - {t:"1,234%", s:"#,##0%"}, - {t:"1,234.5%", s:"#,##0.0%"}, - {t:"(1,234)", s:"#,##0_);(#,##0)"}, - {t:"(1,234.5)", s:"#,##0.0_);(#,##0.0)"}, - {t:"(1,234.56)", s:"#,##0.00_);(#,##0.00)"}, - {t:"00", s:"00"}, - {t:"000", s:"000"}, - {t:"0000", s:"0000"}, - {t:"$1,234.56", s:"$#,##0.00"}, - {t:"2006-01-04", s:"yyyy-mm-dd"}, - {t:"01:23:45", s:"hh:mm:ss"}, - {t:"2006-01-04 01:23:45", s:"yyyy-mm-dd hh:mm:ss"}, - {t:"Hidden", s:"hidden"} - ], - "tvf": [ - {t:"Default", s:""}, - {t:"Automatic", s:"general"}, - {t:"Plain Text", s:"text-plain"}, - {t:"HTML", s:"text-html"}, - {t:"Wiki", s:"text-wiki"}, - {t:"Hidden", s:"hidden"} - ], - "ffal": [ // Formulas, Formats, All - {t:"All", s:"all"}, - {t:"Contents", s:"formulas"}, - {t:"Formats", s:"formats"} - ], - "all": [ // All - {t:"All", s:"all"} - ], - "rowcol": [ - {t:"Row", s:"row"}, - {t:"Column", s:"col"} - ], - "sortcol": [ - {t:"A up", s:"A up"}, - {t:"B up", s:"B up"}, - {t:"C up", s:"C up"}, - {t:"A down", s:"A down"}, - {t:"B down", s:"B down"}, - {t:"C down", s:"C down"}, - {t:"A, B, C up", s:"A up B up C up"} - ], - "none": [ // nothing - {t:" ", s:" "} - ] - } - } -*********/ - - // - // SocialCalc.SpreadsheetControlExecuteCommand(obj, combostr, sstr) - // - // xxx - // - - SocialCalc.SpreadsheetControlExecuteCommand = function (obj, combostr, sstr) { - var i, commands; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var eobj = spreadsheet.editor; - - var str = {}; - str.P = "%"; - str.N = "\n"; - if (eobj.range.hasrange) { - str.R = - SocialCalc.crToCoord(eobj.range.left, eobj.range.top) + - ":" + - SocialCalc.crToCoord(eobj.range.right, eobj.range.bottom); - str.C = str.R; - str.W = - SocialCalc.rcColname(eobj.range.left) + - ":" + - SocialCalc.rcColname(eobj.range.right); - } else { - str.C = eobj.ecell.coord; - str.R = eobj.ecell.coord + ":" + eobj.ecell.coord; - str.W = SocialCalc.rcColname(SocialCalc.coordToCr(eobj.ecell.coord).col); - } - str.S = sstr; - combostr = combostr.replace(/%C/g, str.C); - combostr = combostr.replace(/%R/g, str.R); - combostr = combostr.replace(/%N/g, str.N); - combostr = combostr.replace(/%S/g, str.S); - combostr = combostr.replace(/%W/g, str.W); - combostr = combostr.replace(/%P/g, str.P); - - eobj.EditorScheduleSheetCommands(combostr, true, false); - }; - - // - // result = SocialCalc.SpreadsheetControlCreateSheetHTML(spreadsheet) - // - // Returns the HTML representation of the whole spreadsheet - // - - SocialCalc.SpreadsheetControlCreateSheetHTML = function (spreadsheet) { - var context, div, ele; - - var result = ""; - - context = new SocialCalc.RenderContext(spreadsheet.sheet); - div = document.createElement("div"); - ele = context.RenderSheet(null, { type: "html" }); - div.appendChild(ele); - context = undefined; - result = div.innerHTML; - ele = undefined; - div = undefined; - return result; - }; - - // - // result = SocialCalc.SpreadsheetControlCreateCellHTML(spreadsheet, coord, linkstyle) - // - // Returns the HTML representation of a cell. Blank is "", not " ". - // - - SocialCalc.SpreadsheetControlCreateCellHTML = function ( - spreadsheet, - coord, - linkstyle - ) { - var result = ""; - var cell = spreadsheet.sheet.cells[coord]; - - if (!cell) return ""; - - if (cell.displaystring == undefined) { - result = SocialCalc.FormatValueForDisplay( - spreadsheet.sheet, - cell.datavalue, - coord, - linkstyle || spreadsheet.context.defaultHTMLlinkstyle - ); - } else { - result = cell.displaystring; - } - - if (result == " ") result = ""; - - return result; - }; - - // - // result = SocialCalc.SpreadsheetControlCreateCellHTMLSave(spreadsheet, range, linkstyle) - // - // Returns the HTML representation of a range of cells, or the whole sheet if range is null. - // The form is: - // version:1.0 - // coord:cell-HTML - // coord:cell-HTML - // ... - // - // Empty cells are skipped. The cell-HTML is encoded with ":"=>"\c", newline=>"\n", and "\"=>"\b". - // - - SocialCalc.SpreadsheetControlCreateCellHTMLSave = function ( - spreadsheet, - range, - linkstyle - ) { - var cr1, cr2, row, col, coord, cell, cellHTML; - var result = []; - var prange; - - if (range) { - prange = SocialCalc.ParseRange(range); - } else { - prange = { - cr1: { row: 1, col: 1 }, - cr2: { - row: spreadsheet.sheet.attribs.lastrow, - col: spreadsheet.sheet.attribs.lastcol, - }, - }; - } - cr1 = prange.cr1; - cr2 = prange.cr2; - - result.push("version:1.0"); - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - coord = SocialCalc.crToCoord(col, row); - cell = spreadsheet.sheet.cells[coord]; - if (!cell) continue; - if (cell.displaystring == undefined) { - cellHTML = SocialCalc.FormatValueForDisplay( - spreadsheet.sheet, - cell.datavalue, - coord, - linkstyle || spreadsheet.context.defaultHTMLlinkstyle - ); - } else { - cellHTML = cell.displaystring; - } - if (cellHTML == " ") continue; - result.push(coord + ":" + SocialCalc.encodeForSave(cellHTML)); - } - } - - result.push(""); // one extra to get extra \n - return result.join("\n"); - }; - - // - // Formula Bar Button Routines - // - - SocialCalc.SpreadsheetControl.DoFunctionList = function () { - var i, cname, str, f, ele; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var fcl = scc.function_classlist; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "function"; - - ele = document.getElementById(idp + "dialog"); - if (ele) return; // already have one - - scf.FillFunctionInfo(); - - str = - '
    %loc!Category!
    ' + - '
      %loc!Functions!
    ' + - '
    ' + - '
    ' + - SocialCalc.SpreadsheetControl.GetFunctionInfoStr( - scf.FunctionClasses[fcl[0]].items[0] - ) + - "
    " + - '
    ' + - ' ' + - '
    ' + - "
    "; - - var main = document.createElement("div"); - main.id = idp + "dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - str = - '' + - '" + - '
    ' + - " %loc!Function List!" + - " X 
    ' + - '
    ' + - str + - "
    "; - - str = SocialCalc.LocalizeSubstrings(str); - - main.innerHTML = str; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp + "name"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - //!!! need to do keyboard handling: if esc, hide; if All, letter scrolls to there - }; - - SocialCalc.SpreadsheetControl.GetFunctionNamesStr = function (cname) { - var i, f; - var scf = SocialCalc.Formula; - var str = ""; - - f = scf.FunctionClasses[cname]; - for (i = 0; i < f.items.length; i++) { - str += - '"; - } - - return str; - }; - - SocialCalc.SpreadsheetControl.FillFunctionNames = function (cname, ele) { - var i, f; - var scf = SocialCalc.Formula; - - ele.length = 0; - f = scf.FunctionClasses[cname]; - for (i = 0; i < f.items.length; i++) { - ele.options[i] = new Option(f.items[i], f.items[i]); - if (i == 0) { - ele.options[i].selected = true; - } - } - }; - - SocialCalc.SpreadsheetControl.GetFunctionInfoStr = function (fname) { - var scf = SocialCalc.Formula; - var f = scf.FunctionList[fname]; - var scsc = SocialCalc.special_chars; - - var str = - "" + fname + "(" + scsc(scf.FunctionArgString(fname)) + ")
    "; - str += scsc(f[3]); - - return str; - }; - - SocialCalc.SpreadsheetControl.FunctionClassChosen = function (cname) { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "function"; - var scf = SocialCalc.Formula; - - SocialCalc.SpreadsheetControl.FillFunctionNames( - cname, - document.getElementById(idp + "name") - ); - - SocialCalc.SpreadsheetControl.FunctionChosen( - scf.FunctionClasses[cname].items[0] - ); - }; - - SocialCalc.SpreadsheetControl.FunctionChosen = function (fname) { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "function"; - - document.getElementById(idp + "desc").innerHTML = - SocialCalc.SpreadsheetControl.GetFunctionInfoStr(fname); - }; - - SocialCalc.SpreadsheetControl.HideFunctions = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById(spreadsheet.idPrefix + "functiondialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.SpreadsheetControl.DoFunctionPaste = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var ele = document.getElementById(spreadsheet.idPrefix + "functionname"); - var mele = document.getElementById( - spreadsheet.idPrefix + "multilinetextarea" - ); - - var text = ele.value + "("; - - SocialCalc.SpreadsheetControl.HideFunctions(); - - if (mele) { - // multi-line editing is in progress - mele.value += text; - mele.focus(); - SocialCalc.CmdGotFocus(mele); - } else { - editor.EditorAddToInput(text, "="); - } - }; - - SocialCalc.SpreadsheetControl.DoMultiline = function () { - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var str, ele, text; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "multiline"; - - ele = document.getElementById(idp + "dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - text = SocialCalc.special_chars(text); - - str = - '" + - '
    ' + - SCLocSS( - ' ' + - ' ' + - '
    ' + - "" - ); - - var main = document.createElement("div"); - main.id = idp + "dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - SCLocSS(" %loc!Multi-line Input Box!") + - " X 
    ' + - '
    ' + - str + - "
    "; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp + "textarea"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - //!!! need to do keyboard handling: if esc, hide? - }; - - SocialCalc.SpreadsheetControl.HideMultiline = function () { - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix + "multilinedialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - }; - - SocialCalc.SpreadsheetControl.DoMultilineClear = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById( - spreadsheet.idPrefix + "multilinetextarea" - ); - - ele.value = ""; - ele.focus(); - }; - - SocialCalc.SpreadsheetControl.DoMultilinePaste = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var ele = document.getElementById( - spreadsheet.idPrefix + "multilinetextarea" - ); - - var text = ele.value; - - SocialCalc.SpreadsheetControl.HideMultiline(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - editor.EditorSaveEdit(text); - }; - - SocialCalc.SpreadsheetControl.DoLink = function () { - var SCLoc = SocialCalc.LocalizeString; - - var str, ele, text, cell, setformat, popup; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "link"; - - ele = document.getElementById(idp + "dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - if (text.charAt(0) == "'") { - text = text.slice(1); - } - - var parts = SocialCalc.ParseCellLinkText(text); - - text = SocialCalc.special_chars(text); - - cell = spreadsheet.sheet.cells[editor.ecell.coord]; - if (!cell || !cell.textvalueformat) { - // set to link format, but don't override - setformat = " checked"; - } else { - setformat = ""; - } - - popup = parts.newwin ? " checked" : ""; - - str = - '
    ' + - '' + - SCLoc("Description") + - "
    " + - '
    ' + - '' + - SCLoc("URL") + - "
    " + - '
    '; - if (SocialCalc.Callbacks.MakePageLink) { - // only show if handling pagenames here - str += - '' + - SCLoc("Page Name") + - "
    " + - '
    ' + - '' + - SCLoc("Workspace") + - "
    " + - '
    '; - } - str += SocialCalc.LocalizeSubstrings( - ' " + - '%loc!Set to Link format!
    ' + - ' " + - '%loc!Show in new browser window!' + - "
    " + - '
    ' + - ' ' + - ' ' + - '
    ' + - "" - ); - - var main = document.createElement("div"); - main.id = idp + "dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - SCLoc("Link Input Box") + - " X 
    ' + - '
    ' + - str + - "
    "; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp + "url"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - //!!! need to do keyboard handling: if esc, hide? - }; - - SocialCalc.SpreadsheetControl.HideLink = function () { - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix + "linkdialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - }; - - SocialCalc.SpreadsheetControl.DoLinkClear = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - document.getElementById(spreadsheet.idPrefix + "linkdesc").value = ""; - document.getElementById(spreadsheet.idPrefix + "linkpagename").value = ""; - document.getElementById(spreadsheet.idPrefix + "linkworkspace").value = ""; - - var ele = document.getElementById(spreadsheet.idPrefix + "linkurl"); - ele.value = ""; - ele.focus(); - }; - - SocialCalc.SpreadsheetControl.DoLinkPaste = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var descele = document.getElementById(spreadsheet.idPrefix + "linkdesc"); - var urlele = document.getElementById(spreadsheet.idPrefix + "linkurl"); - var pagenameele = document.getElementById( - spreadsheet.idPrefix + "linkpagename" - ); - var workspaceele = document.getElementById( - spreadsheet.idPrefix + "linkworkspace" - ); - var formatele = document.getElementById( - spreadsheet.idPrefix + "linkformat" - ); - var popupele = document.getElementById(spreadsheet.idPrefix + "linkpopup"); - - var text = ""; - - var ltsym, gtsym, obsym, cbsym; - - if (popupele.checked) { - ltsym = "<<"; - gtsym = ">>"; - obsym = "[["; - cbsym = "]]"; - } else { - ltsym = "<"; - gtsym = ">"; - obsym = "["; - cbsym = "]"; - } - - if (pagenameele && pagenameele.value) { - if (workspaceele.value) { - text = - descele.value + - "{" + - workspaceele.value + - obsym + - pagenameele.value + - cbsym + - "}"; - } else { - text = descele.value + obsym + pagenameele.value + cbsym; - } - } else { - text = descele.value + ltsym + urlele.value + gtsym; - } - - SocialCalc.SpreadsheetControl.HideLink(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - if (formatele.checked) { - SocialCalc.SpreadsheetControlExecuteCommand( - null, - "set %C textvalueformat text-link", - "" - ); - } - - editor.EditorSaveEdit(text); - }; - - SocialCalc.SpreadsheetControl.DoSum = function () { - var cmd, cell, row, col, sel, cr, foundvalue; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var sheet = editor.context.sheetobj; - - if (editor.range.hasrange) { - sel = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - cmd = - "set " + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom + 1) + - " formula sum(" + - sel + - ")"; - } else { - row = editor.ecell.row - 1; - col = editor.ecell.col; - if (row <= 1) { - cmd = "set " + editor.ecell.coord + " constant e#REF! 0 #REF!"; - } else { - foundvalue = false; - while (row > 0) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (!cell.datatype || cell.datatype == "t") { - if (foundvalue) { - row++; - break; - } - } else { - foundvalue = true; - } - row--; - } - cmd = - "set " + - editor.ecell.coord + - " formula sum(" + - SocialCalc.crToCoord(col, row) + - ":" + - SocialCalc.crToCoord(col, editor.ecell.row - 1) + - ")"; - } - } - - editor.EditorScheduleSheetCommands(cmd, true, false); - }; - - // - // TAB Routines - // - - // Sort - - SocialCalc.SpreadsheetControlSortOnclick = function (s, t) { - var name, i; - var namelist = []; - var nl = document.getElementById(s.idPrefix + "sortlist"); - SocialCalc.LoadColumnChoosers(s); - s.editor.RangeChangeCallback.sort = SocialCalc.UpdateSortRangeProposal; - - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - nl.options[0] = new Option(SocialCalc.LocalizeString("[select range]")); - for (i = 0; i < namelist.length; i++) { - name = namelist[i]; - nl.options[i + 1] = new Option(name, name); - if (name == s.sortrange) { - nl.options[i + 1].selected = true; - } - } - if (s.sortrange == "") { - nl.options[0].selected = true; - } - - SocialCalc.UpdateSortRangeProposal(s.editor); - SocialCalc.KeyboardFocus(); - return; - }; - - SocialCalc.SpreadsheetControlSortSave = function (editor, setting) { - // Format is: - // sort:sortrange:major:up/down:minor:up/down:last:up/down - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var str, sele, rele; - - str = "sort:" + SocialCalc.encodeForSave(spreadsheet.sortrange) + ":"; - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - rele = document.getElementById(spreadsheet.idPrefix + "majorsortup"); - str += sele.selectedIndex + (rele.checked ? ":up" : ":down"); - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "minorsortup"); - str += ":" + sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } else { - str += "::"; - } - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "lastsortup"); - str += ":" + sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } else { - str += "::"; - } - return str + "\n"; - }; - - SocialCalc.SpreadsheetControlSortLoad = function ( - editor, - setting, - line, - flags - ) { - var parts, ele; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - parts = line.split(":"); - spreadsheet.sortrange = SocialCalc.decodeFromSave(parts[1]); - ele = document.getElementById(spreadsheet.idPrefix + "sortbutton"); - if (spreadsheet.sortrange) { - ele.value = SocialCalc.LocalizeString("Sort ") + spreadsheet.sortrange; - ele.style.visibility = "visible"; - } else { - ele.style.visibility = "hidden"; - } - SocialCalc.LoadColumnChoosers(spreadsheet); - - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - sele.selectedIndex = parts[2] - 0; - document.getElementById( - spreadsheet.idPrefix + "majorsort" + parts[3] - ).checked = true; - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - if (parts[4]) { - sele.selectedIndex = parts[4] - 0; - document.getElementById( - spreadsheet.idPrefix + "minorsort" + parts[5] - ).checked = true; - } else { - sele.selectedIndex = 0; - document.getElementById( - spreadsheet.idPrefix + "minorsortup" - ).checked = true; - } - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - if (parts[6]) { - sele.selectedIndex = parts[6] - 0; - document.getElementById( - spreadsheet.idPrefix + "lastsort" + parts[7] - ).checked = true; - } else { - sele.selectedIndex = 0; - document.getElementById( - spreadsheet.idPrefix + "lastsortup" - ).checked = true; - } - - return true; - }; - - // Comment - - SocialCalc.SpreadsheetControlCommentOnclick = function (s, t) { - s.editor.MoveECellCallback.comment = - SocialCalc.SpreadsheetControlCommentMoveECell; - SocialCalc.SpreadsheetControlCommentDisplay(s, t); - SocialCalc.KeyboardFocus(); - return; - }; - - SocialCalc.SpreadsheetControlCommentDisplay = function (s, t) { - var c = ""; - if ( - s.editor.ecell && - s.editor.ecell.coord && - s.sheet.cells[s.editor.ecell.coord] - ) { - c = s.sheet.cells[s.editor.ecell.coord].comment || ""; - } - document.getElementById(s.idPrefix + "commenttext").value = c; - }; - - SocialCalc.SpreadsheetControlCommentMoveECell = function (editor) { - SocialCalc.SpreadsheetControlCommentDisplay( - SocialCalc.GetSpreadsheetControlObject(), - "comment" - ); - }; - - SocialCalc.SpreadsheetControlCommentSet = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - s.ExecuteCommand( - "set %C comment " + - SocialCalc.encodeForSave( - document.getElementById(s.idPrefix + "commenttext").value - ) - ); - var cell = SocialCalc.GetEditorCellElement( - s.editor, - s.editor.ecell.row, - s.editor.ecell.col - ); - s.editor.UpdateCellCSS(cell, s.editor.ecell.row, s.editor.ecell.col); - SocialCalc.KeyboardFocus(); - }; - - SocialCalc.SpreadsheetControlCommentOnunclick = function (s, t) { - delete s.editor.MoveECellCallback.comment; - }; - - // Names - - SocialCalc.SpreadsheetControlNamesOnclick = function (s, t) { - document.getElementById(s.idPrefix + "namesname").value = ""; - document.getElementById(s.idPrefix + "namesdesc").value = ""; - document.getElementById(s.idPrefix + "namesvalue").value = ""; - s.editor.RangeChangeCallback.names = - SocialCalc.SpreadsheetControlNamesRangeChange; - s.editor.MoveECellCallback.names = - SocialCalc.SpreadsheetControlNamesRangeChange; - SocialCalc.SpreadsheetControlNamesRangeChange(s.editor); - SocialCalc.SpreadsheetControlNamesFillNameList(); - SocialCalc.SpreadsheetControlNamesChangedName(); - }; - - SocialCalc.SpreadsheetControlNamesFillNameList = function () { - var SCLoc = SocialCalc.LocalizeString; - var name, i; - var namelist = []; - var s = SocialCalc.GetSpreadsheetControlObject(); - var nl = document.getElementById(s.idPrefix + "nameslist"); - var currentname = document - .getElementById(s.idPrefix + "namesname") - .value.toUpperCase() - .replace(/[^A-Z0-9_\.]/g, ""); - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - if (namelist.length > 0) { - nl.options[0] = new Option(SCLoc("[New]")); - } else { - nl.options[0] = new Option(SCLoc("[None]")); - } - for (i = 0; i < namelist.length; i++) { - name = namelist[i]; - nl.options[i + 1] = new Option(name, name); - if (name == currentname) { - nl.options[i + 1].selected = true; - } - } - if (currentname == "") { - nl.options[0].selected = true; - } - }; - - SocialCalc.SpreadsheetControlNamesChangedName = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var nl = document.getElementById(s.idPrefix + "nameslist"); - var name = nl.options[nl.selectedIndex].value; - if (s.sheet.names[name]) { - document.getElementById(s.idPrefix + "namesname").value = name; - document.getElementById(s.idPrefix + "namesdesc").value = - s.sheet.names[name].desc || ""; - document.getElementById(s.idPrefix + "namesvalue").value = - s.sheet.names[name].definition || ""; - } else { - document.getElementById(s.idPrefix + "namesname").value = ""; - document.getElementById(s.idPrefix + "namesdesc").value = ""; - document.getElementById(s.idPrefix + "namesvalue").value = ""; - } - }; - - SocialCalc.SpreadsheetControlNamesRangeChange = function (editor) { - var s = SocialCalc.GetSpreadsheetControlObject(); - var ele = document.getElementById(s.idPrefix + "namesrangeproposal"); - if (editor.range.hasrange) { - ele.value = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - ele.value = editor.ecell.coord; - } - }; - - SocialCalc.SpreadsheetControlNamesOnunclick = function (s, t) { - delete s.editor.RangeChangeCallback.names; - delete s.editor.MoveECellCallback.names; - }; - - SocialCalc.SpreadsheetControlNamesSetValue = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - document.getElementById(s.idPrefix + "namesvalue").value = - document.getElementById(s.idPrefix + "namesrangeproposal").value; - SocialCalc.KeyboardFocus(); - }; - - SocialCalc.SpreadsheetControlNamesSave = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var name = document.getElementById(s.idPrefix + "namesname").value; - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - if (name != "") { - s.ExecuteCommand( - "name define " + - name + - " " + - document.getElementById(s.idPrefix + "namesvalue").value + - "\n" + - "name desc " + - name + - " " + - document.getElementById(s.idPrefix + "namesdesc").value - ); - } - }; - - SocialCalc.SpreadsheetControlNamesDelete = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var name = document.getElementById(s.idPrefix + "namesname").value; - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - if (name != "") { - s.ExecuteCommand("name delete " + name); - // document.getElementById(s.idPrefix+"namesname").value = ""; - // document.getElementById(s.idPrefix+"namesvalue").value = ""; - // document.getElementById(s.idPrefix+"namesdesc").value = ""; - // SocialCalc.SpreadsheetControlNamesFillNameList(); - } - SocialCalc.KeyboardFocus(); - }; - - // Clipboard - - SocialCalc.SpreadsheetControlClipboardOnclick = function (s, t) { - var s = SocialCalc.GetSpreadsheetControlObject(); - clipele = document.getElementById(s.idPrefix + "clipboardtext"); - document.getElementById(s.idPrefix + "clipboardformat-tab").checked = true; - clipele.value = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.Clipboard.clipboard, - "tab" - ); - return; - }; - - SocialCalc.SpreadsheetControlClipboardFormat = function (which) { - var s = SocialCalc.GetSpreadsheetControlObject(); - clipele = document.getElementById(s.idPrefix + "clipboardtext"); - clipele.value = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.Clipboard.clipboard, - which - ); - }; - - SocialCalc.SpreadsheetControlClipboardLoad = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var savetype = "tab"; - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - if (document.getElementById(s.idPrefix + "clipboardformat-csv").checked) { - savetype = "csv"; - } else if ( - document.getElementById(s.idPrefix + "clipboardformat-scsave").checked - ) { - savetype = "scsave"; - } - s.editor.EditorScheduleSheetCommands( - "loadclipboard " + - SocialCalc.encodeForSave( - SocialCalc.ConvertOtherFormatToSave( - document.getElementById(s.idPrefix + "clipboardtext").value, - savetype - ) - ), - true, - false - ); - }; - - SocialCalc.SpreadsheetControlClipboardClear = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var clipele = document.getElementById(s.idPrefix + "clipboardtext"); - clipele.value = ""; - s.editor.EditorScheduleSheetCommands("clearclipboard", true, false); - clipele.focus(); - }; - - SocialCalc.SpreadsheetControlClipboardExport = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - if (s.ExportCallback) { - s.ExportCallback(s); - } - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - }; - - // Settings - - SocialCalc.SpreadsheetControlSettingsSwitch = function (target) { - SocialCalc.SettingControlReset(); - var s = SocialCalc.GetSpreadsheetControlObject(); - var sheettable = document.getElementById(s.idPrefix + "sheetsettingstable"); - var celltable = document.getElementById(s.idPrefix + "cellsettingstable"); - var sheettoolbar = document.getElementById( - s.idPrefix + "sheetsettingstoolbar" - ); - var celltoolbar = document.getElementById( - s.idPrefix + "cellsettingstoolbar" - ); - if (target == "sheet") { - sheettable.style.display = "block"; - celltable.style.display = "none"; - sheettoolbar.style.display = "block"; - celltoolbar.style.display = "none"; - SocialCalc.SettingsControlSetCurrentPanel( - s.views.settings.values.sheetspanel - ); - } else { - sheettable.style.display = "none"; - celltable.style.display = "block"; - sheettoolbar.style.display = "none"; - celltoolbar.style.display = "block"; - SocialCalc.SettingsControlSetCurrentPanel( - s.views.settings.values.cellspanel - ); - } - }; - - SocialCalc.SettingsControlSave = function (target) { - var range, cmdstr; - var s = SocialCalc.GetSpreadsheetControlObject(); - var sc = SocialCalc.SettingsControls; - var panelobj = sc.CurrentPanel; - var attribs = SocialCalc.SettingsControlUnloadPanel(panelobj); - - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - - if (target == "sheet") { - cmdstr = s.sheet.DecodeSheetAttributes(attribs); - } else if (target == "cell") { - if (s.editor.range.hasrange) { - range = - SocialCalc.crToCoord(s.editor.range.left, s.editor.range.top) + - ":" + - SocialCalc.crToCoord(s.editor.range.right, s.editor.range.bottom); - } - cmdstr = s.sheet.DecodeCellAttributes( - s.editor.ecell.coord, - attribs, - range - ); - } else { - // Cancel - } - if (cmdstr) { - s.editor.EditorScheduleSheetCommands(cmdstr, true, false); - } - }; - - /////////////////////// - // - // SAVE / LOAD ROUTINES - // - /////////////////////// - - // - // result = SocialCalc.SpreadsheetControlCreateSpreadsheetSave(spreadsheet, otherparts) - // - // Saves the spreadsheet's sheet data, editor settings, and audit trail (redo stack). - // The serialized data strings are concatenated together in multi-part MIME format. - // The first part lists the types of the subsequent parts (e.g., "sheet", "editor", and "audit") - // in this format: - // # comments - // version:1.0 - // part:type1 - // part:type2 - // ... - // - // If otherparts is non-null, it is an object with: - // partname1: "part contents - should end with \n", - // partname2: "part contents - should end with \n" - // - - SocialCalc.SpreadsheetControlCreateSpreadsheetSave = function ( - spreadsheet, - otherparts - ) { - var result; - - var otherpartsstr = ""; - var otherpartsnames = ""; - var partname, extranl; - - if (otherparts) { - for (partname in otherparts) { - if (otherparts[partname].charAt(otherparts[partname] - 1) != "\n") { - extranl = "\n"; - } else { - extranl = ""; - } - otherpartsstr += - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - otherparts[partname] + - extranl; - otherpartsnames += "part:" + partname + "\n"; - } - } - - result = - "socialcalc:version:1.0\n" + - "MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=" + - spreadsheet.multipartBoundary + - "\n" + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - "# SocialCalc Spreadsheet Control Save\nversion:1.0\npart:sheet\npart:edit\npart:audit\n" + - otherpartsnames + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - spreadsheet.CreateSheetSave() + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - spreadsheet.editor.SaveEditorSettings() + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - spreadsheet.sheet.CreateAuditString() + - otherpartsstr + - "--" + - spreadsheet.multipartBoundary + - "--\n"; - - return result; - }; - - // - // parts = SocialCalc.SpreadsheetControlDecodeSpreadsheetSave(spreadsheet, str) - // - // Separates the parts from a spreadsheet save string, returning an object with the sub-strings. - // - // {type1: {start: startpos, end: endpos}, type2:...} - // - - SocialCalc.SpreadsheetControlDecodeSpreadsheetSave = function ( - spreadsheet, - str - ) { - var pos1, - mpregex, - searchinfo, - boundary, - boundaryregex, - blanklineregex, - start, - ending, - lines, - i, - lines, - p, - pnun; - var parts = {}; - var partlist = []; - - pos1 = str.search(/^MIME-Version:\s1\.0/im); - if (pos1 < 0) return parts; - - mpregex = /^Content-Type:\s*multipart\/mixed;\s*boundary=(\S+)/gim; - mpregex.lastIndex = pos1; - - searchinfo = mpregex.exec(str); - if (mpregex.lastIndex <= 0) return parts; - boundary = searchinfo[1]; - - boundaryregex = new RegExp("^--" + boundary + "(?:\r\n|\n)", "mg"); - boundaryregex.lastIndex = mpregex.lastIndex; - - searchinfo = boundaryregex.exec(str); // find header top boundary - blanklineregex = /(?:\r\n|\n)(?:\r\n|\n)/gm; - blanklineregex.lastIndex = boundaryregex.lastIndex; - searchinfo = blanklineregex.exec(str); // skip to after blank line - if (!searchinfo) return parts; - start = blanklineregex.lastIndex; - boundaryregex.lastIndex = start; - searchinfo = boundaryregex.exec(str); // find end of header - if (!searchinfo) return parts; - ending = searchinfo.index; - - lines = str.substring(start, ending).split(/\r\n|\n/); // get header as lines - for (i = 0; i < lines.length; i++) { - line = lines[i]; - p = line.split(":"); - switch (p[0]) { - case "version": - break; - case "part": - partlist.push(p[1]); - break; - } - } - - for (pnum = 0; pnum < partlist.length; pnum++) { - // get each part - blanklineregex.lastIndex = ending; - searchinfo = blanklineregex.exec(str); // find blank line ending mime-part header - if (!searchinfo) return parts; - start = blanklineregex.lastIndex; - if (pnum == partlist.length - 1) { - // last one has different boundary - boundaryregex = new RegExp("^--" + boundary + "--$", "mg"); - } - boundaryregex.lastIndex = start; - searchinfo = boundaryregex.exec(str); // find ending boundary - if (!searchinfo) return parts; - ending = searchinfo.index; - parts[partlist[pnum]] = { start: start, end: ending }; // return position within full string - } - - return parts; - }; - - /* - * SettingsControls - * - * Each settings panel has an object in the following form: - * - * {ctrl-name1: {setting: setting-nameA, type: ctrl-type, id: id-component}, - * ctrl-name2: {setting: setting-nameB, type: ctrl-type, id: id-component, initialdata: optional-initialdata-override}, - * ...} - * - * The ctrl-types are names that correspond to: - * - * SocialCalc.SettingsControls.Controls = { - * ctrl-type1: { - * SetValue: function(panel-obj, ctrl-name, {def: true/false, val: value}) {...;}, - * ColorValues: if true, Onchanged converts between hex and RGB - * GetValue: function(panel-obj, ctrl-name) {...return {def: true/false, val: value};}, - * Initialize: function(panel-obj, ctrl-name) {...;}, // used to fill dropdowns, etc. - * InitialData: control-dependent, // used by Initialize (if no panel ctrlname.initialdata) - * OnReset: function(ctrl-name) {...;}, // called to put down popups, etc. - * ChangedCallback: function(ctrl-name) {...;} // if not null, called by control when user changes value - * } - * - */ - - SocialCalc.SettingsControls = { - Controls: {}, - CurrentPanel: null, // panel object to search on events - }; - - // - // SocialCalc.SettingsControlSetCurrentPanel(panel-object) - // - - SocialCalc.SettingsControlSetCurrentPanel = function (panelobj) { - SocialCalc.SettingsControls.CurrentPanel = panelobj; - - SocialCalc.SettingsControls.PopupChangeCallback( - { panelobj: panelobj }, - "", - null - ); - }; - - // - // SocialCalc.SettingsControlInitializePanel(panel-object) - // - - SocialCalc.SettingsControlInitializePanel = function (panelobj) { - var ctrlname; - var sc = SocialCalc.SettingsControls; - var ctrl; - - for (ctrlname in panelobj) { - if (ctrlname == "name") continue; - ctrl = sc.Controls[panelobj[ctrlname].type]; - if (ctrl && ctrl.Initialize) ctrl.Initialize(panelobj, ctrlname); - } - }; - - // - // SocialCalc.SettingsControlLoadPanel(panel-object, attribs) - // - - SocialCalc.SettingsControlLoadPanel = function (panelobj, attribs) { - var ctrlname; - var sc = SocialCalc.SettingsControls; - - for (ctrlname in panelobj) { - if (ctrlname == "name") continue; - ctrl = sc.Controls[panelobj[ctrlname].type]; - if (ctrl && ctrl.SetValue) - ctrl.SetValue(panelobj, ctrlname, attribs[panelobj[ctrlname].setting]); - } - }; - - // - // attribs = SocialCalc.SettingsControlUnloadPanel(panel-object) - // - - SocialCalc.SettingsControlUnloadPanel = function (panelobj) { - var ctrlname; - var sc = SocialCalc.SettingsControls; - var attribs = {}; - - for (ctrlname in panelobj) { - if (ctrlname == "name") continue; - ctrl = sc.Controls[panelobj[ctrlname].type]; - if (ctrl && ctrl.GetValue) - attribs[panelobj[ctrlname].setting] = ctrl.GetValue(panelobj, ctrlname); - } - - return attribs; - }; - - // - // SocialCalc.SettingsControls.PopupChangeCallback - // - - SocialCalc.SettingsControls.PopupChangeCallback = function ( - attribs, - id, - value - ) { - var sc = SocialCalc.Constants; - - var ele = document.getElementById("sample-text"); - - if (!ele || !attribs || !attribs.panelobj) return; - - var idPrefix = SocialCalc.CurrentSpreadsheetControlObject.idPrefix; - - var c = attribs.panelobj.name == "cell" ? "c" : ""; - - var v, a, parts, str1, str2, i; - - parts = - sc.defaultCellLayout.match( - /^padding.(\S+) (\S+) (\S+) (\S+).vertical.align.(\S+);$/ - ) || []; - - var cv = { - color: ["textcolor"], - backgroundColor: ["bgcolor", "#FFF"], - fontSize: ["fontsize", sc.defaultCellFontSize], - fontFamily: ["fontfamily"], - paddingTop: ["padtop", parts[1]], - paddingRight: ["padright", parts[2]], - paddingBottom: ["padbottom", parts[3]], - paddingLeft: ["padleft", parts[4]], - verticalAlign: ["alignvert", parts[5]], - }; - - for (a in cv) { - v = SocialCalc.Popup.GetValue(idPrefix + c + cv[a][0]) || cv[a][1] || ""; - ele.style[a] = v; - } - - if (c == "c") { - cv = { - borderTop: "cbt", - borderRight: "cbr", - borderBottom: "cbb", - borderLeft: "cbl", - }; - for (a in cv) { - v = SocialCalc.SettingsControls.BorderSideGetValue( - attribs.panelobj, - cv[a] - ); - ele.style[a] = v ? v.val || "" : ""; - } - v = SocialCalc.Popup.GetValue(idPrefix + "calignhoriz"); - ele.style.textAlign = v || "left"; - ele.childNodes[1].style.textAlign = v || "right"; - } else { - ele.style.border = ""; - v = SocialCalc.Popup.GetValue(idPrefix + "textalignhoriz"); - ele.style.textAlign = v || "left"; - v = SocialCalc.Popup.GetValue(idPrefix + "numberalignhoriz"); - ele.childNodes[1].style.textAlign = v || "right"; - } - - v = SocialCalc.Popup.GetValue(idPrefix + c + "fontlook"); - parts = v ? v.match(/^(\S+) (\S+)$/) || [] : []; - ele.style.fontStyle = parts[1] || ""; - ele.style.fontWeight = parts[2] || ""; - - v = SocialCalc.Popup.GetValue(idPrefix + c + "formatnumber") || "General"; - str1 = SocialCalc.FormatNumber.formatNumberWithFormat(9.8765, v, ""); - str2 = SocialCalc.FormatNumber.formatNumberWithFormat(-1234.5, v, ""); - if (str2 != "??-???-?? ??:??:??") { - // not bad date from negative number - str1 += "
    " + str2; - } - - ele.childNodes[1].innerHTML = str1; - }; - - // - // PopupList Control - // - - SocialCalc.SettingsControls.PopupListSetValue = function ( - panelobj, - ctrlname, - value - ) { - if (!value) { - alert(ctrlname + " no value"); - return; - } - - var sp = SocialCalc.Popup; - - if (!value.def) { - sp.SetValue(panelobj[ctrlname].id, value.val); - } else { - sp.SetValue(panelobj[ctrlname].id, ""); - } - }; - - // - // SocialCalc.SettingsControls.PopupListGetValue - // - - SocialCalc.SettingsControls.PopupListGetValue = function ( - panelobj, - ctrlname - ) { - var ctl = panelobj[ctrlname]; - if (!ctl) return null; - - var value = SocialCalc.Popup.GetValue(ctl.id); - if (value) { - return { def: false, val: value }; - } else { - return { def: true, val: 0 }; - } - }; - - // - // SocialCalc.SettingsControls.PopupListInitialize - // - - SocialCalc.SettingsControls.PopupListInitialize = function ( - panelobj, - ctrlname - ) { - var i, val, pos, otext; - var sc = SocialCalc.SettingsControls; - var initialdata = - panelobj[ctrlname].initialdata || - sc.Controls[panelobj[ctrlname].type].InitialData || - ""; - initialdata = SocialCalc.LocalizeSubstrings(initialdata); - var optionvals = initialdata.split(/\|/); - - var options = []; - - for (i = 0; i < (optionvals.length || 0); i++) { - val = optionvals[i]; - pos = val.indexOf(":"); - otext = val.substring(0, pos); - if (otext.indexOf("\\") != -1) { - // escape any colons - otext = otext.replace(/\\c/g, ":"); - otext = otext.replace(/\\b/g, "\\"); - } - otext = SocialCalc.special_chars(otext); - if (otext == "[custom]") { - options[i] = { - o: SocialCalc.Constants.s_PopupListCustom, - v: val.substring(pos + 1), - a: { custom: true }, - }; - } else if (otext == "[cancel]") { - options[i] = { - o: SocialCalc.Constants.s_PopupListCancel, - v: "", - a: { cancel: true }, - }; - } else if (otext == "[break]") { - options[i] = { o: "-----", v: "", a: { skip: true } }; - } else if (otext == "[newcol]") { - options[i] = { o: "", v: "", a: { newcol: true } }; - } else { - options[i] = { o: otext, v: val.substring(pos + 1) }; - } - } - - SocialCalc.Popup.Create("List", panelobj[ctrlname].id, {}); - SocialCalc.Popup.Initialize(panelobj[ctrlname].id, { - options: options, - attribs: { - changedcallback: SocialCalc.SettingsControls.PopupChangeCallback, - panelobj: panelobj, - }, - }); - }; - - // - // SocialCalc.SettingsControls.PopupListReset - // - - SocialCalc.SettingsControls.PopupListReset = function (ctrlname) { - SocialCalc.Popup.Reset("List"); - }; - - SocialCalc.SettingsControls.Controls.PopupList = { - SetValue: SocialCalc.SettingsControls.PopupListSetValue, - GetValue: SocialCalc.SettingsControls.PopupListGetValue, - Initialize: SocialCalc.SettingsControls.PopupListInitialize, - OnReset: SocialCalc.SettingsControls.PopupListReset, - ChangedCallback: null, - }; - - // - // ColorChooser Control - // - - SocialCalc.SettingsControls.ColorChooserSetValue = function ( - panelobj, - ctrlname, - value - ) { - if (!value) { - alert(ctrlname + " no value"); - return; - } - - var sp = SocialCalc.Popup; - - if (!value.def) { - sp.SetValue(panelobj[ctrlname].id, value.val); - } else { - sp.SetValue(panelobj[ctrlname].id, ""); - } - }; - - // - // SocialCalc.SettingsControls.ColorChooserGetValue - // - - SocialCalc.SettingsControls.ColorChooserGetValue = function ( - panelobj, - ctrlname - ) { - var value = SocialCalc.Popup.GetValue(panelobj[ctrlname].id); - if (value) { - return { def: false, val: value }; - } else { - return { def: true, val: 0 }; - } - }; - - // - // SocialCalc.SettingsControls.ColorChooserInitialize - // - - SocialCalc.SettingsControls.ColorChooserInitialize = function ( - panelobj, - ctrlname - ) { - var i, val, pos, otext; - var sc = SocialCalc.SettingsControls; - - SocialCalc.Popup.Create("ColorChooser", panelobj[ctrlname].id, {}); - SocialCalc.Popup.Initialize(panelobj[ctrlname].id, { - attribs: { - title: " ", - moveable: true, - width: "106px", - changedcallback: SocialCalc.SettingsControls.PopupChangeCallback, - panelobj: panelobj, - }, - }); - }; - - // - // SocialCalc.SettingsControls.ColorChooserReset - // - - SocialCalc.SettingsControls.ColorChooserReset = function (ctrlname) { - SocialCalc.Popup.Reset("ColorChooser"); - }; - - SocialCalc.SettingsControls.Controls.ColorChooser = { - SetValue: SocialCalc.SettingsControls.ColorChooserSetValue, - GetValue: SocialCalc.SettingsControls.ColorChooserGetValue, - Initialize: SocialCalc.SettingsControls.ColorChooserInitialize, - OnReset: SocialCalc.SettingsControls.ColorChooserReset, - ChangedCallback: null, - }; - - // - // SocialCalc.SettingsControls.BorderSideSetValue - // - - SocialCalc.SettingsControls.BorderSideSetValue = function ( - panelobj, - ctrlname, - value - ) { - var sc = SocialCalc.SettingsControls; - var ele, found, idname, parts; - var idstart = panelobj[ctrlname].id; - - if (!value) { - alert(ctrlname + " no value"); - return; - } - - ele = document.getElementById(idstart + "-onoff-bcb"); // border checkbox - if (!ele) return; - - if (value.val) { - // border does not use default: it looks only to the value currently - ele.checked = true; - ele.value = value.val; - parts = value.val.match(/(\S+)\s+(\S+)\s+(\S.+)/); - idname = idstart + "-color"; - SocialCalc.Popup.SetValue(idname, parts[3]); - SocialCalc.Popup.SetDisabled(idname, false); - } else { - ele.checked = false; - ele.value = value.val; - idname = idstart + "-color"; - SocialCalc.Popup.SetValue(idname, ""); - SocialCalc.Popup.SetDisabled(idname, true); - } - }; - - // - // SocialCalc.SettingsControls.BorderSideGetValue - // - - SocialCalc.SettingsControls.BorderSideGetValue = function ( - panelobj, - ctrlname - ) { - var sc = SocialCalc.SettingsControls; - var ele, value; - var idstart = panelobj[ctrlname].id; - - ele = document.getElementById(idstart + "-onoff-bcb"); // border checkbox - if (!ele) return; - - if (ele.checked) { - // on - value = SocialCalc.Popup.GetValue(idstart + "-color"); - value = "1px solid " + (value || "rgb(0,0,0)"); - return { def: false, val: value }; - } else { - // off - return { def: false, val: "" }; - } - }; - - // - // SocialCalc.SettingsControls.BorderSideInitialize - // - - SocialCalc.SettingsControls.BorderSideInitialize = function ( - panelobj, - ctrlname - ) { - var sc = SocialCalc.SettingsControls; - var idstart = panelobj[ctrlname].id; - - SocialCalc.Popup.Create("ColorChooser", idstart + "-color", {}); - SocialCalc.Popup.Initialize(idstart + "-color", { - attribs: { - title: " ", - width: "106px", - moveable: true, - changedcallback: SocialCalc.SettingsControls.PopupChangeCallback, - panelobj: panelobj, - }, - }); - }; - - // - // SocialCalc.SettingsControlOnchangeBorder = function(ele) - // - - SocialCalc.SettingsControlOnchangeBorder = function (ele) { - var idname, value, found, ele2; - var sc = SocialCalc.SettingsControls; - var panelobj = sc.CurrentPanel; - - var nameparts = ele.id.match(/(^.*\-)(\w+)\-(\w+)\-(\w+)$/); - if (!nameparts) return; - var prefix = nameparts[1]; - var ctrlname = nameparts[2]; - var ctrlsubid = nameparts[3]; - var ctrlidsuffix = nameparts[4]; - var ctrltype = panelobj[ctrlname].type; - - switch (ctrlidsuffix) { - case "bcb": // border checkbox - if (ele.checked) { - sc.Controls[ctrltype].SetValue(sc.CurrentPanel, ctrlname, { - def: false, - val: ele.value || "1px solid rgb(0,0,0)", - }); - } else { - sc.Controls[ctrltype].SetValue(sc.CurrentPanel, ctrlname, { - def: false, - val: "", - }); - } - break; - } - }; - - SocialCalc.SettingsControls.Controls.BorderSide = { - SetValue: SocialCalc.SettingsControls.BorderSideSetValue, - GetValue: SocialCalc.SettingsControls.BorderSideGetValue, - OnClick: SocialCalc.SettingsControls.ColorComboOnClick, - Initialize: SocialCalc.SettingsControls.BorderSideInitialize, - InitialData: { thickness: "1 pixel:1px", style: "Solid:solid" }, - ChangedCallback: null, - }; - - SocialCalc.SettingControlReset = function () { - var sc = SocialCalc.SettingsControls; - var ctrlname; - - for (ctrlname in sc.Controls) { - if (sc.Controls[ctrlname].OnReset) - sc.Controls[ctrlname].OnReset(ctrlname); - } - }; - - /********************** - * - * CtrlSEditor implementation for editing SocialCalc.OtherSaveParts - * - */ - - SocialCalc.OtherSaveParts = {}; // holds other parts to save - must be set when loaded if you want to keep - - SocialCalc.CtrlSEditor = function (whichpart) { - var strtoedit, partname; - if (whichpart.length > 0) { - strtoedit = SocialCalc.special_chars( - SocialCalc.OtherSaveParts[whichpart] || "" - ); - } else { - strtoedit = "Listing of Parts\n"; - for (partname in SocialCalc.OtherSaveParts) { - strtoedit += SocialCalc.special_chars( - "\nPart: " + - partname + - "\n=====\n" + - SocialCalc.OtherSaveParts[partname] + - "\n" - ); - } - } - var editbox = document.createElement("div"); - editbox.style.cssText = - "position:absolute;z-index:500;width:300px;height:300px;left:100px;top:200px;border:1px solid black;background-color:#EEE;text-align:center;"; - editbox.id = "socialcalc-editbox"; - editbox.innerHTML = - whichpart + - '



    '; - document.body.appendChild(editbox); - - var ebta = document.getElementById("socialcalc-editbox-textarea"); - ebta.focus(); - SocialCalc.CmdGotFocus(ebta); - }; - - SocialCalc.CtrlSEditorDone = function (idprefix, whichpart) { - var edittextarea = document.getElementById(idprefix + "-textarea"); - var text = edittextarea.value; - if (whichpart.length > 0) { - if (text.length > 0) { - SocialCalc.OtherSaveParts[whichpart] = text; - } else { - delete SocialCalc.OtherSaveParts[whichpart]; - } - } - - var editbox = document.getElementById(idprefix); - SocialCalc.KeyboardFocus(); - editbox.parentNode.removeChild(editbox); - }; - - // - // Workbook is a collection of sheets that are worked upon together - // - // The WorkBook class models and manages the collection of sheets - // - // Author: Ramu Ramamurthy - // - // - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - - // Constructor: - - SocialCalc.WorkBook = function (spread) { - this.spreadsheet = spread; // this is the spreadsheet control - this.defaultsheetname = null; - this.sheetArr = {}; // misnomer, this is not really an array - this.clipsheet = {}; // for copy paste of sheets - }; - - // Methods - - SocialCalc.WorkBook.prototype.InitializeWorkBook = function (defaultsheet) { - return SocialCalc.InitializeWorkBook(this, defaultsheet); - }; - - SocialCalc.WorkBook.prototype.AddNewWorkBookSheetNoSwitch = function ( - sheetid, - sheetname, - savestr - ) { - return SocialCalc.AddNewWorkBookSheetNoSwitch( - this, - sheetid, - sheetname, - savestr - ); - }; - SocialCalc.WorkBook.prototype.AddNewWorkBookSheet = function ( - sheetname, - oldsheetname, - fromclip, - spread - ) { - return SocialCalc.AddNewWorkBookSheet( - this, - sheetname, - oldsheetname, - fromclip, - spread - ); - }; - SocialCalc.WorkBook.prototype.ActivateWorkBookSheet = function ( - sheetname, - oldsheetname - ) { - return SocialCalc.ActivateWorkBookSheet(this, sheetname, oldsheetname); - }; - SocialCalc.WorkBook.prototype.DeleteWorkBookSheet = function ( - sheetname, - cursheetname - ) { - return SocialCalc.DeleteWorkBookSheet(this, sheetname, cursheetname); - }; - SocialCalc.WorkBook.prototype.SaveWorkBookSheet = function (sheetid) { - return SocialCalc.SaveWorkBookSheet(this, sheetid); - }; - SocialCalc.WorkBook.prototype.LoadRenameWorkBookSheet = function ( - sheetid, - savestr, - newname - ) { - return SocialCalc.LoadRenameWorkBookSheet(this, sheetid, savestr, newname); - }; - SocialCalc.WorkBook.prototype.RenameWorkBookSheet = function ( - oldname, - newname, - sheetid - ) { - return SocialCalc.RenameWorkBookSheet(this, oldname, newname, sheetid); - }; - SocialCalc.WorkBook.prototype.CopyWorkBookSheet = function (sheetid) { - return SocialCalc.CopyWorkBookSheet(this, sheetid); - }; - SocialCalc.WorkBook.prototype.PasteWorkBookSheet = function (newid, oldid) { - return SocialCalc.PasteWorkBookSheet(this, newid, oldid); - }; - SocialCalc.WorkBook.prototype.RenderWorkBookSheet = function () { - return SocialCalc.RenderWorkBookSheet(this); - }; - - SocialCalc.WorkBook.prototype.SheetNameExistsInWorkBook = function (name) { - return SocialCalc.SheetNameExistsInWorkBook(this, name); - }; - - SocialCalc.WorkBook.prototype.WorkbookScheduleCommand = function ( - cmd, - isremote - ) { - return SocialCalc.WorkbookScheduleCommand(this, cmd, isremote); - }; - - SocialCalc.WorkBook.prototype.WorkbookScheduleSheetCommand = function ( - cmd, - isremote - ) { - return SocialCalc.WorkbookScheduleSheetCommand(this, cmd, isremote); - }; - - // schedule some command - could be for sheet or for the workbook itself - SocialCalc.WorkbookScheduleCommand = function WorkbookScheduleCommand( - workbook, - cmd, - isremote - ) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - if (cmd.cmdtype == "scmd") { - workbook.WorkbookScheduleSheetCommand(cmd, isremote); - } - }; - - SocialCalc.WorkbookScheduleSheetCommand = - function WorkbookScheduleSheetCommand(workbook, cmd, isremote) { - //console.log(cmd.cmdtype,cmd.id,cmd.cmdstr); - - // check if sheet exists first - if (workbook.sheetArr[cmd.id]) { - workbook.sheetArr[cmd.id].sheet.ScheduleSheetCommands( - cmd.cmdstr, - cmd.saveundo, - isremote - ); - } - }; - - SocialCalc.InitializeWorkBook = function InitializeWorkBook( - workbook, - defaultsheet - ) { - workbook.defaultsheetname = defaultsheet; - - var spreadsheet = workbook.spreadsheet; - var defaultsheetname = workbook.defaultsheetname; - - // Initialize the Spreadsheet Control and display it - - SocialCalc.Formula.SheetCache.sheets[defaultsheetname] = { - sheet: spreadsheet.sheet, - name: defaultsheetname, - }; - - spreadsheet.sheet.sheetid = defaultsheetname; - spreadsheet.sheet.sheetname = defaultsheetname; - - workbook.sheetArr[defaultsheetname] = {}; - workbook.sheetArr[defaultsheetname].sheet = spreadsheet.sheet; - workbook.sheetArr[defaultsheetname].context = spreadsheet.context; - - // if these were properties of the sheet, then we wouldnt need to do this ! - workbook.sheetArr[defaultsheetname].editorprop = {}; - workbook.sheetArr[defaultsheetname].editorprop.ecell = null; - workbook.sheetArr[defaultsheetname].editorprop.range = null; - workbook.sheetArr[defaultsheetname].editorprop.range2 = null; - - workbook.clipsheet.savestr = null; - workbook.clipsheet.copiedfrom = null; - workbook.clipsheet.editorprop = {}; - - spreadsheet.editor.workingvalues.currentsheet = spreadsheet.sheet.sheetname; - spreadsheet.editor.workingvalues.startsheet = - spreadsheet.editor.workingvalues.currentsheet; - spreadsheet.editor.workingvalues.currentsheetid = spreadsheet.sheet.sheetid; - }; - - SocialCalc.AddNewWorkBookSheetNoSwitch = function AddNewWorkBookSheetNoSwitch( - workbook, - sheetid, - sheetname, - savestr - ) { - //alert(sheetid+","+sheetname+","+savestr); - - var spreadsheet = workbook.spreadsheet; - - var newsheet = new SocialCalc.Sheet(); - - SocialCalc.Formula.SheetCache.sheets[sheetname] = { - sheet: newsheet, - name: sheetname, - }; - - newsheet.sheetid = sheetid; - newsheet.sheetname = sheetname; - - if (savestr) { - newsheet.ParseSheetSave(savestr); - } - - workbook.sheetArr[sheetid] = {}; - workbook.sheetArr[sheetid].sheet = newsheet; - workbook.sheetArr[sheetid].context = null; - - if (workbook.sheetArr[sheetid].sheet.attribs) { - workbook.sheetArr[sheetid].sheet.attribs.needsrecalc = "yes"; - } - - workbook.sheetArr[sheetid].editorprop = {}; - workbook.sheetArr[sheetid].editorprop.ecell = { - coord: "A1", - row: 1, - col: 1, - }; - workbook.sheetArr[sheetid].editorprop.range = null; - workbook.sheetArr[sheetid].editorprop.range2 = null; - }; - - SocialCalc.AddNewWorkBookSheet = function AddNewWorkBookSheet( - workbook, - sheetid, - oldsheetid, - fromclip, - spread - ) { - var spreadsheet = workbook.spreadsheet; - - //alert("create new sheet "+sheetid+" old="+oldsheetid+" def="+workbook.defaultsheetname); - - if (spread == null) { - spreadsheet.sheet = new SocialCalc.Sheet(); - SocialCalc.Formula.SheetCache.sheets[sheetid] = { - sheet: spreadsheet.sheet, - name: sheetid, - }; - spreadsheet.sheet.sheetid = sheetid; - spreadsheet.sheet.sheetname = sheetid; - } else { - //alert("existing spread") - spreadsheet.sheet = spread; - } - - spreadsheet.context = new SocialCalc.RenderContext(spreadsheet.sheet); - - spreadsheet.sheet.statuscallback = SocialCalc.EditorSheetStatusCallback; - spreadsheet.sheet.statuscallbackparams = spreadsheet.editor; - - workbook.sheetArr[sheetid] = {}; - workbook.sheetArr[sheetid].sheet = spreadsheet.sheet; - workbook.sheetArr[sheetid].context = spreadsheet.context; - - workbook.sheetArr[sheetid].editorprop = {}; - workbook.sheetArr[sheetid].editorprop.ecell = null; - workbook.sheetArr[sheetid].editorprop.range = null; - workbook.sheetArr[sheetid].editorprop.range2 = null; - - if (oldsheetid != null) { - workbook.sheetArr[oldsheetid].editorprop.ecell = spreadsheet.editor.ecell; - workbook.sheetArr[oldsheetid].editorprop.range = spreadsheet.editor.range; - workbook.sheetArr[oldsheetid].editorprop.range2 = - spreadsheet.editor.range2; - } - - spreadsheet.context.showGrid = true; - spreadsheet.context.showRCHeaders = true; - spreadsheet.editor.context = spreadsheet.context; - - if (!fromclip) { - spreadsheet.editor.ecell = { - coord: "A1", - row: 1, - col: 1, - }; - - spreadsheet.editor.range = { - hasrange: false, - }; - spreadsheet.editor.range2 = { - hasrange: false, - }; - } - - // set highlights - spreadsheet.context.highlights[spreadsheet.editor.ecell.coord] = "cursor"; - - if (fromclip) { - // this is the result of a paste sheet - //alert("from clip"); - - if (workbook.clipsheet.savestr != null) { - //alert("sheetdata = "+workbook.clipsheet.savestr); - spreadsheet.sheet.ParseSheetSave(workbook.clipsheet.savestr); - } - - spreadsheet.editor.ecell = workbook.clipsheet.editorprop.ecell; - spreadsheet.context.highlights[spreadsheet.editor.ecell.coord] = "cursor"; - - // range is not pasted ??!?? - } - - spreadsheet.editor.workingvalues.currentsheet = spreadsheet.sheet.sheetname; - spreadsheet.editor.workingvalues.startsheet = - spreadsheet.editor.workingvalues.currentsheet; - spreadsheet.editor.workingvalues.currentsheetid = spreadsheet.sheet.sheetid; - - spreadsheet.editor.FitToEditTable(); - spreadsheet.editor.ScheduleRender(); - //spreadsheet.ExecuteCommand('recalc', ''); - }; - - SocialCalc.ActivateWorkBookSheet = function ActivateWorkBookSheet( - workbook, - sheetnamestr, - oldsheetnamestr - ) { - var spreadsheet = workbook.spreadsheet; - - //alert("activate "+sheetnamestr+" old="+oldsheetnamestr); - - spreadsheet.sheet = workbook.sheetArr[sheetnamestr].sheet; - spreadsheet.context = workbook.sheetArr[sheetnamestr].context; - - if (spreadsheet.context == null) { - //alert("context null") - //for (var sheet in workbook.sheetArr) alert(sheet+spreadsheet.sheet ) - workbook.AddNewWorkBookSheet( - sheetnamestr, - oldsheetnamestr, - false, - spreadsheet.sheet - ); - return; - } - - spreadsheet.editor.context = spreadsheet.context; - - if (oldsheetnamestr != null) { - workbook.sheetArr[oldsheetnamestr].editorprop.ecell = - spreadsheet.editor.ecell; - } - spreadsheet.editor.ecell = workbook.sheetArr[sheetnamestr].editorprop.ecell; - - if (oldsheetnamestr != null) { - workbook.sheetArr[oldsheetnamestr].editorprop.range = - spreadsheet.editor.range; - } - spreadsheet.editor.range = workbook.sheetArr[sheetnamestr].editorprop.range; - - if (oldsheetnamestr != null) { - workbook.sheetArr[oldsheetnamestr].editorprop.range2 = - spreadsheet.editor.range2; - } - spreadsheet.editor.range2 = - workbook.sheetArr[sheetnamestr].editorprop.range2; - - spreadsheet.sheet.statuscallback = SocialCalc.EditorSheetStatusCallback; - spreadsheet.sheet.statuscallbackparams = spreadsheet.editor; - - // reset highlights ?? - - //spreadsheet.editor.FitToEditTable(); - - spreadsheet.editor.workingvalues.currentsheet = spreadsheet.sheet.sheetname; - spreadsheet.editor.workingvalues.currentsheetid = spreadsheet.sheet.sheetid; - - if (spreadsheet.editor.state != "start" && spreadsheet.editor.inputBox) - spreadsheet.editor.inputBox.element.focus(); - - if (spreadsheet.editor.state == "start") { - spreadsheet.editor.workingvalues.startsheet = - spreadsheet.editor.workingvalues.currentsheet; - } - - //spreadsheet.editor.ScheduleRender(); - - if (spreadsheet.editor.state != "start" && spreadsheet.editor.inputBox) { - spreadsheet.editor.ScheduleRender(); - } else { - if (spreadsheet.sheet.attribs) { - spreadsheet.sheet.attribs.needsrecalc = "yes"; - } else { - spreadsheet.sheet.attribs = {}; - spreadsheet.sheet.attribs.needsrecalc = "yes"; - } - - spreadsheet.ExecuteCommand("redisplay", ""); - } - }; - - SocialCalc.DeleteWorkBookSheet = function DeleteWorkBookSheet( - workbook, - oldname, - curname - ) { - //alert("delete "+oldname+","+curname); - - delete workbook.sheetArr[oldname].context; - delete workbook.sheetArr[oldname].sheet; - delete workbook.sheetArr[oldname]; - // take sheet out of the formula cache - delete SocialCalc.Formula.SheetCache.sheets[curname]; - }; - - SocialCalc.SaveWorkBookSheet = function CreateSaveWorkBook( - workbook, - sheetid - ) { - var sheetstr = {}; - sheetstr.savestr = workbook.sheetArr[sheetid].sheet.CreateSheetSave(); - return sheetstr; - }; - - SocialCalc.LoadRenameWorkBookSheet = function LoadRenameWorkBookSheet( - workbook, - sheetid, - savestr, - newname - ) { - workbook.sheetArr[sheetid].sheet.ResetSheet(); - workbook.sheetArr[sheetid].sheet.ParseSheetSave(savestr); - - if (workbook.sheetArr[sheetid].sheet.attribs) { - workbook.sheetArr[sheetid].sheet.attribs.needsrecalc = "yes"; - } - - delete SocialCalc.Formula.SheetCache.sheets[ - workbook.sheetArr[sheetid].sheet.sheetname - ]; - workbook.sheetArr[sheetid].sheet.sheetname = newname; - SocialCalc.Formula.SheetCache.sheets[newname] = { - sheet: workbook.sheetArr[sheetid].sheet, - name: newname, - }; - }; - - SocialCalc.RenderWorkBookSheet = function RenderWorkBookSheet(workbook) { - workbook.spreadsheet.editor.ScheduleRender(); - }; - - SocialCalc.RenameWorkBookSheetCell = function (formula, oldname, newname) { - var ttype, ttext, i, newcr; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - var parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - //alert(ttype+","+ttext); - //console.log (scf.NormalizeSheetName(ttext) + " " + oldname); - if ( - ttype == tokentype.name && - scf.NormalizeSheetName(ttext) == oldname && - i < parseinfo.length - ) { - if (parseinfo[i + 1].type == token_op && parseinfo[i + 1].text == "!") { - updatedformula += newname; //console.log (updatedformula); - } else { - updatedformula += ttext; //console.log (updatedformula); - } - } else { - updatedformula += ttext; - } - } - //alert(updatedformula); - return updatedformula; - }; - - SocialCalc.RenameWorkBookSheet = function RenameWorkBookSheet( - workbook, - oldname, - newname, - sheetid - ) { - // for each sheet, fix up all the formula references - // - //alert (sheetid); - var oldsheet = SocialCalc.Formula.SheetCache.sheets[oldname].sheet; - delete SocialCalc.Formula.SheetCache.sheets[oldname]; - //alert (newname); // to check the newname - SocialCalc.Formula.SheetCache.sheets[newname] = { - sheet: oldsheet, - name: newname, - }; - workbook.sheetArr[sheetid].sheet.sheetname = newname; - // - // fix up formulas for sheet rename - // if formulas should not be fixed up upon sheet rename, then comment out the following - // block - // - for (var sheet in workbook.sheetArr) { - //alert("found sheet-"+sheet) - for (var cr in workbook.sheetArr[sheet].sheet.cells) { - // update cell references to sheet name - //alert(cr); - var cell = workbook.sheetArr[sheet].sheet.cells[cr]; - //if (cell) alert(cell.datatype) - if (cell && cell.datatype == "f") { - cell.formula = SocialCalc.RenameWorkBookSheetCell( - cell.formula, - oldname, - newname - ); - if (cell.parseinfo) { - delete cell.parseinfo; - } - } - } - } - // recalculate - workbook.spreadsheet.ExecuteCommand("recalc", ""); - }; - - SocialCalc.CopyWorkBookSheet = function CopyWorkBookSheet(workbook, sheetid) { - //alert("in copy "+sheetid); - workbook.clipsheet.savestr = - workbook.sheetArr[sheetid].sheet.CreateSheetSave(); - //alert("in copy save="+workbook.clipsheet.savestr); - workbook.clipsheet.copiedfrom = sheetid; - workbook.clipsheet.editorprop = {}; - workbook.clipsheet.editorprop.ecell = workbook.spreadsheet.editor.ecell; - //workbook.clipsheet.editorprop.range = workbook.spreadsheet.editor.range; - //workbook.clipsheet.editorprop.range2 = workbook.spreadsheet.editor.range2; - //workbook.clipsheet.highlights = workbook.spreadsheet.context.highlights; - - //alert("copied "+sheetid); - }; - - SocialCalc.PasteWorkBookSheet = function PasteWorkBookSheet( - workbook, - newsheetid, - oldsheetid - ) { - //alert(newsheetid+oldsheetid); - workbook.AddNewWorkBookSheet(newsheetid, oldsheetid, true); - - // clear the clip ? - }; - - SocialCalc.SheetNameExistsInWorkBook = function SheetNameExistsInWorkBook( - workbook, - name - ) { - for (var sheet in workbook.sheetArr) { - if (workbook.sheetArr[sheet].sheet.sheetname == name) { - return sheet; - } - } - return null; - }; - - // - // Workbook Control controls workbook actions (add/del/rename etc) and can appear at the - // bottom of the screen (?). Right now its just a proof of concept - // and appears at the top of the screen - // - // Author: Ramu Ramamurthy - // - // - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - - SocialCalc.CurrentWorkbookControlObject = null; - - SocialCalc.TestWorkBookSaveStr = ""; - - // Constructor: - - SocialCalc.WorkBookControl = function (book, divid, defaultsheetname) { - this.workbook = book; - this.div = divid; - this.defaultsheetname = defaultsheetname; - this.sheetButtonArr = {}; - this.sheetCnt = 0; - this.numSheets = 0; - this.currentSheetButton = null; - this.renameDialogId = "sheetRenameDialog"; - this.deleteDialogId = "sheetDeleteDialog"; - this.hideDialogId = "sheetHideDialog"; - this.unhideDialogId = "sheetUnhideDialog"; - - this.sheetshtml = - ''; - - //this.buttonshtml = - //'
    '+ - //'
    '+ - //''+ - //''+ - //''+ - - // ''+ - // ''+ - // ''+ - - //''+ - //''+ - //'
    '+ - //'
    '; - - SocialCalc.CurrentWorkbookControlObject = this; - this.sheetbar = new SocialCalc.SheetBar(); - }; - - // methods - SocialCalc.WorkBookControl.prototype.GetCurrentWorkBookControl = function () { - return SocialCalc.GetCurrentWorkBookControl(); - }; - SocialCalc.WorkBookControl.prototype.InitializeWorkBookControl = function () { - return SocialCalc.InitializeWorkBookControl(this); - }; - - SocialCalc.WorkBookControl.prototype.ExecuteWorkBookControlCommand = - function (cmd, isremote) { - return SocialCalc.ExecuteWorkBookControlCommand(this, cmd, isremote); - }; - - SocialCalc.ExecuteWorkBookControlCommand = function (control, cmd, isremote) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - //if (!isremote) { - // return; - //} - - if (cmd.cmdtype == "scmd") { - // dispatch a sheet command - control.workbook.WorkbookScheduleCommand(cmd, isremote); - return; - } - - if (cmd.cmdtype != "wcmd") { - return; - } - - var parseobj = new SocialCalc.Parse(cmd.cmdstr); - - var cmd1 = parseobj.NextToken(); - - switch (cmd1) { - case "addsheet": - SocialCalc.WorkBookControlAddSheetRemote(null); - break; - - case "addsheetstr": - var sheetstr = cmd.sheetstr; - SocialCalc.WorkBookControlAddSheetRemote(sheetstr); - break; - - case "delsheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlDelSheetRemote(sheetid); - break; - - case "rensheet": - var sheetid = parseobj.NextToken(); - var oldname = parseobj.NextToken(); - var newname = parseobj.NextToken(); - SocialCalc.WorkBookControlRenameSheetRemote(sheetid, oldname, newname); - break; - - case "activatesheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlActivateSheet(sheetid); - break; - - case "hidesheet": - var sheetid = parseobj.NextToken(); - - break; - - case "unhidesheet": - var sheetid = parseobj.NextToken(); - - break; - } - }; - - SocialCalc.GetCurrentWorkBookControl = function () { - return SocialCalc.CurrentWorkbookControlObject; - }; - - SocialCalc.InitializeWorkBookControl = function (control) { - var element = document.createElement("div"); - element.innerHTML = control.sheetshtml; - var foo = document.getElementById(control.div); - foo.appendChild(element); - //var element2 = document.createElement("div"); - //element2.innerHTML = control.buttonshtml; - //foo.appendChild(element2); - SocialCalc.WorkBookControlAddSheet(false); // this is for the default sheet - }; - - SocialCalc.WorkBookControlDelSheetRemote = function (sheetid) { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (sheetid == control.currentSheetButton.id) { - // the active sheet is being deleted - SocialCalc.WorkBookControlDelSheet(); - return; - } - // some non active sheet is being deleted - var foo = document.getElementById("fooBar"); - var deletedbutton = document.getElementById(sheetid); - - var did = deletedbutton.id; - var dname = deletedbutton.value; - delete control.sheetButtonArr[did]; - - foo.removeChild(deletedbutton); - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + did); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - // delete the sheet - control.workbook.DeleteWorkBookSheet(did, dname); - control.numSheets = control.numSheets - 1; - }; - - // assumes that the current active sheet is being deleted - SocialCalc.WorkBookControlDelSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { - //disallow this - var str = - '
    ' + - "" + - " A workbook must contain at least one worksheet " + - "

    "; - str += - "To delete the selected sheet, you must first insert a new sheet.
    "; - str += - '
    ' + - '
    '; - var main = document.createElement("div"); - main.id = control.deleteDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - " X 
    ' + - '
    ' + - str + - "
    "; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - // do a popup to reaffirm the deletion of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.deleteDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
    ' + - "" + - "The selected sheet will be permanently deleted." + - "
    "; - str += "
      "; - str += "
    • To delete the selected sheet, click OK.
    • "; - str += "
    • To cancel the deletion, click cancel.
    • "; - str += "
    "; - str += - '
    ' + - ' ' + - '
    '; - - var main = document.createElement("div"); - main.id = control.deleteDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - " X 
    ' + - '
    ' + - str + - "
    "; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.WorkBookControlDeleteSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.deleteDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlDeleteSheetSubmit = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlDeleteSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + current.id); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.currentSheetButton = null; - // delete the sheets - control.workbook.DeleteWorkBookSheet(name, curname); - control.numSheets = control.numSheets - 1; - - var cmdstr = "delsheet " + name; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - control.currentSheetButton.setAttribute( - "style", - "background-color:lightgreen" - ); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - break; - } - } - if (control.currentSheetButton != null) { - control.workbook.ActivateWorkBookSheet( - control.currentSheetButton.id, - null - ); - } - }; - - // assumes that the current active sheet is being hidden - SocialCalc.WorkBookControlHideSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { - //disallow this - var str = - '
    ' + - "" + - " A workbook must contain at least one worksheet " + - "

    "; - str += - "Before hiding the selected sheet, you must first insert a new sheet.
    "; - str += - '
    ' + - '
    '; - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - " X 
    ' + - '
    ' + - str + - "
    "; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - // do a popup to reaffirm the hiding of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.hideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
    ' + - "" + - "The selected sheet will be hidden." + - "
    "; - str += "
      "; - str += "
    • To hide the selected sheet, click OK.
    • "; - str += "
    • To cancel the hiding, click cancel.
    • "; - str += "
    "; - str += - '
    ' + - ' ' + - '
    '; - - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - " X 
    ' + - '
    ' + - str + - "
    "; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.WorkBookControlHideSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.hideDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlHideSheetSubmit = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlHideSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + current.id); - // unregister with mouse ? etc - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, false); - sheetbarbutton.style.display = "none"; - control.currentSheetButton = null; - // delete the sheets - - control.numSheets = control.numSheets - 1; - - var cmdstr = "hidesheet " + name; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if ( - sheet != null && - document.getElementById("sbsb-" + sheet).style.display != "none" - ) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute( - "style", - "background-color:lightgreen" - ); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet( - control.currentSheetButton.id, - null - ); - } - }; - - // displays all hidden sheets, and then unhides whatever is selected - SocialCalc.WorkBookControlUnhideSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - - var unhiddencount = 0; - for (var sheet in control.sheetButtonArr) { - if (document.getElementById("sbsb-" + sheet).style.display == "none") { - unhiddencount++; - } - } - - if (unhiddencount == 0) { - //no hidden sheets, error message here - var str = - '
    ' + - "" + - " There are no hidden worksheets. " + - "

    "; - str += - "Before unhiding any sheets, you must first hide a sheet.
    "; - str += - '
    ' + - '
    '; - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - " X 
    ' + - '
    ' + - str + - "
    "; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - var element = document.getElementById(control.unhideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
    ' + - "" + - "The following sheets are hidden." + - '
      ' + - ''; - for (var sheet in control.sheetButtonArr) { - if (document.getElementById("sbsb-" + sheet).style.display == "none") { - str += - '' + - control.sheetButtonArr[sheet].value + - "
      "; - } - } - - str += "
    \n
      "; - str += "
    • To unhide the selected sheet, click OK.
    • "; - str += "
    • To cancel the unhiding, click cancel.
    • "; - str += "
    "; - str += - '
    ' + - ' ' + - '
    '; - - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - " X 
    ' + - '
    ' + - str + - "
    "; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.WorkBookControlUnhideSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.unhideDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlUnhideSheetSubmit = function (name) { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlUnhideSheetHide(); - var current = document.getElementById(control.currentSheetButton.id); - - var curid = current.id; - var curname = control.currentSheetButton.value; - - control.currentSheetButton.setAttribute("style", ""); - var old = control.currentSheetButton.id; - console.log(old); - SocialCalc.SheetBarButtonActivate(old, false); - - var sheetbarbutton = document.getElementById("sbsb-" + name); - // unhide the button - sheetbarbutton.style.display = "inline"; - control.currentSheetButton = null; - - control.numSheets = control.numSheets + 1; - - var cmdstr = "unhidesheet " + name; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if ( - sheet != null && - document.getElementById("sbsb-" + sheet).style.display != "none" - ) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute( - "style", - "background-color:lightgreen" - ); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet( - control.currentSheetButton.id, - null - ); - } - }; - - SocialCalc.WorkBookControlAddSheetButton = function (sheetname, sheetid) { - var control = SocialCalc.GetCurrentWorkBookControl(); - - //Create an input type dynamically. - var element = document.createElement("input"); - - var name = null; - - if (sheetid != null) { - name = sheetid; - } else { - name = "sheet" + (control.sheetCnt + 1).toString(); - control.sheetCnt = control.sheetCnt + 1; - } - - //Assign different attributes to the element. - element.setAttribute("type", "button"); - if (sheetname == null) { - element.setAttribute("value", name); - } else { - element.setAttribute("value", sheetname); - } - element.setAttribute("id", name); - element.setAttribute("name", name); - - var fnname = - "SocialCalc.WorkBookControlActivateSheet(" + "'" + name + "'" + ")"; - - element.setAttribute("onclick", fnname); - - control.sheetButtonArr[name] = element; - - var foo = document.getElementById("fooBar"); - - //Append the element in page (in span). - foo.appendChild(element); - - control.numSheets = control.numSheets + 1; - - var el = new SocialCalc.SheetBarSheetButton( - "sbsb-" + name, - sheetname ? sheetname : name, - document.getElementById("SocialCalc-sheetbar-buttons"), - { - //normalstyle: "border:1px solid #000;backgroundColor:#FFF;", - //downstyle: "border:1px solid #000;backgroundColor:#CCC;", - //hoverstyle: "border:1px solid #000;backgroundColor:#FFF;" - }, - { - MouseDown: function () { - SocialCalc.SheetBarSheetButtonPress(name); - }, - Repeat: function () {}, - Disabled: function () {}, - } - ); - - return element; - }; - - SocialCalc.WorkBookControlAddSheet = function (addworksheet, sheetname) { - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(sheetname); - - // then change the highlight - - var old = "sheet1"; - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style", ""); - old = control.currentSheetButton.id; - SocialCalc.SheetBarButtonActivate(old, false); - } - - element.setAttribute("style", "background-color:lightgreen"); - control.currentSheetButton = element; - var newsheetid = element.id; - SocialCalc.SheetBarButtonActivate(newsheetid, true); - - // create the sheet - if (addworksheet) { - control.workbook.AddNewWorkBookSheet(newsheetid, old, false); - // broadcast an add command here - var cmdstr = "addsheet"; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - } - }; - - SocialCalc.WorkBookControlAddSheetRemote = function (savestr) { - var control = SocialCalc.GetCurrentWorkBookControl(); - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(); - - // add the sheet, dont switch to it - control.workbook.AddNewWorkBookSheetNoSwitch( - element.id, - element.value, - savestr - ); - }; - - SocialCalc.WorkBookControlActivateSheet = function (name) { - //alert("in activate sheet="+name) - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById(name); - foo.setAttribute("style", "background-color:lightgreen;"); - SocialCalc.SheetBarButtonActivate(name, true); - - var old = control.currentSheetButton.id; - if (control.currentSheetButton.id != foo.id) { - control.currentSheetButton.setAttribute("style", ""); - SocialCalc.SheetBarButtonActivate(old, false); - } - - control.currentSheetButton = foo; - - control.workbook.ActivateWorkBookSheet(name, old); - }; - - SocialCalc.WorkBookControlHttpRequest = null; - - SocialCalc.WorkBookControlAlertContents = function () { - var loadedstr = ""; - var http_request = SocialCalc.WorkBookControlHttpRequest; - - if (http_request.readyState == 4) { - //addmsg("received:" + http_request.responseText.length + " chars"); - try { - if (http_request.status == 200) { - loadedstr = http_request.responseText || ""; - http_request = null; - } else { - } - } catch (e) {} - // do something with loaded str - //alert("loaded="+loadedstr); - SocialCalc.TestWorkBookSaveStr = loadedstr; - SocialCalc.Clipboard.clipboard = loadedstr; - } - }; - - SocialCalc.WorkBookControlAjaxCall = function (url, contents) { - var http_request = null; - - alert("in ajax"); - if (window.XMLHttpRequest) { - // Mozilla, Safari,... - http_request = new XMLHttpRequest(); - } else if (window.ActiveXObject) { - // IE - try { - http_request = new ActiveXObject("Msxml2.XMLHTTP"); - } catch (e) { - try { - http_request = new ActiveXObject("Microsoft.XMLHTTP"); - } catch (e) {} - } - } - if (!http_request) { - alert("Giving up :( Cannot create an XMLHTTP instance"); - return false; - } - - // Make the actual request - SocialCalc.WorkBookControlHttpRequest = http_request; - - http_request.onreadystatechange = SocialCalc.WorkBookControlAlertContents; - http_request.open("POST", document.URL, true); // async - http_request.setRequestHeader( - "Content-Type", - "application/x-www-form-urlencoded" - ); - http_request.send(contents); - - return true; - }; - - SocialCalc.WorkBookControlSaveSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetsave = {}; - - sheetsave.numsheets = control.numSheets; - sheetsave.currentid = control.currentSheetButton.id; - sheetsave.currentname = control.currentSheetButton.value; - - sheetsave.sheetArr = {}; - for (var sheet in control.sheetButtonArr) { - var sheetstr = control.workbook.SaveWorkBookSheet(sheet); - sheetsave.sheetArr[sheet] = {}; - sheetsave.sheetArr[sheet].sheetstr = sheetstr; - sheetsave.sheetArr[sheet].name = control.sheetButtonArr[sheet].value; - sheetsave.sheetArr[sheet].hidden = - document.getElementById("sbsb-" + sheet).style.display == "none" - ? "1" - : "0"; - } - - // Save the editable cells if specified - if (SocialCalc.EditableCells && SocialCalc.EditableCells.allow) { - sheetsave.EditableCells = {}; - for (var i in SocialCalc.EditableCells) { - sheetsave.EditableCells[i] = SocialCalc.EditableCells[i]; - } - } - - var d = new Date(); - sheetsave["timestamp"] = d.toString(); - - SocialCalc.TestWorkBookSaveStr = JSON.stringify(sheetsave); - //alert(SocialCalc.TestWorkBookSaveStr); - // send it to the backend - // SocialCalc.WorkBookControlAjaxCall("/", "&sheetdata="+encodeURIComponent(SocialCalc.TestWorkBookSaveStr)); - return SocialCalc.TestWorkBookSaveStr; - }; - - // insert another workbook into an existing workbook - // assumption is at least 1 sheet exists in existing workbook - // sheets with same names will be overwritten ! - SocialCalc.WorkBookControlInsertWorkbook = function (savestr) { - var sheetsave; - if (savestr) { - sheetsave = JSON.parse(savestr); - } - var control = SocialCalc.GetCurrentWorkBookControl(); - for (var sheet in sheetsave.sheetArr) { - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - // check if sheetname already exists - var sheetname = sheetsave.sheetArr[sheet].name; - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - if (sheetid) { - console.log(sheetname + "exists"); - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, sheetname); - } else { - //just test-brand new insert first - sheetid = "sheet" + (control.sheetCnt + 1).toString(); - control.sheetCnt = control.sheetCnt + 1; - SocialCalc.WorkBookControlAddSheetButton( - sheetsave.sheetArr[sheet].name, - sheetid - ); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch( - sheetid, - sheetsave.sheetArr[sheet].name, - savestr - ); - } - } - }; - - SocialCalc.WorkBookControlLoad = function (savestr) { - var sheetsave; - - if (savestr == "") return; - - if (savestr) { - sheetsave = JSON.parse(savestr); - } else { - sheetsave = JSON.parse(SocialCalc.TestWorkBookSaveStr); - } - //alert(sheetsave.currentid+","+sheetsave.currentname) - - // first create a new workbook - var control = SocialCalc.GetCurrentWorkBookControl(); - - SocialCalc.WorkBookControlCreateNewBook(); - - // at this point there is one sheet, and 1 button - // create the sequence of buttons, and sheets - var firstrun = true; - var newbuttons = 0; - var sheetid = null; - var currentsheetid = sheetsave.currentid; - //alert("button="+newbuttons) - for (var sheet in sheetsave.sheetArr) { - //alert(sheet); - if (newbuttons > sheetsave.numsheets) { - break; - } - //alert("button="+newbuttons) - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - if (firstrun) { - firstrun = false; - // set the first button's name correctly - sheetid = control.currentSheetButton.id; - control.currentSheetButton.value = sheetsave.sheetArr[sheet].name; - SocialCalc.SheetBarButtonSetName( - sheetid, - sheetsave.sheetArr[sheet].name - ); - // set the sheet data for the first sheet which already exists - control.workbook.LoadRenameWorkBookSheet( - sheetid, - savestr, - control.currentSheetButton.value - ); - // need to also set the formula cache - currentsheetid = sheetid; - } else { - sheetid = "sheet" + (control.sheetCnt + 1).toString(); - control.sheetCnt = control.sheetCnt + 1; - SocialCalc.WorkBookControlAddSheetButton( - sheetsave.sheetArr[sheet].name, - sheetid - ); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch( - sheetid, - sheetsave.sheetArr[sheet].name, - savestr - ); - } - if (sheetsave.sheetArr[sheet].hidden == "1") { - // unregister with mouse ? etc - var sheetbarbutton = document.getElementById("sbsb-" + sheetid); - sheetbarbutton.style.display = "none"; - SocialCalc.SheetBarButtonActivate(sheet, false); - newbuttons = newbuttons - 1; - } - if (sheet == sheetsave.currentid) { - currentsheetid = sheetid; - } - newbuttons = newbuttons + 1; - } - // Save the user script data - if (sheetsave.EditableCells) { - SocialCalc.EditableCells = {}; - for (var i in sheetsave.EditableCells) { - SocialCalc.EditableCells[i] = sheetsave.EditableCells[i]; - } - } - var timeoutFn = function () { - SocialCalc.WorkBookControlActivateSheet(currentsheetid); - }; - window.setTimeout(timeoutFn, 200); - }; - - SocialCalc.WorkBookControlRenameSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - // do a popup to get the new name of the sheet - // the popup has an input element with submit, and cancel buttons - var element = document.getElementById(control.renameDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
    ' + - '' + - "Rename-" + - currentsheet + - "
    " + - '' + - "Please ensure that you DO NOT have ANY spaces in the sheet name." + - "" + - '
    ' + - "
    "; - - str += - '
    ' + - ' ' + - '
    '; - - var main = document.createElement("div"); - main.id = control.renameDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - " X 
    ' + - '
    ' + - str + - "
    "; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - - var ele = document.getElementById("newSheetName"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - }; - - SocialCalc.WorkBookControlRenameSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.renameDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlRenameSheetSubmit = function () { - // this handles all the rename action - var ele = document.getElementById("newSheetName"); - //console.log(ele.value); - var control = SocialCalc.GetCurrentWorkBookControl(); - if (ele.value.length == 0) { - ele.focus(); - return; - } - var oldname = control.currentSheetButton.value; - var newname = ele.value; - if (newname.indexOf(" ") != -1) { - alert( - "A space was found in the new name. Please ensure that the new name has no sapces" - ); - return; - } - SocialCalc.WorkBookControlRenameSheetHide(); - // verify newname does not clash with any existing sheet name - // if so reject - var smallname = newname.toLowerCase(); //converting to lower case to normalise - //console.log(smallname + " old " + ele.value); - for (var sheet in workbook.sheetArr) { - console.log(workbook.sheetArr[sheet].sheet.sheetname); //checking in sheetarr for repeated names - if (workbook.sheetArr[sheet].sheet.sheetname == smallname) { - alert(newname + " already exists"); - return; - } - } // variation of Case in letters of a sheet name will give an error if smallname is used. - - control.currentSheetButton.value = smallname; - - SocialCalc.SheetBarButtonSetName(control.currentSheetButton.id, newname); - - // perform a rename for formula references to this sheet in all the - // sheets in the workbook - control.workbook.RenameWorkBookSheet( - oldname, - smallname, - control.currentSheetButton.id - ); - - var cmdstr = - "rensheet " + - control.currentSheetButton.id + - " " + - oldname + - " " + - newname; - //console.log(cmdstr); - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - }; - - SocialCalc.WorkBookControlRenameSheetRemote = function ( - sheetid, - oldname, - newname - ) { - //console.log("rename sheet ",sheetid, oldname, newname) - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById("fooBar"); - var renbutton = document.getElementById(sheetid); - - renbutton.value = newname; - - SocialCalc.SheetBarButtonSetName(sheetid, newname); - - control.workbook.RenameWorkBookSheet(oldname, newname, sheetid); - }; - - SocialCalc.WorkBookControlCreateNewBook = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - // delete all the sheets except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - control.workbook.DeleteWorkBookSheet( - control.sheetButtonArr[sheet].id, - control.sheetButtonArr[sheet].value - ); - } - } - // Reset that 1 sheet - - control.workbook.LoadRenameWorkBookSheet( - control.currentSheetButton.id, - "", - control.workbook.defaultsheetname - ); - - // delete all the buttons except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.sheetButtonArr[sheet].id); - - var name = current.id; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + name); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.numSheets = control.numSheets - 1; - } - } - // rename that button - control.currentSheetButton.value = control.workbook.defaultsheetname; - //alert("done new workbook") - }; - - SocialCalc.WorkBookControlNewBook = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlCreateNewBook(); - control.workbook.RenderWorkBookSheet(); - }; - - SocialCalc.WorkBookControlMove = function (direction) { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - return; - } - var sheetArr = control.sheetButtonArr; - var newSheetArr = {}; - var sheetid = control.currentSheetButton.id; - - var curr_button = document.getElementById(sheetid); - var curr_sb_button = document.getElementById("sbsb-" + sheetid); - var sib_button = null; - var sib_sb_button = null; - if (direction == "left") { - sib_button = curr_button.previousSibling; - sib_sb_button = curr_sb_button.previousSibling; - if (!sib_sb_button) { - alert("Cannot move leftmost Sheet further to the left"); - return; - } - } else { - sib_button = curr_button.nextSibling; - sib_sb_button = curr_sb_button.nextSibling; - if (!sib_sb_button) { - alert("Cannot move rightmost Sheet further to the right"); - return; - } - } - var currid = sheetid; - var sibid = sib_button.id; - var parent = curr_button.parentNode; - var sb_parent = curr_sb_button.parentNode; - - var cloned = {}; - var clonedsb = {}; - for (button in sheetArr) { - clonedsb[button] = document.getElementById("sbsb-" + button); - cloned[button] = document.getElementById(button); - sb_parent.removeChild(document.getElementById("sbsb-" + button)); - parent.removeChild(document.getElementById(button)); - } - for (button in sheetArr) { - if (button != currid && button != sibid) { - newSheetArr[button] = sheetArr[button]; - sb_parent.appendChild(clonedsb[button]); - parent.appendChild(cloned[button]); - } else if (button == currid) { - if (direction == "left") { - newSheetArr[currid] = sheetArr[currid]; - newSheetArr[sibid] = sheetArr[sibid]; - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - } else { - newSheetArr[sibid] = sheetArr[sibid]; - newSheetArr[currid] = sheetArr[currid]; - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - } - } - } - control.sheetButtonArr = newSheetArr; - SocialCalc.SheetBarButtonActivate(currid, true); - }; - - SocialCalc.WorkBookControlMoveLeft = function () { - SocialCalc.WorkBookControlMove("left"); - }; - SocialCalc.WorkBookControlMoveRight = function () { - SocialCalc.WorkBookControlMove("right"); - }; - - SocialCalc.WorkBookControlCopySheet = function () { - //alert("in copy"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - control.workbook.CopyWorkBookSheet(control.currentSheetButton.id); - - alert("copied sheet:" + control.currentSheetButton.value); - }; - - SocialCalc.WorkBookControlPasteSheet = function () { - //alert("in paste"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - var oldid = control.currentSheetButton.id; - - SocialCalc.WorkBookControlAddSheet(false); - - var newid = control.currentSheetButton.id; - - //alert(newid+oldid); - - control.workbook.PasteWorkBookSheet(newid, oldid); - - var cmdstr = "addsheetstr"; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - sheetstr: control.workbook.clipsheet.savestr, - }); - }; - - SocialCalc.SheetBar = function () { - this.baseDiv = document.getElementById("SocialCalc-sheetbar"); - - this.prebuttonsDiv = document.createElement("div"); - this.prebuttonsDiv.style.cssText = "display:inline;"; - this.prebuttonsDiv.innerHTML = "        "; - this.prebuttonsDiv.id = "SocialCalc-sheetbar-prebuttons"; - - this.buttonsDiv = document.createElement("div"); - this.buttonsDiv.id = "SocialCalc-sheetbar-buttons"; - this.buttonsDiv.style.cssText = "display:inline;"; - - this.buttonActionsDiv = document.createElement("div"); - this.buttonActionsDiv.id = "SocialCalc-sheetbar-buttonactions"; - this.buttonActionsDiv.style.display = "inline"; - var addbutton = new SocialCalc.SheetBarSheetButton( - "sbsba-add", - "sbsba-add", - this.buttonActionsDiv, - {}, - { - MouseDown: function () { - var abc = SocialCalc.WorkBookControlAddSheet(true); - }, - }, - "add-2.png" - ); - - this.baseDiv.appendChild(this.prebuttonsDiv); - this.baseDiv.appendChild(this.buttonsDiv); - this.baseDiv.appendChild(this.buttonActionsDiv); - }; - - // define a new class for sheetbarsheetbutton - - SocialCalc.SheetBarSheetButton = function ( - id, - name, - parentdiv, - params, - functions, - img - ) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.name = name; - if (!img) { - this.ele.innerHTML = name; - this.ele.style.cssText = - "font-size:small;display:inline;padding:5px 5px 2px 5px;border:1px solid #000;"; - imgele = document.createElement("img"); - imgele.id = id + "-img"; - imgele.src = - SocialCalc.Constants.defaultImagePrefix + "menu-dropdown.png"; - imgele.style.cssText = - "padding:0px 2px;width:16px;height:16px;vertical-align:middle;"; - this.ele.appendChild(imgele); - SocialCalc.ButtonRegister(this.ele, params, functions); - SocialCalc.ButtonRegister(imgele, params, functions); - } else { - var imgele = document.createElement("img"); - imgele.src = SocialCalc.Constants.defaultImagePrefix + img; - imgele.style.cssText = "width:16px;height:16px;vertical-align:middle;"; - this.ele.appendChild(imgele); - this.ele.style.cssText = "display:inline;padding:5px 5px 2px 5px;"; - SocialCalc.ButtonRegister(imgele, params, functions); - } - parentdiv.appendChild(this.ele); - }; - - SocialCalc.SheetBarButtonActivate = function (id, active) { - var sbbutton = document.getElementById("sbsb-" + id); - sbbutton.isactive = active; - if (active) { - sbbutton.style.backgroundColor = "#FFF"; - var imgele = document.getElementById("sbsb-" + id + "-img"); - if (!imgele) { - imgele = document.createElement("img"); - imgele.id = "sbsb-" + id + "-img"; - imgele.src = - SocialCalc.Constants.defaultImagePrefix + "menu-dropdown.png"; - imgele.style.cssText = - "padding:0px 2px;width:16px;height:16px;vertical-align:middle;"; - } - sbbutton.appendChild(imgele); - SocialCalc.ButtonRegister( - imgele, - {}, - { - MouseDown: function () { - SocialCalc.SheetBarSheetButtonPress(id); - }, - Repeat: function () {}, - Disabled: function () {}, - } - ); - } else { - sbbutton.style.backgroundColor = "#CCC"; - var imgele = document.getElementById("sbsb-" + id + "-img"); - if (imgele) { - sbbutton.removeChild(imgele); - } - } - var menu = document.getElementById("sbsb-menu"); - if (menu && menu.style.display != "none") { - menu.style.display = "none"; - } - }; - - SocialCalc.SheetBarButtonSetName = function (id, name) { - var sbbutton = document.getElementById("sbsb-" + id); - sbbutton.name = name; - sbbutton.innerHTML = name; - if (sbbutton.isactive) { - SocialCalc.SheetBarButtonActivate(id, true); - } - }; - - SocialCalc.SheetBarSheetButtonPress = function (id) { - //console.log("button press") - var sbbutton = document.getElementById("sbsb-" + id); - if (sbbutton && sbbutton.isactive) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) { - var sbsbm = new SocialCalc.SheetBarSheetButtonMenu("sbsb-menu", id); - } else { - menu.clickedsheetid = id; - if (menu.style.display == "none") { - menu.style.display = "inline"; - SocialCalc.SheetBarSheetButtonMenuPosition(menu, id); - } else { - menu.style.display = "none"; - } - } - } else if (sbbutton) { - SocialCalc.WorkBookControlActivateSheet(id); - } - }; - - // define a new class for sheetbarsheet button menu item - - SocialCalc.SheetBarSheetButtonMenuItem = function (id, t) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.innerHTML = t; - this.ele.className = ""; - this.ele.style.cssText = - "padding:3px 4px;width:100px;height:20px;background-color:#FFF;"; - - var params = { - normalstyle: "backgroundColor:#FFF;", - downstyle: "backgroundColor:#CCC;", - hoverstyle: "backgroundColor:#CCC;", - }; - var functions = { - MouseDown: function () { - SocialCalc.SheetBarMenuItemPress(id); - }, - Repeat: function () {}, - Disabled: function () {}, - }; - - SocialCalc.ButtonRegister(this.ele, params, functions); - - SocialCalc.TouchRegister(this.ele, { SingleTap: functions.MouseDown }); - - return this.ele; - }; - - SocialCalc.SheetBarMenuItemPress = function (id) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) return; - - var clickedsheetid = menu.clickedsheetid; - - switch (id) { - case "sbsb_deletesheet": - //console.log("delete "+clickedsheetid); - SocialCalc.WorkBookControlDelSheet(); - break; - case "sbsb_hidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlHideSheet(); - break; - case "sbsb_unhidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlUnhideSheet(); - break; - case "sbsb_copysheet": - //console.log("copy "+clickedsheetid); - SocialCalc.WorkBookControlCopySheet(); - break; - case "sbsb_moveleft": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveLeft(); - break; - case "sbsb_moveright": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveRight(); - break; - - case "sbsb_pastesheet": - //console.log("paste "+clickedsheetid); - SocialCalc.WorkBookControlPasteSheet(); - break; - case "sbsb_renamesheet": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlRenameSheet(); - break; - case "sbsb_closemenu": - //console.log("rename "+clickedsheetid); - menu.style.display = "none"; - break; - default: - break; - } - menu.style.display = "none"; - }; - - // define a new class for sheetbarsheet button menu - SocialCalc.SheetBarSheetButtonMenu = function (id, clickedsheetid) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.className = ""; - this.ele.clickedsheetid = clickedsheetid; - this.ele.style.cssText = - "border:1px solid #000;position:absolute;top:200px;left:0px;width=100px;z-index:120"; - - var ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_deletesheet", - " Delete Sheet" - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_hidesheet", - " Hide Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_unhidesheet", - " Unhide Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_renamesheet", - " Rename Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_moveleft", - " Move Left " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_moveright", - " Move Right " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_copysheet", - " Copy Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_pastesheet", - " Paste Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_closemenu", - " Cancel" - ); - this.ele.appendChild(ele1); - - SocialCalc.SheetBarSheetButtonMenuPosition(this.ele, clickedsheetid); - - //var clickedsheet = document.getElementById(clickedsheetid); - //var position = SocialCalc.GetElementPosition(clickedsheet); - //console.log(clickedsheet.offsetHeight,clickedsheet.offsetWidth,clickedsheet.offsetLeft, clickedsheet.offsetTop); - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.editor.toplevel.appendChild(this.ele); - }; - - // position the sheet menu - SocialCalc.SheetBarSheetButtonMenuPosition = function (menu, clickedsheetid) { - var hlessbutton = document.getElementById("te_lessbuttonh"); - - //console.log(hlessbutton.style.top, hlessbutton.style.left); - - var sbbutton = document.getElementById("sbsb-" + clickedsheetid); - - //console.log(sbbutton.offsetLeft,clickedsheetid); - - var top = hlessbutton.style.top.slice(0, -2) - 220; - var left = sbbutton.offsetLeft + 7; - - menu.style.top = top + "px"; - menu.style.left = left + "px"; - - //console.log(menu.style.top, menu.style.left); - }; - - SocialCalc.ScriptInfo = { - scripts: {}, - handle: null, - }; - - SocialCalc.ScriptCheck = function (sheetid, coord, text) { - var commentstart = text.indexOf(""); - if (commentstart != -1 && commentend != -1) { - var script = text.slice(commentstart + 10, commentend); - //alert(script); - SocialCalc.ScriptInfo.scripts[coord] = script; - if (SocialCalc.ScriptInfo.handle == null) { - SocialCalc.ScriptInfo.handle = window.setTimeout( - SocialCalc.EvalUserScripts, - 500 - ); - } - //alert(coord+"-"+sheetid); - } - }; - - SocialCalc.EvalUserScript = function (data) { - var head = - document.getElementsByTagName("head")[0] || document.documentElement; - - if (data == "") return; - - var script = document.createElement("script"); - - script.type = "text/javascript"; - try { - // doesn't work on ie... - script.appendChild(document.createTextNode(data)); - } catch (e) { - // IE has funky script nodes - script.text = data; - } - - head.insertBefore(script, head.firstChild); - head.removeChild(script); - }; - - SocialCalc.EvalUserScripts = function () { - for (var cr in SocialCalc.ScriptInfo.scripts) { - SocialCalc.EvalUserScript(SocialCalc.ScriptInfo.scripts[cr]); - //console.log(cr,SocialCalc.ScriptInfo.scripts[cr]) - } - SocialCalc.ScriptInfo.handle = null; - SocialCalc.ScriptInfo.scripts = {}; - }; - - SocialCalc.CallOutOnRenderCell = function (sheetobj, value, cr) { - var cell = sheetobj.cells[cr]; - if (!cell) return; - var valuetype = cell.valuetype || ""; // get type of value to determine formatting - var valuesubtype = valuetype.substring(1); - var sheetattribs = sheetobj.attribs; - var valueformat; - valuetype = valuetype.charAt(0); - if (valuetype == "t") { - valueformat = - sheetobj.valueformats[cell.textvalueformat - 0] || - sheetobj.valueformats[sheetattribs.defaulttextvalueformat - 0] || - ""; - if (valueformat == "text-html") { - SocialCalc.ScriptCheck(sheetobj.sheetid, cr, value); - } - } - }; - - SocialCalc.GetCellDataValue = function (coord) { - var sheetname = null; - var sheetid = ""; - var bindex = coord.indexOf("!"); - if (bindex != -1) { - sheetname = coord.slice(0, bindex); - coord = coord.slice(bindex + 1); - //console.log(sheetname,coord) - } - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (sheetname == null) { - sheetid = control.currentSheetButton.id; - } else { - sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - } - - if (sheetid == null || sheetid == "") { - return "0"; - } - - var sheetobj = control.workbook.sheetArr[sheetid].sheet; - - var cell = sheetobj.cells[coord]; - - if (cell) { - return cell.datavalue; - } else { - return 0; - } - }; - - SocialCalc.GetCellDataArray = function (coordstr, sheetname) { - var vals = []; - var coords = coordstr.split(","); - if (sheetname == null) { - sheetname = ""; - } else { - sheetname = sheetname + "!"; - } - for (var c in coords) { - vals.push(SocialCalc.GetCellDataValue(sheetname + coords[c])); - } - return vals; - }; - - SocialCalc.UserScriptData = {}; - - SocialCalc.WorkBookRecalculateInfo = { - sheets: [], - calcorder: [], - current: 0, - pass: 0, - }; - - SocialCalc.WorkBookRecalculateAll = function () { - // do it from the last sheet to the first sheet - // using the recalc-done signal to trigger the next sheet - - // if already in the middle of a recalculate-all, ignore this. - if ( - SocialCalc.WorkBookRecalculateInfo.current != 0 || - SocialCalc.WorkBookRecalculateInfo.calcorder.length != 0 || - SocialCalc.WorkBookRecalculateInfo.sheets.length != 0 - ) { - return; - } - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - SocialCalc.WorkBookRecalculateInfo.current = 0; - - for (var sheet in control.workbook.sheetArr) { - SocialCalc.WorkBookRecalculateInfo.sheets.push(sheet); - } - - var i = 0; - for (var c = SocialCalc.WorkBookRecalculateInfo.sheets.length; c > 0; c--) { - SocialCalc.WorkBookRecalculateInfo.calcorder[i] = - SocialCalc.WorkBookRecalculateInfo.sheets[c - 1]; - i++; - } - window.setTimeout(SocialCalc.WorkBookRecalculateStep, 500); - }; - - SocialCalc.WorkBookRecalculateStep = function () { - if ( - SocialCalc.WorkBookRecalculateInfo.current == - SocialCalc.WorkBookRecalculateInfo.calcorder.length - ) { - SocialCalc.WorkBookRecalculateInfo.current = 0; - SocialCalc.WorkBookRecalculateInfo.calcorder = []; - SocialCalc.WorkBookRecalculateInfo.sheets = []; - if (SocialCalc.WorkBookRecalculateInfo.pass == 1) { - SocialCalc.WorkBookRecalculateInfo.pass = 0; - SocialCalc.SpinnerWaitHide(); - //alert("load done"); - return; - } else { - SocialCalc.WorkBookRecalculateInfo.pass++; - SocialCalc.WorkBookRecalculateAll(); - return; - } - } - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert("recalculate "+ - // SocialCalc.WorkBookRecalculateInfo.calcorder[ - // SocialCalc.WorkBookRecalculateInfo.current] - // ); - var sheetid = - SocialCalc.WorkBookRecalculateInfo.calcorder[ - SocialCalc.WorkBookRecalculateInfo.current - ]; - SocialCalc.WorkBookControlActivateSheet(sheetid); - SocialCalc.WorkBookRecalculateInfo.current++; - - window.setTimeout(SocialCalc.WorkBookRecalculateStep, 1000); - }; - - SocialCalc.SpinnerWaitCreate = function () { - // if the div exists already just use it - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - return; - } - var main = document.createElement("div"); - main.id = "waitloadingspinner"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - main.style.top = vp.height / 2 + "px"; - main.style.left = vp.width / 2 + "px"; - main.style.zIndex = 110; - - main.style.width = "50px"; - main.style.height = "50px"; - main.innerHTML = - 'Loading...'; - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.SpinnerWaitHide = function () { - // if the div exists already just use it - - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - ele.innerHTML = ""; - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - } - }; - - SocialCalc.EditableCells = {}; - SocialCalc.EditableCells.allow = false; - SocialCalc.EditableCells.cells = {}; - - SocialCalc.Callbacks.IsCoordEditable = function (sheetcoord) { - if (!SocialCalc.EditableCells.allow) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[sheetcoord]) { - // by default all cells are editable - return true; - } - - return false; - }; - - SocialCalc.Callbacks.IsCellEditable = function (editor) { - var cellname = editor.workingvalues.currentsheet + "!" + editor.ecell.coord; - if (!SocialCalc.EditableCells.allow) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[cellname]) { - // by default all cells are editable - return true; - } - - return false; - }; - - SocialCalc.IsScrollPossible = function ( - lastrow, - lastcol, - curr_vpos, - curr_hpos, - vamount, - hamount - ) { - //return false; - //console.log(lastrow+","+lastcol); - //console.log(curr_vpos+","+curr_hpos); - //console.log(vamount+","+hamount); - - if (curr_vpos + 10 + vamount > lastrow) { - return false; - } - if (curr_hpos + hamount > lastcol) { - return false; - } - return true; - }; - - // this is for checkmark toggling - SocialCalc.Callbacks.ToggleCell = function (cellname) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var sheetid = control.currentSheetButton.id; - var sheetobj = control.workbook.sheetArr[sheetid].sheet; - var cell = sheetobj.cells[cellname]; - var sheetname = sheetobj.sheetname; - - // check if cell is in constraints - //console.log(sheetname); - //console.log(cellname); - - var constraint = - SocialCalc.EditableCells.constraints[sheetname + "!" + cellname]; - if (!constraint || constraint[0] != "tc") { - return; - } - - var cellinner = document.getElementById("cell_" + cellname); - - if (cellinner.innerHTML.indexOf(" ") != -1) { - // set the value to the img value - cellinner.innerHTML = - '
    '; - if (cell) { - //cell.displaystring = '
    ' ; - //cell.datavalue = '
    ' ; - //console.log("found cell") - cell.displaystring = - '
    '; - cell.datavalue = - '
    '; - //http://img689.imageshack.us/img689/9234/checkmark.png - } - } else { - // set the value to a space - cellinner.innerHTML = "
     
    "; - if (cell) { - cell.datavalue = "
     
    "; - cell.displaystring = "
     
    "; - } - } - }; - - SocialCalc.WorkbookControlCreateSheetHTML = function (sheetlist) { - var context, div, ele; - - var result = ""; - - var control = SocialCalc.GetCurrentWorkBookControl(); - - div = document.createElement("div"); - - if (!sheetlist) { - context = new SocialCalc.RenderContext(spreadsheet.sheet); - ele = context.RenderSheet(null, { type: "html" }); - div.appendChild(ele); - context = undefined; - } else { - for (var sheetid in sheetlist) { - context = new SocialCalc.RenderContext( - control.workbook.sheetArr[sheetid].sheet - ); - ele = context.RenderSheet(null, { type: "html" }); - context = undefined; - div.appendChild(ele); - if (sheetid.substring(5) == control.sheetCnt) { - ele.style.pageBreakAfter = "auto"; - } else { - ele.style.pageBreakAfter = "always"; - } - } - } - - result = div.innerHTML; - ele = undefined; - div = undefined; - //console.log(result); - return result; - }; - - /* - http://www.JSON.org/json2.js - 2010-08-25 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date ? - 'Date(' + this[key] + ')' : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - - /*jslint evil: true, strict: false */ - - /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, - call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - // Create a JSON object only if one does not already exist. We create the - // methods in a closure to avoid creating global variables. - - if (!this.JSON) { - this.JSON = {}; - } - - (function () { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? "0" + n : n; - } - - if (typeof Date.prototype.toJSON !== "function") { - Date.prototype.toJSON = function (key) { - return isFinite(this.valueOf()) - ? this.getUTCFullYear() + - "-" + - f(this.getUTCMonth() + 1) + - "-" + - f(this.getUTCDate()) + - "T" + - f(this.getUTCHours()) + - ":" + - f(this.getUTCMinutes()) + - ":" + - f(this.getUTCSeconds()) + - "Z" - : null; - }; - - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = - function (key) { - return this.valueOf(); - }; - } - - var cx = - /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = - /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { - // table of character substitutions - "\b": "\\b", - "\t": "\\t", - "\n": "\\n", - "\f": "\\f", - "\r": "\\r", - '"': '\\"', - "\\": "\\\\", - }, - rep; - - function quote(string) { - // If the string contains no control characters, no quote characters, and no - // backslash characters, then we can safely slap some quotes around it. - // Otherwise we must also replace the offending characters with safe escape - // sequences. - - escapable.lastIndex = 0; - return escapable.test(string) - ? '"' + - string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === "string" - ? c - : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); - }) + - '"' - : '"' + string + '"'; - } - - function str(key, holder) { - // Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - - // If the value has a toJSON method, call it to obtain a replacement value. - - if ( - value && - typeof value === "object" && - typeof value.toJSON === "function" - ) { - value = value.toJSON(key); - } - - // If we were called with a replacer function, then call the replacer to - // obtain a replacement value. - - if (typeof rep === "function") { - value = rep.call(holder, key, value); - } - - // What happens next depends on the value's type. - - switch (typeof value) { - case "string": - return quote(value); - - case "number": - // JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : "null"; - - case "boolean": - case "null": - // If the value is a boolean or null, convert it to a string. Note: - // typeof null does not produce 'null'. The case is included here in - // the remote chance that this gets fixed someday. - - return String(value); - - // If the type is 'object', we might be dealing with an object or an array or - // null. - - case "object": - // Due to a specification blunder in ECMAScript, typeof null is 'object', - // so watch out for that case. - - if (!value) { - return "null"; - } - - // Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - - // Is the value an array? - - if (Object.prototype.toString.apply(value) === "[object Array]") { - // The value is an array. Stringify every element. Use null as a placeholder - // for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || "null"; - } - - // Join all of the elements together, separated with commas, and wrap them in - // brackets. - - v = - partial.length === 0 - ? "[]" - : gap - ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" - : "[" + partial.join(",") + "]"; - gap = mind; - return v; - } - - // If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === "object") { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === "string") { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ": " : ":") + v); - } - } - } - } else { - // Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ": " : ":") + v); - } - } - } - } - - // Join all of the member texts together, separated with commas, - // and wrap them in braces. - - v = - partial.length === 0 - ? "{}" - : gap - ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" - : "{" + partial.join(",") + "}"; - gap = mind; - return v; - } - } - - // If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== "function") { - JSON.stringify = function (value, replacer, space) { - // The stringify method takes a value and an optional replacer, and an optional - // space parameter, and returns a JSON text. The replacer can be a function - // that can replace values, or an array of strings that will select the keys. - // A default replacer method can be provided. Use of the space parameter can - // produce text that is more easily readable. - - var i; - gap = ""; - indent = ""; - - // If the space parameter is a number, make an indent string containing that - // many spaces. - - if (typeof space === "number") { - for (i = 0; i < space; i += 1) { - indent += " "; - } - - // If the space parameter is a string, it will be used as the indent string. - } else if (typeof space === "string") { - indent = space; - } - - // If there is a replacer, it must be a function or an array. - // Otherwise, throw an error. - - rep = replacer; - if ( - replacer && - typeof replacer !== "function" && - (typeof replacer !== "object" || typeof replacer.length !== "number") - ) { - throw new Error("JSON.stringify"); - } - - // Make a fake root object containing our value under the key of ''. - // Return the result of stringifying the value. - - return str("", { "": value }); - }; - } - - // If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== "function") { - JSON.parse = function (text, reviver) { - // The parse method takes a text and an optional reviver function, and returns - // a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - // The walk method is used to recursively walk the resulting structure so - // that modifications can be made. - - var k, - v, - value = holder[key]; - if (value && typeof value === "object") { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - // Parsing happens in four stages. In the first stage, we replace certain - // Unicode characters with escape sequences. JavaScript handles many characters - // incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - - // In the second stage, we run the text against regular expressions that look - // for non-JSON patterns. We are especially concerned with '()' and 'new' - // because they can cause invocation, and '=' because it can cause mutation. - // But just to be safe, we want to reject all unexpected forms. - - // We split the second stage into 4 regexp operations in order to work around - // crippling inefficiencies in IE's and Safari's regexp engines. First we - // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we - // replace all simple value tokens with ']' characters. Third, we delete all - // open brackets that follow a colon or comma or that begin the text. Finally, - // we look to see that the remaining characters are only whitespace or ']' or - // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if ( - /^[\],:{}\s]*$/.test( - text - .replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") - .replace( - /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - "]" - ) - .replace(/(?:^|:|,)(?:\s*\[)+/g, "") - ) - ) { - // In the third stage we use the eval function to compile the text into a - // JavaScript structure. The '{' operator is subject to a syntactic ambiguity - // in JavaScript: it can begin a block or an object literal. We wrap the text - // in parens to eliminate the ambiguity. - - j = eval("(" + text + ")"); - - // In the optional fourth stage, we recursively walk the new structure, passing - // each name/value pair to a reviver function for possible transformation. - - return typeof reviver === "function" ? walk({ "": j }, "") : j; - } - - // If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError("JSON.parse"); - }; - } - })(); - - SocialCalc.oldBtnActive = 1; - SocialCalc.Constants.defaultImagePrefix = "www/assets/images/sc_"; - SocialCalc.Constants.defaultGridCSS = ""; - SocialCalc.Constants.SCNoColNames = true; - SocialCalc.Constants.SCNoRowName = true; - SocialCalc.Constants.defaultRownameStyle = ""; - SocialCalc.Constants.defaultSelectedRownameStyle = ""; - SocialCalc.Popup.imagePrefix = "www/assets/images/sc_"; - - SocialCalc.ToggleInputLineButtons = function (show) { - var bele = document.getElementById("testtest"); - if (!bele) return; - if (show) { - bele.style.display = "inline"; - } else { - bele.style.display = "none"; - } - }; - - SocialCalc.InputLineClearText = function () { - spreadsheet.editor.inputBox.SetText(""); - }; - - SocialCalc.Callbacks.broadcast = function (type, data) {}; - - // END OF FILE - - if ("undefined" === typeof document) { - // We don't really need a DOM-based presentation layer on the server - SocialCalc.GetEditorCellElement = function () {}; - SocialCalc.ReplaceCell = function () {}; - SocialCalc.EditorRenderSheet = function () {}; - SocialCalc.SpreadsheetControlSortSave = function () { - return ""; - }; - SocialCalc.SpreadsheetControlStatuslineCallback = function () {}; - SocialCalc.DoPositionCalculations = function (editor) { - SocialCalc.EditorSheetStatusCallback(null, "doneposcalc", null, editor); - }; - } - - // Compatibility with webworker-threads - if (typeof self !== "undefined" && self.thread) { - window.setTimeout = function (cb, ms) { - if (ms <= 1) { - self.thread.nextTick(cb); - } - }; - window.clearTimeout = function () {}; - } - - // Just return a value to define the module export. - return SocialCalc; -}); diff --git a/Govt-Billing-React-Ad-Subscriptions/public/apple-touch-icon-180x180.png b/Govt-Billing-React-Ad-Subscriptions/public/apple-touch-icon-180x180.png deleted file mode 100644 index 7fd0c73..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/public/apple-touch-icon-180x180.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/public/checkmark.png b/Govt-Billing-React-Ad-Subscriptions/public/checkmark.png deleted file mode 100755 index b435424..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/public/checkmark.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/public/favicon.ico b/Govt-Billing-React-Ad-Subscriptions/public/favicon.ico deleted file mode 100644 index d09d4d4..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/public/favicon.ico and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/public/favicon.png b/Govt-Billing-React-Ad-Subscriptions/public/favicon.png deleted file mode 100644 index 51888a7..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/public/favicon.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.flot.min.js b/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.flot.min.js deleted file mode 100644 index 31f465b..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.flot.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){jQuery.color={};jQuery.color.make=function(G,H,J,I){var A={};A.r=G||0;A.g=H||0;A.b=J||0;A.a=I!=null?I:1;A.add=function(C,D){for(var E=0;E=1){return"rgb("+[A.r,A.g,A.b].join(",")+")"}else{return"rgba("+[A.r,A.g,A.b,A.a].join(",")+")"}};A.normalize=function(){function C(E,D,F){return DF?F:D)}A.r=C(0,parseInt(A.r),255);A.g=C(0,parseInt(A.g),255);A.b=C(0,parseInt(A.b),255);A.a=C(0,A.a,1);return A};A.clone=function(){return jQuery.color.make(A.r,A.b,A.g,A.a)};return A.normalize()};jQuery.color.extract=function(E,F){var A;do{A=E.css(F).toLowerCase();if(A!=""&&A!="transparent"){break}E=E.parent()}while(!jQuery.nodeName(E.get(0),"body"));if(A=="rgba(0, 0, 0, 0)"){A="transparent"}return jQuery.color.parse(A)};jQuery.color.parse=function(A){var F,H=jQuery.color.make;if(F=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(A)){return H(parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10))}if(F=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(A)){return H(parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10),parseFloat(F[4]))}if(F=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(A)){return H(parseFloat(F[1])*2.55,parseFloat(F[2])*2.55,parseFloat(F[3])*2.55)}if(F=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(A)){return H(parseFloat(F[1])*2.55,parseFloat(F[2])*2.55,parseFloat(F[3])*2.55,parseFloat(F[4]))}if(F=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(A)){return H(parseInt(F[1],16),parseInt(F[2],16),parseInt(F[3],16))}if(F=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(A)){return H(parseInt(F[1]+F[1],16),parseInt(F[2]+F[2],16),parseInt(F[3]+F[3],16))}var G=jQuery.trim(A).toLowerCase();if(G=="transparent"){return H(255,255,255,0)}else{F=B[G];return H(F[0],F[1],F[2])}};var B={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})();(function(C){function B(l,W,X,E){var O=[],g={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{mode:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,twelveHourClock:false},yaxis:{autoscaleMargin:0.02},x2axis:{autoscaleMargin:null},y2axis:{autoscaleMargin:0.02},series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false},shadowSize:3},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,tickColor:"rgba(0,0,0,0.15)",labelMargin:5,borderWidth:2,borderColor:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},hooks:{}},P=null,AC=null,AD=null,Y=null,AJ=null,s={xaxis:{},yaxis:{},x2axis:{},y2axis:{}},e={left:0,right:0,top:0,bottom:0},y=0,Q=0,I=0,t=0,L={processOptions:[],processRawData:[],processDatapoints:[],draw:[],bindEvents:[],drawOverlay:[]},G=this;G.setData=f;G.setupGrid=k;G.draw=AH;G.getPlaceholder=function(){return l};G.getCanvas=function(){return P};G.getPlotOffset=function(){return e};G.width=function(){return I};G.height=function(){return t};G.offset=function(){var AK=AD.offset();AK.left+=e.left;AK.top+=e.top;return AK};G.getData=function(){return O};G.getAxes=function(){return s};G.getOptions=function(){return g};G.highlight=AE;G.unhighlight=x;G.triggerRedrawOverlay=q;G.pointOffset=function(AK){return{left:parseInt(T(AK,"xaxis").p2c(+AK.x)+e.left),top:parseInt(T(AK,"yaxis").p2c(+AK.y)+e.top)}};G.hooks=L;b(G);r(X);c();f(W);k();AH();AG();function Z(AM,AK){AK=[G].concat(AK);for(var AL=0;AL=g.colors.length){AP=0;++AO}}var AQ=0,AW;for(AP=0;APAl.datamax){Al.datamax=Aj}}for(Ac=0;Ac0&&Ab[AZ-AX]!=null&&Ab[AZ-AX]!=Ab[AZ]&&Ab[AZ-AX+1]!=Ab[AZ+1]){for(AV=0;AVAU){AU=Ai}}if(Af.y){if(AiAd){Ad=Ai}}}}if(AR.bars.show){var Ag=AR.bars.align=="left"?0:-AR.bars.barWidth/2;if(AR.bars.horizontal){AY+=Ag;Ad+=Ag+AR.bars.barWidth}else{AS+=Ag;AU+=Ag+AR.bars.barWidth}}AN(AR.xaxis,AS,AU);AN(AR.yaxis,AY,Ad)}for(AK in s){if(s[AK].datamin==AW){s[AK].datamin=null}if(s[AK].datamax==AQ){s[AK].datamax=null}}}function c(){function AK(AM,AL){var AN=document.createElement("canvas");AN.width=AM;AN.height=AL;if(C.browser.msie){AN=window.G_vmlCanvasManager.initElement(AN)}return AN}y=l.width();Q=l.height();l.html("");if(l.css("position")=="static"){l.css("position","relative")}if(y<=0||Q<=0){throw"Invalid dimensions for plot, width = "+y+", height = "+Q}if(C.browser.msie){window.G_vmlCanvasManager.init_(document)}P=C(AK(y,Q)).appendTo(l).get(0);Y=P.getContext("2d");AC=C(AK(y,Q)).css({position:"absolute",left:0,top:0}).appendTo(l).get(0);AJ=AC.getContext("2d");AJ.stroke()}function AG(){AD=C([AC,P]);if(g.grid.hoverable){AD.mousemove(D)}if(g.grid.clickable){AD.click(d)}Z(L.bindEvents,[AD])}function k(){function AL(AT,AU){function AP(AV){return AV}var AS,AO,AQ=AU.transform||AP,AR=AU.inverseTransform;if(AT==s.xaxis||AT==s.x2axis){AS=AT.scale=I/(AQ(AT.max)-AQ(AT.min));AO=AQ(AT.min);if(AQ==AP){AT.p2c=function(AV){return(AV-AO)*AS}}else{AT.p2c=function(AV){return(AQ(AV)-AO)*AS}}if(!AR){AT.c2p=function(AV){return AO+AV/AS}}else{AT.c2p=function(AV){return AR(AO+AV/AS)}}}else{AS=AT.scale=t/(AQ(AT.max)-AQ(AT.min));AO=AQ(AT.max);if(AQ==AP){AT.p2c=function(AV){return(AO-AV)*AS}}else{AT.p2c=function(AV){return(AO-AQ(AV))*AS}}if(!AR){AT.c2p=function(AV){return AO-AV/AS}}else{AT.c2p=function(AV){return AR(AO-AV/AS)}}}}function AN(AR,AT){var AQ,AS=[],AP;AR.labelWidth=AT.labelWidth;AR.labelHeight=AT.labelHeight;if(AR==s.xaxis||AR==s.x2axis){if(AR.labelWidth==null){AR.labelWidth=y/(AR.ticks.length>0?AR.ticks.length:1)}if(AR.labelHeight==null){AS=[];for(AQ=0;AQ'+AP+"")}}if(AS.length>0){var AO=C('
    '+AS.join("")+'
    ').appendTo(l);AR.labelHeight=AO.height();AO.remove()}}}else{if(AR.labelWidth==null||AR.labelHeight==null){for(AQ=0;AQ'+AP+"")}}if(AS.length>0){var AO=C('
    '+AS.join("")+"
    ").appendTo(l);if(AR.labelWidth==null){AR.labelWidth=AO.width()}if(AR.labelHeight==null){AR.labelHeight=AO.find("div").height()}AO.remove()}}}if(AR.labelWidth==null){AR.labelWidth=0}if(AR.labelHeight==null){AR.labelHeight=0}}function AM(){var AP=g.grid.borderWidth;for(i=0;i0){e.bottom=Math.max(AP,s.xaxis.labelHeight+AO)}if(s.yaxis.labelWidth>0){e.left=Math.max(AP,s.yaxis.labelWidth+AO)}if(s.x2axis.labelHeight>0){e.top=Math.max(AP,s.x2axis.labelHeight+AO)}if(s.y2axis.labelWidth>0){e.right=Math.max(AP,s.y2axis.labelWidth+AO)}I=y-e.left-e.right;t=Q-e.bottom-e.top}var AK;for(AK in s){K(s[AK],g[AK])}if(g.grid.show){for(AK in s){F(s[AK],g[AK]);p(s[AK],g[AK]);AN(s[AK],g[AK])}AM()}else{e.left=e.right=e.top=e.bottom=0;I=y;t=Q}for(AK in s){AL(s[AK],g[AK])}if(g.grid.show){h()}AI()}function K(AN,AQ){var AM=+(AQ.min!=null?AQ.min:AN.datamin),AK=+(AQ.max!=null?AQ.max:AN.datamax),AP=AK-AM;if(AP==0){var AL=AK==0?1:0.01;if(AQ.min==null){AM-=AL}if(AQ.max==null||AQ.min!=null){AK+=AL}}else{var AO=AQ.autoscaleMargin;if(AO!=null){if(AQ.min==null){AM-=AP*AO;if(AM<0&&AN.datamin!=null&&AN.datamin>=0){AM=0}}if(AQ.max==null){AK+=AP*AO;if(AK>0&&AN.datamax!=null&&AN.datamax<=0){AK=0}}}}AN.min=AM;AN.max=AK}function F(AP,AS){var AO;if(typeof AS.ticks=="number"&&AS.ticks>0){AO=AS.ticks}else{if(AP==s.xaxis||AP==s.x2axis){AO=0.3*Math.sqrt(y)}else{AO=0.3*Math.sqrt(Q)}}var AX=(AP.max-AP.min)/AO,AZ,AT,AV,AW,AR,AM,AL;if(AS.mode=="time"){var AU={second:1000,minute:60*1000,hour:60*60*1000,day:24*60*60*1000,month:30*24*60*60*1000,year:365.2425*24*60*60*1000};var AY=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[0.25,"month"],[0.5,"month"],[1,"month"],[2,"month"],[3,"month"],[6,"month"],[1,"year"]];var AN=0;if(AS.minTickSize!=null){if(typeof AS.tickSize=="number"){AN=AS.tickSize}else{AN=AS.minTickSize[0]*AU[AS.minTickSize[1]]}}for(AR=0;AR=AN){break}}AZ=AY[AR][0];AV=AY[AR][1];if(AV=="year"){AM=Math.pow(10,Math.floor(Math.log(AX/AU.year)/Math.LN10));AL=(AX/AU.year)/AM;if(AL<1.5){AZ=1}else{if(AL<3){AZ=2}else{if(AL<7.5){AZ=5}else{AZ=10}}}AZ*=AM}if(AS.tickSize){AZ=AS.tickSize[0];AV=AS.tickSize[1]}AT=function(Ac){var Ah=[],Af=Ac.tickSize[0],Ai=Ac.tickSize[1],Ag=new Date(Ac.min);var Ab=Af*AU[Ai];if(Ai=="second"){Ag.setUTCSeconds(A(Ag.getUTCSeconds(),Af))}if(Ai=="minute"){Ag.setUTCMinutes(A(Ag.getUTCMinutes(),Af))}if(Ai=="hour"){Ag.setUTCHours(A(Ag.getUTCHours(),Af))}if(Ai=="month"){Ag.setUTCMonth(A(Ag.getUTCMonth(),Af))}if(Ai=="year"){Ag.setUTCFullYear(A(Ag.getUTCFullYear(),Af))}Ag.setUTCMilliseconds(0);if(Ab>=AU.minute){Ag.setUTCSeconds(0)}if(Ab>=AU.hour){Ag.setUTCMinutes(0)}if(Ab>=AU.day){Ag.setUTCHours(0)}if(Ab>=AU.day*4){Ag.setUTCDate(1)}if(Ab>=AU.year){Ag.setUTCMonth(0)}var Ak=0,Aj=Number.NaN,Ad;do{Ad=Aj;Aj=Ag.getTime();Ah.push({v:Aj,label:Ac.tickFormatter(Aj,Ac)});if(Ai=="month"){if(Af<1){Ag.setUTCDate(1);var Aa=Ag.getTime();Ag.setUTCMonth(Ag.getUTCMonth()+1);var Ae=Ag.getTime();Ag.setTime(Aj+Ak*AU.hour+(Ae-Aa)*Af);Ak=Ag.getUTCHours();Ag.setUTCHours(0)}else{Ag.setUTCMonth(Ag.getUTCMonth()+Af)}}else{if(Ai=="year"){Ag.setUTCFullYear(Ag.getUTCFullYear()+Af)}else{Ag.setTime(Aj+Ab)}}}while(AjAK){AQ=AK}AM=Math.pow(10,-AQ);AL=AX/AM;if(AL<1.5){AZ=1}else{if(AL<3){AZ=2;if(AL>2.25&&(AK==null||AQ+1<=AK)){AZ=2.5;++AQ}}else{if(AL<7.5){AZ=5}else{AZ=10}}}AZ*=AM;if(AS.minTickSize!=null&&AZ0){AO.ticks=AO.tickGenerator(AO)}}else{if(AQ.ticks){var AP=AQ.ticks;if(C.isFunction(AP)){AP=AP({min:AO.min,max:AO.max})}var AN,AK;for(AN=0;AN1){AL=AM[1]}}else{AK=AM}if(AL==null){AL=AO.tickFormatter(AK,AO)}AO.ticks[AN]={v:AK,label:AL}}}}}if(AQ.autoscaleMargin!=null&&AO.ticks.length>0){if(AQ.min==null){AO.min=Math.min(AO.min,AO.ticks[0].v)}if(AQ.max==null&&AO.ticks.length>1){AO.max=Math.max(AO.max,AO.ticks[AO.ticks.length-1].v)}}}function AH(){Y.clearRect(0,0,y,Q);var AL=g.grid;if(AL.show&&!AL.aboveData){S()}for(var AK=0;AKAP){return{from:AP,to:AQ,axis:AN}}return{from:AQ,to:AP,axis:AN}}function S(){var AO;Y.save();Y.translate(e.left,e.top);if(g.grid.backgroundColor){Y.fillStyle=R(g.grid.backgroundColor,t,0,"rgba(255, 255, 255, 0)");Y.fillRect(0,0,I,t)}var AL=g.grid.markings;if(AL){if(C.isFunction(AL)){AL=AL({xmin:s.xaxis.min,xmax:s.xaxis.max,ymin:s.yaxis.min,ymax:s.yaxis.max,xaxis:s.xaxis,yaxis:s.yaxis,x2axis:s.x2axis,y2axis:s.y2axis})}for(AO=0;AOAQ.axis.max||AN.toAN.axis.max){continue}AQ.from=Math.max(AQ.from,AQ.axis.min);AQ.to=Math.min(AQ.to,AQ.axis.max);AN.from=Math.max(AN.from,AN.axis.min);AN.to=Math.min(AN.to,AN.axis.max);if(AQ.from==AQ.to&&AN.from==AN.to){continue}AQ.from=AQ.axis.p2c(AQ.from);AQ.to=AQ.axis.p2c(AQ.to);AN.from=AN.axis.p2c(AN.from);AN.to=AN.axis.p2c(AN.to);if(AQ.from==AQ.to||AN.from==AN.to){Y.beginPath();Y.strokeStyle=AK.color||g.grid.markingsColor;Y.lineWidth=AK.lineWidth||g.grid.markingsLineWidth;Y.moveTo(AQ.from,AN.from);Y.lineTo(AQ.to,AN.to);Y.stroke()}else{Y.fillStyle=AK.color||g.grid.markingsColor;Y.fillRect(AQ.from,AN.to,AQ.to-AQ.from,AN.from-AN.to)}}}Y.lineWidth=1;Y.strokeStyle=g.grid.tickColor;Y.beginPath();var AM,AP=s.xaxis;for(AO=0;AO=s.xaxis.max){continue}Y.moveTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,0);Y.lineTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,t)}AP=s.yaxis;for(AO=0;AO=AP.max){continue}Y.moveTo(0,Math.floor(AP.p2c(AM))+Y.lineWidth/2);Y.lineTo(I,Math.floor(AP.p2c(AM))+Y.lineWidth/2)}AP=s.x2axis;for(AO=0;AO=AP.max){continue}Y.moveTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,-5);Y.lineTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,5)}AP=s.y2axis;for(AO=0;AO=AP.max){continue}Y.moveTo(I-5,Math.floor(AP.p2c(AM))+Y.lineWidth/2);Y.lineTo(I+5,Math.floor(AP.p2c(AM))+Y.lineWidth/2)}Y.stroke();if(g.grid.borderWidth){var AR=g.grid.borderWidth;Y.lineWidth=AR;Y.strokeStyle=g.grid.borderColor;Y.strokeRect(-AR/2,-AR/2,I+AR,t+AR)}Y.restore()}function h(){l.find(".tickLabels").remove();var AK=['
    '];function AM(AP,AQ){for(var AO=0;AOAP.max){continue}AK.push(AQ(AN,AP))}}var AL=g.grid.labelMargin+g.grid.borderWidth;AM(s.xaxis,function(AN,AO){return'
    '+AN.label+"
    "});AM(s.yaxis,function(AN,AO){return'
    '+AN.label+"
    "});AM(s.x2axis,function(AN,AO){return'
    '+AN.label+"
    "});AM(s.y2axis,function(AN,AO){return'
    '+AN.label+"
    "});AK.push("
    ");l.append(AK.join(""))}function AA(AK){if(AK.lines.show){a(AK)}if(AK.bars.show){n(AK)}if(AK.points.show){o(AK)}}function a(AN){function AM(AY,AZ,AR,Ad,Ac){var Ae=AY.points,AS=AY.pointsize,AW=null,AV=null;Y.beginPath();for(var AX=AS;AX=Aa&&Ab>Ac.max){if(Aa>Ac.max){continue}AU=(Ac.max-Ab)/(Aa-Ab)*(AT-AU)+AU;Ab=Ac.max}else{if(Aa>=Ab&&Aa>Ac.max){if(Ab>Ac.max){continue}AT=(Ac.max-Ab)/(Aa-Ab)*(AT-AU)+AU;Aa=Ac.max}}if(AU<=AT&&AU=AT&&AU>Ad.max){if(AT>Ad.max){continue}Ab=(Ad.max-AU)/(AT-AU)*(Aa-Ab)+Ab;AU=Ad.max}else{if(AT>=AU&&AT>Ad.max){if(AU>Ad.max){continue}Aa=(Ad.max-AU)/(AT-AU)*(Aa-Ab)+Ab;AT=Ad.max}}if(AU!=AW||Ab!=AV){Y.moveTo(Ad.p2c(AU)+AZ,Ac.p2c(Ab)+AR)}AW=AT;AV=Aa;Y.lineTo(Ad.p2c(AT)+AZ,Ac.p2c(Aa)+AR)}Y.stroke()}function AO(AX,Ae,Ac){var Af=AX.points,AR=AX.pointsize,AS=Math.min(Math.max(0,Ac.min),Ac.max),Aa,AV=0,Ad=false;for(var AW=AR;AW=AT&&AU>Ae.max){if(AT>Ae.max){continue}Ab=(Ae.max-AU)/(AT-AU)*(AZ-Ab)+Ab;AU=Ae.max}else{if(AT>=AU&&AT>Ae.max){if(AU>Ae.max){continue}AZ=(Ae.max-AU)/(AT-AU)*(AZ-Ab)+Ab;AT=Ae.max}}if(!Ad){Y.beginPath();Y.moveTo(Ae.p2c(AU),Ac.p2c(AS));Ad=true}if(Ab>=Ac.max&&AZ>=Ac.max){Y.lineTo(Ae.p2c(AU),Ac.p2c(Ac.max));Y.lineTo(Ae.p2c(AT),Ac.p2c(Ac.max));AV=AT;continue}else{if(Ab<=Ac.min&&AZ<=Ac.min){Y.lineTo(Ae.p2c(AU),Ac.p2c(Ac.min));Y.lineTo(Ae.p2c(AT),Ac.p2c(Ac.min));AV=AT;continue}}var Ag=AU,AY=AT;if(Ab<=AZ&&Ab=Ac.min){AU=(Ac.min-Ab)/(AZ-Ab)*(AT-AU)+AU;Ab=Ac.min}else{if(AZ<=Ab&&AZ=Ac.min){AT=(Ac.min-Ab)/(AZ-Ab)*(AT-AU)+AU;AZ=Ac.min}}if(Ab>=AZ&&Ab>Ac.max&&AZ<=Ac.max){AU=(Ac.max-Ab)/(AZ-Ab)*(AT-AU)+AU;Ab=Ac.max}else{if(AZ>=Ab&&AZ>Ac.max&&Ab<=Ac.max){AT=(Ac.max-Ab)/(AZ-Ab)*(AT-AU)+AU;AZ=Ac.max}}if(AU!=Ag){if(Ab<=Ac.min){Aa=Ac.min}else{Aa=Ac.max}Y.lineTo(Ae.p2c(Ag),Ac.p2c(Aa));Y.lineTo(Ae.p2c(AU),Ac.p2c(Aa))}Y.lineTo(Ae.p2c(AU),Ac.p2c(Ab));Y.lineTo(Ae.p2c(AT),Ac.p2c(AZ));if(AT!=AY){if(AZ<=Ac.min){Aa=Ac.min}else{Aa=Ac.max}Y.lineTo(Ae.p2c(AT),Ac.p2c(Aa));Y.lineTo(Ae.p2c(AY),Ac.p2c(Aa))}AV=Math.max(AT,AY)}if(Ad){Y.lineTo(Ae.p2c(AV),Ac.p2c(AS));Y.fill()}}Y.save();Y.translate(e.left,e.top);Y.lineJoin="round";var AP=AN.lines.lineWidth,AK=AN.shadowSize;if(AP>0&&AK>0){Y.lineWidth=AK;Y.strokeStyle="rgba(0,0,0,0.1)";var AQ=Math.PI/18;AM(AN.datapoints,Math.sin(AQ)*(AP/2+AK/2),Math.cos(AQ)*(AP/2+AK/2),AN.xaxis,AN.yaxis);Y.lineWidth=AK/2;AM(AN.datapoints,Math.sin(AQ)*(AP/2+AK/4),Math.cos(AQ)*(AP/2+AK/4),AN.xaxis,AN.yaxis)}Y.lineWidth=AP;Y.strokeStyle=AN.color;var AL=V(AN.lines,AN.color,0,t);if(AL){Y.fillStyle=AL;AO(AN.datapoints,AN.xaxis,AN.yaxis)}if(AP>0){AM(AN.datapoints,0,0,AN.xaxis,AN.yaxis)}Y.restore()}function o(AN){function AP(AU,AT,Ab,AR,AV,AZ,AY){var Aa=AU.points,AQ=AU.pointsize;for(var AS=0;ASAZ.max||AWAY.max){continue}Y.beginPath();Y.arc(AZ.p2c(AX),AY.p2c(AW)+AR,AT,0,AV,false);if(Ab){Y.fillStyle=Ab;Y.fill()}Y.stroke()}}Y.save();Y.translate(e.left,e.top);var AO=AN.lines.lineWidth,AL=AN.shadowSize,AK=AN.points.radius;if(AO>0&&AL>0){var AM=AL/2;Y.lineWidth=AM;Y.strokeStyle="rgba(0,0,0,0.1)";AP(AN.datapoints,AK,null,AM+AM/2,Math.PI,AN.xaxis,AN.yaxis);Y.strokeStyle="rgba(0,0,0,0.2)";AP(AN.datapoints,AK,null,AM/2,Math.PI,AN.xaxis,AN.yaxis)}Y.lineWidth=AO;Y.strokeStyle=AN.color;AP(AN.datapoints,AK,V(AN.points,AN.color),0,2*Math.PI,AN.xaxis,AN.yaxis);Y.restore()}function AB(AV,AU,Ad,AQ,AY,AN,AL,AT,AS,Ac,AZ){var AM,Ab,AR,AX,AO,AK,AW,AP,Aa;if(AZ){AP=AK=AW=true;AO=false;AM=Ad;Ab=AV;AX=AU+AQ;AR=AU+AY;if(AbAT.max||AXAS.max){return }if(AMAT.max){Ab=AT.max;AK=false}if(ARAS.max){AX=AS.max;AW=false}AM=AT.p2c(AM);AR=AS.p2c(AR);Ab=AT.p2c(Ab);AX=AS.p2c(AX);if(AL){Ac.beginPath();Ac.moveTo(AM,AR);Ac.lineTo(AM,AX);Ac.lineTo(Ab,AX);Ac.lineTo(Ab,AR);Ac.fillStyle=AL(AR,AX);Ac.fill()}if(AO||AK||AW||AP){Ac.beginPath();Ac.moveTo(AM,AR+AN);if(AO){Ac.lineTo(AM,AX+AN)}else{Ac.moveTo(AM,AX+AN)}if(AW){Ac.lineTo(Ab,AX+AN)}else{Ac.moveTo(Ab,AX+AN)}if(AK){Ac.lineTo(Ab,AR+AN)}else{Ac.moveTo(Ab,AR+AN)}if(AP){Ac.lineTo(AM,AR+AN)}else{Ac.moveTo(AM,AR+AN)}Ac.stroke()}}function n(AM){function AL(AS,AR,AU,AP,AT,AW,AV){var AX=AS.points,AO=AS.pointsize;for(var AQ=0;AQ")}AP.push("");AN=true}if(AV){AR=AV(AR,AU)}AP.push('
    '+AR+"")}if(AN){AP.push("")}if(AP.length==0){return }var AT=''+AP.join("")+"
    ";if(g.legend.container!=null){C(g.legend.container).html(AT)}else{var AQ="",AL=g.legend.position,AM=g.legend.margin;if(AM[0]==null){AM=[AM,AM]}if(AL.charAt(0)=="n"){AQ+="top:"+(AM[1]+e.top)+"px;"}else{if(AL.charAt(0)=="s"){AQ+="bottom:"+(AM[1]+e.bottom)+"px;"}}if(AL.charAt(1)=="e"){AQ+="right:"+(AM[0]+e.right)+"px;"}else{if(AL.charAt(1)=="w"){AQ+="left:"+(AM[0]+e.left)+"px;"}}var AS=C('
    '+AT.replace('style="','style="position:absolute;'+AQ+";")+"
    ").appendTo(l);if(g.legend.backgroundOpacity!=0){var AO=g.legend.backgroundColor;if(AO==null){AO=g.grid.backgroundColor;if(AO&&typeof AO=="string"){AO=C.color.parse(AO)}else{AO=C.color.extract(AS,"background-color")}AO.a=1;AO=AO.toString()}var AK=AS.children();C('
    ').prependTo(AS).css("opacity",g.legend.backgroundOpacity)}}}var w=[],J=null;function AF(AR,AP,AM){var AX=g.grid.mouseActiveRadius,Aj=AX*AX+1,Ah=null,Aa=false,Af,Ad;for(Af=0;AfAL||AT-AZ<-AL||AS-AW>AK||AS-AW<-AK){continue}var AV=Math.abs(AQ.p2c(AT)-AR),AU=Math.abs(AO.p2c(AS)-AP),Ab=AV*AV+AU*AU;if(Ab<=Aj){Aj=Ab;Ah=[Af,Ad/Ac]}}}if(AY.bars.show&&!Ah){var AN=AY.bars.align=="left"?0:-AY.bars.barWidth/2,Ag=AN+AY.bars.barWidth;for(Ad=0;Ad=Math.min(Ai,AT)&&AW>=AS+AN&&AW<=AS+Ag):(AZ>=AT+AN&&AZ<=AT+Ag&&AW>=Math.min(Ai,AS)&&AW<=Math.max(Ai,AS))){Ah=[Af,Ad/Ac]}}}}if(Ah){Af=Ah[0];Ad=Ah[1];Ac=O[Af].datapoints.pointsize;return{datapoint:O[Af].datapoints.points.slice(Ad*Ac,(Ad+1)*Ac),dataIndex:Ad,series:O[Af],seriesIndex:Af}}return null}function D(AK){if(g.grid.hoverable){H("plothover",AK,function(AL){return AL.hoverable!=false})}}function d(AK){H("plotclick",AK,function(AL){return AL.clickable!=false})}function H(AL,AK,AM){var AN=AD.offset(),AS={pageX:AK.pageX,pageY:AK.pageY},AQ=AK.pageX-AN.left-e.left,AO=AK.pageY-AN.top-e.top;if(s.xaxis.used){AS.x=s.xaxis.c2p(AQ)}if(s.yaxis.used){AS.y=s.yaxis.c2p(AO)}if(s.x2axis.used){AS.x2=s.x2axis.c2p(AQ)}if(s.y2axis.used){AS.y2=s.y2axis.c2p(AO)}var AT=AF(AQ,AO,AM);if(AT){AT.pageX=parseInt(AT.series.xaxis.p2c(AT.datapoint[0])+AN.left+e.left);AT.pageY=parseInt(AT.series.yaxis.p2c(AT.datapoint[1])+AN.top+e.top)}if(g.grid.autoHighlight){for(var AP=0;APAQ.max||ARAP.max){return }var AO=AN.points.radius+AN.points.lineWidth/2;AJ.lineWidth=AO;AJ.strokeStyle=C.color.parse(AN.color).scale("a",0.5).toString();var AK=1.5*AO;AJ.beginPath();AJ.arc(AQ.p2c(AL),AP.p2c(AR),AK,0,2*Math.PI,false);AJ.stroke()}function z(AN,AK){AJ.lineWidth=AN.bars.lineWidth;AJ.strokeStyle=C.color.parse(AN.color).scale("a",0.5).toString();var AM=C.color.parse(AN.color).scale("a",0.5).toString();var AL=AN.bars.align=="left"?0:-AN.bars.barWidth/2;AB(AK[0],AK[1],AK[2]||0,AL,AL+AN.bars.barWidth,0,function(){return AM},AN.xaxis,AN.yaxis,AJ,AN.bars.horizontal)}function R(AM,AL,AQ,AO){if(typeof AM=="string"){return AM}else{var AP=Y.createLinearGradient(0,AQ,0,AL);for(var AN=0,AK=AM.colors.length;AN12){K=K-12}else{if(K==0){K=12}}}for(var F=0;F1) - options.series.pie.tilt=1; - if (options.series.pie.tilt<0) - options.series.pie.tilt=0; - - // add processData hook to do transformations on the data - plot.hooks.processDatapoints.push(processDatapoints); - plot.hooks.drawOverlay.push(drawOverlay); - - // add draw hook - plot.hooks.draw.push(draw); - } - } - - // bind hoverable events - function bindEvents(plot, eventHolder) - { - var options = plot.getOptions(); - - if (options.series.pie.show && options.grid.hoverable) - eventHolder.unbind('mousemove').mousemove(onMouseMove); - - if (options.series.pie.show && options.grid.clickable) - eventHolder.unbind('click').click(onClick); - } - - - // debugging function that prints out an object - function alertObject(obj) - { - var msg = ''; - function traverse(obj, depth) - { - if (!depth) - depth = 0; - for (var i = 0; i < obj.length; ++i) - { - for (var j=0; jcanvas.width-maxRadius) - centerLeft = canvas.width-maxRadius; - } - - function fixData(data) - { - for (var i = 0; i < data.length; ++i) - { - if (typeof(data[i].data)=='number') - data[i].data = [[1,data[i].data]]; - else if (typeof(data[i].data)=='undefined' || typeof(data[i].data[0])=='undefined') - { - if (typeof(data[i].data)!='undefined' && typeof(data[i].data.label)!='undefined') - data[i].label = data[i].data.label; // fix weirdness coming from flot - data[i].data = [[1,0]]; - - } - } - return data; - } - - function combine(data) - { - data = fixData(data); - calcTotal(data); - var combined = 0; - var numCombined = 0; - var color = options.series.pie.combine.color; - - var newdata = []; - for (var i = 0; i < data.length; ++i) - { - // make sure its a number - data[i].data[0][1] = parseFloat(data[i].data[0][1]); - if (!data[i].data[0][1]) - data[i].data[0][1] = 0; - - if (data[i].data[0][1]/total<=options.series.pie.combine.threshold) - { - combined += data[i].data[0][1]; - numCombined++; - if (!color) - color = data[i].color; - } - else - { - newdata.push({ - data: [[1,data[i].data[0][1]]], - color: data[i].color, - label: data[i].label, - angle: (data[i].data[0][1]*(Math.PI*2))/total, - percent: (data[i].data[0][1]/total*100) - }); - } - } - if (numCombined>0) - newdata.push({ - data: [[1,combined]], - color: color, - label: options.series.pie.combine.label, - angle: (combined*(Math.PI*2))/total, - percent: (combined/total*100) - }); - return newdata; - } - - function draw(plot, newCtx) - { - if (!target) return; // if no series were passed - ctx = newCtx; - - setupPie(); - var slices = plot.getData(); - - var attempts = 0; - while (redraw && attempts0) - maxRadius *= shrink; - attempts += 1; - clear(); - if (options.series.pie.tilt<=0.8) - drawShadow(); - drawPie(); - } - if (attempts >= redrawAttempts) { - clear(); - target.prepend('
    Could not draw pie with labels contained inside canvas
    '); - } - - if ( plot.setSeries && plot.insertLegend ) - { - plot.setSeries(slices); - plot.insertLegend(); - } - - // we're actually done at this point, just defining internal functions at this point - - function clear() - { - ctx.clearRect(0,0,canvas.width,canvas.height); - target.children().filter('.pieLabel, .pieLabelBackground').remove(); - } - - function drawShadow() - { - var shadowLeft = 5; - var shadowTop = 15; - var edge = 10; - var alpha = 0.02; - - // set radius - if (options.series.pie.radius>1) - var radius = options.series.pie.radius; - else - var radius = maxRadius * options.series.pie.radius; - - if (radius>=(canvas.width/2)-shadowLeft || radius*options.series.pie.tilt>=(canvas.height/2)-shadowTop || radius<=edge) - return; // shadow would be outside canvas, so don't draw it - - ctx.save(); - ctx.translate(shadowLeft,shadowTop); - ctx.globalAlpha = alpha; - ctx.fillStyle = '#000'; - - // center and rotate to starting position - ctx.translate(centerLeft,centerTop); - ctx.scale(1, options.series.pie.tilt); - - //radius -= edge; - for (var i=1; i<=edge; i++) - { - ctx.beginPath(); - ctx.arc(0,0,radius,0,Math.PI*2,false); - ctx.fill(); - radius -= i; - } - - ctx.restore(); - } - - function drawPie() - { - startAngle = Math.PI*options.series.pie.startAngle; - - // set radius - if (options.series.pie.radius>1) - var radius = options.series.pie.radius; - else - var radius = maxRadius * options.series.pie.radius; - - // center and rotate to starting position - ctx.save(); - ctx.translate(centerLeft,centerTop); - ctx.scale(1, options.series.pie.tilt); - //ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera - - // draw slices - ctx.save(); - var currentAngle = startAngle; - for (var i = 0; i < slices.length; ++i) - { - slices[i].startAngle = currentAngle; - drawSlice(slices[i].angle, slices[i].color, true); - } - ctx.restore(); - - // draw slice outlines - ctx.save(); - ctx.lineWidth = options.series.pie.stroke.width; - currentAngle = startAngle; - for (var i = 0; i < slices.length; ++i) - drawSlice(slices[i].angle, options.series.pie.stroke.color, false); - ctx.restore(); - - // draw donut hole - drawDonutHole(ctx); - - // draw labels - if (options.series.pie.label.show) - drawLabels(); - - // restore to original state - ctx.restore(); - - function drawSlice(angle, color, fill) - { - if (angle<=0) - return; - - if (fill) - ctx.fillStyle = color; - else - { - ctx.strokeStyle = color; - ctx.lineJoin = 'round'; - } - - ctx.beginPath(); - if (Math.abs(angle - Math.PI*2) > 0.000000001) - ctx.moveTo(0,0); // Center of the pie - else if ($.browser.msie) - angle -= 0.0001; - //ctx.arc(0,0,radius,0,angle,false); // This doesn't work properly in Opera - ctx.arc(0,0,radius,currentAngle,currentAngle+angle,false); - ctx.closePath(); - //ctx.rotate(angle); // This doesn't work properly in Opera - currentAngle += angle; - - if (fill) - ctx.fill(); - else - ctx.stroke(); - } - - function drawLabels() - { - var currentAngle = startAngle; - - // set radius - if (options.series.pie.label.radius>1) - var radius = options.series.pie.label.radius; - else - var radius = maxRadius * options.series.pie.label.radius; - - for (var i = 0; i < slices.length; ++i) - { - if (slices[i].percent >= options.series.pie.label.threshold*100) - drawLabel(slices[i], currentAngle, i); - currentAngle += slices[i].angle; - } - - function drawLabel(slice, startAngle, index) - { - if (slice.data[0][1]==0) - return; - - // format label text - var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter; - if (lf) - text = lf(slice.label, slice); - else - text = slice.label; - if (plf) - text = plf(text, slice); - - var halfAngle = ((startAngle+slice.angle) + startAngle)/2; - var x = centerLeft + Math.round(Math.cos(halfAngle) * radius); - var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt; - - var html = '' + text + ""; - target.append(html); - var label = target.children('#pieLabel'+index); - var labelTop = (y - label.height()/2); - var labelLeft = (x - label.width()/2); - label.css('top', labelTop); - label.css('left', labelLeft); - - // check to make sure that the label is not outside the canvas - if (0-labelTop>0 || 0-labelLeft>0 || canvas.height-(labelTop+label.height())<0 || canvas.width-(labelLeft+label.width())<0) - redraw = true; - - if (options.series.pie.label.background.opacity != 0) { - // put in the transparent background separately to avoid blended labels and label boxes - var c = options.series.pie.label.background.color; - if (c == null) { - c = slice.color; - } - var pos = 'top:'+labelTop+'px;left:'+labelLeft+'px;'; - $('
    ').insertBefore(label).css('opacity', options.series.pie.label.background.opacity); - } - } // end individual label function - } // end drawLabels function - } // end drawPie function - } // end draw function - - // Placed here because it needs to be accessed from multiple locations - function drawDonutHole(layer) - { - // draw donut hole - if(options.series.pie.innerRadius > 0) - { - // subtract the center - layer.save(); - innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius; - layer.globalCompositeOperation = 'destination-out'; // this does not work with excanvas, but it will fall back to using the stroke color - layer.beginPath(); - layer.fillStyle = options.series.pie.stroke.color; - layer.arc(0,0,innerRadius,0,Math.PI*2,false); - layer.fill(); - layer.closePath(); - layer.restore(); - - // add inner stroke - layer.save(); - layer.beginPath(); - layer.strokeStyle = options.series.pie.stroke.color; - layer.arc(0,0,innerRadius,0,Math.PI*2,false); - layer.stroke(); - layer.closePath(); - layer.restore(); - // TODO: add extra shadow inside hole (with a mask) if the pie is tilted. - } - } - - //-- Additional Interactive related functions -- - - function isPointInPoly(poly, pt) - { - for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) - ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1])) - && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]) - && (c = !c); - return c; - } - - function findNearbySlice(mouseX, mouseY) - { - var slices = plot.getData(), - options = plot.getOptions(), - radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; - - for (var i = 0; i < slices.length; ++i) - { - var s = slices[i]; - - if(s.pie.show) - { - ctx.save(); - ctx.beginPath(); - ctx.moveTo(0,0); // Center of the pie - //ctx.scale(1, options.series.pie.tilt); // this actually seems to break everything when here. - ctx.arc(0,0,radius,s.startAngle,s.startAngle+s.angle,false); - ctx.closePath(); - x = mouseX-centerLeft; - y = mouseY-centerTop; - if(ctx.isPointInPath) - { - if (ctx.isPointInPath(mouseX-centerLeft, mouseY-centerTop)) - { - //alert('found slice!'); - ctx.restore(); - return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; - } - } - else - { - // excanvas for IE doesn;t support isPointInPath, this is a workaround. - p1X = (radius * Math.cos(s.startAngle)); - p1Y = (radius * Math.sin(s.startAngle)); - p2X = (radius * Math.cos(s.startAngle+(s.angle/4))); - p2Y = (radius * Math.sin(s.startAngle+(s.angle/4))); - p3X = (radius * Math.cos(s.startAngle+(s.angle/2))); - p3Y = (radius * Math.sin(s.startAngle+(s.angle/2))); - p4X = (radius * Math.cos(s.startAngle+(s.angle/1.5))); - p4Y = (radius * Math.sin(s.startAngle+(s.angle/1.5))); - p5X = (radius * Math.cos(s.startAngle+s.angle)); - p5Y = (radius * Math.sin(s.startAngle+s.angle)); - arrPoly = [[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,p5Y]]; - arrPoint = [x,y]; - // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt? - if(isPointInPoly(arrPoly, arrPoint)) - { - ctx.restore(); - return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; - } - } - ctx.restore(); - } - } - - return null; - } - - function onMouseMove(e) - { - triggerClickHoverEvent('plothover', e); - } - - function onClick(e) - { - triggerClickHoverEvent('plotclick', e); - } - - // trigger click or hover event (they send the same parameters so we share their code) - function triggerClickHoverEvent(eventname, e) - { - var offset = plot.offset(), - canvasX = parseInt(e.pageX - offset.left), - canvasY = parseInt(e.pageY - offset.top), - item = findNearbySlice(canvasX, canvasY); - - if (options.grid.autoHighlight) - { - // clear auto-highlights - for (var i = 0; i < highlights.length; ++i) - { - var h = highlights[i]; - if (h.auto == eventname && !(item && h.series == item.series)) - unhighlight(h.series); - } - } - - // highlight the slice - if (item) - highlight(item.series, eventname); - - // trigger any hover bind events - var pos = { pageX: e.pageX, pageY: e.pageY }; - target.trigger(eventname, [ pos, item ]); - } - - function highlight(s, auto) - { - if (typeof s == "number") - s = series[s]; - - var i = indexOfHighlight(s); - if (i == -1) - { - highlights.push({ series: s, auto: auto }); - plot.triggerRedrawOverlay(); - } - else if (!auto) - highlights[i].auto = false; - } - - function unhighlight(s) - { - if (s == null) - { - highlights = []; - plot.triggerRedrawOverlay(); - } - - if (typeof s == "number") - s = series[s]; - - var i = indexOfHighlight(s); - if (i != -1) - { - highlights.splice(i, 1); - plot.triggerRedrawOverlay(); - } - } - - function indexOfHighlight(s) - { - for (var i = 0; i < highlights.length; ++i) - { - var h = highlights[i]; - if (h.series == s) - return i; - } - return -1; - } - - function drawOverlay(plot, octx) - { - //alert(options.series.pie.radius); - var options = plot.getOptions(); - //alert(options.series.pie.radius); - - var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; - - octx.save(); - octx.translate(centerLeft, centerTop); - octx.scale(1, options.series.pie.tilt); - - for (i = 0; i < highlights.length; ++i) - drawHighlight(highlights[i].series); - - drawDonutHole(octx); - - octx.restore(); - - function drawHighlight(series) - { - if (series.angle < 0) return; - - //octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString(); - octx.fillStyle = "rgba(255, 255, 255, "+options.series.pie.highlight.opacity+")"; // this is temporary until we have access to parseColor - - octx.beginPath(); - if (Math.abs(series.angle - Math.PI*2) > 0.000000001) - octx.moveTo(0,0); // Center of the pie - octx.arc(0,0,radius,series.startAngle,series.startAngle+series.angle,false); - octx.closePath(); - octx.fill(); - } - - } - - } // end init (plugin body) - - // define pie specific options and their default values - var options = { - series: { - pie: { - show: false, - radius: 'auto', // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value) - innerRadius:0, /* for donut */ - startAngle: 3/2, - tilt: 1, - offset: { - top: 0, - left: 'auto' - }, - stroke: { - color: '#FFF', - width: 1 - }, - label: { - show: 'auto', - formatter: function(label, slice){ - return '
    '+label+'
    '+Math.round(slice.percent)+'%
    '; - }, // formatter function - radius: 1, // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value) - background: { - color: null, - opacity: 0 - }, - threshold: 0 // percentage at which to hide the label (i.e. the slice is too narrow) - }, - combine: { - threshold: -1, // percentage at which to combine little slices into one larger slice - color: null, // color to give the new slice (auto-generated if null) - label: 'Other' // label to give the new slice - }, - highlight: { - //color: '#FFF', // will add this functionality once parseColor is available - opacity: 0.5 - } - } - } - }; - - $.plot.plugins.push({ - init: init, - options: options, - name: "pie", - version: "1.0" - }); -})(jQuery); diff --git a/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.flot.stack.js b/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.flot.stack.js deleted file mode 100644 index a31d5dc..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.flot.stack.js +++ /dev/null @@ -1,184 +0,0 @@ -/* -Flot plugin for stacking data sets, i.e. putting them on top of each -other, for accumulative graphs. - -The plugin assumes the data is sorted on x (or y if stacking -horizontally). For line charts, it is assumed that if a line has an -undefined gap (from a null point), then the line above it should have -the same gap - insert zeros instead of "null" if you want another -behaviour. This also holds for the start and end of the chart. Note -that stacking a mix of positive and negative values in most instances -doesn't make sense (so it looks weird). - -Two or more series are stacked when their "stack" attribute is set to -the same key (which can be any number or string or just "true"). To -specify the default stack, you can set - - series: { - stack: null or true or key (number/string) - } - -or specify it for a specific series - - $.plot($("#placeholder"), [{ data: [ ... ], stack: true }]) - -The stacking order is determined by the order of the data series in -the array (later series end up on top of the previous). - -Internally, the plugin modifies the datapoints in each series, adding -an offset to the y value. For line series, extra data points are -inserted through interpolation. If there's a second y value, it's also -adjusted (e.g for bar charts or filled areas). -*/ - -(function ($) { - var options = { - series: { stack: null } // or number/string - }; - - function init(plot) { - function findMatchingSeries(s, allseries) { - var res = null - for (var i = 0; i < allseries.length; ++i) { - if (s == allseries[i]) - break; - - if (allseries[i].stack == s.stack) - res = allseries[i]; - } - - return res; - } - - function stackData(plot, s, datapoints) { - if (s.stack == null) - return; - - var other = findMatchingSeries(s, plot.getData()); - if (!other) - return; - - var ps = datapoints.pointsize, - points = datapoints.points, - otherps = other.datapoints.pointsize, - otherpoints = other.datapoints.points, - newpoints = [], - px, py, intery, qx, qy, bottom, - withlines = s.lines.show, - horizontal = s.bars.horizontal, - withbottom = ps > 2 && (horizontal ? datapoints.format[2].x : datapoints.format[2].y), - withsteps = withlines && s.lines.steps, - fromgap = true, - keyOffset = horizontal ? 1 : 0, - accumulateOffset = horizontal ? 0 : 1, - i = 0, j = 0, l; - - while (true) { - if (i >= points.length) - break; - - l = newpoints.length; - - if (points[i] == null) { - // copy gaps - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - i += ps; - } - else if (j >= otherpoints.length) { - // for lines, we can't use the rest of the points - if (!withlines) { - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - } - i += ps; - } - else if (otherpoints[j] == null) { - // oops, got a gap - for (m = 0; m < ps; ++m) - newpoints.push(null); - fromgap = true; - j += otherps; - } - else { - // cases where we actually got two points - px = points[i + keyOffset]; - py = points[i + accumulateOffset]; - qx = otherpoints[j + keyOffset]; - qy = otherpoints[j + accumulateOffset]; - bottom = 0; - - if (px == qx) { - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - - newpoints[l + accumulateOffset] += qy; - bottom = qy; - - i += ps; - j += otherps; - } - else if (px > qx) { - // we got past point below, might need to - // insert interpolated extra point - if (withlines && i > 0 && points[i - ps] != null) { - intery = py + (points[i - ps + accumulateOffset] - py) * (qx - px) / (points[i - ps + keyOffset] - px); - newpoints.push(qx); - newpoints.push(intery + qy); - for (m = 2; m < ps; ++m) - newpoints.push(points[i + m]); - bottom = qy; - } - - j += otherps; - } - else { // px < qx - if (fromgap && withlines) { - // if we come from a gap, we just skip this point - i += ps; - continue; - } - - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - - // we might be able to interpolate a point below, - // this can give us a better y - if (withlines && j > 0 && otherpoints[j - otherps] != null) - bottom = qy + (otherpoints[j - otherps + accumulateOffset] - qy) * (px - qx) / (otherpoints[j - otherps + keyOffset] - qx); - - newpoints[l + accumulateOffset] += bottom; - - i += ps; - } - - fromgap = false; - - if (l != newpoints.length && withbottom) - newpoints[l + 2] += bottom; - } - - // maintain the line steps invariant - if (withsteps && l != newpoints.length && l > 0 - && newpoints[l] != null - && newpoints[l] != newpoints[l - ps] - && newpoints[l + 1] != newpoints[l - ps + 1]) { - for (m = 0; m < ps; ++m) - newpoints[l + ps + m] = newpoints[l + m]; - newpoints[l + 1] = newpoints[l - ps + 1]; - } - } - - datapoints.points = newpoints; - } - - plot.hooks.processDatapoints.push(stackData); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'stack', - version: '1.2' - }); -})(jQuery); diff --git a/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.flot.threshold.multiple.js b/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.flot.threshold.multiple.js deleted file mode 100755 index d00390e..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.flot.threshold.multiple.js +++ /dev/null @@ -1,191 +0,0 @@ -/* -Flot plugin for specifying range of thresolds on data. -Controlled through the option "constraints" in a specific series - -usage - - $.plot($("#placeholder"), [{ data: [ ... ], constraints: [constraint1, constraint2]},{data:[...],constraints:[...]}]) - - where constraint1 = { - threshold: 2, - color: "rgb(0,0,0)", - evaluate : function(y,threshold){ return y < threshold; } - } - threshold -> y-limit on the plot. - evaluate -> the function which defines the limit.This function defines wheteher y < threshold or y > threshold. - color -> the color with which to plot portion of the graph which satisfies the limit condition. - - - -Internally, the plugin works by splitting the data into different series, one for each constraint. - -*/ -(function($){ - - function testing(){ - return "working"; - } - function init(plot){ - - function plotWithMultipleThresholds(plot,s,datapoints){ - if(s.data && s.data.length > 0 && s.constraints && s.constraints.length>0){ - var series = new Graph(s.data,s.constraints).getPlotData(); - for(var i=0;i= 0 ; i--) { - var constraint = this._constraints[i]; - if(null != constraint.threshold){ - var set = new Resolve(this._dataset).using(constraint.threshold, constraint.evaluate); - this._plotData.push( { - data : set, - color : constraint.color - }); - } - } - return this._plotData; - }; - - function Resolve(originalPonits) { - this._originalPoints = originalPonits; - this._data = []; - this._getPointOnThreshold = _getPointOnThreshold; - this.using = using ; - - function using(threshold, evaluate) { - var count = 0; - for ( var i = 0; i < this._originalPoints.length; i++) { - var currentPoint = this._originalPoints[i]; - if (evaluate(currentPoint[1],threshold)) { - if (i > 0 - && (this._data.length == 0 || this._data[count - 1] == null)) { - this._data[count++] = this._getPointOnThreshold(threshold,this._originalPoints[i - 1], currentPoint); - } - this._data[count++] = currentPoint; - } else { - if (this._data.length > 0 && this._data[count - 1] != null) { - this._data[count++] = this._getPointOnThreshold(threshold,this._originalPoints[i - 1], currentPoint); - this._data[count++] = null; - this._data[count++] = null; - } - } - } - return this._data; - } - - function _getPointOnThreshold(threshold, prevP, currP) { - var currentX = currP[0]; - var currentY = currP[1]; - - var prevX = prevP[0]; - var prevY = prevP[1]; - - var slope = (threshold - currentY) - / (prevY - currentY); - var xOnConstraintLine = slope * (prevX - currentX) + currentX; - - return [ xOnConstraintLine, threshold ]; - } - } - - function _getSortedConstraints(originalpoints,constraints){ - - var dataRange = _findMaxAndMin(originalpoints); - - if(undefined == dataRange)return []; - - var max = dataRange.max; - var min = dataRange.min; - var thresholdRanges = []; - var sortedConstraints = []; - for(var i = 0; i < constraints.length ; i++){ - var constraint = constraints[i]; - var range = 0; - if(constraint.evaluate(min,constraint.threshold)){ - range = Math.abs(constraint.threshold - min); - }else{ - range = Math.abs(max - constraint.threshold); - } - thresholdRanges.push({constraint:constraint,range:range}); - } - QuickSort(thresholdRanges,function(obj1,obj2){ return obj1.range < obj2.range;}); - for(var i=thresholdRanges.length-1;i>=0;i--){ - sortedConstraints[i] = thresholdRanges[i].constraint; - } - return sortedConstraints; - } - - function _findMaxAndMin(dataset){ - if(undefined == dataset)return undefined; - var arr = []; - for( var i=0;i left){ - var pivotIndex = Math.floor(( left + right )/2); - var pivotNewIndex = partition(array,left,right,pivotIndex,comparator); - sort(array, left, pivotNewIndex - 1,comparator); - sort(array, pivotNewIndex + 1, right,comparator); - - } - } - - function partition(array,left,right,pivotIndex,comparator){ - var pivot = array[pivotIndex]; - swap(array,pivotIndex,right); - var storeIndex = left; - for( var i= left ; i < right ; i++){ - if(comparator(array[i] , pivot)){ - swap(array,i,storeIndex); - storeIndex = storeIndex + 1; - } - } - swap(array,storeIndex,right); - - return storeIndex; - } - - function swap(array,index1,index2){ - var temp = array[index1]; - array[index1] = array[index2]; - array[index2] = temp; - } - } - - - plot.hooks.processRawData.push(plotWithMultipleThresholds); - } - -$.plot.plugins.push({ - init: init, - name: 'multiple.threshold', - version: '1.0' - }); -})(jQuery); - - diff --git a/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.flot.valuelabels.js b/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.flot.valuelabels.js deleted file mode 100644 index 9a47e60..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.flot.valuelabels.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Value Labels Plugin for flot. - * http://leonardoeloy.github.com/flot-valuelabels - * http://wiki.github.com/leonardoeloy/flot-valuelabels/ - * - * Using canvas.fillText instead of divs, which is better for printing - by Leonardo Eloy, March 2010. - * Tested with Flot 0.6 and JQuery 1.3.2. - * - * Original homepage: http://sites.google.com/site/petrsstuff/projects/flotvallab - * Released under the MIT license by Petr Blahos, December 2009. - */ -(function ($) { - var options = { - valueLabels: { - show: false, - showAsHtml: false, // Set to true if you wanna switch back to DIV usage (you need plot.css for this) - showLastValue: false // Use this to show the label only for the last value in the series - } - }; - - function init(plot) { - plot.hooks.draw.push(function (plot, ctx) { - if (!plot.getOptions().valueLabels.show) return; - - var showLastValue = plot.getOptions().valueLabels.showLastValue; - var showAsHtml = plot.getOptions().valueLabels.showAsHtml; - var ctx = plot.getCanvas().getContext("2d"); - $.each(plot.getData(), function(ii, series) { - // Workaround, since Flot doesn't set this value anymore - series.seriesIndex = ii; - if (showAsHtml) plot.getPlaceholder().find("#valueLabels"+ii).remove(); - var html = '
    '; - - var last_val = null; - var last_x = -1000; - var last_y = -1000; - for (var i = 0; i < series.data.length; ++i) { - if (series.data[i] == null || (showLastValue && i != series.data.length-1)) continue; - - var x = series.data[i][0], y = series.data[i][1]; - if (x < series.xaxis.min || x > series.xaxis.max || y < series.yaxis.min || y > series.yaxis.max) continue; - var val = y; - - if (series.valueLabelFunc) val = series.valueLabelFunc({ series: series, seriesIndex: ii, index: i }); - val = ""+val; - - if (val!=last_val || i==series.data.length-1) { - var xx = series.xaxis.p2c(x)+plot.getPlotOffset().left; - var yy = series.yaxis.p2c(y)-12+plot.getPlotOffset().top; - if (Math.abs(yy-last_y)>20 || last_x= plot.width()) x_pos = plot.width(); - - ctx.fillText(val, x_pos, y_pos); - } else { - var head = '
    ' + val + '
    '; - html+= head + "Light" + tail + head + tail; - } - } - } - } - - if (showAsHtml) { - html+= "
    "; - plot.getPlaceholder().append(html); - } - }); - }); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'valueLabels', - version: '1.1' - }); -})(jQuery); - diff --git a/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.min.js b/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.min.js deleted file mode 100755 index 48590ec..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/public/jflot/jquery.min.js +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Jun 30 14:16:56 2011 -0400 - */ -(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
    a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
    ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. -shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j -)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
    ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/Govt-Billing-React-Ad-Subscriptions/public/manifest.json b/Govt-Billing-React-Ad-Subscriptions/public/manifest.json deleted file mode 100644 index 5c88086..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/public/manifest.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "short_name": "Ionic App", - "name": "My Ionic App", - "icons": [ - { - "src": "pwa-64x64.png", - "sizes": "64x64", - "type": "image/png" - }, - { - "src": "pwa-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "pwa-512x512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "any" - }, - { - "src": "maskable-icon-512x512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#ffffff", - "background_color": "#ffffff" -} diff --git a/Govt-Billing-React-Ad-Subscriptions/public/maskable-icon-512x512.png b/Govt-Billing-React-Ad-Subscriptions/public/maskable-icon-512x512.png deleted file mode 100644 index 1507b2a..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/public/maskable-icon-512x512.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/public/pwa-192x192.png b/Govt-Billing-React-Ad-Subscriptions/public/pwa-192x192.png deleted file mode 100644 index 2e3480d..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/public/pwa-192x192.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/public/pwa-512x512.png b/Govt-Billing-React-Ad-Subscriptions/public/pwa-512x512.png deleted file mode 100644 index c766843..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/public/pwa-512x512.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/public/pwa-64x64.png b/Govt-Billing-React-Ad-Subscriptions/public/pwa-64x64.png deleted file mode 100644 index dd40861..0000000 Binary files a/Govt-Billing-React-Ad-Subscriptions/public/pwa-64x64.png and /dev/null differ diff --git a/Govt-Billing-React-Ad-Subscriptions/pwa-assets.config.ts b/Govt-Billing-React-Ad-Subscriptions/pwa-assets.config.ts deleted file mode 100644 index 96d9800..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/pwa-assets.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { - defineConfig, - minimal2023Preset, -} from "@vite-pwa/assets-generator/config"; - -export default defineConfig({ - preset: minimal2023Preset, - images: ["public/favicon.png"], -}); diff --git a/Govt-Billing-React-Ad-Subscriptions/src/App.tsx b/Govt-Billing-React-Ad-Subscriptions/src/App.tsx deleted file mode 100644 index 51f5951..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/App.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { IonApp, setupIonicReact } from "@ionic/react"; -import Home from "./pages/Home"; - -/* Core CSS required for Ionic components to work properly */ -import "@ionic/react/css/core.css"; - -/* Basic CSS for apps built with Ionic */ -import "@ionic/react/css/normalize.css"; -import "@ionic/react/css/structure.css"; -import "@ionic/react/css/typography.css"; - -/* Optional CSS utils that can be commented out */ -import "@ionic/react/css/padding.css"; -import "@ionic/react/css/float-elements.css"; -import "@ionic/react/css/text-alignment.css"; -import "@ionic/react/css/text-transformation.css"; -import "@ionic/react/css/flex-utils.css"; -import "@ionic/react/css/display.css"; - -/* Theme variables */ -import "./theme/variables.css"; - -setupIonicReact(); - -const App: React.FC = () => ( - - - -); - -export default App; diff --git a/Govt-Billing-React-Ad-Subscriptions/src/app-data.ts b/Govt-Billing-React-Ad-Subscriptions/src/app-data.ts deleted file mode 100644 index a785d3f..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/app-data.ts +++ /dev/null @@ -1,5841 +0,0 @@ -export let APP_NAME = "Inventory Tracker for FVM Warehouse"; - -export let DATA = { - ledger: { - iPad: { - msc: { - numsheets: 4, - currentid: "sheet1", - currentname: "typei", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE:b:1:1:1:1:f:6:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:t::b:2::2::l:1:f:7\ncell:G2:t::b:2::2::l:1:f:7\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2:::2:l:3:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:2::::l:1:f:7\ncell:G3:b:2:2:::l:3:f:7\ncell:A4:b::2:::l:3:f:7\ncell:B4:b::::2:l:3:f:3\ncell:C4:t:INVOICE # \\c:f:2:cf:2\ncell:D4:v:1:f:2:cf:2\ncell:F4:tvf:4:rowspan:4\ncell:G4:b::2:::l:3:f:7\ncell:A5:b::2:::l:3:f:7\ncell:B5:b::::2:l:3:f:4\ncell:F5:t::l:2:f:7\ncell:G5:t::b::1:::l:2:f:7\ncell:A6:b::2:::l:3:f:7\ncell:B6:b::::2:l:3:f:4\ncell:C6:t:INVOICE DATE\\c:f:2:cf:2\ncell:D6:f:2:cf:2:ntvf:3\ncell:F6:l:2:f:7\ncell:G6:b::1:::l:2:f:7\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::::2:l:3:f:4\ncell:G7:b::2:::l:3:f:7\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::::2:l:3:f:4\ncell:G8:b::2:::l:3:f:7\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::::2:l:3:f:4\ncell:C9:t:BILL TO\\c:l:3:f:2\ncell:E9:t:FROM\\c:f:2:cf:2\ncell:G9:b::2:::l:3:f:7\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::::2:l:3:f:3\ncell:C10:t:[Name]:f:1:cf:2:colspan:2\ncell:E10:t:[Name]:f:1:cf:2:colspan:2\ncell:G10:b::2:::l:3:f:7\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:E11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:G11:b::2:::l:3:f:7\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:E12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:G12:b::2:::l:3:f:7\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:Phone\\c:f:1:cf:2:colspan:2\ncell:E13:t:Phone\\c:f:1:cf:2:colspan:2\ncell:G13:b::2:::l:3:f:7\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::::2:l:3:f:3:cf:2\ncell:C14:b:::2::l:1:f:7\ncell:D14:b:::2::l:3:f:3:cf:2\ncell:E14:b:::2::l:1:f:7\ncell:F14:b:::2::l:1:f:7\ncell:G14:b::2:::l:3:f:7\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::2::2:l:3:f:7\ncell:C15:t:Description:b:1::1:1:f:2:cf:1:colspan:3\ncell:D15:t:Description:b:1::1::l:3:f:3:cf:2:colspan:2:rowspan:1\ncell:E15:t::b:2:2:2::l:1:f:7\ncell:F15:t:Amount:b:1:1:1:1:f:2:cf:1\ncell:G15:b::2::2:l:3:f:7\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::2::2:l:3:f:7\ncell:C16:b:1:1::1:f:1:cf:2:colspan:3\ncell:D16:b:1:1:::l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:E16:t::b:2:2:2::l:1:f:7\ncell:F16:b:1:1:::f:1:ntvf:1\ncell:G16:b::2::2:l:3:f:7\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::2::2:l:3:f:7:cf:2\ncell:C17:b::1::1:f:1:cf:2:colspan:3\ncell:D17:b::1:::l:1:f:7:colspan:2\ncell:E17:l:1:f:7\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::2::2:l:3:f:7\ncell:A18:b::2:::l:3:f:7\ncell:B18:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C18:b::1::1:f:1:cf:2:colspan:3\ncell:D18:b::1:::colspan:2\ncell:F18:b::1:::f:1:ntvf:1\ncell:G18:b::2::2:l:3:f:7\ncell:A19:b::2:::l:3:f:7\ncell:B19:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C19:b::1::1:f:1:cf:2:colspan:3\ncell:D19:b::1:::colspan:2\ncell:F19:b::1:::f:1:ntvf:1\ncell:G19:b::2::2:l:3:f:7\ncell:A20:b::2:::l:3:f:7\ncell:B20:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C20:b::1::1:f:1:cf:2:colspan:3\ncell:D20:b::1:::colspan:2\ncell:F20:b::1:::f:1:ntvf:1\ncell:G20:b::2::2:l:3:f:7\ncell:A21:b::2:::l:3:f:7\ncell:B21:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C21:b::1::1:f:1:cf:2:colspan:3\ncell:D21:b::1:::colspan:2\ncell:F21:b::1:::f:1:ntvf:1\ncell:G21:b::2::2:l:3:f:7\ncell:A22:b::2:::l:3:f:7\ncell:B22:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C22:b::1::1:f:1:cf:2:colspan:3\ncell:D22:b::1:::colspan:2\ncell:F22:b::1:::f:1:ntvf:1\ncell:G22:b::2::2:l:3:f:7\ncell:A23:b::2:::l:3:f:7\ncell:B23:b::2::2:l:3:f:7:cf:2\ncell:C23:b::1::1:f:1:cf:2:colspan:3\ncell:D23:b::1:::colspan:2\ncell:F23:b::1:::f:1:ntvf:1\ncell:G23:b::2::2:l:3:f:7\ncell:A24:b::2:::l:3:f:7\ncell:B24:b::2::2:l:3:f:7:cf:2\ncell:C24:b::1::1:f:1:cf:2:colspan:3\ncell:D24:b::1:::colspan:2\ncell:F24:b::1:::f:1:ntvf:1\ncell:G24:b::2::2:l:3:f:7\ncell:A25:b::2:::l:3:f:7\ncell:B25:b::2::2:l:3:f:7:cf:2\ncell:C25:b::1::1:f:1:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:1:ntvf:1\ncell:G25:b::2::2:l:3:f:7\ncell:A26:b::2:::l:3:f:7\ncell:B26:b::2::2:l:3:f:7:cf:2\ncell:C26:b::1::1:f:1:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:1:ntvf:1\ncell:G26:b::2::2:l:3:f:7\ncell:A27:b::2:::l:3:f:7\ncell:B27:b::2::2:l:3:f:7:cf:2\ncell:C27:b::1::1:f:1:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:1:ntvf:1\ncell:G27:b::2::2:l:3:f:7\ncell:A28:b::2:::l:3:f:4\ncell:B28:b::2::2:l:3:f:7:cf:2\ncell:C28:b::1:1:1:f:1:cf:2:colspan:3\ncell:D28:b::1:1::l:3:f:7:cf:2:colspan:2\ncell:E28:b:::2::l:3:f:7:cf:2\ncell:F28:b::1:1::f:1:ntvf:1\ncell:G28:b::2::2:l:3:f:7\ncell:A29:b::2:::l:3:f:3\ncell:B29:b::2::2:l:3:f:3\ncell:C29:t:TOTAL:b:1:1:1:1:f:5:cf:2:colspan:3\ncell:D29:b:2::2::l:3:f:8:cf:2\ncell:E29:b:2:2:2::l:3:f:8:cf:2\ncell:F29:vtf:n:0:SUM(F16\\cF28):b:1:1:1::f:5:ntvf:1\ncell:G29:b::2::2:l:3:f:4\ncell:A30:b::2:::l:3:f:7\ncell:B30:b::::2:l:3:f:3:cf:2\ncell:C30:b:2::::l:1:f:7\ncell:D30:b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:7\ncell:F30:b:2::::l:1:f:7\ncell:G30:b::2:::l:3:f:3\ncell:A31:b::2:::l:3:f:7\ncell:B31:b::::2:l:3:f:7\ncell:D31:tvf:4:rowspan:4\ncell:G31:b::2:::l:3:f:7\ncell:A32:b::2:::l:3:f:7\ncell:B32:b::::2:l:3:f:7\ncell:G32:b::2:::l:3:f:7\ncell:A33:b::2:::l:3:f:7\ncell:B33:b::::2:l:3:f:7\ncell:G33:b::2:::l:3:f:7\ncell:A34:b::2:::l:3:f:7\ncell:B34:b::::2:l:3:f:7\ncell:G34:b::2:::l:3:f:7\ncell:A35:b::2:::l:3:f:7\ncell:B35:b:::2:2:l:3:f:7\ncell:C35:b:::2::l:3:f:7\ncell:D35:b:::2::l:3:f:7\ncell:E35:b:::2::l:3:f:7\ncell:F35:b:::2::l:3:f:7\ncell:G35:b::2:2::l:3:f:7\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncell:F36:b:1:::\ncell:G36:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:105\ncol:D:w:182\ncol:E:w:110\ncol:F:w:115\ncol:G:w:65\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:7:r:36:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:normal bold * Trebuchet MS\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 12pt Arial\nfont:5:normal bold 12pt Trebuchet MS\nfont:6:normal bold 14pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "typei", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - 'version:1.5\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE:b:1:1:1:1:l:3:f:6:cf:1:colspan:8\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:t::b:2::2::l:1:f:7\ncell:G2:b:2::2::l:1:f:7\ncell:H2:b:2::2::l:1:f:7\ncell:I2:t::b:2::2::l:1:f:7\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2:::2:l:3:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:2::::l:1:f:7\ncell:G3:b:2::::l:1:f:7\ncell:H3:b:2::::l:1:f:7\ncell:I3:b:2:2:::l:3:f:7\ncell:A4:b::2:::l:3:f:7\ncell:B4:b::::2:l:3:f:3\ncell:C4:t:INVOICE # \\c:f:2:cf:2\ncell:D4:v:1:f:2:cf:2\ncell:F4:tvf:5:colspan:2:rowspan:4\ncell:I4:b::2:::l:3:f:7\ncell:A5:b::2:::l:3:f:7\ncell:B5:b::::2:l:3:f:4\ncell:F5:t::l:2:f:7\ncell:G5:l:2:f:7\ncell:H5:l:2:f:7\ncell:I5:t::b::1:::l:2:f:7\ncell:A6:b::2:::l:3:f:7\ncell:B6:b::::2:l:3:f:4\ncell:C6:t:INVOICE DATE\\c:f:2:cf:2\ncell:D6:f:2:cf:2:ntvf:4\ncell:F6:l:2:f:7\ncell:G6:l:2:f:7\ncell:H6:l:2:f:7\ncell:I6:b::1:::l:2:f:7\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::::2:l:3:f:4\ncell:I7:b::2:::l:3:f:7\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::::2:l:3:f:4\ncell:I8:b::2:::l:3:f:7\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::::2:l:3:f:4\ncell:C9:t:BILL TO\\c:f:2\ncell:E9:t:FROM\\c:f:2:cf:2\ncell:F9:colspan:3\ncell:I9:b::2:::l:3:f:7\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::::2:l:3:f:3\ncell:C10:t:[Name]:f:1:cf:2:colspan:2\ncell:E10:t:[Name]:f:1:cf:2:colspan:4\ncell:I10:b::2:::l:3:f:7\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:E11:t:[Street Address]:f:1:colspan:4\ncell:I11:b::2:::l:3:f:7\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:E12:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:I12:b::2:::l:3:f:7\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:Phone\\c :f:1:cf:2:colspan:2\ncell:E13:t:Phone\\c :f:1:cf:2:colspan:4\ncell:I13:b::2:::l:3:f:7\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::::2:l:3:f:3:cf:2\ncell:C14:b:::2::l:1:f:7\ncell:D14:b:::2::l:3:f:3:cf:2\ncell:E14:b:::2::l:1:f:7\ncell:F14:b:::2::l:1:f:7\ncell:G14:b:::2::l:1:f:7\ncell:H14:b:::2::l:1:f:7\ncell:I14:b::2:::l:3:f:7\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::2::2:l:3:f:7\ncell:C15:t:Description:b:1:1:1:1:f:2:cf:1:colspan:3\ncell:D15:t:Description:b:2::2:2:l:3:f:3:cf:2:colspan:2:rowspan:1\ncell:E15:t::b:2:2:2::l:1:f:7\ncell:F15:t:Hours:b:1:1:1:1:f:2:cf:1\ncell:G15:t:Rate:b:1:1:1:1:f:2:cf:1\ncell:H15:t:Amount:b:1:1:1:1:f:2:cf:1\ncell:I15:b::2::2:l:3:f:7\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::2::2:l:3:f:7\ncell:C16:b:1:1::1:f:1:cf:2:colspan:3\ncell:D16:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:E16:t::b:2:2:2::l:1:f:7\ncell:F16:b:1:1:::f:1:ntvf:1\ncell:G16:b:1:1:::f:1:ntvf:1\ncell:H16:vtf:t::IF(F16*G16>0,F16*G16,""):b:1:1:::f:1:ntvf:1\ncell:I16:b::2::2:l:3:f:7\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::2::2:l:3:f:7:cf:2\ncell:C17:b::1::1:f:1:cf:2:colspan:3\ncell:D17:b::1::1:l:1:f:7:colspan:2\ncell:E17:l:1:f:7\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::1:::f:1:ntvf:1\ncell:H17:vtf:t::IF(F17*G17>0,F17*G17,""):b::1:::f:1:ntvf:1\ncell:I17:b::2::2:l:3:f:7\ncell:A18:b::2:::l:3:f:7\ncell:B18:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C18:b::1::1:f:1:cf:2:colspan:3\ncell:D18:b::1::1:colspan:2\ncell:F18:b::1:::f:1:ntvf:1\ncell:G18:b::1:::f:1:ntvf:1\ncell:H18:vtf:t::IF(F18*G18>0,F18*G18,""):b::1:::f:1:ntvf:1\ncell:I18:b::2::2:l:3:f:7\ncell:A19:b::2:::l:3:f:7\ncell:B19:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C19:b::1::1:f:1:cf:2:colspan:3\ncell:D19:b::1::1:colspan:2\ncell:F19:b::1:::f:1:ntvf:1\ncell:G19:b::1:::f:1:ntvf:1\ncell:H19:vtf:t::IF(F19*G19>0,F19*G19,""):b::1:::f:1:ntvf:1\ncell:I19:b::2::2:l:3:f:7\ncell:A20:b::2:::l:3:f:7\ncell:B20:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C20:b::1::1:f:1:cf:2:colspan:3\ncell:D20:b::1::1:colspan:2\ncell:F20:b::1:::f:1:ntvf:1\ncell:G20:b::1:::f:1:ntvf:1\ncell:H20:vtf:t::IF(F20*G20>0,F20*G20,""):b::1:::f:1:ntvf:1\ncell:I20:b::2::2:l:3:f:7\ncell:A21:b::2:::l:3:f:7\ncell:B21:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C21:b::1::1:f:1:cf:2:colspan:3\ncell:D21:b::1::1:colspan:2\ncell:F21:b::1:::f:1:ntvf:1\ncell:G21:b::1:::f:1:ntvf:1\ncell:H21:vtf:t::IF(F21*G21>0,F21*G21,""):b::1:::f:1:ntvf:1\ncell:I21:b::2::2:l:3:f:7\ncell:A22:b::2:::l:3:f:7\ncell:B22:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C22:b::1::1:f:1:cf:2:colspan:3\ncell:D22:b::1::1:colspan:2\ncell:F22:b::1:::f:1:ntvf:1\ncell:G22:b::1:::f:1:ntvf:1\ncell:H22:vtf:t::IF(F22*G22>0,F22*G22,""):b::1:::f:1:ntvf:1\ncell:I22:b::2::2:l:3:f:7\ncell:A23:b::2:::l:3:f:7\ncell:B23:b::2::2:l:3:f:7:cf:2\ncell:C23:b::1::1:f:1:cf:2:colspan:3\ncell:D23:b::1::1:colspan:2\ncell:F23:b::1:::f:1:ntvf:1\ncell:G23:b::1:::f:1:ntvf:1\ncell:H23:vtf:t::IF(F23*G23>0,F23*G23,""):b::1:::f:1:ntvf:1\ncell:I23:b::2::2:l:3:f:7\ncell:A24:b::2:::l:3:f:7\ncell:B24:b::2::2:l:3:f:7:cf:2\ncell:C24:b::1::1:f:1:cf:2:colspan:3\ncell:D24:b::1::1:colspan:2\ncell:F24:b::1:::f:1:ntvf:1\ncell:G24:b::1:::f:1:ntvf:1\ncell:H24:vtf:t::IF(F24*G24>0,F24*G24,""):b::1:::f:1:ntvf:1\ncell:I24:b::2::2:l:3:f:7\ncell:A25:b::2:::l:3:f:7\ncell:B25:b::2::2:l:3:f:7:cf:2\ncell:C25:b::1::1:f:1:cf:2:colspan:3\ncell:D25:b::1::1:colspan:2\ncell:F25:b::1:::f:1:ntvf:1\ncell:G25:b::1:::f:1:ntvf:1\ncell:H25:vtf:t::IF(F25*G25>0,F25*G25,""):b::1:::f:1:ntvf:1\ncell:I25:b::2::2:l:3:f:7\ncell:A26:b::2:::l:3:f:7\ncell:B26:b::2::2:l:3:f:7:cf:2\ncell:C26:b::1::1:f:1:cf:2:colspan:3\ncell:D26:b::1::1:colspan:2\ncell:F26:b::1:::f:1:ntvf:1\ncell:G26:b::1:::f:1:ntvf:1\ncell:H26:vtf:t::IF(F26*G26>0,F26*G26,""):b::1:::f:1:ntvf:1\ncell:I26:b::2::2:l:3:f:7\ncell:A27:b::2:::l:3:f:7\ncell:B27:b::2::2:l:3:f:7:cf:2\ncell:C27:b::1::1:f:1:cf:2:colspan:3\ncell:D27:b::1::1:colspan:2\ncell:F27:b::1:::f:1:ntvf:1\ncell:G27:b::1:::f:1:ntvf:1\ncell:H27:vtf:t::IF(F27*G27>0,F27*G27,""):b::1:::f:1:ntvf:1\ncell:I27:b::2::2:l:3:f:7\ncell:A28:b::2:::l:3:f:4\ncell:B28:b::2::2:l:3:f:7:cf:2\ncell:C28:b::1:1:1:f:1:cf:2:colspan:3\ncell:D28:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:E28:b:::2::l:3:f:7:cf:2\ncell:F28:b::1:1::f:1:ntvf:1\ncell:G28:b::1:1::f:1:ntvf:1\ncell:H28:vtf:t::IF(F28*G28>0,F28*G28,""):b::1:::f:1:ntvf:1\ncell:I28:b::2::2:l:3:f:7\ncell:A29:b::2:::l:3:f:3\ncell:B29:b::2::2:l:3:f:3\ncell:C29:t:TOTAL:b:1:1:1:1:l:3:f:5:cf:2:colspan:5\ncell:D29:b:2::2::l:3:f:8:cf:2\ncell:E29:b:2:2:2::l:3:f:8:cf:2\ncell:F29:vtf:n:0:SUM(F16\\cF28):b:2:2:2::l:3:f:4:ntvf:2\ncell:G29:b:2:2:2::l:3:f:4:ntvf:2\ncell:H29:vtf:n:0:SUM(H16\\cH28):b:1:1:1::f:5:ntvf:1\ncell:I29:b::2::2:l:3:f:4\ncell:A30:b::2:::l:3:f:7\ncell:B30:b::::2:l:3:f:3:cf:2\ncell:C30:b:2::::l:1:f:7\ncell:D30:b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:7\ncell:F30:b:2::::l:1:f:7\ncell:G30:b:2::::l:1:f:7\ncell:H30:b:2::::l:1:f:7\ncell:I30:b::2:::l:3:f:3\ncell:A31:b::2:::l:3:f:7\ncell:B31:b::::2:l:3:f:7\ncell:D31:tvf:5:rowspan:4\ncell:I31:b::2:::l:3:f:7\ncell:A32:b::2:::l:3:f:7\ncell:B32:b::::2:l:3:f:7\ncell:I32:b::2:::l:3:f:7\ncell:A33:b::2:::l:3:f:7\ncell:B33:b::::2:l:3:f:7\ncell:I33:b::2:::l:3:f:7\ncell:A34:b::2:::l:3:f:7\ncell:B34:b::::2:l:3:f:7\ncell:I34:b::2:::l:3:f:7\ncell:A35:b::2:::l:3:f:7\ncell:B35:b:::2:2:l:3:f:7\ncell:C35:b:::2::l:3:f:7\ncell:D35:b:::2::l:3:f:7\ncell:E35:b:::2::l:3:f:7\ncell:F35:b:::2::l:3:f:7\ncell:G35:b:::2::l:3:f:7\ncell:H35:b:::2::l:3:f:7\ncell:I35:b::2:2::l:3:f:7\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncell:F36:b:1:::\ncell:G36:b:1:::\ncell:H36:b:1:::\ncell:I36:b:1:::\ncol:A:w:26\ncol:B:w:28\ncol:C:w:96\ncol:D:w:203\ncol:E:w:51\ncol:F:w:50\ncol:G:w:58\ncol:H:w:80\ncol:I:w:28\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:9:r:36:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:normal bold * Trebuchet MS\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 12pt Arial\nfont:5:normal bold 12pt Trebuchet MS\nfont:6:normal bold 14pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00;(#,##0.00)\nvalueformat:3:d-mmm\nvalueformat:4:m/d/yy\nvalueformat:5:text-html\n', - }, - name: "typeii", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:l:3\ncell:B2:t:[Company Name]:l:1:f:3:cf:2:colspan:3\ncell:C2:t::l:2:f:9\ncell:D2:t::l:2:f:9\ncell:E2:l:1:f:7:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:9\ncell:B3:t:[Company Slogan]:f:4:cf:2:colspan:3\ncell:C3:t::l:2:f:9\ncell:D3:t::l:2:f:9\ncell:B4:f:2:colspan:2\ncell:F4:tvf:4:rowspan:4\ncell:B5:t:[Street Address]:f:1:cf:2:colspan:2\ncell:F5:l:1:f:6\ncell:G5:l:1:f:10:cf:1\ncell:B6:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:G6:l:1:f:9\ncell:B7:t:Phone\\c :f:1:cf:2:colspan:2\ncell:B8:t:Email\\c:f:1:cf:2:colspan:2\ncell:B9:colspan:2\ncell:F9:t:DATE \\c:l:1:f:6:cf:2\ncell:G9:l:1:f:10:cf:2:ntvf:3\ncell:B10:t:BILL TO\\c:f:5:c:1:bg:3:cf:2:colspan:2\ncell:F10:t:INVOICE # \\c:l:1:f:6:cf:2\ncell:G10:v:1:l:1:f:10:cf:2\ncell:B11:t:[Name]:f:1:cf:2:colspan:2\ncell:B12:t:[Company Name]:f:1:cf:2:colspan:2\ncell:F12:t: \ncell:B13:t:[Street Address]:f:1:cf:2:colspan:2\ncell:B14:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:B15:t:Phone\\c :f:1:cf:2:colspan:2\ncell:A17:b::1::\ncell:B17:t:DESCRIPTION:b:1:1:1:1:l:1:f:6:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C17:t::l:2:f:9\ncell:D17:t::l:2:f:9\ncell:E17:t::l:2:f:9\ncell:F17:t::l:2:f:9\ncell:G17:t:AMOUNT:b:1:1:1::l:1:f:6:c:1:bg:3:cf:1\ncell:A18:b::1::\ncell:B18:b:1:1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C18:t::l:2:f:9\ncell:D18:t::l:2:f:9\ncell:E18:t::l:2:f:9\ncell:F18:t::b::2:::l:1:f:9\ncell:G18:b::1::1:f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C19:t::l:2:f:9\ncell:D19:t::l:2:f:9\ncell:E19:t::l:2:f:9\ncell:F19:t::b::2:::l:1:f:9\ncell:G19:b::1::1:f:1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C20:t::l:2:f:9\ncell:D20:t::l:2:f:9\ncell:E20:t::l:2:f:9\ncell:F20:t::b::2:::l:1:f:9\ncell:G20:b::1::1:f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C21:t::l:2:f:9\ncell:D21:t::l:2:f:9\ncell:E21:t::l:2:f:9\ncell:F21:t::b::2:::l:1:f:9\ncell:G21:b::1::1:f:1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C22:t::l:2:f:9\ncell:D22:t::l:2:f:9\ncell:E22:t::l:2:f:9\ncell:F22:t::b::2:::l:1:f:9\ncell:G22:b::1::1:f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:9\ncell:D23:t::l:2:f:9\ncell:E23:t::l:2:f:9\ncell:F23:t::b::2:::l:1:f:9\ncell:G23:b::1::1:f:1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:9\ncell:D24:t::l:2:f:9\ncell:E24:t::l:2:f:9\ncell:F24:t::b::2:::l:1:f:9\ncell:G24:b::1::1:f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:9\ncell:D25:t::l:2:f:9\ncell:E25:t::l:2:f:9\ncell:F25:t::b::2:::l:1:f:9\ncell:G25:b::1::1:f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:9\ncell:D26:t::l:2:f:9\ncell:E26:t::l:2:f:9\ncell:F26:t::b::2:::l:1:f:9\ncell:G26:b::1::1:f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:9\ncell:D27:t::l:2:f:9\ncell:E27:t::l:2:f:9\ncell:F27:t::b::2:::l:1:f:9\ncell:G27:b::1::1:f:1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:9\ncell:D28:t::l:2:f:9\ncell:E28:t::l:2:f:9\ncell:F28:t::b::2:::l:1:f:9\ncell:G28:b::1::1:f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:f:1:cf:2:colspan:5:rowspan:1\ncell:C29:t::b:::2::l:1:f:9\ncell:D29:t::b:::2::l:1:f:9\ncell:E29:t::b:::2::l:1:f:9\ncell:F29:t::b::2:2::l:1:f:9\ncell:G29:b::1:1:1:f:1:ntvf:1\ncell:B30:b:2::::l:1:f:9\ncell:C30:b:2::::l:1:f:9\ncell:D30:b:2::::l:1:f:9\ncell:E30:b:2::::l:1:f:10\ncell:F30:t:Subtotal:b:2::::l:1:f:10\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::f:8:ntvf:1\ncell:B31:t:NOTES:b:::2::l:1:f:6:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:9\ncell:D31:t::b:::2::l:1:f:9\ncell:F31:t:Tax Rate:l:1:f:1\ncell:G31:v:0:f:1:ntvf:2\ncell:B32:b:1::::f:1:cf:2:colspan:3\ncell:C32:t::b:2::::l:1:f:9\ncell:D32:t::b:2::::l:1:f:9\ncell:F32:t:Tax:l:1:f:1\ncell:G32:vtf:n:0:G31*G30:f:1:ntvf:1\ncell:B33:f:1:cf:2:colspan:3\ncell:C33:t::l:2:f:9\ncell:D33:t::l:2:f:9\ncell:F33:t:Other:b:::1::l:1:f:1\ncell:G33:v:0:b:::1::f:1:ntvf:1\ncell:B34:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:2:f:9\ncell:D34:t::l:2:f:9\ncell:F34:t:TOTAL:b:2::::l:1:f:6\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::::f:5:ntvf:1\ncell:C36:tvf:4:colspan:5:rowspan:7\ncol:A:w:40\ncol:B:w:232\ncol:C:w:53\ncol:D:w:90\ncol:E:w:54\ncol:F:w:91\ncol:G:w:99\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nsheet:c:7:r:36:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 16pt Trebuchet MS\nfont:4:italic normal * Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 28pt Trebuchet MS\nfont:8:normal normal * Trebuchet MS\nfont:9:normal normal 10pt Arial\nfont:10:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "typeiii", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:3\ncell:B2:t:[Company Name]:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C2:t::l:2:f:7\ncell:D2:t::l:2:f:7\ncell:F2:t:INVOICE:l:1:f:6:c:1:cf:2:colspan:2\ncell:G2:t::l:2:f:7\ncell:B3:t:[Company slogan]:f:3:cf:2:colspan:3:rowspan:1\ncell:C3:t::l:2:f:7\ncell:D3:t::l:2:f:7\ncell:B4:cf:2:colspan:3:rowspan:1\ncell:F4:tvf:4:rowspan:4\ncell:B5:t:[Street Address]:f:1:cf:2:colspan:3:rowspan:1\ncell:F5:l:1:f:5\ncell:G5:l:1:f:8:cf:1\ncell:B6:t:[City, State, Zip]:f:1:cf:2:colspan:3:rowspan:1\ncell:G6:l:1:f:7\ncell:B7:t:Phone\\c :f:1:cf:2:colspan:3:rowspan:1\ncell:B8:t:Email\\c:f:1:cf:2:colspan:3:rowspan:1\ncell:B9:cf:2:colspan:3:rowspan:1\ncell:B10:t:BILL TO\\c:l:1:f:5:bg:2:cf:2:colspan:2\ncell:F10:t:DATE\\c:l:1:f:5:cf:2\ncell:G10:l:1:f:8:cf:2:ntvf:3\ncell:B11:t:[Name]:f:1:cf:2:colspan:3:rowspan:1\ncell:F11:t:INVOICE # \\c:l:1:f:5:cf:2\ncell:G11:v:1:l:1:f:8:cf:2\ncell:B12:t:[Company Name]:f:1:cf:2:colspan:3:rowspan:1\ncell:J12:tvf:4\ncell:B13:t:[Street Address]:f:1:cf:2:colspan:3:rowspan:1\ncell:B14:t:[City, State, Zip]:f:1:cf:2:colspan:3:rowspan:1\ncell:B15:t:Phone\\c :f:1:cf:2:colspan:3:rowspan:1\ncell:B16:cf:2:colspan:3:rowspan:1\ncell:A17:b::1::\ncell:B17:t:DESCRIPTION:b:1:1:1:1:l:1:f:5:bg:2:cf:1:colspan:3:rowspan:1\ncell:C17:t::b:1::1::l:1:f:7:bg:2\ncell:D17:t::b:1::1::l:1:f:7:bg:2\ncell:E17:t:HOURS:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:F17:t:RATE:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:G17:t:AMOUNT:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:A18:b::1::\ncell:B18:b:1:1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C18:t::b:2::::l:1:f:7\ncell:D18:t::b:2:2:::l:1:f:7\ncell:E18:b:1:1::1:f:1:ntvf:1\ncell:F18:b:1:1::1:f:1:ntvf:1\ncell:G18:vtf:t::IF(E18*F18>0,E18*F18,""):b:1:1:::f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C19:t::l:2:f:7\ncell:D19:t::b::2:::l:1:f:7\ncell:E19:b::1::1:f:1:ntvf:1\ncell:F19:b::1::1:f:1:ntvf:1\ncell:G19:vtf:t::IF(E19*F19>0,E19*F19,""):b::1:::f:1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C20:t::l:2:f:7\ncell:D20:t::b::2:::l:1:f:7\ncell:E20:b::1::1:f:1:ntvf:1\ncell:F20:b::1::1:f:1:ntvf:1\ncell:G20:vtf:t::IF(E20*F20>0,E20*F20,""):b::1:::f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C21:t::l:2:f:7\ncell:D21:t::b::2:::l:1:f:7\ncell:E21:b::1::1:f:1:ntvf:1\ncell:F21:b::1::1:f:1:ntvf:1\ncell:G21:vtf:t::IF(E21*F21>0,E21*F21,""):b::1:::f:1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C22:t::l:2:f:7\ncell:D22:t::b::2:::l:1:f:7\ncell:E22:b::1::1:f:1:ntvf:1\ncell:F22:b::1::1:f:1:ntvf:1\ncell:G22:vtf:t::IF(E22*F22>0,E22*F22,""):b::1:::f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C23:t::l:2:f:7\ncell:D23:t::b::2:::l:1:f:7\ncell:E23:b::1::1:f:1:ntvf:1\ncell:F23:b::1::1:f:1:ntvf:1\ncell:G23:vtf:t::IF(E23*F23>0,E23*F23,""):b::1:::f:1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C24:t::l:2:f:7\ncell:D24:t::b::2:::l:1:f:7\ncell:E24:b::1::1:f:1:ntvf:1\ncell:F24:b::1::1:f:1:ntvf:1\ncell:G24:vtf:t::IF(E24*F24>0,E24*F24,""):b::1:::f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C25:t::l:2:f:7\ncell:D25:t::b::2:::l:1:f:7\ncell:E25:b::1::1:f:1:ntvf:1\ncell:F25:b::1::1:f:1:ntvf:1\ncell:G25:vtf:t::IF(E25*F25>0,E25*F25,""):b::1:::f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C26:t::l:2:f:7\ncell:D26:t::b::2:::l:1:f:7\ncell:E26:b::1::1:f:1:ntvf:1\ncell:F26:b::1::1:f:1:ntvf:1\ncell:G26:vtf:t::IF(E26*F26>0,E26*F26,""):b::1:::f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C27:t::l:2:f:7\ncell:D27:t::b::2:::l:1:f:7\ncell:E27:b::1::1:f:1:ntvf:1\ncell:F27:b::1::1:f:1:ntvf:1\ncell:G27:vtf:t::IF(E27*F27>0,E27*F27,""):b::1:::f:1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C28:t::l:2:f:7\ncell:D28:t::b::2:::l:1:f:7\ncell:E28:b::1::1:f:1:ntvf:1\ncell:F28:b::1::1:f:1:ntvf:1\ncell:G28:vtf:t::IF(E28*F28>0,E28*F28,""):b::1:::f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C29:t::b:::2::l:1:f:7\ncell:D29:t::b::2:2::l:1:f:7\ncell:E29:b::1:1:1:f:1:ntvf:1\ncell:F29:b::1:1:1:f:1:ntvf:1\ncell:G29:vtf:t::IF(E29*F29>0,E29*F29,""):b::1:::f:1:ntvf:1\ncell:B30:b:2::::l:1:f:8:cf:1:colspan:3:rowspan:1\ncell:C30:t::b:2::::l:1:f:7\ncell:D30:t::b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:8\ncell:F30:t:Subtotal:b:1::::f:1\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::f:1:ntvf:1\ncell:B31:t:NOTES:b:::2::l:1:f:5:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:7\ncell:D31:t::b:::2::l:1:f:7\ncell:F31:t:Tax Rate:f:1\ncell:G31:v:0:f:1:ntvf:2\ncell:B32:b:1::::f:1:cf:2:colspan:3:rowspan:1\ncell:C32:t::b:2::::l:1:f:7\ncell:D32:t::b:2::::l:1:f:7\ncell:F32:t:Tax:f:1\ncell:G32:vtf:n:0:G31*G30:f:1:ntvf:1\ncell:B33:f:1:cf:2:colspan:3:rowspan:1\ncell:C33:t::l:2:f:7\ncell:D33:t::l:2:f:7\ncell:F33:t:Other:b:::1::l:1:f:1\ncell:G33:v:0:b:::1::f:1:ntvf:1\ncell:B34:f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:2:f:7\ncell:D34:t::l:2:f:7\ncell:F34:t:TOTAL:b:1::::l:1:f:4\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::::f:4:ntvf:1\ncell:B35:b:2::::l:1:f:7\ncell:C35:b:2::::l:1:f:7\ncell:D35:b:2::::l:1:f:7\ncell:C36:tvf:4:colspan:5:rowspan:7\ncol:A:w:40\ncol:B:w:194\ncol:C:w:128\ncol:D:w:60\ncol:E:w:65\ncol:F:w:95\ncol:G:w:90\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:10:r:36:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0,0,0)\ncolor:2:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 16pt Trebuchet MS\nfont:3:italic normal * Trebuchet MS\nfont:4:normal bold * Trebuchet MS\nfont:5:normal bold 10pt Trebuchet MS\nfont:6:normal bold 28pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "typeiv", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "typei!C10": true, - "typei!B2": true, - "typei!C11": true, - "typei!C12": true, - "typei!C13": true, - "typei!D9": true, - "typei!D4": true, - "typei!D6": true, - "typei!E10": true, - "typei!E11": true, - "typei!E12": true, - "typei!E13": true, - "typei!F9": true, - "typei!C16": true, - "typei!C17": true, - "typei!C18": true, - "typei!C19": true, - "typei!C20": true, - "typei!C21": true, - "typei!C22": true, - "typei!C23": true, - "typei!C24": true, - "typei!C25": true, - "typei!C26": true, - "typei!C27": true, - "typei!C28": true, - "typei!F16": true, - "typei!F17": true, - "typei!F18": true, - "typei!F19": true, - "typei!F20": true, - "typei!F21": true, - "typei!F22": true, - "typei!F23": true, - "typei!F24": true, - "typei!F25": true, - "typei!F26": true, - "typei!F27": true, - "typei!F28": true, - "typei!E35": true, - "typeii!B2": true, - "typeii!D4": true, - "typeii!C10": true, - "typeii!C11": true, - "typeii!C12": true, - "typeii!C13": true, - "typeii!D9": true, - "typeii!E10": true, - "typeii!E11": true, - "typeii!E12": true, - "typeii!E13": true, - "typeii!F9": true, - "typeii!C16": true, - "typeii!C17": true, - "typeii!C18": true, - "typeii!C19": true, - "typeii!C20": true, - "typeii!C21": true, - "typeii!C22": true, - "typeii!C23": true, - "typeii!C24": true, - "typeii!C25": true, - "typeii!C26": true, - "typeii!C27": true, - "typeii!C28": true, - "typeii!F16": true, - "typeii!F17": true, - "typeii!F18": true, - "typeii!F19": true, - "typeii!F20": true, - "typeii!F21": true, - "typeii!F22": true, - "typeii!F23": true, - "typeii!F24": true, - "typeii!F25": true, - "typeii!F26": true, - "typeii!F27": true, - "typeii!F28": true, - "typeii!G16": true, - "typeii!G17": true, - "typeii!G18": true, - "typeii!G19": true, - "typeii!G20": true, - "typeii!G21": true, - "typeii!G22": true, - "typeii!G23": true, - "typeii!G24": true, - "typeii!G25": true, - "typeii!G26": true, - "typeii!G27": true, - "typeii!G28": true, - "typeii!E35": true, - "typeiii!G9": true, - "typeiii!G10": true, - "typeiii!B2": true, - "typeiii!B3": true, - "typeiii!B4": true, - "typeiii!B5": true, - "typeiii!B6": true, - "typeiii!B7": true, - "typeiii!B8": true, - "typeiii!B9": true, - "typeiii!B11": true, - "typeiii!B12": true, - "typeiii!B13": true, - "typeiii!B14": true, - "typeiii!B15": true, - "typeiii!B18": true, - "typeiii!B19": true, - "typeiii!B20": true, - "typeiii!B21": true, - "typeiii!B22": true, - "typeiii!B23": true, - "typeiii!B24": true, - "typeiii!B25": true, - "typeiii!B26": true, - "typeiii!B27": true, - "typeiii!B28": true, - "typeiii!B29": true, - "typeiii!G18": true, - "typeiii!G19": true, - "typeiii!G20": true, - "typeiii!G21": true, - "typeiii!G22": true, - "typeiii!G23": true, - "typeiii!G24": true, - "typeiii!G25": true, - "typeiii!G26": true, - "typeiii!G27": true, - "typeiii!G28": true, - "typeiii!G29": true, - "typeiii!B32": true, - "typeiii!B33": true, - "typeiii!B34": true, - "typeiii!G31": true, - "typeiii!G33": true, - "typeiii!B37": true, - "typeiv!G9": true, - "typeiv!G10": true, - "typeiv!B2": true, - "typeiv!B3": true, - "typeiv!B4": true, - "typeiv!B5": true, - "typeiv!B6": true, - "typeiv!B7": true, - "typeiv!B8": true, - "typeiv!B11": true, - "typeiv!B12": true, - "typeiv!B13": true, - "typeiv!B14": true, - "typeiv!B15": true, - "typeiv!B16": true, - "typeiv!B18": true, - "typeiv!B19": true, - "typeiv!B20": true, - "typeiv!B21": true, - "typeiv!B22": true, - "typeiv!B23": true, - "typeiv!B24": true, - "typeiv!B25": true, - "typeiv!B26": true, - "typeiv!B27": true, - "typeiv!B28": true, - "typeiv!B29": true, - "typeiv!E18": true, - "typeiv!E19": true, - "typeiv!E20": true, - "typeiv!E21": true, - "typeiv!E22": true, - "typeiv!E23": true, - "typeiv!E24": true, - "typeiv!E25": true, - "typeiv!E26": true, - "typeiv!E27": true, - "typeiv!E28": true, - "typeiv!E29": true, - "typeiv!F18": true, - "typeiv!F19": true, - "typeiv!F2": true, - "typeiv!F20": true, - "typeiv!F21": true, - "typeiv!F22": true, - "typeiv!F23": true, - "typeiv!F24": true, - "typeiv!F25": true, - "typeiv!F26": true, - "typeiv!F27": true, - "typeiv!F28": true, - "typeiv!F29": true, - "typeiv!B32": true, - "typeiv!B33": true, - "typeiv!B34": true, - "typeiv!G31": true, - "typeiv!G33": true, - "typeiv!B37": true, - "typeii!F15": true, - "typeii!G15": true, - "typeiv!E17": true, - "typeiv!F17": true, - "typeii!D6": true, - "typeiv!G11": true, - "typei!C4": true, - "typeii!C4": true, - "typeiii!F10": true, - "typeiv!F11": true, - "typeiv!F10": true, - "typeiii!F9": true, - "typeii!C6": true, - "typei!C6": true, - "typei!F4": true, - "typeii!F4": true, - "typeiii!F4": true, - "typeiii!F2": true, - "typeiv!F4": true, - "typei!F29": true, - "typeii!H29": true, - "typeiii!G30": true, - "typeiii!G34": true, - "typeiv!G30": true, - "typeiv!G34": true, - }, - constraints: {}, - }, - }, - footers: [ - { name: "Invoice 1", index: 1, isActive: true }, - { name: "Invoice 2", index: 2, isActive: false }, - { name: "Company Invoice 1", index: 3, isActive: false }, - { name: "Company Invoice 2", index: 4, isActive: false }, - ], - }, - default: { - msc: { - numsheets: 11, - currentid: "sheet1", - currentname: "summary", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B2:t:Summary:l:1:f:4:c:1:bg:6:cf:2:colspan:4\ncell:B4:l:1:f:3:c:1:bg:6:cf:2\ncell:G4:t:
    \\n\\n\\n:tvf:3:colspan:3:rowspan:5\ncell:C5:t:Monthly Budget:l:4:f:5:c:6:bg:3:cf:1:colspan:2\ncell:D5:bg:5\ncell:B6:b::1::\ncell:C6:t:Total Income:b::1:1:1:l:3:f:6:cf:2\ncell:D6:vtf:n:37112:INCOME!D23:b::1:1:1:l:2:f:1:ntvf:1\ncell:B7:b::1::\ncell:C7:t:Total Expenses:b:::1:1:l:3:f:6:bg:5:cf:2\ncell:D7:vtf:n:4853:SHEET11!E30:b::1:1:1:l:2:f:1:bg:5:ntvf:1\ncell:C8:t:Savings:b:1::1:1:l:3:f:6:cf:2\ncell:D8:vtf:n:32259:D6-D7:b:1:1:1:1:l:2:f:1:ntvf:1\ncell:B10:t::l:1:f:3:c:1:bg:6:cf:2\ncell:G10:t:
    \\n\\n\\n:tvf:3:colspan:3:rowspan:5\ncell:C11:t:Yearly Budget:l:4:f:5:c:6:bg:2:cf:1:colspan:2\ncell:B12:b::1::\ncell:C12:t:Total Income:b::1:1:1:l:3:f:6:cf:2\ncell:D12:vtf:n:445344:INCOME!E23:b::1:1:1:l:3:f:1:ntvf:1\ncell:C13:t:Total Expenses:b:::1:1:l:3:f:6:bg:5:cf:2\ncell:D13:vtf:n:58236:SHEET11!F30:b::1:1:1:l:3:f:1:bg:5:ntvf:1\ncell:C14:t:Savings:b:1::1:1:l:3:f:6:cf:2\ncell:D14:vtf:n:387108:D12-D13:b:1:1:1:1:l:3:f:1:ntvf:1\ncell:B16:l:1:f:3:c:1:bg:6:cf:1\ncell:B17:bg:6\ncell:C17:t:Monthly Spending:l:4:f:5:c:6:bg:4:cf:1:colspan:2\ncell:D17:b::1:::bg:6\ncell:B18:b::1::\ncell:C18:t:Housing:b::1::1:l:3:f:6:cf:2\ncell:D18:vtf:n:1380:EXPENSE!E7:b::1::1:l:3:f:1:ntvf:1\ncell:G18:t:
    \\n\\n\\n:tvf:3:colspan:4:rowspan:11\ncell:B19:b::1::\ncell:C19:t:Food:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D19:vtf:n:511:sheet9!E4:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B20:b::1::\ncell:C20:t:Clothes:b::1::1:l:3:f:6:cf:2\ncell:D20:vtf:n:191:sheet9!E12:b::1::1:l:3:f:1:ntvf:1\ncell:B21:b::1::\ncell:C21:t:Transportation:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D21:vtf:n:640:sheet9!E17:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B22:b::1::\ncell:C22:t:Healthcare:b::1::1:l:3:f:6:cf:2\ncell:D22:vtf:n:263:sheet9!E26:b::1::1:l:3:f:1:ntvf:1\ncell:B23:b::1::\ncell:C23:t:Entertainment:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D23:vtf:n:209:sheet10!E4:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B24:b::1::\ncell:C24:t:Education:b::1::1:l:3:f:6:cf:2\ncell:D24:vtf:n:98:sheet10!E13:b::1::1:l:3:f:1:ntvf:1\ncell:B25:b::1::\ncell:C25:t:Contributions:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D25:vtf:n:222:sheet10!E18:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B26:b::1::\ncell:C26:t:Debt:b::1::1:l:3:f:6:cf:2\ncell:D26:vtf:n:0:sheet10!E22:b::1::1:l:3:f:1:ntvf:1\ncell:B27:b::1::\ncell:C27:t:Insurance:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D27:vtf:n:30:sheet10!E25:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B28:b::1::\ncell:C28:t:Credit Card :b::1::1:l:3:f:6:cf:2\ncell:D28:vtf:n:209:sheet11!E4:b::1::1:l:3:f:1:ntvf:1\ncell:B29:b::1::\ncell:C29:t:Buisness:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D29:vtf:n:780:sheet11!E12:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B30:b::1::\ncell:C30:t:Vacation:b::1::1:l:3:f:6:cf:2\ncell:D30:vtf:n:98:sheet11!E18:b::1::1:l:3:f:1:ntvf:1\ncell:E30:b::::1\ncell:B31:b::1::\ncell:C31:t:Miscellaneous:b::1:1:1:l:3:f:6:bg:5:cf:2\ncell:D31:vtf:n:222:sheet11!E26:b::1:1:1:l:3:f:1:bg:5:ntvf:1\ncell:E31:b::::1\ncell:C32:b:1:::\ncell:D32:b:1:::\ncol:A:w:60\ncol:B:w:20\ncol:C:w:151\ncol:D:w:89\ncol:E:w:20\ncol:F:w:54\ncol:G:w:95\ncol:H:w:96\ncol:I:w:88\ncol:J:w:47\nsheet:c:10:r:32:font:2\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,153,204)\ncolor:3:rgb(136,204,119)\ncolor:4:rgb(204,119,153)\ncolor:5:rgb(230,230,250)\ncolor:6:rgb(255, 255, 255)\nfont:1:* * Arial\nfont:2:* 12pt *\nfont:3:normal bold 12pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold large *\nfont:6:normal normal * Arial\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:1px 8px 1px *;vertical-align:middle;\nlayout:3:padding:1px 8px 1px 6px;vertical-align:middle;\nlayout:4:padding:3px 10px 3px 10px;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:text-html\n', - }, - name: "summary", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:8:cf:2:ntvf:2\ncell:B1:l:1:f:8:cf:2\ncell:C1:l:1:f:8:cf:2\ncell:D1:l:1:f:8:cf:2\ncell:E1:l:1:f:8:cf:2\ncell:F1:l:1:f:8:cf:2\ncell:G1:l:1:f:8:cf:2\ncell:H1:l:1:f:8:cf:2\ncell:I1:l:1:f:8:cf:2\ncell:J1:l:1:f:8:cf:2\ncell:K1:l:1:f:8:cf:2\ncell:L1:l:1:f:8:cf:2\ncell:M1:l:1:f:8:cf:2\ncell:N1:l:1:f:8:cf:2\ncell:O1:l:1:f:8:cf:2\ncell:P1:l:1:f:8:cf:2\ncell:Q1:l:1:f:8:cf:2\ncell:R1:l:1:f:8:cf:2\ncell:S1:l:1:f:8:cf:2\ncell:A2:l:1:f:8:cf:2\ncell:B2:l:1:f:8:cf:2\ncell:C2:l:1:f:8:cf:2\ncell:D2:l:1:f:8:cf:2\ncell:E2:l:1:f:8:cf:2\ncell:F2:l:1:f:8:cf:2\ncell:G2:l:1:f:8:cf:2\ncell:H2:l:1:f:8:cf:2\ncell:I2:l:1:f:8:cf:2\ncell:J2:l:1:f:8:cf:2\ncell:K2:l:1:f:8:cf:2\ncell:L2:l:1:f:8:cf:2\ncell:M2:l:1:f:8:cf:2\ncell:N2:l:1:f:8:cf:2\ncell:O2:l:1:f:8:cf:2\ncell:P2:l:1:f:8:cf:2\ncell:Q2:l:1:f:8:cf:2\ncell:R2:l:1:f:8:cf:2\ncell:S2:l:1:f:8:cf:2\ncell:A3:l:1:f:8:cf:2\ncell:B3:l:1:f:8:cf:2\ncell:C3:l:1:f:8:cf:2\ncell:D3:l:1:f:8:cf:2\ncell:E3:l:1:f:8:cf:2\ncell:F3:l:1:f:8:cf:2\ncell:G3:l:1:f:8:cf:2\ncell:H3:l:1:f:8:cf:2\ncell:I3:l:1:f:8:cf:2\ncell:J3:l:1:f:8:cf:2\ncell:K3:l:1:f:8:cf:2\ncell:L3:l:1:f:8:cf:2\ncell:M3:l:1:f:8:cf:2\ncell:N3:l:1:f:8:cf:2\ncell:O3:l:1:f:8:cf:2\ncell:P3:l:1:f:8:cf:2\ncell:Q3:l:1:f:8:cf:2\ncell:R3:l:1:f:8:cf:2\ncell:S3:l:1:f:8:cf:2\ncell:A4:l:1:f:8:cf:2\ncell:B4:l:1:f:8:cf:2\ncell:C4:l:1:f:8:cf:2\ncell:F4:l:1:f:8:cf:2\ncell:G4:l:1:f:8:cf:2\ncell:H4:l:1:f:8:cf:2\ncell:I4:l:1:f:8:cf:2\ncell:J4:l:1:f:8:cf:2\ncell:K4:l:1:f:8:cf:2\ncell:L4:l:1:f:8:cf:2\ncell:M4:t: :l:1:f:8:cf:2\ncell:N4:l:1:f:8:cf:2\ncell:O4:l:1:f:8:cf:2\ncell:P4:l:1:f:8:cf:2\ncell:Q4:l:1:f:8:cf:2\ncell:R4:l:1:f:8:cf:2\ncell:S4:l:1:f:8:cf:2\ncell:A5:l:1:f:8:cf:2\ncell:B5:t::l:2:f:5:cf:2\ncell:C5:t:Income:l:2:f:4:c:1:bg:7:cf:2\ncell:D5:t:Date:l:1:f:9:cf:2\ncell:E5:vtf:ndt:45465.92746829861:NOW():l:1:f:9:bg:6:cf:3:ntvf:3\ncell:F5:l:1:f:8:cf:2\ncell:G5:l:1:f:8:cf:2\ncell:H5:l:1:f:8:cf:2\ncell:I5:l:1:f:8:cf:2\ncell:J5:l:1:f:8:cf:2\ncell:K5:l:1:f:8:cf:2\ncell:L5:l:1:f:8:cf:2\ncell:M5:l:1:f:8:cf:2\ncell:N5:l:1:f:8:cf:2\ncell:O5:l:1:f:8:cf:2\ncell:P5:l:1:f:8:cf:2\ncell:Q5:l:1:f:8:cf:2\ncell:R5:l:1:f:8:cf:2\ncell:S5:l:1:f:8:cf:2\ncell:A6:l:1:f:8:cf:2\ncell:C6:t::l:2:f:8:cf:1\ncell:D6:l:1:f:8:cf:2\ncell:E6:l:1:f:8:cf:2\ncell:F6:l:1:f:8:cf:2\ncell:K6:t::l:2:f:3:cf:2\ncell:L6:t::l:2:f:8:cf:2\ncell:M6:t::l:2:f:8:cf:2\ncell:N6:t::l:2:f:8:cf:2\ncell:O6:l:1:f:8:cf:2\ncell:P6:l:1:f:8:cf:2\ncell:Q6:l:1:f:8:cf:2\ncell:R6:l:1:f:8:cf:2\ncell:S6:l:1:f:8:cf:2\ncell:A7:l:1:f:10:cf:2\ncell:B7:l:2:f:3:cf:2\ncell:F7:l:1:f:8:cf:2\ncell:K7:l:1:f:8:cf:2\ncell:L7:l:1:f:8:cf:2\ncell:M7:l:1:f:8:cf:2\ncell:N7:l:1:f:8:cf:2\ncell:O7:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:P7:t::l:1:f:8:cf:2\ncell:Q7:l:1:f:8:cf:2\ncell:R7:l:1:f:8:cf:2\ncell:S7:l:1:f:8:cf:2\ncell:A8:l:1:f:10:cf:2\ncell:C8:t:Source:l:2:f:2:c:7:bg:5:cf:1\ncell:D8:t:Monthly Budget:l:2:f:2:c:7:bg:4:cf:1\ncell:E8:t:Yearly Budget:l:2:f:2:c:7:bg:2:cf:1\ncell:F8:l:1:f:8:cf:2\ncell:K8:t::l:1:f:8:cf:2\ncell:L8:t::l:1:f:8:cf:2\ncell:M8:t::l:1:f:8:cf:2\ncell:N8:l:1:f:8:cf:2\ncell:O8:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:P8:t::l:1:f:8:cf:2\ncell:Q8:l:1:f:8:cf:2\ncell:R8:l:1:f:8:cf:2\ncell:S8:l:1:f:8:cf:2\ncell:B9:b::1:::l:1:f:8:cf:2\ncell:C9:t:Salary/Wages:b::1::1:l:5:f:7:cf:2\ncell:D9:v:20000:b::1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E9:vtf:n:240000:IF( (D9*12)=0,"",(D9*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F9:l:1:f:8:cf:2\ncell:K9:l:1:f:8:cf:2\ncell:L9:l:1:f:8:cf:2\ncell:M9:l:1:f:8:cf:2\ncell:N9:l:1:f:8:cf:2\ncell:O9:l:1:f:8:cf:2\ncell:P9:l:1:f:8:cf:2\ncell:Q9:l:1:f:8:cf:2\ncell:R9:l:1:f:8:cf:2\ncell:S9:l:1:f:8:cf:2\ncell:B10:b::1:::l:1:f:8:cf:2\ncell:C10:t:Contract Work:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D10:v:18012:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E10:vtf:n:216144:IF( (D10*12)=0,"",(D10*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F10:l:1:f:8:cf:2\ncell:G10:l:1:f:3:cf:3\ncell:H10:t::l:1:f:8:cf:3\ncell:I10:t::l:1:f:8:cf:3\ncell:J10:l:1:f:8:cf:2\ncell:K10:l:2:f:3:cf:2\ncell:L10:l:1:f:8:cf:2\ncell:M10:l:1:f:8:cf:2\ncell:N10:l:1:f:8:cf:2\ncell:O10:l:1:f:8:cf:2\ncell:P10:l:1:f:8:cf:2\ncell:Q10:l:1:f:8:cf:2\ncell:R10:l:1:f:8:cf:2\ncell:S10:l:1:f:8:cf:2\ncell:B11:b::1:::l:1:f:8:cf:2\ncell:C11:t:Bonuses:b::1::1:l:5:f:7:cf:2\ncell:D11:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E11:vtf:t::IF( (D11*12)=0,"",(D11*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F11:l:1:f:8:cf:2\ncell:G11:l:1:f:8:cf:2\ncell:H11:l:1:f:8:cf:2\ncell:I11:l:1:f:8:cf:2\ncell:J11:l:1:f:8:cf:2\ncell:K11:l:1:f:8:cf:2\ncell:L11:l:1:f:8:cf:2\ncell:M11:l:1:f:8:cf:2\ncell:N11:l:1:f:8:cf:2\ncell:O11:l:1:f:8:cf:2\ncell:P11:l:1:f:8:cf:2\ncell:Q11:l:1:f:8:cf:2\ncell:R11:l:1:f:8:cf:2\ncell:S11:l:1:f:8:cf:2\ncell:B12:b::1:::l:1:f:8:cf:2\ncell:C12:t:Commissions:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D12:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E12:vtf:t::IF( (D12*12)=0,"",(D12*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F12:l:1:f:8:cf:2\ncell:G12:l:1:f:8:cf:2\ncell:H12:l:1:f:8:cf:2\ncell:I12:l:1:f:8:cf:2\ncell:J12:l:1:f:8:cf:2\ncell:K12:l:1:f:8:cf:2\ncell:L12:l:1:f:8:cf:2\ncell:M12:l:1:f:8:cf:2\ncell:N12:l:1:f:8:cf:2\ncell:O12:l:1:f:8:cf:2\ncell:P12:l:1:f:8:cf:2\ncell:Q12:l:1:f:8:cf:2\ncell:R12:l:1:f:8:cf:2\ncell:S12:l:1:f:8:cf:2\ncell:B13:b::1:::l:1:f:8:cf:2\ncell:C13:t:Tips:b::1::1:l:5:f:7:cf:2\ncell:D13:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E13:vtf:t::IF( (D13*12)=0,"",(D13*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F13:l:1:f:8:cf:2\ncell:G13:l:1:f:8:cf:2\ncell:H13:t:Deductions:l:2:f:2:c:7:bg:5:cf:1:colspan:3\ncell:I13:l:1:f:8:c:7:cf:2\ncell:J13:l:1:f:8:c:7:cf:2\ncell:K13:t:Monthly Budget:l:2:f:2:c:7:bg:4:cf:1\ncell:L13:l:1:f:8:cf:2\ncell:M13:l:1:f:8:cf:2\ncell:N13:l:1:f:8:cf:2\ncell:O13:l:1:f:8:cf:2\ncell:P13:l:1:f:8:cf:2\ncell:Q13:l:1:f:8:cf:2\ncell:R13:l:1:f:8:cf:2\ncell:S13:l:1:f:8:cf:2\ncell:B14:b::1:::l:1:f:8:cf:2\ncell:C14:t:Interest Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D14:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E14:vtf:t::IF( (D14*12)=0,"",(D14*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F14:l:1:f:8:cf:2\ncell:G14:b::1:::l:1:f:8:cf:2\ncell:H14:t:Fedral Withholding Taxes:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I14:l:1:f:8:cf:2\ncell:J14:l:1:f:8:cf:2\ncell:K14:b::1::1:l:4:f:7:cf:3:ntvf:1\ncell:L14:b::::1:l:1:f:8:cf:2\ncell:M14:l:1:f:8:cf:2\ncell:N14:l:1:f:8:cf:2\ncell:O14:l:1:f:8:cf:2\ncell:P14:l:1:f:8:cf:2\ncell:Q14:l:1:f:8:cf:2\ncell:R14:l:1:f:8:cf:2\ncell:S14:l:1:f:8:cf:2\ncell:B15:b::1:::l:1:f:8:cf:2\ncell:C15:t:Investment Income:b::1::1:l:5:f:7:cf:2\ncell:D15:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E15:vtf:t::IF( (D15*12)=0,"",(D15*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F15:l:1:f:8:cf:2\ncell:G15:b::1:::l:1:f:8:cf:2\ncell:H15:t:State Withholding Taxes:b::1::1:l:5:f:7:bg:6:cf:2:colspan:3\ncell:I15:l:1:f:8:bg:6:cf:2\ncell:J15:l:1:f:8:bg:6:cf:2\ncell:K15:b::1::1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:L15:b::::1:l:1:f:8:cf:2\ncell:M15:l:1:f:8:cf:2\ncell:N15:l:1:f:8:cf:2\ncell:O15:l:1:f:8:cf:2\ncell:P15:l:1:f:8:cf:2\ncell:Q15:l:1:f:8:cf:2\ncell:R15:l:1:f:8:cf:2\ncell:S15:l:1:f:8:cf:2\ncell:B16:b::1:::l:1:f:8:cf:2\ncell:C16:t:Rental Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D16:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E16:vtf:t::IF( (D16*12)=0,"",(D16*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F16:b:1::::l:1:f:8:cf:2\ncell:G16:b:1:1:::l:1:f:8:cf:2\ncell:H16:t:Social Security:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I16:l:1:f:8:cf:2\ncell:J16:l:1:f:8:cf:2\ncell:K16:b::1::1:l:4:f:7:cf:3:ntvf:1\ncell:L16:b::::1:l:1:f:8:cf:2\ncell:M16:l:1:f:8:cf:2\ncell:N16:l:1:f:8:cf:2\ncell:O16:l:1:f:8:cf:2\ncell:P16:l:1:f:8:cf:2\ncell:Q16:l:1:f:8:cf:2\ncell:R16:l:1:f:8:cf:2\ncell:S16:l:1:f:8:cf:2\ncell:B17:b::1:::l:1:f:8:cf:2\ncell:C17:t:Pension Income:b::1::1:l:5:f:7:cf:2\ncell:D17:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E17:vtf:t::IF( (D17*12)=0,"",(D17*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F17:l:1:f:8:cf:2\ncell:G17:b::1:::l:1:f:8:cf:2\ncell:H17:t:Reteriment Account:b::1::1:l:5:f:7:bg:6:cf:2:colspan:3\ncell:I17:l:1:f:8:bg:6:cf:2\ncell:J17:l:1:f:8:bg:6:cf:2\ncell:K17:v:900:b::1::1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:L17:b::::1:l:1:f:8:cf:2\ncell:M17:l:1:f:8:cf:2\ncell:N17:l:1:f:8:cf:2\ncell:O17:l:1:f:8:cf:2\ncell:P17:l:1:f:8:cf:2\ncell:Q17:l:1:f:8:cf:2\ncell:R17:l:1:f:8:cf:2\ncell:S17:l:1:f:8:cf:2\ncell:B18:b::1:::l:1:f:8:cf:2\ncell:C18:t:Social Security Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D18:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E18:b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F18:l:1:f:8:cf:2\ncell:G18:b::1:::l:1:f:8:cf:2\ncell:H18:t:Other Deductions:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I18:b:::1::l:1:f:8:cf:2\ncell:J18:b:::1::l:1:f:8:cf:2\ncell:K18:b::1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:L18:b::::1:l:1:f:8:cf:2\ncell:M18:l:1:f:8:cf:2\ncell:N18:l:1:f:8:cf:2\ncell:O18:l:1:f:8:cf:2\ncell:P18:l:1:f:8:cf:2\ncell:Q18:l:1:f:8:cf:2\ncell:R18:l:1:f:8:cf:2\ncell:S18:l:1:f:8:cf:2\ncell:B19:b::1:::l:1:f:8:cf:2\ncell:C19:t:Alimony:b::1::1:l:5:f:7:cf:2\ncell:D19:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E19:vtf:t::IF( (D19*12)=0,"",(D19*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F19:l:1:f:8:cf:2\ncell:G19:l:1:f:8:cf:2\ncell:H19:t:Total:l:3:f:2:c:7:bg:3:cf:1:colspan:3\ncell:I19:l:1:f:8:c:7:bg:3:cf:2\ncell:J19:l:1:f:8:c:7:bg:3:cf:2\ncell:K19:vtf:n:900:SUM(K13\\cK18):l:4:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:L19:b:::1::l:1:f:8:cf:2\ncell:M19:l:1:f:8:cf:2\ncell:N19:l:1:f:8:cf:2\ncell:O19:l:1:f:8:cf:2\ncell:P19:l:1:f:8:cf:2\ncell:Q19:l:1:f:8:cf:2\ncell:R19:l:1:f:8:cf:2\ncell:S19:l:1:f:8:cf:2\ncell:B20:b::1:::l:1:f:8:cf:2\ncell:C20:t:Child Support:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D20:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E20:vtf:t::IF( (D20*12)=0,"",(D20*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F20:l:1:f:8:cf:2\ncell:G20:l:1:f:8:cf:2\ncell:H20:l:1:f:8:cf:2\ncell:I20:l:1:f:8:cf:2\ncell:J20:l:1:f:8:cf:2\ncell:K20:l:1:f:8:cf:2\ncell:L20:b:1:1:::l:1:f:8:cf:2\ncell:M20:b::::1:l:1:f:8:cf:2\ncell:N20:l:1:f:8:cf:2\ncell:O20:l:1:f:8:cf:2\ncell:P20:l:1:f:8:cf:2\ncell:Q20:l:1:f:8:cf:2\ncell:R20:l:1:f:8:cf:2\ncell:S20:l:1:f:8:cf:2\ncell:B21:b::1:::l:1:f:8:cf:2\ncell:C21:t:Other Income:b::1::1:l:5:f:7:cf:2\ncell:D21:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E21:vtf:t::IF( (D21*12)=0,"",(D21*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F21:l:1:f:8:cf:2\ncell:G21:l:1:f:8:cf:2\ncell:H21:l:1:f:8:cf:2\ncell:I21:l:1:f:8:cf:2\ncell:J21:l:3:f:2:cf:1\ncell:K21:l:1:f:8:cf:2\ncell:L21:b::1:1::l:1:f:8:cf:2\ncell:M21:b::::1:l:1:f:8:cf:2\ncell:N21:l:1:f:8:cf:2\ncell:O21:l:1:f:8:cf:2\ncell:P21:l:1:f:8:cf:2\ncell:Q21:l:1:f:8:cf:2\ncell:R21:l:1:f:8:cf:2\ncell:S21:l:1:f:8:cf:2\ncell:B22:b::1:::l:1:f:8:cf:2\ncell:C22:t:Deduction:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D22:vtf:n:900:K19:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E22:vtf:n:10800:IF( (D22*12)=0,"",(D22*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F22:b:1::::l:1:f:8:cf:2\ncell:G22:b:1::::l:1:f:8:cf:2\ncell:H22:b:1::::l:1:f:8:cf:2\ncell:I22:b:1::::l:1:f:8:cf:2\ncell:J22:b:1::::l:1:f:8:cf:2\ncell:K22:b:1::::l:1:f:8:cf:2\ncell:L22:l:1:f:8:cf:2\ncell:M22:l:1:f:8:cf:2\ncell:N22:l:1:f:8:cf:2\ncell:O22:l:1:f:8:cf:2\ncell:P22:l:1:f:8:cf:2\ncell:Q22:l:1:f:8:cf:2\ncell:R22:l:1:f:8:cf:2\ncell:S22:l:1:f:8:cf:2\ncell:B23:l:1:f:8:cf:2\ncell:C23:t:Total Take Home Income:l:3:f:2:c:7:bg:3:cf:1\ncell:D23:vtf:n:37112:(SUM(D9\\cD21)-D22):l:3:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:E23:vtf:n:445344:IF( (D23*12)=0,"",(D23*12)):l:3:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:F23:l:1:f:8:cf:2\ncell:G23:l:1:f:8:cf:2\ncell:H23:l:1:f:8:cf:2\ncell:I23:l:1:f:8:cf:2\ncell:J23:l:1:f:8:cf:2\ncell:K23:l:1:f:8:cf:2\ncell:L23:l:1:f:8:cf:2\ncell:M23:l:1:f:8:cf:2\ncell:N23:l:1:f:8:cf:2\ncell:O23:l:1:f:8:cf:2\ncell:P23:l:1:f:8:cf:2\ncell:Q23:l:1:f:8:cf:2\ncell:R23:l:1:f:8:cf:2\ncell:S23:l:1:f:8:cf:2\ncell:B24:l:1:f:8:cf:2\ncell:F24:l:1:f:8:cf:2\ncell:G24:l:1:f:8:cf:2\ncell:H24:l:1:f:8:cf:2\ncell:I24:l:1:f:8:cf:2\ncell:J24:l:1:f:8:cf:2\ncell:K24:l:1:f:8:cf:2\ncell:L24:l:1:f:8:cf:2\ncell:M24:l:1:f:8:cf:2\ncell:N24:l:1:f:8:cf:2\ncell:O24:l:1:f:8:cf:2\ncell:P24:l:1:f:8:cf:2\ncell:Q24:l:1:f:8:cf:2\ncell:R24:l:1:f:8:cf:2\ncell:S24:l:1:f:8:cf:2\ncell:A25:l:1:f:10:cf:2\ncell:B25:l:1:f:6:cf:2\ncell:C25:l:1:f:11:cf:2\ncell:D25:l:1:f:11:cf:2\ncell:E25:l:1:f:8:cf:2\ncell:F25:l:1:f:8:cf:2\ncell:G25:l:1:f:8:cf:2\ncell:H25:l:1:f:8:cf:2\ncell:I25:l:1:f:8:cf:2\ncell:J25:l:1:f:8:cf:2\ncell:K25:l:1:f:8:cf:2\ncell:L25:l:1:f:8:cf:2\ncell:M25:l:1:f:8:cf:2\ncell:N25:l:1:f:8:cf:2\ncell:O25:l:1:f:8:cf:2\ncell:P25:l:1:f:8:cf:2\ncell:Q25:l:1:f:8:cf:2\ncell:R25:l:1:f:8:cf:2\ncell:S25:l:1:f:8:cf:2\ncell:A26:l:1:f:10:cf:2\ncell:B26:l:1:f:6:cf:2\ncell:C26:l:1:f:6:cf:2\ncell:D26:l:1:f:11:cf:2\ncell:E26:l:1:f:11:cf:2\ncell:F26:l:1:f:11:cf:2\ncell:G26:l:1:f:11:cf:2\ncell:H26:l:1:f:8:cf:2\ncell:I26:l:1:f:8:cf:2\ncell:J26:l:1:f:8:cf:2\ncell:K26:l:1:f:8:cf:2\ncell:L26:l:1:f:8:cf:2\ncell:M26:l:1:f:8:cf:2\ncell:N26:l:1:f:8:cf:2\ncell:O26:l:1:f:8:cf:2\ncell:P26:l:1:f:8:cf:2\ncell:Q26:l:1:f:8:cf:2\ncell:R26:l:1:f:8:cf:2\ncell:S26:l:1:f:8:cf:2\ncell:L27:l:1:f:8:cf:2\ncell:M27:l:1:f:8:cf:2\ncell:N27:l:1:f:8:cf:2\ncell:O27:l:1:f:8:cf:2\ncell:P27:l:1:f:8:cf:2\ncell:Q27:l:1:f:8:cf:2\ncell:R27:l:1:f:8:cf:2\ncell:S27:l:1:f:8:cf:2\ncell:L28:l:1:f:8:cf:2\ncell:M28:l:1:f:8:cf:2\ncell:N28:l:1:f:8:cf:2\ncell:O28:l:1:f:8:cf:2\ncell:P28:l:1:f:8:cf:2\ncell:Q28:l:1:f:8:cf:2\ncell:R28:l:1:f:8:cf:2\ncell:S28:l:1:f:8:cf:2\ncell:L29:l:1:f:8:cf:2\ncell:M29:l:1:f:8:cf:2\ncell:N29:l:1:f:8:cf:2\ncell:O29:l:1:f:8:cf:2\ncell:P29:l:1:f:8:cf:2\ncell:Q29:l:1:f:8:cf:2\ncell:R29:l:1:f:8:cf:2\ncell:S29:l:1:f:8:cf:2\ncell:L30:l:1:f:8:cf:2\ncell:M30:l:1:f:8:cf:2\ncell:N30:l:1:f:8:cf:2\ncell:O30:l:1:f:8:cf:2\ncell:P30:l:1:f:8:cf:2\ncell:Q30:l:1:f:8:cf:2\ncell:R30:l:1:f:8:cf:2\ncell:S30:l:1:f:8:cf:2\ncell:L31:l:1:f:8:cf:2\ncell:M31:l:1:f:8:cf:2\ncell:N31:l:1:f:8:cf:2\ncell:L32:l:1:f:8:cf:2\ncell:M32:l:1:f:8:cf:2\ncell:N32:l:1:f:8:cf:2\ncell:L33:l:1:f:8:cf:2\ncell:M33:l:1:f:8:cf:2\ncell:N33:l:1:f:8:cf:2\ncell:L34:l:1:f:8:cf:2\ncell:M34:l:1:f:8:cf:2\ncell:N34:l:1:f:8:cf:2\ncell:L35:l:1:f:8:cf:2\ncell:M35:l:1:f:8:cf:2\ncell:N35:l:1:f:8:cf:2\ncell:L36:l:1:f:8:cf:2\ncell:M36:l:1:f:8:cf:2\ncell:N36:l:1:f:8:cf:2\ncell:L37:l:1:f:8:cf:2\ncell:M37:l:1:f:8:cf:2\ncell:N37:l:1:f:8:cf:2\ncell:L38:l:1:f:8:cf:2\ncell:M38:l:1:f:8:cf:2\ncell:N38:l:1:f:8:cf:2\ncell:L39:l:1:f:8:cf:2\ncell:M39:l:1:f:8:cf:2\ncell:N39:l:1:f:8:cf:2\ncell:L40:l:1:f:8:cf:2\ncell:M40:l:1:f:8:cf:2\ncell:N40:l:1:f:8:cf:2\ncell:L41:l:1:f:8:cf:2\ncell:M41:l:1:f:8:cf:2\ncell:N41:l:1:f:8:cf:2\ncell:L42:l:1:f:8:cf:2\ncell:M42:l:1:f:8:cf:2\ncell:N42:l:1:f:8:cf:2\ncell:L43:l:1:f:8:cf:2\ncell:M43:l:1:f:8:cf:2\ncell:N43:l:1:f:8:cf:2\ncell:L44:l:1:f:8:cf:2\ncell:M44:l:1:f:8:cf:2\ncell:N44:l:1:f:8:cf:2\ncell:O44:l:1:f:8:cf:2\ncell:P44:l:1:f:8:cf:2\ncell:Q44:l:1:f:8:cf:2\ncell:R44:l:1:f:8:cf:2\ncell:S44:l:1:f:8:cf:2\ncell:L45:l:1:f:8:cf:2\ncell:M45:l:1:f:8:cf:2\ncell:N45:l:1:f:8:cf:2\ncell:O45:l:1:f:8:cf:2\ncell:P45:l:1:f:8:cf:2\ncell:Q45:l:1:f:8:cf:2\ncell:R45:l:1:f:8:cf:2\ncell:S45:l:1:f:8:cf:2\ncell:L46:l:1:f:8:cf:2\ncell:M46:l:1:f:8:cf:2\ncell:N46:l:1:f:8:cf:2\ncell:O46:l:1:f:8:cf:2\ncell:P46:l:1:f:8:cf:2\ncell:Q46:l:1:f:8:cf:2\ncell:R46:l:1:f:8:cf:2\ncell:S46:l:1:f:8:cf:2\ncell:L47:l:1:f:8:cf:2\ncell:M47:l:1:f:8:cf:2\ncell:N47:l:1:f:8:cf:2\ncell:O47:l:1:f:8:cf:2\ncell:P47:l:1:f:8:cf:2\ncell:Q47:l:1:f:8:cf:2\ncell:R47:l:1:f:8:cf:2\ncell:S47:l:1:f:8:cf:2\ncell:L48:l:1:f:8:cf:2\ncell:M48:l:1:f:8:cf:2\ncell:N48:l:1:f:8:cf:2\ncell:O48:l:1:f:8:cf:2\ncell:P48:l:1:f:8:cf:2\ncell:Q48:l:1:f:8:cf:2\ncell:R48:l:1:f:8:cf:2\ncell:S48:l:1:f:8:cf:2\ncell:L49:l:1:f:8:cf:2\ncell:M49:l:1:f:8:cf:2\ncell:N49:l:1:f:8:cf:2\ncell:O49:l:1:f:8:cf:2\ncell:P49:l:1:f:8:cf:2\ncell:Q49:l:1:f:8:cf:2\ncell:R49:l:1:f:8:cf:2\ncell:S49:l:1:f:8:cf:2\ncell:L50:l:1:f:8:cf:2\ncell:M50:l:1:f:8:cf:2\ncell:N50:l:1:f:8:cf:2\ncell:O50:l:1:f:8:cf:2\ncell:P50:l:1:f:8:cf:2\ncell:Q50:l:1:f:8:cf:2\ncell:R50:l:1:f:8:cf:2\ncell:S50:l:1:f:8:cf:2\ncell:L51:l:1:f:8:cf:2\ncell:M51:l:1:f:8:cf:2\ncell:N51:l:1:f:8:cf:2\ncell:O51:l:1:f:8:cf:2\ncell:P51:l:1:f:8:cf:2\ncell:Q51:l:1:f:8:cf:2\ncell:R51:l:1:f:8:cf:2\ncell:S51:l:1:f:8:cf:2\ncell:L52:l:1:f:8:cf:2\ncell:M52:l:1:f:8:cf:2\ncell:N52:l:1:f:8:cf:2\ncell:O52:l:1:f:8:cf:2\ncell:P52:l:1:f:8:cf:2\ncell:Q52:l:1:f:8:cf:2\ncell:R52:l:1:f:8:cf:2\ncell:S52:l:1:f:8:cf:2\ncell:L53:l:1:f:8:cf:2\ncell:M53:l:1:f:8:cf:2\ncell:N53:l:1:f:8:cf:2\ncell:O53:l:1:f:8:cf:2\ncell:P53:l:1:f:8:cf:2\ncell:Q53:l:1:f:8:cf:2\ncell:R53:l:1:f:8:cf:2\ncell:S53:l:1:f:8:cf:2\ncell:L54:l:1:f:8:cf:2\ncell:M54:l:1:f:8:cf:2\ncell:N54:l:1:f:8:cf:2\ncell:O54:l:1:f:8:cf:2\ncell:P54:l:1:f:8:cf:2\ncell:Q54:l:1:f:8:cf:2\ncell:R54:l:1:f:8:cf:2\ncell:S54:l:1:f:8:cf:2\ncell:L55:l:1:f:8:cf:2\ncell:M55:l:1:f:8:cf:2\ncell:N55:l:1:f:8:cf:2\ncell:O55:l:1:f:8:cf:2\ncell:P55:l:1:f:8:cf:2\ncell:Q55:l:1:f:8:cf:2\ncell:R55:l:1:f:8:cf:2\ncell:S55:l:1:f:8:cf:2\ncell:L56:l:1:f:8:cf:2\ncell:M56:l:1:f:8:cf:2\ncell:N56:l:1:f:8:cf:2\ncell:O56:l:1:f:8:cf:2\ncell:P56:l:1:f:8:cf:2\ncell:Q56:l:1:f:8:cf:2\ncell:R56:l:1:f:8:cf:2\ncell:S56:l:1:f:8:cf:2\ncell:L57:l:1:f:8:cf:2\ncell:M57:l:1:f:8:cf:2\ncell:N57:l:1:f:8:cf:2\ncell:O57:l:1:f:8:cf:2\ncell:P57:l:1:f:8:cf:2\ncell:Q57:l:1:f:8:cf:2\ncell:R57:l:1:f:8:cf:2\ncell:S57:l:1:f:8:cf:2\ncell:L58:l:1:f:8:cf:2\ncell:M58:l:1:f:8:cf:2\ncell:N58:l:1:f:8:cf:2\ncell:O58:l:1:f:8:cf:2\ncell:P58:l:1:f:8:cf:2\ncell:Q58:l:1:f:8:cf:2\ncell:R58:l:1:f:8:cf:2\ncell:S58:l:1:f:8:cf:2\ncell:L59:l:1:f:8:cf:2\ncell:M59:l:1:f:8:cf:2\ncell:N59:l:1:f:8:cf:2\ncell:O59:l:1:f:8:cf:2\ncell:P59:l:1:f:8:cf:2\ncell:Q59:l:1:f:8:cf:2\ncell:R59:l:1:f:8:cf:2\ncell:S59:l:1:f:8:cf:2\ncell:L60:l:1:f:8:cf:2\ncell:M60:l:1:f:8:cf:2\ncell:N60:l:1:f:8:cf:2\ncell:O60:l:1:f:8:cf:2\ncell:P60:l:1:f:8:cf:2\ncell:Q60:l:1:f:8:cf:2\ncell:R60:l:1:f:8:cf:2\ncell:S60:l:1:f:8:cf:2\ncell:L61:l:1:f:8:cf:2\ncell:M61:l:1:f:8:cf:2\ncell:N61:l:1:f:8:cf:2\ncell:O61:l:1:f:8:cf:2\ncell:P61:l:1:f:8:cf:2\ncell:Q61:l:1:f:8:cf:2\ncell:R61:l:1:f:8:cf:2\ncell:S61:l:1:f:8:cf:2\ncell:L62:l:1:f:8:cf:2\ncell:M62:l:1:f:8:cf:2\ncell:N62:l:1:f:8:cf:2\ncell:O62:l:1:f:8:cf:2\ncell:P62:l:1:f:8:cf:2\ncell:Q62:l:1:f:8:cf:2\ncell:R62:l:1:f:8:cf:2\ncell:S62:l:1:f:8:cf:2\ncell:L63:l:1:f:8:cf:2\ncell:M63:l:1:f:8:cf:2\ncell:N63:l:1:f:8:cf:2\ncell:O63:l:1:f:8:cf:2\ncell:P63:l:1:f:8:cf:2\ncell:Q63:l:1:f:8:cf:2\ncell:R63:l:1:f:8:cf:2\ncell:S63:l:1:f:8:cf:2\ncell:L64:l:1:f:8:cf:2\ncell:M64:l:1:f:8:cf:2\ncell:N64:l:1:f:8:cf:2\ncell:O64:l:1:f:8:cf:2\ncell:P64:l:1:f:8:cf:2\ncell:Q64:l:1:f:8:cf:2\ncell:R64:l:1:f:8:cf:2\ncell:S64:l:1:f:8:cf:2\ncell:L65:l:1:f:8:cf:2\ncell:M65:l:1:f:8:cf:2\ncell:N65:l:1:f:8:cf:2\ncell:O65:l:1:f:8:cf:2\ncell:P65:l:1:f:8:cf:2\ncell:Q65:l:1:f:8:cf:2\ncell:R65:l:1:f:8:cf:2\ncell:S65:l:1:f:8:cf:2\ncell:L66:l:1:f:8:cf:2\ncell:M66:l:1:f:8:cf:2\ncell:N66:l:1:f:8:cf:2\ncell:O66:l:1:f:8:cf:2\ncell:P66:l:1:f:8:cf:2\ncell:Q66:l:1:f:8:cf:2\ncell:R66:l:1:f:8:cf:2\ncell:S66:l:1:f:8:cf:2\ncell:L67:l:1:f:8:cf:2\ncell:M67:l:1:f:8:cf:2\ncell:N67:l:1:f:8:cf:2\ncell:O67:l:1:f:8:cf:2\ncell:P67:l:1:f:8:cf:2\ncell:Q67:l:1:f:8:cf:2\ncell:R67:l:1:f:8:cf:2\ncell:S67:l:1:f:8:cf:2\ncell:L68:l:1:f:8:cf:2\ncell:M68:l:1:f:8:cf:2\ncell:N68:l:1:f:8:cf:2\ncell:O68:l:1:f:8:cf:2\ncell:P68:l:1:f:8:cf:2\ncell:Q68:l:1:f:8:cf:2\ncell:R68:l:1:f:8:cf:2\ncell:S68:l:1:f:8:cf:2\ncell:L69:l:1:f:8:cf:2\ncell:M69:l:1:f:8:cf:2\ncell:N69:l:1:f:8:cf:2\ncell:O69:l:1:f:8:cf:2\ncell:P69:l:1:f:8:cf:2\ncell:Q69:l:1:f:8:cf:2\ncell:R69:l:1:f:8:cf:2\ncell:S69:l:1:f:8:cf:2\ncell:L70:l:1:f:8:cf:2\ncell:M70:l:1:f:8:cf:2\ncell:N70:l:1:f:8:cf:2\ncell:O70:l:1:f:8:cf:2\ncell:P70:l:1:f:8:cf:2\ncell:Q70:l:1:f:8:cf:2\ncell:R70:l:1:f:8:cf:2\ncell:S70:l:1:f:8:cf:2\ncell:L71:l:1:f:8:cf:2\ncell:M71:l:1:f:8:cf:2\ncell:N71:l:1:f:8:cf:2\ncell:O71:l:1:f:8:cf:2\ncell:P71:l:1:f:8:cf:2\ncell:Q71:l:1:f:8:cf:2\ncell:R71:l:1:f:8:cf:2\ncell:S71:l:1:f:8:cf:2\ncell:L72:l:1:f:8:cf:2\ncell:M72:l:1:f:8:cf:2\ncell:N72:l:1:f:8:cf:2\ncell:O72:l:1:f:8:cf:2\ncell:P72:l:1:f:8:cf:2\ncell:Q72:l:1:f:8:cf:2\ncell:R72:l:1:f:8:cf:2\ncell:S72:l:1:f:8:cf:2\ncell:L73:l:1:f:8:cf:2\ncell:M73:l:1:f:8:cf:2\ncell:N73:l:1:f:8:cf:2\ncell:O73:l:1:f:8:cf:2\ncell:P73:l:1:f:8:cf:2\ncell:Q73:l:1:f:8:cf:2\ncell:R73:l:1:f:8:cf:2\ncell:S73:l:1:f:8:cf:2\ncell:L74:l:1:f:8:cf:2\ncell:M74:l:1:f:8:cf:2\ncell:N74:l:1:f:8:cf:2\ncell:O74:l:1:f:8:cf:2\ncell:P74:l:1:f:8:cf:2\ncell:Q74:l:1:f:8:cf:2\ncell:R74:l:1:f:8:cf:2\ncell:S74:l:1:f:8:cf:2\ncell:L75:l:1:f:8:cf:2\ncell:M75:l:1:f:8:cf:2\ncell:N75:l:1:f:8:cf:2\ncell:O75:l:1:f:8:cf:2\ncell:P75:l:1:f:8:cf:2\ncell:Q75:l:1:f:8:cf:2\ncell:R75:l:1:f:8:cf:2\ncell:S75:l:1:f:8:cf:2\ncell:L76:l:1:f:8:cf:2\ncell:M76:l:1:f:8:cf:2\ncell:N76:l:1:f:8:cf:2\ncell:O76:l:1:f:8:cf:2\ncell:P76:l:1:f:8:cf:2\ncell:Q76:l:1:f:8:cf:2\ncell:R76:l:1:f:8:cf:2\ncell:S76:l:1:f:8:cf:2\ncell:L77:l:1:f:8:cf:2\ncell:M77:l:1:f:8:cf:2\ncell:N77:l:1:f:8:cf:2\ncell:O77:l:1:f:8:cf:2\ncell:P77:l:1:f:8:cf:2\ncell:Q77:l:1:f:8:cf:2\ncell:R77:l:1:f:8:cf:2\ncell:S77:l:1:f:8:cf:2\ncell:L78:l:1:f:8:cf:2\ncell:M78:l:1:f:8:cf:2\ncell:N78:l:1:f:8:cf:2\ncell:O78:l:1:f:8:cf:2\ncell:P78:l:1:f:8:cf:2\ncell:Q78:l:1:f:8:cf:2\ncell:R78:l:1:f:8:cf:2\ncell:S78:l:1:f:8:cf:2\ncell:L79:l:1:f:8:cf:2\ncell:M79:l:1:f:8:cf:2\ncell:N79:l:1:f:8:cf:2\ncell:O79:l:1:f:8:cf:2\ncell:P79:l:1:f:8:cf:2\ncell:Q79:l:1:f:8:cf:2\ncell:R79:l:1:f:8:cf:2\ncell:S79:l:1:f:8:cf:2\ncell:L80:l:1:f:8:cf:2\ncell:M80:l:1:f:8:cf:2\ncell:N80:l:1:f:8:cf:2\ncell:O80:l:1:f:8:cf:2\ncell:P80:l:1:f:8:cf:2\ncell:Q80:l:1:f:8:cf:2\ncell:R80:l:1:f:8:cf:2\ncell:S80:l:1:f:8:cf:2\ncell:L81:l:1:f:8:cf:2\ncell:M81:l:1:f:8:cf:2\ncell:N81:l:1:f:8:cf:2\ncell:O81:l:1:f:8:cf:2\ncell:P81:l:1:f:8:cf:2\ncell:Q81:l:1:f:8:cf:2\ncell:R81:l:1:f:8:cf:2\ncell:S81:l:1:f:8:cf:2\ncell:L82:l:1:f:8:cf:2\ncell:M82:l:1:f:8:cf:2\ncell:N82:l:1:f:8:cf:2\ncell:O82:l:1:f:8:cf:2\ncell:P82:l:1:f:8:cf:2\ncell:Q82:l:1:f:8:cf:2\ncell:R82:l:1:f:8:cf:2\ncell:S82:l:1:f:8:cf:2\ncell:L83:l:1:f:8:cf:2\ncell:M83:l:1:f:8:cf:2\ncell:N83:l:1:f:8:cf:2\ncell:O83:l:1:f:8:cf:2\ncell:P83:l:1:f:8:cf:2\ncell:Q83:l:1:f:8:cf:2\ncell:R83:l:1:f:8:cf:2\ncell:S83:l:1:f:8:cf:2\ncell:L84:l:1:f:8:cf:2\ncell:M84:l:1:f:8:cf:2\ncell:N84:l:1:f:8:cf:2\ncell:O84:l:1:f:8:cf:2\ncell:P84:l:1:f:8:cf:2\ncell:Q84:l:1:f:8:cf:2\ncell:R84:l:1:f:8:cf:2\ncell:S84:l:1:f:8:cf:2\ncell:L85:l:1:f:8:cf:2\ncell:M85:l:1:f:8:cf:2\ncell:N85:l:1:f:8:cf:2\ncell:O85:l:1:f:8:cf:2\ncell:P85:l:1:f:8:cf:2\ncell:Q85:l:1:f:8:cf:2\ncell:R85:l:1:f:8:cf:2\ncell:S85:l:1:f:8:cf:2\ncell:L86:l:1:f:8:cf:2\ncell:M86:l:1:f:8:cf:2\ncell:N86:l:1:f:8:cf:2\ncell:O86:l:1:f:8:cf:2\ncell:P86:l:1:f:8:cf:2\ncell:Q86:l:1:f:8:cf:2\ncell:R86:l:1:f:8:cf:2\ncell:S86:l:1:f:8:cf:2\ncell:L87:l:1:f:8:cf:2\ncell:M87:l:1:f:8:cf:2\ncell:N87:l:1:f:8:cf:2\ncell:O87:l:1:f:8:cf:2\ncell:P87:l:1:f:8:cf:2\ncell:Q87:l:1:f:8:cf:2\ncell:R87:l:1:f:8:cf:2\ncell:S87:l:1:f:8:cf:2\ncell:L88:l:1:f:8:cf:2\ncell:M88:l:1:f:8:cf:2\ncell:N88:l:1:f:8:cf:2\ncell:O88:l:1:f:8:cf:2\ncell:P88:l:1:f:8:cf:2\ncell:Q88:l:1:f:8:cf:2\ncell:R88:l:1:f:8:cf:2\ncell:S88:l:1:f:8:cf:2\ncell:L89:l:1:f:8:cf:2\ncell:M89:l:1:f:8:cf:2\ncell:N89:l:1:f:8:cf:2\ncell:O89:l:1:f:8:cf:2\ncell:P89:l:1:f:8:cf:2\ncell:Q89:l:1:f:8:cf:2\ncell:R89:l:1:f:8:cf:2\ncell:S89:l:1:f:8:cf:2\ncell:L90:l:1:f:8:cf:2\ncell:M90:l:1:f:8:cf:2\ncell:N90:l:1:f:8:cf:2\ncell:O90:l:1:f:8:cf:2\ncell:P90:l:1:f:8:cf:2\ncell:Q90:l:1:f:8:cf:2\ncell:R90:l:1:f:8:cf:2\ncell:S90:l:1:f:8:cf:2\ncell:L91:l:1:f:8:cf:2\ncell:M91:l:1:f:8:cf:2\ncell:N91:l:1:f:8:cf:2\ncell:O91:l:1:f:8:cf:2\ncell:P91:l:1:f:8:cf:2\ncell:Q91:l:1:f:8:cf:2\ncell:R91:l:1:f:8:cf:2\ncell:S91:l:1:f:8:cf:2\ncell:L92:l:1:f:8:cf:2\ncell:M92:l:1:f:8:cf:2\ncell:N92:l:1:f:8:cf:2\ncell:O92:l:1:f:8:cf:2\ncell:P92:l:1:f:8:cf:2\ncell:Q92:l:1:f:8:cf:2\ncell:R92:l:1:f:8:cf:2\ncell:S92:l:1:f:8:cf:2\ncell:L93:l:1:f:8:cf:2\ncell:M93:l:1:f:8:cf:2\ncell:N93:l:1:f:8:cf:2\ncell:O93:l:1:f:8:cf:2\ncell:P93:l:1:f:8:cf:2\ncell:Q93:l:1:f:8:cf:2\ncell:R93:l:1:f:8:cf:2\ncell:S93:l:1:f:8:cf:2\ncell:L94:l:1:f:8:cf:2\ncell:M94:l:1:f:8:cf:2\ncell:N94:l:1:f:8:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:S94:l:1:f:8:cf:2\ncell:L95:l:1:f:8:cf:2\ncell:M95:l:1:f:8:cf:2\ncell:N95:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:S95:l:1:f:8:cf:2\ncell:L96:l:1:f:10:cf:2\ncell:M96:l:1:f:10:cf:2\ncell:N96:l:1:f:10:cf:2\ncell:O96:l:1:f:10:cf:2\ncell:P96:l:1:f:10:cf:2\ncell:Q96:l:1:f:10:cf:2\ncell:R96:l:1:f:10:cf:2\ncell:S96:l:1:f:10:cf:2\ncell:L97:l:1:f:10:cf:2\ncell:M97:l:1:f:10:cf:2\ncell:N97:l:1:f:10:cf:2\ncell:O97:l:1:f:10:cf:2\ncell:P97:l:1:f:10:cf:2\ncell:Q97:l:1:f:10:cf:2\ncell:R97:l:1:f:10:cf:2\ncell:S97:l:1:f:10:cf:2\ncell:L98:l:1:f:10:cf:2\ncell:M98:l:1:f:10:cf:2\ncell:N98:l:1:f:10:cf:2\ncell:O98:l:1:f:10:cf:2\ncell:P98:l:1:f:10:cf:2\ncell:Q98:l:1:f:10:cf:2\ncell:R98:l:1:f:10:cf:2\ncell:S98:l:1:f:10:cf:2\ncell:L99:l:1:f:10:cf:2\ncell:M99:l:1:f:10:cf:2\ncell:N99:l:1:f:10:cf:2\ncell:O99:l:1:f:10:cf:2\ncell:P99:l:1:f:10:cf:2\ncell:Q99:l:1:f:10:cf:2\ncell:R99:l:1:f:10:cf:2\ncell:S99:l:1:f:10:cf:2\ncell:A100:l:1:f:10:cf:2\ncell:B100:l:1:f:10:cf:2\ncell:K100:l:1:f:10:cf:2\ncell:L100:l:1:f:10:cf:2\ncell:M100:l:1:f:10:cf:2\ncell:N100:l:1:f:10:cf:2\ncell:O100:l:1:f:10:cf:2\ncell:P100:l:1:f:10:cf:2\ncell:Q100:l:1:f:10:cf:2\ncell:R100:l:1:f:10:cf:2\ncell:S100:l:1:f:10:cf:2\ncell:A101:l:1:f:10:cf:2\ncell:B101:l:1:f:10:cf:2\ncell:K101:l:1:f:10:cf:2\ncell:L101:l:1:f:10:cf:2\ncell:M101:l:1:f:10:cf:2\ncell:N101:l:1:f:10:cf:2\ncell:O101:l:1:f:10:cf:2\ncell:P101:l:1:f:10:cf:2\ncell:Q101:l:1:f:10:cf:2\ncell:R101:l:1:f:10:cf:2\ncell:S101:l:1:f:10:cf:2\ncell:A102:l:1:f:10:cf:2\ncell:B102:l:1:f:10:cf:2\ncell:K102:l:1:f:10:cf:2\ncell:L102:l:1:f:10:cf:2\ncell:M102:l:1:f:10:cf:2\ncell:N102:l:1:f:10:cf:2\ncell:O102:l:1:f:10:cf:2\ncell:P102:l:1:f:10:cf:2\ncell:Q102:l:1:f:10:cf:2\ncell:R102:l:1:f:10:cf:2\ncell:S102:l:1:f:10:cf:2\ncell:A103:l:1:f:10:cf:2\ncell:B103:l:1:f:10:cf:2\ncell:K103:l:1:f:10:cf:2\ncell:L103:l:1:f:10:cf:2\ncell:M103:l:1:f:10:cf:2\ncell:N103:l:1:f:10:cf:2\ncell:O103:l:1:f:10:cf:2\ncell:P103:l:1:f:10:cf:2\ncell:Q103:l:1:f:10:cf:2\ncell:R103:l:1:f:10:cf:2\ncell:S103:l:1:f:10:cf:2\ncell:A104:l:1:f:10:cf:2\ncell:B104:l:1:f:10:cf:2\ncell:K104:l:1:f:10:cf:2\ncell:L104:l:1:f:10:cf:2\ncell:M104:l:1:f:10:cf:2\ncell:N104:l:1:f:10:cf:2\ncell:O104:l:1:f:10:cf:2\ncell:P104:l:1:f:10:cf:2\ncell:Q104:l:1:f:10:cf:2\ncell:R104:l:1:f:10:cf:2\ncell:S104:l:1:f:10:cf:2\ncell:A105:l:1:f:10:cf:2\ncell:B105:l:1:f:10:cf:2\ncell:K105:l:1:f:10:cf:2\ncell:L105:l:1:f:10:cf:2\ncell:M105:l:1:f:10:cf:2\ncell:N105:l:1:f:10:cf:2\ncell:O105:l:1:f:10:cf:2\ncell:P105:l:1:f:10:cf:2\ncell:Q105:l:1:f:10:cf:2\ncell:R105:l:1:f:10:cf:2\ncell:S105:l:1:f:10:cf:2\ncell:A106:l:1:f:10:cf:2\ncell:B106:l:1:f:10:cf:2\ncell:K106:l:1:f:10:cf:2\ncell:L106:l:1:f:10:cf:2\ncell:M106:l:1:f:10:cf:2\ncell:N106:l:1:f:10:cf:2\ncell:O106:l:1:f:10:cf:2\ncell:P106:l:1:f:10:cf:2\ncell:Q106:l:1:f:10:cf:2\ncell:R106:l:1:f:10:cf:2\ncell:S106:l:1:f:10:cf:2\ncell:A107:l:1:f:10:cf:2\ncell:B107:l:1:f:10:cf:2\ncell:K107:l:1:f:10:cf:2\ncell:L107:l:1:f:10:cf:2\ncell:M107:l:1:f:10:cf:2\ncell:N107:l:1:f:10:cf:2\ncell:O107:l:1:f:10:cf:2\ncell:P107:l:1:f:10:cf:2\ncell:Q107:l:1:f:10:cf:2\ncell:R107:l:1:f:10:cf:2\ncell:S107:l:1:f:10:cf:2\ncell:A108:l:1:f:10:cf:2\ncell:B108:l:1:f:10:cf:2\ncell:K108:l:1:f:10:cf:2\ncell:L108:l:1:f:10:cf:2\ncell:M108:l:1:f:10:cf:2\ncell:N108:l:1:f:10:cf:2\ncell:O108:l:1:f:10:cf:2\ncell:P108:l:1:f:10:cf:2\ncell:Q108:l:1:f:10:cf:2\ncell:R108:l:1:f:10:cf:2\ncell:S108:l:1:f:10:cf:2\ncell:A109:l:1:f:10:cf:2\ncell:B109:l:1:f:10:cf:2\ncell:K109:l:1:f:10:cf:2\ncell:L109:l:1:f:10:cf:2\ncell:M109:l:1:f:10:cf:2\ncell:N109:l:1:f:10:cf:2\ncell:O109:l:1:f:10:cf:2\ncell:P109:l:1:f:10:cf:2\ncell:Q109:l:1:f:10:cf:2\ncell:R109:l:1:f:10:cf:2\ncell:S109:l:1:f:10:cf:2\ncell:A110:l:1:f:10:cf:2\ncell:B110:l:1:f:10:cf:2\ncell:K110:l:1:f:10:cf:2\ncell:L110:l:1:f:10:cf:2\ncell:M110:l:1:f:10:cf:2\ncell:N110:l:1:f:10:cf:2\ncell:O110:l:1:f:10:cf:2\ncell:P110:l:1:f:10:cf:2\ncell:Q110:l:1:f:10:cf:2\ncell:R110:l:1:f:10:cf:2\ncell:S110:l:1:f:10:cf:2\ncell:A111:l:1:f:10:cf:2\ncell:B111:l:1:f:10:cf:2\ncell:K111:l:1:f:10:cf:2\ncell:L111:l:1:f:10:cf:2\ncell:M111:l:1:f:10:cf:2\ncell:N111:l:1:f:10:cf:2\ncell:O111:l:1:f:10:cf:2\ncell:P111:l:1:f:10:cf:2\ncell:Q111:l:1:f:10:cf:2\ncell:R111:l:1:f:10:cf:2\ncell:S111:l:1:f:10:cf:2\ncol:A:w:10\ncol:B:w:10\ncol:C:w:164\ncol:D:w:90\ncol:E:w:90\ncol:F:w:10\ncol:G:w:10\ncol:H:w:50\ncol:I:w:12\ncol:J:w:95\ncol:K:w:91\ncol:L:w:11\ncol:M:w:64\ncol:N:w:64\ncol:O:w:64\ncol:P:w:64\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:V:w:64\ncol:W:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:30\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:18.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:15\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nsheet:c:23:r:111:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,204)\ncolor:3:rgb(119,136,221)\ncolor:4:rgb(136,204,119)\ncolor:5:rgb(204,119,136)\ncolor:6:rgb(230,230,250)\ncolor:7:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 24pt Arial\nfont:6:normal bold 9pt Arial\nfont:7:normal normal * Arial\nfont:8:normal normal 10pt Arial\nfont:9:normal normal 12pt Arial\nfont:10:normal normal 7pt Arial\nfont:11:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:6px * 6px *;vertical-align:bottom;\nlayout:4:padding:6px * 6px 8px;vertical-align:bottom;\nlayout:5:padding:6px 4px 6px 12px;vertical-align:bottom;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\nname:COMPARISON::O37\\cQ51\nname:TRACKING::Y37\\cAA51\n', - }, - name: "income", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:8:cf:2:ntvf:2\ncell:B1:l:1:f:8:cf:2\ncell:C1:l:1:f:8:cf:2\ncell:D1:l:1:f:8:cf:2\ncell:E1:l:1:f:8:cf:2\ncell:F1:l:1:f:8:cf:2\ncell:G1:l:1:f:8:cf:2\ncell:H1:l:1:f:8:cf:2\ncell:I1:l:1:f:8:cf:2\ncell:J1:l:1:f:8:cf:2\ncell:K1:l:1:f:8:cf:2\ncell:L1:l:1:f:8:cf:2\ncell:M1:l:1:f:8:cf:2\ncell:N1:l:1:f:8:cf:2\ncell:O1:l:1:f:8:cf:2\ncell:P1:l:1:f:8:cf:2\ncell:Q1:l:1:f:8:cf:2\ncell:R1:l:1:f:8:cf:2\ncell:S1:l:1:f:8:cf:2\ncell:T1:l:1:f:8:cf:2\ncell:U1:l:1:f:8:cf:2\ncell:V1:l:1:f:8:cf:2\ncell:W1:l:1:f:8:cf:2\ncell:A2:l:1:f:8:cf:2\ncell:B2:l:1:f:8:cf:2\ncell:C2:l:1:f:8:cf:2\ncell:D2:l:1:f:8:cf:2\ncell:E2:l:1:f:8:cf:2\ncell:F2:l:1:f:8:cf:2\ncell:G2:l:1:f:8:cf:2\ncell:H2:l:1:f:8:cf:2\ncell:I2:l:1:f:8:cf:2\ncell:J2:l:1:f:8:cf:2\ncell:K2:l:1:f:8:cf:2\ncell:L2:l:1:f:8:cf:2\ncell:M2:l:1:f:8:cf:2\ncell:N2:l:1:f:8:cf:2\ncell:O2:l:1:f:8:cf:2\ncell:P2:l:1:f:8:cf:2\ncell:Q2:l:1:f:8:cf:2\ncell:R2:l:1:f:8:cf:2\ncell:S2:l:1:f:8:cf:2\ncell:T2:l:1:f:8:cf:2\ncell:U2:l:1:f:8:cf:2\ncell:V2:l:1:f:8:cf:2\ncell:W2:l:1:f:8:cf:2\ncell:A3:l:1:f:8:cf:2\ncell:B3:l:1:f:8:cf:2\ncell:C3:l:1:f:8:cf:2\ncell:D3:l:1:f:8:cf:2\ncell:G3:l:1:f:8:cf:2\ncell:H3:l:1:f:8:cf:2\ncell:I3:l:1:f:8:cf:2\ncell:J3:l:1:f:8:cf:2\ncell:K3:l:1:f:8:cf:2\ncell:L3:l:1:f:8:cf:2\ncell:M3:l:1:f:8:cf:2\ncell:N3:l:1:f:8:cf:2\ncell:O3:l:1:f:8:cf:2\ncell:P3:l:1:f:8:cf:2\ncell:Q3:t: :l:1:f:8:cf:2\ncell:R3:l:1:f:8:cf:2\ncell:S3:l:1:f:8:cf:2\ncell:T3:l:1:f:8:cf:2\ncell:U3:l:1:f:8:cf:2\ncell:V3:l:1:f:8:cf:2\ncell:W3:l:1:f:8:cf:2\ncell:B4:t:Expenses:l:2:f:4:c:1:bg:5:cf:2:colspan:3\ncell:C4:l:2:f:5:c:1:bg:5:cf:2\ncell:E4:t:Date:l:1:f:9:cf:1\ncell:F4:vtf:ndt:41131.96254792824:NOW():l:1:f:9:bg:4:cf:3:ntvf:3\ncell:O4:l:1:f:8:cf:2\ncell:P4:l:1:f:8:cf:2\ncell:Q4:l:1:f:8:cf:2\ncell:R4:l:1:f:8:cf:2\ncell:S4:l:1:f:8:cf:2\ncell:T4:l:1:f:8:cf:2\ncell:U4:l:1:f:8:cf:2\ncell:V4:l:1:f:8:cf:2\ncell:W4:l:1:f:8:cf:2\ncell:O5:t::l:2:f:8:cf:2\ncell:P5:t::l:2:f:8:cf:2\ncell:Q5:t::l:2:f:8:cf:2\ncell:R5:t::l:2:f:8:cf:2\ncell:S5:t::l:2:f:8:cf:2\ncell:T5:l:1:f:8:cf:2\ncell:U5:l:1:f:8:cf:2\ncell:V5:l:1:f:8:cf:2\ncell:W5:l:1:f:8:cf:2\ncell:B6:l:2:f:3:cf:2:colspan:3\ncell:C6:l:2:f:3:bg:4:cf:2\ncell:D6:t:Source:l:2:f:2:bg:4:cf:1\ncell:E6:t:Monthly Budget:b:2:2:2:2:l:2:f:2:c:5:bg:3:cf:1\ncell:F6:t:Yearly Budget:b:2:2:2:2:l:2:f:2:c:5:bg:2:cf:1\ncell:O6:t::l:2:f:3:cf:2\ncell:P6:t::l:2:f:8:cf:2\ncell:Q6:t::l:2:f:8:cf:2\ncell:R6:t::l:2:f:8:cf:2\ncell:S6:l:1:f:8:cf:2\ncell:T6:l:1:f:8:cf:2\ncell:U6:l:1:f:8:cf:2\ncell:V6:l:1:f:8:cf:2\ncell:W6:l:1:f:8:cf:2\ncell:B7:t:Housing:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:2:colspan:3\ncell:C7:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:2\ncell:D7:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:1\ncell:E7:vtf:n:1380:E8+E14+E21+E24:b:2:2:2:2:l:4:f:2:c:5:bg:2:ntvf:1\ncell:F7:vtf:n:16560:IF( (E7*12)=0,"",(E7*12)):b:2:2:2:2:l:4:f:2:c:5:bg:2:ntvf:1\ncell:G7:b::::1\ncell:O7:l:2:f:3:cf:2\ncell:P7:l:2:f:8:cf:2\ncell:Q7:l:2:f:8:cf:2\ncell:R7:l:2:f:8:cf:2\ncell:S7:l:1:f:8:cf:2\ncell:T7:l:1:f:8:cf:2\ncell:U7:l:1:f:8:cf:2\ncell:V7:l:1:f:8:cf:2\ncell:W7:l:1:f:8:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:c:1:bg:6\ncell:C8:t:Home:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D8:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E8:vtf:n:818:SUM(E9\\cE13):b::1:1:1:l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F8:vtf:n:9816:IF( (E8*12)=0,"",(E8*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:8:cf:2\ncell:P8:l:1:f:8:cf:2\ncell:Q8:l:1:f:8:cf:2\ncell:R8:l:1:f:8:cf:2\ncell:S8:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:T8:t::l:1:f:8:cf:2\ncell:U8:l:1:f:8:cf:2\ncell:V8:l:1:f:8:cf:2\ncell:W8:l:1:f:8:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:8:cf:2\ncell:C9:l:3:f:8:cf:2\ncell:D9:t:Mortgage/Rent:l:3:f:7:cf:2\ncell:E9:v:818:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F9:vtf:n:9816:IF( (E9*12)=0,"",(E9*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:t::l:1:f:8:cf:2\ncell:P9:t::l:1:f:8:cf:2\ncell:Q9:t::l:1:f:8:cf:2\ncell:R9:l:1:f:8:cf:2\ncell:S9:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:T9:t::l:1:f:8:cf:2\ncell:U9:l:1:f:8:cf:2\ncell:V9:l:1:f:8:cf:2\ncell:W9:l:1:f:8:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:8:bg:4:cf:2\ncell:C10:l:3:f:8:bg:4:cf:2\ncell:D10:t:Property Tax:l:3:f:7:bg:4:cf:2\ncell:E10:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:8:cf:2\ncell:P10:l:1:f:8:cf:2\ncell:Q10:l:1:f:8:cf:2\ncell:R10:l:1:f:8:cf:2\ncell:S10:l:1:f:8:cf:2\ncell:T10:l:1:f:8:cf:2\ncell:U10:l:1:f:8:cf:2\ncell:V10:l:1:f:8:cf:2\ncell:W10:l:1:f:8:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:8:cf:2\ncell:C11:l:3:f:8:cf:2\ncell:D11:t:Insurance:l:3:f:7:cf:2\ncell:E11:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:8:cf:2\ncell:P11:l:1:f:8:cf:2\ncell:Q11:l:1:f:8:cf:2\ncell:R11:l:1:f:8:cf:2\ncell:S11:l:1:f:8:cf:2\ncell:T11:l:1:f:8:cf:2\ncell:U11:l:1:f:8:cf:2\ncell:V11:l:1:f:8:cf:2\ncell:W11:l:1:f:8:cf:2\ncell:A12:b::1::\ncell:B12:b::::1:l:3:f:8:bg:4:cf:2\ncell:C12:l:3:f:8:bg:4:cf:2\ncell:D12:t:Maintenance:l:3:f:7:bg:4:cf:2\ncell:E12:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F12:vtf:t::IF( (E12*12)=0,"",(E12*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G12:b::::1\ncell:O12:l:2:f:3:cf:2\ncell:P12:l:1:f:8:cf:2\ncell:Q12:l:1:f:8:cf:2\ncell:R12:l:1:f:8:cf:2\ncell:S12:l:1:f:8:cf:2\ncell:T12:l:1:f:8:cf:2\ncell:U12:l:1:f:8:cf:2\ncell:V12:l:1:f:8:cf:2\ncell:W12:l:1:f:8:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:8:cf:2\ncell:C13:l:3:f:8:cf:2\ncell:D13:t:Other:b::1:::l:3:f:7:cf:2\ncell:E13:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F13:vtf:t::IF( (E13*12)=0,"",(E13*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:8:cf:2\ncell:P13:l:1:f:8:cf:2\ncell:Q13:l:1:f:8:cf:2\ncell:R13:l:1:f:8:cf:2\ncell:S13:l:1:f:8:cf:2\ncell:T13:l:1:f:8:cf:2\ncell:U13:l:1:f:8:cf:2\ncell:V13:l:1:f:8:cf:2\ncell:W13:l:1:f:8:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:c:1:bg:6\ncell:C14:t:Utilities:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D14:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E14:vtf:n:305:SUM(E15\\cE20):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F14:vtf:n:3660:IF( (E14*12)=0,"",(E14*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:8:cf:2\ncell:P14:l:1:f:8:cf:2\ncell:Q14:l:1:f:8:cf:2\ncell:R14:l:1:f:8:cf:2\ncell:S14:l:1:f:8:cf:2\ncell:T14:l:1:f:8:cf:2\ncell:U14:l:1:f:8:cf:2\ncell:V14:l:1:f:8:cf:2\ncell:W14:l:1:f:8:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:8:cf:2\ncell:C15:l:3:f:8:cf:2\ncell:D15:t:Gas, Electricity, Oil:l:3:f:7:cf:2\ncell:E15:v:305:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F15:vtf:n:3660:IF( (E15*12)=0,"",(E15*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:8:cf:2\ncell:P15:l:1:f:8:cf:2\ncell:Q15:l:1:f:8:cf:2\ncell:R15:l:1:f:8:cf:2\ncell:S15:l:1:f:8:cf:2\ncell:T15:l:1:f:8:cf:2\ncell:U15:l:1:f:8:cf:2\ncell:V15:l:1:f:8:cf:2\ncell:W15:l:1:f:8:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:8:bg:4:cf:2\ncell:C16:l:3:f:8:bg:4:cf:2\ncell:D16:t:Water, Sewer, Garbage & Other:l:3:f:7:bg:4:cf:2\ncell:E16:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:8:cf:2\ncell:P16:l:1:f:8:cf:2\ncell:Q16:l:1:f:8:cf:2\ncell:R16:l:1:f:8:cf:2\ncell:S16:l:1:f:8:cf:2\ncell:T16:l:1:f:8:cf:2\ncell:U16:l:1:f:8:cf:2\ncell:V16:l:1:f:8:cf:2\ncell:W16:l:1:f:8:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:8:cf:2\ncell:C17:l:3:f:8:cf:2\ncell:D17:t:TV - Cable, Dish, Other:l:3:f:7:cf:2\ncell:E17:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:8:cf:2\ncell:P17:l:1:f:8:cf:2\ncell:Q17:l:1:f:8:cf:2\ncell:R17:l:1:f:8:cf:2\ncell:S17:l:1:f:8:cf:2\ncell:T17:l:1:f:8:cf:2\ncell:U17:l:1:f:8:cf:2\ncell:V17:l:1:f:8:cf:2\ncell:W17:l:1:f:8:cf:2\ncell:A18:b::1::\ncell:B18:b::::1:l:3:f:8:bg:4:cf:2\ncell:C18:l:3:f:8:bg:4:cf:2\ncell:D18:t:Phone:l:3:f:7:bg:4:cf:2\ncell:E18:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F18:vtf:t::IF( (E18*12)=0,"",(E18*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G18:b::::1\ncell:O18:l:1:f:8:cf:2\ncell:P18:l:1:f:8:cf:2\ncell:Q18:l:1:f:8:cf:2\ncell:R18:l:1:f:8:cf:2\ncell:S18:l:1:f:8:cf:2\ncell:T18:l:1:f:8:cf:2\ncell:U18:l:1:f:8:cf:2\ncell:V18:l:1:f:8:cf:2\ncell:W18:l:1:f:8:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:8:cf:2\ncell:C19:l:3:f:8:cf:2\ncell:D19:t:Internet:l:3:f:7:cf:2\ncell:E19:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F19:vtf:t::IF( (E19*12)=0,"",(E19*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:8:cf:2\ncell:P19:l:1:f:8:cf:2\ncell:Q19:l:1:f:8:cf:2\ncell:R19:l:1:f:8:cf:2\ncell:S19:l:1:f:8:cf:2\ncell:T19:l:1:f:8:cf:2\ncell:U19:l:1:f:8:cf:2\ncell:V19:l:1:f:8:cf:2\ncell:W19:l:1:f:8:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:8:bg:4:cf:2\ncell:C20:l:3:f:8:bg:4:cf:2\ncell:D20:t:Other:l:3:f:7:bg:4:cf:2\ncell:E20:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:8:cf:2\ncell:P20:l:1:f:8:cf:2\ncell:Q20:l:1:f:8:cf:2\ncell:R20:l:1:f:8:cf:2\ncell:S20:l:1:f:8:cf:2\ncell:T20:l:1:f:8:cf:2\ncell:U20:l:1:f:8:cf:2\ncell:V20:l:1:f:8:cf:2\ncell:W20:l:1:f:8:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:c:1:bg:6\ncell:C21:t:Personal Services:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D21:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E21:vtf:n:84:SUM(E22\\cE23):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F21:vtf:n:1008:IF( (E21*12)=0,"",(E21*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:8:cf:2\ncell:P21:l:1:f:8:cf:2\ncell:Q21:l:1:f:8:cf:2\ncell:R21:l:1:f:8:cf:2\ncell:S21:l:1:f:8:cf:2\ncell:T21:l:1:f:8:cf:2\ncell:U21:l:1:f:8:cf:2\ncell:V21:l:1:f:8:cf:2\ncell:W21:l:1:f:8:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:8:cf:2\ncell:C22:l:3:f:8:cf:2\ncell:D22:t:Childcare:l:3:f:7:cf:2\ncell:E22:v:84:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F22:vtf:n:1008:IF( (E22*12)=0,"",(E22*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G22:b::::1\ncell:O22:l:1:f:8:cf:2\ncell:P22:l:1:f:8:cf:2\ncell:Q22:l:1:f:8:cf:2\ncell:R22:l:1:f:8:cf:2\ncell:S22:l:1:f:8:cf:2\ncell:T22:l:1:f:8:cf:2\ncell:U22:l:1:f:8:cf:2\ncell:V22:l:1:f:8:cf:2\ncell:W22:l:1:f:8:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:8:bg:4:cf:2\ncell:C23:l:3:f:8:bg:4:cf:2\ncell:D23:t:Elderly Care & Other:l:3:f:7:bg:4:cf:2\ncell:E23:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:8:cf:2\ncell:P23:l:1:f:8:cf:2\ncell:Q23:l:1:f:8:cf:2\ncell:R23:l:1:f:8:cf:2\ncell:S23:l:1:f:8:cf:2\ncell:T23:l:1:f:8:cf:2\ncell:U23:l:1:f:8:cf:2\ncell:V23:l:1:f:8:cf:2\ncell:W23:l:1:f:8:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:c:1:bg:6\ncell:C24:t:Other Household Expenses:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D24:t::b::1:1::l:3:f:2:c:1:bg:6:cf:2\ncell:E24:vtf:n:173:SUM(E25\\cE31):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F24:vtf:n:2076:IF( (E24*12)=0,"",(E24*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:8:cf:2\ncell:P24:l:1:f:8:cf:2\ncell:Q24:l:1:f:8:cf:2\ncell:R24:l:1:f:8:cf:2\ncell:S24:l:1:f:8:cf:2\ncell:T24:l:1:f:8:cf:2\ncell:U24:l:1:f:8:cf:2\ncell:V24:l:1:f:8:cf:2\ncell:W24:l:1:f:8:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:8:cf:2\ncell:C25:l:3:f:8:cf:2\ncell:D25:t:Gardening & Lawncare:l:3:f:7:cf:2\ncell:E25:v:173:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F25:vtf:n:2076:IF( (E25*12)=0,"",(E25*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G25:b::::1\ncell:O25:l:1:f:8:cf:2\ncell:P25:l:1:f:8:cf:2\ncell:Q25:l:1:f:8:cf:2\ncell:R25:l:1:f:8:cf:2\ncell:S25:l:1:f:8:cf:2\ncell:T25:l:1:f:8:cf:2\ncell:U25:l:1:f:8:cf:2\ncell:V25:l:1:f:8:cf:2\ncell:W25:l:1:f:8:cf:2\ncell:A26:b::1::\ncell:B26:b::::1:l:3:f:8:bg:4:cf:2\ncell:C26:l:3:f:8:bg:4:cf:2\ncell:D26:t:Laundry & Cleaning:l:3:f:7:bg:4:cf:2\ncell:E26:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F26:vtf:t::IF( (E26*12)=0,"",(E26*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G26:b::::1\ncell:O26:l:1:f:8:cf:2\ncell:P26:l:1:f:8:cf:2\ncell:Q26:l:1:f:8:cf:2\ncell:R26:l:1:f:8:cf:2\ncell:S26:l:1:f:8:cf:2\ncell:T26:l:1:f:8:cf:2\ncell:U26:l:1:f:8:cf:2\ncell:V26:l:1:f:8:cf:2\ncell:W26:l:1:f:8:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:8:cf:2\ncell:C27:l:3:f:8:cf:2\ncell:D27:t:Household Supplies:l:3:f:7:cf:2\ncell:E27:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F27:vtf:t::IF( (E27*12)=0,"",(E27*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:8:cf:2\ncell:P27:l:1:f:8:cf:2\ncell:Q27:l:1:f:8:cf:2\ncell:R27:l:1:f:8:cf:2\ncell:S27:l:1:f:8:cf:2\ncell:T27:l:1:f:8:cf:2\ncell:U27:l:1:f:8:cf:2\ncell:V27:l:1:f:8:cf:2\ncell:W27:l:1:f:8:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:8:bg:4:cf:2\ncell:C28:l:3:f:8:bg:4:cf:2\ncell:D28:t:Furniture:l:3:f:7:bg:4:cf:2\ncell:E28:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:8:cf:2\ncell:P28:l:1:f:8:cf:2\ncell:Q28:l:1:f:8:cf:2\ncell:R28:l:1:f:8:cf:2\ncell:S28:l:1:f:8:cf:2\ncell:T28:l:1:f:8:cf:2\ncell:U28:l:1:f:8:cf:2\ncell:V28:l:1:f:8:cf:2\ncell:W28:l:1:f:8:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:8:cf:2\ncell:C29:l:3:f:8:cf:2\ncell:D29:t:Appliances & Equipment:l:3:f:7:cf:2\ncell:E29:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:8:cf:2\ncell:P29:l:1:f:8:cf:2\ncell:Q29:l:1:f:8:cf:2\ncell:R29:l:1:f:8:cf:2\ncell:S29:l:1:f:8:cf:2\ncell:T29:l:1:f:8:cf:2\ncell:U29:l:1:f:8:cf:2\ncell:V29:l:1:f:8:cf:2\ncell:W29:l:1:f:8:cf:2\ncell:A30:b::1::\ncell:B30:b::::1:l:3:f:8:bg:4:cf:2\ncell:C30:l:3:f:8:bg:4:cf:2\ncell:D30:t:Security Services:l:3:f:7:bg:4:cf:2\ncell:E30:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G30:b::::1\ncell:O30:l:1:f:8:cf:2\ncell:P30:l:1:f:8:cf:2\ncell:Q30:l:1:f:8:cf:2\ncell:R30:l:1:f:8:cf:2\ncell:S30:l:1:f:8:cf:2\ncell:T30:l:1:f:8:cf:2\ncell:U30:l:1:f:8:cf:2\ncell:V30:l:1:f:8:cf:2\ncell:W30:l:1:f:8:cf:2\ncell:A31:b::1::\ncell:B31:b:::1:1:l:3:f:8:cf:2\ncell:C31:b:::1::l:3:f:8:cf:2\ncell:D31:t:Other:b:::1::l:3:f:7:cf:2\ncell:E31:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b::1:1::l:4:f:7:cf:3:ntvf:1\ncell:G31:b::::1\ncell:O31:l:1:f:8:cf:2\ncell:P31:l:1:f:8:cf:2\ncell:Q31:l:1:f:8:cf:2\ncell:R31:l:1:f:8:cf:2\ncell:S31:l:1:f:8:cf:2\ncell:T31:l:1:f:8:cf:2\ncell:U31:l:1:f:8:cf:2\ncell:V31:l:1:f:8:cf:2\ncell:W31:l:1:f:8:cf:2\ncell:B32:b:1:::\ncell:C32:b:1:::\ncell:D32:b:1:::\ncell:E32:b:1:::\ncell:F32:b:1:::\ncell:O32:l:1:f:8:cf:2\ncell:P32:l:1:f:8:cf:2\ncell:Q32:l:1:f:8:cf:2\ncell:R32:l:1:f:8:cf:2\ncell:S32:l:1:f:8:cf:2\ncell:T32:l:1:f:8:cf:2\ncell:U32:l:1:f:8:cf:2\ncell:V32:l:1:f:8:cf:2\ncell:W32:l:1:f:8:cf:2\ncell:O33:l:1:f:8:cf:2\ncell:P33:l:1:f:8:cf:2\ncell:Q33:l:1:f:8:cf:2\ncell:R33:l:1:f:8:cf:2\ncell:S33:l:1:f:8:cf:2\ncell:T33:l:1:f:8:cf:2\ncell:U33:l:1:f:8:cf:2\ncell:V33:l:1:f:8:cf:2\ncell:W33:l:1:f:8:cf:2\ncell:O34:l:1:f:8:cf:2\ncell:P34:l:1:f:8:cf:2\ncell:Q34:l:1:f:8:cf:2\ncell:R34:l:1:f:8:cf:2\ncell:S34:l:1:f:8:cf:2\ncell:T34:l:1:f:8:cf:2\ncell:U34:l:1:f:8:cf:2\ncell:V34:l:1:f:8:cf:2\ncell:W34:l:1:f:8:cf:2\ncell:O35:l:1:f:8:cf:2\ncell:P35:l:1:f:8:cf:2\ncell:Q35:l:1:f:8:cf:2\ncell:R35:l:1:f:8:cf:2\ncell:S35:l:1:f:8:cf:2\ncell:T35:l:1:f:8:cf:2\ncell:U35:l:1:f:8:cf:2\ncell:V35:l:1:f:8:cf:2\ncell:W35:l:1:f:8:cf:2\ncell:O36:l:1:f:8:cf:2\ncell:P36:l:1:f:8:cf:2\ncell:Q36:l:1:f:8:cf:2\ncell:R36:l:1:f:8:cf:2\ncell:S36:l:1:f:8:cf:2\ncell:T36:l:1:f:8:cf:2\ncell:U36:l:1:f:8:cf:2\ncell:V36:l:1:f:8:cf:2\ncell:W36:l:1:f:8:cf:2\ncell:O37:l:1:f:8:cf:2\ncell:P37:l:1:f:8:cf:2\ncell:Q37:l:1:f:8:cf:2\ncell:R37:l:1:f:8:cf:2\ncell:S37:l:1:f:8:cf:2\ncell:T37:l:1:f:8:cf:2\ncell:U37:l:1:f:8:cf:2\ncell:V37:l:1:f:8:cf:2\ncell:W37:l:1:f:8:cf:2\ncell:O38:l:1:f:8:cf:2\ncell:P38:l:1:f:8:cf:2\ncell:Q38:l:1:f:8:cf:2\ncell:R38:l:1:f:8:cf:2\ncell:S38:l:1:f:8:cf:2\ncell:T38:l:1:f:8:cf:2\ncell:U38:l:1:f:8:cf:2\ncell:V38:l:1:f:8:cf:2\ncell:W38:l:1:f:8:cf:2\ncell:O39:l:1:f:8:cf:2\ncell:P39:l:1:f:8:cf:2\ncell:Q39:l:1:f:8:cf:2\ncell:R39:l:1:f:8:cf:2\ncell:S39:l:1:f:8:cf:2\ncell:T39:l:1:f:8:cf:2\ncell:U39:l:1:f:8:cf:2\ncell:V39:l:1:f:8:cf:2\ncell:W39:l:1:f:8:cf:2\ncell:O40:l:1:f:8:cf:2\ncell:P40:l:1:f:8:cf:2\ncell:Q40:l:1:f:8:cf:2\ncell:R40:l:1:f:8:cf:2\ncell:S40:l:1:f:8:cf:2\ncell:T40:l:1:f:8:cf:2\ncell:U40:l:1:f:8:cf:2\ncell:V40:l:1:f:8:cf:2\ncell:W40:l:1:f:8:cf:2\ncell:O41:l:1:f:8:cf:2\ncell:P41:l:1:f:8:cf:2\ncell:Q41:l:1:f:8:cf:2\ncell:R41:l:1:f:8:cf:2\ncell:S41:l:1:f:8:cf:2\ncell:T41:l:1:f:8:cf:2\ncell:U41:l:1:f:8:cf:2\ncell:V41:l:1:f:8:cf:2\ncell:W41:l:1:f:8:cf:2\ncell:O42:l:1:f:8:cf:2\ncell:P42:l:1:f:8:cf:2\ncell:Q42:l:1:f:8:cf:2\ncell:R42:l:1:f:8:cf:2\ncell:S42:l:1:f:8:cf:2\ncell:T42:l:1:f:8:cf:2\ncell:U42:l:1:f:8:cf:2\ncell:V42:l:1:f:8:cf:2\ncell:W42:l:1:f:8:cf:2\ncell:O43:l:1:f:8:cf:2\ncell:P43:l:1:f:8:cf:2\ncell:Q43:l:1:f:8:cf:2\ncell:R43:l:1:f:8:cf:2\ncell:S43:l:1:f:8:cf:2\ncell:T43:l:1:f:8:cf:2\ncell:U43:l:1:f:8:cf:2\ncell:V43:l:1:f:8:cf:2\ncell:W43:l:1:f:8:cf:2\ncell:O44:l:1:f:8:cf:2\ncell:P44:l:1:f:8:cf:2\ncell:Q44:l:1:f:8:cf:2\ncell:R44:l:1:f:8:cf:2\ncell:S44:l:1:f:8:cf:2\ncell:T44:l:1:f:8:cf:2\ncell:U44:l:1:f:8:cf:2\ncell:V44:l:1:f:8:cf:2\ncell:W44:l:1:f:8:cf:2\ncell:O45:l:1:f:8:cf:2\ncell:P45:l:1:f:8:cf:2\ncell:Q45:l:1:f:8:cf:2\ncell:R45:l:1:f:8:cf:2\ncell:S45:l:1:f:8:cf:2\ncell:T45:l:1:f:8:cf:2\ncell:U45:l:1:f:8:cf:2\ncell:V45:l:1:f:8:cf:2\ncell:W45:l:1:f:8:cf:2\ncell:O46:l:1:f:8:cf:2\ncell:P46:l:1:f:8:cf:2\ncell:Q46:l:1:f:8:cf:2\ncell:R46:l:1:f:8:cf:2\ncell:S46:l:1:f:8:cf:2\ncell:T46:l:1:f:8:cf:2\ncell:U46:l:1:f:8:cf:2\ncell:V46:l:1:f:8:cf:2\ncell:W46:l:1:f:8:cf:2\ncell:O47:l:1:f:8:cf:2\ncell:P47:l:1:f:8:cf:2\ncell:Q47:l:1:f:8:cf:2\ncell:R47:l:1:f:8:cf:2\ncell:S47:l:1:f:8:cf:2\ncell:T47:l:1:f:8:cf:2\ncell:U47:l:1:f:8:cf:2\ncell:V47:l:1:f:8:cf:2\ncell:W47:l:1:f:8:cf:2\ncell:O48:l:1:f:8:cf:2\ncell:P48:l:1:f:8:cf:2\ncell:Q48:l:1:f:8:cf:2\ncell:R48:l:1:f:8:cf:2\ncell:S48:l:1:f:8:cf:2\ncell:T48:l:1:f:8:cf:2\ncell:U48:l:1:f:8:cf:2\ncell:V48:l:1:f:8:cf:2\ncell:W48:l:1:f:8:cf:2\ncell:O49:l:1:f:8:cf:2\ncell:P49:l:1:f:8:cf:2\ncell:Q49:l:1:f:8:cf:2\ncell:R49:l:1:f:8:cf:2\ncell:S49:l:1:f:8:cf:2\ncell:T49:l:1:f:8:cf:2\ncell:U49:l:1:f:8:cf:2\ncell:V49:l:1:f:8:cf:2\ncell:W49:l:1:f:8:cf:2\ncell:O50:l:1:f:8:cf:2\ncell:P50:l:1:f:8:cf:2\ncell:Q50:l:1:f:8:cf:2\ncell:R50:l:1:f:8:cf:2\ncell:S50:l:1:f:8:cf:2\ncell:T50:l:1:f:8:cf:2\ncell:U50:l:1:f:8:cf:2\ncell:V50:l:1:f:8:cf:2\ncell:W50:l:1:f:8:cf:2\ncell:O51:l:1:f:8:cf:2\ncell:P51:l:1:f:8:cf:2\ncell:Q51:l:1:f:8:cf:2\ncell:R51:l:1:f:8:cf:2\ncell:S51:l:1:f:8:cf:2\ncell:T51:l:1:f:8:cf:2\ncell:U51:l:1:f:8:cf:2\ncell:V51:l:1:f:8:cf:2\ncell:W51:l:1:f:8:cf:2\ncell:O52:l:1:f:8:cf:2\ncell:P52:l:1:f:8:cf:2\ncell:Q52:l:1:f:8:cf:2\ncell:R52:l:1:f:8:cf:2\ncell:S52:l:1:f:8:cf:2\ncell:T52:l:1:f:8:cf:2\ncell:U52:l:1:f:8:cf:2\ncell:V52:l:1:f:8:cf:2\ncell:W52:l:1:f:8:cf:2\ncell:O53:l:1:f:8:cf:2\ncell:P53:l:1:f:8:cf:2\ncell:Q53:l:1:f:8:cf:2\ncell:R53:l:1:f:8:cf:2\ncell:S53:l:1:f:8:cf:2\ncell:T53:l:1:f:8:cf:2\ncell:U53:l:1:f:8:cf:2\ncell:V53:l:1:f:8:cf:2\ncell:W53:l:1:f:8:cf:2\ncell:O54:l:1:f:8:cf:2\ncell:P54:l:1:f:8:cf:2\ncell:Q54:l:1:f:8:cf:2\ncell:R54:l:1:f:8:cf:2\ncell:S54:l:1:f:8:cf:2\ncell:T54:l:1:f:8:cf:2\ncell:U54:l:1:f:8:cf:2\ncell:V54:l:1:f:8:cf:2\ncell:W54:l:1:f:8:cf:2\ncell:O55:l:1:f:8:cf:2\ncell:P55:l:1:f:8:cf:2\ncell:Q55:l:1:f:8:cf:2\ncell:R55:l:1:f:8:cf:2\ncell:S55:l:1:f:8:cf:2\ncell:T55:l:1:f:8:cf:2\ncell:U55:l:1:f:8:cf:2\ncell:V55:l:1:f:8:cf:2\ncell:W55:l:1:f:8:cf:2\ncell:O56:l:1:f:8:cf:2\ncell:P56:l:1:f:8:cf:2\ncell:Q56:l:1:f:8:cf:2\ncell:R56:l:1:f:8:cf:2\ncell:S56:l:1:f:8:cf:2\ncell:T56:l:1:f:8:cf:2\ncell:U56:l:1:f:8:cf:2\ncell:V56:l:1:f:8:cf:2\ncell:W56:l:1:f:8:cf:2\ncell:O57:l:1:f:8:cf:2\ncell:P57:l:1:f:8:cf:2\ncell:Q57:l:1:f:8:cf:2\ncell:R57:l:1:f:8:cf:2\ncell:S57:l:1:f:8:cf:2\ncell:T57:l:1:f:8:cf:2\ncell:U57:l:1:f:8:cf:2\ncell:V57:l:1:f:8:cf:2\ncell:W57:l:1:f:8:cf:2\ncell:O58:l:1:f:8:cf:2\ncell:P58:l:1:f:8:cf:2\ncell:Q58:l:1:f:8:cf:2\ncell:R58:l:1:f:8:cf:2\ncell:S58:l:1:f:8:cf:2\ncell:T58:l:1:f:8:cf:2\ncell:U58:l:1:f:8:cf:2\ncell:V58:l:1:f:8:cf:2\ncell:W58:l:1:f:8:cf:2\ncell:O59:l:1:f:8:cf:2\ncell:P59:l:1:f:8:cf:2\ncell:Q59:l:1:f:8:cf:2\ncell:R59:l:1:f:8:cf:2\ncell:S59:l:1:f:8:cf:2\ncell:T59:l:1:f:8:cf:2\ncell:U59:l:1:f:8:cf:2\ncell:V59:l:1:f:8:cf:2\ncell:W59:l:1:f:8:cf:2\ncell:O60:l:1:f:8:cf:2\ncell:P60:l:1:f:8:cf:2\ncell:Q60:l:1:f:8:cf:2\ncell:R60:l:1:f:8:cf:2\ncell:S60:l:1:f:8:cf:2\ncell:T60:l:1:f:8:cf:2\ncell:U60:l:1:f:8:cf:2\ncell:V60:l:1:f:8:cf:2\ncell:W60:l:1:f:8:cf:2\ncell:O61:l:1:f:8:cf:2\ncell:P61:l:1:f:8:cf:2\ncell:Q61:l:1:f:8:cf:2\ncell:R61:l:1:f:8:cf:2\ncell:S61:l:1:f:8:cf:2\ncell:T61:l:1:f:8:cf:2\ncell:U61:l:1:f:8:cf:2\ncell:V61:l:1:f:8:cf:2\ncell:W61:l:1:f:8:cf:2\ncell:O62:l:1:f:8:cf:2\ncell:P62:l:1:f:8:cf:2\ncell:Q62:l:1:f:8:cf:2\ncell:R62:l:1:f:8:cf:2\ncell:S62:l:1:f:8:cf:2\ncell:T62:l:1:f:8:cf:2\ncell:U62:l:1:f:8:cf:2\ncell:V62:l:1:f:8:cf:2\ncell:W62:l:1:f:8:cf:2\ncell:O63:l:1:f:8:cf:2\ncell:P63:l:1:f:8:cf:2\ncell:Q63:l:1:f:8:cf:2\ncell:R63:l:1:f:8:cf:2\ncell:S63:l:1:f:8:cf:2\ncell:T63:l:1:f:8:cf:2\ncell:U63:l:1:f:8:cf:2\ncell:V63:l:1:f:8:cf:2\ncell:W63:l:1:f:8:cf:2\ncell:O64:l:1:f:8:cf:2\ncell:P64:l:1:f:8:cf:2\ncell:Q64:l:1:f:8:cf:2\ncell:R64:l:1:f:8:cf:2\ncell:S64:l:1:f:8:cf:2\ncell:T64:l:1:f:8:cf:2\ncell:U64:l:1:f:8:cf:2\ncell:V64:l:1:f:8:cf:2\ncell:W64:l:1:f:8:cf:2\ncell:O65:l:1:f:8:cf:2\ncell:P65:l:1:f:8:cf:2\ncell:Q65:l:1:f:8:cf:2\ncell:R65:l:1:f:8:cf:2\ncell:S65:l:1:f:8:cf:2\ncell:T65:l:1:f:8:cf:2\ncell:U65:l:1:f:8:cf:2\ncell:V65:l:1:f:8:cf:2\ncell:W65:l:1:f:8:cf:2\ncell:O66:l:1:f:8:cf:2\ncell:P66:l:1:f:8:cf:2\ncell:Q66:l:1:f:8:cf:2\ncell:R66:l:1:f:8:cf:2\ncell:S66:l:1:f:8:cf:2\ncell:T66:l:1:f:8:cf:2\ncell:U66:l:1:f:8:cf:2\ncell:V66:l:1:f:8:cf:2\ncell:W66:l:1:f:8:cf:2\ncell:O67:l:1:f:8:cf:2\ncell:P67:l:1:f:8:cf:2\ncell:Q67:l:1:f:8:cf:2\ncell:R67:l:1:f:8:cf:2\ncell:S67:l:1:f:8:cf:2\ncell:T67:l:1:f:8:cf:2\ncell:U67:l:1:f:8:cf:2\ncell:V67:l:1:f:8:cf:2\ncell:W67:l:1:f:8:cf:2\ncell:O68:l:1:f:8:cf:2\ncell:P68:l:1:f:8:cf:2\ncell:Q68:l:1:f:8:cf:2\ncell:R68:l:1:f:8:cf:2\ncell:S68:l:1:f:8:cf:2\ncell:T68:l:1:f:8:cf:2\ncell:U68:l:1:f:8:cf:2\ncell:V68:l:1:f:8:cf:2\ncell:W68:l:1:f:8:cf:2\ncell:O69:l:1:f:8:cf:2\ncell:P69:l:1:f:8:cf:2\ncell:Q69:l:1:f:8:cf:2\ncell:R69:l:1:f:8:cf:2\ncell:S69:l:1:f:8:cf:2\ncell:T69:l:1:f:8:cf:2\ncell:U69:l:1:f:8:cf:2\ncell:V69:l:1:f:8:cf:2\ncell:W69:l:1:f:8:cf:2\ncell:O70:l:1:f:8:cf:2\ncell:P70:l:1:f:8:cf:2\ncell:Q70:l:1:f:8:cf:2\ncell:R70:l:1:f:8:cf:2\ncell:S70:l:1:f:8:cf:2\ncell:T70:l:1:f:8:cf:2\ncell:U70:l:1:f:8:cf:2\ncell:V70:l:1:f:8:cf:2\ncell:W70:l:1:f:8:cf:2\ncell:O71:l:1:f:8:cf:2\ncell:P71:l:1:f:8:cf:2\ncell:Q71:l:1:f:8:cf:2\ncell:R71:l:1:f:8:cf:2\ncell:S71:l:1:f:8:cf:2\ncell:T71:l:1:f:8:cf:2\ncell:U71:l:1:f:8:cf:2\ncell:V71:l:1:f:8:cf:2\ncell:W71:l:1:f:8:cf:2\ncell:O72:l:1:f:8:cf:2\ncell:P72:l:1:f:8:cf:2\ncell:Q72:l:1:f:8:cf:2\ncell:R72:l:1:f:8:cf:2\ncell:S72:l:1:f:8:cf:2\ncell:T72:l:1:f:8:cf:2\ncell:U72:l:1:f:8:cf:2\ncell:V72:l:1:f:8:cf:2\ncell:W72:l:1:f:8:cf:2\ncell:O73:l:1:f:8:cf:2\ncell:P73:l:1:f:8:cf:2\ncell:Q73:l:1:f:8:cf:2\ncell:R73:l:1:f:8:cf:2\ncell:O74:l:1:f:8:cf:2\ncell:P74:l:1:f:8:cf:2\ncell:Q74:l:1:f:8:cf:2\ncell:R74:l:1:f:8:cf:2\ncell:O75:l:1:f:8:cf:2\ncell:P75:l:1:f:8:cf:2\ncell:Q75:l:1:f:8:cf:2\ncell:R75:l:1:f:8:cf:2\ncell:O76:l:1:f:8:cf:2\ncell:P76:l:1:f:8:cf:2\ncell:Q76:l:1:f:8:cf:2\ncell:R76:l:1:f:8:cf:2\ncell:O77:l:1:f:8:cf:2\ncell:P77:l:1:f:8:cf:2\ncell:Q77:l:1:f:8:cf:2\ncell:R77:l:1:f:8:cf:2\ncell:O78:l:1:f:8:cf:2\ncell:P78:l:1:f:8:cf:2\ncell:Q78:l:1:f:8:cf:2\ncell:R78:l:1:f:8:cf:2\ncell:O79:l:1:f:8:cf:2\ncell:P79:l:1:f:8:cf:2\ncell:Q79:l:1:f:8:cf:2\ncell:R79:l:1:f:8:cf:2\ncell:O80:l:1:f:8:cf:2\ncell:P80:l:1:f:8:cf:2\ncell:Q80:l:1:f:8:cf:2\ncell:R80:l:1:f:8:cf:2\ncell:O81:l:1:f:8:cf:2\ncell:P81:l:1:f:8:cf:2\ncell:Q81:l:1:f:8:cf:2\ncell:R81:l:1:f:8:cf:2\ncell:O82:l:1:f:8:cf:2\ncell:P82:l:1:f:8:cf:2\ncell:Q82:l:1:f:8:cf:2\ncell:R82:l:1:f:8:cf:2\ncell:O83:l:1:f:8:cf:2\ncell:P83:l:1:f:8:cf:2\ncell:Q83:l:1:f:8:cf:2\ncell:R83:l:1:f:8:cf:2\ncell:O84:l:1:f:8:cf:2\ncell:P84:l:1:f:8:cf:2\ncell:Q84:l:1:f:8:cf:2\ncell:R84:l:1:f:8:cf:2\ncell:O85:l:1:f:8:cf:2\ncell:P85:l:1:f:8:cf:2\ncell:Q85:l:1:f:8:cf:2\ncell:R85:l:1:f:8:cf:2\ncell:O86:l:1:f:8:cf:2\ncell:P86:l:1:f:8:cf:2\ncell:Q86:l:1:f:8:cf:2\ncell:R86:l:1:f:8:cf:2\ncell:B87:l:1:f:8:cf:2\ncell:C87:l:1:f:8:cf:2\ncell:D87:l:1:f:2:cf:2\ncell:E87:l:1:f:2:cf:3:ntvf:1\ncell:F87:l:1:f:2:cf:3:ntvf:1\ncell:O87:l:1:f:8:cf:2\ncell:P87:l:1:f:8:cf:2\ncell:Q87:l:1:f:8:cf:2\ncell:R87:l:1:f:8:cf:2\ncell:B88:l:1:f:6:cf:2\ncell:C88:l:1:f:6:cf:2\ncell:D88:l:1:f:11:cf:2\ncell:E88:l:1:f:11:cf:2\ncell:F88:l:1:f:8:cf:2\ncell:O88:l:1:f:8:cf:2\ncell:P88:l:1:f:8:cf:2\ncell:Q88:l:1:f:8:cf:2\ncell:R88:l:1:f:8:cf:2\ncell:O89:l:1:f:8:cf:2\ncell:P89:l:1:f:8:cf:2\ncell:Q89:l:1:f:8:cf:2\ncell:R89:l:1:f:8:cf:2\ncell:O90:l:1:f:8:cf:2\ncell:P90:l:1:f:8:cf:2\ncell:Q90:l:1:f:8:cf:2\ncell:R90:l:1:f:8:cf:2\ncell:O91:l:1:f:8:cf:2\ncell:P91:l:1:f:8:cf:2\ncell:Q91:l:1:f:8:cf:2\ncell:R91:l:1:f:8:cf:2\ncell:O92:l:1:f:8:cf:2\ncell:P92:l:1:f:8:cf:2\ncell:Q92:l:1:f:8:cf:2\ncell:R92:l:1:f:8:cf:2\ncell:O93:l:1:f:8:cf:2\ncell:P93:l:1:f:8:cf:2\ncell:Q93:l:1:f:8:cf:2\ncell:R93:l:1:f:8:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:O96:l:1:f:8:cf:2\ncell:P96:l:1:f:8:cf:2\ncell:Q96:l:1:f:8:cf:2\ncell:R96:l:1:f:8:cf:2\ncell:O97:l:1:f:8:cf:2\ncell:P97:l:1:f:8:cf:2\ncell:Q97:l:1:f:8:cf:2\ncell:R97:l:1:f:8:cf:2\ncell:O98:l:1:f:8:cf:2\ncell:P98:l:1:f:8:cf:2\ncell:Q98:l:1:f:8:cf:2\ncell:R98:l:1:f:8:cf:2\ncell:S98:l:1:f:8:cf:2\ncell:T98:l:1:f:8:cf:2\ncell:U98:l:1:f:8:cf:2\ncell:V98:l:1:f:8:cf:2\ncell:W98:l:1:f:8:cf:2\ncell:O99:l:1:f:8:cf:2\ncell:P99:l:1:f:8:cf:2\ncell:Q99:l:1:f:8:cf:2\ncell:R99:l:1:f:8:cf:2\ncell:S99:l:1:f:8:cf:2\ncell:T99:l:1:f:8:cf:2\ncell:U99:l:1:f:8:cf:2\ncell:V99:l:1:f:8:cf:2\ncell:W99:l:1:f:8:cf:2\ncell:O100:l:1:f:8:cf:2\ncell:P100:l:1:f:8:cf:2\ncell:Q100:l:1:f:8:cf:2\ncell:R100:l:1:f:8:cf:2\ncell:S100:l:1:f:8:cf:2\ncell:T100:l:1:f:8:cf:2\ncell:U100:l:1:f:8:cf:2\ncell:V100:l:1:f:8:cf:2\ncell:W100:l:1:f:8:cf:2\ncell:O101:l:1:f:8:cf:2\ncell:P101:l:1:f:8:cf:2\ncell:Q101:l:1:f:8:cf:2\ncell:R101:l:1:f:8:cf:2\ncell:S101:l:1:f:8:cf:2\ncell:T101:l:1:f:8:cf:2\ncell:U101:l:1:f:8:cf:2\ncell:V101:l:1:f:8:cf:2\ncell:W101:l:1:f:8:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncell:O110:l:1:f:8:cf:2\ncell:P110:l:1:f:8:cf:2\ncell:Q110:l:1:f:8:cf:2\ncell:R110:l:1:f:8:cf:2\ncell:S110:l:1:f:8:cf:2\ncell:T110:l:1:f:8:cf:2\ncell:U110:l:1:f:8:cf:2\ncell:V110:l:1:f:8:cf:2\ncell:W110:l:1:f:8:cf:2\ncell:O111:l:1:f:8:cf:2\ncell:P111:l:1:f:8:cf:2\ncell:Q111:l:1:f:8:cf:2\ncell:R111:l:1:f:8:cf:2\ncell:S111:l:1:f:8:cf:2\ncell:T111:l:1:f:8:cf:2\ncell:U111:l:1:f:8:cf:2\ncell:V111:l:1:f:8:cf:2\ncell:W111:l:1:f:8:cf:2\ncell:O112:l:1:f:8:cf:2\ncell:P112:l:1:f:8:cf:2\ncell:Q112:l:1:f:8:cf:2\ncell:R112:l:1:f:8:cf:2\ncell:S112:l:1:f:8:cf:2\ncell:T112:l:1:f:8:cf:2\ncell:U112:l:1:f:8:cf:2\ncell:V112:l:1:f:8:cf:2\ncell:W112:l:1:f:8:cf:2\ncell:O113:l:1:f:8:cf:2\ncell:P113:l:1:f:8:cf:2\ncell:Q113:l:1:f:8:cf:2\ncell:R113:l:1:f:8:cf:2\ncell:S113:l:1:f:8:cf:2\ncell:T113:l:1:f:8:cf:2\ncell:U113:l:1:f:8:cf:2\ncell:V113:l:1:f:8:cf:2\ncell:W113:l:1:f:8:cf:2\ncell:O114:l:1:f:8:cf:2\ncell:P114:l:1:f:8:cf:2\ncell:Q114:l:1:f:8:cf:2\ncell:R114:l:1:f:8:cf:2\ncell:S114:l:1:f:8:cf:2\ncell:T114:l:1:f:8:cf:2\ncell:U114:l:1:f:8:cf:2\ncell:V114:l:1:f:8:cf:2\ncell:W114:l:1:f:8:cf:2\ncell:O115:l:1:f:8:cf:2\ncell:P115:l:1:f:8:cf:2\ncell:Q115:l:1:f:8:cf:2\ncell:R115:l:1:f:8:cf:2\ncell:S115:l:1:f:8:cf:2\ncell:T115:l:1:f:8:cf:2\ncell:U115:l:1:f:8:cf:2\ncell:V115:l:1:f:8:cf:2\ncell:W115:l:1:f:8:cf:2\ncell:O116:l:1:f:8:cf:2\ncell:P116:l:1:f:8:cf:2\ncell:Q116:l:1:f:8:cf:2\ncell:R116:l:1:f:8:cf:2\ncell:S116:l:1:f:8:cf:2\ncell:T116:l:1:f:8:cf:2\ncell:U116:l:1:f:8:cf:2\ncell:V116:l:1:f:8:cf:2\ncell:W116:l:1:f:8:cf:2\ncell:O117:l:1:f:8:cf:2\ncell:P117:l:1:f:8:cf:2\ncell:Q117:l:1:f:8:cf:2\ncell:R117:l:1:f:8:cf:2\ncell:S117:l:1:f:8:cf:2\ncell:T117:l:1:f:8:cf:2\ncell:U117:l:1:f:8:cf:2\ncell:V117:l:1:f:8:cf:2\ncell:W117:l:1:f:8:cf:2\ncell:O118:l:1:f:8:cf:2\ncell:P118:l:1:f:8:cf:2\ncell:Q118:l:1:f:8:cf:2\ncell:R118:l:1:f:8:cf:2\ncell:S118:l:1:f:8:cf:2\ncell:T118:l:1:f:8:cf:2\ncell:U118:l:1:f:8:cf:2\ncell:V118:l:1:f:8:cf:2\ncell:W118:l:1:f:8:cf:2\ncell:O119:l:1:f:8:cf:2\ncell:P119:l:1:f:8:cf:2\ncell:Q119:l:1:f:8:cf:2\ncell:R119:l:1:f:8:cf:2\ncell:S119:l:1:f:8:cf:2\ncell:T119:l:1:f:8:cf:2\ncell:U119:l:1:f:8:cf:2\ncell:V119:l:1:f:8:cf:2\ncell:W119:l:1:f:8:cf:2\ncell:O120:l:1:f:8:cf:2\ncell:P120:l:1:f:8:cf:2\ncell:Q120:l:1:f:8:cf:2\ncell:R120:l:1:f:8:cf:2\ncell:S120:l:1:f:8:cf:2\ncell:T120:l:1:f:8:cf:2\ncell:U120:l:1:f:8:cf:2\ncell:V120:l:1:f:8:cf:2\ncell:W120:l:1:f:8:cf:2\ncell:O121:l:1:f:8:cf:2\ncell:P121:l:1:f:8:cf:2\ncell:Q121:l:1:f:8:cf:2\ncell:R121:l:1:f:8:cf:2\ncell:S121:l:1:f:8:cf:2\ncell:T121:l:1:f:8:cf:2\ncell:U121:l:1:f:8:cf:2\ncell:V121:l:1:f:8:cf:2\ncell:W121:l:1:f:8:cf:2\ncell:O122:l:1:f:8:cf:2\ncell:P122:l:1:f:8:cf:2\ncell:Q122:l:1:f:8:cf:2\ncell:R122:l:1:f:8:cf:2\ncell:S122:l:1:f:8:cf:2\ncell:T122:l:1:f:8:cf:2\ncell:U122:l:1:f:8:cf:2\ncell:V122:l:1:f:8:cf:2\ncell:W122:l:1:f:8:cf:2\ncell:O123:l:1:f:8:cf:2\ncell:P123:l:1:f:8:cf:2\ncell:Q123:l:1:f:8:cf:2\ncell:R123:l:1:f:8:cf:2\ncell:S123:l:1:f:8:cf:2\ncell:T123:l:1:f:8:cf:2\ncell:U123:l:1:f:8:cf:2\ncell:V123:l:1:f:8:cf:2\ncell:W123:l:1:f:8:cf:2\ncell:O124:l:1:f:8:cf:2\ncell:P124:l:1:f:8:cf:2\ncell:Q124:l:1:f:8:cf:2\ncell:R124:l:1:f:8:cf:2\ncell:S124:l:1:f:8:cf:2\ncell:T124:l:1:f:8:cf:2\ncell:U124:l:1:f:8:cf:2\ncell:V124:l:1:f:8:cf:2\ncell:W124:l:1:f:8:cf:2\ncell:O125:l:1:f:8:cf:2\ncell:P125:l:1:f:8:cf:2\ncell:Q125:l:1:f:8:cf:2\ncell:R125:l:1:f:8:cf:2\ncell:S125:l:1:f:8:cf:2\ncell:T125:l:1:f:8:cf:2\ncell:U125:l:1:f:8:cf:2\ncell:V125:l:1:f:8:cf:2\ncell:W125:l:1:f:8:cf:2\ncell:O126:l:1:f:8:cf:2\ncell:P126:l:1:f:8:cf:2\ncell:Q126:l:1:f:8:cf:2\ncell:R126:l:1:f:8:cf:2\ncell:S126:l:1:f:8:cf:2\ncell:T126:l:1:f:8:cf:2\ncell:U126:l:1:f:8:cf:2\ncell:V126:l:1:f:8:cf:2\ncell:W126:l:1:f:8:cf:2\ncell:O127:l:1:f:8:cf:2\ncell:P127:l:1:f:8:cf:2\ncell:Q127:l:1:f:8:cf:2\ncell:R127:l:1:f:8:cf:2\ncell:S127:l:1:f:8:cf:2\ncell:T127:l:1:f:8:cf:2\ncell:U127:l:1:f:8:cf:2\ncell:V127:l:1:f:8:cf:2\ncell:W127:l:1:f:8:cf:2\ncell:O128:l:1:f:8:cf:2\ncell:P128:l:1:f:8:cf:2\ncell:Q128:l:1:f:8:cf:2\ncell:R128:l:1:f:8:cf:2\ncell:S128:l:1:f:8:cf:2\ncell:T128:l:1:f:8:cf:2\ncell:U128:l:1:f:8:cf:2\ncell:V128:l:1:f:8:cf:2\ncell:W128:l:1:f:8:cf:2\ncell:O129:l:1:f:8:cf:2\ncell:P129:l:1:f:8:cf:2\ncell:Q129:l:1:f:8:cf:2\ncell:R129:l:1:f:8:cf:2\ncell:S129:l:1:f:8:cf:2\ncell:T129:l:1:f:8:cf:2\ncell:U129:l:1:f:8:cf:2\ncell:V129:l:1:f:8:cf:2\ncell:W129:l:1:f:8:cf:2\ncell:O130:l:1:f:8:cf:2\ncell:P130:l:1:f:8:cf:2\ncell:Q130:l:1:f:8:cf:2\ncell:R130:l:1:f:8:cf:2\ncell:S130:l:1:f:8:cf:2\ncell:T130:l:1:f:8:cf:2\ncell:U130:l:1:f:8:cf:2\ncell:V130:l:1:f:8:cf:2\ncell:W130:l:1:f:8:cf:2\ncell:O131:l:1:f:8:cf:2\ncell:P131:l:1:f:8:cf:2\ncell:Q131:l:1:f:8:cf:2\ncell:R131:l:1:f:8:cf:2\ncell:S131:l:1:f:8:cf:2\ncell:T131:l:1:f:8:cf:2\ncell:U131:l:1:f:8:cf:2\ncell:V131:l:1:f:8:cf:2\ncell:W131:l:1:f:8:cf:2\ncell:O132:l:1:f:8:cf:2\ncell:P132:l:1:f:8:cf:2\ncell:Q132:l:1:f:8:cf:2\ncell:R132:l:1:f:8:cf:2\ncell:S132:l:1:f:8:cf:2\ncell:T132:l:1:f:8:cf:2\ncell:U132:l:1:f:8:cf:2\ncell:V132:l:1:f:8:cf:2\ncell:W132:l:1:f:8:cf:2\ncell:O133:l:1:f:8:cf:2\ncell:P133:l:1:f:8:cf:2\ncell:Q133:l:1:f:8:cf:2\ncell:R133:l:1:f:8:cf:2\ncell:S133:l:1:f:8:cf:2\ncell:T133:l:1:f:8:cf:2\ncell:U133:l:1:f:8:cf:2\ncell:V133:l:1:f:8:cf:2\ncell:W133:l:1:f:8:cf:2\ncell:O134:l:1:f:8:cf:2\ncell:P134:l:1:f:8:cf:2\ncell:Q134:l:1:f:8:cf:2\ncell:R134:l:1:f:8:cf:2\ncell:S134:l:1:f:8:cf:2\ncell:T134:l:1:f:8:cf:2\ncell:U134:l:1:f:8:cf:2\ncell:V134:l:1:f:8:cf:2\ncell:W134:l:1:f:8:cf:2\ncell:O135:l:1:f:8:cf:2\ncell:P135:l:1:f:8:cf:2\ncell:Q135:l:1:f:8:cf:2\ncell:R135:l:1:f:8:cf:2\ncell:S135:l:1:f:8:cf:2\ncell:T135:l:1:f:8:cf:2\ncell:U135:l:1:f:8:cf:2\ncell:V135:l:1:f:8:cf:2\ncell:W135:l:1:f:8:cf:2\ncell:O136:l:1:f:8:cf:2\ncell:P136:l:1:f:8:cf:2\ncell:Q136:l:1:f:8:cf:2\ncell:R136:l:1:f:8:cf:2\ncell:S136:l:1:f:8:cf:2\ncell:T136:l:1:f:8:cf:2\ncell:U136:l:1:f:8:cf:2\ncell:V136:l:1:f:8:cf:2\ncell:W136:l:1:f:8:cf:2\ncell:O137:l:1:f:8:cf:2\ncell:P137:l:1:f:8:cf:2\ncell:Q137:l:1:f:8:cf:2\ncell:R137:l:1:f:8:cf:2\ncell:S137:l:1:f:8:cf:2\ncell:T137:l:1:f:8:cf:2\ncell:U137:l:1:f:8:cf:2\ncell:V137:l:1:f:8:cf:2\ncell:W137:l:1:f:8:cf:2\ncell:O138:l:1:f:8:cf:2\ncell:P138:l:1:f:8:cf:2\ncell:Q138:l:1:f:8:cf:2\ncell:R138:l:1:f:8:cf:2\ncell:S138:l:1:f:8:cf:2\ncell:T138:l:1:f:8:cf:2\ncell:U138:l:1:f:8:cf:2\ncell:V138:l:1:f:8:cf:2\ncell:W138:l:1:f:8:cf:2\ncell:O139:l:1:f:8:cf:2\ncell:P139:l:1:f:8:cf:2\ncell:Q139:l:1:f:8:cf:2\ncell:R139:l:1:f:8:cf:2\ncell:S139:l:1:f:8:cf:2\ncell:T139:l:1:f:8:cf:2\ncell:U139:l:1:f:8:cf:2\ncell:V139:l:1:f:8:cf:2\ncell:W139:l:1:f:8:cf:2\ncell:O140:l:1:f:8:cf:2\ncell:P140:l:1:f:8:cf:2\ncell:Q140:l:1:f:8:cf:2\ncell:R140:l:1:f:8:cf:2\ncell:S140:l:1:f:8:cf:2\ncell:T140:l:1:f:8:cf:2\ncell:U140:l:1:f:8:cf:2\ncell:V140:l:1:f:8:cf:2\ncell:W140:l:1:f:8:cf:2\ncell:O141:l:1:f:8:cf:2\ncell:P141:l:1:f:8:cf:2\ncell:Q141:l:1:f:8:cf:2\ncell:R141:l:1:f:8:cf:2\ncell:S141:l:1:f:8:cf:2\ncell:T141:l:1:f:8:cf:2\ncell:U141:l:1:f:8:cf:2\ncell:V141:l:1:f:8:cf:2\ncell:W141:l:1:f:8:cf:2\ncell:O142:l:1:f:8:cf:2\ncell:P142:l:1:f:8:cf:2\ncell:Q142:l:1:f:8:cf:2\ncell:R142:l:1:f:8:cf:2\ncell:S142:l:1:f:8:cf:2\ncell:T142:l:1:f:8:cf:2\ncell:U142:l:1:f:8:cf:2\ncell:V142:l:1:f:8:cf:2\ncell:W142:l:1:f:8:cf:2\ncell:O143:l:1:f:8:cf:2\ncell:P143:l:1:f:8:cf:2\ncell:Q143:l:1:f:8:cf:2\ncell:R143:l:1:f:8:cf:2\ncell:S143:l:1:f:8:cf:2\ncell:T143:l:1:f:8:cf:2\ncell:U143:l:1:f:8:cf:2\ncell:V143:l:1:f:8:cf:2\ncell:W143:l:1:f:8:cf:2\ncell:O144:l:1:f:8:cf:2\ncell:P144:l:1:f:8:cf:2\ncell:Q144:l:1:f:8:cf:2\ncell:R144:l:1:f:8:cf:2\ncell:S144:l:1:f:8:cf:2\ncell:T144:l:1:f:8:cf:2\ncell:U144:l:1:f:8:cf:2\ncell:V144:l:1:f:8:cf:2\ncell:W144:l:1:f:8:cf:2\ncell:O145:l:1:f:8:cf:2\ncell:P145:l:1:f:8:cf:2\ncell:Q145:l:1:f:8:cf:2\ncell:R145:l:1:f:8:cf:2\ncell:S145:l:1:f:8:cf:2\ncell:T145:l:1:f:8:cf:2\ncell:U145:l:1:f:8:cf:2\ncell:V145:l:1:f:8:cf:2\ncell:W145:l:1:f:8:cf:2\ncell:O146:l:1:f:8:cf:2\ncell:P146:l:1:f:8:cf:2\ncell:Q146:l:1:f:8:cf:2\ncell:R146:l:1:f:8:cf:2\ncell:S146:l:1:f:8:cf:2\ncell:T146:l:1:f:8:cf:2\ncell:U146:l:1:f:8:cf:2\ncell:V146:l:1:f:8:cf:2\ncell:W146:l:1:f:8:cf:2\ncell:O147:l:1:f:8:cf:2\ncell:P147:l:1:f:8:cf:2\ncell:Q147:l:1:f:8:cf:2\ncell:R147:l:1:f:8:cf:2\ncell:S147:l:1:f:8:cf:2\ncell:T147:l:1:f:8:cf:2\ncell:U147:l:1:f:8:cf:2\ncell:V147:l:1:f:8:cf:2\ncell:W147:l:1:f:8:cf:2\ncell:O148:l:1:f:8:cf:2\ncell:P148:l:1:f:8:cf:2\ncell:Q148:l:1:f:8:cf:2\ncell:R148:l:1:f:8:cf:2\ncell:S148:l:1:f:8:cf:2\ncell:T148:l:1:f:8:cf:2\ncell:U148:l:1:f:8:cf:2\ncell:V148:l:1:f:8:cf:2\ncell:W148:l:1:f:8:cf:2\ncell:O149:l:1:f:8:cf:2\ncell:P149:l:1:f:8:cf:2\ncell:Q149:l:1:f:8:cf:2\ncell:R149:l:1:f:8:cf:2\ncell:S149:l:1:f:8:cf:2\ncell:T149:l:1:f:8:cf:2\ncell:U149:l:1:f:8:cf:2\ncell:V149:l:1:f:8:cf:2\ncell:W149:l:1:f:8:cf:2\ncell:O150:l:1:f:10:cf:2\ncell:P150:l:1:f:10:cf:2\ncell:Q150:l:1:f:10:cf:2\ncell:R150:l:1:f:10:cf:2\ncell:S150:l:1:f:10:cf:2\ncell:T150:l:1:f:10:cf:2\ncell:U150:l:1:f:10:cf:2\ncell:V150:l:1:f:10:cf:2\ncell:W150:l:1:f:10:cf:2\ncell:O151:l:1:f:10:cf:2\ncell:P151:l:1:f:10:cf:2\ncell:Q151:l:1:f:10:cf:2\ncell:R151:l:1:f:10:cf:2\ncell:S151:l:1:f:10:cf:2\ncell:T151:l:1:f:10:cf:2\ncell:U151:l:1:f:10:cf:2\ncell:V151:l:1:f:10:cf:2\ncell:W151:l:1:f:10:cf:2\ncell:O152:l:1:f:10:cf:2\ncell:P152:l:1:f:10:cf:2\ncell:Q152:l:1:f:10:cf:2\ncell:R152:l:1:f:10:cf:2\ncell:S152:l:1:f:10:cf:2\ncell:T152:l:1:f:10:cf:2\ncell:U152:l:1:f:10:cf:2\ncell:V152:l:1:f:10:cf:2\ncell:W152:l:1:f:10:cf:2\ncell:O153:l:1:f:10:cf:2\ncell:P153:l:1:f:10:cf:2\ncell:Q153:l:1:f:10:cf:2\ncell:R153:l:1:f:10:cf:2\ncell:S153:l:1:f:10:cf:2\ncell:T153:l:1:f:10:cf:2\ncell:U153:l:1:f:10:cf:2\ncell:V153:l:1:f:10:cf:2\ncell:W153:l:1:f:10:cf:2\ncell:A154:l:1:f:10:cf:2\ncell:B154:l:1:f:10:cf:2\ncell:C154:l:1:f:10:cf:2\ncell:D154:l:1:f:10:cf:2\ncell:E154:l:1:f:10:cf:2\ncell:F154:t:Monthly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G154:l:1:f:10:cf:2\ncell:H154:l:1:f:10:cf:2\ncell:I154:l:1:f:10:cf:2\ncell:J154:l:1:f:10:cf:2\ncell:K154:l:1:f:10:cf:2\ncell:L154:l:1:f:10:cf:2\ncell:M154:l:1:f:10:cf:2\ncell:N154:l:1:f:10:cf:2\ncell:O154:l:1:f:10:cf:2\ncell:P154:l:1:f:10:cf:2\ncell:Q154:l:1:f:10:cf:2\ncell:R154:l:1:f:10:cf:2\ncell:S154:l:1:f:10:cf:2\ncell:T154:l:1:f:10:cf:2\ncell:U154:l:1:f:10:cf:2\ncell:V154:l:1:f:10:cf:2\ncell:W154:l:1:f:10:cf:2\ncell:A155:l:1:f:10:cf:2\ncell:B155:l:1:f:10:cf:2\ncell:C155:l:1:f:10:cf:2\ncell:D155:l:1:f:10:cf:2\ncell:E155:l:1:f:10:cf:2\ncell:F155:t:Semi-Annually:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G155:l:1:f:10:cf:2\ncell:H155:l:1:f:10:cf:2\ncell:I155:l:1:f:10:cf:2\ncell:J155:l:1:f:10:cf:2\ncell:K155:l:1:f:10:cf:2\ncell:L155:l:1:f:10:cf:2\ncell:M155:l:1:f:10:cf:2\ncell:N155:l:1:f:10:cf:2\ncell:O155:l:1:f:10:cf:2\ncell:P155:l:1:f:10:cf:2\ncell:Q155:l:1:f:10:cf:2\ncell:R155:l:1:f:10:cf:2\ncell:S155:l:1:f:10:cf:2\ncell:T155:l:1:f:10:cf:2\ncell:U155:l:1:f:10:cf:2\ncell:V155:l:1:f:10:cf:2\ncell:W155:l:1:f:10:cf:2\ncell:A156:l:1:f:10:cf:2\ncell:B156:l:1:f:10:cf:2\ncell:C156:l:1:f:10:cf:2\ncell:D156:l:1:f:10:cf:2\ncell:E156:l:1:f:10:cf:2\ncell:F156:t:Quarterly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G156:l:1:f:10:cf:2\ncell:H156:l:1:f:10:cf:2\ncell:I156:l:1:f:10:cf:2\ncell:J156:l:1:f:10:cf:2\ncell:K156:l:1:f:10:cf:2\ncell:L156:l:1:f:10:cf:2\ncell:M156:l:1:f:10:cf:2\ncell:N156:l:1:f:10:cf:2\ncell:O156:l:1:f:10:cf:2\ncell:P156:l:1:f:10:cf:2\ncell:Q156:l:1:f:10:cf:2\ncell:R156:l:1:f:10:cf:2\ncell:S156:l:1:f:10:cf:2\ncell:T156:l:1:f:10:cf:2\ncell:U156:l:1:f:10:cf:2\ncell:V156:l:1:f:10:cf:2\ncell:W156:l:1:f:10:cf:2\ncell:A157:l:1:f:10:cf:2\ncell:B157:l:1:f:10:cf:2\ncell:C157:l:1:f:10:cf:2\ncell:D157:l:1:f:10:cf:2\ncell:E157:l:1:f:10:cf:2\ncell:F157:t:Yearly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G157:l:1:f:10:cf:2\ncell:H157:l:1:f:10:cf:2\ncell:I157:l:1:f:10:cf:2\ncell:J157:l:1:f:10:cf:2\ncell:K157:l:1:f:10:cf:2\ncell:L157:l:1:f:10:cf:2\ncell:M157:l:1:f:10:cf:2\ncell:N157:l:1:f:10:cf:2\ncell:O157:l:1:f:10:cf:2\ncell:P157:l:1:f:10:cf:2\ncell:Q157:l:1:f:10:cf:2\ncell:R157:l:1:f:10:cf:2\ncell:S157:l:1:f:10:cf:2\ncell:T157:l:1:f:10:cf:2\ncell:U157:l:1:f:10:cf:2\ncell:V157:l:1:f:10:cf:2\ncell:W157:l:1:f:10:cf:2\ncell:A158:l:1:f:10:cf:2\ncell:B158:l:1:f:10:cf:2\ncell:C158:l:1:f:10:cf:2\ncell:D158:l:1:f:10:cf:2\ncell:E158:l:1:f:10:cf:2\ncell:F158:l:1:f:10:cf:2\ncell:G158:l:1:f:10:cf:2\ncell:H158:l:1:f:10:cf:2\ncell:I158:l:1:f:10:cf:2\ncell:J158:l:1:f:10:cf:2\ncell:K158:l:1:f:10:cf:2\ncell:L158:l:1:f:10:cf:2\ncell:M158:l:1:f:10:cf:2\ncell:N158:l:1:f:10:cf:2\ncell:O158:l:1:f:10:cf:2\ncell:P158:l:1:f:10:cf:2\ncell:Q158:l:1:f:10:cf:2\ncell:R158:l:1:f:10:cf:2\ncell:S158:l:1:f:10:cf:2\ncell:T158:l:1:f:10:cf:2\ncell:U158:l:1:f:10:cf:2\ncell:V158:l:1:f:10:cf:2\ncell:W158:l:1:f:10:cf:2\ncell:A159:l:1:f:10:cf:2\ncell:B159:l:1:f:10:cf:2\ncell:C159:l:1:f:10:cf:2\ncell:D159:l:1:f:10:cf:2\ncell:E159:l:1:f:10:cf:2\ncell:F159:l:1:f:10:cf:2\ncell:G159:l:1:f:10:cf:2\ncell:H159:l:1:f:10:cf:2\ncell:I159:l:1:f:10:cf:2\ncell:J159:l:1:f:10:cf:2\ncell:K159:l:1:f:10:cf:2\ncell:L159:l:1:f:10:cf:2\ncell:M159:l:1:f:10:cf:2\ncell:N159:l:1:f:10:cf:2\ncell:O159:l:1:f:10:cf:2\ncell:P159:l:1:f:10:cf:2\ncell:Q159:l:1:f:10:cf:2\ncell:R159:l:1:f:10:cf:2\ncell:S159:l:1:f:10:cf:2\ncell:T159:l:1:f:10:cf:2\ncell:U159:l:1:f:10:cf:2\ncell:V159:l:1:f:10:cf:2\ncell:W159:l:1:f:10:cf:2\ncell:A160:l:1:f:10:cf:2\ncell:B160:l:1:f:10:cf:2\ncell:C160:l:1:f:10:cf:2\ncell:D160:l:1:f:10:cf:2\ncell:E160:l:1:f:10:cf:2\ncell:F160:l:1:f:10:cf:2\ncell:G160:l:1:f:10:cf:2\ncell:H160:l:1:f:10:cf:2\ncell:I160:l:1:f:10:cf:2\ncell:J160:l:1:f:10:cf:2\ncell:K160:l:1:f:10:cf:2\ncell:L160:l:1:f:10:cf:2\ncell:M160:l:1:f:10:cf:2\ncell:N160:l:1:f:10:cf:2\ncell:O160:l:1:f:10:cf:2\ncell:P160:l:1:f:10:cf:2\ncell:Q160:l:1:f:10:cf:2\ncell:R160:l:1:f:10:cf:2\ncell:S160:l:1:f:10:cf:2\ncell:T160:l:1:f:10:cf:2\ncell:U160:l:1:f:10:cf:2\ncell:V160:l:1:f:10:cf:2\ncell:W160:l:1:f:10:cf:2\ncell:A161:l:1:f:10:cf:2\ncell:B161:l:1:f:10:cf:2\ncell:C161:l:1:f:10:cf:2\ncell:D161:l:1:f:10:cf:2\ncell:E161:l:1:f:10:cf:2\ncell:F161:l:1:f:10:cf:2\ncell:G161:l:1:f:10:cf:2\ncell:H161:l:1:f:10:cf:2\ncell:I161:l:1:f:10:cf:2\ncell:J161:l:1:f:10:cf:2\ncell:K161:l:1:f:10:cf:2\ncell:L161:l:1:f:10:cf:2\ncell:M161:l:1:f:10:cf:2\ncell:N161:l:1:f:10:cf:2\ncell:O161:l:1:f:10:cf:2\ncell:P161:l:1:f:10:cf:2\ncell:Q161:l:1:f:10:cf:2\ncell:R161:l:1:f:10:cf:2\ncell:S161:l:1:f:10:cf:2\ncell:T161:l:1:f:10:cf:2\ncell:U161:l:1:f:10:cf:2\ncell:V161:l:1:f:10:cf:2\ncell:W161:l:1:f:10:cf:2\ncell:A162:l:1:f:10:cf:2\ncell:B162:l:1:f:10:cf:2\ncell:C162:l:1:f:10:cf:2\ncell:D162:l:1:f:10:cf:2\ncell:E162:l:1:f:10:cf:2\ncell:F162:l:1:f:10:cf:2\ncell:G162:l:1:f:10:cf:2\ncell:H162:l:1:f:10:cf:2\ncell:I162:l:1:f:10:cf:2\ncell:J162:l:1:f:10:cf:2\ncell:K162:l:1:f:10:cf:2\ncell:L162:l:1:f:10:cf:2\ncell:M162:l:1:f:10:cf:2\ncell:N162:l:1:f:10:cf:2\ncell:O162:l:1:f:10:cf:2\ncell:P162:l:1:f:10:cf:2\ncell:Q162:l:1:f:10:cf:2\ncell:R162:l:1:f:10:cf:2\ncell:S162:l:1:f:10:cf:2\ncell:T162:l:1:f:10:cf:2\ncell:U162:l:1:f:10:cf:2\ncell:V162:l:1:f:10:cf:2\ncell:W162:l:1:f:10:cf:2\ncell:A163:l:1:f:10:cf:2\ncell:B163:l:1:f:10:cf:2\ncell:C163:l:1:f:10:cf:2\ncell:D163:l:1:f:10:cf:2\ncell:E163:l:1:f:10:cf:2\ncell:F163:l:1:f:10:cf:2\ncell:G163:l:1:f:10:cf:2\ncell:H163:l:1:f:10:cf:2\ncell:I163:l:1:f:10:cf:2\ncell:J163:l:1:f:10:cf:2\ncell:K163:l:1:f:10:cf:2\ncell:L163:l:1:f:10:cf:2\ncell:M163:l:1:f:10:cf:2\ncell:N163:l:1:f:10:cf:2\ncell:O163:l:1:f:10:cf:2\ncell:P163:l:1:f:10:cf:2\ncell:Q163:l:1:f:10:cf:2\ncell:R163:l:1:f:10:cf:2\ncell:S163:l:1:f:10:cf:2\ncell:T163:l:1:f:10:cf:2\ncell:U163:l:1:f:10:cf:2\ncell:V163:l:1:f:10:cf:2\ncell:W163:l:1:f:10:cf:2\ncell:A164:l:1:f:10:cf:2\ncell:B164:l:1:f:10:cf:2\ncell:C164:l:1:f:10:cf:2\ncell:D164:l:1:f:10:cf:2\ncell:E164:l:1:f:10:cf:2\ncell:F164:l:1:f:10:cf:2\ncell:G164:l:1:f:10:cf:2\ncell:H164:l:1:f:10:cf:2\ncell:I164:l:1:f:10:cf:2\ncell:J164:l:1:f:10:cf:2\ncell:K164:l:1:f:10:cf:2\ncell:L164:l:1:f:10:cf:2\ncell:M164:l:1:f:10:cf:2\ncell:N164:l:1:f:10:cf:2\ncell:O164:l:1:f:10:cf:2\ncell:P164:l:1:f:10:cf:2\ncell:Q164:l:1:f:10:cf:2\ncell:R164:l:1:f:10:cf:2\ncell:S164:l:1:f:10:cf:2\ncell:T164:l:1:f:10:cf:2\ncell:U164:l:1:f:10:cf:2\ncell:V164:l:1:f:10:cf:2\ncell:W164:l:1:f:10:cf:2\ncell:A165:l:1:f:10:cf:2\ncell:B165:l:1:f:10:cf:2\ncell:C165:l:1:f:10:cf:2\ncell:D165:l:1:f:10:cf:2\ncell:E165:l:1:f:10:cf:2\ncell:F165:l:1:f:10:cf:2\ncell:G165:l:1:f:10:cf:2\ncell:H165:l:1:f:10:cf:2\ncell:I165:l:1:f:10:cf:2\ncell:J165:l:1:f:10:cf:2\ncell:K165:l:1:f:10:cf:2\ncell:L165:l:1:f:10:cf:2\ncell:M165:l:1:f:10:cf:2\ncell:N165:l:1:f:10:cf:2\ncell:O165:l:1:f:10:cf:2\ncell:P165:l:1:f:10:cf:2\ncell:Q165:l:1:f:10:cf:2\ncell:R165:l:1:f:10:cf:2\ncell:S165:l:1:f:10:cf:2\ncell:T165:l:1:f:10:cf:2\ncell:U165:l:1:f:10:cf:2\ncell:V165:l:1:f:10:cf:2\ncell:W165:l:1:f:10:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:30\nrow:5:h:171\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:18.75\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:15\nrow:17:h:15\nrow:18:h:15\nrow:19:h:15\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nrow:102:h:14.25\nrow:103:h:14.25\nrow:104:h:14.25\nrow:105:h:14.25\nrow:106:h:14.25\nrow:107:h:14.25\nrow:108:h:14.25\nrow:109:h:14.25\nrow:110:h:14.25\nrow:111:h:14.25\nrow:112:h:14.25\nrow:113:h:14.25\nrow:114:h:14.25\nrow:115:h:14.25\nrow:116:h:14.25\nrow:117:h:14.25\nrow:118:h:14.25\nrow:119:h:14.25\nrow:120:h:14.25\nrow:121:h:14.25\nrow:122:h:14.25\nrow:123:h:14.25\nrow:124:h:14.25\nrow:125:h:14.25\nrow:126:h:14.25\nrow:127:h:14.25\nrow:128:h:14.25\nrow:129:h:14.25\nrow:130:h:14.25\nrow:131:h:14.25\nrow:132:h:14.25\nrow:133:h:14.25\nrow:134:h:14.25\nrow:135:h:14.25\nrow:136:h:14.25\nrow:137:h:14.25\nrow:138:h:14.25\nrow:139:h:14.25\nrow:140:h:14.25\nrow:141:h:14.25\nrow:142:h:14.25\nrow:143:h:14.25\nrow:144:h:14.25\nrow:145:h:14.25\nrow:146:h:14.25\nrow:147:h:14.25\nrow:148:h:14.25\nrow:149:h:14.25\nsheet:c:27:r:165:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(136,204,119)\ncolor:4:rgb(230,230,250)\ncolor:5:rgb(255, 255, 255)\ncolor:6:rgb(255,255,187)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 24pt Arial\nfont:6:normal bold 9pt Arial\nfont:7:normal normal * Arial\nfont:8:normal normal 10pt Arial\nfont:9:normal normal 12pt Arial\nfont:10:normal normal 7pt Arial\nfont:11:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\nname:COMPARISON::S91\\cU105\nname:TRACKING::AC91\\cAE105\n', - }, - name: "expense", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:6:cf:2:ntvf:2\ncell:B1:l:1:f:6:cf:2\ncell:C1:l:1:f:6:cf:2\ncell:D1:l:1:f:6:cf:2\ncell:E1:l:1:f:6:cf:2\ncell:F1:l:1:f:6:cf:2\ncell:G1:l:1:f:6:cf:2\ncell:H1:l:1:f:6:cf:2\ncell:I1:l:1:f:6:cf:2\ncell:J1:l:1:f:6:cf:2\ncell:K1:l:1:f:6:cf:2\ncell:L1:l:1:f:6:cf:2\ncell:M1:l:1:f:6:cf:2\ncell:N1:l:1:f:6:cf:2\ncell:O1:l:1:f:6:cf:2\ncell:P1:l:1:f:6:cf:2\ncell:Q1:l:1:f:6:cf:2\ncell:R1:l:1:f:6:cf:2\ncell:S1:l:1:f:6:cf:2\ncell:T1:l:1:f:6:cf:2\ncell:U1:l:1:f:6:cf:2\ncell:V1:l:1:f:6:cf:2\ncell:W1:l:1:f:6:cf:2\ncell:A2:l:1:f:6:cf:2\ncell:B2:l:1:f:6:cf:2\ncell:C2:l:1:f:6:cf:2\ncell:D2:t:Expenses:l:2:f:3:cf:2\ncell:E2:l:1:f:6:cf:2\ncell:F2:l:1:f:6:cf:2\ncell:G2:l:1:f:6:cf:2\ncell:H2:l:1:f:6:cf:2\ncell:I2:l:1:f:6:cf:2\ncell:J2:l:1:f:6:cf:2\ncell:K2:l:1:f:6:cf:2\ncell:L2:l:1:f:6:cf:2\ncell:M2:l:1:f:6:cf:2\ncell:N2:l:1:f:6:cf:2\ncell:O2:l:1:f:6:cf:2\ncell:P2:l:1:f:6:cf:2\ncell:Q2:l:1:f:6:cf:2\ncell:R2:l:1:f:6:cf:2\ncell:S2:l:1:f:6:cf:2\ncell:T2:l:1:f:6:cf:2\ncell:U2:l:1:f:6:cf:2\ncell:V2:l:1:f:6:cf:2\ncell:W2:l:1:f:6:cf:2\ncell:A3:l:1:f:6:cf:2\ncell:B3:l:1:f:6:cf:2\ncell:C3:l:1:f:6:cf:2\ncell:D3:l:1:f:6:cf:2\ncell:G3:l:1:f:6:cf:2\ncell:H3:l:1:f:6:cf:2\ncell:I3:l:1:f:6:cf:2\ncell:J3:l:1:f:6:cf:2\ncell:K3:l:1:f:6:cf:2\ncell:L3:l:1:f:6:cf:2\ncell:M3:l:1:f:6:cf:2\ncell:N3:l:1:f:6:cf:2\ncell:O3:l:1:f:6:cf:2\ncell:P3:l:1:f:6:cf:2\ncell:Q3:t: :l:1:f:6:cf:2\ncell:R3:l:1:f:6:cf:2\ncell:S3:l:1:f:6:cf:2\ncell:T3:l:1:f:6:cf:2\ncell:U3:l:1:f:6:cf:2\ncell:V3:l:1:f:6:cf:2\ncell:W3:l:1:f:6:cf:2\ncell:B4:t:Food & Beverages:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C4:b:2:2:2:2:l:3:f:2:c:4:bg:2:cf:2\ncell:D4:b:2:2:2:2:l:3:f:2:c:4:bg:2:cf:1\ncell:E4:vtf:n:511:E5+E9:b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F4:vtf:n:6132:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O4:l:1:f:6:cf:2\ncell:P4:l:1:f:6:cf:2\ncell:Q4:l:1:f:6:cf:2\ncell:R4:l:1:f:6:cf:2\ncell:S4:l:1:f:6:cf:2\ncell:T4:l:1:f:6:cf:2\ncell:U4:l:1:f:6:cf:2\ncell:V4:l:1:f:6:cf:2\ncell:W4:l:1:f:6:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:5:c:1:bg:5\ncell:C5:t:Food at home:l:3:f:5:c:1:bg:5:cf:2:colspan:2\ncell:D5:t::b::1:1::l:3:f:5:c:1:bg:5:cf:2\ncell:E5:vtf:n:302:SUM(E6\\cE8):b:::1::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:F5:vtf:n:3624:IF( (E5*12)=0,"",(E5*12)):b::1:::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:6:cf:2\ncell:P5:l:1:f:6:cf:2\ncell:Q5:l:1:f:6:cf:2\ncell:R5:l:1:f:6:cf:2\ncell:S5:l:1:f:6:cf:2\ncell:T5:l:1:f:6:cf:2\ncell:U5:l:1:f:6:cf:2\ncell:V5:l:1:f:6:cf:2\ncell:W5:l:1:f:6:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:6:cf:2\ncell:C6:l:3:f:6:cf:2\ncell:D6:t:Groceries:l:3:f:5:cf:2\ncell:E6:v:302:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F6:vtf:n:3624:IF( (E6*12)=0,"",(E6*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:6:cf:2\ncell:P6:l:1:f:6:cf:2\ncell:Q6:l:1:f:6:cf:2\ncell:R6:l:1:f:6:cf:2\ncell:S6:l:1:f:6:cf:2\ncell:T6:l:1:f:6:cf:2\ncell:U6:l:1:f:6:cf:2\ncell:V6:l:1:f:6:cf:2\ncell:W6:l:1:f:6:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:6:bg:3:cf:2\ncell:C7:l:3:f:6:bg:3:cf:2\ncell:D7:t:Cooking supplies:l:3:f:5:bg:3:cf:2\ncell:E7:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1:::l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:6:cf:2\ncell:P7:l:1:f:6:cf:2\ncell:Q7:l:1:f:6:cf:2\ncell:R7:l:1:f:6:cf:2\ncell:S7:l:1:f:6:cf:2\ncell:T7:l:1:f:6:cf:2\ncell:U7:l:1:f:6:cf:2\ncell:V7:l:1:f:6:cf:2\ncell:W7:l:1:f:6:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:6:cf:2\ncell:C8:l:3:f:6:cf:2\ncell:D8:t:Other:l:3:f:5:cf:2\ncell:E8:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:6:cf:2\ncell:P8:l:1:f:6:cf:2\ncell:Q8:l:1:f:6:cf:2\ncell:R8:l:1:f:6:cf:2\ncell:S8:l:1:f:6:cf:2\ncell:T8:l:1:f:6:cf:2\ncell:U8:l:1:f:6:cf:2\ncell:V8:l:1:f:6:cf:2\ncell:W8:l:1:f:6:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:5:c:1:bg:5\ncell:C9:t:Dining Out:l:3:f:5:c:1:bg:5:cf:2:colspan:2\ncell:D9:t:Tips:b::1:1::l:3:f:5:c:1:bg:5:cf:2\ncell:E9:vtf:n:209:SUM(E10\\cE11):b:::1::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:F9:vtf:n:2508:IF( (E9*12)=0,"",(E9*12)):b::1:::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:6:cf:2\ncell:P9:l:1:f:6:cf:2\ncell:Q9:l:1:f:6:cf:2\ncell:R9:l:1:f:6:cf:2\ncell:S9:l:1:f:6:cf:2\ncell:T9:l:1:f:6:cf:2\ncell:U9:l:1:f:6:cf:2\ncell:V9:l:1:f:6:cf:2\ncell:W9:l:1:f:6:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:6:cf:2\ncell:C10:l:3:f:6:cf:2\ncell:D10:t:Restaurants:b::1:::l:3:f:5:cf:2\ncell:E10:v:209:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F10:vtf:n:2508:IF( (E10*12)=0,"",(E10*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:6:cf:2\ncell:P10:l:1:f:6:cf:2\ncell:Q10:l:1:f:6:cf:2\ncell:R10:l:1:f:6:cf:2\ncell:S10:l:1:f:6:cf:2\ncell:T10:l:1:f:6:cf:2\ncell:U10:l:1:f:6:cf:2\ncell:V10:l:1:f:6:cf:2\ncell:W10:l:1:f:6:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:6:bg:3:cf:2\ncell:C11:l:3:f:6:bg:3:cf:2\ncell:D11:t:Other :l:3:f:5:bg:3:cf:2\ncell:E11:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1:::l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:6:cf:2\ncell:P11:l:1:f:6:cf:2\ncell:Q11:l:1:f:6:cf:2\ncell:R11:l:1:f:6:cf:2\ncell:S11:l:1:f:6:cf:2\ncell:T11:l:1:f:6:cf:2\ncell:U11:l:1:f:6:cf:2\ncell:V11:l:1:f:6:cf:2\ncell:W11:l:1:f:6:cf:2\ncell:B12:t:Clothes & Personal Services:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C12:l:3:f:2:c:4:bg:2:cf:2\ncell:D12:l:3:f:2:c:4:bg:2:cf:1\ncell:E12:vtf:n:191:SUM(E13\\cE16):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F12:vtf:n:2292:IF( (E12*12)=0,"",(E12*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O12:l:1:f:6:cf:2\ncell:P12:l:1:f:6:cf:2\ncell:Q12:l:1:f:6:cf:2\ncell:R12:l:1:f:6:cf:2\ncell:S12:l:1:f:6:cf:2\ncell:T12:l:1:f:6:cf:2\ncell:U12:l:1:f:6:cf:2\ncell:V12:l:1:f:6:cf:2\ncell:W12:l:1:f:6:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:6:cf:2\ncell:C13:l:3:f:6:cf:2\ncell:D13:t:Clothes:l:3:f:5:cf:2\ncell:E13:v:142:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F13:vtf:n:1704:IF( (E13*12)=0,"",(E13*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:6:cf:2\ncell:P13:l:1:f:6:cf:2\ncell:Q13:l:1:f:6:cf:2\ncell:R13:l:1:f:6:cf:2\ncell:S13:l:1:f:6:cf:2\ncell:T13:l:1:f:6:cf:2\ncell:U13:l:1:f:6:cf:2\ncell:V13:l:1:f:6:cf:2\ncell:W13:l:1:f:6:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:6:bg:3:cf:2\ncell:C14:l:3:f:6:bg:3:cf:2\ncell:D14:t:Footwear:l:3:f:5:bg:3:cf:2\ncell:E14:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F14:vtf:t::IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:6:cf:2\ncell:P14:l:1:f:6:cf:2\ncell:Q14:l:1:f:6:cf:2\ncell:R14:l:1:f:6:cf:2\ncell:S14:l:1:f:6:cf:2\ncell:T14:l:1:f:6:cf:2\ncell:U14:l:1:f:6:cf:2\ncell:V14:l:1:f:6:cf:2\ncell:W14:l:1:f:6:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:6:cf:2\ncell:C15:l:3:f:6:cf:2\ncell:D15:t:Salon and Personal Care:l:3:f:5:cf:2\ncell:E15:v:49:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F15:vtf:n:588:IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:6:cf:2\ncell:P15:l:1:f:6:cf:2\ncell:Q15:l:1:f:6:cf:2\ncell:R15:l:1:f:6:cf:2\ncell:S15:l:1:f:6:cf:2\ncell:T15:l:1:f:6:cf:2\ncell:U15:l:1:f:6:cf:2\ncell:V15:l:1:f:6:cf:2\ncell:W15:l:1:f:6:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:6:bg:3:cf:2\ncell:C16:l:3:f:6:bg:3:cf:2\ncell:D16:t:Other:l:3:f:5:bg:3:cf:2\ncell:E16:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:6:cf:2\ncell:P16:l:1:f:6:cf:2\ncell:Q16:l:1:f:6:cf:2\ncell:R16:l:1:f:6:cf:2\ncell:S16:l:1:f:6:cf:2\ncell:T16:l:1:f:6:cf:2\ncell:U16:l:1:f:6:cf:2\ncell:V16:l:1:f:6:cf:2\ncell:W16:l:1:f:6:cf:2\ncell:B17:t:Transportation:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C17:l:3:f:2:c:4:bg:2:cf:2\ncell:D17:l:3:f:2:c:4:bg:2:cf:1\ncell:E17:vtf:n:640:SUM(E18\\cE25):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F17:vtf:n:7680:IF( (E17*12)=0,"",(E17*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O17:l:1:f:6:cf:2\ncell:P17:l:1:f:6:cf:2\ncell:Q17:l:1:f:6:cf:2\ncell:R17:l:1:f:6:cf:2\ncell:S17:l:1:f:6:cf:2\ncell:T17:l:1:f:6:cf:2\ncell:U17:l:1:f:6:cf:2\ncell:V17:l:1:f:6:cf:2\ncell:W17:l:1:f:6:cf:2\ncell:A18:b::1::\ncell:B18:b::::1:l:3:f:6:bg:4:cf:2\ncell:C18:l:3:f:6:bg:4:cf:2\ncell:D18:t:Owned Vehicle Payments:l:3:f:5:bg:4:cf:2\ncell:E18:v:640:b::1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F18:vtf:n:7680:IF( (E18*12)=0,"",(E18*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O18:l:1:f:6:cf:2\ncell:P18:l:1:f:6:cf:2\ncell:Q18:l:1:f:6:cf:2\ncell:R18:l:1:f:6:cf:2\ncell:S18:l:1:f:6:cf:2\ncell:T18:l:1:f:6:cf:2\ncell:U18:l:1:f:6:cf:2\ncell:V18:l:1:f:6:cf:2\ncell:W18:l:1:f:6:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:6:bg:3:cf:2\ncell:C19:l:3:f:6:bg:3:cf:2\ncell:D19:t:Rentals, Lease Payments:l:3:f:5:bg:3:cf:2\ncell:E19:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F19:vtf:t::IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O19:l:1:f:6:cf:2\ncell:P19:l:1:f:6:cf:2\ncell:Q19:l:1:f:6:cf:2\ncell:R19:l:1:f:6:cf:2\ncell:S19:l:1:f:6:cf:2\ncell:T19:l:1:f:6:cf:2\ncell:U19:l:1:f:6:cf:2\ncell:V19:l:1:f:6:cf:2\ncell:W19:l:1:f:6:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:6:bg:4:cf:2\ncell:C20:l:3:f:6:bg:4:cf:2\ncell:D20:t:Gas & Oil:l:3:f:5:bg:4:cf:2\ncell:E20:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O20:l:1:f:6:cf:2\ncell:P20:l:1:f:6:cf:2\ncell:Q20:l:1:f:6:cf:2\ncell:R20:l:1:f:6:cf:2\ncell:S20:l:1:f:6:cf:2\ncell:T20:l:1:f:6:cf:2\ncell:U20:l:1:f:6:cf:2\ncell:V20:l:1:f:6:cf:2\ncell:W20:l:1:f:6:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:6:bg:3:cf:2\ncell:C21:l:3:f:6:bg:3:cf:2\ncell:D21:t:Maintenance & Repairs:l:3:f:5:bg:3:cf:2\ncell:E21:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O21:l:1:f:6:cf:2\ncell:P21:l:1:f:6:cf:2\ncell:Q21:l:1:f:6:cf:2\ncell:R21:l:1:f:6:cf:2\ncell:S21:l:1:f:6:cf:2\ncell:T21:l:1:f:6:cf:2\ncell:U21:l:1:f:6:cf:2\ncell:V21:l:1:f:6:cf:2\ncell:W21:l:1:f:6:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:6:bg:4:cf:2\ncell:C22:l:3:f:6:bg:4:cf:2\ncell:D22:t:Vehicle Insurance:l:3:f:5:bg:4:cf:2\ncell:E22:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O22:l:1:f:6:cf:2\ncell:P22:l:1:f:6:cf:2\ncell:Q22:l:1:f:6:cf:2\ncell:R22:l:1:f:6:cf:2\ncell:S22:l:1:f:6:cf:2\ncell:T22:l:1:f:6:cf:2\ncell:U22:l:1:f:6:cf:2\ncell:V22:l:1:f:6:cf:2\ncell:W22:l:1:f:6:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:6:bg:3:cf:2\ncell:C23:l:3:f:6:bg:3:cf:2\ncell:D23:t:License, Registration:l:3:f:5:bg:3:cf:2\ncell:E23:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O23:l:1:f:6:cf:2\ncell:P23:l:1:f:6:cf:2\ncell:Q23:l:1:f:6:cf:2\ncell:R23:l:1:f:6:cf:2\ncell:S23:l:1:f:6:cf:2\ncell:T23:l:1:f:6:cf:2\ncell:U23:l:1:f:6:cf:2\ncell:V23:l:1:f:6:cf:2\ncell:W23:l:1:f:6:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:6:bg:4:cf:2\ncell:C24:l:3:f:6:bg:4:cf:2\ncell:D24:t:Commuting Expense:l:3:f:5:bg:4:cf:2\ncell:E24:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O24:l:1:f:6:cf:2\ncell:P24:l:1:f:6:cf:2\ncell:Q24:l:1:f:6:cf:2\ncell:R24:l:1:f:6:cf:2\ncell:S24:l:1:f:6:cf:2\ncell:T24:l:1:f:6:cf:2\ncell:U24:l:1:f:6:cf:2\ncell:V24:l:1:f:6:cf:2\ncell:W24:l:1:f:6:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:6:bg:3:cf:2\ncell:C25:l:3:f:6:bg:3:cf:2\ncell:D25:t:Other:l:3:f:5:bg:3:cf:2\ncell:E25:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F25:vtf:t::IF( (E25*12)=0,"",(E25*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O25:l:1:f:6:cf:2\ncell:P25:l:1:f:6:cf:2\ncell:Q25:l:1:f:6:cf:2\ncell:R25:l:1:f:6:cf:2\ncell:S25:l:1:f:6:cf:2\ncell:T25:l:1:f:6:cf:2\ncell:U25:l:1:f:6:cf:2\ncell:V25:l:1:f:6:cf:2\ncell:W25:l:1:f:6:cf:2\ncell:B26:t:Healthcare:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C26:l:3:f:2:c:4:bg:2:cf:2\ncell:D26:l:3:f:2:c:4:bg:2:cf:1\ncell:E26:vtf:n:263:SUM(E27\\cE31):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F26:vtf:n:3156:IF( (E26*12)=0,"",(E26*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O26:l:1:f:6:cf:2\ncell:P26:l:1:f:6:cf:2\ncell:Q26:l:1:f:6:cf:2\ncell:R26:l:1:f:6:cf:2\ncell:S26:l:1:f:6:cf:2\ncell:T26:l:1:f:6:cf:2\ncell:U26:l:1:f:6:cf:2\ncell:V26:l:1:f:6:cf:2\ncell:W26:l:1:f:6:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:6:cf:2\ncell:C27:l:3:f:6:cf:2\ncell:D27:t:Health Insurance:l:3:f:5:cf:2\ncell:E27:v:263:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F27:vtf:n:3156:IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:6:cf:2\ncell:P27:l:1:f:6:cf:2\ncell:Q27:l:1:f:6:cf:2\ncell:R27:l:1:f:6:cf:2\ncell:S27:l:1:f:6:cf:2\ncell:T27:l:1:f:6:cf:2\ncell:U27:l:1:f:6:cf:2\ncell:V27:l:1:f:6:cf:2\ncell:W27:l:1:f:6:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:6:bg:3:cf:2\ncell:C28:l:3:f:6:bg:3:cf:2\ncell:D28:t:Medical Services:l:3:f:5:bg:3:cf:2\ncell:E28:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:6:cf:2\ncell:P28:l:1:f:6:cf:2\ncell:Q28:l:1:f:6:cf:2\ncell:R28:l:1:f:6:cf:2\ncell:S28:l:1:f:6:cf:2\ncell:T28:l:1:f:6:cf:2\ncell:U28:l:1:f:6:cf:2\ncell:V28:l:1:f:6:cf:2\ncell:W28:l:1:f:6:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:6:cf:2\ncell:C29:l:3:f:6:cf:2\ncell:D29:t:Medicine, Drugs & Supplies:l:3:f:5:cf:2\ncell:E29:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:6:cf:2\ncell:P29:l:1:f:6:cf:2\ncell:Q29:l:1:f:6:cf:2\ncell:R29:l:1:f:6:cf:2\ncell:S29:l:1:f:6:cf:2\ncell:T29:l:1:f:6:cf:2\ncell:U29:l:1:f:6:cf:2\ncell:V29:l:1:f:6:cf:2\ncell:W29:l:1:f:6:cf:2\ncell:A30:b::1::\ncell:B30:b::::1:l:3:f:6:bg:3:cf:2\ncell:C30:l:3:f:6:bg:3:cf:2\ncell:D30:t:Heathclub Memberships:l:3:f:5:bg:3:cf:2\ncell:E30:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G30:b::::1\ncell:O30:l:1:f:6:cf:2\ncell:P30:l:1:f:6:cf:2\ncell:Q30:l:1:f:6:cf:2\ncell:R30:l:1:f:6:cf:2\ncell:S30:l:1:f:6:cf:2\ncell:T30:l:1:f:6:cf:2\ncell:U30:l:1:f:6:cf:2\ncell:V30:l:1:f:6:cf:2\ncell:W30:l:1:f:6:cf:2\ncell:A31:b::1::\ncell:B31:b:::1:1:l:3:f:6:cf:2\ncell:C31:b:::1::l:3:f:6:cf:2\ncell:D31:t:Other:b:::1::l:3:f:5:cf:2\ncell:E31:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:G31:b::::1\ncell:O31:l:1:f:6:cf:2\ncell:P31:l:1:f:6:cf:2\ncell:Q31:l:1:f:6:cf:2\ncell:R31:l:1:f:6:cf:2\ncell:S31:l:1:f:6:cf:2\ncell:T31:l:1:f:6:cf:2\ncell:U31:l:1:f:6:cf:2\ncell:V31:l:1:f:6:cf:2\ncell:W31:l:1:f:6:cf:2\ncell:B32:b:1:::\ncell:C32:b:1:::\ncell:D32:b:1:::\ncell:O32:l:1:f:6:cf:2\ncell:P32:l:1:f:6:cf:2\ncell:Q32:l:1:f:6:cf:2\ncell:R32:l:1:f:6:cf:2\ncell:S32:l:1:f:6:cf:2\ncell:T32:l:1:f:6:cf:2\ncell:U32:l:1:f:6:cf:2\ncell:V32:l:1:f:6:cf:2\ncell:W32:l:1:f:6:cf:2\ncell:O33:l:1:f:6:cf:2\ncell:P33:l:1:f:6:cf:2\ncell:Q33:l:1:f:6:cf:2\ncell:R33:l:1:f:6:cf:2\ncell:S33:l:1:f:6:cf:2\ncell:T33:l:1:f:6:cf:2\ncell:U33:l:1:f:6:cf:2\ncell:V33:l:1:f:6:cf:2\ncell:W33:l:1:f:6:cf:2\ncell:O34:l:1:f:6:cf:2\ncell:P34:l:1:f:6:cf:2\ncell:Q34:l:1:f:6:cf:2\ncell:R34:l:1:f:6:cf:2\ncell:S34:l:1:f:6:cf:2\ncell:T34:l:1:f:6:cf:2\ncell:U34:l:1:f:6:cf:2\ncell:V34:l:1:f:6:cf:2\ncell:W34:l:1:f:6:cf:2\ncell:O35:l:1:f:6:cf:2\ncell:P35:l:1:f:6:cf:2\ncell:Q35:l:1:f:6:cf:2\ncell:R35:l:1:f:6:cf:2\ncell:S35:l:1:f:6:cf:2\ncell:T35:l:1:f:6:cf:2\ncell:U35:l:1:f:6:cf:2\ncell:V35:l:1:f:6:cf:2\ncell:W35:l:1:f:6:cf:2\ncell:O36:l:1:f:6:cf:2\ncell:P36:l:1:f:6:cf:2\ncell:Q36:l:1:f:6:cf:2\ncell:R36:l:1:f:6:cf:2\ncell:S36:l:1:f:6:cf:2\ncell:T36:l:1:f:6:cf:2\ncell:U36:l:1:f:6:cf:2\ncell:V36:l:1:f:6:cf:2\ncell:W36:l:1:f:6:cf:2\ncell:O37:l:1:f:6:cf:2\ncell:P37:l:1:f:6:cf:2\ncell:Q37:l:1:f:6:cf:2\ncell:R37:l:1:f:6:cf:2\ncell:S37:l:1:f:6:cf:2\ncell:T37:l:1:f:6:cf:2\ncell:U37:l:1:f:6:cf:2\ncell:V37:l:1:f:6:cf:2\ncell:W37:l:1:f:6:cf:2\ncell:O38:l:1:f:6:cf:2\ncell:P38:l:1:f:6:cf:2\ncell:Q38:l:1:f:6:cf:2\ncell:R38:l:1:f:6:cf:2\ncell:S38:l:1:f:6:cf:2\ncell:T38:l:1:f:6:cf:2\ncell:U38:l:1:f:6:cf:2\ncell:V38:l:1:f:6:cf:2\ncell:W38:l:1:f:6:cf:2\ncell:O39:l:1:f:6:cf:2\ncell:P39:l:1:f:6:cf:2\ncell:Q39:l:1:f:6:cf:2\ncell:R39:l:1:f:6:cf:2\ncell:S39:l:1:f:6:cf:2\ncell:T39:l:1:f:6:cf:2\ncell:U39:l:1:f:6:cf:2\ncell:V39:l:1:f:6:cf:2\ncell:W39:l:1:f:6:cf:2\ncell:O40:l:1:f:6:cf:2\ncell:P40:l:1:f:6:cf:2\ncell:Q40:l:1:f:6:cf:2\ncell:R40:l:1:f:6:cf:2\ncell:S40:l:1:f:6:cf:2\ncell:T40:l:1:f:6:cf:2\ncell:U40:l:1:f:6:cf:2\ncell:V40:l:1:f:6:cf:2\ncell:W40:l:1:f:6:cf:2\ncell:O41:l:1:f:6:cf:2\ncell:P41:l:1:f:6:cf:2\ncell:Q41:l:1:f:6:cf:2\ncell:R41:l:1:f:6:cf:2\ncell:S41:l:1:f:6:cf:2\ncell:T41:l:1:f:6:cf:2\ncell:U41:l:1:f:6:cf:2\ncell:V41:l:1:f:6:cf:2\ncell:W41:l:1:f:6:cf:2\ncell:O42:l:1:f:6:cf:2\ncell:P42:l:1:f:6:cf:2\ncell:Q42:l:1:f:6:cf:2\ncell:R42:l:1:f:6:cf:2\ncell:S42:l:1:f:6:cf:2\ncell:T42:l:1:f:6:cf:2\ncell:U42:l:1:f:6:cf:2\ncell:V42:l:1:f:6:cf:2\ncell:W42:l:1:f:6:cf:2\ncell:O43:l:1:f:6:cf:2\ncell:P43:l:1:f:6:cf:2\ncell:Q43:l:1:f:6:cf:2\ncell:R43:l:1:f:6:cf:2\ncell:S43:l:1:f:6:cf:2\ncell:T43:l:1:f:6:cf:2\ncell:U43:l:1:f:6:cf:2\ncell:V43:l:1:f:6:cf:2\ncell:W43:l:1:f:6:cf:2\ncell:O44:l:1:f:6:cf:2\ncell:P44:l:1:f:6:cf:2\ncell:Q44:l:1:f:6:cf:2\ncell:R44:l:1:f:6:cf:2\ncell:S44:l:1:f:6:cf:2\ncell:T44:l:1:f:6:cf:2\ncell:U44:l:1:f:6:cf:2\ncell:V44:l:1:f:6:cf:2\ncell:W44:l:1:f:6:cf:2\ncell:O45:l:1:f:6:cf:2\ncell:P45:l:1:f:6:cf:2\ncell:Q45:l:1:f:6:cf:2\ncell:R45:l:1:f:6:cf:2\ncell:O46:l:1:f:6:cf:2\ncell:P46:l:1:f:6:cf:2\ncell:Q46:l:1:f:6:cf:2\ncell:R46:l:1:f:6:cf:2\ncell:O47:l:1:f:6:cf:2\ncell:P47:l:1:f:6:cf:2\ncell:Q47:l:1:f:6:cf:2\ncell:R47:l:1:f:6:cf:2\ncell:O48:l:1:f:6:cf:2\ncell:P48:l:1:f:6:cf:2\ncell:Q48:l:1:f:6:cf:2\ncell:R48:l:1:f:6:cf:2\ncell:O49:l:1:f:6:cf:2\ncell:P49:l:1:f:6:cf:2\ncell:Q49:l:1:f:6:cf:2\ncell:R49:l:1:f:6:cf:2\ncell:O50:l:1:f:6:cf:2\ncell:P50:l:1:f:6:cf:2\ncell:Q50:l:1:f:6:cf:2\ncell:R50:l:1:f:6:cf:2\ncell:O51:l:1:f:6:cf:2\ncell:P51:l:1:f:6:cf:2\ncell:Q51:l:1:f:6:cf:2\ncell:R51:l:1:f:6:cf:2\ncell:O52:l:1:f:6:cf:2\ncell:P52:l:1:f:6:cf:2\ncell:Q52:l:1:f:6:cf:2\ncell:R52:l:1:f:6:cf:2\ncell:O53:l:1:f:6:cf:2\ncell:P53:l:1:f:6:cf:2\ncell:Q53:l:1:f:6:cf:2\ncell:R53:l:1:f:6:cf:2\ncell:O54:l:1:f:6:cf:2\ncell:P54:l:1:f:6:cf:2\ncell:Q54:l:1:f:6:cf:2\ncell:R54:l:1:f:6:cf:2\ncell:O55:l:1:f:6:cf:2\ncell:P55:l:1:f:6:cf:2\ncell:Q55:l:1:f:6:cf:2\ncell:R55:l:1:f:6:cf:2\ncell:O56:l:1:f:6:cf:2\ncell:P56:l:1:f:6:cf:2\ncell:Q56:l:1:f:6:cf:2\ncell:R56:l:1:f:6:cf:2\ncell:O57:l:1:f:6:cf:2\ncell:P57:l:1:f:6:cf:2\ncell:Q57:l:1:f:6:cf:2\ncell:R57:l:1:f:6:cf:2\ncell:O58:l:1:f:6:cf:2\ncell:P58:l:1:f:6:cf:2\ncell:Q58:l:1:f:6:cf:2\ncell:R58:l:1:f:6:cf:2\ncell:B59:l:1:f:6:cf:2\ncell:C59:l:1:f:6:cf:2\ncell:D59:l:1:f:2:cf:2\ncell:E59:l:1:f:2:cf:3:ntvf:1\ncell:F59:l:1:f:2:cf:3:ntvf:1\ncell:O59:l:1:f:6:cf:2\ncell:P59:l:1:f:6:cf:2\ncell:Q59:l:1:f:6:cf:2\ncell:R59:l:1:f:6:cf:2\ncell:B60:l:1:f:4:cf:2\ncell:C60:l:1:f:4:cf:2\ncell:D60:l:1:f:8:cf:2\ncell:E60:l:1:f:8:cf:2\ncell:F60:l:1:f:6:cf:2\ncell:O60:l:1:f:6:cf:2\ncell:P60:l:1:f:6:cf:2\ncell:Q60:l:1:f:6:cf:2\ncell:R60:l:1:f:6:cf:2\ncell:O61:l:1:f:6:cf:2\ncell:P61:l:1:f:6:cf:2\ncell:Q61:l:1:f:6:cf:2\ncell:R61:l:1:f:6:cf:2\ncell:O62:l:1:f:6:cf:2\ncell:P62:l:1:f:6:cf:2\ncell:Q62:l:1:f:6:cf:2\ncell:R62:l:1:f:6:cf:2\ncell:O63:l:1:f:6:cf:2\ncell:P63:l:1:f:6:cf:2\ncell:Q63:l:1:f:6:cf:2\ncell:R63:l:1:f:6:cf:2\ncell:O64:l:1:f:6:cf:2\ncell:P64:l:1:f:6:cf:2\ncell:Q64:l:1:f:6:cf:2\ncell:R64:l:1:f:6:cf:2\ncell:O65:l:1:f:6:cf:2\ncell:P65:l:1:f:6:cf:2\ncell:Q65:l:1:f:6:cf:2\ncell:R65:l:1:f:6:cf:2\ncell:O66:l:1:f:6:cf:2\ncell:P66:l:1:f:6:cf:2\ncell:Q66:l:1:f:6:cf:2\ncell:R66:l:1:f:6:cf:2\ncell:O67:l:1:f:6:cf:2\ncell:P67:l:1:f:6:cf:2\ncell:Q67:l:1:f:6:cf:2\ncell:R67:l:1:f:6:cf:2\ncell:O68:l:1:f:6:cf:2\ncell:P68:l:1:f:6:cf:2\ncell:Q68:l:1:f:6:cf:2\ncell:R68:l:1:f:6:cf:2\ncell:O69:l:1:f:6:cf:2\ncell:P69:l:1:f:6:cf:2\ncell:Q69:l:1:f:6:cf:2\ncell:R69:l:1:f:6:cf:2\ncell:O70:l:1:f:6:cf:2\ncell:P70:l:1:f:6:cf:2\ncell:Q70:l:1:f:6:cf:2\ncell:R70:l:1:f:6:cf:2\ncell:S70:l:1:f:6:cf:2\ncell:T70:l:1:f:6:cf:2\ncell:U70:l:1:f:6:cf:2\ncell:V70:l:1:f:6:cf:2\ncell:W70:l:1:f:6:cf:2\ncell:O71:l:1:f:6:cf:2\ncell:P71:l:1:f:6:cf:2\ncell:Q71:l:1:f:6:cf:2\ncell:R71:l:1:f:6:cf:2\ncell:S71:l:1:f:6:cf:2\ncell:T71:l:1:f:6:cf:2\ncell:U71:l:1:f:6:cf:2\ncell:V71:l:1:f:6:cf:2\ncell:W71:l:1:f:6:cf:2\ncell:O72:l:1:f:6:cf:2\ncell:P72:l:1:f:6:cf:2\ncell:Q72:l:1:f:6:cf:2\ncell:R72:l:1:f:6:cf:2\ncell:S72:l:1:f:6:cf:2\ncell:T72:l:1:f:6:cf:2\ncell:U72:l:1:f:6:cf:2\ncell:V72:l:1:f:6:cf:2\ncell:W72:l:1:f:6:cf:2\ncell:O73:l:1:f:6:cf:2\ncell:P73:l:1:f:6:cf:2\ncell:Q73:l:1:f:6:cf:2\ncell:R73:l:1:f:6:cf:2\ncell:S73:l:1:f:6:cf:2\ncell:T73:l:1:f:6:cf:2\ncell:U73:l:1:f:6:cf:2\ncell:V73:l:1:f:6:cf:2\ncell:W73:l:1:f:6:cf:2\ncell:O74:l:1:f:6:cf:2\ncell:P74:l:1:f:6:cf:2\ncell:Q74:l:1:f:6:cf:2\ncell:R74:l:1:f:6:cf:2\ncell:S74:l:1:f:6:cf:2\ncell:T74:l:1:f:6:cf:2\ncell:U74:l:1:f:6:cf:2\ncell:V74:l:1:f:6:cf:2\ncell:W74:l:1:f:6:cf:2\ncell:O75:l:1:f:6:cf:2\ncell:P75:l:1:f:6:cf:2\ncell:Q75:l:1:f:6:cf:2\ncell:R75:l:1:f:6:cf:2\ncell:S75:l:1:f:6:cf:2\ncell:T75:l:1:f:6:cf:2\ncell:U75:l:1:f:6:cf:2\ncell:V75:l:1:f:6:cf:2\ncell:W75:l:1:f:6:cf:2\ncell:O76:l:1:f:6:cf:2\ncell:P76:l:1:f:6:cf:2\ncell:Q76:l:1:f:6:cf:2\ncell:R76:l:1:f:6:cf:2\ncell:S76:l:1:f:6:cf:2\ncell:T76:l:1:f:6:cf:2\ncell:U76:l:1:f:6:cf:2\ncell:V76:l:1:f:6:cf:2\ncell:W76:l:1:f:6:cf:2\ncell:O77:l:1:f:6:cf:2\ncell:P77:l:1:f:6:cf:2\ncell:Q77:l:1:f:6:cf:2\ncell:R77:l:1:f:6:cf:2\ncell:S77:l:1:f:6:cf:2\ncell:T77:l:1:f:6:cf:2\ncell:U77:l:1:f:6:cf:2\ncell:V77:l:1:f:6:cf:2\ncell:W77:l:1:f:6:cf:2\ncell:O78:l:1:f:6:cf:2\ncell:P78:l:1:f:6:cf:2\ncell:Q78:l:1:f:6:cf:2\ncell:R78:l:1:f:6:cf:2\ncell:S78:l:1:f:6:cf:2\ncell:T78:l:1:f:6:cf:2\ncell:U78:l:1:f:6:cf:2\ncell:V78:l:1:f:6:cf:2\ncell:W78:l:1:f:6:cf:2\ncell:O79:l:1:f:6:cf:2\ncell:P79:l:1:f:6:cf:2\ncell:Q79:l:1:f:6:cf:2\ncell:R79:l:1:f:6:cf:2\ncell:S79:l:1:f:6:cf:2\ncell:T79:l:1:f:6:cf:2\ncell:U79:l:1:f:6:cf:2\ncell:V79:l:1:f:6:cf:2\ncell:W79:l:1:f:6:cf:2\ncell:O80:l:1:f:6:cf:2\ncell:P80:l:1:f:6:cf:2\ncell:Q80:l:1:f:6:cf:2\ncell:R80:l:1:f:6:cf:2\ncell:S80:l:1:f:6:cf:2\ncell:T80:l:1:f:6:cf:2\ncell:U80:l:1:f:6:cf:2\ncell:V80:l:1:f:6:cf:2\ncell:W80:l:1:f:6:cf:2\ncell:O81:l:1:f:6:cf:2\ncell:P81:l:1:f:6:cf:2\ncell:Q81:l:1:f:6:cf:2\ncell:R81:l:1:f:6:cf:2\ncell:S81:l:1:f:6:cf:2\ncell:T81:l:1:f:6:cf:2\ncell:U81:l:1:f:6:cf:2\ncell:V81:l:1:f:6:cf:2\ncell:W81:l:1:f:6:cf:2\ncell:O82:l:1:f:6:cf:2\ncell:P82:l:1:f:6:cf:2\ncell:Q82:l:1:f:6:cf:2\ncell:R82:l:1:f:6:cf:2\ncell:S82:l:1:f:6:cf:2\ncell:T82:l:1:f:6:cf:2\ncell:U82:l:1:f:6:cf:2\ncell:V82:l:1:f:6:cf:2\ncell:W82:l:1:f:6:cf:2\ncell:O83:l:1:f:6:cf:2\ncell:P83:l:1:f:6:cf:2\ncell:Q83:l:1:f:6:cf:2\ncell:R83:l:1:f:6:cf:2\ncell:S83:l:1:f:6:cf:2\ncell:T83:l:1:f:6:cf:2\ncell:U83:l:1:f:6:cf:2\ncell:V83:l:1:f:6:cf:2\ncell:W83:l:1:f:6:cf:2\ncell:O84:l:1:f:6:cf:2\ncell:P84:l:1:f:6:cf:2\ncell:Q84:l:1:f:6:cf:2\ncell:R84:l:1:f:6:cf:2\ncell:S84:l:1:f:6:cf:2\ncell:T84:l:1:f:6:cf:2\ncell:U84:l:1:f:6:cf:2\ncell:V84:l:1:f:6:cf:2\ncell:W84:l:1:f:6:cf:2\ncell:O85:l:1:f:6:cf:2\ncell:P85:l:1:f:6:cf:2\ncell:Q85:l:1:f:6:cf:2\ncell:R85:l:1:f:6:cf:2\ncell:S85:l:1:f:6:cf:2\ncell:T85:l:1:f:6:cf:2\ncell:U85:l:1:f:6:cf:2\ncell:V85:l:1:f:6:cf:2\ncell:W85:l:1:f:6:cf:2\ncell:O86:l:1:f:6:cf:2\ncell:P86:l:1:f:6:cf:2\ncell:Q86:l:1:f:6:cf:2\ncell:R86:l:1:f:6:cf:2\ncell:S86:l:1:f:6:cf:2\ncell:T86:l:1:f:6:cf:2\ncell:U86:l:1:f:6:cf:2\ncell:V86:l:1:f:6:cf:2\ncell:W86:l:1:f:6:cf:2\ncell:O87:l:1:f:6:cf:2\ncell:P87:l:1:f:6:cf:2\ncell:Q87:l:1:f:6:cf:2\ncell:R87:l:1:f:6:cf:2\ncell:S87:l:1:f:6:cf:2\ncell:T87:l:1:f:6:cf:2\ncell:U87:l:1:f:6:cf:2\ncell:V87:l:1:f:6:cf:2\ncell:W87:l:1:f:6:cf:2\ncell:O88:l:1:f:6:cf:2\ncell:P88:l:1:f:6:cf:2\ncell:Q88:l:1:f:6:cf:2\ncell:R88:l:1:f:6:cf:2\ncell:S88:l:1:f:6:cf:2\ncell:T88:l:1:f:6:cf:2\ncell:U88:l:1:f:6:cf:2\ncell:V88:l:1:f:6:cf:2\ncell:W88:l:1:f:6:cf:2\ncell:O89:l:1:f:6:cf:2\ncell:P89:l:1:f:6:cf:2\ncell:Q89:l:1:f:6:cf:2\ncell:R89:l:1:f:6:cf:2\ncell:S89:l:1:f:6:cf:2\ncell:T89:l:1:f:6:cf:2\ncell:U89:l:1:f:6:cf:2\ncell:V89:l:1:f:6:cf:2\ncell:W89:l:1:f:6:cf:2\ncell:O90:l:1:f:6:cf:2\ncell:P90:l:1:f:6:cf:2\ncell:Q90:l:1:f:6:cf:2\ncell:R90:l:1:f:6:cf:2\ncell:S90:l:1:f:6:cf:2\ncell:T90:l:1:f:6:cf:2\ncell:U90:l:1:f:6:cf:2\ncell:V90:l:1:f:6:cf:2\ncell:W90:l:1:f:6:cf:2\ncell:O91:l:1:f:6:cf:2\ncell:P91:l:1:f:6:cf:2\ncell:Q91:l:1:f:6:cf:2\ncell:R91:l:1:f:6:cf:2\ncell:S91:l:1:f:6:cf:2\ncell:T91:l:1:f:6:cf:2\ncell:U91:l:1:f:6:cf:2\ncell:V91:l:1:f:6:cf:2\ncell:W91:l:1:f:6:cf:2\ncell:O92:l:1:f:6:cf:2\ncell:P92:l:1:f:6:cf:2\ncell:Q92:l:1:f:6:cf:2\ncell:R92:l:1:f:6:cf:2\ncell:S92:l:1:f:6:cf:2\ncell:T92:l:1:f:6:cf:2\ncell:U92:l:1:f:6:cf:2\ncell:V92:l:1:f:6:cf:2\ncell:W92:l:1:f:6:cf:2\ncell:O93:l:1:f:6:cf:2\ncell:P93:l:1:f:6:cf:2\ncell:Q93:l:1:f:6:cf:2\ncell:R93:l:1:f:6:cf:2\ncell:S93:l:1:f:6:cf:2\ncell:T93:l:1:f:6:cf:2\ncell:U93:l:1:f:6:cf:2\ncell:V93:l:1:f:6:cf:2\ncell:W93:l:1:f:6:cf:2\ncell:O94:l:1:f:6:cf:2\ncell:P94:l:1:f:6:cf:2\ncell:Q94:l:1:f:6:cf:2\ncell:R94:l:1:f:6:cf:2\ncell:S94:l:1:f:6:cf:2\ncell:T94:l:1:f:6:cf:2\ncell:U94:l:1:f:6:cf:2\ncell:V94:l:1:f:6:cf:2\ncell:W94:l:1:f:6:cf:2\ncell:O95:l:1:f:6:cf:2\ncell:P95:l:1:f:6:cf:2\ncell:Q95:l:1:f:6:cf:2\ncell:R95:l:1:f:6:cf:2\ncell:S95:l:1:f:6:cf:2\ncell:T95:l:1:f:6:cf:2\ncell:U95:l:1:f:6:cf:2\ncell:V95:l:1:f:6:cf:2\ncell:W95:l:1:f:6:cf:2\ncell:O96:l:1:f:6:cf:2\ncell:P96:l:1:f:6:cf:2\ncell:Q96:l:1:f:6:cf:2\ncell:R96:l:1:f:6:cf:2\ncell:S96:l:1:f:6:cf:2\ncell:T96:l:1:f:6:cf:2\ncell:U96:l:1:f:6:cf:2\ncell:V96:l:1:f:6:cf:2\ncell:W96:l:1:f:6:cf:2\ncell:O97:l:1:f:6:cf:2\ncell:P97:l:1:f:6:cf:2\ncell:Q97:l:1:f:6:cf:2\ncell:R97:l:1:f:6:cf:2\ncell:S97:l:1:f:6:cf:2\ncell:T97:l:1:f:6:cf:2\ncell:U97:l:1:f:6:cf:2\ncell:V97:l:1:f:6:cf:2\ncell:W97:l:1:f:6:cf:2\ncell:O98:l:1:f:6:cf:2\ncell:P98:l:1:f:6:cf:2\ncell:Q98:l:1:f:6:cf:2\ncell:R98:l:1:f:6:cf:2\ncell:S98:l:1:f:6:cf:2\ncell:T98:l:1:f:6:cf:2\ncell:U98:l:1:f:6:cf:2\ncell:V98:l:1:f:6:cf:2\ncell:W98:l:1:f:6:cf:2\ncell:O99:l:1:f:6:cf:2\ncell:P99:l:1:f:6:cf:2\ncell:Q99:l:1:f:6:cf:2\ncell:R99:l:1:f:6:cf:2\ncell:S99:l:1:f:6:cf:2\ncell:T99:l:1:f:6:cf:2\ncell:U99:l:1:f:6:cf:2\ncell:V99:l:1:f:6:cf:2\ncell:W99:l:1:f:6:cf:2\ncell:O100:l:1:f:6:cf:2\ncell:P100:l:1:f:6:cf:2\ncell:Q100:l:1:f:6:cf:2\ncell:R100:l:1:f:6:cf:2\ncell:S100:l:1:f:6:cf:2\ncell:T100:l:1:f:6:cf:2\ncell:U100:l:1:f:6:cf:2\ncell:V100:l:1:f:6:cf:2\ncell:W100:l:1:f:6:cf:2\ncell:O101:l:1:f:6:cf:2\ncell:P101:l:1:f:6:cf:2\ncell:Q101:l:1:f:6:cf:2\ncell:R101:l:1:f:6:cf:2\ncell:S101:l:1:f:6:cf:2\ncell:T101:l:1:f:6:cf:2\ncell:U101:l:1:f:6:cf:2\ncell:V101:l:1:f:6:cf:2\ncell:W101:l:1:f:6:cf:2\ncell:O102:l:1:f:6:cf:2\ncell:P102:l:1:f:6:cf:2\ncell:Q102:l:1:f:6:cf:2\ncell:R102:l:1:f:6:cf:2\ncell:S102:l:1:f:6:cf:2\ncell:T102:l:1:f:6:cf:2\ncell:U102:l:1:f:6:cf:2\ncell:V102:l:1:f:6:cf:2\ncell:W102:l:1:f:6:cf:2\ncell:O103:l:1:f:6:cf:2\ncell:P103:l:1:f:6:cf:2\ncell:Q103:l:1:f:6:cf:2\ncell:R103:l:1:f:6:cf:2\ncell:S103:l:1:f:6:cf:2\ncell:T103:l:1:f:6:cf:2\ncell:U103:l:1:f:6:cf:2\ncell:V103:l:1:f:6:cf:2\ncell:W103:l:1:f:6:cf:2\ncell:O104:l:1:f:6:cf:2\ncell:P104:l:1:f:6:cf:2\ncell:Q104:l:1:f:6:cf:2\ncell:R104:l:1:f:6:cf:2\ncell:S104:l:1:f:6:cf:2\ncell:T104:l:1:f:6:cf:2\ncell:U104:l:1:f:6:cf:2\ncell:V104:l:1:f:6:cf:2\ncell:W104:l:1:f:6:cf:2\ncell:O105:l:1:f:6:cf:2\ncell:P105:l:1:f:6:cf:2\ncell:Q105:l:1:f:6:cf:2\ncell:R105:l:1:f:6:cf:2\ncell:S105:l:1:f:6:cf:2\ncell:T105:l:1:f:6:cf:2\ncell:U105:l:1:f:6:cf:2\ncell:V105:l:1:f:6:cf:2\ncell:W105:l:1:f:6:cf:2\ncell:O106:l:1:f:6:cf:2\ncell:P106:l:1:f:6:cf:2\ncell:Q106:l:1:f:6:cf:2\ncell:R106:l:1:f:6:cf:2\ncell:S106:l:1:f:6:cf:2\ncell:T106:l:1:f:6:cf:2\ncell:U106:l:1:f:6:cf:2\ncell:V106:l:1:f:6:cf:2\ncell:W106:l:1:f:6:cf:2\ncell:O107:l:1:f:6:cf:2\ncell:P107:l:1:f:6:cf:2\ncell:Q107:l:1:f:6:cf:2\ncell:R107:l:1:f:6:cf:2\ncell:S107:l:1:f:6:cf:2\ncell:T107:l:1:f:6:cf:2\ncell:U107:l:1:f:6:cf:2\ncell:V107:l:1:f:6:cf:2\ncell:W107:l:1:f:6:cf:2\ncell:O108:l:1:f:6:cf:2\ncell:P108:l:1:f:6:cf:2\ncell:Q108:l:1:f:6:cf:2\ncell:R108:l:1:f:6:cf:2\ncell:S108:l:1:f:6:cf:2\ncell:T108:l:1:f:6:cf:2\ncell:U108:l:1:f:6:cf:2\ncell:V108:l:1:f:6:cf:2\ncell:W108:l:1:f:6:cf:2\ncell:O109:l:1:f:6:cf:2\ncell:P109:l:1:f:6:cf:2\ncell:Q109:l:1:f:6:cf:2\ncell:R109:l:1:f:6:cf:2\ncell:S109:l:1:f:6:cf:2\ncell:T109:l:1:f:6:cf:2\ncell:U109:l:1:f:6:cf:2\ncell:V109:l:1:f:6:cf:2\ncell:W109:l:1:f:6:cf:2\ncell:O110:l:1:f:6:cf:2\ncell:P110:l:1:f:6:cf:2\ncell:Q110:l:1:f:6:cf:2\ncell:R110:l:1:f:6:cf:2\ncell:S110:l:1:f:6:cf:2\ncell:T110:l:1:f:6:cf:2\ncell:U110:l:1:f:6:cf:2\ncell:V110:l:1:f:6:cf:2\ncell:W110:l:1:f:6:cf:2\ncell:O111:l:1:f:6:cf:2\ncell:P111:l:1:f:6:cf:2\ncell:Q111:l:1:f:6:cf:2\ncell:R111:l:1:f:6:cf:2\ncell:S111:l:1:f:6:cf:2\ncell:T111:l:1:f:6:cf:2\ncell:U111:l:1:f:6:cf:2\ncell:V111:l:1:f:6:cf:2\ncell:W111:l:1:f:6:cf:2\ncell:O112:l:1:f:6:cf:2\ncell:P112:l:1:f:6:cf:2\ncell:Q112:l:1:f:6:cf:2\ncell:R112:l:1:f:6:cf:2\ncell:S112:l:1:f:6:cf:2\ncell:T112:l:1:f:6:cf:2\ncell:U112:l:1:f:6:cf:2\ncell:V112:l:1:f:6:cf:2\ncell:W112:l:1:f:6:cf:2\ncell:O113:l:1:f:6:cf:2\ncell:P113:l:1:f:6:cf:2\ncell:Q113:l:1:f:6:cf:2\ncell:R113:l:1:f:6:cf:2\ncell:S113:l:1:f:6:cf:2\ncell:T113:l:1:f:6:cf:2\ncell:U113:l:1:f:6:cf:2\ncell:V113:l:1:f:6:cf:2\ncell:W113:l:1:f:6:cf:2\ncell:O114:l:1:f:6:cf:2\ncell:P114:l:1:f:6:cf:2\ncell:Q114:l:1:f:6:cf:2\ncell:R114:l:1:f:6:cf:2\ncell:S114:l:1:f:6:cf:2\ncell:T114:l:1:f:6:cf:2\ncell:U114:l:1:f:6:cf:2\ncell:V114:l:1:f:6:cf:2\ncell:W114:l:1:f:6:cf:2\ncell:O115:l:1:f:6:cf:2\ncell:P115:l:1:f:6:cf:2\ncell:Q115:l:1:f:6:cf:2\ncell:R115:l:1:f:6:cf:2\ncell:S115:l:1:f:6:cf:2\ncell:T115:l:1:f:6:cf:2\ncell:U115:l:1:f:6:cf:2\ncell:V115:l:1:f:6:cf:2\ncell:W115:l:1:f:6:cf:2\ncell:O116:l:1:f:6:cf:2\ncell:P116:l:1:f:6:cf:2\ncell:Q116:l:1:f:6:cf:2\ncell:R116:l:1:f:6:cf:2\ncell:S116:l:1:f:6:cf:2\ncell:T116:l:1:f:6:cf:2\ncell:U116:l:1:f:6:cf:2\ncell:V116:l:1:f:6:cf:2\ncell:W116:l:1:f:6:cf:2\ncell:O117:l:1:f:6:cf:2\ncell:P117:l:1:f:6:cf:2\ncell:Q117:l:1:f:6:cf:2\ncell:R117:l:1:f:6:cf:2\ncell:S117:l:1:f:6:cf:2\ncell:T117:l:1:f:6:cf:2\ncell:U117:l:1:f:6:cf:2\ncell:V117:l:1:f:6:cf:2\ncell:W117:l:1:f:6:cf:2\ncell:O118:l:1:f:6:cf:2\ncell:P118:l:1:f:6:cf:2\ncell:Q118:l:1:f:6:cf:2\ncell:R118:l:1:f:6:cf:2\ncell:S118:l:1:f:6:cf:2\ncell:T118:l:1:f:6:cf:2\ncell:U118:l:1:f:6:cf:2\ncell:V118:l:1:f:6:cf:2\ncell:W118:l:1:f:6:cf:2\ncell:O119:l:1:f:6:cf:2\ncell:P119:l:1:f:6:cf:2\ncell:Q119:l:1:f:6:cf:2\ncell:R119:l:1:f:6:cf:2\ncell:S119:l:1:f:6:cf:2\ncell:T119:l:1:f:6:cf:2\ncell:U119:l:1:f:6:cf:2\ncell:V119:l:1:f:6:cf:2\ncell:W119:l:1:f:6:cf:2\ncell:O120:l:1:f:6:cf:2\ncell:P120:l:1:f:6:cf:2\ncell:Q120:l:1:f:6:cf:2\ncell:R120:l:1:f:6:cf:2\ncell:S120:l:1:f:6:cf:2\ncell:T120:l:1:f:6:cf:2\ncell:U120:l:1:f:6:cf:2\ncell:V120:l:1:f:6:cf:2\ncell:W120:l:1:f:6:cf:2\ncell:O121:l:1:f:6:cf:2\ncell:P121:l:1:f:6:cf:2\ncell:Q121:l:1:f:6:cf:2\ncell:R121:l:1:f:6:cf:2\ncell:S121:l:1:f:6:cf:2\ncell:T121:l:1:f:6:cf:2\ncell:U121:l:1:f:6:cf:2\ncell:V121:l:1:f:6:cf:2\ncell:W121:l:1:f:6:cf:2\ncell:O122:l:1:f:7:cf:2\ncell:P122:l:1:f:7:cf:2\ncell:Q122:l:1:f:7:cf:2\ncell:R122:l:1:f:7:cf:2\ncell:S122:l:1:f:7:cf:2\ncell:T122:l:1:f:7:cf:2\ncell:U122:l:1:f:7:cf:2\ncell:V122:l:1:f:7:cf:2\ncell:W122:l:1:f:7:cf:2\ncell:O123:l:1:f:7:cf:2\ncell:P123:l:1:f:7:cf:2\ncell:Q123:l:1:f:7:cf:2\ncell:R123:l:1:f:7:cf:2\ncell:S123:l:1:f:7:cf:2\ncell:T123:l:1:f:7:cf:2\ncell:U123:l:1:f:7:cf:2\ncell:V123:l:1:f:7:cf:2\ncell:W123:l:1:f:7:cf:2\ncell:O124:l:1:f:7:cf:2\ncell:P124:l:1:f:7:cf:2\ncell:Q124:l:1:f:7:cf:2\ncell:R124:l:1:f:7:cf:2\ncell:S124:l:1:f:7:cf:2\ncell:T124:l:1:f:7:cf:2\ncell:U124:l:1:f:7:cf:2\ncell:V124:l:1:f:7:cf:2\ncell:W124:l:1:f:7:cf:2\ncell:O125:l:1:f:7:cf:2\ncell:P125:l:1:f:7:cf:2\ncell:Q125:l:1:f:7:cf:2\ncell:R125:l:1:f:7:cf:2\ncell:S125:l:1:f:7:cf:2\ncell:T125:l:1:f:7:cf:2\ncell:U125:l:1:f:7:cf:2\ncell:V125:l:1:f:7:cf:2\ncell:W125:l:1:f:7:cf:2\ncell:A126:l:1:f:7:cf:2\ncell:B126:l:1:f:7:cf:2\ncell:C126:l:1:f:7:cf:2\ncell:D126:l:1:f:7:cf:2\ncell:E126:l:1:f:7:cf:2\ncell:F126:t:Monthly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G126:l:1:f:7:cf:2\ncell:H126:l:1:f:7:cf:2\ncell:I126:l:1:f:7:cf:2\ncell:J126:l:1:f:7:cf:2\ncell:K126:l:1:f:7:cf:2\ncell:L126:l:1:f:7:cf:2\ncell:M126:l:1:f:7:cf:2\ncell:N126:l:1:f:7:cf:2\ncell:O126:l:1:f:7:cf:2\ncell:P126:l:1:f:7:cf:2\ncell:Q126:l:1:f:7:cf:2\ncell:R126:l:1:f:7:cf:2\ncell:S126:l:1:f:7:cf:2\ncell:T126:l:1:f:7:cf:2\ncell:U126:l:1:f:7:cf:2\ncell:V126:l:1:f:7:cf:2\ncell:W126:l:1:f:7:cf:2\ncell:A127:l:1:f:7:cf:2\ncell:B127:l:1:f:7:cf:2\ncell:C127:l:1:f:7:cf:2\ncell:D127:l:1:f:7:cf:2\ncell:E127:l:1:f:7:cf:2\ncell:F127:t:Semi-Annually:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G127:l:1:f:7:cf:2\ncell:H127:l:1:f:7:cf:2\ncell:I127:l:1:f:7:cf:2\ncell:J127:l:1:f:7:cf:2\ncell:K127:l:1:f:7:cf:2\ncell:L127:l:1:f:7:cf:2\ncell:M127:l:1:f:7:cf:2\ncell:N127:l:1:f:7:cf:2\ncell:O127:l:1:f:7:cf:2\ncell:P127:l:1:f:7:cf:2\ncell:Q127:l:1:f:7:cf:2\ncell:R127:l:1:f:7:cf:2\ncell:S127:l:1:f:7:cf:2\ncell:T127:l:1:f:7:cf:2\ncell:U127:l:1:f:7:cf:2\ncell:V127:l:1:f:7:cf:2\ncell:W127:l:1:f:7:cf:2\ncell:A128:l:1:f:7:cf:2\ncell:B128:l:1:f:7:cf:2\ncell:C128:l:1:f:7:cf:2\ncell:D128:l:1:f:7:cf:2\ncell:E128:l:1:f:7:cf:2\ncell:F128:t:Quarterly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G128:l:1:f:7:cf:2\ncell:H128:l:1:f:7:cf:2\ncell:I128:l:1:f:7:cf:2\ncell:J128:l:1:f:7:cf:2\ncell:K128:l:1:f:7:cf:2\ncell:L128:l:1:f:7:cf:2\ncell:M128:l:1:f:7:cf:2\ncell:N128:l:1:f:7:cf:2\ncell:O128:l:1:f:7:cf:2\ncell:P128:l:1:f:7:cf:2\ncell:Q128:l:1:f:7:cf:2\ncell:R128:l:1:f:7:cf:2\ncell:S128:l:1:f:7:cf:2\ncell:T128:l:1:f:7:cf:2\ncell:U128:l:1:f:7:cf:2\ncell:V128:l:1:f:7:cf:2\ncell:W128:l:1:f:7:cf:2\ncell:A129:l:1:f:7:cf:2\ncell:B129:l:1:f:7:cf:2\ncell:C129:l:1:f:7:cf:2\ncell:D129:l:1:f:7:cf:2\ncell:E129:l:1:f:7:cf:2\ncell:F129:t:Yearly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G129:l:1:f:7:cf:2\ncell:H129:l:1:f:7:cf:2\ncell:I129:l:1:f:7:cf:2\ncell:J129:l:1:f:7:cf:2\ncell:K129:l:1:f:7:cf:2\ncell:L129:l:1:f:7:cf:2\ncell:M129:l:1:f:7:cf:2\ncell:N129:l:1:f:7:cf:2\ncell:O129:l:1:f:7:cf:2\ncell:P129:l:1:f:7:cf:2\ncell:Q129:l:1:f:7:cf:2\ncell:R129:l:1:f:7:cf:2\ncell:S129:l:1:f:7:cf:2\ncell:T129:l:1:f:7:cf:2\ncell:U129:l:1:f:7:cf:2\ncell:V129:l:1:f:7:cf:2\ncell:W129:l:1:f:7:cf:2\ncell:A130:l:1:f:7:cf:2\ncell:B130:l:1:f:7:cf:2\ncell:C130:l:1:f:7:cf:2\ncell:D130:l:1:f:7:cf:2\ncell:E130:l:1:f:7:cf:2\ncell:F130:l:1:f:7:cf:2\ncell:G130:l:1:f:7:cf:2\ncell:H130:l:1:f:7:cf:2\ncell:I130:l:1:f:7:cf:2\ncell:J130:l:1:f:7:cf:2\ncell:K130:l:1:f:7:cf:2\ncell:L130:l:1:f:7:cf:2\ncell:M130:l:1:f:7:cf:2\ncell:N130:l:1:f:7:cf:2\ncell:O130:l:1:f:7:cf:2\ncell:P130:l:1:f:7:cf:2\ncell:Q130:l:1:f:7:cf:2\ncell:R130:l:1:f:7:cf:2\ncell:S130:l:1:f:7:cf:2\ncell:T130:l:1:f:7:cf:2\ncell:U130:l:1:f:7:cf:2\ncell:V130:l:1:f:7:cf:2\ncell:W130:l:1:f:7:cf:2\ncell:A131:l:1:f:7:cf:2\ncell:B131:l:1:f:7:cf:2\ncell:C131:l:1:f:7:cf:2\ncell:D131:l:1:f:7:cf:2\ncell:E131:l:1:f:7:cf:2\ncell:F131:l:1:f:7:cf:2\ncell:G131:l:1:f:7:cf:2\ncell:H131:l:1:f:7:cf:2\ncell:I131:l:1:f:7:cf:2\ncell:J131:l:1:f:7:cf:2\ncell:K131:l:1:f:7:cf:2\ncell:L131:l:1:f:7:cf:2\ncell:M131:l:1:f:7:cf:2\ncell:N131:l:1:f:7:cf:2\ncell:O131:l:1:f:7:cf:2\ncell:P131:l:1:f:7:cf:2\ncell:Q131:l:1:f:7:cf:2\ncell:R131:l:1:f:7:cf:2\ncell:S131:l:1:f:7:cf:2\ncell:T131:l:1:f:7:cf:2\ncell:U131:l:1:f:7:cf:2\ncell:V131:l:1:f:7:cf:2\ncell:W131:l:1:f:7:cf:2\ncell:A132:l:1:f:7:cf:2\ncell:B132:l:1:f:7:cf:2\ncell:C132:l:1:f:7:cf:2\ncell:D132:l:1:f:7:cf:2\ncell:E132:l:1:f:7:cf:2\ncell:F132:l:1:f:7:cf:2\ncell:G132:l:1:f:7:cf:2\ncell:H132:l:1:f:7:cf:2\ncell:I132:l:1:f:7:cf:2\ncell:J132:l:1:f:7:cf:2\ncell:K132:l:1:f:7:cf:2\ncell:L132:l:1:f:7:cf:2\ncell:M132:l:1:f:7:cf:2\ncell:N132:l:1:f:7:cf:2\ncell:O132:l:1:f:7:cf:2\ncell:P132:l:1:f:7:cf:2\ncell:Q132:l:1:f:7:cf:2\ncell:R132:l:1:f:7:cf:2\ncell:S132:l:1:f:7:cf:2\ncell:T132:l:1:f:7:cf:2\ncell:U132:l:1:f:7:cf:2\ncell:V132:l:1:f:7:cf:2\ncell:W132:l:1:f:7:cf:2\ncell:A133:l:1:f:7:cf:2\ncell:B133:l:1:f:7:cf:2\ncell:C133:l:1:f:7:cf:2\ncell:D133:l:1:f:7:cf:2\ncell:E133:l:1:f:7:cf:2\ncell:F133:l:1:f:7:cf:2\ncell:G133:l:1:f:7:cf:2\ncell:H133:l:1:f:7:cf:2\ncell:I133:l:1:f:7:cf:2\ncell:J133:l:1:f:7:cf:2\ncell:K133:l:1:f:7:cf:2\ncell:L133:l:1:f:7:cf:2\ncell:M133:l:1:f:7:cf:2\ncell:N133:l:1:f:7:cf:2\ncell:O133:l:1:f:7:cf:2\ncell:P133:l:1:f:7:cf:2\ncell:Q133:l:1:f:7:cf:2\ncell:R133:l:1:f:7:cf:2\ncell:S133:l:1:f:7:cf:2\ncell:T133:l:1:f:7:cf:2\ncell:U133:l:1:f:7:cf:2\ncell:V133:l:1:f:7:cf:2\ncell:W133:l:1:f:7:cf:2\ncell:A134:l:1:f:7:cf:2\ncell:B134:l:1:f:7:cf:2\ncell:C134:l:1:f:7:cf:2\ncell:D134:l:1:f:7:cf:2\ncell:E134:l:1:f:7:cf:2\ncell:F134:l:1:f:7:cf:2\ncell:G134:l:1:f:7:cf:2\ncell:H134:l:1:f:7:cf:2\ncell:I134:l:1:f:7:cf:2\ncell:J134:l:1:f:7:cf:2\ncell:K134:l:1:f:7:cf:2\ncell:L134:l:1:f:7:cf:2\ncell:M134:l:1:f:7:cf:2\ncell:N134:l:1:f:7:cf:2\ncell:O134:l:1:f:7:cf:2\ncell:P134:l:1:f:7:cf:2\ncell:Q134:l:1:f:7:cf:2\ncell:R134:l:1:f:7:cf:2\ncell:S134:l:1:f:7:cf:2\ncell:T134:l:1:f:7:cf:2\ncell:U134:l:1:f:7:cf:2\ncell:V134:l:1:f:7:cf:2\ncell:W134:l:1:f:7:cf:2\ncell:A135:l:1:f:7:cf:2\ncell:B135:l:1:f:7:cf:2\ncell:C135:l:1:f:7:cf:2\ncell:D135:l:1:f:7:cf:2\ncell:E135:l:1:f:7:cf:2\ncell:F135:l:1:f:7:cf:2\ncell:G135:l:1:f:7:cf:2\ncell:H135:l:1:f:7:cf:2\ncell:I135:l:1:f:7:cf:2\ncell:J135:l:1:f:7:cf:2\ncell:K135:l:1:f:7:cf:2\ncell:L135:l:1:f:7:cf:2\ncell:M135:l:1:f:7:cf:2\ncell:N135:l:1:f:7:cf:2\ncell:O135:l:1:f:7:cf:2\ncell:P135:l:1:f:7:cf:2\ncell:Q135:l:1:f:7:cf:2\ncell:R135:l:1:f:7:cf:2\ncell:S135:l:1:f:7:cf:2\ncell:T135:l:1:f:7:cf:2\ncell:U135:l:1:f:7:cf:2\ncell:V135:l:1:f:7:cf:2\ncell:W135:l:1:f:7:cf:2\ncell:A136:l:1:f:7:cf:2\ncell:B136:l:1:f:7:cf:2\ncell:C136:l:1:f:7:cf:2\ncell:D136:l:1:f:7:cf:2\ncell:E136:l:1:f:7:cf:2\ncell:F136:l:1:f:7:cf:2\ncell:G136:l:1:f:7:cf:2\ncell:H136:l:1:f:7:cf:2\ncell:I136:l:1:f:7:cf:2\ncell:J136:l:1:f:7:cf:2\ncell:K136:l:1:f:7:cf:2\ncell:L136:l:1:f:7:cf:2\ncell:M136:l:1:f:7:cf:2\ncell:N136:l:1:f:7:cf:2\ncell:O136:l:1:f:7:cf:2\ncell:P136:l:1:f:7:cf:2\ncell:Q136:l:1:f:7:cf:2\ncell:R136:l:1:f:7:cf:2\ncell:S136:l:1:f:7:cf:2\ncell:T136:l:1:f:7:cf:2\ncell:U136:l:1:f:7:cf:2\ncell:V136:l:1:f:7:cf:2\ncell:W136:l:1:f:7:cf:2\ncell:A137:l:1:f:7:cf:2\ncell:B137:l:1:f:7:cf:2\ncell:C137:l:1:f:7:cf:2\ncell:D137:l:1:f:7:cf:2\ncell:E137:l:1:f:7:cf:2\ncell:F137:l:1:f:7:cf:2\ncell:G137:l:1:f:7:cf:2\ncell:H137:l:1:f:7:cf:2\ncell:I137:l:1:f:7:cf:2\ncell:J137:l:1:f:7:cf:2\ncell:K137:l:1:f:7:cf:2\ncell:L137:l:1:f:7:cf:2\ncell:M137:l:1:f:7:cf:2\ncell:N137:l:1:f:7:cf:2\ncell:O137:l:1:f:7:cf:2\ncell:P137:l:1:f:7:cf:2\ncell:Q137:l:1:f:7:cf:2\ncell:R137:l:1:f:7:cf:2\ncell:S137:l:1:f:7:cf:2\ncell:T137:l:1:f:7:cf:2\ncell:U137:l:1:f:7:cf:2\ncell:V137:l:1:f:7:cf:2\ncell:W137:l:1:f:7:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nrow:102:h:14.25\nrow:103:h:14.25\nrow:104:h:14.25\nrow:105:h:14.25\nrow:106:h:14.25\nrow:107:h:14.25\nrow:108:h:14.25\nrow:109:h:14.25\nrow:110:h:14.25\nrow:111:h:14.25\nrow:112:h:14.25\nrow:113:h:14.25\nrow:114:h:14.25\nrow:115:h:14.25\nrow:116:h:14.25\nrow:117:h:14.25\nrow:118:h:14.25\nrow:119:h:14.25\nrow:120:h:14.25\nrow:121:h:14.25\nsheet:c:27:r:137:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\ncolor:5:rgb(255,255,187)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 20pt Arial\nfont:4:normal bold 9pt Arial\nfont:5:normal normal * Arial\nfont:6:normal normal 10pt Arial\nfont:7:normal normal 7pt Arial\nfont:8:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nname:COMPARISON::S63\\cU77\nname:TRACKING::AC63\\cAE77\n', - }, - name: "sheet9", - hidden: "0", - }, - sheet5: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:7:cf:2:ntvf:2\ncell:B1:l:1:f:7:cf:2\ncell:C1:l:1:f:7:cf:2\ncell:D1:l:1:f:7:cf:2\ncell:E1:l:1:f:7:cf:2\ncell:F1:l:1:f:7:cf:2\ncell:G1:l:1:f:7:cf:2\ncell:H1:l:1:f:7:cf:2\ncell:I1:l:1:f:7:cf:2\ncell:J1:l:1:f:7:cf:2\ncell:K1:l:1:f:7:cf:2\ncell:L1:l:1:f:7:cf:2\ncell:M1:l:1:f:7:cf:2\ncell:N1:l:1:f:7:cf:2\ncell:O1:l:1:f:7:cf:2\ncell:P1:l:1:f:7:cf:2\ncell:Q1:l:1:f:7:cf:2\ncell:R1:l:1:f:7:cf:2\ncell:S1:l:1:f:7:cf:2\ncell:T1:l:1:f:7:cf:2\ncell:U1:l:1:f:7:cf:2\ncell:V1:l:1:f:7:cf:2\ncell:W1:l:1:f:7:cf:2\ncell:A2:l:1:f:7:cf:2\ncell:B2:l:1:f:7:cf:2\ncell:C2:l:1:f:7:cf:2\ncell:D2:t:Expenses:l:2:f:3:cf:2\ncell:E2:l:1:f:7:cf:2\ncell:F2:l:1:f:7:cf:2\ncell:G2:l:1:f:7:cf:2\ncell:H2:l:1:f:7:cf:2\ncell:I2:l:1:f:7:cf:2\ncell:J2:l:1:f:7:cf:2\ncell:K2:l:1:f:7:cf:2\ncell:L2:l:1:f:7:cf:2\ncell:M2:l:1:f:7:cf:2\ncell:N2:l:1:f:7:cf:2\ncell:O2:l:1:f:7:cf:2\ncell:P2:l:1:f:7:cf:2\ncell:Q2:l:1:f:7:cf:2\ncell:R2:l:1:f:7:cf:2\ncell:S2:l:1:f:7:cf:2\ncell:T2:l:1:f:7:cf:2\ncell:U2:l:1:f:7:cf:2\ncell:V2:l:1:f:7:cf:2\ncell:W2:l:1:f:7:cf:2\ncell:A3:l:1:f:7:cf:2\ncell:B3:l:1:f:7:cf:2\ncell:C3:l:1:f:7:cf:2\ncell:D3:l:1:f:7:cf:2\ncell:G3:l:1:f:7:cf:2\ncell:H3:l:1:f:7:cf:2\ncell:I3:l:1:f:7:cf:2\ncell:J3:l:1:f:7:cf:2\ncell:K3:l:1:f:7:cf:2\ncell:L3:l:1:f:7:cf:2\ncell:M3:l:1:f:7:cf:2\ncell:N3:l:1:f:7:cf:2\ncell:O3:l:1:f:7:cf:2\ncell:P3:l:1:f:7:cf:2\ncell:Q3:t: :l:1:f:7:cf:2\ncell:R3:l:1:f:7:cf:2\ncell:S3:l:1:f:7:cf:2\ncell:T3:l:1:f:7:cf:2\ncell:U3:l:1:f:7:cf:2\ncell:V3:l:1:f:7:cf:2\ncell:W3:l:1:f:7:cf:2\ncell:B4:t:Entertainment:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C4:l:3:f:2:c:3:bg:1:cf:2\ncell:D4:l:3:f:2:c:3:bg:1:cf:1\ncell:E4:vtf:n:209:SUM(E5\\cE12):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F4:vtf:n:2508:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O4:l:1:f:7:cf:2\ncell:P4:l:1:f:7:cf:2\ncell:Q4:l:1:f:7:cf:2\ncell:R4:l:1:f:7:cf:2\ncell:S4:l:1:f:7:cf:2\ncell:T4:l:1:f:7:cf:2\ncell:U4:l:1:f:7:cf:2\ncell:V4:l:1:f:7:cf:2\ncell:W4:l:1:f:7:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:7:cf:2\ncell:C5:l:3:f:7:cf:2\ncell:D5:t:Events/Movies/Theater:l:3:f:5:cf:2\ncell:E5:v:209:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F5:vtf:n:2508:IF( (E5*12)=0,"",(E5*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:7:cf:2\ncell:P5:l:1:f:7:cf:2\ncell:Q5:l:1:f:7:cf:2\ncell:R5:l:1:f:7:cf:2\ncell:S5:l:1:f:7:cf:2\ncell:T5:l:1:f:7:cf:2\ncell:U5:l:1:f:7:cf:2\ncell:V5:l:1:f:7:cf:2\ncell:W5:l:1:f:7:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:7:bg:2:cf:2\ncell:C6:l:3:f:7:bg:2:cf:2\ncell:D6:t:Music/Video:l:3:f:5:bg:2:cf:2\ncell:E6:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F6:vtf:t::IF( (E6*12)=0,"",(E6*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:7:cf:2\ncell:P6:l:1:f:7:cf:2\ncell:Q6:l:1:f:7:cf:2\ncell:R6:l:1:f:7:cf:2\ncell:S6:l:1:f:7:cf:2\ncell:T6:l:1:f:7:cf:2\ncell:U6:l:1:f:7:cf:2\ncell:V6:l:1:f:7:cf:2\ncell:W6:l:1:f:7:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:7:cf:2\ncell:C7:l:3:f:7:cf:2\ncell:D7:t:Books:l:3:f:5:cf:2\ncell:E7:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:7:cf:2\ncell:P7:l:1:f:7:cf:2\ncell:Q7:l:1:f:7:cf:2\ncell:R7:l:1:f:7:cf:2\ncell:S7:l:1:f:7:cf:2\ncell:T7:l:1:f:7:cf:2\ncell:U7:l:1:f:7:cf:2\ncell:V7:l:1:f:7:cf:2\ncell:W7:l:1:f:7:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:bg:2:cf:2\ncell:C8:l:3:f:7:bg:2:cf:2\ncell:D8:t:Pets:l:3:f:5:bg:2:cf:2\ncell:E8:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:7:cf:2\ncell:P8:l:1:f:7:cf:2\ncell:Q8:l:1:f:7:cf:2\ncell:R8:l:1:f:7:cf:2\ncell:S8:l:1:f:7:cf:2\ncell:T8:l:1:f:7:cf:2\ncell:U8:l:1:f:7:cf:2\ncell:V8:l:1:f:7:cf:2\ncell:W8:l:1:f:7:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:7:cf:2\ncell:C9:l:3:f:7:cf:2\ncell:D9:t:Hobbies:l:3:f:5:cf:2\ncell:E9:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F9:vtf:t::IF( (E9*12)=0,"",(E9*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:7:cf:2\ncell:P9:l:1:f:7:cf:2\ncell:Q9:l:1:f:7:cf:2\ncell:R9:l:1:f:7:cf:2\ncell:S9:l:1:f:7:cf:2\ncell:T9:l:1:f:7:cf:2\ncell:U9:l:1:f:7:cf:2\ncell:V9:l:1:f:7:cf:2\ncell:W9:l:1:f:7:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:7:bg:2:cf:2\ncell:C10:l:3:f:7:bg:2:cf:2\ncell:D10:t:Sports:l:3:f:5:bg:2:cf:2\ncell:E10:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:7:cf:2\ncell:P10:l:1:f:7:cf:2\ncell:Q10:l:1:f:7:cf:2\ncell:R10:l:1:f:7:cf:2\ncell:S10:l:1:f:7:cf:2\ncell:T10:l:1:f:7:cf:2\ncell:U10:l:1:f:7:cf:2\ncell:V10:l:1:f:7:cf:2\ncell:W10:l:1:f:7:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:7:cf:2\ncell:C11:l:3:f:7:cf:2\ncell:D11:t:Gadgets/Toys:l:3:f:5:cf:2\ncell:E11:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:7:cf:2\ncell:P11:l:1:f:7:cf:2\ncell:Q11:l:1:f:7:cf:2\ncell:R11:l:1:f:7:cf:2\ncell:S11:l:1:f:7:cf:2\ncell:T11:l:1:f:7:cf:2\ncell:U11:l:1:f:7:cf:2\ncell:V11:l:1:f:7:cf:2\ncell:W11:l:1:f:7:cf:2\ncell:A12:b::1::\ncell:B12:b::::1:l:3:f:7:bg:2:cf:2\ncell:C12:l:3:f:7:bg:2:cf:2\ncell:D12:t:Other:l:3:f:5:bg:2:cf:2\ncell:E12:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F12:vtf:t::IF( (E12*12)=0,"",(E12*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G12:b::::1\ncell:O12:l:1:f:7:cf:2\ncell:P12:l:1:f:7:cf:2\ncell:Q12:l:1:f:7:cf:2\ncell:R12:l:1:f:7:cf:2\ncell:S12:l:1:f:7:cf:2\ncell:T12:l:1:f:7:cf:2\ncell:U12:l:1:f:7:cf:2\ncell:V12:l:1:f:7:cf:2\ncell:W12:l:1:f:7:cf:2\ncell:B13:t:Education:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C13:l:3:f:2:c:3:bg:1:cf:2\ncell:D13:l:3:f:2:c:3:bg:1:cf:1\ncell:E13:vtf:n:98:SUM(E14\\cE17):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F13:vtf:n:1176:IF( (E13*12)=0,"",(E13*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O13:l:1:f:7:cf:2\ncell:P13:l:1:f:7:cf:2\ncell:Q13:l:1:f:7:cf:2\ncell:R13:l:1:f:7:cf:2\ncell:S13:l:1:f:7:cf:2\ncell:T13:l:1:f:7:cf:2\ncell:U13:l:1:f:7:cf:2\ncell:V13:l:1:f:7:cf:2\ncell:W13:l:1:f:7:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:cf:2\ncell:C14:l:3:f:7:cf:2\ncell:D14:t:Tuition & Fees:l:3:f:5:cf:2\ncell:E14:v:98:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F14:vtf:n:1176:IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:7:cf:2\ncell:P14:l:1:f:7:cf:2\ncell:Q14:l:1:f:7:cf:2\ncell:R14:l:1:f:7:cf:2\ncell:S14:l:1:f:7:cf:2\ncell:T14:l:1:f:7:cf:2\ncell:U14:l:1:f:7:cf:2\ncell:V14:l:1:f:7:cf:2\ncell:W14:l:1:f:7:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:7:bg:2:cf:2\ncell:C15:l:3:f:7:bg:2:cf:2\ncell:D15:t:Preschool:l:3:f:5:bg:2:cf:2\ncell:E15:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F15:vtf:t::IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:7:cf:2\ncell:P15:l:1:f:7:cf:2\ncell:Q15:l:1:f:7:cf:2\ncell:R15:l:1:f:7:cf:2\ncell:S15:l:1:f:7:cf:2\ncell:T15:l:1:f:7:cf:2\ncell:U15:l:1:f:7:cf:2\ncell:V15:l:1:f:7:cf:2\ncell:W15:l:1:f:7:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:7:cf:2\ncell:C16:l:3:f:7:cf:2\ncell:D16:t:Books & Supplies:l:3:f:5:cf:2\ncell:E16:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:7:cf:2\ncell:P16:l:1:f:7:cf:2\ncell:Q16:l:1:f:7:cf:2\ncell:R16:l:1:f:7:cf:2\ncell:S16:l:1:f:7:cf:2\ncell:T16:l:1:f:7:cf:2\ncell:U16:l:1:f:7:cf:2\ncell:V16:l:1:f:7:cf:2\ncell:W16:l:1:f:7:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:7:bg:2:cf:2\ncell:C17:l:3:f:7:bg:2:cf:2\ncell:D17:t:Other:l:3:f:5:bg:2:cf:2\ncell:E17:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:7:cf:2\ncell:P17:l:1:f:7:cf:2\ncell:Q17:l:1:f:7:cf:2\ncell:R17:l:1:f:7:cf:2\ncell:B18:t:Contributions, Donations, Gifts:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C18:l:3:f:2:c:3:bg:1:cf:2\ncell:D18:l:3:f:2:c:3:bg:1:cf:1\ncell:E18:vtf:n:222:SUM(E19\\cE21):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F18:vtf:n:2664:IF( (E18*12)=0,"",(E18*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O18:l:1:f:7:cf:2\ncell:P18:l:1:f:7:cf:2\ncell:Q18:l:1:f:7:cf:2\ncell:R18:l:1:f:7:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:7:cf:2\ncell:C19:l:3:f:7:cf:2\ncell:D19:t:Cash contributions:l:3:f:5:cf:2\ncell:E19:v:136:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F19:vtf:n:1632:IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:7:cf:2\ncell:P19:l:1:f:7:cf:2\ncell:Q19:l:1:f:7:cf:2\ncell:R19:l:1:f:7:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:7:bg:2:cf:2\ncell:C20:l:3:f:7:bg:2:cf:2\ncell:D20:t:Gifts:l:3:f:5:bg:2:cf:2\ncell:E20:v:86:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F20:vtf:n:1032:IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:7:cf:2\ncell:P20:l:1:f:7:cf:2\ncell:Q20:l:1:f:7:cf:2\ncell:R20:l:1:f:7:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:cf:2\ncell:C21:l:3:f:7:cf:2\ncell:D21:t:Other:l:3:f:5:cf:2\ncell:E21:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:7:cf:2\ncell:P21:l:1:f:7:cf:2\ncell:Q21:l:1:f:7:cf:2\ncell:R21:l:1:f:7:cf:2\ncell:B22:t:Debt:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C22:l:3:f:2:c:3:bg:1:cf:2\ncell:D22:l:3:f:2:c:3:bg:1:cf:1\ncell:E22:vtf:n:0:SUM(E23\\cE24):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O22:l:1:f:7:cf:2\ncell:P22:l:1:f:7:cf:2\ncell:Q22:l:1:f:7:cf:2\ncell:R22:l:1:f:7:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:7:cf:2\ncell:C23:l:3:f:7:cf:2\ncell:D23:t:Student loan payment:l:3:f:5:cf:2\ncell:E23:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:7:cf:2\ncell:P23:l:1:f:7:cf:2\ncell:Q23:l:1:f:7:cf:2\ncell:R23:l:1:f:7:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:7:bg:2:cf:2\ncell:C24:l:3:f:7:bg:2:cf:2\ncell:D24:t:Other loan & debt payment:l:3:f:5:bg:2:cf:2\ncell:E24:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:7:cf:2\ncell:P24:l:1:f:7:cf:2\ncell:Q24:l:1:f:7:cf:2\ncell:R24:l:1:f:7:cf:2\ncell:B25:t:Insurance:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C25:l:3:f:2:c:3:bg:1:cf:2\ncell:D25:l:3:f:2:c:3:bg:1:cf:1\ncell:E25:vtf:n:30:SUM(E26\\cE28):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F25:vtf:n:360:IF( (E25*12)=0,"",(E25*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O25:l:1:f:7:cf:2\ncell:P25:l:1:f:7:cf:2\ncell:Q25:l:1:f:7:cf:2\ncell:R25:l:1:f:7:cf:2\ncell:A26:b::1::\ncell:B26:b::::1:l:3:f:7:cf:2\ncell:C26:l:3:f:7:cf:2\ncell:D26:t:Health Insurance:l:3:f:5:cf:2\ncell:E26:v:30:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F26:vtf:n:360:IF( (E26*12)=0,"",(E26*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G26:b::::1\ncell:O26:l:1:f:7:cf:2\ncell:P26:l:1:f:7:cf:2\ncell:Q26:l:1:f:7:cf:2\ncell:R26:l:1:f:7:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:7:bg:2:cf:2\ncell:C27:l:3:f:7:bg:2:cf:2\ncell:D27:t:Car/Tax Insurance:l:3:f:5:bg:2:cf:2\ncell:E27:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F27:vtf:t::IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:7:cf:2\ncell:P27:l:1:f:7:cf:2\ncell:Q27:l:1:f:7:cf:2\ncell:R27:l:1:f:7:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:7:cf:2\ncell:C28:l:3:f:7:cf:2\ncell:D28:t:Home Insurance:l:3:f:5:cf:2\ncell:E28:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:7:cf:2\ncell:P28:l:1:f:7:cf:2\ncell:Q28:l:1:f:7:cf:2\ncell:R28:l:1:f:7:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:bg:2\ncell:C29:bg:2\ncell:D29:t:Life Insurance:l:3:f:6:bg:2:cf:2\ncell:E29:b:1:1:1:1:bg:2\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:bg:2\ncell:G29:b::::1\ncell:O29:l:1:f:7:cf:2\ncell:P29:l:1:f:7:cf:2\ncell:Q29:l:1:f:7:cf:2\ncell:R29:l:1:f:7:cf:2\ncell:A30:b::1::\ncell:B30:b:::1:1\ncell:C30:b:::1:\ncell:D30:t:Others:b:::1::l:3:f:6:cf:2\ncell:E30:b:1:1:1:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1:1:1\ncell:G30:b::::1\ncell:O30:l:1:f:7:cf:2\ncell:P30:l:1:f:7:cf:2\ncell:Q30:l:1:f:7:cf:2\ncell:R30:l:1:f:7:cf:2\ncell:B31:b:1:::\ncell:C31:b:1:::\ncell:D31:b:1:::\ncell:E31:b:1:::\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b:1:::\ncell:O31:l:1:f:7:cf:2\ncell:P31:l:1:f:7:cf:2\ncell:Q31:l:1:f:7:cf:2\ncell:R31:l:1:f:7:cf:2\ncell:B32:l:1:f:4:cf:2\ncell:C32:l:1:f:4:cf:2\ncell:D32:l:1:f:9:cf:2\ncell:E32:l:1:f:9:cf:2\ncell:F32:l:1:f:7:cf:2\ncell:O32:l:1:f:7:cf:2\ncell:P32:l:1:f:7:cf:2\ncell:Q32:l:1:f:7:cf:2\ncell:R32:l:1:f:7:cf:2\ncell:O33:l:1:f:7:cf:2\ncell:P33:l:1:f:7:cf:2\ncell:Q33:l:1:f:7:cf:2\ncell:R33:l:1:f:7:cf:2\ncell:O34:l:1:f:7:cf:2\ncell:P34:l:1:f:7:cf:2\ncell:Q34:l:1:f:7:cf:2\ncell:R34:l:1:f:7:cf:2\ncell:O35:l:1:f:7:cf:2\ncell:P35:l:1:f:7:cf:2\ncell:Q35:l:1:f:7:cf:2\ncell:R35:l:1:f:7:cf:2\ncell:O36:l:1:f:7:cf:2\ncell:P36:l:1:f:7:cf:2\ncell:Q36:l:1:f:7:cf:2\ncell:R36:l:1:f:7:cf:2\ncell:O37:l:1:f:7:cf:2\ncell:P37:l:1:f:7:cf:2\ncell:Q37:l:1:f:7:cf:2\ncell:R37:l:1:f:7:cf:2\ncell:O38:l:1:f:7:cf:2\ncell:P38:l:1:f:7:cf:2\ncell:Q38:l:1:f:7:cf:2\ncell:R38:l:1:f:7:cf:2\ncell:O39:l:1:f:7:cf:2\ncell:P39:l:1:f:7:cf:2\ncell:Q39:l:1:f:7:cf:2\ncell:R39:l:1:f:7:cf:2\ncell:O40:l:1:f:7:cf:2\ncell:P40:l:1:f:7:cf:2\ncell:Q40:l:1:f:7:cf:2\ncell:R40:l:1:f:7:cf:2\ncell:O41:l:1:f:7:cf:2\ncell:P41:l:1:f:7:cf:2\ncell:Q41:l:1:f:7:cf:2\ncell:R41:l:1:f:7:cf:2\ncell:O42:l:1:f:7:cf:2\ncell:P42:l:1:f:7:cf:2\ncell:Q42:l:1:f:7:cf:2\ncell:R42:l:1:f:7:cf:2\ncell:S42:l:1:f:7:cf:2\ncell:T42:l:1:f:7:cf:2\ncell:U42:l:1:f:7:cf:2\ncell:V42:l:1:f:7:cf:2\ncell:W42:l:1:f:7:cf:2\ncell:O43:l:1:f:7:cf:2\ncell:P43:l:1:f:7:cf:2\ncell:Q43:l:1:f:7:cf:2\ncell:R43:l:1:f:7:cf:2\ncell:S43:l:1:f:7:cf:2\ncell:T43:l:1:f:7:cf:2\ncell:U43:l:1:f:7:cf:2\ncell:V43:l:1:f:7:cf:2\ncell:W43:l:1:f:7:cf:2\ncell:O44:l:1:f:7:cf:2\ncell:P44:l:1:f:7:cf:2\ncell:Q44:l:1:f:7:cf:2\ncell:R44:l:1:f:7:cf:2\ncell:S44:l:1:f:7:cf:2\ncell:T44:l:1:f:7:cf:2\ncell:U44:l:1:f:7:cf:2\ncell:V44:l:1:f:7:cf:2\ncell:W44:l:1:f:7:cf:2\ncell:O45:l:1:f:7:cf:2\ncell:P45:l:1:f:7:cf:2\ncell:Q45:l:1:f:7:cf:2\ncell:R45:l:1:f:7:cf:2\ncell:S45:l:1:f:7:cf:2\ncell:T45:l:1:f:7:cf:2\ncell:U45:l:1:f:7:cf:2\ncell:V45:l:1:f:7:cf:2\ncell:W45:l:1:f:7:cf:2\ncell:O46:l:1:f:7:cf:2\ncell:P46:l:1:f:7:cf:2\ncell:Q46:l:1:f:7:cf:2\ncell:R46:l:1:f:7:cf:2\ncell:S46:l:1:f:7:cf:2\ncell:T46:l:1:f:7:cf:2\ncell:U46:l:1:f:7:cf:2\ncell:V46:l:1:f:7:cf:2\ncell:W46:l:1:f:7:cf:2\ncell:O47:l:1:f:7:cf:2\ncell:P47:l:1:f:7:cf:2\ncell:Q47:l:1:f:7:cf:2\ncell:R47:l:1:f:7:cf:2\ncell:S47:l:1:f:7:cf:2\ncell:T47:l:1:f:7:cf:2\ncell:U47:l:1:f:7:cf:2\ncell:V47:l:1:f:7:cf:2\ncell:W47:l:1:f:7:cf:2\ncell:O48:l:1:f:7:cf:2\ncell:P48:l:1:f:7:cf:2\ncell:Q48:l:1:f:7:cf:2\ncell:R48:l:1:f:7:cf:2\ncell:S48:l:1:f:7:cf:2\ncell:T48:l:1:f:7:cf:2\ncell:U48:l:1:f:7:cf:2\ncell:V48:l:1:f:7:cf:2\ncell:W48:l:1:f:7:cf:2\ncell:O49:l:1:f:7:cf:2\ncell:P49:l:1:f:7:cf:2\ncell:Q49:l:1:f:7:cf:2\ncell:R49:l:1:f:7:cf:2\ncell:S49:l:1:f:7:cf:2\ncell:T49:l:1:f:7:cf:2\ncell:U49:l:1:f:7:cf:2\ncell:V49:l:1:f:7:cf:2\ncell:W49:l:1:f:7:cf:2\ncell:O50:l:1:f:7:cf:2\ncell:P50:l:1:f:7:cf:2\ncell:Q50:l:1:f:7:cf:2\ncell:R50:l:1:f:7:cf:2\ncell:S50:l:1:f:7:cf:2\ncell:T50:l:1:f:7:cf:2\ncell:U50:l:1:f:7:cf:2\ncell:V50:l:1:f:7:cf:2\ncell:W50:l:1:f:7:cf:2\ncell:O51:l:1:f:7:cf:2\ncell:P51:l:1:f:7:cf:2\ncell:Q51:l:1:f:7:cf:2\ncell:R51:l:1:f:7:cf:2\ncell:S51:l:1:f:7:cf:2\ncell:T51:l:1:f:7:cf:2\ncell:U51:l:1:f:7:cf:2\ncell:V51:l:1:f:7:cf:2\ncell:W51:l:1:f:7:cf:2\ncell:O52:l:1:f:7:cf:2\ncell:P52:l:1:f:7:cf:2\ncell:Q52:l:1:f:7:cf:2\ncell:R52:l:1:f:7:cf:2\ncell:S52:l:1:f:7:cf:2\ncell:T52:l:1:f:7:cf:2\ncell:U52:l:1:f:7:cf:2\ncell:V52:l:1:f:7:cf:2\ncell:W52:l:1:f:7:cf:2\ncell:O53:l:1:f:7:cf:2\ncell:P53:l:1:f:7:cf:2\ncell:Q53:l:1:f:7:cf:2\ncell:R53:l:1:f:7:cf:2\ncell:S53:l:1:f:7:cf:2\ncell:T53:l:1:f:7:cf:2\ncell:U53:l:1:f:7:cf:2\ncell:V53:l:1:f:7:cf:2\ncell:W53:l:1:f:7:cf:2\ncell:O54:l:1:f:7:cf:2\ncell:P54:l:1:f:7:cf:2\ncell:Q54:l:1:f:7:cf:2\ncell:R54:l:1:f:7:cf:2\ncell:S54:l:1:f:7:cf:2\ncell:T54:l:1:f:7:cf:2\ncell:U54:l:1:f:7:cf:2\ncell:V54:l:1:f:7:cf:2\ncell:W54:l:1:f:7:cf:2\ncell:O55:l:1:f:7:cf:2\ncell:P55:l:1:f:7:cf:2\ncell:Q55:l:1:f:7:cf:2\ncell:R55:l:1:f:7:cf:2\ncell:S55:l:1:f:7:cf:2\ncell:T55:l:1:f:7:cf:2\ncell:U55:l:1:f:7:cf:2\ncell:V55:l:1:f:7:cf:2\ncell:W55:l:1:f:7:cf:2\ncell:O56:l:1:f:7:cf:2\ncell:P56:l:1:f:7:cf:2\ncell:Q56:l:1:f:7:cf:2\ncell:R56:l:1:f:7:cf:2\ncell:S56:l:1:f:7:cf:2\ncell:T56:l:1:f:7:cf:2\ncell:U56:l:1:f:7:cf:2\ncell:V56:l:1:f:7:cf:2\ncell:W56:l:1:f:7:cf:2\ncell:O57:l:1:f:7:cf:2\ncell:P57:l:1:f:7:cf:2\ncell:Q57:l:1:f:7:cf:2\ncell:R57:l:1:f:7:cf:2\ncell:S57:l:1:f:7:cf:2\ncell:T57:l:1:f:7:cf:2\ncell:U57:l:1:f:7:cf:2\ncell:V57:l:1:f:7:cf:2\ncell:W57:l:1:f:7:cf:2\ncell:O58:l:1:f:7:cf:2\ncell:P58:l:1:f:7:cf:2\ncell:Q58:l:1:f:7:cf:2\ncell:R58:l:1:f:7:cf:2\ncell:S58:l:1:f:7:cf:2\ncell:T58:l:1:f:7:cf:2\ncell:U58:l:1:f:7:cf:2\ncell:V58:l:1:f:7:cf:2\ncell:W58:l:1:f:7:cf:2\ncell:O59:l:1:f:7:cf:2\ncell:P59:l:1:f:7:cf:2\ncell:Q59:l:1:f:7:cf:2\ncell:R59:l:1:f:7:cf:2\ncell:S59:l:1:f:7:cf:2\ncell:T59:l:1:f:7:cf:2\ncell:U59:l:1:f:7:cf:2\ncell:V59:l:1:f:7:cf:2\ncell:W59:l:1:f:7:cf:2\ncell:O60:l:1:f:7:cf:2\ncell:P60:l:1:f:7:cf:2\ncell:Q60:l:1:f:7:cf:2\ncell:R60:l:1:f:7:cf:2\ncell:S60:l:1:f:7:cf:2\ncell:T60:l:1:f:7:cf:2\ncell:U60:l:1:f:7:cf:2\ncell:V60:l:1:f:7:cf:2\ncell:W60:l:1:f:7:cf:2\ncell:O61:l:1:f:7:cf:2\ncell:P61:l:1:f:7:cf:2\ncell:Q61:l:1:f:7:cf:2\ncell:R61:l:1:f:7:cf:2\ncell:S61:l:1:f:7:cf:2\ncell:T61:l:1:f:7:cf:2\ncell:U61:l:1:f:7:cf:2\ncell:V61:l:1:f:7:cf:2\ncell:W61:l:1:f:7:cf:2\ncell:O62:l:1:f:7:cf:2\ncell:P62:l:1:f:7:cf:2\ncell:Q62:l:1:f:7:cf:2\ncell:R62:l:1:f:7:cf:2\ncell:S62:l:1:f:7:cf:2\ncell:T62:l:1:f:7:cf:2\ncell:U62:l:1:f:7:cf:2\ncell:V62:l:1:f:7:cf:2\ncell:W62:l:1:f:7:cf:2\ncell:O63:l:1:f:7:cf:2\ncell:P63:l:1:f:7:cf:2\ncell:Q63:l:1:f:7:cf:2\ncell:R63:l:1:f:7:cf:2\ncell:S63:l:1:f:7:cf:2\ncell:T63:l:1:f:7:cf:2\ncell:U63:l:1:f:7:cf:2\ncell:V63:l:1:f:7:cf:2\ncell:W63:l:1:f:7:cf:2\ncell:O64:l:1:f:7:cf:2\ncell:P64:l:1:f:7:cf:2\ncell:Q64:l:1:f:7:cf:2\ncell:R64:l:1:f:7:cf:2\ncell:S64:l:1:f:7:cf:2\ncell:T64:l:1:f:7:cf:2\ncell:U64:l:1:f:7:cf:2\ncell:V64:l:1:f:7:cf:2\ncell:W64:l:1:f:7:cf:2\ncell:O65:l:1:f:7:cf:2\ncell:P65:l:1:f:7:cf:2\ncell:Q65:l:1:f:7:cf:2\ncell:R65:l:1:f:7:cf:2\ncell:S65:l:1:f:7:cf:2\ncell:T65:l:1:f:7:cf:2\ncell:U65:l:1:f:7:cf:2\ncell:V65:l:1:f:7:cf:2\ncell:W65:l:1:f:7:cf:2\ncell:O66:l:1:f:7:cf:2\ncell:P66:l:1:f:7:cf:2\ncell:Q66:l:1:f:7:cf:2\ncell:R66:l:1:f:7:cf:2\ncell:S66:l:1:f:7:cf:2\ncell:T66:l:1:f:7:cf:2\ncell:U66:l:1:f:7:cf:2\ncell:V66:l:1:f:7:cf:2\ncell:W66:l:1:f:7:cf:2\ncell:O67:l:1:f:7:cf:2\ncell:P67:l:1:f:7:cf:2\ncell:Q67:l:1:f:7:cf:2\ncell:R67:l:1:f:7:cf:2\ncell:S67:l:1:f:7:cf:2\ncell:T67:l:1:f:7:cf:2\ncell:U67:l:1:f:7:cf:2\ncell:V67:l:1:f:7:cf:2\ncell:W67:l:1:f:7:cf:2\ncell:O68:l:1:f:7:cf:2\ncell:P68:l:1:f:7:cf:2\ncell:Q68:l:1:f:7:cf:2\ncell:R68:l:1:f:7:cf:2\ncell:S68:l:1:f:7:cf:2\ncell:T68:l:1:f:7:cf:2\ncell:U68:l:1:f:7:cf:2\ncell:V68:l:1:f:7:cf:2\ncell:W68:l:1:f:7:cf:2\ncell:O69:l:1:f:7:cf:2\ncell:P69:l:1:f:7:cf:2\ncell:Q69:l:1:f:7:cf:2\ncell:R69:l:1:f:7:cf:2\ncell:S69:l:1:f:7:cf:2\ncell:T69:l:1:f:7:cf:2\ncell:U69:l:1:f:7:cf:2\ncell:V69:l:1:f:7:cf:2\ncell:W69:l:1:f:7:cf:2\ncell:O70:l:1:f:7:cf:2\ncell:P70:l:1:f:7:cf:2\ncell:Q70:l:1:f:7:cf:2\ncell:R70:l:1:f:7:cf:2\ncell:S70:l:1:f:7:cf:2\ncell:T70:l:1:f:7:cf:2\ncell:U70:l:1:f:7:cf:2\ncell:V70:l:1:f:7:cf:2\ncell:W70:l:1:f:7:cf:2\ncell:O71:l:1:f:7:cf:2\ncell:P71:l:1:f:7:cf:2\ncell:Q71:l:1:f:7:cf:2\ncell:R71:l:1:f:7:cf:2\ncell:S71:l:1:f:7:cf:2\ncell:T71:l:1:f:7:cf:2\ncell:U71:l:1:f:7:cf:2\ncell:V71:l:1:f:7:cf:2\ncell:W71:l:1:f:7:cf:2\ncell:O72:l:1:f:7:cf:2\ncell:P72:l:1:f:7:cf:2\ncell:Q72:l:1:f:7:cf:2\ncell:R72:l:1:f:7:cf:2\ncell:S72:l:1:f:7:cf:2\ncell:T72:l:1:f:7:cf:2\ncell:U72:l:1:f:7:cf:2\ncell:V72:l:1:f:7:cf:2\ncell:W72:l:1:f:7:cf:2\ncell:O73:l:1:f:7:cf:2\ncell:P73:l:1:f:7:cf:2\ncell:Q73:l:1:f:7:cf:2\ncell:R73:l:1:f:7:cf:2\ncell:S73:l:1:f:7:cf:2\ncell:T73:l:1:f:7:cf:2\ncell:U73:l:1:f:7:cf:2\ncell:V73:l:1:f:7:cf:2\ncell:W73:l:1:f:7:cf:2\ncell:O74:l:1:f:7:cf:2\ncell:P74:l:1:f:7:cf:2\ncell:Q74:l:1:f:7:cf:2\ncell:R74:l:1:f:7:cf:2\ncell:S74:l:1:f:7:cf:2\ncell:T74:l:1:f:7:cf:2\ncell:U74:l:1:f:7:cf:2\ncell:V74:l:1:f:7:cf:2\ncell:W74:l:1:f:7:cf:2\ncell:O75:l:1:f:7:cf:2\ncell:P75:l:1:f:7:cf:2\ncell:Q75:l:1:f:7:cf:2\ncell:R75:l:1:f:7:cf:2\ncell:S75:l:1:f:7:cf:2\ncell:T75:l:1:f:7:cf:2\ncell:U75:l:1:f:7:cf:2\ncell:V75:l:1:f:7:cf:2\ncell:W75:l:1:f:7:cf:2\ncell:O76:l:1:f:7:cf:2\ncell:P76:l:1:f:7:cf:2\ncell:Q76:l:1:f:7:cf:2\ncell:R76:l:1:f:7:cf:2\ncell:S76:l:1:f:7:cf:2\ncell:T76:l:1:f:7:cf:2\ncell:U76:l:1:f:7:cf:2\ncell:V76:l:1:f:7:cf:2\ncell:W76:l:1:f:7:cf:2\ncell:O77:l:1:f:7:cf:2\ncell:P77:l:1:f:7:cf:2\ncell:Q77:l:1:f:7:cf:2\ncell:R77:l:1:f:7:cf:2\ncell:S77:l:1:f:7:cf:2\ncell:T77:l:1:f:7:cf:2\ncell:U77:l:1:f:7:cf:2\ncell:V77:l:1:f:7:cf:2\ncell:W77:l:1:f:7:cf:2\ncell:O78:l:1:f:7:cf:2\ncell:P78:l:1:f:7:cf:2\ncell:Q78:l:1:f:7:cf:2\ncell:R78:l:1:f:7:cf:2\ncell:S78:l:1:f:7:cf:2\ncell:T78:l:1:f:7:cf:2\ncell:U78:l:1:f:7:cf:2\ncell:V78:l:1:f:7:cf:2\ncell:W78:l:1:f:7:cf:2\ncell:O79:l:1:f:7:cf:2\ncell:P79:l:1:f:7:cf:2\ncell:Q79:l:1:f:7:cf:2\ncell:R79:l:1:f:7:cf:2\ncell:S79:l:1:f:7:cf:2\ncell:T79:l:1:f:7:cf:2\ncell:U79:l:1:f:7:cf:2\ncell:V79:l:1:f:7:cf:2\ncell:W79:l:1:f:7:cf:2\ncell:O80:l:1:f:7:cf:2\ncell:P80:l:1:f:7:cf:2\ncell:Q80:l:1:f:7:cf:2\ncell:R80:l:1:f:7:cf:2\ncell:S80:l:1:f:7:cf:2\ncell:T80:l:1:f:7:cf:2\ncell:U80:l:1:f:7:cf:2\ncell:V80:l:1:f:7:cf:2\ncell:W80:l:1:f:7:cf:2\ncell:O81:l:1:f:7:cf:2\ncell:P81:l:1:f:7:cf:2\ncell:Q81:l:1:f:7:cf:2\ncell:R81:l:1:f:7:cf:2\ncell:S81:l:1:f:7:cf:2\ncell:T81:l:1:f:7:cf:2\ncell:U81:l:1:f:7:cf:2\ncell:V81:l:1:f:7:cf:2\ncell:W81:l:1:f:7:cf:2\ncell:O82:l:1:f:7:cf:2\ncell:P82:l:1:f:7:cf:2\ncell:Q82:l:1:f:7:cf:2\ncell:R82:l:1:f:7:cf:2\ncell:S82:l:1:f:7:cf:2\ncell:T82:l:1:f:7:cf:2\ncell:U82:l:1:f:7:cf:2\ncell:V82:l:1:f:7:cf:2\ncell:W82:l:1:f:7:cf:2\ncell:O83:l:1:f:7:cf:2\ncell:P83:l:1:f:7:cf:2\ncell:Q83:l:1:f:7:cf:2\ncell:R83:l:1:f:7:cf:2\ncell:S83:l:1:f:7:cf:2\ncell:T83:l:1:f:7:cf:2\ncell:U83:l:1:f:7:cf:2\ncell:V83:l:1:f:7:cf:2\ncell:W83:l:1:f:7:cf:2\ncell:O84:l:1:f:7:cf:2\ncell:P84:l:1:f:7:cf:2\ncell:Q84:l:1:f:7:cf:2\ncell:R84:l:1:f:7:cf:2\ncell:S84:l:1:f:7:cf:2\ncell:T84:l:1:f:7:cf:2\ncell:U84:l:1:f:7:cf:2\ncell:V84:l:1:f:7:cf:2\ncell:W84:l:1:f:7:cf:2\ncell:O85:l:1:f:7:cf:2\ncell:P85:l:1:f:7:cf:2\ncell:Q85:l:1:f:7:cf:2\ncell:R85:l:1:f:7:cf:2\ncell:S85:l:1:f:7:cf:2\ncell:T85:l:1:f:7:cf:2\ncell:U85:l:1:f:7:cf:2\ncell:V85:l:1:f:7:cf:2\ncell:W85:l:1:f:7:cf:2\ncell:O86:l:1:f:7:cf:2\ncell:P86:l:1:f:7:cf:2\ncell:Q86:l:1:f:7:cf:2\ncell:R86:l:1:f:7:cf:2\ncell:S86:l:1:f:7:cf:2\ncell:T86:l:1:f:7:cf:2\ncell:U86:l:1:f:7:cf:2\ncell:V86:l:1:f:7:cf:2\ncell:W86:l:1:f:7:cf:2\ncell:O87:l:1:f:7:cf:2\ncell:P87:l:1:f:7:cf:2\ncell:Q87:l:1:f:7:cf:2\ncell:R87:l:1:f:7:cf:2\ncell:S87:l:1:f:7:cf:2\ncell:T87:l:1:f:7:cf:2\ncell:U87:l:1:f:7:cf:2\ncell:V87:l:1:f:7:cf:2\ncell:W87:l:1:f:7:cf:2\ncell:O88:l:1:f:7:cf:2\ncell:P88:l:1:f:7:cf:2\ncell:Q88:l:1:f:7:cf:2\ncell:R88:l:1:f:7:cf:2\ncell:S88:l:1:f:7:cf:2\ncell:T88:l:1:f:7:cf:2\ncell:U88:l:1:f:7:cf:2\ncell:V88:l:1:f:7:cf:2\ncell:W88:l:1:f:7:cf:2\ncell:O89:l:1:f:7:cf:2\ncell:P89:l:1:f:7:cf:2\ncell:Q89:l:1:f:7:cf:2\ncell:R89:l:1:f:7:cf:2\ncell:S89:l:1:f:7:cf:2\ncell:T89:l:1:f:7:cf:2\ncell:U89:l:1:f:7:cf:2\ncell:V89:l:1:f:7:cf:2\ncell:W89:l:1:f:7:cf:2\ncell:O90:l:1:f:7:cf:2\ncell:P90:l:1:f:7:cf:2\ncell:Q90:l:1:f:7:cf:2\ncell:R90:l:1:f:7:cf:2\ncell:S90:l:1:f:7:cf:2\ncell:T90:l:1:f:7:cf:2\ncell:U90:l:1:f:7:cf:2\ncell:V90:l:1:f:7:cf:2\ncell:W90:l:1:f:7:cf:2\ncell:O91:l:1:f:7:cf:2\ncell:P91:l:1:f:7:cf:2\ncell:Q91:l:1:f:7:cf:2\ncell:R91:l:1:f:7:cf:2\ncell:S91:l:1:f:7:cf:2\ncell:T91:l:1:f:7:cf:2\ncell:U91:l:1:f:7:cf:2\ncell:V91:l:1:f:7:cf:2\ncell:W91:l:1:f:7:cf:2\ncell:O92:l:1:f:7:cf:2\ncell:P92:l:1:f:7:cf:2\ncell:Q92:l:1:f:7:cf:2\ncell:R92:l:1:f:7:cf:2\ncell:S92:l:1:f:7:cf:2\ncell:T92:l:1:f:7:cf:2\ncell:U92:l:1:f:7:cf:2\ncell:V92:l:1:f:7:cf:2\ncell:W92:l:1:f:7:cf:2\ncell:O93:l:1:f:7:cf:2\ncell:P93:l:1:f:7:cf:2\ncell:Q93:l:1:f:7:cf:2\ncell:R93:l:1:f:7:cf:2\ncell:S93:l:1:f:7:cf:2\ncell:T93:l:1:f:7:cf:2\ncell:U93:l:1:f:7:cf:2\ncell:V93:l:1:f:7:cf:2\ncell:W93:l:1:f:7:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:S94:l:1:f:8:cf:2\ncell:T94:l:1:f:8:cf:2\ncell:U94:l:1:f:8:cf:2\ncell:V94:l:1:f:8:cf:2\ncell:W94:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:S95:l:1:f:8:cf:2\ncell:T95:l:1:f:8:cf:2\ncell:U95:l:1:f:8:cf:2\ncell:V95:l:1:f:8:cf:2\ncell:W95:l:1:f:8:cf:2\ncell:O96:l:1:f:8:cf:2\ncell:P96:l:1:f:8:cf:2\ncell:Q96:l:1:f:8:cf:2\ncell:R96:l:1:f:8:cf:2\ncell:S96:l:1:f:8:cf:2\ncell:T96:l:1:f:8:cf:2\ncell:U96:l:1:f:8:cf:2\ncell:V96:l:1:f:8:cf:2\ncell:W96:l:1:f:8:cf:2\ncell:O97:l:1:f:8:cf:2\ncell:P97:l:1:f:8:cf:2\ncell:Q97:l:1:f:8:cf:2\ncell:R97:l:1:f:8:cf:2\ncell:S97:l:1:f:8:cf:2\ncell:T97:l:1:f:8:cf:2\ncell:U97:l:1:f:8:cf:2\ncell:V97:l:1:f:8:cf:2\ncell:W97:l:1:f:8:cf:2\ncell:A98:l:1:f:8:cf:2\ncell:B98:l:1:f:8:cf:2\ncell:C98:l:1:f:8:cf:2\ncell:D98:l:1:f:8:cf:2\ncell:E98:l:1:f:8:cf:2\ncell:F98:t:Monthly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G98:l:1:f:8:cf:2\ncell:H98:l:1:f:8:cf:2\ncell:I98:l:1:f:8:cf:2\ncell:J98:l:1:f:8:cf:2\ncell:K98:l:1:f:8:cf:2\ncell:L98:l:1:f:8:cf:2\ncell:M98:l:1:f:8:cf:2\ncell:N98:l:1:f:8:cf:2\ncell:O98:l:1:f:8:cf:2\ncell:P98:l:1:f:8:cf:2\ncell:Q98:l:1:f:8:cf:2\ncell:R98:l:1:f:8:cf:2\ncell:S98:l:1:f:8:cf:2\ncell:T98:l:1:f:8:cf:2\ncell:U98:l:1:f:8:cf:2\ncell:V98:l:1:f:8:cf:2\ncell:W98:l:1:f:8:cf:2\ncell:A99:l:1:f:8:cf:2\ncell:B99:l:1:f:8:cf:2\ncell:C99:l:1:f:8:cf:2\ncell:D99:l:1:f:8:cf:2\ncell:E99:l:1:f:8:cf:2\ncell:F99:t:Semi-Annually:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G99:l:1:f:8:cf:2\ncell:H99:l:1:f:8:cf:2\ncell:I99:l:1:f:8:cf:2\ncell:J99:l:1:f:8:cf:2\ncell:K99:l:1:f:8:cf:2\ncell:L99:l:1:f:8:cf:2\ncell:M99:l:1:f:8:cf:2\ncell:N99:l:1:f:8:cf:2\ncell:O99:l:1:f:8:cf:2\ncell:P99:l:1:f:8:cf:2\ncell:Q99:l:1:f:8:cf:2\ncell:R99:l:1:f:8:cf:2\ncell:S99:l:1:f:8:cf:2\ncell:T99:l:1:f:8:cf:2\ncell:U99:l:1:f:8:cf:2\ncell:V99:l:1:f:8:cf:2\ncell:W99:l:1:f:8:cf:2\ncell:A100:l:1:f:8:cf:2\ncell:B100:l:1:f:8:cf:2\ncell:C100:l:1:f:8:cf:2\ncell:D100:l:1:f:8:cf:2\ncell:E100:l:1:f:8:cf:2\ncell:F100:t:Quarterly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G100:l:1:f:8:cf:2\ncell:H100:l:1:f:8:cf:2\ncell:I100:l:1:f:8:cf:2\ncell:J100:l:1:f:8:cf:2\ncell:K100:l:1:f:8:cf:2\ncell:L100:l:1:f:8:cf:2\ncell:M100:l:1:f:8:cf:2\ncell:N100:l:1:f:8:cf:2\ncell:O100:l:1:f:8:cf:2\ncell:P100:l:1:f:8:cf:2\ncell:Q100:l:1:f:8:cf:2\ncell:R100:l:1:f:8:cf:2\ncell:S100:l:1:f:8:cf:2\ncell:T100:l:1:f:8:cf:2\ncell:U100:l:1:f:8:cf:2\ncell:V100:l:1:f:8:cf:2\ncell:W100:l:1:f:8:cf:2\ncell:A101:l:1:f:8:cf:2\ncell:B101:l:1:f:8:cf:2\ncell:C101:l:1:f:8:cf:2\ncell:D101:l:1:f:8:cf:2\ncell:E101:l:1:f:8:cf:2\ncell:F101:t:Yearly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G101:l:1:f:8:cf:2\ncell:H101:l:1:f:8:cf:2\ncell:I101:l:1:f:8:cf:2\ncell:J101:l:1:f:8:cf:2\ncell:K101:l:1:f:8:cf:2\ncell:L101:l:1:f:8:cf:2\ncell:M101:l:1:f:8:cf:2\ncell:N101:l:1:f:8:cf:2\ncell:O101:l:1:f:8:cf:2\ncell:P101:l:1:f:8:cf:2\ncell:Q101:l:1:f:8:cf:2\ncell:R101:l:1:f:8:cf:2\ncell:S101:l:1:f:8:cf:2\ncell:T101:l:1:f:8:cf:2\ncell:U101:l:1:f:8:cf:2\ncell:V101:l:1:f:8:cf:2\ncell:W101:l:1:f:8:cf:2\ncell:A102:l:1:f:8:cf:2\ncell:B102:l:1:f:8:cf:2\ncell:C102:l:1:f:8:cf:2\ncell:D102:l:1:f:8:cf:2\ncell:E102:l:1:f:8:cf:2\ncell:F102:l:1:f:8:cf:2\ncell:G102:l:1:f:8:cf:2\ncell:H102:l:1:f:8:cf:2\ncell:I102:l:1:f:8:cf:2\ncell:J102:l:1:f:8:cf:2\ncell:K102:l:1:f:8:cf:2\ncell:L102:l:1:f:8:cf:2\ncell:M102:l:1:f:8:cf:2\ncell:N102:l:1:f:8:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:A103:l:1:f:8:cf:2\ncell:B103:l:1:f:8:cf:2\ncell:C103:l:1:f:8:cf:2\ncell:D103:l:1:f:8:cf:2\ncell:E103:l:1:f:8:cf:2\ncell:F103:l:1:f:8:cf:2\ncell:G103:l:1:f:8:cf:2\ncell:H103:l:1:f:8:cf:2\ncell:I103:l:1:f:8:cf:2\ncell:J103:l:1:f:8:cf:2\ncell:K103:l:1:f:8:cf:2\ncell:L103:l:1:f:8:cf:2\ncell:M103:l:1:f:8:cf:2\ncell:N103:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:A104:l:1:f:8:cf:2\ncell:B104:l:1:f:8:cf:2\ncell:C104:l:1:f:8:cf:2\ncell:D104:l:1:f:8:cf:2\ncell:E104:l:1:f:8:cf:2\ncell:F104:l:1:f:8:cf:2\ncell:G104:l:1:f:8:cf:2\ncell:H104:l:1:f:8:cf:2\ncell:I104:l:1:f:8:cf:2\ncell:J104:l:1:f:8:cf:2\ncell:K104:l:1:f:8:cf:2\ncell:L104:l:1:f:8:cf:2\ncell:M104:l:1:f:8:cf:2\ncell:N104:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:A105:l:1:f:8:cf:2\ncell:B105:l:1:f:8:cf:2\ncell:C105:l:1:f:8:cf:2\ncell:D105:l:1:f:8:cf:2\ncell:E105:l:1:f:8:cf:2\ncell:F105:l:1:f:8:cf:2\ncell:G105:l:1:f:8:cf:2\ncell:H105:l:1:f:8:cf:2\ncell:I105:l:1:f:8:cf:2\ncell:J105:l:1:f:8:cf:2\ncell:K105:l:1:f:8:cf:2\ncell:L105:l:1:f:8:cf:2\ncell:M105:l:1:f:8:cf:2\ncell:N105:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:A106:l:1:f:8:cf:2\ncell:B106:l:1:f:8:cf:2\ncell:C106:l:1:f:8:cf:2\ncell:D106:l:1:f:8:cf:2\ncell:E106:l:1:f:8:cf:2\ncell:F106:l:1:f:8:cf:2\ncell:G106:l:1:f:8:cf:2\ncell:H106:l:1:f:8:cf:2\ncell:I106:l:1:f:8:cf:2\ncell:J106:l:1:f:8:cf:2\ncell:K106:l:1:f:8:cf:2\ncell:L106:l:1:f:8:cf:2\ncell:M106:l:1:f:8:cf:2\ncell:N106:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:A107:l:1:f:8:cf:2\ncell:B107:l:1:f:8:cf:2\ncell:C107:l:1:f:8:cf:2\ncell:D107:l:1:f:8:cf:2\ncell:E107:l:1:f:8:cf:2\ncell:F107:l:1:f:8:cf:2\ncell:G107:l:1:f:8:cf:2\ncell:H107:l:1:f:8:cf:2\ncell:I107:l:1:f:8:cf:2\ncell:J107:l:1:f:8:cf:2\ncell:K107:l:1:f:8:cf:2\ncell:L107:l:1:f:8:cf:2\ncell:M107:l:1:f:8:cf:2\ncell:N107:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:A108:l:1:f:8:cf:2\ncell:B108:l:1:f:8:cf:2\ncell:C108:l:1:f:8:cf:2\ncell:D108:l:1:f:8:cf:2\ncell:E108:l:1:f:8:cf:2\ncell:F108:l:1:f:8:cf:2\ncell:G108:l:1:f:8:cf:2\ncell:H108:l:1:f:8:cf:2\ncell:I108:l:1:f:8:cf:2\ncell:J108:l:1:f:8:cf:2\ncell:K108:l:1:f:8:cf:2\ncell:L108:l:1:f:8:cf:2\ncell:M108:l:1:f:8:cf:2\ncell:N108:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:A109:l:1:f:8:cf:2\ncell:B109:l:1:f:8:cf:2\ncell:C109:l:1:f:8:cf:2\ncell:D109:l:1:f:8:cf:2\ncell:E109:l:1:f:8:cf:2\ncell:F109:l:1:f:8:cf:2\ncell:G109:l:1:f:8:cf:2\ncell:H109:l:1:f:8:cf:2\ncell:I109:l:1:f:8:cf:2\ncell:J109:l:1:f:8:cf:2\ncell:K109:l:1:f:8:cf:2\ncell:L109:l:1:f:8:cf:2\ncell:M109:l:1:f:8:cf:2\ncell:N109:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nsheet:c:27:r:109:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 20pt Arial\nfont:4:normal bold 9pt Arial\nfont:5:normal normal * Arial\nfont:6:normal normal * arial,helvetica,sans-serif\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 7pt Arial\nfont:9:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nname:COMPARISON::S35\\cU49\nname:TRACKING::AC35\\cAE49\n', - }, - name: "sheet10", - hidden: "0", - }, - sheet6: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:7:cf:2:ntvf:3\ncell:B1:l:1:f:7:cf:2\ncell:C1:l:1:f:7:cf:2\ncell:D1:l:1:f:7:cf:2\ncell:E1:l:1:f:7:cf:2\ncell:F1:l:1:f:7:cf:2\ncell:G1:l:1:f:7:cf:2\ncell:H1:l:1:f:7:cf:2\ncell:I1:l:1:f:7:cf:2\ncell:J1:l:1:f:7:cf:2\ncell:K1:l:1:f:7:cf:2\ncell:L1:l:1:f:7:cf:2\ncell:M1:l:1:f:7:cf:2\ncell:N1:l:1:f:7:cf:2\ncell:O1:l:1:f:7:cf:2\ncell:P1:l:1:f:7:cf:2\ncell:Q1:l:1:f:7:cf:2\ncell:R1:l:1:f:7:cf:2\ncell:S1:l:1:f:7:cf:2\ncell:T1:l:1:f:7:cf:2\ncell:U1:l:1:f:7:cf:2\ncell:V1:l:1:f:7:cf:2\ncell:W1:l:1:f:7:cf:2\ncell:A2:l:1:f:7:cf:2\ncell:B2:l:1:f:7:cf:2\ncell:C2:l:1:f:7:cf:2\ncell:D2:t:Expenses:l:2:f:4:cf:2\ncell:E2:l:1:f:7:cf:2\ncell:F2:l:1:f:7:cf:2\ncell:G2:l:1:f:7:cf:2\ncell:H2:l:1:f:7:cf:2\ncell:I2:l:1:f:7:cf:2\ncell:J2:l:1:f:7:cf:2\ncell:K2:l:1:f:7:cf:2\ncell:L2:l:1:f:7:cf:2\ncell:M2:l:1:f:7:cf:2\ncell:N2:l:1:f:7:cf:2\ncell:O2:l:1:f:7:cf:2\ncell:P2:l:1:f:7:cf:2\ncell:Q2:l:1:f:7:cf:2\ncell:R2:l:1:f:7:cf:2\ncell:S2:l:1:f:7:cf:2\ncell:T2:l:1:f:7:cf:2\ncell:U2:l:1:f:7:cf:2\ncell:V2:l:1:f:7:cf:2\ncell:W2:l:1:f:7:cf:2\ncell:A3:l:1:f:7:cf:2\ncell:B3:l:1:f:7:cf:2\ncell:C3:l:1:f:7:cf:2\ncell:D3:l:1:f:7:cf:2\ncell:G3:l:1:f:7:cf:2\ncell:H3:l:1:f:7:cf:2\ncell:I3:l:1:f:7:cf:2\ncell:J3:l:1:f:7:cf:2\ncell:K3:l:1:f:7:cf:2\ncell:L3:l:1:f:7:cf:2\ncell:M3:l:1:f:7:cf:2\ncell:N3:l:1:f:7:cf:2\ncell:O3:l:1:f:7:cf:2\ncell:P3:l:1:f:7:cf:2\ncell:Q3:t: :l:1:f:7:cf:2\ncell:R3:l:1:f:7:cf:2\ncell:S3:l:1:f:7:cf:2\ncell:T3:l:1:f:7:cf:2\ncell:U3:l:1:f:7:cf:2\ncell:V3:l:1:f:7:cf:2\ncell:W3:l:1:f:7:cf:2\ncell:B4:t:Credit Card Expense:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C4:l:3:f:2:c:3:bg:1:cf:2\ncell:D4:l:3:f:2:c:3:bg:1:cf:1\ncell:E4:vtf:n:209:SUM(E5\\cE11):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F4:vtf:n:2508:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O4:l:1:f:7:cf:2\ncell:P4:l:1:f:7:cf:2\ncell:Q4:l:1:f:7:cf:2\ncell:R4:l:1:f:7:cf:2\ncell:S4:l:1:f:7:cf:2\ncell:T4:l:1:f:7:cf:2\ncell:U4:l:1:f:7:cf:2\ncell:V4:l:1:f:7:cf:2\ncell:W4:l:1:f:7:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:7:cf:2\ncell:C5:l:3:f:7:cf:2\ncell:D5:t:Card 1:l:3:f:6:cf:2\ncell:E5:v:209:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F5:vtf:n:2508:IF( (E5*12)=0,"",(E5*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:7:cf:2\ncell:P5:l:1:f:7:cf:2\ncell:Q5:l:1:f:7:cf:2\ncell:R5:l:1:f:7:cf:2\ncell:S5:l:1:f:7:cf:2\ncell:T5:l:1:f:7:cf:2\ncell:U5:l:1:f:7:cf:2\ncell:V5:l:1:f:7:cf:2\ncell:W5:l:1:f:7:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:7:bg:2:cf:2\ncell:C6:l:3:f:7:bg:2:cf:2\ncell:D6:t:Card 2:l:3:f:6:bg:2:cf:2\ncell:E6:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F6:vtf:t::IF( (E6*12)=0,"",(E6*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:7:cf:2\ncell:P6:l:1:f:7:cf:2\ncell:Q6:l:1:f:7:cf:2\ncell:R6:l:1:f:7:cf:2\ncell:S6:l:1:f:7:cf:2\ncell:T6:l:1:f:7:cf:2\ncell:U6:l:1:f:7:cf:2\ncell:V6:l:1:f:7:cf:2\ncell:W6:l:1:f:7:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:7:cf:2\ncell:C7:l:3:f:7:cf:2\ncell:D7:t:Card 3:l:3:f:6:cf:2\ncell:E7:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:7:cf:2\ncell:P7:l:1:f:7:cf:2\ncell:Q7:l:1:f:7:cf:2\ncell:R7:l:1:f:7:cf:2\ncell:S7:l:1:f:7:cf:2\ncell:T7:l:1:f:7:cf:2\ncell:U7:l:1:f:7:cf:2\ncell:V7:l:1:f:7:cf:2\ncell:W7:l:1:f:7:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:bg:2:cf:2\ncell:C8:l:3:f:7:bg:2:cf:2\ncell:D8:t:Card 4:l:3:f:6:bg:2:cf:2\ncell:E8:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:7:cf:2\ncell:P8:l:1:f:7:cf:2\ncell:Q8:l:1:f:7:cf:2\ncell:R8:l:1:f:7:cf:2\ncell:S8:l:1:f:7:cf:2\ncell:T8:l:1:f:7:cf:2\ncell:U8:l:1:f:7:cf:2\ncell:V8:l:1:f:7:cf:2\ncell:W8:l:1:f:7:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:7:cf:2\ncell:C9:l:3:f:7:cf:2\ncell:D9:t:Department Store Card:l:3:f:6:cf:2\ncell:E9:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F9:vtf:t::IF( (E9*12)=0,"",(E9*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:7:cf:2\ncell:P9:l:1:f:7:cf:2\ncell:Q9:l:1:f:7:cf:2\ncell:R9:l:1:f:7:cf:2\ncell:S9:l:1:f:7:cf:2\ncell:T9:l:1:f:7:cf:2\ncell:U9:l:1:f:7:cf:2\ncell:V9:l:1:f:7:cf:2\ncell:W9:l:1:f:7:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:7:bg:2:cf:2\ncell:C10:l:3:f:7:bg:2:cf:2\ncell:D10:t:Gas Card:l:3:f:6:bg:2:cf:2\ncell:E10:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:7:cf:2\ncell:P10:l:1:f:7:cf:2\ncell:Q10:l:1:f:7:cf:2\ncell:R10:l:1:f:7:cf:2\ncell:S10:l:1:f:7:cf:2\ncell:T10:l:1:f:7:cf:2\ncell:U10:l:1:f:7:cf:2\ncell:V10:l:1:f:7:cf:2\ncell:W10:l:1:f:7:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:7:cf:2\ncell:C11:l:3:f:7:cf:2\ncell:D11:t:Other:l:3:f:6:cf:2\ncell:E11:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:7:cf:2\ncell:P11:l:1:f:7:cf:2\ncell:Q11:l:1:f:7:cf:2\ncell:R11:l:1:f:7:cf:2\ncell:S11:l:1:f:7:cf:2\ncell:T11:l:1:f:7:cf:2\ncell:U11:l:1:f:7:cf:2\ncell:V11:l:1:f:7:cf:2\ncell:W11:l:1:f:7:cf:2\ncell:B12:t:Buisness:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C12:l:3:f:7:bg:2:cf:2\ncell:D12:l:3:f:6:bg:2:cf:2\ncell:E12:vtf:n:780:SUM(E13\\cE17):b:2:2:2:2:l:4:f:6:c:3:bg:1:cf:3:ntvf:1\ncell:F12:vtf:n:9360:IF( (E12*12)=0,"",(E12*12)):b:2:2:2:2:l:4:f:6:c:3:bg:1:cf:3:ntvf:1\ncell:O12:l:1:f:7:cf:2\ncell:P12:l:1:f:7:cf:2\ncell:Q12:l:1:f:7:cf:2\ncell:R12:l:1:f:7:cf:2\ncell:S12:l:1:f:7:cf:2\ncell:T12:l:1:f:7:cf:2\ncell:U12:l:1:f:7:cf:2\ncell:V12:l:1:f:7:cf:2\ncell:W12:l:1:f:7:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:7:cf:2\ncell:C13:l:3:f:7:cf:2\ncell:D13:t:Deductible Expenses:l:3:f:6:cf:2\ncell:E13:v:780:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F13:vtf:n:9360:IF( (E13*12)=0,"",(E13*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:7:cf:2\ncell:P13:l:1:f:7:cf:2\ncell:Q13:l:1:f:7:cf:2\ncell:R13:l:1:f:7:cf:2\ncell:S13:l:1:f:7:cf:2\ncell:T13:l:1:f:7:cf:2\ncell:U13:l:1:f:7:cf:2\ncell:V13:l:1:f:7:cf:2\ncell:W13:l:1:f:7:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:bg:2:cf:2\ncell:C14:l:3:f:7:bg:2:cf:2\ncell:D14:t:Non- Deductible Expenses:l:3:f:6:bg:2:cf:2\ncell:E14:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F14:vtf:t::IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:7:cf:2\ncell:P14:l:1:f:7:cf:2\ncell:Q14:l:1:f:7:cf:2\ncell:R14:l:1:f:7:cf:2\ncell:S14:l:1:f:7:cf:2\ncell:T14:l:1:f:7:cf:2\ncell:U14:l:1:f:7:cf:2\ncell:V14:l:1:f:7:cf:2\ncell:W14:l:1:f:7:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:7:cf:2\ncell:C15:l:3:f:7:cf:2\ncell:D15:t:Others:l:3:f:6:cf:2\ncell:E15:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F15:vtf:t::IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:7:cf:2\ncell:P15:l:1:f:7:cf:2\ncell:Q15:l:1:f:7:cf:2\ncell:R15:l:1:f:7:cf:2\ncell:S15:l:1:f:7:cf:2\ncell:T15:l:1:f:7:cf:2\ncell:U15:l:1:f:7:cf:2\ncell:V15:l:1:f:7:cf:2\ncell:W15:l:1:f:7:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:7:bg:2:cf:2\ncell:C16:l:3:f:7:bg:2:cf:2\ncell:D16:t:Others:l:3:f:6:bg:2:cf:2\ncell:E16:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:7:cf:2\ncell:P16:l:1:f:7:cf:2\ncell:Q16:l:1:f:7:cf:2\ncell:R16:l:1:f:7:cf:2\ncell:S16:l:1:f:7:cf:2\ncell:T16:l:1:f:7:cf:2\ncell:U16:l:1:f:7:cf:2\ncell:V16:l:1:f:7:cf:2\ncell:W16:l:1:f:7:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:7:cf:2\ncell:C17:l:3:f:7:cf:2\ncell:D17:t:Others:l:3:f:6:cf:2\ncell:E17:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:7:cf:2\ncell:P17:l:1:f:7:cf:2\ncell:Q17:l:1:f:7:cf:2\ncell:R17:l:1:f:7:cf:2\ncell:S17:l:1:f:7:cf:2\ncell:T17:l:1:f:7:cf:2\ncell:U17:l:1:f:7:cf:2\ncell:V17:l:1:f:7:cf:2\ncell:W17:l:1:f:7:cf:2\ncell:B18:t:Vacations/Expenses:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C18:l:3:f:2:c:3:bg:1:cf:2\ncell:D18:l:3:f:2:c:3:bg:1:cf:1\ncell:E18:vtf:n:98:SUM(E19\\cE24):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F18:vtf:n:1176:IF( (E18*12)=0,"",(E18*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O18:l:1:f:7:cf:2\ncell:P18:l:1:f:7:cf:2\ncell:Q18:l:1:f:7:cf:2\ncell:R18:l:1:f:7:cf:2\ncell:S18:l:1:f:7:cf:2\ncell:T18:l:1:f:7:cf:2\ncell:U18:l:1:f:7:cf:2\ncell:V18:l:1:f:7:cf:2\ncell:W18:l:1:f:7:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:7:cf:2\ncell:C19:l:3:f:7:cf:2\ncell:D19:t:Airfare:l:3:f:6:cf:2\ncell:E19:v:98:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F19:vtf:n:1176:IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:7:cf:2\ncell:P19:l:1:f:7:cf:2\ncell:Q19:l:1:f:7:cf:2\ncell:R19:l:1:f:7:cf:2\ncell:S19:l:1:f:7:cf:2\ncell:T19:l:1:f:7:cf:2\ncell:U19:l:1:f:7:cf:2\ncell:V19:l:1:f:7:cf:2\ncell:W19:l:1:f:7:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:7:bg:2:cf:2\ncell:C20:l:3:f:7:bg:2:cf:2\ncell:D20:t:Accomodation:l:3:f:6:bg:2:cf:2\ncell:E20:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:7:cf:2\ncell:P20:l:1:f:7:cf:2\ncell:Q20:l:1:f:7:cf:2\ncell:R20:l:1:f:7:cf:2\ncell:S20:l:1:f:7:cf:2\ncell:T20:l:1:f:7:cf:2\ncell:U20:l:1:f:7:cf:2\ncell:V20:l:1:f:7:cf:2\ncell:W20:l:1:f:7:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:cf:2\ncell:C21:l:3:f:7:cf:2\ncell:D21:t:Food:l:3:f:6:cf:2\ncell:E21:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:7:cf:2\ncell:P21:l:1:f:7:cf:2\ncell:Q21:l:1:f:7:cf:2\ncell:R21:l:1:f:7:cf:2\ncell:S21:l:1:f:7:cf:2\ncell:T21:l:1:f:7:cf:2\ncell:U21:l:1:f:7:cf:2\ncell:V21:l:1:f:7:cf:2\ncell:W21:l:1:f:7:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:7:bg:2:cf:2\ncell:C22:l:3:f:7:bg:2:cf:2\ncell:D22:t:Pet Boarding:l:3:f:6:bg:2:cf:2\ncell:E22:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G22:b::::1\ncell:O22:l:1:f:7:cf:2\ncell:P22:l:1:f:7:cf:2\ncell:Q22:l:1:f:7:cf:2\ncell:R22:l:1:f:7:cf:2\ncell:S22:l:1:f:7:cf:2\ncell:T22:l:1:f:7:cf:2\ncell:U22:l:1:f:7:cf:2\ncell:V22:l:1:f:7:cf:2\ncell:W22:l:1:f:7:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:7:cf:2\ncell:C23:l:3:f:7:cf:2\ncell:D23:t:Rental Car:l:3:f:6:cf:2\ncell:E23:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:7:cf:2\ncell:P23:l:1:f:7:cf:2\ncell:Q23:l:1:f:7:cf:2\ncell:R23:l:1:f:7:cf:2\ncell:S23:l:1:f:7:cf:2\ncell:T23:l:1:f:7:cf:2\ncell:U23:l:1:f:7:cf:2\ncell:V23:l:1:f:7:cf:2\ncell:W23:l:1:f:7:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:7:bg:2:cf:2\ncell:C24:l:3:f:7:bg:2:cf:2\ncell:D24:t:Souvenier:l:3:f:6:bg:2:cf:2\ncell:E24:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:7:cf:2\ncell:P24:l:1:f:7:cf:2\ncell:Q24:l:1:f:7:cf:2\ncell:R24:l:1:f:7:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:7:cf:2\ncell:C25:l:3:f:7:cf:2\ncell:D25:t:Others:l:3:f:6:cf:2\ncell:E25:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F25:vtf:t::IF( (E25*12)=0,"",(E25*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G25:b::::1\ncell:O25:l:1:f:7:cf:2\ncell:P25:l:1:f:7:cf:2\ncell:Q25:l:1:f:7:cf:2\ncell:R25:l:1:f:7:cf:2\ncell:B26:t:Miscellaneous:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C26:l:3:f:2:c:3:bg:1:cf:2\ncell:D26:l:3:f:2:c:3:bg:1:cf:1\ncell:E26:vtf:n:222:SUM(E27\\cE29):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F26:vtf:n:2664:IF( (E26*12)=0,"",(E26*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O26:l:1:f:7:cf:2\ncell:P26:l:1:f:7:cf:2\ncell:Q26:l:1:f:7:cf:2\ncell:R26:l:1:f:7:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:7:cf:2\ncell:C27:l:3:f:7:cf:2\ncell:D27:t:Tobacco Consumption:l:3:f:6:cf:2\ncell:E27:v:136:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F27:vtf:n:1632:IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:7:cf:2\ncell:P27:l:1:f:7:cf:2\ncell:Q27:l:1:f:7:cf:2\ncell:R27:l:1:f:7:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:7:bg:2:cf:2\ncell:C28:l:3:f:7:bg:2:cf:2\ncell:D28:t:Others:l:3:f:6:bg:2:cf:2\ncell:E28:v:86:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F28:vtf:n:1032:IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:7:cf:2\ncell:P28:l:1:f:7:cf:2\ncell:Q28:l:1:f:7:cf:2\ncell:R28:l:1:f:7:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:7:cf:2\ncell:C29:l:3:f:7:cf:2\ncell:D29:t:Others:l:3:f:6:cf:2\ncell:E29:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:7:cf:2\ncell:P29:l:1:f:7:cf:2\ncell:Q29:l:1:f:7:cf:2\ncell:R29:l:1:f:7:cf:2\ncell:B30:t:Total Expenses:l:5:f:3:c:3:bg:1:cf:1:colspan:3\ncell:C30:c:3:bg:1\ncell:D30:c:3:bg:1\ncell:E30:vtf:n:4853:sheet10!E25 +sheet10!E22 +sheet10!E18 +sheet10!E13 +sheet10!E4 +sheet9!E26 +sheet9!E17 +sheet9!E12 +sheet9!E4 + expense!E7+sheet11!E26 +sheet11!E18+ sheet11!E12 +sheet11!E4:b:2:2:2:2:c:3:bg:1:ntvf:2\ncell:F30:vtf:n:58236:IF((E30*12)=0,"",(E30*12)):b:2:2:2:2:c:3:bg:1:ntvf:2\ncell:O30:l:1:f:7:cf:2\ncell:P30:l:1:f:7:cf:2\ncell:Q30:l:1:f:7:cf:2\ncell:R30:l:1:f:7:cf:2\ncell:O31:l:1:f:7:cf:2\ncell:P31:l:1:f:7:cf:2\ncell:Q31:l:1:f:7:cf:2\ncell:R31:l:1:f:7:cf:2\ncell:O32:l:1:f:7:cf:2\ncell:P32:l:1:f:7:cf:2\ncell:Q32:l:1:f:7:cf:2\ncell:R32:l:1:f:7:cf:2\ncell:O33:l:1:f:7:cf:2\ncell:P33:l:1:f:7:cf:2\ncell:Q33:l:1:f:7:cf:2\ncell:R33:l:1:f:7:cf:2\ncell:O34:l:1:f:7:cf:2\ncell:P34:l:1:f:7:cf:2\ncell:Q34:l:1:f:7:cf:2\ncell:R34:l:1:f:7:cf:2\ncell:O35:l:1:f:7:cf:2\ncell:P35:l:1:f:7:cf:2\ncell:Q35:l:1:f:7:cf:2\ncell:R35:l:1:f:7:cf:2\ncell:O36:l:1:f:7:cf:2\ncell:P36:l:1:f:7:cf:2\ncell:Q36:l:1:f:7:cf:2\ncell:R36:l:1:f:7:cf:2\ncell:O37:l:1:f:7:cf:2\ncell:P37:l:1:f:7:cf:2\ncell:Q37:l:1:f:7:cf:2\ncell:R37:l:1:f:7:cf:2\ncell:O38:l:1:f:7:cf:2\ncell:P38:l:1:f:7:cf:2\ncell:Q38:l:1:f:7:cf:2\ncell:R38:l:1:f:7:cf:2\ncell:B39:l:1:f:7:cf:2\ncell:C39:l:1:f:7:cf:2\ncell:D39:l:1:f:2:cf:2\ncell:E39:l:1:f:2:cf:3:ntvf:1\ncell:F39:l:1:f:2:cf:3:ntvf:1\ncell:O39:l:1:f:7:cf:2\ncell:P39:l:1:f:7:cf:2\ncell:Q39:l:1:f:7:cf:2\ncell:R39:l:1:f:7:cf:2\ncell:B40:l:1:f:5:cf:2\ncell:C40:l:1:f:5:cf:2\ncell:D40:l:1:f:9:cf:2\ncell:E40:l:1:f:9:cf:2\ncell:F40:l:1:f:7:cf:2\ncell:O40:l:1:f:7:cf:2\ncell:P40:l:1:f:7:cf:2\ncell:Q40:l:1:f:7:cf:2\ncell:R40:l:1:f:7:cf:2\ncell:O41:l:1:f:7:cf:2\ncell:P41:l:1:f:7:cf:2\ncell:Q41:l:1:f:7:cf:2\ncell:R41:l:1:f:7:cf:2\ncell:O42:l:1:f:7:cf:2\ncell:P42:l:1:f:7:cf:2\ncell:Q42:l:1:f:7:cf:2\ncell:R42:l:1:f:7:cf:2\ncell:O43:l:1:f:7:cf:2\ncell:P43:l:1:f:7:cf:2\ncell:Q43:l:1:f:7:cf:2\ncell:R43:l:1:f:7:cf:2\ncell:O44:l:1:f:7:cf:2\ncell:P44:l:1:f:7:cf:2\ncell:Q44:l:1:f:7:cf:2\ncell:R44:l:1:f:7:cf:2\ncell:O45:l:1:f:7:cf:2\ncell:P45:l:1:f:7:cf:2\ncell:Q45:l:1:f:7:cf:2\ncell:R45:l:1:f:7:cf:2\ncell:O46:l:1:f:7:cf:2\ncell:P46:l:1:f:7:cf:2\ncell:Q46:l:1:f:7:cf:2\ncell:R46:l:1:f:7:cf:2\ncell:O47:l:1:f:7:cf:2\ncell:P47:l:1:f:7:cf:2\ncell:Q47:l:1:f:7:cf:2\ncell:R47:l:1:f:7:cf:2\ncell:O48:l:1:f:7:cf:2\ncell:P48:l:1:f:7:cf:2\ncell:Q48:l:1:f:7:cf:2\ncell:R48:l:1:f:7:cf:2\ncell:O49:l:1:f:7:cf:2\ncell:P49:l:1:f:7:cf:2\ncell:Q49:l:1:f:7:cf:2\ncell:R49:l:1:f:7:cf:2\ncell:O50:l:1:f:7:cf:2\ncell:P50:l:1:f:7:cf:2\ncell:Q50:l:1:f:7:cf:2\ncell:R50:l:1:f:7:cf:2\ncell:S50:l:1:f:7:cf:2\ncell:T50:l:1:f:7:cf:2\ncell:U50:l:1:f:7:cf:2\ncell:V50:l:1:f:7:cf:2\ncell:W50:l:1:f:7:cf:2\ncell:O51:l:1:f:7:cf:2\ncell:P51:l:1:f:7:cf:2\ncell:Q51:l:1:f:7:cf:2\ncell:R51:l:1:f:7:cf:2\ncell:S51:l:1:f:7:cf:2\ncell:T51:l:1:f:7:cf:2\ncell:U51:l:1:f:7:cf:2\ncell:V51:l:1:f:7:cf:2\ncell:W51:l:1:f:7:cf:2\ncell:O52:l:1:f:7:cf:2\ncell:P52:l:1:f:7:cf:2\ncell:Q52:l:1:f:7:cf:2\ncell:R52:l:1:f:7:cf:2\ncell:S52:l:1:f:7:cf:2\ncell:T52:l:1:f:7:cf:2\ncell:U52:l:1:f:7:cf:2\ncell:V52:l:1:f:7:cf:2\ncell:W52:l:1:f:7:cf:2\ncell:O53:l:1:f:7:cf:2\ncell:P53:l:1:f:7:cf:2\ncell:Q53:l:1:f:7:cf:2\ncell:R53:l:1:f:7:cf:2\ncell:S53:l:1:f:7:cf:2\ncell:T53:l:1:f:7:cf:2\ncell:U53:l:1:f:7:cf:2\ncell:V53:l:1:f:7:cf:2\ncell:W53:l:1:f:7:cf:2\ncell:O54:l:1:f:7:cf:2\ncell:P54:l:1:f:7:cf:2\ncell:Q54:l:1:f:7:cf:2\ncell:R54:l:1:f:7:cf:2\ncell:S54:l:1:f:7:cf:2\ncell:T54:l:1:f:7:cf:2\ncell:U54:l:1:f:7:cf:2\ncell:V54:l:1:f:7:cf:2\ncell:W54:l:1:f:7:cf:2\ncell:O55:l:1:f:7:cf:2\ncell:P55:l:1:f:7:cf:2\ncell:Q55:l:1:f:7:cf:2\ncell:R55:l:1:f:7:cf:2\ncell:S55:l:1:f:7:cf:2\ncell:T55:l:1:f:7:cf:2\ncell:U55:l:1:f:7:cf:2\ncell:V55:l:1:f:7:cf:2\ncell:W55:l:1:f:7:cf:2\ncell:O56:l:1:f:7:cf:2\ncell:P56:l:1:f:7:cf:2\ncell:Q56:l:1:f:7:cf:2\ncell:R56:l:1:f:7:cf:2\ncell:S56:l:1:f:7:cf:2\ncell:T56:l:1:f:7:cf:2\ncell:U56:l:1:f:7:cf:2\ncell:V56:l:1:f:7:cf:2\ncell:W56:l:1:f:7:cf:2\ncell:O57:l:1:f:7:cf:2\ncell:P57:l:1:f:7:cf:2\ncell:Q57:l:1:f:7:cf:2\ncell:R57:l:1:f:7:cf:2\ncell:S57:l:1:f:7:cf:2\ncell:T57:l:1:f:7:cf:2\ncell:U57:l:1:f:7:cf:2\ncell:V57:l:1:f:7:cf:2\ncell:W57:l:1:f:7:cf:2\ncell:O58:l:1:f:7:cf:2\ncell:P58:l:1:f:7:cf:2\ncell:Q58:l:1:f:7:cf:2\ncell:R58:l:1:f:7:cf:2\ncell:S58:l:1:f:7:cf:2\ncell:T58:l:1:f:7:cf:2\ncell:U58:l:1:f:7:cf:2\ncell:V58:l:1:f:7:cf:2\ncell:W58:l:1:f:7:cf:2\ncell:O59:l:1:f:7:cf:2\ncell:P59:l:1:f:7:cf:2\ncell:Q59:l:1:f:7:cf:2\ncell:R59:l:1:f:7:cf:2\ncell:S59:l:1:f:7:cf:2\ncell:T59:l:1:f:7:cf:2\ncell:U59:l:1:f:7:cf:2\ncell:V59:l:1:f:7:cf:2\ncell:W59:l:1:f:7:cf:2\ncell:O60:l:1:f:7:cf:2\ncell:P60:l:1:f:7:cf:2\ncell:Q60:l:1:f:7:cf:2\ncell:R60:l:1:f:7:cf:2\ncell:S60:l:1:f:7:cf:2\ncell:T60:l:1:f:7:cf:2\ncell:U60:l:1:f:7:cf:2\ncell:V60:l:1:f:7:cf:2\ncell:W60:l:1:f:7:cf:2\ncell:O61:l:1:f:7:cf:2\ncell:P61:l:1:f:7:cf:2\ncell:Q61:l:1:f:7:cf:2\ncell:R61:l:1:f:7:cf:2\ncell:S61:l:1:f:7:cf:2\ncell:T61:l:1:f:7:cf:2\ncell:U61:l:1:f:7:cf:2\ncell:V61:l:1:f:7:cf:2\ncell:W61:l:1:f:7:cf:2\ncell:O62:l:1:f:7:cf:2\ncell:P62:l:1:f:7:cf:2\ncell:Q62:l:1:f:7:cf:2\ncell:R62:l:1:f:7:cf:2\ncell:S62:l:1:f:7:cf:2\ncell:T62:l:1:f:7:cf:2\ncell:U62:l:1:f:7:cf:2\ncell:V62:l:1:f:7:cf:2\ncell:W62:l:1:f:7:cf:2\ncell:O63:l:1:f:7:cf:2\ncell:P63:l:1:f:7:cf:2\ncell:Q63:l:1:f:7:cf:2\ncell:R63:l:1:f:7:cf:2\ncell:S63:l:1:f:7:cf:2\ncell:T63:l:1:f:7:cf:2\ncell:U63:l:1:f:7:cf:2\ncell:V63:l:1:f:7:cf:2\ncell:W63:l:1:f:7:cf:2\ncell:O64:l:1:f:7:cf:2\ncell:P64:l:1:f:7:cf:2\ncell:Q64:l:1:f:7:cf:2\ncell:R64:l:1:f:7:cf:2\ncell:S64:l:1:f:7:cf:2\ncell:T64:l:1:f:7:cf:2\ncell:U64:l:1:f:7:cf:2\ncell:V64:l:1:f:7:cf:2\ncell:W64:l:1:f:7:cf:2\ncell:O65:l:1:f:7:cf:2\ncell:P65:l:1:f:7:cf:2\ncell:Q65:l:1:f:7:cf:2\ncell:R65:l:1:f:7:cf:2\ncell:S65:l:1:f:7:cf:2\ncell:T65:l:1:f:7:cf:2\ncell:U65:l:1:f:7:cf:2\ncell:V65:l:1:f:7:cf:2\ncell:W65:l:1:f:7:cf:2\ncell:O66:l:1:f:7:cf:2\ncell:P66:l:1:f:7:cf:2\ncell:Q66:l:1:f:7:cf:2\ncell:R66:l:1:f:7:cf:2\ncell:S66:l:1:f:7:cf:2\ncell:T66:l:1:f:7:cf:2\ncell:U66:l:1:f:7:cf:2\ncell:V66:l:1:f:7:cf:2\ncell:W66:l:1:f:7:cf:2\ncell:O67:l:1:f:7:cf:2\ncell:P67:l:1:f:7:cf:2\ncell:Q67:l:1:f:7:cf:2\ncell:R67:l:1:f:7:cf:2\ncell:S67:l:1:f:7:cf:2\ncell:T67:l:1:f:7:cf:2\ncell:U67:l:1:f:7:cf:2\ncell:V67:l:1:f:7:cf:2\ncell:W67:l:1:f:7:cf:2\ncell:O68:l:1:f:7:cf:2\ncell:P68:l:1:f:7:cf:2\ncell:Q68:l:1:f:7:cf:2\ncell:R68:l:1:f:7:cf:2\ncell:S68:l:1:f:7:cf:2\ncell:T68:l:1:f:7:cf:2\ncell:U68:l:1:f:7:cf:2\ncell:V68:l:1:f:7:cf:2\ncell:W68:l:1:f:7:cf:2\ncell:O69:l:1:f:7:cf:2\ncell:P69:l:1:f:7:cf:2\ncell:Q69:l:1:f:7:cf:2\ncell:R69:l:1:f:7:cf:2\ncell:S69:l:1:f:7:cf:2\ncell:T69:l:1:f:7:cf:2\ncell:U69:l:1:f:7:cf:2\ncell:V69:l:1:f:7:cf:2\ncell:W69:l:1:f:7:cf:2\ncell:O70:l:1:f:7:cf:2\ncell:P70:l:1:f:7:cf:2\ncell:Q70:l:1:f:7:cf:2\ncell:R70:l:1:f:7:cf:2\ncell:S70:l:1:f:7:cf:2\ncell:T70:l:1:f:7:cf:2\ncell:U70:l:1:f:7:cf:2\ncell:V70:l:1:f:7:cf:2\ncell:W70:l:1:f:7:cf:2\ncell:O71:l:1:f:7:cf:2\ncell:P71:l:1:f:7:cf:2\ncell:Q71:l:1:f:7:cf:2\ncell:R71:l:1:f:7:cf:2\ncell:S71:l:1:f:7:cf:2\ncell:T71:l:1:f:7:cf:2\ncell:U71:l:1:f:7:cf:2\ncell:V71:l:1:f:7:cf:2\ncell:W71:l:1:f:7:cf:2\ncell:O72:l:1:f:7:cf:2\ncell:P72:l:1:f:7:cf:2\ncell:Q72:l:1:f:7:cf:2\ncell:R72:l:1:f:7:cf:2\ncell:S72:l:1:f:7:cf:2\ncell:T72:l:1:f:7:cf:2\ncell:U72:l:1:f:7:cf:2\ncell:V72:l:1:f:7:cf:2\ncell:W72:l:1:f:7:cf:2\ncell:O73:l:1:f:7:cf:2\ncell:P73:l:1:f:7:cf:2\ncell:Q73:l:1:f:7:cf:2\ncell:R73:l:1:f:7:cf:2\ncell:S73:l:1:f:7:cf:2\ncell:T73:l:1:f:7:cf:2\ncell:U73:l:1:f:7:cf:2\ncell:V73:l:1:f:7:cf:2\ncell:W73:l:1:f:7:cf:2\ncell:O74:l:1:f:7:cf:2\ncell:P74:l:1:f:7:cf:2\ncell:Q74:l:1:f:7:cf:2\ncell:R74:l:1:f:7:cf:2\ncell:S74:l:1:f:7:cf:2\ncell:T74:l:1:f:7:cf:2\ncell:U74:l:1:f:7:cf:2\ncell:V74:l:1:f:7:cf:2\ncell:W74:l:1:f:7:cf:2\ncell:O75:l:1:f:7:cf:2\ncell:P75:l:1:f:7:cf:2\ncell:Q75:l:1:f:7:cf:2\ncell:R75:l:1:f:7:cf:2\ncell:S75:l:1:f:7:cf:2\ncell:T75:l:1:f:7:cf:2\ncell:U75:l:1:f:7:cf:2\ncell:V75:l:1:f:7:cf:2\ncell:W75:l:1:f:7:cf:2\ncell:O76:l:1:f:7:cf:2\ncell:P76:l:1:f:7:cf:2\ncell:Q76:l:1:f:7:cf:2\ncell:R76:l:1:f:7:cf:2\ncell:S76:l:1:f:7:cf:2\ncell:T76:l:1:f:7:cf:2\ncell:U76:l:1:f:7:cf:2\ncell:V76:l:1:f:7:cf:2\ncell:W76:l:1:f:7:cf:2\ncell:O77:l:1:f:7:cf:2\ncell:P77:l:1:f:7:cf:2\ncell:Q77:l:1:f:7:cf:2\ncell:R77:l:1:f:7:cf:2\ncell:S77:l:1:f:7:cf:2\ncell:T77:l:1:f:7:cf:2\ncell:U77:l:1:f:7:cf:2\ncell:V77:l:1:f:7:cf:2\ncell:W77:l:1:f:7:cf:2\ncell:O78:l:1:f:7:cf:2\ncell:P78:l:1:f:7:cf:2\ncell:Q78:l:1:f:7:cf:2\ncell:R78:l:1:f:7:cf:2\ncell:S78:l:1:f:7:cf:2\ncell:T78:l:1:f:7:cf:2\ncell:U78:l:1:f:7:cf:2\ncell:V78:l:1:f:7:cf:2\ncell:W78:l:1:f:7:cf:2\ncell:O79:l:1:f:7:cf:2\ncell:P79:l:1:f:7:cf:2\ncell:Q79:l:1:f:7:cf:2\ncell:R79:l:1:f:7:cf:2\ncell:S79:l:1:f:7:cf:2\ncell:T79:l:1:f:7:cf:2\ncell:U79:l:1:f:7:cf:2\ncell:V79:l:1:f:7:cf:2\ncell:W79:l:1:f:7:cf:2\ncell:O80:l:1:f:7:cf:2\ncell:P80:l:1:f:7:cf:2\ncell:Q80:l:1:f:7:cf:2\ncell:R80:l:1:f:7:cf:2\ncell:S80:l:1:f:7:cf:2\ncell:T80:l:1:f:7:cf:2\ncell:U80:l:1:f:7:cf:2\ncell:V80:l:1:f:7:cf:2\ncell:W80:l:1:f:7:cf:2\ncell:O81:l:1:f:7:cf:2\ncell:P81:l:1:f:7:cf:2\ncell:Q81:l:1:f:7:cf:2\ncell:R81:l:1:f:7:cf:2\ncell:S81:l:1:f:7:cf:2\ncell:T81:l:1:f:7:cf:2\ncell:U81:l:1:f:7:cf:2\ncell:V81:l:1:f:7:cf:2\ncell:W81:l:1:f:7:cf:2\ncell:O82:l:1:f:7:cf:2\ncell:P82:l:1:f:7:cf:2\ncell:Q82:l:1:f:7:cf:2\ncell:R82:l:1:f:7:cf:2\ncell:S82:l:1:f:7:cf:2\ncell:T82:l:1:f:7:cf:2\ncell:U82:l:1:f:7:cf:2\ncell:V82:l:1:f:7:cf:2\ncell:W82:l:1:f:7:cf:2\ncell:O83:l:1:f:7:cf:2\ncell:P83:l:1:f:7:cf:2\ncell:Q83:l:1:f:7:cf:2\ncell:R83:l:1:f:7:cf:2\ncell:S83:l:1:f:7:cf:2\ncell:T83:l:1:f:7:cf:2\ncell:U83:l:1:f:7:cf:2\ncell:V83:l:1:f:7:cf:2\ncell:W83:l:1:f:7:cf:2\ncell:O84:l:1:f:7:cf:2\ncell:P84:l:1:f:7:cf:2\ncell:Q84:l:1:f:7:cf:2\ncell:R84:l:1:f:7:cf:2\ncell:S84:l:1:f:7:cf:2\ncell:T84:l:1:f:7:cf:2\ncell:U84:l:1:f:7:cf:2\ncell:V84:l:1:f:7:cf:2\ncell:W84:l:1:f:7:cf:2\ncell:O85:l:1:f:7:cf:2\ncell:P85:l:1:f:7:cf:2\ncell:Q85:l:1:f:7:cf:2\ncell:R85:l:1:f:7:cf:2\ncell:S85:l:1:f:7:cf:2\ncell:T85:l:1:f:7:cf:2\ncell:U85:l:1:f:7:cf:2\ncell:V85:l:1:f:7:cf:2\ncell:W85:l:1:f:7:cf:2\ncell:O86:l:1:f:7:cf:2\ncell:P86:l:1:f:7:cf:2\ncell:Q86:l:1:f:7:cf:2\ncell:R86:l:1:f:7:cf:2\ncell:S86:l:1:f:7:cf:2\ncell:T86:l:1:f:7:cf:2\ncell:U86:l:1:f:7:cf:2\ncell:V86:l:1:f:7:cf:2\ncell:W86:l:1:f:7:cf:2\ncell:O87:l:1:f:7:cf:2\ncell:P87:l:1:f:7:cf:2\ncell:Q87:l:1:f:7:cf:2\ncell:R87:l:1:f:7:cf:2\ncell:S87:l:1:f:7:cf:2\ncell:T87:l:1:f:7:cf:2\ncell:U87:l:1:f:7:cf:2\ncell:V87:l:1:f:7:cf:2\ncell:W87:l:1:f:7:cf:2\ncell:O88:l:1:f:7:cf:2\ncell:P88:l:1:f:7:cf:2\ncell:Q88:l:1:f:7:cf:2\ncell:R88:l:1:f:7:cf:2\ncell:S88:l:1:f:7:cf:2\ncell:T88:l:1:f:7:cf:2\ncell:U88:l:1:f:7:cf:2\ncell:V88:l:1:f:7:cf:2\ncell:W88:l:1:f:7:cf:2\ncell:O89:l:1:f:7:cf:2\ncell:P89:l:1:f:7:cf:2\ncell:Q89:l:1:f:7:cf:2\ncell:R89:l:1:f:7:cf:2\ncell:S89:l:1:f:7:cf:2\ncell:T89:l:1:f:7:cf:2\ncell:U89:l:1:f:7:cf:2\ncell:V89:l:1:f:7:cf:2\ncell:W89:l:1:f:7:cf:2\ncell:O90:l:1:f:7:cf:2\ncell:P90:l:1:f:7:cf:2\ncell:Q90:l:1:f:7:cf:2\ncell:R90:l:1:f:7:cf:2\ncell:S90:l:1:f:7:cf:2\ncell:T90:l:1:f:7:cf:2\ncell:U90:l:1:f:7:cf:2\ncell:V90:l:1:f:7:cf:2\ncell:W90:l:1:f:7:cf:2\ncell:O91:l:1:f:7:cf:2\ncell:P91:l:1:f:7:cf:2\ncell:Q91:l:1:f:7:cf:2\ncell:R91:l:1:f:7:cf:2\ncell:S91:l:1:f:7:cf:2\ncell:T91:l:1:f:7:cf:2\ncell:U91:l:1:f:7:cf:2\ncell:V91:l:1:f:7:cf:2\ncell:W91:l:1:f:7:cf:2\ncell:O92:l:1:f:7:cf:2\ncell:P92:l:1:f:7:cf:2\ncell:Q92:l:1:f:7:cf:2\ncell:R92:l:1:f:7:cf:2\ncell:S92:l:1:f:7:cf:2\ncell:T92:l:1:f:7:cf:2\ncell:U92:l:1:f:7:cf:2\ncell:V92:l:1:f:7:cf:2\ncell:W92:l:1:f:7:cf:2\ncell:O93:l:1:f:7:cf:2\ncell:P93:l:1:f:7:cf:2\ncell:Q93:l:1:f:7:cf:2\ncell:R93:l:1:f:7:cf:2\ncell:S93:l:1:f:7:cf:2\ncell:T93:l:1:f:7:cf:2\ncell:U93:l:1:f:7:cf:2\ncell:V93:l:1:f:7:cf:2\ncell:W93:l:1:f:7:cf:2\ncell:O94:l:1:f:7:cf:2\ncell:P94:l:1:f:7:cf:2\ncell:Q94:l:1:f:7:cf:2\ncell:R94:l:1:f:7:cf:2\ncell:S94:l:1:f:7:cf:2\ncell:T94:l:1:f:7:cf:2\ncell:U94:l:1:f:7:cf:2\ncell:V94:l:1:f:7:cf:2\ncell:W94:l:1:f:7:cf:2\ncell:O95:l:1:f:7:cf:2\ncell:P95:l:1:f:7:cf:2\ncell:Q95:l:1:f:7:cf:2\ncell:R95:l:1:f:7:cf:2\ncell:S95:l:1:f:7:cf:2\ncell:T95:l:1:f:7:cf:2\ncell:U95:l:1:f:7:cf:2\ncell:V95:l:1:f:7:cf:2\ncell:W95:l:1:f:7:cf:2\ncell:O96:l:1:f:7:cf:2\ncell:P96:l:1:f:7:cf:2\ncell:Q96:l:1:f:7:cf:2\ncell:R96:l:1:f:7:cf:2\ncell:S96:l:1:f:7:cf:2\ncell:T96:l:1:f:7:cf:2\ncell:U96:l:1:f:7:cf:2\ncell:V96:l:1:f:7:cf:2\ncell:W96:l:1:f:7:cf:2\ncell:O97:l:1:f:7:cf:2\ncell:P97:l:1:f:7:cf:2\ncell:Q97:l:1:f:7:cf:2\ncell:R97:l:1:f:7:cf:2\ncell:S97:l:1:f:7:cf:2\ncell:T97:l:1:f:7:cf:2\ncell:U97:l:1:f:7:cf:2\ncell:V97:l:1:f:7:cf:2\ncell:W97:l:1:f:7:cf:2\ncell:O98:l:1:f:7:cf:2\ncell:P98:l:1:f:7:cf:2\ncell:Q98:l:1:f:7:cf:2\ncell:R98:l:1:f:7:cf:2\ncell:S98:l:1:f:7:cf:2\ncell:T98:l:1:f:7:cf:2\ncell:U98:l:1:f:7:cf:2\ncell:V98:l:1:f:7:cf:2\ncell:W98:l:1:f:7:cf:2\ncell:O99:l:1:f:7:cf:2\ncell:P99:l:1:f:7:cf:2\ncell:Q99:l:1:f:7:cf:2\ncell:R99:l:1:f:7:cf:2\ncell:S99:l:1:f:7:cf:2\ncell:T99:l:1:f:7:cf:2\ncell:U99:l:1:f:7:cf:2\ncell:V99:l:1:f:7:cf:2\ncell:W99:l:1:f:7:cf:2\ncell:O100:l:1:f:7:cf:2\ncell:P100:l:1:f:7:cf:2\ncell:Q100:l:1:f:7:cf:2\ncell:R100:l:1:f:7:cf:2\ncell:S100:l:1:f:7:cf:2\ncell:T100:l:1:f:7:cf:2\ncell:U100:l:1:f:7:cf:2\ncell:V100:l:1:f:7:cf:2\ncell:W100:l:1:f:7:cf:2\ncell:O101:l:1:f:7:cf:2\ncell:P101:l:1:f:7:cf:2\ncell:Q101:l:1:f:7:cf:2\ncell:R101:l:1:f:7:cf:2\ncell:S101:l:1:f:7:cf:2\ncell:T101:l:1:f:7:cf:2\ncell:U101:l:1:f:7:cf:2\ncell:V101:l:1:f:7:cf:2\ncell:W101:l:1:f:7:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:A106:l:1:f:8:cf:2\ncell:B106:l:1:f:8:cf:2\ncell:C106:l:1:f:8:cf:2\ncell:D106:l:1:f:8:cf:2\ncell:E106:l:1:f:8:cf:2\ncell:F106:t:Monthly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G106:l:1:f:8:cf:2\ncell:H106:l:1:f:8:cf:2\ncell:I106:l:1:f:8:cf:2\ncell:J106:l:1:f:8:cf:2\ncell:K106:l:1:f:8:cf:2\ncell:L106:l:1:f:8:cf:2\ncell:M106:l:1:f:8:cf:2\ncell:N106:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:A107:l:1:f:8:cf:2\ncell:B107:l:1:f:8:cf:2\ncell:C107:l:1:f:8:cf:2\ncell:D107:l:1:f:8:cf:2\ncell:E107:l:1:f:8:cf:2\ncell:F107:t:Semi-Annually:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G107:l:1:f:8:cf:2\ncell:H107:l:1:f:8:cf:2\ncell:I107:l:1:f:8:cf:2\ncell:J107:l:1:f:8:cf:2\ncell:K107:l:1:f:8:cf:2\ncell:L107:l:1:f:8:cf:2\ncell:M107:l:1:f:8:cf:2\ncell:N107:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:A108:l:1:f:8:cf:2\ncell:B108:l:1:f:8:cf:2\ncell:C108:l:1:f:8:cf:2\ncell:D108:l:1:f:8:cf:2\ncell:E108:l:1:f:8:cf:2\ncell:F108:t:Quarterly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G108:l:1:f:8:cf:2\ncell:H108:l:1:f:8:cf:2\ncell:I108:l:1:f:8:cf:2\ncell:J108:l:1:f:8:cf:2\ncell:K108:l:1:f:8:cf:2\ncell:L108:l:1:f:8:cf:2\ncell:M108:l:1:f:8:cf:2\ncell:N108:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:A109:l:1:f:8:cf:2\ncell:B109:l:1:f:8:cf:2\ncell:C109:l:1:f:8:cf:2\ncell:D109:l:1:f:8:cf:2\ncell:E109:l:1:f:8:cf:2\ncell:F109:t:Yearly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G109:l:1:f:8:cf:2\ncell:H109:l:1:f:8:cf:2\ncell:I109:l:1:f:8:cf:2\ncell:J109:l:1:f:8:cf:2\ncell:K109:l:1:f:8:cf:2\ncell:L109:l:1:f:8:cf:2\ncell:M109:l:1:f:8:cf:2\ncell:N109:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncell:A110:l:1:f:8:cf:2\ncell:B110:l:1:f:8:cf:2\ncell:C110:l:1:f:8:cf:2\ncell:D110:l:1:f:8:cf:2\ncell:E110:l:1:f:8:cf:2\ncell:F110:l:1:f:8:cf:2\ncell:G110:l:1:f:8:cf:2\ncell:H110:l:1:f:8:cf:2\ncell:I110:l:1:f:8:cf:2\ncell:J110:l:1:f:8:cf:2\ncell:K110:l:1:f:8:cf:2\ncell:L110:l:1:f:8:cf:2\ncell:M110:l:1:f:8:cf:2\ncell:N110:l:1:f:8:cf:2\ncell:O110:l:1:f:8:cf:2\ncell:P110:l:1:f:8:cf:2\ncell:Q110:l:1:f:8:cf:2\ncell:R110:l:1:f:8:cf:2\ncell:S110:l:1:f:8:cf:2\ncell:T110:l:1:f:8:cf:2\ncell:U110:l:1:f:8:cf:2\ncell:V110:l:1:f:8:cf:2\ncell:W110:l:1:f:8:cf:2\ncell:A111:l:1:f:8:cf:2\ncell:B111:l:1:f:8:cf:2\ncell:C111:l:1:f:8:cf:2\ncell:D111:l:1:f:8:cf:2\ncell:E111:l:1:f:8:cf:2\ncell:F111:l:1:f:8:cf:2\ncell:G111:l:1:f:8:cf:2\ncell:H111:l:1:f:8:cf:2\ncell:I111:l:1:f:8:cf:2\ncell:J111:l:1:f:8:cf:2\ncell:K111:l:1:f:8:cf:2\ncell:L111:l:1:f:8:cf:2\ncell:M111:l:1:f:8:cf:2\ncell:N111:l:1:f:8:cf:2\ncell:O111:l:1:f:8:cf:2\ncell:P111:l:1:f:8:cf:2\ncell:Q111:l:1:f:8:cf:2\ncell:R111:l:1:f:8:cf:2\ncell:S111:l:1:f:8:cf:2\ncell:T111:l:1:f:8:cf:2\ncell:U111:l:1:f:8:cf:2\ncell:V111:l:1:f:8:cf:2\ncell:W111:l:1:f:8:cf:2\ncell:A112:l:1:f:8:cf:2\ncell:B112:l:1:f:8:cf:2\ncell:C112:l:1:f:8:cf:2\ncell:D112:l:1:f:8:cf:2\ncell:E112:l:1:f:8:cf:2\ncell:F112:l:1:f:8:cf:2\ncell:G112:l:1:f:8:cf:2\ncell:H112:l:1:f:8:cf:2\ncell:I112:l:1:f:8:cf:2\ncell:J112:l:1:f:8:cf:2\ncell:K112:l:1:f:8:cf:2\ncell:L112:l:1:f:8:cf:2\ncell:M112:l:1:f:8:cf:2\ncell:N112:l:1:f:8:cf:2\ncell:O112:l:1:f:8:cf:2\ncell:P112:l:1:f:8:cf:2\ncell:Q112:l:1:f:8:cf:2\ncell:R112:l:1:f:8:cf:2\ncell:S112:l:1:f:8:cf:2\ncell:T112:l:1:f:8:cf:2\ncell:U112:l:1:f:8:cf:2\ncell:V112:l:1:f:8:cf:2\ncell:W112:l:1:f:8:cf:2\ncell:A113:l:1:f:8:cf:2\ncell:B113:l:1:f:8:cf:2\ncell:C113:l:1:f:8:cf:2\ncell:D113:l:1:f:8:cf:2\ncell:E113:l:1:f:8:cf:2\ncell:F113:l:1:f:8:cf:2\ncell:G113:l:1:f:8:cf:2\ncell:H113:l:1:f:8:cf:2\ncell:I113:l:1:f:8:cf:2\ncell:J113:l:1:f:8:cf:2\ncell:K113:l:1:f:8:cf:2\ncell:L113:l:1:f:8:cf:2\ncell:M113:l:1:f:8:cf:2\ncell:N113:l:1:f:8:cf:2\ncell:O113:l:1:f:8:cf:2\ncell:P113:l:1:f:8:cf:2\ncell:Q113:l:1:f:8:cf:2\ncell:R113:l:1:f:8:cf:2\ncell:S113:l:1:f:8:cf:2\ncell:T113:l:1:f:8:cf:2\ncell:U113:l:1:f:8:cf:2\ncell:V113:l:1:f:8:cf:2\ncell:W113:l:1:f:8:cf:2\ncell:A114:l:1:f:8:cf:2\ncell:B114:l:1:f:8:cf:2\ncell:C114:l:1:f:8:cf:2\ncell:D114:l:1:f:8:cf:2\ncell:E114:l:1:f:8:cf:2\ncell:F114:l:1:f:8:cf:2\ncell:G114:l:1:f:8:cf:2\ncell:H114:l:1:f:8:cf:2\ncell:I114:l:1:f:8:cf:2\ncell:J114:l:1:f:8:cf:2\ncell:K114:l:1:f:8:cf:2\ncell:L114:l:1:f:8:cf:2\ncell:M114:l:1:f:8:cf:2\ncell:N114:l:1:f:8:cf:2\ncell:O114:l:1:f:8:cf:2\ncell:P114:l:1:f:8:cf:2\ncell:Q114:l:1:f:8:cf:2\ncell:R114:l:1:f:8:cf:2\ncell:S114:l:1:f:8:cf:2\ncell:T114:l:1:f:8:cf:2\ncell:U114:l:1:f:8:cf:2\ncell:V114:l:1:f:8:cf:2\ncell:W114:l:1:f:8:cf:2\ncell:A115:l:1:f:8:cf:2\ncell:B115:l:1:f:8:cf:2\ncell:C115:l:1:f:8:cf:2\ncell:D115:l:1:f:8:cf:2\ncell:E115:l:1:f:8:cf:2\ncell:F115:l:1:f:8:cf:2\ncell:G115:l:1:f:8:cf:2\ncell:H115:l:1:f:8:cf:2\ncell:I115:l:1:f:8:cf:2\ncell:J115:l:1:f:8:cf:2\ncell:K115:l:1:f:8:cf:2\ncell:L115:l:1:f:8:cf:2\ncell:M115:l:1:f:8:cf:2\ncell:N115:l:1:f:8:cf:2\ncell:O115:l:1:f:8:cf:2\ncell:P115:l:1:f:8:cf:2\ncell:Q115:l:1:f:8:cf:2\ncell:R115:l:1:f:8:cf:2\ncell:S115:l:1:f:8:cf:2\ncell:T115:l:1:f:8:cf:2\ncell:U115:l:1:f:8:cf:2\ncell:V115:l:1:f:8:cf:2\ncell:W115:l:1:f:8:cf:2\ncell:A116:l:1:f:8:cf:2\ncell:B116:l:1:f:8:cf:2\ncell:C116:l:1:f:8:cf:2\ncell:D116:l:1:f:8:cf:2\ncell:E116:l:1:f:8:cf:2\ncell:F116:l:1:f:8:cf:2\ncell:G116:l:1:f:8:cf:2\ncell:H116:l:1:f:8:cf:2\ncell:I116:l:1:f:8:cf:2\ncell:J116:l:1:f:8:cf:2\ncell:K116:l:1:f:8:cf:2\ncell:L116:l:1:f:8:cf:2\ncell:M116:l:1:f:8:cf:2\ncell:N116:l:1:f:8:cf:2\ncell:O116:l:1:f:8:cf:2\ncell:P116:l:1:f:8:cf:2\ncell:Q116:l:1:f:8:cf:2\ncell:R116:l:1:f:8:cf:2\ncell:S116:l:1:f:8:cf:2\ncell:T116:l:1:f:8:cf:2\ncell:U116:l:1:f:8:cf:2\ncell:V116:l:1:f:8:cf:2\ncell:W116:l:1:f:8:cf:2\ncell:A117:l:1:f:8:cf:2\ncell:B117:l:1:f:8:cf:2\ncell:C117:l:1:f:8:cf:2\ncell:D117:l:1:f:8:cf:2\ncell:E117:l:1:f:8:cf:2\ncell:F117:l:1:f:8:cf:2\ncell:G117:l:1:f:8:cf:2\ncell:H117:l:1:f:8:cf:2\ncell:I117:l:1:f:8:cf:2\ncell:J117:l:1:f:8:cf:2\ncell:K117:l:1:f:8:cf:2\ncell:L117:l:1:f:8:cf:2\ncell:M117:l:1:f:8:cf:2\ncell:N117:l:1:f:8:cf:2\ncell:O117:l:1:f:8:cf:2\ncell:P117:l:1:f:8:cf:2\ncell:Q117:l:1:f:8:cf:2\ncell:R117:l:1:f:8:cf:2\ncell:S117:l:1:f:8:cf:2\ncell:T117:l:1:f:8:cf:2\ncell:U117:l:1:f:8:cf:2\ncell:V117:l:1:f:8:cf:2\ncell:W117:l:1:f:8:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nsheet:c:27:r:117:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 12pt arial,helvetica,sans-serif\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 9pt Arial\nfont:6:normal normal * Arial\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 7pt Arial\nfont:9:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nlayout:5:padding:* 8px * *;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:#,##0.00;\\b-#,##0.00;\\b-\nvalueformat:3:hidden\nname:COMPARISON::S43\\cU57\nname:TRACKING::AC43\\cAE57\n', - }, - name: "sheet11", - hidden: "0", - }, - sheet7: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:f:3:ntvf:3\ncell:B4:t:Comparison:l:1:f:6:c:1:bg:4:cf:2:colspan:3\ncell:B6:t:How does your spending compare to the guidelines ?:f:5:cf:2:colspan:6\ncell:C9:t:Expense Category:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:D9:t:Guideline:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:E9:t:Recommended Monthly Value:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:F9:t:Actual Monthly Value:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:B10:b::1::\ncell:C10:t:Housing:b::1::1:l:4:f:2\ncell:D10:v:0.35:b::1::1:l:5:f:2:ntvf:2\ncell:E10:vtf:n:1578.85:D10*INCOME!D23:b::1::1:l:5:f:2:ntvf:1\ncell:F10:vtf:n:1380:EXPENSE!E7:b::1::1:l:5:f:2:ntvf:1\ncell:G10:b::::1\ncell:B11:b::1::\ncell:C11:t:Transportation:b::1::1:l:4:f:2:bg:3\ncell:D11:vtc:n%:0.2:20%:b::1::1:l:5:f:2:bg:3:ntvf:2\ncell:E11:vtf:n:902.2:D11*INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:1\ncell:F11:vtf:n:640:sheet9!E17:b::1::1:l:5:f:2:bg:3:ntvf:1\ncell:G11:b::::1\ncell:B12:b::1::\ncell:C12:t:Debt:b::1::1:l:4:f:2\ncell:D12:v:0.05:b::1::1:l:5:f:2:ntvf:2\ncell:E12:vtf:n:225.55:D12*INCOME!D23:b::1::1:l:5:f:2:ntvf:1\ncell:F12:vtf:n:0:sheet11!E22:b::1::1:l:5:f:2:ntvf:1\ncell:G12:b::::1\ncell:B13:b::1::\ncell:C13:t:Savings:b::1:1:1:l:4:f:2:bg:3\ncell:D13:vtc:n:0.2:0.20:b::1:1:1:l:5:f:2:bg:3:ntvf:2\ncell:E13:vtf:n:902.2:D13*INCOME!D23:b::1:1:1:l:5:f:2:bg:3:ntvf:1\ncell:F13:vtf:n:-342:INCOME!D23-sheet11!E30:b::1:1:1:l:5:f:2:bg:3:ntvf:1\ncell:G13:b::::1\ncell:C14:b:1:::\ncell:D14:b:1:::\ncell:E14:b:1:::\ncell:F14:b:1:::\ncell:B17:t:How does your spending compare to the average consumer?:f:4:cf:2:colspan:6\ncell:B19:bg:4\ncell:C19:t:Expense Category:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:D19:t:Average Consumer Spending (as percentage of income):b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1:colspan:2\ncell:E19:b:2:2:2:2\ncell:F19:t:Your Spending (as percentage of income):b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1:colspan:2\ncell:B20:b::1:::bg:4\ncell:C20:t:Housing:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D20:vtc:n%:0.28:28%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E20:b::1::1\ncell:F20:vtf:n:0.3059188649966748:EXPENSE!E7/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B21:b::1:::bg:4\ncell:C21:t:Food:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D21:vtc:n%:0.11:11%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E21:b::1::1\ncell:F21:vtf:n:0.04633119042340944:sheet11!E4/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B22:b::1:::bg:4\ncell:C22:t:Transportation:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D22:vtc:n%:0.13:13%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E22:b::1::1\ncell:F22:vtf:n:0.14187541565063178:sheet9!E17/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B23:b::1:::bg:4\ncell:C23:t:Clothes & Personal Services:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D23:vtc:n%:0.03:3%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E23:b::1::1\ncell:F23:vtf:n:0.042340944358235426:sheet9!E12/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B24:b::1:::bg:4\ncell:C24:t:Healthcare:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D24:vtc:n%:0.05:5%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E24:b::1::1\ncell:F24:vtf:n:0.0583019286189315:sheet9!E26/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B25:b::1:::bg:4\ncell:C25:t:Entertainment:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D25:vtc:n%:0.04:4%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E25:b::1::1\ncell:F25:vtf:n:0.04633119042340944:sheet10!E4/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B26:b::1:::bg:4\ncell:C26:t:Education:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D26:vtc:n%:0.02:2%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E26:b::1::1\ncell:F26:vtf:n:0.021724673021502994:sheet10!E13/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B27:b::1:::bg:4\ncell:C27:t:Contributions:b::1:1:1:l:2:f:7:bg:3:cf:2\ncell:D27:vtc:n%:0.03:3%:b::1:1:1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E27:b::1:1:1\ncell:F27:vtf:n:0.0492130348038129:sheet10!E18/INCOME!D23:b::1:1:1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:C28:b:1:::\ncell:D28:b:1:::\ncell:E28:b:1:::\ncell:F28:b:1:::\ncell:G28:b:1:::\ncol:A:w:20\ncol:B:w:21\ncol:C:w:122\ncol:D:w:106\ncol:E:w:123\ncol:F:w:100\ncol:G:w:25\ncol:H:w:80\nsheet:c:8:r:28:needsrecalc:yes:font:3\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* * Arial\nfont:2:* * arial,helvetica,sans-serif\nfont:3:* 12pt *\nfont:4:normal bold * arial,helvetica,sans-serif\nfont:5:normal bold 12pt arial,helvetica,sans-serif\nfont:6:normal bold 20pt Arial\nfont:7:normal normal * Arial\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:6px * 6px *;vertical-align:*;\nlayout:3:padding:6px * 6px *;vertical-align:middle;\nlayout:4:padding:6px 4px 6px 12px;vertical-align:*;\nlayout:5:padding:6px 8px 6px *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:#,##0%\nvalueformat:3:hidden\n", - }, - name: "compare", - hidden: "0", - }, - sheet8: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B3:t:Goals:l:2:f:4:c:1:bg:4:cf:2:colspan:3\ncell:G3:t:Date:l:1:f:5:cf:1\ncell:H3:vtf:ndt:41131.96186930555:NOW():l:1:f:5:bg:3:cf:3:ntvf:3\ncell:C5:f:3:colspan:4\ncell:B6:b:2:2:2:2:f:1:c:4:bg:2\ncell:C6:t:Goal:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1:colspan:3\ncell:D6:b:2:2:2:2:f:1:c:4:bg:2\ncell:E6:t:Goal:b:2:2:2:2:f:1:c:4:bg:2\ncell:F6:t:Amount:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:G6:t:Term (Months):b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:H6:t:Monthly:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:I6:t:Weekly:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:J6:t:How to achieve:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1:colspan:2\ncell:A7:b::1::\ncell:B7:vtc:n:1:1.:b::1:::l:2:cf:1:rowspan:4\ncell:C7:t:Pay off credit card debt:b::1:::l:4:f:1:cf:2:colspan:3:rowspan:4\ncell:F7:v:1000:b::1::1:f:1:ntvf:1\ncell:G7:v:12:b::1::1:f:1:ntvf:1\ncell:H7:vtf:n:83.33333333333333:IF(G7=0,"",F7/G7):b::1::1:f:1:ntvf:1\ncell:I7:vtf:n:19.17808219178082:IF(G7>0,F7*7*12/(G7*365),""):b::1::1:f:1:ntvf:1\ncell:J7:t:cutback on eating out:b::1:::f:1:colspan:2\ncell:L7:b::::1\ncell:A8:b::1::\ncell:B8:b::1::\ncell:C8:b::1::1:f:1:colspan:3\ncell:F8:b::1::1\ncell:G8:b::1::1\ncell:H8:b::1::1\ncell:I8:b::1::1\ncell:J8:b::1::1:f:1:colspan:2\ncell:L8:b::::1\ncell:A9:b::1::\ncell:B9:b::1::\ncell:C9:b::1::1:f:1:colspan:3\ncell:F9:b::1::1\ncell:G9:b::1::1\ncell:H9:b::1::1\ncell:I9:b::1::1\ncell:J9:b::1::1:f:1:colspan:2\ncell:L9:b::::1\ncell:A10:b::1::\ncell:B10:b::1::\ncell:C10:f:1:colspan:3\ncell:F10:b::1::1\ncell:G10:b::1::1\ncell:H10:b::1::1\ncell:I10:b::1::1\ncell:J10:b::1:1:1:f:1:colspan:2\ncell:L10:b::::1\ncell:A11:b::1::\ncell:B11:v:2:b:1:1:::l:2:cf:1:rowspan:4\ncell:C11:t:Save for a down:b:1:1:::l:4:f:1:colspan:3:rowspan:4\ncell:D11:b:1:::\ncell:E11:b:1:::\ncell:F11:v:20000:b:1:1::1:f:1:ntvf:1\ncell:G11:v:36:b:1:1::1:f:1:ntvf:1\ncell:H11:vtf:n:555.5555555555555:IF(G11>0,F11/G11,""):b:1:1::1:f:1:ntvf:1\ncell:I11:vtf:n:127.85388127853881:IF(G11>0,F11*7*12/(G11*365),""):b:1:1::1:f:1:ntvf:1\ncell:J11:b:1:1:::f:1:colspan:2\ncell:L11:b::::1\ncell:A12:b::1::\ncell:B12:b::1::\ncell:C12:t:payment:b::1::1:l:4:f:1:colspan:3\ncell:F12:b::1::1\ncell:G12:b::1::1\ncell:H12:b::1::1\ncell:I12:b::1::1\ncell:J12:b::1::1:f:1:colspan:2\ncell:L12:b::::1\ncell:A13:b::1::\ncell:B13:b::1::\ncell:C13:b::1::1:l:4:f:1:colspan:3\ncell:F13:b::1::1\ncell:G13:b::1::1\ncell:H13:b::1::1\ncell:I13:b::1::1\ncell:J13:b::1::1:f:1:colspan:2\ncell:L13:b::::1\ncell:A14:b::1::\ncell:B14:b::1::\ncell:C14:l:4:f:1:colspan:3\ncell:F14:b::1::1\ncell:G14:b::1::1\ncell:H14:b::1::1\ncell:I14:b::1::1\ncell:J14:b::1:1:1:f:1:colspan:2\ncell:L14:b::::1\ncell:A15:b::1::\ncell:B15:v:3:b:1:1:::l:2:cf:1:rowspan:4\ncell:C15:t:Date:b:1:1:::l:4:f:1:colspan:3:rowspan:4\ncell:D15:b:1:::\ncell:E15:b:1:::\ncell:F15:b:1:1::1:f:1:ntvf:1\ncell:G15:b:1:1::1:f:1:ntvf:1\ncell:H15:vtf:t::IF(G15>0,F15/G15,""):b:1:1::1:f:1:ntvf:1\ncell:I15:vtf:t::IF(G15>0,F15*7*12/(G15*365),""):b:1:1::1:f:1:ntvf:1\ncell:J15:b:1:1:::f:1:colspan:2\ncell:L15:b::::1\ncell:A16:b::1::\ncell:B16:b::1::\ncell:C16:b::1::1:l:4:f:1:colspan:3\ncell:F16:b::1::1\ncell:G16:b::1::1\ncell:H16:b::1::1\ncell:I16:b::1::1\ncell:J16:b::1::1:f:1:colspan:2\ncell:L16:b::::1\ncell:A17:b::1::\ncell:B17:b::1::\ncell:C17:b::1::1:l:4:f:1:colspan:3\ncell:F17:b::1::1\ncell:G17:b::1::1\ncell:H17:b::1::1\ncell:I17:b::1::1\ncell:J17:b::1::1:f:1:colspan:2\ncell:L17:b::::1\ncell:A18:b::1::\ncell:B18:b::1::\ncell:C18:l:4:f:1:colspan:3\ncell:F18:b::1::1\ncell:G18:b::1::1\ncell:H18:b::1::1\ncell:I18:b::1::1\ncell:J18:b::1:1:1:f:1:colspan:2\ncell:L18:b::::1\ncell:A19:b::1::\ncell:B19:v:4:b:1:1:::l:2:cf:1:rowspan:4\ncell:C19:b:1:1:::l:4:colspan:3:rowspan:4\ncell:D19:b:1:::\ncell:E19:b:1:::\ncell:F19:b:1:1::1:f:1:ntvf:1\ncell:G19:b:1:1::1:f:1:ntvf:1\ncell:H19:vtf:t::IF(G19>0,F19/G19,""):b:1:1::1:f:1:ntvf:1\ncell:I19:vtf:t::IF(G19>0,F19*7*12/(G19*365),""):b:1:1::1:f:1:ntvf:1\ncell:J19:b:1:1:::f:1:colspan:2\ncell:L19:b::::1\ncell:A20:b::1::\ncell:B20:b::1::\ncell:C20:b::1::1:l:3:colspan:3\ncell:F20:b::1::1\ncell:G20:b::1::1\ncell:H20:b::1::1\ncell:I20:b::1::1\ncell:J20:b::1::1:f:1:colspan:2\ncell:L20:b::::1\ncell:A21:b::1::\ncell:B21:b::1::\ncell:C21:b::1::1:l:3:colspan:3\ncell:F21:b::1::1\ncell:G21:b::1::1\ncell:H21:b::1::1\ncell:I21:b::1::1\ncell:J21:b::1::1:f:1:colspan:2\ncell:L21:b::::1\ncell:A22:b::1::\ncell:B22:b::1::\ncell:C22:l:3:f:1:colspan:3\ncell:F22:b::1::1\ncell:G22:b::1::1\ncell:H22:b::1::1\ncell:I22:b::1::1\ncell:J22:b::1:1:1:f:1:colspan:2\ncell:L22:b::::1\ncell:A23:b::1::\ncell:B23:v:5:b:1:1:::l:2:cf:1:rowspan:4\ncell:C23:b:1:1:1:1:l:4:colspan:3:rowspan:4\ncell:D23:b:1:::\ncell:E23:b:1:::\ncell:F23:b:1:1::1:f:1:ntvf:1\ncell:G23:b:1:1::1:f:1:ntvf:1\ncell:H23:vtf:t::IF(G23>0,F23/G23,""):b:1:1::1:f:1:ntvf:1\ncell:I23:vtf:t::IF(G23>0,F23*7*12/(G23*365),""):b:1:1::1:f:1:ntvf:1\ncell:J23:b:1:1:::f:1:colspan:2\ncell:L23:b::::1\ncell:A24:b::1::\ncell:B24:b::1::\ncell:C24:b::1::1:l:4:colspan:3\ncell:F24:b::1::1\ncell:G24:b::1::1\ncell:H24:b::1::1\ncell:I24:b::1::1\ncell:J24:b::1::1:f:1:colspan:2\ncell:L24:b::::1\ncell:A25:b::1::\ncell:B25:b::1::\ncell:C25:b::1::1:l:4:colspan:3\ncell:F25:b::1::1\ncell:G25:b::1::1\ncell:H25:b::1::1\ncell:I25:b::1::1\ncell:J25:b::1::1:f:1:colspan:2\ncell:L25:b::::1\ncell:A26:b::1::\ncell:B26:b::1::\ncell:C26:l:4:f:1:colspan:3\ncell:F26:b::1:1:1\ncell:G26:b::1:1:1\ncell:H26:b::1:1:1\ncell:I26:b::1:1:1\ncell:J26:b::1:1:1:f:1:colspan:2\ncell:L26:b::::1\ncell:A27:b::1::\ncell:B27:v:6:b:1:1::1:l:2:cf:1:rowspan:4\ncell:C27:b:1:1:1:1:l:4:f:1:colspan:3:rowspan:4\ncell:D27:b:1:1::1\ncell:E27:b:1:1::1\ncell:F27:b:1:1::1\ncell:G27:b:1:1::1\ncell:H27:vtf:t::IF(G27>0,F27/G27,""):b:1:1::1\ncell:I27:vtf:t::IF(G27>0,F27*7*12/(G27*365),""):b:1:1::1\ncell:J27:b::1::1:colspan:2\ncell:K27:b:1:::\ncell:A28:b::1::\ncell:B28:b::1::1\ncell:C28:b::1::1:l:4:f:1:colspan:3\ncell:D28:b::1::1\ncell:E28:b::1::1\ncell:F28:b::1::1\ncell:G28:b::1::1\ncell:H28:b::1::1\ncell:I28:b::1::1\ncell:J28:b::1::1:colspan:2\ncell:A29:b::1::\ncell:B29:b::1::1\ncell:C29:b::1::1:l:4:f:1:colspan:3\ncell:D29:b::1::1\ncell:E29:b::1::1\ncell:F29:b::1::1\ncell:G29:b::1::1\ncell:H29:b::1::1\ncell:I29:b::1::1\ncell:J29:b::1::1:colspan:2\ncell:A30:b::1::\ncell:B30:b::1:1:1\ncell:C30:b::1:1:1:l:4:f:1:colspan:3\ncell:D30:b::1:1:1\ncell:E30:b::1:1:1\ncell:F30:b::1:1:1\ncell:G30:b::1:1:1\ncell:H30:b::1:1:1\ncell:I30:b::1:1:1\ncell:J30:b::1:1:1:colspan:2\ncell:A31:b::1::\ncell:B31:v:7:b:1:1::1:l:2:cf:1:rowspan:4\ncell:C31:b:1:1:1:1:l:4:colspan:3:rowspan:4\ncell:D31:b:1:1:1:1\ncell:E31:b:1:1:1:1\ncell:F31:b:1:1::1\ncell:G31:b:1:1::1\ncell:H31:vtf:t::IF(G31>0,F31/G31,""):b:1:1::1\ncell:I31:vtf:t::IF(G31>0,F31*7*12/(G31*365),""):b:1:1::1\ncell:J31:b:1:1::1:colspan:2\ncell:K31:b:1:1:1:1\ncell:L31:b::::1\ncell:A32:b::1::\ncell:B32:b::1::1\ncell:C32:b:1:1:1:1\ncell:D32:b:1:1:1:1\ncell:E32:b:1:1:1:1\ncell:F32:b::1::1\ncell:G32:b::1::1\ncell:H32:b::1::1\ncell:I32:b::1::1\ncell:J32:b::1::1:colspan:2\ncell:K32:b:1:1:1:1\ncell:L32:b::::1\ncell:A33:b::1::\ncell:B33:b::1::1\ncell:C33:b:1:1:1:1\ncell:D33:b:1:1:1:1\ncell:E33:b:1:1:1:1\ncell:F33:b::1::1\ncell:G33:b::1::1\ncell:H33:b::1::1\ncell:I33:b::1::1\ncell:J33:b::1::1:colspan:2\ncell:K33:b:1:1:1:1\ncell:L33:b::::1\ncell:A34:b::1::\ncell:B34:b::1:1:1\ncell:C34:b:1:1:1:1\ncell:D34:b:1:1:1:1\ncell:E34:b:1:1:1:1\ncell:F34:b::1:1:1\ncell:G34:b::1:1:1\ncell:H34:b::1:1:1\ncell:I34:b::1:1:1\ncell:J34:b::1:1:1:colspan:2\ncell:K34:b:1:1:1:1\ncell:L34:b::::1\ncell:B35:b:1:::\ncell:C35:b:1:::\ncell:D35:b:1:::\ncell:E35:b:1:::\ncell:F35:b:1:::\ncell:G35:b:1:::\ncell:H35:b:1:::\ncell:I35:b:1:::\ncell:J35:b:1:::\ncell:K35:b:1:::\ncol:A:w:31\ncol:B:w:25\ncol:C:w:80\ncol:D:w:44\ncol:E:w:53\ncol:F:w:70\ncol:G:w:68\ncol:H:w:65\ncol:I:w:65\ncol:J:w:80\ncol:K:w:96\nsheet:c:12:r:35:needsrecalc:yes:font:2\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* * arial,helvetica,sans-serif\nfont:2:* 12pt *\nfont:3:normal bold * arial,helvetica,sans-serif\nfont:4:normal bold 20pt Arial\nfont:5:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:4:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\n', - }, - name: "goals", - hidden: "0", - }, - sheet9: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B3:t:Check Book Register:l:5:f:3:c:4:bg:2:cf:1:colspan:7\ncell:G3:t:Date:l:1:f:5:cf:1\ncell:H3:vtf:ndt:41131.961799432866:NOW():l:1:f:5:bg:3:cf:3:ntvf:3\ncell:A4:f:1\ncell:B4:l:2:f:4:c:1:bg:4:cf:2\ncell:C4:f:4\ncell:D4:f:4\ncell:E4:f:4\ncell:F4:f:4\ncell:G4:l:1:f:4:cf:1\ncell:H4:l:1:f:4:cf:3:ntvf:3\ncell:I4:f:1\ncell:B5:f:4\ncell:C5:f:4\ncell:D5:f:4\ncell:E5:f:4\ncell:F5:f:4\ncell:G5:f:4\ncell:H5:f:4\ncell:B6:t:Date:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:C6:t:Num:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:D6:t:Description:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:E6:t:R:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:F6:t:Withdrawal, Payment (-):b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:G6:t:Deposit, Credit (+):b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:H6:t:Balance:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:A7:b::1::\ncell:B7:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C7:b::1::1:l:4:f:1\ncell:D7:b::1::1:l:3:f:6\ncell:E7:b::1::1:l:3:f:6\ncell:F7:b::1::1:l:3:f:1:ntvf:1\ncell:G7:b::1::1:l:3:f:1:ntvf:1\ncell:H7:vtf:t: :IF(AND(ISBLANK(G7), ISBLANK(F7)), " ", G7-F7):b::1::1:l:3:f:1:ntvf:1\ncell:I7:b::::1\ncell:A8:b::1::\ncell:B8:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C8:b::1::1:l:4:f:1:bg:3\ncell:D8:b::1::1:l:3:f:6:bg:3\ncell:E8:b::1::1:l:3:f:6:bg:3\ncell:F8:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G8:b::1::1:l:3:f:1:bg:3\ncell:H8:vtf:t: :IF(AND(ISBLANK(G8), ISBLANK(F8)), " ", H7+G8-F8):b::1::1:l:3:f:1:bg:3\ncell:I8:b::::1\ncell:A9:b::1::\ncell:B9:b::1::1:l:4:f:1:ntvf:3\ncell:C9:b::1::1:l:4:f:1\ncell:D9:b::1::1:l:3:f:6\ncell:E9:b::1::1:l:3:f:6\ncell:F9:b::1::1:l:3:f:1:ntvf:1\ncell:G9:b::1::1:l:3:f:1\ncell:H9:vtf:t: :IF(AND(ISBLANK(G9), ISBLANK(F9)), " ", H8+G9-F9):b::1::1:l:3:f:1\ncell:I9:b::::1\ncell:A10:b::1::\ncell:B10:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C10:b::1::1:l:4:f:1:bg:3\ncell:D10:b::1::1:l:3:f:6:bg:3\ncell:E10:b::1::1:l:3:f:6:bg:3\ncell:F10:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G10:b::1::1:l:3:f:1:bg:3\ncell:H10:vtf:t: :IF(AND(ISBLANK(G10), ISBLANK(F10)), " ", H9+G10-F10):b::1::1:l:3:f:1:bg:3\ncell:I10:b::::1\ncell:A11:b::1::\ncell:B11:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C11:b::1::1:l:4:f:1\ncell:D11:b::1::1:l:3:f:6\ncell:E11:b::1::1:l:3:f:6\ncell:F11:b::1::1:l:3:f:1:ntvf:1\ncell:G11:b::1::1:l:3:f:1:ntvf:1\ncell:H11:vtf:t: :IF(AND(ISBLANK(G11), ISBLANK(F11)), " ", H10+G11-F11):b::1::1:l:3:f:1:ntvf:1\ncell:I11:b::::1\ncell:A12:b::1::\ncell:B12:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C12:b::1::1:l:4:f:1:bg:3\ncell:D12:b::1::1:l:3:f:6:bg:3\ncell:E12:b::1::1:l:3:f:6:bg:3\ncell:F12:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G12:b::1::1:l:3:f:1:bg:3\ncell:H12:vtf:t: :IF(AND(ISBLANK(G12), ISBLANK(F12)), " ", H11+G12-F12):b::1::1:l:3:f:1:bg:3\ncell:I12:b::::1\ncell:A13:b::1::\ncell:B13:b::1::1:l:4:f:1:ntvf:3\ncell:C13:b::1::1:l:4:f:1\ncell:D13:b::1::1:l:3:f:6\ncell:E13:b::1::1:l:3:f:6\ncell:F13:b::1::1:l:3:f:1:ntvf:1\ncell:G13:b::1::1:l:3:f:1\ncell:H13:vtf:t: :IF(AND(ISBLANK(G13), ISBLANK(F13)), " ", H12+G13-F13):b::1::1:l:3:f:1\ncell:I13:b::::1\ncell:A14:b::1::\ncell:B14:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C14:b::1::1:l:4:f:1:bg:3\ncell:D14:b::1::1:l:3:f:6:bg:3\ncell:E14:b::1::1:l:3:f:6:bg:3\ncell:F14:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G14:b::1::1:l:3:f:1:bg:3\ncell:H14:vtf:t: :IF(AND(ISBLANK(G14), ISBLANK(F14)), " ", H13+G14-F14):b::1::1:l:3:f:1:bg:3\ncell:I14:b::::1\ncell:A15:b::1::\ncell:B15:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C15:b::1::1:l:4:f:1\ncell:D15:b::1::1:l:3:f:6\ncell:E15:b::1::1:l:3:f:6\ncell:F15:b::1::1:l:3:f:1:ntvf:1\ncell:G15:b::1::1:l:3:f:1:ntvf:1\ncell:H15:vtf:t: :IF(AND(ISBLANK(G15), ISBLANK(F15)), " ", H14+G15-F15):b::1::1:l:3:f:1:ntvf:1\ncell:I15:b::::1\ncell:A16:b::1::\ncell:B16:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C16:b::1::1:l:4:f:1:bg:3\ncell:D16:b::1::1:l:3:f:6:bg:3\ncell:E16:b::1::1:l:3:f:6:bg:3\ncell:F16:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G16:b::1::1:l:3:f:1:bg:3\ncell:H16:vtf:t: :IF(AND(ISBLANK(G16), ISBLANK(F16)), " ", H15+G16-F16):b::1::1:l:3:f:1:bg:3\ncell:I16:b::::1\ncell:A17:b::1::\ncell:B17:b::1::1:l:4:f:1:ntvf:3\ncell:C17:b::1::1:l:4:f:1\ncell:D17:b::1::1:l:3:f:6\ncell:E17:b::1::1:l:3:f:6\ncell:F17:b::1::1:l:3:f:1:ntvf:1\ncell:G17:b::1::1:l:3:f:1\ncell:H17:vtf:t: :IF(AND(ISBLANK(G17), ISBLANK(F17)), " ", H16+G17-F17):b::1::1:l:3:f:1\ncell:I17:b::::1\ncell:A18:b::1::\ncell:B18:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C18:b::1::1:l:4:f:1:bg:3\ncell:D18:b::1::1:l:3:f:6:bg:3\ncell:E18:b::1::1:l:3:f:6:bg:3\ncell:F18:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G18:b::1::1:l:3:f:1:bg:3\ncell:H18:vtf:t: :IF(AND(ISBLANK(G18), ISBLANK(F18)), " ", H17+G18-F18):b::1::1:l:3:f:1:bg:3\ncell:I18:b::::1\ncell:A19:b::1::\ncell:B19:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C19:b::1::1:l:4:f:1\ncell:D19:b::1::1:l:3:f:6\ncell:E19:b::1::1:l:3:f:6\ncell:F19:b::1::1:l:3:f:1:ntvf:1\ncell:G19:b::1::1:l:3:f:1:ntvf:1\ncell:H19:vtf:t: :IF(AND(ISBLANK(G19), ISBLANK(F19)), " ", H18+G19-F19):b::1::1:l:3:f:1:ntvf:1\ncell:I19:b::::1\ncell:A20:b::1::\ncell:B20:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C20:b::1::1:l:4:f:2:bg:3\ncell:D20:b::1::1:l:3:f:6:bg:3\ncell:E20:b::1::1:l:3:f:6:bg:3\ncell:F20:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G20:b::1::1:l:3:f:1:bg:3\ncell:H20:vtf:t: :IF(AND(ISBLANK(G20), ISBLANK(F20)), " ", H19+G20-F20):b::1::1:l:3:f:1:bg:3\ncell:I20:b::::1\ncell:A21:b::1::\ncell:B21:b::1::1:l:4:f:1:ntvf:3\ncell:C21:b::1::1:l:4:f:1\ncell:D21:b::1::1:l:3:f:6\ncell:E21:b::1::1:l:3:f:6\ncell:F21:b::1::1:l:3:f:1:ntvf:1\ncell:G21:b::1::1:l:3:f:1\ncell:H21:vtf:t: :IF(AND(ISBLANK(G21), ISBLANK(F21)), " ", H20+G21-F21):b::1::1:l:3:f:1\ncell:I21:b::::1\ncell:A22:b::1::\ncell:B22:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C22:b::1::1:l:4:f:1:bg:3\ncell:D22:b::1::1:l:3:f:6:bg:3\ncell:E22:b::1::1:l:3:f:6:bg:3\ncell:F22:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G22:b::1::1:l:3:f:1:bg:3\ncell:H22:vtf:t: :IF(AND(ISBLANK(G22), ISBLANK(F22)), " ", H21+G22-F22):b::1::1:l:3:f:1:bg:3\ncell:I22:b::::1\ncell:A23:b::1::\ncell:B23:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C23:b::1::1:l:4:f:1\ncell:D23:b::1::1:l:3:f:6\ncell:E23:b::1::1:l:3:f:6\ncell:F23:b::1::1:l:3:f:1:ntvf:1\ncell:G23:b::1::1:l:3:f:1:ntvf:1\ncell:H23:vtf:t: :IF(AND(ISBLANK(G23), ISBLANK(F23)), " ", H22+G23-F23):b::1::1:l:3:f:1:ntvf:1\ncell:I23:b::::1\ncell:A24:b::1::\ncell:B24:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C24:b::1::1:l:4:f:1:bg:3\ncell:D24:b::1::1:l:3:f:6:bg:3\ncell:E24:b::1::1:l:3:f:6:bg:3\ncell:F24:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G24:b::1::1:l:3:f:1:bg:3\ncell:H24:vtf:t: :IF(AND(ISBLANK(G24), ISBLANK(F24)), " ", H23+G24-F24):b::1::1:l:3:f:1:bg:3\ncell:I24:b::::1\ncell:A25:b::1::\ncell:B25:b::1::1:l:4:f:1:ntvf:3\ncell:C25:b::1::1:l:4:f:1\ncell:D25:b::1::1:l:3:f:6\ncell:E25:b::1::1:l:3:f:6\ncell:F25:b::1::1:l:3:f:1:ntvf:1\ncell:G25:b::1::1:l:3:f:1\ncell:H25:vtf:t: :IF(AND(ISBLANK(G25), ISBLANK(F25)), " ", H24+G25-F25):b::1::1:l:3:f:1\ncell:I25:b::::1\ncell:A26:b::1::\ncell:B26:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C26:b::1::1:l:4:f:1:bg:3\ncell:D26:b::1::1:l:3:f:6:bg:3\ncell:E26:b::1::1:l:3:f:6:bg:3\ncell:F26:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G26:b::1::1:l:3:f:1:bg:3\ncell:H26:vtf:t: :IF(AND(ISBLANK(G26), ISBLANK(F26)), " ", H25+G26-F26):b::1::1:l:3:f:1:bg:3\ncell:I26:b::::1\ncell:A27:b::1::\ncell:B27:b::1::1:l:4:f:1:ntvf:3\ncell:C27:b::1::1:l:4:f:1\ncell:D27:b::1::1:l:3:f:6\ncell:E27:b::1::1:l:3:f:6\ncell:F27:b::1::1:l:3:f:1:ntvf:1\ncell:G27:b::1::1:l:3:f:1\ncell:H27:vtf:t: :IF(AND(ISBLANK(G27), ISBLANK(F27)), " ", H26+G27-F27):b::1::1:l:3:f:1\ncell:A28:b::1::\ncell:B28:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C28:b::1::1:l:4:f:1:bg:3\ncell:D28:b::1::1:l:3:f:6:bg:3\ncell:E28:b::1::1:l:3:f:6:bg:3\ncell:F28:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G28:b::1::1:l:3:f:1:bg:3\ncell:H28:vtf:t: :IF(AND(ISBLANK(G28), ISBLANK(F28)), " ", H27+G28-F28):b::1::1:l:3:f:1:bg:3\ncell:A29:b::1::\ncell:B29:b::1::1:l:4:f:1:ntvf:3\ncell:C29:b::1::1:l:4:f:1\ncell:D29:b::1::1:l:4:f:6\ncell:E29:b::1::1:l:4:f:1\ncell:F29:b::1::1:l:3:f:1:ntvf:1\ncell:G29:b::1::1:l:4:f:1:ntvf:1\ncell:H29:vtf:t: :IF(AND(ISBLANK(G29), ISBLANK(F29)), " ", H28+G29-F29):b::1::1:l:3:f:1\ncell:A30:b::1::\ncell:B30:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C30:b::1::1:l:4:f:1:bg:3\ncell:D30:b::1::1:l:4:f:6:bg:3\ncell:E30:b::1::1:l:4:f:1:bg:3\ncell:F30:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G30:b::1::1:l:4:f:1:bg:3:ntvf:1\ncell:H30:vtf:t: :IF(AND(ISBLANK(G30), ISBLANK(F30)), " ", H29+G30-F30):b::1::1:l:3:f:1:bg:3\ncell:A31:b::1::\ncell:B31:b::1:1:1:l:4:f:1:ntvf:3\ncell:C31:b::1:1:1:l:4:f:1\ncell:D31:b::1:1:1:l:4:f:6\ncell:E31:b::1:1:1:l:4:f:1\ncell:F31:b::1:1:1:l:3:f:1:ntvf:1\ncell:G31:b::1:1:1:l:4:f:1:ntvf:1\ncell:H31:vtf:t: :IF(AND(ISBLANK(G31), ISBLANK(F31)), " ", H30+G31-F31):b::1:1:1:l:3:f:1\ncol:A:w:31\ncol:B:w:74\ncol:C:w:72\ncol:D:w:168\ncol:E:w:43\ncol:F:w:100\ncol:G:w:100\ncol:H:w:103\nsheet:c:9:r:31:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:* 12pt arial,helvetica,sans-serif\nfont:3:* 14pt arial,helvetica,sans-serif\nfont:4:* x-small arial,helvetica,sans-serif\nfont:5:normal normal 12pt Arial\nfont:6:normal normal 12pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:4:padding:4px 8px 4px 12px;vertical-align:*;\nlayout:5:padding:6px * 6px *;vertical-align:*;\nlayout:6:padding:6px * 6px *;vertical-align:bottom;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\n', - }, - name: "sheet6", - hidden: "0", - }, - sheet10: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:4\ncell:E3:t:Budget:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F3:v:18750:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:G3:v:13125:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:H3:v:2500:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:I3:vtf:n:34375:sum(F3\\cH3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:E4:t:% Spent:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F4:vtf:n:0.21333333333333335:IF(F3=0,"-",F31/F3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:G4:vtf:n:0.6857142857142857:IF(G3=0,"-",G31/G3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:H4:vtf:n:0.8:IF(H3=0,"-",H31/H3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:I4:vtf:n:0.43636363636363634:IF(I3=0,"-",I31/I3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:E5:t:Remaining:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F5:vtf:n:14750:F3-F31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:G5:vtf:n:4125:G3-G31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:H5:vtf:n:500:H3-H31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:I5:vtf:n:19375:I3-I31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:E6:vtc:::\ncell:F6:vtc:::\ncell:G6:vtc:::\ncell:H6:vtc:::\ncell:I6:vtc:::\ncell:C7:t:Date:l:2:f:3:c:4:bg:1:cf:1\ncell:D7:t:Payment Types:l:2:f:3:c:4:bg:1:cf:1\ncell:E7:t:Description:l:2:f:3:c:4:bg:1:cf:1\ncell:F7:t:Category 1:l:2:f:3:c:4:bg:1:cf:1\ncell:G7:t:Category 2:l:2:f:3:c:4:bg:1:cf:1\ncell:H7:t:Category 3:l:2:f:3:c:4:bg:1:cf:1\ncell:I7:t:Subtotal:l:2:f:3:c:4:bg:1:cf:1\ncell:B8:b::1::\ncell:C8:v:39814:b::1::1:l:1:f:2:ntvf:5\ncell:D8:t:CrCard:b::1::1:l:1:f:2\ncell:E8:t:Walmart:b::1::1:l:1:f:2\ncell:F8:v:4000:b::1::1:l:1:f:2:ntvf:1\ncell:G8:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H8:v:2000:b::1::1:l:1:f:2:ntvf:1\ncell:I8:vtf:n:6000:SUM(F8\\cH8):b::1::1:l:1:f:2:ntvf:2\ncell:B9:b::1::\ncell:C9:v:39823:b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D9:t:Db Card:b::1::1:l:1:f:2:bg:2\ncell:E9:t:ABC Services, Inc.:b::1::1:l:1:f:2:bg:2\ncell:F9:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G9:v:9000:b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H9:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I9:vtf:n:9000:SUM(F9\\cH9):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B10:b::1::\ncell:C10:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D10:vtc::::b::1::1:l:1:f:2\ncell:E10:vtc::::b::1::1:l:1:f:2\ncell:F10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I10:vtf:n:0:SUM(F10\\cH10):b::1::1:l:1:f:2:ntvf:2\ncell:B11:b::1::\ncell:C11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D11:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E11:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I11:vtf:n:0:SUM(F11\\cH11):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B12:b::1::\ncell:C12:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D12:vtc::::b::1::1:l:1:f:2\ncell:E12:vtc::::b::1::1:l:1:f:2\ncell:F12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I12:vtf:n:0:SUM(F12\\cH12):b::1::1:l:1:f:2:ntvf:2\ncell:B13:b::1::\ncell:C13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D13:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E13:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I13:vtf:n:0:SUM(F13\\cH13):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B14:b::1::\ncell:C14:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D14:vtc::::b::1::1:l:1:f:2\ncell:E14:vtc::::b::1::1:l:1:f:2\ncell:F14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I14:vtf:n:0:SUM(F14\\cH14):b::1::1:l:1:f:2:ntvf:2\ncell:B15:b::1::\ncell:C15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D15:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E15:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I15:vtf:n:0:SUM(F15\\cH15):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B16:b::1::\ncell:C16:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D16:vtc::::b::1::1:l:1:f:2\ncell:E16:vtc::::b::1::1:l:1:f:2\ncell:F16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I16:vtf:n:0:SUM(F16\\cH16):b::1::1:l:1:f:2:ntvf:2\ncell:B17:b::1::\ncell:C17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D17:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E17:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I17:vtf:n:0:SUM(F17\\cH17):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B18:b::1::\ncell:C18:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D18:vtc::::b::1::1:l:1:f:2\ncell:E18:vtc::::b::1::1:l:1:f:2\ncell:F18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I18:vtf:n:0:SUM(F18\\cH18):b::1::1:l:1:f:2:ntvf:2\ncell:B19:b::1::\ncell:C19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D19:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E19:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I19:vtf:n:0:SUM(F19\\cH19):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B20:b::1::\ncell:C20:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D20:vtc::::b::1::1:l:1:f:2\ncell:E20:vtc::::b::1::1:l:1:f:2\ncell:F20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I20:vtf:n:0:SUM(F20\\cH20):b::1::1:l:1:f:2:ntvf:2\ncell:B21:b::1::\ncell:C21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D21:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E21:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I21:vtf:n:0:SUM(F21\\cH21):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B22:b::1::\ncell:C22:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D22:vtc::::b::1::1:l:1:f:2\ncell:E22:vtc::::b::1::1:l:1:f:2\ncell:F22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I22:vtf:n:0:SUM(F22\\cH22):b::1::1:l:1:f:2:ntvf:2\ncell:B23:b::1::\ncell:C23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D23:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E23:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I23:vtf:n:0:SUM(F23\\cH23):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B24:b::1::\ncell:C24:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D24:vtc::::b::1::1:l:1:f:2\ncell:E24:vtc::::b::1::1:l:1:f:2\ncell:F24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I24:vtf:n:0:SUM(F24\\cH24):b::1::1:l:1:f:2:ntvf:2\ncell:B25:b::1::\ncell:C25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D25:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E25:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I25:vtf:n:0:SUM(F25\\cH25):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B26:b::1::\ncell:C26:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D26:vtc::::b::1::1:l:1:f:2\ncell:E26:vtc::::b::1::1:l:1:f:2\ncell:F26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I26:vtf:n:0:SUM(F26\\cH26):b::1::1:l:1:f:2:ntvf:2\ncell:B27:b::1::\ncell:C27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D27:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E27:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I27:vtf:n:0:SUM(F27\\cH27):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B28:b::1::\ncell:C28:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D28:vtc::::b::1::1:l:1:f:2\ncell:E28:vtc::::b::1::1:l:1:f:2\ncell:F28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I28:vtf:n:0:SUM(F28\\cH28):b::1::1:l:1:f:2:ntvf:2\ncell:B29:b::1::\ncell:C29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D29:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E29:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I29:vtf:n:0:SUM(F29\\cH29):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B30:b::1::\ncell:C30:vtc::::b::1:1:1:l:1:f:2:ntvf:5\ncell:D30:vtc::::b::1:1:1:l:1:f:2\ncell:E30:vtc::::b::1:1:1:l:1:f:2\ncell:F30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:G30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:H30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:I30:vtf:n:0:SUM(F30\\cH30):b::1:1:1:l:1:f:2:ntvf:2\ncell:E31:t:Expense Total:b:2:2:2:2:l:1:f:2:c:4:bg:1:cf:1\ncell:F31:vtf:n:4000:SUM(F8\\cF30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:G31:vtf:n:9000:SUM(G8\\cG30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:H31:vtf:n:2000:SUM(H8\\cH30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:I31:vtf:n:15000:SUM(F31\\cH31):b:2:2:2:2:l:1:f:2:c:3:bg:1:ntvf:2\ncol:A:w:10\ncol:B:w:10\ncol:C:w:70\ncol:D:w:71\ncol:E:w:147\ncol:F:w:82\ncol:G:w:81\ncol:H:w:82\ncol:I:w:100\ncol:J:w:80\ncol:K:w:96\nsheet:c:11:r:31:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(238, 238, 238)\ncolor:4:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal normal * arial,helvetica,sans-serif\nfont:3:normal normal 12pt arial,helvetica,sans-serif\nlayout:1:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00;\\b-#,##0.00;\\b-\nvalueformat:3:0.00%\nvalueformat:4:hidden\nvalueformat:5:m/d/yy\n', - }, - name: "sheet7", - hidden: "0", - }, - sheet11: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:ntvf:1\ncol:A:w:31\ncol:B:w:25\ncol:C:w:80\ncol:D:w:44\ncol:E:w:53\ncol:F:w:70\ncol:G:w:68\ncol:H:w:65\ncol:I:w:65\ncol:J:w:80\ncol:K:w:96\nsheet:c:11:r:1:needsrecalc:yes:font:1\nfont:1:* 12pt *\nvalueformat:1:hidden\n", - }, - name: "sheet8", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "income!D8": true, - "income!E5": true, - "income!D9": true, - "sheet11!D2": true, - "income!D10": true, - "income!D11": true, - "goals!H3": true, - "income!D12": true, - "sheet9!E18": true, - "income!D13": true, - "sheet9!D2": true, - "sheet10!D2": true, - "income!D14": true, - "income!D15": true, - "income!D16": true, - "income!D17": true, - "income!D18": true, - "income!D19": true, - "income!D20": true, - "income!D21": true, - "income!C8": true, - "income!C9": true, - "income!C10": true, - "income!C11": true, - "income!C12": true, - "income!C13": true, - "income!C14": true, - "income!C15": true, - "income!C16": true, - "income!C17": true, - "income!C18": true, - "income!C19": true, - "income!C20": true, - "income!C21": true, - "income!C22": true, - "income!C23": true, - "income!H18": true, - "income!H17": true, - "income!H16": true, - "income!H15": true, - "income!H14": true, - "income!H13": true, - "income!K18": true, - "income!H19": true, - "income!K17": true, - "income!K16": true, - "income!K15": true, - "income!K14": true, - "expense!B4": true, - "income!K13": true, - "expense!E4": true, - "expense!F4": true, - "expense!E6": true, - "expense!F6": true, - "expense!B7": true, - "expense!C8": true, - "expense!D9": true, - "expense!D10": true, - "expense!D11": true, - "expense!D12": true, - "expense!D13": true, - "expense!E8": true, - "expense!E9": true, - "expense!E10": true, - "expense!E11": true, - "expense!E12": true, - "expense!E13": true, - "expense!C14": true, - "expense!D20": true, - "expense!D19": true, - "expense!D18": true, - "expense!D17": true, - "expense!D16": true, - "expense!D15": true, - "expense!E20": true, - "expense!E19": true, - "expense!E18": true, - "expense!E17": true, - "expense!E16": true, - "expense!E15": true, - "expense!C21": true, - "expense!C24": true, - "expense!D24": true, - "expense!D23": true, - "expense!D25": true, - "expense!D26": true, - "expense!D27": true, - "expense!D28": true, - "expense!D29": true, - "expense!D30": true, - "expense!D31": true, - "expense!E25": true, - "expense!E26": true, - "expense!E27": true, - "expense!E28": true, - "expense!E29": true, - "expense!E30": true, - "expense!E31": true, - "sheet9!B12": true, - "sheet9!B17": true, - "sheet9!B26": true, - "sheet9!C5": true, - "sheet9!C9": true, - "sheet9!B4": true, - "sheet9!D6": true, - "sheet9!D7": true, - "sheet9!D8": true, - "sheet9!D11": true, - "sheet9!D10": true, - "sheet9!E6": true, - "sheet9!E7": true, - "sheet9!E8": true, - "sheet9!E11": true, - "sheet9!E10": true, - "sheet9!D13": true, - "sheet9!D14": true, - "sheet9!D15": true, - "sheet9!D16": true, - "sheet9!E13": true, - "sheet9!E14": true, - "sheet9!E15": true, - "sheet9!E16": true, - "sheet9!D18": true, - "sheet9!D19": true, - "sheet9!D20": true, - "sheet9!D21": true, - "sheet9!D22": true, - "sheet9!D23": true, - "sheet9!D24": true, - "sheet9!D25": true, - "sheet9!E19": true, - "sheet9!E20": true, - "sheet9!E21": true, - "sheet9!E22": true, - "sheet9!E23": true, - "sheet9!E24": true, - "sheet9!E25": true, - "sheet9!D26": true, - "sheet9!D27": true, - "sheet9!D28": true, - "sheet9!D29": true, - "sheet9!D30": true, - "sheet9!D31": true, - "sheet9!E26": true, - "sheet9!E27": true, - "sheet9!E28": true, - "sheet9!E29": true, - "sheet9!E30": true, - "sheet9!E31": true, - "sheet10!B4": true, - "sheet10!B13": true, - "sheet10!B18": true, - "sheet10!B25": true, - "sheet10!B22": true, - "sheet10!D5": true, - "sheet10!D12": true, - "sheet10!D11": true, - "sheet10!D9": true, - "sheet10!D8": true, - "sheet10!D7": true, - "sheet10!D6": true, - "sheet10!E5": true, - "sheet10!E12": true, - "sheet10!E11": true, - "sheet10!E9": true, - "sheet10!E8": true, - "sheet10!E7": true, - "sheet10!E6": true, - "sheet10!D17": true, - "sheet10!D16": true, - "sheet10!D15": true, - "sheet10!D14": true, - "sheet10!E17": true, - "sheet10!E16": true, - "sheet10!E15": true, - "sheet10!E14": true, - "sheet10!D21": true, - "sheet10!D20": true, - "sheet10!D19": true, - "sheet10!E21": true, - "sheet10!E20": true, - "sheet10!E19": true, - "sheet10!D24": true, - "sheet10!D23": true, - "sheet10!E24": true, - "sheet10!E23": true, - "sheet10!D30": true, - "sheet10!D29": true, - "sheet10!D28": true, - "sheet10!D27": true, - "sheet10!D26": true, - "sheet10!E30": true, - "sheet10!E29": true, - "sheet10!E28": true, - "sheet10!E27": true, - "sheet10!E26": true, - "sheet11!B4": true, - "sheet11!B12": true, - "sheet11!B18": true, - "sheet11!B26": true, - "sheet11!D5": true, - "sheet11!D11": true, - "sheet11!D9": true, - "sheet11!D8": true, - "sheet11!D7": true, - "sheet11!D6": true, - "sheet11!D10": true, - "sheet11!E5": true, - "sheet11!E11": true, - "sheet11!E9": true, - "sheet11!E8": true, - "sheet11!E7": true, - "sheet11!E6": true, - "sheet11!E10": true, - "sheet11!D17": true, - "sheet11!D16": true, - "sheet11!D15": true, - "sheet11!D14": true, - "sheet11!D13": true, - "sheet11!E17": true, - "sheet11!E16": true, - "sheet11!E15": true, - "sheet11!E14": true, - "sheet11!E13": true, - "sheet11!D24": true, - "sheet11!D25": true, - "sheet11!D23": true, - "sheet11!D22": true, - "sheet11!D21": true, - "sheet11!D20": true, - "sheet11!D19": true, - "sheet11!E24": true, - "sheet11!E25": true, - "sheet11!E23": true, - "sheet11!E22": true, - "sheet11!E21": true, - "sheet11!E20": true, - "sheet11!E19": true, - "sheet11!D29": true, - "sheet11!D28": true, - "sheet11!D27": true, - "sheet11!E29": true, - "sheet11!E28": true, - "sheet11!E27": true, - "goals!C7": true, - "goals!C8": true, - "goals!C9": true, - "goals!C10": true, - "goals!C11": true, - "goals!C12": true, - "goals!C13": true, - "goals!C14": true, - "goals!C15": true, - "goals!C16": true, - "goals!C17": true, - "goals!C18": true, - "goals!C19": true, - "goals!C20": true, - "goals!C21": true, - "goals!C22": true, - "goals!C23": true, - "goals!C24": true, - "goals!C25": true, - "goals!C26": true, - "goals!J7": true, - "goals!J8": true, - "goals!J9": true, - "goals!J10": true, - "goals!J11": true, - "goals!J12": true, - "goals!J13": true, - "goals!J14": true, - "goals!J15": true, - "goals!J16": true, - "goals!J17": true, - "goals!J18": true, - "goals!J19": true, - "goals!J20": true, - "goals!J21": true, - "goals!J22": true, - "goals!J23": true, - "goals!J24": true, - "goals!J25": true, - "goals!J26": true, - "goals!F7": true, - "goals!F11": true, - "goals!F15": true, - "goals!F19": true, - "goals!F23": true, - "goals!G7": true, - "goals!G11": true, - "goals!G15": true, - "goals!G19": true, - "goals!G23": true, - "goals!C27": true, - "goals!C28": true, - "goals!C29": true, - "goals!C30": true, - "goals!H28": true, - "goals!H29": true, - "goals!H30": true, - "goals!G27": true, - "compare!D10": true, - "compare!D11": true, - "compare!D12": true, - "compare!D13": true, - "compare!D27": true, - "compare!D26": true, - "compare!D25": true, - "compare!D24": true, - "compare!D23": true, - "compare!D22": true, - "compare!D21": true, - "compare!D20": true, - "goals!F31": true, - "goals!C31": true, - "goals!J31": true, - "goals!J32": true, - "goals!G31": true, - "goals!J33": true, - "goals!J27": true, - "goals!J34": true, - "goals!J28": true, - "goals!J29": true, - "goals!J30": true, - "sheet6!C3": true, - "sheet6!B6": true, - "sheet6!C6": true, - "sheet6!D6": true, - "sheet6!E6": true, - "sheet6!F6": true, - "sheet6!G6": true, - "sheet6!H6": true, - "sheet6!C31": true, - "sheet6!C30": true, - "sheet6!C29": true, - "sheet6!C28": true, - "sheet6!C27": true, - "sheet6!C26": true, - "sheet6!C25": true, - "sheet6!C24": true, - "sheet6!C23": true, - "sheet6!C22": true, - "sheet6!C21": true, - "sheet6!C20": true, - "sheet6!C19": true, - "sheet6!C18": true, - "sheet6!C17": true, - "sheet6!C16": true, - "sheet6!C15": true, - "sheet6!C14": true, - "sheet6!C13": true, - "sheet6!C12": true, - "sheet6!C11": true, - "sheet6!C10": true, - "sheet6!C9": true, - "sheet6!B7": true, - "sheet7!F3": true, - "sheet7!G3": true, - "sheet7!H3": true, - "sheet7!D7": true, - "sheet7!E3": true, - "sheet7!E4": true, - "sheet7!E5": true, - "sheet7!I7": true, - "sheet7!H7": true, - "sheet7!G7": true, - "sheet7!F7": true, - "sheet7!E7": true, - "sheet7!C7": true, - "sheet7!C28": true, - "sheet7!C27": true, - "sheet7!C26": true, - "sheet7!C25": true, - "sheet7!C24": true, - "sheet7!C23": true, - "sheet7!C22": true, - "sheet7!C21": true, - "sheet7!C20": true, - "sheet7!C19": true, - "sheet7!C18": true, - "sheet7!C17": true, - "sheet7!C16": true, - "sheet7!C15": true, - "sheet7!C14": true, - "sheet7!C13": true, - "sheet7!C12": true, - "sheet7!C11": true, - "sheet7!C29": true, - "sheet7!C30": true, - "sheet7!C10": true, - "sheet7!C9": true, - "sheet7!C8": true, - "sheet7!D28": true, - "sheet7!D27": true, - "sheet7!D26": true, - "sheet7!D25": true, - "sheet7!D24": true, - "sheet7!D23": true, - "sheet7!D22": true, - "sheet7!D21": true, - "sheet7!D20": true, - "sheet7!D19": true, - "sheet7!D18": true, - "sheet7!D17": true, - "sheet7!D16": true, - "sheet7!D15": true, - "sheet7!D14": true, - "sheet7!D13": true, - "sheet7!D12": true, - "sheet7!D11": true, - "sheet7!D29": true, - "sheet7!D30": true, - "sheet7!D10": true, - "sheet7!D9": true, - "sheet7!D8": true, - "sheet7!F28": true, - "sheet7!F27": true, - "sheet7!F26": true, - "sheet7!F25": true, - "sheet7!F24": true, - "sheet7!F23": true, - "sheet7!F22": true, - "sheet7!F21": true, - "sheet7!F20": true, - "sheet7!F19": true, - "sheet7!F18": true, - "sheet7!F17": true, - "sheet7!F16": true, - "sheet7!F15": true, - "sheet7!F14": true, - "sheet7!F13": true, - "sheet7!F12": true, - "sheet7!F11": true, - "sheet7!F29": true, - "sheet7!F30": true, - "sheet7!F10": true, - "sheet7!F9": true, - "sheet7!F8": true, - "sheet7!G28": true, - "sheet7!G27": true, - "sheet7!G26": true, - "sheet7!G25": true, - "sheet7!G24": true, - "sheet7!G23": true, - "sheet7!G22": true, - "sheet7!G21": true, - "sheet7!G20": true, - "sheet7!G19": true, - "sheet7!G18": true, - "sheet7!G17": true, - "sheet7!G16": true, - "sheet7!G15": true, - "sheet7!G14": true, - "sheet7!G13": true, - "sheet7!G12": true, - "sheet7!G11": true, - "sheet7!G29": true, - "sheet7!G30": true, - "sheet7!G31": true, - "sheet7!G32": true, - "sheet7!G33": true, - "sheet7!G34": true, - "sheet7!G35": true, - "sheet7!G36": true, - "sheet7!G37": true, - "sheet7!G38": true, - "sheet7!G39": true, - "sheet7!G10": true, - "sheet7!G9": true, - "sheet7!G8": true, - "sheet7!E28": true, - "sheet7!E27": true, - "sheet7!E26": true, - "sheet7!E25": true, - "sheet7!E24": true, - "sheet7!E23": true, - "sheet7!E22": true, - "sheet7!E21": true, - "sheet7!E20": true, - "sheet7!E19": true, - "sheet7!E18": true, - "sheet7!E17": true, - "sheet7!E16": true, - "sheet7!E15": true, - "sheet7!E14": true, - "sheet7!E13": true, - "sheet7!E12": true, - "sheet7!E11": true, - "sheet7!E29": true, - "sheet7!E30": true, - "sheet7!E10": true, - "sheet7!E9": true, - "sheet7!E8": true, - "sheet7!H28": true, - "sheet7!H27": true, - "sheet7!H26": true, - "sheet7!H25": true, - "sheet7!H24": true, - "sheet7!H23": true, - "sheet7!H22": true, - "sheet7!H21": true, - "sheet7!H20": true, - "sheet7!H19": true, - "sheet7!H18": true, - "sheet7!H17": true, - "sheet7!H16": true, - "sheet7!H15": true, - "sheet7!H14": true, - "sheet7!H13": true, - "sheet7!H12": true, - "sheet7!H11": true, - "sheet7!H29": true, - "sheet7!H30": true, - "sheet7!H10": true, - "sheet7!H9": true, - "sheet7!E31": true, - "sheet7!H8": true, - "sheet6!C8": true, - "sheet6!D31": true, - "sheet6!D30": true, - "sheet6!D29": true, - "sheet6!D28": true, - "sheet6!D27": true, - "sheet6!D26": true, - "sheet6!D25": true, - "sheet6!D24": true, - "sheet6!D23": true, - "sheet6!D22": true, - "sheet6!D21": true, - "sheet6!D20": true, - "sheet6!D19": true, - "sheet6!D18": true, - "sheet6!D17": true, - "sheet6!D16": true, - "sheet6!D15": true, - "sheet6!D14": true, - "sheet6!D13": true, - "sheet6!D12": true, - "sheet6!D11": true, - "sheet6!D10": true, - "sheet6!D9": true, - "sheet6!D8": true, - "sheet6!F31": true, - "sheet6!F30": true, - "sheet6!F29": true, - "sheet6!F28": true, - "sheet6!F27": true, - "sheet6!F26": true, - "sheet6!F25": true, - "sheet6!F24": true, - "sheet6!F23": true, - "sheet6!F22": true, - "sheet6!F21": true, - "sheet6!F20": true, - "sheet6!F19": true, - "sheet6!F18": true, - "sheet6!F17": true, - "sheet6!F16": true, - "sheet6!F15": true, - "sheet6!F14": true, - "sheet6!F13": true, - "sheet6!F12": true, - "sheet6!F11": true, - "sheet6!F10": true, - "sheet6!F9": true, - "sheet6!F8": true, - "sheet6!G31": true, - "sheet6!G30": true, - "sheet6!G29": true, - "sheet6!G28": true, - "sheet6!G27": true, - "sheet6!G26": true, - "sheet6!G25": true, - "sheet6!G24": true, - "sheet6!G23": true, - "sheet6!G22": true, - "sheet6!G21": true, - "sheet6!G20": true, - "sheet6!G19": true, - "sheet6!G18": true, - "sheet6!G17": true, - "sheet6!G16": true, - "sheet6!G15": true, - "sheet6!G14": true, - "sheet6!G13": true, - "sheet6!G12": true, - "sheet6!G11": true, - "sheet6!G10": true, - "sheet6!G9": true, - "sheet6!G8": true, - "sheet6!B31": true, - "sheet6!B30": true, - "sheet6!B29": true, - "sheet6!B28": true, - "sheet6!B27": true, - "sheet6!B26": true, - "sheet6!B25": true, - "sheet6!B24": true, - "sheet6!B23": true, - "sheet6!B22": true, - "sheet6!B21": true, - "sheet6!B20": true, - "sheet6!B19": true, - "sheet6!B18": true, - "sheet6!B17": true, - "sheet6!B16": true, - "sheet6!B15": true, - "sheet6!B14": true, - "sheet6!B13": true, - "sheet6!B12": true, - "sheet6!B11": true, - "sheet6!B10": true, - "sheet6!B9": true, - "sheet6!B8": true, - "sheet6!C7": true, - "sheet6!D7": true, - "sheet6!E7": true, - "sheet6!F7": true, - "sheet6!G7": true, - "sheet6!E31": true, - "sheet6!E30": true, - "sheet6!E29": true, - "sheet6!E28": true, - "sheet6!E27": true, - "sheet6!E26": true, - "sheet6!E25": true, - "sheet6!E24": true, - "sheet6!E23": true, - "sheet6!E22": true, - "sheet6!E21": true, - "sheet6!E20": true, - "sheet6!E19": true, - "sheet6!E18": true, - "sheet6!E17": true, - "sheet6!E16": true, - "sheet6!E15": true, - "sheet6!E14": true, - "sheet6!E13": true, - "sheet6!E12": true, - "sheet6!E11": true, - "sheet6!E10": true, - "sheet6!E9": true, - "sheet6!E8": true, - "compare!B4": true, - "compare!C9": true, - "compare!D9": true, - "compare!E9": true, - "compare!F9": true, - "compare!C10": true, - "compare!C11": true, - "compare!C12": true, - "compare!C13": true, - "compare!F19": true, - "compare!C19": true, - "compare!C27": true, - "compare!C26": true, - "compare!C25": true, - "compare!C24": true, - "compare!C23": true, - "compare!C22": true, - "compare!C21": true, - "compare!C20": true, - "summary!G18": true, - "summary!O32": true, - }, - constraints: {}, - }, - }, - footers: [ - { name: "Inventory Sheet 1", index: 1, isActive: true }, - { name: "Inventory Sheet 2", index: 2, isActive: false }, - { name: "Inventory Sheet 3", index: 3, isActive: false }, - { name: "Asset Inventory", index: 4, isActive: false }, - { name: "Purchase Information", index: 5, isActive: false }, - { name: "Supplier List", index: 6, isActive: false }, - { name: "Insurance Inventory 1", index: 7, isActive: false }, - { name: "Insurance Inventory 2", index: 8, isActive: false }, - { name: "Insurance Information", index: 9, isActive: false }, - ], - }, - iPhone: { - msc: { - numsheets: 11, - currentid: "sheet1", - currentname: "summary", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B2:t:Summary:l:1:f:4:c:1:bg:6:cf:2:colspan:4\ncell:B4:l:1:f:3:c:1:bg:6:cf:2\ncell:G4:t:
    \\n\\n\\n:tvf:3:colspan:3:rowspan:5\ncell:C5:t:Monthly Budget:l:4:f:5:c:6:bg:3:cf:1:colspan:2\ncell:D5:bg:5\ncell:B6:b::1::\ncell:C6:t:Total Income:b::1:1:1:l:3:f:6:cf:2\ncell:D6:vtf:n:37112:INCOME!D23:b::1:1:1:l:2:f:1:ntvf:1\ncell:B7:b::1::\ncell:C7:t:Total Expenses:b:::1:1:l:3:f:6:bg:5:cf:2\ncell:D7:vtf:n:4853:SHEET11!E30:b::1:1:1:l:2:f:1:bg:5:ntvf:1\ncell:C8:t:Savings:b:1::1:1:l:3:f:6:cf:2\ncell:D8:vtf:n:32259:D6-D7:b:1:1:1:1:l:2:f:1:ntvf:1\ncell:B10:t::l:1:f:3:c:1:bg:6:cf:2\ncell:G10:t:
    \\n\\n\\n:tvf:3:colspan:3:rowspan:5\ncell:C11:t:Yearly Budget:l:4:f:5:c:6:bg:2:cf:1:colspan:2\ncell:B12:b::1::\ncell:C12:t:Total Income:b::1:1:1:l:3:f:6:cf:2\ncell:D12:vtf:n:445344:INCOME!E23:b::1:1:1:l:3:f:1:ntvf:1\ncell:C13:t:Total Expenses:b:::1:1:l:3:f:6:bg:5:cf:2\ncell:D13:vtf:n:58236:SHEET11!F30:b::1:1:1:l:3:f:1:bg:5:ntvf:1\ncell:C14:t:Savings:b:1::1:1:l:3:f:6:cf:2\ncell:D14:vtf:n:387108:D12-D13:b:1:1:1:1:l:3:f:1:ntvf:1\ncell:B16:l:1:f:3:c:1:bg:6:cf:1\ncell:B17:bg:6\ncell:C17:t:Monthly Spending:l:4:f:5:c:6:bg:4:cf:1:colspan:2\ncell:D17:b::1:::bg:6\ncell:B18:b::1::\ncell:C18:t:Housing:b::1::1:l:3:f:6:cf:2\ncell:D18:vtf:n:1380:EXPENSE!E7:b::1::1:l:3:f:1:ntvf:1\ncell:G18:t:
    \\n\\n\\n:tvf:3:colspan:4:rowspan:11\ncell:B19:b::1::\ncell:C19:t:Food:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D19:vtf:n:511:sheet9!E4:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B20:b::1::\ncell:C20:t:Clothes:b::1::1:l:3:f:6:cf:2\ncell:D20:vtf:n:191:sheet9!E12:b::1::1:l:3:f:1:ntvf:1\ncell:B21:b::1::\ncell:C21:t:Transportation:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D21:vtf:n:640:sheet9!E17:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B22:b::1::\ncell:C22:t:Healthcare:b::1::1:l:3:f:6:cf:2\ncell:D22:vtf:n:263:sheet9!E26:b::1::1:l:3:f:1:ntvf:1\ncell:B23:b::1::\ncell:C23:t:Entertainment:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D23:vtf:n:209:sheet10!E4:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B24:b::1::\ncell:C24:t:Education:b::1::1:l:3:f:6:cf:2\ncell:D24:vtf:n:98:sheet10!E13:b::1::1:l:3:f:1:ntvf:1\ncell:B25:b::1::\ncell:C25:t:Contributions:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D25:vtf:n:222:sheet10!E18:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B26:b::1::\ncell:C26:t:Debt:b::1::1:l:3:f:6:cf:2\ncell:D26:vtf:n:0:sheet10!E22:b::1::1:l:3:f:1:ntvf:1\ncell:B27:b::1::\ncell:C27:t:Insurance:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D27:vtf:n:30:sheet10!E25:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B28:b::1::\ncell:C28:t:Credit Card :b::1::1:l:3:f:6:cf:2\ncell:D28:vtf:n:209:sheet11!E4:b::1::1:l:3:f:1:ntvf:1\ncell:B29:b::1::\ncell:C29:t:Buisness:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D29:vtf:n:780:sheet11!E12:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B30:b::1::\ncell:C30:t:Vacation:b::1::1:l:3:f:6:cf:2\ncell:D30:vtf:n:98:sheet11!E18:b::1::1:l:3:f:1:ntvf:1\ncell:E30:b::::1\ncell:B31:b::1::\ncell:C31:t:Miscellaneous:b::1:1:1:l:3:f:6:bg:5:cf:2\ncell:D31:vtf:n:222:sheet11!E26:b::1:1:1:l:3:f:1:bg:5:ntvf:1\ncell:E31:b::::1\ncell:C32:b:1:::\ncell:D32:b:1:::\ncol:A:w:60\ncol:B:w:20\ncol:C:w:151\ncol:D:w:89\ncol:E:w:20\ncol:F:w:54\ncol:G:w:95\ncol:H:w:96\ncol:I:w:88\ncol:J:w:47\nsheet:c:10:r:32:font:2\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,153,204)\ncolor:3:rgb(136,204,119)\ncolor:4:rgb(204,119,153)\ncolor:5:rgb(230,230,250)\ncolor:6:rgb(255, 255, 255)\nfont:1:* * Arial\nfont:2:* 12pt *\nfont:3:normal bold 12pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold large *\nfont:6:normal normal * Arial\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:1px 8px 1px *;vertical-align:middle;\nlayout:3:padding:1px 8px 1px 6px;vertical-align:middle;\nlayout:4:padding:3px 10px 3px 10px;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:text-html\n', - }, - name: "summary", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:8:cf:2:ntvf:2\ncell:B1:l:1:f:8:cf:2\ncell:C1:l:1:f:8:cf:2\ncell:D1:l:1:f:8:cf:2\ncell:E1:l:1:f:8:cf:2\ncell:F1:l:1:f:8:cf:2\ncell:G1:l:1:f:8:cf:2\ncell:H1:l:1:f:8:cf:2\ncell:I1:l:1:f:8:cf:2\ncell:J1:l:1:f:8:cf:2\ncell:K1:l:1:f:8:cf:2\ncell:L1:l:1:f:8:cf:2\ncell:M1:l:1:f:8:cf:2\ncell:N1:l:1:f:8:cf:2\ncell:O1:l:1:f:8:cf:2\ncell:P1:l:1:f:8:cf:2\ncell:Q1:l:1:f:8:cf:2\ncell:R1:l:1:f:8:cf:2\ncell:S1:l:1:f:8:cf:2\ncell:A2:l:1:f:8:cf:2\ncell:B2:l:1:f:8:cf:2\ncell:C2:l:1:f:8:cf:2\ncell:D2:l:1:f:8:cf:2\ncell:E2:l:1:f:8:cf:2\ncell:F2:l:1:f:8:cf:2\ncell:G2:l:1:f:8:cf:2\ncell:H2:l:1:f:8:cf:2\ncell:I2:l:1:f:8:cf:2\ncell:J2:l:1:f:8:cf:2\ncell:K2:l:1:f:8:cf:2\ncell:L2:l:1:f:8:cf:2\ncell:M2:l:1:f:8:cf:2\ncell:N2:l:1:f:8:cf:2\ncell:O2:l:1:f:8:cf:2\ncell:P2:l:1:f:8:cf:2\ncell:Q2:l:1:f:8:cf:2\ncell:R2:l:1:f:8:cf:2\ncell:S2:l:1:f:8:cf:2\ncell:A3:l:1:f:8:cf:2\ncell:B3:l:1:f:8:cf:2\ncell:C3:l:1:f:8:cf:2\ncell:D3:l:1:f:8:cf:2\ncell:E3:l:1:f:8:cf:2\ncell:F3:l:1:f:8:cf:2\ncell:G3:l:1:f:8:cf:2\ncell:H3:l:1:f:8:cf:2\ncell:I3:l:1:f:8:cf:2\ncell:J3:l:1:f:8:cf:2\ncell:K3:l:1:f:8:cf:2\ncell:L3:l:1:f:8:cf:2\ncell:M3:l:1:f:8:cf:2\ncell:N3:l:1:f:8:cf:2\ncell:O3:l:1:f:8:cf:2\ncell:P3:l:1:f:8:cf:2\ncell:Q3:l:1:f:8:cf:2\ncell:R3:l:1:f:8:cf:2\ncell:S3:l:1:f:8:cf:2\ncell:A4:l:1:f:8:cf:2\ncell:B4:l:1:f:8:cf:2\ncell:C4:l:1:f:8:cf:2\ncell:F4:l:1:f:8:cf:2\ncell:G4:l:1:f:8:cf:2\ncell:H4:l:1:f:8:cf:2\ncell:I4:l:1:f:8:cf:2\ncell:J4:l:1:f:8:cf:2\ncell:K4:l:1:f:8:cf:2\ncell:L4:l:1:f:8:cf:2\ncell:M4:t: :l:1:f:8:cf:2\ncell:N4:l:1:f:8:cf:2\ncell:O4:l:1:f:8:cf:2\ncell:P4:l:1:f:8:cf:2\ncell:Q4:l:1:f:8:cf:2\ncell:R4:l:1:f:8:cf:2\ncell:S4:l:1:f:8:cf:2\ncell:A5:l:1:f:8:cf:2\ncell:B5:t::l:2:f:5:cf:2\ncell:C5:t:Income:l:2:f:4:c:1:bg:7:cf:2\ncell:D5:t:Date:l:1:f:9:cf:2\ncell:E5:vtf:ndt:45465.92746829861:NOW():l:1:f:9:bg:6:cf:3:ntvf:3\ncell:F5:l:1:f:8:cf:2\ncell:G5:l:1:f:8:cf:2\ncell:H5:l:1:f:8:cf:2\ncell:I5:l:1:f:8:cf:2\ncell:J5:l:1:f:8:cf:2\ncell:K5:l:1:f:8:cf:2\ncell:L5:l:1:f:8:cf:2\ncell:M5:l:1:f:8:cf:2\ncell:N5:l:1:f:8:cf:2\ncell:O5:l:1:f:8:cf:2\ncell:P5:l:1:f:8:cf:2\ncell:Q5:l:1:f:8:cf:2\ncell:R5:l:1:f:8:cf:2\ncell:S5:l:1:f:8:cf:2\ncell:A6:l:1:f:8:cf:2\ncell:C6:t::l:2:f:8:cf:1\ncell:D6:l:1:f:8:cf:2\ncell:E6:l:1:f:8:cf:2\ncell:F6:l:1:f:8:cf:2\ncell:K6:t::l:2:f:3:cf:2\ncell:L6:t::l:2:f:8:cf:2\ncell:M6:t::l:2:f:8:cf:2\ncell:N6:t::l:2:f:8:cf:2\ncell:O6:l:1:f:8:cf:2\ncell:P6:l:1:f:8:cf:2\ncell:Q6:l:1:f:8:cf:2\ncell:R6:l:1:f:8:cf:2\ncell:S6:l:1:f:8:cf:2\ncell:A7:l:1:f:10:cf:2\ncell:B7:l:2:f:3:cf:2\ncell:F7:l:1:f:8:cf:2\ncell:K7:l:1:f:8:cf:2\ncell:L7:l:1:f:8:cf:2\ncell:M7:l:1:f:8:cf:2\ncell:N7:l:1:f:8:cf:2\ncell:O7:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:P7:t::l:1:f:8:cf:2\ncell:Q7:l:1:f:8:cf:2\ncell:R7:l:1:f:8:cf:2\ncell:S7:l:1:f:8:cf:2\ncell:A8:l:1:f:10:cf:2\ncell:C8:t:Source:l:2:f:2:c:7:bg:5:cf:1\ncell:D8:t:Monthly Budget:l:2:f:2:c:7:bg:4:cf:1\ncell:E8:t:Yearly Budget:l:2:f:2:c:7:bg:2:cf:1\ncell:F8:l:1:f:8:cf:2\ncell:K8:t::l:1:f:8:cf:2\ncell:L8:t::l:1:f:8:cf:2\ncell:M8:t::l:1:f:8:cf:2\ncell:N8:l:1:f:8:cf:2\ncell:O8:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:P8:t::l:1:f:8:cf:2\ncell:Q8:l:1:f:8:cf:2\ncell:R8:l:1:f:8:cf:2\ncell:S8:l:1:f:8:cf:2\ncell:B9:b::1:::l:1:f:8:cf:2\ncell:C9:t:Salary/Wages:b::1::1:l:5:f:7:cf:2\ncell:D9:v:20000:b::1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E9:vtf:n:240000:IF( (D9*12)=0,"",(D9*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F9:l:1:f:8:cf:2\ncell:K9:l:1:f:8:cf:2\ncell:L9:l:1:f:8:cf:2\ncell:M9:l:1:f:8:cf:2\ncell:N9:l:1:f:8:cf:2\ncell:O9:l:1:f:8:cf:2\ncell:P9:l:1:f:8:cf:2\ncell:Q9:l:1:f:8:cf:2\ncell:R9:l:1:f:8:cf:2\ncell:S9:l:1:f:8:cf:2\ncell:B10:b::1:::l:1:f:8:cf:2\ncell:C10:t:Contract Work:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D10:v:18012:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E10:vtf:n:216144:IF( (D10*12)=0,"",(D10*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F10:l:1:f:8:cf:2\ncell:G10:l:1:f:3:cf:3\ncell:H10:t::l:1:f:8:cf:3\ncell:I10:t::l:1:f:8:cf:3\ncell:J10:l:1:f:8:cf:2\ncell:K10:l:2:f:3:cf:2\ncell:L10:l:1:f:8:cf:2\ncell:M10:l:1:f:8:cf:2\ncell:N10:l:1:f:8:cf:2\ncell:O10:l:1:f:8:cf:2\ncell:P10:l:1:f:8:cf:2\ncell:Q10:l:1:f:8:cf:2\ncell:R10:l:1:f:8:cf:2\ncell:S10:l:1:f:8:cf:2\ncell:B11:b::1:::l:1:f:8:cf:2\ncell:C11:t:Bonuses:b::1::1:l:5:f:7:cf:2\ncell:D11:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E11:vtf:t::IF( (D11*12)=0,"",(D11*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F11:l:1:f:8:cf:2\ncell:G11:l:1:f:8:cf:2\ncell:H11:l:1:f:8:cf:2\ncell:I11:l:1:f:8:cf:2\ncell:J11:l:1:f:8:cf:2\ncell:K11:l:1:f:8:cf:2\ncell:L11:l:1:f:8:cf:2\ncell:M11:l:1:f:8:cf:2\ncell:N11:l:1:f:8:cf:2\ncell:O11:l:1:f:8:cf:2\ncell:P11:l:1:f:8:cf:2\ncell:Q11:l:1:f:8:cf:2\ncell:R11:l:1:f:8:cf:2\ncell:S11:l:1:f:8:cf:2\ncell:B12:b::1:::l:1:f:8:cf:2\ncell:C12:t:Commissions:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D12:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E12:vtf:t::IF( (D12*12)=0,"",(D12*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F12:l:1:f:8:cf:2\ncell:G12:l:1:f:8:cf:2\ncell:H12:l:1:f:8:cf:2\ncell:I12:l:1:f:8:cf:2\ncell:J12:l:1:f:8:cf:2\ncell:K12:l:1:f:8:cf:2\ncell:L12:l:1:f:8:cf:2\ncell:M12:l:1:f:8:cf:2\ncell:N12:l:1:f:8:cf:2\ncell:O12:l:1:f:8:cf:2\ncell:P12:l:1:f:8:cf:2\ncell:Q12:l:1:f:8:cf:2\ncell:R12:l:1:f:8:cf:2\ncell:S12:l:1:f:8:cf:2\ncell:B13:b::1:::l:1:f:8:cf:2\ncell:C13:t:Tips:b::1::1:l:5:f:7:cf:2\ncell:D13:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E13:vtf:t::IF( (D13*12)=0,"",(D13*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F13:l:1:f:8:cf:2\ncell:G13:l:1:f:8:cf:2\ncell:H13:t:Deductions:l:2:f:2:c:7:bg:5:cf:1:colspan:3\ncell:I13:l:1:f:8:c:7:cf:2\ncell:J13:l:1:f:8:c:7:cf:2\ncell:K13:t:Monthly Budget:l:2:f:2:c:7:bg:4:cf:1\ncell:L13:l:1:f:8:cf:2\ncell:M13:l:1:f:8:cf:2\ncell:N13:l:1:f:8:cf:2\ncell:O13:l:1:f:8:cf:2\ncell:P13:l:1:f:8:cf:2\ncell:Q13:l:1:f:8:cf:2\ncell:R13:l:1:f:8:cf:2\ncell:S13:l:1:f:8:cf:2\ncell:B14:b::1:::l:1:f:8:cf:2\ncell:C14:t:Interest Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D14:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E14:vtf:t::IF( (D14*12)=0,"",(D14*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F14:l:1:f:8:cf:2\ncell:G14:b::1:::l:1:f:8:cf:2\ncell:H14:t:Fedral Withholding Taxes:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I14:l:1:f:8:cf:2\ncell:J14:l:1:f:8:cf:2\ncell:K14:b::1::1:l:4:f:7:cf:3:ntvf:1\ncell:L14:b::::1:l:1:f:8:cf:2\ncell:M14:l:1:f:8:cf:2\ncell:N14:l:1:f:8:cf:2\ncell:O14:l:1:f:8:cf:2\ncell:P14:l:1:f:8:cf:2\ncell:Q14:l:1:f:8:cf:2\ncell:R14:l:1:f:8:cf:2\ncell:S14:l:1:f:8:cf:2\ncell:B15:b::1:::l:1:f:8:cf:2\ncell:C15:t:Investment Income:b::1::1:l:5:f:7:cf:2\ncell:D15:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E15:vtf:t::IF( (D15*12)=0,"",(D15*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F15:l:1:f:8:cf:2\ncell:G15:b::1:::l:1:f:8:cf:2\ncell:H15:t:State Withholding Taxes:b::1::1:l:5:f:7:bg:6:cf:2:colspan:3\ncell:I15:l:1:f:8:bg:6:cf:2\ncell:J15:l:1:f:8:bg:6:cf:2\ncell:K15:b::1::1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:L15:b::::1:l:1:f:8:cf:2\ncell:M15:l:1:f:8:cf:2\ncell:N15:l:1:f:8:cf:2\ncell:O15:l:1:f:8:cf:2\ncell:P15:l:1:f:8:cf:2\ncell:Q15:l:1:f:8:cf:2\ncell:R15:l:1:f:8:cf:2\ncell:S15:l:1:f:8:cf:2\ncell:B16:b::1:::l:1:f:8:cf:2\ncell:C16:t:Rental Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D16:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E16:vtf:t::IF( (D16*12)=0,"",(D16*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F16:b:1::::l:1:f:8:cf:2\ncell:G16:b:1:1:::l:1:f:8:cf:2\ncell:H16:t:Social Security:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I16:l:1:f:8:cf:2\ncell:J16:l:1:f:8:cf:2\ncell:K16:b::1::1:l:4:f:7:cf:3:ntvf:1\ncell:L16:b::::1:l:1:f:8:cf:2\ncell:M16:l:1:f:8:cf:2\ncell:N16:l:1:f:8:cf:2\ncell:O16:l:1:f:8:cf:2\ncell:P16:l:1:f:8:cf:2\ncell:Q16:l:1:f:8:cf:2\ncell:R16:l:1:f:8:cf:2\ncell:S16:l:1:f:8:cf:2\ncell:B17:b::1:::l:1:f:8:cf:2\ncell:C17:t:Pension Income:b::1::1:l:5:f:7:cf:2\ncell:D17:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E17:vtf:t::IF( (D17*12)=0,"",(D17*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F17:l:1:f:8:cf:2\ncell:G17:b::1:::l:1:f:8:cf:2\ncell:H17:t:Reteriment Account:b::1::1:l:5:f:7:bg:6:cf:2:colspan:3\ncell:I17:l:1:f:8:bg:6:cf:2\ncell:J17:l:1:f:8:bg:6:cf:2\ncell:K17:v:900:b::1::1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:L17:b::::1:l:1:f:8:cf:2\ncell:M17:l:1:f:8:cf:2\ncell:N17:l:1:f:8:cf:2\ncell:O17:l:1:f:8:cf:2\ncell:P17:l:1:f:8:cf:2\ncell:Q17:l:1:f:8:cf:2\ncell:R17:l:1:f:8:cf:2\ncell:S17:l:1:f:8:cf:2\ncell:B18:b::1:::l:1:f:8:cf:2\ncell:C18:t:Social Security Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D18:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E18:b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F18:l:1:f:8:cf:2\ncell:G18:b::1:::l:1:f:8:cf:2\ncell:H18:t:Other Deductions:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I18:b:::1::l:1:f:8:cf:2\ncell:J18:b:::1::l:1:f:8:cf:2\ncell:K18:b::1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:L18:b::::1:l:1:f:8:cf:2\ncell:M18:l:1:f:8:cf:2\ncell:N18:l:1:f:8:cf:2\ncell:O18:l:1:f:8:cf:2\ncell:P18:l:1:f:8:cf:2\ncell:Q18:l:1:f:8:cf:2\ncell:R18:l:1:f:8:cf:2\ncell:S18:l:1:f:8:cf:2\ncell:B19:b::1:::l:1:f:8:cf:2\ncell:C19:t:Alimony:b::1::1:l:5:f:7:cf:2\ncell:D19:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E19:vtf:t::IF( (D19*12)=0,"",(D19*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F19:l:1:f:8:cf:2\ncell:G19:l:1:f:8:cf:2\ncell:H19:t:Total:l:3:f:2:c:7:bg:3:cf:1:colspan:3\ncell:I19:l:1:f:8:c:7:bg:3:cf:2\ncell:J19:l:1:f:8:c:7:bg:3:cf:2\ncell:K19:vtf:n:900:SUM(K13\\cK18):l:4:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:L19:b:::1::l:1:f:8:cf:2\ncell:M19:l:1:f:8:cf:2\ncell:N19:l:1:f:8:cf:2\ncell:O19:l:1:f:8:cf:2\ncell:P19:l:1:f:8:cf:2\ncell:Q19:l:1:f:8:cf:2\ncell:R19:l:1:f:8:cf:2\ncell:S19:l:1:f:8:cf:2\ncell:B20:b::1:::l:1:f:8:cf:2\ncell:C20:t:Child Support:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D20:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E20:vtf:t::IF( (D20*12)=0,"",(D20*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F20:l:1:f:8:cf:2\ncell:G20:l:1:f:8:cf:2\ncell:H20:l:1:f:8:cf:2\ncell:I20:l:1:f:8:cf:2\ncell:J20:l:1:f:8:cf:2\ncell:K20:l:1:f:8:cf:2\ncell:L20:b:1:1:::l:1:f:8:cf:2\ncell:M20:b::::1:l:1:f:8:cf:2\ncell:N20:l:1:f:8:cf:2\ncell:O20:l:1:f:8:cf:2\ncell:P20:l:1:f:8:cf:2\ncell:Q20:l:1:f:8:cf:2\ncell:R20:l:1:f:8:cf:2\ncell:S20:l:1:f:8:cf:2\ncell:B21:b::1:::l:1:f:8:cf:2\ncell:C21:t:Other Income:b::1::1:l:5:f:7:cf:2\ncell:D21:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E21:vtf:t::IF( (D21*12)=0,"",(D21*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F21:l:1:f:8:cf:2\ncell:G21:l:1:f:8:cf:2\ncell:H21:l:1:f:8:cf:2\ncell:I21:l:1:f:8:cf:2\ncell:J21:l:3:f:2:cf:1\ncell:K21:l:1:f:8:cf:2\ncell:L21:b::1:1::l:1:f:8:cf:2\ncell:M21:b::::1:l:1:f:8:cf:2\ncell:N21:l:1:f:8:cf:2\ncell:O21:l:1:f:8:cf:2\ncell:P21:l:1:f:8:cf:2\ncell:Q21:l:1:f:8:cf:2\ncell:R21:l:1:f:8:cf:2\ncell:S21:l:1:f:8:cf:2\ncell:B22:b::1:::l:1:f:8:cf:2\ncell:C22:t:Deduction:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D22:vtf:n:900:K19:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E22:vtf:n:10800:IF( (D22*12)=0,"",(D22*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F22:b:1::::l:1:f:8:cf:2\ncell:G22:b:1::::l:1:f:8:cf:2\ncell:H22:b:1::::l:1:f:8:cf:2\ncell:I22:b:1::::l:1:f:8:cf:2\ncell:J22:b:1::::l:1:f:8:cf:2\ncell:K22:b:1::::l:1:f:8:cf:2\ncell:L22:l:1:f:8:cf:2\ncell:M22:l:1:f:8:cf:2\ncell:N22:l:1:f:8:cf:2\ncell:O22:l:1:f:8:cf:2\ncell:P22:l:1:f:8:cf:2\ncell:Q22:l:1:f:8:cf:2\ncell:R22:l:1:f:8:cf:2\ncell:S22:l:1:f:8:cf:2\ncell:B23:l:1:f:8:cf:2\ncell:C23:t:Total Take Home Income:l:3:f:2:c:7:bg:3:cf:1\ncell:D23:vtf:n:37112:(SUM(D9\\cD21)-D22):l:3:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:E23:vtf:n:445344:IF( (D23*12)=0,"",(D23*12)):l:3:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:F23:l:1:f:8:cf:2\ncell:G23:l:1:f:8:cf:2\ncell:H23:l:1:f:8:cf:2\ncell:I23:l:1:f:8:cf:2\ncell:J23:l:1:f:8:cf:2\ncell:K23:l:1:f:8:cf:2\ncell:L23:l:1:f:8:cf:2\ncell:M23:l:1:f:8:cf:2\ncell:N23:l:1:f:8:cf:2\ncell:O23:l:1:f:8:cf:2\ncell:P23:l:1:f:8:cf:2\ncell:Q23:l:1:f:8:cf:2\ncell:R23:l:1:f:8:cf:2\ncell:S23:l:1:f:8:cf:2\ncell:B24:l:1:f:8:cf:2\ncell:F24:l:1:f:8:cf:2\ncell:G24:l:1:f:8:cf:2\ncell:H24:l:1:f:8:cf:2\ncell:I24:l:1:f:8:cf:2\ncell:J24:l:1:f:8:cf:2\ncell:K24:l:1:f:8:cf:2\ncell:L24:l:1:f:8:cf:2\ncell:M24:l:1:f:8:cf:2\ncell:N24:l:1:f:8:cf:2\ncell:O24:l:1:f:8:cf:2\ncell:P24:l:1:f:8:cf:2\ncell:Q24:l:1:f:8:cf:2\ncell:R24:l:1:f:8:cf:2\ncell:S24:l:1:f:8:cf:2\ncell:A25:l:1:f:10:cf:2\ncell:B25:l:1:f:6:cf:2\ncell:C25:l:1:f:11:cf:2\ncell:D25:l:1:f:11:cf:2\ncell:E25:l:1:f:8:cf:2\ncell:F25:l:1:f:8:cf:2\ncell:G25:l:1:f:8:cf:2\ncell:H25:l:1:f:8:cf:2\ncell:I25:l:1:f:8:cf:2\ncell:J25:l:1:f:8:cf:2\ncell:K25:l:1:f:8:cf:2\ncell:L25:l:1:f:8:cf:2\ncell:M25:l:1:f:8:cf:2\ncell:N25:l:1:f:8:cf:2\ncell:O25:l:1:f:8:cf:2\ncell:P25:l:1:f:8:cf:2\ncell:Q25:l:1:f:8:cf:2\ncell:R25:l:1:f:8:cf:2\ncell:S25:l:1:f:8:cf:2\ncell:A26:l:1:f:10:cf:2\ncell:B26:l:1:f:6:cf:2\ncell:C26:l:1:f:6:cf:2\ncell:D26:l:1:f:11:cf:2\ncell:E26:l:1:f:11:cf:2\ncell:F26:l:1:f:11:cf:2\ncell:G26:l:1:f:11:cf:2\ncell:H26:l:1:f:8:cf:2\ncell:I26:l:1:f:8:cf:2\ncell:J26:l:1:f:8:cf:2\ncell:K26:l:1:f:8:cf:2\ncell:L26:l:1:f:8:cf:2\ncell:M26:l:1:f:8:cf:2\ncell:N26:l:1:f:8:cf:2\ncell:O26:l:1:f:8:cf:2\ncell:P26:l:1:f:8:cf:2\ncell:Q26:l:1:f:8:cf:2\ncell:R26:l:1:f:8:cf:2\ncell:S26:l:1:f:8:cf:2\ncell:L27:l:1:f:8:cf:2\ncell:M27:l:1:f:8:cf:2\ncell:N27:l:1:f:8:cf:2\ncell:O27:l:1:f:8:cf:2\ncell:P27:l:1:f:8:cf:2\ncell:Q27:l:1:f:8:cf:2\ncell:R27:l:1:f:8:cf:2\ncell:S27:l:1:f:8:cf:2\ncell:L28:l:1:f:8:cf:2\ncell:M28:l:1:f:8:cf:2\ncell:N28:l:1:f:8:cf:2\ncell:O28:l:1:f:8:cf:2\ncell:P28:l:1:f:8:cf:2\ncell:Q28:l:1:f:8:cf:2\ncell:R28:l:1:f:8:cf:2\ncell:S28:l:1:f:8:cf:2\ncell:L29:l:1:f:8:cf:2\ncell:M29:l:1:f:8:cf:2\ncell:N29:l:1:f:8:cf:2\ncell:O29:l:1:f:8:cf:2\ncell:P29:l:1:f:8:cf:2\ncell:Q29:l:1:f:8:cf:2\ncell:R29:l:1:f:8:cf:2\ncell:S29:l:1:f:8:cf:2\ncell:L30:l:1:f:8:cf:2\ncell:M30:l:1:f:8:cf:2\ncell:N30:l:1:f:8:cf:2\ncell:O30:l:1:f:8:cf:2\ncell:P30:l:1:f:8:cf:2\ncell:Q30:l:1:f:8:cf:2\ncell:R30:l:1:f:8:cf:2\ncell:S30:l:1:f:8:cf:2\ncell:L31:l:1:f:8:cf:2\ncell:M31:l:1:f:8:cf:2\ncell:N31:l:1:f:8:cf:2\ncell:L32:l:1:f:8:cf:2\ncell:M32:l:1:f:8:cf:2\ncell:N32:l:1:f:8:cf:2\ncell:L33:l:1:f:8:cf:2\ncell:M33:l:1:f:8:cf:2\ncell:N33:l:1:f:8:cf:2\ncell:L34:l:1:f:8:cf:2\ncell:M34:l:1:f:8:cf:2\ncell:N34:l:1:f:8:cf:2\ncell:L35:l:1:f:8:cf:2\ncell:M35:l:1:f:8:cf:2\ncell:N35:l:1:f:8:cf:2\ncell:L36:l:1:f:8:cf:2\ncell:M36:l:1:f:8:cf:2\ncell:N36:l:1:f:8:cf:2\ncell:L37:l:1:f:8:cf:2\ncell:M37:l:1:f:8:cf:2\ncell:N37:l:1:f:8:cf:2\ncell:L38:l:1:f:8:cf:2\ncell:M38:l:1:f:8:cf:2\ncell:N38:l:1:f:8:cf:2\ncell:L39:l:1:f:8:cf:2\ncell:M39:l:1:f:8:cf:2\ncell:N39:l:1:f:8:cf:2\ncell:L40:l:1:f:8:cf:2\ncell:M40:l:1:f:8:cf:2\ncell:N40:l:1:f:8:cf:2\ncell:L41:l:1:f:8:cf:2\ncell:M41:l:1:f:8:cf:2\ncell:N41:l:1:f:8:cf:2\ncell:L42:l:1:f:8:cf:2\ncell:M42:l:1:f:8:cf:2\ncell:N42:l:1:f:8:cf:2\ncell:L43:l:1:f:8:cf:2\ncell:M43:l:1:f:8:cf:2\ncell:N43:l:1:f:8:cf:2\ncell:L44:l:1:f:8:cf:2\ncell:M44:l:1:f:8:cf:2\ncell:N44:l:1:f:8:cf:2\ncell:O44:l:1:f:8:cf:2\ncell:P44:l:1:f:8:cf:2\ncell:Q44:l:1:f:8:cf:2\ncell:R44:l:1:f:8:cf:2\ncell:S44:l:1:f:8:cf:2\ncell:L45:l:1:f:8:cf:2\ncell:M45:l:1:f:8:cf:2\ncell:N45:l:1:f:8:cf:2\ncell:O45:l:1:f:8:cf:2\ncell:P45:l:1:f:8:cf:2\ncell:Q45:l:1:f:8:cf:2\ncell:R45:l:1:f:8:cf:2\ncell:S45:l:1:f:8:cf:2\ncell:L46:l:1:f:8:cf:2\ncell:M46:l:1:f:8:cf:2\ncell:N46:l:1:f:8:cf:2\ncell:O46:l:1:f:8:cf:2\ncell:P46:l:1:f:8:cf:2\ncell:Q46:l:1:f:8:cf:2\ncell:R46:l:1:f:8:cf:2\ncell:S46:l:1:f:8:cf:2\ncell:L47:l:1:f:8:cf:2\ncell:M47:l:1:f:8:cf:2\ncell:N47:l:1:f:8:cf:2\ncell:O47:l:1:f:8:cf:2\ncell:P47:l:1:f:8:cf:2\ncell:Q47:l:1:f:8:cf:2\ncell:R47:l:1:f:8:cf:2\ncell:S47:l:1:f:8:cf:2\ncell:L48:l:1:f:8:cf:2\ncell:M48:l:1:f:8:cf:2\ncell:N48:l:1:f:8:cf:2\ncell:O48:l:1:f:8:cf:2\ncell:P48:l:1:f:8:cf:2\ncell:Q48:l:1:f:8:cf:2\ncell:R48:l:1:f:8:cf:2\ncell:S48:l:1:f:8:cf:2\ncell:L49:l:1:f:8:cf:2\ncell:M49:l:1:f:8:cf:2\ncell:N49:l:1:f:8:cf:2\ncell:O49:l:1:f:8:cf:2\ncell:P49:l:1:f:8:cf:2\ncell:Q49:l:1:f:8:cf:2\ncell:R49:l:1:f:8:cf:2\ncell:S49:l:1:f:8:cf:2\ncell:L50:l:1:f:8:cf:2\ncell:M50:l:1:f:8:cf:2\ncell:N50:l:1:f:8:cf:2\ncell:O50:l:1:f:8:cf:2\ncell:P50:l:1:f:8:cf:2\ncell:Q50:l:1:f:8:cf:2\ncell:R50:l:1:f:8:cf:2\ncell:S50:l:1:f:8:cf:2\ncell:L51:l:1:f:8:cf:2\ncell:M51:l:1:f:8:cf:2\ncell:N51:l:1:f:8:cf:2\ncell:O51:l:1:f:8:cf:2\ncell:P51:l:1:f:8:cf:2\ncell:Q51:l:1:f:8:cf:2\ncell:R51:l:1:f:8:cf:2\ncell:S51:l:1:f:8:cf:2\ncell:L52:l:1:f:8:cf:2\ncell:M52:l:1:f:8:cf:2\ncell:N52:l:1:f:8:cf:2\ncell:O52:l:1:f:8:cf:2\ncell:P52:l:1:f:8:cf:2\ncell:Q52:l:1:f:8:cf:2\ncell:R52:l:1:f:8:cf:2\ncell:S52:l:1:f:8:cf:2\ncell:L53:l:1:f:8:cf:2\ncell:M53:l:1:f:8:cf:2\ncell:N53:l:1:f:8:cf:2\ncell:O53:l:1:f:8:cf:2\ncell:P53:l:1:f:8:cf:2\ncell:Q53:l:1:f:8:cf:2\ncell:R53:l:1:f:8:cf:2\ncell:S53:l:1:f:8:cf:2\ncell:L54:l:1:f:8:cf:2\ncell:M54:l:1:f:8:cf:2\ncell:N54:l:1:f:8:cf:2\ncell:O54:l:1:f:8:cf:2\ncell:P54:l:1:f:8:cf:2\ncell:Q54:l:1:f:8:cf:2\ncell:R54:l:1:f:8:cf:2\ncell:S54:l:1:f:8:cf:2\ncell:L55:l:1:f:8:cf:2\ncell:M55:l:1:f:8:cf:2\ncell:N55:l:1:f:8:cf:2\ncell:O55:l:1:f:8:cf:2\ncell:P55:l:1:f:8:cf:2\ncell:Q55:l:1:f:8:cf:2\ncell:R55:l:1:f:8:cf:2\ncell:S55:l:1:f:8:cf:2\ncell:L56:l:1:f:8:cf:2\ncell:M56:l:1:f:8:cf:2\ncell:N56:l:1:f:8:cf:2\ncell:O56:l:1:f:8:cf:2\ncell:P56:l:1:f:8:cf:2\ncell:Q56:l:1:f:8:cf:2\ncell:R56:l:1:f:8:cf:2\ncell:S56:l:1:f:8:cf:2\ncell:L57:l:1:f:8:cf:2\ncell:M57:l:1:f:8:cf:2\ncell:N57:l:1:f:8:cf:2\ncell:O57:l:1:f:8:cf:2\ncell:P57:l:1:f:8:cf:2\ncell:Q57:l:1:f:8:cf:2\ncell:R57:l:1:f:8:cf:2\ncell:S57:l:1:f:8:cf:2\ncell:L58:l:1:f:8:cf:2\ncell:M58:l:1:f:8:cf:2\ncell:N58:l:1:f:8:cf:2\ncell:O58:l:1:f:8:cf:2\ncell:P58:l:1:f:8:cf:2\ncell:Q58:l:1:f:8:cf:2\ncell:R58:l:1:f:8:cf:2\ncell:S58:l:1:f:8:cf:2\ncell:L59:l:1:f:8:cf:2\ncell:M59:l:1:f:8:cf:2\ncell:N59:l:1:f:8:cf:2\ncell:O59:l:1:f:8:cf:2\ncell:P59:l:1:f:8:cf:2\ncell:Q59:l:1:f:8:cf:2\ncell:R59:l:1:f:8:cf:2\ncell:S59:l:1:f:8:cf:2\ncell:L60:l:1:f:8:cf:2\ncell:M60:l:1:f:8:cf:2\ncell:N60:l:1:f:8:cf:2\ncell:O60:l:1:f:8:cf:2\ncell:P60:l:1:f:8:cf:2\ncell:Q60:l:1:f:8:cf:2\ncell:R60:l:1:f:8:cf:2\ncell:S60:l:1:f:8:cf:2\ncell:L61:l:1:f:8:cf:2\ncell:M61:l:1:f:8:cf:2\ncell:N61:l:1:f:8:cf:2\ncell:O61:l:1:f:8:cf:2\ncell:P61:l:1:f:8:cf:2\ncell:Q61:l:1:f:8:cf:2\ncell:R61:l:1:f:8:cf:2\ncell:S61:l:1:f:8:cf:2\ncell:L62:l:1:f:8:cf:2\ncell:M62:l:1:f:8:cf:2\ncell:N62:l:1:f:8:cf:2\ncell:O62:l:1:f:8:cf:2\ncell:P62:l:1:f:8:cf:2\ncell:Q62:l:1:f:8:cf:2\ncell:R62:l:1:f:8:cf:2\ncell:S62:l:1:f:8:cf:2\ncell:L63:l:1:f:8:cf:2\ncell:M63:l:1:f:8:cf:2\ncell:N63:l:1:f:8:cf:2\ncell:O63:l:1:f:8:cf:2\ncell:P63:l:1:f:8:cf:2\ncell:Q63:l:1:f:8:cf:2\ncell:R63:l:1:f:8:cf:2\ncell:S63:l:1:f:8:cf:2\ncell:L64:l:1:f:8:cf:2\ncell:M64:l:1:f:8:cf:2\ncell:N64:l:1:f:8:cf:2\ncell:O64:l:1:f:8:cf:2\ncell:P64:l:1:f:8:cf:2\ncell:Q64:l:1:f:8:cf:2\ncell:R64:l:1:f:8:cf:2\ncell:S64:l:1:f:8:cf:2\ncell:L65:l:1:f:8:cf:2\ncell:M65:l:1:f:8:cf:2\ncell:N65:l:1:f:8:cf:2\ncell:O65:l:1:f:8:cf:2\ncell:P65:l:1:f:8:cf:2\ncell:Q65:l:1:f:8:cf:2\ncell:R65:l:1:f:8:cf:2\ncell:S65:l:1:f:8:cf:2\ncell:L66:l:1:f:8:cf:2\ncell:M66:l:1:f:8:cf:2\ncell:N66:l:1:f:8:cf:2\ncell:O66:l:1:f:8:cf:2\ncell:P66:l:1:f:8:cf:2\ncell:Q66:l:1:f:8:cf:2\ncell:R66:l:1:f:8:cf:2\ncell:S66:l:1:f:8:cf:2\ncell:L67:l:1:f:8:cf:2\ncell:M67:l:1:f:8:cf:2\ncell:N67:l:1:f:8:cf:2\ncell:O67:l:1:f:8:cf:2\ncell:P67:l:1:f:8:cf:2\ncell:Q67:l:1:f:8:cf:2\ncell:R67:l:1:f:8:cf:2\ncell:S67:l:1:f:8:cf:2\ncell:L68:l:1:f:8:cf:2\ncell:M68:l:1:f:8:cf:2\ncell:N68:l:1:f:8:cf:2\ncell:O68:l:1:f:8:cf:2\ncell:P68:l:1:f:8:cf:2\ncell:Q68:l:1:f:8:cf:2\ncell:R68:l:1:f:8:cf:2\ncell:S68:l:1:f:8:cf:2\ncell:L69:l:1:f:8:cf:2\ncell:M69:l:1:f:8:cf:2\ncell:N69:l:1:f:8:cf:2\ncell:O69:l:1:f:8:cf:2\ncell:P69:l:1:f:8:cf:2\ncell:Q69:l:1:f:8:cf:2\ncell:R69:l:1:f:8:cf:2\ncell:S69:l:1:f:8:cf:2\ncell:L70:l:1:f:8:cf:2\ncell:M70:l:1:f:8:cf:2\ncell:N70:l:1:f:8:cf:2\ncell:O70:l:1:f:8:cf:2\ncell:P70:l:1:f:8:cf:2\ncell:Q70:l:1:f:8:cf:2\ncell:R70:l:1:f:8:cf:2\ncell:S70:l:1:f:8:cf:2\ncell:L71:l:1:f:8:cf:2\ncell:M71:l:1:f:8:cf:2\ncell:N71:l:1:f:8:cf:2\ncell:O71:l:1:f:8:cf:2\ncell:P71:l:1:f:8:cf:2\ncell:Q71:l:1:f:8:cf:2\ncell:R71:l:1:f:8:cf:2\ncell:S71:l:1:f:8:cf:2\ncell:L72:l:1:f:8:cf:2\ncell:M72:l:1:f:8:cf:2\ncell:N72:l:1:f:8:cf:2\ncell:O72:l:1:f:8:cf:2\ncell:P72:l:1:f:8:cf:2\ncell:Q72:l:1:f:8:cf:2\ncell:R72:l:1:f:8:cf:2\ncell:S72:l:1:f:8:cf:2\ncell:L73:l:1:f:8:cf:2\ncell:M73:l:1:f:8:cf:2\ncell:N73:l:1:f:8:cf:2\ncell:O73:l:1:f:8:cf:2\ncell:P73:l:1:f:8:cf:2\ncell:Q73:l:1:f:8:cf:2\ncell:R73:l:1:f:8:cf:2\ncell:S73:l:1:f:8:cf:2\ncell:L74:l:1:f:8:cf:2\ncell:M74:l:1:f:8:cf:2\ncell:N74:l:1:f:8:cf:2\ncell:O74:l:1:f:8:cf:2\ncell:P74:l:1:f:8:cf:2\ncell:Q74:l:1:f:8:cf:2\ncell:R74:l:1:f:8:cf:2\ncell:S74:l:1:f:8:cf:2\ncell:L75:l:1:f:8:cf:2\ncell:M75:l:1:f:8:cf:2\ncell:N75:l:1:f:8:cf:2\ncell:O75:l:1:f:8:cf:2\ncell:P75:l:1:f:8:cf:2\ncell:Q75:l:1:f:8:cf:2\ncell:R75:l:1:f:8:cf:2\ncell:S75:l:1:f:8:cf:2\ncell:L76:l:1:f:8:cf:2\ncell:M76:l:1:f:8:cf:2\ncell:N76:l:1:f:8:cf:2\ncell:O76:l:1:f:8:cf:2\ncell:P76:l:1:f:8:cf:2\ncell:Q76:l:1:f:8:cf:2\ncell:R76:l:1:f:8:cf:2\ncell:S76:l:1:f:8:cf:2\ncell:L77:l:1:f:8:cf:2\ncell:M77:l:1:f:8:cf:2\ncell:N77:l:1:f:8:cf:2\ncell:O77:l:1:f:8:cf:2\ncell:P77:l:1:f:8:cf:2\ncell:Q77:l:1:f:8:cf:2\ncell:R77:l:1:f:8:cf:2\ncell:S77:l:1:f:8:cf:2\ncell:L78:l:1:f:8:cf:2\ncell:M78:l:1:f:8:cf:2\ncell:N78:l:1:f:8:cf:2\ncell:O78:l:1:f:8:cf:2\ncell:P78:l:1:f:8:cf:2\ncell:Q78:l:1:f:8:cf:2\ncell:R78:l:1:f:8:cf:2\ncell:S78:l:1:f:8:cf:2\ncell:L79:l:1:f:8:cf:2\ncell:M79:l:1:f:8:cf:2\ncell:N79:l:1:f:8:cf:2\ncell:O79:l:1:f:8:cf:2\ncell:P79:l:1:f:8:cf:2\ncell:Q79:l:1:f:8:cf:2\ncell:R79:l:1:f:8:cf:2\ncell:S79:l:1:f:8:cf:2\ncell:L80:l:1:f:8:cf:2\ncell:M80:l:1:f:8:cf:2\ncell:N80:l:1:f:8:cf:2\ncell:O80:l:1:f:8:cf:2\ncell:P80:l:1:f:8:cf:2\ncell:Q80:l:1:f:8:cf:2\ncell:R80:l:1:f:8:cf:2\ncell:S80:l:1:f:8:cf:2\ncell:L81:l:1:f:8:cf:2\ncell:M81:l:1:f:8:cf:2\ncell:N81:l:1:f:8:cf:2\ncell:O81:l:1:f:8:cf:2\ncell:P81:l:1:f:8:cf:2\ncell:Q81:l:1:f:8:cf:2\ncell:R81:l:1:f:8:cf:2\ncell:S81:l:1:f:8:cf:2\ncell:L82:l:1:f:8:cf:2\ncell:M82:l:1:f:8:cf:2\ncell:N82:l:1:f:8:cf:2\ncell:O82:l:1:f:8:cf:2\ncell:P82:l:1:f:8:cf:2\ncell:Q82:l:1:f:8:cf:2\ncell:R82:l:1:f:8:cf:2\ncell:S82:l:1:f:8:cf:2\ncell:L83:l:1:f:8:cf:2\ncell:M83:l:1:f:8:cf:2\ncell:N83:l:1:f:8:cf:2\ncell:O83:l:1:f:8:cf:2\ncell:P83:l:1:f:8:cf:2\ncell:Q83:l:1:f:8:cf:2\ncell:R83:l:1:f:8:cf:2\ncell:S83:l:1:f:8:cf:2\ncell:L84:l:1:f:8:cf:2\ncell:M84:l:1:f:8:cf:2\ncell:N84:l:1:f:8:cf:2\ncell:O84:l:1:f:8:cf:2\ncell:P84:l:1:f:8:cf:2\ncell:Q84:l:1:f:8:cf:2\ncell:R84:l:1:f:8:cf:2\ncell:S84:l:1:f:8:cf:2\ncell:L85:l:1:f:8:cf:2\ncell:M85:l:1:f:8:cf:2\ncell:N85:l:1:f:8:cf:2\ncell:O85:l:1:f:8:cf:2\ncell:P85:l:1:f:8:cf:2\ncell:Q85:l:1:f:8:cf:2\ncell:R85:l:1:f:8:cf:2\ncell:S85:l:1:f:8:cf:2\ncell:L86:l:1:f:8:cf:2\ncell:M86:l:1:f:8:cf:2\ncell:N86:l:1:f:8:cf:2\ncell:O86:l:1:f:8:cf:2\ncell:P86:l:1:f:8:cf:2\ncell:Q86:l:1:f:8:cf:2\ncell:R86:l:1:f:8:cf:2\ncell:S86:l:1:f:8:cf:2\ncell:L87:l:1:f:8:cf:2\ncell:M87:l:1:f:8:cf:2\ncell:N87:l:1:f:8:cf:2\ncell:O87:l:1:f:8:cf:2\ncell:P87:l:1:f:8:cf:2\ncell:Q87:l:1:f:8:cf:2\ncell:R87:l:1:f:8:cf:2\ncell:S87:l:1:f:8:cf:2\ncell:L88:l:1:f:8:cf:2\ncell:M88:l:1:f:8:cf:2\ncell:N88:l:1:f:8:cf:2\ncell:O88:l:1:f:8:cf:2\ncell:P88:l:1:f:8:cf:2\ncell:Q88:l:1:f:8:cf:2\ncell:R88:l:1:f:8:cf:2\ncell:S88:l:1:f:8:cf:2\ncell:L89:l:1:f:8:cf:2\ncell:M89:l:1:f:8:cf:2\ncell:N89:l:1:f:8:cf:2\ncell:O89:l:1:f:8:cf:2\ncell:P89:l:1:f:8:cf:2\ncell:Q89:l:1:f:8:cf:2\ncell:R89:l:1:f:8:cf:2\ncell:S89:l:1:f:8:cf:2\ncell:L90:l:1:f:8:cf:2\ncell:M90:l:1:f:8:cf:2\ncell:N90:l:1:f:8:cf:2\ncell:O90:l:1:f:8:cf:2\ncell:P90:l:1:f:8:cf:2\ncell:Q90:l:1:f:8:cf:2\ncell:R90:l:1:f:8:cf:2\ncell:S90:l:1:f:8:cf:2\ncell:L91:l:1:f:8:cf:2\ncell:M91:l:1:f:8:cf:2\ncell:N91:l:1:f:8:cf:2\ncell:O91:l:1:f:8:cf:2\ncell:P91:l:1:f:8:cf:2\ncell:Q91:l:1:f:8:cf:2\ncell:R91:l:1:f:8:cf:2\ncell:S91:l:1:f:8:cf:2\ncell:L92:l:1:f:8:cf:2\ncell:M92:l:1:f:8:cf:2\ncell:N92:l:1:f:8:cf:2\ncell:O92:l:1:f:8:cf:2\ncell:P92:l:1:f:8:cf:2\ncell:Q92:l:1:f:8:cf:2\ncell:R92:l:1:f:8:cf:2\ncell:S92:l:1:f:8:cf:2\ncell:L93:l:1:f:8:cf:2\ncell:M93:l:1:f:8:cf:2\ncell:N93:l:1:f:8:cf:2\ncell:O93:l:1:f:8:cf:2\ncell:P93:l:1:f:8:cf:2\ncell:Q93:l:1:f:8:cf:2\ncell:R93:l:1:f:8:cf:2\ncell:S93:l:1:f:8:cf:2\ncell:L94:l:1:f:8:cf:2\ncell:M94:l:1:f:8:cf:2\ncell:N94:l:1:f:8:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:S94:l:1:f:8:cf:2\ncell:L95:l:1:f:8:cf:2\ncell:M95:l:1:f:8:cf:2\ncell:N95:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:S95:l:1:f:8:cf:2\ncell:L96:l:1:f:10:cf:2\ncell:M96:l:1:f:10:cf:2\ncell:N96:l:1:f:10:cf:2\ncell:O96:l:1:f:10:cf:2\ncell:P96:l:1:f:10:cf:2\ncell:Q96:l:1:f:10:cf:2\ncell:R96:l:1:f:10:cf:2\ncell:S96:l:1:f:10:cf:2\ncell:L97:l:1:f:10:cf:2\ncell:M97:l:1:f:10:cf:2\ncell:N97:l:1:f:10:cf:2\ncell:O97:l:1:f:10:cf:2\ncell:P97:l:1:f:10:cf:2\ncell:Q97:l:1:f:10:cf:2\ncell:R97:l:1:f:10:cf:2\ncell:S97:l:1:f:10:cf:2\ncell:L98:l:1:f:10:cf:2\ncell:M98:l:1:f:10:cf:2\ncell:N98:l:1:f:10:cf:2\ncell:O98:l:1:f:10:cf:2\ncell:P98:l:1:f:10:cf:2\ncell:Q98:l:1:f:10:cf:2\ncell:R98:l:1:f:10:cf:2\ncell:S98:l:1:f:10:cf:2\ncell:L99:l:1:f:10:cf:2\ncell:M99:l:1:f:10:cf:2\ncell:N99:l:1:f:10:cf:2\ncell:O99:l:1:f:10:cf:2\ncell:P99:l:1:f:10:cf:2\ncell:Q99:l:1:f:10:cf:2\ncell:R99:l:1:f:10:cf:2\ncell:S99:l:1:f:10:cf:2\ncell:A100:l:1:f:10:cf:2\ncell:B100:l:1:f:10:cf:2\ncell:K100:l:1:f:10:cf:2\ncell:L100:l:1:f:10:cf:2\ncell:M100:l:1:f:10:cf:2\ncell:N100:l:1:f:10:cf:2\ncell:O100:l:1:f:10:cf:2\ncell:P100:l:1:f:10:cf:2\ncell:Q100:l:1:f:10:cf:2\ncell:R100:l:1:f:10:cf:2\ncell:S100:l:1:f:10:cf:2\ncell:A101:l:1:f:10:cf:2\ncell:B101:l:1:f:10:cf:2\ncell:K101:l:1:f:10:cf:2\ncell:L101:l:1:f:10:cf:2\ncell:M101:l:1:f:10:cf:2\ncell:N101:l:1:f:10:cf:2\ncell:O101:l:1:f:10:cf:2\ncell:P101:l:1:f:10:cf:2\ncell:Q101:l:1:f:10:cf:2\ncell:R101:l:1:f:10:cf:2\ncell:S101:l:1:f:10:cf:2\ncell:A102:l:1:f:10:cf:2\ncell:B102:l:1:f:10:cf:2\ncell:K102:l:1:f:10:cf:2\ncell:L102:l:1:f:10:cf:2\ncell:M102:l:1:f:10:cf:2\ncell:N102:l:1:f:10:cf:2\ncell:O102:l:1:f:10:cf:2\ncell:P102:l:1:f:10:cf:2\ncell:Q102:l:1:f:10:cf:2\ncell:R102:l:1:f:10:cf:2\ncell:S102:l:1:f:10:cf:2\ncell:A103:l:1:f:10:cf:2\ncell:B103:l:1:f:10:cf:2\ncell:K103:l:1:f:10:cf:2\ncell:L103:l:1:f:10:cf:2\ncell:M103:l:1:f:10:cf:2\ncell:N103:l:1:f:10:cf:2\ncell:O103:l:1:f:10:cf:2\ncell:P103:l:1:f:10:cf:2\ncell:Q103:l:1:f:10:cf:2\ncell:R103:l:1:f:10:cf:2\ncell:S103:l:1:f:10:cf:2\ncell:A104:l:1:f:10:cf:2\ncell:B104:l:1:f:10:cf:2\ncell:K104:l:1:f:10:cf:2\ncell:L104:l:1:f:10:cf:2\ncell:M104:l:1:f:10:cf:2\ncell:N104:l:1:f:10:cf:2\ncell:O104:l:1:f:10:cf:2\ncell:P104:l:1:f:10:cf:2\ncell:Q104:l:1:f:10:cf:2\ncell:R104:l:1:f:10:cf:2\ncell:S104:l:1:f:10:cf:2\ncell:A105:l:1:f:10:cf:2\ncell:B105:l:1:f:10:cf:2\ncell:K105:l:1:f:10:cf:2\ncell:L105:l:1:f:10:cf:2\ncell:M105:l:1:f:10:cf:2\ncell:N105:l:1:f:10:cf:2\ncell:O105:l:1:f:10:cf:2\ncell:P105:l:1:f:10:cf:2\ncell:Q105:l:1:f:10:cf:2\ncell:R105:l:1:f:10:cf:2\ncell:S105:l:1:f:10:cf:2\ncell:A106:l:1:f:10:cf:2\ncell:B106:l:1:f:10:cf:2\ncell:K106:l:1:f:10:cf:2\ncell:L106:l:1:f:10:cf:2\ncell:M106:l:1:f:10:cf:2\ncell:N106:l:1:f:10:cf:2\ncell:O106:l:1:f:10:cf:2\ncell:P106:l:1:f:10:cf:2\ncell:Q106:l:1:f:10:cf:2\ncell:R106:l:1:f:10:cf:2\ncell:S106:l:1:f:10:cf:2\ncell:A107:l:1:f:10:cf:2\ncell:B107:l:1:f:10:cf:2\ncell:K107:l:1:f:10:cf:2\ncell:L107:l:1:f:10:cf:2\ncell:M107:l:1:f:10:cf:2\ncell:N107:l:1:f:10:cf:2\ncell:O107:l:1:f:10:cf:2\ncell:P107:l:1:f:10:cf:2\ncell:Q107:l:1:f:10:cf:2\ncell:R107:l:1:f:10:cf:2\ncell:S107:l:1:f:10:cf:2\ncell:A108:l:1:f:10:cf:2\ncell:B108:l:1:f:10:cf:2\ncell:K108:l:1:f:10:cf:2\ncell:L108:l:1:f:10:cf:2\ncell:M108:l:1:f:10:cf:2\ncell:N108:l:1:f:10:cf:2\ncell:O108:l:1:f:10:cf:2\ncell:P108:l:1:f:10:cf:2\ncell:Q108:l:1:f:10:cf:2\ncell:R108:l:1:f:10:cf:2\ncell:S108:l:1:f:10:cf:2\ncell:A109:l:1:f:10:cf:2\ncell:B109:l:1:f:10:cf:2\ncell:K109:l:1:f:10:cf:2\ncell:L109:l:1:f:10:cf:2\ncell:M109:l:1:f:10:cf:2\ncell:N109:l:1:f:10:cf:2\ncell:O109:l:1:f:10:cf:2\ncell:P109:l:1:f:10:cf:2\ncell:Q109:l:1:f:10:cf:2\ncell:R109:l:1:f:10:cf:2\ncell:S109:l:1:f:10:cf:2\ncell:A110:l:1:f:10:cf:2\ncell:B110:l:1:f:10:cf:2\ncell:K110:l:1:f:10:cf:2\ncell:L110:l:1:f:10:cf:2\ncell:M110:l:1:f:10:cf:2\ncell:N110:l:1:f:10:cf:2\ncell:O110:l:1:f:10:cf:2\ncell:P110:l:1:f:10:cf:2\ncell:Q110:l:1:f:10:cf:2\ncell:R110:l:1:f:10:cf:2\ncell:S110:l:1:f:10:cf:2\ncell:A111:l:1:f:10:cf:2\ncell:B111:l:1:f:10:cf:2\ncell:K111:l:1:f:10:cf:2\ncell:L111:l:1:f:10:cf:2\ncell:M111:l:1:f:10:cf:2\ncell:N111:l:1:f:10:cf:2\ncell:O111:l:1:f:10:cf:2\ncell:P111:l:1:f:10:cf:2\ncell:Q111:l:1:f:10:cf:2\ncell:R111:l:1:f:10:cf:2\ncell:S111:l:1:f:10:cf:2\ncol:A:w:10\ncol:B:w:10\ncol:C:w:164\ncol:D:w:90\ncol:E:w:90\ncol:F:w:10\ncol:G:w:10\ncol:H:w:50\ncol:I:w:12\ncol:J:w:95\ncol:K:w:91\ncol:L:w:11\ncol:M:w:64\ncol:N:w:64\ncol:O:w:64\ncol:P:w:64\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:V:w:64\ncol:W:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:30\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:18.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:15\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nsheet:c:23:r:111:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,204)\ncolor:3:rgb(119,136,221)\ncolor:4:rgb(136,204,119)\ncolor:5:rgb(204,119,136)\ncolor:6:rgb(230,230,250)\ncolor:7:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 24pt Arial\nfont:6:normal bold 9pt Arial\nfont:7:normal normal * Arial\nfont:8:normal normal 10pt Arial\nfont:9:normal normal 12pt Arial\nfont:10:normal normal 7pt Arial\nfont:11:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:6px * 6px *;vertical-align:bottom;\nlayout:4:padding:6px * 6px 8px;vertical-align:bottom;\nlayout:5:padding:6px 4px 6px 12px;vertical-align:bottom;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\nname:COMPARISON::O37\\cQ51\nname:TRACKING::Y37\\cAA51\n', - }, - name: "income", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:8:cf:2:ntvf:2\ncell:B1:l:1:f:8:cf:2\ncell:C1:l:1:f:8:cf:2\ncell:D1:l:1:f:8:cf:2\ncell:E1:l:1:f:8:cf:2\ncell:F1:l:1:f:8:cf:2\ncell:G1:l:1:f:8:cf:2\ncell:H1:l:1:f:8:cf:2\ncell:I1:l:1:f:8:cf:2\ncell:J1:l:1:f:8:cf:2\ncell:K1:l:1:f:8:cf:2\ncell:L1:l:1:f:8:cf:2\ncell:M1:l:1:f:8:cf:2\ncell:N1:l:1:f:8:cf:2\ncell:O1:l:1:f:8:cf:2\ncell:P1:l:1:f:8:cf:2\ncell:Q1:l:1:f:8:cf:2\ncell:R1:l:1:f:8:cf:2\ncell:S1:l:1:f:8:cf:2\ncell:T1:l:1:f:8:cf:2\ncell:U1:l:1:f:8:cf:2\ncell:V1:l:1:f:8:cf:2\ncell:W1:l:1:f:8:cf:2\ncell:A2:l:1:f:8:cf:2\ncell:B2:l:1:f:8:cf:2\ncell:C2:l:1:f:8:cf:2\ncell:D2:l:1:f:8:cf:2\ncell:E2:l:1:f:8:cf:2\ncell:F2:l:1:f:8:cf:2\ncell:G2:l:1:f:8:cf:2\ncell:H2:l:1:f:8:cf:2\ncell:I2:l:1:f:8:cf:2\ncell:J2:l:1:f:8:cf:2\ncell:K2:l:1:f:8:cf:2\ncell:L2:l:1:f:8:cf:2\ncell:M2:l:1:f:8:cf:2\ncell:N2:l:1:f:8:cf:2\ncell:O2:l:1:f:8:cf:2\ncell:P2:l:1:f:8:cf:2\ncell:Q2:l:1:f:8:cf:2\ncell:R2:l:1:f:8:cf:2\ncell:S2:l:1:f:8:cf:2\ncell:T2:l:1:f:8:cf:2\ncell:U2:l:1:f:8:cf:2\ncell:V2:l:1:f:8:cf:2\ncell:W2:l:1:f:8:cf:2\ncell:A3:l:1:f:8:cf:2\ncell:B3:l:1:f:8:cf:2\ncell:C3:l:1:f:8:cf:2\ncell:D3:l:1:f:8:cf:2\ncell:G3:l:1:f:8:cf:2\ncell:H3:l:1:f:8:cf:2\ncell:I3:l:1:f:8:cf:2\ncell:J3:l:1:f:8:cf:2\ncell:K3:l:1:f:8:cf:2\ncell:L3:l:1:f:8:cf:2\ncell:M3:l:1:f:8:cf:2\ncell:N3:l:1:f:8:cf:2\ncell:O3:l:1:f:8:cf:2\ncell:P3:l:1:f:8:cf:2\ncell:Q3:t: :l:1:f:8:cf:2\ncell:R3:l:1:f:8:cf:2\ncell:S3:l:1:f:8:cf:2\ncell:T3:l:1:f:8:cf:2\ncell:U3:l:1:f:8:cf:2\ncell:V3:l:1:f:8:cf:2\ncell:W3:l:1:f:8:cf:2\ncell:B4:t:Expenses:l:2:f:4:c:1:bg:5:cf:2:colspan:3\ncell:C4:l:2:f:5:c:1:bg:5:cf:2\ncell:E4:t:Date:l:1:f:9:cf:1\ncell:F4:vtf:ndt:41131.96254792824:NOW():l:1:f:9:bg:4:cf:3:ntvf:3\ncell:O4:l:1:f:8:cf:2\ncell:P4:l:1:f:8:cf:2\ncell:Q4:l:1:f:8:cf:2\ncell:R4:l:1:f:8:cf:2\ncell:S4:l:1:f:8:cf:2\ncell:T4:l:1:f:8:cf:2\ncell:U4:l:1:f:8:cf:2\ncell:V4:l:1:f:8:cf:2\ncell:W4:l:1:f:8:cf:2\ncell:O5:t::l:2:f:8:cf:2\ncell:P5:t::l:2:f:8:cf:2\ncell:Q5:t::l:2:f:8:cf:2\ncell:R5:t::l:2:f:8:cf:2\ncell:S5:t::l:2:f:8:cf:2\ncell:T5:l:1:f:8:cf:2\ncell:U5:l:1:f:8:cf:2\ncell:V5:l:1:f:8:cf:2\ncell:W5:l:1:f:8:cf:2\ncell:B6:l:2:f:3:cf:2:colspan:3\ncell:C6:l:2:f:3:bg:4:cf:2\ncell:D6:t:Source:l:2:f:2:bg:4:cf:1\ncell:E6:t:Monthly Budget:b:2:2:2:2:l:2:f:2:c:5:bg:3:cf:1\ncell:F6:t:Yearly Budget:b:2:2:2:2:l:2:f:2:c:5:bg:2:cf:1\ncell:O6:t::l:2:f:3:cf:2\ncell:P6:t::l:2:f:8:cf:2\ncell:Q6:t::l:2:f:8:cf:2\ncell:R6:t::l:2:f:8:cf:2\ncell:S6:l:1:f:8:cf:2\ncell:T6:l:1:f:8:cf:2\ncell:U6:l:1:f:8:cf:2\ncell:V6:l:1:f:8:cf:2\ncell:W6:l:1:f:8:cf:2\ncell:B7:t:Housing:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:2:colspan:3\ncell:C7:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:2\ncell:D7:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:1\ncell:E7:vtf:n:1380:E8+E14+E21+E24:b:2:2:2:2:l:4:f:2:c:5:bg:2:ntvf:1\ncell:F7:vtf:n:16560:IF( (E7*12)=0,"",(E7*12)):b:2:2:2:2:l:4:f:2:c:5:bg:2:ntvf:1\ncell:G7:b::::1\ncell:O7:l:2:f:3:cf:2\ncell:P7:l:2:f:8:cf:2\ncell:Q7:l:2:f:8:cf:2\ncell:R7:l:2:f:8:cf:2\ncell:S7:l:1:f:8:cf:2\ncell:T7:l:1:f:8:cf:2\ncell:U7:l:1:f:8:cf:2\ncell:V7:l:1:f:8:cf:2\ncell:W7:l:1:f:8:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:c:1:bg:6\ncell:C8:t:Home:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D8:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E8:vtf:n:818:SUM(E9\\cE13):b::1:1:1:l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F8:vtf:n:9816:IF( (E8*12)=0,"",(E8*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:8:cf:2\ncell:P8:l:1:f:8:cf:2\ncell:Q8:l:1:f:8:cf:2\ncell:R8:l:1:f:8:cf:2\ncell:S8:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:T8:t::l:1:f:8:cf:2\ncell:U8:l:1:f:8:cf:2\ncell:V8:l:1:f:8:cf:2\ncell:W8:l:1:f:8:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:8:cf:2\ncell:C9:l:3:f:8:cf:2\ncell:D9:t:Mortgage/Rent:l:3:f:7:cf:2\ncell:E9:v:818:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F9:vtf:n:9816:IF( (E9*12)=0,"",(E9*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:t::l:1:f:8:cf:2\ncell:P9:t::l:1:f:8:cf:2\ncell:Q9:t::l:1:f:8:cf:2\ncell:R9:l:1:f:8:cf:2\ncell:S9:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:T9:t::l:1:f:8:cf:2\ncell:U9:l:1:f:8:cf:2\ncell:V9:l:1:f:8:cf:2\ncell:W9:l:1:f:8:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:8:bg:4:cf:2\ncell:C10:l:3:f:8:bg:4:cf:2\ncell:D10:t:Property Tax:l:3:f:7:bg:4:cf:2\ncell:E10:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:8:cf:2\ncell:P10:l:1:f:8:cf:2\ncell:Q10:l:1:f:8:cf:2\ncell:R10:l:1:f:8:cf:2\ncell:S10:l:1:f:8:cf:2\ncell:T10:l:1:f:8:cf:2\ncell:U10:l:1:f:8:cf:2\ncell:V10:l:1:f:8:cf:2\ncell:W10:l:1:f:8:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:8:cf:2\ncell:C11:l:3:f:8:cf:2\ncell:D11:t:Insurance:l:3:f:7:cf:2\ncell:E11:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:8:cf:2\ncell:P11:l:1:f:8:cf:2\ncell:Q11:l:1:f:8:cf:2\ncell:R11:l:1:f:8:cf:2\ncell:S11:l:1:f:8:cf:2\ncell:T11:l:1:f:8:cf:2\ncell:U11:l:1:f:8:cf:2\ncell:V11:l:1:f:8:cf:2\ncell:W11:l:1:f:8:cf:2\ncell:A12:b::1::\ncell:B12:b::::1:l:3:f:8:bg:4:cf:2\ncell:C12:l:3:f:8:bg:4:cf:2\ncell:D12:t:Maintenance:l:3:f:7:bg:4:cf:2\ncell:E12:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F12:vtf:t::IF( (E12*12)=0,"",(E12*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G12:b::::1\ncell:O12:l:2:f:3:cf:2\ncell:P12:l:1:f:8:cf:2\ncell:Q12:l:1:f:8:cf:2\ncell:R12:l:1:f:8:cf:2\ncell:S12:l:1:f:8:cf:2\ncell:T12:l:1:f:8:cf:2\ncell:U12:l:1:f:8:cf:2\ncell:V12:l:1:f:8:cf:2\ncell:W12:l:1:f:8:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:8:cf:2\ncell:C13:l:3:f:8:cf:2\ncell:D13:t:Other:b::1:::l:3:f:7:cf:2\ncell:E13:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F13:vtf:t::IF( (E13*12)=0,"",(E13*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:8:cf:2\ncell:P13:l:1:f:8:cf:2\ncell:Q13:l:1:f:8:cf:2\ncell:R13:l:1:f:8:cf:2\ncell:S13:l:1:f:8:cf:2\ncell:T13:l:1:f:8:cf:2\ncell:U13:l:1:f:8:cf:2\ncell:V13:l:1:f:8:cf:2\ncell:W13:l:1:f:8:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:c:1:bg:6\ncell:C14:t:Utilities:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D14:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E14:vtf:n:305:SUM(E15\\cE20):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F14:vtf:n:3660:IF( (E14*12)=0,"",(E14*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:8:cf:2\ncell:P14:l:1:f:8:cf:2\ncell:Q14:l:1:f:8:cf:2\ncell:R14:l:1:f:8:cf:2\ncell:S14:l:1:f:8:cf:2\ncell:T14:l:1:f:8:cf:2\ncell:U14:l:1:f:8:cf:2\ncell:V14:l:1:f:8:cf:2\ncell:W14:l:1:f:8:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:8:cf:2\ncell:C15:l:3:f:8:cf:2\ncell:D15:t:Gas, Electricity, Oil:l:3:f:7:cf:2\ncell:E15:v:305:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F15:vtf:n:3660:IF( (E15*12)=0,"",(E15*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:8:cf:2\ncell:P15:l:1:f:8:cf:2\ncell:Q15:l:1:f:8:cf:2\ncell:R15:l:1:f:8:cf:2\ncell:S15:l:1:f:8:cf:2\ncell:T15:l:1:f:8:cf:2\ncell:U15:l:1:f:8:cf:2\ncell:V15:l:1:f:8:cf:2\ncell:W15:l:1:f:8:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:8:bg:4:cf:2\ncell:C16:l:3:f:8:bg:4:cf:2\ncell:D16:t:Water, Sewer, Garbage & Other:l:3:f:7:bg:4:cf:2\ncell:E16:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:8:cf:2\ncell:P16:l:1:f:8:cf:2\ncell:Q16:l:1:f:8:cf:2\ncell:R16:l:1:f:8:cf:2\ncell:S16:l:1:f:8:cf:2\ncell:T16:l:1:f:8:cf:2\ncell:U16:l:1:f:8:cf:2\ncell:V16:l:1:f:8:cf:2\ncell:W16:l:1:f:8:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:8:cf:2\ncell:C17:l:3:f:8:cf:2\ncell:D17:t:TV - Cable, Dish, Other:l:3:f:7:cf:2\ncell:E17:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:8:cf:2\ncell:P17:l:1:f:8:cf:2\ncell:Q17:l:1:f:8:cf:2\ncell:R17:l:1:f:8:cf:2\ncell:S17:l:1:f:8:cf:2\ncell:T17:l:1:f:8:cf:2\ncell:U17:l:1:f:8:cf:2\ncell:V17:l:1:f:8:cf:2\ncell:W17:l:1:f:8:cf:2\ncell:A18:b::1::\ncell:B18:b::::1:l:3:f:8:bg:4:cf:2\ncell:C18:l:3:f:8:bg:4:cf:2\ncell:D18:t:Phone:l:3:f:7:bg:4:cf:2\ncell:E18:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F18:vtf:t::IF( (E18*12)=0,"",(E18*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G18:b::::1\ncell:O18:l:1:f:8:cf:2\ncell:P18:l:1:f:8:cf:2\ncell:Q18:l:1:f:8:cf:2\ncell:R18:l:1:f:8:cf:2\ncell:S18:l:1:f:8:cf:2\ncell:T18:l:1:f:8:cf:2\ncell:U18:l:1:f:8:cf:2\ncell:V18:l:1:f:8:cf:2\ncell:W18:l:1:f:8:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:8:cf:2\ncell:C19:l:3:f:8:cf:2\ncell:D19:t:Internet:l:3:f:7:cf:2\ncell:E19:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F19:vtf:t::IF( (E19*12)=0,"",(E19*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:8:cf:2\ncell:P19:l:1:f:8:cf:2\ncell:Q19:l:1:f:8:cf:2\ncell:R19:l:1:f:8:cf:2\ncell:S19:l:1:f:8:cf:2\ncell:T19:l:1:f:8:cf:2\ncell:U19:l:1:f:8:cf:2\ncell:V19:l:1:f:8:cf:2\ncell:W19:l:1:f:8:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:8:bg:4:cf:2\ncell:C20:l:3:f:8:bg:4:cf:2\ncell:D20:t:Other:l:3:f:7:bg:4:cf:2\ncell:E20:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:8:cf:2\ncell:P20:l:1:f:8:cf:2\ncell:Q20:l:1:f:8:cf:2\ncell:R20:l:1:f:8:cf:2\ncell:S20:l:1:f:8:cf:2\ncell:T20:l:1:f:8:cf:2\ncell:U20:l:1:f:8:cf:2\ncell:V20:l:1:f:8:cf:2\ncell:W20:l:1:f:8:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:c:1:bg:6\ncell:C21:t:Personal Services:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D21:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E21:vtf:n:84:SUM(E22\\cE23):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F21:vtf:n:1008:IF( (E21*12)=0,"",(E21*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:8:cf:2\ncell:P21:l:1:f:8:cf:2\ncell:Q21:l:1:f:8:cf:2\ncell:R21:l:1:f:8:cf:2\ncell:S21:l:1:f:8:cf:2\ncell:T21:l:1:f:8:cf:2\ncell:U21:l:1:f:8:cf:2\ncell:V21:l:1:f:8:cf:2\ncell:W21:l:1:f:8:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:8:cf:2\ncell:C22:l:3:f:8:cf:2\ncell:D22:t:Childcare:l:3:f:7:cf:2\ncell:E22:v:84:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F22:vtf:n:1008:IF( (E22*12)=0,"",(E22*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G22:b::::1\ncell:O22:l:1:f:8:cf:2\ncell:P22:l:1:f:8:cf:2\ncell:Q22:l:1:f:8:cf:2\ncell:R22:l:1:f:8:cf:2\ncell:S22:l:1:f:8:cf:2\ncell:T22:l:1:f:8:cf:2\ncell:U22:l:1:f:8:cf:2\ncell:V22:l:1:f:8:cf:2\ncell:W22:l:1:f:8:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:8:bg:4:cf:2\ncell:C23:l:3:f:8:bg:4:cf:2\ncell:D23:t:Elderly Care & Other:l:3:f:7:bg:4:cf:2\ncell:E23:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:8:cf:2\ncell:P23:l:1:f:8:cf:2\ncell:Q23:l:1:f:8:cf:2\ncell:R23:l:1:f:8:cf:2\ncell:S23:l:1:f:8:cf:2\ncell:T23:l:1:f:8:cf:2\ncell:U23:l:1:f:8:cf:2\ncell:V23:l:1:f:8:cf:2\ncell:W23:l:1:f:8:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:c:1:bg:6\ncell:C24:t:Other Household Expenses:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D24:t::b::1:1::l:3:f:2:c:1:bg:6:cf:2\ncell:E24:vtf:n:173:SUM(E25\\cE31):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F24:vtf:n:2076:IF( (E24*12)=0,"",(E24*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:8:cf:2\ncell:P24:l:1:f:8:cf:2\ncell:Q24:l:1:f:8:cf:2\ncell:R24:l:1:f:8:cf:2\ncell:S24:l:1:f:8:cf:2\ncell:T24:l:1:f:8:cf:2\ncell:U24:l:1:f:8:cf:2\ncell:V24:l:1:f:8:cf:2\ncell:W24:l:1:f:8:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:8:cf:2\ncell:C25:l:3:f:8:cf:2\ncell:D25:t:Gardening & Lawncare:l:3:f:7:cf:2\ncell:E25:v:173:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F25:vtf:n:2076:IF( (E25*12)=0,"",(E25*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G25:b::::1\ncell:O25:l:1:f:8:cf:2\ncell:P25:l:1:f:8:cf:2\ncell:Q25:l:1:f:8:cf:2\ncell:R25:l:1:f:8:cf:2\ncell:S25:l:1:f:8:cf:2\ncell:T25:l:1:f:8:cf:2\ncell:U25:l:1:f:8:cf:2\ncell:V25:l:1:f:8:cf:2\ncell:W25:l:1:f:8:cf:2\ncell:A26:b::1::\ncell:B26:b::::1:l:3:f:8:bg:4:cf:2\ncell:C26:l:3:f:8:bg:4:cf:2\ncell:D26:t:Laundry & Cleaning:l:3:f:7:bg:4:cf:2\ncell:E26:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F26:vtf:t::IF( (E26*12)=0,"",(E26*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G26:b::::1\ncell:O26:l:1:f:8:cf:2\ncell:P26:l:1:f:8:cf:2\ncell:Q26:l:1:f:8:cf:2\ncell:R26:l:1:f:8:cf:2\ncell:S26:l:1:f:8:cf:2\ncell:T26:l:1:f:8:cf:2\ncell:U26:l:1:f:8:cf:2\ncell:V26:l:1:f:8:cf:2\ncell:W26:l:1:f:8:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:8:cf:2\ncell:C27:l:3:f:8:cf:2\ncell:D27:t:Household Supplies:l:3:f:7:cf:2\ncell:E27:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F27:vtf:t::IF( (E27*12)=0,"",(E27*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:8:cf:2\ncell:P27:l:1:f:8:cf:2\ncell:Q27:l:1:f:8:cf:2\ncell:R27:l:1:f:8:cf:2\ncell:S27:l:1:f:8:cf:2\ncell:T27:l:1:f:8:cf:2\ncell:U27:l:1:f:8:cf:2\ncell:V27:l:1:f:8:cf:2\ncell:W27:l:1:f:8:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:8:bg:4:cf:2\ncell:C28:l:3:f:8:bg:4:cf:2\ncell:D28:t:Furniture:l:3:f:7:bg:4:cf:2\ncell:E28:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:8:cf:2\ncell:P28:l:1:f:8:cf:2\ncell:Q28:l:1:f:8:cf:2\ncell:R28:l:1:f:8:cf:2\ncell:S28:l:1:f:8:cf:2\ncell:T28:l:1:f:8:cf:2\ncell:U28:l:1:f:8:cf:2\ncell:V28:l:1:f:8:cf:2\ncell:W28:l:1:f:8:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:8:cf:2\ncell:C29:l:3:f:8:cf:2\ncell:D29:t:Appliances & Equipment:l:3:f:7:cf:2\ncell:E29:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:8:cf:2\ncell:P29:l:1:f:8:cf:2\ncell:Q29:l:1:f:8:cf:2\ncell:R29:l:1:f:8:cf:2\ncell:S29:l:1:f:8:cf:2\ncell:T29:l:1:f:8:cf:2\ncell:U29:l:1:f:8:cf:2\ncell:V29:l:1:f:8:cf:2\ncell:W29:l:1:f:8:cf:2\ncell:A30:b::1::\ncell:B30:b::::1:l:3:f:8:bg:4:cf:2\ncell:C30:l:3:f:8:bg:4:cf:2\ncell:D30:t:Security Services:l:3:f:7:bg:4:cf:2\ncell:E30:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G30:b::::1\ncell:O30:l:1:f:8:cf:2\ncell:P30:l:1:f:8:cf:2\ncell:Q30:l:1:f:8:cf:2\ncell:R30:l:1:f:8:cf:2\ncell:S30:l:1:f:8:cf:2\ncell:T30:l:1:f:8:cf:2\ncell:U30:l:1:f:8:cf:2\ncell:V30:l:1:f:8:cf:2\ncell:W30:l:1:f:8:cf:2\ncell:A31:b::1::\ncell:B31:b:::1:1:l:3:f:8:cf:2\ncell:C31:b:::1::l:3:f:8:cf:2\ncell:D31:t:Other:b:::1::l:3:f:7:cf:2\ncell:E31:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b::1:1::l:4:f:7:cf:3:ntvf:1\ncell:G31:b::::1\ncell:O31:l:1:f:8:cf:2\ncell:P31:l:1:f:8:cf:2\ncell:Q31:l:1:f:8:cf:2\ncell:R31:l:1:f:8:cf:2\ncell:S31:l:1:f:8:cf:2\ncell:T31:l:1:f:8:cf:2\ncell:U31:l:1:f:8:cf:2\ncell:V31:l:1:f:8:cf:2\ncell:W31:l:1:f:8:cf:2\ncell:B32:b:1:::\ncell:C32:b:1:::\ncell:D32:b:1:::\ncell:E32:b:1:::\ncell:F32:b:1:::\ncell:O32:l:1:f:8:cf:2\ncell:P32:l:1:f:8:cf:2\ncell:Q32:l:1:f:8:cf:2\ncell:R32:l:1:f:8:cf:2\ncell:S32:l:1:f:8:cf:2\ncell:T32:l:1:f:8:cf:2\ncell:U32:l:1:f:8:cf:2\ncell:V32:l:1:f:8:cf:2\ncell:W32:l:1:f:8:cf:2\ncell:O33:l:1:f:8:cf:2\ncell:P33:l:1:f:8:cf:2\ncell:Q33:l:1:f:8:cf:2\ncell:R33:l:1:f:8:cf:2\ncell:S33:l:1:f:8:cf:2\ncell:T33:l:1:f:8:cf:2\ncell:U33:l:1:f:8:cf:2\ncell:V33:l:1:f:8:cf:2\ncell:W33:l:1:f:8:cf:2\ncell:O34:l:1:f:8:cf:2\ncell:P34:l:1:f:8:cf:2\ncell:Q34:l:1:f:8:cf:2\ncell:R34:l:1:f:8:cf:2\ncell:S34:l:1:f:8:cf:2\ncell:T34:l:1:f:8:cf:2\ncell:U34:l:1:f:8:cf:2\ncell:V34:l:1:f:8:cf:2\ncell:W34:l:1:f:8:cf:2\ncell:O35:l:1:f:8:cf:2\ncell:P35:l:1:f:8:cf:2\ncell:Q35:l:1:f:8:cf:2\ncell:R35:l:1:f:8:cf:2\ncell:S35:l:1:f:8:cf:2\ncell:T35:l:1:f:8:cf:2\ncell:U35:l:1:f:8:cf:2\ncell:V35:l:1:f:8:cf:2\ncell:W35:l:1:f:8:cf:2\ncell:O36:l:1:f:8:cf:2\ncell:P36:l:1:f:8:cf:2\ncell:Q36:l:1:f:8:cf:2\ncell:R36:l:1:f:8:cf:2\ncell:S36:l:1:f:8:cf:2\ncell:T36:l:1:f:8:cf:2\ncell:U36:l:1:f:8:cf:2\ncell:V36:l:1:f:8:cf:2\ncell:W36:l:1:f:8:cf:2\ncell:O37:l:1:f:8:cf:2\ncell:P37:l:1:f:8:cf:2\ncell:Q37:l:1:f:8:cf:2\ncell:R37:l:1:f:8:cf:2\ncell:S37:l:1:f:8:cf:2\ncell:T37:l:1:f:8:cf:2\ncell:U37:l:1:f:8:cf:2\ncell:V37:l:1:f:8:cf:2\ncell:W37:l:1:f:8:cf:2\ncell:O38:l:1:f:8:cf:2\ncell:P38:l:1:f:8:cf:2\ncell:Q38:l:1:f:8:cf:2\ncell:R38:l:1:f:8:cf:2\ncell:S38:l:1:f:8:cf:2\ncell:T38:l:1:f:8:cf:2\ncell:U38:l:1:f:8:cf:2\ncell:V38:l:1:f:8:cf:2\ncell:W38:l:1:f:8:cf:2\ncell:O39:l:1:f:8:cf:2\ncell:P39:l:1:f:8:cf:2\ncell:Q39:l:1:f:8:cf:2\ncell:R39:l:1:f:8:cf:2\ncell:S39:l:1:f:8:cf:2\ncell:T39:l:1:f:8:cf:2\ncell:U39:l:1:f:8:cf:2\ncell:V39:l:1:f:8:cf:2\ncell:W39:l:1:f:8:cf:2\ncell:O40:l:1:f:8:cf:2\ncell:P40:l:1:f:8:cf:2\ncell:Q40:l:1:f:8:cf:2\ncell:R40:l:1:f:8:cf:2\ncell:S40:l:1:f:8:cf:2\ncell:T40:l:1:f:8:cf:2\ncell:U40:l:1:f:8:cf:2\ncell:V40:l:1:f:8:cf:2\ncell:W40:l:1:f:8:cf:2\ncell:O41:l:1:f:8:cf:2\ncell:P41:l:1:f:8:cf:2\ncell:Q41:l:1:f:8:cf:2\ncell:R41:l:1:f:8:cf:2\ncell:S41:l:1:f:8:cf:2\ncell:T41:l:1:f:8:cf:2\ncell:U41:l:1:f:8:cf:2\ncell:V41:l:1:f:8:cf:2\ncell:W41:l:1:f:8:cf:2\ncell:O42:l:1:f:8:cf:2\ncell:P42:l:1:f:8:cf:2\ncell:Q42:l:1:f:8:cf:2\ncell:R42:l:1:f:8:cf:2\ncell:S42:l:1:f:8:cf:2\ncell:T42:l:1:f:8:cf:2\ncell:U42:l:1:f:8:cf:2\ncell:V42:l:1:f:8:cf:2\ncell:W42:l:1:f:8:cf:2\ncell:O43:l:1:f:8:cf:2\ncell:P43:l:1:f:8:cf:2\ncell:Q43:l:1:f:8:cf:2\ncell:R43:l:1:f:8:cf:2\ncell:S43:l:1:f:8:cf:2\ncell:T43:l:1:f:8:cf:2\ncell:U43:l:1:f:8:cf:2\ncell:V43:l:1:f:8:cf:2\ncell:W43:l:1:f:8:cf:2\ncell:O44:l:1:f:8:cf:2\ncell:P44:l:1:f:8:cf:2\ncell:Q44:l:1:f:8:cf:2\ncell:R44:l:1:f:8:cf:2\ncell:S44:l:1:f:8:cf:2\ncell:T44:l:1:f:8:cf:2\ncell:U44:l:1:f:8:cf:2\ncell:V44:l:1:f:8:cf:2\ncell:W44:l:1:f:8:cf:2\ncell:O45:l:1:f:8:cf:2\ncell:P45:l:1:f:8:cf:2\ncell:Q45:l:1:f:8:cf:2\ncell:R45:l:1:f:8:cf:2\ncell:S45:l:1:f:8:cf:2\ncell:T45:l:1:f:8:cf:2\ncell:U45:l:1:f:8:cf:2\ncell:V45:l:1:f:8:cf:2\ncell:W45:l:1:f:8:cf:2\ncell:O46:l:1:f:8:cf:2\ncell:P46:l:1:f:8:cf:2\ncell:Q46:l:1:f:8:cf:2\ncell:R46:l:1:f:8:cf:2\ncell:S46:l:1:f:8:cf:2\ncell:T46:l:1:f:8:cf:2\ncell:U46:l:1:f:8:cf:2\ncell:V46:l:1:f:8:cf:2\ncell:W46:l:1:f:8:cf:2\ncell:O47:l:1:f:8:cf:2\ncell:P47:l:1:f:8:cf:2\ncell:Q47:l:1:f:8:cf:2\ncell:R47:l:1:f:8:cf:2\ncell:S47:l:1:f:8:cf:2\ncell:T47:l:1:f:8:cf:2\ncell:U47:l:1:f:8:cf:2\ncell:V47:l:1:f:8:cf:2\ncell:W47:l:1:f:8:cf:2\ncell:O48:l:1:f:8:cf:2\ncell:P48:l:1:f:8:cf:2\ncell:Q48:l:1:f:8:cf:2\ncell:R48:l:1:f:8:cf:2\ncell:S48:l:1:f:8:cf:2\ncell:T48:l:1:f:8:cf:2\ncell:U48:l:1:f:8:cf:2\ncell:V48:l:1:f:8:cf:2\ncell:W48:l:1:f:8:cf:2\ncell:O49:l:1:f:8:cf:2\ncell:P49:l:1:f:8:cf:2\ncell:Q49:l:1:f:8:cf:2\ncell:R49:l:1:f:8:cf:2\ncell:S49:l:1:f:8:cf:2\ncell:T49:l:1:f:8:cf:2\ncell:U49:l:1:f:8:cf:2\ncell:V49:l:1:f:8:cf:2\ncell:W49:l:1:f:8:cf:2\ncell:O50:l:1:f:8:cf:2\ncell:P50:l:1:f:8:cf:2\ncell:Q50:l:1:f:8:cf:2\ncell:R50:l:1:f:8:cf:2\ncell:S50:l:1:f:8:cf:2\ncell:T50:l:1:f:8:cf:2\ncell:U50:l:1:f:8:cf:2\ncell:V50:l:1:f:8:cf:2\ncell:W50:l:1:f:8:cf:2\ncell:O51:l:1:f:8:cf:2\ncell:P51:l:1:f:8:cf:2\ncell:Q51:l:1:f:8:cf:2\ncell:R51:l:1:f:8:cf:2\ncell:S51:l:1:f:8:cf:2\ncell:T51:l:1:f:8:cf:2\ncell:U51:l:1:f:8:cf:2\ncell:V51:l:1:f:8:cf:2\ncell:W51:l:1:f:8:cf:2\ncell:O52:l:1:f:8:cf:2\ncell:P52:l:1:f:8:cf:2\ncell:Q52:l:1:f:8:cf:2\ncell:R52:l:1:f:8:cf:2\ncell:S52:l:1:f:8:cf:2\ncell:T52:l:1:f:8:cf:2\ncell:U52:l:1:f:8:cf:2\ncell:V52:l:1:f:8:cf:2\ncell:W52:l:1:f:8:cf:2\ncell:O53:l:1:f:8:cf:2\ncell:P53:l:1:f:8:cf:2\ncell:Q53:l:1:f:8:cf:2\ncell:R53:l:1:f:8:cf:2\ncell:S53:l:1:f:8:cf:2\ncell:T53:l:1:f:8:cf:2\ncell:U53:l:1:f:8:cf:2\ncell:V53:l:1:f:8:cf:2\ncell:W53:l:1:f:8:cf:2\ncell:O54:l:1:f:8:cf:2\ncell:P54:l:1:f:8:cf:2\ncell:Q54:l:1:f:8:cf:2\ncell:R54:l:1:f:8:cf:2\ncell:S54:l:1:f:8:cf:2\ncell:T54:l:1:f:8:cf:2\ncell:U54:l:1:f:8:cf:2\ncell:V54:l:1:f:8:cf:2\ncell:W54:l:1:f:8:cf:2\ncell:O55:l:1:f:8:cf:2\ncell:P55:l:1:f:8:cf:2\ncell:Q55:l:1:f:8:cf:2\ncell:R55:l:1:f:8:cf:2\ncell:S55:l:1:f:8:cf:2\ncell:T55:l:1:f:8:cf:2\ncell:U55:l:1:f:8:cf:2\ncell:V55:l:1:f:8:cf:2\ncell:W55:l:1:f:8:cf:2\ncell:O56:l:1:f:8:cf:2\ncell:P56:l:1:f:8:cf:2\ncell:Q56:l:1:f:8:cf:2\ncell:R56:l:1:f:8:cf:2\ncell:S56:l:1:f:8:cf:2\ncell:T56:l:1:f:8:cf:2\ncell:U56:l:1:f:8:cf:2\ncell:V56:l:1:f:8:cf:2\ncell:W56:l:1:f:8:cf:2\ncell:O57:l:1:f:8:cf:2\ncell:P57:l:1:f:8:cf:2\ncell:Q57:l:1:f:8:cf:2\ncell:R57:l:1:f:8:cf:2\ncell:S57:l:1:f:8:cf:2\ncell:T57:l:1:f:8:cf:2\ncell:U57:l:1:f:8:cf:2\ncell:V57:l:1:f:8:cf:2\ncell:W57:l:1:f:8:cf:2\ncell:O58:l:1:f:8:cf:2\ncell:P58:l:1:f:8:cf:2\ncell:Q58:l:1:f:8:cf:2\ncell:R58:l:1:f:8:cf:2\ncell:S58:l:1:f:8:cf:2\ncell:T58:l:1:f:8:cf:2\ncell:U58:l:1:f:8:cf:2\ncell:V58:l:1:f:8:cf:2\ncell:W58:l:1:f:8:cf:2\ncell:O59:l:1:f:8:cf:2\ncell:P59:l:1:f:8:cf:2\ncell:Q59:l:1:f:8:cf:2\ncell:R59:l:1:f:8:cf:2\ncell:S59:l:1:f:8:cf:2\ncell:T59:l:1:f:8:cf:2\ncell:U59:l:1:f:8:cf:2\ncell:V59:l:1:f:8:cf:2\ncell:W59:l:1:f:8:cf:2\ncell:O60:l:1:f:8:cf:2\ncell:P60:l:1:f:8:cf:2\ncell:Q60:l:1:f:8:cf:2\ncell:R60:l:1:f:8:cf:2\ncell:S60:l:1:f:8:cf:2\ncell:T60:l:1:f:8:cf:2\ncell:U60:l:1:f:8:cf:2\ncell:V60:l:1:f:8:cf:2\ncell:W60:l:1:f:8:cf:2\ncell:O61:l:1:f:8:cf:2\ncell:P61:l:1:f:8:cf:2\ncell:Q61:l:1:f:8:cf:2\ncell:R61:l:1:f:8:cf:2\ncell:S61:l:1:f:8:cf:2\ncell:T61:l:1:f:8:cf:2\ncell:U61:l:1:f:8:cf:2\ncell:V61:l:1:f:8:cf:2\ncell:W61:l:1:f:8:cf:2\ncell:O62:l:1:f:8:cf:2\ncell:P62:l:1:f:8:cf:2\ncell:Q62:l:1:f:8:cf:2\ncell:R62:l:1:f:8:cf:2\ncell:S62:l:1:f:8:cf:2\ncell:T62:l:1:f:8:cf:2\ncell:U62:l:1:f:8:cf:2\ncell:V62:l:1:f:8:cf:2\ncell:W62:l:1:f:8:cf:2\ncell:O63:l:1:f:8:cf:2\ncell:P63:l:1:f:8:cf:2\ncell:Q63:l:1:f:8:cf:2\ncell:R63:l:1:f:8:cf:2\ncell:S63:l:1:f:8:cf:2\ncell:T63:l:1:f:8:cf:2\ncell:U63:l:1:f:8:cf:2\ncell:V63:l:1:f:8:cf:2\ncell:W63:l:1:f:8:cf:2\ncell:O64:l:1:f:8:cf:2\ncell:P64:l:1:f:8:cf:2\ncell:Q64:l:1:f:8:cf:2\ncell:R64:l:1:f:8:cf:2\ncell:S64:l:1:f:8:cf:2\ncell:T64:l:1:f:8:cf:2\ncell:U64:l:1:f:8:cf:2\ncell:V64:l:1:f:8:cf:2\ncell:W64:l:1:f:8:cf:2\ncell:O65:l:1:f:8:cf:2\ncell:P65:l:1:f:8:cf:2\ncell:Q65:l:1:f:8:cf:2\ncell:R65:l:1:f:8:cf:2\ncell:S65:l:1:f:8:cf:2\ncell:T65:l:1:f:8:cf:2\ncell:U65:l:1:f:8:cf:2\ncell:V65:l:1:f:8:cf:2\ncell:W65:l:1:f:8:cf:2\ncell:O66:l:1:f:8:cf:2\ncell:P66:l:1:f:8:cf:2\ncell:Q66:l:1:f:8:cf:2\ncell:R66:l:1:f:8:cf:2\ncell:S66:l:1:f:8:cf:2\ncell:T66:l:1:f:8:cf:2\ncell:U66:l:1:f:8:cf:2\ncell:V66:l:1:f:8:cf:2\ncell:W66:l:1:f:8:cf:2\ncell:O67:l:1:f:8:cf:2\ncell:P67:l:1:f:8:cf:2\ncell:Q67:l:1:f:8:cf:2\ncell:R67:l:1:f:8:cf:2\ncell:S67:l:1:f:8:cf:2\ncell:T67:l:1:f:8:cf:2\ncell:U67:l:1:f:8:cf:2\ncell:V67:l:1:f:8:cf:2\ncell:W67:l:1:f:8:cf:2\ncell:O68:l:1:f:8:cf:2\ncell:P68:l:1:f:8:cf:2\ncell:Q68:l:1:f:8:cf:2\ncell:R68:l:1:f:8:cf:2\ncell:S68:l:1:f:8:cf:2\ncell:T68:l:1:f:8:cf:2\ncell:U68:l:1:f:8:cf:2\ncell:V68:l:1:f:8:cf:2\ncell:W68:l:1:f:8:cf:2\ncell:O69:l:1:f:8:cf:2\ncell:P69:l:1:f:8:cf:2\ncell:Q69:l:1:f:8:cf:2\ncell:R69:l:1:f:8:cf:2\ncell:S69:l:1:f:8:cf:2\ncell:T69:l:1:f:8:cf:2\ncell:U69:l:1:f:8:cf:2\ncell:V69:l:1:f:8:cf:2\ncell:W69:l:1:f:8:cf:2\ncell:O70:l:1:f:8:cf:2\ncell:P70:l:1:f:8:cf:2\ncell:Q70:l:1:f:8:cf:2\ncell:R70:l:1:f:8:cf:2\ncell:S70:l:1:f:8:cf:2\ncell:T70:l:1:f:8:cf:2\ncell:U70:l:1:f:8:cf:2\ncell:V70:l:1:f:8:cf:2\ncell:W70:l:1:f:8:cf:2\ncell:O71:l:1:f:8:cf:2\ncell:P71:l:1:f:8:cf:2\ncell:Q71:l:1:f:8:cf:2\ncell:R71:l:1:f:8:cf:2\ncell:S71:l:1:f:8:cf:2\ncell:T71:l:1:f:8:cf:2\ncell:U71:l:1:f:8:cf:2\ncell:V71:l:1:f:8:cf:2\ncell:W71:l:1:f:8:cf:2\ncell:O72:l:1:f:8:cf:2\ncell:P72:l:1:f:8:cf:2\ncell:Q72:l:1:f:8:cf:2\ncell:R72:l:1:f:8:cf:2\ncell:S72:l:1:f:8:cf:2\ncell:T72:l:1:f:8:cf:2\ncell:U72:l:1:f:8:cf:2\ncell:V72:l:1:f:8:cf:2\ncell:W72:l:1:f:8:cf:2\ncell:O73:l:1:f:8:cf:2\ncell:P73:l:1:f:8:cf:2\ncell:Q73:l:1:f:8:cf:2\ncell:R73:l:1:f:8:cf:2\ncell:O74:l:1:f:8:cf:2\ncell:P74:l:1:f:8:cf:2\ncell:Q74:l:1:f:8:cf:2\ncell:R74:l:1:f:8:cf:2\ncell:O75:l:1:f:8:cf:2\ncell:P75:l:1:f:8:cf:2\ncell:Q75:l:1:f:8:cf:2\ncell:R75:l:1:f:8:cf:2\ncell:O76:l:1:f:8:cf:2\ncell:P76:l:1:f:8:cf:2\ncell:Q76:l:1:f:8:cf:2\ncell:R76:l:1:f:8:cf:2\ncell:O77:l:1:f:8:cf:2\ncell:P77:l:1:f:8:cf:2\ncell:Q77:l:1:f:8:cf:2\ncell:R77:l:1:f:8:cf:2\ncell:O78:l:1:f:8:cf:2\ncell:P78:l:1:f:8:cf:2\ncell:Q78:l:1:f:8:cf:2\ncell:R78:l:1:f:8:cf:2\ncell:O79:l:1:f:8:cf:2\ncell:P79:l:1:f:8:cf:2\ncell:Q79:l:1:f:8:cf:2\ncell:R79:l:1:f:8:cf:2\ncell:O80:l:1:f:8:cf:2\ncell:P80:l:1:f:8:cf:2\ncell:Q80:l:1:f:8:cf:2\ncell:R80:l:1:f:8:cf:2\ncell:O81:l:1:f:8:cf:2\ncell:P81:l:1:f:8:cf:2\ncell:Q81:l:1:f:8:cf:2\ncell:R81:l:1:f:8:cf:2\ncell:O82:l:1:f:8:cf:2\ncell:P82:l:1:f:8:cf:2\ncell:Q82:l:1:f:8:cf:2\ncell:R82:l:1:f:8:cf:2\ncell:O83:l:1:f:8:cf:2\ncell:P83:l:1:f:8:cf:2\ncell:Q83:l:1:f:8:cf:2\ncell:R83:l:1:f:8:cf:2\ncell:O84:l:1:f:8:cf:2\ncell:P84:l:1:f:8:cf:2\ncell:Q84:l:1:f:8:cf:2\ncell:R84:l:1:f:8:cf:2\ncell:O85:l:1:f:8:cf:2\ncell:P85:l:1:f:8:cf:2\ncell:Q85:l:1:f:8:cf:2\ncell:R85:l:1:f:8:cf:2\ncell:O86:l:1:f:8:cf:2\ncell:P86:l:1:f:8:cf:2\ncell:Q86:l:1:f:8:cf:2\ncell:R86:l:1:f:8:cf:2\ncell:B87:l:1:f:8:cf:2\ncell:C87:l:1:f:8:cf:2\ncell:D87:l:1:f:2:cf:2\ncell:E87:l:1:f:2:cf:3:ntvf:1\ncell:F87:l:1:f:2:cf:3:ntvf:1\ncell:O87:l:1:f:8:cf:2\ncell:P87:l:1:f:8:cf:2\ncell:Q87:l:1:f:8:cf:2\ncell:R87:l:1:f:8:cf:2\ncell:B88:l:1:f:6:cf:2\ncell:C88:l:1:f:6:cf:2\ncell:D88:l:1:f:11:cf:2\ncell:E88:l:1:f:11:cf:2\ncell:F88:l:1:f:8:cf:2\ncell:O88:l:1:f:8:cf:2\ncell:P88:l:1:f:8:cf:2\ncell:Q88:l:1:f:8:cf:2\ncell:R88:l:1:f:8:cf:2\ncell:O89:l:1:f:8:cf:2\ncell:P89:l:1:f:8:cf:2\ncell:Q89:l:1:f:8:cf:2\ncell:R89:l:1:f:8:cf:2\ncell:O90:l:1:f:8:cf:2\ncell:P90:l:1:f:8:cf:2\ncell:Q90:l:1:f:8:cf:2\ncell:R90:l:1:f:8:cf:2\ncell:O91:l:1:f:8:cf:2\ncell:P91:l:1:f:8:cf:2\ncell:Q91:l:1:f:8:cf:2\ncell:R91:l:1:f:8:cf:2\ncell:O92:l:1:f:8:cf:2\ncell:P92:l:1:f:8:cf:2\ncell:Q92:l:1:f:8:cf:2\ncell:R92:l:1:f:8:cf:2\ncell:O93:l:1:f:8:cf:2\ncell:P93:l:1:f:8:cf:2\ncell:Q93:l:1:f:8:cf:2\ncell:R93:l:1:f:8:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:O96:l:1:f:8:cf:2\ncell:P96:l:1:f:8:cf:2\ncell:Q96:l:1:f:8:cf:2\ncell:R96:l:1:f:8:cf:2\ncell:O97:l:1:f:8:cf:2\ncell:P97:l:1:f:8:cf:2\ncell:Q97:l:1:f:8:cf:2\ncell:R97:l:1:f:8:cf:2\ncell:O98:l:1:f:8:cf:2\ncell:P98:l:1:f:8:cf:2\ncell:Q98:l:1:f:8:cf:2\ncell:R98:l:1:f:8:cf:2\ncell:S98:l:1:f:8:cf:2\ncell:T98:l:1:f:8:cf:2\ncell:U98:l:1:f:8:cf:2\ncell:V98:l:1:f:8:cf:2\ncell:W98:l:1:f:8:cf:2\ncell:O99:l:1:f:8:cf:2\ncell:P99:l:1:f:8:cf:2\ncell:Q99:l:1:f:8:cf:2\ncell:R99:l:1:f:8:cf:2\ncell:S99:l:1:f:8:cf:2\ncell:T99:l:1:f:8:cf:2\ncell:U99:l:1:f:8:cf:2\ncell:V99:l:1:f:8:cf:2\ncell:W99:l:1:f:8:cf:2\ncell:O100:l:1:f:8:cf:2\ncell:P100:l:1:f:8:cf:2\ncell:Q100:l:1:f:8:cf:2\ncell:R100:l:1:f:8:cf:2\ncell:S100:l:1:f:8:cf:2\ncell:T100:l:1:f:8:cf:2\ncell:U100:l:1:f:8:cf:2\ncell:V100:l:1:f:8:cf:2\ncell:W100:l:1:f:8:cf:2\ncell:O101:l:1:f:8:cf:2\ncell:P101:l:1:f:8:cf:2\ncell:Q101:l:1:f:8:cf:2\ncell:R101:l:1:f:8:cf:2\ncell:S101:l:1:f:8:cf:2\ncell:T101:l:1:f:8:cf:2\ncell:U101:l:1:f:8:cf:2\ncell:V101:l:1:f:8:cf:2\ncell:W101:l:1:f:8:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncell:O110:l:1:f:8:cf:2\ncell:P110:l:1:f:8:cf:2\ncell:Q110:l:1:f:8:cf:2\ncell:R110:l:1:f:8:cf:2\ncell:S110:l:1:f:8:cf:2\ncell:T110:l:1:f:8:cf:2\ncell:U110:l:1:f:8:cf:2\ncell:V110:l:1:f:8:cf:2\ncell:W110:l:1:f:8:cf:2\ncell:O111:l:1:f:8:cf:2\ncell:P111:l:1:f:8:cf:2\ncell:Q111:l:1:f:8:cf:2\ncell:R111:l:1:f:8:cf:2\ncell:S111:l:1:f:8:cf:2\ncell:T111:l:1:f:8:cf:2\ncell:U111:l:1:f:8:cf:2\ncell:V111:l:1:f:8:cf:2\ncell:W111:l:1:f:8:cf:2\ncell:O112:l:1:f:8:cf:2\ncell:P112:l:1:f:8:cf:2\ncell:Q112:l:1:f:8:cf:2\ncell:R112:l:1:f:8:cf:2\ncell:S112:l:1:f:8:cf:2\ncell:T112:l:1:f:8:cf:2\ncell:U112:l:1:f:8:cf:2\ncell:V112:l:1:f:8:cf:2\ncell:W112:l:1:f:8:cf:2\ncell:O113:l:1:f:8:cf:2\ncell:P113:l:1:f:8:cf:2\ncell:Q113:l:1:f:8:cf:2\ncell:R113:l:1:f:8:cf:2\ncell:S113:l:1:f:8:cf:2\ncell:T113:l:1:f:8:cf:2\ncell:U113:l:1:f:8:cf:2\ncell:V113:l:1:f:8:cf:2\ncell:W113:l:1:f:8:cf:2\ncell:O114:l:1:f:8:cf:2\ncell:P114:l:1:f:8:cf:2\ncell:Q114:l:1:f:8:cf:2\ncell:R114:l:1:f:8:cf:2\ncell:S114:l:1:f:8:cf:2\ncell:T114:l:1:f:8:cf:2\ncell:U114:l:1:f:8:cf:2\ncell:V114:l:1:f:8:cf:2\ncell:W114:l:1:f:8:cf:2\ncell:O115:l:1:f:8:cf:2\ncell:P115:l:1:f:8:cf:2\ncell:Q115:l:1:f:8:cf:2\ncell:R115:l:1:f:8:cf:2\ncell:S115:l:1:f:8:cf:2\ncell:T115:l:1:f:8:cf:2\ncell:U115:l:1:f:8:cf:2\ncell:V115:l:1:f:8:cf:2\ncell:W115:l:1:f:8:cf:2\ncell:O116:l:1:f:8:cf:2\ncell:P116:l:1:f:8:cf:2\ncell:Q116:l:1:f:8:cf:2\ncell:R116:l:1:f:8:cf:2\ncell:S116:l:1:f:8:cf:2\ncell:T116:l:1:f:8:cf:2\ncell:U116:l:1:f:8:cf:2\ncell:V116:l:1:f:8:cf:2\ncell:W116:l:1:f:8:cf:2\ncell:O117:l:1:f:8:cf:2\ncell:P117:l:1:f:8:cf:2\ncell:Q117:l:1:f:8:cf:2\ncell:R117:l:1:f:8:cf:2\ncell:S117:l:1:f:8:cf:2\ncell:T117:l:1:f:8:cf:2\ncell:U117:l:1:f:8:cf:2\ncell:V117:l:1:f:8:cf:2\ncell:W117:l:1:f:8:cf:2\ncell:O118:l:1:f:8:cf:2\ncell:P118:l:1:f:8:cf:2\ncell:Q118:l:1:f:8:cf:2\ncell:R118:l:1:f:8:cf:2\ncell:S118:l:1:f:8:cf:2\ncell:T118:l:1:f:8:cf:2\ncell:U118:l:1:f:8:cf:2\ncell:V118:l:1:f:8:cf:2\ncell:W118:l:1:f:8:cf:2\ncell:O119:l:1:f:8:cf:2\ncell:P119:l:1:f:8:cf:2\ncell:Q119:l:1:f:8:cf:2\ncell:R119:l:1:f:8:cf:2\ncell:S119:l:1:f:8:cf:2\ncell:T119:l:1:f:8:cf:2\ncell:U119:l:1:f:8:cf:2\ncell:V119:l:1:f:8:cf:2\ncell:W119:l:1:f:8:cf:2\ncell:O120:l:1:f:8:cf:2\ncell:P120:l:1:f:8:cf:2\ncell:Q120:l:1:f:8:cf:2\ncell:R120:l:1:f:8:cf:2\ncell:S120:l:1:f:8:cf:2\ncell:T120:l:1:f:8:cf:2\ncell:U120:l:1:f:8:cf:2\ncell:V120:l:1:f:8:cf:2\ncell:W120:l:1:f:8:cf:2\ncell:O121:l:1:f:8:cf:2\ncell:P121:l:1:f:8:cf:2\ncell:Q121:l:1:f:8:cf:2\ncell:R121:l:1:f:8:cf:2\ncell:S121:l:1:f:8:cf:2\ncell:T121:l:1:f:8:cf:2\ncell:U121:l:1:f:8:cf:2\ncell:V121:l:1:f:8:cf:2\ncell:W121:l:1:f:8:cf:2\ncell:O122:l:1:f:8:cf:2\ncell:P122:l:1:f:8:cf:2\ncell:Q122:l:1:f:8:cf:2\ncell:R122:l:1:f:8:cf:2\ncell:S122:l:1:f:8:cf:2\ncell:T122:l:1:f:8:cf:2\ncell:U122:l:1:f:8:cf:2\ncell:V122:l:1:f:8:cf:2\ncell:W122:l:1:f:8:cf:2\ncell:O123:l:1:f:8:cf:2\ncell:P123:l:1:f:8:cf:2\ncell:Q123:l:1:f:8:cf:2\ncell:R123:l:1:f:8:cf:2\ncell:S123:l:1:f:8:cf:2\ncell:T123:l:1:f:8:cf:2\ncell:U123:l:1:f:8:cf:2\ncell:V123:l:1:f:8:cf:2\ncell:W123:l:1:f:8:cf:2\ncell:O124:l:1:f:8:cf:2\ncell:P124:l:1:f:8:cf:2\ncell:Q124:l:1:f:8:cf:2\ncell:R124:l:1:f:8:cf:2\ncell:S124:l:1:f:8:cf:2\ncell:T124:l:1:f:8:cf:2\ncell:U124:l:1:f:8:cf:2\ncell:V124:l:1:f:8:cf:2\ncell:W124:l:1:f:8:cf:2\ncell:O125:l:1:f:8:cf:2\ncell:P125:l:1:f:8:cf:2\ncell:Q125:l:1:f:8:cf:2\ncell:R125:l:1:f:8:cf:2\ncell:S125:l:1:f:8:cf:2\ncell:T125:l:1:f:8:cf:2\ncell:U125:l:1:f:8:cf:2\ncell:V125:l:1:f:8:cf:2\ncell:W125:l:1:f:8:cf:2\ncell:O126:l:1:f:8:cf:2\ncell:P126:l:1:f:8:cf:2\ncell:Q126:l:1:f:8:cf:2\ncell:R126:l:1:f:8:cf:2\ncell:S126:l:1:f:8:cf:2\ncell:T126:l:1:f:8:cf:2\ncell:U126:l:1:f:8:cf:2\ncell:V126:l:1:f:8:cf:2\ncell:W126:l:1:f:8:cf:2\ncell:O127:l:1:f:8:cf:2\ncell:P127:l:1:f:8:cf:2\ncell:Q127:l:1:f:8:cf:2\ncell:R127:l:1:f:8:cf:2\ncell:S127:l:1:f:8:cf:2\ncell:T127:l:1:f:8:cf:2\ncell:U127:l:1:f:8:cf:2\ncell:V127:l:1:f:8:cf:2\ncell:W127:l:1:f:8:cf:2\ncell:O128:l:1:f:8:cf:2\ncell:P128:l:1:f:8:cf:2\ncell:Q128:l:1:f:8:cf:2\ncell:R128:l:1:f:8:cf:2\ncell:S128:l:1:f:8:cf:2\ncell:T128:l:1:f:8:cf:2\ncell:U128:l:1:f:8:cf:2\ncell:V128:l:1:f:8:cf:2\ncell:W128:l:1:f:8:cf:2\ncell:O129:l:1:f:8:cf:2\ncell:P129:l:1:f:8:cf:2\ncell:Q129:l:1:f:8:cf:2\ncell:R129:l:1:f:8:cf:2\ncell:S129:l:1:f:8:cf:2\ncell:T129:l:1:f:8:cf:2\ncell:U129:l:1:f:8:cf:2\ncell:V129:l:1:f:8:cf:2\ncell:W129:l:1:f:8:cf:2\ncell:O130:l:1:f:8:cf:2\ncell:P130:l:1:f:8:cf:2\ncell:Q130:l:1:f:8:cf:2\ncell:R130:l:1:f:8:cf:2\ncell:S130:l:1:f:8:cf:2\ncell:T130:l:1:f:8:cf:2\ncell:U130:l:1:f:8:cf:2\ncell:V130:l:1:f:8:cf:2\ncell:W130:l:1:f:8:cf:2\ncell:O131:l:1:f:8:cf:2\ncell:P131:l:1:f:8:cf:2\ncell:Q131:l:1:f:8:cf:2\ncell:R131:l:1:f:8:cf:2\ncell:S131:l:1:f:8:cf:2\ncell:T131:l:1:f:8:cf:2\ncell:U131:l:1:f:8:cf:2\ncell:V131:l:1:f:8:cf:2\ncell:W131:l:1:f:8:cf:2\ncell:O132:l:1:f:8:cf:2\ncell:P132:l:1:f:8:cf:2\ncell:Q132:l:1:f:8:cf:2\ncell:R132:l:1:f:8:cf:2\ncell:S132:l:1:f:8:cf:2\ncell:T132:l:1:f:8:cf:2\ncell:U132:l:1:f:8:cf:2\ncell:V132:l:1:f:8:cf:2\ncell:W132:l:1:f:8:cf:2\ncell:O133:l:1:f:8:cf:2\ncell:P133:l:1:f:8:cf:2\ncell:Q133:l:1:f:8:cf:2\ncell:R133:l:1:f:8:cf:2\ncell:S133:l:1:f:8:cf:2\ncell:T133:l:1:f:8:cf:2\ncell:U133:l:1:f:8:cf:2\ncell:V133:l:1:f:8:cf:2\ncell:W133:l:1:f:8:cf:2\ncell:O134:l:1:f:8:cf:2\ncell:P134:l:1:f:8:cf:2\ncell:Q134:l:1:f:8:cf:2\ncell:R134:l:1:f:8:cf:2\ncell:S134:l:1:f:8:cf:2\ncell:T134:l:1:f:8:cf:2\ncell:U134:l:1:f:8:cf:2\ncell:V134:l:1:f:8:cf:2\ncell:W134:l:1:f:8:cf:2\ncell:O135:l:1:f:8:cf:2\ncell:P135:l:1:f:8:cf:2\ncell:Q135:l:1:f:8:cf:2\ncell:R135:l:1:f:8:cf:2\ncell:S135:l:1:f:8:cf:2\ncell:T135:l:1:f:8:cf:2\ncell:U135:l:1:f:8:cf:2\ncell:V135:l:1:f:8:cf:2\ncell:W135:l:1:f:8:cf:2\ncell:O136:l:1:f:8:cf:2\ncell:P136:l:1:f:8:cf:2\ncell:Q136:l:1:f:8:cf:2\ncell:R136:l:1:f:8:cf:2\ncell:S136:l:1:f:8:cf:2\ncell:T136:l:1:f:8:cf:2\ncell:U136:l:1:f:8:cf:2\ncell:V136:l:1:f:8:cf:2\ncell:W136:l:1:f:8:cf:2\ncell:O137:l:1:f:8:cf:2\ncell:P137:l:1:f:8:cf:2\ncell:Q137:l:1:f:8:cf:2\ncell:R137:l:1:f:8:cf:2\ncell:S137:l:1:f:8:cf:2\ncell:T137:l:1:f:8:cf:2\ncell:U137:l:1:f:8:cf:2\ncell:V137:l:1:f:8:cf:2\ncell:W137:l:1:f:8:cf:2\ncell:O138:l:1:f:8:cf:2\ncell:P138:l:1:f:8:cf:2\ncell:Q138:l:1:f:8:cf:2\ncell:R138:l:1:f:8:cf:2\ncell:S138:l:1:f:8:cf:2\ncell:T138:l:1:f:8:cf:2\ncell:U138:l:1:f:8:cf:2\ncell:V138:l:1:f:8:cf:2\ncell:W138:l:1:f:8:cf:2\ncell:O139:l:1:f:8:cf:2\ncell:P139:l:1:f:8:cf:2\ncell:Q139:l:1:f:8:cf:2\ncell:R139:l:1:f:8:cf:2\ncell:S139:l:1:f:8:cf:2\ncell:T139:l:1:f:8:cf:2\ncell:U139:l:1:f:8:cf:2\ncell:V139:l:1:f:8:cf:2\ncell:W139:l:1:f:8:cf:2\ncell:O140:l:1:f:8:cf:2\ncell:P140:l:1:f:8:cf:2\ncell:Q140:l:1:f:8:cf:2\ncell:R140:l:1:f:8:cf:2\ncell:S140:l:1:f:8:cf:2\ncell:T140:l:1:f:8:cf:2\ncell:U140:l:1:f:8:cf:2\ncell:V140:l:1:f:8:cf:2\ncell:W140:l:1:f:8:cf:2\ncell:O141:l:1:f:8:cf:2\ncell:P141:l:1:f:8:cf:2\ncell:Q141:l:1:f:8:cf:2\ncell:R141:l:1:f:8:cf:2\ncell:S141:l:1:f:8:cf:2\ncell:T141:l:1:f:8:cf:2\ncell:U141:l:1:f:8:cf:2\ncell:V141:l:1:f:8:cf:2\ncell:W141:l:1:f:8:cf:2\ncell:O142:l:1:f:8:cf:2\ncell:P142:l:1:f:8:cf:2\ncell:Q142:l:1:f:8:cf:2\ncell:R142:l:1:f:8:cf:2\ncell:S142:l:1:f:8:cf:2\ncell:T142:l:1:f:8:cf:2\ncell:U142:l:1:f:8:cf:2\ncell:V142:l:1:f:8:cf:2\ncell:W142:l:1:f:8:cf:2\ncell:O143:l:1:f:8:cf:2\ncell:P143:l:1:f:8:cf:2\ncell:Q143:l:1:f:8:cf:2\ncell:R143:l:1:f:8:cf:2\ncell:S143:l:1:f:8:cf:2\ncell:T143:l:1:f:8:cf:2\ncell:U143:l:1:f:8:cf:2\ncell:V143:l:1:f:8:cf:2\ncell:W143:l:1:f:8:cf:2\ncell:O144:l:1:f:8:cf:2\ncell:P144:l:1:f:8:cf:2\ncell:Q144:l:1:f:8:cf:2\ncell:R144:l:1:f:8:cf:2\ncell:S144:l:1:f:8:cf:2\ncell:T144:l:1:f:8:cf:2\ncell:U144:l:1:f:8:cf:2\ncell:V144:l:1:f:8:cf:2\ncell:W144:l:1:f:8:cf:2\ncell:O145:l:1:f:8:cf:2\ncell:P145:l:1:f:8:cf:2\ncell:Q145:l:1:f:8:cf:2\ncell:R145:l:1:f:8:cf:2\ncell:S145:l:1:f:8:cf:2\ncell:T145:l:1:f:8:cf:2\ncell:U145:l:1:f:8:cf:2\ncell:V145:l:1:f:8:cf:2\ncell:W145:l:1:f:8:cf:2\ncell:O146:l:1:f:8:cf:2\ncell:P146:l:1:f:8:cf:2\ncell:Q146:l:1:f:8:cf:2\ncell:R146:l:1:f:8:cf:2\ncell:S146:l:1:f:8:cf:2\ncell:T146:l:1:f:8:cf:2\ncell:U146:l:1:f:8:cf:2\ncell:V146:l:1:f:8:cf:2\ncell:W146:l:1:f:8:cf:2\ncell:O147:l:1:f:8:cf:2\ncell:P147:l:1:f:8:cf:2\ncell:Q147:l:1:f:8:cf:2\ncell:R147:l:1:f:8:cf:2\ncell:S147:l:1:f:8:cf:2\ncell:T147:l:1:f:8:cf:2\ncell:U147:l:1:f:8:cf:2\ncell:V147:l:1:f:8:cf:2\ncell:W147:l:1:f:8:cf:2\ncell:O148:l:1:f:8:cf:2\ncell:P148:l:1:f:8:cf:2\ncell:Q148:l:1:f:8:cf:2\ncell:R148:l:1:f:8:cf:2\ncell:S148:l:1:f:8:cf:2\ncell:T148:l:1:f:8:cf:2\ncell:U148:l:1:f:8:cf:2\ncell:V148:l:1:f:8:cf:2\ncell:W148:l:1:f:8:cf:2\ncell:O149:l:1:f:8:cf:2\ncell:P149:l:1:f:8:cf:2\ncell:Q149:l:1:f:8:cf:2\ncell:R149:l:1:f:8:cf:2\ncell:S149:l:1:f:8:cf:2\ncell:T149:l:1:f:8:cf:2\ncell:U149:l:1:f:8:cf:2\ncell:V149:l:1:f:8:cf:2\ncell:W149:l:1:f:8:cf:2\ncell:O150:l:1:f:10:cf:2\ncell:P150:l:1:f:10:cf:2\ncell:Q150:l:1:f:10:cf:2\ncell:R150:l:1:f:10:cf:2\ncell:S150:l:1:f:10:cf:2\ncell:T150:l:1:f:10:cf:2\ncell:U150:l:1:f:10:cf:2\ncell:V150:l:1:f:10:cf:2\ncell:W150:l:1:f:10:cf:2\ncell:O151:l:1:f:10:cf:2\ncell:P151:l:1:f:10:cf:2\ncell:Q151:l:1:f:10:cf:2\ncell:R151:l:1:f:10:cf:2\ncell:S151:l:1:f:10:cf:2\ncell:T151:l:1:f:10:cf:2\ncell:U151:l:1:f:10:cf:2\ncell:V151:l:1:f:10:cf:2\ncell:W151:l:1:f:10:cf:2\ncell:O152:l:1:f:10:cf:2\ncell:P152:l:1:f:10:cf:2\ncell:Q152:l:1:f:10:cf:2\ncell:R152:l:1:f:10:cf:2\ncell:S152:l:1:f:10:cf:2\ncell:T152:l:1:f:10:cf:2\ncell:U152:l:1:f:10:cf:2\ncell:V152:l:1:f:10:cf:2\ncell:W152:l:1:f:10:cf:2\ncell:O153:l:1:f:10:cf:2\ncell:P153:l:1:f:10:cf:2\ncell:Q153:l:1:f:10:cf:2\ncell:R153:l:1:f:10:cf:2\ncell:S153:l:1:f:10:cf:2\ncell:T153:l:1:f:10:cf:2\ncell:U153:l:1:f:10:cf:2\ncell:V153:l:1:f:10:cf:2\ncell:W153:l:1:f:10:cf:2\ncell:A154:l:1:f:10:cf:2\ncell:B154:l:1:f:10:cf:2\ncell:C154:l:1:f:10:cf:2\ncell:D154:l:1:f:10:cf:2\ncell:E154:l:1:f:10:cf:2\ncell:F154:t:Monthly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G154:l:1:f:10:cf:2\ncell:H154:l:1:f:10:cf:2\ncell:I154:l:1:f:10:cf:2\ncell:J154:l:1:f:10:cf:2\ncell:K154:l:1:f:10:cf:2\ncell:L154:l:1:f:10:cf:2\ncell:M154:l:1:f:10:cf:2\ncell:N154:l:1:f:10:cf:2\ncell:O154:l:1:f:10:cf:2\ncell:P154:l:1:f:10:cf:2\ncell:Q154:l:1:f:10:cf:2\ncell:R154:l:1:f:10:cf:2\ncell:S154:l:1:f:10:cf:2\ncell:T154:l:1:f:10:cf:2\ncell:U154:l:1:f:10:cf:2\ncell:V154:l:1:f:10:cf:2\ncell:W154:l:1:f:10:cf:2\ncell:A155:l:1:f:10:cf:2\ncell:B155:l:1:f:10:cf:2\ncell:C155:l:1:f:10:cf:2\ncell:D155:l:1:f:10:cf:2\ncell:E155:l:1:f:10:cf:2\ncell:F155:t:Semi-Annually:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G155:l:1:f:10:cf:2\ncell:H155:l:1:f:10:cf:2\ncell:I155:l:1:f:10:cf:2\ncell:J155:l:1:f:10:cf:2\ncell:K155:l:1:f:10:cf:2\ncell:L155:l:1:f:10:cf:2\ncell:M155:l:1:f:10:cf:2\ncell:N155:l:1:f:10:cf:2\ncell:O155:l:1:f:10:cf:2\ncell:P155:l:1:f:10:cf:2\ncell:Q155:l:1:f:10:cf:2\ncell:R155:l:1:f:10:cf:2\ncell:S155:l:1:f:10:cf:2\ncell:T155:l:1:f:10:cf:2\ncell:U155:l:1:f:10:cf:2\ncell:V155:l:1:f:10:cf:2\ncell:W155:l:1:f:10:cf:2\ncell:A156:l:1:f:10:cf:2\ncell:B156:l:1:f:10:cf:2\ncell:C156:l:1:f:10:cf:2\ncell:D156:l:1:f:10:cf:2\ncell:E156:l:1:f:10:cf:2\ncell:F156:t:Quarterly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G156:l:1:f:10:cf:2\ncell:H156:l:1:f:10:cf:2\ncell:I156:l:1:f:10:cf:2\ncell:J156:l:1:f:10:cf:2\ncell:K156:l:1:f:10:cf:2\ncell:L156:l:1:f:10:cf:2\ncell:M156:l:1:f:10:cf:2\ncell:N156:l:1:f:10:cf:2\ncell:O156:l:1:f:10:cf:2\ncell:P156:l:1:f:10:cf:2\ncell:Q156:l:1:f:10:cf:2\ncell:R156:l:1:f:10:cf:2\ncell:S156:l:1:f:10:cf:2\ncell:T156:l:1:f:10:cf:2\ncell:U156:l:1:f:10:cf:2\ncell:V156:l:1:f:10:cf:2\ncell:W156:l:1:f:10:cf:2\ncell:A157:l:1:f:10:cf:2\ncell:B157:l:1:f:10:cf:2\ncell:C157:l:1:f:10:cf:2\ncell:D157:l:1:f:10:cf:2\ncell:E157:l:1:f:10:cf:2\ncell:F157:t:Yearly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G157:l:1:f:10:cf:2\ncell:H157:l:1:f:10:cf:2\ncell:I157:l:1:f:10:cf:2\ncell:J157:l:1:f:10:cf:2\ncell:K157:l:1:f:10:cf:2\ncell:L157:l:1:f:10:cf:2\ncell:M157:l:1:f:10:cf:2\ncell:N157:l:1:f:10:cf:2\ncell:O157:l:1:f:10:cf:2\ncell:P157:l:1:f:10:cf:2\ncell:Q157:l:1:f:10:cf:2\ncell:R157:l:1:f:10:cf:2\ncell:S157:l:1:f:10:cf:2\ncell:T157:l:1:f:10:cf:2\ncell:U157:l:1:f:10:cf:2\ncell:V157:l:1:f:10:cf:2\ncell:W157:l:1:f:10:cf:2\ncell:A158:l:1:f:10:cf:2\ncell:B158:l:1:f:10:cf:2\ncell:C158:l:1:f:10:cf:2\ncell:D158:l:1:f:10:cf:2\ncell:E158:l:1:f:10:cf:2\ncell:F158:l:1:f:10:cf:2\ncell:G158:l:1:f:10:cf:2\ncell:H158:l:1:f:10:cf:2\ncell:I158:l:1:f:10:cf:2\ncell:J158:l:1:f:10:cf:2\ncell:K158:l:1:f:10:cf:2\ncell:L158:l:1:f:10:cf:2\ncell:M158:l:1:f:10:cf:2\ncell:N158:l:1:f:10:cf:2\ncell:O158:l:1:f:10:cf:2\ncell:P158:l:1:f:10:cf:2\ncell:Q158:l:1:f:10:cf:2\ncell:R158:l:1:f:10:cf:2\ncell:S158:l:1:f:10:cf:2\ncell:T158:l:1:f:10:cf:2\ncell:U158:l:1:f:10:cf:2\ncell:V158:l:1:f:10:cf:2\ncell:W158:l:1:f:10:cf:2\ncell:A159:l:1:f:10:cf:2\ncell:B159:l:1:f:10:cf:2\ncell:C159:l:1:f:10:cf:2\ncell:D159:l:1:f:10:cf:2\ncell:E159:l:1:f:10:cf:2\ncell:F159:l:1:f:10:cf:2\ncell:G159:l:1:f:10:cf:2\ncell:H159:l:1:f:10:cf:2\ncell:I159:l:1:f:10:cf:2\ncell:J159:l:1:f:10:cf:2\ncell:K159:l:1:f:10:cf:2\ncell:L159:l:1:f:10:cf:2\ncell:M159:l:1:f:10:cf:2\ncell:N159:l:1:f:10:cf:2\ncell:O159:l:1:f:10:cf:2\ncell:P159:l:1:f:10:cf:2\ncell:Q159:l:1:f:10:cf:2\ncell:R159:l:1:f:10:cf:2\ncell:S159:l:1:f:10:cf:2\ncell:T159:l:1:f:10:cf:2\ncell:U159:l:1:f:10:cf:2\ncell:V159:l:1:f:10:cf:2\ncell:W159:l:1:f:10:cf:2\ncell:A160:l:1:f:10:cf:2\ncell:B160:l:1:f:10:cf:2\ncell:C160:l:1:f:10:cf:2\ncell:D160:l:1:f:10:cf:2\ncell:E160:l:1:f:10:cf:2\ncell:F160:l:1:f:10:cf:2\ncell:G160:l:1:f:10:cf:2\ncell:H160:l:1:f:10:cf:2\ncell:I160:l:1:f:10:cf:2\ncell:J160:l:1:f:10:cf:2\ncell:K160:l:1:f:10:cf:2\ncell:L160:l:1:f:10:cf:2\ncell:M160:l:1:f:10:cf:2\ncell:N160:l:1:f:10:cf:2\ncell:O160:l:1:f:10:cf:2\ncell:P160:l:1:f:10:cf:2\ncell:Q160:l:1:f:10:cf:2\ncell:R160:l:1:f:10:cf:2\ncell:S160:l:1:f:10:cf:2\ncell:T160:l:1:f:10:cf:2\ncell:U160:l:1:f:10:cf:2\ncell:V160:l:1:f:10:cf:2\ncell:W160:l:1:f:10:cf:2\ncell:A161:l:1:f:10:cf:2\ncell:B161:l:1:f:10:cf:2\ncell:C161:l:1:f:10:cf:2\ncell:D161:l:1:f:10:cf:2\ncell:E161:l:1:f:10:cf:2\ncell:F161:l:1:f:10:cf:2\ncell:G161:l:1:f:10:cf:2\ncell:H161:l:1:f:10:cf:2\ncell:I161:l:1:f:10:cf:2\ncell:J161:l:1:f:10:cf:2\ncell:K161:l:1:f:10:cf:2\ncell:L161:l:1:f:10:cf:2\ncell:M161:l:1:f:10:cf:2\ncell:N161:l:1:f:10:cf:2\ncell:O161:l:1:f:10:cf:2\ncell:P161:l:1:f:10:cf:2\ncell:Q161:l:1:f:10:cf:2\ncell:R161:l:1:f:10:cf:2\ncell:S161:l:1:f:10:cf:2\ncell:T161:l:1:f:10:cf:2\ncell:U161:l:1:f:10:cf:2\ncell:V161:l:1:f:10:cf:2\ncell:W161:l:1:f:10:cf:2\ncell:A162:l:1:f:10:cf:2\ncell:B162:l:1:f:10:cf:2\ncell:C162:l:1:f:10:cf:2\ncell:D162:l:1:f:10:cf:2\ncell:E162:l:1:f:10:cf:2\ncell:F162:l:1:f:10:cf:2\ncell:G162:l:1:f:10:cf:2\ncell:H162:l:1:f:10:cf:2\ncell:I162:l:1:f:10:cf:2\ncell:J162:l:1:f:10:cf:2\ncell:K162:l:1:f:10:cf:2\ncell:L162:l:1:f:10:cf:2\ncell:M162:l:1:f:10:cf:2\ncell:N162:l:1:f:10:cf:2\ncell:O162:l:1:f:10:cf:2\ncell:P162:l:1:f:10:cf:2\ncell:Q162:l:1:f:10:cf:2\ncell:R162:l:1:f:10:cf:2\ncell:S162:l:1:f:10:cf:2\ncell:T162:l:1:f:10:cf:2\ncell:U162:l:1:f:10:cf:2\ncell:V162:l:1:f:10:cf:2\ncell:W162:l:1:f:10:cf:2\ncell:A163:l:1:f:10:cf:2\ncell:B163:l:1:f:10:cf:2\ncell:C163:l:1:f:10:cf:2\ncell:D163:l:1:f:10:cf:2\ncell:E163:l:1:f:10:cf:2\ncell:F163:l:1:f:10:cf:2\ncell:G163:l:1:f:10:cf:2\ncell:H163:l:1:f:10:cf:2\ncell:I163:l:1:f:10:cf:2\ncell:J163:l:1:f:10:cf:2\ncell:K163:l:1:f:10:cf:2\ncell:L163:l:1:f:10:cf:2\ncell:M163:l:1:f:10:cf:2\ncell:N163:l:1:f:10:cf:2\ncell:O163:l:1:f:10:cf:2\ncell:P163:l:1:f:10:cf:2\ncell:Q163:l:1:f:10:cf:2\ncell:R163:l:1:f:10:cf:2\ncell:S163:l:1:f:10:cf:2\ncell:T163:l:1:f:10:cf:2\ncell:U163:l:1:f:10:cf:2\ncell:V163:l:1:f:10:cf:2\ncell:W163:l:1:f:10:cf:2\ncell:A164:l:1:f:10:cf:2\ncell:B164:l:1:f:10:cf:2\ncell:C164:l:1:f:10:cf:2\ncell:D164:l:1:f:10:cf:2\ncell:E164:l:1:f:10:cf:2\ncell:F164:l:1:f:10:cf:2\ncell:G164:l:1:f:10:cf:2\ncell:H164:l:1:f:10:cf:2\ncell:I164:l:1:f:10:cf:2\ncell:J164:l:1:f:10:cf:2\ncell:K164:l:1:f:10:cf:2\ncell:L164:l:1:f:10:cf:2\ncell:M164:l:1:f:10:cf:2\ncell:N164:l:1:f:10:cf:2\ncell:O164:l:1:f:10:cf:2\ncell:P164:l:1:f:10:cf:2\ncell:Q164:l:1:f:10:cf:2\ncell:R164:l:1:f:10:cf:2\ncell:S164:l:1:f:10:cf:2\ncell:T164:l:1:f:10:cf:2\ncell:U164:l:1:f:10:cf:2\ncell:V164:l:1:f:10:cf:2\ncell:W164:l:1:f:10:cf:2\ncell:A165:l:1:f:10:cf:2\ncell:B165:l:1:f:10:cf:2\ncell:C165:l:1:f:10:cf:2\ncell:D165:l:1:f:10:cf:2\ncell:E165:l:1:f:10:cf:2\ncell:F165:l:1:f:10:cf:2\ncell:G165:l:1:f:10:cf:2\ncell:H165:l:1:f:10:cf:2\ncell:I165:l:1:f:10:cf:2\ncell:J165:l:1:f:10:cf:2\ncell:K165:l:1:f:10:cf:2\ncell:L165:l:1:f:10:cf:2\ncell:M165:l:1:f:10:cf:2\ncell:N165:l:1:f:10:cf:2\ncell:O165:l:1:f:10:cf:2\ncell:P165:l:1:f:10:cf:2\ncell:Q165:l:1:f:10:cf:2\ncell:R165:l:1:f:10:cf:2\ncell:S165:l:1:f:10:cf:2\ncell:T165:l:1:f:10:cf:2\ncell:U165:l:1:f:10:cf:2\ncell:V165:l:1:f:10:cf:2\ncell:W165:l:1:f:10:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:30\nrow:5:h:171\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:18.75\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:15\nrow:17:h:15\nrow:18:h:15\nrow:19:h:15\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nrow:102:h:14.25\nrow:103:h:14.25\nrow:104:h:14.25\nrow:105:h:14.25\nrow:106:h:14.25\nrow:107:h:14.25\nrow:108:h:14.25\nrow:109:h:14.25\nrow:110:h:14.25\nrow:111:h:14.25\nrow:112:h:14.25\nrow:113:h:14.25\nrow:114:h:14.25\nrow:115:h:14.25\nrow:116:h:14.25\nrow:117:h:14.25\nrow:118:h:14.25\nrow:119:h:14.25\nrow:120:h:14.25\nrow:121:h:14.25\nrow:122:h:14.25\nrow:123:h:14.25\nrow:124:h:14.25\nrow:125:h:14.25\nrow:126:h:14.25\nrow:127:h:14.25\nrow:128:h:14.25\nrow:129:h:14.25\nrow:130:h:14.25\nrow:131:h:14.25\nrow:132:h:14.25\nrow:133:h:14.25\nrow:134:h:14.25\nrow:135:h:14.25\nrow:136:h:14.25\nrow:137:h:14.25\nrow:138:h:14.25\nrow:139:h:14.25\nrow:140:h:14.25\nrow:141:h:14.25\nrow:142:h:14.25\nrow:143:h:14.25\nrow:144:h:14.25\nrow:145:h:14.25\nrow:146:h:14.25\nrow:147:h:14.25\nrow:148:h:14.25\nrow:149:h:14.25\nsheet:c:27:r:165:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(136,204,119)\ncolor:4:rgb(230,230,250)\ncolor:5:rgb(255, 255, 255)\ncolor:6:rgb(255,255,187)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 24pt Arial\nfont:6:normal bold 9pt Arial\nfont:7:normal normal * Arial\nfont:8:normal normal 10pt Arial\nfont:9:normal normal 12pt Arial\nfont:10:normal normal 7pt Arial\nfont:11:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\nname:COMPARISON::S91\\cU105\nname:TRACKING::AC91\\cAE105\n', - }, - name: "expense", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:6:cf:2:ntvf:2\ncell:B1:l:1:f:6:cf:2\ncell:C1:l:1:f:6:cf:2\ncell:D1:l:1:f:6:cf:2\ncell:E1:l:1:f:6:cf:2\ncell:F1:l:1:f:6:cf:2\ncell:G1:l:1:f:6:cf:2\ncell:H1:l:1:f:6:cf:2\ncell:I1:l:1:f:6:cf:2\ncell:J1:l:1:f:6:cf:2\ncell:K1:l:1:f:6:cf:2\ncell:L1:l:1:f:6:cf:2\ncell:M1:l:1:f:6:cf:2\ncell:N1:l:1:f:6:cf:2\ncell:O1:l:1:f:6:cf:2\ncell:P1:l:1:f:6:cf:2\ncell:Q1:l:1:f:6:cf:2\ncell:R1:l:1:f:6:cf:2\ncell:S1:l:1:f:6:cf:2\ncell:T1:l:1:f:6:cf:2\ncell:U1:l:1:f:6:cf:2\ncell:V1:l:1:f:6:cf:2\ncell:W1:l:1:f:6:cf:2\ncell:A2:l:1:f:6:cf:2\ncell:B2:l:1:f:6:cf:2\ncell:C2:l:1:f:6:cf:2\ncell:D2:t:Expenses:l:2:f:3:cf:2\ncell:E2:l:1:f:6:cf:2\ncell:F2:l:1:f:6:cf:2\ncell:G2:l:1:f:6:cf:2\ncell:H2:l:1:f:6:cf:2\ncell:I2:l:1:f:6:cf:2\ncell:J2:l:1:f:6:cf:2\ncell:K2:l:1:f:6:cf:2\ncell:L2:l:1:f:6:cf:2\ncell:M2:l:1:f:6:cf:2\ncell:N2:l:1:f:6:cf:2\ncell:O2:l:1:f:6:cf:2\ncell:P2:l:1:f:6:cf:2\ncell:Q2:l:1:f:6:cf:2\ncell:R2:l:1:f:6:cf:2\ncell:S2:l:1:f:6:cf:2\ncell:T2:l:1:f:6:cf:2\ncell:U2:l:1:f:6:cf:2\ncell:V2:l:1:f:6:cf:2\ncell:W2:l:1:f:6:cf:2\ncell:A3:l:1:f:6:cf:2\ncell:B3:l:1:f:6:cf:2\ncell:C3:l:1:f:6:cf:2\ncell:D3:l:1:f:6:cf:2\ncell:G3:l:1:f:6:cf:2\ncell:H3:l:1:f:6:cf:2\ncell:I3:l:1:f:6:cf:2\ncell:J3:l:1:f:6:cf:2\ncell:K3:l:1:f:6:cf:2\ncell:L3:l:1:f:6:cf:2\ncell:M3:l:1:f:6:cf:2\ncell:N3:l:1:f:6:cf:2\ncell:O3:l:1:f:6:cf:2\ncell:P3:l:1:f:6:cf:2\ncell:Q3:t: :l:1:f:6:cf:2\ncell:R3:l:1:f:6:cf:2\ncell:S3:l:1:f:6:cf:2\ncell:T3:l:1:f:6:cf:2\ncell:U3:l:1:f:6:cf:2\ncell:V3:l:1:f:6:cf:2\ncell:W3:l:1:f:6:cf:2\ncell:B4:t:Food & Beverages:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C4:b:2:2:2:2:l:3:f:2:c:4:bg:2:cf:2\ncell:D4:b:2:2:2:2:l:3:f:2:c:4:bg:2:cf:1\ncell:E4:vtf:n:511:E5+E9:b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F4:vtf:n:6132:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O4:l:1:f:6:cf:2\ncell:P4:l:1:f:6:cf:2\ncell:Q4:l:1:f:6:cf:2\ncell:R4:l:1:f:6:cf:2\ncell:S4:l:1:f:6:cf:2\ncell:T4:l:1:f:6:cf:2\ncell:U4:l:1:f:6:cf:2\ncell:V4:l:1:f:6:cf:2\ncell:W4:l:1:f:6:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:5:c:1:bg:5\ncell:C5:t:Food at home:l:3:f:5:c:1:bg:5:cf:2:colspan:2\ncell:D5:t::b::1:1::l:3:f:5:c:1:bg:5:cf:2\ncell:E5:vtf:n:302:SUM(E6\\cE8):b:::1::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:F5:vtf:n:3624:IF( (E5*12)=0,"",(E5*12)):b::1:::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:6:cf:2\ncell:P5:l:1:f:6:cf:2\ncell:Q5:l:1:f:6:cf:2\ncell:R5:l:1:f:6:cf:2\ncell:S5:l:1:f:6:cf:2\ncell:T5:l:1:f:6:cf:2\ncell:U5:l:1:f:6:cf:2\ncell:V5:l:1:f:6:cf:2\ncell:W5:l:1:f:6:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:6:cf:2\ncell:C6:l:3:f:6:cf:2\ncell:D6:t:Groceries:l:3:f:5:cf:2\ncell:E6:v:302:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F6:vtf:n:3624:IF( (E6*12)=0,"",(E6*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:6:cf:2\ncell:P6:l:1:f:6:cf:2\ncell:Q6:l:1:f:6:cf:2\ncell:R6:l:1:f:6:cf:2\ncell:S6:l:1:f:6:cf:2\ncell:T6:l:1:f:6:cf:2\ncell:U6:l:1:f:6:cf:2\ncell:V6:l:1:f:6:cf:2\ncell:W6:l:1:f:6:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:6:bg:3:cf:2\ncell:C7:l:3:f:6:bg:3:cf:2\ncell:D7:t:Cooking supplies:l:3:f:5:bg:3:cf:2\ncell:E7:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1:::l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:6:cf:2\ncell:P7:l:1:f:6:cf:2\ncell:Q7:l:1:f:6:cf:2\ncell:R7:l:1:f:6:cf:2\ncell:S7:l:1:f:6:cf:2\ncell:T7:l:1:f:6:cf:2\ncell:U7:l:1:f:6:cf:2\ncell:V7:l:1:f:6:cf:2\ncell:W7:l:1:f:6:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:6:cf:2\ncell:C8:l:3:f:6:cf:2\ncell:D8:t:Other:l:3:f:5:cf:2\ncell:E8:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:6:cf:2\ncell:P8:l:1:f:6:cf:2\ncell:Q8:l:1:f:6:cf:2\ncell:R8:l:1:f:6:cf:2\ncell:S8:l:1:f:6:cf:2\ncell:T8:l:1:f:6:cf:2\ncell:U8:l:1:f:6:cf:2\ncell:V8:l:1:f:6:cf:2\ncell:W8:l:1:f:6:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:5:c:1:bg:5\ncell:C9:t:Dining Out:l:3:f:5:c:1:bg:5:cf:2:colspan:2\ncell:D9:t:Tips:b::1:1::l:3:f:5:c:1:bg:5:cf:2\ncell:E9:vtf:n:209:SUM(E10\\cE11):b:::1::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:F9:vtf:n:2508:IF( (E9*12)=0,"",(E9*12)):b::1:::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:6:cf:2\ncell:P9:l:1:f:6:cf:2\ncell:Q9:l:1:f:6:cf:2\ncell:R9:l:1:f:6:cf:2\ncell:S9:l:1:f:6:cf:2\ncell:T9:l:1:f:6:cf:2\ncell:U9:l:1:f:6:cf:2\ncell:V9:l:1:f:6:cf:2\ncell:W9:l:1:f:6:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:6:cf:2\ncell:C10:l:3:f:6:cf:2\ncell:D10:t:Restaurants:b::1:::l:3:f:5:cf:2\ncell:E10:v:209:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F10:vtf:n:2508:IF( (E10*12)=0,"",(E10*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:6:cf:2\ncell:P10:l:1:f:6:cf:2\ncell:Q10:l:1:f:6:cf:2\ncell:R10:l:1:f:6:cf:2\ncell:S10:l:1:f:6:cf:2\ncell:T10:l:1:f:6:cf:2\ncell:U10:l:1:f:6:cf:2\ncell:V10:l:1:f:6:cf:2\ncell:W10:l:1:f:6:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:6:bg:3:cf:2\ncell:C11:l:3:f:6:bg:3:cf:2\ncell:D11:t:Other :l:3:f:5:bg:3:cf:2\ncell:E11:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1:::l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:6:cf:2\ncell:P11:l:1:f:6:cf:2\ncell:Q11:l:1:f:6:cf:2\ncell:R11:l:1:f:6:cf:2\ncell:S11:l:1:f:6:cf:2\ncell:T11:l:1:f:6:cf:2\ncell:U11:l:1:f:6:cf:2\ncell:V11:l:1:f:6:cf:2\ncell:W11:l:1:f:6:cf:2\ncell:B12:t:Clothes & Personal Services:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C12:l:3:f:2:c:4:bg:2:cf:2\ncell:D12:l:3:f:2:c:4:bg:2:cf:1\ncell:E12:vtf:n:191:SUM(E13\\cE16):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F12:vtf:n:2292:IF( (E12*12)=0,"",(E12*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O12:l:1:f:6:cf:2\ncell:P12:l:1:f:6:cf:2\ncell:Q12:l:1:f:6:cf:2\ncell:R12:l:1:f:6:cf:2\ncell:S12:l:1:f:6:cf:2\ncell:T12:l:1:f:6:cf:2\ncell:U12:l:1:f:6:cf:2\ncell:V12:l:1:f:6:cf:2\ncell:W12:l:1:f:6:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:6:cf:2\ncell:C13:l:3:f:6:cf:2\ncell:D13:t:Clothes:l:3:f:5:cf:2\ncell:E13:v:142:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F13:vtf:n:1704:IF( (E13*12)=0,"",(E13*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:6:cf:2\ncell:P13:l:1:f:6:cf:2\ncell:Q13:l:1:f:6:cf:2\ncell:R13:l:1:f:6:cf:2\ncell:S13:l:1:f:6:cf:2\ncell:T13:l:1:f:6:cf:2\ncell:U13:l:1:f:6:cf:2\ncell:V13:l:1:f:6:cf:2\ncell:W13:l:1:f:6:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:6:bg:3:cf:2\ncell:C14:l:3:f:6:bg:3:cf:2\ncell:D14:t:Footwear:l:3:f:5:bg:3:cf:2\ncell:E14:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F14:vtf:t::IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:6:cf:2\ncell:P14:l:1:f:6:cf:2\ncell:Q14:l:1:f:6:cf:2\ncell:R14:l:1:f:6:cf:2\ncell:S14:l:1:f:6:cf:2\ncell:T14:l:1:f:6:cf:2\ncell:U14:l:1:f:6:cf:2\ncell:V14:l:1:f:6:cf:2\ncell:W14:l:1:f:6:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:6:cf:2\ncell:C15:l:3:f:6:cf:2\ncell:D15:t:Salon and Personal Care:l:3:f:5:cf:2\ncell:E15:v:49:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F15:vtf:n:588:IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:6:cf:2\ncell:P15:l:1:f:6:cf:2\ncell:Q15:l:1:f:6:cf:2\ncell:R15:l:1:f:6:cf:2\ncell:S15:l:1:f:6:cf:2\ncell:T15:l:1:f:6:cf:2\ncell:U15:l:1:f:6:cf:2\ncell:V15:l:1:f:6:cf:2\ncell:W15:l:1:f:6:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:6:bg:3:cf:2\ncell:C16:l:3:f:6:bg:3:cf:2\ncell:D16:t:Other:l:3:f:5:bg:3:cf:2\ncell:E16:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:6:cf:2\ncell:P16:l:1:f:6:cf:2\ncell:Q16:l:1:f:6:cf:2\ncell:R16:l:1:f:6:cf:2\ncell:S16:l:1:f:6:cf:2\ncell:T16:l:1:f:6:cf:2\ncell:U16:l:1:f:6:cf:2\ncell:V16:l:1:f:6:cf:2\ncell:W16:l:1:f:6:cf:2\ncell:B17:t:Transportation:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C17:l:3:f:2:c:4:bg:2:cf:2\ncell:D17:l:3:f:2:c:4:bg:2:cf:1\ncell:E17:vtf:n:640:SUM(E18\\cE25):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F17:vtf:n:7680:IF( (E17*12)=0,"",(E17*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O17:l:1:f:6:cf:2\ncell:P17:l:1:f:6:cf:2\ncell:Q17:l:1:f:6:cf:2\ncell:R17:l:1:f:6:cf:2\ncell:S17:l:1:f:6:cf:2\ncell:T17:l:1:f:6:cf:2\ncell:U17:l:1:f:6:cf:2\ncell:V17:l:1:f:6:cf:2\ncell:W17:l:1:f:6:cf:2\ncell:A18:b::1::\ncell:B18:b::::1:l:3:f:6:bg:4:cf:2\ncell:C18:l:3:f:6:bg:4:cf:2\ncell:D18:t:Owned Vehicle Payments:l:3:f:5:bg:4:cf:2\ncell:E18:v:640:b::1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F18:vtf:n:7680:IF( (E18*12)=0,"",(E18*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O18:l:1:f:6:cf:2\ncell:P18:l:1:f:6:cf:2\ncell:Q18:l:1:f:6:cf:2\ncell:R18:l:1:f:6:cf:2\ncell:S18:l:1:f:6:cf:2\ncell:T18:l:1:f:6:cf:2\ncell:U18:l:1:f:6:cf:2\ncell:V18:l:1:f:6:cf:2\ncell:W18:l:1:f:6:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:6:bg:3:cf:2\ncell:C19:l:3:f:6:bg:3:cf:2\ncell:D19:t:Rentals, Lease Payments:l:3:f:5:bg:3:cf:2\ncell:E19:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F19:vtf:t::IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O19:l:1:f:6:cf:2\ncell:P19:l:1:f:6:cf:2\ncell:Q19:l:1:f:6:cf:2\ncell:R19:l:1:f:6:cf:2\ncell:S19:l:1:f:6:cf:2\ncell:T19:l:1:f:6:cf:2\ncell:U19:l:1:f:6:cf:2\ncell:V19:l:1:f:6:cf:2\ncell:W19:l:1:f:6:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:6:bg:4:cf:2\ncell:C20:l:3:f:6:bg:4:cf:2\ncell:D20:t:Gas & Oil:l:3:f:5:bg:4:cf:2\ncell:E20:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O20:l:1:f:6:cf:2\ncell:P20:l:1:f:6:cf:2\ncell:Q20:l:1:f:6:cf:2\ncell:R20:l:1:f:6:cf:2\ncell:S20:l:1:f:6:cf:2\ncell:T20:l:1:f:6:cf:2\ncell:U20:l:1:f:6:cf:2\ncell:V20:l:1:f:6:cf:2\ncell:W20:l:1:f:6:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:6:bg:3:cf:2\ncell:C21:l:3:f:6:bg:3:cf:2\ncell:D21:t:Maintenance & Repairs:l:3:f:5:bg:3:cf:2\ncell:E21:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O21:l:1:f:6:cf:2\ncell:P21:l:1:f:6:cf:2\ncell:Q21:l:1:f:6:cf:2\ncell:R21:l:1:f:6:cf:2\ncell:S21:l:1:f:6:cf:2\ncell:T21:l:1:f:6:cf:2\ncell:U21:l:1:f:6:cf:2\ncell:V21:l:1:f:6:cf:2\ncell:W21:l:1:f:6:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:6:bg:4:cf:2\ncell:C22:l:3:f:6:bg:4:cf:2\ncell:D22:t:Vehicle Insurance:l:3:f:5:bg:4:cf:2\ncell:E22:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O22:l:1:f:6:cf:2\ncell:P22:l:1:f:6:cf:2\ncell:Q22:l:1:f:6:cf:2\ncell:R22:l:1:f:6:cf:2\ncell:S22:l:1:f:6:cf:2\ncell:T22:l:1:f:6:cf:2\ncell:U22:l:1:f:6:cf:2\ncell:V22:l:1:f:6:cf:2\ncell:W22:l:1:f:6:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:6:bg:3:cf:2\ncell:C23:l:3:f:6:bg:3:cf:2\ncell:D23:t:License, Registration:l:3:f:5:bg:3:cf:2\ncell:E23:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O23:l:1:f:6:cf:2\ncell:P23:l:1:f:6:cf:2\ncell:Q23:l:1:f:6:cf:2\ncell:R23:l:1:f:6:cf:2\ncell:S23:l:1:f:6:cf:2\ncell:T23:l:1:f:6:cf:2\ncell:U23:l:1:f:6:cf:2\ncell:V23:l:1:f:6:cf:2\ncell:W23:l:1:f:6:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:6:bg:4:cf:2\ncell:C24:l:3:f:6:bg:4:cf:2\ncell:D24:t:Commuting Expense:l:3:f:5:bg:4:cf:2\ncell:E24:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O24:l:1:f:6:cf:2\ncell:P24:l:1:f:6:cf:2\ncell:Q24:l:1:f:6:cf:2\ncell:R24:l:1:f:6:cf:2\ncell:S24:l:1:f:6:cf:2\ncell:T24:l:1:f:6:cf:2\ncell:U24:l:1:f:6:cf:2\ncell:V24:l:1:f:6:cf:2\ncell:W24:l:1:f:6:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:6:bg:3:cf:2\ncell:C25:l:3:f:6:bg:3:cf:2\ncell:D25:t:Other:l:3:f:5:bg:3:cf:2\ncell:E25:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F25:vtf:t::IF( (E25*12)=0,"",(E25*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O25:l:1:f:6:cf:2\ncell:P25:l:1:f:6:cf:2\ncell:Q25:l:1:f:6:cf:2\ncell:R25:l:1:f:6:cf:2\ncell:S25:l:1:f:6:cf:2\ncell:T25:l:1:f:6:cf:2\ncell:U25:l:1:f:6:cf:2\ncell:V25:l:1:f:6:cf:2\ncell:W25:l:1:f:6:cf:2\ncell:B26:t:Healthcare:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C26:l:3:f:2:c:4:bg:2:cf:2\ncell:D26:l:3:f:2:c:4:bg:2:cf:1\ncell:E26:vtf:n:263:SUM(E27\\cE31):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F26:vtf:n:3156:IF( (E26*12)=0,"",(E26*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O26:l:1:f:6:cf:2\ncell:P26:l:1:f:6:cf:2\ncell:Q26:l:1:f:6:cf:2\ncell:R26:l:1:f:6:cf:2\ncell:S26:l:1:f:6:cf:2\ncell:T26:l:1:f:6:cf:2\ncell:U26:l:1:f:6:cf:2\ncell:V26:l:1:f:6:cf:2\ncell:W26:l:1:f:6:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:6:cf:2\ncell:C27:l:3:f:6:cf:2\ncell:D27:t:Health Insurance:l:3:f:5:cf:2\ncell:E27:v:263:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F27:vtf:n:3156:IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:6:cf:2\ncell:P27:l:1:f:6:cf:2\ncell:Q27:l:1:f:6:cf:2\ncell:R27:l:1:f:6:cf:2\ncell:S27:l:1:f:6:cf:2\ncell:T27:l:1:f:6:cf:2\ncell:U27:l:1:f:6:cf:2\ncell:V27:l:1:f:6:cf:2\ncell:W27:l:1:f:6:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:6:bg:3:cf:2\ncell:C28:l:3:f:6:bg:3:cf:2\ncell:D28:t:Medical Services:l:3:f:5:bg:3:cf:2\ncell:E28:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:6:cf:2\ncell:P28:l:1:f:6:cf:2\ncell:Q28:l:1:f:6:cf:2\ncell:R28:l:1:f:6:cf:2\ncell:S28:l:1:f:6:cf:2\ncell:T28:l:1:f:6:cf:2\ncell:U28:l:1:f:6:cf:2\ncell:V28:l:1:f:6:cf:2\ncell:W28:l:1:f:6:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:6:cf:2\ncell:C29:l:3:f:6:cf:2\ncell:D29:t:Medicine, Drugs & Supplies:l:3:f:5:cf:2\ncell:E29:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:6:cf:2\ncell:P29:l:1:f:6:cf:2\ncell:Q29:l:1:f:6:cf:2\ncell:R29:l:1:f:6:cf:2\ncell:S29:l:1:f:6:cf:2\ncell:T29:l:1:f:6:cf:2\ncell:U29:l:1:f:6:cf:2\ncell:V29:l:1:f:6:cf:2\ncell:W29:l:1:f:6:cf:2\ncell:A30:b::1::\ncell:B30:b::::1:l:3:f:6:bg:3:cf:2\ncell:C30:l:3:f:6:bg:3:cf:2\ncell:D30:t:Heathclub Memberships:l:3:f:5:bg:3:cf:2\ncell:E30:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G30:b::::1\ncell:O30:l:1:f:6:cf:2\ncell:P30:l:1:f:6:cf:2\ncell:Q30:l:1:f:6:cf:2\ncell:R30:l:1:f:6:cf:2\ncell:S30:l:1:f:6:cf:2\ncell:T30:l:1:f:6:cf:2\ncell:U30:l:1:f:6:cf:2\ncell:V30:l:1:f:6:cf:2\ncell:W30:l:1:f:6:cf:2\ncell:A31:b::1::\ncell:B31:b:::1:1:l:3:f:6:cf:2\ncell:C31:b:::1::l:3:f:6:cf:2\ncell:D31:t:Other:b:::1::l:3:f:5:cf:2\ncell:E31:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:G31:b::::1\ncell:O31:l:1:f:6:cf:2\ncell:P31:l:1:f:6:cf:2\ncell:Q31:l:1:f:6:cf:2\ncell:R31:l:1:f:6:cf:2\ncell:S31:l:1:f:6:cf:2\ncell:T31:l:1:f:6:cf:2\ncell:U31:l:1:f:6:cf:2\ncell:V31:l:1:f:6:cf:2\ncell:W31:l:1:f:6:cf:2\ncell:B32:b:1:::\ncell:C32:b:1:::\ncell:D32:b:1:::\ncell:O32:l:1:f:6:cf:2\ncell:P32:l:1:f:6:cf:2\ncell:Q32:l:1:f:6:cf:2\ncell:R32:l:1:f:6:cf:2\ncell:S32:l:1:f:6:cf:2\ncell:T32:l:1:f:6:cf:2\ncell:U32:l:1:f:6:cf:2\ncell:V32:l:1:f:6:cf:2\ncell:W32:l:1:f:6:cf:2\ncell:O33:l:1:f:6:cf:2\ncell:P33:l:1:f:6:cf:2\ncell:Q33:l:1:f:6:cf:2\ncell:R33:l:1:f:6:cf:2\ncell:S33:l:1:f:6:cf:2\ncell:T33:l:1:f:6:cf:2\ncell:U33:l:1:f:6:cf:2\ncell:V33:l:1:f:6:cf:2\ncell:W33:l:1:f:6:cf:2\ncell:O34:l:1:f:6:cf:2\ncell:P34:l:1:f:6:cf:2\ncell:Q34:l:1:f:6:cf:2\ncell:R34:l:1:f:6:cf:2\ncell:S34:l:1:f:6:cf:2\ncell:T34:l:1:f:6:cf:2\ncell:U34:l:1:f:6:cf:2\ncell:V34:l:1:f:6:cf:2\ncell:W34:l:1:f:6:cf:2\ncell:O35:l:1:f:6:cf:2\ncell:P35:l:1:f:6:cf:2\ncell:Q35:l:1:f:6:cf:2\ncell:R35:l:1:f:6:cf:2\ncell:S35:l:1:f:6:cf:2\ncell:T35:l:1:f:6:cf:2\ncell:U35:l:1:f:6:cf:2\ncell:V35:l:1:f:6:cf:2\ncell:W35:l:1:f:6:cf:2\ncell:O36:l:1:f:6:cf:2\ncell:P36:l:1:f:6:cf:2\ncell:Q36:l:1:f:6:cf:2\ncell:R36:l:1:f:6:cf:2\ncell:S36:l:1:f:6:cf:2\ncell:T36:l:1:f:6:cf:2\ncell:U36:l:1:f:6:cf:2\ncell:V36:l:1:f:6:cf:2\ncell:W36:l:1:f:6:cf:2\ncell:O37:l:1:f:6:cf:2\ncell:P37:l:1:f:6:cf:2\ncell:Q37:l:1:f:6:cf:2\ncell:R37:l:1:f:6:cf:2\ncell:S37:l:1:f:6:cf:2\ncell:T37:l:1:f:6:cf:2\ncell:U37:l:1:f:6:cf:2\ncell:V37:l:1:f:6:cf:2\ncell:W37:l:1:f:6:cf:2\ncell:O38:l:1:f:6:cf:2\ncell:P38:l:1:f:6:cf:2\ncell:Q38:l:1:f:6:cf:2\ncell:R38:l:1:f:6:cf:2\ncell:S38:l:1:f:6:cf:2\ncell:T38:l:1:f:6:cf:2\ncell:U38:l:1:f:6:cf:2\ncell:V38:l:1:f:6:cf:2\ncell:W38:l:1:f:6:cf:2\ncell:O39:l:1:f:6:cf:2\ncell:P39:l:1:f:6:cf:2\ncell:Q39:l:1:f:6:cf:2\ncell:R39:l:1:f:6:cf:2\ncell:S39:l:1:f:6:cf:2\ncell:T39:l:1:f:6:cf:2\ncell:U39:l:1:f:6:cf:2\ncell:V39:l:1:f:6:cf:2\ncell:W39:l:1:f:6:cf:2\ncell:O40:l:1:f:6:cf:2\ncell:P40:l:1:f:6:cf:2\ncell:Q40:l:1:f:6:cf:2\ncell:R40:l:1:f:6:cf:2\ncell:S40:l:1:f:6:cf:2\ncell:T40:l:1:f:6:cf:2\ncell:U40:l:1:f:6:cf:2\ncell:V40:l:1:f:6:cf:2\ncell:W40:l:1:f:6:cf:2\ncell:O41:l:1:f:6:cf:2\ncell:P41:l:1:f:6:cf:2\ncell:Q41:l:1:f:6:cf:2\ncell:R41:l:1:f:6:cf:2\ncell:S41:l:1:f:6:cf:2\ncell:T41:l:1:f:6:cf:2\ncell:U41:l:1:f:6:cf:2\ncell:V41:l:1:f:6:cf:2\ncell:W41:l:1:f:6:cf:2\ncell:O42:l:1:f:6:cf:2\ncell:P42:l:1:f:6:cf:2\ncell:Q42:l:1:f:6:cf:2\ncell:R42:l:1:f:6:cf:2\ncell:S42:l:1:f:6:cf:2\ncell:T42:l:1:f:6:cf:2\ncell:U42:l:1:f:6:cf:2\ncell:V42:l:1:f:6:cf:2\ncell:W42:l:1:f:6:cf:2\ncell:O43:l:1:f:6:cf:2\ncell:P43:l:1:f:6:cf:2\ncell:Q43:l:1:f:6:cf:2\ncell:R43:l:1:f:6:cf:2\ncell:S43:l:1:f:6:cf:2\ncell:T43:l:1:f:6:cf:2\ncell:U43:l:1:f:6:cf:2\ncell:V43:l:1:f:6:cf:2\ncell:W43:l:1:f:6:cf:2\ncell:O44:l:1:f:6:cf:2\ncell:P44:l:1:f:6:cf:2\ncell:Q44:l:1:f:6:cf:2\ncell:R44:l:1:f:6:cf:2\ncell:S44:l:1:f:6:cf:2\ncell:T44:l:1:f:6:cf:2\ncell:U44:l:1:f:6:cf:2\ncell:V44:l:1:f:6:cf:2\ncell:W44:l:1:f:6:cf:2\ncell:O45:l:1:f:6:cf:2\ncell:P45:l:1:f:6:cf:2\ncell:Q45:l:1:f:6:cf:2\ncell:R45:l:1:f:6:cf:2\ncell:O46:l:1:f:6:cf:2\ncell:P46:l:1:f:6:cf:2\ncell:Q46:l:1:f:6:cf:2\ncell:R46:l:1:f:6:cf:2\ncell:O47:l:1:f:6:cf:2\ncell:P47:l:1:f:6:cf:2\ncell:Q47:l:1:f:6:cf:2\ncell:R47:l:1:f:6:cf:2\ncell:O48:l:1:f:6:cf:2\ncell:P48:l:1:f:6:cf:2\ncell:Q48:l:1:f:6:cf:2\ncell:R48:l:1:f:6:cf:2\ncell:O49:l:1:f:6:cf:2\ncell:P49:l:1:f:6:cf:2\ncell:Q49:l:1:f:6:cf:2\ncell:R49:l:1:f:6:cf:2\ncell:O50:l:1:f:6:cf:2\ncell:P50:l:1:f:6:cf:2\ncell:Q50:l:1:f:6:cf:2\ncell:R50:l:1:f:6:cf:2\ncell:O51:l:1:f:6:cf:2\ncell:P51:l:1:f:6:cf:2\ncell:Q51:l:1:f:6:cf:2\ncell:R51:l:1:f:6:cf:2\ncell:O52:l:1:f:6:cf:2\ncell:P52:l:1:f:6:cf:2\ncell:Q52:l:1:f:6:cf:2\ncell:R52:l:1:f:6:cf:2\ncell:O53:l:1:f:6:cf:2\ncell:P53:l:1:f:6:cf:2\ncell:Q53:l:1:f:6:cf:2\ncell:R53:l:1:f:6:cf:2\ncell:O54:l:1:f:6:cf:2\ncell:P54:l:1:f:6:cf:2\ncell:Q54:l:1:f:6:cf:2\ncell:R54:l:1:f:6:cf:2\ncell:O55:l:1:f:6:cf:2\ncell:P55:l:1:f:6:cf:2\ncell:Q55:l:1:f:6:cf:2\ncell:R55:l:1:f:6:cf:2\ncell:O56:l:1:f:6:cf:2\ncell:P56:l:1:f:6:cf:2\ncell:Q56:l:1:f:6:cf:2\ncell:R56:l:1:f:6:cf:2\ncell:O57:l:1:f:6:cf:2\ncell:P57:l:1:f:6:cf:2\ncell:Q57:l:1:f:6:cf:2\ncell:R57:l:1:f:6:cf:2\ncell:O58:l:1:f:6:cf:2\ncell:P58:l:1:f:6:cf:2\ncell:Q58:l:1:f:6:cf:2\ncell:R58:l:1:f:6:cf:2\ncell:B59:l:1:f:6:cf:2\ncell:C59:l:1:f:6:cf:2\ncell:D59:l:1:f:2:cf:2\ncell:E59:l:1:f:2:cf:3:ntvf:1\ncell:F59:l:1:f:2:cf:3:ntvf:1\ncell:O59:l:1:f:6:cf:2\ncell:P59:l:1:f:6:cf:2\ncell:Q59:l:1:f:6:cf:2\ncell:R59:l:1:f:6:cf:2\ncell:B60:l:1:f:4:cf:2\ncell:C60:l:1:f:4:cf:2\ncell:D60:l:1:f:8:cf:2\ncell:E60:l:1:f:8:cf:2\ncell:F60:l:1:f:6:cf:2\ncell:O60:l:1:f:6:cf:2\ncell:P60:l:1:f:6:cf:2\ncell:Q60:l:1:f:6:cf:2\ncell:R60:l:1:f:6:cf:2\ncell:O61:l:1:f:6:cf:2\ncell:P61:l:1:f:6:cf:2\ncell:Q61:l:1:f:6:cf:2\ncell:R61:l:1:f:6:cf:2\ncell:O62:l:1:f:6:cf:2\ncell:P62:l:1:f:6:cf:2\ncell:Q62:l:1:f:6:cf:2\ncell:R62:l:1:f:6:cf:2\ncell:O63:l:1:f:6:cf:2\ncell:P63:l:1:f:6:cf:2\ncell:Q63:l:1:f:6:cf:2\ncell:R63:l:1:f:6:cf:2\ncell:O64:l:1:f:6:cf:2\ncell:P64:l:1:f:6:cf:2\ncell:Q64:l:1:f:6:cf:2\ncell:R64:l:1:f:6:cf:2\ncell:O65:l:1:f:6:cf:2\ncell:P65:l:1:f:6:cf:2\ncell:Q65:l:1:f:6:cf:2\ncell:R65:l:1:f:6:cf:2\ncell:O66:l:1:f:6:cf:2\ncell:P66:l:1:f:6:cf:2\ncell:Q66:l:1:f:6:cf:2\ncell:R66:l:1:f:6:cf:2\ncell:O67:l:1:f:6:cf:2\ncell:P67:l:1:f:6:cf:2\ncell:Q67:l:1:f:6:cf:2\ncell:R67:l:1:f:6:cf:2\ncell:O68:l:1:f:6:cf:2\ncell:P68:l:1:f:6:cf:2\ncell:Q68:l:1:f:6:cf:2\ncell:R68:l:1:f:6:cf:2\ncell:O69:l:1:f:6:cf:2\ncell:P69:l:1:f:6:cf:2\ncell:Q69:l:1:f:6:cf:2\ncell:R69:l:1:f:6:cf:2\ncell:O70:l:1:f:6:cf:2\ncell:P70:l:1:f:6:cf:2\ncell:Q70:l:1:f:6:cf:2\ncell:R70:l:1:f:6:cf:2\ncell:S70:l:1:f:6:cf:2\ncell:T70:l:1:f:6:cf:2\ncell:U70:l:1:f:6:cf:2\ncell:V70:l:1:f:6:cf:2\ncell:W70:l:1:f:6:cf:2\ncell:O71:l:1:f:6:cf:2\ncell:P71:l:1:f:6:cf:2\ncell:Q71:l:1:f:6:cf:2\ncell:R71:l:1:f:6:cf:2\ncell:S71:l:1:f:6:cf:2\ncell:T71:l:1:f:6:cf:2\ncell:U71:l:1:f:6:cf:2\ncell:V71:l:1:f:6:cf:2\ncell:W71:l:1:f:6:cf:2\ncell:O72:l:1:f:6:cf:2\ncell:P72:l:1:f:6:cf:2\ncell:Q72:l:1:f:6:cf:2\ncell:R72:l:1:f:6:cf:2\ncell:S72:l:1:f:6:cf:2\ncell:T72:l:1:f:6:cf:2\ncell:U72:l:1:f:6:cf:2\ncell:V72:l:1:f:6:cf:2\ncell:W72:l:1:f:6:cf:2\ncell:O73:l:1:f:6:cf:2\ncell:P73:l:1:f:6:cf:2\ncell:Q73:l:1:f:6:cf:2\ncell:R73:l:1:f:6:cf:2\ncell:S73:l:1:f:6:cf:2\ncell:T73:l:1:f:6:cf:2\ncell:U73:l:1:f:6:cf:2\ncell:V73:l:1:f:6:cf:2\ncell:W73:l:1:f:6:cf:2\ncell:O74:l:1:f:6:cf:2\ncell:P74:l:1:f:6:cf:2\ncell:Q74:l:1:f:6:cf:2\ncell:R74:l:1:f:6:cf:2\ncell:S74:l:1:f:6:cf:2\ncell:T74:l:1:f:6:cf:2\ncell:U74:l:1:f:6:cf:2\ncell:V74:l:1:f:6:cf:2\ncell:W74:l:1:f:6:cf:2\ncell:O75:l:1:f:6:cf:2\ncell:P75:l:1:f:6:cf:2\ncell:Q75:l:1:f:6:cf:2\ncell:R75:l:1:f:6:cf:2\ncell:S75:l:1:f:6:cf:2\ncell:T75:l:1:f:6:cf:2\ncell:U75:l:1:f:6:cf:2\ncell:V75:l:1:f:6:cf:2\ncell:W75:l:1:f:6:cf:2\ncell:O76:l:1:f:6:cf:2\ncell:P76:l:1:f:6:cf:2\ncell:Q76:l:1:f:6:cf:2\ncell:R76:l:1:f:6:cf:2\ncell:S76:l:1:f:6:cf:2\ncell:T76:l:1:f:6:cf:2\ncell:U76:l:1:f:6:cf:2\ncell:V76:l:1:f:6:cf:2\ncell:W76:l:1:f:6:cf:2\ncell:O77:l:1:f:6:cf:2\ncell:P77:l:1:f:6:cf:2\ncell:Q77:l:1:f:6:cf:2\ncell:R77:l:1:f:6:cf:2\ncell:S77:l:1:f:6:cf:2\ncell:T77:l:1:f:6:cf:2\ncell:U77:l:1:f:6:cf:2\ncell:V77:l:1:f:6:cf:2\ncell:W77:l:1:f:6:cf:2\ncell:O78:l:1:f:6:cf:2\ncell:P78:l:1:f:6:cf:2\ncell:Q78:l:1:f:6:cf:2\ncell:R78:l:1:f:6:cf:2\ncell:S78:l:1:f:6:cf:2\ncell:T78:l:1:f:6:cf:2\ncell:U78:l:1:f:6:cf:2\ncell:V78:l:1:f:6:cf:2\ncell:W78:l:1:f:6:cf:2\ncell:O79:l:1:f:6:cf:2\ncell:P79:l:1:f:6:cf:2\ncell:Q79:l:1:f:6:cf:2\ncell:R79:l:1:f:6:cf:2\ncell:S79:l:1:f:6:cf:2\ncell:T79:l:1:f:6:cf:2\ncell:U79:l:1:f:6:cf:2\ncell:V79:l:1:f:6:cf:2\ncell:W79:l:1:f:6:cf:2\ncell:O80:l:1:f:6:cf:2\ncell:P80:l:1:f:6:cf:2\ncell:Q80:l:1:f:6:cf:2\ncell:R80:l:1:f:6:cf:2\ncell:S80:l:1:f:6:cf:2\ncell:T80:l:1:f:6:cf:2\ncell:U80:l:1:f:6:cf:2\ncell:V80:l:1:f:6:cf:2\ncell:W80:l:1:f:6:cf:2\ncell:O81:l:1:f:6:cf:2\ncell:P81:l:1:f:6:cf:2\ncell:Q81:l:1:f:6:cf:2\ncell:R81:l:1:f:6:cf:2\ncell:S81:l:1:f:6:cf:2\ncell:T81:l:1:f:6:cf:2\ncell:U81:l:1:f:6:cf:2\ncell:V81:l:1:f:6:cf:2\ncell:W81:l:1:f:6:cf:2\ncell:O82:l:1:f:6:cf:2\ncell:P82:l:1:f:6:cf:2\ncell:Q82:l:1:f:6:cf:2\ncell:R82:l:1:f:6:cf:2\ncell:S82:l:1:f:6:cf:2\ncell:T82:l:1:f:6:cf:2\ncell:U82:l:1:f:6:cf:2\ncell:V82:l:1:f:6:cf:2\ncell:W82:l:1:f:6:cf:2\ncell:O83:l:1:f:6:cf:2\ncell:P83:l:1:f:6:cf:2\ncell:Q83:l:1:f:6:cf:2\ncell:R83:l:1:f:6:cf:2\ncell:S83:l:1:f:6:cf:2\ncell:T83:l:1:f:6:cf:2\ncell:U83:l:1:f:6:cf:2\ncell:V83:l:1:f:6:cf:2\ncell:W83:l:1:f:6:cf:2\ncell:O84:l:1:f:6:cf:2\ncell:P84:l:1:f:6:cf:2\ncell:Q84:l:1:f:6:cf:2\ncell:R84:l:1:f:6:cf:2\ncell:S84:l:1:f:6:cf:2\ncell:T84:l:1:f:6:cf:2\ncell:U84:l:1:f:6:cf:2\ncell:V84:l:1:f:6:cf:2\ncell:W84:l:1:f:6:cf:2\ncell:O85:l:1:f:6:cf:2\ncell:P85:l:1:f:6:cf:2\ncell:Q85:l:1:f:6:cf:2\ncell:R85:l:1:f:6:cf:2\ncell:S85:l:1:f:6:cf:2\ncell:T85:l:1:f:6:cf:2\ncell:U85:l:1:f:6:cf:2\ncell:V85:l:1:f:6:cf:2\ncell:W85:l:1:f:6:cf:2\ncell:O86:l:1:f:6:cf:2\ncell:P86:l:1:f:6:cf:2\ncell:Q86:l:1:f:6:cf:2\ncell:R86:l:1:f:6:cf:2\ncell:S86:l:1:f:6:cf:2\ncell:T86:l:1:f:6:cf:2\ncell:U86:l:1:f:6:cf:2\ncell:V86:l:1:f:6:cf:2\ncell:W86:l:1:f:6:cf:2\ncell:O87:l:1:f:6:cf:2\ncell:P87:l:1:f:6:cf:2\ncell:Q87:l:1:f:6:cf:2\ncell:R87:l:1:f:6:cf:2\ncell:S87:l:1:f:6:cf:2\ncell:T87:l:1:f:6:cf:2\ncell:U87:l:1:f:6:cf:2\ncell:V87:l:1:f:6:cf:2\ncell:W87:l:1:f:6:cf:2\ncell:O88:l:1:f:6:cf:2\ncell:P88:l:1:f:6:cf:2\ncell:Q88:l:1:f:6:cf:2\ncell:R88:l:1:f:6:cf:2\ncell:S88:l:1:f:6:cf:2\ncell:T88:l:1:f:6:cf:2\ncell:U88:l:1:f:6:cf:2\ncell:V88:l:1:f:6:cf:2\ncell:W88:l:1:f:6:cf:2\ncell:O89:l:1:f:6:cf:2\ncell:P89:l:1:f:6:cf:2\ncell:Q89:l:1:f:6:cf:2\ncell:R89:l:1:f:6:cf:2\ncell:S89:l:1:f:6:cf:2\ncell:T89:l:1:f:6:cf:2\ncell:U89:l:1:f:6:cf:2\ncell:V89:l:1:f:6:cf:2\ncell:W89:l:1:f:6:cf:2\ncell:O90:l:1:f:6:cf:2\ncell:P90:l:1:f:6:cf:2\ncell:Q90:l:1:f:6:cf:2\ncell:R90:l:1:f:6:cf:2\ncell:S90:l:1:f:6:cf:2\ncell:T90:l:1:f:6:cf:2\ncell:U90:l:1:f:6:cf:2\ncell:V90:l:1:f:6:cf:2\ncell:W90:l:1:f:6:cf:2\ncell:O91:l:1:f:6:cf:2\ncell:P91:l:1:f:6:cf:2\ncell:Q91:l:1:f:6:cf:2\ncell:R91:l:1:f:6:cf:2\ncell:S91:l:1:f:6:cf:2\ncell:T91:l:1:f:6:cf:2\ncell:U91:l:1:f:6:cf:2\ncell:V91:l:1:f:6:cf:2\ncell:W91:l:1:f:6:cf:2\ncell:O92:l:1:f:6:cf:2\ncell:P92:l:1:f:6:cf:2\ncell:Q92:l:1:f:6:cf:2\ncell:R92:l:1:f:6:cf:2\ncell:S92:l:1:f:6:cf:2\ncell:T92:l:1:f:6:cf:2\ncell:U92:l:1:f:6:cf:2\ncell:V92:l:1:f:6:cf:2\ncell:W92:l:1:f:6:cf:2\ncell:O93:l:1:f:6:cf:2\ncell:P93:l:1:f:6:cf:2\ncell:Q93:l:1:f:6:cf:2\ncell:R93:l:1:f:6:cf:2\ncell:S93:l:1:f:6:cf:2\ncell:T93:l:1:f:6:cf:2\ncell:U93:l:1:f:6:cf:2\ncell:V93:l:1:f:6:cf:2\ncell:W93:l:1:f:6:cf:2\ncell:O94:l:1:f:6:cf:2\ncell:P94:l:1:f:6:cf:2\ncell:Q94:l:1:f:6:cf:2\ncell:R94:l:1:f:6:cf:2\ncell:S94:l:1:f:6:cf:2\ncell:T94:l:1:f:6:cf:2\ncell:U94:l:1:f:6:cf:2\ncell:V94:l:1:f:6:cf:2\ncell:W94:l:1:f:6:cf:2\ncell:O95:l:1:f:6:cf:2\ncell:P95:l:1:f:6:cf:2\ncell:Q95:l:1:f:6:cf:2\ncell:R95:l:1:f:6:cf:2\ncell:S95:l:1:f:6:cf:2\ncell:T95:l:1:f:6:cf:2\ncell:U95:l:1:f:6:cf:2\ncell:V95:l:1:f:6:cf:2\ncell:W95:l:1:f:6:cf:2\ncell:O96:l:1:f:6:cf:2\ncell:P96:l:1:f:6:cf:2\ncell:Q96:l:1:f:6:cf:2\ncell:R96:l:1:f:6:cf:2\ncell:S96:l:1:f:6:cf:2\ncell:T96:l:1:f:6:cf:2\ncell:U96:l:1:f:6:cf:2\ncell:V96:l:1:f:6:cf:2\ncell:W96:l:1:f:6:cf:2\ncell:O97:l:1:f:6:cf:2\ncell:P97:l:1:f:6:cf:2\ncell:Q97:l:1:f:6:cf:2\ncell:R97:l:1:f:6:cf:2\ncell:S97:l:1:f:6:cf:2\ncell:T97:l:1:f:6:cf:2\ncell:U97:l:1:f:6:cf:2\ncell:V97:l:1:f:6:cf:2\ncell:W97:l:1:f:6:cf:2\ncell:O98:l:1:f:6:cf:2\ncell:P98:l:1:f:6:cf:2\ncell:Q98:l:1:f:6:cf:2\ncell:R98:l:1:f:6:cf:2\ncell:S98:l:1:f:6:cf:2\ncell:T98:l:1:f:6:cf:2\ncell:U98:l:1:f:6:cf:2\ncell:V98:l:1:f:6:cf:2\ncell:W98:l:1:f:6:cf:2\ncell:O99:l:1:f:6:cf:2\ncell:P99:l:1:f:6:cf:2\ncell:Q99:l:1:f:6:cf:2\ncell:R99:l:1:f:6:cf:2\ncell:S99:l:1:f:6:cf:2\ncell:T99:l:1:f:6:cf:2\ncell:U99:l:1:f:6:cf:2\ncell:V99:l:1:f:6:cf:2\ncell:W99:l:1:f:6:cf:2\ncell:O100:l:1:f:6:cf:2\ncell:P100:l:1:f:6:cf:2\ncell:Q100:l:1:f:6:cf:2\ncell:R100:l:1:f:6:cf:2\ncell:S100:l:1:f:6:cf:2\ncell:T100:l:1:f:6:cf:2\ncell:U100:l:1:f:6:cf:2\ncell:V100:l:1:f:6:cf:2\ncell:W100:l:1:f:6:cf:2\ncell:O101:l:1:f:6:cf:2\ncell:P101:l:1:f:6:cf:2\ncell:Q101:l:1:f:6:cf:2\ncell:R101:l:1:f:6:cf:2\ncell:S101:l:1:f:6:cf:2\ncell:T101:l:1:f:6:cf:2\ncell:U101:l:1:f:6:cf:2\ncell:V101:l:1:f:6:cf:2\ncell:W101:l:1:f:6:cf:2\ncell:O102:l:1:f:6:cf:2\ncell:P102:l:1:f:6:cf:2\ncell:Q102:l:1:f:6:cf:2\ncell:R102:l:1:f:6:cf:2\ncell:S102:l:1:f:6:cf:2\ncell:T102:l:1:f:6:cf:2\ncell:U102:l:1:f:6:cf:2\ncell:V102:l:1:f:6:cf:2\ncell:W102:l:1:f:6:cf:2\ncell:O103:l:1:f:6:cf:2\ncell:P103:l:1:f:6:cf:2\ncell:Q103:l:1:f:6:cf:2\ncell:R103:l:1:f:6:cf:2\ncell:S103:l:1:f:6:cf:2\ncell:T103:l:1:f:6:cf:2\ncell:U103:l:1:f:6:cf:2\ncell:V103:l:1:f:6:cf:2\ncell:W103:l:1:f:6:cf:2\ncell:O104:l:1:f:6:cf:2\ncell:P104:l:1:f:6:cf:2\ncell:Q104:l:1:f:6:cf:2\ncell:R104:l:1:f:6:cf:2\ncell:S104:l:1:f:6:cf:2\ncell:T104:l:1:f:6:cf:2\ncell:U104:l:1:f:6:cf:2\ncell:V104:l:1:f:6:cf:2\ncell:W104:l:1:f:6:cf:2\ncell:O105:l:1:f:6:cf:2\ncell:P105:l:1:f:6:cf:2\ncell:Q105:l:1:f:6:cf:2\ncell:R105:l:1:f:6:cf:2\ncell:S105:l:1:f:6:cf:2\ncell:T105:l:1:f:6:cf:2\ncell:U105:l:1:f:6:cf:2\ncell:V105:l:1:f:6:cf:2\ncell:W105:l:1:f:6:cf:2\ncell:O106:l:1:f:6:cf:2\ncell:P106:l:1:f:6:cf:2\ncell:Q106:l:1:f:6:cf:2\ncell:R106:l:1:f:6:cf:2\ncell:S106:l:1:f:6:cf:2\ncell:T106:l:1:f:6:cf:2\ncell:U106:l:1:f:6:cf:2\ncell:V106:l:1:f:6:cf:2\ncell:W106:l:1:f:6:cf:2\ncell:O107:l:1:f:6:cf:2\ncell:P107:l:1:f:6:cf:2\ncell:Q107:l:1:f:6:cf:2\ncell:R107:l:1:f:6:cf:2\ncell:S107:l:1:f:6:cf:2\ncell:T107:l:1:f:6:cf:2\ncell:U107:l:1:f:6:cf:2\ncell:V107:l:1:f:6:cf:2\ncell:W107:l:1:f:6:cf:2\ncell:O108:l:1:f:6:cf:2\ncell:P108:l:1:f:6:cf:2\ncell:Q108:l:1:f:6:cf:2\ncell:R108:l:1:f:6:cf:2\ncell:S108:l:1:f:6:cf:2\ncell:T108:l:1:f:6:cf:2\ncell:U108:l:1:f:6:cf:2\ncell:V108:l:1:f:6:cf:2\ncell:W108:l:1:f:6:cf:2\ncell:O109:l:1:f:6:cf:2\ncell:P109:l:1:f:6:cf:2\ncell:Q109:l:1:f:6:cf:2\ncell:R109:l:1:f:6:cf:2\ncell:S109:l:1:f:6:cf:2\ncell:T109:l:1:f:6:cf:2\ncell:U109:l:1:f:6:cf:2\ncell:V109:l:1:f:6:cf:2\ncell:W109:l:1:f:6:cf:2\ncell:O110:l:1:f:6:cf:2\ncell:P110:l:1:f:6:cf:2\ncell:Q110:l:1:f:6:cf:2\ncell:R110:l:1:f:6:cf:2\ncell:S110:l:1:f:6:cf:2\ncell:T110:l:1:f:6:cf:2\ncell:U110:l:1:f:6:cf:2\ncell:V110:l:1:f:6:cf:2\ncell:W110:l:1:f:6:cf:2\ncell:O111:l:1:f:6:cf:2\ncell:P111:l:1:f:6:cf:2\ncell:Q111:l:1:f:6:cf:2\ncell:R111:l:1:f:6:cf:2\ncell:S111:l:1:f:6:cf:2\ncell:T111:l:1:f:6:cf:2\ncell:U111:l:1:f:6:cf:2\ncell:V111:l:1:f:6:cf:2\ncell:W111:l:1:f:6:cf:2\ncell:O112:l:1:f:6:cf:2\ncell:P112:l:1:f:6:cf:2\ncell:Q112:l:1:f:6:cf:2\ncell:R112:l:1:f:6:cf:2\ncell:S112:l:1:f:6:cf:2\ncell:T112:l:1:f:6:cf:2\ncell:U112:l:1:f:6:cf:2\ncell:V112:l:1:f:6:cf:2\ncell:W112:l:1:f:6:cf:2\ncell:O113:l:1:f:6:cf:2\ncell:P113:l:1:f:6:cf:2\ncell:Q113:l:1:f:6:cf:2\ncell:R113:l:1:f:6:cf:2\ncell:S113:l:1:f:6:cf:2\ncell:T113:l:1:f:6:cf:2\ncell:U113:l:1:f:6:cf:2\ncell:V113:l:1:f:6:cf:2\ncell:W113:l:1:f:6:cf:2\ncell:O114:l:1:f:6:cf:2\ncell:P114:l:1:f:6:cf:2\ncell:Q114:l:1:f:6:cf:2\ncell:R114:l:1:f:6:cf:2\ncell:S114:l:1:f:6:cf:2\ncell:T114:l:1:f:6:cf:2\ncell:U114:l:1:f:6:cf:2\ncell:V114:l:1:f:6:cf:2\ncell:W114:l:1:f:6:cf:2\ncell:O115:l:1:f:6:cf:2\ncell:P115:l:1:f:6:cf:2\ncell:Q115:l:1:f:6:cf:2\ncell:R115:l:1:f:6:cf:2\ncell:S115:l:1:f:6:cf:2\ncell:T115:l:1:f:6:cf:2\ncell:U115:l:1:f:6:cf:2\ncell:V115:l:1:f:6:cf:2\ncell:W115:l:1:f:6:cf:2\ncell:O116:l:1:f:6:cf:2\ncell:P116:l:1:f:6:cf:2\ncell:Q116:l:1:f:6:cf:2\ncell:R116:l:1:f:6:cf:2\ncell:S116:l:1:f:6:cf:2\ncell:T116:l:1:f:6:cf:2\ncell:U116:l:1:f:6:cf:2\ncell:V116:l:1:f:6:cf:2\ncell:W116:l:1:f:6:cf:2\ncell:O117:l:1:f:6:cf:2\ncell:P117:l:1:f:6:cf:2\ncell:Q117:l:1:f:6:cf:2\ncell:R117:l:1:f:6:cf:2\ncell:S117:l:1:f:6:cf:2\ncell:T117:l:1:f:6:cf:2\ncell:U117:l:1:f:6:cf:2\ncell:V117:l:1:f:6:cf:2\ncell:W117:l:1:f:6:cf:2\ncell:O118:l:1:f:6:cf:2\ncell:P118:l:1:f:6:cf:2\ncell:Q118:l:1:f:6:cf:2\ncell:R118:l:1:f:6:cf:2\ncell:S118:l:1:f:6:cf:2\ncell:T118:l:1:f:6:cf:2\ncell:U118:l:1:f:6:cf:2\ncell:V118:l:1:f:6:cf:2\ncell:W118:l:1:f:6:cf:2\ncell:O119:l:1:f:6:cf:2\ncell:P119:l:1:f:6:cf:2\ncell:Q119:l:1:f:6:cf:2\ncell:R119:l:1:f:6:cf:2\ncell:S119:l:1:f:6:cf:2\ncell:T119:l:1:f:6:cf:2\ncell:U119:l:1:f:6:cf:2\ncell:V119:l:1:f:6:cf:2\ncell:W119:l:1:f:6:cf:2\ncell:O120:l:1:f:6:cf:2\ncell:P120:l:1:f:6:cf:2\ncell:Q120:l:1:f:6:cf:2\ncell:R120:l:1:f:6:cf:2\ncell:S120:l:1:f:6:cf:2\ncell:T120:l:1:f:6:cf:2\ncell:U120:l:1:f:6:cf:2\ncell:V120:l:1:f:6:cf:2\ncell:W120:l:1:f:6:cf:2\ncell:O121:l:1:f:6:cf:2\ncell:P121:l:1:f:6:cf:2\ncell:Q121:l:1:f:6:cf:2\ncell:R121:l:1:f:6:cf:2\ncell:S121:l:1:f:6:cf:2\ncell:T121:l:1:f:6:cf:2\ncell:U121:l:1:f:6:cf:2\ncell:V121:l:1:f:6:cf:2\ncell:W121:l:1:f:6:cf:2\ncell:O122:l:1:f:7:cf:2\ncell:P122:l:1:f:7:cf:2\ncell:Q122:l:1:f:7:cf:2\ncell:R122:l:1:f:7:cf:2\ncell:S122:l:1:f:7:cf:2\ncell:T122:l:1:f:7:cf:2\ncell:U122:l:1:f:7:cf:2\ncell:V122:l:1:f:7:cf:2\ncell:W122:l:1:f:7:cf:2\ncell:O123:l:1:f:7:cf:2\ncell:P123:l:1:f:7:cf:2\ncell:Q123:l:1:f:7:cf:2\ncell:R123:l:1:f:7:cf:2\ncell:S123:l:1:f:7:cf:2\ncell:T123:l:1:f:7:cf:2\ncell:U123:l:1:f:7:cf:2\ncell:V123:l:1:f:7:cf:2\ncell:W123:l:1:f:7:cf:2\ncell:O124:l:1:f:7:cf:2\ncell:P124:l:1:f:7:cf:2\ncell:Q124:l:1:f:7:cf:2\ncell:R124:l:1:f:7:cf:2\ncell:S124:l:1:f:7:cf:2\ncell:T124:l:1:f:7:cf:2\ncell:U124:l:1:f:7:cf:2\ncell:V124:l:1:f:7:cf:2\ncell:W124:l:1:f:7:cf:2\ncell:O125:l:1:f:7:cf:2\ncell:P125:l:1:f:7:cf:2\ncell:Q125:l:1:f:7:cf:2\ncell:R125:l:1:f:7:cf:2\ncell:S125:l:1:f:7:cf:2\ncell:T125:l:1:f:7:cf:2\ncell:U125:l:1:f:7:cf:2\ncell:V125:l:1:f:7:cf:2\ncell:W125:l:1:f:7:cf:2\ncell:A126:l:1:f:7:cf:2\ncell:B126:l:1:f:7:cf:2\ncell:C126:l:1:f:7:cf:2\ncell:D126:l:1:f:7:cf:2\ncell:E126:l:1:f:7:cf:2\ncell:F126:t:Monthly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G126:l:1:f:7:cf:2\ncell:H126:l:1:f:7:cf:2\ncell:I126:l:1:f:7:cf:2\ncell:J126:l:1:f:7:cf:2\ncell:K126:l:1:f:7:cf:2\ncell:L126:l:1:f:7:cf:2\ncell:M126:l:1:f:7:cf:2\ncell:N126:l:1:f:7:cf:2\ncell:O126:l:1:f:7:cf:2\ncell:P126:l:1:f:7:cf:2\ncell:Q126:l:1:f:7:cf:2\ncell:R126:l:1:f:7:cf:2\ncell:S126:l:1:f:7:cf:2\ncell:T126:l:1:f:7:cf:2\ncell:U126:l:1:f:7:cf:2\ncell:V126:l:1:f:7:cf:2\ncell:W126:l:1:f:7:cf:2\ncell:A127:l:1:f:7:cf:2\ncell:B127:l:1:f:7:cf:2\ncell:C127:l:1:f:7:cf:2\ncell:D127:l:1:f:7:cf:2\ncell:E127:l:1:f:7:cf:2\ncell:F127:t:Semi-Annually:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G127:l:1:f:7:cf:2\ncell:H127:l:1:f:7:cf:2\ncell:I127:l:1:f:7:cf:2\ncell:J127:l:1:f:7:cf:2\ncell:K127:l:1:f:7:cf:2\ncell:L127:l:1:f:7:cf:2\ncell:M127:l:1:f:7:cf:2\ncell:N127:l:1:f:7:cf:2\ncell:O127:l:1:f:7:cf:2\ncell:P127:l:1:f:7:cf:2\ncell:Q127:l:1:f:7:cf:2\ncell:R127:l:1:f:7:cf:2\ncell:S127:l:1:f:7:cf:2\ncell:T127:l:1:f:7:cf:2\ncell:U127:l:1:f:7:cf:2\ncell:V127:l:1:f:7:cf:2\ncell:W127:l:1:f:7:cf:2\ncell:A128:l:1:f:7:cf:2\ncell:B128:l:1:f:7:cf:2\ncell:C128:l:1:f:7:cf:2\ncell:D128:l:1:f:7:cf:2\ncell:E128:l:1:f:7:cf:2\ncell:F128:t:Quarterly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G128:l:1:f:7:cf:2\ncell:H128:l:1:f:7:cf:2\ncell:I128:l:1:f:7:cf:2\ncell:J128:l:1:f:7:cf:2\ncell:K128:l:1:f:7:cf:2\ncell:L128:l:1:f:7:cf:2\ncell:M128:l:1:f:7:cf:2\ncell:N128:l:1:f:7:cf:2\ncell:O128:l:1:f:7:cf:2\ncell:P128:l:1:f:7:cf:2\ncell:Q128:l:1:f:7:cf:2\ncell:R128:l:1:f:7:cf:2\ncell:S128:l:1:f:7:cf:2\ncell:T128:l:1:f:7:cf:2\ncell:U128:l:1:f:7:cf:2\ncell:V128:l:1:f:7:cf:2\ncell:W128:l:1:f:7:cf:2\ncell:A129:l:1:f:7:cf:2\ncell:B129:l:1:f:7:cf:2\ncell:C129:l:1:f:7:cf:2\ncell:D129:l:1:f:7:cf:2\ncell:E129:l:1:f:7:cf:2\ncell:F129:t:Yearly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G129:l:1:f:7:cf:2\ncell:H129:l:1:f:7:cf:2\ncell:I129:l:1:f:7:cf:2\ncell:J129:l:1:f:7:cf:2\ncell:K129:l:1:f:7:cf:2\ncell:L129:l:1:f:7:cf:2\ncell:M129:l:1:f:7:cf:2\ncell:N129:l:1:f:7:cf:2\ncell:O129:l:1:f:7:cf:2\ncell:P129:l:1:f:7:cf:2\ncell:Q129:l:1:f:7:cf:2\ncell:R129:l:1:f:7:cf:2\ncell:S129:l:1:f:7:cf:2\ncell:T129:l:1:f:7:cf:2\ncell:U129:l:1:f:7:cf:2\ncell:V129:l:1:f:7:cf:2\ncell:W129:l:1:f:7:cf:2\ncell:A130:l:1:f:7:cf:2\ncell:B130:l:1:f:7:cf:2\ncell:C130:l:1:f:7:cf:2\ncell:D130:l:1:f:7:cf:2\ncell:E130:l:1:f:7:cf:2\ncell:F130:l:1:f:7:cf:2\ncell:G130:l:1:f:7:cf:2\ncell:H130:l:1:f:7:cf:2\ncell:I130:l:1:f:7:cf:2\ncell:J130:l:1:f:7:cf:2\ncell:K130:l:1:f:7:cf:2\ncell:L130:l:1:f:7:cf:2\ncell:M130:l:1:f:7:cf:2\ncell:N130:l:1:f:7:cf:2\ncell:O130:l:1:f:7:cf:2\ncell:P130:l:1:f:7:cf:2\ncell:Q130:l:1:f:7:cf:2\ncell:R130:l:1:f:7:cf:2\ncell:S130:l:1:f:7:cf:2\ncell:T130:l:1:f:7:cf:2\ncell:U130:l:1:f:7:cf:2\ncell:V130:l:1:f:7:cf:2\ncell:W130:l:1:f:7:cf:2\ncell:A131:l:1:f:7:cf:2\ncell:B131:l:1:f:7:cf:2\ncell:C131:l:1:f:7:cf:2\ncell:D131:l:1:f:7:cf:2\ncell:E131:l:1:f:7:cf:2\ncell:F131:l:1:f:7:cf:2\ncell:G131:l:1:f:7:cf:2\ncell:H131:l:1:f:7:cf:2\ncell:I131:l:1:f:7:cf:2\ncell:J131:l:1:f:7:cf:2\ncell:K131:l:1:f:7:cf:2\ncell:L131:l:1:f:7:cf:2\ncell:M131:l:1:f:7:cf:2\ncell:N131:l:1:f:7:cf:2\ncell:O131:l:1:f:7:cf:2\ncell:P131:l:1:f:7:cf:2\ncell:Q131:l:1:f:7:cf:2\ncell:R131:l:1:f:7:cf:2\ncell:S131:l:1:f:7:cf:2\ncell:T131:l:1:f:7:cf:2\ncell:U131:l:1:f:7:cf:2\ncell:V131:l:1:f:7:cf:2\ncell:W131:l:1:f:7:cf:2\ncell:A132:l:1:f:7:cf:2\ncell:B132:l:1:f:7:cf:2\ncell:C132:l:1:f:7:cf:2\ncell:D132:l:1:f:7:cf:2\ncell:E132:l:1:f:7:cf:2\ncell:F132:l:1:f:7:cf:2\ncell:G132:l:1:f:7:cf:2\ncell:H132:l:1:f:7:cf:2\ncell:I132:l:1:f:7:cf:2\ncell:J132:l:1:f:7:cf:2\ncell:K132:l:1:f:7:cf:2\ncell:L132:l:1:f:7:cf:2\ncell:M132:l:1:f:7:cf:2\ncell:N132:l:1:f:7:cf:2\ncell:O132:l:1:f:7:cf:2\ncell:P132:l:1:f:7:cf:2\ncell:Q132:l:1:f:7:cf:2\ncell:R132:l:1:f:7:cf:2\ncell:S132:l:1:f:7:cf:2\ncell:T132:l:1:f:7:cf:2\ncell:U132:l:1:f:7:cf:2\ncell:V132:l:1:f:7:cf:2\ncell:W132:l:1:f:7:cf:2\ncell:A133:l:1:f:7:cf:2\ncell:B133:l:1:f:7:cf:2\ncell:C133:l:1:f:7:cf:2\ncell:D133:l:1:f:7:cf:2\ncell:E133:l:1:f:7:cf:2\ncell:F133:l:1:f:7:cf:2\ncell:G133:l:1:f:7:cf:2\ncell:H133:l:1:f:7:cf:2\ncell:I133:l:1:f:7:cf:2\ncell:J133:l:1:f:7:cf:2\ncell:K133:l:1:f:7:cf:2\ncell:L133:l:1:f:7:cf:2\ncell:M133:l:1:f:7:cf:2\ncell:N133:l:1:f:7:cf:2\ncell:O133:l:1:f:7:cf:2\ncell:P133:l:1:f:7:cf:2\ncell:Q133:l:1:f:7:cf:2\ncell:R133:l:1:f:7:cf:2\ncell:S133:l:1:f:7:cf:2\ncell:T133:l:1:f:7:cf:2\ncell:U133:l:1:f:7:cf:2\ncell:V133:l:1:f:7:cf:2\ncell:W133:l:1:f:7:cf:2\ncell:A134:l:1:f:7:cf:2\ncell:B134:l:1:f:7:cf:2\ncell:C134:l:1:f:7:cf:2\ncell:D134:l:1:f:7:cf:2\ncell:E134:l:1:f:7:cf:2\ncell:F134:l:1:f:7:cf:2\ncell:G134:l:1:f:7:cf:2\ncell:H134:l:1:f:7:cf:2\ncell:I134:l:1:f:7:cf:2\ncell:J134:l:1:f:7:cf:2\ncell:K134:l:1:f:7:cf:2\ncell:L134:l:1:f:7:cf:2\ncell:M134:l:1:f:7:cf:2\ncell:N134:l:1:f:7:cf:2\ncell:O134:l:1:f:7:cf:2\ncell:P134:l:1:f:7:cf:2\ncell:Q134:l:1:f:7:cf:2\ncell:R134:l:1:f:7:cf:2\ncell:S134:l:1:f:7:cf:2\ncell:T134:l:1:f:7:cf:2\ncell:U134:l:1:f:7:cf:2\ncell:V134:l:1:f:7:cf:2\ncell:W134:l:1:f:7:cf:2\ncell:A135:l:1:f:7:cf:2\ncell:B135:l:1:f:7:cf:2\ncell:C135:l:1:f:7:cf:2\ncell:D135:l:1:f:7:cf:2\ncell:E135:l:1:f:7:cf:2\ncell:F135:l:1:f:7:cf:2\ncell:G135:l:1:f:7:cf:2\ncell:H135:l:1:f:7:cf:2\ncell:I135:l:1:f:7:cf:2\ncell:J135:l:1:f:7:cf:2\ncell:K135:l:1:f:7:cf:2\ncell:L135:l:1:f:7:cf:2\ncell:M135:l:1:f:7:cf:2\ncell:N135:l:1:f:7:cf:2\ncell:O135:l:1:f:7:cf:2\ncell:P135:l:1:f:7:cf:2\ncell:Q135:l:1:f:7:cf:2\ncell:R135:l:1:f:7:cf:2\ncell:S135:l:1:f:7:cf:2\ncell:T135:l:1:f:7:cf:2\ncell:U135:l:1:f:7:cf:2\ncell:V135:l:1:f:7:cf:2\ncell:W135:l:1:f:7:cf:2\ncell:A136:l:1:f:7:cf:2\ncell:B136:l:1:f:7:cf:2\ncell:C136:l:1:f:7:cf:2\ncell:D136:l:1:f:7:cf:2\ncell:E136:l:1:f:7:cf:2\ncell:F136:l:1:f:7:cf:2\ncell:G136:l:1:f:7:cf:2\ncell:H136:l:1:f:7:cf:2\ncell:I136:l:1:f:7:cf:2\ncell:J136:l:1:f:7:cf:2\ncell:K136:l:1:f:7:cf:2\ncell:L136:l:1:f:7:cf:2\ncell:M136:l:1:f:7:cf:2\ncell:N136:l:1:f:7:cf:2\ncell:O136:l:1:f:7:cf:2\ncell:P136:l:1:f:7:cf:2\ncell:Q136:l:1:f:7:cf:2\ncell:R136:l:1:f:7:cf:2\ncell:S136:l:1:f:7:cf:2\ncell:T136:l:1:f:7:cf:2\ncell:U136:l:1:f:7:cf:2\ncell:V136:l:1:f:7:cf:2\ncell:W136:l:1:f:7:cf:2\ncell:A137:l:1:f:7:cf:2\ncell:B137:l:1:f:7:cf:2\ncell:C137:l:1:f:7:cf:2\ncell:D137:l:1:f:7:cf:2\ncell:E137:l:1:f:7:cf:2\ncell:F137:l:1:f:7:cf:2\ncell:G137:l:1:f:7:cf:2\ncell:H137:l:1:f:7:cf:2\ncell:I137:l:1:f:7:cf:2\ncell:J137:l:1:f:7:cf:2\ncell:K137:l:1:f:7:cf:2\ncell:L137:l:1:f:7:cf:2\ncell:M137:l:1:f:7:cf:2\ncell:N137:l:1:f:7:cf:2\ncell:O137:l:1:f:7:cf:2\ncell:P137:l:1:f:7:cf:2\ncell:Q137:l:1:f:7:cf:2\ncell:R137:l:1:f:7:cf:2\ncell:S137:l:1:f:7:cf:2\ncell:T137:l:1:f:7:cf:2\ncell:U137:l:1:f:7:cf:2\ncell:V137:l:1:f:7:cf:2\ncell:W137:l:1:f:7:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nrow:102:h:14.25\nrow:103:h:14.25\nrow:104:h:14.25\nrow:105:h:14.25\nrow:106:h:14.25\nrow:107:h:14.25\nrow:108:h:14.25\nrow:109:h:14.25\nrow:110:h:14.25\nrow:111:h:14.25\nrow:112:h:14.25\nrow:113:h:14.25\nrow:114:h:14.25\nrow:115:h:14.25\nrow:116:h:14.25\nrow:117:h:14.25\nrow:118:h:14.25\nrow:119:h:14.25\nrow:120:h:14.25\nrow:121:h:14.25\nsheet:c:27:r:137:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\ncolor:5:rgb(255,255,187)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 20pt Arial\nfont:4:normal bold 9pt Arial\nfont:5:normal normal * Arial\nfont:6:normal normal 10pt Arial\nfont:7:normal normal 7pt Arial\nfont:8:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nname:COMPARISON::S63\\cU77\nname:TRACKING::AC63\\cAE77\n', - }, - name: "sheet9", - hidden: "0", - }, - sheet5: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:7:cf:2:ntvf:2\ncell:B1:l:1:f:7:cf:2\ncell:C1:l:1:f:7:cf:2\ncell:D1:l:1:f:7:cf:2\ncell:E1:l:1:f:7:cf:2\ncell:F1:l:1:f:7:cf:2\ncell:G1:l:1:f:7:cf:2\ncell:H1:l:1:f:7:cf:2\ncell:I1:l:1:f:7:cf:2\ncell:J1:l:1:f:7:cf:2\ncell:K1:l:1:f:7:cf:2\ncell:L1:l:1:f:7:cf:2\ncell:M1:l:1:f:7:cf:2\ncell:N1:l:1:f:7:cf:2\ncell:O1:l:1:f:7:cf:2\ncell:P1:l:1:f:7:cf:2\ncell:Q1:l:1:f:7:cf:2\ncell:R1:l:1:f:7:cf:2\ncell:S1:l:1:f:7:cf:2\ncell:T1:l:1:f:7:cf:2\ncell:U1:l:1:f:7:cf:2\ncell:V1:l:1:f:7:cf:2\ncell:W1:l:1:f:7:cf:2\ncell:A2:l:1:f:7:cf:2\ncell:B2:l:1:f:7:cf:2\ncell:C2:l:1:f:7:cf:2\ncell:D2:t:Expenses:l:2:f:3:cf:2\ncell:E2:l:1:f:7:cf:2\ncell:F2:l:1:f:7:cf:2\ncell:G2:l:1:f:7:cf:2\ncell:H2:l:1:f:7:cf:2\ncell:I2:l:1:f:7:cf:2\ncell:J2:l:1:f:7:cf:2\ncell:K2:l:1:f:7:cf:2\ncell:L2:l:1:f:7:cf:2\ncell:M2:l:1:f:7:cf:2\ncell:N2:l:1:f:7:cf:2\ncell:O2:l:1:f:7:cf:2\ncell:P2:l:1:f:7:cf:2\ncell:Q2:l:1:f:7:cf:2\ncell:R2:l:1:f:7:cf:2\ncell:S2:l:1:f:7:cf:2\ncell:T2:l:1:f:7:cf:2\ncell:U2:l:1:f:7:cf:2\ncell:V2:l:1:f:7:cf:2\ncell:W2:l:1:f:7:cf:2\ncell:A3:l:1:f:7:cf:2\ncell:B3:l:1:f:7:cf:2\ncell:C3:l:1:f:7:cf:2\ncell:D3:l:1:f:7:cf:2\ncell:G3:l:1:f:7:cf:2\ncell:H3:l:1:f:7:cf:2\ncell:I3:l:1:f:7:cf:2\ncell:J3:l:1:f:7:cf:2\ncell:K3:l:1:f:7:cf:2\ncell:L3:l:1:f:7:cf:2\ncell:M3:l:1:f:7:cf:2\ncell:N3:l:1:f:7:cf:2\ncell:O3:l:1:f:7:cf:2\ncell:P3:l:1:f:7:cf:2\ncell:Q3:t: :l:1:f:7:cf:2\ncell:R3:l:1:f:7:cf:2\ncell:S3:l:1:f:7:cf:2\ncell:T3:l:1:f:7:cf:2\ncell:U3:l:1:f:7:cf:2\ncell:V3:l:1:f:7:cf:2\ncell:W3:l:1:f:7:cf:2\ncell:B4:t:Entertainment:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C4:l:3:f:2:c:3:bg:1:cf:2\ncell:D4:l:3:f:2:c:3:bg:1:cf:1\ncell:E4:vtf:n:209:SUM(E5\\cE12):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F4:vtf:n:2508:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O4:l:1:f:7:cf:2\ncell:P4:l:1:f:7:cf:2\ncell:Q4:l:1:f:7:cf:2\ncell:R4:l:1:f:7:cf:2\ncell:S4:l:1:f:7:cf:2\ncell:T4:l:1:f:7:cf:2\ncell:U4:l:1:f:7:cf:2\ncell:V4:l:1:f:7:cf:2\ncell:W4:l:1:f:7:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:7:cf:2\ncell:C5:l:3:f:7:cf:2\ncell:D5:t:Events/Movies/Theater:l:3:f:5:cf:2\ncell:E5:v:209:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F5:vtf:n:2508:IF( (E5*12)=0,"",(E5*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:7:cf:2\ncell:P5:l:1:f:7:cf:2\ncell:Q5:l:1:f:7:cf:2\ncell:R5:l:1:f:7:cf:2\ncell:S5:l:1:f:7:cf:2\ncell:T5:l:1:f:7:cf:2\ncell:U5:l:1:f:7:cf:2\ncell:V5:l:1:f:7:cf:2\ncell:W5:l:1:f:7:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:7:bg:2:cf:2\ncell:C6:l:3:f:7:bg:2:cf:2\ncell:D6:t:Music/Video:l:3:f:5:bg:2:cf:2\ncell:E6:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F6:vtf:t::IF( (E6*12)=0,"",(E6*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:7:cf:2\ncell:P6:l:1:f:7:cf:2\ncell:Q6:l:1:f:7:cf:2\ncell:R6:l:1:f:7:cf:2\ncell:S6:l:1:f:7:cf:2\ncell:T6:l:1:f:7:cf:2\ncell:U6:l:1:f:7:cf:2\ncell:V6:l:1:f:7:cf:2\ncell:W6:l:1:f:7:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:7:cf:2\ncell:C7:l:3:f:7:cf:2\ncell:D7:t:Books:l:3:f:5:cf:2\ncell:E7:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:7:cf:2\ncell:P7:l:1:f:7:cf:2\ncell:Q7:l:1:f:7:cf:2\ncell:R7:l:1:f:7:cf:2\ncell:S7:l:1:f:7:cf:2\ncell:T7:l:1:f:7:cf:2\ncell:U7:l:1:f:7:cf:2\ncell:V7:l:1:f:7:cf:2\ncell:W7:l:1:f:7:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:bg:2:cf:2\ncell:C8:l:3:f:7:bg:2:cf:2\ncell:D8:t:Pets:l:3:f:5:bg:2:cf:2\ncell:E8:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:7:cf:2\ncell:P8:l:1:f:7:cf:2\ncell:Q8:l:1:f:7:cf:2\ncell:R8:l:1:f:7:cf:2\ncell:S8:l:1:f:7:cf:2\ncell:T8:l:1:f:7:cf:2\ncell:U8:l:1:f:7:cf:2\ncell:V8:l:1:f:7:cf:2\ncell:W8:l:1:f:7:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:7:cf:2\ncell:C9:l:3:f:7:cf:2\ncell:D9:t:Hobbies:l:3:f:5:cf:2\ncell:E9:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F9:vtf:t::IF( (E9*12)=0,"",(E9*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:7:cf:2\ncell:P9:l:1:f:7:cf:2\ncell:Q9:l:1:f:7:cf:2\ncell:R9:l:1:f:7:cf:2\ncell:S9:l:1:f:7:cf:2\ncell:T9:l:1:f:7:cf:2\ncell:U9:l:1:f:7:cf:2\ncell:V9:l:1:f:7:cf:2\ncell:W9:l:1:f:7:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:7:bg:2:cf:2\ncell:C10:l:3:f:7:bg:2:cf:2\ncell:D10:t:Sports:l:3:f:5:bg:2:cf:2\ncell:E10:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:7:cf:2\ncell:P10:l:1:f:7:cf:2\ncell:Q10:l:1:f:7:cf:2\ncell:R10:l:1:f:7:cf:2\ncell:S10:l:1:f:7:cf:2\ncell:T10:l:1:f:7:cf:2\ncell:U10:l:1:f:7:cf:2\ncell:V10:l:1:f:7:cf:2\ncell:W10:l:1:f:7:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:7:cf:2\ncell:C11:l:3:f:7:cf:2\ncell:D11:t:Gadgets/Toys:l:3:f:5:cf:2\ncell:E11:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:7:cf:2\ncell:P11:l:1:f:7:cf:2\ncell:Q11:l:1:f:7:cf:2\ncell:R11:l:1:f:7:cf:2\ncell:S11:l:1:f:7:cf:2\ncell:T11:l:1:f:7:cf:2\ncell:U11:l:1:f:7:cf:2\ncell:V11:l:1:f:7:cf:2\ncell:W11:l:1:f:7:cf:2\ncell:A12:b::1::\ncell:B12:b::::1:l:3:f:7:bg:2:cf:2\ncell:C12:l:3:f:7:bg:2:cf:2\ncell:D12:t:Other:l:3:f:5:bg:2:cf:2\ncell:E12:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F12:vtf:t::IF( (E12*12)=0,"",(E12*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G12:b::::1\ncell:O12:l:1:f:7:cf:2\ncell:P12:l:1:f:7:cf:2\ncell:Q12:l:1:f:7:cf:2\ncell:R12:l:1:f:7:cf:2\ncell:S12:l:1:f:7:cf:2\ncell:T12:l:1:f:7:cf:2\ncell:U12:l:1:f:7:cf:2\ncell:V12:l:1:f:7:cf:2\ncell:W12:l:1:f:7:cf:2\ncell:B13:t:Education:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C13:l:3:f:2:c:3:bg:1:cf:2\ncell:D13:l:3:f:2:c:3:bg:1:cf:1\ncell:E13:vtf:n:98:SUM(E14\\cE17):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F13:vtf:n:1176:IF( (E13*12)=0,"",(E13*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O13:l:1:f:7:cf:2\ncell:P13:l:1:f:7:cf:2\ncell:Q13:l:1:f:7:cf:2\ncell:R13:l:1:f:7:cf:2\ncell:S13:l:1:f:7:cf:2\ncell:T13:l:1:f:7:cf:2\ncell:U13:l:1:f:7:cf:2\ncell:V13:l:1:f:7:cf:2\ncell:W13:l:1:f:7:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:cf:2\ncell:C14:l:3:f:7:cf:2\ncell:D14:t:Tuition & Fees:l:3:f:5:cf:2\ncell:E14:v:98:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F14:vtf:n:1176:IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:7:cf:2\ncell:P14:l:1:f:7:cf:2\ncell:Q14:l:1:f:7:cf:2\ncell:R14:l:1:f:7:cf:2\ncell:S14:l:1:f:7:cf:2\ncell:T14:l:1:f:7:cf:2\ncell:U14:l:1:f:7:cf:2\ncell:V14:l:1:f:7:cf:2\ncell:W14:l:1:f:7:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:7:bg:2:cf:2\ncell:C15:l:3:f:7:bg:2:cf:2\ncell:D15:t:Preschool:l:3:f:5:bg:2:cf:2\ncell:E15:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F15:vtf:t::IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:7:cf:2\ncell:P15:l:1:f:7:cf:2\ncell:Q15:l:1:f:7:cf:2\ncell:R15:l:1:f:7:cf:2\ncell:S15:l:1:f:7:cf:2\ncell:T15:l:1:f:7:cf:2\ncell:U15:l:1:f:7:cf:2\ncell:V15:l:1:f:7:cf:2\ncell:W15:l:1:f:7:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:7:cf:2\ncell:C16:l:3:f:7:cf:2\ncell:D16:t:Books & Supplies:l:3:f:5:cf:2\ncell:E16:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:7:cf:2\ncell:P16:l:1:f:7:cf:2\ncell:Q16:l:1:f:7:cf:2\ncell:R16:l:1:f:7:cf:2\ncell:S16:l:1:f:7:cf:2\ncell:T16:l:1:f:7:cf:2\ncell:U16:l:1:f:7:cf:2\ncell:V16:l:1:f:7:cf:2\ncell:W16:l:1:f:7:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:7:bg:2:cf:2\ncell:C17:l:3:f:7:bg:2:cf:2\ncell:D17:t:Other:l:3:f:5:bg:2:cf:2\ncell:E17:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:7:cf:2\ncell:P17:l:1:f:7:cf:2\ncell:Q17:l:1:f:7:cf:2\ncell:R17:l:1:f:7:cf:2\ncell:B18:t:Contributions, Donations, Gifts:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C18:l:3:f:2:c:3:bg:1:cf:2\ncell:D18:l:3:f:2:c:3:bg:1:cf:1\ncell:E18:vtf:n:222:SUM(E19\\cE21):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F18:vtf:n:2664:IF( (E18*12)=0,"",(E18*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O18:l:1:f:7:cf:2\ncell:P18:l:1:f:7:cf:2\ncell:Q18:l:1:f:7:cf:2\ncell:R18:l:1:f:7:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:7:cf:2\ncell:C19:l:3:f:7:cf:2\ncell:D19:t:Cash contributions:l:3:f:5:cf:2\ncell:E19:v:136:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F19:vtf:n:1632:IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:7:cf:2\ncell:P19:l:1:f:7:cf:2\ncell:Q19:l:1:f:7:cf:2\ncell:R19:l:1:f:7:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:7:bg:2:cf:2\ncell:C20:l:3:f:7:bg:2:cf:2\ncell:D20:t:Gifts:l:3:f:5:bg:2:cf:2\ncell:E20:v:86:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F20:vtf:n:1032:IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:7:cf:2\ncell:P20:l:1:f:7:cf:2\ncell:Q20:l:1:f:7:cf:2\ncell:R20:l:1:f:7:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:cf:2\ncell:C21:l:3:f:7:cf:2\ncell:D21:t:Other:l:3:f:5:cf:2\ncell:E21:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:7:cf:2\ncell:P21:l:1:f:7:cf:2\ncell:Q21:l:1:f:7:cf:2\ncell:R21:l:1:f:7:cf:2\ncell:B22:t:Debt:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C22:l:3:f:2:c:3:bg:1:cf:2\ncell:D22:l:3:f:2:c:3:bg:1:cf:1\ncell:E22:vtf:n:0:SUM(E23\\cE24):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O22:l:1:f:7:cf:2\ncell:P22:l:1:f:7:cf:2\ncell:Q22:l:1:f:7:cf:2\ncell:R22:l:1:f:7:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:7:cf:2\ncell:C23:l:3:f:7:cf:2\ncell:D23:t:Student loan payment:l:3:f:5:cf:2\ncell:E23:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:7:cf:2\ncell:P23:l:1:f:7:cf:2\ncell:Q23:l:1:f:7:cf:2\ncell:R23:l:1:f:7:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:7:bg:2:cf:2\ncell:C24:l:3:f:7:bg:2:cf:2\ncell:D24:t:Other loan & debt payment:l:3:f:5:bg:2:cf:2\ncell:E24:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:7:cf:2\ncell:P24:l:1:f:7:cf:2\ncell:Q24:l:1:f:7:cf:2\ncell:R24:l:1:f:7:cf:2\ncell:B25:t:Insurance:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C25:l:3:f:2:c:3:bg:1:cf:2\ncell:D25:l:3:f:2:c:3:bg:1:cf:1\ncell:E25:vtf:n:30:SUM(E26\\cE28):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F25:vtf:n:360:IF( (E25*12)=0,"",(E25*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O25:l:1:f:7:cf:2\ncell:P25:l:1:f:7:cf:2\ncell:Q25:l:1:f:7:cf:2\ncell:R25:l:1:f:7:cf:2\ncell:A26:b::1::\ncell:B26:b::::1:l:3:f:7:cf:2\ncell:C26:l:3:f:7:cf:2\ncell:D26:t:Health Insurance:l:3:f:5:cf:2\ncell:E26:v:30:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F26:vtf:n:360:IF( (E26*12)=0,"",(E26*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G26:b::::1\ncell:O26:l:1:f:7:cf:2\ncell:P26:l:1:f:7:cf:2\ncell:Q26:l:1:f:7:cf:2\ncell:R26:l:1:f:7:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:7:bg:2:cf:2\ncell:C27:l:3:f:7:bg:2:cf:2\ncell:D27:t:Car/Tax Insurance:l:3:f:5:bg:2:cf:2\ncell:E27:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F27:vtf:t::IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:7:cf:2\ncell:P27:l:1:f:7:cf:2\ncell:Q27:l:1:f:7:cf:2\ncell:R27:l:1:f:7:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:7:cf:2\ncell:C28:l:3:f:7:cf:2\ncell:D28:t:Home Insurance:l:3:f:5:cf:2\ncell:E28:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:7:cf:2\ncell:P28:l:1:f:7:cf:2\ncell:Q28:l:1:f:7:cf:2\ncell:R28:l:1:f:7:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:bg:2\ncell:C29:bg:2\ncell:D29:t:Life Insurance:l:3:f:6:bg:2:cf:2\ncell:E29:b:1:1:1:1:bg:2\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:bg:2\ncell:G29:b::::1\ncell:O29:l:1:f:7:cf:2\ncell:P29:l:1:f:7:cf:2\ncell:Q29:l:1:f:7:cf:2\ncell:R29:l:1:f:7:cf:2\ncell:A30:b::1::\ncell:B30:b:::1:1\ncell:C30:b:::1:\ncell:D30:t:Others:b:::1::l:3:f:6:cf:2\ncell:E30:b:1:1:1:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1:1:1\ncell:G30:b::::1\ncell:O30:l:1:f:7:cf:2\ncell:P30:l:1:f:7:cf:2\ncell:Q30:l:1:f:7:cf:2\ncell:R30:l:1:f:7:cf:2\ncell:B31:b:1:::\ncell:C31:b:1:::\ncell:D31:b:1:::\ncell:E31:b:1:::\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b:1:::\ncell:O31:l:1:f:7:cf:2\ncell:P31:l:1:f:7:cf:2\ncell:Q31:l:1:f:7:cf:2\ncell:R31:l:1:f:7:cf:2\ncell:B32:l:1:f:4:cf:2\ncell:C32:l:1:f:4:cf:2\ncell:D32:l:1:f:9:cf:2\ncell:E32:l:1:f:9:cf:2\ncell:F32:l:1:f:7:cf:2\ncell:O32:l:1:f:7:cf:2\ncell:P32:l:1:f:7:cf:2\ncell:Q32:l:1:f:7:cf:2\ncell:R32:l:1:f:7:cf:2\ncell:O33:l:1:f:7:cf:2\ncell:P33:l:1:f:7:cf:2\ncell:Q33:l:1:f:7:cf:2\ncell:R33:l:1:f:7:cf:2\ncell:O34:l:1:f:7:cf:2\ncell:P34:l:1:f:7:cf:2\ncell:Q34:l:1:f:7:cf:2\ncell:R34:l:1:f:7:cf:2\ncell:O35:l:1:f:7:cf:2\ncell:P35:l:1:f:7:cf:2\ncell:Q35:l:1:f:7:cf:2\ncell:R35:l:1:f:7:cf:2\ncell:O36:l:1:f:7:cf:2\ncell:P36:l:1:f:7:cf:2\ncell:Q36:l:1:f:7:cf:2\ncell:R36:l:1:f:7:cf:2\ncell:O37:l:1:f:7:cf:2\ncell:P37:l:1:f:7:cf:2\ncell:Q37:l:1:f:7:cf:2\ncell:R37:l:1:f:7:cf:2\ncell:O38:l:1:f:7:cf:2\ncell:P38:l:1:f:7:cf:2\ncell:Q38:l:1:f:7:cf:2\ncell:R38:l:1:f:7:cf:2\ncell:O39:l:1:f:7:cf:2\ncell:P39:l:1:f:7:cf:2\ncell:Q39:l:1:f:7:cf:2\ncell:R39:l:1:f:7:cf:2\ncell:O40:l:1:f:7:cf:2\ncell:P40:l:1:f:7:cf:2\ncell:Q40:l:1:f:7:cf:2\ncell:R40:l:1:f:7:cf:2\ncell:O41:l:1:f:7:cf:2\ncell:P41:l:1:f:7:cf:2\ncell:Q41:l:1:f:7:cf:2\ncell:R41:l:1:f:7:cf:2\ncell:O42:l:1:f:7:cf:2\ncell:P42:l:1:f:7:cf:2\ncell:Q42:l:1:f:7:cf:2\ncell:R42:l:1:f:7:cf:2\ncell:S42:l:1:f:7:cf:2\ncell:T42:l:1:f:7:cf:2\ncell:U42:l:1:f:7:cf:2\ncell:V42:l:1:f:7:cf:2\ncell:W42:l:1:f:7:cf:2\ncell:O43:l:1:f:7:cf:2\ncell:P43:l:1:f:7:cf:2\ncell:Q43:l:1:f:7:cf:2\ncell:R43:l:1:f:7:cf:2\ncell:S43:l:1:f:7:cf:2\ncell:T43:l:1:f:7:cf:2\ncell:U43:l:1:f:7:cf:2\ncell:V43:l:1:f:7:cf:2\ncell:W43:l:1:f:7:cf:2\ncell:O44:l:1:f:7:cf:2\ncell:P44:l:1:f:7:cf:2\ncell:Q44:l:1:f:7:cf:2\ncell:R44:l:1:f:7:cf:2\ncell:S44:l:1:f:7:cf:2\ncell:T44:l:1:f:7:cf:2\ncell:U44:l:1:f:7:cf:2\ncell:V44:l:1:f:7:cf:2\ncell:W44:l:1:f:7:cf:2\ncell:O45:l:1:f:7:cf:2\ncell:P45:l:1:f:7:cf:2\ncell:Q45:l:1:f:7:cf:2\ncell:R45:l:1:f:7:cf:2\ncell:S45:l:1:f:7:cf:2\ncell:T45:l:1:f:7:cf:2\ncell:U45:l:1:f:7:cf:2\ncell:V45:l:1:f:7:cf:2\ncell:W45:l:1:f:7:cf:2\ncell:O46:l:1:f:7:cf:2\ncell:P46:l:1:f:7:cf:2\ncell:Q46:l:1:f:7:cf:2\ncell:R46:l:1:f:7:cf:2\ncell:S46:l:1:f:7:cf:2\ncell:T46:l:1:f:7:cf:2\ncell:U46:l:1:f:7:cf:2\ncell:V46:l:1:f:7:cf:2\ncell:W46:l:1:f:7:cf:2\ncell:O47:l:1:f:7:cf:2\ncell:P47:l:1:f:7:cf:2\ncell:Q47:l:1:f:7:cf:2\ncell:R47:l:1:f:7:cf:2\ncell:S47:l:1:f:7:cf:2\ncell:T47:l:1:f:7:cf:2\ncell:U47:l:1:f:7:cf:2\ncell:V47:l:1:f:7:cf:2\ncell:W47:l:1:f:7:cf:2\ncell:O48:l:1:f:7:cf:2\ncell:P48:l:1:f:7:cf:2\ncell:Q48:l:1:f:7:cf:2\ncell:R48:l:1:f:7:cf:2\ncell:S48:l:1:f:7:cf:2\ncell:T48:l:1:f:7:cf:2\ncell:U48:l:1:f:7:cf:2\ncell:V48:l:1:f:7:cf:2\ncell:W48:l:1:f:7:cf:2\ncell:O49:l:1:f:7:cf:2\ncell:P49:l:1:f:7:cf:2\ncell:Q49:l:1:f:7:cf:2\ncell:R49:l:1:f:7:cf:2\ncell:S49:l:1:f:7:cf:2\ncell:T49:l:1:f:7:cf:2\ncell:U49:l:1:f:7:cf:2\ncell:V49:l:1:f:7:cf:2\ncell:W49:l:1:f:7:cf:2\ncell:O50:l:1:f:7:cf:2\ncell:P50:l:1:f:7:cf:2\ncell:Q50:l:1:f:7:cf:2\ncell:R50:l:1:f:7:cf:2\ncell:S50:l:1:f:7:cf:2\ncell:T50:l:1:f:7:cf:2\ncell:U50:l:1:f:7:cf:2\ncell:V50:l:1:f:7:cf:2\ncell:W50:l:1:f:7:cf:2\ncell:O51:l:1:f:7:cf:2\ncell:P51:l:1:f:7:cf:2\ncell:Q51:l:1:f:7:cf:2\ncell:R51:l:1:f:7:cf:2\ncell:S51:l:1:f:7:cf:2\ncell:T51:l:1:f:7:cf:2\ncell:U51:l:1:f:7:cf:2\ncell:V51:l:1:f:7:cf:2\ncell:W51:l:1:f:7:cf:2\ncell:O52:l:1:f:7:cf:2\ncell:P52:l:1:f:7:cf:2\ncell:Q52:l:1:f:7:cf:2\ncell:R52:l:1:f:7:cf:2\ncell:S52:l:1:f:7:cf:2\ncell:T52:l:1:f:7:cf:2\ncell:U52:l:1:f:7:cf:2\ncell:V52:l:1:f:7:cf:2\ncell:W52:l:1:f:7:cf:2\ncell:O53:l:1:f:7:cf:2\ncell:P53:l:1:f:7:cf:2\ncell:Q53:l:1:f:7:cf:2\ncell:R53:l:1:f:7:cf:2\ncell:S53:l:1:f:7:cf:2\ncell:T53:l:1:f:7:cf:2\ncell:U53:l:1:f:7:cf:2\ncell:V53:l:1:f:7:cf:2\ncell:W53:l:1:f:7:cf:2\ncell:O54:l:1:f:7:cf:2\ncell:P54:l:1:f:7:cf:2\ncell:Q54:l:1:f:7:cf:2\ncell:R54:l:1:f:7:cf:2\ncell:S54:l:1:f:7:cf:2\ncell:T54:l:1:f:7:cf:2\ncell:U54:l:1:f:7:cf:2\ncell:V54:l:1:f:7:cf:2\ncell:W54:l:1:f:7:cf:2\ncell:O55:l:1:f:7:cf:2\ncell:P55:l:1:f:7:cf:2\ncell:Q55:l:1:f:7:cf:2\ncell:R55:l:1:f:7:cf:2\ncell:S55:l:1:f:7:cf:2\ncell:T55:l:1:f:7:cf:2\ncell:U55:l:1:f:7:cf:2\ncell:V55:l:1:f:7:cf:2\ncell:W55:l:1:f:7:cf:2\ncell:O56:l:1:f:7:cf:2\ncell:P56:l:1:f:7:cf:2\ncell:Q56:l:1:f:7:cf:2\ncell:R56:l:1:f:7:cf:2\ncell:S56:l:1:f:7:cf:2\ncell:T56:l:1:f:7:cf:2\ncell:U56:l:1:f:7:cf:2\ncell:V56:l:1:f:7:cf:2\ncell:W56:l:1:f:7:cf:2\ncell:O57:l:1:f:7:cf:2\ncell:P57:l:1:f:7:cf:2\ncell:Q57:l:1:f:7:cf:2\ncell:R57:l:1:f:7:cf:2\ncell:S57:l:1:f:7:cf:2\ncell:T57:l:1:f:7:cf:2\ncell:U57:l:1:f:7:cf:2\ncell:V57:l:1:f:7:cf:2\ncell:W57:l:1:f:7:cf:2\ncell:O58:l:1:f:7:cf:2\ncell:P58:l:1:f:7:cf:2\ncell:Q58:l:1:f:7:cf:2\ncell:R58:l:1:f:7:cf:2\ncell:S58:l:1:f:7:cf:2\ncell:T58:l:1:f:7:cf:2\ncell:U58:l:1:f:7:cf:2\ncell:V58:l:1:f:7:cf:2\ncell:W58:l:1:f:7:cf:2\ncell:O59:l:1:f:7:cf:2\ncell:P59:l:1:f:7:cf:2\ncell:Q59:l:1:f:7:cf:2\ncell:R59:l:1:f:7:cf:2\ncell:S59:l:1:f:7:cf:2\ncell:T59:l:1:f:7:cf:2\ncell:U59:l:1:f:7:cf:2\ncell:V59:l:1:f:7:cf:2\ncell:W59:l:1:f:7:cf:2\ncell:O60:l:1:f:7:cf:2\ncell:P60:l:1:f:7:cf:2\ncell:Q60:l:1:f:7:cf:2\ncell:R60:l:1:f:7:cf:2\ncell:S60:l:1:f:7:cf:2\ncell:T60:l:1:f:7:cf:2\ncell:U60:l:1:f:7:cf:2\ncell:V60:l:1:f:7:cf:2\ncell:W60:l:1:f:7:cf:2\ncell:O61:l:1:f:7:cf:2\ncell:P61:l:1:f:7:cf:2\ncell:Q61:l:1:f:7:cf:2\ncell:R61:l:1:f:7:cf:2\ncell:S61:l:1:f:7:cf:2\ncell:T61:l:1:f:7:cf:2\ncell:U61:l:1:f:7:cf:2\ncell:V61:l:1:f:7:cf:2\ncell:W61:l:1:f:7:cf:2\ncell:O62:l:1:f:7:cf:2\ncell:P62:l:1:f:7:cf:2\ncell:Q62:l:1:f:7:cf:2\ncell:R62:l:1:f:7:cf:2\ncell:S62:l:1:f:7:cf:2\ncell:T62:l:1:f:7:cf:2\ncell:U62:l:1:f:7:cf:2\ncell:V62:l:1:f:7:cf:2\ncell:W62:l:1:f:7:cf:2\ncell:O63:l:1:f:7:cf:2\ncell:P63:l:1:f:7:cf:2\ncell:Q63:l:1:f:7:cf:2\ncell:R63:l:1:f:7:cf:2\ncell:S63:l:1:f:7:cf:2\ncell:T63:l:1:f:7:cf:2\ncell:U63:l:1:f:7:cf:2\ncell:V63:l:1:f:7:cf:2\ncell:W63:l:1:f:7:cf:2\ncell:O64:l:1:f:7:cf:2\ncell:P64:l:1:f:7:cf:2\ncell:Q64:l:1:f:7:cf:2\ncell:R64:l:1:f:7:cf:2\ncell:S64:l:1:f:7:cf:2\ncell:T64:l:1:f:7:cf:2\ncell:U64:l:1:f:7:cf:2\ncell:V64:l:1:f:7:cf:2\ncell:W64:l:1:f:7:cf:2\ncell:O65:l:1:f:7:cf:2\ncell:P65:l:1:f:7:cf:2\ncell:Q65:l:1:f:7:cf:2\ncell:R65:l:1:f:7:cf:2\ncell:S65:l:1:f:7:cf:2\ncell:T65:l:1:f:7:cf:2\ncell:U65:l:1:f:7:cf:2\ncell:V65:l:1:f:7:cf:2\ncell:W65:l:1:f:7:cf:2\ncell:O66:l:1:f:7:cf:2\ncell:P66:l:1:f:7:cf:2\ncell:Q66:l:1:f:7:cf:2\ncell:R66:l:1:f:7:cf:2\ncell:S66:l:1:f:7:cf:2\ncell:T66:l:1:f:7:cf:2\ncell:U66:l:1:f:7:cf:2\ncell:V66:l:1:f:7:cf:2\ncell:W66:l:1:f:7:cf:2\ncell:O67:l:1:f:7:cf:2\ncell:P67:l:1:f:7:cf:2\ncell:Q67:l:1:f:7:cf:2\ncell:R67:l:1:f:7:cf:2\ncell:S67:l:1:f:7:cf:2\ncell:T67:l:1:f:7:cf:2\ncell:U67:l:1:f:7:cf:2\ncell:V67:l:1:f:7:cf:2\ncell:W67:l:1:f:7:cf:2\ncell:O68:l:1:f:7:cf:2\ncell:P68:l:1:f:7:cf:2\ncell:Q68:l:1:f:7:cf:2\ncell:R68:l:1:f:7:cf:2\ncell:S68:l:1:f:7:cf:2\ncell:T68:l:1:f:7:cf:2\ncell:U68:l:1:f:7:cf:2\ncell:V68:l:1:f:7:cf:2\ncell:W68:l:1:f:7:cf:2\ncell:O69:l:1:f:7:cf:2\ncell:P69:l:1:f:7:cf:2\ncell:Q69:l:1:f:7:cf:2\ncell:R69:l:1:f:7:cf:2\ncell:S69:l:1:f:7:cf:2\ncell:T69:l:1:f:7:cf:2\ncell:U69:l:1:f:7:cf:2\ncell:V69:l:1:f:7:cf:2\ncell:W69:l:1:f:7:cf:2\ncell:O70:l:1:f:7:cf:2\ncell:P70:l:1:f:7:cf:2\ncell:Q70:l:1:f:7:cf:2\ncell:R70:l:1:f:7:cf:2\ncell:S70:l:1:f:7:cf:2\ncell:T70:l:1:f:7:cf:2\ncell:U70:l:1:f:7:cf:2\ncell:V70:l:1:f:7:cf:2\ncell:W70:l:1:f:7:cf:2\ncell:O71:l:1:f:7:cf:2\ncell:P71:l:1:f:7:cf:2\ncell:Q71:l:1:f:7:cf:2\ncell:R71:l:1:f:7:cf:2\ncell:S71:l:1:f:7:cf:2\ncell:T71:l:1:f:7:cf:2\ncell:U71:l:1:f:7:cf:2\ncell:V71:l:1:f:7:cf:2\ncell:W71:l:1:f:7:cf:2\ncell:O72:l:1:f:7:cf:2\ncell:P72:l:1:f:7:cf:2\ncell:Q72:l:1:f:7:cf:2\ncell:R72:l:1:f:7:cf:2\ncell:S72:l:1:f:7:cf:2\ncell:T72:l:1:f:7:cf:2\ncell:U72:l:1:f:7:cf:2\ncell:V72:l:1:f:7:cf:2\ncell:W72:l:1:f:7:cf:2\ncell:O73:l:1:f:7:cf:2\ncell:P73:l:1:f:7:cf:2\ncell:Q73:l:1:f:7:cf:2\ncell:R73:l:1:f:7:cf:2\ncell:S73:l:1:f:7:cf:2\ncell:T73:l:1:f:7:cf:2\ncell:U73:l:1:f:7:cf:2\ncell:V73:l:1:f:7:cf:2\ncell:W73:l:1:f:7:cf:2\ncell:O74:l:1:f:7:cf:2\ncell:P74:l:1:f:7:cf:2\ncell:Q74:l:1:f:7:cf:2\ncell:R74:l:1:f:7:cf:2\ncell:S74:l:1:f:7:cf:2\ncell:T74:l:1:f:7:cf:2\ncell:U74:l:1:f:7:cf:2\ncell:V74:l:1:f:7:cf:2\ncell:W74:l:1:f:7:cf:2\ncell:O75:l:1:f:7:cf:2\ncell:P75:l:1:f:7:cf:2\ncell:Q75:l:1:f:7:cf:2\ncell:R75:l:1:f:7:cf:2\ncell:S75:l:1:f:7:cf:2\ncell:T75:l:1:f:7:cf:2\ncell:U75:l:1:f:7:cf:2\ncell:V75:l:1:f:7:cf:2\ncell:W75:l:1:f:7:cf:2\ncell:O76:l:1:f:7:cf:2\ncell:P76:l:1:f:7:cf:2\ncell:Q76:l:1:f:7:cf:2\ncell:R76:l:1:f:7:cf:2\ncell:S76:l:1:f:7:cf:2\ncell:T76:l:1:f:7:cf:2\ncell:U76:l:1:f:7:cf:2\ncell:V76:l:1:f:7:cf:2\ncell:W76:l:1:f:7:cf:2\ncell:O77:l:1:f:7:cf:2\ncell:P77:l:1:f:7:cf:2\ncell:Q77:l:1:f:7:cf:2\ncell:R77:l:1:f:7:cf:2\ncell:S77:l:1:f:7:cf:2\ncell:T77:l:1:f:7:cf:2\ncell:U77:l:1:f:7:cf:2\ncell:V77:l:1:f:7:cf:2\ncell:W77:l:1:f:7:cf:2\ncell:O78:l:1:f:7:cf:2\ncell:P78:l:1:f:7:cf:2\ncell:Q78:l:1:f:7:cf:2\ncell:R78:l:1:f:7:cf:2\ncell:S78:l:1:f:7:cf:2\ncell:T78:l:1:f:7:cf:2\ncell:U78:l:1:f:7:cf:2\ncell:V78:l:1:f:7:cf:2\ncell:W78:l:1:f:7:cf:2\ncell:O79:l:1:f:7:cf:2\ncell:P79:l:1:f:7:cf:2\ncell:Q79:l:1:f:7:cf:2\ncell:R79:l:1:f:7:cf:2\ncell:S79:l:1:f:7:cf:2\ncell:T79:l:1:f:7:cf:2\ncell:U79:l:1:f:7:cf:2\ncell:V79:l:1:f:7:cf:2\ncell:W79:l:1:f:7:cf:2\ncell:O80:l:1:f:7:cf:2\ncell:P80:l:1:f:7:cf:2\ncell:Q80:l:1:f:7:cf:2\ncell:R80:l:1:f:7:cf:2\ncell:S80:l:1:f:7:cf:2\ncell:T80:l:1:f:7:cf:2\ncell:U80:l:1:f:7:cf:2\ncell:V80:l:1:f:7:cf:2\ncell:W80:l:1:f:7:cf:2\ncell:O81:l:1:f:7:cf:2\ncell:P81:l:1:f:7:cf:2\ncell:Q81:l:1:f:7:cf:2\ncell:R81:l:1:f:7:cf:2\ncell:S81:l:1:f:7:cf:2\ncell:T81:l:1:f:7:cf:2\ncell:U81:l:1:f:7:cf:2\ncell:V81:l:1:f:7:cf:2\ncell:W81:l:1:f:7:cf:2\ncell:O82:l:1:f:7:cf:2\ncell:P82:l:1:f:7:cf:2\ncell:Q82:l:1:f:7:cf:2\ncell:R82:l:1:f:7:cf:2\ncell:S82:l:1:f:7:cf:2\ncell:T82:l:1:f:7:cf:2\ncell:U82:l:1:f:7:cf:2\ncell:V82:l:1:f:7:cf:2\ncell:W82:l:1:f:7:cf:2\ncell:O83:l:1:f:7:cf:2\ncell:P83:l:1:f:7:cf:2\ncell:Q83:l:1:f:7:cf:2\ncell:R83:l:1:f:7:cf:2\ncell:S83:l:1:f:7:cf:2\ncell:T83:l:1:f:7:cf:2\ncell:U83:l:1:f:7:cf:2\ncell:V83:l:1:f:7:cf:2\ncell:W83:l:1:f:7:cf:2\ncell:O84:l:1:f:7:cf:2\ncell:P84:l:1:f:7:cf:2\ncell:Q84:l:1:f:7:cf:2\ncell:R84:l:1:f:7:cf:2\ncell:S84:l:1:f:7:cf:2\ncell:T84:l:1:f:7:cf:2\ncell:U84:l:1:f:7:cf:2\ncell:V84:l:1:f:7:cf:2\ncell:W84:l:1:f:7:cf:2\ncell:O85:l:1:f:7:cf:2\ncell:P85:l:1:f:7:cf:2\ncell:Q85:l:1:f:7:cf:2\ncell:R85:l:1:f:7:cf:2\ncell:S85:l:1:f:7:cf:2\ncell:T85:l:1:f:7:cf:2\ncell:U85:l:1:f:7:cf:2\ncell:V85:l:1:f:7:cf:2\ncell:W85:l:1:f:7:cf:2\ncell:O86:l:1:f:7:cf:2\ncell:P86:l:1:f:7:cf:2\ncell:Q86:l:1:f:7:cf:2\ncell:R86:l:1:f:7:cf:2\ncell:S86:l:1:f:7:cf:2\ncell:T86:l:1:f:7:cf:2\ncell:U86:l:1:f:7:cf:2\ncell:V86:l:1:f:7:cf:2\ncell:W86:l:1:f:7:cf:2\ncell:O87:l:1:f:7:cf:2\ncell:P87:l:1:f:7:cf:2\ncell:Q87:l:1:f:7:cf:2\ncell:R87:l:1:f:7:cf:2\ncell:S87:l:1:f:7:cf:2\ncell:T87:l:1:f:7:cf:2\ncell:U87:l:1:f:7:cf:2\ncell:V87:l:1:f:7:cf:2\ncell:W87:l:1:f:7:cf:2\ncell:O88:l:1:f:7:cf:2\ncell:P88:l:1:f:7:cf:2\ncell:Q88:l:1:f:7:cf:2\ncell:R88:l:1:f:7:cf:2\ncell:S88:l:1:f:7:cf:2\ncell:T88:l:1:f:7:cf:2\ncell:U88:l:1:f:7:cf:2\ncell:V88:l:1:f:7:cf:2\ncell:W88:l:1:f:7:cf:2\ncell:O89:l:1:f:7:cf:2\ncell:P89:l:1:f:7:cf:2\ncell:Q89:l:1:f:7:cf:2\ncell:R89:l:1:f:7:cf:2\ncell:S89:l:1:f:7:cf:2\ncell:T89:l:1:f:7:cf:2\ncell:U89:l:1:f:7:cf:2\ncell:V89:l:1:f:7:cf:2\ncell:W89:l:1:f:7:cf:2\ncell:O90:l:1:f:7:cf:2\ncell:P90:l:1:f:7:cf:2\ncell:Q90:l:1:f:7:cf:2\ncell:R90:l:1:f:7:cf:2\ncell:S90:l:1:f:7:cf:2\ncell:T90:l:1:f:7:cf:2\ncell:U90:l:1:f:7:cf:2\ncell:V90:l:1:f:7:cf:2\ncell:W90:l:1:f:7:cf:2\ncell:O91:l:1:f:7:cf:2\ncell:P91:l:1:f:7:cf:2\ncell:Q91:l:1:f:7:cf:2\ncell:R91:l:1:f:7:cf:2\ncell:S91:l:1:f:7:cf:2\ncell:T91:l:1:f:7:cf:2\ncell:U91:l:1:f:7:cf:2\ncell:V91:l:1:f:7:cf:2\ncell:W91:l:1:f:7:cf:2\ncell:O92:l:1:f:7:cf:2\ncell:P92:l:1:f:7:cf:2\ncell:Q92:l:1:f:7:cf:2\ncell:R92:l:1:f:7:cf:2\ncell:S92:l:1:f:7:cf:2\ncell:T92:l:1:f:7:cf:2\ncell:U92:l:1:f:7:cf:2\ncell:V92:l:1:f:7:cf:2\ncell:W92:l:1:f:7:cf:2\ncell:O93:l:1:f:7:cf:2\ncell:P93:l:1:f:7:cf:2\ncell:Q93:l:1:f:7:cf:2\ncell:R93:l:1:f:7:cf:2\ncell:S93:l:1:f:7:cf:2\ncell:T93:l:1:f:7:cf:2\ncell:U93:l:1:f:7:cf:2\ncell:V93:l:1:f:7:cf:2\ncell:W93:l:1:f:7:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:S94:l:1:f:8:cf:2\ncell:T94:l:1:f:8:cf:2\ncell:U94:l:1:f:8:cf:2\ncell:V94:l:1:f:8:cf:2\ncell:W94:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:S95:l:1:f:8:cf:2\ncell:T95:l:1:f:8:cf:2\ncell:U95:l:1:f:8:cf:2\ncell:V95:l:1:f:8:cf:2\ncell:W95:l:1:f:8:cf:2\ncell:O96:l:1:f:8:cf:2\ncell:P96:l:1:f:8:cf:2\ncell:Q96:l:1:f:8:cf:2\ncell:R96:l:1:f:8:cf:2\ncell:S96:l:1:f:8:cf:2\ncell:T96:l:1:f:8:cf:2\ncell:U96:l:1:f:8:cf:2\ncell:V96:l:1:f:8:cf:2\ncell:W96:l:1:f:8:cf:2\ncell:O97:l:1:f:8:cf:2\ncell:P97:l:1:f:8:cf:2\ncell:Q97:l:1:f:8:cf:2\ncell:R97:l:1:f:8:cf:2\ncell:S97:l:1:f:8:cf:2\ncell:T97:l:1:f:8:cf:2\ncell:U97:l:1:f:8:cf:2\ncell:V97:l:1:f:8:cf:2\ncell:W97:l:1:f:8:cf:2\ncell:A98:l:1:f:8:cf:2\ncell:B98:l:1:f:8:cf:2\ncell:C98:l:1:f:8:cf:2\ncell:D98:l:1:f:8:cf:2\ncell:E98:l:1:f:8:cf:2\ncell:F98:t:Monthly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G98:l:1:f:8:cf:2\ncell:H98:l:1:f:8:cf:2\ncell:I98:l:1:f:8:cf:2\ncell:J98:l:1:f:8:cf:2\ncell:K98:l:1:f:8:cf:2\ncell:L98:l:1:f:8:cf:2\ncell:M98:l:1:f:8:cf:2\ncell:N98:l:1:f:8:cf:2\ncell:O98:l:1:f:8:cf:2\ncell:P98:l:1:f:8:cf:2\ncell:Q98:l:1:f:8:cf:2\ncell:R98:l:1:f:8:cf:2\ncell:S98:l:1:f:8:cf:2\ncell:T98:l:1:f:8:cf:2\ncell:U98:l:1:f:8:cf:2\ncell:V98:l:1:f:8:cf:2\ncell:W98:l:1:f:8:cf:2\ncell:A99:l:1:f:8:cf:2\ncell:B99:l:1:f:8:cf:2\ncell:C99:l:1:f:8:cf:2\ncell:D99:l:1:f:8:cf:2\ncell:E99:l:1:f:8:cf:2\ncell:F99:t:Semi-Annually:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G99:l:1:f:8:cf:2\ncell:H99:l:1:f:8:cf:2\ncell:I99:l:1:f:8:cf:2\ncell:J99:l:1:f:8:cf:2\ncell:K99:l:1:f:8:cf:2\ncell:L99:l:1:f:8:cf:2\ncell:M99:l:1:f:8:cf:2\ncell:N99:l:1:f:8:cf:2\ncell:O99:l:1:f:8:cf:2\ncell:P99:l:1:f:8:cf:2\ncell:Q99:l:1:f:8:cf:2\ncell:R99:l:1:f:8:cf:2\ncell:S99:l:1:f:8:cf:2\ncell:T99:l:1:f:8:cf:2\ncell:U99:l:1:f:8:cf:2\ncell:V99:l:1:f:8:cf:2\ncell:W99:l:1:f:8:cf:2\ncell:A100:l:1:f:8:cf:2\ncell:B100:l:1:f:8:cf:2\ncell:C100:l:1:f:8:cf:2\ncell:D100:l:1:f:8:cf:2\ncell:E100:l:1:f:8:cf:2\ncell:F100:t:Quarterly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G100:l:1:f:8:cf:2\ncell:H100:l:1:f:8:cf:2\ncell:I100:l:1:f:8:cf:2\ncell:J100:l:1:f:8:cf:2\ncell:K100:l:1:f:8:cf:2\ncell:L100:l:1:f:8:cf:2\ncell:M100:l:1:f:8:cf:2\ncell:N100:l:1:f:8:cf:2\ncell:O100:l:1:f:8:cf:2\ncell:P100:l:1:f:8:cf:2\ncell:Q100:l:1:f:8:cf:2\ncell:R100:l:1:f:8:cf:2\ncell:S100:l:1:f:8:cf:2\ncell:T100:l:1:f:8:cf:2\ncell:U100:l:1:f:8:cf:2\ncell:V100:l:1:f:8:cf:2\ncell:W100:l:1:f:8:cf:2\ncell:A101:l:1:f:8:cf:2\ncell:B101:l:1:f:8:cf:2\ncell:C101:l:1:f:8:cf:2\ncell:D101:l:1:f:8:cf:2\ncell:E101:l:1:f:8:cf:2\ncell:F101:t:Yearly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G101:l:1:f:8:cf:2\ncell:H101:l:1:f:8:cf:2\ncell:I101:l:1:f:8:cf:2\ncell:J101:l:1:f:8:cf:2\ncell:K101:l:1:f:8:cf:2\ncell:L101:l:1:f:8:cf:2\ncell:M101:l:1:f:8:cf:2\ncell:N101:l:1:f:8:cf:2\ncell:O101:l:1:f:8:cf:2\ncell:P101:l:1:f:8:cf:2\ncell:Q101:l:1:f:8:cf:2\ncell:R101:l:1:f:8:cf:2\ncell:S101:l:1:f:8:cf:2\ncell:T101:l:1:f:8:cf:2\ncell:U101:l:1:f:8:cf:2\ncell:V101:l:1:f:8:cf:2\ncell:W101:l:1:f:8:cf:2\ncell:A102:l:1:f:8:cf:2\ncell:B102:l:1:f:8:cf:2\ncell:C102:l:1:f:8:cf:2\ncell:D102:l:1:f:8:cf:2\ncell:E102:l:1:f:8:cf:2\ncell:F102:l:1:f:8:cf:2\ncell:G102:l:1:f:8:cf:2\ncell:H102:l:1:f:8:cf:2\ncell:I102:l:1:f:8:cf:2\ncell:J102:l:1:f:8:cf:2\ncell:K102:l:1:f:8:cf:2\ncell:L102:l:1:f:8:cf:2\ncell:M102:l:1:f:8:cf:2\ncell:N102:l:1:f:8:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:A103:l:1:f:8:cf:2\ncell:B103:l:1:f:8:cf:2\ncell:C103:l:1:f:8:cf:2\ncell:D103:l:1:f:8:cf:2\ncell:E103:l:1:f:8:cf:2\ncell:F103:l:1:f:8:cf:2\ncell:G103:l:1:f:8:cf:2\ncell:H103:l:1:f:8:cf:2\ncell:I103:l:1:f:8:cf:2\ncell:J103:l:1:f:8:cf:2\ncell:K103:l:1:f:8:cf:2\ncell:L103:l:1:f:8:cf:2\ncell:M103:l:1:f:8:cf:2\ncell:N103:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:A104:l:1:f:8:cf:2\ncell:B104:l:1:f:8:cf:2\ncell:C104:l:1:f:8:cf:2\ncell:D104:l:1:f:8:cf:2\ncell:E104:l:1:f:8:cf:2\ncell:F104:l:1:f:8:cf:2\ncell:G104:l:1:f:8:cf:2\ncell:H104:l:1:f:8:cf:2\ncell:I104:l:1:f:8:cf:2\ncell:J104:l:1:f:8:cf:2\ncell:K104:l:1:f:8:cf:2\ncell:L104:l:1:f:8:cf:2\ncell:M104:l:1:f:8:cf:2\ncell:N104:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:A105:l:1:f:8:cf:2\ncell:B105:l:1:f:8:cf:2\ncell:C105:l:1:f:8:cf:2\ncell:D105:l:1:f:8:cf:2\ncell:E105:l:1:f:8:cf:2\ncell:F105:l:1:f:8:cf:2\ncell:G105:l:1:f:8:cf:2\ncell:H105:l:1:f:8:cf:2\ncell:I105:l:1:f:8:cf:2\ncell:J105:l:1:f:8:cf:2\ncell:K105:l:1:f:8:cf:2\ncell:L105:l:1:f:8:cf:2\ncell:M105:l:1:f:8:cf:2\ncell:N105:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:A106:l:1:f:8:cf:2\ncell:B106:l:1:f:8:cf:2\ncell:C106:l:1:f:8:cf:2\ncell:D106:l:1:f:8:cf:2\ncell:E106:l:1:f:8:cf:2\ncell:F106:l:1:f:8:cf:2\ncell:G106:l:1:f:8:cf:2\ncell:H106:l:1:f:8:cf:2\ncell:I106:l:1:f:8:cf:2\ncell:J106:l:1:f:8:cf:2\ncell:K106:l:1:f:8:cf:2\ncell:L106:l:1:f:8:cf:2\ncell:M106:l:1:f:8:cf:2\ncell:N106:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:A107:l:1:f:8:cf:2\ncell:B107:l:1:f:8:cf:2\ncell:C107:l:1:f:8:cf:2\ncell:D107:l:1:f:8:cf:2\ncell:E107:l:1:f:8:cf:2\ncell:F107:l:1:f:8:cf:2\ncell:G107:l:1:f:8:cf:2\ncell:H107:l:1:f:8:cf:2\ncell:I107:l:1:f:8:cf:2\ncell:J107:l:1:f:8:cf:2\ncell:K107:l:1:f:8:cf:2\ncell:L107:l:1:f:8:cf:2\ncell:M107:l:1:f:8:cf:2\ncell:N107:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:A108:l:1:f:8:cf:2\ncell:B108:l:1:f:8:cf:2\ncell:C108:l:1:f:8:cf:2\ncell:D108:l:1:f:8:cf:2\ncell:E108:l:1:f:8:cf:2\ncell:F108:l:1:f:8:cf:2\ncell:G108:l:1:f:8:cf:2\ncell:H108:l:1:f:8:cf:2\ncell:I108:l:1:f:8:cf:2\ncell:J108:l:1:f:8:cf:2\ncell:K108:l:1:f:8:cf:2\ncell:L108:l:1:f:8:cf:2\ncell:M108:l:1:f:8:cf:2\ncell:N108:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:A109:l:1:f:8:cf:2\ncell:B109:l:1:f:8:cf:2\ncell:C109:l:1:f:8:cf:2\ncell:D109:l:1:f:8:cf:2\ncell:E109:l:1:f:8:cf:2\ncell:F109:l:1:f:8:cf:2\ncell:G109:l:1:f:8:cf:2\ncell:H109:l:1:f:8:cf:2\ncell:I109:l:1:f:8:cf:2\ncell:J109:l:1:f:8:cf:2\ncell:K109:l:1:f:8:cf:2\ncell:L109:l:1:f:8:cf:2\ncell:M109:l:1:f:8:cf:2\ncell:N109:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nsheet:c:27:r:109:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 20pt Arial\nfont:4:normal bold 9pt Arial\nfont:5:normal normal * Arial\nfont:6:normal normal * arial,helvetica,sans-serif\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 7pt Arial\nfont:9:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nname:COMPARISON::S35\\cU49\nname:TRACKING::AC35\\cAE49\n', - }, - name: "sheet10", - hidden: "0", - }, - sheet6: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:7:cf:2:ntvf:3\ncell:B1:l:1:f:7:cf:2\ncell:C1:l:1:f:7:cf:2\ncell:D1:l:1:f:7:cf:2\ncell:E1:l:1:f:7:cf:2\ncell:F1:l:1:f:7:cf:2\ncell:G1:l:1:f:7:cf:2\ncell:H1:l:1:f:7:cf:2\ncell:I1:l:1:f:7:cf:2\ncell:J1:l:1:f:7:cf:2\ncell:K1:l:1:f:7:cf:2\ncell:L1:l:1:f:7:cf:2\ncell:M1:l:1:f:7:cf:2\ncell:N1:l:1:f:7:cf:2\ncell:O1:l:1:f:7:cf:2\ncell:P1:l:1:f:7:cf:2\ncell:Q1:l:1:f:7:cf:2\ncell:R1:l:1:f:7:cf:2\ncell:S1:l:1:f:7:cf:2\ncell:T1:l:1:f:7:cf:2\ncell:U1:l:1:f:7:cf:2\ncell:V1:l:1:f:7:cf:2\ncell:W1:l:1:f:7:cf:2\ncell:A2:l:1:f:7:cf:2\ncell:B2:l:1:f:7:cf:2\ncell:C2:l:1:f:7:cf:2\ncell:D2:t:Expenses:l:2:f:4:cf:2\ncell:E2:l:1:f:7:cf:2\ncell:F2:l:1:f:7:cf:2\ncell:G2:l:1:f:7:cf:2\ncell:H2:l:1:f:7:cf:2\ncell:I2:l:1:f:7:cf:2\ncell:J2:l:1:f:7:cf:2\ncell:K2:l:1:f:7:cf:2\ncell:L2:l:1:f:7:cf:2\ncell:M2:l:1:f:7:cf:2\ncell:N2:l:1:f:7:cf:2\ncell:O2:l:1:f:7:cf:2\ncell:P2:l:1:f:7:cf:2\ncell:Q2:l:1:f:7:cf:2\ncell:R2:l:1:f:7:cf:2\ncell:S2:l:1:f:7:cf:2\ncell:T2:l:1:f:7:cf:2\ncell:U2:l:1:f:7:cf:2\ncell:V2:l:1:f:7:cf:2\ncell:W2:l:1:f:7:cf:2\ncell:A3:l:1:f:7:cf:2\ncell:B3:l:1:f:7:cf:2\ncell:C3:l:1:f:7:cf:2\ncell:D3:l:1:f:7:cf:2\ncell:G3:l:1:f:7:cf:2\ncell:H3:l:1:f:7:cf:2\ncell:I3:l:1:f:7:cf:2\ncell:J3:l:1:f:7:cf:2\ncell:K3:l:1:f:7:cf:2\ncell:L3:l:1:f:7:cf:2\ncell:M3:l:1:f:7:cf:2\ncell:N3:l:1:f:7:cf:2\ncell:O3:l:1:f:7:cf:2\ncell:P3:l:1:f:7:cf:2\ncell:Q3:t: :l:1:f:7:cf:2\ncell:R3:l:1:f:7:cf:2\ncell:S3:l:1:f:7:cf:2\ncell:T3:l:1:f:7:cf:2\ncell:U3:l:1:f:7:cf:2\ncell:V3:l:1:f:7:cf:2\ncell:W3:l:1:f:7:cf:2\ncell:B4:t:Credit Card Expense:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C4:l:3:f:2:c:3:bg:1:cf:2\ncell:D4:l:3:f:2:c:3:bg:1:cf:1\ncell:E4:vtf:n:209:SUM(E5\\cE11):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F4:vtf:n:2508:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O4:l:1:f:7:cf:2\ncell:P4:l:1:f:7:cf:2\ncell:Q4:l:1:f:7:cf:2\ncell:R4:l:1:f:7:cf:2\ncell:S4:l:1:f:7:cf:2\ncell:T4:l:1:f:7:cf:2\ncell:U4:l:1:f:7:cf:2\ncell:V4:l:1:f:7:cf:2\ncell:W4:l:1:f:7:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:7:cf:2\ncell:C5:l:3:f:7:cf:2\ncell:D5:t:Card 1:l:3:f:6:cf:2\ncell:E5:v:209:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F5:vtf:n:2508:IF( (E5*12)=0,"",(E5*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:7:cf:2\ncell:P5:l:1:f:7:cf:2\ncell:Q5:l:1:f:7:cf:2\ncell:R5:l:1:f:7:cf:2\ncell:S5:l:1:f:7:cf:2\ncell:T5:l:1:f:7:cf:2\ncell:U5:l:1:f:7:cf:2\ncell:V5:l:1:f:7:cf:2\ncell:W5:l:1:f:7:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:7:bg:2:cf:2\ncell:C6:l:3:f:7:bg:2:cf:2\ncell:D6:t:Card 2:l:3:f:6:bg:2:cf:2\ncell:E6:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F6:vtf:t::IF( (E6*12)=0,"",(E6*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:7:cf:2\ncell:P6:l:1:f:7:cf:2\ncell:Q6:l:1:f:7:cf:2\ncell:R6:l:1:f:7:cf:2\ncell:S6:l:1:f:7:cf:2\ncell:T6:l:1:f:7:cf:2\ncell:U6:l:1:f:7:cf:2\ncell:V6:l:1:f:7:cf:2\ncell:W6:l:1:f:7:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:7:cf:2\ncell:C7:l:3:f:7:cf:2\ncell:D7:t:Card 3:l:3:f:6:cf:2\ncell:E7:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:7:cf:2\ncell:P7:l:1:f:7:cf:2\ncell:Q7:l:1:f:7:cf:2\ncell:R7:l:1:f:7:cf:2\ncell:S7:l:1:f:7:cf:2\ncell:T7:l:1:f:7:cf:2\ncell:U7:l:1:f:7:cf:2\ncell:V7:l:1:f:7:cf:2\ncell:W7:l:1:f:7:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:bg:2:cf:2\ncell:C8:l:3:f:7:bg:2:cf:2\ncell:D8:t:Card 4:l:3:f:6:bg:2:cf:2\ncell:E8:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:7:cf:2\ncell:P8:l:1:f:7:cf:2\ncell:Q8:l:1:f:7:cf:2\ncell:R8:l:1:f:7:cf:2\ncell:S8:l:1:f:7:cf:2\ncell:T8:l:1:f:7:cf:2\ncell:U8:l:1:f:7:cf:2\ncell:V8:l:1:f:7:cf:2\ncell:W8:l:1:f:7:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:7:cf:2\ncell:C9:l:3:f:7:cf:2\ncell:D9:t:Department Store Card:l:3:f:6:cf:2\ncell:E9:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F9:vtf:t::IF( (E9*12)=0,"",(E9*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:7:cf:2\ncell:P9:l:1:f:7:cf:2\ncell:Q9:l:1:f:7:cf:2\ncell:R9:l:1:f:7:cf:2\ncell:S9:l:1:f:7:cf:2\ncell:T9:l:1:f:7:cf:2\ncell:U9:l:1:f:7:cf:2\ncell:V9:l:1:f:7:cf:2\ncell:W9:l:1:f:7:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:7:bg:2:cf:2\ncell:C10:l:3:f:7:bg:2:cf:2\ncell:D10:t:Gas Card:l:3:f:6:bg:2:cf:2\ncell:E10:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:7:cf:2\ncell:P10:l:1:f:7:cf:2\ncell:Q10:l:1:f:7:cf:2\ncell:R10:l:1:f:7:cf:2\ncell:S10:l:1:f:7:cf:2\ncell:T10:l:1:f:7:cf:2\ncell:U10:l:1:f:7:cf:2\ncell:V10:l:1:f:7:cf:2\ncell:W10:l:1:f:7:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:7:cf:2\ncell:C11:l:3:f:7:cf:2\ncell:D11:t:Other:l:3:f:6:cf:2\ncell:E11:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:7:cf:2\ncell:P11:l:1:f:7:cf:2\ncell:Q11:l:1:f:7:cf:2\ncell:R11:l:1:f:7:cf:2\ncell:S11:l:1:f:7:cf:2\ncell:T11:l:1:f:7:cf:2\ncell:U11:l:1:f:7:cf:2\ncell:V11:l:1:f:7:cf:2\ncell:W11:l:1:f:7:cf:2\ncell:B12:t:Buisness:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C12:l:3:f:7:bg:2:cf:2\ncell:D12:l:3:f:6:bg:2:cf:2\ncell:E12:vtf:n:780:SUM(E13\\cE17):b:2:2:2:2:l:4:f:6:c:3:bg:1:cf:3:ntvf:1\ncell:F12:vtf:n:9360:IF( (E12*12)=0,"",(E12*12)):b:2:2:2:2:l:4:f:6:c:3:bg:1:cf:3:ntvf:1\ncell:O12:l:1:f:7:cf:2\ncell:P12:l:1:f:7:cf:2\ncell:Q12:l:1:f:7:cf:2\ncell:R12:l:1:f:7:cf:2\ncell:S12:l:1:f:7:cf:2\ncell:T12:l:1:f:7:cf:2\ncell:U12:l:1:f:7:cf:2\ncell:V12:l:1:f:7:cf:2\ncell:W12:l:1:f:7:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:7:cf:2\ncell:C13:l:3:f:7:cf:2\ncell:D13:t:Deductible Expenses:l:3:f:6:cf:2\ncell:E13:v:780:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F13:vtf:n:9360:IF( (E13*12)=0,"",(E13*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:7:cf:2\ncell:P13:l:1:f:7:cf:2\ncell:Q13:l:1:f:7:cf:2\ncell:R13:l:1:f:7:cf:2\ncell:S13:l:1:f:7:cf:2\ncell:T13:l:1:f:7:cf:2\ncell:U13:l:1:f:7:cf:2\ncell:V13:l:1:f:7:cf:2\ncell:W13:l:1:f:7:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:bg:2:cf:2\ncell:C14:l:3:f:7:bg:2:cf:2\ncell:D14:t:Non- Deductible Expenses:l:3:f:6:bg:2:cf:2\ncell:E14:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F14:vtf:t::IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:7:cf:2\ncell:P14:l:1:f:7:cf:2\ncell:Q14:l:1:f:7:cf:2\ncell:R14:l:1:f:7:cf:2\ncell:S14:l:1:f:7:cf:2\ncell:T14:l:1:f:7:cf:2\ncell:U14:l:1:f:7:cf:2\ncell:V14:l:1:f:7:cf:2\ncell:W14:l:1:f:7:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:7:cf:2\ncell:C15:l:3:f:7:cf:2\ncell:D15:t:Others:l:3:f:6:cf:2\ncell:E15:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F15:vtf:t::IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:7:cf:2\ncell:P15:l:1:f:7:cf:2\ncell:Q15:l:1:f:7:cf:2\ncell:R15:l:1:f:7:cf:2\ncell:S15:l:1:f:7:cf:2\ncell:T15:l:1:f:7:cf:2\ncell:U15:l:1:f:7:cf:2\ncell:V15:l:1:f:7:cf:2\ncell:W15:l:1:f:7:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:7:bg:2:cf:2\ncell:C16:l:3:f:7:bg:2:cf:2\ncell:D16:t:Others:l:3:f:6:bg:2:cf:2\ncell:E16:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:7:cf:2\ncell:P16:l:1:f:7:cf:2\ncell:Q16:l:1:f:7:cf:2\ncell:R16:l:1:f:7:cf:2\ncell:S16:l:1:f:7:cf:2\ncell:T16:l:1:f:7:cf:2\ncell:U16:l:1:f:7:cf:2\ncell:V16:l:1:f:7:cf:2\ncell:W16:l:1:f:7:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:7:cf:2\ncell:C17:l:3:f:7:cf:2\ncell:D17:t:Others:l:3:f:6:cf:2\ncell:E17:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:7:cf:2\ncell:P17:l:1:f:7:cf:2\ncell:Q17:l:1:f:7:cf:2\ncell:R17:l:1:f:7:cf:2\ncell:S17:l:1:f:7:cf:2\ncell:T17:l:1:f:7:cf:2\ncell:U17:l:1:f:7:cf:2\ncell:V17:l:1:f:7:cf:2\ncell:W17:l:1:f:7:cf:2\ncell:B18:t:Vacations/Expenses:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C18:l:3:f:2:c:3:bg:1:cf:2\ncell:D18:l:3:f:2:c:3:bg:1:cf:1\ncell:E18:vtf:n:98:SUM(E19\\cE24):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F18:vtf:n:1176:IF( (E18*12)=0,"",(E18*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O18:l:1:f:7:cf:2\ncell:P18:l:1:f:7:cf:2\ncell:Q18:l:1:f:7:cf:2\ncell:R18:l:1:f:7:cf:2\ncell:S18:l:1:f:7:cf:2\ncell:T18:l:1:f:7:cf:2\ncell:U18:l:1:f:7:cf:2\ncell:V18:l:1:f:7:cf:2\ncell:W18:l:1:f:7:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:7:cf:2\ncell:C19:l:3:f:7:cf:2\ncell:D19:t:Airfare:l:3:f:6:cf:2\ncell:E19:v:98:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F19:vtf:n:1176:IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:7:cf:2\ncell:P19:l:1:f:7:cf:2\ncell:Q19:l:1:f:7:cf:2\ncell:R19:l:1:f:7:cf:2\ncell:S19:l:1:f:7:cf:2\ncell:T19:l:1:f:7:cf:2\ncell:U19:l:1:f:7:cf:2\ncell:V19:l:1:f:7:cf:2\ncell:W19:l:1:f:7:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:7:bg:2:cf:2\ncell:C20:l:3:f:7:bg:2:cf:2\ncell:D20:t:Accomodation:l:3:f:6:bg:2:cf:2\ncell:E20:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:7:cf:2\ncell:P20:l:1:f:7:cf:2\ncell:Q20:l:1:f:7:cf:2\ncell:R20:l:1:f:7:cf:2\ncell:S20:l:1:f:7:cf:2\ncell:T20:l:1:f:7:cf:2\ncell:U20:l:1:f:7:cf:2\ncell:V20:l:1:f:7:cf:2\ncell:W20:l:1:f:7:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:cf:2\ncell:C21:l:3:f:7:cf:2\ncell:D21:t:Food:l:3:f:6:cf:2\ncell:E21:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:7:cf:2\ncell:P21:l:1:f:7:cf:2\ncell:Q21:l:1:f:7:cf:2\ncell:R21:l:1:f:7:cf:2\ncell:S21:l:1:f:7:cf:2\ncell:T21:l:1:f:7:cf:2\ncell:U21:l:1:f:7:cf:2\ncell:V21:l:1:f:7:cf:2\ncell:W21:l:1:f:7:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:7:bg:2:cf:2\ncell:C22:l:3:f:7:bg:2:cf:2\ncell:D22:t:Pet Boarding:l:3:f:6:bg:2:cf:2\ncell:E22:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G22:b::::1\ncell:O22:l:1:f:7:cf:2\ncell:P22:l:1:f:7:cf:2\ncell:Q22:l:1:f:7:cf:2\ncell:R22:l:1:f:7:cf:2\ncell:S22:l:1:f:7:cf:2\ncell:T22:l:1:f:7:cf:2\ncell:U22:l:1:f:7:cf:2\ncell:V22:l:1:f:7:cf:2\ncell:W22:l:1:f:7:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:7:cf:2\ncell:C23:l:3:f:7:cf:2\ncell:D23:t:Rental Car:l:3:f:6:cf:2\ncell:E23:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:7:cf:2\ncell:P23:l:1:f:7:cf:2\ncell:Q23:l:1:f:7:cf:2\ncell:R23:l:1:f:7:cf:2\ncell:S23:l:1:f:7:cf:2\ncell:T23:l:1:f:7:cf:2\ncell:U23:l:1:f:7:cf:2\ncell:V23:l:1:f:7:cf:2\ncell:W23:l:1:f:7:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:7:bg:2:cf:2\ncell:C24:l:3:f:7:bg:2:cf:2\ncell:D24:t:Souvenier:l:3:f:6:bg:2:cf:2\ncell:E24:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:7:cf:2\ncell:P24:l:1:f:7:cf:2\ncell:Q24:l:1:f:7:cf:2\ncell:R24:l:1:f:7:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:7:cf:2\ncell:C25:l:3:f:7:cf:2\ncell:D25:t:Others:l:3:f:6:cf:2\ncell:E25:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F25:vtf:t::IF( (E25*12)=0,"",(E25*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G25:b::::1\ncell:O25:l:1:f:7:cf:2\ncell:P25:l:1:f:7:cf:2\ncell:Q25:l:1:f:7:cf:2\ncell:R25:l:1:f:7:cf:2\ncell:B26:t:Miscellaneous:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C26:l:3:f:2:c:3:bg:1:cf:2\ncell:D26:l:3:f:2:c:3:bg:1:cf:1\ncell:E26:vtf:n:222:SUM(E27\\cE29):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F26:vtf:n:2664:IF( (E26*12)=0,"",(E26*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O26:l:1:f:7:cf:2\ncell:P26:l:1:f:7:cf:2\ncell:Q26:l:1:f:7:cf:2\ncell:R26:l:1:f:7:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:7:cf:2\ncell:C27:l:3:f:7:cf:2\ncell:D27:t:Tobacco Consumption:l:3:f:6:cf:2\ncell:E27:v:136:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F27:vtf:n:1632:IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:7:cf:2\ncell:P27:l:1:f:7:cf:2\ncell:Q27:l:1:f:7:cf:2\ncell:R27:l:1:f:7:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:7:bg:2:cf:2\ncell:C28:l:3:f:7:bg:2:cf:2\ncell:D28:t:Others:l:3:f:6:bg:2:cf:2\ncell:E28:v:86:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F28:vtf:n:1032:IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:7:cf:2\ncell:P28:l:1:f:7:cf:2\ncell:Q28:l:1:f:7:cf:2\ncell:R28:l:1:f:7:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:7:cf:2\ncell:C29:l:3:f:7:cf:2\ncell:D29:t:Others:l:3:f:6:cf:2\ncell:E29:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:7:cf:2\ncell:P29:l:1:f:7:cf:2\ncell:Q29:l:1:f:7:cf:2\ncell:R29:l:1:f:7:cf:2\ncell:B30:t:Total Expenses:l:5:f:3:c:3:bg:1:cf:1:colspan:3\ncell:C30:c:3:bg:1\ncell:D30:c:3:bg:1\ncell:E30:vtf:n:4853:sheet10!E25 +sheet10!E22 +sheet10!E18 +sheet10!E13 +sheet10!E4 +sheet9!E26 +sheet9!E17 +sheet9!E12 +sheet9!E4 + expense!E7+sheet11!E26 +sheet11!E18+ sheet11!E12 +sheet11!E4:b:2:2:2:2:c:3:bg:1:ntvf:2\ncell:F30:vtf:n:58236:IF((E30*12)=0,"",(E30*12)):b:2:2:2:2:c:3:bg:1:ntvf:2\ncell:O30:l:1:f:7:cf:2\ncell:P30:l:1:f:7:cf:2\ncell:Q30:l:1:f:7:cf:2\ncell:R30:l:1:f:7:cf:2\ncell:O31:l:1:f:7:cf:2\ncell:P31:l:1:f:7:cf:2\ncell:Q31:l:1:f:7:cf:2\ncell:R31:l:1:f:7:cf:2\ncell:O32:l:1:f:7:cf:2\ncell:P32:l:1:f:7:cf:2\ncell:Q32:l:1:f:7:cf:2\ncell:R32:l:1:f:7:cf:2\ncell:O33:l:1:f:7:cf:2\ncell:P33:l:1:f:7:cf:2\ncell:Q33:l:1:f:7:cf:2\ncell:R33:l:1:f:7:cf:2\ncell:O34:l:1:f:7:cf:2\ncell:P34:l:1:f:7:cf:2\ncell:Q34:l:1:f:7:cf:2\ncell:R34:l:1:f:7:cf:2\ncell:O35:l:1:f:7:cf:2\ncell:P35:l:1:f:7:cf:2\ncell:Q35:l:1:f:7:cf:2\ncell:R35:l:1:f:7:cf:2\ncell:O36:l:1:f:7:cf:2\ncell:P36:l:1:f:7:cf:2\ncell:Q36:l:1:f:7:cf:2\ncell:R36:l:1:f:7:cf:2\ncell:O37:l:1:f:7:cf:2\ncell:P37:l:1:f:7:cf:2\ncell:Q37:l:1:f:7:cf:2\ncell:R37:l:1:f:7:cf:2\ncell:O38:l:1:f:7:cf:2\ncell:P38:l:1:f:7:cf:2\ncell:Q38:l:1:f:7:cf:2\ncell:R38:l:1:f:7:cf:2\ncell:B39:l:1:f:7:cf:2\ncell:C39:l:1:f:7:cf:2\ncell:D39:l:1:f:2:cf:2\ncell:E39:l:1:f:2:cf:3:ntvf:1\ncell:F39:l:1:f:2:cf:3:ntvf:1\ncell:O39:l:1:f:7:cf:2\ncell:P39:l:1:f:7:cf:2\ncell:Q39:l:1:f:7:cf:2\ncell:R39:l:1:f:7:cf:2\ncell:B40:l:1:f:5:cf:2\ncell:C40:l:1:f:5:cf:2\ncell:D40:l:1:f:9:cf:2\ncell:E40:l:1:f:9:cf:2\ncell:F40:l:1:f:7:cf:2\ncell:O40:l:1:f:7:cf:2\ncell:P40:l:1:f:7:cf:2\ncell:Q40:l:1:f:7:cf:2\ncell:R40:l:1:f:7:cf:2\ncell:O41:l:1:f:7:cf:2\ncell:P41:l:1:f:7:cf:2\ncell:Q41:l:1:f:7:cf:2\ncell:R41:l:1:f:7:cf:2\ncell:O42:l:1:f:7:cf:2\ncell:P42:l:1:f:7:cf:2\ncell:Q42:l:1:f:7:cf:2\ncell:R42:l:1:f:7:cf:2\ncell:O43:l:1:f:7:cf:2\ncell:P43:l:1:f:7:cf:2\ncell:Q43:l:1:f:7:cf:2\ncell:R43:l:1:f:7:cf:2\ncell:O44:l:1:f:7:cf:2\ncell:P44:l:1:f:7:cf:2\ncell:Q44:l:1:f:7:cf:2\ncell:R44:l:1:f:7:cf:2\ncell:O45:l:1:f:7:cf:2\ncell:P45:l:1:f:7:cf:2\ncell:Q45:l:1:f:7:cf:2\ncell:R45:l:1:f:7:cf:2\ncell:O46:l:1:f:7:cf:2\ncell:P46:l:1:f:7:cf:2\ncell:Q46:l:1:f:7:cf:2\ncell:R46:l:1:f:7:cf:2\ncell:O47:l:1:f:7:cf:2\ncell:P47:l:1:f:7:cf:2\ncell:Q47:l:1:f:7:cf:2\ncell:R47:l:1:f:7:cf:2\ncell:O48:l:1:f:7:cf:2\ncell:P48:l:1:f:7:cf:2\ncell:Q48:l:1:f:7:cf:2\ncell:R48:l:1:f:7:cf:2\ncell:O49:l:1:f:7:cf:2\ncell:P49:l:1:f:7:cf:2\ncell:Q49:l:1:f:7:cf:2\ncell:R49:l:1:f:7:cf:2\ncell:O50:l:1:f:7:cf:2\ncell:P50:l:1:f:7:cf:2\ncell:Q50:l:1:f:7:cf:2\ncell:R50:l:1:f:7:cf:2\ncell:S50:l:1:f:7:cf:2\ncell:T50:l:1:f:7:cf:2\ncell:U50:l:1:f:7:cf:2\ncell:V50:l:1:f:7:cf:2\ncell:W50:l:1:f:7:cf:2\ncell:O51:l:1:f:7:cf:2\ncell:P51:l:1:f:7:cf:2\ncell:Q51:l:1:f:7:cf:2\ncell:R51:l:1:f:7:cf:2\ncell:S51:l:1:f:7:cf:2\ncell:T51:l:1:f:7:cf:2\ncell:U51:l:1:f:7:cf:2\ncell:V51:l:1:f:7:cf:2\ncell:W51:l:1:f:7:cf:2\ncell:O52:l:1:f:7:cf:2\ncell:P52:l:1:f:7:cf:2\ncell:Q52:l:1:f:7:cf:2\ncell:R52:l:1:f:7:cf:2\ncell:S52:l:1:f:7:cf:2\ncell:T52:l:1:f:7:cf:2\ncell:U52:l:1:f:7:cf:2\ncell:V52:l:1:f:7:cf:2\ncell:W52:l:1:f:7:cf:2\ncell:O53:l:1:f:7:cf:2\ncell:P53:l:1:f:7:cf:2\ncell:Q53:l:1:f:7:cf:2\ncell:R53:l:1:f:7:cf:2\ncell:S53:l:1:f:7:cf:2\ncell:T53:l:1:f:7:cf:2\ncell:U53:l:1:f:7:cf:2\ncell:V53:l:1:f:7:cf:2\ncell:W53:l:1:f:7:cf:2\ncell:O54:l:1:f:7:cf:2\ncell:P54:l:1:f:7:cf:2\ncell:Q54:l:1:f:7:cf:2\ncell:R54:l:1:f:7:cf:2\ncell:S54:l:1:f:7:cf:2\ncell:T54:l:1:f:7:cf:2\ncell:U54:l:1:f:7:cf:2\ncell:V54:l:1:f:7:cf:2\ncell:W54:l:1:f:7:cf:2\ncell:O55:l:1:f:7:cf:2\ncell:P55:l:1:f:7:cf:2\ncell:Q55:l:1:f:7:cf:2\ncell:R55:l:1:f:7:cf:2\ncell:S55:l:1:f:7:cf:2\ncell:T55:l:1:f:7:cf:2\ncell:U55:l:1:f:7:cf:2\ncell:V55:l:1:f:7:cf:2\ncell:W55:l:1:f:7:cf:2\ncell:O56:l:1:f:7:cf:2\ncell:P56:l:1:f:7:cf:2\ncell:Q56:l:1:f:7:cf:2\ncell:R56:l:1:f:7:cf:2\ncell:S56:l:1:f:7:cf:2\ncell:T56:l:1:f:7:cf:2\ncell:U56:l:1:f:7:cf:2\ncell:V56:l:1:f:7:cf:2\ncell:W56:l:1:f:7:cf:2\ncell:O57:l:1:f:7:cf:2\ncell:P57:l:1:f:7:cf:2\ncell:Q57:l:1:f:7:cf:2\ncell:R57:l:1:f:7:cf:2\ncell:S57:l:1:f:7:cf:2\ncell:T57:l:1:f:7:cf:2\ncell:U57:l:1:f:7:cf:2\ncell:V57:l:1:f:7:cf:2\ncell:W57:l:1:f:7:cf:2\ncell:O58:l:1:f:7:cf:2\ncell:P58:l:1:f:7:cf:2\ncell:Q58:l:1:f:7:cf:2\ncell:R58:l:1:f:7:cf:2\ncell:S58:l:1:f:7:cf:2\ncell:T58:l:1:f:7:cf:2\ncell:U58:l:1:f:7:cf:2\ncell:V58:l:1:f:7:cf:2\ncell:W58:l:1:f:7:cf:2\ncell:O59:l:1:f:7:cf:2\ncell:P59:l:1:f:7:cf:2\ncell:Q59:l:1:f:7:cf:2\ncell:R59:l:1:f:7:cf:2\ncell:S59:l:1:f:7:cf:2\ncell:T59:l:1:f:7:cf:2\ncell:U59:l:1:f:7:cf:2\ncell:V59:l:1:f:7:cf:2\ncell:W59:l:1:f:7:cf:2\ncell:O60:l:1:f:7:cf:2\ncell:P60:l:1:f:7:cf:2\ncell:Q60:l:1:f:7:cf:2\ncell:R60:l:1:f:7:cf:2\ncell:S60:l:1:f:7:cf:2\ncell:T60:l:1:f:7:cf:2\ncell:U60:l:1:f:7:cf:2\ncell:V60:l:1:f:7:cf:2\ncell:W60:l:1:f:7:cf:2\ncell:O61:l:1:f:7:cf:2\ncell:P61:l:1:f:7:cf:2\ncell:Q61:l:1:f:7:cf:2\ncell:R61:l:1:f:7:cf:2\ncell:S61:l:1:f:7:cf:2\ncell:T61:l:1:f:7:cf:2\ncell:U61:l:1:f:7:cf:2\ncell:V61:l:1:f:7:cf:2\ncell:W61:l:1:f:7:cf:2\ncell:O62:l:1:f:7:cf:2\ncell:P62:l:1:f:7:cf:2\ncell:Q62:l:1:f:7:cf:2\ncell:R62:l:1:f:7:cf:2\ncell:S62:l:1:f:7:cf:2\ncell:T62:l:1:f:7:cf:2\ncell:U62:l:1:f:7:cf:2\ncell:V62:l:1:f:7:cf:2\ncell:W62:l:1:f:7:cf:2\ncell:O63:l:1:f:7:cf:2\ncell:P63:l:1:f:7:cf:2\ncell:Q63:l:1:f:7:cf:2\ncell:R63:l:1:f:7:cf:2\ncell:S63:l:1:f:7:cf:2\ncell:T63:l:1:f:7:cf:2\ncell:U63:l:1:f:7:cf:2\ncell:V63:l:1:f:7:cf:2\ncell:W63:l:1:f:7:cf:2\ncell:O64:l:1:f:7:cf:2\ncell:P64:l:1:f:7:cf:2\ncell:Q64:l:1:f:7:cf:2\ncell:R64:l:1:f:7:cf:2\ncell:S64:l:1:f:7:cf:2\ncell:T64:l:1:f:7:cf:2\ncell:U64:l:1:f:7:cf:2\ncell:V64:l:1:f:7:cf:2\ncell:W64:l:1:f:7:cf:2\ncell:O65:l:1:f:7:cf:2\ncell:P65:l:1:f:7:cf:2\ncell:Q65:l:1:f:7:cf:2\ncell:R65:l:1:f:7:cf:2\ncell:S65:l:1:f:7:cf:2\ncell:T65:l:1:f:7:cf:2\ncell:U65:l:1:f:7:cf:2\ncell:V65:l:1:f:7:cf:2\ncell:W65:l:1:f:7:cf:2\ncell:O66:l:1:f:7:cf:2\ncell:P66:l:1:f:7:cf:2\ncell:Q66:l:1:f:7:cf:2\ncell:R66:l:1:f:7:cf:2\ncell:S66:l:1:f:7:cf:2\ncell:T66:l:1:f:7:cf:2\ncell:U66:l:1:f:7:cf:2\ncell:V66:l:1:f:7:cf:2\ncell:W66:l:1:f:7:cf:2\ncell:O67:l:1:f:7:cf:2\ncell:P67:l:1:f:7:cf:2\ncell:Q67:l:1:f:7:cf:2\ncell:R67:l:1:f:7:cf:2\ncell:S67:l:1:f:7:cf:2\ncell:T67:l:1:f:7:cf:2\ncell:U67:l:1:f:7:cf:2\ncell:V67:l:1:f:7:cf:2\ncell:W67:l:1:f:7:cf:2\ncell:O68:l:1:f:7:cf:2\ncell:P68:l:1:f:7:cf:2\ncell:Q68:l:1:f:7:cf:2\ncell:R68:l:1:f:7:cf:2\ncell:S68:l:1:f:7:cf:2\ncell:T68:l:1:f:7:cf:2\ncell:U68:l:1:f:7:cf:2\ncell:V68:l:1:f:7:cf:2\ncell:W68:l:1:f:7:cf:2\ncell:O69:l:1:f:7:cf:2\ncell:P69:l:1:f:7:cf:2\ncell:Q69:l:1:f:7:cf:2\ncell:R69:l:1:f:7:cf:2\ncell:S69:l:1:f:7:cf:2\ncell:T69:l:1:f:7:cf:2\ncell:U69:l:1:f:7:cf:2\ncell:V69:l:1:f:7:cf:2\ncell:W69:l:1:f:7:cf:2\ncell:O70:l:1:f:7:cf:2\ncell:P70:l:1:f:7:cf:2\ncell:Q70:l:1:f:7:cf:2\ncell:R70:l:1:f:7:cf:2\ncell:S70:l:1:f:7:cf:2\ncell:T70:l:1:f:7:cf:2\ncell:U70:l:1:f:7:cf:2\ncell:V70:l:1:f:7:cf:2\ncell:W70:l:1:f:7:cf:2\ncell:O71:l:1:f:7:cf:2\ncell:P71:l:1:f:7:cf:2\ncell:Q71:l:1:f:7:cf:2\ncell:R71:l:1:f:7:cf:2\ncell:S71:l:1:f:7:cf:2\ncell:T71:l:1:f:7:cf:2\ncell:U71:l:1:f:7:cf:2\ncell:V71:l:1:f:7:cf:2\ncell:W71:l:1:f:7:cf:2\ncell:O72:l:1:f:7:cf:2\ncell:P72:l:1:f:7:cf:2\ncell:Q72:l:1:f:7:cf:2\ncell:R72:l:1:f:7:cf:2\ncell:S72:l:1:f:7:cf:2\ncell:T72:l:1:f:7:cf:2\ncell:U72:l:1:f:7:cf:2\ncell:V72:l:1:f:7:cf:2\ncell:W72:l:1:f:7:cf:2\ncell:O73:l:1:f:7:cf:2\ncell:P73:l:1:f:7:cf:2\ncell:Q73:l:1:f:7:cf:2\ncell:R73:l:1:f:7:cf:2\ncell:S73:l:1:f:7:cf:2\ncell:T73:l:1:f:7:cf:2\ncell:U73:l:1:f:7:cf:2\ncell:V73:l:1:f:7:cf:2\ncell:W73:l:1:f:7:cf:2\ncell:O74:l:1:f:7:cf:2\ncell:P74:l:1:f:7:cf:2\ncell:Q74:l:1:f:7:cf:2\ncell:R74:l:1:f:7:cf:2\ncell:S74:l:1:f:7:cf:2\ncell:T74:l:1:f:7:cf:2\ncell:U74:l:1:f:7:cf:2\ncell:V74:l:1:f:7:cf:2\ncell:W74:l:1:f:7:cf:2\ncell:O75:l:1:f:7:cf:2\ncell:P75:l:1:f:7:cf:2\ncell:Q75:l:1:f:7:cf:2\ncell:R75:l:1:f:7:cf:2\ncell:S75:l:1:f:7:cf:2\ncell:T75:l:1:f:7:cf:2\ncell:U75:l:1:f:7:cf:2\ncell:V75:l:1:f:7:cf:2\ncell:W75:l:1:f:7:cf:2\ncell:O76:l:1:f:7:cf:2\ncell:P76:l:1:f:7:cf:2\ncell:Q76:l:1:f:7:cf:2\ncell:R76:l:1:f:7:cf:2\ncell:S76:l:1:f:7:cf:2\ncell:T76:l:1:f:7:cf:2\ncell:U76:l:1:f:7:cf:2\ncell:V76:l:1:f:7:cf:2\ncell:W76:l:1:f:7:cf:2\ncell:O77:l:1:f:7:cf:2\ncell:P77:l:1:f:7:cf:2\ncell:Q77:l:1:f:7:cf:2\ncell:R77:l:1:f:7:cf:2\ncell:S77:l:1:f:7:cf:2\ncell:T77:l:1:f:7:cf:2\ncell:U77:l:1:f:7:cf:2\ncell:V77:l:1:f:7:cf:2\ncell:W77:l:1:f:7:cf:2\ncell:O78:l:1:f:7:cf:2\ncell:P78:l:1:f:7:cf:2\ncell:Q78:l:1:f:7:cf:2\ncell:R78:l:1:f:7:cf:2\ncell:S78:l:1:f:7:cf:2\ncell:T78:l:1:f:7:cf:2\ncell:U78:l:1:f:7:cf:2\ncell:V78:l:1:f:7:cf:2\ncell:W78:l:1:f:7:cf:2\ncell:O79:l:1:f:7:cf:2\ncell:P79:l:1:f:7:cf:2\ncell:Q79:l:1:f:7:cf:2\ncell:R79:l:1:f:7:cf:2\ncell:S79:l:1:f:7:cf:2\ncell:T79:l:1:f:7:cf:2\ncell:U79:l:1:f:7:cf:2\ncell:V79:l:1:f:7:cf:2\ncell:W79:l:1:f:7:cf:2\ncell:O80:l:1:f:7:cf:2\ncell:P80:l:1:f:7:cf:2\ncell:Q80:l:1:f:7:cf:2\ncell:R80:l:1:f:7:cf:2\ncell:S80:l:1:f:7:cf:2\ncell:T80:l:1:f:7:cf:2\ncell:U80:l:1:f:7:cf:2\ncell:V80:l:1:f:7:cf:2\ncell:W80:l:1:f:7:cf:2\ncell:O81:l:1:f:7:cf:2\ncell:P81:l:1:f:7:cf:2\ncell:Q81:l:1:f:7:cf:2\ncell:R81:l:1:f:7:cf:2\ncell:S81:l:1:f:7:cf:2\ncell:T81:l:1:f:7:cf:2\ncell:U81:l:1:f:7:cf:2\ncell:V81:l:1:f:7:cf:2\ncell:W81:l:1:f:7:cf:2\ncell:O82:l:1:f:7:cf:2\ncell:P82:l:1:f:7:cf:2\ncell:Q82:l:1:f:7:cf:2\ncell:R82:l:1:f:7:cf:2\ncell:S82:l:1:f:7:cf:2\ncell:T82:l:1:f:7:cf:2\ncell:U82:l:1:f:7:cf:2\ncell:V82:l:1:f:7:cf:2\ncell:W82:l:1:f:7:cf:2\ncell:O83:l:1:f:7:cf:2\ncell:P83:l:1:f:7:cf:2\ncell:Q83:l:1:f:7:cf:2\ncell:R83:l:1:f:7:cf:2\ncell:S83:l:1:f:7:cf:2\ncell:T83:l:1:f:7:cf:2\ncell:U83:l:1:f:7:cf:2\ncell:V83:l:1:f:7:cf:2\ncell:W83:l:1:f:7:cf:2\ncell:O84:l:1:f:7:cf:2\ncell:P84:l:1:f:7:cf:2\ncell:Q84:l:1:f:7:cf:2\ncell:R84:l:1:f:7:cf:2\ncell:S84:l:1:f:7:cf:2\ncell:T84:l:1:f:7:cf:2\ncell:U84:l:1:f:7:cf:2\ncell:V84:l:1:f:7:cf:2\ncell:W84:l:1:f:7:cf:2\ncell:O85:l:1:f:7:cf:2\ncell:P85:l:1:f:7:cf:2\ncell:Q85:l:1:f:7:cf:2\ncell:R85:l:1:f:7:cf:2\ncell:S85:l:1:f:7:cf:2\ncell:T85:l:1:f:7:cf:2\ncell:U85:l:1:f:7:cf:2\ncell:V85:l:1:f:7:cf:2\ncell:W85:l:1:f:7:cf:2\ncell:O86:l:1:f:7:cf:2\ncell:P86:l:1:f:7:cf:2\ncell:Q86:l:1:f:7:cf:2\ncell:R86:l:1:f:7:cf:2\ncell:S86:l:1:f:7:cf:2\ncell:T86:l:1:f:7:cf:2\ncell:U86:l:1:f:7:cf:2\ncell:V86:l:1:f:7:cf:2\ncell:W86:l:1:f:7:cf:2\ncell:O87:l:1:f:7:cf:2\ncell:P87:l:1:f:7:cf:2\ncell:Q87:l:1:f:7:cf:2\ncell:R87:l:1:f:7:cf:2\ncell:S87:l:1:f:7:cf:2\ncell:T87:l:1:f:7:cf:2\ncell:U87:l:1:f:7:cf:2\ncell:V87:l:1:f:7:cf:2\ncell:W87:l:1:f:7:cf:2\ncell:O88:l:1:f:7:cf:2\ncell:P88:l:1:f:7:cf:2\ncell:Q88:l:1:f:7:cf:2\ncell:R88:l:1:f:7:cf:2\ncell:S88:l:1:f:7:cf:2\ncell:T88:l:1:f:7:cf:2\ncell:U88:l:1:f:7:cf:2\ncell:V88:l:1:f:7:cf:2\ncell:W88:l:1:f:7:cf:2\ncell:O89:l:1:f:7:cf:2\ncell:P89:l:1:f:7:cf:2\ncell:Q89:l:1:f:7:cf:2\ncell:R89:l:1:f:7:cf:2\ncell:S89:l:1:f:7:cf:2\ncell:T89:l:1:f:7:cf:2\ncell:U89:l:1:f:7:cf:2\ncell:V89:l:1:f:7:cf:2\ncell:W89:l:1:f:7:cf:2\ncell:O90:l:1:f:7:cf:2\ncell:P90:l:1:f:7:cf:2\ncell:Q90:l:1:f:7:cf:2\ncell:R90:l:1:f:7:cf:2\ncell:S90:l:1:f:7:cf:2\ncell:T90:l:1:f:7:cf:2\ncell:U90:l:1:f:7:cf:2\ncell:V90:l:1:f:7:cf:2\ncell:W90:l:1:f:7:cf:2\ncell:O91:l:1:f:7:cf:2\ncell:P91:l:1:f:7:cf:2\ncell:Q91:l:1:f:7:cf:2\ncell:R91:l:1:f:7:cf:2\ncell:S91:l:1:f:7:cf:2\ncell:T91:l:1:f:7:cf:2\ncell:U91:l:1:f:7:cf:2\ncell:V91:l:1:f:7:cf:2\ncell:W91:l:1:f:7:cf:2\ncell:O92:l:1:f:7:cf:2\ncell:P92:l:1:f:7:cf:2\ncell:Q92:l:1:f:7:cf:2\ncell:R92:l:1:f:7:cf:2\ncell:S92:l:1:f:7:cf:2\ncell:T92:l:1:f:7:cf:2\ncell:U92:l:1:f:7:cf:2\ncell:V92:l:1:f:7:cf:2\ncell:W92:l:1:f:7:cf:2\ncell:O93:l:1:f:7:cf:2\ncell:P93:l:1:f:7:cf:2\ncell:Q93:l:1:f:7:cf:2\ncell:R93:l:1:f:7:cf:2\ncell:S93:l:1:f:7:cf:2\ncell:T93:l:1:f:7:cf:2\ncell:U93:l:1:f:7:cf:2\ncell:V93:l:1:f:7:cf:2\ncell:W93:l:1:f:7:cf:2\ncell:O94:l:1:f:7:cf:2\ncell:P94:l:1:f:7:cf:2\ncell:Q94:l:1:f:7:cf:2\ncell:R94:l:1:f:7:cf:2\ncell:S94:l:1:f:7:cf:2\ncell:T94:l:1:f:7:cf:2\ncell:U94:l:1:f:7:cf:2\ncell:V94:l:1:f:7:cf:2\ncell:W94:l:1:f:7:cf:2\ncell:O95:l:1:f:7:cf:2\ncell:P95:l:1:f:7:cf:2\ncell:Q95:l:1:f:7:cf:2\ncell:R95:l:1:f:7:cf:2\ncell:S95:l:1:f:7:cf:2\ncell:T95:l:1:f:7:cf:2\ncell:U95:l:1:f:7:cf:2\ncell:V95:l:1:f:7:cf:2\ncell:W95:l:1:f:7:cf:2\ncell:O96:l:1:f:7:cf:2\ncell:P96:l:1:f:7:cf:2\ncell:Q96:l:1:f:7:cf:2\ncell:R96:l:1:f:7:cf:2\ncell:S96:l:1:f:7:cf:2\ncell:T96:l:1:f:7:cf:2\ncell:U96:l:1:f:7:cf:2\ncell:V96:l:1:f:7:cf:2\ncell:W96:l:1:f:7:cf:2\ncell:O97:l:1:f:7:cf:2\ncell:P97:l:1:f:7:cf:2\ncell:Q97:l:1:f:7:cf:2\ncell:R97:l:1:f:7:cf:2\ncell:S97:l:1:f:7:cf:2\ncell:T97:l:1:f:7:cf:2\ncell:U97:l:1:f:7:cf:2\ncell:V97:l:1:f:7:cf:2\ncell:W97:l:1:f:7:cf:2\ncell:O98:l:1:f:7:cf:2\ncell:P98:l:1:f:7:cf:2\ncell:Q98:l:1:f:7:cf:2\ncell:R98:l:1:f:7:cf:2\ncell:S98:l:1:f:7:cf:2\ncell:T98:l:1:f:7:cf:2\ncell:U98:l:1:f:7:cf:2\ncell:V98:l:1:f:7:cf:2\ncell:W98:l:1:f:7:cf:2\ncell:O99:l:1:f:7:cf:2\ncell:P99:l:1:f:7:cf:2\ncell:Q99:l:1:f:7:cf:2\ncell:R99:l:1:f:7:cf:2\ncell:S99:l:1:f:7:cf:2\ncell:T99:l:1:f:7:cf:2\ncell:U99:l:1:f:7:cf:2\ncell:V99:l:1:f:7:cf:2\ncell:W99:l:1:f:7:cf:2\ncell:O100:l:1:f:7:cf:2\ncell:P100:l:1:f:7:cf:2\ncell:Q100:l:1:f:7:cf:2\ncell:R100:l:1:f:7:cf:2\ncell:S100:l:1:f:7:cf:2\ncell:T100:l:1:f:7:cf:2\ncell:U100:l:1:f:7:cf:2\ncell:V100:l:1:f:7:cf:2\ncell:W100:l:1:f:7:cf:2\ncell:O101:l:1:f:7:cf:2\ncell:P101:l:1:f:7:cf:2\ncell:Q101:l:1:f:7:cf:2\ncell:R101:l:1:f:7:cf:2\ncell:S101:l:1:f:7:cf:2\ncell:T101:l:1:f:7:cf:2\ncell:U101:l:1:f:7:cf:2\ncell:V101:l:1:f:7:cf:2\ncell:W101:l:1:f:7:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:A106:l:1:f:8:cf:2\ncell:B106:l:1:f:8:cf:2\ncell:C106:l:1:f:8:cf:2\ncell:D106:l:1:f:8:cf:2\ncell:E106:l:1:f:8:cf:2\ncell:F106:t:Monthly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G106:l:1:f:8:cf:2\ncell:H106:l:1:f:8:cf:2\ncell:I106:l:1:f:8:cf:2\ncell:J106:l:1:f:8:cf:2\ncell:K106:l:1:f:8:cf:2\ncell:L106:l:1:f:8:cf:2\ncell:M106:l:1:f:8:cf:2\ncell:N106:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:A107:l:1:f:8:cf:2\ncell:B107:l:1:f:8:cf:2\ncell:C107:l:1:f:8:cf:2\ncell:D107:l:1:f:8:cf:2\ncell:E107:l:1:f:8:cf:2\ncell:F107:t:Semi-Annually:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G107:l:1:f:8:cf:2\ncell:H107:l:1:f:8:cf:2\ncell:I107:l:1:f:8:cf:2\ncell:J107:l:1:f:8:cf:2\ncell:K107:l:1:f:8:cf:2\ncell:L107:l:1:f:8:cf:2\ncell:M107:l:1:f:8:cf:2\ncell:N107:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:A108:l:1:f:8:cf:2\ncell:B108:l:1:f:8:cf:2\ncell:C108:l:1:f:8:cf:2\ncell:D108:l:1:f:8:cf:2\ncell:E108:l:1:f:8:cf:2\ncell:F108:t:Quarterly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G108:l:1:f:8:cf:2\ncell:H108:l:1:f:8:cf:2\ncell:I108:l:1:f:8:cf:2\ncell:J108:l:1:f:8:cf:2\ncell:K108:l:1:f:8:cf:2\ncell:L108:l:1:f:8:cf:2\ncell:M108:l:1:f:8:cf:2\ncell:N108:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:A109:l:1:f:8:cf:2\ncell:B109:l:1:f:8:cf:2\ncell:C109:l:1:f:8:cf:2\ncell:D109:l:1:f:8:cf:2\ncell:E109:l:1:f:8:cf:2\ncell:F109:t:Yearly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G109:l:1:f:8:cf:2\ncell:H109:l:1:f:8:cf:2\ncell:I109:l:1:f:8:cf:2\ncell:J109:l:1:f:8:cf:2\ncell:K109:l:1:f:8:cf:2\ncell:L109:l:1:f:8:cf:2\ncell:M109:l:1:f:8:cf:2\ncell:N109:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncell:A110:l:1:f:8:cf:2\ncell:B110:l:1:f:8:cf:2\ncell:C110:l:1:f:8:cf:2\ncell:D110:l:1:f:8:cf:2\ncell:E110:l:1:f:8:cf:2\ncell:F110:l:1:f:8:cf:2\ncell:G110:l:1:f:8:cf:2\ncell:H110:l:1:f:8:cf:2\ncell:I110:l:1:f:8:cf:2\ncell:J110:l:1:f:8:cf:2\ncell:K110:l:1:f:8:cf:2\ncell:L110:l:1:f:8:cf:2\ncell:M110:l:1:f:8:cf:2\ncell:N110:l:1:f:8:cf:2\ncell:O110:l:1:f:8:cf:2\ncell:P110:l:1:f:8:cf:2\ncell:Q110:l:1:f:8:cf:2\ncell:R110:l:1:f:8:cf:2\ncell:S110:l:1:f:8:cf:2\ncell:T110:l:1:f:8:cf:2\ncell:U110:l:1:f:8:cf:2\ncell:V110:l:1:f:8:cf:2\ncell:W110:l:1:f:8:cf:2\ncell:A111:l:1:f:8:cf:2\ncell:B111:l:1:f:8:cf:2\ncell:C111:l:1:f:8:cf:2\ncell:D111:l:1:f:8:cf:2\ncell:E111:l:1:f:8:cf:2\ncell:F111:l:1:f:8:cf:2\ncell:G111:l:1:f:8:cf:2\ncell:H111:l:1:f:8:cf:2\ncell:I111:l:1:f:8:cf:2\ncell:J111:l:1:f:8:cf:2\ncell:K111:l:1:f:8:cf:2\ncell:L111:l:1:f:8:cf:2\ncell:M111:l:1:f:8:cf:2\ncell:N111:l:1:f:8:cf:2\ncell:O111:l:1:f:8:cf:2\ncell:P111:l:1:f:8:cf:2\ncell:Q111:l:1:f:8:cf:2\ncell:R111:l:1:f:8:cf:2\ncell:S111:l:1:f:8:cf:2\ncell:T111:l:1:f:8:cf:2\ncell:U111:l:1:f:8:cf:2\ncell:V111:l:1:f:8:cf:2\ncell:W111:l:1:f:8:cf:2\ncell:A112:l:1:f:8:cf:2\ncell:B112:l:1:f:8:cf:2\ncell:C112:l:1:f:8:cf:2\ncell:D112:l:1:f:8:cf:2\ncell:E112:l:1:f:8:cf:2\ncell:F112:l:1:f:8:cf:2\ncell:G112:l:1:f:8:cf:2\ncell:H112:l:1:f:8:cf:2\ncell:I112:l:1:f:8:cf:2\ncell:J112:l:1:f:8:cf:2\ncell:K112:l:1:f:8:cf:2\ncell:L112:l:1:f:8:cf:2\ncell:M112:l:1:f:8:cf:2\ncell:N112:l:1:f:8:cf:2\ncell:O112:l:1:f:8:cf:2\ncell:P112:l:1:f:8:cf:2\ncell:Q112:l:1:f:8:cf:2\ncell:R112:l:1:f:8:cf:2\ncell:S112:l:1:f:8:cf:2\ncell:T112:l:1:f:8:cf:2\ncell:U112:l:1:f:8:cf:2\ncell:V112:l:1:f:8:cf:2\ncell:W112:l:1:f:8:cf:2\ncell:A113:l:1:f:8:cf:2\ncell:B113:l:1:f:8:cf:2\ncell:C113:l:1:f:8:cf:2\ncell:D113:l:1:f:8:cf:2\ncell:E113:l:1:f:8:cf:2\ncell:F113:l:1:f:8:cf:2\ncell:G113:l:1:f:8:cf:2\ncell:H113:l:1:f:8:cf:2\ncell:I113:l:1:f:8:cf:2\ncell:J113:l:1:f:8:cf:2\ncell:K113:l:1:f:8:cf:2\ncell:L113:l:1:f:8:cf:2\ncell:M113:l:1:f:8:cf:2\ncell:N113:l:1:f:8:cf:2\ncell:O113:l:1:f:8:cf:2\ncell:P113:l:1:f:8:cf:2\ncell:Q113:l:1:f:8:cf:2\ncell:R113:l:1:f:8:cf:2\ncell:S113:l:1:f:8:cf:2\ncell:T113:l:1:f:8:cf:2\ncell:U113:l:1:f:8:cf:2\ncell:V113:l:1:f:8:cf:2\ncell:W113:l:1:f:8:cf:2\ncell:A114:l:1:f:8:cf:2\ncell:B114:l:1:f:8:cf:2\ncell:C114:l:1:f:8:cf:2\ncell:D114:l:1:f:8:cf:2\ncell:E114:l:1:f:8:cf:2\ncell:F114:l:1:f:8:cf:2\ncell:G114:l:1:f:8:cf:2\ncell:H114:l:1:f:8:cf:2\ncell:I114:l:1:f:8:cf:2\ncell:J114:l:1:f:8:cf:2\ncell:K114:l:1:f:8:cf:2\ncell:L114:l:1:f:8:cf:2\ncell:M114:l:1:f:8:cf:2\ncell:N114:l:1:f:8:cf:2\ncell:O114:l:1:f:8:cf:2\ncell:P114:l:1:f:8:cf:2\ncell:Q114:l:1:f:8:cf:2\ncell:R114:l:1:f:8:cf:2\ncell:S114:l:1:f:8:cf:2\ncell:T114:l:1:f:8:cf:2\ncell:U114:l:1:f:8:cf:2\ncell:V114:l:1:f:8:cf:2\ncell:W114:l:1:f:8:cf:2\ncell:A115:l:1:f:8:cf:2\ncell:B115:l:1:f:8:cf:2\ncell:C115:l:1:f:8:cf:2\ncell:D115:l:1:f:8:cf:2\ncell:E115:l:1:f:8:cf:2\ncell:F115:l:1:f:8:cf:2\ncell:G115:l:1:f:8:cf:2\ncell:H115:l:1:f:8:cf:2\ncell:I115:l:1:f:8:cf:2\ncell:J115:l:1:f:8:cf:2\ncell:K115:l:1:f:8:cf:2\ncell:L115:l:1:f:8:cf:2\ncell:M115:l:1:f:8:cf:2\ncell:N115:l:1:f:8:cf:2\ncell:O115:l:1:f:8:cf:2\ncell:P115:l:1:f:8:cf:2\ncell:Q115:l:1:f:8:cf:2\ncell:R115:l:1:f:8:cf:2\ncell:S115:l:1:f:8:cf:2\ncell:T115:l:1:f:8:cf:2\ncell:U115:l:1:f:8:cf:2\ncell:V115:l:1:f:8:cf:2\ncell:W115:l:1:f:8:cf:2\ncell:A116:l:1:f:8:cf:2\ncell:B116:l:1:f:8:cf:2\ncell:C116:l:1:f:8:cf:2\ncell:D116:l:1:f:8:cf:2\ncell:E116:l:1:f:8:cf:2\ncell:F116:l:1:f:8:cf:2\ncell:G116:l:1:f:8:cf:2\ncell:H116:l:1:f:8:cf:2\ncell:I116:l:1:f:8:cf:2\ncell:J116:l:1:f:8:cf:2\ncell:K116:l:1:f:8:cf:2\ncell:L116:l:1:f:8:cf:2\ncell:M116:l:1:f:8:cf:2\ncell:N116:l:1:f:8:cf:2\ncell:O116:l:1:f:8:cf:2\ncell:P116:l:1:f:8:cf:2\ncell:Q116:l:1:f:8:cf:2\ncell:R116:l:1:f:8:cf:2\ncell:S116:l:1:f:8:cf:2\ncell:T116:l:1:f:8:cf:2\ncell:U116:l:1:f:8:cf:2\ncell:V116:l:1:f:8:cf:2\ncell:W116:l:1:f:8:cf:2\ncell:A117:l:1:f:8:cf:2\ncell:B117:l:1:f:8:cf:2\ncell:C117:l:1:f:8:cf:2\ncell:D117:l:1:f:8:cf:2\ncell:E117:l:1:f:8:cf:2\ncell:F117:l:1:f:8:cf:2\ncell:G117:l:1:f:8:cf:2\ncell:H117:l:1:f:8:cf:2\ncell:I117:l:1:f:8:cf:2\ncell:J117:l:1:f:8:cf:2\ncell:K117:l:1:f:8:cf:2\ncell:L117:l:1:f:8:cf:2\ncell:M117:l:1:f:8:cf:2\ncell:N117:l:1:f:8:cf:2\ncell:O117:l:1:f:8:cf:2\ncell:P117:l:1:f:8:cf:2\ncell:Q117:l:1:f:8:cf:2\ncell:R117:l:1:f:8:cf:2\ncell:S117:l:1:f:8:cf:2\ncell:T117:l:1:f:8:cf:2\ncell:U117:l:1:f:8:cf:2\ncell:V117:l:1:f:8:cf:2\ncell:W117:l:1:f:8:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nsheet:c:27:r:117:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 12pt arial,helvetica,sans-serif\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 9pt Arial\nfont:6:normal normal * Arial\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 7pt Arial\nfont:9:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nlayout:5:padding:* 8px * *;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:#,##0.00;\\b-#,##0.00;\\b-\nvalueformat:3:hidden\nname:COMPARISON::S43\\cU57\nname:TRACKING::AC43\\cAE57\n', - }, - name: "sheet11", - hidden: "0", - }, - sheet7: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:f:3:ntvf:3\ncell:B4:t:Comparison:l:1:f:6:c:1:bg:4:cf:2:colspan:3\ncell:B6:t:How does your spending compare to the guidelines ?:f:5:cf:2:colspan:6\ncell:C9:t:Expense Category:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:D9:t:Guideline:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:E9:t:Recommended Monthly Value:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:F9:t:Actual Monthly Value:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:B10:b::1::\ncell:C10:t:Housing:b::1::1:l:4:f:2\ncell:D10:v:0.35:b::1::1:l:5:f:2:ntvf:2\ncell:E10:vtf:n:1578.85:D10*INCOME!D23:b::1::1:l:5:f:2:ntvf:1\ncell:F10:vtf:n:1380:EXPENSE!E7:b::1::1:l:5:f:2:ntvf:1\ncell:G10:b::::1\ncell:B11:b::1::\ncell:C11:t:Transportation:b::1::1:l:4:f:2:bg:3\ncell:D11:vtc:n%:0.2:20%:b::1::1:l:5:f:2:bg:3:ntvf:2\ncell:E11:vtf:n:902.2:D11*INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:1\ncell:F11:vtf:n:640:sheet9!E17:b::1::1:l:5:f:2:bg:3:ntvf:1\ncell:G11:b::::1\ncell:B12:b::1::\ncell:C12:t:Debt:b::1::1:l:4:f:2\ncell:D12:v:0.05:b::1::1:l:5:f:2:ntvf:2\ncell:E12:vtf:n:225.55:D12*INCOME!D23:b::1::1:l:5:f:2:ntvf:1\ncell:F12:vtf:n:0:sheet11!E22:b::1::1:l:5:f:2:ntvf:1\ncell:G12:b::::1\ncell:B13:b::1::\ncell:C13:t:Savings:b::1:1:1:l:4:f:2:bg:3\ncell:D13:vtc:n:0.2:0.20:b::1:1:1:l:5:f:2:bg:3:ntvf:2\ncell:E13:vtf:n:902.2:D13*INCOME!D23:b::1:1:1:l:5:f:2:bg:3:ntvf:1\ncell:F13:vtf:n:-342:INCOME!D23-sheet11!E30:b::1:1:1:l:5:f:2:bg:3:ntvf:1\ncell:G13:b::::1\ncell:C14:b:1:::\ncell:D14:b:1:::\ncell:E14:b:1:::\ncell:F14:b:1:::\ncell:B17:t:How does your spending compare to the average consumer?:f:4:cf:2:colspan:6\ncell:B19:bg:4\ncell:C19:t:Expense Category:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:D19:t:Average Consumer Spending (as percentage of income):b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1:colspan:2\ncell:E19:b:2:2:2:2\ncell:F19:t:Your Spending (as percentage of income):b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1:colspan:2\ncell:B20:b::1:::bg:4\ncell:C20:t:Housing:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D20:vtc:n%:0.28:28%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E20:b::1::1\ncell:F20:vtf:n:0.3059188649966748:EXPENSE!E7/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B21:b::1:::bg:4\ncell:C21:t:Food:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D21:vtc:n%:0.11:11%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E21:b::1::1\ncell:F21:vtf:n:0.04633119042340944:sheet11!E4/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B22:b::1:::bg:4\ncell:C22:t:Transportation:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D22:vtc:n%:0.13:13%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E22:b::1::1\ncell:F22:vtf:n:0.14187541565063178:sheet9!E17/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B23:b::1:::bg:4\ncell:C23:t:Clothes & Personal Services:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D23:vtc:n%:0.03:3%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E23:b::1::1\ncell:F23:vtf:n:0.042340944358235426:sheet9!E12/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B24:b::1:::bg:4\ncell:C24:t:Healthcare:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D24:vtc:n%:0.05:5%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E24:b::1::1\ncell:F24:vtf:n:0.0583019286189315:sheet9!E26/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B25:b::1:::bg:4\ncell:C25:t:Entertainment:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D25:vtc:n%:0.04:4%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E25:b::1::1\ncell:F25:vtf:n:0.04633119042340944:sheet10!E4/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B26:b::1:::bg:4\ncell:C26:t:Education:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D26:vtc:n%:0.02:2%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E26:b::1::1\ncell:F26:vtf:n:0.021724673021502994:sheet10!E13/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B27:b::1:::bg:4\ncell:C27:t:Contributions:b::1:1:1:l:2:f:7:bg:3:cf:2\ncell:D27:vtc:n%:0.03:3%:b::1:1:1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E27:b::1:1:1\ncell:F27:vtf:n:0.0492130348038129:sheet10!E18/INCOME!D23:b::1:1:1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:C28:b:1:::\ncell:D28:b:1:::\ncell:E28:b:1:::\ncell:F28:b:1:::\ncell:G28:b:1:::\ncol:A:w:20\ncol:B:w:21\ncol:C:w:122\ncol:D:w:106\ncol:E:w:123\ncol:F:w:100\ncol:G:w:25\ncol:H:w:80\nsheet:c:8:r:28:needsrecalc:yes:font:3\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* * Arial\nfont:2:* * arial,helvetica,sans-serif\nfont:3:* 12pt *\nfont:4:normal bold * arial,helvetica,sans-serif\nfont:5:normal bold 12pt arial,helvetica,sans-serif\nfont:6:normal bold 20pt Arial\nfont:7:normal normal * Arial\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:6px * 6px *;vertical-align:*;\nlayout:3:padding:6px * 6px *;vertical-align:middle;\nlayout:4:padding:6px 4px 6px 12px;vertical-align:*;\nlayout:5:padding:6px 8px 6px *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:#,##0%\nvalueformat:3:hidden\n", - }, - name: "compare", - hidden: "0", - }, - sheet8: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B3:t:Goals:l:2:f:4:c:1:bg:4:cf:2:colspan:3\ncell:G3:t:Date:l:1:f:5:cf:1\ncell:H3:vtf:ndt:41131.96186930555:NOW():l:1:f:5:bg:3:cf:3:ntvf:3\ncell:C5:f:3:colspan:4\ncell:B6:b:2:2:2:2:f:1:c:4:bg:2\ncell:C6:t:Goal:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1:colspan:3\ncell:D6:b:2:2:2:2:f:1:c:4:bg:2\ncell:E6:t:Goal:b:2:2:2:2:f:1:c:4:bg:2\ncell:F6:t:Amount:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:G6:t:Term (Months):b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:H6:t:Monthly:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:I6:t:Weekly:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:J6:t:How to achieve:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1:colspan:2\ncell:A7:b::1::\ncell:B7:vtc:n:1:1.:b::1:::l:2:cf:1:rowspan:4\ncell:C7:t:Pay off credit card debt:b::1:::l:4:f:1:cf:2:colspan:3:rowspan:4\ncell:F7:v:1000:b::1::1:f:1:ntvf:1\ncell:G7:v:12:b::1::1:f:1:ntvf:1\ncell:H7:vtf:n:83.33333333333333:IF(G7=0,"",F7/G7):b::1::1:f:1:ntvf:1\ncell:I7:vtf:n:19.17808219178082:IF(G7>0,F7*7*12/(G7*365),""):b::1::1:f:1:ntvf:1\ncell:J7:t:cutback on eating out:b::1:::f:1:colspan:2\ncell:L7:b::::1\ncell:A8:b::1::\ncell:B8:b::1::\ncell:C8:b::1::1:f:1:colspan:3\ncell:F8:b::1::1\ncell:G8:b::1::1\ncell:H8:b::1::1\ncell:I8:b::1::1\ncell:J8:b::1::1:f:1:colspan:2\ncell:L8:b::::1\ncell:A9:b::1::\ncell:B9:b::1::\ncell:C9:b::1::1:f:1:colspan:3\ncell:F9:b::1::1\ncell:G9:b::1::1\ncell:H9:b::1::1\ncell:I9:b::1::1\ncell:J9:b::1::1:f:1:colspan:2\ncell:L9:b::::1\ncell:A10:b::1::\ncell:B10:b::1::\ncell:C10:f:1:colspan:3\ncell:F10:b::1::1\ncell:G10:b::1::1\ncell:H10:b::1::1\ncell:I10:b::1::1\ncell:J10:b::1:1:1:f:1:colspan:2\ncell:L10:b::::1\ncell:A11:b::1::\ncell:B11:v:2:b:1:1:::l:2:cf:1:rowspan:4\ncell:C11:t:Save for a down:b:1:1:::l:4:f:1:colspan:3:rowspan:4\ncell:D11:b:1:::\ncell:E11:b:1:::\ncell:F11:v:20000:b:1:1::1:f:1:ntvf:1\ncell:G11:v:36:b:1:1::1:f:1:ntvf:1\ncell:H11:vtf:n:555.5555555555555:IF(G11>0,F11/G11,""):b:1:1::1:f:1:ntvf:1\ncell:I11:vtf:n:127.85388127853881:IF(G11>0,F11*7*12/(G11*365),""):b:1:1::1:f:1:ntvf:1\ncell:J11:b:1:1:::f:1:colspan:2\ncell:L11:b::::1\ncell:A12:b::1::\ncell:B12:b::1::\ncell:C12:t:payment:b::1::1:l:4:f:1:colspan:3\ncell:F12:b::1::1\ncell:G12:b::1::1\ncell:H12:b::1::1\ncell:I12:b::1::1\ncell:J12:b::1::1:f:1:colspan:2\ncell:L12:b::::1\ncell:A13:b::1::\ncell:B13:b::1::\ncell:C13:b::1::1:l:4:f:1:colspan:3\ncell:F13:b::1::1\ncell:G13:b::1::1\ncell:H13:b::1::1\ncell:I13:b::1::1\ncell:J13:b::1::1:f:1:colspan:2\ncell:L13:b::::1\ncell:A14:b::1::\ncell:B14:b::1::\ncell:C14:l:4:f:1:colspan:3\ncell:F14:b::1::1\ncell:G14:b::1::1\ncell:H14:b::1::1\ncell:I14:b::1::1\ncell:J14:b::1:1:1:f:1:colspan:2\ncell:L14:b::::1\ncell:A15:b::1::\ncell:B15:v:3:b:1:1:::l:2:cf:1:rowspan:4\ncell:C15:t:Date:b:1:1:::l:4:f:1:colspan:3:rowspan:4\ncell:D15:b:1:::\ncell:E15:b:1:::\ncell:F15:b:1:1::1:f:1:ntvf:1\ncell:G15:b:1:1::1:f:1:ntvf:1\ncell:H15:vtf:t::IF(G15>0,F15/G15,""):b:1:1::1:f:1:ntvf:1\ncell:I15:vtf:t::IF(G15>0,F15*7*12/(G15*365),""):b:1:1::1:f:1:ntvf:1\ncell:J15:b:1:1:::f:1:colspan:2\ncell:L15:b::::1\ncell:A16:b::1::\ncell:B16:b::1::\ncell:C16:b::1::1:l:4:f:1:colspan:3\ncell:F16:b::1::1\ncell:G16:b::1::1\ncell:H16:b::1::1\ncell:I16:b::1::1\ncell:J16:b::1::1:f:1:colspan:2\ncell:L16:b::::1\ncell:A17:b::1::\ncell:B17:b::1::\ncell:C17:b::1::1:l:4:f:1:colspan:3\ncell:F17:b::1::1\ncell:G17:b::1::1\ncell:H17:b::1::1\ncell:I17:b::1::1\ncell:J17:b::1::1:f:1:colspan:2\ncell:L17:b::::1\ncell:A18:b::1::\ncell:B18:b::1::\ncell:C18:l:4:f:1:colspan:3\ncell:F18:b::1::1\ncell:G18:b::1::1\ncell:H18:b::1::1\ncell:I18:b::1::1\ncell:J18:b::1:1:1:f:1:colspan:2\ncell:L18:b::::1\ncell:A19:b::1::\ncell:B19:v:4:b:1:1:::l:2:cf:1:rowspan:4\ncell:C19:b:1:1:::l:4:colspan:3:rowspan:4\ncell:D19:b:1:::\ncell:E19:b:1:::\ncell:F19:b:1:1::1:f:1:ntvf:1\ncell:G19:b:1:1::1:f:1:ntvf:1\ncell:H19:vtf:t::IF(G19>0,F19/G19,""):b:1:1::1:f:1:ntvf:1\ncell:I19:vtf:t::IF(G19>0,F19*7*12/(G19*365),""):b:1:1::1:f:1:ntvf:1\ncell:J19:b:1:1:::f:1:colspan:2\ncell:L19:b::::1\ncell:A20:b::1::\ncell:B20:b::1::\ncell:C20:b::1::1:l:3:colspan:3\ncell:F20:b::1::1\ncell:G20:b::1::1\ncell:H20:b::1::1\ncell:I20:b::1::1\ncell:J20:b::1::1:f:1:colspan:2\ncell:L20:b::::1\ncell:A21:b::1::\ncell:B21:b::1::\ncell:C21:b::1::1:l:3:colspan:3\ncell:F21:b::1::1\ncell:G21:b::1::1\ncell:H21:b::1::1\ncell:I21:b::1::1\ncell:J21:b::1::1:f:1:colspan:2\ncell:L21:b::::1\ncell:A22:b::1::\ncell:B22:b::1::\ncell:C22:l:3:f:1:colspan:3\ncell:F22:b::1::1\ncell:G22:b::1::1\ncell:H22:b::1::1\ncell:I22:b::1::1\ncell:J22:b::1:1:1:f:1:colspan:2\ncell:L22:b::::1\ncell:A23:b::1::\ncell:B23:v:5:b:1:1:::l:2:cf:1:rowspan:4\ncell:C23:b:1:1:1:1:l:4:colspan:3:rowspan:4\ncell:D23:b:1:::\ncell:E23:b:1:::\ncell:F23:b:1:1::1:f:1:ntvf:1\ncell:G23:b:1:1::1:f:1:ntvf:1\ncell:H23:vtf:t::IF(G23>0,F23/G23,""):b:1:1::1:f:1:ntvf:1\ncell:I23:vtf:t::IF(G23>0,F23*7*12/(G23*365),""):b:1:1::1:f:1:ntvf:1\ncell:J23:b:1:1:::f:1:colspan:2\ncell:L23:b::::1\ncell:A24:b::1::\ncell:B24:b::1::\ncell:C24:b::1::1:l:4:colspan:3\ncell:F24:b::1::1\ncell:G24:b::1::1\ncell:H24:b::1::1\ncell:I24:b::1::1\ncell:J24:b::1::1:f:1:colspan:2\ncell:L24:b::::1\ncell:A25:b::1::\ncell:B25:b::1::\ncell:C25:b::1::1:l:4:colspan:3\ncell:F25:b::1::1\ncell:G25:b::1::1\ncell:H25:b::1::1\ncell:I25:b::1::1\ncell:J25:b::1::1:f:1:colspan:2\ncell:L25:b::::1\ncell:A26:b::1::\ncell:B26:b::1::\ncell:C26:l:4:f:1:colspan:3\ncell:F26:b::1:1:1\ncell:G26:b::1:1:1\ncell:H26:b::1:1:1\ncell:I26:b::1:1:1\ncell:J26:b::1:1:1:f:1:colspan:2\ncell:L26:b::::1\ncell:A27:b::1::\ncell:B27:v:6:b:1:1::1:l:2:cf:1:rowspan:4\ncell:C27:b:1:1:1:1:l:4:f:1:colspan:3:rowspan:4\ncell:D27:b:1:1::1\ncell:E27:b:1:1::1\ncell:F27:b:1:1::1\ncell:G27:b:1:1::1\ncell:H27:vtf:t::IF(G27>0,F27/G27,""):b:1:1::1\ncell:I27:vtf:t::IF(G27>0,F27*7*12/(G27*365),""):b:1:1::1\ncell:J27:b::1::1:colspan:2\ncell:K27:b:1:::\ncell:A28:b::1::\ncell:B28:b::1::1\ncell:C28:b::1::1:l:4:f:1:colspan:3\ncell:D28:b::1::1\ncell:E28:b::1::1\ncell:F28:b::1::1\ncell:G28:b::1::1\ncell:H28:b::1::1\ncell:I28:b::1::1\ncell:J28:b::1::1:colspan:2\ncell:A29:b::1::\ncell:B29:b::1::1\ncell:C29:b::1::1:l:4:f:1:colspan:3\ncell:D29:b::1::1\ncell:E29:b::1::1\ncell:F29:b::1::1\ncell:G29:b::1::1\ncell:H29:b::1::1\ncell:I29:b::1::1\ncell:J29:b::1::1:colspan:2\ncell:A30:b::1::\ncell:B30:b::1:1:1\ncell:C30:b::1:1:1:l:4:f:1:colspan:3\ncell:D30:b::1:1:1\ncell:E30:b::1:1:1\ncell:F30:b::1:1:1\ncell:G30:b::1:1:1\ncell:H30:b::1:1:1\ncell:I30:b::1:1:1\ncell:J30:b::1:1:1:colspan:2\ncell:A31:b::1::\ncell:B31:v:7:b:1:1::1:l:2:cf:1:rowspan:4\ncell:C31:b:1:1:1:1:l:4:colspan:3:rowspan:4\ncell:D31:b:1:1:1:1\ncell:E31:b:1:1:1:1\ncell:F31:b:1:1::1\ncell:G31:b:1:1::1\ncell:H31:vtf:t::IF(G31>0,F31/G31,""):b:1:1::1\ncell:I31:vtf:t::IF(G31>0,F31*7*12/(G31*365),""):b:1:1::1\ncell:J31:b:1:1::1:colspan:2\ncell:K31:b:1:1:1:1\ncell:L31:b::::1\ncell:A32:b::1::\ncell:B32:b::1::1\ncell:C32:b:1:1:1:1\ncell:D32:b:1:1:1:1\ncell:E32:b:1:1:1:1\ncell:F32:b::1::1\ncell:G32:b::1::1\ncell:H32:b::1::1\ncell:I32:b::1::1\ncell:J32:b::1::1:colspan:2\ncell:K32:b:1:1:1:1\ncell:L32:b::::1\ncell:A33:b::1::\ncell:B33:b::1::1\ncell:C33:b:1:1:1:1\ncell:D33:b:1:1:1:1\ncell:E33:b:1:1:1:1\ncell:F33:b::1::1\ncell:G33:b::1::1\ncell:H33:b::1::1\ncell:I33:b::1::1\ncell:J33:b::1::1:colspan:2\ncell:K33:b:1:1:1:1\ncell:L33:b::::1\ncell:A34:b::1::\ncell:B34:b::1:1:1\ncell:C34:b:1:1:1:1\ncell:D34:b:1:1:1:1\ncell:E34:b:1:1:1:1\ncell:F34:b::1:1:1\ncell:G34:b::1:1:1\ncell:H34:b::1:1:1\ncell:I34:b::1:1:1\ncell:J34:b::1:1:1:colspan:2\ncell:K34:b:1:1:1:1\ncell:L34:b::::1\ncell:B35:b:1:::\ncell:C35:b:1:::\ncell:D35:b:1:::\ncell:E35:b:1:::\ncell:F35:b:1:::\ncell:G35:b:1:::\ncell:H35:b:1:::\ncell:I35:b:1:::\ncell:J35:b:1:::\ncell:K35:b:1:::\ncol:A:w:31\ncol:B:w:25\ncol:C:w:80\ncol:D:w:44\ncol:E:w:53\ncol:F:w:70\ncol:G:w:68\ncol:H:w:65\ncol:I:w:65\ncol:J:w:80\ncol:K:w:96\nsheet:c:12:r:35:needsrecalc:yes:font:2\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* * arial,helvetica,sans-serif\nfont:2:* 12pt *\nfont:3:normal bold * arial,helvetica,sans-serif\nfont:4:normal bold 20pt Arial\nfont:5:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:4:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\n', - }, - name: "goals", - hidden: "0", - }, - sheet9: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B3:t:Check Book Register:l:5:f:3:c:4:bg:2:cf:1:colspan:7\ncell:G3:t:Date:l:1:f:5:cf:1\ncell:H3:vtf:ndt:41131.961799432866:NOW():l:1:f:5:bg:3:cf:3:ntvf:3\ncell:A4:f:1\ncell:B4:l:2:f:4:c:1:bg:4:cf:2\ncell:C4:f:4\ncell:D4:f:4\ncell:E4:f:4\ncell:F4:f:4\ncell:G4:l:1:f:4:cf:1\ncell:H4:l:1:f:4:cf:3:ntvf:3\ncell:I4:f:1\ncell:B5:f:4\ncell:C5:f:4\ncell:D5:f:4\ncell:E5:f:4\ncell:F5:f:4\ncell:G5:f:4\ncell:H5:f:4\ncell:B6:t:Date:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:C6:t:Num:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:D6:t:Description:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:E6:t:R:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:F6:t:Withdrawal, Payment (-):b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:G6:t:Deposit, Credit (+):b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:H6:t:Balance:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:A7:b::1::\ncell:B7:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C7:b::1::1:l:4:f:1\ncell:D7:b::1::1:l:3:f:6\ncell:E7:b::1::1:l:3:f:6\ncell:F7:b::1::1:l:3:f:1:ntvf:1\ncell:G7:b::1::1:l:3:f:1:ntvf:1\ncell:H7:vtf:t: :IF(AND(ISBLANK(G7), ISBLANK(F7)), " ", G7-F7):b::1::1:l:3:f:1:ntvf:1\ncell:I7:b::::1\ncell:A8:b::1::\ncell:B8:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C8:b::1::1:l:4:f:1:bg:3\ncell:D8:b::1::1:l:3:f:6:bg:3\ncell:E8:b::1::1:l:3:f:6:bg:3\ncell:F8:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G8:b::1::1:l:3:f:1:bg:3\ncell:H8:vtf:t: :IF(AND(ISBLANK(G8), ISBLANK(F8)), " ", H7+G8-F8):b::1::1:l:3:f:1:bg:3\ncell:I8:b::::1\ncell:A9:b::1::\ncell:B9:b::1::1:l:4:f:1:ntvf:3\ncell:C9:b::1::1:l:4:f:1\ncell:D9:b::1::1:l:3:f:6\ncell:E9:b::1::1:l:3:f:6\ncell:F9:b::1::1:l:3:f:1:ntvf:1\ncell:G9:b::1::1:l:3:f:1\ncell:H9:vtf:t: :IF(AND(ISBLANK(G9), ISBLANK(F9)), " ", H8+G9-F9):b::1::1:l:3:f:1\ncell:I9:b::::1\ncell:A10:b::1::\ncell:B10:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C10:b::1::1:l:4:f:1:bg:3\ncell:D10:b::1::1:l:3:f:6:bg:3\ncell:E10:b::1::1:l:3:f:6:bg:3\ncell:F10:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G10:b::1::1:l:3:f:1:bg:3\ncell:H10:vtf:t: :IF(AND(ISBLANK(G10), ISBLANK(F10)), " ", H9+G10-F10):b::1::1:l:3:f:1:bg:3\ncell:I10:b::::1\ncell:A11:b::1::\ncell:B11:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C11:b::1::1:l:4:f:1\ncell:D11:b::1::1:l:3:f:6\ncell:E11:b::1::1:l:3:f:6\ncell:F11:b::1::1:l:3:f:1:ntvf:1\ncell:G11:b::1::1:l:3:f:1:ntvf:1\ncell:H11:vtf:t: :IF(AND(ISBLANK(G11), ISBLANK(F11)), " ", H10+G11-F11):b::1::1:l:3:f:1:ntvf:1\ncell:I11:b::::1\ncell:A12:b::1::\ncell:B12:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C12:b::1::1:l:4:f:1:bg:3\ncell:D12:b::1::1:l:3:f:6:bg:3\ncell:E12:b::1::1:l:3:f:6:bg:3\ncell:F12:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G12:b::1::1:l:3:f:1:bg:3\ncell:H12:vtf:t: :IF(AND(ISBLANK(G12), ISBLANK(F12)), " ", H11+G12-F12):b::1::1:l:3:f:1:bg:3\ncell:I12:b::::1\ncell:A13:b::1::\ncell:B13:b::1::1:l:4:f:1:ntvf:3\ncell:C13:b::1::1:l:4:f:1\ncell:D13:b::1::1:l:3:f:6\ncell:E13:b::1::1:l:3:f:6\ncell:F13:b::1::1:l:3:f:1:ntvf:1\ncell:G13:b::1::1:l:3:f:1\ncell:H13:vtf:t: :IF(AND(ISBLANK(G13), ISBLANK(F13)), " ", H12+G13-F13):b::1::1:l:3:f:1\ncell:I13:b::::1\ncell:A14:b::1::\ncell:B14:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C14:b::1::1:l:4:f:1:bg:3\ncell:D14:b::1::1:l:3:f:6:bg:3\ncell:E14:b::1::1:l:3:f:6:bg:3\ncell:F14:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G14:b::1::1:l:3:f:1:bg:3\ncell:H14:vtf:t: :IF(AND(ISBLANK(G14), ISBLANK(F14)), " ", H13+G14-F14):b::1::1:l:3:f:1:bg:3\ncell:I14:b::::1\ncell:A15:b::1::\ncell:B15:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C15:b::1::1:l:4:f:1\ncell:D15:b::1::1:l:3:f:6\ncell:E15:b::1::1:l:3:f:6\ncell:F15:b::1::1:l:3:f:1:ntvf:1\ncell:G15:b::1::1:l:3:f:1:ntvf:1\ncell:H15:vtf:t: :IF(AND(ISBLANK(G15), ISBLANK(F15)), " ", H14+G15-F15):b::1::1:l:3:f:1:ntvf:1\ncell:I15:b::::1\ncell:A16:b::1::\ncell:B16:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C16:b::1::1:l:4:f:1:bg:3\ncell:D16:b::1::1:l:3:f:6:bg:3\ncell:E16:b::1::1:l:3:f:6:bg:3\ncell:F16:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G16:b::1::1:l:3:f:1:bg:3\ncell:H16:vtf:t: :IF(AND(ISBLANK(G16), ISBLANK(F16)), " ", H15+G16-F16):b::1::1:l:3:f:1:bg:3\ncell:I16:b::::1\ncell:A17:b::1::\ncell:B17:b::1::1:l:4:f:1:ntvf:3\ncell:C17:b::1::1:l:4:f:1\ncell:D17:b::1::1:l:3:f:6\ncell:E17:b::1::1:l:3:f:6\ncell:F17:b::1::1:l:3:f:1:ntvf:1\ncell:G17:b::1::1:l:3:f:1\ncell:H17:vtf:t: :IF(AND(ISBLANK(G17), ISBLANK(F17)), " ", H16+G17-F17):b::1::1:l:3:f:1\ncell:I17:b::::1\ncell:A18:b::1::\ncell:B18:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C18:b::1::1:l:4:f:1:bg:3\ncell:D18:b::1::1:l:3:f:6:bg:3\ncell:E18:b::1::1:l:3:f:6:bg:3\ncell:F18:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G18:b::1::1:l:3:f:1:bg:3\ncell:H18:vtf:t: :IF(AND(ISBLANK(G18), ISBLANK(F18)), " ", H17+G18-F18):b::1::1:l:3:f:1:bg:3\ncell:I18:b::::1\ncell:A19:b::1::\ncell:B19:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C19:b::1::1:l:4:f:1\ncell:D19:b::1::1:l:3:f:6\ncell:E19:b::1::1:l:3:f:6\ncell:F19:b::1::1:l:3:f:1:ntvf:1\ncell:G19:b::1::1:l:3:f:1:ntvf:1\ncell:H19:vtf:t: :IF(AND(ISBLANK(G19), ISBLANK(F19)), " ", H18+G19-F19):b::1::1:l:3:f:1:ntvf:1\ncell:I19:b::::1\ncell:A20:b::1::\ncell:B20:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C20:b::1::1:l:4:f:2:bg:3\ncell:D20:b::1::1:l:3:f:6:bg:3\ncell:E20:b::1::1:l:3:f:6:bg:3\ncell:F20:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G20:b::1::1:l:3:f:1:bg:3\ncell:H20:vtf:t: :IF(AND(ISBLANK(G20), ISBLANK(F20)), " ", H19+G20-F20):b::1::1:l:3:f:1:bg:3\ncell:I20:b::::1\ncell:A21:b::1::\ncell:B21:b::1::1:l:4:f:1:ntvf:3\ncell:C21:b::1::1:l:4:f:1\ncell:D21:b::1::1:l:3:f:6\ncell:E21:b::1::1:l:3:f:6\ncell:F21:b::1::1:l:3:f:1:ntvf:1\ncell:G21:b::1::1:l:3:f:1\ncell:H21:vtf:t: :IF(AND(ISBLANK(G21), ISBLANK(F21)), " ", H20+G21-F21):b::1::1:l:3:f:1\ncell:I21:b::::1\ncell:A22:b::1::\ncell:B22:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C22:b::1::1:l:4:f:1:bg:3\ncell:D22:b::1::1:l:3:f:6:bg:3\ncell:E22:b::1::1:l:3:f:6:bg:3\ncell:F22:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G22:b::1::1:l:3:f:1:bg:3\ncell:H22:vtf:t: :IF(AND(ISBLANK(G22), ISBLANK(F22)), " ", H21+G22-F22):b::1::1:l:3:f:1:bg:3\ncell:I22:b::::1\ncell:A23:b::1::\ncell:B23:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C23:b::1::1:l:4:f:1\ncell:D23:b::1::1:l:3:f:6\ncell:E23:b::1::1:l:3:f:6\ncell:F23:b::1::1:l:3:f:1:ntvf:1\ncell:G23:b::1::1:l:3:f:1:ntvf:1\ncell:H23:vtf:t: :IF(AND(ISBLANK(G23), ISBLANK(F23)), " ", H22+G23-F23):b::1::1:l:3:f:1:ntvf:1\ncell:I23:b::::1\ncell:A24:b::1::\ncell:B24:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C24:b::1::1:l:4:f:1:bg:3\ncell:D24:b::1::1:l:3:f:6:bg:3\ncell:E24:b::1::1:l:3:f:6:bg:3\ncell:F24:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G24:b::1::1:l:3:f:1:bg:3\ncell:H24:vtf:t: :IF(AND(ISBLANK(G24), ISBLANK(F24)), " ", H23+G24-F24):b::1::1:l:3:f:1:bg:3\ncell:I24:b::::1\ncell:A25:b::1::\ncell:B25:b::1::1:l:4:f:1:ntvf:3\ncell:C25:b::1::1:l:4:f:1\ncell:D25:b::1::1:l:3:f:6\ncell:E25:b::1::1:l:3:f:6\ncell:F25:b::1::1:l:3:f:1:ntvf:1\ncell:G25:b::1::1:l:3:f:1\ncell:H25:vtf:t: :IF(AND(ISBLANK(G25), ISBLANK(F25)), " ", H24+G25-F25):b::1::1:l:3:f:1\ncell:I25:b::::1\ncell:A26:b::1::\ncell:B26:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C26:b::1::1:l:4:f:1:bg:3\ncell:D26:b::1::1:l:3:f:6:bg:3\ncell:E26:b::1::1:l:3:f:6:bg:3\ncell:F26:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G26:b::1::1:l:3:f:1:bg:3\ncell:H26:vtf:t: :IF(AND(ISBLANK(G26), ISBLANK(F26)), " ", H25+G26-F26):b::1::1:l:3:f:1:bg:3\ncell:I26:b::::1\ncell:A27:b::1::\ncell:B27:b::1::1:l:4:f:1:ntvf:3\ncell:C27:b::1::1:l:4:f:1\ncell:D27:b::1::1:l:3:f:6\ncell:E27:b::1::1:l:3:f:6\ncell:F27:b::1::1:l:3:f:1:ntvf:1\ncell:G27:b::1::1:l:3:f:1\ncell:H27:vtf:t: :IF(AND(ISBLANK(G27), ISBLANK(F27)), " ", H26+G27-F27):b::1::1:l:3:f:1\ncell:A28:b::1::\ncell:B28:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C28:b::1::1:l:4:f:1:bg:3\ncell:D28:b::1::1:l:3:f:6:bg:3\ncell:E28:b::1::1:l:3:f:6:bg:3\ncell:F28:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G28:b::1::1:l:3:f:1:bg:3\ncell:H28:vtf:t: :IF(AND(ISBLANK(G28), ISBLANK(F28)), " ", H27+G28-F28):b::1::1:l:3:f:1:bg:3\ncell:A29:b::1::\ncell:B29:b::1::1:l:4:f:1:ntvf:3\ncell:C29:b::1::1:l:4:f:1\ncell:D29:b::1::1:l:4:f:6\ncell:E29:b::1::1:l:4:f:1\ncell:F29:b::1::1:l:3:f:1:ntvf:1\ncell:G29:b::1::1:l:4:f:1:ntvf:1\ncell:H29:vtf:t: :IF(AND(ISBLANK(G29), ISBLANK(F29)), " ", H28+G29-F29):b::1::1:l:3:f:1\ncell:A30:b::1::\ncell:B30:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C30:b::1::1:l:4:f:1:bg:3\ncell:D30:b::1::1:l:4:f:6:bg:3\ncell:E30:b::1::1:l:4:f:1:bg:3\ncell:F30:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G30:b::1::1:l:4:f:1:bg:3:ntvf:1\ncell:H30:vtf:t: :IF(AND(ISBLANK(G30), ISBLANK(F30)), " ", H29+G30-F30):b::1::1:l:3:f:1:bg:3\ncell:A31:b::1::\ncell:B31:b::1:1:1:l:4:f:1:ntvf:3\ncell:C31:b::1:1:1:l:4:f:1\ncell:D31:b::1:1:1:l:4:f:6\ncell:E31:b::1:1:1:l:4:f:1\ncell:F31:b::1:1:1:l:3:f:1:ntvf:1\ncell:G31:b::1:1:1:l:4:f:1:ntvf:1\ncell:H31:vtf:t: :IF(AND(ISBLANK(G31), ISBLANK(F31)), " ", H30+G31-F31):b::1:1:1:l:3:f:1\ncol:A:w:31\ncol:B:w:74\ncol:C:w:72\ncol:D:w:168\ncol:E:w:43\ncol:F:w:100\ncol:G:w:100\ncol:H:w:103\nsheet:c:9:r:31:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:* 12pt arial,helvetica,sans-serif\nfont:3:* 14pt arial,helvetica,sans-serif\nfont:4:* x-small arial,helvetica,sans-serif\nfont:5:normal normal 12pt Arial\nfont:6:normal normal 12pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:4:padding:4px 8px 4px 12px;vertical-align:*;\nlayout:5:padding:6px * 6px *;vertical-align:*;\nlayout:6:padding:6px * 6px *;vertical-align:bottom;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\n', - }, - name: "sheet6", - hidden: "0", - }, - sheet10: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:4\ncell:E3:t:Budget:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F3:v:18750:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:G3:v:13125:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:H3:v:2500:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:I3:vtf:n:34375:sum(F3\\cH3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:E4:t:% Spent:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F4:vtf:n:0.21333333333333335:IF(F3=0,"-",F31/F3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:G4:vtf:n:0.6857142857142857:IF(G3=0,"-",G31/G3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:H4:vtf:n:0.8:IF(H3=0,"-",H31/H3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:I4:vtf:n:0.43636363636363634:IF(I3=0,"-",I31/I3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:E5:t:Remaining:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F5:vtf:n:14750:F3-F31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:G5:vtf:n:4125:G3-G31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:H5:vtf:n:500:H3-H31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:I5:vtf:n:19375:I3-I31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:E6:vtc:::\ncell:F6:vtc:::\ncell:G6:vtc:::\ncell:H6:vtc:::\ncell:I6:vtc:::\ncell:C7:t:Date:l:2:f:3:c:4:bg:1:cf:1\ncell:D7:t:Payment Types:l:2:f:3:c:4:bg:1:cf:1\ncell:E7:t:Description:l:2:f:3:c:4:bg:1:cf:1\ncell:F7:t:Category 1:l:2:f:3:c:4:bg:1:cf:1\ncell:G7:t:Category 2:l:2:f:3:c:4:bg:1:cf:1\ncell:H7:t:Category 3:l:2:f:3:c:4:bg:1:cf:1\ncell:I7:t:Subtotal:l:2:f:3:c:4:bg:1:cf:1\ncell:B8:b::1::\ncell:C8:v:39814:b::1::1:l:1:f:2:ntvf:5\ncell:D8:t:CrCard:b::1::1:l:1:f:2\ncell:E8:t:Walmart:b::1::1:l:1:f:2\ncell:F8:v:4000:b::1::1:l:1:f:2:ntvf:1\ncell:G8:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H8:v:2000:b::1::1:l:1:f:2:ntvf:1\ncell:I8:vtf:n:6000:SUM(F8\\cH8):b::1::1:l:1:f:2:ntvf:2\ncell:B9:b::1::\ncell:C9:v:39823:b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D9:t:Db Card:b::1::1:l:1:f:2:bg:2\ncell:E9:t:ABC Services, Inc.:b::1::1:l:1:f:2:bg:2\ncell:F9:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G9:v:9000:b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H9:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I9:vtf:n:9000:SUM(F9\\cH9):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B10:b::1::\ncell:C10:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D10:vtc::::b::1::1:l:1:f:2\ncell:E10:vtc::::b::1::1:l:1:f:2\ncell:F10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I10:vtf:n:0:SUM(F10\\cH10):b::1::1:l:1:f:2:ntvf:2\ncell:B11:b::1::\ncell:C11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D11:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E11:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I11:vtf:n:0:SUM(F11\\cH11):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B12:b::1::\ncell:C12:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D12:vtc::::b::1::1:l:1:f:2\ncell:E12:vtc::::b::1::1:l:1:f:2\ncell:F12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I12:vtf:n:0:SUM(F12\\cH12):b::1::1:l:1:f:2:ntvf:2\ncell:B13:b::1::\ncell:C13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D13:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E13:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I13:vtf:n:0:SUM(F13\\cH13):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B14:b::1::\ncell:C14:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D14:vtc::::b::1::1:l:1:f:2\ncell:E14:vtc::::b::1::1:l:1:f:2\ncell:F14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I14:vtf:n:0:SUM(F14\\cH14):b::1::1:l:1:f:2:ntvf:2\ncell:B15:b::1::\ncell:C15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D15:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E15:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I15:vtf:n:0:SUM(F15\\cH15):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B16:b::1::\ncell:C16:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D16:vtc::::b::1::1:l:1:f:2\ncell:E16:vtc::::b::1::1:l:1:f:2\ncell:F16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I16:vtf:n:0:SUM(F16\\cH16):b::1::1:l:1:f:2:ntvf:2\ncell:B17:b::1::\ncell:C17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D17:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E17:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I17:vtf:n:0:SUM(F17\\cH17):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B18:b::1::\ncell:C18:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D18:vtc::::b::1::1:l:1:f:2\ncell:E18:vtc::::b::1::1:l:1:f:2\ncell:F18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I18:vtf:n:0:SUM(F18\\cH18):b::1::1:l:1:f:2:ntvf:2\ncell:B19:b::1::\ncell:C19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D19:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E19:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I19:vtf:n:0:SUM(F19\\cH19):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B20:b::1::\ncell:C20:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D20:vtc::::b::1::1:l:1:f:2\ncell:E20:vtc::::b::1::1:l:1:f:2\ncell:F20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I20:vtf:n:0:SUM(F20\\cH20):b::1::1:l:1:f:2:ntvf:2\ncell:B21:b::1::\ncell:C21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D21:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E21:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I21:vtf:n:0:SUM(F21\\cH21):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B22:b::1::\ncell:C22:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D22:vtc::::b::1::1:l:1:f:2\ncell:E22:vtc::::b::1::1:l:1:f:2\ncell:F22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I22:vtf:n:0:SUM(F22\\cH22):b::1::1:l:1:f:2:ntvf:2\ncell:B23:b::1::\ncell:C23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D23:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E23:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I23:vtf:n:0:SUM(F23\\cH23):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B24:b::1::\ncell:C24:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D24:vtc::::b::1::1:l:1:f:2\ncell:E24:vtc::::b::1::1:l:1:f:2\ncell:F24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I24:vtf:n:0:SUM(F24\\cH24):b::1::1:l:1:f:2:ntvf:2\ncell:B25:b::1::\ncell:C25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D25:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E25:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I25:vtf:n:0:SUM(F25\\cH25):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B26:b::1::\ncell:C26:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D26:vtc::::b::1::1:l:1:f:2\ncell:E26:vtc::::b::1::1:l:1:f:2\ncell:F26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I26:vtf:n:0:SUM(F26\\cH26):b::1::1:l:1:f:2:ntvf:2\ncell:B27:b::1::\ncell:C27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D27:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E27:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I27:vtf:n:0:SUM(F27\\cH27):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B28:b::1::\ncell:C28:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D28:vtc::::b::1::1:l:1:f:2\ncell:E28:vtc::::b::1::1:l:1:f:2\ncell:F28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I28:vtf:n:0:SUM(F28\\cH28):b::1::1:l:1:f:2:ntvf:2\ncell:B29:b::1::\ncell:C29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D29:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E29:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I29:vtf:n:0:SUM(F29\\cH29):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B30:b::1::\ncell:C30:vtc::::b::1:1:1:l:1:f:2:ntvf:5\ncell:D30:vtc::::b::1:1:1:l:1:f:2\ncell:E30:vtc::::b::1:1:1:l:1:f:2\ncell:F30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:G30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:H30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:I30:vtf:n:0:SUM(F30\\cH30):b::1:1:1:l:1:f:2:ntvf:2\ncell:E31:t:Expense Total:b:2:2:2:2:l:1:f:2:c:4:bg:1:cf:1\ncell:F31:vtf:n:4000:SUM(F8\\cF30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:G31:vtf:n:9000:SUM(G8\\cG30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:H31:vtf:n:2000:SUM(H8\\cH30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:I31:vtf:n:15000:SUM(F31\\cH31):b:2:2:2:2:l:1:f:2:c:3:bg:1:ntvf:2\ncol:A:w:10\ncol:B:w:10\ncol:C:w:70\ncol:D:w:71\ncol:E:w:147\ncol:F:w:82\ncol:G:w:81\ncol:H:w:82\ncol:I:w:100\ncol:J:w:80\ncol:K:w:96\nsheet:c:11:r:31:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(238, 238, 238)\ncolor:4:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal normal * arial,helvetica,sans-serif\nfont:3:normal normal 12pt arial,helvetica,sans-serif\nlayout:1:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00;\\b-#,##0.00;\\b-\nvalueformat:3:0.00%\nvalueformat:4:hidden\nvalueformat:5:m/d/yy\n', - }, - name: "sheet7", - hidden: "0", - }, - sheet11: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:ntvf:1\ncol:A:w:31\ncol:B:w:25\ncol:C:w:80\ncol:D:w:44\ncol:E:w:53\ncol:F:w:70\ncol:G:w:68\ncol:H:w:65\ncol:I:w:65\ncol:J:w:80\ncol:K:w:96\nsheet:c:11:r:1:needsrecalc:yes:font:1\nfont:1:* 12pt *\nvalueformat:1:hidden\n", - }, - name: "sheet8", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "income!D8": true, - "income!E5": true, - "income!D9": true, - "sheet11!D2": true, - "income!D10": true, - "income!D11": true, - "goals!H3": true, - "income!D12": true, - "sheet9!E18": true, - "income!D13": true, - "sheet9!D2": true, - "sheet10!D2": true, - "income!D14": true, - "income!D15": true, - "income!D16": true, - "income!D17": true, - "income!D18": true, - "income!D19": true, - "income!D20": true, - "income!D21": true, - "income!C8": true, - "income!C9": true, - "income!C10": true, - "income!C11": true, - "income!C12": true, - "income!C13": true, - "income!C14": true, - "income!C15": true, - "income!C16": true, - "income!C17": true, - "income!C18": true, - "income!C19": true, - "income!C20": true, - "income!C21": true, - "income!C22": true, - "income!C23": true, - "income!H18": true, - "income!H17": true, - "income!H16": true, - "income!H15": true, - "income!H14": true, - "income!H13": true, - "income!K18": true, - "income!H19": true, - "income!K17": true, - "income!K16": true, - "income!K15": true, - "income!K14": true, - "expense!B4": true, - "income!K13": true, - "expense!E4": true, - "expense!F4": true, - "expense!E6": true, - "expense!F6": true, - "expense!B7": true, - "expense!C8": true, - "expense!D9": true, - "expense!D10": true, - "expense!D11": true, - "expense!D12": true, - "expense!D13": true, - "expense!E8": true, - "expense!E9": true, - "expense!E10": true, - "expense!E11": true, - "expense!E12": true, - "expense!E13": true, - "expense!C14": true, - "expense!D20": true, - "expense!D19": true, - "expense!D18": true, - "expense!D17": true, - "expense!D16": true, - "expense!D15": true, - "expense!E20": true, - "expense!E19": true, - "expense!E18": true, - "expense!E17": true, - "expense!E16": true, - "expense!E15": true, - "expense!C21": true, - "expense!C24": true, - "expense!D24": true, - "expense!D23": true, - "expense!D25": true, - "expense!D26": true, - "expense!D27": true, - "expense!D28": true, - "expense!D29": true, - "expense!D30": true, - "expense!D31": true, - "expense!E25": true, - "expense!E26": true, - "expense!E27": true, - "expense!E28": true, - "expense!E29": true, - "expense!E30": true, - "expense!E31": true, - "sheet9!B12": true, - "sheet9!B17": true, - "sheet9!B26": true, - "sheet9!C5": true, - "sheet9!C9": true, - "sheet9!B4": true, - "sheet9!D6": true, - "sheet9!D7": true, - "sheet9!D8": true, - "sheet9!D11": true, - "sheet9!D10": true, - "sheet9!E6": true, - "sheet9!E7": true, - "sheet9!E8": true, - "sheet9!E11": true, - "sheet9!E10": true, - "sheet9!D13": true, - "sheet9!D14": true, - "sheet9!D15": true, - "sheet9!D16": true, - "sheet9!E13": true, - "sheet9!E14": true, - "sheet9!E15": true, - "sheet9!E16": true, - "sheet9!D18": true, - "sheet9!D19": true, - "sheet9!D20": true, - "sheet9!D21": true, - "sheet9!D22": true, - "sheet9!D23": true, - "sheet9!D24": true, - "sheet9!D25": true, - "sheet9!E19": true, - "sheet9!E20": true, - "sheet9!E21": true, - "sheet9!E22": true, - "sheet9!E23": true, - "sheet9!E24": true, - "sheet9!E25": true, - "sheet9!D26": true, - "sheet9!D27": true, - "sheet9!D28": true, - "sheet9!D29": true, - "sheet9!D30": true, - "sheet9!D31": true, - "sheet9!E26": true, - "sheet9!E27": true, - "sheet9!E28": true, - "sheet9!E29": true, - "sheet9!E30": true, - "sheet9!E31": true, - "sheet10!B4": true, - "sheet10!B13": true, - "sheet10!B18": true, - "sheet10!B25": true, - "sheet10!B22": true, - "sheet10!D5": true, - "sheet10!D12": true, - "sheet10!D11": true, - "sheet10!D9": true, - "sheet10!D8": true, - "sheet10!D7": true, - "sheet10!D6": true, - "sheet10!E5": true, - "sheet10!E12": true, - "sheet10!E11": true, - "sheet10!E9": true, - "sheet10!E8": true, - "sheet10!E7": true, - "sheet10!E6": true, - "sheet10!D17": true, - "sheet10!D16": true, - "sheet10!D15": true, - "sheet10!D14": true, - "sheet10!E17": true, - "sheet10!E16": true, - "sheet10!E15": true, - "sheet10!E14": true, - "sheet10!D21": true, - "sheet10!D20": true, - "sheet10!D19": true, - "sheet10!E21": true, - "sheet10!E20": true, - "sheet10!E19": true, - "sheet10!D24": true, - "sheet10!D23": true, - "sheet10!E24": true, - "sheet10!E23": true, - "sheet10!D30": true, - "sheet10!D29": true, - "sheet10!D28": true, - "sheet10!D27": true, - "sheet10!D26": true, - "sheet10!E30": true, - "sheet10!E29": true, - "sheet10!E28": true, - "sheet10!E27": true, - "sheet10!E26": true, - "sheet11!B4": true, - "sheet11!B12": true, - "sheet11!B18": true, - "sheet11!B26": true, - "sheet11!D5": true, - "sheet11!D11": true, - "sheet11!D9": true, - "sheet11!D8": true, - "sheet11!D7": true, - "sheet11!D6": true, - "sheet11!D10": true, - "sheet11!E5": true, - "sheet11!E11": true, - "sheet11!E9": true, - "sheet11!E8": true, - "sheet11!E7": true, - "sheet11!E6": true, - "sheet11!E10": true, - "sheet11!D17": true, - "sheet11!D16": true, - "sheet11!D15": true, - "sheet11!D14": true, - "sheet11!D13": true, - "sheet11!E17": true, - "sheet11!E16": true, - "sheet11!E15": true, - "sheet11!E14": true, - "sheet11!E13": true, - "sheet11!D24": true, - "sheet11!D25": true, - "sheet11!D23": true, - "sheet11!D22": true, - "sheet11!D21": true, - "sheet11!D20": true, - "sheet11!D19": true, - "sheet11!E24": true, - "sheet11!E25": true, - "sheet11!E23": true, - "sheet11!E22": true, - "sheet11!E21": true, - "sheet11!E20": true, - "sheet11!E19": true, - "sheet11!D29": true, - "sheet11!D28": true, - "sheet11!D27": true, - "sheet11!E29": true, - "sheet11!E28": true, - "sheet11!E27": true, - "goals!C7": true, - "goals!C8": true, - "goals!C9": true, - "goals!C10": true, - "goals!C11": true, - "goals!C12": true, - "goals!C13": true, - "goals!C14": true, - "goals!C15": true, - "goals!C16": true, - "goals!C17": true, - "goals!C18": true, - "goals!C19": true, - "goals!C20": true, - "goals!C21": true, - "goals!C22": true, - "goals!C23": true, - "goals!C24": true, - "goals!C25": true, - "goals!C26": true, - "goals!J7": true, - "goals!J8": true, - "goals!J9": true, - "goals!J10": true, - "goals!J11": true, - "goals!J12": true, - "goals!J13": true, - "goals!J14": true, - "goals!J15": true, - "goals!J16": true, - "goals!J17": true, - "goals!J18": true, - "goals!J19": true, - "goals!J20": true, - "goals!J21": true, - "goals!J22": true, - "goals!J23": true, - "goals!J24": true, - "goals!J25": true, - "goals!J26": true, - "goals!F7": true, - "goals!F11": true, - "goals!F15": true, - "goals!F19": true, - "goals!F23": true, - "goals!G7": true, - "goals!G11": true, - "goals!G15": true, - "goals!G19": true, - "goals!G23": true, - "goals!C27": true, - "goals!C28": true, - "goals!C29": true, - "goals!C30": true, - "goals!H28": true, - "goals!H29": true, - "goals!H30": true, - "goals!G27": true, - "compare!D10": true, - "compare!D11": true, - "compare!D12": true, - "compare!D13": true, - "compare!D27": true, - "compare!D26": true, - "compare!D25": true, - "compare!D24": true, - "compare!D23": true, - "compare!D22": true, - "compare!D21": true, - "compare!D20": true, - "goals!F31": true, - "goals!C31": true, - "goals!J31": true, - "goals!J32": true, - "goals!G31": true, - "goals!J33": true, - "goals!J27": true, - "goals!J34": true, - "goals!J28": true, - "goals!J29": true, - "goals!J30": true, - "sheet6!C3": true, - "sheet6!B6": true, - "sheet6!C6": true, - "sheet6!D6": true, - "sheet6!E6": true, - "sheet6!F6": true, - "sheet6!G6": true, - "sheet6!H6": true, - "sheet6!C31": true, - "sheet6!C30": true, - "sheet6!C29": true, - "sheet6!C28": true, - "sheet6!C27": true, - "sheet6!C26": true, - "sheet6!C25": true, - "sheet6!C24": true, - "sheet6!C23": true, - "sheet6!C22": true, - "sheet6!C21": true, - "sheet6!C20": true, - "sheet6!C19": true, - "sheet6!C18": true, - "sheet6!C17": true, - "sheet6!C16": true, - "sheet6!C15": true, - "sheet6!C14": true, - "sheet6!C13": true, - "sheet6!C12": true, - "sheet6!C11": true, - "sheet6!C10": true, - "sheet6!C9": true, - "sheet6!B7": true, - "sheet7!F3": true, - "sheet7!G3": true, - "sheet7!H3": true, - "sheet7!D7": true, - "sheet7!E3": true, - "sheet7!E4": true, - "sheet7!E5": true, - "sheet7!I7": true, - "sheet7!H7": true, - "sheet7!G7": true, - "sheet7!F7": true, - "sheet7!E7": true, - "sheet7!C7": true, - "sheet7!C28": true, - "sheet7!C27": true, - "sheet7!C26": true, - "sheet7!C25": true, - "sheet7!C24": true, - "sheet7!C23": true, - "sheet7!C22": true, - "sheet7!C21": true, - "sheet7!C20": true, - "sheet7!C19": true, - "sheet7!C18": true, - "sheet7!C17": true, - "sheet7!C16": true, - "sheet7!C15": true, - "sheet7!C14": true, - "sheet7!C13": true, - "sheet7!C12": true, - "sheet7!C11": true, - "sheet7!C29": true, - "sheet7!C30": true, - "sheet7!C10": true, - "sheet7!C9": true, - "sheet7!C8": true, - "sheet7!D28": true, - "sheet7!D27": true, - "sheet7!D26": true, - "sheet7!D25": true, - "sheet7!D24": true, - "sheet7!D23": true, - "sheet7!D22": true, - "sheet7!D21": true, - "sheet7!D20": true, - "sheet7!D19": true, - "sheet7!D18": true, - "sheet7!D17": true, - "sheet7!D16": true, - "sheet7!D15": true, - "sheet7!D14": true, - "sheet7!D13": true, - "sheet7!D12": true, - "sheet7!D11": true, - "sheet7!D29": true, - "sheet7!D30": true, - "sheet7!D10": true, - "sheet7!D9": true, - "sheet7!D8": true, - "sheet7!F28": true, - "sheet7!F27": true, - "sheet7!F26": true, - "sheet7!F25": true, - "sheet7!F24": true, - "sheet7!F23": true, - "sheet7!F22": true, - "sheet7!F21": true, - "sheet7!F20": true, - "sheet7!F19": true, - "sheet7!F18": true, - "sheet7!F17": true, - "sheet7!F16": true, - "sheet7!F15": true, - "sheet7!F14": true, - "sheet7!F13": true, - "sheet7!F12": true, - "sheet7!F11": true, - "sheet7!F29": true, - "sheet7!F30": true, - "sheet7!F10": true, - "sheet7!F9": true, - "sheet7!F8": true, - "sheet7!G28": true, - "sheet7!G27": true, - "sheet7!G26": true, - "sheet7!G25": true, - "sheet7!G24": true, - "sheet7!G23": true, - "sheet7!G22": true, - "sheet7!G21": true, - "sheet7!G20": true, - "sheet7!G19": true, - "sheet7!G18": true, - "sheet7!G17": true, - "sheet7!G16": true, - "sheet7!G15": true, - "sheet7!G14": true, - "sheet7!G13": true, - "sheet7!G12": true, - "sheet7!G11": true, - "sheet7!G29": true, - "sheet7!G30": true, - "sheet7!G31": true, - "sheet7!G32": true, - "sheet7!G33": true, - "sheet7!G34": true, - "sheet7!G35": true, - "sheet7!G36": true, - "sheet7!G37": true, - "sheet7!G38": true, - "sheet7!G39": true, - "sheet7!G10": true, - "sheet7!G9": true, - "sheet7!G8": true, - "sheet7!E28": true, - "sheet7!E27": true, - "sheet7!E26": true, - "sheet7!E25": true, - "sheet7!E24": true, - "sheet7!E23": true, - "sheet7!E22": true, - "sheet7!E21": true, - "sheet7!E20": true, - "sheet7!E19": true, - "sheet7!E18": true, - "sheet7!E17": true, - "sheet7!E16": true, - "sheet7!E15": true, - "sheet7!E14": true, - "sheet7!E13": true, - "sheet7!E12": true, - "sheet7!E11": true, - "sheet7!E29": true, - "sheet7!E30": true, - "sheet7!E10": true, - "sheet7!E9": true, - "sheet7!E8": true, - "sheet7!H28": true, - "sheet7!H27": true, - "sheet7!H26": true, - "sheet7!H25": true, - "sheet7!H24": true, - "sheet7!H23": true, - "sheet7!H22": true, - "sheet7!H21": true, - "sheet7!H20": true, - "sheet7!H19": true, - "sheet7!H18": true, - "sheet7!H17": true, - "sheet7!H16": true, - "sheet7!H15": true, - "sheet7!H14": true, - "sheet7!H13": true, - "sheet7!H12": true, - "sheet7!H11": true, - "sheet7!H29": true, - "sheet7!H30": true, - "sheet7!H10": true, - "sheet7!H9": true, - "sheet7!E31": true, - "sheet7!H8": true, - "sheet6!C8": true, - "sheet6!D31": true, - "sheet6!D30": true, - "sheet6!D29": true, - "sheet6!D28": true, - "sheet6!D27": true, - "sheet6!D26": true, - "sheet6!D25": true, - "sheet6!D24": true, - "sheet6!D23": true, - "sheet6!D22": true, - "sheet6!D21": true, - "sheet6!D20": true, - "sheet6!D19": true, - "sheet6!D18": true, - "sheet6!D17": true, - "sheet6!D16": true, - "sheet6!D15": true, - "sheet6!D14": true, - "sheet6!D13": true, - "sheet6!D12": true, - "sheet6!D11": true, - "sheet6!D10": true, - "sheet6!D9": true, - "sheet6!D8": true, - "sheet6!F31": true, - "sheet6!F30": true, - "sheet6!F29": true, - "sheet6!F28": true, - "sheet6!F27": true, - "sheet6!F26": true, - "sheet6!F25": true, - "sheet6!F24": true, - "sheet6!F23": true, - "sheet6!F22": true, - "sheet6!F21": true, - "sheet6!F20": true, - "sheet6!F19": true, - "sheet6!F18": true, - "sheet6!F17": true, - "sheet6!F16": true, - "sheet6!F15": true, - "sheet6!F14": true, - "sheet6!F13": true, - "sheet6!F12": true, - "sheet6!F11": true, - "sheet6!F10": true, - "sheet6!F9": true, - "sheet6!F8": true, - "sheet6!G31": true, - "sheet6!G30": true, - "sheet6!G29": true, - "sheet6!G28": true, - "sheet6!G27": true, - "sheet6!G26": true, - "sheet6!G25": true, - "sheet6!G24": true, - "sheet6!G23": true, - "sheet6!G22": true, - "sheet6!G21": true, - "sheet6!G20": true, - "sheet6!G19": true, - "sheet6!G18": true, - "sheet6!G17": true, - "sheet6!G16": true, - "sheet6!G15": true, - "sheet6!G14": true, - "sheet6!G13": true, - "sheet6!G12": true, - "sheet6!G11": true, - "sheet6!G10": true, - "sheet6!G9": true, - "sheet6!G8": true, - "sheet6!B31": true, - "sheet6!B30": true, - "sheet6!B29": true, - "sheet6!B28": true, - "sheet6!B27": true, - "sheet6!B26": true, - "sheet6!B25": true, - "sheet6!B24": true, - "sheet6!B23": true, - "sheet6!B22": true, - "sheet6!B21": true, - "sheet6!B20": true, - "sheet6!B19": true, - "sheet6!B18": true, - "sheet6!B17": true, - "sheet6!B16": true, - "sheet6!B15": true, - "sheet6!B14": true, - "sheet6!B13": true, - "sheet6!B12": true, - "sheet6!B11": true, - "sheet6!B10": true, - "sheet6!B9": true, - "sheet6!B8": true, - "sheet6!C7": true, - "sheet6!D7": true, - "sheet6!E7": true, - "sheet6!F7": true, - "sheet6!G7": true, - "sheet6!E31": true, - "sheet6!E30": true, - "sheet6!E29": true, - "sheet6!E28": true, - "sheet6!E27": true, - "sheet6!E26": true, - "sheet6!E25": true, - "sheet6!E24": true, - "sheet6!E23": true, - "sheet6!E22": true, - "sheet6!E21": true, - "sheet6!E20": true, - "sheet6!E19": true, - "sheet6!E18": true, - "sheet6!E17": true, - "sheet6!E16": true, - "sheet6!E15": true, - "sheet6!E14": true, - "sheet6!E13": true, - "sheet6!E12": true, - "sheet6!E11": true, - "sheet6!E10": true, - "sheet6!E9": true, - "sheet6!E8": true, - "compare!B4": true, - "compare!C9": true, - "compare!D9": true, - "compare!E9": true, - "compare!F9": true, - "compare!C10": true, - "compare!C11": true, - "compare!C12": true, - "compare!C13": true, - "compare!F19": true, - "compare!C19": true, - "compare!C27": true, - "compare!C26": true, - "compare!C25": true, - "compare!C24": true, - "compare!C23": true, - "compare!C22": true, - "compare!C21": true, - "compare!C20": true, - "summary!G18": true, - "summary!O32": true, - }, - constraints: {}, - }, - }, - footers: [ - { name: "Type1", index: 1, isActive: true }, - { name: "Type2", index: 2, isActive: false }, - { name: "Type3", index: 3, isActive: false }, - { name: "Detail1", index: 4, isActive: false }, - { name: "Detail2", index: 5, isActive: false }, - ], - }, - iPod: { - msc: { - numsheets: 11, - currentid: "sheet1", - currentname: "summary", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B2:t:Summary:l:1:f:4:c:1:bg:6:cf:2:colspan:4\ncell:B4:l:1:f:3:c:1:bg:6:cf:2\ncell:G4:t:
    \\n\\n\\n:tvf:3:colspan:3:rowspan:5\ncell:C5:t:Monthly Budget:l:4:f:5:c:6:bg:3:cf:1:colspan:2\ncell:D5:bg:5\ncell:B6:b::1::\ncell:C6:t:Total Income:b::1:1:1:l:3:f:6:cf:2\ncell:D6:vtf:n:37112:INCOME!D23:b::1:1:1:l:2:f:1:ntvf:1\ncell:B7:b::1::\ncell:C7:t:Total Expenses:b:::1:1:l:3:f:6:bg:5:cf:2\ncell:D7:vtf:n:4853:SHEET11!E30:b::1:1:1:l:2:f:1:bg:5:ntvf:1\ncell:C8:t:Savings:b:1::1:1:l:3:f:6:cf:2\ncell:D8:vtf:n:32259:D6-D7:b:1:1:1:1:l:2:f:1:ntvf:1\ncell:B10:t::l:1:f:3:c:1:bg:6:cf:2\ncell:G10:t:
    \\n\\n\\n:tvf:3:colspan:3:rowspan:5\ncell:C11:t:Yearly Budget:l:4:f:5:c:6:bg:2:cf:1:colspan:2\ncell:B12:b::1::\ncell:C12:t:Total Income:b::1:1:1:l:3:f:6:cf:2\ncell:D12:vtf:n:445344:INCOME!E23:b::1:1:1:l:3:f:1:ntvf:1\ncell:C13:t:Total Expenses:b:::1:1:l:3:f:6:bg:5:cf:2\ncell:D13:vtf:n:58236:SHEET11!F30:b::1:1:1:l:3:f:1:bg:5:ntvf:1\ncell:C14:t:Savings:b:1::1:1:l:3:f:6:cf:2\ncell:D14:vtf:n:387108:D12-D13:b:1:1:1:1:l:3:f:1:ntvf:1\ncell:B16:l:1:f:3:c:1:bg:6:cf:1\ncell:B17:bg:6\ncell:C17:t:Monthly Spending:l:4:f:5:c:6:bg:4:cf:1:colspan:2\ncell:D17:b::1:::bg:6\ncell:B18:b::1::\ncell:C18:t:Housing:b::1::1:l:3:f:6:cf:2\ncell:D18:vtf:n:1380:EXPENSE!E7:b::1::1:l:3:f:1:ntvf:1\ncell:G18:t:
    \\n\\n\\n:tvf:3:colspan:4:rowspan:11\ncell:B19:b::1::\ncell:C19:t:Food:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D19:vtf:n:511:sheet9!E4:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B20:b::1::\ncell:C20:t:Clothes:b::1::1:l:3:f:6:cf:2\ncell:D20:vtf:n:191:sheet9!E12:b::1::1:l:3:f:1:ntvf:1\ncell:B21:b::1::\ncell:C21:t:Transportation:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D21:vtf:n:640:sheet9!E17:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B22:b::1::\ncell:C22:t:Healthcare:b::1::1:l:3:f:6:cf:2\ncell:D22:vtf:n:263:sheet9!E26:b::1::1:l:3:f:1:ntvf:1\ncell:B23:b::1::\ncell:C23:t:Entertainment:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D23:vtf:n:209:sheet10!E4:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B24:b::1::\ncell:C24:t:Education:b::1::1:l:3:f:6:cf:2\ncell:D24:vtf:n:98:sheet10!E13:b::1::1:l:3:f:1:ntvf:1\ncell:B25:b::1::\ncell:C25:t:Contributions:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D25:vtf:n:222:sheet10!E18:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B26:b::1::\ncell:C26:t:Debt:b::1::1:l:3:f:6:cf:2\ncell:D26:vtf:n:0:sheet10!E22:b::1::1:l:3:f:1:ntvf:1\ncell:B27:b::1::\ncell:C27:t:Insurance:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D27:vtf:n:30:sheet10!E25:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B28:b::1::\ncell:C28:t:Credit Card :b::1::1:l:3:f:6:cf:2\ncell:D28:vtf:n:209:sheet11!E4:b::1::1:l:3:f:1:ntvf:1\ncell:B29:b::1::\ncell:C29:t:Buisness:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D29:vtf:n:780:sheet11!E12:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B30:b::1::\ncell:C30:t:Vacation:b::1::1:l:3:f:6:cf:2\ncell:D30:vtf:n:98:sheet11!E18:b::1::1:l:3:f:1:ntvf:1\ncell:E30:b::::1\ncell:B31:b::1::\ncell:C31:t:Miscellaneous:b::1:1:1:l:3:f:6:bg:5:cf:2\ncell:D31:vtf:n:222:sheet11!E26:b::1:1:1:l:3:f:1:bg:5:ntvf:1\ncell:E31:b::::1\ncell:C32:b:1:::\ncell:D32:b:1:::\ncol:A:w:60\ncol:B:w:20\ncol:C:w:151\ncol:D:w:89\ncol:E:w:20\ncol:F:w:54\ncol:G:w:95\ncol:H:w:96\ncol:I:w:88\ncol:J:w:47\nsheet:c:10:r:32:font:2\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,153,204)\ncolor:3:rgb(136,204,119)\ncolor:4:rgb(204,119,153)\ncolor:5:rgb(230,230,250)\ncolor:6:rgb(255, 255, 255)\nfont:1:* * Arial\nfont:2:* 12pt *\nfont:3:normal bold 12pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold large *\nfont:6:normal normal * Arial\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:1px 8px 1px *;vertical-align:middle;\nlayout:3:padding:1px 8px 1px 6px;vertical-align:middle;\nlayout:4:padding:3px 10px 3px 10px;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:text-html\n', - }, - name: "summary", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:8:cf:2:ntvf:2\ncell:B1:l:1:f:8:cf:2\ncell:C1:l:1:f:8:cf:2\ncell:D1:l:1:f:8:cf:2\ncell:E1:l:1:f:8:cf:2\ncell:F1:l:1:f:8:cf:2\ncell:G1:l:1:f:8:cf:2\ncell:H1:l:1:f:8:cf:2\ncell:I1:l:1:f:8:cf:2\ncell:J1:l:1:f:8:cf:2\ncell:K1:l:1:f:8:cf:2\ncell:L1:l:1:f:8:cf:2\ncell:M1:l:1:f:8:cf:2\ncell:N1:l:1:f:8:cf:2\ncell:O1:l:1:f:8:cf:2\ncell:P1:l:1:f:8:cf:2\ncell:Q1:l:1:f:8:cf:2\ncell:R1:l:1:f:8:cf:2\ncell:S1:l:1:f:8:cf:2\ncell:A2:l:1:f:8:cf:2\ncell:B2:l:1:f:8:cf:2\ncell:C2:l:1:f:8:cf:2\ncell:D2:l:1:f:8:cf:2\ncell:E2:l:1:f:8:cf:2\ncell:F2:l:1:f:8:cf:2\ncell:G2:l:1:f:8:cf:2\ncell:H2:l:1:f:8:cf:2\ncell:I2:l:1:f:8:cf:2\ncell:J2:l:1:f:8:cf:2\ncell:K2:l:1:f:8:cf:2\ncell:L2:l:1:f:8:cf:2\ncell:M2:l:1:f:8:cf:2\ncell:N2:l:1:f:8:cf:2\ncell:O2:l:1:f:8:cf:2\ncell:P2:l:1:f:8:cf:2\ncell:Q2:l:1:f:8:cf:2\ncell:R2:l:1:f:8:cf:2\ncell:S2:l:1:f:8:cf:2\ncell:A3:l:1:f:8:cf:2\ncell:B3:l:1:f:8:cf:2\ncell:C3:l:1:f:8:cf:2\ncell:D3:l:1:f:8:cf:2\ncell:E3:l:1:f:8:cf:2\ncell:F3:l:1:f:8:cf:2\ncell:G3:l:1:f:8:cf:2\ncell:H3:l:1:f:8:cf:2\ncell:I3:l:1:f:8:cf:2\ncell:J3:l:1:f:8:cf:2\ncell:K3:l:1:f:8:cf:2\ncell:L3:l:1:f:8:cf:2\ncell:M3:l:1:f:8:cf:2\ncell:N3:l:1:f:8:cf:2\ncell:O3:l:1:f:8:cf:2\ncell:P3:l:1:f:8:cf:2\ncell:Q3:l:1:f:8:cf:2\ncell:R3:l:1:f:8:cf:2\ncell:S3:l:1:f:8:cf:2\ncell:A4:l:1:f:8:cf:2\ncell:B4:l:1:f:8:cf:2\ncell:C4:l:1:f:8:cf:2\ncell:F4:l:1:f:8:cf:2\ncell:G4:l:1:f:8:cf:2\ncell:H4:l:1:f:8:cf:2\ncell:I4:l:1:f:8:cf:2\ncell:J4:l:1:f:8:cf:2\ncell:K4:l:1:f:8:cf:2\ncell:L4:l:1:f:8:cf:2\ncell:M4:t: :l:1:f:8:cf:2\ncell:N4:l:1:f:8:cf:2\ncell:O4:l:1:f:8:cf:2\ncell:P4:l:1:f:8:cf:2\ncell:Q4:l:1:f:8:cf:2\ncell:R4:l:1:f:8:cf:2\ncell:S4:l:1:f:8:cf:2\ncell:A5:l:1:f:8:cf:2\ncell:B5:t::l:2:f:5:cf:2\ncell:C5:t:Income:l:2:f:4:c:1:bg:7:cf:2\ncell:D5:t:Date:l:1:f:9:cf:2\ncell:E5:vtf:ndt:45465.92746829861:NOW():l:1:f:9:bg:6:cf:3:ntvf:3\ncell:F5:l:1:f:8:cf:2\ncell:G5:l:1:f:8:cf:2\ncell:H5:l:1:f:8:cf:2\ncell:I5:l:1:f:8:cf:2\ncell:J5:l:1:f:8:cf:2\ncell:K5:l:1:f:8:cf:2\ncell:L5:l:1:f:8:cf:2\ncell:M5:l:1:f:8:cf:2\ncell:N5:l:1:f:8:cf:2\ncell:O5:l:1:f:8:cf:2\ncell:P5:l:1:f:8:cf:2\ncell:Q5:l:1:f:8:cf:2\ncell:R5:l:1:f:8:cf:2\ncell:S5:l:1:f:8:cf:2\ncell:A6:l:1:f:8:cf:2\ncell:C6:t::l:2:f:8:cf:1\ncell:D6:l:1:f:8:cf:2\ncell:E6:l:1:f:8:cf:2\ncell:F6:l:1:f:8:cf:2\ncell:K6:t::l:2:f:3:cf:2\ncell:L6:t::l:2:f:8:cf:2\ncell:M6:t::l:2:f:8:cf:2\ncell:N6:t::l:2:f:8:cf:2\ncell:O6:l:1:f:8:cf:2\ncell:P6:l:1:f:8:cf:2\ncell:Q6:l:1:f:8:cf:2\ncell:R6:l:1:f:8:cf:2\ncell:S6:l:1:f:8:cf:2\ncell:A7:l:1:f:10:cf:2\ncell:B7:l:2:f:3:cf:2\ncell:F7:l:1:f:8:cf:2\ncell:K7:l:1:f:8:cf:2\ncell:L7:l:1:f:8:cf:2\ncell:M7:l:1:f:8:cf:2\ncell:N7:l:1:f:8:cf:2\ncell:O7:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:P7:t::l:1:f:8:cf:2\ncell:Q7:l:1:f:8:cf:2\ncell:R7:l:1:f:8:cf:2\ncell:S7:l:1:f:8:cf:2\ncell:A8:l:1:f:10:cf:2\ncell:C8:t:Source:l:2:f:2:c:7:bg:5:cf:1\ncell:D8:t:Monthly Budget:l:2:f:2:c:7:bg:4:cf:1\ncell:E8:t:Yearly Budget:l:2:f:2:c:7:bg:2:cf:1\ncell:F8:l:1:f:8:cf:2\ncell:K8:t::l:1:f:8:cf:2\ncell:L8:t::l:1:f:8:cf:2\ncell:M8:t::l:1:f:8:cf:2\ncell:N8:l:1:f:8:cf:2\ncell:O8:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:P8:t::l:1:f:8:cf:2\ncell:Q8:l:1:f:8:cf:2\ncell:R8:l:1:f:8:cf:2\ncell:S8:l:1:f:8:cf:2\ncell:B9:b::1:::l:1:f:8:cf:2\ncell:C9:t:Salary/Wages:b::1::1:l:5:f:7:cf:2\ncell:D9:v:20000:b::1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E9:vtf:n:240000:IF( (D9*12)=0,"",(D9*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F9:l:1:f:8:cf:2\ncell:K9:l:1:f:8:cf:2\ncell:L9:l:1:f:8:cf:2\ncell:M9:l:1:f:8:cf:2\ncell:N9:l:1:f:8:cf:2\ncell:O9:l:1:f:8:cf:2\ncell:P9:l:1:f:8:cf:2\ncell:Q9:l:1:f:8:cf:2\ncell:R9:l:1:f:8:cf:2\ncell:S9:l:1:f:8:cf:2\ncell:B10:b::1:::l:1:f:8:cf:2\ncell:C10:t:Contract Work:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D10:v:18012:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E10:vtf:n:216144:IF( (D10*12)=0,"",(D10*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F10:l:1:f:8:cf:2\ncell:G10:l:1:f:3:cf:3\ncell:H10:t::l:1:f:8:cf:3\ncell:I10:t::l:1:f:8:cf:3\ncell:J10:l:1:f:8:cf:2\ncell:K10:l:2:f:3:cf:2\ncell:L10:l:1:f:8:cf:2\ncell:M10:l:1:f:8:cf:2\ncell:N10:l:1:f:8:cf:2\ncell:O10:l:1:f:8:cf:2\ncell:P10:l:1:f:8:cf:2\ncell:Q10:l:1:f:8:cf:2\ncell:R10:l:1:f:8:cf:2\ncell:S10:l:1:f:8:cf:2\ncell:B11:b::1:::l:1:f:8:cf:2\ncell:C11:t:Bonuses:b::1::1:l:5:f:7:cf:2\ncell:D11:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E11:vtf:t::IF( (D11*12)=0,"",(D11*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F11:l:1:f:8:cf:2\ncell:G11:l:1:f:8:cf:2\ncell:H11:l:1:f:8:cf:2\ncell:I11:l:1:f:8:cf:2\ncell:J11:l:1:f:8:cf:2\ncell:K11:l:1:f:8:cf:2\ncell:L11:l:1:f:8:cf:2\ncell:M11:l:1:f:8:cf:2\ncell:N11:l:1:f:8:cf:2\ncell:O11:l:1:f:8:cf:2\ncell:P11:l:1:f:8:cf:2\ncell:Q11:l:1:f:8:cf:2\ncell:R11:l:1:f:8:cf:2\ncell:S11:l:1:f:8:cf:2\ncell:B12:b::1:::l:1:f:8:cf:2\ncell:C12:t:Commissions:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D12:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E12:vtf:t::IF( (D12*12)=0,"",(D12*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F12:l:1:f:8:cf:2\ncell:G12:l:1:f:8:cf:2\ncell:H12:l:1:f:8:cf:2\ncell:I12:l:1:f:8:cf:2\ncell:J12:l:1:f:8:cf:2\ncell:K12:l:1:f:8:cf:2\ncell:L12:l:1:f:8:cf:2\ncell:M12:l:1:f:8:cf:2\ncell:N12:l:1:f:8:cf:2\ncell:O12:l:1:f:8:cf:2\ncell:P12:l:1:f:8:cf:2\ncell:Q12:l:1:f:8:cf:2\ncell:R12:l:1:f:8:cf:2\ncell:S12:l:1:f:8:cf:2\ncell:B13:b::1:::l:1:f:8:cf:2\ncell:C13:t:Tips:b::1::1:l:5:f:7:cf:2\ncell:D13:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E13:vtf:t::IF( (D13*12)=0,"",(D13*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F13:l:1:f:8:cf:2\ncell:G13:l:1:f:8:cf:2\ncell:H13:t:Deductions:l:2:f:2:c:7:bg:5:cf:1:colspan:3\ncell:I13:l:1:f:8:c:7:cf:2\ncell:J13:l:1:f:8:c:7:cf:2\ncell:K13:t:Monthly Budget:l:2:f:2:c:7:bg:4:cf:1\ncell:L13:l:1:f:8:cf:2\ncell:M13:l:1:f:8:cf:2\ncell:N13:l:1:f:8:cf:2\ncell:O13:l:1:f:8:cf:2\ncell:P13:l:1:f:8:cf:2\ncell:Q13:l:1:f:8:cf:2\ncell:R13:l:1:f:8:cf:2\ncell:S13:l:1:f:8:cf:2\ncell:B14:b::1:::l:1:f:8:cf:2\ncell:C14:t:Interest Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D14:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E14:vtf:t::IF( (D14*12)=0,"",(D14*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F14:l:1:f:8:cf:2\ncell:G14:b::1:::l:1:f:8:cf:2\ncell:H14:t:Fedral Withholding Taxes:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I14:l:1:f:8:cf:2\ncell:J14:l:1:f:8:cf:2\ncell:K14:b::1::1:l:4:f:7:cf:3:ntvf:1\ncell:L14:b::::1:l:1:f:8:cf:2\ncell:M14:l:1:f:8:cf:2\ncell:N14:l:1:f:8:cf:2\ncell:O14:l:1:f:8:cf:2\ncell:P14:l:1:f:8:cf:2\ncell:Q14:l:1:f:8:cf:2\ncell:R14:l:1:f:8:cf:2\ncell:S14:l:1:f:8:cf:2\ncell:B15:b::1:::l:1:f:8:cf:2\ncell:C15:t:Investment Income:b::1::1:l:5:f:7:cf:2\ncell:D15:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E15:vtf:t::IF( (D15*12)=0,"",(D15*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F15:l:1:f:8:cf:2\ncell:G15:b::1:::l:1:f:8:cf:2\ncell:H15:t:State Withholding Taxes:b::1::1:l:5:f:7:bg:6:cf:2:colspan:3\ncell:I15:l:1:f:8:bg:6:cf:2\ncell:J15:l:1:f:8:bg:6:cf:2\ncell:K15:b::1::1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:L15:b::::1:l:1:f:8:cf:2\ncell:M15:l:1:f:8:cf:2\ncell:N15:l:1:f:8:cf:2\ncell:O15:l:1:f:8:cf:2\ncell:P15:l:1:f:8:cf:2\ncell:Q15:l:1:f:8:cf:2\ncell:R15:l:1:f:8:cf:2\ncell:S15:l:1:f:8:cf:2\ncell:B16:b::1:::l:1:f:8:cf:2\ncell:C16:t:Rental Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D16:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E16:vtf:t::IF( (D16*12)=0,"",(D16*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F16:b:1::::l:1:f:8:cf:2\ncell:G16:b:1:1:::l:1:f:8:cf:2\ncell:H16:t:Social Security:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I16:l:1:f:8:cf:2\ncell:J16:l:1:f:8:cf:2\ncell:K16:b::1::1:l:4:f:7:cf:3:ntvf:1\ncell:L16:b::::1:l:1:f:8:cf:2\ncell:M16:l:1:f:8:cf:2\ncell:N16:l:1:f:8:cf:2\ncell:O16:l:1:f:8:cf:2\ncell:P16:l:1:f:8:cf:2\ncell:Q16:l:1:f:8:cf:2\ncell:R16:l:1:f:8:cf:2\ncell:S16:l:1:f:8:cf:2\ncell:B17:b::1:::l:1:f:8:cf:2\ncell:C17:t:Pension Income:b::1::1:l:5:f:7:cf:2\ncell:D17:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E17:vtf:t::IF( (D17*12)=0,"",(D17*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F17:l:1:f:8:cf:2\ncell:G17:b::1:::l:1:f:8:cf:2\ncell:H17:t:Reteriment Account:b::1::1:l:5:f:7:bg:6:cf:2:colspan:3\ncell:I17:l:1:f:8:bg:6:cf:2\ncell:J17:l:1:f:8:bg:6:cf:2\ncell:K17:v:900:b::1::1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:L17:b::::1:l:1:f:8:cf:2\ncell:M17:l:1:f:8:cf:2\ncell:N17:l:1:f:8:cf:2\ncell:O17:l:1:f:8:cf:2\ncell:P17:l:1:f:8:cf:2\ncell:Q17:l:1:f:8:cf:2\ncell:R17:l:1:f:8:cf:2\ncell:S17:l:1:f:8:cf:2\ncell:B18:b::1:::l:1:f:8:cf:2\ncell:C18:t:Social Security Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D18:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E18:b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F18:l:1:f:8:cf:2\ncell:G18:b::1:::l:1:f:8:cf:2\ncell:H18:t:Other Deductions:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I18:b:::1::l:1:f:8:cf:2\ncell:J18:b:::1::l:1:f:8:cf:2\ncell:K18:b::1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:L18:b::::1:l:1:f:8:cf:2\ncell:M18:l:1:f:8:cf:2\ncell:N18:l:1:f:8:cf:2\ncell:O18:l:1:f:8:cf:2\ncell:P18:l:1:f:8:cf:2\ncell:Q18:l:1:f:8:cf:2\ncell:R18:l:1:f:8:cf:2\ncell:S18:l:1:f:8:cf:2\ncell:B19:b::1:::l:1:f:8:cf:2\ncell:C19:t:Alimony:b::1::1:l:5:f:7:cf:2\ncell:D19:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E19:vtf:t::IF( (D19*12)=0,"",(D19*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F19:l:1:f:8:cf:2\ncell:G19:l:1:f:8:cf:2\ncell:H19:t:Total:l:3:f:2:c:7:bg:3:cf:1:colspan:3\ncell:I19:l:1:f:8:c:7:bg:3:cf:2\ncell:J19:l:1:f:8:c:7:bg:3:cf:2\ncell:K19:vtf:n:900:SUM(K13\\cK18):l:4:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:L19:b:::1::l:1:f:8:cf:2\ncell:M19:l:1:f:8:cf:2\ncell:N19:l:1:f:8:cf:2\ncell:O19:l:1:f:8:cf:2\ncell:P19:l:1:f:8:cf:2\ncell:Q19:l:1:f:8:cf:2\ncell:R19:l:1:f:8:cf:2\ncell:S19:l:1:f:8:cf:2\ncell:B20:b::1:::l:1:f:8:cf:2\ncell:C20:t:Child Support:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D20:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E20:vtf:t::IF( (D20*12)=0,"",(D20*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F20:l:1:f:8:cf:2\ncell:G20:l:1:f:8:cf:2\ncell:H20:l:1:f:8:cf:2\ncell:I20:l:1:f:8:cf:2\ncell:J20:l:1:f:8:cf:2\ncell:K20:l:1:f:8:cf:2\ncell:L20:b:1:1:::l:1:f:8:cf:2\ncell:M20:b::::1:l:1:f:8:cf:2\ncell:N20:l:1:f:8:cf:2\ncell:O20:l:1:f:8:cf:2\ncell:P20:l:1:f:8:cf:2\ncell:Q20:l:1:f:8:cf:2\ncell:R20:l:1:f:8:cf:2\ncell:S20:l:1:f:8:cf:2\ncell:B21:b::1:::l:1:f:8:cf:2\ncell:C21:t:Other Income:b::1::1:l:5:f:7:cf:2\ncell:D21:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E21:vtf:t::IF( (D21*12)=0,"",(D21*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F21:l:1:f:8:cf:2\ncell:G21:l:1:f:8:cf:2\ncell:H21:l:1:f:8:cf:2\ncell:I21:l:1:f:8:cf:2\ncell:J21:l:3:f:2:cf:1\ncell:K21:l:1:f:8:cf:2\ncell:L21:b::1:1::l:1:f:8:cf:2\ncell:M21:b::::1:l:1:f:8:cf:2\ncell:N21:l:1:f:8:cf:2\ncell:O21:l:1:f:8:cf:2\ncell:P21:l:1:f:8:cf:2\ncell:Q21:l:1:f:8:cf:2\ncell:R21:l:1:f:8:cf:2\ncell:S21:l:1:f:8:cf:2\ncell:B22:b::1:::l:1:f:8:cf:2\ncell:C22:t:Deduction:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D22:vtf:n:900:K19:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E22:vtf:n:10800:IF( (D22*12)=0,"",(D22*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F22:b:1::::l:1:f:8:cf:2\ncell:G22:b:1::::l:1:f:8:cf:2\ncell:H22:b:1::::l:1:f:8:cf:2\ncell:I22:b:1::::l:1:f:8:cf:2\ncell:J22:b:1::::l:1:f:8:cf:2\ncell:K22:b:1::::l:1:f:8:cf:2\ncell:L22:l:1:f:8:cf:2\ncell:M22:l:1:f:8:cf:2\ncell:N22:l:1:f:8:cf:2\ncell:O22:l:1:f:8:cf:2\ncell:P22:l:1:f:8:cf:2\ncell:Q22:l:1:f:8:cf:2\ncell:R22:l:1:f:8:cf:2\ncell:S22:l:1:f:8:cf:2\ncell:B23:l:1:f:8:cf:2\ncell:C23:t:Total Take Home Income:l:3:f:2:c:7:bg:3:cf:1\ncell:D23:vtf:n:37112:(SUM(D9\\cD21)-D22):l:3:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:E23:vtf:n:445344:IF( (D23*12)=0,"",(D23*12)):l:3:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:F23:l:1:f:8:cf:2\ncell:G23:l:1:f:8:cf:2\ncell:H23:l:1:f:8:cf:2\ncell:I23:l:1:f:8:cf:2\ncell:J23:l:1:f:8:cf:2\ncell:K23:l:1:f:8:cf:2\ncell:L23:l:1:f:8:cf:2\ncell:M23:l:1:f:8:cf:2\ncell:N23:l:1:f:8:cf:2\ncell:O23:l:1:f:8:cf:2\ncell:P23:l:1:f:8:cf:2\ncell:Q23:l:1:f:8:cf:2\ncell:R23:l:1:f:8:cf:2\ncell:S23:l:1:f:8:cf:2\ncell:B24:l:1:f:8:cf:2\ncell:F24:l:1:f:8:cf:2\ncell:G24:l:1:f:8:cf:2\ncell:H24:l:1:f:8:cf:2\ncell:I24:l:1:f:8:cf:2\ncell:J24:l:1:f:8:cf:2\ncell:K24:l:1:f:8:cf:2\ncell:L24:l:1:f:8:cf:2\ncell:M24:l:1:f:8:cf:2\ncell:N24:l:1:f:8:cf:2\ncell:O24:l:1:f:8:cf:2\ncell:P24:l:1:f:8:cf:2\ncell:Q24:l:1:f:8:cf:2\ncell:R24:l:1:f:8:cf:2\ncell:S24:l:1:f:8:cf:2\ncell:A25:l:1:f:10:cf:2\ncell:B25:l:1:f:6:cf:2\ncell:C25:l:1:f:11:cf:2\ncell:D25:l:1:f:11:cf:2\ncell:E25:l:1:f:8:cf:2\ncell:F25:l:1:f:8:cf:2\ncell:G25:l:1:f:8:cf:2\ncell:H25:l:1:f:8:cf:2\ncell:I25:l:1:f:8:cf:2\ncell:J25:l:1:f:8:cf:2\ncell:K25:l:1:f:8:cf:2\ncell:L25:l:1:f:8:cf:2\ncell:M25:l:1:f:8:cf:2\ncell:N25:l:1:f:8:cf:2\ncell:O25:l:1:f:8:cf:2\ncell:P25:l:1:f:8:cf:2\ncell:Q25:l:1:f:8:cf:2\ncell:R25:l:1:f:8:cf:2\ncell:S25:l:1:f:8:cf:2\ncell:A26:l:1:f:10:cf:2\ncell:B26:l:1:f:6:cf:2\ncell:C26:l:1:f:6:cf:2\ncell:D26:l:1:f:11:cf:2\ncell:E26:l:1:f:11:cf:2\ncell:F26:l:1:f:11:cf:2\ncell:G26:l:1:f:11:cf:2\ncell:H26:l:1:f:8:cf:2\ncell:I26:l:1:f:8:cf:2\ncell:J26:l:1:f:8:cf:2\ncell:K26:l:1:f:8:cf:2\ncell:L26:l:1:f:8:cf:2\ncell:M26:l:1:f:8:cf:2\ncell:N26:l:1:f:8:cf:2\ncell:O26:l:1:f:8:cf:2\ncell:P26:l:1:f:8:cf:2\ncell:Q26:l:1:f:8:cf:2\ncell:R26:l:1:f:8:cf:2\ncell:S26:l:1:f:8:cf:2\ncell:L27:l:1:f:8:cf:2\ncell:M27:l:1:f:8:cf:2\ncell:N27:l:1:f:8:cf:2\ncell:O27:l:1:f:8:cf:2\ncell:P27:l:1:f:8:cf:2\ncell:Q27:l:1:f:8:cf:2\ncell:R27:l:1:f:8:cf:2\ncell:S27:l:1:f:8:cf:2\ncell:L28:l:1:f:8:cf:2\ncell:M28:l:1:f:8:cf:2\ncell:N28:l:1:f:8:cf:2\ncell:O28:l:1:f:8:cf:2\ncell:P28:l:1:f:8:cf:2\ncell:Q28:l:1:f:8:cf:2\ncell:R28:l:1:f:8:cf:2\ncell:S28:l:1:f:8:cf:2\ncell:L29:l:1:f:8:cf:2\ncell:M29:l:1:f:8:cf:2\ncell:N29:l:1:f:8:cf:2\ncell:O29:l:1:f:8:cf:2\ncell:P29:l:1:f:8:cf:2\ncell:Q29:l:1:f:8:cf:2\ncell:R29:l:1:f:8:cf:2\ncell:S29:l:1:f:8:cf:2\ncell:L30:l:1:f:8:cf:2\ncell:M30:l:1:f:8:cf:2\ncell:N30:l:1:f:8:cf:2\ncell:O30:l:1:f:8:cf:2\ncell:P30:l:1:f:8:cf:2\ncell:Q30:l:1:f:8:cf:2\ncell:R30:l:1:f:8:cf:2\ncell:S30:l:1:f:8:cf:2\ncell:L31:l:1:f:8:cf:2\ncell:M31:l:1:f:8:cf:2\ncell:N31:l:1:f:8:cf:2\ncell:L32:l:1:f:8:cf:2\ncell:M32:l:1:f:8:cf:2\ncell:N32:l:1:f:8:cf:2\ncell:L33:l:1:f:8:cf:2\ncell:M33:l:1:f:8:cf:2\ncell:N33:l:1:f:8:cf:2\ncell:L34:l:1:f:8:cf:2\ncell:M34:l:1:f:8:cf:2\ncell:N34:l:1:f:8:cf:2\ncell:L35:l:1:f:8:cf:2\ncell:M35:l:1:f:8:cf:2\ncell:N35:l:1:f:8:cf:2\ncell:L36:l:1:f:8:cf:2\ncell:M36:l:1:f:8:cf:2\ncell:N36:l:1:f:8:cf:2\ncell:L37:l:1:f:8:cf:2\ncell:M37:l:1:f:8:cf:2\ncell:N37:l:1:f:8:cf:2\ncell:L38:l:1:f:8:cf:2\ncell:M38:l:1:f:8:cf:2\ncell:N38:l:1:f:8:cf:2\ncell:L39:l:1:f:8:cf:2\ncell:M39:l:1:f:8:cf:2\ncell:N39:l:1:f:8:cf:2\ncell:L40:l:1:f:8:cf:2\ncell:M40:l:1:f:8:cf:2\ncell:N40:l:1:f:8:cf:2\ncell:L41:l:1:f:8:cf:2\ncell:M41:l:1:f:8:cf:2\ncell:N41:l:1:f:8:cf:2\ncell:L42:l:1:f:8:cf:2\ncell:M42:l:1:f:8:cf:2\ncell:N42:l:1:f:8:cf:2\ncell:L43:l:1:f:8:cf:2\ncell:M43:l:1:f:8:cf:2\ncell:N43:l:1:f:8:cf:2\ncell:L44:l:1:f:8:cf:2\ncell:M44:l:1:f:8:cf:2\ncell:N44:l:1:f:8:cf:2\ncell:O44:l:1:f:8:cf:2\ncell:P44:l:1:f:8:cf:2\ncell:Q44:l:1:f:8:cf:2\ncell:R44:l:1:f:8:cf:2\ncell:S44:l:1:f:8:cf:2\ncell:L45:l:1:f:8:cf:2\ncell:M45:l:1:f:8:cf:2\ncell:N45:l:1:f:8:cf:2\ncell:O45:l:1:f:8:cf:2\ncell:P45:l:1:f:8:cf:2\ncell:Q45:l:1:f:8:cf:2\ncell:R45:l:1:f:8:cf:2\ncell:S45:l:1:f:8:cf:2\ncell:L46:l:1:f:8:cf:2\ncell:M46:l:1:f:8:cf:2\ncell:N46:l:1:f:8:cf:2\ncell:O46:l:1:f:8:cf:2\ncell:P46:l:1:f:8:cf:2\ncell:Q46:l:1:f:8:cf:2\ncell:R46:l:1:f:8:cf:2\ncell:S46:l:1:f:8:cf:2\ncell:L47:l:1:f:8:cf:2\ncell:M47:l:1:f:8:cf:2\ncell:N47:l:1:f:8:cf:2\ncell:O47:l:1:f:8:cf:2\ncell:P47:l:1:f:8:cf:2\ncell:Q47:l:1:f:8:cf:2\ncell:R47:l:1:f:8:cf:2\ncell:S47:l:1:f:8:cf:2\ncell:L48:l:1:f:8:cf:2\ncell:M48:l:1:f:8:cf:2\ncell:N48:l:1:f:8:cf:2\ncell:O48:l:1:f:8:cf:2\ncell:P48:l:1:f:8:cf:2\ncell:Q48:l:1:f:8:cf:2\ncell:R48:l:1:f:8:cf:2\ncell:S48:l:1:f:8:cf:2\ncell:L49:l:1:f:8:cf:2\ncell:M49:l:1:f:8:cf:2\ncell:N49:l:1:f:8:cf:2\ncell:O49:l:1:f:8:cf:2\ncell:P49:l:1:f:8:cf:2\ncell:Q49:l:1:f:8:cf:2\ncell:R49:l:1:f:8:cf:2\ncell:S49:l:1:f:8:cf:2\ncell:L50:l:1:f:8:cf:2\ncell:M50:l:1:f:8:cf:2\ncell:N50:l:1:f:8:cf:2\ncell:O50:l:1:f:8:cf:2\ncell:P50:l:1:f:8:cf:2\ncell:Q50:l:1:f:8:cf:2\ncell:R50:l:1:f:8:cf:2\ncell:S50:l:1:f:8:cf:2\ncell:L51:l:1:f:8:cf:2\ncell:M51:l:1:f:8:cf:2\ncell:N51:l:1:f:8:cf:2\ncell:O51:l:1:f:8:cf:2\ncell:P51:l:1:f:8:cf:2\ncell:Q51:l:1:f:8:cf:2\ncell:R51:l:1:f:8:cf:2\ncell:S51:l:1:f:8:cf:2\ncell:L52:l:1:f:8:cf:2\ncell:M52:l:1:f:8:cf:2\ncell:N52:l:1:f:8:cf:2\ncell:O52:l:1:f:8:cf:2\ncell:P52:l:1:f:8:cf:2\ncell:Q52:l:1:f:8:cf:2\ncell:R52:l:1:f:8:cf:2\ncell:S52:l:1:f:8:cf:2\ncell:L53:l:1:f:8:cf:2\ncell:M53:l:1:f:8:cf:2\ncell:N53:l:1:f:8:cf:2\ncell:O53:l:1:f:8:cf:2\ncell:P53:l:1:f:8:cf:2\ncell:Q53:l:1:f:8:cf:2\ncell:R53:l:1:f:8:cf:2\ncell:S53:l:1:f:8:cf:2\ncell:L54:l:1:f:8:cf:2\ncell:M54:l:1:f:8:cf:2\ncell:N54:l:1:f:8:cf:2\ncell:O54:l:1:f:8:cf:2\ncell:P54:l:1:f:8:cf:2\ncell:Q54:l:1:f:8:cf:2\ncell:R54:l:1:f:8:cf:2\ncell:S54:l:1:f:8:cf:2\ncell:L55:l:1:f:8:cf:2\ncell:M55:l:1:f:8:cf:2\ncell:N55:l:1:f:8:cf:2\ncell:O55:l:1:f:8:cf:2\ncell:P55:l:1:f:8:cf:2\ncell:Q55:l:1:f:8:cf:2\ncell:R55:l:1:f:8:cf:2\ncell:S55:l:1:f:8:cf:2\ncell:L56:l:1:f:8:cf:2\ncell:M56:l:1:f:8:cf:2\ncell:N56:l:1:f:8:cf:2\ncell:O56:l:1:f:8:cf:2\ncell:P56:l:1:f:8:cf:2\ncell:Q56:l:1:f:8:cf:2\ncell:R56:l:1:f:8:cf:2\ncell:S56:l:1:f:8:cf:2\ncell:L57:l:1:f:8:cf:2\ncell:M57:l:1:f:8:cf:2\ncell:N57:l:1:f:8:cf:2\ncell:O57:l:1:f:8:cf:2\ncell:P57:l:1:f:8:cf:2\ncell:Q57:l:1:f:8:cf:2\ncell:R57:l:1:f:8:cf:2\ncell:S57:l:1:f:8:cf:2\ncell:L58:l:1:f:8:cf:2\ncell:M58:l:1:f:8:cf:2\ncell:N58:l:1:f:8:cf:2\ncell:O58:l:1:f:8:cf:2\ncell:P58:l:1:f:8:cf:2\ncell:Q58:l:1:f:8:cf:2\ncell:R58:l:1:f:8:cf:2\ncell:S58:l:1:f:8:cf:2\ncell:L59:l:1:f:8:cf:2\ncell:M59:l:1:f:8:cf:2\ncell:N59:l:1:f:8:cf:2\ncell:O59:l:1:f:8:cf:2\ncell:P59:l:1:f:8:cf:2\ncell:Q59:l:1:f:8:cf:2\ncell:R59:l:1:f:8:cf:2\ncell:S59:l:1:f:8:cf:2\ncell:L60:l:1:f:8:cf:2\ncell:M60:l:1:f:8:cf:2\ncell:N60:l:1:f:8:cf:2\ncell:O60:l:1:f:8:cf:2\ncell:P60:l:1:f:8:cf:2\ncell:Q60:l:1:f:8:cf:2\ncell:R60:l:1:f:8:cf:2\ncell:S60:l:1:f:8:cf:2\ncell:L61:l:1:f:8:cf:2\ncell:M61:l:1:f:8:cf:2\ncell:N61:l:1:f:8:cf:2\ncell:O61:l:1:f:8:cf:2\ncell:P61:l:1:f:8:cf:2\ncell:Q61:l:1:f:8:cf:2\ncell:R61:l:1:f:8:cf:2\ncell:S61:l:1:f:8:cf:2\ncell:L62:l:1:f:8:cf:2\ncell:M62:l:1:f:8:cf:2\ncell:N62:l:1:f:8:cf:2\ncell:O62:l:1:f:8:cf:2\ncell:P62:l:1:f:8:cf:2\ncell:Q62:l:1:f:8:cf:2\ncell:R62:l:1:f:8:cf:2\ncell:S62:l:1:f:8:cf:2\ncell:L63:l:1:f:8:cf:2\ncell:M63:l:1:f:8:cf:2\ncell:N63:l:1:f:8:cf:2\ncell:O63:l:1:f:8:cf:2\ncell:P63:l:1:f:8:cf:2\ncell:Q63:l:1:f:8:cf:2\ncell:R63:l:1:f:8:cf:2\ncell:S63:l:1:f:8:cf:2\ncell:L64:l:1:f:8:cf:2\ncell:M64:l:1:f:8:cf:2\ncell:N64:l:1:f:8:cf:2\ncell:O64:l:1:f:8:cf:2\ncell:P64:l:1:f:8:cf:2\ncell:Q64:l:1:f:8:cf:2\ncell:R64:l:1:f:8:cf:2\ncell:S64:l:1:f:8:cf:2\ncell:L65:l:1:f:8:cf:2\ncell:M65:l:1:f:8:cf:2\ncell:N65:l:1:f:8:cf:2\ncell:O65:l:1:f:8:cf:2\ncell:P65:l:1:f:8:cf:2\ncell:Q65:l:1:f:8:cf:2\ncell:R65:l:1:f:8:cf:2\ncell:S65:l:1:f:8:cf:2\ncell:L66:l:1:f:8:cf:2\ncell:M66:l:1:f:8:cf:2\ncell:N66:l:1:f:8:cf:2\ncell:O66:l:1:f:8:cf:2\ncell:P66:l:1:f:8:cf:2\ncell:Q66:l:1:f:8:cf:2\ncell:R66:l:1:f:8:cf:2\ncell:S66:l:1:f:8:cf:2\ncell:L67:l:1:f:8:cf:2\ncell:M67:l:1:f:8:cf:2\ncell:N67:l:1:f:8:cf:2\ncell:O67:l:1:f:8:cf:2\ncell:P67:l:1:f:8:cf:2\ncell:Q67:l:1:f:8:cf:2\ncell:R67:l:1:f:8:cf:2\ncell:S67:l:1:f:8:cf:2\ncell:L68:l:1:f:8:cf:2\ncell:M68:l:1:f:8:cf:2\ncell:N68:l:1:f:8:cf:2\ncell:O68:l:1:f:8:cf:2\ncell:P68:l:1:f:8:cf:2\ncell:Q68:l:1:f:8:cf:2\ncell:R68:l:1:f:8:cf:2\ncell:S68:l:1:f:8:cf:2\ncell:L69:l:1:f:8:cf:2\ncell:M69:l:1:f:8:cf:2\ncell:N69:l:1:f:8:cf:2\ncell:O69:l:1:f:8:cf:2\ncell:P69:l:1:f:8:cf:2\ncell:Q69:l:1:f:8:cf:2\ncell:R69:l:1:f:8:cf:2\ncell:S69:l:1:f:8:cf:2\ncell:L70:l:1:f:8:cf:2\ncell:M70:l:1:f:8:cf:2\ncell:N70:l:1:f:8:cf:2\ncell:O70:l:1:f:8:cf:2\ncell:P70:l:1:f:8:cf:2\ncell:Q70:l:1:f:8:cf:2\ncell:R70:l:1:f:8:cf:2\ncell:S70:l:1:f:8:cf:2\ncell:L71:l:1:f:8:cf:2\ncell:M71:l:1:f:8:cf:2\ncell:N71:l:1:f:8:cf:2\ncell:O71:l:1:f:8:cf:2\ncell:P71:l:1:f:8:cf:2\ncell:Q71:l:1:f:8:cf:2\ncell:R71:l:1:f:8:cf:2\ncell:S71:l:1:f:8:cf:2\ncell:L72:l:1:f:8:cf:2\ncell:M72:l:1:f:8:cf:2\ncell:N72:l:1:f:8:cf:2\ncell:O72:l:1:f:8:cf:2\ncell:P72:l:1:f:8:cf:2\ncell:Q72:l:1:f:8:cf:2\ncell:R72:l:1:f:8:cf:2\ncell:S72:l:1:f:8:cf:2\ncell:L73:l:1:f:8:cf:2\ncell:M73:l:1:f:8:cf:2\ncell:N73:l:1:f:8:cf:2\ncell:O73:l:1:f:8:cf:2\ncell:P73:l:1:f:8:cf:2\ncell:Q73:l:1:f:8:cf:2\ncell:R73:l:1:f:8:cf:2\ncell:S73:l:1:f:8:cf:2\ncell:L74:l:1:f:8:cf:2\ncell:M74:l:1:f:8:cf:2\ncell:N74:l:1:f:8:cf:2\ncell:O74:l:1:f:8:cf:2\ncell:P74:l:1:f:8:cf:2\ncell:Q74:l:1:f:8:cf:2\ncell:R74:l:1:f:8:cf:2\ncell:S74:l:1:f:8:cf:2\ncell:L75:l:1:f:8:cf:2\ncell:M75:l:1:f:8:cf:2\ncell:N75:l:1:f:8:cf:2\ncell:O75:l:1:f:8:cf:2\ncell:P75:l:1:f:8:cf:2\ncell:Q75:l:1:f:8:cf:2\ncell:R75:l:1:f:8:cf:2\ncell:S75:l:1:f:8:cf:2\ncell:L76:l:1:f:8:cf:2\ncell:M76:l:1:f:8:cf:2\ncell:N76:l:1:f:8:cf:2\ncell:O76:l:1:f:8:cf:2\ncell:P76:l:1:f:8:cf:2\ncell:Q76:l:1:f:8:cf:2\ncell:R76:l:1:f:8:cf:2\ncell:S76:l:1:f:8:cf:2\ncell:L77:l:1:f:8:cf:2\ncell:M77:l:1:f:8:cf:2\ncell:N77:l:1:f:8:cf:2\ncell:O77:l:1:f:8:cf:2\ncell:P77:l:1:f:8:cf:2\ncell:Q77:l:1:f:8:cf:2\ncell:R77:l:1:f:8:cf:2\ncell:S77:l:1:f:8:cf:2\ncell:L78:l:1:f:8:cf:2\ncell:M78:l:1:f:8:cf:2\ncell:N78:l:1:f:8:cf:2\ncell:O78:l:1:f:8:cf:2\ncell:P78:l:1:f:8:cf:2\ncell:Q78:l:1:f:8:cf:2\ncell:R78:l:1:f:8:cf:2\ncell:S78:l:1:f:8:cf:2\ncell:L79:l:1:f:8:cf:2\ncell:M79:l:1:f:8:cf:2\ncell:N79:l:1:f:8:cf:2\ncell:O79:l:1:f:8:cf:2\ncell:P79:l:1:f:8:cf:2\ncell:Q79:l:1:f:8:cf:2\ncell:R79:l:1:f:8:cf:2\ncell:S79:l:1:f:8:cf:2\ncell:L80:l:1:f:8:cf:2\ncell:M80:l:1:f:8:cf:2\ncell:N80:l:1:f:8:cf:2\ncell:O80:l:1:f:8:cf:2\ncell:P80:l:1:f:8:cf:2\ncell:Q80:l:1:f:8:cf:2\ncell:R80:l:1:f:8:cf:2\ncell:S80:l:1:f:8:cf:2\ncell:L81:l:1:f:8:cf:2\ncell:M81:l:1:f:8:cf:2\ncell:N81:l:1:f:8:cf:2\ncell:O81:l:1:f:8:cf:2\ncell:P81:l:1:f:8:cf:2\ncell:Q81:l:1:f:8:cf:2\ncell:R81:l:1:f:8:cf:2\ncell:S81:l:1:f:8:cf:2\ncell:L82:l:1:f:8:cf:2\ncell:M82:l:1:f:8:cf:2\ncell:N82:l:1:f:8:cf:2\ncell:O82:l:1:f:8:cf:2\ncell:P82:l:1:f:8:cf:2\ncell:Q82:l:1:f:8:cf:2\ncell:R82:l:1:f:8:cf:2\ncell:S82:l:1:f:8:cf:2\ncell:L83:l:1:f:8:cf:2\ncell:M83:l:1:f:8:cf:2\ncell:N83:l:1:f:8:cf:2\ncell:O83:l:1:f:8:cf:2\ncell:P83:l:1:f:8:cf:2\ncell:Q83:l:1:f:8:cf:2\ncell:R83:l:1:f:8:cf:2\ncell:S83:l:1:f:8:cf:2\ncell:L84:l:1:f:8:cf:2\ncell:M84:l:1:f:8:cf:2\ncell:N84:l:1:f:8:cf:2\ncell:O84:l:1:f:8:cf:2\ncell:P84:l:1:f:8:cf:2\ncell:Q84:l:1:f:8:cf:2\ncell:R84:l:1:f:8:cf:2\ncell:S84:l:1:f:8:cf:2\ncell:L85:l:1:f:8:cf:2\ncell:M85:l:1:f:8:cf:2\ncell:N85:l:1:f:8:cf:2\ncell:O85:l:1:f:8:cf:2\ncell:P85:l:1:f:8:cf:2\ncell:Q85:l:1:f:8:cf:2\ncell:R85:l:1:f:8:cf:2\ncell:S85:l:1:f:8:cf:2\ncell:L86:l:1:f:8:cf:2\ncell:M86:l:1:f:8:cf:2\ncell:N86:l:1:f:8:cf:2\ncell:O86:l:1:f:8:cf:2\ncell:P86:l:1:f:8:cf:2\ncell:Q86:l:1:f:8:cf:2\ncell:R86:l:1:f:8:cf:2\ncell:S86:l:1:f:8:cf:2\ncell:L87:l:1:f:8:cf:2\ncell:M87:l:1:f:8:cf:2\ncell:N87:l:1:f:8:cf:2\ncell:O87:l:1:f:8:cf:2\ncell:P87:l:1:f:8:cf:2\ncell:Q87:l:1:f:8:cf:2\ncell:R87:l:1:f:8:cf:2\ncell:S87:l:1:f:8:cf:2\ncell:L88:l:1:f:8:cf:2\ncell:M88:l:1:f:8:cf:2\ncell:N88:l:1:f:8:cf:2\ncell:O88:l:1:f:8:cf:2\ncell:P88:l:1:f:8:cf:2\ncell:Q88:l:1:f:8:cf:2\ncell:R88:l:1:f:8:cf:2\ncell:S88:l:1:f:8:cf:2\ncell:L89:l:1:f:8:cf:2\ncell:M89:l:1:f:8:cf:2\ncell:N89:l:1:f:8:cf:2\ncell:O89:l:1:f:8:cf:2\ncell:P89:l:1:f:8:cf:2\ncell:Q89:l:1:f:8:cf:2\ncell:R89:l:1:f:8:cf:2\ncell:S89:l:1:f:8:cf:2\ncell:L90:l:1:f:8:cf:2\ncell:M90:l:1:f:8:cf:2\ncell:N90:l:1:f:8:cf:2\ncell:O90:l:1:f:8:cf:2\ncell:P90:l:1:f:8:cf:2\ncell:Q90:l:1:f:8:cf:2\ncell:R90:l:1:f:8:cf:2\ncell:S90:l:1:f:8:cf:2\ncell:L91:l:1:f:8:cf:2\ncell:M91:l:1:f:8:cf:2\ncell:N91:l:1:f:8:cf:2\ncell:O91:l:1:f:8:cf:2\ncell:P91:l:1:f:8:cf:2\ncell:Q91:l:1:f:8:cf:2\ncell:R91:l:1:f:8:cf:2\ncell:S91:l:1:f:8:cf:2\ncell:L92:l:1:f:8:cf:2\ncell:M92:l:1:f:8:cf:2\ncell:N92:l:1:f:8:cf:2\ncell:O92:l:1:f:8:cf:2\ncell:P92:l:1:f:8:cf:2\ncell:Q92:l:1:f:8:cf:2\ncell:R92:l:1:f:8:cf:2\ncell:S92:l:1:f:8:cf:2\ncell:L93:l:1:f:8:cf:2\ncell:M93:l:1:f:8:cf:2\ncell:N93:l:1:f:8:cf:2\ncell:O93:l:1:f:8:cf:2\ncell:P93:l:1:f:8:cf:2\ncell:Q93:l:1:f:8:cf:2\ncell:R93:l:1:f:8:cf:2\ncell:S93:l:1:f:8:cf:2\ncell:L94:l:1:f:8:cf:2\ncell:M94:l:1:f:8:cf:2\ncell:N94:l:1:f:8:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:S94:l:1:f:8:cf:2\ncell:L95:l:1:f:8:cf:2\ncell:M95:l:1:f:8:cf:2\ncell:N95:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:S95:l:1:f:8:cf:2\ncell:L96:l:1:f:10:cf:2\ncell:M96:l:1:f:10:cf:2\ncell:N96:l:1:f:10:cf:2\ncell:O96:l:1:f:10:cf:2\ncell:P96:l:1:f:10:cf:2\ncell:Q96:l:1:f:10:cf:2\ncell:R96:l:1:f:10:cf:2\ncell:S96:l:1:f:10:cf:2\ncell:L97:l:1:f:10:cf:2\ncell:M97:l:1:f:10:cf:2\ncell:N97:l:1:f:10:cf:2\ncell:O97:l:1:f:10:cf:2\ncell:P97:l:1:f:10:cf:2\ncell:Q97:l:1:f:10:cf:2\ncell:R97:l:1:f:10:cf:2\ncell:S97:l:1:f:10:cf:2\ncell:L98:l:1:f:10:cf:2\ncell:M98:l:1:f:10:cf:2\ncell:N98:l:1:f:10:cf:2\ncell:O98:l:1:f:10:cf:2\ncell:P98:l:1:f:10:cf:2\ncell:Q98:l:1:f:10:cf:2\ncell:R98:l:1:f:10:cf:2\ncell:S98:l:1:f:10:cf:2\ncell:L99:l:1:f:10:cf:2\ncell:M99:l:1:f:10:cf:2\ncell:N99:l:1:f:10:cf:2\ncell:O99:l:1:f:10:cf:2\ncell:P99:l:1:f:10:cf:2\ncell:Q99:l:1:f:10:cf:2\ncell:R99:l:1:f:10:cf:2\ncell:S99:l:1:f:10:cf:2\ncell:A100:l:1:f:10:cf:2\ncell:B100:l:1:f:10:cf:2\ncell:K100:l:1:f:10:cf:2\ncell:L100:l:1:f:10:cf:2\ncell:M100:l:1:f:10:cf:2\ncell:N100:l:1:f:10:cf:2\ncell:O100:l:1:f:10:cf:2\ncell:P100:l:1:f:10:cf:2\ncell:Q100:l:1:f:10:cf:2\ncell:R100:l:1:f:10:cf:2\ncell:S100:l:1:f:10:cf:2\ncell:A101:l:1:f:10:cf:2\ncell:B101:l:1:f:10:cf:2\ncell:K101:l:1:f:10:cf:2\ncell:L101:l:1:f:10:cf:2\ncell:M101:l:1:f:10:cf:2\ncell:N101:l:1:f:10:cf:2\ncell:O101:l:1:f:10:cf:2\ncell:P101:l:1:f:10:cf:2\ncell:Q101:l:1:f:10:cf:2\ncell:R101:l:1:f:10:cf:2\ncell:S101:l:1:f:10:cf:2\ncell:A102:l:1:f:10:cf:2\ncell:B102:l:1:f:10:cf:2\ncell:K102:l:1:f:10:cf:2\ncell:L102:l:1:f:10:cf:2\ncell:M102:l:1:f:10:cf:2\ncell:N102:l:1:f:10:cf:2\ncell:O102:l:1:f:10:cf:2\ncell:P102:l:1:f:10:cf:2\ncell:Q102:l:1:f:10:cf:2\ncell:R102:l:1:f:10:cf:2\ncell:S102:l:1:f:10:cf:2\ncell:A103:l:1:f:10:cf:2\ncell:B103:l:1:f:10:cf:2\ncell:K103:l:1:f:10:cf:2\ncell:L103:l:1:f:10:cf:2\ncell:M103:l:1:f:10:cf:2\ncell:N103:l:1:f:10:cf:2\ncell:O103:l:1:f:10:cf:2\ncell:P103:l:1:f:10:cf:2\ncell:Q103:l:1:f:10:cf:2\ncell:R103:l:1:f:10:cf:2\ncell:S103:l:1:f:10:cf:2\ncell:A104:l:1:f:10:cf:2\ncell:B104:l:1:f:10:cf:2\ncell:K104:l:1:f:10:cf:2\ncell:L104:l:1:f:10:cf:2\ncell:M104:l:1:f:10:cf:2\ncell:N104:l:1:f:10:cf:2\ncell:O104:l:1:f:10:cf:2\ncell:P104:l:1:f:10:cf:2\ncell:Q104:l:1:f:10:cf:2\ncell:R104:l:1:f:10:cf:2\ncell:S104:l:1:f:10:cf:2\ncell:A105:l:1:f:10:cf:2\ncell:B105:l:1:f:10:cf:2\ncell:K105:l:1:f:10:cf:2\ncell:L105:l:1:f:10:cf:2\ncell:M105:l:1:f:10:cf:2\ncell:N105:l:1:f:10:cf:2\ncell:O105:l:1:f:10:cf:2\ncell:P105:l:1:f:10:cf:2\ncell:Q105:l:1:f:10:cf:2\ncell:R105:l:1:f:10:cf:2\ncell:S105:l:1:f:10:cf:2\ncell:A106:l:1:f:10:cf:2\ncell:B106:l:1:f:10:cf:2\ncell:K106:l:1:f:10:cf:2\ncell:L106:l:1:f:10:cf:2\ncell:M106:l:1:f:10:cf:2\ncell:N106:l:1:f:10:cf:2\ncell:O106:l:1:f:10:cf:2\ncell:P106:l:1:f:10:cf:2\ncell:Q106:l:1:f:10:cf:2\ncell:R106:l:1:f:10:cf:2\ncell:S106:l:1:f:10:cf:2\ncell:A107:l:1:f:10:cf:2\ncell:B107:l:1:f:10:cf:2\ncell:K107:l:1:f:10:cf:2\ncell:L107:l:1:f:10:cf:2\ncell:M107:l:1:f:10:cf:2\ncell:N107:l:1:f:10:cf:2\ncell:O107:l:1:f:10:cf:2\ncell:P107:l:1:f:10:cf:2\ncell:Q107:l:1:f:10:cf:2\ncell:R107:l:1:f:10:cf:2\ncell:S107:l:1:f:10:cf:2\ncell:A108:l:1:f:10:cf:2\ncell:B108:l:1:f:10:cf:2\ncell:K108:l:1:f:10:cf:2\ncell:L108:l:1:f:10:cf:2\ncell:M108:l:1:f:10:cf:2\ncell:N108:l:1:f:10:cf:2\ncell:O108:l:1:f:10:cf:2\ncell:P108:l:1:f:10:cf:2\ncell:Q108:l:1:f:10:cf:2\ncell:R108:l:1:f:10:cf:2\ncell:S108:l:1:f:10:cf:2\ncell:A109:l:1:f:10:cf:2\ncell:B109:l:1:f:10:cf:2\ncell:K109:l:1:f:10:cf:2\ncell:L109:l:1:f:10:cf:2\ncell:M109:l:1:f:10:cf:2\ncell:N109:l:1:f:10:cf:2\ncell:O109:l:1:f:10:cf:2\ncell:P109:l:1:f:10:cf:2\ncell:Q109:l:1:f:10:cf:2\ncell:R109:l:1:f:10:cf:2\ncell:S109:l:1:f:10:cf:2\ncell:A110:l:1:f:10:cf:2\ncell:B110:l:1:f:10:cf:2\ncell:K110:l:1:f:10:cf:2\ncell:L110:l:1:f:10:cf:2\ncell:M110:l:1:f:10:cf:2\ncell:N110:l:1:f:10:cf:2\ncell:O110:l:1:f:10:cf:2\ncell:P110:l:1:f:10:cf:2\ncell:Q110:l:1:f:10:cf:2\ncell:R110:l:1:f:10:cf:2\ncell:S110:l:1:f:10:cf:2\ncell:A111:l:1:f:10:cf:2\ncell:B111:l:1:f:10:cf:2\ncell:K111:l:1:f:10:cf:2\ncell:L111:l:1:f:10:cf:2\ncell:M111:l:1:f:10:cf:2\ncell:N111:l:1:f:10:cf:2\ncell:O111:l:1:f:10:cf:2\ncell:P111:l:1:f:10:cf:2\ncell:Q111:l:1:f:10:cf:2\ncell:R111:l:1:f:10:cf:2\ncell:S111:l:1:f:10:cf:2\ncol:A:w:10\ncol:B:w:10\ncol:C:w:164\ncol:D:w:90\ncol:E:w:90\ncol:F:w:10\ncol:G:w:10\ncol:H:w:50\ncol:I:w:12\ncol:J:w:95\ncol:K:w:91\ncol:L:w:11\ncol:M:w:64\ncol:N:w:64\ncol:O:w:64\ncol:P:w:64\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:V:w:64\ncol:W:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:30\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:18.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:15\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nsheet:c:23:r:111:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,204)\ncolor:3:rgb(119,136,221)\ncolor:4:rgb(136,204,119)\ncolor:5:rgb(204,119,136)\ncolor:6:rgb(230,230,250)\ncolor:7:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 24pt Arial\nfont:6:normal bold 9pt Arial\nfont:7:normal normal * Arial\nfont:8:normal normal 10pt Arial\nfont:9:normal normal 12pt Arial\nfont:10:normal normal 7pt Arial\nfont:11:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:6px * 6px *;vertical-align:bottom;\nlayout:4:padding:6px * 6px 8px;vertical-align:bottom;\nlayout:5:padding:6px 4px 6px 12px;vertical-align:bottom;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\nname:COMPARISON::O37\\cQ51\nname:TRACKING::Y37\\cAA51\n', - }, - name: "income", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:8:cf:2:ntvf:2\ncell:B1:l:1:f:8:cf:2\ncell:C1:l:1:f:8:cf:2\ncell:D1:l:1:f:8:cf:2\ncell:E1:l:1:f:8:cf:2\ncell:F1:l:1:f:8:cf:2\ncell:G1:l:1:f:8:cf:2\ncell:H1:l:1:f:8:cf:2\ncell:I1:l:1:f:8:cf:2\ncell:J1:l:1:f:8:cf:2\ncell:K1:l:1:f:8:cf:2\ncell:L1:l:1:f:8:cf:2\ncell:M1:l:1:f:8:cf:2\ncell:N1:l:1:f:8:cf:2\ncell:O1:l:1:f:8:cf:2\ncell:P1:l:1:f:8:cf:2\ncell:Q1:l:1:f:8:cf:2\ncell:R1:l:1:f:8:cf:2\ncell:S1:l:1:f:8:cf:2\ncell:T1:l:1:f:8:cf:2\ncell:U1:l:1:f:8:cf:2\ncell:V1:l:1:f:8:cf:2\ncell:W1:l:1:f:8:cf:2\ncell:A2:l:1:f:8:cf:2\ncell:B2:l:1:f:8:cf:2\ncell:C2:l:1:f:8:cf:2\ncell:D2:l:1:f:8:cf:2\ncell:E2:l:1:f:8:cf:2\ncell:F2:l:1:f:8:cf:2\ncell:G2:l:1:f:8:cf:2\ncell:H2:l:1:f:8:cf:2\ncell:I2:l:1:f:8:cf:2\ncell:J2:l:1:f:8:cf:2\ncell:K2:l:1:f:8:cf:2\ncell:L2:l:1:f:8:cf:2\ncell:M2:l:1:f:8:cf:2\ncell:N2:l:1:f:8:cf:2\ncell:O2:l:1:f:8:cf:2\ncell:P2:l:1:f:8:cf:2\ncell:Q2:l:1:f:8:cf:2\ncell:R2:l:1:f:8:cf:2\ncell:S2:l:1:f:8:cf:2\ncell:T2:l:1:f:8:cf:2\ncell:U2:l:1:f:8:cf:2\ncell:V2:l:1:f:8:cf:2\ncell:W2:l:1:f:8:cf:2\ncell:A3:l:1:f:8:cf:2\ncell:B3:l:1:f:8:cf:2\ncell:C3:l:1:f:8:cf:2\ncell:D3:l:1:f:8:cf:2\ncell:G3:l:1:f:8:cf:2\ncell:H3:l:1:f:8:cf:2\ncell:I3:l:1:f:8:cf:2\ncell:J3:l:1:f:8:cf:2\ncell:K3:l:1:f:8:cf:2\ncell:L3:l:1:f:8:cf:2\ncell:M3:l:1:f:8:cf:2\ncell:N3:l:1:f:8:cf:2\ncell:O3:l:1:f:8:cf:2\ncell:P3:l:1:f:8:cf:2\ncell:Q3:t: :l:1:f:8:cf:2\ncell:R3:l:1:f:8:cf:2\ncell:S3:l:1:f:8:cf:2\ncell:T3:l:1:f:8:cf:2\ncell:U3:l:1:f:8:cf:2\ncell:V3:l:1:f:8:cf:2\ncell:W3:l:1:f:8:cf:2\ncell:B4:t:Expenses:l:2:f:4:c:1:bg:5:cf:2:colspan:3\ncell:C4:l:2:f:5:c:1:bg:5:cf:2\ncell:E4:t:Date:l:1:f:9:cf:1\ncell:F4:vtf:ndt:41131.96254792824:NOW():l:1:f:9:bg:4:cf:3:ntvf:3\ncell:O4:l:1:f:8:cf:2\ncell:P4:l:1:f:8:cf:2\ncell:Q4:l:1:f:8:cf:2\ncell:R4:l:1:f:8:cf:2\ncell:S4:l:1:f:8:cf:2\ncell:T4:l:1:f:8:cf:2\ncell:U4:l:1:f:8:cf:2\ncell:V4:l:1:f:8:cf:2\ncell:W4:l:1:f:8:cf:2\ncell:O5:t::l:2:f:8:cf:2\ncell:P5:t::l:2:f:8:cf:2\ncell:Q5:t::l:2:f:8:cf:2\ncell:R5:t::l:2:f:8:cf:2\ncell:S5:t::l:2:f:8:cf:2\ncell:T5:l:1:f:8:cf:2\ncell:U5:l:1:f:8:cf:2\ncell:V5:l:1:f:8:cf:2\ncell:W5:l:1:f:8:cf:2\ncell:B6:l:2:f:3:cf:2:colspan:3\ncell:C6:l:2:f:3:bg:4:cf:2\ncell:D6:t:Source:l:2:f:2:bg:4:cf:1\ncell:E6:t:Monthly Budget:b:2:2:2:2:l:2:f:2:c:5:bg:3:cf:1\ncell:F6:t:Yearly Budget:b:2:2:2:2:l:2:f:2:c:5:bg:2:cf:1\ncell:O6:t::l:2:f:3:cf:2\ncell:P6:t::l:2:f:8:cf:2\ncell:Q6:t::l:2:f:8:cf:2\ncell:R6:t::l:2:f:8:cf:2\ncell:S6:l:1:f:8:cf:2\ncell:T6:l:1:f:8:cf:2\ncell:U6:l:1:f:8:cf:2\ncell:V6:l:1:f:8:cf:2\ncell:W6:l:1:f:8:cf:2\ncell:B7:t:Housing:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:2:colspan:3\ncell:C7:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:2\ncell:D7:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:1\ncell:E7:vtf:n:1380:E8+E14+E21+E24:b:2:2:2:2:l:4:f:2:c:5:bg:2:ntvf:1\ncell:F7:vtf:n:16560:IF( (E7*12)=0,"",(E7*12)):b:2:2:2:2:l:4:f:2:c:5:bg:2:ntvf:1\ncell:G7:b::::1\ncell:O7:l:2:f:3:cf:2\ncell:P7:l:2:f:8:cf:2\ncell:Q7:l:2:f:8:cf:2\ncell:R7:l:2:f:8:cf:2\ncell:S7:l:1:f:8:cf:2\ncell:T7:l:1:f:8:cf:2\ncell:U7:l:1:f:8:cf:2\ncell:V7:l:1:f:8:cf:2\ncell:W7:l:1:f:8:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:c:1:bg:6\ncell:C8:t:Home:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D8:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E8:vtf:n:818:SUM(E9\\cE13):b::1:1:1:l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F8:vtf:n:9816:IF( (E8*12)=0,"",(E8*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:8:cf:2\ncell:P8:l:1:f:8:cf:2\ncell:Q8:l:1:f:8:cf:2\ncell:R8:l:1:f:8:cf:2\ncell:S8:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:T8:t::l:1:f:8:cf:2\ncell:U8:l:1:f:8:cf:2\ncell:V8:l:1:f:8:cf:2\ncell:W8:l:1:f:8:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:8:cf:2\ncell:C9:l:3:f:8:cf:2\ncell:D9:t:Mortgage/Rent:l:3:f:7:cf:2\ncell:E9:v:818:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F9:vtf:n:9816:IF( (E9*12)=0,"",(E9*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:t::l:1:f:8:cf:2\ncell:P9:t::l:1:f:8:cf:2\ncell:Q9:t::l:1:f:8:cf:2\ncell:R9:l:1:f:8:cf:2\ncell:S9:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:T9:t::l:1:f:8:cf:2\ncell:U9:l:1:f:8:cf:2\ncell:V9:l:1:f:8:cf:2\ncell:W9:l:1:f:8:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:8:bg:4:cf:2\ncell:C10:l:3:f:8:bg:4:cf:2\ncell:D10:t:Property Tax:l:3:f:7:bg:4:cf:2\ncell:E10:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:8:cf:2\ncell:P10:l:1:f:8:cf:2\ncell:Q10:l:1:f:8:cf:2\ncell:R10:l:1:f:8:cf:2\ncell:S10:l:1:f:8:cf:2\ncell:T10:l:1:f:8:cf:2\ncell:U10:l:1:f:8:cf:2\ncell:V10:l:1:f:8:cf:2\ncell:W10:l:1:f:8:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:8:cf:2\ncell:C11:l:3:f:8:cf:2\ncell:D11:t:Insurance:l:3:f:7:cf:2\ncell:E11:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:8:cf:2\ncell:P11:l:1:f:8:cf:2\ncell:Q11:l:1:f:8:cf:2\ncell:R11:l:1:f:8:cf:2\ncell:S11:l:1:f:8:cf:2\ncell:T11:l:1:f:8:cf:2\ncell:U11:l:1:f:8:cf:2\ncell:V11:l:1:f:8:cf:2\ncell:W11:l:1:f:8:cf:2\ncell:A12:b::1::\ncell:B12:b::::1:l:3:f:8:bg:4:cf:2\ncell:C12:l:3:f:8:bg:4:cf:2\ncell:D12:t:Maintenance:l:3:f:7:bg:4:cf:2\ncell:E12:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F12:vtf:t::IF( (E12*12)=0,"",(E12*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G12:b::::1\ncell:O12:l:2:f:3:cf:2\ncell:P12:l:1:f:8:cf:2\ncell:Q12:l:1:f:8:cf:2\ncell:R12:l:1:f:8:cf:2\ncell:S12:l:1:f:8:cf:2\ncell:T12:l:1:f:8:cf:2\ncell:U12:l:1:f:8:cf:2\ncell:V12:l:1:f:8:cf:2\ncell:W12:l:1:f:8:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:8:cf:2\ncell:C13:l:3:f:8:cf:2\ncell:D13:t:Other:b::1:::l:3:f:7:cf:2\ncell:E13:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F13:vtf:t::IF( (E13*12)=0,"",(E13*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:8:cf:2\ncell:P13:l:1:f:8:cf:2\ncell:Q13:l:1:f:8:cf:2\ncell:R13:l:1:f:8:cf:2\ncell:S13:l:1:f:8:cf:2\ncell:T13:l:1:f:8:cf:2\ncell:U13:l:1:f:8:cf:2\ncell:V13:l:1:f:8:cf:2\ncell:W13:l:1:f:8:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:c:1:bg:6\ncell:C14:t:Utilities:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D14:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E14:vtf:n:305:SUM(E15\\cE20):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F14:vtf:n:3660:IF( (E14*12)=0,"",(E14*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:8:cf:2\ncell:P14:l:1:f:8:cf:2\ncell:Q14:l:1:f:8:cf:2\ncell:R14:l:1:f:8:cf:2\ncell:S14:l:1:f:8:cf:2\ncell:T14:l:1:f:8:cf:2\ncell:U14:l:1:f:8:cf:2\ncell:V14:l:1:f:8:cf:2\ncell:W14:l:1:f:8:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:8:cf:2\ncell:C15:l:3:f:8:cf:2\ncell:D15:t:Gas, Electricity, Oil:l:3:f:7:cf:2\ncell:E15:v:305:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F15:vtf:n:3660:IF( (E15*12)=0,"",(E15*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:8:cf:2\ncell:P15:l:1:f:8:cf:2\ncell:Q15:l:1:f:8:cf:2\ncell:R15:l:1:f:8:cf:2\ncell:S15:l:1:f:8:cf:2\ncell:T15:l:1:f:8:cf:2\ncell:U15:l:1:f:8:cf:2\ncell:V15:l:1:f:8:cf:2\ncell:W15:l:1:f:8:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:8:bg:4:cf:2\ncell:C16:l:3:f:8:bg:4:cf:2\ncell:D16:t:Water, Sewer, Garbage & Other:l:3:f:7:bg:4:cf:2\ncell:E16:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:8:cf:2\ncell:P16:l:1:f:8:cf:2\ncell:Q16:l:1:f:8:cf:2\ncell:R16:l:1:f:8:cf:2\ncell:S16:l:1:f:8:cf:2\ncell:T16:l:1:f:8:cf:2\ncell:U16:l:1:f:8:cf:2\ncell:V16:l:1:f:8:cf:2\ncell:W16:l:1:f:8:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:8:cf:2\ncell:C17:l:3:f:8:cf:2\ncell:D17:t:TV - Cable, Dish, Other:l:3:f:7:cf:2\ncell:E17:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:8:cf:2\ncell:P17:l:1:f:8:cf:2\ncell:Q17:l:1:f:8:cf:2\ncell:R17:l:1:f:8:cf:2\ncell:S17:l:1:f:8:cf:2\ncell:T17:l:1:f:8:cf:2\ncell:U17:l:1:f:8:cf:2\ncell:V17:l:1:f:8:cf:2\ncell:W17:l:1:f:8:cf:2\ncell:A18:b::1::\ncell:B18:b::::1:l:3:f:8:bg:4:cf:2\ncell:C18:l:3:f:8:bg:4:cf:2\ncell:D18:t:Phone:l:3:f:7:bg:4:cf:2\ncell:E18:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F18:vtf:t::IF( (E18*12)=0,"",(E18*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G18:b::::1\ncell:O18:l:1:f:8:cf:2\ncell:P18:l:1:f:8:cf:2\ncell:Q18:l:1:f:8:cf:2\ncell:R18:l:1:f:8:cf:2\ncell:S18:l:1:f:8:cf:2\ncell:T18:l:1:f:8:cf:2\ncell:U18:l:1:f:8:cf:2\ncell:V18:l:1:f:8:cf:2\ncell:W18:l:1:f:8:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:8:cf:2\ncell:C19:l:3:f:8:cf:2\ncell:D19:t:Internet:l:3:f:7:cf:2\ncell:E19:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F19:vtf:t::IF( (E19*12)=0,"",(E19*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:8:cf:2\ncell:P19:l:1:f:8:cf:2\ncell:Q19:l:1:f:8:cf:2\ncell:R19:l:1:f:8:cf:2\ncell:S19:l:1:f:8:cf:2\ncell:T19:l:1:f:8:cf:2\ncell:U19:l:1:f:8:cf:2\ncell:V19:l:1:f:8:cf:2\ncell:W19:l:1:f:8:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:8:bg:4:cf:2\ncell:C20:l:3:f:8:bg:4:cf:2\ncell:D20:t:Other:l:3:f:7:bg:4:cf:2\ncell:E20:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:8:cf:2\ncell:P20:l:1:f:8:cf:2\ncell:Q20:l:1:f:8:cf:2\ncell:R20:l:1:f:8:cf:2\ncell:S20:l:1:f:8:cf:2\ncell:T20:l:1:f:8:cf:2\ncell:U20:l:1:f:8:cf:2\ncell:V20:l:1:f:8:cf:2\ncell:W20:l:1:f:8:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:c:1:bg:6\ncell:C21:t:Personal Services:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D21:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E21:vtf:n:84:SUM(E22\\cE23):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F21:vtf:n:1008:IF( (E21*12)=0,"",(E21*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:8:cf:2\ncell:P21:l:1:f:8:cf:2\ncell:Q21:l:1:f:8:cf:2\ncell:R21:l:1:f:8:cf:2\ncell:S21:l:1:f:8:cf:2\ncell:T21:l:1:f:8:cf:2\ncell:U21:l:1:f:8:cf:2\ncell:V21:l:1:f:8:cf:2\ncell:W21:l:1:f:8:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:8:cf:2\ncell:C22:l:3:f:8:cf:2\ncell:D22:t:Childcare:l:3:f:7:cf:2\ncell:E22:v:84:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F22:vtf:n:1008:IF( (E22*12)=0,"",(E22*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G22:b::::1\ncell:O22:l:1:f:8:cf:2\ncell:P22:l:1:f:8:cf:2\ncell:Q22:l:1:f:8:cf:2\ncell:R22:l:1:f:8:cf:2\ncell:S22:l:1:f:8:cf:2\ncell:T22:l:1:f:8:cf:2\ncell:U22:l:1:f:8:cf:2\ncell:V22:l:1:f:8:cf:2\ncell:W22:l:1:f:8:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:8:bg:4:cf:2\ncell:C23:l:3:f:8:bg:4:cf:2\ncell:D23:t:Elderly Care & Other:l:3:f:7:bg:4:cf:2\ncell:E23:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:8:cf:2\ncell:P23:l:1:f:8:cf:2\ncell:Q23:l:1:f:8:cf:2\ncell:R23:l:1:f:8:cf:2\ncell:S23:l:1:f:8:cf:2\ncell:T23:l:1:f:8:cf:2\ncell:U23:l:1:f:8:cf:2\ncell:V23:l:1:f:8:cf:2\ncell:W23:l:1:f:8:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:c:1:bg:6\ncell:C24:t:Other Household Expenses:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D24:t::b::1:1::l:3:f:2:c:1:bg:6:cf:2\ncell:E24:vtf:n:173:SUM(E25\\cE31):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F24:vtf:n:2076:IF( (E24*12)=0,"",(E24*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:8:cf:2\ncell:P24:l:1:f:8:cf:2\ncell:Q24:l:1:f:8:cf:2\ncell:R24:l:1:f:8:cf:2\ncell:S24:l:1:f:8:cf:2\ncell:T24:l:1:f:8:cf:2\ncell:U24:l:1:f:8:cf:2\ncell:V24:l:1:f:8:cf:2\ncell:W24:l:1:f:8:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:8:cf:2\ncell:C25:l:3:f:8:cf:2\ncell:D25:t:Gardening & Lawncare:l:3:f:7:cf:2\ncell:E25:v:173:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F25:vtf:n:2076:IF( (E25*12)=0,"",(E25*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G25:b::::1\ncell:O25:l:1:f:8:cf:2\ncell:P25:l:1:f:8:cf:2\ncell:Q25:l:1:f:8:cf:2\ncell:R25:l:1:f:8:cf:2\ncell:S25:l:1:f:8:cf:2\ncell:T25:l:1:f:8:cf:2\ncell:U25:l:1:f:8:cf:2\ncell:V25:l:1:f:8:cf:2\ncell:W25:l:1:f:8:cf:2\ncell:A26:b::1::\ncell:B26:b::::1:l:3:f:8:bg:4:cf:2\ncell:C26:l:3:f:8:bg:4:cf:2\ncell:D26:t:Laundry & Cleaning:l:3:f:7:bg:4:cf:2\ncell:E26:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F26:vtf:t::IF( (E26*12)=0,"",(E26*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G26:b::::1\ncell:O26:l:1:f:8:cf:2\ncell:P26:l:1:f:8:cf:2\ncell:Q26:l:1:f:8:cf:2\ncell:R26:l:1:f:8:cf:2\ncell:S26:l:1:f:8:cf:2\ncell:T26:l:1:f:8:cf:2\ncell:U26:l:1:f:8:cf:2\ncell:V26:l:1:f:8:cf:2\ncell:W26:l:1:f:8:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:8:cf:2\ncell:C27:l:3:f:8:cf:2\ncell:D27:t:Household Supplies:l:3:f:7:cf:2\ncell:E27:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F27:vtf:t::IF( (E27*12)=0,"",(E27*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:8:cf:2\ncell:P27:l:1:f:8:cf:2\ncell:Q27:l:1:f:8:cf:2\ncell:R27:l:1:f:8:cf:2\ncell:S27:l:1:f:8:cf:2\ncell:T27:l:1:f:8:cf:2\ncell:U27:l:1:f:8:cf:2\ncell:V27:l:1:f:8:cf:2\ncell:W27:l:1:f:8:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:8:bg:4:cf:2\ncell:C28:l:3:f:8:bg:4:cf:2\ncell:D28:t:Furniture:l:3:f:7:bg:4:cf:2\ncell:E28:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:8:cf:2\ncell:P28:l:1:f:8:cf:2\ncell:Q28:l:1:f:8:cf:2\ncell:R28:l:1:f:8:cf:2\ncell:S28:l:1:f:8:cf:2\ncell:T28:l:1:f:8:cf:2\ncell:U28:l:1:f:8:cf:2\ncell:V28:l:1:f:8:cf:2\ncell:W28:l:1:f:8:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:8:cf:2\ncell:C29:l:3:f:8:cf:2\ncell:D29:t:Appliances & Equipment:l:3:f:7:cf:2\ncell:E29:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:8:cf:2\ncell:P29:l:1:f:8:cf:2\ncell:Q29:l:1:f:8:cf:2\ncell:R29:l:1:f:8:cf:2\ncell:S29:l:1:f:8:cf:2\ncell:T29:l:1:f:8:cf:2\ncell:U29:l:1:f:8:cf:2\ncell:V29:l:1:f:8:cf:2\ncell:W29:l:1:f:8:cf:2\ncell:A30:b::1::\ncell:B30:b::::1:l:3:f:8:bg:4:cf:2\ncell:C30:l:3:f:8:bg:4:cf:2\ncell:D30:t:Security Services:l:3:f:7:bg:4:cf:2\ncell:E30:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G30:b::::1\ncell:O30:l:1:f:8:cf:2\ncell:P30:l:1:f:8:cf:2\ncell:Q30:l:1:f:8:cf:2\ncell:R30:l:1:f:8:cf:2\ncell:S30:l:1:f:8:cf:2\ncell:T30:l:1:f:8:cf:2\ncell:U30:l:1:f:8:cf:2\ncell:V30:l:1:f:8:cf:2\ncell:W30:l:1:f:8:cf:2\ncell:A31:b::1::\ncell:B31:b:::1:1:l:3:f:8:cf:2\ncell:C31:b:::1::l:3:f:8:cf:2\ncell:D31:t:Other:b:::1::l:3:f:7:cf:2\ncell:E31:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b::1:1::l:4:f:7:cf:3:ntvf:1\ncell:G31:b::::1\ncell:O31:l:1:f:8:cf:2\ncell:P31:l:1:f:8:cf:2\ncell:Q31:l:1:f:8:cf:2\ncell:R31:l:1:f:8:cf:2\ncell:S31:l:1:f:8:cf:2\ncell:T31:l:1:f:8:cf:2\ncell:U31:l:1:f:8:cf:2\ncell:V31:l:1:f:8:cf:2\ncell:W31:l:1:f:8:cf:2\ncell:B32:b:1:::\ncell:C32:b:1:::\ncell:D32:b:1:::\ncell:E32:b:1:::\ncell:F32:b:1:::\ncell:O32:l:1:f:8:cf:2\ncell:P32:l:1:f:8:cf:2\ncell:Q32:l:1:f:8:cf:2\ncell:R32:l:1:f:8:cf:2\ncell:S32:l:1:f:8:cf:2\ncell:T32:l:1:f:8:cf:2\ncell:U32:l:1:f:8:cf:2\ncell:V32:l:1:f:8:cf:2\ncell:W32:l:1:f:8:cf:2\ncell:O33:l:1:f:8:cf:2\ncell:P33:l:1:f:8:cf:2\ncell:Q33:l:1:f:8:cf:2\ncell:R33:l:1:f:8:cf:2\ncell:S33:l:1:f:8:cf:2\ncell:T33:l:1:f:8:cf:2\ncell:U33:l:1:f:8:cf:2\ncell:V33:l:1:f:8:cf:2\ncell:W33:l:1:f:8:cf:2\ncell:O34:l:1:f:8:cf:2\ncell:P34:l:1:f:8:cf:2\ncell:Q34:l:1:f:8:cf:2\ncell:R34:l:1:f:8:cf:2\ncell:S34:l:1:f:8:cf:2\ncell:T34:l:1:f:8:cf:2\ncell:U34:l:1:f:8:cf:2\ncell:V34:l:1:f:8:cf:2\ncell:W34:l:1:f:8:cf:2\ncell:O35:l:1:f:8:cf:2\ncell:P35:l:1:f:8:cf:2\ncell:Q35:l:1:f:8:cf:2\ncell:R35:l:1:f:8:cf:2\ncell:S35:l:1:f:8:cf:2\ncell:T35:l:1:f:8:cf:2\ncell:U35:l:1:f:8:cf:2\ncell:V35:l:1:f:8:cf:2\ncell:W35:l:1:f:8:cf:2\ncell:O36:l:1:f:8:cf:2\ncell:P36:l:1:f:8:cf:2\ncell:Q36:l:1:f:8:cf:2\ncell:R36:l:1:f:8:cf:2\ncell:S36:l:1:f:8:cf:2\ncell:T36:l:1:f:8:cf:2\ncell:U36:l:1:f:8:cf:2\ncell:V36:l:1:f:8:cf:2\ncell:W36:l:1:f:8:cf:2\ncell:O37:l:1:f:8:cf:2\ncell:P37:l:1:f:8:cf:2\ncell:Q37:l:1:f:8:cf:2\ncell:R37:l:1:f:8:cf:2\ncell:S37:l:1:f:8:cf:2\ncell:T37:l:1:f:8:cf:2\ncell:U37:l:1:f:8:cf:2\ncell:V37:l:1:f:8:cf:2\ncell:W37:l:1:f:8:cf:2\ncell:O38:l:1:f:8:cf:2\ncell:P38:l:1:f:8:cf:2\ncell:Q38:l:1:f:8:cf:2\ncell:R38:l:1:f:8:cf:2\ncell:S38:l:1:f:8:cf:2\ncell:T38:l:1:f:8:cf:2\ncell:U38:l:1:f:8:cf:2\ncell:V38:l:1:f:8:cf:2\ncell:W38:l:1:f:8:cf:2\ncell:O39:l:1:f:8:cf:2\ncell:P39:l:1:f:8:cf:2\ncell:Q39:l:1:f:8:cf:2\ncell:R39:l:1:f:8:cf:2\ncell:S39:l:1:f:8:cf:2\ncell:T39:l:1:f:8:cf:2\ncell:U39:l:1:f:8:cf:2\ncell:V39:l:1:f:8:cf:2\ncell:W39:l:1:f:8:cf:2\ncell:O40:l:1:f:8:cf:2\ncell:P40:l:1:f:8:cf:2\ncell:Q40:l:1:f:8:cf:2\ncell:R40:l:1:f:8:cf:2\ncell:S40:l:1:f:8:cf:2\ncell:T40:l:1:f:8:cf:2\ncell:U40:l:1:f:8:cf:2\ncell:V40:l:1:f:8:cf:2\ncell:W40:l:1:f:8:cf:2\ncell:O41:l:1:f:8:cf:2\ncell:P41:l:1:f:8:cf:2\ncell:Q41:l:1:f:8:cf:2\ncell:R41:l:1:f:8:cf:2\ncell:S41:l:1:f:8:cf:2\ncell:T41:l:1:f:8:cf:2\ncell:U41:l:1:f:8:cf:2\ncell:V41:l:1:f:8:cf:2\ncell:W41:l:1:f:8:cf:2\ncell:O42:l:1:f:8:cf:2\ncell:P42:l:1:f:8:cf:2\ncell:Q42:l:1:f:8:cf:2\ncell:R42:l:1:f:8:cf:2\ncell:S42:l:1:f:8:cf:2\ncell:T42:l:1:f:8:cf:2\ncell:U42:l:1:f:8:cf:2\ncell:V42:l:1:f:8:cf:2\ncell:W42:l:1:f:8:cf:2\ncell:O43:l:1:f:8:cf:2\ncell:P43:l:1:f:8:cf:2\ncell:Q43:l:1:f:8:cf:2\ncell:R43:l:1:f:8:cf:2\ncell:S43:l:1:f:8:cf:2\ncell:T43:l:1:f:8:cf:2\ncell:U43:l:1:f:8:cf:2\ncell:V43:l:1:f:8:cf:2\ncell:W43:l:1:f:8:cf:2\ncell:O44:l:1:f:8:cf:2\ncell:P44:l:1:f:8:cf:2\ncell:Q44:l:1:f:8:cf:2\ncell:R44:l:1:f:8:cf:2\ncell:S44:l:1:f:8:cf:2\ncell:T44:l:1:f:8:cf:2\ncell:U44:l:1:f:8:cf:2\ncell:V44:l:1:f:8:cf:2\ncell:W44:l:1:f:8:cf:2\ncell:O45:l:1:f:8:cf:2\ncell:P45:l:1:f:8:cf:2\ncell:Q45:l:1:f:8:cf:2\ncell:R45:l:1:f:8:cf:2\ncell:S45:l:1:f:8:cf:2\ncell:T45:l:1:f:8:cf:2\ncell:U45:l:1:f:8:cf:2\ncell:V45:l:1:f:8:cf:2\ncell:W45:l:1:f:8:cf:2\ncell:O46:l:1:f:8:cf:2\ncell:P46:l:1:f:8:cf:2\ncell:Q46:l:1:f:8:cf:2\ncell:R46:l:1:f:8:cf:2\ncell:S46:l:1:f:8:cf:2\ncell:T46:l:1:f:8:cf:2\ncell:U46:l:1:f:8:cf:2\ncell:V46:l:1:f:8:cf:2\ncell:W46:l:1:f:8:cf:2\ncell:O47:l:1:f:8:cf:2\ncell:P47:l:1:f:8:cf:2\ncell:Q47:l:1:f:8:cf:2\ncell:R47:l:1:f:8:cf:2\ncell:S47:l:1:f:8:cf:2\ncell:T47:l:1:f:8:cf:2\ncell:U47:l:1:f:8:cf:2\ncell:V47:l:1:f:8:cf:2\ncell:W47:l:1:f:8:cf:2\ncell:O48:l:1:f:8:cf:2\ncell:P48:l:1:f:8:cf:2\ncell:Q48:l:1:f:8:cf:2\ncell:R48:l:1:f:8:cf:2\ncell:S48:l:1:f:8:cf:2\ncell:T48:l:1:f:8:cf:2\ncell:U48:l:1:f:8:cf:2\ncell:V48:l:1:f:8:cf:2\ncell:W48:l:1:f:8:cf:2\ncell:O49:l:1:f:8:cf:2\ncell:P49:l:1:f:8:cf:2\ncell:Q49:l:1:f:8:cf:2\ncell:R49:l:1:f:8:cf:2\ncell:S49:l:1:f:8:cf:2\ncell:T49:l:1:f:8:cf:2\ncell:U49:l:1:f:8:cf:2\ncell:V49:l:1:f:8:cf:2\ncell:W49:l:1:f:8:cf:2\ncell:O50:l:1:f:8:cf:2\ncell:P50:l:1:f:8:cf:2\ncell:Q50:l:1:f:8:cf:2\ncell:R50:l:1:f:8:cf:2\ncell:S50:l:1:f:8:cf:2\ncell:T50:l:1:f:8:cf:2\ncell:U50:l:1:f:8:cf:2\ncell:V50:l:1:f:8:cf:2\ncell:W50:l:1:f:8:cf:2\ncell:O51:l:1:f:8:cf:2\ncell:P51:l:1:f:8:cf:2\ncell:Q51:l:1:f:8:cf:2\ncell:R51:l:1:f:8:cf:2\ncell:S51:l:1:f:8:cf:2\ncell:T51:l:1:f:8:cf:2\ncell:U51:l:1:f:8:cf:2\ncell:V51:l:1:f:8:cf:2\ncell:W51:l:1:f:8:cf:2\ncell:O52:l:1:f:8:cf:2\ncell:P52:l:1:f:8:cf:2\ncell:Q52:l:1:f:8:cf:2\ncell:R52:l:1:f:8:cf:2\ncell:S52:l:1:f:8:cf:2\ncell:T52:l:1:f:8:cf:2\ncell:U52:l:1:f:8:cf:2\ncell:V52:l:1:f:8:cf:2\ncell:W52:l:1:f:8:cf:2\ncell:O53:l:1:f:8:cf:2\ncell:P53:l:1:f:8:cf:2\ncell:Q53:l:1:f:8:cf:2\ncell:R53:l:1:f:8:cf:2\ncell:S53:l:1:f:8:cf:2\ncell:T53:l:1:f:8:cf:2\ncell:U53:l:1:f:8:cf:2\ncell:V53:l:1:f:8:cf:2\ncell:W53:l:1:f:8:cf:2\ncell:O54:l:1:f:8:cf:2\ncell:P54:l:1:f:8:cf:2\ncell:Q54:l:1:f:8:cf:2\ncell:R54:l:1:f:8:cf:2\ncell:S54:l:1:f:8:cf:2\ncell:T54:l:1:f:8:cf:2\ncell:U54:l:1:f:8:cf:2\ncell:V54:l:1:f:8:cf:2\ncell:W54:l:1:f:8:cf:2\ncell:O55:l:1:f:8:cf:2\ncell:P55:l:1:f:8:cf:2\ncell:Q55:l:1:f:8:cf:2\ncell:R55:l:1:f:8:cf:2\ncell:S55:l:1:f:8:cf:2\ncell:T55:l:1:f:8:cf:2\ncell:U55:l:1:f:8:cf:2\ncell:V55:l:1:f:8:cf:2\ncell:W55:l:1:f:8:cf:2\ncell:O56:l:1:f:8:cf:2\ncell:P56:l:1:f:8:cf:2\ncell:Q56:l:1:f:8:cf:2\ncell:R56:l:1:f:8:cf:2\ncell:S56:l:1:f:8:cf:2\ncell:T56:l:1:f:8:cf:2\ncell:U56:l:1:f:8:cf:2\ncell:V56:l:1:f:8:cf:2\ncell:W56:l:1:f:8:cf:2\ncell:O57:l:1:f:8:cf:2\ncell:P57:l:1:f:8:cf:2\ncell:Q57:l:1:f:8:cf:2\ncell:R57:l:1:f:8:cf:2\ncell:S57:l:1:f:8:cf:2\ncell:T57:l:1:f:8:cf:2\ncell:U57:l:1:f:8:cf:2\ncell:V57:l:1:f:8:cf:2\ncell:W57:l:1:f:8:cf:2\ncell:O58:l:1:f:8:cf:2\ncell:P58:l:1:f:8:cf:2\ncell:Q58:l:1:f:8:cf:2\ncell:R58:l:1:f:8:cf:2\ncell:S58:l:1:f:8:cf:2\ncell:T58:l:1:f:8:cf:2\ncell:U58:l:1:f:8:cf:2\ncell:V58:l:1:f:8:cf:2\ncell:W58:l:1:f:8:cf:2\ncell:O59:l:1:f:8:cf:2\ncell:P59:l:1:f:8:cf:2\ncell:Q59:l:1:f:8:cf:2\ncell:R59:l:1:f:8:cf:2\ncell:S59:l:1:f:8:cf:2\ncell:T59:l:1:f:8:cf:2\ncell:U59:l:1:f:8:cf:2\ncell:V59:l:1:f:8:cf:2\ncell:W59:l:1:f:8:cf:2\ncell:O60:l:1:f:8:cf:2\ncell:P60:l:1:f:8:cf:2\ncell:Q60:l:1:f:8:cf:2\ncell:R60:l:1:f:8:cf:2\ncell:S60:l:1:f:8:cf:2\ncell:T60:l:1:f:8:cf:2\ncell:U60:l:1:f:8:cf:2\ncell:V60:l:1:f:8:cf:2\ncell:W60:l:1:f:8:cf:2\ncell:O61:l:1:f:8:cf:2\ncell:P61:l:1:f:8:cf:2\ncell:Q61:l:1:f:8:cf:2\ncell:R61:l:1:f:8:cf:2\ncell:S61:l:1:f:8:cf:2\ncell:T61:l:1:f:8:cf:2\ncell:U61:l:1:f:8:cf:2\ncell:V61:l:1:f:8:cf:2\ncell:W61:l:1:f:8:cf:2\ncell:O62:l:1:f:8:cf:2\ncell:P62:l:1:f:8:cf:2\ncell:Q62:l:1:f:8:cf:2\ncell:R62:l:1:f:8:cf:2\ncell:S62:l:1:f:8:cf:2\ncell:T62:l:1:f:8:cf:2\ncell:U62:l:1:f:8:cf:2\ncell:V62:l:1:f:8:cf:2\ncell:W62:l:1:f:8:cf:2\ncell:O63:l:1:f:8:cf:2\ncell:P63:l:1:f:8:cf:2\ncell:Q63:l:1:f:8:cf:2\ncell:R63:l:1:f:8:cf:2\ncell:S63:l:1:f:8:cf:2\ncell:T63:l:1:f:8:cf:2\ncell:U63:l:1:f:8:cf:2\ncell:V63:l:1:f:8:cf:2\ncell:W63:l:1:f:8:cf:2\ncell:O64:l:1:f:8:cf:2\ncell:P64:l:1:f:8:cf:2\ncell:Q64:l:1:f:8:cf:2\ncell:R64:l:1:f:8:cf:2\ncell:S64:l:1:f:8:cf:2\ncell:T64:l:1:f:8:cf:2\ncell:U64:l:1:f:8:cf:2\ncell:V64:l:1:f:8:cf:2\ncell:W64:l:1:f:8:cf:2\ncell:O65:l:1:f:8:cf:2\ncell:P65:l:1:f:8:cf:2\ncell:Q65:l:1:f:8:cf:2\ncell:R65:l:1:f:8:cf:2\ncell:S65:l:1:f:8:cf:2\ncell:T65:l:1:f:8:cf:2\ncell:U65:l:1:f:8:cf:2\ncell:V65:l:1:f:8:cf:2\ncell:W65:l:1:f:8:cf:2\ncell:O66:l:1:f:8:cf:2\ncell:P66:l:1:f:8:cf:2\ncell:Q66:l:1:f:8:cf:2\ncell:R66:l:1:f:8:cf:2\ncell:S66:l:1:f:8:cf:2\ncell:T66:l:1:f:8:cf:2\ncell:U66:l:1:f:8:cf:2\ncell:V66:l:1:f:8:cf:2\ncell:W66:l:1:f:8:cf:2\ncell:O67:l:1:f:8:cf:2\ncell:P67:l:1:f:8:cf:2\ncell:Q67:l:1:f:8:cf:2\ncell:R67:l:1:f:8:cf:2\ncell:S67:l:1:f:8:cf:2\ncell:T67:l:1:f:8:cf:2\ncell:U67:l:1:f:8:cf:2\ncell:V67:l:1:f:8:cf:2\ncell:W67:l:1:f:8:cf:2\ncell:O68:l:1:f:8:cf:2\ncell:P68:l:1:f:8:cf:2\ncell:Q68:l:1:f:8:cf:2\ncell:R68:l:1:f:8:cf:2\ncell:S68:l:1:f:8:cf:2\ncell:T68:l:1:f:8:cf:2\ncell:U68:l:1:f:8:cf:2\ncell:V68:l:1:f:8:cf:2\ncell:W68:l:1:f:8:cf:2\ncell:O69:l:1:f:8:cf:2\ncell:P69:l:1:f:8:cf:2\ncell:Q69:l:1:f:8:cf:2\ncell:R69:l:1:f:8:cf:2\ncell:S69:l:1:f:8:cf:2\ncell:T69:l:1:f:8:cf:2\ncell:U69:l:1:f:8:cf:2\ncell:V69:l:1:f:8:cf:2\ncell:W69:l:1:f:8:cf:2\ncell:O70:l:1:f:8:cf:2\ncell:P70:l:1:f:8:cf:2\ncell:Q70:l:1:f:8:cf:2\ncell:R70:l:1:f:8:cf:2\ncell:S70:l:1:f:8:cf:2\ncell:T70:l:1:f:8:cf:2\ncell:U70:l:1:f:8:cf:2\ncell:V70:l:1:f:8:cf:2\ncell:W70:l:1:f:8:cf:2\ncell:O71:l:1:f:8:cf:2\ncell:P71:l:1:f:8:cf:2\ncell:Q71:l:1:f:8:cf:2\ncell:R71:l:1:f:8:cf:2\ncell:S71:l:1:f:8:cf:2\ncell:T71:l:1:f:8:cf:2\ncell:U71:l:1:f:8:cf:2\ncell:V71:l:1:f:8:cf:2\ncell:W71:l:1:f:8:cf:2\ncell:O72:l:1:f:8:cf:2\ncell:P72:l:1:f:8:cf:2\ncell:Q72:l:1:f:8:cf:2\ncell:R72:l:1:f:8:cf:2\ncell:S72:l:1:f:8:cf:2\ncell:T72:l:1:f:8:cf:2\ncell:U72:l:1:f:8:cf:2\ncell:V72:l:1:f:8:cf:2\ncell:W72:l:1:f:8:cf:2\ncell:O73:l:1:f:8:cf:2\ncell:P73:l:1:f:8:cf:2\ncell:Q73:l:1:f:8:cf:2\ncell:R73:l:1:f:8:cf:2\ncell:O74:l:1:f:8:cf:2\ncell:P74:l:1:f:8:cf:2\ncell:Q74:l:1:f:8:cf:2\ncell:R74:l:1:f:8:cf:2\ncell:O75:l:1:f:8:cf:2\ncell:P75:l:1:f:8:cf:2\ncell:Q75:l:1:f:8:cf:2\ncell:R75:l:1:f:8:cf:2\ncell:O76:l:1:f:8:cf:2\ncell:P76:l:1:f:8:cf:2\ncell:Q76:l:1:f:8:cf:2\ncell:R76:l:1:f:8:cf:2\ncell:O77:l:1:f:8:cf:2\ncell:P77:l:1:f:8:cf:2\ncell:Q77:l:1:f:8:cf:2\ncell:R77:l:1:f:8:cf:2\ncell:O78:l:1:f:8:cf:2\ncell:P78:l:1:f:8:cf:2\ncell:Q78:l:1:f:8:cf:2\ncell:R78:l:1:f:8:cf:2\ncell:O79:l:1:f:8:cf:2\ncell:P79:l:1:f:8:cf:2\ncell:Q79:l:1:f:8:cf:2\ncell:R79:l:1:f:8:cf:2\ncell:O80:l:1:f:8:cf:2\ncell:P80:l:1:f:8:cf:2\ncell:Q80:l:1:f:8:cf:2\ncell:R80:l:1:f:8:cf:2\ncell:O81:l:1:f:8:cf:2\ncell:P81:l:1:f:8:cf:2\ncell:Q81:l:1:f:8:cf:2\ncell:R81:l:1:f:8:cf:2\ncell:O82:l:1:f:8:cf:2\ncell:P82:l:1:f:8:cf:2\ncell:Q82:l:1:f:8:cf:2\ncell:R82:l:1:f:8:cf:2\ncell:O83:l:1:f:8:cf:2\ncell:P83:l:1:f:8:cf:2\ncell:Q83:l:1:f:8:cf:2\ncell:R83:l:1:f:8:cf:2\ncell:O84:l:1:f:8:cf:2\ncell:P84:l:1:f:8:cf:2\ncell:Q84:l:1:f:8:cf:2\ncell:R84:l:1:f:8:cf:2\ncell:O85:l:1:f:8:cf:2\ncell:P85:l:1:f:8:cf:2\ncell:Q85:l:1:f:8:cf:2\ncell:R85:l:1:f:8:cf:2\ncell:O86:l:1:f:8:cf:2\ncell:P86:l:1:f:8:cf:2\ncell:Q86:l:1:f:8:cf:2\ncell:R86:l:1:f:8:cf:2\ncell:B87:l:1:f:8:cf:2\ncell:C87:l:1:f:8:cf:2\ncell:D87:l:1:f:2:cf:2\ncell:E87:l:1:f:2:cf:3:ntvf:1\ncell:F87:l:1:f:2:cf:3:ntvf:1\ncell:O87:l:1:f:8:cf:2\ncell:P87:l:1:f:8:cf:2\ncell:Q87:l:1:f:8:cf:2\ncell:R87:l:1:f:8:cf:2\ncell:B88:l:1:f:6:cf:2\ncell:C88:l:1:f:6:cf:2\ncell:D88:l:1:f:11:cf:2\ncell:E88:l:1:f:11:cf:2\ncell:F88:l:1:f:8:cf:2\ncell:O88:l:1:f:8:cf:2\ncell:P88:l:1:f:8:cf:2\ncell:Q88:l:1:f:8:cf:2\ncell:R88:l:1:f:8:cf:2\ncell:O89:l:1:f:8:cf:2\ncell:P89:l:1:f:8:cf:2\ncell:Q89:l:1:f:8:cf:2\ncell:R89:l:1:f:8:cf:2\ncell:O90:l:1:f:8:cf:2\ncell:P90:l:1:f:8:cf:2\ncell:Q90:l:1:f:8:cf:2\ncell:R90:l:1:f:8:cf:2\ncell:O91:l:1:f:8:cf:2\ncell:P91:l:1:f:8:cf:2\ncell:Q91:l:1:f:8:cf:2\ncell:R91:l:1:f:8:cf:2\ncell:O92:l:1:f:8:cf:2\ncell:P92:l:1:f:8:cf:2\ncell:Q92:l:1:f:8:cf:2\ncell:R92:l:1:f:8:cf:2\ncell:O93:l:1:f:8:cf:2\ncell:P93:l:1:f:8:cf:2\ncell:Q93:l:1:f:8:cf:2\ncell:R93:l:1:f:8:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:O96:l:1:f:8:cf:2\ncell:P96:l:1:f:8:cf:2\ncell:Q96:l:1:f:8:cf:2\ncell:R96:l:1:f:8:cf:2\ncell:O97:l:1:f:8:cf:2\ncell:P97:l:1:f:8:cf:2\ncell:Q97:l:1:f:8:cf:2\ncell:R97:l:1:f:8:cf:2\ncell:O98:l:1:f:8:cf:2\ncell:P98:l:1:f:8:cf:2\ncell:Q98:l:1:f:8:cf:2\ncell:R98:l:1:f:8:cf:2\ncell:S98:l:1:f:8:cf:2\ncell:T98:l:1:f:8:cf:2\ncell:U98:l:1:f:8:cf:2\ncell:V98:l:1:f:8:cf:2\ncell:W98:l:1:f:8:cf:2\ncell:O99:l:1:f:8:cf:2\ncell:P99:l:1:f:8:cf:2\ncell:Q99:l:1:f:8:cf:2\ncell:R99:l:1:f:8:cf:2\ncell:S99:l:1:f:8:cf:2\ncell:T99:l:1:f:8:cf:2\ncell:U99:l:1:f:8:cf:2\ncell:V99:l:1:f:8:cf:2\ncell:W99:l:1:f:8:cf:2\ncell:O100:l:1:f:8:cf:2\ncell:P100:l:1:f:8:cf:2\ncell:Q100:l:1:f:8:cf:2\ncell:R100:l:1:f:8:cf:2\ncell:S100:l:1:f:8:cf:2\ncell:T100:l:1:f:8:cf:2\ncell:U100:l:1:f:8:cf:2\ncell:V100:l:1:f:8:cf:2\ncell:W100:l:1:f:8:cf:2\ncell:O101:l:1:f:8:cf:2\ncell:P101:l:1:f:8:cf:2\ncell:Q101:l:1:f:8:cf:2\ncell:R101:l:1:f:8:cf:2\ncell:S101:l:1:f:8:cf:2\ncell:T101:l:1:f:8:cf:2\ncell:U101:l:1:f:8:cf:2\ncell:V101:l:1:f:8:cf:2\ncell:W101:l:1:f:8:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncell:O110:l:1:f:8:cf:2\ncell:P110:l:1:f:8:cf:2\ncell:Q110:l:1:f:8:cf:2\ncell:R110:l:1:f:8:cf:2\ncell:S110:l:1:f:8:cf:2\ncell:T110:l:1:f:8:cf:2\ncell:U110:l:1:f:8:cf:2\ncell:V110:l:1:f:8:cf:2\ncell:W110:l:1:f:8:cf:2\ncell:O111:l:1:f:8:cf:2\ncell:P111:l:1:f:8:cf:2\ncell:Q111:l:1:f:8:cf:2\ncell:R111:l:1:f:8:cf:2\ncell:S111:l:1:f:8:cf:2\ncell:T111:l:1:f:8:cf:2\ncell:U111:l:1:f:8:cf:2\ncell:V111:l:1:f:8:cf:2\ncell:W111:l:1:f:8:cf:2\ncell:O112:l:1:f:8:cf:2\ncell:P112:l:1:f:8:cf:2\ncell:Q112:l:1:f:8:cf:2\ncell:R112:l:1:f:8:cf:2\ncell:S112:l:1:f:8:cf:2\ncell:T112:l:1:f:8:cf:2\ncell:U112:l:1:f:8:cf:2\ncell:V112:l:1:f:8:cf:2\ncell:W112:l:1:f:8:cf:2\ncell:O113:l:1:f:8:cf:2\ncell:P113:l:1:f:8:cf:2\ncell:Q113:l:1:f:8:cf:2\ncell:R113:l:1:f:8:cf:2\ncell:S113:l:1:f:8:cf:2\ncell:T113:l:1:f:8:cf:2\ncell:U113:l:1:f:8:cf:2\ncell:V113:l:1:f:8:cf:2\ncell:W113:l:1:f:8:cf:2\ncell:O114:l:1:f:8:cf:2\ncell:P114:l:1:f:8:cf:2\ncell:Q114:l:1:f:8:cf:2\ncell:R114:l:1:f:8:cf:2\ncell:S114:l:1:f:8:cf:2\ncell:T114:l:1:f:8:cf:2\ncell:U114:l:1:f:8:cf:2\ncell:V114:l:1:f:8:cf:2\ncell:W114:l:1:f:8:cf:2\ncell:O115:l:1:f:8:cf:2\ncell:P115:l:1:f:8:cf:2\ncell:Q115:l:1:f:8:cf:2\ncell:R115:l:1:f:8:cf:2\ncell:S115:l:1:f:8:cf:2\ncell:T115:l:1:f:8:cf:2\ncell:U115:l:1:f:8:cf:2\ncell:V115:l:1:f:8:cf:2\ncell:W115:l:1:f:8:cf:2\ncell:O116:l:1:f:8:cf:2\ncell:P116:l:1:f:8:cf:2\ncell:Q116:l:1:f:8:cf:2\ncell:R116:l:1:f:8:cf:2\ncell:S116:l:1:f:8:cf:2\ncell:T116:l:1:f:8:cf:2\ncell:U116:l:1:f:8:cf:2\ncell:V116:l:1:f:8:cf:2\ncell:W116:l:1:f:8:cf:2\ncell:O117:l:1:f:8:cf:2\ncell:P117:l:1:f:8:cf:2\ncell:Q117:l:1:f:8:cf:2\ncell:R117:l:1:f:8:cf:2\ncell:S117:l:1:f:8:cf:2\ncell:T117:l:1:f:8:cf:2\ncell:U117:l:1:f:8:cf:2\ncell:V117:l:1:f:8:cf:2\ncell:W117:l:1:f:8:cf:2\ncell:O118:l:1:f:8:cf:2\ncell:P118:l:1:f:8:cf:2\ncell:Q118:l:1:f:8:cf:2\ncell:R118:l:1:f:8:cf:2\ncell:S118:l:1:f:8:cf:2\ncell:T118:l:1:f:8:cf:2\ncell:U118:l:1:f:8:cf:2\ncell:V118:l:1:f:8:cf:2\ncell:W118:l:1:f:8:cf:2\ncell:O119:l:1:f:8:cf:2\ncell:P119:l:1:f:8:cf:2\ncell:Q119:l:1:f:8:cf:2\ncell:R119:l:1:f:8:cf:2\ncell:S119:l:1:f:8:cf:2\ncell:T119:l:1:f:8:cf:2\ncell:U119:l:1:f:8:cf:2\ncell:V119:l:1:f:8:cf:2\ncell:W119:l:1:f:8:cf:2\ncell:O120:l:1:f:8:cf:2\ncell:P120:l:1:f:8:cf:2\ncell:Q120:l:1:f:8:cf:2\ncell:R120:l:1:f:8:cf:2\ncell:S120:l:1:f:8:cf:2\ncell:T120:l:1:f:8:cf:2\ncell:U120:l:1:f:8:cf:2\ncell:V120:l:1:f:8:cf:2\ncell:W120:l:1:f:8:cf:2\ncell:O121:l:1:f:8:cf:2\ncell:P121:l:1:f:8:cf:2\ncell:Q121:l:1:f:8:cf:2\ncell:R121:l:1:f:8:cf:2\ncell:S121:l:1:f:8:cf:2\ncell:T121:l:1:f:8:cf:2\ncell:U121:l:1:f:8:cf:2\ncell:V121:l:1:f:8:cf:2\ncell:W121:l:1:f:8:cf:2\ncell:O122:l:1:f:8:cf:2\ncell:P122:l:1:f:8:cf:2\ncell:Q122:l:1:f:8:cf:2\ncell:R122:l:1:f:8:cf:2\ncell:S122:l:1:f:8:cf:2\ncell:T122:l:1:f:8:cf:2\ncell:U122:l:1:f:8:cf:2\ncell:V122:l:1:f:8:cf:2\ncell:W122:l:1:f:8:cf:2\ncell:O123:l:1:f:8:cf:2\ncell:P123:l:1:f:8:cf:2\ncell:Q123:l:1:f:8:cf:2\ncell:R123:l:1:f:8:cf:2\ncell:S123:l:1:f:8:cf:2\ncell:T123:l:1:f:8:cf:2\ncell:U123:l:1:f:8:cf:2\ncell:V123:l:1:f:8:cf:2\ncell:W123:l:1:f:8:cf:2\ncell:O124:l:1:f:8:cf:2\ncell:P124:l:1:f:8:cf:2\ncell:Q124:l:1:f:8:cf:2\ncell:R124:l:1:f:8:cf:2\ncell:S124:l:1:f:8:cf:2\ncell:T124:l:1:f:8:cf:2\ncell:U124:l:1:f:8:cf:2\ncell:V124:l:1:f:8:cf:2\ncell:W124:l:1:f:8:cf:2\ncell:O125:l:1:f:8:cf:2\ncell:P125:l:1:f:8:cf:2\ncell:Q125:l:1:f:8:cf:2\ncell:R125:l:1:f:8:cf:2\ncell:S125:l:1:f:8:cf:2\ncell:T125:l:1:f:8:cf:2\ncell:U125:l:1:f:8:cf:2\ncell:V125:l:1:f:8:cf:2\ncell:W125:l:1:f:8:cf:2\ncell:O126:l:1:f:8:cf:2\ncell:P126:l:1:f:8:cf:2\ncell:Q126:l:1:f:8:cf:2\ncell:R126:l:1:f:8:cf:2\ncell:S126:l:1:f:8:cf:2\ncell:T126:l:1:f:8:cf:2\ncell:U126:l:1:f:8:cf:2\ncell:V126:l:1:f:8:cf:2\ncell:W126:l:1:f:8:cf:2\ncell:O127:l:1:f:8:cf:2\ncell:P127:l:1:f:8:cf:2\ncell:Q127:l:1:f:8:cf:2\ncell:R127:l:1:f:8:cf:2\ncell:S127:l:1:f:8:cf:2\ncell:T127:l:1:f:8:cf:2\ncell:U127:l:1:f:8:cf:2\ncell:V127:l:1:f:8:cf:2\ncell:W127:l:1:f:8:cf:2\ncell:O128:l:1:f:8:cf:2\ncell:P128:l:1:f:8:cf:2\ncell:Q128:l:1:f:8:cf:2\ncell:R128:l:1:f:8:cf:2\ncell:S128:l:1:f:8:cf:2\ncell:T128:l:1:f:8:cf:2\ncell:U128:l:1:f:8:cf:2\ncell:V128:l:1:f:8:cf:2\ncell:W128:l:1:f:8:cf:2\ncell:O129:l:1:f:8:cf:2\ncell:P129:l:1:f:8:cf:2\ncell:Q129:l:1:f:8:cf:2\ncell:R129:l:1:f:8:cf:2\ncell:S129:l:1:f:8:cf:2\ncell:T129:l:1:f:8:cf:2\ncell:U129:l:1:f:8:cf:2\ncell:V129:l:1:f:8:cf:2\ncell:W129:l:1:f:8:cf:2\ncell:O130:l:1:f:8:cf:2\ncell:P130:l:1:f:8:cf:2\ncell:Q130:l:1:f:8:cf:2\ncell:R130:l:1:f:8:cf:2\ncell:S130:l:1:f:8:cf:2\ncell:T130:l:1:f:8:cf:2\ncell:U130:l:1:f:8:cf:2\ncell:V130:l:1:f:8:cf:2\ncell:W130:l:1:f:8:cf:2\ncell:O131:l:1:f:8:cf:2\ncell:P131:l:1:f:8:cf:2\ncell:Q131:l:1:f:8:cf:2\ncell:R131:l:1:f:8:cf:2\ncell:S131:l:1:f:8:cf:2\ncell:T131:l:1:f:8:cf:2\ncell:U131:l:1:f:8:cf:2\ncell:V131:l:1:f:8:cf:2\ncell:W131:l:1:f:8:cf:2\ncell:O132:l:1:f:8:cf:2\ncell:P132:l:1:f:8:cf:2\ncell:Q132:l:1:f:8:cf:2\ncell:R132:l:1:f:8:cf:2\ncell:S132:l:1:f:8:cf:2\ncell:T132:l:1:f:8:cf:2\ncell:U132:l:1:f:8:cf:2\ncell:V132:l:1:f:8:cf:2\ncell:W132:l:1:f:8:cf:2\ncell:O133:l:1:f:8:cf:2\ncell:P133:l:1:f:8:cf:2\ncell:Q133:l:1:f:8:cf:2\ncell:R133:l:1:f:8:cf:2\ncell:S133:l:1:f:8:cf:2\ncell:T133:l:1:f:8:cf:2\ncell:U133:l:1:f:8:cf:2\ncell:V133:l:1:f:8:cf:2\ncell:W133:l:1:f:8:cf:2\ncell:O134:l:1:f:8:cf:2\ncell:P134:l:1:f:8:cf:2\ncell:Q134:l:1:f:8:cf:2\ncell:R134:l:1:f:8:cf:2\ncell:S134:l:1:f:8:cf:2\ncell:T134:l:1:f:8:cf:2\ncell:U134:l:1:f:8:cf:2\ncell:V134:l:1:f:8:cf:2\ncell:W134:l:1:f:8:cf:2\ncell:O135:l:1:f:8:cf:2\ncell:P135:l:1:f:8:cf:2\ncell:Q135:l:1:f:8:cf:2\ncell:R135:l:1:f:8:cf:2\ncell:S135:l:1:f:8:cf:2\ncell:T135:l:1:f:8:cf:2\ncell:U135:l:1:f:8:cf:2\ncell:V135:l:1:f:8:cf:2\ncell:W135:l:1:f:8:cf:2\ncell:O136:l:1:f:8:cf:2\ncell:P136:l:1:f:8:cf:2\ncell:Q136:l:1:f:8:cf:2\ncell:R136:l:1:f:8:cf:2\ncell:S136:l:1:f:8:cf:2\ncell:T136:l:1:f:8:cf:2\ncell:U136:l:1:f:8:cf:2\ncell:V136:l:1:f:8:cf:2\ncell:W136:l:1:f:8:cf:2\ncell:O137:l:1:f:8:cf:2\ncell:P137:l:1:f:8:cf:2\ncell:Q137:l:1:f:8:cf:2\ncell:R137:l:1:f:8:cf:2\ncell:S137:l:1:f:8:cf:2\ncell:T137:l:1:f:8:cf:2\ncell:U137:l:1:f:8:cf:2\ncell:V137:l:1:f:8:cf:2\ncell:W137:l:1:f:8:cf:2\ncell:O138:l:1:f:8:cf:2\ncell:P138:l:1:f:8:cf:2\ncell:Q138:l:1:f:8:cf:2\ncell:R138:l:1:f:8:cf:2\ncell:S138:l:1:f:8:cf:2\ncell:T138:l:1:f:8:cf:2\ncell:U138:l:1:f:8:cf:2\ncell:V138:l:1:f:8:cf:2\ncell:W138:l:1:f:8:cf:2\ncell:O139:l:1:f:8:cf:2\ncell:P139:l:1:f:8:cf:2\ncell:Q139:l:1:f:8:cf:2\ncell:R139:l:1:f:8:cf:2\ncell:S139:l:1:f:8:cf:2\ncell:T139:l:1:f:8:cf:2\ncell:U139:l:1:f:8:cf:2\ncell:V139:l:1:f:8:cf:2\ncell:W139:l:1:f:8:cf:2\ncell:O140:l:1:f:8:cf:2\ncell:P140:l:1:f:8:cf:2\ncell:Q140:l:1:f:8:cf:2\ncell:R140:l:1:f:8:cf:2\ncell:S140:l:1:f:8:cf:2\ncell:T140:l:1:f:8:cf:2\ncell:U140:l:1:f:8:cf:2\ncell:V140:l:1:f:8:cf:2\ncell:W140:l:1:f:8:cf:2\ncell:O141:l:1:f:8:cf:2\ncell:P141:l:1:f:8:cf:2\ncell:Q141:l:1:f:8:cf:2\ncell:R141:l:1:f:8:cf:2\ncell:S141:l:1:f:8:cf:2\ncell:T141:l:1:f:8:cf:2\ncell:U141:l:1:f:8:cf:2\ncell:V141:l:1:f:8:cf:2\ncell:W141:l:1:f:8:cf:2\ncell:O142:l:1:f:8:cf:2\ncell:P142:l:1:f:8:cf:2\ncell:Q142:l:1:f:8:cf:2\ncell:R142:l:1:f:8:cf:2\ncell:S142:l:1:f:8:cf:2\ncell:T142:l:1:f:8:cf:2\ncell:U142:l:1:f:8:cf:2\ncell:V142:l:1:f:8:cf:2\ncell:W142:l:1:f:8:cf:2\ncell:O143:l:1:f:8:cf:2\ncell:P143:l:1:f:8:cf:2\ncell:Q143:l:1:f:8:cf:2\ncell:R143:l:1:f:8:cf:2\ncell:S143:l:1:f:8:cf:2\ncell:T143:l:1:f:8:cf:2\ncell:U143:l:1:f:8:cf:2\ncell:V143:l:1:f:8:cf:2\ncell:W143:l:1:f:8:cf:2\ncell:O144:l:1:f:8:cf:2\ncell:P144:l:1:f:8:cf:2\ncell:Q144:l:1:f:8:cf:2\ncell:R144:l:1:f:8:cf:2\ncell:S144:l:1:f:8:cf:2\ncell:T144:l:1:f:8:cf:2\ncell:U144:l:1:f:8:cf:2\ncell:V144:l:1:f:8:cf:2\ncell:W144:l:1:f:8:cf:2\ncell:O145:l:1:f:8:cf:2\ncell:P145:l:1:f:8:cf:2\ncell:Q145:l:1:f:8:cf:2\ncell:R145:l:1:f:8:cf:2\ncell:S145:l:1:f:8:cf:2\ncell:T145:l:1:f:8:cf:2\ncell:U145:l:1:f:8:cf:2\ncell:V145:l:1:f:8:cf:2\ncell:W145:l:1:f:8:cf:2\ncell:O146:l:1:f:8:cf:2\ncell:P146:l:1:f:8:cf:2\ncell:Q146:l:1:f:8:cf:2\ncell:R146:l:1:f:8:cf:2\ncell:S146:l:1:f:8:cf:2\ncell:T146:l:1:f:8:cf:2\ncell:U146:l:1:f:8:cf:2\ncell:V146:l:1:f:8:cf:2\ncell:W146:l:1:f:8:cf:2\ncell:O147:l:1:f:8:cf:2\ncell:P147:l:1:f:8:cf:2\ncell:Q147:l:1:f:8:cf:2\ncell:R147:l:1:f:8:cf:2\ncell:S147:l:1:f:8:cf:2\ncell:T147:l:1:f:8:cf:2\ncell:U147:l:1:f:8:cf:2\ncell:V147:l:1:f:8:cf:2\ncell:W147:l:1:f:8:cf:2\ncell:O148:l:1:f:8:cf:2\ncell:P148:l:1:f:8:cf:2\ncell:Q148:l:1:f:8:cf:2\ncell:R148:l:1:f:8:cf:2\ncell:S148:l:1:f:8:cf:2\ncell:T148:l:1:f:8:cf:2\ncell:U148:l:1:f:8:cf:2\ncell:V148:l:1:f:8:cf:2\ncell:W148:l:1:f:8:cf:2\ncell:O149:l:1:f:8:cf:2\ncell:P149:l:1:f:8:cf:2\ncell:Q149:l:1:f:8:cf:2\ncell:R149:l:1:f:8:cf:2\ncell:S149:l:1:f:8:cf:2\ncell:T149:l:1:f:8:cf:2\ncell:U149:l:1:f:8:cf:2\ncell:V149:l:1:f:8:cf:2\ncell:W149:l:1:f:8:cf:2\ncell:O150:l:1:f:10:cf:2\ncell:P150:l:1:f:10:cf:2\ncell:Q150:l:1:f:10:cf:2\ncell:R150:l:1:f:10:cf:2\ncell:S150:l:1:f:10:cf:2\ncell:T150:l:1:f:10:cf:2\ncell:U150:l:1:f:10:cf:2\ncell:V150:l:1:f:10:cf:2\ncell:W150:l:1:f:10:cf:2\ncell:O151:l:1:f:10:cf:2\ncell:P151:l:1:f:10:cf:2\ncell:Q151:l:1:f:10:cf:2\ncell:R151:l:1:f:10:cf:2\ncell:S151:l:1:f:10:cf:2\ncell:T151:l:1:f:10:cf:2\ncell:U151:l:1:f:10:cf:2\ncell:V151:l:1:f:10:cf:2\ncell:W151:l:1:f:10:cf:2\ncell:O152:l:1:f:10:cf:2\ncell:P152:l:1:f:10:cf:2\ncell:Q152:l:1:f:10:cf:2\ncell:R152:l:1:f:10:cf:2\ncell:S152:l:1:f:10:cf:2\ncell:T152:l:1:f:10:cf:2\ncell:U152:l:1:f:10:cf:2\ncell:V152:l:1:f:10:cf:2\ncell:W152:l:1:f:10:cf:2\ncell:O153:l:1:f:10:cf:2\ncell:P153:l:1:f:10:cf:2\ncell:Q153:l:1:f:10:cf:2\ncell:R153:l:1:f:10:cf:2\ncell:S153:l:1:f:10:cf:2\ncell:T153:l:1:f:10:cf:2\ncell:U153:l:1:f:10:cf:2\ncell:V153:l:1:f:10:cf:2\ncell:W153:l:1:f:10:cf:2\ncell:A154:l:1:f:10:cf:2\ncell:B154:l:1:f:10:cf:2\ncell:C154:l:1:f:10:cf:2\ncell:D154:l:1:f:10:cf:2\ncell:E154:l:1:f:10:cf:2\ncell:F154:t:Monthly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G154:l:1:f:10:cf:2\ncell:H154:l:1:f:10:cf:2\ncell:I154:l:1:f:10:cf:2\ncell:J154:l:1:f:10:cf:2\ncell:K154:l:1:f:10:cf:2\ncell:L154:l:1:f:10:cf:2\ncell:M154:l:1:f:10:cf:2\ncell:N154:l:1:f:10:cf:2\ncell:O154:l:1:f:10:cf:2\ncell:P154:l:1:f:10:cf:2\ncell:Q154:l:1:f:10:cf:2\ncell:R154:l:1:f:10:cf:2\ncell:S154:l:1:f:10:cf:2\ncell:T154:l:1:f:10:cf:2\ncell:U154:l:1:f:10:cf:2\ncell:V154:l:1:f:10:cf:2\ncell:W154:l:1:f:10:cf:2\ncell:A155:l:1:f:10:cf:2\ncell:B155:l:1:f:10:cf:2\ncell:C155:l:1:f:10:cf:2\ncell:D155:l:1:f:10:cf:2\ncell:E155:l:1:f:10:cf:2\ncell:F155:t:Semi-Annually:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G155:l:1:f:10:cf:2\ncell:H155:l:1:f:10:cf:2\ncell:I155:l:1:f:10:cf:2\ncell:J155:l:1:f:10:cf:2\ncell:K155:l:1:f:10:cf:2\ncell:L155:l:1:f:10:cf:2\ncell:M155:l:1:f:10:cf:2\ncell:N155:l:1:f:10:cf:2\ncell:O155:l:1:f:10:cf:2\ncell:P155:l:1:f:10:cf:2\ncell:Q155:l:1:f:10:cf:2\ncell:R155:l:1:f:10:cf:2\ncell:S155:l:1:f:10:cf:2\ncell:T155:l:1:f:10:cf:2\ncell:U155:l:1:f:10:cf:2\ncell:V155:l:1:f:10:cf:2\ncell:W155:l:1:f:10:cf:2\ncell:A156:l:1:f:10:cf:2\ncell:B156:l:1:f:10:cf:2\ncell:C156:l:1:f:10:cf:2\ncell:D156:l:1:f:10:cf:2\ncell:E156:l:1:f:10:cf:2\ncell:F156:t:Quarterly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G156:l:1:f:10:cf:2\ncell:H156:l:1:f:10:cf:2\ncell:I156:l:1:f:10:cf:2\ncell:J156:l:1:f:10:cf:2\ncell:K156:l:1:f:10:cf:2\ncell:L156:l:1:f:10:cf:2\ncell:M156:l:1:f:10:cf:2\ncell:N156:l:1:f:10:cf:2\ncell:O156:l:1:f:10:cf:2\ncell:P156:l:1:f:10:cf:2\ncell:Q156:l:1:f:10:cf:2\ncell:R156:l:1:f:10:cf:2\ncell:S156:l:1:f:10:cf:2\ncell:T156:l:1:f:10:cf:2\ncell:U156:l:1:f:10:cf:2\ncell:V156:l:1:f:10:cf:2\ncell:W156:l:1:f:10:cf:2\ncell:A157:l:1:f:10:cf:2\ncell:B157:l:1:f:10:cf:2\ncell:C157:l:1:f:10:cf:2\ncell:D157:l:1:f:10:cf:2\ncell:E157:l:1:f:10:cf:2\ncell:F157:t:Yearly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G157:l:1:f:10:cf:2\ncell:H157:l:1:f:10:cf:2\ncell:I157:l:1:f:10:cf:2\ncell:J157:l:1:f:10:cf:2\ncell:K157:l:1:f:10:cf:2\ncell:L157:l:1:f:10:cf:2\ncell:M157:l:1:f:10:cf:2\ncell:N157:l:1:f:10:cf:2\ncell:O157:l:1:f:10:cf:2\ncell:P157:l:1:f:10:cf:2\ncell:Q157:l:1:f:10:cf:2\ncell:R157:l:1:f:10:cf:2\ncell:S157:l:1:f:10:cf:2\ncell:T157:l:1:f:10:cf:2\ncell:U157:l:1:f:10:cf:2\ncell:V157:l:1:f:10:cf:2\ncell:W157:l:1:f:10:cf:2\ncell:A158:l:1:f:10:cf:2\ncell:B158:l:1:f:10:cf:2\ncell:C158:l:1:f:10:cf:2\ncell:D158:l:1:f:10:cf:2\ncell:E158:l:1:f:10:cf:2\ncell:F158:l:1:f:10:cf:2\ncell:G158:l:1:f:10:cf:2\ncell:H158:l:1:f:10:cf:2\ncell:I158:l:1:f:10:cf:2\ncell:J158:l:1:f:10:cf:2\ncell:K158:l:1:f:10:cf:2\ncell:L158:l:1:f:10:cf:2\ncell:M158:l:1:f:10:cf:2\ncell:N158:l:1:f:10:cf:2\ncell:O158:l:1:f:10:cf:2\ncell:P158:l:1:f:10:cf:2\ncell:Q158:l:1:f:10:cf:2\ncell:R158:l:1:f:10:cf:2\ncell:S158:l:1:f:10:cf:2\ncell:T158:l:1:f:10:cf:2\ncell:U158:l:1:f:10:cf:2\ncell:V158:l:1:f:10:cf:2\ncell:W158:l:1:f:10:cf:2\ncell:A159:l:1:f:10:cf:2\ncell:B159:l:1:f:10:cf:2\ncell:C159:l:1:f:10:cf:2\ncell:D159:l:1:f:10:cf:2\ncell:E159:l:1:f:10:cf:2\ncell:F159:l:1:f:10:cf:2\ncell:G159:l:1:f:10:cf:2\ncell:H159:l:1:f:10:cf:2\ncell:I159:l:1:f:10:cf:2\ncell:J159:l:1:f:10:cf:2\ncell:K159:l:1:f:10:cf:2\ncell:L159:l:1:f:10:cf:2\ncell:M159:l:1:f:10:cf:2\ncell:N159:l:1:f:10:cf:2\ncell:O159:l:1:f:10:cf:2\ncell:P159:l:1:f:10:cf:2\ncell:Q159:l:1:f:10:cf:2\ncell:R159:l:1:f:10:cf:2\ncell:S159:l:1:f:10:cf:2\ncell:T159:l:1:f:10:cf:2\ncell:U159:l:1:f:10:cf:2\ncell:V159:l:1:f:10:cf:2\ncell:W159:l:1:f:10:cf:2\ncell:A160:l:1:f:10:cf:2\ncell:B160:l:1:f:10:cf:2\ncell:C160:l:1:f:10:cf:2\ncell:D160:l:1:f:10:cf:2\ncell:E160:l:1:f:10:cf:2\ncell:F160:l:1:f:10:cf:2\ncell:G160:l:1:f:10:cf:2\ncell:H160:l:1:f:10:cf:2\ncell:I160:l:1:f:10:cf:2\ncell:J160:l:1:f:10:cf:2\ncell:K160:l:1:f:10:cf:2\ncell:L160:l:1:f:10:cf:2\ncell:M160:l:1:f:10:cf:2\ncell:N160:l:1:f:10:cf:2\ncell:O160:l:1:f:10:cf:2\ncell:P160:l:1:f:10:cf:2\ncell:Q160:l:1:f:10:cf:2\ncell:R160:l:1:f:10:cf:2\ncell:S160:l:1:f:10:cf:2\ncell:T160:l:1:f:10:cf:2\ncell:U160:l:1:f:10:cf:2\ncell:V160:l:1:f:10:cf:2\ncell:W160:l:1:f:10:cf:2\ncell:A161:l:1:f:10:cf:2\ncell:B161:l:1:f:10:cf:2\ncell:C161:l:1:f:10:cf:2\ncell:D161:l:1:f:10:cf:2\ncell:E161:l:1:f:10:cf:2\ncell:F161:l:1:f:10:cf:2\ncell:G161:l:1:f:10:cf:2\ncell:H161:l:1:f:10:cf:2\ncell:I161:l:1:f:10:cf:2\ncell:J161:l:1:f:10:cf:2\ncell:K161:l:1:f:10:cf:2\ncell:L161:l:1:f:10:cf:2\ncell:M161:l:1:f:10:cf:2\ncell:N161:l:1:f:10:cf:2\ncell:O161:l:1:f:10:cf:2\ncell:P161:l:1:f:10:cf:2\ncell:Q161:l:1:f:10:cf:2\ncell:R161:l:1:f:10:cf:2\ncell:S161:l:1:f:10:cf:2\ncell:T161:l:1:f:10:cf:2\ncell:U161:l:1:f:10:cf:2\ncell:V161:l:1:f:10:cf:2\ncell:W161:l:1:f:10:cf:2\ncell:A162:l:1:f:10:cf:2\ncell:B162:l:1:f:10:cf:2\ncell:C162:l:1:f:10:cf:2\ncell:D162:l:1:f:10:cf:2\ncell:E162:l:1:f:10:cf:2\ncell:F162:l:1:f:10:cf:2\ncell:G162:l:1:f:10:cf:2\ncell:H162:l:1:f:10:cf:2\ncell:I162:l:1:f:10:cf:2\ncell:J162:l:1:f:10:cf:2\ncell:K162:l:1:f:10:cf:2\ncell:L162:l:1:f:10:cf:2\ncell:M162:l:1:f:10:cf:2\ncell:N162:l:1:f:10:cf:2\ncell:O162:l:1:f:10:cf:2\ncell:P162:l:1:f:10:cf:2\ncell:Q162:l:1:f:10:cf:2\ncell:R162:l:1:f:10:cf:2\ncell:S162:l:1:f:10:cf:2\ncell:T162:l:1:f:10:cf:2\ncell:U162:l:1:f:10:cf:2\ncell:V162:l:1:f:10:cf:2\ncell:W162:l:1:f:10:cf:2\ncell:A163:l:1:f:10:cf:2\ncell:B163:l:1:f:10:cf:2\ncell:C163:l:1:f:10:cf:2\ncell:D163:l:1:f:10:cf:2\ncell:E163:l:1:f:10:cf:2\ncell:F163:l:1:f:10:cf:2\ncell:G163:l:1:f:10:cf:2\ncell:H163:l:1:f:10:cf:2\ncell:I163:l:1:f:10:cf:2\ncell:J163:l:1:f:10:cf:2\ncell:K163:l:1:f:10:cf:2\ncell:L163:l:1:f:10:cf:2\ncell:M163:l:1:f:10:cf:2\ncell:N163:l:1:f:10:cf:2\ncell:O163:l:1:f:10:cf:2\ncell:P163:l:1:f:10:cf:2\ncell:Q163:l:1:f:10:cf:2\ncell:R163:l:1:f:10:cf:2\ncell:S163:l:1:f:10:cf:2\ncell:T163:l:1:f:10:cf:2\ncell:U163:l:1:f:10:cf:2\ncell:V163:l:1:f:10:cf:2\ncell:W163:l:1:f:10:cf:2\ncell:A164:l:1:f:10:cf:2\ncell:B164:l:1:f:10:cf:2\ncell:C164:l:1:f:10:cf:2\ncell:D164:l:1:f:10:cf:2\ncell:E164:l:1:f:10:cf:2\ncell:F164:l:1:f:10:cf:2\ncell:G164:l:1:f:10:cf:2\ncell:H164:l:1:f:10:cf:2\ncell:I164:l:1:f:10:cf:2\ncell:J164:l:1:f:10:cf:2\ncell:K164:l:1:f:10:cf:2\ncell:L164:l:1:f:10:cf:2\ncell:M164:l:1:f:10:cf:2\ncell:N164:l:1:f:10:cf:2\ncell:O164:l:1:f:10:cf:2\ncell:P164:l:1:f:10:cf:2\ncell:Q164:l:1:f:10:cf:2\ncell:R164:l:1:f:10:cf:2\ncell:S164:l:1:f:10:cf:2\ncell:T164:l:1:f:10:cf:2\ncell:U164:l:1:f:10:cf:2\ncell:V164:l:1:f:10:cf:2\ncell:W164:l:1:f:10:cf:2\ncell:A165:l:1:f:10:cf:2\ncell:B165:l:1:f:10:cf:2\ncell:C165:l:1:f:10:cf:2\ncell:D165:l:1:f:10:cf:2\ncell:E165:l:1:f:10:cf:2\ncell:F165:l:1:f:10:cf:2\ncell:G165:l:1:f:10:cf:2\ncell:H165:l:1:f:10:cf:2\ncell:I165:l:1:f:10:cf:2\ncell:J165:l:1:f:10:cf:2\ncell:K165:l:1:f:10:cf:2\ncell:L165:l:1:f:10:cf:2\ncell:M165:l:1:f:10:cf:2\ncell:N165:l:1:f:10:cf:2\ncell:O165:l:1:f:10:cf:2\ncell:P165:l:1:f:10:cf:2\ncell:Q165:l:1:f:10:cf:2\ncell:R165:l:1:f:10:cf:2\ncell:S165:l:1:f:10:cf:2\ncell:T165:l:1:f:10:cf:2\ncell:U165:l:1:f:10:cf:2\ncell:V165:l:1:f:10:cf:2\ncell:W165:l:1:f:10:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:30\nrow:5:h:171\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:18.75\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:15\nrow:17:h:15\nrow:18:h:15\nrow:19:h:15\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nrow:102:h:14.25\nrow:103:h:14.25\nrow:104:h:14.25\nrow:105:h:14.25\nrow:106:h:14.25\nrow:107:h:14.25\nrow:108:h:14.25\nrow:109:h:14.25\nrow:110:h:14.25\nrow:111:h:14.25\nrow:112:h:14.25\nrow:113:h:14.25\nrow:114:h:14.25\nrow:115:h:14.25\nrow:116:h:14.25\nrow:117:h:14.25\nrow:118:h:14.25\nrow:119:h:14.25\nrow:120:h:14.25\nrow:121:h:14.25\nrow:122:h:14.25\nrow:123:h:14.25\nrow:124:h:14.25\nrow:125:h:14.25\nrow:126:h:14.25\nrow:127:h:14.25\nrow:128:h:14.25\nrow:129:h:14.25\nrow:130:h:14.25\nrow:131:h:14.25\nrow:132:h:14.25\nrow:133:h:14.25\nrow:134:h:14.25\nrow:135:h:14.25\nrow:136:h:14.25\nrow:137:h:14.25\nrow:138:h:14.25\nrow:139:h:14.25\nrow:140:h:14.25\nrow:141:h:14.25\nrow:142:h:14.25\nrow:143:h:14.25\nrow:144:h:14.25\nrow:145:h:14.25\nrow:146:h:14.25\nrow:147:h:14.25\nrow:148:h:14.25\nrow:149:h:14.25\nsheet:c:27:r:165:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(136,204,119)\ncolor:4:rgb(230,230,250)\ncolor:5:rgb(255, 255, 255)\ncolor:6:rgb(255,255,187)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 24pt Arial\nfont:6:normal bold 9pt Arial\nfont:7:normal normal * Arial\nfont:8:normal normal 10pt Arial\nfont:9:normal normal 12pt Arial\nfont:10:normal normal 7pt Arial\nfont:11:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\nname:COMPARISON::S91\\cU105\nname:TRACKING::AC91\\cAE105\n', - }, - name: "expense", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:6:cf:2:ntvf:2\ncell:B1:l:1:f:6:cf:2\ncell:C1:l:1:f:6:cf:2\ncell:D1:l:1:f:6:cf:2\ncell:E1:l:1:f:6:cf:2\ncell:F1:l:1:f:6:cf:2\ncell:G1:l:1:f:6:cf:2\ncell:H1:l:1:f:6:cf:2\ncell:I1:l:1:f:6:cf:2\ncell:J1:l:1:f:6:cf:2\ncell:K1:l:1:f:6:cf:2\ncell:L1:l:1:f:6:cf:2\ncell:M1:l:1:f:6:cf:2\ncell:N1:l:1:f:6:cf:2\ncell:O1:l:1:f:6:cf:2\ncell:P1:l:1:f:6:cf:2\ncell:Q1:l:1:f:6:cf:2\ncell:R1:l:1:f:6:cf:2\ncell:S1:l:1:f:6:cf:2\ncell:T1:l:1:f:6:cf:2\ncell:U1:l:1:f:6:cf:2\ncell:V1:l:1:f:6:cf:2\ncell:W1:l:1:f:6:cf:2\ncell:A2:l:1:f:6:cf:2\ncell:B2:l:1:f:6:cf:2\ncell:C2:l:1:f:6:cf:2\ncell:D2:t:Expenses:l:2:f:3:cf:2\ncell:E2:l:1:f:6:cf:2\ncell:F2:l:1:f:6:cf:2\ncell:G2:l:1:f:6:cf:2\ncell:H2:l:1:f:6:cf:2\ncell:I2:l:1:f:6:cf:2\ncell:J2:l:1:f:6:cf:2\ncell:K2:l:1:f:6:cf:2\ncell:L2:l:1:f:6:cf:2\ncell:M2:l:1:f:6:cf:2\ncell:N2:l:1:f:6:cf:2\ncell:O2:l:1:f:6:cf:2\ncell:P2:l:1:f:6:cf:2\ncell:Q2:l:1:f:6:cf:2\ncell:R2:l:1:f:6:cf:2\ncell:S2:l:1:f:6:cf:2\ncell:T2:l:1:f:6:cf:2\ncell:U2:l:1:f:6:cf:2\ncell:V2:l:1:f:6:cf:2\ncell:W2:l:1:f:6:cf:2\ncell:A3:l:1:f:6:cf:2\ncell:B3:l:1:f:6:cf:2\ncell:C3:l:1:f:6:cf:2\ncell:D3:l:1:f:6:cf:2\ncell:G3:l:1:f:6:cf:2\ncell:H3:l:1:f:6:cf:2\ncell:I3:l:1:f:6:cf:2\ncell:J3:l:1:f:6:cf:2\ncell:K3:l:1:f:6:cf:2\ncell:L3:l:1:f:6:cf:2\ncell:M3:l:1:f:6:cf:2\ncell:N3:l:1:f:6:cf:2\ncell:O3:l:1:f:6:cf:2\ncell:P3:l:1:f:6:cf:2\ncell:Q3:t: :l:1:f:6:cf:2\ncell:R3:l:1:f:6:cf:2\ncell:S3:l:1:f:6:cf:2\ncell:T3:l:1:f:6:cf:2\ncell:U3:l:1:f:6:cf:2\ncell:V3:l:1:f:6:cf:2\ncell:W3:l:1:f:6:cf:2\ncell:B4:t:Food & Beverages:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C4:b:2:2:2:2:l:3:f:2:c:4:bg:2:cf:2\ncell:D4:b:2:2:2:2:l:3:f:2:c:4:bg:2:cf:1\ncell:E4:vtf:n:511:E5+E9:b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F4:vtf:n:6132:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O4:l:1:f:6:cf:2\ncell:P4:l:1:f:6:cf:2\ncell:Q4:l:1:f:6:cf:2\ncell:R4:l:1:f:6:cf:2\ncell:S4:l:1:f:6:cf:2\ncell:T4:l:1:f:6:cf:2\ncell:U4:l:1:f:6:cf:2\ncell:V4:l:1:f:6:cf:2\ncell:W4:l:1:f:6:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:5:c:1:bg:5\ncell:C5:t:Food at home:l:3:f:5:c:1:bg:5:cf:2:colspan:2\ncell:D5:t::b::1:1::l:3:f:5:c:1:bg:5:cf:2\ncell:E5:vtf:n:302:SUM(E6\\cE8):b:::1::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:F5:vtf:n:3624:IF( (E5*12)=0,"",(E5*12)):b::1:::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:6:cf:2\ncell:P5:l:1:f:6:cf:2\ncell:Q5:l:1:f:6:cf:2\ncell:R5:l:1:f:6:cf:2\ncell:S5:l:1:f:6:cf:2\ncell:T5:l:1:f:6:cf:2\ncell:U5:l:1:f:6:cf:2\ncell:V5:l:1:f:6:cf:2\ncell:W5:l:1:f:6:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:6:cf:2\ncell:C6:l:3:f:6:cf:2\ncell:D6:t:Groceries:l:3:f:5:cf:2\ncell:E6:v:302:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F6:vtf:n:3624:IF( (E6*12)=0,"",(E6*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:6:cf:2\ncell:P6:l:1:f:6:cf:2\ncell:Q6:l:1:f:6:cf:2\ncell:R6:l:1:f:6:cf:2\ncell:S6:l:1:f:6:cf:2\ncell:T6:l:1:f:6:cf:2\ncell:U6:l:1:f:6:cf:2\ncell:V6:l:1:f:6:cf:2\ncell:W6:l:1:f:6:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:6:bg:3:cf:2\ncell:C7:l:3:f:6:bg:3:cf:2\ncell:D7:t:Cooking supplies:l:3:f:5:bg:3:cf:2\ncell:E7:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1:::l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:6:cf:2\ncell:P7:l:1:f:6:cf:2\ncell:Q7:l:1:f:6:cf:2\ncell:R7:l:1:f:6:cf:2\ncell:S7:l:1:f:6:cf:2\ncell:T7:l:1:f:6:cf:2\ncell:U7:l:1:f:6:cf:2\ncell:V7:l:1:f:6:cf:2\ncell:W7:l:1:f:6:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:6:cf:2\ncell:C8:l:3:f:6:cf:2\ncell:D8:t:Other:l:3:f:5:cf:2\ncell:E8:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:6:cf:2\ncell:P8:l:1:f:6:cf:2\ncell:Q8:l:1:f:6:cf:2\ncell:R8:l:1:f:6:cf:2\ncell:S8:l:1:f:6:cf:2\ncell:T8:l:1:f:6:cf:2\ncell:U8:l:1:f:6:cf:2\ncell:V8:l:1:f:6:cf:2\ncell:W8:l:1:f:6:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:5:c:1:bg:5\ncell:C9:t:Dining Out:l:3:f:5:c:1:bg:5:cf:2:colspan:2\ncell:D9:t:Tips:b::1:1::l:3:f:5:c:1:bg:5:cf:2\ncell:E9:vtf:n:209:SUM(E10\\cE11):b:::1::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:F9:vtf:n:2508:IF( (E9*12)=0,"",(E9*12)):b::1:::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:6:cf:2\ncell:P9:l:1:f:6:cf:2\ncell:Q9:l:1:f:6:cf:2\ncell:R9:l:1:f:6:cf:2\ncell:S9:l:1:f:6:cf:2\ncell:T9:l:1:f:6:cf:2\ncell:U9:l:1:f:6:cf:2\ncell:V9:l:1:f:6:cf:2\ncell:W9:l:1:f:6:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:6:cf:2\ncell:C10:l:3:f:6:cf:2\ncell:D10:t:Restaurants:b::1:::l:3:f:5:cf:2\ncell:E10:v:209:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F10:vtf:n:2508:IF( (E10*12)=0,"",(E10*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:6:cf:2\ncell:P10:l:1:f:6:cf:2\ncell:Q10:l:1:f:6:cf:2\ncell:R10:l:1:f:6:cf:2\ncell:S10:l:1:f:6:cf:2\ncell:T10:l:1:f:6:cf:2\ncell:U10:l:1:f:6:cf:2\ncell:V10:l:1:f:6:cf:2\ncell:W10:l:1:f:6:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:6:bg:3:cf:2\ncell:C11:l:3:f:6:bg:3:cf:2\ncell:D11:t:Other :l:3:f:5:bg:3:cf:2\ncell:E11:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1:::l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:6:cf:2\ncell:P11:l:1:f:6:cf:2\ncell:Q11:l:1:f:6:cf:2\ncell:R11:l:1:f:6:cf:2\ncell:S11:l:1:f:6:cf:2\ncell:T11:l:1:f:6:cf:2\ncell:U11:l:1:f:6:cf:2\ncell:V11:l:1:f:6:cf:2\ncell:W11:l:1:f:6:cf:2\ncell:B12:t:Clothes & Personal Services:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C12:l:3:f:2:c:4:bg:2:cf:2\ncell:D12:l:3:f:2:c:4:bg:2:cf:1\ncell:E12:vtf:n:191:SUM(E13\\cE16):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F12:vtf:n:2292:IF( (E12*12)=0,"",(E12*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O12:l:1:f:6:cf:2\ncell:P12:l:1:f:6:cf:2\ncell:Q12:l:1:f:6:cf:2\ncell:R12:l:1:f:6:cf:2\ncell:S12:l:1:f:6:cf:2\ncell:T12:l:1:f:6:cf:2\ncell:U12:l:1:f:6:cf:2\ncell:V12:l:1:f:6:cf:2\ncell:W12:l:1:f:6:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:6:cf:2\ncell:C13:l:3:f:6:cf:2\ncell:D13:t:Clothes:l:3:f:5:cf:2\ncell:E13:v:142:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F13:vtf:n:1704:IF( (E13*12)=0,"",(E13*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:6:cf:2\ncell:P13:l:1:f:6:cf:2\ncell:Q13:l:1:f:6:cf:2\ncell:R13:l:1:f:6:cf:2\ncell:S13:l:1:f:6:cf:2\ncell:T13:l:1:f:6:cf:2\ncell:U13:l:1:f:6:cf:2\ncell:V13:l:1:f:6:cf:2\ncell:W13:l:1:f:6:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:6:bg:3:cf:2\ncell:C14:l:3:f:6:bg:3:cf:2\ncell:D14:t:Footwear:l:3:f:5:bg:3:cf:2\ncell:E14:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F14:vtf:t::IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:6:cf:2\ncell:P14:l:1:f:6:cf:2\ncell:Q14:l:1:f:6:cf:2\ncell:R14:l:1:f:6:cf:2\ncell:S14:l:1:f:6:cf:2\ncell:T14:l:1:f:6:cf:2\ncell:U14:l:1:f:6:cf:2\ncell:V14:l:1:f:6:cf:2\ncell:W14:l:1:f:6:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:6:cf:2\ncell:C15:l:3:f:6:cf:2\ncell:D15:t:Salon and Personal Care:l:3:f:5:cf:2\ncell:E15:v:49:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F15:vtf:n:588:IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:6:cf:2\ncell:P15:l:1:f:6:cf:2\ncell:Q15:l:1:f:6:cf:2\ncell:R15:l:1:f:6:cf:2\ncell:S15:l:1:f:6:cf:2\ncell:T15:l:1:f:6:cf:2\ncell:U15:l:1:f:6:cf:2\ncell:V15:l:1:f:6:cf:2\ncell:W15:l:1:f:6:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:6:bg:3:cf:2\ncell:C16:l:3:f:6:bg:3:cf:2\ncell:D16:t:Other:l:3:f:5:bg:3:cf:2\ncell:E16:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:6:cf:2\ncell:P16:l:1:f:6:cf:2\ncell:Q16:l:1:f:6:cf:2\ncell:R16:l:1:f:6:cf:2\ncell:S16:l:1:f:6:cf:2\ncell:T16:l:1:f:6:cf:2\ncell:U16:l:1:f:6:cf:2\ncell:V16:l:1:f:6:cf:2\ncell:W16:l:1:f:6:cf:2\ncell:B17:t:Transportation:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C17:l:3:f:2:c:4:bg:2:cf:2\ncell:D17:l:3:f:2:c:4:bg:2:cf:1\ncell:E17:vtf:n:640:SUM(E18\\cE25):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F17:vtf:n:7680:IF( (E17*12)=0,"",(E17*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O17:l:1:f:6:cf:2\ncell:P17:l:1:f:6:cf:2\ncell:Q17:l:1:f:6:cf:2\ncell:R17:l:1:f:6:cf:2\ncell:S17:l:1:f:6:cf:2\ncell:T17:l:1:f:6:cf:2\ncell:U17:l:1:f:6:cf:2\ncell:V17:l:1:f:6:cf:2\ncell:W17:l:1:f:6:cf:2\ncell:A18:b::1::\ncell:B18:b::::1:l:3:f:6:bg:4:cf:2\ncell:C18:l:3:f:6:bg:4:cf:2\ncell:D18:t:Owned Vehicle Payments:l:3:f:5:bg:4:cf:2\ncell:E18:v:640:b::1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F18:vtf:n:7680:IF( (E18*12)=0,"",(E18*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O18:l:1:f:6:cf:2\ncell:P18:l:1:f:6:cf:2\ncell:Q18:l:1:f:6:cf:2\ncell:R18:l:1:f:6:cf:2\ncell:S18:l:1:f:6:cf:2\ncell:T18:l:1:f:6:cf:2\ncell:U18:l:1:f:6:cf:2\ncell:V18:l:1:f:6:cf:2\ncell:W18:l:1:f:6:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:6:bg:3:cf:2\ncell:C19:l:3:f:6:bg:3:cf:2\ncell:D19:t:Rentals, Lease Payments:l:3:f:5:bg:3:cf:2\ncell:E19:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F19:vtf:t::IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O19:l:1:f:6:cf:2\ncell:P19:l:1:f:6:cf:2\ncell:Q19:l:1:f:6:cf:2\ncell:R19:l:1:f:6:cf:2\ncell:S19:l:1:f:6:cf:2\ncell:T19:l:1:f:6:cf:2\ncell:U19:l:1:f:6:cf:2\ncell:V19:l:1:f:6:cf:2\ncell:W19:l:1:f:6:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:6:bg:4:cf:2\ncell:C20:l:3:f:6:bg:4:cf:2\ncell:D20:t:Gas & Oil:l:3:f:5:bg:4:cf:2\ncell:E20:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O20:l:1:f:6:cf:2\ncell:P20:l:1:f:6:cf:2\ncell:Q20:l:1:f:6:cf:2\ncell:R20:l:1:f:6:cf:2\ncell:S20:l:1:f:6:cf:2\ncell:T20:l:1:f:6:cf:2\ncell:U20:l:1:f:6:cf:2\ncell:V20:l:1:f:6:cf:2\ncell:W20:l:1:f:6:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:6:bg:3:cf:2\ncell:C21:l:3:f:6:bg:3:cf:2\ncell:D21:t:Maintenance & Repairs:l:3:f:5:bg:3:cf:2\ncell:E21:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O21:l:1:f:6:cf:2\ncell:P21:l:1:f:6:cf:2\ncell:Q21:l:1:f:6:cf:2\ncell:R21:l:1:f:6:cf:2\ncell:S21:l:1:f:6:cf:2\ncell:T21:l:1:f:6:cf:2\ncell:U21:l:1:f:6:cf:2\ncell:V21:l:1:f:6:cf:2\ncell:W21:l:1:f:6:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:6:bg:4:cf:2\ncell:C22:l:3:f:6:bg:4:cf:2\ncell:D22:t:Vehicle Insurance:l:3:f:5:bg:4:cf:2\ncell:E22:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O22:l:1:f:6:cf:2\ncell:P22:l:1:f:6:cf:2\ncell:Q22:l:1:f:6:cf:2\ncell:R22:l:1:f:6:cf:2\ncell:S22:l:1:f:6:cf:2\ncell:T22:l:1:f:6:cf:2\ncell:U22:l:1:f:6:cf:2\ncell:V22:l:1:f:6:cf:2\ncell:W22:l:1:f:6:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:6:bg:3:cf:2\ncell:C23:l:3:f:6:bg:3:cf:2\ncell:D23:t:License, Registration:l:3:f:5:bg:3:cf:2\ncell:E23:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O23:l:1:f:6:cf:2\ncell:P23:l:1:f:6:cf:2\ncell:Q23:l:1:f:6:cf:2\ncell:R23:l:1:f:6:cf:2\ncell:S23:l:1:f:6:cf:2\ncell:T23:l:1:f:6:cf:2\ncell:U23:l:1:f:6:cf:2\ncell:V23:l:1:f:6:cf:2\ncell:W23:l:1:f:6:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:6:bg:4:cf:2\ncell:C24:l:3:f:6:bg:4:cf:2\ncell:D24:t:Commuting Expense:l:3:f:5:bg:4:cf:2\ncell:E24:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O24:l:1:f:6:cf:2\ncell:P24:l:1:f:6:cf:2\ncell:Q24:l:1:f:6:cf:2\ncell:R24:l:1:f:6:cf:2\ncell:S24:l:1:f:6:cf:2\ncell:T24:l:1:f:6:cf:2\ncell:U24:l:1:f:6:cf:2\ncell:V24:l:1:f:6:cf:2\ncell:W24:l:1:f:6:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:6:bg:3:cf:2\ncell:C25:l:3:f:6:bg:3:cf:2\ncell:D25:t:Other:l:3:f:5:bg:3:cf:2\ncell:E25:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F25:vtf:t::IF( (E25*12)=0,"",(E25*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O25:l:1:f:6:cf:2\ncell:P25:l:1:f:6:cf:2\ncell:Q25:l:1:f:6:cf:2\ncell:R25:l:1:f:6:cf:2\ncell:S25:l:1:f:6:cf:2\ncell:T25:l:1:f:6:cf:2\ncell:U25:l:1:f:6:cf:2\ncell:V25:l:1:f:6:cf:2\ncell:W25:l:1:f:6:cf:2\ncell:B26:t:Healthcare:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C26:l:3:f:2:c:4:bg:2:cf:2\ncell:D26:l:3:f:2:c:4:bg:2:cf:1\ncell:E26:vtf:n:263:SUM(E27\\cE31):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F26:vtf:n:3156:IF( (E26*12)=0,"",(E26*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O26:l:1:f:6:cf:2\ncell:P26:l:1:f:6:cf:2\ncell:Q26:l:1:f:6:cf:2\ncell:R26:l:1:f:6:cf:2\ncell:S26:l:1:f:6:cf:2\ncell:T26:l:1:f:6:cf:2\ncell:U26:l:1:f:6:cf:2\ncell:V26:l:1:f:6:cf:2\ncell:W26:l:1:f:6:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:6:cf:2\ncell:C27:l:3:f:6:cf:2\ncell:D27:t:Health Insurance:l:3:f:5:cf:2\ncell:E27:v:263:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F27:vtf:n:3156:IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:6:cf:2\ncell:P27:l:1:f:6:cf:2\ncell:Q27:l:1:f:6:cf:2\ncell:R27:l:1:f:6:cf:2\ncell:S27:l:1:f:6:cf:2\ncell:T27:l:1:f:6:cf:2\ncell:U27:l:1:f:6:cf:2\ncell:V27:l:1:f:6:cf:2\ncell:W27:l:1:f:6:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:6:bg:3:cf:2\ncell:C28:l:3:f:6:bg:3:cf:2\ncell:D28:t:Medical Services:l:3:f:5:bg:3:cf:2\ncell:E28:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:6:cf:2\ncell:P28:l:1:f:6:cf:2\ncell:Q28:l:1:f:6:cf:2\ncell:R28:l:1:f:6:cf:2\ncell:S28:l:1:f:6:cf:2\ncell:T28:l:1:f:6:cf:2\ncell:U28:l:1:f:6:cf:2\ncell:V28:l:1:f:6:cf:2\ncell:W28:l:1:f:6:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:6:cf:2\ncell:C29:l:3:f:6:cf:2\ncell:D29:t:Medicine, Drugs & Supplies:l:3:f:5:cf:2\ncell:E29:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:6:cf:2\ncell:P29:l:1:f:6:cf:2\ncell:Q29:l:1:f:6:cf:2\ncell:R29:l:1:f:6:cf:2\ncell:S29:l:1:f:6:cf:2\ncell:T29:l:1:f:6:cf:2\ncell:U29:l:1:f:6:cf:2\ncell:V29:l:1:f:6:cf:2\ncell:W29:l:1:f:6:cf:2\ncell:A30:b::1::\ncell:B30:b::::1:l:3:f:6:bg:3:cf:2\ncell:C30:l:3:f:6:bg:3:cf:2\ncell:D30:t:Heathclub Memberships:l:3:f:5:bg:3:cf:2\ncell:E30:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G30:b::::1\ncell:O30:l:1:f:6:cf:2\ncell:P30:l:1:f:6:cf:2\ncell:Q30:l:1:f:6:cf:2\ncell:R30:l:1:f:6:cf:2\ncell:S30:l:1:f:6:cf:2\ncell:T30:l:1:f:6:cf:2\ncell:U30:l:1:f:6:cf:2\ncell:V30:l:1:f:6:cf:2\ncell:W30:l:1:f:6:cf:2\ncell:A31:b::1::\ncell:B31:b:::1:1:l:3:f:6:cf:2\ncell:C31:b:::1::l:3:f:6:cf:2\ncell:D31:t:Other:b:::1::l:3:f:5:cf:2\ncell:E31:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:G31:b::::1\ncell:O31:l:1:f:6:cf:2\ncell:P31:l:1:f:6:cf:2\ncell:Q31:l:1:f:6:cf:2\ncell:R31:l:1:f:6:cf:2\ncell:S31:l:1:f:6:cf:2\ncell:T31:l:1:f:6:cf:2\ncell:U31:l:1:f:6:cf:2\ncell:V31:l:1:f:6:cf:2\ncell:W31:l:1:f:6:cf:2\ncell:B32:b:1:::\ncell:C32:b:1:::\ncell:D32:b:1:::\ncell:O32:l:1:f:6:cf:2\ncell:P32:l:1:f:6:cf:2\ncell:Q32:l:1:f:6:cf:2\ncell:R32:l:1:f:6:cf:2\ncell:S32:l:1:f:6:cf:2\ncell:T32:l:1:f:6:cf:2\ncell:U32:l:1:f:6:cf:2\ncell:V32:l:1:f:6:cf:2\ncell:W32:l:1:f:6:cf:2\ncell:O33:l:1:f:6:cf:2\ncell:P33:l:1:f:6:cf:2\ncell:Q33:l:1:f:6:cf:2\ncell:R33:l:1:f:6:cf:2\ncell:S33:l:1:f:6:cf:2\ncell:T33:l:1:f:6:cf:2\ncell:U33:l:1:f:6:cf:2\ncell:V33:l:1:f:6:cf:2\ncell:W33:l:1:f:6:cf:2\ncell:O34:l:1:f:6:cf:2\ncell:P34:l:1:f:6:cf:2\ncell:Q34:l:1:f:6:cf:2\ncell:R34:l:1:f:6:cf:2\ncell:S34:l:1:f:6:cf:2\ncell:T34:l:1:f:6:cf:2\ncell:U34:l:1:f:6:cf:2\ncell:V34:l:1:f:6:cf:2\ncell:W34:l:1:f:6:cf:2\ncell:O35:l:1:f:6:cf:2\ncell:P35:l:1:f:6:cf:2\ncell:Q35:l:1:f:6:cf:2\ncell:R35:l:1:f:6:cf:2\ncell:S35:l:1:f:6:cf:2\ncell:T35:l:1:f:6:cf:2\ncell:U35:l:1:f:6:cf:2\ncell:V35:l:1:f:6:cf:2\ncell:W35:l:1:f:6:cf:2\ncell:O36:l:1:f:6:cf:2\ncell:P36:l:1:f:6:cf:2\ncell:Q36:l:1:f:6:cf:2\ncell:R36:l:1:f:6:cf:2\ncell:S36:l:1:f:6:cf:2\ncell:T36:l:1:f:6:cf:2\ncell:U36:l:1:f:6:cf:2\ncell:V36:l:1:f:6:cf:2\ncell:W36:l:1:f:6:cf:2\ncell:O37:l:1:f:6:cf:2\ncell:P37:l:1:f:6:cf:2\ncell:Q37:l:1:f:6:cf:2\ncell:R37:l:1:f:6:cf:2\ncell:S37:l:1:f:6:cf:2\ncell:T37:l:1:f:6:cf:2\ncell:U37:l:1:f:6:cf:2\ncell:V37:l:1:f:6:cf:2\ncell:W37:l:1:f:6:cf:2\ncell:O38:l:1:f:6:cf:2\ncell:P38:l:1:f:6:cf:2\ncell:Q38:l:1:f:6:cf:2\ncell:R38:l:1:f:6:cf:2\ncell:S38:l:1:f:6:cf:2\ncell:T38:l:1:f:6:cf:2\ncell:U38:l:1:f:6:cf:2\ncell:V38:l:1:f:6:cf:2\ncell:W38:l:1:f:6:cf:2\ncell:O39:l:1:f:6:cf:2\ncell:P39:l:1:f:6:cf:2\ncell:Q39:l:1:f:6:cf:2\ncell:R39:l:1:f:6:cf:2\ncell:S39:l:1:f:6:cf:2\ncell:T39:l:1:f:6:cf:2\ncell:U39:l:1:f:6:cf:2\ncell:V39:l:1:f:6:cf:2\ncell:W39:l:1:f:6:cf:2\ncell:O40:l:1:f:6:cf:2\ncell:P40:l:1:f:6:cf:2\ncell:Q40:l:1:f:6:cf:2\ncell:R40:l:1:f:6:cf:2\ncell:S40:l:1:f:6:cf:2\ncell:T40:l:1:f:6:cf:2\ncell:U40:l:1:f:6:cf:2\ncell:V40:l:1:f:6:cf:2\ncell:W40:l:1:f:6:cf:2\ncell:O41:l:1:f:6:cf:2\ncell:P41:l:1:f:6:cf:2\ncell:Q41:l:1:f:6:cf:2\ncell:R41:l:1:f:6:cf:2\ncell:S41:l:1:f:6:cf:2\ncell:T41:l:1:f:6:cf:2\ncell:U41:l:1:f:6:cf:2\ncell:V41:l:1:f:6:cf:2\ncell:W41:l:1:f:6:cf:2\ncell:O42:l:1:f:6:cf:2\ncell:P42:l:1:f:6:cf:2\ncell:Q42:l:1:f:6:cf:2\ncell:R42:l:1:f:6:cf:2\ncell:S42:l:1:f:6:cf:2\ncell:T42:l:1:f:6:cf:2\ncell:U42:l:1:f:6:cf:2\ncell:V42:l:1:f:6:cf:2\ncell:W42:l:1:f:6:cf:2\ncell:O43:l:1:f:6:cf:2\ncell:P43:l:1:f:6:cf:2\ncell:Q43:l:1:f:6:cf:2\ncell:R43:l:1:f:6:cf:2\ncell:S43:l:1:f:6:cf:2\ncell:T43:l:1:f:6:cf:2\ncell:U43:l:1:f:6:cf:2\ncell:V43:l:1:f:6:cf:2\ncell:W43:l:1:f:6:cf:2\ncell:O44:l:1:f:6:cf:2\ncell:P44:l:1:f:6:cf:2\ncell:Q44:l:1:f:6:cf:2\ncell:R44:l:1:f:6:cf:2\ncell:S44:l:1:f:6:cf:2\ncell:T44:l:1:f:6:cf:2\ncell:U44:l:1:f:6:cf:2\ncell:V44:l:1:f:6:cf:2\ncell:W44:l:1:f:6:cf:2\ncell:O45:l:1:f:6:cf:2\ncell:P45:l:1:f:6:cf:2\ncell:Q45:l:1:f:6:cf:2\ncell:R45:l:1:f:6:cf:2\ncell:O46:l:1:f:6:cf:2\ncell:P46:l:1:f:6:cf:2\ncell:Q46:l:1:f:6:cf:2\ncell:R46:l:1:f:6:cf:2\ncell:O47:l:1:f:6:cf:2\ncell:P47:l:1:f:6:cf:2\ncell:Q47:l:1:f:6:cf:2\ncell:R47:l:1:f:6:cf:2\ncell:O48:l:1:f:6:cf:2\ncell:P48:l:1:f:6:cf:2\ncell:Q48:l:1:f:6:cf:2\ncell:R48:l:1:f:6:cf:2\ncell:O49:l:1:f:6:cf:2\ncell:P49:l:1:f:6:cf:2\ncell:Q49:l:1:f:6:cf:2\ncell:R49:l:1:f:6:cf:2\ncell:O50:l:1:f:6:cf:2\ncell:P50:l:1:f:6:cf:2\ncell:Q50:l:1:f:6:cf:2\ncell:R50:l:1:f:6:cf:2\ncell:O51:l:1:f:6:cf:2\ncell:P51:l:1:f:6:cf:2\ncell:Q51:l:1:f:6:cf:2\ncell:R51:l:1:f:6:cf:2\ncell:O52:l:1:f:6:cf:2\ncell:P52:l:1:f:6:cf:2\ncell:Q52:l:1:f:6:cf:2\ncell:R52:l:1:f:6:cf:2\ncell:O53:l:1:f:6:cf:2\ncell:P53:l:1:f:6:cf:2\ncell:Q53:l:1:f:6:cf:2\ncell:R53:l:1:f:6:cf:2\ncell:O54:l:1:f:6:cf:2\ncell:P54:l:1:f:6:cf:2\ncell:Q54:l:1:f:6:cf:2\ncell:R54:l:1:f:6:cf:2\ncell:O55:l:1:f:6:cf:2\ncell:P55:l:1:f:6:cf:2\ncell:Q55:l:1:f:6:cf:2\ncell:R55:l:1:f:6:cf:2\ncell:O56:l:1:f:6:cf:2\ncell:P56:l:1:f:6:cf:2\ncell:Q56:l:1:f:6:cf:2\ncell:R56:l:1:f:6:cf:2\ncell:O57:l:1:f:6:cf:2\ncell:P57:l:1:f:6:cf:2\ncell:Q57:l:1:f:6:cf:2\ncell:R57:l:1:f:6:cf:2\ncell:O58:l:1:f:6:cf:2\ncell:P58:l:1:f:6:cf:2\ncell:Q58:l:1:f:6:cf:2\ncell:R58:l:1:f:6:cf:2\ncell:B59:l:1:f:6:cf:2\ncell:C59:l:1:f:6:cf:2\ncell:D59:l:1:f:2:cf:2\ncell:E59:l:1:f:2:cf:3:ntvf:1\ncell:F59:l:1:f:2:cf:3:ntvf:1\ncell:O59:l:1:f:6:cf:2\ncell:P59:l:1:f:6:cf:2\ncell:Q59:l:1:f:6:cf:2\ncell:R59:l:1:f:6:cf:2\ncell:B60:l:1:f:4:cf:2\ncell:C60:l:1:f:4:cf:2\ncell:D60:l:1:f:8:cf:2\ncell:E60:l:1:f:8:cf:2\ncell:F60:l:1:f:6:cf:2\ncell:O60:l:1:f:6:cf:2\ncell:P60:l:1:f:6:cf:2\ncell:Q60:l:1:f:6:cf:2\ncell:R60:l:1:f:6:cf:2\ncell:O61:l:1:f:6:cf:2\ncell:P61:l:1:f:6:cf:2\ncell:Q61:l:1:f:6:cf:2\ncell:R61:l:1:f:6:cf:2\ncell:O62:l:1:f:6:cf:2\ncell:P62:l:1:f:6:cf:2\ncell:Q62:l:1:f:6:cf:2\ncell:R62:l:1:f:6:cf:2\ncell:O63:l:1:f:6:cf:2\ncell:P63:l:1:f:6:cf:2\ncell:Q63:l:1:f:6:cf:2\ncell:R63:l:1:f:6:cf:2\ncell:O64:l:1:f:6:cf:2\ncell:P64:l:1:f:6:cf:2\ncell:Q64:l:1:f:6:cf:2\ncell:R64:l:1:f:6:cf:2\ncell:O65:l:1:f:6:cf:2\ncell:P65:l:1:f:6:cf:2\ncell:Q65:l:1:f:6:cf:2\ncell:R65:l:1:f:6:cf:2\ncell:O66:l:1:f:6:cf:2\ncell:P66:l:1:f:6:cf:2\ncell:Q66:l:1:f:6:cf:2\ncell:R66:l:1:f:6:cf:2\ncell:O67:l:1:f:6:cf:2\ncell:P67:l:1:f:6:cf:2\ncell:Q67:l:1:f:6:cf:2\ncell:R67:l:1:f:6:cf:2\ncell:O68:l:1:f:6:cf:2\ncell:P68:l:1:f:6:cf:2\ncell:Q68:l:1:f:6:cf:2\ncell:R68:l:1:f:6:cf:2\ncell:O69:l:1:f:6:cf:2\ncell:P69:l:1:f:6:cf:2\ncell:Q69:l:1:f:6:cf:2\ncell:R69:l:1:f:6:cf:2\ncell:O70:l:1:f:6:cf:2\ncell:P70:l:1:f:6:cf:2\ncell:Q70:l:1:f:6:cf:2\ncell:R70:l:1:f:6:cf:2\ncell:S70:l:1:f:6:cf:2\ncell:T70:l:1:f:6:cf:2\ncell:U70:l:1:f:6:cf:2\ncell:V70:l:1:f:6:cf:2\ncell:W70:l:1:f:6:cf:2\ncell:O71:l:1:f:6:cf:2\ncell:P71:l:1:f:6:cf:2\ncell:Q71:l:1:f:6:cf:2\ncell:R71:l:1:f:6:cf:2\ncell:S71:l:1:f:6:cf:2\ncell:T71:l:1:f:6:cf:2\ncell:U71:l:1:f:6:cf:2\ncell:V71:l:1:f:6:cf:2\ncell:W71:l:1:f:6:cf:2\ncell:O72:l:1:f:6:cf:2\ncell:P72:l:1:f:6:cf:2\ncell:Q72:l:1:f:6:cf:2\ncell:R72:l:1:f:6:cf:2\ncell:S72:l:1:f:6:cf:2\ncell:T72:l:1:f:6:cf:2\ncell:U72:l:1:f:6:cf:2\ncell:V72:l:1:f:6:cf:2\ncell:W72:l:1:f:6:cf:2\ncell:O73:l:1:f:6:cf:2\ncell:P73:l:1:f:6:cf:2\ncell:Q73:l:1:f:6:cf:2\ncell:R73:l:1:f:6:cf:2\ncell:S73:l:1:f:6:cf:2\ncell:T73:l:1:f:6:cf:2\ncell:U73:l:1:f:6:cf:2\ncell:V73:l:1:f:6:cf:2\ncell:W73:l:1:f:6:cf:2\ncell:O74:l:1:f:6:cf:2\ncell:P74:l:1:f:6:cf:2\ncell:Q74:l:1:f:6:cf:2\ncell:R74:l:1:f:6:cf:2\ncell:S74:l:1:f:6:cf:2\ncell:T74:l:1:f:6:cf:2\ncell:U74:l:1:f:6:cf:2\ncell:V74:l:1:f:6:cf:2\ncell:W74:l:1:f:6:cf:2\ncell:O75:l:1:f:6:cf:2\ncell:P75:l:1:f:6:cf:2\ncell:Q75:l:1:f:6:cf:2\ncell:R75:l:1:f:6:cf:2\ncell:S75:l:1:f:6:cf:2\ncell:T75:l:1:f:6:cf:2\ncell:U75:l:1:f:6:cf:2\ncell:V75:l:1:f:6:cf:2\ncell:W75:l:1:f:6:cf:2\ncell:O76:l:1:f:6:cf:2\ncell:P76:l:1:f:6:cf:2\ncell:Q76:l:1:f:6:cf:2\ncell:R76:l:1:f:6:cf:2\ncell:S76:l:1:f:6:cf:2\ncell:T76:l:1:f:6:cf:2\ncell:U76:l:1:f:6:cf:2\ncell:V76:l:1:f:6:cf:2\ncell:W76:l:1:f:6:cf:2\ncell:O77:l:1:f:6:cf:2\ncell:P77:l:1:f:6:cf:2\ncell:Q77:l:1:f:6:cf:2\ncell:R77:l:1:f:6:cf:2\ncell:S77:l:1:f:6:cf:2\ncell:T77:l:1:f:6:cf:2\ncell:U77:l:1:f:6:cf:2\ncell:V77:l:1:f:6:cf:2\ncell:W77:l:1:f:6:cf:2\ncell:O78:l:1:f:6:cf:2\ncell:P78:l:1:f:6:cf:2\ncell:Q78:l:1:f:6:cf:2\ncell:R78:l:1:f:6:cf:2\ncell:S78:l:1:f:6:cf:2\ncell:T78:l:1:f:6:cf:2\ncell:U78:l:1:f:6:cf:2\ncell:V78:l:1:f:6:cf:2\ncell:W78:l:1:f:6:cf:2\ncell:O79:l:1:f:6:cf:2\ncell:P79:l:1:f:6:cf:2\ncell:Q79:l:1:f:6:cf:2\ncell:R79:l:1:f:6:cf:2\ncell:S79:l:1:f:6:cf:2\ncell:T79:l:1:f:6:cf:2\ncell:U79:l:1:f:6:cf:2\ncell:V79:l:1:f:6:cf:2\ncell:W79:l:1:f:6:cf:2\ncell:O80:l:1:f:6:cf:2\ncell:P80:l:1:f:6:cf:2\ncell:Q80:l:1:f:6:cf:2\ncell:R80:l:1:f:6:cf:2\ncell:S80:l:1:f:6:cf:2\ncell:T80:l:1:f:6:cf:2\ncell:U80:l:1:f:6:cf:2\ncell:V80:l:1:f:6:cf:2\ncell:W80:l:1:f:6:cf:2\ncell:O81:l:1:f:6:cf:2\ncell:P81:l:1:f:6:cf:2\ncell:Q81:l:1:f:6:cf:2\ncell:R81:l:1:f:6:cf:2\ncell:S81:l:1:f:6:cf:2\ncell:T81:l:1:f:6:cf:2\ncell:U81:l:1:f:6:cf:2\ncell:V81:l:1:f:6:cf:2\ncell:W81:l:1:f:6:cf:2\ncell:O82:l:1:f:6:cf:2\ncell:P82:l:1:f:6:cf:2\ncell:Q82:l:1:f:6:cf:2\ncell:R82:l:1:f:6:cf:2\ncell:S82:l:1:f:6:cf:2\ncell:T82:l:1:f:6:cf:2\ncell:U82:l:1:f:6:cf:2\ncell:V82:l:1:f:6:cf:2\ncell:W82:l:1:f:6:cf:2\ncell:O83:l:1:f:6:cf:2\ncell:P83:l:1:f:6:cf:2\ncell:Q83:l:1:f:6:cf:2\ncell:R83:l:1:f:6:cf:2\ncell:S83:l:1:f:6:cf:2\ncell:T83:l:1:f:6:cf:2\ncell:U83:l:1:f:6:cf:2\ncell:V83:l:1:f:6:cf:2\ncell:W83:l:1:f:6:cf:2\ncell:O84:l:1:f:6:cf:2\ncell:P84:l:1:f:6:cf:2\ncell:Q84:l:1:f:6:cf:2\ncell:R84:l:1:f:6:cf:2\ncell:S84:l:1:f:6:cf:2\ncell:T84:l:1:f:6:cf:2\ncell:U84:l:1:f:6:cf:2\ncell:V84:l:1:f:6:cf:2\ncell:W84:l:1:f:6:cf:2\ncell:O85:l:1:f:6:cf:2\ncell:P85:l:1:f:6:cf:2\ncell:Q85:l:1:f:6:cf:2\ncell:R85:l:1:f:6:cf:2\ncell:S85:l:1:f:6:cf:2\ncell:T85:l:1:f:6:cf:2\ncell:U85:l:1:f:6:cf:2\ncell:V85:l:1:f:6:cf:2\ncell:W85:l:1:f:6:cf:2\ncell:O86:l:1:f:6:cf:2\ncell:P86:l:1:f:6:cf:2\ncell:Q86:l:1:f:6:cf:2\ncell:R86:l:1:f:6:cf:2\ncell:S86:l:1:f:6:cf:2\ncell:T86:l:1:f:6:cf:2\ncell:U86:l:1:f:6:cf:2\ncell:V86:l:1:f:6:cf:2\ncell:W86:l:1:f:6:cf:2\ncell:O87:l:1:f:6:cf:2\ncell:P87:l:1:f:6:cf:2\ncell:Q87:l:1:f:6:cf:2\ncell:R87:l:1:f:6:cf:2\ncell:S87:l:1:f:6:cf:2\ncell:T87:l:1:f:6:cf:2\ncell:U87:l:1:f:6:cf:2\ncell:V87:l:1:f:6:cf:2\ncell:W87:l:1:f:6:cf:2\ncell:O88:l:1:f:6:cf:2\ncell:P88:l:1:f:6:cf:2\ncell:Q88:l:1:f:6:cf:2\ncell:R88:l:1:f:6:cf:2\ncell:S88:l:1:f:6:cf:2\ncell:T88:l:1:f:6:cf:2\ncell:U88:l:1:f:6:cf:2\ncell:V88:l:1:f:6:cf:2\ncell:W88:l:1:f:6:cf:2\ncell:O89:l:1:f:6:cf:2\ncell:P89:l:1:f:6:cf:2\ncell:Q89:l:1:f:6:cf:2\ncell:R89:l:1:f:6:cf:2\ncell:S89:l:1:f:6:cf:2\ncell:T89:l:1:f:6:cf:2\ncell:U89:l:1:f:6:cf:2\ncell:V89:l:1:f:6:cf:2\ncell:W89:l:1:f:6:cf:2\ncell:O90:l:1:f:6:cf:2\ncell:P90:l:1:f:6:cf:2\ncell:Q90:l:1:f:6:cf:2\ncell:R90:l:1:f:6:cf:2\ncell:S90:l:1:f:6:cf:2\ncell:T90:l:1:f:6:cf:2\ncell:U90:l:1:f:6:cf:2\ncell:V90:l:1:f:6:cf:2\ncell:W90:l:1:f:6:cf:2\ncell:O91:l:1:f:6:cf:2\ncell:P91:l:1:f:6:cf:2\ncell:Q91:l:1:f:6:cf:2\ncell:R91:l:1:f:6:cf:2\ncell:S91:l:1:f:6:cf:2\ncell:T91:l:1:f:6:cf:2\ncell:U91:l:1:f:6:cf:2\ncell:V91:l:1:f:6:cf:2\ncell:W91:l:1:f:6:cf:2\ncell:O92:l:1:f:6:cf:2\ncell:P92:l:1:f:6:cf:2\ncell:Q92:l:1:f:6:cf:2\ncell:R92:l:1:f:6:cf:2\ncell:S92:l:1:f:6:cf:2\ncell:T92:l:1:f:6:cf:2\ncell:U92:l:1:f:6:cf:2\ncell:V92:l:1:f:6:cf:2\ncell:W92:l:1:f:6:cf:2\ncell:O93:l:1:f:6:cf:2\ncell:P93:l:1:f:6:cf:2\ncell:Q93:l:1:f:6:cf:2\ncell:R93:l:1:f:6:cf:2\ncell:S93:l:1:f:6:cf:2\ncell:T93:l:1:f:6:cf:2\ncell:U93:l:1:f:6:cf:2\ncell:V93:l:1:f:6:cf:2\ncell:W93:l:1:f:6:cf:2\ncell:O94:l:1:f:6:cf:2\ncell:P94:l:1:f:6:cf:2\ncell:Q94:l:1:f:6:cf:2\ncell:R94:l:1:f:6:cf:2\ncell:S94:l:1:f:6:cf:2\ncell:T94:l:1:f:6:cf:2\ncell:U94:l:1:f:6:cf:2\ncell:V94:l:1:f:6:cf:2\ncell:W94:l:1:f:6:cf:2\ncell:O95:l:1:f:6:cf:2\ncell:P95:l:1:f:6:cf:2\ncell:Q95:l:1:f:6:cf:2\ncell:R95:l:1:f:6:cf:2\ncell:S95:l:1:f:6:cf:2\ncell:T95:l:1:f:6:cf:2\ncell:U95:l:1:f:6:cf:2\ncell:V95:l:1:f:6:cf:2\ncell:W95:l:1:f:6:cf:2\ncell:O96:l:1:f:6:cf:2\ncell:P96:l:1:f:6:cf:2\ncell:Q96:l:1:f:6:cf:2\ncell:R96:l:1:f:6:cf:2\ncell:S96:l:1:f:6:cf:2\ncell:T96:l:1:f:6:cf:2\ncell:U96:l:1:f:6:cf:2\ncell:V96:l:1:f:6:cf:2\ncell:W96:l:1:f:6:cf:2\ncell:O97:l:1:f:6:cf:2\ncell:P97:l:1:f:6:cf:2\ncell:Q97:l:1:f:6:cf:2\ncell:R97:l:1:f:6:cf:2\ncell:S97:l:1:f:6:cf:2\ncell:T97:l:1:f:6:cf:2\ncell:U97:l:1:f:6:cf:2\ncell:V97:l:1:f:6:cf:2\ncell:W97:l:1:f:6:cf:2\ncell:O98:l:1:f:6:cf:2\ncell:P98:l:1:f:6:cf:2\ncell:Q98:l:1:f:6:cf:2\ncell:R98:l:1:f:6:cf:2\ncell:S98:l:1:f:6:cf:2\ncell:T98:l:1:f:6:cf:2\ncell:U98:l:1:f:6:cf:2\ncell:V98:l:1:f:6:cf:2\ncell:W98:l:1:f:6:cf:2\ncell:O99:l:1:f:6:cf:2\ncell:P99:l:1:f:6:cf:2\ncell:Q99:l:1:f:6:cf:2\ncell:R99:l:1:f:6:cf:2\ncell:S99:l:1:f:6:cf:2\ncell:T99:l:1:f:6:cf:2\ncell:U99:l:1:f:6:cf:2\ncell:V99:l:1:f:6:cf:2\ncell:W99:l:1:f:6:cf:2\ncell:O100:l:1:f:6:cf:2\ncell:P100:l:1:f:6:cf:2\ncell:Q100:l:1:f:6:cf:2\ncell:R100:l:1:f:6:cf:2\ncell:S100:l:1:f:6:cf:2\ncell:T100:l:1:f:6:cf:2\ncell:U100:l:1:f:6:cf:2\ncell:V100:l:1:f:6:cf:2\ncell:W100:l:1:f:6:cf:2\ncell:O101:l:1:f:6:cf:2\ncell:P101:l:1:f:6:cf:2\ncell:Q101:l:1:f:6:cf:2\ncell:R101:l:1:f:6:cf:2\ncell:S101:l:1:f:6:cf:2\ncell:T101:l:1:f:6:cf:2\ncell:U101:l:1:f:6:cf:2\ncell:V101:l:1:f:6:cf:2\ncell:W101:l:1:f:6:cf:2\ncell:O102:l:1:f:6:cf:2\ncell:P102:l:1:f:6:cf:2\ncell:Q102:l:1:f:6:cf:2\ncell:R102:l:1:f:6:cf:2\ncell:S102:l:1:f:6:cf:2\ncell:T102:l:1:f:6:cf:2\ncell:U102:l:1:f:6:cf:2\ncell:V102:l:1:f:6:cf:2\ncell:W102:l:1:f:6:cf:2\ncell:O103:l:1:f:6:cf:2\ncell:P103:l:1:f:6:cf:2\ncell:Q103:l:1:f:6:cf:2\ncell:R103:l:1:f:6:cf:2\ncell:S103:l:1:f:6:cf:2\ncell:T103:l:1:f:6:cf:2\ncell:U103:l:1:f:6:cf:2\ncell:V103:l:1:f:6:cf:2\ncell:W103:l:1:f:6:cf:2\ncell:O104:l:1:f:6:cf:2\ncell:P104:l:1:f:6:cf:2\ncell:Q104:l:1:f:6:cf:2\ncell:R104:l:1:f:6:cf:2\ncell:S104:l:1:f:6:cf:2\ncell:T104:l:1:f:6:cf:2\ncell:U104:l:1:f:6:cf:2\ncell:V104:l:1:f:6:cf:2\ncell:W104:l:1:f:6:cf:2\ncell:O105:l:1:f:6:cf:2\ncell:P105:l:1:f:6:cf:2\ncell:Q105:l:1:f:6:cf:2\ncell:R105:l:1:f:6:cf:2\ncell:S105:l:1:f:6:cf:2\ncell:T105:l:1:f:6:cf:2\ncell:U105:l:1:f:6:cf:2\ncell:V105:l:1:f:6:cf:2\ncell:W105:l:1:f:6:cf:2\ncell:O106:l:1:f:6:cf:2\ncell:P106:l:1:f:6:cf:2\ncell:Q106:l:1:f:6:cf:2\ncell:R106:l:1:f:6:cf:2\ncell:S106:l:1:f:6:cf:2\ncell:T106:l:1:f:6:cf:2\ncell:U106:l:1:f:6:cf:2\ncell:V106:l:1:f:6:cf:2\ncell:W106:l:1:f:6:cf:2\ncell:O107:l:1:f:6:cf:2\ncell:P107:l:1:f:6:cf:2\ncell:Q107:l:1:f:6:cf:2\ncell:R107:l:1:f:6:cf:2\ncell:S107:l:1:f:6:cf:2\ncell:T107:l:1:f:6:cf:2\ncell:U107:l:1:f:6:cf:2\ncell:V107:l:1:f:6:cf:2\ncell:W107:l:1:f:6:cf:2\ncell:O108:l:1:f:6:cf:2\ncell:P108:l:1:f:6:cf:2\ncell:Q108:l:1:f:6:cf:2\ncell:R108:l:1:f:6:cf:2\ncell:S108:l:1:f:6:cf:2\ncell:T108:l:1:f:6:cf:2\ncell:U108:l:1:f:6:cf:2\ncell:V108:l:1:f:6:cf:2\ncell:W108:l:1:f:6:cf:2\ncell:O109:l:1:f:6:cf:2\ncell:P109:l:1:f:6:cf:2\ncell:Q109:l:1:f:6:cf:2\ncell:R109:l:1:f:6:cf:2\ncell:S109:l:1:f:6:cf:2\ncell:T109:l:1:f:6:cf:2\ncell:U109:l:1:f:6:cf:2\ncell:V109:l:1:f:6:cf:2\ncell:W109:l:1:f:6:cf:2\ncell:O110:l:1:f:6:cf:2\ncell:P110:l:1:f:6:cf:2\ncell:Q110:l:1:f:6:cf:2\ncell:R110:l:1:f:6:cf:2\ncell:S110:l:1:f:6:cf:2\ncell:T110:l:1:f:6:cf:2\ncell:U110:l:1:f:6:cf:2\ncell:V110:l:1:f:6:cf:2\ncell:W110:l:1:f:6:cf:2\ncell:O111:l:1:f:6:cf:2\ncell:P111:l:1:f:6:cf:2\ncell:Q111:l:1:f:6:cf:2\ncell:R111:l:1:f:6:cf:2\ncell:S111:l:1:f:6:cf:2\ncell:T111:l:1:f:6:cf:2\ncell:U111:l:1:f:6:cf:2\ncell:V111:l:1:f:6:cf:2\ncell:W111:l:1:f:6:cf:2\ncell:O112:l:1:f:6:cf:2\ncell:P112:l:1:f:6:cf:2\ncell:Q112:l:1:f:6:cf:2\ncell:R112:l:1:f:6:cf:2\ncell:S112:l:1:f:6:cf:2\ncell:T112:l:1:f:6:cf:2\ncell:U112:l:1:f:6:cf:2\ncell:V112:l:1:f:6:cf:2\ncell:W112:l:1:f:6:cf:2\ncell:O113:l:1:f:6:cf:2\ncell:P113:l:1:f:6:cf:2\ncell:Q113:l:1:f:6:cf:2\ncell:R113:l:1:f:6:cf:2\ncell:S113:l:1:f:6:cf:2\ncell:T113:l:1:f:6:cf:2\ncell:U113:l:1:f:6:cf:2\ncell:V113:l:1:f:6:cf:2\ncell:W113:l:1:f:6:cf:2\ncell:O114:l:1:f:6:cf:2\ncell:P114:l:1:f:6:cf:2\ncell:Q114:l:1:f:6:cf:2\ncell:R114:l:1:f:6:cf:2\ncell:S114:l:1:f:6:cf:2\ncell:T114:l:1:f:6:cf:2\ncell:U114:l:1:f:6:cf:2\ncell:V114:l:1:f:6:cf:2\ncell:W114:l:1:f:6:cf:2\ncell:O115:l:1:f:6:cf:2\ncell:P115:l:1:f:6:cf:2\ncell:Q115:l:1:f:6:cf:2\ncell:R115:l:1:f:6:cf:2\ncell:S115:l:1:f:6:cf:2\ncell:T115:l:1:f:6:cf:2\ncell:U115:l:1:f:6:cf:2\ncell:V115:l:1:f:6:cf:2\ncell:W115:l:1:f:6:cf:2\ncell:O116:l:1:f:6:cf:2\ncell:P116:l:1:f:6:cf:2\ncell:Q116:l:1:f:6:cf:2\ncell:R116:l:1:f:6:cf:2\ncell:S116:l:1:f:6:cf:2\ncell:T116:l:1:f:6:cf:2\ncell:U116:l:1:f:6:cf:2\ncell:V116:l:1:f:6:cf:2\ncell:W116:l:1:f:6:cf:2\ncell:O117:l:1:f:6:cf:2\ncell:P117:l:1:f:6:cf:2\ncell:Q117:l:1:f:6:cf:2\ncell:R117:l:1:f:6:cf:2\ncell:S117:l:1:f:6:cf:2\ncell:T117:l:1:f:6:cf:2\ncell:U117:l:1:f:6:cf:2\ncell:V117:l:1:f:6:cf:2\ncell:W117:l:1:f:6:cf:2\ncell:O118:l:1:f:6:cf:2\ncell:P118:l:1:f:6:cf:2\ncell:Q118:l:1:f:6:cf:2\ncell:R118:l:1:f:6:cf:2\ncell:S118:l:1:f:6:cf:2\ncell:T118:l:1:f:6:cf:2\ncell:U118:l:1:f:6:cf:2\ncell:V118:l:1:f:6:cf:2\ncell:W118:l:1:f:6:cf:2\ncell:O119:l:1:f:6:cf:2\ncell:P119:l:1:f:6:cf:2\ncell:Q119:l:1:f:6:cf:2\ncell:R119:l:1:f:6:cf:2\ncell:S119:l:1:f:6:cf:2\ncell:T119:l:1:f:6:cf:2\ncell:U119:l:1:f:6:cf:2\ncell:V119:l:1:f:6:cf:2\ncell:W119:l:1:f:6:cf:2\ncell:O120:l:1:f:6:cf:2\ncell:P120:l:1:f:6:cf:2\ncell:Q120:l:1:f:6:cf:2\ncell:R120:l:1:f:6:cf:2\ncell:S120:l:1:f:6:cf:2\ncell:T120:l:1:f:6:cf:2\ncell:U120:l:1:f:6:cf:2\ncell:V120:l:1:f:6:cf:2\ncell:W120:l:1:f:6:cf:2\ncell:O121:l:1:f:6:cf:2\ncell:P121:l:1:f:6:cf:2\ncell:Q121:l:1:f:6:cf:2\ncell:R121:l:1:f:6:cf:2\ncell:S121:l:1:f:6:cf:2\ncell:T121:l:1:f:6:cf:2\ncell:U121:l:1:f:6:cf:2\ncell:V121:l:1:f:6:cf:2\ncell:W121:l:1:f:6:cf:2\ncell:O122:l:1:f:7:cf:2\ncell:P122:l:1:f:7:cf:2\ncell:Q122:l:1:f:7:cf:2\ncell:R122:l:1:f:7:cf:2\ncell:S122:l:1:f:7:cf:2\ncell:T122:l:1:f:7:cf:2\ncell:U122:l:1:f:7:cf:2\ncell:V122:l:1:f:7:cf:2\ncell:W122:l:1:f:7:cf:2\ncell:O123:l:1:f:7:cf:2\ncell:P123:l:1:f:7:cf:2\ncell:Q123:l:1:f:7:cf:2\ncell:R123:l:1:f:7:cf:2\ncell:S123:l:1:f:7:cf:2\ncell:T123:l:1:f:7:cf:2\ncell:U123:l:1:f:7:cf:2\ncell:V123:l:1:f:7:cf:2\ncell:W123:l:1:f:7:cf:2\ncell:O124:l:1:f:7:cf:2\ncell:P124:l:1:f:7:cf:2\ncell:Q124:l:1:f:7:cf:2\ncell:R124:l:1:f:7:cf:2\ncell:S124:l:1:f:7:cf:2\ncell:T124:l:1:f:7:cf:2\ncell:U124:l:1:f:7:cf:2\ncell:V124:l:1:f:7:cf:2\ncell:W124:l:1:f:7:cf:2\ncell:O125:l:1:f:7:cf:2\ncell:P125:l:1:f:7:cf:2\ncell:Q125:l:1:f:7:cf:2\ncell:R125:l:1:f:7:cf:2\ncell:S125:l:1:f:7:cf:2\ncell:T125:l:1:f:7:cf:2\ncell:U125:l:1:f:7:cf:2\ncell:V125:l:1:f:7:cf:2\ncell:W125:l:1:f:7:cf:2\ncell:A126:l:1:f:7:cf:2\ncell:B126:l:1:f:7:cf:2\ncell:C126:l:1:f:7:cf:2\ncell:D126:l:1:f:7:cf:2\ncell:E126:l:1:f:7:cf:2\ncell:F126:t:Monthly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G126:l:1:f:7:cf:2\ncell:H126:l:1:f:7:cf:2\ncell:I126:l:1:f:7:cf:2\ncell:J126:l:1:f:7:cf:2\ncell:K126:l:1:f:7:cf:2\ncell:L126:l:1:f:7:cf:2\ncell:M126:l:1:f:7:cf:2\ncell:N126:l:1:f:7:cf:2\ncell:O126:l:1:f:7:cf:2\ncell:P126:l:1:f:7:cf:2\ncell:Q126:l:1:f:7:cf:2\ncell:R126:l:1:f:7:cf:2\ncell:S126:l:1:f:7:cf:2\ncell:T126:l:1:f:7:cf:2\ncell:U126:l:1:f:7:cf:2\ncell:V126:l:1:f:7:cf:2\ncell:W126:l:1:f:7:cf:2\ncell:A127:l:1:f:7:cf:2\ncell:B127:l:1:f:7:cf:2\ncell:C127:l:1:f:7:cf:2\ncell:D127:l:1:f:7:cf:2\ncell:E127:l:1:f:7:cf:2\ncell:F127:t:Semi-Annually:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G127:l:1:f:7:cf:2\ncell:H127:l:1:f:7:cf:2\ncell:I127:l:1:f:7:cf:2\ncell:J127:l:1:f:7:cf:2\ncell:K127:l:1:f:7:cf:2\ncell:L127:l:1:f:7:cf:2\ncell:M127:l:1:f:7:cf:2\ncell:N127:l:1:f:7:cf:2\ncell:O127:l:1:f:7:cf:2\ncell:P127:l:1:f:7:cf:2\ncell:Q127:l:1:f:7:cf:2\ncell:R127:l:1:f:7:cf:2\ncell:S127:l:1:f:7:cf:2\ncell:T127:l:1:f:7:cf:2\ncell:U127:l:1:f:7:cf:2\ncell:V127:l:1:f:7:cf:2\ncell:W127:l:1:f:7:cf:2\ncell:A128:l:1:f:7:cf:2\ncell:B128:l:1:f:7:cf:2\ncell:C128:l:1:f:7:cf:2\ncell:D128:l:1:f:7:cf:2\ncell:E128:l:1:f:7:cf:2\ncell:F128:t:Quarterly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G128:l:1:f:7:cf:2\ncell:H128:l:1:f:7:cf:2\ncell:I128:l:1:f:7:cf:2\ncell:J128:l:1:f:7:cf:2\ncell:K128:l:1:f:7:cf:2\ncell:L128:l:1:f:7:cf:2\ncell:M128:l:1:f:7:cf:2\ncell:N128:l:1:f:7:cf:2\ncell:O128:l:1:f:7:cf:2\ncell:P128:l:1:f:7:cf:2\ncell:Q128:l:1:f:7:cf:2\ncell:R128:l:1:f:7:cf:2\ncell:S128:l:1:f:7:cf:2\ncell:T128:l:1:f:7:cf:2\ncell:U128:l:1:f:7:cf:2\ncell:V128:l:1:f:7:cf:2\ncell:W128:l:1:f:7:cf:2\ncell:A129:l:1:f:7:cf:2\ncell:B129:l:1:f:7:cf:2\ncell:C129:l:1:f:7:cf:2\ncell:D129:l:1:f:7:cf:2\ncell:E129:l:1:f:7:cf:2\ncell:F129:t:Yearly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G129:l:1:f:7:cf:2\ncell:H129:l:1:f:7:cf:2\ncell:I129:l:1:f:7:cf:2\ncell:J129:l:1:f:7:cf:2\ncell:K129:l:1:f:7:cf:2\ncell:L129:l:1:f:7:cf:2\ncell:M129:l:1:f:7:cf:2\ncell:N129:l:1:f:7:cf:2\ncell:O129:l:1:f:7:cf:2\ncell:P129:l:1:f:7:cf:2\ncell:Q129:l:1:f:7:cf:2\ncell:R129:l:1:f:7:cf:2\ncell:S129:l:1:f:7:cf:2\ncell:T129:l:1:f:7:cf:2\ncell:U129:l:1:f:7:cf:2\ncell:V129:l:1:f:7:cf:2\ncell:W129:l:1:f:7:cf:2\ncell:A130:l:1:f:7:cf:2\ncell:B130:l:1:f:7:cf:2\ncell:C130:l:1:f:7:cf:2\ncell:D130:l:1:f:7:cf:2\ncell:E130:l:1:f:7:cf:2\ncell:F130:l:1:f:7:cf:2\ncell:G130:l:1:f:7:cf:2\ncell:H130:l:1:f:7:cf:2\ncell:I130:l:1:f:7:cf:2\ncell:J130:l:1:f:7:cf:2\ncell:K130:l:1:f:7:cf:2\ncell:L130:l:1:f:7:cf:2\ncell:M130:l:1:f:7:cf:2\ncell:N130:l:1:f:7:cf:2\ncell:O130:l:1:f:7:cf:2\ncell:P130:l:1:f:7:cf:2\ncell:Q130:l:1:f:7:cf:2\ncell:R130:l:1:f:7:cf:2\ncell:S130:l:1:f:7:cf:2\ncell:T130:l:1:f:7:cf:2\ncell:U130:l:1:f:7:cf:2\ncell:V130:l:1:f:7:cf:2\ncell:W130:l:1:f:7:cf:2\ncell:A131:l:1:f:7:cf:2\ncell:B131:l:1:f:7:cf:2\ncell:C131:l:1:f:7:cf:2\ncell:D131:l:1:f:7:cf:2\ncell:E131:l:1:f:7:cf:2\ncell:F131:l:1:f:7:cf:2\ncell:G131:l:1:f:7:cf:2\ncell:H131:l:1:f:7:cf:2\ncell:I131:l:1:f:7:cf:2\ncell:J131:l:1:f:7:cf:2\ncell:K131:l:1:f:7:cf:2\ncell:L131:l:1:f:7:cf:2\ncell:M131:l:1:f:7:cf:2\ncell:N131:l:1:f:7:cf:2\ncell:O131:l:1:f:7:cf:2\ncell:P131:l:1:f:7:cf:2\ncell:Q131:l:1:f:7:cf:2\ncell:R131:l:1:f:7:cf:2\ncell:S131:l:1:f:7:cf:2\ncell:T131:l:1:f:7:cf:2\ncell:U131:l:1:f:7:cf:2\ncell:V131:l:1:f:7:cf:2\ncell:W131:l:1:f:7:cf:2\ncell:A132:l:1:f:7:cf:2\ncell:B132:l:1:f:7:cf:2\ncell:C132:l:1:f:7:cf:2\ncell:D132:l:1:f:7:cf:2\ncell:E132:l:1:f:7:cf:2\ncell:F132:l:1:f:7:cf:2\ncell:G132:l:1:f:7:cf:2\ncell:H132:l:1:f:7:cf:2\ncell:I132:l:1:f:7:cf:2\ncell:J132:l:1:f:7:cf:2\ncell:K132:l:1:f:7:cf:2\ncell:L132:l:1:f:7:cf:2\ncell:M132:l:1:f:7:cf:2\ncell:N132:l:1:f:7:cf:2\ncell:O132:l:1:f:7:cf:2\ncell:P132:l:1:f:7:cf:2\ncell:Q132:l:1:f:7:cf:2\ncell:R132:l:1:f:7:cf:2\ncell:S132:l:1:f:7:cf:2\ncell:T132:l:1:f:7:cf:2\ncell:U132:l:1:f:7:cf:2\ncell:V132:l:1:f:7:cf:2\ncell:W132:l:1:f:7:cf:2\ncell:A133:l:1:f:7:cf:2\ncell:B133:l:1:f:7:cf:2\ncell:C133:l:1:f:7:cf:2\ncell:D133:l:1:f:7:cf:2\ncell:E133:l:1:f:7:cf:2\ncell:F133:l:1:f:7:cf:2\ncell:G133:l:1:f:7:cf:2\ncell:H133:l:1:f:7:cf:2\ncell:I133:l:1:f:7:cf:2\ncell:J133:l:1:f:7:cf:2\ncell:K133:l:1:f:7:cf:2\ncell:L133:l:1:f:7:cf:2\ncell:M133:l:1:f:7:cf:2\ncell:N133:l:1:f:7:cf:2\ncell:O133:l:1:f:7:cf:2\ncell:P133:l:1:f:7:cf:2\ncell:Q133:l:1:f:7:cf:2\ncell:R133:l:1:f:7:cf:2\ncell:S133:l:1:f:7:cf:2\ncell:T133:l:1:f:7:cf:2\ncell:U133:l:1:f:7:cf:2\ncell:V133:l:1:f:7:cf:2\ncell:W133:l:1:f:7:cf:2\ncell:A134:l:1:f:7:cf:2\ncell:B134:l:1:f:7:cf:2\ncell:C134:l:1:f:7:cf:2\ncell:D134:l:1:f:7:cf:2\ncell:E134:l:1:f:7:cf:2\ncell:F134:l:1:f:7:cf:2\ncell:G134:l:1:f:7:cf:2\ncell:H134:l:1:f:7:cf:2\ncell:I134:l:1:f:7:cf:2\ncell:J134:l:1:f:7:cf:2\ncell:K134:l:1:f:7:cf:2\ncell:L134:l:1:f:7:cf:2\ncell:M134:l:1:f:7:cf:2\ncell:N134:l:1:f:7:cf:2\ncell:O134:l:1:f:7:cf:2\ncell:P134:l:1:f:7:cf:2\ncell:Q134:l:1:f:7:cf:2\ncell:R134:l:1:f:7:cf:2\ncell:S134:l:1:f:7:cf:2\ncell:T134:l:1:f:7:cf:2\ncell:U134:l:1:f:7:cf:2\ncell:V134:l:1:f:7:cf:2\ncell:W134:l:1:f:7:cf:2\ncell:A135:l:1:f:7:cf:2\ncell:B135:l:1:f:7:cf:2\ncell:C135:l:1:f:7:cf:2\ncell:D135:l:1:f:7:cf:2\ncell:E135:l:1:f:7:cf:2\ncell:F135:l:1:f:7:cf:2\ncell:G135:l:1:f:7:cf:2\ncell:H135:l:1:f:7:cf:2\ncell:I135:l:1:f:7:cf:2\ncell:J135:l:1:f:7:cf:2\ncell:K135:l:1:f:7:cf:2\ncell:L135:l:1:f:7:cf:2\ncell:M135:l:1:f:7:cf:2\ncell:N135:l:1:f:7:cf:2\ncell:O135:l:1:f:7:cf:2\ncell:P135:l:1:f:7:cf:2\ncell:Q135:l:1:f:7:cf:2\ncell:R135:l:1:f:7:cf:2\ncell:S135:l:1:f:7:cf:2\ncell:T135:l:1:f:7:cf:2\ncell:U135:l:1:f:7:cf:2\ncell:V135:l:1:f:7:cf:2\ncell:W135:l:1:f:7:cf:2\ncell:A136:l:1:f:7:cf:2\ncell:B136:l:1:f:7:cf:2\ncell:C136:l:1:f:7:cf:2\ncell:D136:l:1:f:7:cf:2\ncell:E136:l:1:f:7:cf:2\ncell:F136:l:1:f:7:cf:2\ncell:G136:l:1:f:7:cf:2\ncell:H136:l:1:f:7:cf:2\ncell:I136:l:1:f:7:cf:2\ncell:J136:l:1:f:7:cf:2\ncell:K136:l:1:f:7:cf:2\ncell:L136:l:1:f:7:cf:2\ncell:M136:l:1:f:7:cf:2\ncell:N136:l:1:f:7:cf:2\ncell:O136:l:1:f:7:cf:2\ncell:P136:l:1:f:7:cf:2\ncell:Q136:l:1:f:7:cf:2\ncell:R136:l:1:f:7:cf:2\ncell:S136:l:1:f:7:cf:2\ncell:T136:l:1:f:7:cf:2\ncell:U136:l:1:f:7:cf:2\ncell:V136:l:1:f:7:cf:2\ncell:W136:l:1:f:7:cf:2\ncell:A137:l:1:f:7:cf:2\ncell:B137:l:1:f:7:cf:2\ncell:C137:l:1:f:7:cf:2\ncell:D137:l:1:f:7:cf:2\ncell:E137:l:1:f:7:cf:2\ncell:F137:l:1:f:7:cf:2\ncell:G137:l:1:f:7:cf:2\ncell:H137:l:1:f:7:cf:2\ncell:I137:l:1:f:7:cf:2\ncell:J137:l:1:f:7:cf:2\ncell:K137:l:1:f:7:cf:2\ncell:L137:l:1:f:7:cf:2\ncell:M137:l:1:f:7:cf:2\ncell:N137:l:1:f:7:cf:2\ncell:O137:l:1:f:7:cf:2\ncell:P137:l:1:f:7:cf:2\ncell:Q137:l:1:f:7:cf:2\ncell:R137:l:1:f:7:cf:2\ncell:S137:l:1:f:7:cf:2\ncell:T137:l:1:f:7:cf:2\ncell:U137:l:1:f:7:cf:2\ncell:V137:l:1:f:7:cf:2\ncell:W137:l:1:f:7:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nrow:102:h:14.25\nrow:103:h:14.25\nrow:104:h:14.25\nrow:105:h:14.25\nrow:106:h:14.25\nrow:107:h:14.25\nrow:108:h:14.25\nrow:109:h:14.25\nrow:110:h:14.25\nrow:111:h:14.25\nrow:112:h:14.25\nrow:113:h:14.25\nrow:114:h:14.25\nrow:115:h:14.25\nrow:116:h:14.25\nrow:117:h:14.25\nrow:118:h:14.25\nrow:119:h:14.25\nrow:120:h:14.25\nrow:121:h:14.25\nsheet:c:27:r:137:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\ncolor:5:rgb(255,255,187)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 20pt Arial\nfont:4:normal bold 9pt Arial\nfont:5:normal normal * Arial\nfont:6:normal normal 10pt Arial\nfont:7:normal normal 7pt Arial\nfont:8:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nname:COMPARISON::S63\\cU77\nname:TRACKING::AC63\\cAE77\n', - }, - name: "sheet9", - hidden: "0", - }, - sheet5: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:7:cf:2:ntvf:2\ncell:B1:l:1:f:7:cf:2\ncell:C1:l:1:f:7:cf:2\ncell:D1:l:1:f:7:cf:2\ncell:E1:l:1:f:7:cf:2\ncell:F1:l:1:f:7:cf:2\ncell:G1:l:1:f:7:cf:2\ncell:H1:l:1:f:7:cf:2\ncell:I1:l:1:f:7:cf:2\ncell:J1:l:1:f:7:cf:2\ncell:K1:l:1:f:7:cf:2\ncell:L1:l:1:f:7:cf:2\ncell:M1:l:1:f:7:cf:2\ncell:N1:l:1:f:7:cf:2\ncell:O1:l:1:f:7:cf:2\ncell:P1:l:1:f:7:cf:2\ncell:Q1:l:1:f:7:cf:2\ncell:R1:l:1:f:7:cf:2\ncell:S1:l:1:f:7:cf:2\ncell:T1:l:1:f:7:cf:2\ncell:U1:l:1:f:7:cf:2\ncell:V1:l:1:f:7:cf:2\ncell:W1:l:1:f:7:cf:2\ncell:A2:l:1:f:7:cf:2\ncell:B2:l:1:f:7:cf:2\ncell:C2:l:1:f:7:cf:2\ncell:D2:t:Expenses:l:2:f:3:cf:2\ncell:E2:l:1:f:7:cf:2\ncell:F2:l:1:f:7:cf:2\ncell:G2:l:1:f:7:cf:2\ncell:H2:l:1:f:7:cf:2\ncell:I2:l:1:f:7:cf:2\ncell:J2:l:1:f:7:cf:2\ncell:K2:l:1:f:7:cf:2\ncell:L2:l:1:f:7:cf:2\ncell:M2:l:1:f:7:cf:2\ncell:N2:l:1:f:7:cf:2\ncell:O2:l:1:f:7:cf:2\ncell:P2:l:1:f:7:cf:2\ncell:Q2:l:1:f:7:cf:2\ncell:R2:l:1:f:7:cf:2\ncell:S2:l:1:f:7:cf:2\ncell:T2:l:1:f:7:cf:2\ncell:U2:l:1:f:7:cf:2\ncell:V2:l:1:f:7:cf:2\ncell:W2:l:1:f:7:cf:2\ncell:A3:l:1:f:7:cf:2\ncell:B3:l:1:f:7:cf:2\ncell:C3:l:1:f:7:cf:2\ncell:D3:l:1:f:7:cf:2\ncell:G3:l:1:f:7:cf:2\ncell:H3:l:1:f:7:cf:2\ncell:I3:l:1:f:7:cf:2\ncell:J3:l:1:f:7:cf:2\ncell:K3:l:1:f:7:cf:2\ncell:L3:l:1:f:7:cf:2\ncell:M3:l:1:f:7:cf:2\ncell:N3:l:1:f:7:cf:2\ncell:O3:l:1:f:7:cf:2\ncell:P3:l:1:f:7:cf:2\ncell:Q3:t: :l:1:f:7:cf:2\ncell:R3:l:1:f:7:cf:2\ncell:S3:l:1:f:7:cf:2\ncell:T3:l:1:f:7:cf:2\ncell:U3:l:1:f:7:cf:2\ncell:V3:l:1:f:7:cf:2\ncell:W3:l:1:f:7:cf:2\ncell:B4:t:Entertainment:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C4:l:3:f:2:c:3:bg:1:cf:2\ncell:D4:l:3:f:2:c:3:bg:1:cf:1\ncell:E4:vtf:n:209:SUM(E5\\cE12):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F4:vtf:n:2508:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O4:l:1:f:7:cf:2\ncell:P4:l:1:f:7:cf:2\ncell:Q4:l:1:f:7:cf:2\ncell:R4:l:1:f:7:cf:2\ncell:S4:l:1:f:7:cf:2\ncell:T4:l:1:f:7:cf:2\ncell:U4:l:1:f:7:cf:2\ncell:V4:l:1:f:7:cf:2\ncell:W4:l:1:f:7:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:7:cf:2\ncell:C5:l:3:f:7:cf:2\ncell:D5:t:Events/Movies/Theater:l:3:f:5:cf:2\ncell:E5:v:209:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F5:vtf:n:2508:IF( (E5*12)=0,"",(E5*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:7:cf:2\ncell:P5:l:1:f:7:cf:2\ncell:Q5:l:1:f:7:cf:2\ncell:R5:l:1:f:7:cf:2\ncell:S5:l:1:f:7:cf:2\ncell:T5:l:1:f:7:cf:2\ncell:U5:l:1:f:7:cf:2\ncell:V5:l:1:f:7:cf:2\ncell:W5:l:1:f:7:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:7:bg:2:cf:2\ncell:C6:l:3:f:7:bg:2:cf:2\ncell:D6:t:Music/Video:l:3:f:5:bg:2:cf:2\ncell:E6:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F6:vtf:t::IF( (E6*12)=0,"",(E6*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:7:cf:2\ncell:P6:l:1:f:7:cf:2\ncell:Q6:l:1:f:7:cf:2\ncell:R6:l:1:f:7:cf:2\ncell:S6:l:1:f:7:cf:2\ncell:T6:l:1:f:7:cf:2\ncell:U6:l:1:f:7:cf:2\ncell:V6:l:1:f:7:cf:2\ncell:W6:l:1:f:7:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:7:cf:2\ncell:C7:l:3:f:7:cf:2\ncell:D7:t:Books:l:3:f:5:cf:2\ncell:E7:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:7:cf:2\ncell:P7:l:1:f:7:cf:2\ncell:Q7:l:1:f:7:cf:2\ncell:R7:l:1:f:7:cf:2\ncell:S7:l:1:f:7:cf:2\ncell:T7:l:1:f:7:cf:2\ncell:U7:l:1:f:7:cf:2\ncell:V7:l:1:f:7:cf:2\ncell:W7:l:1:f:7:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:bg:2:cf:2\ncell:C8:l:3:f:7:bg:2:cf:2\ncell:D8:t:Pets:l:3:f:5:bg:2:cf:2\ncell:E8:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:7:cf:2\ncell:P8:l:1:f:7:cf:2\ncell:Q8:l:1:f:7:cf:2\ncell:R8:l:1:f:7:cf:2\ncell:S8:l:1:f:7:cf:2\ncell:T8:l:1:f:7:cf:2\ncell:U8:l:1:f:7:cf:2\ncell:V8:l:1:f:7:cf:2\ncell:W8:l:1:f:7:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:7:cf:2\ncell:C9:l:3:f:7:cf:2\ncell:D9:t:Hobbies:l:3:f:5:cf:2\ncell:E9:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F9:vtf:t::IF( (E9*12)=0,"",(E9*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:7:cf:2\ncell:P9:l:1:f:7:cf:2\ncell:Q9:l:1:f:7:cf:2\ncell:R9:l:1:f:7:cf:2\ncell:S9:l:1:f:7:cf:2\ncell:T9:l:1:f:7:cf:2\ncell:U9:l:1:f:7:cf:2\ncell:V9:l:1:f:7:cf:2\ncell:W9:l:1:f:7:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:7:bg:2:cf:2\ncell:C10:l:3:f:7:bg:2:cf:2\ncell:D10:t:Sports:l:3:f:5:bg:2:cf:2\ncell:E10:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:7:cf:2\ncell:P10:l:1:f:7:cf:2\ncell:Q10:l:1:f:7:cf:2\ncell:R10:l:1:f:7:cf:2\ncell:S10:l:1:f:7:cf:2\ncell:T10:l:1:f:7:cf:2\ncell:U10:l:1:f:7:cf:2\ncell:V10:l:1:f:7:cf:2\ncell:W10:l:1:f:7:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:7:cf:2\ncell:C11:l:3:f:7:cf:2\ncell:D11:t:Gadgets/Toys:l:3:f:5:cf:2\ncell:E11:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:7:cf:2\ncell:P11:l:1:f:7:cf:2\ncell:Q11:l:1:f:7:cf:2\ncell:R11:l:1:f:7:cf:2\ncell:S11:l:1:f:7:cf:2\ncell:T11:l:1:f:7:cf:2\ncell:U11:l:1:f:7:cf:2\ncell:V11:l:1:f:7:cf:2\ncell:W11:l:1:f:7:cf:2\ncell:A12:b::1::\ncell:B12:b::::1:l:3:f:7:bg:2:cf:2\ncell:C12:l:3:f:7:bg:2:cf:2\ncell:D12:t:Other:l:3:f:5:bg:2:cf:2\ncell:E12:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F12:vtf:t::IF( (E12*12)=0,"",(E12*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G12:b::::1\ncell:O12:l:1:f:7:cf:2\ncell:P12:l:1:f:7:cf:2\ncell:Q12:l:1:f:7:cf:2\ncell:R12:l:1:f:7:cf:2\ncell:S12:l:1:f:7:cf:2\ncell:T12:l:1:f:7:cf:2\ncell:U12:l:1:f:7:cf:2\ncell:V12:l:1:f:7:cf:2\ncell:W12:l:1:f:7:cf:2\ncell:B13:t:Education:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C13:l:3:f:2:c:3:bg:1:cf:2\ncell:D13:l:3:f:2:c:3:bg:1:cf:1\ncell:E13:vtf:n:98:SUM(E14\\cE17):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F13:vtf:n:1176:IF( (E13*12)=0,"",(E13*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O13:l:1:f:7:cf:2\ncell:P13:l:1:f:7:cf:2\ncell:Q13:l:1:f:7:cf:2\ncell:R13:l:1:f:7:cf:2\ncell:S13:l:1:f:7:cf:2\ncell:T13:l:1:f:7:cf:2\ncell:U13:l:1:f:7:cf:2\ncell:V13:l:1:f:7:cf:2\ncell:W13:l:1:f:7:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:cf:2\ncell:C14:l:3:f:7:cf:2\ncell:D14:t:Tuition & Fees:l:3:f:5:cf:2\ncell:E14:v:98:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F14:vtf:n:1176:IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:7:cf:2\ncell:P14:l:1:f:7:cf:2\ncell:Q14:l:1:f:7:cf:2\ncell:R14:l:1:f:7:cf:2\ncell:S14:l:1:f:7:cf:2\ncell:T14:l:1:f:7:cf:2\ncell:U14:l:1:f:7:cf:2\ncell:V14:l:1:f:7:cf:2\ncell:W14:l:1:f:7:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:7:bg:2:cf:2\ncell:C15:l:3:f:7:bg:2:cf:2\ncell:D15:t:Preschool:l:3:f:5:bg:2:cf:2\ncell:E15:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F15:vtf:t::IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:7:cf:2\ncell:P15:l:1:f:7:cf:2\ncell:Q15:l:1:f:7:cf:2\ncell:R15:l:1:f:7:cf:2\ncell:S15:l:1:f:7:cf:2\ncell:T15:l:1:f:7:cf:2\ncell:U15:l:1:f:7:cf:2\ncell:V15:l:1:f:7:cf:2\ncell:W15:l:1:f:7:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:7:cf:2\ncell:C16:l:3:f:7:cf:2\ncell:D16:t:Books & Supplies:l:3:f:5:cf:2\ncell:E16:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:7:cf:2\ncell:P16:l:1:f:7:cf:2\ncell:Q16:l:1:f:7:cf:2\ncell:R16:l:1:f:7:cf:2\ncell:S16:l:1:f:7:cf:2\ncell:T16:l:1:f:7:cf:2\ncell:U16:l:1:f:7:cf:2\ncell:V16:l:1:f:7:cf:2\ncell:W16:l:1:f:7:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:7:bg:2:cf:2\ncell:C17:l:3:f:7:bg:2:cf:2\ncell:D17:t:Other:l:3:f:5:bg:2:cf:2\ncell:E17:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:7:cf:2\ncell:P17:l:1:f:7:cf:2\ncell:Q17:l:1:f:7:cf:2\ncell:R17:l:1:f:7:cf:2\ncell:B18:t:Contributions, Donations, Gifts:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C18:l:3:f:2:c:3:bg:1:cf:2\ncell:D18:l:3:f:2:c:3:bg:1:cf:1\ncell:E18:vtf:n:222:SUM(E19\\cE21):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F18:vtf:n:2664:IF( (E18*12)=0,"",(E18*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O18:l:1:f:7:cf:2\ncell:P18:l:1:f:7:cf:2\ncell:Q18:l:1:f:7:cf:2\ncell:R18:l:1:f:7:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:7:cf:2\ncell:C19:l:3:f:7:cf:2\ncell:D19:t:Cash contributions:l:3:f:5:cf:2\ncell:E19:v:136:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F19:vtf:n:1632:IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:7:cf:2\ncell:P19:l:1:f:7:cf:2\ncell:Q19:l:1:f:7:cf:2\ncell:R19:l:1:f:7:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:7:bg:2:cf:2\ncell:C20:l:3:f:7:bg:2:cf:2\ncell:D20:t:Gifts:l:3:f:5:bg:2:cf:2\ncell:E20:v:86:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F20:vtf:n:1032:IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:7:cf:2\ncell:P20:l:1:f:7:cf:2\ncell:Q20:l:1:f:7:cf:2\ncell:R20:l:1:f:7:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:cf:2\ncell:C21:l:3:f:7:cf:2\ncell:D21:t:Other:l:3:f:5:cf:2\ncell:E21:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:7:cf:2\ncell:P21:l:1:f:7:cf:2\ncell:Q21:l:1:f:7:cf:2\ncell:R21:l:1:f:7:cf:2\ncell:B22:t:Debt:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C22:l:3:f:2:c:3:bg:1:cf:2\ncell:D22:l:3:f:2:c:3:bg:1:cf:1\ncell:E22:vtf:n:0:SUM(E23\\cE24):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O22:l:1:f:7:cf:2\ncell:P22:l:1:f:7:cf:2\ncell:Q22:l:1:f:7:cf:2\ncell:R22:l:1:f:7:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:7:cf:2\ncell:C23:l:3:f:7:cf:2\ncell:D23:t:Student loan payment:l:3:f:5:cf:2\ncell:E23:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:7:cf:2\ncell:P23:l:1:f:7:cf:2\ncell:Q23:l:1:f:7:cf:2\ncell:R23:l:1:f:7:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:7:bg:2:cf:2\ncell:C24:l:3:f:7:bg:2:cf:2\ncell:D24:t:Other loan & debt payment:l:3:f:5:bg:2:cf:2\ncell:E24:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:7:cf:2\ncell:P24:l:1:f:7:cf:2\ncell:Q24:l:1:f:7:cf:2\ncell:R24:l:1:f:7:cf:2\ncell:B25:t:Insurance:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C25:l:3:f:2:c:3:bg:1:cf:2\ncell:D25:l:3:f:2:c:3:bg:1:cf:1\ncell:E25:vtf:n:30:SUM(E26\\cE28):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F25:vtf:n:360:IF( (E25*12)=0,"",(E25*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O25:l:1:f:7:cf:2\ncell:P25:l:1:f:7:cf:2\ncell:Q25:l:1:f:7:cf:2\ncell:R25:l:1:f:7:cf:2\ncell:A26:b::1::\ncell:B26:b::::1:l:3:f:7:cf:2\ncell:C26:l:3:f:7:cf:2\ncell:D26:t:Health Insurance:l:3:f:5:cf:2\ncell:E26:v:30:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F26:vtf:n:360:IF( (E26*12)=0,"",(E26*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G26:b::::1\ncell:O26:l:1:f:7:cf:2\ncell:P26:l:1:f:7:cf:2\ncell:Q26:l:1:f:7:cf:2\ncell:R26:l:1:f:7:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:7:bg:2:cf:2\ncell:C27:l:3:f:7:bg:2:cf:2\ncell:D27:t:Car/Tax Insurance:l:3:f:5:bg:2:cf:2\ncell:E27:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F27:vtf:t::IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:7:cf:2\ncell:P27:l:1:f:7:cf:2\ncell:Q27:l:1:f:7:cf:2\ncell:R27:l:1:f:7:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:7:cf:2\ncell:C28:l:3:f:7:cf:2\ncell:D28:t:Home Insurance:l:3:f:5:cf:2\ncell:E28:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:7:cf:2\ncell:P28:l:1:f:7:cf:2\ncell:Q28:l:1:f:7:cf:2\ncell:R28:l:1:f:7:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:bg:2\ncell:C29:bg:2\ncell:D29:t:Life Insurance:l:3:f:6:bg:2:cf:2\ncell:E29:b:1:1:1:1:bg:2\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:bg:2\ncell:G29:b::::1\ncell:O29:l:1:f:7:cf:2\ncell:P29:l:1:f:7:cf:2\ncell:Q29:l:1:f:7:cf:2\ncell:R29:l:1:f:7:cf:2\ncell:A30:b::1::\ncell:B30:b:::1:1\ncell:C30:b:::1:\ncell:D30:t:Others:b:::1::l:3:f:6:cf:2\ncell:E30:b:1:1:1:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1:1:1\ncell:G30:b::::1\ncell:O30:l:1:f:7:cf:2\ncell:P30:l:1:f:7:cf:2\ncell:Q30:l:1:f:7:cf:2\ncell:R30:l:1:f:7:cf:2\ncell:B31:b:1:::\ncell:C31:b:1:::\ncell:D31:b:1:::\ncell:E31:b:1:::\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b:1:::\ncell:O31:l:1:f:7:cf:2\ncell:P31:l:1:f:7:cf:2\ncell:Q31:l:1:f:7:cf:2\ncell:R31:l:1:f:7:cf:2\ncell:B32:l:1:f:4:cf:2\ncell:C32:l:1:f:4:cf:2\ncell:D32:l:1:f:9:cf:2\ncell:E32:l:1:f:9:cf:2\ncell:F32:l:1:f:7:cf:2\ncell:O32:l:1:f:7:cf:2\ncell:P32:l:1:f:7:cf:2\ncell:Q32:l:1:f:7:cf:2\ncell:R32:l:1:f:7:cf:2\ncell:O33:l:1:f:7:cf:2\ncell:P33:l:1:f:7:cf:2\ncell:Q33:l:1:f:7:cf:2\ncell:R33:l:1:f:7:cf:2\ncell:O34:l:1:f:7:cf:2\ncell:P34:l:1:f:7:cf:2\ncell:Q34:l:1:f:7:cf:2\ncell:R34:l:1:f:7:cf:2\ncell:O35:l:1:f:7:cf:2\ncell:P35:l:1:f:7:cf:2\ncell:Q35:l:1:f:7:cf:2\ncell:R35:l:1:f:7:cf:2\ncell:O36:l:1:f:7:cf:2\ncell:P36:l:1:f:7:cf:2\ncell:Q36:l:1:f:7:cf:2\ncell:R36:l:1:f:7:cf:2\ncell:O37:l:1:f:7:cf:2\ncell:P37:l:1:f:7:cf:2\ncell:Q37:l:1:f:7:cf:2\ncell:R37:l:1:f:7:cf:2\ncell:O38:l:1:f:7:cf:2\ncell:P38:l:1:f:7:cf:2\ncell:Q38:l:1:f:7:cf:2\ncell:R38:l:1:f:7:cf:2\ncell:O39:l:1:f:7:cf:2\ncell:P39:l:1:f:7:cf:2\ncell:Q39:l:1:f:7:cf:2\ncell:R39:l:1:f:7:cf:2\ncell:O40:l:1:f:7:cf:2\ncell:P40:l:1:f:7:cf:2\ncell:Q40:l:1:f:7:cf:2\ncell:R40:l:1:f:7:cf:2\ncell:O41:l:1:f:7:cf:2\ncell:P41:l:1:f:7:cf:2\ncell:Q41:l:1:f:7:cf:2\ncell:R41:l:1:f:7:cf:2\ncell:O42:l:1:f:7:cf:2\ncell:P42:l:1:f:7:cf:2\ncell:Q42:l:1:f:7:cf:2\ncell:R42:l:1:f:7:cf:2\ncell:S42:l:1:f:7:cf:2\ncell:T42:l:1:f:7:cf:2\ncell:U42:l:1:f:7:cf:2\ncell:V42:l:1:f:7:cf:2\ncell:W42:l:1:f:7:cf:2\ncell:O43:l:1:f:7:cf:2\ncell:P43:l:1:f:7:cf:2\ncell:Q43:l:1:f:7:cf:2\ncell:R43:l:1:f:7:cf:2\ncell:S43:l:1:f:7:cf:2\ncell:T43:l:1:f:7:cf:2\ncell:U43:l:1:f:7:cf:2\ncell:V43:l:1:f:7:cf:2\ncell:W43:l:1:f:7:cf:2\ncell:O44:l:1:f:7:cf:2\ncell:P44:l:1:f:7:cf:2\ncell:Q44:l:1:f:7:cf:2\ncell:R44:l:1:f:7:cf:2\ncell:S44:l:1:f:7:cf:2\ncell:T44:l:1:f:7:cf:2\ncell:U44:l:1:f:7:cf:2\ncell:V44:l:1:f:7:cf:2\ncell:W44:l:1:f:7:cf:2\ncell:O45:l:1:f:7:cf:2\ncell:P45:l:1:f:7:cf:2\ncell:Q45:l:1:f:7:cf:2\ncell:R45:l:1:f:7:cf:2\ncell:S45:l:1:f:7:cf:2\ncell:T45:l:1:f:7:cf:2\ncell:U45:l:1:f:7:cf:2\ncell:V45:l:1:f:7:cf:2\ncell:W45:l:1:f:7:cf:2\ncell:O46:l:1:f:7:cf:2\ncell:P46:l:1:f:7:cf:2\ncell:Q46:l:1:f:7:cf:2\ncell:R46:l:1:f:7:cf:2\ncell:S46:l:1:f:7:cf:2\ncell:T46:l:1:f:7:cf:2\ncell:U46:l:1:f:7:cf:2\ncell:V46:l:1:f:7:cf:2\ncell:W46:l:1:f:7:cf:2\ncell:O47:l:1:f:7:cf:2\ncell:P47:l:1:f:7:cf:2\ncell:Q47:l:1:f:7:cf:2\ncell:R47:l:1:f:7:cf:2\ncell:S47:l:1:f:7:cf:2\ncell:T47:l:1:f:7:cf:2\ncell:U47:l:1:f:7:cf:2\ncell:V47:l:1:f:7:cf:2\ncell:W47:l:1:f:7:cf:2\ncell:O48:l:1:f:7:cf:2\ncell:P48:l:1:f:7:cf:2\ncell:Q48:l:1:f:7:cf:2\ncell:R48:l:1:f:7:cf:2\ncell:S48:l:1:f:7:cf:2\ncell:T48:l:1:f:7:cf:2\ncell:U48:l:1:f:7:cf:2\ncell:V48:l:1:f:7:cf:2\ncell:W48:l:1:f:7:cf:2\ncell:O49:l:1:f:7:cf:2\ncell:P49:l:1:f:7:cf:2\ncell:Q49:l:1:f:7:cf:2\ncell:R49:l:1:f:7:cf:2\ncell:S49:l:1:f:7:cf:2\ncell:T49:l:1:f:7:cf:2\ncell:U49:l:1:f:7:cf:2\ncell:V49:l:1:f:7:cf:2\ncell:W49:l:1:f:7:cf:2\ncell:O50:l:1:f:7:cf:2\ncell:P50:l:1:f:7:cf:2\ncell:Q50:l:1:f:7:cf:2\ncell:R50:l:1:f:7:cf:2\ncell:S50:l:1:f:7:cf:2\ncell:T50:l:1:f:7:cf:2\ncell:U50:l:1:f:7:cf:2\ncell:V50:l:1:f:7:cf:2\ncell:W50:l:1:f:7:cf:2\ncell:O51:l:1:f:7:cf:2\ncell:P51:l:1:f:7:cf:2\ncell:Q51:l:1:f:7:cf:2\ncell:R51:l:1:f:7:cf:2\ncell:S51:l:1:f:7:cf:2\ncell:T51:l:1:f:7:cf:2\ncell:U51:l:1:f:7:cf:2\ncell:V51:l:1:f:7:cf:2\ncell:W51:l:1:f:7:cf:2\ncell:O52:l:1:f:7:cf:2\ncell:P52:l:1:f:7:cf:2\ncell:Q52:l:1:f:7:cf:2\ncell:R52:l:1:f:7:cf:2\ncell:S52:l:1:f:7:cf:2\ncell:T52:l:1:f:7:cf:2\ncell:U52:l:1:f:7:cf:2\ncell:V52:l:1:f:7:cf:2\ncell:W52:l:1:f:7:cf:2\ncell:O53:l:1:f:7:cf:2\ncell:P53:l:1:f:7:cf:2\ncell:Q53:l:1:f:7:cf:2\ncell:R53:l:1:f:7:cf:2\ncell:S53:l:1:f:7:cf:2\ncell:T53:l:1:f:7:cf:2\ncell:U53:l:1:f:7:cf:2\ncell:V53:l:1:f:7:cf:2\ncell:W53:l:1:f:7:cf:2\ncell:O54:l:1:f:7:cf:2\ncell:P54:l:1:f:7:cf:2\ncell:Q54:l:1:f:7:cf:2\ncell:R54:l:1:f:7:cf:2\ncell:S54:l:1:f:7:cf:2\ncell:T54:l:1:f:7:cf:2\ncell:U54:l:1:f:7:cf:2\ncell:V54:l:1:f:7:cf:2\ncell:W54:l:1:f:7:cf:2\ncell:O55:l:1:f:7:cf:2\ncell:P55:l:1:f:7:cf:2\ncell:Q55:l:1:f:7:cf:2\ncell:R55:l:1:f:7:cf:2\ncell:S55:l:1:f:7:cf:2\ncell:T55:l:1:f:7:cf:2\ncell:U55:l:1:f:7:cf:2\ncell:V55:l:1:f:7:cf:2\ncell:W55:l:1:f:7:cf:2\ncell:O56:l:1:f:7:cf:2\ncell:P56:l:1:f:7:cf:2\ncell:Q56:l:1:f:7:cf:2\ncell:R56:l:1:f:7:cf:2\ncell:S56:l:1:f:7:cf:2\ncell:T56:l:1:f:7:cf:2\ncell:U56:l:1:f:7:cf:2\ncell:V56:l:1:f:7:cf:2\ncell:W56:l:1:f:7:cf:2\ncell:O57:l:1:f:7:cf:2\ncell:P57:l:1:f:7:cf:2\ncell:Q57:l:1:f:7:cf:2\ncell:R57:l:1:f:7:cf:2\ncell:S57:l:1:f:7:cf:2\ncell:T57:l:1:f:7:cf:2\ncell:U57:l:1:f:7:cf:2\ncell:V57:l:1:f:7:cf:2\ncell:W57:l:1:f:7:cf:2\ncell:O58:l:1:f:7:cf:2\ncell:P58:l:1:f:7:cf:2\ncell:Q58:l:1:f:7:cf:2\ncell:R58:l:1:f:7:cf:2\ncell:S58:l:1:f:7:cf:2\ncell:T58:l:1:f:7:cf:2\ncell:U58:l:1:f:7:cf:2\ncell:V58:l:1:f:7:cf:2\ncell:W58:l:1:f:7:cf:2\ncell:O59:l:1:f:7:cf:2\ncell:P59:l:1:f:7:cf:2\ncell:Q59:l:1:f:7:cf:2\ncell:R59:l:1:f:7:cf:2\ncell:S59:l:1:f:7:cf:2\ncell:T59:l:1:f:7:cf:2\ncell:U59:l:1:f:7:cf:2\ncell:V59:l:1:f:7:cf:2\ncell:W59:l:1:f:7:cf:2\ncell:O60:l:1:f:7:cf:2\ncell:P60:l:1:f:7:cf:2\ncell:Q60:l:1:f:7:cf:2\ncell:R60:l:1:f:7:cf:2\ncell:S60:l:1:f:7:cf:2\ncell:T60:l:1:f:7:cf:2\ncell:U60:l:1:f:7:cf:2\ncell:V60:l:1:f:7:cf:2\ncell:W60:l:1:f:7:cf:2\ncell:O61:l:1:f:7:cf:2\ncell:P61:l:1:f:7:cf:2\ncell:Q61:l:1:f:7:cf:2\ncell:R61:l:1:f:7:cf:2\ncell:S61:l:1:f:7:cf:2\ncell:T61:l:1:f:7:cf:2\ncell:U61:l:1:f:7:cf:2\ncell:V61:l:1:f:7:cf:2\ncell:W61:l:1:f:7:cf:2\ncell:O62:l:1:f:7:cf:2\ncell:P62:l:1:f:7:cf:2\ncell:Q62:l:1:f:7:cf:2\ncell:R62:l:1:f:7:cf:2\ncell:S62:l:1:f:7:cf:2\ncell:T62:l:1:f:7:cf:2\ncell:U62:l:1:f:7:cf:2\ncell:V62:l:1:f:7:cf:2\ncell:W62:l:1:f:7:cf:2\ncell:O63:l:1:f:7:cf:2\ncell:P63:l:1:f:7:cf:2\ncell:Q63:l:1:f:7:cf:2\ncell:R63:l:1:f:7:cf:2\ncell:S63:l:1:f:7:cf:2\ncell:T63:l:1:f:7:cf:2\ncell:U63:l:1:f:7:cf:2\ncell:V63:l:1:f:7:cf:2\ncell:W63:l:1:f:7:cf:2\ncell:O64:l:1:f:7:cf:2\ncell:P64:l:1:f:7:cf:2\ncell:Q64:l:1:f:7:cf:2\ncell:R64:l:1:f:7:cf:2\ncell:S64:l:1:f:7:cf:2\ncell:T64:l:1:f:7:cf:2\ncell:U64:l:1:f:7:cf:2\ncell:V64:l:1:f:7:cf:2\ncell:W64:l:1:f:7:cf:2\ncell:O65:l:1:f:7:cf:2\ncell:P65:l:1:f:7:cf:2\ncell:Q65:l:1:f:7:cf:2\ncell:R65:l:1:f:7:cf:2\ncell:S65:l:1:f:7:cf:2\ncell:T65:l:1:f:7:cf:2\ncell:U65:l:1:f:7:cf:2\ncell:V65:l:1:f:7:cf:2\ncell:W65:l:1:f:7:cf:2\ncell:O66:l:1:f:7:cf:2\ncell:P66:l:1:f:7:cf:2\ncell:Q66:l:1:f:7:cf:2\ncell:R66:l:1:f:7:cf:2\ncell:S66:l:1:f:7:cf:2\ncell:T66:l:1:f:7:cf:2\ncell:U66:l:1:f:7:cf:2\ncell:V66:l:1:f:7:cf:2\ncell:W66:l:1:f:7:cf:2\ncell:O67:l:1:f:7:cf:2\ncell:P67:l:1:f:7:cf:2\ncell:Q67:l:1:f:7:cf:2\ncell:R67:l:1:f:7:cf:2\ncell:S67:l:1:f:7:cf:2\ncell:T67:l:1:f:7:cf:2\ncell:U67:l:1:f:7:cf:2\ncell:V67:l:1:f:7:cf:2\ncell:W67:l:1:f:7:cf:2\ncell:O68:l:1:f:7:cf:2\ncell:P68:l:1:f:7:cf:2\ncell:Q68:l:1:f:7:cf:2\ncell:R68:l:1:f:7:cf:2\ncell:S68:l:1:f:7:cf:2\ncell:T68:l:1:f:7:cf:2\ncell:U68:l:1:f:7:cf:2\ncell:V68:l:1:f:7:cf:2\ncell:W68:l:1:f:7:cf:2\ncell:O69:l:1:f:7:cf:2\ncell:P69:l:1:f:7:cf:2\ncell:Q69:l:1:f:7:cf:2\ncell:R69:l:1:f:7:cf:2\ncell:S69:l:1:f:7:cf:2\ncell:T69:l:1:f:7:cf:2\ncell:U69:l:1:f:7:cf:2\ncell:V69:l:1:f:7:cf:2\ncell:W69:l:1:f:7:cf:2\ncell:O70:l:1:f:7:cf:2\ncell:P70:l:1:f:7:cf:2\ncell:Q70:l:1:f:7:cf:2\ncell:R70:l:1:f:7:cf:2\ncell:S70:l:1:f:7:cf:2\ncell:T70:l:1:f:7:cf:2\ncell:U70:l:1:f:7:cf:2\ncell:V70:l:1:f:7:cf:2\ncell:W70:l:1:f:7:cf:2\ncell:O71:l:1:f:7:cf:2\ncell:P71:l:1:f:7:cf:2\ncell:Q71:l:1:f:7:cf:2\ncell:R71:l:1:f:7:cf:2\ncell:S71:l:1:f:7:cf:2\ncell:T71:l:1:f:7:cf:2\ncell:U71:l:1:f:7:cf:2\ncell:V71:l:1:f:7:cf:2\ncell:W71:l:1:f:7:cf:2\ncell:O72:l:1:f:7:cf:2\ncell:P72:l:1:f:7:cf:2\ncell:Q72:l:1:f:7:cf:2\ncell:R72:l:1:f:7:cf:2\ncell:S72:l:1:f:7:cf:2\ncell:T72:l:1:f:7:cf:2\ncell:U72:l:1:f:7:cf:2\ncell:V72:l:1:f:7:cf:2\ncell:W72:l:1:f:7:cf:2\ncell:O73:l:1:f:7:cf:2\ncell:P73:l:1:f:7:cf:2\ncell:Q73:l:1:f:7:cf:2\ncell:R73:l:1:f:7:cf:2\ncell:S73:l:1:f:7:cf:2\ncell:T73:l:1:f:7:cf:2\ncell:U73:l:1:f:7:cf:2\ncell:V73:l:1:f:7:cf:2\ncell:W73:l:1:f:7:cf:2\ncell:O74:l:1:f:7:cf:2\ncell:P74:l:1:f:7:cf:2\ncell:Q74:l:1:f:7:cf:2\ncell:R74:l:1:f:7:cf:2\ncell:S74:l:1:f:7:cf:2\ncell:T74:l:1:f:7:cf:2\ncell:U74:l:1:f:7:cf:2\ncell:V74:l:1:f:7:cf:2\ncell:W74:l:1:f:7:cf:2\ncell:O75:l:1:f:7:cf:2\ncell:P75:l:1:f:7:cf:2\ncell:Q75:l:1:f:7:cf:2\ncell:R75:l:1:f:7:cf:2\ncell:S75:l:1:f:7:cf:2\ncell:T75:l:1:f:7:cf:2\ncell:U75:l:1:f:7:cf:2\ncell:V75:l:1:f:7:cf:2\ncell:W75:l:1:f:7:cf:2\ncell:O76:l:1:f:7:cf:2\ncell:P76:l:1:f:7:cf:2\ncell:Q76:l:1:f:7:cf:2\ncell:R76:l:1:f:7:cf:2\ncell:S76:l:1:f:7:cf:2\ncell:T76:l:1:f:7:cf:2\ncell:U76:l:1:f:7:cf:2\ncell:V76:l:1:f:7:cf:2\ncell:W76:l:1:f:7:cf:2\ncell:O77:l:1:f:7:cf:2\ncell:P77:l:1:f:7:cf:2\ncell:Q77:l:1:f:7:cf:2\ncell:R77:l:1:f:7:cf:2\ncell:S77:l:1:f:7:cf:2\ncell:T77:l:1:f:7:cf:2\ncell:U77:l:1:f:7:cf:2\ncell:V77:l:1:f:7:cf:2\ncell:W77:l:1:f:7:cf:2\ncell:O78:l:1:f:7:cf:2\ncell:P78:l:1:f:7:cf:2\ncell:Q78:l:1:f:7:cf:2\ncell:R78:l:1:f:7:cf:2\ncell:S78:l:1:f:7:cf:2\ncell:T78:l:1:f:7:cf:2\ncell:U78:l:1:f:7:cf:2\ncell:V78:l:1:f:7:cf:2\ncell:W78:l:1:f:7:cf:2\ncell:O79:l:1:f:7:cf:2\ncell:P79:l:1:f:7:cf:2\ncell:Q79:l:1:f:7:cf:2\ncell:R79:l:1:f:7:cf:2\ncell:S79:l:1:f:7:cf:2\ncell:T79:l:1:f:7:cf:2\ncell:U79:l:1:f:7:cf:2\ncell:V79:l:1:f:7:cf:2\ncell:W79:l:1:f:7:cf:2\ncell:O80:l:1:f:7:cf:2\ncell:P80:l:1:f:7:cf:2\ncell:Q80:l:1:f:7:cf:2\ncell:R80:l:1:f:7:cf:2\ncell:S80:l:1:f:7:cf:2\ncell:T80:l:1:f:7:cf:2\ncell:U80:l:1:f:7:cf:2\ncell:V80:l:1:f:7:cf:2\ncell:W80:l:1:f:7:cf:2\ncell:O81:l:1:f:7:cf:2\ncell:P81:l:1:f:7:cf:2\ncell:Q81:l:1:f:7:cf:2\ncell:R81:l:1:f:7:cf:2\ncell:S81:l:1:f:7:cf:2\ncell:T81:l:1:f:7:cf:2\ncell:U81:l:1:f:7:cf:2\ncell:V81:l:1:f:7:cf:2\ncell:W81:l:1:f:7:cf:2\ncell:O82:l:1:f:7:cf:2\ncell:P82:l:1:f:7:cf:2\ncell:Q82:l:1:f:7:cf:2\ncell:R82:l:1:f:7:cf:2\ncell:S82:l:1:f:7:cf:2\ncell:T82:l:1:f:7:cf:2\ncell:U82:l:1:f:7:cf:2\ncell:V82:l:1:f:7:cf:2\ncell:W82:l:1:f:7:cf:2\ncell:O83:l:1:f:7:cf:2\ncell:P83:l:1:f:7:cf:2\ncell:Q83:l:1:f:7:cf:2\ncell:R83:l:1:f:7:cf:2\ncell:S83:l:1:f:7:cf:2\ncell:T83:l:1:f:7:cf:2\ncell:U83:l:1:f:7:cf:2\ncell:V83:l:1:f:7:cf:2\ncell:W83:l:1:f:7:cf:2\ncell:O84:l:1:f:7:cf:2\ncell:P84:l:1:f:7:cf:2\ncell:Q84:l:1:f:7:cf:2\ncell:R84:l:1:f:7:cf:2\ncell:S84:l:1:f:7:cf:2\ncell:T84:l:1:f:7:cf:2\ncell:U84:l:1:f:7:cf:2\ncell:V84:l:1:f:7:cf:2\ncell:W84:l:1:f:7:cf:2\ncell:O85:l:1:f:7:cf:2\ncell:P85:l:1:f:7:cf:2\ncell:Q85:l:1:f:7:cf:2\ncell:R85:l:1:f:7:cf:2\ncell:S85:l:1:f:7:cf:2\ncell:T85:l:1:f:7:cf:2\ncell:U85:l:1:f:7:cf:2\ncell:V85:l:1:f:7:cf:2\ncell:W85:l:1:f:7:cf:2\ncell:O86:l:1:f:7:cf:2\ncell:P86:l:1:f:7:cf:2\ncell:Q86:l:1:f:7:cf:2\ncell:R86:l:1:f:7:cf:2\ncell:S86:l:1:f:7:cf:2\ncell:T86:l:1:f:7:cf:2\ncell:U86:l:1:f:7:cf:2\ncell:V86:l:1:f:7:cf:2\ncell:W86:l:1:f:7:cf:2\ncell:O87:l:1:f:7:cf:2\ncell:P87:l:1:f:7:cf:2\ncell:Q87:l:1:f:7:cf:2\ncell:R87:l:1:f:7:cf:2\ncell:S87:l:1:f:7:cf:2\ncell:T87:l:1:f:7:cf:2\ncell:U87:l:1:f:7:cf:2\ncell:V87:l:1:f:7:cf:2\ncell:W87:l:1:f:7:cf:2\ncell:O88:l:1:f:7:cf:2\ncell:P88:l:1:f:7:cf:2\ncell:Q88:l:1:f:7:cf:2\ncell:R88:l:1:f:7:cf:2\ncell:S88:l:1:f:7:cf:2\ncell:T88:l:1:f:7:cf:2\ncell:U88:l:1:f:7:cf:2\ncell:V88:l:1:f:7:cf:2\ncell:W88:l:1:f:7:cf:2\ncell:O89:l:1:f:7:cf:2\ncell:P89:l:1:f:7:cf:2\ncell:Q89:l:1:f:7:cf:2\ncell:R89:l:1:f:7:cf:2\ncell:S89:l:1:f:7:cf:2\ncell:T89:l:1:f:7:cf:2\ncell:U89:l:1:f:7:cf:2\ncell:V89:l:1:f:7:cf:2\ncell:W89:l:1:f:7:cf:2\ncell:O90:l:1:f:7:cf:2\ncell:P90:l:1:f:7:cf:2\ncell:Q90:l:1:f:7:cf:2\ncell:R90:l:1:f:7:cf:2\ncell:S90:l:1:f:7:cf:2\ncell:T90:l:1:f:7:cf:2\ncell:U90:l:1:f:7:cf:2\ncell:V90:l:1:f:7:cf:2\ncell:W90:l:1:f:7:cf:2\ncell:O91:l:1:f:7:cf:2\ncell:P91:l:1:f:7:cf:2\ncell:Q91:l:1:f:7:cf:2\ncell:R91:l:1:f:7:cf:2\ncell:S91:l:1:f:7:cf:2\ncell:T91:l:1:f:7:cf:2\ncell:U91:l:1:f:7:cf:2\ncell:V91:l:1:f:7:cf:2\ncell:W91:l:1:f:7:cf:2\ncell:O92:l:1:f:7:cf:2\ncell:P92:l:1:f:7:cf:2\ncell:Q92:l:1:f:7:cf:2\ncell:R92:l:1:f:7:cf:2\ncell:S92:l:1:f:7:cf:2\ncell:T92:l:1:f:7:cf:2\ncell:U92:l:1:f:7:cf:2\ncell:V92:l:1:f:7:cf:2\ncell:W92:l:1:f:7:cf:2\ncell:O93:l:1:f:7:cf:2\ncell:P93:l:1:f:7:cf:2\ncell:Q93:l:1:f:7:cf:2\ncell:R93:l:1:f:7:cf:2\ncell:S93:l:1:f:7:cf:2\ncell:T93:l:1:f:7:cf:2\ncell:U93:l:1:f:7:cf:2\ncell:V93:l:1:f:7:cf:2\ncell:W93:l:1:f:7:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:S94:l:1:f:8:cf:2\ncell:T94:l:1:f:8:cf:2\ncell:U94:l:1:f:8:cf:2\ncell:V94:l:1:f:8:cf:2\ncell:W94:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:S95:l:1:f:8:cf:2\ncell:T95:l:1:f:8:cf:2\ncell:U95:l:1:f:8:cf:2\ncell:V95:l:1:f:8:cf:2\ncell:W95:l:1:f:8:cf:2\ncell:O96:l:1:f:8:cf:2\ncell:P96:l:1:f:8:cf:2\ncell:Q96:l:1:f:8:cf:2\ncell:R96:l:1:f:8:cf:2\ncell:S96:l:1:f:8:cf:2\ncell:T96:l:1:f:8:cf:2\ncell:U96:l:1:f:8:cf:2\ncell:V96:l:1:f:8:cf:2\ncell:W96:l:1:f:8:cf:2\ncell:O97:l:1:f:8:cf:2\ncell:P97:l:1:f:8:cf:2\ncell:Q97:l:1:f:8:cf:2\ncell:R97:l:1:f:8:cf:2\ncell:S97:l:1:f:8:cf:2\ncell:T97:l:1:f:8:cf:2\ncell:U97:l:1:f:8:cf:2\ncell:V97:l:1:f:8:cf:2\ncell:W97:l:1:f:8:cf:2\ncell:A98:l:1:f:8:cf:2\ncell:B98:l:1:f:8:cf:2\ncell:C98:l:1:f:8:cf:2\ncell:D98:l:1:f:8:cf:2\ncell:E98:l:1:f:8:cf:2\ncell:F98:t:Monthly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G98:l:1:f:8:cf:2\ncell:H98:l:1:f:8:cf:2\ncell:I98:l:1:f:8:cf:2\ncell:J98:l:1:f:8:cf:2\ncell:K98:l:1:f:8:cf:2\ncell:L98:l:1:f:8:cf:2\ncell:M98:l:1:f:8:cf:2\ncell:N98:l:1:f:8:cf:2\ncell:O98:l:1:f:8:cf:2\ncell:P98:l:1:f:8:cf:2\ncell:Q98:l:1:f:8:cf:2\ncell:R98:l:1:f:8:cf:2\ncell:S98:l:1:f:8:cf:2\ncell:T98:l:1:f:8:cf:2\ncell:U98:l:1:f:8:cf:2\ncell:V98:l:1:f:8:cf:2\ncell:W98:l:1:f:8:cf:2\ncell:A99:l:1:f:8:cf:2\ncell:B99:l:1:f:8:cf:2\ncell:C99:l:1:f:8:cf:2\ncell:D99:l:1:f:8:cf:2\ncell:E99:l:1:f:8:cf:2\ncell:F99:t:Semi-Annually:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G99:l:1:f:8:cf:2\ncell:H99:l:1:f:8:cf:2\ncell:I99:l:1:f:8:cf:2\ncell:J99:l:1:f:8:cf:2\ncell:K99:l:1:f:8:cf:2\ncell:L99:l:1:f:8:cf:2\ncell:M99:l:1:f:8:cf:2\ncell:N99:l:1:f:8:cf:2\ncell:O99:l:1:f:8:cf:2\ncell:P99:l:1:f:8:cf:2\ncell:Q99:l:1:f:8:cf:2\ncell:R99:l:1:f:8:cf:2\ncell:S99:l:1:f:8:cf:2\ncell:T99:l:1:f:8:cf:2\ncell:U99:l:1:f:8:cf:2\ncell:V99:l:1:f:8:cf:2\ncell:W99:l:1:f:8:cf:2\ncell:A100:l:1:f:8:cf:2\ncell:B100:l:1:f:8:cf:2\ncell:C100:l:1:f:8:cf:2\ncell:D100:l:1:f:8:cf:2\ncell:E100:l:1:f:8:cf:2\ncell:F100:t:Quarterly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G100:l:1:f:8:cf:2\ncell:H100:l:1:f:8:cf:2\ncell:I100:l:1:f:8:cf:2\ncell:J100:l:1:f:8:cf:2\ncell:K100:l:1:f:8:cf:2\ncell:L100:l:1:f:8:cf:2\ncell:M100:l:1:f:8:cf:2\ncell:N100:l:1:f:8:cf:2\ncell:O100:l:1:f:8:cf:2\ncell:P100:l:1:f:8:cf:2\ncell:Q100:l:1:f:8:cf:2\ncell:R100:l:1:f:8:cf:2\ncell:S100:l:1:f:8:cf:2\ncell:T100:l:1:f:8:cf:2\ncell:U100:l:1:f:8:cf:2\ncell:V100:l:1:f:8:cf:2\ncell:W100:l:1:f:8:cf:2\ncell:A101:l:1:f:8:cf:2\ncell:B101:l:1:f:8:cf:2\ncell:C101:l:1:f:8:cf:2\ncell:D101:l:1:f:8:cf:2\ncell:E101:l:1:f:8:cf:2\ncell:F101:t:Yearly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G101:l:1:f:8:cf:2\ncell:H101:l:1:f:8:cf:2\ncell:I101:l:1:f:8:cf:2\ncell:J101:l:1:f:8:cf:2\ncell:K101:l:1:f:8:cf:2\ncell:L101:l:1:f:8:cf:2\ncell:M101:l:1:f:8:cf:2\ncell:N101:l:1:f:8:cf:2\ncell:O101:l:1:f:8:cf:2\ncell:P101:l:1:f:8:cf:2\ncell:Q101:l:1:f:8:cf:2\ncell:R101:l:1:f:8:cf:2\ncell:S101:l:1:f:8:cf:2\ncell:T101:l:1:f:8:cf:2\ncell:U101:l:1:f:8:cf:2\ncell:V101:l:1:f:8:cf:2\ncell:W101:l:1:f:8:cf:2\ncell:A102:l:1:f:8:cf:2\ncell:B102:l:1:f:8:cf:2\ncell:C102:l:1:f:8:cf:2\ncell:D102:l:1:f:8:cf:2\ncell:E102:l:1:f:8:cf:2\ncell:F102:l:1:f:8:cf:2\ncell:G102:l:1:f:8:cf:2\ncell:H102:l:1:f:8:cf:2\ncell:I102:l:1:f:8:cf:2\ncell:J102:l:1:f:8:cf:2\ncell:K102:l:1:f:8:cf:2\ncell:L102:l:1:f:8:cf:2\ncell:M102:l:1:f:8:cf:2\ncell:N102:l:1:f:8:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:A103:l:1:f:8:cf:2\ncell:B103:l:1:f:8:cf:2\ncell:C103:l:1:f:8:cf:2\ncell:D103:l:1:f:8:cf:2\ncell:E103:l:1:f:8:cf:2\ncell:F103:l:1:f:8:cf:2\ncell:G103:l:1:f:8:cf:2\ncell:H103:l:1:f:8:cf:2\ncell:I103:l:1:f:8:cf:2\ncell:J103:l:1:f:8:cf:2\ncell:K103:l:1:f:8:cf:2\ncell:L103:l:1:f:8:cf:2\ncell:M103:l:1:f:8:cf:2\ncell:N103:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:A104:l:1:f:8:cf:2\ncell:B104:l:1:f:8:cf:2\ncell:C104:l:1:f:8:cf:2\ncell:D104:l:1:f:8:cf:2\ncell:E104:l:1:f:8:cf:2\ncell:F104:l:1:f:8:cf:2\ncell:G104:l:1:f:8:cf:2\ncell:H104:l:1:f:8:cf:2\ncell:I104:l:1:f:8:cf:2\ncell:J104:l:1:f:8:cf:2\ncell:K104:l:1:f:8:cf:2\ncell:L104:l:1:f:8:cf:2\ncell:M104:l:1:f:8:cf:2\ncell:N104:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:A105:l:1:f:8:cf:2\ncell:B105:l:1:f:8:cf:2\ncell:C105:l:1:f:8:cf:2\ncell:D105:l:1:f:8:cf:2\ncell:E105:l:1:f:8:cf:2\ncell:F105:l:1:f:8:cf:2\ncell:G105:l:1:f:8:cf:2\ncell:H105:l:1:f:8:cf:2\ncell:I105:l:1:f:8:cf:2\ncell:J105:l:1:f:8:cf:2\ncell:K105:l:1:f:8:cf:2\ncell:L105:l:1:f:8:cf:2\ncell:M105:l:1:f:8:cf:2\ncell:N105:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:A106:l:1:f:8:cf:2\ncell:B106:l:1:f:8:cf:2\ncell:C106:l:1:f:8:cf:2\ncell:D106:l:1:f:8:cf:2\ncell:E106:l:1:f:8:cf:2\ncell:F106:l:1:f:8:cf:2\ncell:G106:l:1:f:8:cf:2\ncell:H106:l:1:f:8:cf:2\ncell:I106:l:1:f:8:cf:2\ncell:J106:l:1:f:8:cf:2\ncell:K106:l:1:f:8:cf:2\ncell:L106:l:1:f:8:cf:2\ncell:M106:l:1:f:8:cf:2\ncell:N106:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:A107:l:1:f:8:cf:2\ncell:B107:l:1:f:8:cf:2\ncell:C107:l:1:f:8:cf:2\ncell:D107:l:1:f:8:cf:2\ncell:E107:l:1:f:8:cf:2\ncell:F107:l:1:f:8:cf:2\ncell:G107:l:1:f:8:cf:2\ncell:H107:l:1:f:8:cf:2\ncell:I107:l:1:f:8:cf:2\ncell:J107:l:1:f:8:cf:2\ncell:K107:l:1:f:8:cf:2\ncell:L107:l:1:f:8:cf:2\ncell:M107:l:1:f:8:cf:2\ncell:N107:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:A108:l:1:f:8:cf:2\ncell:B108:l:1:f:8:cf:2\ncell:C108:l:1:f:8:cf:2\ncell:D108:l:1:f:8:cf:2\ncell:E108:l:1:f:8:cf:2\ncell:F108:l:1:f:8:cf:2\ncell:G108:l:1:f:8:cf:2\ncell:H108:l:1:f:8:cf:2\ncell:I108:l:1:f:8:cf:2\ncell:J108:l:1:f:8:cf:2\ncell:K108:l:1:f:8:cf:2\ncell:L108:l:1:f:8:cf:2\ncell:M108:l:1:f:8:cf:2\ncell:N108:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:A109:l:1:f:8:cf:2\ncell:B109:l:1:f:8:cf:2\ncell:C109:l:1:f:8:cf:2\ncell:D109:l:1:f:8:cf:2\ncell:E109:l:1:f:8:cf:2\ncell:F109:l:1:f:8:cf:2\ncell:G109:l:1:f:8:cf:2\ncell:H109:l:1:f:8:cf:2\ncell:I109:l:1:f:8:cf:2\ncell:J109:l:1:f:8:cf:2\ncell:K109:l:1:f:8:cf:2\ncell:L109:l:1:f:8:cf:2\ncell:M109:l:1:f:8:cf:2\ncell:N109:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nsheet:c:27:r:109:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 20pt Arial\nfont:4:normal bold 9pt Arial\nfont:5:normal normal * Arial\nfont:6:normal normal * arial,helvetica,sans-serif\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 7pt Arial\nfont:9:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nname:COMPARISON::S35\\cU49\nname:TRACKING::AC35\\cAE49\n', - }, - name: "sheet10", - hidden: "0", - }, - sheet6: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:7:cf:2:ntvf:3\ncell:B1:l:1:f:7:cf:2\ncell:C1:l:1:f:7:cf:2\ncell:D1:l:1:f:7:cf:2\ncell:E1:l:1:f:7:cf:2\ncell:F1:l:1:f:7:cf:2\ncell:G1:l:1:f:7:cf:2\ncell:H1:l:1:f:7:cf:2\ncell:I1:l:1:f:7:cf:2\ncell:J1:l:1:f:7:cf:2\ncell:K1:l:1:f:7:cf:2\ncell:L1:l:1:f:7:cf:2\ncell:M1:l:1:f:7:cf:2\ncell:N1:l:1:f:7:cf:2\ncell:O1:l:1:f:7:cf:2\ncell:P1:l:1:f:7:cf:2\ncell:Q1:l:1:f:7:cf:2\ncell:R1:l:1:f:7:cf:2\ncell:S1:l:1:f:7:cf:2\ncell:T1:l:1:f:7:cf:2\ncell:U1:l:1:f:7:cf:2\ncell:V1:l:1:f:7:cf:2\ncell:W1:l:1:f:7:cf:2\ncell:A2:l:1:f:7:cf:2\ncell:B2:l:1:f:7:cf:2\ncell:C2:l:1:f:7:cf:2\ncell:D2:t:Expenses:l:2:f:4:cf:2\ncell:E2:l:1:f:7:cf:2\ncell:F2:l:1:f:7:cf:2\ncell:G2:l:1:f:7:cf:2\ncell:H2:l:1:f:7:cf:2\ncell:I2:l:1:f:7:cf:2\ncell:J2:l:1:f:7:cf:2\ncell:K2:l:1:f:7:cf:2\ncell:L2:l:1:f:7:cf:2\ncell:M2:l:1:f:7:cf:2\ncell:N2:l:1:f:7:cf:2\ncell:O2:l:1:f:7:cf:2\ncell:P2:l:1:f:7:cf:2\ncell:Q2:l:1:f:7:cf:2\ncell:R2:l:1:f:7:cf:2\ncell:S2:l:1:f:7:cf:2\ncell:T2:l:1:f:7:cf:2\ncell:U2:l:1:f:7:cf:2\ncell:V2:l:1:f:7:cf:2\ncell:W2:l:1:f:7:cf:2\ncell:A3:l:1:f:7:cf:2\ncell:B3:l:1:f:7:cf:2\ncell:C3:l:1:f:7:cf:2\ncell:D3:l:1:f:7:cf:2\ncell:G3:l:1:f:7:cf:2\ncell:H3:l:1:f:7:cf:2\ncell:I3:l:1:f:7:cf:2\ncell:J3:l:1:f:7:cf:2\ncell:K3:l:1:f:7:cf:2\ncell:L3:l:1:f:7:cf:2\ncell:M3:l:1:f:7:cf:2\ncell:N3:l:1:f:7:cf:2\ncell:O3:l:1:f:7:cf:2\ncell:P3:l:1:f:7:cf:2\ncell:Q3:t: :l:1:f:7:cf:2\ncell:R3:l:1:f:7:cf:2\ncell:S3:l:1:f:7:cf:2\ncell:T3:l:1:f:7:cf:2\ncell:U3:l:1:f:7:cf:2\ncell:V3:l:1:f:7:cf:2\ncell:W3:l:1:f:7:cf:2\ncell:B4:t:Credit Card Expense:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C4:l:3:f:2:c:3:bg:1:cf:2\ncell:D4:l:3:f:2:c:3:bg:1:cf:1\ncell:E4:vtf:n:209:SUM(E5\\cE11):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F4:vtf:n:2508:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O4:l:1:f:7:cf:2\ncell:P4:l:1:f:7:cf:2\ncell:Q4:l:1:f:7:cf:2\ncell:R4:l:1:f:7:cf:2\ncell:S4:l:1:f:7:cf:2\ncell:T4:l:1:f:7:cf:2\ncell:U4:l:1:f:7:cf:2\ncell:V4:l:1:f:7:cf:2\ncell:W4:l:1:f:7:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:7:cf:2\ncell:C5:l:3:f:7:cf:2\ncell:D5:t:Card 1:l:3:f:6:cf:2\ncell:E5:v:209:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F5:vtf:n:2508:IF( (E5*12)=0,"",(E5*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:7:cf:2\ncell:P5:l:1:f:7:cf:2\ncell:Q5:l:1:f:7:cf:2\ncell:R5:l:1:f:7:cf:2\ncell:S5:l:1:f:7:cf:2\ncell:T5:l:1:f:7:cf:2\ncell:U5:l:1:f:7:cf:2\ncell:V5:l:1:f:7:cf:2\ncell:W5:l:1:f:7:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:7:bg:2:cf:2\ncell:C6:l:3:f:7:bg:2:cf:2\ncell:D6:t:Card 2:l:3:f:6:bg:2:cf:2\ncell:E6:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F6:vtf:t::IF( (E6*12)=0,"",(E6*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:7:cf:2\ncell:P6:l:1:f:7:cf:2\ncell:Q6:l:1:f:7:cf:2\ncell:R6:l:1:f:7:cf:2\ncell:S6:l:1:f:7:cf:2\ncell:T6:l:1:f:7:cf:2\ncell:U6:l:1:f:7:cf:2\ncell:V6:l:1:f:7:cf:2\ncell:W6:l:1:f:7:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:7:cf:2\ncell:C7:l:3:f:7:cf:2\ncell:D7:t:Card 3:l:3:f:6:cf:2\ncell:E7:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:7:cf:2\ncell:P7:l:1:f:7:cf:2\ncell:Q7:l:1:f:7:cf:2\ncell:R7:l:1:f:7:cf:2\ncell:S7:l:1:f:7:cf:2\ncell:T7:l:1:f:7:cf:2\ncell:U7:l:1:f:7:cf:2\ncell:V7:l:1:f:7:cf:2\ncell:W7:l:1:f:7:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:bg:2:cf:2\ncell:C8:l:3:f:7:bg:2:cf:2\ncell:D8:t:Card 4:l:3:f:6:bg:2:cf:2\ncell:E8:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:7:cf:2\ncell:P8:l:1:f:7:cf:2\ncell:Q8:l:1:f:7:cf:2\ncell:R8:l:1:f:7:cf:2\ncell:S8:l:1:f:7:cf:2\ncell:T8:l:1:f:7:cf:2\ncell:U8:l:1:f:7:cf:2\ncell:V8:l:1:f:7:cf:2\ncell:W8:l:1:f:7:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:7:cf:2\ncell:C9:l:3:f:7:cf:2\ncell:D9:t:Department Store Card:l:3:f:6:cf:2\ncell:E9:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F9:vtf:t::IF( (E9*12)=0,"",(E9*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:7:cf:2\ncell:P9:l:1:f:7:cf:2\ncell:Q9:l:1:f:7:cf:2\ncell:R9:l:1:f:7:cf:2\ncell:S9:l:1:f:7:cf:2\ncell:T9:l:1:f:7:cf:2\ncell:U9:l:1:f:7:cf:2\ncell:V9:l:1:f:7:cf:2\ncell:W9:l:1:f:7:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:7:bg:2:cf:2\ncell:C10:l:3:f:7:bg:2:cf:2\ncell:D10:t:Gas Card:l:3:f:6:bg:2:cf:2\ncell:E10:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:7:cf:2\ncell:P10:l:1:f:7:cf:2\ncell:Q10:l:1:f:7:cf:2\ncell:R10:l:1:f:7:cf:2\ncell:S10:l:1:f:7:cf:2\ncell:T10:l:1:f:7:cf:2\ncell:U10:l:1:f:7:cf:2\ncell:V10:l:1:f:7:cf:2\ncell:W10:l:1:f:7:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:7:cf:2\ncell:C11:l:3:f:7:cf:2\ncell:D11:t:Other:l:3:f:6:cf:2\ncell:E11:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:7:cf:2\ncell:P11:l:1:f:7:cf:2\ncell:Q11:l:1:f:7:cf:2\ncell:R11:l:1:f:7:cf:2\ncell:S11:l:1:f:7:cf:2\ncell:T11:l:1:f:7:cf:2\ncell:U11:l:1:f:7:cf:2\ncell:V11:l:1:f:7:cf:2\ncell:W11:l:1:f:7:cf:2\ncell:B12:t:Buisness:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C12:l:3:f:7:bg:2:cf:2\ncell:D12:l:3:f:6:bg:2:cf:2\ncell:E12:vtf:n:780:SUM(E13\\cE17):b:2:2:2:2:l:4:f:6:c:3:bg:1:cf:3:ntvf:1\ncell:F12:vtf:n:9360:IF( (E12*12)=0,"",(E12*12)):b:2:2:2:2:l:4:f:6:c:3:bg:1:cf:3:ntvf:1\ncell:O12:l:1:f:7:cf:2\ncell:P12:l:1:f:7:cf:2\ncell:Q12:l:1:f:7:cf:2\ncell:R12:l:1:f:7:cf:2\ncell:S12:l:1:f:7:cf:2\ncell:T12:l:1:f:7:cf:2\ncell:U12:l:1:f:7:cf:2\ncell:V12:l:1:f:7:cf:2\ncell:W12:l:1:f:7:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:7:cf:2\ncell:C13:l:3:f:7:cf:2\ncell:D13:t:Deductible Expenses:l:3:f:6:cf:2\ncell:E13:v:780:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F13:vtf:n:9360:IF( (E13*12)=0,"",(E13*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:7:cf:2\ncell:P13:l:1:f:7:cf:2\ncell:Q13:l:1:f:7:cf:2\ncell:R13:l:1:f:7:cf:2\ncell:S13:l:1:f:7:cf:2\ncell:T13:l:1:f:7:cf:2\ncell:U13:l:1:f:7:cf:2\ncell:V13:l:1:f:7:cf:2\ncell:W13:l:1:f:7:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:bg:2:cf:2\ncell:C14:l:3:f:7:bg:2:cf:2\ncell:D14:t:Non- Deductible Expenses:l:3:f:6:bg:2:cf:2\ncell:E14:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F14:vtf:t::IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:7:cf:2\ncell:P14:l:1:f:7:cf:2\ncell:Q14:l:1:f:7:cf:2\ncell:R14:l:1:f:7:cf:2\ncell:S14:l:1:f:7:cf:2\ncell:T14:l:1:f:7:cf:2\ncell:U14:l:1:f:7:cf:2\ncell:V14:l:1:f:7:cf:2\ncell:W14:l:1:f:7:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:7:cf:2\ncell:C15:l:3:f:7:cf:2\ncell:D15:t:Others:l:3:f:6:cf:2\ncell:E15:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F15:vtf:t::IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:7:cf:2\ncell:P15:l:1:f:7:cf:2\ncell:Q15:l:1:f:7:cf:2\ncell:R15:l:1:f:7:cf:2\ncell:S15:l:1:f:7:cf:2\ncell:T15:l:1:f:7:cf:2\ncell:U15:l:1:f:7:cf:2\ncell:V15:l:1:f:7:cf:2\ncell:W15:l:1:f:7:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:7:bg:2:cf:2\ncell:C16:l:3:f:7:bg:2:cf:2\ncell:D16:t:Others:l:3:f:6:bg:2:cf:2\ncell:E16:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:7:cf:2\ncell:P16:l:1:f:7:cf:2\ncell:Q16:l:1:f:7:cf:2\ncell:R16:l:1:f:7:cf:2\ncell:S16:l:1:f:7:cf:2\ncell:T16:l:1:f:7:cf:2\ncell:U16:l:1:f:7:cf:2\ncell:V16:l:1:f:7:cf:2\ncell:W16:l:1:f:7:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:7:cf:2\ncell:C17:l:3:f:7:cf:2\ncell:D17:t:Others:l:3:f:6:cf:2\ncell:E17:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:7:cf:2\ncell:P17:l:1:f:7:cf:2\ncell:Q17:l:1:f:7:cf:2\ncell:R17:l:1:f:7:cf:2\ncell:S17:l:1:f:7:cf:2\ncell:T17:l:1:f:7:cf:2\ncell:U17:l:1:f:7:cf:2\ncell:V17:l:1:f:7:cf:2\ncell:W17:l:1:f:7:cf:2\ncell:B18:t:Vacations/Expenses:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C18:l:3:f:2:c:3:bg:1:cf:2\ncell:D18:l:3:f:2:c:3:bg:1:cf:1\ncell:E18:vtf:n:98:SUM(E19\\cE24):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F18:vtf:n:1176:IF( (E18*12)=0,"",(E18*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O18:l:1:f:7:cf:2\ncell:P18:l:1:f:7:cf:2\ncell:Q18:l:1:f:7:cf:2\ncell:R18:l:1:f:7:cf:2\ncell:S18:l:1:f:7:cf:2\ncell:T18:l:1:f:7:cf:2\ncell:U18:l:1:f:7:cf:2\ncell:V18:l:1:f:7:cf:2\ncell:W18:l:1:f:7:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:7:cf:2\ncell:C19:l:3:f:7:cf:2\ncell:D19:t:Airfare:l:3:f:6:cf:2\ncell:E19:v:98:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F19:vtf:n:1176:IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:7:cf:2\ncell:P19:l:1:f:7:cf:2\ncell:Q19:l:1:f:7:cf:2\ncell:R19:l:1:f:7:cf:2\ncell:S19:l:1:f:7:cf:2\ncell:T19:l:1:f:7:cf:2\ncell:U19:l:1:f:7:cf:2\ncell:V19:l:1:f:7:cf:2\ncell:W19:l:1:f:7:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:7:bg:2:cf:2\ncell:C20:l:3:f:7:bg:2:cf:2\ncell:D20:t:Accomodation:l:3:f:6:bg:2:cf:2\ncell:E20:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:7:cf:2\ncell:P20:l:1:f:7:cf:2\ncell:Q20:l:1:f:7:cf:2\ncell:R20:l:1:f:7:cf:2\ncell:S20:l:1:f:7:cf:2\ncell:T20:l:1:f:7:cf:2\ncell:U20:l:1:f:7:cf:2\ncell:V20:l:1:f:7:cf:2\ncell:W20:l:1:f:7:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:cf:2\ncell:C21:l:3:f:7:cf:2\ncell:D21:t:Food:l:3:f:6:cf:2\ncell:E21:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:7:cf:2\ncell:P21:l:1:f:7:cf:2\ncell:Q21:l:1:f:7:cf:2\ncell:R21:l:1:f:7:cf:2\ncell:S21:l:1:f:7:cf:2\ncell:T21:l:1:f:7:cf:2\ncell:U21:l:1:f:7:cf:2\ncell:V21:l:1:f:7:cf:2\ncell:W21:l:1:f:7:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:7:bg:2:cf:2\ncell:C22:l:3:f:7:bg:2:cf:2\ncell:D22:t:Pet Boarding:l:3:f:6:bg:2:cf:2\ncell:E22:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G22:b::::1\ncell:O22:l:1:f:7:cf:2\ncell:P22:l:1:f:7:cf:2\ncell:Q22:l:1:f:7:cf:2\ncell:R22:l:1:f:7:cf:2\ncell:S22:l:1:f:7:cf:2\ncell:T22:l:1:f:7:cf:2\ncell:U22:l:1:f:7:cf:2\ncell:V22:l:1:f:7:cf:2\ncell:W22:l:1:f:7:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:7:cf:2\ncell:C23:l:3:f:7:cf:2\ncell:D23:t:Rental Car:l:3:f:6:cf:2\ncell:E23:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:7:cf:2\ncell:P23:l:1:f:7:cf:2\ncell:Q23:l:1:f:7:cf:2\ncell:R23:l:1:f:7:cf:2\ncell:S23:l:1:f:7:cf:2\ncell:T23:l:1:f:7:cf:2\ncell:U23:l:1:f:7:cf:2\ncell:V23:l:1:f:7:cf:2\ncell:W23:l:1:f:7:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:7:bg:2:cf:2\ncell:C24:l:3:f:7:bg:2:cf:2\ncell:D24:t:Souvenier:l:3:f:6:bg:2:cf:2\ncell:E24:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:7:cf:2\ncell:P24:l:1:f:7:cf:2\ncell:Q24:l:1:f:7:cf:2\ncell:R24:l:1:f:7:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:7:cf:2\ncell:C25:l:3:f:7:cf:2\ncell:D25:t:Others:l:3:f:6:cf:2\ncell:E25:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F25:vtf:t::IF( (E25*12)=0,"",(E25*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G25:b::::1\ncell:O25:l:1:f:7:cf:2\ncell:P25:l:1:f:7:cf:2\ncell:Q25:l:1:f:7:cf:2\ncell:R25:l:1:f:7:cf:2\ncell:B26:t:Miscellaneous:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C26:l:3:f:2:c:3:bg:1:cf:2\ncell:D26:l:3:f:2:c:3:bg:1:cf:1\ncell:E26:vtf:n:222:SUM(E27\\cE29):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F26:vtf:n:2664:IF( (E26*12)=0,"",(E26*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O26:l:1:f:7:cf:2\ncell:P26:l:1:f:7:cf:2\ncell:Q26:l:1:f:7:cf:2\ncell:R26:l:1:f:7:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:7:cf:2\ncell:C27:l:3:f:7:cf:2\ncell:D27:t:Tobacco Consumption:l:3:f:6:cf:2\ncell:E27:v:136:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F27:vtf:n:1632:IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:7:cf:2\ncell:P27:l:1:f:7:cf:2\ncell:Q27:l:1:f:7:cf:2\ncell:R27:l:1:f:7:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:7:bg:2:cf:2\ncell:C28:l:3:f:7:bg:2:cf:2\ncell:D28:t:Others:l:3:f:6:bg:2:cf:2\ncell:E28:v:86:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F28:vtf:n:1032:IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:7:cf:2\ncell:P28:l:1:f:7:cf:2\ncell:Q28:l:1:f:7:cf:2\ncell:R28:l:1:f:7:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:7:cf:2\ncell:C29:l:3:f:7:cf:2\ncell:D29:t:Others:l:3:f:6:cf:2\ncell:E29:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:7:cf:2\ncell:P29:l:1:f:7:cf:2\ncell:Q29:l:1:f:7:cf:2\ncell:R29:l:1:f:7:cf:2\ncell:B30:t:Total Expenses:l:5:f:3:c:3:bg:1:cf:1:colspan:3\ncell:C30:c:3:bg:1\ncell:D30:c:3:bg:1\ncell:E30:vtf:n:4853:sheet10!E25 +sheet10!E22 +sheet10!E18 +sheet10!E13 +sheet10!E4 +sheet9!E26 +sheet9!E17 +sheet9!E12 +sheet9!E4 + expense!E7+sheet11!E26 +sheet11!E18+ sheet11!E12 +sheet11!E4:b:2:2:2:2:c:3:bg:1:ntvf:2\ncell:F30:vtf:n:58236:IF((E30*12)=0,"",(E30*12)):b:2:2:2:2:c:3:bg:1:ntvf:2\ncell:O30:l:1:f:7:cf:2\ncell:P30:l:1:f:7:cf:2\ncell:Q30:l:1:f:7:cf:2\ncell:R30:l:1:f:7:cf:2\ncell:O31:l:1:f:7:cf:2\ncell:P31:l:1:f:7:cf:2\ncell:Q31:l:1:f:7:cf:2\ncell:R31:l:1:f:7:cf:2\ncell:O32:l:1:f:7:cf:2\ncell:P32:l:1:f:7:cf:2\ncell:Q32:l:1:f:7:cf:2\ncell:R32:l:1:f:7:cf:2\ncell:O33:l:1:f:7:cf:2\ncell:P33:l:1:f:7:cf:2\ncell:Q33:l:1:f:7:cf:2\ncell:R33:l:1:f:7:cf:2\ncell:O34:l:1:f:7:cf:2\ncell:P34:l:1:f:7:cf:2\ncell:Q34:l:1:f:7:cf:2\ncell:R34:l:1:f:7:cf:2\ncell:O35:l:1:f:7:cf:2\ncell:P35:l:1:f:7:cf:2\ncell:Q35:l:1:f:7:cf:2\ncell:R35:l:1:f:7:cf:2\ncell:O36:l:1:f:7:cf:2\ncell:P36:l:1:f:7:cf:2\ncell:Q36:l:1:f:7:cf:2\ncell:R36:l:1:f:7:cf:2\ncell:O37:l:1:f:7:cf:2\ncell:P37:l:1:f:7:cf:2\ncell:Q37:l:1:f:7:cf:2\ncell:R37:l:1:f:7:cf:2\ncell:O38:l:1:f:7:cf:2\ncell:P38:l:1:f:7:cf:2\ncell:Q38:l:1:f:7:cf:2\ncell:R38:l:1:f:7:cf:2\ncell:B39:l:1:f:7:cf:2\ncell:C39:l:1:f:7:cf:2\ncell:D39:l:1:f:2:cf:2\ncell:E39:l:1:f:2:cf:3:ntvf:1\ncell:F39:l:1:f:2:cf:3:ntvf:1\ncell:O39:l:1:f:7:cf:2\ncell:P39:l:1:f:7:cf:2\ncell:Q39:l:1:f:7:cf:2\ncell:R39:l:1:f:7:cf:2\ncell:B40:l:1:f:5:cf:2\ncell:C40:l:1:f:5:cf:2\ncell:D40:l:1:f:9:cf:2\ncell:E40:l:1:f:9:cf:2\ncell:F40:l:1:f:7:cf:2\ncell:O40:l:1:f:7:cf:2\ncell:P40:l:1:f:7:cf:2\ncell:Q40:l:1:f:7:cf:2\ncell:R40:l:1:f:7:cf:2\ncell:O41:l:1:f:7:cf:2\ncell:P41:l:1:f:7:cf:2\ncell:Q41:l:1:f:7:cf:2\ncell:R41:l:1:f:7:cf:2\ncell:O42:l:1:f:7:cf:2\ncell:P42:l:1:f:7:cf:2\ncell:Q42:l:1:f:7:cf:2\ncell:R42:l:1:f:7:cf:2\ncell:O43:l:1:f:7:cf:2\ncell:P43:l:1:f:7:cf:2\ncell:Q43:l:1:f:7:cf:2\ncell:R43:l:1:f:7:cf:2\ncell:O44:l:1:f:7:cf:2\ncell:P44:l:1:f:7:cf:2\ncell:Q44:l:1:f:7:cf:2\ncell:R44:l:1:f:7:cf:2\ncell:O45:l:1:f:7:cf:2\ncell:P45:l:1:f:7:cf:2\ncell:Q45:l:1:f:7:cf:2\ncell:R45:l:1:f:7:cf:2\ncell:O46:l:1:f:7:cf:2\ncell:P46:l:1:f:7:cf:2\ncell:Q46:l:1:f:7:cf:2\ncell:R46:l:1:f:7:cf:2\ncell:O47:l:1:f:7:cf:2\ncell:P47:l:1:f:7:cf:2\ncell:Q47:l:1:f:7:cf:2\ncell:R47:l:1:f:7:cf:2\ncell:O48:l:1:f:7:cf:2\ncell:P48:l:1:f:7:cf:2\ncell:Q48:l:1:f:7:cf:2\ncell:R48:l:1:f:7:cf:2\ncell:O49:l:1:f:7:cf:2\ncell:P49:l:1:f:7:cf:2\ncell:Q49:l:1:f:7:cf:2\ncell:R49:l:1:f:7:cf:2\ncell:O50:l:1:f:7:cf:2\ncell:P50:l:1:f:7:cf:2\ncell:Q50:l:1:f:7:cf:2\ncell:R50:l:1:f:7:cf:2\ncell:S50:l:1:f:7:cf:2\ncell:T50:l:1:f:7:cf:2\ncell:U50:l:1:f:7:cf:2\ncell:V50:l:1:f:7:cf:2\ncell:W50:l:1:f:7:cf:2\ncell:O51:l:1:f:7:cf:2\ncell:P51:l:1:f:7:cf:2\ncell:Q51:l:1:f:7:cf:2\ncell:R51:l:1:f:7:cf:2\ncell:S51:l:1:f:7:cf:2\ncell:T51:l:1:f:7:cf:2\ncell:U51:l:1:f:7:cf:2\ncell:V51:l:1:f:7:cf:2\ncell:W51:l:1:f:7:cf:2\ncell:O52:l:1:f:7:cf:2\ncell:P52:l:1:f:7:cf:2\ncell:Q52:l:1:f:7:cf:2\ncell:R52:l:1:f:7:cf:2\ncell:S52:l:1:f:7:cf:2\ncell:T52:l:1:f:7:cf:2\ncell:U52:l:1:f:7:cf:2\ncell:V52:l:1:f:7:cf:2\ncell:W52:l:1:f:7:cf:2\ncell:O53:l:1:f:7:cf:2\ncell:P53:l:1:f:7:cf:2\ncell:Q53:l:1:f:7:cf:2\ncell:R53:l:1:f:7:cf:2\ncell:S53:l:1:f:7:cf:2\ncell:T53:l:1:f:7:cf:2\ncell:U53:l:1:f:7:cf:2\ncell:V53:l:1:f:7:cf:2\ncell:W53:l:1:f:7:cf:2\ncell:O54:l:1:f:7:cf:2\ncell:P54:l:1:f:7:cf:2\ncell:Q54:l:1:f:7:cf:2\ncell:R54:l:1:f:7:cf:2\ncell:S54:l:1:f:7:cf:2\ncell:T54:l:1:f:7:cf:2\ncell:U54:l:1:f:7:cf:2\ncell:V54:l:1:f:7:cf:2\ncell:W54:l:1:f:7:cf:2\ncell:O55:l:1:f:7:cf:2\ncell:P55:l:1:f:7:cf:2\ncell:Q55:l:1:f:7:cf:2\ncell:R55:l:1:f:7:cf:2\ncell:S55:l:1:f:7:cf:2\ncell:T55:l:1:f:7:cf:2\ncell:U55:l:1:f:7:cf:2\ncell:V55:l:1:f:7:cf:2\ncell:W55:l:1:f:7:cf:2\ncell:O56:l:1:f:7:cf:2\ncell:P56:l:1:f:7:cf:2\ncell:Q56:l:1:f:7:cf:2\ncell:R56:l:1:f:7:cf:2\ncell:S56:l:1:f:7:cf:2\ncell:T56:l:1:f:7:cf:2\ncell:U56:l:1:f:7:cf:2\ncell:V56:l:1:f:7:cf:2\ncell:W56:l:1:f:7:cf:2\ncell:O57:l:1:f:7:cf:2\ncell:P57:l:1:f:7:cf:2\ncell:Q57:l:1:f:7:cf:2\ncell:R57:l:1:f:7:cf:2\ncell:S57:l:1:f:7:cf:2\ncell:T57:l:1:f:7:cf:2\ncell:U57:l:1:f:7:cf:2\ncell:V57:l:1:f:7:cf:2\ncell:W57:l:1:f:7:cf:2\ncell:O58:l:1:f:7:cf:2\ncell:P58:l:1:f:7:cf:2\ncell:Q58:l:1:f:7:cf:2\ncell:R58:l:1:f:7:cf:2\ncell:S58:l:1:f:7:cf:2\ncell:T58:l:1:f:7:cf:2\ncell:U58:l:1:f:7:cf:2\ncell:V58:l:1:f:7:cf:2\ncell:W58:l:1:f:7:cf:2\ncell:O59:l:1:f:7:cf:2\ncell:P59:l:1:f:7:cf:2\ncell:Q59:l:1:f:7:cf:2\ncell:R59:l:1:f:7:cf:2\ncell:S59:l:1:f:7:cf:2\ncell:T59:l:1:f:7:cf:2\ncell:U59:l:1:f:7:cf:2\ncell:V59:l:1:f:7:cf:2\ncell:W59:l:1:f:7:cf:2\ncell:O60:l:1:f:7:cf:2\ncell:P60:l:1:f:7:cf:2\ncell:Q60:l:1:f:7:cf:2\ncell:R60:l:1:f:7:cf:2\ncell:S60:l:1:f:7:cf:2\ncell:T60:l:1:f:7:cf:2\ncell:U60:l:1:f:7:cf:2\ncell:V60:l:1:f:7:cf:2\ncell:W60:l:1:f:7:cf:2\ncell:O61:l:1:f:7:cf:2\ncell:P61:l:1:f:7:cf:2\ncell:Q61:l:1:f:7:cf:2\ncell:R61:l:1:f:7:cf:2\ncell:S61:l:1:f:7:cf:2\ncell:T61:l:1:f:7:cf:2\ncell:U61:l:1:f:7:cf:2\ncell:V61:l:1:f:7:cf:2\ncell:W61:l:1:f:7:cf:2\ncell:O62:l:1:f:7:cf:2\ncell:P62:l:1:f:7:cf:2\ncell:Q62:l:1:f:7:cf:2\ncell:R62:l:1:f:7:cf:2\ncell:S62:l:1:f:7:cf:2\ncell:T62:l:1:f:7:cf:2\ncell:U62:l:1:f:7:cf:2\ncell:V62:l:1:f:7:cf:2\ncell:W62:l:1:f:7:cf:2\ncell:O63:l:1:f:7:cf:2\ncell:P63:l:1:f:7:cf:2\ncell:Q63:l:1:f:7:cf:2\ncell:R63:l:1:f:7:cf:2\ncell:S63:l:1:f:7:cf:2\ncell:T63:l:1:f:7:cf:2\ncell:U63:l:1:f:7:cf:2\ncell:V63:l:1:f:7:cf:2\ncell:W63:l:1:f:7:cf:2\ncell:O64:l:1:f:7:cf:2\ncell:P64:l:1:f:7:cf:2\ncell:Q64:l:1:f:7:cf:2\ncell:R64:l:1:f:7:cf:2\ncell:S64:l:1:f:7:cf:2\ncell:T64:l:1:f:7:cf:2\ncell:U64:l:1:f:7:cf:2\ncell:V64:l:1:f:7:cf:2\ncell:W64:l:1:f:7:cf:2\ncell:O65:l:1:f:7:cf:2\ncell:P65:l:1:f:7:cf:2\ncell:Q65:l:1:f:7:cf:2\ncell:R65:l:1:f:7:cf:2\ncell:S65:l:1:f:7:cf:2\ncell:T65:l:1:f:7:cf:2\ncell:U65:l:1:f:7:cf:2\ncell:V65:l:1:f:7:cf:2\ncell:W65:l:1:f:7:cf:2\ncell:O66:l:1:f:7:cf:2\ncell:P66:l:1:f:7:cf:2\ncell:Q66:l:1:f:7:cf:2\ncell:R66:l:1:f:7:cf:2\ncell:S66:l:1:f:7:cf:2\ncell:T66:l:1:f:7:cf:2\ncell:U66:l:1:f:7:cf:2\ncell:V66:l:1:f:7:cf:2\ncell:W66:l:1:f:7:cf:2\ncell:O67:l:1:f:7:cf:2\ncell:P67:l:1:f:7:cf:2\ncell:Q67:l:1:f:7:cf:2\ncell:R67:l:1:f:7:cf:2\ncell:S67:l:1:f:7:cf:2\ncell:T67:l:1:f:7:cf:2\ncell:U67:l:1:f:7:cf:2\ncell:V67:l:1:f:7:cf:2\ncell:W67:l:1:f:7:cf:2\ncell:O68:l:1:f:7:cf:2\ncell:P68:l:1:f:7:cf:2\ncell:Q68:l:1:f:7:cf:2\ncell:R68:l:1:f:7:cf:2\ncell:S68:l:1:f:7:cf:2\ncell:T68:l:1:f:7:cf:2\ncell:U68:l:1:f:7:cf:2\ncell:V68:l:1:f:7:cf:2\ncell:W68:l:1:f:7:cf:2\ncell:O69:l:1:f:7:cf:2\ncell:P69:l:1:f:7:cf:2\ncell:Q69:l:1:f:7:cf:2\ncell:R69:l:1:f:7:cf:2\ncell:S69:l:1:f:7:cf:2\ncell:T69:l:1:f:7:cf:2\ncell:U69:l:1:f:7:cf:2\ncell:V69:l:1:f:7:cf:2\ncell:W69:l:1:f:7:cf:2\ncell:O70:l:1:f:7:cf:2\ncell:P70:l:1:f:7:cf:2\ncell:Q70:l:1:f:7:cf:2\ncell:R70:l:1:f:7:cf:2\ncell:S70:l:1:f:7:cf:2\ncell:T70:l:1:f:7:cf:2\ncell:U70:l:1:f:7:cf:2\ncell:V70:l:1:f:7:cf:2\ncell:W70:l:1:f:7:cf:2\ncell:O71:l:1:f:7:cf:2\ncell:P71:l:1:f:7:cf:2\ncell:Q71:l:1:f:7:cf:2\ncell:R71:l:1:f:7:cf:2\ncell:S71:l:1:f:7:cf:2\ncell:T71:l:1:f:7:cf:2\ncell:U71:l:1:f:7:cf:2\ncell:V71:l:1:f:7:cf:2\ncell:W71:l:1:f:7:cf:2\ncell:O72:l:1:f:7:cf:2\ncell:P72:l:1:f:7:cf:2\ncell:Q72:l:1:f:7:cf:2\ncell:R72:l:1:f:7:cf:2\ncell:S72:l:1:f:7:cf:2\ncell:T72:l:1:f:7:cf:2\ncell:U72:l:1:f:7:cf:2\ncell:V72:l:1:f:7:cf:2\ncell:W72:l:1:f:7:cf:2\ncell:O73:l:1:f:7:cf:2\ncell:P73:l:1:f:7:cf:2\ncell:Q73:l:1:f:7:cf:2\ncell:R73:l:1:f:7:cf:2\ncell:S73:l:1:f:7:cf:2\ncell:T73:l:1:f:7:cf:2\ncell:U73:l:1:f:7:cf:2\ncell:V73:l:1:f:7:cf:2\ncell:W73:l:1:f:7:cf:2\ncell:O74:l:1:f:7:cf:2\ncell:P74:l:1:f:7:cf:2\ncell:Q74:l:1:f:7:cf:2\ncell:R74:l:1:f:7:cf:2\ncell:S74:l:1:f:7:cf:2\ncell:T74:l:1:f:7:cf:2\ncell:U74:l:1:f:7:cf:2\ncell:V74:l:1:f:7:cf:2\ncell:W74:l:1:f:7:cf:2\ncell:O75:l:1:f:7:cf:2\ncell:P75:l:1:f:7:cf:2\ncell:Q75:l:1:f:7:cf:2\ncell:R75:l:1:f:7:cf:2\ncell:S75:l:1:f:7:cf:2\ncell:T75:l:1:f:7:cf:2\ncell:U75:l:1:f:7:cf:2\ncell:V75:l:1:f:7:cf:2\ncell:W75:l:1:f:7:cf:2\ncell:O76:l:1:f:7:cf:2\ncell:P76:l:1:f:7:cf:2\ncell:Q76:l:1:f:7:cf:2\ncell:R76:l:1:f:7:cf:2\ncell:S76:l:1:f:7:cf:2\ncell:T76:l:1:f:7:cf:2\ncell:U76:l:1:f:7:cf:2\ncell:V76:l:1:f:7:cf:2\ncell:W76:l:1:f:7:cf:2\ncell:O77:l:1:f:7:cf:2\ncell:P77:l:1:f:7:cf:2\ncell:Q77:l:1:f:7:cf:2\ncell:R77:l:1:f:7:cf:2\ncell:S77:l:1:f:7:cf:2\ncell:T77:l:1:f:7:cf:2\ncell:U77:l:1:f:7:cf:2\ncell:V77:l:1:f:7:cf:2\ncell:W77:l:1:f:7:cf:2\ncell:O78:l:1:f:7:cf:2\ncell:P78:l:1:f:7:cf:2\ncell:Q78:l:1:f:7:cf:2\ncell:R78:l:1:f:7:cf:2\ncell:S78:l:1:f:7:cf:2\ncell:T78:l:1:f:7:cf:2\ncell:U78:l:1:f:7:cf:2\ncell:V78:l:1:f:7:cf:2\ncell:W78:l:1:f:7:cf:2\ncell:O79:l:1:f:7:cf:2\ncell:P79:l:1:f:7:cf:2\ncell:Q79:l:1:f:7:cf:2\ncell:R79:l:1:f:7:cf:2\ncell:S79:l:1:f:7:cf:2\ncell:T79:l:1:f:7:cf:2\ncell:U79:l:1:f:7:cf:2\ncell:V79:l:1:f:7:cf:2\ncell:W79:l:1:f:7:cf:2\ncell:O80:l:1:f:7:cf:2\ncell:P80:l:1:f:7:cf:2\ncell:Q80:l:1:f:7:cf:2\ncell:R80:l:1:f:7:cf:2\ncell:S80:l:1:f:7:cf:2\ncell:T80:l:1:f:7:cf:2\ncell:U80:l:1:f:7:cf:2\ncell:V80:l:1:f:7:cf:2\ncell:W80:l:1:f:7:cf:2\ncell:O81:l:1:f:7:cf:2\ncell:P81:l:1:f:7:cf:2\ncell:Q81:l:1:f:7:cf:2\ncell:R81:l:1:f:7:cf:2\ncell:S81:l:1:f:7:cf:2\ncell:T81:l:1:f:7:cf:2\ncell:U81:l:1:f:7:cf:2\ncell:V81:l:1:f:7:cf:2\ncell:W81:l:1:f:7:cf:2\ncell:O82:l:1:f:7:cf:2\ncell:P82:l:1:f:7:cf:2\ncell:Q82:l:1:f:7:cf:2\ncell:R82:l:1:f:7:cf:2\ncell:S82:l:1:f:7:cf:2\ncell:T82:l:1:f:7:cf:2\ncell:U82:l:1:f:7:cf:2\ncell:V82:l:1:f:7:cf:2\ncell:W82:l:1:f:7:cf:2\ncell:O83:l:1:f:7:cf:2\ncell:P83:l:1:f:7:cf:2\ncell:Q83:l:1:f:7:cf:2\ncell:R83:l:1:f:7:cf:2\ncell:S83:l:1:f:7:cf:2\ncell:T83:l:1:f:7:cf:2\ncell:U83:l:1:f:7:cf:2\ncell:V83:l:1:f:7:cf:2\ncell:W83:l:1:f:7:cf:2\ncell:O84:l:1:f:7:cf:2\ncell:P84:l:1:f:7:cf:2\ncell:Q84:l:1:f:7:cf:2\ncell:R84:l:1:f:7:cf:2\ncell:S84:l:1:f:7:cf:2\ncell:T84:l:1:f:7:cf:2\ncell:U84:l:1:f:7:cf:2\ncell:V84:l:1:f:7:cf:2\ncell:W84:l:1:f:7:cf:2\ncell:O85:l:1:f:7:cf:2\ncell:P85:l:1:f:7:cf:2\ncell:Q85:l:1:f:7:cf:2\ncell:R85:l:1:f:7:cf:2\ncell:S85:l:1:f:7:cf:2\ncell:T85:l:1:f:7:cf:2\ncell:U85:l:1:f:7:cf:2\ncell:V85:l:1:f:7:cf:2\ncell:W85:l:1:f:7:cf:2\ncell:O86:l:1:f:7:cf:2\ncell:P86:l:1:f:7:cf:2\ncell:Q86:l:1:f:7:cf:2\ncell:R86:l:1:f:7:cf:2\ncell:S86:l:1:f:7:cf:2\ncell:T86:l:1:f:7:cf:2\ncell:U86:l:1:f:7:cf:2\ncell:V86:l:1:f:7:cf:2\ncell:W86:l:1:f:7:cf:2\ncell:O87:l:1:f:7:cf:2\ncell:P87:l:1:f:7:cf:2\ncell:Q87:l:1:f:7:cf:2\ncell:R87:l:1:f:7:cf:2\ncell:S87:l:1:f:7:cf:2\ncell:T87:l:1:f:7:cf:2\ncell:U87:l:1:f:7:cf:2\ncell:V87:l:1:f:7:cf:2\ncell:W87:l:1:f:7:cf:2\ncell:O88:l:1:f:7:cf:2\ncell:P88:l:1:f:7:cf:2\ncell:Q88:l:1:f:7:cf:2\ncell:R88:l:1:f:7:cf:2\ncell:S88:l:1:f:7:cf:2\ncell:T88:l:1:f:7:cf:2\ncell:U88:l:1:f:7:cf:2\ncell:V88:l:1:f:7:cf:2\ncell:W88:l:1:f:7:cf:2\ncell:O89:l:1:f:7:cf:2\ncell:P89:l:1:f:7:cf:2\ncell:Q89:l:1:f:7:cf:2\ncell:R89:l:1:f:7:cf:2\ncell:S89:l:1:f:7:cf:2\ncell:T89:l:1:f:7:cf:2\ncell:U89:l:1:f:7:cf:2\ncell:V89:l:1:f:7:cf:2\ncell:W89:l:1:f:7:cf:2\ncell:O90:l:1:f:7:cf:2\ncell:P90:l:1:f:7:cf:2\ncell:Q90:l:1:f:7:cf:2\ncell:R90:l:1:f:7:cf:2\ncell:S90:l:1:f:7:cf:2\ncell:T90:l:1:f:7:cf:2\ncell:U90:l:1:f:7:cf:2\ncell:V90:l:1:f:7:cf:2\ncell:W90:l:1:f:7:cf:2\ncell:O91:l:1:f:7:cf:2\ncell:P91:l:1:f:7:cf:2\ncell:Q91:l:1:f:7:cf:2\ncell:R91:l:1:f:7:cf:2\ncell:S91:l:1:f:7:cf:2\ncell:T91:l:1:f:7:cf:2\ncell:U91:l:1:f:7:cf:2\ncell:V91:l:1:f:7:cf:2\ncell:W91:l:1:f:7:cf:2\ncell:O92:l:1:f:7:cf:2\ncell:P92:l:1:f:7:cf:2\ncell:Q92:l:1:f:7:cf:2\ncell:R92:l:1:f:7:cf:2\ncell:S92:l:1:f:7:cf:2\ncell:T92:l:1:f:7:cf:2\ncell:U92:l:1:f:7:cf:2\ncell:V92:l:1:f:7:cf:2\ncell:W92:l:1:f:7:cf:2\ncell:O93:l:1:f:7:cf:2\ncell:P93:l:1:f:7:cf:2\ncell:Q93:l:1:f:7:cf:2\ncell:R93:l:1:f:7:cf:2\ncell:S93:l:1:f:7:cf:2\ncell:T93:l:1:f:7:cf:2\ncell:U93:l:1:f:7:cf:2\ncell:V93:l:1:f:7:cf:2\ncell:W93:l:1:f:7:cf:2\ncell:O94:l:1:f:7:cf:2\ncell:P94:l:1:f:7:cf:2\ncell:Q94:l:1:f:7:cf:2\ncell:R94:l:1:f:7:cf:2\ncell:S94:l:1:f:7:cf:2\ncell:T94:l:1:f:7:cf:2\ncell:U94:l:1:f:7:cf:2\ncell:V94:l:1:f:7:cf:2\ncell:W94:l:1:f:7:cf:2\ncell:O95:l:1:f:7:cf:2\ncell:P95:l:1:f:7:cf:2\ncell:Q95:l:1:f:7:cf:2\ncell:R95:l:1:f:7:cf:2\ncell:S95:l:1:f:7:cf:2\ncell:T95:l:1:f:7:cf:2\ncell:U95:l:1:f:7:cf:2\ncell:V95:l:1:f:7:cf:2\ncell:W95:l:1:f:7:cf:2\ncell:O96:l:1:f:7:cf:2\ncell:P96:l:1:f:7:cf:2\ncell:Q96:l:1:f:7:cf:2\ncell:R96:l:1:f:7:cf:2\ncell:S96:l:1:f:7:cf:2\ncell:T96:l:1:f:7:cf:2\ncell:U96:l:1:f:7:cf:2\ncell:V96:l:1:f:7:cf:2\ncell:W96:l:1:f:7:cf:2\ncell:O97:l:1:f:7:cf:2\ncell:P97:l:1:f:7:cf:2\ncell:Q97:l:1:f:7:cf:2\ncell:R97:l:1:f:7:cf:2\ncell:S97:l:1:f:7:cf:2\ncell:T97:l:1:f:7:cf:2\ncell:U97:l:1:f:7:cf:2\ncell:V97:l:1:f:7:cf:2\ncell:W97:l:1:f:7:cf:2\ncell:O98:l:1:f:7:cf:2\ncell:P98:l:1:f:7:cf:2\ncell:Q98:l:1:f:7:cf:2\ncell:R98:l:1:f:7:cf:2\ncell:S98:l:1:f:7:cf:2\ncell:T98:l:1:f:7:cf:2\ncell:U98:l:1:f:7:cf:2\ncell:V98:l:1:f:7:cf:2\ncell:W98:l:1:f:7:cf:2\ncell:O99:l:1:f:7:cf:2\ncell:P99:l:1:f:7:cf:2\ncell:Q99:l:1:f:7:cf:2\ncell:R99:l:1:f:7:cf:2\ncell:S99:l:1:f:7:cf:2\ncell:T99:l:1:f:7:cf:2\ncell:U99:l:1:f:7:cf:2\ncell:V99:l:1:f:7:cf:2\ncell:W99:l:1:f:7:cf:2\ncell:O100:l:1:f:7:cf:2\ncell:P100:l:1:f:7:cf:2\ncell:Q100:l:1:f:7:cf:2\ncell:R100:l:1:f:7:cf:2\ncell:S100:l:1:f:7:cf:2\ncell:T100:l:1:f:7:cf:2\ncell:U100:l:1:f:7:cf:2\ncell:V100:l:1:f:7:cf:2\ncell:W100:l:1:f:7:cf:2\ncell:O101:l:1:f:7:cf:2\ncell:P101:l:1:f:7:cf:2\ncell:Q101:l:1:f:7:cf:2\ncell:R101:l:1:f:7:cf:2\ncell:S101:l:1:f:7:cf:2\ncell:T101:l:1:f:7:cf:2\ncell:U101:l:1:f:7:cf:2\ncell:V101:l:1:f:7:cf:2\ncell:W101:l:1:f:7:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:A106:l:1:f:8:cf:2\ncell:B106:l:1:f:8:cf:2\ncell:C106:l:1:f:8:cf:2\ncell:D106:l:1:f:8:cf:2\ncell:E106:l:1:f:8:cf:2\ncell:F106:t:Monthly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G106:l:1:f:8:cf:2\ncell:H106:l:1:f:8:cf:2\ncell:I106:l:1:f:8:cf:2\ncell:J106:l:1:f:8:cf:2\ncell:K106:l:1:f:8:cf:2\ncell:L106:l:1:f:8:cf:2\ncell:M106:l:1:f:8:cf:2\ncell:N106:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:A107:l:1:f:8:cf:2\ncell:B107:l:1:f:8:cf:2\ncell:C107:l:1:f:8:cf:2\ncell:D107:l:1:f:8:cf:2\ncell:E107:l:1:f:8:cf:2\ncell:F107:t:Semi-Annually:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G107:l:1:f:8:cf:2\ncell:H107:l:1:f:8:cf:2\ncell:I107:l:1:f:8:cf:2\ncell:J107:l:1:f:8:cf:2\ncell:K107:l:1:f:8:cf:2\ncell:L107:l:1:f:8:cf:2\ncell:M107:l:1:f:8:cf:2\ncell:N107:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:A108:l:1:f:8:cf:2\ncell:B108:l:1:f:8:cf:2\ncell:C108:l:1:f:8:cf:2\ncell:D108:l:1:f:8:cf:2\ncell:E108:l:1:f:8:cf:2\ncell:F108:t:Quarterly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G108:l:1:f:8:cf:2\ncell:H108:l:1:f:8:cf:2\ncell:I108:l:1:f:8:cf:2\ncell:J108:l:1:f:8:cf:2\ncell:K108:l:1:f:8:cf:2\ncell:L108:l:1:f:8:cf:2\ncell:M108:l:1:f:8:cf:2\ncell:N108:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:A109:l:1:f:8:cf:2\ncell:B109:l:1:f:8:cf:2\ncell:C109:l:1:f:8:cf:2\ncell:D109:l:1:f:8:cf:2\ncell:E109:l:1:f:8:cf:2\ncell:F109:t:Yearly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G109:l:1:f:8:cf:2\ncell:H109:l:1:f:8:cf:2\ncell:I109:l:1:f:8:cf:2\ncell:J109:l:1:f:8:cf:2\ncell:K109:l:1:f:8:cf:2\ncell:L109:l:1:f:8:cf:2\ncell:M109:l:1:f:8:cf:2\ncell:N109:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncell:A110:l:1:f:8:cf:2\ncell:B110:l:1:f:8:cf:2\ncell:C110:l:1:f:8:cf:2\ncell:D110:l:1:f:8:cf:2\ncell:E110:l:1:f:8:cf:2\ncell:F110:l:1:f:8:cf:2\ncell:G110:l:1:f:8:cf:2\ncell:H110:l:1:f:8:cf:2\ncell:I110:l:1:f:8:cf:2\ncell:J110:l:1:f:8:cf:2\ncell:K110:l:1:f:8:cf:2\ncell:L110:l:1:f:8:cf:2\ncell:M110:l:1:f:8:cf:2\ncell:N110:l:1:f:8:cf:2\ncell:O110:l:1:f:8:cf:2\ncell:P110:l:1:f:8:cf:2\ncell:Q110:l:1:f:8:cf:2\ncell:R110:l:1:f:8:cf:2\ncell:S110:l:1:f:8:cf:2\ncell:T110:l:1:f:8:cf:2\ncell:U110:l:1:f:8:cf:2\ncell:V110:l:1:f:8:cf:2\ncell:W110:l:1:f:8:cf:2\ncell:A111:l:1:f:8:cf:2\ncell:B111:l:1:f:8:cf:2\ncell:C111:l:1:f:8:cf:2\ncell:D111:l:1:f:8:cf:2\ncell:E111:l:1:f:8:cf:2\ncell:F111:l:1:f:8:cf:2\ncell:G111:l:1:f:8:cf:2\ncell:H111:l:1:f:8:cf:2\ncell:I111:l:1:f:8:cf:2\ncell:J111:l:1:f:8:cf:2\ncell:K111:l:1:f:8:cf:2\ncell:L111:l:1:f:8:cf:2\ncell:M111:l:1:f:8:cf:2\ncell:N111:l:1:f:8:cf:2\ncell:O111:l:1:f:8:cf:2\ncell:P111:l:1:f:8:cf:2\ncell:Q111:l:1:f:8:cf:2\ncell:R111:l:1:f:8:cf:2\ncell:S111:l:1:f:8:cf:2\ncell:T111:l:1:f:8:cf:2\ncell:U111:l:1:f:8:cf:2\ncell:V111:l:1:f:8:cf:2\ncell:W111:l:1:f:8:cf:2\ncell:A112:l:1:f:8:cf:2\ncell:B112:l:1:f:8:cf:2\ncell:C112:l:1:f:8:cf:2\ncell:D112:l:1:f:8:cf:2\ncell:E112:l:1:f:8:cf:2\ncell:F112:l:1:f:8:cf:2\ncell:G112:l:1:f:8:cf:2\ncell:H112:l:1:f:8:cf:2\ncell:I112:l:1:f:8:cf:2\ncell:J112:l:1:f:8:cf:2\ncell:K112:l:1:f:8:cf:2\ncell:L112:l:1:f:8:cf:2\ncell:M112:l:1:f:8:cf:2\ncell:N112:l:1:f:8:cf:2\ncell:O112:l:1:f:8:cf:2\ncell:P112:l:1:f:8:cf:2\ncell:Q112:l:1:f:8:cf:2\ncell:R112:l:1:f:8:cf:2\ncell:S112:l:1:f:8:cf:2\ncell:T112:l:1:f:8:cf:2\ncell:U112:l:1:f:8:cf:2\ncell:V112:l:1:f:8:cf:2\ncell:W112:l:1:f:8:cf:2\ncell:A113:l:1:f:8:cf:2\ncell:B113:l:1:f:8:cf:2\ncell:C113:l:1:f:8:cf:2\ncell:D113:l:1:f:8:cf:2\ncell:E113:l:1:f:8:cf:2\ncell:F113:l:1:f:8:cf:2\ncell:G113:l:1:f:8:cf:2\ncell:H113:l:1:f:8:cf:2\ncell:I113:l:1:f:8:cf:2\ncell:J113:l:1:f:8:cf:2\ncell:K113:l:1:f:8:cf:2\ncell:L113:l:1:f:8:cf:2\ncell:M113:l:1:f:8:cf:2\ncell:N113:l:1:f:8:cf:2\ncell:O113:l:1:f:8:cf:2\ncell:P113:l:1:f:8:cf:2\ncell:Q113:l:1:f:8:cf:2\ncell:R113:l:1:f:8:cf:2\ncell:S113:l:1:f:8:cf:2\ncell:T113:l:1:f:8:cf:2\ncell:U113:l:1:f:8:cf:2\ncell:V113:l:1:f:8:cf:2\ncell:W113:l:1:f:8:cf:2\ncell:A114:l:1:f:8:cf:2\ncell:B114:l:1:f:8:cf:2\ncell:C114:l:1:f:8:cf:2\ncell:D114:l:1:f:8:cf:2\ncell:E114:l:1:f:8:cf:2\ncell:F114:l:1:f:8:cf:2\ncell:G114:l:1:f:8:cf:2\ncell:H114:l:1:f:8:cf:2\ncell:I114:l:1:f:8:cf:2\ncell:J114:l:1:f:8:cf:2\ncell:K114:l:1:f:8:cf:2\ncell:L114:l:1:f:8:cf:2\ncell:M114:l:1:f:8:cf:2\ncell:N114:l:1:f:8:cf:2\ncell:O114:l:1:f:8:cf:2\ncell:P114:l:1:f:8:cf:2\ncell:Q114:l:1:f:8:cf:2\ncell:R114:l:1:f:8:cf:2\ncell:S114:l:1:f:8:cf:2\ncell:T114:l:1:f:8:cf:2\ncell:U114:l:1:f:8:cf:2\ncell:V114:l:1:f:8:cf:2\ncell:W114:l:1:f:8:cf:2\ncell:A115:l:1:f:8:cf:2\ncell:B115:l:1:f:8:cf:2\ncell:C115:l:1:f:8:cf:2\ncell:D115:l:1:f:8:cf:2\ncell:E115:l:1:f:8:cf:2\ncell:F115:l:1:f:8:cf:2\ncell:G115:l:1:f:8:cf:2\ncell:H115:l:1:f:8:cf:2\ncell:I115:l:1:f:8:cf:2\ncell:J115:l:1:f:8:cf:2\ncell:K115:l:1:f:8:cf:2\ncell:L115:l:1:f:8:cf:2\ncell:M115:l:1:f:8:cf:2\ncell:N115:l:1:f:8:cf:2\ncell:O115:l:1:f:8:cf:2\ncell:P115:l:1:f:8:cf:2\ncell:Q115:l:1:f:8:cf:2\ncell:R115:l:1:f:8:cf:2\ncell:S115:l:1:f:8:cf:2\ncell:T115:l:1:f:8:cf:2\ncell:U115:l:1:f:8:cf:2\ncell:V115:l:1:f:8:cf:2\ncell:W115:l:1:f:8:cf:2\ncell:A116:l:1:f:8:cf:2\ncell:B116:l:1:f:8:cf:2\ncell:C116:l:1:f:8:cf:2\ncell:D116:l:1:f:8:cf:2\ncell:E116:l:1:f:8:cf:2\ncell:F116:l:1:f:8:cf:2\ncell:G116:l:1:f:8:cf:2\ncell:H116:l:1:f:8:cf:2\ncell:I116:l:1:f:8:cf:2\ncell:J116:l:1:f:8:cf:2\ncell:K116:l:1:f:8:cf:2\ncell:L116:l:1:f:8:cf:2\ncell:M116:l:1:f:8:cf:2\ncell:N116:l:1:f:8:cf:2\ncell:O116:l:1:f:8:cf:2\ncell:P116:l:1:f:8:cf:2\ncell:Q116:l:1:f:8:cf:2\ncell:R116:l:1:f:8:cf:2\ncell:S116:l:1:f:8:cf:2\ncell:T116:l:1:f:8:cf:2\ncell:U116:l:1:f:8:cf:2\ncell:V116:l:1:f:8:cf:2\ncell:W116:l:1:f:8:cf:2\ncell:A117:l:1:f:8:cf:2\ncell:B117:l:1:f:8:cf:2\ncell:C117:l:1:f:8:cf:2\ncell:D117:l:1:f:8:cf:2\ncell:E117:l:1:f:8:cf:2\ncell:F117:l:1:f:8:cf:2\ncell:G117:l:1:f:8:cf:2\ncell:H117:l:1:f:8:cf:2\ncell:I117:l:1:f:8:cf:2\ncell:J117:l:1:f:8:cf:2\ncell:K117:l:1:f:8:cf:2\ncell:L117:l:1:f:8:cf:2\ncell:M117:l:1:f:8:cf:2\ncell:N117:l:1:f:8:cf:2\ncell:O117:l:1:f:8:cf:2\ncell:P117:l:1:f:8:cf:2\ncell:Q117:l:1:f:8:cf:2\ncell:R117:l:1:f:8:cf:2\ncell:S117:l:1:f:8:cf:2\ncell:T117:l:1:f:8:cf:2\ncell:U117:l:1:f:8:cf:2\ncell:V117:l:1:f:8:cf:2\ncell:W117:l:1:f:8:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nsheet:c:27:r:117:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 12pt arial,helvetica,sans-serif\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 9pt Arial\nfont:6:normal normal * Arial\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 7pt Arial\nfont:9:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nlayout:5:padding:* 8px * *;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:#,##0.00;\\b-#,##0.00;\\b-\nvalueformat:3:hidden\nname:COMPARISON::S43\\cU57\nname:TRACKING::AC43\\cAE57\n', - }, - name: "sheet11", - hidden: "0", - }, - sheet7: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:f:3:ntvf:3\ncell:B4:t:Comparison:l:1:f:6:c:1:bg:4:cf:2:colspan:3\ncell:B6:t:How does your spending compare to the guidelines ?:f:5:cf:2:colspan:6\ncell:C9:t:Expense Category:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:D9:t:Guideline:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:E9:t:Recommended Monthly Value:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:F9:t:Actual Monthly Value:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:B10:b::1::\ncell:C10:t:Housing:b::1::1:l:4:f:2\ncell:D10:v:0.35:b::1::1:l:5:f:2:ntvf:2\ncell:E10:vtf:n:1578.85:D10*INCOME!D23:b::1::1:l:5:f:2:ntvf:1\ncell:F10:vtf:n:1380:EXPENSE!E7:b::1::1:l:5:f:2:ntvf:1\ncell:G10:b::::1\ncell:B11:b::1::\ncell:C11:t:Transportation:b::1::1:l:4:f:2:bg:3\ncell:D11:vtc:n%:0.2:20%:b::1::1:l:5:f:2:bg:3:ntvf:2\ncell:E11:vtf:n:902.2:D11*INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:1\ncell:F11:vtf:n:640:sheet9!E17:b::1::1:l:5:f:2:bg:3:ntvf:1\ncell:G11:b::::1\ncell:B12:b::1::\ncell:C12:t:Debt:b::1::1:l:4:f:2\ncell:D12:v:0.05:b::1::1:l:5:f:2:ntvf:2\ncell:E12:vtf:n:225.55:D12*INCOME!D23:b::1::1:l:5:f:2:ntvf:1\ncell:F12:vtf:n:0:sheet11!E22:b::1::1:l:5:f:2:ntvf:1\ncell:G12:b::::1\ncell:B13:b::1::\ncell:C13:t:Savings:b::1:1:1:l:4:f:2:bg:3\ncell:D13:vtc:n:0.2:0.20:b::1:1:1:l:5:f:2:bg:3:ntvf:2\ncell:E13:vtf:n:902.2:D13*INCOME!D23:b::1:1:1:l:5:f:2:bg:3:ntvf:1\ncell:F13:vtf:n:-342:INCOME!D23-sheet11!E30:b::1:1:1:l:5:f:2:bg:3:ntvf:1\ncell:G13:b::::1\ncell:C14:b:1:::\ncell:D14:b:1:::\ncell:E14:b:1:::\ncell:F14:b:1:::\ncell:B17:t:How does your spending compare to the average consumer?:f:4:cf:2:colspan:6\ncell:B19:bg:4\ncell:C19:t:Expense Category:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:D19:t:Average Consumer Spending (as percentage of income):b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1:colspan:2\ncell:E19:b:2:2:2:2\ncell:F19:t:Your Spending (as percentage of income):b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1:colspan:2\ncell:B20:b::1:::bg:4\ncell:C20:t:Housing:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D20:vtc:n%:0.28:28%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E20:b::1::1\ncell:F20:vtf:n:0.3059188649966748:EXPENSE!E7/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B21:b::1:::bg:4\ncell:C21:t:Food:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D21:vtc:n%:0.11:11%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E21:b::1::1\ncell:F21:vtf:n:0.04633119042340944:sheet11!E4/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B22:b::1:::bg:4\ncell:C22:t:Transportation:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D22:vtc:n%:0.13:13%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E22:b::1::1\ncell:F22:vtf:n:0.14187541565063178:sheet9!E17/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B23:b::1:::bg:4\ncell:C23:t:Clothes & Personal Services:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D23:vtc:n%:0.03:3%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E23:b::1::1\ncell:F23:vtf:n:0.042340944358235426:sheet9!E12/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B24:b::1:::bg:4\ncell:C24:t:Healthcare:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D24:vtc:n%:0.05:5%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E24:b::1::1\ncell:F24:vtf:n:0.0583019286189315:sheet9!E26/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B25:b::1:::bg:4\ncell:C25:t:Entertainment:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D25:vtc:n%:0.04:4%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E25:b::1::1\ncell:F25:vtf:n:0.04633119042340944:sheet10!E4/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B26:b::1:::bg:4\ncell:C26:t:Education:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D26:vtc:n%:0.02:2%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E26:b::1::1\ncell:F26:vtf:n:0.021724673021502994:sheet10!E13/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B27:b::1:::bg:4\ncell:C27:t:Contributions:b::1:1:1:l:2:f:7:bg:3:cf:2\ncell:D27:vtc:n%:0.03:3%:b::1:1:1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E27:b::1:1:1\ncell:F27:vtf:n:0.0492130348038129:sheet10!E18/INCOME!D23:b::1:1:1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:C28:b:1:::\ncell:D28:b:1:::\ncell:E28:b:1:::\ncell:F28:b:1:::\ncell:G28:b:1:::\ncol:A:w:20\ncol:B:w:21\ncol:C:w:122\ncol:D:w:106\ncol:E:w:123\ncol:F:w:100\ncol:G:w:25\ncol:H:w:80\nsheet:c:8:r:28:needsrecalc:yes:font:3\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* * Arial\nfont:2:* * arial,helvetica,sans-serif\nfont:3:* 12pt *\nfont:4:normal bold * arial,helvetica,sans-serif\nfont:5:normal bold 12pt arial,helvetica,sans-serif\nfont:6:normal bold 20pt Arial\nfont:7:normal normal * Arial\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:6px * 6px *;vertical-align:*;\nlayout:3:padding:6px * 6px *;vertical-align:middle;\nlayout:4:padding:6px 4px 6px 12px;vertical-align:*;\nlayout:5:padding:6px 8px 6px *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:#,##0%\nvalueformat:3:hidden\n", - }, - name: "compare", - hidden: "0", - }, - sheet8: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B3:t:Goals:l:2:f:4:c:1:bg:4:cf:2:colspan:3\ncell:G3:t:Date:l:1:f:5:cf:1\ncell:H3:vtf:ndt:41131.96186930555:NOW():l:1:f:5:bg:3:cf:3:ntvf:3\ncell:C5:f:3:colspan:4\ncell:B6:b:2:2:2:2:f:1:c:4:bg:2\ncell:C6:t:Goal:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1:colspan:3\ncell:D6:b:2:2:2:2:f:1:c:4:bg:2\ncell:E6:t:Goal:b:2:2:2:2:f:1:c:4:bg:2\ncell:F6:t:Amount:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:G6:t:Term (Months):b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:H6:t:Monthly:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:I6:t:Weekly:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:J6:t:How to achieve:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1:colspan:2\ncell:A7:b::1::\ncell:B7:vtc:n:1:1.:b::1:::l:2:cf:1:rowspan:4\ncell:C7:t:Pay off credit card debt:b::1:::l:4:f:1:cf:2:colspan:3:rowspan:4\ncell:F7:v:1000:b::1::1:f:1:ntvf:1\ncell:G7:v:12:b::1::1:f:1:ntvf:1\ncell:H7:vtf:n:83.33333333333333:IF(G7=0,"",F7/G7):b::1::1:f:1:ntvf:1\ncell:I7:vtf:n:19.17808219178082:IF(G7>0,F7*7*12/(G7*365),""):b::1::1:f:1:ntvf:1\ncell:J7:t:cutback on eating out:b::1:::f:1:colspan:2\ncell:L7:b::::1\ncell:A8:b::1::\ncell:B8:b::1::\ncell:C8:b::1::1:f:1:colspan:3\ncell:F8:b::1::1\ncell:G8:b::1::1\ncell:H8:b::1::1\ncell:I8:b::1::1\ncell:J8:b::1::1:f:1:colspan:2\ncell:L8:b::::1\ncell:A9:b::1::\ncell:B9:b::1::\ncell:C9:b::1::1:f:1:colspan:3\ncell:F9:b::1::1\ncell:G9:b::1::1\ncell:H9:b::1::1\ncell:I9:b::1::1\ncell:J9:b::1::1:f:1:colspan:2\ncell:L9:b::::1\ncell:A10:b::1::\ncell:B10:b::1::\ncell:C10:f:1:colspan:3\ncell:F10:b::1::1\ncell:G10:b::1::1\ncell:H10:b::1::1\ncell:I10:b::1::1\ncell:J10:b::1:1:1:f:1:colspan:2\ncell:L10:b::::1\ncell:A11:b::1::\ncell:B11:v:2:b:1:1:::l:2:cf:1:rowspan:4\ncell:C11:t:Save for a down:b:1:1:::l:4:f:1:colspan:3:rowspan:4\ncell:D11:b:1:::\ncell:E11:b:1:::\ncell:F11:v:20000:b:1:1::1:f:1:ntvf:1\ncell:G11:v:36:b:1:1::1:f:1:ntvf:1\ncell:H11:vtf:n:555.5555555555555:IF(G11>0,F11/G11,""):b:1:1::1:f:1:ntvf:1\ncell:I11:vtf:n:127.85388127853881:IF(G11>0,F11*7*12/(G11*365),""):b:1:1::1:f:1:ntvf:1\ncell:J11:b:1:1:::f:1:colspan:2\ncell:L11:b::::1\ncell:A12:b::1::\ncell:B12:b::1::\ncell:C12:t:payment:b::1::1:l:4:f:1:colspan:3\ncell:F12:b::1::1\ncell:G12:b::1::1\ncell:H12:b::1::1\ncell:I12:b::1::1\ncell:J12:b::1::1:f:1:colspan:2\ncell:L12:b::::1\ncell:A13:b::1::\ncell:B13:b::1::\ncell:C13:b::1::1:l:4:f:1:colspan:3\ncell:F13:b::1::1\ncell:G13:b::1::1\ncell:H13:b::1::1\ncell:I13:b::1::1\ncell:J13:b::1::1:f:1:colspan:2\ncell:L13:b::::1\ncell:A14:b::1::\ncell:B14:b::1::\ncell:C14:l:4:f:1:colspan:3\ncell:F14:b::1::1\ncell:G14:b::1::1\ncell:H14:b::1::1\ncell:I14:b::1::1\ncell:J14:b::1:1:1:f:1:colspan:2\ncell:L14:b::::1\ncell:A15:b::1::\ncell:B15:v:3:b:1:1:::l:2:cf:1:rowspan:4\ncell:C15:t:Date:b:1:1:::l:4:f:1:colspan:3:rowspan:4\ncell:D15:b:1:::\ncell:E15:b:1:::\ncell:F15:b:1:1::1:f:1:ntvf:1\ncell:G15:b:1:1::1:f:1:ntvf:1\ncell:H15:vtf:t::IF(G15>0,F15/G15,""):b:1:1::1:f:1:ntvf:1\ncell:I15:vtf:t::IF(G15>0,F15*7*12/(G15*365),""):b:1:1::1:f:1:ntvf:1\ncell:J15:b:1:1:::f:1:colspan:2\ncell:L15:b::::1\ncell:A16:b::1::\ncell:B16:b::1::\ncell:C16:b::1::1:l:4:f:1:colspan:3\ncell:F16:b::1::1\ncell:G16:b::1::1\ncell:H16:b::1::1\ncell:I16:b::1::1\ncell:J16:b::1::1:f:1:colspan:2\ncell:L16:b::::1\ncell:A17:b::1::\ncell:B17:b::1::\ncell:C17:b::1::1:l:4:f:1:colspan:3\ncell:F17:b::1::1\ncell:G17:b::1::1\ncell:H17:b::1::1\ncell:I17:b::1::1\ncell:J17:b::1::1:f:1:colspan:2\ncell:L17:b::::1\ncell:A18:b::1::\ncell:B18:b::1::\ncell:C18:l:4:f:1:colspan:3\ncell:F18:b::1::1\ncell:G18:b::1::1\ncell:H18:b::1::1\ncell:I18:b::1::1\ncell:J18:b::1:1:1:f:1:colspan:2\ncell:L18:b::::1\ncell:A19:b::1::\ncell:B19:v:4:b:1:1:::l:2:cf:1:rowspan:4\ncell:C19:b:1:1:::l:4:colspan:3:rowspan:4\ncell:D19:b:1:::\ncell:E19:b:1:::\ncell:F19:b:1:1::1:f:1:ntvf:1\ncell:G19:b:1:1::1:f:1:ntvf:1\ncell:H19:vtf:t::IF(G19>0,F19/G19,""):b:1:1::1:f:1:ntvf:1\ncell:I19:vtf:t::IF(G19>0,F19*7*12/(G19*365),""):b:1:1::1:f:1:ntvf:1\ncell:J19:b:1:1:::f:1:colspan:2\ncell:L19:b::::1\ncell:A20:b::1::\ncell:B20:b::1::\ncell:C20:b::1::1:l:3:colspan:3\ncell:F20:b::1::1\ncell:G20:b::1::1\ncell:H20:b::1::1\ncell:I20:b::1::1\ncell:J20:b::1::1:f:1:colspan:2\ncell:L20:b::::1\ncell:A21:b::1::\ncell:B21:b::1::\ncell:C21:b::1::1:l:3:colspan:3\ncell:F21:b::1::1\ncell:G21:b::1::1\ncell:H21:b::1::1\ncell:I21:b::1::1\ncell:J21:b::1::1:f:1:colspan:2\ncell:L21:b::::1\ncell:A22:b::1::\ncell:B22:b::1::\ncell:C22:l:3:f:1:colspan:3\ncell:F22:b::1::1\ncell:G22:b::1::1\ncell:H22:b::1::1\ncell:I22:b::1::1\ncell:J22:b::1:1:1:f:1:colspan:2\ncell:L22:b::::1\ncell:A23:b::1::\ncell:B23:v:5:b:1:1:::l:2:cf:1:rowspan:4\ncell:C23:b:1:1:1:1:l:4:colspan:3:rowspan:4\ncell:D23:b:1:::\ncell:E23:b:1:::\ncell:F23:b:1:1::1:f:1:ntvf:1\ncell:G23:b:1:1::1:f:1:ntvf:1\ncell:H23:vtf:t::IF(G23>0,F23/G23,""):b:1:1::1:f:1:ntvf:1\ncell:I23:vtf:t::IF(G23>0,F23*7*12/(G23*365),""):b:1:1::1:f:1:ntvf:1\ncell:J23:b:1:1:::f:1:colspan:2\ncell:L23:b::::1\ncell:A24:b::1::\ncell:B24:b::1::\ncell:C24:b::1::1:l:4:colspan:3\ncell:F24:b::1::1\ncell:G24:b::1::1\ncell:H24:b::1::1\ncell:I24:b::1::1\ncell:J24:b::1::1:f:1:colspan:2\ncell:L24:b::::1\ncell:A25:b::1::\ncell:B25:b::1::\ncell:C25:b::1::1:l:4:colspan:3\ncell:F25:b::1::1\ncell:G25:b::1::1\ncell:H25:b::1::1\ncell:I25:b::1::1\ncell:J25:b::1::1:f:1:colspan:2\ncell:L25:b::::1\ncell:A26:b::1::\ncell:B26:b::1::\ncell:C26:l:4:f:1:colspan:3\ncell:F26:b::1:1:1\ncell:G26:b::1:1:1\ncell:H26:b::1:1:1\ncell:I26:b::1:1:1\ncell:J26:b::1:1:1:f:1:colspan:2\ncell:L26:b::::1\ncell:A27:b::1::\ncell:B27:v:6:b:1:1::1:l:2:cf:1:rowspan:4\ncell:C27:b:1:1:1:1:l:4:f:1:colspan:3:rowspan:4\ncell:D27:b:1:1::1\ncell:E27:b:1:1::1\ncell:F27:b:1:1::1\ncell:G27:b:1:1::1\ncell:H27:vtf:t::IF(G27>0,F27/G27,""):b:1:1::1\ncell:I27:vtf:t::IF(G27>0,F27*7*12/(G27*365),""):b:1:1::1\ncell:J27:b::1::1:colspan:2\ncell:K27:b:1:::\ncell:A28:b::1::\ncell:B28:b::1::1\ncell:C28:b::1::1:l:4:f:1:colspan:3\ncell:D28:b::1::1\ncell:E28:b::1::1\ncell:F28:b::1::1\ncell:G28:b::1::1\ncell:H28:b::1::1\ncell:I28:b::1::1\ncell:J28:b::1::1:colspan:2\ncell:A29:b::1::\ncell:B29:b::1::1\ncell:C29:b::1::1:l:4:f:1:colspan:3\ncell:D29:b::1::1\ncell:E29:b::1::1\ncell:F29:b::1::1\ncell:G29:b::1::1\ncell:H29:b::1::1\ncell:I29:b::1::1\ncell:J29:b::1::1:colspan:2\ncell:A30:b::1::\ncell:B30:b::1:1:1\ncell:C30:b::1:1:1:l:4:f:1:colspan:3\ncell:D30:b::1:1:1\ncell:E30:b::1:1:1\ncell:F30:b::1:1:1\ncell:G30:b::1:1:1\ncell:H30:b::1:1:1\ncell:I30:b::1:1:1\ncell:J30:b::1:1:1:colspan:2\ncell:A31:b::1::\ncell:B31:v:7:b:1:1::1:l:2:cf:1:rowspan:4\ncell:C31:b:1:1:1:1:l:4:colspan:3:rowspan:4\ncell:D31:b:1:1:1:1\ncell:E31:b:1:1:1:1\ncell:F31:b:1:1::1\ncell:G31:b:1:1::1\ncell:H31:vtf:t::IF(G31>0,F31/G31,""):b:1:1::1\ncell:I31:vtf:t::IF(G31>0,F31*7*12/(G31*365),""):b:1:1::1\ncell:J31:b:1:1::1:colspan:2\ncell:K31:b:1:1:1:1\ncell:L31:b::::1\ncell:A32:b::1::\ncell:B32:b::1::1\ncell:C32:b:1:1:1:1\ncell:D32:b:1:1:1:1\ncell:E32:b:1:1:1:1\ncell:F32:b::1::1\ncell:G32:b::1::1\ncell:H32:b::1::1\ncell:I32:b::1::1\ncell:J32:b::1::1:colspan:2\ncell:K32:b:1:1:1:1\ncell:L32:b::::1\ncell:A33:b::1::\ncell:B33:b::1::1\ncell:C33:b:1:1:1:1\ncell:D33:b:1:1:1:1\ncell:E33:b:1:1:1:1\ncell:F33:b::1::1\ncell:G33:b::1::1\ncell:H33:b::1::1\ncell:I33:b::1::1\ncell:J33:b::1::1:colspan:2\ncell:K33:b:1:1:1:1\ncell:L33:b::::1\ncell:A34:b::1::\ncell:B34:b::1:1:1\ncell:C34:b:1:1:1:1\ncell:D34:b:1:1:1:1\ncell:E34:b:1:1:1:1\ncell:F34:b::1:1:1\ncell:G34:b::1:1:1\ncell:H34:b::1:1:1\ncell:I34:b::1:1:1\ncell:J34:b::1:1:1:colspan:2\ncell:K34:b:1:1:1:1\ncell:L34:b::::1\ncell:B35:b:1:::\ncell:C35:b:1:::\ncell:D35:b:1:::\ncell:E35:b:1:::\ncell:F35:b:1:::\ncell:G35:b:1:::\ncell:H35:b:1:::\ncell:I35:b:1:::\ncell:J35:b:1:::\ncell:K35:b:1:::\ncol:A:w:31\ncol:B:w:25\ncol:C:w:80\ncol:D:w:44\ncol:E:w:53\ncol:F:w:70\ncol:G:w:68\ncol:H:w:65\ncol:I:w:65\ncol:J:w:80\ncol:K:w:96\nsheet:c:12:r:35:needsrecalc:yes:font:2\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* * arial,helvetica,sans-serif\nfont:2:* 12pt *\nfont:3:normal bold * arial,helvetica,sans-serif\nfont:4:normal bold 20pt Arial\nfont:5:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:4:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\n', - }, - name: "goals", - hidden: "0", - }, - sheet9: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B3:t:Check Book Register:l:5:f:3:c:4:bg:2:cf:1:colspan:7\ncell:G3:t:Date:l:1:f:5:cf:1\ncell:H3:vtf:ndt:41131.961799432866:NOW():l:1:f:5:bg:3:cf:3:ntvf:3\ncell:A4:f:1\ncell:B4:l:2:f:4:c:1:bg:4:cf:2\ncell:C4:f:4\ncell:D4:f:4\ncell:E4:f:4\ncell:F4:f:4\ncell:G4:l:1:f:4:cf:1\ncell:H4:l:1:f:4:cf:3:ntvf:3\ncell:I4:f:1\ncell:B5:f:4\ncell:C5:f:4\ncell:D5:f:4\ncell:E5:f:4\ncell:F5:f:4\ncell:G5:f:4\ncell:H5:f:4\ncell:B6:t:Date:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:C6:t:Num:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:D6:t:Description:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:E6:t:R:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:F6:t:Withdrawal, Payment (-):b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:G6:t:Deposit, Credit (+):b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:H6:t:Balance:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:A7:b::1::\ncell:B7:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C7:b::1::1:l:4:f:1\ncell:D7:b::1::1:l:3:f:6\ncell:E7:b::1::1:l:3:f:6\ncell:F7:b::1::1:l:3:f:1:ntvf:1\ncell:G7:b::1::1:l:3:f:1:ntvf:1\ncell:H7:vtf:t: :IF(AND(ISBLANK(G7), ISBLANK(F7)), " ", G7-F7):b::1::1:l:3:f:1:ntvf:1\ncell:I7:b::::1\ncell:A8:b::1::\ncell:B8:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C8:b::1::1:l:4:f:1:bg:3\ncell:D8:b::1::1:l:3:f:6:bg:3\ncell:E8:b::1::1:l:3:f:6:bg:3\ncell:F8:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G8:b::1::1:l:3:f:1:bg:3\ncell:H8:vtf:t: :IF(AND(ISBLANK(G8), ISBLANK(F8)), " ", H7+G8-F8):b::1::1:l:3:f:1:bg:3\ncell:I8:b::::1\ncell:A9:b::1::\ncell:B9:b::1::1:l:4:f:1:ntvf:3\ncell:C9:b::1::1:l:4:f:1\ncell:D9:b::1::1:l:3:f:6\ncell:E9:b::1::1:l:3:f:6\ncell:F9:b::1::1:l:3:f:1:ntvf:1\ncell:G9:b::1::1:l:3:f:1\ncell:H9:vtf:t: :IF(AND(ISBLANK(G9), ISBLANK(F9)), " ", H8+G9-F9):b::1::1:l:3:f:1\ncell:I9:b::::1\ncell:A10:b::1::\ncell:B10:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C10:b::1::1:l:4:f:1:bg:3\ncell:D10:b::1::1:l:3:f:6:bg:3\ncell:E10:b::1::1:l:3:f:6:bg:3\ncell:F10:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G10:b::1::1:l:3:f:1:bg:3\ncell:H10:vtf:t: :IF(AND(ISBLANK(G10), ISBLANK(F10)), " ", H9+G10-F10):b::1::1:l:3:f:1:bg:3\ncell:I10:b::::1\ncell:A11:b::1::\ncell:B11:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C11:b::1::1:l:4:f:1\ncell:D11:b::1::1:l:3:f:6\ncell:E11:b::1::1:l:3:f:6\ncell:F11:b::1::1:l:3:f:1:ntvf:1\ncell:G11:b::1::1:l:3:f:1:ntvf:1\ncell:H11:vtf:t: :IF(AND(ISBLANK(G11), ISBLANK(F11)), " ", H10+G11-F11):b::1::1:l:3:f:1:ntvf:1\ncell:I11:b::::1\ncell:A12:b::1::\ncell:B12:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C12:b::1::1:l:4:f:1:bg:3\ncell:D12:b::1::1:l:3:f:6:bg:3\ncell:E12:b::1::1:l:3:f:6:bg:3\ncell:F12:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G12:b::1::1:l:3:f:1:bg:3\ncell:H12:vtf:t: :IF(AND(ISBLANK(G12), ISBLANK(F12)), " ", H11+G12-F12):b::1::1:l:3:f:1:bg:3\ncell:I12:b::::1\ncell:A13:b::1::\ncell:B13:b::1::1:l:4:f:1:ntvf:3\ncell:C13:b::1::1:l:4:f:1\ncell:D13:b::1::1:l:3:f:6\ncell:E13:b::1::1:l:3:f:6\ncell:F13:b::1::1:l:3:f:1:ntvf:1\ncell:G13:b::1::1:l:3:f:1\ncell:H13:vtf:t: :IF(AND(ISBLANK(G13), ISBLANK(F13)), " ", H12+G13-F13):b::1::1:l:3:f:1\ncell:I13:b::::1\ncell:A14:b::1::\ncell:B14:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C14:b::1::1:l:4:f:1:bg:3\ncell:D14:b::1::1:l:3:f:6:bg:3\ncell:E14:b::1::1:l:3:f:6:bg:3\ncell:F14:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G14:b::1::1:l:3:f:1:bg:3\ncell:H14:vtf:t: :IF(AND(ISBLANK(G14), ISBLANK(F14)), " ", H13+G14-F14):b::1::1:l:3:f:1:bg:3\ncell:I14:b::::1\ncell:A15:b::1::\ncell:B15:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C15:b::1::1:l:4:f:1\ncell:D15:b::1::1:l:3:f:6\ncell:E15:b::1::1:l:3:f:6\ncell:F15:b::1::1:l:3:f:1:ntvf:1\ncell:G15:b::1::1:l:3:f:1:ntvf:1\ncell:H15:vtf:t: :IF(AND(ISBLANK(G15), ISBLANK(F15)), " ", H14+G15-F15):b::1::1:l:3:f:1:ntvf:1\ncell:I15:b::::1\ncell:A16:b::1::\ncell:B16:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C16:b::1::1:l:4:f:1:bg:3\ncell:D16:b::1::1:l:3:f:6:bg:3\ncell:E16:b::1::1:l:3:f:6:bg:3\ncell:F16:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G16:b::1::1:l:3:f:1:bg:3\ncell:H16:vtf:t: :IF(AND(ISBLANK(G16), ISBLANK(F16)), " ", H15+G16-F16):b::1::1:l:3:f:1:bg:3\ncell:I16:b::::1\ncell:A17:b::1::\ncell:B17:b::1::1:l:4:f:1:ntvf:3\ncell:C17:b::1::1:l:4:f:1\ncell:D17:b::1::1:l:3:f:6\ncell:E17:b::1::1:l:3:f:6\ncell:F17:b::1::1:l:3:f:1:ntvf:1\ncell:G17:b::1::1:l:3:f:1\ncell:H17:vtf:t: :IF(AND(ISBLANK(G17), ISBLANK(F17)), " ", H16+G17-F17):b::1::1:l:3:f:1\ncell:I17:b::::1\ncell:A18:b::1::\ncell:B18:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C18:b::1::1:l:4:f:1:bg:3\ncell:D18:b::1::1:l:3:f:6:bg:3\ncell:E18:b::1::1:l:3:f:6:bg:3\ncell:F18:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G18:b::1::1:l:3:f:1:bg:3\ncell:H18:vtf:t: :IF(AND(ISBLANK(G18), ISBLANK(F18)), " ", H17+G18-F18):b::1::1:l:3:f:1:bg:3\ncell:I18:b::::1\ncell:A19:b::1::\ncell:B19:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C19:b::1::1:l:4:f:1\ncell:D19:b::1::1:l:3:f:6\ncell:E19:b::1::1:l:3:f:6\ncell:F19:b::1::1:l:3:f:1:ntvf:1\ncell:G19:b::1::1:l:3:f:1:ntvf:1\ncell:H19:vtf:t: :IF(AND(ISBLANK(G19), ISBLANK(F19)), " ", H18+G19-F19):b::1::1:l:3:f:1:ntvf:1\ncell:I19:b::::1\ncell:A20:b::1::\ncell:B20:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C20:b::1::1:l:4:f:2:bg:3\ncell:D20:b::1::1:l:3:f:6:bg:3\ncell:E20:b::1::1:l:3:f:6:bg:3\ncell:F20:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G20:b::1::1:l:3:f:1:bg:3\ncell:H20:vtf:t: :IF(AND(ISBLANK(G20), ISBLANK(F20)), " ", H19+G20-F20):b::1::1:l:3:f:1:bg:3\ncell:I20:b::::1\ncell:A21:b::1::\ncell:B21:b::1::1:l:4:f:1:ntvf:3\ncell:C21:b::1::1:l:4:f:1\ncell:D21:b::1::1:l:3:f:6\ncell:E21:b::1::1:l:3:f:6\ncell:F21:b::1::1:l:3:f:1:ntvf:1\ncell:G21:b::1::1:l:3:f:1\ncell:H21:vtf:t: :IF(AND(ISBLANK(G21), ISBLANK(F21)), " ", H20+G21-F21):b::1::1:l:3:f:1\ncell:I21:b::::1\ncell:A22:b::1::\ncell:B22:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C22:b::1::1:l:4:f:1:bg:3\ncell:D22:b::1::1:l:3:f:6:bg:3\ncell:E22:b::1::1:l:3:f:6:bg:3\ncell:F22:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G22:b::1::1:l:3:f:1:bg:3\ncell:H22:vtf:t: :IF(AND(ISBLANK(G22), ISBLANK(F22)), " ", H21+G22-F22):b::1::1:l:3:f:1:bg:3\ncell:I22:b::::1\ncell:A23:b::1::\ncell:B23:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C23:b::1::1:l:4:f:1\ncell:D23:b::1::1:l:3:f:6\ncell:E23:b::1::1:l:3:f:6\ncell:F23:b::1::1:l:3:f:1:ntvf:1\ncell:G23:b::1::1:l:3:f:1:ntvf:1\ncell:H23:vtf:t: :IF(AND(ISBLANK(G23), ISBLANK(F23)), " ", H22+G23-F23):b::1::1:l:3:f:1:ntvf:1\ncell:I23:b::::1\ncell:A24:b::1::\ncell:B24:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C24:b::1::1:l:4:f:1:bg:3\ncell:D24:b::1::1:l:3:f:6:bg:3\ncell:E24:b::1::1:l:3:f:6:bg:3\ncell:F24:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G24:b::1::1:l:3:f:1:bg:3\ncell:H24:vtf:t: :IF(AND(ISBLANK(G24), ISBLANK(F24)), " ", H23+G24-F24):b::1::1:l:3:f:1:bg:3\ncell:I24:b::::1\ncell:A25:b::1::\ncell:B25:b::1::1:l:4:f:1:ntvf:3\ncell:C25:b::1::1:l:4:f:1\ncell:D25:b::1::1:l:3:f:6\ncell:E25:b::1::1:l:3:f:6\ncell:F25:b::1::1:l:3:f:1:ntvf:1\ncell:G25:b::1::1:l:3:f:1\ncell:H25:vtf:t: :IF(AND(ISBLANK(G25), ISBLANK(F25)), " ", H24+G25-F25):b::1::1:l:3:f:1\ncell:I25:b::::1\ncell:A26:b::1::\ncell:B26:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C26:b::1::1:l:4:f:1:bg:3\ncell:D26:b::1::1:l:3:f:6:bg:3\ncell:E26:b::1::1:l:3:f:6:bg:3\ncell:F26:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G26:b::1::1:l:3:f:1:bg:3\ncell:H26:vtf:t: :IF(AND(ISBLANK(G26), ISBLANK(F26)), " ", H25+G26-F26):b::1::1:l:3:f:1:bg:3\ncell:I26:b::::1\ncell:A27:b::1::\ncell:B27:b::1::1:l:4:f:1:ntvf:3\ncell:C27:b::1::1:l:4:f:1\ncell:D27:b::1::1:l:3:f:6\ncell:E27:b::1::1:l:3:f:6\ncell:F27:b::1::1:l:3:f:1:ntvf:1\ncell:G27:b::1::1:l:3:f:1\ncell:H27:vtf:t: :IF(AND(ISBLANK(G27), ISBLANK(F27)), " ", H26+G27-F27):b::1::1:l:3:f:1\ncell:A28:b::1::\ncell:B28:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C28:b::1::1:l:4:f:1:bg:3\ncell:D28:b::1::1:l:3:f:6:bg:3\ncell:E28:b::1::1:l:3:f:6:bg:3\ncell:F28:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G28:b::1::1:l:3:f:1:bg:3\ncell:H28:vtf:t: :IF(AND(ISBLANK(G28), ISBLANK(F28)), " ", H27+G28-F28):b::1::1:l:3:f:1:bg:3\ncell:A29:b::1::\ncell:B29:b::1::1:l:4:f:1:ntvf:3\ncell:C29:b::1::1:l:4:f:1\ncell:D29:b::1::1:l:4:f:6\ncell:E29:b::1::1:l:4:f:1\ncell:F29:b::1::1:l:3:f:1:ntvf:1\ncell:G29:b::1::1:l:4:f:1:ntvf:1\ncell:H29:vtf:t: :IF(AND(ISBLANK(G29), ISBLANK(F29)), " ", H28+G29-F29):b::1::1:l:3:f:1\ncell:A30:b::1::\ncell:B30:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C30:b::1::1:l:4:f:1:bg:3\ncell:D30:b::1::1:l:4:f:6:bg:3\ncell:E30:b::1::1:l:4:f:1:bg:3\ncell:F30:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G30:b::1::1:l:4:f:1:bg:3:ntvf:1\ncell:H30:vtf:t: :IF(AND(ISBLANK(G30), ISBLANK(F30)), " ", H29+G30-F30):b::1::1:l:3:f:1:bg:3\ncell:A31:b::1::\ncell:B31:b::1:1:1:l:4:f:1:ntvf:3\ncell:C31:b::1:1:1:l:4:f:1\ncell:D31:b::1:1:1:l:4:f:6\ncell:E31:b::1:1:1:l:4:f:1\ncell:F31:b::1:1:1:l:3:f:1:ntvf:1\ncell:G31:b::1:1:1:l:4:f:1:ntvf:1\ncell:H31:vtf:t: :IF(AND(ISBLANK(G31), ISBLANK(F31)), " ", H30+G31-F31):b::1:1:1:l:3:f:1\ncol:A:w:31\ncol:B:w:74\ncol:C:w:72\ncol:D:w:168\ncol:E:w:43\ncol:F:w:100\ncol:G:w:100\ncol:H:w:103\nsheet:c:9:r:31:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:* 12pt arial,helvetica,sans-serif\nfont:3:* 14pt arial,helvetica,sans-serif\nfont:4:* x-small arial,helvetica,sans-serif\nfont:5:normal normal 12pt Arial\nfont:6:normal normal 12pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:4:padding:4px 8px 4px 12px;vertical-align:*;\nlayout:5:padding:6px * 6px *;vertical-align:*;\nlayout:6:padding:6px * 6px *;vertical-align:bottom;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\n', - }, - name: "sheet6", - hidden: "0", - }, - sheet10: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:4\ncell:E3:t:Budget:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F3:v:18750:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:G3:v:13125:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:H3:v:2500:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:I3:vtf:n:34375:sum(F3\\cH3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:E4:t:% Spent:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F4:vtf:n:0.21333333333333335:IF(F3=0,"-",F31/F3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:G4:vtf:n:0.6857142857142857:IF(G3=0,"-",G31/G3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:H4:vtf:n:0.8:IF(H3=0,"-",H31/H3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:I4:vtf:n:0.43636363636363634:IF(I3=0,"-",I31/I3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:E5:t:Remaining:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F5:vtf:n:14750:F3-F31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:G5:vtf:n:4125:G3-G31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:H5:vtf:n:500:H3-H31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:I5:vtf:n:19375:I3-I31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:E6:vtc:::\ncell:F6:vtc:::\ncell:G6:vtc:::\ncell:H6:vtc:::\ncell:I6:vtc:::\ncell:C7:t:Date:l:2:f:3:c:4:bg:1:cf:1\ncell:D7:t:Payment Types:l:2:f:3:c:4:bg:1:cf:1\ncell:E7:t:Description:l:2:f:3:c:4:bg:1:cf:1\ncell:F7:t:Category 1:l:2:f:3:c:4:bg:1:cf:1\ncell:G7:t:Category 2:l:2:f:3:c:4:bg:1:cf:1\ncell:H7:t:Category 3:l:2:f:3:c:4:bg:1:cf:1\ncell:I7:t:Subtotal:l:2:f:3:c:4:bg:1:cf:1\ncell:B8:b::1::\ncell:C8:v:39814:b::1::1:l:1:f:2:ntvf:5\ncell:D8:t:CrCard:b::1::1:l:1:f:2\ncell:E8:t:Walmart:b::1::1:l:1:f:2\ncell:F8:v:4000:b::1::1:l:1:f:2:ntvf:1\ncell:G8:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H8:v:2000:b::1::1:l:1:f:2:ntvf:1\ncell:I8:vtf:n:6000:SUM(F8\\cH8):b::1::1:l:1:f:2:ntvf:2\ncell:B9:b::1::\ncell:C9:v:39823:b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D9:t:Db Card:b::1::1:l:1:f:2:bg:2\ncell:E9:t:ABC Services, Inc.:b::1::1:l:1:f:2:bg:2\ncell:F9:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G9:v:9000:b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H9:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I9:vtf:n:9000:SUM(F9\\cH9):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B10:b::1::\ncell:C10:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D10:vtc::::b::1::1:l:1:f:2\ncell:E10:vtc::::b::1::1:l:1:f:2\ncell:F10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I10:vtf:n:0:SUM(F10\\cH10):b::1::1:l:1:f:2:ntvf:2\ncell:B11:b::1::\ncell:C11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D11:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E11:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I11:vtf:n:0:SUM(F11\\cH11):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B12:b::1::\ncell:C12:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D12:vtc::::b::1::1:l:1:f:2\ncell:E12:vtc::::b::1::1:l:1:f:2\ncell:F12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I12:vtf:n:0:SUM(F12\\cH12):b::1::1:l:1:f:2:ntvf:2\ncell:B13:b::1::\ncell:C13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D13:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E13:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I13:vtf:n:0:SUM(F13\\cH13):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B14:b::1::\ncell:C14:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D14:vtc::::b::1::1:l:1:f:2\ncell:E14:vtc::::b::1::1:l:1:f:2\ncell:F14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I14:vtf:n:0:SUM(F14\\cH14):b::1::1:l:1:f:2:ntvf:2\ncell:B15:b::1::\ncell:C15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D15:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E15:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I15:vtf:n:0:SUM(F15\\cH15):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B16:b::1::\ncell:C16:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D16:vtc::::b::1::1:l:1:f:2\ncell:E16:vtc::::b::1::1:l:1:f:2\ncell:F16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I16:vtf:n:0:SUM(F16\\cH16):b::1::1:l:1:f:2:ntvf:2\ncell:B17:b::1::\ncell:C17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D17:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E17:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I17:vtf:n:0:SUM(F17\\cH17):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B18:b::1::\ncell:C18:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D18:vtc::::b::1::1:l:1:f:2\ncell:E18:vtc::::b::1::1:l:1:f:2\ncell:F18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I18:vtf:n:0:SUM(F18\\cH18):b::1::1:l:1:f:2:ntvf:2\ncell:B19:b::1::\ncell:C19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D19:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E19:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I19:vtf:n:0:SUM(F19\\cH19):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B20:b::1::\ncell:C20:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D20:vtc::::b::1::1:l:1:f:2\ncell:E20:vtc::::b::1::1:l:1:f:2\ncell:F20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I20:vtf:n:0:SUM(F20\\cH20):b::1::1:l:1:f:2:ntvf:2\ncell:B21:b::1::\ncell:C21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D21:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E21:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I21:vtf:n:0:SUM(F21\\cH21):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B22:b::1::\ncell:C22:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D22:vtc::::b::1::1:l:1:f:2\ncell:E22:vtc::::b::1::1:l:1:f:2\ncell:F22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I22:vtf:n:0:SUM(F22\\cH22):b::1::1:l:1:f:2:ntvf:2\ncell:B23:b::1::\ncell:C23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D23:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E23:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I23:vtf:n:0:SUM(F23\\cH23):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B24:b::1::\ncell:C24:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D24:vtc::::b::1::1:l:1:f:2\ncell:E24:vtc::::b::1::1:l:1:f:2\ncell:F24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I24:vtf:n:0:SUM(F24\\cH24):b::1::1:l:1:f:2:ntvf:2\ncell:B25:b::1::\ncell:C25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D25:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E25:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I25:vtf:n:0:SUM(F25\\cH25):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B26:b::1::\ncell:C26:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D26:vtc::::b::1::1:l:1:f:2\ncell:E26:vtc::::b::1::1:l:1:f:2\ncell:F26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I26:vtf:n:0:SUM(F26\\cH26):b::1::1:l:1:f:2:ntvf:2\ncell:B27:b::1::\ncell:C27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D27:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E27:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I27:vtf:n:0:SUM(F27\\cH27):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B28:b::1::\ncell:C28:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D28:vtc::::b::1::1:l:1:f:2\ncell:E28:vtc::::b::1::1:l:1:f:2\ncell:F28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I28:vtf:n:0:SUM(F28\\cH28):b::1::1:l:1:f:2:ntvf:2\ncell:B29:b::1::\ncell:C29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D29:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E29:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I29:vtf:n:0:SUM(F29\\cH29):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B30:b::1::\ncell:C30:vtc::::b::1:1:1:l:1:f:2:ntvf:5\ncell:D30:vtc::::b::1:1:1:l:1:f:2\ncell:E30:vtc::::b::1:1:1:l:1:f:2\ncell:F30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:G30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:H30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:I30:vtf:n:0:SUM(F30\\cH30):b::1:1:1:l:1:f:2:ntvf:2\ncell:E31:t:Expense Total:b:2:2:2:2:l:1:f:2:c:4:bg:1:cf:1\ncell:F31:vtf:n:4000:SUM(F8\\cF30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:G31:vtf:n:9000:SUM(G8\\cG30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:H31:vtf:n:2000:SUM(H8\\cH30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:I31:vtf:n:15000:SUM(F31\\cH31):b:2:2:2:2:l:1:f:2:c:3:bg:1:ntvf:2\ncol:A:w:10\ncol:B:w:10\ncol:C:w:70\ncol:D:w:71\ncol:E:w:147\ncol:F:w:82\ncol:G:w:81\ncol:H:w:82\ncol:I:w:100\ncol:J:w:80\ncol:K:w:96\nsheet:c:11:r:31:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(238, 238, 238)\ncolor:4:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal normal * arial,helvetica,sans-serif\nfont:3:normal normal 12pt arial,helvetica,sans-serif\nlayout:1:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00;\\b-#,##0.00;\\b-\nvalueformat:3:0.00%\nvalueformat:4:hidden\nvalueformat:5:m/d/yy\n', - }, - name: "sheet7", - hidden: "0", - }, - sheet11: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:ntvf:1\ncol:A:w:31\ncol:B:w:25\ncol:C:w:80\ncol:D:w:44\ncol:E:w:53\ncol:F:w:70\ncol:G:w:68\ncol:H:w:65\ncol:I:w:65\ncol:J:w:80\ncol:K:w:96\nsheet:c:11:r:1:needsrecalc:yes:font:1\nfont:1:* 12pt *\nvalueformat:1:hidden\n", - }, - name: "sheet8", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "income!D8": true, - "income!E5": true, - "income!D9": true, - "sheet11!D2": true, - "income!D10": true, - "income!D11": true, - "goals!H3": true, - "income!D12": true, - "sheet9!E18": true, - "income!D13": true, - "sheet9!D2": true, - "sheet10!D2": true, - "income!D14": true, - "income!D15": true, - "income!D16": true, - "income!D17": true, - "income!D18": true, - "income!D19": true, - "income!D20": true, - "income!D21": true, - "income!C8": true, - "income!C9": true, - "income!C10": true, - "income!C11": true, - "income!C12": true, - "income!C13": true, - "income!C14": true, - "income!C15": true, - "income!C16": true, - "income!C17": true, - "income!C18": true, - "income!C19": true, - "income!C20": true, - "income!C21": true, - "income!C22": true, - "income!C23": true, - "income!H18": true, - "income!H17": true, - "income!H16": true, - "income!H15": true, - "income!H14": true, - "income!H13": true, - "income!K18": true, - "income!H19": true, - "income!K17": true, - "income!K16": true, - "income!K15": true, - "income!K14": true, - "expense!B4": true, - "income!K13": true, - "expense!E4": true, - "expense!F4": true, - "expense!E6": true, - "expense!F6": true, - "expense!B7": true, - "expense!C8": true, - "expense!D9": true, - "expense!D10": true, - "expense!D11": true, - "expense!D12": true, - "expense!D13": true, - "expense!E8": true, - "expense!E9": true, - "expense!E10": true, - "expense!E11": true, - "expense!E12": true, - "expense!E13": true, - "expense!C14": true, - "expense!D20": true, - "expense!D19": true, - "expense!D18": true, - "expense!D17": true, - "expense!D16": true, - "expense!D15": true, - "expense!E20": true, - "expense!E19": true, - "expense!E18": true, - "expense!E17": true, - "expense!E16": true, - "expense!E15": true, - "expense!C21": true, - "expense!C24": true, - "expense!D24": true, - "expense!D23": true, - "expense!D25": true, - "expense!D26": true, - "expense!D27": true, - "expense!D28": true, - "expense!D29": true, - "expense!D30": true, - "expense!D31": true, - "expense!E25": true, - "expense!E26": true, - "expense!E27": true, - "expense!E28": true, - "expense!E29": true, - "expense!E30": true, - "expense!E31": true, - "sheet9!B12": true, - "sheet9!B17": true, - "sheet9!B26": true, - "sheet9!C5": true, - "sheet9!C9": true, - "sheet9!B4": true, - "sheet9!D6": true, - "sheet9!D7": true, - "sheet9!D8": true, - "sheet9!D11": true, - "sheet9!D10": true, - "sheet9!E6": true, - "sheet9!E7": true, - "sheet9!E8": true, - "sheet9!E11": true, - "sheet9!E10": true, - "sheet9!D13": true, - "sheet9!D14": true, - "sheet9!D15": true, - "sheet9!D16": true, - "sheet9!E13": true, - "sheet9!E14": true, - "sheet9!E15": true, - "sheet9!E16": true, - "sheet9!D18": true, - "sheet9!D19": true, - "sheet9!D20": true, - "sheet9!D21": true, - "sheet9!D22": true, - "sheet9!D23": true, - "sheet9!D24": true, - "sheet9!D25": true, - "sheet9!E19": true, - "sheet9!E20": true, - "sheet9!E21": true, - "sheet9!E22": true, - "sheet9!E23": true, - "sheet9!E24": true, - "sheet9!E25": true, - "sheet9!D26": true, - "sheet9!D27": true, - "sheet9!D28": true, - "sheet9!D29": true, - "sheet9!D30": true, - "sheet9!D31": true, - "sheet9!E26": true, - "sheet9!E27": true, - "sheet9!E28": true, - "sheet9!E29": true, - "sheet9!E30": true, - "sheet9!E31": true, - "sheet10!B4": true, - "sheet10!B13": true, - "sheet10!B18": true, - "sheet10!B25": true, - "sheet10!B22": true, - "sheet10!D5": true, - "sheet10!D12": true, - "sheet10!D11": true, - "sheet10!D9": true, - "sheet10!D8": true, - "sheet10!D7": true, - "sheet10!D6": true, - "sheet10!E5": true, - "sheet10!E12": true, - "sheet10!E11": true, - "sheet10!E9": true, - "sheet10!E8": true, - "sheet10!E7": true, - "sheet10!E6": true, - "sheet10!D17": true, - "sheet10!D16": true, - "sheet10!D15": true, - "sheet10!D14": true, - "sheet10!E17": true, - "sheet10!E16": true, - "sheet10!E15": true, - "sheet10!E14": true, - "sheet10!D21": true, - "sheet10!D20": true, - "sheet10!D19": true, - "sheet10!E21": true, - "sheet10!E20": true, - "sheet10!E19": true, - "sheet10!D24": true, - "sheet10!D23": true, - "sheet10!E24": true, - "sheet10!E23": true, - "sheet10!D30": true, - "sheet10!D29": true, - "sheet10!D28": true, - "sheet10!D27": true, - "sheet10!D26": true, - "sheet10!E30": true, - "sheet10!E29": true, - "sheet10!E28": true, - "sheet10!E27": true, - "sheet10!E26": true, - "sheet11!B4": true, - "sheet11!B12": true, - "sheet11!B18": true, - "sheet11!B26": true, - "sheet11!D5": true, - "sheet11!D11": true, - "sheet11!D9": true, - "sheet11!D8": true, - "sheet11!D7": true, - "sheet11!D6": true, - "sheet11!D10": true, - "sheet11!E5": true, - "sheet11!E11": true, - "sheet11!E9": true, - "sheet11!E8": true, - "sheet11!E7": true, - "sheet11!E6": true, - "sheet11!E10": true, - "sheet11!D17": true, - "sheet11!D16": true, - "sheet11!D15": true, - "sheet11!D14": true, - "sheet11!D13": true, - "sheet11!E17": true, - "sheet11!E16": true, - "sheet11!E15": true, - "sheet11!E14": true, - "sheet11!E13": true, - "sheet11!D24": true, - "sheet11!D25": true, - "sheet11!D23": true, - "sheet11!D22": true, - "sheet11!D21": true, - "sheet11!D20": true, - "sheet11!D19": true, - "sheet11!E24": true, - "sheet11!E25": true, - "sheet11!E23": true, - "sheet11!E22": true, - "sheet11!E21": true, - "sheet11!E20": true, - "sheet11!E19": true, - "sheet11!D29": true, - "sheet11!D28": true, - "sheet11!D27": true, - "sheet11!E29": true, - "sheet11!E28": true, - "sheet11!E27": true, - "goals!C7": true, - "goals!C8": true, - "goals!C9": true, - "goals!C10": true, - "goals!C11": true, - "goals!C12": true, - "goals!C13": true, - "goals!C14": true, - "goals!C15": true, - "goals!C16": true, - "goals!C17": true, - "goals!C18": true, - "goals!C19": true, - "goals!C20": true, - "goals!C21": true, - "goals!C22": true, - "goals!C23": true, - "goals!C24": true, - "goals!C25": true, - "goals!C26": true, - "goals!J7": true, - "goals!J8": true, - "goals!J9": true, - "goals!J10": true, - "goals!J11": true, - "goals!J12": true, - "goals!J13": true, - "goals!J14": true, - "goals!J15": true, - "goals!J16": true, - "goals!J17": true, - "goals!J18": true, - "goals!J19": true, - "goals!J20": true, - "goals!J21": true, - "goals!J22": true, - "goals!J23": true, - "goals!J24": true, - "goals!J25": true, - "goals!J26": true, - "goals!F7": true, - "goals!F11": true, - "goals!F15": true, - "goals!F19": true, - "goals!F23": true, - "goals!G7": true, - "goals!G11": true, - "goals!G15": true, - "goals!G19": true, - "goals!G23": true, - "goals!C27": true, - "goals!C28": true, - "goals!C29": true, - "goals!C30": true, - "goals!H28": true, - "goals!H29": true, - "goals!H30": true, - "goals!G27": true, - "compare!D10": true, - "compare!D11": true, - "compare!D12": true, - "compare!D13": true, - "compare!D27": true, - "compare!D26": true, - "compare!D25": true, - "compare!D24": true, - "compare!D23": true, - "compare!D22": true, - "compare!D21": true, - "compare!D20": true, - "goals!F31": true, - "goals!C31": true, - "goals!J31": true, - "goals!J32": true, - "goals!G31": true, - "goals!J33": true, - "goals!J27": true, - "goals!J34": true, - "goals!J28": true, - "goals!J29": true, - "goals!J30": true, - "sheet6!C3": true, - "sheet6!B6": true, - "sheet6!C6": true, - "sheet6!D6": true, - "sheet6!E6": true, - "sheet6!F6": true, - "sheet6!G6": true, - "sheet6!H6": true, - "sheet6!C31": true, - "sheet6!C30": true, - "sheet6!C29": true, - "sheet6!C28": true, - "sheet6!C27": true, - "sheet6!C26": true, - "sheet6!C25": true, - "sheet6!C24": true, - "sheet6!C23": true, - "sheet6!C22": true, - "sheet6!C21": true, - "sheet6!C20": true, - "sheet6!C19": true, - "sheet6!C18": true, - "sheet6!C17": true, - "sheet6!C16": true, - "sheet6!C15": true, - "sheet6!C14": true, - "sheet6!C13": true, - "sheet6!C12": true, - "sheet6!C11": true, - "sheet6!C10": true, - "sheet6!C9": true, - "sheet6!B7": true, - "sheet7!F3": true, - "sheet7!G3": true, - "sheet7!H3": true, - "sheet7!D7": true, - "sheet7!E3": true, - "sheet7!E4": true, - "sheet7!E5": true, - "sheet7!I7": true, - "sheet7!H7": true, - "sheet7!G7": true, - "sheet7!F7": true, - "sheet7!E7": true, - "sheet7!C7": true, - "sheet7!C28": true, - "sheet7!C27": true, - "sheet7!C26": true, - "sheet7!C25": true, - "sheet7!C24": true, - "sheet7!C23": true, - "sheet7!C22": true, - "sheet7!C21": true, - "sheet7!C20": true, - "sheet7!C19": true, - "sheet7!C18": true, - "sheet7!C17": true, - "sheet7!C16": true, - "sheet7!C15": true, - "sheet7!C14": true, - "sheet7!C13": true, - "sheet7!C12": true, - "sheet7!C11": true, - "sheet7!C29": true, - "sheet7!C30": true, - "sheet7!C10": true, - "sheet7!C9": true, - "sheet7!C8": true, - "sheet7!D28": true, - "sheet7!D27": true, - "sheet7!D26": true, - "sheet7!D25": true, - "sheet7!D24": true, - "sheet7!D23": true, - "sheet7!D22": true, - "sheet7!D21": true, - "sheet7!D20": true, - "sheet7!D19": true, - "sheet7!D18": true, - "sheet7!D17": true, - "sheet7!D16": true, - "sheet7!D15": true, - "sheet7!D14": true, - "sheet7!D13": true, - "sheet7!D12": true, - "sheet7!D11": true, - "sheet7!D29": true, - "sheet7!D30": true, - "sheet7!D10": true, - "sheet7!D9": true, - "sheet7!D8": true, - "sheet7!F28": true, - "sheet7!F27": true, - "sheet7!F26": true, - "sheet7!F25": true, - "sheet7!F24": true, - "sheet7!F23": true, - "sheet7!F22": true, - "sheet7!F21": true, - "sheet7!F20": true, - "sheet7!F19": true, - "sheet7!F18": true, - "sheet7!F17": true, - "sheet7!F16": true, - "sheet7!F15": true, - "sheet7!F14": true, - "sheet7!F13": true, - "sheet7!F12": true, - "sheet7!F11": true, - "sheet7!F29": true, - "sheet7!F30": true, - "sheet7!F10": true, - "sheet7!F9": true, - "sheet7!F8": true, - "sheet7!G28": true, - "sheet7!G27": true, - "sheet7!G26": true, - "sheet7!G25": true, - "sheet7!G24": true, - "sheet7!G23": true, - "sheet7!G22": true, - "sheet7!G21": true, - "sheet7!G20": true, - "sheet7!G19": true, - "sheet7!G18": true, - "sheet7!G17": true, - "sheet7!G16": true, - "sheet7!G15": true, - "sheet7!G14": true, - "sheet7!G13": true, - "sheet7!G12": true, - "sheet7!G11": true, - "sheet7!G29": true, - "sheet7!G30": true, - "sheet7!G31": true, - "sheet7!G32": true, - "sheet7!G33": true, - "sheet7!G34": true, - "sheet7!G35": true, - "sheet7!G36": true, - "sheet7!G37": true, - "sheet7!G38": true, - "sheet7!G39": true, - "sheet7!G10": true, - "sheet7!G9": true, - "sheet7!G8": true, - "sheet7!E28": true, - "sheet7!E27": true, - "sheet7!E26": true, - "sheet7!E25": true, - "sheet7!E24": true, - "sheet7!E23": true, - "sheet7!E22": true, - "sheet7!E21": true, - "sheet7!E20": true, - "sheet7!E19": true, - "sheet7!E18": true, - "sheet7!E17": true, - "sheet7!E16": true, - "sheet7!E15": true, - "sheet7!E14": true, - "sheet7!E13": true, - "sheet7!E12": true, - "sheet7!E11": true, - "sheet7!E29": true, - "sheet7!E30": true, - "sheet7!E10": true, - "sheet7!E9": true, - "sheet7!E8": true, - "sheet7!H28": true, - "sheet7!H27": true, - "sheet7!H26": true, - "sheet7!H25": true, - "sheet7!H24": true, - "sheet7!H23": true, - "sheet7!H22": true, - "sheet7!H21": true, - "sheet7!H20": true, - "sheet7!H19": true, - "sheet7!H18": true, - "sheet7!H17": true, - "sheet7!H16": true, - "sheet7!H15": true, - "sheet7!H14": true, - "sheet7!H13": true, - "sheet7!H12": true, - "sheet7!H11": true, - "sheet7!H29": true, - "sheet7!H30": true, - "sheet7!H10": true, - "sheet7!H9": true, - "sheet7!E31": true, - "sheet7!H8": true, - "sheet6!C8": true, - "sheet6!D31": true, - "sheet6!D30": true, - "sheet6!D29": true, - "sheet6!D28": true, - "sheet6!D27": true, - "sheet6!D26": true, - "sheet6!D25": true, - "sheet6!D24": true, - "sheet6!D23": true, - "sheet6!D22": true, - "sheet6!D21": true, - "sheet6!D20": true, - "sheet6!D19": true, - "sheet6!D18": true, - "sheet6!D17": true, - "sheet6!D16": true, - "sheet6!D15": true, - "sheet6!D14": true, - "sheet6!D13": true, - "sheet6!D12": true, - "sheet6!D11": true, - "sheet6!D10": true, - "sheet6!D9": true, - "sheet6!D8": true, - "sheet6!F31": true, - "sheet6!F30": true, - "sheet6!F29": true, - "sheet6!F28": true, - "sheet6!F27": true, - "sheet6!F26": true, - "sheet6!F25": true, - "sheet6!F24": true, - "sheet6!F23": true, - "sheet6!F22": true, - "sheet6!F21": true, - "sheet6!F20": true, - "sheet6!F19": true, - "sheet6!F18": true, - "sheet6!F17": true, - "sheet6!F16": true, - "sheet6!F15": true, - "sheet6!F14": true, - "sheet6!F13": true, - "sheet6!F12": true, - "sheet6!F11": true, - "sheet6!F10": true, - "sheet6!F9": true, - "sheet6!F8": true, - "sheet6!G31": true, - "sheet6!G30": true, - "sheet6!G29": true, - "sheet6!G28": true, - "sheet6!G27": true, - "sheet6!G26": true, - "sheet6!G25": true, - "sheet6!G24": true, - "sheet6!G23": true, - "sheet6!G22": true, - "sheet6!G21": true, - "sheet6!G20": true, - "sheet6!G19": true, - "sheet6!G18": true, - "sheet6!G17": true, - "sheet6!G16": true, - "sheet6!G15": true, - "sheet6!G14": true, - "sheet6!G13": true, - "sheet6!G12": true, - "sheet6!G11": true, - "sheet6!G10": true, - "sheet6!G9": true, - "sheet6!G8": true, - "sheet6!B31": true, - "sheet6!B30": true, - "sheet6!B29": true, - "sheet6!B28": true, - "sheet6!B27": true, - "sheet6!B26": true, - "sheet6!B25": true, - "sheet6!B24": true, - "sheet6!B23": true, - "sheet6!B22": true, - "sheet6!B21": true, - "sheet6!B20": true, - "sheet6!B19": true, - "sheet6!B18": true, - "sheet6!B17": true, - "sheet6!B16": true, - "sheet6!B15": true, - "sheet6!B14": true, - "sheet6!B13": true, - "sheet6!B12": true, - "sheet6!B11": true, - "sheet6!B10": true, - "sheet6!B9": true, - "sheet6!B8": true, - "sheet6!C7": true, - "sheet6!D7": true, - "sheet6!E7": true, - "sheet6!F7": true, - "sheet6!G7": true, - "sheet6!E31": true, - "sheet6!E30": true, - "sheet6!E29": true, - "sheet6!E28": true, - "sheet6!E27": true, - "sheet6!E26": true, - "sheet6!E25": true, - "sheet6!E24": true, - "sheet6!E23": true, - "sheet6!E22": true, - "sheet6!E21": true, - "sheet6!E20": true, - "sheet6!E19": true, - "sheet6!E18": true, - "sheet6!E17": true, - "sheet6!E16": true, - "sheet6!E15": true, - "sheet6!E14": true, - "sheet6!E13": true, - "sheet6!E12": true, - "sheet6!E11": true, - "sheet6!E10": true, - "sheet6!E9": true, - "sheet6!E8": true, - "compare!B4": true, - "compare!C9": true, - "compare!D9": true, - "compare!E9": true, - "compare!F9": true, - "compare!C10": true, - "compare!C11": true, - "compare!C12": true, - "compare!C13": true, - "compare!F19": true, - "compare!C19": true, - "compare!C27": true, - "compare!C26": true, - "compare!C25": true, - "compare!C24": true, - "compare!C23": true, - "compare!C22": true, - "compare!C21": true, - "compare!C20": true, - "summary!G18": true, - "summary!O32": true, - }, - constraints: {}, - }, - }, - footers: [ - { name: "Type1", index: 1, isActive: true }, - { name: "Type2", index: 2, isActive: false }, - { name: "Type3", index: 3, isActive: false }, - { name: "Detail1", index: 4, isActive: false }, - { name: "Detail2", index: 5, isActive: false }, - ], - }, - Android: { - msc: { - numsheets: 11, - currentid: "sheet1", - currentname: "summary", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B2:t:Summary:l:1:f:4:c:1:bg:6:cf:2:colspan:4\ncell:B4:l:1:f:3:c:1:bg:6:cf:2\ncell:G4:t:
    \\n\\n\\n:tvf:3:colspan:3:rowspan:5\ncell:C5:t:Monthly Budget:l:4:f:5:c:6:bg:3:cf:1:colspan:2\ncell:D5:bg:5\ncell:B6:b::1::\ncell:C6:t:Total Income:b::1:1:1:l:3:f:6:cf:2\ncell:D6:vtf:n:37112:INCOME!D23:b::1:1:1:l:2:f:1:ntvf:1\ncell:B7:b::1::\ncell:C7:t:Total Expenses:b:::1:1:l:3:f:6:bg:5:cf:2\ncell:D7:vtf:n:4853:SHEET11!E30:b::1:1:1:l:2:f:1:bg:5:ntvf:1\ncell:C8:t:Savings:b:1::1:1:l:3:f:6:cf:2\ncell:D8:vtf:n:32259:D6-D7:b:1:1:1:1:l:2:f:1:ntvf:1\ncell:B10:t::l:1:f:3:c:1:bg:6:cf:2\ncell:G10:t:
    \\n\\n\\n:tvf:3:colspan:3:rowspan:5\ncell:C11:t:Yearly Budget:l:4:f:5:c:6:bg:2:cf:1:colspan:2\ncell:B12:b::1::\ncell:C12:t:Total Income:b::1:1:1:l:3:f:6:cf:2\ncell:D12:vtf:n:445344:INCOME!E23:b::1:1:1:l:3:f:1:ntvf:1\ncell:C13:t:Total Expenses:b:::1:1:l:3:f:6:bg:5:cf:2\ncell:D13:vtf:n:58236:SHEET11!F30:b::1:1:1:l:3:f:1:bg:5:ntvf:1\ncell:C14:t:Savings:b:1::1:1:l:3:f:6:cf:2\ncell:D14:vtf:n:387108:D12-D13:b:1:1:1:1:l:3:f:1:ntvf:1\ncell:B16:l:1:f:3:c:1:bg:6:cf:1\ncell:B17:bg:6\ncell:C17:t:Monthly Spending:l:4:f:5:c:6:bg:4:cf:1:colspan:2\ncell:D17:b::1:::bg:6\ncell:B18:b::1::\ncell:C18:t:Housing:b::1::1:l:3:f:6:cf:2\ncell:D18:vtf:n:1380:EXPENSE!E7:b::1::1:l:3:f:1:ntvf:1\ncell:G18:t:
    \\n\\n\\n:tvf:3:colspan:4:rowspan:11\ncell:B19:b::1::\ncell:C19:t:Food:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D19:vtf:n:511:sheet9!E4:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B20:b::1::\ncell:C20:t:Clothes:b::1::1:l:3:f:6:cf:2\ncell:D20:vtf:n:191:sheet9!E12:b::1::1:l:3:f:1:ntvf:1\ncell:B21:b::1::\ncell:C21:t:Transportation:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D21:vtf:n:640:sheet9!E17:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B22:b::1::\ncell:C22:t:Healthcare:b::1::1:l:3:f:6:cf:2\ncell:D22:vtf:n:263:sheet9!E26:b::1::1:l:3:f:1:ntvf:1\ncell:B23:b::1::\ncell:C23:t:Entertainment:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D23:vtf:n:209:sheet10!E4:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B24:b::1::\ncell:C24:t:Education:b::1::1:l:3:f:6:cf:2\ncell:D24:vtf:n:98:sheet10!E13:b::1::1:l:3:f:1:ntvf:1\ncell:B25:b::1::\ncell:C25:t:Contributions:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D25:vtf:n:222:sheet10!E18:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B26:b::1::\ncell:C26:t:Debt:b::1::1:l:3:f:6:cf:2\ncell:D26:vtf:n:0:sheet10!E22:b::1::1:l:3:f:1:ntvf:1\ncell:B27:b::1::\ncell:C27:t:Insurance:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D27:vtf:n:30:sheet10!E25:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B28:b::1::\ncell:C28:t:Credit Card :b::1::1:l:3:f:6:cf:2\ncell:D28:vtf:n:209:sheet11!E4:b::1::1:l:3:f:1:ntvf:1\ncell:B29:b::1::\ncell:C29:t:Buisness:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D29:vtf:n:780:sheet11!E12:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B30:b::1::\ncell:C30:t:Vacation:b::1::1:l:3:f:6:cf:2\ncell:D30:vtf:n:98:sheet11!E18:b::1::1:l:3:f:1:ntvf:1\ncell:E30:b::::1\ncell:B31:b::1::\ncell:C31:t:Miscellaneous:b::1:1:1:l:3:f:6:bg:5:cf:2\ncell:D31:vtf:n:222:sheet11!E26:b::1:1:1:l:3:f:1:bg:5:ntvf:1\ncell:E31:b::::1\ncell:C32:b:1:::\ncell:D32:b:1:::\ncol:A:w:60\ncol:B:w:20\ncol:C:w:151\ncol:D:w:89\ncol:E:w:20\ncol:F:w:54\ncol:G:w:95\ncol:H:w:96\ncol:I:w:88\ncol:J:w:47\nsheet:c:10:r:32:font:2\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,153,204)\ncolor:3:rgb(136,204,119)\ncolor:4:rgb(204,119,153)\ncolor:5:rgb(230,230,250)\ncolor:6:rgb(255, 255, 255)\nfont:1:* * Arial\nfont:2:* 12pt *\nfont:3:normal bold 12pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold large *\nfont:6:normal normal * Arial\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:1px 8px 1px *;vertical-align:middle;\nlayout:3:padding:1px 8px 1px 6px;vertical-align:middle;\nlayout:4:padding:3px 10px 3px 10px;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:text-html\n', - }, - name: "summary", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:8:cf:2:ntvf:2\ncell:B1:l:1:f:8:cf:2\ncell:C1:l:1:f:8:cf:2\ncell:D1:l:1:f:8:cf:2\ncell:E1:l:1:f:8:cf:2\ncell:F1:l:1:f:8:cf:2\ncell:G1:l:1:f:8:cf:2\ncell:H1:l:1:f:8:cf:2\ncell:I1:l:1:f:8:cf:2\ncell:J1:l:1:f:8:cf:2\ncell:K1:l:1:f:8:cf:2\ncell:L1:l:1:f:8:cf:2\ncell:M1:l:1:f:8:cf:2\ncell:N1:l:1:f:8:cf:2\ncell:O1:l:1:f:8:cf:2\ncell:P1:l:1:f:8:cf:2\ncell:Q1:l:1:f:8:cf:2\ncell:R1:l:1:f:8:cf:2\ncell:S1:l:1:f:8:cf:2\ncell:A2:l:1:f:8:cf:2\ncell:B2:l:1:f:8:cf:2\ncell:C2:l:1:f:8:cf:2\ncell:D2:l:1:f:8:cf:2\ncell:E2:l:1:f:8:cf:2\ncell:F2:l:1:f:8:cf:2\ncell:G2:l:1:f:8:cf:2\ncell:H2:l:1:f:8:cf:2\ncell:I2:l:1:f:8:cf:2\ncell:J2:l:1:f:8:cf:2\ncell:K2:l:1:f:8:cf:2\ncell:L2:l:1:f:8:cf:2\ncell:M2:l:1:f:8:cf:2\ncell:N2:l:1:f:8:cf:2\ncell:O2:l:1:f:8:cf:2\ncell:P2:l:1:f:8:cf:2\ncell:Q2:l:1:f:8:cf:2\ncell:R2:l:1:f:8:cf:2\ncell:S2:l:1:f:8:cf:2\ncell:A3:l:1:f:8:cf:2\ncell:B3:l:1:f:8:cf:2\ncell:C3:l:1:f:8:cf:2\ncell:D3:l:1:f:8:cf:2\ncell:E3:l:1:f:8:cf:2\ncell:F3:l:1:f:8:cf:2\ncell:G3:l:1:f:8:cf:2\ncell:H3:l:1:f:8:cf:2\ncell:I3:l:1:f:8:cf:2\ncell:J3:l:1:f:8:cf:2\ncell:K3:l:1:f:8:cf:2\ncell:L3:l:1:f:8:cf:2\ncell:M3:l:1:f:8:cf:2\ncell:N3:l:1:f:8:cf:2\ncell:O3:l:1:f:8:cf:2\ncell:P3:l:1:f:8:cf:2\ncell:Q3:l:1:f:8:cf:2\ncell:R3:l:1:f:8:cf:2\ncell:S3:l:1:f:8:cf:2\ncell:A4:l:1:f:8:cf:2\ncell:B4:l:1:f:8:cf:2\ncell:C4:l:1:f:8:cf:2\ncell:F4:l:1:f:8:cf:2\ncell:G4:l:1:f:8:cf:2\ncell:H4:l:1:f:8:cf:2\ncell:I4:l:1:f:8:cf:2\ncell:J4:l:1:f:8:cf:2\ncell:K4:l:1:f:8:cf:2\ncell:L4:l:1:f:8:cf:2\ncell:M4:t: :l:1:f:8:cf:2\ncell:N4:l:1:f:8:cf:2\ncell:O4:l:1:f:8:cf:2\ncell:P4:l:1:f:8:cf:2\ncell:Q4:l:1:f:8:cf:2\ncell:R4:l:1:f:8:cf:2\ncell:S4:l:1:f:8:cf:2\ncell:A5:l:1:f:8:cf:2\ncell:B5:t::l:2:f:5:cf:2\ncell:C5:t:Income:l:2:f:4:c:1:bg:7:cf:2\ncell:D5:t:Date:l:1:f:9:cf:2\ncell:E5:vtf:ndt:45465.92746829861:NOW():l:1:f:9:bg:6:cf:3:ntvf:3\ncell:F5:l:1:f:8:cf:2\ncell:G5:l:1:f:8:cf:2\ncell:H5:l:1:f:8:cf:2\ncell:I5:l:1:f:8:cf:2\ncell:J5:l:1:f:8:cf:2\ncell:K5:l:1:f:8:cf:2\ncell:L5:l:1:f:8:cf:2\ncell:M5:l:1:f:8:cf:2\ncell:N5:l:1:f:8:cf:2\ncell:O5:l:1:f:8:cf:2\ncell:P5:l:1:f:8:cf:2\ncell:Q5:l:1:f:8:cf:2\ncell:R5:l:1:f:8:cf:2\ncell:S5:l:1:f:8:cf:2\ncell:A6:l:1:f:8:cf:2\ncell:C6:t::l:2:f:8:cf:1\ncell:D6:l:1:f:8:cf:2\ncell:E6:l:1:f:8:cf:2\ncell:F6:l:1:f:8:cf:2\ncell:K6:t::l:2:f:3:cf:2\ncell:L6:t::l:2:f:8:cf:2\ncell:M6:t::l:2:f:8:cf:2\ncell:N6:t::l:2:f:8:cf:2\ncell:O6:l:1:f:8:cf:2\ncell:P6:l:1:f:8:cf:2\ncell:Q6:l:1:f:8:cf:2\ncell:R6:l:1:f:8:cf:2\ncell:S6:l:1:f:8:cf:2\ncell:A7:l:1:f:10:cf:2\ncell:B7:l:2:f:3:cf:2\ncell:F7:l:1:f:8:cf:2\ncell:K7:l:1:f:8:cf:2\ncell:L7:l:1:f:8:cf:2\ncell:M7:l:1:f:8:cf:2\ncell:N7:l:1:f:8:cf:2\ncell:O7:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:P7:t::l:1:f:8:cf:2\ncell:Q7:l:1:f:8:cf:2\ncell:R7:l:1:f:8:cf:2\ncell:S7:l:1:f:8:cf:2\ncell:A8:l:1:f:10:cf:2\ncell:C8:t:Source:l:2:f:2:c:7:bg:5:cf:1\ncell:D8:t:Monthly Budget:l:2:f:2:c:7:bg:4:cf:1\ncell:E8:t:Yearly Budget:l:2:f:2:c:7:bg:2:cf:1\ncell:F8:l:1:f:8:cf:2\ncell:K8:t::l:1:f:8:cf:2\ncell:L8:t::l:1:f:8:cf:2\ncell:M8:t::l:1:f:8:cf:2\ncell:N8:l:1:f:8:cf:2\ncell:O8:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:P8:t::l:1:f:8:cf:2\ncell:Q8:l:1:f:8:cf:2\ncell:R8:l:1:f:8:cf:2\ncell:S8:l:1:f:8:cf:2\ncell:B9:b::1:::l:1:f:8:cf:2\ncell:C9:t:Salary/Wages:b::1::1:l:5:f:7:cf:2\ncell:D9:v:20000:b::1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E9:vtf:n:240000:IF( (D9*12)=0,"",(D9*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F9:l:1:f:8:cf:2\ncell:K9:l:1:f:8:cf:2\ncell:L9:l:1:f:8:cf:2\ncell:M9:l:1:f:8:cf:2\ncell:N9:l:1:f:8:cf:2\ncell:O9:l:1:f:8:cf:2\ncell:P9:l:1:f:8:cf:2\ncell:Q9:l:1:f:8:cf:2\ncell:R9:l:1:f:8:cf:2\ncell:S9:l:1:f:8:cf:2\ncell:B10:b::1:::l:1:f:8:cf:2\ncell:C10:t:Contract Work:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D10:v:18012:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E10:vtf:n:216144:IF( (D10*12)=0,"",(D10*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F10:l:1:f:8:cf:2\ncell:G10:l:1:f:3:cf:3\ncell:H10:t::l:1:f:8:cf:3\ncell:I10:t::l:1:f:8:cf:3\ncell:J10:l:1:f:8:cf:2\ncell:K10:l:2:f:3:cf:2\ncell:L10:l:1:f:8:cf:2\ncell:M10:l:1:f:8:cf:2\ncell:N10:l:1:f:8:cf:2\ncell:O10:l:1:f:8:cf:2\ncell:P10:l:1:f:8:cf:2\ncell:Q10:l:1:f:8:cf:2\ncell:R10:l:1:f:8:cf:2\ncell:S10:l:1:f:8:cf:2\ncell:B11:b::1:::l:1:f:8:cf:2\ncell:C11:t:Bonuses:b::1::1:l:5:f:7:cf:2\ncell:D11:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E11:vtf:t::IF( (D11*12)=0,"",(D11*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F11:l:1:f:8:cf:2\ncell:G11:l:1:f:8:cf:2\ncell:H11:l:1:f:8:cf:2\ncell:I11:l:1:f:8:cf:2\ncell:J11:l:1:f:8:cf:2\ncell:K11:l:1:f:8:cf:2\ncell:L11:l:1:f:8:cf:2\ncell:M11:l:1:f:8:cf:2\ncell:N11:l:1:f:8:cf:2\ncell:O11:l:1:f:8:cf:2\ncell:P11:l:1:f:8:cf:2\ncell:Q11:l:1:f:8:cf:2\ncell:R11:l:1:f:8:cf:2\ncell:S11:l:1:f:8:cf:2\ncell:B12:b::1:::l:1:f:8:cf:2\ncell:C12:t:Commissions:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D12:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E12:vtf:t::IF( (D12*12)=0,"",(D12*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F12:l:1:f:8:cf:2\ncell:G12:l:1:f:8:cf:2\ncell:H12:l:1:f:8:cf:2\ncell:I12:l:1:f:8:cf:2\ncell:J12:l:1:f:8:cf:2\ncell:K12:l:1:f:8:cf:2\ncell:L12:l:1:f:8:cf:2\ncell:M12:l:1:f:8:cf:2\ncell:N12:l:1:f:8:cf:2\ncell:O12:l:1:f:8:cf:2\ncell:P12:l:1:f:8:cf:2\ncell:Q12:l:1:f:8:cf:2\ncell:R12:l:1:f:8:cf:2\ncell:S12:l:1:f:8:cf:2\ncell:B13:b::1:::l:1:f:8:cf:2\ncell:C13:t:Tips:b::1::1:l:5:f:7:cf:2\ncell:D13:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E13:vtf:t::IF( (D13*12)=0,"",(D13*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F13:l:1:f:8:cf:2\ncell:G13:l:1:f:8:cf:2\ncell:H13:t:Deductions:l:2:f:2:c:7:bg:5:cf:1:colspan:3\ncell:I13:l:1:f:8:c:7:cf:2\ncell:J13:l:1:f:8:c:7:cf:2\ncell:K13:t:Monthly Budget:l:2:f:2:c:7:bg:4:cf:1\ncell:L13:l:1:f:8:cf:2\ncell:M13:l:1:f:8:cf:2\ncell:N13:l:1:f:8:cf:2\ncell:O13:l:1:f:8:cf:2\ncell:P13:l:1:f:8:cf:2\ncell:Q13:l:1:f:8:cf:2\ncell:R13:l:1:f:8:cf:2\ncell:S13:l:1:f:8:cf:2\ncell:B14:b::1:::l:1:f:8:cf:2\ncell:C14:t:Interest Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D14:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E14:vtf:t::IF( (D14*12)=0,"",(D14*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F14:l:1:f:8:cf:2\ncell:G14:b::1:::l:1:f:8:cf:2\ncell:H14:t:Fedral Withholding Taxes:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I14:l:1:f:8:cf:2\ncell:J14:l:1:f:8:cf:2\ncell:K14:b::1::1:l:4:f:7:cf:3:ntvf:1\ncell:L14:b::::1:l:1:f:8:cf:2\ncell:M14:l:1:f:8:cf:2\ncell:N14:l:1:f:8:cf:2\ncell:O14:l:1:f:8:cf:2\ncell:P14:l:1:f:8:cf:2\ncell:Q14:l:1:f:8:cf:2\ncell:R14:l:1:f:8:cf:2\ncell:S14:l:1:f:8:cf:2\ncell:B15:b::1:::l:1:f:8:cf:2\ncell:C15:t:Investment Income:b::1::1:l:5:f:7:cf:2\ncell:D15:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E15:vtf:t::IF( (D15*12)=0,"",(D15*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F15:l:1:f:8:cf:2\ncell:G15:b::1:::l:1:f:8:cf:2\ncell:H15:t:State Withholding Taxes:b::1::1:l:5:f:7:bg:6:cf:2:colspan:3\ncell:I15:l:1:f:8:bg:6:cf:2\ncell:J15:l:1:f:8:bg:6:cf:2\ncell:K15:b::1::1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:L15:b::::1:l:1:f:8:cf:2\ncell:M15:l:1:f:8:cf:2\ncell:N15:l:1:f:8:cf:2\ncell:O15:l:1:f:8:cf:2\ncell:P15:l:1:f:8:cf:2\ncell:Q15:l:1:f:8:cf:2\ncell:R15:l:1:f:8:cf:2\ncell:S15:l:1:f:8:cf:2\ncell:B16:b::1:::l:1:f:8:cf:2\ncell:C16:t:Rental Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D16:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E16:vtf:t::IF( (D16*12)=0,"",(D16*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F16:b:1::::l:1:f:8:cf:2\ncell:G16:b:1:1:::l:1:f:8:cf:2\ncell:H16:t:Social Security:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I16:l:1:f:8:cf:2\ncell:J16:l:1:f:8:cf:2\ncell:K16:b::1::1:l:4:f:7:cf:3:ntvf:1\ncell:L16:b::::1:l:1:f:8:cf:2\ncell:M16:l:1:f:8:cf:2\ncell:N16:l:1:f:8:cf:2\ncell:O16:l:1:f:8:cf:2\ncell:P16:l:1:f:8:cf:2\ncell:Q16:l:1:f:8:cf:2\ncell:R16:l:1:f:8:cf:2\ncell:S16:l:1:f:8:cf:2\ncell:B17:b::1:::l:1:f:8:cf:2\ncell:C17:t:Pension Income:b::1::1:l:5:f:7:cf:2\ncell:D17:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E17:vtf:t::IF( (D17*12)=0,"",(D17*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F17:l:1:f:8:cf:2\ncell:G17:b::1:::l:1:f:8:cf:2\ncell:H17:t:Reteriment Account:b::1::1:l:5:f:7:bg:6:cf:2:colspan:3\ncell:I17:l:1:f:8:bg:6:cf:2\ncell:J17:l:1:f:8:bg:6:cf:2\ncell:K17:v:900:b::1::1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:L17:b::::1:l:1:f:8:cf:2\ncell:M17:l:1:f:8:cf:2\ncell:N17:l:1:f:8:cf:2\ncell:O17:l:1:f:8:cf:2\ncell:P17:l:1:f:8:cf:2\ncell:Q17:l:1:f:8:cf:2\ncell:R17:l:1:f:8:cf:2\ncell:S17:l:1:f:8:cf:2\ncell:B18:b::1:::l:1:f:8:cf:2\ncell:C18:t:Social Security Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D18:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E18:b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F18:l:1:f:8:cf:2\ncell:G18:b::1:::l:1:f:8:cf:2\ncell:H18:t:Other Deductions:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I18:b:::1::l:1:f:8:cf:2\ncell:J18:b:::1::l:1:f:8:cf:2\ncell:K18:b::1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:L18:b::::1:l:1:f:8:cf:2\ncell:M18:l:1:f:8:cf:2\ncell:N18:l:1:f:8:cf:2\ncell:O18:l:1:f:8:cf:2\ncell:P18:l:1:f:8:cf:2\ncell:Q18:l:1:f:8:cf:2\ncell:R18:l:1:f:8:cf:2\ncell:S18:l:1:f:8:cf:2\ncell:B19:b::1:::l:1:f:8:cf:2\ncell:C19:t:Alimony:b::1::1:l:5:f:7:cf:2\ncell:D19:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E19:vtf:t::IF( (D19*12)=0,"",(D19*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F19:l:1:f:8:cf:2\ncell:G19:l:1:f:8:cf:2\ncell:H19:t:Total:l:3:f:2:c:7:bg:3:cf:1:colspan:3\ncell:I19:l:1:f:8:c:7:bg:3:cf:2\ncell:J19:l:1:f:8:c:7:bg:3:cf:2\ncell:K19:vtf:n:900:SUM(K13\\cK18):l:4:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:L19:b:::1::l:1:f:8:cf:2\ncell:M19:l:1:f:8:cf:2\ncell:N19:l:1:f:8:cf:2\ncell:O19:l:1:f:8:cf:2\ncell:P19:l:1:f:8:cf:2\ncell:Q19:l:1:f:8:cf:2\ncell:R19:l:1:f:8:cf:2\ncell:S19:l:1:f:8:cf:2\ncell:B20:b::1:::l:1:f:8:cf:2\ncell:C20:t:Child Support:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D20:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E20:vtf:t::IF( (D20*12)=0,"",(D20*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F20:l:1:f:8:cf:2\ncell:G20:l:1:f:8:cf:2\ncell:H20:l:1:f:8:cf:2\ncell:I20:l:1:f:8:cf:2\ncell:J20:l:1:f:8:cf:2\ncell:K20:l:1:f:8:cf:2\ncell:L20:b:1:1:::l:1:f:8:cf:2\ncell:M20:b::::1:l:1:f:8:cf:2\ncell:N20:l:1:f:8:cf:2\ncell:O20:l:1:f:8:cf:2\ncell:P20:l:1:f:8:cf:2\ncell:Q20:l:1:f:8:cf:2\ncell:R20:l:1:f:8:cf:2\ncell:S20:l:1:f:8:cf:2\ncell:B21:b::1:::l:1:f:8:cf:2\ncell:C21:t:Other Income:b::1::1:l:5:f:7:cf:2\ncell:D21:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E21:vtf:t::IF( (D21*12)=0,"",(D21*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F21:l:1:f:8:cf:2\ncell:G21:l:1:f:8:cf:2\ncell:H21:l:1:f:8:cf:2\ncell:I21:l:1:f:8:cf:2\ncell:J21:l:3:f:2:cf:1\ncell:K21:l:1:f:8:cf:2\ncell:L21:b::1:1::l:1:f:8:cf:2\ncell:M21:b::::1:l:1:f:8:cf:2\ncell:N21:l:1:f:8:cf:2\ncell:O21:l:1:f:8:cf:2\ncell:P21:l:1:f:8:cf:2\ncell:Q21:l:1:f:8:cf:2\ncell:R21:l:1:f:8:cf:2\ncell:S21:l:1:f:8:cf:2\ncell:B22:b::1:::l:1:f:8:cf:2\ncell:C22:t:Deduction:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D22:vtf:n:900:K19:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E22:vtf:n:10800:IF( (D22*12)=0,"",(D22*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F22:b:1::::l:1:f:8:cf:2\ncell:G22:b:1::::l:1:f:8:cf:2\ncell:H22:b:1::::l:1:f:8:cf:2\ncell:I22:b:1::::l:1:f:8:cf:2\ncell:J22:b:1::::l:1:f:8:cf:2\ncell:K22:b:1::::l:1:f:8:cf:2\ncell:L22:l:1:f:8:cf:2\ncell:M22:l:1:f:8:cf:2\ncell:N22:l:1:f:8:cf:2\ncell:O22:l:1:f:8:cf:2\ncell:P22:l:1:f:8:cf:2\ncell:Q22:l:1:f:8:cf:2\ncell:R22:l:1:f:8:cf:2\ncell:S22:l:1:f:8:cf:2\ncell:B23:l:1:f:8:cf:2\ncell:C23:t:Total Take Home Income:l:3:f:2:c:7:bg:3:cf:1\ncell:D23:vtf:n:37112:(SUM(D9\\cD21)-D22):l:3:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:E23:vtf:n:445344:IF( (D23*12)=0,"",(D23*12)):l:3:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:F23:l:1:f:8:cf:2\ncell:G23:l:1:f:8:cf:2\ncell:H23:l:1:f:8:cf:2\ncell:I23:l:1:f:8:cf:2\ncell:J23:l:1:f:8:cf:2\ncell:K23:l:1:f:8:cf:2\ncell:L23:l:1:f:8:cf:2\ncell:M23:l:1:f:8:cf:2\ncell:N23:l:1:f:8:cf:2\ncell:O23:l:1:f:8:cf:2\ncell:P23:l:1:f:8:cf:2\ncell:Q23:l:1:f:8:cf:2\ncell:R23:l:1:f:8:cf:2\ncell:S23:l:1:f:8:cf:2\ncell:B24:l:1:f:8:cf:2\ncell:F24:l:1:f:8:cf:2\ncell:G24:l:1:f:8:cf:2\ncell:H24:l:1:f:8:cf:2\ncell:I24:l:1:f:8:cf:2\ncell:J24:l:1:f:8:cf:2\ncell:K24:l:1:f:8:cf:2\ncell:L24:l:1:f:8:cf:2\ncell:M24:l:1:f:8:cf:2\ncell:N24:l:1:f:8:cf:2\ncell:O24:l:1:f:8:cf:2\ncell:P24:l:1:f:8:cf:2\ncell:Q24:l:1:f:8:cf:2\ncell:R24:l:1:f:8:cf:2\ncell:S24:l:1:f:8:cf:2\ncell:A25:l:1:f:10:cf:2\ncell:B25:l:1:f:6:cf:2\ncell:C25:l:1:f:11:cf:2\ncell:D25:l:1:f:11:cf:2\ncell:E25:l:1:f:8:cf:2\ncell:F25:l:1:f:8:cf:2\ncell:G25:l:1:f:8:cf:2\ncell:H25:l:1:f:8:cf:2\ncell:I25:l:1:f:8:cf:2\ncell:J25:l:1:f:8:cf:2\ncell:K25:l:1:f:8:cf:2\ncell:L25:l:1:f:8:cf:2\ncell:M25:l:1:f:8:cf:2\ncell:N25:l:1:f:8:cf:2\ncell:O25:l:1:f:8:cf:2\ncell:P25:l:1:f:8:cf:2\ncell:Q25:l:1:f:8:cf:2\ncell:R25:l:1:f:8:cf:2\ncell:S25:l:1:f:8:cf:2\ncell:A26:l:1:f:10:cf:2\ncell:B26:l:1:f:6:cf:2\ncell:C26:l:1:f:6:cf:2\ncell:D26:l:1:f:11:cf:2\ncell:E26:l:1:f:11:cf:2\ncell:F26:l:1:f:11:cf:2\ncell:G26:l:1:f:11:cf:2\ncell:H26:l:1:f:8:cf:2\ncell:I26:l:1:f:8:cf:2\ncell:J26:l:1:f:8:cf:2\ncell:K26:l:1:f:8:cf:2\ncell:L26:l:1:f:8:cf:2\ncell:M26:l:1:f:8:cf:2\ncell:N26:l:1:f:8:cf:2\ncell:O26:l:1:f:8:cf:2\ncell:P26:l:1:f:8:cf:2\ncell:Q26:l:1:f:8:cf:2\ncell:R26:l:1:f:8:cf:2\ncell:S26:l:1:f:8:cf:2\ncell:L27:l:1:f:8:cf:2\ncell:M27:l:1:f:8:cf:2\ncell:N27:l:1:f:8:cf:2\ncell:O27:l:1:f:8:cf:2\ncell:P27:l:1:f:8:cf:2\ncell:Q27:l:1:f:8:cf:2\ncell:R27:l:1:f:8:cf:2\ncell:S27:l:1:f:8:cf:2\ncell:L28:l:1:f:8:cf:2\ncell:M28:l:1:f:8:cf:2\ncell:N28:l:1:f:8:cf:2\ncell:O28:l:1:f:8:cf:2\ncell:P28:l:1:f:8:cf:2\ncell:Q28:l:1:f:8:cf:2\ncell:R28:l:1:f:8:cf:2\ncell:S28:l:1:f:8:cf:2\ncell:L29:l:1:f:8:cf:2\ncell:M29:l:1:f:8:cf:2\ncell:N29:l:1:f:8:cf:2\ncell:O29:l:1:f:8:cf:2\ncell:P29:l:1:f:8:cf:2\ncell:Q29:l:1:f:8:cf:2\ncell:R29:l:1:f:8:cf:2\ncell:S29:l:1:f:8:cf:2\ncell:L30:l:1:f:8:cf:2\ncell:M30:l:1:f:8:cf:2\ncell:N30:l:1:f:8:cf:2\ncell:O30:l:1:f:8:cf:2\ncell:P30:l:1:f:8:cf:2\ncell:Q30:l:1:f:8:cf:2\ncell:R30:l:1:f:8:cf:2\ncell:S30:l:1:f:8:cf:2\ncell:L31:l:1:f:8:cf:2\ncell:M31:l:1:f:8:cf:2\ncell:N31:l:1:f:8:cf:2\ncell:L32:l:1:f:8:cf:2\ncell:M32:l:1:f:8:cf:2\ncell:N32:l:1:f:8:cf:2\ncell:L33:l:1:f:8:cf:2\ncell:M33:l:1:f:8:cf:2\ncell:N33:l:1:f:8:cf:2\ncell:L34:l:1:f:8:cf:2\ncell:M34:l:1:f:8:cf:2\ncell:N34:l:1:f:8:cf:2\ncell:L35:l:1:f:8:cf:2\ncell:M35:l:1:f:8:cf:2\ncell:N35:l:1:f:8:cf:2\ncell:L36:l:1:f:8:cf:2\ncell:M36:l:1:f:8:cf:2\ncell:N36:l:1:f:8:cf:2\ncell:L37:l:1:f:8:cf:2\ncell:M37:l:1:f:8:cf:2\ncell:N37:l:1:f:8:cf:2\ncell:L38:l:1:f:8:cf:2\ncell:M38:l:1:f:8:cf:2\ncell:N38:l:1:f:8:cf:2\ncell:L39:l:1:f:8:cf:2\ncell:M39:l:1:f:8:cf:2\ncell:N39:l:1:f:8:cf:2\ncell:L40:l:1:f:8:cf:2\ncell:M40:l:1:f:8:cf:2\ncell:N40:l:1:f:8:cf:2\ncell:L41:l:1:f:8:cf:2\ncell:M41:l:1:f:8:cf:2\ncell:N41:l:1:f:8:cf:2\ncell:L42:l:1:f:8:cf:2\ncell:M42:l:1:f:8:cf:2\ncell:N42:l:1:f:8:cf:2\ncell:L43:l:1:f:8:cf:2\ncell:M43:l:1:f:8:cf:2\ncell:N43:l:1:f:8:cf:2\ncell:L44:l:1:f:8:cf:2\ncell:M44:l:1:f:8:cf:2\ncell:N44:l:1:f:8:cf:2\ncell:O44:l:1:f:8:cf:2\ncell:P44:l:1:f:8:cf:2\ncell:Q44:l:1:f:8:cf:2\ncell:R44:l:1:f:8:cf:2\ncell:S44:l:1:f:8:cf:2\ncell:L45:l:1:f:8:cf:2\ncell:M45:l:1:f:8:cf:2\ncell:N45:l:1:f:8:cf:2\ncell:O45:l:1:f:8:cf:2\ncell:P45:l:1:f:8:cf:2\ncell:Q45:l:1:f:8:cf:2\ncell:R45:l:1:f:8:cf:2\ncell:S45:l:1:f:8:cf:2\ncell:L46:l:1:f:8:cf:2\ncell:M46:l:1:f:8:cf:2\ncell:N46:l:1:f:8:cf:2\ncell:O46:l:1:f:8:cf:2\ncell:P46:l:1:f:8:cf:2\ncell:Q46:l:1:f:8:cf:2\ncell:R46:l:1:f:8:cf:2\ncell:S46:l:1:f:8:cf:2\ncell:L47:l:1:f:8:cf:2\ncell:M47:l:1:f:8:cf:2\ncell:N47:l:1:f:8:cf:2\ncell:O47:l:1:f:8:cf:2\ncell:P47:l:1:f:8:cf:2\ncell:Q47:l:1:f:8:cf:2\ncell:R47:l:1:f:8:cf:2\ncell:S47:l:1:f:8:cf:2\ncell:L48:l:1:f:8:cf:2\ncell:M48:l:1:f:8:cf:2\ncell:N48:l:1:f:8:cf:2\ncell:O48:l:1:f:8:cf:2\ncell:P48:l:1:f:8:cf:2\ncell:Q48:l:1:f:8:cf:2\ncell:R48:l:1:f:8:cf:2\ncell:S48:l:1:f:8:cf:2\ncell:L49:l:1:f:8:cf:2\ncell:M49:l:1:f:8:cf:2\ncell:N49:l:1:f:8:cf:2\ncell:O49:l:1:f:8:cf:2\ncell:P49:l:1:f:8:cf:2\ncell:Q49:l:1:f:8:cf:2\ncell:R49:l:1:f:8:cf:2\ncell:S49:l:1:f:8:cf:2\ncell:L50:l:1:f:8:cf:2\ncell:M50:l:1:f:8:cf:2\ncell:N50:l:1:f:8:cf:2\ncell:O50:l:1:f:8:cf:2\ncell:P50:l:1:f:8:cf:2\ncell:Q50:l:1:f:8:cf:2\ncell:R50:l:1:f:8:cf:2\ncell:S50:l:1:f:8:cf:2\ncell:L51:l:1:f:8:cf:2\ncell:M51:l:1:f:8:cf:2\ncell:N51:l:1:f:8:cf:2\ncell:O51:l:1:f:8:cf:2\ncell:P51:l:1:f:8:cf:2\ncell:Q51:l:1:f:8:cf:2\ncell:R51:l:1:f:8:cf:2\ncell:S51:l:1:f:8:cf:2\ncell:L52:l:1:f:8:cf:2\ncell:M52:l:1:f:8:cf:2\ncell:N52:l:1:f:8:cf:2\ncell:O52:l:1:f:8:cf:2\ncell:P52:l:1:f:8:cf:2\ncell:Q52:l:1:f:8:cf:2\ncell:R52:l:1:f:8:cf:2\ncell:S52:l:1:f:8:cf:2\ncell:L53:l:1:f:8:cf:2\ncell:M53:l:1:f:8:cf:2\ncell:N53:l:1:f:8:cf:2\ncell:O53:l:1:f:8:cf:2\ncell:P53:l:1:f:8:cf:2\ncell:Q53:l:1:f:8:cf:2\ncell:R53:l:1:f:8:cf:2\ncell:S53:l:1:f:8:cf:2\ncell:L54:l:1:f:8:cf:2\ncell:M54:l:1:f:8:cf:2\ncell:N54:l:1:f:8:cf:2\ncell:O54:l:1:f:8:cf:2\ncell:P54:l:1:f:8:cf:2\ncell:Q54:l:1:f:8:cf:2\ncell:R54:l:1:f:8:cf:2\ncell:S54:l:1:f:8:cf:2\ncell:L55:l:1:f:8:cf:2\ncell:M55:l:1:f:8:cf:2\ncell:N55:l:1:f:8:cf:2\ncell:O55:l:1:f:8:cf:2\ncell:P55:l:1:f:8:cf:2\ncell:Q55:l:1:f:8:cf:2\ncell:R55:l:1:f:8:cf:2\ncell:S55:l:1:f:8:cf:2\ncell:L56:l:1:f:8:cf:2\ncell:M56:l:1:f:8:cf:2\ncell:N56:l:1:f:8:cf:2\ncell:O56:l:1:f:8:cf:2\ncell:P56:l:1:f:8:cf:2\ncell:Q56:l:1:f:8:cf:2\ncell:R56:l:1:f:8:cf:2\ncell:S56:l:1:f:8:cf:2\ncell:L57:l:1:f:8:cf:2\ncell:M57:l:1:f:8:cf:2\ncell:N57:l:1:f:8:cf:2\ncell:O57:l:1:f:8:cf:2\ncell:P57:l:1:f:8:cf:2\ncell:Q57:l:1:f:8:cf:2\ncell:R57:l:1:f:8:cf:2\ncell:S57:l:1:f:8:cf:2\ncell:L58:l:1:f:8:cf:2\ncell:M58:l:1:f:8:cf:2\ncell:N58:l:1:f:8:cf:2\ncell:O58:l:1:f:8:cf:2\ncell:P58:l:1:f:8:cf:2\ncell:Q58:l:1:f:8:cf:2\ncell:R58:l:1:f:8:cf:2\ncell:S58:l:1:f:8:cf:2\ncell:L59:l:1:f:8:cf:2\ncell:M59:l:1:f:8:cf:2\ncell:N59:l:1:f:8:cf:2\ncell:O59:l:1:f:8:cf:2\ncell:P59:l:1:f:8:cf:2\ncell:Q59:l:1:f:8:cf:2\ncell:R59:l:1:f:8:cf:2\ncell:S59:l:1:f:8:cf:2\ncell:L60:l:1:f:8:cf:2\ncell:M60:l:1:f:8:cf:2\ncell:N60:l:1:f:8:cf:2\ncell:O60:l:1:f:8:cf:2\ncell:P60:l:1:f:8:cf:2\ncell:Q60:l:1:f:8:cf:2\ncell:R60:l:1:f:8:cf:2\ncell:S60:l:1:f:8:cf:2\ncell:L61:l:1:f:8:cf:2\ncell:M61:l:1:f:8:cf:2\ncell:N61:l:1:f:8:cf:2\ncell:O61:l:1:f:8:cf:2\ncell:P61:l:1:f:8:cf:2\ncell:Q61:l:1:f:8:cf:2\ncell:R61:l:1:f:8:cf:2\ncell:S61:l:1:f:8:cf:2\ncell:L62:l:1:f:8:cf:2\ncell:M62:l:1:f:8:cf:2\ncell:N62:l:1:f:8:cf:2\ncell:O62:l:1:f:8:cf:2\ncell:P62:l:1:f:8:cf:2\ncell:Q62:l:1:f:8:cf:2\ncell:R62:l:1:f:8:cf:2\ncell:S62:l:1:f:8:cf:2\ncell:L63:l:1:f:8:cf:2\ncell:M63:l:1:f:8:cf:2\ncell:N63:l:1:f:8:cf:2\ncell:O63:l:1:f:8:cf:2\ncell:P63:l:1:f:8:cf:2\ncell:Q63:l:1:f:8:cf:2\ncell:R63:l:1:f:8:cf:2\ncell:S63:l:1:f:8:cf:2\ncell:L64:l:1:f:8:cf:2\ncell:M64:l:1:f:8:cf:2\ncell:N64:l:1:f:8:cf:2\ncell:O64:l:1:f:8:cf:2\ncell:P64:l:1:f:8:cf:2\ncell:Q64:l:1:f:8:cf:2\ncell:R64:l:1:f:8:cf:2\ncell:S64:l:1:f:8:cf:2\ncell:L65:l:1:f:8:cf:2\ncell:M65:l:1:f:8:cf:2\ncell:N65:l:1:f:8:cf:2\ncell:O65:l:1:f:8:cf:2\ncell:P65:l:1:f:8:cf:2\ncell:Q65:l:1:f:8:cf:2\ncell:R65:l:1:f:8:cf:2\ncell:S65:l:1:f:8:cf:2\ncell:L66:l:1:f:8:cf:2\ncell:M66:l:1:f:8:cf:2\ncell:N66:l:1:f:8:cf:2\ncell:O66:l:1:f:8:cf:2\ncell:P66:l:1:f:8:cf:2\ncell:Q66:l:1:f:8:cf:2\ncell:R66:l:1:f:8:cf:2\ncell:S66:l:1:f:8:cf:2\ncell:L67:l:1:f:8:cf:2\ncell:M67:l:1:f:8:cf:2\ncell:N67:l:1:f:8:cf:2\ncell:O67:l:1:f:8:cf:2\ncell:P67:l:1:f:8:cf:2\ncell:Q67:l:1:f:8:cf:2\ncell:R67:l:1:f:8:cf:2\ncell:S67:l:1:f:8:cf:2\ncell:L68:l:1:f:8:cf:2\ncell:M68:l:1:f:8:cf:2\ncell:N68:l:1:f:8:cf:2\ncell:O68:l:1:f:8:cf:2\ncell:P68:l:1:f:8:cf:2\ncell:Q68:l:1:f:8:cf:2\ncell:R68:l:1:f:8:cf:2\ncell:S68:l:1:f:8:cf:2\ncell:L69:l:1:f:8:cf:2\ncell:M69:l:1:f:8:cf:2\ncell:N69:l:1:f:8:cf:2\ncell:O69:l:1:f:8:cf:2\ncell:P69:l:1:f:8:cf:2\ncell:Q69:l:1:f:8:cf:2\ncell:R69:l:1:f:8:cf:2\ncell:S69:l:1:f:8:cf:2\ncell:L70:l:1:f:8:cf:2\ncell:M70:l:1:f:8:cf:2\ncell:N70:l:1:f:8:cf:2\ncell:O70:l:1:f:8:cf:2\ncell:P70:l:1:f:8:cf:2\ncell:Q70:l:1:f:8:cf:2\ncell:R70:l:1:f:8:cf:2\ncell:S70:l:1:f:8:cf:2\ncell:L71:l:1:f:8:cf:2\ncell:M71:l:1:f:8:cf:2\ncell:N71:l:1:f:8:cf:2\ncell:O71:l:1:f:8:cf:2\ncell:P71:l:1:f:8:cf:2\ncell:Q71:l:1:f:8:cf:2\ncell:R71:l:1:f:8:cf:2\ncell:S71:l:1:f:8:cf:2\ncell:L72:l:1:f:8:cf:2\ncell:M72:l:1:f:8:cf:2\ncell:N72:l:1:f:8:cf:2\ncell:O72:l:1:f:8:cf:2\ncell:P72:l:1:f:8:cf:2\ncell:Q72:l:1:f:8:cf:2\ncell:R72:l:1:f:8:cf:2\ncell:S72:l:1:f:8:cf:2\ncell:L73:l:1:f:8:cf:2\ncell:M73:l:1:f:8:cf:2\ncell:N73:l:1:f:8:cf:2\ncell:O73:l:1:f:8:cf:2\ncell:P73:l:1:f:8:cf:2\ncell:Q73:l:1:f:8:cf:2\ncell:R73:l:1:f:8:cf:2\ncell:S73:l:1:f:8:cf:2\ncell:L74:l:1:f:8:cf:2\ncell:M74:l:1:f:8:cf:2\ncell:N74:l:1:f:8:cf:2\ncell:O74:l:1:f:8:cf:2\ncell:P74:l:1:f:8:cf:2\ncell:Q74:l:1:f:8:cf:2\ncell:R74:l:1:f:8:cf:2\ncell:S74:l:1:f:8:cf:2\ncell:L75:l:1:f:8:cf:2\ncell:M75:l:1:f:8:cf:2\ncell:N75:l:1:f:8:cf:2\ncell:O75:l:1:f:8:cf:2\ncell:P75:l:1:f:8:cf:2\ncell:Q75:l:1:f:8:cf:2\ncell:R75:l:1:f:8:cf:2\ncell:S75:l:1:f:8:cf:2\ncell:L76:l:1:f:8:cf:2\ncell:M76:l:1:f:8:cf:2\ncell:N76:l:1:f:8:cf:2\ncell:O76:l:1:f:8:cf:2\ncell:P76:l:1:f:8:cf:2\ncell:Q76:l:1:f:8:cf:2\ncell:R76:l:1:f:8:cf:2\ncell:S76:l:1:f:8:cf:2\ncell:L77:l:1:f:8:cf:2\ncell:M77:l:1:f:8:cf:2\ncell:N77:l:1:f:8:cf:2\ncell:O77:l:1:f:8:cf:2\ncell:P77:l:1:f:8:cf:2\ncell:Q77:l:1:f:8:cf:2\ncell:R77:l:1:f:8:cf:2\ncell:S77:l:1:f:8:cf:2\ncell:L78:l:1:f:8:cf:2\ncell:M78:l:1:f:8:cf:2\ncell:N78:l:1:f:8:cf:2\ncell:O78:l:1:f:8:cf:2\ncell:P78:l:1:f:8:cf:2\ncell:Q78:l:1:f:8:cf:2\ncell:R78:l:1:f:8:cf:2\ncell:S78:l:1:f:8:cf:2\ncell:L79:l:1:f:8:cf:2\ncell:M79:l:1:f:8:cf:2\ncell:N79:l:1:f:8:cf:2\ncell:O79:l:1:f:8:cf:2\ncell:P79:l:1:f:8:cf:2\ncell:Q79:l:1:f:8:cf:2\ncell:R79:l:1:f:8:cf:2\ncell:S79:l:1:f:8:cf:2\ncell:L80:l:1:f:8:cf:2\ncell:M80:l:1:f:8:cf:2\ncell:N80:l:1:f:8:cf:2\ncell:O80:l:1:f:8:cf:2\ncell:P80:l:1:f:8:cf:2\ncell:Q80:l:1:f:8:cf:2\ncell:R80:l:1:f:8:cf:2\ncell:S80:l:1:f:8:cf:2\ncell:L81:l:1:f:8:cf:2\ncell:M81:l:1:f:8:cf:2\ncell:N81:l:1:f:8:cf:2\ncell:O81:l:1:f:8:cf:2\ncell:P81:l:1:f:8:cf:2\ncell:Q81:l:1:f:8:cf:2\ncell:R81:l:1:f:8:cf:2\ncell:S81:l:1:f:8:cf:2\ncell:L82:l:1:f:8:cf:2\ncell:M82:l:1:f:8:cf:2\ncell:N82:l:1:f:8:cf:2\ncell:O82:l:1:f:8:cf:2\ncell:P82:l:1:f:8:cf:2\ncell:Q82:l:1:f:8:cf:2\ncell:R82:l:1:f:8:cf:2\ncell:S82:l:1:f:8:cf:2\ncell:L83:l:1:f:8:cf:2\ncell:M83:l:1:f:8:cf:2\ncell:N83:l:1:f:8:cf:2\ncell:O83:l:1:f:8:cf:2\ncell:P83:l:1:f:8:cf:2\ncell:Q83:l:1:f:8:cf:2\ncell:R83:l:1:f:8:cf:2\ncell:S83:l:1:f:8:cf:2\ncell:L84:l:1:f:8:cf:2\ncell:M84:l:1:f:8:cf:2\ncell:N84:l:1:f:8:cf:2\ncell:O84:l:1:f:8:cf:2\ncell:P84:l:1:f:8:cf:2\ncell:Q84:l:1:f:8:cf:2\ncell:R84:l:1:f:8:cf:2\ncell:S84:l:1:f:8:cf:2\ncell:L85:l:1:f:8:cf:2\ncell:M85:l:1:f:8:cf:2\ncell:N85:l:1:f:8:cf:2\ncell:O85:l:1:f:8:cf:2\ncell:P85:l:1:f:8:cf:2\ncell:Q85:l:1:f:8:cf:2\ncell:R85:l:1:f:8:cf:2\ncell:S85:l:1:f:8:cf:2\ncell:L86:l:1:f:8:cf:2\ncell:M86:l:1:f:8:cf:2\ncell:N86:l:1:f:8:cf:2\ncell:O86:l:1:f:8:cf:2\ncell:P86:l:1:f:8:cf:2\ncell:Q86:l:1:f:8:cf:2\ncell:R86:l:1:f:8:cf:2\ncell:S86:l:1:f:8:cf:2\ncell:L87:l:1:f:8:cf:2\ncell:M87:l:1:f:8:cf:2\ncell:N87:l:1:f:8:cf:2\ncell:O87:l:1:f:8:cf:2\ncell:P87:l:1:f:8:cf:2\ncell:Q87:l:1:f:8:cf:2\ncell:R87:l:1:f:8:cf:2\ncell:S87:l:1:f:8:cf:2\ncell:L88:l:1:f:8:cf:2\ncell:M88:l:1:f:8:cf:2\ncell:N88:l:1:f:8:cf:2\ncell:O88:l:1:f:8:cf:2\ncell:P88:l:1:f:8:cf:2\ncell:Q88:l:1:f:8:cf:2\ncell:R88:l:1:f:8:cf:2\ncell:S88:l:1:f:8:cf:2\ncell:L89:l:1:f:8:cf:2\ncell:M89:l:1:f:8:cf:2\ncell:N89:l:1:f:8:cf:2\ncell:O89:l:1:f:8:cf:2\ncell:P89:l:1:f:8:cf:2\ncell:Q89:l:1:f:8:cf:2\ncell:R89:l:1:f:8:cf:2\ncell:S89:l:1:f:8:cf:2\ncell:L90:l:1:f:8:cf:2\ncell:M90:l:1:f:8:cf:2\ncell:N90:l:1:f:8:cf:2\ncell:O90:l:1:f:8:cf:2\ncell:P90:l:1:f:8:cf:2\ncell:Q90:l:1:f:8:cf:2\ncell:R90:l:1:f:8:cf:2\ncell:S90:l:1:f:8:cf:2\ncell:L91:l:1:f:8:cf:2\ncell:M91:l:1:f:8:cf:2\ncell:N91:l:1:f:8:cf:2\ncell:O91:l:1:f:8:cf:2\ncell:P91:l:1:f:8:cf:2\ncell:Q91:l:1:f:8:cf:2\ncell:R91:l:1:f:8:cf:2\ncell:S91:l:1:f:8:cf:2\ncell:L92:l:1:f:8:cf:2\ncell:M92:l:1:f:8:cf:2\ncell:N92:l:1:f:8:cf:2\ncell:O92:l:1:f:8:cf:2\ncell:P92:l:1:f:8:cf:2\ncell:Q92:l:1:f:8:cf:2\ncell:R92:l:1:f:8:cf:2\ncell:S92:l:1:f:8:cf:2\ncell:L93:l:1:f:8:cf:2\ncell:M93:l:1:f:8:cf:2\ncell:N93:l:1:f:8:cf:2\ncell:O93:l:1:f:8:cf:2\ncell:P93:l:1:f:8:cf:2\ncell:Q93:l:1:f:8:cf:2\ncell:R93:l:1:f:8:cf:2\ncell:S93:l:1:f:8:cf:2\ncell:L94:l:1:f:8:cf:2\ncell:M94:l:1:f:8:cf:2\ncell:N94:l:1:f:8:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:S94:l:1:f:8:cf:2\ncell:L95:l:1:f:8:cf:2\ncell:M95:l:1:f:8:cf:2\ncell:N95:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:S95:l:1:f:8:cf:2\ncell:L96:l:1:f:10:cf:2\ncell:M96:l:1:f:10:cf:2\ncell:N96:l:1:f:10:cf:2\ncell:O96:l:1:f:10:cf:2\ncell:P96:l:1:f:10:cf:2\ncell:Q96:l:1:f:10:cf:2\ncell:R96:l:1:f:10:cf:2\ncell:S96:l:1:f:10:cf:2\ncell:L97:l:1:f:10:cf:2\ncell:M97:l:1:f:10:cf:2\ncell:N97:l:1:f:10:cf:2\ncell:O97:l:1:f:10:cf:2\ncell:P97:l:1:f:10:cf:2\ncell:Q97:l:1:f:10:cf:2\ncell:R97:l:1:f:10:cf:2\ncell:S97:l:1:f:10:cf:2\ncell:L98:l:1:f:10:cf:2\ncell:M98:l:1:f:10:cf:2\ncell:N98:l:1:f:10:cf:2\ncell:O98:l:1:f:10:cf:2\ncell:P98:l:1:f:10:cf:2\ncell:Q98:l:1:f:10:cf:2\ncell:R98:l:1:f:10:cf:2\ncell:S98:l:1:f:10:cf:2\ncell:L99:l:1:f:10:cf:2\ncell:M99:l:1:f:10:cf:2\ncell:N99:l:1:f:10:cf:2\ncell:O99:l:1:f:10:cf:2\ncell:P99:l:1:f:10:cf:2\ncell:Q99:l:1:f:10:cf:2\ncell:R99:l:1:f:10:cf:2\ncell:S99:l:1:f:10:cf:2\ncell:A100:l:1:f:10:cf:2\ncell:B100:l:1:f:10:cf:2\ncell:K100:l:1:f:10:cf:2\ncell:L100:l:1:f:10:cf:2\ncell:M100:l:1:f:10:cf:2\ncell:N100:l:1:f:10:cf:2\ncell:O100:l:1:f:10:cf:2\ncell:P100:l:1:f:10:cf:2\ncell:Q100:l:1:f:10:cf:2\ncell:R100:l:1:f:10:cf:2\ncell:S100:l:1:f:10:cf:2\ncell:A101:l:1:f:10:cf:2\ncell:B101:l:1:f:10:cf:2\ncell:K101:l:1:f:10:cf:2\ncell:L101:l:1:f:10:cf:2\ncell:M101:l:1:f:10:cf:2\ncell:N101:l:1:f:10:cf:2\ncell:O101:l:1:f:10:cf:2\ncell:P101:l:1:f:10:cf:2\ncell:Q101:l:1:f:10:cf:2\ncell:R101:l:1:f:10:cf:2\ncell:S101:l:1:f:10:cf:2\ncell:A102:l:1:f:10:cf:2\ncell:B102:l:1:f:10:cf:2\ncell:K102:l:1:f:10:cf:2\ncell:L102:l:1:f:10:cf:2\ncell:M102:l:1:f:10:cf:2\ncell:N102:l:1:f:10:cf:2\ncell:O102:l:1:f:10:cf:2\ncell:P102:l:1:f:10:cf:2\ncell:Q102:l:1:f:10:cf:2\ncell:R102:l:1:f:10:cf:2\ncell:S102:l:1:f:10:cf:2\ncell:A103:l:1:f:10:cf:2\ncell:B103:l:1:f:10:cf:2\ncell:K103:l:1:f:10:cf:2\ncell:L103:l:1:f:10:cf:2\ncell:M103:l:1:f:10:cf:2\ncell:N103:l:1:f:10:cf:2\ncell:O103:l:1:f:10:cf:2\ncell:P103:l:1:f:10:cf:2\ncell:Q103:l:1:f:10:cf:2\ncell:R103:l:1:f:10:cf:2\ncell:S103:l:1:f:10:cf:2\ncell:A104:l:1:f:10:cf:2\ncell:B104:l:1:f:10:cf:2\ncell:K104:l:1:f:10:cf:2\ncell:L104:l:1:f:10:cf:2\ncell:M104:l:1:f:10:cf:2\ncell:N104:l:1:f:10:cf:2\ncell:O104:l:1:f:10:cf:2\ncell:P104:l:1:f:10:cf:2\ncell:Q104:l:1:f:10:cf:2\ncell:R104:l:1:f:10:cf:2\ncell:S104:l:1:f:10:cf:2\ncell:A105:l:1:f:10:cf:2\ncell:B105:l:1:f:10:cf:2\ncell:K105:l:1:f:10:cf:2\ncell:L105:l:1:f:10:cf:2\ncell:M105:l:1:f:10:cf:2\ncell:N105:l:1:f:10:cf:2\ncell:O105:l:1:f:10:cf:2\ncell:P105:l:1:f:10:cf:2\ncell:Q105:l:1:f:10:cf:2\ncell:R105:l:1:f:10:cf:2\ncell:S105:l:1:f:10:cf:2\ncell:A106:l:1:f:10:cf:2\ncell:B106:l:1:f:10:cf:2\ncell:K106:l:1:f:10:cf:2\ncell:L106:l:1:f:10:cf:2\ncell:M106:l:1:f:10:cf:2\ncell:N106:l:1:f:10:cf:2\ncell:O106:l:1:f:10:cf:2\ncell:P106:l:1:f:10:cf:2\ncell:Q106:l:1:f:10:cf:2\ncell:R106:l:1:f:10:cf:2\ncell:S106:l:1:f:10:cf:2\ncell:A107:l:1:f:10:cf:2\ncell:B107:l:1:f:10:cf:2\ncell:K107:l:1:f:10:cf:2\ncell:L107:l:1:f:10:cf:2\ncell:M107:l:1:f:10:cf:2\ncell:N107:l:1:f:10:cf:2\ncell:O107:l:1:f:10:cf:2\ncell:P107:l:1:f:10:cf:2\ncell:Q107:l:1:f:10:cf:2\ncell:R107:l:1:f:10:cf:2\ncell:S107:l:1:f:10:cf:2\ncell:A108:l:1:f:10:cf:2\ncell:B108:l:1:f:10:cf:2\ncell:K108:l:1:f:10:cf:2\ncell:L108:l:1:f:10:cf:2\ncell:M108:l:1:f:10:cf:2\ncell:N108:l:1:f:10:cf:2\ncell:O108:l:1:f:10:cf:2\ncell:P108:l:1:f:10:cf:2\ncell:Q108:l:1:f:10:cf:2\ncell:R108:l:1:f:10:cf:2\ncell:S108:l:1:f:10:cf:2\ncell:A109:l:1:f:10:cf:2\ncell:B109:l:1:f:10:cf:2\ncell:K109:l:1:f:10:cf:2\ncell:L109:l:1:f:10:cf:2\ncell:M109:l:1:f:10:cf:2\ncell:N109:l:1:f:10:cf:2\ncell:O109:l:1:f:10:cf:2\ncell:P109:l:1:f:10:cf:2\ncell:Q109:l:1:f:10:cf:2\ncell:R109:l:1:f:10:cf:2\ncell:S109:l:1:f:10:cf:2\ncell:A110:l:1:f:10:cf:2\ncell:B110:l:1:f:10:cf:2\ncell:K110:l:1:f:10:cf:2\ncell:L110:l:1:f:10:cf:2\ncell:M110:l:1:f:10:cf:2\ncell:N110:l:1:f:10:cf:2\ncell:O110:l:1:f:10:cf:2\ncell:P110:l:1:f:10:cf:2\ncell:Q110:l:1:f:10:cf:2\ncell:R110:l:1:f:10:cf:2\ncell:S110:l:1:f:10:cf:2\ncell:A111:l:1:f:10:cf:2\ncell:B111:l:1:f:10:cf:2\ncell:K111:l:1:f:10:cf:2\ncell:L111:l:1:f:10:cf:2\ncell:M111:l:1:f:10:cf:2\ncell:N111:l:1:f:10:cf:2\ncell:O111:l:1:f:10:cf:2\ncell:P111:l:1:f:10:cf:2\ncell:Q111:l:1:f:10:cf:2\ncell:R111:l:1:f:10:cf:2\ncell:S111:l:1:f:10:cf:2\ncol:A:w:10\ncol:B:w:10\ncol:C:w:164\ncol:D:w:90\ncol:E:w:90\ncol:F:w:10\ncol:G:w:10\ncol:H:w:50\ncol:I:w:12\ncol:J:w:95\ncol:K:w:91\ncol:L:w:11\ncol:M:w:64\ncol:N:w:64\ncol:O:w:64\ncol:P:w:64\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:V:w:64\ncol:W:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:30\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:18.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:15\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nsheet:c:23:r:111:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,204)\ncolor:3:rgb(119,136,221)\ncolor:4:rgb(136,204,119)\ncolor:5:rgb(204,119,136)\ncolor:6:rgb(230,230,250)\ncolor:7:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 24pt Arial\nfont:6:normal bold 9pt Arial\nfont:7:normal normal * Arial\nfont:8:normal normal 10pt Arial\nfont:9:normal normal 12pt Arial\nfont:10:normal normal 7pt Arial\nfont:11:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:6px * 6px *;vertical-align:bottom;\nlayout:4:padding:6px * 6px 8px;vertical-align:bottom;\nlayout:5:padding:6px 4px 6px 12px;vertical-align:bottom;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\nname:COMPARISON::O37\\cQ51\nname:TRACKING::Y37\\cAA51\n', - }, - name: "income", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:8:cf:2:ntvf:2\ncell:B1:l:1:f:8:cf:2\ncell:C1:l:1:f:8:cf:2\ncell:D1:l:1:f:8:cf:2\ncell:E1:l:1:f:8:cf:2\ncell:F1:l:1:f:8:cf:2\ncell:G1:l:1:f:8:cf:2\ncell:H1:l:1:f:8:cf:2\ncell:I1:l:1:f:8:cf:2\ncell:J1:l:1:f:8:cf:2\ncell:K1:l:1:f:8:cf:2\ncell:L1:l:1:f:8:cf:2\ncell:M1:l:1:f:8:cf:2\ncell:N1:l:1:f:8:cf:2\ncell:O1:l:1:f:8:cf:2\ncell:P1:l:1:f:8:cf:2\ncell:Q1:l:1:f:8:cf:2\ncell:R1:l:1:f:8:cf:2\ncell:S1:l:1:f:8:cf:2\ncell:T1:l:1:f:8:cf:2\ncell:U1:l:1:f:8:cf:2\ncell:V1:l:1:f:8:cf:2\ncell:W1:l:1:f:8:cf:2\ncell:A2:l:1:f:8:cf:2\ncell:B2:l:1:f:8:cf:2\ncell:C2:l:1:f:8:cf:2\ncell:D2:l:1:f:8:cf:2\ncell:E2:l:1:f:8:cf:2\ncell:F2:l:1:f:8:cf:2\ncell:G2:l:1:f:8:cf:2\ncell:H2:l:1:f:8:cf:2\ncell:I2:l:1:f:8:cf:2\ncell:J2:l:1:f:8:cf:2\ncell:K2:l:1:f:8:cf:2\ncell:L2:l:1:f:8:cf:2\ncell:M2:l:1:f:8:cf:2\ncell:N2:l:1:f:8:cf:2\ncell:O2:l:1:f:8:cf:2\ncell:P2:l:1:f:8:cf:2\ncell:Q2:l:1:f:8:cf:2\ncell:R2:l:1:f:8:cf:2\ncell:S2:l:1:f:8:cf:2\ncell:T2:l:1:f:8:cf:2\ncell:U2:l:1:f:8:cf:2\ncell:V2:l:1:f:8:cf:2\ncell:W2:l:1:f:8:cf:2\ncell:A3:l:1:f:8:cf:2\ncell:B3:l:1:f:8:cf:2\ncell:C3:l:1:f:8:cf:2\ncell:D3:l:1:f:8:cf:2\ncell:G3:l:1:f:8:cf:2\ncell:H3:l:1:f:8:cf:2\ncell:I3:l:1:f:8:cf:2\ncell:J3:l:1:f:8:cf:2\ncell:K3:l:1:f:8:cf:2\ncell:L3:l:1:f:8:cf:2\ncell:M3:l:1:f:8:cf:2\ncell:N3:l:1:f:8:cf:2\ncell:O3:l:1:f:8:cf:2\ncell:P3:l:1:f:8:cf:2\ncell:Q3:t: :l:1:f:8:cf:2\ncell:R3:l:1:f:8:cf:2\ncell:S3:l:1:f:8:cf:2\ncell:T3:l:1:f:8:cf:2\ncell:U3:l:1:f:8:cf:2\ncell:V3:l:1:f:8:cf:2\ncell:W3:l:1:f:8:cf:2\ncell:B4:t:Expenses:l:2:f:4:c:1:bg:5:cf:2:colspan:3\ncell:C4:l:2:f:5:c:1:bg:5:cf:2\ncell:E4:t:Date:l:1:f:9:cf:1\ncell:F4:vtf:ndt:41131.96254792824:NOW():l:1:f:9:bg:4:cf:3:ntvf:3\ncell:O4:l:1:f:8:cf:2\ncell:P4:l:1:f:8:cf:2\ncell:Q4:l:1:f:8:cf:2\ncell:R4:l:1:f:8:cf:2\ncell:S4:l:1:f:8:cf:2\ncell:T4:l:1:f:8:cf:2\ncell:U4:l:1:f:8:cf:2\ncell:V4:l:1:f:8:cf:2\ncell:W4:l:1:f:8:cf:2\ncell:O5:t::l:2:f:8:cf:2\ncell:P5:t::l:2:f:8:cf:2\ncell:Q5:t::l:2:f:8:cf:2\ncell:R5:t::l:2:f:8:cf:2\ncell:S5:t::l:2:f:8:cf:2\ncell:T5:l:1:f:8:cf:2\ncell:U5:l:1:f:8:cf:2\ncell:V5:l:1:f:8:cf:2\ncell:W5:l:1:f:8:cf:2\ncell:B6:l:2:f:3:cf:2:colspan:3\ncell:C6:l:2:f:3:bg:4:cf:2\ncell:D6:t:Source:l:2:f:2:bg:4:cf:1\ncell:E6:t:Monthly Budget:b:2:2:2:2:l:2:f:2:c:5:bg:3:cf:1\ncell:F6:t:Yearly Budget:b:2:2:2:2:l:2:f:2:c:5:bg:2:cf:1\ncell:O6:t::l:2:f:3:cf:2\ncell:P6:t::l:2:f:8:cf:2\ncell:Q6:t::l:2:f:8:cf:2\ncell:R6:t::l:2:f:8:cf:2\ncell:S6:l:1:f:8:cf:2\ncell:T6:l:1:f:8:cf:2\ncell:U6:l:1:f:8:cf:2\ncell:V6:l:1:f:8:cf:2\ncell:W6:l:1:f:8:cf:2\ncell:B7:t:Housing:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:2:colspan:3\ncell:C7:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:2\ncell:D7:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:1\ncell:E7:vtf:n:1380:E8+E14+E21+E24:b:2:2:2:2:l:4:f:2:c:5:bg:2:ntvf:1\ncell:F7:vtf:n:16560:IF( (E7*12)=0,"",(E7*12)):b:2:2:2:2:l:4:f:2:c:5:bg:2:ntvf:1\ncell:G7:b::::1\ncell:O7:l:2:f:3:cf:2\ncell:P7:l:2:f:8:cf:2\ncell:Q7:l:2:f:8:cf:2\ncell:R7:l:2:f:8:cf:2\ncell:S7:l:1:f:8:cf:2\ncell:T7:l:1:f:8:cf:2\ncell:U7:l:1:f:8:cf:2\ncell:V7:l:1:f:8:cf:2\ncell:W7:l:1:f:8:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:c:1:bg:6\ncell:C8:t:Home:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D8:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E8:vtf:n:818:SUM(E9\\cE13):b::1:1:1:l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F8:vtf:n:9816:IF( (E8*12)=0,"",(E8*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:8:cf:2\ncell:P8:l:1:f:8:cf:2\ncell:Q8:l:1:f:8:cf:2\ncell:R8:l:1:f:8:cf:2\ncell:S8:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:T8:t::l:1:f:8:cf:2\ncell:U8:l:1:f:8:cf:2\ncell:V8:l:1:f:8:cf:2\ncell:W8:l:1:f:8:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:8:cf:2\ncell:C9:l:3:f:8:cf:2\ncell:D9:t:Mortgage/Rent:l:3:f:7:cf:2\ncell:E9:v:818:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F9:vtf:n:9816:IF( (E9*12)=0,"",(E9*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:t::l:1:f:8:cf:2\ncell:P9:t::l:1:f:8:cf:2\ncell:Q9:t::l:1:f:8:cf:2\ncell:R9:l:1:f:8:cf:2\ncell:S9:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:T9:t::l:1:f:8:cf:2\ncell:U9:l:1:f:8:cf:2\ncell:V9:l:1:f:8:cf:2\ncell:W9:l:1:f:8:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:8:bg:4:cf:2\ncell:C10:l:3:f:8:bg:4:cf:2\ncell:D10:t:Property Tax:l:3:f:7:bg:4:cf:2\ncell:E10:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:8:cf:2\ncell:P10:l:1:f:8:cf:2\ncell:Q10:l:1:f:8:cf:2\ncell:R10:l:1:f:8:cf:2\ncell:S10:l:1:f:8:cf:2\ncell:T10:l:1:f:8:cf:2\ncell:U10:l:1:f:8:cf:2\ncell:V10:l:1:f:8:cf:2\ncell:W10:l:1:f:8:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:8:cf:2\ncell:C11:l:3:f:8:cf:2\ncell:D11:t:Insurance:l:3:f:7:cf:2\ncell:E11:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:8:cf:2\ncell:P11:l:1:f:8:cf:2\ncell:Q11:l:1:f:8:cf:2\ncell:R11:l:1:f:8:cf:2\ncell:S11:l:1:f:8:cf:2\ncell:T11:l:1:f:8:cf:2\ncell:U11:l:1:f:8:cf:2\ncell:V11:l:1:f:8:cf:2\ncell:W11:l:1:f:8:cf:2\ncell:A12:b::1::\ncell:B12:b::::1:l:3:f:8:bg:4:cf:2\ncell:C12:l:3:f:8:bg:4:cf:2\ncell:D12:t:Maintenance:l:3:f:7:bg:4:cf:2\ncell:E12:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F12:vtf:t::IF( (E12*12)=0,"",(E12*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G12:b::::1\ncell:O12:l:2:f:3:cf:2\ncell:P12:l:1:f:8:cf:2\ncell:Q12:l:1:f:8:cf:2\ncell:R12:l:1:f:8:cf:2\ncell:S12:l:1:f:8:cf:2\ncell:T12:l:1:f:8:cf:2\ncell:U12:l:1:f:8:cf:2\ncell:V12:l:1:f:8:cf:2\ncell:W12:l:1:f:8:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:8:cf:2\ncell:C13:l:3:f:8:cf:2\ncell:D13:t:Other:b::1:::l:3:f:7:cf:2\ncell:E13:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F13:vtf:t::IF( (E13*12)=0,"",(E13*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:8:cf:2\ncell:P13:l:1:f:8:cf:2\ncell:Q13:l:1:f:8:cf:2\ncell:R13:l:1:f:8:cf:2\ncell:S13:l:1:f:8:cf:2\ncell:T13:l:1:f:8:cf:2\ncell:U13:l:1:f:8:cf:2\ncell:V13:l:1:f:8:cf:2\ncell:W13:l:1:f:8:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:c:1:bg:6\ncell:C14:t:Utilities:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D14:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E14:vtf:n:305:SUM(E15\\cE20):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F14:vtf:n:3660:IF( (E14*12)=0,"",(E14*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:8:cf:2\ncell:P14:l:1:f:8:cf:2\ncell:Q14:l:1:f:8:cf:2\ncell:R14:l:1:f:8:cf:2\ncell:S14:l:1:f:8:cf:2\ncell:T14:l:1:f:8:cf:2\ncell:U14:l:1:f:8:cf:2\ncell:V14:l:1:f:8:cf:2\ncell:W14:l:1:f:8:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:8:cf:2\ncell:C15:l:3:f:8:cf:2\ncell:D15:t:Gas, Electricity, Oil:l:3:f:7:cf:2\ncell:E15:v:305:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F15:vtf:n:3660:IF( (E15*12)=0,"",(E15*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:8:cf:2\ncell:P15:l:1:f:8:cf:2\ncell:Q15:l:1:f:8:cf:2\ncell:R15:l:1:f:8:cf:2\ncell:S15:l:1:f:8:cf:2\ncell:T15:l:1:f:8:cf:2\ncell:U15:l:1:f:8:cf:2\ncell:V15:l:1:f:8:cf:2\ncell:W15:l:1:f:8:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:8:bg:4:cf:2\ncell:C16:l:3:f:8:bg:4:cf:2\ncell:D16:t:Water, Sewer, Garbage & Other:l:3:f:7:bg:4:cf:2\ncell:E16:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:8:cf:2\ncell:P16:l:1:f:8:cf:2\ncell:Q16:l:1:f:8:cf:2\ncell:R16:l:1:f:8:cf:2\ncell:S16:l:1:f:8:cf:2\ncell:T16:l:1:f:8:cf:2\ncell:U16:l:1:f:8:cf:2\ncell:V16:l:1:f:8:cf:2\ncell:W16:l:1:f:8:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:8:cf:2\ncell:C17:l:3:f:8:cf:2\ncell:D17:t:TV - Cable, Dish, Other:l:3:f:7:cf:2\ncell:E17:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:8:cf:2\ncell:P17:l:1:f:8:cf:2\ncell:Q17:l:1:f:8:cf:2\ncell:R17:l:1:f:8:cf:2\ncell:S17:l:1:f:8:cf:2\ncell:T17:l:1:f:8:cf:2\ncell:U17:l:1:f:8:cf:2\ncell:V17:l:1:f:8:cf:2\ncell:W17:l:1:f:8:cf:2\ncell:A18:b::1::\ncell:B18:b::::1:l:3:f:8:bg:4:cf:2\ncell:C18:l:3:f:8:bg:4:cf:2\ncell:D18:t:Phone:l:3:f:7:bg:4:cf:2\ncell:E18:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F18:vtf:t::IF( (E18*12)=0,"",(E18*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G18:b::::1\ncell:O18:l:1:f:8:cf:2\ncell:P18:l:1:f:8:cf:2\ncell:Q18:l:1:f:8:cf:2\ncell:R18:l:1:f:8:cf:2\ncell:S18:l:1:f:8:cf:2\ncell:T18:l:1:f:8:cf:2\ncell:U18:l:1:f:8:cf:2\ncell:V18:l:1:f:8:cf:2\ncell:W18:l:1:f:8:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:8:cf:2\ncell:C19:l:3:f:8:cf:2\ncell:D19:t:Internet:l:3:f:7:cf:2\ncell:E19:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F19:vtf:t::IF( (E19*12)=0,"",(E19*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:8:cf:2\ncell:P19:l:1:f:8:cf:2\ncell:Q19:l:1:f:8:cf:2\ncell:R19:l:1:f:8:cf:2\ncell:S19:l:1:f:8:cf:2\ncell:T19:l:1:f:8:cf:2\ncell:U19:l:1:f:8:cf:2\ncell:V19:l:1:f:8:cf:2\ncell:W19:l:1:f:8:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:8:bg:4:cf:2\ncell:C20:l:3:f:8:bg:4:cf:2\ncell:D20:t:Other:l:3:f:7:bg:4:cf:2\ncell:E20:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:8:cf:2\ncell:P20:l:1:f:8:cf:2\ncell:Q20:l:1:f:8:cf:2\ncell:R20:l:1:f:8:cf:2\ncell:S20:l:1:f:8:cf:2\ncell:T20:l:1:f:8:cf:2\ncell:U20:l:1:f:8:cf:2\ncell:V20:l:1:f:8:cf:2\ncell:W20:l:1:f:8:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:c:1:bg:6\ncell:C21:t:Personal Services:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D21:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E21:vtf:n:84:SUM(E22\\cE23):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F21:vtf:n:1008:IF( (E21*12)=0,"",(E21*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:8:cf:2\ncell:P21:l:1:f:8:cf:2\ncell:Q21:l:1:f:8:cf:2\ncell:R21:l:1:f:8:cf:2\ncell:S21:l:1:f:8:cf:2\ncell:T21:l:1:f:8:cf:2\ncell:U21:l:1:f:8:cf:2\ncell:V21:l:1:f:8:cf:2\ncell:W21:l:1:f:8:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:8:cf:2\ncell:C22:l:3:f:8:cf:2\ncell:D22:t:Childcare:l:3:f:7:cf:2\ncell:E22:v:84:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F22:vtf:n:1008:IF( (E22*12)=0,"",(E22*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G22:b::::1\ncell:O22:l:1:f:8:cf:2\ncell:P22:l:1:f:8:cf:2\ncell:Q22:l:1:f:8:cf:2\ncell:R22:l:1:f:8:cf:2\ncell:S22:l:1:f:8:cf:2\ncell:T22:l:1:f:8:cf:2\ncell:U22:l:1:f:8:cf:2\ncell:V22:l:1:f:8:cf:2\ncell:W22:l:1:f:8:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:8:bg:4:cf:2\ncell:C23:l:3:f:8:bg:4:cf:2\ncell:D23:t:Elderly Care & Other:l:3:f:7:bg:4:cf:2\ncell:E23:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:8:cf:2\ncell:P23:l:1:f:8:cf:2\ncell:Q23:l:1:f:8:cf:2\ncell:R23:l:1:f:8:cf:2\ncell:S23:l:1:f:8:cf:2\ncell:T23:l:1:f:8:cf:2\ncell:U23:l:1:f:8:cf:2\ncell:V23:l:1:f:8:cf:2\ncell:W23:l:1:f:8:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:c:1:bg:6\ncell:C24:t:Other Household Expenses:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D24:t::b::1:1::l:3:f:2:c:1:bg:6:cf:2\ncell:E24:vtf:n:173:SUM(E25\\cE31):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F24:vtf:n:2076:IF( (E24*12)=0,"",(E24*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:8:cf:2\ncell:P24:l:1:f:8:cf:2\ncell:Q24:l:1:f:8:cf:2\ncell:R24:l:1:f:8:cf:2\ncell:S24:l:1:f:8:cf:2\ncell:T24:l:1:f:8:cf:2\ncell:U24:l:1:f:8:cf:2\ncell:V24:l:1:f:8:cf:2\ncell:W24:l:1:f:8:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:8:cf:2\ncell:C25:l:3:f:8:cf:2\ncell:D25:t:Gardening & Lawncare:l:3:f:7:cf:2\ncell:E25:v:173:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F25:vtf:n:2076:IF( (E25*12)=0,"",(E25*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G25:b::::1\ncell:O25:l:1:f:8:cf:2\ncell:P25:l:1:f:8:cf:2\ncell:Q25:l:1:f:8:cf:2\ncell:R25:l:1:f:8:cf:2\ncell:S25:l:1:f:8:cf:2\ncell:T25:l:1:f:8:cf:2\ncell:U25:l:1:f:8:cf:2\ncell:V25:l:1:f:8:cf:2\ncell:W25:l:1:f:8:cf:2\ncell:A26:b::1::\ncell:B26:b::::1:l:3:f:8:bg:4:cf:2\ncell:C26:l:3:f:8:bg:4:cf:2\ncell:D26:t:Laundry & Cleaning:l:3:f:7:bg:4:cf:2\ncell:E26:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F26:vtf:t::IF( (E26*12)=0,"",(E26*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G26:b::::1\ncell:O26:l:1:f:8:cf:2\ncell:P26:l:1:f:8:cf:2\ncell:Q26:l:1:f:8:cf:2\ncell:R26:l:1:f:8:cf:2\ncell:S26:l:1:f:8:cf:2\ncell:T26:l:1:f:8:cf:2\ncell:U26:l:1:f:8:cf:2\ncell:V26:l:1:f:8:cf:2\ncell:W26:l:1:f:8:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:8:cf:2\ncell:C27:l:3:f:8:cf:2\ncell:D27:t:Household Supplies:l:3:f:7:cf:2\ncell:E27:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F27:vtf:t::IF( (E27*12)=0,"",(E27*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:8:cf:2\ncell:P27:l:1:f:8:cf:2\ncell:Q27:l:1:f:8:cf:2\ncell:R27:l:1:f:8:cf:2\ncell:S27:l:1:f:8:cf:2\ncell:T27:l:1:f:8:cf:2\ncell:U27:l:1:f:8:cf:2\ncell:V27:l:1:f:8:cf:2\ncell:W27:l:1:f:8:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:8:bg:4:cf:2\ncell:C28:l:3:f:8:bg:4:cf:2\ncell:D28:t:Furniture:l:3:f:7:bg:4:cf:2\ncell:E28:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:8:cf:2\ncell:P28:l:1:f:8:cf:2\ncell:Q28:l:1:f:8:cf:2\ncell:R28:l:1:f:8:cf:2\ncell:S28:l:1:f:8:cf:2\ncell:T28:l:1:f:8:cf:2\ncell:U28:l:1:f:8:cf:2\ncell:V28:l:1:f:8:cf:2\ncell:W28:l:1:f:8:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:8:cf:2\ncell:C29:l:3:f:8:cf:2\ncell:D29:t:Appliances & Equipment:l:3:f:7:cf:2\ncell:E29:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:8:cf:2\ncell:P29:l:1:f:8:cf:2\ncell:Q29:l:1:f:8:cf:2\ncell:R29:l:1:f:8:cf:2\ncell:S29:l:1:f:8:cf:2\ncell:T29:l:1:f:8:cf:2\ncell:U29:l:1:f:8:cf:2\ncell:V29:l:1:f:8:cf:2\ncell:W29:l:1:f:8:cf:2\ncell:A30:b::1::\ncell:B30:b::::1:l:3:f:8:bg:4:cf:2\ncell:C30:l:3:f:8:bg:4:cf:2\ncell:D30:t:Security Services:l:3:f:7:bg:4:cf:2\ncell:E30:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G30:b::::1\ncell:O30:l:1:f:8:cf:2\ncell:P30:l:1:f:8:cf:2\ncell:Q30:l:1:f:8:cf:2\ncell:R30:l:1:f:8:cf:2\ncell:S30:l:1:f:8:cf:2\ncell:T30:l:1:f:8:cf:2\ncell:U30:l:1:f:8:cf:2\ncell:V30:l:1:f:8:cf:2\ncell:W30:l:1:f:8:cf:2\ncell:A31:b::1::\ncell:B31:b:::1:1:l:3:f:8:cf:2\ncell:C31:b:::1::l:3:f:8:cf:2\ncell:D31:t:Other:b:::1::l:3:f:7:cf:2\ncell:E31:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b::1:1::l:4:f:7:cf:3:ntvf:1\ncell:G31:b::::1\ncell:O31:l:1:f:8:cf:2\ncell:P31:l:1:f:8:cf:2\ncell:Q31:l:1:f:8:cf:2\ncell:R31:l:1:f:8:cf:2\ncell:S31:l:1:f:8:cf:2\ncell:T31:l:1:f:8:cf:2\ncell:U31:l:1:f:8:cf:2\ncell:V31:l:1:f:8:cf:2\ncell:W31:l:1:f:8:cf:2\ncell:B32:b:1:::\ncell:C32:b:1:::\ncell:D32:b:1:::\ncell:E32:b:1:::\ncell:F32:b:1:::\ncell:O32:l:1:f:8:cf:2\ncell:P32:l:1:f:8:cf:2\ncell:Q32:l:1:f:8:cf:2\ncell:R32:l:1:f:8:cf:2\ncell:S32:l:1:f:8:cf:2\ncell:T32:l:1:f:8:cf:2\ncell:U32:l:1:f:8:cf:2\ncell:V32:l:1:f:8:cf:2\ncell:W32:l:1:f:8:cf:2\ncell:O33:l:1:f:8:cf:2\ncell:P33:l:1:f:8:cf:2\ncell:Q33:l:1:f:8:cf:2\ncell:R33:l:1:f:8:cf:2\ncell:S33:l:1:f:8:cf:2\ncell:T33:l:1:f:8:cf:2\ncell:U33:l:1:f:8:cf:2\ncell:V33:l:1:f:8:cf:2\ncell:W33:l:1:f:8:cf:2\ncell:O34:l:1:f:8:cf:2\ncell:P34:l:1:f:8:cf:2\ncell:Q34:l:1:f:8:cf:2\ncell:R34:l:1:f:8:cf:2\ncell:S34:l:1:f:8:cf:2\ncell:T34:l:1:f:8:cf:2\ncell:U34:l:1:f:8:cf:2\ncell:V34:l:1:f:8:cf:2\ncell:W34:l:1:f:8:cf:2\ncell:O35:l:1:f:8:cf:2\ncell:P35:l:1:f:8:cf:2\ncell:Q35:l:1:f:8:cf:2\ncell:R35:l:1:f:8:cf:2\ncell:S35:l:1:f:8:cf:2\ncell:T35:l:1:f:8:cf:2\ncell:U35:l:1:f:8:cf:2\ncell:V35:l:1:f:8:cf:2\ncell:W35:l:1:f:8:cf:2\ncell:O36:l:1:f:8:cf:2\ncell:P36:l:1:f:8:cf:2\ncell:Q36:l:1:f:8:cf:2\ncell:R36:l:1:f:8:cf:2\ncell:S36:l:1:f:8:cf:2\ncell:T36:l:1:f:8:cf:2\ncell:U36:l:1:f:8:cf:2\ncell:V36:l:1:f:8:cf:2\ncell:W36:l:1:f:8:cf:2\ncell:O37:l:1:f:8:cf:2\ncell:P37:l:1:f:8:cf:2\ncell:Q37:l:1:f:8:cf:2\ncell:R37:l:1:f:8:cf:2\ncell:S37:l:1:f:8:cf:2\ncell:T37:l:1:f:8:cf:2\ncell:U37:l:1:f:8:cf:2\ncell:V37:l:1:f:8:cf:2\ncell:W37:l:1:f:8:cf:2\ncell:O38:l:1:f:8:cf:2\ncell:P38:l:1:f:8:cf:2\ncell:Q38:l:1:f:8:cf:2\ncell:R38:l:1:f:8:cf:2\ncell:S38:l:1:f:8:cf:2\ncell:T38:l:1:f:8:cf:2\ncell:U38:l:1:f:8:cf:2\ncell:V38:l:1:f:8:cf:2\ncell:W38:l:1:f:8:cf:2\ncell:O39:l:1:f:8:cf:2\ncell:P39:l:1:f:8:cf:2\ncell:Q39:l:1:f:8:cf:2\ncell:R39:l:1:f:8:cf:2\ncell:S39:l:1:f:8:cf:2\ncell:T39:l:1:f:8:cf:2\ncell:U39:l:1:f:8:cf:2\ncell:V39:l:1:f:8:cf:2\ncell:W39:l:1:f:8:cf:2\ncell:O40:l:1:f:8:cf:2\ncell:P40:l:1:f:8:cf:2\ncell:Q40:l:1:f:8:cf:2\ncell:R40:l:1:f:8:cf:2\ncell:S40:l:1:f:8:cf:2\ncell:T40:l:1:f:8:cf:2\ncell:U40:l:1:f:8:cf:2\ncell:V40:l:1:f:8:cf:2\ncell:W40:l:1:f:8:cf:2\ncell:O41:l:1:f:8:cf:2\ncell:P41:l:1:f:8:cf:2\ncell:Q41:l:1:f:8:cf:2\ncell:R41:l:1:f:8:cf:2\ncell:S41:l:1:f:8:cf:2\ncell:T41:l:1:f:8:cf:2\ncell:U41:l:1:f:8:cf:2\ncell:V41:l:1:f:8:cf:2\ncell:W41:l:1:f:8:cf:2\ncell:O42:l:1:f:8:cf:2\ncell:P42:l:1:f:8:cf:2\ncell:Q42:l:1:f:8:cf:2\ncell:R42:l:1:f:8:cf:2\ncell:S42:l:1:f:8:cf:2\ncell:T42:l:1:f:8:cf:2\ncell:U42:l:1:f:8:cf:2\ncell:V42:l:1:f:8:cf:2\ncell:W42:l:1:f:8:cf:2\ncell:O43:l:1:f:8:cf:2\ncell:P43:l:1:f:8:cf:2\ncell:Q43:l:1:f:8:cf:2\ncell:R43:l:1:f:8:cf:2\ncell:S43:l:1:f:8:cf:2\ncell:T43:l:1:f:8:cf:2\ncell:U43:l:1:f:8:cf:2\ncell:V43:l:1:f:8:cf:2\ncell:W43:l:1:f:8:cf:2\ncell:O44:l:1:f:8:cf:2\ncell:P44:l:1:f:8:cf:2\ncell:Q44:l:1:f:8:cf:2\ncell:R44:l:1:f:8:cf:2\ncell:S44:l:1:f:8:cf:2\ncell:T44:l:1:f:8:cf:2\ncell:U44:l:1:f:8:cf:2\ncell:V44:l:1:f:8:cf:2\ncell:W44:l:1:f:8:cf:2\ncell:O45:l:1:f:8:cf:2\ncell:P45:l:1:f:8:cf:2\ncell:Q45:l:1:f:8:cf:2\ncell:R45:l:1:f:8:cf:2\ncell:S45:l:1:f:8:cf:2\ncell:T45:l:1:f:8:cf:2\ncell:U45:l:1:f:8:cf:2\ncell:V45:l:1:f:8:cf:2\ncell:W45:l:1:f:8:cf:2\ncell:O46:l:1:f:8:cf:2\ncell:P46:l:1:f:8:cf:2\ncell:Q46:l:1:f:8:cf:2\ncell:R46:l:1:f:8:cf:2\ncell:S46:l:1:f:8:cf:2\ncell:T46:l:1:f:8:cf:2\ncell:U46:l:1:f:8:cf:2\ncell:V46:l:1:f:8:cf:2\ncell:W46:l:1:f:8:cf:2\ncell:O47:l:1:f:8:cf:2\ncell:P47:l:1:f:8:cf:2\ncell:Q47:l:1:f:8:cf:2\ncell:R47:l:1:f:8:cf:2\ncell:S47:l:1:f:8:cf:2\ncell:T47:l:1:f:8:cf:2\ncell:U47:l:1:f:8:cf:2\ncell:V47:l:1:f:8:cf:2\ncell:W47:l:1:f:8:cf:2\ncell:O48:l:1:f:8:cf:2\ncell:P48:l:1:f:8:cf:2\ncell:Q48:l:1:f:8:cf:2\ncell:R48:l:1:f:8:cf:2\ncell:S48:l:1:f:8:cf:2\ncell:T48:l:1:f:8:cf:2\ncell:U48:l:1:f:8:cf:2\ncell:V48:l:1:f:8:cf:2\ncell:W48:l:1:f:8:cf:2\ncell:O49:l:1:f:8:cf:2\ncell:P49:l:1:f:8:cf:2\ncell:Q49:l:1:f:8:cf:2\ncell:R49:l:1:f:8:cf:2\ncell:S49:l:1:f:8:cf:2\ncell:T49:l:1:f:8:cf:2\ncell:U49:l:1:f:8:cf:2\ncell:V49:l:1:f:8:cf:2\ncell:W49:l:1:f:8:cf:2\ncell:O50:l:1:f:8:cf:2\ncell:P50:l:1:f:8:cf:2\ncell:Q50:l:1:f:8:cf:2\ncell:R50:l:1:f:8:cf:2\ncell:S50:l:1:f:8:cf:2\ncell:T50:l:1:f:8:cf:2\ncell:U50:l:1:f:8:cf:2\ncell:V50:l:1:f:8:cf:2\ncell:W50:l:1:f:8:cf:2\ncell:O51:l:1:f:8:cf:2\ncell:P51:l:1:f:8:cf:2\ncell:Q51:l:1:f:8:cf:2\ncell:R51:l:1:f:8:cf:2\ncell:S51:l:1:f:8:cf:2\ncell:T51:l:1:f:8:cf:2\ncell:U51:l:1:f:8:cf:2\ncell:V51:l:1:f:8:cf:2\ncell:W51:l:1:f:8:cf:2\ncell:O52:l:1:f:8:cf:2\ncell:P52:l:1:f:8:cf:2\ncell:Q52:l:1:f:8:cf:2\ncell:R52:l:1:f:8:cf:2\ncell:S52:l:1:f:8:cf:2\ncell:T52:l:1:f:8:cf:2\ncell:U52:l:1:f:8:cf:2\ncell:V52:l:1:f:8:cf:2\ncell:W52:l:1:f:8:cf:2\ncell:O53:l:1:f:8:cf:2\ncell:P53:l:1:f:8:cf:2\ncell:Q53:l:1:f:8:cf:2\ncell:R53:l:1:f:8:cf:2\ncell:S53:l:1:f:8:cf:2\ncell:T53:l:1:f:8:cf:2\ncell:U53:l:1:f:8:cf:2\ncell:V53:l:1:f:8:cf:2\ncell:W53:l:1:f:8:cf:2\ncell:O54:l:1:f:8:cf:2\ncell:P54:l:1:f:8:cf:2\ncell:Q54:l:1:f:8:cf:2\ncell:R54:l:1:f:8:cf:2\ncell:S54:l:1:f:8:cf:2\ncell:T54:l:1:f:8:cf:2\ncell:U54:l:1:f:8:cf:2\ncell:V54:l:1:f:8:cf:2\ncell:W54:l:1:f:8:cf:2\ncell:O55:l:1:f:8:cf:2\ncell:P55:l:1:f:8:cf:2\ncell:Q55:l:1:f:8:cf:2\ncell:R55:l:1:f:8:cf:2\ncell:S55:l:1:f:8:cf:2\ncell:T55:l:1:f:8:cf:2\ncell:U55:l:1:f:8:cf:2\ncell:V55:l:1:f:8:cf:2\ncell:W55:l:1:f:8:cf:2\ncell:O56:l:1:f:8:cf:2\ncell:P56:l:1:f:8:cf:2\ncell:Q56:l:1:f:8:cf:2\ncell:R56:l:1:f:8:cf:2\ncell:S56:l:1:f:8:cf:2\ncell:T56:l:1:f:8:cf:2\ncell:U56:l:1:f:8:cf:2\ncell:V56:l:1:f:8:cf:2\ncell:W56:l:1:f:8:cf:2\ncell:O57:l:1:f:8:cf:2\ncell:P57:l:1:f:8:cf:2\ncell:Q57:l:1:f:8:cf:2\ncell:R57:l:1:f:8:cf:2\ncell:S57:l:1:f:8:cf:2\ncell:T57:l:1:f:8:cf:2\ncell:U57:l:1:f:8:cf:2\ncell:V57:l:1:f:8:cf:2\ncell:W57:l:1:f:8:cf:2\ncell:O58:l:1:f:8:cf:2\ncell:P58:l:1:f:8:cf:2\ncell:Q58:l:1:f:8:cf:2\ncell:R58:l:1:f:8:cf:2\ncell:S58:l:1:f:8:cf:2\ncell:T58:l:1:f:8:cf:2\ncell:U58:l:1:f:8:cf:2\ncell:V58:l:1:f:8:cf:2\ncell:W58:l:1:f:8:cf:2\ncell:O59:l:1:f:8:cf:2\ncell:P59:l:1:f:8:cf:2\ncell:Q59:l:1:f:8:cf:2\ncell:R59:l:1:f:8:cf:2\ncell:S59:l:1:f:8:cf:2\ncell:T59:l:1:f:8:cf:2\ncell:U59:l:1:f:8:cf:2\ncell:V59:l:1:f:8:cf:2\ncell:W59:l:1:f:8:cf:2\ncell:O60:l:1:f:8:cf:2\ncell:P60:l:1:f:8:cf:2\ncell:Q60:l:1:f:8:cf:2\ncell:R60:l:1:f:8:cf:2\ncell:S60:l:1:f:8:cf:2\ncell:T60:l:1:f:8:cf:2\ncell:U60:l:1:f:8:cf:2\ncell:V60:l:1:f:8:cf:2\ncell:W60:l:1:f:8:cf:2\ncell:O61:l:1:f:8:cf:2\ncell:P61:l:1:f:8:cf:2\ncell:Q61:l:1:f:8:cf:2\ncell:R61:l:1:f:8:cf:2\ncell:S61:l:1:f:8:cf:2\ncell:T61:l:1:f:8:cf:2\ncell:U61:l:1:f:8:cf:2\ncell:V61:l:1:f:8:cf:2\ncell:W61:l:1:f:8:cf:2\ncell:O62:l:1:f:8:cf:2\ncell:P62:l:1:f:8:cf:2\ncell:Q62:l:1:f:8:cf:2\ncell:R62:l:1:f:8:cf:2\ncell:S62:l:1:f:8:cf:2\ncell:T62:l:1:f:8:cf:2\ncell:U62:l:1:f:8:cf:2\ncell:V62:l:1:f:8:cf:2\ncell:W62:l:1:f:8:cf:2\ncell:O63:l:1:f:8:cf:2\ncell:P63:l:1:f:8:cf:2\ncell:Q63:l:1:f:8:cf:2\ncell:R63:l:1:f:8:cf:2\ncell:S63:l:1:f:8:cf:2\ncell:T63:l:1:f:8:cf:2\ncell:U63:l:1:f:8:cf:2\ncell:V63:l:1:f:8:cf:2\ncell:W63:l:1:f:8:cf:2\ncell:O64:l:1:f:8:cf:2\ncell:P64:l:1:f:8:cf:2\ncell:Q64:l:1:f:8:cf:2\ncell:R64:l:1:f:8:cf:2\ncell:S64:l:1:f:8:cf:2\ncell:T64:l:1:f:8:cf:2\ncell:U64:l:1:f:8:cf:2\ncell:V64:l:1:f:8:cf:2\ncell:W64:l:1:f:8:cf:2\ncell:O65:l:1:f:8:cf:2\ncell:P65:l:1:f:8:cf:2\ncell:Q65:l:1:f:8:cf:2\ncell:R65:l:1:f:8:cf:2\ncell:S65:l:1:f:8:cf:2\ncell:T65:l:1:f:8:cf:2\ncell:U65:l:1:f:8:cf:2\ncell:V65:l:1:f:8:cf:2\ncell:W65:l:1:f:8:cf:2\ncell:O66:l:1:f:8:cf:2\ncell:P66:l:1:f:8:cf:2\ncell:Q66:l:1:f:8:cf:2\ncell:R66:l:1:f:8:cf:2\ncell:S66:l:1:f:8:cf:2\ncell:T66:l:1:f:8:cf:2\ncell:U66:l:1:f:8:cf:2\ncell:V66:l:1:f:8:cf:2\ncell:W66:l:1:f:8:cf:2\ncell:O67:l:1:f:8:cf:2\ncell:P67:l:1:f:8:cf:2\ncell:Q67:l:1:f:8:cf:2\ncell:R67:l:1:f:8:cf:2\ncell:S67:l:1:f:8:cf:2\ncell:T67:l:1:f:8:cf:2\ncell:U67:l:1:f:8:cf:2\ncell:V67:l:1:f:8:cf:2\ncell:W67:l:1:f:8:cf:2\ncell:O68:l:1:f:8:cf:2\ncell:P68:l:1:f:8:cf:2\ncell:Q68:l:1:f:8:cf:2\ncell:R68:l:1:f:8:cf:2\ncell:S68:l:1:f:8:cf:2\ncell:T68:l:1:f:8:cf:2\ncell:U68:l:1:f:8:cf:2\ncell:V68:l:1:f:8:cf:2\ncell:W68:l:1:f:8:cf:2\ncell:O69:l:1:f:8:cf:2\ncell:P69:l:1:f:8:cf:2\ncell:Q69:l:1:f:8:cf:2\ncell:R69:l:1:f:8:cf:2\ncell:S69:l:1:f:8:cf:2\ncell:T69:l:1:f:8:cf:2\ncell:U69:l:1:f:8:cf:2\ncell:V69:l:1:f:8:cf:2\ncell:W69:l:1:f:8:cf:2\ncell:O70:l:1:f:8:cf:2\ncell:P70:l:1:f:8:cf:2\ncell:Q70:l:1:f:8:cf:2\ncell:R70:l:1:f:8:cf:2\ncell:S70:l:1:f:8:cf:2\ncell:T70:l:1:f:8:cf:2\ncell:U70:l:1:f:8:cf:2\ncell:V70:l:1:f:8:cf:2\ncell:W70:l:1:f:8:cf:2\ncell:O71:l:1:f:8:cf:2\ncell:P71:l:1:f:8:cf:2\ncell:Q71:l:1:f:8:cf:2\ncell:R71:l:1:f:8:cf:2\ncell:S71:l:1:f:8:cf:2\ncell:T71:l:1:f:8:cf:2\ncell:U71:l:1:f:8:cf:2\ncell:V71:l:1:f:8:cf:2\ncell:W71:l:1:f:8:cf:2\ncell:O72:l:1:f:8:cf:2\ncell:P72:l:1:f:8:cf:2\ncell:Q72:l:1:f:8:cf:2\ncell:R72:l:1:f:8:cf:2\ncell:S72:l:1:f:8:cf:2\ncell:T72:l:1:f:8:cf:2\ncell:U72:l:1:f:8:cf:2\ncell:V72:l:1:f:8:cf:2\ncell:W72:l:1:f:8:cf:2\ncell:O73:l:1:f:8:cf:2\ncell:P73:l:1:f:8:cf:2\ncell:Q73:l:1:f:8:cf:2\ncell:R73:l:1:f:8:cf:2\ncell:O74:l:1:f:8:cf:2\ncell:P74:l:1:f:8:cf:2\ncell:Q74:l:1:f:8:cf:2\ncell:R74:l:1:f:8:cf:2\ncell:O75:l:1:f:8:cf:2\ncell:P75:l:1:f:8:cf:2\ncell:Q75:l:1:f:8:cf:2\ncell:R75:l:1:f:8:cf:2\ncell:O76:l:1:f:8:cf:2\ncell:P76:l:1:f:8:cf:2\ncell:Q76:l:1:f:8:cf:2\ncell:R76:l:1:f:8:cf:2\ncell:O77:l:1:f:8:cf:2\ncell:P77:l:1:f:8:cf:2\ncell:Q77:l:1:f:8:cf:2\ncell:R77:l:1:f:8:cf:2\ncell:O78:l:1:f:8:cf:2\ncell:P78:l:1:f:8:cf:2\ncell:Q78:l:1:f:8:cf:2\ncell:R78:l:1:f:8:cf:2\ncell:O79:l:1:f:8:cf:2\ncell:P79:l:1:f:8:cf:2\ncell:Q79:l:1:f:8:cf:2\ncell:R79:l:1:f:8:cf:2\ncell:O80:l:1:f:8:cf:2\ncell:P80:l:1:f:8:cf:2\ncell:Q80:l:1:f:8:cf:2\ncell:R80:l:1:f:8:cf:2\ncell:O81:l:1:f:8:cf:2\ncell:P81:l:1:f:8:cf:2\ncell:Q81:l:1:f:8:cf:2\ncell:R81:l:1:f:8:cf:2\ncell:O82:l:1:f:8:cf:2\ncell:P82:l:1:f:8:cf:2\ncell:Q82:l:1:f:8:cf:2\ncell:R82:l:1:f:8:cf:2\ncell:O83:l:1:f:8:cf:2\ncell:P83:l:1:f:8:cf:2\ncell:Q83:l:1:f:8:cf:2\ncell:R83:l:1:f:8:cf:2\ncell:O84:l:1:f:8:cf:2\ncell:P84:l:1:f:8:cf:2\ncell:Q84:l:1:f:8:cf:2\ncell:R84:l:1:f:8:cf:2\ncell:O85:l:1:f:8:cf:2\ncell:P85:l:1:f:8:cf:2\ncell:Q85:l:1:f:8:cf:2\ncell:R85:l:1:f:8:cf:2\ncell:O86:l:1:f:8:cf:2\ncell:P86:l:1:f:8:cf:2\ncell:Q86:l:1:f:8:cf:2\ncell:R86:l:1:f:8:cf:2\ncell:B87:l:1:f:8:cf:2\ncell:C87:l:1:f:8:cf:2\ncell:D87:l:1:f:2:cf:2\ncell:E87:l:1:f:2:cf:3:ntvf:1\ncell:F87:l:1:f:2:cf:3:ntvf:1\ncell:O87:l:1:f:8:cf:2\ncell:P87:l:1:f:8:cf:2\ncell:Q87:l:1:f:8:cf:2\ncell:R87:l:1:f:8:cf:2\ncell:B88:l:1:f:6:cf:2\ncell:C88:l:1:f:6:cf:2\ncell:D88:l:1:f:11:cf:2\ncell:E88:l:1:f:11:cf:2\ncell:F88:l:1:f:8:cf:2\ncell:O88:l:1:f:8:cf:2\ncell:P88:l:1:f:8:cf:2\ncell:Q88:l:1:f:8:cf:2\ncell:R88:l:1:f:8:cf:2\ncell:O89:l:1:f:8:cf:2\ncell:P89:l:1:f:8:cf:2\ncell:Q89:l:1:f:8:cf:2\ncell:R89:l:1:f:8:cf:2\ncell:O90:l:1:f:8:cf:2\ncell:P90:l:1:f:8:cf:2\ncell:Q90:l:1:f:8:cf:2\ncell:R90:l:1:f:8:cf:2\ncell:O91:l:1:f:8:cf:2\ncell:P91:l:1:f:8:cf:2\ncell:Q91:l:1:f:8:cf:2\ncell:R91:l:1:f:8:cf:2\ncell:O92:l:1:f:8:cf:2\ncell:P92:l:1:f:8:cf:2\ncell:Q92:l:1:f:8:cf:2\ncell:R92:l:1:f:8:cf:2\ncell:O93:l:1:f:8:cf:2\ncell:P93:l:1:f:8:cf:2\ncell:Q93:l:1:f:8:cf:2\ncell:R93:l:1:f:8:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:O96:l:1:f:8:cf:2\ncell:P96:l:1:f:8:cf:2\ncell:Q96:l:1:f:8:cf:2\ncell:R96:l:1:f:8:cf:2\ncell:O97:l:1:f:8:cf:2\ncell:P97:l:1:f:8:cf:2\ncell:Q97:l:1:f:8:cf:2\ncell:R97:l:1:f:8:cf:2\ncell:O98:l:1:f:8:cf:2\ncell:P98:l:1:f:8:cf:2\ncell:Q98:l:1:f:8:cf:2\ncell:R98:l:1:f:8:cf:2\ncell:S98:l:1:f:8:cf:2\ncell:T98:l:1:f:8:cf:2\ncell:U98:l:1:f:8:cf:2\ncell:V98:l:1:f:8:cf:2\ncell:W98:l:1:f:8:cf:2\ncell:O99:l:1:f:8:cf:2\ncell:P99:l:1:f:8:cf:2\ncell:Q99:l:1:f:8:cf:2\ncell:R99:l:1:f:8:cf:2\ncell:S99:l:1:f:8:cf:2\ncell:T99:l:1:f:8:cf:2\ncell:U99:l:1:f:8:cf:2\ncell:V99:l:1:f:8:cf:2\ncell:W99:l:1:f:8:cf:2\ncell:O100:l:1:f:8:cf:2\ncell:P100:l:1:f:8:cf:2\ncell:Q100:l:1:f:8:cf:2\ncell:R100:l:1:f:8:cf:2\ncell:S100:l:1:f:8:cf:2\ncell:T100:l:1:f:8:cf:2\ncell:U100:l:1:f:8:cf:2\ncell:V100:l:1:f:8:cf:2\ncell:W100:l:1:f:8:cf:2\ncell:O101:l:1:f:8:cf:2\ncell:P101:l:1:f:8:cf:2\ncell:Q101:l:1:f:8:cf:2\ncell:R101:l:1:f:8:cf:2\ncell:S101:l:1:f:8:cf:2\ncell:T101:l:1:f:8:cf:2\ncell:U101:l:1:f:8:cf:2\ncell:V101:l:1:f:8:cf:2\ncell:W101:l:1:f:8:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncell:O110:l:1:f:8:cf:2\ncell:P110:l:1:f:8:cf:2\ncell:Q110:l:1:f:8:cf:2\ncell:R110:l:1:f:8:cf:2\ncell:S110:l:1:f:8:cf:2\ncell:T110:l:1:f:8:cf:2\ncell:U110:l:1:f:8:cf:2\ncell:V110:l:1:f:8:cf:2\ncell:W110:l:1:f:8:cf:2\ncell:O111:l:1:f:8:cf:2\ncell:P111:l:1:f:8:cf:2\ncell:Q111:l:1:f:8:cf:2\ncell:R111:l:1:f:8:cf:2\ncell:S111:l:1:f:8:cf:2\ncell:T111:l:1:f:8:cf:2\ncell:U111:l:1:f:8:cf:2\ncell:V111:l:1:f:8:cf:2\ncell:W111:l:1:f:8:cf:2\ncell:O112:l:1:f:8:cf:2\ncell:P112:l:1:f:8:cf:2\ncell:Q112:l:1:f:8:cf:2\ncell:R112:l:1:f:8:cf:2\ncell:S112:l:1:f:8:cf:2\ncell:T112:l:1:f:8:cf:2\ncell:U112:l:1:f:8:cf:2\ncell:V112:l:1:f:8:cf:2\ncell:W112:l:1:f:8:cf:2\ncell:O113:l:1:f:8:cf:2\ncell:P113:l:1:f:8:cf:2\ncell:Q113:l:1:f:8:cf:2\ncell:R113:l:1:f:8:cf:2\ncell:S113:l:1:f:8:cf:2\ncell:T113:l:1:f:8:cf:2\ncell:U113:l:1:f:8:cf:2\ncell:V113:l:1:f:8:cf:2\ncell:W113:l:1:f:8:cf:2\ncell:O114:l:1:f:8:cf:2\ncell:P114:l:1:f:8:cf:2\ncell:Q114:l:1:f:8:cf:2\ncell:R114:l:1:f:8:cf:2\ncell:S114:l:1:f:8:cf:2\ncell:T114:l:1:f:8:cf:2\ncell:U114:l:1:f:8:cf:2\ncell:V114:l:1:f:8:cf:2\ncell:W114:l:1:f:8:cf:2\ncell:O115:l:1:f:8:cf:2\ncell:P115:l:1:f:8:cf:2\ncell:Q115:l:1:f:8:cf:2\ncell:R115:l:1:f:8:cf:2\ncell:S115:l:1:f:8:cf:2\ncell:T115:l:1:f:8:cf:2\ncell:U115:l:1:f:8:cf:2\ncell:V115:l:1:f:8:cf:2\ncell:W115:l:1:f:8:cf:2\ncell:O116:l:1:f:8:cf:2\ncell:P116:l:1:f:8:cf:2\ncell:Q116:l:1:f:8:cf:2\ncell:R116:l:1:f:8:cf:2\ncell:S116:l:1:f:8:cf:2\ncell:T116:l:1:f:8:cf:2\ncell:U116:l:1:f:8:cf:2\ncell:V116:l:1:f:8:cf:2\ncell:W116:l:1:f:8:cf:2\ncell:O117:l:1:f:8:cf:2\ncell:P117:l:1:f:8:cf:2\ncell:Q117:l:1:f:8:cf:2\ncell:R117:l:1:f:8:cf:2\ncell:S117:l:1:f:8:cf:2\ncell:T117:l:1:f:8:cf:2\ncell:U117:l:1:f:8:cf:2\ncell:V117:l:1:f:8:cf:2\ncell:W117:l:1:f:8:cf:2\ncell:O118:l:1:f:8:cf:2\ncell:P118:l:1:f:8:cf:2\ncell:Q118:l:1:f:8:cf:2\ncell:R118:l:1:f:8:cf:2\ncell:S118:l:1:f:8:cf:2\ncell:T118:l:1:f:8:cf:2\ncell:U118:l:1:f:8:cf:2\ncell:V118:l:1:f:8:cf:2\ncell:W118:l:1:f:8:cf:2\ncell:O119:l:1:f:8:cf:2\ncell:P119:l:1:f:8:cf:2\ncell:Q119:l:1:f:8:cf:2\ncell:R119:l:1:f:8:cf:2\ncell:S119:l:1:f:8:cf:2\ncell:T119:l:1:f:8:cf:2\ncell:U119:l:1:f:8:cf:2\ncell:V119:l:1:f:8:cf:2\ncell:W119:l:1:f:8:cf:2\ncell:O120:l:1:f:8:cf:2\ncell:P120:l:1:f:8:cf:2\ncell:Q120:l:1:f:8:cf:2\ncell:R120:l:1:f:8:cf:2\ncell:S120:l:1:f:8:cf:2\ncell:T120:l:1:f:8:cf:2\ncell:U120:l:1:f:8:cf:2\ncell:V120:l:1:f:8:cf:2\ncell:W120:l:1:f:8:cf:2\ncell:O121:l:1:f:8:cf:2\ncell:P121:l:1:f:8:cf:2\ncell:Q121:l:1:f:8:cf:2\ncell:R121:l:1:f:8:cf:2\ncell:S121:l:1:f:8:cf:2\ncell:T121:l:1:f:8:cf:2\ncell:U121:l:1:f:8:cf:2\ncell:V121:l:1:f:8:cf:2\ncell:W121:l:1:f:8:cf:2\ncell:O122:l:1:f:8:cf:2\ncell:P122:l:1:f:8:cf:2\ncell:Q122:l:1:f:8:cf:2\ncell:R122:l:1:f:8:cf:2\ncell:S122:l:1:f:8:cf:2\ncell:T122:l:1:f:8:cf:2\ncell:U122:l:1:f:8:cf:2\ncell:V122:l:1:f:8:cf:2\ncell:W122:l:1:f:8:cf:2\ncell:O123:l:1:f:8:cf:2\ncell:P123:l:1:f:8:cf:2\ncell:Q123:l:1:f:8:cf:2\ncell:R123:l:1:f:8:cf:2\ncell:S123:l:1:f:8:cf:2\ncell:T123:l:1:f:8:cf:2\ncell:U123:l:1:f:8:cf:2\ncell:V123:l:1:f:8:cf:2\ncell:W123:l:1:f:8:cf:2\ncell:O124:l:1:f:8:cf:2\ncell:P124:l:1:f:8:cf:2\ncell:Q124:l:1:f:8:cf:2\ncell:R124:l:1:f:8:cf:2\ncell:S124:l:1:f:8:cf:2\ncell:T124:l:1:f:8:cf:2\ncell:U124:l:1:f:8:cf:2\ncell:V124:l:1:f:8:cf:2\ncell:W124:l:1:f:8:cf:2\ncell:O125:l:1:f:8:cf:2\ncell:P125:l:1:f:8:cf:2\ncell:Q125:l:1:f:8:cf:2\ncell:R125:l:1:f:8:cf:2\ncell:S125:l:1:f:8:cf:2\ncell:T125:l:1:f:8:cf:2\ncell:U125:l:1:f:8:cf:2\ncell:V125:l:1:f:8:cf:2\ncell:W125:l:1:f:8:cf:2\ncell:O126:l:1:f:8:cf:2\ncell:P126:l:1:f:8:cf:2\ncell:Q126:l:1:f:8:cf:2\ncell:R126:l:1:f:8:cf:2\ncell:S126:l:1:f:8:cf:2\ncell:T126:l:1:f:8:cf:2\ncell:U126:l:1:f:8:cf:2\ncell:V126:l:1:f:8:cf:2\ncell:W126:l:1:f:8:cf:2\ncell:O127:l:1:f:8:cf:2\ncell:P127:l:1:f:8:cf:2\ncell:Q127:l:1:f:8:cf:2\ncell:R127:l:1:f:8:cf:2\ncell:S127:l:1:f:8:cf:2\ncell:T127:l:1:f:8:cf:2\ncell:U127:l:1:f:8:cf:2\ncell:V127:l:1:f:8:cf:2\ncell:W127:l:1:f:8:cf:2\ncell:O128:l:1:f:8:cf:2\ncell:P128:l:1:f:8:cf:2\ncell:Q128:l:1:f:8:cf:2\ncell:R128:l:1:f:8:cf:2\ncell:S128:l:1:f:8:cf:2\ncell:T128:l:1:f:8:cf:2\ncell:U128:l:1:f:8:cf:2\ncell:V128:l:1:f:8:cf:2\ncell:W128:l:1:f:8:cf:2\ncell:O129:l:1:f:8:cf:2\ncell:P129:l:1:f:8:cf:2\ncell:Q129:l:1:f:8:cf:2\ncell:R129:l:1:f:8:cf:2\ncell:S129:l:1:f:8:cf:2\ncell:T129:l:1:f:8:cf:2\ncell:U129:l:1:f:8:cf:2\ncell:V129:l:1:f:8:cf:2\ncell:W129:l:1:f:8:cf:2\ncell:O130:l:1:f:8:cf:2\ncell:P130:l:1:f:8:cf:2\ncell:Q130:l:1:f:8:cf:2\ncell:R130:l:1:f:8:cf:2\ncell:S130:l:1:f:8:cf:2\ncell:T130:l:1:f:8:cf:2\ncell:U130:l:1:f:8:cf:2\ncell:V130:l:1:f:8:cf:2\ncell:W130:l:1:f:8:cf:2\ncell:O131:l:1:f:8:cf:2\ncell:P131:l:1:f:8:cf:2\ncell:Q131:l:1:f:8:cf:2\ncell:R131:l:1:f:8:cf:2\ncell:S131:l:1:f:8:cf:2\ncell:T131:l:1:f:8:cf:2\ncell:U131:l:1:f:8:cf:2\ncell:V131:l:1:f:8:cf:2\ncell:W131:l:1:f:8:cf:2\ncell:O132:l:1:f:8:cf:2\ncell:P132:l:1:f:8:cf:2\ncell:Q132:l:1:f:8:cf:2\ncell:R132:l:1:f:8:cf:2\ncell:S132:l:1:f:8:cf:2\ncell:T132:l:1:f:8:cf:2\ncell:U132:l:1:f:8:cf:2\ncell:V132:l:1:f:8:cf:2\ncell:W132:l:1:f:8:cf:2\ncell:O133:l:1:f:8:cf:2\ncell:P133:l:1:f:8:cf:2\ncell:Q133:l:1:f:8:cf:2\ncell:R133:l:1:f:8:cf:2\ncell:S133:l:1:f:8:cf:2\ncell:T133:l:1:f:8:cf:2\ncell:U133:l:1:f:8:cf:2\ncell:V133:l:1:f:8:cf:2\ncell:W133:l:1:f:8:cf:2\ncell:O134:l:1:f:8:cf:2\ncell:P134:l:1:f:8:cf:2\ncell:Q134:l:1:f:8:cf:2\ncell:R134:l:1:f:8:cf:2\ncell:S134:l:1:f:8:cf:2\ncell:T134:l:1:f:8:cf:2\ncell:U134:l:1:f:8:cf:2\ncell:V134:l:1:f:8:cf:2\ncell:W134:l:1:f:8:cf:2\ncell:O135:l:1:f:8:cf:2\ncell:P135:l:1:f:8:cf:2\ncell:Q135:l:1:f:8:cf:2\ncell:R135:l:1:f:8:cf:2\ncell:S135:l:1:f:8:cf:2\ncell:T135:l:1:f:8:cf:2\ncell:U135:l:1:f:8:cf:2\ncell:V135:l:1:f:8:cf:2\ncell:W135:l:1:f:8:cf:2\ncell:O136:l:1:f:8:cf:2\ncell:P136:l:1:f:8:cf:2\ncell:Q136:l:1:f:8:cf:2\ncell:R136:l:1:f:8:cf:2\ncell:S136:l:1:f:8:cf:2\ncell:T136:l:1:f:8:cf:2\ncell:U136:l:1:f:8:cf:2\ncell:V136:l:1:f:8:cf:2\ncell:W136:l:1:f:8:cf:2\ncell:O137:l:1:f:8:cf:2\ncell:P137:l:1:f:8:cf:2\ncell:Q137:l:1:f:8:cf:2\ncell:R137:l:1:f:8:cf:2\ncell:S137:l:1:f:8:cf:2\ncell:T137:l:1:f:8:cf:2\ncell:U137:l:1:f:8:cf:2\ncell:V137:l:1:f:8:cf:2\ncell:W137:l:1:f:8:cf:2\ncell:O138:l:1:f:8:cf:2\ncell:P138:l:1:f:8:cf:2\ncell:Q138:l:1:f:8:cf:2\ncell:R138:l:1:f:8:cf:2\ncell:S138:l:1:f:8:cf:2\ncell:T138:l:1:f:8:cf:2\ncell:U138:l:1:f:8:cf:2\ncell:V138:l:1:f:8:cf:2\ncell:W138:l:1:f:8:cf:2\ncell:O139:l:1:f:8:cf:2\ncell:P139:l:1:f:8:cf:2\ncell:Q139:l:1:f:8:cf:2\ncell:R139:l:1:f:8:cf:2\ncell:S139:l:1:f:8:cf:2\ncell:T139:l:1:f:8:cf:2\ncell:U139:l:1:f:8:cf:2\ncell:V139:l:1:f:8:cf:2\ncell:W139:l:1:f:8:cf:2\ncell:O140:l:1:f:8:cf:2\ncell:P140:l:1:f:8:cf:2\ncell:Q140:l:1:f:8:cf:2\ncell:R140:l:1:f:8:cf:2\ncell:S140:l:1:f:8:cf:2\ncell:T140:l:1:f:8:cf:2\ncell:U140:l:1:f:8:cf:2\ncell:V140:l:1:f:8:cf:2\ncell:W140:l:1:f:8:cf:2\ncell:O141:l:1:f:8:cf:2\ncell:P141:l:1:f:8:cf:2\ncell:Q141:l:1:f:8:cf:2\ncell:R141:l:1:f:8:cf:2\ncell:S141:l:1:f:8:cf:2\ncell:T141:l:1:f:8:cf:2\ncell:U141:l:1:f:8:cf:2\ncell:V141:l:1:f:8:cf:2\ncell:W141:l:1:f:8:cf:2\ncell:O142:l:1:f:8:cf:2\ncell:P142:l:1:f:8:cf:2\ncell:Q142:l:1:f:8:cf:2\ncell:R142:l:1:f:8:cf:2\ncell:S142:l:1:f:8:cf:2\ncell:T142:l:1:f:8:cf:2\ncell:U142:l:1:f:8:cf:2\ncell:V142:l:1:f:8:cf:2\ncell:W142:l:1:f:8:cf:2\ncell:O143:l:1:f:8:cf:2\ncell:P143:l:1:f:8:cf:2\ncell:Q143:l:1:f:8:cf:2\ncell:R143:l:1:f:8:cf:2\ncell:S143:l:1:f:8:cf:2\ncell:T143:l:1:f:8:cf:2\ncell:U143:l:1:f:8:cf:2\ncell:V143:l:1:f:8:cf:2\ncell:W143:l:1:f:8:cf:2\ncell:O144:l:1:f:8:cf:2\ncell:P144:l:1:f:8:cf:2\ncell:Q144:l:1:f:8:cf:2\ncell:R144:l:1:f:8:cf:2\ncell:S144:l:1:f:8:cf:2\ncell:T144:l:1:f:8:cf:2\ncell:U144:l:1:f:8:cf:2\ncell:V144:l:1:f:8:cf:2\ncell:W144:l:1:f:8:cf:2\ncell:O145:l:1:f:8:cf:2\ncell:P145:l:1:f:8:cf:2\ncell:Q145:l:1:f:8:cf:2\ncell:R145:l:1:f:8:cf:2\ncell:S145:l:1:f:8:cf:2\ncell:T145:l:1:f:8:cf:2\ncell:U145:l:1:f:8:cf:2\ncell:V145:l:1:f:8:cf:2\ncell:W145:l:1:f:8:cf:2\ncell:O146:l:1:f:8:cf:2\ncell:P146:l:1:f:8:cf:2\ncell:Q146:l:1:f:8:cf:2\ncell:R146:l:1:f:8:cf:2\ncell:S146:l:1:f:8:cf:2\ncell:T146:l:1:f:8:cf:2\ncell:U146:l:1:f:8:cf:2\ncell:V146:l:1:f:8:cf:2\ncell:W146:l:1:f:8:cf:2\ncell:O147:l:1:f:8:cf:2\ncell:P147:l:1:f:8:cf:2\ncell:Q147:l:1:f:8:cf:2\ncell:R147:l:1:f:8:cf:2\ncell:S147:l:1:f:8:cf:2\ncell:T147:l:1:f:8:cf:2\ncell:U147:l:1:f:8:cf:2\ncell:V147:l:1:f:8:cf:2\ncell:W147:l:1:f:8:cf:2\ncell:O148:l:1:f:8:cf:2\ncell:P148:l:1:f:8:cf:2\ncell:Q148:l:1:f:8:cf:2\ncell:R148:l:1:f:8:cf:2\ncell:S148:l:1:f:8:cf:2\ncell:T148:l:1:f:8:cf:2\ncell:U148:l:1:f:8:cf:2\ncell:V148:l:1:f:8:cf:2\ncell:W148:l:1:f:8:cf:2\ncell:O149:l:1:f:8:cf:2\ncell:P149:l:1:f:8:cf:2\ncell:Q149:l:1:f:8:cf:2\ncell:R149:l:1:f:8:cf:2\ncell:S149:l:1:f:8:cf:2\ncell:T149:l:1:f:8:cf:2\ncell:U149:l:1:f:8:cf:2\ncell:V149:l:1:f:8:cf:2\ncell:W149:l:1:f:8:cf:2\ncell:O150:l:1:f:10:cf:2\ncell:P150:l:1:f:10:cf:2\ncell:Q150:l:1:f:10:cf:2\ncell:R150:l:1:f:10:cf:2\ncell:S150:l:1:f:10:cf:2\ncell:T150:l:1:f:10:cf:2\ncell:U150:l:1:f:10:cf:2\ncell:V150:l:1:f:10:cf:2\ncell:W150:l:1:f:10:cf:2\ncell:O151:l:1:f:10:cf:2\ncell:P151:l:1:f:10:cf:2\ncell:Q151:l:1:f:10:cf:2\ncell:R151:l:1:f:10:cf:2\ncell:S151:l:1:f:10:cf:2\ncell:T151:l:1:f:10:cf:2\ncell:U151:l:1:f:10:cf:2\ncell:V151:l:1:f:10:cf:2\ncell:W151:l:1:f:10:cf:2\ncell:O152:l:1:f:10:cf:2\ncell:P152:l:1:f:10:cf:2\ncell:Q152:l:1:f:10:cf:2\ncell:R152:l:1:f:10:cf:2\ncell:S152:l:1:f:10:cf:2\ncell:T152:l:1:f:10:cf:2\ncell:U152:l:1:f:10:cf:2\ncell:V152:l:1:f:10:cf:2\ncell:W152:l:1:f:10:cf:2\ncell:O153:l:1:f:10:cf:2\ncell:P153:l:1:f:10:cf:2\ncell:Q153:l:1:f:10:cf:2\ncell:R153:l:1:f:10:cf:2\ncell:S153:l:1:f:10:cf:2\ncell:T153:l:1:f:10:cf:2\ncell:U153:l:1:f:10:cf:2\ncell:V153:l:1:f:10:cf:2\ncell:W153:l:1:f:10:cf:2\ncell:A154:l:1:f:10:cf:2\ncell:B154:l:1:f:10:cf:2\ncell:C154:l:1:f:10:cf:2\ncell:D154:l:1:f:10:cf:2\ncell:E154:l:1:f:10:cf:2\ncell:F154:t:Monthly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G154:l:1:f:10:cf:2\ncell:H154:l:1:f:10:cf:2\ncell:I154:l:1:f:10:cf:2\ncell:J154:l:1:f:10:cf:2\ncell:K154:l:1:f:10:cf:2\ncell:L154:l:1:f:10:cf:2\ncell:M154:l:1:f:10:cf:2\ncell:N154:l:1:f:10:cf:2\ncell:O154:l:1:f:10:cf:2\ncell:P154:l:1:f:10:cf:2\ncell:Q154:l:1:f:10:cf:2\ncell:R154:l:1:f:10:cf:2\ncell:S154:l:1:f:10:cf:2\ncell:T154:l:1:f:10:cf:2\ncell:U154:l:1:f:10:cf:2\ncell:V154:l:1:f:10:cf:2\ncell:W154:l:1:f:10:cf:2\ncell:A155:l:1:f:10:cf:2\ncell:B155:l:1:f:10:cf:2\ncell:C155:l:1:f:10:cf:2\ncell:D155:l:1:f:10:cf:2\ncell:E155:l:1:f:10:cf:2\ncell:F155:t:Semi-Annually:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G155:l:1:f:10:cf:2\ncell:H155:l:1:f:10:cf:2\ncell:I155:l:1:f:10:cf:2\ncell:J155:l:1:f:10:cf:2\ncell:K155:l:1:f:10:cf:2\ncell:L155:l:1:f:10:cf:2\ncell:M155:l:1:f:10:cf:2\ncell:N155:l:1:f:10:cf:2\ncell:O155:l:1:f:10:cf:2\ncell:P155:l:1:f:10:cf:2\ncell:Q155:l:1:f:10:cf:2\ncell:R155:l:1:f:10:cf:2\ncell:S155:l:1:f:10:cf:2\ncell:T155:l:1:f:10:cf:2\ncell:U155:l:1:f:10:cf:2\ncell:V155:l:1:f:10:cf:2\ncell:W155:l:1:f:10:cf:2\ncell:A156:l:1:f:10:cf:2\ncell:B156:l:1:f:10:cf:2\ncell:C156:l:1:f:10:cf:2\ncell:D156:l:1:f:10:cf:2\ncell:E156:l:1:f:10:cf:2\ncell:F156:t:Quarterly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G156:l:1:f:10:cf:2\ncell:H156:l:1:f:10:cf:2\ncell:I156:l:1:f:10:cf:2\ncell:J156:l:1:f:10:cf:2\ncell:K156:l:1:f:10:cf:2\ncell:L156:l:1:f:10:cf:2\ncell:M156:l:1:f:10:cf:2\ncell:N156:l:1:f:10:cf:2\ncell:O156:l:1:f:10:cf:2\ncell:P156:l:1:f:10:cf:2\ncell:Q156:l:1:f:10:cf:2\ncell:R156:l:1:f:10:cf:2\ncell:S156:l:1:f:10:cf:2\ncell:T156:l:1:f:10:cf:2\ncell:U156:l:1:f:10:cf:2\ncell:V156:l:1:f:10:cf:2\ncell:W156:l:1:f:10:cf:2\ncell:A157:l:1:f:10:cf:2\ncell:B157:l:1:f:10:cf:2\ncell:C157:l:1:f:10:cf:2\ncell:D157:l:1:f:10:cf:2\ncell:E157:l:1:f:10:cf:2\ncell:F157:t:Yearly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G157:l:1:f:10:cf:2\ncell:H157:l:1:f:10:cf:2\ncell:I157:l:1:f:10:cf:2\ncell:J157:l:1:f:10:cf:2\ncell:K157:l:1:f:10:cf:2\ncell:L157:l:1:f:10:cf:2\ncell:M157:l:1:f:10:cf:2\ncell:N157:l:1:f:10:cf:2\ncell:O157:l:1:f:10:cf:2\ncell:P157:l:1:f:10:cf:2\ncell:Q157:l:1:f:10:cf:2\ncell:R157:l:1:f:10:cf:2\ncell:S157:l:1:f:10:cf:2\ncell:T157:l:1:f:10:cf:2\ncell:U157:l:1:f:10:cf:2\ncell:V157:l:1:f:10:cf:2\ncell:W157:l:1:f:10:cf:2\ncell:A158:l:1:f:10:cf:2\ncell:B158:l:1:f:10:cf:2\ncell:C158:l:1:f:10:cf:2\ncell:D158:l:1:f:10:cf:2\ncell:E158:l:1:f:10:cf:2\ncell:F158:l:1:f:10:cf:2\ncell:G158:l:1:f:10:cf:2\ncell:H158:l:1:f:10:cf:2\ncell:I158:l:1:f:10:cf:2\ncell:J158:l:1:f:10:cf:2\ncell:K158:l:1:f:10:cf:2\ncell:L158:l:1:f:10:cf:2\ncell:M158:l:1:f:10:cf:2\ncell:N158:l:1:f:10:cf:2\ncell:O158:l:1:f:10:cf:2\ncell:P158:l:1:f:10:cf:2\ncell:Q158:l:1:f:10:cf:2\ncell:R158:l:1:f:10:cf:2\ncell:S158:l:1:f:10:cf:2\ncell:T158:l:1:f:10:cf:2\ncell:U158:l:1:f:10:cf:2\ncell:V158:l:1:f:10:cf:2\ncell:W158:l:1:f:10:cf:2\ncell:A159:l:1:f:10:cf:2\ncell:B159:l:1:f:10:cf:2\ncell:C159:l:1:f:10:cf:2\ncell:D159:l:1:f:10:cf:2\ncell:E159:l:1:f:10:cf:2\ncell:F159:l:1:f:10:cf:2\ncell:G159:l:1:f:10:cf:2\ncell:H159:l:1:f:10:cf:2\ncell:I159:l:1:f:10:cf:2\ncell:J159:l:1:f:10:cf:2\ncell:K159:l:1:f:10:cf:2\ncell:L159:l:1:f:10:cf:2\ncell:M159:l:1:f:10:cf:2\ncell:N159:l:1:f:10:cf:2\ncell:O159:l:1:f:10:cf:2\ncell:P159:l:1:f:10:cf:2\ncell:Q159:l:1:f:10:cf:2\ncell:R159:l:1:f:10:cf:2\ncell:S159:l:1:f:10:cf:2\ncell:T159:l:1:f:10:cf:2\ncell:U159:l:1:f:10:cf:2\ncell:V159:l:1:f:10:cf:2\ncell:W159:l:1:f:10:cf:2\ncell:A160:l:1:f:10:cf:2\ncell:B160:l:1:f:10:cf:2\ncell:C160:l:1:f:10:cf:2\ncell:D160:l:1:f:10:cf:2\ncell:E160:l:1:f:10:cf:2\ncell:F160:l:1:f:10:cf:2\ncell:G160:l:1:f:10:cf:2\ncell:H160:l:1:f:10:cf:2\ncell:I160:l:1:f:10:cf:2\ncell:J160:l:1:f:10:cf:2\ncell:K160:l:1:f:10:cf:2\ncell:L160:l:1:f:10:cf:2\ncell:M160:l:1:f:10:cf:2\ncell:N160:l:1:f:10:cf:2\ncell:O160:l:1:f:10:cf:2\ncell:P160:l:1:f:10:cf:2\ncell:Q160:l:1:f:10:cf:2\ncell:R160:l:1:f:10:cf:2\ncell:S160:l:1:f:10:cf:2\ncell:T160:l:1:f:10:cf:2\ncell:U160:l:1:f:10:cf:2\ncell:V160:l:1:f:10:cf:2\ncell:W160:l:1:f:10:cf:2\ncell:A161:l:1:f:10:cf:2\ncell:B161:l:1:f:10:cf:2\ncell:C161:l:1:f:10:cf:2\ncell:D161:l:1:f:10:cf:2\ncell:E161:l:1:f:10:cf:2\ncell:F161:l:1:f:10:cf:2\ncell:G161:l:1:f:10:cf:2\ncell:H161:l:1:f:10:cf:2\ncell:I161:l:1:f:10:cf:2\ncell:J161:l:1:f:10:cf:2\ncell:K161:l:1:f:10:cf:2\ncell:L161:l:1:f:10:cf:2\ncell:M161:l:1:f:10:cf:2\ncell:N161:l:1:f:10:cf:2\ncell:O161:l:1:f:10:cf:2\ncell:P161:l:1:f:10:cf:2\ncell:Q161:l:1:f:10:cf:2\ncell:R161:l:1:f:10:cf:2\ncell:S161:l:1:f:10:cf:2\ncell:T161:l:1:f:10:cf:2\ncell:U161:l:1:f:10:cf:2\ncell:V161:l:1:f:10:cf:2\ncell:W161:l:1:f:10:cf:2\ncell:A162:l:1:f:10:cf:2\ncell:B162:l:1:f:10:cf:2\ncell:C162:l:1:f:10:cf:2\ncell:D162:l:1:f:10:cf:2\ncell:E162:l:1:f:10:cf:2\ncell:F162:l:1:f:10:cf:2\ncell:G162:l:1:f:10:cf:2\ncell:H162:l:1:f:10:cf:2\ncell:I162:l:1:f:10:cf:2\ncell:J162:l:1:f:10:cf:2\ncell:K162:l:1:f:10:cf:2\ncell:L162:l:1:f:10:cf:2\ncell:M162:l:1:f:10:cf:2\ncell:N162:l:1:f:10:cf:2\ncell:O162:l:1:f:10:cf:2\ncell:P162:l:1:f:10:cf:2\ncell:Q162:l:1:f:10:cf:2\ncell:R162:l:1:f:10:cf:2\ncell:S162:l:1:f:10:cf:2\ncell:T162:l:1:f:10:cf:2\ncell:U162:l:1:f:10:cf:2\ncell:V162:l:1:f:10:cf:2\ncell:W162:l:1:f:10:cf:2\ncell:A163:l:1:f:10:cf:2\ncell:B163:l:1:f:10:cf:2\ncell:C163:l:1:f:10:cf:2\ncell:D163:l:1:f:10:cf:2\ncell:E163:l:1:f:10:cf:2\ncell:F163:l:1:f:10:cf:2\ncell:G163:l:1:f:10:cf:2\ncell:H163:l:1:f:10:cf:2\ncell:I163:l:1:f:10:cf:2\ncell:J163:l:1:f:10:cf:2\ncell:K163:l:1:f:10:cf:2\ncell:L163:l:1:f:10:cf:2\ncell:M163:l:1:f:10:cf:2\ncell:N163:l:1:f:10:cf:2\ncell:O163:l:1:f:10:cf:2\ncell:P163:l:1:f:10:cf:2\ncell:Q163:l:1:f:10:cf:2\ncell:R163:l:1:f:10:cf:2\ncell:S163:l:1:f:10:cf:2\ncell:T163:l:1:f:10:cf:2\ncell:U163:l:1:f:10:cf:2\ncell:V163:l:1:f:10:cf:2\ncell:W163:l:1:f:10:cf:2\ncell:A164:l:1:f:10:cf:2\ncell:B164:l:1:f:10:cf:2\ncell:C164:l:1:f:10:cf:2\ncell:D164:l:1:f:10:cf:2\ncell:E164:l:1:f:10:cf:2\ncell:F164:l:1:f:10:cf:2\ncell:G164:l:1:f:10:cf:2\ncell:H164:l:1:f:10:cf:2\ncell:I164:l:1:f:10:cf:2\ncell:J164:l:1:f:10:cf:2\ncell:K164:l:1:f:10:cf:2\ncell:L164:l:1:f:10:cf:2\ncell:M164:l:1:f:10:cf:2\ncell:N164:l:1:f:10:cf:2\ncell:O164:l:1:f:10:cf:2\ncell:P164:l:1:f:10:cf:2\ncell:Q164:l:1:f:10:cf:2\ncell:R164:l:1:f:10:cf:2\ncell:S164:l:1:f:10:cf:2\ncell:T164:l:1:f:10:cf:2\ncell:U164:l:1:f:10:cf:2\ncell:V164:l:1:f:10:cf:2\ncell:W164:l:1:f:10:cf:2\ncell:A165:l:1:f:10:cf:2\ncell:B165:l:1:f:10:cf:2\ncell:C165:l:1:f:10:cf:2\ncell:D165:l:1:f:10:cf:2\ncell:E165:l:1:f:10:cf:2\ncell:F165:l:1:f:10:cf:2\ncell:G165:l:1:f:10:cf:2\ncell:H165:l:1:f:10:cf:2\ncell:I165:l:1:f:10:cf:2\ncell:J165:l:1:f:10:cf:2\ncell:K165:l:1:f:10:cf:2\ncell:L165:l:1:f:10:cf:2\ncell:M165:l:1:f:10:cf:2\ncell:N165:l:1:f:10:cf:2\ncell:O165:l:1:f:10:cf:2\ncell:P165:l:1:f:10:cf:2\ncell:Q165:l:1:f:10:cf:2\ncell:R165:l:1:f:10:cf:2\ncell:S165:l:1:f:10:cf:2\ncell:T165:l:1:f:10:cf:2\ncell:U165:l:1:f:10:cf:2\ncell:V165:l:1:f:10:cf:2\ncell:W165:l:1:f:10:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:30\nrow:5:h:171\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:18.75\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:15\nrow:17:h:15\nrow:18:h:15\nrow:19:h:15\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nrow:102:h:14.25\nrow:103:h:14.25\nrow:104:h:14.25\nrow:105:h:14.25\nrow:106:h:14.25\nrow:107:h:14.25\nrow:108:h:14.25\nrow:109:h:14.25\nrow:110:h:14.25\nrow:111:h:14.25\nrow:112:h:14.25\nrow:113:h:14.25\nrow:114:h:14.25\nrow:115:h:14.25\nrow:116:h:14.25\nrow:117:h:14.25\nrow:118:h:14.25\nrow:119:h:14.25\nrow:120:h:14.25\nrow:121:h:14.25\nrow:122:h:14.25\nrow:123:h:14.25\nrow:124:h:14.25\nrow:125:h:14.25\nrow:126:h:14.25\nrow:127:h:14.25\nrow:128:h:14.25\nrow:129:h:14.25\nrow:130:h:14.25\nrow:131:h:14.25\nrow:132:h:14.25\nrow:133:h:14.25\nrow:134:h:14.25\nrow:135:h:14.25\nrow:136:h:14.25\nrow:137:h:14.25\nrow:138:h:14.25\nrow:139:h:14.25\nrow:140:h:14.25\nrow:141:h:14.25\nrow:142:h:14.25\nrow:143:h:14.25\nrow:144:h:14.25\nrow:145:h:14.25\nrow:146:h:14.25\nrow:147:h:14.25\nrow:148:h:14.25\nrow:149:h:14.25\nsheet:c:27:r:165:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(136,204,119)\ncolor:4:rgb(230,230,250)\ncolor:5:rgb(255, 255, 255)\ncolor:6:rgb(255,255,187)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 24pt Arial\nfont:6:normal bold 9pt Arial\nfont:7:normal normal * Arial\nfont:8:normal normal 10pt Arial\nfont:9:normal normal 12pt Arial\nfont:10:normal normal 7pt Arial\nfont:11:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\nname:COMPARISON::S91\\cU105\nname:TRACKING::AC91\\cAE105\n', - }, - name: "expense", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:6:cf:2:ntvf:2\ncell:B1:l:1:f:6:cf:2\ncell:C1:l:1:f:6:cf:2\ncell:D1:l:1:f:6:cf:2\ncell:E1:l:1:f:6:cf:2\ncell:F1:l:1:f:6:cf:2\ncell:G1:l:1:f:6:cf:2\ncell:H1:l:1:f:6:cf:2\ncell:I1:l:1:f:6:cf:2\ncell:J1:l:1:f:6:cf:2\ncell:K1:l:1:f:6:cf:2\ncell:L1:l:1:f:6:cf:2\ncell:M1:l:1:f:6:cf:2\ncell:N1:l:1:f:6:cf:2\ncell:O1:l:1:f:6:cf:2\ncell:P1:l:1:f:6:cf:2\ncell:Q1:l:1:f:6:cf:2\ncell:R1:l:1:f:6:cf:2\ncell:S1:l:1:f:6:cf:2\ncell:T1:l:1:f:6:cf:2\ncell:U1:l:1:f:6:cf:2\ncell:V1:l:1:f:6:cf:2\ncell:W1:l:1:f:6:cf:2\ncell:A2:l:1:f:6:cf:2\ncell:B2:l:1:f:6:cf:2\ncell:C2:l:1:f:6:cf:2\ncell:D2:t:Expenses:l:2:f:3:cf:2\ncell:E2:l:1:f:6:cf:2\ncell:F2:l:1:f:6:cf:2\ncell:G2:l:1:f:6:cf:2\ncell:H2:l:1:f:6:cf:2\ncell:I2:l:1:f:6:cf:2\ncell:J2:l:1:f:6:cf:2\ncell:K2:l:1:f:6:cf:2\ncell:L2:l:1:f:6:cf:2\ncell:M2:l:1:f:6:cf:2\ncell:N2:l:1:f:6:cf:2\ncell:O2:l:1:f:6:cf:2\ncell:P2:l:1:f:6:cf:2\ncell:Q2:l:1:f:6:cf:2\ncell:R2:l:1:f:6:cf:2\ncell:S2:l:1:f:6:cf:2\ncell:T2:l:1:f:6:cf:2\ncell:U2:l:1:f:6:cf:2\ncell:V2:l:1:f:6:cf:2\ncell:W2:l:1:f:6:cf:2\ncell:A3:l:1:f:6:cf:2\ncell:B3:l:1:f:6:cf:2\ncell:C3:l:1:f:6:cf:2\ncell:D3:l:1:f:6:cf:2\ncell:G3:l:1:f:6:cf:2\ncell:H3:l:1:f:6:cf:2\ncell:I3:l:1:f:6:cf:2\ncell:J3:l:1:f:6:cf:2\ncell:K3:l:1:f:6:cf:2\ncell:L3:l:1:f:6:cf:2\ncell:M3:l:1:f:6:cf:2\ncell:N3:l:1:f:6:cf:2\ncell:O3:l:1:f:6:cf:2\ncell:P3:l:1:f:6:cf:2\ncell:Q3:t: :l:1:f:6:cf:2\ncell:R3:l:1:f:6:cf:2\ncell:S3:l:1:f:6:cf:2\ncell:T3:l:1:f:6:cf:2\ncell:U3:l:1:f:6:cf:2\ncell:V3:l:1:f:6:cf:2\ncell:W3:l:1:f:6:cf:2\ncell:B4:t:Food & Beverages:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C4:b:2:2:2:2:l:3:f:2:c:4:bg:2:cf:2\ncell:D4:b:2:2:2:2:l:3:f:2:c:4:bg:2:cf:1\ncell:E4:vtf:n:511:E5+E9:b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F4:vtf:n:6132:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O4:l:1:f:6:cf:2\ncell:P4:l:1:f:6:cf:2\ncell:Q4:l:1:f:6:cf:2\ncell:R4:l:1:f:6:cf:2\ncell:S4:l:1:f:6:cf:2\ncell:T4:l:1:f:6:cf:2\ncell:U4:l:1:f:6:cf:2\ncell:V4:l:1:f:6:cf:2\ncell:W4:l:1:f:6:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:5:c:1:bg:5\ncell:C5:t:Food at home:l:3:f:5:c:1:bg:5:cf:2:colspan:2\ncell:D5:t::b::1:1::l:3:f:5:c:1:bg:5:cf:2\ncell:E5:vtf:n:302:SUM(E6\\cE8):b:::1::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:F5:vtf:n:3624:IF( (E5*12)=0,"",(E5*12)):b::1:::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:6:cf:2\ncell:P5:l:1:f:6:cf:2\ncell:Q5:l:1:f:6:cf:2\ncell:R5:l:1:f:6:cf:2\ncell:S5:l:1:f:6:cf:2\ncell:T5:l:1:f:6:cf:2\ncell:U5:l:1:f:6:cf:2\ncell:V5:l:1:f:6:cf:2\ncell:W5:l:1:f:6:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:6:cf:2\ncell:C6:l:3:f:6:cf:2\ncell:D6:t:Groceries:l:3:f:5:cf:2\ncell:E6:v:302:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F6:vtf:n:3624:IF( (E6*12)=0,"",(E6*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:6:cf:2\ncell:P6:l:1:f:6:cf:2\ncell:Q6:l:1:f:6:cf:2\ncell:R6:l:1:f:6:cf:2\ncell:S6:l:1:f:6:cf:2\ncell:T6:l:1:f:6:cf:2\ncell:U6:l:1:f:6:cf:2\ncell:V6:l:1:f:6:cf:2\ncell:W6:l:1:f:6:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:6:bg:3:cf:2\ncell:C7:l:3:f:6:bg:3:cf:2\ncell:D7:t:Cooking supplies:l:3:f:5:bg:3:cf:2\ncell:E7:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1:::l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:6:cf:2\ncell:P7:l:1:f:6:cf:2\ncell:Q7:l:1:f:6:cf:2\ncell:R7:l:1:f:6:cf:2\ncell:S7:l:1:f:6:cf:2\ncell:T7:l:1:f:6:cf:2\ncell:U7:l:1:f:6:cf:2\ncell:V7:l:1:f:6:cf:2\ncell:W7:l:1:f:6:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:6:cf:2\ncell:C8:l:3:f:6:cf:2\ncell:D8:t:Other:l:3:f:5:cf:2\ncell:E8:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:6:cf:2\ncell:P8:l:1:f:6:cf:2\ncell:Q8:l:1:f:6:cf:2\ncell:R8:l:1:f:6:cf:2\ncell:S8:l:1:f:6:cf:2\ncell:T8:l:1:f:6:cf:2\ncell:U8:l:1:f:6:cf:2\ncell:V8:l:1:f:6:cf:2\ncell:W8:l:1:f:6:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:5:c:1:bg:5\ncell:C9:t:Dining Out:l:3:f:5:c:1:bg:5:cf:2:colspan:2\ncell:D9:t:Tips:b::1:1::l:3:f:5:c:1:bg:5:cf:2\ncell:E9:vtf:n:209:SUM(E10\\cE11):b:::1::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:F9:vtf:n:2508:IF( (E9*12)=0,"",(E9*12)):b::1:::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:6:cf:2\ncell:P9:l:1:f:6:cf:2\ncell:Q9:l:1:f:6:cf:2\ncell:R9:l:1:f:6:cf:2\ncell:S9:l:1:f:6:cf:2\ncell:T9:l:1:f:6:cf:2\ncell:U9:l:1:f:6:cf:2\ncell:V9:l:1:f:6:cf:2\ncell:W9:l:1:f:6:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:6:cf:2\ncell:C10:l:3:f:6:cf:2\ncell:D10:t:Restaurants:b::1:::l:3:f:5:cf:2\ncell:E10:v:209:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F10:vtf:n:2508:IF( (E10*12)=0,"",(E10*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:6:cf:2\ncell:P10:l:1:f:6:cf:2\ncell:Q10:l:1:f:6:cf:2\ncell:R10:l:1:f:6:cf:2\ncell:S10:l:1:f:6:cf:2\ncell:T10:l:1:f:6:cf:2\ncell:U10:l:1:f:6:cf:2\ncell:V10:l:1:f:6:cf:2\ncell:W10:l:1:f:6:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:6:bg:3:cf:2\ncell:C11:l:3:f:6:bg:3:cf:2\ncell:D11:t:Other :l:3:f:5:bg:3:cf:2\ncell:E11:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1:::l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:6:cf:2\ncell:P11:l:1:f:6:cf:2\ncell:Q11:l:1:f:6:cf:2\ncell:R11:l:1:f:6:cf:2\ncell:S11:l:1:f:6:cf:2\ncell:T11:l:1:f:6:cf:2\ncell:U11:l:1:f:6:cf:2\ncell:V11:l:1:f:6:cf:2\ncell:W11:l:1:f:6:cf:2\ncell:B12:t:Clothes & Personal Services:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C12:l:3:f:2:c:4:bg:2:cf:2\ncell:D12:l:3:f:2:c:4:bg:2:cf:1\ncell:E12:vtf:n:191:SUM(E13\\cE16):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F12:vtf:n:2292:IF( (E12*12)=0,"",(E12*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O12:l:1:f:6:cf:2\ncell:P12:l:1:f:6:cf:2\ncell:Q12:l:1:f:6:cf:2\ncell:R12:l:1:f:6:cf:2\ncell:S12:l:1:f:6:cf:2\ncell:T12:l:1:f:6:cf:2\ncell:U12:l:1:f:6:cf:2\ncell:V12:l:1:f:6:cf:2\ncell:W12:l:1:f:6:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:6:cf:2\ncell:C13:l:3:f:6:cf:2\ncell:D13:t:Clothes:l:3:f:5:cf:2\ncell:E13:v:142:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F13:vtf:n:1704:IF( (E13*12)=0,"",(E13*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:6:cf:2\ncell:P13:l:1:f:6:cf:2\ncell:Q13:l:1:f:6:cf:2\ncell:R13:l:1:f:6:cf:2\ncell:S13:l:1:f:6:cf:2\ncell:T13:l:1:f:6:cf:2\ncell:U13:l:1:f:6:cf:2\ncell:V13:l:1:f:6:cf:2\ncell:W13:l:1:f:6:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:6:bg:3:cf:2\ncell:C14:l:3:f:6:bg:3:cf:2\ncell:D14:t:Footwear:l:3:f:5:bg:3:cf:2\ncell:E14:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F14:vtf:t::IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:6:cf:2\ncell:P14:l:1:f:6:cf:2\ncell:Q14:l:1:f:6:cf:2\ncell:R14:l:1:f:6:cf:2\ncell:S14:l:1:f:6:cf:2\ncell:T14:l:1:f:6:cf:2\ncell:U14:l:1:f:6:cf:2\ncell:V14:l:1:f:6:cf:2\ncell:W14:l:1:f:6:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:6:cf:2\ncell:C15:l:3:f:6:cf:2\ncell:D15:t:Salon and Personal Care:l:3:f:5:cf:2\ncell:E15:v:49:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F15:vtf:n:588:IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:6:cf:2\ncell:P15:l:1:f:6:cf:2\ncell:Q15:l:1:f:6:cf:2\ncell:R15:l:1:f:6:cf:2\ncell:S15:l:1:f:6:cf:2\ncell:T15:l:1:f:6:cf:2\ncell:U15:l:1:f:6:cf:2\ncell:V15:l:1:f:6:cf:2\ncell:W15:l:1:f:6:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:6:bg:3:cf:2\ncell:C16:l:3:f:6:bg:3:cf:2\ncell:D16:t:Other:l:3:f:5:bg:3:cf:2\ncell:E16:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:6:cf:2\ncell:P16:l:1:f:6:cf:2\ncell:Q16:l:1:f:6:cf:2\ncell:R16:l:1:f:6:cf:2\ncell:S16:l:1:f:6:cf:2\ncell:T16:l:1:f:6:cf:2\ncell:U16:l:1:f:6:cf:2\ncell:V16:l:1:f:6:cf:2\ncell:W16:l:1:f:6:cf:2\ncell:B17:t:Transportation:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C17:l:3:f:2:c:4:bg:2:cf:2\ncell:D17:l:3:f:2:c:4:bg:2:cf:1\ncell:E17:vtf:n:640:SUM(E18\\cE25):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F17:vtf:n:7680:IF( (E17*12)=0,"",(E17*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O17:l:1:f:6:cf:2\ncell:P17:l:1:f:6:cf:2\ncell:Q17:l:1:f:6:cf:2\ncell:R17:l:1:f:6:cf:2\ncell:S17:l:1:f:6:cf:2\ncell:T17:l:1:f:6:cf:2\ncell:U17:l:1:f:6:cf:2\ncell:V17:l:1:f:6:cf:2\ncell:W17:l:1:f:6:cf:2\ncell:A18:b::1::\ncell:B18:b::::1:l:3:f:6:bg:4:cf:2\ncell:C18:l:3:f:6:bg:4:cf:2\ncell:D18:t:Owned Vehicle Payments:l:3:f:5:bg:4:cf:2\ncell:E18:v:640:b::1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F18:vtf:n:7680:IF( (E18*12)=0,"",(E18*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O18:l:1:f:6:cf:2\ncell:P18:l:1:f:6:cf:2\ncell:Q18:l:1:f:6:cf:2\ncell:R18:l:1:f:6:cf:2\ncell:S18:l:1:f:6:cf:2\ncell:T18:l:1:f:6:cf:2\ncell:U18:l:1:f:6:cf:2\ncell:V18:l:1:f:6:cf:2\ncell:W18:l:1:f:6:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:6:bg:3:cf:2\ncell:C19:l:3:f:6:bg:3:cf:2\ncell:D19:t:Rentals, Lease Payments:l:3:f:5:bg:3:cf:2\ncell:E19:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F19:vtf:t::IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O19:l:1:f:6:cf:2\ncell:P19:l:1:f:6:cf:2\ncell:Q19:l:1:f:6:cf:2\ncell:R19:l:1:f:6:cf:2\ncell:S19:l:1:f:6:cf:2\ncell:T19:l:1:f:6:cf:2\ncell:U19:l:1:f:6:cf:2\ncell:V19:l:1:f:6:cf:2\ncell:W19:l:1:f:6:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:6:bg:4:cf:2\ncell:C20:l:3:f:6:bg:4:cf:2\ncell:D20:t:Gas & Oil:l:3:f:5:bg:4:cf:2\ncell:E20:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O20:l:1:f:6:cf:2\ncell:P20:l:1:f:6:cf:2\ncell:Q20:l:1:f:6:cf:2\ncell:R20:l:1:f:6:cf:2\ncell:S20:l:1:f:6:cf:2\ncell:T20:l:1:f:6:cf:2\ncell:U20:l:1:f:6:cf:2\ncell:V20:l:1:f:6:cf:2\ncell:W20:l:1:f:6:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:6:bg:3:cf:2\ncell:C21:l:3:f:6:bg:3:cf:2\ncell:D21:t:Maintenance & Repairs:l:3:f:5:bg:3:cf:2\ncell:E21:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O21:l:1:f:6:cf:2\ncell:P21:l:1:f:6:cf:2\ncell:Q21:l:1:f:6:cf:2\ncell:R21:l:1:f:6:cf:2\ncell:S21:l:1:f:6:cf:2\ncell:T21:l:1:f:6:cf:2\ncell:U21:l:1:f:6:cf:2\ncell:V21:l:1:f:6:cf:2\ncell:W21:l:1:f:6:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:6:bg:4:cf:2\ncell:C22:l:3:f:6:bg:4:cf:2\ncell:D22:t:Vehicle Insurance:l:3:f:5:bg:4:cf:2\ncell:E22:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O22:l:1:f:6:cf:2\ncell:P22:l:1:f:6:cf:2\ncell:Q22:l:1:f:6:cf:2\ncell:R22:l:1:f:6:cf:2\ncell:S22:l:1:f:6:cf:2\ncell:T22:l:1:f:6:cf:2\ncell:U22:l:1:f:6:cf:2\ncell:V22:l:1:f:6:cf:2\ncell:W22:l:1:f:6:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:6:bg:3:cf:2\ncell:C23:l:3:f:6:bg:3:cf:2\ncell:D23:t:License, Registration:l:3:f:5:bg:3:cf:2\ncell:E23:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O23:l:1:f:6:cf:2\ncell:P23:l:1:f:6:cf:2\ncell:Q23:l:1:f:6:cf:2\ncell:R23:l:1:f:6:cf:2\ncell:S23:l:1:f:6:cf:2\ncell:T23:l:1:f:6:cf:2\ncell:U23:l:1:f:6:cf:2\ncell:V23:l:1:f:6:cf:2\ncell:W23:l:1:f:6:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:6:bg:4:cf:2\ncell:C24:l:3:f:6:bg:4:cf:2\ncell:D24:t:Commuting Expense:l:3:f:5:bg:4:cf:2\ncell:E24:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O24:l:1:f:6:cf:2\ncell:P24:l:1:f:6:cf:2\ncell:Q24:l:1:f:6:cf:2\ncell:R24:l:1:f:6:cf:2\ncell:S24:l:1:f:6:cf:2\ncell:T24:l:1:f:6:cf:2\ncell:U24:l:1:f:6:cf:2\ncell:V24:l:1:f:6:cf:2\ncell:W24:l:1:f:6:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:6:bg:3:cf:2\ncell:C25:l:3:f:6:bg:3:cf:2\ncell:D25:t:Other:l:3:f:5:bg:3:cf:2\ncell:E25:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F25:vtf:t::IF( (E25*12)=0,"",(E25*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O25:l:1:f:6:cf:2\ncell:P25:l:1:f:6:cf:2\ncell:Q25:l:1:f:6:cf:2\ncell:R25:l:1:f:6:cf:2\ncell:S25:l:1:f:6:cf:2\ncell:T25:l:1:f:6:cf:2\ncell:U25:l:1:f:6:cf:2\ncell:V25:l:1:f:6:cf:2\ncell:W25:l:1:f:6:cf:2\ncell:B26:t:Healthcare:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C26:l:3:f:2:c:4:bg:2:cf:2\ncell:D26:l:3:f:2:c:4:bg:2:cf:1\ncell:E26:vtf:n:263:SUM(E27\\cE31):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F26:vtf:n:3156:IF( (E26*12)=0,"",(E26*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O26:l:1:f:6:cf:2\ncell:P26:l:1:f:6:cf:2\ncell:Q26:l:1:f:6:cf:2\ncell:R26:l:1:f:6:cf:2\ncell:S26:l:1:f:6:cf:2\ncell:T26:l:1:f:6:cf:2\ncell:U26:l:1:f:6:cf:2\ncell:V26:l:1:f:6:cf:2\ncell:W26:l:1:f:6:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:6:cf:2\ncell:C27:l:3:f:6:cf:2\ncell:D27:t:Health Insurance:l:3:f:5:cf:2\ncell:E27:v:263:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F27:vtf:n:3156:IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:6:cf:2\ncell:P27:l:1:f:6:cf:2\ncell:Q27:l:1:f:6:cf:2\ncell:R27:l:1:f:6:cf:2\ncell:S27:l:1:f:6:cf:2\ncell:T27:l:1:f:6:cf:2\ncell:U27:l:1:f:6:cf:2\ncell:V27:l:1:f:6:cf:2\ncell:W27:l:1:f:6:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:6:bg:3:cf:2\ncell:C28:l:3:f:6:bg:3:cf:2\ncell:D28:t:Medical Services:l:3:f:5:bg:3:cf:2\ncell:E28:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:6:cf:2\ncell:P28:l:1:f:6:cf:2\ncell:Q28:l:1:f:6:cf:2\ncell:R28:l:1:f:6:cf:2\ncell:S28:l:1:f:6:cf:2\ncell:T28:l:1:f:6:cf:2\ncell:U28:l:1:f:6:cf:2\ncell:V28:l:1:f:6:cf:2\ncell:W28:l:1:f:6:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:6:cf:2\ncell:C29:l:3:f:6:cf:2\ncell:D29:t:Medicine, Drugs & Supplies:l:3:f:5:cf:2\ncell:E29:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:6:cf:2\ncell:P29:l:1:f:6:cf:2\ncell:Q29:l:1:f:6:cf:2\ncell:R29:l:1:f:6:cf:2\ncell:S29:l:1:f:6:cf:2\ncell:T29:l:1:f:6:cf:2\ncell:U29:l:1:f:6:cf:2\ncell:V29:l:1:f:6:cf:2\ncell:W29:l:1:f:6:cf:2\ncell:A30:b::1::\ncell:B30:b::::1:l:3:f:6:bg:3:cf:2\ncell:C30:l:3:f:6:bg:3:cf:2\ncell:D30:t:Heathclub Memberships:l:3:f:5:bg:3:cf:2\ncell:E30:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G30:b::::1\ncell:O30:l:1:f:6:cf:2\ncell:P30:l:1:f:6:cf:2\ncell:Q30:l:1:f:6:cf:2\ncell:R30:l:1:f:6:cf:2\ncell:S30:l:1:f:6:cf:2\ncell:T30:l:1:f:6:cf:2\ncell:U30:l:1:f:6:cf:2\ncell:V30:l:1:f:6:cf:2\ncell:W30:l:1:f:6:cf:2\ncell:A31:b::1::\ncell:B31:b:::1:1:l:3:f:6:cf:2\ncell:C31:b:::1::l:3:f:6:cf:2\ncell:D31:t:Other:b:::1::l:3:f:5:cf:2\ncell:E31:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:G31:b::::1\ncell:O31:l:1:f:6:cf:2\ncell:P31:l:1:f:6:cf:2\ncell:Q31:l:1:f:6:cf:2\ncell:R31:l:1:f:6:cf:2\ncell:S31:l:1:f:6:cf:2\ncell:T31:l:1:f:6:cf:2\ncell:U31:l:1:f:6:cf:2\ncell:V31:l:1:f:6:cf:2\ncell:W31:l:1:f:6:cf:2\ncell:B32:b:1:::\ncell:C32:b:1:::\ncell:D32:b:1:::\ncell:O32:l:1:f:6:cf:2\ncell:P32:l:1:f:6:cf:2\ncell:Q32:l:1:f:6:cf:2\ncell:R32:l:1:f:6:cf:2\ncell:S32:l:1:f:6:cf:2\ncell:T32:l:1:f:6:cf:2\ncell:U32:l:1:f:6:cf:2\ncell:V32:l:1:f:6:cf:2\ncell:W32:l:1:f:6:cf:2\ncell:O33:l:1:f:6:cf:2\ncell:P33:l:1:f:6:cf:2\ncell:Q33:l:1:f:6:cf:2\ncell:R33:l:1:f:6:cf:2\ncell:S33:l:1:f:6:cf:2\ncell:T33:l:1:f:6:cf:2\ncell:U33:l:1:f:6:cf:2\ncell:V33:l:1:f:6:cf:2\ncell:W33:l:1:f:6:cf:2\ncell:O34:l:1:f:6:cf:2\ncell:P34:l:1:f:6:cf:2\ncell:Q34:l:1:f:6:cf:2\ncell:R34:l:1:f:6:cf:2\ncell:S34:l:1:f:6:cf:2\ncell:T34:l:1:f:6:cf:2\ncell:U34:l:1:f:6:cf:2\ncell:V34:l:1:f:6:cf:2\ncell:W34:l:1:f:6:cf:2\ncell:O35:l:1:f:6:cf:2\ncell:P35:l:1:f:6:cf:2\ncell:Q35:l:1:f:6:cf:2\ncell:R35:l:1:f:6:cf:2\ncell:S35:l:1:f:6:cf:2\ncell:T35:l:1:f:6:cf:2\ncell:U35:l:1:f:6:cf:2\ncell:V35:l:1:f:6:cf:2\ncell:W35:l:1:f:6:cf:2\ncell:O36:l:1:f:6:cf:2\ncell:P36:l:1:f:6:cf:2\ncell:Q36:l:1:f:6:cf:2\ncell:R36:l:1:f:6:cf:2\ncell:S36:l:1:f:6:cf:2\ncell:T36:l:1:f:6:cf:2\ncell:U36:l:1:f:6:cf:2\ncell:V36:l:1:f:6:cf:2\ncell:W36:l:1:f:6:cf:2\ncell:O37:l:1:f:6:cf:2\ncell:P37:l:1:f:6:cf:2\ncell:Q37:l:1:f:6:cf:2\ncell:R37:l:1:f:6:cf:2\ncell:S37:l:1:f:6:cf:2\ncell:T37:l:1:f:6:cf:2\ncell:U37:l:1:f:6:cf:2\ncell:V37:l:1:f:6:cf:2\ncell:W37:l:1:f:6:cf:2\ncell:O38:l:1:f:6:cf:2\ncell:P38:l:1:f:6:cf:2\ncell:Q38:l:1:f:6:cf:2\ncell:R38:l:1:f:6:cf:2\ncell:S38:l:1:f:6:cf:2\ncell:T38:l:1:f:6:cf:2\ncell:U38:l:1:f:6:cf:2\ncell:V38:l:1:f:6:cf:2\ncell:W38:l:1:f:6:cf:2\ncell:O39:l:1:f:6:cf:2\ncell:P39:l:1:f:6:cf:2\ncell:Q39:l:1:f:6:cf:2\ncell:R39:l:1:f:6:cf:2\ncell:S39:l:1:f:6:cf:2\ncell:T39:l:1:f:6:cf:2\ncell:U39:l:1:f:6:cf:2\ncell:V39:l:1:f:6:cf:2\ncell:W39:l:1:f:6:cf:2\ncell:O40:l:1:f:6:cf:2\ncell:P40:l:1:f:6:cf:2\ncell:Q40:l:1:f:6:cf:2\ncell:R40:l:1:f:6:cf:2\ncell:S40:l:1:f:6:cf:2\ncell:T40:l:1:f:6:cf:2\ncell:U40:l:1:f:6:cf:2\ncell:V40:l:1:f:6:cf:2\ncell:W40:l:1:f:6:cf:2\ncell:O41:l:1:f:6:cf:2\ncell:P41:l:1:f:6:cf:2\ncell:Q41:l:1:f:6:cf:2\ncell:R41:l:1:f:6:cf:2\ncell:S41:l:1:f:6:cf:2\ncell:T41:l:1:f:6:cf:2\ncell:U41:l:1:f:6:cf:2\ncell:V41:l:1:f:6:cf:2\ncell:W41:l:1:f:6:cf:2\ncell:O42:l:1:f:6:cf:2\ncell:P42:l:1:f:6:cf:2\ncell:Q42:l:1:f:6:cf:2\ncell:R42:l:1:f:6:cf:2\ncell:S42:l:1:f:6:cf:2\ncell:T42:l:1:f:6:cf:2\ncell:U42:l:1:f:6:cf:2\ncell:V42:l:1:f:6:cf:2\ncell:W42:l:1:f:6:cf:2\ncell:O43:l:1:f:6:cf:2\ncell:P43:l:1:f:6:cf:2\ncell:Q43:l:1:f:6:cf:2\ncell:R43:l:1:f:6:cf:2\ncell:S43:l:1:f:6:cf:2\ncell:T43:l:1:f:6:cf:2\ncell:U43:l:1:f:6:cf:2\ncell:V43:l:1:f:6:cf:2\ncell:W43:l:1:f:6:cf:2\ncell:O44:l:1:f:6:cf:2\ncell:P44:l:1:f:6:cf:2\ncell:Q44:l:1:f:6:cf:2\ncell:R44:l:1:f:6:cf:2\ncell:S44:l:1:f:6:cf:2\ncell:T44:l:1:f:6:cf:2\ncell:U44:l:1:f:6:cf:2\ncell:V44:l:1:f:6:cf:2\ncell:W44:l:1:f:6:cf:2\ncell:O45:l:1:f:6:cf:2\ncell:P45:l:1:f:6:cf:2\ncell:Q45:l:1:f:6:cf:2\ncell:R45:l:1:f:6:cf:2\ncell:O46:l:1:f:6:cf:2\ncell:P46:l:1:f:6:cf:2\ncell:Q46:l:1:f:6:cf:2\ncell:R46:l:1:f:6:cf:2\ncell:O47:l:1:f:6:cf:2\ncell:P47:l:1:f:6:cf:2\ncell:Q47:l:1:f:6:cf:2\ncell:R47:l:1:f:6:cf:2\ncell:O48:l:1:f:6:cf:2\ncell:P48:l:1:f:6:cf:2\ncell:Q48:l:1:f:6:cf:2\ncell:R48:l:1:f:6:cf:2\ncell:O49:l:1:f:6:cf:2\ncell:P49:l:1:f:6:cf:2\ncell:Q49:l:1:f:6:cf:2\ncell:R49:l:1:f:6:cf:2\ncell:O50:l:1:f:6:cf:2\ncell:P50:l:1:f:6:cf:2\ncell:Q50:l:1:f:6:cf:2\ncell:R50:l:1:f:6:cf:2\ncell:O51:l:1:f:6:cf:2\ncell:P51:l:1:f:6:cf:2\ncell:Q51:l:1:f:6:cf:2\ncell:R51:l:1:f:6:cf:2\ncell:O52:l:1:f:6:cf:2\ncell:P52:l:1:f:6:cf:2\ncell:Q52:l:1:f:6:cf:2\ncell:R52:l:1:f:6:cf:2\ncell:O53:l:1:f:6:cf:2\ncell:P53:l:1:f:6:cf:2\ncell:Q53:l:1:f:6:cf:2\ncell:R53:l:1:f:6:cf:2\ncell:O54:l:1:f:6:cf:2\ncell:P54:l:1:f:6:cf:2\ncell:Q54:l:1:f:6:cf:2\ncell:R54:l:1:f:6:cf:2\ncell:O55:l:1:f:6:cf:2\ncell:P55:l:1:f:6:cf:2\ncell:Q55:l:1:f:6:cf:2\ncell:R55:l:1:f:6:cf:2\ncell:O56:l:1:f:6:cf:2\ncell:P56:l:1:f:6:cf:2\ncell:Q56:l:1:f:6:cf:2\ncell:R56:l:1:f:6:cf:2\ncell:O57:l:1:f:6:cf:2\ncell:P57:l:1:f:6:cf:2\ncell:Q57:l:1:f:6:cf:2\ncell:R57:l:1:f:6:cf:2\ncell:O58:l:1:f:6:cf:2\ncell:P58:l:1:f:6:cf:2\ncell:Q58:l:1:f:6:cf:2\ncell:R58:l:1:f:6:cf:2\ncell:B59:l:1:f:6:cf:2\ncell:C59:l:1:f:6:cf:2\ncell:D59:l:1:f:2:cf:2\ncell:E59:l:1:f:2:cf:3:ntvf:1\ncell:F59:l:1:f:2:cf:3:ntvf:1\ncell:O59:l:1:f:6:cf:2\ncell:P59:l:1:f:6:cf:2\ncell:Q59:l:1:f:6:cf:2\ncell:R59:l:1:f:6:cf:2\ncell:B60:l:1:f:4:cf:2\ncell:C60:l:1:f:4:cf:2\ncell:D60:l:1:f:8:cf:2\ncell:E60:l:1:f:8:cf:2\ncell:F60:l:1:f:6:cf:2\ncell:O60:l:1:f:6:cf:2\ncell:P60:l:1:f:6:cf:2\ncell:Q60:l:1:f:6:cf:2\ncell:R60:l:1:f:6:cf:2\ncell:O61:l:1:f:6:cf:2\ncell:P61:l:1:f:6:cf:2\ncell:Q61:l:1:f:6:cf:2\ncell:R61:l:1:f:6:cf:2\ncell:O62:l:1:f:6:cf:2\ncell:P62:l:1:f:6:cf:2\ncell:Q62:l:1:f:6:cf:2\ncell:R62:l:1:f:6:cf:2\ncell:O63:l:1:f:6:cf:2\ncell:P63:l:1:f:6:cf:2\ncell:Q63:l:1:f:6:cf:2\ncell:R63:l:1:f:6:cf:2\ncell:O64:l:1:f:6:cf:2\ncell:P64:l:1:f:6:cf:2\ncell:Q64:l:1:f:6:cf:2\ncell:R64:l:1:f:6:cf:2\ncell:O65:l:1:f:6:cf:2\ncell:P65:l:1:f:6:cf:2\ncell:Q65:l:1:f:6:cf:2\ncell:R65:l:1:f:6:cf:2\ncell:O66:l:1:f:6:cf:2\ncell:P66:l:1:f:6:cf:2\ncell:Q66:l:1:f:6:cf:2\ncell:R66:l:1:f:6:cf:2\ncell:O67:l:1:f:6:cf:2\ncell:P67:l:1:f:6:cf:2\ncell:Q67:l:1:f:6:cf:2\ncell:R67:l:1:f:6:cf:2\ncell:O68:l:1:f:6:cf:2\ncell:P68:l:1:f:6:cf:2\ncell:Q68:l:1:f:6:cf:2\ncell:R68:l:1:f:6:cf:2\ncell:O69:l:1:f:6:cf:2\ncell:P69:l:1:f:6:cf:2\ncell:Q69:l:1:f:6:cf:2\ncell:R69:l:1:f:6:cf:2\ncell:O70:l:1:f:6:cf:2\ncell:P70:l:1:f:6:cf:2\ncell:Q70:l:1:f:6:cf:2\ncell:R70:l:1:f:6:cf:2\ncell:S70:l:1:f:6:cf:2\ncell:T70:l:1:f:6:cf:2\ncell:U70:l:1:f:6:cf:2\ncell:V70:l:1:f:6:cf:2\ncell:W70:l:1:f:6:cf:2\ncell:O71:l:1:f:6:cf:2\ncell:P71:l:1:f:6:cf:2\ncell:Q71:l:1:f:6:cf:2\ncell:R71:l:1:f:6:cf:2\ncell:S71:l:1:f:6:cf:2\ncell:T71:l:1:f:6:cf:2\ncell:U71:l:1:f:6:cf:2\ncell:V71:l:1:f:6:cf:2\ncell:W71:l:1:f:6:cf:2\ncell:O72:l:1:f:6:cf:2\ncell:P72:l:1:f:6:cf:2\ncell:Q72:l:1:f:6:cf:2\ncell:R72:l:1:f:6:cf:2\ncell:S72:l:1:f:6:cf:2\ncell:T72:l:1:f:6:cf:2\ncell:U72:l:1:f:6:cf:2\ncell:V72:l:1:f:6:cf:2\ncell:W72:l:1:f:6:cf:2\ncell:O73:l:1:f:6:cf:2\ncell:P73:l:1:f:6:cf:2\ncell:Q73:l:1:f:6:cf:2\ncell:R73:l:1:f:6:cf:2\ncell:S73:l:1:f:6:cf:2\ncell:T73:l:1:f:6:cf:2\ncell:U73:l:1:f:6:cf:2\ncell:V73:l:1:f:6:cf:2\ncell:W73:l:1:f:6:cf:2\ncell:O74:l:1:f:6:cf:2\ncell:P74:l:1:f:6:cf:2\ncell:Q74:l:1:f:6:cf:2\ncell:R74:l:1:f:6:cf:2\ncell:S74:l:1:f:6:cf:2\ncell:T74:l:1:f:6:cf:2\ncell:U74:l:1:f:6:cf:2\ncell:V74:l:1:f:6:cf:2\ncell:W74:l:1:f:6:cf:2\ncell:O75:l:1:f:6:cf:2\ncell:P75:l:1:f:6:cf:2\ncell:Q75:l:1:f:6:cf:2\ncell:R75:l:1:f:6:cf:2\ncell:S75:l:1:f:6:cf:2\ncell:T75:l:1:f:6:cf:2\ncell:U75:l:1:f:6:cf:2\ncell:V75:l:1:f:6:cf:2\ncell:W75:l:1:f:6:cf:2\ncell:O76:l:1:f:6:cf:2\ncell:P76:l:1:f:6:cf:2\ncell:Q76:l:1:f:6:cf:2\ncell:R76:l:1:f:6:cf:2\ncell:S76:l:1:f:6:cf:2\ncell:T76:l:1:f:6:cf:2\ncell:U76:l:1:f:6:cf:2\ncell:V76:l:1:f:6:cf:2\ncell:W76:l:1:f:6:cf:2\ncell:O77:l:1:f:6:cf:2\ncell:P77:l:1:f:6:cf:2\ncell:Q77:l:1:f:6:cf:2\ncell:R77:l:1:f:6:cf:2\ncell:S77:l:1:f:6:cf:2\ncell:T77:l:1:f:6:cf:2\ncell:U77:l:1:f:6:cf:2\ncell:V77:l:1:f:6:cf:2\ncell:W77:l:1:f:6:cf:2\ncell:O78:l:1:f:6:cf:2\ncell:P78:l:1:f:6:cf:2\ncell:Q78:l:1:f:6:cf:2\ncell:R78:l:1:f:6:cf:2\ncell:S78:l:1:f:6:cf:2\ncell:T78:l:1:f:6:cf:2\ncell:U78:l:1:f:6:cf:2\ncell:V78:l:1:f:6:cf:2\ncell:W78:l:1:f:6:cf:2\ncell:O79:l:1:f:6:cf:2\ncell:P79:l:1:f:6:cf:2\ncell:Q79:l:1:f:6:cf:2\ncell:R79:l:1:f:6:cf:2\ncell:S79:l:1:f:6:cf:2\ncell:T79:l:1:f:6:cf:2\ncell:U79:l:1:f:6:cf:2\ncell:V79:l:1:f:6:cf:2\ncell:W79:l:1:f:6:cf:2\ncell:O80:l:1:f:6:cf:2\ncell:P80:l:1:f:6:cf:2\ncell:Q80:l:1:f:6:cf:2\ncell:R80:l:1:f:6:cf:2\ncell:S80:l:1:f:6:cf:2\ncell:T80:l:1:f:6:cf:2\ncell:U80:l:1:f:6:cf:2\ncell:V80:l:1:f:6:cf:2\ncell:W80:l:1:f:6:cf:2\ncell:O81:l:1:f:6:cf:2\ncell:P81:l:1:f:6:cf:2\ncell:Q81:l:1:f:6:cf:2\ncell:R81:l:1:f:6:cf:2\ncell:S81:l:1:f:6:cf:2\ncell:T81:l:1:f:6:cf:2\ncell:U81:l:1:f:6:cf:2\ncell:V81:l:1:f:6:cf:2\ncell:W81:l:1:f:6:cf:2\ncell:O82:l:1:f:6:cf:2\ncell:P82:l:1:f:6:cf:2\ncell:Q82:l:1:f:6:cf:2\ncell:R82:l:1:f:6:cf:2\ncell:S82:l:1:f:6:cf:2\ncell:T82:l:1:f:6:cf:2\ncell:U82:l:1:f:6:cf:2\ncell:V82:l:1:f:6:cf:2\ncell:W82:l:1:f:6:cf:2\ncell:O83:l:1:f:6:cf:2\ncell:P83:l:1:f:6:cf:2\ncell:Q83:l:1:f:6:cf:2\ncell:R83:l:1:f:6:cf:2\ncell:S83:l:1:f:6:cf:2\ncell:T83:l:1:f:6:cf:2\ncell:U83:l:1:f:6:cf:2\ncell:V83:l:1:f:6:cf:2\ncell:W83:l:1:f:6:cf:2\ncell:O84:l:1:f:6:cf:2\ncell:P84:l:1:f:6:cf:2\ncell:Q84:l:1:f:6:cf:2\ncell:R84:l:1:f:6:cf:2\ncell:S84:l:1:f:6:cf:2\ncell:T84:l:1:f:6:cf:2\ncell:U84:l:1:f:6:cf:2\ncell:V84:l:1:f:6:cf:2\ncell:W84:l:1:f:6:cf:2\ncell:O85:l:1:f:6:cf:2\ncell:P85:l:1:f:6:cf:2\ncell:Q85:l:1:f:6:cf:2\ncell:R85:l:1:f:6:cf:2\ncell:S85:l:1:f:6:cf:2\ncell:T85:l:1:f:6:cf:2\ncell:U85:l:1:f:6:cf:2\ncell:V85:l:1:f:6:cf:2\ncell:W85:l:1:f:6:cf:2\ncell:O86:l:1:f:6:cf:2\ncell:P86:l:1:f:6:cf:2\ncell:Q86:l:1:f:6:cf:2\ncell:R86:l:1:f:6:cf:2\ncell:S86:l:1:f:6:cf:2\ncell:T86:l:1:f:6:cf:2\ncell:U86:l:1:f:6:cf:2\ncell:V86:l:1:f:6:cf:2\ncell:W86:l:1:f:6:cf:2\ncell:O87:l:1:f:6:cf:2\ncell:P87:l:1:f:6:cf:2\ncell:Q87:l:1:f:6:cf:2\ncell:R87:l:1:f:6:cf:2\ncell:S87:l:1:f:6:cf:2\ncell:T87:l:1:f:6:cf:2\ncell:U87:l:1:f:6:cf:2\ncell:V87:l:1:f:6:cf:2\ncell:W87:l:1:f:6:cf:2\ncell:O88:l:1:f:6:cf:2\ncell:P88:l:1:f:6:cf:2\ncell:Q88:l:1:f:6:cf:2\ncell:R88:l:1:f:6:cf:2\ncell:S88:l:1:f:6:cf:2\ncell:T88:l:1:f:6:cf:2\ncell:U88:l:1:f:6:cf:2\ncell:V88:l:1:f:6:cf:2\ncell:W88:l:1:f:6:cf:2\ncell:O89:l:1:f:6:cf:2\ncell:P89:l:1:f:6:cf:2\ncell:Q89:l:1:f:6:cf:2\ncell:R89:l:1:f:6:cf:2\ncell:S89:l:1:f:6:cf:2\ncell:T89:l:1:f:6:cf:2\ncell:U89:l:1:f:6:cf:2\ncell:V89:l:1:f:6:cf:2\ncell:W89:l:1:f:6:cf:2\ncell:O90:l:1:f:6:cf:2\ncell:P90:l:1:f:6:cf:2\ncell:Q90:l:1:f:6:cf:2\ncell:R90:l:1:f:6:cf:2\ncell:S90:l:1:f:6:cf:2\ncell:T90:l:1:f:6:cf:2\ncell:U90:l:1:f:6:cf:2\ncell:V90:l:1:f:6:cf:2\ncell:W90:l:1:f:6:cf:2\ncell:O91:l:1:f:6:cf:2\ncell:P91:l:1:f:6:cf:2\ncell:Q91:l:1:f:6:cf:2\ncell:R91:l:1:f:6:cf:2\ncell:S91:l:1:f:6:cf:2\ncell:T91:l:1:f:6:cf:2\ncell:U91:l:1:f:6:cf:2\ncell:V91:l:1:f:6:cf:2\ncell:W91:l:1:f:6:cf:2\ncell:O92:l:1:f:6:cf:2\ncell:P92:l:1:f:6:cf:2\ncell:Q92:l:1:f:6:cf:2\ncell:R92:l:1:f:6:cf:2\ncell:S92:l:1:f:6:cf:2\ncell:T92:l:1:f:6:cf:2\ncell:U92:l:1:f:6:cf:2\ncell:V92:l:1:f:6:cf:2\ncell:W92:l:1:f:6:cf:2\ncell:O93:l:1:f:6:cf:2\ncell:P93:l:1:f:6:cf:2\ncell:Q93:l:1:f:6:cf:2\ncell:R93:l:1:f:6:cf:2\ncell:S93:l:1:f:6:cf:2\ncell:T93:l:1:f:6:cf:2\ncell:U93:l:1:f:6:cf:2\ncell:V93:l:1:f:6:cf:2\ncell:W93:l:1:f:6:cf:2\ncell:O94:l:1:f:6:cf:2\ncell:P94:l:1:f:6:cf:2\ncell:Q94:l:1:f:6:cf:2\ncell:R94:l:1:f:6:cf:2\ncell:S94:l:1:f:6:cf:2\ncell:T94:l:1:f:6:cf:2\ncell:U94:l:1:f:6:cf:2\ncell:V94:l:1:f:6:cf:2\ncell:W94:l:1:f:6:cf:2\ncell:O95:l:1:f:6:cf:2\ncell:P95:l:1:f:6:cf:2\ncell:Q95:l:1:f:6:cf:2\ncell:R95:l:1:f:6:cf:2\ncell:S95:l:1:f:6:cf:2\ncell:T95:l:1:f:6:cf:2\ncell:U95:l:1:f:6:cf:2\ncell:V95:l:1:f:6:cf:2\ncell:W95:l:1:f:6:cf:2\ncell:O96:l:1:f:6:cf:2\ncell:P96:l:1:f:6:cf:2\ncell:Q96:l:1:f:6:cf:2\ncell:R96:l:1:f:6:cf:2\ncell:S96:l:1:f:6:cf:2\ncell:T96:l:1:f:6:cf:2\ncell:U96:l:1:f:6:cf:2\ncell:V96:l:1:f:6:cf:2\ncell:W96:l:1:f:6:cf:2\ncell:O97:l:1:f:6:cf:2\ncell:P97:l:1:f:6:cf:2\ncell:Q97:l:1:f:6:cf:2\ncell:R97:l:1:f:6:cf:2\ncell:S97:l:1:f:6:cf:2\ncell:T97:l:1:f:6:cf:2\ncell:U97:l:1:f:6:cf:2\ncell:V97:l:1:f:6:cf:2\ncell:W97:l:1:f:6:cf:2\ncell:O98:l:1:f:6:cf:2\ncell:P98:l:1:f:6:cf:2\ncell:Q98:l:1:f:6:cf:2\ncell:R98:l:1:f:6:cf:2\ncell:S98:l:1:f:6:cf:2\ncell:T98:l:1:f:6:cf:2\ncell:U98:l:1:f:6:cf:2\ncell:V98:l:1:f:6:cf:2\ncell:W98:l:1:f:6:cf:2\ncell:O99:l:1:f:6:cf:2\ncell:P99:l:1:f:6:cf:2\ncell:Q99:l:1:f:6:cf:2\ncell:R99:l:1:f:6:cf:2\ncell:S99:l:1:f:6:cf:2\ncell:T99:l:1:f:6:cf:2\ncell:U99:l:1:f:6:cf:2\ncell:V99:l:1:f:6:cf:2\ncell:W99:l:1:f:6:cf:2\ncell:O100:l:1:f:6:cf:2\ncell:P100:l:1:f:6:cf:2\ncell:Q100:l:1:f:6:cf:2\ncell:R100:l:1:f:6:cf:2\ncell:S100:l:1:f:6:cf:2\ncell:T100:l:1:f:6:cf:2\ncell:U100:l:1:f:6:cf:2\ncell:V100:l:1:f:6:cf:2\ncell:W100:l:1:f:6:cf:2\ncell:O101:l:1:f:6:cf:2\ncell:P101:l:1:f:6:cf:2\ncell:Q101:l:1:f:6:cf:2\ncell:R101:l:1:f:6:cf:2\ncell:S101:l:1:f:6:cf:2\ncell:T101:l:1:f:6:cf:2\ncell:U101:l:1:f:6:cf:2\ncell:V101:l:1:f:6:cf:2\ncell:W101:l:1:f:6:cf:2\ncell:O102:l:1:f:6:cf:2\ncell:P102:l:1:f:6:cf:2\ncell:Q102:l:1:f:6:cf:2\ncell:R102:l:1:f:6:cf:2\ncell:S102:l:1:f:6:cf:2\ncell:T102:l:1:f:6:cf:2\ncell:U102:l:1:f:6:cf:2\ncell:V102:l:1:f:6:cf:2\ncell:W102:l:1:f:6:cf:2\ncell:O103:l:1:f:6:cf:2\ncell:P103:l:1:f:6:cf:2\ncell:Q103:l:1:f:6:cf:2\ncell:R103:l:1:f:6:cf:2\ncell:S103:l:1:f:6:cf:2\ncell:T103:l:1:f:6:cf:2\ncell:U103:l:1:f:6:cf:2\ncell:V103:l:1:f:6:cf:2\ncell:W103:l:1:f:6:cf:2\ncell:O104:l:1:f:6:cf:2\ncell:P104:l:1:f:6:cf:2\ncell:Q104:l:1:f:6:cf:2\ncell:R104:l:1:f:6:cf:2\ncell:S104:l:1:f:6:cf:2\ncell:T104:l:1:f:6:cf:2\ncell:U104:l:1:f:6:cf:2\ncell:V104:l:1:f:6:cf:2\ncell:W104:l:1:f:6:cf:2\ncell:O105:l:1:f:6:cf:2\ncell:P105:l:1:f:6:cf:2\ncell:Q105:l:1:f:6:cf:2\ncell:R105:l:1:f:6:cf:2\ncell:S105:l:1:f:6:cf:2\ncell:T105:l:1:f:6:cf:2\ncell:U105:l:1:f:6:cf:2\ncell:V105:l:1:f:6:cf:2\ncell:W105:l:1:f:6:cf:2\ncell:O106:l:1:f:6:cf:2\ncell:P106:l:1:f:6:cf:2\ncell:Q106:l:1:f:6:cf:2\ncell:R106:l:1:f:6:cf:2\ncell:S106:l:1:f:6:cf:2\ncell:T106:l:1:f:6:cf:2\ncell:U106:l:1:f:6:cf:2\ncell:V106:l:1:f:6:cf:2\ncell:W106:l:1:f:6:cf:2\ncell:O107:l:1:f:6:cf:2\ncell:P107:l:1:f:6:cf:2\ncell:Q107:l:1:f:6:cf:2\ncell:R107:l:1:f:6:cf:2\ncell:S107:l:1:f:6:cf:2\ncell:T107:l:1:f:6:cf:2\ncell:U107:l:1:f:6:cf:2\ncell:V107:l:1:f:6:cf:2\ncell:W107:l:1:f:6:cf:2\ncell:O108:l:1:f:6:cf:2\ncell:P108:l:1:f:6:cf:2\ncell:Q108:l:1:f:6:cf:2\ncell:R108:l:1:f:6:cf:2\ncell:S108:l:1:f:6:cf:2\ncell:T108:l:1:f:6:cf:2\ncell:U108:l:1:f:6:cf:2\ncell:V108:l:1:f:6:cf:2\ncell:W108:l:1:f:6:cf:2\ncell:O109:l:1:f:6:cf:2\ncell:P109:l:1:f:6:cf:2\ncell:Q109:l:1:f:6:cf:2\ncell:R109:l:1:f:6:cf:2\ncell:S109:l:1:f:6:cf:2\ncell:T109:l:1:f:6:cf:2\ncell:U109:l:1:f:6:cf:2\ncell:V109:l:1:f:6:cf:2\ncell:W109:l:1:f:6:cf:2\ncell:O110:l:1:f:6:cf:2\ncell:P110:l:1:f:6:cf:2\ncell:Q110:l:1:f:6:cf:2\ncell:R110:l:1:f:6:cf:2\ncell:S110:l:1:f:6:cf:2\ncell:T110:l:1:f:6:cf:2\ncell:U110:l:1:f:6:cf:2\ncell:V110:l:1:f:6:cf:2\ncell:W110:l:1:f:6:cf:2\ncell:O111:l:1:f:6:cf:2\ncell:P111:l:1:f:6:cf:2\ncell:Q111:l:1:f:6:cf:2\ncell:R111:l:1:f:6:cf:2\ncell:S111:l:1:f:6:cf:2\ncell:T111:l:1:f:6:cf:2\ncell:U111:l:1:f:6:cf:2\ncell:V111:l:1:f:6:cf:2\ncell:W111:l:1:f:6:cf:2\ncell:O112:l:1:f:6:cf:2\ncell:P112:l:1:f:6:cf:2\ncell:Q112:l:1:f:6:cf:2\ncell:R112:l:1:f:6:cf:2\ncell:S112:l:1:f:6:cf:2\ncell:T112:l:1:f:6:cf:2\ncell:U112:l:1:f:6:cf:2\ncell:V112:l:1:f:6:cf:2\ncell:W112:l:1:f:6:cf:2\ncell:O113:l:1:f:6:cf:2\ncell:P113:l:1:f:6:cf:2\ncell:Q113:l:1:f:6:cf:2\ncell:R113:l:1:f:6:cf:2\ncell:S113:l:1:f:6:cf:2\ncell:T113:l:1:f:6:cf:2\ncell:U113:l:1:f:6:cf:2\ncell:V113:l:1:f:6:cf:2\ncell:W113:l:1:f:6:cf:2\ncell:O114:l:1:f:6:cf:2\ncell:P114:l:1:f:6:cf:2\ncell:Q114:l:1:f:6:cf:2\ncell:R114:l:1:f:6:cf:2\ncell:S114:l:1:f:6:cf:2\ncell:T114:l:1:f:6:cf:2\ncell:U114:l:1:f:6:cf:2\ncell:V114:l:1:f:6:cf:2\ncell:W114:l:1:f:6:cf:2\ncell:O115:l:1:f:6:cf:2\ncell:P115:l:1:f:6:cf:2\ncell:Q115:l:1:f:6:cf:2\ncell:R115:l:1:f:6:cf:2\ncell:S115:l:1:f:6:cf:2\ncell:T115:l:1:f:6:cf:2\ncell:U115:l:1:f:6:cf:2\ncell:V115:l:1:f:6:cf:2\ncell:W115:l:1:f:6:cf:2\ncell:O116:l:1:f:6:cf:2\ncell:P116:l:1:f:6:cf:2\ncell:Q116:l:1:f:6:cf:2\ncell:R116:l:1:f:6:cf:2\ncell:S116:l:1:f:6:cf:2\ncell:T116:l:1:f:6:cf:2\ncell:U116:l:1:f:6:cf:2\ncell:V116:l:1:f:6:cf:2\ncell:W116:l:1:f:6:cf:2\ncell:O117:l:1:f:6:cf:2\ncell:P117:l:1:f:6:cf:2\ncell:Q117:l:1:f:6:cf:2\ncell:R117:l:1:f:6:cf:2\ncell:S117:l:1:f:6:cf:2\ncell:T117:l:1:f:6:cf:2\ncell:U117:l:1:f:6:cf:2\ncell:V117:l:1:f:6:cf:2\ncell:W117:l:1:f:6:cf:2\ncell:O118:l:1:f:6:cf:2\ncell:P118:l:1:f:6:cf:2\ncell:Q118:l:1:f:6:cf:2\ncell:R118:l:1:f:6:cf:2\ncell:S118:l:1:f:6:cf:2\ncell:T118:l:1:f:6:cf:2\ncell:U118:l:1:f:6:cf:2\ncell:V118:l:1:f:6:cf:2\ncell:W118:l:1:f:6:cf:2\ncell:O119:l:1:f:6:cf:2\ncell:P119:l:1:f:6:cf:2\ncell:Q119:l:1:f:6:cf:2\ncell:R119:l:1:f:6:cf:2\ncell:S119:l:1:f:6:cf:2\ncell:T119:l:1:f:6:cf:2\ncell:U119:l:1:f:6:cf:2\ncell:V119:l:1:f:6:cf:2\ncell:W119:l:1:f:6:cf:2\ncell:O120:l:1:f:6:cf:2\ncell:P120:l:1:f:6:cf:2\ncell:Q120:l:1:f:6:cf:2\ncell:R120:l:1:f:6:cf:2\ncell:S120:l:1:f:6:cf:2\ncell:T120:l:1:f:6:cf:2\ncell:U120:l:1:f:6:cf:2\ncell:V120:l:1:f:6:cf:2\ncell:W120:l:1:f:6:cf:2\ncell:O121:l:1:f:6:cf:2\ncell:P121:l:1:f:6:cf:2\ncell:Q121:l:1:f:6:cf:2\ncell:R121:l:1:f:6:cf:2\ncell:S121:l:1:f:6:cf:2\ncell:T121:l:1:f:6:cf:2\ncell:U121:l:1:f:6:cf:2\ncell:V121:l:1:f:6:cf:2\ncell:W121:l:1:f:6:cf:2\ncell:O122:l:1:f:7:cf:2\ncell:P122:l:1:f:7:cf:2\ncell:Q122:l:1:f:7:cf:2\ncell:R122:l:1:f:7:cf:2\ncell:S122:l:1:f:7:cf:2\ncell:T122:l:1:f:7:cf:2\ncell:U122:l:1:f:7:cf:2\ncell:V122:l:1:f:7:cf:2\ncell:W122:l:1:f:7:cf:2\ncell:O123:l:1:f:7:cf:2\ncell:P123:l:1:f:7:cf:2\ncell:Q123:l:1:f:7:cf:2\ncell:R123:l:1:f:7:cf:2\ncell:S123:l:1:f:7:cf:2\ncell:T123:l:1:f:7:cf:2\ncell:U123:l:1:f:7:cf:2\ncell:V123:l:1:f:7:cf:2\ncell:W123:l:1:f:7:cf:2\ncell:O124:l:1:f:7:cf:2\ncell:P124:l:1:f:7:cf:2\ncell:Q124:l:1:f:7:cf:2\ncell:R124:l:1:f:7:cf:2\ncell:S124:l:1:f:7:cf:2\ncell:T124:l:1:f:7:cf:2\ncell:U124:l:1:f:7:cf:2\ncell:V124:l:1:f:7:cf:2\ncell:W124:l:1:f:7:cf:2\ncell:O125:l:1:f:7:cf:2\ncell:P125:l:1:f:7:cf:2\ncell:Q125:l:1:f:7:cf:2\ncell:R125:l:1:f:7:cf:2\ncell:S125:l:1:f:7:cf:2\ncell:T125:l:1:f:7:cf:2\ncell:U125:l:1:f:7:cf:2\ncell:V125:l:1:f:7:cf:2\ncell:W125:l:1:f:7:cf:2\ncell:A126:l:1:f:7:cf:2\ncell:B126:l:1:f:7:cf:2\ncell:C126:l:1:f:7:cf:2\ncell:D126:l:1:f:7:cf:2\ncell:E126:l:1:f:7:cf:2\ncell:F126:t:Monthly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G126:l:1:f:7:cf:2\ncell:H126:l:1:f:7:cf:2\ncell:I126:l:1:f:7:cf:2\ncell:J126:l:1:f:7:cf:2\ncell:K126:l:1:f:7:cf:2\ncell:L126:l:1:f:7:cf:2\ncell:M126:l:1:f:7:cf:2\ncell:N126:l:1:f:7:cf:2\ncell:O126:l:1:f:7:cf:2\ncell:P126:l:1:f:7:cf:2\ncell:Q126:l:1:f:7:cf:2\ncell:R126:l:1:f:7:cf:2\ncell:S126:l:1:f:7:cf:2\ncell:T126:l:1:f:7:cf:2\ncell:U126:l:1:f:7:cf:2\ncell:V126:l:1:f:7:cf:2\ncell:W126:l:1:f:7:cf:2\ncell:A127:l:1:f:7:cf:2\ncell:B127:l:1:f:7:cf:2\ncell:C127:l:1:f:7:cf:2\ncell:D127:l:1:f:7:cf:2\ncell:E127:l:1:f:7:cf:2\ncell:F127:t:Semi-Annually:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G127:l:1:f:7:cf:2\ncell:H127:l:1:f:7:cf:2\ncell:I127:l:1:f:7:cf:2\ncell:J127:l:1:f:7:cf:2\ncell:K127:l:1:f:7:cf:2\ncell:L127:l:1:f:7:cf:2\ncell:M127:l:1:f:7:cf:2\ncell:N127:l:1:f:7:cf:2\ncell:O127:l:1:f:7:cf:2\ncell:P127:l:1:f:7:cf:2\ncell:Q127:l:1:f:7:cf:2\ncell:R127:l:1:f:7:cf:2\ncell:S127:l:1:f:7:cf:2\ncell:T127:l:1:f:7:cf:2\ncell:U127:l:1:f:7:cf:2\ncell:V127:l:1:f:7:cf:2\ncell:W127:l:1:f:7:cf:2\ncell:A128:l:1:f:7:cf:2\ncell:B128:l:1:f:7:cf:2\ncell:C128:l:1:f:7:cf:2\ncell:D128:l:1:f:7:cf:2\ncell:E128:l:1:f:7:cf:2\ncell:F128:t:Quarterly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G128:l:1:f:7:cf:2\ncell:H128:l:1:f:7:cf:2\ncell:I128:l:1:f:7:cf:2\ncell:J128:l:1:f:7:cf:2\ncell:K128:l:1:f:7:cf:2\ncell:L128:l:1:f:7:cf:2\ncell:M128:l:1:f:7:cf:2\ncell:N128:l:1:f:7:cf:2\ncell:O128:l:1:f:7:cf:2\ncell:P128:l:1:f:7:cf:2\ncell:Q128:l:1:f:7:cf:2\ncell:R128:l:1:f:7:cf:2\ncell:S128:l:1:f:7:cf:2\ncell:T128:l:1:f:7:cf:2\ncell:U128:l:1:f:7:cf:2\ncell:V128:l:1:f:7:cf:2\ncell:W128:l:1:f:7:cf:2\ncell:A129:l:1:f:7:cf:2\ncell:B129:l:1:f:7:cf:2\ncell:C129:l:1:f:7:cf:2\ncell:D129:l:1:f:7:cf:2\ncell:E129:l:1:f:7:cf:2\ncell:F129:t:Yearly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G129:l:1:f:7:cf:2\ncell:H129:l:1:f:7:cf:2\ncell:I129:l:1:f:7:cf:2\ncell:J129:l:1:f:7:cf:2\ncell:K129:l:1:f:7:cf:2\ncell:L129:l:1:f:7:cf:2\ncell:M129:l:1:f:7:cf:2\ncell:N129:l:1:f:7:cf:2\ncell:O129:l:1:f:7:cf:2\ncell:P129:l:1:f:7:cf:2\ncell:Q129:l:1:f:7:cf:2\ncell:R129:l:1:f:7:cf:2\ncell:S129:l:1:f:7:cf:2\ncell:T129:l:1:f:7:cf:2\ncell:U129:l:1:f:7:cf:2\ncell:V129:l:1:f:7:cf:2\ncell:W129:l:1:f:7:cf:2\ncell:A130:l:1:f:7:cf:2\ncell:B130:l:1:f:7:cf:2\ncell:C130:l:1:f:7:cf:2\ncell:D130:l:1:f:7:cf:2\ncell:E130:l:1:f:7:cf:2\ncell:F130:l:1:f:7:cf:2\ncell:G130:l:1:f:7:cf:2\ncell:H130:l:1:f:7:cf:2\ncell:I130:l:1:f:7:cf:2\ncell:J130:l:1:f:7:cf:2\ncell:K130:l:1:f:7:cf:2\ncell:L130:l:1:f:7:cf:2\ncell:M130:l:1:f:7:cf:2\ncell:N130:l:1:f:7:cf:2\ncell:O130:l:1:f:7:cf:2\ncell:P130:l:1:f:7:cf:2\ncell:Q130:l:1:f:7:cf:2\ncell:R130:l:1:f:7:cf:2\ncell:S130:l:1:f:7:cf:2\ncell:T130:l:1:f:7:cf:2\ncell:U130:l:1:f:7:cf:2\ncell:V130:l:1:f:7:cf:2\ncell:W130:l:1:f:7:cf:2\ncell:A131:l:1:f:7:cf:2\ncell:B131:l:1:f:7:cf:2\ncell:C131:l:1:f:7:cf:2\ncell:D131:l:1:f:7:cf:2\ncell:E131:l:1:f:7:cf:2\ncell:F131:l:1:f:7:cf:2\ncell:G131:l:1:f:7:cf:2\ncell:H131:l:1:f:7:cf:2\ncell:I131:l:1:f:7:cf:2\ncell:J131:l:1:f:7:cf:2\ncell:K131:l:1:f:7:cf:2\ncell:L131:l:1:f:7:cf:2\ncell:M131:l:1:f:7:cf:2\ncell:N131:l:1:f:7:cf:2\ncell:O131:l:1:f:7:cf:2\ncell:P131:l:1:f:7:cf:2\ncell:Q131:l:1:f:7:cf:2\ncell:R131:l:1:f:7:cf:2\ncell:S131:l:1:f:7:cf:2\ncell:T131:l:1:f:7:cf:2\ncell:U131:l:1:f:7:cf:2\ncell:V131:l:1:f:7:cf:2\ncell:W131:l:1:f:7:cf:2\ncell:A132:l:1:f:7:cf:2\ncell:B132:l:1:f:7:cf:2\ncell:C132:l:1:f:7:cf:2\ncell:D132:l:1:f:7:cf:2\ncell:E132:l:1:f:7:cf:2\ncell:F132:l:1:f:7:cf:2\ncell:G132:l:1:f:7:cf:2\ncell:H132:l:1:f:7:cf:2\ncell:I132:l:1:f:7:cf:2\ncell:J132:l:1:f:7:cf:2\ncell:K132:l:1:f:7:cf:2\ncell:L132:l:1:f:7:cf:2\ncell:M132:l:1:f:7:cf:2\ncell:N132:l:1:f:7:cf:2\ncell:O132:l:1:f:7:cf:2\ncell:P132:l:1:f:7:cf:2\ncell:Q132:l:1:f:7:cf:2\ncell:R132:l:1:f:7:cf:2\ncell:S132:l:1:f:7:cf:2\ncell:T132:l:1:f:7:cf:2\ncell:U132:l:1:f:7:cf:2\ncell:V132:l:1:f:7:cf:2\ncell:W132:l:1:f:7:cf:2\ncell:A133:l:1:f:7:cf:2\ncell:B133:l:1:f:7:cf:2\ncell:C133:l:1:f:7:cf:2\ncell:D133:l:1:f:7:cf:2\ncell:E133:l:1:f:7:cf:2\ncell:F133:l:1:f:7:cf:2\ncell:G133:l:1:f:7:cf:2\ncell:H133:l:1:f:7:cf:2\ncell:I133:l:1:f:7:cf:2\ncell:J133:l:1:f:7:cf:2\ncell:K133:l:1:f:7:cf:2\ncell:L133:l:1:f:7:cf:2\ncell:M133:l:1:f:7:cf:2\ncell:N133:l:1:f:7:cf:2\ncell:O133:l:1:f:7:cf:2\ncell:P133:l:1:f:7:cf:2\ncell:Q133:l:1:f:7:cf:2\ncell:R133:l:1:f:7:cf:2\ncell:S133:l:1:f:7:cf:2\ncell:T133:l:1:f:7:cf:2\ncell:U133:l:1:f:7:cf:2\ncell:V133:l:1:f:7:cf:2\ncell:W133:l:1:f:7:cf:2\ncell:A134:l:1:f:7:cf:2\ncell:B134:l:1:f:7:cf:2\ncell:C134:l:1:f:7:cf:2\ncell:D134:l:1:f:7:cf:2\ncell:E134:l:1:f:7:cf:2\ncell:F134:l:1:f:7:cf:2\ncell:G134:l:1:f:7:cf:2\ncell:H134:l:1:f:7:cf:2\ncell:I134:l:1:f:7:cf:2\ncell:J134:l:1:f:7:cf:2\ncell:K134:l:1:f:7:cf:2\ncell:L134:l:1:f:7:cf:2\ncell:M134:l:1:f:7:cf:2\ncell:N134:l:1:f:7:cf:2\ncell:O134:l:1:f:7:cf:2\ncell:P134:l:1:f:7:cf:2\ncell:Q134:l:1:f:7:cf:2\ncell:R134:l:1:f:7:cf:2\ncell:S134:l:1:f:7:cf:2\ncell:T134:l:1:f:7:cf:2\ncell:U134:l:1:f:7:cf:2\ncell:V134:l:1:f:7:cf:2\ncell:W134:l:1:f:7:cf:2\ncell:A135:l:1:f:7:cf:2\ncell:B135:l:1:f:7:cf:2\ncell:C135:l:1:f:7:cf:2\ncell:D135:l:1:f:7:cf:2\ncell:E135:l:1:f:7:cf:2\ncell:F135:l:1:f:7:cf:2\ncell:G135:l:1:f:7:cf:2\ncell:H135:l:1:f:7:cf:2\ncell:I135:l:1:f:7:cf:2\ncell:J135:l:1:f:7:cf:2\ncell:K135:l:1:f:7:cf:2\ncell:L135:l:1:f:7:cf:2\ncell:M135:l:1:f:7:cf:2\ncell:N135:l:1:f:7:cf:2\ncell:O135:l:1:f:7:cf:2\ncell:P135:l:1:f:7:cf:2\ncell:Q135:l:1:f:7:cf:2\ncell:R135:l:1:f:7:cf:2\ncell:S135:l:1:f:7:cf:2\ncell:T135:l:1:f:7:cf:2\ncell:U135:l:1:f:7:cf:2\ncell:V135:l:1:f:7:cf:2\ncell:W135:l:1:f:7:cf:2\ncell:A136:l:1:f:7:cf:2\ncell:B136:l:1:f:7:cf:2\ncell:C136:l:1:f:7:cf:2\ncell:D136:l:1:f:7:cf:2\ncell:E136:l:1:f:7:cf:2\ncell:F136:l:1:f:7:cf:2\ncell:G136:l:1:f:7:cf:2\ncell:H136:l:1:f:7:cf:2\ncell:I136:l:1:f:7:cf:2\ncell:J136:l:1:f:7:cf:2\ncell:K136:l:1:f:7:cf:2\ncell:L136:l:1:f:7:cf:2\ncell:M136:l:1:f:7:cf:2\ncell:N136:l:1:f:7:cf:2\ncell:O136:l:1:f:7:cf:2\ncell:P136:l:1:f:7:cf:2\ncell:Q136:l:1:f:7:cf:2\ncell:R136:l:1:f:7:cf:2\ncell:S136:l:1:f:7:cf:2\ncell:T136:l:1:f:7:cf:2\ncell:U136:l:1:f:7:cf:2\ncell:V136:l:1:f:7:cf:2\ncell:W136:l:1:f:7:cf:2\ncell:A137:l:1:f:7:cf:2\ncell:B137:l:1:f:7:cf:2\ncell:C137:l:1:f:7:cf:2\ncell:D137:l:1:f:7:cf:2\ncell:E137:l:1:f:7:cf:2\ncell:F137:l:1:f:7:cf:2\ncell:G137:l:1:f:7:cf:2\ncell:H137:l:1:f:7:cf:2\ncell:I137:l:1:f:7:cf:2\ncell:J137:l:1:f:7:cf:2\ncell:K137:l:1:f:7:cf:2\ncell:L137:l:1:f:7:cf:2\ncell:M137:l:1:f:7:cf:2\ncell:N137:l:1:f:7:cf:2\ncell:O137:l:1:f:7:cf:2\ncell:P137:l:1:f:7:cf:2\ncell:Q137:l:1:f:7:cf:2\ncell:R137:l:1:f:7:cf:2\ncell:S137:l:1:f:7:cf:2\ncell:T137:l:1:f:7:cf:2\ncell:U137:l:1:f:7:cf:2\ncell:V137:l:1:f:7:cf:2\ncell:W137:l:1:f:7:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nrow:102:h:14.25\nrow:103:h:14.25\nrow:104:h:14.25\nrow:105:h:14.25\nrow:106:h:14.25\nrow:107:h:14.25\nrow:108:h:14.25\nrow:109:h:14.25\nrow:110:h:14.25\nrow:111:h:14.25\nrow:112:h:14.25\nrow:113:h:14.25\nrow:114:h:14.25\nrow:115:h:14.25\nrow:116:h:14.25\nrow:117:h:14.25\nrow:118:h:14.25\nrow:119:h:14.25\nrow:120:h:14.25\nrow:121:h:14.25\nsheet:c:27:r:137:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\ncolor:5:rgb(255,255,187)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 20pt Arial\nfont:4:normal bold 9pt Arial\nfont:5:normal normal * Arial\nfont:6:normal normal 10pt Arial\nfont:7:normal normal 7pt Arial\nfont:8:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nname:COMPARISON::S63\\cU77\nname:TRACKING::AC63\\cAE77\n', - }, - name: "sheet9", - hidden: "0", - }, - sheet5: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:7:cf:2:ntvf:2\ncell:B1:l:1:f:7:cf:2\ncell:C1:l:1:f:7:cf:2\ncell:D1:l:1:f:7:cf:2\ncell:E1:l:1:f:7:cf:2\ncell:F1:l:1:f:7:cf:2\ncell:G1:l:1:f:7:cf:2\ncell:H1:l:1:f:7:cf:2\ncell:I1:l:1:f:7:cf:2\ncell:J1:l:1:f:7:cf:2\ncell:K1:l:1:f:7:cf:2\ncell:L1:l:1:f:7:cf:2\ncell:M1:l:1:f:7:cf:2\ncell:N1:l:1:f:7:cf:2\ncell:O1:l:1:f:7:cf:2\ncell:P1:l:1:f:7:cf:2\ncell:Q1:l:1:f:7:cf:2\ncell:R1:l:1:f:7:cf:2\ncell:S1:l:1:f:7:cf:2\ncell:T1:l:1:f:7:cf:2\ncell:U1:l:1:f:7:cf:2\ncell:V1:l:1:f:7:cf:2\ncell:W1:l:1:f:7:cf:2\ncell:A2:l:1:f:7:cf:2\ncell:B2:l:1:f:7:cf:2\ncell:C2:l:1:f:7:cf:2\ncell:D2:t:Expenses:l:2:f:3:cf:2\ncell:E2:l:1:f:7:cf:2\ncell:F2:l:1:f:7:cf:2\ncell:G2:l:1:f:7:cf:2\ncell:H2:l:1:f:7:cf:2\ncell:I2:l:1:f:7:cf:2\ncell:J2:l:1:f:7:cf:2\ncell:K2:l:1:f:7:cf:2\ncell:L2:l:1:f:7:cf:2\ncell:M2:l:1:f:7:cf:2\ncell:N2:l:1:f:7:cf:2\ncell:O2:l:1:f:7:cf:2\ncell:P2:l:1:f:7:cf:2\ncell:Q2:l:1:f:7:cf:2\ncell:R2:l:1:f:7:cf:2\ncell:S2:l:1:f:7:cf:2\ncell:T2:l:1:f:7:cf:2\ncell:U2:l:1:f:7:cf:2\ncell:V2:l:1:f:7:cf:2\ncell:W2:l:1:f:7:cf:2\ncell:A3:l:1:f:7:cf:2\ncell:B3:l:1:f:7:cf:2\ncell:C3:l:1:f:7:cf:2\ncell:D3:l:1:f:7:cf:2\ncell:G3:l:1:f:7:cf:2\ncell:H3:l:1:f:7:cf:2\ncell:I3:l:1:f:7:cf:2\ncell:J3:l:1:f:7:cf:2\ncell:K3:l:1:f:7:cf:2\ncell:L3:l:1:f:7:cf:2\ncell:M3:l:1:f:7:cf:2\ncell:N3:l:1:f:7:cf:2\ncell:O3:l:1:f:7:cf:2\ncell:P3:l:1:f:7:cf:2\ncell:Q3:t: :l:1:f:7:cf:2\ncell:R3:l:1:f:7:cf:2\ncell:S3:l:1:f:7:cf:2\ncell:T3:l:1:f:7:cf:2\ncell:U3:l:1:f:7:cf:2\ncell:V3:l:1:f:7:cf:2\ncell:W3:l:1:f:7:cf:2\ncell:B4:t:Entertainment:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C4:l:3:f:2:c:3:bg:1:cf:2\ncell:D4:l:3:f:2:c:3:bg:1:cf:1\ncell:E4:vtf:n:209:SUM(E5\\cE12):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F4:vtf:n:2508:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O4:l:1:f:7:cf:2\ncell:P4:l:1:f:7:cf:2\ncell:Q4:l:1:f:7:cf:2\ncell:R4:l:1:f:7:cf:2\ncell:S4:l:1:f:7:cf:2\ncell:T4:l:1:f:7:cf:2\ncell:U4:l:1:f:7:cf:2\ncell:V4:l:1:f:7:cf:2\ncell:W4:l:1:f:7:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:7:cf:2\ncell:C5:l:3:f:7:cf:2\ncell:D5:t:Events/Movies/Theater:l:3:f:5:cf:2\ncell:E5:v:209:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F5:vtf:n:2508:IF( (E5*12)=0,"",(E5*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:7:cf:2\ncell:P5:l:1:f:7:cf:2\ncell:Q5:l:1:f:7:cf:2\ncell:R5:l:1:f:7:cf:2\ncell:S5:l:1:f:7:cf:2\ncell:T5:l:1:f:7:cf:2\ncell:U5:l:1:f:7:cf:2\ncell:V5:l:1:f:7:cf:2\ncell:W5:l:1:f:7:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:7:bg:2:cf:2\ncell:C6:l:3:f:7:bg:2:cf:2\ncell:D6:t:Music/Video:l:3:f:5:bg:2:cf:2\ncell:E6:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F6:vtf:t::IF( (E6*12)=0,"",(E6*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:7:cf:2\ncell:P6:l:1:f:7:cf:2\ncell:Q6:l:1:f:7:cf:2\ncell:R6:l:1:f:7:cf:2\ncell:S6:l:1:f:7:cf:2\ncell:T6:l:1:f:7:cf:2\ncell:U6:l:1:f:7:cf:2\ncell:V6:l:1:f:7:cf:2\ncell:W6:l:1:f:7:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:7:cf:2\ncell:C7:l:3:f:7:cf:2\ncell:D7:t:Books:l:3:f:5:cf:2\ncell:E7:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:7:cf:2\ncell:P7:l:1:f:7:cf:2\ncell:Q7:l:1:f:7:cf:2\ncell:R7:l:1:f:7:cf:2\ncell:S7:l:1:f:7:cf:2\ncell:T7:l:1:f:7:cf:2\ncell:U7:l:1:f:7:cf:2\ncell:V7:l:1:f:7:cf:2\ncell:W7:l:1:f:7:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:bg:2:cf:2\ncell:C8:l:3:f:7:bg:2:cf:2\ncell:D8:t:Pets:l:3:f:5:bg:2:cf:2\ncell:E8:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:7:cf:2\ncell:P8:l:1:f:7:cf:2\ncell:Q8:l:1:f:7:cf:2\ncell:R8:l:1:f:7:cf:2\ncell:S8:l:1:f:7:cf:2\ncell:T8:l:1:f:7:cf:2\ncell:U8:l:1:f:7:cf:2\ncell:V8:l:1:f:7:cf:2\ncell:W8:l:1:f:7:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:7:cf:2\ncell:C9:l:3:f:7:cf:2\ncell:D9:t:Hobbies:l:3:f:5:cf:2\ncell:E9:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F9:vtf:t::IF( (E9*12)=0,"",(E9*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:7:cf:2\ncell:P9:l:1:f:7:cf:2\ncell:Q9:l:1:f:7:cf:2\ncell:R9:l:1:f:7:cf:2\ncell:S9:l:1:f:7:cf:2\ncell:T9:l:1:f:7:cf:2\ncell:U9:l:1:f:7:cf:2\ncell:V9:l:1:f:7:cf:2\ncell:W9:l:1:f:7:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:7:bg:2:cf:2\ncell:C10:l:3:f:7:bg:2:cf:2\ncell:D10:t:Sports:l:3:f:5:bg:2:cf:2\ncell:E10:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:7:cf:2\ncell:P10:l:1:f:7:cf:2\ncell:Q10:l:1:f:7:cf:2\ncell:R10:l:1:f:7:cf:2\ncell:S10:l:1:f:7:cf:2\ncell:T10:l:1:f:7:cf:2\ncell:U10:l:1:f:7:cf:2\ncell:V10:l:1:f:7:cf:2\ncell:W10:l:1:f:7:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:7:cf:2\ncell:C11:l:3:f:7:cf:2\ncell:D11:t:Gadgets/Toys:l:3:f:5:cf:2\ncell:E11:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:7:cf:2\ncell:P11:l:1:f:7:cf:2\ncell:Q11:l:1:f:7:cf:2\ncell:R11:l:1:f:7:cf:2\ncell:S11:l:1:f:7:cf:2\ncell:T11:l:1:f:7:cf:2\ncell:U11:l:1:f:7:cf:2\ncell:V11:l:1:f:7:cf:2\ncell:W11:l:1:f:7:cf:2\ncell:A12:b::1::\ncell:B12:b::::1:l:3:f:7:bg:2:cf:2\ncell:C12:l:3:f:7:bg:2:cf:2\ncell:D12:t:Other:l:3:f:5:bg:2:cf:2\ncell:E12:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F12:vtf:t::IF( (E12*12)=0,"",(E12*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G12:b::::1\ncell:O12:l:1:f:7:cf:2\ncell:P12:l:1:f:7:cf:2\ncell:Q12:l:1:f:7:cf:2\ncell:R12:l:1:f:7:cf:2\ncell:S12:l:1:f:7:cf:2\ncell:T12:l:1:f:7:cf:2\ncell:U12:l:1:f:7:cf:2\ncell:V12:l:1:f:7:cf:2\ncell:W12:l:1:f:7:cf:2\ncell:B13:t:Education:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C13:l:3:f:2:c:3:bg:1:cf:2\ncell:D13:l:3:f:2:c:3:bg:1:cf:1\ncell:E13:vtf:n:98:SUM(E14\\cE17):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F13:vtf:n:1176:IF( (E13*12)=0,"",(E13*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O13:l:1:f:7:cf:2\ncell:P13:l:1:f:7:cf:2\ncell:Q13:l:1:f:7:cf:2\ncell:R13:l:1:f:7:cf:2\ncell:S13:l:1:f:7:cf:2\ncell:T13:l:1:f:7:cf:2\ncell:U13:l:1:f:7:cf:2\ncell:V13:l:1:f:7:cf:2\ncell:W13:l:1:f:7:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:cf:2\ncell:C14:l:3:f:7:cf:2\ncell:D14:t:Tuition & Fees:l:3:f:5:cf:2\ncell:E14:v:98:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F14:vtf:n:1176:IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:7:cf:2\ncell:P14:l:1:f:7:cf:2\ncell:Q14:l:1:f:7:cf:2\ncell:R14:l:1:f:7:cf:2\ncell:S14:l:1:f:7:cf:2\ncell:T14:l:1:f:7:cf:2\ncell:U14:l:1:f:7:cf:2\ncell:V14:l:1:f:7:cf:2\ncell:W14:l:1:f:7:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:7:bg:2:cf:2\ncell:C15:l:3:f:7:bg:2:cf:2\ncell:D15:t:Preschool:l:3:f:5:bg:2:cf:2\ncell:E15:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F15:vtf:t::IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:7:cf:2\ncell:P15:l:1:f:7:cf:2\ncell:Q15:l:1:f:7:cf:2\ncell:R15:l:1:f:7:cf:2\ncell:S15:l:1:f:7:cf:2\ncell:T15:l:1:f:7:cf:2\ncell:U15:l:1:f:7:cf:2\ncell:V15:l:1:f:7:cf:2\ncell:W15:l:1:f:7:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:7:cf:2\ncell:C16:l:3:f:7:cf:2\ncell:D16:t:Books & Supplies:l:3:f:5:cf:2\ncell:E16:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:7:cf:2\ncell:P16:l:1:f:7:cf:2\ncell:Q16:l:1:f:7:cf:2\ncell:R16:l:1:f:7:cf:2\ncell:S16:l:1:f:7:cf:2\ncell:T16:l:1:f:7:cf:2\ncell:U16:l:1:f:7:cf:2\ncell:V16:l:1:f:7:cf:2\ncell:W16:l:1:f:7:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:7:bg:2:cf:2\ncell:C17:l:3:f:7:bg:2:cf:2\ncell:D17:t:Other:l:3:f:5:bg:2:cf:2\ncell:E17:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:7:cf:2\ncell:P17:l:1:f:7:cf:2\ncell:Q17:l:1:f:7:cf:2\ncell:R17:l:1:f:7:cf:2\ncell:B18:t:Contributions, Donations, Gifts:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C18:l:3:f:2:c:3:bg:1:cf:2\ncell:D18:l:3:f:2:c:3:bg:1:cf:1\ncell:E18:vtf:n:222:SUM(E19\\cE21):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F18:vtf:n:2664:IF( (E18*12)=0,"",(E18*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O18:l:1:f:7:cf:2\ncell:P18:l:1:f:7:cf:2\ncell:Q18:l:1:f:7:cf:2\ncell:R18:l:1:f:7:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:7:cf:2\ncell:C19:l:3:f:7:cf:2\ncell:D19:t:Cash contributions:l:3:f:5:cf:2\ncell:E19:v:136:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F19:vtf:n:1632:IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:7:cf:2\ncell:P19:l:1:f:7:cf:2\ncell:Q19:l:1:f:7:cf:2\ncell:R19:l:1:f:7:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:7:bg:2:cf:2\ncell:C20:l:3:f:7:bg:2:cf:2\ncell:D20:t:Gifts:l:3:f:5:bg:2:cf:2\ncell:E20:v:86:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F20:vtf:n:1032:IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:7:cf:2\ncell:P20:l:1:f:7:cf:2\ncell:Q20:l:1:f:7:cf:2\ncell:R20:l:1:f:7:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:cf:2\ncell:C21:l:3:f:7:cf:2\ncell:D21:t:Other:l:3:f:5:cf:2\ncell:E21:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:7:cf:2\ncell:P21:l:1:f:7:cf:2\ncell:Q21:l:1:f:7:cf:2\ncell:R21:l:1:f:7:cf:2\ncell:B22:t:Debt:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C22:l:3:f:2:c:3:bg:1:cf:2\ncell:D22:l:3:f:2:c:3:bg:1:cf:1\ncell:E22:vtf:n:0:SUM(E23\\cE24):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O22:l:1:f:7:cf:2\ncell:P22:l:1:f:7:cf:2\ncell:Q22:l:1:f:7:cf:2\ncell:R22:l:1:f:7:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:7:cf:2\ncell:C23:l:3:f:7:cf:2\ncell:D23:t:Student loan payment:l:3:f:5:cf:2\ncell:E23:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:7:cf:2\ncell:P23:l:1:f:7:cf:2\ncell:Q23:l:1:f:7:cf:2\ncell:R23:l:1:f:7:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:7:bg:2:cf:2\ncell:C24:l:3:f:7:bg:2:cf:2\ncell:D24:t:Other loan & debt payment:l:3:f:5:bg:2:cf:2\ncell:E24:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:7:cf:2\ncell:P24:l:1:f:7:cf:2\ncell:Q24:l:1:f:7:cf:2\ncell:R24:l:1:f:7:cf:2\ncell:B25:t:Insurance:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C25:l:3:f:2:c:3:bg:1:cf:2\ncell:D25:l:3:f:2:c:3:bg:1:cf:1\ncell:E25:vtf:n:30:SUM(E26\\cE28):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F25:vtf:n:360:IF( (E25*12)=0,"",(E25*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O25:l:1:f:7:cf:2\ncell:P25:l:1:f:7:cf:2\ncell:Q25:l:1:f:7:cf:2\ncell:R25:l:1:f:7:cf:2\ncell:A26:b::1::\ncell:B26:b::::1:l:3:f:7:cf:2\ncell:C26:l:3:f:7:cf:2\ncell:D26:t:Health Insurance:l:3:f:5:cf:2\ncell:E26:v:30:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F26:vtf:n:360:IF( (E26*12)=0,"",(E26*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G26:b::::1\ncell:O26:l:1:f:7:cf:2\ncell:P26:l:1:f:7:cf:2\ncell:Q26:l:1:f:7:cf:2\ncell:R26:l:1:f:7:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:7:bg:2:cf:2\ncell:C27:l:3:f:7:bg:2:cf:2\ncell:D27:t:Car/Tax Insurance:l:3:f:5:bg:2:cf:2\ncell:E27:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F27:vtf:t::IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:7:cf:2\ncell:P27:l:1:f:7:cf:2\ncell:Q27:l:1:f:7:cf:2\ncell:R27:l:1:f:7:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:7:cf:2\ncell:C28:l:3:f:7:cf:2\ncell:D28:t:Home Insurance:l:3:f:5:cf:2\ncell:E28:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:7:cf:2\ncell:P28:l:1:f:7:cf:2\ncell:Q28:l:1:f:7:cf:2\ncell:R28:l:1:f:7:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:bg:2\ncell:C29:bg:2\ncell:D29:t:Life Insurance:l:3:f:6:bg:2:cf:2\ncell:E29:b:1:1:1:1:bg:2\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:bg:2\ncell:G29:b::::1\ncell:O29:l:1:f:7:cf:2\ncell:P29:l:1:f:7:cf:2\ncell:Q29:l:1:f:7:cf:2\ncell:R29:l:1:f:7:cf:2\ncell:A30:b::1::\ncell:B30:b:::1:1\ncell:C30:b:::1:\ncell:D30:t:Others:b:::1::l:3:f:6:cf:2\ncell:E30:b:1:1:1:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1:1:1\ncell:G30:b::::1\ncell:O30:l:1:f:7:cf:2\ncell:P30:l:1:f:7:cf:2\ncell:Q30:l:1:f:7:cf:2\ncell:R30:l:1:f:7:cf:2\ncell:B31:b:1:::\ncell:C31:b:1:::\ncell:D31:b:1:::\ncell:E31:b:1:::\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b:1:::\ncell:O31:l:1:f:7:cf:2\ncell:P31:l:1:f:7:cf:2\ncell:Q31:l:1:f:7:cf:2\ncell:R31:l:1:f:7:cf:2\ncell:B32:l:1:f:4:cf:2\ncell:C32:l:1:f:4:cf:2\ncell:D32:l:1:f:9:cf:2\ncell:E32:l:1:f:9:cf:2\ncell:F32:l:1:f:7:cf:2\ncell:O32:l:1:f:7:cf:2\ncell:P32:l:1:f:7:cf:2\ncell:Q32:l:1:f:7:cf:2\ncell:R32:l:1:f:7:cf:2\ncell:O33:l:1:f:7:cf:2\ncell:P33:l:1:f:7:cf:2\ncell:Q33:l:1:f:7:cf:2\ncell:R33:l:1:f:7:cf:2\ncell:O34:l:1:f:7:cf:2\ncell:P34:l:1:f:7:cf:2\ncell:Q34:l:1:f:7:cf:2\ncell:R34:l:1:f:7:cf:2\ncell:O35:l:1:f:7:cf:2\ncell:P35:l:1:f:7:cf:2\ncell:Q35:l:1:f:7:cf:2\ncell:R35:l:1:f:7:cf:2\ncell:O36:l:1:f:7:cf:2\ncell:P36:l:1:f:7:cf:2\ncell:Q36:l:1:f:7:cf:2\ncell:R36:l:1:f:7:cf:2\ncell:O37:l:1:f:7:cf:2\ncell:P37:l:1:f:7:cf:2\ncell:Q37:l:1:f:7:cf:2\ncell:R37:l:1:f:7:cf:2\ncell:O38:l:1:f:7:cf:2\ncell:P38:l:1:f:7:cf:2\ncell:Q38:l:1:f:7:cf:2\ncell:R38:l:1:f:7:cf:2\ncell:O39:l:1:f:7:cf:2\ncell:P39:l:1:f:7:cf:2\ncell:Q39:l:1:f:7:cf:2\ncell:R39:l:1:f:7:cf:2\ncell:O40:l:1:f:7:cf:2\ncell:P40:l:1:f:7:cf:2\ncell:Q40:l:1:f:7:cf:2\ncell:R40:l:1:f:7:cf:2\ncell:O41:l:1:f:7:cf:2\ncell:P41:l:1:f:7:cf:2\ncell:Q41:l:1:f:7:cf:2\ncell:R41:l:1:f:7:cf:2\ncell:O42:l:1:f:7:cf:2\ncell:P42:l:1:f:7:cf:2\ncell:Q42:l:1:f:7:cf:2\ncell:R42:l:1:f:7:cf:2\ncell:S42:l:1:f:7:cf:2\ncell:T42:l:1:f:7:cf:2\ncell:U42:l:1:f:7:cf:2\ncell:V42:l:1:f:7:cf:2\ncell:W42:l:1:f:7:cf:2\ncell:O43:l:1:f:7:cf:2\ncell:P43:l:1:f:7:cf:2\ncell:Q43:l:1:f:7:cf:2\ncell:R43:l:1:f:7:cf:2\ncell:S43:l:1:f:7:cf:2\ncell:T43:l:1:f:7:cf:2\ncell:U43:l:1:f:7:cf:2\ncell:V43:l:1:f:7:cf:2\ncell:W43:l:1:f:7:cf:2\ncell:O44:l:1:f:7:cf:2\ncell:P44:l:1:f:7:cf:2\ncell:Q44:l:1:f:7:cf:2\ncell:R44:l:1:f:7:cf:2\ncell:S44:l:1:f:7:cf:2\ncell:T44:l:1:f:7:cf:2\ncell:U44:l:1:f:7:cf:2\ncell:V44:l:1:f:7:cf:2\ncell:W44:l:1:f:7:cf:2\ncell:O45:l:1:f:7:cf:2\ncell:P45:l:1:f:7:cf:2\ncell:Q45:l:1:f:7:cf:2\ncell:R45:l:1:f:7:cf:2\ncell:S45:l:1:f:7:cf:2\ncell:T45:l:1:f:7:cf:2\ncell:U45:l:1:f:7:cf:2\ncell:V45:l:1:f:7:cf:2\ncell:W45:l:1:f:7:cf:2\ncell:O46:l:1:f:7:cf:2\ncell:P46:l:1:f:7:cf:2\ncell:Q46:l:1:f:7:cf:2\ncell:R46:l:1:f:7:cf:2\ncell:S46:l:1:f:7:cf:2\ncell:T46:l:1:f:7:cf:2\ncell:U46:l:1:f:7:cf:2\ncell:V46:l:1:f:7:cf:2\ncell:W46:l:1:f:7:cf:2\ncell:O47:l:1:f:7:cf:2\ncell:P47:l:1:f:7:cf:2\ncell:Q47:l:1:f:7:cf:2\ncell:R47:l:1:f:7:cf:2\ncell:S47:l:1:f:7:cf:2\ncell:T47:l:1:f:7:cf:2\ncell:U47:l:1:f:7:cf:2\ncell:V47:l:1:f:7:cf:2\ncell:W47:l:1:f:7:cf:2\ncell:O48:l:1:f:7:cf:2\ncell:P48:l:1:f:7:cf:2\ncell:Q48:l:1:f:7:cf:2\ncell:R48:l:1:f:7:cf:2\ncell:S48:l:1:f:7:cf:2\ncell:T48:l:1:f:7:cf:2\ncell:U48:l:1:f:7:cf:2\ncell:V48:l:1:f:7:cf:2\ncell:W48:l:1:f:7:cf:2\ncell:O49:l:1:f:7:cf:2\ncell:P49:l:1:f:7:cf:2\ncell:Q49:l:1:f:7:cf:2\ncell:R49:l:1:f:7:cf:2\ncell:S49:l:1:f:7:cf:2\ncell:T49:l:1:f:7:cf:2\ncell:U49:l:1:f:7:cf:2\ncell:V49:l:1:f:7:cf:2\ncell:W49:l:1:f:7:cf:2\ncell:O50:l:1:f:7:cf:2\ncell:P50:l:1:f:7:cf:2\ncell:Q50:l:1:f:7:cf:2\ncell:R50:l:1:f:7:cf:2\ncell:S50:l:1:f:7:cf:2\ncell:T50:l:1:f:7:cf:2\ncell:U50:l:1:f:7:cf:2\ncell:V50:l:1:f:7:cf:2\ncell:W50:l:1:f:7:cf:2\ncell:O51:l:1:f:7:cf:2\ncell:P51:l:1:f:7:cf:2\ncell:Q51:l:1:f:7:cf:2\ncell:R51:l:1:f:7:cf:2\ncell:S51:l:1:f:7:cf:2\ncell:T51:l:1:f:7:cf:2\ncell:U51:l:1:f:7:cf:2\ncell:V51:l:1:f:7:cf:2\ncell:W51:l:1:f:7:cf:2\ncell:O52:l:1:f:7:cf:2\ncell:P52:l:1:f:7:cf:2\ncell:Q52:l:1:f:7:cf:2\ncell:R52:l:1:f:7:cf:2\ncell:S52:l:1:f:7:cf:2\ncell:T52:l:1:f:7:cf:2\ncell:U52:l:1:f:7:cf:2\ncell:V52:l:1:f:7:cf:2\ncell:W52:l:1:f:7:cf:2\ncell:O53:l:1:f:7:cf:2\ncell:P53:l:1:f:7:cf:2\ncell:Q53:l:1:f:7:cf:2\ncell:R53:l:1:f:7:cf:2\ncell:S53:l:1:f:7:cf:2\ncell:T53:l:1:f:7:cf:2\ncell:U53:l:1:f:7:cf:2\ncell:V53:l:1:f:7:cf:2\ncell:W53:l:1:f:7:cf:2\ncell:O54:l:1:f:7:cf:2\ncell:P54:l:1:f:7:cf:2\ncell:Q54:l:1:f:7:cf:2\ncell:R54:l:1:f:7:cf:2\ncell:S54:l:1:f:7:cf:2\ncell:T54:l:1:f:7:cf:2\ncell:U54:l:1:f:7:cf:2\ncell:V54:l:1:f:7:cf:2\ncell:W54:l:1:f:7:cf:2\ncell:O55:l:1:f:7:cf:2\ncell:P55:l:1:f:7:cf:2\ncell:Q55:l:1:f:7:cf:2\ncell:R55:l:1:f:7:cf:2\ncell:S55:l:1:f:7:cf:2\ncell:T55:l:1:f:7:cf:2\ncell:U55:l:1:f:7:cf:2\ncell:V55:l:1:f:7:cf:2\ncell:W55:l:1:f:7:cf:2\ncell:O56:l:1:f:7:cf:2\ncell:P56:l:1:f:7:cf:2\ncell:Q56:l:1:f:7:cf:2\ncell:R56:l:1:f:7:cf:2\ncell:S56:l:1:f:7:cf:2\ncell:T56:l:1:f:7:cf:2\ncell:U56:l:1:f:7:cf:2\ncell:V56:l:1:f:7:cf:2\ncell:W56:l:1:f:7:cf:2\ncell:O57:l:1:f:7:cf:2\ncell:P57:l:1:f:7:cf:2\ncell:Q57:l:1:f:7:cf:2\ncell:R57:l:1:f:7:cf:2\ncell:S57:l:1:f:7:cf:2\ncell:T57:l:1:f:7:cf:2\ncell:U57:l:1:f:7:cf:2\ncell:V57:l:1:f:7:cf:2\ncell:W57:l:1:f:7:cf:2\ncell:O58:l:1:f:7:cf:2\ncell:P58:l:1:f:7:cf:2\ncell:Q58:l:1:f:7:cf:2\ncell:R58:l:1:f:7:cf:2\ncell:S58:l:1:f:7:cf:2\ncell:T58:l:1:f:7:cf:2\ncell:U58:l:1:f:7:cf:2\ncell:V58:l:1:f:7:cf:2\ncell:W58:l:1:f:7:cf:2\ncell:O59:l:1:f:7:cf:2\ncell:P59:l:1:f:7:cf:2\ncell:Q59:l:1:f:7:cf:2\ncell:R59:l:1:f:7:cf:2\ncell:S59:l:1:f:7:cf:2\ncell:T59:l:1:f:7:cf:2\ncell:U59:l:1:f:7:cf:2\ncell:V59:l:1:f:7:cf:2\ncell:W59:l:1:f:7:cf:2\ncell:O60:l:1:f:7:cf:2\ncell:P60:l:1:f:7:cf:2\ncell:Q60:l:1:f:7:cf:2\ncell:R60:l:1:f:7:cf:2\ncell:S60:l:1:f:7:cf:2\ncell:T60:l:1:f:7:cf:2\ncell:U60:l:1:f:7:cf:2\ncell:V60:l:1:f:7:cf:2\ncell:W60:l:1:f:7:cf:2\ncell:O61:l:1:f:7:cf:2\ncell:P61:l:1:f:7:cf:2\ncell:Q61:l:1:f:7:cf:2\ncell:R61:l:1:f:7:cf:2\ncell:S61:l:1:f:7:cf:2\ncell:T61:l:1:f:7:cf:2\ncell:U61:l:1:f:7:cf:2\ncell:V61:l:1:f:7:cf:2\ncell:W61:l:1:f:7:cf:2\ncell:O62:l:1:f:7:cf:2\ncell:P62:l:1:f:7:cf:2\ncell:Q62:l:1:f:7:cf:2\ncell:R62:l:1:f:7:cf:2\ncell:S62:l:1:f:7:cf:2\ncell:T62:l:1:f:7:cf:2\ncell:U62:l:1:f:7:cf:2\ncell:V62:l:1:f:7:cf:2\ncell:W62:l:1:f:7:cf:2\ncell:O63:l:1:f:7:cf:2\ncell:P63:l:1:f:7:cf:2\ncell:Q63:l:1:f:7:cf:2\ncell:R63:l:1:f:7:cf:2\ncell:S63:l:1:f:7:cf:2\ncell:T63:l:1:f:7:cf:2\ncell:U63:l:1:f:7:cf:2\ncell:V63:l:1:f:7:cf:2\ncell:W63:l:1:f:7:cf:2\ncell:O64:l:1:f:7:cf:2\ncell:P64:l:1:f:7:cf:2\ncell:Q64:l:1:f:7:cf:2\ncell:R64:l:1:f:7:cf:2\ncell:S64:l:1:f:7:cf:2\ncell:T64:l:1:f:7:cf:2\ncell:U64:l:1:f:7:cf:2\ncell:V64:l:1:f:7:cf:2\ncell:W64:l:1:f:7:cf:2\ncell:O65:l:1:f:7:cf:2\ncell:P65:l:1:f:7:cf:2\ncell:Q65:l:1:f:7:cf:2\ncell:R65:l:1:f:7:cf:2\ncell:S65:l:1:f:7:cf:2\ncell:T65:l:1:f:7:cf:2\ncell:U65:l:1:f:7:cf:2\ncell:V65:l:1:f:7:cf:2\ncell:W65:l:1:f:7:cf:2\ncell:O66:l:1:f:7:cf:2\ncell:P66:l:1:f:7:cf:2\ncell:Q66:l:1:f:7:cf:2\ncell:R66:l:1:f:7:cf:2\ncell:S66:l:1:f:7:cf:2\ncell:T66:l:1:f:7:cf:2\ncell:U66:l:1:f:7:cf:2\ncell:V66:l:1:f:7:cf:2\ncell:W66:l:1:f:7:cf:2\ncell:O67:l:1:f:7:cf:2\ncell:P67:l:1:f:7:cf:2\ncell:Q67:l:1:f:7:cf:2\ncell:R67:l:1:f:7:cf:2\ncell:S67:l:1:f:7:cf:2\ncell:T67:l:1:f:7:cf:2\ncell:U67:l:1:f:7:cf:2\ncell:V67:l:1:f:7:cf:2\ncell:W67:l:1:f:7:cf:2\ncell:O68:l:1:f:7:cf:2\ncell:P68:l:1:f:7:cf:2\ncell:Q68:l:1:f:7:cf:2\ncell:R68:l:1:f:7:cf:2\ncell:S68:l:1:f:7:cf:2\ncell:T68:l:1:f:7:cf:2\ncell:U68:l:1:f:7:cf:2\ncell:V68:l:1:f:7:cf:2\ncell:W68:l:1:f:7:cf:2\ncell:O69:l:1:f:7:cf:2\ncell:P69:l:1:f:7:cf:2\ncell:Q69:l:1:f:7:cf:2\ncell:R69:l:1:f:7:cf:2\ncell:S69:l:1:f:7:cf:2\ncell:T69:l:1:f:7:cf:2\ncell:U69:l:1:f:7:cf:2\ncell:V69:l:1:f:7:cf:2\ncell:W69:l:1:f:7:cf:2\ncell:O70:l:1:f:7:cf:2\ncell:P70:l:1:f:7:cf:2\ncell:Q70:l:1:f:7:cf:2\ncell:R70:l:1:f:7:cf:2\ncell:S70:l:1:f:7:cf:2\ncell:T70:l:1:f:7:cf:2\ncell:U70:l:1:f:7:cf:2\ncell:V70:l:1:f:7:cf:2\ncell:W70:l:1:f:7:cf:2\ncell:O71:l:1:f:7:cf:2\ncell:P71:l:1:f:7:cf:2\ncell:Q71:l:1:f:7:cf:2\ncell:R71:l:1:f:7:cf:2\ncell:S71:l:1:f:7:cf:2\ncell:T71:l:1:f:7:cf:2\ncell:U71:l:1:f:7:cf:2\ncell:V71:l:1:f:7:cf:2\ncell:W71:l:1:f:7:cf:2\ncell:O72:l:1:f:7:cf:2\ncell:P72:l:1:f:7:cf:2\ncell:Q72:l:1:f:7:cf:2\ncell:R72:l:1:f:7:cf:2\ncell:S72:l:1:f:7:cf:2\ncell:T72:l:1:f:7:cf:2\ncell:U72:l:1:f:7:cf:2\ncell:V72:l:1:f:7:cf:2\ncell:W72:l:1:f:7:cf:2\ncell:O73:l:1:f:7:cf:2\ncell:P73:l:1:f:7:cf:2\ncell:Q73:l:1:f:7:cf:2\ncell:R73:l:1:f:7:cf:2\ncell:S73:l:1:f:7:cf:2\ncell:T73:l:1:f:7:cf:2\ncell:U73:l:1:f:7:cf:2\ncell:V73:l:1:f:7:cf:2\ncell:W73:l:1:f:7:cf:2\ncell:O74:l:1:f:7:cf:2\ncell:P74:l:1:f:7:cf:2\ncell:Q74:l:1:f:7:cf:2\ncell:R74:l:1:f:7:cf:2\ncell:S74:l:1:f:7:cf:2\ncell:T74:l:1:f:7:cf:2\ncell:U74:l:1:f:7:cf:2\ncell:V74:l:1:f:7:cf:2\ncell:W74:l:1:f:7:cf:2\ncell:O75:l:1:f:7:cf:2\ncell:P75:l:1:f:7:cf:2\ncell:Q75:l:1:f:7:cf:2\ncell:R75:l:1:f:7:cf:2\ncell:S75:l:1:f:7:cf:2\ncell:T75:l:1:f:7:cf:2\ncell:U75:l:1:f:7:cf:2\ncell:V75:l:1:f:7:cf:2\ncell:W75:l:1:f:7:cf:2\ncell:O76:l:1:f:7:cf:2\ncell:P76:l:1:f:7:cf:2\ncell:Q76:l:1:f:7:cf:2\ncell:R76:l:1:f:7:cf:2\ncell:S76:l:1:f:7:cf:2\ncell:T76:l:1:f:7:cf:2\ncell:U76:l:1:f:7:cf:2\ncell:V76:l:1:f:7:cf:2\ncell:W76:l:1:f:7:cf:2\ncell:O77:l:1:f:7:cf:2\ncell:P77:l:1:f:7:cf:2\ncell:Q77:l:1:f:7:cf:2\ncell:R77:l:1:f:7:cf:2\ncell:S77:l:1:f:7:cf:2\ncell:T77:l:1:f:7:cf:2\ncell:U77:l:1:f:7:cf:2\ncell:V77:l:1:f:7:cf:2\ncell:W77:l:1:f:7:cf:2\ncell:O78:l:1:f:7:cf:2\ncell:P78:l:1:f:7:cf:2\ncell:Q78:l:1:f:7:cf:2\ncell:R78:l:1:f:7:cf:2\ncell:S78:l:1:f:7:cf:2\ncell:T78:l:1:f:7:cf:2\ncell:U78:l:1:f:7:cf:2\ncell:V78:l:1:f:7:cf:2\ncell:W78:l:1:f:7:cf:2\ncell:O79:l:1:f:7:cf:2\ncell:P79:l:1:f:7:cf:2\ncell:Q79:l:1:f:7:cf:2\ncell:R79:l:1:f:7:cf:2\ncell:S79:l:1:f:7:cf:2\ncell:T79:l:1:f:7:cf:2\ncell:U79:l:1:f:7:cf:2\ncell:V79:l:1:f:7:cf:2\ncell:W79:l:1:f:7:cf:2\ncell:O80:l:1:f:7:cf:2\ncell:P80:l:1:f:7:cf:2\ncell:Q80:l:1:f:7:cf:2\ncell:R80:l:1:f:7:cf:2\ncell:S80:l:1:f:7:cf:2\ncell:T80:l:1:f:7:cf:2\ncell:U80:l:1:f:7:cf:2\ncell:V80:l:1:f:7:cf:2\ncell:W80:l:1:f:7:cf:2\ncell:O81:l:1:f:7:cf:2\ncell:P81:l:1:f:7:cf:2\ncell:Q81:l:1:f:7:cf:2\ncell:R81:l:1:f:7:cf:2\ncell:S81:l:1:f:7:cf:2\ncell:T81:l:1:f:7:cf:2\ncell:U81:l:1:f:7:cf:2\ncell:V81:l:1:f:7:cf:2\ncell:W81:l:1:f:7:cf:2\ncell:O82:l:1:f:7:cf:2\ncell:P82:l:1:f:7:cf:2\ncell:Q82:l:1:f:7:cf:2\ncell:R82:l:1:f:7:cf:2\ncell:S82:l:1:f:7:cf:2\ncell:T82:l:1:f:7:cf:2\ncell:U82:l:1:f:7:cf:2\ncell:V82:l:1:f:7:cf:2\ncell:W82:l:1:f:7:cf:2\ncell:O83:l:1:f:7:cf:2\ncell:P83:l:1:f:7:cf:2\ncell:Q83:l:1:f:7:cf:2\ncell:R83:l:1:f:7:cf:2\ncell:S83:l:1:f:7:cf:2\ncell:T83:l:1:f:7:cf:2\ncell:U83:l:1:f:7:cf:2\ncell:V83:l:1:f:7:cf:2\ncell:W83:l:1:f:7:cf:2\ncell:O84:l:1:f:7:cf:2\ncell:P84:l:1:f:7:cf:2\ncell:Q84:l:1:f:7:cf:2\ncell:R84:l:1:f:7:cf:2\ncell:S84:l:1:f:7:cf:2\ncell:T84:l:1:f:7:cf:2\ncell:U84:l:1:f:7:cf:2\ncell:V84:l:1:f:7:cf:2\ncell:W84:l:1:f:7:cf:2\ncell:O85:l:1:f:7:cf:2\ncell:P85:l:1:f:7:cf:2\ncell:Q85:l:1:f:7:cf:2\ncell:R85:l:1:f:7:cf:2\ncell:S85:l:1:f:7:cf:2\ncell:T85:l:1:f:7:cf:2\ncell:U85:l:1:f:7:cf:2\ncell:V85:l:1:f:7:cf:2\ncell:W85:l:1:f:7:cf:2\ncell:O86:l:1:f:7:cf:2\ncell:P86:l:1:f:7:cf:2\ncell:Q86:l:1:f:7:cf:2\ncell:R86:l:1:f:7:cf:2\ncell:S86:l:1:f:7:cf:2\ncell:T86:l:1:f:7:cf:2\ncell:U86:l:1:f:7:cf:2\ncell:V86:l:1:f:7:cf:2\ncell:W86:l:1:f:7:cf:2\ncell:O87:l:1:f:7:cf:2\ncell:P87:l:1:f:7:cf:2\ncell:Q87:l:1:f:7:cf:2\ncell:R87:l:1:f:7:cf:2\ncell:S87:l:1:f:7:cf:2\ncell:T87:l:1:f:7:cf:2\ncell:U87:l:1:f:7:cf:2\ncell:V87:l:1:f:7:cf:2\ncell:W87:l:1:f:7:cf:2\ncell:O88:l:1:f:7:cf:2\ncell:P88:l:1:f:7:cf:2\ncell:Q88:l:1:f:7:cf:2\ncell:R88:l:1:f:7:cf:2\ncell:S88:l:1:f:7:cf:2\ncell:T88:l:1:f:7:cf:2\ncell:U88:l:1:f:7:cf:2\ncell:V88:l:1:f:7:cf:2\ncell:W88:l:1:f:7:cf:2\ncell:O89:l:1:f:7:cf:2\ncell:P89:l:1:f:7:cf:2\ncell:Q89:l:1:f:7:cf:2\ncell:R89:l:1:f:7:cf:2\ncell:S89:l:1:f:7:cf:2\ncell:T89:l:1:f:7:cf:2\ncell:U89:l:1:f:7:cf:2\ncell:V89:l:1:f:7:cf:2\ncell:W89:l:1:f:7:cf:2\ncell:O90:l:1:f:7:cf:2\ncell:P90:l:1:f:7:cf:2\ncell:Q90:l:1:f:7:cf:2\ncell:R90:l:1:f:7:cf:2\ncell:S90:l:1:f:7:cf:2\ncell:T90:l:1:f:7:cf:2\ncell:U90:l:1:f:7:cf:2\ncell:V90:l:1:f:7:cf:2\ncell:W90:l:1:f:7:cf:2\ncell:O91:l:1:f:7:cf:2\ncell:P91:l:1:f:7:cf:2\ncell:Q91:l:1:f:7:cf:2\ncell:R91:l:1:f:7:cf:2\ncell:S91:l:1:f:7:cf:2\ncell:T91:l:1:f:7:cf:2\ncell:U91:l:1:f:7:cf:2\ncell:V91:l:1:f:7:cf:2\ncell:W91:l:1:f:7:cf:2\ncell:O92:l:1:f:7:cf:2\ncell:P92:l:1:f:7:cf:2\ncell:Q92:l:1:f:7:cf:2\ncell:R92:l:1:f:7:cf:2\ncell:S92:l:1:f:7:cf:2\ncell:T92:l:1:f:7:cf:2\ncell:U92:l:1:f:7:cf:2\ncell:V92:l:1:f:7:cf:2\ncell:W92:l:1:f:7:cf:2\ncell:O93:l:1:f:7:cf:2\ncell:P93:l:1:f:7:cf:2\ncell:Q93:l:1:f:7:cf:2\ncell:R93:l:1:f:7:cf:2\ncell:S93:l:1:f:7:cf:2\ncell:T93:l:1:f:7:cf:2\ncell:U93:l:1:f:7:cf:2\ncell:V93:l:1:f:7:cf:2\ncell:W93:l:1:f:7:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:S94:l:1:f:8:cf:2\ncell:T94:l:1:f:8:cf:2\ncell:U94:l:1:f:8:cf:2\ncell:V94:l:1:f:8:cf:2\ncell:W94:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:S95:l:1:f:8:cf:2\ncell:T95:l:1:f:8:cf:2\ncell:U95:l:1:f:8:cf:2\ncell:V95:l:1:f:8:cf:2\ncell:W95:l:1:f:8:cf:2\ncell:O96:l:1:f:8:cf:2\ncell:P96:l:1:f:8:cf:2\ncell:Q96:l:1:f:8:cf:2\ncell:R96:l:1:f:8:cf:2\ncell:S96:l:1:f:8:cf:2\ncell:T96:l:1:f:8:cf:2\ncell:U96:l:1:f:8:cf:2\ncell:V96:l:1:f:8:cf:2\ncell:W96:l:1:f:8:cf:2\ncell:O97:l:1:f:8:cf:2\ncell:P97:l:1:f:8:cf:2\ncell:Q97:l:1:f:8:cf:2\ncell:R97:l:1:f:8:cf:2\ncell:S97:l:1:f:8:cf:2\ncell:T97:l:1:f:8:cf:2\ncell:U97:l:1:f:8:cf:2\ncell:V97:l:1:f:8:cf:2\ncell:W97:l:1:f:8:cf:2\ncell:A98:l:1:f:8:cf:2\ncell:B98:l:1:f:8:cf:2\ncell:C98:l:1:f:8:cf:2\ncell:D98:l:1:f:8:cf:2\ncell:E98:l:1:f:8:cf:2\ncell:F98:t:Monthly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G98:l:1:f:8:cf:2\ncell:H98:l:1:f:8:cf:2\ncell:I98:l:1:f:8:cf:2\ncell:J98:l:1:f:8:cf:2\ncell:K98:l:1:f:8:cf:2\ncell:L98:l:1:f:8:cf:2\ncell:M98:l:1:f:8:cf:2\ncell:N98:l:1:f:8:cf:2\ncell:O98:l:1:f:8:cf:2\ncell:P98:l:1:f:8:cf:2\ncell:Q98:l:1:f:8:cf:2\ncell:R98:l:1:f:8:cf:2\ncell:S98:l:1:f:8:cf:2\ncell:T98:l:1:f:8:cf:2\ncell:U98:l:1:f:8:cf:2\ncell:V98:l:1:f:8:cf:2\ncell:W98:l:1:f:8:cf:2\ncell:A99:l:1:f:8:cf:2\ncell:B99:l:1:f:8:cf:2\ncell:C99:l:1:f:8:cf:2\ncell:D99:l:1:f:8:cf:2\ncell:E99:l:1:f:8:cf:2\ncell:F99:t:Semi-Annually:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G99:l:1:f:8:cf:2\ncell:H99:l:1:f:8:cf:2\ncell:I99:l:1:f:8:cf:2\ncell:J99:l:1:f:8:cf:2\ncell:K99:l:1:f:8:cf:2\ncell:L99:l:1:f:8:cf:2\ncell:M99:l:1:f:8:cf:2\ncell:N99:l:1:f:8:cf:2\ncell:O99:l:1:f:8:cf:2\ncell:P99:l:1:f:8:cf:2\ncell:Q99:l:1:f:8:cf:2\ncell:R99:l:1:f:8:cf:2\ncell:S99:l:1:f:8:cf:2\ncell:T99:l:1:f:8:cf:2\ncell:U99:l:1:f:8:cf:2\ncell:V99:l:1:f:8:cf:2\ncell:W99:l:1:f:8:cf:2\ncell:A100:l:1:f:8:cf:2\ncell:B100:l:1:f:8:cf:2\ncell:C100:l:1:f:8:cf:2\ncell:D100:l:1:f:8:cf:2\ncell:E100:l:1:f:8:cf:2\ncell:F100:t:Quarterly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G100:l:1:f:8:cf:2\ncell:H100:l:1:f:8:cf:2\ncell:I100:l:1:f:8:cf:2\ncell:J100:l:1:f:8:cf:2\ncell:K100:l:1:f:8:cf:2\ncell:L100:l:1:f:8:cf:2\ncell:M100:l:1:f:8:cf:2\ncell:N100:l:1:f:8:cf:2\ncell:O100:l:1:f:8:cf:2\ncell:P100:l:1:f:8:cf:2\ncell:Q100:l:1:f:8:cf:2\ncell:R100:l:1:f:8:cf:2\ncell:S100:l:1:f:8:cf:2\ncell:T100:l:1:f:8:cf:2\ncell:U100:l:1:f:8:cf:2\ncell:V100:l:1:f:8:cf:2\ncell:W100:l:1:f:8:cf:2\ncell:A101:l:1:f:8:cf:2\ncell:B101:l:1:f:8:cf:2\ncell:C101:l:1:f:8:cf:2\ncell:D101:l:1:f:8:cf:2\ncell:E101:l:1:f:8:cf:2\ncell:F101:t:Yearly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G101:l:1:f:8:cf:2\ncell:H101:l:1:f:8:cf:2\ncell:I101:l:1:f:8:cf:2\ncell:J101:l:1:f:8:cf:2\ncell:K101:l:1:f:8:cf:2\ncell:L101:l:1:f:8:cf:2\ncell:M101:l:1:f:8:cf:2\ncell:N101:l:1:f:8:cf:2\ncell:O101:l:1:f:8:cf:2\ncell:P101:l:1:f:8:cf:2\ncell:Q101:l:1:f:8:cf:2\ncell:R101:l:1:f:8:cf:2\ncell:S101:l:1:f:8:cf:2\ncell:T101:l:1:f:8:cf:2\ncell:U101:l:1:f:8:cf:2\ncell:V101:l:1:f:8:cf:2\ncell:W101:l:1:f:8:cf:2\ncell:A102:l:1:f:8:cf:2\ncell:B102:l:1:f:8:cf:2\ncell:C102:l:1:f:8:cf:2\ncell:D102:l:1:f:8:cf:2\ncell:E102:l:1:f:8:cf:2\ncell:F102:l:1:f:8:cf:2\ncell:G102:l:1:f:8:cf:2\ncell:H102:l:1:f:8:cf:2\ncell:I102:l:1:f:8:cf:2\ncell:J102:l:1:f:8:cf:2\ncell:K102:l:1:f:8:cf:2\ncell:L102:l:1:f:8:cf:2\ncell:M102:l:1:f:8:cf:2\ncell:N102:l:1:f:8:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:A103:l:1:f:8:cf:2\ncell:B103:l:1:f:8:cf:2\ncell:C103:l:1:f:8:cf:2\ncell:D103:l:1:f:8:cf:2\ncell:E103:l:1:f:8:cf:2\ncell:F103:l:1:f:8:cf:2\ncell:G103:l:1:f:8:cf:2\ncell:H103:l:1:f:8:cf:2\ncell:I103:l:1:f:8:cf:2\ncell:J103:l:1:f:8:cf:2\ncell:K103:l:1:f:8:cf:2\ncell:L103:l:1:f:8:cf:2\ncell:M103:l:1:f:8:cf:2\ncell:N103:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:A104:l:1:f:8:cf:2\ncell:B104:l:1:f:8:cf:2\ncell:C104:l:1:f:8:cf:2\ncell:D104:l:1:f:8:cf:2\ncell:E104:l:1:f:8:cf:2\ncell:F104:l:1:f:8:cf:2\ncell:G104:l:1:f:8:cf:2\ncell:H104:l:1:f:8:cf:2\ncell:I104:l:1:f:8:cf:2\ncell:J104:l:1:f:8:cf:2\ncell:K104:l:1:f:8:cf:2\ncell:L104:l:1:f:8:cf:2\ncell:M104:l:1:f:8:cf:2\ncell:N104:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:A105:l:1:f:8:cf:2\ncell:B105:l:1:f:8:cf:2\ncell:C105:l:1:f:8:cf:2\ncell:D105:l:1:f:8:cf:2\ncell:E105:l:1:f:8:cf:2\ncell:F105:l:1:f:8:cf:2\ncell:G105:l:1:f:8:cf:2\ncell:H105:l:1:f:8:cf:2\ncell:I105:l:1:f:8:cf:2\ncell:J105:l:1:f:8:cf:2\ncell:K105:l:1:f:8:cf:2\ncell:L105:l:1:f:8:cf:2\ncell:M105:l:1:f:8:cf:2\ncell:N105:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:A106:l:1:f:8:cf:2\ncell:B106:l:1:f:8:cf:2\ncell:C106:l:1:f:8:cf:2\ncell:D106:l:1:f:8:cf:2\ncell:E106:l:1:f:8:cf:2\ncell:F106:l:1:f:8:cf:2\ncell:G106:l:1:f:8:cf:2\ncell:H106:l:1:f:8:cf:2\ncell:I106:l:1:f:8:cf:2\ncell:J106:l:1:f:8:cf:2\ncell:K106:l:1:f:8:cf:2\ncell:L106:l:1:f:8:cf:2\ncell:M106:l:1:f:8:cf:2\ncell:N106:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:A107:l:1:f:8:cf:2\ncell:B107:l:1:f:8:cf:2\ncell:C107:l:1:f:8:cf:2\ncell:D107:l:1:f:8:cf:2\ncell:E107:l:1:f:8:cf:2\ncell:F107:l:1:f:8:cf:2\ncell:G107:l:1:f:8:cf:2\ncell:H107:l:1:f:8:cf:2\ncell:I107:l:1:f:8:cf:2\ncell:J107:l:1:f:8:cf:2\ncell:K107:l:1:f:8:cf:2\ncell:L107:l:1:f:8:cf:2\ncell:M107:l:1:f:8:cf:2\ncell:N107:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:A108:l:1:f:8:cf:2\ncell:B108:l:1:f:8:cf:2\ncell:C108:l:1:f:8:cf:2\ncell:D108:l:1:f:8:cf:2\ncell:E108:l:1:f:8:cf:2\ncell:F108:l:1:f:8:cf:2\ncell:G108:l:1:f:8:cf:2\ncell:H108:l:1:f:8:cf:2\ncell:I108:l:1:f:8:cf:2\ncell:J108:l:1:f:8:cf:2\ncell:K108:l:1:f:8:cf:2\ncell:L108:l:1:f:8:cf:2\ncell:M108:l:1:f:8:cf:2\ncell:N108:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:A109:l:1:f:8:cf:2\ncell:B109:l:1:f:8:cf:2\ncell:C109:l:1:f:8:cf:2\ncell:D109:l:1:f:8:cf:2\ncell:E109:l:1:f:8:cf:2\ncell:F109:l:1:f:8:cf:2\ncell:G109:l:1:f:8:cf:2\ncell:H109:l:1:f:8:cf:2\ncell:I109:l:1:f:8:cf:2\ncell:J109:l:1:f:8:cf:2\ncell:K109:l:1:f:8:cf:2\ncell:L109:l:1:f:8:cf:2\ncell:M109:l:1:f:8:cf:2\ncell:N109:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nsheet:c:27:r:109:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 20pt Arial\nfont:4:normal bold 9pt Arial\nfont:5:normal normal * Arial\nfont:6:normal normal * arial,helvetica,sans-serif\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 7pt Arial\nfont:9:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nname:COMPARISON::S35\\cU49\nname:TRACKING::AC35\\cAE49\n', - }, - name: "sheet10", - hidden: "0", - }, - sheet6: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:7:cf:2:ntvf:3\ncell:B1:l:1:f:7:cf:2\ncell:C1:l:1:f:7:cf:2\ncell:D1:l:1:f:7:cf:2\ncell:E1:l:1:f:7:cf:2\ncell:F1:l:1:f:7:cf:2\ncell:G1:l:1:f:7:cf:2\ncell:H1:l:1:f:7:cf:2\ncell:I1:l:1:f:7:cf:2\ncell:J1:l:1:f:7:cf:2\ncell:K1:l:1:f:7:cf:2\ncell:L1:l:1:f:7:cf:2\ncell:M1:l:1:f:7:cf:2\ncell:N1:l:1:f:7:cf:2\ncell:O1:l:1:f:7:cf:2\ncell:P1:l:1:f:7:cf:2\ncell:Q1:l:1:f:7:cf:2\ncell:R1:l:1:f:7:cf:2\ncell:S1:l:1:f:7:cf:2\ncell:T1:l:1:f:7:cf:2\ncell:U1:l:1:f:7:cf:2\ncell:V1:l:1:f:7:cf:2\ncell:W1:l:1:f:7:cf:2\ncell:A2:l:1:f:7:cf:2\ncell:B2:l:1:f:7:cf:2\ncell:C2:l:1:f:7:cf:2\ncell:D2:t:Expenses:l:2:f:4:cf:2\ncell:E2:l:1:f:7:cf:2\ncell:F2:l:1:f:7:cf:2\ncell:G2:l:1:f:7:cf:2\ncell:H2:l:1:f:7:cf:2\ncell:I2:l:1:f:7:cf:2\ncell:J2:l:1:f:7:cf:2\ncell:K2:l:1:f:7:cf:2\ncell:L2:l:1:f:7:cf:2\ncell:M2:l:1:f:7:cf:2\ncell:N2:l:1:f:7:cf:2\ncell:O2:l:1:f:7:cf:2\ncell:P2:l:1:f:7:cf:2\ncell:Q2:l:1:f:7:cf:2\ncell:R2:l:1:f:7:cf:2\ncell:S2:l:1:f:7:cf:2\ncell:T2:l:1:f:7:cf:2\ncell:U2:l:1:f:7:cf:2\ncell:V2:l:1:f:7:cf:2\ncell:W2:l:1:f:7:cf:2\ncell:A3:l:1:f:7:cf:2\ncell:B3:l:1:f:7:cf:2\ncell:C3:l:1:f:7:cf:2\ncell:D3:l:1:f:7:cf:2\ncell:G3:l:1:f:7:cf:2\ncell:H3:l:1:f:7:cf:2\ncell:I3:l:1:f:7:cf:2\ncell:J3:l:1:f:7:cf:2\ncell:K3:l:1:f:7:cf:2\ncell:L3:l:1:f:7:cf:2\ncell:M3:l:1:f:7:cf:2\ncell:N3:l:1:f:7:cf:2\ncell:O3:l:1:f:7:cf:2\ncell:P3:l:1:f:7:cf:2\ncell:Q3:t: :l:1:f:7:cf:2\ncell:R3:l:1:f:7:cf:2\ncell:S3:l:1:f:7:cf:2\ncell:T3:l:1:f:7:cf:2\ncell:U3:l:1:f:7:cf:2\ncell:V3:l:1:f:7:cf:2\ncell:W3:l:1:f:7:cf:2\ncell:B4:t:Credit Card Expense:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C4:l:3:f:2:c:3:bg:1:cf:2\ncell:D4:l:3:f:2:c:3:bg:1:cf:1\ncell:E4:vtf:n:209:SUM(E5\\cE11):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F4:vtf:n:2508:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O4:l:1:f:7:cf:2\ncell:P4:l:1:f:7:cf:2\ncell:Q4:l:1:f:7:cf:2\ncell:R4:l:1:f:7:cf:2\ncell:S4:l:1:f:7:cf:2\ncell:T4:l:1:f:7:cf:2\ncell:U4:l:1:f:7:cf:2\ncell:V4:l:1:f:7:cf:2\ncell:W4:l:1:f:7:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:7:cf:2\ncell:C5:l:3:f:7:cf:2\ncell:D5:t:Card 1:l:3:f:6:cf:2\ncell:E5:v:209:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F5:vtf:n:2508:IF( (E5*12)=0,"",(E5*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:7:cf:2\ncell:P5:l:1:f:7:cf:2\ncell:Q5:l:1:f:7:cf:2\ncell:R5:l:1:f:7:cf:2\ncell:S5:l:1:f:7:cf:2\ncell:T5:l:1:f:7:cf:2\ncell:U5:l:1:f:7:cf:2\ncell:V5:l:1:f:7:cf:2\ncell:W5:l:1:f:7:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:7:bg:2:cf:2\ncell:C6:l:3:f:7:bg:2:cf:2\ncell:D6:t:Card 2:l:3:f:6:bg:2:cf:2\ncell:E6:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F6:vtf:t::IF( (E6*12)=0,"",(E6*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:7:cf:2\ncell:P6:l:1:f:7:cf:2\ncell:Q6:l:1:f:7:cf:2\ncell:R6:l:1:f:7:cf:2\ncell:S6:l:1:f:7:cf:2\ncell:T6:l:1:f:7:cf:2\ncell:U6:l:1:f:7:cf:2\ncell:V6:l:1:f:7:cf:2\ncell:W6:l:1:f:7:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:7:cf:2\ncell:C7:l:3:f:7:cf:2\ncell:D7:t:Card 3:l:3:f:6:cf:2\ncell:E7:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:7:cf:2\ncell:P7:l:1:f:7:cf:2\ncell:Q7:l:1:f:7:cf:2\ncell:R7:l:1:f:7:cf:2\ncell:S7:l:1:f:7:cf:2\ncell:T7:l:1:f:7:cf:2\ncell:U7:l:1:f:7:cf:2\ncell:V7:l:1:f:7:cf:2\ncell:W7:l:1:f:7:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:bg:2:cf:2\ncell:C8:l:3:f:7:bg:2:cf:2\ncell:D8:t:Card 4:l:3:f:6:bg:2:cf:2\ncell:E8:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:7:cf:2\ncell:P8:l:1:f:7:cf:2\ncell:Q8:l:1:f:7:cf:2\ncell:R8:l:1:f:7:cf:2\ncell:S8:l:1:f:7:cf:2\ncell:T8:l:1:f:7:cf:2\ncell:U8:l:1:f:7:cf:2\ncell:V8:l:1:f:7:cf:2\ncell:W8:l:1:f:7:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:7:cf:2\ncell:C9:l:3:f:7:cf:2\ncell:D9:t:Department Store Card:l:3:f:6:cf:2\ncell:E9:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F9:vtf:t::IF( (E9*12)=0,"",(E9*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:7:cf:2\ncell:P9:l:1:f:7:cf:2\ncell:Q9:l:1:f:7:cf:2\ncell:R9:l:1:f:7:cf:2\ncell:S9:l:1:f:7:cf:2\ncell:T9:l:1:f:7:cf:2\ncell:U9:l:1:f:7:cf:2\ncell:V9:l:1:f:7:cf:2\ncell:W9:l:1:f:7:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:7:bg:2:cf:2\ncell:C10:l:3:f:7:bg:2:cf:2\ncell:D10:t:Gas Card:l:3:f:6:bg:2:cf:2\ncell:E10:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:7:cf:2\ncell:P10:l:1:f:7:cf:2\ncell:Q10:l:1:f:7:cf:2\ncell:R10:l:1:f:7:cf:2\ncell:S10:l:1:f:7:cf:2\ncell:T10:l:1:f:7:cf:2\ncell:U10:l:1:f:7:cf:2\ncell:V10:l:1:f:7:cf:2\ncell:W10:l:1:f:7:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:7:cf:2\ncell:C11:l:3:f:7:cf:2\ncell:D11:t:Other:l:3:f:6:cf:2\ncell:E11:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:7:cf:2\ncell:P11:l:1:f:7:cf:2\ncell:Q11:l:1:f:7:cf:2\ncell:R11:l:1:f:7:cf:2\ncell:S11:l:1:f:7:cf:2\ncell:T11:l:1:f:7:cf:2\ncell:U11:l:1:f:7:cf:2\ncell:V11:l:1:f:7:cf:2\ncell:W11:l:1:f:7:cf:2\ncell:B12:t:Buisness:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C12:l:3:f:7:bg:2:cf:2\ncell:D12:l:3:f:6:bg:2:cf:2\ncell:E12:vtf:n:780:SUM(E13\\cE17):b:2:2:2:2:l:4:f:6:c:3:bg:1:cf:3:ntvf:1\ncell:F12:vtf:n:9360:IF( (E12*12)=0,"",(E12*12)):b:2:2:2:2:l:4:f:6:c:3:bg:1:cf:3:ntvf:1\ncell:O12:l:1:f:7:cf:2\ncell:P12:l:1:f:7:cf:2\ncell:Q12:l:1:f:7:cf:2\ncell:R12:l:1:f:7:cf:2\ncell:S12:l:1:f:7:cf:2\ncell:T12:l:1:f:7:cf:2\ncell:U12:l:1:f:7:cf:2\ncell:V12:l:1:f:7:cf:2\ncell:W12:l:1:f:7:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:7:cf:2\ncell:C13:l:3:f:7:cf:2\ncell:D13:t:Deductible Expenses:l:3:f:6:cf:2\ncell:E13:v:780:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F13:vtf:n:9360:IF( (E13*12)=0,"",(E13*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:7:cf:2\ncell:P13:l:1:f:7:cf:2\ncell:Q13:l:1:f:7:cf:2\ncell:R13:l:1:f:7:cf:2\ncell:S13:l:1:f:7:cf:2\ncell:T13:l:1:f:7:cf:2\ncell:U13:l:1:f:7:cf:2\ncell:V13:l:1:f:7:cf:2\ncell:W13:l:1:f:7:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:bg:2:cf:2\ncell:C14:l:3:f:7:bg:2:cf:2\ncell:D14:t:Non- Deductible Expenses:l:3:f:6:bg:2:cf:2\ncell:E14:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F14:vtf:t::IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:7:cf:2\ncell:P14:l:1:f:7:cf:2\ncell:Q14:l:1:f:7:cf:2\ncell:R14:l:1:f:7:cf:2\ncell:S14:l:1:f:7:cf:2\ncell:T14:l:1:f:7:cf:2\ncell:U14:l:1:f:7:cf:2\ncell:V14:l:1:f:7:cf:2\ncell:W14:l:1:f:7:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:7:cf:2\ncell:C15:l:3:f:7:cf:2\ncell:D15:t:Others:l:3:f:6:cf:2\ncell:E15:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F15:vtf:t::IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:7:cf:2\ncell:P15:l:1:f:7:cf:2\ncell:Q15:l:1:f:7:cf:2\ncell:R15:l:1:f:7:cf:2\ncell:S15:l:1:f:7:cf:2\ncell:T15:l:1:f:7:cf:2\ncell:U15:l:1:f:7:cf:2\ncell:V15:l:1:f:7:cf:2\ncell:W15:l:1:f:7:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:7:bg:2:cf:2\ncell:C16:l:3:f:7:bg:2:cf:2\ncell:D16:t:Others:l:3:f:6:bg:2:cf:2\ncell:E16:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:7:cf:2\ncell:P16:l:1:f:7:cf:2\ncell:Q16:l:1:f:7:cf:2\ncell:R16:l:1:f:7:cf:2\ncell:S16:l:1:f:7:cf:2\ncell:T16:l:1:f:7:cf:2\ncell:U16:l:1:f:7:cf:2\ncell:V16:l:1:f:7:cf:2\ncell:W16:l:1:f:7:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:7:cf:2\ncell:C17:l:3:f:7:cf:2\ncell:D17:t:Others:l:3:f:6:cf:2\ncell:E17:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:7:cf:2\ncell:P17:l:1:f:7:cf:2\ncell:Q17:l:1:f:7:cf:2\ncell:R17:l:1:f:7:cf:2\ncell:S17:l:1:f:7:cf:2\ncell:T17:l:1:f:7:cf:2\ncell:U17:l:1:f:7:cf:2\ncell:V17:l:1:f:7:cf:2\ncell:W17:l:1:f:7:cf:2\ncell:B18:t:Vacations/Expenses:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C18:l:3:f:2:c:3:bg:1:cf:2\ncell:D18:l:3:f:2:c:3:bg:1:cf:1\ncell:E18:vtf:n:98:SUM(E19\\cE24):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F18:vtf:n:1176:IF( (E18*12)=0,"",(E18*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O18:l:1:f:7:cf:2\ncell:P18:l:1:f:7:cf:2\ncell:Q18:l:1:f:7:cf:2\ncell:R18:l:1:f:7:cf:2\ncell:S18:l:1:f:7:cf:2\ncell:T18:l:1:f:7:cf:2\ncell:U18:l:1:f:7:cf:2\ncell:V18:l:1:f:7:cf:2\ncell:W18:l:1:f:7:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:7:cf:2\ncell:C19:l:3:f:7:cf:2\ncell:D19:t:Airfare:l:3:f:6:cf:2\ncell:E19:v:98:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F19:vtf:n:1176:IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:7:cf:2\ncell:P19:l:1:f:7:cf:2\ncell:Q19:l:1:f:7:cf:2\ncell:R19:l:1:f:7:cf:2\ncell:S19:l:1:f:7:cf:2\ncell:T19:l:1:f:7:cf:2\ncell:U19:l:1:f:7:cf:2\ncell:V19:l:1:f:7:cf:2\ncell:W19:l:1:f:7:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:7:bg:2:cf:2\ncell:C20:l:3:f:7:bg:2:cf:2\ncell:D20:t:Accomodation:l:3:f:6:bg:2:cf:2\ncell:E20:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:7:cf:2\ncell:P20:l:1:f:7:cf:2\ncell:Q20:l:1:f:7:cf:2\ncell:R20:l:1:f:7:cf:2\ncell:S20:l:1:f:7:cf:2\ncell:T20:l:1:f:7:cf:2\ncell:U20:l:1:f:7:cf:2\ncell:V20:l:1:f:7:cf:2\ncell:W20:l:1:f:7:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:cf:2\ncell:C21:l:3:f:7:cf:2\ncell:D21:t:Food:l:3:f:6:cf:2\ncell:E21:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:7:cf:2\ncell:P21:l:1:f:7:cf:2\ncell:Q21:l:1:f:7:cf:2\ncell:R21:l:1:f:7:cf:2\ncell:S21:l:1:f:7:cf:2\ncell:T21:l:1:f:7:cf:2\ncell:U21:l:1:f:7:cf:2\ncell:V21:l:1:f:7:cf:2\ncell:W21:l:1:f:7:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:7:bg:2:cf:2\ncell:C22:l:3:f:7:bg:2:cf:2\ncell:D22:t:Pet Boarding:l:3:f:6:bg:2:cf:2\ncell:E22:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G22:b::::1\ncell:O22:l:1:f:7:cf:2\ncell:P22:l:1:f:7:cf:2\ncell:Q22:l:1:f:7:cf:2\ncell:R22:l:1:f:7:cf:2\ncell:S22:l:1:f:7:cf:2\ncell:T22:l:1:f:7:cf:2\ncell:U22:l:1:f:7:cf:2\ncell:V22:l:1:f:7:cf:2\ncell:W22:l:1:f:7:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:7:cf:2\ncell:C23:l:3:f:7:cf:2\ncell:D23:t:Rental Car:l:3:f:6:cf:2\ncell:E23:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:7:cf:2\ncell:P23:l:1:f:7:cf:2\ncell:Q23:l:1:f:7:cf:2\ncell:R23:l:1:f:7:cf:2\ncell:S23:l:1:f:7:cf:2\ncell:T23:l:1:f:7:cf:2\ncell:U23:l:1:f:7:cf:2\ncell:V23:l:1:f:7:cf:2\ncell:W23:l:1:f:7:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:7:bg:2:cf:2\ncell:C24:l:3:f:7:bg:2:cf:2\ncell:D24:t:Souvenier:l:3:f:6:bg:2:cf:2\ncell:E24:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:7:cf:2\ncell:P24:l:1:f:7:cf:2\ncell:Q24:l:1:f:7:cf:2\ncell:R24:l:1:f:7:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:7:cf:2\ncell:C25:l:3:f:7:cf:2\ncell:D25:t:Others:l:3:f:6:cf:2\ncell:E25:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F25:vtf:t::IF( (E25*12)=0,"",(E25*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G25:b::::1\ncell:O25:l:1:f:7:cf:2\ncell:P25:l:1:f:7:cf:2\ncell:Q25:l:1:f:7:cf:2\ncell:R25:l:1:f:7:cf:2\ncell:B26:t:Miscellaneous:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C26:l:3:f:2:c:3:bg:1:cf:2\ncell:D26:l:3:f:2:c:3:bg:1:cf:1\ncell:E26:vtf:n:222:SUM(E27\\cE29):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F26:vtf:n:2664:IF( (E26*12)=0,"",(E26*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O26:l:1:f:7:cf:2\ncell:P26:l:1:f:7:cf:2\ncell:Q26:l:1:f:7:cf:2\ncell:R26:l:1:f:7:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:7:cf:2\ncell:C27:l:3:f:7:cf:2\ncell:D27:t:Tobacco Consumption:l:3:f:6:cf:2\ncell:E27:v:136:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F27:vtf:n:1632:IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:7:cf:2\ncell:P27:l:1:f:7:cf:2\ncell:Q27:l:1:f:7:cf:2\ncell:R27:l:1:f:7:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:7:bg:2:cf:2\ncell:C28:l:3:f:7:bg:2:cf:2\ncell:D28:t:Others:l:3:f:6:bg:2:cf:2\ncell:E28:v:86:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F28:vtf:n:1032:IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:7:cf:2\ncell:P28:l:1:f:7:cf:2\ncell:Q28:l:1:f:7:cf:2\ncell:R28:l:1:f:7:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:7:cf:2\ncell:C29:l:3:f:7:cf:2\ncell:D29:t:Others:l:3:f:6:cf:2\ncell:E29:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:7:cf:2\ncell:P29:l:1:f:7:cf:2\ncell:Q29:l:1:f:7:cf:2\ncell:R29:l:1:f:7:cf:2\ncell:B30:t:Total Expenses:l:5:f:3:c:3:bg:1:cf:1:colspan:3\ncell:C30:c:3:bg:1\ncell:D30:c:3:bg:1\ncell:E30:vtf:n:4853:sheet10!E25 +sheet10!E22 +sheet10!E18 +sheet10!E13 +sheet10!E4 +sheet9!E26 +sheet9!E17 +sheet9!E12 +sheet9!E4 + expense!E7+sheet11!E26 +sheet11!E18+ sheet11!E12 +sheet11!E4:b:2:2:2:2:c:3:bg:1:ntvf:2\ncell:F30:vtf:n:58236:IF((E30*12)=0,"",(E30*12)):b:2:2:2:2:c:3:bg:1:ntvf:2\ncell:O30:l:1:f:7:cf:2\ncell:P30:l:1:f:7:cf:2\ncell:Q30:l:1:f:7:cf:2\ncell:R30:l:1:f:7:cf:2\ncell:O31:l:1:f:7:cf:2\ncell:P31:l:1:f:7:cf:2\ncell:Q31:l:1:f:7:cf:2\ncell:R31:l:1:f:7:cf:2\ncell:O32:l:1:f:7:cf:2\ncell:P32:l:1:f:7:cf:2\ncell:Q32:l:1:f:7:cf:2\ncell:R32:l:1:f:7:cf:2\ncell:O33:l:1:f:7:cf:2\ncell:P33:l:1:f:7:cf:2\ncell:Q33:l:1:f:7:cf:2\ncell:R33:l:1:f:7:cf:2\ncell:O34:l:1:f:7:cf:2\ncell:P34:l:1:f:7:cf:2\ncell:Q34:l:1:f:7:cf:2\ncell:R34:l:1:f:7:cf:2\ncell:O35:l:1:f:7:cf:2\ncell:P35:l:1:f:7:cf:2\ncell:Q35:l:1:f:7:cf:2\ncell:R35:l:1:f:7:cf:2\ncell:O36:l:1:f:7:cf:2\ncell:P36:l:1:f:7:cf:2\ncell:Q36:l:1:f:7:cf:2\ncell:R36:l:1:f:7:cf:2\ncell:O37:l:1:f:7:cf:2\ncell:P37:l:1:f:7:cf:2\ncell:Q37:l:1:f:7:cf:2\ncell:R37:l:1:f:7:cf:2\ncell:O38:l:1:f:7:cf:2\ncell:P38:l:1:f:7:cf:2\ncell:Q38:l:1:f:7:cf:2\ncell:R38:l:1:f:7:cf:2\ncell:B39:l:1:f:7:cf:2\ncell:C39:l:1:f:7:cf:2\ncell:D39:l:1:f:2:cf:2\ncell:E39:l:1:f:2:cf:3:ntvf:1\ncell:F39:l:1:f:2:cf:3:ntvf:1\ncell:O39:l:1:f:7:cf:2\ncell:P39:l:1:f:7:cf:2\ncell:Q39:l:1:f:7:cf:2\ncell:R39:l:1:f:7:cf:2\ncell:B40:l:1:f:5:cf:2\ncell:C40:l:1:f:5:cf:2\ncell:D40:l:1:f:9:cf:2\ncell:E40:l:1:f:9:cf:2\ncell:F40:l:1:f:7:cf:2\ncell:O40:l:1:f:7:cf:2\ncell:P40:l:1:f:7:cf:2\ncell:Q40:l:1:f:7:cf:2\ncell:R40:l:1:f:7:cf:2\ncell:O41:l:1:f:7:cf:2\ncell:P41:l:1:f:7:cf:2\ncell:Q41:l:1:f:7:cf:2\ncell:R41:l:1:f:7:cf:2\ncell:O42:l:1:f:7:cf:2\ncell:P42:l:1:f:7:cf:2\ncell:Q42:l:1:f:7:cf:2\ncell:R42:l:1:f:7:cf:2\ncell:O43:l:1:f:7:cf:2\ncell:P43:l:1:f:7:cf:2\ncell:Q43:l:1:f:7:cf:2\ncell:R43:l:1:f:7:cf:2\ncell:O44:l:1:f:7:cf:2\ncell:P44:l:1:f:7:cf:2\ncell:Q44:l:1:f:7:cf:2\ncell:R44:l:1:f:7:cf:2\ncell:O45:l:1:f:7:cf:2\ncell:P45:l:1:f:7:cf:2\ncell:Q45:l:1:f:7:cf:2\ncell:R45:l:1:f:7:cf:2\ncell:O46:l:1:f:7:cf:2\ncell:P46:l:1:f:7:cf:2\ncell:Q46:l:1:f:7:cf:2\ncell:R46:l:1:f:7:cf:2\ncell:O47:l:1:f:7:cf:2\ncell:P47:l:1:f:7:cf:2\ncell:Q47:l:1:f:7:cf:2\ncell:R47:l:1:f:7:cf:2\ncell:O48:l:1:f:7:cf:2\ncell:P48:l:1:f:7:cf:2\ncell:Q48:l:1:f:7:cf:2\ncell:R48:l:1:f:7:cf:2\ncell:O49:l:1:f:7:cf:2\ncell:P49:l:1:f:7:cf:2\ncell:Q49:l:1:f:7:cf:2\ncell:R49:l:1:f:7:cf:2\ncell:O50:l:1:f:7:cf:2\ncell:P50:l:1:f:7:cf:2\ncell:Q50:l:1:f:7:cf:2\ncell:R50:l:1:f:7:cf:2\ncell:S50:l:1:f:7:cf:2\ncell:T50:l:1:f:7:cf:2\ncell:U50:l:1:f:7:cf:2\ncell:V50:l:1:f:7:cf:2\ncell:W50:l:1:f:7:cf:2\ncell:O51:l:1:f:7:cf:2\ncell:P51:l:1:f:7:cf:2\ncell:Q51:l:1:f:7:cf:2\ncell:R51:l:1:f:7:cf:2\ncell:S51:l:1:f:7:cf:2\ncell:T51:l:1:f:7:cf:2\ncell:U51:l:1:f:7:cf:2\ncell:V51:l:1:f:7:cf:2\ncell:W51:l:1:f:7:cf:2\ncell:O52:l:1:f:7:cf:2\ncell:P52:l:1:f:7:cf:2\ncell:Q52:l:1:f:7:cf:2\ncell:R52:l:1:f:7:cf:2\ncell:S52:l:1:f:7:cf:2\ncell:T52:l:1:f:7:cf:2\ncell:U52:l:1:f:7:cf:2\ncell:V52:l:1:f:7:cf:2\ncell:W52:l:1:f:7:cf:2\ncell:O53:l:1:f:7:cf:2\ncell:P53:l:1:f:7:cf:2\ncell:Q53:l:1:f:7:cf:2\ncell:R53:l:1:f:7:cf:2\ncell:S53:l:1:f:7:cf:2\ncell:T53:l:1:f:7:cf:2\ncell:U53:l:1:f:7:cf:2\ncell:V53:l:1:f:7:cf:2\ncell:W53:l:1:f:7:cf:2\ncell:O54:l:1:f:7:cf:2\ncell:P54:l:1:f:7:cf:2\ncell:Q54:l:1:f:7:cf:2\ncell:R54:l:1:f:7:cf:2\ncell:S54:l:1:f:7:cf:2\ncell:T54:l:1:f:7:cf:2\ncell:U54:l:1:f:7:cf:2\ncell:V54:l:1:f:7:cf:2\ncell:W54:l:1:f:7:cf:2\ncell:O55:l:1:f:7:cf:2\ncell:P55:l:1:f:7:cf:2\ncell:Q55:l:1:f:7:cf:2\ncell:R55:l:1:f:7:cf:2\ncell:S55:l:1:f:7:cf:2\ncell:T55:l:1:f:7:cf:2\ncell:U55:l:1:f:7:cf:2\ncell:V55:l:1:f:7:cf:2\ncell:W55:l:1:f:7:cf:2\ncell:O56:l:1:f:7:cf:2\ncell:P56:l:1:f:7:cf:2\ncell:Q56:l:1:f:7:cf:2\ncell:R56:l:1:f:7:cf:2\ncell:S56:l:1:f:7:cf:2\ncell:T56:l:1:f:7:cf:2\ncell:U56:l:1:f:7:cf:2\ncell:V56:l:1:f:7:cf:2\ncell:W56:l:1:f:7:cf:2\ncell:O57:l:1:f:7:cf:2\ncell:P57:l:1:f:7:cf:2\ncell:Q57:l:1:f:7:cf:2\ncell:R57:l:1:f:7:cf:2\ncell:S57:l:1:f:7:cf:2\ncell:T57:l:1:f:7:cf:2\ncell:U57:l:1:f:7:cf:2\ncell:V57:l:1:f:7:cf:2\ncell:W57:l:1:f:7:cf:2\ncell:O58:l:1:f:7:cf:2\ncell:P58:l:1:f:7:cf:2\ncell:Q58:l:1:f:7:cf:2\ncell:R58:l:1:f:7:cf:2\ncell:S58:l:1:f:7:cf:2\ncell:T58:l:1:f:7:cf:2\ncell:U58:l:1:f:7:cf:2\ncell:V58:l:1:f:7:cf:2\ncell:W58:l:1:f:7:cf:2\ncell:O59:l:1:f:7:cf:2\ncell:P59:l:1:f:7:cf:2\ncell:Q59:l:1:f:7:cf:2\ncell:R59:l:1:f:7:cf:2\ncell:S59:l:1:f:7:cf:2\ncell:T59:l:1:f:7:cf:2\ncell:U59:l:1:f:7:cf:2\ncell:V59:l:1:f:7:cf:2\ncell:W59:l:1:f:7:cf:2\ncell:O60:l:1:f:7:cf:2\ncell:P60:l:1:f:7:cf:2\ncell:Q60:l:1:f:7:cf:2\ncell:R60:l:1:f:7:cf:2\ncell:S60:l:1:f:7:cf:2\ncell:T60:l:1:f:7:cf:2\ncell:U60:l:1:f:7:cf:2\ncell:V60:l:1:f:7:cf:2\ncell:W60:l:1:f:7:cf:2\ncell:O61:l:1:f:7:cf:2\ncell:P61:l:1:f:7:cf:2\ncell:Q61:l:1:f:7:cf:2\ncell:R61:l:1:f:7:cf:2\ncell:S61:l:1:f:7:cf:2\ncell:T61:l:1:f:7:cf:2\ncell:U61:l:1:f:7:cf:2\ncell:V61:l:1:f:7:cf:2\ncell:W61:l:1:f:7:cf:2\ncell:O62:l:1:f:7:cf:2\ncell:P62:l:1:f:7:cf:2\ncell:Q62:l:1:f:7:cf:2\ncell:R62:l:1:f:7:cf:2\ncell:S62:l:1:f:7:cf:2\ncell:T62:l:1:f:7:cf:2\ncell:U62:l:1:f:7:cf:2\ncell:V62:l:1:f:7:cf:2\ncell:W62:l:1:f:7:cf:2\ncell:O63:l:1:f:7:cf:2\ncell:P63:l:1:f:7:cf:2\ncell:Q63:l:1:f:7:cf:2\ncell:R63:l:1:f:7:cf:2\ncell:S63:l:1:f:7:cf:2\ncell:T63:l:1:f:7:cf:2\ncell:U63:l:1:f:7:cf:2\ncell:V63:l:1:f:7:cf:2\ncell:W63:l:1:f:7:cf:2\ncell:O64:l:1:f:7:cf:2\ncell:P64:l:1:f:7:cf:2\ncell:Q64:l:1:f:7:cf:2\ncell:R64:l:1:f:7:cf:2\ncell:S64:l:1:f:7:cf:2\ncell:T64:l:1:f:7:cf:2\ncell:U64:l:1:f:7:cf:2\ncell:V64:l:1:f:7:cf:2\ncell:W64:l:1:f:7:cf:2\ncell:O65:l:1:f:7:cf:2\ncell:P65:l:1:f:7:cf:2\ncell:Q65:l:1:f:7:cf:2\ncell:R65:l:1:f:7:cf:2\ncell:S65:l:1:f:7:cf:2\ncell:T65:l:1:f:7:cf:2\ncell:U65:l:1:f:7:cf:2\ncell:V65:l:1:f:7:cf:2\ncell:W65:l:1:f:7:cf:2\ncell:O66:l:1:f:7:cf:2\ncell:P66:l:1:f:7:cf:2\ncell:Q66:l:1:f:7:cf:2\ncell:R66:l:1:f:7:cf:2\ncell:S66:l:1:f:7:cf:2\ncell:T66:l:1:f:7:cf:2\ncell:U66:l:1:f:7:cf:2\ncell:V66:l:1:f:7:cf:2\ncell:W66:l:1:f:7:cf:2\ncell:O67:l:1:f:7:cf:2\ncell:P67:l:1:f:7:cf:2\ncell:Q67:l:1:f:7:cf:2\ncell:R67:l:1:f:7:cf:2\ncell:S67:l:1:f:7:cf:2\ncell:T67:l:1:f:7:cf:2\ncell:U67:l:1:f:7:cf:2\ncell:V67:l:1:f:7:cf:2\ncell:W67:l:1:f:7:cf:2\ncell:O68:l:1:f:7:cf:2\ncell:P68:l:1:f:7:cf:2\ncell:Q68:l:1:f:7:cf:2\ncell:R68:l:1:f:7:cf:2\ncell:S68:l:1:f:7:cf:2\ncell:T68:l:1:f:7:cf:2\ncell:U68:l:1:f:7:cf:2\ncell:V68:l:1:f:7:cf:2\ncell:W68:l:1:f:7:cf:2\ncell:O69:l:1:f:7:cf:2\ncell:P69:l:1:f:7:cf:2\ncell:Q69:l:1:f:7:cf:2\ncell:R69:l:1:f:7:cf:2\ncell:S69:l:1:f:7:cf:2\ncell:T69:l:1:f:7:cf:2\ncell:U69:l:1:f:7:cf:2\ncell:V69:l:1:f:7:cf:2\ncell:W69:l:1:f:7:cf:2\ncell:O70:l:1:f:7:cf:2\ncell:P70:l:1:f:7:cf:2\ncell:Q70:l:1:f:7:cf:2\ncell:R70:l:1:f:7:cf:2\ncell:S70:l:1:f:7:cf:2\ncell:T70:l:1:f:7:cf:2\ncell:U70:l:1:f:7:cf:2\ncell:V70:l:1:f:7:cf:2\ncell:W70:l:1:f:7:cf:2\ncell:O71:l:1:f:7:cf:2\ncell:P71:l:1:f:7:cf:2\ncell:Q71:l:1:f:7:cf:2\ncell:R71:l:1:f:7:cf:2\ncell:S71:l:1:f:7:cf:2\ncell:T71:l:1:f:7:cf:2\ncell:U71:l:1:f:7:cf:2\ncell:V71:l:1:f:7:cf:2\ncell:W71:l:1:f:7:cf:2\ncell:O72:l:1:f:7:cf:2\ncell:P72:l:1:f:7:cf:2\ncell:Q72:l:1:f:7:cf:2\ncell:R72:l:1:f:7:cf:2\ncell:S72:l:1:f:7:cf:2\ncell:T72:l:1:f:7:cf:2\ncell:U72:l:1:f:7:cf:2\ncell:V72:l:1:f:7:cf:2\ncell:W72:l:1:f:7:cf:2\ncell:O73:l:1:f:7:cf:2\ncell:P73:l:1:f:7:cf:2\ncell:Q73:l:1:f:7:cf:2\ncell:R73:l:1:f:7:cf:2\ncell:S73:l:1:f:7:cf:2\ncell:T73:l:1:f:7:cf:2\ncell:U73:l:1:f:7:cf:2\ncell:V73:l:1:f:7:cf:2\ncell:W73:l:1:f:7:cf:2\ncell:O74:l:1:f:7:cf:2\ncell:P74:l:1:f:7:cf:2\ncell:Q74:l:1:f:7:cf:2\ncell:R74:l:1:f:7:cf:2\ncell:S74:l:1:f:7:cf:2\ncell:T74:l:1:f:7:cf:2\ncell:U74:l:1:f:7:cf:2\ncell:V74:l:1:f:7:cf:2\ncell:W74:l:1:f:7:cf:2\ncell:O75:l:1:f:7:cf:2\ncell:P75:l:1:f:7:cf:2\ncell:Q75:l:1:f:7:cf:2\ncell:R75:l:1:f:7:cf:2\ncell:S75:l:1:f:7:cf:2\ncell:T75:l:1:f:7:cf:2\ncell:U75:l:1:f:7:cf:2\ncell:V75:l:1:f:7:cf:2\ncell:W75:l:1:f:7:cf:2\ncell:O76:l:1:f:7:cf:2\ncell:P76:l:1:f:7:cf:2\ncell:Q76:l:1:f:7:cf:2\ncell:R76:l:1:f:7:cf:2\ncell:S76:l:1:f:7:cf:2\ncell:T76:l:1:f:7:cf:2\ncell:U76:l:1:f:7:cf:2\ncell:V76:l:1:f:7:cf:2\ncell:W76:l:1:f:7:cf:2\ncell:O77:l:1:f:7:cf:2\ncell:P77:l:1:f:7:cf:2\ncell:Q77:l:1:f:7:cf:2\ncell:R77:l:1:f:7:cf:2\ncell:S77:l:1:f:7:cf:2\ncell:T77:l:1:f:7:cf:2\ncell:U77:l:1:f:7:cf:2\ncell:V77:l:1:f:7:cf:2\ncell:W77:l:1:f:7:cf:2\ncell:O78:l:1:f:7:cf:2\ncell:P78:l:1:f:7:cf:2\ncell:Q78:l:1:f:7:cf:2\ncell:R78:l:1:f:7:cf:2\ncell:S78:l:1:f:7:cf:2\ncell:T78:l:1:f:7:cf:2\ncell:U78:l:1:f:7:cf:2\ncell:V78:l:1:f:7:cf:2\ncell:W78:l:1:f:7:cf:2\ncell:O79:l:1:f:7:cf:2\ncell:P79:l:1:f:7:cf:2\ncell:Q79:l:1:f:7:cf:2\ncell:R79:l:1:f:7:cf:2\ncell:S79:l:1:f:7:cf:2\ncell:T79:l:1:f:7:cf:2\ncell:U79:l:1:f:7:cf:2\ncell:V79:l:1:f:7:cf:2\ncell:W79:l:1:f:7:cf:2\ncell:O80:l:1:f:7:cf:2\ncell:P80:l:1:f:7:cf:2\ncell:Q80:l:1:f:7:cf:2\ncell:R80:l:1:f:7:cf:2\ncell:S80:l:1:f:7:cf:2\ncell:T80:l:1:f:7:cf:2\ncell:U80:l:1:f:7:cf:2\ncell:V80:l:1:f:7:cf:2\ncell:W80:l:1:f:7:cf:2\ncell:O81:l:1:f:7:cf:2\ncell:P81:l:1:f:7:cf:2\ncell:Q81:l:1:f:7:cf:2\ncell:R81:l:1:f:7:cf:2\ncell:S81:l:1:f:7:cf:2\ncell:T81:l:1:f:7:cf:2\ncell:U81:l:1:f:7:cf:2\ncell:V81:l:1:f:7:cf:2\ncell:W81:l:1:f:7:cf:2\ncell:O82:l:1:f:7:cf:2\ncell:P82:l:1:f:7:cf:2\ncell:Q82:l:1:f:7:cf:2\ncell:R82:l:1:f:7:cf:2\ncell:S82:l:1:f:7:cf:2\ncell:T82:l:1:f:7:cf:2\ncell:U82:l:1:f:7:cf:2\ncell:V82:l:1:f:7:cf:2\ncell:W82:l:1:f:7:cf:2\ncell:O83:l:1:f:7:cf:2\ncell:P83:l:1:f:7:cf:2\ncell:Q83:l:1:f:7:cf:2\ncell:R83:l:1:f:7:cf:2\ncell:S83:l:1:f:7:cf:2\ncell:T83:l:1:f:7:cf:2\ncell:U83:l:1:f:7:cf:2\ncell:V83:l:1:f:7:cf:2\ncell:W83:l:1:f:7:cf:2\ncell:O84:l:1:f:7:cf:2\ncell:P84:l:1:f:7:cf:2\ncell:Q84:l:1:f:7:cf:2\ncell:R84:l:1:f:7:cf:2\ncell:S84:l:1:f:7:cf:2\ncell:T84:l:1:f:7:cf:2\ncell:U84:l:1:f:7:cf:2\ncell:V84:l:1:f:7:cf:2\ncell:W84:l:1:f:7:cf:2\ncell:O85:l:1:f:7:cf:2\ncell:P85:l:1:f:7:cf:2\ncell:Q85:l:1:f:7:cf:2\ncell:R85:l:1:f:7:cf:2\ncell:S85:l:1:f:7:cf:2\ncell:T85:l:1:f:7:cf:2\ncell:U85:l:1:f:7:cf:2\ncell:V85:l:1:f:7:cf:2\ncell:W85:l:1:f:7:cf:2\ncell:O86:l:1:f:7:cf:2\ncell:P86:l:1:f:7:cf:2\ncell:Q86:l:1:f:7:cf:2\ncell:R86:l:1:f:7:cf:2\ncell:S86:l:1:f:7:cf:2\ncell:T86:l:1:f:7:cf:2\ncell:U86:l:1:f:7:cf:2\ncell:V86:l:1:f:7:cf:2\ncell:W86:l:1:f:7:cf:2\ncell:O87:l:1:f:7:cf:2\ncell:P87:l:1:f:7:cf:2\ncell:Q87:l:1:f:7:cf:2\ncell:R87:l:1:f:7:cf:2\ncell:S87:l:1:f:7:cf:2\ncell:T87:l:1:f:7:cf:2\ncell:U87:l:1:f:7:cf:2\ncell:V87:l:1:f:7:cf:2\ncell:W87:l:1:f:7:cf:2\ncell:O88:l:1:f:7:cf:2\ncell:P88:l:1:f:7:cf:2\ncell:Q88:l:1:f:7:cf:2\ncell:R88:l:1:f:7:cf:2\ncell:S88:l:1:f:7:cf:2\ncell:T88:l:1:f:7:cf:2\ncell:U88:l:1:f:7:cf:2\ncell:V88:l:1:f:7:cf:2\ncell:W88:l:1:f:7:cf:2\ncell:O89:l:1:f:7:cf:2\ncell:P89:l:1:f:7:cf:2\ncell:Q89:l:1:f:7:cf:2\ncell:R89:l:1:f:7:cf:2\ncell:S89:l:1:f:7:cf:2\ncell:T89:l:1:f:7:cf:2\ncell:U89:l:1:f:7:cf:2\ncell:V89:l:1:f:7:cf:2\ncell:W89:l:1:f:7:cf:2\ncell:O90:l:1:f:7:cf:2\ncell:P90:l:1:f:7:cf:2\ncell:Q90:l:1:f:7:cf:2\ncell:R90:l:1:f:7:cf:2\ncell:S90:l:1:f:7:cf:2\ncell:T90:l:1:f:7:cf:2\ncell:U90:l:1:f:7:cf:2\ncell:V90:l:1:f:7:cf:2\ncell:W90:l:1:f:7:cf:2\ncell:O91:l:1:f:7:cf:2\ncell:P91:l:1:f:7:cf:2\ncell:Q91:l:1:f:7:cf:2\ncell:R91:l:1:f:7:cf:2\ncell:S91:l:1:f:7:cf:2\ncell:T91:l:1:f:7:cf:2\ncell:U91:l:1:f:7:cf:2\ncell:V91:l:1:f:7:cf:2\ncell:W91:l:1:f:7:cf:2\ncell:O92:l:1:f:7:cf:2\ncell:P92:l:1:f:7:cf:2\ncell:Q92:l:1:f:7:cf:2\ncell:R92:l:1:f:7:cf:2\ncell:S92:l:1:f:7:cf:2\ncell:T92:l:1:f:7:cf:2\ncell:U92:l:1:f:7:cf:2\ncell:V92:l:1:f:7:cf:2\ncell:W92:l:1:f:7:cf:2\ncell:O93:l:1:f:7:cf:2\ncell:P93:l:1:f:7:cf:2\ncell:Q93:l:1:f:7:cf:2\ncell:R93:l:1:f:7:cf:2\ncell:S93:l:1:f:7:cf:2\ncell:T93:l:1:f:7:cf:2\ncell:U93:l:1:f:7:cf:2\ncell:V93:l:1:f:7:cf:2\ncell:W93:l:1:f:7:cf:2\ncell:O94:l:1:f:7:cf:2\ncell:P94:l:1:f:7:cf:2\ncell:Q94:l:1:f:7:cf:2\ncell:R94:l:1:f:7:cf:2\ncell:S94:l:1:f:7:cf:2\ncell:T94:l:1:f:7:cf:2\ncell:U94:l:1:f:7:cf:2\ncell:V94:l:1:f:7:cf:2\ncell:W94:l:1:f:7:cf:2\ncell:O95:l:1:f:7:cf:2\ncell:P95:l:1:f:7:cf:2\ncell:Q95:l:1:f:7:cf:2\ncell:R95:l:1:f:7:cf:2\ncell:S95:l:1:f:7:cf:2\ncell:T95:l:1:f:7:cf:2\ncell:U95:l:1:f:7:cf:2\ncell:V95:l:1:f:7:cf:2\ncell:W95:l:1:f:7:cf:2\ncell:O96:l:1:f:7:cf:2\ncell:P96:l:1:f:7:cf:2\ncell:Q96:l:1:f:7:cf:2\ncell:R96:l:1:f:7:cf:2\ncell:S96:l:1:f:7:cf:2\ncell:T96:l:1:f:7:cf:2\ncell:U96:l:1:f:7:cf:2\ncell:V96:l:1:f:7:cf:2\ncell:W96:l:1:f:7:cf:2\ncell:O97:l:1:f:7:cf:2\ncell:P97:l:1:f:7:cf:2\ncell:Q97:l:1:f:7:cf:2\ncell:R97:l:1:f:7:cf:2\ncell:S97:l:1:f:7:cf:2\ncell:T97:l:1:f:7:cf:2\ncell:U97:l:1:f:7:cf:2\ncell:V97:l:1:f:7:cf:2\ncell:W97:l:1:f:7:cf:2\ncell:O98:l:1:f:7:cf:2\ncell:P98:l:1:f:7:cf:2\ncell:Q98:l:1:f:7:cf:2\ncell:R98:l:1:f:7:cf:2\ncell:S98:l:1:f:7:cf:2\ncell:T98:l:1:f:7:cf:2\ncell:U98:l:1:f:7:cf:2\ncell:V98:l:1:f:7:cf:2\ncell:W98:l:1:f:7:cf:2\ncell:O99:l:1:f:7:cf:2\ncell:P99:l:1:f:7:cf:2\ncell:Q99:l:1:f:7:cf:2\ncell:R99:l:1:f:7:cf:2\ncell:S99:l:1:f:7:cf:2\ncell:T99:l:1:f:7:cf:2\ncell:U99:l:1:f:7:cf:2\ncell:V99:l:1:f:7:cf:2\ncell:W99:l:1:f:7:cf:2\ncell:O100:l:1:f:7:cf:2\ncell:P100:l:1:f:7:cf:2\ncell:Q100:l:1:f:7:cf:2\ncell:R100:l:1:f:7:cf:2\ncell:S100:l:1:f:7:cf:2\ncell:T100:l:1:f:7:cf:2\ncell:U100:l:1:f:7:cf:2\ncell:V100:l:1:f:7:cf:2\ncell:W100:l:1:f:7:cf:2\ncell:O101:l:1:f:7:cf:2\ncell:P101:l:1:f:7:cf:2\ncell:Q101:l:1:f:7:cf:2\ncell:R101:l:1:f:7:cf:2\ncell:S101:l:1:f:7:cf:2\ncell:T101:l:1:f:7:cf:2\ncell:U101:l:1:f:7:cf:2\ncell:V101:l:1:f:7:cf:2\ncell:W101:l:1:f:7:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:A106:l:1:f:8:cf:2\ncell:B106:l:1:f:8:cf:2\ncell:C106:l:1:f:8:cf:2\ncell:D106:l:1:f:8:cf:2\ncell:E106:l:1:f:8:cf:2\ncell:F106:t:Monthly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G106:l:1:f:8:cf:2\ncell:H106:l:1:f:8:cf:2\ncell:I106:l:1:f:8:cf:2\ncell:J106:l:1:f:8:cf:2\ncell:K106:l:1:f:8:cf:2\ncell:L106:l:1:f:8:cf:2\ncell:M106:l:1:f:8:cf:2\ncell:N106:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:A107:l:1:f:8:cf:2\ncell:B107:l:1:f:8:cf:2\ncell:C107:l:1:f:8:cf:2\ncell:D107:l:1:f:8:cf:2\ncell:E107:l:1:f:8:cf:2\ncell:F107:t:Semi-Annually:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G107:l:1:f:8:cf:2\ncell:H107:l:1:f:8:cf:2\ncell:I107:l:1:f:8:cf:2\ncell:J107:l:1:f:8:cf:2\ncell:K107:l:1:f:8:cf:2\ncell:L107:l:1:f:8:cf:2\ncell:M107:l:1:f:8:cf:2\ncell:N107:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:A108:l:1:f:8:cf:2\ncell:B108:l:1:f:8:cf:2\ncell:C108:l:1:f:8:cf:2\ncell:D108:l:1:f:8:cf:2\ncell:E108:l:1:f:8:cf:2\ncell:F108:t:Quarterly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G108:l:1:f:8:cf:2\ncell:H108:l:1:f:8:cf:2\ncell:I108:l:1:f:8:cf:2\ncell:J108:l:1:f:8:cf:2\ncell:K108:l:1:f:8:cf:2\ncell:L108:l:1:f:8:cf:2\ncell:M108:l:1:f:8:cf:2\ncell:N108:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:A109:l:1:f:8:cf:2\ncell:B109:l:1:f:8:cf:2\ncell:C109:l:1:f:8:cf:2\ncell:D109:l:1:f:8:cf:2\ncell:E109:l:1:f:8:cf:2\ncell:F109:t:Yearly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G109:l:1:f:8:cf:2\ncell:H109:l:1:f:8:cf:2\ncell:I109:l:1:f:8:cf:2\ncell:J109:l:1:f:8:cf:2\ncell:K109:l:1:f:8:cf:2\ncell:L109:l:1:f:8:cf:2\ncell:M109:l:1:f:8:cf:2\ncell:N109:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncell:A110:l:1:f:8:cf:2\ncell:B110:l:1:f:8:cf:2\ncell:C110:l:1:f:8:cf:2\ncell:D110:l:1:f:8:cf:2\ncell:E110:l:1:f:8:cf:2\ncell:F110:l:1:f:8:cf:2\ncell:G110:l:1:f:8:cf:2\ncell:H110:l:1:f:8:cf:2\ncell:I110:l:1:f:8:cf:2\ncell:J110:l:1:f:8:cf:2\ncell:K110:l:1:f:8:cf:2\ncell:L110:l:1:f:8:cf:2\ncell:M110:l:1:f:8:cf:2\ncell:N110:l:1:f:8:cf:2\ncell:O110:l:1:f:8:cf:2\ncell:P110:l:1:f:8:cf:2\ncell:Q110:l:1:f:8:cf:2\ncell:R110:l:1:f:8:cf:2\ncell:S110:l:1:f:8:cf:2\ncell:T110:l:1:f:8:cf:2\ncell:U110:l:1:f:8:cf:2\ncell:V110:l:1:f:8:cf:2\ncell:W110:l:1:f:8:cf:2\ncell:A111:l:1:f:8:cf:2\ncell:B111:l:1:f:8:cf:2\ncell:C111:l:1:f:8:cf:2\ncell:D111:l:1:f:8:cf:2\ncell:E111:l:1:f:8:cf:2\ncell:F111:l:1:f:8:cf:2\ncell:G111:l:1:f:8:cf:2\ncell:H111:l:1:f:8:cf:2\ncell:I111:l:1:f:8:cf:2\ncell:J111:l:1:f:8:cf:2\ncell:K111:l:1:f:8:cf:2\ncell:L111:l:1:f:8:cf:2\ncell:M111:l:1:f:8:cf:2\ncell:N111:l:1:f:8:cf:2\ncell:O111:l:1:f:8:cf:2\ncell:P111:l:1:f:8:cf:2\ncell:Q111:l:1:f:8:cf:2\ncell:R111:l:1:f:8:cf:2\ncell:S111:l:1:f:8:cf:2\ncell:T111:l:1:f:8:cf:2\ncell:U111:l:1:f:8:cf:2\ncell:V111:l:1:f:8:cf:2\ncell:W111:l:1:f:8:cf:2\ncell:A112:l:1:f:8:cf:2\ncell:B112:l:1:f:8:cf:2\ncell:C112:l:1:f:8:cf:2\ncell:D112:l:1:f:8:cf:2\ncell:E112:l:1:f:8:cf:2\ncell:F112:l:1:f:8:cf:2\ncell:G112:l:1:f:8:cf:2\ncell:H112:l:1:f:8:cf:2\ncell:I112:l:1:f:8:cf:2\ncell:J112:l:1:f:8:cf:2\ncell:K112:l:1:f:8:cf:2\ncell:L112:l:1:f:8:cf:2\ncell:M112:l:1:f:8:cf:2\ncell:N112:l:1:f:8:cf:2\ncell:O112:l:1:f:8:cf:2\ncell:P112:l:1:f:8:cf:2\ncell:Q112:l:1:f:8:cf:2\ncell:R112:l:1:f:8:cf:2\ncell:S112:l:1:f:8:cf:2\ncell:T112:l:1:f:8:cf:2\ncell:U112:l:1:f:8:cf:2\ncell:V112:l:1:f:8:cf:2\ncell:W112:l:1:f:8:cf:2\ncell:A113:l:1:f:8:cf:2\ncell:B113:l:1:f:8:cf:2\ncell:C113:l:1:f:8:cf:2\ncell:D113:l:1:f:8:cf:2\ncell:E113:l:1:f:8:cf:2\ncell:F113:l:1:f:8:cf:2\ncell:G113:l:1:f:8:cf:2\ncell:H113:l:1:f:8:cf:2\ncell:I113:l:1:f:8:cf:2\ncell:J113:l:1:f:8:cf:2\ncell:K113:l:1:f:8:cf:2\ncell:L113:l:1:f:8:cf:2\ncell:M113:l:1:f:8:cf:2\ncell:N113:l:1:f:8:cf:2\ncell:O113:l:1:f:8:cf:2\ncell:P113:l:1:f:8:cf:2\ncell:Q113:l:1:f:8:cf:2\ncell:R113:l:1:f:8:cf:2\ncell:S113:l:1:f:8:cf:2\ncell:T113:l:1:f:8:cf:2\ncell:U113:l:1:f:8:cf:2\ncell:V113:l:1:f:8:cf:2\ncell:W113:l:1:f:8:cf:2\ncell:A114:l:1:f:8:cf:2\ncell:B114:l:1:f:8:cf:2\ncell:C114:l:1:f:8:cf:2\ncell:D114:l:1:f:8:cf:2\ncell:E114:l:1:f:8:cf:2\ncell:F114:l:1:f:8:cf:2\ncell:G114:l:1:f:8:cf:2\ncell:H114:l:1:f:8:cf:2\ncell:I114:l:1:f:8:cf:2\ncell:J114:l:1:f:8:cf:2\ncell:K114:l:1:f:8:cf:2\ncell:L114:l:1:f:8:cf:2\ncell:M114:l:1:f:8:cf:2\ncell:N114:l:1:f:8:cf:2\ncell:O114:l:1:f:8:cf:2\ncell:P114:l:1:f:8:cf:2\ncell:Q114:l:1:f:8:cf:2\ncell:R114:l:1:f:8:cf:2\ncell:S114:l:1:f:8:cf:2\ncell:T114:l:1:f:8:cf:2\ncell:U114:l:1:f:8:cf:2\ncell:V114:l:1:f:8:cf:2\ncell:W114:l:1:f:8:cf:2\ncell:A115:l:1:f:8:cf:2\ncell:B115:l:1:f:8:cf:2\ncell:C115:l:1:f:8:cf:2\ncell:D115:l:1:f:8:cf:2\ncell:E115:l:1:f:8:cf:2\ncell:F115:l:1:f:8:cf:2\ncell:G115:l:1:f:8:cf:2\ncell:H115:l:1:f:8:cf:2\ncell:I115:l:1:f:8:cf:2\ncell:J115:l:1:f:8:cf:2\ncell:K115:l:1:f:8:cf:2\ncell:L115:l:1:f:8:cf:2\ncell:M115:l:1:f:8:cf:2\ncell:N115:l:1:f:8:cf:2\ncell:O115:l:1:f:8:cf:2\ncell:P115:l:1:f:8:cf:2\ncell:Q115:l:1:f:8:cf:2\ncell:R115:l:1:f:8:cf:2\ncell:S115:l:1:f:8:cf:2\ncell:T115:l:1:f:8:cf:2\ncell:U115:l:1:f:8:cf:2\ncell:V115:l:1:f:8:cf:2\ncell:W115:l:1:f:8:cf:2\ncell:A116:l:1:f:8:cf:2\ncell:B116:l:1:f:8:cf:2\ncell:C116:l:1:f:8:cf:2\ncell:D116:l:1:f:8:cf:2\ncell:E116:l:1:f:8:cf:2\ncell:F116:l:1:f:8:cf:2\ncell:G116:l:1:f:8:cf:2\ncell:H116:l:1:f:8:cf:2\ncell:I116:l:1:f:8:cf:2\ncell:J116:l:1:f:8:cf:2\ncell:K116:l:1:f:8:cf:2\ncell:L116:l:1:f:8:cf:2\ncell:M116:l:1:f:8:cf:2\ncell:N116:l:1:f:8:cf:2\ncell:O116:l:1:f:8:cf:2\ncell:P116:l:1:f:8:cf:2\ncell:Q116:l:1:f:8:cf:2\ncell:R116:l:1:f:8:cf:2\ncell:S116:l:1:f:8:cf:2\ncell:T116:l:1:f:8:cf:2\ncell:U116:l:1:f:8:cf:2\ncell:V116:l:1:f:8:cf:2\ncell:W116:l:1:f:8:cf:2\ncell:A117:l:1:f:8:cf:2\ncell:B117:l:1:f:8:cf:2\ncell:C117:l:1:f:8:cf:2\ncell:D117:l:1:f:8:cf:2\ncell:E117:l:1:f:8:cf:2\ncell:F117:l:1:f:8:cf:2\ncell:G117:l:1:f:8:cf:2\ncell:H117:l:1:f:8:cf:2\ncell:I117:l:1:f:8:cf:2\ncell:J117:l:1:f:8:cf:2\ncell:K117:l:1:f:8:cf:2\ncell:L117:l:1:f:8:cf:2\ncell:M117:l:1:f:8:cf:2\ncell:N117:l:1:f:8:cf:2\ncell:O117:l:1:f:8:cf:2\ncell:P117:l:1:f:8:cf:2\ncell:Q117:l:1:f:8:cf:2\ncell:R117:l:1:f:8:cf:2\ncell:S117:l:1:f:8:cf:2\ncell:T117:l:1:f:8:cf:2\ncell:U117:l:1:f:8:cf:2\ncell:V117:l:1:f:8:cf:2\ncell:W117:l:1:f:8:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nsheet:c:27:r:117:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 12pt arial,helvetica,sans-serif\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 9pt Arial\nfont:6:normal normal * Arial\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 7pt Arial\nfont:9:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nlayout:5:padding:* 8px * *;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:#,##0.00;\\b-#,##0.00;\\b-\nvalueformat:3:hidden\nname:COMPARISON::S43\\cU57\nname:TRACKING::AC43\\cAE57\n', - }, - name: "sheet11", - hidden: "0", - }, - sheet7: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:f:3:ntvf:3\ncell:B4:t:Comparison:l:1:f:6:c:1:bg:4:cf:2:colspan:3\ncell:B6:t:How does your spending compare to the guidelines ?:f:5:cf:2:colspan:6\ncell:C9:t:Expense Category:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:D9:t:Guideline:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:E9:t:Recommended Monthly Value:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:F9:t:Actual Monthly Value:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:B10:b::1::\ncell:C10:t:Housing:b::1::1:l:4:f:2\ncell:D10:v:0.35:b::1::1:l:5:f:2:ntvf:2\ncell:E10:vtf:n:1578.85:D10*INCOME!D23:b::1::1:l:5:f:2:ntvf:1\ncell:F10:vtf:n:1380:EXPENSE!E7:b::1::1:l:5:f:2:ntvf:1\ncell:G10:b::::1\ncell:B11:b::1::\ncell:C11:t:Transportation:b::1::1:l:4:f:2:bg:3\ncell:D11:vtc:n%:0.2:20%:b::1::1:l:5:f:2:bg:3:ntvf:2\ncell:E11:vtf:n:902.2:D11*INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:1\ncell:F11:vtf:n:640:sheet9!E17:b::1::1:l:5:f:2:bg:3:ntvf:1\ncell:G11:b::::1\ncell:B12:b::1::\ncell:C12:t:Debt:b::1::1:l:4:f:2\ncell:D12:v:0.05:b::1::1:l:5:f:2:ntvf:2\ncell:E12:vtf:n:225.55:D12*INCOME!D23:b::1::1:l:5:f:2:ntvf:1\ncell:F12:vtf:n:0:sheet11!E22:b::1::1:l:5:f:2:ntvf:1\ncell:G12:b::::1\ncell:B13:b::1::\ncell:C13:t:Savings:b::1:1:1:l:4:f:2:bg:3\ncell:D13:vtc:n:0.2:0.20:b::1:1:1:l:5:f:2:bg:3:ntvf:2\ncell:E13:vtf:n:902.2:D13*INCOME!D23:b::1:1:1:l:5:f:2:bg:3:ntvf:1\ncell:F13:vtf:n:-342:INCOME!D23-sheet11!E30:b::1:1:1:l:5:f:2:bg:3:ntvf:1\ncell:G13:b::::1\ncell:C14:b:1:::\ncell:D14:b:1:::\ncell:E14:b:1:::\ncell:F14:b:1:::\ncell:B17:t:How does your spending compare to the average consumer?:f:4:cf:2:colspan:6\ncell:B19:bg:4\ncell:C19:t:Expense Category:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:D19:t:Average Consumer Spending (as percentage of income):b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1:colspan:2\ncell:E19:b:2:2:2:2\ncell:F19:t:Your Spending (as percentage of income):b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1:colspan:2\ncell:B20:b::1:::bg:4\ncell:C20:t:Housing:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D20:vtc:n%:0.28:28%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E20:b::1::1\ncell:F20:vtf:n:0.3059188649966748:EXPENSE!E7/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B21:b::1:::bg:4\ncell:C21:t:Food:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D21:vtc:n%:0.11:11%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E21:b::1::1\ncell:F21:vtf:n:0.04633119042340944:sheet11!E4/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B22:b::1:::bg:4\ncell:C22:t:Transportation:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D22:vtc:n%:0.13:13%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E22:b::1::1\ncell:F22:vtf:n:0.14187541565063178:sheet9!E17/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B23:b::1:::bg:4\ncell:C23:t:Clothes & Personal Services:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D23:vtc:n%:0.03:3%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E23:b::1::1\ncell:F23:vtf:n:0.042340944358235426:sheet9!E12/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B24:b::1:::bg:4\ncell:C24:t:Healthcare:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D24:vtc:n%:0.05:5%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E24:b::1::1\ncell:F24:vtf:n:0.0583019286189315:sheet9!E26/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B25:b::1:::bg:4\ncell:C25:t:Entertainment:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D25:vtc:n%:0.04:4%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E25:b::1::1\ncell:F25:vtf:n:0.04633119042340944:sheet10!E4/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B26:b::1:::bg:4\ncell:C26:t:Education:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D26:vtc:n%:0.02:2%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E26:b::1::1\ncell:F26:vtf:n:0.021724673021502994:sheet10!E13/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B27:b::1:::bg:4\ncell:C27:t:Contributions:b::1:1:1:l:2:f:7:bg:3:cf:2\ncell:D27:vtc:n%:0.03:3%:b::1:1:1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E27:b::1:1:1\ncell:F27:vtf:n:0.0492130348038129:sheet10!E18/INCOME!D23:b::1:1:1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:C28:b:1:::\ncell:D28:b:1:::\ncell:E28:b:1:::\ncell:F28:b:1:::\ncell:G28:b:1:::\ncol:A:w:20\ncol:B:w:21\ncol:C:w:122\ncol:D:w:106\ncol:E:w:123\ncol:F:w:100\ncol:G:w:25\ncol:H:w:80\nsheet:c:8:r:28:needsrecalc:yes:font:3\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* * Arial\nfont:2:* * arial,helvetica,sans-serif\nfont:3:* 12pt *\nfont:4:normal bold * arial,helvetica,sans-serif\nfont:5:normal bold 12pt arial,helvetica,sans-serif\nfont:6:normal bold 20pt Arial\nfont:7:normal normal * Arial\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:6px * 6px *;vertical-align:*;\nlayout:3:padding:6px * 6px *;vertical-align:middle;\nlayout:4:padding:6px 4px 6px 12px;vertical-align:*;\nlayout:5:padding:6px 8px 6px *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:#,##0%\nvalueformat:3:hidden\n", - }, - name: "compare", - hidden: "0", - }, - sheet8: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B3:t:Goals:l:2:f:4:c:1:bg:4:cf:2:colspan:3\ncell:G3:t:Date:l:1:f:5:cf:1\ncell:H3:vtf:ndt:41131.96186930555:NOW():l:1:f:5:bg:3:cf:3:ntvf:3\ncell:C5:f:3:colspan:4\ncell:B6:b:2:2:2:2:f:1:c:4:bg:2\ncell:C6:t:Goal:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1:colspan:3\ncell:D6:b:2:2:2:2:f:1:c:4:bg:2\ncell:E6:t:Goal:b:2:2:2:2:f:1:c:4:bg:2\ncell:F6:t:Amount:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:G6:t:Term (Months):b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:H6:t:Monthly:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:I6:t:Weekly:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:J6:t:How to achieve:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1:colspan:2\ncell:A7:b::1::\ncell:B7:vtc:n:1:1.:b::1:::l:2:cf:1:rowspan:4\ncell:C7:t:Pay off credit card debt:b::1:::l:4:f:1:cf:2:colspan:3:rowspan:4\ncell:F7:v:1000:b::1::1:f:1:ntvf:1\ncell:G7:v:12:b::1::1:f:1:ntvf:1\ncell:H7:vtf:n:83.33333333333333:IF(G7=0,"",F7/G7):b::1::1:f:1:ntvf:1\ncell:I7:vtf:n:19.17808219178082:IF(G7>0,F7*7*12/(G7*365),""):b::1::1:f:1:ntvf:1\ncell:J7:t:cutback on eating out:b::1:::f:1:colspan:2\ncell:L7:b::::1\ncell:A8:b::1::\ncell:B8:b::1::\ncell:C8:b::1::1:f:1:colspan:3\ncell:F8:b::1::1\ncell:G8:b::1::1\ncell:H8:b::1::1\ncell:I8:b::1::1\ncell:J8:b::1::1:f:1:colspan:2\ncell:L8:b::::1\ncell:A9:b::1::\ncell:B9:b::1::\ncell:C9:b::1::1:f:1:colspan:3\ncell:F9:b::1::1\ncell:G9:b::1::1\ncell:H9:b::1::1\ncell:I9:b::1::1\ncell:J9:b::1::1:f:1:colspan:2\ncell:L9:b::::1\ncell:A10:b::1::\ncell:B10:b::1::\ncell:C10:f:1:colspan:3\ncell:F10:b::1::1\ncell:G10:b::1::1\ncell:H10:b::1::1\ncell:I10:b::1::1\ncell:J10:b::1:1:1:f:1:colspan:2\ncell:L10:b::::1\ncell:A11:b::1::\ncell:B11:v:2:b:1:1:::l:2:cf:1:rowspan:4\ncell:C11:t:Save for a down:b:1:1:::l:4:f:1:colspan:3:rowspan:4\ncell:D11:b:1:::\ncell:E11:b:1:::\ncell:F11:v:20000:b:1:1::1:f:1:ntvf:1\ncell:G11:v:36:b:1:1::1:f:1:ntvf:1\ncell:H11:vtf:n:555.5555555555555:IF(G11>0,F11/G11,""):b:1:1::1:f:1:ntvf:1\ncell:I11:vtf:n:127.85388127853881:IF(G11>0,F11*7*12/(G11*365),""):b:1:1::1:f:1:ntvf:1\ncell:J11:b:1:1:::f:1:colspan:2\ncell:L11:b::::1\ncell:A12:b::1::\ncell:B12:b::1::\ncell:C12:t:payment:b::1::1:l:4:f:1:colspan:3\ncell:F12:b::1::1\ncell:G12:b::1::1\ncell:H12:b::1::1\ncell:I12:b::1::1\ncell:J12:b::1::1:f:1:colspan:2\ncell:L12:b::::1\ncell:A13:b::1::\ncell:B13:b::1::\ncell:C13:b::1::1:l:4:f:1:colspan:3\ncell:F13:b::1::1\ncell:G13:b::1::1\ncell:H13:b::1::1\ncell:I13:b::1::1\ncell:J13:b::1::1:f:1:colspan:2\ncell:L13:b::::1\ncell:A14:b::1::\ncell:B14:b::1::\ncell:C14:l:4:f:1:colspan:3\ncell:F14:b::1::1\ncell:G14:b::1::1\ncell:H14:b::1::1\ncell:I14:b::1::1\ncell:J14:b::1:1:1:f:1:colspan:2\ncell:L14:b::::1\ncell:A15:b::1::\ncell:B15:v:3:b:1:1:::l:2:cf:1:rowspan:4\ncell:C15:t:Date:b:1:1:::l:4:f:1:colspan:3:rowspan:4\ncell:D15:b:1:::\ncell:E15:b:1:::\ncell:F15:b:1:1::1:f:1:ntvf:1\ncell:G15:b:1:1::1:f:1:ntvf:1\ncell:H15:vtf:t::IF(G15>0,F15/G15,""):b:1:1::1:f:1:ntvf:1\ncell:I15:vtf:t::IF(G15>0,F15*7*12/(G15*365),""):b:1:1::1:f:1:ntvf:1\ncell:J15:b:1:1:::f:1:colspan:2\ncell:L15:b::::1\ncell:A16:b::1::\ncell:B16:b::1::\ncell:C16:b::1::1:l:4:f:1:colspan:3\ncell:F16:b::1::1\ncell:G16:b::1::1\ncell:H16:b::1::1\ncell:I16:b::1::1\ncell:J16:b::1::1:f:1:colspan:2\ncell:L16:b::::1\ncell:A17:b::1::\ncell:B17:b::1::\ncell:C17:b::1::1:l:4:f:1:colspan:3\ncell:F17:b::1::1\ncell:G17:b::1::1\ncell:H17:b::1::1\ncell:I17:b::1::1\ncell:J17:b::1::1:f:1:colspan:2\ncell:L17:b::::1\ncell:A18:b::1::\ncell:B18:b::1::\ncell:C18:l:4:f:1:colspan:3\ncell:F18:b::1::1\ncell:G18:b::1::1\ncell:H18:b::1::1\ncell:I18:b::1::1\ncell:J18:b::1:1:1:f:1:colspan:2\ncell:L18:b::::1\ncell:A19:b::1::\ncell:B19:v:4:b:1:1:::l:2:cf:1:rowspan:4\ncell:C19:b:1:1:::l:4:colspan:3:rowspan:4\ncell:D19:b:1:::\ncell:E19:b:1:::\ncell:F19:b:1:1::1:f:1:ntvf:1\ncell:G19:b:1:1::1:f:1:ntvf:1\ncell:H19:vtf:t::IF(G19>0,F19/G19,""):b:1:1::1:f:1:ntvf:1\ncell:I19:vtf:t::IF(G19>0,F19*7*12/(G19*365),""):b:1:1::1:f:1:ntvf:1\ncell:J19:b:1:1:::f:1:colspan:2\ncell:L19:b::::1\ncell:A20:b::1::\ncell:B20:b::1::\ncell:C20:b::1::1:l:3:colspan:3\ncell:F20:b::1::1\ncell:G20:b::1::1\ncell:H20:b::1::1\ncell:I20:b::1::1\ncell:J20:b::1::1:f:1:colspan:2\ncell:L20:b::::1\ncell:A21:b::1::\ncell:B21:b::1::\ncell:C21:b::1::1:l:3:colspan:3\ncell:F21:b::1::1\ncell:G21:b::1::1\ncell:H21:b::1::1\ncell:I21:b::1::1\ncell:J21:b::1::1:f:1:colspan:2\ncell:L21:b::::1\ncell:A22:b::1::\ncell:B22:b::1::\ncell:C22:l:3:f:1:colspan:3\ncell:F22:b::1::1\ncell:G22:b::1::1\ncell:H22:b::1::1\ncell:I22:b::1::1\ncell:J22:b::1:1:1:f:1:colspan:2\ncell:L22:b::::1\ncell:A23:b::1::\ncell:B23:v:5:b:1:1:::l:2:cf:1:rowspan:4\ncell:C23:b:1:1:1:1:l:4:colspan:3:rowspan:4\ncell:D23:b:1:::\ncell:E23:b:1:::\ncell:F23:b:1:1::1:f:1:ntvf:1\ncell:G23:b:1:1::1:f:1:ntvf:1\ncell:H23:vtf:t::IF(G23>0,F23/G23,""):b:1:1::1:f:1:ntvf:1\ncell:I23:vtf:t::IF(G23>0,F23*7*12/(G23*365),""):b:1:1::1:f:1:ntvf:1\ncell:J23:b:1:1:::f:1:colspan:2\ncell:L23:b::::1\ncell:A24:b::1::\ncell:B24:b::1::\ncell:C24:b::1::1:l:4:colspan:3\ncell:F24:b::1::1\ncell:G24:b::1::1\ncell:H24:b::1::1\ncell:I24:b::1::1\ncell:J24:b::1::1:f:1:colspan:2\ncell:L24:b::::1\ncell:A25:b::1::\ncell:B25:b::1::\ncell:C25:b::1::1:l:4:colspan:3\ncell:F25:b::1::1\ncell:G25:b::1::1\ncell:H25:b::1::1\ncell:I25:b::1::1\ncell:J25:b::1::1:f:1:colspan:2\ncell:L25:b::::1\ncell:A26:b::1::\ncell:B26:b::1::\ncell:C26:l:4:f:1:colspan:3\ncell:F26:b::1:1:1\ncell:G26:b::1:1:1\ncell:H26:b::1:1:1\ncell:I26:b::1:1:1\ncell:J26:b::1:1:1:f:1:colspan:2\ncell:L26:b::::1\ncell:A27:b::1::\ncell:B27:v:6:b:1:1::1:l:2:cf:1:rowspan:4\ncell:C27:b:1:1:1:1:l:4:f:1:colspan:3:rowspan:4\ncell:D27:b:1:1::1\ncell:E27:b:1:1::1\ncell:F27:b:1:1::1\ncell:G27:b:1:1::1\ncell:H27:vtf:t::IF(G27>0,F27/G27,""):b:1:1::1\ncell:I27:vtf:t::IF(G27>0,F27*7*12/(G27*365),""):b:1:1::1\ncell:J27:b::1::1:colspan:2\ncell:K27:b:1:::\ncell:A28:b::1::\ncell:B28:b::1::1\ncell:C28:b::1::1:l:4:f:1:colspan:3\ncell:D28:b::1::1\ncell:E28:b::1::1\ncell:F28:b::1::1\ncell:G28:b::1::1\ncell:H28:b::1::1\ncell:I28:b::1::1\ncell:J28:b::1::1:colspan:2\ncell:A29:b::1::\ncell:B29:b::1::1\ncell:C29:b::1::1:l:4:f:1:colspan:3\ncell:D29:b::1::1\ncell:E29:b::1::1\ncell:F29:b::1::1\ncell:G29:b::1::1\ncell:H29:b::1::1\ncell:I29:b::1::1\ncell:J29:b::1::1:colspan:2\ncell:A30:b::1::\ncell:B30:b::1:1:1\ncell:C30:b::1:1:1:l:4:f:1:colspan:3\ncell:D30:b::1:1:1\ncell:E30:b::1:1:1\ncell:F30:b::1:1:1\ncell:G30:b::1:1:1\ncell:H30:b::1:1:1\ncell:I30:b::1:1:1\ncell:J30:b::1:1:1:colspan:2\ncell:A31:b::1::\ncell:B31:v:7:b:1:1::1:l:2:cf:1:rowspan:4\ncell:C31:b:1:1:1:1:l:4:colspan:3:rowspan:4\ncell:D31:b:1:1:1:1\ncell:E31:b:1:1:1:1\ncell:F31:b:1:1::1\ncell:G31:b:1:1::1\ncell:H31:vtf:t::IF(G31>0,F31/G31,""):b:1:1::1\ncell:I31:vtf:t::IF(G31>0,F31*7*12/(G31*365),""):b:1:1::1\ncell:J31:b:1:1::1:colspan:2\ncell:K31:b:1:1:1:1\ncell:L31:b::::1\ncell:A32:b::1::\ncell:B32:b::1::1\ncell:C32:b:1:1:1:1\ncell:D32:b:1:1:1:1\ncell:E32:b:1:1:1:1\ncell:F32:b::1::1\ncell:G32:b::1::1\ncell:H32:b::1::1\ncell:I32:b::1::1\ncell:J32:b::1::1:colspan:2\ncell:K32:b:1:1:1:1\ncell:L32:b::::1\ncell:A33:b::1::\ncell:B33:b::1::1\ncell:C33:b:1:1:1:1\ncell:D33:b:1:1:1:1\ncell:E33:b:1:1:1:1\ncell:F33:b::1::1\ncell:G33:b::1::1\ncell:H33:b::1::1\ncell:I33:b::1::1\ncell:J33:b::1::1:colspan:2\ncell:K33:b:1:1:1:1\ncell:L33:b::::1\ncell:A34:b::1::\ncell:B34:b::1:1:1\ncell:C34:b:1:1:1:1\ncell:D34:b:1:1:1:1\ncell:E34:b:1:1:1:1\ncell:F34:b::1:1:1\ncell:G34:b::1:1:1\ncell:H34:b::1:1:1\ncell:I34:b::1:1:1\ncell:J34:b::1:1:1:colspan:2\ncell:K34:b:1:1:1:1\ncell:L34:b::::1\ncell:B35:b:1:::\ncell:C35:b:1:::\ncell:D35:b:1:::\ncell:E35:b:1:::\ncell:F35:b:1:::\ncell:G35:b:1:::\ncell:H35:b:1:::\ncell:I35:b:1:::\ncell:J35:b:1:::\ncell:K35:b:1:::\ncol:A:w:31\ncol:B:w:25\ncol:C:w:80\ncol:D:w:44\ncol:E:w:53\ncol:F:w:70\ncol:G:w:68\ncol:H:w:65\ncol:I:w:65\ncol:J:w:80\ncol:K:w:96\nsheet:c:12:r:35:needsrecalc:yes:font:2\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* * arial,helvetica,sans-serif\nfont:2:* 12pt *\nfont:3:normal bold * arial,helvetica,sans-serif\nfont:4:normal bold 20pt Arial\nfont:5:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:4:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\n', - }, - name: "goals", - hidden: "0", - }, - sheet9: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B3:t:Check Book Register:l:5:f:3:c:4:bg:2:cf:1:colspan:7\ncell:G3:t:Date:l:1:f:5:cf:1\ncell:H3:vtf:ndt:41131.961799432866:NOW():l:1:f:5:bg:3:cf:3:ntvf:3\ncell:A4:f:1\ncell:B4:l:2:f:4:c:1:bg:4:cf:2\ncell:C4:f:4\ncell:D4:f:4\ncell:E4:f:4\ncell:F4:f:4\ncell:G4:l:1:f:4:cf:1\ncell:H4:l:1:f:4:cf:3:ntvf:3\ncell:I4:f:1\ncell:B5:f:4\ncell:C5:f:4\ncell:D5:f:4\ncell:E5:f:4\ncell:F5:f:4\ncell:G5:f:4\ncell:H5:f:4\ncell:B6:t:Date:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:C6:t:Num:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:D6:t:Description:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:E6:t:R:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:F6:t:Withdrawal, Payment (-):b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:G6:t:Deposit, Credit (+):b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:H6:t:Balance:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:A7:b::1::\ncell:B7:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C7:b::1::1:l:4:f:1\ncell:D7:b::1::1:l:3:f:6\ncell:E7:b::1::1:l:3:f:6\ncell:F7:b::1::1:l:3:f:1:ntvf:1\ncell:G7:b::1::1:l:3:f:1:ntvf:1\ncell:H7:vtf:t: :IF(AND(ISBLANK(G7), ISBLANK(F7)), " ", G7-F7):b::1::1:l:3:f:1:ntvf:1\ncell:I7:b::::1\ncell:A8:b::1::\ncell:B8:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C8:b::1::1:l:4:f:1:bg:3\ncell:D8:b::1::1:l:3:f:6:bg:3\ncell:E8:b::1::1:l:3:f:6:bg:3\ncell:F8:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G8:b::1::1:l:3:f:1:bg:3\ncell:H8:vtf:t: :IF(AND(ISBLANK(G8), ISBLANK(F8)), " ", H7+G8-F8):b::1::1:l:3:f:1:bg:3\ncell:I8:b::::1\ncell:A9:b::1::\ncell:B9:b::1::1:l:4:f:1:ntvf:3\ncell:C9:b::1::1:l:4:f:1\ncell:D9:b::1::1:l:3:f:6\ncell:E9:b::1::1:l:3:f:6\ncell:F9:b::1::1:l:3:f:1:ntvf:1\ncell:G9:b::1::1:l:3:f:1\ncell:H9:vtf:t: :IF(AND(ISBLANK(G9), ISBLANK(F9)), " ", H8+G9-F9):b::1::1:l:3:f:1\ncell:I9:b::::1\ncell:A10:b::1::\ncell:B10:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C10:b::1::1:l:4:f:1:bg:3\ncell:D10:b::1::1:l:3:f:6:bg:3\ncell:E10:b::1::1:l:3:f:6:bg:3\ncell:F10:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G10:b::1::1:l:3:f:1:bg:3\ncell:H10:vtf:t: :IF(AND(ISBLANK(G10), ISBLANK(F10)), " ", H9+G10-F10):b::1::1:l:3:f:1:bg:3\ncell:I10:b::::1\ncell:A11:b::1::\ncell:B11:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C11:b::1::1:l:4:f:1\ncell:D11:b::1::1:l:3:f:6\ncell:E11:b::1::1:l:3:f:6\ncell:F11:b::1::1:l:3:f:1:ntvf:1\ncell:G11:b::1::1:l:3:f:1:ntvf:1\ncell:H11:vtf:t: :IF(AND(ISBLANK(G11), ISBLANK(F11)), " ", H10+G11-F11):b::1::1:l:3:f:1:ntvf:1\ncell:I11:b::::1\ncell:A12:b::1::\ncell:B12:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C12:b::1::1:l:4:f:1:bg:3\ncell:D12:b::1::1:l:3:f:6:bg:3\ncell:E12:b::1::1:l:3:f:6:bg:3\ncell:F12:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G12:b::1::1:l:3:f:1:bg:3\ncell:H12:vtf:t: :IF(AND(ISBLANK(G12), ISBLANK(F12)), " ", H11+G12-F12):b::1::1:l:3:f:1:bg:3\ncell:I12:b::::1\ncell:A13:b::1::\ncell:B13:b::1::1:l:4:f:1:ntvf:3\ncell:C13:b::1::1:l:4:f:1\ncell:D13:b::1::1:l:3:f:6\ncell:E13:b::1::1:l:3:f:6\ncell:F13:b::1::1:l:3:f:1:ntvf:1\ncell:G13:b::1::1:l:3:f:1\ncell:H13:vtf:t: :IF(AND(ISBLANK(G13), ISBLANK(F13)), " ", H12+G13-F13):b::1::1:l:3:f:1\ncell:I13:b::::1\ncell:A14:b::1::\ncell:B14:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C14:b::1::1:l:4:f:1:bg:3\ncell:D14:b::1::1:l:3:f:6:bg:3\ncell:E14:b::1::1:l:3:f:6:bg:3\ncell:F14:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G14:b::1::1:l:3:f:1:bg:3\ncell:H14:vtf:t: :IF(AND(ISBLANK(G14), ISBLANK(F14)), " ", H13+G14-F14):b::1::1:l:3:f:1:bg:3\ncell:I14:b::::1\ncell:A15:b::1::\ncell:B15:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C15:b::1::1:l:4:f:1\ncell:D15:b::1::1:l:3:f:6\ncell:E15:b::1::1:l:3:f:6\ncell:F15:b::1::1:l:3:f:1:ntvf:1\ncell:G15:b::1::1:l:3:f:1:ntvf:1\ncell:H15:vtf:t: :IF(AND(ISBLANK(G15), ISBLANK(F15)), " ", H14+G15-F15):b::1::1:l:3:f:1:ntvf:1\ncell:I15:b::::1\ncell:A16:b::1::\ncell:B16:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C16:b::1::1:l:4:f:1:bg:3\ncell:D16:b::1::1:l:3:f:6:bg:3\ncell:E16:b::1::1:l:3:f:6:bg:3\ncell:F16:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G16:b::1::1:l:3:f:1:bg:3\ncell:H16:vtf:t: :IF(AND(ISBLANK(G16), ISBLANK(F16)), " ", H15+G16-F16):b::1::1:l:3:f:1:bg:3\ncell:I16:b::::1\ncell:A17:b::1::\ncell:B17:b::1::1:l:4:f:1:ntvf:3\ncell:C17:b::1::1:l:4:f:1\ncell:D17:b::1::1:l:3:f:6\ncell:E17:b::1::1:l:3:f:6\ncell:F17:b::1::1:l:3:f:1:ntvf:1\ncell:G17:b::1::1:l:3:f:1\ncell:H17:vtf:t: :IF(AND(ISBLANK(G17), ISBLANK(F17)), " ", H16+G17-F17):b::1::1:l:3:f:1\ncell:I17:b::::1\ncell:A18:b::1::\ncell:B18:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C18:b::1::1:l:4:f:1:bg:3\ncell:D18:b::1::1:l:3:f:6:bg:3\ncell:E18:b::1::1:l:3:f:6:bg:3\ncell:F18:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G18:b::1::1:l:3:f:1:bg:3\ncell:H18:vtf:t: :IF(AND(ISBLANK(G18), ISBLANK(F18)), " ", H17+G18-F18):b::1::1:l:3:f:1:bg:3\ncell:I18:b::::1\ncell:A19:b::1::\ncell:B19:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C19:b::1::1:l:4:f:1\ncell:D19:b::1::1:l:3:f:6\ncell:E19:b::1::1:l:3:f:6\ncell:F19:b::1::1:l:3:f:1:ntvf:1\ncell:G19:b::1::1:l:3:f:1:ntvf:1\ncell:H19:vtf:t: :IF(AND(ISBLANK(G19), ISBLANK(F19)), " ", H18+G19-F19):b::1::1:l:3:f:1:ntvf:1\ncell:I19:b::::1\ncell:A20:b::1::\ncell:B20:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C20:b::1::1:l:4:f:2:bg:3\ncell:D20:b::1::1:l:3:f:6:bg:3\ncell:E20:b::1::1:l:3:f:6:bg:3\ncell:F20:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G20:b::1::1:l:3:f:1:bg:3\ncell:H20:vtf:t: :IF(AND(ISBLANK(G20), ISBLANK(F20)), " ", H19+G20-F20):b::1::1:l:3:f:1:bg:3\ncell:I20:b::::1\ncell:A21:b::1::\ncell:B21:b::1::1:l:4:f:1:ntvf:3\ncell:C21:b::1::1:l:4:f:1\ncell:D21:b::1::1:l:3:f:6\ncell:E21:b::1::1:l:3:f:6\ncell:F21:b::1::1:l:3:f:1:ntvf:1\ncell:G21:b::1::1:l:3:f:1\ncell:H21:vtf:t: :IF(AND(ISBLANK(G21), ISBLANK(F21)), " ", H20+G21-F21):b::1::1:l:3:f:1\ncell:I21:b::::1\ncell:A22:b::1::\ncell:B22:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C22:b::1::1:l:4:f:1:bg:3\ncell:D22:b::1::1:l:3:f:6:bg:3\ncell:E22:b::1::1:l:3:f:6:bg:3\ncell:F22:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G22:b::1::1:l:3:f:1:bg:3\ncell:H22:vtf:t: :IF(AND(ISBLANK(G22), ISBLANK(F22)), " ", H21+G22-F22):b::1::1:l:3:f:1:bg:3\ncell:I22:b::::1\ncell:A23:b::1::\ncell:B23:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C23:b::1::1:l:4:f:1\ncell:D23:b::1::1:l:3:f:6\ncell:E23:b::1::1:l:3:f:6\ncell:F23:b::1::1:l:3:f:1:ntvf:1\ncell:G23:b::1::1:l:3:f:1:ntvf:1\ncell:H23:vtf:t: :IF(AND(ISBLANK(G23), ISBLANK(F23)), " ", H22+G23-F23):b::1::1:l:3:f:1:ntvf:1\ncell:I23:b::::1\ncell:A24:b::1::\ncell:B24:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C24:b::1::1:l:4:f:1:bg:3\ncell:D24:b::1::1:l:3:f:6:bg:3\ncell:E24:b::1::1:l:3:f:6:bg:3\ncell:F24:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G24:b::1::1:l:3:f:1:bg:3\ncell:H24:vtf:t: :IF(AND(ISBLANK(G24), ISBLANK(F24)), " ", H23+G24-F24):b::1::1:l:3:f:1:bg:3\ncell:I24:b::::1\ncell:A25:b::1::\ncell:B25:b::1::1:l:4:f:1:ntvf:3\ncell:C25:b::1::1:l:4:f:1\ncell:D25:b::1::1:l:3:f:6\ncell:E25:b::1::1:l:3:f:6\ncell:F25:b::1::1:l:3:f:1:ntvf:1\ncell:G25:b::1::1:l:3:f:1\ncell:H25:vtf:t: :IF(AND(ISBLANK(G25), ISBLANK(F25)), " ", H24+G25-F25):b::1::1:l:3:f:1\ncell:I25:b::::1\ncell:A26:b::1::\ncell:B26:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C26:b::1::1:l:4:f:1:bg:3\ncell:D26:b::1::1:l:3:f:6:bg:3\ncell:E26:b::1::1:l:3:f:6:bg:3\ncell:F26:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G26:b::1::1:l:3:f:1:bg:3\ncell:H26:vtf:t: :IF(AND(ISBLANK(G26), ISBLANK(F26)), " ", H25+G26-F26):b::1::1:l:3:f:1:bg:3\ncell:I26:b::::1\ncell:A27:b::1::\ncell:B27:b::1::1:l:4:f:1:ntvf:3\ncell:C27:b::1::1:l:4:f:1\ncell:D27:b::1::1:l:3:f:6\ncell:E27:b::1::1:l:3:f:6\ncell:F27:b::1::1:l:3:f:1:ntvf:1\ncell:G27:b::1::1:l:3:f:1\ncell:H27:vtf:t: :IF(AND(ISBLANK(G27), ISBLANK(F27)), " ", H26+G27-F27):b::1::1:l:3:f:1\ncell:A28:b::1::\ncell:B28:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C28:b::1::1:l:4:f:1:bg:3\ncell:D28:b::1::1:l:3:f:6:bg:3\ncell:E28:b::1::1:l:3:f:6:bg:3\ncell:F28:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G28:b::1::1:l:3:f:1:bg:3\ncell:H28:vtf:t: :IF(AND(ISBLANK(G28), ISBLANK(F28)), " ", H27+G28-F28):b::1::1:l:3:f:1:bg:3\ncell:A29:b::1::\ncell:B29:b::1::1:l:4:f:1:ntvf:3\ncell:C29:b::1::1:l:4:f:1\ncell:D29:b::1::1:l:4:f:6\ncell:E29:b::1::1:l:4:f:1\ncell:F29:b::1::1:l:3:f:1:ntvf:1\ncell:G29:b::1::1:l:4:f:1:ntvf:1\ncell:H29:vtf:t: :IF(AND(ISBLANK(G29), ISBLANK(F29)), " ", H28+G29-F29):b::1::1:l:3:f:1\ncell:A30:b::1::\ncell:B30:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C30:b::1::1:l:4:f:1:bg:3\ncell:D30:b::1::1:l:4:f:6:bg:3\ncell:E30:b::1::1:l:4:f:1:bg:3\ncell:F30:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G30:b::1::1:l:4:f:1:bg:3:ntvf:1\ncell:H30:vtf:t: :IF(AND(ISBLANK(G30), ISBLANK(F30)), " ", H29+G30-F30):b::1::1:l:3:f:1:bg:3\ncell:A31:b::1::\ncell:B31:b::1:1:1:l:4:f:1:ntvf:3\ncell:C31:b::1:1:1:l:4:f:1\ncell:D31:b::1:1:1:l:4:f:6\ncell:E31:b::1:1:1:l:4:f:1\ncell:F31:b::1:1:1:l:3:f:1:ntvf:1\ncell:G31:b::1:1:1:l:4:f:1:ntvf:1\ncell:H31:vtf:t: :IF(AND(ISBLANK(G31), ISBLANK(F31)), " ", H30+G31-F31):b::1:1:1:l:3:f:1\ncol:A:w:31\ncol:B:w:74\ncol:C:w:72\ncol:D:w:168\ncol:E:w:43\ncol:F:w:100\ncol:G:w:100\ncol:H:w:103\nsheet:c:9:r:31:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:* 12pt arial,helvetica,sans-serif\nfont:3:* 14pt arial,helvetica,sans-serif\nfont:4:* x-small arial,helvetica,sans-serif\nfont:5:normal normal 12pt Arial\nfont:6:normal normal 12pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:4:padding:4px 8px 4px 12px;vertical-align:*;\nlayout:5:padding:6px * 6px *;vertical-align:*;\nlayout:6:padding:6px * 6px *;vertical-align:bottom;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\n', - }, - name: "sheet6", - hidden: "0", - }, - sheet10: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:4\ncell:E3:t:Budget:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F3:v:18750:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:G3:v:13125:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:H3:v:2500:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:I3:vtf:n:34375:sum(F3\\cH3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:E4:t:% Spent:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F4:vtf:n:0.21333333333333335:IF(F3=0,"-",F31/F3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:G4:vtf:n:0.6857142857142857:IF(G3=0,"-",G31/G3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:H4:vtf:n:0.8:IF(H3=0,"-",H31/H3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:I4:vtf:n:0.43636363636363634:IF(I3=0,"-",I31/I3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:E5:t:Remaining:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F5:vtf:n:14750:F3-F31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:G5:vtf:n:4125:G3-G31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:H5:vtf:n:500:H3-H31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:I5:vtf:n:19375:I3-I31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:E6:vtc:::\ncell:F6:vtc:::\ncell:G6:vtc:::\ncell:H6:vtc:::\ncell:I6:vtc:::\ncell:C7:t:Date:l:2:f:3:c:4:bg:1:cf:1\ncell:D7:t:Payment Types:l:2:f:3:c:4:bg:1:cf:1\ncell:E7:t:Description:l:2:f:3:c:4:bg:1:cf:1\ncell:F7:t:Category 1:l:2:f:3:c:4:bg:1:cf:1\ncell:G7:t:Category 2:l:2:f:3:c:4:bg:1:cf:1\ncell:H7:t:Category 3:l:2:f:3:c:4:bg:1:cf:1\ncell:I7:t:Subtotal:l:2:f:3:c:4:bg:1:cf:1\ncell:B8:b::1::\ncell:C8:v:39814:b::1::1:l:1:f:2:ntvf:5\ncell:D8:t:CrCard:b::1::1:l:1:f:2\ncell:E8:t:Walmart:b::1::1:l:1:f:2\ncell:F8:v:4000:b::1::1:l:1:f:2:ntvf:1\ncell:G8:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H8:v:2000:b::1::1:l:1:f:2:ntvf:1\ncell:I8:vtf:n:6000:SUM(F8\\cH8):b::1::1:l:1:f:2:ntvf:2\ncell:B9:b::1::\ncell:C9:v:39823:b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D9:t:Db Card:b::1::1:l:1:f:2:bg:2\ncell:E9:t:ABC Services, Inc.:b::1::1:l:1:f:2:bg:2\ncell:F9:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G9:v:9000:b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H9:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I9:vtf:n:9000:SUM(F9\\cH9):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B10:b::1::\ncell:C10:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D10:vtc::::b::1::1:l:1:f:2\ncell:E10:vtc::::b::1::1:l:1:f:2\ncell:F10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I10:vtf:n:0:SUM(F10\\cH10):b::1::1:l:1:f:2:ntvf:2\ncell:B11:b::1::\ncell:C11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D11:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E11:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I11:vtf:n:0:SUM(F11\\cH11):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B12:b::1::\ncell:C12:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D12:vtc::::b::1::1:l:1:f:2\ncell:E12:vtc::::b::1::1:l:1:f:2\ncell:F12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I12:vtf:n:0:SUM(F12\\cH12):b::1::1:l:1:f:2:ntvf:2\ncell:B13:b::1::\ncell:C13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D13:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E13:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I13:vtf:n:0:SUM(F13\\cH13):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B14:b::1::\ncell:C14:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D14:vtc::::b::1::1:l:1:f:2\ncell:E14:vtc::::b::1::1:l:1:f:2\ncell:F14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I14:vtf:n:0:SUM(F14\\cH14):b::1::1:l:1:f:2:ntvf:2\ncell:B15:b::1::\ncell:C15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D15:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E15:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I15:vtf:n:0:SUM(F15\\cH15):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B16:b::1::\ncell:C16:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D16:vtc::::b::1::1:l:1:f:2\ncell:E16:vtc::::b::1::1:l:1:f:2\ncell:F16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I16:vtf:n:0:SUM(F16\\cH16):b::1::1:l:1:f:2:ntvf:2\ncell:B17:b::1::\ncell:C17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D17:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E17:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I17:vtf:n:0:SUM(F17\\cH17):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B18:b::1::\ncell:C18:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D18:vtc::::b::1::1:l:1:f:2\ncell:E18:vtc::::b::1::1:l:1:f:2\ncell:F18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I18:vtf:n:0:SUM(F18\\cH18):b::1::1:l:1:f:2:ntvf:2\ncell:B19:b::1::\ncell:C19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D19:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E19:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I19:vtf:n:0:SUM(F19\\cH19):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B20:b::1::\ncell:C20:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D20:vtc::::b::1::1:l:1:f:2\ncell:E20:vtc::::b::1::1:l:1:f:2\ncell:F20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I20:vtf:n:0:SUM(F20\\cH20):b::1::1:l:1:f:2:ntvf:2\ncell:B21:b::1::\ncell:C21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D21:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E21:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I21:vtf:n:0:SUM(F21\\cH21):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B22:b::1::\ncell:C22:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D22:vtc::::b::1::1:l:1:f:2\ncell:E22:vtc::::b::1::1:l:1:f:2\ncell:F22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I22:vtf:n:0:SUM(F22\\cH22):b::1::1:l:1:f:2:ntvf:2\ncell:B23:b::1::\ncell:C23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D23:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E23:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I23:vtf:n:0:SUM(F23\\cH23):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B24:b::1::\ncell:C24:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D24:vtc::::b::1::1:l:1:f:2\ncell:E24:vtc::::b::1::1:l:1:f:2\ncell:F24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I24:vtf:n:0:SUM(F24\\cH24):b::1::1:l:1:f:2:ntvf:2\ncell:B25:b::1::\ncell:C25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D25:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E25:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I25:vtf:n:0:SUM(F25\\cH25):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B26:b::1::\ncell:C26:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D26:vtc::::b::1::1:l:1:f:2\ncell:E26:vtc::::b::1::1:l:1:f:2\ncell:F26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I26:vtf:n:0:SUM(F26\\cH26):b::1::1:l:1:f:2:ntvf:2\ncell:B27:b::1::\ncell:C27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D27:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E27:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I27:vtf:n:0:SUM(F27\\cH27):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B28:b::1::\ncell:C28:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D28:vtc::::b::1::1:l:1:f:2\ncell:E28:vtc::::b::1::1:l:1:f:2\ncell:F28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I28:vtf:n:0:SUM(F28\\cH28):b::1::1:l:1:f:2:ntvf:2\ncell:B29:b::1::\ncell:C29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D29:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E29:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I29:vtf:n:0:SUM(F29\\cH29):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B30:b::1::\ncell:C30:vtc::::b::1:1:1:l:1:f:2:ntvf:5\ncell:D30:vtc::::b::1:1:1:l:1:f:2\ncell:E30:vtc::::b::1:1:1:l:1:f:2\ncell:F30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:G30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:H30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:I30:vtf:n:0:SUM(F30\\cH30):b::1:1:1:l:1:f:2:ntvf:2\ncell:E31:t:Expense Total:b:2:2:2:2:l:1:f:2:c:4:bg:1:cf:1\ncell:F31:vtf:n:4000:SUM(F8\\cF30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:G31:vtf:n:9000:SUM(G8\\cG30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:H31:vtf:n:2000:SUM(H8\\cH30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:I31:vtf:n:15000:SUM(F31\\cH31):b:2:2:2:2:l:1:f:2:c:3:bg:1:ntvf:2\ncol:A:w:10\ncol:B:w:10\ncol:C:w:70\ncol:D:w:71\ncol:E:w:147\ncol:F:w:82\ncol:G:w:81\ncol:H:w:82\ncol:I:w:100\ncol:J:w:80\ncol:K:w:96\nsheet:c:11:r:31:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(238, 238, 238)\ncolor:4:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal normal * arial,helvetica,sans-serif\nfont:3:normal normal 12pt arial,helvetica,sans-serif\nlayout:1:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00;\\b-#,##0.00;\\b-\nvalueformat:3:0.00%\nvalueformat:4:hidden\nvalueformat:5:m/d/yy\n', - }, - name: "sheet7", - hidden: "0", - }, - sheet11: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:ntvf:1\ncol:A:w:31\ncol:B:w:25\ncol:C:w:80\ncol:D:w:44\ncol:E:w:53\ncol:F:w:70\ncol:G:w:68\ncol:H:w:65\ncol:I:w:65\ncol:J:w:80\ncol:K:w:96\nsheet:c:11:r:1:needsrecalc:yes:font:1\nfont:1:* 12pt *\nvalueformat:1:hidden\n", - }, - name: "sheet8", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "income!D8": true, - "income!E5": true, - "income!D9": true, - "sheet11!D2": true, - "income!D10": true, - "income!D11": true, - "goals!H3": true, - "income!D12": true, - "sheet9!E18": true, - "income!D13": true, - "sheet9!D2": true, - "sheet10!D2": true, - "income!D14": true, - "income!D15": true, - "income!D16": true, - "income!D17": true, - "income!D18": true, - "income!D19": true, - "income!D20": true, - "income!D21": true, - "income!C8": true, - "income!C9": true, - "income!C10": true, - "income!C11": true, - "income!C12": true, - "income!C13": true, - "income!C14": true, - "income!C15": true, - "income!C16": true, - "income!C17": true, - "income!C18": true, - "income!C19": true, - "income!C20": true, - "income!C21": true, - "income!C22": true, - "income!C23": true, - "income!H18": true, - "income!H17": true, - "income!H16": true, - "income!H15": true, - "income!H14": true, - "income!H13": true, - "income!K18": true, - "income!H19": true, - "income!K17": true, - "income!K16": true, - "income!K15": true, - "income!K14": true, - "expense!B4": true, - "income!K13": true, - "expense!E4": true, - "expense!F4": true, - "expense!E6": true, - "expense!F6": true, - "expense!B7": true, - "expense!C8": true, - "expense!D9": true, - "expense!D10": true, - "expense!D11": true, - "expense!D12": true, - "expense!D13": true, - "expense!E8": true, - "expense!E9": true, - "expense!E10": true, - "expense!E11": true, - "expense!E12": true, - "expense!E13": true, - "expense!C14": true, - "expense!D20": true, - "expense!D19": true, - "expense!D18": true, - "expense!D17": true, - "expense!D16": true, - "expense!D15": true, - "expense!E20": true, - "expense!E19": true, - "expense!E18": true, - "expense!E17": true, - "expense!E16": true, - "expense!E15": true, - "expense!C21": true, - "expense!C24": true, - "expense!D24": true, - "expense!D23": true, - "expense!D25": true, - "expense!D26": true, - "expense!D27": true, - "expense!D28": true, - "expense!D29": true, - "expense!D30": true, - "expense!D31": true, - "expense!E25": true, - "expense!E26": true, - "expense!E27": true, - "expense!E28": true, - "expense!E29": true, - "expense!E30": true, - "expense!E31": true, - "sheet9!B12": true, - "sheet9!B17": true, - "sheet9!B26": true, - "sheet9!C5": true, - "sheet9!C9": true, - "sheet9!B4": true, - "sheet9!D6": true, - "sheet9!D7": true, - "sheet9!D8": true, - "sheet9!D11": true, - "sheet9!D10": true, - "sheet9!E6": true, - "sheet9!E7": true, - "sheet9!E8": true, - "sheet9!E11": true, - "sheet9!E10": true, - "sheet9!D13": true, - "sheet9!D14": true, - "sheet9!D15": true, - "sheet9!D16": true, - "sheet9!E13": true, - "sheet9!E14": true, - "sheet9!E15": true, - "sheet9!E16": true, - "sheet9!D18": true, - "sheet9!D19": true, - "sheet9!D20": true, - "sheet9!D21": true, - "sheet9!D22": true, - "sheet9!D23": true, - "sheet9!D24": true, - "sheet9!D25": true, - "sheet9!E19": true, - "sheet9!E20": true, - "sheet9!E21": true, - "sheet9!E22": true, - "sheet9!E23": true, - "sheet9!E24": true, - "sheet9!E25": true, - "sheet9!D26": true, - "sheet9!D27": true, - "sheet9!D28": true, - "sheet9!D29": true, - "sheet9!D30": true, - "sheet9!D31": true, - "sheet9!E26": true, - "sheet9!E27": true, - "sheet9!E28": true, - "sheet9!E29": true, - "sheet9!E30": true, - "sheet9!E31": true, - "sheet10!B4": true, - "sheet10!B13": true, - "sheet10!B18": true, - "sheet10!B25": true, - "sheet10!B22": true, - "sheet10!D5": true, - "sheet10!D12": true, - "sheet10!D11": true, - "sheet10!D9": true, - "sheet10!D8": true, - "sheet10!D7": true, - "sheet10!D6": true, - "sheet10!E5": true, - "sheet10!E12": true, - "sheet10!E11": true, - "sheet10!E9": true, - "sheet10!E8": true, - "sheet10!E7": true, - "sheet10!E6": true, - "sheet10!D17": true, - "sheet10!D16": true, - "sheet10!D15": true, - "sheet10!D14": true, - "sheet10!E17": true, - "sheet10!E16": true, - "sheet10!E15": true, - "sheet10!E14": true, - "sheet10!D21": true, - "sheet10!D20": true, - "sheet10!D19": true, - "sheet10!E21": true, - "sheet10!E20": true, - "sheet10!E19": true, - "sheet10!D24": true, - "sheet10!D23": true, - "sheet10!E24": true, - "sheet10!E23": true, - "sheet10!D30": true, - "sheet10!D29": true, - "sheet10!D28": true, - "sheet10!D27": true, - "sheet10!D26": true, - "sheet10!E30": true, - "sheet10!E29": true, - "sheet10!E28": true, - "sheet10!E27": true, - "sheet10!E26": true, - "sheet11!B4": true, - "sheet11!B12": true, - "sheet11!B18": true, - "sheet11!B26": true, - "sheet11!D5": true, - "sheet11!D11": true, - "sheet11!D9": true, - "sheet11!D8": true, - "sheet11!D7": true, - "sheet11!D6": true, - "sheet11!D10": true, - "sheet11!E5": true, - "sheet11!E11": true, - "sheet11!E9": true, - "sheet11!E8": true, - "sheet11!E7": true, - "sheet11!E6": true, - "sheet11!E10": true, - "sheet11!D17": true, - "sheet11!D16": true, - "sheet11!D15": true, - "sheet11!D14": true, - "sheet11!D13": true, - "sheet11!E17": true, - "sheet11!E16": true, - "sheet11!E15": true, - "sheet11!E14": true, - "sheet11!E13": true, - "sheet11!D24": true, - "sheet11!D25": true, - "sheet11!D23": true, - "sheet11!D22": true, - "sheet11!D21": true, - "sheet11!D20": true, - "sheet11!D19": true, - "sheet11!E24": true, - "sheet11!E25": true, - "sheet11!E23": true, - "sheet11!E22": true, - "sheet11!E21": true, - "sheet11!E20": true, - "sheet11!E19": true, - "sheet11!D29": true, - "sheet11!D28": true, - "sheet11!D27": true, - "sheet11!E29": true, - "sheet11!E28": true, - "sheet11!E27": true, - "goals!C7": true, - "goals!C8": true, - "goals!C9": true, - "goals!C10": true, - "goals!C11": true, - "goals!C12": true, - "goals!C13": true, - "goals!C14": true, - "goals!C15": true, - "goals!C16": true, - "goals!C17": true, - "goals!C18": true, - "goals!C19": true, - "goals!C20": true, - "goals!C21": true, - "goals!C22": true, - "goals!C23": true, - "goals!C24": true, - "goals!C25": true, - "goals!C26": true, - "goals!J7": true, - "goals!J8": true, - "goals!J9": true, - "goals!J10": true, - "goals!J11": true, - "goals!J12": true, - "goals!J13": true, - "goals!J14": true, - "goals!J15": true, - "goals!J16": true, - "goals!J17": true, - "goals!J18": true, - "goals!J19": true, - "goals!J20": true, - "goals!J21": true, - "goals!J22": true, - "goals!J23": true, - "goals!J24": true, - "goals!J25": true, - "goals!J26": true, - "goals!F7": true, - "goals!F11": true, - "goals!F15": true, - "goals!F19": true, - "goals!F23": true, - "goals!G7": true, - "goals!G11": true, - "goals!G15": true, - "goals!G19": true, - "goals!G23": true, - "goals!C27": true, - "goals!C28": true, - "goals!C29": true, - "goals!C30": true, - "goals!H28": true, - "goals!H29": true, - "goals!H30": true, - "goals!G27": true, - "compare!D10": true, - "compare!D11": true, - "compare!D12": true, - "compare!D13": true, - "compare!D27": true, - "compare!D26": true, - "compare!D25": true, - "compare!D24": true, - "compare!D23": true, - "compare!D22": true, - "compare!D21": true, - "compare!D20": true, - "goals!F31": true, - "goals!C31": true, - "goals!J31": true, - "goals!J32": true, - "goals!G31": true, - "goals!J33": true, - "goals!J27": true, - "goals!J34": true, - "goals!J28": true, - "goals!J29": true, - "goals!J30": true, - "sheet6!C3": true, - "sheet6!B6": true, - "sheet6!C6": true, - "sheet6!D6": true, - "sheet6!E6": true, - "sheet6!F6": true, - "sheet6!G6": true, - "sheet6!H6": true, - "sheet6!C31": true, - "sheet6!C30": true, - "sheet6!C29": true, - "sheet6!C28": true, - "sheet6!C27": true, - "sheet6!C26": true, - "sheet6!C25": true, - "sheet6!C24": true, - "sheet6!C23": true, - "sheet6!C22": true, - "sheet6!C21": true, - "sheet6!C20": true, - "sheet6!C19": true, - "sheet6!C18": true, - "sheet6!C17": true, - "sheet6!C16": true, - "sheet6!C15": true, - "sheet6!C14": true, - "sheet6!C13": true, - "sheet6!C12": true, - "sheet6!C11": true, - "sheet6!C10": true, - "sheet6!C9": true, - "sheet6!B7": true, - "sheet7!F3": true, - "sheet7!G3": true, - "sheet7!H3": true, - "sheet7!D7": true, - "sheet7!E3": true, - "sheet7!E4": true, - "sheet7!E5": true, - "sheet7!I7": true, - "sheet7!H7": true, - "sheet7!G7": true, - "sheet7!F7": true, - "sheet7!E7": true, - "sheet7!C7": true, - "sheet7!C28": true, - "sheet7!C27": true, - "sheet7!C26": true, - "sheet7!C25": true, - "sheet7!C24": true, - "sheet7!C23": true, - "sheet7!C22": true, - "sheet7!C21": true, - "sheet7!C20": true, - "sheet7!C19": true, - "sheet7!C18": true, - "sheet7!C17": true, - "sheet7!C16": true, - "sheet7!C15": true, - "sheet7!C14": true, - "sheet7!C13": true, - "sheet7!C12": true, - "sheet7!C11": true, - "sheet7!C29": true, - "sheet7!C30": true, - "sheet7!C10": true, - "sheet7!C9": true, - "sheet7!C8": true, - "sheet7!D28": true, - "sheet7!D27": true, - "sheet7!D26": true, - "sheet7!D25": true, - "sheet7!D24": true, - "sheet7!D23": true, - "sheet7!D22": true, - "sheet7!D21": true, - "sheet7!D20": true, - "sheet7!D19": true, - "sheet7!D18": true, - "sheet7!D17": true, - "sheet7!D16": true, - "sheet7!D15": true, - "sheet7!D14": true, - "sheet7!D13": true, - "sheet7!D12": true, - "sheet7!D11": true, - "sheet7!D29": true, - "sheet7!D30": true, - "sheet7!D10": true, - "sheet7!D9": true, - "sheet7!D8": true, - "sheet7!F28": true, - "sheet7!F27": true, - "sheet7!F26": true, - "sheet7!F25": true, - "sheet7!F24": true, - "sheet7!F23": true, - "sheet7!F22": true, - "sheet7!F21": true, - "sheet7!F20": true, - "sheet7!F19": true, - "sheet7!F18": true, - "sheet7!F17": true, - "sheet7!F16": true, - "sheet7!F15": true, - "sheet7!F14": true, - "sheet7!F13": true, - "sheet7!F12": true, - "sheet7!F11": true, - "sheet7!F29": true, - "sheet7!F30": true, - "sheet7!F10": true, - "sheet7!F9": true, - "sheet7!F8": true, - "sheet7!G28": true, - "sheet7!G27": true, - "sheet7!G26": true, - "sheet7!G25": true, - "sheet7!G24": true, - "sheet7!G23": true, - "sheet7!G22": true, - "sheet7!G21": true, - "sheet7!G20": true, - "sheet7!G19": true, - "sheet7!G18": true, - "sheet7!G17": true, - "sheet7!G16": true, - "sheet7!G15": true, - "sheet7!G14": true, - "sheet7!G13": true, - "sheet7!G12": true, - "sheet7!G11": true, - "sheet7!G29": true, - "sheet7!G30": true, - "sheet7!G31": true, - "sheet7!G32": true, - "sheet7!G33": true, - "sheet7!G34": true, - "sheet7!G35": true, - "sheet7!G36": true, - "sheet7!G37": true, - "sheet7!G38": true, - "sheet7!G39": true, - "sheet7!G10": true, - "sheet7!G9": true, - "sheet7!G8": true, - "sheet7!E28": true, - "sheet7!E27": true, - "sheet7!E26": true, - "sheet7!E25": true, - "sheet7!E24": true, - "sheet7!E23": true, - "sheet7!E22": true, - "sheet7!E21": true, - "sheet7!E20": true, - "sheet7!E19": true, - "sheet7!E18": true, - "sheet7!E17": true, - "sheet7!E16": true, - "sheet7!E15": true, - "sheet7!E14": true, - "sheet7!E13": true, - "sheet7!E12": true, - "sheet7!E11": true, - "sheet7!E29": true, - "sheet7!E30": true, - "sheet7!E10": true, - "sheet7!E9": true, - "sheet7!E8": true, - "sheet7!H28": true, - "sheet7!H27": true, - "sheet7!H26": true, - "sheet7!H25": true, - "sheet7!H24": true, - "sheet7!H23": true, - "sheet7!H22": true, - "sheet7!H21": true, - "sheet7!H20": true, - "sheet7!H19": true, - "sheet7!H18": true, - "sheet7!H17": true, - "sheet7!H16": true, - "sheet7!H15": true, - "sheet7!H14": true, - "sheet7!H13": true, - "sheet7!H12": true, - "sheet7!H11": true, - "sheet7!H29": true, - "sheet7!H30": true, - "sheet7!H10": true, - "sheet7!H9": true, - "sheet7!E31": true, - "sheet7!H8": true, - "sheet6!C8": true, - "sheet6!D31": true, - "sheet6!D30": true, - "sheet6!D29": true, - "sheet6!D28": true, - "sheet6!D27": true, - "sheet6!D26": true, - "sheet6!D25": true, - "sheet6!D24": true, - "sheet6!D23": true, - "sheet6!D22": true, - "sheet6!D21": true, - "sheet6!D20": true, - "sheet6!D19": true, - "sheet6!D18": true, - "sheet6!D17": true, - "sheet6!D16": true, - "sheet6!D15": true, - "sheet6!D14": true, - "sheet6!D13": true, - "sheet6!D12": true, - "sheet6!D11": true, - "sheet6!D10": true, - "sheet6!D9": true, - "sheet6!D8": true, - "sheet6!F31": true, - "sheet6!F30": true, - "sheet6!F29": true, - "sheet6!F28": true, - "sheet6!F27": true, - "sheet6!F26": true, - "sheet6!F25": true, - "sheet6!F24": true, - "sheet6!F23": true, - "sheet6!F22": true, - "sheet6!F21": true, - "sheet6!F20": true, - "sheet6!F19": true, - "sheet6!F18": true, - "sheet6!F17": true, - "sheet6!F16": true, - "sheet6!F15": true, - "sheet6!F14": true, - "sheet6!F13": true, - "sheet6!F12": true, - "sheet6!F11": true, - "sheet6!F10": true, - "sheet6!F9": true, - "sheet6!F8": true, - "sheet6!G31": true, - "sheet6!G30": true, - "sheet6!G29": true, - "sheet6!G28": true, - "sheet6!G27": true, - "sheet6!G26": true, - "sheet6!G25": true, - "sheet6!G24": true, - "sheet6!G23": true, - "sheet6!G22": true, - "sheet6!G21": true, - "sheet6!G20": true, - "sheet6!G19": true, - "sheet6!G18": true, - "sheet6!G17": true, - "sheet6!G16": true, - "sheet6!G15": true, - "sheet6!G14": true, - "sheet6!G13": true, - "sheet6!G12": true, - "sheet6!G11": true, - "sheet6!G10": true, - "sheet6!G9": true, - "sheet6!G8": true, - "sheet6!B31": true, - "sheet6!B30": true, - "sheet6!B29": true, - "sheet6!B28": true, - "sheet6!B27": true, - "sheet6!B26": true, - "sheet6!B25": true, - "sheet6!B24": true, - "sheet6!B23": true, - "sheet6!B22": true, - "sheet6!B21": true, - "sheet6!B20": true, - "sheet6!B19": true, - "sheet6!B18": true, - "sheet6!B17": true, - "sheet6!B16": true, - "sheet6!B15": true, - "sheet6!B14": true, - "sheet6!B13": true, - "sheet6!B12": true, - "sheet6!B11": true, - "sheet6!B10": true, - "sheet6!B9": true, - "sheet6!B8": true, - "sheet6!C7": true, - "sheet6!D7": true, - "sheet6!E7": true, - "sheet6!F7": true, - "sheet6!G7": true, - "sheet6!E31": true, - "sheet6!E30": true, - "sheet6!E29": true, - "sheet6!E28": true, - "sheet6!E27": true, - "sheet6!E26": true, - "sheet6!E25": true, - "sheet6!E24": true, - "sheet6!E23": true, - "sheet6!E22": true, - "sheet6!E21": true, - "sheet6!E20": true, - "sheet6!E19": true, - "sheet6!E18": true, - "sheet6!E17": true, - "sheet6!E16": true, - "sheet6!E15": true, - "sheet6!E14": true, - "sheet6!E13": true, - "sheet6!E12": true, - "sheet6!E11": true, - "sheet6!E10": true, - "sheet6!E9": true, - "sheet6!E8": true, - "compare!B4": true, - "compare!C9": true, - "compare!D9": true, - "compare!E9": true, - "compare!F9": true, - "compare!C10": true, - "compare!C11": true, - "compare!C12": true, - "compare!C13": true, - "compare!F19": true, - "compare!C19": true, - "compare!C27": true, - "compare!C26": true, - "compare!C25": true, - "compare!C24": true, - "compare!C23": true, - "compare!C22": true, - "compare!C21": true, - "compare!C20": true, - "summary!G18": true, - "summary!O32": true, - }, - constraints: {}, - }, - }, - footers: [ - { name: "Type1", index: 1, isActive: true }, - { name: "Type2", index: 2, isActive: false }, - { name: "Type3", index: 3, isActive: false }, - { name: "Detail1", index: 4, isActive: false }, - { name: "Detail2", index: 5, isActive: false }, - ], - }, - }, - home: { - iPad: { - msc: { - numsheets: 4, - currentid: "sheet1", - currentname: "typei", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE:b:1:1:1:1:f:6:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:t::b:2::2::l:1:f:7\ncell:G2:t::b:2::2::l:1:f:7\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2:::2:l:3:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:2::::l:1:f:7\ncell:G3:b:2:2:::l:3:f:7\ncell:A4:b::2:::l:3:f:7\ncell:B4:b::::2:l:3:f:3\ncell:C4:t:INVOICE # \\c:f:2:cf:2\ncell:D4:v:1:f:2:cf:2\ncell:F4:tvf:4:rowspan:4\ncell:G4:b::2:::l:3:f:7\ncell:A5:b::2:::l:3:f:7\ncell:B5:b::::2:l:3:f:4\ncell:F5:t::l:2:f:7\ncell:G5:t::b::1:::l:2:f:7\ncell:A6:b::2:::l:3:f:7\ncell:B6:b::::2:l:3:f:4\ncell:C6:t:INVOICE DATE\\c:f:2:cf:2\ncell:D6:f:2:cf:2:ntvf:3\ncell:F6:l:2:f:7\ncell:G6:b::1:::l:2:f:7\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::::2:l:3:f:4\ncell:G7:b::2:::l:3:f:7\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::::2:l:3:f:4\ncell:G8:b::2:::l:3:f:7\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::::2:l:3:f:4\ncell:C9:t:BILL TO\\c:l:3:f:2\ncell:E9:t:FROM\\c:f:2:cf:2\ncell:G9:b::2:::l:3:f:7\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::::2:l:3:f:3\ncell:C10:t:[Name]:f:1:cf:2:colspan:2\ncell:E10:t:[Name]:f:1:cf:2:colspan:2\ncell:G10:b::2:::l:3:f:7\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:E11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:G11:b::2:::l:3:f:7\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:E12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:G12:b::2:::l:3:f:7\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:Phone\\c:f:1:cf:2:colspan:2\ncell:E13:t:Phone\\c:f:1:cf:2:colspan:2\ncell:G13:b::2:::l:3:f:7\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::::2:l:3:f:3:cf:2\ncell:C14:b:::2::l:1:f:7\ncell:D14:b:::2::l:3:f:3:cf:2\ncell:E14:b:::2::l:1:f:7\ncell:F14:b:::2::l:1:f:7\ncell:G14:b::2:::l:3:f:7\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::2::2:l:3:f:7\ncell:C15:t:Description:b:1::1:1:f:2:cf:1:colspan:3\ncell:D15:t:Description:b:1::1::l:3:f:3:cf:2:colspan:2:rowspan:1\ncell:E15:t::b:2:2:2::l:1:f:7\ncell:F15:t:Amount:b:1:1:1:1:f:2:cf:1\ncell:G15:b::2::2:l:3:f:7\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::2::2:l:3:f:7\ncell:C16:b:1:1::1:f:1:cf:2:colspan:3\ncell:D16:b:1:1:::l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:E16:t::b:2:2:2::l:1:f:7\ncell:F16:b:1:1:::f:1:ntvf:1\ncell:G16:b::2::2:l:3:f:7\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::2::2:l:3:f:7:cf:2\ncell:C17:b::1::1:f:1:cf:2:colspan:3\ncell:D17:b::1:::l:1:f:7:colspan:2\ncell:E17:l:1:f:7\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::2::2:l:3:f:7\ncell:A18:b::2:::l:3:f:7\ncell:B18:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C18:b::1::1:f:1:cf:2:colspan:3\ncell:D18:b::1:::colspan:2\ncell:F18:b::1:::f:1:ntvf:1\ncell:G18:b::2::2:l:3:f:7\ncell:A19:b::2:::l:3:f:7\ncell:B19:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C19:b::1::1:f:1:cf:2:colspan:3\ncell:D19:b::1:::colspan:2\ncell:F19:b::1:::f:1:ntvf:1\ncell:G19:b::2::2:l:3:f:7\ncell:A20:b::2:::l:3:f:7\ncell:B20:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C20:b::1::1:f:1:cf:2:colspan:3\ncell:D20:b::1:::colspan:2\ncell:F20:b::1:::f:1:ntvf:1\ncell:G20:b::2::2:l:3:f:7\ncell:A21:b::2:::l:3:f:7\ncell:B21:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C21:b::1::1:f:1:cf:2:colspan:3\ncell:D21:b::1:::colspan:2\ncell:F21:b::1:::f:1:ntvf:1\ncell:G21:b::2::2:l:3:f:7\ncell:A22:b::2:::l:3:f:7\ncell:B22:b::2::2:l:3:f:7:cf:2:ntvf:2\ncell:C22:b::1::1:f:1:cf:2:colspan:3\ncell:D22:b::1:::colspan:2\ncell:F22:b::1:::f:1:ntvf:1\ncell:G22:b::2::2:l:3:f:7\ncell:A23:b::2:::l:3:f:7\ncell:B23:b::2::2:l:3:f:7:cf:2\ncell:C23:b::1::1:f:1:cf:2:colspan:3\ncell:D23:b::1:::colspan:2\ncell:F23:b::1:::f:1:ntvf:1\ncell:G23:b::2::2:l:3:f:7\ncell:A24:b::2:::l:3:f:7\ncell:B24:b::2::2:l:3:f:7:cf:2\ncell:C24:b::1::1:f:1:cf:2:colspan:3\ncell:D24:b::1:::colspan:2\ncell:F24:b::1:::f:1:ntvf:1\ncell:G24:b::2::2:l:3:f:7\ncell:A25:b::2:::l:3:f:7\ncell:B25:b::2::2:l:3:f:7:cf:2\ncell:C25:b::1::1:f:1:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:1:ntvf:1\ncell:G25:b::2::2:l:3:f:7\ncell:A26:b::2:::l:3:f:7\ncell:B26:b::2::2:l:3:f:7:cf:2\ncell:C26:b::1::1:f:1:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:1:ntvf:1\ncell:G26:b::2::2:l:3:f:7\ncell:A27:b::2:::l:3:f:7\ncell:B27:b::2::2:l:3:f:7:cf:2\ncell:C27:b::1::1:f:1:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:1:ntvf:1\ncell:G27:b::2::2:l:3:f:7\ncell:A28:b::2:::l:3:f:4\ncell:B28:b::2::2:l:3:f:7:cf:2\ncell:C28:b::1:1:1:f:1:cf:2:colspan:3\ncell:D28:b::1:1::l:3:f:7:cf:2:colspan:2\ncell:E28:b:::2::l:3:f:7:cf:2\ncell:F28:b::1:1::f:1:ntvf:1\ncell:G28:b::2::2:l:3:f:7\ncell:A29:b::2:::l:3:f:3\ncell:B29:b::2::2:l:3:f:3\ncell:C29:t:TOTAL:b:1:1:1:1:f:5:cf:2:colspan:3\ncell:D29:b:2::2::l:3:f:8:cf:2\ncell:E29:b:2:2:2::l:3:f:8:cf:2\ncell:F29:vtf:n:0:SUM(F16\\cF28):b:1:1:1::f:5:ntvf:1\ncell:G29:b::2::2:l:3:f:4\ncell:A30:b::2:::l:3:f:7\ncell:B30:b::::2:l:3:f:3:cf:2\ncell:C30:b:2::::l:1:f:7\ncell:D30:b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:7\ncell:F30:b:2::::l:1:f:7\ncell:G30:b::2:::l:3:f:3\ncell:A31:b::2:::l:3:f:7\ncell:B31:b::::2:l:3:f:7\ncell:D31:tvf:4:rowspan:4\ncell:G31:b::2:::l:3:f:7\ncell:A32:b::2:::l:3:f:7\ncell:B32:b::::2:l:3:f:7\ncell:G32:b::2:::l:3:f:7\ncell:A33:b::2:::l:3:f:7\ncell:B33:b::::2:l:3:f:7\ncell:G33:b::2:::l:3:f:7\ncell:A34:b::2:::l:3:f:7\ncell:B34:b::::2:l:3:f:7\ncell:G34:b::2:::l:3:f:7\ncell:A35:b::2:::l:3:f:7\ncell:B35:b:::2:2:l:3:f:7\ncell:C35:b:::2::l:3:f:7\ncell:D35:b:::2::l:3:f:7\ncell:E35:b:::2::l:3:f:7\ncell:F35:b:::2::l:3:f:7\ncell:G35:b::2:2::l:3:f:7\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncell:F36:b:1:::\ncell:G36:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:105\ncol:D:w:182\ncol:E:w:110\ncol:F:w:115\ncol:G:w:65\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:7:r:36:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:normal bold * Trebuchet MS\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 12pt Arial\nfont:5:normal bold 12pt Trebuchet MS\nfont:6:normal bold 14pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "typei", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - 'version:1.5\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE:b:1:1:1:1:l:3:f:6:cf:1:colspan:8\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:t::b:2::2::l:1:f:7\ncell:G2:b:2::2::l:1:f:7\ncell:H2:b:2::2::l:1:f:7\ncell:I2:t::b:2::2::l:1:f:7\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2:::2:l:3:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:2::::l:1:f:7\ncell:G3:b:2::::l:1:f:7\ncell:H3:b:2::::l:1:f:7\ncell:I3:b:2:2:::l:3:f:7\ncell:A4:b::2:::l:3:f:7\ncell:B4:b::::2:l:3:f:3\ncell:C4:t:INVOICE # \\c:f:2:cf:2\ncell:D4:v:1:f:2:cf:2\ncell:F4:tvf:5:colspan:2:rowspan:4\ncell:I4:b::2:::l:3:f:7\ncell:A5:b::2:::l:3:f:7\ncell:B5:b::::2:l:3:f:4\ncell:F5:t::l:2:f:7\ncell:G5:l:2:f:7\ncell:H5:l:2:f:7\ncell:I5:t::b::1:::l:2:f:7\ncell:A6:b::2:::l:3:f:7\ncell:B6:b::::2:l:3:f:4\ncell:C6:t:INVOICE DATE\\c:f:2:cf:2\ncell:D6:f:2:cf:2:ntvf:4\ncell:F6:l:2:f:7\ncell:G6:l:2:f:7\ncell:H6:l:2:f:7\ncell:I6:b::1:::l:2:f:7\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::::2:l:3:f:4\ncell:I7:b::2:::l:3:f:7\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::::2:l:3:f:4\ncell:I8:b::2:::l:3:f:7\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::::2:l:3:f:4\ncell:C9:t:BILL TO\\c:f:2\ncell:E9:t:FROM\\c:f:2:cf:2\ncell:F9:colspan:3\ncell:I9:b::2:::l:3:f:7\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::::2:l:3:f:3\ncell:C10:t:[Name]:f:1:cf:2:colspan:2\ncell:E10:t:[Name]:f:1:cf:2:colspan:4\ncell:I10:b::2:::l:3:f:7\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:E11:t:[Street Address]:f:1:colspan:4\ncell:I11:b::2:::l:3:f:7\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:E12:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:I12:b::2:::l:3:f:7\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:Phone\\c :f:1:cf:2:colspan:2\ncell:E13:t:Phone\\c :f:1:cf:2:colspan:4\ncell:I13:b::2:::l:3:f:7\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::::2:l:3:f:3:cf:2\ncell:C14:b:::2::l:1:f:7\ncell:D14:b:::2::l:3:f:3:cf:2\ncell:E14:b:::2::l:1:f:7\ncell:F14:b:::2::l:1:f:7\ncell:G14:b:::2::l:1:f:7\ncell:H14:b:::2::l:1:f:7\ncell:I14:b::2:::l:3:f:7\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::2::2:l:3:f:7\ncell:C15:t:Description:b:1:1:1:1:f:2:cf:1:colspan:3\ncell:D15:t:Description:b:2::2:2:l:3:f:3:cf:2:colspan:2:rowspan:1\ncell:E15:t::b:2:2:2::l:1:f:7\ncell:F15:t:Hours:b:1:1:1:1:f:2:cf:1\ncell:G15:t:Rate:b:1:1:1:1:f:2:cf:1\ncell:H15:t:Amount:b:1:1:1:1:f:2:cf:1\ncell:I15:b::2::2:l:3:f:7\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::2::2:l:3:f:7\ncell:C16:b:1:1::1:f:1:cf:2:colspan:3\ncell:D16:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:E16:t::b:2:2:2::l:1:f:7\ncell:F16:b:1:1:::f:1:ntvf:1\ncell:G16:b:1:1:::f:1:ntvf:1\ncell:H16:vtf:t::IF(F16*G16>0,F16*G16,""):b:1:1:::f:1:ntvf:1\ncell:I16:b::2::2:l:3:f:7\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::2::2:l:3:f:7:cf:2\ncell:C17:b::1::1:f:1:cf:2:colspan:3\ncell:D17:b::1::1:l:1:f:7:colspan:2\ncell:E17:l:1:f:7\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::1:::f:1:ntvf:1\ncell:H17:vtf:t::IF(F17*G17>0,F17*G17,""):b::1:::f:1:ntvf:1\ncell:I17:b::2::2:l:3:f:7\ncell:A18:b::2:::l:3:f:7\ncell:B18:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C18:b::1::1:f:1:cf:2:colspan:3\ncell:D18:b::1::1:colspan:2\ncell:F18:b::1:::f:1:ntvf:1\ncell:G18:b::1:::f:1:ntvf:1\ncell:H18:vtf:t::IF(F18*G18>0,F18*G18,""):b::1:::f:1:ntvf:1\ncell:I18:b::2::2:l:3:f:7\ncell:A19:b::2:::l:3:f:7\ncell:B19:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C19:b::1::1:f:1:cf:2:colspan:3\ncell:D19:b::1::1:colspan:2\ncell:F19:b::1:::f:1:ntvf:1\ncell:G19:b::1:::f:1:ntvf:1\ncell:H19:vtf:t::IF(F19*G19>0,F19*G19,""):b::1:::f:1:ntvf:1\ncell:I19:b::2::2:l:3:f:7\ncell:A20:b::2:::l:3:f:7\ncell:B20:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C20:b::1::1:f:1:cf:2:colspan:3\ncell:D20:b::1::1:colspan:2\ncell:F20:b::1:::f:1:ntvf:1\ncell:G20:b::1:::f:1:ntvf:1\ncell:H20:vtf:t::IF(F20*G20>0,F20*G20,""):b::1:::f:1:ntvf:1\ncell:I20:b::2::2:l:3:f:7\ncell:A21:b::2:::l:3:f:7\ncell:B21:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C21:b::1::1:f:1:cf:2:colspan:3\ncell:D21:b::1::1:colspan:2\ncell:F21:b::1:::f:1:ntvf:1\ncell:G21:b::1:::f:1:ntvf:1\ncell:H21:vtf:t::IF(F21*G21>0,F21*G21,""):b::1:::f:1:ntvf:1\ncell:I21:b::2::2:l:3:f:7\ncell:A22:b::2:::l:3:f:7\ncell:B22:b::2::2:l:3:f:7:cf:2:ntvf:3\ncell:C22:b::1::1:f:1:cf:2:colspan:3\ncell:D22:b::1::1:colspan:2\ncell:F22:b::1:::f:1:ntvf:1\ncell:G22:b::1:::f:1:ntvf:1\ncell:H22:vtf:t::IF(F22*G22>0,F22*G22,""):b::1:::f:1:ntvf:1\ncell:I22:b::2::2:l:3:f:7\ncell:A23:b::2:::l:3:f:7\ncell:B23:b::2::2:l:3:f:7:cf:2\ncell:C23:b::1::1:f:1:cf:2:colspan:3\ncell:D23:b::1::1:colspan:2\ncell:F23:b::1:::f:1:ntvf:1\ncell:G23:b::1:::f:1:ntvf:1\ncell:H23:vtf:t::IF(F23*G23>0,F23*G23,""):b::1:::f:1:ntvf:1\ncell:I23:b::2::2:l:3:f:7\ncell:A24:b::2:::l:3:f:7\ncell:B24:b::2::2:l:3:f:7:cf:2\ncell:C24:b::1::1:f:1:cf:2:colspan:3\ncell:D24:b::1::1:colspan:2\ncell:F24:b::1:::f:1:ntvf:1\ncell:G24:b::1:::f:1:ntvf:1\ncell:H24:vtf:t::IF(F24*G24>0,F24*G24,""):b::1:::f:1:ntvf:1\ncell:I24:b::2::2:l:3:f:7\ncell:A25:b::2:::l:3:f:7\ncell:B25:b::2::2:l:3:f:7:cf:2\ncell:C25:b::1::1:f:1:cf:2:colspan:3\ncell:D25:b::1::1:colspan:2\ncell:F25:b::1:::f:1:ntvf:1\ncell:G25:b::1:::f:1:ntvf:1\ncell:H25:vtf:t::IF(F25*G25>0,F25*G25,""):b::1:::f:1:ntvf:1\ncell:I25:b::2::2:l:3:f:7\ncell:A26:b::2:::l:3:f:7\ncell:B26:b::2::2:l:3:f:7:cf:2\ncell:C26:b::1::1:f:1:cf:2:colspan:3\ncell:D26:b::1::1:colspan:2\ncell:F26:b::1:::f:1:ntvf:1\ncell:G26:b::1:::f:1:ntvf:1\ncell:H26:vtf:t::IF(F26*G26>0,F26*G26,""):b::1:::f:1:ntvf:1\ncell:I26:b::2::2:l:3:f:7\ncell:A27:b::2:::l:3:f:7\ncell:B27:b::2::2:l:3:f:7:cf:2\ncell:C27:b::1::1:f:1:cf:2:colspan:3\ncell:D27:b::1::1:colspan:2\ncell:F27:b::1:::f:1:ntvf:1\ncell:G27:b::1:::f:1:ntvf:1\ncell:H27:vtf:t::IF(F27*G27>0,F27*G27,""):b::1:::f:1:ntvf:1\ncell:I27:b::2::2:l:3:f:7\ncell:A28:b::2:::l:3:f:4\ncell:B28:b::2::2:l:3:f:7:cf:2\ncell:C28:b::1:1:1:f:1:cf:2:colspan:3\ncell:D28:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:E28:b:::2::l:3:f:7:cf:2\ncell:F28:b::1:1::f:1:ntvf:1\ncell:G28:b::1:1::f:1:ntvf:1\ncell:H28:vtf:t::IF(F28*G28>0,F28*G28,""):b::1:::f:1:ntvf:1\ncell:I28:b::2::2:l:3:f:7\ncell:A29:b::2:::l:3:f:3\ncell:B29:b::2::2:l:3:f:3\ncell:C29:t:TOTAL:b:1:1:1:1:l:3:f:5:cf:2:colspan:5\ncell:D29:b:2::2::l:3:f:8:cf:2\ncell:E29:b:2:2:2::l:3:f:8:cf:2\ncell:F29:vtf:n:0:SUM(F16\\cF28):b:2:2:2::l:3:f:4:ntvf:2\ncell:G29:b:2:2:2::l:3:f:4:ntvf:2\ncell:H29:vtf:n:0:SUM(H16\\cH28):b:1:1:1::f:5:ntvf:1\ncell:I29:b::2::2:l:3:f:4\ncell:A30:b::2:::l:3:f:7\ncell:B30:b::::2:l:3:f:3:cf:2\ncell:C30:b:2::::l:1:f:7\ncell:D30:b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:7\ncell:F30:b:2::::l:1:f:7\ncell:G30:b:2::::l:1:f:7\ncell:H30:b:2::::l:1:f:7\ncell:I30:b::2:::l:3:f:3\ncell:A31:b::2:::l:3:f:7\ncell:B31:b::::2:l:3:f:7\ncell:D31:tvf:5:rowspan:4\ncell:I31:b::2:::l:3:f:7\ncell:A32:b::2:::l:3:f:7\ncell:B32:b::::2:l:3:f:7\ncell:I32:b::2:::l:3:f:7\ncell:A33:b::2:::l:3:f:7\ncell:B33:b::::2:l:3:f:7\ncell:I33:b::2:::l:3:f:7\ncell:A34:b::2:::l:3:f:7\ncell:B34:b::::2:l:3:f:7\ncell:I34:b::2:::l:3:f:7\ncell:A35:b::2:::l:3:f:7\ncell:B35:b:::2:2:l:3:f:7\ncell:C35:b:::2::l:3:f:7\ncell:D35:b:::2::l:3:f:7\ncell:E35:b:::2::l:3:f:7\ncell:F35:b:::2::l:3:f:7\ncell:G35:b:::2::l:3:f:7\ncell:H35:b:::2::l:3:f:7\ncell:I35:b::2:2::l:3:f:7\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncell:F36:b:1:::\ncell:G36:b:1:::\ncell:H36:b:1:::\ncell:I36:b:1:::\ncol:A:w:26\ncol:B:w:28\ncol:C:w:96\ncol:D:w:203\ncol:E:w:51\ncol:F:w:50\ncol:G:w:58\ncol:H:w:80\ncol:I:w:28\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:9:r:36:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:normal bold * Trebuchet MS\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 12pt Arial\nfont:5:normal bold 12pt Trebuchet MS\nfont:6:normal bold 14pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00;(#,##0.00)\nvalueformat:3:d-mmm\nvalueformat:4:m/d/yy\nvalueformat:5:text-html\n', - }, - name: "typeii", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:l:3\ncell:B2:t:[Company Name]:l:1:f:3:cf:2:colspan:3\ncell:C2:t::l:2:f:9\ncell:D2:t::l:2:f:9\ncell:E2:l:1:f:7:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:9\ncell:B3:t:[Company Slogan]:f:4:cf:2:colspan:3\ncell:C3:t::l:2:f:9\ncell:D3:t::l:2:f:9\ncell:B4:f:2:colspan:2\ncell:F4:tvf:4:rowspan:4\ncell:B5:t:[Street Address]:f:1:cf:2:colspan:2\ncell:F5:l:1:f:6\ncell:G5:l:1:f:10:cf:1\ncell:B6:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:G6:l:1:f:9\ncell:B7:t:Phone\\c :f:1:cf:2:colspan:2\ncell:B8:t:Email\\c:f:1:cf:2:colspan:2\ncell:B9:colspan:2\ncell:F9:t:DATE \\c:l:1:f:6:cf:2\ncell:G9:l:1:f:10:cf:2:ntvf:3\ncell:B10:t:BILL TO\\c:f:5:c:1:bg:3:cf:2:colspan:2\ncell:F10:t:INVOICE # \\c:l:1:f:6:cf:2\ncell:G10:v:1:l:1:f:10:cf:2\ncell:B11:t:[Name]:f:1:cf:2:colspan:2\ncell:B12:t:[Company Name]:f:1:cf:2:colspan:2\ncell:F12:t: \ncell:B13:t:[Street Address]:f:1:cf:2:colspan:2\ncell:B14:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:B15:t:Phone\\c :f:1:cf:2:colspan:2\ncell:A17:b::1::\ncell:B17:t:DESCRIPTION:b:1:1:1:1:l:1:f:6:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C17:t::l:2:f:9\ncell:D17:t::l:2:f:9\ncell:E17:t::l:2:f:9\ncell:F17:t::l:2:f:9\ncell:G17:t:AMOUNT:b:1:1:1::l:1:f:6:c:1:bg:3:cf:1\ncell:A18:b::1::\ncell:B18:b:1:1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C18:t::l:2:f:9\ncell:D18:t::l:2:f:9\ncell:E18:t::l:2:f:9\ncell:F18:t::b::2:::l:1:f:9\ncell:G18:b::1::1:f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C19:t::l:2:f:9\ncell:D19:t::l:2:f:9\ncell:E19:t::l:2:f:9\ncell:F19:t::b::2:::l:1:f:9\ncell:G19:b::1::1:f:1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C20:t::l:2:f:9\ncell:D20:t::l:2:f:9\ncell:E20:t::l:2:f:9\ncell:F20:t::b::2:::l:1:f:9\ncell:G20:b::1::1:f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C21:t::l:2:f:9\ncell:D21:t::l:2:f:9\ncell:E21:t::l:2:f:9\ncell:F21:t::b::2:::l:1:f:9\ncell:G21:b::1::1:f:1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C22:t::l:2:f:9\ncell:D22:t::l:2:f:9\ncell:E22:t::l:2:f:9\ncell:F22:t::b::2:::l:1:f:9\ncell:G22:b::1::1:f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:9\ncell:D23:t::l:2:f:9\ncell:E23:t::l:2:f:9\ncell:F23:t::b::2:::l:1:f:9\ncell:G23:b::1::1:f:1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:9\ncell:D24:t::l:2:f:9\ncell:E24:t::l:2:f:9\ncell:F24:t::b::2:::l:1:f:9\ncell:G24:b::1::1:f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:9\ncell:D25:t::l:2:f:9\ncell:E25:t::l:2:f:9\ncell:F25:t::b::2:::l:1:f:9\ncell:G25:b::1::1:f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:9\ncell:D26:t::l:2:f:9\ncell:E26:t::l:2:f:9\ncell:F26:t::b::2:::l:1:f:9\ncell:G26:b::1::1:f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:9\ncell:D27:t::l:2:f:9\ncell:E27:t::l:2:f:9\ncell:F27:t::b::2:::l:1:f:9\ncell:G27:b::1::1:f:1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:9\ncell:D28:t::l:2:f:9\ncell:E28:t::l:2:f:9\ncell:F28:t::b::2:::l:1:f:9\ncell:G28:b::1::1:f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:f:1:cf:2:colspan:5:rowspan:1\ncell:C29:t::b:::2::l:1:f:9\ncell:D29:t::b:::2::l:1:f:9\ncell:E29:t::b:::2::l:1:f:9\ncell:F29:t::b::2:2::l:1:f:9\ncell:G29:b::1:1:1:f:1:ntvf:1\ncell:B30:b:2::::l:1:f:9\ncell:C30:b:2::::l:1:f:9\ncell:D30:b:2::::l:1:f:9\ncell:E30:b:2::::l:1:f:10\ncell:F30:t:Subtotal:b:2::::l:1:f:10\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::f:8:ntvf:1\ncell:B31:t:NOTES:b:::2::l:1:f:6:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:9\ncell:D31:t::b:::2::l:1:f:9\ncell:F31:t:Tax Rate:l:1:f:1\ncell:G31:v:0:f:1:ntvf:2\ncell:B32:b:1::::f:1:cf:2:colspan:3\ncell:C32:t::b:2::::l:1:f:9\ncell:D32:t::b:2::::l:1:f:9\ncell:F32:t:Tax:l:1:f:1\ncell:G32:vtf:n:0:G31*G30:f:1:ntvf:1\ncell:B33:f:1:cf:2:colspan:3\ncell:C33:t::l:2:f:9\ncell:D33:t::l:2:f:9\ncell:F33:t:Other:b:::1::l:1:f:1\ncell:G33:v:0:b:::1::f:1:ntvf:1\ncell:B34:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:2:f:9\ncell:D34:t::l:2:f:9\ncell:F34:t:TOTAL:b:2::::l:1:f:6\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::::f:5:ntvf:1\ncell:C36:tvf:4:colspan:5:rowspan:7\ncol:A:w:40\ncol:B:w:232\ncol:C:w:53\ncol:D:w:90\ncol:E:w:54\ncol:F:w:91\ncol:G:w:99\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nsheet:c:7:r:36:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 16pt Trebuchet MS\nfont:4:italic normal * Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 28pt Trebuchet MS\nfont:8:normal normal * Trebuchet MS\nfont:9:normal normal 10pt Arial\nfont:10:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "typeiii", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:3\ncell:B2:t:[Company Name]:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C2:t::l:2:f:7\ncell:D2:t::l:2:f:7\ncell:F2:t:INVOICE:l:1:f:6:c:1:cf:2:colspan:2\ncell:G2:t::l:2:f:7\ncell:B3:t:[Company slogan]:f:3:cf:2:colspan:3:rowspan:1\ncell:C3:t::l:2:f:7\ncell:D3:t::l:2:f:7\ncell:B4:cf:2:colspan:3:rowspan:1\ncell:F4:tvf:4:rowspan:4\ncell:B5:t:[Street Address]:f:1:cf:2:colspan:3:rowspan:1\ncell:F5:l:1:f:5\ncell:G5:l:1:f:8:cf:1\ncell:B6:t:[City, State, Zip]:f:1:cf:2:colspan:3:rowspan:1\ncell:G6:l:1:f:7\ncell:B7:t:Phone\\c :f:1:cf:2:colspan:3:rowspan:1\ncell:B8:t:Email\\c:f:1:cf:2:colspan:3:rowspan:1\ncell:B9:cf:2:colspan:3:rowspan:1\ncell:B10:t:BILL TO\\c:l:1:f:5:bg:2:cf:2:colspan:2\ncell:F10:t:DATE\\c:l:1:f:5:cf:2\ncell:G10:l:1:f:8:cf:2:ntvf:3\ncell:B11:t:[Name]:f:1:cf:2:colspan:3:rowspan:1\ncell:F11:t:INVOICE # \\c:l:1:f:5:cf:2\ncell:G11:v:1:l:1:f:8:cf:2\ncell:B12:t:[Company Name]:f:1:cf:2:colspan:3:rowspan:1\ncell:J12:tvf:4\ncell:B13:t:[Street Address]:f:1:cf:2:colspan:3:rowspan:1\ncell:B14:t:[City, State, Zip]:f:1:cf:2:colspan:3:rowspan:1\ncell:B15:t:Phone\\c :f:1:cf:2:colspan:3:rowspan:1\ncell:B16:cf:2:colspan:3:rowspan:1\ncell:A17:b::1::\ncell:B17:t:DESCRIPTION:b:1:1:1:1:l:1:f:5:bg:2:cf:1:colspan:3:rowspan:1\ncell:C17:t::b:1::1::l:1:f:7:bg:2\ncell:D17:t::b:1::1::l:1:f:7:bg:2\ncell:E17:t:HOURS:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:F17:t:RATE:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:G17:t:AMOUNT:b:1:1:1::l:1:f:5:bg:2:cf:1\ncell:A18:b::1::\ncell:B18:b:1:1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C18:t::b:2::::l:1:f:7\ncell:D18:t::b:2:2:::l:1:f:7\ncell:E18:b:1:1::1:f:1:ntvf:1\ncell:F18:b:1:1::1:f:1:ntvf:1\ncell:G18:vtf:t::IF(E18*F18>0,E18*F18,""):b:1:1:::f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C19:t::l:2:f:7\ncell:D19:t::b::2:::l:1:f:7\ncell:E19:b::1::1:f:1:ntvf:1\ncell:F19:b::1::1:f:1:ntvf:1\ncell:G19:vtf:t::IF(E19*F19>0,E19*F19,""):b::1:::f:1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C20:t::l:2:f:7\ncell:D20:t::b::2:::l:1:f:7\ncell:E20:b::1::1:f:1:ntvf:1\ncell:F20:b::1::1:f:1:ntvf:1\ncell:G20:vtf:t::IF(E20*F20>0,E20*F20,""):b::1:::f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C21:t::l:2:f:7\ncell:D21:t::b::2:::l:1:f:7\ncell:E21:b::1::1:f:1:ntvf:1\ncell:F21:b::1::1:f:1:ntvf:1\ncell:G21:vtf:t::IF(E21*F21>0,E21*F21,""):b::1:::f:1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C22:t::l:2:f:7\ncell:D22:t::b::2:::l:1:f:7\ncell:E22:b::1::1:f:1:ntvf:1\ncell:F22:b::1::1:f:1:ntvf:1\ncell:G22:vtf:t::IF(E22*F22>0,E22*F22,""):b::1:::f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C23:t::l:2:f:7\ncell:D23:t::b::2:::l:1:f:7\ncell:E23:b::1::1:f:1:ntvf:1\ncell:F23:b::1::1:f:1:ntvf:1\ncell:G23:vtf:t::IF(E23*F23>0,E23*F23,""):b::1:::f:1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C24:t::l:2:f:7\ncell:D24:t::b::2:::l:1:f:7\ncell:E24:b::1::1:f:1:ntvf:1\ncell:F24:b::1::1:f:1:ntvf:1\ncell:G24:vtf:t::IF(E24*F24>0,E24*F24,""):b::1:::f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C25:t::l:2:f:7\ncell:D25:t::b::2:::l:1:f:7\ncell:E25:b::1::1:f:1:ntvf:1\ncell:F25:b::1::1:f:1:ntvf:1\ncell:G25:vtf:t::IF(E25*F25>0,E25*F25,""):b::1:::f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C26:t::l:2:f:7\ncell:D26:t::b::2:::l:1:f:7\ncell:E26:b::1::1:f:1:ntvf:1\ncell:F26:b::1::1:f:1:ntvf:1\ncell:G26:vtf:t::IF(E26*F26>0,E26*F26,""):b::1:::f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C27:t::l:2:f:7\ncell:D27:t::b::2:::l:1:f:7\ncell:E27:b::1::1:f:1:ntvf:1\ncell:F27:b::1::1:f:1:ntvf:1\ncell:G27:vtf:t::IF(E27*F27>0,E27*F27,""):b::1:::f:1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C28:t::l:2:f:7\ncell:D28:t::b::2:::l:1:f:7\ncell:E28:b::1::1:f:1:ntvf:1\ncell:F28:b::1::1:f:1:ntvf:1\ncell:G28:vtf:t::IF(E28*F28>0,E28*F28,""):b::1:::f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C29:t::b:::2::l:1:f:7\ncell:D29:t::b::2:2::l:1:f:7\ncell:E29:b::1:1:1:f:1:ntvf:1\ncell:F29:b::1:1:1:f:1:ntvf:1\ncell:G29:vtf:t::IF(E29*F29>0,E29*F29,""):b::1:::f:1:ntvf:1\ncell:B30:b:2::::l:1:f:8:cf:1:colspan:3:rowspan:1\ncell:C30:t::b:2::::l:1:f:7\ncell:D30:t::b:2::::l:1:f:7\ncell:E30:b:2::::l:1:f:8\ncell:F30:t:Subtotal:b:1::::f:1\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::f:1:ntvf:1\ncell:B31:t:NOTES:b:::2::l:1:f:5:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:7\ncell:D31:t::b:::2::l:1:f:7\ncell:F31:t:Tax Rate:f:1\ncell:G31:v:0:f:1:ntvf:2\ncell:B32:b:1::::f:1:cf:2:colspan:3:rowspan:1\ncell:C32:t::b:2::::l:1:f:7\ncell:D32:t::b:2::::l:1:f:7\ncell:F32:t:Tax:f:1\ncell:G32:vtf:n:0:G31*G30:f:1:ntvf:1\ncell:B33:f:1:cf:2:colspan:3:rowspan:1\ncell:C33:t::l:2:f:7\ncell:D33:t::l:2:f:7\ncell:F33:t:Other:b:::1::l:1:f:1\ncell:G33:v:0:b:::1::f:1:ntvf:1\ncell:B34:f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:2:f:7\ncell:D34:t::l:2:f:7\ncell:F34:t:TOTAL:b:1::::l:1:f:4\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::::f:4:ntvf:1\ncell:B35:b:2::::l:1:f:7\ncell:C35:b:2::::l:1:f:7\ncell:D35:b:2::::l:1:f:7\ncell:C36:tvf:4:colspan:5:rowspan:7\ncol:A:w:40\ncol:B:w:194\ncol:C:w:128\ncol:D:w:60\ncol:E:w:65\ncol:F:w:95\ncol:G:w:90\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:10:r:36:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0,0,0)\ncolor:2:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 16pt Trebuchet MS\nfont:3:italic normal * Trebuchet MS\nfont:4:normal bold * Trebuchet MS\nfont:5:normal bold 10pt Trebuchet MS\nfont:6:normal bold 28pt Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "typeiv", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "typei!C10": true, - "typei!B2": true, - "typei!C11": true, - "typei!C12": true, - "typei!C13": true, - "typei!D9": true, - "typei!D4": true, - "typei!D6": true, - "typei!E10": true, - "typei!E11": true, - "typei!E12": true, - "typei!E13": true, - "typei!F9": true, - "typei!C16": true, - "typei!C17": true, - "typei!C18": true, - "typei!C19": true, - "typei!C20": true, - "typei!C21": true, - "typei!C22": true, - "typei!C23": true, - "typei!C24": true, - "typei!C25": true, - "typei!C26": true, - "typei!C27": true, - "typei!C28": true, - "typei!F16": true, - "typei!F17": true, - "typei!F18": true, - "typei!F19": true, - "typei!F20": true, - "typei!F21": true, - "typei!F22": true, - "typei!F23": true, - "typei!F24": true, - "typei!F25": true, - "typei!F26": true, - "typei!F27": true, - "typei!F28": true, - "typei!E35": true, - "typeii!B2": true, - "typeii!D4": true, - "typeii!C10": true, - "typeii!C11": true, - "typeii!C12": true, - "typeii!C13": true, - "typeii!D9": true, - "typeii!E10": true, - "typeii!E11": true, - "typeii!E12": true, - "typeii!E13": true, - "typeii!F9": true, - "typeii!C16": true, - "typeii!C17": true, - "typeii!C18": true, - "typeii!C19": true, - "typeii!C20": true, - "typeii!C21": true, - "typeii!C22": true, - "typeii!C23": true, - "typeii!C24": true, - "typeii!C25": true, - "typeii!C26": true, - "typeii!C27": true, - "typeii!C28": true, - "typeii!F16": true, - "typeii!F17": true, - "typeii!F18": true, - "typeii!F19": true, - "typeii!F20": true, - "typeii!F21": true, - "typeii!F22": true, - "typeii!F23": true, - "typeii!F24": true, - "typeii!F25": true, - "typeii!F26": true, - "typeii!F27": true, - "typeii!F28": true, - "typeii!G16": true, - "typeii!G17": true, - "typeii!G18": true, - "typeii!G19": true, - "typeii!G20": true, - "typeii!G21": true, - "typeii!G22": true, - "typeii!G23": true, - "typeii!G24": true, - "typeii!G25": true, - "typeii!G26": true, - "typeii!G27": true, - "typeii!G28": true, - "typeii!E35": true, - "typeiii!G9": true, - "typeiii!G10": true, - "typeiii!B2": true, - "typeiii!B3": true, - "typeiii!B4": true, - "typeiii!B5": true, - "typeiii!B6": true, - "typeiii!B7": true, - "typeiii!B8": true, - "typeiii!B9": true, - "typeiii!B11": true, - "typeiii!B12": true, - "typeiii!B13": true, - "typeiii!B14": true, - "typeiii!B15": true, - "typeiii!B18": true, - "typeiii!B19": true, - "typeiii!B20": true, - "typeiii!B21": true, - "typeiii!B22": true, - "typeiii!B23": true, - "typeiii!B24": true, - "typeiii!B25": true, - "typeiii!B26": true, - "typeiii!B27": true, - "typeiii!B28": true, - "typeiii!B29": true, - "typeiii!G18": true, - "typeiii!G19": true, - "typeiii!G20": true, - "typeiii!G21": true, - "typeiii!G22": true, - "typeiii!G23": true, - "typeiii!G24": true, - "typeiii!G25": true, - "typeiii!G26": true, - "typeiii!G27": true, - "typeiii!G28": true, - "typeiii!G29": true, - "typeiii!B32": true, - "typeiii!B33": true, - "typeiii!B34": true, - "typeiii!G31": true, - "typeiii!G33": true, - "typeiii!B37": true, - "typeiv!G9": true, - "typeiv!G10": true, - "typeiv!B2": true, - "typeiv!B3": true, - "typeiv!B4": true, - "typeiv!B5": true, - "typeiv!B6": true, - "typeiv!B7": true, - "typeiv!B8": true, - "typeiv!B11": true, - "typeiv!B12": true, - "typeiv!B13": true, - "typeiv!B14": true, - "typeiv!B15": true, - "typeiv!B16": true, - "typeiv!B18": true, - "typeiv!B19": true, - "typeiv!B20": true, - "typeiv!B21": true, - "typeiv!B22": true, - "typeiv!B23": true, - "typeiv!B24": true, - "typeiv!B25": true, - "typeiv!B26": true, - "typeiv!B27": true, - "typeiv!B28": true, - "typeiv!B29": true, - "typeiv!E18": true, - "typeiv!E19": true, - "typeiv!E20": true, - "typeiv!E21": true, - "typeiv!E22": true, - "typeiv!E23": true, - "typeiv!E24": true, - "typeiv!E25": true, - "typeiv!E26": true, - "typeiv!E27": true, - "typeiv!E28": true, - "typeiv!E29": true, - "typeiv!F18": true, - "typeiv!F19": true, - "typeiv!F2": true, - "typeiv!F20": true, - "typeiv!F21": true, - "typeiv!F22": true, - "typeiv!F23": true, - "typeiv!F24": true, - "typeiv!F25": true, - "typeiv!F26": true, - "typeiv!F27": true, - "typeiv!F28": true, - "typeiv!F29": true, - "typeiv!B32": true, - "typeiv!B33": true, - "typeiv!B34": true, - "typeiv!G31": true, - "typeiv!G33": true, - "typeiv!B37": true, - "typeii!F15": true, - "typeii!G15": true, - "typeiv!E17": true, - "typeiv!F17": true, - "typeii!D6": true, - "typeiv!G11": true, - "typei!C4": true, - "typeii!C4": true, - "typeiii!F10": true, - "typeiv!F11": true, - "typeiv!F10": true, - "typeiii!F9": true, - "typeii!C6": true, - "typei!C6": true, - "typei!F4": true, - "typeii!F4": true, - "typeiii!F4": true, - "typeiii!F2": true, - "typeiv!F4": true, - "typei!F29": true, - "typeii!H29": true, - "typeiii!G30": true, - "typeiii!G34": true, - "typeiv!G30": true, - "typeiv!G34": true, - }, - constraints: {}, - }, - }, - footers: [ - { name: "Invoice 1", index: 1, isActive: true }, - { name: "Invoice 2", index: 2, isActive: false }, - { name: "Company Invoice 1", index: 3, isActive: false }, - { name: "Company Invoice 2", index: 4, isActive: false }, - ], - }, - default: { - msc: { - numsheets: 11, - currentid: "sheet1", - currentname: "summary", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B2:t:Summary:l:1:f:4:c:1:bg:6:cf:2:colspan:4\ncell:B4:l:1:f:3:c:1:bg:6:cf:2\ncell:G4:t:
    \\n\\n\\n:tvf:3:colspan:3:rowspan:5\ncell:C5:t:Monthly Budget:l:4:f:5:c:6:bg:3:cf:1:colspan:2\ncell:D5:bg:5\ncell:B6:b::1::\ncell:C6:t:Total Income:b::1:1:1:l:3:f:6:cf:2\ncell:D6:vtf:n:37112:INCOME!D23:b::1:1:1:l:2:f:1:ntvf:1\ncell:B7:b::1::\ncell:C7:t:Total Expenses:b:::1:1:l:3:f:6:bg:5:cf:2\ncell:D7:vtf:n:4853:SHEET11!E30:b::1:1:1:l:2:f:1:bg:5:ntvf:1\ncell:C8:t:Savings:b:1::1:1:l:3:f:6:cf:2\ncell:D8:vtf:n:32259:D6-D7:b:1:1:1:1:l:2:f:1:ntvf:1\ncell:B10:t::l:1:f:3:c:1:bg:6:cf:2\ncell:G10:t:
    \\n\\n\\n:tvf:3:colspan:3:rowspan:5\ncell:C11:t:Yearly Budget:l:4:f:5:c:6:bg:2:cf:1:colspan:2\ncell:B12:b::1::\ncell:C12:t:Total Income:b::1:1:1:l:3:f:6:cf:2\ncell:D12:vtf:n:445344:INCOME!E23:b::1:1:1:l:3:f:1:ntvf:1\ncell:C13:t:Total Expenses:b:::1:1:l:3:f:6:bg:5:cf:2\ncell:D13:vtf:n:58236:SHEET11!F30:b::1:1:1:l:3:f:1:bg:5:ntvf:1\ncell:C14:t:Savings:b:1::1:1:l:3:f:6:cf:2\ncell:D14:vtf:n:387108:D12-D13:b:1:1:1:1:l:3:f:1:ntvf:1\ncell:B16:l:1:f:3:c:1:bg:6:cf:1\ncell:B17:bg:6\ncell:C17:t:Monthly Spending:l:4:f:5:c:6:bg:4:cf:1:colspan:2\ncell:D17:b::1:::bg:6\ncell:B18:b::1::\ncell:C18:t:Housing:b::1::1:l:3:f:6:cf:2\ncell:D18:vtf:n:1380:EXPENSE!E7:b::1::1:l:3:f:1:ntvf:1\ncell:G18:t:
    \\n\\n\\n:tvf:3:colspan:4:rowspan:11\ncell:B19:b::1::\ncell:C19:t:Food:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D19:vtf:n:511:sheet9!E4:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B20:b::1::\ncell:C20:t:Clothes:b::1::1:l:3:f:6:cf:2\ncell:D20:vtf:n:191:sheet9!E12:b::1::1:l:3:f:1:ntvf:1\ncell:B21:b::1::\ncell:C21:t:Transportation:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D21:vtf:n:640:sheet9!E17:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B22:b::1::\ncell:C22:t:Healthcare:b::1::1:l:3:f:6:cf:2\ncell:D22:vtf:n:263:sheet9!E26:b::1::1:l:3:f:1:ntvf:1\ncell:B23:b::1::\ncell:C23:t:Entertainment:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D23:vtf:n:209:sheet10!E4:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B24:b::1::\ncell:C24:t:Education:b::1::1:l:3:f:6:cf:2\ncell:D24:vtf:n:98:sheet10!E13:b::1::1:l:3:f:1:ntvf:1\ncell:B25:b::1::\ncell:C25:t:Contributions:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D25:vtf:n:222:sheet10!E18:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B26:b::1::\ncell:C26:t:Debt:b::1::1:l:3:f:6:cf:2\ncell:D26:vtf:n:0:sheet10!E22:b::1::1:l:3:f:1:ntvf:1\ncell:B27:b::1::\ncell:C27:t:Insurance:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D27:vtf:n:30:sheet10!E25:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B28:b::1::\ncell:C28:t:Credit Card :b::1::1:l:3:f:6:cf:2\ncell:D28:vtf:n:209:sheet11!E4:b::1::1:l:3:f:1:ntvf:1\ncell:B29:b::1::\ncell:C29:t:Buisness:b::1::1:l:3:f:6:bg:5:cf:2\ncell:D29:vtf:n:780:sheet11!E12:b::1::1:l:3:f:1:bg:5:ntvf:1\ncell:B30:b::1::\ncell:C30:t:Vacation:b::1::1:l:3:f:6:cf:2\ncell:D30:vtf:n:98:sheet11!E18:b::1::1:l:3:f:1:ntvf:1\ncell:E30:b::::1\ncell:B31:b::1::\ncell:C31:t:Miscellaneous:b::1:1:1:l:3:f:6:bg:5:cf:2\ncell:D31:vtf:n:222:sheet11!E26:b::1:1:1:l:3:f:1:bg:5:ntvf:1\ncell:E31:b::::1\ncell:C32:b:1:::\ncell:D32:b:1:::\ncol:A:w:60\ncol:B:w:20\ncol:C:w:151\ncol:D:w:89\ncol:E:w:20\ncol:F:w:54\ncol:G:w:95\ncol:H:w:96\ncol:I:w:88\ncol:J:w:47\nsheet:c:10:r:32:font:2\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,153,204)\ncolor:3:rgb(136,204,119)\ncolor:4:rgb(204,119,153)\ncolor:5:rgb(230,230,250)\ncolor:6:rgb(255, 255, 255)\nfont:1:* * Arial\nfont:2:* 12pt *\nfont:3:normal bold 12pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold large *\nfont:6:normal normal * Arial\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:1px 8px 1px *;vertical-align:middle;\nlayout:3:padding:1px 8px 1px 6px;vertical-align:middle;\nlayout:4:padding:3px 10px 3px 10px;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:text-html\n', - }, - name: "summary", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:8:cf:2:ntvf:2\ncell:B1:l:1:f:8:cf:2\ncell:C1:l:1:f:8:cf:2\ncell:D1:l:1:f:8:cf:2\ncell:E1:l:1:f:8:cf:2\ncell:F1:l:1:f:8:cf:2\ncell:G1:l:1:f:8:cf:2\ncell:H1:l:1:f:8:cf:2\ncell:I1:l:1:f:8:cf:2\ncell:J1:l:1:f:8:cf:2\ncell:K1:l:1:f:8:cf:2\ncell:L1:l:1:f:8:cf:2\ncell:M1:l:1:f:8:cf:2\ncell:N1:l:1:f:8:cf:2\ncell:O1:l:1:f:8:cf:2\ncell:P1:l:1:f:8:cf:2\ncell:Q1:l:1:f:8:cf:2\ncell:R1:l:1:f:8:cf:2\ncell:S1:l:1:f:8:cf:2\ncell:A2:l:1:f:8:cf:2\ncell:B2:l:1:f:8:cf:2\ncell:C2:l:1:f:8:cf:2\ncell:D2:l:1:f:8:cf:2\ncell:E2:l:1:f:8:cf:2\ncell:F2:l:1:f:8:cf:2\ncell:G2:l:1:f:8:cf:2\ncell:H2:l:1:f:8:cf:2\ncell:I2:l:1:f:8:cf:2\ncell:J2:l:1:f:8:cf:2\ncell:K2:l:1:f:8:cf:2\ncell:L2:l:1:f:8:cf:2\ncell:M2:l:1:f:8:cf:2\ncell:N2:l:1:f:8:cf:2\ncell:O2:l:1:f:8:cf:2\ncell:P2:l:1:f:8:cf:2\ncell:Q2:l:1:f:8:cf:2\ncell:R2:l:1:f:8:cf:2\ncell:S2:l:1:f:8:cf:2\ncell:A3:l:1:f:8:cf:2\ncell:B3:l:1:f:8:cf:2\ncell:C3:l:1:f:8:cf:2\ncell:D3:l:1:f:8:cf:2\ncell:E3:l:1:f:8:cf:2\ncell:F3:l:1:f:8:cf:2\ncell:G3:l:1:f:8:cf:2\ncell:H3:l:1:f:8:cf:2\ncell:I3:l:1:f:8:cf:2\ncell:J3:l:1:f:8:cf:2\ncell:K3:l:1:f:8:cf:2\ncell:L3:l:1:f:8:cf:2\ncell:M3:l:1:f:8:cf:2\ncell:N3:l:1:f:8:cf:2\ncell:O3:l:1:f:8:cf:2\ncell:P3:l:1:f:8:cf:2\ncell:Q3:l:1:f:8:cf:2\ncell:R3:l:1:f:8:cf:2\ncell:S3:l:1:f:8:cf:2\ncell:A4:l:1:f:8:cf:2\ncell:B4:l:1:f:8:cf:2\ncell:C4:l:1:f:8:cf:2\ncell:F4:l:1:f:8:cf:2\ncell:G4:l:1:f:8:cf:2\ncell:H4:l:1:f:8:cf:2\ncell:I4:l:1:f:8:cf:2\ncell:J4:l:1:f:8:cf:2\ncell:K4:l:1:f:8:cf:2\ncell:L4:l:1:f:8:cf:2\ncell:M4:t: :l:1:f:8:cf:2\ncell:N4:l:1:f:8:cf:2\ncell:O4:l:1:f:8:cf:2\ncell:P4:l:1:f:8:cf:2\ncell:Q4:l:1:f:8:cf:2\ncell:R4:l:1:f:8:cf:2\ncell:S4:l:1:f:8:cf:2\ncell:A5:l:1:f:8:cf:2\ncell:B5:t::l:2:f:5:cf:2\ncell:C5:t:Income:l:2:f:4:c:1:bg:7:cf:2\ncell:D5:t:Date:l:1:f:9:cf:2\ncell:E5:vtf:ndt:45465.92746829861:NOW():l:1:f:9:bg:6:cf:3:ntvf:3\ncell:F5:l:1:f:8:cf:2\ncell:G5:l:1:f:8:cf:2\ncell:H5:l:1:f:8:cf:2\ncell:I5:l:1:f:8:cf:2\ncell:J5:l:1:f:8:cf:2\ncell:K5:l:1:f:8:cf:2\ncell:L5:l:1:f:8:cf:2\ncell:M5:l:1:f:8:cf:2\ncell:N5:l:1:f:8:cf:2\ncell:O5:l:1:f:8:cf:2\ncell:P5:l:1:f:8:cf:2\ncell:Q5:l:1:f:8:cf:2\ncell:R5:l:1:f:8:cf:2\ncell:S5:l:1:f:8:cf:2\ncell:A6:l:1:f:8:cf:2\ncell:C6:t::l:2:f:8:cf:1\ncell:D6:l:1:f:8:cf:2\ncell:E6:l:1:f:8:cf:2\ncell:F6:l:1:f:8:cf:2\ncell:K6:t::l:2:f:3:cf:2\ncell:L6:t::l:2:f:8:cf:2\ncell:M6:t::l:2:f:8:cf:2\ncell:N6:t::l:2:f:8:cf:2\ncell:O6:l:1:f:8:cf:2\ncell:P6:l:1:f:8:cf:2\ncell:Q6:l:1:f:8:cf:2\ncell:R6:l:1:f:8:cf:2\ncell:S6:l:1:f:8:cf:2\ncell:A7:l:1:f:10:cf:2\ncell:B7:l:2:f:3:cf:2\ncell:F7:l:1:f:8:cf:2\ncell:K7:l:1:f:8:cf:2\ncell:L7:l:1:f:8:cf:2\ncell:M7:l:1:f:8:cf:2\ncell:N7:l:1:f:8:cf:2\ncell:O7:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:P7:t::l:1:f:8:cf:2\ncell:Q7:l:1:f:8:cf:2\ncell:R7:l:1:f:8:cf:2\ncell:S7:l:1:f:8:cf:2\ncell:A8:l:1:f:10:cf:2\ncell:C8:t:Source:l:2:f:2:c:7:bg:5:cf:1\ncell:D8:t:Monthly Budget:l:2:f:2:c:7:bg:4:cf:1\ncell:E8:t:Yearly Budget:l:2:f:2:c:7:bg:2:cf:1\ncell:F8:l:1:f:8:cf:2\ncell:K8:t::l:1:f:8:cf:2\ncell:L8:t::l:1:f:8:cf:2\ncell:M8:t::l:1:f:8:cf:2\ncell:N8:l:1:f:8:cf:2\ncell:O8:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:P8:t::l:1:f:8:cf:2\ncell:Q8:l:1:f:8:cf:2\ncell:R8:l:1:f:8:cf:2\ncell:S8:l:1:f:8:cf:2\ncell:B9:b::1:::l:1:f:8:cf:2\ncell:C9:t:Salary/Wages:b::1::1:l:5:f:7:cf:2\ncell:D9:v:20000:b::1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E9:vtf:n:240000:IF( (D9*12)=0,"",(D9*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F9:l:1:f:8:cf:2\ncell:K9:l:1:f:8:cf:2\ncell:L9:l:1:f:8:cf:2\ncell:M9:l:1:f:8:cf:2\ncell:N9:l:1:f:8:cf:2\ncell:O9:l:1:f:8:cf:2\ncell:P9:l:1:f:8:cf:2\ncell:Q9:l:1:f:8:cf:2\ncell:R9:l:1:f:8:cf:2\ncell:S9:l:1:f:8:cf:2\ncell:B10:b::1:::l:1:f:8:cf:2\ncell:C10:t:Contract Work:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D10:v:18012:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E10:vtf:n:216144:IF( (D10*12)=0,"",(D10*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F10:l:1:f:8:cf:2\ncell:G10:l:1:f:3:cf:3\ncell:H10:t::l:1:f:8:cf:3\ncell:I10:t::l:1:f:8:cf:3\ncell:J10:l:1:f:8:cf:2\ncell:K10:l:2:f:3:cf:2\ncell:L10:l:1:f:8:cf:2\ncell:M10:l:1:f:8:cf:2\ncell:N10:l:1:f:8:cf:2\ncell:O10:l:1:f:8:cf:2\ncell:P10:l:1:f:8:cf:2\ncell:Q10:l:1:f:8:cf:2\ncell:R10:l:1:f:8:cf:2\ncell:S10:l:1:f:8:cf:2\ncell:B11:b::1:::l:1:f:8:cf:2\ncell:C11:t:Bonuses:b::1::1:l:5:f:7:cf:2\ncell:D11:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E11:vtf:t::IF( (D11*12)=0,"",(D11*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F11:l:1:f:8:cf:2\ncell:G11:l:1:f:8:cf:2\ncell:H11:l:1:f:8:cf:2\ncell:I11:l:1:f:8:cf:2\ncell:J11:l:1:f:8:cf:2\ncell:K11:l:1:f:8:cf:2\ncell:L11:l:1:f:8:cf:2\ncell:M11:l:1:f:8:cf:2\ncell:N11:l:1:f:8:cf:2\ncell:O11:l:1:f:8:cf:2\ncell:P11:l:1:f:8:cf:2\ncell:Q11:l:1:f:8:cf:2\ncell:R11:l:1:f:8:cf:2\ncell:S11:l:1:f:8:cf:2\ncell:B12:b::1:::l:1:f:8:cf:2\ncell:C12:t:Commissions:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D12:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E12:vtf:t::IF( (D12*12)=0,"",(D12*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F12:l:1:f:8:cf:2\ncell:G12:l:1:f:8:cf:2\ncell:H12:l:1:f:8:cf:2\ncell:I12:l:1:f:8:cf:2\ncell:J12:l:1:f:8:cf:2\ncell:K12:l:1:f:8:cf:2\ncell:L12:l:1:f:8:cf:2\ncell:M12:l:1:f:8:cf:2\ncell:N12:l:1:f:8:cf:2\ncell:O12:l:1:f:8:cf:2\ncell:P12:l:1:f:8:cf:2\ncell:Q12:l:1:f:8:cf:2\ncell:R12:l:1:f:8:cf:2\ncell:S12:l:1:f:8:cf:2\ncell:B13:b::1:::l:1:f:8:cf:2\ncell:C13:t:Tips:b::1::1:l:5:f:7:cf:2\ncell:D13:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E13:vtf:t::IF( (D13*12)=0,"",(D13*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F13:l:1:f:8:cf:2\ncell:G13:l:1:f:8:cf:2\ncell:H13:t:Deductions:l:2:f:2:c:7:bg:5:cf:1:colspan:3\ncell:I13:l:1:f:8:c:7:cf:2\ncell:J13:l:1:f:8:c:7:cf:2\ncell:K13:t:Monthly Budget:l:2:f:2:c:7:bg:4:cf:1\ncell:L13:l:1:f:8:cf:2\ncell:M13:l:1:f:8:cf:2\ncell:N13:l:1:f:8:cf:2\ncell:O13:l:1:f:8:cf:2\ncell:P13:l:1:f:8:cf:2\ncell:Q13:l:1:f:8:cf:2\ncell:R13:l:1:f:8:cf:2\ncell:S13:l:1:f:8:cf:2\ncell:B14:b::1:::l:1:f:8:cf:2\ncell:C14:t:Interest Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D14:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E14:vtf:t::IF( (D14*12)=0,"",(D14*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F14:l:1:f:8:cf:2\ncell:G14:b::1:::l:1:f:8:cf:2\ncell:H14:t:Fedral Withholding Taxes:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I14:l:1:f:8:cf:2\ncell:J14:l:1:f:8:cf:2\ncell:K14:b::1::1:l:4:f:7:cf:3:ntvf:1\ncell:L14:b::::1:l:1:f:8:cf:2\ncell:M14:l:1:f:8:cf:2\ncell:N14:l:1:f:8:cf:2\ncell:O14:l:1:f:8:cf:2\ncell:P14:l:1:f:8:cf:2\ncell:Q14:l:1:f:8:cf:2\ncell:R14:l:1:f:8:cf:2\ncell:S14:l:1:f:8:cf:2\ncell:B15:b::1:::l:1:f:8:cf:2\ncell:C15:t:Investment Income:b::1::1:l:5:f:7:cf:2\ncell:D15:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E15:vtf:t::IF( (D15*12)=0,"",(D15*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F15:l:1:f:8:cf:2\ncell:G15:b::1:::l:1:f:8:cf:2\ncell:H15:t:State Withholding Taxes:b::1::1:l:5:f:7:bg:6:cf:2:colspan:3\ncell:I15:l:1:f:8:bg:6:cf:2\ncell:J15:l:1:f:8:bg:6:cf:2\ncell:K15:b::1::1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:L15:b::::1:l:1:f:8:cf:2\ncell:M15:l:1:f:8:cf:2\ncell:N15:l:1:f:8:cf:2\ncell:O15:l:1:f:8:cf:2\ncell:P15:l:1:f:8:cf:2\ncell:Q15:l:1:f:8:cf:2\ncell:R15:l:1:f:8:cf:2\ncell:S15:l:1:f:8:cf:2\ncell:B16:b::1:::l:1:f:8:cf:2\ncell:C16:t:Rental Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D16:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E16:vtf:t::IF( (D16*12)=0,"",(D16*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F16:b:1::::l:1:f:8:cf:2\ncell:G16:b:1:1:::l:1:f:8:cf:2\ncell:H16:t:Social Security:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I16:l:1:f:8:cf:2\ncell:J16:l:1:f:8:cf:2\ncell:K16:b::1::1:l:4:f:7:cf:3:ntvf:1\ncell:L16:b::::1:l:1:f:8:cf:2\ncell:M16:l:1:f:8:cf:2\ncell:N16:l:1:f:8:cf:2\ncell:O16:l:1:f:8:cf:2\ncell:P16:l:1:f:8:cf:2\ncell:Q16:l:1:f:8:cf:2\ncell:R16:l:1:f:8:cf:2\ncell:S16:l:1:f:8:cf:2\ncell:B17:b::1:::l:1:f:8:cf:2\ncell:C17:t:Pension Income:b::1::1:l:5:f:7:cf:2\ncell:D17:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E17:vtf:t::IF( (D17*12)=0,"",(D17*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F17:l:1:f:8:cf:2\ncell:G17:b::1:::l:1:f:8:cf:2\ncell:H17:t:Reteriment Account:b::1::1:l:5:f:7:bg:6:cf:2:colspan:3\ncell:I17:l:1:f:8:bg:6:cf:2\ncell:J17:l:1:f:8:bg:6:cf:2\ncell:K17:v:900:b::1::1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:L17:b::::1:l:1:f:8:cf:2\ncell:M17:l:1:f:8:cf:2\ncell:N17:l:1:f:8:cf:2\ncell:O17:l:1:f:8:cf:2\ncell:P17:l:1:f:8:cf:2\ncell:Q17:l:1:f:8:cf:2\ncell:R17:l:1:f:8:cf:2\ncell:S17:l:1:f:8:cf:2\ncell:B18:b::1:::l:1:f:8:cf:2\ncell:C18:t:Social Security Income:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D18:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E18:b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F18:l:1:f:8:cf:2\ncell:G18:b::1:::l:1:f:8:cf:2\ncell:H18:t:Other Deductions:b::1::1:l:5:f:7:cf:2:colspan:3\ncell:I18:b:::1::l:1:f:8:cf:2\ncell:J18:b:::1::l:1:f:8:cf:2\ncell:K18:b::1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:L18:b::::1:l:1:f:8:cf:2\ncell:M18:l:1:f:8:cf:2\ncell:N18:l:1:f:8:cf:2\ncell:O18:l:1:f:8:cf:2\ncell:P18:l:1:f:8:cf:2\ncell:Q18:l:1:f:8:cf:2\ncell:R18:l:1:f:8:cf:2\ncell:S18:l:1:f:8:cf:2\ncell:B19:b::1:::l:1:f:8:cf:2\ncell:C19:t:Alimony:b::1::1:l:5:f:7:cf:2\ncell:D19:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E19:vtf:t::IF( (D19*12)=0,"",(D19*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F19:l:1:f:8:cf:2\ncell:G19:l:1:f:8:cf:2\ncell:H19:t:Total:l:3:f:2:c:7:bg:3:cf:1:colspan:3\ncell:I19:l:1:f:8:c:7:bg:3:cf:2\ncell:J19:l:1:f:8:c:7:bg:3:cf:2\ncell:K19:vtf:n:900:SUM(K13\\cK18):l:4:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:L19:b:::1::l:1:f:8:cf:2\ncell:M19:l:1:f:8:cf:2\ncell:N19:l:1:f:8:cf:2\ncell:O19:l:1:f:8:cf:2\ncell:P19:l:1:f:8:cf:2\ncell:Q19:l:1:f:8:cf:2\ncell:R19:l:1:f:8:cf:2\ncell:S19:l:1:f:8:cf:2\ncell:B20:b::1:::l:1:f:8:cf:2\ncell:C20:t:Child Support:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D20:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E20:vtf:t::IF( (D20*12)=0,"",(D20*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F20:l:1:f:8:cf:2\ncell:G20:l:1:f:8:cf:2\ncell:H20:l:1:f:8:cf:2\ncell:I20:l:1:f:8:cf:2\ncell:J20:l:1:f:8:cf:2\ncell:K20:l:1:f:8:cf:2\ncell:L20:b:1:1:::l:1:f:8:cf:2\ncell:M20:b::::1:l:1:f:8:cf:2\ncell:N20:l:1:f:8:cf:2\ncell:O20:l:1:f:8:cf:2\ncell:P20:l:1:f:8:cf:2\ncell:Q20:l:1:f:8:cf:2\ncell:R20:l:1:f:8:cf:2\ncell:S20:l:1:f:8:cf:2\ncell:B21:b::1:::l:1:f:8:cf:2\ncell:C21:t:Other Income:b::1::1:l:5:f:7:cf:2\ncell:D21:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:E21:vtf:t::IF( (D21*12)=0,"",(D21*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:F21:l:1:f:8:cf:2\ncell:G21:l:1:f:8:cf:2\ncell:H21:l:1:f:8:cf:2\ncell:I21:l:1:f:8:cf:2\ncell:J21:l:3:f:2:cf:1\ncell:K21:l:1:f:8:cf:2\ncell:L21:b::1:1::l:1:f:8:cf:2\ncell:M21:b::::1:l:1:f:8:cf:2\ncell:N21:l:1:f:8:cf:2\ncell:O21:l:1:f:8:cf:2\ncell:P21:l:1:f:8:cf:2\ncell:Q21:l:1:f:8:cf:2\ncell:R21:l:1:f:8:cf:2\ncell:S21:l:1:f:8:cf:2\ncell:B22:b::1:::l:1:f:8:cf:2\ncell:C22:t:Deduction:b::1::1:l:5:f:7:bg:6:cf:2\ncell:D22:vtf:n:900:K19:b:1:1:1:1:l:4:f:7:bg:6:cf:3:ntvf:1\ncell:E22:vtf:n:10800:IF( (D22*12)=0,"",(D22*12)):b::1:::l:4:f:7:bg:6:cf:3:ntvf:1\ncell:F22:b:1::::l:1:f:8:cf:2\ncell:G22:b:1::::l:1:f:8:cf:2\ncell:H22:b:1::::l:1:f:8:cf:2\ncell:I22:b:1::::l:1:f:8:cf:2\ncell:J22:b:1::::l:1:f:8:cf:2\ncell:K22:b:1::::l:1:f:8:cf:2\ncell:L22:l:1:f:8:cf:2\ncell:M22:l:1:f:8:cf:2\ncell:N22:l:1:f:8:cf:2\ncell:O22:l:1:f:8:cf:2\ncell:P22:l:1:f:8:cf:2\ncell:Q22:l:1:f:8:cf:2\ncell:R22:l:1:f:8:cf:2\ncell:S22:l:1:f:8:cf:2\ncell:B23:l:1:f:8:cf:2\ncell:C23:t:Total Take Home Income:l:3:f:2:c:7:bg:3:cf:1\ncell:D23:vtf:n:37112:(SUM(D9\\cD21)-D22):l:3:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:E23:vtf:n:445344:IF( (D23*12)=0,"",(D23*12)):l:3:f:2:c:7:bg:3:cf:3:ntvf:1\ncell:F23:l:1:f:8:cf:2\ncell:G23:l:1:f:8:cf:2\ncell:H23:l:1:f:8:cf:2\ncell:I23:l:1:f:8:cf:2\ncell:J23:l:1:f:8:cf:2\ncell:K23:l:1:f:8:cf:2\ncell:L23:l:1:f:8:cf:2\ncell:M23:l:1:f:8:cf:2\ncell:N23:l:1:f:8:cf:2\ncell:O23:l:1:f:8:cf:2\ncell:P23:l:1:f:8:cf:2\ncell:Q23:l:1:f:8:cf:2\ncell:R23:l:1:f:8:cf:2\ncell:S23:l:1:f:8:cf:2\ncell:B24:l:1:f:8:cf:2\ncell:F24:l:1:f:8:cf:2\ncell:G24:l:1:f:8:cf:2\ncell:H24:l:1:f:8:cf:2\ncell:I24:l:1:f:8:cf:2\ncell:J24:l:1:f:8:cf:2\ncell:K24:l:1:f:8:cf:2\ncell:L24:l:1:f:8:cf:2\ncell:M24:l:1:f:8:cf:2\ncell:N24:l:1:f:8:cf:2\ncell:O24:l:1:f:8:cf:2\ncell:P24:l:1:f:8:cf:2\ncell:Q24:l:1:f:8:cf:2\ncell:R24:l:1:f:8:cf:2\ncell:S24:l:1:f:8:cf:2\ncell:A25:l:1:f:10:cf:2\ncell:B25:l:1:f:6:cf:2\ncell:C25:l:1:f:11:cf:2\ncell:D25:l:1:f:11:cf:2\ncell:E25:l:1:f:8:cf:2\ncell:F25:l:1:f:8:cf:2\ncell:G25:l:1:f:8:cf:2\ncell:H25:l:1:f:8:cf:2\ncell:I25:l:1:f:8:cf:2\ncell:J25:l:1:f:8:cf:2\ncell:K25:l:1:f:8:cf:2\ncell:L25:l:1:f:8:cf:2\ncell:M25:l:1:f:8:cf:2\ncell:N25:l:1:f:8:cf:2\ncell:O25:l:1:f:8:cf:2\ncell:P25:l:1:f:8:cf:2\ncell:Q25:l:1:f:8:cf:2\ncell:R25:l:1:f:8:cf:2\ncell:S25:l:1:f:8:cf:2\ncell:A26:l:1:f:10:cf:2\ncell:B26:l:1:f:6:cf:2\ncell:C26:l:1:f:6:cf:2\ncell:D26:l:1:f:11:cf:2\ncell:E26:l:1:f:11:cf:2\ncell:F26:l:1:f:11:cf:2\ncell:G26:l:1:f:11:cf:2\ncell:H26:l:1:f:8:cf:2\ncell:I26:l:1:f:8:cf:2\ncell:J26:l:1:f:8:cf:2\ncell:K26:l:1:f:8:cf:2\ncell:L26:l:1:f:8:cf:2\ncell:M26:l:1:f:8:cf:2\ncell:N26:l:1:f:8:cf:2\ncell:O26:l:1:f:8:cf:2\ncell:P26:l:1:f:8:cf:2\ncell:Q26:l:1:f:8:cf:2\ncell:R26:l:1:f:8:cf:2\ncell:S26:l:1:f:8:cf:2\ncell:L27:l:1:f:8:cf:2\ncell:M27:l:1:f:8:cf:2\ncell:N27:l:1:f:8:cf:2\ncell:O27:l:1:f:8:cf:2\ncell:P27:l:1:f:8:cf:2\ncell:Q27:l:1:f:8:cf:2\ncell:R27:l:1:f:8:cf:2\ncell:S27:l:1:f:8:cf:2\ncell:L28:l:1:f:8:cf:2\ncell:M28:l:1:f:8:cf:2\ncell:N28:l:1:f:8:cf:2\ncell:O28:l:1:f:8:cf:2\ncell:P28:l:1:f:8:cf:2\ncell:Q28:l:1:f:8:cf:2\ncell:R28:l:1:f:8:cf:2\ncell:S28:l:1:f:8:cf:2\ncell:L29:l:1:f:8:cf:2\ncell:M29:l:1:f:8:cf:2\ncell:N29:l:1:f:8:cf:2\ncell:O29:l:1:f:8:cf:2\ncell:P29:l:1:f:8:cf:2\ncell:Q29:l:1:f:8:cf:2\ncell:R29:l:1:f:8:cf:2\ncell:S29:l:1:f:8:cf:2\ncell:L30:l:1:f:8:cf:2\ncell:M30:l:1:f:8:cf:2\ncell:N30:l:1:f:8:cf:2\ncell:O30:l:1:f:8:cf:2\ncell:P30:l:1:f:8:cf:2\ncell:Q30:l:1:f:8:cf:2\ncell:R30:l:1:f:8:cf:2\ncell:S30:l:1:f:8:cf:2\ncell:L31:l:1:f:8:cf:2\ncell:M31:l:1:f:8:cf:2\ncell:N31:l:1:f:8:cf:2\ncell:L32:l:1:f:8:cf:2\ncell:M32:l:1:f:8:cf:2\ncell:N32:l:1:f:8:cf:2\ncell:L33:l:1:f:8:cf:2\ncell:M33:l:1:f:8:cf:2\ncell:N33:l:1:f:8:cf:2\ncell:L34:l:1:f:8:cf:2\ncell:M34:l:1:f:8:cf:2\ncell:N34:l:1:f:8:cf:2\ncell:L35:l:1:f:8:cf:2\ncell:M35:l:1:f:8:cf:2\ncell:N35:l:1:f:8:cf:2\ncell:L36:l:1:f:8:cf:2\ncell:M36:l:1:f:8:cf:2\ncell:N36:l:1:f:8:cf:2\ncell:L37:l:1:f:8:cf:2\ncell:M37:l:1:f:8:cf:2\ncell:N37:l:1:f:8:cf:2\ncell:L38:l:1:f:8:cf:2\ncell:M38:l:1:f:8:cf:2\ncell:N38:l:1:f:8:cf:2\ncell:L39:l:1:f:8:cf:2\ncell:M39:l:1:f:8:cf:2\ncell:N39:l:1:f:8:cf:2\ncell:L40:l:1:f:8:cf:2\ncell:M40:l:1:f:8:cf:2\ncell:N40:l:1:f:8:cf:2\ncell:L41:l:1:f:8:cf:2\ncell:M41:l:1:f:8:cf:2\ncell:N41:l:1:f:8:cf:2\ncell:L42:l:1:f:8:cf:2\ncell:M42:l:1:f:8:cf:2\ncell:N42:l:1:f:8:cf:2\ncell:L43:l:1:f:8:cf:2\ncell:M43:l:1:f:8:cf:2\ncell:N43:l:1:f:8:cf:2\ncell:L44:l:1:f:8:cf:2\ncell:M44:l:1:f:8:cf:2\ncell:N44:l:1:f:8:cf:2\ncell:O44:l:1:f:8:cf:2\ncell:P44:l:1:f:8:cf:2\ncell:Q44:l:1:f:8:cf:2\ncell:R44:l:1:f:8:cf:2\ncell:S44:l:1:f:8:cf:2\ncell:L45:l:1:f:8:cf:2\ncell:M45:l:1:f:8:cf:2\ncell:N45:l:1:f:8:cf:2\ncell:O45:l:1:f:8:cf:2\ncell:P45:l:1:f:8:cf:2\ncell:Q45:l:1:f:8:cf:2\ncell:R45:l:1:f:8:cf:2\ncell:S45:l:1:f:8:cf:2\ncell:L46:l:1:f:8:cf:2\ncell:M46:l:1:f:8:cf:2\ncell:N46:l:1:f:8:cf:2\ncell:O46:l:1:f:8:cf:2\ncell:P46:l:1:f:8:cf:2\ncell:Q46:l:1:f:8:cf:2\ncell:R46:l:1:f:8:cf:2\ncell:S46:l:1:f:8:cf:2\ncell:L47:l:1:f:8:cf:2\ncell:M47:l:1:f:8:cf:2\ncell:N47:l:1:f:8:cf:2\ncell:O47:l:1:f:8:cf:2\ncell:P47:l:1:f:8:cf:2\ncell:Q47:l:1:f:8:cf:2\ncell:R47:l:1:f:8:cf:2\ncell:S47:l:1:f:8:cf:2\ncell:L48:l:1:f:8:cf:2\ncell:M48:l:1:f:8:cf:2\ncell:N48:l:1:f:8:cf:2\ncell:O48:l:1:f:8:cf:2\ncell:P48:l:1:f:8:cf:2\ncell:Q48:l:1:f:8:cf:2\ncell:R48:l:1:f:8:cf:2\ncell:S48:l:1:f:8:cf:2\ncell:L49:l:1:f:8:cf:2\ncell:M49:l:1:f:8:cf:2\ncell:N49:l:1:f:8:cf:2\ncell:O49:l:1:f:8:cf:2\ncell:P49:l:1:f:8:cf:2\ncell:Q49:l:1:f:8:cf:2\ncell:R49:l:1:f:8:cf:2\ncell:S49:l:1:f:8:cf:2\ncell:L50:l:1:f:8:cf:2\ncell:M50:l:1:f:8:cf:2\ncell:N50:l:1:f:8:cf:2\ncell:O50:l:1:f:8:cf:2\ncell:P50:l:1:f:8:cf:2\ncell:Q50:l:1:f:8:cf:2\ncell:R50:l:1:f:8:cf:2\ncell:S50:l:1:f:8:cf:2\ncell:L51:l:1:f:8:cf:2\ncell:M51:l:1:f:8:cf:2\ncell:N51:l:1:f:8:cf:2\ncell:O51:l:1:f:8:cf:2\ncell:P51:l:1:f:8:cf:2\ncell:Q51:l:1:f:8:cf:2\ncell:R51:l:1:f:8:cf:2\ncell:S51:l:1:f:8:cf:2\ncell:L52:l:1:f:8:cf:2\ncell:M52:l:1:f:8:cf:2\ncell:N52:l:1:f:8:cf:2\ncell:O52:l:1:f:8:cf:2\ncell:P52:l:1:f:8:cf:2\ncell:Q52:l:1:f:8:cf:2\ncell:R52:l:1:f:8:cf:2\ncell:S52:l:1:f:8:cf:2\ncell:L53:l:1:f:8:cf:2\ncell:M53:l:1:f:8:cf:2\ncell:N53:l:1:f:8:cf:2\ncell:O53:l:1:f:8:cf:2\ncell:P53:l:1:f:8:cf:2\ncell:Q53:l:1:f:8:cf:2\ncell:R53:l:1:f:8:cf:2\ncell:S53:l:1:f:8:cf:2\ncell:L54:l:1:f:8:cf:2\ncell:M54:l:1:f:8:cf:2\ncell:N54:l:1:f:8:cf:2\ncell:O54:l:1:f:8:cf:2\ncell:P54:l:1:f:8:cf:2\ncell:Q54:l:1:f:8:cf:2\ncell:R54:l:1:f:8:cf:2\ncell:S54:l:1:f:8:cf:2\ncell:L55:l:1:f:8:cf:2\ncell:M55:l:1:f:8:cf:2\ncell:N55:l:1:f:8:cf:2\ncell:O55:l:1:f:8:cf:2\ncell:P55:l:1:f:8:cf:2\ncell:Q55:l:1:f:8:cf:2\ncell:R55:l:1:f:8:cf:2\ncell:S55:l:1:f:8:cf:2\ncell:L56:l:1:f:8:cf:2\ncell:M56:l:1:f:8:cf:2\ncell:N56:l:1:f:8:cf:2\ncell:O56:l:1:f:8:cf:2\ncell:P56:l:1:f:8:cf:2\ncell:Q56:l:1:f:8:cf:2\ncell:R56:l:1:f:8:cf:2\ncell:S56:l:1:f:8:cf:2\ncell:L57:l:1:f:8:cf:2\ncell:M57:l:1:f:8:cf:2\ncell:N57:l:1:f:8:cf:2\ncell:O57:l:1:f:8:cf:2\ncell:P57:l:1:f:8:cf:2\ncell:Q57:l:1:f:8:cf:2\ncell:R57:l:1:f:8:cf:2\ncell:S57:l:1:f:8:cf:2\ncell:L58:l:1:f:8:cf:2\ncell:M58:l:1:f:8:cf:2\ncell:N58:l:1:f:8:cf:2\ncell:O58:l:1:f:8:cf:2\ncell:P58:l:1:f:8:cf:2\ncell:Q58:l:1:f:8:cf:2\ncell:R58:l:1:f:8:cf:2\ncell:S58:l:1:f:8:cf:2\ncell:L59:l:1:f:8:cf:2\ncell:M59:l:1:f:8:cf:2\ncell:N59:l:1:f:8:cf:2\ncell:O59:l:1:f:8:cf:2\ncell:P59:l:1:f:8:cf:2\ncell:Q59:l:1:f:8:cf:2\ncell:R59:l:1:f:8:cf:2\ncell:S59:l:1:f:8:cf:2\ncell:L60:l:1:f:8:cf:2\ncell:M60:l:1:f:8:cf:2\ncell:N60:l:1:f:8:cf:2\ncell:O60:l:1:f:8:cf:2\ncell:P60:l:1:f:8:cf:2\ncell:Q60:l:1:f:8:cf:2\ncell:R60:l:1:f:8:cf:2\ncell:S60:l:1:f:8:cf:2\ncell:L61:l:1:f:8:cf:2\ncell:M61:l:1:f:8:cf:2\ncell:N61:l:1:f:8:cf:2\ncell:O61:l:1:f:8:cf:2\ncell:P61:l:1:f:8:cf:2\ncell:Q61:l:1:f:8:cf:2\ncell:R61:l:1:f:8:cf:2\ncell:S61:l:1:f:8:cf:2\ncell:L62:l:1:f:8:cf:2\ncell:M62:l:1:f:8:cf:2\ncell:N62:l:1:f:8:cf:2\ncell:O62:l:1:f:8:cf:2\ncell:P62:l:1:f:8:cf:2\ncell:Q62:l:1:f:8:cf:2\ncell:R62:l:1:f:8:cf:2\ncell:S62:l:1:f:8:cf:2\ncell:L63:l:1:f:8:cf:2\ncell:M63:l:1:f:8:cf:2\ncell:N63:l:1:f:8:cf:2\ncell:O63:l:1:f:8:cf:2\ncell:P63:l:1:f:8:cf:2\ncell:Q63:l:1:f:8:cf:2\ncell:R63:l:1:f:8:cf:2\ncell:S63:l:1:f:8:cf:2\ncell:L64:l:1:f:8:cf:2\ncell:M64:l:1:f:8:cf:2\ncell:N64:l:1:f:8:cf:2\ncell:O64:l:1:f:8:cf:2\ncell:P64:l:1:f:8:cf:2\ncell:Q64:l:1:f:8:cf:2\ncell:R64:l:1:f:8:cf:2\ncell:S64:l:1:f:8:cf:2\ncell:L65:l:1:f:8:cf:2\ncell:M65:l:1:f:8:cf:2\ncell:N65:l:1:f:8:cf:2\ncell:O65:l:1:f:8:cf:2\ncell:P65:l:1:f:8:cf:2\ncell:Q65:l:1:f:8:cf:2\ncell:R65:l:1:f:8:cf:2\ncell:S65:l:1:f:8:cf:2\ncell:L66:l:1:f:8:cf:2\ncell:M66:l:1:f:8:cf:2\ncell:N66:l:1:f:8:cf:2\ncell:O66:l:1:f:8:cf:2\ncell:P66:l:1:f:8:cf:2\ncell:Q66:l:1:f:8:cf:2\ncell:R66:l:1:f:8:cf:2\ncell:S66:l:1:f:8:cf:2\ncell:L67:l:1:f:8:cf:2\ncell:M67:l:1:f:8:cf:2\ncell:N67:l:1:f:8:cf:2\ncell:O67:l:1:f:8:cf:2\ncell:P67:l:1:f:8:cf:2\ncell:Q67:l:1:f:8:cf:2\ncell:R67:l:1:f:8:cf:2\ncell:S67:l:1:f:8:cf:2\ncell:L68:l:1:f:8:cf:2\ncell:M68:l:1:f:8:cf:2\ncell:N68:l:1:f:8:cf:2\ncell:O68:l:1:f:8:cf:2\ncell:P68:l:1:f:8:cf:2\ncell:Q68:l:1:f:8:cf:2\ncell:R68:l:1:f:8:cf:2\ncell:S68:l:1:f:8:cf:2\ncell:L69:l:1:f:8:cf:2\ncell:M69:l:1:f:8:cf:2\ncell:N69:l:1:f:8:cf:2\ncell:O69:l:1:f:8:cf:2\ncell:P69:l:1:f:8:cf:2\ncell:Q69:l:1:f:8:cf:2\ncell:R69:l:1:f:8:cf:2\ncell:S69:l:1:f:8:cf:2\ncell:L70:l:1:f:8:cf:2\ncell:M70:l:1:f:8:cf:2\ncell:N70:l:1:f:8:cf:2\ncell:O70:l:1:f:8:cf:2\ncell:P70:l:1:f:8:cf:2\ncell:Q70:l:1:f:8:cf:2\ncell:R70:l:1:f:8:cf:2\ncell:S70:l:1:f:8:cf:2\ncell:L71:l:1:f:8:cf:2\ncell:M71:l:1:f:8:cf:2\ncell:N71:l:1:f:8:cf:2\ncell:O71:l:1:f:8:cf:2\ncell:P71:l:1:f:8:cf:2\ncell:Q71:l:1:f:8:cf:2\ncell:R71:l:1:f:8:cf:2\ncell:S71:l:1:f:8:cf:2\ncell:L72:l:1:f:8:cf:2\ncell:M72:l:1:f:8:cf:2\ncell:N72:l:1:f:8:cf:2\ncell:O72:l:1:f:8:cf:2\ncell:P72:l:1:f:8:cf:2\ncell:Q72:l:1:f:8:cf:2\ncell:R72:l:1:f:8:cf:2\ncell:S72:l:1:f:8:cf:2\ncell:L73:l:1:f:8:cf:2\ncell:M73:l:1:f:8:cf:2\ncell:N73:l:1:f:8:cf:2\ncell:O73:l:1:f:8:cf:2\ncell:P73:l:1:f:8:cf:2\ncell:Q73:l:1:f:8:cf:2\ncell:R73:l:1:f:8:cf:2\ncell:S73:l:1:f:8:cf:2\ncell:L74:l:1:f:8:cf:2\ncell:M74:l:1:f:8:cf:2\ncell:N74:l:1:f:8:cf:2\ncell:O74:l:1:f:8:cf:2\ncell:P74:l:1:f:8:cf:2\ncell:Q74:l:1:f:8:cf:2\ncell:R74:l:1:f:8:cf:2\ncell:S74:l:1:f:8:cf:2\ncell:L75:l:1:f:8:cf:2\ncell:M75:l:1:f:8:cf:2\ncell:N75:l:1:f:8:cf:2\ncell:O75:l:1:f:8:cf:2\ncell:P75:l:1:f:8:cf:2\ncell:Q75:l:1:f:8:cf:2\ncell:R75:l:1:f:8:cf:2\ncell:S75:l:1:f:8:cf:2\ncell:L76:l:1:f:8:cf:2\ncell:M76:l:1:f:8:cf:2\ncell:N76:l:1:f:8:cf:2\ncell:O76:l:1:f:8:cf:2\ncell:P76:l:1:f:8:cf:2\ncell:Q76:l:1:f:8:cf:2\ncell:R76:l:1:f:8:cf:2\ncell:S76:l:1:f:8:cf:2\ncell:L77:l:1:f:8:cf:2\ncell:M77:l:1:f:8:cf:2\ncell:N77:l:1:f:8:cf:2\ncell:O77:l:1:f:8:cf:2\ncell:P77:l:1:f:8:cf:2\ncell:Q77:l:1:f:8:cf:2\ncell:R77:l:1:f:8:cf:2\ncell:S77:l:1:f:8:cf:2\ncell:L78:l:1:f:8:cf:2\ncell:M78:l:1:f:8:cf:2\ncell:N78:l:1:f:8:cf:2\ncell:O78:l:1:f:8:cf:2\ncell:P78:l:1:f:8:cf:2\ncell:Q78:l:1:f:8:cf:2\ncell:R78:l:1:f:8:cf:2\ncell:S78:l:1:f:8:cf:2\ncell:L79:l:1:f:8:cf:2\ncell:M79:l:1:f:8:cf:2\ncell:N79:l:1:f:8:cf:2\ncell:O79:l:1:f:8:cf:2\ncell:P79:l:1:f:8:cf:2\ncell:Q79:l:1:f:8:cf:2\ncell:R79:l:1:f:8:cf:2\ncell:S79:l:1:f:8:cf:2\ncell:L80:l:1:f:8:cf:2\ncell:M80:l:1:f:8:cf:2\ncell:N80:l:1:f:8:cf:2\ncell:O80:l:1:f:8:cf:2\ncell:P80:l:1:f:8:cf:2\ncell:Q80:l:1:f:8:cf:2\ncell:R80:l:1:f:8:cf:2\ncell:S80:l:1:f:8:cf:2\ncell:L81:l:1:f:8:cf:2\ncell:M81:l:1:f:8:cf:2\ncell:N81:l:1:f:8:cf:2\ncell:O81:l:1:f:8:cf:2\ncell:P81:l:1:f:8:cf:2\ncell:Q81:l:1:f:8:cf:2\ncell:R81:l:1:f:8:cf:2\ncell:S81:l:1:f:8:cf:2\ncell:L82:l:1:f:8:cf:2\ncell:M82:l:1:f:8:cf:2\ncell:N82:l:1:f:8:cf:2\ncell:O82:l:1:f:8:cf:2\ncell:P82:l:1:f:8:cf:2\ncell:Q82:l:1:f:8:cf:2\ncell:R82:l:1:f:8:cf:2\ncell:S82:l:1:f:8:cf:2\ncell:L83:l:1:f:8:cf:2\ncell:M83:l:1:f:8:cf:2\ncell:N83:l:1:f:8:cf:2\ncell:O83:l:1:f:8:cf:2\ncell:P83:l:1:f:8:cf:2\ncell:Q83:l:1:f:8:cf:2\ncell:R83:l:1:f:8:cf:2\ncell:S83:l:1:f:8:cf:2\ncell:L84:l:1:f:8:cf:2\ncell:M84:l:1:f:8:cf:2\ncell:N84:l:1:f:8:cf:2\ncell:O84:l:1:f:8:cf:2\ncell:P84:l:1:f:8:cf:2\ncell:Q84:l:1:f:8:cf:2\ncell:R84:l:1:f:8:cf:2\ncell:S84:l:1:f:8:cf:2\ncell:L85:l:1:f:8:cf:2\ncell:M85:l:1:f:8:cf:2\ncell:N85:l:1:f:8:cf:2\ncell:O85:l:1:f:8:cf:2\ncell:P85:l:1:f:8:cf:2\ncell:Q85:l:1:f:8:cf:2\ncell:R85:l:1:f:8:cf:2\ncell:S85:l:1:f:8:cf:2\ncell:L86:l:1:f:8:cf:2\ncell:M86:l:1:f:8:cf:2\ncell:N86:l:1:f:8:cf:2\ncell:O86:l:1:f:8:cf:2\ncell:P86:l:1:f:8:cf:2\ncell:Q86:l:1:f:8:cf:2\ncell:R86:l:1:f:8:cf:2\ncell:S86:l:1:f:8:cf:2\ncell:L87:l:1:f:8:cf:2\ncell:M87:l:1:f:8:cf:2\ncell:N87:l:1:f:8:cf:2\ncell:O87:l:1:f:8:cf:2\ncell:P87:l:1:f:8:cf:2\ncell:Q87:l:1:f:8:cf:2\ncell:R87:l:1:f:8:cf:2\ncell:S87:l:1:f:8:cf:2\ncell:L88:l:1:f:8:cf:2\ncell:M88:l:1:f:8:cf:2\ncell:N88:l:1:f:8:cf:2\ncell:O88:l:1:f:8:cf:2\ncell:P88:l:1:f:8:cf:2\ncell:Q88:l:1:f:8:cf:2\ncell:R88:l:1:f:8:cf:2\ncell:S88:l:1:f:8:cf:2\ncell:L89:l:1:f:8:cf:2\ncell:M89:l:1:f:8:cf:2\ncell:N89:l:1:f:8:cf:2\ncell:O89:l:1:f:8:cf:2\ncell:P89:l:1:f:8:cf:2\ncell:Q89:l:1:f:8:cf:2\ncell:R89:l:1:f:8:cf:2\ncell:S89:l:1:f:8:cf:2\ncell:L90:l:1:f:8:cf:2\ncell:M90:l:1:f:8:cf:2\ncell:N90:l:1:f:8:cf:2\ncell:O90:l:1:f:8:cf:2\ncell:P90:l:1:f:8:cf:2\ncell:Q90:l:1:f:8:cf:2\ncell:R90:l:1:f:8:cf:2\ncell:S90:l:1:f:8:cf:2\ncell:L91:l:1:f:8:cf:2\ncell:M91:l:1:f:8:cf:2\ncell:N91:l:1:f:8:cf:2\ncell:O91:l:1:f:8:cf:2\ncell:P91:l:1:f:8:cf:2\ncell:Q91:l:1:f:8:cf:2\ncell:R91:l:1:f:8:cf:2\ncell:S91:l:1:f:8:cf:2\ncell:L92:l:1:f:8:cf:2\ncell:M92:l:1:f:8:cf:2\ncell:N92:l:1:f:8:cf:2\ncell:O92:l:1:f:8:cf:2\ncell:P92:l:1:f:8:cf:2\ncell:Q92:l:1:f:8:cf:2\ncell:R92:l:1:f:8:cf:2\ncell:S92:l:1:f:8:cf:2\ncell:L93:l:1:f:8:cf:2\ncell:M93:l:1:f:8:cf:2\ncell:N93:l:1:f:8:cf:2\ncell:O93:l:1:f:8:cf:2\ncell:P93:l:1:f:8:cf:2\ncell:Q93:l:1:f:8:cf:2\ncell:R93:l:1:f:8:cf:2\ncell:S93:l:1:f:8:cf:2\ncell:L94:l:1:f:8:cf:2\ncell:M94:l:1:f:8:cf:2\ncell:N94:l:1:f:8:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:S94:l:1:f:8:cf:2\ncell:L95:l:1:f:8:cf:2\ncell:M95:l:1:f:8:cf:2\ncell:N95:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:S95:l:1:f:8:cf:2\ncell:L96:l:1:f:10:cf:2\ncell:M96:l:1:f:10:cf:2\ncell:N96:l:1:f:10:cf:2\ncell:O96:l:1:f:10:cf:2\ncell:P96:l:1:f:10:cf:2\ncell:Q96:l:1:f:10:cf:2\ncell:R96:l:1:f:10:cf:2\ncell:S96:l:1:f:10:cf:2\ncell:L97:l:1:f:10:cf:2\ncell:M97:l:1:f:10:cf:2\ncell:N97:l:1:f:10:cf:2\ncell:O97:l:1:f:10:cf:2\ncell:P97:l:1:f:10:cf:2\ncell:Q97:l:1:f:10:cf:2\ncell:R97:l:1:f:10:cf:2\ncell:S97:l:1:f:10:cf:2\ncell:L98:l:1:f:10:cf:2\ncell:M98:l:1:f:10:cf:2\ncell:N98:l:1:f:10:cf:2\ncell:O98:l:1:f:10:cf:2\ncell:P98:l:1:f:10:cf:2\ncell:Q98:l:1:f:10:cf:2\ncell:R98:l:1:f:10:cf:2\ncell:S98:l:1:f:10:cf:2\ncell:L99:l:1:f:10:cf:2\ncell:M99:l:1:f:10:cf:2\ncell:N99:l:1:f:10:cf:2\ncell:O99:l:1:f:10:cf:2\ncell:P99:l:1:f:10:cf:2\ncell:Q99:l:1:f:10:cf:2\ncell:R99:l:1:f:10:cf:2\ncell:S99:l:1:f:10:cf:2\ncell:A100:l:1:f:10:cf:2\ncell:B100:l:1:f:10:cf:2\ncell:K100:l:1:f:10:cf:2\ncell:L100:l:1:f:10:cf:2\ncell:M100:l:1:f:10:cf:2\ncell:N100:l:1:f:10:cf:2\ncell:O100:l:1:f:10:cf:2\ncell:P100:l:1:f:10:cf:2\ncell:Q100:l:1:f:10:cf:2\ncell:R100:l:1:f:10:cf:2\ncell:S100:l:1:f:10:cf:2\ncell:A101:l:1:f:10:cf:2\ncell:B101:l:1:f:10:cf:2\ncell:K101:l:1:f:10:cf:2\ncell:L101:l:1:f:10:cf:2\ncell:M101:l:1:f:10:cf:2\ncell:N101:l:1:f:10:cf:2\ncell:O101:l:1:f:10:cf:2\ncell:P101:l:1:f:10:cf:2\ncell:Q101:l:1:f:10:cf:2\ncell:R101:l:1:f:10:cf:2\ncell:S101:l:1:f:10:cf:2\ncell:A102:l:1:f:10:cf:2\ncell:B102:l:1:f:10:cf:2\ncell:K102:l:1:f:10:cf:2\ncell:L102:l:1:f:10:cf:2\ncell:M102:l:1:f:10:cf:2\ncell:N102:l:1:f:10:cf:2\ncell:O102:l:1:f:10:cf:2\ncell:P102:l:1:f:10:cf:2\ncell:Q102:l:1:f:10:cf:2\ncell:R102:l:1:f:10:cf:2\ncell:S102:l:1:f:10:cf:2\ncell:A103:l:1:f:10:cf:2\ncell:B103:l:1:f:10:cf:2\ncell:K103:l:1:f:10:cf:2\ncell:L103:l:1:f:10:cf:2\ncell:M103:l:1:f:10:cf:2\ncell:N103:l:1:f:10:cf:2\ncell:O103:l:1:f:10:cf:2\ncell:P103:l:1:f:10:cf:2\ncell:Q103:l:1:f:10:cf:2\ncell:R103:l:1:f:10:cf:2\ncell:S103:l:1:f:10:cf:2\ncell:A104:l:1:f:10:cf:2\ncell:B104:l:1:f:10:cf:2\ncell:K104:l:1:f:10:cf:2\ncell:L104:l:1:f:10:cf:2\ncell:M104:l:1:f:10:cf:2\ncell:N104:l:1:f:10:cf:2\ncell:O104:l:1:f:10:cf:2\ncell:P104:l:1:f:10:cf:2\ncell:Q104:l:1:f:10:cf:2\ncell:R104:l:1:f:10:cf:2\ncell:S104:l:1:f:10:cf:2\ncell:A105:l:1:f:10:cf:2\ncell:B105:l:1:f:10:cf:2\ncell:K105:l:1:f:10:cf:2\ncell:L105:l:1:f:10:cf:2\ncell:M105:l:1:f:10:cf:2\ncell:N105:l:1:f:10:cf:2\ncell:O105:l:1:f:10:cf:2\ncell:P105:l:1:f:10:cf:2\ncell:Q105:l:1:f:10:cf:2\ncell:R105:l:1:f:10:cf:2\ncell:S105:l:1:f:10:cf:2\ncell:A106:l:1:f:10:cf:2\ncell:B106:l:1:f:10:cf:2\ncell:K106:l:1:f:10:cf:2\ncell:L106:l:1:f:10:cf:2\ncell:M106:l:1:f:10:cf:2\ncell:N106:l:1:f:10:cf:2\ncell:O106:l:1:f:10:cf:2\ncell:P106:l:1:f:10:cf:2\ncell:Q106:l:1:f:10:cf:2\ncell:R106:l:1:f:10:cf:2\ncell:S106:l:1:f:10:cf:2\ncell:A107:l:1:f:10:cf:2\ncell:B107:l:1:f:10:cf:2\ncell:K107:l:1:f:10:cf:2\ncell:L107:l:1:f:10:cf:2\ncell:M107:l:1:f:10:cf:2\ncell:N107:l:1:f:10:cf:2\ncell:O107:l:1:f:10:cf:2\ncell:P107:l:1:f:10:cf:2\ncell:Q107:l:1:f:10:cf:2\ncell:R107:l:1:f:10:cf:2\ncell:S107:l:1:f:10:cf:2\ncell:A108:l:1:f:10:cf:2\ncell:B108:l:1:f:10:cf:2\ncell:K108:l:1:f:10:cf:2\ncell:L108:l:1:f:10:cf:2\ncell:M108:l:1:f:10:cf:2\ncell:N108:l:1:f:10:cf:2\ncell:O108:l:1:f:10:cf:2\ncell:P108:l:1:f:10:cf:2\ncell:Q108:l:1:f:10:cf:2\ncell:R108:l:1:f:10:cf:2\ncell:S108:l:1:f:10:cf:2\ncell:A109:l:1:f:10:cf:2\ncell:B109:l:1:f:10:cf:2\ncell:K109:l:1:f:10:cf:2\ncell:L109:l:1:f:10:cf:2\ncell:M109:l:1:f:10:cf:2\ncell:N109:l:1:f:10:cf:2\ncell:O109:l:1:f:10:cf:2\ncell:P109:l:1:f:10:cf:2\ncell:Q109:l:1:f:10:cf:2\ncell:R109:l:1:f:10:cf:2\ncell:S109:l:1:f:10:cf:2\ncell:A110:l:1:f:10:cf:2\ncell:B110:l:1:f:10:cf:2\ncell:K110:l:1:f:10:cf:2\ncell:L110:l:1:f:10:cf:2\ncell:M110:l:1:f:10:cf:2\ncell:N110:l:1:f:10:cf:2\ncell:O110:l:1:f:10:cf:2\ncell:P110:l:1:f:10:cf:2\ncell:Q110:l:1:f:10:cf:2\ncell:R110:l:1:f:10:cf:2\ncell:S110:l:1:f:10:cf:2\ncell:A111:l:1:f:10:cf:2\ncell:B111:l:1:f:10:cf:2\ncell:K111:l:1:f:10:cf:2\ncell:L111:l:1:f:10:cf:2\ncell:M111:l:1:f:10:cf:2\ncell:N111:l:1:f:10:cf:2\ncell:O111:l:1:f:10:cf:2\ncell:P111:l:1:f:10:cf:2\ncell:Q111:l:1:f:10:cf:2\ncell:R111:l:1:f:10:cf:2\ncell:S111:l:1:f:10:cf:2\ncol:A:w:10\ncol:B:w:10\ncol:C:w:164\ncol:D:w:90\ncol:E:w:90\ncol:F:w:10\ncol:G:w:10\ncol:H:w:50\ncol:I:w:12\ncol:J:w:95\ncol:K:w:91\ncol:L:w:11\ncol:M:w:64\ncol:N:w:64\ncol:O:w:64\ncol:P:w:64\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:V:w:64\ncol:W:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:30\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:18.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:15\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nsheet:c:23:r:111:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,204)\ncolor:3:rgb(119,136,221)\ncolor:4:rgb(136,204,119)\ncolor:5:rgb(204,119,136)\ncolor:6:rgb(230,230,250)\ncolor:7:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 24pt Arial\nfont:6:normal bold 9pt Arial\nfont:7:normal normal * Arial\nfont:8:normal normal 10pt Arial\nfont:9:normal normal 12pt Arial\nfont:10:normal normal 7pt Arial\nfont:11:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:6px * 6px *;vertical-align:bottom;\nlayout:4:padding:6px * 6px 8px;vertical-align:bottom;\nlayout:5:padding:6px 4px 6px 12px;vertical-align:bottom;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\nname:COMPARISON::O37\\cQ51\nname:TRACKING::Y37\\cAA51\n', - }, - name: "income", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:8:cf:2:ntvf:2\ncell:B1:l:1:f:8:cf:2\ncell:C1:l:1:f:8:cf:2\ncell:D1:l:1:f:8:cf:2\ncell:E1:l:1:f:8:cf:2\ncell:F1:l:1:f:8:cf:2\ncell:G1:l:1:f:8:cf:2\ncell:H1:l:1:f:8:cf:2\ncell:I1:l:1:f:8:cf:2\ncell:J1:l:1:f:8:cf:2\ncell:K1:l:1:f:8:cf:2\ncell:L1:l:1:f:8:cf:2\ncell:M1:l:1:f:8:cf:2\ncell:N1:l:1:f:8:cf:2\ncell:O1:l:1:f:8:cf:2\ncell:P1:l:1:f:8:cf:2\ncell:Q1:l:1:f:8:cf:2\ncell:R1:l:1:f:8:cf:2\ncell:S1:l:1:f:8:cf:2\ncell:T1:l:1:f:8:cf:2\ncell:U1:l:1:f:8:cf:2\ncell:V1:l:1:f:8:cf:2\ncell:W1:l:1:f:8:cf:2\ncell:A2:l:1:f:8:cf:2\ncell:B2:l:1:f:8:cf:2\ncell:C2:l:1:f:8:cf:2\ncell:D2:l:1:f:8:cf:2\ncell:E2:l:1:f:8:cf:2\ncell:F2:l:1:f:8:cf:2\ncell:G2:l:1:f:8:cf:2\ncell:H2:l:1:f:8:cf:2\ncell:I2:l:1:f:8:cf:2\ncell:J2:l:1:f:8:cf:2\ncell:K2:l:1:f:8:cf:2\ncell:L2:l:1:f:8:cf:2\ncell:M2:l:1:f:8:cf:2\ncell:N2:l:1:f:8:cf:2\ncell:O2:l:1:f:8:cf:2\ncell:P2:l:1:f:8:cf:2\ncell:Q2:l:1:f:8:cf:2\ncell:R2:l:1:f:8:cf:2\ncell:S2:l:1:f:8:cf:2\ncell:T2:l:1:f:8:cf:2\ncell:U2:l:1:f:8:cf:2\ncell:V2:l:1:f:8:cf:2\ncell:W2:l:1:f:8:cf:2\ncell:A3:l:1:f:8:cf:2\ncell:B3:l:1:f:8:cf:2\ncell:C3:l:1:f:8:cf:2\ncell:D3:l:1:f:8:cf:2\ncell:G3:l:1:f:8:cf:2\ncell:H3:l:1:f:8:cf:2\ncell:I3:l:1:f:8:cf:2\ncell:J3:l:1:f:8:cf:2\ncell:K3:l:1:f:8:cf:2\ncell:L3:l:1:f:8:cf:2\ncell:M3:l:1:f:8:cf:2\ncell:N3:l:1:f:8:cf:2\ncell:O3:l:1:f:8:cf:2\ncell:P3:l:1:f:8:cf:2\ncell:Q3:t: :l:1:f:8:cf:2\ncell:R3:l:1:f:8:cf:2\ncell:S3:l:1:f:8:cf:2\ncell:T3:l:1:f:8:cf:2\ncell:U3:l:1:f:8:cf:2\ncell:V3:l:1:f:8:cf:2\ncell:W3:l:1:f:8:cf:2\ncell:B4:t:Expenses:l:2:f:4:c:1:bg:5:cf:2:colspan:3\ncell:C4:l:2:f:5:c:1:bg:5:cf:2\ncell:E4:t:Date:l:1:f:9:cf:1\ncell:F4:vtf:ndt:41131.96254792824:NOW():l:1:f:9:bg:4:cf:3:ntvf:3\ncell:O4:l:1:f:8:cf:2\ncell:P4:l:1:f:8:cf:2\ncell:Q4:l:1:f:8:cf:2\ncell:R4:l:1:f:8:cf:2\ncell:S4:l:1:f:8:cf:2\ncell:T4:l:1:f:8:cf:2\ncell:U4:l:1:f:8:cf:2\ncell:V4:l:1:f:8:cf:2\ncell:W4:l:1:f:8:cf:2\ncell:O5:t::l:2:f:8:cf:2\ncell:P5:t::l:2:f:8:cf:2\ncell:Q5:t::l:2:f:8:cf:2\ncell:R5:t::l:2:f:8:cf:2\ncell:S5:t::l:2:f:8:cf:2\ncell:T5:l:1:f:8:cf:2\ncell:U5:l:1:f:8:cf:2\ncell:V5:l:1:f:8:cf:2\ncell:W5:l:1:f:8:cf:2\ncell:B6:l:2:f:3:cf:2:colspan:3\ncell:C6:l:2:f:3:bg:4:cf:2\ncell:D6:t:Source:l:2:f:2:bg:4:cf:1\ncell:E6:t:Monthly Budget:b:2:2:2:2:l:2:f:2:c:5:bg:3:cf:1\ncell:F6:t:Yearly Budget:b:2:2:2:2:l:2:f:2:c:5:bg:2:cf:1\ncell:O6:t::l:2:f:3:cf:2\ncell:P6:t::l:2:f:8:cf:2\ncell:Q6:t::l:2:f:8:cf:2\ncell:R6:t::l:2:f:8:cf:2\ncell:S6:l:1:f:8:cf:2\ncell:T6:l:1:f:8:cf:2\ncell:U6:l:1:f:8:cf:2\ncell:V6:l:1:f:8:cf:2\ncell:W6:l:1:f:8:cf:2\ncell:B7:t:Housing:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:2:colspan:3\ncell:C7:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:2\ncell:D7:b:2:2:2:2:l:3:f:2:c:5:bg:2:cf:1\ncell:E7:vtf:n:1380:E8+E14+E21+E24:b:2:2:2:2:l:4:f:2:c:5:bg:2:ntvf:1\ncell:F7:vtf:n:16560:IF( (E7*12)=0,"",(E7*12)):b:2:2:2:2:l:4:f:2:c:5:bg:2:ntvf:1\ncell:G7:b::::1\ncell:O7:l:2:f:3:cf:2\ncell:P7:l:2:f:8:cf:2\ncell:Q7:l:2:f:8:cf:2\ncell:R7:l:2:f:8:cf:2\ncell:S7:l:1:f:8:cf:2\ncell:T7:l:1:f:8:cf:2\ncell:U7:l:1:f:8:cf:2\ncell:V7:l:1:f:8:cf:2\ncell:W7:l:1:f:8:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:c:1:bg:6\ncell:C8:t:Home:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D8:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E8:vtf:n:818:SUM(E9\\cE13):b::1:1:1:l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F8:vtf:n:9816:IF( (E8*12)=0,"",(E8*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:8:cf:2\ncell:P8:l:1:f:8:cf:2\ncell:Q8:l:1:f:8:cf:2\ncell:R8:l:1:f:8:cf:2\ncell:S8:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:T8:t::l:1:f:8:cf:2\ncell:U8:l:1:f:8:cf:2\ncell:V8:l:1:f:8:cf:2\ncell:W8:l:1:f:8:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:8:cf:2\ncell:C9:l:3:f:8:cf:2\ncell:D9:t:Mortgage/Rent:l:3:f:7:cf:2\ncell:E9:v:818:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F9:vtf:n:9816:IF( (E9*12)=0,"",(E9*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:t::l:1:f:8:cf:2\ncell:P9:t::l:1:f:8:cf:2\ncell:Q9:t::l:1:f:8:cf:2\ncell:R9:l:1:f:8:cf:2\ncell:S9:l:1:f:8:cf:2:colspan:2:rowspan:1\ncell:T9:t::l:1:f:8:cf:2\ncell:U9:l:1:f:8:cf:2\ncell:V9:l:1:f:8:cf:2\ncell:W9:l:1:f:8:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:8:bg:4:cf:2\ncell:C10:l:3:f:8:bg:4:cf:2\ncell:D10:t:Property Tax:l:3:f:7:bg:4:cf:2\ncell:E10:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:8:cf:2\ncell:P10:l:1:f:8:cf:2\ncell:Q10:l:1:f:8:cf:2\ncell:R10:l:1:f:8:cf:2\ncell:S10:l:1:f:8:cf:2\ncell:T10:l:1:f:8:cf:2\ncell:U10:l:1:f:8:cf:2\ncell:V10:l:1:f:8:cf:2\ncell:W10:l:1:f:8:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:8:cf:2\ncell:C11:l:3:f:8:cf:2\ncell:D11:t:Insurance:l:3:f:7:cf:2\ncell:E11:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:8:cf:2\ncell:P11:l:1:f:8:cf:2\ncell:Q11:l:1:f:8:cf:2\ncell:R11:l:1:f:8:cf:2\ncell:S11:l:1:f:8:cf:2\ncell:T11:l:1:f:8:cf:2\ncell:U11:l:1:f:8:cf:2\ncell:V11:l:1:f:8:cf:2\ncell:W11:l:1:f:8:cf:2\ncell:A12:b::1::\ncell:B12:b::::1:l:3:f:8:bg:4:cf:2\ncell:C12:l:3:f:8:bg:4:cf:2\ncell:D12:t:Maintenance:l:3:f:7:bg:4:cf:2\ncell:E12:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F12:vtf:t::IF( (E12*12)=0,"",(E12*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G12:b::::1\ncell:O12:l:2:f:3:cf:2\ncell:P12:l:1:f:8:cf:2\ncell:Q12:l:1:f:8:cf:2\ncell:R12:l:1:f:8:cf:2\ncell:S12:l:1:f:8:cf:2\ncell:T12:l:1:f:8:cf:2\ncell:U12:l:1:f:8:cf:2\ncell:V12:l:1:f:8:cf:2\ncell:W12:l:1:f:8:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:8:cf:2\ncell:C13:l:3:f:8:cf:2\ncell:D13:t:Other:b::1:::l:3:f:7:cf:2\ncell:E13:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F13:vtf:t::IF( (E13*12)=0,"",(E13*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:8:cf:2\ncell:P13:l:1:f:8:cf:2\ncell:Q13:l:1:f:8:cf:2\ncell:R13:l:1:f:8:cf:2\ncell:S13:l:1:f:8:cf:2\ncell:T13:l:1:f:8:cf:2\ncell:U13:l:1:f:8:cf:2\ncell:V13:l:1:f:8:cf:2\ncell:W13:l:1:f:8:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:c:1:bg:6\ncell:C14:t:Utilities:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D14:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E14:vtf:n:305:SUM(E15\\cE20):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F14:vtf:n:3660:IF( (E14*12)=0,"",(E14*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:8:cf:2\ncell:P14:l:1:f:8:cf:2\ncell:Q14:l:1:f:8:cf:2\ncell:R14:l:1:f:8:cf:2\ncell:S14:l:1:f:8:cf:2\ncell:T14:l:1:f:8:cf:2\ncell:U14:l:1:f:8:cf:2\ncell:V14:l:1:f:8:cf:2\ncell:W14:l:1:f:8:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:8:cf:2\ncell:C15:l:3:f:8:cf:2\ncell:D15:t:Gas, Electricity, Oil:l:3:f:7:cf:2\ncell:E15:v:305:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F15:vtf:n:3660:IF( (E15*12)=0,"",(E15*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:8:cf:2\ncell:P15:l:1:f:8:cf:2\ncell:Q15:l:1:f:8:cf:2\ncell:R15:l:1:f:8:cf:2\ncell:S15:l:1:f:8:cf:2\ncell:T15:l:1:f:8:cf:2\ncell:U15:l:1:f:8:cf:2\ncell:V15:l:1:f:8:cf:2\ncell:W15:l:1:f:8:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:8:bg:4:cf:2\ncell:C16:l:3:f:8:bg:4:cf:2\ncell:D16:t:Water, Sewer, Garbage & Other:l:3:f:7:bg:4:cf:2\ncell:E16:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:8:cf:2\ncell:P16:l:1:f:8:cf:2\ncell:Q16:l:1:f:8:cf:2\ncell:R16:l:1:f:8:cf:2\ncell:S16:l:1:f:8:cf:2\ncell:T16:l:1:f:8:cf:2\ncell:U16:l:1:f:8:cf:2\ncell:V16:l:1:f:8:cf:2\ncell:W16:l:1:f:8:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:8:cf:2\ncell:C17:l:3:f:8:cf:2\ncell:D17:t:TV - Cable, Dish, Other:l:3:f:7:cf:2\ncell:E17:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:8:cf:2\ncell:P17:l:1:f:8:cf:2\ncell:Q17:l:1:f:8:cf:2\ncell:R17:l:1:f:8:cf:2\ncell:S17:l:1:f:8:cf:2\ncell:T17:l:1:f:8:cf:2\ncell:U17:l:1:f:8:cf:2\ncell:V17:l:1:f:8:cf:2\ncell:W17:l:1:f:8:cf:2\ncell:A18:b::1::\ncell:B18:b::::1:l:3:f:8:bg:4:cf:2\ncell:C18:l:3:f:8:bg:4:cf:2\ncell:D18:t:Phone:l:3:f:7:bg:4:cf:2\ncell:E18:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F18:vtf:t::IF( (E18*12)=0,"",(E18*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G18:b::::1\ncell:O18:l:1:f:8:cf:2\ncell:P18:l:1:f:8:cf:2\ncell:Q18:l:1:f:8:cf:2\ncell:R18:l:1:f:8:cf:2\ncell:S18:l:1:f:8:cf:2\ncell:T18:l:1:f:8:cf:2\ncell:U18:l:1:f:8:cf:2\ncell:V18:l:1:f:8:cf:2\ncell:W18:l:1:f:8:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:8:cf:2\ncell:C19:l:3:f:8:cf:2\ncell:D19:t:Internet:l:3:f:7:cf:2\ncell:E19:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F19:vtf:t::IF( (E19*12)=0,"",(E19*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:8:cf:2\ncell:P19:l:1:f:8:cf:2\ncell:Q19:l:1:f:8:cf:2\ncell:R19:l:1:f:8:cf:2\ncell:S19:l:1:f:8:cf:2\ncell:T19:l:1:f:8:cf:2\ncell:U19:l:1:f:8:cf:2\ncell:V19:l:1:f:8:cf:2\ncell:W19:l:1:f:8:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:8:bg:4:cf:2\ncell:C20:l:3:f:8:bg:4:cf:2\ncell:D20:t:Other:l:3:f:7:bg:4:cf:2\ncell:E20:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:8:cf:2\ncell:P20:l:1:f:8:cf:2\ncell:Q20:l:1:f:8:cf:2\ncell:R20:l:1:f:8:cf:2\ncell:S20:l:1:f:8:cf:2\ncell:T20:l:1:f:8:cf:2\ncell:U20:l:1:f:8:cf:2\ncell:V20:l:1:f:8:cf:2\ncell:W20:l:1:f:8:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:c:1:bg:6\ncell:C21:t:Personal Services:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D21:t::b::1:1::l:3:f:7:c:1:bg:6:cf:2\ncell:E21:vtf:n:84:SUM(E22\\cE23):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F21:vtf:n:1008:IF( (E21*12)=0,"",(E21*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:8:cf:2\ncell:P21:l:1:f:8:cf:2\ncell:Q21:l:1:f:8:cf:2\ncell:R21:l:1:f:8:cf:2\ncell:S21:l:1:f:8:cf:2\ncell:T21:l:1:f:8:cf:2\ncell:U21:l:1:f:8:cf:2\ncell:V21:l:1:f:8:cf:2\ncell:W21:l:1:f:8:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:8:cf:2\ncell:C22:l:3:f:8:cf:2\ncell:D22:t:Childcare:l:3:f:7:cf:2\ncell:E22:v:84:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F22:vtf:n:1008:IF( (E22*12)=0,"",(E22*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G22:b::::1\ncell:O22:l:1:f:8:cf:2\ncell:P22:l:1:f:8:cf:2\ncell:Q22:l:1:f:8:cf:2\ncell:R22:l:1:f:8:cf:2\ncell:S22:l:1:f:8:cf:2\ncell:T22:l:1:f:8:cf:2\ncell:U22:l:1:f:8:cf:2\ncell:V22:l:1:f:8:cf:2\ncell:W22:l:1:f:8:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:8:bg:4:cf:2\ncell:C23:l:3:f:8:bg:4:cf:2\ncell:D23:t:Elderly Care & Other:l:3:f:7:bg:4:cf:2\ncell:E23:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:8:cf:2\ncell:P23:l:1:f:8:cf:2\ncell:Q23:l:1:f:8:cf:2\ncell:R23:l:1:f:8:cf:2\ncell:S23:l:1:f:8:cf:2\ncell:T23:l:1:f:8:cf:2\ncell:U23:l:1:f:8:cf:2\ncell:V23:l:1:f:8:cf:2\ncell:W23:l:1:f:8:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:c:1:bg:6\ncell:C24:t:Other Household Expenses:l:3:f:7:c:1:bg:6:cf:2:colspan:2\ncell:D24:t::b::1:1::l:3:f:2:c:1:bg:6:cf:2\ncell:E24:vtf:n:173:SUM(E25\\cE31):b:::1::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:F24:vtf:n:2076:IF( (E24*12)=0,"",(E24*12)):b::1:::l:4:f:7:c:1:bg:6:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:8:cf:2\ncell:P24:l:1:f:8:cf:2\ncell:Q24:l:1:f:8:cf:2\ncell:R24:l:1:f:8:cf:2\ncell:S24:l:1:f:8:cf:2\ncell:T24:l:1:f:8:cf:2\ncell:U24:l:1:f:8:cf:2\ncell:V24:l:1:f:8:cf:2\ncell:W24:l:1:f:8:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:8:cf:2\ncell:C25:l:3:f:8:cf:2\ncell:D25:t:Gardening & Lawncare:l:3:f:7:cf:2\ncell:E25:v:173:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F25:vtf:n:2076:IF( (E25*12)=0,"",(E25*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G25:b::::1\ncell:O25:l:1:f:8:cf:2\ncell:P25:l:1:f:8:cf:2\ncell:Q25:l:1:f:8:cf:2\ncell:R25:l:1:f:8:cf:2\ncell:S25:l:1:f:8:cf:2\ncell:T25:l:1:f:8:cf:2\ncell:U25:l:1:f:8:cf:2\ncell:V25:l:1:f:8:cf:2\ncell:W25:l:1:f:8:cf:2\ncell:A26:b::1::\ncell:B26:b::::1:l:3:f:8:bg:4:cf:2\ncell:C26:l:3:f:8:bg:4:cf:2\ncell:D26:t:Laundry & Cleaning:l:3:f:7:bg:4:cf:2\ncell:E26:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F26:vtf:t::IF( (E26*12)=0,"",(E26*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G26:b::::1\ncell:O26:l:1:f:8:cf:2\ncell:P26:l:1:f:8:cf:2\ncell:Q26:l:1:f:8:cf:2\ncell:R26:l:1:f:8:cf:2\ncell:S26:l:1:f:8:cf:2\ncell:T26:l:1:f:8:cf:2\ncell:U26:l:1:f:8:cf:2\ncell:V26:l:1:f:8:cf:2\ncell:W26:l:1:f:8:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:8:cf:2\ncell:C27:l:3:f:8:cf:2\ncell:D27:t:Household Supplies:l:3:f:7:cf:2\ncell:E27:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F27:vtf:t::IF( (E27*12)=0,"",(E27*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:8:cf:2\ncell:P27:l:1:f:8:cf:2\ncell:Q27:l:1:f:8:cf:2\ncell:R27:l:1:f:8:cf:2\ncell:S27:l:1:f:8:cf:2\ncell:T27:l:1:f:8:cf:2\ncell:U27:l:1:f:8:cf:2\ncell:V27:l:1:f:8:cf:2\ncell:W27:l:1:f:8:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:8:bg:4:cf:2\ncell:C28:l:3:f:8:bg:4:cf:2\ncell:D28:t:Furniture:l:3:f:7:bg:4:cf:2\ncell:E28:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:8:cf:2\ncell:P28:l:1:f:8:cf:2\ncell:Q28:l:1:f:8:cf:2\ncell:R28:l:1:f:8:cf:2\ncell:S28:l:1:f:8:cf:2\ncell:T28:l:1:f:8:cf:2\ncell:U28:l:1:f:8:cf:2\ncell:V28:l:1:f:8:cf:2\ncell:W28:l:1:f:8:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:8:cf:2\ncell:C29:l:3:f:8:cf:2\ncell:D29:t:Appliances & Equipment:l:3:f:7:cf:2\ncell:E29:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1:::l:4:f:7:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:8:cf:2\ncell:P29:l:1:f:8:cf:2\ncell:Q29:l:1:f:8:cf:2\ncell:R29:l:1:f:8:cf:2\ncell:S29:l:1:f:8:cf:2\ncell:T29:l:1:f:8:cf:2\ncell:U29:l:1:f:8:cf:2\ncell:V29:l:1:f:8:cf:2\ncell:W29:l:1:f:8:cf:2\ncell:A30:b::1::\ncell:B30:b::::1:l:3:f:8:bg:4:cf:2\ncell:C30:l:3:f:8:bg:4:cf:2\ncell:D30:t:Security Services:l:3:f:7:bg:4:cf:2\ncell:E30:b:1:1:1:1:l:4:f:7:bg:4:cf:3:ntvf:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1:::l:4:f:7:bg:4:cf:3:ntvf:1\ncell:G30:b::::1\ncell:O30:l:1:f:8:cf:2\ncell:P30:l:1:f:8:cf:2\ncell:Q30:l:1:f:8:cf:2\ncell:R30:l:1:f:8:cf:2\ncell:S30:l:1:f:8:cf:2\ncell:T30:l:1:f:8:cf:2\ncell:U30:l:1:f:8:cf:2\ncell:V30:l:1:f:8:cf:2\ncell:W30:l:1:f:8:cf:2\ncell:A31:b::1::\ncell:B31:b:::1:1:l:3:f:8:cf:2\ncell:C31:b:::1::l:3:f:8:cf:2\ncell:D31:t:Other:b:::1::l:3:f:7:cf:2\ncell:E31:b:1:1:1:1:l:4:f:7:cf:3:ntvf:1\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b::1:1::l:4:f:7:cf:3:ntvf:1\ncell:G31:b::::1\ncell:O31:l:1:f:8:cf:2\ncell:P31:l:1:f:8:cf:2\ncell:Q31:l:1:f:8:cf:2\ncell:R31:l:1:f:8:cf:2\ncell:S31:l:1:f:8:cf:2\ncell:T31:l:1:f:8:cf:2\ncell:U31:l:1:f:8:cf:2\ncell:V31:l:1:f:8:cf:2\ncell:W31:l:1:f:8:cf:2\ncell:B32:b:1:::\ncell:C32:b:1:::\ncell:D32:b:1:::\ncell:E32:b:1:::\ncell:F32:b:1:::\ncell:O32:l:1:f:8:cf:2\ncell:P32:l:1:f:8:cf:2\ncell:Q32:l:1:f:8:cf:2\ncell:R32:l:1:f:8:cf:2\ncell:S32:l:1:f:8:cf:2\ncell:T32:l:1:f:8:cf:2\ncell:U32:l:1:f:8:cf:2\ncell:V32:l:1:f:8:cf:2\ncell:W32:l:1:f:8:cf:2\ncell:O33:l:1:f:8:cf:2\ncell:P33:l:1:f:8:cf:2\ncell:Q33:l:1:f:8:cf:2\ncell:R33:l:1:f:8:cf:2\ncell:S33:l:1:f:8:cf:2\ncell:T33:l:1:f:8:cf:2\ncell:U33:l:1:f:8:cf:2\ncell:V33:l:1:f:8:cf:2\ncell:W33:l:1:f:8:cf:2\ncell:O34:l:1:f:8:cf:2\ncell:P34:l:1:f:8:cf:2\ncell:Q34:l:1:f:8:cf:2\ncell:R34:l:1:f:8:cf:2\ncell:S34:l:1:f:8:cf:2\ncell:T34:l:1:f:8:cf:2\ncell:U34:l:1:f:8:cf:2\ncell:V34:l:1:f:8:cf:2\ncell:W34:l:1:f:8:cf:2\ncell:O35:l:1:f:8:cf:2\ncell:P35:l:1:f:8:cf:2\ncell:Q35:l:1:f:8:cf:2\ncell:R35:l:1:f:8:cf:2\ncell:S35:l:1:f:8:cf:2\ncell:T35:l:1:f:8:cf:2\ncell:U35:l:1:f:8:cf:2\ncell:V35:l:1:f:8:cf:2\ncell:W35:l:1:f:8:cf:2\ncell:O36:l:1:f:8:cf:2\ncell:P36:l:1:f:8:cf:2\ncell:Q36:l:1:f:8:cf:2\ncell:R36:l:1:f:8:cf:2\ncell:S36:l:1:f:8:cf:2\ncell:T36:l:1:f:8:cf:2\ncell:U36:l:1:f:8:cf:2\ncell:V36:l:1:f:8:cf:2\ncell:W36:l:1:f:8:cf:2\ncell:O37:l:1:f:8:cf:2\ncell:P37:l:1:f:8:cf:2\ncell:Q37:l:1:f:8:cf:2\ncell:R37:l:1:f:8:cf:2\ncell:S37:l:1:f:8:cf:2\ncell:T37:l:1:f:8:cf:2\ncell:U37:l:1:f:8:cf:2\ncell:V37:l:1:f:8:cf:2\ncell:W37:l:1:f:8:cf:2\ncell:O38:l:1:f:8:cf:2\ncell:P38:l:1:f:8:cf:2\ncell:Q38:l:1:f:8:cf:2\ncell:R38:l:1:f:8:cf:2\ncell:S38:l:1:f:8:cf:2\ncell:T38:l:1:f:8:cf:2\ncell:U38:l:1:f:8:cf:2\ncell:V38:l:1:f:8:cf:2\ncell:W38:l:1:f:8:cf:2\ncell:O39:l:1:f:8:cf:2\ncell:P39:l:1:f:8:cf:2\ncell:Q39:l:1:f:8:cf:2\ncell:R39:l:1:f:8:cf:2\ncell:S39:l:1:f:8:cf:2\ncell:T39:l:1:f:8:cf:2\ncell:U39:l:1:f:8:cf:2\ncell:V39:l:1:f:8:cf:2\ncell:W39:l:1:f:8:cf:2\ncell:O40:l:1:f:8:cf:2\ncell:P40:l:1:f:8:cf:2\ncell:Q40:l:1:f:8:cf:2\ncell:R40:l:1:f:8:cf:2\ncell:S40:l:1:f:8:cf:2\ncell:T40:l:1:f:8:cf:2\ncell:U40:l:1:f:8:cf:2\ncell:V40:l:1:f:8:cf:2\ncell:W40:l:1:f:8:cf:2\ncell:O41:l:1:f:8:cf:2\ncell:P41:l:1:f:8:cf:2\ncell:Q41:l:1:f:8:cf:2\ncell:R41:l:1:f:8:cf:2\ncell:S41:l:1:f:8:cf:2\ncell:T41:l:1:f:8:cf:2\ncell:U41:l:1:f:8:cf:2\ncell:V41:l:1:f:8:cf:2\ncell:W41:l:1:f:8:cf:2\ncell:O42:l:1:f:8:cf:2\ncell:P42:l:1:f:8:cf:2\ncell:Q42:l:1:f:8:cf:2\ncell:R42:l:1:f:8:cf:2\ncell:S42:l:1:f:8:cf:2\ncell:T42:l:1:f:8:cf:2\ncell:U42:l:1:f:8:cf:2\ncell:V42:l:1:f:8:cf:2\ncell:W42:l:1:f:8:cf:2\ncell:O43:l:1:f:8:cf:2\ncell:P43:l:1:f:8:cf:2\ncell:Q43:l:1:f:8:cf:2\ncell:R43:l:1:f:8:cf:2\ncell:S43:l:1:f:8:cf:2\ncell:T43:l:1:f:8:cf:2\ncell:U43:l:1:f:8:cf:2\ncell:V43:l:1:f:8:cf:2\ncell:W43:l:1:f:8:cf:2\ncell:O44:l:1:f:8:cf:2\ncell:P44:l:1:f:8:cf:2\ncell:Q44:l:1:f:8:cf:2\ncell:R44:l:1:f:8:cf:2\ncell:S44:l:1:f:8:cf:2\ncell:T44:l:1:f:8:cf:2\ncell:U44:l:1:f:8:cf:2\ncell:V44:l:1:f:8:cf:2\ncell:W44:l:1:f:8:cf:2\ncell:O45:l:1:f:8:cf:2\ncell:P45:l:1:f:8:cf:2\ncell:Q45:l:1:f:8:cf:2\ncell:R45:l:1:f:8:cf:2\ncell:S45:l:1:f:8:cf:2\ncell:T45:l:1:f:8:cf:2\ncell:U45:l:1:f:8:cf:2\ncell:V45:l:1:f:8:cf:2\ncell:W45:l:1:f:8:cf:2\ncell:O46:l:1:f:8:cf:2\ncell:P46:l:1:f:8:cf:2\ncell:Q46:l:1:f:8:cf:2\ncell:R46:l:1:f:8:cf:2\ncell:S46:l:1:f:8:cf:2\ncell:T46:l:1:f:8:cf:2\ncell:U46:l:1:f:8:cf:2\ncell:V46:l:1:f:8:cf:2\ncell:W46:l:1:f:8:cf:2\ncell:O47:l:1:f:8:cf:2\ncell:P47:l:1:f:8:cf:2\ncell:Q47:l:1:f:8:cf:2\ncell:R47:l:1:f:8:cf:2\ncell:S47:l:1:f:8:cf:2\ncell:T47:l:1:f:8:cf:2\ncell:U47:l:1:f:8:cf:2\ncell:V47:l:1:f:8:cf:2\ncell:W47:l:1:f:8:cf:2\ncell:O48:l:1:f:8:cf:2\ncell:P48:l:1:f:8:cf:2\ncell:Q48:l:1:f:8:cf:2\ncell:R48:l:1:f:8:cf:2\ncell:S48:l:1:f:8:cf:2\ncell:T48:l:1:f:8:cf:2\ncell:U48:l:1:f:8:cf:2\ncell:V48:l:1:f:8:cf:2\ncell:W48:l:1:f:8:cf:2\ncell:O49:l:1:f:8:cf:2\ncell:P49:l:1:f:8:cf:2\ncell:Q49:l:1:f:8:cf:2\ncell:R49:l:1:f:8:cf:2\ncell:S49:l:1:f:8:cf:2\ncell:T49:l:1:f:8:cf:2\ncell:U49:l:1:f:8:cf:2\ncell:V49:l:1:f:8:cf:2\ncell:W49:l:1:f:8:cf:2\ncell:O50:l:1:f:8:cf:2\ncell:P50:l:1:f:8:cf:2\ncell:Q50:l:1:f:8:cf:2\ncell:R50:l:1:f:8:cf:2\ncell:S50:l:1:f:8:cf:2\ncell:T50:l:1:f:8:cf:2\ncell:U50:l:1:f:8:cf:2\ncell:V50:l:1:f:8:cf:2\ncell:W50:l:1:f:8:cf:2\ncell:O51:l:1:f:8:cf:2\ncell:P51:l:1:f:8:cf:2\ncell:Q51:l:1:f:8:cf:2\ncell:R51:l:1:f:8:cf:2\ncell:S51:l:1:f:8:cf:2\ncell:T51:l:1:f:8:cf:2\ncell:U51:l:1:f:8:cf:2\ncell:V51:l:1:f:8:cf:2\ncell:W51:l:1:f:8:cf:2\ncell:O52:l:1:f:8:cf:2\ncell:P52:l:1:f:8:cf:2\ncell:Q52:l:1:f:8:cf:2\ncell:R52:l:1:f:8:cf:2\ncell:S52:l:1:f:8:cf:2\ncell:T52:l:1:f:8:cf:2\ncell:U52:l:1:f:8:cf:2\ncell:V52:l:1:f:8:cf:2\ncell:W52:l:1:f:8:cf:2\ncell:O53:l:1:f:8:cf:2\ncell:P53:l:1:f:8:cf:2\ncell:Q53:l:1:f:8:cf:2\ncell:R53:l:1:f:8:cf:2\ncell:S53:l:1:f:8:cf:2\ncell:T53:l:1:f:8:cf:2\ncell:U53:l:1:f:8:cf:2\ncell:V53:l:1:f:8:cf:2\ncell:W53:l:1:f:8:cf:2\ncell:O54:l:1:f:8:cf:2\ncell:P54:l:1:f:8:cf:2\ncell:Q54:l:1:f:8:cf:2\ncell:R54:l:1:f:8:cf:2\ncell:S54:l:1:f:8:cf:2\ncell:T54:l:1:f:8:cf:2\ncell:U54:l:1:f:8:cf:2\ncell:V54:l:1:f:8:cf:2\ncell:W54:l:1:f:8:cf:2\ncell:O55:l:1:f:8:cf:2\ncell:P55:l:1:f:8:cf:2\ncell:Q55:l:1:f:8:cf:2\ncell:R55:l:1:f:8:cf:2\ncell:S55:l:1:f:8:cf:2\ncell:T55:l:1:f:8:cf:2\ncell:U55:l:1:f:8:cf:2\ncell:V55:l:1:f:8:cf:2\ncell:W55:l:1:f:8:cf:2\ncell:O56:l:1:f:8:cf:2\ncell:P56:l:1:f:8:cf:2\ncell:Q56:l:1:f:8:cf:2\ncell:R56:l:1:f:8:cf:2\ncell:S56:l:1:f:8:cf:2\ncell:T56:l:1:f:8:cf:2\ncell:U56:l:1:f:8:cf:2\ncell:V56:l:1:f:8:cf:2\ncell:W56:l:1:f:8:cf:2\ncell:O57:l:1:f:8:cf:2\ncell:P57:l:1:f:8:cf:2\ncell:Q57:l:1:f:8:cf:2\ncell:R57:l:1:f:8:cf:2\ncell:S57:l:1:f:8:cf:2\ncell:T57:l:1:f:8:cf:2\ncell:U57:l:1:f:8:cf:2\ncell:V57:l:1:f:8:cf:2\ncell:W57:l:1:f:8:cf:2\ncell:O58:l:1:f:8:cf:2\ncell:P58:l:1:f:8:cf:2\ncell:Q58:l:1:f:8:cf:2\ncell:R58:l:1:f:8:cf:2\ncell:S58:l:1:f:8:cf:2\ncell:T58:l:1:f:8:cf:2\ncell:U58:l:1:f:8:cf:2\ncell:V58:l:1:f:8:cf:2\ncell:W58:l:1:f:8:cf:2\ncell:O59:l:1:f:8:cf:2\ncell:P59:l:1:f:8:cf:2\ncell:Q59:l:1:f:8:cf:2\ncell:R59:l:1:f:8:cf:2\ncell:S59:l:1:f:8:cf:2\ncell:T59:l:1:f:8:cf:2\ncell:U59:l:1:f:8:cf:2\ncell:V59:l:1:f:8:cf:2\ncell:W59:l:1:f:8:cf:2\ncell:O60:l:1:f:8:cf:2\ncell:P60:l:1:f:8:cf:2\ncell:Q60:l:1:f:8:cf:2\ncell:R60:l:1:f:8:cf:2\ncell:S60:l:1:f:8:cf:2\ncell:T60:l:1:f:8:cf:2\ncell:U60:l:1:f:8:cf:2\ncell:V60:l:1:f:8:cf:2\ncell:W60:l:1:f:8:cf:2\ncell:O61:l:1:f:8:cf:2\ncell:P61:l:1:f:8:cf:2\ncell:Q61:l:1:f:8:cf:2\ncell:R61:l:1:f:8:cf:2\ncell:S61:l:1:f:8:cf:2\ncell:T61:l:1:f:8:cf:2\ncell:U61:l:1:f:8:cf:2\ncell:V61:l:1:f:8:cf:2\ncell:W61:l:1:f:8:cf:2\ncell:O62:l:1:f:8:cf:2\ncell:P62:l:1:f:8:cf:2\ncell:Q62:l:1:f:8:cf:2\ncell:R62:l:1:f:8:cf:2\ncell:S62:l:1:f:8:cf:2\ncell:T62:l:1:f:8:cf:2\ncell:U62:l:1:f:8:cf:2\ncell:V62:l:1:f:8:cf:2\ncell:W62:l:1:f:8:cf:2\ncell:O63:l:1:f:8:cf:2\ncell:P63:l:1:f:8:cf:2\ncell:Q63:l:1:f:8:cf:2\ncell:R63:l:1:f:8:cf:2\ncell:S63:l:1:f:8:cf:2\ncell:T63:l:1:f:8:cf:2\ncell:U63:l:1:f:8:cf:2\ncell:V63:l:1:f:8:cf:2\ncell:W63:l:1:f:8:cf:2\ncell:O64:l:1:f:8:cf:2\ncell:P64:l:1:f:8:cf:2\ncell:Q64:l:1:f:8:cf:2\ncell:R64:l:1:f:8:cf:2\ncell:S64:l:1:f:8:cf:2\ncell:T64:l:1:f:8:cf:2\ncell:U64:l:1:f:8:cf:2\ncell:V64:l:1:f:8:cf:2\ncell:W64:l:1:f:8:cf:2\ncell:O65:l:1:f:8:cf:2\ncell:P65:l:1:f:8:cf:2\ncell:Q65:l:1:f:8:cf:2\ncell:R65:l:1:f:8:cf:2\ncell:S65:l:1:f:8:cf:2\ncell:T65:l:1:f:8:cf:2\ncell:U65:l:1:f:8:cf:2\ncell:V65:l:1:f:8:cf:2\ncell:W65:l:1:f:8:cf:2\ncell:O66:l:1:f:8:cf:2\ncell:P66:l:1:f:8:cf:2\ncell:Q66:l:1:f:8:cf:2\ncell:R66:l:1:f:8:cf:2\ncell:S66:l:1:f:8:cf:2\ncell:T66:l:1:f:8:cf:2\ncell:U66:l:1:f:8:cf:2\ncell:V66:l:1:f:8:cf:2\ncell:W66:l:1:f:8:cf:2\ncell:O67:l:1:f:8:cf:2\ncell:P67:l:1:f:8:cf:2\ncell:Q67:l:1:f:8:cf:2\ncell:R67:l:1:f:8:cf:2\ncell:S67:l:1:f:8:cf:2\ncell:T67:l:1:f:8:cf:2\ncell:U67:l:1:f:8:cf:2\ncell:V67:l:1:f:8:cf:2\ncell:W67:l:1:f:8:cf:2\ncell:O68:l:1:f:8:cf:2\ncell:P68:l:1:f:8:cf:2\ncell:Q68:l:1:f:8:cf:2\ncell:R68:l:1:f:8:cf:2\ncell:S68:l:1:f:8:cf:2\ncell:T68:l:1:f:8:cf:2\ncell:U68:l:1:f:8:cf:2\ncell:V68:l:1:f:8:cf:2\ncell:W68:l:1:f:8:cf:2\ncell:O69:l:1:f:8:cf:2\ncell:P69:l:1:f:8:cf:2\ncell:Q69:l:1:f:8:cf:2\ncell:R69:l:1:f:8:cf:2\ncell:S69:l:1:f:8:cf:2\ncell:T69:l:1:f:8:cf:2\ncell:U69:l:1:f:8:cf:2\ncell:V69:l:1:f:8:cf:2\ncell:W69:l:1:f:8:cf:2\ncell:O70:l:1:f:8:cf:2\ncell:P70:l:1:f:8:cf:2\ncell:Q70:l:1:f:8:cf:2\ncell:R70:l:1:f:8:cf:2\ncell:S70:l:1:f:8:cf:2\ncell:T70:l:1:f:8:cf:2\ncell:U70:l:1:f:8:cf:2\ncell:V70:l:1:f:8:cf:2\ncell:W70:l:1:f:8:cf:2\ncell:O71:l:1:f:8:cf:2\ncell:P71:l:1:f:8:cf:2\ncell:Q71:l:1:f:8:cf:2\ncell:R71:l:1:f:8:cf:2\ncell:S71:l:1:f:8:cf:2\ncell:T71:l:1:f:8:cf:2\ncell:U71:l:1:f:8:cf:2\ncell:V71:l:1:f:8:cf:2\ncell:W71:l:1:f:8:cf:2\ncell:O72:l:1:f:8:cf:2\ncell:P72:l:1:f:8:cf:2\ncell:Q72:l:1:f:8:cf:2\ncell:R72:l:1:f:8:cf:2\ncell:S72:l:1:f:8:cf:2\ncell:T72:l:1:f:8:cf:2\ncell:U72:l:1:f:8:cf:2\ncell:V72:l:1:f:8:cf:2\ncell:W72:l:1:f:8:cf:2\ncell:O73:l:1:f:8:cf:2\ncell:P73:l:1:f:8:cf:2\ncell:Q73:l:1:f:8:cf:2\ncell:R73:l:1:f:8:cf:2\ncell:O74:l:1:f:8:cf:2\ncell:P74:l:1:f:8:cf:2\ncell:Q74:l:1:f:8:cf:2\ncell:R74:l:1:f:8:cf:2\ncell:O75:l:1:f:8:cf:2\ncell:P75:l:1:f:8:cf:2\ncell:Q75:l:1:f:8:cf:2\ncell:R75:l:1:f:8:cf:2\ncell:O76:l:1:f:8:cf:2\ncell:P76:l:1:f:8:cf:2\ncell:Q76:l:1:f:8:cf:2\ncell:R76:l:1:f:8:cf:2\ncell:O77:l:1:f:8:cf:2\ncell:P77:l:1:f:8:cf:2\ncell:Q77:l:1:f:8:cf:2\ncell:R77:l:1:f:8:cf:2\ncell:O78:l:1:f:8:cf:2\ncell:P78:l:1:f:8:cf:2\ncell:Q78:l:1:f:8:cf:2\ncell:R78:l:1:f:8:cf:2\ncell:O79:l:1:f:8:cf:2\ncell:P79:l:1:f:8:cf:2\ncell:Q79:l:1:f:8:cf:2\ncell:R79:l:1:f:8:cf:2\ncell:O80:l:1:f:8:cf:2\ncell:P80:l:1:f:8:cf:2\ncell:Q80:l:1:f:8:cf:2\ncell:R80:l:1:f:8:cf:2\ncell:O81:l:1:f:8:cf:2\ncell:P81:l:1:f:8:cf:2\ncell:Q81:l:1:f:8:cf:2\ncell:R81:l:1:f:8:cf:2\ncell:O82:l:1:f:8:cf:2\ncell:P82:l:1:f:8:cf:2\ncell:Q82:l:1:f:8:cf:2\ncell:R82:l:1:f:8:cf:2\ncell:O83:l:1:f:8:cf:2\ncell:P83:l:1:f:8:cf:2\ncell:Q83:l:1:f:8:cf:2\ncell:R83:l:1:f:8:cf:2\ncell:O84:l:1:f:8:cf:2\ncell:P84:l:1:f:8:cf:2\ncell:Q84:l:1:f:8:cf:2\ncell:R84:l:1:f:8:cf:2\ncell:O85:l:1:f:8:cf:2\ncell:P85:l:1:f:8:cf:2\ncell:Q85:l:1:f:8:cf:2\ncell:R85:l:1:f:8:cf:2\ncell:O86:l:1:f:8:cf:2\ncell:P86:l:1:f:8:cf:2\ncell:Q86:l:1:f:8:cf:2\ncell:R86:l:1:f:8:cf:2\ncell:B87:l:1:f:8:cf:2\ncell:C87:l:1:f:8:cf:2\ncell:D87:l:1:f:2:cf:2\ncell:E87:l:1:f:2:cf:3:ntvf:1\ncell:F87:l:1:f:2:cf:3:ntvf:1\ncell:O87:l:1:f:8:cf:2\ncell:P87:l:1:f:8:cf:2\ncell:Q87:l:1:f:8:cf:2\ncell:R87:l:1:f:8:cf:2\ncell:B88:l:1:f:6:cf:2\ncell:C88:l:1:f:6:cf:2\ncell:D88:l:1:f:11:cf:2\ncell:E88:l:1:f:11:cf:2\ncell:F88:l:1:f:8:cf:2\ncell:O88:l:1:f:8:cf:2\ncell:P88:l:1:f:8:cf:2\ncell:Q88:l:1:f:8:cf:2\ncell:R88:l:1:f:8:cf:2\ncell:O89:l:1:f:8:cf:2\ncell:P89:l:1:f:8:cf:2\ncell:Q89:l:1:f:8:cf:2\ncell:R89:l:1:f:8:cf:2\ncell:O90:l:1:f:8:cf:2\ncell:P90:l:1:f:8:cf:2\ncell:Q90:l:1:f:8:cf:2\ncell:R90:l:1:f:8:cf:2\ncell:O91:l:1:f:8:cf:2\ncell:P91:l:1:f:8:cf:2\ncell:Q91:l:1:f:8:cf:2\ncell:R91:l:1:f:8:cf:2\ncell:O92:l:1:f:8:cf:2\ncell:P92:l:1:f:8:cf:2\ncell:Q92:l:1:f:8:cf:2\ncell:R92:l:1:f:8:cf:2\ncell:O93:l:1:f:8:cf:2\ncell:P93:l:1:f:8:cf:2\ncell:Q93:l:1:f:8:cf:2\ncell:R93:l:1:f:8:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:O96:l:1:f:8:cf:2\ncell:P96:l:1:f:8:cf:2\ncell:Q96:l:1:f:8:cf:2\ncell:R96:l:1:f:8:cf:2\ncell:O97:l:1:f:8:cf:2\ncell:P97:l:1:f:8:cf:2\ncell:Q97:l:1:f:8:cf:2\ncell:R97:l:1:f:8:cf:2\ncell:O98:l:1:f:8:cf:2\ncell:P98:l:1:f:8:cf:2\ncell:Q98:l:1:f:8:cf:2\ncell:R98:l:1:f:8:cf:2\ncell:S98:l:1:f:8:cf:2\ncell:T98:l:1:f:8:cf:2\ncell:U98:l:1:f:8:cf:2\ncell:V98:l:1:f:8:cf:2\ncell:W98:l:1:f:8:cf:2\ncell:O99:l:1:f:8:cf:2\ncell:P99:l:1:f:8:cf:2\ncell:Q99:l:1:f:8:cf:2\ncell:R99:l:1:f:8:cf:2\ncell:S99:l:1:f:8:cf:2\ncell:T99:l:1:f:8:cf:2\ncell:U99:l:1:f:8:cf:2\ncell:V99:l:1:f:8:cf:2\ncell:W99:l:1:f:8:cf:2\ncell:O100:l:1:f:8:cf:2\ncell:P100:l:1:f:8:cf:2\ncell:Q100:l:1:f:8:cf:2\ncell:R100:l:1:f:8:cf:2\ncell:S100:l:1:f:8:cf:2\ncell:T100:l:1:f:8:cf:2\ncell:U100:l:1:f:8:cf:2\ncell:V100:l:1:f:8:cf:2\ncell:W100:l:1:f:8:cf:2\ncell:O101:l:1:f:8:cf:2\ncell:P101:l:1:f:8:cf:2\ncell:Q101:l:1:f:8:cf:2\ncell:R101:l:1:f:8:cf:2\ncell:S101:l:1:f:8:cf:2\ncell:T101:l:1:f:8:cf:2\ncell:U101:l:1:f:8:cf:2\ncell:V101:l:1:f:8:cf:2\ncell:W101:l:1:f:8:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncell:O110:l:1:f:8:cf:2\ncell:P110:l:1:f:8:cf:2\ncell:Q110:l:1:f:8:cf:2\ncell:R110:l:1:f:8:cf:2\ncell:S110:l:1:f:8:cf:2\ncell:T110:l:1:f:8:cf:2\ncell:U110:l:1:f:8:cf:2\ncell:V110:l:1:f:8:cf:2\ncell:W110:l:1:f:8:cf:2\ncell:O111:l:1:f:8:cf:2\ncell:P111:l:1:f:8:cf:2\ncell:Q111:l:1:f:8:cf:2\ncell:R111:l:1:f:8:cf:2\ncell:S111:l:1:f:8:cf:2\ncell:T111:l:1:f:8:cf:2\ncell:U111:l:1:f:8:cf:2\ncell:V111:l:1:f:8:cf:2\ncell:W111:l:1:f:8:cf:2\ncell:O112:l:1:f:8:cf:2\ncell:P112:l:1:f:8:cf:2\ncell:Q112:l:1:f:8:cf:2\ncell:R112:l:1:f:8:cf:2\ncell:S112:l:1:f:8:cf:2\ncell:T112:l:1:f:8:cf:2\ncell:U112:l:1:f:8:cf:2\ncell:V112:l:1:f:8:cf:2\ncell:W112:l:1:f:8:cf:2\ncell:O113:l:1:f:8:cf:2\ncell:P113:l:1:f:8:cf:2\ncell:Q113:l:1:f:8:cf:2\ncell:R113:l:1:f:8:cf:2\ncell:S113:l:1:f:8:cf:2\ncell:T113:l:1:f:8:cf:2\ncell:U113:l:1:f:8:cf:2\ncell:V113:l:1:f:8:cf:2\ncell:W113:l:1:f:8:cf:2\ncell:O114:l:1:f:8:cf:2\ncell:P114:l:1:f:8:cf:2\ncell:Q114:l:1:f:8:cf:2\ncell:R114:l:1:f:8:cf:2\ncell:S114:l:1:f:8:cf:2\ncell:T114:l:1:f:8:cf:2\ncell:U114:l:1:f:8:cf:2\ncell:V114:l:1:f:8:cf:2\ncell:W114:l:1:f:8:cf:2\ncell:O115:l:1:f:8:cf:2\ncell:P115:l:1:f:8:cf:2\ncell:Q115:l:1:f:8:cf:2\ncell:R115:l:1:f:8:cf:2\ncell:S115:l:1:f:8:cf:2\ncell:T115:l:1:f:8:cf:2\ncell:U115:l:1:f:8:cf:2\ncell:V115:l:1:f:8:cf:2\ncell:W115:l:1:f:8:cf:2\ncell:O116:l:1:f:8:cf:2\ncell:P116:l:1:f:8:cf:2\ncell:Q116:l:1:f:8:cf:2\ncell:R116:l:1:f:8:cf:2\ncell:S116:l:1:f:8:cf:2\ncell:T116:l:1:f:8:cf:2\ncell:U116:l:1:f:8:cf:2\ncell:V116:l:1:f:8:cf:2\ncell:W116:l:1:f:8:cf:2\ncell:O117:l:1:f:8:cf:2\ncell:P117:l:1:f:8:cf:2\ncell:Q117:l:1:f:8:cf:2\ncell:R117:l:1:f:8:cf:2\ncell:S117:l:1:f:8:cf:2\ncell:T117:l:1:f:8:cf:2\ncell:U117:l:1:f:8:cf:2\ncell:V117:l:1:f:8:cf:2\ncell:W117:l:1:f:8:cf:2\ncell:O118:l:1:f:8:cf:2\ncell:P118:l:1:f:8:cf:2\ncell:Q118:l:1:f:8:cf:2\ncell:R118:l:1:f:8:cf:2\ncell:S118:l:1:f:8:cf:2\ncell:T118:l:1:f:8:cf:2\ncell:U118:l:1:f:8:cf:2\ncell:V118:l:1:f:8:cf:2\ncell:W118:l:1:f:8:cf:2\ncell:O119:l:1:f:8:cf:2\ncell:P119:l:1:f:8:cf:2\ncell:Q119:l:1:f:8:cf:2\ncell:R119:l:1:f:8:cf:2\ncell:S119:l:1:f:8:cf:2\ncell:T119:l:1:f:8:cf:2\ncell:U119:l:1:f:8:cf:2\ncell:V119:l:1:f:8:cf:2\ncell:W119:l:1:f:8:cf:2\ncell:O120:l:1:f:8:cf:2\ncell:P120:l:1:f:8:cf:2\ncell:Q120:l:1:f:8:cf:2\ncell:R120:l:1:f:8:cf:2\ncell:S120:l:1:f:8:cf:2\ncell:T120:l:1:f:8:cf:2\ncell:U120:l:1:f:8:cf:2\ncell:V120:l:1:f:8:cf:2\ncell:W120:l:1:f:8:cf:2\ncell:O121:l:1:f:8:cf:2\ncell:P121:l:1:f:8:cf:2\ncell:Q121:l:1:f:8:cf:2\ncell:R121:l:1:f:8:cf:2\ncell:S121:l:1:f:8:cf:2\ncell:T121:l:1:f:8:cf:2\ncell:U121:l:1:f:8:cf:2\ncell:V121:l:1:f:8:cf:2\ncell:W121:l:1:f:8:cf:2\ncell:O122:l:1:f:8:cf:2\ncell:P122:l:1:f:8:cf:2\ncell:Q122:l:1:f:8:cf:2\ncell:R122:l:1:f:8:cf:2\ncell:S122:l:1:f:8:cf:2\ncell:T122:l:1:f:8:cf:2\ncell:U122:l:1:f:8:cf:2\ncell:V122:l:1:f:8:cf:2\ncell:W122:l:1:f:8:cf:2\ncell:O123:l:1:f:8:cf:2\ncell:P123:l:1:f:8:cf:2\ncell:Q123:l:1:f:8:cf:2\ncell:R123:l:1:f:8:cf:2\ncell:S123:l:1:f:8:cf:2\ncell:T123:l:1:f:8:cf:2\ncell:U123:l:1:f:8:cf:2\ncell:V123:l:1:f:8:cf:2\ncell:W123:l:1:f:8:cf:2\ncell:O124:l:1:f:8:cf:2\ncell:P124:l:1:f:8:cf:2\ncell:Q124:l:1:f:8:cf:2\ncell:R124:l:1:f:8:cf:2\ncell:S124:l:1:f:8:cf:2\ncell:T124:l:1:f:8:cf:2\ncell:U124:l:1:f:8:cf:2\ncell:V124:l:1:f:8:cf:2\ncell:W124:l:1:f:8:cf:2\ncell:O125:l:1:f:8:cf:2\ncell:P125:l:1:f:8:cf:2\ncell:Q125:l:1:f:8:cf:2\ncell:R125:l:1:f:8:cf:2\ncell:S125:l:1:f:8:cf:2\ncell:T125:l:1:f:8:cf:2\ncell:U125:l:1:f:8:cf:2\ncell:V125:l:1:f:8:cf:2\ncell:W125:l:1:f:8:cf:2\ncell:O126:l:1:f:8:cf:2\ncell:P126:l:1:f:8:cf:2\ncell:Q126:l:1:f:8:cf:2\ncell:R126:l:1:f:8:cf:2\ncell:S126:l:1:f:8:cf:2\ncell:T126:l:1:f:8:cf:2\ncell:U126:l:1:f:8:cf:2\ncell:V126:l:1:f:8:cf:2\ncell:W126:l:1:f:8:cf:2\ncell:O127:l:1:f:8:cf:2\ncell:P127:l:1:f:8:cf:2\ncell:Q127:l:1:f:8:cf:2\ncell:R127:l:1:f:8:cf:2\ncell:S127:l:1:f:8:cf:2\ncell:T127:l:1:f:8:cf:2\ncell:U127:l:1:f:8:cf:2\ncell:V127:l:1:f:8:cf:2\ncell:W127:l:1:f:8:cf:2\ncell:O128:l:1:f:8:cf:2\ncell:P128:l:1:f:8:cf:2\ncell:Q128:l:1:f:8:cf:2\ncell:R128:l:1:f:8:cf:2\ncell:S128:l:1:f:8:cf:2\ncell:T128:l:1:f:8:cf:2\ncell:U128:l:1:f:8:cf:2\ncell:V128:l:1:f:8:cf:2\ncell:W128:l:1:f:8:cf:2\ncell:O129:l:1:f:8:cf:2\ncell:P129:l:1:f:8:cf:2\ncell:Q129:l:1:f:8:cf:2\ncell:R129:l:1:f:8:cf:2\ncell:S129:l:1:f:8:cf:2\ncell:T129:l:1:f:8:cf:2\ncell:U129:l:1:f:8:cf:2\ncell:V129:l:1:f:8:cf:2\ncell:W129:l:1:f:8:cf:2\ncell:O130:l:1:f:8:cf:2\ncell:P130:l:1:f:8:cf:2\ncell:Q130:l:1:f:8:cf:2\ncell:R130:l:1:f:8:cf:2\ncell:S130:l:1:f:8:cf:2\ncell:T130:l:1:f:8:cf:2\ncell:U130:l:1:f:8:cf:2\ncell:V130:l:1:f:8:cf:2\ncell:W130:l:1:f:8:cf:2\ncell:O131:l:1:f:8:cf:2\ncell:P131:l:1:f:8:cf:2\ncell:Q131:l:1:f:8:cf:2\ncell:R131:l:1:f:8:cf:2\ncell:S131:l:1:f:8:cf:2\ncell:T131:l:1:f:8:cf:2\ncell:U131:l:1:f:8:cf:2\ncell:V131:l:1:f:8:cf:2\ncell:W131:l:1:f:8:cf:2\ncell:O132:l:1:f:8:cf:2\ncell:P132:l:1:f:8:cf:2\ncell:Q132:l:1:f:8:cf:2\ncell:R132:l:1:f:8:cf:2\ncell:S132:l:1:f:8:cf:2\ncell:T132:l:1:f:8:cf:2\ncell:U132:l:1:f:8:cf:2\ncell:V132:l:1:f:8:cf:2\ncell:W132:l:1:f:8:cf:2\ncell:O133:l:1:f:8:cf:2\ncell:P133:l:1:f:8:cf:2\ncell:Q133:l:1:f:8:cf:2\ncell:R133:l:1:f:8:cf:2\ncell:S133:l:1:f:8:cf:2\ncell:T133:l:1:f:8:cf:2\ncell:U133:l:1:f:8:cf:2\ncell:V133:l:1:f:8:cf:2\ncell:W133:l:1:f:8:cf:2\ncell:O134:l:1:f:8:cf:2\ncell:P134:l:1:f:8:cf:2\ncell:Q134:l:1:f:8:cf:2\ncell:R134:l:1:f:8:cf:2\ncell:S134:l:1:f:8:cf:2\ncell:T134:l:1:f:8:cf:2\ncell:U134:l:1:f:8:cf:2\ncell:V134:l:1:f:8:cf:2\ncell:W134:l:1:f:8:cf:2\ncell:O135:l:1:f:8:cf:2\ncell:P135:l:1:f:8:cf:2\ncell:Q135:l:1:f:8:cf:2\ncell:R135:l:1:f:8:cf:2\ncell:S135:l:1:f:8:cf:2\ncell:T135:l:1:f:8:cf:2\ncell:U135:l:1:f:8:cf:2\ncell:V135:l:1:f:8:cf:2\ncell:W135:l:1:f:8:cf:2\ncell:O136:l:1:f:8:cf:2\ncell:P136:l:1:f:8:cf:2\ncell:Q136:l:1:f:8:cf:2\ncell:R136:l:1:f:8:cf:2\ncell:S136:l:1:f:8:cf:2\ncell:T136:l:1:f:8:cf:2\ncell:U136:l:1:f:8:cf:2\ncell:V136:l:1:f:8:cf:2\ncell:W136:l:1:f:8:cf:2\ncell:O137:l:1:f:8:cf:2\ncell:P137:l:1:f:8:cf:2\ncell:Q137:l:1:f:8:cf:2\ncell:R137:l:1:f:8:cf:2\ncell:S137:l:1:f:8:cf:2\ncell:T137:l:1:f:8:cf:2\ncell:U137:l:1:f:8:cf:2\ncell:V137:l:1:f:8:cf:2\ncell:W137:l:1:f:8:cf:2\ncell:O138:l:1:f:8:cf:2\ncell:P138:l:1:f:8:cf:2\ncell:Q138:l:1:f:8:cf:2\ncell:R138:l:1:f:8:cf:2\ncell:S138:l:1:f:8:cf:2\ncell:T138:l:1:f:8:cf:2\ncell:U138:l:1:f:8:cf:2\ncell:V138:l:1:f:8:cf:2\ncell:W138:l:1:f:8:cf:2\ncell:O139:l:1:f:8:cf:2\ncell:P139:l:1:f:8:cf:2\ncell:Q139:l:1:f:8:cf:2\ncell:R139:l:1:f:8:cf:2\ncell:S139:l:1:f:8:cf:2\ncell:T139:l:1:f:8:cf:2\ncell:U139:l:1:f:8:cf:2\ncell:V139:l:1:f:8:cf:2\ncell:W139:l:1:f:8:cf:2\ncell:O140:l:1:f:8:cf:2\ncell:P140:l:1:f:8:cf:2\ncell:Q140:l:1:f:8:cf:2\ncell:R140:l:1:f:8:cf:2\ncell:S140:l:1:f:8:cf:2\ncell:T140:l:1:f:8:cf:2\ncell:U140:l:1:f:8:cf:2\ncell:V140:l:1:f:8:cf:2\ncell:W140:l:1:f:8:cf:2\ncell:O141:l:1:f:8:cf:2\ncell:P141:l:1:f:8:cf:2\ncell:Q141:l:1:f:8:cf:2\ncell:R141:l:1:f:8:cf:2\ncell:S141:l:1:f:8:cf:2\ncell:T141:l:1:f:8:cf:2\ncell:U141:l:1:f:8:cf:2\ncell:V141:l:1:f:8:cf:2\ncell:W141:l:1:f:8:cf:2\ncell:O142:l:1:f:8:cf:2\ncell:P142:l:1:f:8:cf:2\ncell:Q142:l:1:f:8:cf:2\ncell:R142:l:1:f:8:cf:2\ncell:S142:l:1:f:8:cf:2\ncell:T142:l:1:f:8:cf:2\ncell:U142:l:1:f:8:cf:2\ncell:V142:l:1:f:8:cf:2\ncell:W142:l:1:f:8:cf:2\ncell:O143:l:1:f:8:cf:2\ncell:P143:l:1:f:8:cf:2\ncell:Q143:l:1:f:8:cf:2\ncell:R143:l:1:f:8:cf:2\ncell:S143:l:1:f:8:cf:2\ncell:T143:l:1:f:8:cf:2\ncell:U143:l:1:f:8:cf:2\ncell:V143:l:1:f:8:cf:2\ncell:W143:l:1:f:8:cf:2\ncell:O144:l:1:f:8:cf:2\ncell:P144:l:1:f:8:cf:2\ncell:Q144:l:1:f:8:cf:2\ncell:R144:l:1:f:8:cf:2\ncell:S144:l:1:f:8:cf:2\ncell:T144:l:1:f:8:cf:2\ncell:U144:l:1:f:8:cf:2\ncell:V144:l:1:f:8:cf:2\ncell:W144:l:1:f:8:cf:2\ncell:O145:l:1:f:8:cf:2\ncell:P145:l:1:f:8:cf:2\ncell:Q145:l:1:f:8:cf:2\ncell:R145:l:1:f:8:cf:2\ncell:S145:l:1:f:8:cf:2\ncell:T145:l:1:f:8:cf:2\ncell:U145:l:1:f:8:cf:2\ncell:V145:l:1:f:8:cf:2\ncell:W145:l:1:f:8:cf:2\ncell:O146:l:1:f:8:cf:2\ncell:P146:l:1:f:8:cf:2\ncell:Q146:l:1:f:8:cf:2\ncell:R146:l:1:f:8:cf:2\ncell:S146:l:1:f:8:cf:2\ncell:T146:l:1:f:8:cf:2\ncell:U146:l:1:f:8:cf:2\ncell:V146:l:1:f:8:cf:2\ncell:W146:l:1:f:8:cf:2\ncell:O147:l:1:f:8:cf:2\ncell:P147:l:1:f:8:cf:2\ncell:Q147:l:1:f:8:cf:2\ncell:R147:l:1:f:8:cf:2\ncell:S147:l:1:f:8:cf:2\ncell:T147:l:1:f:8:cf:2\ncell:U147:l:1:f:8:cf:2\ncell:V147:l:1:f:8:cf:2\ncell:W147:l:1:f:8:cf:2\ncell:O148:l:1:f:8:cf:2\ncell:P148:l:1:f:8:cf:2\ncell:Q148:l:1:f:8:cf:2\ncell:R148:l:1:f:8:cf:2\ncell:S148:l:1:f:8:cf:2\ncell:T148:l:1:f:8:cf:2\ncell:U148:l:1:f:8:cf:2\ncell:V148:l:1:f:8:cf:2\ncell:W148:l:1:f:8:cf:2\ncell:O149:l:1:f:8:cf:2\ncell:P149:l:1:f:8:cf:2\ncell:Q149:l:1:f:8:cf:2\ncell:R149:l:1:f:8:cf:2\ncell:S149:l:1:f:8:cf:2\ncell:T149:l:1:f:8:cf:2\ncell:U149:l:1:f:8:cf:2\ncell:V149:l:1:f:8:cf:2\ncell:W149:l:1:f:8:cf:2\ncell:O150:l:1:f:10:cf:2\ncell:P150:l:1:f:10:cf:2\ncell:Q150:l:1:f:10:cf:2\ncell:R150:l:1:f:10:cf:2\ncell:S150:l:1:f:10:cf:2\ncell:T150:l:1:f:10:cf:2\ncell:U150:l:1:f:10:cf:2\ncell:V150:l:1:f:10:cf:2\ncell:W150:l:1:f:10:cf:2\ncell:O151:l:1:f:10:cf:2\ncell:P151:l:1:f:10:cf:2\ncell:Q151:l:1:f:10:cf:2\ncell:R151:l:1:f:10:cf:2\ncell:S151:l:1:f:10:cf:2\ncell:T151:l:1:f:10:cf:2\ncell:U151:l:1:f:10:cf:2\ncell:V151:l:1:f:10:cf:2\ncell:W151:l:1:f:10:cf:2\ncell:O152:l:1:f:10:cf:2\ncell:P152:l:1:f:10:cf:2\ncell:Q152:l:1:f:10:cf:2\ncell:R152:l:1:f:10:cf:2\ncell:S152:l:1:f:10:cf:2\ncell:T152:l:1:f:10:cf:2\ncell:U152:l:1:f:10:cf:2\ncell:V152:l:1:f:10:cf:2\ncell:W152:l:1:f:10:cf:2\ncell:O153:l:1:f:10:cf:2\ncell:P153:l:1:f:10:cf:2\ncell:Q153:l:1:f:10:cf:2\ncell:R153:l:1:f:10:cf:2\ncell:S153:l:1:f:10:cf:2\ncell:T153:l:1:f:10:cf:2\ncell:U153:l:1:f:10:cf:2\ncell:V153:l:1:f:10:cf:2\ncell:W153:l:1:f:10:cf:2\ncell:A154:l:1:f:10:cf:2\ncell:B154:l:1:f:10:cf:2\ncell:C154:l:1:f:10:cf:2\ncell:D154:l:1:f:10:cf:2\ncell:E154:l:1:f:10:cf:2\ncell:F154:t:Monthly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G154:l:1:f:10:cf:2\ncell:H154:l:1:f:10:cf:2\ncell:I154:l:1:f:10:cf:2\ncell:J154:l:1:f:10:cf:2\ncell:K154:l:1:f:10:cf:2\ncell:L154:l:1:f:10:cf:2\ncell:M154:l:1:f:10:cf:2\ncell:N154:l:1:f:10:cf:2\ncell:O154:l:1:f:10:cf:2\ncell:P154:l:1:f:10:cf:2\ncell:Q154:l:1:f:10:cf:2\ncell:R154:l:1:f:10:cf:2\ncell:S154:l:1:f:10:cf:2\ncell:T154:l:1:f:10:cf:2\ncell:U154:l:1:f:10:cf:2\ncell:V154:l:1:f:10:cf:2\ncell:W154:l:1:f:10:cf:2\ncell:A155:l:1:f:10:cf:2\ncell:B155:l:1:f:10:cf:2\ncell:C155:l:1:f:10:cf:2\ncell:D155:l:1:f:10:cf:2\ncell:E155:l:1:f:10:cf:2\ncell:F155:t:Semi-Annually:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G155:l:1:f:10:cf:2\ncell:H155:l:1:f:10:cf:2\ncell:I155:l:1:f:10:cf:2\ncell:J155:l:1:f:10:cf:2\ncell:K155:l:1:f:10:cf:2\ncell:L155:l:1:f:10:cf:2\ncell:M155:l:1:f:10:cf:2\ncell:N155:l:1:f:10:cf:2\ncell:O155:l:1:f:10:cf:2\ncell:P155:l:1:f:10:cf:2\ncell:Q155:l:1:f:10:cf:2\ncell:R155:l:1:f:10:cf:2\ncell:S155:l:1:f:10:cf:2\ncell:T155:l:1:f:10:cf:2\ncell:U155:l:1:f:10:cf:2\ncell:V155:l:1:f:10:cf:2\ncell:W155:l:1:f:10:cf:2\ncell:A156:l:1:f:10:cf:2\ncell:B156:l:1:f:10:cf:2\ncell:C156:l:1:f:10:cf:2\ncell:D156:l:1:f:10:cf:2\ncell:E156:l:1:f:10:cf:2\ncell:F156:t:Quarterly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G156:l:1:f:10:cf:2\ncell:H156:l:1:f:10:cf:2\ncell:I156:l:1:f:10:cf:2\ncell:J156:l:1:f:10:cf:2\ncell:K156:l:1:f:10:cf:2\ncell:L156:l:1:f:10:cf:2\ncell:M156:l:1:f:10:cf:2\ncell:N156:l:1:f:10:cf:2\ncell:O156:l:1:f:10:cf:2\ncell:P156:l:1:f:10:cf:2\ncell:Q156:l:1:f:10:cf:2\ncell:R156:l:1:f:10:cf:2\ncell:S156:l:1:f:10:cf:2\ncell:T156:l:1:f:10:cf:2\ncell:U156:l:1:f:10:cf:2\ncell:V156:l:1:f:10:cf:2\ncell:W156:l:1:f:10:cf:2\ncell:A157:l:1:f:10:cf:2\ncell:B157:l:1:f:10:cf:2\ncell:C157:l:1:f:10:cf:2\ncell:D157:l:1:f:10:cf:2\ncell:E157:l:1:f:10:cf:2\ncell:F157:t:Yearly:l:1:f:10:cf:2:tvf:2:ntvf:2\ncell:G157:l:1:f:10:cf:2\ncell:H157:l:1:f:10:cf:2\ncell:I157:l:1:f:10:cf:2\ncell:J157:l:1:f:10:cf:2\ncell:K157:l:1:f:10:cf:2\ncell:L157:l:1:f:10:cf:2\ncell:M157:l:1:f:10:cf:2\ncell:N157:l:1:f:10:cf:2\ncell:O157:l:1:f:10:cf:2\ncell:P157:l:1:f:10:cf:2\ncell:Q157:l:1:f:10:cf:2\ncell:R157:l:1:f:10:cf:2\ncell:S157:l:1:f:10:cf:2\ncell:T157:l:1:f:10:cf:2\ncell:U157:l:1:f:10:cf:2\ncell:V157:l:1:f:10:cf:2\ncell:W157:l:1:f:10:cf:2\ncell:A158:l:1:f:10:cf:2\ncell:B158:l:1:f:10:cf:2\ncell:C158:l:1:f:10:cf:2\ncell:D158:l:1:f:10:cf:2\ncell:E158:l:1:f:10:cf:2\ncell:F158:l:1:f:10:cf:2\ncell:G158:l:1:f:10:cf:2\ncell:H158:l:1:f:10:cf:2\ncell:I158:l:1:f:10:cf:2\ncell:J158:l:1:f:10:cf:2\ncell:K158:l:1:f:10:cf:2\ncell:L158:l:1:f:10:cf:2\ncell:M158:l:1:f:10:cf:2\ncell:N158:l:1:f:10:cf:2\ncell:O158:l:1:f:10:cf:2\ncell:P158:l:1:f:10:cf:2\ncell:Q158:l:1:f:10:cf:2\ncell:R158:l:1:f:10:cf:2\ncell:S158:l:1:f:10:cf:2\ncell:T158:l:1:f:10:cf:2\ncell:U158:l:1:f:10:cf:2\ncell:V158:l:1:f:10:cf:2\ncell:W158:l:1:f:10:cf:2\ncell:A159:l:1:f:10:cf:2\ncell:B159:l:1:f:10:cf:2\ncell:C159:l:1:f:10:cf:2\ncell:D159:l:1:f:10:cf:2\ncell:E159:l:1:f:10:cf:2\ncell:F159:l:1:f:10:cf:2\ncell:G159:l:1:f:10:cf:2\ncell:H159:l:1:f:10:cf:2\ncell:I159:l:1:f:10:cf:2\ncell:J159:l:1:f:10:cf:2\ncell:K159:l:1:f:10:cf:2\ncell:L159:l:1:f:10:cf:2\ncell:M159:l:1:f:10:cf:2\ncell:N159:l:1:f:10:cf:2\ncell:O159:l:1:f:10:cf:2\ncell:P159:l:1:f:10:cf:2\ncell:Q159:l:1:f:10:cf:2\ncell:R159:l:1:f:10:cf:2\ncell:S159:l:1:f:10:cf:2\ncell:T159:l:1:f:10:cf:2\ncell:U159:l:1:f:10:cf:2\ncell:V159:l:1:f:10:cf:2\ncell:W159:l:1:f:10:cf:2\ncell:A160:l:1:f:10:cf:2\ncell:B160:l:1:f:10:cf:2\ncell:C160:l:1:f:10:cf:2\ncell:D160:l:1:f:10:cf:2\ncell:E160:l:1:f:10:cf:2\ncell:F160:l:1:f:10:cf:2\ncell:G160:l:1:f:10:cf:2\ncell:H160:l:1:f:10:cf:2\ncell:I160:l:1:f:10:cf:2\ncell:J160:l:1:f:10:cf:2\ncell:K160:l:1:f:10:cf:2\ncell:L160:l:1:f:10:cf:2\ncell:M160:l:1:f:10:cf:2\ncell:N160:l:1:f:10:cf:2\ncell:O160:l:1:f:10:cf:2\ncell:P160:l:1:f:10:cf:2\ncell:Q160:l:1:f:10:cf:2\ncell:R160:l:1:f:10:cf:2\ncell:S160:l:1:f:10:cf:2\ncell:T160:l:1:f:10:cf:2\ncell:U160:l:1:f:10:cf:2\ncell:V160:l:1:f:10:cf:2\ncell:W160:l:1:f:10:cf:2\ncell:A161:l:1:f:10:cf:2\ncell:B161:l:1:f:10:cf:2\ncell:C161:l:1:f:10:cf:2\ncell:D161:l:1:f:10:cf:2\ncell:E161:l:1:f:10:cf:2\ncell:F161:l:1:f:10:cf:2\ncell:G161:l:1:f:10:cf:2\ncell:H161:l:1:f:10:cf:2\ncell:I161:l:1:f:10:cf:2\ncell:J161:l:1:f:10:cf:2\ncell:K161:l:1:f:10:cf:2\ncell:L161:l:1:f:10:cf:2\ncell:M161:l:1:f:10:cf:2\ncell:N161:l:1:f:10:cf:2\ncell:O161:l:1:f:10:cf:2\ncell:P161:l:1:f:10:cf:2\ncell:Q161:l:1:f:10:cf:2\ncell:R161:l:1:f:10:cf:2\ncell:S161:l:1:f:10:cf:2\ncell:T161:l:1:f:10:cf:2\ncell:U161:l:1:f:10:cf:2\ncell:V161:l:1:f:10:cf:2\ncell:W161:l:1:f:10:cf:2\ncell:A162:l:1:f:10:cf:2\ncell:B162:l:1:f:10:cf:2\ncell:C162:l:1:f:10:cf:2\ncell:D162:l:1:f:10:cf:2\ncell:E162:l:1:f:10:cf:2\ncell:F162:l:1:f:10:cf:2\ncell:G162:l:1:f:10:cf:2\ncell:H162:l:1:f:10:cf:2\ncell:I162:l:1:f:10:cf:2\ncell:J162:l:1:f:10:cf:2\ncell:K162:l:1:f:10:cf:2\ncell:L162:l:1:f:10:cf:2\ncell:M162:l:1:f:10:cf:2\ncell:N162:l:1:f:10:cf:2\ncell:O162:l:1:f:10:cf:2\ncell:P162:l:1:f:10:cf:2\ncell:Q162:l:1:f:10:cf:2\ncell:R162:l:1:f:10:cf:2\ncell:S162:l:1:f:10:cf:2\ncell:T162:l:1:f:10:cf:2\ncell:U162:l:1:f:10:cf:2\ncell:V162:l:1:f:10:cf:2\ncell:W162:l:1:f:10:cf:2\ncell:A163:l:1:f:10:cf:2\ncell:B163:l:1:f:10:cf:2\ncell:C163:l:1:f:10:cf:2\ncell:D163:l:1:f:10:cf:2\ncell:E163:l:1:f:10:cf:2\ncell:F163:l:1:f:10:cf:2\ncell:G163:l:1:f:10:cf:2\ncell:H163:l:1:f:10:cf:2\ncell:I163:l:1:f:10:cf:2\ncell:J163:l:1:f:10:cf:2\ncell:K163:l:1:f:10:cf:2\ncell:L163:l:1:f:10:cf:2\ncell:M163:l:1:f:10:cf:2\ncell:N163:l:1:f:10:cf:2\ncell:O163:l:1:f:10:cf:2\ncell:P163:l:1:f:10:cf:2\ncell:Q163:l:1:f:10:cf:2\ncell:R163:l:1:f:10:cf:2\ncell:S163:l:1:f:10:cf:2\ncell:T163:l:1:f:10:cf:2\ncell:U163:l:1:f:10:cf:2\ncell:V163:l:1:f:10:cf:2\ncell:W163:l:1:f:10:cf:2\ncell:A164:l:1:f:10:cf:2\ncell:B164:l:1:f:10:cf:2\ncell:C164:l:1:f:10:cf:2\ncell:D164:l:1:f:10:cf:2\ncell:E164:l:1:f:10:cf:2\ncell:F164:l:1:f:10:cf:2\ncell:G164:l:1:f:10:cf:2\ncell:H164:l:1:f:10:cf:2\ncell:I164:l:1:f:10:cf:2\ncell:J164:l:1:f:10:cf:2\ncell:K164:l:1:f:10:cf:2\ncell:L164:l:1:f:10:cf:2\ncell:M164:l:1:f:10:cf:2\ncell:N164:l:1:f:10:cf:2\ncell:O164:l:1:f:10:cf:2\ncell:P164:l:1:f:10:cf:2\ncell:Q164:l:1:f:10:cf:2\ncell:R164:l:1:f:10:cf:2\ncell:S164:l:1:f:10:cf:2\ncell:T164:l:1:f:10:cf:2\ncell:U164:l:1:f:10:cf:2\ncell:V164:l:1:f:10:cf:2\ncell:W164:l:1:f:10:cf:2\ncell:A165:l:1:f:10:cf:2\ncell:B165:l:1:f:10:cf:2\ncell:C165:l:1:f:10:cf:2\ncell:D165:l:1:f:10:cf:2\ncell:E165:l:1:f:10:cf:2\ncell:F165:l:1:f:10:cf:2\ncell:G165:l:1:f:10:cf:2\ncell:H165:l:1:f:10:cf:2\ncell:I165:l:1:f:10:cf:2\ncell:J165:l:1:f:10:cf:2\ncell:K165:l:1:f:10:cf:2\ncell:L165:l:1:f:10:cf:2\ncell:M165:l:1:f:10:cf:2\ncell:N165:l:1:f:10:cf:2\ncell:O165:l:1:f:10:cf:2\ncell:P165:l:1:f:10:cf:2\ncell:Q165:l:1:f:10:cf:2\ncell:R165:l:1:f:10:cf:2\ncell:S165:l:1:f:10:cf:2\ncell:T165:l:1:f:10:cf:2\ncell:U165:l:1:f:10:cf:2\ncell:V165:l:1:f:10:cf:2\ncell:W165:l:1:f:10:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:30\nrow:5:h:171\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:18.75\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:15\nrow:17:h:15\nrow:18:h:15\nrow:19:h:15\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nrow:102:h:14.25\nrow:103:h:14.25\nrow:104:h:14.25\nrow:105:h:14.25\nrow:106:h:14.25\nrow:107:h:14.25\nrow:108:h:14.25\nrow:109:h:14.25\nrow:110:h:14.25\nrow:111:h:14.25\nrow:112:h:14.25\nrow:113:h:14.25\nrow:114:h:14.25\nrow:115:h:14.25\nrow:116:h:14.25\nrow:117:h:14.25\nrow:118:h:14.25\nrow:119:h:14.25\nrow:120:h:14.25\nrow:121:h:14.25\nrow:122:h:14.25\nrow:123:h:14.25\nrow:124:h:14.25\nrow:125:h:14.25\nrow:126:h:14.25\nrow:127:h:14.25\nrow:128:h:14.25\nrow:129:h:14.25\nrow:130:h:14.25\nrow:131:h:14.25\nrow:132:h:14.25\nrow:133:h:14.25\nrow:134:h:14.25\nrow:135:h:14.25\nrow:136:h:14.25\nrow:137:h:14.25\nrow:138:h:14.25\nrow:139:h:14.25\nrow:140:h:14.25\nrow:141:h:14.25\nrow:142:h:14.25\nrow:143:h:14.25\nrow:144:h:14.25\nrow:145:h:14.25\nrow:146:h:14.25\nrow:147:h:14.25\nrow:148:h:14.25\nrow:149:h:14.25\nsheet:c:27:r:165:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(136,204,119)\ncolor:4:rgb(230,230,250)\ncolor:5:rgb(255, 255, 255)\ncolor:6:rgb(255,255,187)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 10pt Arial\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 24pt Arial\nfont:6:normal bold 9pt Arial\nfont:7:normal normal * Arial\nfont:8:normal normal 10pt Arial\nfont:9:normal normal 12pt Arial\nfont:10:normal normal 7pt Arial\nfont:11:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\nname:COMPARISON::S91\\cU105\nname:TRACKING::AC91\\cAE105\n', - }, - name: "expense", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:6:cf:2:ntvf:2\ncell:B1:l:1:f:6:cf:2\ncell:C1:l:1:f:6:cf:2\ncell:D1:l:1:f:6:cf:2\ncell:E1:l:1:f:6:cf:2\ncell:F1:l:1:f:6:cf:2\ncell:G1:l:1:f:6:cf:2\ncell:H1:l:1:f:6:cf:2\ncell:I1:l:1:f:6:cf:2\ncell:J1:l:1:f:6:cf:2\ncell:K1:l:1:f:6:cf:2\ncell:L1:l:1:f:6:cf:2\ncell:M1:l:1:f:6:cf:2\ncell:N1:l:1:f:6:cf:2\ncell:O1:l:1:f:6:cf:2\ncell:P1:l:1:f:6:cf:2\ncell:Q1:l:1:f:6:cf:2\ncell:R1:l:1:f:6:cf:2\ncell:S1:l:1:f:6:cf:2\ncell:T1:l:1:f:6:cf:2\ncell:U1:l:1:f:6:cf:2\ncell:V1:l:1:f:6:cf:2\ncell:W1:l:1:f:6:cf:2\ncell:A2:l:1:f:6:cf:2\ncell:B2:l:1:f:6:cf:2\ncell:C2:l:1:f:6:cf:2\ncell:D2:t:Expenses:l:2:f:3:cf:2\ncell:E2:l:1:f:6:cf:2\ncell:F2:l:1:f:6:cf:2\ncell:G2:l:1:f:6:cf:2\ncell:H2:l:1:f:6:cf:2\ncell:I2:l:1:f:6:cf:2\ncell:J2:l:1:f:6:cf:2\ncell:K2:l:1:f:6:cf:2\ncell:L2:l:1:f:6:cf:2\ncell:M2:l:1:f:6:cf:2\ncell:N2:l:1:f:6:cf:2\ncell:O2:l:1:f:6:cf:2\ncell:P2:l:1:f:6:cf:2\ncell:Q2:l:1:f:6:cf:2\ncell:R2:l:1:f:6:cf:2\ncell:S2:l:1:f:6:cf:2\ncell:T2:l:1:f:6:cf:2\ncell:U2:l:1:f:6:cf:2\ncell:V2:l:1:f:6:cf:2\ncell:W2:l:1:f:6:cf:2\ncell:A3:l:1:f:6:cf:2\ncell:B3:l:1:f:6:cf:2\ncell:C3:l:1:f:6:cf:2\ncell:D3:l:1:f:6:cf:2\ncell:G3:l:1:f:6:cf:2\ncell:H3:l:1:f:6:cf:2\ncell:I3:l:1:f:6:cf:2\ncell:J3:l:1:f:6:cf:2\ncell:K3:l:1:f:6:cf:2\ncell:L3:l:1:f:6:cf:2\ncell:M3:l:1:f:6:cf:2\ncell:N3:l:1:f:6:cf:2\ncell:O3:l:1:f:6:cf:2\ncell:P3:l:1:f:6:cf:2\ncell:Q3:t: :l:1:f:6:cf:2\ncell:R3:l:1:f:6:cf:2\ncell:S3:l:1:f:6:cf:2\ncell:T3:l:1:f:6:cf:2\ncell:U3:l:1:f:6:cf:2\ncell:V3:l:1:f:6:cf:2\ncell:W3:l:1:f:6:cf:2\ncell:B4:t:Food & Beverages:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C4:b:2:2:2:2:l:3:f:2:c:4:bg:2:cf:2\ncell:D4:b:2:2:2:2:l:3:f:2:c:4:bg:2:cf:1\ncell:E4:vtf:n:511:E5+E9:b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F4:vtf:n:6132:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O4:l:1:f:6:cf:2\ncell:P4:l:1:f:6:cf:2\ncell:Q4:l:1:f:6:cf:2\ncell:R4:l:1:f:6:cf:2\ncell:S4:l:1:f:6:cf:2\ncell:T4:l:1:f:6:cf:2\ncell:U4:l:1:f:6:cf:2\ncell:V4:l:1:f:6:cf:2\ncell:W4:l:1:f:6:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:5:c:1:bg:5\ncell:C5:t:Food at home:l:3:f:5:c:1:bg:5:cf:2:colspan:2\ncell:D5:t::b::1:1::l:3:f:5:c:1:bg:5:cf:2\ncell:E5:vtf:n:302:SUM(E6\\cE8):b:::1::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:F5:vtf:n:3624:IF( (E5*12)=0,"",(E5*12)):b::1:::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:6:cf:2\ncell:P5:l:1:f:6:cf:2\ncell:Q5:l:1:f:6:cf:2\ncell:R5:l:1:f:6:cf:2\ncell:S5:l:1:f:6:cf:2\ncell:T5:l:1:f:6:cf:2\ncell:U5:l:1:f:6:cf:2\ncell:V5:l:1:f:6:cf:2\ncell:W5:l:1:f:6:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:6:cf:2\ncell:C6:l:3:f:6:cf:2\ncell:D6:t:Groceries:l:3:f:5:cf:2\ncell:E6:v:302:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F6:vtf:n:3624:IF( (E6*12)=0,"",(E6*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:6:cf:2\ncell:P6:l:1:f:6:cf:2\ncell:Q6:l:1:f:6:cf:2\ncell:R6:l:1:f:6:cf:2\ncell:S6:l:1:f:6:cf:2\ncell:T6:l:1:f:6:cf:2\ncell:U6:l:1:f:6:cf:2\ncell:V6:l:1:f:6:cf:2\ncell:W6:l:1:f:6:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:6:bg:3:cf:2\ncell:C7:l:3:f:6:bg:3:cf:2\ncell:D7:t:Cooking supplies:l:3:f:5:bg:3:cf:2\ncell:E7:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1:::l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:6:cf:2\ncell:P7:l:1:f:6:cf:2\ncell:Q7:l:1:f:6:cf:2\ncell:R7:l:1:f:6:cf:2\ncell:S7:l:1:f:6:cf:2\ncell:T7:l:1:f:6:cf:2\ncell:U7:l:1:f:6:cf:2\ncell:V7:l:1:f:6:cf:2\ncell:W7:l:1:f:6:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:6:cf:2\ncell:C8:l:3:f:6:cf:2\ncell:D8:t:Other:l:3:f:5:cf:2\ncell:E8:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:6:cf:2\ncell:P8:l:1:f:6:cf:2\ncell:Q8:l:1:f:6:cf:2\ncell:R8:l:1:f:6:cf:2\ncell:S8:l:1:f:6:cf:2\ncell:T8:l:1:f:6:cf:2\ncell:U8:l:1:f:6:cf:2\ncell:V8:l:1:f:6:cf:2\ncell:W8:l:1:f:6:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:5:c:1:bg:5\ncell:C9:t:Dining Out:l:3:f:5:c:1:bg:5:cf:2:colspan:2\ncell:D9:t:Tips:b::1:1::l:3:f:5:c:1:bg:5:cf:2\ncell:E9:vtf:n:209:SUM(E10\\cE11):b:::1::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:F9:vtf:n:2508:IF( (E9*12)=0,"",(E9*12)):b::1:::l:4:f:5:c:1:bg:5:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:6:cf:2\ncell:P9:l:1:f:6:cf:2\ncell:Q9:l:1:f:6:cf:2\ncell:R9:l:1:f:6:cf:2\ncell:S9:l:1:f:6:cf:2\ncell:T9:l:1:f:6:cf:2\ncell:U9:l:1:f:6:cf:2\ncell:V9:l:1:f:6:cf:2\ncell:W9:l:1:f:6:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:6:cf:2\ncell:C10:l:3:f:6:cf:2\ncell:D10:t:Restaurants:b::1:::l:3:f:5:cf:2\ncell:E10:v:209:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F10:vtf:n:2508:IF( (E10*12)=0,"",(E10*12)):b::1:::l:4:f:5:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:6:cf:2\ncell:P10:l:1:f:6:cf:2\ncell:Q10:l:1:f:6:cf:2\ncell:R10:l:1:f:6:cf:2\ncell:S10:l:1:f:6:cf:2\ncell:T10:l:1:f:6:cf:2\ncell:U10:l:1:f:6:cf:2\ncell:V10:l:1:f:6:cf:2\ncell:W10:l:1:f:6:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:6:bg:3:cf:2\ncell:C11:l:3:f:6:bg:3:cf:2\ncell:D11:t:Other :l:3:f:5:bg:3:cf:2\ncell:E11:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1:::l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:6:cf:2\ncell:P11:l:1:f:6:cf:2\ncell:Q11:l:1:f:6:cf:2\ncell:R11:l:1:f:6:cf:2\ncell:S11:l:1:f:6:cf:2\ncell:T11:l:1:f:6:cf:2\ncell:U11:l:1:f:6:cf:2\ncell:V11:l:1:f:6:cf:2\ncell:W11:l:1:f:6:cf:2\ncell:B12:t:Clothes & Personal Services:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C12:l:3:f:2:c:4:bg:2:cf:2\ncell:D12:l:3:f:2:c:4:bg:2:cf:1\ncell:E12:vtf:n:191:SUM(E13\\cE16):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F12:vtf:n:2292:IF( (E12*12)=0,"",(E12*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O12:l:1:f:6:cf:2\ncell:P12:l:1:f:6:cf:2\ncell:Q12:l:1:f:6:cf:2\ncell:R12:l:1:f:6:cf:2\ncell:S12:l:1:f:6:cf:2\ncell:T12:l:1:f:6:cf:2\ncell:U12:l:1:f:6:cf:2\ncell:V12:l:1:f:6:cf:2\ncell:W12:l:1:f:6:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:6:cf:2\ncell:C13:l:3:f:6:cf:2\ncell:D13:t:Clothes:l:3:f:5:cf:2\ncell:E13:v:142:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F13:vtf:n:1704:IF( (E13*12)=0,"",(E13*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:6:cf:2\ncell:P13:l:1:f:6:cf:2\ncell:Q13:l:1:f:6:cf:2\ncell:R13:l:1:f:6:cf:2\ncell:S13:l:1:f:6:cf:2\ncell:T13:l:1:f:6:cf:2\ncell:U13:l:1:f:6:cf:2\ncell:V13:l:1:f:6:cf:2\ncell:W13:l:1:f:6:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:6:bg:3:cf:2\ncell:C14:l:3:f:6:bg:3:cf:2\ncell:D14:t:Footwear:l:3:f:5:bg:3:cf:2\ncell:E14:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F14:vtf:t::IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:6:cf:2\ncell:P14:l:1:f:6:cf:2\ncell:Q14:l:1:f:6:cf:2\ncell:R14:l:1:f:6:cf:2\ncell:S14:l:1:f:6:cf:2\ncell:T14:l:1:f:6:cf:2\ncell:U14:l:1:f:6:cf:2\ncell:V14:l:1:f:6:cf:2\ncell:W14:l:1:f:6:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:6:cf:2\ncell:C15:l:3:f:6:cf:2\ncell:D15:t:Salon and Personal Care:l:3:f:5:cf:2\ncell:E15:v:49:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F15:vtf:n:588:IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:6:cf:2\ncell:P15:l:1:f:6:cf:2\ncell:Q15:l:1:f:6:cf:2\ncell:R15:l:1:f:6:cf:2\ncell:S15:l:1:f:6:cf:2\ncell:T15:l:1:f:6:cf:2\ncell:U15:l:1:f:6:cf:2\ncell:V15:l:1:f:6:cf:2\ncell:W15:l:1:f:6:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:6:bg:3:cf:2\ncell:C16:l:3:f:6:bg:3:cf:2\ncell:D16:t:Other:l:3:f:5:bg:3:cf:2\ncell:E16:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:6:cf:2\ncell:P16:l:1:f:6:cf:2\ncell:Q16:l:1:f:6:cf:2\ncell:R16:l:1:f:6:cf:2\ncell:S16:l:1:f:6:cf:2\ncell:T16:l:1:f:6:cf:2\ncell:U16:l:1:f:6:cf:2\ncell:V16:l:1:f:6:cf:2\ncell:W16:l:1:f:6:cf:2\ncell:B17:t:Transportation:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C17:l:3:f:2:c:4:bg:2:cf:2\ncell:D17:l:3:f:2:c:4:bg:2:cf:1\ncell:E17:vtf:n:640:SUM(E18\\cE25):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F17:vtf:n:7680:IF( (E17*12)=0,"",(E17*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O17:l:1:f:6:cf:2\ncell:P17:l:1:f:6:cf:2\ncell:Q17:l:1:f:6:cf:2\ncell:R17:l:1:f:6:cf:2\ncell:S17:l:1:f:6:cf:2\ncell:T17:l:1:f:6:cf:2\ncell:U17:l:1:f:6:cf:2\ncell:V17:l:1:f:6:cf:2\ncell:W17:l:1:f:6:cf:2\ncell:A18:b::1::\ncell:B18:b::::1:l:3:f:6:bg:4:cf:2\ncell:C18:l:3:f:6:bg:4:cf:2\ncell:D18:t:Owned Vehicle Payments:l:3:f:5:bg:4:cf:2\ncell:E18:v:640:b::1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F18:vtf:n:7680:IF( (E18*12)=0,"",(E18*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O18:l:1:f:6:cf:2\ncell:P18:l:1:f:6:cf:2\ncell:Q18:l:1:f:6:cf:2\ncell:R18:l:1:f:6:cf:2\ncell:S18:l:1:f:6:cf:2\ncell:T18:l:1:f:6:cf:2\ncell:U18:l:1:f:6:cf:2\ncell:V18:l:1:f:6:cf:2\ncell:W18:l:1:f:6:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:6:bg:3:cf:2\ncell:C19:l:3:f:6:bg:3:cf:2\ncell:D19:t:Rentals, Lease Payments:l:3:f:5:bg:3:cf:2\ncell:E19:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F19:vtf:t::IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O19:l:1:f:6:cf:2\ncell:P19:l:1:f:6:cf:2\ncell:Q19:l:1:f:6:cf:2\ncell:R19:l:1:f:6:cf:2\ncell:S19:l:1:f:6:cf:2\ncell:T19:l:1:f:6:cf:2\ncell:U19:l:1:f:6:cf:2\ncell:V19:l:1:f:6:cf:2\ncell:W19:l:1:f:6:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:6:bg:4:cf:2\ncell:C20:l:3:f:6:bg:4:cf:2\ncell:D20:t:Gas & Oil:l:3:f:5:bg:4:cf:2\ncell:E20:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O20:l:1:f:6:cf:2\ncell:P20:l:1:f:6:cf:2\ncell:Q20:l:1:f:6:cf:2\ncell:R20:l:1:f:6:cf:2\ncell:S20:l:1:f:6:cf:2\ncell:T20:l:1:f:6:cf:2\ncell:U20:l:1:f:6:cf:2\ncell:V20:l:1:f:6:cf:2\ncell:W20:l:1:f:6:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:6:bg:3:cf:2\ncell:C21:l:3:f:6:bg:3:cf:2\ncell:D21:t:Maintenance & Repairs:l:3:f:5:bg:3:cf:2\ncell:E21:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O21:l:1:f:6:cf:2\ncell:P21:l:1:f:6:cf:2\ncell:Q21:l:1:f:6:cf:2\ncell:R21:l:1:f:6:cf:2\ncell:S21:l:1:f:6:cf:2\ncell:T21:l:1:f:6:cf:2\ncell:U21:l:1:f:6:cf:2\ncell:V21:l:1:f:6:cf:2\ncell:W21:l:1:f:6:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:6:bg:4:cf:2\ncell:C22:l:3:f:6:bg:4:cf:2\ncell:D22:t:Vehicle Insurance:l:3:f:5:bg:4:cf:2\ncell:E22:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O22:l:1:f:6:cf:2\ncell:P22:l:1:f:6:cf:2\ncell:Q22:l:1:f:6:cf:2\ncell:R22:l:1:f:6:cf:2\ncell:S22:l:1:f:6:cf:2\ncell:T22:l:1:f:6:cf:2\ncell:U22:l:1:f:6:cf:2\ncell:V22:l:1:f:6:cf:2\ncell:W22:l:1:f:6:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:6:bg:3:cf:2\ncell:C23:l:3:f:6:bg:3:cf:2\ncell:D23:t:License, Registration:l:3:f:5:bg:3:cf:2\ncell:E23:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O23:l:1:f:6:cf:2\ncell:P23:l:1:f:6:cf:2\ncell:Q23:l:1:f:6:cf:2\ncell:R23:l:1:f:6:cf:2\ncell:S23:l:1:f:6:cf:2\ncell:T23:l:1:f:6:cf:2\ncell:U23:l:1:f:6:cf:2\ncell:V23:l:1:f:6:cf:2\ncell:W23:l:1:f:6:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:6:bg:4:cf:2\ncell:C24:l:3:f:6:bg:4:cf:2\ncell:D24:t:Commuting Expense:l:3:f:5:bg:4:cf:2\ncell:E24:b:1:1:1:1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:5:bg:4:cf:3:ntvf:1\ncell:O24:l:1:f:6:cf:2\ncell:P24:l:1:f:6:cf:2\ncell:Q24:l:1:f:6:cf:2\ncell:R24:l:1:f:6:cf:2\ncell:S24:l:1:f:6:cf:2\ncell:T24:l:1:f:6:cf:2\ncell:U24:l:1:f:6:cf:2\ncell:V24:l:1:f:6:cf:2\ncell:W24:l:1:f:6:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:6:bg:3:cf:2\ncell:C25:l:3:f:6:bg:3:cf:2\ncell:D25:t:Other:l:3:f:5:bg:3:cf:2\ncell:E25:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F25:vtf:t::IF( (E25*12)=0,"",(E25*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:O25:l:1:f:6:cf:2\ncell:P25:l:1:f:6:cf:2\ncell:Q25:l:1:f:6:cf:2\ncell:R25:l:1:f:6:cf:2\ncell:S25:l:1:f:6:cf:2\ncell:T25:l:1:f:6:cf:2\ncell:U25:l:1:f:6:cf:2\ncell:V25:l:1:f:6:cf:2\ncell:W25:l:1:f:6:cf:2\ncell:B26:t:Healthcare:l:3:f:2:c:4:bg:2:cf:2:colspan:3\ncell:C26:l:3:f:2:c:4:bg:2:cf:2\ncell:D26:l:3:f:2:c:4:bg:2:cf:1\ncell:E26:vtf:n:263:SUM(E27\\cE31):b:2:2:2:2:l:4:f:2:c:4:bg:2:ntvf:1\ncell:F26:vtf:n:3156:IF( (E26*12)=0,"",(E26*12)):b:2:2:2:2:l:4:f:2:c:4:bg:2:cf:3:ntvf:1\ncell:O26:l:1:f:6:cf:2\ncell:P26:l:1:f:6:cf:2\ncell:Q26:l:1:f:6:cf:2\ncell:R26:l:1:f:6:cf:2\ncell:S26:l:1:f:6:cf:2\ncell:T26:l:1:f:6:cf:2\ncell:U26:l:1:f:6:cf:2\ncell:V26:l:1:f:6:cf:2\ncell:W26:l:1:f:6:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:6:cf:2\ncell:C27:l:3:f:6:cf:2\ncell:D27:t:Health Insurance:l:3:f:5:cf:2\ncell:E27:v:263:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F27:vtf:n:3156:IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:6:cf:2\ncell:P27:l:1:f:6:cf:2\ncell:Q27:l:1:f:6:cf:2\ncell:R27:l:1:f:6:cf:2\ncell:S27:l:1:f:6:cf:2\ncell:T27:l:1:f:6:cf:2\ncell:U27:l:1:f:6:cf:2\ncell:V27:l:1:f:6:cf:2\ncell:W27:l:1:f:6:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:6:bg:3:cf:2\ncell:C28:l:3:f:6:bg:3:cf:2\ncell:D28:t:Medical Services:l:3:f:5:bg:3:cf:2\ncell:E28:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:6:cf:2\ncell:P28:l:1:f:6:cf:2\ncell:Q28:l:1:f:6:cf:2\ncell:R28:l:1:f:6:cf:2\ncell:S28:l:1:f:6:cf:2\ncell:T28:l:1:f:6:cf:2\ncell:U28:l:1:f:6:cf:2\ncell:V28:l:1:f:6:cf:2\ncell:W28:l:1:f:6:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:6:cf:2\ncell:C29:l:3:f:6:cf:2\ncell:D29:t:Medicine, Drugs & Supplies:l:3:f:5:cf:2\ncell:E29:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:6:cf:2\ncell:P29:l:1:f:6:cf:2\ncell:Q29:l:1:f:6:cf:2\ncell:R29:l:1:f:6:cf:2\ncell:S29:l:1:f:6:cf:2\ncell:T29:l:1:f:6:cf:2\ncell:U29:l:1:f:6:cf:2\ncell:V29:l:1:f:6:cf:2\ncell:W29:l:1:f:6:cf:2\ncell:A30:b::1::\ncell:B30:b::::1:l:3:f:6:bg:3:cf:2\ncell:C30:l:3:f:6:bg:3:cf:2\ncell:D30:t:Heathclub Memberships:l:3:f:5:bg:3:cf:2\ncell:E30:b:1:1:1:1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1::1:l:4:f:5:bg:3:cf:3:ntvf:1\ncell:G30:b::::1\ncell:O30:l:1:f:6:cf:2\ncell:P30:l:1:f:6:cf:2\ncell:Q30:l:1:f:6:cf:2\ncell:R30:l:1:f:6:cf:2\ncell:S30:l:1:f:6:cf:2\ncell:T30:l:1:f:6:cf:2\ncell:U30:l:1:f:6:cf:2\ncell:V30:l:1:f:6:cf:2\ncell:W30:l:1:f:6:cf:2\ncell:A31:b::1::\ncell:B31:b:::1:1:l:3:f:6:cf:2\ncell:C31:b:::1::l:3:f:6:cf:2\ncell:D31:t:Other:b:::1::l:3:f:5:cf:2\ncell:E31:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:G31:b::::1\ncell:O31:l:1:f:6:cf:2\ncell:P31:l:1:f:6:cf:2\ncell:Q31:l:1:f:6:cf:2\ncell:R31:l:1:f:6:cf:2\ncell:S31:l:1:f:6:cf:2\ncell:T31:l:1:f:6:cf:2\ncell:U31:l:1:f:6:cf:2\ncell:V31:l:1:f:6:cf:2\ncell:W31:l:1:f:6:cf:2\ncell:B32:b:1:::\ncell:C32:b:1:::\ncell:D32:b:1:::\ncell:O32:l:1:f:6:cf:2\ncell:P32:l:1:f:6:cf:2\ncell:Q32:l:1:f:6:cf:2\ncell:R32:l:1:f:6:cf:2\ncell:S32:l:1:f:6:cf:2\ncell:T32:l:1:f:6:cf:2\ncell:U32:l:1:f:6:cf:2\ncell:V32:l:1:f:6:cf:2\ncell:W32:l:1:f:6:cf:2\ncell:O33:l:1:f:6:cf:2\ncell:P33:l:1:f:6:cf:2\ncell:Q33:l:1:f:6:cf:2\ncell:R33:l:1:f:6:cf:2\ncell:S33:l:1:f:6:cf:2\ncell:T33:l:1:f:6:cf:2\ncell:U33:l:1:f:6:cf:2\ncell:V33:l:1:f:6:cf:2\ncell:W33:l:1:f:6:cf:2\ncell:O34:l:1:f:6:cf:2\ncell:P34:l:1:f:6:cf:2\ncell:Q34:l:1:f:6:cf:2\ncell:R34:l:1:f:6:cf:2\ncell:S34:l:1:f:6:cf:2\ncell:T34:l:1:f:6:cf:2\ncell:U34:l:1:f:6:cf:2\ncell:V34:l:1:f:6:cf:2\ncell:W34:l:1:f:6:cf:2\ncell:O35:l:1:f:6:cf:2\ncell:P35:l:1:f:6:cf:2\ncell:Q35:l:1:f:6:cf:2\ncell:R35:l:1:f:6:cf:2\ncell:S35:l:1:f:6:cf:2\ncell:T35:l:1:f:6:cf:2\ncell:U35:l:1:f:6:cf:2\ncell:V35:l:1:f:6:cf:2\ncell:W35:l:1:f:6:cf:2\ncell:O36:l:1:f:6:cf:2\ncell:P36:l:1:f:6:cf:2\ncell:Q36:l:1:f:6:cf:2\ncell:R36:l:1:f:6:cf:2\ncell:S36:l:1:f:6:cf:2\ncell:T36:l:1:f:6:cf:2\ncell:U36:l:1:f:6:cf:2\ncell:V36:l:1:f:6:cf:2\ncell:W36:l:1:f:6:cf:2\ncell:O37:l:1:f:6:cf:2\ncell:P37:l:1:f:6:cf:2\ncell:Q37:l:1:f:6:cf:2\ncell:R37:l:1:f:6:cf:2\ncell:S37:l:1:f:6:cf:2\ncell:T37:l:1:f:6:cf:2\ncell:U37:l:1:f:6:cf:2\ncell:V37:l:1:f:6:cf:2\ncell:W37:l:1:f:6:cf:2\ncell:O38:l:1:f:6:cf:2\ncell:P38:l:1:f:6:cf:2\ncell:Q38:l:1:f:6:cf:2\ncell:R38:l:1:f:6:cf:2\ncell:S38:l:1:f:6:cf:2\ncell:T38:l:1:f:6:cf:2\ncell:U38:l:1:f:6:cf:2\ncell:V38:l:1:f:6:cf:2\ncell:W38:l:1:f:6:cf:2\ncell:O39:l:1:f:6:cf:2\ncell:P39:l:1:f:6:cf:2\ncell:Q39:l:1:f:6:cf:2\ncell:R39:l:1:f:6:cf:2\ncell:S39:l:1:f:6:cf:2\ncell:T39:l:1:f:6:cf:2\ncell:U39:l:1:f:6:cf:2\ncell:V39:l:1:f:6:cf:2\ncell:W39:l:1:f:6:cf:2\ncell:O40:l:1:f:6:cf:2\ncell:P40:l:1:f:6:cf:2\ncell:Q40:l:1:f:6:cf:2\ncell:R40:l:1:f:6:cf:2\ncell:S40:l:1:f:6:cf:2\ncell:T40:l:1:f:6:cf:2\ncell:U40:l:1:f:6:cf:2\ncell:V40:l:1:f:6:cf:2\ncell:W40:l:1:f:6:cf:2\ncell:O41:l:1:f:6:cf:2\ncell:P41:l:1:f:6:cf:2\ncell:Q41:l:1:f:6:cf:2\ncell:R41:l:1:f:6:cf:2\ncell:S41:l:1:f:6:cf:2\ncell:T41:l:1:f:6:cf:2\ncell:U41:l:1:f:6:cf:2\ncell:V41:l:1:f:6:cf:2\ncell:W41:l:1:f:6:cf:2\ncell:O42:l:1:f:6:cf:2\ncell:P42:l:1:f:6:cf:2\ncell:Q42:l:1:f:6:cf:2\ncell:R42:l:1:f:6:cf:2\ncell:S42:l:1:f:6:cf:2\ncell:T42:l:1:f:6:cf:2\ncell:U42:l:1:f:6:cf:2\ncell:V42:l:1:f:6:cf:2\ncell:W42:l:1:f:6:cf:2\ncell:O43:l:1:f:6:cf:2\ncell:P43:l:1:f:6:cf:2\ncell:Q43:l:1:f:6:cf:2\ncell:R43:l:1:f:6:cf:2\ncell:S43:l:1:f:6:cf:2\ncell:T43:l:1:f:6:cf:2\ncell:U43:l:1:f:6:cf:2\ncell:V43:l:1:f:6:cf:2\ncell:W43:l:1:f:6:cf:2\ncell:O44:l:1:f:6:cf:2\ncell:P44:l:1:f:6:cf:2\ncell:Q44:l:1:f:6:cf:2\ncell:R44:l:1:f:6:cf:2\ncell:S44:l:1:f:6:cf:2\ncell:T44:l:1:f:6:cf:2\ncell:U44:l:1:f:6:cf:2\ncell:V44:l:1:f:6:cf:2\ncell:W44:l:1:f:6:cf:2\ncell:O45:l:1:f:6:cf:2\ncell:P45:l:1:f:6:cf:2\ncell:Q45:l:1:f:6:cf:2\ncell:R45:l:1:f:6:cf:2\ncell:O46:l:1:f:6:cf:2\ncell:P46:l:1:f:6:cf:2\ncell:Q46:l:1:f:6:cf:2\ncell:R46:l:1:f:6:cf:2\ncell:O47:l:1:f:6:cf:2\ncell:P47:l:1:f:6:cf:2\ncell:Q47:l:1:f:6:cf:2\ncell:R47:l:1:f:6:cf:2\ncell:O48:l:1:f:6:cf:2\ncell:P48:l:1:f:6:cf:2\ncell:Q48:l:1:f:6:cf:2\ncell:R48:l:1:f:6:cf:2\ncell:O49:l:1:f:6:cf:2\ncell:P49:l:1:f:6:cf:2\ncell:Q49:l:1:f:6:cf:2\ncell:R49:l:1:f:6:cf:2\ncell:O50:l:1:f:6:cf:2\ncell:P50:l:1:f:6:cf:2\ncell:Q50:l:1:f:6:cf:2\ncell:R50:l:1:f:6:cf:2\ncell:O51:l:1:f:6:cf:2\ncell:P51:l:1:f:6:cf:2\ncell:Q51:l:1:f:6:cf:2\ncell:R51:l:1:f:6:cf:2\ncell:O52:l:1:f:6:cf:2\ncell:P52:l:1:f:6:cf:2\ncell:Q52:l:1:f:6:cf:2\ncell:R52:l:1:f:6:cf:2\ncell:O53:l:1:f:6:cf:2\ncell:P53:l:1:f:6:cf:2\ncell:Q53:l:1:f:6:cf:2\ncell:R53:l:1:f:6:cf:2\ncell:O54:l:1:f:6:cf:2\ncell:P54:l:1:f:6:cf:2\ncell:Q54:l:1:f:6:cf:2\ncell:R54:l:1:f:6:cf:2\ncell:O55:l:1:f:6:cf:2\ncell:P55:l:1:f:6:cf:2\ncell:Q55:l:1:f:6:cf:2\ncell:R55:l:1:f:6:cf:2\ncell:O56:l:1:f:6:cf:2\ncell:P56:l:1:f:6:cf:2\ncell:Q56:l:1:f:6:cf:2\ncell:R56:l:1:f:6:cf:2\ncell:O57:l:1:f:6:cf:2\ncell:P57:l:1:f:6:cf:2\ncell:Q57:l:1:f:6:cf:2\ncell:R57:l:1:f:6:cf:2\ncell:O58:l:1:f:6:cf:2\ncell:P58:l:1:f:6:cf:2\ncell:Q58:l:1:f:6:cf:2\ncell:R58:l:1:f:6:cf:2\ncell:B59:l:1:f:6:cf:2\ncell:C59:l:1:f:6:cf:2\ncell:D59:l:1:f:2:cf:2\ncell:E59:l:1:f:2:cf:3:ntvf:1\ncell:F59:l:1:f:2:cf:3:ntvf:1\ncell:O59:l:1:f:6:cf:2\ncell:P59:l:1:f:6:cf:2\ncell:Q59:l:1:f:6:cf:2\ncell:R59:l:1:f:6:cf:2\ncell:B60:l:1:f:4:cf:2\ncell:C60:l:1:f:4:cf:2\ncell:D60:l:1:f:8:cf:2\ncell:E60:l:1:f:8:cf:2\ncell:F60:l:1:f:6:cf:2\ncell:O60:l:1:f:6:cf:2\ncell:P60:l:1:f:6:cf:2\ncell:Q60:l:1:f:6:cf:2\ncell:R60:l:1:f:6:cf:2\ncell:O61:l:1:f:6:cf:2\ncell:P61:l:1:f:6:cf:2\ncell:Q61:l:1:f:6:cf:2\ncell:R61:l:1:f:6:cf:2\ncell:O62:l:1:f:6:cf:2\ncell:P62:l:1:f:6:cf:2\ncell:Q62:l:1:f:6:cf:2\ncell:R62:l:1:f:6:cf:2\ncell:O63:l:1:f:6:cf:2\ncell:P63:l:1:f:6:cf:2\ncell:Q63:l:1:f:6:cf:2\ncell:R63:l:1:f:6:cf:2\ncell:O64:l:1:f:6:cf:2\ncell:P64:l:1:f:6:cf:2\ncell:Q64:l:1:f:6:cf:2\ncell:R64:l:1:f:6:cf:2\ncell:O65:l:1:f:6:cf:2\ncell:P65:l:1:f:6:cf:2\ncell:Q65:l:1:f:6:cf:2\ncell:R65:l:1:f:6:cf:2\ncell:O66:l:1:f:6:cf:2\ncell:P66:l:1:f:6:cf:2\ncell:Q66:l:1:f:6:cf:2\ncell:R66:l:1:f:6:cf:2\ncell:O67:l:1:f:6:cf:2\ncell:P67:l:1:f:6:cf:2\ncell:Q67:l:1:f:6:cf:2\ncell:R67:l:1:f:6:cf:2\ncell:O68:l:1:f:6:cf:2\ncell:P68:l:1:f:6:cf:2\ncell:Q68:l:1:f:6:cf:2\ncell:R68:l:1:f:6:cf:2\ncell:O69:l:1:f:6:cf:2\ncell:P69:l:1:f:6:cf:2\ncell:Q69:l:1:f:6:cf:2\ncell:R69:l:1:f:6:cf:2\ncell:O70:l:1:f:6:cf:2\ncell:P70:l:1:f:6:cf:2\ncell:Q70:l:1:f:6:cf:2\ncell:R70:l:1:f:6:cf:2\ncell:S70:l:1:f:6:cf:2\ncell:T70:l:1:f:6:cf:2\ncell:U70:l:1:f:6:cf:2\ncell:V70:l:1:f:6:cf:2\ncell:W70:l:1:f:6:cf:2\ncell:O71:l:1:f:6:cf:2\ncell:P71:l:1:f:6:cf:2\ncell:Q71:l:1:f:6:cf:2\ncell:R71:l:1:f:6:cf:2\ncell:S71:l:1:f:6:cf:2\ncell:T71:l:1:f:6:cf:2\ncell:U71:l:1:f:6:cf:2\ncell:V71:l:1:f:6:cf:2\ncell:W71:l:1:f:6:cf:2\ncell:O72:l:1:f:6:cf:2\ncell:P72:l:1:f:6:cf:2\ncell:Q72:l:1:f:6:cf:2\ncell:R72:l:1:f:6:cf:2\ncell:S72:l:1:f:6:cf:2\ncell:T72:l:1:f:6:cf:2\ncell:U72:l:1:f:6:cf:2\ncell:V72:l:1:f:6:cf:2\ncell:W72:l:1:f:6:cf:2\ncell:O73:l:1:f:6:cf:2\ncell:P73:l:1:f:6:cf:2\ncell:Q73:l:1:f:6:cf:2\ncell:R73:l:1:f:6:cf:2\ncell:S73:l:1:f:6:cf:2\ncell:T73:l:1:f:6:cf:2\ncell:U73:l:1:f:6:cf:2\ncell:V73:l:1:f:6:cf:2\ncell:W73:l:1:f:6:cf:2\ncell:O74:l:1:f:6:cf:2\ncell:P74:l:1:f:6:cf:2\ncell:Q74:l:1:f:6:cf:2\ncell:R74:l:1:f:6:cf:2\ncell:S74:l:1:f:6:cf:2\ncell:T74:l:1:f:6:cf:2\ncell:U74:l:1:f:6:cf:2\ncell:V74:l:1:f:6:cf:2\ncell:W74:l:1:f:6:cf:2\ncell:O75:l:1:f:6:cf:2\ncell:P75:l:1:f:6:cf:2\ncell:Q75:l:1:f:6:cf:2\ncell:R75:l:1:f:6:cf:2\ncell:S75:l:1:f:6:cf:2\ncell:T75:l:1:f:6:cf:2\ncell:U75:l:1:f:6:cf:2\ncell:V75:l:1:f:6:cf:2\ncell:W75:l:1:f:6:cf:2\ncell:O76:l:1:f:6:cf:2\ncell:P76:l:1:f:6:cf:2\ncell:Q76:l:1:f:6:cf:2\ncell:R76:l:1:f:6:cf:2\ncell:S76:l:1:f:6:cf:2\ncell:T76:l:1:f:6:cf:2\ncell:U76:l:1:f:6:cf:2\ncell:V76:l:1:f:6:cf:2\ncell:W76:l:1:f:6:cf:2\ncell:O77:l:1:f:6:cf:2\ncell:P77:l:1:f:6:cf:2\ncell:Q77:l:1:f:6:cf:2\ncell:R77:l:1:f:6:cf:2\ncell:S77:l:1:f:6:cf:2\ncell:T77:l:1:f:6:cf:2\ncell:U77:l:1:f:6:cf:2\ncell:V77:l:1:f:6:cf:2\ncell:W77:l:1:f:6:cf:2\ncell:O78:l:1:f:6:cf:2\ncell:P78:l:1:f:6:cf:2\ncell:Q78:l:1:f:6:cf:2\ncell:R78:l:1:f:6:cf:2\ncell:S78:l:1:f:6:cf:2\ncell:T78:l:1:f:6:cf:2\ncell:U78:l:1:f:6:cf:2\ncell:V78:l:1:f:6:cf:2\ncell:W78:l:1:f:6:cf:2\ncell:O79:l:1:f:6:cf:2\ncell:P79:l:1:f:6:cf:2\ncell:Q79:l:1:f:6:cf:2\ncell:R79:l:1:f:6:cf:2\ncell:S79:l:1:f:6:cf:2\ncell:T79:l:1:f:6:cf:2\ncell:U79:l:1:f:6:cf:2\ncell:V79:l:1:f:6:cf:2\ncell:W79:l:1:f:6:cf:2\ncell:O80:l:1:f:6:cf:2\ncell:P80:l:1:f:6:cf:2\ncell:Q80:l:1:f:6:cf:2\ncell:R80:l:1:f:6:cf:2\ncell:S80:l:1:f:6:cf:2\ncell:T80:l:1:f:6:cf:2\ncell:U80:l:1:f:6:cf:2\ncell:V80:l:1:f:6:cf:2\ncell:W80:l:1:f:6:cf:2\ncell:O81:l:1:f:6:cf:2\ncell:P81:l:1:f:6:cf:2\ncell:Q81:l:1:f:6:cf:2\ncell:R81:l:1:f:6:cf:2\ncell:S81:l:1:f:6:cf:2\ncell:T81:l:1:f:6:cf:2\ncell:U81:l:1:f:6:cf:2\ncell:V81:l:1:f:6:cf:2\ncell:W81:l:1:f:6:cf:2\ncell:O82:l:1:f:6:cf:2\ncell:P82:l:1:f:6:cf:2\ncell:Q82:l:1:f:6:cf:2\ncell:R82:l:1:f:6:cf:2\ncell:S82:l:1:f:6:cf:2\ncell:T82:l:1:f:6:cf:2\ncell:U82:l:1:f:6:cf:2\ncell:V82:l:1:f:6:cf:2\ncell:W82:l:1:f:6:cf:2\ncell:O83:l:1:f:6:cf:2\ncell:P83:l:1:f:6:cf:2\ncell:Q83:l:1:f:6:cf:2\ncell:R83:l:1:f:6:cf:2\ncell:S83:l:1:f:6:cf:2\ncell:T83:l:1:f:6:cf:2\ncell:U83:l:1:f:6:cf:2\ncell:V83:l:1:f:6:cf:2\ncell:W83:l:1:f:6:cf:2\ncell:O84:l:1:f:6:cf:2\ncell:P84:l:1:f:6:cf:2\ncell:Q84:l:1:f:6:cf:2\ncell:R84:l:1:f:6:cf:2\ncell:S84:l:1:f:6:cf:2\ncell:T84:l:1:f:6:cf:2\ncell:U84:l:1:f:6:cf:2\ncell:V84:l:1:f:6:cf:2\ncell:W84:l:1:f:6:cf:2\ncell:O85:l:1:f:6:cf:2\ncell:P85:l:1:f:6:cf:2\ncell:Q85:l:1:f:6:cf:2\ncell:R85:l:1:f:6:cf:2\ncell:S85:l:1:f:6:cf:2\ncell:T85:l:1:f:6:cf:2\ncell:U85:l:1:f:6:cf:2\ncell:V85:l:1:f:6:cf:2\ncell:W85:l:1:f:6:cf:2\ncell:O86:l:1:f:6:cf:2\ncell:P86:l:1:f:6:cf:2\ncell:Q86:l:1:f:6:cf:2\ncell:R86:l:1:f:6:cf:2\ncell:S86:l:1:f:6:cf:2\ncell:T86:l:1:f:6:cf:2\ncell:U86:l:1:f:6:cf:2\ncell:V86:l:1:f:6:cf:2\ncell:W86:l:1:f:6:cf:2\ncell:O87:l:1:f:6:cf:2\ncell:P87:l:1:f:6:cf:2\ncell:Q87:l:1:f:6:cf:2\ncell:R87:l:1:f:6:cf:2\ncell:S87:l:1:f:6:cf:2\ncell:T87:l:1:f:6:cf:2\ncell:U87:l:1:f:6:cf:2\ncell:V87:l:1:f:6:cf:2\ncell:W87:l:1:f:6:cf:2\ncell:O88:l:1:f:6:cf:2\ncell:P88:l:1:f:6:cf:2\ncell:Q88:l:1:f:6:cf:2\ncell:R88:l:1:f:6:cf:2\ncell:S88:l:1:f:6:cf:2\ncell:T88:l:1:f:6:cf:2\ncell:U88:l:1:f:6:cf:2\ncell:V88:l:1:f:6:cf:2\ncell:W88:l:1:f:6:cf:2\ncell:O89:l:1:f:6:cf:2\ncell:P89:l:1:f:6:cf:2\ncell:Q89:l:1:f:6:cf:2\ncell:R89:l:1:f:6:cf:2\ncell:S89:l:1:f:6:cf:2\ncell:T89:l:1:f:6:cf:2\ncell:U89:l:1:f:6:cf:2\ncell:V89:l:1:f:6:cf:2\ncell:W89:l:1:f:6:cf:2\ncell:O90:l:1:f:6:cf:2\ncell:P90:l:1:f:6:cf:2\ncell:Q90:l:1:f:6:cf:2\ncell:R90:l:1:f:6:cf:2\ncell:S90:l:1:f:6:cf:2\ncell:T90:l:1:f:6:cf:2\ncell:U90:l:1:f:6:cf:2\ncell:V90:l:1:f:6:cf:2\ncell:W90:l:1:f:6:cf:2\ncell:O91:l:1:f:6:cf:2\ncell:P91:l:1:f:6:cf:2\ncell:Q91:l:1:f:6:cf:2\ncell:R91:l:1:f:6:cf:2\ncell:S91:l:1:f:6:cf:2\ncell:T91:l:1:f:6:cf:2\ncell:U91:l:1:f:6:cf:2\ncell:V91:l:1:f:6:cf:2\ncell:W91:l:1:f:6:cf:2\ncell:O92:l:1:f:6:cf:2\ncell:P92:l:1:f:6:cf:2\ncell:Q92:l:1:f:6:cf:2\ncell:R92:l:1:f:6:cf:2\ncell:S92:l:1:f:6:cf:2\ncell:T92:l:1:f:6:cf:2\ncell:U92:l:1:f:6:cf:2\ncell:V92:l:1:f:6:cf:2\ncell:W92:l:1:f:6:cf:2\ncell:O93:l:1:f:6:cf:2\ncell:P93:l:1:f:6:cf:2\ncell:Q93:l:1:f:6:cf:2\ncell:R93:l:1:f:6:cf:2\ncell:S93:l:1:f:6:cf:2\ncell:T93:l:1:f:6:cf:2\ncell:U93:l:1:f:6:cf:2\ncell:V93:l:1:f:6:cf:2\ncell:W93:l:1:f:6:cf:2\ncell:O94:l:1:f:6:cf:2\ncell:P94:l:1:f:6:cf:2\ncell:Q94:l:1:f:6:cf:2\ncell:R94:l:1:f:6:cf:2\ncell:S94:l:1:f:6:cf:2\ncell:T94:l:1:f:6:cf:2\ncell:U94:l:1:f:6:cf:2\ncell:V94:l:1:f:6:cf:2\ncell:W94:l:1:f:6:cf:2\ncell:O95:l:1:f:6:cf:2\ncell:P95:l:1:f:6:cf:2\ncell:Q95:l:1:f:6:cf:2\ncell:R95:l:1:f:6:cf:2\ncell:S95:l:1:f:6:cf:2\ncell:T95:l:1:f:6:cf:2\ncell:U95:l:1:f:6:cf:2\ncell:V95:l:1:f:6:cf:2\ncell:W95:l:1:f:6:cf:2\ncell:O96:l:1:f:6:cf:2\ncell:P96:l:1:f:6:cf:2\ncell:Q96:l:1:f:6:cf:2\ncell:R96:l:1:f:6:cf:2\ncell:S96:l:1:f:6:cf:2\ncell:T96:l:1:f:6:cf:2\ncell:U96:l:1:f:6:cf:2\ncell:V96:l:1:f:6:cf:2\ncell:W96:l:1:f:6:cf:2\ncell:O97:l:1:f:6:cf:2\ncell:P97:l:1:f:6:cf:2\ncell:Q97:l:1:f:6:cf:2\ncell:R97:l:1:f:6:cf:2\ncell:S97:l:1:f:6:cf:2\ncell:T97:l:1:f:6:cf:2\ncell:U97:l:1:f:6:cf:2\ncell:V97:l:1:f:6:cf:2\ncell:W97:l:1:f:6:cf:2\ncell:O98:l:1:f:6:cf:2\ncell:P98:l:1:f:6:cf:2\ncell:Q98:l:1:f:6:cf:2\ncell:R98:l:1:f:6:cf:2\ncell:S98:l:1:f:6:cf:2\ncell:T98:l:1:f:6:cf:2\ncell:U98:l:1:f:6:cf:2\ncell:V98:l:1:f:6:cf:2\ncell:W98:l:1:f:6:cf:2\ncell:O99:l:1:f:6:cf:2\ncell:P99:l:1:f:6:cf:2\ncell:Q99:l:1:f:6:cf:2\ncell:R99:l:1:f:6:cf:2\ncell:S99:l:1:f:6:cf:2\ncell:T99:l:1:f:6:cf:2\ncell:U99:l:1:f:6:cf:2\ncell:V99:l:1:f:6:cf:2\ncell:W99:l:1:f:6:cf:2\ncell:O100:l:1:f:6:cf:2\ncell:P100:l:1:f:6:cf:2\ncell:Q100:l:1:f:6:cf:2\ncell:R100:l:1:f:6:cf:2\ncell:S100:l:1:f:6:cf:2\ncell:T100:l:1:f:6:cf:2\ncell:U100:l:1:f:6:cf:2\ncell:V100:l:1:f:6:cf:2\ncell:W100:l:1:f:6:cf:2\ncell:O101:l:1:f:6:cf:2\ncell:P101:l:1:f:6:cf:2\ncell:Q101:l:1:f:6:cf:2\ncell:R101:l:1:f:6:cf:2\ncell:S101:l:1:f:6:cf:2\ncell:T101:l:1:f:6:cf:2\ncell:U101:l:1:f:6:cf:2\ncell:V101:l:1:f:6:cf:2\ncell:W101:l:1:f:6:cf:2\ncell:O102:l:1:f:6:cf:2\ncell:P102:l:1:f:6:cf:2\ncell:Q102:l:1:f:6:cf:2\ncell:R102:l:1:f:6:cf:2\ncell:S102:l:1:f:6:cf:2\ncell:T102:l:1:f:6:cf:2\ncell:U102:l:1:f:6:cf:2\ncell:V102:l:1:f:6:cf:2\ncell:W102:l:1:f:6:cf:2\ncell:O103:l:1:f:6:cf:2\ncell:P103:l:1:f:6:cf:2\ncell:Q103:l:1:f:6:cf:2\ncell:R103:l:1:f:6:cf:2\ncell:S103:l:1:f:6:cf:2\ncell:T103:l:1:f:6:cf:2\ncell:U103:l:1:f:6:cf:2\ncell:V103:l:1:f:6:cf:2\ncell:W103:l:1:f:6:cf:2\ncell:O104:l:1:f:6:cf:2\ncell:P104:l:1:f:6:cf:2\ncell:Q104:l:1:f:6:cf:2\ncell:R104:l:1:f:6:cf:2\ncell:S104:l:1:f:6:cf:2\ncell:T104:l:1:f:6:cf:2\ncell:U104:l:1:f:6:cf:2\ncell:V104:l:1:f:6:cf:2\ncell:W104:l:1:f:6:cf:2\ncell:O105:l:1:f:6:cf:2\ncell:P105:l:1:f:6:cf:2\ncell:Q105:l:1:f:6:cf:2\ncell:R105:l:1:f:6:cf:2\ncell:S105:l:1:f:6:cf:2\ncell:T105:l:1:f:6:cf:2\ncell:U105:l:1:f:6:cf:2\ncell:V105:l:1:f:6:cf:2\ncell:W105:l:1:f:6:cf:2\ncell:O106:l:1:f:6:cf:2\ncell:P106:l:1:f:6:cf:2\ncell:Q106:l:1:f:6:cf:2\ncell:R106:l:1:f:6:cf:2\ncell:S106:l:1:f:6:cf:2\ncell:T106:l:1:f:6:cf:2\ncell:U106:l:1:f:6:cf:2\ncell:V106:l:1:f:6:cf:2\ncell:W106:l:1:f:6:cf:2\ncell:O107:l:1:f:6:cf:2\ncell:P107:l:1:f:6:cf:2\ncell:Q107:l:1:f:6:cf:2\ncell:R107:l:1:f:6:cf:2\ncell:S107:l:1:f:6:cf:2\ncell:T107:l:1:f:6:cf:2\ncell:U107:l:1:f:6:cf:2\ncell:V107:l:1:f:6:cf:2\ncell:W107:l:1:f:6:cf:2\ncell:O108:l:1:f:6:cf:2\ncell:P108:l:1:f:6:cf:2\ncell:Q108:l:1:f:6:cf:2\ncell:R108:l:1:f:6:cf:2\ncell:S108:l:1:f:6:cf:2\ncell:T108:l:1:f:6:cf:2\ncell:U108:l:1:f:6:cf:2\ncell:V108:l:1:f:6:cf:2\ncell:W108:l:1:f:6:cf:2\ncell:O109:l:1:f:6:cf:2\ncell:P109:l:1:f:6:cf:2\ncell:Q109:l:1:f:6:cf:2\ncell:R109:l:1:f:6:cf:2\ncell:S109:l:1:f:6:cf:2\ncell:T109:l:1:f:6:cf:2\ncell:U109:l:1:f:6:cf:2\ncell:V109:l:1:f:6:cf:2\ncell:W109:l:1:f:6:cf:2\ncell:O110:l:1:f:6:cf:2\ncell:P110:l:1:f:6:cf:2\ncell:Q110:l:1:f:6:cf:2\ncell:R110:l:1:f:6:cf:2\ncell:S110:l:1:f:6:cf:2\ncell:T110:l:1:f:6:cf:2\ncell:U110:l:1:f:6:cf:2\ncell:V110:l:1:f:6:cf:2\ncell:W110:l:1:f:6:cf:2\ncell:O111:l:1:f:6:cf:2\ncell:P111:l:1:f:6:cf:2\ncell:Q111:l:1:f:6:cf:2\ncell:R111:l:1:f:6:cf:2\ncell:S111:l:1:f:6:cf:2\ncell:T111:l:1:f:6:cf:2\ncell:U111:l:1:f:6:cf:2\ncell:V111:l:1:f:6:cf:2\ncell:W111:l:1:f:6:cf:2\ncell:O112:l:1:f:6:cf:2\ncell:P112:l:1:f:6:cf:2\ncell:Q112:l:1:f:6:cf:2\ncell:R112:l:1:f:6:cf:2\ncell:S112:l:1:f:6:cf:2\ncell:T112:l:1:f:6:cf:2\ncell:U112:l:1:f:6:cf:2\ncell:V112:l:1:f:6:cf:2\ncell:W112:l:1:f:6:cf:2\ncell:O113:l:1:f:6:cf:2\ncell:P113:l:1:f:6:cf:2\ncell:Q113:l:1:f:6:cf:2\ncell:R113:l:1:f:6:cf:2\ncell:S113:l:1:f:6:cf:2\ncell:T113:l:1:f:6:cf:2\ncell:U113:l:1:f:6:cf:2\ncell:V113:l:1:f:6:cf:2\ncell:W113:l:1:f:6:cf:2\ncell:O114:l:1:f:6:cf:2\ncell:P114:l:1:f:6:cf:2\ncell:Q114:l:1:f:6:cf:2\ncell:R114:l:1:f:6:cf:2\ncell:S114:l:1:f:6:cf:2\ncell:T114:l:1:f:6:cf:2\ncell:U114:l:1:f:6:cf:2\ncell:V114:l:1:f:6:cf:2\ncell:W114:l:1:f:6:cf:2\ncell:O115:l:1:f:6:cf:2\ncell:P115:l:1:f:6:cf:2\ncell:Q115:l:1:f:6:cf:2\ncell:R115:l:1:f:6:cf:2\ncell:S115:l:1:f:6:cf:2\ncell:T115:l:1:f:6:cf:2\ncell:U115:l:1:f:6:cf:2\ncell:V115:l:1:f:6:cf:2\ncell:W115:l:1:f:6:cf:2\ncell:O116:l:1:f:6:cf:2\ncell:P116:l:1:f:6:cf:2\ncell:Q116:l:1:f:6:cf:2\ncell:R116:l:1:f:6:cf:2\ncell:S116:l:1:f:6:cf:2\ncell:T116:l:1:f:6:cf:2\ncell:U116:l:1:f:6:cf:2\ncell:V116:l:1:f:6:cf:2\ncell:W116:l:1:f:6:cf:2\ncell:O117:l:1:f:6:cf:2\ncell:P117:l:1:f:6:cf:2\ncell:Q117:l:1:f:6:cf:2\ncell:R117:l:1:f:6:cf:2\ncell:S117:l:1:f:6:cf:2\ncell:T117:l:1:f:6:cf:2\ncell:U117:l:1:f:6:cf:2\ncell:V117:l:1:f:6:cf:2\ncell:W117:l:1:f:6:cf:2\ncell:O118:l:1:f:6:cf:2\ncell:P118:l:1:f:6:cf:2\ncell:Q118:l:1:f:6:cf:2\ncell:R118:l:1:f:6:cf:2\ncell:S118:l:1:f:6:cf:2\ncell:T118:l:1:f:6:cf:2\ncell:U118:l:1:f:6:cf:2\ncell:V118:l:1:f:6:cf:2\ncell:W118:l:1:f:6:cf:2\ncell:O119:l:1:f:6:cf:2\ncell:P119:l:1:f:6:cf:2\ncell:Q119:l:1:f:6:cf:2\ncell:R119:l:1:f:6:cf:2\ncell:S119:l:1:f:6:cf:2\ncell:T119:l:1:f:6:cf:2\ncell:U119:l:1:f:6:cf:2\ncell:V119:l:1:f:6:cf:2\ncell:W119:l:1:f:6:cf:2\ncell:O120:l:1:f:6:cf:2\ncell:P120:l:1:f:6:cf:2\ncell:Q120:l:1:f:6:cf:2\ncell:R120:l:1:f:6:cf:2\ncell:S120:l:1:f:6:cf:2\ncell:T120:l:1:f:6:cf:2\ncell:U120:l:1:f:6:cf:2\ncell:V120:l:1:f:6:cf:2\ncell:W120:l:1:f:6:cf:2\ncell:O121:l:1:f:6:cf:2\ncell:P121:l:1:f:6:cf:2\ncell:Q121:l:1:f:6:cf:2\ncell:R121:l:1:f:6:cf:2\ncell:S121:l:1:f:6:cf:2\ncell:T121:l:1:f:6:cf:2\ncell:U121:l:1:f:6:cf:2\ncell:V121:l:1:f:6:cf:2\ncell:W121:l:1:f:6:cf:2\ncell:O122:l:1:f:7:cf:2\ncell:P122:l:1:f:7:cf:2\ncell:Q122:l:1:f:7:cf:2\ncell:R122:l:1:f:7:cf:2\ncell:S122:l:1:f:7:cf:2\ncell:T122:l:1:f:7:cf:2\ncell:U122:l:1:f:7:cf:2\ncell:V122:l:1:f:7:cf:2\ncell:W122:l:1:f:7:cf:2\ncell:O123:l:1:f:7:cf:2\ncell:P123:l:1:f:7:cf:2\ncell:Q123:l:1:f:7:cf:2\ncell:R123:l:1:f:7:cf:2\ncell:S123:l:1:f:7:cf:2\ncell:T123:l:1:f:7:cf:2\ncell:U123:l:1:f:7:cf:2\ncell:V123:l:1:f:7:cf:2\ncell:W123:l:1:f:7:cf:2\ncell:O124:l:1:f:7:cf:2\ncell:P124:l:1:f:7:cf:2\ncell:Q124:l:1:f:7:cf:2\ncell:R124:l:1:f:7:cf:2\ncell:S124:l:1:f:7:cf:2\ncell:T124:l:1:f:7:cf:2\ncell:U124:l:1:f:7:cf:2\ncell:V124:l:1:f:7:cf:2\ncell:W124:l:1:f:7:cf:2\ncell:O125:l:1:f:7:cf:2\ncell:P125:l:1:f:7:cf:2\ncell:Q125:l:1:f:7:cf:2\ncell:R125:l:1:f:7:cf:2\ncell:S125:l:1:f:7:cf:2\ncell:T125:l:1:f:7:cf:2\ncell:U125:l:1:f:7:cf:2\ncell:V125:l:1:f:7:cf:2\ncell:W125:l:1:f:7:cf:2\ncell:A126:l:1:f:7:cf:2\ncell:B126:l:1:f:7:cf:2\ncell:C126:l:1:f:7:cf:2\ncell:D126:l:1:f:7:cf:2\ncell:E126:l:1:f:7:cf:2\ncell:F126:t:Monthly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G126:l:1:f:7:cf:2\ncell:H126:l:1:f:7:cf:2\ncell:I126:l:1:f:7:cf:2\ncell:J126:l:1:f:7:cf:2\ncell:K126:l:1:f:7:cf:2\ncell:L126:l:1:f:7:cf:2\ncell:M126:l:1:f:7:cf:2\ncell:N126:l:1:f:7:cf:2\ncell:O126:l:1:f:7:cf:2\ncell:P126:l:1:f:7:cf:2\ncell:Q126:l:1:f:7:cf:2\ncell:R126:l:1:f:7:cf:2\ncell:S126:l:1:f:7:cf:2\ncell:T126:l:1:f:7:cf:2\ncell:U126:l:1:f:7:cf:2\ncell:V126:l:1:f:7:cf:2\ncell:W126:l:1:f:7:cf:2\ncell:A127:l:1:f:7:cf:2\ncell:B127:l:1:f:7:cf:2\ncell:C127:l:1:f:7:cf:2\ncell:D127:l:1:f:7:cf:2\ncell:E127:l:1:f:7:cf:2\ncell:F127:t:Semi-Annually:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G127:l:1:f:7:cf:2\ncell:H127:l:1:f:7:cf:2\ncell:I127:l:1:f:7:cf:2\ncell:J127:l:1:f:7:cf:2\ncell:K127:l:1:f:7:cf:2\ncell:L127:l:1:f:7:cf:2\ncell:M127:l:1:f:7:cf:2\ncell:N127:l:1:f:7:cf:2\ncell:O127:l:1:f:7:cf:2\ncell:P127:l:1:f:7:cf:2\ncell:Q127:l:1:f:7:cf:2\ncell:R127:l:1:f:7:cf:2\ncell:S127:l:1:f:7:cf:2\ncell:T127:l:1:f:7:cf:2\ncell:U127:l:1:f:7:cf:2\ncell:V127:l:1:f:7:cf:2\ncell:W127:l:1:f:7:cf:2\ncell:A128:l:1:f:7:cf:2\ncell:B128:l:1:f:7:cf:2\ncell:C128:l:1:f:7:cf:2\ncell:D128:l:1:f:7:cf:2\ncell:E128:l:1:f:7:cf:2\ncell:F128:t:Quarterly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G128:l:1:f:7:cf:2\ncell:H128:l:1:f:7:cf:2\ncell:I128:l:1:f:7:cf:2\ncell:J128:l:1:f:7:cf:2\ncell:K128:l:1:f:7:cf:2\ncell:L128:l:1:f:7:cf:2\ncell:M128:l:1:f:7:cf:2\ncell:N128:l:1:f:7:cf:2\ncell:O128:l:1:f:7:cf:2\ncell:P128:l:1:f:7:cf:2\ncell:Q128:l:1:f:7:cf:2\ncell:R128:l:1:f:7:cf:2\ncell:S128:l:1:f:7:cf:2\ncell:T128:l:1:f:7:cf:2\ncell:U128:l:1:f:7:cf:2\ncell:V128:l:1:f:7:cf:2\ncell:W128:l:1:f:7:cf:2\ncell:A129:l:1:f:7:cf:2\ncell:B129:l:1:f:7:cf:2\ncell:C129:l:1:f:7:cf:2\ncell:D129:l:1:f:7:cf:2\ncell:E129:l:1:f:7:cf:2\ncell:F129:t:Yearly:l:1:f:7:cf:2:tvf:2:ntvf:2\ncell:G129:l:1:f:7:cf:2\ncell:H129:l:1:f:7:cf:2\ncell:I129:l:1:f:7:cf:2\ncell:J129:l:1:f:7:cf:2\ncell:K129:l:1:f:7:cf:2\ncell:L129:l:1:f:7:cf:2\ncell:M129:l:1:f:7:cf:2\ncell:N129:l:1:f:7:cf:2\ncell:O129:l:1:f:7:cf:2\ncell:P129:l:1:f:7:cf:2\ncell:Q129:l:1:f:7:cf:2\ncell:R129:l:1:f:7:cf:2\ncell:S129:l:1:f:7:cf:2\ncell:T129:l:1:f:7:cf:2\ncell:U129:l:1:f:7:cf:2\ncell:V129:l:1:f:7:cf:2\ncell:W129:l:1:f:7:cf:2\ncell:A130:l:1:f:7:cf:2\ncell:B130:l:1:f:7:cf:2\ncell:C130:l:1:f:7:cf:2\ncell:D130:l:1:f:7:cf:2\ncell:E130:l:1:f:7:cf:2\ncell:F130:l:1:f:7:cf:2\ncell:G130:l:1:f:7:cf:2\ncell:H130:l:1:f:7:cf:2\ncell:I130:l:1:f:7:cf:2\ncell:J130:l:1:f:7:cf:2\ncell:K130:l:1:f:7:cf:2\ncell:L130:l:1:f:7:cf:2\ncell:M130:l:1:f:7:cf:2\ncell:N130:l:1:f:7:cf:2\ncell:O130:l:1:f:7:cf:2\ncell:P130:l:1:f:7:cf:2\ncell:Q130:l:1:f:7:cf:2\ncell:R130:l:1:f:7:cf:2\ncell:S130:l:1:f:7:cf:2\ncell:T130:l:1:f:7:cf:2\ncell:U130:l:1:f:7:cf:2\ncell:V130:l:1:f:7:cf:2\ncell:W130:l:1:f:7:cf:2\ncell:A131:l:1:f:7:cf:2\ncell:B131:l:1:f:7:cf:2\ncell:C131:l:1:f:7:cf:2\ncell:D131:l:1:f:7:cf:2\ncell:E131:l:1:f:7:cf:2\ncell:F131:l:1:f:7:cf:2\ncell:G131:l:1:f:7:cf:2\ncell:H131:l:1:f:7:cf:2\ncell:I131:l:1:f:7:cf:2\ncell:J131:l:1:f:7:cf:2\ncell:K131:l:1:f:7:cf:2\ncell:L131:l:1:f:7:cf:2\ncell:M131:l:1:f:7:cf:2\ncell:N131:l:1:f:7:cf:2\ncell:O131:l:1:f:7:cf:2\ncell:P131:l:1:f:7:cf:2\ncell:Q131:l:1:f:7:cf:2\ncell:R131:l:1:f:7:cf:2\ncell:S131:l:1:f:7:cf:2\ncell:T131:l:1:f:7:cf:2\ncell:U131:l:1:f:7:cf:2\ncell:V131:l:1:f:7:cf:2\ncell:W131:l:1:f:7:cf:2\ncell:A132:l:1:f:7:cf:2\ncell:B132:l:1:f:7:cf:2\ncell:C132:l:1:f:7:cf:2\ncell:D132:l:1:f:7:cf:2\ncell:E132:l:1:f:7:cf:2\ncell:F132:l:1:f:7:cf:2\ncell:G132:l:1:f:7:cf:2\ncell:H132:l:1:f:7:cf:2\ncell:I132:l:1:f:7:cf:2\ncell:J132:l:1:f:7:cf:2\ncell:K132:l:1:f:7:cf:2\ncell:L132:l:1:f:7:cf:2\ncell:M132:l:1:f:7:cf:2\ncell:N132:l:1:f:7:cf:2\ncell:O132:l:1:f:7:cf:2\ncell:P132:l:1:f:7:cf:2\ncell:Q132:l:1:f:7:cf:2\ncell:R132:l:1:f:7:cf:2\ncell:S132:l:1:f:7:cf:2\ncell:T132:l:1:f:7:cf:2\ncell:U132:l:1:f:7:cf:2\ncell:V132:l:1:f:7:cf:2\ncell:W132:l:1:f:7:cf:2\ncell:A133:l:1:f:7:cf:2\ncell:B133:l:1:f:7:cf:2\ncell:C133:l:1:f:7:cf:2\ncell:D133:l:1:f:7:cf:2\ncell:E133:l:1:f:7:cf:2\ncell:F133:l:1:f:7:cf:2\ncell:G133:l:1:f:7:cf:2\ncell:H133:l:1:f:7:cf:2\ncell:I133:l:1:f:7:cf:2\ncell:J133:l:1:f:7:cf:2\ncell:K133:l:1:f:7:cf:2\ncell:L133:l:1:f:7:cf:2\ncell:M133:l:1:f:7:cf:2\ncell:N133:l:1:f:7:cf:2\ncell:O133:l:1:f:7:cf:2\ncell:P133:l:1:f:7:cf:2\ncell:Q133:l:1:f:7:cf:2\ncell:R133:l:1:f:7:cf:2\ncell:S133:l:1:f:7:cf:2\ncell:T133:l:1:f:7:cf:2\ncell:U133:l:1:f:7:cf:2\ncell:V133:l:1:f:7:cf:2\ncell:W133:l:1:f:7:cf:2\ncell:A134:l:1:f:7:cf:2\ncell:B134:l:1:f:7:cf:2\ncell:C134:l:1:f:7:cf:2\ncell:D134:l:1:f:7:cf:2\ncell:E134:l:1:f:7:cf:2\ncell:F134:l:1:f:7:cf:2\ncell:G134:l:1:f:7:cf:2\ncell:H134:l:1:f:7:cf:2\ncell:I134:l:1:f:7:cf:2\ncell:J134:l:1:f:7:cf:2\ncell:K134:l:1:f:7:cf:2\ncell:L134:l:1:f:7:cf:2\ncell:M134:l:1:f:7:cf:2\ncell:N134:l:1:f:7:cf:2\ncell:O134:l:1:f:7:cf:2\ncell:P134:l:1:f:7:cf:2\ncell:Q134:l:1:f:7:cf:2\ncell:R134:l:1:f:7:cf:2\ncell:S134:l:1:f:7:cf:2\ncell:T134:l:1:f:7:cf:2\ncell:U134:l:1:f:7:cf:2\ncell:V134:l:1:f:7:cf:2\ncell:W134:l:1:f:7:cf:2\ncell:A135:l:1:f:7:cf:2\ncell:B135:l:1:f:7:cf:2\ncell:C135:l:1:f:7:cf:2\ncell:D135:l:1:f:7:cf:2\ncell:E135:l:1:f:7:cf:2\ncell:F135:l:1:f:7:cf:2\ncell:G135:l:1:f:7:cf:2\ncell:H135:l:1:f:7:cf:2\ncell:I135:l:1:f:7:cf:2\ncell:J135:l:1:f:7:cf:2\ncell:K135:l:1:f:7:cf:2\ncell:L135:l:1:f:7:cf:2\ncell:M135:l:1:f:7:cf:2\ncell:N135:l:1:f:7:cf:2\ncell:O135:l:1:f:7:cf:2\ncell:P135:l:1:f:7:cf:2\ncell:Q135:l:1:f:7:cf:2\ncell:R135:l:1:f:7:cf:2\ncell:S135:l:1:f:7:cf:2\ncell:T135:l:1:f:7:cf:2\ncell:U135:l:1:f:7:cf:2\ncell:V135:l:1:f:7:cf:2\ncell:W135:l:1:f:7:cf:2\ncell:A136:l:1:f:7:cf:2\ncell:B136:l:1:f:7:cf:2\ncell:C136:l:1:f:7:cf:2\ncell:D136:l:1:f:7:cf:2\ncell:E136:l:1:f:7:cf:2\ncell:F136:l:1:f:7:cf:2\ncell:G136:l:1:f:7:cf:2\ncell:H136:l:1:f:7:cf:2\ncell:I136:l:1:f:7:cf:2\ncell:J136:l:1:f:7:cf:2\ncell:K136:l:1:f:7:cf:2\ncell:L136:l:1:f:7:cf:2\ncell:M136:l:1:f:7:cf:2\ncell:N136:l:1:f:7:cf:2\ncell:O136:l:1:f:7:cf:2\ncell:P136:l:1:f:7:cf:2\ncell:Q136:l:1:f:7:cf:2\ncell:R136:l:1:f:7:cf:2\ncell:S136:l:1:f:7:cf:2\ncell:T136:l:1:f:7:cf:2\ncell:U136:l:1:f:7:cf:2\ncell:V136:l:1:f:7:cf:2\ncell:W136:l:1:f:7:cf:2\ncell:A137:l:1:f:7:cf:2\ncell:B137:l:1:f:7:cf:2\ncell:C137:l:1:f:7:cf:2\ncell:D137:l:1:f:7:cf:2\ncell:E137:l:1:f:7:cf:2\ncell:F137:l:1:f:7:cf:2\ncell:G137:l:1:f:7:cf:2\ncell:H137:l:1:f:7:cf:2\ncell:I137:l:1:f:7:cf:2\ncell:J137:l:1:f:7:cf:2\ncell:K137:l:1:f:7:cf:2\ncell:L137:l:1:f:7:cf:2\ncell:M137:l:1:f:7:cf:2\ncell:N137:l:1:f:7:cf:2\ncell:O137:l:1:f:7:cf:2\ncell:P137:l:1:f:7:cf:2\ncell:Q137:l:1:f:7:cf:2\ncell:R137:l:1:f:7:cf:2\ncell:S137:l:1:f:7:cf:2\ncell:T137:l:1:f:7:cf:2\ncell:U137:l:1:f:7:cf:2\ncell:V137:l:1:f:7:cf:2\ncell:W137:l:1:f:7:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nrow:102:h:14.25\nrow:103:h:14.25\nrow:104:h:14.25\nrow:105:h:14.25\nrow:106:h:14.25\nrow:107:h:14.25\nrow:108:h:14.25\nrow:109:h:14.25\nrow:110:h:14.25\nrow:111:h:14.25\nrow:112:h:14.25\nrow:113:h:14.25\nrow:114:h:14.25\nrow:115:h:14.25\nrow:116:h:14.25\nrow:117:h:14.25\nrow:118:h:14.25\nrow:119:h:14.25\nrow:120:h:14.25\nrow:121:h:14.25\nsheet:c:27:r:137:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\ncolor:5:rgb(255,255,187)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 20pt Arial\nfont:4:normal bold 9pt Arial\nfont:5:normal normal * Arial\nfont:6:normal normal 10pt Arial\nfont:7:normal normal 7pt Arial\nfont:8:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nname:COMPARISON::S63\\cU77\nname:TRACKING::AC63\\cAE77\n', - }, - name: "sheet9", - hidden: "0", - }, - sheet5: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:7:cf:2:ntvf:2\ncell:B1:l:1:f:7:cf:2\ncell:C1:l:1:f:7:cf:2\ncell:D1:l:1:f:7:cf:2\ncell:E1:l:1:f:7:cf:2\ncell:F1:l:1:f:7:cf:2\ncell:G1:l:1:f:7:cf:2\ncell:H1:l:1:f:7:cf:2\ncell:I1:l:1:f:7:cf:2\ncell:J1:l:1:f:7:cf:2\ncell:K1:l:1:f:7:cf:2\ncell:L1:l:1:f:7:cf:2\ncell:M1:l:1:f:7:cf:2\ncell:N1:l:1:f:7:cf:2\ncell:O1:l:1:f:7:cf:2\ncell:P1:l:1:f:7:cf:2\ncell:Q1:l:1:f:7:cf:2\ncell:R1:l:1:f:7:cf:2\ncell:S1:l:1:f:7:cf:2\ncell:T1:l:1:f:7:cf:2\ncell:U1:l:1:f:7:cf:2\ncell:V1:l:1:f:7:cf:2\ncell:W1:l:1:f:7:cf:2\ncell:A2:l:1:f:7:cf:2\ncell:B2:l:1:f:7:cf:2\ncell:C2:l:1:f:7:cf:2\ncell:D2:t:Expenses:l:2:f:3:cf:2\ncell:E2:l:1:f:7:cf:2\ncell:F2:l:1:f:7:cf:2\ncell:G2:l:1:f:7:cf:2\ncell:H2:l:1:f:7:cf:2\ncell:I2:l:1:f:7:cf:2\ncell:J2:l:1:f:7:cf:2\ncell:K2:l:1:f:7:cf:2\ncell:L2:l:1:f:7:cf:2\ncell:M2:l:1:f:7:cf:2\ncell:N2:l:1:f:7:cf:2\ncell:O2:l:1:f:7:cf:2\ncell:P2:l:1:f:7:cf:2\ncell:Q2:l:1:f:7:cf:2\ncell:R2:l:1:f:7:cf:2\ncell:S2:l:1:f:7:cf:2\ncell:T2:l:1:f:7:cf:2\ncell:U2:l:1:f:7:cf:2\ncell:V2:l:1:f:7:cf:2\ncell:W2:l:1:f:7:cf:2\ncell:A3:l:1:f:7:cf:2\ncell:B3:l:1:f:7:cf:2\ncell:C3:l:1:f:7:cf:2\ncell:D3:l:1:f:7:cf:2\ncell:G3:l:1:f:7:cf:2\ncell:H3:l:1:f:7:cf:2\ncell:I3:l:1:f:7:cf:2\ncell:J3:l:1:f:7:cf:2\ncell:K3:l:1:f:7:cf:2\ncell:L3:l:1:f:7:cf:2\ncell:M3:l:1:f:7:cf:2\ncell:N3:l:1:f:7:cf:2\ncell:O3:l:1:f:7:cf:2\ncell:P3:l:1:f:7:cf:2\ncell:Q3:t: :l:1:f:7:cf:2\ncell:R3:l:1:f:7:cf:2\ncell:S3:l:1:f:7:cf:2\ncell:T3:l:1:f:7:cf:2\ncell:U3:l:1:f:7:cf:2\ncell:V3:l:1:f:7:cf:2\ncell:W3:l:1:f:7:cf:2\ncell:B4:t:Entertainment:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C4:l:3:f:2:c:3:bg:1:cf:2\ncell:D4:l:3:f:2:c:3:bg:1:cf:1\ncell:E4:vtf:n:209:SUM(E5\\cE12):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F4:vtf:n:2508:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O4:l:1:f:7:cf:2\ncell:P4:l:1:f:7:cf:2\ncell:Q4:l:1:f:7:cf:2\ncell:R4:l:1:f:7:cf:2\ncell:S4:l:1:f:7:cf:2\ncell:T4:l:1:f:7:cf:2\ncell:U4:l:1:f:7:cf:2\ncell:V4:l:1:f:7:cf:2\ncell:W4:l:1:f:7:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:7:cf:2\ncell:C5:l:3:f:7:cf:2\ncell:D5:t:Events/Movies/Theater:l:3:f:5:cf:2\ncell:E5:v:209:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F5:vtf:n:2508:IF( (E5*12)=0,"",(E5*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:7:cf:2\ncell:P5:l:1:f:7:cf:2\ncell:Q5:l:1:f:7:cf:2\ncell:R5:l:1:f:7:cf:2\ncell:S5:l:1:f:7:cf:2\ncell:T5:l:1:f:7:cf:2\ncell:U5:l:1:f:7:cf:2\ncell:V5:l:1:f:7:cf:2\ncell:W5:l:1:f:7:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:7:bg:2:cf:2\ncell:C6:l:3:f:7:bg:2:cf:2\ncell:D6:t:Music/Video:l:3:f:5:bg:2:cf:2\ncell:E6:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F6:vtf:t::IF( (E6*12)=0,"",(E6*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:7:cf:2\ncell:P6:l:1:f:7:cf:2\ncell:Q6:l:1:f:7:cf:2\ncell:R6:l:1:f:7:cf:2\ncell:S6:l:1:f:7:cf:2\ncell:T6:l:1:f:7:cf:2\ncell:U6:l:1:f:7:cf:2\ncell:V6:l:1:f:7:cf:2\ncell:W6:l:1:f:7:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:7:cf:2\ncell:C7:l:3:f:7:cf:2\ncell:D7:t:Books:l:3:f:5:cf:2\ncell:E7:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:7:cf:2\ncell:P7:l:1:f:7:cf:2\ncell:Q7:l:1:f:7:cf:2\ncell:R7:l:1:f:7:cf:2\ncell:S7:l:1:f:7:cf:2\ncell:T7:l:1:f:7:cf:2\ncell:U7:l:1:f:7:cf:2\ncell:V7:l:1:f:7:cf:2\ncell:W7:l:1:f:7:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:bg:2:cf:2\ncell:C8:l:3:f:7:bg:2:cf:2\ncell:D8:t:Pets:l:3:f:5:bg:2:cf:2\ncell:E8:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:7:cf:2\ncell:P8:l:1:f:7:cf:2\ncell:Q8:l:1:f:7:cf:2\ncell:R8:l:1:f:7:cf:2\ncell:S8:l:1:f:7:cf:2\ncell:T8:l:1:f:7:cf:2\ncell:U8:l:1:f:7:cf:2\ncell:V8:l:1:f:7:cf:2\ncell:W8:l:1:f:7:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:7:cf:2\ncell:C9:l:3:f:7:cf:2\ncell:D9:t:Hobbies:l:3:f:5:cf:2\ncell:E9:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F9:vtf:t::IF( (E9*12)=0,"",(E9*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:7:cf:2\ncell:P9:l:1:f:7:cf:2\ncell:Q9:l:1:f:7:cf:2\ncell:R9:l:1:f:7:cf:2\ncell:S9:l:1:f:7:cf:2\ncell:T9:l:1:f:7:cf:2\ncell:U9:l:1:f:7:cf:2\ncell:V9:l:1:f:7:cf:2\ncell:W9:l:1:f:7:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:7:bg:2:cf:2\ncell:C10:l:3:f:7:bg:2:cf:2\ncell:D10:t:Sports:l:3:f:5:bg:2:cf:2\ncell:E10:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:7:cf:2\ncell:P10:l:1:f:7:cf:2\ncell:Q10:l:1:f:7:cf:2\ncell:R10:l:1:f:7:cf:2\ncell:S10:l:1:f:7:cf:2\ncell:T10:l:1:f:7:cf:2\ncell:U10:l:1:f:7:cf:2\ncell:V10:l:1:f:7:cf:2\ncell:W10:l:1:f:7:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:7:cf:2\ncell:C11:l:3:f:7:cf:2\ncell:D11:t:Gadgets/Toys:l:3:f:5:cf:2\ncell:E11:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:7:cf:2\ncell:P11:l:1:f:7:cf:2\ncell:Q11:l:1:f:7:cf:2\ncell:R11:l:1:f:7:cf:2\ncell:S11:l:1:f:7:cf:2\ncell:T11:l:1:f:7:cf:2\ncell:U11:l:1:f:7:cf:2\ncell:V11:l:1:f:7:cf:2\ncell:W11:l:1:f:7:cf:2\ncell:A12:b::1::\ncell:B12:b::::1:l:3:f:7:bg:2:cf:2\ncell:C12:l:3:f:7:bg:2:cf:2\ncell:D12:t:Other:l:3:f:5:bg:2:cf:2\ncell:E12:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F12:vtf:t::IF( (E12*12)=0,"",(E12*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G12:b::::1\ncell:O12:l:1:f:7:cf:2\ncell:P12:l:1:f:7:cf:2\ncell:Q12:l:1:f:7:cf:2\ncell:R12:l:1:f:7:cf:2\ncell:S12:l:1:f:7:cf:2\ncell:T12:l:1:f:7:cf:2\ncell:U12:l:1:f:7:cf:2\ncell:V12:l:1:f:7:cf:2\ncell:W12:l:1:f:7:cf:2\ncell:B13:t:Education:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C13:l:3:f:2:c:3:bg:1:cf:2\ncell:D13:l:3:f:2:c:3:bg:1:cf:1\ncell:E13:vtf:n:98:SUM(E14\\cE17):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F13:vtf:n:1176:IF( (E13*12)=0,"",(E13*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O13:l:1:f:7:cf:2\ncell:P13:l:1:f:7:cf:2\ncell:Q13:l:1:f:7:cf:2\ncell:R13:l:1:f:7:cf:2\ncell:S13:l:1:f:7:cf:2\ncell:T13:l:1:f:7:cf:2\ncell:U13:l:1:f:7:cf:2\ncell:V13:l:1:f:7:cf:2\ncell:W13:l:1:f:7:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:cf:2\ncell:C14:l:3:f:7:cf:2\ncell:D14:t:Tuition & Fees:l:3:f:5:cf:2\ncell:E14:v:98:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F14:vtf:n:1176:IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:7:cf:2\ncell:P14:l:1:f:7:cf:2\ncell:Q14:l:1:f:7:cf:2\ncell:R14:l:1:f:7:cf:2\ncell:S14:l:1:f:7:cf:2\ncell:T14:l:1:f:7:cf:2\ncell:U14:l:1:f:7:cf:2\ncell:V14:l:1:f:7:cf:2\ncell:W14:l:1:f:7:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:7:bg:2:cf:2\ncell:C15:l:3:f:7:bg:2:cf:2\ncell:D15:t:Preschool:l:3:f:5:bg:2:cf:2\ncell:E15:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F15:vtf:t::IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:7:cf:2\ncell:P15:l:1:f:7:cf:2\ncell:Q15:l:1:f:7:cf:2\ncell:R15:l:1:f:7:cf:2\ncell:S15:l:1:f:7:cf:2\ncell:T15:l:1:f:7:cf:2\ncell:U15:l:1:f:7:cf:2\ncell:V15:l:1:f:7:cf:2\ncell:W15:l:1:f:7:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:7:cf:2\ncell:C16:l:3:f:7:cf:2\ncell:D16:t:Books & Supplies:l:3:f:5:cf:2\ncell:E16:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:7:cf:2\ncell:P16:l:1:f:7:cf:2\ncell:Q16:l:1:f:7:cf:2\ncell:R16:l:1:f:7:cf:2\ncell:S16:l:1:f:7:cf:2\ncell:T16:l:1:f:7:cf:2\ncell:U16:l:1:f:7:cf:2\ncell:V16:l:1:f:7:cf:2\ncell:W16:l:1:f:7:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:7:bg:2:cf:2\ncell:C17:l:3:f:7:bg:2:cf:2\ncell:D17:t:Other:l:3:f:5:bg:2:cf:2\ncell:E17:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:7:cf:2\ncell:P17:l:1:f:7:cf:2\ncell:Q17:l:1:f:7:cf:2\ncell:R17:l:1:f:7:cf:2\ncell:B18:t:Contributions, Donations, Gifts:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C18:l:3:f:2:c:3:bg:1:cf:2\ncell:D18:l:3:f:2:c:3:bg:1:cf:1\ncell:E18:vtf:n:222:SUM(E19\\cE21):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F18:vtf:n:2664:IF( (E18*12)=0,"",(E18*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O18:l:1:f:7:cf:2\ncell:P18:l:1:f:7:cf:2\ncell:Q18:l:1:f:7:cf:2\ncell:R18:l:1:f:7:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:7:cf:2\ncell:C19:l:3:f:7:cf:2\ncell:D19:t:Cash contributions:l:3:f:5:cf:2\ncell:E19:v:136:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F19:vtf:n:1632:IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:7:cf:2\ncell:P19:l:1:f:7:cf:2\ncell:Q19:l:1:f:7:cf:2\ncell:R19:l:1:f:7:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:7:bg:2:cf:2\ncell:C20:l:3:f:7:bg:2:cf:2\ncell:D20:t:Gifts:l:3:f:5:bg:2:cf:2\ncell:E20:v:86:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F20:vtf:n:1032:IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:7:cf:2\ncell:P20:l:1:f:7:cf:2\ncell:Q20:l:1:f:7:cf:2\ncell:R20:l:1:f:7:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:cf:2\ncell:C21:l:3:f:7:cf:2\ncell:D21:t:Other:l:3:f:5:cf:2\ncell:E21:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:7:cf:2\ncell:P21:l:1:f:7:cf:2\ncell:Q21:l:1:f:7:cf:2\ncell:R21:l:1:f:7:cf:2\ncell:B22:t:Debt:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C22:l:3:f:2:c:3:bg:1:cf:2\ncell:D22:l:3:f:2:c:3:bg:1:cf:1\ncell:E22:vtf:n:0:SUM(E23\\cE24):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O22:l:1:f:7:cf:2\ncell:P22:l:1:f:7:cf:2\ncell:Q22:l:1:f:7:cf:2\ncell:R22:l:1:f:7:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:7:cf:2\ncell:C23:l:3:f:7:cf:2\ncell:D23:t:Student loan payment:l:3:f:5:cf:2\ncell:E23:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:7:cf:2\ncell:P23:l:1:f:7:cf:2\ncell:Q23:l:1:f:7:cf:2\ncell:R23:l:1:f:7:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:7:bg:2:cf:2\ncell:C24:l:3:f:7:bg:2:cf:2\ncell:D24:t:Other loan & debt payment:l:3:f:5:bg:2:cf:2\ncell:E24:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:7:cf:2\ncell:P24:l:1:f:7:cf:2\ncell:Q24:l:1:f:7:cf:2\ncell:R24:l:1:f:7:cf:2\ncell:B25:t:Insurance:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C25:l:3:f:2:c:3:bg:1:cf:2\ncell:D25:l:3:f:2:c:3:bg:1:cf:1\ncell:E25:vtf:n:30:SUM(E26\\cE28):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F25:vtf:n:360:IF( (E25*12)=0,"",(E25*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O25:l:1:f:7:cf:2\ncell:P25:l:1:f:7:cf:2\ncell:Q25:l:1:f:7:cf:2\ncell:R25:l:1:f:7:cf:2\ncell:A26:b::1::\ncell:B26:b::::1:l:3:f:7:cf:2\ncell:C26:l:3:f:7:cf:2\ncell:D26:t:Health Insurance:l:3:f:5:cf:2\ncell:E26:v:30:b::1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F26:vtf:n:360:IF( (E26*12)=0,"",(E26*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G26:b::::1\ncell:O26:l:1:f:7:cf:2\ncell:P26:l:1:f:7:cf:2\ncell:Q26:l:1:f:7:cf:2\ncell:R26:l:1:f:7:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:7:bg:2:cf:2\ncell:C27:l:3:f:7:bg:2:cf:2\ncell:D27:t:Car/Tax Insurance:l:3:f:5:bg:2:cf:2\ncell:E27:b:1:1:1:1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:F27:vtf:t::IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:5:bg:2:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:7:cf:2\ncell:P27:l:1:f:7:cf:2\ncell:Q27:l:1:f:7:cf:2\ncell:R27:l:1:f:7:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:7:cf:2\ncell:C28:l:3:f:7:cf:2\ncell:D28:t:Home Insurance:l:3:f:5:cf:2\ncell:E28:b:1:1:1:1:l:4:f:5:cf:3:ntvf:1\ncell:F28:vtf:t::IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:5:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:7:cf:2\ncell:P28:l:1:f:7:cf:2\ncell:Q28:l:1:f:7:cf:2\ncell:R28:l:1:f:7:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:bg:2\ncell:C29:bg:2\ncell:D29:t:Life Insurance:l:3:f:6:bg:2:cf:2\ncell:E29:b:1:1:1:1:bg:2\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:bg:2\ncell:G29:b::::1\ncell:O29:l:1:f:7:cf:2\ncell:P29:l:1:f:7:cf:2\ncell:Q29:l:1:f:7:cf:2\ncell:R29:l:1:f:7:cf:2\ncell:A30:b::1::\ncell:B30:b:::1:1\ncell:C30:b:::1:\ncell:D30:t:Others:b:::1::l:3:f:6:cf:2\ncell:E30:b:1:1:1:1\ncell:F30:vtf:t::IF( (E30*12)=0,"",(E30*12)):b::1:1:1\ncell:G30:b::::1\ncell:O30:l:1:f:7:cf:2\ncell:P30:l:1:f:7:cf:2\ncell:Q30:l:1:f:7:cf:2\ncell:R30:l:1:f:7:cf:2\ncell:B31:b:1:::\ncell:C31:b:1:::\ncell:D31:b:1:::\ncell:E31:b:1:::\ncell:F31:vtf:t::IF( (E31*12)=0,"",(E31*12)):b:1:::\ncell:O31:l:1:f:7:cf:2\ncell:P31:l:1:f:7:cf:2\ncell:Q31:l:1:f:7:cf:2\ncell:R31:l:1:f:7:cf:2\ncell:B32:l:1:f:4:cf:2\ncell:C32:l:1:f:4:cf:2\ncell:D32:l:1:f:9:cf:2\ncell:E32:l:1:f:9:cf:2\ncell:F32:l:1:f:7:cf:2\ncell:O32:l:1:f:7:cf:2\ncell:P32:l:1:f:7:cf:2\ncell:Q32:l:1:f:7:cf:2\ncell:R32:l:1:f:7:cf:2\ncell:O33:l:1:f:7:cf:2\ncell:P33:l:1:f:7:cf:2\ncell:Q33:l:1:f:7:cf:2\ncell:R33:l:1:f:7:cf:2\ncell:O34:l:1:f:7:cf:2\ncell:P34:l:1:f:7:cf:2\ncell:Q34:l:1:f:7:cf:2\ncell:R34:l:1:f:7:cf:2\ncell:O35:l:1:f:7:cf:2\ncell:P35:l:1:f:7:cf:2\ncell:Q35:l:1:f:7:cf:2\ncell:R35:l:1:f:7:cf:2\ncell:O36:l:1:f:7:cf:2\ncell:P36:l:1:f:7:cf:2\ncell:Q36:l:1:f:7:cf:2\ncell:R36:l:1:f:7:cf:2\ncell:O37:l:1:f:7:cf:2\ncell:P37:l:1:f:7:cf:2\ncell:Q37:l:1:f:7:cf:2\ncell:R37:l:1:f:7:cf:2\ncell:O38:l:1:f:7:cf:2\ncell:P38:l:1:f:7:cf:2\ncell:Q38:l:1:f:7:cf:2\ncell:R38:l:1:f:7:cf:2\ncell:O39:l:1:f:7:cf:2\ncell:P39:l:1:f:7:cf:2\ncell:Q39:l:1:f:7:cf:2\ncell:R39:l:1:f:7:cf:2\ncell:O40:l:1:f:7:cf:2\ncell:P40:l:1:f:7:cf:2\ncell:Q40:l:1:f:7:cf:2\ncell:R40:l:1:f:7:cf:2\ncell:O41:l:1:f:7:cf:2\ncell:P41:l:1:f:7:cf:2\ncell:Q41:l:1:f:7:cf:2\ncell:R41:l:1:f:7:cf:2\ncell:O42:l:1:f:7:cf:2\ncell:P42:l:1:f:7:cf:2\ncell:Q42:l:1:f:7:cf:2\ncell:R42:l:1:f:7:cf:2\ncell:S42:l:1:f:7:cf:2\ncell:T42:l:1:f:7:cf:2\ncell:U42:l:1:f:7:cf:2\ncell:V42:l:1:f:7:cf:2\ncell:W42:l:1:f:7:cf:2\ncell:O43:l:1:f:7:cf:2\ncell:P43:l:1:f:7:cf:2\ncell:Q43:l:1:f:7:cf:2\ncell:R43:l:1:f:7:cf:2\ncell:S43:l:1:f:7:cf:2\ncell:T43:l:1:f:7:cf:2\ncell:U43:l:1:f:7:cf:2\ncell:V43:l:1:f:7:cf:2\ncell:W43:l:1:f:7:cf:2\ncell:O44:l:1:f:7:cf:2\ncell:P44:l:1:f:7:cf:2\ncell:Q44:l:1:f:7:cf:2\ncell:R44:l:1:f:7:cf:2\ncell:S44:l:1:f:7:cf:2\ncell:T44:l:1:f:7:cf:2\ncell:U44:l:1:f:7:cf:2\ncell:V44:l:1:f:7:cf:2\ncell:W44:l:1:f:7:cf:2\ncell:O45:l:1:f:7:cf:2\ncell:P45:l:1:f:7:cf:2\ncell:Q45:l:1:f:7:cf:2\ncell:R45:l:1:f:7:cf:2\ncell:S45:l:1:f:7:cf:2\ncell:T45:l:1:f:7:cf:2\ncell:U45:l:1:f:7:cf:2\ncell:V45:l:1:f:7:cf:2\ncell:W45:l:1:f:7:cf:2\ncell:O46:l:1:f:7:cf:2\ncell:P46:l:1:f:7:cf:2\ncell:Q46:l:1:f:7:cf:2\ncell:R46:l:1:f:7:cf:2\ncell:S46:l:1:f:7:cf:2\ncell:T46:l:1:f:7:cf:2\ncell:U46:l:1:f:7:cf:2\ncell:V46:l:1:f:7:cf:2\ncell:W46:l:1:f:7:cf:2\ncell:O47:l:1:f:7:cf:2\ncell:P47:l:1:f:7:cf:2\ncell:Q47:l:1:f:7:cf:2\ncell:R47:l:1:f:7:cf:2\ncell:S47:l:1:f:7:cf:2\ncell:T47:l:1:f:7:cf:2\ncell:U47:l:1:f:7:cf:2\ncell:V47:l:1:f:7:cf:2\ncell:W47:l:1:f:7:cf:2\ncell:O48:l:1:f:7:cf:2\ncell:P48:l:1:f:7:cf:2\ncell:Q48:l:1:f:7:cf:2\ncell:R48:l:1:f:7:cf:2\ncell:S48:l:1:f:7:cf:2\ncell:T48:l:1:f:7:cf:2\ncell:U48:l:1:f:7:cf:2\ncell:V48:l:1:f:7:cf:2\ncell:W48:l:1:f:7:cf:2\ncell:O49:l:1:f:7:cf:2\ncell:P49:l:1:f:7:cf:2\ncell:Q49:l:1:f:7:cf:2\ncell:R49:l:1:f:7:cf:2\ncell:S49:l:1:f:7:cf:2\ncell:T49:l:1:f:7:cf:2\ncell:U49:l:1:f:7:cf:2\ncell:V49:l:1:f:7:cf:2\ncell:W49:l:1:f:7:cf:2\ncell:O50:l:1:f:7:cf:2\ncell:P50:l:1:f:7:cf:2\ncell:Q50:l:1:f:7:cf:2\ncell:R50:l:1:f:7:cf:2\ncell:S50:l:1:f:7:cf:2\ncell:T50:l:1:f:7:cf:2\ncell:U50:l:1:f:7:cf:2\ncell:V50:l:1:f:7:cf:2\ncell:W50:l:1:f:7:cf:2\ncell:O51:l:1:f:7:cf:2\ncell:P51:l:1:f:7:cf:2\ncell:Q51:l:1:f:7:cf:2\ncell:R51:l:1:f:7:cf:2\ncell:S51:l:1:f:7:cf:2\ncell:T51:l:1:f:7:cf:2\ncell:U51:l:1:f:7:cf:2\ncell:V51:l:1:f:7:cf:2\ncell:W51:l:1:f:7:cf:2\ncell:O52:l:1:f:7:cf:2\ncell:P52:l:1:f:7:cf:2\ncell:Q52:l:1:f:7:cf:2\ncell:R52:l:1:f:7:cf:2\ncell:S52:l:1:f:7:cf:2\ncell:T52:l:1:f:7:cf:2\ncell:U52:l:1:f:7:cf:2\ncell:V52:l:1:f:7:cf:2\ncell:W52:l:1:f:7:cf:2\ncell:O53:l:1:f:7:cf:2\ncell:P53:l:1:f:7:cf:2\ncell:Q53:l:1:f:7:cf:2\ncell:R53:l:1:f:7:cf:2\ncell:S53:l:1:f:7:cf:2\ncell:T53:l:1:f:7:cf:2\ncell:U53:l:1:f:7:cf:2\ncell:V53:l:1:f:7:cf:2\ncell:W53:l:1:f:7:cf:2\ncell:O54:l:1:f:7:cf:2\ncell:P54:l:1:f:7:cf:2\ncell:Q54:l:1:f:7:cf:2\ncell:R54:l:1:f:7:cf:2\ncell:S54:l:1:f:7:cf:2\ncell:T54:l:1:f:7:cf:2\ncell:U54:l:1:f:7:cf:2\ncell:V54:l:1:f:7:cf:2\ncell:W54:l:1:f:7:cf:2\ncell:O55:l:1:f:7:cf:2\ncell:P55:l:1:f:7:cf:2\ncell:Q55:l:1:f:7:cf:2\ncell:R55:l:1:f:7:cf:2\ncell:S55:l:1:f:7:cf:2\ncell:T55:l:1:f:7:cf:2\ncell:U55:l:1:f:7:cf:2\ncell:V55:l:1:f:7:cf:2\ncell:W55:l:1:f:7:cf:2\ncell:O56:l:1:f:7:cf:2\ncell:P56:l:1:f:7:cf:2\ncell:Q56:l:1:f:7:cf:2\ncell:R56:l:1:f:7:cf:2\ncell:S56:l:1:f:7:cf:2\ncell:T56:l:1:f:7:cf:2\ncell:U56:l:1:f:7:cf:2\ncell:V56:l:1:f:7:cf:2\ncell:W56:l:1:f:7:cf:2\ncell:O57:l:1:f:7:cf:2\ncell:P57:l:1:f:7:cf:2\ncell:Q57:l:1:f:7:cf:2\ncell:R57:l:1:f:7:cf:2\ncell:S57:l:1:f:7:cf:2\ncell:T57:l:1:f:7:cf:2\ncell:U57:l:1:f:7:cf:2\ncell:V57:l:1:f:7:cf:2\ncell:W57:l:1:f:7:cf:2\ncell:O58:l:1:f:7:cf:2\ncell:P58:l:1:f:7:cf:2\ncell:Q58:l:1:f:7:cf:2\ncell:R58:l:1:f:7:cf:2\ncell:S58:l:1:f:7:cf:2\ncell:T58:l:1:f:7:cf:2\ncell:U58:l:1:f:7:cf:2\ncell:V58:l:1:f:7:cf:2\ncell:W58:l:1:f:7:cf:2\ncell:O59:l:1:f:7:cf:2\ncell:P59:l:1:f:7:cf:2\ncell:Q59:l:1:f:7:cf:2\ncell:R59:l:1:f:7:cf:2\ncell:S59:l:1:f:7:cf:2\ncell:T59:l:1:f:7:cf:2\ncell:U59:l:1:f:7:cf:2\ncell:V59:l:1:f:7:cf:2\ncell:W59:l:1:f:7:cf:2\ncell:O60:l:1:f:7:cf:2\ncell:P60:l:1:f:7:cf:2\ncell:Q60:l:1:f:7:cf:2\ncell:R60:l:1:f:7:cf:2\ncell:S60:l:1:f:7:cf:2\ncell:T60:l:1:f:7:cf:2\ncell:U60:l:1:f:7:cf:2\ncell:V60:l:1:f:7:cf:2\ncell:W60:l:1:f:7:cf:2\ncell:O61:l:1:f:7:cf:2\ncell:P61:l:1:f:7:cf:2\ncell:Q61:l:1:f:7:cf:2\ncell:R61:l:1:f:7:cf:2\ncell:S61:l:1:f:7:cf:2\ncell:T61:l:1:f:7:cf:2\ncell:U61:l:1:f:7:cf:2\ncell:V61:l:1:f:7:cf:2\ncell:W61:l:1:f:7:cf:2\ncell:O62:l:1:f:7:cf:2\ncell:P62:l:1:f:7:cf:2\ncell:Q62:l:1:f:7:cf:2\ncell:R62:l:1:f:7:cf:2\ncell:S62:l:1:f:7:cf:2\ncell:T62:l:1:f:7:cf:2\ncell:U62:l:1:f:7:cf:2\ncell:V62:l:1:f:7:cf:2\ncell:W62:l:1:f:7:cf:2\ncell:O63:l:1:f:7:cf:2\ncell:P63:l:1:f:7:cf:2\ncell:Q63:l:1:f:7:cf:2\ncell:R63:l:1:f:7:cf:2\ncell:S63:l:1:f:7:cf:2\ncell:T63:l:1:f:7:cf:2\ncell:U63:l:1:f:7:cf:2\ncell:V63:l:1:f:7:cf:2\ncell:W63:l:1:f:7:cf:2\ncell:O64:l:1:f:7:cf:2\ncell:P64:l:1:f:7:cf:2\ncell:Q64:l:1:f:7:cf:2\ncell:R64:l:1:f:7:cf:2\ncell:S64:l:1:f:7:cf:2\ncell:T64:l:1:f:7:cf:2\ncell:U64:l:1:f:7:cf:2\ncell:V64:l:1:f:7:cf:2\ncell:W64:l:1:f:7:cf:2\ncell:O65:l:1:f:7:cf:2\ncell:P65:l:1:f:7:cf:2\ncell:Q65:l:1:f:7:cf:2\ncell:R65:l:1:f:7:cf:2\ncell:S65:l:1:f:7:cf:2\ncell:T65:l:1:f:7:cf:2\ncell:U65:l:1:f:7:cf:2\ncell:V65:l:1:f:7:cf:2\ncell:W65:l:1:f:7:cf:2\ncell:O66:l:1:f:7:cf:2\ncell:P66:l:1:f:7:cf:2\ncell:Q66:l:1:f:7:cf:2\ncell:R66:l:1:f:7:cf:2\ncell:S66:l:1:f:7:cf:2\ncell:T66:l:1:f:7:cf:2\ncell:U66:l:1:f:7:cf:2\ncell:V66:l:1:f:7:cf:2\ncell:W66:l:1:f:7:cf:2\ncell:O67:l:1:f:7:cf:2\ncell:P67:l:1:f:7:cf:2\ncell:Q67:l:1:f:7:cf:2\ncell:R67:l:1:f:7:cf:2\ncell:S67:l:1:f:7:cf:2\ncell:T67:l:1:f:7:cf:2\ncell:U67:l:1:f:7:cf:2\ncell:V67:l:1:f:7:cf:2\ncell:W67:l:1:f:7:cf:2\ncell:O68:l:1:f:7:cf:2\ncell:P68:l:1:f:7:cf:2\ncell:Q68:l:1:f:7:cf:2\ncell:R68:l:1:f:7:cf:2\ncell:S68:l:1:f:7:cf:2\ncell:T68:l:1:f:7:cf:2\ncell:U68:l:1:f:7:cf:2\ncell:V68:l:1:f:7:cf:2\ncell:W68:l:1:f:7:cf:2\ncell:O69:l:1:f:7:cf:2\ncell:P69:l:1:f:7:cf:2\ncell:Q69:l:1:f:7:cf:2\ncell:R69:l:1:f:7:cf:2\ncell:S69:l:1:f:7:cf:2\ncell:T69:l:1:f:7:cf:2\ncell:U69:l:1:f:7:cf:2\ncell:V69:l:1:f:7:cf:2\ncell:W69:l:1:f:7:cf:2\ncell:O70:l:1:f:7:cf:2\ncell:P70:l:1:f:7:cf:2\ncell:Q70:l:1:f:7:cf:2\ncell:R70:l:1:f:7:cf:2\ncell:S70:l:1:f:7:cf:2\ncell:T70:l:1:f:7:cf:2\ncell:U70:l:1:f:7:cf:2\ncell:V70:l:1:f:7:cf:2\ncell:W70:l:1:f:7:cf:2\ncell:O71:l:1:f:7:cf:2\ncell:P71:l:1:f:7:cf:2\ncell:Q71:l:1:f:7:cf:2\ncell:R71:l:1:f:7:cf:2\ncell:S71:l:1:f:7:cf:2\ncell:T71:l:1:f:7:cf:2\ncell:U71:l:1:f:7:cf:2\ncell:V71:l:1:f:7:cf:2\ncell:W71:l:1:f:7:cf:2\ncell:O72:l:1:f:7:cf:2\ncell:P72:l:1:f:7:cf:2\ncell:Q72:l:1:f:7:cf:2\ncell:R72:l:1:f:7:cf:2\ncell:S72:l:1:f:7:cf:2\ncell:T72:l:1:f:7:cf:2\ncell:U72:l:1:f:7:cf:2\ncell:V72:l:1:f:7:cf:2\ncell:W72:l:1:f:7:cf:2\ncell:O73:l:1:f:7:cf:2\ncell:P73:l:1:f:7:cf:2\ncell:Q73:l:1:f:7:cf:2\ncell:R73:l:1:f:7:cf:2\ncell:S73:l:1:f:7:cf:2\ncell:T73:l:1:f:7:cf:2\ncell:U73:l:1:f:7:cf:2\ncell:V73:l:1:f:7:cf:2\ncell:W73:l:1:f:7:cf:2\ncell:O74:l:1:f:7:cf:2\ncell:P74:l:1:f:7:cf:2\ncell:Q74:l:1:f:7:cf:2\ncell:R74:l:1:f:7:cf:2\ncell:S74:l:1:f:7:cf:2\ncell:T74:l:1:f:7:cf:2\ncell:U74:l:1:f:7:cf:2\ncell:V74:l:1:f:7:cf:2\ncell:W74:l:1:f:7:cf:2\ncell:O75:l:1:f:7:cf:2\ncell:P75:l:1:f:7:cf:2\ncell:Q75:l:1:f:7:cf:2\ncell:R75:l:1:f:7:cf:2\ncell:S75:l:1:f:7:cf:2\ncell:T75:l:1:f:7:cf:2\ncell:U75:l:1:f:7:cf:2\ncell:V75:l:1:f:7:cf:2\ncell:W75:l:1:f:7:cf:2\ncell:O76:l:1:f:7:cf:2\ncell:P76:l:1:f:7:cf:2\ncell:Q76:l:1:f:7:cf:2\ncell:R76:l:1:f:7:cf:2\ncell:S76:l:1:f:7:cf:2\ncell:T76:l:1:f:7:cf:2\ncell:U76:l:1:f:7:cf:2\ncell:V76:l:1:f:7:cf:2\ncell:W76:l:1:f:7:cf:2\ncell:O77:l:1:f:7:cf:2\ncell:P77:l:1:f:7:cf:2\ncell:Q77:l:1:f:7:cf:2\ncell:R77:l:1:f:7:cf:2\ncell:S77:l:1:f:7:cf:2\ncell:T77:l:1:f:7:cf:2\ncell:U77:l:1:f:7:cf:2\ncell:V77:l:1:f:7:cf:2\ncell:W77:l:1:f:7:cf:2\ncell:O78:l:1:f:7:cf:2\ncell:P78:l:1:f:7:cf:2\ncell:Q78:l:1:f:7:cf:2\ncell:R78:l:1:f:7:cf:2\ncell:S78:l:1:f:7:cf:2\ncell:T78:l:1:f:7:cf:2\ncell:U78:l:1:f:7:cf:2\ncell:V78:l:1:f:7:cf:2\ncell:W78:l:1:f:7:cf:2\ncell:O79:l:1:f:7:cf:2\ncell:P79:l:1:f:7:cf:2\ncell:Q79:l:1:f:7:cf:2\ncell:R79:l:1:f:7:cf:2\ncell:S79:l:1:f:7:cf:2\ncell:T79:l:1:f:7:cf:2\ncell:U79:l:1:f:7:cf:2\ncell:V79:l:1:f:7:cf:2\ncell:W79:l:1:f:7:cf:2\ncell:O80:l:1:f:7:cf:2\ncell:P80:l:1:f:7:cf:2\ncell:Q80:l:1:f:7:cf:2\ncell:R80:l:1:f:7:cf:2\ncell:S80:l:1:f:7:cf:2\ncell:T80:l:1:f:7:cf:2\ncell:U80:l:1:f:7:cf:2\ncell:V80:l:1:f:7:cf:2\ncell:W80:l:1:f:7:cf:2\ncell:O81:l:1:f:7:cf:2\ncell:P81:l:1:f:7:cf:2\ncell:Q81:l:1:f:7:cf:2\ncell:R81:l:1:f:7:cf:2\ncell:S81:l:1:f:7:cf:2\ncell:T81:l:1:f:7:cf:2\ncell:U81:l:1:f:7:cf:2\ncell:V81:l:1:f:7:cf:2\ncell:W81:l:1:f:7:cf:2\ncell:O82:l:1:f:7:cf:2\ncell:P82:l:1:f:7:cf:2\ncell:Q82:l:1:f:7:cf:2\ncell:R82:l:1:f:7:cf:2\ncell:S82:l:1:f:7:cf:2\ncell:T82:l:1:f:7:cf:2\ncell:U82:l:1:f:7:cf:2\ncell:V82:l:1:f:7:cf:2\ncell:W82:l:1:f:7:cf:2\ncell:O83:l:1:f:7:cf:2\ncell:P83:l:1:f:7:cf:2\ncell:Q83:l:1:f:7:cf:2\ncell:R83:l:1:f:7:cf:2\ncell:S83:l:1:f:7:cf:2\ncell:T83:l:1:f:7:cf:2\ncell:U83:l:1:f:7:cf:2\ncell:V83:l:1:f:7:cf:2\ncell:W83:l:1:f:7:cf:2\ncell:O84:l:1:f:7:cf:2\ncell:P84:l:1:f:7:cf:2\ncell:Q84:l:1:f:7:cf:2\ncell:R84:l:1:f:7:cf:2\ncell:S84:l:1:f:7:cf:2\ncell:T84:l:1:f:7:cf:2\ncell:U84:l:1:f:7:cf:2\ncell:V84:l:1:f:7:cf:2\ncell:W84:l:1:f:7:cf:2\ncell:O85:l:1:f:7:cf:2\ncell:P85:l:1:f:7:cf:2\ncell:Q85:l:1:f:7:cf:2\ncell:R85:l:1:f:7:cf:2\ncell:S85:l:1:f:7:cf:2\ncell:T85:l:1:f:7:cf:2\ncell:U85:l:1:f:7:cf:2\ncell:V85:l:1:f:7:cf:2\ncell:W85:l:1:f:7:cf:2\ncell:O86:l:1:f:7:cf:2\ncell:P86:l:1:f:7:cf:2\ncell:Q86:l:1:f:7:cf:2\ncell:R86:l:1:f:7:cf:2\ncell:S86:l:1:f:7:cf:2\ncell:T86:l:1:f:7:cf:2\ncell:U86:l:1:f:7:cf:2\ncell:V86:l:1:f:7:cf:2\ncell:W86:l:1:f:7:cf:2\ncell:O87:l:1:f:7:cf:2\ncell:P87:l:1:f:7:cf:2\ncell:Q87:l:1:f:7:cf:2\ncell:R87:l:1:f:7:cf:2\ncell:S87:l:1:f:7:cf:2\ncell:T87:l:1:f:7:cf:2\ncell:U87:l:1:f:7:cf:2\ncell:V87:l:1:f:7:cf:2\ncell:W87:l:1:f:7:cf:2\ncell:O88:l:1:f:7:cf:2\ncell:P88:l:1:f:7:cf:2\ncell:Q88:l:1:f:7:cf:2\ncell:R88:l:1:f:7:cf:2\ncell:S88:l:1:f:7:cf:2\ncell:T88:l:1:f:7:cf:2\ncell:U88:l:1:f:7:cf:2\ncell:V88:l:1:f:7:cf:2\ncell:W88:l:1:f:7:cf:2\ncell:O89:l:1:f:7:cf:2\ncell:P89:l:1:f:7:cf:2\ncell:Q89:l:1:f:7:cf:2\ncell:R89:l:1:f:7:cf:2\ncell:S89:l:1:f:7:cf:2\ncell:T89:l:1:f:7:cf:2\ncell:U89:l:1:f:7:cf:2\ncell:V89:l:1:f:7:cf:2\ncell:W89:l:1:f:7:cf:2\ncell:O90:l:1:f:7:cf:2\ncell:P90:l:1:f:7:cf:2\ncell:Q90:l:1:f:7:cf:2\ncell:R90:l:1:f:7:cf:2\ncell:S90:l:1:f:7:cf:2\ncell:T90:l:1:f:7:cf:2\ncell:U90:l:1:f:7:cf:2\ncell:V90:l:1:f:7:cf:2\ncell:W90:l:1:f:7:cf:2\ncell:O91:l:1:f:7:cf:2\ncell:P91:l:1:f:7:cf:2\ncell:Q91:l:1:f:7:cf:2\ncell:R91:l:1:f:7:cf:2\ncell:S91:l:1:f:7:cf:2\ncell:T91:l:1:f:7:cf:2\ncell:U91:l:1:f:7:cf:2\ncell:V91:l:1:f:7:cf:2\ncell:W91:l:1:f:7:cf:2\ncell:O92:l:1:f:7:cf:2\ncell:P92:l:1:f:7:cf:2\ncell:Q92:l:1:f:7:cf:2\ncell:R92:l:1:f:7:cf:2\ncell:S92:l:1:f:7:cf:2\ncell:T92:l:1:f:7:cf:2\ncell:U92:l:1:f:7:cf:2\ncell:V92:l:1:f:7:cf:2\ncell:W92:l:1:f:7:cf:2\ncell:O93:l:1:f:7:cf:2\ncell:P93:l:1:f:7:cf:2\ncell:Q93:l:1:f:7:cf:2\ncell:R93:l:1:f:7:cf:2\ncell:S93:l:1:f:7:cf:2\ncell:T93:l:1:f:7:cf:2\ncell:U93:l:1:f:7:cf:2\ncell:V93:l:1:f:7:cf:2\ncell:W93:l:1:f:7:cf:2\ncell:O94:l:1:f:8:cf:2\ncell:P94:l:1:f:8:cf:2\ncell:Q94:l:1:f:8:cf:2\ncell:R94:l:1:f:8:cf:2\ncell:S94:l:1:f:8:cf:2\ncell:T94:l:1:f:8:cf:2\ncell:U94:l:1:f:8:cf:2\ncell:V94:l:1:f:8:cf:2\ncell:W94:l:1:f:8:cf:2\ncell:O95:l:1:f:8:cf:2\ncell:P95:l:1:f:8:cf:2\ncell:Q95:l:1:f:8:cf:2\ncell:R95:l:1:f:8:cf:2\ncell:S95:l:1:f:8:cf:2\ncell:T95:l:1:f:8:cf:2\ncell:U95:l:1:f:8:cf:2\ncell:V95:l:1:f:8:cf:2\ncell:W95:l:1:f:8:cf:2\ncell:O96:l:1:f:8:cf:2\ncell:P96:l:1:f:8:cf:2\ncell:Q96:l:1:f:8:cf:2\ncell:R96:l:1:f:8:cf:2\ncell:S96:l:1:f:8:cf:2\ncell:T96:l:1:f:8:cf:2\ncell:U96:l:1:f:8:cf:2\ncell:V96:l:1:f:8:cf:2\ncell:W96:l:1:f:8:cf:2\ncell:O97:l:1:f:8:cf:2\ncell:P97:l:1:f:8:cf:2\ncell:Q97:l:1:f:8:cf:2\ncell:R97:l:1:f:8:cf:2\ncell:S97:l:1:f:8:cf:2\ncell:T97:l:1:f:8:cf:2\ncell:U97:l:1:f:8:cf:2\ncell:V97:l:1:f:8:cf:2\ncell:W97:l:1:f:8:cf:2\ncell:A98:l:1:f:8:cf:2\ncell:B98:l:1:f:8:cf:2\ncell:C98:l:1:f:8:cf:2\ncell:D98:l:1:f:8:cf:2\ncell:E98:l:1:f:8:cf:2\ncell:F98:t:Monthly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G98:l:1:f:8:cf:2\ncell:H98:l:1:f:8:cf:2\ncell:I98:l:1:f:8:cf:2\ncell:J98:l:1:f:8:cf:2\ncell:K98:l:1:f:8:cf:2\ncell:L98:l:1:f:8:cf:2\ncell:M98:l:1:f:8:cf:2\ncell:N98:l:1:f:8:cf:2\ncell:O98:l:1:f:8:cf:2\ncell:P98:l:1:f:8:cf:2\ncell:Q98:l:1:f:8:cf:2\ncell:R98:l:1:f:8:cf:2\ncell:S98:l:1:f:8:cf:2\ncell:T98:l:1:f:8:cf:2\ncell:U98:l:1:f:8:cf:2\ncell:V98:l:1:f:8:cf:2\ncell:W98:l:1:f:8:cf:2\ncell:A99:l:1:f:8:cf:2\ncell:B99:l:1:f:8:cf:2\ncell:C99:l:1:f:8:cf:2\ncell:D99:l:1:f:8:cf:2\ncell:E99:l:1:f:8:cf:2\ncell:F99:t:Semi-Annually:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G99:l:1:f:8:cf:2\ncell:H99:l:1:f:8:cf:2\ncell:I99:l:1:f:8:cf:2\ncell:J99:l:1:f:8:cf:2\ncell:K99:l:1:f:8:cf:2\ncell:L99:l:1:f:8:cf:2\ncell:M99:l:1:f:8:cf:2\ncell:N99:l:1:f:8:cf:2\ncell:O99:l:1:f:8:cf:2\ncell:P99:l:1:f:8:cf:2\ncell:Q99:l:1:f:8:cf:2\ncell:R99:l:1:f:8:cf:2\ncell:S99:l:1:f:8:cf:2\ncell:T99:l:1:f:8:cf:2\ncell:U99:l:1:f:8:cf:2\ncell:V99:l:1:f:8:cf:2\ncell:W99:l:1:f:8:cf:2\ncell:A100:l:1:f:8:cf:2\ncell:B100:l:1:f:8:cf:2\ncell:C100:l:1:f:8:cf:2\ncell:D100:l:1:f:8:cf:2\ncell:E100:l:1:f:8:cf:2\ncell:F100:t:Quarterly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G100:l:1:f:8:cf:2\ncell:H100:l:1:f:8:cf:2\ncell:I100:l:1:f:8:cf:2\ncell:J100:l:1:f:8:cf:2\ncell:K100:l:1:f:8:cf:2\ncell:L100:l:1:f:8:cf:2\ncell:M100:l:1:f:8:cf:2\ncell:N100:l:1:f:8:cf:2\ncell:O100:l:1:f:8:cf:2\ncell:P100:l:1:f:8:cf:2\ncell:Q100:l:1:f:8:cf:2\ncell:R100:l:1:f:8:cf:2\ncell:S100:l:1:f:8:cf:2\ncell:T100:l:1:f:8:cf:2\ncell:U100:l:1:f:8:cf:2\ncell:V100:l:1:f:8:cf:2\ncell:W100:l:1:f:8:cf:2\ncell:A101:l:1:f:8:cf:2\ncell:B101:l:1:f:8:cf:2\ncell:C101:l:1:f:8:cf:2\ncell:D101:l:1:f:8:cf:2\ncell:E101:l:1:f:8:cf:2\ncell:F101:t:Yearly:l:1:f:8:cf:2:tvf:2:ntvf:2\ncell:G101:l:1:f:8:cf:2\ncell:H101:l:1:f:8:cf:2\ncell:I101:l:1:f:8:cf:2\ncell:J101:l:1:f:8:cf:2\ncell:K101:l:1:f:8:cf:2\ncell:L101:l:1:f:8:cf:2\ncell:M101:l:1:f:8:cf:2\ncell:N101:l:1:f:8:cf:2\ncell:O101:l:1:f:8:cf:2\ncell:P101:l:1:f:8:cf:2\ncell:Q101:l:1:f:8:cf:2\ncell:R101:l:1:f:8:cf:2\ncell:S101:l:1:f:8:cf:2\ncell:T101:l:1:f:8:cf:2\ncell:U101:l:1:f:8:cf:2\ncell:V101:l:1:f:8:cf:2\ncell:W101:l:1:f:8:cf:2\ncell:A102:l:1:f:8:cf:2\ncell:B102:l:1:f:8:cf:2\ncell:C102:l:1:f:8:cf:2\ncell:D102:l:1:f:8:cf:2\ncell:E102:l:1:f:8:cf:2\ncell:F102:l:1:f:8:cf:2\ncell:G102:l:1:f:8:cf:2\ncell:H102:l:1:f:8:cf:2\ncell:I102:l:1:f:8:cf:2\ncell:J102:l:1:f:8:cf:2\ncell:K102:l:1:f:8:cf:2\ncell:L102:l:1:f:8:cf:2\ncell:M102:l:1:f:8:cf:2\ncell:N102:l:1:f:8:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:A103:l:1:f:8:cf:2\ncell:B103:l:1:f:8:cf:2\ncell:C103:l:1:f:8:cf:2\ncell:D103:l:1:f:8:cf:2\ncell:E103:l:1:f:8:cf:2\ncell:F103:l:1:f:8:cf:2\ncell:G103:l:1:f:8:cf:2\ncell:H103:l:1:f:8:cf:2\ncell:I103:l:1:f:8:cf:2\ncell:J103:l:1:f:8:cf:2\ncell:K103:l:1:f:8:cf:2\ncell:L103:l:1:f:8:cf:2\ncell:M103:l:1:f:8:cf:2\ncell:N103:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:A104:l:1:f:8:cf:2\ncell:B104:l:1:f:8:cf:2\ncell:C104:l:1:f:8:cf:2\ncell:D104:l:1:f:8:cf:2\ncell:E104:l:1:f:8:cf:2\ncell:F104:l:1:f:8:cf:2\ncell:G104:l:1:f:8:cf:2\ncell:H104:l:1:f:8:cf:2\ncell:I104:l:1:f:8:cf:2\ncell:J104:l:1:f:8:cf:2\ncell:K104:l:1:f:8:cf:2\ncell:L104:l:1:f:8:cf:2\ncell:M104:l:1:f:8:cf:2\ncell:N104:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:A105:l:1:f:8:cf:2\ncell:B105:l:1:f:8:cf:2\ncell:C105:l:1:f:8:cf:2\ncell:D105:l:1:f:8:cf:2\ncell:E105:l:1:f:8:cf:2\ncell:F105:l:1:f:8:cf:2\ncell:G105:l:1:f:8:cf:2\ncell:H105:l:1:f:8:cf:2\ncell:I105:l:1:f:8:cf:2\ncell:J105:l:1:f:8:cf:2\ncell:K105:l:1:f:8:cf:2\ncell:L105:l:1:f:8:cf:2\ncell:M105:l:1:f:8:cf:2\ncell:N105:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:A106:l:1:f:8:cf:2\ncell:B106:l:1:f:8:cf:2\ncell:C106:l:1:f:8:cf:2\ncell:D106:l:1:f:8:cf:2\ncell:E106:l:1:f:8:cf:2\ncell:F106:l:1:f:8:cf:2\ncell:G106:l:1:f:8:cf:2\ncell:H106:l:1:f:8:cf:2\ncell:I106:l:1:f:8:cf:2\ncell:J106:l:1:f:8:cf:2\ncell:K106:l:1:f:8:cf:2\ncell:L106:l:1:f:8:cf:2\ncell:M106:l:1:f:8:cf:2\ncell:N106:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:A107:l:1:f:8:cf:2\ncell:B107:l:1:f:8:cf:2\ncell:C107:l:1:f:8:cf:2\ncell:D107:l:1:f:8:cf:2\ncell:E107:l:1:f:8:cf:2\ncell:F107:l:1:f:8:cf:2\ncell:G107:l:1:f:8:cf:2\ncell:H107:l:1:f:8:cf:2\ncell:I107:l:1:f:8:cf:2\ncell:J107:l:1:f:8:cf:2\ncell:K107:l:1:f:8:cf:2\ncell:L107:l:1:f:8:cf:2\ncell:M107:l:1:f:8:cf:2\ncell:N107:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:A108:l:1:f:8:cf:2\ncell:B108:l:1:f:8:cf:2\ncell:C108:l:1:f:8:cf:2\ncell:D108:l:1:f:8:cf:2\ncell:E108:l:1:f:8:cf:2\ncell:F108:l:1:f:8:cf:2\ncell:G108:l:1:f:8:cf:2\ncell:H108:l:1:f:8:cf:2\ncell:I108:l:1:f:8:cf:2\ncell:J108:l:1:f:8:cf:2\ncell:K108:l:1:f:8:cf:2\ncell:L108:l:1:f:8:cf:2\ncell:M108:l:1:f:8:cf:2\ncell:N108:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:A109:l:1:f:8:cf:2\ncell:B109:l:1:f:8:cf:2\ncell:C109:l:1:f:8:cf:2\ncell:D109:l:1:f:8:cf:2\ncell:E109:l:1:f:8:cf:2\ncell:F109:l:1:f:8:cf:2\ncell:G109:l:1:f:8:cf:2\ncell:H109:l:1:f:8:cf:2\ncell:I109:l:1:f:8:cf:2\ncell:J109:l:1:f:8:cf:2\ncell:K109:l:1:f:8:cf:2\ncell:L109:l:1:f:8:cf:2\ncell:M109:l:1:f:8:cf:2\ncell:N109:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nsheet:c:27:r:109:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 20pt Arial\nfont:4:normal bold 9pt Arial\nfont:5:normal normal * Arial\nfont:6:normal normal * arial,helvetica,sans-serif\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 7pt Arial\nfont:9:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nname:COMPARISON::S35\\cU49\nname:TRACKING::AC35\\cAE49\n', - }, - name: "sheet10", - hidden: "0", - }, - sheet6: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:l:1:f:7:cf:2:ntvf:3\ncell:B1:l:1:f:7:cf:2\ncell:C1:l:1:f:7:cf:2\ncell:D1:l:1:f:7:cf:2\ncell:E1:l:1:f:7:cf:2\ncell:F1:l:1:f:7:cf:2\ncell:G1:l:1:f:7:cf:2\ncell:H1:l:1:f:7:cf:2\ncell:I1:l:1:f:7:cf:2\ncell:J1:l:1:f:7:cf:2\ncell:K1:l:1:f:7:cf:2\ncell:L1:l:1:f:7:cf:2\ncell:M1:l:1:f:7:cf:2\ncell:N1:l:1:f:7:cf:2\ncell:O1:l:1:f:7:cf:2\ncell:P1:l:1:f:7:cf:2\ncell:Q1:l:1:f:7:cf:2\ncell:R1:l:1:f:7:cf:2\ncell:S1:l:1:f:7:cf:2\ncell:T1:l:1:f:7:cf:2\ncell:U1:l:1:f:7:cf:2\ncell:V1:l:1:f:7:cf:2\ncell:W1:l:1:f:7:cf:2\ncell:A2:l:1:f:7:cf:2\ncell:B2:l:1:f:7:cf:2\ncell:C2:l:1:f:7:cf:2\ncell:D2:t:Expenses:l:2:f:4:cf:2\ncell:E2:l:1:f:7:cf:2\ncell:F2:l:1:f:7:cf:2\ncell:G2:l:1:f:7:cf:2\ncell:H2:l:1:f:7:cf:2\ncell:I2:l:1:f:7:cf:2\ncell:J2:l:1:f:7:cf:2\ncell:K2:l:1:f:7:cf:2\ncell:L2:l:1:f:7:cf:2\ncell:M2:l:1:f:7:cf:2\ncell:N2:l:1:f:7:cf:2\ncell:O2:l:1:f:7:cf:2\ncell:P2:l:1:f:7:cf:2\ncell:Q2:l:1:f:7:cf:2\ncell:R2:l:1:f:7:cf:2\ncell:S2:l:1:f:7:cf:2\ncell:T2:l:1:f:7:cf:2\ncell:U2:l:1:f:7:cf:2\ncell:V2:l:1:f:7:cf:2\ncell:W2:l:1:f:7:cf:2\ncell:A3:l:1:f:7:cf:2\ncell:B3:l:1:f:7:cf:2\ncell:C3:l:1:f:7:cf:2\ncell:D3:l:1:f:7:cf:2\ncell:G3:l:1:f:7:cf:2\ncell:H3:l:1:f:7:cf:2\ncell:I3:l:1:f:7:cf:2\ncell:J3:l:1:f:7:cf:2\ncell:K3:l:1:f:7:cf:2\ncell:L3:l:1:f:7:cf:2\ncell:M3:l:1:f:7:cf:2\ncell:N3:l:1:f:7:cf:2\ncell:O3:l:1:f:7:cf:2\ncell:P3:l:1:f:7:cf:2\ncell:Q3:t: :l:1:f:7:cf:2\ncell:R3:l:1:f:7:cf:2\ncell:S3:l:1:f:7:cf:2\ncell:T3:l:1:f:7:cf:2\ncell:U3:l:1:f:7:cf:2\ncell:V3:l:1:f:7:cf:2\ncell:W3:l:1:f:7:cf:2\ncell:B4:t:Credit Card Expense:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C4:l:3:f:2:c:3:bg:1:cf:2\ncell:D4:l:3:f:2:c:3:bg:1:cf:1\ncell:E4:vtf:n:209:SUM(E5\\cE11):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F4:vtf:n:2508:IF( (E4*12)=0,"",(E4*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O4:l:1:f:7:cf:2\ncell:P4:l:1:f:7:cf:2\ncell:Q4:l:1:f:7:cf:2\ncell:R4:l:1:f:7:cf:2\ncell:S4:l:1:f:7:cf:2\ncell:T4:l:1:f:7:cf:2\ncell:U4:l:1:f:7:cf:2\ncell:V4:l:1:f:7:cf:2\ncell:W4:l:1:f:7:cf:2\ncell:A5:b::1::\ncell:B5:b::::1:l:3:f:7:cf:2\ncell:C5:l:3:f:7:cf:2\ncell:D5:t:Card 1:l:3:f:6:cf:2\ncell:E5:v:209:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F5:vtf:n:2508:IF( (E5*12)=0,"",(E5*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G5:b::::1\ncell:O5:l:1:f:7:cf:2\ncell:P5:l:1:f:7:cf:2\ncell:Q5:l:1:f:7:cf:2\ncell:R5:l:1:f:7:cf:2\ncell:S5:l:1:f:7:cf:2\ncell:T5:l:1:f:7:cf:2\ncell:U5:l:1:f:7:cf:2\ncell:V5:l:1:f:7:cf:2\ncell:W5:l:1:f:7:cf:2\ncell:A6:b::1::\ncell:B6:b::::1:l:3:f:7:bg:2:cf:2\ncell:C6:l:3:f:7:bg:2:cf:2\ncell:D6:t:Card 2:l:3:f:6:bg:2:cf:2\ncell:E6:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F6:vtf:t::IF( (E6*12)=0,"",(E6*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G6:b::::1\ncell:O6:l:1:f:7:cf:2\ncell:P6:l:1:f:7:cf:2\ncell:Q6:l:1:f:7:cf:2\ncell:R6:l:1:f:7:cf:2\ncell:S6:l:1:f:7:cf:2\ncell:T6:l:1:f:7:cf:2\ncell:U6:l:1:f:7:cf:2\ncell:V6:l:1:f:7:cf:2\ncell:W6:l:1:f:7:cf:2\ncell:A7:b::1::\ncell:B7:b::::1:l:3:f:7:cf:2\ncell:C7:l:3:f:7:cf:2\ncell:D7:t:Card 3:l:3:f:6:cf:2\ncell:E7:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F7:vtf:t::IF( (E7*12)=0,"",(E7*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G7:b::::1\ncell:O7:l:1:f:7:cf:2\ncell:P7:l:1:f:7:cf:2\ncell:Q7:l:1:f:7:cf:2\ncell:R7:l:1:f:7:cf:2\ncell:S7:l:1:f:7:cf:2\ncell:T7:l:1:f:7:cf:2\ncell:U7:l:1:f:7:cf:2\ncell:V7:l:1:f:7:cf:2\ncell:W7:l:1:f:7:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:l:3:f:7:bg:2:cf:2\ncell:C8:l:3:f:7:bg:2:cf:2\ncell:D8:t:Card 4:l:3:f:6:bg:2:cf:2\ncell:E8:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F8:vtf:t::IF( (E8*12)=0,"",(E8*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G8:b::::1\ncell:O8:l:1:f:7:cf:2\ncell:P8:l:1:f:7:cf:2\ncell:Q8:l:1:f:7:cf:2\ncell:R8:l:1:f:7:cf:2\ncell:S8:l:1:f:7:cf:2\ncell:T8:l:1:f:7:cf:2\ncell:U8:l:1:f:7:cf:2\ncell:V8:l:1:f:7:cf:2\ncell:W8:l:1:f:7:cf:2\ncell:A9:b::1::\ncell:B9:b::::1:l:3:f:7:cf:2\ncell:C9:l:3:f:7:cf:2\ncell:D9:t:Department Store Card:l:3:f:6:cf:2\ncell:E9:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F9:vtf:t::IF( (E9*12)=0,"",(E9*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G9:b::::1\ncell:O9:l:1:f:7:cf:2\ncell:P9:l:1:f:7:cf:2\ncell:Q9:l:1:f:7:cf:2\ncell:R9:l:1:f:7:cf:2\ncell:S9:l:1:f:7:cf:2\ncell:T9:l:1:f:7:cf:2\ncell:U9:l:1:f:7:cf:2\ncell:V9:l:1:f:7:cf:2\ncell:W9:l:1:f:7:cf:2\ncell:A10:b::1::\ncell:B10:b::::1:l:3:f:7:bg:2:cf:2\ncell:C10:l:3:f:7:bg:2:cf:2\ncell:D10:t:Gas Card:l:3:f:6:bg:2:cf:2\ncell:E10:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F10:vtf:t::IF( (E10*12)=0,"",(E10*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G10:b::::1\ncell:O10:l:1:f:7:cf:2\ncell:P10:l:1:f:7:cf:2\ncell:Q10:l:1:f:7:cf:2\ncell:R10:l:1:f:7:cf:2\ncell:S10:l:1:f:7:cf:2\ncell:T10:l:1:f:7:cf:2\ncell:U10:l:1:f:7:cf:2\ncell:V10:l:1:f:7:cf:2\ncell:W10:l:1:f:7:cf:2\ncell:A11:b::1::\ncell:B11:b::::1:l:3:f:7:cf:2\ncell:C11:l:3:f:7:cf:2\ncell:D11:t:Other:l:3:f:6:cf:2\ncell:E11:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F11:vtf:t::IF( (E11*12)=0,"",(E11*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G11:b::::1\ncell:O11:l:1:f:7:cf:2\ncell:P11:l:1:f:7:cf:2\ncell:Q11:l:1:f:7:cf:2\ncell:R11:l:1:f:7:cf:2\ncell:S11:l:1:f:7:cf:2\ncell:T11:l:1:f:7:cf:2\ncell:U11:l:1:f:7:cf:2\ncell:V11:l:1:f:7:cf:2\ncell:W11:l:1:f:7:cf:2\ncell:B12:t:Buisness:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C12:l:3:f:7:bg:2:cf:2\ncell:D12:l:3:f:6:bg:2:cf:2\ncell:E12:vtf:n:780:SUM(E13\\cE17):b:2:2:2:2:l:4:f:6:c:3:bg:1:cf:3:ntvf:1\ncell:F12:vtf:n:9360:IF( (E12*12)=0,"",(E12*12)):b:2:2:2:2:l:4:f:6:c:3:bg:1:cf:3:ntvf:1\ncell:O12:l:1:f:7:cf:2\ncell:P12:l:1:f:7:cf:2\ncell:Q12:l:1:f:7:cf:2\ncell:R12:l:1:f:7:cf:2\ncell:S12:l:1:f:7:cf:2\ncell:T12:l:1:f:7:cf:2\ncell:U12:l:1:f:7:cf:2\ncell:V12:l:1:f:7:cf:2\ncell:W12:l:1:f:7:cf:2\ncell:A13:b::1::\ncell:B13:b::::1:l:3:f:7:cf:2\ncell:C13:l:3:f:7:cf:2\ncell:D13:t:Deductible Expenses:l:3:f:6:cf:2\ncell:E13:v:780:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F13:vtf:n:9360:IF( (E13*12)=0,"",(E13*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G13:b::::1\ncell:O13:l:1:f:7:cf:2\ncell:P13:l:1:f:7:cf:2\ncell:Q13:l:1:f:7:cf:2\ncell:R13:l:1:f:7:cf:2\ncell:S13:l:1:f:7:cf:2\ncell:T13:l:1:f:7:cf:2\ncell:U13:l:1:f:7:cf:2\ncell:V13:l:1:f:7:cf:2\ncell:W13:l:1:f:7:cf:2\ncell:A14:b::1::\ncell:B14:b::::1:l:3:f:7:bg:2:cf:2\ncell:C14:l:3:f:7:bg:2:cf:2\ncell:D14:t:Non- Deductible Expenses:l:3:f:6:bg:2:cf:2\ncell:E14:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F14:vtf:t::IF( (E14*12)=0,"",(E14*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G14:b::::1\ncell:O14:l:1:f:7:cf:2\ncell:P14:l:1:f:7:cf:2\ncell:Q14:l:1:f:7:cf:2\ncell:R14:l:1:f:7:cf:2\ncell:S14:l:1:f:7:cf:2\ncell:T14:l:1:f:7:cf:2\ncell:U14:l:1:f:7:cf:2\ncell:V14:l:1:f:7:cf:2\ncell:W14:l:1:f:7:cf:2\ncell:A15:b::1::\ncell:B15:b::::1:l:3:f:7:cf:2\ncell:C15:l:3:f:7:cf:2\ncell:D15:t:Others:l:3:f:6:cf:2\ncell:E15:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F15:vtf:t::IF( (E15*12)=0,"",(E15*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G15:b::::1\ncell:O15:l:1:f:7:cf:2\ncell:P15:l:1:f:7:cf:2\ncell:Q15:l:1:f:7:cf:2\ncell:R15:l:1:f:7:cf:2\ncell:S15:l:1:f:7:cf:2\ncell:T15:l:1:f:7:cf:2\ncell:U15:l:1:f:7:cf:2\ncell:V15:l:1:f:7:cf:2\ncell:W15:l:1:f:7:cf:2\ncell:A16:b::1::\ncell:B16:b::::1:l:3:f:7:bg:2:cf:2\ncell:C16:l:3:f:7:bg:2:cf:2\ncell:D16:t:Others:l:3:f:6:bg:2:cf:2\ncell:E16:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F16:vtf:t::IF( (E16*12)=0,"",(E16*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G16:b::::1\ncell:O16:l:1:f:7:cf:2\ncell:P16:l:1:f:7:cf:2\ncell:Q16:l:1:f:7:cf:2\ncell:R16:l:1:f:7:cf:2\ncell:S16:l:1:f:7:cf:2\ncell:T16:l:1:f:7:cf:2\ncell:U16:l:1:f:7:cf:2\ncell:V16:l:1:f:7:cf:2\ncell:W16:l:1:f:7:cf:2\ncell:A17:b::1::\ncell:B17:b::::1:l:3:f:7:cf:2\ncell:C17:l:3:f:7:cf:2\ncell:D17:t:Others:l:3:f:6:cf:2\ncell:E17:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F17:vtf:t::IF( (E17*12)=0,"",(E17*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G17:b::::1\ncell:O17:l:1:f:7:cf:2\ncell:P17:l:1:f:7:cf:2\ncell:Q17:l:1:f:7:cf:2\ncell:R17:l:1:f:7:cf:2\ncell:S17:l:1:f:7:cf:2\ncell:T17:l:1:f:7:cf:2\ncell:U17:l:1:f:7:cf:2\ncell:V17:l:1:f:7:cf:2\ncell:W17:l:1:f:7:cf:2\ncell:B18:t:Vacations/Expenses:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C18:l:3:f:2:c:3:bg:1:cf:2\ncell:D18:l:3:f:2:c:3:bg:1:cf:1\ncell:E18:vtf:n:98:SUM(E19\\cE24):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F18:vtf:n:1176:IF( (E18*12)=0,"",(E18*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O18:l:1:f:7:cf:2\ncell:P18:l:1:f:7:cf:2\ncell:Q18:l:1:f:7:cf:2\ncell:R18:l:1:f:7:cf:2\ncell:S18:l:1:f:7:cf:2\ncell:T18:l:1:f:7:cf:2\ncell:U18:l:1:f:7:cf:2\ncell:V18:l:1:f:7:cf:2\ncell:W18:l:1:f:7:cf:2\ncell:A19:b::1::\ncell:B19:b::::1:l:3:f:7:cf:2\ncell:C19:l:3:f:7:cf:2\ncell:D19:t:Airfare:l:3:f:6:cf:2\ncell:E19:v:98:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F19:vtf:n:1176:IF( (E19*12)=0,"",(E19*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G19:b::::1\ncell:O19:l:1:f:7:cf:2\ncell:P19:l:1:f:7:cf:2\ncell:Q19:l:1:f:7:cf:2\ncell:R19:l:1:f:7:cf:2\ncell:S19:l:1:f:7:cf:2\ncell:T19:l:1:f:7:cf:2\ncell:U19:l:1:f:7:cf:2\ncell:V19:l:1:f:7:cf:2\ncell:W19:l:1:f:7:cf:2\ncell:A20:b::1::\ncell:B20:b::::1:l:3:f:7:bg:2:cf:2\ncell:C20:l:3:f:7:bg:2:cf:2\ncell:D20:t:Accomodation:l:3:f:6:bg:2:cf:2\ncell:E20:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F20:vtf:t::IF( (E20*12)=0,"",(E20*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G20:b::::1\ncell:O20:l:1:f:7:cf:2\ncell:P20:l:1:f:7:cf:2\ncell:Q20:l:1:f:7:cf:2\ncell:R20:l:1:f:7:cf:2\ncell:S20:l:1:f:7:cf:2\ncell:T20:l:1:f:7:cf:2\ncell:U20:l:1:f:7:cf:2\ncell:V20:l:1:f:7:cf:2\ncell:W20:l:1:f:7:cf:2\ncell:A21:b::1::\ncell:B21:b::::1:l:3:f:7:cf:2\ncell:C21:l:3:f:7:cf:2\ncell:D21:t:Food:l:3:f:6:cf:2\ncell:E21:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F21:vtf:t::IF( (E21*12)=0,"",(E21*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G21:b::::1\ncell:O21:l:1:f:7:cf:2\ncell:P21:l:1:f:7:cf:2\ncell:Q21:l:1:f:7:cf:2\ncell:R21:l:1:f:7:cf:2\ncell:S21:l:1:f:7:cf:2\ncell:T21:l:1:f:7:cf:2\ncell:U21:l:1:f:7:cf:2\ncell:V21:l:1:f:7:cf:2\ncell:W21:l:1:f:7:cf:2\ncell:A22:b::1::\ncell:B22:b::::1:l:3:f:7:bg:2:cf:2\ncell:C22:l:3:f:7:bg:2:cf:2\ncell:D22:t:Pet Boarding:l:3:f:6:bg:2:cf:2\ncell:E22:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F22:vtf:t::IF( (E22*12)=0,"",(E22*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G22:b::::1\ncell:O22:l:1:f:7:cf:2\ncell:P22:l:1:f:7:cf:2\ncell:Q22:l:1:f:7:cf:2\ncell:R22:l:1:f:7:cf:2\ncell:S22:l:1:f:7:cf:2\ncell:T22:l:1:f:7:cf:2\ncell:U22:l:1:f:7:cf:2\ncell:V22:l:1:f:7:cf:2\ncell:W22:l:1:f:7:cf:2\ncell:A23:b::1::\ncell:B23:b::::1:l:3:f:7:cf:2\ncell:C23:l:3:f:7:cf:2\ncell:D23:t:Rental Car:l:3:f:6:cf:2\ncell:E23:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F23:vtf:t::IF( (E23*12)=0,"",(E23*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G23:b::::1\ncell:O23:l:1:f:7:cf:2\ncell:P23:l:1:f:7:cf:2\ncell:Q23:l:1:f:7:cf:2\ncell:R23:l:1:f:7:cf:2\ncell:S23:l:1:f:7:cf:2\ncell:T23:l:1:f:7:cf:2\ncell:U23:l:1:f:7:cf:2\ncell:V23:l:1:f:7:cf:2\ncell:W23:l:1:f:7:cf:2\ncell:A24:b::1::\ncell:B24:b::::1:l:3:f:7:bg:2:cf:2\ncell:C24:l:3:f:7:bg:2:cf:2\ncell:D24:t:Souvenier:l:3:f:6:bg:2:cf:2\ncell:E24:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F24:vtf:t::IF( (E24*12)=0,"",(E24*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G24:b::::1\ncell:O24:l:1:f:7:cf:2\ncell:P24:l:1:f:7:cf:2\ncell:Q24:l:1:f:7:cf:2\ncell:R24:l:1:f:7:cf:2\ncell:A25:b::1::\ncell:B25:b::::1:l:3:f:7:cf:2\ncell:C25:l:3:f:7:cf:2\ncell:D25:t:Others:l:3:f:6:cf:2\ncell:E25:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F25:vtf:t::IF( (E25*12)=0,"",(E25*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G25:b::::1\ncell:O25:l:1:f:7:cf:2\ncell:P25:l:1:f:7:cf:2\ncell:Q25:l:1:f:7:cf:2\ncell:R25:l:1:f:7:cf:2\ncell:B26:t:Miscellaneous:l:3:f:2:c:3:bg:1:cf:2:colspan:3\ncell:C26:l:3:f:2:c:3:bg:1:cf:2\ncell:D26:l:3:f:2:c:3:bg:1:cf:1\ncell:E26:vtf:n:222:SUM(E27\\cE29):b:2:2:2:2:l:4:f:2:c:3:bg:1:ntvf:1\ncell:F26:vtf:n:2664:IF( (E26*12)=0,"",(E26*12)):b:2:2:2:2:l:4:f:2:c:3:bg:1:cf:3:ntvf:1\ncell:O26:l:1:f:7:cf:2\ncell:P26:l:1:f:7:cf:2\ncell:Q26:l:1:f:7:cf:2\ncell:R26:l:1:f:7:cf:2\ncell:A27:b::1::\ncell:B27:b::::1:l:3:f:7:cf:2\ncell:C27:l:3:f:7:cf:2\ncell:D27:t:Tobacco Consumption:l:3:f:6:cf:2\ncell:E27:v:136:b::1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F27:vtf:n:1632:IF( (E27*12)=0,"",(E27*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G27:b::::1\ncell:O27:l:1:f:7:cf:2\ncell:P27:l:1:f:7:cf:2\ncell:Q27:l:1:f:7:cf:2\ncell:R27:l:1:f:7:cf:2\ncell:A28:b::1::\ncell:B28:b::::1:l:3:f:7:bg:2:cf:2\ncell:C28:l:3:f:7:bg:2:cf:2\ncell:D28:t:Others:l:3:f:6:bg:2:cf:2\ncell:E28:v:86:b:1:1:1:1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:F28:vtf:n:1032:IF( (E28*12)=0,"",(E28*12)):b::1::1:l:4:f:6:bg:2:cf:3:ntvf:1\ncell:G28:b::::1\ncell:O28:l:1:f:7:cf:2\ncell:P28:l:1:f:7:cf:2\ncell:Q28:l:1:f:7:cf:2\ncell:R28:l:1:f:7:cf:2\ncell:A29:b::1::\ncell:B29:b::::1:l:3:f:7:cf:2\ncell:C29:l:3:f:7:cf:2\ncell:D29:t:Others:l:3:f:6:cf:2\ncell:E29:b:1:1:1:1:l:4:f:6:cf:3:ntvf:1\ncell:F29:vtf:t::IF( (E29*12)=0,"",(E29*12)):b::1::1:l:4:f:6:cf:3:ntvf:1\ncell:G29:b::::1\ncell:O29:l:1:f:7:cf:2\ncell:P29:l:1:f:7:cf:2\ncell:Q29:l:1:f:7:cf:2\ncell:R29:l:1:f:7:cf:2\ncell:B30:t:Total Expenses:l:5:f:3:c:3:bg:1:cf:1:colspan:3\ncell:C30:c:3:bg:1\ncell:D30:c:3:bg:1\ncell:E30:vtf:n:4853:sheet10!E25 +sheet10!E22 +sheet10!E18 +sheet10!E13 +sheet10!E4 +sheet9!E26 +sheet9!E17 +sheet9!E12 +sheet9!E4 + expense!E7+sheet11!E26 +sheet11!E18+ sheet11!E12 +sheet11!E4:b:2:2:2:2:c:3:bg:1:ntvf:2\ncell:F30:vtf:n:58236:IF((E30*12)=0,"",(E30*12)):b:2:2:2:2:c:3:bg:1:ntvf:2\ncell:O30:l:1:f:7:cf:2\ncell:P30:l:1:f:7:cf:2\ncell:Q30:l:1:f:7:cf:2\ncell:R30:l:1:f:7:cf:2\ncell:O31:l:1:f:7:cf:2\ncell:P31:l:1:f:7:cf:2\ncell:Q31:l:1:f:7:cf:2\ncell:R31:l:1:f:7:cf:2\ncell:O32:l:1:f:7:cf:2\ncell:P32:l:1:f:7:cf:2\ncell:Q32:l:1:f:7:cf:2\ncell:R32:l:1:f:7:cf:2\ncell:O33:l:1:f:7:cf:2\ncell:P33:l:1:f:7:cf:2\ncell:Q33:l:1:f:7:cf:2\ncell:R33:l:1:f:7:cf:2\ncell:O34:l:1:f:7:cf:2\ncell:P34:l:1:f:7:cf:2\ncell:Q34:l:1:f:7:cf:2\ncell:R34:l:1:f:7:cf:2\ncell:O35:l:1:f:7:cf:2\ncell:P35:l:1:f:7:cf:2\ncell:Q35:l:1:f:7:cf:2\ncell:R35:l:1:f:7:cf:2\ncell:O36:l:1:f:7:cf:2\ncell:P36:l:1:f:7:cf:2\ncell:Q36:l:1:f:7:cf:2\ncell:R36:l:1:f:7:cf:2\ncell:O37:l:1:f:7:cf:2\ncell:P37:l:1:f:7:cf:2\ncell:Q37:l:1:f:7:cf:2\ncell:R37:l:1:f:7:cf:2\ncell:O38:l:1:f:7:cf:2\ncell:P38:l:1:f:7:cf:2\ncell:Q38:l:1:f:7:cf:2\ncell:R38:l:1:f:7:cf:2\ncell:B39:l:1:f:7:cf:2\ncell:C39:l:1:f:7:cf:2\ncell:D39:l:1:f:2:cf:2\ncell:E39:l:1:f:2:cf:3:ntvf:1\ncell:F39:l:1:f:2:cf:3:ntvf:1\ncell:O39:l:1:f:7:cf:2\ncell:P39:l:1:f:7:cf:2\ncell:Q39:l:1:f:7:cf:2\ncell:R39:l:1:f:7:cf:2\ncell:B40:l:1:f:5:cf:2\ncell:C40:l:1:f:5:cf:2\ncell:D40:l:1:f:9:cf:2\ncell:E40:l:1:f:9:cf:2\ncell:F40:l:1:f:7:cf:2\ncell:O40:l:1:f:7:cf:2\ncell:P40:l:1:f:7:cf:2\ncell:Q40:l:1:f:7:cf:2\ncell:R40:l:1:f:7:cf:2\ncell:O41:l:1:f:7:cf:2\ncell:P41:l:1:f:7:cf:2\ncell:Q41:l:1:f:7:cf:2\ncell:R41:l:1:f:7:cf:2\ncell:O42:l:1:f:7:cf:2\ncell:P42:l:1:f:7:cf:2\ncell:Q42:l:1:f:7:cf:2\ncell:R42:l:1:f:7:cf:2\ncell:O43:l:1:f:7:cf:2\ncell:P43:l:1:f:7:cf:2\ncell:Q43:l:1:f:7:cf:2\ncell:R43:l:1:f:7:cf:2\ncell:O44:l:1:f:7:cf:2\ncell:P44:l:1:f:7:cf:2\ncell:Q44:l:1:f:7:cf:2\ncell:R44:l:1:f:7:cf:2\ncell:O45:l:1:f:7:cf:2\ncell:P45:l:1:f:7:cf:2\ncell:Q45:l:1:f:7:cf:2\ncell:R45:l:1:f:7:cf:2\ncell:O46:l:1:f:7:cf:2\ncell:P46:l:1:f:7:cf:2\ncell:Q46:l:1:f:7:cf:2\ncell:R46:l:1:f:7:cf:2\ncell:O47:l:1:f:7:cf:2\ncell:P47:l:1:f:7:cf:2\ncell:Q47:l:1:f:7:cf:2\ncell:R47:l:1:f:7:cf:2\ncell:O48:l:1:f:7:cf:2\ncell:P48:l:1:f:7:cf:2\ncell:Q48:l:1:f:7:cf:2\ncell:R48:l:1:f:7:cf:2\ncell:O49:l:1:f:7:cf:2\ncell:P49:l:1:f:7:cf:2\ncell:Q49:l:1:f:7:cf:2\ncell:R49:l:1:f:7:cf:2\ncell:O50:l:1:f:7:cf:2\ncell:P50:l:1:f:7:cf:2\ncell:Q50:l:1:f:7:cf:2\ncell:R50:l:1:f:7:cf:2\ncell:S50:l:1:f:7:cf:2\ncell:T50:l:1:f:7:cf:2\ncell:U50:l:1:f:7:cf:2\ncell:V50:l:1:f:7:cf:2\ncell:W50:l:1:f:7:cf:2\ncell:O51:l:1:f:7:cf:2\ncell:P51:l:1:f:7:cf:2\ncell:Q51:l:1:f:7:cf:2\ncell:R51:l:1:f:7:cf:2\ncell:S51:l:1:f:7:cf:2\ncell:T51:l:1:f:7:cf:2\ncell:U51:l:1:f:7:cf:2\ncell:V51:l:1:f:7:cf:2\ncell:W51:l:1:f:7:cf:2\ncell:O52:l:1:f:7:cf:2\ncell:P52:l:1:f:7:cf:2\ncell:Q52:l:1:f:7:cf:2\ncell:R52:l:1:f:7:cf:2\ncell:S52:l:1:f:7:cf:2\ncell:T52:l:1:f:7:cf:2\ncell:U52:l:1:f:7:cf:2\ncell:V52:l:1:f:7:cf:2\ncell:W52:l:1:f:7:cf:2\ncell:O53:l:1:f:7:cf:2\ncell:P53:l:1:f:7:cf:2\ncell:Q53:l:1:f:7:cf:2\ncell:R53:l:1:f:7:cf:2\ncell:S53:l:1:f:7:cf:2\ncell:T53:l:1:f:7:cf:2\ncell:U53:l:1:f:7:cf:2\ncell:V53:l:1:f:7:cf:2\ncell:W53:l:1:f:7:cf:2\ncell:O54:l:1:f:7:cf:2\ncell:P54:l:1:f:7:cf:2\ncell:Q54:l:1:f:7:cf:2\ncell:R54:l:1:f:7:cf:2\ncell:S54:l:1:f:7:cf:2\ncell:T54:l:1:f:7:cf:2\ncell:U54:l:1:f:7:cf:2\ncell:V54:l:1:f:7:cf:2\ncell:W54:l:1:f:7:cf:2\ncell:O55:l:1:f:7:cf:2\ncell:P55:l:1:f:7:cf:2\ncell:Q55:l:1:f:7:cf:2\ncell:R55:l:1:f:7:cf:2\ncell:S55:l:1:f:7:cf:2\ncell:T55:l:1:f:7:cf:2\ncell:U55:l:1:f:7:cf:2\ncell:V55:l:1:f:7:cf:2\ncell:W55:l:1:f:7:cf:2\ncell:O56:l:1:f:7:cf:2\ncell:P56:l:1:f:7:cf:2\ncell:Q56:l:1:f:7:cf:2\ncell:R56:l:1:f:7:cf:2\ncell:S56:l:1:f:7:cf:2\ncell:T56:l:1:f:7:cf:2\ncell:U56:l:1:f:7:cf:2\ncell:V56:l:1:f:7:cf:2\ncell:W56:l:1:f:7:cf:2\ncell:O57:l:1:f:7:cf:2\ncell:P57:l:1:f:7:cf:2\ncell:Q57:l:1:f:7:cf:2\ncell:R57:l:1:f:7:cf:2\ncell:S57:l:1:f:7:cf:2\ncell:T57:l:1:f:7:cf:2\ncell:U57:l:1:f:7:cf:2\ncell:V57:l:1:f:7:cf:2\ncell:W57:l:1:f:7:cf:2\ncell:O58:l:1:f:7:cf:2\ncell:P58:l:1:f:7:cf:2\ncell:Q58:l:1:f:7:cf:2\ncell:R58:l:1:f:7:cf:2\ncell:S58:l:1:f:7:cf:2\ncell:T58:l:1:f:7:cf:2\ncell:U58:l:1:f:7:cf:2\ncell:V58:l:1:f:7:cf:2\ncell:W58:l:1:f:7:cf:2\ncell:O59:l:1:f:7:cf:2\ncell:P59:l:1:f:7:cf:2\ncell:Q59:l:1:f:7:cf:2\ncell:R59:l:1:f:7:cf:2\ncell:S59:l:1:f:7:cf:2\ncell:T59:l:1:f:7:cf:2\ncell:U59:l:1:f:7:cf:2\ncell:V59:l:1:f:7:cf:2\ncell:W59:l:1:f:7:cf:2\ncell:O60:l:1:f:7:cf:2\ncell:P60:l:1:f:7:cf:2\ncell:Q60:l:1:f:7:cf:2\ncell:R60:l:1:f:7:cf:2\ncell:S60:l:1:f:7:cf:2\ncell:T60:l:1:f:7:cf:2\ncell:U60:l:1:f:7:cf:2\ncell:V60:l:1:f:7:cf:2\ncell:W60:l:1:f:7:cf:2\ncell:O61:l:1:f:7:cf:2\ncell:P61:l:1:f:7:cf:2\ncell:Q61:l:1:f:7:cf:2\ncell:R61:l:1:f:7:cf:2\ncell:S61:l:1:f:7:cf:2\ncell:T61:l:1:f:7:cf:2\ncell:U61:l:1:f:7:cf:2\ncell:V61:l:1:f:7:cf:2\ncell:W61:l:1:f:7:cf:2\ncell:O62:l:1:f:7:cf:2\ncell:P62:l:1:f:7:cf:2\ncell:Q62:l:1:f:7:cf:2\ncell:R62:l:1:f:7:cf:2\ncell:S62:l:1:f:7:cf:2\ncell:T62:l:1:f:7:cf:2\ncell:U62:l:1:f:7:cf:2\ncell:V62:l:1:f:7:cf:2\ncell:W62:l:1:f:7:cf:2\ncell:O63:l:1:f:7:cf:2\ncell:P63:l:1:f:7:cf:2\ncell:Q63:l:1:f:7:cf:2\ncell:R63:l:1:f:7:cf:2\ncell:S63:l:1:f:7:cf:2\ncell:T63:l:1:f:7:cf:2\ncell:U63:l:1:f:7:cf:2\ncell:V63:l:1:f:7:cf:2\ncell:W63:l:1:f:7:cf:2\ncell:O64:l:1:f:7:cf:2\ncell:P64:l:1:f:7:cf:2\ncell:Q64:l:1:f:7:cf:2\ncell:R64:l:1:f:7:cf:2\ncell:S64:l:1:f:7:cf:2\ncell:T64:l:1:f:7:cf:2\ncell:U64:l:1:f:7:cf:2\ncell:V64:l:1:f:7:cf:2\ncell:W64:l:1:f:7:cf:2\ncell:O65:l:1:f:7:cf:2\ncell:P65:l:1:f:7:cf:2\ncell:Q65:l:1:f:7:cf:2\ncell:R65:l:1:f:7:cf:2\ncell:S65:l:1:f:7:cf:2\ncell:T65:l:1:f:7:cf:2\ncell:U65:l:1:f:7:cf:2\ncell:V65:l:1:f:7:cf:2\ncell:W65:l:1:f:7:cf:2\ncell:O66:l:1:f:7:cf:2\ncell:P66:l:1:f:7:cf:2\ncell:Q66:l:1:f:7:cf:2\ncell:R66:l:1:f:7:cf:2\ncell:S66:l:1:f:7:cf:2\ncell:T66:l:1:f:7:cf:2\ncell:U66:l:1:f:7:cf:2\ncell:V66:l:1:f:7:cf:2\ncell:W66:l:1:f:7:cf:2\ncell:O67:l:1:f:7:cf:2\ncell:P67:l:1:f:7:cf:2\ncell:Q67:l:1:f:7:cf:2\ncell:R67:l:1:f:7:cf:2\ncell:S67:l:1:f:7:cf:2\ncell:T67:l:1:f:7:cf:2\ncell:U67:l:1:f:7:cf:2\ncell:V67:l:1:f:7:cf:2\ncell:W67:l:1:f:7:cf:2\ncell:O68:l:1:f:7:cf:2\ncell:P68:l:1:f:7:cf:2\ncell:Q68:l:1:f:7:cf:2\ncell:R68:l:1:f:7:cf:2\ncell:S68:l:1:f:7:cf:2\ncell:T68:l:1:f:7:cf:2\ncell:U68:l:1:f:7:cf:2\ncell:V68:l:1:f:7:cf:2\ncell:W68:l:1:f:7:cf:2\ncell:O69:l:1:f:7:cf:2\ncell:P69:l:1:f:7:cf:2\ncell:Q69:l:1:f:7:cf:2\ncell:R69:l:1:f:7:cf:2\ncell:S69:l:1:f:7:cf:2\ncell:T69:l:1:f:7:cf:2\ncell:U69:l:1:f:7:cf:2\ncell:V69:l:1:f:7:cf:2\ncell:W69:l:1:f:7:cf:2\ncell:O70:l:1:f:7:cf:2\ncell:P70:l:1:f:7:cf:2\ncell:Q70:l:1:f:7:cf:2\ncell:R70:l:1:f:7:cf:2\ncell:S70:l:1:f:7:cf:2\ncell:T70:l:1:f:7:cf:2\ncell:U70:l:1:f:7:cf:2\ncell:V70:l:1:f:7:cf:2\ncell:W70:l:1:f:7:cf:2\ncell:O71:l:1:f:7:cf:2\ncell:P71:l:1:f:7:cf:2\ncell:Q71:l:1:f:7:cf:2\ncell:R71:l:1:f:7:cf:2\ncell:S71:l:1:f:7:cf:2\ncell:T71:l:1:f:7:cf:2\ncell:U71:l:1:f:7:cf:2\ncell:V71:l:1:f:7:cf:2\ncell:W71:l:1:f:7:cf:2\ncell:O72:l:1:f:7:cf:2\ncell:P72:l:1:f:7:cf:2\ncell:Q72:l:1:f:7:cf:2\ncell:R72:l:1:f:7:cf:2\ncell:S72:l:1:f:7:cf:2\ncell:T72:l:1:f:7:cf:2\ncell:U72:l:1:f:7:cf:2\ncell:V72:l:1:f:7:cf:2\ncell:W72:l:1:f:7:cf:2\ncell:O73:l:1:f:7:cf:2\ncell:P73:l:1:f:7:cf:2\ncell:Q73:l:1:f:7:cf:2\ncell:R73:l:1:f:7:cf:2\ncell:S73:l:1:f:7:cf:2\ncell:T73:l:1:f:7:cf:2\ncell:U73:l:1:f:7:cf:2\ncell:V73:l:1:f:7:cf:2\ncell:W73:l:1:f:7:cf:2\ncell:O74:l:1:f:7:cf:2\ncell:P74:l:1:f:7:cf:2\ncell:Q74:l:1:f:7:cf:2\ncell:R74:l:1:f:7:cf:2\ncell:S74:l:1:f:7:cf:2\ncell:T74:l:1:f:7:cf:2\ncell:U74:l:1:f:7:cf:2\ncell:V74:l:1:f:7:cf:2\ncell:W74:l:1:f:7:cf:2\ncell:O75:l:1:f:7:cf:2\ncell:P75:l:1:f:7:cf:2\ncell:Q75:l:1:f:7:cf:2\ncell:R75:l:1:f:7:cf:2\ncell:S75:l:1:f:7:cf:2\ncell:T75:l:1:f:7:cf:2\ncell:U75:l:1:f:7:cf:2\ncell:V75:l:1:f:7:cf:2\ncell:W75:l:1:f:7:cf:2\ncell:O76:l:1:f:7:cf:2\ncell:P76:l:1:f:7:cf:2\ncell:Q76:l:1:f:7:cf:2\ncell:R76:l:1:f:7:cf:2\ncell:S76:l:1:f:7:cf:2\ncell:T76:l:1:f:7:cf:2\ncell:U76:l:1:f:7:cf:2\ncell:V76:l:1:f:7:cf:2\ncell:W76:l:1:f:7:cf:2\ncell:O77:l:1:f:7:cf:2\ncell:P77:l:1:f:7:cf:2\ncell:Q77:l:1:f:7:cf:2\ncell:R77:l:1:f:7:cf:2\ncell:S77:l:1:f:7:cf:2\ncell:T77:l:1:f:7:cf:2\ncell:U77:l:1:f:7:cf:2\ncell:V77:l:1:f:7:cf:2\ncell:W77:l:1:f:7:cf:2\ncell:O78:l:1:f:7:cf:2\ncell:P78:l:1:f:7:cf:2\ncell:Q78:l:1:f:7:cf:2\ncell:R78:l:1:f:7:cf:2\ncell:S78:l:1:f:7:cf:2\ncell:T78:l:1:f:7:cf:2\ncell:U78:l:1:f:7:cf:2\ncell:V78:l:1:f:7:cf:2\ncell:W78:l:1:f:7:cf:2\ncell:O79:l:1:f:7:cf:2\ncell:P79:l:1:f:7:cf:2\ncell:Q79:l:1:f:7:cf:2\ncell:R79:l:1:f:7:cf:2\ncell:S79:l:1:f:7:cf:2\ncell:T79:l:1:f:7:cf:2\ncell:U79:l:1:f:7:cf:2\ncell:V79:l:1:f:7:cf:2\ncell:W79:l:1:f:7:cf:2\ncell:O80:l:1:f:7:cf:2\ncell:P80:l:1:f:7:cf:2\ncell:Q80:l:1:f:7:cf:2\ncell:R80:l:1:f:7:cf:2\ncell:S80:l:1:f:7:cf:2\ncell:T80:l:1:f:7:cf:2\ncell:U80:l:1:f:7:cf:2\ncell:V80:l:1:f:7:cf:2\ncell:W80:l:1:f:7:cf:2\ncell:O81:l:1:f:7:cf:2\ncell:P81:l:1:f:7:cf:2\ncell:Q81:l:1:f:7:cf:2\ncell:R81:l:1:f:7:cf:2\ncell:S81:l:1:f:7:cf:2\ncell:T81:l:1:f:7:cf:2\ncell:U81:l:1:f:7:cf:2\ncell:V81:l:1:f:7:cf:2\ncell:W81:l:1:f:7:cf:2\ncell:O82:l:1:f:7:cf:2\ncell:P82:l:1:f:7:cf:2\ncell:Q82:l:1:f:7:cf:2\ncell:R82:l:1:f:7:cf:2\ncell:S82:l:1:f:7:cf:2\ncell:T82:l:1:f:7:cf:2\ncell:U82:l:1:f:7:cf:2\ncell:V82:l:1:f:7:cf:2\ncell:W82:l:1:f:7:cf:2\ncell:O83:l:1:f:7:cf:2\ncell:P83:l:1:f:7:cf:2\ncell:Q83:l:1:f:7:cf:2\ncell:R83:l:1:f:7:cf:2\ncell:S83:l:1:f:7:cf:2\ncell:T83:l:1:f:7:cf:2\ncell:U83:l:1:f:7:cf:2\ncell:V83:l:1:f:7:cf:2\ncell:W83:l:1:f:7:cf:2\ncell:O84:l:1:f:7:cf:2\ncell:P84:l:1:f:7:cf:2\ncell:Q84:l:1:f:7:cf:2\ncell:R84:l:1:f:7:cf:2\ncell:S84:l:1:f:7:cf:2\ncell:T84:l:1:f:7:cf:2\ncell:U84:l:1:f:7:cf:2\ncell:V84:l:1:f:7:cf:2\ncell:W84:l:1:f:7:cf:2\ncell:O85:l:1:f:7:cf:2\ncell:P85:l:1:f:7:cf:2\ncell:Q85:l:1:f:7:cf:2\ncell:R85:l:1:f:7:cf:2\ncell:S85:l:1:f:7:cf:2\ncell:T85:l:1:f:7:cf:2\ncell:U85:l:1:f:7:cf:2\ncell:V85:l:1:f:7:cf:2\ncell:W85:l:1:f:7:cf:2\ncell:O86:l:1:f:7:cf:2\ncell:P86:l:1:f:7:cf:2\ncell:Q86:l:1:f:7:cf:2\ncell:R86:l:1:f:7:cf:2\ncell:S86:l:1:f:7:cf:2\ncell:T86:l:1:f:7:cf:2\ncell:U86:l:1:f:7:cf:2\ncell:V86:l:1:f:7:cf:2\ncell:W86:l:1:f:7:cf:2\ncell:O87:l:1:f:7:cf:2\ncell:P87:l:1:f:7:cf:2\ncell:Q87:l:1:f:7:cf:2\ncell:R87:l:1:f:7:cf:2\ncell:S87:l:1:f:7:cf:2\ncell:T87:l:1:f:7:cf:2\ncell:U87:l:1:f:7:cf:2\ncell:V87:l:1:f:7:cf:2\ncell:W87:l:1:f:7:cf:2\ncell:O88:l:1:f:7:cf:2\ncell:P88:l:1:f:7:cf:2\ncell:Q88:l:1:f:7:cf:2\ncell:R88:l:1:f:7:cf:2\ncell:S88:l:1:f:7:cf:2\ncell:T88:l:1:f:7:cf:2\ncell:U88:l:1:f:7:cf:2\ncell:V88:l:1:f:7:cf:2\ncell:W88:l:1:f:7:cf:2\ncell:O89:l:1:f:7:cf:2\ncell:P89:l:1:f:7:cf:2\ncell:Q89:l:1:f:7:cf:2\ncell:R89:l:1:f:7:cf:2\ncell:S89:l:1:f:7:cf:2\ncell:T89:l:1:f:7:cf:2\ncell:U89:l:1:f:7:cf:2\ncell:V89:l:1:f:7:cf:2\ncell:W89:l:1:f:7:cf:2\ncell:O90:l:1:f:7:cf:2\ncell:P90:l:1:f:7:cf:2\ncell:Q90:l:1:f:7:cf:2\ncell:R90:l:1:f:7:cf:2\ncell:S90:l:1:f:7:cf:2\ncell:T90:l:1:f:7:cf:2\ncell:U90:l:1:f:7:cf:2\ncell:V90:l:1:f:7:cf:2\ncell:W90:l:1:f:7:cf:2\ncell:O91:l:1:f:7:cf:2\ncell:P91:l:1:f:7:cf:2\ncell:Q91:l:1:f:7:cf:2\ncell:R91:l:1:f:7:cf:2\ncell:S91:l:1:f:7:cf:2\ncell:T91:l:1:f:7:cf:2\ncell:U91:l:1:f:7:cf:2\ncell:V91:l:1:f:7:cf:2\ncell:W91:l:1:f:7:cf:2\ncell:O92:l:1:f:7:cf:2\ncell:P92:l:1:f:7:cf:2\ncell:Q92:l:1:f:7:cf:2\ncell:R92:l:1:f:7:cf:2\ncell:S92:l:1:f:7:cf:2\ncell:T92:l:1:f:7:cf:2\ncell:U92:l:1:f:7:cf:2\ncell:V92:l:1:f:7:cf:2\ncell:W92:l:1:f:7:cf:2\ncell:O93:l:1:f:7:cf:2\ncell:P93:l:1:f:7:cf:2\ncell:Q93:l:1:f:7:cf:2\ncell:R93:l:1:f:7:cf:2\ncell:S93:l:1:f:7:cf:2\ncell:T93:l:1:f:7:cf:2\ncell:U93:l:1:f:7:cf:2\ncell:V93:l:1:f:7:cf:2\ncell:W93:l:1:f:7:cf:2\ncell:O94:l:1:f:7:cf:2\ncell:P94:l:1:f:7:cf:2\ncell:Q94:l:1:f:7:cf:2\ncell:R94:l:1:f:7:cf:2\ncell:S94:l:1:f:7:cf:2\ncell:T94:l:1:f:7:cf:2\ncell:U94:l:1:f:7:cf:2\ncell:V94:l:1:f:7:cf:2\ncell:W94:l:1:f:7:cf:2\ncell:O95:l:1:f:7:cf:2\ncell:P95:l:1:f:7:cf:2\ncell:Q95:l:1:f:7:cf:2\ncell:R95:l:1:f:7:cf:2\ncell:S95:l:1:f:7:cf:2\ncell:T95:l:1:f:7:cf:2\ncell:U95:l:1:f:7:cf:2\ncell:V95:l:1:f:7:cf:2\ncell:W95:l:1:f:7:cf:2\ncell:O96:l:1:f:7:cf:2\ncell:P96:l:1:f:7:cf:2\ncell:Q96:l:1:f:7:cf:2\ncell:R96:l:1:f:7:cf:2\ncell:S96:l:1:f:7:cf:2\ncell:T96:l:1:f:7:cf:2\ncell:U96:l:1:f:7:cf:2\ncell:V96:l:1:f:7:cf:2\ncell:W96:l:1:f:7:cf:2\ncell:O97:l:1:f:7:cf:2\ncell:P97:l:1:f:7:cf:2\ncell:Q97:l:1:f:7:cf:2\ncell:R97:l:1:f:7:cf:2\ncell:S97:l:1:f:7:cf:2\ncell:T97:l:1:f:7:cf:2\ncell:U97:l:1:f:7:cf:2\ncell:V97:l:1:f:7:cf:2\ncell:W97:l:1:f:7:cf:2\ncell:O98:l:1:f:7:cf:2\ncell:P98:l:1:f:7:cf:2\ncell:Q98:l:1:f:7:cf:2\ncell:R98:l:1:f:7:cf:2\ncell:S98:l:1:f:7:cf:2\ncell:T98:l:1:f:7:cf:2\ncell:U98:l:1:f:7:cf:2\ncell:V98:l:1:f:7:cf:2\ncell:W98:l:1:f:7:cf:2\ncell:O99:l:1:f:7:cf:2\ncell:P99:l:1:f:7:cf:2\ncell:Q99:l:1:f:7:cf:2\ncell:R99:l:1:f:7:cf:2\ncell:S99:l:1:f:7:cf:2\ncell:T99:l:1:f:7:cf:2\ncell:U99:l:1:f:7:cf:2\ncell:V99:l:1:f:7:cf:2\ncell:W99:l:1:f:7:cf:2\ncell:O100:l:1:f:7:cf:2\ncell:P100:l:1:f:7:cf:2\ncell:Q100:l:1:f:7:cf:2\ncell:R100:l:1:f:7:cf:2\ncell:S100:l:1:f:7:cf:2\ncell:T100:l:1:f:7:cf:2\ncell:U100:l:1:f:7:cf:2\ncell:V100:l:1:f:7:cf:2\ncell:W100:l:1:f:7:cf:2\ncell:O101:l:1:f:7:cf:2\ncell:P101:l:1:f:7:cf:2\ncell:Q101:l:1:f:7:cf:2\ncell:R101:l:1:f:7:cf:2\ncell:S101:l:1:f:7:cf:2\ncell:T101:l:1:f:7:cf:2\ncell:U101:l:1:f:7:cf:2\ncell:V101:l:1:f:7:cf:2\ncell:W101:l:1:f:7:cf:2\ncell:O102:l:1:f:8:cf:2\ncell:P102:l:1:f:8:cf:2\ncell:Q102:l:1:f:8:cf:2\ncell:R102:l:1:f:8:cf:2\ncell:S102:l:1:f:8:cf:2\ncell:T102:l:1:f:8:cf:2\ncell:U102:l:1:f:8:cf:2\ncell:V102:l:1:f:8:cf:2\ncell:W102:l:1:f:8:cf:2\ncell:O103:l:1:f:8:cf:2\ncell:P103:l:1:f:8:cf:2\ncell:Q103:l:1:f:8:cf:2\ncell:R103:l:1:f:8:cf:2\ncell:S103:l:1:f:8:cf:2\ncell:T103:l:1:f:8:cf:2\ncell:U103:l:1:f:8:cf:2\ncell:V103:l:1:f:8:cf:2\ncell:W103:l:1:f:8:cf:2\ncell:O104:l:1:f:8:cf:2\ncell:P104:l:1:f:8:cf:2\ncell:Q104:l:1:f:8:cf:2\ncell:R104:l:1:f:8:cf:2\ncell:S104:l:1:f:8:cf:2\ncell:T104:l:1:f:8:cf:2\ncell:U104:l:1:f:8:cf:2\ncell:V104:l:1:f:8:cf:2\ncell:W104:l:1:f:8:cf:2\ncell:O105:l:1:f:8:cf:2\ncell:P105:l:1:f:8:cf:2\ncell:Q105:l:1:f:8:cf:2\ncell:R105:l:1:f:8:cf:2\ncell:S105:l:1:f:8:cf:2\ncell:T105:l:1:f:8:cf:2\ncell:U105:l:1:f:8:cf:2\ncell:V105:l:1:f:8:cf:2\ncell:W105:l:1:f:8:cf:2\ncell:A106:l:1:f:8:cf:2\ncell:B106:l:1:f:8:cf:2\ncell:C106:l:1:f:8:cf:2\ncell:D106:l:1:f:8:cf:2\ncell:E106:l:1:f:8:cf:2\ncell:F106:t:Monthly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G106:l:1:f:8:cf:2\ncell:H106:l:1:f:8:cf:2\ncell:I106:l:1:f:8:cf:2\ncell:J106:l:1:f:8:cf:2\ncell:K106:l:1:f:8:cf:2\ncell:L106:l:1:f:8:cf:2\ncell:M106:l:1:f:8:cf:2\ncell:N106:l:1:f:8:cf:2\ncell:O106:l:1:f:8:cf:2\ncell:P106:l:1:f:8:cf:2\ncell:Q106:l:1:f:8:cf:2\ncell:R106:l:1:f:8:cf:2\ncell:S106:l:1:f:8:cf:2\ncell:T106:l:1:f:8:cf:2\ncell:U106:l:1:f:8:cf:2\ncell:V106:l:1:f:8:cf:2\ncell:W106:l:1:f:8:cf:2\ncell:A107:l:1:f:8:cf:2\ncell:B107:l:1:f:8:cf:2\ncell:C107:l:1:f:8:cf:2\ncell:D107:l:1:f:8:cf:2\ncell:E107:l:1:f:8:cf:2\ncell:F107:t:Semi-Annually:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G107:l:1:f:8:cf:2\ncell:H107:l:1:f:8:cf:2\ncell:I107:l:1:f:8:cf:2\ncell:J107:l:1:f:8:cf:2\ncell:K107:l:1:f:8:cf:2\ncell:L107:l:1:f:8:cf:2\ncell:M107:l:1:f:8:cf:2\ncell:N107:l:1:f:8:cf:2\ncell:O107:l:1:f:8:cf:2\ncell:P107:l:1:f:8:cf:2\ncell:Q107:l:1:f:8:cf:2\ncell:R107:l:1:f:8:cf:2\ncell:S107:l:1:f:8:cf:2\ncell:T107:l:1:f:8:cf:2\ncell:U107:l:1:f:8:cf:2\ncell:V107:l:1:f:8:cf:2\ncell:W107:l:1:f:8:cf:2\ncell:A108:l:1:f:8:cf:2\ncell:B108:l:1:f:8:cf:2\ncell:C108:l:1:f:8:cf:2\ncell:D108:l:1:f:8:cf:2\ncell:E108:l:1:f:8:cf:2\ncell:F108:t:Quarterly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G108:l:1:f:8:cf:2\ncell:H108:l:1:f:8:cf:2\ncell:I108:l:1:f:8:cf:2\ncell:J108:l:1:f:8:cf:2\ncell:K108:l:1:f:8:cf:2\ncell:L108:l:1:f:8:cf:2\ncell:M108:l:1:f:8:cf:2\ncell:N108:l:1:f:8:cf:2\ncell:O108:l:1:f:8:cf:2\ncell:P108:l:1:f:8:cf:2\ncell:Q108:l:1:f:8:cf:2\ncell:R108:l:1:f:8:cf:2\ncell:S108:l:1:f:8:cf:2\ncell:T108:l:1:f:8:cf:2\ncell:U108:l:1:f:8:cf:2\ncell:V108:l:1:f:8:cf:2\ncell:W108:l:1:f:8:cf:2\ncell:A109:l:1:f:8:cf:2\ncell:B109:l:1:f:8:cf:2\ncell:C109:l:1:f:8:cf:2\ncell:D109:l:1:f:8:cf:2\ncell:E109:l:1:f:8:cf:2\ncell:F109:t:Yearly:l:1:f:8:cf:2:tvf:3:ntvf:3\ncell:G109:l:1:f:8:cf:2\ncell:H109:l:1:f:8:cf:2\ncell:I109:l:1:f:8:cf:2\ncell:J109:l:1:f:8:cf:2\ncell:K109:l:1:f:8:cf:2\ncell:L109:l:1:f:8:cf:2\ncell:M109:l:1:f:8:cf:2\ncell:N109:l:1:f:8:cf:2\ncell:O109:l:1:f:8:cf:2\ncell:P109:l:1:f:8:cf:2\ncell:Q109:l:1:f:8:cf:2\ncell:R109:l:1:f:8:cf:2\ncell:S109:l:1:f:8:cf:2\ncell:T109:l:1:f:8:cf:2\ncell:U109:l:1:f:8:cf:2\ncell:V109:l:1:f:8:cf:2\ncell:W109:l:1:f:8:cf:2\ncell:A110:l:1:f:8:cf:2\ncell:B110:l:1:f:8:cf:2\ncell:C110:l:1:f:8:cf:2\ncell:D110:l:1:f:8:cf:2\ncell:E110:l:1:f:8:cf:2\ncell:F110:l:1:f:8:cf:2\ncell:G110:l:1:f:8:cf:2\ncell:H110:l:1:f:8:cf:2\ncell:I110:l:1:f:8:cf:2\ncell:J110:l:1:f:8:cf:2\ncell:K110:l:1:f:8:cf:2\ncell:L110:l:1:f:8:cf:2\ncell:M110:l:1:f:8:cf:2\ncell:N110:l:1:f:8:cf:2\ncell:O110:l:1:f:8:cf:2\ncell:P110:l:1:f:8:cf:2\ncell:Q110:l:1:f:8:cf:2\ncell:R110:l:1:f:8:cf:2\ncell:S110:l:1:f:8:cf:2\ncell:T110:l:1:f:8:cf:2\ncell:U110:l:1:f:8:cf:2\ncell:V110:l:1:f:8:cf:2\ncell:W110:l:1:f:8:cf:2\ncell:A111:l:1:f:8:cf:2\ncell:B111:l:1:f:8:cf:2\ncell:C111:l:1:f:8:cf:2\ncell:D111:l:1:f:8:cf:2\ncell:E111:l:1:f:8:cf:2\ncell:F111:l:1:f:8:cf:2\ncell:G111:l:1:f:8:cf:2\ncell:H111:l:1:f:8:cf:2\ncell:I111:l:1:f:8:cf:2\ncell:J111:l:1:f:8:cf:2\ncell:K111:l:1:f:8:cf:2\ncell:L111:l:1:f:8:cf:2\ncell:M111:l:1:f:8:cf:2\ncell:N111:l:1:f:8:cf:2\ncell:O111:l:1:f:8:cf:2\ncell:P111:l:1:f:8:cf:2\ncell:Q111:l:1:f:8:cf:2\ncell:R111:l:1:f:8:cf:2\ncell:S111:l:1:f:8:cf:2\ncell:T111:l:1:f:8:cf:2\ncell:U111:l:1:f:8:cf:2\ncell:V111:l:1:f:8:cf:2\ncell:W111:l:1:f:8:cf:2\ncell:A112:l:1:f:8:cf:2\ncell:B112:l:1:f:8:cf:2\ncell:C112:l:1:f:8:cf:2\ncell:D112:l:1:f:8:cf:2\ncell:E112:l:1:f:8:cf:2\ncell:F112:l:1:f:8:cf:2\ncell:G112:l:1:f:8:cf:2\ncell:H112:l:1:f:8:cf:2\ncell:I112:l:1:f:8:cf:2\ncell:J112:l:1:f:8:cf:2\ncell:K112:l:1:f:8:cf:2\ncell:L112:l:1:f:8:cf:2\ncell:M112:l:1:f:8:cf:2\ncell:N112:l:1:f:8:cf:2\ncell:O112:l:1:f:8:cf:2\ncell:P112:l:1:f:8:cf:2\ncell:Q112:l:1:f:8:cf:2\ncell:R112:l:1:f:8:cf:2\ncell:S112:l:1:f:8:cf:2\ncell:T112:l:1:f:8:cf:2\ncell:U112:l:1:f:8:cf:2\ncell:V112:l:1:f:8:cf:2\ncell:W112:l:1:f:8:cf:2\ncell:A113:l:1:f:8:cf:2\ncell:B113:l:1:f:8:cf:2\ncell:C113:l:1:f:8:cf:2\ncell:D113:l:1:f:8:cf:2\ncell:E113:l:1:f:8:cf:2\ncell:F113:l:1:f:8:cf:2\ncell:G113:l:1:f:8:cf:2\ncell:H113:l:1:f:8:cf:2\ncell:I113:l:1:f:8:cf:2\ncell:J113:l:1:f:8:cf:2\ncell:K113:l:1:f:8:cf:2\ncell:L113:l:1:f:8:cf:2\ncell:M113:l:1:f:8:cf:2\ncell:N113:l:1:f:8:cf:2\ncell:O113:l:1:f:8:cf:2\ncell:P113:l:1:f:8:cf:2\ncell:Q113:l:1:f:8:cf:2\ncell:R113:l:1:f:8:cf:2\ncell:S113:l:1:f:8:cf:2\ncell:T113:l:1:f:8:cf:2\ncell:U113:l:1:f:8:cf:2\ncell:V113:l:1:f:8:cf:2\ncell:W113:l:1:f:8:cf:2\ncell:A114:l:1:f:8:cf:2\ncell:B114:l:1:f:8:cf:2\ncell:C114:l:1:f:8:cf:2\ncell:D114:l:1:f:8:cf:2\ncell:E114:l:1:f:8:cf:2\ncell:F114:l:1:f:8:cf:2\ncell:G114:l:1:f:8:cf:2\ncell:H114:l:1:f:8:cf:2\ncell:I114:l:1:f:8:cf:2\ncell:J114:l:1:f:8:cf:2\ncell:K114:l:1:f:8:cf:2\ncell:L114:l:1:f:8:cf:2\ncell:M114:l:1:f:8:cf:2\ncell:N114:l:1:f:8:cf:2\ncell:O114:l:1:f:8:cf:2\ncell:P114:l:1:f:8:cf:2\ncell:Q114:l:1:f:8:cf:2\ncell:R114:l:1:f:8:cf:2\ncell:S114:l:1:f:8:cf:2\ncell:T114:l:1:f:8:cf:2\ncell:U114:l:1:f:8:cf:2\ncell:V114:l:1:f:8:cf:2\ncell:W114:l:1:f:8:cf:2\ncell:A115:l:1:f:8:cf:2\ncell:B115:l:1:f:8:cf:2\ncell:C115:l:1:f:8:cf:2\ncell:D115:l:1:f:8:cf:2\ncell:E115:l:1:f:8:cf:2\ncell:F115:l:1:f:8:cf:2\ncell:G115:l:1:f:8:cf:2\ncell:H115:l:1:f:8:cf:2\ncell:I115:l:1:f:8:cf:2\ncell:J115:l:1:f:8:cf:2\ncell:K115:l:1:f:8:cf:2\ncell:L115:l:1:f:8:cf:2\ncell:M115:l:1:f:8:cf:2\ncell:N115:l:1:f:8:cf:2\ncell:O115:l:1:f:8:cf:2\ncell:P115:l:1:f:8:cf:2\ncell:Q115:l:1:f:8:cf:2\ncell:R115:l:1:f:8:cf:2\ncell:S115:l:1:f:8:cf:2\ncell:T115:l:1:f:8:cf:2\ncell:U115:l:1:f:8:cf:2\ncell:V115:l:1:f:8:cf:2\ncell:W115:l:1:f:8:cf:2\ncell:A116:l:1:f:8:cf:2\ncell:B116:l:1:f:8:cf:2\ncell:C116:l:1:f:8:cf:2\ncell:D116:l:1:f:8:cf:2\ncell:E116:l:1:f:8:cf:2\ncell:F116:l:1:f:8:cf:2\ncell:G116:l:1:f:8:cf:2\ncell:H116:l:1:f:8:cf:2\ncell:I116:l:1:f:8:cf:2\ncell:J116:l:1:f:8:cf:2\ncell:K116:l:1:f:8:cf:2\ncell:L116:l:1:f:8:cf:2\ncell:M116:l:1:f:8:cf:2\ncell:N116:l:1:f:8:cf:2\ncell:O116:l:1:f:8:cf:2\ncell:P116:l:1:f:8:cf:2\ncell:Q116:l:1:f:8:cf:2\ncell:R116:l:1:f:8:cf:2\ncell:S116:l:1:f:8:cf:2\ncell:T116:l:1:f:8:cf:2\ncell:U116:l:1:f:8:cf:2\ncell:V116:l:1:f:8:cf:2\ncell:W116:l:1:f:8:cf:2\ncell:A117:l:1:f:8:cf:2\ncell:B117:l:1:f:8:cf:2\ncell:C117:l:1:f:8:cf:2\ncell:D117:l:1:f:8:cf:2\ncell:E117:l:1:f:8:cf:2\ncell:F117:l:1:f:8:cf:2\ncell:G117:l:1:f:8:cf:2\ncell:H117:l:1:f:8:cf:2\ncell:I117:l:1:f:8:cf:2\ncell:J117:l:1:f:8:cf:2\ncell:K117:l:1:f:8:cf:2\ncell:L117:l:1:f:8:cf:2\ncell:M117:l:1:f:8:cf:2\ncell:N117:l:1:f:8:cf:2\ncell:O117:l:1:f:8:cf:2\ncell:P117:l:1:f:8:cf:2\ncell:Q117:l:1:f:8:cf:2\ncell:R117:l:1:f:8:cf:2\ncell:S117:l:1:f:8:cf:2\ncell:T117:l:1:f:8:cf:2\ncell:U117:l:1:f:8:cf:2\ncell:V117:l:1:f:8:cf:2\ncell:W117:l:1:f:8:cf:2\ncol:A:w:76\ncol:B:w:25\ncol:C:w:25\ncol:D:w:196\ncol:E:w:105\ncol:F:w:105\ncol:G:w:73\ncol:H:w:71\ncol:I:w:71\ncol:J:w:31\ncol:K:w:31\ncol:L:w:57\ncol:M:w:24\ncol:N:w:113\ncol:O:w:74\ncol:P:w:78\ncol:Q:w:64\ncol:R:w:64\ncol:S:w:64\ncol:T:w:64\ncol:U:w:64\ncol:V:w:64\ncol:W:w:64\ncol:X:w:64\ncol:Z:w:64\ncol:AA:w:64\nrow:1:h:14.25\nrow:2:h:14.25\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:52:h:14.25\nrow:53:h:14.25\nrow:54:h:14.25\nrow:55:h:14.25\nrow:56:h:14.25\nrow:57:h:14.25\nrow:58:h:14.25\nrow:59:h:14.25\nrow:60:h:14.25\nrow:61:h:14.25\nrow:62:h:14.25\nrow:63:h:14.25\nrow:64:h:14.25\nrow:65:h:14.25\nrow:66:h:14.25\nrow:67:h:14.25\nrow:68:h:14.25\nrow:69:h:14.25\nrow:70:h:14.25\nrow:71:h:14.25\nrow:72:h:14.25\nrow:73:h:14.25\nrow:74:h:14.25\nrow:75:h:14.25\nrow:76:h:14.25\nrow:77:h:14.25\nrow:78:h:14.25\nrow:79:h:14.25\nrow:80:h:14.25\nrow:81:h:14.25\nrow:82:h:14.25\nrow:83:h:14.25\nrow:84:h:14.25\nrow:85:h:14.25\nrow:86:h:14.25\nrow:87:h:14.25\nrow:88:h:14.25\nrow:89:h:14.25\nrow:90:h:14.25\nrow:91:h:14.25\nrow:92:h:14.25\nrow:93:h:14.25\nrow:94:h:14.25\nrow:95:h:14.25\nrow:96:h:14.25\nrow:97:h:14.25\nrow:98:h:14.25\nrow:99:h:14.25\nrow:100:h:14.25\nrow:101:h:14.25\nsheet:c:27:r:117:h:13.5:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold * Arial\nfont:3:normal bold 12pt arial,helvetica,sans-serif\nfont:4:normal bold 20pt Arial\nfont:5:normal bold 9pt Arial\nfont:6:normal normal * Arial\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 7pt Arial\nfont:9:normal normal 9pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* 4px * 12px;vertical-align:bottom;\nlayout:4:padding:* 8px * *;vertical-align:*;\nlayout:5:padding:* 8px * *;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:#,##0.00;\\b-#,##0.00;\\b-\nvalueformat:3:hidden\nname:COMPARISON::S43\\cU57\nname:TRACKING::AC43\\cAE57\n', - }, - name: "sheet11", - hidden: "0", - }, - sheet7: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:f:3:ntvf:3\ncell:B4:t:Comparison:l:1:f:6:c:1:bg:4:cf:2:colspan:3\ncell:B6:t:How does your spending compare to the guidelines ?:f:5:cf:2:colspan:6\ncell:C9:t:Expense Category:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:D9:t:Guideline:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:E9:t:Recommended Monthly Value:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:F9:t:Actual Monthly Value:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:B10:b::1::\ncell:C10:t:Housing:b::1::1:l:4:f:2\ncell:D10:v:0.35:b::1::1:l:5:f:2:ntvf:2\ncell:E10:vtf:n:1578.85:D10*INCOME!D23:b::1::1:l:5:f:2:ntvf:1\ncell:F10:vtf:n:1380:EXPENSE!E7:b::1::1:l:5:f:2:ntvf:1\ncell:G10:b::::1\ncell:B11:b::1::\ncell:C11:t:Transportation:b::1::1:l:4:f:2:bg:3\ncell:D11:vtc:n%:0.2:20%:b::1::1:l:5:f:2:bg:3:ntvf:2\ncell:E11:vtf:n:902.2:D11*INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:1\ncell:F11:vtf:n:640:sheet9!E17:b::1::1:l:5:f:2:bg:3:ntvf:1\ncell:G11:b::::1\ncell:B12:b::1::\ncell:C12:t:Debt:b::1::1:l:4:f:2\ncell:D12:v:0.05:b::1::1:l:5:f:2:ntvf:2\ncell:E12:vtf:n:225.55:D12*INCOME!D23:b::1::1:l:5:f:2:ntvf:1\ncell:F12:vtf:n:0:sheet11!E22:b::1::1:l:5:f:2:ntvf:1\ncell:G12:b::::1\ncell:B13:b::1::\ncell:C13:t:Savings:b::1:1:1:l:4:f:2:bg:3\ncell:D13:vtc:n:0.2:0.20:b::1:1:1:l:5:f:2:bg:3:ntvf:2\ncell:E13:vtf:n:902.2:D13*INCOME!D23:b::1:1:1:l:5:f:2:bg:3:ntvf:1\ncell:F13:vtf:n:-342:INCOME!D23-sheet11!E30:b::1:1:1:l:5:f:2:bg:3:ntvf:1\ncell:G13:b::::1\ncell:C14:b:1:::\ncell:D14:b:1:::\ncell:E14:b:1:::\ncell:F14:b:1:::\ncell:B17:t:How does your spending compare to the average consumer?:f:4:cf:2:colspan:6\ncell:B19:bg:4\ncell:C19:t:Expense Category:b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1\ncell:D19:t:Average Consumer Spending (as percentage of income):b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1:colspan:2\ncell:E19:b:2:2:2:2\ncell:F19:t:Your Spending (as percentage of income):b:2:2:2:2:l:3:f:4:c:4:bg:2:cf:1:colspan:2\ncell:B20:b::1:::bg:4\ncell:C20:t:Housing:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D20:vtc:n%:0.28:28%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E20:b::1::1\ncell:F20:vtf:n:0.3059188649966748:EXPENSE!E7/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B21:b::1:::bg:4\ncell:C21:t:Food:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D21:vtc:n%:0.11:11%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E21:b::1::1\ncell:F21:vtf:n:0.04633119042340944:sheet11!E4/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B22:b::1:::bg:4\ncell:C22:t:Transportation:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D22:vtc:n%:0.13:13%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E22:b::1::1\ncell:F22:vtf:n:0.14187541565063178:sheet9!E17/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B23:b::1:::bg:4\ncell:C23:t:Clothes & Personal Services:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D23:vtc:n%:0.03:3%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E23:b::1::1\ncell:F23:vtf:n:0.042340944358235426:sheet9!E12/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B24:b::1:::bg:4\ncell:C24:t:Healthcare:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D24:vtc:n%:0.05:5%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E24:b::1::1\ncell:F24:vtf:n:0.0583019286189315:sheet9!E26/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B25:b::1:::bg:4\ncell:C25:t:Entertainment:b::1::1:l:2:f:7:bg:3:cf:2\ncell:D25:vtc:n%:0.04:4%:b::1::1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E25:b::1::1\ncell:F25:vtf:n:0.04633119042340944:sheet10!E4/INCOME!D23:b::1::1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:B26:b::1:::bg:4\ncell:C26:t:Education:b::1::1:l:2:f:7:bg:4:cf:2\ncell:D26:vtc:n%:0.02:2%:b::1::1:l:5:f:1:bg:4:ntvf:2:colspan:2\ncell:E26:b::1::1\ncell:F26:vtf:n:0.021724673021502994:sheet10!E13/INCOME!D23:b::1::1:l:5:f:2:bg:4:ntvf:2:colspan:2\ncell:B27:b::1:::bg:4\ncell:C27:t:Contributions:b::1:1:1:l:2:f:7:bg:3:cf:2\ncell:D27:vtc:n%:0.03:3%:b::1:1:1:l:5:f:1:bg:3:ntvf:2:colspan:2\ncell:E27:b::1:1:1\ncell:F27:vtf:n:0.0492130348038129:sheet10!E18/INCOME!D23:b::1:1:1:l:5:f:2:bg:3:ntvf:2:colspan:2\ncell:C28:b:1:::\ncell:D28:b:1:::\ncell:E28:b:1:::\ncell:F28:b:1:::\ncell:G28:b:1:::\ncol:A:w:20\ncol:B:w:21\ncol:C:w:122\ncol:D:w:106\ncol:E:w:123\ncol:F:w:100\ncol:G:w:25\ncol:H:w:80\nsheet:c:8:r:28:needsrecalc:yes:font:3\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* * Arial\nfont:2:* * arial,helvetica,sans-serif\nfont:3:* 12pt *\nfont:4:normal bold * arial,helvetica,sans-serif\nfont:5:normal bold 12pt arial,helvetica,sans-serif\nfont:6:normal bold 20pt Arial\nfont:7:normal normal * Arial\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:6px * 6px *;vertical-align:*;\nlayout:3:padding:6px * 6px *;vertical-align:middle;\nlayout:4:padding:6px 4px 6px 12px;vertical-align:*;\nlayout:5:padding:6px 8px 6px *;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:#,##0%\nvalueformat:3:hidden\n", - }, - name: "compare", - hidden: "0", - }, - sheet8: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B3:t:Goals:l:2:f:4:c:1:bg:4:cf:2:colspan:3\ncell:G3:t:Date:l:1:f:5:cf:1\ncell:H3:vtf:ndt:41131.96186930555:NOW():l:1:f:5:bg:3:cf:3:ntvf:3\ncell:C5:f:3:colspan:4\ncell:B6:b:2:2:2:2:f:1:c:4:bg:2\ncell:C6:t:Goal:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1:colspan:3\ncell:D6:b:2:2:2:2:f:1:c:4:bg:2\ncell:E6:t:Goal:b:2:2:2:2:f:1:c:4:bg:2\ncell:F6:t:Amount:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:G6:t:Term (Months):b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:H6:t:Monthly:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:I6:t:Weekly:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1\ncell:J6:t:How to achieve:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1:colspan:2\ncell:A7:b::1::\ncell:B7:vtc:n:1:1.:b::1:::l:2:cf:1:rowspan:4\ncell:C7:t:Pay off credit card debt:b::1:::l:4:f:1:cf:2:colspan:3:rowspan:4\ncell:F7:v:1000:b::1::1:f:1:ntvf:1\ncell:G7:v:12:b::1::1:f:1:ntvf:1\ncell:H7:vtf:n:83.33333333333333:IF(G7=0,"",F7/G7):b::1::1:f:1:ntvf:1\ncell:I7:vtf:n:19.17808219178082:IF(G7>0,F7*7*12/(G7*365),""):b::1::1:f:1:ntvf:1\ncell:J7:t:cutback on eating out:b::1:::f:1:colspan:2\ncell:L7:b::::1\ncell:A8:b::1::\ncell:B8:b::1::\ncell:C8:b::1::1:f:1:colspan:3\ncell:F8:b::1::1\ncell:G8:b::1::1\ncell:H8:b::1::1\ncell:I8:b::1::1\ncell:J8:b::1::1:f:1:colspan:2\ncell:L8:b::::1\ncell:A9:b::1::\ncell:B9:b::1::\ncell:C9:b::1::1:f:1:colspan:3\ncell:F9:b::1::1\ncell:G9:b::1::1\ncell:H9:b::1::1\ncell:I9:b::1::1\ncell:J9:b::1::1:f:1:colspan:2\ncell:L9:b::::1\ncell:A10:b::1::\ncell:B10:b::1::\ncell:C10:f:1:colspan:3\ncell:F10:b::1::1\ncell:G10:b::1::1\ncell:H10:b::1::1\ncell:I10:b::1::1\ncell:J10:b::1:1:1:f:1:colspan:2\ncell:L10:b::::1\ncell:A11:b::1::\ncell:B11:v:2:b:1:1:::l:2:cf:1:rowspan:4\ncell:C11:t:Save for a down:b:1:1:::l:4:f:1:colspan:3:rowspan:4\ncell:D11:b:1:::\ncell:E11:b:1:::\ncell:F11:v:20000:b:1:1::1:f:1:ntvf:1\ncell:G11:v:36:b:1:1::1:f:1:ntvf:1\ncell:H11:vtf:n:555.5555555555555:IF(G11>0,F11/G11,""):b:1:1::1:f:1:ntvf:1\ncell:I11:vtf:n:127.85388127853881:IF(G11>0,F11*7*12/(G11*365),""):b:1:1::1:f:1:ntvf:1\ncell:J11:b:1:1:::f:1:colspan:2\ncell:L11:b::::1\ncell:A12:b::1::\ncell:B12:b::1::\ncell:C12:t:payment:b::1::1:l:4:f:1:colspan:3\ncell:F12:b::1::1\ncell:G12:b::1::1\ncell:H12:b::1::1\ncell:I12:b::1::1\ncell:J12:b::1::1:f:1:colspan:2\ncell:L12:b::::1\ncell:A13:b::1::\ncell:B13:b::1::\ncell:C13:b::1::1:l:4:f:1:colspan:3\ncell:F13:b::1::1\ncell:G13:b::1::1\ncell:H13:b::1::1\ncell:I13:b::1::1\ncell:J13:b::1::1:f:1:colspan:2\ncell:L13:b::::1\ncell:A14:b::1::\ncell:B14:b::1::\ncell:C14:l:4:f:1:colspan:3\ncell:F14:b::1::1\ncell:G14:b::1::1\ncell:H14:b::1::1\ncell:I14:b::1::1\ncell:J14:b::1:1:1:f:1:colspan:2\ncell:L14:b::::1\ncell:A15:b::1::\ncell:B15:v:3:b:1:1:::l:2:cf:1:rowspan:4\ncell:C15:t:Date:b:1:1:::l:4:f:1:colspan:3:rowspan:4\ncell:D15:b:1:::\ncell:E15:b:1:::\ncell:F15:b:1:1::1:f:1:ntvf:1\ncell:G15:b:1:1::1:f:1:ntvf:1\ncell:H15:vtf:t::IF(G15>0,F15/G15,""):b:1:1::1:f:1:ntvf:1\ncell:I15:vtf:t::IF(G15>0,F15*7*12/(G15*365),""):b:1:1::1:f:1:ntvf:1\ncell:J15:b:1:1:::f:1:colspan:2\ncell:L15:b::::1\ncell:A16:b::1::\ncell:B16:b::1::\ncell:C16:b::1::1:l:4:f:1:colspan:3\ncell:F16:b::1::1\ncell:G16:b::1::1\ncell:H16:b::1::1\ncell:I16:b::1::1\ncell:J16:b::1::1:f:1:colspan:2\ncell:L16:b::::1\ncell:A17:b::1::\ncell:B17:b::1::\ncell:C17:b::1::1:l:4:f:1:colspan:3\ncell:F17:b::1::1\ncell:G17:b::1::1\ncell:H17:b::1::1\ncell:I17:b::1::1\ncell:J17:b::1::1:f:1:colspan:2\ncell:L17:b::::1\ncell:A18:b::1::\ncell:B18:b::1::\ncell:C18:l:4:f:1:colspan:3\ncell:F18:b::1::1\ncell:G18:b::1::1\ncell:H18:b::1::1\ncell:I18:b::1::1\ncell:J18:b::1:1:1:f:1:colspan:2\ncell:L18:b::::1\ncell:A19:b::1::\ncell:B19:v:4:b:1:1:::l:2:cf:1:rowspan:4\ncell:C19:b:1:1:::l:4:colspan:3:rowspan:4\ncell:D19:b:1:::\ncell:E19:b:1:::\ncell:F19:b:1:1::1:f:1:ntvf:1\ncell:G19:b:1:1::1:f:1:ntvf:1\ncell:H19:vtf:t::IF(G19>0,F19/G19,""):b:1:1::1:f:1:ntvf:1\ncell:I19:vtf:t::IF(G19>0,F19*7*12/(G19*365),""):b:1:1::1:f:1:ntvf:1\ncell:J19:b:1:1:::f:1:colspan:2\ncell:L19:b::::1\ncell:A20:b::1::\ncell:B20:b::1::\ncell:C20:b::1::1:l:3:colspan:3\ncell:F20:b::1::1\ncell:G20:b::1::1\ncell:H20:b::1::1\ncell:I20:b::1::1\ncell:J20:b::1::1:f:1:colspan:2\ncell:L20:b::::1\ncell:A21:b::1::\ncell:B21:b::1::\ncell:C21:b::1::1:l:3:colspan:3\ncell:F21:b::1::1\ncell:G21:b::1::1\ncell:H21:b::1::1\ncell:I21:b::1::1\ncell:J21:b::1::1:f:1:colspan:2\ncell:L21:b::::1\ncell:A22:b::1::\ncell:B22:b::1::\ncell:C22:l:3:f:1:colspan:3\ncell:F22:b::1::1\ncell:G22:b::1::1\ncell:H22:b::1::1\ncell:I22:b::1::1\ncell:J22:b::1:1:1:f:1:colspan:2\ncell:L22:b::::1\ncell:A23:b::1::\ncell:B23:v:5:b:1:1:::l:2:cf:1:rowspan:4\ncell:C23:b:1:1:1:1:l:4:colspan:3:rowspan:4\ncell:D23:b:1:::\ncell:E23:b:1:::\ncell:F23:b:1:1::1:f:1:ntvf:1\ncell:G23:b:1:1::1:f:1:ntvf:1\ncell:H23:vtf:t::IF(G23>0,F23/G23,""):b:1:1::1:f:1:ntvf:1\ncell:I23:vtf:t::IF(G23>0,F23*7*12/(G23*365),""):b:1:1::1:f:1:ntvf:1\ncell:J23:b:1:1:::f:1:colspan:2\ncell:L23:b::::1\ncell:A24:b::1::\ncell:B24:b::1::\ncell:C24:b::1::1:l:4:colspan:3\ncell:F24:b::1::1\ncell:G24:b::1::1\ncell:H24:b::1::1\ncell:I24:b::1::1\ncell:J24:b::1::1:f:1:colspan:2\ncell:L24:b::::1\ncell:A25:b::1::\ncell:B25:b::1::\ncell:C25:b::1::1:l:4:colspan:3\ncell:F25:b::1::1\ncell:G25:b::1::1\ncell:H25:b::1::1\ncell:I25:b::1::1\ncell:J25:b::1::1:f:1:colspan:2\ncell:L25:b::::1\ncell:A26:b::1::\ncell:B26:b::1::\ncell:C26:l:4:f:1:colspan:3\ncell:F26:b::1:1:1\ncell:G26:b::1:1:1\ncell:H26:b::1:1:1\ncell:I26:b::1:1:1\ncell:J26:b::1:1:1:f:1:colspan:2\ncell:L26:b::::1\ncell:A27:b::1::\ncell:B27:v:6:b:1:1::1:l:2:cf:1:rowspan:4\ncell:C27:b:1:1:1:1:l:4:f:1:colspan:3:rowspan:4\ncell:D27:b:1:1::1\ncell:E27:b:1:1::1\ncell:F27:b:1:1::1\ncell:G27:b:1:1::1\ncell:H27:vtf:t::IF(G27>0,F27/G27,""):b:1:1::1\ncell:I27:vtf:t::IF(G27>0,F27*7*12/(G27*365),""):b:1:1::1\ncell:J27:b::1::1:colspan:2\ncell:K27:b:1:::\ncell:A28:b::1::\ncell:B28:b::1::1\ncell:C28:b::1::1:l:4:f:1:colspan:3\ncell:D28:b::1::1\ncell:E28:b::1::1\ncell:F28:b::1::1\ncell:G28:b::1::1\ncell:H28:b::1::1\ncell:I28:b::1::1\ncell:J28:b::1::1:colspan:2\ncell:A29:b::1::\ncell:B29:b::1::1\ncell:C29:b::1::1:l:4:f:1:colspan:3\ncell:D29:b::1::1\ncell:E29:b::1::1\ncell:F29:b::1::1\ncell:G29:b::1::1\ncell:H29:b::1::1\ncell:I29:b::1::1\ncell:J29:b::1::1:colspan:2\ncell:A30:b::1::\ncell:B30:b::1:1:1\ncell:C30:b::1:1:1:l:4:f:1:colspan:3\ncell:D30:b::1:1:1\ncell:E30:b::1:1:1\ncell:F30:b::1:1:1\ncell:G30:b::1:1:1\ncell:H30:b::1:1:1\ncell:I30:b::1:1:1\ncell:J30:b::1:1:1:colspan:2\ncell:A31:b::1::\ncell:B31:v:7:b:1:1::1:l:2:cf:1:rowspan:4\ncell:C31:b:1:1:1:1:l:4:colspan:3:rowspan:4\ncell:D31:b:1:1:1:1\ncell:E31:b:1:1:1:1\ncell:F31:b:1:1::1\ncell:G31:b:1:1::1\ncell:H31:vtf:t::IF(G31>0,F31/G31,""):b:1:1::1\ncell:I31:vtf:t::IF(G31>0,F31*7*12/(G31*365),""):b:1:1::1\ncell:J31:b:1:1::1:colspan:2\ncell:K31:b:1:1:1:1\ncell:L31:b::::1\ncell:A32:b::1::\ncell:B32:b::1::1\ncell:C32:b:1:1:1:1\ncell:D32:b:1:1:1:1\ncell:E32:b:1:1:1:1\ncell:F32:b::1::1\ncell:G32:b::1::1\ncell:H32:b::1::1\ncell:I32:b::1::1\ncell:J32:b::1::1:colspan:2\ncell:K32:b:1:1:1:1\ncell:L32:b::::1\ncell:A33:b::1::\ncell:B33:b::1::1\ncell:C33:b:1:1:1:1\ncell:D33:b:1:1:1:1\ncell:E33:b:1:1:1:1\ncell:F33:b::1::1\ncell:G33:b::1::1\ncell:H33:b::1::1\ncell:I33:b::1::1\ncell:J33:b::1::1:colspan:2\ncell:K33:b:1:1:1:1\ncell:L33:b::::1\ncell:A34:b::1::\ncell:B34:b::1:1:1\ncell:C34:b:1:1:1:1\ncell:D34:b:1:1:1:1\ncell:E34:b:1:1:1:1\ncell:F34:b::1:1:1\ncell:G34:b::1:1:1\ncell:H34:b::1:1:1\ncell:I34:b::1:1:1\ncell:J34:b::1:1:1:colspan:2\ncell:K34:b:1:1:1:1\ncell:L34:b::::1\ncell:B35:b:1:::\ncell:C35:b:1:::\ncell:D35:b:1:::\ncell:E35:b:1:::\ncell:F35:b:1:::\ncell:G35:b:1:::\ncell:H35:b:1:::\ncell:I35:b:1:::\ncell:J35:b:1:::\ncell:K35:b:1:::\ncol:A:w:31\ncol:B:w:25\ncol:C:w:80\ncol:D:w:44\ncol:E:w:53\ncol:F:w:70\ncol:G:w:68\ncol:H:w:65\ncol:I:w:65\ncol:J:w:80\ncol:K:w:96\nsheet:c:12:r:35:needsrecalc:yes:font:2\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* * arial,helvetica,sans-serif\nfont:2:* 12pt *\nfont:3:normal bold * arial,helvetica,sans-serif\nfont:4:normal bold 20pt Arial\nfont:5:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:4:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\n', - }, - name: "goals", - hidden: "0", - }, - sheet9: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:2\ncell:B3:t:Check Book Register:l:5:f:3:c:4:bg:2:cf:1:colspan:7\ncell:G3:t:Date:l:1:f:5:cf:1\ncell:H3:vtf:ndt:41131.961799432866:NOW():l:1:f:5:bg:3:cf:3:ntvf:3\ncell:A4:f:1\ncell:B4:l:2:f:4:c:1:bg:4:cf:2\ncell:C4:f:4\ncell:D4:f:4\ncell:E4:f:4\ncell:F4:f:4\ncell:G4:l:1:f:4:cf:1\ncell:H4:l:1:f:4:cf:3:ntvf:3\ncell:I4:f:1\ncell:B5:f:4\ncell:C5:f:4\ncell:D5:f:4\ncell:E5:f:4\ncell:F5:f:4\ncell:G5:f:4\ncell:H5:f:4\ncell:B6:t:Date:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:C6:t:Num:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:D6:t:Description:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:E6:t:R:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:F6:t:Withdrawal, Payment (-):b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:G6:t:Deposit, Credit (+):b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:H6:t:Balance:b:2:2:2:2:l:6:f:2:c:4:bg:2:cf:1\ncell:A7:b::1::\ncell:B7:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C7:b::1::1:l:4:f:1\ncell:D7:b::1::1:l:3:f:6\ncell:E7:b::1::1:l:3:f:6\ncell:F7:b::1::1:l:3:f:1:ntvf:1\ncell:G7:b::1::1:l:3:f:1:ntvf:1\ncell:H7:vtf:t: :IF(AND(ISBLANK(G7), ISBLANK(F7)), " ", G7-F7):b::1::1:l:3:f:1:ntvf:1\ncell:I7:b::::1\ncell:A8:b::1::\ncell:B8:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C8:b::1::1:l:4:f:1:bg:3\ncell:D8:b::1::1:l:3:f:6:bg:3\ncell:E8:b::1::1:l:3:f:6:bg:3\ncell:F8:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G8:b::1::1:l:3:f:1:bg:3\ncell:H8:vtf:t: :IF(AND(ISBLANK(G8), ISBLANK(F8)), " ", H7+G8-F8):b::1::1:l:3:f:1:bg:3\ncell:I8:b::::1\ncell:A9:b::1::\ncell:B9:b::1::1:l:4:f:1:ntvf:3\ncell:C9:b::1::1:l:4:f:1\ncell:D9:b::1::1:l:3:f:6\ncell:E9:b::1::1:l:3:f:6\ncell:F9:b::1::1:l:3:f:1:ntvf:1\ncell:G9:b::1::1:l:3:f:1\ncell:H9:vtf:t: :IF(AND(ISBLANK(G9), ISBLANK(F9)), " ", H8+G9-F9):b::1::1:l:3:f:1\ncell:I9:b::::1\ncell:A10:b::1::\ncell:B10:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C10:b::1::1:l:4:f:1:bg:3\ncell:D10:b::1::1:l:3:f:6:bg:3\ncell:E10:b::1::1:l:3:f:6:bg:3\ncell:F10:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G10:b::1::1:l:3:f:1:bg:3\ncell:H10:vtf:t: :IF(AND(ISBLANK(G10), ISBLANK(F10)), " ", H9+G10-F10):b::1::1:l:3:f:1:bg:3\ncell:I10:b::::1\ncell:A11:b::1::\ncell:B11:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C11:b::1::1:l:4:f:1\ncell:D11:b::1::1:l:3:f:6\ncell:E11:b::1::1:l:3:f:6\ncell:F11:b::1::1:l:3:f:1:ntvf:1\ncell:G11:b::1::1:l:3:f:1:ntvf:1\ncell:H11:vtf:t: :IF(AND(ISBLANK(G11), ISBLANK(F11)), " ", H10+G11-F11):b::1::1:l:3:f:1:ntvf:1\ncell:I11:b::::1\ncell:A12:b::1::\ncell:B12:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C12:b::1::1:l:4:f:1:bg:3\ncell:D12:b::1::1:l:3:f:6:bg:3\ncell:E12:b::1::1:l:3:f:6:bg:3\ncell:F12:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G12:b::1::1:l:3:f:1:bg:3\ncell:H12:vtf:t: :IF(AND(ISBLANK(G12), ISBLANK(F12)), " ", H11+G12-F12):b::1::1:l:3:f:1:bg:3\ncell:I12:b::::1\ncell:A13:b::1::\ncell:B13:b::1::1:l:4:f:1:ntvf:3\ncell:C13:b::1::1:l:4:f:1\ncell:D13:b::1::1:l:3:f:6\ncell:E13:b::1::1:l:3:f:6\ncell:F13:b::1::1:l:3:f:1:ntvf:1\ncell:G13:b::1::1:l:3:f:1\ncell:H13:vtf:t: :IF(AND(ISBLANK(G13), ISBLANK(F13)), " ", H12+G13-F13):b::1::1:l:3:f:1\ncell:I13:b::::1\ncell:A14:b::1::\ncell:B14:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C14:b::1::1:l:4:f:1:bg:3\ncell:D14:b::1::1:l:3:f:6:bg:3\ncell:E14:b::1::1:l:3:f:6:bg:3\ncell:F14:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G14:b::1::1:l:3:f:1:bg:3\ncell:H14:vtf:t: :IF(AND(ISBLANK(G14), ISBLANK(F14)), " ", H13+G14-F14):b::1::1:l:3:f:1:bg:3\ncell:I14:b::::1\ncell:A15:b::1::\ncell:B15:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C15:b::1::1:l:4:f:1\ncell:D15:b::1::1:l:3:f:6\ncell:E15:b::1::1:l:3:f:6\ncell:F15:b::1::1:l:3:f:1:ntvf:1\ncell:G15:b::1::1:l:3:f:1:ntvf:1\ncell:H15:vtf:t: :IF(AND(ISBLANK(G15), ISBLANK(F15)), " ", H14+G15-F15):b::1::1:l:3:f:1:ntvf:1\ncell:I15:b::::1\ncell:A16:b::1::\ncell:B16:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C16:b::1::1:l:4:f:1:bg:3\ncell:D16:b::1::1:l:3:f:6:bg:3\ncell:E16:b::1::1:l:3:f:6:bg:3\ncell:F16:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G16:b::1::1:l:3:f:1:bg:3\ncell:H16:vtf:t: :IF(AND(ISBLANK(G16), ISBLANK(F16)), " ", H15+G16-F16):b::1::1:l:3:f:1:bg:3\ncell:I16:b::::1\ncell:A17:b::1::\ncell:B17:b::1::1:l:4:f:1:ntvf:3\ncell:C17:b::1::1:l:4:f:1\ncell:D17:b::1::1:l:3:f:6\ncell:E17:b::1::1:l:3:f:6\ncell:F17:b::1::1:l:3:f:1:ntvf:1\ncell:G17:b::1::1:l:3:f:1\ncell:H17:vtf:t: :IF(AND(ISBLANK(G17), ISBLANK(F17)), " ", H16+G17-F17):b::1::1:l:3:f:1\ncell:I17:b::::1\ncell:A18:b::1::\ncell:B18:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C18:b::1::1:l:4:f:1:bg:3\ncell:D18:b::1::1:l:3:f:6:bg:3\ncell:E18:b::1::1:l:3:f:6:bg:3\ncell:F18:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G18:b::1::1:l:3:f:1:bg:3\ncell:H18:vtf:t: :IF(AND(ISBLANK(G18), ISBLANK(F18)), " ", H17+G18-F18):b::1::1:l:3:f:1:bg:3\ncell:I18:b::::1\ncell:A19:b::1::\ncell:B19:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C19:b::1::1:l:4:f:1\ncell:D19:b::1::1:l:3:f:6\ncell:E19:b::1::1:l:3:f:6\ncell:F19:b::1::1:l:3:f:1:ntvf:1\ncell:G19:b::1::1:l:3:f:1:ntvf:1\ncell:H19:vtf:t: :IF(AND(ISBLANK(G19), ISBLANK(F19)), " ", H18+G19-F19):b::1::1:l:3:f:1:ntvf:1\ncell:I19:b::::1\ncell:A20:b::1::\ncell:B20:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C20:b::1::1:l:4:f:2:bg:3\ncell:D20:b::1::1:l:3:f:6:bg:3\ncell:E20:b::1::1:l:3:f:6:bg:3\ncell:F20:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G20:b::1::1:l:3:f:1:bg:3\ncell:H20:vtf:t: :IF(AND(ISBLANK(G20), ISBLANK(F20)), " ", H19+G20-F20):b::1::1:l:3:f:1:bg:3\ncell:I20:b::::1\ncell:A21:b::1::\ncell:B21:b::1::1:l:4:f:1:ntvf:3\ncell:C21:b::1::1:l:4:f:1\ncell:D21:b::1::1:l:3:f:6\ncell:E21:b::1::1:l:3:f:6\ncell:F21:b::1::1:l:3:f:1:ntvf:1\ncell:G21:b::1::1:l:3:f:1\ncell:H21:vtf:t: :IF(AND(ISBLANK(G21), ISBLANK(F21)), " ", H20+G21-F21):b::1::1:l:3:f:1\ncell:I21:b::::1\ncell:A22:b::1::\ncell:B22:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C22:b::1::1:l:4:f:1:bg:3\ncell:D22:b::1::1:l:3:f:6:bg:3\ncell:E22:b::1::1:l:3:f:6:bg:3\ncell:F22:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G22:b::1::1:l:3:f:1:bg:3\ncell:H22:vtf:t: :IF(AND(ISBLANK(G22), ISBLANK(F22)), " ", H21+G22-F22):b::1::1:l:3:f:1:bg:3\ncell:I22:b::::1\ncell:A23:b::1::\ncell:B23:b::1::1:l:4:f:1:cf:1:ntvf:3\ncell:C23:b::1::1:l:4:f:1\ncell:D23:b::1::1:l:3:f:6\ncell:E23:b::1::1:l:3:f:6\ncell:F23:b::1::1:l:3:f:1:ntvf:1\ncell:G23:b::1::1:l:3:f:1:ntvf:1\ncell:H23:vtf:t: :IF(AND(ISBLANK(G23), ISBLANK(F23)), " ", H22+G23-F23):b::1::1:l:3:f:1:ntvf:1\ncell:I23:b::::1\ncell:A24:b::1::\ncell:B24:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C24:b::1::1:l:4:f:1:bg:3\ncell:D24:b::1::1:l:3:f:6:bg:3\ncell:E24:b::1::1:l:3:f:6:bg:3\ncell:F24:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G24:b::1::1:l:3:f:1:bg:3\ncell:H24:vtf:t: :IF(AND(ISBLANK(G24), ISBLANK(F24)), " ", H23+G24-F24):b::1::1:l:3:f:1:bg:3\ncell:I24:b::::1\ncell:A25:b::1::\ncell:B25:b::1::1:l:4:f:1:ntvf:3\ncell:C25:b::1::1:l:4:f:1\ncell:D25:b::1::1:l:3:f:6\ncell:E25:b::1::1:l:3:f:6\ncell:F25:b::1::1:l:3:f:1:ntvf:1\ncell:G25:b::1::1:l:3:f:1\ncell:H25:vtf:t: :IF(AND(ISBLANK(G25), ISBLANK(F25)), " ", H24+G25-F25):b::1::1:l:3:f:1\ncell:I25:b::::1\ncell:A26:b::1::\ncell:B26:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C26:b::1::1:l:4:f:1:bg:3\ncell:D26:b::1::1:l:3:f:6:bg:3\ncell:E26:b::1::1:l:3:f:6:bg:3\ncell:F26:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G26:b::1::1:l:3:f:1:bg:3\ncell:H26:vtf:t: :IF(AND(ISBLANK(G26), ISBLANK(F26)), " ", H25+G26-F26):b::1::1:l:3:f:1:bg:3\ncell:I26:b::::1\ncell:A27:b::1::\ncell:B27:b::1::1:l:4:f:1:ntvf:3\ncell:C27:b::1::1:l:4:f:1\ncell:D27:b::1::1:l:3:f:6\ncell:E27:b::1::1:l:3:f:6\ncell:F27:b::1::1:l:3:f:1:ntvf:1\ncell:G27:b::1::1:l:3:f:1\ncell:H27:vtf:t: :IF(AND(ISBLANK(G27), ISBLANK(F27)), " ", H26+G27-F27):b::1::1:l:3:f:1\ncell:A28:b::1::\ncell:B28:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C28:b::1::1:l:4:f:1:bg:3\ncell:D28:b::1::1:l:3:f:6:bg:3\ncell:E28:b::1::1:l:3:f:6:bg:3\ncell:F28:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G28:b::1::1:l:3:f:1:bg:3\ncell:H28:vtf:t: :IF(AND(ISBLANK(G28), ISBLANK(F28)), " ", H27+G28-F28):b::1::1:l:3:f:1:bg:3\ncell:A29:b::1::\ncell:B29:b::1::1:l:4:f:1:ntvf:3\ncell:C29:b::1::1:l:4:f:1\ncell:D29:b::1::1:l:4:f:6\ncell:E29:b::1::1:l:4:f:1\ncell:F29:b::1::1:l:3:f:1:ntvf:1\ncell:G29:b::1::1:l:4:f:1:ntvf:1\ncell:H29:vtf:t: :IF(AND(ISBLANK(G29), ISBLANK(F29)), " ", H28+G29-F29):b::1::1:l:3:f:1\ncell:A30:b::1::\ncell:B30:b::1::1:l:4:f:1:bg:3:ntvf:3\ncell:C30:b::1::1:l:4:f:1:bg:3\ncell:D30:b::1::1:l:4:f:6:bg:3\ncell:E30:b::1::1:l:4:f:1:bg:3\ncell:F30:b::1::1:l:3:f:1:bg:3:ntvf:1\ncell:G30:b::1::1:l:4:f:1:bg:3:ntvf:1\ncell:H30:vtf:t: :IF(AND(ISBLANK(G30), ISBLANK(F30)), " ", H29+G30-F30):b::1::1:l:3:f:1:bg:3\ncell:A31:b::1::\ncell:B31:b::1:1:1:l:4:f:1:ntvf:3\ncell:C31:b::1:1:1:l:4:f:1\ncell:D31:b::1:1:1:l:4:f:6\ncell:E31:b::1:1:1:l:4:f:1\ncell:F31:b::1:1:1:l:3:f:1:ntvf:1\ncell:G31:b::1:1:1:l:4:f:1:ntvf:1\ncell:H31:vtf:t: :IF(AND(ISBLANK(G31), ISBLANK(F31)), " ", H30+G31-F31):b::1:1:1:l:3:f:1\ncol:A:w:31\ncol:B:w:74\ncol:C:w:72\ncol:D:w:168\ncol:E:w:43\ncol:F:w:100\ncol:G:w:100\ncol:H:w:103\nsheet:c:9:r:31:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:* 12pt arial,helvetica,sans-serif\nfont:3:* 14pt arial,helvetica,sans-serif\nfont:4:* x-small arial,helvetica,sans-serif\nfont:5:normal normal 12pt Arial\nfont:6:normal normal 12pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:4:padding:4px 8px 4px 12px;vertical-align:*;\nlayout:5:padding:6px * 6px *;vertical-align:*;\nlayout:6:padding:6px * 6px *;vertical-align:bottom;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\n', - }, - name: "sheet6", - hidden: "0", - }, - sheet10: { - sheetstr: { - savestr: - 'version:1.5\ncell:A1:ntvf:4\ncell:E3:t:Budget:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F3:v:18750:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:G3:v:13125:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:H3:v:2500:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:I3:vtf:n:34375:sum(F3\\cH3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:E4:t:% Spent:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F4:vtf:n:0.21333333333333335:IF(F3=0,"-",F31/F3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:G4:vtf:n:0.6857142857142857:IF(G3=0,"-",G31/G3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:H4:vtf:n:0.8:IF(H3=0,"-",H31/H3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:I4:vtf:n:0.43636363636363634:IF(I3=0,"-",I31/I3):b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:3\ncell:E5:t:Remaining:b:2:2:2:2:l:1:f:3:c:4:bg:1\ncell:F5:vtf:n:14750:F3-F31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:G5:vtf:n:4125:G3-G31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:H5:vtf:n:500:H3-H31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:I5:vtf:n:19375:I3-I31:b:2:2:2:2:l:1:f:3:c:4:bg:1:ntvf:1\ncell:E6:vtc:::\ncell:F6:vtc:::\ncell:G6:vtc:::\ncell:H6:vtc:::\ncell:I6:vtc:::\ncell:C7:t:Date:l:2:f:3:c:4:bg:1:cf:1\ncell:D7:t:Payment Types:l:2:f:3:c:4:bg:1:cf:1\ncell:E7:t:Description:l:2:f:3:c:4:bg:1:cf:1\ncell:F7:t:Category 1:l:2:f:3:c:4:bg:1:cf:1\ncell:G7:t:Category 2:l:2:f:3:c:4:bg:1:cf:1\ncell:H7:t:Category 3:l:2:f:3:c:4:bg:1:cf:1\ncell:I7:t:Subtotal:l:2:f:3:c:4:bg:1:cf:1\ncell:B8:b::1::\ncell:C8:v:39814:b::1::1:l:1:f:2:ntvf:5\ncell:D8:t:CrCard:b::1::1:l:1:f:2\ncell:E8:t:Walmart:b::1::1:l:1:f:2\ncell:F8:v:4000:b::1::1:l:1:f:2:ntvf:1\ncell:G8:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H8:v:2000:b::1::1:l:1:f:2:ntvf:1\ncell:I8:vtf:n:6000:SUM(F8\\cH8):b::1::1:l:1:f:2:ntvf:2\ncell:B9:b::1::\ncell:C9:v:39823:b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D9:t:Db Card:b::1::1:l:1:f:2:bg:2\ncell:E9:t:ABC Services, Inc.:b::1::1:l:1:f:2:bg:2\ncell:F9:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G9:v:9000:b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H9:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I9:vtf:n:9000:SUM(F9\\cH9):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B10:b::1::\ncell:C10:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D10:vtc::::b::1::1:l:1:f:2\ncell:E10:vtc::::b::1::1:l:1:f:2\ncell:F10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H10:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I10:vtf:n:0:SUM(F10\\cH10):b::1::1:l:1:f:2:ntvf:2\ncell:B11:b::1::\ncell:C11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D11:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E11:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H11:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I11:vtf:n:0:SUM(F11\\cH11):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B12:b::1::\ncell:C12:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D12:vtc::::b::1::1:l:1:f:2\ncell:E12:vtc::::b::1::1:l:1:f:2\ncell:F12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H12:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I12:vtf:n:0:SUM(F12\\cH12):b::1::1:l:1:f:2:ntvf:2\ncell:B13:b::1::\ncell:C13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D13:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E13:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H13:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I13:vtf:n:0:SUM(F13\\cH13):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B14:b::1::\ncell:C14:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D14:vtc::::b::1::1:l:1:f:2\ncell:E14:vtc::::b::1::1:l:1:f:2\ncell:F14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H14:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I14:vtf:n:0:SUM(F14\\cH14):b::1::1:l:1:f:2:ntvf:2\ncell:B15:b::1::\ncell:C15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D15:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E15:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H15:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I15:vtf:n:0:SUM(F15\\cH15):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B16:b::1::\ncell:C16:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D16:vtc::::b::1::1:l:1:f:2\ncell:E16:vtc::::b::1::1:l:1:f:2\ncell:F16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H16:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I16:vtf:n:0:SUM(F16\\cH16):b::1::1:l:1:f:2:ntvf:2\ncell:B17:b::1::\ncell:C17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D17:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E17:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H17:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I17:vtf:n:0:SUM(F17\\cH17):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B18:b::1::\ncell:C18:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D18:vtc::::b::1::1:l:1:f:2\ncell:E18:vtc::::b::1::1:l:1:f:2\ncell:F18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H18:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I18:vtf:n:0:SUM(F18\\cH18):b::1::1:l:1:f:2:ntvf:2\ncell:B19:b::1::\ncell:C19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D19:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E19:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H19:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I19:vtf:n:0:SUM(F19\\cH19):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B20:b::1::\ncell:C20:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D20:vtc::::b::1::1:l:1:f:2\ncell:E20:vtc::::b::1::1:l:1:f:2\ncell:F20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H20:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I20:vtf:n:0:SUM(F20\\cH20):b::1::1:l:1:f:2:ntvf:2\ncell:B21:b::1::\ncell:C21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D21:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E21:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H21:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I21:vtf:n:0:SUM(F21\\cH21):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B22:b::1::\ncell:C22:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D22:vtc::::b::1::1:l:1:f:2\ncell:E22:vtc::::b::1::1:l:1:f:2\ncell:F22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H22:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I22:vtf:n:0:SUM(F22\\cH22):b::1::1:l:1:f:2:ntvf:2\ncell:B23:b::1::\ncell:C23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D23:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E23:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H23:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I23:vtf:n:0:SUM(F23\\cH23):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B24:b::1::\ncell:C24:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D24:vtc::::b::1::1:l:1:f:2\ncell:E24:vtc::::b::1::1:l:1:f:2\ncell:F24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H24:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I24:vtf:n:0:SUM(F24\\cH24):b::1::1:l:1:f:2:ntvf:2\ncell:B25:b::1::\ncell:C25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D25:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E25:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H25:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I25:vtf:n:0:SUM(F25\\cH25):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B26:b::1::\ncell:C26:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D26:vtc::::b::1::1:l:1:f:2\ncell:E26:vtc::::b::1::1:l:1:f:2\ncell:F26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H26:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I26:vtf:n:0:SUM(F26\\cH26):b::1::1:l:1:f:2:ntvf:2\ncell:B27:b::1::\ncell:C27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D27:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E27:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H27:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I27:vtf:n:0:SUM(F27\\cH27):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B28:b::1::\ncell:C28:vtc::::b::1::1:l:1:f:2:ntvf:5\ncell:D28:vtc::::b::1::1:l:1:f:2\ncell:E28:vtc::::b::1::1:l:1:f:2\ncell:F28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:G28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:H28:vtc::::b::1::1:l:1:f:2:ntvf:1\ncell:I28:vtf:n:0:SUM(F28\\cH28):b::1::1:l:1:f:2:ntvf:2\ncell:B29:b::1::\ncell:C29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:5\ncell:D29:vtc::::b::1::1:l:1:f:2:bg:2\ncell:E29:vtc::::b::1::1:l:1:f:2:bg:2\ncell:F29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:G29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:H29:vtc::::b::1::1:l:1:f:2:bg:2:ntvf:1\ncell:I29:vtf:n:0:SUM(F29\\cH29):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:B30:b::1::\ncell:C30:vtc::::b::1:1:1:l:1:f:2:ntvf:5\ncell:D30:vtc::::b::1:1:1:l:1:f:2\ncell:E30:vtc::::b::1:1:1:l:1:f:2\ncell:F30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:G30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:H30:vtc::::b::1:1:1:l:1:f:2:ntvf:1\ncell:I30:vtf:n:0:SUM(F30\\cH30):b::1:1:1:l:1:f:2:ntvf:2\ncell:E31:t:Expense Total:b:2:2:2:2:l:1:f:2:c:4:bg:1:cf:1\ncell:F31:vtf:n:4000:SUM(F8\\cF30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:G31:vtf:n:9000:SUM(G8\\cG30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:H31:vtf:n:2000:SUM(H8\\cH30):b:2:2:2:2:l:1:f:2:c:4:bg:1:ntvf:1\ncell:I31:vtf:n:15000:SUM(F31\\cH31):b:2:2:2:2:l:1:f:2:c:3:bg:1:ntvf:2\ncol:A:w:10\ncol:B:w:10\ncol:C:w:70\ncol:D:w:71\ncol:E:w:147\ncol:F:w:82\ncol:G:w:81\ncol:H:w:82\ncol:I:w:100\ncol:J:w:80\ncol:K:w:96\nsheet:c:11:r:31:needsrecalc:yes:font:1\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(238, 238, 238)\ncolor:4:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal normal * arial,helvetica,sans-serif\nfont:3:normal normal 12pt arial,helvetica,sans-serif\nlayout:1:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00;\\b-#,##0.00;\\b-\nvalueformat:3:0.00%\nvalueformat:4:hidden\nvalueformat:5:m/d/yy\n', - }, - name: "sheet7", - hidden: "0", - }, - sheet11: { - sheetstr: { - savestr: - "version:1.5\ncell:A1:ntvf:1\ncol:A:w:31\ncol:B:w:25\ncol:C:w:80\ncol:D:w:44\ncol:E:w:53\ncol:F:w:70\ncol:G:w:68\ncol:H:w:65\ncol:I:w:65\ncol:J:w:80\ncol:K:w:96\nsheet:c:11:r:1:needsrecalc:yes:font:1\nfont:1:* 12pt *\nvalueformat:1:hidden\n", - }, - name: "sheet8", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "income!D8": true, - "income!E5": true, - "income!D9": true, - "sheet11!D2": true, - "income!D10": true, - "income!D11": true, - "goals!H3": true, - "income!D12": true, - "sheet9!E18": true, - "income!D13": true, - "sheet9!D2": true, - "sheet10!D2": true, - "income!D14": true, - "income!D15": true, - "income!D16": true, - "income!D17": true, - "income!D18": true, - "income!D19": true, - "income!D20": true, - "income!D21": true, - "income!C8": true, - "income!C9": true, - "income!C10": true, - "income!C11": true, - "income!C12": true, - "income!C13": true, - "income!C14": true, - "income!C15": true, - "income!C16": true, - "income!C17": true, - "income!C18": true, - "income!C19": true, - "income!C20": true, - "income!C21": true, - "income!C22": true, - "income!C23": true, - "income!H18": true, - "income!H17": true, - "income!H16": true, - "income!H15": true, - "income!H14": true, - "income!H13": true, - "income!K18": true, - "income!H19": true, - "income!K17": true, - "income!K16": true, - "income!K15": true, - "income!K14": true, - "expense!B4": true, - "income!K13": true, - "expense!E4": true, - "expense!F4": true, - "expense!E6": true, - "expense!F6": true, - "expense!B7": true, - "expense!C8": true, - "expense!D9": true, - "expense!D10": true, - "expense!D11": true, - "expense!D12": true, - "expense!D13": true, - "expense!E8": true, - "expense!E9": true, - "expense!E10": true, - "expense!E11": true, - "expense!E12": true, - "expense!E13": true, - "expense!C14": true, - "expense!D20": true, - "expense!D19": true, - "expense!D18": true, - "expense!D17": true, - "expense!D16": true, - "expense!D15": true, - "expense!E20": true, - "expense!E19": true, - "expense!E18": true, - "expense!E17": true, - "expense!E16": true, - "expense!E15": true, - "expense!C21": true, - "expense!C24": true, - "expense!D24": true, - "expense!D23": true, - "expense!D25": true, - "expense!D26": true, - "expense!D27": true, - "expense!D28": true, - "expense!D29": true, - "expense!D30": true, - "expense!D31": true, - "expense!E25": true, - "expense!E26": true, - "expense!E27": true, - "expense!E28": true, - "expense!E29": true, - "expense!E30": true, - "expense!E31": true, - "sheet9!B12": true, - "sheet9!B17": true, - "sheet9!B26": true, - "sheet9!C5": true, - "sheet9!C9": true, - "sheet9!B4": true, - "sheet9!D6": true, - "sheet9!D7": true, - "sheet9!D8": true, - "sheet9!D11": true, - "sheet9!D10": true, - "sheet9!E6": true, - "sheet9!E7": true, - "sheet9!E8": true, - "sheet9!E11": true, - "sheet9!E10": true, - "sheet9!D13": true, - "sheet9!D14": true, - "sheet9!D15": true, - "sheet9!D16": true, - "sheet9!E13": true, - "sheet9!E14": true, - "sheet9!E15": true, - "sheet9!E16": true, - "sheet9!D18": true, - "sheet9!D19": true, - "sheet9!D20": true, - "sheet9!D21": true, - "sheet9!D22": true, - "sheet9!D23": true, - "sheet9!D24": true, - "sheet9!D25": true, - "sheet9!E19": true, - "sheet9!E20": true, - "sheet9!E21": true, - "sheet9!E22": true, - "sheet9!E23": true, - "sheet9!E24": true, - "sheet9!E25": true, - "sheet9!D26": true, - "sheet9!D27": true, - "sheet9!D28": true, - "sheet9!D29": true, - "sheet9!D30": true, - "sheet9!D31": true, - "sheet9!E26": true, - "sheet9!E27": true, - "sheet9!E28": true, - "sheet9!E29": true, - "sheet9!E30": true, - "sheet9!E31": true, - "sheet10!B4": true, - "sheet10!B13": true, - "sheet10!B18": true, - "sheet10!B25": true, - "sheet10!B22": true, - "sheet10!D5": true, - "sheet10!D12": true, - "sheet10!D11": true, - "sheet10!D9": true, - "sheet10!D8": true, - "sheet10!D7": true, - "sheet10!D6": true, - "sheet10!E5": true, - "sheet10!E12": true, - "sheet10!E11": true, - "sheet10!E9": true, - "sheet10!E8": true, - "sheet10!E7": true, - "sheet10!E6": true, - "sheet10!D17": true, - "sheet10!D16": true, - "sheet10!D15": true, - "sheet10!D14": true, - "sheet10!E17": true, - "sheet10!E16": true, - "sheet10!E15": true, - "sheet10!E14": true, - "sheet10!D21": true, - "sheet10!D20": true, - "sheet10!D19": true, - "sheet10!E21": true, - "sheet10!E20": true, - "sheet10!E19": true, - "sheet10!D24": true, - "sheet10!D23": true, - "sheet10!E24": true, - "sheet10!E23": true, - "sheet10!D30": true, - "sheet10!D29": true, - "sheet10!D28": true, - "sheet10!D27": true, - "sheet10!D26": true, - "sheet10!E30": true, - "sheet10!E29": true, - "sheet10!E28": true, - "sheet10!E27": true, - "sheet10!E26": true, - "sheet11!B4": true, - "sheet11!B12": true, - "sheet11!B18": true, - "sheet11!B26": true, - "sheet11!D5": true, - "sheet11!D11": true, - "sheet11!D9": true, - "sheet11!D8": true, - "sheet11!D7": true, - "sheet11!D6": true, - "sheet11!D10": true, - "sheet11!E5": true, - "sheet11!E11": true, - "sheet11!E9": true, - "sheet11!E8": true, - "sheet11!E7": true, - "sheet11!E6": true, - "sheet11!E10": true, - "sheet11!D17": true, - "sheet11!D16": true, - "sheet11!D15": true, - "sheet11!D14": true, - "sheet11!D13": true, - "sheet11!E17": true, - "sheet11!E16": true, - "sheet11!E15": true, - "sheet11!E14": true, - "sheet11!E13": true, - "sheet11!D24": true, - "sheet11!D25": true, - "sheet11!D23": true, - "sheet11!D22": true, - "sheet11!D21": true, - "sheet11!D20": true, - "sheet11!D19": true, - "sheet11!E24": true, - "sheet11!E25": true, - "sheet11!E23": true, - "sheet11!E22": true, - "sheet11!E21": true, - "sheet11!E20": true, - "sheet11!E19": true, - "sheet11!D29": true, - "sheet11!D28": true, - "sheet11!D27": true, - "sheet11!E29": true, - "sheet11!E28": true, - "sheet11!E27": true, - "goals!C7": true, - "goals!C8": true, - "goals!C9": true, - "goals!C10": true, - "goals!C11": true, - "goals!C12": true, - "goals!C13": true, - "goals!C14": true, - "goals!C15": true, - "goals!C16": true, - "goals!C17": true, - "goals!C18": true, - "goals!C19": true, - "goals!C20": true, - "goals!C21": true, - "goals!C22": true, - "goals!C23": true, - "goals!C24": true, - "goals!C25": true, - "goals!C26": true, - "goals!J7": true, - "goals!J8": true, - "goals!J9": true, - "goals!J10": true, - "goals!J11": true, - "goals!J12": true, - "goals!J13": true, - "goals!J14": true, - "goals!J15": true, - "goals!J16": true, - "goals!J17": true, - "goals!J18": true, - "goals!J19": true, - "goals!J20": true, - "goals!J21": true, - "goals!J22": true, - "goals!J23": true, - "goals!J24": true, - "goals!J25": true, - "goals!J26": true, - "goals!F7": true, - "goals!F11": true, - "goals!F15": true, - "goals!F19": true, - "goals!F23": true, - "goals!G7": true, - "goals!G11": true, - "goals!G15": true, - "goals!G19": true, - "goals!G23": true, - "goals!C27": true, - "goals!C28": true, - "goals!C29": true, - "goals!C30": true, - "goals!H28": true, - "goals!H29": true, - "goals!H30": true, - "goals!G27": true, - "compare!D10": true, - "compare!D11": true, - "compare!D12": true, - "compare!D13": true, - "compare!D27": true, - "compare!D26": true, - "compare!D25": true, - "compare!D24": true, - "compare!D23": true, - "compare!D22": true, - "compare!D21": true, - "compare!D20": true, - "goals!F31": true, - "goals!C31": true, - "goals!J31": true, - "goals!J32": true, - "goals!G31": true, - "goals!J33": true, - "goals!J27": true, - "goals!J34": true, - "goals!J28": true, - "goals!J29": true, - "goals!J30": true, - "sheet6!C3": true, - "sheet6!B6": true, - "sheet6!C6": true, - "sheet6!D6": true, - "sheet6!E6": true, - "sheet6!F6": true, - "sheet6!G6": true, - "sheet6!H6": true, - "sheet6!C31": true, - "sheet6!C30": true, - "sheet6!C29": true, - "sheet6!C28": true, - "sheet6!C27": true, - "sheet6!C26": true, - "sheet6!C25": true, - "sheet6!C24": true, - "sheet6!C23": true, - "sheet6!C22": true, - "sheet6!C21": true, - "sheet6!C20": true, - "sheet6!C19": true, - "sheet6!C18": true, - "sheet6!C17": true, - "sheet6!C16": true, - "sheet6!C15": true, - "sheet6!C14": true, - "sheet6!C13": true, - "sheet6!C12": true, - "sheet6!C11": true, - "sheet6!C10": true, - "sheet6!C9": true, - "sheet6!B7": true, - "sheet7!F3": true, - "sheet7!G3": true, - "sheet7!H3": true, - "sheet7!D7": true, - "sheet7!E3": true, - "sheet7!E4": true, - "sheet7!E5": true, - "sheet7!I7": true, - "sheet7!H7": true, - "sheet7!G7": true, - "sheet7!F7": true, - "sheet7!E7": true, - "sheet7!C7": true, - "sheet7!C28": true, - "sheet7!C27": true, - "sheet7!C26": true, - "sheet7!C25": true, - "sheet7!C24": true, - "sheet7!C23": true, - "sheet7!C22": true, - "sheet7!C21": true, - "sheet7!C20": true, - "sheet7!C19": true, - "sheet7!C18": true, - "sheet7!C17": true, - "sheet7!C16": true, - "sheet7!C15": true, - "sheet7!C14": true, - "sheet7!C13": true, - "sheet7!C12": true, - "sheet7!C11": true, - "sheet7!C29": true, - "sheet7!C30": true, - "sheet7!C10": true, - "sheet7!C9": true, - "sheet7!C8": true, - "sheet7!D28": true, - "sheet7!D27": true, - "sheet7!D26": true, - "sheet7!D25": true, - "sheet7!D24": true, - "sheet7!D23": true, - "sheet7!D22": true, - "sheet7!D21": true, - "sheet7!D20": true, - "sheet7!D19": true, - "sheet7!D18": true, - "sheet7!D17": true, - "sheet7!D16": true, - "sheet7!D15": true, - "sheet7!D14": true, - "sheet7!D13": true, - "sheet7!D12": true, - "sheet7!D11": true, - "sheet7!D29": true, - "sheet7!D30": true, - "sheet7!D10": true, - "sheet7!D9": true, - "sheet7!D8": true, - "sheet7!F28": true, - "sheet7!F27": true, - "sheet7!F26": true, - "sheet7!F25": true, - "sheet7!F24": true, - "sheet7!F23": true, - "sheet7!F22": true, - "sheet7!F21": true, - "sheet7!F20": true, - "sheet7!F19": true, - "sheet7!F18": true, - "sheet7!F17": true, - "sheet7!F16": true, - "sheet7!F15": true, - "sheet7!F14": true, - "sheet7!F13": true, - "sheet7!F12": true, - "sheet7!F11": true, - "sheet7!F29": true, - "sheet7!F30": true, - "sheet7!F10": true, - "sheet7!F9": true, - "sheet7!F8": true, - "sheet7!G28": true, - "sheet7!G27": true, - "sheet7!G26": true, - "sheet7!G25": true, - "sheet7!G24": true, - "sheet7!G23": true, - "sheet7!G22": true, - "sheet7!G21": true, - "sheet7!G20": true, - "sheet7!G19": true, - "sheet7!G18": true, - "sheet7!G17": true, - "sheet7!G16": true, - "sheet7!G15": true, - "sheet7!G14": true, - "sheet7!G13": true, - "sheet7!G12": true, - "sheet7!G11": true, - "sheet7!G29": true, - "sheet7!G30": true, - "sheet7!G31": true, - "sheet7!G32": true, - "sheet7!G33": true, - "sheet7!G34": true, - "sheet7!G35": true, - "sheet7!G36": true, - "sheet7!G37": true, - "sheet7!G38": true, - "sheet7!G39": true, - "sheet7!G10": true, - "sheet7!G9": true, - "sheet7!G8": true, - "sheet7!E28": true, - "sheet7!E27": true, - "sheet7!E26": true, - "sheet7!E25": true, - "sheet7!E24": true, - "sheet7!E23": true, - "sheet7!E22": true, - "sheet7!E21": true, - "sheet7!E20": true, - "sheet7!E19": true, - "sheet7!E18": true, - "sheet7!E17": true, - "sheet7!E16": true, - "sheet7!E15": true, - "sheet7!E14": true, - "sheet7!E13": true, - "sheet7!E12": true, - "sheet7!E11": true, - "sheet7!E29": true, - "sheet7!E30": true, - "sheet7!E10": true, - "sheet7!E9": true, - "sheet7!E8": true, - "sheet7!H28": true, - "sheet7!H27": true, - "sheet7!H26": true, - "sheet7!H25": true, - "sheet7!H24": true, - "sheet7!H23": true, - "sheet7!H22": true, - "sheet7!H21": true, - "sheet7!H20": true, - "sheet7!H19": true, - "sheet7!H18": true, - "sheet7!H17": true, - "sheet7!H16": true, - "sheet7!H15": true, - "sheet7!H14": true, - "sheet7!H13": true, - "sheet7!H12": true, - "sheet7!H11": true, - "sheet7!H29": true, - "sheet7!H30": true, - "sheet7!H10": true, - "sheet7!H9": true, - "sheet7!E31": true, - "sheet7!H8": true, - "sheet6!C8": true, - "sheet6!D31": true, - "sheet6!D30": true, - "sheet6!D29": true, - "sheet6!D28": true, - "sheet6!D27": true, - "sheet6!D26": true, - "sheet6!D25": true, - "sheet6!D24": true, - "sheet6!D23": true, - "sheet6!D22": true, - "sheet6!D21": true, - "sheet6!D20": true, - "sheet6!D19": true, - "sheet6!D18": true, - "sheet6!D17": true, - "sheet6!D16": true, - "sheet6!D15": true, - "sheet6!D14": true, - "sheet6!D13": true, - "sheet6!D12": true, - "sheet6!D11": true, - "sheet6!D10": true, - "sheet6!D9": true, - "sheet6!D8": true, - "sheet6!F31": true, - "sheet6!F30": true, - "sheet6!F29": true, - "sheet6!F28": true, - "sheet6!F27": true, - "sheet6!F26": true, - "sheet6!F25": true, - "sheet6!F24": true, - "sheet6!F23": true, - "sheet6!F22": true, - "sheet6!F21": true, - "sheet6!F20": true, - "sheet6!F19": true, - "sheet6!F18": true, - "sheet6!F17": true, - "sheet6!F16": true, - "sheet6!F15": true, - "sheet6!F14": true, - "sheet6!F13": true, - "sheet6!F12": true, - "sheet6!F11": true, - "sheet6!F10": true, - "sheet6!F9": true, - "sheet6!F8": true, - "sheet6!G31": true, - "sheet6!G30": true, - "sheet6!G29": true, - "sheet6!G28": true, - "sheet6!G27": true, - "sheet6!G26": true, - "sheet6!G25": true, - "sheet6!G24": true, - "sheet6!G23": true, - "sheet6!G22": true, - "sheet6!G21": true, - "sheet6!G20": true, - "sheet6!G19": true, - "sheet6!G18": true, - "sheet6!G17": true, - "sheet6!G16": true, - "sheet6!G15": true, - "sheet6!G14": true, - "sheet6!G13": true, - "sheet6!G12": true, - "sheet6!G11": true, - "sheet6!G10": true, - "sheet6!G9": true, - "sheet6!G8": true, - "sheet6!B31": true, - "sheet6!B30": true, - "sheet6!B29": true, - "sheet6!B28": true, - "sheet6!B27": true, - "sheet6!B26": true, - "sheet6!B25": true, - "sheet6!B24": true, - "sheet6!B23": true, - "sheet6!B22": true, - "sheet6!B21": true, - "sheet6!B20": true, - "sheet6!B19": true, - "sheet6!B18": true, - "sheet6!B17": true, - "sheet6!B16": true, - "sheet6!B15": true, - "sheet6!B14": true, - "sheet6!B13": true, - "sheet6!B12": true, - "sheet6!B11": true, - "sheet6!B10": true, - "sheet6!B9": true, - "sheet6!B8": true, - "sheet6!C7": true, - "sheet6!D7": true, - "sheet6!E7": true, - "sheet6!F7": true, - "sheet6!G7": true, - "sheet6!E31": true, - "sheet6!E30": true, - "sheet6!E29": true, - "sheet6!E28": true, - "sheet6!E27": true, - "sheet6!E26": true, - "sheet6!E25": true, - "sheet6!E24": true, - "sheet6!E23": true, - "sheet6!E22": true, - "sheet6!E21": true, - "sheet6!E20": true, - "sheet6!E19": true, - "sheet6!E18": true, - "sheet6!E17": true, - "sheet6!E16": true, - "sheet6!E15": true, - "sheet6!E14": true, - "sheet6!E13": true, - "sheet6!E12": true, - "sheet6!E11": true, - "sheet6!E10": true, - "sheet6!E9": true, - "sheet6!E8": true, - "compare!B4": true, - "compare!C9": true, - "compare!D9": true, - "compare!E9": true, - "compare!F9": true, - "compare!C10": true, - "compare!C11": true, - "compare!C12": true, - "compare!C13": true, - "compare!F19": true, - "compare!C19": true, - "compare!C27": true, - "compare!C26": true, - "compare!C25": true, - "compare!C24": true, - "compare!C23": true, - "compare!C22": true, - "compare!C21": true, - "compare!C20": true, - "summary!G18": true, - "summary!O32": true, - }, - constraints: {}, - }, - }, - footers: [ - { name: "Inventory Sheet 1", index: 1, isActive: true }, - { name: "Inventory Sheet 2", index: 2, isActive: false }, - { name: "Inventory Sheet 3", index: 3, isActive: false }, - { name: "Asset Inventory", index: 4, isActive: false }, - { name: "Purchase Information", index: 5, isActive: false }, - { name: "Supplier List", index: 6, isActive: false }, - { name: "Insurance Inventory 1", index: 7, isActive: false }, - { name: "Insurance Inventory 2", index: 8, isActive: false }, - { name: "Insurance Information", index: 9, isActive: false }, - ], - }, - iPhone: { - msc: { - numsheets: 5, - currentid: "sheet1", - currentname: "inv1", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:10\ncell:C1:b:::2::l:1:f:10\ncell:D1:b:::2::l:1:f:10\ncell:E1:b:::2::l:1:f:10\ncell:F1:b:::2::l:1:f:10\ncell:G1:b:::2::l:1:f:10\ncell:A2:b::2:::l:1:f:10\ncell:B2:t:INVOICE:b:1:1:1:1:f:13:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:10\ncell:D2:t::b:2::2::l:1:f:10\ncell:E2:t::b:2::2::l:1:f:10\ncell:F2:t::b:2::2::l:1:f:10\ncell:G2:t::b:2::2::l:1:f:10\ncell:A3:b::2:::l:3:f:10\ncell:B3:b:2:::2:l:3:f:10\ncell:C3:b:2::::l:1:f:10\ncell:D3:b:2::::l:1:f:10\ncell:E3:b:2::::l:1:f:10\ncell:F3:b:2::::l:1:f:10\ncell:G3:b:2:2:::l:3:f:10\ncell:A4:b::2:::l:3:f:10\ncell:B4:b::::2:l:3:f:6\ncell:C4:t:BILL TO\\c:f:9:colspan:2\ncell:E4:f:5:cf:2\ncell:G4:b::2:::l:3:f:10\ncell:A5:b::2:::l:3:f:10\ncell:B5:b::::2:l:3:f:7\ncell:C5:t:[Name]:f:9:cf:2:colspan:3\ncell:E5:f:1:cf:2\ncell:F5:t::l:2:f:10:tvf:4:rowspan:6\ncell:G5:t::b::1:::l:2:f:10\ncell:A6:b::2:::l:3:f:10\ncell:B6:b::::2:l:3:f:7\ncell:C6:t:[Street Address]:f:9:cf:2:colspan:3\ncell:E6:f:1:cf:2\ncell:F6:l:2:f:10\ncell:G6:b::1:::l:2:f:10\ncell:A7:b::2:::l:3:f:10\ncell:B7:b::::2:l:3:f:7\ncell:C7:t:[City, State, Zip]:f:9:cf:2:colspan:3\ncell:E7:f:1:cf:2\ncell:G7:b::2:::l:3:f:10\ncell:A8:b::2:::l:3:f:10\ncell:B8:b::::2:l:3:f:7\ncell:C8:t:Phone\\c:f:9:cf:2:colspan:3\ncell:D8:f:8:cf:2\ncell:E8:f:1:cf:2\ncell:G8:b::2:::l:3:f:10\ncell:A9:b::2:::l:3:f:10\ncell:B9:b::::2:l:3:f:7\ncell:C9:t:Email\\c:f:9:cf:2:colspan:3\ncell:E9:f:1:cf:2\ncell:G9:b::2:::l:3:f:10\ncell:A10:b::2:::l:3:f:10\ncell:B10:b::::2:l:3:f:7\ncell:C10:colspan:2\ncell:G10:b::2:::l:3:f:10\ncell:A11:b::2:::l:3:f:10\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:FROM\\c:f:9:colspan:2\ncell:E11:f:8:colspan:2\ncell:G11:b::2:::l:3:f:10\ncell:A12:b::2:::l:3:f:10\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[Name]:f:9:colspan:4\ncell:E12:colspan:2\ncell:G12:b::2:::l:3:f:10\ncell:A13:b::2:::l:3:f:10\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:[Street Address]:f:9:colspan:4\ncell:E13:colspan:2\ncell:G13:b::2:::l:3:f:10\ncell:A14:b::2:::l:3:f:10\ncell:B14:b::::2:l:3:f:7\ncell:C14:t:[City, State, Zip]:f:9:colspan:4\ncell:E14:colspan:2\ncell:G14:b::2:::l:3:f:10\ncell:A15:b::2:::l:3:f:10\ncell:B15:b::::2:l:3:f:7\ncell:C15:t:Phone\\c:f:9:colspan:4\ncell:D15:f:8:cf:2:colspan:3\ncell:E15:colspan:2\ncell:G15:b::2:::l:3:f:10\ncell:A16:b::2:::l:3:f:10\ncell:B16:b::::2:l:3:f:7\ncell:C16:t:Email\\c:f:9:colspan:4\ncell:E16:colspan:2\ncell:G16:b::2:::l:3:f:10\ncell:A17:b::2:::l:3:f:10\ncell:B17:b::::2:l:3:f:6\ncell:G17:b::2:::l:3:f:10\ncell:A18:b::2:::l:3:f:10\ncell:B18:b::::2:l:3:f:10\ncell:C18:t:INVOICE #\\c:f:9:cf:2:colspan:4\ncell:D18:v:1:l:4:f:9:cf:2:colspan:3\ncell:G18:b::2:::l:3:f:10\ncell:A19:b::2:::l:3:f:10\ncell:B19:b::::2:l:3:f:10\ncell:G19:b::2:::l:3:f:10\ncell:A20:b::2:::l:3:f:10\ncell:B20:b::::2:l:3:f:10\ncell:C20:t:DATE\\c:f:9:cf:2\ncell:D20:vtf:nd:42081:TODAY():f:9:cf:2:ntvf:3:colspan:2\ncell:G20:b::2:::l:3:f:10\ncell:A21:b::2:::l:3:f:10\ncell:B21:b::::2:l:3:f:6:cf:2\ncell:C21:b:::2::l:1:f:10\ncell:D21:b:::2::l:3:f:6:cf:2\ncell:E21:b:::2::l:1:f:10\ncell:F21:b:::2::l:1:f:10\ncell:G21:b::2:::l:3:f:10\ncell:A22:b::2:::l:3:f:10\ncell:B22:b::2::2:l:3:f:10\ncell:C22:t:Description:b:1::1:1:f:9:cf:1:colspan:3\ncell:D22:t:Description:b:1::1::l:3:f:6:cf:2:colspan:2:rowspan:1\ncell:E22:t::b:2:2:2::l:1:f:10\ncell:F22:t:Amount:b:1:1:1:1:f:9:cf:1\ncell:G22:b::2::2:l:3:f:10\ncell:A23:b::2:::l:3:f:10\ncell:B23:b::2::2:l:3:f:10\ncell:C23:b:1:1::1:f:2:cf:2:colspan:3\ncell:D23:b:1:1:::l:3:f:10:cf:2:colspan:2:rowspan:1\ncell:E23:t::b:2:2:2::l:1:f:10\ncell:F23:b:1:1:::f:2:ntvf:1\ncell:G23:b::2::2:l:3:f:10\ncell:A24:b::2:::l:3:f:10\ncell:B24:b::2::2:l:3:f:10:cf:2\ncell:C24:b::1::1:f:2:cf:2:colspan:3\ncell:D24:b::1:::l:1:f:10:colspan:2\ncell:E24:l:1:f:10\ncell:F24:b::1:::f:2:ntvf:1\ncell:G24:b::2::2:l:3:f:10\ncell:A25:b::2:::l:3:f:10\ncell:B25:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C25:b::1::1:f:2:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:2:ntvf:1\ncell:G25:b::2::2:l:3:f:10\ncell:A26:b::2:::l:3:f:10\ncell:B26:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C26:b::1::1:f:2:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:2:ntvf:1\ncell:G26:b::2::2:l:3:f:10\ncell:A27:b::2:::l:3:f:10\ncell:B27:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C27:b::1::1:f:2:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:2:ntvf:1\ncell:G27:b::2::2:l:3:f:10\ncell:A28:b::2:::l:3:f:10\ncell:B28:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C28:b::1::1:f:2:cf:2:colspan:3\ncell:D28:b::1:::colspan:2\ncell:F28:b::1:::f:2:ntvf:1\ncell:G28:b::2::2:l:3:f:10\ncell:A29:b::2:::l:3:f:10\ncell:B29:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C29:b::1::1:f:2:cf:2:colspan:3\ncell:D29:b::1:::colspan:2\ncell:F29:b::1:::f:2:ntvf:1\ncell:G29:b::2::2:l:3:f:10\ncell:A30:b::2:::l:3:f:10\ncell:B30:b::2::2:l:3:f:10:cf:2\ncell:C30:b::1::1:f:2:cf:2:colspan:3\ncell:D30:b::1:::colspan:2\ncell:F30:b::1:::f:2:ntvf:1\ncell:G30:b::2::2:l:3:f:10\ncell:A31:b::2:::l:3:f:10\ncell:B31:b::2::2:l:3:f:10:cf:2\ncell:C31:b::1::1:f:2:cf:2:colspan:3\ncell:D31:b::1:::colspan:2\ncell:F31:b::1:::f:2:ntvf:1\ncell:G31:b::2::2:l:3:f:10\ncell:A32:b::2:::l:3:f:10\ncell:B32:b::2::2:l:3:f:10:cf:2\ncell:C32:b::1::1:f:2:cf:2:colspan:3\ncell:D32:b::1:::colspan:2\ncell:F32:b::1:::f:2:ntvf:1\ncell:G32:b::2::2:l:3:f:10\ncell:A33:b::2:::l:3:f:10\ncell:B33:b::2::2:l:3:f:10:cf:2\ncell:C33:b::1::1:f:2:cf:2:colspan:3\ncell:D33:b::1:::colspan:2\ncell:F33:b::1:::f:2:ntvf:1\ncell:G33:b::2::2:l:3:f:10\ncell:A34:b::2:::l:3:f:10\ncell:B34:b::2::2:l:3:f:10:cf:2\ncell:C34:b::1::1:f:2:cf:2:colspan:3\ncell:D34:b::1:::colspan:2\ncell:F34:b::1:::f:2:ntvf:1\ncell:G34:b::2::2:l:3:f:10\ncell:A35:b::2:::l:3:f:7\ncell:B35:b::2::2:l:3:f:10:cf:2\ncell:C35:b::1:1:1:f:2:cf:2:colspan:3\ncell:D35:b::1:1::l:3:f:10:cf:2:colspan:2\ncell:E35:b:::2::l:3:f:10:cf:2\ncell:F35:b::1:1::f:2:ntvf:1\ncell:G35:b::2::2:l:3:f:10\ncell:A36:b::2:::l:3:f:6\ncell:B36:b::2::2:l:3:f:6\ncell:C36:t:TOTAL:b:1:1:1:1:f:11:cf:2:colspan:3\ncell:D36:b:2::2::l:3:f:12:cf:2\ncell:E36:b:2:2:2::l:3:f:12:cf:2\ncell:F36:vtf:n:0:SUM(F23\\cF35):b:1:1:1::f:11:ntvf:1\ncell:G36:b::2::2:l:3:f:7\ncell:A37:b::2:::l:3:f:10\ncell:B37:b::::2:l:3:f:6:cf:2\ncell:C37:b:2::::l:1:f:10\ncell:D37:b:2::::l:1:f:10\ncell:E37:b:2::::l:1:f:10\ncell:F37:b:2::::l:1:f:10\ncell:G37:b::2:::l:3:f:6\ncell:A38:b::2:::l:3:f:10\ncell:B38:b::::2:l:3:f:10\ncell:G38:b::2:::l:3:f:10\ncell:A39:b::2:::l:3:f:10\ncell:B39:b::::2:l:3:f:10:cf:2\ncell:C39:t:Thank you for your business:f:4:cf:1:colspan:4\ncell:D39:t:Thank you for your business:colspan:3\ncell:E39:t:Thank you for your business:f:3:colspan:2\ncell:F39:t::l:2:f:10\ncell:G39:b::2:::l:3:f:10\ncell:A40:b::2:::l:3:f:10\ncell:B40:b::::2:l:3:f:10\ncell:G40:b::2:::l:3:f:10\ncell:A41:b::2:::l:3:f:10\ncell:B41:b:::2:2:l:3:f:10\ncell:C41:b:::2::l:3:f:10\ncell:D41:b:::2::l:3:f:10\ncell:E41:b:::2::l:3:f:10\ncell:F41:b:::2::l:3:f:10\ncell:G41:b::2:2::l:3:f:10\ncell:B42:b:1:::\ncell:C42:b:1:::\ncell:D42:b:1:::\ncell:E42:b:1:::\ncell:F42:b:1:::\ncell:G42:b:1:::\ncol:A:w:10\ncol:B:w:10\ncol:C:w:62\ncol:D:w:73\ncol:E:w:15\ncol:F:w:68\ncol:G:w:10\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:15.75\nrow:36:h:15.75\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nsheet:c:7:r:42:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:* 9pt Trebuchet MS\nfont:3:italic bold * Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Arial\nfont:7:normal bold 12pt Arial\nfont:8:normal normal * *\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 11pt Trebuchet MS\nfont:12:normal normal 12pt Arial\nfont:13:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nlayout:4:padding:* * * 4px;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv1", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - "version:1.5\ncell:B2:t:INVOICE:l:1:f:9:cf:1:colspan:6\ncell:C2:t::l:2:f:13\ncell:D2:t::l:2:f:13\ncell:E2:l:1:f:10:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:8:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:13\ncell:B3:f:6:cf:2:colspan:4\ncell:C3:t::l:2:f:13\ncell:D3:t::l:2:f:13\ncell:F3:l:1:f:7:cf:2\ncell:G3:l:1:f:14:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:14:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:14:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:3:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:7:cf:2:colspan:2\ncell:G5:l:1:f:14:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:7:cf:2:colspan:2\ncell:G6:l:1:f:14:cf:2\ncell:B7:t:FROM\\c:f:12\ncell:F7:l:1:f:7:cf:2:tvf:4:colspan:2:rowspan:6\ncell:G7:l:1:f:14:cf:2\ncell:B8:t:[Company Name]:f:3:colspan:4\ncell:F8:l:1:f:7:cf:2:colspan:2\ncell:G8:l:1:f:14:cf:2\ncell:B9:t:[Street Address]:f:1:cf:2:colspan:4\ncell:F9:l:1:f:7\ncell:G9:l:1:f:14:cf:1\ncell:B10:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:G10:l:1:f:13\ncell:B11:t:Phone\\c :f:1:cf:2:colspan:4\ncell:B12:t:Email\\c:f:1:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:11:cf:2\ncell:B15:t:[Name]:f:1:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:1:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:1:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:1:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:1:cf:2:colspan:6\ncell:B20:t:Email\\c:f:1:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:14:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:13\ncell:D22:t::l:2:f:13\ncell:E22:t::l:2:f:13\ncell:F22:t::l:2:f:13\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:14:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:b:1:1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:4\ncell:D23:t::l:2:f:4\ncell:E23:t::l:2:f:4\ncell:F23:t::b::2:::l:1:f:4\ncell:G23:b::1::1:f:4:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:4\ncell:D24:t::l:2:f:4\ncell:E24:t::l:2:f:4\ncell:F24:t::b::2:::l:1:f:4\ncell:G24:b::1::1:f:4:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:4\ncell:D25:t::l:2:f:4\ncell:E25:t::l:2:f:4\ncell:F25:t::b::2:::l:1:f:4\ncell:G25:b::1::1:f:4:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:4\ncell:D26:t::l:2:f:4\ncell:E26:t::l:2:f:4\ncell:F26:t::b::2:::l:1:f:4\ncell:G26:b::1::1:f:4:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:4\ncell:D27:t::l:2:f:4\ncell:E27:t::l:2:f:4\ncell:F27:t::b::2:::l:1:f:4\ncell:G27:b::1::1:f:4:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:4\ncell:D28:t::l:2:f:4\ncell:E28:t::l:2:f:4\ncell:F28:t::b::2:::l:1:f:4\ncell:G28:b::1::1:f:4:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:4\ncell:D29:t::l:2:f:4\ncell:E29:t::l:2:f:4\ncell:F29:t::b::2:::l:1:f:4\ncell:G29:b::1::1:f:4:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:4\ncell:D30:t::l:2:f:4\ncell:E30:t::l:2:f:4\ncell:F30:t::b::2:::l:1:f:4\ncell:G30:b::1::1:f:4:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:4\ncell:D31:t::l:2:f:4\ncell:E31:t::l:2:f:4\ncell:F31:t::b::2:::l:1:f:4\ncell:G31:b::1::1:f:4:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:4\ncell:D32:t::l:2:f:4\ncell:E32:t::l:2:f:4\ncell:F32:t::b::2:::l:1:f:4\ncell:G32:b::1::1:f:4:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C33:t::l:2:f:4\ncell:D33:t::l:2:f:4\ncell:E33:t::l:2:f:4\ncell:F33:t::b::2:::l:1:f:4\ncell:G33:b::1::1:f:4:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C34:l:2:f:4\ncell:D34:l:2:f:4\ncell:E34:l:2:f:4\ncell:F34:b::2:::l:1:f:4\ncell:G34:b::1::1:f:4:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:f:4:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:4\ncell:D35:t::b:::2::l:1:f:4\ncell:E35:t::b:::2::l:1:f:4\ncell:F35:t::b::2:2::l:1:f:4\ncell:G35:b::1:1:1:f:4:ntvf:1\ncell:B36:b:2::::l:1:f:13\ncell:C36:b:2::::l:1:f:13\ncell:D36:b:2::::l:1:f:13\ncell:E36:b:2::::l:1:f:14\ncell:F36:t:Subtotal:b:2::::l:1:f:11\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:11:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:14:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:13\ncell:D37:t::b:::2::l:1:f:13\ncell:F37:t:Tax Rate:l:1:f:11\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:13\ncell:D38:t::b:2::::l:1:f:13\ncell:F38:t:Tax:l:1:f:11\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:13\ncell:D39:t::l:2:f:13\ncell:F39:t:Other:b:::1::l:1:f:11\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:13\ncell:D40:t::l:2:f:13\ncell:F40:t:TOTAL:b:1::::l:1:f:14\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:11:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:5:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:13\ncell:D43:t::l:2:f:13\ncell:E43:t::l:2:f:13\ncell:F43:t::l:2:f:13\ncell:G43:t::l:2:f:13\ncol:A:w:10\ncol:B:w:90\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:45\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 10pt Trebuchet MS\nfont:4:* 9pt Trebuchet MS\nfont:5:italic bold 10pt Trebuchet MS\nfont:6:italic normal * Trebuchet MS\nfont:7:normal bold 10pt Trebuchet MS\nfont:8:normal bold 14pt Trebuchet MS\nfont:9:normal bold 16pt Trebuchet MS\nfont:10:normal bold 28pt Trebuchet MS\nfont:11:normal normal * Trebuchet MS\nfont:12:normal normal 10pt *\nfont:13:normal normal 10pt Arial\nfont:14:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv2", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - 'version:1.5\ncell:B2:t:INVOICE:l:1:f:12:cf:1:colspan:6\ncell:C2:t::l:2:f:10\ncell:D2:t::l:2:f:10\ncell:E2:l:1:f:8:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:10\ncell:B3:f:5:cf:2:colspan:4\ncell:C3:t::l:2:f:10\ncell:D3:t::l:2:f:10\ncell:F3:l:1:f:6:cf:2\ncell:G3:l:1:f:11:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:11:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:11:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:9:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:6:cf:2:colspan:2\ncell:G5:l:1:f:11:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:6:cf:2:colspan:2\ncell:G6:l:1:f:11:cf:2\ncell:B7:t:FROM\\c:f:11\ncell:F7:l:1:f:6:cf:2:colspan:2\ncell:G7:l:1:f:11:cf:2\ncell:B8:t:[Company Name]:f:9:colspan:4\ncell:F8:l:1:f:6:cf:2:tvf:4:colspan:2:rowspan:5\ncell:G8:l:1:f:11:cf:2\ncell:B9:t:[Street Address]:f:9:cf:2:colspan:4\ncell:F9:l:1:f:6\ncell:G9:l:1:f:11:cf:1\ncell:B10:t:[City, State, Zip]:f:9:cf:2:colspan:4\ncell:G10:l:1:f:10\ncell:B11:t:Phone\\c :f:9:cf:2:colspan:4\ncell:B12:t:Email\\c:f:9:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:9:cf:2\ncell:B15:t:[Name]:f:9:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:9:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:9:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:9:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:9:cf:2:colspan:6\ncell:B20:t:Email\\c:f:9:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:11:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:10\ncell:D22:t::l:2:f:10\ncell:E22:t::l:2:f:10\ncell:F22:t::l:2:f:10\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:11:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), sheet7!B6, inv3!B6)):b:1:1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:3\ncell:D23:t::l:2:f:3\ncell:E23:t::l:2:f:3\ncell:F23:t::b::2:::l:1:f:3\ncell:G23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), (sheet7!E6*sheet7!F6), (inv3!E6*inv3!F6))):b::1::1:f:3:ntvf:1\ncell:A24:b::1::\ncell:B24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), SHEET7!B7, INV3!B7)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:3\ncell:D24:t::l:2:f:3\ncell:E24:t::l:2:f:3\ncell:F24:t::b::2:::l:1:f:3\ncell:G24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), (SHEET7!E7*SHEET7!F7), (INV3!E7*INV3!F7))):b::1::1:f:3:ntvf:1\ncell:A25:b::1::\ncell:B25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), SHEET7!B8, INV3!B8)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:3\ncell:D25:t::l:2:f:3\ncell:E25:t::l:2:f:3\ncell:F25:t::b::2:::l:1:f:3\ncell:G25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), (SHEET7!E8*SHEET7!F8), (INV3!E8*INV3!F8))):b::1::1:f:3:ntvf:1\ncell:A26:b::1::\ncell:B26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), SHEET7!B9, INV3!B9)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:3\ncell:D26:t::l:2:f:3\ncell:E26:t::l:2:f:3\ncell:F26:t::b::2:::l:1:f:3\ncell:G26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), (SHEET7!E9*SHEET7!F9), (INV3!E9*INV3!F9))):b::1::1:f:3:ntvf:1\ncell:A27:b::1::\ncell:B27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), SHEET7!B10, INV3!B10)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:3\ncell:D27:t::l:2:f:3\ncell:E27:t::l:2:f:3\ncell:F27:t::b::2:::l:1:f:3\ncell:G27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), (SHEET7!E10*SHEET7!F10), (INV3!E10*INV3!F10))):b::1::1:f:3:ntvf:1\ncell:A28:b::1::\ncell:B28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), SHEET7!B11, INV3!B11)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:3\ncell:D28:t::l:2:f:3\ncell:E28:t::l:2:f:3\ncell:F28:t::b::2:::l:1:f:3\ncell:G28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), (SHEET7!E11*SHEET7!F11), (INV3!E11*INV3!F11))):b::1::1:f:3:ntvf:1\ncell:A29:b::1::\ncell:B29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), SHEET7!B12, INV3!B12)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:3\ncell:D29:t::l:2:f:3\ncell:E29:t::l:2:f:3\ncell:F29:t::b::2:::l:1:f:3\ncell:G29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), (SHEET7!E12*SHEET7!F12), (INV3!E12*INV3!F12))):b::1::1:f:3:ntvf:1\ncell:A30:b::1::\ncell:B30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), SHEET7!B13, INV3!B13)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:3\ncell:D30:t::l:2:f:3\ncell:E30:t::l:2:f:3\ncell:F30:t::b::2:::l:1:f:3\ncell:G30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), (SHEET7!E13*SHEET7!F13), (INV3!E13*INV3!F13))):b::1::1:f:3:ntvf:1\ncell:A31:b::1::\ncell:B31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), SHEET7!B14, INV3!B14)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:3\ncell:D31:t::l:2:f:3\ncell:E31:t::l:2:f:3\ncell:F31:t::b::2:::l:1:f:3\ncell:G31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), (SHEET7!E14*SHEET7!F14), (INV3!E14*INV3!F14))):b::1::1:f:3:ntvf:1\ncell:A32:b::1::\ncell:B32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), SHEET7!B15, INV3!B15)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:3\ncell:D32:t::l:2:f:3\ncell:E32:t::l:2:f:3\ncell:F32:t::b::2:::l:1:f:3\ncell:G32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), (SHEET7!E15*SHEET7!F15), (INV3!E15*INV3!F15))):b::1::1:f:3:ntvf:1\ncell:A33:b::1::\ncell:B33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), SHEET7!B16, INV3!B16)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C33:l:2:f:3\ncell:D33:l:2:f:3\ncell:E33:l:2:f:3\ncell:F33:b::2:::l:1:f:3\ncell:G33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), (SHEET7!E16*SHEET7!F16), (INV3!E16*INV3!F16))):b::1::1:f:3:ntvf:1\ncell:A34:b::1::\ncell:B34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), SHEET7!B17, INV3!B17)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C34:t::l:2:f:3\ncell:D34:t::l:2:f:3\ncell:E34:t::l:2:f:3\ncell:F34:t::b::2:::l:1:f:3\ncell:G34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), (SHEET7!E17*SHEET7!F17), (INV3!E17*INV3!F17))):b::1::1:f:3:ntvf:1\ncell:A35:b::1::\ncell:B35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), SHEET7!B18, INV3!B18)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:3\ncell:D35:t::b:::2::l:1:f:3\ncell:E35:t::b:::2::l:1:f:3\ncell:F35:t::b::2:2::l:1:f:3\ncell:G35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), (SHEET7!E18*SHEET7!F18), (INV3!E18*INV3!F18))):b::1::1:f:3:ntvf:1\ncell:B36:b:2::::l:1:f:10\ncell:C36:b:2::::l:1:f:10\ncell:D36:b:2::::l:1:f:10\ncell:E36:b:2::::l:1:f:11\ncell:F36:t:Subtotal:b:2::::l:1:f:9\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:9:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:11:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:10\ncell:D37:t::b:::2::l:1:f:10\ncell:F37:t:Tax Rate:l:1:f:9\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:10\ncell:D38:t::b:2::::l:1:f:10\ncell:F38:t:Tax:l:1:f:9\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:10\ncell:D39:t::l:2:f:10\ncell:F39:t:Other:b:::1::l:1:f:9\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:10\ncell:D40:t::l:2:f:10\ncell:F40:t:TOTAL:b:1::::l:1:f:11\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:9:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:4:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:10\ncell:D43:t::l:2:f:10\ncell:E43:t::l:2:f:10\ncell:F43:t::l:2:f:10\ncell:G43:t::l:2:f:10\ncol:A:w:10\ncol:B:w:65\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:53\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 9pt Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:italic normal * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 14pt Trebuchet MS\nfont:8:normal bold 28pt Trebuchet MS\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 10pt Trebuchet MS\nfont:12:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "sheet6", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Hours:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Rate:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "inv3", - hidden: "0", - }, - sheet5: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Qty.:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Price:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "sheet7", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "inv1!B2": true, - "inv1!C5": true, - "inv1!C6": true, - "inv1!C7": true, - "inv1!C8": true, - "inv1!C9": true, - "inv1!C11": true, - "inv1!C12": true, - "inv1!C13": true, - "inv1!C14": true, - "inv1!C15": true, - "inv1!C16": true, - "inv1!C18": true, - "inv1!C20": true, - "inv1!D20": true, - "inv1!C23": true, - "inv1!C24": true, - "inv1!C25": true, - "inv1!C26": true, - "inv1!C27": true, - "inv1!C28": true, - "inv1!C29": true, - "inv1!C30": true, - "inv1!C31": true, - "inv1!C32": true, - "inv1!C33": true, - "inv1!C34": true, - "inv1!C35": true, - "inv1!F23": true, - "inv1!F24": true, - "inv1!F25": true, - "inv1!F26": true, - "inv1!F27": true, - "inv1!F28": true, - "inv1!F29": true, - "inv1!F30": true, - "inv1!F31": true, - "inv1!F32": true, - "inv1!F33": true, - "inv1!F34": true, - "inv1!F35": true, - "inv2!B2": true, - "inv2!F4": true, - "inv2!G4": true, - "inv2!B5": true, - "inv2!B7": true, - "inv2!B8": true, - "inv2!B9": true, - "inv2!B10": true, - "inv2!B11": true, - "inv2!B12": true, - "inv2!B14": true, - "inv2!B15": true, - "inv2!B16": true, - "inv2!B17": true, - "inv2!B18": true, - "inv2!B19": true, - "inv2!B20": true, - "inv2!B23": true, - "inv2!B24": true, - "inv2!B25": true, - "inv2!B26": true, - "inv2!B27": true, - "inv2!B28": true, - "inv2!B29": true, - "inv2!B30": true, - "inv2!B31": true, - "inv2!B32": true, - "inv2!B33": true, - "inv2!B34": true, - "inv2!B35": true, - "inv2!G23": true, - "inv2!G24": true, - "inv2!G25": true, - "inv2!G26": true, - "inv2!G27": true, - "inv2!G28": true, - "inv2!G29": true, - "inv2!G30": true, - "inv2!G31": true, - "inv2!G32": true, - "inv2!G33": true, - "inv2!G34": true, - "inv2!G35": true, - "inv2!B38": true, - "inv2!B39": true, - "inv2!B40": true, - "inv2!F36": true, - "inv2!G37": true, - "inv2!F37": true, - "inv2!F39": true, - "inv2!G39": true, - "inv2!F38": true, - "sheet6!B2": true, - "sheet6!F4": true, - "sheet6!G4": true, - "sheet6!B5": true, - "sheet6!B7": true, - "sheet6!B8": true, - "sheet6!B9": true, - "sheet6!B10": true, - "sheet6!B11": true, - "sheet6!B12": true, - "sheet6!B14": true, - "sheet6!B15": true, - "sheet6!B16": true, - "sheet6!B17": true, - "sheet6!B18": true, - "sheet6!B19": true, - "sheet6!B20": true, - "sheet6!B38": true, - "sheet6!B39": true, - "sheet6!B40": true, - "sheet6!F36": true, - "sheet6!G37": true, - "sheet6!F37": true, - "sheet6!F39": true, - "sheet6!G39": true, - "sheet6!F38": true, - "inv3!B2": true, - "inv3!B6": true, - "inv3!B7": true, - "inv3!B8": true, - "inv3!B9": true, - "inv3!B10": true, - "inv3!B11": true, - "inv3!B12": true, - "inv3!B13": true, - "inv3!B14": true, - "inv3!B15": true, - "inv3!B16": true, - "inv3!B17": true, - "inv3!B18": true, - "inv3!E6": true, - "inv3!E7": true, - "inv3!E8": true, - "inv3!E9": true, - "inv3!E10": true, - "inv3!E11": true, - "inv3!E12": true, - "inv3!E13": true, - "inv3!E14": true, - "inv3!E15": true, - "inv3!E16": true, - "inv3!E17": true, - "inv3!E18": true, - "inv3!F6": true, - "inv3!F7": true, - "inv3!F8": true, - "inv3!F9": true, - "inv3!F10": true, - "inv3!F11": true, - "inv3!F12": true, - "inv3!F13": true, - "inv3!F14": true, - "inv3!F15": true, - "inv3!F16": true, - "inv3!F17": true, - "inv3!F18": true, - "sheet7!F6": true, - "sheet7!F7": true, - "sheet7!F8": true, - "sheet7!F9": true, - "sheet7!F10": true, - "sheet7!F11": true, - "sheet7!F12": true, - "sheet7!F13": true, - "sheet7!F14": true, - "sheet7!F15": true, - "sheet7!F16": true, - "sheet7!F17": true, - "sheet7!F18": true, - "sheet7!E6": true, - "sheet7!E7": true, - "sheet7!E8": true, - "sheet7!E9": true, - "sheet7!E10": true, - "sheet7!E11": true, - "sheet7!E12": true, - "sheet7!E13": true, - "sheet7!E14": true, - "sheet7!E15": true, - "sheet7!E16": true, - "sheet7!E17": true, - "sheet7!E18": true, - "sheet7!B6": true, - "sheet7!B2": true, - "sheet7!B7": true, - "sheet7!B8": true, - "sheet7!B9": true, - "sheet7!B10": true, - "sheet7!B11": true, - "sheet7!B12": true, - "sheet7!B13": true, - "sheet7!B14": true, - "sheet7!B15": true, - "sheet7!B16": true, - "sheet7!B17": true, - "sheet7!B18": true, - "inv1!D8": true, - "inv1!D15": true, - "inv1!D18": true, - "inv2!C5": true, - "sheet6!C5": true, - }, - constraints: { - "inv1!C5": ["prompttext", "0", "1e10", "Name"], - "inv1!C6": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C7": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C8": ["prompttext", "0", "1e10", "Phone"], - "inv1!C9": ["promptemail", "0", "1e10", "Email"], - "inv1!C11": ["prompttext", "0", "1e10", "From"], - "inv1!C12": ["prompttext", "0", "1e10", "Name"], - "inv1!C13": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C14": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C15": ["prompttext", "0", "1e10", "Phone"], - "inv1!C16": ["promptemail", "0", "1e10", "Email"], - "inv1!C18": ["prompttext", "0", "1e10", "Invoice #"], - "inv1!C20": ["prompttext", "0", "1e10", "Date"], - "inv1!D20": ["prompttext", "0", "1e10", "Date"], - "inv1!C23": ["prompttext", "0", "1e10", "Description"], - "inv1!C24": ["prompttext", "0", "1e10", "Description"], - "inv1!C25": ["prompttext", "0", "1e10", "Description"], - "inv1!C26": ["prompttext", "0", "1e10", "Description"], - "inv1!C27": ["prompttext", "0", "1e10", "Description"], - "inv1!C28": ["prompttext", "0", "1e10", "Description"], - "inv1!C29": ["prompttext", "0", "1e10", "Description"], - "inv1!C30": ["prompttext", "0", "1e10", "Description"], - "inv1!C31": ["prompttext", "0", "1e10", "Description"], - "inv1!C32": ["prompttext", "0", "1e10", "Description"], - "inv1!C33": ["prompttext", "0", "1e10", "Description"], - "inv1!C34": ["prompttext", "0", "1e10", "Description"], - "inv1!C35": ["prompttext", "0", "1e10", "Description"], - "inv1!F23": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F24": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F25": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F26": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F27": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F28": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F29": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F30": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F31": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F32": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F33": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F34": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B2": ["prompttext", "0", "1e10", "Invoice"], - "inv2!F4": ["prompttext", "0", "1e10", "Date"], - "inv2!G4": ["prompttext", "0", "1e10", "Date"], - "inv2!B5": ["prompttext", "0", "1e10", "Invoice #"], - "inv2!B7": ["prompttext", "0", "1e10", "From"], - "inv2!B8": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B9": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B11": ["prompttext", "0", "1e10", "Phone"], - "inv2!B12": ["promptemail", "0", "1e10", "Email"], - "inv2!B14": ["prompttext", "0", "1e10", "Bill To"], - "inv2!B15": ["prompttext", "0", "1e10", "Name"], - "inv2!B16": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B17": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B19": ["prompttext", "0", "1e10", "Phone"], - "inv2!B20": ["promptemail", "0", "1e10", "Email"], - "inv2!B23": ["prompttext", "0", "1e10", "Description"], - "inv2!B24": ["prompttext", "0", "1e10", "Description"], - "inv2!B25": ["prompttext", "0", "1e10", "Description"], - "inv2!B26": ["prompttext", "0", "1e10", "Description"], - "inv2!B27": ["prompttext", "0", "1e10", "Description"], - "inv2!B28": ["prompttext", "0", "1e10", "Description"], - "inv2!B29": ["prompttext", "0", "1e10", "Description"], - "inv2!B30": ["prompttext", "0", "1e10", "Description"], - "inv2!B31": ["prompttext", "0", "1e10", "Description"], - "inv2!B32": ["prompttext", "0", "1e10", "Description"], - "inv2!B33": ["prompttext", "0", "1e10", "Description"], - "inv2!B34": ["prompttext", "0", "1e10", "Description"], - "inv2!B35": ["prompttext", "0", "1e10", "Description"], - "inv2!G23": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G24": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G25": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G26": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G27": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G28": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G29": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G30": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G31": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G32": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G33": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G34": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B38": ["prompttext", "0", "1e10", "Notes"], - "inv2!B39": ["prompttext", "0", "1e10", "Notes"], - "inv2!B40": ["prompttext", "0", "1e10", "Notes"], - "inv2!F36": ["prompttext", "0", "1e10", "Subtotal"], - "inv2!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "inv2!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "inv2!F39": ["prompttext", "0", "1e10", "Other"], - "inv2!G39": ["promptdecimal", "0", "1e10", "Other"], - "inv2!F38": ["prompttext", "0", "1e10", "Tax"], - "sheet6!B2": ["prompttext", "0", "1e10", "Invoice"], - "sheet6!F4": ["prompttext", "0", "1e10", "Date"], - "sheet6!G4": ["prompttext", "0", "1e10", "Date"], - "sheet6!B5": ["prompttext", "0", "1e10", "Invoice #"], - "sheet6!B7": ["prompttext", "0", "1e10", "From"], - "sheet6!B8": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B9": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B11": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B12": ["promptemail", "0", "1e10", "Email"], - "sheet6!B14": ["prompttext", "0", "1e10", "Bill To"], - "sheet6!B15": ["prompttext", "0", "1e10", "Name"], - "sheet6!B16": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B17": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B19": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B20": ["promptemail", "0", "1e10", "Email"], - "sheet6!B38": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B39": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B40": ["prompttext", "0", "1e10", "Notes"], - "sheet6!F36": ["prompttext", "0", "1e10", "Subtotal"], - "sheet6!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "sheet6!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "sheet6!F39": ["prompttext", "0", "1e10", "Other"], - "sheet6!G39": ["promptdecimal", "0", "1e10", "Other"], - "sheet6!F38": ["prompttext", "0", "1e10", "Tax"], - "inv3!B6": ["prompttext", "0", "1e10", "Description"], - "inv3!B7": ["prompttext", "0", "1e10", "Description"], - "inv3!B8": ["prompttext", "0", "1e10", "Description"], - "inv3!B9": ["prompttext", "0", "1e10", "Description"], - "inv3!B10": ["prompttext", "0", "1e10", "Description"], - "inv3!B11": ["prompttext", "0", "1e10", "Description"], - "inv3!B12": ["prompttext", "0", "1e10", "Description"], - "inv3!B13": ["prompttext", "0", "1e10", "Description"], - "inv3!B14": ["prompttext", "0", "1e10", "Description"], - "inv3!B15": ["prompttext", "0", "1e10", "Description"], - "inv3!B16": ["prompttext", "0", "1e10", "Description"], - "inv3!B17": ["prompttext", "0", "1e10", "Description"], - "inv3!B18": ["prompttext", "0", "1e10", "Description"], - "sheet7!B6": ["prompttext", "0", "1e10", "Description"], - "sheet7!B7": ["prompttext", "0", "1e10", "Description"], - "sheet7!B8": ["prompttext", "0", "1e10", "Description"], - "sheet7!B9": ["prompttext", "0", "1e10", "Description"], - "sheet7!B10": ["prompttext", "0", "1e10", "Description"], - "sheet7!B11": ["prompttext", "0", "1e10", "Description"], - "sheet7!B12": ["prompttext", "0", "1e10", "Description"], - "sheet7!B13": ["prompttext", "0", "1e10", "Description"], - "sheet7!B14": ["prompttext", "0", "1e10", "Description"], - "sheet7!B15": ["prompttext", "0", "1e10", "Description"], - "sheet7!B16": ["prompttext", "0", "1e10", "Description"], - "sheet7!B17": ["prompttext", "0", "1e10", "Description"], - "sheet7!B18": ["prompttext", "0", "1e10", "Description"], - "inv1!D8": ["prompttext", "0", "1e10", "Phone"], - "inv1!D15": ["prompttext", "0", "1e10", "Phone"], - "inv1!D18": ["promptnumeric", "0", "1e10", "Invoice#"], - "inv2!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet6!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet7!E6": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E7": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E8": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E9": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E10": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E11": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E12": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E13": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E14": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E15": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E16": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E17": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E18": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!F6": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F7": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F8": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F9": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F10": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F11": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F12": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F13": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F14": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F15": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F16": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F17": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F18": ["promptdecimal", "0", "1e10", "Price"], - "inv3!E6": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E7": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E8": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E9": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E10": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E11": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E12": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E13": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E14": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E15": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E16": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E17": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E18": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!F6": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F7": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F8": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F9": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F10": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F11": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F12": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F13": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F14": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F15": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F16": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F17": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F18": ["promptdecimal", "0", "1e10", "Rate"], - }, - }, - }, - footers: [ - { name: "Type1", index: 1, isActive: true }, - { name: "Type2", index: 2, isActive: false }, - { name: "Type3", index: 3, isActive: false }, - { name: "Detail1", index: 4, isActive: false }, - { name: "Detail2", index: 5, isActive: false }, - ], - }, - iPod: { - msc: { - numsheets: 5, - currentid: "sheet1", - currentname: "inv1", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:10\ncell:C1:b:::2::l:1:f:10\ncell:D1:b:::2::l:1:f:10\ncell:E1:b:::2::l:1:f:10\ncell:F1:b:::2::l:1:f:10\ncell:G1:b:::2::l:1:f:10\ncell:A2:b::2:::l:1:f:10\ncell:B2:t:INVOICE:b:1:1:1:1:f:13:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:10\ncell:D2:t::b:2::2::l:1:f:10\ncell:E2:t::b:2::2::l:1:f:10\ncell:F2:t::b:2::2::l:1:f:10\ncell:G2:t::b:2::2::l:1:f:10\ncell:A3:b::2:::l:3:f:10\ncell:B3:b:2:::2:l:3:f:10\ncell:C3:b:2::::l:1:f:10\ncell:D3:b:2::::l:1:f:10\ncell:E3:b:2::::l:1:f:10\ncell:F3:b:2::::l:1:f:10\ncell:G3:b:2:2:::l:3:f:10\ncell:A4:b::2:::l:3:f:10\ncell:B4:b::::2:l:3:f:6\ncell:C4:t:BILL TO\\c:f:9:colspan:2\ncell:E4:f:5:cf:2\ncell:G4:b::2:::l:3:f:10\ncell:A5:b::2:::l:3:f:10\ncell:B5:b::::2:l:3:f:7\ncell:C5:t:[Name]:f:9:cf:2:colspan:3\ncell:E5:f:1:cf:2\ncell:F5:t::l:2:f:10:tvf:4:rowspan:6\ncell:G5:t::b::1:::l:2:f:10\ncell:A6:b::2:::l:3:f:10\ncell:B6:b::::2:l:3:f:7\ncell:C6:t:[Street Address]:f:9:cf:2:colspan:3\ncell:E6:f:1:cf:2\ncell:F6:l:2:f:10\ncell:G6:b::1:::l:2:f:10\ncell:A7:b::2:::l:3:f:10\ncell:B7:b::::2:l:3:f:7\ncell:C7:t:[City, State, Zip]:f:9:cf:2:colspan:3\ncell:E7:f:1:cf:2\ncell:G7:b::2:::l:3:f:10\ncell:A8:b::2:::l:3:f:10\ncell:B8:b::::2:l:3:f:7\ncell:C8:t:Phone\\c:f:9:cf:2:colspan:3\ncell:D8:f:8:cf:2\ncell:E8:f:1:cf:2\ncell:G8:b::2:::l:3:f:10\ncell:A9:b::2:::l:3:f:10\ncell:B9:b::::2:l:3:f:7\ncell:C9:t:Email\\c:f:9:cf:2:colspan:3\ncell:E9:f:1:cf:2\ncell:G9:b::2:::l:3:f:10\ncell:A10:b::2:::l:3:f:10\ncell:B10:b::::2:l:3:f:7\ncell:C10:colspan:2\ncell:G10:b::2:::l:3:f:10\ncell:A11:b::2:::l:3:f:10\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:FROM\\c:f:9:colspan:2\ncell:E11:f:8:colspan:2\ncell:G11:b::2:::l:3:f:10\ncell:A12:b::2:::l:3:f:10\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[Name]:f:9:colspan:4\ncell:E12:colspan:2\ncell:G12:b::2:::l:3:f:10\ncell:A13:b::2:::l:3:f:10\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:[Street Address]:f:9:colspan:4\ncell:E13:colspan:2\ncell:G13:b::2:::l:3:f:10\ncell:A14:b::2:::l:3:f:10\ncell:B14:b::::2:l:3:f:7\ncell:C14:t:[City, State, Zip]:f:9:colspan:4\ncell:E14:colspan:2\ncell:G14:b::2:::l:3:f:10\ncell:A15:b::2:::l:3:f:10\ncell:B15:b::::2:l:3:f:7\ncell:C15:t:Phone\\c:f:9:colspan:4\ncell:D15:f:8:cf:2:colspan:3\ncell:E15:colspan:2\ncell:G15:b::2:::l:3:f:10\ncell:A16:b::2:::l:3:f:10\ncell:B16:b::::2:l:3:f:7\ncell:C16:t:Email\\c:f:9:colspan:4\ncell:E16:colspan:2\ncell:G16:b::2:::l:3:f:10\ncell:A17:b::2:::l:3:f:10\ncell:B17:b::::2:l:3:f:6\ncell:G17:b::2:::l:3:f:10\ncell:A18:b::2:::l:3:f:10\ncell:B18:b::::2:l:3:f:10\ncell:C18:t:INVOICE #\\c:f:9:cf:2:colspan:4\ncell:D18:v:1:l:4:f:9:cf:2:colspan:3\ncell:G18:b::2:::l:3:f:10\ncell:A19:b::2:::l:3:f:10\ncell:B19:b::::2:l:3:f:10\ncell:G19:b::2:::l:3:f:10\ncell:A20:b::2:::l:3:f:10\ncell:B20:b::::2:l:3:f:10\ncell:C20:t:DATE\\c:f:9:cf:2\ncell:D20:vtf:nd:42081:TODAY():f:9:cf:2:ntvf:3:colspan:2\ncell:G20:b::2:::l:3:f:10\ncell:A21:b::2:::l:3:f:10\ncell:B21:b::::2:l:3:f:6:cf:2\ncell:C21:b:::2::l:1:f:10\ncell:D21:b:::2::l:3:f:6:cf:2\ncell:E21:b:::2::l:1:f:10\ncell:F21:b:::2::l:1:f:10\ncell:G21:b::2:::l:3:f:10\ncell:A22:b::2:::l:3:f:10\ncell:B22:b::2::2:l:3:f:10\ncell:C22:t:Description:b:1::1:1:f:9:cf:1:colspan:3\ncell:D22:t:Description:b:1::1::l:3:f:6:cf:2:colspan:2:rowspan:1\ncell:E22:t::b:2:2:2::l:1:f:10\ncell:F22:t:Amount:b:1:1:1:1:f:9:cf:1\ncell:G22:b::2::2:l:3:f:10\ncell:A23:b::2:::l:3:f:10\ncell:B23:b::2::2:l:3:f:10\ncell:C23:b:1:1::1:f:2:cf:2:colspan:3\ncell:D23:b:1:1:::l:3:f:10:cf:2:colspan:2:rowspan:1\ncell:E23:t::b:2:2:2::l:1:f:10\ncell:F23:b:1:1:::f:2:ntvf:1\ncell:G23:b::2::2:l:3:f:10\ncell:A24:b::2:::l:3:f:10\ncell:B24:b::2::2:l:3:f:10:cf:2\ncell:C24:b::1::1:f:2:cf:2:colspan:3\ncell:D24:b::1:::l:1:f:10:colspan:2\ncell:E24:l:1:f:10\ncell:F24:b::1:::f:2:ntvf:1\ncell:G24:b::2::2:l:3:f:10\ncell:A25:b::2:::l:3:f:10\ncell:B25:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C25:b::1::1:f:2:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:2:ntvf:1\ncell:G25:b::2::2:l:3:f:10\ncell:A26:b::2:::l:3:f:10\ncell:B26:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C26:b::1::1:f:2:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:2:ntvf:1\ncell:G26:b::2::2:l:3:f:10\ncell:A27:b::2:::l:3:f:10\ncell:B27:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C27:b::1::1:f:2:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:2:ntvf:1\ncell:G27:b::2::2:l:3:f:10\ncell:A28:b::2:::l:3:f:10\ncell:B28:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C28:b::1::1:f:2:cf:2:colspan:3\ncell:D28:b::1:::colspan:2\ncell:F28:b::1:::f:2:ntvf:1\ncell:G28:b::2::2:l:3:f:10\ncell:A29:b::2:::l:3:f:10\ncell:B29:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C29:b::1::1:f:2:cf:2:colspan:3\ncell:D29:b::1:::colspan:2\ncell:F29:b::1:::f:2:ntvf:1\ncell:G29:b::2::2:l:3:f:10\ncell:A30:b::2:::l:3:f:10\ncell:B30:b::2::2:l:3:f:10:cf:2\ncell:C30:b::1::1:f:2:cf:2:colspan:3\ncell:D30:b::1:::colspan:2\ncell:F30:b::1:::f:2:ntvf:1\ncell:G30:b::2::2:l:3:f:10\ncell:A31:b::2:::l:3:f:10\ncell:B31:b::2::2:l:3:f:10:cf:2\ncell:C31:b::1::1:f:2:cf:2:colspan:3\ncell:D31:b::1:::colspan:2\ncell:F31:b::1:::f:2:ntvf:1\ncell:G31:b::2::2:l:3:f:10\ncell:A32:b::2:::l:3:f:10\ncell:B32:b::2::2:l:3:f:10:cf:2\ncell:C32:b::1::1:f:2:cf:2:colspan:3\ncell:D32:b::1:::colspan:2\ncell:F32:b::1:::f:2:ntvf:1\ncell:G32:b::2::2:l:3:f:10\ncell:A33:b::2:::l:3:f:10\ncell:B33:b::2::2:l:3:f:10:cf:2\ncell:C33:b::1::1:f:2:cf:2:colspan:3\ncell:D33:b::1:::colspan:2\ncell:F33:b::1:::f:2:ntvf:1\ncell:G33:b::2::2:l:3:f:10\ncell:A34:b::2:::l:3:f:10\ncell:B34:b::2::2:l:3:f:10:cf:2\ncell:C34:b::1::1:f:2:cf:2:colspan:3\ncell:D34:b::1:::colspan:2\ncell:F34:b::1:::f:2:ntvf:1\ncell:G34:b::2::2:l:3:f:10\ncell:A35:b::2:::l:3:f:7\ncell:B35:b::2::2:l:3:f:10:cf:2\ncell:C35:b::1:1:1:f:2:cf:2:colspan:3\ncell:D35:b::1:1::l:3:f:10:cf:2:colspan:2\ncell:E35:b:::2::l:3:f:10:cf:2\ncell:F35:b::1:1::f:2:ntvf:1\ncell:G35:b::2::2:l:3:f:10\ncell:A36:b::2:::l:3:f:6\ncell:B36:b::2::2:l:3:f:6\ncell:C36:t:TOTAL:b:1:1:1:1:f:11:cf:2:colspan:3\ncell:D36:b:2::2::l:3:f:12:cf:2\ncell:E36:b:2:2:2::l:3:f:12:cf:2\ncell:F36:vtf:n:0:SUM(F23\\cF35):b:1:1:1::f:11:ntvf:1\ncell:G36:b::2::2:l:3:f:7\ncell:A37:b::2:::l:3:f:10\ncell:B37:b::::2:l:3:f:6:cf:2\ncell:C37:b:2::::l:1:f:10\ncell:D37:b:2::::l:1:f:10\ncell:E37:b:2::::l:1:f:10\ncell:F37:b:2::::l:1:f:10\ncell:G37:b::2:::l:3:f:6\ncell:A38:b::2:::l:3:f:10\ncell:B38:b::::2:l:3:f:10\ncell:G38:b::2:::l:3:f:10\ncell:A39:b::2:::l:3:f:10\ncell:B39:b::::2:l:3:f:10:cf:2\ncell:C39:t:Thank you for your business:f:4:cf:1:colspan:4\ncell:D39:t:Thank you for your business:colspan:3\ncell:E39:t:Thank you for your business:f:3:colspan:2\ncell:F39:t::l:2:f:10\ncell:G39:b::2:::l:3:f:10\ncell:A40:b::2:::l:3:f:10\ncell:B40:b::::2:l:3:f:10\ncell:G40:b::2:::l:3:f:10\ncell:A41:b::2:::l:3:f:10\ncell:B41:b:::2:2:l:3:f:10\ncell:C41:b:::2::l:3:f:10\ncell:D41:b:::2::l:3:f:10\ncell:E41:b:::2::l:3:f:10\ncell:F41:b:::2::l:3:f:10\ncell:G41:b::2:2::l:3:f:10\ncell:B42:b:1:::\ncell:C42:b:1:::\ncell:D42:b:1:::\ncell:E42:b:1:::\ncell:F42:b:1:::\ncell:G42:b:1:::\ncol:A:w:10\ncol:B:w:10\ncol:C:w:62\ncol:D:w:73\ncol:E:w:15\ncol:F:w:68\ncol:G:w:10\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:15.75\nrow:36:h:15.75\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nsheet:c:7:r:42:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:* 9pt Trebuchet MS\nfont:3:italic bold * Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Arial\nfont:7:normal bold 12pt Arial\nfont:8:normal normal * *\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 11pt Trebuchet MS\nfont:12:normal normal 12pt Arial\nfont:13:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nlayout:4:padding:* * * 4px;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv1", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - "version:1.5\ncell:B2:t:INVOICE:l:1:f:9:cf:1:colspan:6\ncell:C2:t::l:2:f:13\ncell:D2:t::l:2:f:13\ncell:E2:l:1:f:10:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:8:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:13\ncell:B3:f:6:cf:2:colspan:4\ncell:C3:t::l:2:f:13\ncell:D3:t::l:2:f:13\ncell:F3:l:1:f:7:cf:2\ncell:G3:l:1:f:14:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:14:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:14:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:3:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:7:cf:2:colspan:2\ncell:G5:l:1:f:14:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:7:cf:2:colspan:2\ncell:G6:l:1:f:14:cf:2\ncell:B7:t:FROM\\c:f:12\ncell:F7:l:1:f:7:cf:2:tvf:4:colspan:2:rowspan:6\ncell:G7:l:1:f:14:cf:2\ncell:B8:t:[Company Name]:f:3:colspan:4\ncell:F8:l:1:f:7:cf:2:colspan:2\ncell:G8:l:1:f:14:cf:2\ncell:B9:t:[Street Address]:f:1:cf:2:colspan:4\ncell:F9:l:1:f:7\ncell:G9:l:1:f:14:cf:1\ncell:B10:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:G10:l:1:f:13\ncell:B11:t:Phone\\c :f:1:cf:2:colspan:4\ncell:B12:t:Email\\c:f:1:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:11:cf:2\ncell:B15:t:[Name]:f:1:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:1:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:1:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:1:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:1:cf:2:colspan:6\ncell:B20:t:Email\\c:f:1:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:14:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:13\ncell:D22:t::l:2:f:13\ncell:E22:t::l:2:f:13\ncell:F22:t::l:2:f:13\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:14:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:b:1:1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:4\ncell:D23:t::l:2:f:4\ncell:E23:t::l:2:f:4\ncell:F23:t::b::2:::l:1:f:4\ncell:G23:b::1::1:f:4:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:4\ncell:D24:t::l:2:f:4\ncell:E24:t::l:2:f:4\ncell:F24:t::b::2:::l:1:f:4\ncell:G24:b::1::1:f:4:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:4\ncell:D25:t::l:2:f:4\ncell:E25:t::l:2:f:4\ncell:F25:t::b::2:::l:1:f:4\ncell:G25:b::1::1:f:4:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:4\ncell:D26:t::l:2:f:4\ncell:E26:t::l:2:f:4\ncell:F26:t::b::2:::l:1:f:4\ncell:G26:b::1::1:f:4:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:4\ncell:D27:t::l:2:f:4\ncell:E27:t::l:2:f:4\ncell:F27:t::b::2:::l:1:f:4\ncell:G27:b::1::1:f:4:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:4\ncell:D28:t::l:2:f:4\ncell:E28:t::l:2:f:4\ncell:F28:t::b::2:::l:1:f:4\ncell:G28:b::1::1:f:4:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:4\ncell:D29:t::l:2:f:4\ncell:E29:t::l:2:f:4\ncell:F29:t::b::2:::l:1:f:4\ncell:G29:b::1::1:f:4:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:4\ncell:D30:t::l:2:f:4\ncell:E30:t::l:2:f:4\ncell:F30:t::b::2:::l:1:f:4\ncell:G30:b::1::1:f:4:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:4\ncell:D31:t::l:2:f:4\ncell:E31:t::l:2:f:4\ncell:F31:t::b::2:::l:1:f:4\ncell:G31:b::1::1:f:4:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:4\ncell:D32:t::l:2:f:4\ncell:E32:t::l:2:f:4\ncell:F32:t::b::2:::l:1:f:4\ncell:G32:b::1::1:f:4:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C33:t::l:2:f:4\ncell:D33:t::l:2:f:4\ncell:E33:t::l:2:f:4\ncell:F33:t::b::2:::l:1:f:4\ncell:G33:b::1::1:f:4:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C34:l:2:f:4\ncell:D34:l:2:f:4\ncell:E34:l:2:f:4\ncell:F34:b::2:::l:1:f:4\ncell:G34:b::1::1:f:4:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:f:4:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:4\ncell:D35:t::b:::2::l:1:f:4\ncell:E35:t::b:::2::l:1:f:4\ncell:F35:t::b::2:2::l:1:f:4\ncell:G35:b::1:1:1:f:4:ntvf:1\ncell:B36:b:2::::l:1:f:13\ncell:C36:b:2::::l:1:f:13\ncell:D36:b:2::::l:1:f:13\ncell:E36:b:2::::l:1:f:14\ncell:F36:t:Subtotal:b:2::::l:1:f:11\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:11:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:14:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:13\ncell:D37:t::b:::2::l:1:f:13\ncell:F37:t:Tax Rate:l:1:f:11\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:13\ncell:D38:t::b:2::::l:1:f:13\ncell:F38:t:Tax:l:1:f:11\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:13\ncell:D39:t::l:2:f:13\ncell:F39:t:Other:b:::1::l:1:f:11\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:13\ncell:D40:t::l:2:f:13\ncell:F40:t:TOTAL:b:1::::l:1:f:14\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:11:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:5:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:13\ncell:D43:t::l:2:f:13\ncell:E43:t::l:2:f:13\ncell:F43:t::l:2:f:13\ncell:G43:t::l:2:f:13\ncol:A:w:10\ncol:B:w:90\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:45\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 10pt Trebuchet MS\nfont:4:* 9pt Trebuchet MS\nfont:5:italic bold 10pt Trebuchet MS\nfont:6:italic normal * Trebuchet MS\nfont:7:normal bold 10pt Trebuchet MS\nfont:8:normal bold 14pt Trebuchet MS\nfont:9:normal bold 16pt Trebuchet MS\nfont:10:normal bold 28pt Trebuchet MS\nfont:11:normal normal * Trebuchet MS\nfont:12:normal normal 10pt *\nfont:13:normal normal 10pt Arial\nfont:14:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv2", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - 'version:1.5\ncell:B2:t:INVOICE:l:1:f:12:cf:1:colspan:6\ncell:C2:t::l:2:f:10\ncell:D2:t::l:2:f:10\ncell:E2:l:1:f:8:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:10\ncell:B3:f:5:cf:2:colspan:4\ncell:C3:t::l:2:f:10\ncell:D3:t::l:2:f:10\ncell:F3:l:1:f:6:cf:2\ncell:G3:l:1:f:11:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:11:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:11:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:9:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:6:cf:2:colspan:2\ncell:G5:l:1:f:11:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:6:cf:2:colspan:2\ncell:G6:l:1:f:11:cf:2\ncell:B7:t:FROM\\c:f:11\ncell:F7:l:1:f:6:cf:2:colspan:2\ncell:G7:l:1:f:11:cf:2\ncell:B8:t:[Company Name]:f:9:colspan:4\ncell:F8:l:1:f:6:cf:2:tvf:4:colspan:2:rowspan:5\ncell:G8:l:1:f:11:cf:2\ncell:B9:t:[Street Address]:f:9:cf:2:colspan:4\ncell:F9:l:1:f:6\ncell:G9:l:1:f:11:cf:1\ncell:B10:t:[City, State, Zip]:f:9:cf:2:colspan:4\ncell:G10:l:1:f:10\ncell:B11:t:Phone\\c :f:9:cf:2:colspan:4\ncell:B12:t:Email\\c:f:9:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:9:cf:2\ncell:B15:t:[Name]:f:9:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:9:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:9:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:9:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:9:cf:2:colspan:6\ncell:B20:t:Email\\c:f:9:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:11:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:10\ncell:D22:t::l:2:f:10\ncell:E22:t::l:2:f:10\ncell:F22:t::l:2:f:10\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:11:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), sheet7!B6, inv3!B6)):b:1:1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:3\ncell:D23:t::l:2:f:3\ncell:E23:t::l:2:f:3\ncell:F23:t::b::2:::l:1:f:3\ncell:G23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), (sheet7!E6*sheet7!F6), (inv3!E6*inv3!F6))):b::1::1:f:3:ntvf:1\ncell:A24:b::1::\ncell:B24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), SHEET7!B7, INV3!B7)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:3\ncell:D24:t::l:2:f:3\ncell:E24:t::l:2:f:3\ncell:F24:t::b::2:::l:1:f:3\ncell:G24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), (SHEET7!E7*SHEET7!F7), (INV3!E7*INV3!F7))):b::1::1:f:3:ntvf:1\ncell:A25:b::1::\ncell:B25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), SHEET7!B8, INV3!B8)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:3\ncell:D25:t::l:2:f:3\ncell:E25:t::l:2:f:3\ncell:F25:t::b::2:::l:1:f:3\ncell:G25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), (SHEET7!E8*SHEET7!F8), (INV3!E8*INV3!F8))):b::1::1:f:3:ntvf:1\ncell:A26:b::1::\ncell:B26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), SHEET7!B9, INV3!B9)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:3\ncell:D26:t::l:2:f:3\ncell:E26:t::l:2:f:3\ncell:F26:t::b::2:::l:1:f:3\ncell:G26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), (SHEET7!E9*SHEET7!F9), (INV3!E9*INV3!F9))):b::1::1:f:3:ntvf:1\ncell:A27:b::1::\ncell:B27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), SHEET7!B10, INV3!B10)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:3\ncell:D27:t::l:2:f:3\ncell:E27:t::l:2:f:3\ncell:F27:t::b::2:::l:1:f:3\ncell:G27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), (SHEET7!E10*SHEET7!F10), (INV3!E10*INV3!F10))):b::1::1:f:3:ntvf:1\ncell:A28:b::1::\ncell:B28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), SHEET7!B11, INV3!B11)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:3\ncell:D28:t::l:2:f:3\ncell:E28:t::l:2:f:3\ncell:F28:t::b::2:::l:1:f:3\ncell:G28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), (SHEET7!E11*SHEET7!F11), (INV3!E11*INV3!F11))):b::1::1:f:3:ntvf:1\ncell:A29:b::1::\ncell:B29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), SHEET7!B12, INV3!B12)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:3\ncell:D29:t::l:2:f:3\ncell:E29:t::l:2:f:3\ncell:F29:t::b::2:::l:1:f:3\ncell:G29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), (SHEET7!E12*SHEET7!F12), (INV3!E12*INV3!F12))):b::1::1:f:3:ntvf:1\ncell:A30:b::1::\ncell:B30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), SHEET7!B13, INV3!B13)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:3\ncell:D30:t::l:2:f:3\ncell:E30:t::l:2:f:3\ncell:F30:t::b::2:::l:1:f:3\ncell:G30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), (SHEET7!E13*SHEET7!F13), (INV3!E13*INV3!F13))):b::1::1:f:3:ntvf:1\ncell:A31:b::1::\ncell:B31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), SHEET7!B14, INV3!B14)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:3\ncell:D31:t::l:2:f:3\ncell:E31:t::l:2:f:3\ncell:F31:t::b::2:::l:1:f:3\ncell:G31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), (SHEET7!E14*SHEET7!F14), (INV3!E14*INV3!F14))):b::1::1:f:3:ntvf:1\ncell:A32:b::1::\ncell:B32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), SHEET7!B15, INV3!B15)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:3\ncell:D32:t::l:2:f:3\ncell:E32:t::l:2:f:3\ncell:F32:t::b::2:::l:1:f:3\ncell:G32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), (SHEET7!E15*SHEET7!F15), (INV3!E15*INV3!F15))):b::1::1:f:3:ntvf:1\ncell:A33:b::1::\ncell:B33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), SHEET7!B16, INV3!B16)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C33:l:2:f:3\ncell:D33:l:2:f:3\ncell:E33:l:2:f:3\ncell:F33:b::2:::l:1:f:3\ncell:G33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), (SHEET7!E16*SHEET7!F16), (INV3!E16*INV3!F16))):b::1::1:f:3:ntvf:1\ncell:A34:b::1::\ncell:B34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), SHEET7!B17, INV3!B17)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C34:t::l:2:f:3\ncell:D34:t::l:2:f:3\ncell:E34:t::l:2:f:3\ncell:F34:t::b::2:::l:1:f:3\ncell:G34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), (SHEET7!E17*SHEET7!F17), (INV3!E17*INV3!F17))):b::1::1:f:3:ntvf:1\ncell:A35:b::1::\ncell:B35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), SHEET7!B18, INV3!B18)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:3\ncell:D35:t::b:::2::l:1:f:3\ncell:E35:t::b:::2::l:1:f:3\ncell:F35:t::b::2:2::l:1:f:3\ncell:G35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), (SHEET7!E18*SHEET7!F18), (INV3!E18*INV3!F18))):b::1::1:f:3:ntvf:1\ncell:B36:b:2::::l:1:f:10\ncell:C36:b:2::::l:1:f:10\ncell:D36:b:2::::l:1:f:10\ncell:E36:b:2::::l:1:f:11\ncell:F36:t:Subtotal:b:2::::l:1:f:9\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:9:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:11:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:10\ncell:D37:t::b:::2::l:1:f:10\ncell:F37:t:Tax Rate:l:1:f:9\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:10\ncell:D38:t::b:2::::l:1:f:10\ncell:F38:t:Tax:l:1:f:9\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:10\ncell:D39:t::l:2:f:10\ncell:F39:t:Other:b:::1::l:1:f:9\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:10\ncell:D40:t::l:2:f:10\ncell:F40:t:TOTAL:b:1::::l:1:f:11\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:9:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:4:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:10\ncell:D43:t::l:2:f:10\ncell:E43:t::l:2:f:10\ncell:F43:t::l:2:f:10\ncell:G43:t::l:2:f:10\ncol:A:w:10\ncol:B:w:65\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:53\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 9pt Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:italic normal * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 14pt Trebuchet MS\nfont:8:normal bold 28pt Trebuchet MS\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 10pt Trebuchet MS\nfont:12:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "sheet6", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Hours:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Rate:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "inv3", - hidden: "0", - }, - sheet5: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Qty.:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Price:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "sheet7", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "inv1!B2": true, - "inv1!C5": true, - "inv1!C6": true, - "inv1!C7": true, - "inv1!C8": true, - "inv1!C9": true, - "inv1!C11": true, - "inv1!C12": true, - "inv1!C13": true, - "inv1!C14": true, - "inv1!C15": true, - "inv1!C16": true, - "inv1!C18": true, - "inv1!C20": true, - "inv1!D20": true, - "inv1!C23": true, - "inv1!C24": true, - "inv1!C25": true, - "inv1!C26": true, - "inv1!C27": true, - "inv1!C28": true, - "inv1!C29": true, - "inv1!C30": true, - "inv1!C31": true, - "inv1!C32": true, - "inv1!C33": true, - "inv1!C34": true, - "inv1!C35": true, - "inv1!F23": true, - "inv1!F24": true, - "inv1!F25": true, - "inv1!F26": true, - "inv1!F27": true, - "inv1!F28": true, - "inv1!F29": true, - "inv1!F30": true, - "inv1!F31": true, - "inv1!F32": true, - "inv1!F33": true, - "inv1!F34": true, - "inv1!F35": true, - "inv2!B2": true, - "inv2!F4": true, - "inv2!G4": true, - "inv2!B5": true, - "inv2!B7": true, - "inv2!B8": true, - "inv2!B9": true, - "inv2!B10": true, - "inv2!B11": true, - "inv2!B12": true, - "inv2!B14": true, - "inv2!B15": true, - "inv2!B16": true, - "inv2!B17": true, - "inv2!B18": true, - "inv2!B19": true, - "inv2!B20": true, - "inv2!B23": true, - "inv2!B24": true, - "inv2!B25": true, - "inv2!B26": true, - "inv2!B27": true, - "inv2!B28": true, - "inv2!B29": true, - "inv2!B30": true, - "inv2!B31": true, - "inv2!B32": true, - "inv2!B33": true, - "inv2!B34": true, - "inv2!B35": true, - "inv2!G23": true, - "inv2!G24": true, - "inv2!G25": true, - "inv2!G26": true, - "inv2!G27": true, - "inv2!G28": true, - "inv2!G29": true, - "inv2!G30": true, - "inv2!G31": true, - "inv2!G32": true, - "inv2!G33": true, - "inv2!G34": true, - "inv2!G35": true, - "inv2!B38": true, - "inv2!B39": true, - "inv2!B40": true, - "inv2!F36": true, - "inv2!G37": true, - "inv2!F37": true, - "inv2!F39": true, - "inv2!G39": true, - "inv2!F38": true, - "sheet6!B2": true, - "sheet6!F4": true, - "sheet6!G4": true, - "sheet6!B5": true, - "sheet6!B7": true, - "sheet6!B8": true, - "sheet6!B9": true, - "sheet6!B10": true, - "sheet6!B11": true, - "sheet6!B12": true, - "sheet6!B14": true, - "sheet6!B15": true, - "sheet6!B16": true, - "sheet6!B17": true, - "sheet6!B18": true, - "sheet6!B19": true, - "sheet6!B20": true, - "sheet6!B38": true, - "sheet6!B39": true, - "sheet6!B40": true, - "sheet6!F36": true, - "sheet6!G37": true, - "sheet6!F37": true, - "sheet6!F39": true, - "sheet6!G39": true, - "sheet6!F38": true, - "inv3!B2": true, - "inv3!B6": true, - "inv3!B7": true, - "inv3!B8": true, - "inv3!B9": true, - "inv3!B10": true, - "inv3!B11": true, - "inv3!B12": true, - "inv3!B13": true, - "inv3!B14": true, - "inv3!B15": true, - "inv3!B16": true, - "inv3!B17": true, - "inv3!B18": true, - "inv3!E6": true, - "inv3!E7": true, - "inv3!E8": true, - "inv3!E9": true, - "inv3!E10": true, - "inv3!E11": true, - "inv3!E12": true, - "inv3!E13": true, - "inv3!E14": true, - "inv3!E15": true, - "inv3!E16": true, - "inv3!E17": true, - "inv3!E18": true, - "inv3!F6": true, - "inv3!F7": true, - "inv3!F8": true, - "inv3!F9": true, - "inv3!F10": true, - "inv3!F11": true, - "inv3!F12": true, - "inv3!F13": true, - "inv3!F14": true, - "inv3!F15": true, - "inv3!F16": true, - "inv3!F17": true, - "inv3!F18": true, - "sheet7!F6": true, - "sheet7!F7": true, - "sheet7!F8": true, - "sheet7!F9": true, - "sheet7!F10": true, - "sheet7!F11": true, - "sheet7!F12": true, - "sheet7!F13": true, - "sheet7!F14": true, - "sheet7!F15": true, - "sheet7!F16": true, - "sheet7!F17": true, - "sheet7!F18": true, - "sheet7!E6": true, - "sheet7!E7": true, - "sheet7!E8": true, - "sheet7!E9": true, - "sheet7!E10": true, - "sheet7!E11": true, - "sheet7!E12": true, - "sheet7!E13": true, - "sheet7!E14": true, - "sheet7!E15": true, - "sheet7!E16": true, - "sheet7!E17": true, - "sheet7!E18": true, - "sheet7!B6": true, - "sheet7!B2": true, - "sheet7!B7": true, - "sheet7!B8": true, - "sheet7!B9": true, - "sheet7!B10": true, - "sheet7!B11": true, - "sheet7!B12": true, - "sheet7!B13": true, - "sheet7!B14": true, - "sheet7!B15": true, - "sheet7!B16": true, - "sheet7!B17": true, - "sheet7!B18": true, - "inv1!D8": true, - "inv1!D15": true, - "inv1!D18": true, - "inv2!C5": true, - "sheet6!C5": true, - }, - constraints: { - "inv1!C5": ["prompttext", "0", "1e10", "Name"], - "inv1!C6": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C7": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C8": ["prompttext", "0", "1e10", "Phone"], - "inv1!C9": ["promptemail", "0", "1e10", "Email"], - "inv1!C11": ["prompttext", "0", "1e10", "From"], - "inv1!C12": ["prompttext", "0", "1e10", "Name"], - "inv1!C13": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C14": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C15": ["prompttext", "0", "1e10", "Phone"], - "inv1!C16": ["promptemail", "0", "1e10", "Email"], - "inv1!C18": ["prompttext", "0", "1e10", "Invoice #"], - "inv1!C20": ["prompttext", "0", "1e10", "Date"], - "inv1!D20": ["prompttext", "0", "1e10", "Date"], - "inv1!C23": ["prompttext", "0", "1e10", "Description"], - "inv1!C24": ["prompttext", "0", "1e10", "Description"], - "inv1!C25": ["prompttext", "0", "1e10", "Description"], - "inv1!C26": ["prompttext", "0", "1e10", "Description"], - "inv1!C27": ["prompttext", "0", "1e10", "Description"], - "inv1!C28": ["prompttext", "0", "1e10", "Description"], - "inv1!C29": ["prompttext", "0", "1e10", "Description"], - "inv1!C30": ["prompttext", "0", "1e10", "Description"], - "inv1!C31": ["prompttext", "0", "1e10", "Description"], - "inv1!C32": ["prompttext", "0", "1e10", "Description"], - "inv1!C33": ["prompttext", "0", "1e10", "Description"], - "inv1!C34": ["prompttext", "0", "1e10", "Description"], - "inv1!C35": ["prompttext", "0", "1e10", "Description"], - "inv1!F23": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F24": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F25": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F26": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F27": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F28": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F29": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F30": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F31": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F32": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F33": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F34": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B2": ["prompttext", "0", "1e10", "Invoice"], - "inv2!F4": ["prompttext", "0", "1e10", "Date"], - "inv2!G4": ["prompttext", "0", "1e10", "Date"], - "inv2!B5": ["prompttext", "0", "1e10", "Invoice #"], - "inv2!B7": ["prompttext", "0", "1e10", "From"], - "inv2!B8": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B9": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B11": ["prompttext", "0", "1e10", "Phone"], - "inv2!B12": ["promptemail", "0", "1e10", "Email"], - "inv2!B14": ["prompttext", "0", "1e10", "Bill To"], - "inv2!B15": ["prompttext", "0", "1e10", "Name"], - "inv2!B16": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B17": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B19": ["prompttext", "0", "1e10", "Phone"], - "inv2!B20": ["promptemail", "0", "1e10", "Email"], - "inv2!B23": ["prompttext", "0", "1e10", "Description"], - "inv2!B24": ["prompttext", "0", "1e10", "Description"], - "inv2!B25": ["prompttext", "0", "1e10", "Description"], - "inv2!B26": ["prompttext", "0", "1e10", "Description"], - "inv2!B27": ["prompttext", "0", "1e10", "Description"], - "inv2!B28": ["prompttext", "0", "1e10", "Description"], - "inv2!B29": ["prompttext", "0", "1e10", "Description"], - "inv2!B30": ["prompttext", "0", "1e10", "Description"], - "inv2!B31": ["prompttext", "0", "1e10", "Description"], - "inv2!B32": ["prompttext", "0", "1e10", "Description"], - "inv2!B33": ["prompttext", "0", "1e10", "Description"], - "inv2!B34": ["prompttext", "0", "1e10", "Description"], - "inv2!B35": ["prompttext", "0", "1e10", "Description"], - "inv2!G23": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G24": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G25": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G26": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G27": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G28": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G29": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G30": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G31": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G32": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G33": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G34": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B38": ["prompttext", "0", "1e10", "Notes"], - "inv2!B39": ["prompttext", "0", "1e10", "Notes"], - "inv2!B40": ["prompttext", "0", "1e10", "Notes"], - "inv2!F36": ["prompttext", "0", "1e10", "Subtotal"], - "inv2!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "inv2!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "inv2!F39": ["prompttext", "0", "1e10", "Other"], - "inv2!G39": ["promptdecimal", "0", "1e10", "Other"], - "inv2!F38": ["prompttext", "0", "1e10", "Tax"], - "sheet6!B2": ["prompttext", "0", "1e10", "Invoice"], - "sheet6!F4": ["prompttext", "0", "1e10", "Date"], - "sheet6!G4": ["prompttext", "0", "1e10", "Date"], - "sheet6!B5": ["prompttext", "0", "1e10", "Invoice #"], - "sheet6!B7": ["prompttext", "0", "1e10", "From"], - "sheet6!B8": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B9": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B11": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B12": ["promptemail", "0", "1e10", "Email"], - "sheet6!B14": ["prompttext", "0", "1e10", "Bill To"], - "sheet6!B15": ["prompttext", "0", "1e10", "Name"], - "sheet6!B16": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B17": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B19": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B20": ["promptemail", "0", "1e10", "Email"], - "sheet6!B38": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B39": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B40": ["prompttext", "0", "1e10", "Notes"], - "sheet6!F36": ["prompttext", "0", "1e10", "Subtotal"], - "sheet6!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "sheet6!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "sheet6!F39": ["prompttext", "0", "1e10", "Other"], - "sheet6!G39": ["promptdecimal", "0", "1e10", "Other"], - "sheet6!F38": ["prompttext", "0", "1e10", "Tax"], - "inv3!B6": ["prompttext", "0", "1e10", "Description"], - "inv3!B7": ["prompttext", "0", "1e10", "Description"], - "inv3!B8": ["prompttext", "0", "1e10", "Description"], - "inv3!B9": ["prompttext", "0", "1e10", "Description"], - "inv3!B10": ["prompttext", "0", "1e10", "Description"], - "inv3!B11": ["prompttext", "0", "1e10", "Description"], - "inv3!B12": ["prompttext", "0", "1e10", "Description"], - "inv3!B13": ["prompttext", "0", "1e10", "Description"], - "inv3!B14": ["prompttext", "0", "1e10", "Description"], - "inv3!B15": ["prompttext", "0", "1e10", "Description"], - "inv3!B16": ["prompttext", "0", "1e10", "Description"], - "inv3!B17": ["prompttext", "0", "1e10", "Description"], - "inv3!B18": ["prompttext", "0", "1e10", "Description"], - "sheet7!B6": ["prompttext", "0", "1e10", "Description"], - "sheet7!B7": ["prompttext", "0", "1e10", "Description"], - "sheet7!B8": ["prompttext", "0", "1e10", "Description"], - "sheet7!B9": ["prompttext", "0", "1e10", "Description"], - "sheet7!B10": ["prompttext", "0", "1e10", "Description"], - "sheet7!B11": ["prompttext", "0", "1e10", "Description"], - "sheet7!B12": ["prompttext", "0", "1e10", "Description"], - "sheet7!B13": ["prompttext", "0", "1e10", "Description"], - "sheet7!B14": ["prompttext", "0", "1e10", "Description"], - "sheet7!B15": ["prompttext", "0", "1e10", "Description"], - "sheet7!B16": ["prompttext", "0", "1e10", "Description"], - "sheet7!B17": ["prompttext", "0", "1e10", "Description"], - "sheet7!B18": ["prompttext", "0", "1e10", "Description"], - "inv1!D8": ["prompttext", "0", "1e10", "Phone"], - "inv1!D15": ["prompttext", "0", "1e10", "Phone"], - "inv1!D18": ["promptnumeric", "0", "1e10", "Invoice#"], - "inv2!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet6!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet7!E6": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E7": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E8": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E9": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E10": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E11": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E12": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E13": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E14": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E15": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E16": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E17": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E18": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!F6": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F7": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F8": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F9": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F10": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F11": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F12": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F13": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F14": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F15": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F16": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F17": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F18": ["promptdecimal", "0", "1e10", "Price"], - "inv3!E6": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E7": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E8": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E9": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E10": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E11": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E12": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E13": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E14": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E15": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E16": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E17": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E18": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!F6": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F7": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F8": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F9": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F10": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F11": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F12": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F13": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F14": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F15": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F16": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F17": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F18": ["promptdecimal", "0", "1e10", "Rate"], - }, - }, - }, - footers: [ - { name: "Type1", index: 1, isActive: true }, - { name: "Type2", index: 2, isActive: false }, - { name: "Type3", index: 3, isActive: false }, - { name: "Detail1", index: 4, isActive: false }, - { name: "Detail2", index: 5, isActive: false }, - ], - }, - Android: { - msc: { - numsheets: 5, - currentid: "sheet1", - currentname: "inv1", - sheetArr: { - sheet1: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:10\ncell:C1:b:::2::l:1:f:10\ncell:D1:b:::2::l:1:f:10\ncell:E1:b:::2::l:1:f:10\ncell:F1:b:::2::l:1:f:10\ncell:G1:b:::2::l:1:f:10\ncell:A2:b::2:::l:1:f:10\ncell:B2:t:INVOICE:b:1:1:1:1:f:13:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:10\ncell:D2:t::b:2::2::l:1:f:10\ncell:E2:t::b:2::2::l:1:f:10\ncell:F2:t::b:2::2::l:1:f:10\ncell:G2:t::b:2::2::l:1:f:10\ncell:A3:b::2:::l:3:f:10\ncell:B3:b:2:::2:l:3:f:10\ncell:C3:b:2::::l:1:f:10\ncell:D3:b:2::::l:1:f:10\ncell:E3:b:2::::l:1:f:10\ncell:F3:b:2::::l:1:f:10\ncell:G3:b:2:2:::l:3:f:10\ncell:A4:b::2:::l:3:f:10\ncell:B4:b::::2:l:3:f:6\ncell:C4:t:BILL TO\\c:f:9:colspan:2\ncell:E4:f:5:cf:2\ncell:G4:b::2:::l:3:f:10\ncell:A5:b::2:::l:3:f:10\ncell:B5:b::::2:l:3:f:7\ncell:C5:t:[Name]:f:9:cf:2:colspan:3\ncell:E5:f:1:cf:2\ncell:F5:t::l:2:f:10:tvf:4:rowspan:6\ncell:G5:t::b::1:::l:2:f:10\ncell:A6:b::2:::l:3:f:10\ncell:B6:b::::2:l:3:f:7\ncell:C6:t:[Street Address]:f:9:cf:2:colspan:3\ncell:E6:f:1:cf:2\ncell:F6:l:2:f:10\ncell:G6:b::1:::l:2:f:10\ncell:A7:b::2:::l:3:f:10\ncell:B7:b::::2:l:3:f:7\ncell:C7:t:[City, State, Zip]:f:9:cf:2:colspan:3\ncell:E7:f:1:cf:2\ncell:G7:b::2:::l:3:f:10\ncell:A8:b::2:::l:3:f:10\ncell:B8:b::::2:l:3:f:7\ncell:C8:t:Phone\\c:f:9:cf:2:colspan:3\ncell:D8:f:8:cf:2\ncell:E8:f:1:cf:2\ncell:G8:b::2:::l:3:f:10\ncell:A9:b::2:::l:3:f:10\ncell:B9:b::::2:l:3:f:7\ncell:C9:t:Email\\c:f:9:cf:2:colspan:3\ncell:E9:f:1:cf:2\ncell:G9:b::2:::l:3:f:10\ncell:A10:b::2:::l:3:f:10\ncell:B10:b::::2:l:3:f:7\ncell:C10:colspan:2\ncell:G10:b::2:::l:3:f:10\ncell:A11:b::2:::l:3:f:10\ncell:B11:b::::2:l:3:f:7\ncell:C11:t:FROM\\c:f:9:colspan:2\ncell:E11:f:8:colspan:2\ncell:G11:b::2:::l:3:f:10\ncell:A12:b::2:::l:3:f:10\ncell:B12:b::::2:l:3:f:7\ncell:C12:t:[Name]:f:9:colspan:4\ncell:E12:colspan:2\ncell:G12:b::2:::l:3:f:10\ncell:A13:b::2:::l:3:f:10\ncell:B13:b::::2:l:3:f:7\ncell:C13:t:[Street Address]:f:9:colspan:4\ncell:E13:colspan:2\ncell:G13:b::2:::l:3:f:10\ncell:A14:b::2:::l:3:f:10\ncell:B14:b::::2:l:3:f:7\ncell:C14:t:[City, State, Zip]:f:9:colspan:4\ncell:E14:colspan:2\ncell:G14:b::2:::l:3:f:10\ncell:A15:b::2:::l:3:f:10\ncell:B15:b::::2:l:3:f:7\ncell:C15:t:Phone\\c:f:9:colspan:4\ncell:D15:f:8:cf:2:colspan:3\ncell:E15:colspan:2\ncell:G15:b::2:::l:3:f:10\ncell:A16:b::2:::l:3:f:10\ncell:B16:b::::2:l:3:f:7\ncell:C16:t:Email\\c:f:9:colspan:4\ncell:E16:colspan:2\ncell:G16:b::2:::l:3:f:10\ncell:A17:b::2:::l:3:f:10\ncell:B17:b::::2:l:3:f:6\ncell:G17:b::2:::l:3:f:10\ncell:A18:b::2:::l:3:f:10\ncell:B18:b::::2:l:3:f:10\ncell:C18:t:INVOICE #\\c:f:9:cf:2:colspan:4\ncell:D18:v:1:l:4:f:9:cf:2:colspan:3\ncell:G18:b::2:::l:3:f:10\ncell:A19:b::2:::l:3:f:10\ncell:B19:b::::2:l:3:f:10\ncell:G19:b::2:::l:3:f:10\ncell:A20:b::2:::l:3:f:10\ncell:B20:b::::2:l:3:f:10\ncell:C20:t:DATE\\c:f:9:cf:2\ncell:D20:vtf:nd:42081:TODAY():f:9:cf:2:ntvf:3:colspan:2\ncell:G20:b::2:::l:3:f:10\ncell:A21:b::2:::l:3:f:10\ncell:B21:b::::2:l:3:f:6:cf:2\ncell:C21:b:::2::l:1:f:10\ncell:D21:b:::2::l:3:f:6:cf:2\ncell:E21:b:::2::l:1:f:10\ncell:F21:b:::2::l:1:f:10\ncell:G21:b::2:::l:3:f:10\ncell:A22:b::2:::l:3:f:10\ncell:B22:b::2::2:l:3:f:10\ncell:C22:t:Description:b:1::1:1:f:9:cf:1:colspan:3\ncell:D22:t:Description:b:1::1::l:3:f:6:cf:2:colspan:2:rowspan:1\ncell:E22:t::b:2:2:2::l:1:f:10\ncell:F22:t:Amount:b:1:1:1:1:f:9:cf:1\ncell:G22:b::2::2:l:3:f:10\ncell:A23:b::2:::l:3:f:10\ncell:B23:b::2::2:l:3:f:10\ncell:C23:b:1:1::1:f:2:cf:2:colspan:3\ncell:D23:b:1:1:::l:3:f:10:cf:2:colspan:2:rowspan:1\ncell:E23:t::b:2:2:2::l:1:f:10\ncell:F23:b:1:1:::f:2:ntvf:1\ncell:G23:b::2::2:l:3:f:10\ncell:A24:b::2:::l:3:f:10\ncell:B24:b::2::2:l:3:f:10:cf:2\ncell:C24:b::1::1:f:2:cf:2:colspan:3\ncell:D24:b::1:::l:1:f:10:colspan:2\ncell:E24:l:1:f:10\ncell:F24:b::1:::f:2:ntvf:1\ncell:G24:b::2::2:l:3:f:10\ncell:A25:b::2:::l:3:f:10\ncell:B25:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C25:b::1::1:f:2:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:2:ntvf:1\ncell:G25:b::2::2:l:3:f:10\ncell:A26:b::2:::l:3:f:10\ncell:B26:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C26:b::1::1:f:2:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:2:ntvf:1\ncell:G26:b::2::2:l:3:f:10\ncell:A27:b::2:::l:3:f:10\ncell:B27:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C27:b::1::1:f:2:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:2:ntvf:1\ncell:G27:b::2::2:l:3:f:10\ncell:A28:b::2:::l:3:f:10\ncell:B28:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C28:b::1::1:f:2:cf:2:colspan:3\ncell:D28:b::1:::colspan:2\ncell:F28:b::1:::f:2:ntvf:1\ncell:G28:b::2::2:l:3:f:10\ncell:A29:b::2:::l:3:f:10\ncell:B29:b::2::2:l:3:f:10:cf:2:ntvf:2\ncell:C29:b::1::1:f:2:cf:2:colspan:3\ncell:D29:b::1:::colspan:2\ncell:F29:b::1:::f:2:ntvf:1\ncell:G29:b::2::2:l:3:f:10\ncell:A30:b::2:::l:3:f:10\ncell:B30:b::2::2:l:3:f:10:cf:2\ncell:C30:b::1::1:f:2:cf:2:colspan:3\ncell:D30:b::1:::colspan:2\ncell:F30:b::1:::f:2:ntvf:1\ncell:G30:b::2::2:l:3:f:10\ncell:A31:b::2:::l:3:f:10\ncell:B31:b::2::2:l:3:f:10:cf:2\ncell:C31:b::1::1:f:2:cf:2:colspan:3\ncell:D31:b::1:::colspan:2\ncell:F31:b::1:::f:2:ntvf:1\ncell:G31:b::2::2:l:3:f:10\ncell:A32:b::2:::l:3:f:10\ncell:B32:b::2::2:l:3:f:10:cf:2\ncell:C32:b::1::1:f:2:cf:2:colspan:3\ncell:D32:b::1:::colspan:2\ncell:F32:b::1:::f:2:ntvf:1\ncell:G32:b::2::2:l:3:f:10\ncell:A33:b::2:::l:3:f:10\ncell:B33:b::2::2:l:3:f:10:cf:2\ncell:C33:b::1::1:f:2:cf:2:colspan:3\ncell:D33:b::1:::colspan:2\ncell:F33:b::1:::f:2:ntvf:1\ncell:G33:b::2::2:l:3:f:10\ncell:A34:b::2:::l:3:f:10\ncell:B34:b::2::2:l:3:f:10:cf:2\ncell:C34:b::1::1:f:2:cf:2:colspan:3\ncell:D34:b::1:::colspan:2\ncell:F34:b::1:::f:2:ntvf:1\ncell:G34:b::2::2:l:3:f:10\ncell:A35:b::2:::l:3:f:7\ncell:B35:b::2::2:l:3:f:10:cf:2\ncell:C35:b::1:1:1:f:2:cf:2:colspan:3\ncell:D35:b::1:1::l:3:f:10:cf:2:colspan:2\ncell:E35:b:::2::l:3:f:10:cf:2\ncell:F35:b::1:1::f:2:ntvf:1\ncell:G35:b::2::2:l:3:f:10\ncell:A36:b::2:::l:3:f:6\ncell:B36:b::2::2:l:3:f:6\ncell:C36:t:TOTAL:b:1:1:1:1:f:11:cf:2:colspan:3\ncell:D36:b:2::2::l:3:f:12:cf:2\ncell:E36:b:2:2:2::l:3:f:12:cf:2\ncell:F36:vtf:n:0:SUM(F23\\cF35):b:1:1:1::f:11:ntvf:1\ncell:G36:b::2::2:l:3:f:7\ncell:A37:b::2:::l:3:f:10\ncell:B37:b::::2:l:3:f:6:cf:2\ncell:C37:b:2::::l:1:f:10\ncell:D37:b:2::::l:1:f:10\ncell:E37:b:2::::l:1:f:10\ncell:F37:b:2::::l:1:f:10\ncell:G37:b::2:::l:3:f:6\ncell:A38:b::2:::l:3:f:10\ncell:B38:b::::2:l:3:f:10\ncell:G38:b::2:::l:3:f:10\ncell:A39:b::2:::l:3:f:10\ncell:B39:b::::2:l:3:f:10:cf:2\ncell:C39:t:Thank you for your business:f:4:cf:1:colspan:4\ncell:D39:t:Thank you for your business:colspan:3\ncell:E39:t:Thank you for your business:f:3:colspan:2\ncell:F39:t::l:2:f:10\ncell:G39:b::2:::l:3:f:10\ncell:A40:b::2:::l:3:f:10\ncell:B40:b::::2:l:3:f:10\ncell:G40:b::2:::l:3:f:10\ncell:A41:b::2:::l:3:f:10\ncell:B41:b:::2:2:l:3:f:10\ncell:C41:b:::2::l:3:f:10\ncell:D41:b:::2::l:3:f:10\ncell:E41:b:::2::l:3:f:10\ncell:F41:b:::2::l:3:f:10\ncell:G41:b::2:2::l:3:f:10\ncell:B42:b:1:::\ncell:C42:b:1:::\ncell:D42:b:1:::\ncell:E42:b:1:::\ncell:F42:b:1:::\ncell:G42:b:1:::\ncol:A:w:10\ncol:B:w:10\ncol:C:w:62\ncol:D:w:73\ncol:E:w:15\ncol:F:w:68\ncol:G:w:10\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:15.75\nrow:36:h:15.75\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nsheet:c:7:r:42:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:* 9pt Trebuchet MS\nfont:3:italic bold * Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Arial\nfont:7:normal bold 12pt Arial\nfont:8:normal normal * *\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 11pt Trebuchet MS\nfont:12:normal normal 12pt Arial\nfont:13:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nlayout:4:padding:* * * 4px;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv1", - hidden: "0", - }, - sheet2: { - sheetstr: { - savestr: - "version:1.5\ncell:B2:t:INVOICE:l:1:f:9:cf:1:colspan:6\ncell:C2:t::l:2:f:13\ncell:D2:t::l:2:f:13\ncell:E2:l:1:f:10:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:8:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:13\ncell:B3:f:6:cf:2:colspan:4\ncell:C3:t::l:2:f:13\ncell:D3:t::l:2:f:13\ncell:F3:l:1:f:7:cf:2\ncell:G3:l:1:f:14:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:14:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:14:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:3:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:7:cf:2:colspan:2\ncell:G5:l:1:f:14:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:7:cf:2:colspan:2\ncell:G6:l:1:f:14:cf:2\ncell:B7:t:FROM\\c:f:12\ncell:F7:l:1:f:7:cf:2:tvf:4:colspan:2:rowspan:6\ncell:G7:l:1:f:14:cf:2\ncell:B8:t:[Company Name]:f:3:colspan:4\ncell:F8:l:1:f:7:cf:2:colspan:2\ncell:G8:l:1:f:14:cf:2\ncell:B9:t:[Street Address]:f:1:cf:2:colspan:4\ncell:F9:l:1:f:7\ncell:G9:l:1:f:14:cf:1\ncell:B10:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:G10:l:1:f:13\ncell:B11:t:Phone\\c :f:1:cf:2:colspan:4\ncell:B12:t:Email\\c:f:1:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:11:cf:2\ncell:B15:t:[Name]:f:1:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:1:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:1:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:1:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:1:cf:2:colspan:6\ncell:B20:t:Email\\c:f:1:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:14:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:13\ncell:D22:t::l:2:f:13\ncell:E22:t::l:2:f:13\ncell:F22:t::l:2:f:13\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:14:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:b:1:1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:4\ncell:D23:t::l:2:f:4\ncell:E23:t::l:2:f:4\ncell:F23:t::b::2:::l:1:f:4\ncell:G23:b::1::1:f:4:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:4\ncell:D24:t::l:2:f:4\ncell:E24:t::l:2:f:4\ncell:F24:t::b::2:::l:1:f:4\ncell:G24:b::1::1:f:4:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:4\ncell:D25:t::l:2:f:4\ncell:E25:t::l:2:f:4\ncell:F25:t::b::2:::l:1:f:4\ncell:G25:b::1::1:f:4:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:4\ncell:D26:t::l:2:f:4\ncell:E26:t::l:2:f:4\ncell:F26:t::b::2:::l:1:f:4\ncell:G26:b::1::1:f:4:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:4\ncell:D27:t::l:2:f:4\ncell:E27:t::l:2:f:4\ncell:F27:t::b::2:::l:1:f:4\ncell:G27:b::1::1:f:4:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:4\ncell:D28:t::l:2:f:4\ncell:E28:t::l:2:f:4\ncell:F28:t::b::2:::l:1:f:4\ncell:G28:b::1::1:f:4:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:4\ncell:D29:t::l:2:f:4\ncell:E29:t::l:2:f:4\ncell:F29:t::b::2:::l:1:f:4\ncell:G29:b::1::1:f:4:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:4\ncell:D30:t::l:2:f:4\ncell:E30:t::l:2:f:4\ncell:F30:t::b::2:::l:1:f:4\ncell:G30:b::1::1:f:4:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:4\ncell:D31:t::l:2:f:4\ncell:E31:t::l:2:f:4\ncell:F31:t::b::2:::l:1:f:4\ncell:G31:b::1::1:f:4:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:4\ncell:D32:t::l:2:f:4\ncell:E32:t::l:2:f:4\ncell:F32:t::b::2:::l:1:f:4\ncell:G32:b::1::1:f:4:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C33:t::l:2:f:4\ncell:D33:t::l:2:f:4\ncell:E33:t::l:2:f:4\ncell:F33:t::b::2:::l:1:f:4\ncell:G33:b::1::1:f:4:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:f:4:cf:2:colspan:5:rowspan:1\ncell:C34:l:2:f:4\ncell:D34:l:2:f:4\ncell:E34:l:2:f:4\ncell:F34:b::2:::l:1:f:4\ncell:G34:b::1::1:f:4:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:f:4:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:4\ncell:D35:t::b:::2::l:1:f:4\ncell:E35:t::b:::2::l:1:f:4\ncell:F35:t::b::2:2::l:1:f:4\ncell:G35:b::1:1:1:f:4:ntvf:1\ncell:B36:b:2::::l:1:f:13\ncell:C36:b:2::::l:1:f:13\ncell:D36:b:2::::l:1:f:13\ncell:E36:b:2::::l:1:f:14\ncell:F36:t:Subtotal:b:2::::l:1:f:11\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:11:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:14:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:13\ncell:D37:t::b:::2::l:1:f:13\ncell:F37:t:Tax Rate:l:1:f:11\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:13\ncell:D38:t::b:2::::l:1:f:13\ncell:F38:t:Tax:l:1:f:11\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:13\ncell:D39:t::l:2:f:13\ncell:F39:t:Other:b:::1::l:1:f:11\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:13\ncell:D40:t::l:2:f:13\ncell:F40:t:TOTAL:b:1::::l:1:f:14\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:11:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:5:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:13\ncell:D43:t::l:2:f:13\ncell:E43:t::l:2:f:13\ncell:F43:t::l:2:f:13\ncell:G43:t::l:2:f:13\ncol:A:w:10\ncol:B:w:90\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:45\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 10pt Trebuchet MS\nfont:4:* 9pt Trebuchet MS\nfont:5:italic bold 10pt Trebuchet MS\nfont:6:italic normal * Trebuchet MS\nfont:7:normal bold 10pt Trebuchet MS\nfont:8:normal bold 14pt Trebuchet MS\nfont:9:normal bold 16pt Trebuchet MS\nfont:10:normal bold 28pt Trebuchet MS\nfont:11:normal normal * Trebuchet MS\nfont:12:normal normal 10pt *\nfont:13:normal normal 10pt Arial\nfont:14:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n", - }, - name: "inv2", - hidden: "0", - }, - sheet3: { - sheetstr: { - savestr: - 'version:1.5\ncell:B2:t:INVOICE:l:1:f:12:cf:1:colspan:6\ncell:C2:t::l:2:f:10\ncell:D2:t::l:2:f:10\ncell:E2:l:1:f:8:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:7:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:10\ncell:B3:f:5:cf:2:colspan:4\ncell:C3:t::l:2:f:10\ncell:D3:t::l:2:f:10\ncell:F3:l:1:f:6:cf:2\ncell:G3:l:1:f:11:cf:2:ntvf:3\ncell:B4:f:2:colspan:2\ncell:F4:t:DATE\\c:l:1:f:11:cf:2\ncell:G4:vtf:nd:42081:TODAY():l:1:f:11:cf:2:ntvf:3\ncell:B5:t:INVOICE #\\c:f:9:colspan:6\ncell:C5:cf:2:colspan:5\ncell:F5:l:1:f:6:cf:2:colspan:2\ncell:G5:l:1:f:11:cf:2\ncell:B6:f:2:colspan:2\ncell:F6:l:1:f:6:cf:2:colspan:2\ncell:G6:l:1:f:11:cf:2\ncell:B7:t:FROM\\c:f:11\ncell:F7:l:1:f:6:cf:2:colspan:2\ncell:G7:l:1:f:11:cf:2\ncell:B8:t:[Company Name]:f:9:colspan:4\ncell:F8:l:1:f:6:cf:2:tvf:4:colspan:2:rowspan:5\ncell:G8:l:1:f:11:cf:2\ncell:B9:t:[Street Address]:f:9:cf:2:colspan:4\ncell:F9:l:1:f:6\ncell:G9:l:1:f:11:cf:1\ncell:B10:t:[City, State, Zip]:f:9:cf:2:colspan:4\ncell:G10:l:1:f:10\ncell:B11:t:Phone\\c :f:9:cf:2:colspan:4\ncell:B12:t:Email\\c:f:9:cf:2:colspan:4\ncell:B13:colspan:2\ncell:B14:t:BILL TO\\c:f:9:cf:2\ncell:B15:t:[Name]:f:9:cf:2:colspan:6\ncell:B16:t:[Company Name]:f:9:cf:2:colspan:6\ncell:F16:t: \ncell:B17:t:[Street Address]:f:9:cf:2:colspan:6\ncell:B18:t:[City, State, Zip]:f:9:cf:2:colspan:6\ncell:B19:t:Phone\\c :f:9:cf:2:colspan:6\ncell:B20:t:Email\\c:f:9:cf:2:colspan:6\ncell:A22:b::1::\ncell:B22:t:DESCRIPTION:b:1:1:1:1:l:1:f:11:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C22:t::l:2:f:10\ncell:D22:t::l:2:f:10\ncell:E22:t::l:2:f:10\ncell:F22:t::l:2:f:10\ncell:G22:t:AMOUNT:b:1:1:1::l:1:f:11:c:1:bg:3:cf:1\ncell:A23:b::1::\ncell:B23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), sheet7!B6, inv3!B6)):b:1:1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:3\ncell:D23:t::l:2:f:3\ncell:E23:t::l:2:f:3\ncell:F23:t::b::2:::l:1:f:3\ncell:G23:vtf:t: :IF(AND(ISBLANK(inv3!B6),ISBLANK(sheet7!B6)), " ", IF(ISBLANK(inv3!B6), (sheet7!E6*sheet7!F6), (inv3!E6*inv3!F6))):b::1::1:f:3:ntvf:1\ncell:A24:b::1::\ncell:B24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), SHEET7!B7, INV3!B7)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:3\ncell:D24:t::l:2:f:3\ncell:E24:t::l:2:f:3\ncell:F24:t::b::2:::l:1:f:3\ncell:G24:vtf:t: :IF(AND(ISBLANK(INV3!B7),ISBLANK(SHEET7!B7)), " ", IF(ISBLANK(INV3!B7), (SHEET7!E7*SHEET7!F7), (INV3!E7*INV3!F7))):b::1::1:f:3:ntvf:1\ncell:A25:b::1::\ncell:B25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), SHEET7!B8, INV3!B8)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:3\ncell:D25:t::l:2:f:3\ncell:E25:t::l:2:f:3\ncell:F25:t::b::2:::l:1:f:3\ncell:G25:vtf:t: :IF(AND(ISBLANK(INV3!B8),ISBLANK(SHEET7!B8)), " ", IF(ISBLANK(INV3!B8), (SHEET7!E8*SHEET7!F8), (INV3!E8*INV3!F8))):b::1::1:f:3:ntvf:1\ncell:A26:b::1::\ncell:B26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), SHEET7!B9, INV3!B9)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:3\ncell:D26:t::l:2:f:3\ncell:E26:t::l:2:f:3\ncell:F26:t::b::2:::l:1:f:3\ncell:G26:vtf:t: :IF(AND(ISBLANK(INV3!B9),ISBLANK(SHEET7!B9)), " ", IF(ISBLANK(INV3!B9), (SHEET7!E9*SHEET7!F9), (INV3!E9*INV3!F9))):b::1::1:f:3:ntvf:1\ncell:A27:b::1::\ncell:B27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), SHEET7!B10, INV3!B10)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:3\ncell:D27:t::l:2:f:3\ncell:E27:t::l:2:f:3\ncell:F27:t::b::2:::l:1:f:3\ncell:G27:vtf:t: :IF(AND(ISBLANK(INV3!B10),ISBLANK(SHEET7!B10)), " ", IF(ISBLANK(INV3!B10), (SHEET7!E10*SHEET7!F10), (INV3!E10*INV3!F10))):b::1::1:f:3:ntvf:1\ncell:A28:b::1::\ncell:B28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), SHEET7!B11, INV3!B11)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:3\ncell:D28:t::l:2:f:3\ncell:E28:t::l:2:f:3\ncell:F28:t::b::2:::l:1:f:3\ncell:G28:vtf:t: :IF(AND(ISBLANK(INV3!B11),ISBLANK(SHEET7!B11)), " ", IF(ISBLANK(INV3!B11), (SHEET7!E11*SHEET7!F11), (INV3!E11*INV3!F11))):b::1::1:f:3:ntvf:1\ncell:A29:b::1::\ncell:B29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), SHEET7!B12, INV3!B12)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C29:t::l:2:f:3\ncell:D29:t::l:2:f:3\ncell:E29:t::l:2:f:3\ncell:F29:t::b::2:::l:1:f:3\ncell:G29:vtf:t: :IF(AND(ISBLANK(INV3!B12),ISBLANK(SHEET7!B12)), " ", IF(ISBLANK(INV3!B12), (SHEET7!E12*SHEET7!F12), (INV3!E12*INV3!F12))):b::1::1:f:3:ntvf:1\ncell:A30:b::1::\ncell:B30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), SHEET7!B13, INV3!B13)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C30:t::l:2:f:3\ncell:D30:t::l:2:f:3\ncell:E30:t::l:2:f:3\ncell:F30:t::b::2:::l:1:f:3\ncell:G30:vtf:t: :IF(AND(ISBLANK(INV3!B13),ISBLANK(SHEET7!B13)), " ", IF(ISBLANK(INV3!B13), (SHEET7!E13*SHEET7!F13), (INV3!E13*INV3!F13))):b::1::1:f:3:ntvf:1\ncell:A31:b::1::\ncell:B31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), SHEET7!B14, INV3!B14)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C31:t::l:2:f:3\ncell:D31:t::l:2:f:3\ncell:E31:t::l:2:f:3\ncell:F31:t::b::2:::l:1:f:3\ncell:G31:vtf:t: :IF(AND(ISBLANK(INV3!B14),ISBLANK(SHEET7!B14)), " ", IF(ISBLANK(INV3!B14), (SHEET7!E14*SHEET7!F14), (INV3!E14*INV3!F14))):b::1::1:f:3:ntvf:1\ncell:A32:b::1::\ncell:B32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), SHEET7!B15, INV3!B15)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C32:t::l:2:f:3\ncell:D32:t::l:2:f:3\ncell:E32:t::l:2:f:3\ncell:F32:t::b::2:::l:1:f:3\ncell:G32:vtf:t: :IF(AND(ISBLANK(INV3!B15),ISBLANK(SHEET7!B15)), " ", IF(ISBLANK(INV3!B15), (SHEET7!E15*SHEET7!F15), (INV3!E15*INV3!F15))):b::1::1:f:3:ntvf:1\ncell:A33:b::1::\ncell:B33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), SHEET7!B16, INV3!B16)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C33:l:2:f:3\ncell:D33:l:2:f:3\ncell:E33:l:2:f:3\ncell:F33:b::2:::l:1:f:3\ncell:G33:vtf:t: :IF(AND(ISBLANK(INV3!B16),ISBLANK(SHEET7!B16)), " ", IF(ISBLANK(INV3!B16), (SHEET7!E16*SHEET7!F16), (INV3!E16*INV3!F16))):b::1::1:f:3:ntvf:1\ncell:A34:b::1::\ncell:B34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), SHEET7!B17, INV3!B17)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C34:t::l:2:f:3\ncell:D34:t::l:2:f:3\ncell:E34:t::l:2:f:3\ncell:F34:t::b::2:::l:1:f:3\ncell:G34:vtf:t: :IF(AND(ISBLANK(INV3!B17),ISBLANK(SHEET7!B17)), " ", IF(ISBLANK(INV3!B17), (SHEET7!E17*SHEET7!F17), (INV3!E17*INV3!F17))):b::1::1:f:3:ntvf:1\ncell:A35:b::1::\ncell:B35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), SHEET7!B18, INV3!B18)):b::1::1:f:3:cf:2:colspan:5:rowspan:1\ncell:C35:t::b:::2::l:1:f:3\ncell:D35:t::b:::2::l:1:f:3\ncell:E35:t::b:::2::l:1:f:3\ncell:F35:t::b::2:2::l:1:f:3\ncell:G35:vtf:t: :IF(AND(ISBLANK(INV3!B18),ISBLANK(SHEET7!B18)), " ", IF(ISBLANK(INV3!B18), (SHEET7!E18*SHEET7!F18), (INV3!E18*INV3!F18))):b::1::1:f:3:ntvf:1\ncell:B36:b:2::::l:1:f:10\ncell:C36:b:2::::l:1:f:10\ncell:D36:b:2::::l:1:f:10\ncell:E36:b:2::::l:1:f:11\ncell:F36:t:Subtotal:b:2::::l:1:f:9\ncell:G36:vtf:n:0:SUM(G23\\cG35):b:1::::f:9:ntvf:1\ncell:B37:t:NOTES:b:::1::l:1:f:11:cf:2:colspan:3:rowspan:1\ncell:C37:t::b:::2::l:1:f:10\ncell:D37:t::b:::2::l:1:f:10\ncell:F37:t:Tax Rate:l:1:f:9\ncell:G37:v:0:f:1:ntvf:2\ncell:B38:b:1::::f:1:cf:2:colspan:3\ncell:C38:t::b:2::::l:1:f:10\ncell:D38:t::b:2::::l:1:f:10\ncell:F38:t:Tax:l:1:f:9\ncell:G38:vtf:n:0:G37*G36:f:1:ntvf:1\ncell:B39:f:1:cf:2:colspan:3\ncell:C39:t::l:2:f:10\ncell:D39:t::l:2:f:10\ncell:F39:t:Other:b:::1::l:1:f:9\ncell:G39:v:0:b:::1::f:1:ntvf:1\ncell:B40:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C40:t::l:2:f:10\ncell:D40:t::l:2:f:10\ncell:F40:t:TOTAL:b:1::::l:1:f:11\ncell:G40:vtf:n:0:(G36+G38)+G39:b:1::::f:9:ntvf:1\ncell:B43:t:Thank you for your business:l:1:f:4:cf:1:colspan:6:rowspan:1\ncell:C43:t::l:2:f:10\ncell:D43:t::l:2:f:10\ncell:E43:t::l:2:f:10\ncell:F43:t::l:2:f:10\ncell:G43:t::l:2:f:10\ncol:A:w:10\ncol:B:w:65\ncol:C:w:19\ncol:D:w:10\ncol:E:w:16\ncol:F:w:53\ncol:G:w:64\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:43:h:15.75\nsheet:c:7:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 9pt Trebuchet MS\nfont:4:italic bold 10pt Trebuchet MS\nfont:5:italic normal * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 14pt Trebuchet MS\nfont:8:normal bold 28pt Trebuchet MS\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 10pt Trebuchet MS\nfont:12:normal normal 16pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n', - }, - name: "sheet6", - hidden: "0", - }, - sheet4: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Hours:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Rate:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "inv3", - hidden: "0", - }, - sheet5: { - sheetstr: { - savestr: - "version:1.5\ncell:B1:b:::2::l:1:f:7\ncell:C1:b:::2::l:1:f:7\ncell:D1:b:::2::l:1:f:7\ncell:E1:b:::2::l:1:f:7\ncell:F1:b:::2::l:1:f:7\ncell:A2:b::2:::l:1:f:7\ncell:B2:t:INVOICE DETAILS:b:1:1:1:1:l:1:f:8:cf:1:colspan:5\ncell:C2:t::b:2::2::l:1:f:7\ncell:D2:t::b:2::2::l:1:f:7\ncell:E2:t::b:2::2::l:1:f:7\ncell:F2:b:2:1:1::l:1:f:7\ncell:G2:b::::1\ncell:A3:b::2:::l:3:f:7\ncell:B3:b:2::::l:1:f:7\ncell:C3:b:2::::l:1:f:7\ncell:D3:b:2::::l:1:f:7\ncell:E3:b:2::::l:1:f:7\ncell:F3:b:1:1:::l:1:f:7\ncell:G3:b::::1\ncell:A4:b::2:::l:3:f:7\ncell:B4:b:::2::l:1:f:7\ncell:C4:b:::2::l:3:f:4:cf:2\ncell:D4:b:::2::l:1:f:7\ncell:E4:b:::2::l:1:f:7\ncell:F4:b::1:1::l:1:f:7\ncell:G4:b::::1\ncell:A5:b::2:::l:3:f:7\ncell:B5:t:Description:b:1:1:1:1:f:6:cf:1:colspan:3\ncell:C5:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:D5:t::b:2:2:2::l:1:f:7\ncell:E5:t:Qty.:b:1:1:1:1:f:6:cf:1\ncell:F5:t:Price:b:1:1:1:1:f:6:cf:1\ncell:G5:b::::1\ncell:A6:b::2:::l:3:f:7\ncell:B6:b:1:1::1:f:1:cf:2:colspan:3\ncell:C6:b:1:1::1:l:3:f:7:cf:2:colspan:2:rowspan:1\ncell:D6:t::b:2:2:2::l:1:f:7\ncell:E6:b:1:1:::f:1:ntvf:1\ncell:F6:b:1:1:::f:1:ntvf:1\ncell:G6:b::::1\ncell:A7:b::2:::l:3:f:7\ncell:B7:b::1::1:f:1:cf:2:colspan:3\ncell:C7:b::1::1:l:1:f:7:colspan:2\ncell:D7:l:1:f:7\ncell:E7:b::1:::f:1:ntvf:1\ncell:F7:b::1:::f:1:ntvf:1\ncell:G7:b::::1\ncell:A8:b::2:::l:3:f:7\ncell:B8:b::1::1:f:1:cf:2:colspan:3\ncell:C8:b::1::1:colspan:2\ncell:E8:b::1:::f:1:ntvf:1\ncell:F8:b::1:::f:1:ntvf:1\ncell:G8:b::::1\ncell:A9:b::2:::l:3:f:7\ncell:B9:b::1::1:f:1:cf:2:colspan:3\ncell:C9:b::1::1:colspan:2\ncell:E9:b::1:::f:1:ntvf:1\ncell:F9:b::1:::f:1:ntvf:1\ncell:G9:b::::1\ncell:A10:b::2:::l:3:f:7\ncell:B10:b::1::1:f:1:cf:2:colspan:3\ncell:C10:b::1::1:colspan:2\ncell:E10:b::1:::f:1:ntvf:1\ncell:F10:b::1:::f:1:ntvf:1\ncell:G10:b::::1\ncell:A11:b::2:::l:3:f:7\ncell:B11:b::1::1:f:1:cf:2:colspan:3\ncell:C11:b::1::1:colspan:2\ncell:E11:b::1:::f:1:ntvf:1\ncell:F11:b::1:::f:1:ntvf:1\ncell:G11:b::::1\ncell:A12:b::2:::l:3:f:7\ncell:B12:b::1::1:f:1:cf:2:colspan:3\ncell:C12:b::1::1:colspan:2\ncell:E12:b::1:::f:1:ntvf:1\ncell:F12:b::1:::f:1:ntvf:1\ncell:G12:b::::1\ncell:A13:b::2:::l:3:f:7\ncell:B13:b::1::1:f:1:cf:2:colspan:3\ncell:C13:b::1::1:colspan:2\ncell:E13:b::1:::f:1:ntvf:1\ncell:F13:b::1:::f:1:ntvf:1\ncell:G13:b::::1\ncell:A14:b::2:::l:3:f:7\ncell:B14:b::1::1:f:1:cf:2:colspan:3\ncell:C14:b::1::1:colspan:2\ncell:E14:b::1:::f:1:ntvf:1\ncell:F14:b::1:::f:1:ntvf:1\ncell:G14:b::::1\ncell:A15:b::2:::l:3:f:7\ncell:B15:b::1::1:f:1:cf:2:colspan:3\ncell:C15:b::1::1:colspan:2\ncell:E15:b::1:::f:1:ntvf:1\ncell:F15:b::1:::f:1:ntvf:1\ncell:G15:b::::1\ncell:A16:b::2:::l:3:f:7\ncell:B16:b::1::1:f:1:cf:2:colspan:3\ncell:C16:b::1::1:colspan:2\ncell:E16:b::1:::f:1:ntvf:1\ncell:F16:b::1:::f:1:ntvf:1\ncell:G16:b::::1\ncell:A17:b::2:::l:3:f:7\ncell:B17:b::1::1:f:1:cf:2:colspan:3\ncell:C17:b::1::1:colspan:2\ncell:E17:b::1:::f:1:ntvf:1\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::::1\ncell:A18:b::2:::l:3:f:5\ncell:B18:b::1:1:1:f:1:cf:2:colspan:3\ncell:C18:b::1:1:1:l:3:f:7:cf:2:colspan:2\ncell:D18:b:::2::l:3:f:7:cf:2\ncell:E18:b::1:1::f:1:ntvf:1\ncell:F18:b::1:1::f:1:ntvf:1\ncell:G18:b::::1\ncell:A19:b::2:::l:3:f:7\ncell:F19:b::1::\ncell:G19:b::::1\ncell:A20:b::2:::l:3:f:7\ncell:F20:b::1::\ncell:G20:b::::1\ncell:A21:b::2:::l:3:f:7\ncell:C21:t:Thank you for your business:b::1:::f:3:colspan:4\ncell:D21:t:Thank you for your business:f:2:colspan:4\ncell:E21:t::l:2:f:7\ncell:F21:l:2:f:7\ncell:G21:b::::1\ncell:A22:b::2:::l:3:f:7\ncell:F22:b::1::\ncell:G22:b::::1\ncell:A23:b::2:::l:3:f:7\ncell:B23:b:::2::l:3:f:7\ncell:C23:b:::2::l:3:f:7\ncell:D23:b:::2::l:3:f:7\ncell:E23:b:::2::l:3:f:7\ncell:F23:b::1:1::l:3:f:7\ncell:G23:b::::1\ncell:B24:b:1:::\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:E24:b:1:::\ncell:F24:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:56\ncol:D:w:39\ncol:E:w:48\ncol:F:w:57\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:15.75\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nsheet:c:7:r:24:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:italic bold 10pt Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal normal * Trebuchet MS\nfont:7:normal normal 10pt Arial\nfont:8:normal normal 16pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nvalueformat:1:#,##0.00\n", - }, - name: "sheet7", - hidden: "0", - }, - }, - EditableCells: { - allow: true, - cells: { - "inv1!B2": true, - "inv1!C5": true, - "inv1!C6": true, - "inv1!C7": true, - "inv1!C8": true, - "inv1!C9": true, - "inv1!C11": true, - "inv1!C12": true, - "inv1!C13": true, - "inv1!C14": true, - "inv1!C15": true, - "inv1!C16": true, - "inv1!C18": true, - "inv1!C20": true, - "inv1!D20": true, - "inv1!C23": true, - "inv1!C24": true, - "inv1!C25": true, - "inv1!C26": true, - "inv1!C27": true, - "inv1!C28": true, - "inv1!C29": true, - "inv1!C30": true, - "inv1!C31": true, - "inv1!C32": true, - "inv1!C33": true, - "inv1!C34": true, - "inv1!C35": true, - "inv1!F23": true, - "inv1!F24": true, - "inv1!F25": true, - "inv1!F26": true, - "inv1!F27": true, - "inv1!F28": true, - "inv1!F29": true, - "inv1!F30": true, - "inv1!F31": true, - "inv1!F32": true, - "inv1!F33": true, - "inv1!F34": true, - "inv1!F35": true, - "inv2!B2": true, - "inv2!F4": true, - "inv2!G4": true, - "inv2!B5": true, - "inv2!B7": true, - "inv2!B8": true, - "inv2!B9": true, - "inv2!B10": true, - "inv2!B11": true, - "inv2!B12": true, - "inv2!B14": true, - "inv2!B15": true, - "inv2!B16": true, - "inv2!B17": true, - "inv2!B18": true, - "inv2!B19": true, - "inv2!B20": true, - "inv2!B23": true, - "inv2!B24": true, - "inv2!B25": true, - "inv2!B26": true, - "inv2!B27": true, - "inv2!B28": true, - "inv2!B29": true, - "inv2!B30": true, - "inv2!B31": true, - "inv2!B32": true, - "inv2!B33": true, - "inv2!B34": true, - "inv2!B35": true, - "inv2!G23": true, - "inv2!G24": true, - "inv2!G25": true, - "inv2!G26": true, - "inv2!G27": true, - "inv2!G28": true, - "inv2!G29": true, - "inv2!G30": true, - "inv2!G31": true, - "inv2!G32": true, - "inv2!G33": true, - "inv2!G34": true, - "inv2!G35": true, - "inv2!B38": true, - "inv2!B39": true, - "inv2!B40": true, - "inv2!F36": true, - "inv2!G37": true, - "inv2!F37": true, - "inv2!F39": true, - "inv2!G39": true, - "inv2!F38": true, - "sheet6!B2": true, - "sheet6!F4": true, - "sheet6!G4": true, - "sheet6!B5": true, - "sheet6!B7": true, - "sheet6!B8": true, - "sheet6!B9": true, - "sheet6!B10": true, - "sheet6!B11": true, - "sheet6!B12": true, - "sheet6!B14": true, - "sheet6!B15": true, - "sheet6!B16": true, - "sheet6!B17": true, - "sheet6!B18": true, - "sheet6!B19": true, - "sheet6!B20": true, - "sheet6!B38": true, - "sheet6!B39": true, - "sheet6!B40": true, - "sheet6!F36": true, - "sheet6!G37": true, - "sheet6!F37": true, - "sheet6!F39": true, - "sheet6!G39": true, - "sheet6!F38": true, - "inv3!B2": true, - "inv3!B6": true, - "inv3!B7": true, - "inv3!B8": true, - "inv3!B9": true, - "inv3!B10": true, - "inv3!B11": true, - "inv3!B12": true, - "inv3!B13": true, - "inv3!B14": true, - "inv3!B15": true, - "inv3!B16": true, - "inv3!B17": true, - "inv3!B18": true, - "inv3!E6": true, - "inv3!E7": true, - "inv3!E8": true, - "inv3!E9": true, - "inv3!E10": true, - "inv3!E11": true, - "inv3!E12": true, - "inv3!E13": true, - "inv3!E14": true, - "inv3!E15": true, - "inv3!E16": true, - "inv3!E17": true, - "inv3!E18": true, - "inv3!F6": true, - "inv3!F7": true, - "inv3!F8": true, - "inv3!F9": true, - "inv3!F10": true, - "inv3!F11": true, - "inv3!F12": true, - "inv3!F13": true, - "inv3!F14": true, - "inv3!F15": true, - "inv3!F16": true, - "inv3!F17": true, - "inv3!F18": true, - "sheet7!F6": true, - "sheet7!F7": true, - "sheet7!F8": true, - "sheet7!F9": true, - "sheet7!F10": true, - "sheet7!F11": true, - "sheet7!F12": true, - "sheet7!F13": true, - "sheet7!F14": true, - "sheet7!F15": true, - "sheet7!F16": true, - "sheet7!F17": true, - "sheet7!F18": true, - "sheet7!E6": true, - "sheet7!E7": true, - "sheet7!E8": true, - "sheet7!E9": true, - "sheet7!E10": true, - "sheet7!E11": true, - "sheet7!E12": true, - "sheet7!E13": true, - "sheet7!E14": true, - "sheet7!E15": true, - "sheet7!E16": true, - "sheet7!E17": true, - "sheet7!E18": true, - "sheet7!B6": true, - "sheet7!B2": true, - "sheet7!B7": true, - "sheet7!B8": true, - "sheet7!B9": true, - "sheet7!B10": true, - "sheet7!B11": true, - "sheet7!B12": true, - "sheet7!B13": true, - "sheet7!B14": true, - "sheet7!B15": true, - "sheet7!B16": true, - "sheet7!B17": true, - "sheet7!B18": true, - "inv1!D8": true, - "inv1!D15": true, - "inv1!D18": true, - "inv2!C5": true, - "sheet6!C5": true, - }, - constraints: { - "inv1!C5": ["prompttext", "0", "1e10", "Name"], - "inv1!C6": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C7": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C8": ["prompttext", "0", "1e10", "Phone"], - "inv1!C9": ["promptemail", "0", "1e10", "Email"], - "inv1!C11": ["prompttext", "0", "1e10", "From"], - "inv1!C12": ["prompttext", "0", "1e10", "Name"], - "inv1!C13": ["prompttext", "0", "1e10", "Street Address"], - "inv1!C14": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv1!C15": ["prompttext", "0", "1e10", "Phone"], - "inv1!C16": ["promptemail", "0", "1e10", "Email"], - "inv1!C18": ["prompttext", "0", "1e10", "Invoice #"], - "inv1!C20": ["prompttext", "0", "1e10", "Date"], - "inv1!D20": ["prompttext", "0", "1e10", "Date"], - "inv1!C23": ["prompttext", "0", "1e10", "Description"], - "inv1!C24": ["prompttext", "0", "1e10", "Description"], - "inv1!C25": ["prompttext", "0", "1e10", "Description"], - "inv1!C26": ["prompttext", "0", "1e10", "Description"], - "inv1!C27": ["prompttext", "0", "1e10", "Description"], - "inv1!C28": ["prompttext", "0", "1e10", "Description"], - "inv1!C29": ["prompttext", "0", "1e10", "Description"], - "inv1!C30": ["prompttext", "0", "1e10", "Description"], - "inv1!C31": ["prompttext", "0", "1e10", "Description"], - "inv1!C32": ["prompttext", "0", "1e10", "Description"], - "inv1!C33": ["prompttext", "0", "1e10", "Description"], - "inv1!C34": ["prompttext", "0", "1e10", "Description"], - "inv1!C35": ["prompttext", "0", "1e10", "Description"], - "inv1!F23": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F24": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F25": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F26": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F27": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F28": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F29": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F30": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F31": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F32": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F33": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F34": ["promptdecimal", "0", "1e10", "Amount"], - "inv1!F35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B2": ["prompttext", "0", "1e10", "Invoice"], - "inv2!F4": ["prompttext", "0", "1e10", "Date"], - "inv2!G4": ["prompttext", "0", "1e10", "Date"], - "inv2!B5": ["prompttext", "0", "1e10", "Invoice #"], - "inv2!B7": ["prompttext", "0", "1e10", "From"], - "inv2!B8": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B9": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B11": ["prompttext", "0", "1e10", "Phone"], - "inv2!B12": ["promptemail", "0", "1e10", "Email"], - "inv2!B14": ["prompttext", "0", "1e10", "Bill To"], - "inv2!B15": ["prompttext", "0", "1e10", "Name"], - "inv2!B16": ["prompttext", "0", "1e10", "Company Name"], - "inv2!B17": ["prompttext", "0", "1e10", "Street Address"], - "inv2!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "inv2!B19": ["prompttext", "0", "1e10", "Phone"], - "inv2!B20": ["promptemail", "0", "1e10", "Email"], - "inv2!B23": ["prompttext", "0", "1e10", "Description"], - "inv2!B24": ["prompttext", "0", "1e10", "Description"], - "inv2!B25": ["prompttext", "0", "1e10", "Description"], - "inv2!B26": ["prompttext", "0", "1e10", "Description"], - "inv2!B27": ["prompttext", "0", "1e10", "Description"], - "inv2!B28": ["prompttext", "0", "1e10", "Description"], - "inv2!B29": ["prompttext", "0", "1e10", "Description"], - "inv2!B30": ["prompttext", "0", "1e10", "Description"], - "inv2!B31": ["prompttext", "0", "1e10", "Description"], - "inv2!B32": ["prompttext", "0", "1e10", "Description"], - "inv2!B33": ["prompttext", "0", "1e10", "Description"], - "inv2!B34": ["prompttext", "0", "1e10", "Description"], - "inv2!B35": ["prompttext", "0", "1e10", "Description"], - "inv2!G23": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G24": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G25": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G26": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G27": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G28": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G29": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G30": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G31": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G32": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G33": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G34": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!G35": ["promptdecimal", "0", "1e10", "Amount"], - "inv2!B38": ["prompttext", "0", "1e10", "Notes"], - "inv2!B39": ["prompttext", "0", "1e10", "Notes"], - "inv2!B40": ["prompttext", "0", "1e10", "Notes"], - "inv2!F36": ["prompttext", "0", "1e10", "Subtotal"], - "inv2!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "inv2!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "inv2!F39": ["prompttext", "0", "1e10", "Other"], - "inv2!G39": ["promptdecimal", "0", "1e10", "Other"], - "inv2!F38": ["prompttext", "0", "1e10", "Tax"], - "sheet6!B2": ["prompttext", "0", "1e10", "Invoice"], - "sheet6!F4": ["prompttext", "0", "1e10", "Date"], - "sheet6!G4": ["prompttext", "0", "1e10", "Date"], - "sheet6!B5": ["prompttext", "0", "1e10", "Invoice #"], - "sheet6!B7": ["prompttext", "0", "1e10", "From"], - "sheet6!B8": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B9": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B10": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B11": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B12": ["promptemail", "0", "1e10", "Email"], - "sheet6!B14": ["prompttext", "0", "1e10", "Bill To"], - "sheet6!B15": ["prompttext", "0", "1e10", "Name"], - "sheet6!B16": ["prompttext", "0", "1e10", "Company Name"], - "sheet6!B17": ["prompttext", "0", "1e10", "Street Address"], - "sheet6!B18": ["prompttext", "0", "1e10", "City, State, Zip"], - "sheet6!B19": ["prompttext", "0", "1e10", "Phone"], - "sheet6!B20": ["promptemail", "0", "1e10", "Email"], - "sheet6!B38": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B39": ["prompttext", "0", "1e10", "Notes"], - "sheet6!B40": ["prompttext", "0", "1e10", "Notes"], - "sheet6!F36": ["prompttext", "0", "1e10", "Subtotal"], - "sheet6!G37": ["promptdecimal", "0", "1e10", "Tax Rate (0.00)"], - "sheet6!F37": ["prompttext", "0", "1e10", "Tax Rate"], - "sheet6!F39": ["prompttext", "0", "1e10", "Other"], - "sheet6!G39": ["promptdecimal", "0", "1e10", "Other"], - "sheet6!F38": ["prompttext", "0", "1e10", "Tax"], - "inv3!B6": ["prompttext", "0", "1e10", "Description"], - "inv3!B7": ["prompttext", "0", "1e10", "Description"], - "inv3!B8": ["prompttext", "0", "1e10", "Description"], - "inv3!B9": ["prompttext", "0", "1e10", "Description"], - "inv3!B10": ["prompttext", "0", "1e10", "Description"], - "inv3!B11": ["prompttext", "0", "1e10", "Description"], - "inv3!B12": ["prompttext", "0", "1e10", "Description"], - "inv3!B13": ["prompttext", "0", "1e10", "Description"], - "inv3!B14": ["prompttext", "0", "1e10", "Description"], - "inv3!B15": ["prompttext", "0", "1e10", "Description"], - "inv3!B16": ["prompttext", "0", "1e10", "Description"], - "inv3!B17": ["prompttext", "0", "1e10", "Description"], - "inv3!B18": ["prompttext", "0", "1e10", "Description"], - "sheet7!B6": ["prompttext", "0", "1e10", "Description"], - "sheet7!B7": ["prompttext", "0", "1e10", "Description"], - "sheet7!B8": ["prompttext", "0", "1e10", "Description"], - "sheet7!B9": ["prompttext", "0", "1e10", "Description"], - "sheet7!B10": ["prompttext", "0", "1e10", "Description"], - "sheet7!B11": ["prompttext", "0", "1e10", "Description"], - "sheet7!B12": ["prompttext", "0", "1e10", "Description"], - "sheet7!B13": ["prompttext", "0", "1e10", "Description"], - "sheet7!B14": ["prompttext", "0", "1e10", "Description"], - "sheet7!B15": ["prompttext", "0", "1e10", "Description"], - "sheet7!B16": ["prompttext", "0", "1e10", "Description"], - "sheet7!B17": ["prompttext", "0", "1e10", "Description"], - "sheet7!B18": ["prompttext", "0", "1e10", "Description"], - "inv1!D8": ["prompttext", "0", "1e10", "Phone"], - "inv1!D15": ["prompttext", "0", "1e10", "Phone"], - "inv1!D18": ["promptnumeric", "0", "1e10", "Invoice#"], - "inv2!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet6!C5": ["promptnumeric", "0", "1e10", "Invoice#"], - "sheet7!E6": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E7": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E8": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E9": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E10": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E11": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E12": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E13": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E14": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E15": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E16": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E17": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!E18": ["promptdecimal", "0", "1e10", "Quantity"], - "sheet7!F6": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F7": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F8": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F9": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F10": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F11": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F12": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F13": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F14": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F15": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F16": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F17": ["promptdecimal", "0", "1e10", "Price"], - "sheet7!F18": ["promptdecimal", "0", "1e10", "Price"], - "inv3!E6": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E7": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E8": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E9": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E10": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E11": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E12": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E13": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E14": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E15": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E16": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E17": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!E18": ["promptdecimal", "0", "1e10", "Hours"], - "inv3!F6": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F7": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F8": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F9": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F10": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F11": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F12": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F13": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F14": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F15": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F16": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F17": ["promptdecimal", "0", "1e10", "Rate"], - "inv3!F18": ["promptdecimal", "0", "1e10", "Rate"], - }, - }, - }, - footers: [ - { name: "Type1", index: 1, isActive: true }, - { name: "Type2", index: 2, isActive: false }, - { name: "Type3", index: 3, isActive: false }, - { name: "Detail1", index: 4, isActive: false }, - { name: "Detail2", index: 5, isActive: false }, - ], - }, - }, -}; diff --git a/Govt-Billing-React-Ad-Subscriptions/src/components/Files/Files.css b/Govt-Billing-React-Ad-Subscriptions/src/components/Files/Files.css deleted file mode 100644 index 53a9878..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/components/Files/Files.css +++ /dev/null @@ -1,30 +0,0 @@ -.file ul{ - list-style: none; - overflow-y: scroll; height:400px; -} - -.file li{ - font-weight: bold; - cursor: pointer; - border-bottom: 0.1rem solid #e1e1e1; - padding: 2px 2px; - text-align: left; -} - -.file span{ - font-size: 12px; - color: #9b4dca; - margin-right: 20px; -} - -/* -td:first-child, -th:first-child { - padding-left: 0; -} - -td:last-child, -th:last-child { - padding-right: 0; -} -606c76*/ \ No newline at end of file diff --git a/Govt-Billing-React-Ad-Subscriptions/src/components/Files/Files.tsx b/Govt-Billing-React-Ad-Subscriptions/src/components/Files/Files.tsx deleted file mode 100644 index 9d18dfe..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/components/Files/Files.tsx +++ /dev/null @@ -1,203 +0,0 @@ -import React, { useState, useEffect } from "react"; -import "./Files.css"; -import * as AppGeneral from "../socialcalc/index.js"; -import { DATA } from "../../app-data.js"; -import { Local } from "../Storage/LocalStorage"; -import { - IonIcon, - IonModal, - IonItem, - IonButton, - IonList, - IonLabel, - IonAlert, - IonItemGroup, -} from "@ionic/react"; -import { - fileTrayFull, - trash, - create, - cloudUpload, - cloudDownload, -} from "ionicons/icons"; -import useUser from "../../hooks/useUser"; -import { - getFilesKeysFromFirestore, - uploadFileToCloud, - downloadFileFromFirebase, - deleteFileFromFirebase, -} from "../../firebase/firestore"; - -const Files: React.FC<{ - store: Local; - file: string; - updateSelectedFile: Function; - updateBillType: Function; - filesFrom: "Local" | "Cloud"; -}> = (props) => { - const [modal, setModal] = useState(null); - const [listFiles, setListFiles] = useState(false); - const [showAlert1, setShowAlert1] = useState(false); - const [currentKey, setCurrentKey] = useState(null); - const { user, isLoading } = useUser(); - - const editFile = (key) => { - props.store._getFile(key).then((data) => { - AppGeneral.viewFile(key, decodeURIComponent((data as any).content)); - props.updateSelectedFile(key); - props.updateBillType((data as any).billType); - }); - // console.log(JSON.stringify(data)); - }; - const moveFileToCloud = (key) => { - props.store._getFile(key).then((fileData) => { - if (user) { - uploadFileToCloud(user, fileData, () => { - alert("File Uploaded to Cloud"); - setListFiles(false); - }); - } else { - alert("Login to Continue"); - setListFiles(false); - } - }); - }; - - const deleteFile = (key) => { - setShowAlert1(true); - setCurrentKey(key); - }; - - const loadDefault = () => { - const msc = DATA["home"][AppGeneral.getDeviceType()]["msc"]; - AppGeneral.viewFile("default", JSON.stringify(msc)); - props.updateSelectedFile("default"); - }; - - const _formatDate = (date) => { - return new Date(date).toLocaleString(); - }; - - const temp = async () => { - let files; - if (props.filesFrom == "Local") { - files = await props.store._getAllFiles(); - } else if (props.filesFrom == "Cloud") { - if (isLoading) return; - if (!user) { - alert("Login to Continue"); - } else { - files = await getFilesKeysFromFirestore(user.uid); - } - } - const fileList = Object.keys(files).map((key) => { - return ( - - - {key} - {_formatDate(files[key])} - {props.filesFrom === "Local" && ( - { - setListFiles(false); - editFile(key); - }} - /> - )} - - { - if (props.filesFrom === "Local") moveFileToCloud(key); - else - downloadFileFromFirebase(user.uid, key, () => - setListFiles(false) - ); - }} - /> - { - setListFiles(false); - deleteFile(key); - }} - /> - - - ); - }); - - const ourModal = ( - setListFiles(false)}> - {fileList} - { - setListFiles(false); - }} - > - Back - - - ); - setModal(ourModal); - }; - - useEffect(() => { - temp(); - }, [listFiles]); - - return ( - - { - setListFiles(true); - }} - /> - {modal} - setShowAlert1(false)} - header="Delete file" - message={"Do you want to delete the " + currentKey + " file?"} - buttons={[ - { text: "No", role: "cancel" }, - { - text: "Yes", - handler: () => { - if (props.filesFrom === "Local") { - props.store._deleteFile(currentKey); - loadDefault(); - setCurrentKey(null); - } else { - deleteFileFromFirebase(user.uid, currentKey, () => { - setListFiles(false); - loadDefault(); - setCurrentKey(null); - }); - } - }, - }, - ]} - /> - - ); -}; - -export default Files; diff --git a/Govt-Billing-React-Ad-Subscriptions/src/components/Login/Login.tsx b/Govt-Billing-React-Ad-Subscriptions/src/components/Login/Login.tsx deleted file mode 100644 index 155f73b..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/components/Login/Login.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React, { useState } from "react"; -import { IonIcon, IonButton, IonModal } from "@ionic/react"; -import { person } from "ionicons/icons"; -import LoginFormComponent from "./LoginFormComponent"; -import { - logOut, - signUpWithEmailAndPassword, - loginWithEmailPassword, -} from "../../firebase/auth"; -import useUser from "../../hooks/useUser"; - -const Login: React.FC = () => { - const { user, isLoading } = useUser(); - const [openLoginModal, setOpenLoginModal] = useState(false); - - const doSignIn = async (email: string, password: string) => { - try { - await loginWithEmailPassword(email, password); - closeLoginModal(); - } catch { - console.error("Something Went Wrong"); - } - }; - const doSignUp = async (email: string, password: string) => { - try { - await signUpWithEmailAndPassword(email, password, "bronze"); - closeLoginModal(); - } catch { - console.error("Something Went Wrong"); - } - }; - const closeLoginModal = () => setOpenLoginModal(false); - - if (isLoading) { - return ( - - - - Loading - - - ); - } - return ( - - { - if (!user) setOpenLoginModal(true); - else { - try { - await logOut(); - } catch { - console.error("Something Went Wrong"); - } - } - }} - > - - {user ? "Logout" : "Login"} - - - - - - - ); -}; - -export default Login; diff --git a/Govt-Billing-React-Ad-Subscriptions/src/components/Login/LoginFormComponent.tsx b/Govt-Billing-React-Ad-Subscriptions/src/components/Login/LoginFormComponent.tsx deleted file mode 100644 index 7e10cd3..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/components/Login/LoginFormComponent.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import { IonInput, IonList, IonItem, IonButton } from "@ionic/react"; -import React, { MouseEventHandler, useState } from "react"; - -interface ComponentProps { - handleLogin: Function; - handleSignUp: Function; -} - -const LoginFormComponent: React.FC = ({ - handleLogin, - handleSignUp, -}) => { - const [email, setEmail] = useState(""); - const [password, setPassword] = useState(""); - - const updateValue = ( - e: any, - setter: React.Dispatch> - ) => { - setter(e.target.value); - }; - - return ( - - - updateValue(e, setEmail)} - placeholder="Email.." - /> - - - updateValue(e, setPassword)} - placeholder="Password.." - /> - - handleLogin(email, password)} - > - Login - - handleSignUp(email, password)} - > - SignUp - - - ); -}; - -export default LoginFormComponent; diff --git a/Govt-Billing-React-Ad-Subscriptions/src/components/Menu/Menu.css b/Govt-Billing-React-Ad-Subscriptions/src/components/Menu/Menu.css deleted file mode 100644 index e69de29..0000000 diff --git a/Govt-Billing-React-Ad-Subscriptions/src/components/Menu/Menu.tsx b/Govt-Billing-React-Ad-Subscriptions/src/components/Menu/Menu.tsx deleted file mode 100644 index cd88c00..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/components/Menu/Menu.tsx +++ /dev/null @@ -1,361 +0,0 @@ -import React, { useEffect, useState } from "react"; -import * as AppGeneral from "../socialcalc/index.js"; -import { File, Local } from "../Storage/LocalStorage"; -import { isPlatform, IonToast } from "@ionic/react"; -import { EmailComposer } from "capacitor-email-composer"; -import { Printer } from "@ionic-native/printer"; -import { IonActionSheet, IonAlert } from "@ionic/react"; -import { saveOutline, save, mail, print } from "ionicons/icons"; -import { APP_NAME } from "../../app-data.js"; - -import { - canUserPerformAction, - updateUserQuota, - updateUserSubscription, -} from "../../firebase/firestore.js"; -import useUser from "../../hooks/useUser.js"; - -const Menu: React.FC<{ - showM: boolean; - setM: Function; - file: string; - updateSelectedFile: Function; - store: Local; - bT: number; -}> = (props) => { - const [showAlert1, setShowAlert1] = useState(false); - const [showAlert2, setShowAlert2] = useState(false); - const [showAlert3, setShowAlert3] = useState(false); - const [showAlert4, setShowAlert4] = useState(false); - const [showToast1, setShowToast1] = useState(false); - const [toastMessage, setToastMessage] = useState(""); - const [canPrint, setCanPrint] = useState(false); - const [canEmail, setCanEmail] = useState(false); - const { user, isLoading } = useUser(); - const [showUpgradeAlert, setShowUpgradeAlert] = useState(false); - - const handleUpgradeSubscription = async (tier: string) => { - if (user) { - try { - await updateUserSubscription(user.uid, tier); - setToastMessage(`Successfully upgraded to ${tier} tier!`); - setShowToast1(true); - checkUserPermissions(); - } catch (error) { - console.error("Error upgrading subscription:", error); - setToastMessage("Failed to upgrade subscription. Please try again."); - setShowToast1(true); - } - } else { - setToastMessage("Please log in to upgrade your subscription."); - setShowToast1(true); - } - }; - /* Utility functions */ - const _validateName = async (filename) => { - filename = filename.trim(); - if (filename === "default" || filename === "Untitled") { - setToastMessage("Cannot update default file!"); - return false; - } else if (filename === "" || !filename) { - setToastMessage("Filename cannot be empty"); - return false; - } else if (filename.length > 30) { - setToastMessage("Filename too long"); - return false; - } else if (/^[a-zA-Z0-9- ]*$/.test(filename) === false) { - setToastMessage("Special Characters cannot be used"); - return false; - } else if (await props.store._checkKey(filename)) { - setToastMessage("Filename already exists"); - return false; - } - return true; - }; - - const getCurrentFileName = () => { - return props.file; - }; - - const _formatString = (filename) => { - /* Remove whitespaces */ - while (filename.indexOf(" ") !== -1) { - filename = filename.replace(" ", ""); - } - return filename; - }; - useEffect(() => { - checkUserPermissions(); - }, [isLoading]); - - const checkUserPermissions = async () => { - if (user) { - const printPermission = await canUserPerformAction(user.uid, "print"); - const emailPermission = await canUserPerformAction(user.uid, "email"); - setCanPrint(printPermission); - setCanEmail(emailPermission); - } - }; - - const doPrint = async () => { - if (!canPrint) { - setToastMessage("You've reached your print quota limit."); - setShowToast1(true); - return; - } - - if (user) { - const updated = await updateUserQuota(user.uid, "print"); - if (!updated) { - setToastMessage( - "Failed to update quota. You may have reached your limit." - ); - setShowToast1(true); - return; - } - } - - if (isPlatform("hybrid")) { - const printer = Printer; - printer.print(AppGeneral.getCurrentHTMLContent()); - } else { - const content = AppGeneral.getCurrentHTMLContent(); - const printWindow = window.open("/printwindow", "Print Invoice"); - printWindow.document.write(content); - printWindow.print(); - } - - setToastMessage("Print job sent successfully."); - setShowToast1(true); - checkUserPermissions(); // Update permissions after printing - }; - - const doSave = () => { - if (props.file === "default") { - setShowAlert1(true); - return; - } - const content = encodeURIComponent(AppGeneral.getSpreadsheetContent()); - const data = props.store._getFile(props.file); - const file = new File( - (data as any).created, - new Date().toString(), - content, - props.file, - props.bT - ); - props.store._saveFile(file); - props.updateSelectedFile(props.file); - setShowAlert2(true); - }; - - const doSaveAs = async (filename) => { - // event.preventDefault(); - if (filename) { - // console.log(filename, _validateName(filename)); - if (await _validateName(filename)) { - // filename valid . go on save - const content = encodeURIComponent(AppGeneral.getSpreadsheetContent()); - // console.log(content); - const file = new File( - new Date().toString(), - new Date().toString(), - content, - filename, - props.bT - ); - // const data = { created: file.created, modified: file.modified, content: file.content, password: file.password }; - // console.log(JSON.stringify(data)); - props.store._saveFile(file); - props.updateSelectedFile(filename); - setShowAlert4(true); - } else { - setShowToast1(true); - } - } - }; - - const sendEmail = async () => { - if (!canEmail) { - setToastMessage("You've reached your email quota limit."); - setShowToast1(true); - return; - } - - if (user) { - const updated = await updateUserQuota(user.uid, "email"); - if (!updated) { - setToastMessage( - "Failed to update quota. You may have reached your limit." - ); - setShowToast1(true); - return; - } - } - - if (isPlatform("hybrid")) { - const content = AppGeneral.getCurrentHTMLContent(); - const base64 = btoa(content); - - EmailComposer.open({ - to: ["jackdwell08@gmail.com"], - cc: [], - bcc: [], - body: "PFA", - attachments: [{ type: "base64", path: base64, name: "Invoice.html" }], - subject: `${APP_NAME} attached`, - isHtml: true, - }); - - setToastMessage("Email sent successfully."); - setShowToast1(true); - } else { - setToastMessage("This functionality works on Android/iOS devices only."); - setShowToast1(true); - } - - checkUserPermissions(); - }; - - return ( - - props.setM()} - buttons={[ - { - text: "Save", - icon: saveOutline, - handler: () => { - doSave(); - console.log("Save clicked"); - }, - }, - { - text: "Save As", - icon: save, - handler: () => { - setShowAlert3(true); - console.log("Save As clicked"); - }, - }, - { - text: "Print", - icon: print, - handler: () => { - doPrint(); - console.log("Print clicked"); - }, - }, - { - text: "Email", - icon: mail, - handler: () => { - sendEmail(); - console.log("Email clicked"); - }, - }, - { - text: "Upgrade Subscription", - icon: "arrow-up-circle-outline", - handler: () => { - setShowUpgradeAlert(true); - console.log("Upgrade Subscription clicked"); - }, - }, - ]} - /> - setShowAlert1(false)} - header="Alert Message" - message={ - "Cannot update " + getCurrentFileName() + " file!" - } - buttons={["Ok"]} - /> - setShowAlert2(false)} - header="Save" - message={ - "File " + - getCurrentFileName() + - " updated successfully" - } - buttons={["Ok"]} - /> - setShowAlert3(false)} - header="Save As" - inputs={[ - { name: "filename", type: "text", placeholder: "Enter filename" }, - ]} - buttons={[ - { - text: "Ok", - handler: (alertData) => { - doSaveAs(alertData.filename); - }, - }, - ]} - /> - setShowAlert4(false)} - header="Save As" - message={ - "File " + - getCurrentFileName() + - " saved successfully" - } - buttons={["Ok"]} - /> - setShowUpgradeAlert(false)} - header="Upgrade Subscription" - message="Choose a subscription tier to upgrade:" - buttons={[ - { - text: "Bronze ($150/month)", - handler: () => handleUpgradeSubscription("bronze"), - }, - { - text: "Silver ($200/month)", - handler: () => handleUpgradeSubscription("silver"), - }, - { - text: "Gold ($250/month)", - handler: () => handleUpgradeSubscription("gold"), - }, - { - text: "Cancel", - role: "cancel", - }, - ]} - /> - { - setShowToast1(false); - setShowAlert3(true); - }} - position="bottom" - message={toastMessage} - duration={500} - /> - - ); -}; - -export default Menu; diff --git a/Govt-Billing-React-Ad-Subscriptions/src/components/NewFile/NewFile.tsx b/Govt-Billing-React-Ad-Subscriptions/src/components/NewFile/NewFile.tsx deleted file mode 100644 index f1adffa..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/components/NewFile/NewFile.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import React, { useState } from "react"; -import * as AppGeneral from "../socialcalc/index.js"; -import { File, Local } from "../Storage/LocalStorage"; -import { DATA } from "../../app-data.js"; -import { IonAlert, IonIcon } from "@ionic/react"; -import { add } from "ionicons/icons"; - -const NewFile: React.FC<{ - file: string; - updateSelectedFile: Function; - store: Local; - billType: number; -}> = (props) => { - const [showAlertNewFileCreated, setShowAlertNewFileCreated] = useState(false); - const newFile = () => { - if (props.file !== "default") { - const content = encodeURIComponent(AppGeneral.getSpreadsheetContent()); - const data = props.store._getFile(props.file); - const file = new File( - (data as any).created, - new Date().toString(), - content, - props.file, - props.billType - ); - props.store._saveFile(file); - props.updateSelectedFile(props.file); - } - const msc = DATA["home"][AppGeneral.getDeviceType()]["msc"]; - AppGeneral.viewFile("default", JSON.stringify(msc)); - props.updateSelectedFile("default"); - setShowAlertNewFileCreated(true); - }; - - return ( - - { - newFile(); - // console.log("New file clicked"); - }} - /> - setShowAlertNewFileCreated(false)} - header="Alert Message" - message={"New file created!"} - buttons={["Ok"]} - /> - - ); -}; - -export default NewFile; diff --git a/Govt-Billing-React-Ad-Subscriptions/src/components/Storage/LocalStorage.ts b/Govt-Billing-React-Ad-Subscriptions/src/components/Storage/LocalStorage.ts deleted file mode 100644 index c0e2709..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/components/Storage/LocalStorage.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Preferences } from "@capacitor/preferences"; - -export class File { - created: string; - modified: string; - name: string; - content: string; - billType: number; - - constructor( - created: string, - modified: string, - content: string, - name: string, - billType: number - ) { - this.created = created; - this.modified = modified; - this.content = content; - this.name = name; - this.billType = billType; - } -} - -export class Local { - _saveFile = async (file: File) => { - let data = { - created: file.created, - modified: file.modified, - content: file.content, - name: file.name, - billType: file.billType, - }; - await Preferences.set({ - key: file.name, - value: JSON.stringify(data), - }); - }; - - _getFile = async (name: string) => { - const rawData = await Preferences.get({ key: name }); - return JSON.parse(rawData.value); - }; - - _getAllFiles = async () => { - let arr = {}; - const { keys } = await Preferences.keys(); - for (let i = 0; i < keys.length; i++) { - let fname = keys[i]; - const data = await this._getFile(fname); - arr[fname] = (data as any).modified; - } - return arr; - }; - - _deleteFile = async (name: string) => { - await Preferences.remove({ key: name }); - }; - - _checkKey = async (key: string) => { - const { keys } = await Preferences.keys(); - if (keys.includes(key, 0)) { - return true; - } else { - return false; - } - }; -} diff --git a/Govt-Billing-React-Ad-Subscriptions/src/components/socialcalc/aspiring/SocialCalc.js b/Govt-Billing-React-Ad-Subscriptions/src/components/socialcalc/aspiring/SocialCalc.js deleted file mode 100644 index f82469e..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/components/socialcalc/aspiring/SocialCalc.js +++ /dev/null @@ -1,32423 +0,0 @@ -/* eslint-disable */ -// Taken from https://github.com/umdjs/umd/blob/master/templates/returnExports.js -// (c) by The UMD contributors -// MIT License: https://github.com/umdjs/umd/blob/master/LICENSE.md -(function (root, factory) { - if (typeof define === "function" && define.amd) { - // AMD. Register as an anonymous module. - define([], function () { - return (root.SocialCalc = factory.call(root, root)); - }); - } else if (typeof module === "object" && module.exports) { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = root.SocialCalc = factory.call(root, root); - } else { - // Browser globals (root is window) - root.SocialCalc = factory.call(root, root); - } -})(typeof self !== "undefined" ? self : this, function (window) { - // console.log(root) - // console.log(window) - var window = this; - var SocialCalc = {}; - - // - /* -// The module of the SocialCalc package with customizable constants, strings, etc. -// This is where most of the common localizations are done. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - // - /* -// The module of the SocialCalc package with customizable constants, strings, etc. -// This is where most of the common localizations are done. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; - - // ************************************* - // - // TO LEARN HOW TO LOCALIZE OR CUSTOMIZE SOCIALCALC, PLEASE READ THIS: - // - // The constants are all properties of the SocialCalc.Constants object. - // They are grouped here by what they are for, which module uses them, etc. - // - // Properties whose names start with "s_" are strings, or arrays of strings, - // that are good candidates for translation from the English. - // - // Other properties relate to visual settings, localization parameters, etc. - // - // These values are not used when SocialCalc modules are first loaded. - // They may be modified before the first use of the routines that use them, - // e.g., before creating SocialCalc objects. - // - // The exceptions are: - // TooltipOffsetX and TooltipOffsetY, as described with their definitions. - // - // SocialCalc IS NOT DESIGNED FOR USE WITH A TRANSLATION FUNCTION each time a string - // is used. Instead, language translations may be done by modifying this object. - // - // To customize SocialCalc, you may either replace this file with a modified version - // or you can overwrite the values before use. An example would be to - // iterate over all the properties looking for names that start with "s_" and - // use some other mechanism to obtain a localized string and replace the values - // here with those translated values. - // - // There is also a function, SocialCalc.ConstantsSetClasses, that may be used - // to easily switch SocialCalc from using explicit CSS styles for many things - // to using CSS classes. See the function, below, for more information. - // - // ************************************* - - SocialCalc.Constants = { - // - // Main SocialCalc module, socialcalc-3.js: - // - - //*** Common Constants - - textdatadefaulttype: "t", // This sets the default type for text on reading source file - // It should normally be "t" - - //*** Common error messages - - s_BrowserNotSupported: "Browser not supported.", // error thrown if browser can't handle events like IE or Firefox. - s_InternalError: "Internal SocialCalc error (probably an internal bug): ", // hopefully unlikely, but a test failed - - //*** SocialCalc.ParseSheetSave - - // Errors thrown on unexpected value in save file: - - s_pssUnknownColType: "Unknown col type item", - s_pssUnknownRowType: "Unknown row type item", - s_pssUnknownLineType: "Unknown line type", - - //*** SocialCalc.CellFromStringParts - - // Error thrown on unexpected value in save file: - - s_cfspUnknownCellType: "Unknown cell type item", - - //*** SocialCalc.CanonicalizeSheet - - doCanonicalizeSheet: true, // if true, do the canonicalization calculations - - //*** ExecuteSheetCommand - - s_escUnknownSheetCmd: "Unknown sheet command: ", - s_escUnknownSetCoordCmd: "Unknown set coord command: ", - s_escUnknownCmd: "Unknown command: ", - - //*** SocialCalc.CheckAndCalcCell - - s_caccCircRef: "Circular reference to ", // circular reference found during recalc - - //*** SocialCalc.RenderContext - - defaultRowNameWidth: "30", // used to set minimum width of the row header column - a string in pixels - defaultAssumedRowHeight: 15, // used when guessing row heights - number - defaultCellIDPrefix: "cell_", // if non-null, each cell will render with an ID starting with this - - // Default sheet display values - - defaultCellLayout: "padding:2px 2px 1px 2px;vertical-align:top;", - defaultCellFontStyle: "normal normal", - defaultCellFontSize: "small", - defaultCellFontFamily: "Verdana,Arial,Helvetica,sans-serif", - - defaultPaneDividerWidth: "2", // a string - defaultPaneDividerHeight: "3", // a string - - defaultGridCSS: "1px solid #C0C0C0;", // used as style to set each border when grid enabled (was #ECECEC) - - defaultCommentClass: "", // class added to cells with non-null comments when grid enabled - defaultCommentStyle: - "background-repeat:no-repeat;background-position:top right;background-image:url(www/assets/images/sc_commentbg.gif);", // style added to cells with non-null comments when grid enabled - defaultCommentNoGridClass: "", // class added to cells with non-null comments when grid not enabled - defaultCommentNoGridStyle: "", // style added to cells with non-null comments when grid not enabled - - defaultColWidth: "80", // text - defaultMinimumColWidth: 10, // numeric - - // For each of the following default sheet display values at least one of class and/or style are needed - - defaultHighlightTypeCursorClass: "", - // defaultHighlightTypeCursorStyle: "color:#FFF;backgroundColor:#A6A6A6;", - defaultHighlightTypeCursorStyle: "", - defaultHighlightTypeRangeClass: "", - //defaultHighlightTypeRangeStyle: "color:#000;backgroundColor:#E5E5E5;", - defaultHighlightTypeRangeStyle: "", - - defaultColnameClass: "", // regular column heading letters, needs a cursor property - defaultColnameStyle: - "font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;", - defaultSelectedColnameClass: "", // column with selected cell, needs a cursor property - defaultSelectedColnameStyle: - "font-size:small;text-align:center;color:#FFFFFF;background-color:#404040;cursor:e-resize;", - defaultRownameClass: "", // regular row heading numbers - defaultRownameStyle: - "font-size:small;text-align:right;color:#FFFFFF;background-color:#808080;", - defaultSelectedRownameClass: "", // column with selected cell, needs a cursor property - defaultSelectedRownameStyle: - "font-size:small;text-align:right;color:#FFFFFF;background-color:#404040;", - defaultUpperLeftClass: "", // Corner cell in upper left - defaultUpperLeftStyle: - "font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;", - defaultSkippedCellClass: "", // used if present for spanned cells peeking into a pane (at least one of class/style needed) - defaultSkippedCellStyle: "font-size:small;background-color:#CCC", // used if present - defaultPaneDividerClass: "", // used if present for the look of the space between panes (at least one of class/style needed) - defaultPaneDividerStyle: - "font-size:small;background-color:#C0C0C0;padding:0px;", // used if present - - s_rcMissingSheet: "Render Context must have a sheet object", // unlikely thrown error - - //*** SocialCalc.format_text_for_display - - defaultLinkFormatString: - 'Link', // used for format "text-link"; you could make this an img tag if desired - // defaultLinkFormatString: 'Link out', - defaultPageLinkFormatString: - 'Page', // used for format "text-link"; you could make this an img tag if desired - - //*** SocialCalc.format_number_for_display - - defaultFormatdt: "d-mmm-yyyy h:mm:ss", - defaultFormatd: "d-mmm-yyyy", - defaultFormatt: "[h]:mm:ss", - defaultDisplayTRUE: "TRUE", // how TRUE shows when rendered - defaultDisplayFALSE: "FALSE", - - // - // SocialCalc Table Editor module, socialcalctableeditor.js: - // - - //*** SocialCalc.TableEditor - - defaultImagePrefix: "www/assets/images/sc_", // URL prefix for images (e.g., "/www/assets/images/sc") - defaultTableEditorIDPrefix: "te_", // if present, many TableEditor elements are assigned IDs with this prefix - defaultPageUpDnAmount: 15, // number of rows to move cursor on PgUp/PgDn keys (numeric) - - AllowCtrlS: true, // turns on Ctrl-S trapdoor for setting custom numeric formats and commands if true - - //*** SocialCalc.CreateTableEditor - - defaultTableControlThickness: 0, // the short size for the scrollbars, etc. (numeric in pixels) - cteGriddivClass: "", // if present, the class for the TableEditor griddiv element - - //** SocialCalc.EditorGetStatuslineString -- strings shown on status line - - s_statusline_executing: "Executing...", - s_statusline_displaying: "Displaying...", - s_statusline_ordering: "Ordering...", - s_statusline_calculating: "Calculating...", - s_statusline_calculatingls: "Calculating... Loading Sheet...", - s_statusline_doingserverfunc: "doing server function ", - s_statusline_incell: " in cell ", - s_statusline_calcstart: "Calculation start...", - s_statusline_sum: "SUM", - s_statusline_recalcneeded: - '(Recalc needed)', - s_statusline_circref: 'Circular reference: ', - - //** SocialCalc.InputBoxDisplayCellContents - - s_inputboxdisplaymultilinetext: - "[Multi-line text: Click icon on right to edit]", - - //** SocialCalc.InputEcho - - defaultInputEchoClass: "", // if present, the class of the popup inputEcho div - defaultInputEchoStyle: - "filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;border:1px solid #884;" + - "fontSize:small;padding:2px 10px 1px 2px;cursor:default;", // if present, pseudo style - defaultInputEchoPromptClass: "", // if present, the class of the popup inputEcho div - defaultInputEchoPromptStyle: - "filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;" + - "borderLeft:1px solid #884;borderRight:1px solid #884;borderBottom:1px solid #884;" + - "fontSize:small;fontStyle:italic;padding:2px 10px 1px 2px;cursor:default;", // if present, pseudo style - - //** SocialCalc.InputEchoText - - ietUnknownFunction: "Unknown function ", // displayed when typing "=unknown(" - - //** SocialCalc.CellHandles - - CH_radius1: 29.0, // extent of inner circle within 90px image - CH_radius2: 41.0, // extent of outer circle within 90px image - s_CHfillAllTooltip: "Fill Contents and Formats Down/Right", // tooltip for fill all handle - s_CHfillContentsTooltip: "Fill Contents Only Down/Right", // tooltip for fill formulas handle - s_CHmovePasteAllTooltip: "Move Contents and Formats", // etc. - s_CHmovePasteContentsTooltip: "Move Contents Only", - s_CHmoveInsertAllTooltip: "Slide Contents and Formats within Row/Col", - s_CHmoveInsertContentsTooltip: "Slide Contents within Row/Col", - s_CHindicatorOperationLookup: { - Fill: "Fill", - FillC: "Fill Contents", - Move: "Move", - MoveI: "Slide", - MoveC: "Move Contents", - MoveIC: "Slide Contents", - }, // short form of operation to follow drag - s_CHindicatorDirectionLookup: { - Down: " Down", - Right: " Right", - Horizontal: " Horizontal", - Vertical: " Vertical", - }, // direction that modifies operation during drag - - //*** SocialCalc.TableControl - - defaultTCSliderThickness: 9, // length of pane slider (numeric in pixels) - defaultTCButtonThickness: 20, // length of scroll +/- buttons (numeric in pixels) - defaultTCThumbThickness: 15, // length of thumb (numeric in pixels) - - //*** SocialCalc.CreateTableControl - - TCmainStyle: "backgroundColor:#EEE;", // if present, pseudo style (text-align is textAlign) for main div of a table control - TCmainClass: "", // if present, the CSS class of the main div for a table control - TCendcapStyle: "backgroundColor:#FFF;", // backgroundColor may be used while waiting for image that may not come - TCendcapClass: "", - TCpanesliderStyle: "backgroundColor:#CCC;", - TCpanesliderClass: "", - s_panesliderTooltiph: "Drag to lock pane vertically", // tooltip for horizontal table control pane slider - s_panesliderTooltipv: "Drag to lock pane horizontally", - TClessbuttonStyle: "backgroundColor:#AAA;", - TClessbuttonClass: "", - TClessbuttonRepeatWait: 300, // in milliseconds - TClessbuttonRepeatInterval: 20, //100, // in milliseconds - TCmorebuttonStyle: "backgroundColor:#AAA;", - TCmorebuttonClass: "", - TCmorebuttonRepeatWait: 300, // in milliseconds - TCmorebuttonRepeatInterval: 20, //100, // in milliseconds - TCscrollareaStyle: "backgroundColor:#DDD;", - TCscrollareaClass: "", - TCscrollareaRepeatWait: 500, // in milliseconds - TCscrollareaRepeatInterval: 100, // in milliseconds - TCthumbClass: "", - TCthumbStyle: "backgroundColor:#CCC;", - - //*** SocialCalc.TCPSDragFunctionStart - - TCPStrackinglineClass: "", // at least one of class/style for pane slider tracking line display in table control - TCPStrackinglineStyle: "overflow:hidden;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCPStrackinglineThickness: "2px", // narrow dimension of trackling line (string with units) - - //*** SocialCalc.TCTDragFunctionStart - - TCTDFSthumbstatusvClass: "", // at least one of class/style for vertical thumb dragging status display in table control - TCTDFSthumbstatusvStyle: - "height:20px;width:auto;border:3px solid #808080;overflow:hidden;" + - "backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCTDFSthumbstatushClass: "", // at least one of class/style for horizontal thumb dragging status display in table control - TCTDFSthumbstatushStyle: - "height:20px;width:auto;border:1px solid black;padding:2px;" + - "backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCTDFSthumbstatusrownumClass: "", // at least one of class/style for thumb dragging status display in table control - TCTDFSthumbstatusrownumStyle: - "color:#FFF;background-color:#808080;font-size:small;white-space:nowrap;padding:3px;", // if present, real style - TCTDFStopOffsetv: 0, // offsets for thumbstatus display while dragging - TCTDFSleftOffsetv: -80, - s_TCTDFthumbstatusPrefixv: "Row ", // Text Control Drag Function text before row number - TCTDFStopOffseth: -30, - TCTDFSleftOffseth: 0, - s_TCTDFthumbstatusPrefixh: "Col ", // Text Control Drag Function text before col number - - //*** SocialCalc.TooltipInfo - - // Note: These two values are used to set the TooltipInfo initial values when the code is first read in. - // Modifying them here after loading has no effect -- you need to modify SocialCalc.TooltipInfo directly - // to dynamically set them. This is different than most other constants which may be modified until use. - - TooltipOffsetX: 2, // offset in pixels from mouse position (to right on left side of screen, to left on right) - TooltipOffsetY: 10, // offset in pixels above mouse position for lower edge - - //*** SocialCalc.TooltipDisplay - - TDpopupElementClass: "", // at least one of class/style for tooltip display - TDpopupElementStyle: - "border:1px solid black;padding:1px 2px 2px 2px;textAlign:center;backgroundColor:#FFF;" + - "fontSize:7pt;fontFamily:Verdana,Arial,Helvetica,sans-serif;" + - "position:absolute;width:auto;zIndex:110;", - // if present, pseudo style (text-align is textAlign) - - // - // SocialCalc Spreadsheet Control module, socialcalcspreadsheetcontrol.js: - // - - //*** SocialCalc.SpreadsheetControl - - SCToolbarbackground: "background-color:#404040;", - SCTabbackground: "background-color:#CCC;", - SCTabselectedCSS: - "font-size:small;padding:6px 30px 6px 8px;color:#FFF;background-color:#404040;cursor:default;border-right:1px solid #CCC;", - SCTabplainCSS: - "font-size:small;padding:6px 30px 6px 8px;color:#FFF;background-color:#808080;cursor:default;border-right:1px solid #CCC;", - SCToolbartext: - "font-size:x-small;font-weight:bold;color:#FFF;padding-bottom:4px;", - - SCFormulabarheight: 0, // in pixels, will contain a text input box - - SCStatuslineheight: 20, // in pixels - SCStatuslineCSS: "font-size:10px;padding:3px 0px;", - - // workbook - doWorkBook: true, - SCSheetBarHeight: 25, - SCSheetBarBackground: "background-color:#CCC;", - SCSheetBarCSS: "background-color:#CCC;", - SCSheetBarWidth: "70%", - - SCCellHandlesDisable: true, - SCNoInputEcho: true, // do we need an input echo ? - s_inputboxdisplaynoteditable: "[not editable]", - SCNoRowName: true, - SCNoRanging: true, - SCNoQuoteInInputBox: true, - // Constants for default Format tab (settings) - // - // *** EVEN THOUGH THESE DON'T START WITH s_: *** - // - // These should be carefully checked for localization. Make sure you understand what they do and how they work! - // The first part of "first:second|first:second|..." is what is displayed and the second is the value to be used. - // The value is normally not translated -- only the displayed part. The [cancel], [break], etc., are not translated -- - // they are commands to SocialCalc.SettingsControls.PopupListInitialize - - SCFormatNumberFormats: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Auto w/ commas!:[,]General|[break]:|" + - "00:00|000:000|0000:0000|00000:00000|[break]:|%loc!Formula!:formula|%loc!Hidden!:hidden|[newcol]:" + - "1234:0|1,234:#,##0|1,234.5:#,##0.0|1,234.56:#,##0.00|1,234.567:#,##0.000|1,234.5678:#,##0.0000|" + - "[break]:|1,234%:#,##0%|1,234.5%:#,##0.0%|1,234.56%:#,##0.00%|" + - "[newcol]:|$1,234:$#,##0|$1,234.5:$#,##0.0|$1,234.56:$#,##0.00|[break]:|" + - "(1,234):#,##0_);(#,##0)|(1,234.5):#,##0.0_);(#,##0.0)|(1,234.56):#,##0.00_);(#,##0.00)|[break]:|" + - "($1,234):#,##0_);($#,##0)|($1,234.5):$#,##0.0_);($#,##0.0)|($1,234.56):$#,##0.00_);($#,##0.00)|" + - "[newcol]:|1/4/06:m/d/yy|01/04/2006:mm/dd/yyyy|2006-01-04:yyyy-mm-dd|4-Jan-06:d-mmm-yy|04-Jan-2006:dd-mmm-yyyy|January 4, 2006:mmmm d, yyyy|" + - "[break]:|1\\c23:h:mm|1\\c23 PM:h:mm AM/PM|1\\c23\\c45:h:mm:ss|01\\c23\\c45:hh:mm:ss|26\\c23 (h\\cm):[hh]:mm|69\\c45 (m\\cs):[mm]:ss|69 (s):[ss]|" + - "[newcol]:|2006-01-04 01\\c23\\c45:yyyy-mm-dd hh:mm:ss|January 4, 2006:mmmm d, yyyy hh:mm:ss|Wed:ddd|Wednesday:dddd|", - SCFormatTextFormats: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Plain Text!:text-plain|" + - "HTML:text-html|%loc!Wikitext!:text-wiki|%loc!Link!:text-link|%loc!Formula!:formula|%loc!Hidden!:hidden|", - SCFormatPadsizes: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!No padding!:0px|" + - "[newcol]:|1 pixel:1px|2 pixels:2px|3 pixels:3px|4 pixels:4px|5 pixels:5px|" + - "6 pixels:6px|7 pixels:7px|8 pixels:8px|[newcol]:|9 pixels:9px|10 pixels:10px|11 pixels:11px|" + - "12 pixels:12px|13 pixels:13px|14 pixels:14px|16 pixels:16px|" + - "18 pixels:18px|[newcol]:|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|", - SCFormatFontsizes: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|X-Small:x-small|Small:small|Medium:medium|Large:large|X-Large:x-large|" + - "[newcol]:|6pt:6pt|7pt:7pt|8pt:8pt|9pt:9pt|10pt:10pt|11pt:11pt|12pt:12pt|14pt:14pt|16pt:16pt|" + - "[newcol]:|18pt:18pt|20pt:20pt|22pt:22pt|24pt:24pt|28pt:28pt|36pt:36pt|48pt:48pt|72pt:72pt|" + - "[newcol]:|8 pixels:8px|9 pixels:9px|10 pixels:10px|11 pixels:11px|" + - "12 pixels:12px|13 pixels:13px|14 pixels:14px|[newcol]:|16 pixels:16px|" + - "18 pixels:18px|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|", - SCFormatFontfamilies: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|Verdana:Verdana,Arial,Helvetica,sans-serif|" + - "Arial:arial,helvetica,sans-serif|Courier:'Courier New',Courier,monospace|", - SCFormatFontlook: - "[cancel]:|[break]:|%loc!Default!:|%loc!Normal!:normal normal|%loc!Bold!:normal bold|%loc!Italic!:italic normal|" + - "%loc!Bold Italic!:italic bold", - SCFormatTextAlignhoriz: - "[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|", - SCFormatNumberAlignhoriz: - "[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|", - SCFormatAlignVertical: - "[cancel]:|[break]:|%loc!Default!:|%loc!Top!:top|%loc!Middle!:middle|%loc!Bottom!:bottom|", - SCFormatColwidth: - "[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|" + - "20 pixels:20|40:40|60:60|80:80|100:100|120:120|140:140|160:160|" + - "[newcol]:|180 pixels:180|200:200|220:220|240:240|260:260|280:280|300:300|", - SCFormatRecalc: "[cancel]:|[break]:|%loc!Auto!:|%loc!Manual!:off|", - - //*** SocialCalc.InitializeSpreadsheetControl - - ISCButtonBorderNormal: "#404040", - ISCButtonBorderHover: "#999", - ISCButtonBorderDown: "#FFF", - ISCButtonDownBackground: "#888", - - //*** SocialCalc.SettingsControls.PopupListInitialize - - s_PopupListCancel: "[Cancel]", - s_PopupListCustom: "Custom", - - // *** - // - // s_loc_ constants accessed by SocialCalc.LocalizeString and SocialCalc.LocalizeSubstrings - // - // Used extensively by socialcalcspreadsheetcontrol.js - // - // *** - - s_loc_align_center: "Align Center", - s_loc_align_left: "Align Left", - s_loc_align_right: "Align Right", - s_loc_alignment: "Alignment", - s_loc_audit: "Audit", - s_loc_audit_trail_this_session: "Audit Trail This Session", - s_loc_auto: "Auto", - s_loc_auto_sum: "Auto Sum", - s_loc_auto_wX_commas: "Auto w/ commas", - s_loc_automatic: "Automatic", - s_loc_background: "Background", - s_loc_bold: "Bold", - s_loc_bold_XampX_italics: "Bold & Italics", - s_loc_bold_italic: "Bold Italic", - s_loc_borders: "Borders", - s_loc_borders_off: "Borders Off", - s_loc_borders_on: "Borders On", - s_loc_bottom: "Bottom", - s_loc_bottom_border: "Bottom Border", - s_loc_cell_settings: "CELL SETTINGS", - s_loc_csv_format: "CSV format", - s_loc_cancel: "Cancel", - s_loc_category: "Category", - s_loc_center: "Center", - s_loc_clear: "Clear", - s_loc_clear_socialcalc_clipboard: "Clear SocialCalc Clipboard", - s_loc_clipboard: "Clipboard", - s_loc_color: "Color", - s_loc_column_: "Column ", - s_loc_comment: "Comment", - s_loc_copy: "Copy", - s_loc_custom: "Custom", - s_loc_cut: "Cut", - s_loc_default: "Default", - s_loc_default_alignment: "Default Alignment", - s_loc_default_column_width: "Default Column Width", - s_loc_default_font: "Default Font", - s_loc_default_format: "Default Format", - s_loc_default_padding: "Default Padding", - s_loc_delete: "Delete", - s_loc_delete_column: "Delete Column", - s_loc_delete_contents: "Delete Contents", - s_loc_delete_row: "Delete Row", - s_loc_description: "Description", - s_loc_display_clipboard_in: "Display Clipboard in", - s_loc_down: "Down", - s_loc_edit: "Edit", - s_loc_existing_names: "Existing Names", - s_loc_family: "Family", - s_loc_fill_down: "Fill Down", - s_loc_fill_right: "Fill Right", - s_loc_font: "Font", - s_loc_format: "Format", - s_loc_formula: "Formula", - s_loc_function_list: "Function List", - s_loc_functions: "Functions", - s_loc_grid: "Grid", - s_loc_hidden: "Hidden", - s_loc_horizontal: "Horizontal", - s_loc_insert_column: "Insert Column", - s_loc_insert_row: "Insert Row", - s_loc_italic: "Italic", - s_loc_last_sort: "Last Sort", - s_loc_left: "Left", - s_loc_left_border: "Left Border", - s_loc_link: "Link", - s_loc_link_input_box: "Link Input Box", - s_loc_list: "List", - s_loc_load_socialcalc_clipboard_with_this: - "Load SocialCalc Clipboard With This", - s_loc_major_sort: "Major Sort", - s_loc_manual: "Manual", - s_loc_merge_cells: "Merge Cells", - s_loc_middle: "Middle", - s_loc_minor_sort: "Minor Sort", - s_loc_move_insert: "Move Insert", - s_loc_move_paste: "Move Paste", - s_loc_multiXline_input_box: "Multi-line Input Box", - s_loc_name: "Name", - s_loc_names: "Names", - s_loc_no_padding: "No padding", - s_loc_normal: "Normal", - s_loc_number: "Number", - s_loc_number_horizontal: "Number Horizontal", - s_loc_ok: "OK", - s_loc_padding: "Padding", - s_loc_page_name: "Page Name", - s_loc_paste: "Paste", - s_loc_paste_formats: "Paste Formats", - s_loc_plain_text: "Plain Text", - s_loc_recalc: "Recalc", - s_loc_recalculation: "Recalculation", - s_loc_redo: "Redo", - s_loc_right: "Right", - s_loc_right_border: "Right Border", - s_loc_sheet_settings: "SHEET SETTINGS", - s_loc_save: "Save", - s_loc_save_to: "Save to", - s_loc_set_cell_contents: "Set Cell Contents", - s_loc_set_cells_to_sort: "Set Cells To Sort", - s_loc_set_value_to: "Set Value To", - s_loc_set_to_link_format: "Set to Link format", - s_loc_setXclear_move_from: "Set/Clear Move From", - s_loc_show_cell_settings: "Show Cell Settings", - s_loc_show_sheet_settings: "Show Sheet Settings", - s_loc_show_in_new_browser_window: "Show in new browser window", - s_loc_size: "Size", - s_loc_socialcalcXsave_format: "SocialCalc-save format", - s_loc_sort: "Sort", - s_loc_sort_: "Sort ", - s_loc_sort_cells: "Sort Cells", - s_loc_swap_colors: "Swap Colors", - s_loc_tabXdelimited_format: "Tab-delimited format", - s_loc_text: "Text", - s_loc_text_horizontal: "Text Horizontal", - s_loc_this_is_aXbrXsample: "This is a
    sample", - s_loc_top: "Top", - s_loc_top_border: "Top Border", - s_loc_undone_steps: "UNDONE STEPS", - s_loc_url: "URL", - s_loc_undo: "Undo", - s_loc_unmerge_cells: "Unmerge Cells", - s_loc_up: "Up", - s_loc_value: "Value", - s_loc_vertical: "Vertical", - s_loc_wikitext: "Wikitext", - s_loc_workspace: "Workspace", - s_loc_XnewX: "[New]", - s_loc_XnoneX: "[None]", - s_loc_Xselect_rangeX: "[select range]", - - // - // SocialCalc Spreadsheet Viewer module, socialcalcviewer.js: - // - - //*** SocialCalc.SpreadsheetViewer - - SVStatuslineheight: 20, // in pixels - SVStatuslineCSS: "font-size:10px;padding:3px 0px;", - - // - // SocialCalc Format Number module, formatnumber2.js: - // - - FormatNumber_separatorchar: ",", // the thousands separator character when formatting numbers for display - FormatNumber_decimalchar: ".", // the decimal separator character when formatting numbers for display - FormatNumber_defaultCurrency: "$", // the currency string used if none specified - - // The following constants are arrays of strings with the short (3 character) and full names of days and months - - s_FormatNumber_daynames: [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - ], - s_FormatNumber_daynames3: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - s_FormatNumber_monthnames: [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ], - s_FormatNumber_monthnames3: [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - ], - s_FormatNumber_am: "AM", - s_FormatNumber_am1: "A", - s_FormatNumber_pm: "PM", - s_FormatNumber_pm1: "P", - - // - // SocialCalc Spreadsheet Formula module, formula1.js: - // - - s_parseerrexponent: "Improperly formed number exponent", - s_parseerrchar: "Unexpected character in formula", - s_parseerrstring: "Improperly formed string", - s_parseerrspecialvalue: "Improperly formed special value", - s_parseerrtwoops: - "Error in formula (two operators inappropriately in a row)", - s_parseerrmissingopenparen: - "Missing open parenthesis in list with comma(s). ", - s_parseerrcloseparennoopen: - "Closing parenthesis without open parenthesis. ", - s_parseerrmissingcloseparen: "Missing close parenthesis. ", - s_parseerrmissingoperand: "Missing operand. ", - s_parseerrerrorinformula: "Error in formula.", - s_calcerrerrorvalueinformula: "Error value in formula", - s_parseerrerrorinformulabadval: "Error in formula resulting in bad value", - s_formularangeresult: "Formula results in range value:", - s_calcerrnumericnan: "Formula results in an bad numeric value", - s_calcerrnumericoverflow: "Numeric overflow", - s_sheetunavailable: "Sheet unavailable:", // when FindSheetInCache returns null - s_calcerrcellrefmissing: "Cell reference missing when expected.", - s_calcerrsheetnamemissing: "Sheet name missing when expected.", - s_circularnameref: "Circular name reference to name", - s_calcerrunknownname: "Unknown name", - s_calcerrincorrectargstofunction: "Incorrect arguments to function", - s_sheetfuncunknownfunction: "Unknown function", - s_sheetfunclnarg: "LN argument must be greater than 0", - s_sheetfunclog10arg: "LOG10 argument must be greater than 0", - s_sheetfunclogsecondarg: - "LOG second argument must be numeric greater than 0", - s_sheetfunclogfirstarg: "LOG first argument must be greater than 0", - s_sheetfuncroundsecondarg: "ROUND second argument must be numeric", - s_sheetfuncddblife: "DDB life must be greater than 1", - s_sheetfuncslnlife: "SLN life must be greater than 1", - - // Function definition text - - s_fdef_ABS: "Absolute value function. ", - s_fdef_ACOS: "Trigonometric arccosine function. ", - s_fdef_AND: "True if all arguments are true. ", - s_fdef_ASIN: "Trigonometric arcsine function. ", - s_fdef_ATAN: "Trigonometric arctan function. ", - s_fdef_ATAN2: "Trigonometric arc tangent function (result is in radians). ", - s_fdef_AVERAGE: "Averages the values. ", - s_fdef_CHOOSE: - "Returns the value specified by the index. The values may be ranges of cells. ", - s_fdef_COLUMNS: "Returns the number of columns in the range. ", - s_fdef_COS: "Trigonometric cosine function (value is in radians). ", - s_fdef_COUNT: - "Counts the number of numeric values, not blank, text, or error. ", - s_fdef_COUNTA: "Counts the number of non-blank values. ", - s_fdef_COUNTBLANK: - 'Counts the number of blank values. (Note: "" is not blank.) ', - s_fdef_COUNTIF: - '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). ', - s_fdef_DATE: - '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. ', - s_fdef_DAVERAGE: - "Averages the values in the specified field in records that meet the criteria. ", - s_fdef_DAY: "Returns the day of month for a date value. ", - s_fdef_DCOUNT: - "Counts the number of numeric values, not blank, text, or error, in the specified field in records that meet the criteria. ", - s_fdef_DCOUNTA: - "Counts the number of non-blank values in the specified field in records that meet the criteria. ", - s_fdef_DDB: - "Returns the amount of depreciation at the given period of time (the default factor is 2 for double-declining balance). ", - s_fdef_DEGREES: "Converts value in radians into degrees. ", - s_fdef_DGET: - "Returns the value of the specified field in the single record that meets the criteria. ", - s_fdef_DMAX: - "Returns the maximum of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DMIN: - "Returns the maximum of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DPRODUCT: - "Returns the result of multiplying the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DSTDEV: - "Returns the sample standard deviation of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DSTDEVP: - "Returns the standard deviation of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DSUM: - "Returns the sum of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DVAR: - "Returns the sample variance of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_DVARP: - "Returns the variance of the numeric values in the specified field in records that meet the criteria. ", - s_fdef_EVEN: - "Rounds the value up in magnitude to the nearest even integer. ", - s_fdef_EXACT: - 'Returns "true" if the values are exactly the same, including case, type, etc. ', - s_fdef_EXP: "Returns e raised to the value power. ", - s_fdef_FACT: "Returns factorial of the value. ", - s_fdef_FALSE: 'Returns the logical value "false". ', - s_fdef_FIND: - 'Returns the starting position within string2 of the first occurrence of string1 at or after "start". If start is omitted, 1 is assumed. ', - s_fdef_FV: - "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). ", - s_fdef_HLOOKUP: - "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. ", - s_fdef_HOUR: "Returns the hour portion of a time or date/time value. ", - s_fdef_IF: - "Results in true-value if logical-expression is TRUE or non-zero, otherwise results in false-value. ", - s_fdef_INDEX: - "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)). ", - s_fdef_INT: - "Returns the value rounded down to the nearest integer (towards -infinity). ", - s_fdef_IRR: - "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%). ", - s_fdef_ISBLANK: - 'Returns "true" if the value is a reference to a blank cell. ', - s_fdef_ISERR: - 'Returns "true" if the value is of type "Error" but not "NA". ', - s_fdef_ISERROR: 'Returns "true" if the value is of type "Error". ', - s_fdef_ISLOGICAL: - 'Returns "true" if the value is of type "Logical" (true/false). ', - s_fdef_ISNA: 'Returns "true" if the value is the error type "NA". ', - s_fdef_ISNONTEXT: 'Returns "true" if the value is not of type "Text". ', - s_fdef_ISNUMBER: - 'Returns "true" if the value is of type "Number" (including logical values). ', - s_fdef_ISTEXT: 'Returns "true" if the value is of type "Text". ', - s_fdef_LEFT: - "Returns the specified number of characters from the text value. If count is omitted, 1 is assumed. ", - s_fdef_LEN: "Returns the number of characters in the text value. ", - s_fdef_LN: "Returns the natural logarithm of the value. ", - s_fdef_LOG: "Returns the logarithm of the value using the specified base. ", - s_fdef_LOG10: "Returns the base 10 logarithm of the value. ", - s_fdef_LOWER: - "Returns the text value with all uppercase characters converted to lowercase. ", - s_fdef_MATCH: - "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. ", - s_fdef_MAX: "Returns the maximum of the numeric values. ", - s_fdef_MID: - "Returns the specified number of characters from the text value starting from the specified position. ", - s_fdef_MIN: "Returns the minimum of the numeric values. ", - s_fdef_MINUTE: "Returns the minute portion of a time or date/time value. ", - s_fdef_MOD: - "Returns the remainder of the first value divided by the second. ", - s_fdef_MONTH: "Returns the month part of a date value. ", - s_fdef_N: "Returns the value if it is a numeric value otherwise an error. ", - s_fdef_NA: - "Returns the #N/A error value which propagates through most operations. ", - s_fdef_NOT: "Returns FALSE if value is true, and TRUE if it is false. ", - s_fdef_NOW: "Returns the current date/time. ", - s_fdef_NPER: - "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. ", - s_fdef_NPV: - "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. ", - s_fdef_ODD: "Rounds the value up in magnitude to the nearest odd integer. ", - s_fdef_OR: "True if any argument is true ", - s_fdef_PI: "The value 3.1415926... ", - s_fdef_PMT: - "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). ", - s_fdef_POWER: "Returns the first value raised to the second value power. ", - s_fdef_PRODUCT: "Returns the result of multiplying the numeric values. ", - s_fdef_PROPER: - "Returns the text value with the first letter of each word converted to uppercase and the others to lowercase. ", - s_fdef_PV: - "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). ", - s_fdef_RADIANS: "Converts value in degrees into radians. ", - s_fdef_RATE: - "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%). ", - s_fdef_REPLACE: - "Returns text1 with the specified number of characters starting from the specified position replaced by text2. ", - s_fdef_REPT: "Returns the text repeated the specified number of times. ", - s_fdef_RIGHT: - "Returns the specified number of characters from the text value starting from the end. If count is omitted, 1 is assumed. ", - s_fdef_ROUND: - "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). ", - s_fdef_ROWS: "Returns the number of rows in the range. ", - s_fdef_SECOND: - "Returns the second portion of a time or date/time value (truncated to an integer). ", - s_fdef_SIN: "Trigonometric sine function (value is in radians) ", - s_fdef_SLN: - "Returns the amount of depreciation at each period of time using the straight-line method. ", - s_fdef_SQRT: "Square root of the value ", - s_fdef_STDEV: - "Returns the sample standard deviation of the numeric values. ", - s_fdef_STDEVP: "Returns the standard deviation of the numeric values. ", - s_fdef_SUBSTITUTE: - 'Returns text1 with the all occurrences of oldtext replaced by newtext. If "occurrence" is present, then only that occurrence is replaced. ', - s_fdef_SUM: - "Adds the numeric values. The values to the sum function may be ranges in the form similar to A1:B5. ", - s_fdef_SUMIF: - '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. ', - s_fdef_SYD: "Depreciation by Sum of Year's Digits method. ", - s_fdef_T: "Returns the text value or else a null string. ", - s_fdef_TAN: "Trigonometric tangent function (value is in radians) ", - s_fdef_TIME: - "Returns the time value given the specified hour, minute, and second. ", - s_fdef_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. ', - s_fdef_TRIM: - "Returns the text value with leading, trailing, and repeated spaces removed. ", - s_fdef_TRUE: 'Returns the logical value "true". ', - s_fdef_TRUNC: - "Truncates the value to the specified number of decimal places. If precision is negative, truncate to powers of 10. ", - s_fdef_UPPER: - "Returns the text value with all lowercase characters converted to uppercase. ", - s_fdef_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. ", - s_fdef_VAR: "Returns the sample variance of the numeric values. ", - s_fdef_VARP: "Returns the variance of the numeric values. ", - s_fdef_VLOOKUP: - "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. ", - s_fdef_WEEKDAY: - "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. ", - s_fdef_YEAR: "Returns the year part of a date value. ", - - s_farg_v: "value", - s_farg_vn: "value1, value2, ...", - s_farg_xy: "valueX, valueY", - s_farg_choose: "index, value1, value2, ...", - s_farg_range: "range", - s_farg_rangec: "range, criteria", - s_farg_date: "year, month, day", - s_farg_dfunc: "databaserange, fieldname, criteriarange", - s_farg_ddb: "cost, salvage, lifetime, period [, factor]", - s_farg_find: "string1, string2 [, start]", - s_farg_fv: "rate, n, payment, [pv, [paytype]]", - s_farg_hlookup: "value, range, row, [rangelookup]", - s_farg_iffunc: "logical-expression, true-value, false-value", - s_farg_index: "range, rownum, colnum", - s_farg_irr: "range, [guess]", - s_farg_tc: "text, count", - s_farg_log: "value, base", - s_farg_match: "value, range, [rangelookup]", - s_farg_mid: "text, start, length", - s_farg_nper: "rate, payment, pv, [fv, [paytype]]", - s_farg_npv: "rate, value1, value2, ...", - s_farg_pmt: "rate, n, pv, [fv, [paytype]]", - s_farg_pv: "rate, n, payment, [fv, [paytype]]", - s_farg_rate: "n, payment, pv, [fv, [paytype, [guess]]]", - s_farg_replace: "text1, start, length, text2", - s_farg_vp: "value, [precision]", - s_farg_valpre: "value, precision", - s_farg_csl: "cost, salvage, lifetime", - s_farg_cslp: "cost, salvage, lifetime, period", - s_farg_subs: "text1, oldtext, newtext [, occurrence]", - s_farg_sumif: "range1, criteria [, range2]", - s_farg_hms: "hour, minute, second", - s_farg_txt: "text", - s_farg_vlookup: "value, range, col, [rangelookup]", - s_farg_weekday: "date, [type]", - s_farg_dt: "date", - - function_classlist: [ - "all", - "stat", - "lookup", - "datetime", - "financial", - "test", - "math", - "text", - ], // order of function classes - - s_fclass_all: "All", - s_fclass_stat: "Statistics", - s_fclass_lookup: "Lookup", - s_fclass_datetime: "Date & Time", - s_fclass_financial: "Financial", - s_fclass_test: "Test", - s_fclass_math: "Math", - s_fclass_text: "Text", - - lastone: null, - }; - - // Default classnames for use with SocialCalc.ConstantsSetClasses: - - SocialCalc.ConstantsDefaultClasses = { - defaultComment: "", - defaultCommentNoGrid: "", - defaultHighlightTypeCursor: "", - defaultHighlightTypeRange: "", - defaultColname: "", - defaultSelectedColname: "", - defaultRowname: "", - defaultSelectedRowname: "", - defaultUpperLeft: "", - defaultSkippedCell: "", - defaultPaneDivider: "", - cteGriddiv: "", // this one has no Style version with it - defaultInputEcho: { - classname: "", - style: "filter:alpha(opacity=90);opacity:.9;", - }, // so FireFox won't show warning - TCmain: "", - TCendcap: "", - TCpaneslider: "", - TClessbutton: "", - TCmorebutton: "", - TCscrollarea: "", - TCthumb: "", - TCPStrackingline: "", - TCTDFSthumbstatus: "", - TDpopupElement: "", - }; - - // - // SocialCalc.ConstantsSetClasses(prefix) - // - // This routine goes through all of the xyzClass/xyzStyle pairs and sets the Class to a default and - // turns off the Style, if present. The prefix is put before each default. - // The list of items to set is in SocialCalc.ConstantsDefaultClasses. The names there - // correspond to the "xyz" parts. If there is a value, it is the default to set. If the - // default is a null, no change is made. If the default is the null string (""), the - // name of the item is used (e.g., "defaultComment" would use the classname "defaultComment"). - // If the default is an object, then it expects {classname: classname, style: stylestring} - this - // lets you combine both. - // - - SocialCalc.ConstantsSetClasses = function (prefix) { - var defaults = SocialCalc.ConstantsDefaultClasses; - var scc = SocialCalc.Constants; - var item; - - prefix = prefix || ""; - - for (item in defaults) { - if (typeof defaults[item] == "string") { - scc[item + "Class"] = prefix + (defaults[item] || item); - if (scc[item + "Style"] !== undefined) { - scc[item + "Style"] = ""; - } - } else if (typeof defaults[item] == "object") { - scc[item + "Class"] = prefix + (defaults[item].classname || item); - scc[item + "Style"] = defaults[item].style; - } - } - }; - - // - // The main SocialCalc code module of the SocialCalc package - // - /* -// (c) Copyright 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - /* - -**** Overview **** - -This is the beginning of a library of routines for displaying and editing spreadsheet -data in a browser. The HTML that includes this does not need to have anything -specific to the spreadsheet or editor already present -- everything is dynamically -added to the DOM by this code, including the rendered sheet and any editing controls. - -The library has a few parts. This is the main SocialCalc code module. -Other parts are the Table Editor module, the Formula module, and the Format Number module. -Note: The Table Editor module is licensed under a different license than this module. - -The class/object style is derived from O'Reilly's JavaScript by Flanagan, 5th Edition, -section 9.3, page 157. - -All of the data, object definitions, functions, etc., are stored as properties of the SocialCalc -object so as not to clutter up the global variables nor conflict with other names. - -A design goal (not tested yet for success) is to make it possible to have more than one -spreadsheet active on a page, perhaps even open for editing. It is assumed, though, that -there is only one mouse and one keyboard (a good assumption on most PCs today but not in the -new "touch and surface world" Apple and Microsoft are working towards). - -The testing has been on Windows Firefox (2 and 3), -Internet Explorer (6 and 7), Opera (9.23 and mainly later), Mac Safari (3.1), and Mac Firefox (2.0.0.6). -There are small issues with Firefox before 2.0 (cosmetic with drag handles) and larger ones -with Opera before 9.5 (the Delete key isn't recognized in some cases -- the 9.5 version was still -in beta and this bug affects other products like GMail, I believe). - -The data is stored in a SocialCalc.Sheet object. The data is organized in a form similar to that -used by SocialCalc 1.1.0. There is a function for converting a normal SocialCalc spreadsheet -save data string (the spreadsheet part of a SocialCalc data file) into this internal form. - -The SocialCalc.RenderContext class provides methods for rendering a table into the DOM representing -part of the spreadsheet. It is assumed that the spreadsheet could possibly be very large -and that rendering the whole thing at once could be too time consuming. It is also set up so -that it might be possible to have some of the sheet data only be loaded on demand (such as by Ajax). -The rendering can render cells to the right and below the already active area of the spreadsheet -so that you can scroll to that "clean" area without explicitly doing "add row/column". The class also -does simple operations such as "scrolling" within that table. The table may optionally include -row and column headers and may be split into panes. Most of the code assumes any number of panes, -but only the rightmost pane has scrolling code. In normal operation there would be one or two -panes horizontally and vertically. The panes may start on any row/column, though a given row/column -should only appear in one pane at a time (not all code enforces this, yet). - -The RenderContext is designed to be rendered as part of a SocialCalc.TableEditor. The TableEditor -includes the spreadsheet grid as well as scrollbars, pane sliders, and (eventually) editing controls. -The layout is dynamic and may be recomputed on the fly, such as in response to resizing the browser -window. - -The scrollbars and pane sliders are created using SocialCalc.TableControl objects. These in turn -make use of Dragging, ToolTip, Button, and MouseWheel functions. - -The keyboard input is handled by keyboard code. - -There are also some helper routines. - -More comments yet to come... - -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; - - // ************************************* - // - // Shared values - // - // These are "global" values shared by the classes, including default settings - // - // ************************************* - - // Callbacks - - SocialCalc.Callbacks = { - // The next two are used by SocialCalc.format_text_for_display - - // The function to expand wiki text - should be set if you want wikitext expansion - // The form is: expand_wiki(displayvalue, sheetobj, linkstyle, valueformat) - // valueformat is text-wiki followed by optional sub-formats, e.g., text-wikipagelink - - expand_wiki: null, - - expand_markup: function ( - displayvalue, - sheetobj, - linkstyle // the old function to expand wiki text - may be replaced - ) { - return SocialCalc.default_expand_markup( - displayvalue, - sheetobj, - linkstyle - ); - }, - - // MakePageLink is used to create the href for a link to another "page" - // The form is: MakePageLink(pagename, workspacename, linktyle, valueformat), returns string - - MakePageLink: null, - - // NormalizeSheetName is used to make different variations of sheetnames use the same cache slot - - NormalizeSheetName: null, // use default - lowercase - }; - - // Shared flags - - // none at present - - // ************************************* - // - // Cell class: - // - // ************************************* - - // - // Class SocialCalc.Cell - // - // Usage: var s = new SocialCalc.Cell(coord); - // - // Cell attributes include: - // - // coord: the column/row as a string, e.g., "A1" - // datavalue: the value to be used for computation and formatting for display, - // string or numeric (tolerant of numbers stored as strings) - // datatype: if present, v=numeric value, t=text value, f=formula, - // or c=constant that is not a simple number (like "$1.20") - // formula: if present, the formula (without leading "=") for computation or the constant - // valuetype: first char is main type, the following are sub-types. - // Main types are b=blank cell, n=numeric, t=text, e=error - // Examples of using sub-types would be "nt" for a numeric time value, "n$" for currency, "nl" for logical - // displayvalue: if present, rendered version of datavalue with formatting attributes applied - // parseinfo: if present, cached parsed version of formula - // - // The following optional values, if present, are mainly used in rendering, overriding defaults: - // - // bt, br, bb, bl: number of border's definition - // layout: layout (vertical alignment, padding) definition number - // font: font definition number - // color: text color definition number - // bgcolor: background color definition number - // cellformat: cell format (horizontal alignment) definition number - // nontextvalueformat: custom format definition number for non-text values, e.g., numbers - // textvalueformat: custom format definition number for text values - // colspan, rowspan: number of cells to span for merged cells (only on main cell) - // cssc: custom css classname for cell, as text (no special chars) - // csss: custom css style definition - // mod: modification allowed flag "y" if present - // comment: cell comment string - // - - SocialCalc.Cell = function (coord) { - this.coord = coord; - this.datavalue = ""; - this.datatype = null; - this.formula = ""; - this.valuetype = "b"; - }; - - // The types of cell properties - // - // Type 1: Base, Type 2: Attribute, Type 3: Special (e.g., displaystring, parseinfo) - - SocialCalc.CellProperties = { - coord: 1, - datavalue: 1, - datatype: 1, - formula: 1, - valuetype: 1, - errors: 1, - comment: 1, - bt: 2, - br: 2, - bb: 2, - bl: 2, - layout: 2, - font: 2, - color: 2, - bgcolor: 2, - cellformat: 2, - nontextvalueformat: 2, - textvalueformat: 2, - colspan: 2, - rowspan: 2, - cssc: 2, - csss: 2, - mod: 2, - displaystring: 3, // used to cache rendered HTML of cell contents - parseinfo: 3, // used to cache parsed formulas - hcolspan: 3, - hrowspan: 3, // spans taking hidden cols/rows into account (!!! NOT YET !!!) - }; - - SocialCalc.CellPropertiesTable = { - bt: "borderstyle", - br: "borderstyle", - bb: "borderstyle", - bl: "borderstyle", - layout: "layout", - font: "font", - color: "color", - bgcolor: "color", - cellformat: "cellformat", - nontextvalueformat: "valueformat", - textvalueformat: "valueformat", - }; - - // ************************************* - // - // Sheet class: - // - // ************************************* - - // - // Class SocialCalc.Sheet - // - // Usage: var s = new SocialCalc.Sheet(); - // - - SocialCalc.Sheet = function () { - SocialCalc.ResetSheet(this); - - // Set other values: - // - // sheet.statuscallback(data, status, arg, this.statuscallbackparams) is called - // during recalc and commands. - // - // During recalc, data is the current recalcdata. - // The values for status and the corresponding arg are: - // - // calcorder, {coord: coord, total: celllist length, count: count} [0 or more times per recalc] - // calccheckdone, calclist length [once per recalc] - // calcstep, {coord: coord, total: calclist length, count: count} [0 or more times per recalc] - // calcloading, {sheetname: name-of-sheet} - // calcserverfunc, {funcname: name-of-function, coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds [once per recalc] - // - // During commands, data is SocialCalc.SheetCommandInfo. - // These values for status and arg are: - // - // cmdstart, cmdstr - // cmdend - // - - this.statuscallback = null; // routine called with cmdstart, calcstart, etc., status and args: - // sheet.statuscallback(data, status, arg, params) - this.statuscallbackparams = null; // parameters passed to that routine - }; - - // - // SocialCalc.ResetSheet(sheet) - // - // Resets (and/or initializes) sheet data values. - // - - SocialCalc.ResetSheet = function (sheet, reload) { - // properties: - - sheet.cells = {}; // at least one for each non-blank cell: coord: cell-object - sheet.attribs = - // sheet attributes - { - lastcol: 1, - lastrow: 1, - defaultlayout: 0, - }; - sheet.rowattribs = { - hide: {}, // access by row number - height: {}, - }; - sheet.colattribs = { - width: {}, // access by col name - hide: {}, - }; - sheet.names = {}; // Each is: {desc: "optional description", definition: "B5, A1:B7, or =formula"} - sheet.layouts = []; - sheet.layouthash = {}; - sheet.fonts = []; - sheet.fonthash = {}; - sheet.colors = []; - sheet.colorhash = {}; - sheet.borderstyles = []; - sheet.borderstylehash = {}; - sheet.cellformats = []; - sheet.cellformathash = {}; - sheet.valueformats = []; - sheet.valueformathash = {}; - - sheet.copiedfrom = ""; // if a range, then this was loaded from a saved range as clipboard content - - sheet.changes = new SocialCalc.UndoStack(); - - sheet.renderneeded = false; - - sheet.changedrendervalues = true; // if true, spans and/or fonts have changed (set by ExecuteSheetCommand & GetStyle) - - sheet.recalcchangedavalue = false; // true if a recalc resulted in a change to a cell's calculated value - }; - - // Methods: - - SocialCalc.Sheet.prototype.ResetSheet = function () { - SocialCalc.ResetSheet(this); - }; - SocialCalc.Sheet.prototype.AddCell = function (newcell) { - return (this.cells[newcell.coord] = newcell); - }; - SocialCalc.Sheet.prototype.GetAssuredCell = function (coord) { - return this.cells[coord] || this.AddCell(new SocialCalc.Cell(coord)); - }; - SocialCalc.Sheet.prototype.ParseSheetSave = function (savedsheet) { - SocialCalc.ParseSheetSave(savedsheet, this); - }; - SocialCalc.Sheet.prototype.CellFromStringParts = function (cell, parts, j) { - return SocialCalc.CellFromStringParts(this, cell, parts, j); - }; - SocialCalc.Sheet.prototype.CreateSheetSave = function (range, canonicalize) { - return SocialCalc.CreateSheetSave(this, range, canonicalize); - }; - SocialCalc.Sheet.prototype.CellToString = function (cell) { - return SocialCalc.CellToString(this, cell); - }; - SocialCalc.Sheet.prototype.CanonicalizeSheet = function (full) { - return SocialCalc.CanonicalizeSheet(this, full); - }; - SocialCalc.Sheet.prototype.EncodeCellAttributes = function (coord) { - return SocialCalc.EncodeCellAttributes(this, coord); - }; - SocialCalc.Sheet.prototype.EncodeSheetAttributes = function () { - return SocialCalc.EncodeSheetAttributes(this); - }; - SocialCalc.Sheet.prototype.DecodeCellAttributes = function ( - coord, - attribs, - range - ) { - return SocialCalc.DecodeCellAttributes(this, coord, attribs, range); - }; - SocialCalc.Sheet.prototype.DecodeSheetAttributes = function (attribs) { - return SocialCalc.DecodeSheetAttributes(this, attribs); - }; - - SocialCalc.Sheet.prototype.ScheduleSheetCommands = function ( - cmd, - saveundo, - isRemote - ) { - return SocialCalc.ScheduleSheetCommands(this, cmd, saveundo, isRemote); - }; - SocialCalc.Sheet.prototype.SheetUndo = function () { - return SocialCalc.SheetUndo(this); - }; - SocialCalc.Sheet.prototype.SheetRedo = function () { - return SocialCalc.SheetRedo(this); - }; - SocialCalc.Sheet.prototype.CreateAuditString = function () { - return SocialCalc.CreateAuditString(this); - }; - SocialCalc.Sheet.prototype.GetStyleNum = function (atype, style) { - return SocialCalc.GetStyleNum(this, atype, style); - }; - SocialCalc.Sheet.prototype.GetStyleString = function (atype, num) { - return SocialCalc.GetStyleString(this, atype, num); - }; - SocialCalc.Sheet.prototype.RecalcSheet = function () { - return SocialCalc.RecalcSheet(this); - }; - - // - // Sheet save format: - // - // linetype:param1:param2:... - // - // Linetypes are: - // - // version:versionname - version of this format. Currently 1.4. - // - // cell:coord:type:value...:type:value... - Types are as follows: - // - // v:value - straight numeric value - // t:value - straight text/wiki-text in cell, encoded to handle \, :, newlines - // vt:fulltype:value - value with value type/subtype - // vtf:fulltype:value:formulatext - formula resulting in value with value type/subtype, value and text encoded - // vtc:fulltype:value:valuetext - formatted text constant resulting in value with value type/subtype, value and text encoded - // vf:fvalue:formulatext - formula resulting in value, value and text encoded (obsolete: only pre format version 1.1) - // fvalue - first char is "N" for numeric value, "T" for text value, "H" for HTML value, rest is the value - // e:errortext - Error text. Non-blank means formula parsing/calculation results in error. - // b:topborder#:rightborder#:bottomborder#:leftborder# - border# in sheet border list or blank if none - // l:layout# - number in cell layout list - // f:font# - number in sheet fonts list - // c:color# - sheet color list index for text - // bg:color# - sheet color list index for background color - // cf:format# - sheet cell format number for explicit format (align:left, etc.) - // cvf:valueformat# - sheet cell value format number (obsolete: only pre format v1.2) - // tvf:valueformat# - sheet cell text value format number - // ntvf:valueformat# - sheet cell non-text value format number - // colspan:numcols - number of columns spanned in merged cell - // rowspan:numrows - number of rows spanned in merged cell - // cssc:classname - name of CSS class to be used for cell when published instead of one calculated here - // csss:styletext - explicit CSS style information, encoded to handle :, etc. - // mod:allow - if "y" allow modification of cell for live "view" recalc - // comment:value - encoded text of comment for this cell (added in v1.5) - // - // col: - // w:widthval - number, "auto" (no width in tag), number%, or blank (use default) - // hide: - yes/no, no is assumed if missing - // row: - // hide - yes/no, no is assumed if missing - // - // sheet: - // c:lastcol - number - // r:lastrow - number - // w:defaultcolwidth - number, "auto", number%, or blank (default->80) - // h:defaultrowheight - not used - // tf:format# - cell format number for sheet default for text values - // ntf:format# - cell format number for sheet default for non-text values (i.e., numbers) - // layout:layout# - default cell layout number in cell layout list - // font:font# - default font number in sheet font list - // vf:valueformat# - default number value format number in sheet valueformat list (obsolete: only pre format version 1.2) - // ntvf:valueformat# - default non-text (number) value format number in sheet valueformat list - // tvf:valueformat# - default text value format number in sheet valueformat list - // color:color# - default number for text color in sheet color list - // bgcolor:color# - default number for background color in sheet color list - // circularreferencecell:coord - cell coord with a circular reference - // recalc:value - on/off (on is default). If not "off", appropriate changes to the sheet cause a recalc - // needsrecalc:value - yes/no (no is default). If "yes", formula values are not up to date - // - // name:name:description:value - name definition, name in uppercase, with value being "B5", "A1:B7", or "=formula"; - // description and value are encoded. - // font:fontnum:value - text of font definition (style weight size family) for font fontnum - // "*" for "style weight", size, or family, means use default (first look to sheet, then builtin) - // color:colornum:rgbvalue - text of color definition (e.g., rgb(255,255,255)) for color colornum - // border:bordernum:value - text of border definition (thickness style color) for border bordernum - // layout:layoutnum:value - text of vertical alignment and padding style for cell layout layoutnum (* for default): - // vertical-alignment:vavalue;padding:topval rightval bottomval leftval; - // cellformat:cformatnum:value - text of cell alignment (left/center/right) for cellformat cformatnum - // valueformat:vformatnum:value - text of number format (see FormatValueForDisplay) for valueformat vformatnum (changed in v1.2) - // clipboardrange:upperleftcoord:bottomrightcoord - ignored -- from wikiCalc - // clipboard:coord:type:value:... - ignored -- from wikiCalc - // - // If this is clipboard contents, then there is also information to facilitate pasting: - // - // copiedfrom:upperleftcoord:bottomrightcoord - range from which this was copied - // - - // Functions: - - SocialCalc.ParseSheetSave = function (savedsheet, sheetobj) { - var lines = savedsheet.split(/\r\n|\n/); - var parts = []; - var line; - var i, j, t, v, coord, cell, attribs, name; - var scc = SocialCalc.Constants; - - for (i = 0; i < lines.length; i++) { - line = lines[i]; - parts = line.split(":"); - switch (parts[0]) { - case "cell": - cell = sheetobj.GetAssuredCell(parts[1]); - j = 2; - sheetobj.CellFromStringParts(cell, parts, j); - break; - - case "col": - coord = parts[1]; - j = 2; - while ((t = parts[j++])) { - switch (t) { - case "w": - sheetobj.colattribs.width[coord] = parts[j++]; // must be text - could be auto or %, etc. - break; - case "hide": - sheetobj.colattribs.hide[coord] = parts[j++]; - break; - default: - throw scc.s_pssUnknownColType + " '" + t + "'"; - break; - } - } - break; - - case "row": - coord = parts[1] - 0; - j = 2; - while ((t = parts[j++])) { - switch (t) { - case "h": - sheetobj.rowattribs.height[coord] = parts[j++] - 0; - break; - case "hide": - sheetobj.rowattribs.hide[coord] = parts[j++]; - break; - default: - throw scc.s_pssUnknownRowType + " '" + t + "'"; - break; - } - } - break; - - case "sheet": - attribs = sheetobj.attribs; - j = 1; - while ((t = parts[j++])) { - switch (t) { - case "c": - attribs.lastcol = parts[j++] - 0; - break; - case "r": - attribs.lastrow = parts[j++] - 0; - break; - case "w": - attribs.defaultcolwidth = parts[j++] + ""; - break; - case "h": - attribs.defaultrowheight = parts[j++] - 0; - break; - case "tf": - attribs.defaulttextformat = parts[j++] - 0; - break; - case "ntf": - attribs.defaultnontextformat = parts[j++] - 0; - break; - case "layout": - attribs.defaultlayout = parts[j++] - 0; - break; - case "font": - attribs.defaultfont = parts[j++] - 0; - break; - case "tvf": - attribs.defaulttextvalueformat = parts[j++] - 0; - break; - case "ntvf": - attribs.defaultnontextvalueformat = parts[j++] - 0; - break; - case "color": - attribs.defaultcolor = parts[j++] - 0; - break; - case "bgcolor": - attribs.defaultbgcolor = parts[j++] - 0; - break; - case "circularreferencecell": - attribs.circularreferencecell = parts[j++]; - break; - case "recalc": - attribs.recalc = parts[j++]; - break; - case "needsrecalc": - attribs.needsrecalc = parts[j++]; - break; - default: - j += 1; - break; - } - } - break; - - case "name": - name = SocialCalc.decodeFromSave(parts[1]).toUpperCase(); - sheetobj.names[name] = { desc: SocialCalc.decodeFromSave(parts[2]) }; - sheetobj.names[name].definition = SocialCalc.decodeFromSave(parts[3]); - break; - - case "layout": - parts = lines[i].match(/^layout\:(\d+)\:(.+)$/); // layouts can have ":" in them - sheetobj.layouts[parts[1] - 0] = parts[2]; - sheetobj.layouthash[parts[2]] = parts[1] - 0; - break; - - case "font": - sheetobj.fonts[parts[1] - 0] = parts[2]; - sheetobj.fonthash[parts[2]] = parts[1] - 0; - break; - - case "color": - sheetobj.colors[parts[1] - 0] = parts[2]; - sheetobj.colorhash[parts[2]] = parts[1] - 0; - break; - - case "border": - sheetobj.borderstyles[parts[1] - 0] = parts[2]; - sheetobj.borderstylehash[parts[2]] = parts[1] - 0; - break; - - case "cellformat": - v = SocialCalc.decodeFromSave(parts[2]); - sheetobj.cellformats[parts[1] - 0] = v; - sheetobj.cellformathash[v] = parts[1] - 0; - break; - - case "valueformat": - v = SocialCalc.decodeFromSave(parts[2]); - sheetobj.valueformats[parts[1] - 0] = v; - sheetobj.valueformathash[v] = parts[1] - 0; - break; - - case "version": - break; - - case "copiedfrom": - sheetobj.copiedfrom = parts[1] + ":" + parts[2]; - break; - - case "clipboardrange": // in save versions up to 1.3. Ignored. - case "clipboard": - break; - - case "": - break; - - default: - alert(scc.s_pssUnknownLineType + " '" + parts[0] + "'"); - throw scc.s_pssUnknownLineType + " '" + parts[0] + "'"; - break; - } - parts = null; - } - }; - - // - // SocialCalc.CellFromStringParts(sheet, cell, parts, j) - // - // Takes string that has been split by ":" in parts, starting at item j, - // and fills in cell assuming save format. - // - - SocialCalc.CellFromStringParts = function (sheet, cell, parts, j) { - var cell, t, v; - - while ((t = parts[j++])) { - switch (t) { - case "v": - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - cell.datatype = "v"; - cell.valuetype = "n"; - break; - case "t": - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - cell.datatype = "t"; - cell.valuetype = SocialCalc.Constants.textdatadefaulttype; - break; - case "vt": - v = parts[j++]; - cell.valuetype = v; - if (v.charAt(0) == "n") { - cell.datatype = "v"; - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - } else { - cell.datatype = "t"; - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - } - break; - case "vtf": - v = parts[j++]; - cell.valuetype = v; - if (v.charAt(0) == "n") { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - } else { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - } - cell.formula = SocialCalc.decodeFromSave(parts[j++]); - cell.datatype = "f"; - break; - case "vtc": - v = parts[j++]; - cell.valuetype = v; - if (v.charAt(0) == "n") { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]) - 0; - } else { - cell.datavalue = SocialCalc.decodeFromSave(parts[j++]); - } - cell.formula = SocialCalc.decodeFromSave(parts[j++]); - cell.datatype = "c"; - break; - case "e": - cell.errors = SocialCalc.decodeFromSave(parts[j++]); - break; - case "b": - cell.bt = parts[j++] - 0; - cell.br = parts[j++] - 0; - cell.bb = parts[j++] - 0; - cell.bl = parts[j++] - 0; - break; - case "l": - cell.layout = parts[j++] - 0; - break; - case "f": - cell.font = parts[j++] - 0; - break; - case "c": - cell.color = parts[j++] - 0; - break; - case "bg": - cell.bgcolor = parts[j++] - 0; - break; - case "cf": - cell.cellformat = parts[j++] - 0; - break; - case "ntvf": - cell.nontextvalueformat = parts[j++] - 0; - break; - case "tvf": - cell.textvalueformat = parts[j++] - 0; - break; - case "colspan": - cell.colspan = parts[j++] - 0; - break; - case "rowspan": - cell.rowspan = parts[j++] - 0; - break; - case "cssc": - cell.cssc = parts[j++]; - break; - case "csss": - cell.csss = SocialCalc.decodeFromSave(parts[j++]); - break; - case "mod": - j += 1; - break; - case "comment": - cell.comment = SocialCalc.decodeFromSave(parts[j++]); - break; - default: - throw SocialCalc.Constants.s_cfspUnknownCellType + " '" + t + "'"; - break; - } - } - }; - - SocialCalc.sheetfields = [ - "defaultrowheight", - "defaultcolwidth", - "circularreferencecell", - "recalc", - "needsrecalc", - ]; - SocialCalc.sheetfieldsshort = [ - "h", - "w", - "circularreferencecell", - "recalc", - "needsrecalc", - ]; - - SocialCalc.sheetfieldsxlat = [ - "defaulttextformat", - "defaultnontextformat", - "defaulttextvalueformat", - "defaultnontextvalueformat", - "defaultcolor", - "defaultbgcolor", - "defaultfont", - "defaultlayout", - ]; - SocialCalc.sheetfieldsxlatshort = [ - "tf", - "ntf", - "tvf", - "ntvf", - "color", - "bgcolor", - "font", - "layout", - ]; - SocialCalc.sheetfieldsxlatxlt = [ - "cellformat", - "cellformat", - "valueformat", - "valueformat", - "color", - "color", - "font", - "layout", - ]; - - // - // sheetstr = SocialCalc.CreateSheetSave(sheetobj, range, canonicalize) - // - // Creates a text representation of the sheetobj data. - // If the range is present then only those cells are saved - // (as clipboard data with "copiedfrom" set). - // - - SocialCalc.CreateSheetSave = function (sheetobj, range, canonicalize) { - var cell, - cr1, - cr2, - row, - col, - coord, - attrib, - line, - value, - formula, - i, - t, - r, - b, - l, - name, - blanklen; - var result = []; - - var prange; - - sheetobj.CanonicalizeSheet( - canonicalize || SocialCalc.Constants.doCanonicalizeSheet - ); - var xlt = sheetobj.xlt; - - if (range) { - prange = SocialCalc.ParseRange(range); - } else { - prange = { - cr1: { row: 1, col: 1 }, - cr2: { row: xlt.maxrow, col: xlt.maxcol }, - }; - } - cr1 = prange.cr1; - cr2 = prange.cr2; - - result.push("version:1.5"); - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - coord = SocialCalc.crToCoord(col, row); - cell = sheetobj.cells[coord]; - if (!cell) continue; - line = sheetobj.CellToString(cell); - if (line.length == 0) continue; // ignore completely empty cells - line = "cell:" + coord + line; - result.push(line); - } - } - - for (col = 1; col <= xlt.maxcol; col++) { - coord = SocialCalc.rcColname(col); - if (sheetobj.colattribs.width[coord]) - result.push("col:" + coord + ":w:" + sheetobj.colattribs.width[coord]); - if (sheetobj.colattribs.hide[coord]) - result.push( - "col:" + coord + ":hide:" + sheetobj.colattribs.hide[coord] - ); - } - - for (row = 1; row <= xlt.maxrow; row++) { - if (sheetobj.rowattribs.height[row]) - result.push("row:" + row + ":h:" + sheetobj.rowattribs.height[row]); - if (sheetobj.rowattribs.hide[row]) - result.push("row:" + row + ":hide:" + sheetobj.rowattribs.hide[row]); - } - - line = "sheet:c:" + xlt.maxcol + ":r:" + xlt.maxrow; - - for (i = 0; i < SocialCalc.sheetfields.length; i++) { - // non-xlated values - value = SocialCalc.encodeForSave( - sheetobj.attribs[SocialCalc.sheetfields[i]] - ); - if (value) line += ":" + SocialCalc.sheetfieldsshort[i] + ":" + value; - } - for (i = 0; i < SocialCalc.sheetfieldsxlat.length; i++) { - // xlated values - value = sheetobj.attribs[SocialCalc.sheetfieldsxlat[i]]; - if (value) - line += - ":" + - SocialCalc.sheetfieldsxlatshort[i] + - ":" + - xlt[SocialCalc.sheetfieldsxlatxlt[i] + "sxlat"][value]; - } - - result.push(line); - - for (i = 1; i < xlt.newborderstyles.length; i++) { - result.push("border:" + i + ":" + xlt.newborderstyles[i]); - } - - for (i = 1; i < xlt.newcellformats.length; i++) { - result.push( - "cellformat:" + - i + - ":" + - SocialCalc.encodeForSave(xlt.newcellformats[i]) - ); - } - - for (i = 1; i < xlt.newcolors.length; i++) { - result.push("color:" + i + ":" + xlt.newcolors[i]); - } - - for (i = 1; i < xlt.newfonts.length; i++) { - result.push("font:" + i + ":" + xlt.newfonts[i]); - } - - for (i = 1; i < xlt.newlayouts.length; i++) { - result.push("layout:" + i + ":" + xlt.newlayouts[i]); - } - - for (i = 1; i < xlt.newvalueformats.length; i++) { - result.push( - "valueformat:" + - i + - ":" + - SocialCalc.encodeForSave(xlt.newvalueformats[i]) - ); - } - - for (i = 0; i < xlt.namesorder.length; i++) { - name = xlt.namesorder[i]; - result.push( - "name:" + - SocialCalc.encodeForSave(name).toUpperCase() + - ":" + - SocialCalc.encodeForSave(sheetobj.names[name].desc) + - ":" + - SocialCalc.encodeForSave(sheetobj.names[name].definition) - ); - } - - if (range) { - result.push( - "copiedfrom:" + - SocialCalc.crToCoord(cr1.col, cr1.row) + - ":" + - SocialCalc.crToCoord(cr2.col, cr2.row) - ); - } - - result.push(""); // one extra to get extra \n - - delete sheetobj.xlt; // clean up - - return result.join("\n"); - }; - - // - // line = SocialCalc.CellToString(sheet, cell) - // - - SocialCalc.CellToString = function (sheet, cell) { - var cell, line, value, formula, t, r, b, l, xlt; - - line = ""; - - if (!cell) return line; - - value = SocialCalc.encodeForSave(cell.datavalue); - if (cell.datatype == "v") { - if (cell.valuetype == "n") line += ":v:" + value; - else line += ":vt:" + cell.valuetype + ":" + value; - } else if (cell.datatype == "t") { - if (cell.valuetype == SocialCalc.Constants.textdatadefaulttype) - line += ":t:" + value; - else line += ":vt:" + cell.valuetype + ":" + value; - } else { - formula = SocialCalc.encodeForSave(cell.formula); - if (cell.datatype == "f") { - line += ":vtf:" + cell.valuetype + ":" + value + ":" + formula; - } else if (cell.datatype == "c") { - line += ":vtc:" + cell.valuetype + ":" + value + ":" + formula; - } - } - if (cell.errors) { - line += ":e:" + SocialCalc.encodeForSave(cell.errors); - } - t = cell.bt || ""; - r = cell.br || ""; - b = cell.bb || ""; - l = cell.bl || ""; - - if (sheet.xlt) { - // if have canonical save info - xlt = sheet.xlt; - if (t || r || b || l) - line += - ":b:" + - xlt.borderstylesxlat[t || 0] + - ":" + - xlt.borderstylesxlat[r || 0] + - ":" + - xlt.borderstylesxlat[b || 0] + - ":" + - xlt.borderstylesxlat[l || 0]; - if (cell.layout) line += ":l:" + xlt.layoutsxlat[cell.layout]; - if (cell.font) line += ":f:" + xlt.fontsxlat[cell.font]; - if (cell.color) line += ":c:" + xlt.colorsxlat[cell.color]; - if (cell.bgcolor) line += ":bg:" + xlt.colorsxlat[cell.bgcolor]; - if (cell.cellformat) - line += ":cf:" + xlt.cellformatsxlat[cell.cellformat]; - if (cell.textvalueformat) - line += ":tvf:" + xlt.valueformatsxlat[cell.textvalueformat]; - if (cell.nontextvalueformat) - line += ":ntvf:" + xlt.valueformatsxlat[cell.nontextvalueformat]; - } else { - if (t || r || b || l) line += ":b:" + t + ":" + r + ":" + b + ":" + l; - if (cell.layout) line += ":l:" + cell.layout; - if (cell.font) line += ":f:" + cell.font; - if (cell.color) line += ":c:" + cell.color; - if (cell.bgcolor) line += ":bg:" + cell.bgcolor; - if (cell.cellformat) line += ":cf:" + cell.cellformat; - if (cell.textvalueformat) line += ":tvf:" + cell.textvalueformat; - if (cell.nontextvalueformat) line += ":ntvf:" + cell.nontextvalueformat; - } - if (cell.colspan) line += ":colspan:" + cell.colspan; - if (cell.rowspan) line += ":rowspan:" + cell.rowspan; - if (cell.cssc) line += ":cssc:" + cell.cssc; - if (cell.csss) line += ":csss:" + SocialCalc.encodeForSave(cell.csss); - if (cell.mod) line += ":mod:" + cell.mod; - if (cell.comment) - line += ":comment:" + SocialCalc.encodeForSave(cell.comment); - - return line; - }; - - // - // SocialCalc.CanonicalizeSheet(sheetobj, full) - // - // Goes through the sheet and fills in sheetobj.xlt with the following: - // - // .maxrow, .maxcol - lastrow and lastcol are as small as possible - // .newlayouts - new version of sheetobj.layouts without unused ones and all in ascending order - // .layoutsxlat - maps old layouts index to new one - // same ".new" and ".xlat" for fonts, colors, borderstyles, cell and value formats - // .namesorder - array with names sorted - // - // If full or SocialCalc.Constants.doCanonicalizeSheet are not true, then the values will leave things unchanged (to save time, etc.) - // - // sheetobj.xlt should be deleted when you are finished using it - // - - SocialCalc.CanonicalizeSheet = function (sheetobj, full) { - var l, coord, cr, cell, filled, an, a, newa, newxlat, used, ahash, i, v; - var maxrow = 0; - var maxcol = 0; - var alist = [ - "borderstyle", - "cellformat", - "color", - "font", - "layout", - "valueformat", - ]; - - var xlt = {}; - - xlt.namesorder = []; // always return a sorted list - for (a in sheetobj.names) { - xlt.namesorder.push(a); - } - xlt.namesorder.sort(); - - if (!SocialCalc.Constants.doCanonicalizeSheet || !full) { - // return make-no-changes values if not wanted - for (an = 0; an < alist.length; an++) { - a = alist[an]; - xlt["new" + a + "s"] = sheetobj[a + "s"]; - l = sheetobj[a + "s"].length; - newxlat = new Array(l); - newxlat[0] = ""; - for (i = 1; i < l; i++) { - newxlat[i] = i; - } - xlt[a + "sxlat"] = newxlat; - } - - xlt.maxrow = sheetobj.attribs.lastrow; - xlt.maxcol = sheetobj.attribs.lastcol; - - sheetobj.xlt = xlt; - - return; - } - - for (an = 0; an < alist.length; an++) { - a = alist[an]; - xlt[a + "sUsed"] = {}; - } - - var colorsUsed = xlt.colorsUsed; - var borderstylesUsed = xlt.borderstylesUsed; - var fontsUsed = xlt.fontsUsed; - var layoutsUsed = xlt.layoutsUsed; - var cellformatsUsed = xlt.cellformatsUsed; - var valueformatsUsed = xlt.valueformatsUsed; - - for (coord in sheetobj.cells) { - // check all cells to see which values are used - cr = SocialCalc.coordToCr(coord); - cell = sheetobj.cells[coord]; - filled = false; - - if (cell.valuetype && cell.valuetype != "b") filled = true; - - if (cell.color) { - colorsUsed[cell.color] = 1; - filled = true; - } - - if (cell.bgcolor) { - colorsUsed[cell.bgcolor] = 1; - filled = true; - } - - if (cell.bt) { - borderstylesUsed[cell.bt] = 1; - filled = true; - } - if (cell.br) { - borderstylesUsed[cell.br] = 1; - filled = true; - } - if (cell.bb) { - borderstylesUsed[cell.bb] = 1; - filled = true; - } - if (cell.bl) { - borderstylesUsed[cell.bl] = 1; - filled = true; - } - - if (cell.layout) { - layoutsUsed[cell.layout] = 1; - filled = true; - } - - if (cell.font) { - fontsUsed[cell.font] = 1; - filled = true; - } - - if (cell.cellformat) { - cellformatsUsed[cell.cellformat] = 1; - filled = true; - } - - if (cell.textvalueformat) { - valueformatsUsed[cell.textvalueformat] = 1; - filled = true; - } - - if (cell.nontextvalueformat) { - valueformatsUsed[cell.nontextvalueformat] = 1; - filled = true; - } - - if (filled) { - if (cr.row > maxrow) maxrow = cr.row; - if (cr.col > maxcol) maxcol = cr.col; - } - } - - for (i = 0; i < SocialCalc.sheetfieldsxlat.length; i++) { - // do sheet values, too - v = sheetobj.attribs[SocialCalc.sheetfieldsxlat[i]]; - if (v) { - xlt[SocialCalc.sheetfieldsxlatxlt[i] + "sUsed"][v] = 1; - } - } - - a = { height: 1, hide: 1 }; // look at explicit row settings - for (v in a) { - for (cr in sheetobj.rowattribs[v]) { - if (cr > maxrow) maxrow = cr; - } - } - a = { hide: 1, width: 1 }; // look at explicit col settings - for (v in a) { - for (coord in sheetobj.colattribs[v]) { - cr = SocialCalc.coordToCr(coord + "1"); - if (cr.col > maxcol) maxcol = cr.col; - } - } - - for (an = 0; an < alist.length; an++) { - // go through the attribs we want - a = alist[an]; - - newa = []; - used = xlt[a + "sUsed"]; - for (v in used) { - newa.push(sheetobj[a + "s"][v]); - } - newa.sort(); - newa.unshift(""); - - newxlat = [""]; - ahash = sheetobj[a + "hash"]; - - for (i = 1; i < newa.length; i++) { - newxlat[ahash[newa[i]]] = i; - } - - xlt[a + "sxlat"] = newxlat; - xlt["new" + a + "s"] = newa; - } - - xlt.maxrow = maxrow || 1; - xlt.maxcol = maxcol || 1; - - sheetobj.xlt = xlt; // leave for use by caller - }; - - // - // result = SocialCalc.EncodeCellAttributes(sheet, coord) - // - // Returns the cell's attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - - SocialCalc.EncodeCellAttributes = function (sheet, coord) { - var value, i, b, bb, parts; - var result = {}; - - var InitAttrib = function (name) { - result[name] = { def: true, val: "" }; - }; - - var InitAttribs = function (namelist) { - for (var i = 0; i < namelist.length; i++) { - InitAttrib(namelist[i]); - } - }; - - var SetAttrib = function (name, v) { - result[name].def = false; - result[name].val = v || ""; - }; - - var SetAttribStar = function (name, v) { - if (v == "*") return; - result[name].def = false; - result[name].val = v; - }; - - var cell = sheet.GetAssuredCell(coord); - - // cellformat: alignhoriz - - InitAttrib("alignhoriz"); - if (cell.cellformat) { - SetAttrib("alignhoriz", sheet.cellformats[cell.cellformat]); - } - - // layout: alignvert, padtop, padright, padbottom, padleft - - InitAttribs(["alignvert", "padtop", "padright", "padbottom", "padleft"]); - if (cell.layout) { - parts = sheet.layouts[cell.layout].match( - /^padding:\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+);vertical-align:\s*(\S+);/ - ); - SetAttribStar("padtop", parts[1]); - SetAttribStar("padright", parts[2]); - SetAttribStar("padbottom", parts[3]); - SetAttribStar("padleft", parts[4]); - SetAttribStar("alignvert", parts[5]); - } - - // font: fontfamily, fontlook, fontsize - - InitAttribs(["fontfamily", "fontlook", "fontsize"]); - if (cell.font) { - parts = sheet.fonts[cell.font].match(/^(\*|\S+? \S+?) (\S+?) (\S.*)$/); - SetAttribStar("fontfamily", parts[3]); - SetAttribStar("fontsize", parts[2]); - SetAttribStar("fontlook", parts[1]); - } - - // color: textcolor - - InitAttrib("textcolor"); - if (cell.color) { - SetAttrib("textcolor", sheet.colors[cell.color]); - } - - // bgcolor: bgcolor - - InitAttrib("bgcolor"); - if (cell.bgcolor) { - SetAttrib("bgcolor", sheet.colors[cell.bgcolor]); - } - - // formatting: numberformat, textformat - - InitAttribs(["numberformat", "textformat"]); - if (cell.nontextvalueformat) { - SetAttrib("numberformat", sheet.valueformats[cell.nontextvalueformat]); - } - if (cell.textvalueformat) { - SetAttrib("textformat", sheet.valueformats[cell.textvalueformat]); - } - - // merges: colspan, rowspan - - InitAttribs(["colspan", "rowspan"]); - SetAttrib("colspan", cell.colspan || 1); - SetAttrib("rowspan", cell.rowspan || 1); - - // borders: bXthickness, bXstyle, bXcolor for X = t, r, b, and l - - for (i = 0; i < 4; i++) { - b = "trbl".charAt(i); - bb = "b" + b; - InitAttrib(bb); - SetAttrib(bb, cell[bb] ? sheet.borderstyles[cell[bb]] : ""); - InitAttrib(bb + "thickness"); - InitAttrib(bb + "style"); - InitAttrib(bb + "color"); - if (cell[bb]) { - parts = sheet.borderstyles[cell[bb]].match(/(\S+)\s+(\S+)\s+(\S.+)/); - SetAttrib(bb + "thickness", parts[1]); - SetAttrib(bb + "style", parts[2]); - SetAttrib(bb + "color", parts[3]); - } - } - - // misc: cssc, csss, mod - - InitAttribs(["cssc", "csss", "mod"]); - SetAttrib("cssc", cell.cssc || ""); - SetAttrib("csss", cell.csss || ""); - SetAttrib("mod", cell.mod || "n"); - - return result; - }; - - // - // result = SocialCalc.EncodeSheetAttributes(sheet) - // - // Returns the sheet's attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - - SocialCalc.EncodeSheetAttributes = function (sheet) { - var value; - var attribs = sheet.attribs; - var result = {}; - - var InitAttrib = function (name) { - result[name] = { def: true, val: "" }; - }; - - var InitAttribs = function (namelist) { - for (var i = 0; i < namelist.length; i++) { - InitAttrib(namelist[i]); - } - }; - - var SetAttrib = function (name, v) { - result[name].def = false; - result[name].val = v || value; - }; - - var SetAttribStar = function (name, v) { - if (v == "*") return; - result[name].def = false; - result[name].val = v; - }; - - // sizes: colwidth, rowheight - - InitAttrib("colwidth"); - if (attribs.defaultcolwidth) { - SetAttrib("colwidth", attribs.defaultcolwidth); - } - - InitAttrib("rowheight"); - if (attribs.rowheight) { - SetAttrib("rowheight", attribs.defaultrowheight); - } - - // cellformat: textalignhoriz, numberalignhoriz - - InitAttrib("textalignhoriz"); - if (attribs.defaulttextformat) { - SetAttrib("textalignhoriz", sheet.cellformats[attribs.defaulttextformat]); - } - - InitAttrib("numberalignhoriz"); - if (attribs.defaultnontextformat) { - SetAttrib( - "numberalignhoriz", - sheet.cellformats[attribs.defaultnontextformat] - ); - } - - // layout: alignvert, padtop, padright, padbottom, padleft - - InitAttribs(["alignvert", "padtop", "padright", "padbottom", "padleft"]); - if (attribs.defaultlayout) { - parts = sheet.layouts[attribs.defaultlayout].match( - /^padding:\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+);vertical-align:\s*(\S+);/ - ); - SetAttribStar("padtop", parts[1]); - SetAttribStar("padright", parts[2]); - SetAttribStar("padbottom", parts[3]); - SetAttribStar("padleft", parts[4]); - SetAttribStar("alignvert", parts[5]); - } - - // font: fontfamily, fontlook, fontsize - - InitAttribs(["fontfamily", "fontlook", "fontsize"]); - if (attribs.defaultfont) { - parts = sheet.fonts[attribs.defaultfont].match( - /^(\*|\S+? \S+?) (\S+?) (\S.*)$/ - ); - SetAttribStar("fontfamily", parts[3]); - SetAttribStar("fontsize", parts[2]); - SetAttribStar("fontlook", parts[1]); - } - - // color: textcolor - - InitAttrib("textcolor"); - if (attribs.defaultcolor) { - SetAttrib("textcolor", sheet.colors[attribs.defaultcolor]); - } - - // bgcolor: bgcolor - - InitAttrib("bgcolor"); - if (attribs.defaultbgcolor) { - SetAttrib("bgcolor", sheet.colors[attribs.defaultbgcolor]); - } - - // formatting: numberformat, textformat - - InitAttribs(["numberformat", "textformat"]); - if (attribs.defaultnontextvalueformat) { - SetAttrib( - "numberformat", - sheet.valueformats[attribs.defaultnontextvalueformat] - ); - } - if (attribs.defaulttextvalueformat) { - SetAttrib( - "textformat", - sheet.valueformats[attribs.defaulttextvalueformat] - ); - } - - // recalc: recalc - - InitAttrib("recalc"); - if (attribs.recalc) { - SetAttrib("recalc", attribs.recalc); - } - - return result; - }; - - // - // cmdstr = SocialCalc.DecodeCellAttributes(sheet, coord, attribs, range) - // - // Takes cell attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - // and returns the sheet commands to make the actual attributes correspond. - // Returns a non-null string if any commands are to be executed, null otherwise. - // - // If range is provided, the commands are executed on the whole range. - // - - SocialCalc.DecodeCellAttributes = function (sheet, coord, newattribs, range) { - var value, b, bb; - - var cell = sheet.GetAssuredCell(coord); - - var changed = false; - - var CheckChanges = function (attribname, oldval, cmdname) { - var val; - if (newattribs[attribname]) { - if (newattribs[attribname].def) { - val = ""; - } else { - val = newattribs[attribname].val; - } - if (val != (oldval || "")) { - DoCmd(cmdname + " " + val); - } - } - }; - - var cmdstr = ""; - - var DoCmd = function (str) { - if (cmdstr) cmdstr += "\n"; - cmdstr += "set " + (range || coord) + " " + str; - changed = true; - }; - - // cellformat: alignhoriz - - CheckChanges( - "alignhoriz", - sheet.cellformats[cell.cellformat], - "cellformat" - ); - - // layout: alignvert, padtop, padright, padbottom, padleft - - if ( - !newattribs.alignvert.def || - !newattribs.padtop.def || - !newattribs.padright.def || - !newattribs.padbottom.def || - !newattribs.padleft.def - ) { - value = - "padding:" + - (newattribs.padtop.def ? "* " : newattribs.padtop.val + " ") + - (newattribs.padright.def ? "* " : newattribs.padright.val + " ") + - (newattribs.padbottom.def ? "* " : newattribs.padbottom.val + " ") + - (newattribs.padleft.def ? "*" : newattribs.padleft.val) + - ";vertical-align:" + - (newattribs.alignvert.def ? "*;" : newattribs.alignvert.val + ";"); - } else { - value = ""; - } - - if (value != (sheet.layouts[cell.layout] || "")) { - DoCmd("layout " + value); - } - - // font: fontfamily, fontlook, fontsize - - if ( - !newattribs.fontlook.def || - !newattribs.fontsize.def || - !newattribs.fontfamily.def - ) { - value = - (newattribs.fontlook.def ? "* " : newattribs.fontlook.val + " ") + - (newattribs.fontsize.def ? "* " : newattribs.fontsize.val + " ") + - (newattribs.fontfamily.def ? "*" : newattribs.fontfamily.val); - } else { - value = ""; - } - - if (value != (sheet.fonts[cell.font] || "")) { - DoCmd("font " + value); - } - - // color: textcolor - - CheckChanges("textcolor", sheet.colors[cell.color], "color"); - - // bgcolor: bgcolor - - CheckChanges("bgcolor", sheet.colors[cell.bgcolor], "bgcolor"); - - // formatting: numberformat, textformat - - CheckChanges( - "numberformat", - sheet.valueformats[cell.nontextvalueformat], - "nontextvalueformat" - ); - - CheckChanges( - "textformat", - sheet.valueformats[cell.textvalueformat], - "textvalueformat" - ); - - // merges: colspan, rowspan - NOT HANDLED: IGNORED! - - // borders: bX for X = t, r, b, and l; bXthickness, bXstyle, bXcolor ignored - - for (var i = 0; i < 4; i++) { - b = "trbl".charAt(i); - bb = "b" + b; - CheckChanges(bb, sheet.borderstyles[cell[bb]], bb); - } - - // misc: cssc, csss, mod - - CheckChanges("cssc", cell.cssc, "cssc"); - - CheckChanges("csss", cell.csss, "csss"); - - if (newattribs.mod) { - if (newattribs.mod.def) { - value = "n"; - } else { - value = newattribs.mod.val; - } - if (value != (cell.mod || "n")) { - if (value == "n") value = ""; // restrict to "y" and "" normally - DoCmd("mod " + value); - } - } - - // if any changes return command(s) - - if (changed) { - return cmdstr; - } else { - return null; - } - }; - - // - // changed = SocialCalc.DecodeSheetAttributes(sheet, newattribs) - // - // Takes sheet attributes in an object, each in the following form: - // - // attribname: {def: true/false, val: full-value} - // - // and returns the sheet commands to make the actual attributes correspond. - // Returns a non-null string if any commands were executed, null otherwise. - // - - SocialCalc.DecodeSheetAttributes = function (sheet, newattribs) { - var value; - var attribs = sheet.attribs; - var changed = false; - - var CheckChanges = function (attribname, oldval, cmdname) { - var val; - if (newattribs[attribname]) { - if (newattribs[attribname].def) { - val = ""; - } else { - val = newattribs[attribname].val; - } - if (val != (oldval || "")) { - DoCmd(cmdname + " " + val); - } - } - }; - - var cmdstr = ""; - - var DoCmd = function (str) { - if (cmdstr) cmdstr += "\n"; - cmdstr += "set sheet " + str; - changed = true; - }; - - // sizes: colwidth, rowheight - - CheckChanges("colwidth", attribs.defaultcolwidth, "defaultcolwidth"); - - CheckChanges("rowheight", attribs.defaultrowheight, "defaultrowheight"); - - // cellformat: textalignhoriz, numberalignhoriz - - CheckChanges( - "textalignhoriz", - sheet.cellformats[attribs.defaulttextformat], - "defaulttextformat" - ); - - CheckChanges( - "numberalignhoriz", - sheet.cellformats[attribs.defaultnontextformat], - "defaultnontextformat" - ); - - // layout: alignvert, padtop, padright, padbottom, padleft - - if ( - !newattribs.alignvert.def || - !newattribs.padtop.def || - !newattribs.padright.def || - !newattribs.padbottom.def || - !newattribs.padleft.def - ) { - value = - "padding:" + - (newattribs.padtop.def ? "* " : newattribs.padtop.val + " ") + - (newattribs.padright.def ? "* " : newattribs.padright.val + " ") + - (newattribs.padbottom.def ? "* " : newattribs.padbottom.val + " ") + - (newattribs.padleft.def ? "*" : newattribs.padleft.val) + - ";vertical-align:" + - (newattribs.alignvert.def ? "*;" : newattribs.alignvert.val + ";"); - } else { - value = ""; - } - - if (value != (sheet.layouts[attribs.defaultlayout] || "")) { - DoCmd("defaultlayout " + value); - } - - // font: fontfamily, fontlook, fontsize - - if ( - !newattribs.fontlook.def || - !newattribs.fontsize.def || - !newattribs.fontfamily.def - ) { - value = - (newattribs.fontlook.def ? "* " : newattribs.fontlook.val + " ") + - (newattribs.fontsize.def ? "* " : newattribs.fontsize.val + " ") + - (newattribs.fontfamily.def ? "*" : newattribs.fontfamily.val); - } else { - value = ""; - } - - if (value != (sheet.fonts[attribs.defaultfont] || "")) { - DoCmd("defaultfont " + value); - } - - // color: textcolor - - CheckChanges( - "textcolor", - sheet.colors[attribs.defaultcolor], - "defaultcolor" - ); - - // bgcolor: bgcolor - - CheckChanges( - "bgcolor", - sheet.colors[attribs.defaultbgcolor], - "defaultbgcolor" - ); - - // formatting: numberformat, textformat - - CheckChanges( - "numberformat", - sheet.valueformats[attribs.defaultnontextvalueformat], - "defaultnontextvalueformat" - ); - - CheckChanges( - "textformat", - sheet.valueformats[attribs.defaulttextvalueformat], - "defaulttextvalueformat" - ); - - // recalc: recalc - - CheckChanges("recalc", sheet.attribs.recalc, "recalc"); - - // if any changes return command(s) - - if (changed) { - return cmdstr; - } else { - return null; - } - }; - - // ************************************* - // - // Sheet command routines - // - // ************************************* - - // - // SocialCalc.SheetCommandInfo - object with information used during command execution - // - - SocialCalc.SheetCommandInfo = { - // only one of these - - sheetobj: null, // sheet being operated on - parseobj: null, // SocialCalc.Parse object with the command string, etc. - timerobj: null, // used for timeslicing - firsttimerdelay: 50, // wait before starting cmds (for Chrome - to give time to update) - timerdelay: 1, // wait between slices - maxtimeslice: 100, // do another slice after this many milliseconds - saveundo: false, // arg for ExecuteSheetCommand - - CmdExtensionCallbacks: {}, // for startcmdextension, in form: cmdname, {func:function(cmdname, data, sheet, SocialCalc.Parse object, saveundo), data:whatever} - cmdextensionbusy: "", // if length>0, command loop waits for SocialCalc.ResumeFromCmdExtension() - - // statuscallback: null, // called during execution - obsolete: use sheet obj's - // statuscallbackparams: null - }; - - // - // SocialCalc.ScheduleSheetCommands - // - // statuscallback is called at the beginning (cmdstart) and end (cmdend). - // - - SocialCalc.ScheduleSheetCommands = function ( - sheet, - cmdstr, - saveundo, - isRemote - ) { - if (SocialCalc.Callbacks.broadcast && !isRemote) { - if ( - cmdstr != "redisplay" && - cmdstr != "set sheet defaulttextvalueformat text-wiki" && - cmdstr != "recalc" - ) { - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "scmd", - id: sheet.sheetid, - cmdstr: cmdstr, - saveundo: saveundo, - }); - } - } - - var sci = SocialCalc.SheetCommandInfo; - - sci.sheetobj = sheet; - sci.parseobj = new SocialCalc.Parse(cmdstr); - sci.saveundo = saveundo; - - if (sci.sheetobj.statuscallback) { - // notify others if requested - sheet.statuscallback( - sci, - "cmdstart", - "", - sci.sheetobj.statuscallbackparams - ); - } - - if (sci.saveundo) { - sci.sheetobj.changes.PushChange(""); // add a step to undo stack - } - - sci.timerobj = window.setTimeout( - SocialCalc.SheetCommandsTimerRoutine, - sci.firsttimerdelay - ); - }; - - SocialCalc.SheetCommandsTimerRoutine = function () { - var errortext; - var sci = SocialCalc.SheetCommandInfo; - var starttime = new Date(); - - sci.timerobj = null; - - while (!sci.parseobj.EOF()) { - // go through all commands (separated by newlines) - - errortext = SocialCalc.ExecuteSheetCommand( - sci.sheetobj, - sci.parseobj, - sci.saveundo - ); - if (errortext) alert(errortext); - - sci.parseobj.NextLine(); - - if (sci.cmdextensionbusy.length > 0) { - // forced wait - if (sci.sheetobj.statuscallback) { - // notify others if requested - sci.sheetobj.statuscallback( - sci, - "cmdextension", - sci.cmdextensionbusy, - sci.sheetobj.statuscallbackparams - ); - } - return; - } - - if (new Date() - starttime >= sci.maxtimeslice) { - // if taking too long, give up CPU for a while - sci.timerobj = window.setTimeout( - SocialCalc.SheetCommandsTimerRoutine, - sci.timerdelay - ); - return; - } - } - - if (sci.sheetobj.statuscallback) { - // notify others if requested - sci.sheetobj.statuscallback( - sci, - "cmdend", - "", - sci.sheetobj.statuscallbackparams - ); - } - }; - - SocialCalc.ResumeFromCmdExtension = function () { - var sci = SocialCalc.SheetCommandInfo; - - sci.cmdextensionbusy = ""; - - SocialCalc.SheetCommandsTimerRoutine(); - }; - - // - // errortext = SocialCalc.ExecuteSheetCommand(sheet, cmd, saveundo) - // - // cmd is a SocialCalc.Parse object. - // - // Executes commands that modify the sheet data. - // Sets sheet "needsrecalc" as needed. - // Sets sheet "changedrendervalues" as needed. - // - // The cmd string may be multiple commands, separated by newlines. In that case - // only one "step" is put on the undo stack representing all the commands. - // Note that because of this, in "set A1 text ..." and "set A1 comment ..." text is - // treated as encoded (newline => \n, \ => \b, : => \c). - // - // The commands are in the forms: - // - // set sheet attributename value (plus lastcol and lastrow) - // set 22 attributename value - // set B attributename value - // set A1 attributename value1 value2... (see each attribute in code for details) - // set A1:B5 attributename value1 value2... - // erase/copy/cut/paste/fillright/filldown A1:B5 all/formulas/format - // loadclipboard save-encoded-clipboard-data - // clearclipboard - // merge C3:F3 - // unmerge C3 - // insertcol/insertrow C5 - // deletecol/deleterow C5:E7 - // movepaste/moveinsert A1:B5 A8 all/formulas/format (if insert, destination must be in same rows or columns or else paste done) - // sort cr1:cr2 col1 up/down col2 up/down col3 up/down - // name define NAME definition - // name desc NAME description - // name delete NAME - // recalc - // redisplay - // changedrendervalues - // startcmdextension extension rest-of-command - // - // If saveundo is true, then undo information is saved in sheet.changes. - // - - SocialCalc.ExecuteSheetCommand = function (sheet, cmd, saveundo) { - var cmdstr, - cmd1, - rest, - what, - attrib, - num, - pos, - pos2, - errortext, - undostart, - val; - var cr1, cr2, col, row, cr, cell, newcell; - var fillright, rowstart, colstart, crbase, rowoffset, coloffset, basecell; - var clipsheet, cliprange, numcols, numrows, attribtable; - var colend, - rowend, - newcolstart, - newrowstart, - newcolend, - newrowend, - rownext, - colnext, - colthis, - cellnext; - var lastrow, lastcol, rowbefore, colbefore, oldformula, oldcr; - var cols, dirs, lastsortcol, i, sortlist, sortcells, sortvalues, sorttypes; - var sortfunction, slen, valtype, originalrow, sortedcr; - var name, v1, v2; - var cmdextension; - - var attribs = sheet.attribs; - var changes = sheet.changes; - var cellProperties = SocialCalc.CellProperties; - var scc = SocialCalc.Constants; - - var ParseRange = function () { - var prange = SocialCalc.ParseRange(what); - cr1 = prange.cr1; - cr2 = prange.cr2; - if (cr2.col > attribs.lastcol) attribs.lastcol = cr2.col; - if (cr2.row > attribs.lastrow) attribs.lastrow = cr2.row; - }; - - errortext = ""; - - cmdstr = cmd.RestOfStringNoMove(); - if (saveundo) { - sheet.changes.AddDo(cmdstr); - } - - cmd1 = cmd.NextToken(); - - switch (cmd1) { - case "set": - what = cmd.NextToken(); - attrib = cmd.NextToken(); - rest = cmd.RestOfString(); - undostart = "set " + what + " " + attrib; - - if (what == "sheet") { - sheet.renderneeded = true; - switch (attrib) { - case "defaultcolwidth": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]); - attribs[attrib] = rest; - break; - case "defaultcolor": - case "defaultbgcolor": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("color", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("color", rest); - break; - case "defaultlayout": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("layout", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("layout", rest); - break; - case "defaultfont": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("font", attribs[attrib]) - ); - if (rest == "* * *") rest = ""; // all default - attribs[attrib] = sheet.GetStyleNum("font", rest); - break; - case "defaulttextformat": - case "defaultnontextformat": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("cellformat", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("cellformat", rest); - break; - case "defaulttextvalueformat": - case "defaultnontextvalueformat": - if (saveundo) - changes.AddUndo( - undostart, - sheet.GetStyleString("valueformat", attribs[attrib]) - ); - attribs[attrib] = sheet.GetStyleNum("valueformat", rest); - for (cr in sheet.cells) { - // forget all cached display strings - delete sheet.cells[cr].displaystring; - } - break; - case "lastcol": - case "lastrow": - if (saveundo) changes.AddUndo(undostart, attribs[attrib] - 0); - num = rest - 0; - if (typeof num == "number") attribs[attrib] = num > 0 ? num : 1; - break; - case "recalc": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]); - if (rest == "off") { - attribs.recalc = rest; // manual recalc, not auto - } else { - // all values other than "off" mean "on" - delete attribs.recalc; - } - break; - default: - errortext = scc.s_escUnknownSheetCmd + cmdstr; - break; - } - } else if (/(^[A-Z])([A-Z])?(:[A-Z][A-Z]?){0,1}$/i.test(what)) { - // col attributes - sheet.renderneeded = true; - what = what.toUpperCase(); - pos = what.indexOf(":"); - if (pos >= 0) { - cr1 = SocialCalc.coordToCr(what.substring(0, pos) + "1"); - cr2 = SocialCalc.coordToCr(what.substring(pos + 1) + "1"); - } else { - cr1 = SocialCalc.coordToCr(what + "1"); - cr2 = cr1; - } - for (col = cr1.col; col <= cr2.col; col++) { - if (attrib == "width") { - cr = SocialCalc.rcColname(col); - if (saveundo) - changes.AddUndo( - "set " + cr + " width", - sheet.colattribs.width[cr] - ); - if (rest.length > 0) { - sheet.colattribs.width[cr] = rest; - } else { - delete sheet.colattribs.width[cr]; - } - } - } - } - - // !!!!! need row attribs !!!! - else if (/([a-z]){0,1}(\d+)/i.test(what)) { - // cell attributes - ParseRange(); - if ( - cr1.row != cr2.row || - cr1.col != cr2.col || - sheet.celldisplayneeded || - sheet.renderneeded - ) { - // not one cell - sheet.renderneeded = true; - sheet.celldisplayneeded = ""; - } else { - sheet.celldisplayneeded = SocialCalc.crToCoord(cr1.col, cr1.row); - } - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - if (attrib == "value") { - // set coord value type numeric-value - pos = rest.indexOf(" "); - cell.datavalue = rest.substring(pos + 1) - 0; - delete cell.errors; - cell.datatype = "v"; - cell.valuetype = rest.substring(0, pos); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "text") { - // set coord text type text-value - pos = rest.indexOf(" "); - cell.datavalue = SocialCalc.decodeFromSave( - rest.substring(pos + 1) - ); - delete cell.errors; - cell.datatype = "t"; - cell.valuetype = rest.substring(0, pos); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "formula") { - // set coord formula formula-body-less-initial-= - cell.datavalue = 0; // until recalc - delete cell.errors; - cell.datatype = "f"; - cell.valuetype = "e#N/A"; // until recalc - cell.formula = rest; - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "constant") { - // set coord constant type numeric-value source-text - pos = rest.indexOf(" "); - pos2 = rest.substring(pos + 1).indexOf(" "); - cell.datavalue = rest.substring(pos + 1, pos + 1 + pos2) - 0; - cell.valuetype = rest.substring(0, pos); - if (cell.valuetype.charAt(0) == "e") { - // error - cell.errors = cell.valuetype.substring(1); - } else { - delete cell.errors; - } - cell.datatype = "c"; - cell.formula = rest.substring(pos + pos2 + 2); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "empty") { - // erase value - cell.datavalue = ""; - delete cell.errors; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } else if (attrib == "all") { - // set coord all :this:val1:that:val2... - if (rest.length > 0) { - cell = new SocialCalc.Cell(cr); - sheet.CellFromStringParts(cell, rest.split(":"), 1); - sheet.cells[cr] = cell; - } else { - delete sheet.cells[cr]; - } - attribs.needsrecalc = "yes"; - } else if (/^b[trbl]$/.test(attrib)) { - // set coord bt 1px solid black - cell[attrib] = sheet.GetStyleNum("borderstyle", rest); - sheet.renderneeded = true; // affects more than just one cell - } else if (attrib == "color" || attrib == "bgcolor") { - cell[attrib] = sheet.GetStyleNum("color", rest); - } else if (attrib == "layout" || attrib == "cellformat") { - cell[attrib] = sheet.GetStyleNum(attrib, rest); - } else if (attrib == "font") { - // set coord font style weight size family - if (rest == "* * *") rest = ""; - cell[attrib] = sheet.GetStyleNum("font", rest); - } else if ( - attrib == "textvalueformat" || - attrib == "nontextvalueformat" - ) { - cell[attrib] = sheet.GetStyleNum("valueformat", rest); - delete cell.displaystring; - } else if (attrib == "cssc") { - rest = rest.replace(/[^a-zA-Z0-9\-]/g, ""); - cell.cssc = rest; - } else if (attrib == "csss") { - rest = rest.replace(/\n/g, ""); - cell.csss = rest; - } else if (attrib == "mod") { - rest = rest.replace(/[^yY]/g, "").toLowerCase(); - cell.mod = rest; - } else if (attrib == "comment") { - cell.comment = SocialCalc.decodeFromSave(rest); - } else { - errortext = scc.s_escUnknownSetCoordCmd + cmdstr; - } - } - } - } - break; - - case "merge": - sheet.renderneeded = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - cell = sheet.GetAssuredCell(cr1.coord); - if (saveundo) changes.AddUndo("unmerge " + cr1.coord); - - if (cr2.col > cr1.col) cell.colspan = cr2.col - cr1.col + 1; - else delete cell.colspan; - if (cr2.row > cr1.row) cell.rowspan = cr2.row - cr1.row + 1; - else delete cell.rowspan; - - sheet.changedrendervalues = true; - - break; - - case "unmerge": - sheet.renderneeded = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - cell = sheet.GetAssuredCell(cr1.coord); - if (saveundo) - changes.AddUndo( - "merge " + - cr1.coord + - ":" + - SocialCalc.crToCoord( - cr1.col + (cell.colspan || 1) - 1, - cr1.row + (cell.rowspan || 1) - 1 - ) - ); - - delete cell.colspan; - delete cell.rowspan; - - sheet.changedrendervalues = true; - - break; - - case "erase": - case "cut": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - if (cmd1 == "cut") { - // save copy of whole thing before erasing - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = SocialCalc.CreateSheetSave( - sheet, - what - ); - } - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - if (rest == "all") { - delete sheet.cells[cr]; - } else if (rest == "formulas") { - cell.datavalue = ""; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - delete cell.errors; - delete cell.displaystring; - delete cell.parseinfo; - if (cell.comment) { - // comments are considered content for erasing - delete cell.comment; - } - } else if (rest == "formats") { - newcell = new SocialCalc.Cell(cr); // create a new cell without attributes - newcell.datavalue = cell.datavalue; // copy existing values - newcell.datatype = cell.datatype; - newcell.formula = cell.formula; - newcell.valuetype = cell.valuetype; - if (cell.comment) { - newcell.comment = cell.comment; - } - sheet.cells[cr] = newcell; // replace - } - } - } - attribs.needsrecalc = "yes"; - break; - - case "fillright": - case "filldown": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - if (cmd1 == "fillright") { - fillright = true; - rowstart = cr1.row; - colstart = cr1.col + 1; - } else { - fillright = false; - rowstart = cr1.row + 1; - colstart = cr1.col; - } - for (row = rowstart; row <= cr2.row; row++) { - for (col = colstart; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - if (fillright) { - crbase = SocialCalc.crToCoord(cr1.col, row); - coloffset = col - colstart + 1; - rowoffset = 0; - } else { - crbase = SocialCalc.crToCoord(col, cr1.row); - coloffset = 0; - rowoffset = row - rowstart + 1; - } - basecell = sheet.GetAssuredCell(crbase); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - if (cell.datatype == "f") { - // offset relative coords, even in sheet references - cell.formula = SocialCalc.OffsetFormulaCoords( - basecell.formula, - coloffset, - rowoffset - ); - } else { - cell.formula = basecell.formula; - } - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - } - } - - attribs.needsrecalc = "yes"; - break; - - case "copy": - what = cmd.NextToken(); - rest = cmd.RestOfString(); - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = SocialCalc.CreateSheetSave( - sheet, - what - ); - break; - - case "loadclipboard": - rest = cmd.RestOfString(); - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = SocialCalc.decodeFromSave(rest); - break; - - case "clearclipboard": - if (saveundo) - changes.AddUndo( - "loadclipboard", - SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard) - ); - SocialCalc.Clipboard.clipboard = ""; - break; - - case "paste": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - if (!SocialCalc.Clipboard.clipboard) { - break; - } - clipsheet = new SocialCalc.Sheet(); // load clipboard contents as another sheet - clipsheet.ParseSheetSave(SocialCalc.Clipboard.clipboard); - cliprange = SocialCalc.ParseRange(clipsheet.copiedfrom); - coloffset = cr1.col - cliprange.cr1.col; // get sizes, etc. - rowoffset = cr1.row - cliprange.cr1.row; - numcols = cliprange.cr2.col - cliprange.cr1.col + 1; - numrows = cliprange.cr2.row - cliprange.cr1.row + 1; - if (cr1.col + numcols - 1 > attribs.lastcol) - attribs.lastcol = cr1.col + numcols - 1; - if (cr1.row + numrows - 1 > attribs.lastrow) - attribs.lastrow = cr1.row + numrows - 1; - - for (row = cr1.row; row < cr1.row + numrows; row++) { - for (col = cr1.col; col < cr1.col + numcols; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - crbase = SocialCalc.crToCoord(col - coloffset, row - rowoffset); - basecell = clipsheet.GetAssuredCell(crbase); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - attribtable = SocialCalc.CellPropertiesTable[attrib]; - if (attribtable && basecell[attrib]) { - // table indexes to expand to strings since other sheet may have diff indexes - cell[attrib] = sheet.GetStyleNum( - attribtable, - clipsheet.GetStyleString(attribtable, basecell[attrib]) - ); - } else { - // these are not table indexes - cell[attrib] = basecell[attrib]; - } - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - if (cell.datatype == "f") { - // offset relative coords, even in sheet references - cell.formula = SocialCalc.OffsetFormulaCoords( - basecell.formula, - coloffset, - rowoffset - ); - } else { - cell.formula = basecell.formula; - } - delete cell.parseinfo; - cell.errors = basecell.errors; - if (basecell.comment) { - // comments are pasted as part of content, though not filled, etc. - cell.comment = basecell.comment; - } else if (cell.comment) { - delete cell.comment; - } - } - delete cell.displaystring; - } - } - - attribs.needsrecalc = "yes"; - break; - - case "sort": // sort cr1:cr2 col1 up/down col2 up/down col3 up/down - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - ParseRange(); - cols = []; // get columns and sort directions (or "") - dirs = []; - lastsortcol = 0; - for (i = 0; i <= 3; i++) { - cols[i] = cmd.NextToken(); - dirs[i] = cmd.NextToken(); - if (cols[i]) lastsortcol = i; - } - - sortcells = {}; // a copy of the data which will replace the original, but in the new order - sortlist = []; // an array of 0, 1, ..., nrows-1 needed for sorting - sortvalues = []; // values to be sorted corresponding to sortlist - sorttypes = []; // basic types of the values - - for (row = cr1.row; row <= cr2.row; row++) { - // fill in the sort info - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.cells[cr]; - if (cell) { - // only copy non-empty cells - sortcells[cr] = sheet.CellToString(cell); - if (saveundo) - changes.AddUndo("set " + cr + " all", sortcells[cr]); - } else { - if (saveundo) changes.AddUndo("set " + cr + " all"); - } - } - sortlist.push(sortlist.length); - sortvalues.push([]); - sorttypes.push([]); - slast = sorttypes.length - 1; - for (i = 0; i <= lastsortcol; i++) { - cr = cols[i] + row; // get cr on this row in sort col - cell = sheet.GetAssuredCell(cr); - val = cell.datavalue; - valtype = cell.valuetype.charAt(0) || "b"; - if (valtype == "t") val = val.toLowerCase(); - sortvalues[slast].push(val); - sorttypes[slast].push(valtype); - } - } - - sortfunction = function (a, b) { - // a comparison function that can handle all the type variations - var i, a1, b1, ta, cresult; - for (i = 0; i <= lastsortcol; i++) { - if (dirs[i] == "up") { - // handle sort direction - a1 = a; - b1 = b; - } else { - a1 = b; - b1 = a; - } - ta = sorttypes[a1][i]; - tb = sorttypes[b1][i]; - if (ta == "t") { - // numbers < text < errors, blank always last no matter what dir - if (tb == "t") { - a1 = sortvalues[a1][i]; - b1 = sortvalues[b1][i]; - cresult = a1 > b1 ? 1 : a1 < b1 ? -1 : 0; - } else if (tb == "n") { - cresult = 1; - } else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } else if (tb == "e") { - cresult = -1; - } - } else if (ta == "n") { - if (tb == "t") { - cresult = -1; - } else if (tb == "n") { - a1 = sortvalues[a1][i] - 0; // force to numeric, just in case - b1 = sortvalues[b1][i] - 0; - cresult = a1 > b1 ? 1 : a1 < b1 ? -1 : 0; - } else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } else if (tb == "e") { - cresult = -1; - } - } else if (ta == "e") { - if (tb == "e") { - a1 = sortvalues[a1][i]; - b1 = sortvalues[b1][i]; - cresult = a1 > b1 ? 1 : a1 < b1 ? -1 : 0; - } else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } else { - cresult = 1; - } - } else if (ta == "b") { - if (tb == "b") { - cresult = 0; - } else { - cresult = dirs[i] == "up" ? 1 : -1; - } - } - if (cresult) { - // return if tested not equal, otherwise do next column - return cresult; - } - } - cresult = a > b ? 1 : a < b ? -1 : 0; // equal - return position in original to maintain it - return cresult; - }; - - sortlist.sort(sortfunction); - - for (row = cr1.row; row <= cr2.row; row++) { - // copy original rows into sorted positions - originalrow = sortlist[row - cr1.row]; // relative position where it was in original - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - sortedcr = SocialCalc.crToCoord(col, originalrow + cr1.row); // original cell to be put in new place - if (sortcells[sortedcr]) { - cell = new SocialCalc.Cell(cr); - sheet.CellFromStringParts( - cell, - sortcells[sortedcr].split(":"), - 1 - ); - if (cell.datatype == "f") { - // offset coord refs, even to ***relative*** coords in other sheets - cell.formula = SocialCalc.OffsetFormulaCoords( - cell.formula, - 0, - row - cr1.row - originalrow - ); - } - sheet.cells[cr] = cell; - } else { - delete sheet.cells[cr]; - } - } - } - - attribs.needsrecalc = "yes"; - break; - - case "insertcol": - case "insertrow": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - - if (cmd1 == "insertcol") { - coloffset = 1; - colend = cr1.col; - rowoffset = 0; - rowend = 1; - newcolstart = cr1.col; - newcolend = cr1.col; - newrowstart = 1; - newrowend = attribs.lastrow; - if (saveundo) changes.AddUndo("deletecol " + cr1.coord); - } else { - coloffset = 0; - colend = 1; - rowoffset = 1; - rowend = cr1.row; - newcolstart = 1; - newcolend = attribs.lastcol; - newrowstart = cr1.row; - newrowend = cr1.row; - if (saveundo) changes.AddUndo("deleterow " + cr1.coord); - } - - for (row = attribs.lastrow; row >= rowend; row--) { - // copy the cells forward - for (col = attribs.lastcol; col >= colend; col--) { - crbase = SocialCalc.crToCoord(col, row); - cr = SocialCalc.crToCoord(col + coloffset, row + rowoffset); - if (!sheet.cells[crbase]) { - // copying empty cell - delete sheet.cells[cr]; // delete anything that may have been there - } else { - // overwrite existing cell with moved contents - sheet.cells[cr] = sheet.cells[crbase]; - } - } - } - - for (row = newrowstart; row <= newrowend; row++) { - // fill the "new" empty cells - for (col = newcolstart; col <= newcolend; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = new SocialCalc.Cell(cr); - sheet.cells[cr] = cell; - crbase = SocialCalc.crToCoord(col - coloffset, row - rowoffset); // copy attribs of the one before (0 gives you A or 1) - basecell = sheet.GetAssuredCell(crbase); - for (attrib in cellProperties) { - if (cellProperties[attrib] == 2) { - // copy only format attributes - cell[attrib] = basecell[attrib]; - } - } - } - } - - for (cr in sheet.cells) { - // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell && cell.datatype == "f") { - cell.formula = SocialCalc.AdjustFormulaCoords( - cell.formula, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - } - if (cell) { - delete cell.parseinfo; - } - } - - for (name in sheet.names) { - // update cell references to moved cells in names - if (sheet.names[name]) { - // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = - v2 + - SocialCalc.AdjustFormulaCoords( - v1, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - } - } - - for ( - row = attribs.lastrow; - row >= rowend && cmd1 == "insertrow"; - row-- - ) { - // copy the row attributes forward - rownext = row + rowoffset; - for (attrib in sheet.rowattribs) { - val = sheet.rowattribs[attrib][row]; - if (sheet.rowattribs[attrib][rownext] != val) { - // make assignment only if different - if (val) { - sheet.rowattribs[attrib][rownext] = val; - } else { - delete sheet.rowattribs[attrib][rownext]; - } - } - } - } - - for ( - col = attribs.lastcol; - col >= colend && cmd1 == "insertcol"; - col-- - ) { - // copy the column attributes forward - colthis = SocialCalc.rcColname(col); - colnext = SocialCalc.rcColname(col + coloffset); - for (attrib in sheet.colattribs) { - val = sheet.colattribs[attrib][colthis]; - if (sheet.colattribs[attrib][colnext] != val) { - // make assignment only if different - if (val) { - sheet.colattribs[attrib][colnext] = val; - } else { - delete sheet.colattribs[attrib][colnext]; - } - } - } - } - - attribs.lastcol += coloffset; - attribs.lastrow += rowoffset; - attribs.needsrecalc = "yes"; - break; - - case "deletecol": - case "deleterow": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - lastcol = attribs.lastcol; // save old values since ParseRange sets... - lastrow = attribs.lastrow; - ParseRange(); - - if (cmd1 == "deletecol") { - coloffset = cr1.col - cr2.col - 1; - rowoffset = 0; - colstart = cr2.col + 1; - rowstart = 1; - } else { - coloffset = 0; - rowoffset = cr1.row - cr2.row - 1; - colstart = 1; - rowstart = cr2.row + 1; - } - - for (row = rowstart; row <= lastrow - rowoffset; row++) { - // copy the cells backwards - extra so no dup of last set - for (col = colstart; col <= lastcol - coloffset; col++) { - cr = SocialCalc.crToCoord(col + coloffset, row + rowoffset); - if ( - saveundo && - (row < rowstart - rowoffset || col < colstart - coloffset) - ) { - // save cells that are overwritten as undo info - cell = sheet.cells[cr]; - if (!cell) { - // empty cell - changes.AddUndo("erase " + cr + " all"); - } else { - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - } - } - crbase = SocialCalc.crToCoord(col, row); - cell = sheet.cells[crbase]; - if (!cell) { - // copying empty cell - delete sheet.cells[cr]; // delete anything that may have been there - } else { - // overwrite existing cell with moved contents - sheet.cells[cr] = cell; - } - } - } - - //!!! multiple deletes isn't setting #REF!; need to fix up #REF!'s on undo but only those! - - for (cr in sheet.cells) { - // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell) { - if (cell.datatype == "f") { - oldformula = cell.formula; - cell.formula = SocialCalc.AdjustFormulaCoords( - oldformula, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - if (cell.formula != oldformula) { - delete cell.parseinfo; - if (saveundo && cell.formula.indexOf("#REF!") != -1) { - // save old version only if removed coord - oldcr = SocialCalc.coordToCr(cr); - changes.AddUndo( - "set " + - SocialCalc.rcColname(oldcr.col - coloffset) + - (oldcr.row - rowoffset) + - " formula " + - oldformula - ); - } - } - } else { - delete cell.parseinfo; - } - } - } - - for (name in sheet.names) { - // update cell references to moved cells in names - if (sheet.names[name]) { - // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = - v2 + - SocialCalc.AdjustFormulaCoords( - v1, - cr1.col, - coloffset, - cr1.row, - rowoffset - ); - } - } - - for ( - row = rowstart; - row <= lastrow - rowoffset && cmd1 == "deleterow"; - row++ - ) { - // copy the row attributes backwards - rowbefore = row + rowoffset; - for (attrib in sheet.rowattribs) { - val = sheet.rowattribs[attrib][row]; - if (sheet.rowattribs[attrib][rowbefore] != val) { - // make assignment only if different - if (saveundo) - changes.AddUndo( - "set " + rowbefore + " " + attrib, - sheet.rowattribs[attrib][rowbefore] - ); - if (val) { - sheet.rowattribs[attrib][rowbefore] = val; - } else { - delete sheet.rowattribs[attrib][rowbefore]; - } - } - } - } - - for ( - col = colstart; - col <= lastcol - coloffset && cmd1 == "deletecol"; - col++ - ) { - // copy the column attributes backwards - colthis = SocialCalc.rcColname(col); - colbefore = SocialCalc.rcColname(col + coloffset); - for (attrib in sheet.colattribs) { - val = sheet.colattribs[attrib][colthis]; - if (sheet.colattribs[attrib][colbefore] != val) { - // make assignment only if different - if (saveundo) - changes.AddUndo( - "set " + colbefore + " " + attrib, - sheet.colattribs[attrib][colbefore] - ); - if (val) { - sheet.colattribs[attrib][colbefore] = val; - } else { - delete sheet.colattribs[attrib][colbefore]; - } - } - } - } - - if (saveundo) { - if (cmd1 == "deletecol") { - for (col = cr1.col; col <= cr2.col; col++) { - changes.AddUndo("insertcol " + SocialCalc.rcColname(col)); - } - } else { - for (row = cr1.row; row <= cr2.row; row++) { - changes.AddUndo("insertrow " + row); - } - } - } - - if (cmd1 == "deletecol") { - if (cr1.col <= lastcol) { - // shrink sheet unless deleted phantom cols off the end - if (cr2.col <= lastcol) { - attribs.lastcol += coloffset; - } else { - attribs.lastcol = cr1.col - 1; - } - } - } else { - if (cr1.row <= lastrow) { - // shrink sheet unless deleted phantom rows off the end - if (cr2.row <= lastrow) { - attribs.lastrow += rowoffset; - } else { - attribs.lastrow = cr1.row - 1; - } - } - } - attribs.needsrecalc = "yes"; - break; - - case "movepaste": - case "moveinsert": - var movingcells, - dest, - destcr, - inserthoriz, - insertvert, - pushamount, - movedto; - - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - dest = cmd.NextToken(); - rest = cmd.RestOfString(); // rest is all/formulas/formats - if (rest == "") rest = "all"; - - ParseRange(); - - destcr = SocialCalc.coordToCr(dest); - - coloffset = destcr.col - cr1.col; - rowoffset = destcr.row - cr1.row; - numcols = cr2.col - cr1.col + 1; - numrows = cr2.row - cr1.row + 1; - - // get a copy of moving cells and erase from where they were - - movingcells = {}; - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - - if (!sheet.cells[cr]) { - // if had nothing - continue; // don't save anything - } - movingcells[cr] = new SocialCalc.Cell(cr); // create new cell to copy - - for (attrib in cellProperties) { - // go through each property - if (typeof cell[attrib] === undefined) { - // don't copy undefined things and no need to delete - continue; - } else { - movingcells[cr][attrib] = cell[attrib]; // copy for potential moving - } - if (rest == "all") { - delete cell[attrib]; - } - if (rest == "formulas") { - if ( - cellProperties[attrib] == 1 || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } - } - if (rest == "formats") { - if (cellProperties[attrib] == 2) { - delete cell[attrib]; - } - } - } - if (rest == "formulas") { - // leave pristene deleted cell - cell.datavalue = ""; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - } - if (rest == "all") { - // leave nothing for move all - delete sheet.cells[cr]; - } - } - } - - // if moveinsert, check destination OK, and calculate pushing parameters - - if (cmd1 == "moveinsert") { - inserthoriz = false; - insertvert = false; - if ( - rowoffset == 0 && - (destcr.col < cr1.col || destcr.col > cr2.col) - ) { - if (destcr.col < cr1.col) { - // moving left - pushamount = cr1.col - destcr.col; - inserthoriz = -1; - } else { - destcr.col -= 1; - coloffset = destcr.col - cr2.col; - pushamount = destcr.col - cr2.col; - inserthoriz = 1; - } - } else if ( - coloffset == 0 && - (destcr.row < cr1.row || destcr.row > cr2.row) - ) { - if (destcr.row < cr1.row) { - // moving up - pushamount = cr1.row - destcr.row; - insertvert = -1; - } else { - destcr.row -= 1; - rowoffset = destcr.row - cr2.row; - pushamount = destcr.row - cr2.row; - insertvert = 1; - } - } else { - cmd1 = "movepaste"; // not allowed right now - ignore - } - } - - // push any cells that need pushing - - movedto = {}; // remember what was moved where - - if (insertvert) { - for (row = 0; row < pushamount; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - if (insertvert < 0) { - crbase = SocialCalc.crToCoord( - col, - destcr.row + pushamount - row - 1 - ); // from cell - cr = SocialCalc.crToCoord(col, cr2.row - row); // to cell - } else { - crbase = SocialCalc.crToCoord( - col, - destcr.row - pushamount + row + 1 - ); // from cell - cr = SocialCalc.crToCoord(col, cr1.row + row); // to cell - } - - basecell = sheet.GetAssuredCell(crbase); - if (saveundo) - changes.AddUndo( - "set " + crbase + " all", - sheet.CellToString(basecell) - ); - - cell = sheet.GetAssuredCell(cr); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - - movedto[crbase] = cr; // old crbase is now at cr - } - } - } - if (inserthoriz) { - for (col = 0; col < pushamount; col++) { - for (row = cr1.row; row <= cr2.row; row++) { - if (inserthoriz < 0) { - crbase = SocialCalc.crToCoord( - destcr.col + pushamount - col - 1, - row - ); - cr = SocialCalc.crToCoord(cr2.col - col, row); - } else { - crbase = SocialCalc.crToCoord( - destcr.col - pushamount + col + 1, - row - ); - cr = SocialCalc.crToCoord(cr1.col + col, row); - } - - basecell = sheet.GetAssuredCell(crbase); - if (saveundo) - changes.AddUndo( - "set " + crbase + " all", - sheet.CellToString(basecell) - ); - - cell = sheet.GetAssuredCell(cr); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - - movedto[crbase] = cr; // old crbase is now at cr - } - } - } - - // paste moved cells into new place - - if (destcr.col + numcols - 1 > attribs.lastcol) - attribs.lastcol = destcr.col + numcols - 1; - if (destcr.row + numrows - 1 > attribs.lastrow) - attribs.lastrow = destcr.row + numrows - 1; - - for (row = cr1.row; row < cr1.row + numrows; row++) { - for (col = cr1.col; col < cr1.col + numcols; col++) { - cr = SocialCalc.crToCoord(col + coloffset, row + rowoffset); - cell = sheet.GetAssuredCell(cr); - if (saveundo) - changes.AddUndo("set " + cr + " all", sheet.CellToString(cell)); - - crbase = SocialCalc.crToCoord(col, row); // get old cell to move - - movedto[crbase] = cr; // old crbase (moved cell) will now be at cr (destination) - - if (rest == "all" && !movingcells[crbase]) { - // moving an empty cell - delete sheet.cells[cr]; // make the cell empty - continue; - } - - basecell = movingcells[crbase]; - if (!basecell) basecell = sheet.GetAssuredCell(crbase); - - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if ( - typeof basecell[attrib] === undefined || - cellProperties[attrib] == 3 - ) { - delete cell[attrib]; - } else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - if (basecell.comment) { - // comments are pasted as part of content, though not filled, etc. - cell.comment = basecell.comment; - } else if (cell.comment) { - delete cell.comment; - } - } - delete cell.displaystring; - } - } - - // do fixups - - for (cr in sheet.cells) { - // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell) { - if (cell.datatype == "f") { - oldformula = cell.formula; - cell.formula = SocialCalc.ReplaceFormulaCoords( - oldformula, - movedto - ); - if (cell.formula != oldformula) { - delete cell.parseinfo; - if (saveundo && !movedto[cr]) { - // moved cells are already saved for undo - changes.AddUndo("set " + cr + " formula " + oldformula); - } - } - } else { - delete cell.parseinfo; - } - } - } - - for (name in sheet.names) { - // update cell references to moved cells in names - if (sheet.names[name]) { - // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - oldformula = v1; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = - v2 + SocialCalc.ReplaceFormulaCoords(v1, movedto); - if (saveundo && sheet.names[name].definition != oldformula) { - // save changes - changes.AddUndo("name define " + name + " " + oldformula); - } - } - } - - attribs.needsrecalc = "yes"; - break; - - case "name": - what = cmd.NextToken(); - name = cmd.NextToken(); - rest = cmd.RestOfString(); - - name = name.toUpperCase().replace(/[^A-Z0-9_\.]/g, ""); - if (name == "") break; // must have something - - if (what == "define") { - if (rest == "") break; // must have something - if (sheet.names[name]) { - // already exists - if (saveundo) - changes.AddUndo( - "name define " + name + " " + sheet.names[name].definition - ); - sheet.names[name].definition = rest; - } else { - // new - if (saveundo) changes.AddUndo("name delete " + name); - sheet.names[name] = { definition: rest, desc: "" }; - } - } else if (what == "desc") { - if (sheet.names[name]) { - // must already exist - if (saveundo) - changes.AddUndo( - "name desc " + name + " " + sheet.names[name].desc - ); - sheet.names[name].desc = rest; - } - } else if (what == "delete") { - if (saveundo) { - if (sheet.names[name].desc) - changes.AddUndo( - "name desc " + name + " " + sheet.names[name].desc - ); - changes.AddUndo( - "name define " + name + " " + sheet.names[name].definition - ); - } - delete sheet.names[name]; - } - attribs.needsrecalc = "yes"; - - break; - - case "recalc": - attribs.needsrecalc = "yes"; // request recalc - sheet.recalconce = true; // even if turned off - break; - - case "redisplay": - sheet.renderneeded = true; - break; - - case "changedrendervalues": // needed for undo sometimes - sheet.changedrendervalues = true; - break; - - case "startcmdextension": // startcmdextension extension rest-of-command - name = cmd.NextToken(); - cmdextension = SocialCalc.SheetCommandInfo.CmdExtensionCallbacks[name]; - if (cmdextension) { - cmdextension.func(name, cmdextension.data, sheet, cmd, saveundo); - } - break; - - default: - errortext = scc.s_escUnknownCmd + cmdstr; - break; - } - - /* For Debugging: -var ustack=""; -for (var i=0;i= 0; i--) { - // do them backwards - if (cmdstr) cmdstr += "\n"; // concatenate with separate lines - cmdstr += tos.undo[i]; - } - sheet.changes.Undo(); - sheet.ScheduleSheetCommands(cmdstr, false); // do undo operations - }; - - SocialCalc.SheetRedo = function (sheet) { - var tos, i; - var didredo = sheet.changes.Redo(); - if (!didredo) { - sheet.ScheduleSheetCommands("", false); // schedule doing nothing - return; - } - tos = sheet.changes.TOS(); - var cmdstr = ""; - - for (i = 0; tos && i < tos.command.length; i++) { - if (cmdstr) cmdstr += "\n"; // concatenate with separate lines - cmdstr += tos.command[i]; - } - sheet.ScheduleSheetCommands(cmdstr, false); // do undo operations - }; - - SocialCalc.CreateAuditString = function (sheet) { - var i, j; - var result = ""; - var stack = sheet.changes.stack; - var tos = sheet.changes.tos; - for (i = 0; i <= tos; i++) { - for (j = 0; j < stack[i].command.length; j++) { - result += stack[i].command[j] + "\n"; - } - } - - return result; - }; - - SocialCalc.GetStyleNum = function (sheet, atype, style) { - var num; - - if (style.length == 0) return 0; // null means use zero, which means default or global default - - num = sheet[atype + "hash"][style]; - if (!num) { - if (sheet[atype + "s"].length < 1) sheet[atype + "s"].push(""); - num = sheet[atype + "s"].push(style) - 1; - sheet[atype + "hash"][style] = num; - sheet.changedrendervalues = true; - } - return num; - }; - - SocialCalc.GetStyleString = function (sheet, atype, num) { - if (!num) return null; // zero, null, and undefined return null - - return sheet[atype + "s"][num]; - }; - - // - // updatedformula = SocialCalc.OffsetFormulaCoords(formula, coloffset, rowoffset) - // - // Change relative cell references by offsets (even those to other worksheets so fill, paste, sort work as expected). - // If not what you want, use absolute references. - // - - SocialCalc.OffsetFormulaCoords = function (formula, coloffset, rowoffset) { - var parseinfo, ttext, ttype, i, cr, newcr; - var updatedformula = ""; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = scf.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - if (ttype == token_coord) { - newcr = ""; - cr = SocialCalc.coordToCr(ttext); - if (ttext.charAt(0) != "$") { - // add col offset unless absolute column - cr.col += coloffset; - } else { - newcr += "$"; - } - newcr += SocialCalc.rcColname(cr.col); - if (ttext.indexOf("$", 1) == -1) { - // add row offset unless absolute row - cr.row += rowoffset; - } else { - newcr += "$"; - } - newcr += cr.row; - if (cr.row < 1 || cr.col < 1) { - newcr = "#REF!"; - } - updatedformula += newcr; - } else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { - // quotes to double - updatedformula += '"' + ttext.replace(/"/, '""') + '"'; - } else updatedformula += '"' + ttext + '"'; - } else if (ttype == token_op) { - updatedformula += tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } else { - // leave everything else alone - updatedformula += ttext; - } - } - - return updatedformula; - }; - - // - // updatedformula = SocialCalc.AdjustFormulaCoords(formula, col, coloffset, row, rowoffset) - // - // Change all cell references to cells starting with col/row by offsets - // - - SocialCalc.AdjustFormulaCoords = function ( - formula, - col, - coloffset, - row, - rowoffset - ) { - var ttype, ttext, i, newcr; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - if (ttype == token_op) { - // references with sheet specifier are not offset - if (ttext == "!") { - sheetref = true; // found a sheet reference - } else if (ttext != ":") { - // for everything but a range, reset - sheetref = false; - } - ttext = tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } - if (ttype == token_coord) { - cr = SocialCalc.coordToCr(ttext); - if ( - (coloffset < 0 && cr.col >= col && cr.col < col - coloffset) || - (rowoffset < 0 && cr.row >= row && cr.row < row - rowoffset) - ) { - // refs to deleted cells become invalid - if (!sheetref) { - cr.col = 0; - cr.row = 0; - } - } - if (!sheetref) { - if (cr.col >= col) { - cr.col += coloffset; - } - if (cr.row >= row) { - cr.row += rowoffset; - } - } - if (ttext.charAt(0) == "$") { - newcr = "$" + SocialCalc.rcColname(cr.col); - } else { - newcr = SocialCalc.rcColname(cr.col); - } - if (ttext.indexOf("$", 1) != -1) { - newcr += "$" + cr.row; - } else { - newcr += cr.row; - } - if (cr.row < 1 || cr.col < 1) { - newcr = "#REF!"; - } - ttext = newcr; - } else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { - // quotes to double - ttext = '"' + ttext.replace(/"/, '""') + '"'; - } else ttext = '"' + ttext + '"'; - } - updatedformula += ttext; - } - - return updatedformula; - }; - - // - // updatedformula = SocialCalc.ReplaceFormulaCoords(formula, movedto) - // - // Change all cell references to cells that are keys in moveto to be to moveto[coord]. - // Don't change references to other sheets. - // Handle range extents specially. - // - - SocialCalc.ReplaceFormulaCoords = function (formula, movedto) { - var ttype, ttext, i, newcr, coord; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - if (ttype == token_op) { - // references with sheet specifier are not change - if (ttext == "!") { - sheetref = true; // found a sheet reference - } else if (ttext != ":") { - // for everything but a range, reset - sheetref = false; - } - - //!!!! HANDLE RANGE EXTENT MOVES - - ttext = tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } - if (ttype == token_coord) { - cr = SocialCalc.coordToCr(ttext); // get parts - coord = SocialCalc.crToCoord(cr.col, cr.row); // get "clean" reference - if (movedto[coord] && !sheetref) { - // this is a reference to a moved cell - cr = SocialCalc.coordToCr(movedto[coord]); // get new row and col - if (ttext.charAt(0) == "$") { - // copy absolute ref marks if present - newcr = "$" + SocialCalc.rcColname(cr.col); - } else { - newcr = SocialCalc.rcColname(cr.col); - } - if (ttext.indexOf("$", 1) != -1) { - newcr += "$" + cr.row; - } else { - newcr += cr.row; - } - ttext = newcr; - } - } else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { - // quotes to double - ttext = '"' + ttext.replace(/"/, '""') + '"'; - } else ttext = '"' + ttext + '"'; - } - updatedformula += ttext; - } - - return updatedformula; - }; - - // ************************ - // - // Recalc Loop Code - // - // ************************ - - // - // How recalc works: - // - // !!!!!!!!!!!!!! - // - - // SocialCalc.RecalcInfo - object with global recalc info - - SocialCalc.RecalcInfo = { - sheet: null, // which sheet is being recalced - - currentState: 0, // current state - state: { start_calc: 1, order: 2, calc: 3, start_wait: 4, done_wait: 5 }, // allowed state values - - recalctimer: null, // value to cancel timer - maxtimeslice: 100, // maximum milliseconds per slice of recalc time before a wait - timeslicedelay: 1, // milliseconds to wait between recalc time slices - starttime: 0, // when recalc started - - // LoadSheet: a function that returns true if started a load or false if not. - // - - LoadSheet: function (sheetname) { - return false; - }, // default returns not found - }; - - // SocialCalc.RecalcData - object with recalc info while determining recalc order and afterward - - SocialCalc.RecalcData = function () { - // initialize a RecalcData object - - this.inrecalc = true; // if true, doing a recalc - this.celllist = []; // list with all potential cells to calculate - this.celllistitem = 0; // cell to check next when ordering - this.calclist = null; // object which is the chained list of cells to calculate - // each in the form of "coord: nextcoord" - // e.g., if B8 is calculated right after A8, then calclist.A8=="B8" - // if null, need to create the list - this.calclistlength = 0; // number of items in calclist - - this.firstcalc = null; // start of the calc list - a string or null - this.lastcalc = null; // last one on chain (used to add more to the end) - - this.nextcalc = null; // used to keep track during background recalc to make it restartable - this.count = 0; // number calculated - - // checkinfo is used when determining calc order: - - this.checkinfo = {}; // attributes are coords; if no attrib for a coord, it wasn't checked or doesn't need it - // values are RecalcCheckInfo objects while checking or TRUE when complete - }; - - // SocialCalc.RecalcCheckInfo - object that stores checking info while determining recalc order - - SocialCalc.RecalcCheckInfo = function () { - // initialize a RecalcCheckInfo object - - this.oldcoord = null; // chain back up of cells referring to cells - this.parsepos = 0; // which token we are up to - - // range info - - this.inrange = false; // if true, in the process of checking a range of coords - this.inrangestart = false; // if true, have not yet filled in range loop values - this.cr1 = null; // range first coord as a cr object - this.cr2 = null; // range second coord as a cr object - this.c1 = null; // range extents - this.c2 = null; - this.r1 = null; - this.r2 = null; - this.c = null; // looping values - this.r = null; - }; - - // Recalc the entire sheet - - SocialCalc.RecalcSheet = function (sheet) { - var coord, err, recalcdata; - var scri = SocialCalc.RecalcInfo; - - delete sheet.attribs.circularreferencecell; // reset recalc-wide things - SocialCalc.Formula.FreshnessInfoReset(); - - SocialCalc.RecalcClearTimeout(); - - scri.sheet = sheet; // set values needed by background recalc - scri.currentState = scri.state.start_calc; - - scri.starttime = new Date(); - - if (sheet.statuscallback) { - sheet.statuscallback(scri, "calcstart", null, sheet.statuscallbackparams); - } - - SocialCalc.RecalcSetTimeout(); - }; - - // - // SocialCalc.RecalcSetTimeout - set a timer for next recalc step - // - - SocialCalc.RecalcSetTimeout = function () { - var scri = SocialCalc.RecalcInfo; - - scri.recalctimer = window.setTimeout( - SocialCalc.RecalcTimerRoutine, - scri.timeslicedelay - ); - }; - - // - // SocialCalc.RecalcClearTimeout - cancel any timeouts - // - - SocialCalc.RecalcClearTimeout = function () { - var scri = SocialCalc.RecalcInfo; - - if (scri.recalctimer) { - window.clearTimeout(scri.recalctimer); - scri.recalctimer = null; - } - }; - - // - // SocialCalc.RecalcLoadedSheet(sheetname, str, recalcneeded) - // - // Called when a sheet finishes loading with name, string, and t/f whether it should be recalced. - // If loaded sheet has sheet.attribs.recalc=="off", then no recalc done. - // If sheetname is null, then the sheetname waiting for will be used. - // - - SocialCalc.RecalcLoadedSheet = function (sheetname, str, recalcneeded) { - var sheet; - var scri = SocialCalc.RecalcInfo; - var scf = SocialCalc.Formula; - - sheet = SocialCalc.Formula.AddSheetToCache( - sheetname || scf.SheetCache.waitingForLoading, - str - ); - - if (recalcneeded && sheet && sheet.attribs.recalc != "off") { - // if recalcneeded, and not manual sheet, chain in this new sheet to recalc loop - sheet.previousrecalcsheet = scri.sheet; - scri.sheet = sheet; - scri.currentState = scri.state.start_calc; - } - scf.SheetCache.waitingForLoading = null; - - SocialCalc.RecalcSetTimeout(); - }; - - // - // SocialCalc.RecalcTimerRoutine - handles the actual order determination and cell-by-cell recalculation in the background - // - - SocialCalc.RecalcTimerRoutine = function () { - var eresult, cell, coord, err, status; - var starttime = new Date(); - var count = 0; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var scri = SocialCalc.RecalcInfo; - var sheet = scri.sheet; - if (!sheet) { - return; - } - var recalcdata = sheet.recalcdata; - - var do_statuscallback = function (status, arg) { - // routine to do callback if required - if (sheet.statuscallback) { - sheet.statuscallback( - recalcdata, - status, - arg, - sheet.statuscallbackparams - ); - } - }; - - SocialCalc.RecalcClearTimeout(); - - if (scri.currentState == scri.state.start_calc) { - recalcdata = new SocialCalc.RecalcData(); - sheet.recalcdata = recalcdata; - - for (coord in sheet.cells) { - // get list of cells to check for order - if (!coord) continue; - recalcdata.celllist.push(coord); - } - - recalcdata.calclist = {}; // start with empty list - scri.currentState = scri.state.order; // drop through to determining recalc order - } - - if (scri.currentState == scri.state.order) { - while (recalcdata.celllistitem < recalcdata.celllist.length) { - // check all the cells to see if they should be on the list - coord = recalcdata.celllist[recalcdata.celllistitem++]; - err = SocialCalc.RecalcCheckCell(sheet, coord); - if (new Date() - starttime >= scri.maxtimeslice) { - // if taking too long, give up CPU for a while - do_statuscallback("calcorder", { - coord: coord, - total: recalcdata.celllist.length, - count: recalcdata.celllistitem, - }); - SocialCalc.RecalcSetTimeout(); - return; - } - } - - do_statuscallback("calccheckdone", recalcdata.calclistlength); - - recalcdata.nextcalc = recalcdata.firstcalc; // start at the beginning of the recalc chain - scri.currentState = scri.state.calc; // loop through cells on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - if (scri.currentState == scri.state.start_wait) { - // starting to wait for something - scri.currentState = scri.state.done_wait; // finished on next timer call - if (scri.LoadSheet) { - status = scri.LoadSheet(scf.SheetCache.waitingForLoading); - if (status) { - // started a load operation - return; - } - } - SocialCalc.RecalcLoadedSheet(null, "", false); - return; - } - - if (scri.currentState == scri.state.done_wait) { - scri.currentState = scri.state.calc; // loop through cells on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - // otherwise should be scri.state.calc - - if (scri.currentState != scri.state.calc) { - alert( - "Recalc state error: " + - scri.currentState + - ". Error in SocialCalc code." - ); - } - - coord = sheet.recalcdata.nextcalc; - while (coord) { - cell = sheet.cells[coord]; - eresult = scf.evaluate_parsed_formula(cell.parseinfo, sheet, false); - if (scf.SheetCache.waitingForLoading) { - // wait until restarted - recalcdata.nextcalc = coord; // start with this cell again - recalcdata.count += count; - do_statuscallback("calcloading", { - sheetname: scf.SheetCache.waitingForLoading, - }); - scri.currentState = scri.state.start_wait; // start load on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - if (scf.RemoteFunctionInfo.waitingForServer) { - // wait until restarted - recalcdata.nextcalc = coord; // start with this cell again - recalcdata.count += count; - do_statuscallback("calcserverfunc", { - funcname: scf.RemoteFunctionInfo.waitingForServer, - coord: coord, - total: recalcdata.calclistlength, - count: recalcdata.count, - }); - scri.currentState = scri.state.done_wait; // start load on next timer call - return; // return and wait for next recalc timer event - } - - if (cell.datavalue != eresult.value || cell.valuetype != eresult.type) { - // only update if changed from last time - cell.datavalue = eresult.value; - cell.valuetype = eresult.type; - delete cell.displaystring; - sheet.recalcchangedavalue = true; // remember something changed in case other code wants to know - } - if (eresult.error) { - cell.errors = eresult.error; - } - count++; - coord = sheet.recalcdata.calclist[coord]; - - if (new Date() - starttime >= scri.maxtimeslice) { - // if taking too long, give up CPU for a while - recalcdata.nextcalc = coord; // start with next cell on chain - recalcdata.count += count; - do_statuscallback("calcstep", { - coord: coord, - total: recalcdata.calclistlength, - count: recalcdata.count, - }); - SocialCalc.RecalcSetTimeout(); - return; - } - } - - recalcdata.inrecalc = false; - - delete sheet.recalcdata; // save memory and clear out for name lookup formula evaluation - - delete sheet.attribs.needsrecalc; // remember recalc done - - scri.sheet = sheet.previousrecalcsheet || null; // chain back if doing recalc of loaded sheets - if (scri.sheet) { - scri.currentState = scri.state.calc; // start where we left off - SocialCalc.RecalcSetTimeout(); - return; - } - - scf.FreshnessInfo.recalc_completed = true; // say freshness info is complete - - do_statuscallback("calcfinished", new Date() - scri.starttime); - }; - - // - // circref = SocialCalc.RecalcCheckCell(sheet, coord) - // - // Checks cell to put on calclist, looking at parsed tokens. - // Also checks cells this cell is dependent upon - // if it contains a formula with cell references. - // If circular reference, returns non-null. - // - - SocialCalc.RecalcCheckCell = function (sheet, startcoord) { - var parseinfo, - ttext, - ttype, - i, - rangecoord, - circref, - value, - pos, - pos2, - cell, - coordvals; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_name = tokentype.name; - var token_coord = tokentype.coord; - - var recalcdata = sheet.recalcdata; - var checkinfo = recalcdata.checkinfo; - - var sheetref = false; // if true, a sheet reference is in effect, so don't check that - var oldcoord = null; // coord of formula that referred to this one when checking down the tree - var coord = startcoord; // the coord of the cell we are checking - - // Start with requested cell, and then continue down or up the dependency tree - // oldcoord (and checkinfo[coord].oldcoord) maintains the reference stack during the tree walk - // checkinfo[coord] maintains the stack of checking looping values, e.g., token number being checked - - mainloop: while (coord) { - cell = sheet.cells[coord]; - coordvals = checkinfo[coord]; - - if ( - !cell || - cell.datatype != "f" || // Don't calculate if not a formula - (coordvals && typeof coordvals != "object") - ) { - // Don't calc if already calculated - coord = oldcoord; // go back up dependency tree to coord that referred to us - if (checkinfo[coord]) oldcoord = checkinfo[coord].oldcoord; - continue; - } - - if (!coordvals) { - // do we have checking information about this cell? - coordvals = new SocialCalc.RecalcCheckInfo(); // no - make a place to hold it - checkinfo[coord] = coordvals; - } - - if (cell.errors) { - // delete errors from previous recalcs - delete cell.errors; - } - - if (!cell.parseinfo) { - // cache parsed formula - cell.parseinfo = scf.ParseFormulaIntoTokens(cell.formula); - } - parseinfo = cell.parseinfo; - - for (i = coordvals.parsepos; i < parseinfo.length; i++) { - // go through each token in formula - - if (coordvals.inrange) { - // processing a range of coords - if (coordvals.inrangestart) { - // first time - fill in other values - if (coordvals.cr1.col > coordvals.cr2.col) { - coordvals.c1 = coordvals.cr2.col; - coordvals.c2 = coordvals.cr1.col; - } else { - coordvals.c1 = coordvals.cr1.col; - coordvals.c2 = coordvals.cr2.col; - } - coordvals.c = coordvals.c1 - 1; // start one before - - if (coordvals.cr1.row > coordvals.cr2.row) { - coordvals.r1 = coordvals.cr2.row; - coordvals.r2 = coordvals.cr1.row; - } else { - coordvals.r1 = coordvals.cr1.row; - coordvals.r2 = coordvals.cr2.row; - } - coordvals.r = coordvals.r1; // start on this row - coordvals.inrangestart = false; - } else { - // not first time - } - coordvals.c += 1; // increment column - if (coordvals.c > coordvals.c2) { - // finished the columns of this row - coordvals.r += 1; // increment row - if (coordvals.r > coordvals.r2) { - // finished checking the entire range - coordvals.inrange = false; - continue; - } - coordvals.c = coordvals.c1; // start at the beginning of next row - } - rangecoord = SocialCalc.crToCoord(coordvals.c, coordvals.r); - - // now check that one - - coordvals.parsepos = i; // remember our position - coordvals.oldcoord = oldcoord; // remember back up chain - oldcoord = coord; // come back to us - coord = rangecoord; - if (checkinfo[coord] && typeof checkinfo[coord] == "object") { - // Circular reference - cell.errors = SocialCalc.Constants.s_caccCircRef + startcoord; // set on original cell making the ref - checkinfo[startcoord] = true; // this one should be calculated once at this point - if (!recalcdata.firstcalc) { - recalcdata.firstcalc = startcoord; - } else { - recalcdata.calclist[recalcdata.lastcalc] = startcoord; - } - recalcdata.lastcalc = startcoord; - recalcdata.calclistlength++; // count number on list - sheet.attribs.circularreferencecell = coord + "|" + oldcoord; // remember at least one circ ref - return cell.errors; - } - continue mainloop; - } - - ttype = parseinfo[i].type; // get token details - ttext = parseinfo[i].text; - if (ttype == token_op) { - // references with sheet specifier are not checked - if (ttext == "!") { - sheetref = true; // found a sheet reference - } else if (ttext != ":") { - // for everything but a range, reset - sheetref = false; - } - } - - if (ttype == token_name) { - // look for named range - value = scf.LookupName(sheet, ttext); - if (value.type == "range") { - // only need to recurse here for range, which may be just one cell - pos = value.value.indexOf("|"); - if (pos != -1) { - // range - check each cell - coordvals.cr1 = SocialCalc.coordToCr( - value.value.substring(0, pos) - ); - pos2 = value.value.indexOf("|", pos + 1); - coordvals.cr2 = SocialCalc.coordToCr( - value.value.substring(pos + 1, pos2) - ); - coordvals.inrange = true; - coordvals.inrangestart = true; - i = i - 1; // back up so will start up again here - continue; - } - } else if (value.type == "coord") { - // just a coord - ttype = token_coord; // treat as a coord inline - ttext = value.value; // and then drop through to next test which should succeed - } else { - // not a defined name - probably a function - } - } - - if (ttype == token_coord) { - // token is a coord - - if ( - i >= 2 && // look for a range - parseinfo[i - 1].type == token_op && - parseinfo[i - 1].text == ":" && - parseinfo[i - 2].type == token_coord && - !sheetref - ) { - // Range -- check each cell - coordvals.cr1 = SocialCalc.coordToCr(parseinfo[i - 2].text); // remember range extents - coordvals.cr2 = SocialCalc.coordToCr(ttext); - coordvals.inrange = true; // next time use the range looping code - coordvals.inrangestart = true; - i = i - 1; // back up so will start up again here - continue; - } else if (!sheetref) { - // Single cell reference - if (ttext.indexOf("$") != -1) ttext = ttext.replace(/\$/g, ""); // remove any $'s - coordvals.parsepos = i + 1; // remember our position - come back on next token - coordvals.oldcoord = oldcoord; // remember back up chain - oldcoord = coord; // come back to us - coord = ttext; - if (checkinfo[coord] && typeof checkinfo[coord] == "object") { - // Circular reference - cell.errors = SocialCalc.Constants.s_caccCircRef + startcoord; // set on original cell making the ref - checkinfo[startcoord] = true; // this one should be calculated once at this point - if (!recalcdata.firstcalc) { - // add to calclist - recalcdata.firstcalc = startcoord; - } else { - recalcdata.calclist[recalcdata.lastcalc] = startcoord; - } - recalcdata.lastcalc = startcoord; - recalcdata.calclistlength++; // count number on list - sheet.attribs.circularreferencecell = coord + "|" + oldcoord; // remember at least one circ ref - return cell.errors; - } - continue mainloop; - } - } - } - - sheetref = false; // make sure off when bump back up - - checkinfo[coord] = true; // this one is finished - if (!recalcdata.firstcalc) { - // add to calclist - recalcdata.firstcalc = coord; - } else { - recalcdata.calclist[recalcdata.lastcalc] = coord; - } - recalcdata.lastcalc = coord; - recalcdata.calclistlength++; // count number on list - - coord = oldcoord; // go back to the formula that referred to us and continue - oldcoord = checkinfo[coord] ? checkinfo[coord].oldcoord : null; - } - - return ""; - }; - - // ************************************* - // - // Parse class: - // - // Used by ExecuteSheetCommand to get elements of commands to execute. - // The string it works with consists of one or more lines each - // made up of one or more tokens separated by a delimiter. - // - // ************************************* - - // Initialize: set string to work with - - SocialCalc.Parse = function (str) { - // properties: - - this.str = str; - this.pos = 0; - this.delimiter = " "; - this.lineEnd = str.indexOf("\n"); - if (this.lineEnd < 0) { - this.lineEnd = str.length; - } - }; - - // Return next token as a string - - SocialCalc.Parse.prototype.NextToken = function () { - if (this.pos < 0) return ""; - var pos2 = this.str.indexOf(this.delimiter, this.pos); - var pos1 = this.pos; - if (pos2 > this.lineEnd) { - // don't go past end of line - pos2 = this.lineEnd; - } - if (pos2 >= 0) { - this.pos = pos2 + 1; - return this.str.substring(pos1, pos2); - } else { - this.pos = this.lineEnd; - return this.str.substring(pos1, this.lineEnd); - } - }; - - // Return everything from current point until end of line - - SocialCalc.Parse.prototype.RestOfString = function () { - var oldpos = this.pos; - if (this.pos < 0 || this.pos >= this.lineEnd) return ""; - this.pos = this.lineEnd; - return this.str.substring(oldpos, this.lineEnd); - }; - - SocialCalc.Parse.prototype.RestOfStringNoMove = function () { - if (this.pos < 0 || this.pos >= this.lineEnd) return ""; - return this.str.substring(this.pos, this.lineEnd); - }; - - // Move current point to next line - - SocialCalc.Parse.prototype.NextLine = function () { - this.pos = this.lineEnd + 1; - this.lineEnd = this.str.indexOf("\n", this.pos); - if (this.lineEnd < 0) { - this.lineEnd = this.str.length; - } - }; - - // Check to see if at end of string with no more to process - - SocialCalc.Parse.prototype.EOF = function () { - if (this.pos < 0 || this.pos >= this.str.length) return true; - return false; - }; - - // ************************************* - // - // UndoStack class: - // - // Implements the behavior needed for a normal application's undo/redo stack. - // You add a new change sequence with PushChange. - // The type argument is a string that can be used to lookup some general string - // like "typing" or "setting attribute" for the menu prompts for undo/redo. - // - // You add the "do" steps with AddDo. The non-null, non-undefined arguments are - // joined together with " " to make a command string to be saved. - // - // You add the undo steps as commands for the most recent change with AddUndo. - // The non-null, non-undefined arguments are joined together with " " to make - // a command string to be saved. - // - // The Undo and Redo functions move the Top Of Stack pointer through the changes stack - // so you can undo and redo. Doing a new PushChange removes all undone items - // after TOS. - // - // You can push more things than you can undo if you want. - // There is a maximum to remember as the "did" stack for an audit trail (and as redo). This may be unlimited. - // There is a separate maximum to remember that can be undone. This may be smaller than maxRedo. - // - // ************************************* - - SocialCalc.UndoStack = function () { - // properties: - - this.stack = []; // {command: [], type: type, undo: []} -- multiple dos and undos allowed - this.tos = -1; // top of stack position, used for undo/redo - this.maxRedo = 0; // Maximum size of redo stack (and audit trail which is this.stack[n].command) or zero if no limit - this.maxUndo = 50; // Maximum number of steps kept for undo (usually the memory intensive part) or zero if no limit - }; - - SocialCalc.UndoStack.prototype.PushChange = function (type) { - // adding a new thing to the stack - while (this.stack.length > 0 && this.stack.length - 1 > this.tos) { - // pop off things not redone - this.stack.pop(); - } - this.stack.push({ command: [], type: type, undo: [] }); - if (this.maxRedo && this.stack.length > this.maxRedo) { - // limit number kept as audit trail - this.stack.shift(); // remove the extra one - } - if (this.maxUndo && this.stack.length > this.maxUndo) { - // need to trim excess undo info - this.stack[this.stack.length - this.maxUndo - 1].undo = []; // only need to remove one - } - this.tos = this.stack.length - 1; - }; - - SocialCalc.UndoStack.prototype.AddDo = function () { - var args = []; - for (var i = 0; i < arguments.length; i++) { - if (arguments[i] != null) args.push(arguments[i]); // ignore null or undefined - } - var cmd = args.join(" "); - this.stack[this.stack.length - 1].command.push(cmd); - }; - - SocialCalc.UndoStack.prototype.AddUndo = function () { - var args = []; - for (var i = 0; i < arguments.length; i++) { - if (arguments[i] != null) args.push(arguments[i]); // ignore null or undefined - } - var cmd = args.join(" "); - this.stack[this.stack.length - 1].undo.push(cmd); - }; - - SocialCalc.UndoStack.prototype.TOS = function () { - if (this.tos >= 0) return this.stack[this.tos]; - else return null; - }; - - SocialCalc.UndoStack.prototype.Undo = function () { - if ( - this.tos >= 0 && - (!this.maxUndo || this.tos > this.stack.length - this.maxUndo - 1) - ) { - this.tos -= 1; - return true; - } else { - return false; - } - }; - - SocialCalc.UndoStack.prototype.Redo = function () { - if (this.tos < this.stack.length - 1) { - this.tos += 1; - return true; - } else { - return false; - } - }; - - // ************************************* - // - // Clipboard Object: - // - // This is a single object. - // Stores the clipboard, which is shared by all active sheets. - // Like the undo stack, it does not persist from one editing session to another. - // - // ************************************* - - SocialCalc.Clipboard = { - // properties: - - clipboard: "", // empty or string in save format with "copiedfrom:" set to a range - }; - - // ************************************* - // - // RenderContext class: - // - // ************************************* - - SocialCalc.RenderContext = function (sheetobj) { - var parts, num, s; - var attribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - // properties: - - this.sheetobj = sheetobj; - this.hideRowsCols = false; // Rendering with panes only works with "false" - // !!!! Note: not implemented yet in rendering, just saved as an attribute - this.showGrid = false; - this.showRCHeaders = false; - this.rownamewidth = scc.defaultRowNameWidth; - this.pixelsPerRow = scc.defaultAssumedRowHeight; - - this.cellskip = {}; // if present, coord of cell covering this cell - this.coordToCR = {}; // for cells starting spans, coordToCR[coord]={row:row, col:col} - this.colwidth = []; // precomputed column widths, taking into account defaults - this.totalwidth = 0; // precomputed total table width - - this.rowpanes = []; // for each pane, {first: firstrow, last: lastrow} - this.colpanes = []; // for each pane, {first: firstrow, last: lastrow} - this.maxcol = 0; // max col and row to display, adding long spans, etc. - this.maxrow = 0; - - this.highlights = {}; // for each cell with special display: coord:highlightType (see this.highlightTypes) - this.cursorsuffix = ""; // added to highlights[cr]=="cursor" to get type to lookup - - this.highlightTypes = - // attributes to change when highlit - { - cursor: { - style: scc.defaultHighlightTypeCursorStyle, - className: scc.defaultHighlightTypeCursorClass, - }, - range: { - style: scc.defaultHighlightTypeRangeStyle, - className: scc.defaultHighlightTypeRangeClass, - }, - cursorinsertup: { - style: - "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-x;backgroundPosition:top left;backgroundImage:url(" + - scc.defaultImagePrefix + - "cursorinsertup.gif);", - className: scc.defaultHighlightTypeCursorClass, - }, - cursorinsertleft: { - style: - "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-y;backgroundPosition:top left;backgroundImage:url(" + - scc.defaultImagePrefix + - "cursorinsertleft.gif);", - className: scc.defaultHighlightTypeCursorClass, - }, - range2: { - style: - "color:#000;backgroundColor:#FFF;backgroundImage:url(" + - scc.defaultImagePrefix + - "range2.gif);", - className: "", - }, - }; - - this.cellIDprefix = scc.defaultCellIDPrefix; // if non-null, each cell will render with an ID - - this.defaultlinkstyle = null; // default linkstyle object (allows you to pass values to link renderer) - this.defaultHTMLlinkstyle = { type: "html" }; // default linkstyle for standalone HTML - - // constants: - - this.defaultfontstyle = scc.defaultCellFontStyle; - this.defaultfontsize = scc.defaultCellFontSize; - this.defaultfontfamily = scc.defaultCellFontFamily; - - this.defaultlayout = scc.defaultCellLayout; - - this.defaultpanedividerwidth = scc.defaultPaneDividerWidth; - this.defaultpanedividerheight = scc.defaultPaneDividerHeight; - - this.gridCSS = scc.defaultGridCSS; - - this.commentClassName = scc.defaultCommentClass; // for cells with non-blank comments when this.showGrid is true - this.commentCSS = scc.defaultCommentStyle; // any combination of classnames and styles may be used - this.commentNoGridClassName = scc.defaultCommentNoGridClass; // for cells when this.showGrid is false - this.commentNoGridCSS = scc.defaultCommentNoGridStyle; // any combination of classnames and styles may be used - - this.classnames = - // any combination of classnames and explicitStyles can be used - { - colname: scc.defaultColnameClass, - rowname: scc.defaultRownameClass, - selectedcolname: scc.defaultSelectedColnameClass, - selectedrowname: scc.defaultSelectedRownameClass, - upperleft: scc.defaultUpperLeftClass, - skippedcell: scc.defaultSkippedCellClass, - panedivider: scc.defaultPaneDividerClass, - }; - - this.explicitStyles = - // these may be used so you won't need a stylesheet with the classnames - { - colname: scc.defaultColnameStyle, - rowname: scc.defaultRownameStyle, - selectedcolname: scc.defaultSelectedColnameStyle, - selectedrowname: scc.defaultSelectedRownameStyle, - upperleft: scc.defaultUpperLeftStyle, - skippedcell: scc.defaultSkippedCellStyle, - panedivider: scc.defaultPaneDividerStyle, - }; - - // processed info about cell skipping - - this.cellskip = null; - this.needcellskip = true; - - // precomputed values, filling in defaults indicated by "*" - - this.fonts = []; // for each fontnum, {style: fs, weight: fw, size: fs, family: ff} - this.layouts = []; // for each layout, "padding:Tpx Rpx Bpx Lpx;vertical-align:va;" - - this.needprecompute = true; // need to call PrecomputeSheetFontsAndLayouts - - // if have a sheet object, initialize constants and precomputed values - - if (sheetobj) { - this.rowpanes[0] = { first: 1, last: attribs.lastrow }; - this.colpanes[0] = { first: 1, last: attribs.lastcol }; - } else throw scc.s_rcMissingSheet; - }; - - // Methods: - - SocialCalc.RenderContext.prototype.PrecomputeSheetFontsAndLayouts = - function () { - SocialCalc.PrecomputeSheetFontsAndLayouts(this); - }; - SocialCalc.RenderContext.prototype.CalculateCellSkipData = function () { - SocialCalc.CalculateCellSkipData(this); - }; - SocialCalc.RenderContext.prototype.CalculateColWidthData = function () { - SocialCalc.CalculateColWidthData(this); - }; - SocialCalc.RenderContext.prototype.SetRowPaneFirstLast = function ( - panenum, - first, - last - ) { - this.rowpanes[panenum] = { first: first, last: last }; - }; - SocialCalc.RenderContext.prototype.SetColPaneFirstLast = function ( - panenum, - first, - last - ) { - this.colpanes[panenum] = { first: first, last: last }; - }; - SocialCalc.RenderContext.prototype.CoordInPane = function ( - coord, - rowpane, - colpane - ) { - return SocialCalc.CoordInPane(this, coord, rowpane, colpane); - }; - SocialCalc.RenderContext.prototype.CellInPane = function ( - row, - col, - rowpane, - colpane - ) { - return SocialCalc.CellInPane(this, row, col, rowpane, colpane); - }; - SocialCalc.RenderContext.prototype.InitializeTable = function (tableobj) { - SocialCalc.InitializeTable(this, tableobj); - }; - SocialCalc.RenderContext.prototype.RenderSheet = function ( - oldtable, - linkstyle - ) { - return SocialCalc.RenderSheet(this, oldtable, linkstyle); - }; - SocialCalc.RenderContext.prototype.RenderColGroup = function () { - return SocialCalc.RenderColGroup(this); - }; - SocialCalc.RenderContext.prototype.RenderColHeaders = function () { - return SocialCalc.RenderColHeaders(this); - }; - SocialCalc.RenderContext.prototype.RenderSizingRow = function () { - return SocialCalc.RenderSizingRow(this); - }; - SocialCalc.RenderContext.prototype.RenderRow = function ( - rownum, - rowpane, - linkstyle - ) { - return SocialCalc.RenderRow(this, rownum, rowpane, linkstyle); - }; - SocialCalc.RenderContext.prototype.RenderSpacingRow = function () { - return SocialCalc.RenderSpacingRow(this); - }; - SocialCalc.RenderContext.prototype.RenderCell = function ( - rownum, - colnum, - rowpane, - colpane, - noElement, - linkstyle - ) { - return SocialCalc.RenderCell( - this, - rownum, - colnum, - rowpane, - colpane, - noElement, - linkstyle - ); - }; - - // Functions: - - SocialCalc.PrecomputeSheetFontsAndLayouts = function (context) { - var defaultfont, parts, layoutre, dparts, sparts, num, s, i; - var sheetobj = context.sheetobj; - var attribs = sheetobj.attribs; - - if (attribs.defaultfont) { - defaultfont = sheetobj.fonts[attribs.defaultfont]; - defaultfont = defaultfont.replace( - /^\*/, - SocialCalc.Constants.defaultCellFontStyle - ); - defaultfont = defaultfont.replace( - /(.+)\*(.+)/, - "$1" + SocialCalc.Constants.defaultCellFontSize + "$2" - ); - defaultfont = defaultfont.replace( - /\*$/, - SocialCalc.Constants.defaultCellFontFamily - ); - parts = defaultfont.match(/^(\S+? \S+?) (\S+?) (\S.*)$/); - context.defaultfontstyle = parts[1]; - context.defaultfontsize = parts[2]; - context.defaultfontfamily = parts[3]; - } - - for (num = 1; num < sheetobj.fonts.length; num++) { - // precompute fonts by filling in the *'s - s = sheetobj.fonts[num]; - s = s.replace(/^\*/, context.defaultfontstyle); - s = s.replace(/(.+)\*(.+)/, "$1" + context.defaultfontsize + "$2"); - s = s.replace(/\*$/, context.defaultfontfamily); - parts = s.match(/^(\S+?) (\S+?) (\S+?) (\S.*)$/); - context.fonts[num] = { - style: parts[1], - weight: parts[2], - size: parts[3], - family: parts[4], - }; - } - - layoutre = - /^padding:\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+);vertical-align:\s*(\S+);/; - dparts = SocialCalc.Constants.defaultCellLayout.match(layoutre); // get built-in defaults - - if (attribs.defaultlayout) { - sparts = sheetobj.layouts[attribs.defaultlayout].match(layoutre); // get sheet defaults, if set - } else { - sparts = ["", "*", "*", "*", "*", "*"]; - } - - for (num = 1; num < sheetobj.layouts.length; num++) { - // precompute layouts by filling in the *'s - s = sheetobj.layouts[num]; - parts = s.match(layoutre); - for (i = 1; i <= 5; i++) { - if (parts[i] == "*") { - parts[i] = sparts[i] != "*" ? sparts[i] : dparts[i]; // if *, sheet default or built-in - } - } - context.layouts[num] = - "padding:" + - parts[1] + - " " + - parts[2] + - " " + - parts[3] + - " " + - parts[4] + - ";vertical-align:" + - parts[5] + - ";"; - } - - context.needprecompute = false; - }; - - SocialCalc.CalculateCellSkipData = function (context) { - var row, - col, - coord, - cell, - contextcell, - colspan, - rowspan, - skiprow, - skipcol, - skipcoord; - - var sheetobj = context.sheetobj; - var sheetrowattribs = sheetobj.rowattribs; - var sheetcolattribs = sheetobj.colattribs; - context.maxrow = 0; - context.maxcol = 0; - context.cellskip = {}; // reset - - // Calculate cellskip data - var maxrow, maxcol; - - for (row = 1; row <= sheetobj.attribs.lastrow; row++) { - for (col = 1; col <= sheetobj.attribs.lastcol; col++) { - // look for spans and set cellskip for skipped cells - coord = SocialCalc.crToCoord(col, row); - cell = sheetobj.cells[coord]; - // don't look at undefined cells (they have no spans) or skipped cells - if (cell === undefined || context.cellskip[coord]) continue; - colspan = cell.colspan || 1; - rowspan = cell.rowspan || 1; - if (colspan > 1 || rowspan > 1) { - for (skiprow = row; skiprow < row + rowspan; skiprow++) { - for (skipcol = col; skipcol < col + colspan; skipcol++) { - // do the setting on individual cells - skipcoord = SocialCalc.crToCoord(skipcol, skiprow); - if (skipcoord == coord) { - // for coord, remember row and col - context.coordToCR[coord] = { row: row, col: col }; - } else { - // for other cells, flag with coord of here - context.cellskip[skipcoord] = coord; - } - if (skiprow > context.maxrow) maxrow = skiprow; - if (skipcol > context.maxcol) maxcol = skipcol; - } - } - } - } - } - - context.needcellskip = false; - }; - - SocialCalc.CalculateColWidthData = function (context) { - var colnum, colname, colwidth, totalwidth; - - var sheetobj = context.sheetobj; - var sheetcolattribs = sheetobj.colattribs; - - // Calculate column width data - - totalwidth = context.showRCHeaders ? context.rownamewidth - 0 : 0; - for (var colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - colname = SocialCalc.rcColname(colnum); - colwidth = - sheetobj.colattribs.width[colname] || - sheetobj.attribs.defaultcolwidth || - SocialCalc.Constants.defaultColWidth; - if (colwidth == "blank" || colwidth == "auto") colwidth = ""; - context.colwidth[colnum] = colwidth + ""; - totalwidth += colwidth && colwidth - 0 > 0 ? colwidth - 0 : 10; - } - } - context.totalwidth = totalwidth; - }; - - SocialCalc.InitializeTable = function (context, tableobj) { - /* - -Uses border-collapse so corners don't have holes -Note: IE and Firefox handle differently (IE adds borders and padding) -under border-collapse and Safari has problems with and wide text -Tablelayout "fixed" also leads to problems - -*/ - - /* - -*** Discussion *** - -The rendering assumes fixed column widths, even though SocialCalc allows "auto". -There may be issues with "auto" and it is hard to make it work cross-browser -with border-collapse, etc. - -This and the RenderSheet routine are where in the code the specifics of -table attributes and column size definitions are set. As the browsers settle down -and when we decide if we don't need auto width, we may want to revisit the way the -code does this (e.g., use table-layout:fixed). - -*/ - tableobj.style.borderCollapse = "collapse"; - tableobj.cellSpacing = "0"; - tableobj.cellPadding = "0"; - - tableobj.style.width = context.totalwidth + "px"; - }; - - // - // tableobj = SocialCalc.RenderSheet(context, oldtable, linkstyle) - // - // Renders a render context returning a DOM table object. - // If there is an oldtable object, it replaces it in the parent node. - // If oldtable is null, it just returns the new one. - // The linkstyle is "" or null for editing rendering - // and optionally an object passed on to formatting code. - // - - SocialCalc.RenderSheet = function (context, oldtable, linkstyle) { - var newrow, rowpane; - var tableobj, colgroupobj, tbodyobj, parentnode; - - // do precompute stuff if necessary - - if (context.sheetobj.changedrendervalues) { - context.needcellskip = true; - context.needprecompute = true; - context.sheetobj.changedrendervalues = false; - } - if (context.needcellskip) { - context.CalculateCellSkipData(); - } - if (context.needprecompute) { - context.PrecomputeSheetFontsAndLayouts(); - } - - context.CalculateColWidthData(); // always make sure col width values are up to date - - // make the table element and fill it in - - tableobj = document.createElement("table"); - context.InitializeTable(tableobj); - - colgroupobj = context.RenderColGroup(); - tableobj.appendChild(colgroupobj); - - tbodyobj = document.createElement("tbody"); - - tbodyobj.appendChild(context.RenderSizingRow()); - - if (context.showRCHeaders) { - newrow = context.RenderColHeaders(); - if (newrow) tbodyobj.appendChild(newrow); - } - - for (rowpane = 0; rowpane < context.rowpanes.length; rowpane++) { - for ( - var rownum = context.rowpanes[rowpane].first; - rownum <= context.rowpanes[rowpane].last; - rownum++ - ) { - newrow = context.RenderRow(rownum, rowpane, linkstyle); - tbodyobj.appendChild(newrow); - } - if (rowpane < context.rowpanes.length - 1) { - newrow = context.RenderSpacingRow(); - tbodyobj.appendChild(newrow); - } - } - - tableobj.appendChild(tbodyobj); - - if (oldtable) { - parentnode = oldtable.parentNode; - if (parentnode) parentnode.replaceChild(tableobj, oldtable); - } - - SocialCalc.EvalUserScripts(); - - return tableobj; - }; - - SocialCalc.RenderRow = function (context, rownum, rowpane, linkstyle) { - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - var colnum, newcol, colpane, newdiv; - - if (context.showRCHeaders) { - newcol = document.createElement("td"); - if (context.classnames) newcol.className = context.classnames.rowname; - if (context.explicitStyles) - newcol.style.cssText = context.explicitStyles.rowname; - newcol.width = context.rownamewidth; - newcol.style.verticalAlign = "top"; // to get around Safari making top of centered row number be - // considered top of row (and can't get position in Safari) - if (!SocialCalc.Constants.SCNoRowName) { - newcol.innerHTML = rownum + ""; - } - result.appendChild(newcol); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = context.RenderCell( - rownum, - colnum, - rowpane, - colpane, - null, - linkstyle - ); - if (newcol) result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("td"); - newcol.width = context.defaultpanedividerwidth; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - newdiv = document.createElement("div"); // for Firefox to avoid squishing - newdiv.style.width = context.defaultpanedividerwidth + "px"; - newdiv.style.overflow = "hidden"; - newcol.appendChild(newdiv); - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderSpacingRow = function (context) { - var colnum, newcol, colpane, w; - - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - - if (context.showRCHeaders) { - newcol = document.createElement("td"); - newcol.width = context.rownamewidth; - newcol.height = context.defaultpanedividerheight; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - result.appendChild(newcol); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = document.createElement("td"); - w = context.colwidth[colnum]; - if (w) newcol.width = w; - newcol.height = context.defaultpanedividerheight; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - if (newcol) result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("td"); - newcol.width = context.defaultpanedividerwidth; - newcol.height = context.defaultpanedividerheight; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderColHeaders = function (context) { - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - var colnum, newcol; - - if (!context.showRCHeaders) return null; - - newcol = document.createElement("td"); - if (context.classnames) newcol.className = context.classnames.upperleft; - if (context.explicitStyles) - newcol.style.cssText = context.explicitStyles.upperleft; - newcol.width = context.rownamewidth; - result.appendChild(newcol); - - for (var colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = document.createElement("td"); - if (context.classnames) newcol.className = context.classnames.colname; - if (context.explicitStyles) - newcol.style.cssText = context.explicitStyles.colname; - if (SocialCalc.Constants.SCNoColNames) { - // newcol.innerHTML=" "; - // newcol.innerHTML=""; - } else { - newcol.innerHTML = SocialCalc.rcColname(colnum); - } - result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("td"); - newcol.width = context.defaultpanedividerwidth; - if (context.classnames.panedivider) - newcol.className = context.classnames.panedivider; - if (context.explicitStyles.panedivider) - newcol.style.cssText = context.explicitStyles.panedivider; - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderColGroup = function (context) { - var colpane, colnum, newcol, t; - var sheetobj = context.sheetobj; - - var result = document.createElement("colgroup"); - - if (context.showRCHeaders) { - newcol = document.createElement("col"); - newcol.width = context.rownamewidth; - result.appendChild(newcol); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcol = document.createElement("col"); - t = context.colwidth[colnum]; - if (t) newcol.width = t; - result.appendChild(newcol); - } - if (colpane < context.colpanes.length - 1) { - newcol = document.createElement("col"); - newcol.width = context.defaultpanedividerwidth; - result.appendChild(newcol); - } - } - return result; - }; - - SocialCalc.RenderSizingRow = function (context) { - var colpane, colnum, newcell, t; - var sheetobj = context.sheetobj; - - var result = document.createElement("tr"); - - if (context.showRCHeaders) { - newcell = document.createElement("td"); - newcell.style.width = context.rownamewidth + "px"; - newcell.height = "1"; - result.appendChild(newcell); - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - newcell = document.createElement("td"); - t = context.colwidth[colnum]; - if (t) newcell.width = t; - newcell.height = "1"; - result.appendChild(newcell); - } - if (colpane < context.colpanes.length - 1) { - newcell = document.createElement("td"); - newcell.width = context.defaultpanedividerwidth; - newcell.height = "1"; - result.appendChild(newcell); - } - } - return result; - }; - - SocialCalc.RenderCell = function ( - context, - rownum, - colnum, - rowpane, - colpane, - noElement, - linkstyle - ) { - var sheetobj = context.sheetobj; - - var num, t, result, span, stylename, cell, sheetattribs, scdefaults; - var stylestr = ""; - - rownum = rownum - 0; // make sure a number - colnum = colnum - 0; - - var coord = SocialCalc.crToCoord(colnum, rownum); - - if (context.cellskip[coord]) { - // skip if within a span - if (context.CoordInPane(context.cellskip[coord], rowpane, colpane)) { - return null; // span starts in this pane -- so just skip - } - result = noElement - ? SocialCalc.CreatePseudoElement() - : document.createElement("td"); // span start is scrolled away, so make a special cell - if (context.classnames.skippedcell) - result.className = context.classnames.skippedcell; - if (context.explicitStyles.skippedcell) - result.style.cssText = context.explicitStyles.skippedcell; - result.innerHTML = " "; // put something there so height is OK - // !!! Really need to add borders in case there isn't anything else shown in the pane to get height - return result; - } - - result = noElement - ? SocialCalc.CreatePseudoElement() - : document.createElement("td"); - - if (context.cellIDprefix) { - result.id = context.cellIDprefix + coord; - } - - cell = sheetobj.cells[coord]; - - if (!cell) { - cell = new SocialCalc.Cell(coord); - } - - sheetattribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - if (cell.colspan > 1) { - span = 1; - for (num = 1; num < cell.colspan; num++) { - if ( - sheetobj.colattribs.hide[SocialCalc.rcColname(colnum + num)] != - "yes" && - context.CellInPane(rownum, colnum + num, rowpane, colpane) - ) { - span++; - } - } - result.colSpan = span; - } - - if (cell.rowspan > 1) { - span = 1; - for (num = 1; num < cell.rowspan; num++) { - if ( - sheetobj.rowattribs.hide[rownum + num + ""] != "yes" && - context.CellInPane(rownum + num, colnum, rowpane, colpane) - ) - span++; - } - result.rowSpan = span; - } - - if (cell.displaystring == undefined) { - // cache the display value - cell.displaystring = SocialCalc.FormatValueForDisplay( - sheetobj, - cell.datavalue, - coord, - linkstyle || context.defaultlinkstyle - ); - } else { - // callout to execute scripts if needed - SocialCalc.CallOutOnRenderCell(sheetobj, cell.datavalue, coord); - } - result.innerHTML = cell.displaystring; - - num = cell.layout || sheetattribs.defaultlayout; - if (num) { - stylestr += context.layouts[num]; // use precomputed layout with "*"'s filled in - } else { - stylestr += scc.defaultCellLayout; - } - - num = cell.font || sheetattribs.defaultfont; - if (num) { - // get expanded font strings in context - t = context.fonts[num]; // do each - plain "font:" style sets all sorts of other values, too (Safari font-stretch problem on cssText) - stylestr += - "font-style:" + - t.style + - ";font-weight:" + - t.weight + - ";font-size:" + - t.size + - ";font-family:" + - t.family + - ";"; - } else { - if (scc.defaultCellFontSize) { - stylestr += "font-size:" + scc.defaultCellFontSize + ";"; - } - if (scc.defaultCellFontFamily) { - stylestr += "font-family:" + scc.defaultCellFontFamily + ";"; - } - } - - num = cell.color || sheetattribs.defaultcolor; - if (num) stylestr += "color:" + sheetobj.colors[num] + ";"; - - num = cell.bgcolor || sheetattribs.defaultbgcolor; - if (num) stylestr += "background-color:" + sheetobj.colors[num] + ";"; - - num = cell.cellformat; - if (num) { - stylestr += "text-align:" + sheetobj.cellformats[num] + ";"; - } else { - t = cell.valuetype.charAt(0); - if (t == "t") { - num = sheetattribs.defaulttextformat; - if (num) stylestr += "text-align:" + sheetobj.cellformats[num] + ";"; - } else if ((t = "n")) { - num = sheetattribs.defaultnontextformat; - if (num) { - stylestr += "text-align:" + sheetobj.cellformats[num] + ";"; - } else { - stylestr += "text-align:right;"; - } - } else stylestr += "text-align:left;"; - } - - num = cell.bt; - if (num) stylestr += "border-top:" + sheetobj.borderstyles[num] + ";"; - - num = cell.br; - if (num) stylestr += "border-right:" + sheetobj.borderstyles[num] + ";"; - else if (context.showGrid) { - if ( - context.CellInPane( - rownum, - colnum + (cell.colspan || 1), - rowpane, - colpane - ) - ) - t = SocialCalc.crToCoord(colnum + (cell.colspan || 1), rownum); - else t = "nomatch"; - if (context.cellskip[t]) t = context.cellskip[t]; - if (!sheetobj.cells[t] || !sheetobj.cells[t].bl) - stylestr += "border-right:" + context.gridCSS; - } - - num = cell.bb; - if (num) stylestr += "border-bottom:" + sheetobj.borderstyles[num] + ";"; - else if (context.showGrid) { - if ( - context.CellInPane( - rownum + (cell.rowspan || 1), - colnum, - rowpane, - colpane - ) - ) - t = SocialCalc.crToCoord(colnum, rownum + (cell.rowspan || 1)); - else t = "nomatch"; - if (context.cellskip[t]) t = context.cellskip[t]; - if (!sheetobj.cells[t] || !sheetobj.cells[t].bt) - stylestr += "border-bottom:" + context.gridCSS; - } - - num = cell.bl; - if (num) stylestr += "border-left:" + sheetobj.borderstyles[num] + ";"; - - if (cell.comment) { - if (context.showGrid) { - if (context.commentClassName) { - result.className = - (result.className ? result.className + " " : "") + - context.commentClassName; - } - stylestr += context.commentCSS; - } else { - if (context.commentNoGridClassName) { - result.className = - (result.className ? result.className + " " : "") + - context.commentNoGridClassName; - } - stylestr += context.commentNoGridCSS; - } - } - - result.style.cssText = stylestr; - - //!!!!!!!!! - // NOTE: csss and cssc are not supported yet. - // csss needs to be parsed into pieces to override just the attributes specified, not all with assignment to cssText. - // cssc just needs to set the className. - - t = context.highlights[coord]; - if (t) { - // this is a highlit cell: Override style appropriately - if (t == "cursor") t += context.cursorsuffix; // cursor can take alternative forms - if (context.highlightTypes[t].className) { - result.className = - (result.className ? result.className + " " : "") + - context.highlightTypes[t].className; - } - // only if cell is editable, set the cursor class - if ( - t == "cursor" && - SocialCalc.Callbacks.IsCoordEditable && - !SocialCalc.Callbacks.IsCoordEditable( - context.sheetobj.sheetname + "!" + coord - ) - ) { - SocialCalc.setStyles(result, ""); - } else { - SocialCalc.setStyles(result, context.highlightTypes[t].style); - } - } - - return result; - }; - - SocialCalc.CoordInPane = function (context, coord, rowpane, colpane) { - var coordToCR = context.coordToCR[coord]; - if (!coordToCR || !coordToCR.row || !coordToCR.col) - throw "Bad coordToCR for " + coord; - return context.CellInPane(coordToCR.row, coordToCR.col, rowpane, colpane); - }; - - SocialCalc.CellInPane = function (context, row, col, rowpane, colpane) { - var panerowlimits = context.rowpanes[rowpane]; - var panecollimits = context.colpanes[colpane]; - if (!panerowlimits || !panecollimits) - throw "CellInPane called with unknown panes " + rowpane + "/" + colpane; - if (row < panerowlimits.first || row > panerowlimits.last) return false; - if (col < panecollimits.first || col > panecollimits.last) return false; - return true; - }; - - SocialCalc.CreatePseudoElement = function () { - return { style: { cssText: "" }, innerHTML: "", className: "" }; - }; - - // ************************************* - // - // Misc. functions: - // - // ************************************* - - SocialCalc.rcColname = function (c) { - if (c > 702) c = 702; // maximum number of columns - ZZ - if (c < 1) c = 1; - var collow = ((c - 1) % 26) + 65; - var colhigh = Math.floor((c - 1) / 26); - if (colhigh) - return String.fromCharCode(colhigh + 64) + String.fromCharCode(collow); - else return String.fromCharCode(collow); - }; - - SocialCalc.letters = [ - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - ]; - - SocialCalc.crToCoord = function (c, r) { - var result; - if (c < 1) c = 1; - if (c > 702) c = 702; // maximum number of columns - ZZ - if (r < 1) r = 1; - var collow = (c - 1) % 26; - var colhigh = Math.floor((c - 1) / 26); - if (colhigh) - result = SocialCalc.letters[colhigh - 1] + SocialCalc.letters[collow] + r; - else result = SocialCalc.letters[collow] + r; - return result; - }; - - SocialCalc.coordToCol = {}; // too expensive to set in crToCoord since that is called so many times - SocialCalc.coordToRow = {}; - - SocialCalc.coordToCr = function (cr) { - var c, i, ch; - var r = SocialCalc.coordToRow[cr]; - if (r) return { row: r, col: SocialCalc.coordToCol[cr] }; - c = 0; - r = 0; - for (i = 0; i < cr.length; i++) { - // this was faster than using regexes; assumes well-formed - ch = cr.charCodeAt(i); - if (ch == 36); - else if (ch <= 57) - // skip $'s - r = 10 * r + ch - 48; - else if (ch >= 97) c = 26 * c + ch - 96; - else if (ch >= 65) c = 26 * c + ch - 64; - } - SocialCalc.coordToCol[cr] = c; - SocialCalc.coordToRow[cr] = r; - return { row: r, col: c }; - }; - - SocialCalc.ParseRange = function (range) { - var pos, cr, cr1, cr2; - if (!range) range = "A1:A1"; // error return, hopefully benign - range = range.toUpperCase(); - pos = range.indexOf(":"); - if (pos >= 0) { - cr = range.substring(0, pos); - cr1 = SocialCalc.coordToCr(cr); - cr1.coord = cr; - cr = range.substring(pos + 1); - cr2 = SocialCalc.coordToCr(cr); - cr2.coord = cr; - } else { - cr1 = SocialCalc.coordToCr(range); - cr1.coord = range; - cr2 = SocialCalc.coordToCr(range); - cr2.coord = range; - } - return { cr1: cr1, cr2: cr2 }; - }; - - SocialCalc.decodeFromSave = function (s) { - if (typeof s != "string") return s; - if (s.indexOf("\\") == -1) return s; // for performace reasons: replace nothing takes up time - var r = s.replace(/\\c/g, ":"); - r = r.replace(/\\n/g, "\n"); - return r.replace(/\\b/g, "\\"); - }; - - SocialCalc.decodeFromAjax = function (s) { - if (typeof s != "string") return s; - if (s.indexOf("\\") == -1) return s; // for performace reasons: replace nothing takes up time - var r = s.replace(/\\c/g, ":"); - r = r.replace(/\\n/g, "\n"); - r = r.replace(/\\e/g, "]]"); - return r.replace(/\\b/g, "\\"); - }; - - SocialCalc.encodeForSave = function (s) { - if (typeof s != "string") return s; - if (s.indexOf("\\") != -1) - // for performace reasons: replace nothing takes up time - s = s.replace(/\\/g, "\\b"); - if (s.indexOf(":") != -1) s = s.replace(/:/g, "\\c"); - if (s.indexOf("\n") != -1) s = s.replace(/\n/g, "\\n"); - return s; - }; - - // - // Returns estring where &, <, >, " are HTML escaped - // - SocialCalc.special_chars = function (string) { - if (/[&<>"]/.test(string)) { - // only do "slow" replaces if something to replace - string = string.replace(/&/g, "&"); - string = string.replace(//g, ">"); - string = string.replace(/"/g, """); - } - return string; - }; - - SocialCalc.Lookup = function (value, list) { - for (i = 0; i < list.length; i++) { - if (list[i] > value) { - if (i > 0) return i - 1; - else return null; - } - } - return list.length - 1; // if all smaller, matches last - }; - - // - // setStyles(element, cssText) - // - // Takes a pseudo style string (e.g., text-align must be textAlign) and sets - // the element's style value for each style name listed (leaving others unchanged). - // OK to call with null cssText. - // - - SocialCalc.setStyles = function (element, cssText) { - var parts, part, pos, name, value; - - if (!cssText) return; - - parts = cssText.split(";"); - for (part = 0; part < parts.length; part++) { - pos = parts[part].indexOf(":"); // find first colon (could be one in url) - if (pos != -1) { - name = parts[part].substring(0, pos); - value = parts[part].substring(pos + 1); - if (name && value) { - // if non-null name and value, set style - element.style[name] = value; - } - } - // namevalue = parts[part].split(":"); - // if (namevalue[0]) element.style[namevalue[0]] = namevalue[1]; - } - }; - - // - // GetViewportInfo() - returns object with viewport width and height, and scroll offsets - // - // Flanagan, JavaScript, 5th Edition, page 276 - // - - SocialCalc.GetViewportInfo = function () { - var result = {}; - - if (window.innerWidth) { - // all but IE - result.width = window.innerWidth; - result.height = window.innerHeight; - result.horizontalScroll = window.pageXOffset; - result.verticalScroll = window.pageYOffset; - } else { - if (document.documentElement && document.documentElement.clientWidth) { - result.width = document.documentElement.clientWidth; - result.height = document.documentElement.clientHeight; - result.horizontalScroll = document.documentElement.scrollLeft; - result.verticalScroll = document.documentElement.scrollTop; - } else if (document.body.clientWidth) { - result.width = document.body.clientWidth; - result.height = document.body.clientHeight; - result.horizontalScroll = document.body.scrollLeft; - result.verticalScroll = document.body.scrollTop; - } - } - - return result; - }; - - // - // GetElementPosition(element) - returns object with left and top position of the element in the document - // - // Goodman's JavaScript & DHTML Cookbook, 2nd Edition, page 415 - // - - SocialCalc.GetElementPosition = function (element) { - var offsetLeft = 0; - var offsetTop = 0; - while (element) { - offsetLeft += element.offsetLeft; - offsetTop += element.offsetTop; - element = element.offsetParent; - } - return { left: offsetLeft, top: offsetTop }; - }; - - // - // GetElementPositionWithScroll(element) - returns object with left and top position of the element in the document - // - // Takes into account scroll offsets by going through entire tree - // - - SocialCalc.GetElementPositionWithScroll = function (element) { - var offsetLeft = 0; - var offsetTop = 0; - var offsetElement = element; - while (element) { - if (element.tagName == "HTML") break; - if (element == offsetElement) { - offsetLeft += element.offsetLeft; - offsetTop += element.offsetTop; - offsetElement = element.offsetParent; - } - if (element.scrollLeft) { - offsetLeft -= element.scrollLeft; - } - if (element.scrollTop) { - offsetTop -= element.scrollTop; - } - element = element.parentNode; - } - return { left: offsetLeft, top: offsetTop }; - }; - - // - // LookupElement(element, array) - returns array element which is an object with "element" of element - // - - SocialCalc.LookupElement = function (element, array) { - var i; - for (i = 0; i < array.length; i++) { - if (array[i].element == element) return array[i]; - } - return null; - }; - - // - // AssignID(obj, element, id) - Optionally assigns an ID with a prefix to the element - // - - SocialCalc.AssignID = function (obj, element, id) { - if (obj.idPrefix) { - // Object must have a non-empty idPrefix attribute - element.id = obj.idPrefix + id; - } - }; - - // - // SocialCalc.GetCellContents(sheetobj, coord) - // - // Returns the contents (value, formula, constant, etc.) of a cell - // with appropriate prefix ("'", "=", etc.) - // - - SocialCalc.GetCellContents = function (sheetobj, coord) { - var result = ""; - var cellobj = sheetobj.cells[coord]; - if (cellobj) { - switch (cellobj.datatype) { - case "v": - result = cellobj.datavalue + ""; - break; - case "t": - result = "'" + cellobj.datavalue; - break; - case "f": - result = "=" + cellobj.formula; - break; - case "c": - result = cellobj.formula; - break; - default: - break; - } - } - - return result; - }; - - // - // Routines translated from the SocialCalc 1.1.0 Perl code: - // - // (Makes use of the FormatNumber JavaScript code translated from the Perl.) - // - - // - // displayvalue = FormatValueForDisplay(sheetobj, value, cr, linkstyle) - // - // Returns a string, in HTML, for the contents of a cell. - // - // The value is a either numeric or text, the cr is the coord of the cell - // (its cell properties are used to determine formatting), and linkstyle - // is a value passed to wiki-text expansion routines specifying the - // purpose of the rendering so, for example, links can be rendered differently - // during edit than with plain HTML. - // - - SocialCalc.FormatValueForDisplay = function (sheetobj, value, cr, linkstyle) { - var valueformat, has_parens, has_commas, valuetype, valuesubtype; - var displayvalue; - - var sheetattribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - var cell = sheetobj.cells[cr]; - - if (!cell) { - // get an empty cell if not there - cell = new SocialCalc.Cell(cr); - } - - displayvalue = value; - - valuetype = cell.valuetype || ""; // get type of value to determine formatting - valuesubtype = valuetype.substring(1); - valuetype = valuetype.charAt(0); - - if (cell.errors || valuetype == "e") { - displayvalue = cell.errors || valuesubtype || "Error in cell"; - return displayvalue; - } - - if (valuetype == "t") { - valueformat = - sheetobj.valueformats[cell.textvalueformat - 0] || - sheetobj.valueformats[sheetattribs.defaulttextvalueformat - 0] || - ""; - if (valueformat == "formula") { - if (cell.datatype == "f") { - displayvalue = - SocialCalc.special_chars("=" + cell.formula) || " "; - } else if (cell.datatype == "c") { - displayvalue = - SocialCalc.special_chars("'" + cell.formula) || " "; - } else { - displayvalue = - SocialCalc.special_chars("'" + displayvalue) || " "; - } - return displayvalue; - } - displayvalue = SocialCalc.format_text_for_display( - displayvalue, - cell.valuetype, - valueformat, - sheetobj, - linkstyle - ); - if (valueformat == "text-html") - SocialCalc.ScriptCheck(sheetobj.sheetid, cr, value); - } else if (valuetype == "n") { - valueformat = cell.nontextvalueformat; - if (valueformat == null || valueformat == "") { - // - valueformat = sheetattribs.defaultnontextvalueformat; - } - valueformat = sheetobj.valueformats[valueformat - 0]; - if (valueformat == null || valueformat == "none") { - valueformat = ""; - } - if (valueformat == "formula") { - if (cell.datatype == "f") { - displayvalue = - SocialCalc.special_chars("=" + cell.formula) || " "; - } else if (cell.datatype == "c") { - displayvalue = - SocialCalc.special_chars("'" + cell.formula) || " "; - } else { - displayvalue = - SocialCalc.special_chars("'" + displayvalue) || " "; - } - return displayvalue; - } else if (valueformat == "forcetext") { - if (cell.datatype == "f") { - displayvalue = - SocialCalc.special_chars("=" + cell.formula) || " "; - } else if (cell.datatype == "c") { - displayvalue = SocialCalc.special_chars(cell.formula) || " "; - } else { - displayvalue = SocialCalc.special_chars(displayvalue) || " "; - } - return displayvalue; - } - - displayvalue = SocialCalc.format_number_for_display( - displayvalue, - cell.valuetype, - valueformat - ); - } else { - // unknown type - probably blank - displayvalue = " "; - } - - return displayvalue; - }; - - // - // displayvalue = format_text_for_display(rawvalue, valuetype, valueformat, sheetobj, linkstyle) - // - - SocialCalc.format_text_for_display = function ( - rawvalue, - valuetype, - valueformat, - sheetobj, - linkstyle - ) { - var valueformat, valuesubtype, dvsc, dvue, textval; - var displayvalue; - - valuesubtype = valuetype.substring(1); - - displayvalue = rawvalue; - - if (valueformat == "none" || valueformat == null) valueformat = ""; - if (!/^(text-|custom|hidden)/.test(valueformat)) valueformat = ""; - if (valueformat == "" || valueformat == "General") { - // determine format from type - if (valuesubtype == "h") valueformat = "text-html"; - if (valuesubtype == "w" || valuesubtype == "r") valueformat = "text-wiki"; - if (valuesubtype == "l") valueformat = "text-link"; - if (!valuesubtype) valueformat = "text-plain"; - } - if (valueformat == "text-html") { - // HTML - output as it as is - } else if ( - SocialCalc.Callbacks.expand_wiki && - /^text-wiki/.test(valueformat) - ) { - // do general wiki markup - displayvalue = SocialCalc.Callbacks.expand_wiki( - displayvalue, - sheetobj, - linkstyle, - valueformat - ); - } else if (valueformat == "text-wiki") { - // Wiki-text - encode then output - displayvalue = SocialCalc.special_chars(displayvalue); - } else if (valueformat == "text-wiki") { - // wiki text - displayvalue = - (SocialCalc.Callbacks.expand_markup && - SocialCalc.Callbacks.expand_markup( - displayvalue, - sheetobj, - linkstyle - )) || // do old wiki markup - SocialCalc.special_chars(displayvalue); - } else if (valueformat == "text-url") { - // text is a URL for a link - dvsc = SocialCalc.special_chars(displayvalue); - dvue = encodeURI(displayvalue); - displayvalue = '' + dvsc + ""; - } else if (valueformat == "text-link") { - // more extensive link capabilities for regular web links - displayvalue = SocialCalc.expand_text_link( - displayvalue, - sheetobj, - linkstyle, - valueformat - ); - } else if (valueformat == "text-image") { - // text is a URL for an image - dvue = encodeURI(displayvalue); - displayvalue = ''; - } else if (valueformat.substring(0, 12) == "text-custom:") { - // construct a custom text format: @r = text raw, @s = special chars, @u = url encoded - dvsc = SocialCalc.special_chars(displayvalue); // do special chars - dvsc = dvsc.replace(/ /g, "  "); // keep multiple spaces - dvsc = dvsc.replace(/\n/g, "
    "); // keep line breaks - dvue = encodeURI(displayvalue); - textval = {}; - textval.r = displayvalue; - textval.s = dvsc; - textval.u = dvue; - displayvalue = valueformat.substring(12); // remove "text-custom:" - displayvalue = displayvalue.replace(/@(r|s|u)/g, function (a, c) { - return textval[c]; - }); // replace placeholders - } else if (valueformat.substring(0, 6) == "custom") { - // custom - displayvalue = SocialCalc.special_chars(displayvalue); // do special chars - displayvalue = displayvalue.replace(/ /g, "  "); // keep multiple spaces - displayvalue = displayvalue.replace(/\n/g, "
    "); // keep line breaks - displayvalue += " (custom format)"; - } else if (valueformat == "hidden") { - displayvalue = " "; - } else { - // plain text - displayvalue = SocialCalc.special_chars(displayvalue); // do special chars - displayvalue = displayvalue.replace(/ /g, "  "); // keep multiple spaces - displayvalue = displayvalue.replace(/\n/g, "
    "); // keep line breaks - } - - return displayvalue; - }; - - // - // displayvalue = format_number_for_display(rawvalue, valuetype, valueformat) - // - - SocialCalc.format_number_for_display = function ( - rawvalue, - valuetype, - valueformat - ) { - var value, valuesubtype; - var scc = SocialCalc.Constants; - - value = rawvalue - 0; - - valuesubtype = valuetype.substring(1); - - if (valueformat == "Auto" || valueformat == "") { - // cases with default format - if (valuesubtype == "%") { - // will display a % character - valueformat = "#,##0.0%"; - } else if (valuesubtype == "$") { - valueformat = "[$]#,##0.00"; - } else if (valuesubtype == "dt") { - valueformat = scc.defaultFormatdt; - } else if (valuesubtype == "d") { - valueformat = scc.defaultFormatd; - } else if (valuesubtype == "t") { - valueformat = scc.defaultFormatt; - } else if (valuesubtype == "l") { - valueformat = "logical"; - } else { - valueformat = "General"; - } - } - - if (valueformat == "logical") { - // do logical format - return value ? scc.defaultDisplayTRUE : scc.defaultDisplayFALSE; - } - - if (valueformat == "hidden") { - // do hidden format - return " "; - } - - // Use format - - return SocialCalc.FormatNumber.formatNumberWithFormat( - rawvalue, - valueformat, - "" - ); - }; - - // - // valueinfo = DetermineValueType(rawvalue) - // - // Takes a value and looks for special formatting like $, %, numbers, etc. - // Returns the value as a number or string and the type as {value: value, type: type}. - // Tries to follow the spec for spreadsheet function VALUE(v). - // - - SocialCalc.DetermineValueType = function (rawvalue) { - var value = rawvalue + ""; - var type = "t"; - var tvalue, matches, year, hour, minute, second, denom, num, intgr, constr; - - tvalue = value.replace(/^\s+/, ""); // remove leading and trailing blanks - tvalue = tvalue.replace(/\s+$/, ""); - - if (value.length == 0) { - type = ""; - } else if (value.match(/^\s+$/)) { - // just blanks - // leave type "t" - } else if (tvalue.match(/^[-+]?\d*(?:\.)?\d*(?:[eE][-+]?\d+)?$/)) { - // general number, including E - value = tvalue - 0; // try converting to number - if (isNaN(value)) { - // leave alone - catches things like plain "-" - value = rawvalue + ""; - } else { - type = "n"; - } - } else if (tvalue.match(/^[-+]?\d*(?:\.)?\d*\s*%$/)) { - // percent form: 15.1% - value = (tvalue.slice(0, -1) - 0) / 100; // convert and scale - type = "n%"; - } else if ( - tvalue.match(/^[-+]?\$\s*\d*(?:\.)?\d*\s*$/) && - tvalue.match(/\d/) - ) { - // $ format: $1.49 - value = tvalue.replace(/\$/, "") - 0; - type = "n$"; - } else if (tvalue.match(/^[-+]?(\d*,\d*)+(?:\.)?\d*$/)) { - // number format ignoring commas: 1,234.49 - value = tvalue.replace(/,/g, "") - 0; - type = "n"; - } else if (tvalue.match(/^[-+]?(\d*,\d*)+(?:\.)?\d*\s*%$/)) { - // % with commas: 1,234.49% - value = (tvalue.replace(/[%,]/g, "") - 0) / 100; - type = "n%"; - } else if ( - tvalue.match(/^[-+]?\$\s*(\d*,\d*)+(?:\.)?\d*$/) && - tvalue.match(/\d/) - ) { - // $ and commas: $1,234.49 - value = tvalue.replace(/[\$,]/g, "") - 0; - type = "n$"; - } else if ( - (matches = value.match(/^(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{1,4})\s*$/)) - ) { - // MM/DD/YYYY, MM/DD/YYYY - year = matches[3] - 0; - year = year < 1000 ? year + 2000 : year; - value = - SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - year, - matches[1] - 0, - matches[2] - 0 - ) - 2415019; - type = "nd"; - } else if ( - (matches = value.match(/^(\d{4})[\/\-](\d{1,2})[\/\-](\d{1,2})\s*$/)) - ) { - // YYYY-MM-DD, YYYY/MM/DD - year = matches[1] - 0; - year = year < 1000 ? year + 2000 : year; - value = - SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - year, - matches[2] - 0, - matches[3] - 0 - ) - 2415019; - type = "nd"; - } else if ((matches = value.match(/^(\d{1,2}):(\d{1,2})\s*$/))) { - // HH:MM - hour = matches[1] - 0; - minute = matches[2] - 0; - if (hour < 24 && minute < 60) { - value = hour / 24 + minute / (24 * 60); - type = "nt"; - } - } else if ((matches = value.match(/^(\d{1,2}):(\d{1,2}):(\d{1,2})\s*$/))) { - // HH:MM:SS - hour = matches[1] - 0; - minute = matches[2] - 0; - second = matches[3] - 0; - if (hour < 24 && minute < 60 && second < 60) { - value = hour / 24 + minute / (24 * 60) + second / (24 * 60 * 60); - type = "nt"; - } - } else if ((matches = value.match(/^\s*([-+]?\d+) (\d+)\/(\d+)\s*$/))) { - // 1 1/2 - intgr = matches[1] - 0; - num = matches[2] - 0; - denom = matches[3] - 0; - if (denom && denom > 0) { - value = intgr + (intgr < 0 ? -num / denom : num / denom); - type = "n"; - } - } else if ((constr = SocialCalc.InputConstants[value.toUpperCase()])) { - // special constants, like "false" and #N/A - num = constr.indexOf(","); - value = constr.substring(0, num) - 0; - type = constr.substring(num + 1); - } else if ( - tvalue.length > 7 && - tvalue.substring(0, 7).toLowerCase() == "http://" - ) { - // URL - value = tvalue; - type = "tl"; - } - - return { value: value, type: type }; - }; - - SocialCalc.InputConstants = { - // strings that turn into constants for SocialCalc.DetermineValueType - TRUE: "1,nl", - FALSE: "0,nl", - "#N/A": "0,e#N/A", - "#NULL!": "0,e#NULL!", - "#NUM!": "0,e#NUM!", - "#DIV/0!": "0,e#DIV/0!", - "#VALUE!": "0,e#VALUE!", - "#REF!": "0,e#REF!", - "#NAME?": "0,e#NAME?", - }; - - // - // result = default_expand_markup(displayvalue, sheetobj, linkstyle) - // - // Processes wiki-text -- this is a placeholder. - // Reference to here in SocialCalc.expand_markup should be replaced by application-specific routine. - // - - SocialCalc.default_expand_markup = function ( - displayvalue, - sheetobj, - linkstyle - ) { - var result = displayvalue; - - result = SocialCalc.special_chars(result); // do special chars - result = result.replace(/ /g, "  "); // keep multiple spaces - result = result.replace(/\n/g, "
    "); // keep line breaks - - return result; // do very little by default - - result = result.replace(/('*)'''(.*?)'''/g, "$1$2"); // Wiki-style bold/italics - result = result.replace(/''(.*?)''/g, "$1"); - - return result; - }; - - // - // result = SocialCalc.expand_text_link(displayvalue, sheetobj, linkstyle, valueformat) - // - // Parses link text (URL, descriptions, pagenames, workspace names) and returns HTML - // - - SocialCalc.expand_text_link = function ( - displayvalue, - sheetobj, - linkstyle, - valueformat - ) { - var desc, tb, str; - - var scc = SocialCalc.Constants; - - var url = ""; - var parts = SocialCalc.ParseCellLinkText(displayvalue + ""); - - if (parts.desc) { - desc = SocialCalc.special_chars(parts.desc); - } else { - desc = parts.pagename - ? scc.defaultPageLinkFormatString - : scc.defaultLinkFormatString; - } - - if ( - displayvalue.length > 7 && - displayvalue.substring(0, 7).toLowerCase() == "http://" && - displayvalue.charAt(displayvalue.length - 1) != ">" - ) { - desc = desc.substring(7); // remove http:// unless explicit - } - - tb = parts.newwin || !linkstyle ? ' target="_blank"' : ""; - - if (parts.pagename) { - if (SocialCalc.Callbacks.MakePageLink) { - url = SocialCalc.Callbacks.MakePageLink( - parts.pagename, - parts.workspacename, - linkstyle, - valueformat - ); - } - // else if (parts.workspace) { - // url = "/" + encodeURI(parts.workspace) + "/" + encodeURI(parts.pagename); - // } - // else { - // url = parts.pagename; - // } - } else { - url = encodeURI(parts.url); - } - str = '" + desc + ""; - - return str; - }; - - // - // result = SocialCalc.ParseCellLinkText(str) - // - // Given: url = http://www.someurl.com/more, desc = Some descriptive text - // - // Takes the following: - // - // url - // - // desc - // "desc" - // <<>> instead of <> => target="_blank" (new window) - // - // [page name] - // "desc"[page name] - // desc[page name] - // {workspace name [page name]} - // "desc"{workspace name [page name]} - // [[]] instead of [] => target="_blank" (new window) - // - // - // Returns: {url: url, desc: desc, newwin: t/f, pagename: pagename, workspace: workspace} - // - - SocialCalc.ParseCellLinkText = function (str) { - var result = { - url: "", - desc: "", - newwin: false, - pagename: "", - workspace: "", - }; - - var pageform = false; - var urlend = str.length - 1; - var descstart = 0; - var lastlt = str.lastIndexOf("<"); - var lastbrkt = str.lastIndexOf("["); - var lastbrace = str.lastIndexOf("{"); - var descend = -1; - - if ( - (str.charAt(urlend) != ">" || lastlt == -1) && - (str.charAt(urlend) != "]" || lastbrkt == -1) && - (str.charAt(urlend) != "}" || - str.charAt(urlend - 1) != "]" || - lastbrace == -1 || - lastbrkt == -1 || - lastbrkt < lastbrace) - ) { - // plain url - urlend++; - descend = urlend; - } else { - // some markup - if (str.charAt(urlend) == ">") { - // url form - descend = lastlt - 1; - if ( - lastlt > 0 && - str.charAt(descend) == "<" && - str.charAt(urlend - 1) == ">" - ) { - descend--; - urlend--; - result.newwin = true; - } - } else if (str.charAt(urlend) == "]") { - // plain page form - descend = lastbrkt - 1; - pageform = true; - if ( - lastbrkt > 0 && - str.charAt(descend) == "[" && - str.charAt(urlend - 1) == "]" - ) { - descend--; - urlend--; - result.newwin = true; - } - } else if (str.charAt(urlend) == "}") { - // page and workspace form - descend = lastbrace - 1; - pageform = true; - wsend = lastbrkt; - urlend--; - if ( - lastbrkt > 0 && - str.charAt(lastbrkt - 1) == "[" && - str.charAt(urlend - 1) == "]" - ) { - wsend = lastbrkt - 1; - urlend--; - result.newwin = true; - } - if (str.charAt(wsend - 1) == " ") { - // trim trailing space in workspace name - wsend--; - } - result.workspace = str.substring(lastbrace + 1, wsend) || ""; - } - - if (str.charAt(descend) == " ") { - // trim trailing space on desc - descend--; - } - - if (str.charAt(descstart) == '"' && str.charAt(descend) == '"') { - descstart++; - descend--; - } - } - - if (pageform) { - result.pagename = str.substring(lastbrkt + 1, urlend) || ""; - } else { - result.url = str.substring(lastlt + 1, urlend) || ""; - } - - if (descend >= descstart) { - result.desc = str.substring(descstart, descend + 1); - } - - return result; - }; - - // - // result = SocialCalc.ConvertSaveToOtherFormat(savestr, outputformat, dorecalc) - // - // Returns a string in the specificed format: "scsave", "html", "csv", "tab" (tab delimited) - // If dorecalc is true, performs a recalc after loading (NO: obsolete!). - // - - SocialCalc.ConvertSaveToOtherFormat = function ( - savestr, - outputformat, - dorecalc - ) { - var sheet, context, clipextents, div, ele, row, col, cr, cell, str; - - var result = ""; - - if (outputformat == "scsave") { - return savestr; - } - - if (savestr == "") { - return ""; - } - - sheet = new SocialCalc.Sheet(); - sheet.ParseSheetSave(savestr); - - if (dorecalc) { - // no longer supported as of 9/10/08 - // Recalc is now async, so can't do it this way - throw "SocialCalc.ConvertSaveToOtherFormat: Not doing recalc."; - } - - if (sheet.copiedfrom) { - clipextents = SocialCalc.ParseRange(sheet.copiedfrom); - } else { - clipextents = { - cr1: { row: 1, col: 1 }, - cr2: { row: sheet.attribs.lastrow, col: sheet.attribs.lastcol }, - }; - } - - if (outputformat == "html") { - context = new SocialCalc.RenderContext(sheet); - if (sheet.copiedfrom) { - context.rowpanes[0] = { - first: clipextents.cr1.row, - last: clipextents.cr2.row, - }; - context.colpanes[0] = { - first: clipextents.cr1.col, - last: clipextents.cr2.col, - }; - } - div = document.createElement("div"); - ele = context.RenderSheet(null, context.defaultHTMLlinkstyle); - div.appendChild(ele); - context = undefined; - sheet = undefined; - result = div.innerHTML; - ele = undefined; - div = undefined; - return result; - } - - for (row = clipextents.cr1.row; row <= clipextents.cr2.row; row++) { - for (col = clipextents.cr1.col; col <= clipextents.cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - - if (cell.errors) { - str = cell.errors; - } else { - str = cell.datavalue + ""; // get value as text - } - - if (outputformat == "csv") { - if (str.indexOf('"') != -1) { - str = str.replace(/"/g, '""'); // double quotes - } - if (/[, \n"]/.test(str)) { - str = '"' + str + '"'; // add quotes - } - if (col > clipextents.cr1.col) { - str = "," + str; // add commas - } - } else if (outputformat == "tab") { - if (str.indexOf("\n") != -1) { - // if multiple lines - if (str.indexOf('"') != -1) { - str = str.replace(/"/g, '""'); // double quotes - } - str = '"' + str + '"'; // add quotes - } - if (col > clipextents.cr1.col) { - str = "\t" + str; // add tabs - } - } - result += str; - } - result += "\n"; - } - - return result; - }; - - // - // result = SocialCalc.ConvertOtherFormatToSave(inputstr, inputformat) - // - // Returns a string converted from the specified format: "scsave", "csv", "tab" (tab delimited) - // - - SocialCalc.ConvertOtherFormatToSave = function (inputstr, inputformat) { - var sheet, - context, - lines, - i, - line, - value, - inquote, - j, - ch, - values, - row, - col, - cr, - maxc; - - var result = ""; - - var AddCell = function () { - col++; - if (col > maxc) maxc = col; - cr = SocialCalc.crToCoord(col, row); - SocialCalc.SetConvertedCell(sheet, cr, value); - value = ""; - }; - - if (inputformat == "scsave") { - return inputstr; - } - - sheet = new SocialCalc.Sheet(); - - lines = inputstr.split(/\r\n|\n/); - - maxc = 0; - if (inputformat == "csv") { - row = 0; - inquote = false; - for (i = 0; i < lines.length; i++) { - if (i == lines.length - 1 && lines[i] == "") { - // extra null line - ignore - break; - } - if (inquote) { - // if inquote, just continue from where left off - value += "\n"; - } else { - // otherwise next row - value = ""; - row++; - col = 0; - } - line = lines[i]; - for (j = 0; j < line.length; j++) { - ch = line.charAt(j); - if (ch == '"') { - if (inquote) { - if (j < line.length - 1 && line.charAt(j + 1) == '"') { - // double quotes - j++; // skip the second one - value += '"'; // add one quote - } else { - inquote = false; - if (j == line.length - 1) { - // at end of line - AddCell(); - } - } - } else { - inquote = true; - } - continue; - } - if (ch == "," && !inquote) { - AddCell(); - } else { - value += ch; - } - if (j == line.length - 1 && !inquote) { - AddCell(); - } - } - } - if (maxc > 0) { - sheet.attribs.lastrow = row; - sheet.attribs.lastcol = maxc; - result = sheet.CreateSheetSave("A1:" + SocialCalc.crToCoord(maxc, row)); - } - } - - if (inputformat == "tab") { - row = 0; - inquote = false; - for (i = 0; i < lines.length; i++) { - if (i == lines.length - 1 && lines[i] == "") { - // extra null line - ignore - break; - } - if (inquote) { - // if inquote, just continue from where left off - value += "\n"; - } else { - // otherwise next row - value = ""; - row++; - col = 0; - } - line = lines[i]; - for (j = 0; j < line.length; j++) { - ch = line.charAt(j); - if (ch == '"') { - if (inquote) { - if (j < line.length - 1) { - if (line.charAt(j + 1) == '"') { - // double quotes - j++; // skip the second one - value += '"'; // add one quote - } else if (line.charAt(j + 1) == "\t") { - // end of quoted item - j++; - inquote = false; - AddCell(); - } - } else { - // at end of line - inquote = false; - AddCell(); - } - continue; - } - if (value == "") { - // quote at start of item - inquote = true; - continue; - } - } - if (ch == "\t" && !inquote) { - AddCell(); - } else { - value += ch; - } - if (j == line.length - 1 && !inquote) { - AddCell(); - } - } - } - if (maxc > 0) { - sheet.attribs.lastrow = row; - sheet.attribs.lastcol = maxc; - result = sheet.CreateSheetSave("A1:" + SocialCalc.crToCoord(maxc, row)); - } - } - - return result; - }; - - // - // SocialCalc.SetConvertedCell(sheet, cr, rawvalue) - // - // Sets the cell cr with a value and type determined from rawvalue - // - - SocialCalc.SetConvertedCell = function (sheet, cr, rawvalue) { - var cell, value; - - cell = sheet.GetAssuredCell(cr); - - value = SocialCalc.DetermineValueType(rawvalue); - - if (value.type == "n" && value.value == rawvalue) { - // check that we don't need "constant" to remember original value - cell.datatype = "v"; - cell.valuetype = "n"; - cell.datavalue = value.value; - } else if (value.type.charAt(0) == "t") { - // text of some sort but left unchanged - cell.datatype = "t"; - cell.valuetype = value.type; - cell.datavalue = value.value; - } else { - // special number types - cell.datatype = "c"; - cell.valuetype = value.type; - cell.datavalue = value.value; - cell.formula = rawvalue; - } - }; - - // - // socialcalctouch adds touch gestures to SocialCalc - // - // As a start, touch gestures are modeled similar to - // mouse events - // - // Author: Ramu Ramamurthy - // - // - // - - // - // - // To initialize, SocialCalc.CreateTableEditor must call - // SocialCalc.TouchRegister(editor.toplevel, {Swipe: SocialCalc.EditorProcessSwipe, editor: editor}); - // Also, any element create inside the grid needs to be touch registered for it to work - // this includes buttons, etc - // - // TestCases: - // 1) tap to point to cell, and to move edit-cell - // 2) double-tap on a cell to open edit-box, then tap on edit box to pullup keyboard - // -- when editing, tap on any other cell to be done with edit - // *** figure out escape to cancel edit versus return to accept edit - // -- when editing, and if = seen than tapping on cell puts the cell name into the edit box - // 3) tap on input box on top opens edit on cell - // tap on any cell accepts and finishes this edit - // *** need a way to cancel the edit versus accept the edit - // - // 4) tap on a cell and move finger starts a range - // removing finger completes the range - // tap on cell cancels range - // - // 5) a swipe action scrolls the sheet - // swipe up/dn scrolls up/dn - // swipe lt/rt scrolls lt/rt - // - // - // Wishlist: - // 1) smooth scroll will be nice (in addition to swipe) -- using a two-touch pan ? - // - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - - // ************************************* - // - // Touch functions: - // - // ************************************* - - SocialCalc.HasTouch = false; - - (function () { - // platform specific registration - var agent = navigator.userAgent.toLowerCase(); - - if ( - agent.indexOf("iphone") >= 0 || - agent.indexOf("ipad") >= 0 || - agent.indexOf("android") >= 0 - ) { - SocialCalc.HasTouch = true; - } - })(); - - SocialCalc.TouchInfo = { - // In sequence the following will be implemented - // swipe up/dn, left/right will scroll up/dn/left/right respectively - // - // touch on a cell will move ecell to that cell - // repeated touch on a cell will start edit on that cell - // touch on another cell will cancel edit if it was in progress (?) - // etc - // - // touch on buttons will activate the buttons - // - // The registeredElements array is used to identify items. - - // One item for each element to respond to the touch, each an object with: - // .element, .functionobj - - registeredElements: [], - - // for swipe - threshold_x: 20, - threshold_y: 20, - - orig_coord_x: 0, - orig_coord_y: 0, - final_coord_x: 0, - final_coord_y: 0, - - px_to_rows: 20, // 20 pixels is 1 row scroll - px_to_cols: 20, // 20 pixels is 1 col scroll - - touch_start: 0, - ranging: false, - ranging_threshold: 100, - move_start: 0, - - last_touch: 0, - timeout_handle: null, - doubletap_threshold: 500, // max milliseconds between taps - }; - - // - // TouchRegister(element, functionobj) - make element respond to touch - // - - SocialCalc.TouchRegister = function (element, functionobj) { - if (!SocialCalc.HasTouch) { - return; - } - - var touchinfo = SocialCalc.TouchInfo; - - if (SocialCalc.LookupElement(element, touchinfo.registeredElements)) { - // already registered - return; - } - - touchinfo.registeredElements.push({ - element: element, - functionobj: functionobj, - }); - - if (SocialCalc.HasTouch && element.addEventListener) { - // Webkit based (?) - element.addEventListener( - "touchstart", - SocialCalc.ProcessTouchStart, - false - ); - element.addEventListener("touchmove", SocialCalc.ProcessTouchMove, false); - element.addEventListener("touchend", SocialCalc.ProcessTouchEnd, false); - element.addEventListener( - "touchcancel", - SocialCalc.ProcessTouchCancel, - false - ); - // element.addEventListener("orientationchange", SocialCalc.ProcessOrientationChange, false); - } - }; - - SocialCalc.FindTouchElement = function (event) { - var touchinfo = SocialCalc.TouchInfo; - - var event = event || window.event; - - var ele = event.target || event.srcElement; // investigate - - for (var wobj = null; !wobj && ele; ele = ele.parentNode) { - // investigate - wobj = SocialCalc.LookupElement(ele, touchinfo.registeredElements); - } - - return wobj; - }; - - SocialCalc.ProcessTouchStart = function (event) { - var touchinfo = SocialCalc.TouchInfo; - touchinfo.orig_coord_x = event.targetTouches[0].pageX; - touchinfo.orig_coord_y = event.targetTouches[0].pageY; - - touchinfo.final_coord_x = touchinfo.orig_coord_x; - touchinfo.final_coord_y = touchinfo.orig_coord_y; - - touchinfo.touch_start = new Date().getTime(); - - event.preventDefault(); - }; - - SocialCalc.TouchGetSimulatedMouseEvent = function (event, mouse_evt_name) { - var touches = event.changedTouches; - var first = touches[0]; - var simulatedEvent = document.createEvent("MouseEvent"); - simulatedEvent.initMouseEvent( - mouse_evt_name, - true, - true, - window, - 1, - first.screenX, - first.screenY, - first.clientX, - first.clientY, - false, - false, - false, - false, - 0, - null - ); - return simulatedEvent; - }; - - SocialCalc.ProcessTouchMove = function (event) { - var touchinfo = SocialCalc.TouchInfo; - touchinfo.final_coord_x = event.targetTouches[0].pageX; - touchinfo.final_coord_y = event.targetTouches[0].pageY; - - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) return; // not one of our elements - - if (touchinfo.move_start == 0) { - touchinfo.move_start = new Date().getTime(); - if ( - touchinfo.move_start - touchinfo.touch_start > - touchinfo.ranging_threshold - ) { - // This is a delayed move - // send a mouse down event - // This is for ranging and dragging - - touchinfo.ranging = true; - var mouseDn = SocialCalc.TouchGetSimulatedMouseEvent( - event, - "mousedown" - ); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDn); - } - } else if (touchinfo.ranging) { - // already ranging - // send a mouse move event - - var mouseMv = SocialCalc.TouchGetSimulatedMouseEvent(event, "mousemove"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseMv); - } - - event.preventDefault(); - }; - - SocialCalc.ProcessTouchEnd = function (e) { - var touchinfo = SocialCalc.TouchInfo; - - var changeX = touchinfo.orig_coord_x - touchinfo.final_coord_x; - var changeY = touchinfo.orig_coord_y - touchinfo.final_coord_y; - - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) return; // not one of our elements - - var event = e || window.event; - - touchinfo.move_start = 0; - touchinfo.touch_start = 0; - - if (touchinfo.ranging) { - // in ranging, and dragging - // send a mouseup event - touchinfo.ranging = false; - var mouseUp = SocialCalc.TouchGetSimulatedMouseEvent(event, "mouseup"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseUp); - } else if ( - Math.abs(changeY) > touchinfo.threshold_y || - Math.abs(changeX) > touchinfo.threshold_x - ) { - // check for swipe - - var amount_y = Math.floor(changeY / touchinfo.px_to_rows); - var amount_x = Math.floor(changeX / touchinfo.px_to_cols); - if (wobj.functionobj && wobj.functionobj.Swipe) { - wobj.functionobj.Swipe(event, touchinfo, wobj, amount_y, amount_x); - } - } else { - // detect a double tap - var now = new Date().getTime(); - var lasttouch = touchinfo.last_touch || now + 1; - var delta = now - lasttouch; - if (touchinfo.timeout_handle) { - clearTimeout(touchinfo.timeout_handle); - touchinfo.timeout_handle = null; - } - - if (delta < touchinfo.doubletap_threshold && delta > 0) { - // doubletap seen - if (wobj.functionobj && wobj.functionobj.DoubleTap) { - wobj.functionobj.DoubleTap(event, touchinfo, wobj); - } - } else { - // this is a single tap - touchinfo.last_touch = now; - var timeoutFn = function () { - if (wobj.functionobj && wobj.functionobj.SingleTap) { - wobj.functionobj.SingleTap(event, touchinfo, wobj); - } - }; - touchinfo.timeout_handle = setTimeout( - timeoutFn(), - touchinfo.doubletap_threshold - ); - } - touchinfo.last_touch = now; - } - e.preventDefault(); - }; - - SocialCalc.ProcessTouchCancel = function (event) { - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) { - return; // do default behavior - } - - var touchinfo = SocialCalc.TouchInfo; - touchinfo.orig_coord_x = 0; - touchinfo.orig_coord_y = 0; - touchinfo.final_coord_x = 0; - touchinfo.final_coord_y = 0; - touchinfo.move_start = 0; - touchinfo.touch_start = 0; - touchinfo.ranging = false; - }; - - SocialCalc.EditorProcessSwipe = function ( - event, - touchinfo, - wobj, - swipevert, - swipehoriz - ) { - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - - if (wobj.functionobj.editor.state != "start") { - return; // ignore if cell being edited - } - - if (swipevert != 0 || swipehoriz != 0) { - //wobj.functionobj.editor.ScrollRelativeBoth(swipevert,swipehoriz); - wobj.functionobj.editor.ScrollRelativeBoth(swipevert, 0); //ignore horiz swipes entirely - } - }; - - SocialCalc.EditorProcessSingleTap = function (event, touchinfo, wobj) { - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - - // send mouse down - var mouseDn = SocialCalc.TouchGetSimulatedMouseEvent(event, "mousedown"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDn); - - // then send mouse up - var mouseUp = SocialCalc.TouchGetSimulatedMouseEvent(event, "mouseup"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseUp); - }; - - SocialCalc.EditorProcessDoubleTap = function (event, touchinfo, wobj) { - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - // simulate a mouse double click - var mouseDblClick = SocialCalc.TouchGetSimulatedMouseEvent( - event, - "dblclick" - ); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDblClick); - }; - - SocialCalc.ProcessOrientationChange = function (event) { - console.log("orientation change"); - //var height = $(window).height(); - //var width = $(window).width(); - - //console.log("width="+width+",height="+height) - - // $(window).trigger( "orientationchange.htmlclass" ); - // spreadsheet.DoOnResize(); - }; - - // - // SocialCalcTableEditor - // - /* - // The code module of the SocialCalc package that displays a scrolling grid with panes - // and handles keyboard and mouse I/O. - // - // (c) Copyright 2008, 2009, 2010 Socialtext, Inc. - // All Rights Reserved. - // - */ - - /* - - LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - - EXHIBIT A. Common Public Attribution License Version 1.0. - - The contents of this file are subject to the Common Public Attribution License Version 1.0 (the - "License"); you may not use this file except in compliance with the License. You may obtain a copy - of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but - Sections 14 and 15 have been added to cover use of software over a computer network and provide for - limited attribution for the Original Developer. In addition, Exhibit A has been modified to be - consistent with Exhibit B. - - Software distributed under the License 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 Original Code is SocialCalc JavaScript TableEditor. - - The Original Developer is the Initial Developer. - - The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by - Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - - Contributor: Dan Bricklin. - - - EXHIBIT B. Attribution Information - - When the TableEditor is producing and/or controlling the display the Graphic Image must be - displayed on the screen visible to the user in a manner comparable to that in the - Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for - that image. The image must be linked to the Attribution URL so as to access that page - when clicked. If the user interface includes a prominent "about" display which includes - factual prominent attribution in a form similar to that in the "about" display included - with the Original Code, including Socialtext copyright notices and URLs, then the image - need not be linked to the Attribution URL but the "tool-tip" is still required. - - Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - - Attribution Phrase (not exceeding 10 words): SocialCalc - - Attribution URL: http://www.socialcalc.org/xoattrib - - Graphic Image: The contents of the sc-logo.gif file in the Original Code or - a suitable replacement from http://www.socialcalc.org/licenses specified as - being for SocialCalc. - - Display of Attribution Information is required in Larger Works which are defined - in the CPAL as a work which combines Covered Code or portions thereof with code - not governed by the terms of the CPAL. - - */ - - // - // Some of the other files in the SocialCalc package are licensed under - // different licenses. Please note the licenses of the modules you use. - // - // Code History: - // - // 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. - // All Rights Reserved. - // Portions (c) Copyright 2007 Socialtext, Inc. - // All Rights Reserved. - // The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. - // wikiCalc 1.0 was written by Software Garden, Inc. - // Unless otherwise specified, referring to "SocialCalc" in comments refers to this - // JavaScript version of the code, not the SocialCalc Perl code. - // - - /* - - See the comments in the main SocialCalc code module file of the SocialCalc package. - - */ - - var SocialCalc; - if (!SocialCalc) { - // created here, too, in case load order is wrong, but main routines are required - SocialCalc = {}; - } - - // ************************************* - // - // Table Editor class: - // - // ************************************* - - // Constructor: - - SocialCalc.TableEditor = function (context) { - var scc = SocialCalc.Constants; - - // Properties: - - this.context = context; // editing context - this.toplevel = null; // top level HTML element for this table editor - this.fullgrid = null; // rendered editing context - - this.noEdit = false; // if true, disable all edit UI and make read-only - - this.width = null; - this.tablewidth = null; - this.height = null; - this.tableheight = null; - - this.inputBox = null; - this.inputEcho = null; - this.verticaltablecontrol = null; - this.horizontaltablecontrol = null; - - this.logo = null; - - this.cellhandles = null; - - // Dynamic properties: - - this.timeout = null; // if non-null, timer id for position calculations - this.busy = false; // true when executing command, calculating, etc. - this.ensureecell = false; // if true, ensure ecell is visible after timeout - this.deferredCommands = []; // commands to execute after busy, in form: {cmdstr: "cmds", saveundo: t/f} - - this.gridposition = null; // screen coords of full grid - this.headposition = null; // screen coords of upper left of grid within header rows - this.firstscrollingrow = null; // row number of top row in last (the scrolling) pane - this.firstscrollingrowtop = null; // position of top row in last (the scrolling) pane - this.lastnonscrollingrow = null; // row number of last displayed row in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblerow = null; // used for paging down - this.firstscrollingcol = null; // column number of top col in last (the scrolling) pane - this.firstscrollingcolleft = null; // position of top col in last (the scrolling) pane - this.lastnonscrollingcol = null; // col number of last displayed column in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblecol = null; // used for paging right - - this.rowpositions = []; // screen positions of the top of some rows - this.colpositions = []; // screen positions of the left side of some rows - this.rowheight = []; // size in pixels of each row when last checked, or null/undefined, for page up - this.colwidth = []; // size in pixels of each column when last checked, or null/undefined, for page left - - this.ecell = null; // either null or {coord: c, row: r, col: c} - this.state = "start"; // the keyboard states: see EditorProcessKey - - this.workingvalues = {}; // values used during keyboard editing, etc. - - // Constants: - - this.imageprefix = scc.defaultImagePrefix; // URL prefix for images (e.g., "/www/assets/images/sc") - this.idPrefix = scc.defaultTableEditorIDPrefix; - this.pageUpDnAmount = scc.defaultPageUpDnAmount; // number of rows to move cursor on PgUp/PgDn keys (numeric) - - // Callbacks - - // recalcFunction: if present, function(editor) {...}, called to do a recalc - // Default (sheet.RecalcSheet) does all the right stuff. - - this.recalcFunction = function (editor) { - if (editor.context.sheetobj.RecalcSheet) { - editor.context.sheetobj.RecalcSheet( - SocialCalc.EditorSheetStatusCallback, - editor - ); - } else return null; - }; - - // ctrlkeyFunction: if present, function(editor, charname) {...}, called to handle ctrl-V, etc., at top level - // Returns true (pass through for continued processing) or false (stop processing this key). - - this.ctrlkeyFunction = function (editor, charname) { - var ta, ha, cell, position, cmd, sel, cliptext; - - switch (charname) { - case "[ctrl-c]": - case "[ctrl-x]": - ta = editor.pasteTextarea; - ta.value = ""; - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = position.left - 1 + "px"; - ta.style.top = position.top - 1 + "px"; - } - if (editor.range.hasrange) { - sel = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - sel = editor.ecell.coord; - } - - // get what to copy to clipboard - cliptext = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), - "tab" - ); - - if ( - charname == "[ctrl-c]" || - editor.noEdit || - (SocialCalc.Callbacks.IsCellEditable && - !SocialCalc.Callbacks.IsCellEditable(editor)) - ) { - // if copy or cut but in no edit - cmd = "copy " + sel + " formulas"; - } else { - // [ctrl-x] - cmd = "cut " + sel + " formulas"; - } - editor.EditorScheduleSheetCommands(cmd, true, false); // queue up command to put on SocialCalc clipboard - - /* Copy as HTML: This fails rather badly as it won't paste into Notepad as tab-delimited text. Oh well. - -ha = editor.pasteHTMLarea; -if (editor.range.hasrange) { -cell = SocialCalc.GetEditorCellElement(editor, editor.range.top, editor.range.left); -} -else { -cell = SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); -} -if (cell) position = SocialCalc.GetElementPosition(cell.element); - -if (ha) { -if (position) { -ha.style.left = (position.left-1)+"px"; -ha.style.top = (position.top-1)+"px"; -} -ha.style.visibility="visible"; -cliptext = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), "html"); -ha.innerHTML = cliptext.replace(/]*>[\d\D]*?<\/tr\b[^>]*>/i, ''); -ha.focus(); - -var range = document.body.createControlRange(); -range.addElement(ha.childNodes[0]); -range.select(); -} -*/ - ta.style.display = "block"; - ta.value = cliptext; // must follow "block" setting for Webkit - ta.focus(); - ta.select(); - window.setTimeout(function () { - if (!SocialCalc.GetSpreadsheetControlObject) return; // in case not loaded - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - /* -var ha = editor.pasteHTMLarea; -if (ha) { -ha.blur(); -ha.innerHTML = ''; -ha.style.visibility = 'hidden'; -} -*/ - var ta = editor.pasteTextarea; - ta.blur(); - ta.style.display = "none"; - SocialCalc.KeyboardFocus(); - }, 200); - - return true; - - case "[ctrl-v]": - if (editor.noEdit) return true; // not if no edit - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - var showPasteTextArea = function () { - ta = editor.pasteTextarea; - ta.value = ""; - - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = position.left - 1 + "px"; - ta.style.top = position.top - 1 + "px"; - } - ta.style.display = "block"; - ta.value = ""; // must follow "block" setting for Webkit - ta.focus(); - }; - - ha = editor.pasteHTMLarea; - if (ha) { - /* Pasting via HTML - Currently IE only */ - ha.style.visibility = "visible"; - ha.focus(); - } else { - showPasteTextArea(); - } - window.setTimeout(function () { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var value = null; - var isPasteSameAsClipboard = false; - - ha = editor.pasteHTMLarea; - if (ha) { - /* IE: We append a U+FFFC to every TD that's not the last of its row, - * then we obtain innerText, then turn U+FFFC back to \t, - * thereby preserving the cell separations (which gets discarded - * if we simply paste via textarea. - */ - var _ObjectReplacementCharacter_ = String.fromCharCode(0xfffc); - var html = ha.innerHTML; - - if (html.search(/<(?![Bb][Rr])[A-Za-z]/) >= 0) { - /* HTML Paste: Mark TDs with U+FFFC accordingly.. */ - ha.innerHTML = html.replace( - /(?:<\/[Tt][Dd]>)/g, - _ObjectReplacementCharacter_ - ); - } else { - /* Text Paste: In IE, \t is transformed into  , so replace them with U+FFFC. */ - ha.innerHTML = html.replace( - /&[Nn][Bb][Ss][Pp];/g, - _ObjectReplacementCharacter_ - ); - } - - value = ha.innerText.replace( - new RegExp(_ObjectReplacementCharacter_, "g"), - "\t" - ); - - ha.innerHTML = ""; - ha.blur(); - ha.style.visibility = "hidden"; - } else { - var ta = editor.pasteTextarea; - value = ta.value; - ta.blur(); - ta.style.display = "none"; - } - - value = value.replace(/\r\n/g, "\n").replace(/\n?$/, "\n"); - var clipstr = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.Clipboard.clipboard, - "tab" - ); - if ( - value == clipstr || - (value.length - clipstr.length == 1 && - value.substring(0, value.length - 1) == clipstr) - ) { - isPasteSameAsClipboard = true; - } - - var cmd = ""; - // pastes SocialCalc clipboard if did a Ctrl-C and contents still the same - // Webkit adds an extra blank line, so need to allow for that - if (!isPasteSameAsClipboard) { - cmd = - "loadclipboard " + - SocialCalc.encodeForSave( - SocialCalc.ConvertOtherFormatToSave(value, "tab") - ) + - "\n"; - } - var cr; - if (editor.range.hasrange) { - cr = SocialCalc.crToCoord(editor.range.left, editor.range.top); - } else { - cr = editor.ecell.coord; - } - cmd += "paste " + cr + " formulas"; - editor.EditorScheduleSheetCommands(cmd, true, false); - SocialCalc.KeyboardFocus(); - }, 200); - return true; - - case "[ctrl-z]": - editor.EditorScheduleSheetCommands("undo", true, false); - return false; - - case "[ctrl-s]": // !!!! temporary hack - window.setTimeout(function () { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var sheet = editor.context.sheetobj; - var cell = sheet.GetAssuredCell(editor.ecell.coord); - var ntvf = cell.nontextvalueformat - ? sheet.valueformats[cell.nontextvalueformat - 0] || "" - : ""; - var newntvf = window.prompt( - "Advanced Feature:\n\nCustom Numeric Format or Command", - ntvf - ); - if (newntvf != null) { - // not cancelled - if (newntvf.match(/^cmd:/)) { - cmd = newntvf.substring(4); // execute as command - } else if (newntvf.match(/^edit:/)) { - cmd = newntvf.substring(5); // execute as command - if (SocialCalc.CtrlSEditor) { - SocialCalc.CtrlSEditor(cmd); - } - return; - } else { - if (editor.range.hasrange) { - sel = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord( - editor.range.right, - editor.range.bottom - ); - } else { - sel = editor.ecell.coord; - } - cmd = "set " + sel + " nontextvalueformat " + newntvf; - } - editor.EditorScheduleSheetCommands(cmd, true, false); - } - }, 200); - return false; - - default: - break; - } - return true; - }; - - // Set sheet's status callback: - - context.sheetobj.statuscallback = SocialCalc.EditorSheetStatusCallback; - context.sheetobj.statuscallbackparams = this; // this object: the table editor object - - // StatusCallback: all values are called at appropriate times, add with unique name, delete when done - // - // Each value must be an object in the form of: - // - // func: function(editor, status, arg, params) {...}, - // params: params value to call func with - // - // The values for status and arg are: - // - // all the SocialCalc RecalcSheet statuscallbacks, including: - // - // calccheckdone, calclist length - // calcorder, {coord: coord, total: celllist length, count: count} - // calcstep, {coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds - // - // the command callbacks, like cmdstart and cmdend - // cmdendnorender - // - // calcstart, null - // moveecell, new ecell coord - // rangechange, "coord:coord" or "coord" or "" - // specialkey, keyname ("[esc]") - // - - this.StatusCallback = {}; - - this.MoveECellCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.RangeChangeCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.SettingsCallbacks = {}; // See SocialCalc.SaveEditorSettings - - // Set initial cursor - - this.ecell = { coord: "A1", row: 1, col: 1 }; - context.highlights[this.ecell.coord] = "cursor"; - - // Initialize range data - // Range has at least hasrange (true/false). - // It may also have: anchorcoord, anchorrow, anchorcol, top, bottom, left, and right. - - this.range = { hasrange: false }; - - // Initialize range2 data (used to show selections, such as for move) - // Range2 has at least hasrange (true/false). - // It may also have: top, bottom, left, and right. - - this.range2 = { hasrange: false }; - }; - - // Methods: - - SocialCalc.TableEditor.prototype.CreateTableEditor = function ( - width, - height - ) { - return SocialCalc.CreateTableEditor(this, width, height); - }; - SocialCalc.TableEditor.prototype.ResizeTableEditor = function ( - width, - height - ) { - return SocialCalc.ResizeTableEditor(this, width, height); - }; - - SocialCalc.TableEditor.prototype.SaveEditorSettings = function () { - return SocialCalc.SaveEditorSettings(this); - }; - SocialCalc.TableEditor.prototype.LoadEditorSettings = function (str, flags) { - return SocialCalc.LoadEditorSettings(this, str, flags); - }; - - SocialCalc.TableEditor.prototype.EditorRenderSheet = function () { - SocialCalc.EditorRenderSheet(this); - }; - SocialCalc.TableEditor.prototype.EditorScheduleSheetCommands = function ( - cmdstr, - saveundo, - ignorebusy - ) { - SocialCalc.EditorScheduleSheetCommands(this, cmdstr, saveundo, ignorebusy); - }; - SocialCalc.TableEditor.prototype.ScheduleSheetCommands = function ( - cmdstr, - saveundo - ) { - this.context.sheetobj.ScheduleSheetCommands(cmdstr, saveundo); - }; - SocialCalc.TableEditor.prototype.SheetUndo = function () { - this.context.sheetobj.SheetUndo(); - }; - SocialCalc.TableEditor.prototype.SheetRedo = function () { - this.context.sheetobj.SheetRedo(); - }; - SocialCalc.TableEditor.prototype.EditorStepSet = function (status, arg) { - SocialCalc.EditorStepSet(this, status, arg); - }; - SocialCalc.TableEditor.prototype.GetStatuslineString = function ( - status, - arg, - params - ) { - return SocialCalc.EditorGetStatuslineString(this, status, arg, params); - }; - - SocialCalc.TableEditor.prototype.EditorMouseRegister = function () { - return SocialCalc.EditorMouseRegister(this); - }; - SocialCalc.TableEditor.prototype.EditorMouseUnregister = function () { - return SocialCalc.EditorMouseUnregister(this); - }; - SocialCalc.TableEditor.prototype.EditorMouseRange = function (coord) { - return SocialCalc.EditorMouseRange(this, coord); - }; - - SocialCalc.TableEditor.prototype.EditorProcessKey = function (ch, e) { - return SocialCalc.EditorProcessKey(this, ch, e); - }; - SocialCalc.TableEditor.prototype.EditorAddToInput = function (str, prefix) { - return SocialCalc.EditorAddToInput(this, str, prefix); - }; - SocialCalc.TableEditor.prototype.DisplayCellContents = function () { - return SocialCalc.EditorDisplayCellContents(this); - }; - SocialCalc.TableEditor.prototype.EditorSaveEdit = function (text) { - return SocialCalc.EditorSaveEdit(this, text); - }; - SocialCalc.TableEditor.prototype.EditorApplySetCommandsToRange = function ( - cmdline, - type - ) { - return SocialCalc.EditorApplySetCommandsToRange(this, cmdline, type); - }; - - SocialCalc.TableEditor.prototype.MoveECellWithKey = function (ch) { - return SocialCalc.MoveECellWithKey(this, ch); - }; - SocialCalc.TableEditor.prototype.MoveECell = function (newcell) { - return SocialCalc.MoveECell(this, newcell); - }; - SocialCalc.TableEditor.prototype.ReplaceCell = function (cell, row, col) { - SocialCalc.ReplaceCell(this, cell, row, col); - }; - SocialCalc.TableEditor.prototype.UpdateCellCSS = function (cell, row, col) { - SocialCalc.UpdateCellCSS(this, cell, row, col); - }; - SocialCalc.TableEditor.prototype.SetECellHeaders = function (selected) { - SocialCalc.SetECellHeaders(this, selected); - }; - SocialCalc.TableEditor.prototype.EnsureECellVisible = function () { - SocialCalc.EnsureECellVisible(this); - }; - SocialCalc.TableEditor.prototype.RangeAnchor = function (coord) { - SocialCalc.RangeAnchor(this, coord); - }; - SocialCalc.TableEditor.prototype.RangeExtend = function (coord) { - SocialCalc.RangeExtend(this, coord); - }; - SocialCalc.TableEditor.prototype.RangeRemove = function () { - SocialCalc.RangeRemove(this); - }; - SocialCalc.TableEditor.prototype.Range2Remove = function () { - SocialCalc.Range2Remove(this); - }; - - SocialCalc.TableEditor.prototype.FitToEditTable = function () { - SocialCalc.FitToEditTable(this); - }; - SocialCalc.TableEditor.prototype.CalculateEditorPositions = function () { - SocialCalc.CalculateEditorPositions(this); - }; - SocialCalc.TableEditor.prototype.ScheduleRender = function () { - SocialCalc.ScheduleRender(this); - }; - SocialCalc.TableEditor.prototype.DoRenderStep = function () { - SocialCalc.DoRenderStep(this); - }; - SocialCalc.TableEditor.prototype.SchedulePositionCalculations = function () { - SocialCalc.SchedulePositionCalculations(this); - }; - SocialCalc.TableEditor.prototype.DoPositionCalculations = function () { - SocialCalc.DoPositionCalculations(this); - }; - SocialCalc.TableEditor.prototype.CalculateRowPositions = function ( - panenum, - positions, - sizes - ) { - return SocialCalc.CalculateRowPositions(this, panenum, positions, sizes); - }; - SocialCalc.TableEditor.prototype.CalculateColPositions = function ( - panenum, - positions, - sizes - ) { - return SocialCalc.CalculateColPositions(this, panenum, positions, sizes); - }; - - SocialCalc.TableEditor.prototype.ScrollRelative = function ( - vertical, - amount - ) { - SocialCalc.ScrollRelative(this, vertical, amount); - }; - SocialCalc.TableEditor.prototype.ScrollRelativeBoth = function ( - vamount, - hamount - ) { - SocialCalc.ScrollRelativeBoth(this, vamount, hamount); - }; - SocialCalc.TableEditor.prototype.PageRelative = function ( - vertical, - direction - ) { - SocialCalc.PageRelative(this, vertical, direction); - }; - SocialCalc.TableEditor.prototype.LimitLastPanes = function () { - SocialCalc.LimitLastPanes(this); - }; - - SocialCalc.TableEditor.prototype.ScrollTableUpOneRow = function () { - return SocialCalc.ScrollTableUpOneRow(this); - }; - SocialCalc.TableEditor.prototype.ScrollTableDownOneRow = function () { - return SocialCalc.ScrollTableDownOneRow(this); - }; - SocialCalc.TableEditor.prototype.ScrollTableLeftOneCol = function () { - return SocialCalc.ScrollTableLeftOneCol(this); - }; - SocialCalc.TableEditor.prototype.ScrollTableRightOneCol = function () { - return SocialCalc.ScrollTableRightOneCol(this); - }; - - //contact prototype - SocialCalc.TableEditor.prototype.EditorChangecontact = function ( - text, - name, - phone, - email, - street, - city, - company, - val - ) { - return SocialCalc.EditorChangecontact( - this, - text, - name, - phone, - email, - street, - city, - company, - val - ); - }; - SocialCalc.TableEditor.prototype.EditorChangecolorFromWidget = function ( - text - ) { - return SocialCalc.EditorChangecolorFromWidget(this, text); - }; - SocialCalc.TableEditor.prototype.EditorChangeSheetcolor = function (text) { - return SocialCalc.EditorChangeSheetcolor(this, text); - }; - - SocialCalc.TableEditor.prototype.EditorChangefontFromWidget = function ( - text - ) { - return SocialCalc.EditorChangefontFromWidget(this, text); - }; - SocialCalc.TableEditor.prototype.EditorChangeSheetfont = function (text) { - return SocialCalc.EditorChangeSheetfont(this, text); - }; - SocialCalc.TableEditor.prototype.EditorCut = function (text, no_of_cells) { - return SocialCalc.EditorCut(this, text, no_of_cells); - }; - SocialCalc.TableEditor.prototype.EditorClearSheet = function ( - text, - cell_to_clear - ) { - return SocialCalc.EditorClearSheet(this, text, cell_to_clear); - }; - - // Functions: - - SocialCalc.CreateTableEditor = function (editor, width, height) { - var scc = SocialCalc.Constants; - var AssignID = SocialCalc.AssignID; - - editor.toplevel = document.createElement("div"); - editor.width = width; - editor.height = height; - - editor.griddiv = document.createElement("div"); - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width = editor.tablewidth + "px"; - editor.griddiv.style.height = editor.tableheight + "px"; - editor.griddiv.style.overflow = "hidden"; - editor.griddiv.style.cursor = "default"; - if (scc.cteGriddivClass) editor.griddiv.className = scc.cteGriddivClass; - AssignID(editor, editor.griddiv, "griddiv"); - - editor.FitToEditTable(); - - editor.EditorRenderSheet(); - - editor.griddiv.appendChild(editor.fullgrid); - - editor.verticaltablecontrol = new SocialCalc.TableControl( - editor, - true, - editor.tableheight - ); - editor.verticaltablecontrol.CreateTableControl(); - AssignID(editor, editor.verticaltablecontrol.main, "tablecontrolv"); - - editor.horizontaltablecontrol = new SocialCalc.TableControl( - editor, - false, - editor.tablewidth - ); - editor.horizontaltablecontrol.CreateTableControl(); - AssignID(editor, editor.horizontaltablecontrol.main, "tablecontrolh"); - - var table, tbody, tr, td, img, anchor, ta, ha; - - table = document.createElement("table"); - editor.layouttable = table; - table.cellSpacing = 0; - table.cellPadding = 0; - AssignID(editor, table, "layouttable"); - - tbody = document.createElement("tbody"); - table.appendChild(tbody); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - td.appendChild(editor.griddiv); - tr.appendChild(td); - td = document.createElement("td"); - //td.appendChild(editor.verticaltablecontrol.main); - tr.appendChild(td); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - //td.appendChild(editor.horizontaltablecontrol.main); - tr.appendChild(td); - - td = document.createElement("td"); // logo display: Required by CPAL License for this code! - //td.style.background="url("+editor.imageprefix+"logo.gif) no-repeat center center"; - td.innerHTML = - "
    "; - tr.appendChild(td); - editor.logo = td; - AssignID(editor, editor.logo, "logo"); - SocialCalc.TooltipRegister(td.firstChild.firstChild, "SocialCalc", null); - - editor.toplevel.appendChild(editor.layouttable); - - if (!editor.noEdit) { - editor.inputEcho = new SocialCalc.InputEcho(editor); - AssignID(editor, editor.inputEcho.main, "inputecho"); - } - - editor.cellhandles = new SocialCalc.CellHandles(editor); - - ta = document.createElement("textarea"); // used for ctrl-c/ctrl-v where an invisible text area is needed - SocialCalc.setStyles( - ta, - "display:none;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);" - ); - ta.value = ""; - editor.pasteTextarea = ta; - AssignID(editor, editor.pasteTextarea, "pastetextarea"); - - if ( - navigator.userAgent.match(/Safari\//) && - !navigator.userAgent.match(/Chrome\//) - ) { - // special code for Safari 5 change - window.removeEventListener( - "beforepaste", - SocialCalc.SafariPasteFunction, - false - ); - window.addEventListener( - "beforepaste", - SocialCalc.SafariPasteFunction, - false - ); - window.removeEventListener( - "beforecopy", - SocialCalc.SafariPasteFunction, - false - ); - window.addEventListener( - "beforecopy", - SocialCalc.SafariPasteFunction, - false - ); - window.removeEventListener( - "beforecut", - SocialCalc.SafariPasteFunction, - false - ); - window.addEventListener( - "beforecut", - SocialCalc.SafariPasteFunction, - false - ); - } - - editor.toplevel.appendChild(editor.pasteTextarea); - - var div = document.createElement("div"); - div.innerHTML = "
    "; - if (div.firstChild.nodeType == 1) { - /* We are running in IE -- Using HTML-based area for Ctrl-V */ - ha = document.createElement("div"); // used for ctrl-v where an invisible html area is needed - editor.pasteHTMLarea = ha; - editor.toplevel.appendChild(editor.pasteHTMLarea); - ha.contentEditable = true; - AssignID(editor, editor.pasteHTMLarea, "pastehtmlarea"); - SocialCalc.setStyles( - ha, - "display:block;visibility:hidden;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);overflow:hidden" - ); - } - - SocialCalc.MouseWheelRegister(editor.toplevel, { - WheelMove: SocialCalc.EditorProcessMouseWheel, - editor: editor, - }); - - if (SocialCalc.HasTouch) { - SocialCalc.TouchRegister(editor.toplevel, { - Swipe: SocialCalc.EditorProcessSwipe, - DoubleTap: SocialCalc.EditorProcessDoubleTap, - SingleTap: SocialCalc.EditorProcessSingleTap, - editor: editor, - }); - } - - if (editor.inputBox) { - // this seems to fix an obscure bug with Firefox 2 Mac where Ctrl-V doesn't get fired right - if (editor.inputBox.element) { - editor.inputBox.element.focus(); - editor.inputBox.element.blur(); - } - } - SocialCalc.KeyboardSetFocus(editor); - - // do status reporting things - - SocialCalc.EditorSheetStatusCallback(null, "startup", null, editor); - - // done - - return editor.toplevel; - }; - - // Special code needed for change that occurred with Safari 5 that made paste not work for some reason - - SocialCalc.SafariPasteFunction = function (e) { - e.preventDefault(); - }; - - // - // SocialCalc.ResizeTableEditor(editor, width, height) - // - // Move things around as appropriate and resize - // - - SocialCalc.ResizeTableEditor = function (editor, width, height) { - var scc = SocialCalc.Constants; - - editor.width = width; - editor.height = height; - - editor.toplevel.style.width = width + "px"; - editor.toplevel.style.height = height + "px"; - - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width = editor.tablewidth + "px"; - editor.griddiv.style.height = editor.tableheight + "px"; - - editor.verticaltablecontrol.main.style.height = editor.tableheight + "px"; - editor.horizontaltablecontrol.main.style.width = editor.tablewidth + "px"; - - editor.FitToEditTable(); - - editor.ScheduleRender(); - - return; - }; - - // - // str = SaveEditorSettings(editor) - // - // Returns a string representation of the pane settings, etc. - // - // The format is: - // - // version:1.0 - // rowpane:panenumber:firstnum:lastnum - // colpane:panenumber:firstnum:lastnum - // ecell:coord -- if set - // range:anchorcoord:top:bottom:left:right -- if set - // - // You can add additional values to be saved by using editor.SettingsCallbacks: - // - // editor.SettingsCallbacks["item-name"] = {save: savefunction, load: loadfunction} - // - // where savefunction(editor, "item-name") returns a string with the new lines to be added to the saved settings - // which include the trailing newlines, and loadfunction(editor, "item-name", line, flags) is given the line to process - // without the trailing newlines. - // - - SocialCalc.SaveEditorSettings = function (editor) { - var i, setting; - var context = editor.context; - var range = editor.range; - var result = ""; - - result += "version:1.0\n"; - - for (i = 0; i < context.rowpanes.length; i++) { - result += - "rowpane:" + - i + - ":" + - context.rowpanes[i].first + - ":" + - context.rowpanes[i].last + - "\n"; - } - for (i = 0; i < context.colpanes.length; i++) { - result += - "colpane:" + - i + - ":" + - context.colpanes[i].first + - ":" + - context.colpanes[i].last + - "\n"; - } - - if (editor.ecell) { - result += "ecell:" + editor.ecell.coord + "\n"; - } - - if (range.hasrange) { - result += - "range:" + - range.anchorcoord + - ":" + - range.top + - ":" + - range.bottom + - ":" + - range.left + - ":" + - range.right + - "\n"; - } - - for (setting in editor.SettingsCallbacks) { - result += editor.SettingsCallbacks[setting].save(editor, setting); - } - - return result; - }; - - // - // LoadEditorSettings(editor, str, flags) - // - // Sets the editor settings based on str. See SocialCalc.SaveEditorSettings for more details. - // Unrecognized lines are ignored. - // - - SocialCalc.LoadEditorSettings = function (editor, str, flags) { - var lines = str.split(/\r\n|\n/); - var parts = []; - var line, i, cr, row, col, coord, setting; - var context = editor.context; - var highlights, range; - - context.rowpanes = [{ first: 1, last: 1 }]; // reset to start - context.colpanes = [{ first: 1, last: 1 }]; - editor.ecell = null; - editor.range = { hasrange: false }; - editor.range2 = { hasrange: false }; - range = editor.range; - context.highlights = {}; - highlights = context.highlights; - - for (i = 0; i < lines.length; i++) { - line = lines[i]; - parts = line.split(":"); - setting = parts[0]; - switch (setting) { - case "version": - break; - - case "rowpane": - context.rowpanes[parts[1] - 0] = { - first: parts[2] - 0, - last: parts[3] - 0, - }; - break; - - case "colpane": - context.colpanes[parts[1] - 0] = { - first: parts[2] - 0, - last: parts[3] - 0, - }; - break; - - case "ecell": - editor.ecell = SocialCalc.coordToCr(parts[1]); - editor.ecell.coord = parts[1]; - highlights[parts[1]] = "cursor"; - break; - - case "range": - range.hasrange = true; - range.anchorcoord = parts[1]; - cr = SocialCalc.coordToCr(range.anchorcoord); - range.anchorrow = cr.row; - range.anchorcol = cr.col; - range.top = parts[2] - 0; - range.bottom = parts[3] - 0; - range.left = parts[4] - 0; - range.right = parts[5] - 0; - for (row = range.top; row <= range.bottom; row++) { - for (col = range.left; col <= range.right; col++) { - coord = SocialCalc.crToCoord(col, row); - if (highlights[coord] != "cursor") { - highlights[coord] = "range"; - } - } - } - break; - - default: - if (editor.SettingsCallbacks[setting]) { - editor.SettingsCallbacks[setting].load( - editor, - setting, - line, - flags - ); - } - break; - } - } - - return; - }; - - // - // EditorRenderSheet(editor) - // - // Renders the sheet and updates editor.fullgrid. - // Sets event handlers. - // - - SocialCalc.EditorRenderSheet = function (editor) { - editor.EditorMouseUnregister(); - - editor.fullgrid = editor.context.RenderSheet(editor.fullgrid); - - if (editor.ecell) editor.SetECellHeaders("selected"); - - SocialCalc.AssignID(editor, editor.fullgrid, "fullgrid"); // give it an id - - editor.EditorMouseRegister(); - }; - - // - // EditorScheduleSheetCommands(editor, cmdstr, saveundo, ignorebusy) - // - - SocialCalc.EditorScheduleSheetCommands = function ( - editor, - cmdstr, - saveundo, - ignorebusy - ) { - if (editor.state != "start" && !ignorebusy) { - // ignore commands if editing a cell - return; - } - - if (editor.busy && !ignorebusy) { - // hold off on commands if doing one - editor.deferredCommands.push({ cmdstr: cmdstr, saveundo: saveundo }); - return; - } - - switch (cmdstr) { - case "recalc": - case "redisplay": - editor.context.sheetobj.ScheduleSheetCommands(cmdstr, false); - break; - - case "undo": - editor.SheetUndo(); - break; - - case "redo": - editor.SheetRedo(); - break; - - default: - editor.context.sheetobj.ScheduleSheetCommands(cmdstr, saveundo); - break; - } - }; - - // - // EditorSheetStatusCallback(recalcdata, status, arg, editor) - // - // Called during recalc, executing commands, etc. - // - - SocialCalc.EditorSheetStatusCallback = function ( - recalcdata, - status, - arg, - editor - ) { - var f, cell, dcmd; - var sheetobj = editor.context.sheetobj; - var cr; - - var signalstatus = function (s) { - for (f in editor.StatusCallback) { - if (editor.StatusCallback[f].func) { - editor.StatusCallback[f].func( - editor, - s, - arg, - editor.StatusCallback[f].params - ); - } - } - }; - - switch (status) { - case "startup": - break; - - case "cmdstart": - editor.busy = true; - sheetobj.celldisplayneeded = ""; - break; - - case "cmdextension": - break; - - case "cmdend": - signalstatus(status); - - if (sheetobj.changedrendervalues) { - editor.context.PrecomputeSheetFontsAndLayouts(); - editor.context.CalculateCellSkipData(); - sheetobj.changedrendervalues = false; - } - - if (sheetobj.celldisplayneeded && !sheetobj.renderneeded) { - cr = SocialCalc.coordToCr(sheetobj.celldisplayneeded); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.ReplaceCell(cell, cr.row, cr.col); - } - - if (editor.deferredCommands.length) { - dcmd = editor.deferredCommands.shift(); - editor.EditorScheduleSheetCommands(dcmd.cmdstr, dcmd.saveundo, true); - return; - } - - if ( - sheetobj.attribs.needsrecalc && - (sheetobj.attribs.recalc != "off" || sheetobj.recalconce) && - editor.recalcFunction - ) { - editor.FitToEditTable(); - sheetobj.renderneeded = false; // recalc will force a render - if (sheetobj.recalconce) delete sheetobj.recalconce; // only do once - editor.recalcFunction(editor); - } else { - if (sheetobj.renderneeded) { - editor.FitToEditTable(); - sheetobj.renderneeded = false; - editor.ScheduleRender(); - } else { - editor.SchedulePositionCalculations(); // just in case command changed positions - // editor.busy = false; - // signalstatus("cmdendnorender"); - } - } - return; - - case "calcstart": - editor.busy = true; - break; - - case "calccheckdone": - case "calcorder": - case "calcstep": - case "calcloading": - case "calcserverfunc": - break; - - case "calcfinished": - signalstatus(status); - editor.ScheduleRender(); - return; - - case "schedrender": - editor.busy = true; // in case got here without cmd or recalc - break; - - case "renderdone": - break; - - case "schedposcalc": - editor.busy = true; // in case got here without cmd or recalc - break; - - case "doneposcalc": - if (editor.deferredCommands.length) { - signalstatus(status); - dcmd = editor.deferredCommands.shift(); - editor.EditorScheduleSheetCommands(dcmd.cmdstr, dcmd.saveundo, true); - } else { - editor.busy = false; - signalstatus(status); - if (editor.state == "start") editor.DisplayCellContents(); // make sure up to date - } - return; - - default: - addmsg("Unknown status: " + status); - break; - } - - signalstatus(status); - - return; - }; - - // Timer-driven steps for use with SocialCalc.EditorSheetStatusCallback - - SocialCalc.EditorStepInfo = { - // status: "", // saved value to pass to callback - editor: null, // for callback - // arg: null, // for callback - // timerobj: null - }; - - /* - SocialCalc.EditorStepSet = function(editor, status, arg) { - var esi = SocialCalc.EditorStepInfo; - addmsg("step: "+status); - if (esi.timerobj) { - alert("Already waiting. Old/new: "+esi.status+"/"+status); - } - esi.editor = editor; - esi.status = status; - esi.timerobj = window.setTimeout(SocialCalc.EditorStepDone, 1); - } - - SocialCalc.EditorStepDone = function() { - var esi = SocialCalc.EditorStepInfo; - esi.timerobj = null; - SocialCalc.EditorSheetStatusCallback(null, esi.status, null, esi.editor); - } - */ - - // - // str = SocialCalc.EditorGetStatuslineString(editor, status, arg, params) - // - // Assumes params is an object where it can use "calculating" and "command" - // to keep track of state. - // Returns string for status line. - // - - SocialCalc.EditorGetStatuslineString = function ( - editor, - status, - arg, - params - ) { - var scc = SocialCalc.Constants; - - var sstr, progress, coord, circ, r, c, cell, sum, ele; - - progress = ""; - - switch (status) { - case "moveecell": - case "rangechange": - case "startup": - break; - case "cmdstart": - params.command = true; - document.body.style.cursor = "progress"; - editor.griddiv.style.cursor = "progress"; - progress = scc.s_statusline_executing; - break; - case "cmdextension": - progress = "Command Extension: " + arg; - break; - case "cmdend": - params.command = false; - break; - case "schedrender": - progress = scc.s_statusline_displaying; - break; - case "renderdone": - progress = " "; - break; - case "schedposcalc": - progress = scc.s_statusline_displaying; - break; - case "cmdendnorender": - case "doneposcalc": - document.body.style.cursor = "default"; - editor.griddiv.style.cursor = "default"; - break; - case "calcorder": - progress = - scc.s_statusline_ordering + - Math.floor((100 * arg.count) / (arg.total || 1)) + - "%"; - break; - case "calcstep": - progress = - scc.s_statusline_calculating + - Math.floor((100 * arg.count) / (arg.total || 1)) + - "%"; - break; - case "calcloading": - progress = scc.s_statusline_calculatingls + ": " + arg.sheetname; - break; - case "calcserverfunc": - progress = - scc.s_statusline_calculating + - Math.floor((100 * arg.count) / (arg.total || 1)) + - "%, " + - scc.s_statusline_doingserverfunc + - arg.funcname + - scc.s_statusline_incell + - arg.coord; - break; - case "calcstart": - params.calculating = true; - document.body.style.cursor = "progress"; - editor.griddiv.style.cursor = "progress"; // griddiv has an explicit cursor style - progress = scc.s_statusline_calcstart; - break; - case "calccheckdone": - break; - case "calcfinished": - params.calculating = false; - break; - default: - progress = status; - break; - } - - if (!progress && params.calculating) { - progress = scc.s_statusline_calculating; - } - - // if there is a range, calculate sum (not during busy times) - if ( - !params.calculating && - !params.command && - !progress && - editor.range.hasrange && - (editor.range.left != editor.range.right || - editor.range.top != editor.range.bottom) - ) { - sum = 0; - for (r = editor.range.top; r <= editor.range.bottom; r++) { - for (c = editor.range.left; c <= editor.range.right; c++) { - cell = editor.context.sheetobj.cells[SocialCalc.crToCoord(c, r)]; - if (!cell) continue; - if (cell.valuetype && cell.valuetype.charAt(0) == "n") { - sum += cell.datavalue - 0; - } - } - } - - sum = SocialCalc.FormatNumber.formatNumberWithFormat( - sum, - "[,]General", - "" - ); - - coord = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - progress = - coord + - " (" + - (editor.range.right - editor.range.left + 1) + - "x" + - (editor.range.bottom - editor.range.top + 1) + - ") " + - scc.s_statusline_sum + - "=" + - sum + - " " + - progress; - } - sstr = editor.ecell.coord + "   " + progress; - - if ( - !params.calculating && - editor.context.sheetobj.attribs.needsrecalc == "yes" - ) { - sstr += "   " + scc.s_statusline_recalcneeded; - } - - circ = editor.context.sheetobj.attribs.circularreferencecell; - if (circ) { - circ = circ.replace(/\|/, " referenced by "); - sstr += "   " + scc.s_statusline_circref + circ + "
    "; - } - - return sstr; - }; - - // - // Mouse stuff - // - - SocialCalc.EditorMouseInfo = { - // The registeredElements array is used to identify editor grid in which the mouse is doing things. - - // One item for each active editor, each an object with: - // .element, .editor - - registeredElements: [], - - editor: null, // editor being processed (between mousedown and mouseup) - element: null, // element being processed - - ignore: false, // if true, mousedowns are ignored - - mousedowncoord: "", // coord where mouse went down for drag range - mouselastcoord: "", // coord where mouse last was during drag - mouseresizecol: "", // col being resized - mouseresizeclientx: null, // where resize started - mouseresizedisplay: null, // element tracking new size - }; - - // - // EditorMouseRegister(editor) - // - - SocialCalc.EditorMouseRegister = function (editor) { - var mouseinfo = SocialCalc.EditorMouseInfo; - var element = editor.fullgrid; - var i; - - for (i = 0; i < mouseinfo.registeredElements.length; i++) { - if (mouseinfo.registeredElements[i].editor == editor) { - if (mouseinfo.registeredElements[i].element == element) { - return; // already set - don't do it again - } - break; - } - } - - if (i < mouseinfo.registeredElements.length) { - mouseinfo.registeredElements[i].element = element; - } else { - mouseinfo.registeredElements.push({ element: element, editor: editor }); - } - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener( - "mousedown", - SocialCalc.ProcessEditorMouseDown, - false - ); - element.addEventListener( - "dblclick", - SocialCalc.ProcessEditorDblClick, - false - ); - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousedown", SocialCalc.ProcessEditorMouseDown); - element.attachEvent("ondblclick", SocialCalc.ProcessEditorDblClick); - } else { - // don't handle this - throw "Browser not supported"; - } - - mouseinfo.ignore = false; // just in case - - return; - }; - - // - // EditorMouseUnregister(editor) - // - - SocialCalc.EditorMouseUnregister = function (editor) { - var mouseinfo = SocialCalc.EditorMouseInfo; - var element = editor.fullgrid; - var i, oldelement; - - for (i = 0; i < mouseinfo.registeredElements.length; i++) { - if (mouseinfo.registeredElements[i].editor == editor) { - break; - } - } - - if (i < mouseinfo.registeredElements.length) { - oldelement = mouseinfo.registeredElements[i].element; // remove old handlers - if (oldelement.removeEventListener) { - // DOM Level 2 - oldelement.removeEventListener( - "mousedown", - SocialCalc.ProcessEditorMouseDown, - false - ); - oldelement.removeEventListener( - "dblclick", - SocialCalc.ProcessEditorDblClick, - false - ); - } else if (oldelement.detachEvent) { - // IE - oldelement.detachEvent( - "onmousedown", - SocialCalc.ProcessEditorMouseDown - ); - oldelement.detachEvent("ondblclick", SocialCalc.ProcessEditorDblClick); - } - mouseinfo.registeredElements.splice(i, 1); - } - - return; - }; - - SocialCalc.ProcessEditorMouseDown = function (e) { - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var mobj; - - if (mouseinfo.ignore) return; // ignore this - - for (mobj = null; !mobj && ele; ele = ele.parentNode) { - // go up tree looking for one of our elements - mobj = SocialCalc.LookupElement(ele, mouseinfo.registeredElements); - } - if (!mobj) { - mouseinfo.editor = null; - return; // not one of our elements - } - - editor = mobj.editor; - mouseinfo.element = ele; - range = editor.range; - result = SocialCalc.GridMousePosition(editor, clientX, clientY); - - if (!result || result.rowheader) return; // not on a cell or col header - mouseinfo.editor = editor; // remember for later - - if (result.colheader && result.coltoresize) { - // col header - do drag resize - SocialCalc.ProcessEditorColsizeMouseDown(e, ele, result); - return; - } - - if (!result.coord) return; // not us - - if (!range.hasrange) { - if (e.shiftKey) editor.RangeAnchor(); - } - - SocialCalc.Callbacks.ToggleCell(result.coord); - coord = editor.MoveECell(result.coord); - - if (range.hasrange) { - if (e.shiftKey) editor.RangeExtend(); - else editor.RangeRemove(); - } - - mouseinfo.mousedowncoord = coord; // remember if starting drag range select - mouseinfo.mouselastcoord = coord; - - editor.EditorMouseRange(coord); - - SocialCalc.KeyboardSetFocus(editor); - if (editor.state != "start" && editor.inputBox) - editor.inputBox.element.focus(); - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.ProcessEditorMouseMove, - true - ); // capture everywhere - document.addEventListener( - "mouseup", - SocialCalc.ProcessEditorMouseUp, - true - ); // capture everywhere - } else if (ele.attachEvent) { - // IE 5+ - ele.setCapture(); - ele.attachEvent("onmousemove", SocialCalc.ProcessEditorMouseMove); - ele.attachEvent("onmouseup", SocialCalc.ProcessEditorMouseUp); - ele.attachEvent("onlosecapture", SocialCalc.ProcessEditorMouseUp); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.EditorMouseRange = function (editor, coord) { - var inputtext, wval; - var range = editor.range; - - switch ( - editor.state // editing a cell - shouldn't get here if no inputBox - ) { - case "input": - inputtext = editor.inputBox.GetText(); - wval = editor.workingvalues; - if ( - ("(+-*/,:!&<>=^".indexOf(inputtext.slice(-1)) >= 0 && - inputtext.slice(0, 1) == "=") || - inputtext == "=" - ) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { - // if in pointing operation - if (coord) { - if (range.hasrange) { - var sheetpref = - wval.currentsheet == wval.startsheet - ? "" - : wval.currentsheet + "!"; - editor.inputBox.SetText( - wval.partialexpr + - sheetpref + - SocialCalc.crToCoord(range.left, range.top) + - ":" + - sheetpref + - SocialCalc.crToCoord(range.right, range.bottom) - ); - } else { - var sheetpref = - wval.currentsheet == wval.startsheet - ? "" - : wval.currentsheet + "!"; - editor.inputBox.SetText(wval.partialexpr + sheetpref + coord); - } - } - } else { - // not in point -- done editing - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - } - break; - - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - break; - } - }; - - SocialCalc.ProcessEditorMouseMove = function (e) { - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat(editor, result); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - if (result.coord != mouseinfo.mouselastcoord) { - if (!e.shiftKey && !editor.range.hasrange) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - } - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - mouseinfo.mouselastcoord = result.coord; - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.ProcessEditorMouseUp = function (e) { - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result) return; - - if (!result.coord) result.coord = editor.ecell.coord; - - if (editor.range.hasrange) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } else if (result.coord && result.coord != mouseinfo.mousedowncoord) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener( - "mousemove", - SocialCalc.ProcessEditorMouseMove, - true - ); - document.removeEventListener( - "mouseup", - SocialCalc.ProcessEditorMouseUp, - true - ); - } else if (element.detachEvent) { - // IE - element.detachEvent("onlosecapture", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmouseup", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmousemove", SocialCalc.ProcessEditorMouseMove); - element.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - }; - - SocialCalc.ProcessEditorColsizeMouseDown = function (e, ele, result) { - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - mouseinfo.mouseresizecolnum = result.coltoresize; // remember col being resized - mouseinfo.mouseresizecol = SocialCalc.rcColname(result.coltoresize); - mouseinfo.mousedownclientx = clientX; - - var sizedisplay = document.createElement("div"); - mouseinfo.mouseresizedisplay = sizedisplay; - sizedisplay.style.width = "auto"; - sizedisplay.style.position = "absolute"; - sizedisplay.style.zIndex = 100; - sizedisplay.style.top = editor.headposition.top + 0 + "px"; - sizedisplay.style.left = editor.colpositions[result.coltoresize] + "px"; - sizedisplay.innerHTML = - '' + - '
     
    ' + - editor.context.colwidth[mouseinfo.mouseresizecolnum] + - "
    "; - SocialCalc.setStyles( - sizedisplay.firstChild.lastChild.firstChild.childNodes[0], - "filter:alpha(opacity=85);opacity:.85;" - ); // so no warning msg with Firefox about filter - - editor.toplevel.appendChild(sizedisplay); - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.ProcessEditorColsizeMouseMove, - true - ); // capture everywhere - document.addEventListener( - "mouseup", - SocialCalc.ProcessEditorColsizeMouseUp, - true - ); // capture everywhere - } else if (editor.toplevel.attachEvent) { - // IE 5+ - editor.toplevel.setCapture(); - editor.toplevel.attachEvent( - "onmousemove", - SocialCalc.ProcessEditorColsizeMouseMove - ); - editor.toplevel.attachEvent( - "onmouseup", - SocialCalc.ProcessEditorColsizeMouseUp - ); - editor.toplevel.attachEvent( - "onlosecapture", - SocialCalc.ProcessEditorColsizeMouseUp - ); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.ProcessEditorColsizeMouseMove = function (e) { - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - var newsize = - editor.context.colwidth[mouseinfo.mouseresizecolnum] - - 0 + - (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) - newsize = SocialCalc.Constants.defaultMinimumColWidth; - - var sizedisplay = mouseinfo.mouseresizedisplay; - // sizedisplay.firstChild.lastChild.firstChild.childNodes[1].firstChild.innerHTML = newsize+""; - // sizedisplay.firstChild.lastChild.firstChild.childNodes[0].firstChild.style.width = (newsize-2)+"px"; - sizedisplay.innerHTML = - '' + - '
     
    ' + - newsize + - "
    "; - SocialCalc.setStyles( - sizedisplay.firstChild.lastChild.firstChild.childNodes[0], - "filter:alpha(opacity=85);opacity:.85;" - ); // so no warning msg with Firefox about filter - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.ProcessEditorColsizeMouseUp = function (e) { - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - element = mouseinfo.element; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener( - "mousemove", - SocialCalc.ProcessEditorColsizeMouseMove, - true - ); - document.removeEventListener( - "mouseup", - SocialCalc.ProcessEditorColsizeMouseUp, - true - ); - } else if (editor.toplevel.detachEvent) { - // IE - editor.toplevel.detachEvent( - "onlosecapture", - SocialCalc.ProcessEditorColsizeMouseUp - ); - editor.toplevel.detachEvent( - "onmouseup", - SocialCalc.ProcessEditorColsizeMouseUp - ); - editor.toplevel.detachEvent( - "onmousemove", - SocialCalc.ProcessEditorColsizeMouseMove - ); - editor.toplevel.releaseCapture(); - } - - var newsize = - editor.context.colwidth[mouseinfo.mouseresizecolnum] - - 0 + - (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) - newsize = SocialCalc.Constants.defaultMinimumColWidth; - - editor.EditorScheduleSheetCommands( - "set " + mouseinfo.mouseresizecol + " width " + newsize, - true, - false - ); - - if (editor.timeout) window.clearTimeout(editor.timeout); - editor.timeout = window.setTimeout(SocialCalc.FinishColsize, 1); // wait - Firefox 2 has a bug otherwise with next mousedown - - return false; - }; - - SocialCalc.FinishColsize = function () { - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; - - editor.toplevel.removeChild(mouseinfo.mouseresizedisplay); - mouseinfo.mouseresizedisplay = null; - - // editor.FitToEditTable(); - // editor.EditorRenderSheet(); - // editor.SchedulePositionCalculations(); - - mouseinfo.editor = null; - - return; - }; - - // - // Handle auto-repeat of dragging the cursor into the borders of the sheet - // - - SocialCalc.AutoRepeatInfo = { - timer: null, // timer object for repeating - mouseinfo: null, // result from SocialCalc.GridMousePosition - repeatinterval: 1000, // milliseconds to wait between repeats - editor: null, // editor object to use when it repeats - repeatcallback: null, // used instead of default when repeating (e.g., for cellhandles) - // called as: repeatcallback(newcoord, direction) - }; - - // Control auto-repeat. If mouseinfo==null, cancel. - - SocialCalc.SetDragAutoRepeat = function (editor, mouseinfo, callback) { - var repeatinfo = SocialCalc.AutoRepeatInfo; - var coord, direction; - - repeatinfo.repeatcallback = callback; // null in regular case - - if (!mouseinfo) { - // cancel - if (repeatinfo.timer) { - // If was repeating, stop - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - repeatinfo.mouseinfo = null; - return; // done - } - - repeatinfo.editor = editor; - - if (repeatinfo.mouseinfo) { - // check for change while repeating - if (mouseinfo.rowheader || mouseinfo.rowfooter) { - if (mouseinfo.row != repeatinfo.mouseinfo.row) { - // changed row while dragging sidewards - coord = SocialCalc.crToCoord(editor.ecell.col, mouseinfo.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } else { - editor.MoveECell(coord); - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } else if (mouseinfo.colheader || mouseinfo.colfooter) { - if (mouseinfo.col != repeatinfo.mouseinfo.col) { - // changed col while dragging vertically - coord = SocialCalc.crToCoord(mouseinfo.col, editor.ecell.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } else { - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } - } - - repeatinfo.mouseinfo = mouseinfo; - - if (mouseinfo.distance < 5) repeatinfo.repeatinterval = 333; - else if (mouseinfo.distance < 10) repeatinfo.repeatinterval = 250; - else if (mouseinfo.distance < 25) repeatinfo.repeatinterval = 100; - else if (mouseinfo.distance < 35) repeatinfo.repeatinterval = 75; - else { - // too far - stop repeating - if (repeatinfo.timer) { - // if repeating, cancel it - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - return; - } - - if (!repeatinfo.timer) { - // start if not already running - repeatinfo.timer = window.setTimeout( - SocialCalc.DragAutoRepeat, - repeatinfo.repeatinterval - ); - } - - return; - }; - - // - // DragAutoRepeat() - // - - SocialCalc.DragAutoRepeat = function () { - var repeatinfo = SocialCalc.AutoRepeatInfo; - var mouseinfo = repeatinfo.mouseinfo; - - var direction, coord, cr; - - if (mouseinfo.rowheader) direction = "left"; - else if (mouseinfo.rowfooter) direction = "right"; - else if (mouseinfo.colheader) direction = "up"; - else if (mouseinfo.colfooter) direction = "down"; - - if (repeatinfo.repeatcallback) { - cr = SocialCalc.coordToCr(repeatinfo.editor.ecell.coord); - if (direction == "left" && cr.col > 1) cr.col--; - else if (direction == "right") cr.col++; - else if (direction == "up" && cr.row > 1) cr.row--; - else if (direction == "down") cr.row++; - coord = SocialCalc.crToCoord(cr.col, cr.row); - repeatinfo.repeatcallback(coord, direction); - } else { - coord = repeatinfo.editor.MoveECellWithKey("[a" + direction + "]shifted"); - if (coord) repeatinfo.editor.EditorMouseRange(coord); - } - - repeatinfo.timer = window.setTimeout( - SocialCalc.DragAutoRepeat, - repeatinfo.repeatinterval - ); - }; - - // - // Handling Clicking - // - - SocialCalc.ProcessEditorDblClick = function (e) { - var editor, result, coord, textarea, wval, range, sheetobj; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var mobj; - - if (mouseinfo.ignore) return; // ignore this - - for (mobj = null; !mobj && ele; ele = ele.parentNode) { - // go up tree looking for one of our elements - mobj = SocialCalc.LookupElement(ele, mouseinfo.registeredElements); - } - if (!mobj) { - mouseinfo.editor = null; - return; // not one of our elements - } - - editor = mobj.editor; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); - if (!result || !result.coord) return; // not within cell area - ignore - - mouseinfo.editor = editor; // remember for later - mouseinfo.element = ele; - range = editor.range; - - sheetobj = editor.context.sheetobj; - - switch (editor.state) { - case "start": - SocialCalc.EditorOpenCellEdit(editor); - break; - - case "input": - break; - - default: - break; - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.EditorOpenCellEdit = function (editor) { - var wval; - - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no input box, so no editing (happens on noEdit) - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - if (editor.inputBox.element.disabled) return true; // multi-line: ignore - if (editor.inputBox.element.style.display == "none") { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "editecell", - null, - editor.StatusCallback[f].params - ); - } - return true; // no inputBox display, so no editing - } - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - - editor.state = "inputboxdirect"; - - editor.inputBox.SetText(""); - editor.inputBox.DisplayCellContents(); - editor.inputBox.Select("end"); - wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - - return; - }; - - SocialCalc.EditorProcessKey = function (editor, ch, e) { - var result, cell, cellobj, valueinfo, fch, coord, inputtext, f; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - var range = editor.range; - - if (typeof ch != "string") ch = ""; - - switch (editor.state) { - case "start": - if (e.shiftKey && ch.substr(0, 2) == "[a") { - ch = ch + "shifted"; - } - if (ch == "[enter]") ch = "[adown]"; - if (ch == "[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if ( - ch.substr(0, 2) == "[a" || - ch.substr(0, 3) == "[pg" || - ch == "[home]" - ) { - result = editor.MoveECellWithKey(ch); - return !result; - } - if (ch == "[del]" || ch == "[backspace]") { - if (!editor.noEdit) { - editor.EditorApplySetCommandsToRange("empty", ""); - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - break; - } - if (ch == "[esc]") { - if (range.hasrange) { - editor.RangeRemove(); - editor.MoveECell(range.anchorcoord); - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "specialkey", - ch, - editor.StatusCallback[f].params - ); - } - } - return false; - } - - if (ch == "[f2]") { - if (editor.noEdit) return true; - SocialCalc.EditorOpenCellEdit(editor); - return false; - } - - if ((ch.length > 1 && ch.substr(0, 1) == "[") || ch.length == 0) { - // some control key - if (editor.ctrlkeyFunction && ch.length > 0) { - return editor.ctrlkeyFunction(editor, ch); - } else { - return true; - } - } - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no inputBox so no editing - if (editor.inputBox.element.style.display == "none") { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "editecell", - ch, - editor.StatusCallback[f].params - ); - } - return true; // no inputBox display, so no editing - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - editor.inputBox.element.disabled = false; // make sure editable - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - editor.inputBox.SetText(ch); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (editor.inputBox.skipOne) return false; // ignore a key already handled - if ( - ch == "[esc]" || - ch == "[enter]" || - ch == "[tab]" || - (ch && ch.substr(0, 2) == "[a") - ) { - if ( - ("(+-*/,:!&<>=^".indexOf(inputtext.slice(-1)) >= 0 && - inputtext.slice(0, 1) == "=") || - inputtext == "=" - ) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { - // if in pointing operation - if (e.shiftKey && ch.substr(0, 2) == "[a") { - ch = ch + "shifted"; - } - coord = editor.MoveECellWithKey(ch); - if (coord) { - if (range.hasrange) { - editor.inputBox.SetText( - wval.partialexpr + - SocialCalc.crToCoord(range.left, range.top) + - ":" + - SocialCalc.crToCoord(range.right, range.bottom) - ); - } else { - editor.inputBox.SetText(wval.partialexpr + coord); - } - return false; - } - } - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch != "[esc]") { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch == "[enter]") ch = "[adown]"; - if (ch == "[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0, 2) == "[a") { - editor.MoveECellWithKey(ch); - } - } else { - editor.inputBox.DisplayCellContents(); - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - break; - } - if (wval.partialexpr && ch == "[backspace]") { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - return false; - } - if (ch == "[f2]") return false; - if (range.hasrange) { - editor.RangeRemove(); - } - editor.MoveECell(wval.ecoord); - if (wval.partialexpr) { - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - wval.partialexpr = ""; // not pointing - } - return true; - - case "inputboxdirect": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (ch == "[esc]" || ch == "[enter]" || ch == "[tab]") { - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch == "[esc]") { - editor.inputBox.DisplayCellContents(); - } else { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch == "[enter]") ch = "[adown]"; - if (ch == "[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0, 2) == "[a") { - editor.MoveECellWithKey(ch); - } - } - break; - } - if (ch == "[f2]") return false; - return true; - - case "skip-and-start": - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - return false; - - default: - return true; - } - - return false; - }; - - SocialCalc.EditorAddToInput = function (editor, str, prefix) { - var wval = editor.workingvalues; - - if (editor.noEdit) return; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - switch (editor.state) { - case "start": - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.element.disabled = false; // make sure editable and overwrite old - editor.inputBox.Focus(); - editor.inputBox.SetText((prefix || "") + str); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.focus(); - if (wval.partialexpr) { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - editor.inputBox.SetText(editor.inputBox.GetText() + str); - break; - - default: - break; - } - }; - - SocialCalc.EditorDisplayCellContents = function (editor) { - if (editor.inputBox) editor.inputBox.DisplayCellContents(); - }; - var arr = []; - SocialCalc.EditorSaveEdit = function (editor, text) { - //console.log("editorSaveEdit"); - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - type = "text t"; - //changes for prompt - - value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord) + ""; - //console.log("old:"+oldvalue) - //console.log("new:"+value) - if (value == oldvalue) { - // no change - return; - } - if ("'" + value == oldvalue) { - return; - } - - fch = value.charAt(0); - if (fch == "=" && value.indexOf("\n") == -1) { - type = "formula"; - value = value.substring(1); - } else if (fch == "'") { - type = "text t"; - value = value.substring(1); - } else if (value.length == 0) { - type = "empty"; - } else { - valueinfo = SocialCalc.DetermineValueType(value); - if (valueinfo.type == "n" && value == valueinfo.value + "") { - // see if don't need "constant" - type = "value n"; - } else if (valueinfo.type.charAt(0) == "t") { - type = "text " + valueinfo.type; - } else if (valueinfo.type == "") { - type = "text t"; - } else { - type = "constant " + valueinfo.type + " " + valueinfo.value; - } - } - - if (type.charAt(0) == "t") { - // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - cmdline = "set " + wval.ecoord + " " + type + " " + value; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - }; - - // - // SocialCalc.EditorApplySetCommandsToRange(editor, cmd) - // - // Takes ecell or range and does a "set" command with cmd. - // - - SocialCalc.EditorApplySetCommandsToRange = function (editor, cmd) { - var cell, row, col, line, errortext; - - var sheetobj = editor.context.sheetobj; - var ecell = editor.ecell; - var range = editor.range; - - if (range.hasrange) { - coord = - SocialCalc.crToCoord(range.left, range.top) + - ":" + - SocialCalc.crToCoord(range.right, range.bottom); - line = "set " + coord + " " + cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } else { - line = "set " + ecell.coord + " " + cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } - - editor.DisplayCellContents(); - }; - - SocialCalc.EditorProcessMouseWheel = function ( - event, - delta, - mousewheelinfo, - wobj - ) { - if (wobj.functionobj.editor.busy) return; // ignore if busy - - if (delta > 0) { - wobj.functionobj.editor.ScrollRelative(true, -1); - } - if (delta < 0) { - wobj.functionobj.editor.ScrollRelative(true, +1); - } - }; - - // - // GridMousePosition(editor, clientX, clientY) - // - // Returns an object with row and col numbers and coord (spans handled for coords), - // and rowheader/colheader true if in header (where coord will be undefined). - // If in colheader, will return coltoresize if on appropriate place in col header. - // Also, there is rowfooter (on right) and colfooter (on bottom). - // In row/col header/footer, returns "distance" as pixels over the edge. - // - - SocialCalc.GridMousePosition = function (editor, clientX, clientY) { - var row, col, colpane; - var result = {}; - - for (row = 1; row < editor.rowpositions.length; row++) { - if (!editor.rowheight[row]) continue; // not rendered yet -- may be above or below us - if (editor.rowpositions[row] + editor.rowheight[row] > clientY) { - break; - } - } - for (col = 1; col < editor.colpositions.length; col++) { - if (!editor.colwidth[col]) continue; - if (editor.colpositions[col] + editor.colwidth[col] > clientX) { - break; - } - } - - result.row = row; - result.col = col; - - if (editor.headposition) { - if ( - clientX < editor.headposition.left && - clientX >= editor.gridposition.left - ) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } else if ( - clientY < editor.headposition.top && - clientY > editor.gridposition.top - ) { - // > because of sizing row - result.colheader = true; - result.distance = editor.headposition.top - clientY; - result.coltoresize = - col - - (editor.colpositions[col] + editor.colwidth[col] / 2 > clientX - ? 1 - : 0) || 1; - for (colpane = 0; colpane < editor.context.colpanes.length; colpane++) { - if ( - result.coltoresize >= editor.context.colpanes[colpane].first && - result.coltoresize <= editor.context.colpanes[colpane].last - ) { - // visible column - return result; - } - } - delete result.coltoresize; - return result; - } else if (clientX >= editor.verticaltablecontrol.controlborder) { - result.rowfooter = true; - result.distance = clientX - editor.verticaltablecontrol.controlborder; - return result; - } else if (clientY >= editor.horizontaltablecontrol.controlborder) { - result.colfooter = true; - result.distance = clientY - editor.horizontaltablecontrol.controlborder; - return result; - } else if (clientX < editor.gridposition.left) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } else if (clientY <= editor.gridposition.top) { - result.colheader = true; - result.distance = editor.headposition.top - clientY; - return result; - } else { - result.coord = SocialCalc.crToCoord(result.col, result.row); - if (editor.context.cellskip[result.coord]) { - // handle skipped cells - result.coord = editor.context.cellskip[result.coord]; - } - return result; - } - } - - return null; - }; - - // - // GetEditorCellElement(editor, row, col) - // - // Returns an object with element, the table cell element in the DOM that corresponds to row and column, - // as well as rowpane and colpane, the panes with the cell. - // If no such element, then returns null; - // - - SocialCalc.GetEditorCellElement = function (editor, row, col) { - var rowpane, colpane, c, coord; - var rowindex = 0; - var colindex = 0; - - for (rowpane = 0; rowpane < editor.context.rowpanes.length; rowpane++) { - if ( - row >= editor.context.rowpanes[rowpane].first && - row <= editor.context.rowpanes[rowpane].last - ) { - for (colpane = 0; colpane < editor.context.colpanes.length; colpane++) { - if ( - col >= editor.context.colpanes[colpane].first && - col <= editor.context.colpanes[colpane].last - ) { - rowindex += row - editor.context.rowpanes[rowpane].first + 2; - for (c = editor.context.colpanes[colpane].first; c <= col; c++) { - coord = editor.context.cellskip[SocialCalc.crToCoord(c, row)]; - if ( - !coord || - !editor.context.CoordInPane(coord, rowpane, colpane) - ) - // don't count col-spanned cells - colindex++; - } - return { - element: - editor.griddiv.firstChild.lastChild.childNodes[rowindex] - .childNodes[colindex], - rowpane: rowpane, - colpane: colpane, - }; - } - for ( - c = editor.context.colpanes[colpane].first; - c <= editor.context.colpanes[colpane].last; - c++ - ) { - coord = editor.context.cellskip[SocialCalc.crToCoord(c, row)]; - if (!coord || !editor.context.CoordInPane(coord, rowpane, colpane)) - // don't count col-spanned cells - colindex++; - } - colindex += 1; - } - } - rowindex += - editor.context.rowpanes[rowpane].last - - editor.context.rowpanes[rowpane].first + - 1 + - 1; - } - - return null; - }; - - // - // cellcoord = MoveECellWithKey(editor, ch) - // - // Processes an arrow key, etc., moving the edit cell. - // If not a movement key, returns null. - // - - SocialCalc.MoveECellWithKey = function (editor, ch) { - var coord, row, col, cell; - var shifted = false; - - if (!editor.ecell) { - return null; - } - - if (ch.slice(-7) == "shifted") { - ch = ch.slice(0, -7); - shifted = true; - } - - row = editor.ecell.row; - col = editor.ecell.col; - cell = editor.context.sheetobj.cells[editor.ecell.coord]; - - switch (ch) { - case "[adown]": - row += (cell && cell.rowspan) || 1; - break; - case "[aup]": - row--; - break; - case "[pgdn]": - row += editor.pageUpDnAmount - 1 + ((cell && cell.rowspan) || 1); - break; - case "[pgup]": - row -= editor.pageUpDnAmount; - break; - case "[aright]": - col += (cell && cell.colspan) || 1; - break; - case "[aleft]": - col--; - break; - case "[home]": - row = 1; - col = 1; - break; - default: - return null; - } - - if (!editor.range.hasrange) { - if (shifted) editor.RangeAnchor(); - } - - coord = editor.MoveECell(SocialCalc.crToCoord(col, row)); - - if (editor.range.hasrange) { - if (shifted) editor.RangeExtend(); - else editor.RangeRemove(); - } - - return coord; - }; - - // - // cellcoord = MoveECell(editor, newecell) - // - // Takes a coordinate and returns the new edit cell coordinate (which may be - // different if newecell is covered by a span). - // - - SocialCalc.MoveECell = function (editor, newcell) { - var cell, f; - - var highlights = editor.context.highlights; - - if (editor.ecell) { - //changes for prompt - if (editor.ecell.coord == newcell) return newcell; - - if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast("ecell", { - original: editor.ecell.coord, - ecell: newcell, - }); - } - - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - delete highlights[editor.ecell.coord]; - if ( - editor.range2.hasrange && - editor.ecell.row >= editor.range2.top && - editor.ecell.row <= editor.range2.bottom && - editor.ecell.col >= editor.range2.left && - editor.ecell.col <= editor.range2.right - ) { - highlights[editor.ecell.coord] = "range2"; - } - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders(""); // set to regular col/rowname styles - editor.cellhandles.ShowCellHandles(false); - } else if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast("ecell", { ecell: newcell }); - } - newcell = editor.context.cellskip[newcell] || newcell; - editor.ecell = SocialCalc.coordToCr(newcell); - editor.ecell.coord = newcell; - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - highlights[newcell] = "cursor"; - - for (f in editor.MoveECellCallback) { - // let others know - editor.MoveECellCallback[f](editor); - } - - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders("selected"); - - for (f in editor.StatusCallback) { - // let status line, etc., know - editor.StatusCallback[f].func( - editor, - "moveecell", - newcell, - editor.StatusCallback[f].params - ); - } - - if (editor.busy) { - editor.ensureecell = true; // wait for when not busy - } else { - editor.ensureecell = false; - editor.EnsureECellVisible(); - } - - return newcell; - }; - - SocialCalc.EnsureECellVisible = function (editor) { - var vamount = 0; - var hamount = 0; - - if (editor.ecell.row > editor.lastnonscrollingrow) { - if (editor.ecell.row < editor.firstscrollingrow) { - vamount = editor.ecell.row - editor.firstscrollingrow; - } else if (editor.ecell.row > editor.lastvisiblerow) { - vamount = editor.ecell.row - editor.lastvisiblerow; - } - } - if (editor.ecell.col > editor.lastnonscrollingcol) { - if (editor.ecell.col < editor.firstscrollingcol) { - hamount = editor.ecell.col - editor.firstscrollingcol; - } else if (editor.ecell.col > editor.lastvisiblecol) { - hamount = editor.ecell.col - editor.lastvisiblecol; - } - } - - if (vamount != 0 || hamount != 0) { - editor.ScrollRelativeBoth(vamount, hamount); - } else { - editor.cellhandles.ShowCellHandles(true); - } - }; - - SocialCalc.ReplaceCell = function (editor, cell, row, col) { - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell( - row, - col, - cell.rowpane, - cell.colpane, - true, - null - ); - if (newelement) { - // Don't use a real element and replaceChild, which seems to have focus issues with IE, Firefox, and speed issues - cell.element.innerHTML = newelement.innerHTML; - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a] != "cssText") - cell.element.style[a] = newelement.style[a]; - } - } - }; - - SocialCalc.UpdateCellCSS = function (editor, cell, row, col) { - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell( - row, - col, - cell.rowpane, - cell.colpane, - true, - null - ); - if (newelement) { - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a] != "cssText") - cell.element.style[a] = newelement.style[a]; - } - } - }; - - SocialCalc.SetECellHeaders = function (editor, selected) { - var ecell = editor.ecell; - var context = editor.context; - - var rowpane, colpane, first, last; - var rowindex = 0; - var colindex = 0; - var headercell; - - if (!ecell) return; - - for (rowpane = 0; rowpane < context.rowpanes.length; rowpane++) { - first = context.rowpanes[rowpane].first; - last = context.rowpanes[rowpane].last; - if (ecell.row >= first && ecell.row <= last) { - headercell = - editor.fullgrid.childNodes[1].childNodes[ - 2 + rowindex + ecell.row - first - ].childNodes[0]; - if (headercell) { - if (context.classnames) - headercell.className = context.classnames[selected + "rowname"]; - if (context.explicitStyles) - headercell.style.cssText = - context.explicitStyles[selected + "rowname"]; - headercell.style.verticalAlign = "top"; // to get around Safari making top of centered row number be - // considered top of row (and can't get position in Safari) - } - } - rowindex += last - first + 1 + 1; - } - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - first = context.colpanes[colpane].first; - last = context.colpanes[colpane].last; - if (ecell.col >= first && ecell.col <= last) { - headercell = - editor.fullgrid.childNodes[1].childNodes[1].childNodes[ - 1 + colindex + ecell.col - first - ]; - if (headercell) { - if (context.classnames) - headercell.className = context.classnames[selected + "colname"]; - if (context.explicitStyles) - headercell.style.cssText = - context.explicitStyles[selected + "colname"]; - } - } - colindex += last - first + 1 + 1; - } - }; - - // - // RangeAnchor(editor, ecoord) - // - // Sets the anchor of a range to ecoord (or ecell if missing). - // - - SocialCalc.RangeAnchor = function (editor, ecoord) { - if (editor.range.hasrange) { - editor.RangeRemove(); - } - - editor.RangeExtend(ecoord); - }; - - // - // RangeExtend(editor, ecoord) - // - // Sets the other corner of the range to ecoord or, if missing, ecell. - // - - SocialCalc.RangeExtend = function (editor, ecoord) { - var a, cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - var ecell; - if (ecoord) { - ecell = SocialCalc.coordToCr(ecoord); - ecell.coord = ecoord; - } else ecell = editor.ecell; - - if (!ecell) return; // just in case - if (SocialCalc.Constants.SCNoRanging) return; - - if (!range.hasrange) { - // called without RangeAnchor... - range.anchorcoord = ecell.coord; - range.anchorrow = ecell.row; - range.top = ecell.row; - range.bottom = ecell.row; - range.anchorcol = ecell.col; - range.left = ecell.col; - range.right = ecell.col; - range.hasrange = true; - } - - if (range.anchorrow < ecell.row) { - range.top = range.anchorrow; - range.bottom = ecell.row; - } else { - range.top = ecell.row; - range.bottom = range.anchorrow; - } - if (range.anchorcol < ecell.col) { - range.left = range.anchorcol; - range.right = ecell.col; - } else { - range.left = ecell.col; - range.right = range.anchorcol; - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - highlights[coord] = "unrange"; - break; - case "range2": - highlights[coord] = "unrange2"; - break; - } - } - - for (row = range.top; row <= range.bottom; row++) { - for (col = range.left; col <= range.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange": - highlights[coord] = "range"; - break; - case "cursor": - break; - case "unrange2": - default: - highlights[coord] = "newrange"; - break; - } - } - } - - for (row = range2.top; range2.hasrange && row <= range2.bottom; row++) { - for (col = range2.left; col <= range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange2": - highlights[coord] = "range2"; - break; - case "range": - case "newrange": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "unrange": - delete highlights[coord]; - break; - case "newrange": - highlights[coord] = "range"; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "range": - case "range2": - case "cursor": - continue; - } - - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - for (f in editor.RangeChangeCallback) { - // let others know - editor.RangeChangeCallback[f](editor); - } - - // create range/coord string and do status callback - - coord = SocialCalc.crToCoord(editor.range.left, editor.range.top); - if ( - editor.range.left != editor.range.right || - editor.range.top != editor.range.bottom - ) { - // more than one cell - coord += - ":" + SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "rangechange", - coord, - editor.StatusCallback[f].params - ); - } - - return; - }; - - // - // RangeRemove(editor) - // - // Turns off the range. - // - - SocialCalc.RangeRemove = function (editor) { - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - if (!range.hasrange && !range2.hasrange) return; - - for (row = range2.top; range2.hasrange && row <= range2.bottom; row++) { - for (col = range2.left; col <= range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "range": - highlights[coord] = "newrange2"; - break; - case "range2": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - delete highlights[coord]; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range.hasrange = false; - - for (f in editor.RangeChangeCallback) { - // let others know - editor.RangeChangeCallback[f](editor); - } - - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func( - editor, - "rangechange", - "", - editor.StatusCallback[f].params - ); - } - - return; - }; - - // - // Range2Remove(editor) - // - // Turns off the range2. - // - - SocialCalc.Range2Remove = function (editor) { - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range2 = editor.range2; - - if (!range2.hasrange) return; - - for (coord in highlights) { - switch (highlights[coord]) { - case "range2": - delete highlights[coord]; - break; - case "range": - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range2.hasrange = false; - - return; - }; - - // - // FitToEditTable(editor) - // - // Figure out (through column width declarations and approximation of pixels per row) - // how many rendered rows and columns you need to be at least a little larger than - // the editor's editing area. - // - - SocialCalc.FitToEditTable = function (editor) { - var colnum, colname, colwidth, totalwidth, totalrows, rowpane, needed; - - var context = editor.context; - var sheetobj = context.sheetobj; - var sheetcolattribs = sheetobj.colattribs; - - // Calculate column width data - - totalwidth = context.showRCHeaders ? context.rownamewidth - 0 : 0; - for (var colpane = 0; colpane < context.colpanes.length - 1; colpane++) { - // Get width of all but last pane - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - colname = SocialCalc.rcColname(colnum); - colwidth = - sheetobj.colattribs.width[colname] || - sheetobj.attribs.defaultcolwidth || - SocialCalc.Constants.defaultColWidth; - if (colwidth == "blank" || colwidth == "auto") colwidth = ""; - totalwidth += colwidth && colwidth - 0 > 0 ? colwidth - 0 : 10; - } - } - - for (colnum = context.colpanes[colpane].first; colnum <= 10000; colnum++) { - //!!! max for safety, but makes that col max!!! - colname = SocialCalc.rcColname(colnum); - colwidth = - sheetobj.colattribs.width[colname] || - sheetobj.attribs.defaultcolwidth || - SocialCalc.Constants.defaultColWidth; - if (colwidth == "blank" || colwidth == "auto") colwidth = ""; - totalwidth += colwidth && colwidth - 0 > 0 ? colwidth - 0 : 10; - if (totalwidth > editor.tablewidth) break; - } - - context.colpanes[colpane].last = colnum; - - // Calculate row height data - - totalrows = context.showRCHeaders ? 1 : 0; - for (rowpane = 0; rowpane < context.rowpanes.length - 1; rowpane++) { - // count all panes but last one - totalrows += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 1; - } - - needed = editor.tableheight - totalrows * context.pixelsPerRow; // estimate amount needed - - context.rowpanes[rowpane].last = - context.rowpanes[rowpane].first + - Math.floor(needed / context.pixelsPerRow) + - 1; - }; - - // - // CalculateEditorPositions(editor) - // - // Calculate the screen positions and other values of various editing elements - // These values change and need to be recomputed when the pane first/last or cell contents change, - // as well as new column widths, etc. - // - // Note: Only call this after the grid has been rendered! You may have to wait for a timeout... - // - - SocialCalc.CalculateEditorPositions = function (editor) { - var rowpane, colpane, i; - - editor.gridposition = SocialCalc.GetElementPosition(editor.griddiv); - editor.headposition = SocialCalc.GetElementPosition( - editor.griddiv.firstChild.lastChild.childNodes[2].childNodes[1] - ); // 3rd tr 2nd td - - editor.rowpositions = []; - for (rowpane = 0; rowpane < editor.context.rowpanes.length; rowpane++) { - editor.CalculateRowPositions( - rowpane, - editor.rowpositions, - editor.rowheight - ); - } - for (i = 0; i < editor.rowpositions.length; i++) { - if (editor.rowpositions[i] > editor.gridposition.top + editor.tableheight) - break; - } - editor.lastvisiblerow = i - 1; - - editor.colpositions = []; - for (colpane = 0; colpane < editor.context.colpanes.length; colpane++) { - editor.CalculateColPositions( - colpane, - editor.colpositions, - editor.colwidth - ); - } - for (i = 0; i < editor.colpositions.length; i++) { - if (editor.colpositions[i] > editor.gridposition.left + editor.tablewidth) - break; - } - editor.lastvisiblecol = i - 1; - - editor.firstscrollingrow = - editor.context.rowpanes[editor.context.rowpanes.length - 1].first; - editor.firstscrollingrowtop = - editor.rowpositions[editor.firstscrollingrow] || editor.headposition.top; - editor.lastnonscrollingrow = - editor.context.rowpanes.length - 1 > 0 - ? editor.context.rowpanes[editor.context.rowpanes.length - 2].last - : 0; - editor.firstscrollingcol = - editor.context.colpanes[editor.context.colpanes.length - 1].first; - editor.firstscrollingcolleft = - editor.colpositions[editor.firstscrollingcol] || editor.headposition.left; - editor.lastnonscrollingcol = - editor.context.colpanes.length - 1 > 0 - ? editor.context.colpanes[editor.context.colpanes.length - 2].last - : 0; - - // Now do the table controls - - editor.verticaltablecontrol.ComputeTableControlPositions(); - editor.horizontaltablecontrol.ComputeTableControlPositions(); - }; - - // - // ScheduleRender(editor) - // - // Do a series of timeouts to render the sheet, wait for background layout and - // rendering by the browser, and then update editor visuals, sliders, etc. - // - - SocialCalc.ScheduleRender = function (editor) { - if (editor.timeout) window.clearTimeout(editor.timeout); // in case called more than once, just use latest - - SocialCalc.EditorSheetStatusCallback(null, "schedrender", null, editor); - SocialCalc.EditorStepInfo.editor = editor; - editor.timeout = window.setTimeout(SocialCalc.DoRenderStep, 1); - }; - - // DoRenderStep() - // - - SocialCalc.DoRenderStep = function () { - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - editor.EditorRenderSheet(); - - SocialCalc.EditorSheetStatusCallback(null, "renderdone", null, editor); - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - }; - - // - // SocialCalc.SchedulePositionCalculations(editor) - // - - SocialCalc.SchedulePositionCalculations = function (editor) { - SocialCalc.EditorStepInfo.editor = editor; - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - }; - - // DoPositionCalculations(editor) - // - // Update editor visuals, sliders, etc. - // - // Note: Only call this after the DOM objects have been modified and rendered! - // - - SocialCalc.DoPositionCalculations = function () { - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - var ok = false; - try { - editor.CalculateEditorPositions(); - ok = true; - } catch (e) {} - - if (!ok) { - if (typeof $ != "undefined") { - $(window).trigger("resize"); - setTimeout(SocialCalc.DoPositionCalculations, 400); - } - return; /* Workaround IE6 partial-initialized-DOM bug */ - } - - editor.verticaltablecontrol.PositionTableControlElements(); - editor.horizontaltablecontrol.PositionTableControlElements(); - - SocialCalc.EditorSheetStatusCallback(null, "doneposcalc", null, editor); - - if (editor.ensureecell && editor.ecell && !editor.deferredCommands.length) { - // don't do if deferred cmd to execute - editor.ensureecell = false; - editor.EnsureECellVisible(); // this could cause another redisplay - } - - editor.cellhandles.ShowCellHandles(true); - - //!!! Need to now check to see if this positioned controls out of the editing area - //!!! (such as when there is a large wrapped cell and it pushes the pane boundary too far down). - - if (SocialCalc.Callbacks.broadcast) - SocialCalc.Callbacks.broadcast("ask.ecell"); - }; - - SocialCalc.CalculateRowPositions = function ( - editor, - panenum, - positions, - sizes - ) { - var toprow, rowpane, rownum, offset, trowobj, cellposition; - - var context = editor.context; - var sheetobj = context.sheetobj; - - var tbodyobj; - - if (!context.showRCHeaders) throw "Needs showRCHeaders=true"; - - tbodyobj = editor.fullgrid.lastChild; - - // Calculate start of this pane as row in this table: - - toprow = 2; - for (rowpane = 0; rowpane < panenum; rowpane++) { - toprow += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 2; // skip pane and spacing row - } - - offset = 0; - for ( - rownum = context.rowpanes[rowpane].first; - rownum <= context.rowpanes[rowpane].last; - rownum++ - ) { - trowobj = tbodyobj.childNodes[toprow + offset]; - offset++; - cellposition = SocialCalc.GetElementPosition(trowobj.firstChild); - - // Safari has problem: If a cell in the row is high, cell 1 is centered and it returns top of centered part - // but if you get position of row element, it always returns the same value (not the row's) - // So we require row number to be vertical aligned to top - - if (!positions[rownum]) { - positions[rownum] = cellposition.top; // first one takes precedence - sizes[rownum] = trowobj.firstChild.offsetHeight; - } - } - - return; - }; - - SocialCalc.CalculateColPositions = function ( - editor, - panenum, - positions, - sizes - ) { - var leftcol, colpane, colnum, offset, trowobj, cellposition; - - var context = editor.context; - var sheetobj = context.sheetobj; - - var tbodyobj; - - if (!context.showRCHeaders) throw "Needs showRCHeaders=true"; - - tbodyobj = editor.fullgrid.lastChild; - - // Calculate start of this pane as column in this table: - - leftcol = 1; - for (colpane = 0; colpane < panenum; colpane++) { - leftcol += - context.colpanes[colpane].last - context.colpanes[colpane].first + 2; // skip pane and spacing col - } - - trowobj = tbodyobj.childNodes[1]; // get heading row, which has all columns - offset = 0; - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - cellposition = SocialCalc.GetElementPosition( - trowobj.childNodes[leftcol + offset] - ); - if (!positions[colnum]) { - positions[colnum] = cellposition.left; // first one takes precedence - if (trowobj.childNodes[leftcol + offset]) { - sizes[colnum] = trowobj.childNodes[leftcol + offset].offsetWidth; - } - } - offset++; - } - - return; - }; - - // ScrollRelative(editor, vertical, amount) - // - // If vertical true, scrolls up(-)/down(+), else left(-)/right(+) - - SocialCalc.ScrollRelative = function (editor, vertical, amount) { - if (vertical) { - editor.ScrollRelativeBoth(amount, 0); - } else { - editor.ScrollRelativeBoth(0, amount); - } - return; - }; - - // ScrollRelativeBoth(editor, vamount, hamount) - // - // Does both with one render - - SocialCalc.ScrollRelativeBoth = function (editor, vamount, hamount) { - var context = editor.context; - - var vplen = context.rowpanes.length; - var vlimit = vplen > 1 ? context.rowpanes[vplen - 2].last + 1 : 1; // don't scroll past here - if (context.rowpanes[vplen - 1].first + vamount < vlimit) { - // limit amount - vamount = -context.rowpanes[vplen - 1].first + vlimit; - } - - var hplen = context.colpanes.length; - var hlimit = hplen > 1 ? context.colpanes[hplen - 2].last + 1 : 1; // don't scroll past here - - if (context.colpanes[hplen - 1].first + hamount < hlimit) { - // limit amount - hamount = -context.colpanes[hplen - 1].first + hlimit; - } - - if ( - SocialCalc.IsScrollPossible && - !SocialCalc.IsScrollPossible( - editor.context.sheetobj.attribs.lastrow, - editor.context.sheetobj.attribs.lastcol, - context.rowpanes[vplen - 1].first, - context.colpanes[hplen - 1].first, - vamount, - hamount - ) - ) { - return; - } - - if ((vamount == 1 || vamount == -1) && hamount == 0) { - // special case quick scrolls - if (vamount == 1) { - editor.ScrollTableUpOneRow(); - } else { - editor.ScrollTableDownOneRow(); - } - if (editor.ecell) editor.SetECellHeaders("selected"); - editor.SchedulePositionCalculations(); - return; - } - - // Do a gross move and render - - if (vamount != 0 || hamount != 0) { - context.rowpanes[vplen - 1].first += vamount; - context.rowpanes[vplen - 1].last += vamount; - context.colpanes[hplen - 1].first += hamount; - context.colpanes[hplen - 1].last += hamount; - editor.FitToEditTable(); - editor.ScheduleRender(); - } - }; - - // PageRelative(editor, vertical, direction) - // - // If vertical true, pages up(direction is -)/down(+), else left(-)/right(+) - - SocialCalc.PageRelative = function (editor, vertical, direction) { - var context = editor.context; - var panes = vertical ? "rowpanes" : "colpanes"; - var lastpane = context[panes][context[panes].length - 1]; - var lastvisible = vertical ? "lastvisiblerow" : "lastvisiblecol"; - var sizearray = vertical ? editor.rowheight : editor.colwidth; - var defaultsize = vertical - ? SocialCalc.Constants.defaultAssumedRowHeight - : SocialCalc.Constants.defaultColWidth; - var size, newfirst, totalsize, current; - - if (direction > 0) { - // down/right - newfirst = editor[lastvisible]; - if (newfirst == lastpane.first) newfirst += 1; // move at least one - } else { - if (vertical) { - // calculate amount to scroll - totalsize = - editor.tableheight - - (editor.firstscrollingrowtop - editor.gridposition.top); - } else { - totalsize = - editor.tablewidth - - (editor.firstscrollingcolleft - editor.gridposition.left); - } - totalsize -= - sizearray[editor[lastvisible]] > 0 - ? sizearray[editor[lastvisible]] - : defaultsize; - - for (newfirst = lastpane.first - 1; newfirst > 0; newfirst--) { - size = sizearray[newfirst] > 0 ? sizearray[newfirst] : defaultsize; - if (totalsize < size) break; - totalsize -= size; - } - - current = lastpane.first; - if (newfirst >= current) newfirst = current - 1; // move at least 1 - if (newfirst < 1) newfirst = 1; - } - - lastpane.first = newfirst; - lastpane.last = newfirst + 1; - editor.LimitLastPanes(); - editor.FitToEditTable(); - editor.ScheduleRender(); - }; - - // LimitLastPanes(editor) - // - // Makes sure that the "first" of the last panes isn't before the last of the previous pane - // - - SocialCalc.LimitLastPanes = function (editor) { - var context = editor.context; - var plen; - - plen = context.rowpanes.length; - if ( - plen > 1 && - context.rowpanes[plen - 1].first <= context.rowpanes[plen - 2].last - ) - context.rowpanes[plen - 1].first = context.rowpanes[plen - 2].last + 1; - - plen = context.colpanes.length; - if ( - plen > 1 && - context.colpanes[plen - 1].first <= context.colpanes[plen - 2].last - ) - context.colpanes[plen - 1].first = context.colpanes[plen - 2].last + 1; - }; - - SocialCalc.ScrollTableUpOneRow = function (editor) { - var toprow, - rowpane, - rownum, - colnum, - colpane, - cell, - oldrownum, - maxspan, - newbottomrow, - newrow, - oldchild, - bottomrownum; - var rowneedsrefresh = {}; - - var context = editor.context; - var sheetobj = context.sheetobj; - var tableobj = editor.fullgrid; - - var tbodyobj; - - tbodyobj = tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane = 0; rowpane < context.rowpanes.length - 1; rowpane++) { - toprow += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 2; // skip pane and spacing row - } - - tbodyobj.removeChild(tbodyobj.childNodes[toprow]); - - context.rowpanes[rowpane].first++; - context.rowpanes[rowpane].last++; - editor.FitToEditTable(); - context.CalculateColWidthData(); // Just in case, since normally done in RenderSheet - - newbottomrow = context.RenderRow(context.rowpanes[rowpane].last, rowpane); - tbodyobj.appendChild(newbottomrow); - - // if scrolled off a row with starting rowspans, replace rows for the largest rowspan - - var maxrowspan = 1; - oldrownum = context.rowpanes[rowpane].first - 1; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - var coord = SocialCalc.crToCoord(colnum, oldrownum); - if (context.cellskip[coord]) continue; - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > maxrowspan) maxrowspan = cell.rowspan; - } - } - - if (maxrowspan > 1) { - for (rownum = 1; rownum < maxrowspan; rownum++) { - if (rownum + oldrownum >= context.rowpanes[rowpane].last) break; - newrow = context.RenderRow(rownum + oldrownum, rowpane); - oldchild = tbodyobj.childNodes[toprow + rownum - 1]; - tbodyobj.replaceChild(newrow, oldchild); - } - } - - // if added a row that includes rowspans from above, update the size of those to include new row - - bottomrownum = context.rowpanes[rowpane].last; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - coord = context.cellskip[SocialCalc.crToCoord(colnum, bottomrownum)]; - if (!coord) continue; // only look at spanned cells - rownum = context.coordToCR[coord].row - 0; - if ( - rownum == context.rowpanes[rowpane].last || - rownum < context.rowpanes[rowpane].first - ) - continue; // this row (colspan) or starts above pane - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > 1) rowneedsrefresh[rownum] = true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow = context.RenderRow(rownum, rowpane); - oldchild = - tbodyobj.childNodes[ - toprow + (rownum - context.rowpanes[rowpane].first) - ]; - tbodyobj.replaceChild(newrow, oldchild); - } - - return tableobj; - }; - - SocialCalc.ScrollTableDownOneRow = function (editor) { - var toprow, - rowpane, - rownum, - colnum, - colpane, - cell, - newrownum, - maxspan, - newbottomrow, - newrow, - oldchild, - bottomrownum, - maxrowspan, - coord; - var rowneedsrefresh = {}; - - var context = editor.context; - var sheetobj = context.sheetobj; - var tableobj = editor.fullgrid; - - var tbodyobj; - - tbodyobj = tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane = 0; rowpane < context.rowpanes.length - 1; rowpane++) { - toprow += - context.rowpanes[rowpane].last - context.rowpanes[rowpane].first + 2; // skip pane and spacing row - } - - tbodyobj.removeChild( - tbodyobj.childNodes[ - toprow + - (context.rowpanes[rowpane].last - context.rowpanes[rowpane].first) - ] - ); - - context.rowpanes[rowpane].first--; - context.rowpanes[rowpane].last--; - editor.FitToEditTable(); - context.CalculateColWidthData(); // Just in case, since normally done in RenderSheet - - newrow = context.RenderRow(context.rowpanes[rowpane].first, rowpane); - tbodyobj.insertBefore(newrow, tbodyobj.childNodes[toprow]); - - // if inserted a row with starting rowspans, replace rows for the largest rowspan - - maxrowspan = 1; - newrownum = context.rowpanes[rowpane].first; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - coord = SocialCalc.crToCoord(colnum, newrownum); - if (context.cellskip[coord]) continue; - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > maxrowspan) maxrowspan = cell.rowspan; - } - } - - if (maxrowspan > 1) { - for (rownum = 1; rownum < maxrowspan; rownum++) { - if (rownum + newrownum > context.rowpanes[rowpane].last) break; - newrow = context.RenderRow(rownum + newrownum, rowpane); - oldchild = tbodyobj.childNodes[toprow + rownum]; - tbodyobj.replaceChild(newrow, oldchild); - } - } - - // if last row now includes rowspans or rowspans from above, update the size of those to remove deleted row - - bottomrownum = context.rowpanes[rowpane].last; - - for (colpane = 0; colpane < context.colpanes.length; colpane++) { - for ( - colnum = context.colpanes[colpane].first; - colnum <= context.colpanes[colpane].last; - colnum++ - ) { - coord = SocialCalc.crToCoord(colnum, bottomrownum); - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > 1) { - rowneedsrefresh[bottomrownum] = true; // need to update this row - continue; - } - coord = context.cellskip[SocialCalc.crToCoord(colnum, bottomrownum)]; - if (!coord) continue; // only look at spanned cells - rownum = context.coordToCR[coord].row - 0; - if (rownum == bottomrownum || rownum < context.rowpanes[rowpane].first) - continue; // this row (colspan) or starts above pane - cell = sheetobj.cells[coord]; - if (cell && cell.rowspan > 1) rowneedsrefresh[rownum] = true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow = context.RenderRow(rownum, rowpane); - oldchild = - tbodyobj.childNodes[ - toprow + (rownum - context.rowpanes[rowpane].first) - ]; - tbodyobj.replaceChild(newrow, oldchild); - } - - return tableobj; - }; - - // ************************************* - // - // InputBox class: - // - // This class deals with the text box for editing cell contents. - // It mainly controls a user input box for typed content and is used to interact with - // the keyboard code, etc. - // - // You can use this inside a formula bar control of some sort. - // You create this after you have created a table editor object (but not necessarily - // done the CreateTableEditor method). - // - // When the user starts typing text, or double-clicks on a cell, this object - // comes into play. - // - // The element given when this is first constructed should be an input HTMLElement or - // something that acts like one. Check the code here to see what is done to it. - // - // ************************************* - - SocialCalc.InputBox = function (element, editor) { - if (!element) return; // invoked without enough data to work - - this.element = element; // the input element associated with this InputBox - this.editor = editor; // the TableEditor this belongs to - this.inputEcho = null; - - editor.inputBox = this; - - element.onmousedown = SocialCalc.InputBoxOnMouseDown; - - editor.MoveECellCallback.formulabar = function (e) { - if (e.state != "start") { - return; - } // if not in normal keyboard mode don't replace formula bar - editor.inputBox.DisplayCellContents(e.ecell.coord); - }; - }; - - // Methods: - - SocialCalc.InputBox.prototype.DisplayCellContents = function (coord) { - SocialCalc.InputBoxDisplayCellContents(this, coord); - }; - SocialCalc.InputBox.prototype.ShowInputBox = function (show) { - this.editor.inputEcho.ShowInputEcho(show); - }; - SocialCalc.InputBox.prototype.GetText = function () { - return this.element.value; - }; - SocialCalc.InputBox.prototype.SetText = function (newtext) { - if (!this.element) return; - this.element.value = newtext; - - if (!SocialCalc.Constants.SCNoInputEcho) { - this.editor.inputEcho.SetText(newtext + "_"); - } - }; - SocialCalc.InputBox.prototype.Focus = function () { - SocialCalc.InputBoxFocus(this); - }; - SocialCalc.InputBox.prototype.Blur = function () { - return this.element.blur(); - }; - SocialCalc.InputBox.prototype.Select = function (t) { - if (!this.element) return; - switch (t) { - case "end": - if (document.selection && document.selection.createRange) { - /* IE 4+ - Safer than setting .selectionEnd as it also works for Textareas. */ - var range = document.selection.createRange().duplicate(); - range.moveToElementText(this.element); - range.collapse(false); - range.select(); - } else if (this.element.selectionStart != undefined) { - this.element.selectionStart = this.element.value.length; - this.element.selectionEnd = this.element.value.length; - } - break; - } - }; - - // Functions: - - // - // SocialCalc.InputBoxDisplayCellContents(inputbox, coord) - // - // Sets input box to the contents of the specified cell (or ecell if null). - // - var CoordForColorChange; - var editCoord; - SocialCalc.InputBoxDisplayCellContents = function (inputbox, coord) { - var scc = SocialCalc.Constants; - var cell, position; - - if (!inputbox) return; - - //changes for prompt - if (!coord) { - coord = inputbox.editor.ecell.coord; - } - var text = SocialCalc.GetCellContents( - inputbox.editor.context.sheetobj, - coord - ); - if (text.indexOf("\n") != -1) { - //text = scc.s_inputboxdisplaymultilinetext; - text = scc.s_inputboxdisplaynoteditable; - inputbox.element.disabled = true; - SocialCalc.ToggleInputLineButtons(false); - } else if (!SocialCalc.Callbacks.IsCellEditable(inputbox.editor)) { - text = scc.s_inputboxdisplaynoteditable; - SocialCalc.ToggleInputLineButtons(false); - inputbox.element.disabled = true; - inputbox.element.style.display = "none"; - } else { - CoordForColorChange = coord; - editCoord = coord; - - //changes for prompt - - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - cell = SocialCalc.GetEditorCellElement( - inputbox.editor, - inputbox.editor.ecell.row, - inputbox.editor.ecell.col - ); - var left = "100px"; - var top = "100px"; - var width = 100; - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - left = position.left - 2 + "px"; - top = position.top - 7 + "px"; - width = cell.element.offsetWidth; - } - if (!cell || width == 0) { - //scrolled off screen - SocialCalc.ToggleInputLineButtons(false); - inputbox.element.disabled = true; - inputbox.element.style.display = "none"; - // do nothing - return; - } - var ele = document.getElementById(spreadsheet.formulabarDiv.id); - if (ele) { - spreadsheet.spreadsheetDiv.removeChild(spreadsheet.formulabarDiv); - } - spreadsheet.formulabarDiv.style.left = left; - spreadsheet.formulabarDiv.style.top = top; - //spreadsheet.formulabarDiv.style.width = "30px"; - //spreadsheet.formulabarDiv.style.fontSize = "10px"; - spreadsheet.formulabarDiv.style.zIndex = 100; - spreadsheet.formulabarDiv.style.position = "absolute"; - var input = spreadsheet.formulabarDiv.firstChild; - //changes for prompt - - input.style.fontSize = "100%"; - input.style.backgroundColor = "transparent"; - - input.style.borderBottomColor = "#306eff"; - input.style.borderBottomLeftRadius = "3px"; - input.style.borderBottomRightRadius = "3px"; - input.style.borderBottomStyle = "solid"; - input.style.borderBottomWidth = "2px"; - input.style.borderLeftColor = "#306eff"; - input.style.borderLeftStyle = "solid"; - input.style.borderLeftWidth = "2px"; - input.style.borderRightColor = "#306eff"; - input.style.borderRightStyle = "solid"; - input.style.borderRightWidth = "2px"; - input.style.borderTopColor = "#306eff"; - input.style.borderTopLeftRadius = "3px"; - input.style.borderTopRightRadius = "3px"; - input.style.borderTopStyle = "solid"; - input.style.borderTopWidth = "2px"; - - //console.log("cell width ="+width) - //changes for prompt - - input.size = "" + width / 8; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - - inputbox.element.disabled = false; - inputbox.element.style.display = "inline"; - SocialCalc.ToggleInputLineButtons(true); - } - if (scc.SCNoQuoteInInputBox && text.substring(0, 1) == "'") { - text = text.substring(1); - } - inputbox.SetText(text); - // autoSave(selectedFile); - }; - - // - // SocialCalc.InputBoxFocus(inputbox) - // - // Call this to have the input box get the focus and respond to keystrokes - // but still pass them off to SocialCalc.ProcessKey. - // - - SocialCalc.InputBoxFocus = function (inputbox) { - if (!inputbox) return; - inputbox.element.focus(); - var editor = inputbox.editor; - editor.state = "input"; - var wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - }; - - // - // SocialCalc.InputBoxOnMouseDown(e) - // - // This is called when the input box gets the focus. It then responds to keystrokes - // and pass them off to SocialCalc.ProcessKey, but in a different editing state. - // - - SocialCalc.InputBoxOnMouseDown = function (e) { - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var wval = editor.workingvalues; - - switch (editor.state) { - case "start": - editor.state = "inputboxdirect"; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.inputEcho.ShowInputEcho(true); - break; - - case "input": - wval.partialexpr = ""; // make sure not pointing - editor.MoveECell(wval.ecoord); - editor.state = "inputboxdirect"; - SocialCalc.KeyboardFocus(); // may have come here from outside of grid - break; - - case "inputboxdirect": - break; - } - }; - - // ************************************* - // - // InputEcho class: - // - // This object creates and controls an element that echos what's in the InputBox during editing - // It is draggable. - // - // ************************************* - - SocialCalc.InputEcho = function (editor) { - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - this.text = ""; // current value of what is displayed - this.interval = null; // timer handle - - this.container = null; // element containing main echo as well as prompt line - this.main = null; // main echo area - this.prompt = null; - - this.functionbox = null; // function chooser dialog - - this.container = document.createElement("div"); - SocialCalc.setStyles( - this.container, - "display:none;position:absolute;zIndex:10;" - ); - - this.topprompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) - this.topprompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) - SocialCalc.setStyles(this.topprompt, scc.defaultInputEchoPromptStyle); - this.topprompt.innerHTML = ""; - - this.container.appendChild(this.topprompt); - - this.main = document.createElement("div"); - - if (scc.defaultInputEchoClass) - this.main.className = scc.defaultInputEchoClass; - if (scc.defaultInputEchoStyle) - SocialCalc.setStyles(this.main, scc.defaultInputEchoStyle); - - this.main.innerHTML = " "; - - this.container.appendChild(this.main); - - this.prompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) - this.prompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) - SocialCalc.setStyles(this.prompt, scc.defaultInputEchoPromptStyle); - this.prompt.innerHTML = ""; - - this.container.appendChild(this.prompt); - - SocialCalc.DragRegister(this.main, true, true, { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: this.container, - }); - - editor.toplevel.appendChild(this.container); - }; - - // Methods: - - SocialCalc.InputEcho.prototype.ShowInputEcho = function (show) { - return SocialCalc.ShowInputEcho(this, show); - }; - SocialCalc.InputEcho.prototype.SetText = function (str) { - return SocialCalc.SetInputEchoText(this, str); - }; - - // Functions: - - SocialCalc.ShowInputEcho = function (inputecho, show) { - var cell, position; - var editor = inputecho.editor; - - if (!editor) return; - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - if (show) { - editor.cellhandles.ShowCellHandles(false); - cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - inputecho.container.style.left = position.left - 1 + "px"; - inputecho.container.style.top = position.top - 1 + "px"; - } - inputecho.container.style.display = "block"; - if (inputecho.interval) window.clearInterval(inputecho.interval); // just in case - inputecho.interval = window.setInterval( - SocialCalc.InputEchoHeartbeat, - 50 - ); - } else { - if (inputecho.interval) window.clearInterval(inputecho.interval); - inputecho.container.style.display = "none"; - inputecho.topprompt.innerHTML = ""; - } - }; - - SocialCalc.SetInputEchoText = function (inputecho, str) { - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - var scc = SocialCalc.Constants; - var fname, fstr; - var newstr = SocialCalc.special_chars(str); - newstr = newstr.replace(/\n/g, "
    "); - - if (inputecho.text != newstr) { - inputecho.main.innerHTML = newstr; - inputecho.text = newstr; - } - - var parts = str.match( - /.*[\+\-\*\/\&\^\<\>\=\,\(]([A-Za-z][A-ZA-z]\w*?)\([^\)]*$/ - ); - if (str.charAt(0) == "=" && parts) { - fname = parts[1].toUpperCase(); - if (SocialCalc.Formula.FunctionList[fname]) { - SocialCalc.Formula.FillFunctionInfo(); // make sure filled - fstr = SocialCalc.special_chars( - fname + "(" + SocialCalc.Formula.FunctionArgString(fname) + ")" - ); - } else { - fstr = scc.ietUnknownFunction + fname; - } - if (inputecho.prompt.innerHTML != fstr) { - inputecho.prompt.innerHTML = fstr; - inputecho.prompt.style.display = "block"; - } - } else if (inputecho.prompt.style.display != "none") { - inputecho.prompt.innerHTML = ""; - inputecho.prompt.style.display = "none"; - } - - var editor = inputecho.editor; - - if (editor.workingvalues.currentsheet != editor.workingvalues.startsheet) { - var promptstr = - "Editing:" + - editor.workingvalues.startsheet + - "!" + - editor.workingvalues.ecoord; - if (promptstr != inputecho.topprompt.innerHTML) { - inputecho.topprompt.innerHTML = - "Editing:" + - editor.workingvalues.startsheet + - "!" + - editor.workingvalues.ecoord; - inputecho.topprompt.style.display = "block"; - } - } else { - if (inputecho.topprompt.style.display != "none") { - inputecho.topprompt.innerHTML = ""; - inputecho.topprompt.style.display = "none"; - } - } - }; - - SocialCalc.InputEchoHeartbeat = function () { - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - if (editor.state == "inputboxdirect") { - editor.inputEcho.SetText(editor.inputBox.GetText() + "_"); - } - }; - - SocialCalc.InputEchoMouseDown = function (e) { - var event = e || window.event; - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - // if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - // else event.cancelBubble = true; // IE 5+ - // if (event.preventDefault) event.preventDefault(); // DOM Level 2 - // else event.returnValue = false; // IE 5+ - - editor.inputBox.element.focus(); - - // return false; - }; - - // ************************************* - // - // CellHandles class: - // - // This object creates and controls the elements around the cursor cell for dragging, etc. - // - // ************************************* - - SocialCalc.CellHandles = function (editor) { - var scc = SocialCalc.Constants; - var functions; - - if (editor.noEdit) return; // leave us with nothing - if (scc.SCCellHandlesDisable) return; - - this.editor = editor; // the TableEditor this belongs to - - this.noCursorSuffix = false; - - this.movedmouse = false; // used to detect no-op - - this.draghandle = document.createElement("div"); - SocialCalc.setStyles( - this.draghandle, - "display:none;position:absolute;zIndex:8;border:1px solid white;width:4px;height:4px;fontSize:1px;backgroundColor:#0E93D8;cursor:default;" - ); - this.draghandle.innerHTML = " "; - editor.toplevel.appendChild(this.draghandle); - SocialCalc.AssignID(editor, this.draghandle, "draghandle"); - - var imagetype = "png"; - if (navigator.userAgent.match(/MSIE 6\.0/)) { - imagetype = "gif"; - } - - this.dragpalette = document.createElement("div"); - SocialCalc.setStyles( - this.dragpalette, - "display:none;position:absolute;zIndex:8;width:90px;height:90px;fontSize:1px;textAlign:center;cursor:default;" + - "backgroundImage:url(" + - SocialCalc.Constants.defaultImagePrefix + - "drag-handles." + - imagetype + - ");" - ); - this.dragpalette.innerHTML = " "; - editor.toplevel.appendChild(this.dragpalette); - SocialCalc.AssignID(editor, this.dragpalette, "dragpalette"); - - this.dragtooltip = document.createElement("div"); - SocialCalc.setStyles( - this.dragtooltip, - "display:none;position:absolute;zIndex:9;border:1px solid black;width:100px;height:auto;fontSize:10px;backgroundColor:#FFFFFF;" - ); - this.dragtooltip.innerHTML = " "; - editor.toplevel.appendChild(this.dragtooltip); - SocialCalc.AssignID(editor, this.dragtooltip, "dragtooltip"); - - this.fillinghandle = document.createElement("div"); - SocialCalc.setStyles( - this.fillinghandle, - "display:none;position:absolute;zIndex:9;border:1px solid black;width:auto;height:14px;fontSize:10px;backgroundColor:#FFFFFF;" - ); - this.fillinghandle.innerHTML = " "; - editor.toplevel.appendChild(this.fillinghandle); - SocialCalc.AssignID(editor, this.fillinghandle, "fillinghandle"); - - if (this.draghandle.addEventListener) { - // DOM Level 2 -- Firefox, et al - this.draghandle.addEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMoveOnHandle, - false - ); - this.dragpalette.addEventListener( - "mousedown", - SocialCalc.CellHandlesMouseDown, - false - ); - this.dragpalette.addEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMoveOnHandle, - false - ); - } else if (this.draghandle.attachEvent) { - // IE 5+ - this.draghandle.attachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMoveOnHandle - ); - this.dragpalette.attachEvent( - "onmousedown", - SocialCalc.CellHandlesMouseDown - ); - this.dragpalette.attachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMoveOnHandle - ); - } else { - // don't handle this - throw "Browser not supported"; - } - }; - - // Methods: - - SocialCalc.CellHandles.prototype.ShowCellHandles = function (show, moveshow) { - return SocialCalc.ShowCellHandles(this, show, moveshow); - }; - - // Functions: - - SocialCalc.ShowCellHandles = function (cellhandles, show, moveshow) { - var cell, cell2, position, position2; - var editor = cellhandles.editor; - var doshow = false; - var row, col, viewport; - - if (!editor) return; - - do { - // a block that can you can "break" out of easily - - if (!show) break; - - row = editor.ecell.row; - col = editor.ecell.col; - - if (editor.state != "start") break; - if (row >= editor.lastvisiblerow) break; - if (col >= editor.lastvisiblecol) break; - if (row < editor.firstscrollingrow) break; - if (col < editor.firstscrollingcol) break; - - if ( - editor.rowpositions[row + 1] + 20 > - editor.horizontaltablecontrol.controlborder - ) { - break; - } - if (editor.rowpositions[row + 1] - 10 < editor.headposition.top) { - break; - } - if ( - editor.colpositions[col + 1] + 20 > - editor.verticaltablecontrol.controlborder - ) { - break; - } - if (editor.colpositions[col + 1] - 30 < editor.headposition.left) { - break; - } - - cellhandles.draghandle.style.left = - editor.colpositions[col + 1] - 1 + "px"; - cellhandles.draghandle.style.top = - editor.rowpositions[row + 1] - 1 + "px"; - cellhandles.draghandle.style.display = "block"; - - if (moveshow) { - cellhandles.draghandle.style.display = "none"; - cellhandles.dragpalette.style.left = - editor.colpositions[col + 1] - 45 + "px"; - cellhandles.dragpalette.style.top = - editor.rowpositions[row + 1] - 45 + "px"; - cellhandles.dragpalette.style.display = "block"; - viewport = SocialCalc.GetViewportInfo(); - cellhandles.dragtooltip.style.right = - viewport.width - (editor.colpositions[col + 1] - 1) + "px"; - cellhandles.dragtooltip.style.bottom = - viewport.height - (editor.rowpositions[row + 1] - 1) + "px"; - cellhandles.dragtooltip.style.display = "none"; - } - - doshow = true; - } while (false); // only do once - - if (!doshow) { - cellhandles.draghandle.style.display = "none"; - } - if (!moveshow) { - cellhandles.dragpalette.style.display = "none"; - cellhandles.dragtooltip.style.display = "none"; - } - }; - - SocialCalc.CellHandlesMouseMoveOnHandle = function (e) { - var scc = SocialCalc.Constants; - - var event = e || window.event; - var target = event.target || event.srcElement; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (!cellhandles.editor) return true; // no handles - - if (!editor.cellhandles.mouseDown) { - editor.cellhandles.ShowCellHandles(true, true); // show move handles, too - - if (target == cellhandles.dragpalette) { - var whichhandle = SocialCalc.SegmentDivHit( - [scc.CH_radius1, scc.CH_radius2], - editor.cellhandles.dragpalette, - clientX, - clientY - ); - if (whichhandle == 0) { - // off of active part of palette - SocialCalc.CellHandlesHoverTimeout(); - return; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - cellhandles.tooltipswhichhandle = whichhandle; - cellhandles.tooltipstimer = window.setTimeout( - SocialCalc.CellHandlesTooltipsTimeout, - 700 - ); - } - - if (cellhandles.timer) { - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - cellhandles.timer = window.setTimeout( - SocialCalc.CellHandlesHoverTimeout, - 3000 - ); - } - - return; - }; - - // - // whichsegment = SocialCalc.SegmentDivHit(segtable, divWithMouseHit, x, y) - // - // Takes segtable = [upperleft quadrant, upperright, bottomright, bottomleft] - // where each quadrant is either: - // 0 = ignore hits here - // number = return this value - // array = a new segtable for this subquadrant - // - // Alternatively, segtable can be: - // [radius 1, radius 2] and it returns 0 if no hit, - // -1, -2, -3, -4 for inner quadrants, and +1...+4 for outer quadrants - // - - SocialCalc.SegmentDivHit = function (segtable, divWithMouseHit, x, y) { - var width = divWithMouseHit.offsetWidth; - var height = divWithMouseHit.offsetHeight; - var left = divWithMouseHit.offsetLeft; - var top = divWithMouseHit.offsetTop; - var v = 0; - var table = segtable; - var len = Math.sqrt( - Math.pow(x - left - (width / 2.0 - 0.5), 2) + - Math.pow(y - top - (height / 2.0 - 0.5), 2) - ); - - if (table.length == 2) { - // type 2 segtable - if ( - x >= left && - x < left + width / 2 && - y >= top && - y < top + height / 2 - ) { - // upper left - if (len <= segtable[0]) v = -1; - else if (len <= segtable[1]) v = 1; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top && - y < top + height / 2 - ) { - // upper right - if (len <= segtable[0]) v = -2; - else if (len <= segtable[1]) v = 2; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - if (len <= segtable[0]) v = -3; - else if (len <= segtable[1]) v = 3; - } - if ( - x >= left && - x < left + width / 2 && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - if (len <= segtable[0]) v = -4; - else if (len <= segtable[1]) v = 4; - } - return v; - } - - while (true) { - if ( - x >= left && - x < left + width / 2 && - y >= top && - y < top + height / 2 - ) { - // upper left - quadrant += "1"; - v = table[0]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - height = height / 2; - continue; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top && - y < top + height / 2 - ) { - // upper right - quadrant += "2"; - v = table[1]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - left = left + width; - height = height / 2; - continue; - } - if ( - x >= left + width / 2 && - x < left + width && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - quadrant += "3"; - v = table[2]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - left = left + width; - height = height / 2; - top = top + height; - continue; - } - if ( - x >= left && - x < left + width / 2 && - y >= top + height / 2 && - y < top + height - ) { - // bottom right - quadrant += "4"; - v = table[3]; - if (typeof v == "number") { - break; - } - table = v; - width = width / 2; - height = height / 2; - top = top + height; - continue; - } - return 0; // didn't match - } - - //addmsg((x-divWithMouseHit.offsetLeft)+","+(y-divWithMouseHit.offsetTop)+"="+quadrant+" "+v); - return v; - }; - - SocialCalc.CellHandlesHoverTimeout = function () { - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.timer) { - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - editor.cellhandles.ShowCellHandles(true, false); // hide move handles - }; - - SocialCalc.CellHandlesTooltipsTimeout = function () { - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - - var whichhandle = cellhandles.tooltipswhichhandle; - if (whichhandle == 0) { - // off of active part of palette - SocialCalc.CellHandlesHoverTimeout(); - return; - } - if (whichhandle == -3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillAllTooltip; - } else if (whichhandle == 3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillContentsTooltip; - } else if (whichhandle == -2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteAllTooltip; - } else if (whichhandle == -4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertAllTooltip; - } else if (whichhandle == 2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteContentsTooltip; - } else if (whichhandle == 4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertContentsTooltip; - } else { - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - return; - } - - cellhandles.dragtooltip.style.display = "block"; - }; - - SocialCalc.CellHandlesMouseDown = function (e) { - var scc = SocialCalc.Constants; - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (editor.busy) return; // don't do anything when busy (is this correct?) - - var cellhandles = editor.cellhandles; - - cellhandles.movedmouse = false; // detect no-op - - if (cellhandles.timer) { - // cancel timer - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - - range = editor.range; - - var whichhandle = SocialCalc.SegmentDivHit( - [scc.CH_radius1, scc.CH_radius2], - editor.cellhandles.dragpalette, - clientX, - clientY - ); - if (whichhandle == 1 || whichhandle == -1 || whichhandle == 0) { - cellhandles.ShowCellHandles(true, false); // hide move handles - return; - } - - mouseinfo.ignore = true; // stop other code from looking at the mouse - - if (whichhandle == -3) { - cellhandles.dragtype = "Fill"; - // mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } else if (whichhandle == 3) { - cellhandles.dragtype = "FillC"; - // mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } else if (whichhandle == -2) { - cellhandles.dragtype = "Move"; - // mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } else if (whichhandle == -4) { - cellhandles.dragtype = "MoveI"; - // mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } else if (whichhandle == 2) { - cellhandles.dragtype = "MoveC"; - // mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } else if (whichhandle == 4) { - cellhandles.dragtype = "MoveIC"; - // mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } - - cellhandles.filltype = null; - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - break; - - case "Move": - case "MoveI": - case "MoveC": - case "MoveIC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.RangeRemove(); - break; - - default: - return; // not for us - } - - cellhandles.fillinghandle.style.left = clientX + "px"; - cellhandles.fillinghandle.style.top = clientY - 17 + "px"; - cellhandles.fillinghandle.innerHTML = - scc.s_CHindicatorOperationLookup[cellhandles.dragtype] + - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - cellhandles.ShowCellHandles(true, false); // hide move handles - cellhandles.mouseDown = true; - - mouseinfo.editor = editor; // remember for later - - coord = editor.ecell.coord; // start with cell with handles - - cellhandles.startingcoord = coord; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - - mouseinfo.mouselastcoord = coord; - - SocialCalc.KeyboardSetFocus(editor); - - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMove, - true - ); // capture everywhere - document.addEventListener("mouseup", SocialCalc.CellHandlesMouseUp, true); // capture everywhere - } else if (cellhandles.draghandle.attachEvent) { - // IE 5+ - cellhandles.draghandle.setCapture(); - cellhandles.draghandle.attachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMove - ); - cellhandles.draghandle.attachEvent( - "onmouseup", - SocialCalc.CellHandlesMouseUp - ); - cellhandles.draghandle.attachEvent( - "onlosecapture", - SocialCalc.CellHandlesMouseUp - ); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.CellHandlesMouseMove = function (e) { - var scc = SocialCalc.Constants; - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - var crstart, crend, cr, c, r; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat( - editor, - result, - SocialCalc.CellHandlesDragAutoRepeat - ); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - - cellhandles.movedmouse = true; // did move, so not no-op - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (result.coord == cellhandles.startingcoord) { - // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } else { - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Down") { - // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Down"; - } else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Right"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord != mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (result.coord != mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - c = editor.range2.right - editor.range2.left + result.col; - r = editor.range2.bottom - editor.range2.top + result.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (result.coord == cellhandles.startingcoord) { - // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } else { - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Vertical") { - // coerse to that - crend.col = editor.range2.left; - if ( - crend.row >= editor.range2.top && - crend.row <= editor.range2.bottom + 1 - ) - crend.row = editor.range2.bottom + 2; - } else { - crend.row = editor.range2.top; - if ( - crend.col >= editor.range2.left && - crend.col <= editor.range2.right + 1 - ) - crend.col = editor.range2.right + 2; - } - } else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Vertical"; - } else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Horizontal"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord != mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - if (!cellhandles.filltype) { - // no fill type - editor.RangeRemove(); - } else { - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - } - break; - } - - cellhandles.fillinghandle.style.left = clientX + "px"; - cellhandles.fillinghandle.style.top = clientY - 17 + "px"; - cellhandles.fillinghandle.innerHTML = - scc.s_CHindicatorOperationLookup[cellhandles.dragtype] + - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - mouseinfo.mouselastcoord = result.coord; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - }; - - SocialCalc.CellHandlesDragAutoRepeat = function (coord, direction) { - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - var crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - var crend = SocialCalc.coordToCr(coord); - - var newcoord, c, r; - - var vscroll = 0; - var hscroll = 0; - - if (direction == "left") hscroll = -1; - else if (direction == "right") hscroll = 1; - else if (direction == "up") vscroll = -1; - else if (direction == "down") vscroll = 1; - editor.ScrollRelativeBoth(vscroll, hscroll); - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Down") { - // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord != mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (coord != mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - c = editor.range2.right - editor.range2.left + editor.ecell.col; - r = editor.range2.bottom - editor.range2.top + editor.ecell.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (cellhandles.filltype) { - // moving and have already determined filltype - if (cellhandles.filltype == "Vertical") { - // coerse to that - crend.col = editor.range2.left; - if ( - crend.row >= editor.range2.top && - crend.row <= editor.range2.bottom + 1 - ) - crend.row = editor.range2.bottom + 2; - } else { - crend.row = editor.range2.top; - if ( - crend.col >= editor.range2.left && - crend.col <= editor.range2.right + 1 - ) - crend.col = editor.range2.right + 2; - } - } else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord != mouseinfo.mouselastcoord) { - editor.MoveECell(newcoord); - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - } - - mouseinfo.mouselastcoord = newcoord; - }; - - SocialCalc.CellHandlesMouseUp = function (e) { - var editor, - element, - result, - coord, - now, - textarea, - sheetobj, - cellobj, - wval, - cstr, - cmdtype, - cmdtype2; - var crstart, crend; - var sizec, sizer, deltac, deltar; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - mouseinfo.ignore = false; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - cellhandles.mouseDown = false; - cellhandles.noCursorSuffix = false; - - cellhandles.fillinghandle.style.display = "none"; - - if (!result) result = {}; - if (!result.coord) result.coord = editor.ecell.coord; - - switch (cellhandles.dragtype) { - case "Fill": - case "Move": - case "MoveI": - cmdtype2 = " all"; - break; - case "FillC": - case "MoveC": - case "MoveIC": - cmdtype2 = " formulas"; - break; - } - - if (!cellhandles.movedmouse) { - // didn't move: just leave one cell selected - cellhandles.dragtype = "Nothing"; - } - - switch (cellhandles.dragtype) { - case "Nothing": - editor.Range2Remove(); - editor.RangeRemove(); - break; - - case "Fill": - case "FillC": - crstart = SocialCalc.coordToCr(cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - if (cellhandles.filltype) { - if (cellhandles.filltype == "Down") { - crend.col = crstart.col; - } else { - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - - editor.MoveECell(result.coord); - editor.RangeExtend(); - - if (editor.cellhandles.filltype == "Right") { - cmdtype = "right"; - } else { - cmdtype = "down"; - } - cstr = - "fill" + - cmdtype + - " " + - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom) + - cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - break; - - case "Move": - case "MoveC": - editor.context.cursorsuffix = ""; - cstr = - "movepaste " + - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + - ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) + - " " + - editor.ecell.coord + - cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - - break; - - case "MoveI": - case "MoveIC": - editor.context.cursorsuffix = ""; - sizec = editor.range2.right - editor.range2.left; - sizer = editor.range2.bottom - editor.range2.top; - deltac = editor.ecell.col - editor.range2.left; - deltar = editor.ecell.row - editor.range2.top; - cstr = - "moveinsert " + - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + - ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) + - " " + - editor.ecell.coord + - cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - editor.RangeRemove(); - if (editor.cellhandles.filltype == " Horizontal" && deltac > 0) { - editor.MoveECell( - SocialCalc.crToCoord(editor.ecell.col - sizec - 1, editor.ecell.row) - ); - } else if (editor.cellhandles.filltype == " Vertical" && deltar > 0) { - editor.MoveECell( - SocialCalc.crToCoord(editor.ecell.col, editor.ecell.row - sizer - 1) - ); - } - editor.RangeAnchor( - SocialCalc.crToCoord( - editor.ecell.col + sizec, - editor.ecell.row + sizer - ) - ); - editor.RangeExtend(); - - break; - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener( - "mousemove", - SocialCalc.CellHandlesMouseMove, - true - ); - document.removeEventListener( - "mouseup", - SocialCalc.CellHandlesMouseUp, - true - ); - } else if (cellhandles.draghandle.detachEvent) { - // IE - cellhandles.draghandle.detachEvent( - "onlosecapture", - SocialCalc.CellHandlesMouseUp - ); - cellhandles.draghandle.detachEvent( - "onmouseup", - SocialCalc.CellHandlesMouseUp - ); - cellhandles.draghandle.detachEvent( - "onmousemove", - SocialCalc.CellHandlesMouseMove - ); - cellhandles.draghandle.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - }; - - // ************************************* - // - // TableControl class: - // - // This class deals with the horizontal and verical scrollbars and pane sliders. - // - // +--------------+ - // | Endcap | - // +- - - - - - - + - // | | - // +--------------+ - // | Pane Slider | - // +--------------+ - // | | - // | Less Button | - // | | - // +--------------+ - // | Scroll Area | - // | | - // | | - // +--------------+ - // | Thumb | - // +--------------+ - // | | - // +--------------+ - // | | - // | More Button | - // | | - // +--------------+ - // - // ************************************* - - SocialCalc.TableControl = function (editor, vertical, size) { - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - - this.vertical = vertical; // true if vertical control, false if horizontal - this.size = size; // length in pixels - - this.main = null; // main element containing all the others - this.endcap = null; // the area at the top/left between the end and the pane slider - this.paneslider = null; // the slider to adjust the pane split - this.lessbutton = null; // the top/left scroll button - this.morebutton = null; // the bottom/right scroll button - this.scrollarea = null; // the area between the scroll buttons - this.thumb = null; // the sliding thing in the scrollarea - - // computed position values: - - this.controlborder = null; // left or top screen position for vertical or horizontal control - this.endcapstart = null; // top or left screen position for vertical or horizontal control - this.panesliderstart = null; - this.lessbuttonstart = null; - this.morebuttonstart = null; - this.scrollareastart = null; - this.scrollareaend = null; - this.scrollareasize = null; - this.thumbpos = null; - - // constants: - - this.controlthickness = scc.defaultTableControlThickness; // other dimension of complete control in pixels - this.sliderthickness = scc.defaultTCSliderThickness; - this.buttonthickness = scc.defaultTCButtonThickness; - this.thumbthickness = scc.defaultTCThumbThickness; - this.minscrollingpanesize = - this.buttonthickness + this.buttonthickness + this.thumbthickness + 20; // the 20 is to leave a little space - }; - - // Methods: - - SocialCalc.TableControl.prototype.CreateTableControl = function () { - return SocialCalc.CreateTableControl(this); - }; - SocialCalc.TableControl.prototype.PositionTableControlElements = function () { - SocialCalc.PositionTableControlElements(this); - }; - SocialCalc.TableControl.prototype.ComputeTableControlPositions = function () { - SocialCalc.ComputeTableControlPositions(this); - }; - - // Functions: - - SocialCalc.CreateTableControl = function (control) { - var s, functions, params; - var AssignID = SocialCalc.AssignID; - var setStyles = SocialCalc.setStyles; - var scc = SocialCalc.Constants; - var TooltipRegister = function (element, etype, vh) { - if (scc["s_" + etype + "Tooltip" + vh]) { - SocialCalc.TooltipRegister( - element, - scc["s_" + etype + "Tooltip" + vh], - null - ); - } - }; - - var imageprefix = control.editor.imageprefix; - var vh = control.vertical ? "v" : "h"; - - control.main = document.createElement("div"); - s = control.main.style; - s.height = - (control.vertical ? control.size : control.controlthickness) + "px"; - s.width = - (control.vertical ? control.controlthickness : control.size) + "px"; - s.zIndex = 0; - setStyles(control.main, scc.TCmainStyle); - s.backgroundImage = "url(" + imageprefix + "main-" + vh + ".gif)"; - if (scc.TCmainClass) control.main.className = scc.TCmainClass; - - control.main.style.display = "none"; // wait for layout - - control.endcap = document.createElement("div"); - s = control.endcap.style; - s.height = control.controlthickness + "px"; - s.width = control.controlthickness + "px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.endcap, scc.TCendcapStyle); - s.backgroundImage = "url(" + imageprefix + "endcap-" + vh + ".gif)"; - if (scc.TCendcapClass) control.endcap.className = scc.TCendcapClass; - AssignID(control.editor, control.endcap, "endcap" + vh); - - control.main.appendChild(control.endcap); - - control.paneslider = document.createElement("div"); - s = control.paneslider.style; - s.height = - (control.vertical ? control.sliderthickness : control.controlthickness) + - "px"; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.width = - (control.vertical ? control.controlthickness : control.sliderthickness) + - "px"; - s.position = "absolute"; - s[control.vertical ? "top" : "left"] = "4px"; - s.zIndex = 3; - setStyles(control.paneslider, scc.TCpanesliderStyle); - s.backgroundImage = "url(" + imageprefix + "paneslider-" + vh + ".gif)"; - if (scc.TCpanesliderClass) - control.paneslider.className = scc.TCpanesliderClass; - AssignID(control.editor, control.paneslider, "paneslider" + vh); - TooltipRegister(control.paneslider, "paneslider", vh); - - functions = { - MouseDown: SocialCalc.TCPSDragFunctionStart, - MouseMove: SocialCalc.TCPSDragFunctionMove, - MouseUp: SocialCalc.TCPSDragFunctionStop, - Disabled: function () { - return control.editor.busy; - }, - }; - - functions.control = control; // make sure this is there - - SocialCalc.DragRegister( - control.paneslider, - control.vertical, - !control.vertical, - functions - ); - - control.main.appendChild(control.paneslider); - - control.lessbutton = document.createElement("div"); - s = control.lessbutton.style; - s.height = - (control.vertical ? control.buttonthickness : control.controlthickness) + - "px"; - s.width = - (control.vertical ? control.controlthickness : control.buttonthickness) + - "px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.lessbutton, scc.TClessbuttonStyle); - s.backgroundImage = "url(" + imageprefix + "less-" + vh + "n.gif)"; - if (scc.TClessbuttonClass) - control.lessbutton.className = scc.TClessbuttonClass; - AssignID(control.editor, control.lessbutton, "lessbutton" + vh); - - params = { - repeatwait: scc.TClessbuttonRepeatWait, - repeatinterval: scc.TClessbuttonRepeatInterval, - normalstyle: - "backgroundImage:url(" + imageprefix + "less-" + vh + "n.gif);", - downstyle: - "backgroundImage:url(" + imageprefix + "less-" + vh + "d.gif);", - hoverstyle: - "backgroundImage:url(" + imageprefix + "less-" + vh + "h.gif);", - }; - functions = { - MouseDown: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, -1); - }, - Repeat: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, -1); - }, - Disabled: function () { - return control.editor.busy; - }, - }; - - SocialCalc.ButtonRegister(control.lessbutton, params, functions); - - control.main.appendChild(control.lessbutton); - - control.morebutton = document.createElement("div"); - s = control.morebutton.style; - s.height = - (control.vertical ? control.buttonthickness : control.controlthickness) + - "px"; - s.width = - (control.vertical ? control.controlthickness : control.buttonthickness) + - "px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.morebutton, scc.TCmorebuttonStyle); - s.backgroundImage = "url(" + imageprefix + "more-" + vh + "n.gif)"; - if (scc.TCmorebuttonClass) - control.morebutton.className = scc.TCmorebuttonClass; - AssignID(control.editor, control.morebutton, "morebutton" + vh); - - params = { - repeatwait: scc.TCmorebuttonRepeatWait, - repeatinterval: scc.TCmorebuttonRepeatInterval, - normalstyle: - "backgroundImage:url(" + imageprefix + "more-" + vh + "n.gif);", - downstyle: - "backgroundImage:url(" + imageprefix + "more-" + vh + "d.gif);", - hoverstyle: - "backgroundImage:url(" + imageprefix + "more-" + vh + "h.gif);", - }; - functions = { - MouseDown: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, +1); - }, - Repeat: function () { - if (!control.editor.busy) - control.editor.ScrollRelative(control.vertical, +1); - }, - Disabled: function () { - return control.editor.busy; - }, - }; - - SocialCalc.ButtonRegister(control.morebutton, params, functions); - - control.main.appendChild(control.morebutton); - - control.scrollarea = document.createElement("div"); - s = control.scrollarea.style; - s.height = control.controlthickness + "px"; - s.width = control.controlthickness + "px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.scrollarea, scc.TCscrollareaStyle); - s.backgroundImage = "url(" + imageprefix + "scrollarea-" + vh + ".gif)"; - if (scc.TCscrollareaClass) - control.scrollarea.className = scc.TCscrollareaClass; - AssignID(control.editor, control.scrollarea, "scrollarea" + vh); - - params = { - repeatwait: scc.TCscrollareaRepeatWait, - repeatinterval: scc.TCscrollareaRepeatWait, - }; - functions = { - MouseDown: SocialCalc.ScrollAreaClick, - Repeat: SocialCalc.ScrollAreaClick, - Disabled: function () { - return control.editor.busy; - }, - }; - functions.control = control; - - SocialCalc.ButtonRegister(control.scrollarea, params, functions); - - control.main.appendChild(control.scrollarea); - - control.thumb = document.createElement("div"); - s = control.thumb.style; - s.height = - (control.vertical ? control.thumbthickness : control.controlthickness) + - "px"; - s.width = - (control.vertical ? control.controlthickness : control.thumbthickness) + - "px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.thumb, scc.TCthumbStyle); - control.thumb.style.backgroundImage = - "url(" + imageprefix + "thumb-" + vh + "n.gif)"; - if (scc.TCthumbClass) control.thumb.className = scc.TCthumbClass; - AssignID(control.editor, control.thumb, "thumb" + vh); - - functions = { - MouseDown: SocialCalc.TCTDragFunctionStart, - MouseMove: SocialCalc.TCTDragFunctionMove, - MouseUp: SocialCalc.TCTDragFunctionStop, - Disabled: function () { - return control.editor.busy; - }, - }; - functions.control = control; // make sure this is there - SocialCalc.DragRegister( - control.thumb, - control.vertical, - !control.vertical, - functions - ); - - params = { - normalstyle: - "backgroundImage:url(" + imageprefix + "thumb-" + vh + "n.gif)", - name: "Thumb", - downstyle: - "backgroundImage:url(" + imageprefix + "thumb-" + vh + "d.gif)", - hoverstyle: - "backgroundImage:url(" + imageprefix + "thumb-" + vh + "h.gif)", - }; - SocialCalc.ButtonRegister(control.thumb, params, null); // give it button-like visual behavior - - control.main.appendChild(control.thumb); - - return control.main; - }; - - // - // ScrollAreaClick - Button function to process pageup/down clicks - // - - SocialCalc.ScrollAreaClick = function (e, buttoninfo, bobj) { - var control = bobj.functionobj.control; - var bposition = SocialCalc.GetElementPosition(bobj.element); - var clickpos = control.vertical ? buttoninfo.clientY : buttoninfo.clientX; - if (control.editor.busy) { - // ignore if busy - wait for next repeat - return; - } - control.editor.PageRelative( - control.vertical, - clickpos > control.thumbpos ? 1 : -1 - ); - - return; - }; - - // - // PositionTableControlElements - // - - SocialCalc.PositionTableControlElements = function (control) { - var border, realend, thumbpos; - - var editor = control.editor; - - if (control.vertical) { - border = control.controlborder + "px"; - control.endcap.style.top = control.endcapstart + "px"; - control.endcap.style.left = border; - control.paneslider.style.top = control.panesliderstart + "px"; - control.paneslider.style.left = border; - control.lessbutton.style.top = control.lessbuttonstart + "px"; - control.lessbutton.style.left = border; - control.morebutton.style.top = control.morebuttonstart + "px"; - control.morebutton.style.left = border; - control.scrollarea.style.top = control.scrollareastart + "px"; - control.scrollarea.style.left = border; - control.scrollarea.style.height = control.scrollareasize + "px"; - realend = Math.max( - editor.context.sheetobj.attribs.lastrow, - editor.firstscrollingrow + 1 - ); - thumbpos = - ((editor.firstscrollingrow - (editor.lastnonscrollingrow + 1)) * - (control.scrollareasize - 3 * control.thumbthickness)) / - (realend - (editor.lastnonscrollingrow + 1)) + - control.scrollareastart - - 1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.top = thumbpos + "px"; - control.thumb.style.left = border; - } else { - border = control.controlborder + "px"; - control.endcap.style.left = control.endcapstart + "px"; - control.endcap.style.top = border; - control.paneslider.style.left = control.panesliderstart + "px"; - control.paneslider.style.top = border; - control.lessbutton.style.left = control.lessbuttonstart + "px"; - control.lessbutton.style.top = border; - control.morebutton.style.left = control.morebuttonstart + "px"; - control.morebutton.style.top = border; - control.scrollarea.style.left = control.scrollareastart + "px"; - control.scrollarea.style.top = border; - control.scrollarea.style.width = control.scrollareasize + "px"; - realend = Math.max( - editor.context.sheetobj.attribs.lastcol, - editor.firstscrollingcol + 1 - ); - thumbpos = - ((editor.firstscrollingcol - (editor.lastnonscrollingcol + 1)) * - (control.scrollareasize - control.thumbthickness)) / - (realend - editor.lastnonscrollingcol) + - control.scrollareastart - - 1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.left = thumbpos + "px"; - control.thumb.style.top = border; - } - control.thumbpos = thumbpos; - control.main.style.display = "block"; - }; - - // - // ComputeTableControlPositions - // - // This routine computes the screen positions and other values needed for laying out - // the table control elements. - // - - SocialCalc.ComputeTableControlPositions = function (control) { - var editor = control.editor; - - if (!editor.gridposition || !editor.headposition) - throw "Can't compute table control positions before editor positions"; - - if (control.vertical) { - control.controlborder = editor.gridposition.left + editor.tablewidth; // border=left position - control.endcapstart = editor.gridposition.top; // start=top position - control.panesliderstart = - editor.firstscrollingrowtop - control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingrowtop - 1; - control.morebuttonstart = - editor.gridposition.top + editor.tableheight - control.buttonthickness; - control.scrollareastart = - editor.firstscrollingrowtop - 1 + control.buttonthickness; - control.scrollareaend = control.morebuttonstart - 1; - control.scrollareasize = - control.scrollareaend - control.scrollareastart + 1; - } else { - control.controlborder = editor.gridposition.top + editor.tableheight; // border=top position - control.endcapstart = editor.gridposition.left; // start=left position - control.panesliderstart = - editor.firstscrollingcolleft - control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingcolleft - 1; - control.morebuttonstart = - editor.gridposition.left + editor.tablewidth - control.buttonthickness; - control.scrollareastart = - editor.firstscrollingcolleft - 1 + control.buttonthickness; - control.scrollareaend = control.morebuttonstart - 1; - control.scrollareasize = - control.scrollareaend - control.scrollareastart + 1; - } - }; - - ////// TCPS - TableControl Pan Slider methods - - // - // TCPSDragFunctionStart(event, draginfo, dobj) - // - // TableControlPaneSlider function for starting drag - // - - SocialCalc.TCPSDragFunctionStart = function (event, draginfo, dobj) { - var editor = dobj.functionobj.control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - draginfo.trackingline = document.createElement("div"); - draginfo.trackingline.style.height = dobj.vertical - ? scc.TCPStrackinglineThickness - : editor.tableheight - - (editor.headposition.top - editor.gridposition.top) + - "px"; - draginfo.trackingline.style.width = dobj.vertical - ? editor.tablewidth - - (editor.headposition.left - editor.gridposition.left) + - "px" - : scc.TCPStrackinglineThickness; - draginfo.trackingline.style.backgroundImage = - "url(" + - editor.imageprefix + - "trackingline-" + - (dobj.vertical ? "v" : "h") + - ".gif)"; - if (scc.TCPStrackinglineClass) - draginfo.trackingline.className = scc.TCPStrackinglineClass; - SocialCalc.setStyles(draginfo.trackingline, scc.TCPStrackinglineStyle); - - if (dobj.vertical) { - row = SocialCalc.Lookup( - draginfo.clientY + dobj.functionobj.control.sliderthickness, - editor.rowpositions - ); - draginfo.trackingline.style.top = - (editor.rowpositions[row] || editor.headposition.top) + "px"; - draginfo.trackingline.style.left = editor.headposition.left + "px"; - if (editor.context.rowpanes.length - 1) { - // has 2 already - editor.context.SetRowPaneFirstLast( - 1, - editor.context.rowpanes[0].last + 1, - editor.context.rowpanes[0].last + 1 - ); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } else { - col = SocialCalc.Lookup( - draginfo.clientX + dobj.functionobj.control.sliderthickness, - editor.colpositions - ); - draginfo.trackingline.style.top = editor.headposition.top + "px"; - draginfo.trackingline.style.left = - (editor.colpositions[col] || editor.headposition.left) + "px"; - if (editor.context.colpanes.length - 1) { - // has 2 already - editor.context.SetColPaneFirstLast( - 1, - editor.context.colpanes[0].last + 1, - editor.context.colpanes[0].last + 1 - ); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } - - editor.griddiv.appendChild(draginfo.trackingline); - }; - - // - // TCPSDragFunctionMove(event, draginfo, dobj) - // - - SocialCalc.TCPSDragFunctionMove = function (event, draginfo, dobj) { - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup( - draginfo.clientY + sliderthickness, - editor.rowpositions - ); - draginfo.trackingline.style.top = - (editor.rowpositions[row] || editor.headposition.top) + "px"; - } else { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup( - draginfo.clientX + sliderthickness, - editor.colpositions - ); - draginfo.trackingline.style.left = - (editor.colpositions[col] || editor.headposition.left) + "px"; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - }; - - // - // TCPSDragFunctionStop(event, draginfo, dobj) - // - - SocialCalc.TCPSDragFunctionStop = function (event, draginfo, dobj) { - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup( - draginfo.clientY + sliderthickness, - editor.rowpositions - ); - if (row > editor.context.sheetobj.attribs.lastrow) - row = editor.context.sheetobj.attribs.lastrow; // can't extend sheet here - if (!row || row <= editor.context.rowpanes[0].first) { - // set to no panes, leaving first pane settings - if (editor.context.rowpanes.length > 1) - editor.context.rowpanes.length = 1; - } else if (editor.context.rowpanes.length - 1) { - // has 2 already - if (!editor.timeout) { - // not waiting for position calc (so positions could be wrong) - editor.context.SetRowPaneFirstLast( - 0, - editor.context.rowpanes[0].first, - row - 1 - ); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } else { - editor.context.SetRowPaneFirstLast( - 0, - editor.context.rowpanes[0].first, - row - 1 - ); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } else { - max = - control.morebuttonstart - - control.minscrollingpanesize - - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup( - draginfo.clientX + sliderthickness, - editor.colpositions - ); - if (col > editor.context.sheetobj.attribs.lastcol) - col = editor.context.sheetobj.attribs.lastcol; // can't extend sheet here - if (!col || col <= editor.context.colpanes[0].first) { - // set to no panes, leaving first pane settings - if (editor.context.colpanes.length > 1) - editor.context.colpanes.length = 1; - } else if (editor.context.colpanes.length - 1) { - // has 2 already - if (!editor.timeout) { - // not waiting for position calc (so positions could be wrong) - editor.context.SetColPaneFirstLast( - 0, - editor.context.colpanes[0].first, - col - 1 - ); - editor.context.SetColPaneFirstLast(1, col, col); - } - } else { - editor.context.SetColPaneFirstLast( - 0, - editor.context.colpanes[0].first, - col - 1 - ); - editor.context.SetColPaneFirstLast(1, col, col); - } - } - - editor.FitToEditTable(); - - editor.griddiv.removeChild(draginfo.trackingline); - - editor.ScheduleRender(); - }; - - ////// TCT - TableControl Thumb methods - - //!!!! Note: Need to make start use same code as move/stop for determining row/col, since stop will set that - //!!!! Note: Need to make start/move/stop use positioning code that corresponds closer to - //!!!! ComputeTableControlPositions calculations. - - // - // TCTDragFunctionStart(event, draginfo, dobj) - // - // TableControlThumb function for starting drag - // - - SocialCalc.TCTDragFunctionStart = function (event, draginfo, dobj) { - var rowpane, colpane, row, col; - - var control = dobj.functionobj.control; - var editor = control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - if (draginfo.thumbstatus) { - // get rid of old one if mouseup was out of window - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) - draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - } - - draginfo.thumbstatus = document.createElement("div"); - - if (dobj.vertical) { - if (scc.TCTDFSthumbstatusvClass) - draginfo.thumbstatus.className = scc.TCTDFSthumbstatusvClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatusvStyle); - draginfo.thumbstatus.style.top = - draginfo.clientY + scc.TCTDFStopOffsetv + "px"; - draginfo.thumbstatus.style.left = - control.controlborder - 10 - editor.tablewidth / 2 + "px"; - draginfo.thumbstatus.style.width = editor.tablewidth / 2 + "px"; - - draginfo.thumbcontext = new SocialCalc.RenderContext( - editor.context.sheetobj - ); - draginfo.thumbcontext.showGrid = true; - draginfo.thumbcontext.rowpanes = [{ first: 1, last: 1 }]; - var pane = editor.context.colpanes[editor.context.colpanes.length - 1]; - draginfo.thumbcontext.colpanes = [{ first: pane.first, last: pane.last }]; - draginfo.thumbstatus.innerHTML = - '
    msg
    preview
    '; - draginfo.thumbstatus.rowmsgele = - draginfo.thumbstatus.firstChild.firstChild.firstChild.firstChild.firstChild; - draginfo.thumbstatus.rowpreviewele = - draginfo.thumbstatus.firstChild.firstChild.firstChild.childNodes[1].firstChild; - editor.toplevel.appendChild(draginfo.thumbstatus); - SocialCalc.TCTDragFunctionRowSetStatus( - draginfo, - editor, - editor.firstscrollingrow || 1 - ); - } else { - if (scc.TCTDFSthumbstatushClass) - draginfo.thumbstatus.className = scc.TCTDFSthumbstatushClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatushStyle); - draginfo.thumbstatus.style.top = - control.controlborder + scc.TCTDFStopOffseth + "px"; - draginfo.thumbstatus.style.left = - draginfo.clientX + scc.TCTDFSleftOffseth + "px"; - editor.toplevel.appendChild(draginfo.thumbstatus); - draginfo.thumbstatus.innerHTML = - scc.s_TCTDFthumbstatusPrefixh + - SocialCalc.rcColname(editor.firstscrollingcol); - } - }; - - // - // SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, row) - // - // Render partial row - // - - SocialCalc.TCTDragFunctionRowSetStatus = function (draginfo, editor, row) { - var scc = SocialCalc.Constants; - var msg = scc.s_TCTDFthumbstatusPrefixv + row + " "; - - draginfo.thumbstatus.rowmsgele.innerHTML = msg; - - draginfo.thumbcontext.rowpanes = [{ first: row, last: row }]; - draginfo.thumbrowshown = row; - - var ele = draginfo.thumbcontext.RenderSheet( - draginfo.thumbstatus.rowpreviewele.firstChild, - { type: "html" } - ); - }; - - // - // TCTDragFunctionMove(event, draginfo, dobj) - // - - SocialCalc.TCTDragFunctionMove = function (event, draginfo, dobj) { - var first, msg; - var control = dobj.functionobj.control; - var thumbthickness = control.thumbthickness; - var editor = control.editor; - var scc = SocialCalc.Constants; - - if (dobj.vertical) { - if ( - draginfo.clientY > - control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2 - ) - draginfo.clientY = - control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2; - if (draginfo.clientY < control.scrollareastart - draginfo.offsetY - 1) - draginfo.clientY = control.scrollareastart - draginfo.offsetY - 1; - draginfo.thumbstatus.style.top = draginfo.clientY + "px"; - - first = - ((draginfo.clientY + draginfo.offsetY - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastrow - - editor.lastnonscrollingrow) + - editor.lastnonscrollingrow + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) - first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) - first = editor.context.sheetobj.attribs.lastrow; - // msg = scc.s_TCTDFthumbstatusPrefixv+first; - if (first != draginfo.thumbrowshown) { - SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, first); - } - } else { - if ( - draginfo.clientX > - control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2 - ) - draginfo.clientX = - control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2; - if (draginfo.clientX < control.scrollareastart - draginfo.offsetX - 1) - draginfo.clientX = control.scrollareastart - draginfo.offsetX - 1; - draginfo.thumbstatus.style.left = draginfo.clientX + "px"; - - first = - ((draginfo.clientX + draginfo.offsetX - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastcol - - editor.lastnonscrollingcol) + - editor.lastnonscrollingcol + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) - first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) - first = editor.context.sheetobj.attribs.lastcol; - msg = scc.s_TCTDFthumbstatusPrefixh + SocialCalc.rcColname(first); - draginfo.thumbstatus.innerHTML = msg; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - }; - - // - // TCTDragFunctionStop(event, draginfo, dobj) - // - - SocialCalc.TCTDragFunctionStop = function (event, draginfo, dobj) { - var first; - var control = dobj.functionobj.control; - var editor = control.editor; - - if (dobj.vertical) { - first = - ((draginfo.clientY + draginfo.offsetY - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastrow - - editor.lastnonscrollingrow) + - editor.lastnonscrollingrow + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) - first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) - first = editor.context.sheetobj.attribs.lastrow; - - editor.context.SetRowPaneFirstLast( - editor.context.rowpanes.length - 1, - first, - first + 1 - ); - } else { - first = - ((draginfo.clientX + draginfo.offsetX - control.scrollareastart + 1) / - (control.scrollareasize - control.thumbthickness)) * - (editor.context.sheetobj.attribs.lastcol - - editor.lastnonscrollingcol) + - editor.lastnonscrollingcol + - 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) - first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) - first = editor.context.sheetobj.attribs.lastcol; - - editor.context.SetColPaneFirstLast( - editor.context.colpanes.length - 1, - first, - first + 1 - ); - } - - editor.FitToEditTable(); - - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) - draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - - editor.ScheduleRender(); - }; - - // ************************************* - // - // Dragging functions: - // - // ************************************* - - SocialCalc.DragInfo = { - // There is only one of these -- no "new" is done. - // Only one dragging operation can be active at a time. - // The registeredElements array is used to decide which item to drag. - - // One item for each draggable thing, each an object with: - // .element, .vertical, .horizontal, .functionobj - - registeredElements: [], - - // Items used during a drag - - draggingElement: null, // item being processed (.element is the actual element) - startX: 0, - startY: 0, - startZ: 0, - clientX: 0, // modifyable version to restrict movement - clientY: 0, - offsetX: 0, - offsetY: 0, - horizontalScroll: 0, // retrieved at drag start - verticalScroll: 0, - }; - - // - // DragRegister(element, vertical, horizontal, functionobj) - make element draggable - // - // The functionobj defaults to moving the element contrained only by vertical and horizontal settings. - // - - SocialCalc.DragRegister = function ( - element, - vertical, - horizontal, - functionobj - ) { - var draginfo = SocialCalc.DragInfo; - - if (!functionobj) { - functionobj = { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - }; - } - - draginfo.registeredElements.push({ - element: element, - vertical: vertical, - horizontal: horizontal, - functionobj: functionobj, - }); - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.DragMouseDown, false); - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousedown", SocialCalc.DragMouseDown); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - }; - - // - // DragUnregister(element) - remove object from list - // - - SocialCalc.DragUnregister = function (element) { - var draginfo = SocialCalc.DragInfo; - - var i; - - if (!element) return; - - for (i = 0; i < draginfo.registeredElements.length; i++) { - if (draginfo.registeredElements[i].element == element) { - draginfo.registeredElements.splice(i, 1); - if (element.removeEventListener) { - // DOM Level 2 -- Firefox, et al - element.removeEventListener( - "mousedown", - SocialCalc.DragMouseDown, - false - ); - } else { - // IE 5+ - element.detachEvent("onmousedown", SocialCalc.DragMouseDown); - } - return; - } - } - - return; // ignore if not in list - }; - - // - // DragMouseDown(event) - // - - SocialCalc.DragMouseDown = function (event) { - var e = event || window.event; - - var draginfo = SocialCalc.DragInfo; - - var dobj = SocialCalc.LookupElement( - e.target || e.srcElement, - draginfo.registeredElements - ); - if (!dobj) return; - - if (dobj && dobj.functionobj && dobj.functionobj.Disabled) { - if (dobj.functionobj.Disabled(e, draginfo, dobj)) { - return; - } - } - - draginfo.draggingElement = dobj; - - var viewportinfo = SocialCalc.GetViewportInfo(); - draginfo.horizontalScroll = viewportinfo.horizontalScroll; - draginfo.verticalScroll = viewportinfo.verticalScroll; - - draginfo.clientX = e.clientX + draginfo.horizontalScroll; // get document-relative coordinates - draginfo.clientY = e.clientY + draginfo.verticalScroll; - draginfo.startX = draginfo.clientX; - draginfo.startY = draginfo.clientY; - draginfo.startZ = dobj.element.style.zIndex; - draginfo.offsetX = 0; - draginfo.offsetY = 0; - - dobj.element.style.zIndex = "100"; - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener("mousemove", SocialCalc.DragMouseMove, true); // capture everywhere - document.addEventListener("mouseup", SocialCalc.DragMouseUp, true); - } else if (dobj.element.attachEvent) { - // IE 5+ - dobj.element.setCapture(); - dobj.element.attachEvent("onmousemove", SocialCalc.DragMouseMove); - dobj.element.attachEvent("onmouseup", SocialCalc.DragMouseUp); - dobj.element.attachEvent("onlosecapture", SocialCalc.DragMouseUp); - } - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - if (dobj && dobj.functionobj && dobj.functionobj.MouseDown) - dobj.functionobj.MouseDown(e, draginfo, dobj); - - return false; - }; - - // - // DragMouseMove(event) - // - - SocialCalc.DragMouseMove = function (event) { - var e = event || window.event; - - var draginfo = SocialCalc.DragInfo; - draginfo.clientX = e.clientX + draginfo.horizontalScroll; - draginfo.clientY = e.clientY + draginfo.verticalScroll; - - var dobj = draginfo.draggingElement; - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - - if (dobj && dobj.functionobj && dobj.functionobj.MouseMove) - dobj.functionobj.MouseMove(e, draginfo, dobj); - - return false; - }; - - // - // DragMouseUp(event) - // - - SocialCalc.DragMouseUp = function (event) { - var e = event || window.event; - - var draginfo = SocialCalc.DragInfo; - draginfo.clientX = e.clientX + draginfo.horizontalScroll; - draginfo.clientY = e.clientY + draginfo.verticalScroll; - - var dobj = draginfo.draggingElement; - - dobj.element.style.zIndex = draginfo.startZ; - - if (dobj && dobj.functionobj && dobj.functionobj.MouseUp) - dobj.functionobj.MouseUp(e, draginfo, dobj); - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.DragMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.DragMouseUp, true); - // Note: In old (1.5?) versions of Firefox, this causes the browser to skip the MouseUp for - // the button code. https://bugzilla.mozilla.org/show_bug.cgi?id=174320 - // Firefox 1.5 is <1% share (http://marketshare.hitslink.com/report.aspx?qprid=7) - } else if (dobj.element.detachEvent) { - // IE - dobj.element.detachEvent("onlosecapture", SocialCalc.DragMouseUp); - dobj.element.detachEvent("onmouseup", SocialCalc.DragMouseUp); - dobj.element.detachEvent("onmousemove", SocialCalc.DragMouseMove); - dobj.element.releaseCapture(); - } - - draginfo.draggingElement = null; - - return false; - }; - - // - // DragFunctionStart(event, draginfo, dobj) - // - - SocialCalc.DragFunctionStart = function (event, draginfo, dobj) { - var val; - var element = dobj.functionobj.positionobj || dobj.element; - - val = element.style.top.match(/\d*/); - draginfo.offsetY = (val ? val[0] - 0 : 0) - draginfo.clientY; - val = element.style.left.match(/\d*/); - draginfo.offsetX = (val ? val[0] - 0 : 0) - draginfo.clientX; - }; - - // - // DragFunctionPosition(event, draginfo, dobj) - // - - SocialCalc.DragFunctionPosition = function (event, draginfo, dobj) { - var element = dobj.functionobj.positionobj || dobj.element; - - if (dobj.vertical) - element.style.top = draginfo.clientY + draginfo.offsetY + "px"; - if (dobj.horizontal) - element.style.left = draginfo.clientX + draginfo.offsetX + "px"; - }; - - // ************************************* - // - // Tooltip functions: - // - // ************************************* - - SocialCalc.TooltipInfo = { - // There is only one of these -- no "new" is done. - // Only one tooltip operation can be active at a time. - // The registeredElements array is used to identify items. - - // One item for each element with a tooltip, each an object with: - // .element, .tiptext, .functionobj - // Currently .functionobj can only contain .offsetx and .offsety. - // If present they are used instead of the default ones. - - registeredElements: [], - - registered: false, // if true, an event handler has been registered for this functionality - - // Items used during hover over an element - - tooltipElement: null, // item being processed (.element is the actual element) - timer: null, // timer object waiting to see if holding over element - popupElement: null, // tooltip element being displayed - clientX: 0, // modifyable version to restrict movement - clientY: 0, - offsetX: SocialCalc.Constants.TooltipOffsetX, // modifyable version to allow positioning - offsetY: SocialCalc.Constants.TooltipOffsetY, - }; - - // - // TooltipRegister(element, tiptext, functionobj) - make element have a tooltip - // - - SocialCalc.TooltipRegister = function (element, tiptext, functionobj) { - var tooltipinfo = SocialCalc.TooltipInfo; - tooltipinfo.registeredElements.push({ - element: element, - tiptext: tiptext, - functionobj: functionobj, - }); - - if (tooltipinfo.registered) return; // only need to add event listener once - - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener( - "mousemove", - SocialCalc.TooltipMouseMove, - false - ); - } else if (document.attachEvent) { - // IE 5+ - document.attachEvent("onmousemove", SocialCalc.TooltipMouseMove); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - tooltipinfo.registered = true; // remember - - return; - }; - - // - // TooltipMouseMove(event) - // - - SocialCalc.TooltipMouseMove = function (event) { - var e = event || window.event; - - var tooltipinfo = SocialCalc.TooltipInfo; - - tooltipinfo.viewport = SocialCalc.GetViewportInfo(); - tooltipinfo.clientX = e.clientX + tooltipinfo.viewport.horizontalScroll; - tooltipinfo.clientY = e.clientY + tooltipinfo.viewport.verticalScroll; - - var tobj = SocialCalc.LookupElement( - e.target || e.srcElement, - tooltipinfo.registeredElements - ); - - if (tooltipinfo.timer) { - // waiting to see if holding still: didn't hold still - window.clearTimeout(tooltipinfo.timer); // cancel timer - tooltipinfo.timer = null; - } - - if (tooltipinfo.popupElement) { - // currently displaying a tip: hide it - SocialCalc.TooltipHide(); - } - - tooltipinfo.tooltipElement = tobj || null; - - if (!tobj || SocialCalc.ButtonInfo.buttonDown) return; // if not an object with a tip or a "button" is down, ignore - - tooltipinfo.timer = window.setTimeout(SocialCalc.TooltipWaitDone, 700); - - if (tooltipinfo.tooltipElement.element.addEventListener) { - // Register event for mouse down which cancels tooltip stuff - tooltipinfo.tooltipElement.element.addEventListener( - "mousedown", - SocialCalc.TooltipMouseDown, - false - ); - } else if (tooltipinfo.tooltipElement.element.attachEvent) { - // IE - tooltipinfo.tooltipElement.element.attachEvent( - "onmousedown", - SocialCalc.TooltipMouseDown - ); - } - - return; - }; - - // - // TooltipMouseDown(event) - // - - SocialCalc.TooltipMouseDown = function (event) { - var e = event || window.event; - - var tooltipinfo = SocialCalc.TooltipInfo; - - if (tooltipinfo.timer) { - window.clearTimeout(tooltipinfo.timer); // cancel timer - tooltipinfo.timer = null; - } - - if (tooltipinfo.popupElement) { - // currently displaying a tip: hide it - SocialCalc.TooltipHide(); - } - - if (tooltipinfo.tooltipElement) { - if (tooltipinfo.tooltipElement.element.removeEventListener) { - // DOM Level 2 -- Firefox, et al - tooltipinfo.tooltipElement.element.removeEventListener( - "mousedown", - SocialCalc.TooltipMouseDown, - false - ); - } else if (tooltipinfo.tooltipElement.element.attachEvent) { - // IE 5+ - tooltipinfo.tooltipElement.element.detachEvent( - "onmousedown", - SocialCalc.TooltipMouseDown - ); - } - tooltipinfo.tooltipElement = null; - } - - return; - }; - - // - // TooltipDisplay(tobj) - // - - SocialCalc.TooltipDisplay = function (tobj) { - var tooltipinfo = SocialCalc.TooltipInfo; - var scc = SocialCalc.Constants; - var offsetX = - tobj.functionobj && typeof tobj.functionobj.offsetx == "number" - ? tobj.functionobj.offsetx - : tooltipinfo.offsetX; - var offsetY = - tobj.functionobj && typeof tobj.functionobj.offsety == "number" - ? tobj.functionobj.offsety - : tooltipinfo.offsetY; - - tooltipinfo.popupElement = document.createElement("div"); - if (scc.TDpopupElementClass) - tooltipinfo.popupElement.className = scc.TDpopupElementClass; - SocialCalc.setStyles(tooltipinfo.popupElement, scc.TDpopupElementStyle); - - tooltipinfo.popupElement.innerHTML = tobj.tiptext; - - if (tooltipinfo.clientX > tooltipinfo.viewport.width / 2) { - // on right side of screen - tooltipinfo.popupElement.style.bottom = - tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY + "px"; - tooltipinfo.popupElement.style.right = - tooltipinfo.viewport.width - tooltipinfo.clientX + offsetX + "px"; - } else { - // on left side of screen - tooltipinfo.popupElement.style.bottom = - tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY + "px"; - tooltipinfo.popupElement.style.left = - tooltipinfo.clientX + offsetX + "px"; - } - - if (tooltipinfo.clientY < 50) { - // make sure fits on screen if nothing above grid - tooltipinfo.popupElement.style.bottom = - tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY - 50 + "px"; - } - - document.body.appendChild(tooltipinfo.popupElement); - }; - - // - // TooltipHide() - // - - SocialCalc.TooltipHide = function () { - var tooltipinfo = SocialCalc.TooltipInfo; - - if (tooltipinfo.popupElement) { - tooltipinfo.popupElement.parentNode.removeChild(tooltipinfo.popupElement); - tooltipinfo.popupElement = null; - } - }; - - // - // TooltipWaitDone() - // - - SocialCalc.TooltipWaitDone = function () { - var tooltipinfo = SocialCalc.TooltipInfo; - - tooltipinfo.timer = null; - - SocialCalc.TooltipDisplay(tooltipinfo.tooltipElement); - }; - - // ************************************* - // - // Button functions: - // - // ************************************* - - SocialCalc.ButtonInfo = { - // There is only one of these -- no "new" is done. - // Only one button operation can be active at a time. - // The registeredElements array is used to identify items. - - // One item for each clickable element, each an object with: - // .element, .normalstyle, .hoverstyle, .downstyle, .repeatinterval, .functionobj - // - // .functionobj is an object with optional function objects for: - // mouseover, mouseout, mousedown, repeatinterval, mouseup, disabled - - registeredElements: [], - - // Items used during hover over an element, clicking, repeating, etc. - - buttonElement: null, // item being processed, hover or down (.element is the actual element) - doingHover: false, // true if mouse is over one of our elements - buttonDown: false, // true if button down and buttonElement not null - timer: null, // timer object for repeating - - // Used while processing an event - - horizontalScroll: 0, - verticalScroll: 0, - clientX: 0, - clientY: 0, - }; - - // - // ButtonRegister(element, paramobj, functionobj) - make element clickable - // - // The arguments (other than element) may be null (meaning no change for style and no repeat) - // The paramobj has the optional normalstyle, hoverstyle, downstyle, repeatwait, repeatinterval settings - - SocialCalc.ButtonRegister = function (element, paramobj, functionobj) { - var buttoninfo = SocialCalc.ButtonInfo; - - if (!paramobj) paramobj = {}; - - buttoninfo.registeredElements.push({ - name: paramobj.name, - element: element, - normalstyle: paramobj.normalstyle, - hoverstyle: paramobj.hoverstyle, - downstyle: paramobj.downstyle, - repeatwait: paramobj.repeatwait, - repeatinterval: paramobj.repeatinterval, - functionobj: functionobj, - }); - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.ButtonMouseDown, false); - element.addEventListener("mouseover", SocialCalc.ButtonMouseOver, false); - element.addEventListener("mouseout", SocialCalc.ButtonMouseOut, false); - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousedown", SocialCalc.ButtonMouseDown); - element.attachEvent("onmouseover", SocialCalc.ButtonMouseOver); - element.attachEvent("onmouseout", SocialCalc.ButtonMouseOut); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - }; - - // - // ButtonMouseOver(event) - // - - SocialCalc.ButtonMouseOver = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var bobj = SocialCalc.LookupElement( - e.target || e.srcElement, - buttoninfo.registeredElements - ); - - if (!bobj) return; - - if (buttoninfo.buttonDown) { - if (buttoninfo.buttonElement == bobj) { - buttoninfo.doingHover = true; // keep track whether we are on the pressed button or not - } - return; - } - - if ( - buttoninfo.buttonElement && - buttoninfo.buttonElement != bobj && - buttoninfo.doingHover - ) { - // moved to a new one, undo hover there - SocialCalc.setStyles( - buttoninfo.buttonElement.element, - buttoninfo.buttonElement.normalstyle - ); - } - - buttoninfo.buttonElement = bobj; // remember this one is hovering - buttoninfo.doingHover = true; - - SocialCalc.setStyles(bobj.element, bobj.hoverstyle); // set style (if provided) - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOver) - bobj.functionobj.MouseOver(e, buttoninfo, bobj); - - return; - }; - - // - // ButtonMouseOut(event) - // - - SocialCalc.ButtonMouseOut = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - if (buttoninfo.buttonDown) { - buttoninfo.doingHover = false; // keep track of overs and outs - return; - } - - var bobj = SocialCalc.LookupElement( - e.target || e.srcElement, - buttoninfo.registeredElements - ); - - if (buttoninfo.doingHover) { - // if there was a hover, undo it - if (buttoninfo.buttonElement) - SocialCalc.setStyles( - buttoninfo.buttonElement.element, - buttoninfo.buttonElement.normalstyle - ); - buttoninfo.buttonElement = null; - buttoninfo.doingHover = false; - } - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOut) - bobj.functionobj.MouseOut(e, buttoninfo, bobj); - - return; - }; - - // - // ButtonMouseDown(event) - // - - SocialCalc.ButtonMouseDown = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var viewportinfo = SocialCalc.GetViewportInfo(); - - var bobj = SocialCalc.LookupElement( - e.target || e.srcElement, - buttoninfo.registeredElements - ); - - if (!bobj) return; // not one of our elements - - if (bobj && bobj.functionobj && bobj.functionobj.Disabled) { - if (bobj.functionobj.Disabled(e, buttoninfo, bobj)) { - return; - } - } - - buttoninfo.buttonElement = bobj; - buttoninfo.buttonDown = true; - - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.downstyle); - - // Register event handler for mouse up - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { - // DOM Level 2 -- Firefox, et al - document.addEventListener("mouseup", SocialCalc.ButtonMouseUp, true); // capture everywhere - } else if (bobj.element.attachEvent) { - // IE 5+ - bobj.element.setCapture(); - bobj.element.attachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.attachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - } - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - buttoninfo.horizontalScroll = viewportinfo.horizontalScroll; - buttoninfo.verticalScroll = viewportinfo.verticalScroll; - buttoninfo.clientX = e.clientX + buttoninfo.horizontalScroll; // get document-relative coordinates - buttoninfo.clientY = e.clientY + buttoninfo.verticalScroll; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseDown) - bobj.functionobj.MouseDown(e, buttoninfo, bobj); - - if (bobj.repeatwait) { - // if a repeat wait is set, then starting waiting for first repetition - buttoninfo.timer = window.setTimeout( - SocialCalc.ButtonRepeat, - bobj.repeatwait - ); - } - - return; - }; - - // - // ButtonMouseUp(event) - // - - SocialCalc.ButtonMouseUp = function (event) { - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (buttoninfo.timer) { - // if repeating, cancel it - window.clearTimeout(buttoninfo.timer); // cancel timer - buttoninfo.timer = null; - } - - if (!buttoninfo.buttonDown) return; // already did this (e.g., in IE, releaseCapture fires losecapture) - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - if (document.removeEventListener) { - // DOM Level 2 - document.removeEventListener("mouseup", SocialCalc.ButtonMouseUp, true); - } else if (document.detachEvent) { - // IE - bobj.element.detachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - bobj.element.detachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.releaseCapture(); - } - - if (buttoninfo.buttonElement.downstyle) { - if (buttoninfo.doingHover) - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.hoverstyle); - else - SocialCalc.setStyles( - bobj.element, - buttoninfo.buttonElement.normalstyle - ); - } - - buttoninfo.buttonDown = false; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseUp) - bobj.functionobj.MouseUp(e, buttoninfo, bobj); - }; - - // - // ButtonRepeat() - // - - SocialCalc.ButtonRepeat = function () { - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (!bobj) return; - - if (bobj && bobj.functionobj && bobj.functionobj.Repeat) - bobj.functionobj.Repeat(null, buttoninfo, bobj); - - buttoninfo.timer = window.setTimeout( - SocialCalc.ButtonRepeat, - bobj.repeatinterval || 100 - ); - }; - - // ************************************* - // - // MouseWheel functions: - // - // ************************************* - - SocialCalc.MouseWheelInfo = { - // There is only one of these -- no "new" is done. - // The mousewheel only affects the one area the mouse pointer is over - // The registeredElements array is used to identify items. - - // One item for each element to respond to the mousewheel, each an object with: - // .element, .functionobj - - registeredElements: [], - }; - - // - // MouseWheelRegister(element, functionobj) - make element respond to mousewheel - // - - SocialCalc.MouseWheelRegister = function (element, functionobj) { - var mousewheelinfo = SocialCalc.MouseWheelInfo; - - mousewheelinfo.registeredElements.push({ - element: element, - functionobj: functionobj, - }); - - if (element.addEventListener) { - // DOM Level 2 -- Firefox, et al - element.addEventListener( - "DOMMouseScroll", - SocialCalc.ProcessMouseWheel, - false - ); - element.addEventListener( - "mousewheel", - SocialCalc.ProcessMouseWheel, - false - ); // Opera needs this - } else if (element.attachEvent) { - // IE 5+ - element.attachEvent("onmousewheel", SocialCalc.ProcessMouseWheel); - } else { - // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - }; - - SocialCalc.ProcessMouseWheel = function (e) { - var event = e || window.event; - var delta, coord; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - var mousewheelinfo = SocialCalc.MouseWheelInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var wobj; - - for (wobj = null; !wobj && ele; ele = ele.parentNode) { - // go up tree looking for one of our elements - wobj = SocialCalc.LookupElement(ele, mousewheelinfo.registeredElements); - } - if (!wobj) return; // not one of our elements - - if (event.wheelDelta) { - delta = event.wheelDelta / 120; - } else delta = -event.detail / 3; - if (!delta) delta = 0; - - if (wobj.functionobj && wobj.functionobj.WheelMove) - wobj.functionobj.WheelMove(event, delta, mousewheelinfo, wobj); - - if (event.preventDefault) event.preventDefault(); - event.returnValue = false; - }; - - // ************************************* - // - // Keyboard functions: - // - // For more information about keyboard handling, see: http://unixpapa.com/js/key.html - // - // ************************************* - - SocialCalc.keyboardTables = { - specialKeysCommon: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", - 46: "[del]", - 113: "[f2]", - }, - - specialKeysIE: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", - 46: "[del]", - 113: "[f2]", - }, - - controlKeysIE: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]", - }, - - specialKeysOpera: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", // issues with releases before 9.5 - same as "-" ("-" changed in 9.5) - 46: "[del]", // issues with releases before 9.5 - same as "." ("." changed in 9.5) - 113: "[f2]", - }, - - controlKeysOpera: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]", - }, - - specialKeysSafari: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 63232: "[aup]", - 63233: "[adown]", - 63234: "[aleft]", - 63235: "[aright]", - 63272: "[del]", - 63273: "[home]", - 63275: "[end]", - 63276: "[pgup]", - 63277: "[pgdn]", - 63237: "[f2]", - }, - - controlKeysSafari: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]", - }, - - ignoreKeysSafari: { - 63236: "[f1]", - 63238: "[f3]", - 63239: "[f4]", - 63240: "[f5]", - 63241: "[f6]", - 63242: "[f7]", - 63243: "[f8]", - 63244: "[f9]", - 63245: "[f10]", - 63246: "[f11]", - 63247: "[f12]", - 63289: "[numlock]", - }, - - specialKeysFirefox: { - 8: "[backspace]", - 9: "[tab]", - 13: "[enter]", - 25: "[tab]", - 27: "[esc]", - 33: "[pgup]", - 34: "[pgdn]", - 35: "[end]", - 36: "[home]", - 37: "[aleft]", - 38: "[aup]", - 39: "[aright]", - 40: "[adown]", - 45: "[ins]", - 46: "[del]", - 113: "[f2]", - }, - - controlKeysFirefox: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]", - }, - - ignoreKeysFirefox: { - 16: "[shift]", - 17: "[ctrl]", - 18: "[alt]", - 20: "[capslock]", - 19: "[pause]", - 44: "[printscreen]", - 91: "[windows]", - 92: "[windows]", - 112: "[f1]", - 114: "[f3]", - 115: "[f4]", - 116: "[f5]", - 117: "[f6]", - 118: "[f7]", - 119: "[f8]", - 120: "[f9]", - 121: "[f10]", - 122: "[f11]", - 123: "[f12]", - 144: "[numlock]", - 145: "[scrolllock]", - 224: "[cmd]", - }, - }; - - SocialCalc.Keyboard = { - areListener: false, // if true, we have been installed as a listener for keyboard events - focusTable: null, // the table editor object that gets keystrokes or null - passThru: null, // if not null, control element with focus to pass keyboard events to (has blur method), or "true" - didProcessKey: false, // did SocialCalc.ProcessKey in keydown - statusFromProcessKey: false, // the status from the keydown SocialCalc.ProcessKey - repeatingKeyPress: false, // some browsers (Opera, Gecko Mac) repeat special keys as KeyPress not KeyDown - chForProcessKey: "", // remember so can do repeat in those cases - }; - - SocialCalc.KeyboardSetFocus = function (editor) { - SocialCalc.Keyboard.focusTable = editor; - - if (!SocialCalc.Keyboard.areListener) { - document.onkeydown = SocialCalc.ProcessKeyDown; - document.onkeypress = SocialCalc.ProcessKeyPress; - SocialCalc.Keyboard.areListener = true; - } - if (SocialCalc.Keyboard.passThru) { - if (SocialCalc.Keyboard.passThru.blur) { - SocialCalc.Keyboard.passThru.blur(); - } - SocialCalc.Keyboard.passThru = null; - } - window.focus(); - }; - - SocialCalc.KeyboardFocus = function () { - SocialCalc.Keyboard.passThru = null; - window.focus(); - }; - - SocialCalc.ProcessKeyDown = function (e) { - var kt = SocialCalc.keyboardTables; - kt.didProcessKey = false; // always start false - kt.statusFromProcessKey = false; - kt.repeatingKeyPress = false; - - var ch = ""; - var status = true; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - // IE and Safari 3.1+ won't fire keyPress, so check for special keys here. - if (e.which == undefined || typeof e.keyIdentifier == "string") { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { - if (e.ctrlKey) { - ch = kt.controlKeysIE[e.keyCode]; - } - if (!ch) return true; - } - status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - } else { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { - // return true; - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysIE[e.keyCode]; // this works here - } - if (!ch) return true; - } - - status = SocialCalc.ProcessKey(ch, e); // process the key - kt.didProcessKey = true; // remember what happened - kt.statusFromProcessKey = status; - kt.chForProcessKey = ch; - } - - return status; - }; - - SocialCalc.ProcessKeyPress = function (e) { - var kt = SocialCalc.keyboardTables; - - var ch = ""; - - e = e || window.event; - - if (SocialCalc.Keyboard.passThru) return; // ignore - if (kt.didProcessKey) { - // already processed this key - if (kt.repeatingKeyPress) { - return SocialCalc.ProcessKey(kt.chForProcessKey, e); // process the same key as on KeyDown - } else { - kt.repeatingKeyPress = true; // see if get another KeyPress before KeyDown - return kt.statusFromProcessKey; // do what it said to do - } - } - - if (e.which == undefined) { - // IE - // Note: Esc and Enter will come through here, too, if not stopped at KeyDown - ch = String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) - } else { - // not IE - if (!e.which) return false; // ignore - special key - if (e.charCode == undefined) { - // Opera - if (e.which != 0) { - // character - if (e.which < 32 || e.which == 144) { - // special char (144 is numlock) - ch = kt.specialKeysOpera[e.which]; - if (ch) { - return true; - } - } else { - if (e.ctrlKey) { - ch = kt.controlKeysOpera[e.keyCode]; - } else { - ch = String.fromCharCode(e.which); - } - } - } else { - // special char - return true; - } - } else if (e.keyCode == 0 && e.charCode == 0) { - // OLPC Fn key or something - return; // ignore - } else if (e.keyCode == e.charCode) { - // Safari - ch = kt.specialKeysSafari[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysSafari[e.keyCode]) - // pass this through - return true; - if (e.metaKey) { - ch = kt.controlKeysSafari[e.keyCode]; - } else { - ch = String.fromCharCode(e.which); - } - } - } else { - // Firefox - if (kt.specialKeysFirefox[e.keyCode]) { - return true; - } - ch = String.fromCharCode(e.which); - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysFirefox[e.which]; - } - } - } - - var status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - - return status; - }; - - /* -* -* OLD ProcessKeyDown and ProcessKeyPress -- replaced for handling newer browsers, including Safari 3.1 and Opera 9.5 -* - -SocialCalc.ProcessKeyDown = function(e) { - -var kt = SocialCalc.keyboardTables; - -var ch=""; -var status=true; - -if (SocialCalc.Keyboard.passThru) return; // ignore - -e = e || window.event; - -if (e.which==undefined) { // IE -ch = kt.specialKeysIE[e.keyCode]; -if (!ch) { -if (e.ctrlKey) { -ch=kt.controlKeysIE[e.keyCode]; -} -if (!ch) -return true; -} - -status = SocialCalc.ProcessKey(ch, e); - -if (!status) { -if (e.preventDefault) e.preventDefault(); -e.returnValue = false; -} -} - -else { // don't do anything for other browsers - wait for keyPress -; // special key repeats are done as keypress in those browsers -} - -return status; - -} - -SocialCalc.ProcessKeyPress = function(e) { - -var kt = SocialCalc.keyboardTables; - -var ch=""; - -if (SocialCalc.Keyboard.passThru) return; // ignore - -e = e || window.event; - -if (e.which==undefined) { // IE -// Note: Esc and Enter will come through here, too, if not stopped at KeyDown -ch=String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) -} - -else { // not IE -if (e.charCode==undefined) { // Opera -if (e.which!=0) { // character -if (e.which<32) { // special char -ch = kt.specialKeysOpera[e.keyCode]; -if (!ch) -return true; -} -else { -if (e.ctrlKey) { -ch=kt.controlKeysOpera[e.keyCode]; -} -else { -ch = String.fromCharCode(e.which); -} -} -} -else { // special char -ch = kt.specialKeysOpera[e.keyCode]; -if (!ch) -return true; -} -} - -else if (e.keyCode==0 && e.charCode==0) { // OLPC Fn key or something -return; // ignore -} - -else if (e.keyCode==e.charCode) { // Safari -ch = kt.specialKeysSafari[e.keyCode]; -if (!ch) { -if (kt.ignoreKeysSafari[e.keyCode]) // pass this through -return true; -if (e.metaKey) { -ch=kt.controlKeysSafari[e.keyCode]; -} -else { -ch = String.fromCharCode(e.which); -} -} -} - -else { // Firefox -ch = kt.specialKeysFirefox[e.keyCode]; -if (!ch) { -if (kt.ignoreKeysFirefox[e.keyCode]) // pass this through -return true; -if (e.which) { // normal char -if (e.ctrlKey || e.metaKey) { -ch = kt.controlKeysFirefox[e.which]; -} -else { -ch = String.fromCharCode(e.which); -} -} -else { // usually a special char -return true; // old Firefox gives extra, empty keyPress for "/" - ignore -} -} -} -} - -var status = SocialCalc.ProcessKey(ch, e); - -if (!status) { -if (e.preventDefault) e.preventDefault(); -e.returnValue = false; -} - -return status; - -} -*/ - - // - // status = SocialCalc.ProcessKey(ch, e) - // - // Take a key representation as a character string and dispatch to appropriate routine - // - - SocialCalc.ProcessKey = function (ch, e) { - var ft = SocialCalc.Keyboard.focusTable; - - if (!ft) return true; // we're not handling it -- let browser do default - - return ft.EditorProcessKey(ch, e); - }; - - // For Contact - SocialCalc.EditorChangecontact = function ( - editor, - text, - name, - phone, - email, - street, - city, - company, - val - ) { - // alert('changecontact called'); - //var wval = editor.workingvalues; - if (name != "") { - cmdline = "set " + name + " " + "text t" + " " + contactname; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - cmdline = "set " + phone + " " + "text t" + " " + contactphoneNumber; - editor.EditorScheduleSheetCommands(cmdline, true, false); - if (email != "") { - cmdline = "set " + email + " " + "text t" + " " + contactemail; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - cmdline = "set " + street + " " + "text t" + " " + contactStreet; - editor.EditorScheduleSheetCommands(cmdline, true, false); - cmdline = "set " + city + " " + "text t" + " " + contactcity; - editor.EditorScheduleSheetCommands(cmdline, true, false); - if (val == "y") { - cmdline = "set " + company + " " + "text t" + " " + contactcompany; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - - return; - }; - - //changes by mini for font and color - - SocialCalc.EditorChangeSheetcolor = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - type = "text t"; - //value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - value = text; - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord) + ""; - if (value == oldvalue) { - // no change - return; - } - fch = value.charAt(0); - if (fch == "=" && value.indexOf("\n") == -1) { - type = "formula"; - value = value.substring(1); - } else if (fch == "'") { - type = "text t"; - value = value.substring(1); - } else if (value.length == 0) { - type = "empty"; - } else { - valueinfo = SocialCalc.DetermineValueType(value); - if (valueinfo.type == "n" && value == valueinfo.value + "") { - // see if don't need "constant" - type = "value n"; - } else if (valueinfo.type.charAt(0) == "t") { - type = "text " + valueinfo.type; - } else if (valueinfo.type == "") { - type = "text t"; - } else { - type = "constant " + valueinfo.type + " " + valueinfo.value; - } - } - - if (type.charAt(0) == "t") { - // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - //cmdline = "set "+wval.ecoord+" "+"font"+" "+value; - cmdline = "set " + "sheet" + " " + "defaultcolor" + " " + value; - //cmdline = "set "+"sheet"+" "+"defaultcolor green"; - //var control = SocialCalc.GetCurrentWorkBookControl(); - //alert('u reach sheet' + " "+control.workbook.sheetArr["sheet1"].sheet); - //cmdline = "set "+sheetobj+" "+"font"+" "+value; - //cmdline="set "+ control.workbook.sheetArr["sheet1"].sheet+" color blue" ; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - }; - - SocialCalc.EditorChangecolorFromWidget = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - if (!CoordForColorChange) { - alert("No active cell"); - return; - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - cmdline = "set " + CoordForColorChange + " " + "color" + " " + text; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - }; - - SocialCalc.EditorChangefontFromWidget = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - if (!CoordForColorChange) { - alert("No active cell"); - return; - } - //alert(CoordForColorChange); - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - //cmdline = "set "+CoordForColorChange+" "+"font"+" "+text; - //editor.EditorScheduleSheetCommands(cmdline, true, false); - var value = text; - if (value == "a") { - cmdline = "set " + CoordForColorChange + " font * 12px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "b") { - cmdline = "set " + CoordForColorChange + " font * 14px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "c") { - cmdline = "set " + CoordForColorChange + " font * 16px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "d") { - cmdline = "set " + CoordForColorChange + " font * 18px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - - return; - }; - - SocialCalc.EditorChangeSheetfont = function (editor, text) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - type = "text t"; - //value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - value = text; - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord) + ""; - if (value == oldvalue) { - // no change - return; - } - fch = value.charAt(0); - if (fch == "=" && value.indexOf("\n") == -1) { - type = "formula"; - value = value.substring(1); - } else if (fch == "'") { - type = "text t"; - value = value.substring(1); - } else if (value.length == 0) { - type = "empty"; - } else { - valueinfo = SocialCalc.DetermineValueType(value); - if (valueinfo.type == "n" && value == valueinfo.value + "") { - // see if don't need "constant" - type = "value n"; - } else if (valueinfo.type.charAt(0) == "t") { - type = "text " + valueinfo.type; - } else if (valueinfo.type == "") { - type = "text t"; - } else { - type = "constant " + valueinfo.type + " " + valueinfo.value; - } - } - - if (type.charAt(0) == "t") { - // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && wval.currentsheet != wval.startsheet) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " + wval.startsheetid; - control.ExecuteWorkBookControlCommand( - { cmdtype: "wcmd", id: "0", cmdstr: cmdstr }, - false - ); - } - - //cmdline = "set "+wval.ecoord+" "+"font"+" "+value; - //cmdline = "set "+"sheet"+" "+"defaultcolor"+" "+ value; - - //cmdline = "set "+"sheet"+" "+"defaultfont"+" * "+value+" *"; - - //cmdline = "set sheet defaultfont normal normal "+value +" *"; - //cmdline="set sheet defaultfont"; - // alert(cmdline); - //editor.EditorScheduleSheetCommands(cmdline, true, false); - if (value == "a") { - cmdline = "set sheet defaultfont * 12px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "b") { - cmdline = "set sheet defaultfont * 14px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "c") { - cmdline = "set sheet defaultfont * 16px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - if (value == "d") { - cmdline = "set sheet defaultfont * 18px *"; - editor.EditorScheduleSheetCommands(cmdline, true, false); - } - - //cmdline = ""+"set sheet defaultfont * 8pt *"; - //cmdline = "set "+"sheet"+" "+"defaultcolor green"; - //var control = SocialCalc.GetCurrentWorkBookControl(); - //alert('u reach sheet' + " "+control.workbook.sheetArr["sheet1"].sheet); - //cmdline = "set "+sheetobj+" "+"font"+" "+value; - //cmdline="set "+ control.workbook.sheetArr["sheet1"].sheet+" color blue" ; - - return; - }; - - SocialCalc.EditorCut = function (editor, value) { - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - if (value == "a") { - cmdline = "cut " + editCoord + " all"; - } else if (value == "b") { - cmdline = "copy " + editCoord + " all"; - } else if (value == "c") { - cmdline = "paste " + editCoord + " all"; - } else if (value == "d") { - cmdline = "erase " + editCoord + " formulas"; - } - editor.EditorScheduleSheetCommands(cmdline, true, false); - }; - - SocialCalc.EditorClearSheet = function (editor, cell_to_clear) { - //alert("clear"); - var cmdline; - var coord = cell_to_clear; - cmdline = "erase " + coord + " formulas"; - //console.log(cmdline); - editor.EditorScheduleSheetCommands(cmdline, true, false); - }; - - // - /* -// SocialCalc Number Formatting Library -// -// Part of the SocialCalc package. -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - - SocialCalc.FormatNumber = {}; - - SocialCalc.FormatNumber.format_definitions = {}; // Parsed formats are stored here globally - - // Most constants that are often customized for localization are in the SocialCalc.Constants module. - // If you use this module standalone, provide at least the "FormatNumber" values. - // - - // The following values may be customized externally for further localization of the format definitions themselves, - // but that would make them incompatible with other uses and is discouraged. - // - - SocialCalc.FormatNumber.separatorchar = ","; - SocialCalc.FormatNumber.decimalchar = "."; - SocialCalc.FormatNumber.daynames = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - ]; - SocialCalc.FormatNumber.daynames3 = [ - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - ]; - SocialCalc.FormatNumber.monthnames3 = [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - ]; - SocialCalc.FormatNumber.monthnames = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ]; - - SocialCalc.FormatNumber.allowedcolors = { - BLACK: "#000000", - BLUE: "#0000FF", - CYAN: "#00FFFF", - GREEN: "#00FF00", - MAGENTA: "#FF00FF", - RED: "#FF0000", - WHITE: "#FFFFFF", - YELLOW: "#FFFF00", - }; - - SocialCalc.FormatNumber.alloweddates = { - H: "h]", - M: "m]", - MM: "mm]", - S: "s]", - SS: "ss]", - }; - - // Other constants - - SocialCalc.FormatNumber.commands = { - copy: 1, - color: 2, - integer_placeholder: 3, - fraction_placeholder: 4, - decimal: 5, - currency: 6, - general: 7, - separator: 8, - date: 9, - comparison: 10, - section: 11, - style: 12, - }; - - SocialCalc.FormatNumber.datevalues = { - julian_offset: 2415019, - seconds_in_a_day: 24 * 60 * 60, - seconds_in_an_hour: 60 * 60, - }; - - /* ******************* - - result = SocialCalc.FormatNumber.formatNumberWithFormat = function(rawvalue, format_string, currency_char) - -************************* */ - - SocialCalc.FormatNumber.formatNumberWithFormat = function ( - rawvalue, - format_string, - currency_char - ) { - var scc = SocialCalc.Constants; - var scfn = SocialCalc.FormatNumber; - - var op, operandstr, fromend, cval, operandstrlc; - var startval, estartval; - var hrs, mins, secs, ehrs, emins, esecs, ampmstr, ymd; - var minOK, mpos; - var result = ""; - var thisformat; - var section, gotcomparison, compop, compval, cpos, oppos; - var sectioninfo; - var i, - decimalscale, - scaledvalue, - strvalue, - strparts, - integervalue, - fractionvalue; - var integerdigits2, - integerpos, - fractionpos, - textcolor, - textstyle, - separatorchar, - decimalchar; - var value; // working copy to change sign, etc. - var mspos; - rawvalue = rawvalue - 0; // make sure a number - value = rawvalue; - if (!isFinite(value)) return "NaN"; - - var negativevalue = value < 0 ? 1 : 0; // determine sign, etc. - if (negativevalue) value = -value; - var zerovalue = value == 0 ? 1 : 0; - - currency_char = currency_char || scc.FormatNumber_DefaultCurrency; - - scfn.parse_format_string(scfn.format_definitions, format_string); // make sure format is parsed - thisformat = scfn.format_definitions[format_string]; // Get format structure - - if (!thisformat) throw "Format not parsed error!"; - - section = thisformat.sectioninfo.length - 1; // get number of sections - 1 - - if (thisformat.hascomparison) { - // has comparisons - determine which section - section = 0; // set to which section we will use - gotcomparison = 0; // this section has no comparison - for (cpos = 0; ; cpos++) { - // scan for comparisons - op = thisformat.operators[cpos]; - operandstr = thisformat.operands[cpos]; // get next operator and operand - if (!op) { - // at end with no match - if (gotcomparison) { - // if comparison but no match - format_string = "General"; // use default of General - scfn.parse_format_string(scfn.format_definitions, format_string); - thisformat = scfn.format_definitions[format_string]; - section = 0; - } - break; // if no comparision, matches on this section - } - if (op == scfn.commands.section) { - // end of section - if (!gotcomparison) { - // no comparison, so it's a match - break; - } - gotcomparison = 0; - section++; // check out next one - continue; - } - if (op == scfn.commands.comparison) { - // found a comparison - do we meet it? - i = operandstr.indexOf(":"); - compop = operandstr.substring(0, i); - compval = operandstr.substring(i + 1) - 0; - if ( - (compop == "<" && rawvalue < compval) || - (compop == "<=" && rawvalue <= compval) || - (compop == "=" && rawvalue == compval) || - (compop == "<>" && rawvalue != compval) || - (compop == ">=" && rawvalue >= compval) || - (compop == ">" && rawvalue > compval) - ) { - // a match - break; - } - gotcomparison = 1; - } - } - } else if (section > 0) { - // more than one section (separated by ";") - if (section == 1) { - // two sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } else { - section = 0; // use first for all others - } - } else if (section == 2) { - // three sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } else if (zerovalue) { - section = 2; // use third section for zero values - } else { - section = 0; // use first for positive - } - } - } - - sectioninfo = thisformat.sectioninfo[section]; // look at values for our section - - if (sectioninfo.commas > 0) { - // scale by thousands - for (i = 0; i < sectioninfo.commas; i++) { - value /= 1000; - } - } - if (sectioninfo.percent > 0) { - // do percent scaling - for (i = 0; i < sectioninfo.percent; i++) { - value *= 100; - } - } - - decimalscale = 1; // cut down to required number of decimal digits - for (i = 0; i < sectioninfo.fractiondigits; i++) { - decimalscale *= 10; - } - scaledvalue = Math.floor(value * decimalscale + 0.5); - scaledvalue = scaledvalue / decimalscale; - - if (typeof scaledvalue != "number") return "NaN"; - if (!isFinite(scaledvalue)) return "NaN"; - - strvalue = scaledvalue + ""; // convert to string (Number.toFixed doesn't do all we need) - - // strvalue = value.toFixed(sectioninfo.fractiondigits); // cut down to required number of decimal digits - // and convert to string - - if ( - scaledvalue == 0 && - (sectioninfo.fractiondigits || sectioninfo.integerdigits) - ) { - negativevalue = 0; // no "-0" unless using multiple sections or General - } - - if (strvalue.indexOf("e") >= 0) { - // converted to scientific notation - return rawvalue + ""; // Just return plain converted raw value - } - - strparts = strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - if (!strparts) return "NaN"; // if not a number - integervalue = strparts[1]; - if (!integervalue || integervalue == "0") integervalue = ""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - - if (sectioninfo.hasdate) { - // there are date placeholders - if (rawvalue < 0) { - // bad date - return "??-???-?? ??:??:??"; - } - startval = - (rawvalue - Math.floor(rawvalue)) * scfn.datevalues.seconds_in_a_day; // get date/time parts - estartval = rawvalue * scfn.datevalues.seconds_in_a_day; // do elapsed time version, too - hrs = Math.floor(startval / scfn.datevalues.seconds_in_an_hour); - ehrs = Math.floor(estartval / scfn.datevalues.seconds_in_an_hour); - startval = startval - hrs * scfn.datevalues.seconds_in_an_hour; - mins = Math.floor(startval / 60); - emins = Math.floor(estartval / 60); - secs = startval - mins * 60; - decimalscale = 1; // round appropriately depending if there is ss.0 - for (i = 0; i < sectioninfo.fractiondigits; i++) { - decimalscale *= 10; - } - secs = Math.floor(secs * decimalscale + 0.5); - secs = secs / decimalscale; - esecs = Math.floor(estartval * decimalscale + 0.5); - esecs = esecs / decimalscale; - if (secs >= 60) { - // handle round up into next second, minute, etc. - secs = 0; - mins++; - emins++; - if (mins >= 60) { - mins = 0; - hrs++; - ehrs++; - if (hrs >= 24) { - hrs = 0; - rawvalue++; - } - } - } - fractionvalue = secs - Math.floor(secs) + ""; // for "hh:mm:ss.000" - fractionvalue = fractionvalue.substring(2); // skip "0." - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian( - Math.floor(rawvalue + scfn.datevalues.julian_offset) - ); - - minOK = 0; // says "m" can be minutes if true - var mspos = sectioninfo.sectionstart; // m scan position in ops - for (; ; mspos++) { - // scan for "m" and "mm" to see if any minutes fields, and am/pm - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op == scfn.commands.section) break; - if (op == scfn.commands.date) { - if ( - (operandstr.toLowerCase() == "am/pm" || - operandstr.toLowerCase() == "a/p") && - !ampmstr - ) { - if (hrs >= 12) { - hrs -= 12; - ampmstr = - operandstr.toLowerCase() == "a/p" - ? scc.s_FormatNumber_pm1 - : scc.s_FormatNumber_pm; // "P" : "PM"; - } else { - ampmstr = - operandstr.toLowerCase() == "a/p" - ? scc.s_FormatNumber_am1 - : scc.s_FormatNumber_am; // "A" : "AM"; - } - if (operandstr.indexOf(ampmstr) < 0) - ampmstr = ampmstr.toLowerCase(); // have case match case in format - } - if (minOK && (operandstr == "m" || operandstr == "mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr.charAt(0) == "h") { - minOK = 1; // m following h or hh or [h] is minutes not months - } else { - minOK = 0; - } - } else if (op != scfn.commands.copy) { - // copying chars can be between h and m - minOK = 0; - } - } - minOK = 0; - for (--mspos; ; mspos--) { - // scan other way for s after m - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op == scfn.commands.section) break; - if (op == scfn.commands.date) { - if (minOK && (operandstr == "m" || operandstr == "mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr == "ss") { - minOK = 1; // m before ss is minutes not months - } else { - minOK = 0; - } - } else if (op != scfn.commands.copy) { - // copying chars can be between ss and m - minOK = 0; - } - } - } - - integerdigits2 = 0; // init counters, etc. - integerpos = 0; - fractionpos = 0; - textcolor = ""; - textstyle = ""; - separatorchar = scc.FormatNumber_separatorchar; - if (separatorchar.indexOf(" ") >= 0) - separatorchar = separatorchar.replace(/ /g, " "); - decimalchar = scc.FormatNumber_decimalchar; - if (decimalchar.indexOf(" ") >= 0) - decimalchar = decimalchar.replace(/ /g, " "); - - oppos = sectioninfo.sectionstart; - - while ((op = thisformat.operators[oppos])) { - // execute format - operandstr = thisformat.operands[oppos++]; // get next operator and operand - - if (op == scfn.commands.copy) { - // put char in result - result += operandstr; - } else if (op == scfn.commands.color) { - // set color - textcolor = operandstr; - } else if (op == scfn.commands.style) { - // set style - textstyle = operandstr; - } else if (op == scfn.commands.integer_placeholder) { - // insert number part - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - integerdigits2++; - if (integerdigits2 == 1) { - // first one - if (integervalue.length > sectioninfo.integerdigits) { - // see if integer wider than field - for ( - ; - integerpos < integervalue.length - sectioninfo.integerdigits; - integerpos++ - ) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - } - if ( - integervalue.length < sectioninfo.integerdigits && - integerdigits2 <= sectioninfo.integerdigits - integervalue.length - ) { - // field is wider than value - if (operandstr == "0" || operandstr == "?") { - // fill with appropriate characters - result += operandstr == "0" ? "0" : " "; - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = sectioninfo.integerdigits - integerdigits2; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } else { - // normal integer digit - add it - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - integerpos++; - } - } else if (op == scfn.commands.fraction_placeholder) { - // add fraction part of number - if (fractionpos >= fractionvalue.length) { - if (operandstr == "0" || operandstr == "?") { - result += operandstr == "0" ? "0" : " "; - } - } else { - result += fractionvalue.charAt(fractionpos); - } - fractionpos++; - } else if (op == scfn.commands.decimal) { - // decimal point - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += decimalchar; - } else if (op == scfn.commands.currency) { - // currency symbol - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += operandstr; - } else if (op == scfn.commands.general) { - // insert "General" conversion - - // *** Cut down number of significant digits to avoid floating point artifacts: - - if (value != 0) { - // only if non-zero - var factor = Math.floor(Math.LOG10E * Math.log(value)); // get integer magnitude as a power of 10 - factor = Math.pow(10, 13 - factor); // turn into scaling factor - value = Math.floor(factor * value + 0.5) / factor; // scale positive value, round, undo scaling - if (!isFinite(value)) return "NaN"; - } - if (negativevalue) { - result += "-"; - } - strvalue = value + ""; // convert original value to string - if (strvalue.indexOf("e") >= 0) { - // converted to scientific notation - result += strvalue; - continue; - } - strparts = strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - integervalue = strparts[1]; - if (!integervalue || integervalue == "0") integervalue = ""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - integerpos = 0; - fractionpos = 0; - if (integervalue.length) { - for (; integerpos < integervalue.length; integerpos++) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { - // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } else { - result += "0"; - } - if (fractionvalue.length) { - result += decimalchar; - for (; fractionpos < fractionvalue.length; fractionpos++) { - result += fractionvalue.charAt(fractionpos); - } - } - } else if (op == scfn.commands.date) { - // date placeholder - operandstrlc = operandstr.toLowerCase(); - if (operandstrlc == "y" || operandstrlc == "yy") { - result += (ymd.year + "").substring(2); - } else if (operandstrlc == "yyyy") { - result += ymd.year + ""; - } else if (operandstrlc == "d") { - result += ymd.day + ""; - } else if (operandstrlc == "dd") { - cval = 1000 + ymd.day; - result += (cval + "").substr(2); - } else if (operandstrlc == "ddd") { - cval = Math.floor(rawvalue + 6) % 7; - result += scc.s_FormatNumber_daynames3[cval]; - } else if (operandstrlc == "dddd") { - cval = Math.floor(rawvalue + 6) % 7; - result += scc.s_FormatNumber_daynames[cval]; - } else if (operandstrlc == "m") { - result += ymd.month + ""; - } else if (operandstrlc == "mm") { - cval = 1000 + ymd.month; - result += (cval + "").substr(2); - } else if (operandstrlc == "mmm") { - result += scc.s_FormatNumber_monthnames3[ymd.month - 1]; - } else if (operandstrlc == "mmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month - 1]; - } else if (operandstrlc == "mmmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month - 1].charAt(0); - } else if (operandstrlc == "h") { - result += hrs + ""; - } else if (operandstrlc == "h]") { - result += ehrs + ""; - } else if (operandstrlc == "mmin") { - cval = 1000 + mins + ""; - result += cval.substr(2); - } else if (operandstrlc == "mm]") { - if (emins < 100) { - cval = 1000 + emins + ""; - result += cval.substr(2); - } else { - result += emins + ""; - } - } else if (operandstrlc == "min") { - result += mins + ""; - } else if (operandstrlc == "m]") { - result += emins + ""; - } else if (operandstrlc == "hh") { - cval = 1000 + hrs + ""; - result += cval.substr(2); - } else if (operandstrlc == "s") { - cval = Math.floor(secs); - result += cval + ""; - } else if (operandstrlc == "ss") { - cval = 1000 + Math.floor(secs) + ""; - result += cval.substr(2); - } else if (operandstrlc == "am/pm" || operandstrlc == "a/p") { - result += ampmstr; - } else if (operandstrlc == "ss]") { - if (esecs < 100) { - cval = 1000 + Math.floor(esecs) + ""; - result += cval.substr(2); - } else { - cval = Math.floor(esecs); - result += cval + ""; - } - } - } else if (op == scfn.commands.section) { - // end of section - break; - } else if (op == scfn.commands.comparison) { - // ignore - continue; - } else { - result += "!! Parse error !!"; - } - } - - if (textcolor) { - result = '' + result + ""; - } - if (textstyle) { - result = '' + result + ""; - } - - return result; - }; - - /* ******************* - - SocialCalc.FormatNumber.parse_format_string(format_defs, format_string) - - Takes a format string (e.g., "#,##0.00_);(#,##0.00)") and fills in format_defs with the parsed info - - format_defs - ["#,##0.0"]->{} - elements in the hash are one hash for each format - .operators->[] - array of operators from parsing the format string (each a number) - .operands->[] - array of corresponding operators (each usually a string) - .sectioninfo->[] - one hash for each section of the format - .start - .integerdigits - .fractiondigits - .commas - .percent - .thousandssep - .hasdates - .hascomparison - true if any section has [<100], etc. - -************************* */ - - SocialCalc.FormatNumber.parse_format_string = function ( - format_defs, - format_string - ) { - var scfn = SocialCalc.FormatNumber; - - var thisformat, section, sectionfinfo; - var integerpart = 1; // start out in integer part - var lastwasinteger; // last char was an integer placeholder - var lastwasslash; // last char was a backslash - escaping following character - var lastwasasterisk; // repeat next char - var lastwasunderscore; // last char was _ which picks up following char for width - var inquote, quotestr; // processing a quoted string - var inbracket, bracketstr, bracketdata; // processing a bracketed string - var ingeneral, gpos; // checks for characters "General" - var ampmstr, part; // checks for characters "A/P" and "AM/PM" - var indate; // keeps track of date/time placeholders - var chpos; // character position being looked at - var ch; // character being looked at - var sectioninfo; - - if (format_defs[format_string]) return; // already defined - nothing to do - - thisformat = { operators: [], operands: [], sectioninfo: [{}] }; // create info structure for this format - format_defs[format_string] = thisformat; // add to other format definitions - - section = 0; // start with section 0 - sectioninfo = thisformat.sectioninfo[section]; // get reference to info for current section - sectioninfo.sectionstart = 0; // position in operands that starts this section - sectioninfo.integerdigits = 0; // number of integer-part placeholders - sectioninfo.fractiondigits = 0; // fraction placeholders - sectioninfo.commas = 0; // commas encountered, to handle scaling - sectioninfo.percent = 0; // times to scale by 100 - - for (chpos = 0; chpos < format_string.length; chpos++) { - // parse - ch = format_string.charAt(chpos); // get next char to examine - if (inquote) { - if (ch == '"') { - inquote = 0; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(quotestr); - continue; - } - quotestr += ch; - continue; - } - if (inbracket) { - if (ch == "]") { - inbracket = 0; - bracketdata = - SocialCalc.FormatNumber.parse_format_bracket(bracketstr); - if (bracketdata.operator == scfn.commands.separator) { - sectioninfo.thousandssep = 1; // explicit [,] - continue; - } - if (bracketdata.operator == scfn.commands.date) { - sectioninfo.hasdate = 1; - } - if (bracketdata.operator == scfn.commands.comparison) { - thisformat.hascomparison = 1; - } - thisformat.operators.push(bracketdata.operator); - thisformat.operands.push(bracketdata.operand); - continue; - } - bracketstr += ch; - continue; - } - if (lastwasslash) { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - lastwasslash = false; - continue; - } - if (lastwasasterisk) { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch + ch + ch + ch + ch); // do 5 of them since no real tabs - lastwasasterisk = false; - continue; - } - if (lastwasunderscore) { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(" "); - lastwasunderscore = false; - continue; - } - if (ingeneral) { - if ("general".charAt(ingeneral) == ch.toLowerCase()) { - ingeneral++; - if (ingeneral == 7) { - thisformat.operators.push(scfn.commands.general); - thisformat.operands.push(ch); - ingeneral = 0; - } - continue; - } - ingeneral = 0; - } - if (indate) { - // last char was part of a date placeholder - if (indate.charAt(0) == ch) { - // another of the same char - indate += ch; // accumulate it - continue; - } - thisformat.operators.push(scfn.commands.date); // something else, save date info - thisformat.operands.push(indate); - sectioninfo.hasdate = 1; - indate = ""; - } - if (ampmstr) { - ampmstr += ch; - part = ampmstr.toLowerCase(); - if ( - part != "am/pm".substring(0, part.length) && - part != "a/p".substring(0, part.length) - ) { - ampstr = ""; - } else if (part == "am/pm" || part == "a/p") { - thisformat.operators.push(scfn.commands.date); - thisformat.operands.push(ampmstr); - ampmstr = ""; - } - continue; - } - if (ch == "#" || ch == "0" || ch == "?") { - // placeholder - if (integerpart) { - sectioninfo.integerdigits++; - if (sectioninfo.commas) { - // comma inside of integer placeholders - sectioninfo.thousandssep = 1; // any number is thousands separator - sectioninfo.commas = 0; // reset count of "thousand" factors - } - lastwasinteger = 1; - thisformat.operators.push(scfn.commands.integer_placeholder); - thisformat.operands.push(ch); - } else { - sectioninfo.fractiondigits++; - thisformat.operators.push(scfn.commands.fraction_placeholder); - thisformat.operands.push(ch); - } - } else if (ch == ".") { - // decimal point - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.decimal); - thisformat.operands.push(ch); - integerpart = 0; - } else if (ch == "$") { - // currency char - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.currency); - thisformat.operands.push(ch); - } else if (ch == ",") { - if (lastwasinteger) { - sectioninfo.commas++; - } else { - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } - } else if (ch == "%") { - lastwasinteger = 0; - sectioninfo.percent++; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } else if (ch == '"') { - lastwasinteger = 0; - inquote = 1; - quotestr = ""; - } else if (ch == "[") { - lastwasinteger = 0; - inbracket = 1; - bracketstr = ""; - } else if (ch == "\\") { - lastwasslash = 1; - lastwasinteger = 0; - } else if (ch == "*") { - lastwasasterisk = 1; - lastwasinteger = 0; - } else if (ch == "_") { - lastwasunderscore = 1; - lastwasinteger = 0; - } else if (ch == ";") { - section++; // start next section - thisformat.sectioninfo[section] = {}; // create a new section - sectioninfo = thisformat.sectioninfo[section]; // get reference to info for current section - sectioninfo.sectionstart = 1 + thisformat.operators.length; // remember where it starts - sectioninfo.integerdigits = 0; // number of integer-part placeholders - sectioninfo.fractiondigits = 0; // fraction placeholders - sectioninfo.commas = 0; // commas encountered, to handle scaling - sectioninfo.percent = 0; // times to scale by 100 - integerpart = 1; // reset for new section - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.section); - thisformat.operands.push(ch); - } else if (ch.toLowerCase() == "g") { - ingeneral = 1; - lastwasinteger = 0; - } else if (ch.toLowerCase() == "a") { - ampmstr = ch; - lastwasinteger = 0; - } else if ("dmyhHs".indexOf(ch) >= 0) { - indate = ch; - } else { - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } - } - - if (indate) { - // last char was part of unsaved date placeholder - thisformat.operators.push(scfn.commands.date); - thisformat.operands.push(indate); - sectioninfo.hasdate = 1; - } - - return; - }; - - /* ******************* - - bracketdata = SocialCalc.FormatNumber.parse_format_bracket(bracketstr) - - Takes a bracket contents (e.g., "RED", ">10") and returns an operator and operand - - bracketdata->{} - .operator - .operand - -************************* */ - - SocialCalc.FormatNumber.parse_format_bracket = function (bracketstr) { - var scfn = SocialCalc.FormatNumber; - var scc = SocialCalc.Constants; - - var bracketdata = {}; - var parts; - - if (bracketstr.charAt(0) == "$") { - // currency - bracketdata.operator = scfn.commands.currency; - parts = bracketstr.match(/^\$(.+?)(\-.+?){0,1}$/); - if (parts) { - bracketdata.operand = - parts[1] || scc.FormatNumber_defaultCurrency || "$"; - } else { - bracketdata.operand = - bracketstr.substring(1) || scc.FormatNumber_defaultCurrency || "$"; - } - } else if (bracketstr == "?$") { - bracketdata.operator = scfn.commands.currency; - bracketdata.operand = "[?$]"; - } else if (scfn.allowedcolors[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.color; - bracketdata.operand = scfn.allowedcolors[bracketstr.toUpperCase()]; - } else if ((parts = bracketstr.match(/^style=([^"]*)$/))) { - // [style=...] - bracketdata.operator = scfn.commands.style; - bracketdata.operand = parts[1]; - } else if (bracketstr == ",") { - bracketdata.operator = scfn.commands.separator; - bracketdata.operand = bracketstr; - } else if (scfn.alloweddates[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.date; - bracketdata.operand = scfn.alloweddates[bracketstr.toUpperCase()]; - } else if ((parts = bracketstr.match(/^[<>=]/))) { - // comparison operator - parts = bracketstr.match(/^([<>=]+)(.+)$/); // split operator and value - bracketdata.operator = scfn.commands.comparison; - bracketdata.operand = parts[1] + ":" + parts[2]; - } else { - // unknown bracket - bracketdata.operator = scfn.commands.copy; - bracketdata.operand = "[" + bracketstr + "]"; - } - - return bracketdata; - }; - - /* ******************* - - juliandate = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, month, day) - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - - I= YEAR - J= MONTH - K= DAY -C - JD= K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12) - 2 /12-3*((I+4900+(J-14)/12)/100)/4 - -************************* */ - - SocialCalc.FormatNumber.convert_date_gregorian_to_julian = function ( - year, - month, - day - ) { - var juliandate; - - juliandate = - day - - 32075 + - SocialCalc.intFunc( - (1461 * (year + 4800 + SocialCalc.intFunc((month - 14) / 12))) / 4 - ); - juliandate += SocialCalc.intFunc( - (367 * (month - 2 - SocialCalc.intFunc((month - 14) / 12) * 12)) / 12 - ); - juliandate = - juliandate - - SocialCalc.intFunc( - (3 * - SocialCalc.intFunc( - (year + 4900 + SocialCalc.intFunc((month - 14) / 12)) / 100 - )) / - 4 - ); - - return juliandate; - }; - - /* ******************* - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian(juliandate) - - ymd->{} - .year - .month - .day - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - -************************* */ - - SocialCalc.FormatNumber.convert_date_julian_to_gregorian = function ( - juliandate - ) { - var L, N, I, J, K; - - L = juliandate + 68569; - N = Math.floor((4 * L) / 146097); - L = L - Math.floor((146097 * N + 3) / 4); - I = Math.floor((4000 * (L + 1)) / 1461001); - L = L - Math.floor((1461 * I) / 4) + 31; - J = Math.floor((80 * L) / 2447); - K = L - Math.floor((2447 * J) / 80); - L = Math.floor(J / 11); - J = J + 2 - 12 * L; - I = 100 * (N - 49) + I + L; - - return { year: I, month: J, day: K }; - }; - - SocialCalc.intFunc = function (n) { - if (n < 0) { - return -Math.floor(-n); - } else { - return Math.floor(n); - } - }; - - // - /* -// SocialCalc Spreadsheet Formula Library -// -// Part of the SocialCalc package -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - // In any case, requires SocialCalc.Constants. - - SocialCalc.Formula = {}; - - // - // Formula constants for parsing: - // - - SocialCalc.Formula.ParseState = { - num: 1, - alpha: 2, - coord: 3, - string: 4, - stringquote: 5, - numexp1: 6, - numexp2: 7, - alphanumeric: 8, - specialvalue: 9, - }; - - SocialCalc.Formula.TokenType = { - num: 1, - coord: 2, - op: 3, - name: 4, - error: 5, - string: 6, - space: 7, - }; - - SocialCalc.Formula.CharClass = { - num: 1, - numstart: 2, - op: 3, - eof: 4, - alpha: 5, - incoord: 6, - error: 7, - quote: 8, - space: 9, - specialstart: 10, - }; - - SocialCalc.Formula.CharClassTable = { - " ": 9, - "!": 3, - '"': 8, - "#": 10, - $: 6, - "%": 3, - "&": 3, - "(": 3, - ")": 3, - "*": 3, - "+": 3, - ",": 3, - "-": 3, - ".": 2, - "/": 3, - 0: 1, - 1: 1, - 2: 1, - 3: 1, - 4: 1, - 5: 1, - 6: 1, - 7: 1, - 8: 1, - 9: 1, - ":": 3, - "<": 3, - "=": 3, - ">": 3, - A: 5, - B: 5, - C: 5, - D: 5, - E: 5, - F: 5, - G: 5, - H: 5, - I: 5, - J: 5, - K: 5, - L: 5, - M: 5, - N: 5, - O: 5, - P: 5, - Q: 5, - R: 5, - S: 5, - T: 5, - U: 5, - V: 5, - W: 5, - X: 5, - Y: 5, - Z: 5, - "^": 3, - _: 5, - a: 5, - b: 5, - c: 5, - d: 5, - e: 5, - f: 5, - g: 5, - h: 5, - i: 5, - j: 5, - k: 5, - l: 5, - m: 5, - n: 5, - o: 5, - p: 5, - q: 5, - r: 5, - s: 5, - t: 5, - u: 5, - v: 5, - w: 5, - x: 5, - y: 5, - z: 5, - }; - - SocialCalc.Formula.UpperCaseTable = { - a: "A", - b: "B", - c: "C", - d: "D", - e: "E", - f: "F", - g: "G", - h: "H", - i: "I", - j: "J", - k: "K", - l: "L", - m: "M", - n: "N", - o: "O", - p: "P", - q: "Q", - r: "R", - s: "S", - t: "T", - u: "U", - v: "V", - w: "W", - x: "X", - y: "Y", - z: "Z", - }; - - SocialCalc.Formula.SpecialConstants = { - // names that turn into constants for name lookup - "#NULL!": "0,e#NULL!", - "#NUM!": "0,e#NUM!", - "#DIV/0!": "0,e#DIV/0!", - "#VALUE!": "0,e#VALUE!", - "#REF!": "0,e#REF!", - "#NAME?": "0,e#NAME?", - }; - - // Operator Precedence table - // - // 1- !, 2- : ,, 3- M P, 4- %, 5- ^, 6- * /, 7- + -, 8- &, 9- < > = G(>=) L(<=) N(<>), - // Negative value means Right Associative - - SocialCalc.Formula.TokenPrecedence = { - "!": 1, - ":": 2, - ",": 2, - M: -3, - P: -3, - "%": 4, - "^": 5, - "*": 6, - "/": 6, - "+": 7, - "-": 7, - "&": 8, - "<": 9, - ">": 9, - G: 9, - L: 9, - N: 9, - }; - - // Convert one-char token text to input text: - - SocialCalc.Formula.TokenOpExpansion = { - G: ">=", - L: "<=", - M: "-", - N: "<>", - P: "+", - }; - - // - // Information about the resulting value types when doing operations on values (used by LookupResultType) - // - // Each object entry is an object with specific types with result type info as follows: - // - // 'type1a': '|type2a:resulta|type2b:resultb|... - // Type of t* or n* matches any of those types not listed - // Results may be a type or the numbers 1 or 2 specifying to return type1 or type2 - - SocialCalc.Formula.TypeLookupTable = { - unaryminus: { - "n*": "|n*:1|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - unaryplus: { - "n*": "|n*:1|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - unarypercent: { - "n*": "|n:n%|n*:n|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - plus: { - "n%": "|n%:n%|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - nd: "|n%:n|nd:nd|nt:ndt|ndt:ndt|n$:n|n:nd|n*:n|b:n|e*:2|t*:e#VALUE!|", - nt: "|n%:n|nd:ndt|nt:nt|ndt:ndt|n$:n|n:nt|n*:n|b:n|e*:2|t*:e#VALUE!|", - ndt: "|n%:n|nd:ndt|nt:ndt|ndt:ndt|n$:n|n:ndt|n*:n|b:n|e*:2|t*:e#VALUE!|", - n$: "|n%:n|nd:n|nt:n|ndt:n|n$:n$|n:n$|n*:n|b:n|e*:2|t*:e#VALUE!|", - nl: "|n%:n|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - n: "|n%:n|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - b: "|n%:n%|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|", - "t*": "|n*:e#VALUE!|t*:e#VALUE!|b:e#VALUE!|e*:2|", - "e*": "|e*:1|n*:1|t*:1|b:1|", - }, - concat: { - t: "|t:t|th:th|tw:tw|tl:t|t*:2|e*:2|", - th: "|t:th|th:th|tw:t|tl:th|t*:t|e*:2|", - tw: "|t:tw|th:t|tw:tw|tl:tw|t*:t|e*:2|", - tl: "|t:tl|th:th|tw:tw|tl:tl|t*:t|e*:2|", - "e*": "|e*:1|n*:1|t*:1|", - }, - oneargnumeric: { - "n*": "|n*:n|", - "e*": "|e*:1|", - "t*": "|t*:e#VALUE!|", - b: "|b:n|", - }, - twoargnumeric: { - "n*": "|n*:n|t*:e#VALUE!|e*:2|", - "e*": "|e*:1|n*:1|t*:1|", - "t*": "|t*:e#VALUE!|n*:e#VALUE!|e*:2|", - }, - propagateerror: { - "n*": "|n*:2|e*:2|", - "e*": "|e*:2|", - "t*": "|t*:2|e*:2|", - b: "|b:2|e*:2|", - }, - }; - - /* ******************* - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(line) - - Parses a text string as if it was a spreadsheet formula - - This uses a simple state machine run on each character in turn. - States remember whether a number is being gathered, etc. - The result is parseinfo which is an array with one entry for each token: - parseinfo[i] = { - text: "the characters making up the parsed token", - type: the type of the token (a number), - opcode: a single character version of an operator suitable for use in the - precedence table and distinguishing between unary and binary + and -. - -************************* */ - - SocialCalc.Formula.ParseFormulaIntoTokens = function (line) { - var i, - ch, - chclass, - haddecimal, - last_token, - last_token_type, - last_token_text, - t; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var parsestate = scf.ParseState; - var tokentype = scf.TokenType; - var charclass = scf.CharClass; - var charclasstable = scf.CharClassTable; - var uppercasetable = scf.UpperCaseTable; // much faster than toUpperCase function - var pushtoken = scf.ParsePushToken; - var coordregex = /^\$?[A-Z]{1,2}\$?[1-9]\d*$/i; - - var parseinfo = []; - var str = ""; - var state = 0; - var haddecimal = false; - var cclass; - - for (i = 0; i <= line.length; i++) { - if (i < line.length) { - ch = line.charAt(i); - cclass = charclasstable[ch]; - } else { - ch = ""; - cclass = charclass.eof; - } - - if (state == parsestate.num) { - if (cclass == charclass.num) { - str += ch; - } else if (cclass == charclass.numstart && !haddecimal) { - haddecimal = true; - str += ch; - } else if (ch == "E" || ch == "e") { - str += ch; - haddecimal = false; - state = parsestate.numexp1; - } else { - // end of number - save it - pushtoken(parseinfo, str, tokentype.num, 0); - haddecimal = false; - state = 0; - } - } - - if (state == parsestate.numexp1) { - if (cclass == parsestate.num) { - state = parsestate.numexp2; - } else if ( - (ch == "+" || ch == "-") && - uppercasetable[str.charAt(str.length - 1)] == "E" - ) { - str += ch; - } else if (ch == "E" || ch == "e") { - } else { - pushtoken(parseinfo, scc.s_parseerrexponent, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.numexp2) { - if (cclass == charclass.num) { - str += ch; - } else { - // end of number - save it - pushtoken(parseinfo, str, tokentype.num, 0); - state = 0; - } - } - - if (state == parsestate.alpha) { - if (cclass == charclass.num) { - state = parsestate.coord; - } else if (cclass == charclass.alpha || ch == ".") { - // alpha may be letters, numbers, "_", or "." - str += ch; - } else if (cclass == charclass.incoord) { - state = parsestate.coord; - } else if ( - cclass == charclass.op || - cclass == charclass.numstart || - cclass == charclass.space || - cclass == charclass.eof - ) { - pushtoken(parseinfo, str.toUpperCase(), tokentype.name, 0); - state = 0; - } else { - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.coord) { - if (cclass == charclass.num) { - str += ch; - } else if (cclass == charclass.incoord) { - str += ch; - } else if (cclass == charclass.alpha) { - state = parsestate.alphanumeric; - } else if ( - cclass == charclass.op || - cclass == charclass.numstart || - cclass == charclass.eof || - cclass == charclass.space - ) { - if (coordregex.test(str)) { - t = tokentype.coord; - } else { - t = tokentype.name; - } - pushtoken(parseinfo, str.toUpperCase(), t, 0); - state = 0; - } else { - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.alphanumeric) { - if (cclass == charclass.num || cclass == charclass.alpha) { - str += ch; - } else if ( - cclass == charclass.op || - cclass == charclass.numstart || - cclass == charclass.space || - cclass == charclass.eof - ) { - pushtoken(parseinfo, str.toUpperCase(), tokentype.name, 0); - state = 0; - } else { - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - state = 0; - } - } - - if (state == parsestate.string) { - if (cclass == charclass.quote) { - state = parsestate.stringquote; // got quote in string: is it doubled (quote in string) or by itself (end of string)? - } else if (cclass == charclass.eof) { - pushtoken(parseinfo, scc.s_parseerrstring, tokentype.error, 0); - state = 0; - } else { - str += ch; - } - } else if (state == parsestate.stringquote) { - // note else if here - if (cclass == charclass.quote) { - str += '"'; - state = parsestate.string; // double quote: add one then continue getting string - } else { - // something else -- end of string - pushtoken(parseinfo, str, tokentype.string, 0); - state = 0; // drop through to process - } - } else if (state == parsestate.specialvalue) { - // special values like #REF! - if (str.charAt(str.length - 1) == "!") { - // done - save value as a name - pushtoken(parseinfo, str, tokentype.name, 0); - state = 0; // drop through to process - } else if (cclass == charclass.eof) { - pushtoken(parseinfo, scc.s_parseerrspecialvalue, tokentype.error, 0); - state = 0; - } else { - str += ch; - } - } - - if (state == 0) { - if (cclass == charclass.num) { - str = ch; - state = parsestate.num; - } else if (cclass == charclass.numstart) { - str = ch; - haddecimal = true; - state = parsestate.num; - } else if (cclass == charclass.alpha || cclass == charclass.incoord) { - str = ch; - state = parsestate.alpha; - } else if (cclass == charclass.specialstart) { - str = ch; - state = parsestate.specialvalue; - } else if (cclass == charclass.op) { - str = ch; - if (parseinfo.length > 0) { - last_token = parseinfo[parseinfo.length - 1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - if (last_token_type == charclass.op) { - if (last_token_text == "<" || last_token_text == ">") { - str = last_token_text + str; - parseinfo.pop(); - if (parseinfo.length > 0) { - last_token = parseinfo[parseinfo.length - 1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - } else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - } - } - } else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - t = tokentype.op; - if ( - parseinfo.length == 0 || - (last_token_type == charclass.op && - last_token_text != ")" && - last_token_text != "%") - ) { - // Unary operator - if (str == "-") { - // M is unary minus - str = "M"; - ch = "M"; - } else if (str == "+") { - // P is unary plus - str = "P"; - ch = "P"; - } else if (str == ")" && last_token_text == "(") { - // null arg list OK - } else if (str != "(") { - // binary-op open-paren OK, others no - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } else if (str.length > 1) { - if (str == ">=") { - // G is >= - str = "G"; - ch = "G"; - } else if (str == "<=") { - // L is <= - str = "L"; - ch = "L"; - } else if (str == "<>") { - // N is <> - str = "N"; - ch = "N"; - } else { - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } - pushtoken(parseinfo, str, t, ch); - state = 0; - } else if (cclass == charclass.quote) { - // starting a string - str = ""; - state = parsestate.string; - } else if (cclass == charclass.space) { - // store so can reconstruct spacing - pushtoken(parseinfo, " ", tokentype.space, 0); - } else if (cclass == charclass.eof) { - // ignore -- needed to have extra loop to close out other things - } else { - // unknown class - such as unknown char - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - } - } - } - - return parseinfo; - }; - - SocialCalc.Formula.ParsePushToken = function ( - parseinfo, - ttext, - ttype, - topcode - ) { - parseinfo.push({ text: ttext, type: ttype, opcode: topcode }); - }; - - /* ******************* - - result = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, allowrangereturn) - - Does the calculation expressed in a parsed formula, returning a value, its type, and error info - returns: {value: value, type: valuetype, error: errortext}. - - If allowrangereturn is present and true, can return a range (e.g., "A1:A10" - translated from "A1|A10|") - -************************* */ - - SocialCalc.Formula.evaluate_parsed_formula = function ( - parseinfo, - sheet, - allowrangereturn - ) { - var result; - - var scf = SocialCalc.Formula; - var tokentype = scf.TokenType; - - var revpolish; - var parsestack = []; - - var errortext = ""; - - revpolish = scf.ConvertInfixToPolish(parseinfo); // result is either an array or a string with error text - - result = scf.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn); - - return result; - }; - - // - // revpolish = SocialCalc.Formula.ConvertInfixToPolish(parseinfo) - // - // Convert infix to reverse polish notation - // - // Returns revpolish array with a sequence of references to tokens by number if successful. - // Errors return a string with the error. - // - // Based upon the algorithm shown in Wikipedia "Reverse Polish notation" article - // and then enhanced for additional spreadsheet things - // - - SocialCalc.Formula.ConvertInfixToPolish = function (parseinfo) { - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var token_precedence = scf.TokenPrecedence; - - var revpolish = []; - var parsestack = []; - - var errortext = ""; - - var function_start = -1; - - var i, pii, ttype, ttext, tprecedence, tstackprecedence; - - for (i = 0; i < parseinfo.length; i++) { - pii = parseinfo[i]; - ttype = pii.type; - ttext = pii.text; - if ( - ttype == tokentype.num || - ttype == tokentype.coord || - ttype == tokentype.string - ) { - revpolish.push(i); - } else if (ttype == tokentype.name) { - parsestack.push(i); - revpolish.push(function_start); - } else if (ttype == tokentype.space) { - // ignore - continue; - } else if (ttext == ",") { - while ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].text != "(" - ) { - revpolish.push(parsestack.pop()); - } - if (parsestack.length == 0) { - // no ( -- error - errortext = scc.s_parseerrmissingopenparen; - break; - } - } else if (ttext == "(") { - parsestack.push(i); - } else if (ttext == ")") { - while ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].text != "(" - ) { - revpolish.push(parsestack.pop()); - } - if (parsestack.length == 0) { - // no ( -- error - errortext = scc.s_parseerrcloseparennoopen; - break; - } - parsestack.pop(); - if ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].type == tokentype.name - ) { - revpolish.push(parsestack.pop()); - } - } else if (ttype == tokentype.op) { - if ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].type == tokentype.name - ) { - revpolish.push(parsestack.pop()); - } - while ( - parsestack.length && - parseinfo[parsestack[parsestack.length - 1]].type == tokentype.op && - parseinfo[parsestack[parsestack.length - 1]].text != "(" - ) { - tprecedence = token_precedence[pii.opcode]; - tstackprecedence = - token_precedence[ - parseinfo[parsestack[parsestack.length - 1]].opcode - ]; - if (tprecedence >= 0 && tprecedence < tstackprecedence) { - break; - } else if (tprecedence < 0) { - tprecedence = -tprecedence; - if (tstackprecedence < 0) tstackprecedence = -tstackprecedence; - if (tprecedence <= tstackprecedence) { - break; - } - } - revpolish.push(parsestack.pop()); - } - parsestack.push(i); - } else if (ttype == tokentype.error) { - errortext = ttext; - break; - } else { - errortext = "Internal error while processing parsed formula. "; - break; - } - } - while (parsestack.length > 0) { - if (parseinfo[parsestack[parsestack.length - 1]].text == "(") { - errortext = scc.s_parseerrmissingcloseparen; - break; - } - revpolish.push(parsestack.pop()); - } - - if (errortext) { - return errortext; - } - - return revpolish; - }; - - // - // result = SocialCalc.Formula.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn) - // - // Execute reverse polish representation of formula - // - // Operand values are objects in the operand array with a "type" and an optional "value". - // Type can have these values (many are type and sub-type as two or more letters): - // "tw", "th", "t", "n", "nt", "coord", "range", "start", "eErrorType", "b" (blank) - // The value of a coord is in the form A57 or A57!sheetname - // The value of a range is coord|coord|number where number starts at 0 and is - // the offset of the next item to fetch if you are going through the range one by one - // The number starts as a null string ("A1|B3|") - // - - SocialCalc.Formula.EvaluatePolish = function ( - parseinfo, - revpolish, - sheet, - allowrangereturn - ) { - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var lookup_result_type = scf.LookupResultType; - var typelookup = scf.TypeLookupTable; - var operand_as_number = scf.OperandAsNumber; - var operand_as_text = scf.OperandAsText; - var operand_value_and_type = scf.OperandValueAndType; - var operands_as_coord_on_sheet = scf.OperandsAsCoordOnSheet; - var format_number_for_display = - SocialCalc.format_number_for_display || - function (v, t, f) { - return v + ""; - }; - - var errortext = ""; - var function_start = -1; - var missingOperandError = { - value: "", - type: "e#VALUE!", - error: scc.s_parseerrmissingoperand, - }; - var value; - - var operand = []; - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - var i, - rii, - prii, - ttype, - ttext, - value1, - value2, - tostype, - tostype2, - resulttype, - valuetype, - cond, - vmatch, - smatch; - - if (!parseinfo.length || !(revpolish instanceof Array)) { - return { - value: "", - type: "e#VALUE!", - error: typeof revpolish == "string" ? revpolish : "", - }; - } - - for (i = 0; i < revpolish.length; i++) { - rii = revpolish[i]; - if (rii == function_start) { - // Remember the start of a function argument list - PushOperand("start", 0); - continue; - } - - prii = parseinfo[rii]; - ttype = prii.type; - ttext = prii.text; - - if (ttype == tokentype.num) { - PushOperand("n", ttext - 0); - } else if (ttype == tokentype.coord) { - PushOperand("coord", ttext); - } else if (ttype == tokentype.string) { - PushOperand("t", ttext); - } else if (ttype == tokentype.op) { - if (operand.length <= 0) { - // Nothing on the stack... - return missingOperandError; - break; // done - } - - // Unary minus - - if (ttext == "M") { - value1 = operand_as_number(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.unaryminus - ); - PushOperand(resulttype, -value1.value); - } - - // Unary plus - else if (ttext == "P") { - value1 = operand_as_number(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.unaryplus - ); - PushOperand(resulttype, value1.value); - } - - // Unary % - percent, left associative - else if (ttext == "%") { - value1 = operand_as_number(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.unarypercent - ); - PushOperand(resulttype, 0.01 * value1.value); - } - - // & - string concatenate - else if (ttext == "&") { - if (operand.length <= 1) { - // Need at least two things on the stack... - return missingOperandError; - } - value2 = operand_as_text(sheet, operand); - value1 = operand_as_text(sheet, operand); - resulttype = lookup_result_type( - value1.type, - value1.type, - typelookup.concat - ); - PushOperand(resulttype, value1.value + value2.value); - } - - // : - Range constructor - else if (ttext == ":") { - if (operand.length <= 1) { - // Need at least two things on the stack... - return missingOperandError; - } - value1 = scf.OperandsAsRangeOnSheet(sheet, operand); // get coords even if use name on other sheet - if (value1.error) { - // not available - errortext = errortext || value1.error; - } - PushOperand(value1.type, value1.value); // push sheetname with range on that sheet - } - - // ! - sheetname!coord - else if (ttext == "!") { - if (operand.length <= 1) { - // Need at least two things on the stack... - return missingOperandError; - } - value1 = operands_as_coord_on_sheet(sheet, operand); // get coord even if name on other sheet - if (value1.error) { - // not available - errortext = errortext || value1.error; - } - PushOperand(value1.type, value1.value); // push sheetname with coord or range on that sheet - } - - // Comparison operators: < L = G > N (< <= = >= > <>) - else if ( - ttext == "<" || - ttext == "L" || - ttext == "=" || - ttext == "G" || - ttext == ">" || - ttext == "N" - ) { - if (operand.length <= 1) { - // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_value_and_type(sheet, operand); - value1 = operand_value_and_type(sheet, operand); - if (value1.type.charAt(0) == "n" && value2.type.charAt(0) == "n") { - // compare two numbers - cond = 0; - if (ttext == "<") { - cond = value1.value < value2.value ? 1 : 0; - } else if (ttext == "L") { - cond = value1.value <= value2.value ? 1 : 0; - } else if (ttext == "=") { - cond = value1.value == value2.value ? 1 : 0; - } else if (ttext == "G") { - cond = value1.value >= value2.value ? 1 : 0; - } else if (ttext == ">") { - cond = value1.value > value2.value ? 1 : 0; - } else if (ttext == "N") { - cond = value1.value != value2.value ? 1 : 0; - } - PushOperand("nl", cond); - } else if (value1.type.charAt(0) == "e") { - // error on left - PushOperand(value1.type, 0); - } else if (value2.type.charAt(0) == "e") { - // error on right - PushOperand(value2.type, 0); - } else { - // text maybe mixed with numbers or blank - tostype = value1.type.charAt(0); - tostype2 = value2.type.charAt(0); - if (tostype == "n") { - value1.value = format_number_for_display(value1.value, "n", ""); - } else if (tostype == "b") { - value1.value = ""; - } - if (tostype2 == "n") { - value2.value = format_number_for_display(value2.value, "n", ""); - } else if (tostype2 == "b") { - value2.value = ""; - } - cond = 0; - value1.value = value1.value.toLowerCase(); // ignore case - value2.value = value2.value.toLowerCase(); - if (ttext == "<") { - cond = value1.value < value2.value ? 1 : 0; - } else if (ttext == "L") { - cond = value1.value <= value2.value ? 1 : 0; - } else if (ttext == "=") { - cond = value1.value == value2.value ? 1 : 0; - } else if (ttext == "G") { - cond = value1.value >= value2.value ? 1 : 0; - } else if (ttext == ">") { - cond = value1.value > value2.value ? 1 : 0; - } else if (ttext == "N") { - cond = value1.value != value2.value ? 1 : 0; - } - PushOperand("nl", cond); - } - } - - // Normal infix arithmethic operators: +, -. *, /, ^ - else { - // what's left are the normal infix arithmetic operators - if (operand.length <= 1) { - // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_as_number(sheet, operand); - value1 = operand_as_number(sheet, operand); - if (ttext == "+") { - resulttype = lookup_result_type( - value1.type, - value2.type, - typelookup.plus - ); - PushOperand(resulttype, value1.value + value2.value); - } else if (ttext == "-") { - resulttype = lookup_result_type( - value1.type, - value2.type, - typelookup.plus - ); - PushOperand(resulttype, value1.value - value2.value); - } else if (ttext == "*") { - resulttype = lookup_result_type( - value1.type, - value2.type, - typelookup.plus - ); - PushOperand(resulttype, value1.value * value2.value); - } else if (ttext == "/") { - if (value2.value != 0) { - PushOperand("n", value1.value / value2.value); // gives plain numeric result type - } else { - PushOperand("e#DIV/0!", 0); - } - } else if (ttext == "^") { - value1.value = Math.pow(value1.value, value2.value); - value1.type = "n"; // gives plain numeric result type - if (isNaN(value1.value)) { - value1.value = 0; - value1.type = "e#NUM!"; - } - PushOperand(value1.type, value1.value); - } - } - } - - // function or name - else if (ttype == tokentype.name) { - errortext = scf.CalculateFunction(ttext, operand, sheet); - if (errortext) break; - } else { - errortext = - scc.s_InternalError + "Unknown token " + ttype + " (" + ttext + "). "; - break; - } - } - - // look at final value and handle special cases - - value = operand[0] ? operand[0].value : ""; - tostype = operand[0] ? operand[0].type : ""; - - if (tostype == "name") { - // name - expand it - value1 = SocialCalc.Formula.LookupName(sheet, value); - value = value1.value; - tostype = value1.type; - errortext = errortext || value1.error; - } - - if (tostype == "coord") { - // the value is a coord reference, get its value and type - value1 = operand_value_and_type(sheet, operand); - value = value1.value; - tostype = value1.type; - if (tostype == "b") { - tostype = "n"; - value = 0; - } - } - - if (operand.length > 1 && !errortext) { - // something left - error - errortext += scc.s_parseerrerrorinformula; - } - - // set return type - - valuetype = tostype; - - if (tostype.charAt(0) == "e") { - // error value - errortext = - errortext || tostype.substring(1) || scc.s_calcerrerrorvalueinformula; - } else if (tostype == "range") { - vmatch = value.match(/^(.*)\|(.*)\|/); - smatch = vmatch[1].indexOf("!"); - if (smatch >= 0) { - // swap sheetname - vmatch[1] = - vmatch[1].substring(smatch + 1) + - "!" + - vmatch[1].substring(0, smatch).toUpperCase(); - } else { - vmatch[1] = vmatch[1].toUpperCase(); - } - value = vmatch[1] + ":" + vmatch[2].toUpperCase(); - if (!allowrangereturn) { - errortext = scc.s_formularangeresult + " " + value; - } - } - - if (errortext && valuetype.charAt(0) != "e") { - value = errortext; - valuetype = "e"; - } - - // look for overflow - - if (valuetype.charAt(0) == "n" && (isNaN(value) || !isFinite(value))) { - value = 0; - valuetype = "e#NUM!"; - errortext = isNaN(value) - ? scc.s_calcerrnumericnan - : scc.s_calcerrnumericoverflow; - } - - return { value: value, type: valuetype, error: errortext }; - }; - - /* -# -# resulttype = SocialCalc.Formula.LookupResultType(type1, type2, typelookup); -# -# typelookup has values of the following form: -# -# typelookup{"typespec1"} = "|typespec2A:resultA|typespec2B:resultB|..." -# -# First type1 is looked up. If no match, then the first letter (major type) of type1 plus "*" is looked up -# resulttype is type1 if result is "1", type2 if result is "2", otherwise the value of result. -# -*/ - - SocialCalc.Formula.LookupResultType = function (type1, type2, typelookup) { - var pos1, pos2, result; - - var table1 = typelookup[type1]; - - if (!table1) { - table1 = typelookup[type1.charAt(0) + "*"]; - if (!table1) { - return ( - "e#VALUE! (internal error, missing LookupResultType " + - type1.charAt(0) + - "*)" - ); // missing from table -- please add it - } - } - pos1 = table1.indexOf("|" + type2 + ":"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1 + 1); - if (pos2 < 0) - return ( - "e#VALUE! (internal error, incorrect LookupResultType " + table1 + ")" - ); - result = table1.substring(pos1 + type2.length + 2, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - pos1 = table1.indexOf("|" + type2.charAt(0) + "*:"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1 + 1); - if (pos2 < 0) - return ( - "e#VALUE! (internal error, incorrect LookupResultType " + table1 + ")" - ); - result = table1.substring(pos1 + 4, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - return "e#VALUE!"; - }; - - /* -# -# operandinfo = SocialCalc.Formula.TopOfStackValueAndType(sheet, operand) -# -# Returns top of stack value and type and then pops the stack. -# The result is {value: value, type: type, error: "only if bad error"} -# -*/ - - SocialCalc.Formula.TopOfStackValueAndType = function (sheet, operand) { - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - if (!stacklen) { - // make sure something is there - result.error = - SocialCalc.Constants.s_InternalError + "no operand on stack"; - return result; - } - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - return result; - }; - - /* -# -# operandinfo = OperandAsNumber(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns numeric value and type. -# Text values are treated as 0 if they can't be converted somehow. -# -*/ - - SocialCalc.Formula.OperandAsNumber = function (sheet, operand) { - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "n") { - operandinfo.value = operandinfo.value - 0; - } else if (t == "b") { - // blank cell - operandinfo.type = "n"; - operandinfo.value = 0; - } else if (t == "e") { - // error - operandinfo.value = 0; - } else { - valueinfo = SocialCalc.DetermineValueType - ? SocialCalc.DetermineValueType(operandinfo.value) - : { value: operandinfo.value - 0, type: "n" }; // if without rest of SocialCalc - if (valueinfo.type.charAt(0) == "n") { - operandinfo.value = valueinfo.value - 0; - operandinfo.type = valueinfo.type; - } else { - operandinfo.value = 0; - operandinfo.type = valueinfo.type; - } - } - - return operandinfo; - }; - - /* -# -# operandinfo = OperandAsText(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns text value, preserving sub-type. -# -*/ - - SocialCalc.Formula.OperandAsText = function (sheet, operand) { - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "t") { - // any flavor of text returns as is - } else if (t == "n") { - operandinfo.value = SocialCalc.format_number_for_display - ? SocialCalc.format_number_for_display( - operandinfo.value, - operandinfo.type, - "" - ) - : (operandinfo.value = operandinfo.value + ""); - operandinfo.type = "t"; - } else if (t == "b") { - // blank - operandinfo.value = ""; - operandinfo.type = "t"; - } else if (t == "e") { - // error - operandinfo.value = ""; - } else { - operand.value = operandinfo.value + ""; - operand.type = "t"; - } - - return operandinfo; - }; - - /* -# -# result = SocialCalc.Formula.OperandValueAndType(sheet, operand) -# -# Pops the top of stack and returns it, following a coord reference if necessary. -# The result is {value: value, type: type, error: "only if bad error"} -# Ranges are returned as if they were pushed onto the stack first coord first -# Also sets type with "t", "n", "th", etc., as appropriate -# -*/ - - SocialCalc.Formula.OperandValueAndType = function (sheet, operand) { - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - if (!stacklen) { - // make sure something is there - result.error = - SocialCalc.Constants.s_InternalError + "no operand on stack"; - return result; - } - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - if (result.type == "range") { - result = scf.StepThroughRangeDown(operand, result.value); - } - - if (result.type == "coord") { - // value is a coord reference - coordsheet = sheet; - pos = result.value.indexOf("!"); - if (pos != -1) { - // sheet reference - coordsheet = scf.FindInSheetCache(result.value.substring(pos + 1)); // get other sheet - if (coordsheet == null) { - // unavailable - result.type = "e#REF!"; - result.error = - SocialCalc.Constants.s_sheetunavailable + - " " + - result.value.substring(pos + 1); - result.value = 0; - return result; - } - result.value = result.value.substring(0, pos); // get coord part - } - - if (coordsheet) { - cell = coordsheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - cellvtype = cell.valuetype; // get type of value in the cell it points to - result.value = cell.datavalue; - } else { - cellvtype = "b"; - } - } else { - cellvtype = "e#N/A"; - result.value = 0; - } - result.type = cellvtype || "b"; - if (result.type == "b") { - // blank - result.value = 0; - } - } - - return result; - }; - - /* -# -# operandinfo = SocialCalc.Formula.OperandAsCoord(sheet, operand) -# -# Gets top of stack and pops it. -# Returns coord value. All others are treated as an error. -# -*/ - - SocialCalc.Formula.OperandAsCoord = function (sheet, operand) { - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - result = SocialCalc.Formula.LookupName(sheet, result.value); - } - if (result.type == "coord") { - // value is a coord reference - return result; - } else { - result.value = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - return result; - } - }; - - /* -# -# result = SocialCalc.Formula.OperandsAsCoordOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as sheetname!coord-or-name. -# Returns stack-style coord value (coord!sheetname, or coord!sheetname|coord|) with -# a type of coord or range. All others are treated as an error. -# If sheetname not available, sets result.error. -# -*/ - - SocialCalc.Formula.OperandsAsCoordOnSheet = function (sheet, operand) { - var sheetname, othersheet, pos1, pos2; - var value1 = {}; - var result = {}; - var scf = SocialCalc.Formula; - - var stacklen = operand.length; - value1.value = operand[stacklen - 1].value; // get top of stack - coord or name - value1.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - sheetname = scf.OperandAsSheetName(sheet, operand); // get sheetname as text - othersheet = scf.FindInSheetCache(sheetname.value); - if (othersheet == null) { - // unavailable - result.type = "e#REF!"; - result.value = 0; - result.error = - SocialCalc.Constants.s_sheetunavailable + " " + sheetname.value; - return result; - } - - if (value1.type == "name") { - value1 = scf.LookupName(othersheet, value1.value); - } - result.type = value1.type; - if (value1.type == "coord") { - // value is a coord reference - result.value = value1.value + "!" + sheetname.value; // return in the format as used on stack - } else if (value1.type == "range") { - // value is a range reference - pos1 = value1.value.indexOf("|"); - pos2 = value1.value.indexOf("|", pos1 + 1); - result.value = - value1.value.substring(0, pos1) + - "!" + - sheetname.value + - "|" + - value1.value.substring(pos1 + 1, pos2) + - "|"; - } else if (value1.type.charAt(0) == "e") { - result.value = value1.value; - } else { - result.error = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - result.value = 0; - } - return result; - }; - - /* -# -# result = SocialCalc.Formula.OperandsAsRangeOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as coord2-or-name:coord1. -# Name is evaluated on sheet of coord1. -# Returns result with "value" of stack-style range value (coord!sheetname|coord|) and -# "type" of "range". All others are treated as an error. -# -*/ - - SocialCalc.Formula.OperandsAsRangeOnSheet = function (sheet, operand) { - var value1, othersheet, pos1, pos2; - var value2 = {}; - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var stacklen = operand.length; - value2.value = operand[stacklen - 1].value; // get top of stack - coord or name for "right" side - value2.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - - value1 = scf.OperandAsCoord(sheet, operand); // get "left" coord - if (value1.type != "coord") { - // not a coord, which it must be - return { value: 0, type: "e#REF!" }; - } - - othersheet = sheet; - pos1 = value1.value.indexOf("!"); - if (pos1 != -1) { - // sheet reference - pos2 = value1.value.indexOf("|", pos1 + 1); - if (pos2 < 0) pos2 = value1.value.length; - othersheet = scf.FindInSheetCache(value1.value.substring(pos1 + 1, pos2)); // get other sheet - if (othersheet == null) { - // unavailable - return { - value: 0, - type: "e#REF!", - errortext: - scc.s_sheetunavailable + - " " + - value1.value.substring(pos1 + 1, pos2), - }; - } - } - - if (value2.type == "name") { - // coord:name is allowed, if name is just one cell - value2 = scf.LookupName(othersheet, value2.value); - } - - if (value2.type == "coord") { - // value is a coord reference, so return the combined range - return { value: value1.value + "|" + value2.value + "|", type: "range" }; // return range in the format as used on stack - } else { - // bad form - return { value: scc.s_calcerrcellrefmissing, type: "e#REF!" }; - } - }; - - /* -# -# result = SocialCalc.Formula.OperandAsSheetName(sheet, operand) -# -# Gets top of stack and pops it. -# Returns sheetname value. All others are treated as an error. -# Accepts text, cell reference, and named value which is one of those two. -# -*/ - - SocialCalc.Formula.OperandAsSheetName = function (sheet, operand) { - var nvalue, cell; - - var scf = SocialCalc.Formula; - - var result = { type: "", value: "" }; - - var stacklen = operand.length; - - result.value = operand[stacklen - 1].value; // get top of stack - result.type = operand[stacklen - 1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - nvalue = SocialCalc.Formula.LookupName(sheet, result.value); - if (!nvalue.value) { - // not a known name - return bare name as the name value - return result; - } - result.value = nvalue.value; - result.type = nvalue.type; - } - if (result.type == "coord") { - // value is a coord reference, follow it to find sheet name - cell = sheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - result.value = cell.datavalue; - result.type = cell.valuetype; - } else { - result.value = ""; - result.type = "b"; - } - } - if (result.type.charAt(0) == "t") { - // value is a string which could be a sheet name - return result; - } else { - result.value = ""; - result.error = SocialCalc.Constants.s_calcerrsheetnamemissing; - return result; - } - }; - - // - // value = SocialCalc.Formula.LookupName(sheet, name) - // - // Returns value and type of a named value - // Names are case insensitive - // Names may have a definition which is a coord (A1), a range (A1:B7), or a formula (=OFFSET(A1,0,0,5,1)) - // Note: The range must not have sheet names ("!") in them. - // - - SocialCalc.Formula.LookupName = function (sheet, name) { - var pos, specialc, parseinfo; - var names = sheet.names; - var value = {}; - var startedwalk = false; - - if (names[name.toUpperCase()]) { - // is name defined? - - value.value = names[name.toUpperCase()].definition; // yes - - if (value.value.charAt(0) == "=") { - // formula - if (!sheet.checknamecirc) { - // are we possibly walking the name tree? - sheet.checknamecirc = {}; // not yet - startedwalk = true; // remember we are the reference that started it - } else { - if (sheet.checknamecirc[name]) { - // circular reference - value.type = "e#NAME?"; - value.error = - SocialCalc.Constants.s_circularnameref + ' "' + name + '".'; - return value; - } - } - sheet.checknamecirc[name] = true; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens( - value.value.substring(1) - ); - value = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, 1); // parse formula, allowing range return - - delete sheet.checknamecirc[name]; // done with us - if (startedwalk) { - delete sheet.checknamecirc; // done with walk - } - - if (value.type != "range") { - return value; - } - } - - pos = value.value.indexOf(":"); - if (pos != -1) { - // range - value.type = "range"; - value.value = - value.value.substring(0, pos) + - "|" + - value.value.substring(pos + 1) + - "|"; - value.value = value.value.toUpperCase(); - } else { - value.type = "coord"; - value.value = value.value.toUpperCase(); - } - return value; - } else if ( - (specialc = SocialCalc.Formula.SpecialConstants[name.toUpperCase()]) - ) { - // special constant, like #REF! - pos = specialc.indexOf(","); - value.value = specialc.substring(0, pos) - 0; - value.type = specialc.substring(pos + 1); - return value; - } else { - value.value = ""; - value.type = "e#NAME?"; - value.error = - SocialCalc.Constants.s_calcerrunknownname + ' "' + name + '"'; - return value; - } - }; - - /* -# -# coord = SocialCalc.Formula.StepThroughRangeDown(operand, rangevalue) -# -# Returns next coord in a range, keeping track on the operand stack -# Goes from upper left across and down to bottom right. -# -*/ - - SocialCalc.Formula.StepThroughRangeDown = function (operand, rangevalue) { - var value1, value2, sequence, pos1, pos2, sheet1, rp, c, r, count; - var scf = SocialCalc.Formula; - - pos1 = rangevalue.indexOf("|"); - pos2 = rangevalue.indexOf("|", pos1 + 1); - value1 = rangevalue.substring(0, pos1); - value2 = rangevalue.substring(pos1 + 1, pos2); - sequence = rangevalue.substring(pos2 + 1) - 0; - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1); - value1 = value1.substring(0, pos1); - } else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - rp = scf.OrderRangeParts(value1, value2); - - count = 0; - for (r = rp.r1; r <= rp.r2; r++) { - for (c = rp.c1; c <= rp.c2; c++) { - count++; - if (count > sequence) { - if (r != rp.r2 || c != rp.c2) { - // keep on stack until done - scf.PushOperand( - operand, - "range", - value1 + sheet1 + "|" + value2 + "|" + count - ); - } - return { value: SocialCalc.crToCoord(c, r) + sheet1, type: "coord" }; - } - } - } - }; - - /* -# -# result = SocialCalc.Formula.DecodeRangeParts(sheetdata, range) -# -# Returns sheetdata for the sheet where the range is, as well as -# the number of the first column in the range, the number of columns, -# and equivalent row information: -# -# {sheetdata: sheet, sheetname: name-or-"", col1num: n, ncols: n, row1num: n, nrows: n} -# -# If any errors, a null result is returned. -# -*/ - - SocialCalc.Formula.DecodeRangeParts = function (sheetdata, range) { - var value1, value2, pos1, pos2, sheet1, coordsheetdata, rp; - - var scf = SocialCalc.Formula; - - pos1 = range.indexOf("|"); - pos2 = range.indexOf("|", pos1 + 1); - value1 = range.substring(0, pos1); - value2 = range.substring(pos1 + 1, pos2); - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1 + 1); - value1 = value1.substring(0, pos1); - } else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - coordsheetdata = sheetdata; - if (sheet1) { - // sheet reference - coordsheetdata = scf.FindInSheetCache(sheet1); - if (coordsheetdata == null) { - // unavailable - return null; - } - } - - rp = scf.OrderRangeParts(value1, value2); - - return { - sheetdata: coordsheetdata, - sheetname: sheet1, - col1num: rp.c1, - ncols: rp.c2 - rp.c1 + 1, - row1num: rp.r1, - nrows: rp.r2 - rp.r1 + 1, - }; - }; - - //********************* - // - // Function Handling - // - //********************* - - // List of functions -- Define after functions are defined - // - // SocialCalc.Formula.FunctionList["function_name"] = [function_subroutine, number_of_arguments, arg_def, func_def, func_class] - // function_subroutine takes arguments (fname, operand, foperand, sheet), returns - // errortext or null, pushing result on operand stack. - // number_of_arguments is: - // 0 = no arguments - // >0 = exactly that many arguments - // <0 = that many arguments (abs value) or more - // 100 = don't check - // - // arg_def, if present, is the name of the element in SocialCalc.Formula.FunctionArgDefs. - // func_def, if present, is a string explaining the function. If not, looked up in SocialCalc.Constants. - // func_class, if present, is the comma-separated names of the elements in SocialCalc.Formula.FunctionClasses. - // - // To add a function, just add it to this object. - - if (!SocialCalc.Formula.FunctionList) { - // make sure it is defined (could have been in another module) - SocialCalc.Formula.FunctionList = {}; - } - - // FunctionClasses[classname] = {name: full-name-string, items: [sorted list of function names]}; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionClasses = null; // start null to say needs filling in - - // FunctionArgDef[argname] = explicit-string-for-arg-list; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionArgDefs = {}; - - /* -# -# errortext = SocialCalc.Formula.CalculateFunction(fname, operand, sheet) -# -# Dispatches for function fname. -# -*/ - - SocialCalc.Formula.CalculateFunction = function (fname, operand, sheet) { - var fobj, foperand, ffunc, argnum, ttext; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = ""; - - fobj = scf.FunctionList[fname]; - - if (fobj) { - foperand = []; - ffunc = fobj[0]; - argnum = fobj[1]; - scf.CopyFunctionArgs(operand, foperand); - if (argnum != 100) { - if (argnum < 0) { - if (foperand.length < -argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } else { - if (foperand.length != argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } - } - errortext = ffunc(fname, operand, foperand, sheet); - } else { - ttext = fname; - - if (operand.length && operand[operand.length - 1].type == "start") { - // no arguments - name or zero arg function - operand.pop(); - scf.PushOperand(operand, "name", ttext); - } else { - errortext = - SocialCalc.Constants.s_sheetfuncunknownfunction + " " + ttext + ". "; - } - } - - return errortext; - }; - - // - // SocialCalc.Formula.PushOperand(operand, t, v) - // - // Pushes the type and value onto the operand stack - // - - SocialCalc.Formula.PushOperand = function (operand, t, v) { - operand.push({ type: t, value: v }); - }; - - // - // SocialCalc.Formula.CopyFunctionArgs(operand, foperand) - // - // Pops operands from operand and pushes on foperand up to function start - // reversing order in the process. - // - - SocialCalc.Formula.CopyFunctionArgs = function (operand, foperand) { - var fobj, foperand, ffunc, argnum; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = null; - - while (operand.length > 0 && operand[operand.length - 1].type != "start") { - // get each arg - foperand.push(operand.pop()); // copy it - } - operand.pop(); // get rid of "start" - - return; - }; - - // - // errortext = SocialCalc.Formula.FunctionArgsError(fname, operand) - // - // Pushes appropriate error on operand stack and returns errortext, including fname - // - - SocialCalc.Formula.FunctionArgsError = function (fname, operand) { - var errortext = - SocialCalc.Constants.s_calcerrincorrectargstofunction + - " " + - fname + - ". "; - SocialCalc.Formula.PushOperand(operand, "e#VALUE!", errortext); - - return errortext; - }; - - // - // errortext = SocialCalc.Formula.FunctionSpecificError(fname, operand, errortype, errortext) - // - // Pushes specified error and text on operand stack. - // - - SocialCalc.Formula.FunctionSpecificError = function ( - fname, - operand, - errortype, - errortext - ) { - SocialCalc.Formula.PushOperand(operand, errortype, errortext); - - return errortext; - }; - - // - // haserror = SocialCalc.Formula.CheckForErrorValue(operand, v) - // - // If v.type is an error, push it on operand stack and return true, otherwise return false. - // - - SocialCalc.Formula.CheckForErrorValue = function (operand, v) { - if (v.type.charAt(0) == "e") { - operand.push(v); - return true; - } else { - return false; - } - }; - - ///////////////////////// - // - // FUNCTION INFORMATION ROUTINES - // - - // - // SocialCalc.Formula.FillFunctionInfo() - // - // Goes through function definitions and fills out FunctionArgDefs and FunctionClasses. - // Execute this after any changes to SocialCalc.Constants but before UI is used. - // - - SocialCalc.Formula.FillFunctionInfo = function () { - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var fname, f, classes, cname, i; - - if (scf.FunctionClasses) { - // only do once - return; - } - - for (fname in scf.FunctionList) { - f = scf.FunctionList[fname]; - if (f[2]) { - // has an arg def - scf.FunctionArgDefs[f[2]] = scc["s_farg_" + f[2]] || ""; // get it from constants - } - if (!f[3]) { - // no text def, see if in constants - if (scc["s_fdef_" + fname]) { - scf.FunctionList[fname][3] = scc["s_fdef_" + fname]; - } - } - } - - scf.FunctionClasses = {}; - - for (i = 0; i < scc.function_classlist.length; i++) { - cname = scc.function_classlist[i]; - scf.FunctionClasses[cname] = { - name: scc["s_fclass_" + cname], - items: [], - }; - } - - for (fname in scf.FunctionList) { - f = scf.FunctionList[fname]; - classes = f[4] ? f[4].split(",") : []; // get classes - classes.push("all"); - for (i = 0; i < classes.length; i++) { - cname = classes[i]; - scf.FunctionClasses[cname].items.push(fname); - } - } - for (cname in scf.FunctionClasses) { - scf.FunctionClasses[cname].items.sort(); - } - }; - - // - // str = SocialCalc.Formula.FunctionArgString(fname) - // - // Returns a string representing the arguments to function fname. - // - - SocialCalc.Formula.FunctionArgString = function (fname) { - var scf = SocialCalc.Formula; - var fdata = scf.FunctionList[fname]; - var nargs, i, str; - - var adef = fdata[2]; - - if (!adef) { - nargs = fdata[1]; - if (nargs == 0) { - adef = " "; - } else if (nargs > 0) { - str = "v1"; - for (i = 2; i <= nargs; i++) { - str += ", v" + i; - } - return str; - } else if (nargs < 0) { - str = "v1"; - for (i = 2; i < -nargs; i++) { - str += ", v" + i; - } - return str + ", ..."; - } else { - return "nargs: " + nargs; - } - } - - str = scf.FunctionArgDefs[adef] || adef; - - return str; - }; - - ///////////////////////// - // - // FUNCTION DEFINITIONS - // - // The standard function definitions follow. - // - // Note that some need SocialCalc.DetermineValueType to be defined. - // - - /* -# -# AVERAGE(v1,c1:c2,...) -# COUNT(v1,c1:c2,...) -# COUNTA(v1,c1:c2,...) -# COUNTBLANK(v1,c1:c2,...) -# MAX(v1,c1:c2,...) -# MIN(v1,c1:c2,...) -# PRODUCT(v1,c1:c2,...) -# STDEV(v1,c1:c2,...) -# STDEVP(v1,c1:c2,...) -# SUM(v1,c1:c2,...) -# VAR(v1,c1:c2,...) -# VARP(v1,c1:c2,...) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the dseries_functions, too. -# -*/ - - SocialCalc.Formula.SeriesFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var value1, t, v1; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - while (foperand.length > 0) { - value1 = operand_value_and_type(sheet, foperand); - t = value1.type.charAt(0); - if (t == "n") count += 1; - if (t != "b") counta += 1; - if (t == "b") countblank += 1; - - if (t == "n") { - v1 = value1.value - 0; // get it as a number - sum += v1; - product *= v1; - maxval = maxval != undefined ? (v1 > maxval ? v1 : maxval) : v1; - minval = minval != undefined ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { - // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } else { - // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type( - value1.type, - resulttypesum || value1.type, - typelookupplus - ); - } else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "SUM": - PushOperand(resulttypesum, sum); - break; - - case "PRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "MIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "MAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "COUNT": - PushOperand("n", count); - break; - - case "COUNTA": - PushOperand("n", counta); - break; - - case "COUNTBLANK": - PushOperand("n", countblank); - break; - - case "AVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - } - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["AVERAGE"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["COUNT"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["COUNTA"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["COUNTBLANK"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["MAX"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["MIN"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["PRODUCT"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["STDEV"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["STDEVP"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["SUM"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["VAR"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - SocialCalc.Formula.FunctionList["VARP"] = [ - SocialCalc.Formula.SeriesFunctions, - -1, - "vn", - null, - "stat", - ]; - - /* -# -# DAVERAGE(databaserange, fieldname, criteriarange) -# DCOUNT(databaserange, fieldname, criteriarange) -# DCOUNTA(databaserange, fieldname, criteriarange) -# DGET(databaserange, fieldname, criteriarange) -# DMAX(databaserange, fieldname, criteriarange) -# DMIN(databaserange, fieldname, criteriarange) -# DPRODUCT(databaserange, fieldname, criteriarange) -# DSTDEV(databaserange, fieldname, criteriarange) -# DSTDEVP(databaserange, fieldname, criteriarange) -# DSUM(databaserange, fieldname, criteriarange) -# DVAR(databaserange, fieldname, criteriarange) -# DVARP(databaserange, fieldname, criteriarange) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the series_functions, too. -# -*/ - - SocialCalc.Formula.DSeriesFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var value1, - tostype, - cr, - dbrange, - fieldname, - criteriarange, - dbinfo, - criteriainfo; - var fieldasnum, targetcol, i, j, k, cell, criteriafieldnums; - var testok, criteriacr, criteria, testcol, testcr; - var t; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - var value1 = {}; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - dbrange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - fieldname = scf.OperandValueAndType(sheet, foperand); // get a value - criteriarange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - - if (dbrange.type != "range" || criteriarange.type != "range") { - return scf.FunctionArgsError(fname, operand); - } - - dbinfo = scf.DecodeRangeParts(sheet, dbrange.value); - criteriainfo = scf.DecodeRangeParts(sheet, criteriarange.value); - - fieldasnum = scf.FieldToColnum( - dbinfo.sheetdata, - dbinfo.col1num, - dbinfo.ncols, - dbinfo.row1num, - fieldname.value, - fieldname.type - ); - if (fieldasnum <= 0) { - PushOperand("e#VALUE!", 0); - return; - } - - targetcol = dbinfo.col1num + fieldasnum - 1; - criteriafieldnums = []; - - for (i = 0; i < criteriainfo.ncols; i++) { - // get criteria field colnums - cell = criteriainfo.sheetdata.GetAssuredCell( - SocialCalc.crToCoord(criteriainfo.col1num + i, criteriainfo.row1num) - ); - criterianum = scf.FieldToColnum( - dbinfo.sheetdata, - dbinfo.col1num, - dbinfo.ncols, - dbinfo.row1num, - cell.datavalue, - cell.valuetype - ); - if (criterianum <= 0) { - PushOperand("e#VALUE!", 0); - return; - } - criteriafieldnums.push(dbinfo.col1num + criterianum - 1); - } - - for (i = 1; i < dbinfo.nrows; i++) { - // go through each row of the database - testok = false; - CRITERIAROW: for (j = 1; j < criteriainfo.nrows; j++) { - // go through each criteria row - for (k = 0; k < criteriainfo.ncols; k++) { - // look at each column - criteriacr = SocialCalc.crToCoord( - criteriainfo.col1num + k, - criteriainfo.row1num + j - ); // where criteria is - cell = criteriainfo.sheetdata.GetAssuredCell(criteriacr); - criteria = cell.datavalue; - if (typeof criteria == "string" && criteria.length == 0) continue; // blank items are OK - testcol = criteriafieldnums[k]; - testcr = SocialCalc.crToCoord(testcol, dbinfo.row1num + i); // cell to check - cell = criteriainfo.sheetdata.GetAssuredCell(testcr); - if ( - !scf.TestCriteria(cell.datavalue, cell.valuetype || "b", criteria) - ) { - continue CRITERIAROW; // does not meet criteria - check next row - } - } - testok = true; // met all the criteria - break CRITERIAROW; - } - if (!testok) { - continue; - } - - cr = SocialCalc.crToCoord(targetcol, dbinfo.row1num + i); // get cell of this row to do the function on - cell = dbinfo.sheetdata.GetAssuredCell(cr); - - value1.value = cell.datavalue; - value1.type = cell.valuetype; - t = value1.type.charAt(0); - if (t == "n") count += 1; - if (t != "b") counta += 1; - if (t == "b") countblank += 1; - - if (t == "n") { - v1 = value1.value - 0; // get it as a number - sum += v1; - product *= v1; - maxval = maxval != undefined ? (v1 > maxval ? v1 : maxval) : v1; - minval = minval != undefined ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { - // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } else { - // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type( - value1.type, - resulttypesum || value1.type, - typelookupplus - ); - } else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "DSUM": - PushOperand(resulttypesum, sum); - break; - - case "DPRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "DMIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "DMAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "DCOUNT": - PushOperand("n", count); - break; - - case "DCOUNTA": - PushOperand("n", counta); - break; - - case "DAVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DGET": - if (count == 1) { - PushOperand(resulttypesum, sum); - } else if (count == 0) { - PushOperand("e#VALUE!", 0); - } else { - PushOperand("e#NUM!", 0); - } - break; - } - - return; - }; - - SocialCalc.Formula.FunctionList["DAVERAGE"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DCOUNT"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DCOUNTA"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DGET"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DMAX"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DMIN"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DPRODUCT"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DSTDEV"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DSTDEVP"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DSUM"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DVAR"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["DVARP"] = [ - SocialCalc.Formula.DSeriesFunctions, - 3, - "dfunc", - "", - "stat", - ]; - - /* -# -# colnum = SocialCalc.Formula.FieldToColnum(sheet, col1num, ncols, row1num, fieldname, fieldtype) -# -# If fieldname is a number, uses it, otherwise looks up string in cells in row to find field number -# -# If not found, returns 0. -# -*/ - - SocialCalc.Formula.FieldToColnum = function ( - sheet, - col1num, - ncols, - row1num, - fieldname, - fieldtype - ) { - var colnum, cell, value; - - if (fieldtype.charAt(0) == "n") { - // number - return it if legal - colnum = fieldname - 0; // make sure a number - if (colnum <= 0 || colnum > ncols) { - return 0; - } - return Math.floor(colnum); - } - - if (fieldtype.charAt(0) != "t") { - // must be text otherwise - return 0; - } - - fieldname = fieldname ? fieldname.toLowerCase() : ""; - - for (colnum = 0; colnum < ncols; colnum++) { - // look through column headers for a match - cell = sheet.GetAssuredCell( - SocialCalc.crToCoord(col1num + colnum, row1num) - ); - value = cell.datavalue; - value = (value + "").toLowerCase(); // ignore case - if (value == fieldname) { - // match - return colnum + 1; - } - } - return 0; // looked at all and no match - }; - - /* -# -# HLOOKUP(value, range, row, [rangelookup]) -# VLOOKUP(value, range, col, [rangelookup]) -# MATCH(value, range, [rangelookup]) -# -*/ - - SocialCalc.Formula.LookupFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var lookupvalue, range, offset, rangelookup, offsetvalue, rangeinfo; - var c, - r, - cincr, - rincr, - previousOK, - csave, - rsave, - cell, - value, - valuetype, - cr, - lookupvalue; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - lookupvalue = operand_value_and_type(sheet, foperand); - if (typeof lookupvalue.value == "string") { - lookupvalue.value = lookupvalue.value.toLowerCase(); - } - - range = scf.TopOfStackValueAndType(sheet, foperand); - - rangelookup = 1; // default to true or 1 - if (fname == "MATCH") { - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value - 0; - } - } else { - offsetvalue = scf.OperandAsNumber(sheet, foperand); - if (offsetvalue.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - offsetvalue = Math.floor(offsetvalue.value); - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value ? 1 : 0; // convert to 1 or 0 - } - } - lookupvalue.type = lookupvalue.type.charAt(0); // only deal with general type - if (lookupvalue.type == "n") { - // if number, make sure a number - lookupvalue.value = lookupvalue.value - 0; - } - - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - rangeinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (!rangeinfo) { - PushOperand("e#REF!", 0); - return; - } - - c = 0; - r = 0; - cincr = 0; - rincr = 0; - if (fname == "HLOOKUP") { - cincr = 1; - if (offsetvalue > rangeinfo.nrows) { - PushOperand("e#REF!", 0); - return; - } - } else if (fname == "VLOOKUP") { - rincr = 1; - if (offsetvalue > rangeinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - } else if (fname == "MATCH") { - if (rangeinfo.ncols > 1) { - if (rangeinfo.nrows > 1) { - PushOperand("e#N/A", 0); - return; - } - cincr = 1; - } else { - rincr = 1; - } - } else { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (offsetvalue < 1 && fname != "MATCH") { - PushOperand("e#VALUE!", 0); - return 0; - } - - previousOK; // if 1, previous test was <. If 2, also this one wasn't - - while (1) { - cr = SocialCalc.crToCoord(rangeinfo.col1num + c, rangeinfo.row1num + r); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype ? cell.valuetype.charAt(0) : "b"; // only deal with general types - if (valuetype == "n") { - value = value - 0; // make sure number - } - if (rangelookup) { - // rangelookup type 1 or -1: look for within brackets for matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { - // match - break; - } - if ( - (rangelookup > 0 && lookupvalue.value > value) || - (rangelookup < 0 && lookupvalue.value < value) - ) { - // possible match: wait and see - previousOK = 1; - csave = c; // remember col and row of last OK - rsave = r; - } else if (previousOK) { - // last one was OK, this one isn't - previousOK = 2; - break; - } - } else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { - // match - break; - } - if ( - (rangelookup > 0 && lookupvalue.value > value) || - (rangelookup < 0 && lookupvalue.value < value) - ) { - // possible match: wait and see - previousOK = 1; - csave = c; - rsave = r; - } else if (previousOK) { - // last one was OK, this one isn't - previousOK = 2; - break; - } - } - } else { - // exact value matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { - // match - break; - } - } else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { - // match - break; - } - } - } - - r += rincr; - c += cincr; - if (r >= rangeinfo.nrows || c >= rangeinfo.ncols) { - // end of range to check, no exact match - if (previousOK) { - // at least one could have been OK - previousOK = 2; - break; - } - PushOperand("e#N/A", 0); - return; - } - } - - if (previousOK == 2) { - // back to last OK - r = rsave; - c = csave; - } - - if (fname == "MATCH") { - value = c + r + 1; // only one may be <> 0 - valuetype = "n"; - } else { - cr = SocialCalc.crToCoord( - rangeinfo.col1num + c + (fname == "VLOOKUP" ? offsetvalue - 1 : 0), - rangeinfo.row1num + r + (fname == "HLOOKUP" ? offsetvalue - 1 : 0) - ); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype; - } - PushOperand(valuetype, value); - - return; - }; - - SocialCalc.Formula.FunctionList["HLOOKUP"] = [ - SocialCalc.Formula.LookupFunctions, - -3, - "hlookup", - "", - "lookup", - ]; - SocialCalc.Formula.FunctionList["MATCH"] = [ - SocialCalc.Formula.LookupFunctions, - -2, - "match", - "", - "lookup", - ]; - SocialCalc.Formula.FunctionList["VLOOKUP"] = [ - SocialCalc.Formula.LookupFunctions, - -3, - "vlookup", - "", - "lookup", - ]; - - /* -# -# INDEX(range, rownum, colnum) -# -*/ - - SocialCalc.Formula.IndexFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var range, sheetname, indexinfo, rowindex, colindex, result, resulttype; - - var scf = SocialCalc.Formula; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - indexinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (indexinfo.sheetname) { - sheetname = "!" + indexinfo.sheetname; - } else { - sheetname = ""; - } - - rowindex = { value: 0 }; - colindex = { value: 0 }; - - if (foperand.length) { - // look for row number - rowindex = scf.OperandAsNumber(sheet, foperand); - if (rowindex.type.charAt(0) != "n" || rowindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - // look for col number - colindex = scf.OperandAsNumber(sheet, foperand); - if (colindex.type.charAt(0) != "n" || colindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - } else { - // col number missing - if (indexinfo.nrows == 1) { - // if only one row, then rowindex is really colindex - colindex.value = rowindex.value; - rowindex.value = 0; - } - } - } - - if (rowindex.value > indexinfo.nrows || colindex.value > indexinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - - if (rowindex.value == 0) { - if (colindex.value == 0) { - if (indexinfo.nrows == 1 && indexinfo.ncols == 1) { - result = - SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + - sheetname; - resulttype = "coord"; - } else { - result = - SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + - sheetname + - "|" + - SocialCalc.crToCoord( - indexinfo.col1num + indexinfo.ncols - 1, - indexinfo.row1num + indexinfo.nrows - 1 - ) + - "|"; - resulttype = "range"; - } - } else { - if (indexinfo.nrows == 1) { - result = - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num - ) + sheetname; - resulttype = "coord"; - } else { - result = - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num - ) + - sheetname + - "|" + - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num + indexinfo.nrows - 1 - ) + - "|"; - resulttype = "range"; - } - } - } else { - if (colindex.value == 0) { - if (indexinfo.ncols == 1) { - result = - SocialCalc.crToCoord( - indexinfo.col1num, - indexinfo.row1num + rowindex.value - 1 - ) + sheetname; - resulttype = "coord"; - } else { - result = - SocialCalc.crToCoord( - indexinfo.col1num, - indexinfo.row1num + rowindex.value - 1 - ) + - sheetname + - "|" + - SocialCalc.crToCoord( - indexinfo.col1num + indexinfo.ncols - 1, - indexinfo.row1num + rowindex.value - 1 - ) + - "|"; - resulttype = "range"; - } - } else { - result = - SocialCalc.crToCoord( - indexinfo.col1num + colindex.value - 1, - indexinfo.row1num + rowindex.value - 1 - ) + sheetname; - resulttype = "coord"; - } - } - - PushOperand(resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["INDEX"] = [ - SocialCalc.Formula.IndexFunction, - -1, - "index", - "", - "lookup", - ]; - - /* -# -# COUNTIF(c1:c2,"criteria") -# SUMIF(c1:c2,"criteria",[range2]) -# -*/ - - SocialCalc.Formula.CountifSumifFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var range, - criteria, - sumrange, - f2operand, - result, - resulttype, - value1, - value2; - var sum = 0; - var resulttypesum = ""; - var count = 0; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function (t, v) { - operand.push({ type: t, value: v }); - }; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range or coord - criteria = scf.OperandAsText(sheet, foperand); // get criteria - if (fname == "SUMIF") { - if (foperand.length == 1) { - // three arg form of SUMIF - sumrange = scf.TopOfStackValueAndType(sheet, foperand); - } else if (foperand.length == 0) { - // two arg form - sumrange = { value: range.value, type: range.type }; - } else { - scf.FunctionArgsError(fname, operand); - return 0; - } - } else { - sumrange = { value: range.value, type: range.type }; - } - - if (criteria.type.charAt(0) == "n") { - criteria.value = criteria.value + ""; // make text - } else if (criteria.type.charAt(0) == "e") { - // error - criteria.value = null; - } else if (criteria.type.charAt(0) == "b") { - // blank here is undefined - criteria.value = null; - } - - if (range.type != "coord" && range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - if ( - fname == "SUMIF" && - sumrange.type != "coord" && - sumrange.type != "range" - ) { - scf.FunctionArgsError(fname, operand); - return 0; - } - - foperand.push(range); - f2operand = []; // to allow for 3 arg form - f2operand.push(sumrange); - - while (foperand.length) { - value1 = operand_value_and_type(sheet, foperand); - value2 = operand_value_and_type(sheet, f2operand); - - if (!scf.TestCriteria(value1.value, value1.type, criteria.value)) { - continue; - } - - count += 1; - - if (value2.type.charAt(0) == "n") { - sum += value2.value - 0; - resulttypesum = lookup_result_type( - value2.type, - resulttypesum || value2.type, - typelookupplus - ); - } else if ( - value2.type.charAt(0) == "e" && - resulttypesum.charAt(0) != "e" - ) { - resulttypesum = value2.type; - } - } - - resulttypesum = resulttypesum || "n"; - - if (fname == "SUMIF") { - PushOperand(resulttypesum, sum); - } else if (fname == "COUNTIF") { - PushOperand("n", count); - } - - return; - }; - - SocialCalc.Formula.FunctionList["COUNTIF"] = [ - SocialCalc.Formula.CountifSumifFunctions, - 2, - "rangec", - "", - "stat", - ]; - SocialCalc.Formula.FunctionList["SUMIF"] = [ - SocialCalc.Formula.CountifSumifFunctions, - -2, - "sumif", - "", - "stat", - ]; - - /* -# -# IF(cond,truevalue,falsevalue) -# -*/ - - SocialCalc.Formula.IfFunction = function (fname, operand, foperand, sheet) { - var cond, t; - - cond = SocialCalc.Formula.OperandValueAndType(sheet, foperand); - t = cond.type.charAt(0); - if (t != "n" && t != "b") { - operand.push({ type: "e#VALUE!", value: 0 }); - return; - } - - if (!cond.value) foperand.pop(); - operand.push(foperand.pop()); - if (cond.value) foperand.pop(); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["IF"] = [ - SocialCalc.Formula.IfFunction, - 3, - "iffunc", - "", - "test", - ]; - - /* -# -# DATE(year,month,day) -# -*/ - - SocialCalc.Formula.DateFunction = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var year = scf.OperandAsNumber(sheet, foperand); - var month = scf.OperandAsNumber(sheet, foperand); - var day = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - year.type, - month.type, - scf.TypeLookupTable.twoargnumeric - ); - resulttype = scf.LookupResultType( - resulttype, - day.type, - scf.TypeLookupTable.twoargnumeric - ); - if (resulttype.charAt(0) == "n") { - result = - SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - Math.floor(year.value), - Math.floor(month.value), - Math.floor(day.value) - ) - SocialCalc.FormatNumber.datevalues.julian_offset; - resulttype = "nd"; - } - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["DATE"] = [ - SocialCalc.Formula.DateFunction, - 3, - "date", - "", - "datetime", - ]; - - /* -# -# TIME(hour,minute,second) -# -*/ - - SocialCalc.Formula.TimeFunction = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var hours = scf.OperandAsNumber(sheet, foperand); - var minutes = scf.OperandAsNumber(sheet, foperand); - var seconds = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - hours.type, - minutes.type, - scf.TypeLookupTable.twoargnumeric - ); - resulttype = scf.LookupResultType( - resulttype, - seconds.type, - scf.TypeLookupTable.twoargnumeric - ); - if (resulttype.charAt(0) == "n") { - result = - (hours.value * 60 * 60 + minutes.value * 60 + seconds.value) / - (24 * 60 * 60); - resulttype = "nt"; - } - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["TIME"] = [ - SocialCalc.Formula.TimeFunction, - 3, - "hms", - "", - "datetime", - ]; - - /* -# -# DAY(date) -# MONTH(date) -# YEAR(date) -# WEEKDAY(date, [type]) -# -*/ - - SocialCalc.Formula.DMYFunctions = function (fname, operand, foperand, sheet) { - var ymd, dtype, doffset; - var scf = SocialCalc.Formula; - var result = 0; - - var datevalue = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - datevalue.type, - datevalue.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (resulttype.charAt(0) == "n") { - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian( - Math.floor( - datevalue.value + SocialCalc.FormatNumber.datevalues.julian_offset - ) - ); - switch (fname) { - case "DAY": - result = ymd.day; - break; - - case "MONTH": - result = ymd.month; - break; - - case "YEAR": - result = ymd.year; - break; - - case "WEEKDAY": - dtype = { value: 1 }; - if (foperand.length) { - // get type if present - dtype = scf.OperandAsNumber(sheet, foperand); - if ( - dtype.type.charAt(0) != "n" || - dtype.value < 1 || - dtype.value > 3 - ) { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { - // extra args - scf.FunctionArgsError(fname, operand); - return; - } - } - doffset = 6; - if (dtype.value > 1) { - doffset -= 1; - } - result = - (Math.floor(datevalue.value + doffset) % 7) + - (dtype.value < 3 ? 1 : 0); - break; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["DAY"] = [ - SocialCalc.Formula.DMYFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["MONTH"] = [ - SocialCalc.Formula.DMYFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["YEAR"] = [ - SocialCalc.Formula.DMYFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["WEEKDAY"] = [ - SocialCalc.Formula.DMYFunctions, - -1, - "weekday", - "", - "datetime", - ]; - - /* -# -# HOUR(datetime) -# MINUTE(datetime) -# SECOND(datetime) -# -*/ - - SocialCalc.Formula.HMSFunctions = function (fname, operand, foperand, sheet) { - var hours, minutes, seconds, fraction; - var scf = SocialCalc.Formula; - var result = 0; - - var datetime = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType( - datetime.type, - datetime.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (resulttype.charAt(0) == "n") { - if (datetime.value < 0) { - scf.PushOperand(operand, "e#NUM!", 0); // must be non-negative - return; - } - fraction = datetime.value - Math.floor(datetime.value); // fraction of a day - fraction *= 24; - hours = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - minutes = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - seconds = Math.floor(fraction + (datetime.value >= 0 ? 0.5 : -0.5)); - if (fname == "HOUR") { - result = hours; - } else if (fname == "MINUTE") { - result = minutes; - } else if (fname == "SECOND") { - result = seconds; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["HOUR"] = [ - SocialCalc.Formula.HMSFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["MINUTE"] = [ - SocialCalc.Formula.HMSFunctions, - 1, - "v", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["SECOND"] = [ - SocialCalc.Formula.HMSFunctions, - 1, - "v", - "", - "datetime", - ]; - - /* -# -# EXACT(v1,v2) -# -*/ - - SocialCalc.Formula.ExactFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value1 = scf.OperandValueAndType(sheet, foperand); - var v1type = value1.type.charAt(0); - var value2 = scf.OperandValueAndType(sheet, foperand); - var v2type = value2.type.charAt(0); - - if (v1type == "t") { - if (v2type == "t") { - result = value1.value == value2.value ? 1 : 0; - } else if (v2type == "b") { - result = value1.value.length ? 0 : 1; - } else if (v2type == "n") { - result = value1.value == value2.value + "" ? 1 : 0; - } else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } else { - result = 0; - } - } else if (v1type == "n") { - if (v2type == "n") { - result = value1.value - 0 == value2.value - 0 ? 1 : 0; - } else if (v2type == "b") { - result = 0; - } else if (v2type == "t") { - result = value1.value + "" == value2.value ? 1 : 0; - } else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } else { - result = 0; - } - } else if (v1type == "b") { - if (v2type == "t") { - result = value2.value.length ? 0 : 1; - } else if (v2type == "b") { - result = 1; - } else if (v2type == "n") { - result = 0; - } else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } else { - result = 0; - } - } else if (v1type == "e") { - result = value1.value; - resulttype = value1.type; - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["EXACT"] = [ - SocialCalc.Formula.ExactFunction, - 2, - "", - "", - "text", - ]; - - /* -# -# FIND(key,string,[start]) -# LEFT(string,[length]) -# LEN(string) -# LOWER(string) -# MID(string,start,length) -# PROPER(string) -# REPLACE(string,start,length,new) -# REPT(string,count) -# RIGHT(string,[length]) -# SUBSTITUTE(string,old,new,[which]) -# TRIM(string) -# UPPER(string) -# -*/ - - // SocialCalc.Formula.ArgList has an array for each function, one entry for each possible arg (up to max). - // Min args are specified in SocialCalc.Formula.FunctionList. - // If array element is 1 then it's a text argument, if it's 0 then it's numeric, if -1 then just get whatever's there - // Text values are manipulated as UTF-8, converting from and back to byte strings - - SocialCalc.Formula.ArgList = { - FIND: [1, 1, 0], - LEFT: [1, 0], - LEN: [1], - LOWER: [1], - MID: [1, 0, 0], - PROPER: [1], - REPLACE: [1, 0, 0, 1], - REPT: [1, 0], - RIGHT: [1, 0], - SUBSTITUTE: [1, 1, 1, 0], - TRIM: [1], - UPPER: [1], - }; - - SocialCalc.Formula.StringFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var i, value, offset, len, start, count; - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var numargs = foperand.length; - var argdef = scf.ArgList[fname]; - var operand_value = []; - var operand_type = []; - - for (i = 1; i <= numargs; i++) { - // go through each arg, get value and type, and check for errors - if (i > argdef.length) { - // too many args - scf.FunctionArgsError(fname, operand); - return; - } - if (argdef[i - 1] == 0) { - value = scf.OperandAsNumber(sheet, foperand); - } else if (argdef[i - 1] == 1) { - value = scf.OperandAsText(sheet, foperand); - } else if (argdef[i - 1] == -1) { - value = scf.OperandValueAndType(sheet, foperand); - } - operand_value[i] = value.value; - operand_type[i] = value.type; - if (value.type.charAt(0) == "e") { - scf.PushOperand(operand, value.type, result); - return; - } - } - - switch (fname) { - case "FIND": - offset = operand_type[3] ? operand_value[3] - 1 : 0; - if (offset < 0) { - result = "Start is before string"; // !! not displayed, no need to translate - } else { - result = operand_value[2].indexOf(operand_value[1], offset); // (null string matches first char) - if (result >= 0) { - result += 1; - resulttype = "n"; - } else { - result = "Not found"; // !! not displayed, error is e#VALUE! - } - } - break; - - case "LEFT": - len = operand_type[2] ? operand_value[2] - 0 : 1; - if (len < 0) { - result = "Negative length"; - } else { - result = operand_value[1].substring(0, len); - resulttype = "t"; - } - break; - - case "LEN": - result = operand_value[1].length; - resulttype = "n"; - break; - - case "LOWER": - result = operand_value[1].toLowerCase(); - resulttype = "t"; - break; - - case "MID": - start = operand_value[2] - 0; - len = operand_value[3] - 0; - if (len < 1 || start < 1) { - result = "Bad arguments"; - } else { - result = operand_value[1].substring(start - 1, start + len - 1); - resulttype = "t"; - } - break; - - case "PROPER": - result = operand_value[1].replace(/\b\w+\b/g, function (word) { - return word.substring(0, 1).toUpperCase() + word.substring(1); - }); // uppercase first character of words (see JavaScript, Flanagan, 5th edition, page 704) - resulttype = "t"; - break; - - case "REPLACE": - start = operand_value[2] - 0; - len = operand_value[3] - 0; - if (len < 0 || start < 1) { - result = "Bad arguments"; - } else { - result = - operand_value[1].substring(0, start - 1) + - operand_value[4] + - operand_value[1].substring(start - 1 + len); - resulttype = "t"; - } - break; - - case "REPT": - count = operand_value[2] - 0; - if (count < 0) { - result = "Negative count"; - } else { - result = ""; - for (; count > 0; count--) { - result += operand_value[1]; - } - resulttype = "t"; - } - break; - - case "RIGHT": - len = operand_type[2] ? operand_value[2] - 0 : 1; - if (len < 0) { - result = "Negative length"; - } else { - result = operand_value[1].slice(-len); - resulttype = "t"; - } - break; - - case "SUBSTITUTE": - fulltext = operand_value[1]; - oldtext = operand_value[2]; - newtext = operand_value[3]; - if (operand_value[4] != null) { - which = operand_value[4] - 0; - if (which <= 0) { - result = "Non-positive instance number"; - break; - } - } else { - which = 0; - } - count = 0; - oldpos = 0; - result = ""; - while (true) { - pos = fulltext.indexOf(oldtext, oldpos); - if (pos >= 0) { - count++; //!!!!!! old test just in case: if (count>1000) {alert(pos); break;} - result += fulltext.substring(oldpos, pos); - if (which == 0) { - result += newtext; // substitute - } else if (which == count) { - result += newtext + fulltext.substring(pos + oldtext.length); - break; - } else { - result += oldtext; // leave as was - } - oldpos = pos + oldtext.length; - } else { - // no more - result += fulltext.substring(oldpos); - break; - } - } - resulttype = "t"; - break; - - case "TRIM": - result = operand_value[1]; - result = result.replace(/^ */, ""); - result = result.replace(/ *$/, ""); - result = result.replace(/ +/g, " "); - resulttype = "t"; - break; - - case "UPPER": - result = operand_value[1].toUpperCase(); - resulttype = "t"; - break; - } - - scf.PushOperand(operand, resulttype, result); - return; - }; - - SocialCalc.Formula.FunctionList["FIND"] = [ - SocialCalc.Formula.StringFunctions, - -2, - "find", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["LEFT"] = [ - SocialCalc.Formula.StringFunctions, - -2, - "tc", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["LEN"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "txt", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["LOWER"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "txt", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["MID"] = [ - SocialCalc.Formula.StringFunctions, - 3, - "mid", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["PROPER"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "v", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["REPLACE"] = [ - SocialCalc.Formula.StringFunctions, - 4, - "replace", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["REPT"] = [ - SocialCalc.Formula.StringFunctions, - 2, - "tc", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["RIGHT"] = [ - SocialCalc.Formula.StringFunctions, - -1, - "tc", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["SUBSTITUTE"] = [ - SocialCalc.Formula.StringFunctions, - -3, - "subs", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["TRIM"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "v", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["UPPER"] = [ - SocialCalc.Formula.StringFunctions, - 1, - "v", - "", - "text", - ]; - - /* -# -# is_functions: -# -# ISBLANK(value) -# ISERR(value) -# ISERROR(value) -# ISLOGICAL(value) -# ISNA(value) -# ISNONTEXT(value) -# ISNUMBER(value) -# ISTEXT(value) -# -*/ - - SocialCalc.Formula.IsFunctions = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - case "ISBLANK": - result = value.type == "b" ? 1 : 0; - break; - - case "ISERR": - result = t == "e" ? (value.type == "e#N/A" ? 0 : 1) : 0; - break; - - case "ISERROR": - result = t == "e" ? 1 : 0; - break; - - case "ISLOGICAL": - result = value.type == "nl" ? 1 : 0; - break; - - case "ISNA": - result = value.type == "e#N/A" ? 1 : 0; - break; - - case "ISNONTEXT": - result = t == "t" ? 0 : 1; - break; - - case "ISNUMBER": - result = t == "n" ? 1 : 0; - break; - - case "ISTEXT": - result = t == "t" ? 1 : 0; - break; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["ISBLANK"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISERR"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISERROR"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISLOGICAL"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISNA"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISNONTEXT"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISNUMBER"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["ISTEXT"] = [ - SocialCalc.Formula.IsFunctions, - 1, - "v", - "", - "test", - ]; - - /* -# -# ntv_functions: -# -# N(value) -# T(value) -# VALUE(value) -# -*/ - - SocialCalc.Formula.NTVFunctions = function (fname, operand, foperand, sheet) { - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - case "N": - result = t == "n" ? value.value - 0 : 0; - resulttype = "n"; - break; - - case "T": - result = t == "t" ? value.value + "" : ""; - resulttype = "t"; - break; - - case "VALUE": - if (t == "n" || t == "b") { - result = value.value || 0; - resulttype = "n"; - } else if (t == "t") { - value = SocialCalc.DetermineValueType(value.value); - if (value.type.charAt(0) != "n") { - result = 0; - resulttype = "e#VALUE!"; - } else { - result = value.value - 0; - resulttype = "n"; - } - } - break; - } - - if (t == "e") { - // error trumps - resulttype = value.type; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["N"] = [ - SocialCalc.Formula.NTVFunctions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["T"] = [ - SocialCalc.Formula.NTVFunctions, - 1, - "v", - "", - "text", - ]; - SocialCalc.Formula.FunctionList["VALUE"] = [ - SocialCalc.Formula.NTVFunctions, - 1, - "v", - "", - "text", - ]; - - /* -# -# ABS(value) -# ACOS(value) -# ASIN(value) -# ATAN(value) -# COS(value) -# DEGREES(value) -# EVEN(value) -# EXP(value) -# FACT(value) -# INT(value) -# LN(value) -# LOG10(value) -# ODD(value) -# RADIANS(value) -# SIN(value) -# SQRT(value) -# TAN(value) -# -*/ - - SocialCalc.Formula.Math1Functions = function ( - fname, - operand, - foperand, - sheet - ) { - var v1, value, f; - var result = {}; - - var scf = SocialCalc.Formula; - - v1 = scf.OperandAsNumber(sheet, foperand); - value = v1.value; - result.type = scf.LookupResultType( - v1.type, - v1.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (result.type == "n") { - switch (fname) { - case "ABS": - value = Math.abs(value); - break; - - case "ACOS": - if (value >= -1 && value <= 1) { - value = Math.acos(value); - } else { - result.type = "e#NUM!"; - } - break; - - case "ASIN": - if (value >= -1 && value <= 1) { - value = Math.asin(value); - } else { - result.type = "e#NUM!"; - } - break; - - case "ATAN": - value = Math.atan(value); - break; - - case "COS": - value = Math.cos(value); - break; - - case "DEGREES": - value = (value * 180) / Math.PI; - break; - - case "EVEN": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (Math.floor(value + 1) % 2); - } else { - // integer - value = value + (value % 2); - } - if (v1.value < 0) value = -value; - break; - - case "EXP": - value = Math.exp(value); - break; - - case "FACT": - f = 1; - value = Math.floor(value); - for (; value > 0; value--) { - f *= value; - } - value = f; - break; - - case "INT": - value = Math.floor(value); // spreadsheet INT is floor(), not int() - break; - - case "LN": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclnarg; - } - value = Math.log(value); - break; - - case "LOG10": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclog10arg; - } - value = Math.log(value) / Math.log(10); - break; - - case "ODD": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (1 - (Math.floor(value + 1) % 2)); - } else { - // integer - value = value + (1 - (value % 2)); - } - if (v1.value < 0) value = -value; - break; - - case "RADIANS": - value = (value * Math.PI) / 180; - break; - - case "SIN": - value = Math.sin(value); - break; - - case "SQRT": - if (value >= 0) { - value = Math.sqrt(value); - } else { - result.type = "e#NUM!"; - } - break; - - case "TAN": - if (Math.cos(value) != 0) { - value = Math.tan(value); - } else { - result.type = "e#NUM!"; - } - break; - } - } - - result.value = value; - operand.push(result); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["ABS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ACOS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ASIN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ATAN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["COS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["DEGREES"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["EVEN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["EXP"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["FACT"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["INT"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["LN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["LOG10"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["ODD"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["RADIANS"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["SIN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["SQRT"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["TAN"] = [ - SocialCalc.Formula.Math1Functions, - 1, - "v", - "", - "math", - ]; - - /* -# -# ATAN2(x, y) -# MOD(a, b) -# POWER(a, b) -# TRUNC(value, precision) -# -*/ - - SocialCalc.Formula.Math2Functions = function ( - fname, - operand, - foperand, - sheet - ) { - var xval, yval, value, quotient, decimalscale, i; - var result = {}; - - var scf = SocialCalc.Formula; - - xval = scf.OperandAsNumber(sheet, foperand); - yval = scf.OperandAsNumber(sheet, foperand); - value = 0; - result.type = scf.LookupResultType( - xval.type, - yval.type, - scf.TypeLookupTable.twoargnumeric - ); - - if (result.type == "n") { - switch (fname) { - case "ATAN2": - if (xval.value == 0 && yval.value == 0) { - result.type = "e#DIV/0!"; - } else { - result.value = Math.atan2(yval.value, xval.value); - } - break; - - case "POWER": - result.value = Math.pow(xval.value, yval.value); - if (isNaN(result.value)) { - result.value = 0; - result.type = "e#NUM!"; - } - break; - - case "MOD": // en.wikipedia.org/wiki/Modulo_operation, etc. - if (yval.value == 0) { - result.type = "e#DIV/0!"; - } else { - quotient = xval.value / yval.value; - quotient = Math.floor(quotient); - result.value = xval.value - quotient * yval.value; - } - break; - - case "TRUNC": - decimalscale = 1; // cut down to required number of decimal digits - if (yval.value >= 0) { - yval.value = Math.floor(yval.value); - for (i = 0; i < yval.value; i++) { - decimalscale *= 10; - } - result.value = - Math.floor(Math.abs(xval.value) * decimalscale) / decimalscale; - } else if (yval.value < 0) { - yval.value = Math.floor(-yval.value); - for (i = 0; i < yval.value; i++) { - decimalscale *= 10; - } - result.value = - Math.floor(Math.abs(xval.value) / decimalscale) * decimalscale; - } - if (xval.value < 0) { - result.value = -result.value; - } - } - } - - operand.push(result); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["ATAN2"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "xy", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["MOD"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["POWER"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["TRUNC"] = [ - SocialCalc.Formula.Math2Functions, - 2, - "valpre", - "", - "math", - ]; - - /* -# -# LOG(value,[base]) -# -*/ - - SocialCalc.Formula.LogFunction = function (fname, operand, foperand, sheet) { - var value, value2; - var result = {}; - - var scf = SocialCalc.Formula; - - result.value = 0; - - value = scf.OperandAsNumber(sheet, foperand); - result.type = scf.LookupResultType( - value.type, - value.type, - scf.TypeLookupTable.oneargnumeric - ); - if (foperand.length == 1) { - value2 = scf.OperandAsNumber(sheet, foperand); - if (value2.type.charAt(0) != "n" || value2.value <= 0) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfunclogsecondarg - ); - return 0; - } - } else if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } else { - value2 = { value: Math.E, type: "n" }; - } - - if (result.type == "n") { - if (value.value <= 0) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfunclogfirstarg - ); - return 0; - } - result.value = Math.log(value.value) / Math.log(value2.value); - } - - operand.push(result); - - return; - }; - - SocialCalc.Formula.FunctionList["LOG"] = [ - SocialCalc.Formula.LogFunction, - -1, - "log", - "", - "math", - ]; - - /* -# -# ROUND(value,[precision]) -# -*/ - - SocialCalc.Formula.RoundFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var value2, decimalscale, scaledvalue, i; - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var value = scf.OperandValueAndType(sheet, foperand); - var resulttype = scf.LookupResultType( - value.type, - value.type, - scf.TypeLookupTable.oneargnumeric - ); - - if (foperand.length == 1) { - value2 = scf.OperandValueAndType(sheet, foperand); - if (value2.type.charAt(0) != "n") { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfuncroundsecondarg - ); - return 0; - } - } else if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } else { - value2 = { value: 0, type: "n" }; // if no second arg, assume 0 for simple round - } - - if (resulttype == "n") { - value2.value = value2.value - 0; - if (value2.value == 0) { - result = Math.round(value.value); - } else if (value2.value > 0) { - decimalscale = 1; // cut down to required number of decimal digits - value2.value = Math.floor(value2.value); - for (i = 0; i < value2.value; i++) { - decimalscale *= 10; - } - scaledvalue = Math.round(value.value * decimalscale); - result = scaledvalue / decimalscale; - } else if (value2.value < 0) { - decimalscale = 1; // cut down to required number of decimal digits - value2.value = Math.floor(-value2.value); - for (i = 0; i < value2.value; i++) { - decimalscale *= 10; - } - scaledvalue = Math.round(value.value / decimalscale); - result = scaledvalue * decimalscale; - } - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["ROUND"] = [ - SocialCalc.Formula.RoundFunction, - -1, - "vp", - "", - "math", - ]; - - /* -# -# AND(v1,c1:c2,...) -# OR(v1,c1:c2,...) -# -*/ - - SocialCalc.Formula.AndOrFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var value1, result; - - var scf = SocialCalc.Formula; - var resulttype = ""; - - if (fname == "AND") { - result = 1; - } else if (fname == "OR") { - result = 0; - } - - while (foperand.length) { - value1 = scf.OperandValueAndType(sheet, foperand); - if (value1.type.charAt(0) == "n") { - value1.value = value1.value - 0; - if (fname == "AND") { - result = value1.value != 0 ? result : 0; - } else if (fname == "OR") { - result = value1.value != 0 ? 1 : result; - } - resulttype = scf.LookupResultType( - value1.type, - resulttype || "nl", - scf.TypeLookupTable.propagateerror - ); - } else if (value1.type.charAt(0) == "e" && resulttype.charAt(0) != "e") { - resulttype = value1.type; - } - } - if (resulttype.length < 1) { - resulttype = "e#VALUE!"; - result = 0; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["AND"] = [ - SocialCalc.Formula.AndOrFunctions, - -1, - "vn", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["OR"] = [ - SocialCalc.Formula.AndOrFunctions, - -1, - "vn", - "", - "test", - ]; - - /* -# -# NOT(value) -# -*/ - - SocialCalc.Formula.NotFunction = function (fname, operand, foperand, sheet) { - var result = 0; - var scf = SocialCalc.Formula; - var value = scf.OperandValueAndType(sheet, foperand); - var resulttype = scf.LookupResultType( - value.type, - value.type, - scf.TypeLookupTable.propagateerror - ); - - if (value.type.charAt(0) == "n" || value.type == "b") { - result = value.value - 0 != 0 ? 0 : 1; // do the "not" operation - resulttype = "nl"; - } else if (value.type.charAt(0) == "t") { - resulttype = "e#VALUE!"; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["NOT"] = [ - SocialCalc.Formula.NotFunction, - 1, - "v", - "", - "test", - ]; - - /* -# -# CHOOSE(index,value1,value2,...) -# -*/ - - SocialCalc.Formula.ChooseFunction = function ( - fname, - operand, - foperand, - sheet - ) { - var resulttype, count, value1; - var result = 0; - var scf = SocialCalc.Formula; - - var cindex = scf.OperandAsNumber(sheet, foperand); - - if (cindex.type.charAt(0) != "n") { - cindex.value = 0; - } - cindex.value = Math.floor(cindex.value); - - count = 0; - while (foperand.length) { - value1 = scf.TopOfStackValueAndType(sheet, foperand); - count += 1; - if (cindex.value == count) { - result = value1.value; - resulttype = value1.type; - break; - } - } - if (resulttype) { - // found something - scf.PushOperand(operand, resulttype, result); - } else { - scf.PushOperand(operand, "e#VALUE!", 0); - } - - return; - }; - - SocialCalc.Formula.FunctionList["CHOOSE"] = [ - SocialCalc.Formula.ChooseFunction, - -2, - "choose", - "", - "lookup", - ]; - - /* -# -# COLUMNS(c1:c2) -# ROWS(c1:c2) -# -*/ - - SocialCalc.Formula.ColumnsRowsFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var resulttype, rangeinfo; - var result = 0; - var scf = SocialCalc.Formula; - - var value1 = scf.TopOfStackValueAndType(sheet, foperand); - - if (value1.type == "coord") { - result = 1; - resulttype = "n"; - } else if (value1.type == "range") { - rangeinfo = scf.DecodeRangeParts(sheet, value1.value); - if (fname == "COLUMNS") { - result = rangeinfo.ncols; - } else if (fname == "ROWS") { - result = rangeinfo.nrows; - } - resulttype = "n"; - } else { - result = 0; - resulttype = "e#VALUE!"; - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["COLUMNS"] = [ - SocialCalc.Formula.ColumnsRowsFunctions, - 1, - "range", - "", - "lookup", - ]; - SocialCalc.Formula.FunctionList["ROWS"] = [ - SocialCalc.Formula.ColumnsRowsFunctions, - 1, - "range", - "", - "lookup", - ]; - - /* -# -# FALSE() -# NA() -# NOW() -# PI() -# TODAY() -# TRUE() -# -*/ - - SocialCalc.Formula.ZeroArgFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var startval, tzoffset, start_1_1_1970, seconds_in_a_day, nowdays; - var result = { value: 0 }; - - switch (fname) { - case "FALSE": - result.type = "nl"; - result.value = 0; - break; - - case "NA": - result.type = "e#N/A"; - break; - - case "NOW": - startval = new Date(); - tzoffset = startval.getTimezoneOffset(); - startval = startval.getTime() / 1000; // convert to seconds - start_1_1_1970 = 25569; // Day number of 1/1/1970 starting with 1/1/1900 as 1 - seconds_in_a_day = 24 * 60 * 60; - nowdays = - start_1_1_1970 + startval / seconds_in_a_day - tzoffset / (24 * 60); - result.value = nowdays; - result.type = "ndt"; - SocialCalc.Formula.FreshnessInfo.volatile.NOW = true; // remember - break; - - case "PI": - result.type = "n"; - result.value = Math.PI; - break; - - case "TODAY": - startval = new Date(); - tzoffset = startval.getTimezoneOffset(); - startval = startval.getTime() / 1000; // convert to seconds - start_1_1_1970 = 25569; // Day number of 1/1/1970 starting with 1/1/1900 as 1 - seconds_in_a_day = 24 * 60 * 60; - nowdays = - start_1_1_1970 + startval / seconds_in_a_day - tzoffset / (24 * 60); - result.value = Math.floor(nowdays); - result.type = "nd"; - SocialCalc.Formula.FreshnessInfo.volatile.TODAY = true; // remember - break; - - case "TRUE": - result.type = "nl"; - result.value = 1; - break; - } - - operand.push(result); - - return null; - }; - - // Add to function list - SocialCalc.Formula.FunctionList["FALSE"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["NA"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "test", - ]; - SocialCalc.Formula.FunctionList["NOW"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["PI"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "math", - ]; - SocialCalc.Formula.FunctionList["TODAY"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "datetime", - ]; - SocialCalc.Formula.FunctionList["TRUE"] = [ - SocialCalc.Formula.ZeroArgFunctions, - 0, - "", - "", - "test", - ]; - - // - // * * * * * FINANCIAL FUNCTIONS * * * * * - // - - /* -# -# DDB(cost,salvage,lifetime,period,[method]) -# -# Depreciation, method defaults to 2 for double-declining balance -# See: http://en.wikipedia.org/wiki/Depreciation -# -*/ - - SocialCalc.Formula.DDBFunction = function (fname, operand, foperand, sheet) { - var method, depreciation, accumulateddepreciation, i; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - var period = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - if (scf.CheckForErrorValue(operand, period)) return; - - if (lifetime.value < 1) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfuncddblife - ); - return 0; - } - - method = { value: 2, type: "n" }; - if (foperand.length > 0) { - method = scf.OperandAsNumber(sheet, foperand); - } - if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (scf.CheckForErrorValue(operand, method)) return; - - depreciation = 0; // calculated for each period - accumulateddepreciation = 0; // accumulated by adding each period's - - for (i = 1; i <= period.value - 0 && i <= lifetime.value; i++) { - // calculate for each period based on net from previous - depreciation = - (cost.value - accumulateddepreciation) * - (method.value / lifetime.value); - if (cost.value - accumulateddepreciation - depreciation < salvage.value) { - // don't go lower than salvage value - depreciation = cost.value - accumulateddepreciation - salvage.value; - } - accumulateddepreciation += depreciation; - } - - scf.PushOperand(operand, "n$", depreciation); - - return; - }; - - SocialCalc.Formula.FunctionList["DDB"] = [ - SocialCalc.Formula.DDBFunction, - -4, - "ddb", - "", - "financial", - ]; - - /* -# -# SLN(cost,salvage,lifetime) -# -# Depreciation for each period by straight-line method -# See: http://en.wikipedia.org/wiki/Depreciation -# -*/ - - SocialCalc.Formula.SLNFunction = function (fname, operand, foperand, sheet) { - var depreciation; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - - if (lifetime.value < 1) { - scf.FunctionSpecificError( - fname, - operand, - "e#NUM!", - SocialCalc.Constants.s_sheetfuncslnlife - ); - return 0; - } - - depreciation = (cost.value - salvage.value) / lifetime.value; - - scf.PushOperand(operand, "n$", depreciation); - - return; - }; - - SocialCalc.Formula.FunctionList["SLN"] = [ - SocialCalc.Formula.SLNFunction, - 3, - "csl", - "", - "financial", - ]; - - /* -# -# SYD(cost,salvage,lifetime,period) -# -# Depreciation by Sum of Year's Digits method -# -*/ - - SocialCalc.Formula.SYDFunction = function (fname, operand, foperand, sheet) { - var depreciation, sumperiods; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - var period = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - if (scf.CheckForErrorValue(operand, period)) return; - - if (lifetime.value < 1 || period.value <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return 0; - } - - sumperiods = ((lifetime.value + 1) * lifetime.value) / 2; // add up 1 through lifetime - depreciation = - ((cost.value - salvage.value) * (lifetime.value - period.value + 1)) / - sumperiods; // calc depreciation - - scf.PushOperand(operand, "n$", depreciation); - - return; - }; - - SocialCalc.Formula.FunctionList["SYD"] = [ - SocialCalc.Formula.SYDFunction, - 4, - "cslp", - "", - "financial", - ]; - - /* -# -# FV(rate, n, payment, [pv, [paytype]]) -# NPER(rate, payment, pv, [fv, [paytype]]) -# PMT(rate, n, pv, [fv, [paytype]]) -# PV(rate, n, payment, [fv, [paytype]]) -# RATE(n, payment, pv, [fv, [paytype, [guess]]]) -# -# Following the Open Document Format formula specification: -# -# PV = - Fv - (Payment * Nper) [if rate equals 0] -# Pv*(1+Rate)^Nper + Payment * (1 + Rate*PaymentType) * ( (1+Rate)^nper -1)/Rate + Fv = 0 -# -# For each function, the formulas are solved for the appropriate value (transformed using -# basic algebra). -# -*/ - - SocialCalc.Formula.InterestFunctions = function ( - fname, - operand, - foperand, - sheet - ) { - var resulttype, result, dval, evalue, fval; - var pv, - fv, - rate, - n, - payment, - paytype, - guess, - part1, - part2, - part3, - part4, - part5; - var olddelta, maxloop, tries, deltaepsilon, rate, oldrate, m; - - var scf = SocialCalc.Formula; - - var aval = scf.OperandAsNumber(sheet, foperand); - var bval = scf.OperandAsNumber(sheet, foperand); - var cval = scf.OperandAsNumber(sheet, foperand); - - resulttype = scf.LookupResultType( - aval.type, - bval.type, - scf.TypeLookupTable.twoargnumeric - ); - resulttype = scf.LookupResultType( - resulttype, - cval.type, - scf.TypeLookupTable.twoargnumeric - ); - if (foperand.length) { - // optional arguments - dval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType( - resulttype, - dval.type, - scf.TypeLookupTable.twoargnumeric - ); - if (foperand.length) { - // optional arguments - evalue = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType( - resulttype, - evalue.type, - scf.TypeLookupTable.twoargnumeric - ); - if (foperand.length) { - // optional arguments - if (fname != "RATE") { - // only rate has 6 possible args - scf.FunctionArgsError(fname, operand); - return 0; - } - fval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType( - resulttype, - fval.type, - scf.TypeLookupTable.twoargnumeric - ); - } - } - } - - if (resulttype == "n") { - switch (fname) { - case "FV": // FV(rate, n, payment, [pv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - pv = dval != null ? dval.value : 0; // get value if present, or use default - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - if (rate == 0) { - // simple calculation if no interest - fv = -pv - payment * n; - } else { - fv = -( - pv * Math.pow(1 + rate, n) + - (payment * (1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / - rate - ); - } - result = fv; - resulttype = "n$"; - break; - - case "NPER": // NPER(rate, payment, pv, [fv, [paytype]]) - rate = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - if (rate == 0) { - // simple calculation if no interest - if (payment == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - n = (pv + fv) / -payment; - } else { - part1 = (payment * (1 + rate * paytype)) / rate; - part2 = pv + part1; - if (part2 == 0 || rate <= -1) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part3 = (part1 - fv) / part2; - if (part3 <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part4 = Math.log(part3); - part5 = Math.log(1 + rate); // rate > -1 - n = part4 / part5; - } - result = n; - resulttype = "n"; - break; - - case "PMT": // PMT(rate, n, pv, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - pv = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - if (n == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } else if (rate == 0) { - // simple calculation if no interest - payment = (fv - pv) / n; - } else { - payment = - (0 - fv - pv * Math.pow(1 + rate, n)) / - (((1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / rate); - } - result = payment; - resulttype = "n$"; - break; - - case "PV": // PV(rate, n, payment, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (eval.value ? 1 : 0) : 0; - if (rate == -1) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } else if (rate == 0) { - // simple calculation if no interest - pv = -fv - payment * n; - } else { - pv = - (-fv - - (payment * (1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / - rate) / - Math.pow(1 + rate, n); - } - result = pv; - resulttype = "n$"; - break; - - case "RATE": // RATE(n, payment, pv, [fv, [paytype, [guess]]]) - n = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval != null ? dval.value : 0; - paytype = evalue != null ? (evalue.value ? 1 : 0) : 0; - guess = fval != null ? fval.value : 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 100; - tries = 0; - delta = 1; - epsilon = 0.0000001; // this is close enough - rate = guess || 0.00000001; // zero is not allowed - while ((delta >= 0 ? delta : -delta) > epsilon && rate != oldrate) { - delta = - fv + - pv * Math.pow(1 + rate, n) + - (payment * (1 + rate * paytype) * (Math.pow(1 + rate, n) - 1)) / - rate; - if (olddelta != null) { - m = (delta - olddelta) / (rate - oldrate) || 0.001; // get slope (not zero) - oldrate = rate; - rate = rate - delta / m; // look for zero crossing - olddelta = delta; - } else { - // first time - no old values - oldrate = rate; - rate = 1.1 * rate; - olddelta = delta; - } - tries++; - if (tries >= maxloop) { - // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - result = rate; - resulttype = "n%"; - break; - } - } - - scf.PushOperand(operand, resulttype, result); - - return; - }; - - SocialCalc.Formula.FunctionList["FV"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "fv", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["NPER"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "nper", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["PMT"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "pmt", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["PV"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "pv", - "", - "financial", - ]; - SocialCalc.Formula.FunctionList["RATE"] = [ - SocialCalc.Formula.InterestFunctions, - -3, - "rate", - "", - "financial", - ]; - - /* -# -# NPV(rate,v1,v2,c1:c2,...) -# -*/ - - SocialCalc.Formula.NPVFunction = function (fname, operand, foperand, sheet) { - var resulttypenpv, rate, sum, factor, value1; - - var scf = SocialCalc.Formula; - - var rate = scf.OperandAsNumber(sheet, foperand); - if (scf.CheckForErrorValue(operand, rate)) return; - - sum = 0; - resulttypenpv = "n"; - factor = 1; - - while (foperand.length) { - value1 = scf.OperandValueAndType(sheet, foperand); - if (value1.type.charAt(0) == "n") { - factor *= 1 + rate.value; - if (factor == 0) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - sum += value1.value / factor; - resulttypenpv = scf.LookupResultType( - value1.type, - resulttypenpv || value1.type, - scf.TypeLookupTable.plus - ); - } else if ( - value1.type.charAt(0) == "e" && - resulttypenpv.charAt(0) != "e" - ) { - resulttypenpv = value1.type; - break; - } - } - - if (resulttypenpv.charAt(0) == "n") { - resulttypenpv = "n$"; - } - - scf.PushOperand(operand, resulttypenpv, sum); - - return; - }; - - SocialCalc.Formula.FunctionList["NPV"] = [ - SocialCalc.Formula.NPVFunction, - -2, - "npv", - "", - "financial", - ]; - - /* -# -# IRR(c1:c2,[guess]) -# -*/ - - SocialCalc.Formula.IRRFunction = function (fname, operand, foperand, sheet) { - var value1, - guess, - oldsum, - maxloop, - tries, - epsilon, - rate, - oldrate, - m, - sum, - factor, - i; - var rangeoperand = []; - var cashflows = []; - - var scf = SocialCalc.Formula; - - rangeoperand.push(foperand.pop()); // first operand is a range - - while (rangeoperand.length) { - // get values from range so we can do iterative approximations - value1 = scf.OperandValueAndType(sheet, rangeoperand); - if (value1.type.charAt(0) == "n") { - cashflows.push(value1.value); - } else if (value1.type.charAt(0) == "e") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - } - - if (!cashflows.length) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - - guess = { value: 0 }; - - if (foperand.length) { - // guess is provided - guess = scf.OperandAsNumber(sheet, foperand); - if (guess.type.charAt(0) != "n" && guess.type.charAt(0) != "b") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { - // should be no more args - scf.FunctionArgsError(fname, operand); - return; - } - } - - guess.value = guess.value || 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 20; - tries = 0; - epsilon = 0.0000001; // this is close enough - rate = guess.value; - sum = 1; - - while ((sum >= 0 ? sum : -sum) > epsilon && rate != oldrate) { - sum = 0; - factor = 1; - for (i = 0; i < cashflows.length; i++) { - factor *= 1 + rate; - if (factor == 0) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - sum += cashflows[i] / factor; - } - - if (oldsum != null) { - m = (sum - oldsum) / (rate - oldrate); // get slope - oldrate = rate; - rate = rate - sum / m; // look for zero crossing - oldsum = sum; - } else { - // first time - no old values - oldrate = rate; - rate = 1.1 * rate; - oldsum = sum; - } - tries++; - if (tries >= maxloop) { - // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - - scf.PushOperand(operand, "n%", rate); - - return; - }; - - SocialCalc.Formula.FunctionList["IRR"] = [ - SocialCalc.Formula.IRRFunction, - -1, - "irr", - "", - "financial", - ]; - - // - // SHEET CACHE - // - - SocialCalc.Formula.SheetCache = { - // Sheet data: Attributes are each sheet in the cache with values of an object with: - // - // sheet: sheet-obj (or null, meaning not found) - // recalcstate: constants.asloaded = as loaded - // constants.recalcing = being recalced now - // constants.recalcdone = recalc done - // name: name of sheet (in case just have object and don't know name) - // - - sheets: {}, - - // Waiting for loading: - // If sheet is not in cache, this is set to the sheetname being loaded - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForLoading: null, - - // Constants to use for setting sheets[*].recalcstate: - - constants: { asloaded: 0, recalcing: 1, recalcdone: 2 }, - - loadsheet: null, // (deprecated - use SocialCalc.RecalcInfo.LoadSheet) - }; - - // - // othersheet = SocialCalc.Formula.FindInSheetCache(sheetname) - // - // Returns a SocialCalc.Sheet object corresponding to string sheetname - // or null if the sheet is not available or in error. - // - // Each sheet is loaded only once and then stored in a cache. - // Loading is handled elsewhere, e.g., in the recalc loop. - // - - SocialCalc.Formula.FindInSheetCache = function (sheetname) { - var str; - var sfsc = SocialCalc.Formula.SheetCache; - - var nsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); // normalize different versions - - if (sfsc.sheets[nsheetname]) { - // a sheet by that name is in the cache already - return sfsc.sheets[nsheetname].sheet; // return it - } - - if (sfsc.waitingForLoading) { - // waiting already - only queue up one - return null; // return not found - } - - sfsc.waitingForLoading = nsheetname; // let recalc loop know that we have a sheet to load - - return null; // return not found - }; - - // - // newsheet = SocialCalc.Formula.AddSheetToCache(sheetname, str) - // - // Adds a new sheet to the sheet cache. - // Returns the sheet object filled out with the str (a saved sheet). - // - - SocialCalc.Formula.AddSheetToCache = function (sheetname, str) { - var newsheet = null; - var sfsc = SocialCalc.Formula.SheetCache; - var sfscc = sfsc.constants; - var newsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); - - if (str) { - newsheet = new SocialCalc.Sheet(); - newsheet.ParseSheetSave(str); - } - - sfsc.sheets[newsheetname] = { - sheet: newsheet, - recalcstate: sfscc.asloaded, - name: newsheetname, - }; - - SocialCalc.Formula.FreshnessInfo.sheets[newsheetname] = true; - - return newsheet; - }; - - // - // nsheet = SocialCalc.Formula.NormalizeSheetName(sheetname) - // - - SocialCalc.Formula.NormalizeSheetName = function (sheetname) { - if (SocialCalc.Callbacks.NormalizeSheetName) { - return SocialCalc.Callbacks.NormalizeSheetName(sheetname); - } else { - return sheetname.toLowerCase(); - } - }; - - // - // REMOTE FUNCTION INFO - // - - SocialCalc.Formula.RemoteFunctionInfo = { - // Waiting for server: - // If waiting for an XHR response from the server, this is set to some non-blank status text - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForServer: null, - }; - - // - // FRESHNESS INFO - // - // This information is generated during recalc. - // It may be used to help determine when the recalc data in a spreadsheet - // may be out of date. - // For example, it may be used to display a message like: - // "Dependent on sheet 'FOO' which was updated more recently than this printout" - - SocialCalc.Formula.FreshnessInfo = { - // For each external sheet referenced successfully an attribute of that name with value true. - - sheets: {}, - - // For each volatile function that is called an attribute of that name with value true. - - volatile: {}, - - // Set to false when started and true when recalc completes - - recalc_completed: false, - }; - - SocialCalc.Formula.FreshnessInfoReset = function () { - var scffi = SocialCalc.Formula.FreshnessInfo; - - scffi.sheets = {}; - scffi.volatile = {}; - scffi.recalc_completed = false; - }; - - // - // MISC ROUTINES - // - - // - // result = SocialCalc.Formula.PlainCoord(coord) - // - // Returns: coord without any $'s - // - - SocialCalc.Formula.PlainCoord = function (coord) { - if (coord.indexOf("$") == -1) return coord; - - return coord.replace(/\$/g, ""); // remove any $'s - }; - - // - // result = SocialCalc.Formula.OrderRangeParts(coord1, coord2) - // - // Returns: {c1: col, r1: row, c2: col, r2 = row} with c1/r1 upper left - // - - SocialCalc.Formula.OrderRangeParts = function (coord1, coord2) { - var cr1, cr2; - var result = {}; - - cr1 = SocialCalc.coordToCr(coord1); - cr2 = SocialCalc.coordToCr(coord2); - if (cr1.col > cr2.col) { - result.c1 = cr2.col; - result.c2 = cr1.col; - } else { - result.c1 = cr1.col; - result.c2 = cr2.col; - } - if (cr1.row > cr2.row) { - result.r1 = cr2.row; - result.r2 = cr1.row; - } else { - result.r1 = cr1.row; - result.r2 = cr2.row; - } - - return result; - }; - - // - // cond = SocialCalc.Formula.TestCriteria(value, type, criteria) - // - // Determines whether a value/type meets the criteria. - // A criteria can be a numeric value, text beginning with <, <=, =, >=, >, <>, text by itself is start of text to match. - // Used by a variety of functions, including the "D" functions (DSUM, etc.). - // - // Returns true or false - // - - SocialCalc.Formula.TestCriteria = function (value, type, criteria) { - var comparitor, basestring, basevalue, cond, testvalue; - - if (criteria == null) { - // undefined (e.g., error value) is always false - return false; - } - - criteria = criteria + ""; - comparitor = criteria.charAt(0); // look for comparitor - if (comparitor == "=" || comparitor == "<" || comparitor == ">") { - basestring = criteria.substring(1); - } else { - comparitor = criteria.substring(0, 2); - if (comparitor == "<=" || comparitor == "<>" || comparitor == ">=") { - basestring = criteria.substring(2); - } else { - comparitor = "none"; - basestring = criteria; - } - } - - basevalue = SocialCalc.DetermineValueType(basestring); // get type of value being compared - if (!basevalue.type) { - // no criteria base value given - if (comparitor == "none") { - // blank criteria matches nothing - return false; - } - if (type.charAt(0) == "b") { - // comparing to empty cell - if (comparitor == "=") { - // empty equals empty - return true; - } - } else { - if (comparitor == "<>") { - // "something" does not equal empty - return true; - } - } - return false; // otherwise false - } - - cond = false; - - if (basevalue.type.charAt(0) == "n" && type.charAt(0) == "t") { - // criteria is number, but value is text - testvalue = SocialCalc.DetermineValueType(value); - if (testvalue.type.charAt(0) == "n") { - // could be number - make it one - value = testvalue.value; - type = testvalue.type; - } - } - - if (type.charAt(0) == "n" && basevalue.type.charAt(0) == "n") { - // compare two numbers - value = value - 0; // make sure numbers - basevalue.value = basevalue.value - 0; - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - case "none": - cond = value == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } else if (type.charAt(0) == "e") { - // error on left - cond = false; - } else if (basevalue.type.charAt(0) == "e") { - // error on right - cond = false; - } else { - // text, maybe mixed with number or blank - if (type.charAt(0) == "n") { - value = SocialCalc.format_number_for_display(value, "n", ""); - } - if (basevalue.type.charAt(0) == "n") { - return false; // if number and didn't match already, isn't a match - } - - value = value ? value.toLowerCase() : ""; - basevalue.value = basevalue.value ? basevalue.value.toLowerCase() : ""; - - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - cond = value == basevalue.value; - break; - - case "none": - cond = value.substring(0, basevalue.value.length) == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } - - return cond; - }; - - // - /* -// The module of the SocialCalc package for the optional popup menus in socialcalcspreadsheetcontrol.js -// -// (c) Copyright 2009 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// -*/ - - var SocialCalc; // All values are stored in the master SocialCalc object - if (!SocialCalc) { - SocialCalc = {}; - } - - // The main Popup data -- there is only one set - - SocialCalc.Popup = {}; - - // Routines and values for each type of control, indexed by type name - // The value for each is an object constructed as follows: - // - // Create = function(type, id, attribs) - // Initialize = function(type, id, data) - // SetValue = function(type, id, value) - // GetValue = function(type, id) returns value - // SetDisabled = function(type, id, t/f) - // Show = function(type, id) - // Hide = function(type, id) - // Cancel = function(type, id) - // Reset = function(type) - // - // data = object to hold type-specific data - // - - SocialCalc.Popup.Types = {}; - - // Definitions for each individual control, indexed by id - // The value for each is an object constructed as follows: - // - // type: type name of the control - // value: current value of the control (usually a string, but can depend on type) - // data: object with type-specific items - // - - SocialCalc.Popup.Controls = {}; - - // System-wide values of currently active control - // - // id: id of current control or null - // - - SocialCalc.Popup.Current = {}; - - // Other values used by the Popup system - // - - SocialCalc.Popup.imagePrefix = "www/assets/images/sc_"; // image prefix - - // Override this for localization - - SocialCalc.Popup.LocalizeString = function (str) { - return str; - }; - - // * * * * * * * * * * * * * * * * - // - // GENERAL ROUTINES - // - // * * * * * * * * * * * * * * * * - - // - // SocialCalc.Popup.Create(type, id, attribs) - // - // Creates a control of type "type" as the children of document element "id" using "attribs" - // - - SocialCalc.Popup.Create = function (type, id, attribs) { - var pt = SocialCalc.Popup.Types[type]; - if (pt && pt.Create) { - pt.Create(type, id, attribs); - } - }; - - // - // SocialCalc.Popup.SetValue(id, value) - // - // Sets the value of control. - // - - SocialCalc.Popup.SetValue = function (id, value) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - var pt = spt[type]; - var spcdata = spc[id].data; - - if (pt && pt.Create) { - pt.SetValue(type, id, value); - if (spcdata.attribs && spcdata.attribs.changedcallback) { - spcdata.attribs.changedcallback(spcdata.attribs, id, value); - } - } - }; - - // - // SocialCalc.Popup.SetDisabled(id, disabled) - // - // Sets whether the control is disabled (true) or not (false). - // - - SocialCalc.Popup.SetDisabled = function (id, disabled) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - if (sp.Current.id && id == sp.Current.id) { - pt.Hide(type, sp.Current.id); - sp.Current.id = null; - } - pt.SetDisabled(type, id, disabled); - } - }; - - // - // SocialCalc.Popup.GetValue(id) - // - // Returns the value of control. - // - - SocialCalc.Popup.GetValue = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - return pt.GetValue(type, id); - } - - return null; - }; - - // - // SocialCalc.Popup.Initialize(id, data) - // - // Gives "data" to the appropriate initialization code. - // - - SocialCalc.Popup.Initialize = function (id, data) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Initialize) { - pt.Initialize(type, id, data); - } - }; - - // - // SocialCalc.Popup.Reset(type) - // - // Resets Popup, such as when turning to page. - // - - SocialCalc.Popup.Reset = function (type) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (spt[type].Reset) spt[type].Reset(type); - }; - - // - // SocialCalc.Popup.CClick(id) - // - // Should be called when the user clicks on a control to do the popup - // - - SocialCalc.Popup.CClick = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) { - alert("Unknown control " + id); - return; - } - - if (spc[id].data && spc[id].data.disabled) return; - - var type = spc[id].type; - - var pt = spt[type]; - - if (sp.Current.id) { - spt[spc[sp.Current.id].type].Hide(type, sp.Current.id); - if (id == sp.Current.id) { - // same one - done - sp.Current.id = null; - return; - } - } - - if (pt && pt.Show) { - pt.Show(type, id); - } - - sp.Current.id = id; - }; - - // - // SocialCalc.Popup.Close() - // - // Used to close any open popup. - // - - SocialCalc.Popup.Close = function () { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - sp.CClick(sp.Current.id); - }; - - // - // SocialCalc.Popup.Cancel() - // - // Closes Popup and restores old value - // - - SocialCalc.Popup.Cancel = function () { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - var type = spc[sp.Current.id].type; - - var pt = spt[type]; - - pt.Cancel(type, sp.Current.id); - - sp.Current.id = null; - }; - - // - // ele = SocialCalc.Popup.CreatePopupDiv(id, attribs) - // - // Utility function to create the main popup div of width attribs.width. - // If attribs.title, create one with that text, and optionally attribs.moveable. - // - - SocialCalc.Popup.CreatePopupDiv = function (id, attribs) { - var pos, ele; - - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = document.createElement("div"); - main.style.position = "absolute"; - - pos = SocialCalc.GetElementPositionWithScroll(spcdata.mainele); - - main.style.top = pos.top + spcdata.mainele.offsetHeight + "px"; - main.style.left = pos.left + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - if (attribs.width) { - main.style.width = attribs.width; - } - - spcdata.mainele.appendChild(main); - - if (attribs.title) { - main.innerHTML = - '' + - '" + - '
    ' + - attribs.title + - " X 
    '; - - if (attribs.moveable) { - spcdata.dragregistered = - main.firstChild.firstChild.firstChild.firstChild; - SocialCalc.DragRegister(spcdata.dragregistered, true, true, { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - }); - } - } - - return main; - }; - - // - // SocialCalc.Popup.EnsurePosition(id, container) - // - // Utility function to make sure popup is positioned completely within container (both element objects) - // and appropriate with respect to the main element controlling the popup. - // - - SocialCalc.Popup.EnsurePosition = function (id, container) { - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = spcdata.mainele.firstChild; - if (!main) { - alert("No main popup element firstChild."); - return; - } - var popup = spcdata.popupele; - - function GetLayoutValues(ele) { - var r = SocialCalc.GetElementPositionWithScroll(ele); - r.height = ele.offsetHeight; - r.width = ele.offsetWidth; - r.bottom = r.top + r.height; - r.right = r.left + r.width; - return r; - } - - var p = GetLayoutValues(popup); - var c = GetLayoutValues(container); - var m = GetLayoutValues(main); - var t = 0; // type of placement - //addmsg("popup t/r/b/l/h/w= "+p.top+"/"+p.right+"/"+p.bottom+"/"+p.left+"/"+p.height+"/"+p.width); - //addmsg("container t/r/b/l/h/w= "+c.top+"/"+c.right+"/"+c.bottom+"/"+c.left+"/"+c.height+"/"+c.width); - //addmsg("main t/r/b/l/h/w= "+m.top+"/"+m.right+"/"+m.bottom+"/"+m.left+"/"+m.height+"/"+m.width); - - // Check various layout cases in priority order - - if (m.bottom + p.height < c.bottom && m.left + p.width < c.right) { - // normal case: room on bottom and right - popup.style.top = m.bottom + "px"; - popup.style.left = m.left + "px"; - t = 1; - } else if (m.top - p.height > c.top && m.left + p.width < c.right) { - // room on top and right - popup.style.top = m.top - p.height + "px"; - popup.style.left = m.left + "px"; - t = 2; - } else if (m.bottom + p.height < c.bottom && m.right - p.width > c.left) { - // room on bottom and left - popup.style.top = m.bottom + "px"; - popup.style.left = m.right - p.width + "px"; - t = 3; - } else if (m.top - p.height > c.top && m.right - p.width > c.left) { - // room on top and left - popup.style.top = m.top - p.height + "px"; - popup.style.left = m.right - p.width + "px"; - t = 4; - } else if (m.bottom + p.height < c.bottom && p.width < c.width) { - // room on bottom and middle - popup.style.top = m.bottom + "px"; - popup.style.left = c.left + Math.floor((c.width - p.width) / 2) + "px"; - t = 5; - } else if (m.top - p.height > c.top && p.width < c.width) { - // room on top and middle - popup.style.top = m.top - p.height + "px"; - popup.style.left = c.left + Math.floor((c.width - p.width) / 2) + "px"; - t = 6; - } else if (p.height < c.height && m.right + p.width < c.right) { - // room on middle and right - popup.style.top = c.top + Math.floor((c.height - p.height) / 2) + "px"; - popup.style.left = m.right + "px"; - t = 7; - } else if (p.height < c.height && m.left - p.width > c.left) { - // room on middle and left - popup.style.top = c.top + Math.floor((c.height - p.height) / 2) + "px"; - popup.style.left = m.left - p.width + "px"; - t = 8; - } else { - // nothing works, so leave as it is - } - //addmsg("Popup layout "+t); - }; - - // - // ele = SocialCalc.Popup.DestroyPopupDiv(ele, dragregistered) - // - // Utility function to get rid of the main popup div. - // - - SocialCalc.Popup.DestroyPopupDiv = function (ele, dragregistered) { - if (!ele) return; - - ele.innerHTML = ""; - - SocialCalc.DragUnregister(dragregistered); // OK to do this even if not registered - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - // - // Color Utility Functions - // - - SocialCalc.Popup.RGBToHex = function (val) { - var sp = SocialCalc.Popup; - - if (val == "") { - return "000000"; - } - var rgbvals = val.match(/(\d+)\D+(\d+)\D+(\d+)/); - if (rgbvals) { - return sp.ToHex(rgbvals[1]) + sp.ToHex(rgbvals[2]) + sp.ToHex(rgbvals[3]); - } else { - return "000000"; - } - }; - - SocialCalc.Popup.HexDigits = "0123456789ABCDEF"; - - SocialCalc.Popup.ToHex = function (num) { - var sp = SocialCalc.Popup; - var first = Math.floor(num / 16); - var second = num % 16; - return sp.HexDigits.charAt(first) + sp.HexDigits.charAt(second); - }; - - SocialCalc.Popup.FromHex = function (str) { - var sp = SocialCalc.Popup; - var first = sp.HexDigits.indexOf(str.charAt(0).toUpperCase()); - var second = sp.HexDigits.indexOf(str.charAt(1).toUpperCase()); - return (first >= 0 ? first : 0) * 16 + (second >= 0 ? second : 0); - }; - - SocialCalc.Popup.HexToRGB = function (val) { - var sp = SocialCalc.Popup; - - return ( - "rgb(" + - sp.FromHex(val.substring(1, 3)) + - "," + - sp.FromHex(val.substring(3, 5)) + - "," + - sp.FromHex(val.substring(5, 7)) + - ")" - ); - }; - - SocialCalc.Popup.makeRGB = function (r, g, b) { - return ( - "rgb(" + - (r > 0 ? r : 0) + - "," + - (g > 0 ? g : 0) + - "," + - (b > 0 ? b : 0) + - ")" - ); - }; - - SocialCalc.Popup.splitRGB = function (rgb) { - var parts = rgb.match(/(\d+)\D+(\d+)\D+(\d+)\D/); - if (!parts) { - return { r: 0, g: 0, b: 0 }; - } else { - return { r: parts[1] - 0, g: parts[2] - 0, b: parts[3] - 0 }; - } - }; - - // * * * * * * * * * * * * * * * * - // - // ROUTINES FOR EACH TYPE - // - // * * * * * * * * * * * * * * * * - - // - // List - // - // type: List - // value: value of control, - // display: "value to display", - // custom: true if custom value, - // disabled: t/f, - // attribs: { - // title: "popup title string", - // moveable: t/f, - // width: optional width, e.g., "100px", - // ensureWithin: optional element object to ensure popup fits within if possible - // changedcallback: optional function(attribs, id, newvalue), - // ... - // } - // data: { - // ncols: calculated number of columns - // options: [ - // {o: option-name, v: value-to-return, - // a: {option attribs} // optional: {skip: true, custom: true, cancel: true, newcol: true} - // }, - // ...] - // } - // - // popupele: gets popup element object when created - // contentele: gets element created with all the content - // listdiv: gets div with list of items - // customele: gets input element with custom value - // dragregistered: gets element, if any, registered as draggable - // - - SocialCalc.Popup.Types.List = {}; - - SocialCalc.Popup.Types.List.Create = function (type, id, attribs) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - var spcid = { type: type, value: "", display: "", data: {} }; - if (spc[id]) { - return; - } - spc[id] = spcid; - var spcdata = spcid.data; - - spcdata.attribs = attribs || {}; - - var ele = document.getElementById(id); - if (!ele) { - alert("Missing element " + id); - return; - } - - spcdata.mainele = ele; - - ele.innerHTML = - ''; - - spcdata.options = []; // set to nothing - use Initialize to fill - }; - - SocialCalc.Popup.Types.List.SetValue = function (type, id, value) { - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - spcdata.value = value; - spcdata.custom = false; - - for (i = 0; i < spcdata.options.length; i++) { - o = spcdata.options[i]; - if (o.a) { - if (o.a.skip || o.a.custom || o.a.cancel) { - continue; - } - } - if (o.v == spcdata.value) { - // matches value - spcdata.display = o.o; - break; - } - } - if (i == spcdata.options.length) { - // none found - spcdata.display = "Custom"; - spcdata.custom = true; - } - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.value = spcdata.display; - } - }; - - SocialCalc.Popup.Types.List.SetDisabled = function (type, id, disabled) { - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - spcdata.disabled = disabled; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = disabled; - } - }; - - SocialCalc.Popup.Types.List.GetValue = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - return spcdata.value; - }; - - // data is: {value: initial value, attribs: {attribs stuff}, options: [{o: option-name, v: value-to-return, a: optional-attribs}, ...]} - - SocialCalc.Popup.Types.List.Initialize = function (type, id, data) { - var a; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - for (a in data.attribs) { - spcdata.attribs[a] = data.attribs[a]; - } - - spcdata.options = data ? data.options : []; - - if (data.value) { - // if has a value, set to it - sp.SetValue(id, data.value); - } - }; - - SocialCalc.Popup.Types.List.Reset = function (type) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (sp.Current.id && spc[sp.Current.id].type == type) { - // we have a popup - spt[type].Hide(type, sp.Current.id); - sp.Current.id = null; - } - }; - - SocialCalc.Popup.Types.List.Show = function (type, id) { - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var str = ""; - - spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs); - - if (spcdata.custom) { - str = SocialCalc.Popup.Types.List.MakeCustom(type, id); - - ele = document.createElement("div"); - ele.innerHTML = - '
    ' + - str + - "
    "; - - spcdata.customele = ele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = ele; - } else { - str = SocialCalc.Popup.Types.List.MakeList(type, id); - - ele = document.createElement("div"); - ele.innerHTML = - '
    ' + str + "
    "; - - spcdata.customele = null; - spcdata.listdiv = ele.firstChild; - spcdata.contentele = ele; - } - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = true; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.List.MakeList = function (type, id) { - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var str = ''; - var td = '" + td + "    " + "" + td; - spcdata.ncols += 1; - continue; - } - if (o.a.skip) { - str += - '
    ' + - o.o + - "
    "; - continue; - } - } - if (o.v == spcdata.value && !(o.a && (o.a.custom || o.a.cancel))) { - // matches value - bg = "background-color:#DDF;"; - } else { - bg = ""; - } - str += - '
    " + - o.o + - "
    "; - } - - str += "
    '; - - str += td; - - spcdata.ncols = 1; - - for (i = 0; i < spcdata.options.length; i++) { - o = spcdata.options[i]; - if (o.a) { - if (o.a.newcol) { - str += "
    "; - - return str; - }; - - SocialCalc.Popup.Types.List.MakeCustom = function (type, id) { - var SPLoc = SocialCalc.Popup.LocalizeString; - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - var val = spcdata.value; - val = SocialCalc.special_chars(val); - - str = - '

    ' + - '

    ' + - "" + - "" + - "' + - "
    "; - - return str; - }; - - SocialCalc.Popup.Types.List.ItemClicked = function (id, num) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var a = spcdata.options[num].a; - - if (a && a.custom) { - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeCustom("List", id); - nele = document.createElement("div"); - nele.innerHTML = - '
    ' + - str + - "
    "; - spcdata.customele = nele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - return; - } - - if (a && a.cancel) { - SocialCalc.Popup.Close(); - return; - } - - SocialCalc.Popup.SetValue(id, spcdata.options[num].v); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.List.CustomToList = function (id) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeList("List", id); - nele = document.createElement("div"); - nele.innerHTML = - '
    ' + str + "
    "; - spcdata.customele = null; - spcdata.listdiv = nele.firstChild; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.List.CustomOK = function (id) { - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.customele.value); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.List.MouseMove = function (id, ele) { - var col, i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var list = spcdata.listdiv; - - if (!list) return; - - var rowele = list.firstChild.firstChild.firstChild; // div.table.tbody.tr - - for (col = 0; col < spcdata.ncols; col++) { - for (i = 0; i < rowele.childNodes[col * 2].childNodes.length; i++) { - rowele.childNodes[col * 2].childNodes[i].style.backgroundColor = "#FFF"; - } - } - - ele.style.backgroundColor = "#DDF"; - }; - - SocialCalc.Popup.Types.List.Hide = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered); - spcdata.popupele = null; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = false; - } - }; - - SocialCalc.Popup.Types.List.Cancel = function (type, id) { - SocialCalc.Popup.Types.List.Hide(type, id); - }; - - // - // ColorChooser - // - // type: ColorChooser - // value: value of control as "rgb(r,g,b)" or "" if default, - // oldvalue: starting value to reset to on close, - // display: "value to display" as hex color value, - // custom: true if custom value, - // disabled: t/f, - // attribs: { - // title: "popup title string", - // moveable: t/f, - // width: optional width, e.g., "100px", of popup chooser - // ensureWithin: optional element object to ensure popup fits within if possible - // sampleWidth: optional width, e.g., "20px", - // sampleHeight: optional height, e.g., "20px", - // backgroundImage: optional background image for sample (transparent where want to show current color), e.g., "colorbg.gif" - // backgroundImageDefault: optional background image for sample when default (transparent shows white) - // backgroundImageDisabled: optional background image for sample when disabled (transparent shows gray) - // changedcallback: optional function(attribs, id, newvalue), - // ... - // } - // data: { - // } - // - // popupele: gets popup element object when created - // contentele: gets element created with all the content - // customele: gets input element with custom value - // - - SocialCalc.Popup.Types.ColorChooser = {}; - - SocialCalc.Popup.Types.ColorChooser.Create = function (type, id, attribs) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - var spcid = { type: type, value: "", display: "", data: {} }; - if (spc[id]) { - return; - } - spc[id] = spcid; - var spcdata = spcid.data; - - spcdata.attribs = attribs || {}; - var spca = spcdata.attribs; - - spcdata.value = ""; - - var ele = document.getElementById(id); - if (!ele) { - alert("Missing element " + id); - return; - } - - spcdata.mainele = ele; - - ele.innerHTML = - '
     
    "; - }; - - SocialCalc.Popup.Types.ColorChooser.SetValue = function (type, id, value) { - var i, img, pos; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.value = value; - spcdata.custom = false; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (spcdata.value) { - spcdata.mainele.firstChild.style.backgroundColor = spcdata.value; - if (spca.backgroundImage) { - img = "url(" + sp.imagePrefix + spca.backgroundImage + ")"; - } else { - img = ""; - } - pos = "center center"; - } else { - spcdata.mainele.firstChild.style.backgroundColor = "#FFF"; - if (spca.backgroundImageDefault) { - img = "url(" + sp.imagePrefix + spca.backgroundImageDefault + ")"; - pos = "center center"; - } else { - img = "url(" + sp.imagePrefix + "defaultcolor.gif)"; - pos = "left top"; - } - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } - }; - - SocialCalc.Popup.Types.ColorChooser.SetDisabled = function ( - type, - id, - disabled - ) { - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.disabled = disabled; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (disabled) { - spcdata.mainele.firstChild.style.backgroundColor = "#DDD"; - if (spca.backgroundImageDisabled) { - img = "url(" + sp.imagePrefix + spca.backgroundImageDisabled + ")"; - pos = "center center"; - } else { - img = "url(" + sp.imagePrefix + "defaultcolor.gif)"; - pos = "left top"; - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } else { - sp.SetValue(id, spcdata.value); - } - } - }; - - SocialCalc.Popup.Types.ColorChooser.GetValue = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - return spcdata.value; - }; - - SocialCalc.Popup.Types.ColorChooser.Initialize = function (type, id, data) { - var a; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - for (a in data.attribs) { - spcdata.attribs[a] = data.attribs[a]; - } - - if (data.value) { - // if has a value, set to it - sp.SetValue(id, data.value); - } - }; - - SocialCalc.Popup.Types.ColorChooser.Reset = function (type) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (sp.Current.id && spc[sp.Current.id].type == type) { - // we have a popup - spt[type].Hide(type, sp.Current.id); - sp.Current.id = null; - } - }; - - SocialCalc.Popup.Types.ColorChooser.Show = function (type, id) { - var i, ele, mainele; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var str = ""; - - spcdata.oldvalue = spcdata.value; // remember starting value - - spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs); - - if (spcdata.custom) { - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom(type, id); - - ele = document.createElement("div"); - ele.innerHTML = - '
    ' + - str + - "
    "; - - spcdata.customele = ele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = ele; - } else { - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid(type, id); - - ele = document.createElement("div"); - ele.style.padding = "3px"; - ele.style.backgroundColor = "#CCC"; - ele.appendChild(mainele); - - spcdata.customele = null; - spcdata.contentele = ele; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.ColorChooser.MakeCustom = function (type, id) { - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var SPLoc = sp.LocalizeString; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - str = - '

    ' + - '#

    ' + - "" + - "" + - "
    "; - - return str; - }; - - SocialCalc.Popup.Types.ColorChooser.ItemClicked = function (id, num) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.CustomToList = function (id) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - }; - - SocialCalc.Popup.Types.ColorChooser.CustomOK = function (id) { - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.customele.value); - - sp.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.Hide = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered); - spcdata.popupele = null; - }; - - SocialCalc.Popup.Types.ColorChooser.Cancel = function (type, id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.oldvalue); // reset to old value - - SocialCalc.Popup.Types.ColorChooser.Hide(type, id); - }; - - SocialCalc.Popup.Types.ColorChooser.CreateGrid = function (type, id) { - var ele, pos, row, rowele, col, g; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var SPLoc = sp.LocalizeString; - var spcdata = spc[id].data; - spcdata.grid = {}; - var grid = spcdata.grid; - - var mainele = document.createElement("div"); - - ele = document.createElement("table"); - ele.cellSpacing = 0; - ele.cellPadding = 0; - ele.style.width = "100px"; - grid.table = ele; - - ele = document.createElement("tbody"); - grid.table.appendChild(ele); - grid.tbody = ele; - - for (row = 0; row < 16; row++) { - rowele = document.createElement("tr"); - for (col = 0; col < 5; col++) { - g = {}; - grid[row + "," + col] = g; - ele = document.createElement("td"); - ele.style.fontSize = "1px"; - ele.innerHTML = " "; - ele.style.height = "10px"; - if (col <= 1) { - ele.style.width = "17px"; - ele.style.borderRight = "3px solid white"; - } else { - ele.style.width = "20px"; - ele.style.backgroundRepeat = "no-repeat"; - } - rowele.appendChild(ele); - g.ele = ele; - } - grid.tbody.appendChild(rowele); - } - mainele.appendChild(grid.table); - - ele = document.createElement("div"); - ele.style.marginTop = "3px"; - ele.innerHTML = - '' + - '' + - '' + - '" + - "
     #' + - SPLoc("OK") + - "
    "; - grid.defaultbox = ele.firstChild.firstChild.firstChild.childNodes[0]; - grid.defaultbox.onclick = spt.ColorChooser.DefaultClicked; - grid.custom = ele.firstChild.firstChild.firstChild.childNodes[1]; - grid.custom.onclick = spt.ColorChooser.CustomClicked; - grid.msg = ele.firstChild.firstChild.firstChild.childNodes[2]; - grid.msg.onclick = spt.ColorChooser.CloseOK; - mainele.appendChild(ele); - - grid.table.onmousedown = spt.ColorChooser.GridMouseDown; - - spt.ColorChooser.DetermineColors(id); - spt.ColorChooser.SetColors(id); - - return mainele; - }; - - SocialCalc.Popup.Types.ColorChooser.gridToG = function (grid, row, col) { - return grid[row + "," + col]; - }; - - SocialCalc.Popup.Types.ColorChooser.DetermineColors = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - var col, row; - var rgb = sp.splitRGB(spcdata.value); - var color; - - col = 2; - row = 16 - Math.floor((rgb.r + 16) / 16); - grid["selectedrow" + col] = row; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB(17 * (15 - row), 0, 0); - } - - col = 3; - row = 16 - Math.floor((rgb.g + 16) / 16); - grid["selectedrow" + col] = row; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB(0, 17 * (15 - row), 0); - } - - col = 4; - row = 16 - Math.floor((rgb.b + 16) / 16); - grid["selectedrow" + col] = row; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB(0, 0, 17 * (15 - row)); - } - - col = 1; - for (row = 0; row < 16; row++) { - sptc.gridToG(grid, row, col).rgb = sp.makeRGB( - 17 * (15 - row), - 17 * (15 - row), - 17 * (15 - row) - ); - } - - col = 0; - var steps = [0, 68, 153, 204, 255]; - var commonrgb = [ - "400", - "310", - "420", - "440", - "442", - "340", - "040", - "042", - "032", - "044", - "024", - "004", - "204", - "314", - "402", - "414", - ]; - var x; - for (row = 0; row < 16; row++) { - x = commonrgb[row]; - sptc.gridToG(grid, row, col).rgb = - "rgb(" + - steps[x.charAt(0) - 0] + - "," + - steps[x.charAt(1) - 0] + - "," + - steps[x.charAt(2) - 0] + - ")"; - } - }; - - SocialCalc.Popup.Types.ColorChooser.SetColors = function (id) { - var row, col, g, ele, rgb; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - for (row = 0; row < 16; row++) { - for (col = 0; col < 5; col++) { - g = sptc.gridToG(grid, row, col); - g.ele.style.backgroundColor = g.rgb; - g.ele.title = sp.RGBToHex(g.rgb); - if (grid["selectedrow" + col] == row) { - g.ele.style.backgroundImage = - "url(" + sp.imagePrefix + "chooserarrow.gif)"; - } else { - g.ele.style.backgroundImage = ""; - } - } - } - - sp.SetValue(id, spcdata.value); - - grid.msg.style.backgroundColor = spcdata.value; - rgb = sp.splitRGB(spcdata.value || "rgb(255,255,255)"); - if (rgb.r + rgb.g + rgb.b < 220) { - grid.msg.style.color = "#FFF"; - } else { - grid.msg.style.color = "#000"; - } - if (!spcdata.value) { - // default - grid.msg.style.backgroundColor = "#FFF"; - grid.msg.style.backgroundImage = - "url(" + sp.imagePrefix + "defaultcolor.gif)"; - grid.msg.title = "Default"; - } else { - grid.msg.style.backgroundImage = ""; - grid.msg.title = sp.RGBToHex(spcdata.value); - } - }; - - SocialCalc.Popup.Types.ColorChooser.GridMouseDown = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - var grid = spcdata.grid; - - switch (event.type) { - case "mousedown": - grid.mousedown = true; - break; - case "mouseup": - grid.mousedown = false; - break; - case "mousemove": - if (!grid.mousedown) { - return; - } - break; - } - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - var gpos = SocialCalc.GetElementPosition(grid.table); - var row = Math.floor((clientY - gpos.top - 2) / 10); // -2 is to split the diff btw IE & FF - row = row < 0 ? 0 : row; - var col = Math.floor((clientX - gpos.left) / 20); - row = row < 0 ? 0 : row > 15 ? 15 : row; - col = col < 0 ? 0 : col > 4 ? 4 : col; - var color = sptc.gridToG(grid, row, col).ele.style.backgroundColor; - var newrgb = sp.splitRGB(color); - var oldrgb = sp.splitRGB(spcdata.value); - - switch (col) { - case 2: - spcdata.value = sp.makeRGB(newrgb.r, oldrgb.g, oldrgb.b); - break; - case 3: - spcdata.value = sp.makeRGB(oldrgb.r, newrgb.g, oldrgb.b); - break; - case 4: - spcdata.value = sp.makeRGB(oldrgb.r, oldrgb.g, newrgb.b); - break; - case 0: - case 1: - spcdata.value = color; - } - - sptc.DetermineColors(id); - sptc.SetColors(id); - }; - - SocialCalc.Popup.Types.ColorChooser.ControlClicked = function (id) { - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var cid = sp.Current.id; - if (!cid || id != cid) { - sp.CClick(id); - return; - } - - sptc.CloseOK(); - }; - - SocialCalc.Popup.Types.ColorChooser.DefaultClicked = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - spcdata.value = ""; - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.CustomClicked = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - var oele, str, nele; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom("ColorChooser", id); - nele = document.createElement("div"); - nele.innerHTML = - '
    ' + - str + - "
    "; - spcdata.customele = nele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - spcdata.customele.value = sp.RGBToHex(spcdata.value); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.ColorChooser.CustomToGrid = function (id) { - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#" + spcdata.customele.value)); - - var oele, mainele, nele; - - oele = spcdata.contentele; - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid( - "ColorChooser", - id - ); - nele = document.createElement("div"); - nele.style.padding = "3px"; - nele.style.backgroundColor = "#CCC"; - nele.appendChild(mainele); - spcdata.customele = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - }; - - SocialCalc.Popup.Types.ColorChooser.CustomOK = function (id) { - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#" + spcdata.customele.value)); - - SocialCalc.Popup.Close(); - }; - - SocialCalc.Popup.Types.ColorChooser.CloseOK = function (e) { - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - }; - - // - // SocialCalcSpreadsheetControl - // - /* -// The code module of the SocialCalc package that lets you embed a spreadsheet -// control with toolbar, etc., into a web page. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - - /* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript SpreadsheetControl. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the SpreadsheetControl is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/ - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - - // - // Some of the other files in the SocialCalc package are licensed under - // different licenses. Please note the licenses of the modules you use. - // - // Code History: - // - // Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. - // Unless otherwise specified, referring to "SocialCalc" in comments refers to this - // JavaScript version of the code, not the SocialCalc Perl code. - // - - /* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); - } - - // ************************************* - // - // SpreadsheetControl class: - // - // ************************************* - - // Global constants: - - SocialCalc.CurrentSpreadsheetControlObject = null; // right now there can only be one active at a time - - // Constructor: - - SocialCalc.SpreadsheetControl = function () { - var scc = SocialCalc.Constants; - - // Properties: - - this.parentNode = null; - this.spreadsheetDiv = null; - this.requestedHeight = 0; - this.requestedWidth = 0; - this.requestedSpaceBelow = 0; - this.height = 0; - this.width = 0; - this.viewheight = 0; // calculated amount for views below toolbar, etc. - - // Tab definitions: An array where each tab is an object of the form: - // - // name: "name", - // text: "text-on-tab", - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext - // Other replacements from spreadsheet.tabreplacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // view: "viewname", // view to show when selected; "sheet" or missing/null is spreadsheet - // oncreate: function(spreadsheet, tab-name), // called when first created to initialize - // onclick: function(spreadsheet, tab-name), missing/null is sheet default - // onclickFocus: text, // spreadsheet.idPrefix+text is given the focus if present instead of normal KeyboardFocus - // or if text isn't a string, that value (e.g., true) is used for SocialCalc.CmdGotFocus - // onunclick: function(spreadsheet, tab-name), missing/null is sheet default - - this.tabs = []; - this.tabnums = {}; // when adding tabs, add tab-name: array-index to this object - this.tabreplacements = {}; // see use above - this.currentTab = -1; // currently selected tab index in this.tabs or -1 (maintained by SocialCalc.SetTab) - - // View definitions: An object where each view is an object of the form: - // - // name: "name", // localized when first set using SocialCalc.LocalizeString - // element: node-in-the-dom, // filled in when initialized - // replacements: {}, // see below - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext, "%img.": spreadsheet.imagePrefix, - // SocialCalc.LocalizeSubstring replacements ("%loc!string!" and "%ssc!constant-name!") - // Other replacements from viewobject.replacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // divStyle: attributes for sheet div (SocialCalc.setStyles format) - // oncreate: function(spreadsheet, viewobject), // called when first created to initialize - // needsresize: true/false/null, // if true, do resize calc after displaying - // onresize: function(spreadsheet, viewobject), // called if needs resize - // values: {} // optional values to share with onclick handlers, etc. - // - // There is always a "sheet" view. - - this.views = {}; // {viewname: view-object, ...} - - // Dynamic properties: - - this.sheet = null; - this.context = null; - this.editor = null; - - this.spreadsheetDiv = null; - this.editorDiv = null; - - this.sortrange = ""; // remembered range for sort tab - - this.moverange = ""; // remembered range from movefrom used by movepaste/moveinsert - - // Constants: - - this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-" - this.multipartBoundary = "SocialCalcSpreadsheetControlSave"; // boundary used by SpreadsheetControlCreateSpreadsheetSave - this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src - - this.toolbarbackground = scc.SCToolbarbackground; - this.tabbackground = scc.SCTabbackground; // "background-color:#CCC;"; - this.tabselectedCSS = scc.SCTabselectedCSS; - this.tabplainCSS = scc.SCTabplainCSS; - this.toolbartext = scc.SCToolbartext; - - this.formulabarheight = scc.SCFormulabarheight; // in pixels, will contain a text input box - - if (scc.doWorkBook) { - this.sheetbarheight = scc.SCSheetBarHeight; - this.sheetbarCSS = scc.SCSheetBarCSS; - } else { - this.sheetbarheight = 0; - } - - this.statuslineheight = scc.SCStatuslineheight; // in pixels - this.statuslineCSS = scc.SCStatuslineCSS; - - // Callbacks: - - this.ExportCallback = null; // a function called for Clipboard Export button: this.ExportCallback(spreadsheet_control_object) - - // Initialization Code: - - this.sheet = new SocialCalc.Sheet(); - this.context = new SocialCalc.RenderContext(this.sheet); - this.context.showGrid = true; - this.context.showRCHeaders = true; - this.editor = new SocialCalc.TableEditor(this.context); - this.editor.StatusCallback.statusline = { - func: SocialCalc.SpreadsheetControlStatuslineCallback, - params: { - statuslineid: this.idPrefix + "statusline", - recalcid1: this.idPrefix + "divider_recalc", - recalcid2: this.idPrefix + "button_recalc", - }, - }; - - SocialCalc.CurrentSpreadsheetControlObject = this; // remember this for rendezvousing on events - - this.editor.MoveECellCallback.movefrom = function (editor) { - var cr; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - spreadsheet.context.cursorsuffix = ""; - if (editor.range2.hasrange && !editor.cellhandles.noCursorSuffix) { - if ( - editor.ecell.row == editor.range2.top && - (editor.ecell.col < editor.range2.left || - editor.ecell.col > editor.range2.right + 1) - ) { - spreadsheet.context.cursorsuffix = "insertleft"; - } - if ( - editor.ecell.col == editor.range2.left && - (editor.ecell.row < editor.range2.top || - editor.ecell.row > editor.range2.bottom + 1) - ) { - spreadsheet.context.cursorsuffix = "insertup"; - } - } - }; - - // formula bar buttons - - this.formulabuttons = { - formulafunctions: { - image: "formuladialog.gif", - tooltip: "Functions", // tooltips are localized when set below - command: SocialCalc.SpreadsheetControl.DoFunctionList, - }, - multilineinput: { - image: "multilinedialog.gif", - tooltip: "Multi-line Input Box", - command: SocialCalc.SpreadsheetControl.DoMultiline, - }, - link: { - image: "linkdialog.gif", - tooltip: "Link Input Box", - command: SocialCalc.SpreadsheetControl.DoLink, - }, - sum: { - image: "sumdialog.gif", - tooltip: "Auto Sum", - command: SocialCalc.SpreadsheetControl.DoSum, - }, - /* image: {image: "sumdialog.gif", tooltip: "Insert", - command: SocialCalc.Images.Insert }*/ - }; - - // Default tabs: - - // Edit - - this.tabnums.edit = this.tabs.length; - this.tabs.push({ - name: "edit", - text: "Edit", - html: - '
    ' + - ' ' + - ' ' + - '    ' + - '' + - ' ' + - ' ' + - '    ' + - '' + - ' ' + - '    ' + - '' + - ' ' + - '    ' + - '' + - ' ' + - ' ' + - '    ' + - '' + - ' ' + - ' ' + - '    ' + - ' ' + - ' ' + - ' ' + - '    ' + - ' ' + - ' ' + - '    ' + - ' ' + - ' ' + - '  ' + - ' ' + - '    ' + - ' ' + - "
    ", - oncreate: null, //function(spreadsheet, viewobject) {SocialCalc.DoCmd(null, "fill-rowcolstuff");}, - onclick: null, - }); - - // Settings (Format) - - this.tabnums.settings = this.tabs.length; - this.tabs.push({ - name: "settings", - text: "Format", - html: - '", - view: "settings", - onclick: function (s, t) { - SocialCalc.SettingsControls.idPrefix = s.idPrefix; // used to get color chooser div - SocialCalc.SettingControlReset(); - var sheetattribs = s.sheet.EncodeSheetAttributes(); - var cellattribs = s.sheet.EncodeCellAttributes(s.editor.ecell.coord); - SocialCalc.SettingsControlLoadPanel( - s.views.settings.values.sheetspanel, - sheetattribs - ); - SocialCalc.SettingsControlLoadPanel( - s.views.settings.values.cellspanel, - cellattribs - ); - document.getElementById(s.idPrefix + "settingsecell").innerHTML = - s.editor.ecell.coord; - SocialCalc.SpreadsheetControlSettingsSwitch("cell"); - s.views.settings.element.style.height = s.viewheight + "px"; - s.views.settings.element.firstChild.style.height = s.viewheight + "px"; - - var range; // set save message - if (s.editor.range.hasrange) { - range = - SocialCalc.crToCoord(s.editor.range.left, s.editor.range.top) + - ":" + - SocialCalc.crToCoord(s.editor.range.right, s.editor.range.bottom); - } else { - range = s.editor.ecell.coord; - } - document.getElementById(s.idPrefix + "settings-savecell").value = - SocialCalc.LocalizeString("Save to") + ": " + range; - }, - onclickFocus: true, - }); - - this.views["settings"] = { - name: "settings", - values: {}, - oncreate: function (s, viewobj) { - var scc = SocialCalc.Constants; - - viewobj.values.sheetspanel = { - // name: "sheet", - colorchooser: { id: s.idPrefix + "scolorchooser" }, - formatnumber: { - setting: "numberformat", - type: "PopupList", - id: s.idPrefix + "formatnumber", - initialdata: scc.SCFormatNumberFormats, - }, - formattext: { - setting: "textformat", - type: "PopupList", - id: s.idPrefix + "formattext", - initialdata: scc.SCFormatTextFormats, - }, - fontfamily: { - setting: "fontfamily", - type: "PopupList", - id: s.idPrefix + "fontfamily", - initialdata: scc.SCFormatFontfamilies, - }, - fontlook: { - setting: "fontlook", - type: "PopupList", - id: s.idPrefix + "fontlook", - initialdata: scc.SCFormatFontlook, - }, - fontsize: { - setting: "fontsize", - type: "PopupList", - id: s.idPrefix + "fontsize", - initialdata: scc.SCFormatFontsizes, - }, - textalignhoriz: { - setting: "textalignhoriz", - type: "PopupList", - id: s.idPrefix + "textalignhoriz", - initialdata: scc.SCFormatTextAlignhoriz, - }, - numberalignhoriz: { - setting: "numberalignhoriz", - type: "PopupList", - id: s.idPrefix + "numberalignhoriz", - initialdata: scc.SCFormatNumberAlignhoriz, - }, - alignvert: { - setting: "alignvert", - type: "PopupList", - id: s.idPrefix + "alignvert", - initialdata: scc.SCFormatAlignVertical, - }, - textcolor: { - setting: "textcolor", - type: "ColorChooser", - id: s.idPrefix + "textcolor", - }, - bgcolor: { - setting: "bgcolor", - type: "ColorChooser", - id: s.idPrefix + "bgcolor", - }, - padtop: { - setting: "padtop", - type: "PopupList", - id: s.idPrefix + "padtop", - initialdata: scc.SCFormatPadsizes, - }, - padright: { - setting: "padright", - type: "PopupList", - id: s.idPrefix + "padright", - initialdata: scc.SCFormatPadsizes, - }, - padbottom: { - setting: "padbottom", - type: "PopupList", - id: s.idPrefix + "padbottom", - initialdata: scc.SCFormatPadsizes, - }, - padleft: { - setting: "padleft", - type: "PopupList", - id: s.idPrefix + "padleft", - initialdata: scc.SCFormatPadsizes, - }, - colwidth: { - setting: "colwidth", - type: "PopupList", - id: s.idPrefix + "colwidth", - initialdata: scc.SCFormatColwidth, - }, - recalc: { - setting: "recalc", - type: "PopupList", - id: s.idPrefix + "recalc", - initialdata: scc.SCFormatRecalc, - }, - }; - viewobj.values.cellspanel = { - name: "cell", - colorchooser: { id: s.idPrefix + "scolorchooser" }, - cformatnumber: { - setting: "numberformat", - type: "PopupList", - id: s.idPrefix + "cformatnumber", - initialdata: scc.SCFormatNumberFormats, - }, - cformattext: { - setting: "textformat", - type: "PopupList", - id: s.idPrefix + "cformattext", - initialdata: scc.SCFormatTextFormats, - }, - cfontfamily: { - setting: "fontfamily", - type: "PopupList", - id: s.idPrefix + "cfontfamily", - initialdata: scc.SCFormatFontfamilies, - }, - cfontlook: { - setting: "fontlook", - type: "PopupList", - id: s.idPrefix + "cfontlook", - initialdata: scc.SCFormatFontlook, - }, - cfontsize: { - setting: "fontsize", - type: "PopupList", - id: s.idPrefix + "cfontsize", - initialdata: scc.SCFormatFontsizes, - }, - calignhoriz: { - setting: "alignhoriz", - type: "PopupList", - id: s.idPrefix + "calignhoriz", - initialdata: scc.SCFormatTextAlignhoriz, - }, - calignvert: { - setting: "alignvert", - type: "PopupList", - id: s.idPrefix + "calignvert", - initialdata: scc.SCFormatAlignVertical, - }, - ctextcolor: { - setting: "textcolor", - type: "ColorChooser", - id: s.idPrefix + "ctextcolor", - }, - cbgcolor: { - setting: "bgcolor", - type: "ColorChooser", - id: s.idPrefix + "cbgcolor", - }, - cbt: { setting: "bt", type: "BorderSide", id: s.idPrefix + "cbt" }, - cbr: { setting: "br", type: "BorderSide", id: s.idPrefix + "cbr" }, - cbb: { setting: "bb", type: "BorderSide", id: s.idPrefix + "cbb" }, - cbl: { setting: "bl", type: "BorderSide", id: s.idPrefix + "cbl" }, - cpadtop: { - setting: "padtop", - type: "PopupList", - id: s.idPrefix + "cpadtop", - initialdata: scc.SCFormatPadsizes, - }, - cpadright: { - setting: "padright", - type: "PopupList", - id: s.idPrefix + "cpadright", - initialdata: scc.SCFormatPadsizes, - }, - cpadbottom: { - setting: "padbottom", - type: "PopupList", - id: s.idPrefix + "cpadbottom", - initialdata: scc.SCFormatPadsizes, - }, - cpadleft: { - setting: "padleft", - type: "PopupList", - id: s.idPrefix + "cpadleft", - initialdata: scc.SCFormatPadsizes, - }, - }; - - SocialCalc.SettingsControlInitializePanel(viewobj.values.sheetspanel); - SocialCalc.SettingsControlInitializePanel(viewobj.values.cellspanel); - }, - replacements: { - itemtitle: { - regex: /\%itemtitle\./g, - replacement: - 'style="padding:12px 10px 0px 10px;font-weight:bold;text-align:right;vertical-align:top;font-size:small;"', - }, - sectiontitle: { - regex: /\%sectiontitle\./g, - replacement: - 'style="padding:16px 10px 0px 0px;font-weight:bold;vertical-align:top;font-size:small;color:#C00;"', - }, - parttitle: { - regex: /\%parttitle\./g, - replacement: - 'style="font-weight:bold;font-size:x-small;padding:0px 0px 3px 0px;"', - }, - itembody: { - regex: /\%itembody\./g, - replacement: - 'style="padding:12px 0px 0px 0px;vertical-align:top;font-size:small;"', - }, - bodypart: { - regex: /\%bodypart\./g, - replacement: - 'style="padding:0px 10px 0px 0px;font-size:small;vertical-align:top;"', - }, - }, - divStyle: "border:1px solid black;overflow:auto;", - html: - '' + - '' + - '
    ' + - '' + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - '' + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "" + - " " + - " " + - "" + - "

    %loc!Format!:
    " + - ' ' + - " " + - " " + - "
    " + - "
    %loc!Number!
    " + - ' ' + - "
    " + - "
    %loc!Text!
    " + - ' ' + - "
    " + - "

    %loc!Alignment!:
    " + - ' ' + - " " + - " " + - "
    " + - "
    %loc!Horizontal!
    " + - ' ' + - "
    " + - "
    %loc!Vertical!
    " + - ' ' + - "
    " + - "

    %loc!Font!:
    " + - ' ' + - " " + - " " + - " " + - " " + - " " + - "
    " + - "
    %loc!Family!
    " + - ' ' + - "
    " + - "
    %loc!Bold & Italics!
    " + - ' ' + - "
    " + - "
    %loc!Size!
    " + - ' ' + - "
    " + - "
    %loc!Color!
    " + - '
    ' + - "
    " + - "
    %loc!Background!
    " + - '
    ' + - "
    " + - "

    %loc!Borders!:
    " + - ' ' + - ' ' + - ' ' + - ' ' + - ' ' + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - "
    %loc!Top Border!
    %loc!Right Border!
    %loc!Bottom Border!
    %loc!Left Border!
    " + - ' ' + - " " + - '
    ' + - "
        " + - ' ' + - " " + - '
    ' + - "
        " + - ' ' + - " " + - '
    ' + - "
        " + - ' ' + - " " + - '
    ' + - "
        
    " + - "

    %loc!Padding!:
    " + - ' ' + - " " + - " " + - " " + - " " + - "
    " + - "
    %loc!Top!
    " + - ' ' + - "
    " + - "
    %loc!Right!
    " + - ' ' + - "
    " + - "
    %loc!Bottom!
    " + - ' ' + - "
    " + - "
    %loc!Left!
    " + - ' ' + - "
    " + - "
    " + - '
    ' + - '
    ' + - ' ' + - ' ' + - "
    %loc!This is a
    sample!
    -1234.5
    " + - "
    " + - "
    " + - "
    ", - }; - - // Sort - - this.tabnums.sort = this.tabs.length; - this.tabs.push({ - name: "sort", - text: "Sort", - html: - ' ", - onclick: SocialCalc.SpreadsheetControlSortOnclick, - }); - this.editor.SettingsCallbacks.sort = { - save: SocialCalc.SpreadsheetControlSortSave, - load: SocialCalc.SpreadsheetControlSortLoad, - }; - - // Audit - - this.tabnums.audit = this.tabs.length; - this.tabs.push({ - name: "audit", - text: "Audit", - html: - '", - view: "audit", - onclick: function (s, t) { - var SCLoc = SocialCalc.LocalizeString; - var i, j; - var str = - '
    ' + - SCLoc("Audit Trail This Session") + - ":

    "; - var stack = s.sheet.changes.stack; - var tos = s.sheet.changes.tos; - for (i = 0; i < stack.length; i++) { - if (i == tos + 1) - str += - '
    ' + - SCLoc("UNDONE STEPS") + - ":
    "; - for (j = 0; j < stack[i].command.length; j++) { - str += SocialCalc.special_chars(stack[i].command[j]) + "
    "; - } - } - s.views.audit.element.innerHTML = str + "
    "; - SocialCalc.CmdGotFocus(true); - }, - onclickFocus: true, - }); - - this.views["audit"] = { - name: "audit", - divStyle: "border:1px solid black;overflow:auto;", - html: "Audit Trail", - }; - - // Comment - - this.tabnums.comment = this.tabs.length; - this.tabs.push({ - name: "comment", - text: "Comment", - html: - '", - view: "sheet", - onclick: SocialCalc.SpreadsheetControlCommentOnclick, - onunclick: SocialCalc.SpreadsheetControlCommentOnunclick, - }); - - // Names - - this.tabnums.names = this.tabs.length; - this.tabs.push({ - name: "names", - text: "Names", - html: - '", - view: "sheet", - onclick: SocialCalc.SpreadsheetControlNamesOnclick, - onunclick: SocialCalc.SpreadsheetControlNamesOnunclick, - }); - - // Clipboard - - this.tabnums.clipboard = this.tabs.length; - this.tabs.push({ - name: "clipboard", - text: "Clipboard", - html: - '", - view: "clipboard", - onclick: SocialCalc.SpreadsheetControlClipboardOnclick, - onclickFocus: "clipboardtext", - }); - - this.views["clipboard"] = { - name: "clipboard", - divStyle: "overflow:auto;", - html: - '
    ' + - " %loc!Display Clipboard in!:" + - ' %loc!Tab-delimited format!  ' + - ' %loc!CSV format!  ' + - ' %loc!SocialCalc-save format!' + - "
    " + - '   ' + - '   ' + - "
    " + - ' ', - }; - - return; - }; - - // Methods: - - SocialCalc.SpreadsheetControl.prototype.InitializeSpreadsheetControl = - function (node, height, width, spacebelow) { - return SocialCalc.InitializeSpreadsheetControl( - this, - node, - height, - width, - spacebelow - ); - }; - SocialCalc.SpreadsheetControl.prototype.DoOnResize = function () { - return SocialCalc.DoOnResize(this); - }; - SocialCalc.SpreadsheetControl.prototype.SizeSSDiv = function () { - return SocialCalc.SizeSSDiv(this); - }; - SocialCalc.SpreadsheetControl.prototype.ExecuteCommand = function ( - combostr, - sstr - ) { - return SocialCalc.SpreadsheetControlExecuteCommand(this, combostr, sstr); - }; - SocialCalc.SpreadsheetControl.prototype.CreateSheetHTML = function () { - return SocialCalc.SpreadsheetControlCreateSheetHTML(this); - }; - SocialCalc.SpreadsheetControl.prototype.CreateSpreadsheetSave = function ( - otherparts - ) { - return SocialCalc.SpreadsheetControlCreateSpreadsheetSave(this, otherparts); - }; - SocialCalc.SpreadsheetControl.prototype.DecodeSpreadsheetSave = function ( - str - ) { - return SocialCalc.SpreadsheetControlDecodeSpreadsheetSave(this, str); - }; - SocialCalc.SpreadsheetControl.prototype.CreateCellHTML = function (coord) { - return SocialCalc.SpreadsheetControlCreateCellHTML(this, coord); - }; - SocialCalc.SpreadsheetControl.prototype.CreateCellHTMLSave = function ( - range - ) { - return SocialCalc.SpreadsheetControlCreateCellHTMLSave(this, range); - }; - - // Sheet Methods to make things a little easier: - - SocialCalc.SpreadsheetControl.prototype.ParseSheetSave = function (str) { - return this.sheet.ParseSheetSave(str); - }; - SocialCalc.SpreadsheetControl.prototype.CreateSheetSave = function () { - return this.sheet.CreateSheetSave(); - }; - - // Functions: - - // - // InitializeSpreadsheetControl(spreadsheet, node, height, width, spacebelow) - // - // Creates the control elements and makes them the child of node (string or element). - // If present, height and width specify size. - // If either is 0 or null (missing), the maximum that fits on the screen - // (taking spacebelow into account) is used. - // - // Displays the tabs and creates the views (other than "sheet"). - // The first tab is set as selected, but onclick is not invoked. - // - // You should do a redisplay or recalc (which redisplays) after running this. - // - - SocialCalc.InitializeSpreadsheetControl = function ( - spreadsheet, - node, - height, - width, - spacebelow - ) { - var scc = SocialCalc.Constants; - var SCLoc = SocialCalc.LocalizeString; - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var html, child, i, vname, v, style, button, bele; - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - spreadsheet.requestedHeight = height; - spreadsheet.requestedWidth = width; - spreadsheet.requestedSpaceBelow = spacebelow; - - if (typeof node == "string") node = document.getElementById(node); - - if (node == null) { - alert("SocialCalc.SpreadsheetControl not given parent node."); - } - - spreadsheet.parentNode = node; - - // create node to hold spreadsheet control - - spreadsheet.spreadsheetDiv = document.createElement("div"); - - spreadsheet.SizeSSDiv(); // calculate and fill in the size values - - for (child = node.firstChild; child != null; child = node.firstChild) { - node.removeChild(child); - } - - // create the tabbed UI at the top - - html = - '
    '; - - for (i = 0; i < tabs.length; i++) { - html += tabs[i].html; - } - - html += - "
    " + - '
    ' + - ''; - - for (i = 0; i < tabs.length; i++) { - html += - ' "; - } - - html += "
    ' + - SCLoc(tabs[i].text) + - "
    "; - - spreadsheet.currentTab = 0; // this is where we started - - for (style in spreadsheet.tabreplacements) { - html = html.replace( - spreadsheet.tabreplacements[style].regex, - spreadsheet.tabreplacements[style].replacement - ); - } - html = html.replace(/\%s\./g, "SocialCalc."); - html = html.replace(/\%id\./g, spreadsheet.idPrefix); - html = html.replace(/\%tbt\./g, spreadsheet.toolbartext); - html = html.replace(/\%img\./g, spreadsheet.imagePrefix); - - html = SCLocSS(html); // localize with %loc!string! and %scc!constant! - - spreadsheet.spreadsheetDiv.innerHTML = html; - - node.appendChild(spreadsheet.spreadsheetDiv); - - // Initialize SocialCalc buttons - - spreadsheet.Buttons = { - button_undo: { tooltip: "Undo", command: "undo" }, - button_redo: { tooltip: "Redo", command: "redo" }, - button_copy: { tooltip: "Copy", command: "copy" }, - button_cut: { tooltip: "Cut", command: "cut" }, - button_paste: { tooltip: "Paste", command: "paste" }, - button_pasteformats: { - tooltip: "Paste Formats", - command: "pasteformats", - }, - button_delete: { tooltip: "Delete Contents", command: "delete" }, - button_filldown: { tooltip: "Fill Down", command: "filldown" }, - button_fillright: { tooltip: "Fill Right", command: "fillright" }, - button_movefrom: { tooltip: "Set/Clear Move From", command: "movefrom" }, - button_movepaste: { tooltip: "Move Paste", command: "movepaste" }, - button_moveinsert: { tooltip: "Move Insert", command: "moveinsert" }, - button_alignleft: { tooltip: "Align Left", command: "align-left" }, - button_aligncenter: { tooltip: "Align Center", command: "align-center" }, - button_alignright: { tooltip: "Align Right", command: "align-right" }, - button_borderon: { tooltip: "Borders On", command: "borderon" }, - button_borderoff: { tooltip: "Borders Off", command: "borderoff" }, - button_swapcolors: { tooltip: "Swap Colors", command: "swapcolors" }, - button_merge: { tooltip: "Merge Cells", command: "merge" }, - button_unmerge: { tooltip: "Unmerge Cells", command: "unmerge" }, - button_insertrow: { tooltip: "Insert Row", command: "insertrow" }, - button_insertcol: { tooltip: "Insert Column", command: "insertcol" }, - button_deleterow: { tooltip: "Delete Row", command: "deleterow" }, - button_deletecol: { tooltip: "Delete Column", command: "deletecol" }, - button_recalc: { tooltip: "Recalc", command: "recalc" }, - }; - - for (button in spreadsheet.Buttons) { - bele = document.getElementById(spreadsheet.idPrefix + button); - if (!bele) { - /*alert("Button "+(spreadsheet.idPrefix+button)+" missing");*/ continue; - } - bele.style.border = "1px solid " + scc.ISCButtonBorderNormal; - SocialCalc.TooltipRegister( - bele, - SCLoc(spreadsheet.Buttons[button].tooltip), - {} - ); - SocialCalc.ButtonRegister( - bele, - { - normalstyle: - "border:1px solid " + - scc.ISCButtonBorderNormal + - ";backgroundColor:" + - scc.ISCButtonBorderNormal + - ";", - hoverstyle: - "border:1px solid " + - scc.ISCButtonBorderHover + - ";backgroundColor:" + - scc.ISCButtonBorderNormal + - ";", - downstyle: - "border:1px solid " + - scc.ISCButtonBorderDown + - ";backgroundColor:" + - scc.ISCButtonDownBackground + - ";", - }, - { - MouseDown: SocialCalc.DoButtonCmd, - command: spreadsheet.Buttons[button].command, - } - ); - } - - // create formula bar - - spreadsheet.dummyFormulaDiv = document.createElement("div"); - spreadsheet.dummyFormulaDiv.style.height = - spreadsheet.formulabarheight + "px"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.dummyFormulaDiv); - - spreadsheet.formulabarDiv = document.createElement("div"); - spreadsheet.formulabarDiv.id = "formulabardiv"; - spreadsheet.formulabarDiv.style.height = - spreadsheet.formulabarheight + "px"; - spreadsheet.formulabarDiv.innerHTML = - ''; //' '; - //spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - var inputbox = new SocialCalc.InputBox( - spreadsheet.formulabarDiv.firstChild, - spreadsheet.editor - ); - - bele = document.createElement("img"); - bele.id = "testtest"; - bele.src = "lib/aspiring/www/assets/images/delete24.png"; - bele.style.verticalAlign = "middle"; - //bele.style.border = "1px solid #FFF"; - //bele.style.marginLeft = "4px"; - bele.style.display = "none"; - SocialCalc.ButtonRegister( - bele, - { normalstyle: "", hoverstyle: "", downstyle: "" }, - { MouseDown: SocialCalc.InputLineClearText } - ); - - // spreadsheet.formulabarDiv.appendChild(bele); - - /* - for (button in spreadsheet.formulabuttons) { - bele = document.createElement("img"); - bele.id = spreadsheet.idPrefix+button; - bele.src = spreadsheet.imagePrefix+spreadsheet.formulabuttons[button].image; - bele.style.verticalAlign = "middle"; - bele.style.border = "1px solid #FFF"; - bele.style.marginLeft = "4px"; - SocialCalc.TooltipRegister(bele, SCLoc(spreadsheet.formulabuttons[button].tooltip), {}); - SocialCalc.ButtonRegister(bele, - {normalstyle: "border:1px solid #FFF;backgroundColor:#FFF;", - hoverstyle: "border:1px solid #CCC;backgroundColor:#FFF;", - downstyle: "border:1px solid #000;backgroundColor:#FFF;"}, - {MouseDown: spreadsheet.formulabuttons[button].command}); - spreadsheet.formulabarDiv.appendChild(bele); - } - */ - // initialize tabs that need it - - for (i = 0; i < tabs.length; i++) { - // execute any tab-specific initialization code - if (tabs[i].oncreate) { - tabs[i].oncreate(spreadsheet, tabs[i].name); - } - } - - // create sheet view and others - if (!scc.doWorkBook) { - spreadsheet.nonviewheight = - spreadsheet.statuslineheight + - spreadsheet.spreadsheetDiv.firstChild.offsetHeight + - spreadsheet.spreadsheetDiv.lastChild.offsetHeight; - } else { - spreadsheet.nonviewheight = - 28 + - spreadsheet.sheetbarheight + - spreadsheet.spreadsheetDiv.firstChild.offsetHeight + - spreadsheet.spreadsheetDiv.lastChild.offsetHeight; - } - spreadsheet.viewheight = spreadsheet.height - spreadsheet.nonviewheight; - spreadsheet.editorDiv = spreadsheet.editor.CreateTableEditor( - spreadsheet.width, - spreadsheet.viewheight - ); - - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.editorDiv); - - for (vname in views) { - html = views[vname].html; - for (style in views[vname].replacements) { - html = html.replace( - views[vname].replacements[style].regex, - views[vname].replacements[style].replacement - ); - } - html = html.replace(/\%s\./g, "SocialCalc."); - html = html.replace(/\%id\./g, spreadsheet.idPrefix); - html = html.replace(/\%tbt\./g, spreadsheet.toolbartext); - html = html.replace(/\%img\./g, spreadsheet.imagePrefix); - v = document.createElement("div"); - SocialCalc.setStyles(v, views[vname].divStyle); - v.style.display = "none"; - v.style.width = spreadsheet.width + "px"; - v.style.height = spreadsheet.viewheight + "px"; - - html = SCLocSS(html); // localize with %loc!string!, etc. - - v.innerHTML = html; - spreadsheet.spreadsheetDiv.appendChild(v); - views[vname].element = v; - if (views[vname].oncreate) { - views[vname].oncreate(spreadsheet, views[vname]); - } - } - - views.sheet = { name: "sheet", element: spreadsheet.editorDiv }; - - // create statusline - - if (!scc.doWorkBook) { - spreadsheet.statuslineDiv = document.createElement("div"); - spreadsheet.statuslineDiv.style.cssText = spreadsheet.statuslineCSS; - // spreadsheet.statuslineDiv.style.height = spreadsheet.statuslineheight + "px"; // didn't take padding into account! - spreadsheet.statuslineDiv.style.height = - spreadsheet.statuslineheight - - (spreadsheet.statuslineDiv.style.paddingTop.slice(0, -2) - 0) - - (spreadsheet.statuslineDiv.style.paddingBottom.slice(0, -2) - 0) + - "px"; - spreadsheet.statuslineDiv.id = spreadsheet.idPrefix + "statusline"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.statuslineDiv); - } else { - SocialCalc.CreateSheetStatusBar(spreadsheet, scc); - } - - // done - refresh screen needed - - return; - }; - - SocialCalc.CreateSheetStatusBar = function (spreadsheet, scc) { - // create sheetbar - if (!scc.doWorkBook) { - return; - } - - // create a table with 1 row, containing 3 columns, 1 for sheetbar, 1 for separator, 1 for statusline - - spreadsheet.sheetstatusbarDiv = document.createElement("div"); - spreadsheet.sheetstatusbarDiv.style.height = - spreadsheet.sheetbarheight + 3 + "px"; - spreadsheet.sheetstatusbarDiv.style.backgroundColor = "#CCC"; - spreadsheet.sheetstatusbarDiv.id = spreadsheet.idPrefix + "sheetstatusbar"; - - spreadsheet.sheetbarDiv = document.createElement("div"); - //spreadsheet.sheetbarDiv.style.cssText = spreadsheet.sheetbarCSS; - spreadsheet.sheetbarDiv.id = spreadsheet.idPrefix + "sheetbar"; - - spreadsheet.statuslineDiv = document.createElement("div"); - spreadsheet.statuslineDiv.style.cssText = spreadsheet.statuslineCSS; - spreadsheet.statuslineDiv.id = spreadsheet.idPrefix + "statusline"; - - var table = document.createElement("table"); - spreadsheet.sheetstatusbartable = table; - table.cellSpacing = 0; - table.cellPadding = 0; - table.width = "100%"; - - var tbody = document.createElement("tbody"); - table.appendChild(tbody); - - var tr = document.createElement("tr"); - tbody.appendChild(tr); - var td = document.createElement("td"); - td.appendChild(spreadsheet.sheetbarDiv); - td.width = scc.SCSheetBarWidth; - tr.appendChild(td); - - td = document.createElement("td"); - td.innerHTML = " | "; - td.width = "1%"; - tr.appendChild(td); - - td = document.createElement("td"); - td.appendChild(spreadsheet.statuslineDiv); - tr.appendChild(td); - - spreadsheet.sheetstatusbarDiv.appendChild(table); - - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.sheetstatusbarDiv); - - spreadsheet.sheetstatusbarDiv.style.display = "none"; - }; - - // - // outstr = SocialCalc.LocalizeString(str) - // - // SocialCalc function to make localization easier. - // If str is "Text to localize", it returns - // SocialCalc.Constants.s_loc_text_to_localize if - // it exists, or else with just "Text to localize". - // Note that spaces are replaced with "_" and other special - // chars with "X" in the name of the constant (e.g., "A & B" - // would look for SocialCalc.Constants.s_loc_a_X_b. - // - - SocialCalc.LocalizeString = function (str) { - var cstr = SocialCalc.LocalizeStringList[str]; // found already this session? - if (!cstr) { - // no - look up - cstr = - SocialCalc.Constants[ - "s_loc_" + str.toLowerCase().replace(/\s/g, "_").replace(/\W/g, "X") - ] || str; - SocialCalc.LocalizeStringList[str] = cstr; - } - return cstr; - }; - - SocialCalc.LocalizeStringList = {}; // a list of strings to localize accumulated by the routine - - // - // outstr = SocialCalc.LocalizeSubstrings(str) - // - // SocialCalc function to make localization easier using %loc and %scc. - // - // Replaces sections of str with: - // %loc!Text to localize! - // with SocialCalc.Constants.s_loc_text_to_localize if - // it exists, or else with just "Text to localize". - // Note that spaces are replaced with "_" and other special - // chars with "X" in the name of the constant (e.g., %loc!A & B! - // would look for SocialCalc.Constants.s_loc_a_X_b. - // Uses SocialCalc.LocalizeString for this. - // - // Replaces sections of str with: - // %ssc!constant-name! - // with SocialCalc.Constants.constant-name. - // If the constant doesn't exist, throws and alert. - // - - SocialCalc.LocalizeSubstrings = function (str) { - var SCLoc = SocialCalc.LocalizeString; - - return str.replace(/%(loc|ssc)!(.*?)!/g, function (a, t, c) { - if (t == "ssc") { - return SocialCalc.Constants[c] || alert("Missing constant: " + c); - } else { - return SCLoc(c); - } - }); - }; - - // - // obj = GetSpreadsheetControlObject() - // - // Returns the current spreadsheet control object - // - - SocialCalc.GetSpreadsheetControlObject = function () { - var csco = SocialCalc.CurrentSpreadsheetControlObject; - if (csco) return csco; - - // throw ("No current SpreadsheetControl object."); - }; - - // - // SocialCalc.DoOnResize(spreadsheet) - // - // Processes an onResize event, setting the different views. - // - - SocialCalc.DoOnResize = function (spreadsheet) { - var v; - var views = spreadsheet.views; - - var needresize = spreadsheet.SizeSSDiv(); - if (!needresize) return; - - for (vname in views) { - v = views[vname].element; - v.style.width = spreadsheet.width + "px"; - v.style.height = spreadsheet.height - spreadsheet.nonviewheight + "px"; - } - - spreadsheet.editor.ResizeTableEditor( - spreadsheet.width, - spreadsheet.height - spreadsheet.nonviewheight - ); - }; - - // - // resized = SocialCalc.SizeSSDiv(spreadsheet) - // - // Figures out a reasonable size for the spreadsheet, given any requested values and viewport. - // Sets ssdiv to that. - // Return true if different than existing values. - // - - SocialCalc.SizeSSDiv = function (spreadsheet) { - var sizes, pos, resized, nodestyle, newval; - var fudgefactorX = 10; // for IE - var fudgefactorY = 10; - - resized = false; - - sizes = SocialCalc.GetViewportInfo(); - pos = SocialCalc.GetElementPosition(spreadsheet.parentNode); - pos.bottom = 0; - pos.right = 0; - - nodestyle = spreadsheet.parentNode.style; - - if (nodestyle.marginTop) { - pos.top += nodestyle.marginTop.slice(0, -2) - 0; - } - if (nodestyle.marginBottom) { - pos.bottom += nodestyle.marginBottom.slice(0, -2) - 0; - } - if (nodestyle.marginLeft) { - pos.left += nodestyle.marginLeft.slice(0, -2) - 0; - } - if (nodestyle.marginRight) { - pos.right += nodestyle.marginRight.slice(0, -2) - 0; - } - - newval = - spreadsheet.requestedHeight || - sizes.height - - (pos.top + pos.bottom + fudgefactorY) - - (spreadsheet.requestedSpaceBelow || 0); - if (spreadsheet.height != newval) { - spreadsheet.height = newval; - spreadsheet.spreadsheetDiv.style.height = newval + "px"; - resized = true; - } - newval = - spreadsheet.requestedWidth || - sizes.width - (pos.left + pos.right + fudgefactorX) || - 700; - if (spreadsheet.width != newval) { - spreadsheet.width = newval; - spreadsheet.spreadsheetDiv.style.width = newval + "px"; - resized = true; - } - - return resized; - }; - - // - // SocialCalc.SetTab(obj) - // - // The obj argument is either a string with the tab name or a DOM element with an ID - // - - SocialCalc.SetTab = function (obj) { - var newtab, tname, newtabnum, newview, i, vname, ele; - var menutabs = {}; - var tools = {}; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - if (typeof obj == "string") { - newtab = obj; - } else { - newtab = obj.id.slice(spreadsheet.idPrefix.length, -3); - } - - if ( - spreadsheet.editor.busy && // if busy and switching from "sheet", ignore - (!tabs[spreadsheet.currentTab].view || - tabs[spreadsheet.currentTab].view == "sheet") - ) { - for (i = 0; i < tabs.length; i++) { - if (tabs[i].name == newtab && tabs[i].view && tabs[i].view != "sheet") { - return; - } - } - } - - if (spreadsheet.tabs[spreadsheet.currentTab].onunclick) { - spreadsheet.tabs[spreadsheet.currentTab].onunclick( - spreadsheet, - spreadsheet.tabs[spreadsheet.currentTab].name - ); - } - - for (i = 0; i < tabs.length; i++) { - tname = tabs[i].name; - menutabs[tname] = document.getElementById( - spreadsheet.idPrefix + tname + "tab" - ); - tools[tname] = document.getElementById( - spreadsheet.idPrefix + tname + "tools" - ); - if (tname == newtab) { - newtabnum = i; - tools[tname].style.display = "block"; - menutabs[tname].style.cssText = spreadsheet.tabselectedCSS; - } else { - tools[tname].style.display = "none"; - menutabs[tname].style.cssText = spreadsheet.tabplainCSS; - } - } - - spreadsheet.currentTab = newtabnum; - - if (tabs[newtabnum].onclick) { - tabs[newtabnum].onclick(spreadsheet, newtab); - } - - for (vname in views) { - if ( - (!tabs[newtabnum].view && vname == "sheet") || - tabs[newtabnum].view == vname - ) { - views[vname].element.style.display = "block"; - newview = vname; - } else { - views[vname].element.style.display = "none"; - } - } - - if (tabs[newtabnum].onclickFocus) { - ele = tabs[newtabnum].onclickFocus; - if (typeof ele == "string") { - ele = document.getElementById(spreadsheet.idPrefix + ele); - ele.focus(); - } - SocialCalc.CmdGotFocus(ele); - } else { - SocialCalc.KeyboardFocus(); - } - - if (views[newview].needsresize && views[newview].onresize) { - views[newview].needsresize = false; - views[newview].onresize(spreadsheet, views[newview]); - } - - if (newview == "sheet") { - spreadsheet.statuslineDiv.style.display = "block"; - spreadsheet.editor.ScheduleRender(); - } else { - spreadsheet.statuslineDiv.style.display = "none"; - } - - return; - }; - - // - // SocialCalc.SpreadsheetControlStatuslineCallback - // - - SocialCalc.SpreadsheetControlStatuslineCallback = function ( - editor, - status, - arg, - params - ) { - var rele1, rele2; - - var ele = document.getElementById(params.statuslineid); - - if (ele) { - ele.innerHTML = editor.GetStatuslineString(status, arg, params); - } - - switch (status) { - case "cmdendnorender": - case "calcfinished": - case "doneposcalc": - rele1 = document.getElementById(params.recalcid1); - rele2 = document.getElementById(params.recalcid2); - if (!rele1 || !rele2) break; - if (editor.context.sheetobj.attribs.needsrecalc == "yes") { - rele1.style.display = "inline"; - rele2.style.display = "inline"; - } else { - rele1.style.display = "none"; - rele2.style.display = "none"; - } - break; - - default: - break; - } - }; - - // - // SocialCalc.UpdateSortRangeProposal(editor) - // - // Updates sort range proposed in the UI in element idPrefix+sortlist - // - - SocialCalc.UpdateSortRangeProposal = function (editor) { - var ele = document.getElementById( - SocialCalc.GetSpreadsheetControlObject().idPrefix + "sortlist" - ); - if (editor.range.hasrange) { - ele.options[0].text = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - ele.options[0].text = SocialCalc.LocalizeString("[select range]"); - } - }; - - // - // SocialCalc.LoadColumnChoosers(spreadsheet) - // - // Updates list of columns for choosing which to sort for Major, Minor, and Last sort - // - - SocialCalc.LoadColumnChoosers = function (spreadsheet) { - var SCLoc = SocialCalc.LocalizeString; - - var sortrange, nrange, rparts, col, colname, sele, oldindex; - - if (spreadsheet.sortrange && spreadsheet.sortrange.indexOf(":") == -1) { - // sortrange is a named range - nrange = SocialCalc.Formula.LookupName( - spreadsheet.sheet, - spreadsheet.sortrange || "" - ); - if (nrange.type == "range") { - rparts = nrange.value.match(/^(.*)\|(.*)\|$/); - sortrange = rparts[1] + ":" + rparts[2]; - } else { - sortrange = "A1:A1"; - } - } else { - sortrange = spreadsheet.sortrange; - } - var range = SocialCalc.ParseRange(sortrange); - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col = range.cr1.col; col <= range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option( - SCLoc("Column ") + colname, - colname - ); - } - sele.selectedIndex = - oldindex > 1 && oldindex <= range.cr2.col - range.cr1.col + 1 - ? oldindex - : 1; // restore what was there if reasonable - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col = range.cr1.col; col <= range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = - oldindex > 0 && oldindex <= range.cr2.col - range.cr1.col + 1 - ? oldindex - : 0; // default to [none] - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col = range.cr1.col; col <= range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = - oldindex > 0 && oldindex <= range.cr2.col - range.cr1.col + 1 - ? oldindex - : 0; // default to [none] - }; - - // - // SocialCalc.CmdGotFocus(obj) - // - // Sets SocialCalc.Keyboard.passThru: obj should be element with focus or "true" - // - - SocialCalc.CmdGotFocus = function (obj) { - SocialCalc.Keyboard.passThru = obj; - }; - - // - // SocialCalc.DoButtonCmd(e, buttoninfo, bobj) - // - - SocialCalc.DoButtonCmd = function (e, buttoninfo, bobj) { - SocialCalc.DoCmd(bobj.element, bobj.functionobj.command); - }; - - // - // SocialCalc.DoCmd(obj, which) - // - // xxx - // - - SocialCalc.DoCmd = function (obj, which) { - var combostr, - sstr, - cl, - i, - clele, - slist, - slistele, - str, - sele, - rele, - lele, - ele, - sortrange, - nrange, - rparts; - var sheet, cell, color, bgcolor, defaultcolor, defaultbgcolor; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - switch (which) { - case "undo": - spreadsheet.ExecuteCommand("undo", ""); - break; - - case "redo": - spreadsheet.ExecuteCommand("redo", ""); - break; - - case "fill-rowcolstuff": - case "fill-text": - cl = which.substring(5); - clele = document.getElementById(spreadsheet.idPrefix + cl + "list"); - clele.length = 0; - for (i = 0; i < SocialCalc.SpreadsheetCmdTable[cl].length; i++) { - clele.options[i] = new Option( - SocialCalc.SpreadsheetCmdTable[cl][i].t - ); - } - which = "changed-" + cl; // fall through to changed code - - case "changed-rowcolstuff": - case "changed-text": - cl = which.substring(8); - clele = document.getElementById(spreadsheet.idPrefix + cl + "list"); - slist = - SocialCalc.SpreadsheetCmdTable.slists[ - SocialCalc.SpreadsheetCmdTable[cl][clele.selectedIndex].s - ]; // get sList for this command - slistele = document.getElementById(spreadsheet.idPrefix + cl + "slist"); - slistele.length = 0; // reset - for (i = 0; i < (slist.length || 0); i++) { - slistele.options[i] = new Option(slist[i].t, slist[i].s); - } - return; // nothing else to do - - case "ok-rowcolstuff": - case "ok-text": - cl = which.substring(3); - clele = document.getElementById(spreadsheet.idPrefix + cl + "list"); - slistele = document.getElementById(spreadsheet.idPrefix + cl + "slist"); - combostr = SocialCalc.SpreadsheetCmdTable[cl][clele.selectedIndex].c; - sstr = slistele[slistele.selectedIndex].value; - SocialCalc.SpreadsheetControlExecuteCommand(obj, combostr, sstr); - break; - - case "ok-setsort": - lele = document.getElementById(spreadsheet.idPrefix + "sortlist"); - if (lele.selectedIndex == 0) { - if (editor.range.hasrange) { - spreadsheet.sortrange = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - spreadsheet.sortrange = - editor.ecell.coord + ":" + editor.ecell.coord; - } - } else { - spreadsheet.sortrange = lele.options[lele.selectedIndex].value; - } - ele = document.getElementById(spreadsheet.idPrefix + "sortbutton"); - ele.value = SocialCalc.LocalizeString("Sort ") + spreadsheet.sortrange; - ele.style.visibility = "visible"; - SocialCalc.LoadColumnChoosers(spreadsheet); - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - return; - - case "dosort": - if (spreadsheet.sortrange && spreadsheet.sortrange.indexOf(":") == -1) { - // sortrange is a named range - nrange = SocialCalc.Formula.LookupName( - spreadsheet.sheet, - spreadsheet.sortrange || "" - ); - if (nrange.type != "range") return; - rparts = nrange.value.match(/^(.*)\|(.*)\|$/); - sortrange = rparts[1] + ":" + rparts[2]; - } else { - sortrange = spreadsheet.sortrange; - } - if (sortrange == "A1:A1") return; - str = "sort " + sortrange + " "; - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - rele = document.getElementById(spreadsheet.idPrefix + "majorsortup"); - str += - sele.options[sele.selectedIndex].value + - (rele.checked ? " up" : " down"); - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "minorsortup"); - str += - " " + - sele.options[sele.selectedIndex].value + - (rele.checked ? " up" : " down"); - } - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "lastsortup"); - str += - " " + - sele.options[sele.selectedIndex].value + - (rele.checked ? " up" : " down"); - } - spreadsheet.ExecuteCommand(str, ""); - break; - - case "merge": - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - if (editor.range.hasrange) { - // set ecell to upper left - editor.MoveECell( - SocialCalc.crToCoord(editor.range.left, editor.range.top) - ); - editor.RangeRemove(); - } - break; - - case "movefrom": - if (editor.range2.hasrange) { - // toggle if already there - spreadsheet.context.cursorsuffix = ""; - editor.Range2Remove(); - spreadsheet.ExecuteCommand("redisplay", ""); - } else if (editor.range.hasrange) { - // set range2 to range or one cell - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.MoveECell( - SocialCalc.crToCoord(editor.range.left, editor.range.top) - ); - } else { - editor.range2.top = editor.ecell.row; - editor.range2.right = editor.ecell.col; - editor.range2.bottom = editor.ecell.row; - editor.range2.left = editor.ecell.col; - editor.range2.hasrange = true; - } - str = editor.range2.hasrange ? "" : "off"; - ele = document.getElementById(spreadsheet.idPrefix + "button_movefrom"); - ele.src = spreadsheet.imagePrefix + "movefrom" + str + ".gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_movepaste" - ); - ele.src = spreadsheet.imagePrefix + "movepaste" + str + ".gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_moveinsert" - ); - ele.src = spreadsheet.imagePrefix + "moveinsert" + str + ".gif"; - if (editor.range2.hasrange) editor.RangeRemove(); - break; - - case "movepaste": - case "moveinsert": - if (editor.range2.hasrange) { - spreadsheet.context.cursorsuffix = ""; - combostr = - which + - " " + - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + - ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) + - " " + - editor.ecell.coord; - spreadsheet.ExecuteCommand(combostr, ""); - editor.Range2Remove(); - ele = document.getElementById( - spreadsheet.idPrefix + "button_movefrom" - ); - ele.src = spreadsheet.imagePrefix + "movefromoff.gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_movepaste" - ); - ele.src = spreadsheet.imagePrefix + "movepasteoff.gif"; - ele = document.getElementById( - spreadsheet.idPrefix + "button_moveinsert" - ); - ele.src = spreadsheet.imagePrefix + "moveinsertoff.gif"; - } - break; - - case "swapcolors": - sheet = spreadsheet.sheet; - cell = sheet.GetAssuredCell(editor.ecell.coord); - defaultcolor = sheet.attribs.defaultcolor - ? sheet.colors[sheet.attribs.defaultcolor] - : "rgb(0,0,0)"; - defaultbgcolor = sheet.attribs.defaultbgcolor - ? sheet.colors[sheet.attribs.defaultbgcolor] - : "rgb(255,255,255)"; - color = cell.color ? sheet.colors[cell.color] : defaultcolor; // get color - if (color == defaultbgcolor) color = ""; // going to swap, so if same as background default, use default - bgcolor = cell.bgcolor ? sheet.colors[cell.bgcolor] : defaultbgcolor; - if (bgcolor == defaultcolor) bgcolor = ""; // going to swap, so if same as foreground default, use default - spreadsheet.ExecuteCommand( - "set %C color " + bgcolor + "%Nset %C bgcolor " + color, - "" - ); - break; - - default: - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - break; - } - - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - }; - - SocialCalc.SpreadsheetCmdLookup = { - copy: "copy %C all", - cut: "cut %C all", - paste: "paste %C all", - pasteformats: "paste %C formats", - delete: "erase %C formulas", - filldown: "filldown %C all", - fillright: "fillright %C all", - erase: "erase %C all", - borderon: "set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S", - borderoff: "set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S", - merge: "merge %C", - unmerge: "unmerge %C", - "align-left": "set %C cellformat left", - "align-center": "set %C cellformat center", - "align-right": "set %C cellformat right", - "align-default": "set %C cellformat", - insertrow: "insertrow %C", - insertcol: "insertcol %C", - deleterow: "deleterow %C", - deletecol: "deletecol %C", - undo: "undo", - redo: "redo", - recalc: "recalc", - }; - - SocialCalc.SpreadsheetCmdSLookup = { - borderon: "1px solid rgb(0,0,0)", - borderoff: "", - }; - - /******* NO LONGER USED - -SocialCalc.SpreadsheetCmdTable = { - cmd: [ - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"}, - {t:"Copy", s:"all", c:"copy %C %S"}, - {t:"Cut", s:"all", c:"cut %C %S"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Merge Cells", s:"none", c:"merge %C"}, - {t:"Unmerge", s:"none", c:"unmerge %C"}, - {t:"Sort", s:"sortcol", c:"sort %R %S"}, - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Cell Borders", s:"borderOnOff", c:"set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S"}, - {t:"Column Width", s:"colWidths", c:"set %W width %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"}, - {t:"Default Column Width", s:"colWidths", c:"set sheet defaultcolwidth %S"} - ], - rowcolstuff: [ - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"} - ], - text: [ - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Text Format", s:"tvf", c:"set %C textvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Text Format", s:"tvf", c:"set sheet defaulttextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"} - ], - slists: { - "colors": [ - {t:"Default", s:""}, - {t:"Black", s:"rgb(0,0,0)"}, - {t:"Dark Gray", s:"rgb(102,102,102)"}, // #666 - {t:"Gray", s:"rgb(204,204,204)"}, // #CCC - {t:"White", s:"rgb(255,255,255)"}, - {t:"Red", s:"rgb(255,0,0)"}, - {t:"Dark Red", s:"rgb(153,0,0)"}, - {t:"Orange", s:"rgb(255,153,0)"}, - {t:"Yellow", s:"rgb(255,255,0)"}, - {t:"Light Yellow", s:"rgb(255,255,204)"}, - {t:"Green", s:"rgb(0,255,0)"}, - {t:"Dark Green", s:"rgb(0,153,0)"}, - {t:"Blue", s:"rgb(0,0,255)"}, - {t:"Dark Blue", s:"rgb(0,0,153)"}, - {t:"Light Blue", s:"rgb(204,204,255)"} - ], - "fonts": [ // style weight size family - {t:"Default", s:""}, - {t:"Bold", s:"normal bold * *"}, - {t:"Italic", s:"italic normal * *"}, - {t:"Small", s:"* small *"}, - {t:"Medium", s:"* medium *"}, - {t:"Large", s:"* large *"}, - {t:"Bold Small", s:"normal bold small *"}, - {t:"Bold Medium", s:"normal bold medium *"}, - {t:"Bold Large", s:"normal bold large *"} - ], - "cellformat": [ - {t:"Default", s:""}, - {t:"Left", s:"left"}, - {t:"Right", s:"right"}, - {t:"Center", s:"center"} - ], - "borderOnOff": [ - {t:"On", s:"1px solid rgb(0,0,0)"}, - {t:"Off", s:""} - ], - "colWidths": [ - {t:"Default", s:""}, - {t:"20", s:"20"}, - {t:"40", s:"40"}, - {t:"60", s:"60"}, - {t:"80", s:"80"}, - {t:"100", s:"100"}, - {t:"120", s:"120"}, - {t:"140", s:"140"}, - {t:"160", s:"160"}, - {t:"180", s:"180"}, - {t:"200", s:"200"}, - {t:"220", s:"220"}, - {t:"240", s:"240"}, - {t:"260", s:"260"}, - {t:"280", s:"280"}, - {t:"300", s:"300"} - ], - "ntvf": [ - {t:"Default", s:""}, - {t:"1234", s:"0"}, - {t:"1,234", s:"#,##0"}, - {t:"1,234.5", s:"#,##0.0"}, - {t:"1,234.56", s:"#,##0.00"}, - {t:"1,234.567", s:"#,##0.000"}, - {t:"1,234%", s:"#,##0%"}, - {t:"1,234.5%", s:"#,##0.0%"}, - {t:"(1,234)", s:"#,##0_);(#,##0)"}, - {t:"(1,234.5)", s:"#,##0.0_);(#,##0.0)"}, - {t:"(1,234.56)", s:"#,##0.00_);(#,##0.00)"}, - {t:"00", s:"00"}, - {t:"000", s:"000"}, - {t:"0000", s:"0000"}, - {t:"$1,234.56", s:"$#,##0.00"}, - {t:"2006-01-04", s:"yyyy-mm-dd"}, - {t:"01:23:45", s:"hh:mm:ss"}, - {t:"2006-01-04 01:23:45", s:"yyyy-mm-dd hh:mm:ss"}, - {t:"Hidden", s:"hidden"} - ], - "tvf": [ - {t:"Default", s:""}, - {t:"Automatic", s:"general"}, - {t:"Plain Text", s:"text-plain"}, - {t:"HTML", s:"text-html"}, - {t:"Wiki", s:"text-wiki"}, - {t:"Hidden", s:"hidden"} - ], - "ffal": [ // Formulas, Formats, All - {t:"All", s:"all"}, - {t:"Contents", s:"formulas"}, - {t:"Formats", s:"formats"} - ], - "all": [ // All - {t:"All", s:"all"} - ], - "rowcol": [ - {t:"Row", s:"row"}, - {t:"Column", s:"col"} - ], - "sortcol": [ - {t:"A up", s:"A up"}, - {t:"B up", s:"B up"}, - {t:"C up", s:"C up"}, - {t:"A down", s:"A down"}, - {t:"B down", s:"B down"}, - {t:"C down", s:"C down"}, - {t:"A, B, C up", s:"A up B up C up"} - ], - "none": [ // nothing - {t:" ", s:" "} - ] - } - } -*********/ - - // - // SocialCalc.SpreadsheetControlExecuteCommand(obj, combostr, sstr) - // - // xxx - // - - SocialCalc.SpreadsheetControlExecuteCommand = function (obj, combostr, sstr) { - var i, commands; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var eobj = spreadsheet.editor; - - var str = {}; - str.P = "%"; - str.N = "\n"; - if (eobj.range.hasrange) { - str.R = - SocialCalc.crToCoord(eobj.range.left, eobj.range.top) + - ":" + - SocialCalc.crToCoord(eobj.range.right, eobj.range.bottom); - str.C = str.R; - str.W = - SocialCalc.rcColname(eobj.range.left) + - ":" + - SocialCalc.rcColname(eobj.range.right); - } else { - str.C = eobj.ecell.coord; - str.R = eobj.ecell.coord + ":" + eobj.ecell.coord; - str.W = SocialCalc.rcColname(SocialCalc.coordToCr(eobj.ecell.coord).col); - } - str.S = sstr; - combostr = combostr.replace(/%C/g, str.C); - combostr = combostr.replace(/%R/g, str.R); - combostr = combostr.replace(/%N/g, str.N); - combostr = combostr.replace(/%S/g, str.S); - combostr = combostr.replace(/%W/g, str.W); - combostr = combostr.replace(/%P/g, str.P); - - eobj.EditorScheduleSheetCommands(combostr, true, false); - }; - - // - // result = SocialCalc.SpreadsheetControlCreateSheetHTML(spreadsheet) - // - // Returns the HTML representation of the whole spreadsheet - // - - SocialCalc.SpreadsheetControlCreateSheetHTML = function (spreadsheet) { - var context, div, ele; - - var result = ""; - - context = new SocialCalc.RenderContext(spreadsheet.sheet); - div = document.createElement("div"); - ele = context.RenderSheet(null, { type: "html" }); - div.appendChild(ele); - context = undefined; - result = div.innerHTML; - ele = undefined; - div = undefined; - return result; - }; - - // - // result = SocialCalc.SpreadsheetControlCreateCellHTML(spreadsheet, coord, linkstyle) - // - // Returns the HTML representation of a cell. Blank is "", not " ". - // - - SocialCalc.SpreadsheetControlCreateCellHTML = function ( - spreadsheet, - coord, - linkstyle - ) { - var result = ""; - var cell = spreadsheet.sheet.cells[coord]; - - if (!cell) return ""; - - if (cell.displaystring == undefined) { - result = SocialCalc.FormatValueForDisplay( - spreadsheet.sheet, - cell.datavalue, - coord, - linkstyle || spreadsheet.context.defaultHTMLlinkstyle - ); - } else { - result = cell.displaystring; - } - - if (result == " ") result = ""; - - return result; - }; - - // - // result = SocialCalc.SpreadsheetControlCreateCellHTMLSave(spreadsheet, range, linkstyle) - // - // Returns the HTML representation of a range of cells, or the whole sheet if range is null. - // The form is: - // version:1.0 - // coord:cell-HTML - // coord:cell-HTML - // ... - // - // Empty cells are skipped. The cell-HTML is encoded with ":"=>"\c", newline=>"\n", and "\"=>"\b". - // - - SocialCalc.SpreadsheetControlCreateCellHTMLSave = function ( - spreadsheet, - range, - linkstyle - ) { - var cr1, cr2, row, col, coord, cell, cellHTML; - var result = []; - var prange; - - if (range) { - prange = SocialCalc.ParseRange(range); - } else { - prange = { - cr1: { row: 1, col: 1 }, - cr2: { - row: spreadsheet.sheet.attribs.lastrow, - col: spreadsheet.sheet.attribs.lastcol, - }, - }; - } - cr1 = prange.cr1; - cr2 = prange.cr2; - - result.push("version:1.0"); - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - coord = SocialCalc.crToCoord(col, row); - cell = spreadsheet.sheet.cells[coord]; - if (!cell) continue; - if (cell.displaystring == undefined) { - cellHTML = SocialCalc.FormatValueForDisplay( - spreadsheet.sheet, - cell.datavalue, - coord, - linkstyle || spreadsheet.context.defaultHTMLlinkstyle - ); - } else { - cellHTML = cell.displaystring; - } - if (cellHTML == " ") continue; - result.push(coord + ":" + SocialCalc.encodeForSave(cellHTML)); - } - } - - result.push(""); // one extra to get extra \n - return result.join("\n"); - }; - - // - // Formula Bar Button Routines - // - - SocialCalc.SpreadsheetControl.DoFunctionList = function () { - var i, cname, str, f, ele; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var fcl = scc.function_classlist; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "function"; - - ele = document.getElementById(idp + "dialog"); - if (ele) return; // already have one - - scf.FillFunctionInfo(); - - str = - '
    %loc!Category!
    ' + - '
      %loc!Functions!
    ' + - '
    ' + - '
    ' + - SocialCalc.SpreadsheetControl.GetFunctionInfoStr( - scf.FunctionClasses[fcl[0]].items[0] - ) + - "
    " + - '
    ' + - ' ' + - '
    ' + - "
    "; - - var main = document.createElement("div"); - main.id = idp + "dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - str = - '' + - '" + - '
    ' + - " %loc!Function List!" + - " X 
    ' + - '
    ' + - str + - "
    "; - - str = SocialCalc.LocalizeSubstrings(str); - - main.innerHTML = str; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp + "name"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - //!!! need to do keyboard handling: if esc, hide; if All, letter scrolls to there - }; - - SocialCalc.SpreadsheetControl.GetFunctionNamesStr = function (cname) { - var i, f; - var scf = SocialCalc.Formula; - var str = ""; - - f = scf.FunctionClasses[cname]; - for (i = 0; i < f.items.length; i++) { - str += - '"; - } - - return str; - }; - - SocialCalc.SpreadsheetControl.FillFunctionNames = function (cname, ele) { - var i, f; - var scf = SocialCalc.Formula; - - ele.length = 0; - f = scf.FunctionClasses[cname]; - for (i = 0; i < f.items.length; i++) { - ele.options[i] = new Option(f.items[i], f.items[i]); - if (i == 0) { - ele.options[i].selected = true; - } - } - }; - - SocialCalc.SpreadsheetControl.GetFunctionInfoStr = function (fname) { - var scf = SocialCalc.Formula; - var f = scf.FunctionList[fname]; - var scsc = SocialCalc.special_chars; - - var str = - "" + fname + "(" + scsc(scf.FunctionArgString(fname)) + ")
    "; - str += scsc(f[3]); - - return str; - }; - - SocialCalc.SpreadsheetControl.FunctionClassChosen = function (cname) { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "function"; - var scf = SocialCalc.Formula; - - SocialCalc.SpreadsheetControl.FillFunctionNames( - cname, - document.getElementById(idp + "name") - ); - - SocialCalc.SpreadsheetControl.FunctionChosen( - scf.FunctionClasses[cname].items[0] - ); - }; - - SocialCalc.SpreadsheetControl.FunctionChosen = function (fname) { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "function"; - - document.getElementById(idp + "desc").innerHTML = - SocialCalc.SpreadsheetControl.GetFunctionInfoStr(fname); - }; - - SocialCalc.SpreadsheetControl.HideFunctions = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById(spreadsheet.idPrefix + "functiondialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.SpreadsheetControl.DoFunctionPaste = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var ele = document.getElementById(spreadsheet.idPrefix + "functionname"); - var mele = document.getElementById( - spreadsheet.idPrefix + "multilinetextarea" - ); - - var text = ele.value + "("; - - SocialCalc.SpreadsheetControl.HideFunctions(); - - if (mele) { - // multi-line editing is in progress - mele.value += text; - mele.focus(); - SocialCalc.CmdGotFocus(mele); - } else { - editor.EditorAddToInput(text, "="); - } - }; - - SocialCalc.SpreadsheetControl.DoMultiline = function () { - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var str, ele, text; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "multiline"; - - ele = document.getElementById(idp + "dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - text = SocialCalc.special_chars(text); - - str = - '" + - '
    ' + - SCLocSS( - ' ' + - ' ' + - '
    ' + - "" - ); - - var main = document.createElement("div"); - main.id = idp + "dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - SCLocSS(" %loc!Multi-line Input Box!") + - " X 
    ' + - '
    ' + - str + - "
    "; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp + "textarea"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - //!!! need to do keyboard handling: if esc, hide? - }; - - SocialCalc.SpreadsheetControl.HideMultiline = function () { - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix + "multilinedialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - }; - - SocialCalc.SpreadsheetControl.DoMultilineClear = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById( - spreadsheet.idPrefix + "multilinetextarea" - ); - - ele.value = ""; - ele.focus(); - }; - - SocialCalc.SpreadsheetControl.DoMultilinePaste = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var ele = document.getElementById( - spreadsheet.idPrefix + "multilinetextarea" - ); - - var text = ele.value; - - SocialCalc.SpreadsheetControl.HideMultiline(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - editor.EditorSaveEdit(text); - }; - - SocialCalc.SpreadsheetControl.DoLink = function () { - var SCLoc = SocialCalc.LocalizeString; - - var str, ele, text, cell, setformat, popup; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix + "link"; - - ele = document.getElementById(idp + "dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - if (text.charAt(0) == "'") { - text = text.slice(1); - } - - var parts = SocialCalc.ParseCellLinkText(text); - - text = SocialCalc.special_chars(text); - - cell = spreadsheet.sheet.cells[editor.ecell.coord]; - if (!cell || !cell.textvalueformat) { - // set to link format, but don't override - setformat = " checked"; - } else { - setformat = ""; - } - - popup = parts.newwin ? " checked" : ""; - - str = - '
    ' + - '' + - SCLoc("Description") + - "
    " + - '
    ' + - '' + - SCLoc("URL") + - "
    " + - '
    '; - if (SocialCalc.Callbacks.MakePageLink) { - // only show if handling pagenames here - str += - '' + - SCLoc("Page Name") + - "
    " + - '
    ' + - '' + - SCLoc("Workspace") + - "
    " + - '
    '; - } - str += SocialCalc.LocalizeSubstrings( - ' " + - '%loc!Set to Link format!
    ' + - ' " + - '%loc!Show in new browser window!' + - "
    " + - '
    ' + - ' ' + - ' ' + - '
    ' + - "" - ); - - var main = document.createElement("div"); - main.id = idp + "dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - SCLoc("Link Input Box") + - " X 
    ' + - '
    ' + - str + - "
    "; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp + "url"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - //!!! need to do keyboard handling: if esc, hide? - }; - - SocialCalc.SpreadsheetControl.HideLink = function () { - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix + "linkdialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - }; - - SocialCalc.SpreadsheetControl.DoLinkClear = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - document.getElementById(spreadsheet.idPrefix + "linkdesc").value = ""; - document.getElementById(spreadsheet.idPrefix + "linkpagename").value = ""; - document.getElementById(spreadsheet.idPrefix + "linkworkspace").value = ""; - - var ele = document.getElementById(spreadsheet.idPrefix + "linkurl"); - ele.value = ""; - ele.focus(); - }; - - SocialCalc.SpreadsheetControl.DoLinkPaste = function () { - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var descele = document.getElementById(spreadsheet.idPrefix + "linkdesc"); - var urlele = document.getElementById(spreadsheet.idPrefix + "linkurl"); - var pagenameele = document.getElementById( - spreadsheet.idPrefix + "linkpagename" - ); - var workspaceele = document.getElementById( - spreadsheet.idPrefix + "linkworkspace" - ); - var formatele = document.getElementById( - spreadsheet.idPrefix + "linkformat" - ); - var popupele = document.getElementById(spreadsheet.idPrefix + "linkpopup"); - - var text = ""; - - var ltsym, gtsym, obsym, cbsym; - - if (popupele.checked) { - ltsym = "<<"; - gtsym = ">>"; - obsym = "[["; - cbsym = "]]"; - } else { - ltsym = "<"; - gtsym = ">"; - obsym = "["; - cbsym = "]"; - } - - if (pagenameele && pagenameele.value) { - if (workspaceele.value) { - text = - descele.value + - "{" + - workspaceele.value + - obsym + - pagenameele.value + - cbsym + - "}"; - } else { - text = descele.value + obsym + pagenameele.value + cbsym; - } - } else { - text = descele.value + ltsym + urlele.value + gtsym; - } - - SocialCalc.SpreadsheetControl.HideLink(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - if (formatele.checked) { - SocialCalc.SpreadsheetControlExecuteCommand( - null, - "set %C textvalueformat text-link", - "" - ); - } - - editor.EditorSaveEdit(text); - }; - - SocialCalc.SpreadsheetControl.DoSum = function () { - var cmd, cell, row, col, sel, cr, foundvalue; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var sheet = editor.context.sheetobj; - - if (editor.range.hasrange) { - sel = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - cmd = - "set " + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom + 1) + - " formula sum(" + - sel + - ")"; - } else { - row = editor.ecell.row - 1; - col = editor.ecell.col; - if (row <= 1) { - cmd = "set " + editor.ecell.coord + " constant e#REF! 0 #REF!"; - } else { - foundvalue = false; - while (row > 0) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (!cell.datatype || cell.datatype == "t") { - if (foundvalue) { - row++; - break; - } - } else { - foundvalue = true; - } - row--; - } - cmd = - "set " + - editor.ecell.coord + - " formula sum(" + - SocialCalc.crToCoord(col, row) + - ":" + - SocialCalc.crToCoord(col, editor.ecell.row - 1) + - ")"; - } - } - - editor.EditorScheduleSheetCommands(cmd, true, false); - }; - - // - // TAB Routines - // - - // Sort - - SocialCalc.SpreadsheetControlSortOnclick = function (s, t) { - var name, i; - var namelist = []; - var nl = document.getElementById(s.idPrefix + "sortlist"); - SocialCalc.LoadColumnChoosers(s); - s.editor.RangeChangeCallback.sort = SocialCalc.UpdateSortRangeProposal; - - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - nl.options[0] = new Option(SocialCalc.LocalizeString("[select range]")); - for (i = 0; i < namelist.length; i++) { - name = namelist[i]; - nl.options[i + 1] = new Option(name, name); - if (name == s.sortrange) { - nl.options[i + 1].selected = true; - } - } - if (s.sortrange == "") { - nl.options[0].selected = true; - } - - SocialCalc.UpdateSortRangeProposal(s.editor); - SocialCalc.KeyboardFocus(); - return; - }; - - SocialCalc.SpreadsheetControlSortSave = function (editor, setting) { - // Format is: - // sort:sortrange:major:up/down:minor:up/down:last:up/down - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var str, sele, rele; - - str = "sort:" + SocialCalc.encodeForSave(spreadsheet.sortrange) + ":"; - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - rele = document.getElementById(spreadsheet.idPrefix + "majorsortup"); - str += sele.selectedIndex + (rele.checked ? ":up" : ":down"); - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "minorsortup"); - str += ":" + sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } else { - str += "::"; - } - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - if (sele.selectedIndex > 0) { - rele = document.getElementById(spreadsheet.idPrefix + "lastsortup"); - str += ":" + sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } else { - str += "::"; - } - return str + "\n"; - }; - - SocialCalc.SpreadsheetControlSortLoad = function ( - editor, - setting, - line, - flags - ) { - var parts, ele; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - parts = line.split(":"); - spreadsheet.sortrange = SocialCalc.decodeFromSave(parts[1]); - ele = document.getElementById(spreadsheet.idPrefix + "sortbutton"); - if (spreadsheet.sortrange) { - ele.value = SocialCalc.LocalizeString("Sort ") + spreadsheet.sortrange; - ele.style.visibility = "visible"; - } else { - ele.style.visibility = "hidden"; - } - SocialCalc.LoadColumnChoosers(spreadsheet); - - sele = document.getElementById(spreadsheet.idPrefix + "majorsort"); - sele.selectedIndex = parts[2] - 0; - document.getElementById( - spreadsheet.idPrefix + "majorsort" + parts[3] - ).checked = true; - sele = document.getElementById(spreadsheet.idPrefix + "minorsort"); - if (parts[4]) { - sele.selectedIndex = parts[4] - 0; - document.getElementById( - spreadsheet.idPrefix + "minorsort" + parts[5] - ).checked = true; - } else { - sele.selectedIndex = 0; - document.getElementById( - spreadsheet.idPrefix + "minorsortup" - ).checked = true; - } - sele = document.getElementById(spreadsheet.idPrefix + "lastsort"); - if (parts[6]) { - sele.selectedIndex = parts[6] - 0; - document.getElementById( - spreadsheet.idPrefix + "lastsort" + parts[7] - ).checked = true; - } else { - sele.selectedIndex = 0; - document.getElementById( - spreadsheet.idPrefix + "lastsortup" - ).checked = true; - } - - return true; - }; - - // Comment - - SocialCalc.SpreadsheetControlCommentOnclick = function (s, t) { - s.editor.MoveECellCallback.comment = - SocialCalc.SpreadsheetControlCommentMoveECell; - SocialCalc.SpreadsheetControlCommentDisplay(s, t); - SocialCalc.KeyboardFocus(); - return; - }; - - SocialCalc.SpreadsheetControlCommentDisplay = function (s, t) { - var c = ""; - if ( - s.editor.ecell && - s.editor.ecell.coord && - s.sheet.cells[s.editor.ecell.coord] - ) { - c = s.sheet.cells[s.editor.ecell.coord].comment || ""; - } - document.getElementById(s.idPrefix + "commenttext").value = c; - }; - - SocialCalc.SpreadsheetControlCommentMoveECell = function (editor) { - SocialCalc.SpreadsheetControlCommentDisplay( - SocialCalc.GetSpreadsheetControlObject(), - "comment" - ); - }; - - SocialCalc.SpreadsheetControlCommentSet = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - s.ExecuteCommand( - "set %C comment " + - SocialCalc.encodeForSave( - document.getElementById(s.idPrefix + "commenttext").value - ) - ); - var cell = SocialCalc.GetEditorCellElement( - s.editor, - s.editor.ecell.row, - s.editor.ecell.col - ); - s.editor.UpdateCellCSS(cell, s.editor.ecell.row, s.editor.ecell.col); - SocialCalc.KeyboardFocus(); - }; - - SocialCalc.SpreadsheetControlCommentOnunclick = function (s, t) { - delete s.editor.MoveECellCallback.comment; - }; - - // Names - - SocialCalc.SpreadsheetControlNamesOnclick = function (s, t) { - document.getElementById(s.idPrefix + "namesname").value = ""; - document.getElementById(s.idPrefix + "namesdesc").value = ""; - document.getElementById(s.idPrefix + "namesvalue").value = ""; - s.editor.RangeChangeCallback.names = - SocialCalc.SpreadsheetControlNamesRangeChange; - s.editor.MoveECellCallback.names = - SocialCalc.SpreadsheetControlNamesRangeChange; - SocialCalc.SpreadsheetControlNamesRangeChange(s.editor); - SocialCalc.SpreadsheetControlNamesFillNameList(); - SocialCalc.SpreadsheetControlNamesChangedName(); - }; - - SocialCalc.SpreadsheetControlNamesFillNameList = function () { - var SCLoc = SocialCalc.LocalizeString; - var name, i; - var namelist = []; - var s = SocialCalc.GetSpreadsheetControlObject(); - var nl = document.getElementById(s.idPrefix + "nameslist"); - var currentname = document - .getElementById(s.idPrefix + "namesname") - .value.toUpperCase() - .replace(/[^A-Z0-9_\.]/g, ""); - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - if (namelist.length > 0) { - nl.options[0] = new Option(SCLoc("[New]")); - } else { - nl.options[0] = new Option(SCLoc("[None]")); - } - for (i = 0; i < namelist.length; i++) { - name = namelist[i]; - nl.options[i + 1] = new Option(name, name); - if (name == currentname) { - nl.options[i + 1].selected = true; - } - } - if (currentname == "") { - nl.options[0].selected = true; - } - }; - - SocialCalc.SpreadsheetControlNamesChangedName = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var nl = document.getElementById(s.idPrefix + "nameslist"); - var name = nl.options[nl.selectedIndex].value; - if (s.sheet.names[name]) { - document.getElementById(s.idPrefix + "namesname").value = name; - document.getElementById(s.idPrefix + "namesdesc").value = - s.sheet.names[name].desc || ""; - document.getElementById(s.idPrefix + "namesvalue").value = - s.sheet.names[name].definition || ""; - } else { - document.getElementById(s.idPrefix + "namesname").value = ""; - document.getElementById(s.idPrefix + "namesdesc").value = ""; - document.getElementById(s.idPrefix + "namesvalue").value = ""; - } - }; - - SocialCalc.SpreadsheetControlNamesRangeChange = function (editor) { - var s = SocialCalc.GetSpreadsheetControlObject(); - var ele = document.getElementById(s.idPrefix + "namesrangeproposal"); - if (editor.range.hasrange) { - ele.value = - SocialCalc.crToCoord(editor.range.left, editor.range.top) + - ":" + - SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } else { - ele.value = editor.ecell.coord; - } - }; - - SocialCalc.SpreadsheetControlNamesOnunclick = function (s, t) { - delete s.editor.RangeChangeCallback.names; - delete s.editor.MoveECellCallback.names; - }; - - SocialCalc.SpreadsheetControlNamesSetValue = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - document.getElementById(s.idPrefix + "namesvalue").value = - document.getElementById(s.idPrefix + "namesrangeproposal").value; - SocialCalc.KeyboardFocus(); - }; - - SocialCalc.SpreadsheetControlNamesSave = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var name = document.getElementById(s.idPrefix + "namesname").value; - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - if (name != "") { - s.ExecuteCommand( - "name define " + - name + - " " + - document.getElementById(s.idPrefix + "namesvalue").value + - "\n" + - "name desc " + - name + - " " + - document.getElementById(s.idPrefix + "namesdesc").value - ); - } - }; - - SocialCalc.SpreadsheetControlNamesDelete = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var name = document.getElementById(s.idPrefix + "namesname").value; - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - if (name != "") { - s.ExecuteCommand("name delete " + name); - // document.getElementById(s.idPrefix+"namesname").value = ""; - // document.getElementById(s.idPrefix+"namesvalue").value = ""; - // document.getElementById(s.idPrefix+"namesdesc").value = ""; - // SocialCalc.SpreadsheetControlNamesFillNameList(); - } - SocialCalc.KeyboardFocus(); - }; - - // Clipboard - - SocialCalc.SpreadsheetControlClipboardOnclick = function (s, t) { - var s = SocialCalc.GetSpreadsheetControlObject(); - clipele = document.getElementById(s.idPrefix + "clipboardtext"); - document.getElementById(s.idPrefix + "clipboardformat-tab").checked = true; - clipele.value = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.Clipboard.clipboard, - "tab" - ); - return; - }; - - SocialCalc.SpreadsheetControlClipboardFormat = function (which) { - var s = SocialCalc.GetSpreadsheetControlObject(); - clipele = document.getElementById(s.idPrefix + "clipboardtext"); - clipele.value = SocialCalc.ConvertSaveToOtherFormat( - SocialCalc.Clipboard.clipboard, - which - ); - }; - - SocialCalc.SpreadsheetControlClipboardLoad = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var savetype = "tab"; - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - if (document.getElementById(s.idPrefix + "clipboardformat-csv").checked) { - savetype = "csv"; - } else if ( - document.getElementById(s.idPrefix + "clipboardformat-scsave").checked - ) { - savetype = "scsave"; - } - s.editor.EditorScheduleSheetCommands( - "loadclipboard " + - SocialCalc.encodeForSave( - SocialCalc.ConvertOtherFormatToSave( - document.getElementById(s.idPrefix + "clipboardtext").value, - savetype - ) - ), - true, - false - ); - }; - - SocialCalc.SpreadsheetControlClipboardClear = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - var clipele = document.getElementById(s.idPrefix + "clipboardtext"); - clipele.value = ""; - s.editor.EditorScheduleSheetCommands("clearclipboard", true, false); - clipele.focus(); - }; - - SocialCalc.SpreadsheetControlClipboardExport = function () { - var s = SocialCalc.GetSpreadsheetControlObject(); - if (s.ExportCallback) { - s.ExportCallback(s); - } - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - }; - - // Settings - - SocialCalc.SpreadsheetControlSettingsSwitch = function (target) { - SocialCalc.SettingControlReset(); - var s = SocialCalc.GetSpreadsheetControlObject(); - var sheettable = document.getElementById(s.idPrefix + "sheetsettingstable"); - var celltable = document.getElementById(s.idPrefix + "cellsettingstable"); - var sheettoolbar = document.getElementById( - s.idPrefix + "sheetsettingstoolbar" - ); - var celltoolbar = document.getElementById( - s.idPrefix + "cellsettingstoolbar" - ); - if (target == "sheet") { - sheettable.style.display = "block"; - celltable.style.display = "none"; - sheettoolbar.style.display = "block"; - celltoolbar.style.display = "none"; - SocialCalc.SettingsControlSetCurrentPanel( - s.views.settings.values.sheetspanel - ); - } else { - sheettable.style.display = "none"; - celltable.style.display = "block"; - sheettoolbar.style.display = "none"; - celltoolbar.style.display = "block"; - SocialCalc.SettingsControlSetCurrentPanel( - s.views.settings.values.cellspanel - ); - } - }; - - SocialCalc.SettingsControlSave = function (target) { - var range, cmdstr; - var s = SocialCalc.GetSpreadsheetControlObject(); - var sc = SocialCalc.SettingsControls; - var panelobj = sc.CurrentPanel; - var attribs = SocialCalc.SettingsControlUnloadPanel(panelobj); - - SocialCalc.SetTab(s.tabs[0].name); // return to first tab - SocialCalc.KeyboardFocus(); - - if (target == "sheet") { - cmdstr = s.sheet.DecodeSheetAttributes(attribs); - } else if (target == "cell") { - if (s.editor.range.hasrange) { - range = - SocialCalc.crToCoord(s.editor.range.left, s.editor.range.top) + - ":" + - SocialCalc.crToCoord(s.editor.range.right, s.editor.range.bottom); - } - cmdstr = s.sheet.DecodeCellAttributes( - s.editor.ecell.coord, - attribs, - range - ); - } else { - // Cancel - } - if (cmdstr) { - s.editor.EditorScheduleSheetCommands(cmdstr, true, false); - } - }; - - /////////////////////// - // - // SAVE / LOAD ROUTINES - // - /////////////////////// - - // - // result = SocialCalc.SpreadsheetControlCreateSpreadsheetSave(spreadsheet, otherparts) - // - // Saves the spreadsheet's sheet data, editor settings, and audit trail (redo stack). - // The serialized data strings are concatenated together in multi-part MIME format. - // The first part lists the types of the subsequent parts (e.g., "sheet", "editor", and "audit") - // in this format: - // # comments - // version:1.0 - // part:type1 - // part:type2 - // ... - // - // If otherparts is non-null, it is an object with: - // partname1: "part contents - should end with \n", - // partname2: "part contents - should end with \n" - // - - SocialCalc.SpreadsheetControlCreateSpreadsheetSave = function ( - spreadsheet, - otherparts - ) { - var result; - - var otherpartsstr = ""; - var otherpartsnames = ""; - var partname, extranl; - - if (otherparts) { - for (partname in otherparts) { - if (otherparts[partname].charAt(otherparts[partname] - 1) != "\n") { - extranl = "\n"; - } else { - extranl = ""; - } - otherpartsstr += - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - otherparts[partname] + - extranl; - otherpartsnames += "part:" + partname + "\n"; - } - } - - result = - "socialcalc:version:1.0\n" + - "MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=" + - spreadsheet.multipartBoundary + - "\n" + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - "# SocialCalc Spreadsheet Control Save\nversion:1.0\npart:sheet\npart:edit\npart:audit\n" + - otherpartsnames + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - spreadsheet.CreateSheetSave() + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - spreadsheet.editor.SaveEditorSettings() + - "--" + - spreadsheet.multipartBoundary + - "\nContent-type: text/plain; charset=UTF-8\n\n" + - spreadsheet.sheet.CreateAuditString() + - otherpartsstr + - "--" + - spreadsheet.multipartBoundary + - "--\n"; - - return result; - }; - - // - // parts = SocialCalc.SpreadsheetControlDecodeSpreadsheetSave(spreadsheet, str) - // - // Separates the parts from a spreadsheet save string, returning an object with the sub-strings. - // - // {type1: {start: startpos, end: endpos}, type2:...} - // - - SocialCalc.SpreadsheetControlDecodeSpreadsheetSave = function ( - spreadsheet, - str - ) { - var pos1, - mpregex, - searchinfo, - boundary, - boundaryregex, - blanklineregex, - start, - ending, - lines, - i, - lines, - p, - pnun; - var parts = {}; - var partlist = []; - - pos1 = str.search(/^MIME-Version:\s1\.0/im); - if (pos1 < 0) return parts; - - mpregex = /^Content-Type:\s*multipart\/mixed;\s*boundary=(\S+)/gim; - mpregex.lastIndex = pos1; - - searchinfo = mpregex.exec(str); - if (mpregex.lastIndex <= 0) return parts; - boundary = searchinfo[1]; - - boundaryregex = new RegExp("^--" + boundary + "(?:\r\n|\n)", "mg"); - boundaryregex.lastIndex = mpregex.lastIndex; - - searchinfo = boundaryregex.exec(str); // find header top boundary - blanklineregex = /(?:\r\n|\n)(?:\r\n|\n)/gm; - blanklineregex.lastIndex = boundaryregex.lastIndex; - searchinfo = blanklineregex.exec(str); // skip to after blank line - if (!searchinfo) return parts; - start = blanklineregex.lastIndex; - boundaryregex.lastIndex = start; - searchinfo = boundaryregex.exec(str); // find end of header - if (!searchinfo) return parts; - ending = searchinfo.index; - - lines = str.substring(start, ending).split(/\r\n|\n/); // get header as lines - for (i = 0; i < lines.length; i++) { - line = lines[i]; - p = line.split(":"); - switch (p[0]) { - case "version": - break; - case "part": - partlist.push(p[1]); - break; - } - } - - for (pnum = 0; pnum < partlist.length; pnum++) { - // get each part - blanklineregex.lastIndex = ending; - searchinfo = blanklineregex.exec(str); // find blank line ending mime-part header - if (!searchinfo) return parts; - start = blanklineregex.lastIndex; - if (pnum == partlist.length - 1) { - // last one has different boundary - boundaryregex = new RegExp("^--" + boundary + "--$", "mg"); - } - boundaryregex.lastIndex = start; - searchinfo = boundaryregex.exec(str); // find ending boundary - if (!searchinfo) return parts; - ending = searchinfo.index; - parts[partlist[pnum]] = { start: start, end: ending }; // return position within full string - } - - return parts; - }; - - /* - * SettingsControls - * - * Each settings panel has an object in the following form: - * - * {ctrl-name1: {setting: setting-nameA, type: ctrl-type, id: id-component}, - * ctrl-name2: {setting: setting-nameB, type: ctrl-type, id: id-component, initialdata: optional-initialdata-override}, - * ...} - * - * The ctrl-types are names that correspond to: - * - * SocialCalc.SettingsControls.Controls = { - * ctrl-type1: { - * SetValue: function(panel-obj, ctrl-name, {def: true/false, val: value}) {...;}, - * ColorValues: if true, Onchanged converts between hex and RGB - * GetValue: function(panel-obj, ctrl-name) {...return {def: true/false, val: value};}, - * Initialize: function(panel-obj, ctrl-name) {...;}, // used to fill dropdowns, etc. - * InitialData: control-dependent, // used by Initialize (if no panel ctrlname.initialdata) - * OnReset: function(ctrl-name) {...;}, // called to put down popups, etc. - * ChangedCallback: function(ctrl-name) {...;} // if not null, called by control when user changes value - * } - * - */ - - SocialCalc.SettingsControls = { - Controls: {}, - CurrentPanel: null, // panel object to search on events - }; - - // - // SocialCalc.SettingsControlSetCurrentPanel(panel-object) - // - - SocialCalc.SettingsControlSetCurrentPanel = function (panelobj) { - SocialCalc.SettingsControls.CurrentPanel = panelobj; - - SocialCalc.SettingsControls.PopupChangeCallback( - { panelobj: panelobj }, - "", - null - ); - }; - - // - // SocialCalc.SettingsControlInitializePanel(panel-object) - // - - SocialCalc.SettingsControlInitializePanel = function (panelobj) { - var ctrlname; - var sc = SocialCalc.SettingsControls; - var ctrl; - - for (ctrlname in panelobj) { - if (ctrlname == "name") continue; - ctrl = sc.Controls[panelobj[ctrlname].type]; - if (ctrl && ctrl.Initialize) ctrl.Initialize(panelobj, ctrlname); - } - }; - - // - // SocialCalc.SettingsControlLoadPanel(panel-object, attribs) - // - - SocialCalc.SettingsControlLoadPanel = function (panelobj, attribs) { - var ctrlname; - var sc = SocialCalc.SettingsControls; - - for (ctrlname in panelobj) { - if (ctrlname == "name") continue; - ctrl = sc.Controls[panelobj[ctrlname].type]; - if (ctrl && ctrl.SetValue) - ctrl.SetValue(panelobj, ctrlname, attribs[panelobj[ctrlname].setting]); - } - }; - - // - // attribs = SocialCalc.SettingsControlUnloadPanel(panel-object) - // - - SocialCalc.SettingsControlUnloadPanel = function (panelobj) { - var ctrlname; - var sc = SocialCalc.SettingsControls; - var attribs = {}; - - for (ctrlname in panelobj) { - if (ctrlname == "name") continue; - ctrl = sc.Controls[panelobj[ctrlname].type]; - if (ctrl && ctrl.GetValue) - attribs[panelobj[ctrlname].setting] = ctrl.GetValue(panelobj, ctrlname); - } - - return attribs; - }; - - // - // SocialCalc.SettingsControls.PopupChangeCallback - // - - SocialCalc.SettingsControls.PopupChangeCallback = function ( - attribs, - id, - value - ) { - var sc = SocialCalc.Constants; - - var ele = document.getElementById("sample-text"); - - if (!ele || !attribs || !attribs.panelobj) return; - - var idPrefix = SocialCalc.CurrentSpreadsheetControlObject.idPrefix; - - var c = attribs.panelobj.name == "cell" ? "c" : ""; - - var v, a, parts, str1, str2, i; - - parts = - sc.defaultCellLayout.match( - /^padding.(\S+) (\S+) (\S+) (\S+).vertical.align.(\S+);$/ - ) || []; - - var cv = { - color: ["textcolor"], - backgroundColor: ["bgcolor", "#FFF"], - fontSize: ["fontsize", sc.defaultCellFontSize], - fontFamily: ["fontfamily"], - paddingTop: ["padtop", parts[1]], - paddingRight: ["padright", parts[2]], - paddingBottom: ["padbottom", parts[3]], - paddingLeft: ["padleft", parts[4]], - verticalAlign: ["alignvert", parts[5]], - }; - - for (a in cv) { - v = SocialCalc.Popup.GetValue(idPrefix + c + cv[a][0]) || cv[a][1] || ""; - ele.style[a] = v; - } - - if (c == "c") { - cv = { - borderTop: "cbt", - borderRight: "cbr", - borderBottom: "cbb", - borderLeft: "cbl", - }; - for (a in cv) { - v = SocialCalc.SettingsControls.BorderSideGetValue( - attribs.panelobj, - cv[a] - ); - ele.style[a] = v ? v.val || "" : ""; - } - v = SocialCalc.Popup.GetValue(idPrefix + "calignhoriz"); - ele.style.textAlign = v || "left"; - ele.childNodes[1].style.textAlign = v || "right"; - } else { - ele.style.border = ""; - v = SocialCalc.Popup.GetValue(idPrefix + "textalignhoriz"); - ele.style.textAlign = v || "left"; - v = SocialCalc.Popup.GetValue(idPrefix + "numberalignhoriz"); - ele.childNodes[1].style.textAlign = v || "right"; - } - - v = SocialCalc.Popup.GetValue(idPrefix + c + "fontlook"); - parts = v ? v.match(/^(\S+) (\S+)$/) || [] : []; - ele.style.fontStyle = parts[1] || ""; - ele.style.fontWeight = parts[2] || ""; - - v = SocialCalc.Popup.GetValue(idPrefix + c + "formatnumber") || "General"; - str1 = SocialCalc.FormatNumber.formatNumberWithFormat(9.8765, v, ""); - str2 = SocialCalc.FormatNumber.formatNumberWithFormat(-1234.5, v, ""); - if (str2 != "??-???-?? ??:??:??") { - // not bad date from negative number - str1 += "
    " + str2; - } - - ele.childNodes[1].innerHTML = str1; - }; - - // - // PopupList Control - // - - SocialCalc.SettingsControls.PopupListSetValue = function ( - panelobj, - ctrlname, - value - ) { - if (!value) { - alert(ctrlname + " no value"); - return; - } - - var sp = SocialCalc.Popup; - - if (!value.def) { - sp.SetValue(panelobj[ctrlname].id, value.val); - } else { - sp.SetValue(panelobj[ctrlname].id, ""); - } - }; - - // - // SocialCalc.SettingsControls.PopupListGetValue - // - - SocialCalc.SettingsControls.PopupListGetValue = function ( - panelobj, - ctrlname - ) { - var ctl = panelobj[ctrlname]; - if (!ctl) return null; - - var value = SocialCalc.Popup.GetValue(ctl.id); - if (value) { - return { def: false, val: value }; - } else { - return { def: true, val: 0 }; - } - }; - - // - // SocialCalc.SettingsControls.PopupListInitialize - // - - SocialCalc.SettingsControls.PopupListInitialize = function ( - panelobj, - ctrlname - ) { - var i, val, pos, otext; - var sc = SocialCalc.SettingsControls; - var initialdata = - panelobj[ctrlname].initialdata || - sc.Controls[panelobj[ctrlname].type].InitialData || - ""; - initialdata = SocialCalc.LocalizeSubstrings(initialdata); - var optionvals = initialdata.split(/\|/); - - var options = []; - - for (i = 0; i < (optionvals.length || 0); i++) { - val = optionvals[i]; - pos = val.indexOf(":"); - otext = val.substring(0, pos); - if (otext.indexOf("\\") != -1) { - // escape any colons - otext = otext.replace(/\\c/g, ":"); - otext = otext.replace(/\\b/g, "\\"); - } - otext = SocialCalc.special_chars(otext); - if (otext == "[custom]") { - options[i] = { - o: SocialCalc.Constants.s_PopupListCustom, - v: val.substring(pos + 1), - a: { custom: true }, - }; - } else if (otext == "[cancel]") { - options[i] = { - o: SocialCalc.Constants.s_PopupListCancel, - v: "", - a: { cancel: true }, - }; - } else if (otext == "[break]") { - options[i] = { o: "-----", v: "", a: { skip: true } }; - } else if (otext == "[newcol]") { - options[i] = { o: "", v: "", a: { newcol: true } }; - } else { - options[i] = { o: otext, v: val.substring(pos + 1) }; - } - } - - SocialCalc.Popup.Create("List", panelobj[ctrlname].id, {}); - SocialCalc.Popup.Initialize(panelobj[ctrlname].id, { - options: options, - attribs: { - changedcallback: SocialCalc.SettingsControls.PopupChangeCallback, - panelobj: panelobj, - }, - }); - }; - - // - // SocialCalc.SettingsControls.PopupListReset - // - - SocialCalc.SettingsControls.PopupListReset = function (ctrlname) { - SocialCalc.Popup.Reset("List"); - }; - - SocialCalc.SettingsControls.Controls.PopupList = { - SetValue: SocialCalc.SettingsControls.PopupListSetValue, - GetValue: SocialCalc.SettingsControls.PopupListGetValue, - Initialize: SocialCalc.SettingsControls.PopupListInitialize, - OnReset: SocialCalc.SettingsControls.PopupListReset, - ChangedCallback: null, - }; - - // - // ColorChooser Control - // - - SocialCalc.SettingsControls.ColorChooserSetValue = function ( - panelobj, - ctrlname, - value - ) { - if (!value) { - alert(ctrlname + " no value"); - return; - } - - var sp = SocialCalc.Popup; - - if (!value.def) { - sp.SetValue(panelobj[ctrlname].id, value.val); - } else { - sp.SetValue(panelobj[ctrlname].id, ""); - } - }; - - // - // SocialCalc.SettingsControls.ColorChooserGetValue - // - - SocialCalc.SettingsControls.ColorChooserGetValue = function ( - panelobj, - ctrlname - ) { - var value = SocialCalc.Popup.GetValue(panelobj[ctrlname].id); - if (value) { - return { def: false, val: value }; - } else { - return { def: true, val: 0 }; - } - }; - - // - // SocialCalc.SettingsControls.ColorChooserInitialize - // - - SocialCalc.SettingsControls.ColorChooserInitialize = function ( - panelobj, - ctrlname - ) { - var i, val, pos, otext; - var sc = SocialCalc.SettingsControls; - - SocialCalc.Popup.Create("ColorChooser", panelobj[ctrlname].id, {}); - SocialCalc.Popup.Initialize(panelobj[ctrlname].id, { - attribs: { - title: " ", - moveable: true, - width: "106px", - changedcallback: SocialCalc.SettingsControls.PopupChangeCallback, - panelobj: panelobj, - }, - }); - }; - - // - // SocialCalc.SettingsControls.ColorChooserReset - // - - SocialCalc.SettingsControls.ColorChooserReset = function (ctrlname) { - SocialCalc.Popup.Reset("ColorChooser"); - }; - - SocialCalc.SettingsControls.Controls.ColorChooser = { - SetValue: SocialCalc.SettingsControls.ColorChooserSetValue, - GetValue: SocialCalc.SettingsControls.ColorChooserGetValue, - Initialize: SocialCalc.SettingsControls.ColorChooserInitialize, - OnReset: SocialCalc.SettingsControls.ColorChooserReset, - ChangedCallback: null, - }; - - // - // SocialCalc.SettingsControls.BorderSideSetValue - // - - SocialCalc.SettingsControls.BorderSideSetValue = function ( - panelobj, - ctrlname, - value - ) { - var sc = SocialCalc.SettingsControls; - var ele, found, idname, parts; - var idstart = panelobj[ctrlname].id; - - if (!value) { - alert(ctrlname + " no value"); - return; - } - - ele = document.getElementById(idstart + "-onoff-bcb"); // border checkbox - if (!ele) return; - - if (value.val) { - // border does not use default: it looks only to the value currently - ele.checked = true; - ele.value = value.val; - parts = value.val.match(/(\S+)\s+(\S+)\s+(\S.+)/); - idname = idstart + "-color"; - SocialCalc.Popup.SetValue(idname, parts[3]); - SocialCalc.Popup.SetDisabled(idname, false); - } else { - ele.checked = false; - ele.value = value.val; - idname = idstart + "-color"; - SocialCalc.Popup.SetValue(idname, ""); - SocialCalc.Popup.SetDisabled(idname, true); - } - }; - - // - // SocialCalc.SettingsControls.BorderSideGetValue - // - - SocialCalc.SettingsControls.BorderSideGetValue = function ( - panelobj, - ctrlname - ) { - var sc = SocialCalc.SettingsControls; - var ele, value; - var idstart = panelobj[ctrlname].id; - - ele = document.getElementById(idstart + "-onoff-bcb"); // border checkbox - if (!ele) return; - - if (ele.checked) { - // on - value = SocialCalc.Popup.GetValue(idstart + "-color"); - value = "1px solid " + (value || "rgb(0,0,0)"); - return { def: false, val: value }; - } else { - // off - return { def: false, val: "" }; - } - }; - - // - // SocialCalc.SettingsControls.BorderSideInitialize - // - - SocialCalc.SettingsControls.BorderSideInitialize = function ( - panelobj, - ctrlname - ) { - var sc = SocialCalc.SettingsControls; - var idstart = panelobj[ctrlname].id; - - SocialCalc.Popup.Create("ColorChooser", idstart + "-color", {}); - SocialCalc.Popup.Initialize(idstart + "-color", { - attribs: { - title: " ", - width: "106px", - moveable: true, - changedcallback: SocialCalc.SettingsControls.PopupChangeCallback, - panelobj: panelobj, - }, - }); - }; - - // - // SocialCalc.SettingsControlOnchangeBorder = function(ele) - // - - SocialCalc.SettingsControlOnchangeBorder = function (ele) { - var idname, value, found, ele2; - var sc = SocialCalc.SettingsControls; - var panelobj = sc.CurrentPanel; - - var nameparts = ele.id.match(/(^.*\-)(\w+)\-(\w+)\-(\w+)$/); - if (!nameparts) return; - var prefix = nameparts[1]; - var ctrlname = nameparts[2]; - var ctrlsubid = nameparts[3]; - var ctrlidsuffix = nameparts[4]; - var ctrltype = panelobj[ctrlname].type; - - switch (ctrlidsuffix) { - case "bcb": // border checkbox - if (ele.checked) { - sc.Controls[ctrltype].SetValue(sc.CurrentPanel, ctrlname, { - def: false, - val: ele.value || "1px solid rgb(0,0,0)", - }); - } else { - sc.Controls[ctrltype].SetValue(sc.CurrentPanel, ctrlname, { - def: false, - val: "", - }); - } - break; - } - }; - - SocialCalc.SettingsControls.Controls.BorderSide = { - SetValue: SocialCalc.SettingsControls.BorderSideSetValue, - GetValue: SocialCalc.SettingsControls.BorderSideGetValue, - OnClick: SocialCalc.SettingsControls.ColorComboOnClick, - Initialize: SocialCalc.SettingsControls.BorderSideInitialize, - InitialData: { thickness: "1 pixel:1px", style: "Solid:solid" }, - ChangedCallback: null, - }; - - SocialCalc.SettingControlReset = function () { - var sc = SocialCalc.SettingsControls; - var ctrlname; - - for (ctrlname in sc.Controls) { - if (sc.Controls[ctrlname].OnReset) - sc.Controls[ctrlname].OnReset(ctrlname); - } - }; - - /********************** - * - * CtrlSEditor implementation for editing SocialCalc.OtherSaveParts - * - */ - - SocialCalc.OtherSaveParts = {}; // holds other parts to save - must be set when loaded if you want to keep - - SocialCalc.CtrlSEditor = function (whichpart) { - var strtoedit, partname; - if (whichpart.length > 0) { - strtoedit = SocialCalc.special_chars( - SocialCalc.OtherSaveParts[whichpart] || "" - ); - } else { - strtoedit = "Listing of Parts\n"; - for (partname in SocialCalc.OtherSaveParts) { - strtoedit += SocialCalc.special_chars( - "\nPart: " + - partname + - "\n=====\n" + - SocialCalc.OtherSaveParts[partname] + - "\n" - ); - } - } - var editbox = document.createElement("div"); - editbox.style.cssText = - "position:absolute;z-index:500;width:300px;height:300px;left:100px;top:200px;border:1px solid black;background-color:#EEE;text-align:center;"; - editbox.id = "socialcalc-editbox"; - editbox.innerHTML = - whichpart + - '



    '; - document.body.appendChild(editbox); - - var ebta = document.getElementById("socialcalc-editbox-textarea"); - ebta.focus(); - SocialCalc.CmdGotFocus(ebta); - }; - - SocialCalc.CtrlSEditorDone = function (idprefix, whichpart) { - var edittextarea = document.getElementById(idprefix + "-textarea"); - var text = edittextarea.value; - if (whichpart.length > 0) { - if (text.length > 0) { - SocialCalc.OtherSaveParts[whichpart] = text; - } else { - delete SocialCalc.OtherSaveParts[whichpart]; - } - } - - var editbox = document.getElementById(idprefix); - SocialCalc.KeyboardFocus(); - editbox.parentNode.removeChild(editbox); - }; - - // - // Workbook is a collection of sheets that are worked upon together - // - // The WorkBook class models and manages the collection of sheets - // - // Author: Ramu Ramamurthy - // - // - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - - // Constructor: - - SocialCalc.WorkBook = function (spread) { - this.spreadsheet = spread; // this is the spreadsheet control - this.defaultsheetname = null; - this.sheetArr = {}; // misnomer, this is not really an array - this.clipsheet = {}; // for copy paste of sheets - }; - - // Methods - - SocialCalc.WorkBook.prototype.InitializeWorkBook = function (defaultsheet) { - return SocialCalc.InitializeWorkBook(this, defaultsheet); - }; - - SocialCalc.WorkBook.prototype.AddNewWorkBookSheetNoSwitch = function ( - sheetid, - sheetname, - savestr - ) { - return SocialCalc.AddNewWorkBookSheetNoSwitch( - this, - sheetid, - sheetname, - savestr - ); - }; - SocialCalc.WorkBook.prototype.AddNewWorkBookSheet = function ( - sheetname, - oldsheetname, - fromclip, - spread - ) { - return SocialCalc.AddNewWorkBookSheet( - this, - sheetname, - oldsheetname, - fromclip, - spread - ); - }; - SocialCalc.WorkBook.prototype.ActivateWorkBookSheet = function ( - sheetname, - oldsheetname - ) { - return SocialCalc.ActivateWorkBookSheet(this, sheetname, oldsheetname); - }; - SocialCalc.WorkBook.prototype.DeleteWorkBookSheet = function ( - sheetname, - cursheetname - ) { - return SocialCalc.DeleteWorkBookSheet(this, sheetname, cursheetname); - }; - SocialCalc.WorkBook.prototype.SaveWorkBookSheet = function (sheetid) { - return SocialCalc.SaveWorkBookSheet(this, sheetid); - }; - SocialCalc.WorkBook.prototype.LoadRenameWorkBookSheet = function ( - sheetid, - savestr, - newname - ) { - return SocialCalc.LoadRenameWorkBookSheet(this, sheetid, savestr, newname); - }; - SocialCalc.WorkBook.prototype.RenameWorkBookSheet = function ( - oldname, - newname, - sheetid - ) { - return SocialCalc.RenameWorkBookSheet(this, oldname, newname, sheetid); - }; - SocialCalc.WorkBook.prototype.CopyWorkBookSheet = function (sheetid) { - return SocialCalc.CopyWorkBookSheet(this, sheetid); - }; - SocialCalc.WorkBook.prototype.PasteWorkBookSheet = function (newid, oldid) { - return SocialCalc.PasteWorkBookSheet(this, newid, oldid); - }; - SocialCalc.WorkBook.prototype.RenderWorkBookSheet = function () { - return SocialCalc.RenderWorkBookSheet(this); - }; - - SocialCalc.WorkBook.prototype.SheetNameExistsInWorkBook = function (name) { - return SocialCalc.SheetNameExistsInWorkBook(this, name); - }; - - SocialCalc.WorkBook.prototype.WorkbookScheduleCommand = function ( - cmd, - isremote - ) { - return SocialCalc.WorkbookScheduleCommand(this, cmd, isremote); - }; - - SocialCalc.WorkBook.prototype.WorkbookScheduleSheetCommand = function ( - cmd, - isremote - ) { - return SocialCalc.WorkbookScheduleSheetCommand(this, cmd, isremote); - }; - - // schedule some command - could be for sheet or for the workbook itself - SocialCalc.WorkbookScheduleCommand = function WorkbookScheduleCommand( - workbook, - cmd, - isremote - ) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - if (cmd.cmdtype == "scmd") { - workbook.WorkbookScheduleSheetCommand(cmd, isremote); - } - }; - - SocialCalc.WorkbookScheduleSheetCommand = - function WorkbookScheduleSheetCommand(workbook, cmd, isremote) { - //console.log(cmd.cmdtype,cmd.id,cmd.cmdstr); - - // check if sheet exists first - if (workbook.sheetArr[cmd.id]) { - workbook.sheetArr[cmd.id].sheet.ScheduleSheetCommands( - cmd.cmdstr, - cmd.saveundo, - isremote - ); - } - }; - - SocialCalc.InitializeWorkBook = function InitializeWorkBook( - workbook, - defaultsheet - ) { - workbook.defaultsheetname = defaultsheet; - - var spreadsheet = workbook.spreadsheet; - var defaultsheetname = workbook.defaultsheetname; - - // Initialize the Spreadsheet Control and display it - - SocialCalc.Formula.SheetCache.sheets[defaultsheetname] = { - sheet: spreadsheet.sheet, - name: defaultsheetname, - }; - - spreadsheet.sheet.sheetid = defaultsheetname; - spreadsheet.sheet.sheetname = defaultsheetname; - - workbook.sheetArr[defaultsheetname] = {}; - workbook.sheetArr[defaultsheetname].sheet = spreadsheet.sheet; - workbook.sheetArr[defaultsheetname].context = spreadsheet.context; - - // if these were properties of the sheet, then we wouldnt need to do this ! - workbook.sheetArr[defaultsheetname].editorprop = {}; - workbook.sheetArr[defaultsheetname].editorprop.ecell = null; - workbook.sheetArr[defaultsheetname].editorprop.range = null; - workbook.sheetArr[defaultsheetname].editorprop.range2 = null; - - workbook.clipsheet.savestr = null; - workbook.clipsheet.copiedfrom = null; - workbook.clipsheet.editorprop = {}; - - spreadsheet.editor.workingvalues.currentsheet = spreadsheet.sheet.sheetname; - spreadsheet.editor.workingvalues.startsheet = - spreadsheet.editor.workingvalues.currentsheet; - spreadsheet.editor.workingvalues.currentsheetid = spreadsheet.sheet.sheetid; - }; - - SocialCalc.AddNewWorkBookSheetNoSwitch = function AddNewWorkBookSheetNoSwitch( - workbook, - sheetid, - sheetname, - savestr - ) { - //alert(sheetid+","+sheetname+","+savestr); - - var spreadsheet = workbook.spreadsheet; - - var newsheet = new SocialCalc.Sheet(); - - SocialCalc.Formula.SheetCache.sheets[sheetname] = { - sheet: newsheet, - name: sheetname, - }; - - newsheet.sheetid = sheetid; - newsheet.sheetname = sheetname; - - if (savestr) { - newsheet.ParseSheetSave(savestr); - } - - workbook.sheetArr[sheetid] = {}; - workbook.sheetArr[sheetid].sheet = newsheet; - workbook.sheetArr[sheetid].context = null; - - if (workbook.sheetArr[sheetid].sheet.attribs) { - workbook.sheetArr[sheetid].sheet.attribs.needsrecalc = "yes"; - } - - workbook.sheetArr[sheetid].editorprop = {}; - workbook.sheetArr[sheetid].editorprop.ecell = { - coord: "A1", - row: 1, - col: 1, - }; - workbook.sheetArr[sheetid].editorprop.range = null; - workbook.sheetArr[sheetid].editorprop.range2 = null; - }; - - SocialCalc.AddNewWorkBookSheet = function AddNewWorkBookSheet( - workbook, - sheetid, - oldsheetid, - fromclip, - spread - ) { - var spreadsheet = workbook.spreadsheet; - - //alert("create new sheet "+sheetid+" old="+oldsheetid+" def="+workbook.defaultsheetname); - - if (spread == null) { - spreadsheet.sheet = new SocialCalc.Sheet(); - SocialCalc.Formula.SheetCache.sheets[sheetid] = { - sheet: spreadsheet.sheet, - name: sheetid, - }; - spreadsheet.sheet.sheetid = sheetid; - spreadsheet.sheet.sheetname = sheetid; - } else { - //alert("existing spread") - spreadsheet.sheet = spread; - } - - spreadsheet.context = new SocialCalc.RenderContext(spreadsheet.sheet); - - spreadsheet.sheet.statuscallback = SocialCalc.EditorSheetStatusCallback; - spreadsheet.sheet.statuscallbackparams = spreadsheet.editor; - - workbook.sheetArr[sheetid] = {}; - workbook.sheetArr[sheetid].sheet = spreadsheet.sheet; - workbook.sheetArr[sheetid].context = spreadsheet.context; - - workbook.sheetArr[sheetid].editorprop = {}; - workbook.sheetArr[sheetid].editorprop.ecell = null; - workbook.sheetArr[sheetid].editorprop.range = null; - workbook.sheetArr[sheetid].editorprop.range2 = null; - - if (oldsheetid != null) { - workbook.sheetArr[oldsheetid].editorprop.ecell = spreadsheet.editor.ecell; - workbook.sheetArr[oldsheetid].editorprop.range = spreadsheet.editor.range; - workbook.sheetArr[oldsheetid].editorprop.range2 = - spreadsheet.editor.range2; - } - - spreadsheet.context.showGrid = true; - spreadsheet.context.showRCHeaders = true; - spreadsheet.editor.context = spreadsheet.context; - - if (!fromclip) { - spreadsheet.editor.ecell = { - coord: "A1", - row: 1, - col: 1, - }; - - spreadsheet.editor.range = { - hasrange: false, - }; - spreadsheet.editor.range2 = { - hasrange: false, - }; - } - - // set highlights - spreadsheet.context.highlights[spreadsheet.editor.ecell.coord] = "cursor"; - - if (fromclip) { - // this is the result of a paste sheet - //alert("from clip"); - - if (workbook.clipsheet.savestr != null) { - //alert("sheetdata = "+workbook.clipsheet.savestr); - spreadsheet.sheet.ParseSheetSave(workbook.clipsheet.savestr); - } - - spreadsheet.editor.ecell = workbook.clipsheet.editorprop.ecell; - spreadsheet.context.highlights[spreadsheet.editor.ecell.coord] = "cursor"; - - // range is not pasted ??!?? - } - - spreadsheet.editor.workingvalues.currentsheet = spreadsheet.sheet.sheetname; - spreadsheet.editor.workingvalues.startsheet = - spreadsheet.editor.workingvalues.currentsheet; - spreadsheet.editor.workingvalues.currentsheetid = spreadsheet.sheet.sheetid; - - spreadsheet.editor.FitToEditTable(); - spreadsheet.editor.ScheduleRender(); - //spreadsheet.ExecuteCommand('recalc', ''); - }; - - SocialCalc.ActivateWorkBookSheet = function ActivateWorkBookSheet( - workbook, - sheetnamestr, - oldsheetnamestr - ) { - var spreadsheet = workbook.spreadsheet; - - //alert("activate "+sheetnamestr+" old="+oldsheetnamestr); - - spreadsheet.sheet = workbook.sheetArr[sheetnamestr].sheet; - spreadsheet.context = workbook.sheetArr[sheetnamestr].context; - - if (spreadsheet.context == null) { - //alert("context null") - //for (var sheet in workbook.sheetArr) alert(sheet+spreadsheet.sheet ) - workbook.AddNewWorkBookSheet( - sheetnamestr, - oldsheetnamestr, - false, - spreadsheet.sheet - ); - return; - } - - spreadsheet.editor.context = spreadsheet.context; - - if (oldsheetnamestr != null) { - workbook.sheetArr[oldsheetnamestr].editorprop.ecell = - spreadsheet.editor.ecell; - } - spreadsheet.editor.ecell = workbook.sheetArr[sheetnamestr].editorprop.ecell; - - if (oldsheetnamestr != null) { - workbook.sheetArr[oldsheetnamestr].editorprop.range = - spreadsheet.editor.range; - } - spreadsheet.editor.range = workbook.sheetArr[sheetnamestr].editorprop.range; - - if (oldsheetnamestr != null) { - workbook.sheetArr[oldsheetnamestr].editorprop.range2 = - spreadsheet.editor.range2; - } - spreadsheet.editor.range2 = - workbook.sheetArr[sheetnamestr].editorprop.range2; - - spreadsheet.sheet.statuscallback = SocialCalc.EditorSheetStatusCallback; - spreadsheet.sheet.statuscallbackparams = spreadsheet.editor; - - // reset highlights ?? - - //spreadsheet.editor.FitToEditTable(); - - spreadsheet.editor.workingvalues.currentsheet = spreadsheet.sheet.sheetname; - spreadsheet.editor.workingvalues.currentsheetid = spreadsheet.sheet.sheetid; - - if (spreadsheet.editor.state != "start" && spreadsheet.editor.inputBox) - spreadsheet.editor.inputBox.element.focus(); - - if (spreadsheet.editor.state == "start") { - spreadsheet.editor.workingvalues.startsheet = - spreadsheet.editor.workingvalues.currentsheet; - } - - //spreadsheet.editor.ScheduleRender(); - - if (spreadsheet.editor.state != "start" && spreadsheet.editor.inputBox) { - spreadsheet.editor.ScheduleRender(); - } else { - if (spreadsheet.sheet.attribs) { - spreadsheet.sheet.attribs.needsrecalc = "yes"; - } else { - spreadsheet.sheet.attribs = {}; - spreadsheet.sheet.attribs.needsrecalc = "yes"; - } - - spreadsheet.ExecuteCommand("redisplay", ""); - } - }; - - SocialCalc.DeleteWorkBookSheet = function DeleteWorkBookSheet( - workbook, - oldname, - curname - ) { - //alert("delete "+oldname+","+curname); - - delete workbook.sheetArr[oldname].context; - delete workbook.sheetArr[oldname].sheet; - delete workbook.sheetArr[oldname]; - // take sheet out of the formula cache - delete SocialCalc.Formula.SheetCache.sheets[curname]; - }; - - SocialCalc.SaveWorkBookSheet = function CreateSaveWorkBook( - workbook, - sheetid - ) { - var sheetstr = {}; - sheetstr.savestr = workbook.sheetArr[sheetid].sheet.CreateSheetSave(); - return sheetstr; - }; - - SocialCalc.LoadRenameWorkBookSheet = function LoadRenameWorkBookSheet( - workbook, - sheetid, - savestr, - newname - ) { - workbook.sheetArr[sheetid].sheet.ResetSheet(); - workbook.sheetArr[sheetid].sheet.ParseSheetSave(savestr); - - if (workbook.sheetArr[sheetid].sheet.attribs) { - workbook.sheetArr[sheetid].sheet.attribs.needsrecalc = "yes"; - } - - delete SocialCalc.Formula.SheetCache.sheets[ - workbook.sheetArr[sheetid].sheet.sheetname - ]; - workbook.sheetArr[sheetid].sheet.sheetname = newname; - SocialCalc.Formula.SheetCache.sheets[newname] = { - sheet: workbook.sheetArr[sheetid].sheet, - name: newname, - }; - }; - - SocialCalc.RenderWorkBookSheet = function RenderWorkBookSheet(workbook) { - workbook.spreadsheet.editor.ScheduleRender(); - }; - - SocialCalc.RenameWorkBookSheetCell = function (formula, oldname, newname) { - var ttype, ttext, i, newcr; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - var parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i = 0; i < parseinfo.length; i++) { - ttype = parseinfo[i].type; - ttext = parseinfo[i].text; - //alert(ttype+","+ttext); - //console.log (scf.NormalizeSheetName(ttext) + " " + oldname); - if ( - ttype == tokentype.name && - scf.NormalizeSheetName(ttext) == oldname && - i < parseinfo.length - ) { - if (parseinfo[i + 1].type == token_op && parseinfo[i + 1].text == "!") { - updatedformula += newname; //console.log (updatedformula); - } else { - updatedformula += ttext; //console.log (updatedformula); - } - } else { - updatedformula += ttext; - } - } - //alert(updatedformula); - return updatedformula; - }; - - SocialCalc.RenameWorkBookSheet = function RenameWorkBookSheet( - workbook, - oldname, - newname, - sheetid - ) { - // for each sheet, fix up all the formula references - // - //alert (sheetid); - var oldsheet = SocialCalc.Formula.SheetCache.sheets[oldname].sheet; - delete SocialCalc.Formula.SheetCache.sheets[oldname]; - //alert (newname); // to check the newname - SocialCalc.Formula.SheetCache.sheets[newname] = { - sheet: oldsheet, - name: newname, - }; - workbook.sheetArr[sheetid].sheet.sheetname = newname; - // - // fix up formulas for sheet rename - // if formulas should not be fixed up upon sheet rename, then comment out the following - // block - // - for (var sheet in workbook.sheetArr) { - //alert("found sheet-"+sheet) - for (var cr in workbook.sheetArr[sheet].sheet.cells) { - // update cell references to sheet name - //alert(cr); - var cell = workbook.sheetArr[sheet].sheet.cells[cr]; - //if (cell) alert(cell.datatype) - if (cell && cell.datatype == "f") { - cell.formula = SocialCalc.RenameWorkBookSheetCell( - cell.formula, - oldname, - newname - ); - if (cell.parseinfo) { - delete cell.parseinfo; - } - } - } - } - // recalculate - workbook.spreadsheet.ExecuteCommand("recalc", ""); - }; - - SocialCalc.CopyWorkBookSheet = function CopyWorkBookSheet(workbook, sheetid) { - //alert("in copy "+sheetid); - workbook.clipsheet.savestr = - workbook.sheetArr[sheetid].sheet.CreateSheetSave(); - //alert("in copy save="+workbook.clipsheet.savestr); - workbook.clipsheet.copiedfrom = sheetid; - workbook.clipsheet.editorprop = {}; - workbook.clipsheet.editorprop.ecell = workbook.spreadsheet.editor.ecell; - //workbook.clipsheet.editorprop.range = workbook.spreadsheet.editor.range; - //workbook.clipsheet.editorprop.range2 = workbook.spreadsheet.editor.range2; - //workbook.clipsheet.highlights = workbook.spreadsheet.context.highlights; - - //alert("copied "+sheetid); - }; - - SocialCalc.PasteWorkBookSheet = function PasteWorkBookSheet( - workbook, - newsheetid, - oldsheetid - ) { - //alert(newsheetid+oldsheetid); - workbook.AddNewWorkBookSheet(newsheetid, oldsheetid, true); - - // clear the clip ? - }; - - SocialCalc.SheetNameExistsInWorkBook = function SheetNameExistsInWorkBook( - workbook, - name - ) { - for (var sheet in workbook.sheetArr) { - if (workbook.sheetArr[sheet].sheet.sheetname == name) { - return sheet; - } - } - return null; - }; - - // - // Workbook Control controls workbook actions (add/del/rename etc) and can appear at the - // bottom of the screen (?). Right now its just a proof of concept - // and appears at the top of the screen - // - // Author: Ramu Ramamurthy - // - // - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - - SocialCalc.CurrentWorkbookControlObject = null; - - SocialCalc.TestWorkBookSaveStr = ""; - - // Constructor: - - SocialCalc.WorkBookControl = function (book, divid, defaultsheetname) { - this.workbook = book; - this.div = divid; - this.defaultsheetname = defaultsheetname; - this.sheetButtonArr = {}; - this.sheetCnt = 0; - this.numSheets = 0; - this.currentSheetButton = null; - this.renameDialogId = "sheetRenameDialog"; - this.deleteDialogId = "sheetDeleteDialog"; - this.hideDialogId = "sheetHideDialog"; - this.unhideDialogId = "sheetUnhideDialog"; - - this.sheetshtml = - ''; - - //this.buttonshtml = - //'
    '+ - //'
    '+ - //''+ - //''+ - //''+ - - // ''+ - // ''+ - // ''+ - - //''+ - //''+ - //'
    '+ - //'
    '; - - SocialCalc.CurrentWorkbookControlObject = this; - this.sheetbar = new SocialCalc.SheetBar(); - }; - - // methods - SocialCalc.WorkBookControl.prototype.GetCurrentWorkBookControl = function () { - return SocialCalc.GetCurrentWorkBookControl(); - }; - SocialCalc.WorkBookControl.prototype.InitializeWorkBookControl = function () { - return SocialCalc.InitializeWorkBookControl(this); - }; - - SocialCalc.WorkBookControl.prototype.ExecuteWorkBookControlCommand = - function (cmd, isremote) { - return SocialCalc.ExecuteWorkBookControlCommand(this, cmd, isremote); - }; - - SocialCalc.ExecuteWorkBookControlCommand = function (control, cmd, isremote) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - //if (!isremote) { - // return; - //} - - if (cmd.cmdtype == "scmd") { - // dispatch a sheet command - control.workbook.WorkbookScheduleCommand(cmd, isremote); - return; - } - - if (cmd.cmdtype != "wcmd") { - return; - } - - var parseobj = new SocialCalc.Parse(cmd.cmdstr); - - var cmd1 = parseobj.NextToken(); - - switch (cmd1) { - case "addsheet": - SocialCalc.WorkBookControlAddSheetRemote(null); - break; - - case "addsheetstr": - var sheetstr = cmd.sheetstr; - SocialCalc.WorkBookControlAddSheetRemote(sheetstr); - break; - - case "delsheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlDelSheetRemote(sheetid); - break; - - case "rensheet": - var sheetid = parseobj.NextToken(); - var oldname = parseobj.NextToken(); - var newname = parseobj.NextToken(); - SocialCalc.WorkBookControlRenameSheetRemote(sheetid, oldname, newname); - break; - - case "activatesheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlActivateSheet(sheetid); - break; - - case "hidesheet": - var sheetid = parseobj.NextToken(); - - break; - - case "unhidesheet": - var sheetid = parseobj.NextToken(); - - break; - } - }; - - SocialCalc.GetCurrentWorkBookControl = function () { - return SocialCalc.CurrentWorkbookControlObject; - }; - - SocialCalc.InitializeWorkBookControl = function (control) { - var element = document.createElement("div"); - element.innerHTML = control.sheetshtml; - var foo = document.getElementById(control.div); - foo.appendChild(element); - //var element2 = document.createElement("div"); - //element2.innerHTML = control.buttonshtml; - //foo.appendChild(element2); - SocialCalc.WorkBookControlAddSheet(false); // this is for the default sheet - }; - - SocialCalc.WorkBookControlDelSheetRemote = function (sheetid) { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (sheetid == control.currentSheetButton.id) { - // the active sheet is being deleted - SocialCalc.WorkBookControlDelSheet(); - return; - } - // some non active sheet is being deleted - var foo = document.getElementById("fooBar"); - var deletedbutton = document.getElementById(sheetid); - - var did = deletedbutton.id; - var dname = deletedbutton.value; - delete control.sheetButtonArr[did]; - - foo.removeChild(deletedbutton); - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + did); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - // delete the sheet - control.workbook.DeleteWorkBookSheet(did, dname); - control.numSheets = control.numSheets - 1; - }; - - // assumes that the current active sheet is being deleted - SocialCalc.WorkBookControlDelSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { - //disallow this - var str = - '
    ' + - "" + - " A workbook must contain at least one worksheet " + - "

    "; - str += - "To delete the selected sheet, you must first insert a new sheet.
    "; - str += - '
    ' + - '
    '; - var main = document.createElement("div"); - main.id = control.deleteDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - " X 
    ' + - '
    ' + - str + - "
    "; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - // do a popup to reaffirm the deletion of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.deleteDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
    ' + - "" + - "The selected sheet will be permanently deleted." + - "
    "; - str += "
      "; - str += "
    • To delete the selected sheet, click OK.
    • "; - str += "
    • To cancel the deletion, click cancel.
    • "; - str += "
    "; - str += - '
    ' + - ' ' + - '
    '; - - var main = document.createElement("div"); - main.id = control.deleteDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - " X 
    ' + - '
    ' + - str + - "
    "; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.WorkBookControlDeleteSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.deleteDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlDeleteSheetSubmit = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlDeleteSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + current.id); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.currentSheetButton = null; - // delete the sheets - control.workbook.DeleteWorkBookSheet(name, curname); - control.numSheets = control.numSheets - 1; - - var cmdstr = "delsheet " + name; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - control.currentSheetButton.setAttribute( - "style", - "background-color:lightgreen" - ); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - break; - } - } - if (control.currentSheetButton != null) { - control.workbook.ActivateWorkBookSheet( - control.currentSheetButton.id, - null - ); - } - }; - - // assumes that the current active sheet is being hidden - SocialCalc.WorkBookControlHideSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { - //disallow this - var str = - '
    ' + - "" + - " A workbook must contain at least one worksheet " + - "

    "; - str += - "Before hiding the selected sheet, you must first insert a new sheet.
    "; - str += - '
    ' + - '
    '; - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - " X 
    ' + - '
    ' + - str + - "
    "; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - // do a popup to reaffirm the hiding of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.hideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
    ' + - "" + - "The selected sheet will be hidden." + - "
    "; - str += "
      "; - str += "
    • To hide the selected sheet, click OK.
    • "; - str += "
    • To cancel the hiding, click cancel.
    • "; - str += "
    "; - str += - '
    ' + - ' ' + - '
    '; - - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - " X 
    ' + - '
    ' + - str + - "
    "; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.WorkBookControlHideSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.hideDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlHideSheetSubmit = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlHideSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + current.id); - // unregister with mouse ? etc - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, false); - sheetbarbutton.style.display = "none"; - control.currentSheetButton = null; - // delete the sheets - - control.numSheets = control.numSheets - 1; - - var cmdstr = "hidesheet " + name; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if ( - sheet != null && - document.getElementById("sbsb-" + sheet).style.display != "none" - ) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute( - "style", - "background-color:lightgreen" - ); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet( - control.currentSheetButton.id, - null - ); - } - }; - - // displays all hidden sheets, and then unhides whatever is selected - SocialCalc.WorkBookControlUnhideSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - - var unhiddencount = 0; - for (var sheet in control.sheetButtonArr) { - if (document.getElementById("sbsb-" + sheet).style.display == "none") { - unhiddencount++; - } - } - - if (unhiddencount == 0) { - //no hidden sheets, error message here - var str = - '
    ' + - "" + - " There are no hidden worksheets. " + - "

    "; - str += - "Before unhiding any sheets, you must first hide a sheet.
    "; - str += - '
    ' + - '
    '; - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - " X 
    ' + - '
    ' + - str + - "
    "; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - var element = document.getElementById(control.unhideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
    ' + - "" + - "The following sheets are hidden." + - '
      ' + - ''; - for (var sheet in control.sheetButtonArr) { - if (document.getElementById("sbsb-" + sheet).style.display == "none") { - str += - '' + - control.sheetButtonArr[sheet].value + - "
      "; - } - } - - str += "
    \n
      "; - str += "
    • To unhide the selected sheet, click OK.
    • "; - str += "
    • To cancel the unhiding, click cancel.
    • "; - str += "
    "; - str += - '
    ' + - ' ' + - '
    '; - - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - " X 
    ' + - '
    ' + - str + - "
    "; - - //alert(main.innerHTML); - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.WorkBookControlUnhideSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.unhideDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlUnhideSheetSubmit = function (name) { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlUnhideSheetHide(); - var current = document.getElementById(control.currentSheetButton.id); - - var curid = current.id; - var curname = control.currentSheetButton.value; - - control.currentSheetButton.setAttribute("style", ""); - var old = control.currentSheetButton.id; - console.log(old); - SocialCalc.SheetBarButtonActivate(old, false); - - var sheetbarbutton = document.getElementById("sbsb-" + name); - // unhide the button - sheetbarbutton.style.display = "inline"; - control.currentSheetButton = null; - - control.numSheets = control.numSheets + 1; - - var cmdstr = "unhidesheet " + name; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if ( - sheet != null && - document.getElementById("sbsb-" + sheet).style.display != "none" - ) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute( - "style", - "background-color:lightgreen" - ); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet( - control.currentSheetButton.id, - null - ); - } - }; - - SocialCalc.WorkBookControlAddSheetButton = function (sheetname, sheetid) { - var control = SocialCalc.GetCurrentWorkBookControl(); - - //Create an input type dynamically. - var element = document.createElement("input"); - - var name = null; - - if (sheetid != null) { - name = sheetid; - } else { - name = "sheet" + (control.sheetCnt + 1).toString(); - control.sheetCnt = control.sheetCnt + 1; - } - - //Assign different attributes to the element. - element.setAttribute("type", "button"); - if (sheetname == null) { - element.setAttribute("value", name); - } else { - element.setAttribute("value", sheetname); - } - element.setAttribute("id", name); - element.setAttribute("name", name); - - var fnname = - "SocialCalc.WorkBookControlActivateSheet(" + "'" + name + "'" + ")"; - - element.setAttribute("onclick", fnname); - - control.sheetButtonArr[name] = element; - - var foo = document.getElementById("fooBar"); - - //Append the element in page (in span). - foo.appendChild(element); - - control.numSheets = control.numSheets + 1; - - var el = new SocialCalc.SheetBarSheetButton( - "sbsb-" + name, - sheetname ? sheetname : name, - document.getElementById("SocialCalc-sheetbar-buttons"), - { - //normalstyle: "border:1px solid #000;backgroundColor:#FFF;", - //downstyle: "border:1px solid #000;backgroundColor:#CCC;", - //hoverstyle: "border:1px solid #000;backgroundColor:#FFF;" - }, - { - MouseDown: function () { - SocialCalc.SheetBarSheetButtonPress(name); - }, - Repeat: function () {}, - Disabled: function () {}, - } - ); - - return element; - }; - - SocialCalc.WorkBookControlAddSheet = function (addworksheet, sheetname) { - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(sheetname); - - // then change the highlight - - var old = "sheet1"; - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style", ""); - old = control.currentSheetButton.id; - SocialCalc.SheetBarButtonActivate(old, false); - } - - element.setAttribute("style", "background-color:lightgreen"); - control.currentSheetButton = element; - var newsheetid = element.id; - SocialCalc.SheetBarButtonActivate(newsheetid, true); - - // create the sheet - if (addworksheet) { - control.workbook.AddNewWorkBookSheet(newsheetid, old, false); - // broadcast an add command here - var cmdstr = "addsheet"; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - } - }; - - SocialCalc.WorkBookControlAddSheetRemote = function (savestr) { - var control = SocialCalc.GetCurrentWorkBookControl(); - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(); - - // add the sheet, dont switch to it - control.workbook.AddNewWorkBookSheetNoSwitch( - element.id, - element.value, - savestr - ); - }; - - SocialCalc.WorkBookControlActivateSheet = function (name) { - //alert("in activate sheet="+name) - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById(name); - foo.setAttribute("style", "background-color:lightgreen;"); - SocialCalc.SheetBarButtonActivate(name, true); - - var old = control.currentSheetButton.id; - if (control.currentSheetButton.id != foo.id) { - control.currentSheetButton.setAttribute("style", ""); - SocialCalc.SheetBarButtonActivate(old, false); - } - - control.currentSheetButton = foo; - - control.workbook.ActivateWorkBookSheet(name, old); - }; - - SocialCalc.WorkBookControlHttpRequest = null; - - SocialCalc.WorkBookControlAlertContents = function () { - var loadedstr = ""; - var http_request = SocialCalc.WorkBookControlHttpRequest; - - if (http_request.readyState == 4) { - //addmsg("received:" + http_request.responseText.length + " chars"); - try { - if (http_request.status == 200) { - loadedstr = http_request.responseText || ""; - http_request = null; - } else { - } - } catch (e) {} - // do something with loaded str - //alert("loaded="+loadedstr); - SocialCalc.TestWorkBookSaveStr = loadedstr; - SocialCalc.Clipboard.clipboard = loadedstr; - } - }; - - SocialCalc.WorkBookControlAjaxCall = function (url, contents) { - var http_request = null; - - alert("in ajax"); - if (window.XMLHttpRequest) { - // Mozilla, Safari,... - http_request = new XMLHttpRequest(); - } else if (window.ActiveXObject) { - // IE - try { - http_request = new ActiveXObject("Msxml2.XMLHTTP"); - } catch (e) { - try { - http_request = new ActiveXObject("Microsoft.XMLHTTP"); - } catch (e) {} - } - } - if (!http_request) { - alert("Giving up :( Cannot create an XMLHTTP instance"); - return false; - } - - // Make the actual request - SocialCalc.WorkBookControlHttpRequest = http_request; - - http_request.onreadystatechange = SocialCalc.WorkBookControlAlertContents; - http_request.open("POST", document.URL, true); // async - http_request.setRequestHeader( - "Content-Type", - "application/x-www-form-urlencoded" - ); - http_request.send(contents); - - return true; - }; - - SocialCalc.WorkBookControlSaveSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetsave = {}; - - sheetsave.numsheets = control.numSheets; - sheetsave.currentid = control.currentSheetButton.id; - sheetsave.currentname = control.currentSheetButton.value; - - sheetsave.sheetArr = {}; - for (var sheet in control.sheetButtonArr) { - var sheetstr = control.workbook.SaveWorkBookSheet(sheet); - sheetsave.sheetArr[sheet] = {}; - sheetsave.sheetArr[sheet].sheetstr = sheetstr; - sheetsave.sheetArr[sheet].name = control.sheetButtonArr[sheet].value; - sheetsave.sheetArr[sheet].hidden = - document.getElementById("sbsb-" + sheet).style.display == "none" - ? "1" - : "0"; - } - - // Save the editable cells if specified - if (SocialCalc.EditableCells && SocialCalc.EditableCells.allow) { - sheetsave.EditableCells = {}; - for (var i in SocialCalc.EditableCells) { - sheetsave.EditableCells[i] = SocialCalc.EditableCells[i]; - } - } - - var d = new Date(); - sheetsave["timestamp"] = d.toString(); - - SocialCalc.TestWorkBookSaveStr = JSON.stringify(sheetsave); - //alert(SocialCalc.TestWorkBookSaveStr); - // send it to the backend - // SocialCalc.WorkBookControlAjaxCall("/", "&sheetdata="+encodeURIComponent(SocialCalc.TestWorkBookSaveStr)); - return SocialCalc.TestWorkBookSaveStr; - }; - - // insert another workbook into an existing workbook - // assumption is at least 1 sheet exists in existing workbook - // sheets with same names will be overwritten ! - SocialCalc.WorkBookControlInsertWorkbook = function (savestr) { - var sheetsave; - if (savestr) { - sheetsave = JSON.parse(savestr); - } - var control = SocialCalc.GetCurrentWorkBookControl(); - for (var sheet in sheetsave.sheetArr) { - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - // check if sheetname already exists - var sheetname = sheetsave.sheetArr[sheet].name; - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - if (sheetid) { - console.log(sheetname + "exists"); - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, sheetname); - } else { - //just test-brand new insert first - sheetid = "sheet" + (control.sheetCnt + 1).toString(); - control.sheetCnt = control.sheetCnt + 1; - SocialCalc.WorkBookControlAddSheetButton( - sheetsave.sheetArr[sheet].name, - sheetid - ); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch( - sheetid, - sheetsave.sheetArr[sheet].name, - savestr - ); - } - } - }; - - SocialCalc.WorkBookControlLoad = function (savestr) { - var sheetsave; - - if (savestr == "") return; - - if (savestr) { - sheetsave = JSON.parse(savestr); - } else { - sheetsave = JSON.parse(SocialCalc.TestWorkBookSaveStr); - } - //alert(sheetsave.currentid+","+sheetsave.currentname) - - // first create a new workbook - var control = SocialCalc.GetCurrentWorkBookControl(); - - SocialCalc.WorkBookControlCreateNewBook(); - - // at this point there is one sheet, and 1 button - // create the sequence of buttons, and sheets - var firstrun = true; - var newbuttons = 0; - var sheetid = null; - var currentsheetid = sheetsave.currentid; - //alert("button="+newbuttons) - for (var sheet in sheetsave.sheetArr) { - //alert(sheet); - if (newbuttons > sheetsave.numsheets) { - break; - } - //alert("button="+newbuttons) - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - if (firstrun) { - firstrun = false; - // set the first button's name correctly - sheetid = control.currentSheetButton.id; - control.currentSheetButton.value = sheetsave.sheetArr[sheet].name; - SocialCalc.SheetBarButtonSetName( - sheetid, - sheetsave.sheetArr[sheet].name - ); - // set the sheet data for the first sheet which already exists - control.workbook.LoadRenameWorkBookSheet( - sheetid, - savestr, - control.currentSheetButton.value - ); - // need to also set the formula cache - currentsheetid = sheetid; - } else { - sheetid = "sheet" + (control.sheetCnt + 1).toString(); - control.sheetCnt = control.sheetCnt + 1; - SocialCalc.WorkBookControlAddSheetButton( - sheetsave.sheetArr[sheet].name, - sheetid - ); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch( - sheetid, - sheetsave.sheetArr[sheet].name, - savestr - ); - } - if (sheetsave.sheetArr[sheet].hidden == "1") { - // unregister with mouse ? etc - var sheetbarbutton = document.getElementById("sbsb-" + sheetid); - sheetbarbutton.style.display = "none"; - SocialCalc.SheetBarButtonActivate(sheet, false); - newbuttons = newbuttons - 1; - } - if (sheet == sheetsave.currentid) { - currentsheetid = sheetid; - } - newbuttons = newbuttons + 1; - } - // Save the user script data - if (sheetsave.EditableCells) { - SocialCalc.EditableCells = {}; - for (var i in sheetsave.EditableCells) { - SocialCalc.EditableCells[i] = sheetsave.EditableCells[i]; - } - } - var timeoutFn = function () { - SocialCalc.WorkBookControlActivateSheet(currentsheetid); - }; - window.setTimeout(timeoutFn, 200); - }; - - SocialCalc.WorkBookControlRenameSheet = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - // do a popup to get the new name of the sheet - // the popup has an input element with submit, and cancel buttons - var element = document.getElementById(control.renameDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = - '
    ' + - '' + - "Rename-" + - currentsheet + - "
    " + - '' + - "Please ensure that you DO NOT have ANY spaces in the sheet name." + - "" + - '
    ' + - "
    "; - - str += - '
    ' + - ' ' + - '
    '; - - var main = document.createElement("div"); - main.id = control.renameDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = vp.height / 3 + "px"; - main.style.left = vp.width / 3 + "px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = - '' + - '" + - '
    ' + - " " + - " X 
    ' + - '
    ' + - str + - "
    "; - - SocialCalc.DragRegister( - main.firstChild.firstChild.firstChild.firstChild, - true, - true, - { - MouseDown: SocialCalc.DragFunctionStart, - MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, - positionobj: main, - } - ); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - - var ele = document.getElementById("newSheetName"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); - }; - - SocialCalc.WorkBookControlRenameSheetHide = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; - - var ele = document.getElementById(control.renameDialogId); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - }; - - SocialCalc.WorkBookControlRenameSheetSubmit = function () { - // this handles all the rename action - var ele = document.getElementById("newSheetName"); - //console.log(ele.value); - var control = SocialCalc.GetCurrentWorkBookControl(); - if (ele.value.length == 0) { - ele.focus(); - return; - } - var oldname = control.currentSheetButton.value; - var newname = ele.value; - if (newname.indexOf(" ") != -1) { - alert( - "A space was found in the new name. Please ensure that the new name has no sapces" - ); - return; - } - SocialCalc.WorkBookControlRenameSheetHide(); - // verify newname does not clash with any existing sheet name - // if so reject - var smallname = newname.toLowerCase(); //converting to lower case to normalise - //console.log(smallname + " old " + ele.value); - for (var sheet in workbook.sheetArr) { - console.log(workbook.sheetArr[sheet].sheet.sheetname); //checking in sheetarr for repeated names - if (workbook.sheetArr[sheet].sheet.sheetname == smallname) { - alert(newname + " already exists"); - return; - } - } // variation of Case in letters of a sheet name will give an error if smallname is used. - - control.currentSheetButton.value = smallname; - - SocialCalc.SheetBarButtonSetName(control.currentSheetButton.id, newname); - - // perform a rename for formula references to this sheet in all the - // sheets in the workbook - control.workbook.RenameWorkBookSheet( - oldname, - smallname, - control.currentSheetButton.id - ); - - var cmdstr = - "rensheet " + - control.currentSheetButton.id + - " " + - oldname + - " " + - newname; - //console.log(cmdstr); - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - }); - }; - - SocialCalc.WorkBookControlRenameSheetRemote = function ( - sheetid, - oldname, - newname - ) { - //console.log("rename sheet ",sheetid, oldname, newname) - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById("fooBar"); - var renbutton = document.getElementById(sheetid); - - renbutton.value = newname; - - SocialCalc.SheetBarButtonSetName(sheetid, newname); - - control.workbook.RenameWorkBookSheet(oldname, newname, sheetid); - }; - - SocialCalc.WorkBookControlCreateNewBook = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - - // delete all the sheets except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - control.workbook.DeleteWorkBookSheet( - control.sheetButtonArr[sheet].id, - control.sheetButtonArr[sheet].value - ); - } - } - // Reset that 1 sheet - - control.workbook.LoadRenameWorkBookSheet( - control.currentSheetButton.id, - "", - control.workbook.defaultsheetname - ); - - // delete all the buttons except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.sheetButtonArr[sheet].id); - - var name = current.id; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-" + name); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.numSheets = control.numSheets - 1; - } - } - // rename that button - control.currentSheetButton.value = control.workbook.defaultsheetname; - //alert("done new workbook") - }; - - SocialCalc.WorkBookControlNewBook = function () { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlCreateNewBook(); - control.workbook.RenderWorkBookSheet(); - }; - - SocialCalc.WorkBookControlMove = function (direction) { - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - return; - } - var sheetArr = control.sheetButtonArr; - var newSheetArr = {}; - var sheetid = control.currentSheetButton.id; - - var curr_button = document.getElementById(sheetid); - var curr_sb_button = document.getElementById("sbsb-" + sheetid); - var sib_button = null; - var sib_sb_button = null; - if (direction == "left") { - sib_button = curr_button.previousSibling; - sib_sb_button = curr_sb_button.previousSibling; - if (!sib_sb_button) { - alert("Cannot move leftmost Sheet further to the left"); - return; - } - } else { - sib_button = curr_button.nextSibling; - sib_sb_button = curr_sb_button.nextSibling; - if (!sib_sb_button) { - alert("Cannot move rightmost Sheet further to the right"); - return; - } - } - var currid = sheetid; - var sibid = sib_button.id; - var parent = curr_button.parentNode; - var sb_parent = curr_sb_button.parentNode; - - var cloned = {}; - var clonedsb = {}; - for (button in sheetArr) { - clonedsb[button] = document.getElementById("sbsb-" + button); - cloned[button] = document.getElementById(button); - sb_parent.removeChild(document.getElementById("sbsb-" + button)); - parent.removeChild(document.getElementById(button)); - } - for (button in sheetArr) { - if (button != currid && button != sibid) { - newSheetArr[button] = sheetArr[button]; - sb_parent.appendChild(clonedsb[button]); - parent.appendChild(cloned[button]); - } else if (button == currid) { - if (direction == "left") { - newSheetArr[currid] = sheetArr[currid]; - newSheetArr[sibid] = sheetArr[sibid]; - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - } else { - newSheetArr[sibid] = sheetArr[sibid]; - newSheetArr[currid] = sheetArr[currid]; - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - } - } - } - control.sheetButtonArr = newSheetArr; - SocialCalc.SheetBarButtonActivate(currid, true); - }; - - SocialCalc.WorkBookControlMoveLeft = function () { - SocialCalc.WorkBookControlMove("left"); - }; - SocialCalc.WorkBookControlMoveRight = function () { - SocialCalc.WorkBookControlMove("right"); - }; - - SocialCalc.WorkBookControlCopySheet = function () { - //alert("in copy"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - control.workbook.CopyWorkBookSheet(control.currentSheetButton.id); - - alert("copied sheet:" + control.currentSheetButton.value); - }; - - SocialCalc.WorkBookControlPasteSheet = function () { - //alert("in paste"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - var oldid = control.currentSheetButton.id; - - SocialCalc.WorkBookControlAddSheet(false); - - var newid = control.currentSheetButton.id; - - //alert(newid+oldid); - - control.workbook.PasteWorkBookSheet(newid, oldid); - - var cmdstr = "addsheetstr"; - SocialCalc.Callbacks.broadcast("execute", { - cmdtype: "wcmd", - id: "0", - cmdstr: cmdstr, - sheetstr: control.workbook.clipsheet.savestr, - }); - }; - - SocialCalc.SheetBar = function () { - this.baseDiv = document.getElementById("SocialCalc-sheetbar"); - - this.prebuttonsDiv = document.createElement("div"); - this.prebuttonsDiv.style.cssText = "display:inline;"; - this.prebuttonsDiv.innerHTML = "        "; - this.prebuttonsDiv.id = "SocialCalc-sheetbar-prebuttons"; - - this.buttonsDiv = document.createElement("div"); - this.buttonsDiv.id = "SocialCalc-sheetbar-buttons"; - this.buttonsDiv.style.cssText = "display:inline;"; - - this.buttonActionsDiv = document.createElement("div"); - this.buttonActionsDiv.id = "SocialCalc-sheetbar-buttonactions"; - this.buttonActionsDiv.style.display = "inline"; - var addbutton = new SocialCalc.SheetBarSheetButton( - "sbsba-add", - "sbsba-add", - this.buttonActionsDiv, - {}, - { - MouseDown: function () { - var abc = SocialCalc.WorkBookControlAddSheet(true); - }, - }, - "add-2.png" - ); - - this.baseDiv.appendChild(this.prebuttonsDiv); - this.baseDiv.appendChild(this.buttonsDiv); - this.baseDiv.appendChild(this.buttonActionsDiv); - }; - - // define a new class for sheetbarsheetbutton - - SocialCalc.SheetBarSheetButton = function ( - id, - name, - parentdiv, - params, - functions, - img - ) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.name = name; - if (!img) { - this.ele.innerHTML = name; - this.ele.style.cssText = - "font-size:small;display:inline;padding:5px 5px 2px 5px;border:1px solid #000;"; - imgele = document.createElement("img"); - imgele.id = id + "-img"; - imgele.src = - SocialCalc.Constants.defaultImagePrefix + "menu-dropdown.png"; - imgele.style.cssText = - "padding:0px 2px;width:16px;height:16px;vertical-align:middle;"; - this.ele.appendChild(imgele); - SocialCalc.ButtonRegister(this.ele, params, functions); - SocialCalc.ButtonRegister(imgele, params, functions); - } else { - var imgele = document.createElement("img"); - imgele.src = SocialCalc.Constants.defaultImagePrefix + img; - imgele.style.cssText = "width:16px;height:16px;vertical-align:middle;"; - this.ele.appendChild(imgele); - this.ele.style.cssText = "display:inline;padding:5px 5px 2px 5px;"; - SocialCalc.ButtonRegister(imgele, params, functions); - } - parentdiv.appendChild(this.ele); - }; - - SocialCalc.SheetBarButtonActivate = function (id, active) { - var sbbutton = document.getElementById("sbsb-" + id); - sbbutton.isactive = active; - if (active) { - sbbutton.style.backgroundColor = "#FFF"; - var imgele = document.getElementById("sbsb-" + id + "-img"); - if (!imgele) { - imgele = document.createElement("img"); - imgele.id = "sbsb-" + id + "-img"; - imgele.src = - SocialCalc.Constants.defaultImagePrefix + "menu-dropdown.png"; - imgele.style.cssText = - "padding:0px 2px;width:16px;height:16px;vertical-align:middle;"; - } - sbbutton.appendChild(imgele); - SocialCalc.ButtonRegister( - imgele, - {}, - { - MouseDown: function () { - SocialCalc.SheetBarSheetButtonPress(id); - }, - Repeat: function () {}, - Disabled: function () {}, - } - ); - } else { - sbbutton.style.backgroundColor = "#CCC"; - var imgele = document.getElementById("sbsb-" + id + "-img"); - if (imgele) { - sbbutton.removeChild(imgele); - } - } - var menu = document.getElementById("sbsb-menu"); - if (menu && menu.style.display != "none") { - menu.style.display = "none"; - } - }; - - SocialCalc.SheetBarButtonSetName = function (id, name) { - var sbbutton = document.getElementById("sbsb-" + id); - sbbutton.name = name; - sbbutton.innerHTML = name; - if (sbbutton.isactive) { - SocialCalc.SheetBarButtonActivate(id, true); - } - }; - - SocialCalc.SheetBarSheetButtonPress = function (id) { - //console.log("button press") - var sbbutton = document.getElementById("sbsb-" + id); - if (sbbutton && sbbutton.isactive) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) { - var sbsbm = new SocialCalc.SheetBarSheetButtonMenu("sbsb-menu", id); - } else { - menu.clickedsheetid = id; - if (menu.style.display == "none") { - menu.style.display = "inline"; - SocialCalc.SheetBarSheetButtonMenuPosition(menu, id); - } else { - menu.style.display = "none"; - } - } - } else if (sbbutton) { - SocialCalc.WorkBookControlActivateSheet(id); - } - }; - - // define a new class for sheetbarsheet button menu item - - SocialCalc.SheetBarSheetButtonMenuItem = function (id, t) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.innerHTML = t; - this.ele.className = ""; - this.ele.style.cssText = - "padding:3px 4px;width:100px;height:20px;background-color:#FFF;"; - - var params = { - normalstyle: "backgroundColor:#FFF;", - downstyle: "backgroundColor:#CCC;", - hoverstyle: "backgroundColor:#CCC;", - }; - var functions = { - MouseDown: function () { - SocialCalc.SheetBarMenuItemPress(id); - }, - Repeat: function () {}, - Disabled: function () {}, - }; - - SocialCalc.ButtonRegister(this.ele, params, functions); - - SocialCalc.TouchRegister(this.ele, { SingleTap: functions.MouseDown }); - - return this.ele; - }; - - SocialCalc.SheetBarMenuItemPress = function (id) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) return; - - var clickedsheetid = menu.clickedsheetid; - - switch (id) { - case "sbsb_deletesheet": - //console.log("delete "+clickedsheetid); - SocialCalc.WorkBookControlDelSheet(); - break; - case "sbsb_hidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlHideSheet(); - break; - case "sbsb_unhidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlUnhideSheet(); - break; - case "sbsb_copysheet": - //console.log("copy "+clickedsheetid); - SocialCalc.WorkBookControlCopySheet(); - break; - case "sbsb_moveleft": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveLeft(); - break; - case "sbsb_moveright": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveRight(); - break; - - case "sbsb_pastesheet": - //console.log("paste "+clickedsheetid); - SocialCalc.WorkBookControlPasteSheet(); - break; - case "sbsb_renamesheet": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlRenameSheet(); - break; - case "sbsb_closemenu": - //console.log("rename "+clickedsheetid); - menu.style.display = "none"; - break; - default: - break; - } - menu.style.display = "none"; - }; - - // define a new class for sheetbarsheet button menu - SocialCalc.SheetBarSheetButtonMenu = function (id, clickedsheetid) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.className = ""; - this.ele.clickedsheetid = clickedsheetid; - this.ele.style.cssText = - "border:1px solid #000;position:absolute;top:200px;left:0px;width=100px;z-index:120"; - - var ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_deletesheet", - " Delete Sheet" - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_hidesheet", - " Hide Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_unhidesheet", - " Unhide Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_renamesheet", - " Rename Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_moveleft", - " Move Left " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_moveright", - " Move Right " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_copysheet", - " Copy Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_pastesheet", - " Paste Sheet " - ); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem( - "sbsb_closemenu", - " Cancel" - ); - this.ele.appendChild(ele1); - - SocialCalc.SheetBarSheetButtonMenuPosition(this.ele, clickedsheetid); - - //var clickedsheet = document.getElementById(clickedsheetid); - //var position = SocialCalc.GetElementPosition(clickedsheet); - //console.log(clickedsheet.offsetHeight,clickedsheet.offsetWidth,clickedsheet.offsetLeft, clickedsheet.offsetTop); - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.editor.toplevel.appendChild(this.ele); - }; - - // position the sheet menu - SocialCalc.SheetBarSheetButtonMenuPosition = function (menu, clickedsheetid) { - var hlessbutton = document.getElementById("te_lessbuttonh"); - - //console.log(hlessbutton.style.top, hlessbutton.style.left); - - var sbbutton = document.getElementById("sbsb-" + clickedsheetid); - - //console.log(sbbutton.offsetLeft,clickedsheetid); - - var top = hlessbutton.style.top.slice(0, -2) - 220; - var left = sbbutton.offsetLeft + 7; - - menu.style.top = top + "px"; - menu.style.left = left + "px"; - - //console.log(menu.style.top, menu.style.left); - }; - - SocialCalc.ScriptInfo = { - scripts: {}, - handle: null, - }; - - SocialCalc.ScriptCheck = function (sheetid, coord, text) { - var commentstart = text.indexOf(""); - if (commentstart != -1 && commentend != -1) { - var script = text.slice(commentstart + 10, commentend); - //alert(script); - SocialCalc.ScriptInfo.scripts[coord] = script; - if (SocialCalc.ScriptInfo.handle == null) { - SocialCalc.ScriptInfo.handle = window.setTimeout( - SocialCalc.EvalUserScripts, - 500 - ); - } - //alert(coord+"-"+sheetid); - } - }; - - SocialCalc.EvalUserScript = function (data) { - var head = - document.getElementsByTagName("head")[0] || document.documentElement; - - if (data == "") return; - - var script = document.createElement("script"); - - script.type = "text/javascript"; - try { - // doesn't work on ie... - script.appendChild(document.createTextNode(data)); - } catch (e) { - // IE has funky script nodes - script.text = data; - } - - head.insertBefore(script, head.firstChild); - head.removeChild(script); - }; - - SocialCalc.EvalUserScripts = function () { - for (var cr in SocialCalc.ScriptInfo.scripts) { - SocialCalc.EvalUserScript(SocialCalc.ScriptInfo.scripts[cr]); - //console.log(cr,SocialCalc.ScriptInfo.scripts[cr]) - } - SocialCalc.ScriptInfo.handle = null; - SocialCalc.ScriptInfo.scripts = {}; - }; - - SocialCalc.CallOutOnRenderCell = function (sheetobj, value, cr) { - var cell = sheetobj.cells[cr]; - if (!cell) return; - var valuetype = cell.valuetype || ""; // get type of value to determine formatting - var valuesubtype = valuetype.substring(1); - var sheetattribs = sheetobj.attribs; - var valueformat; - valuetype = valuetype.charAt(0); - if (valuetype == "t") { - valueformat = - sheetobj.valueformats[cell.textvalueformat - 0] || - sheetobj.valueformats[sheetattribs.defaulttextvalueformat - 0] || - ""; - if (valueformat == "text-html") { - SocialCalc.ScriptCheck(sheetobj.sheetid, cr, value); - } - } - }; - - SocialCalc.GetCellDataValue = function (coord) { - var sheetname = null; - var sheetid = ""; - var bindex = coord.indexOf("!"); - if (bindex != -1) { - sheetname = coord.slice(0, bindex); - coord = coord.slice(bindex + 1); - //console.log(sheetname,coord) - } - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (sheetname == null) { - sheetid = control.currentSheetButton.id; - } else { - sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - } - - if (sheetid == null || sheetid == "") { - return "0"; - } - - var sheetobj = control.workbook.sheetArr[sheetid].sheet; - - var cell = sheetobj.cells[coord]; - - if (cell) { - return cell.datavalue; - } else { - return 0; - } - }; - - SocialCalc.GetCellDataArray = function (coordstr, sheetname) { - var vals = []; - var coords = coordstr.split(","); - if (sheetname == null) { - sheetname = ""; - } else { - sheetname = sheetname + "!"; - } - for (var c in coords) { - vals.push(SocialCalc.GetCellDataValue(sheetname + coords[c])); - } - return vals; - }; - - SocialCalc.UserScriptData = {}; - - SocialCalc.WorkBookRecalculateInfo = { - sheets: [], - calcorder: [], - current: 0, - pass: 0, - }; - - SocialCalc.WorkBookRecalculateAll = function () { - // do it from the last sheet to the first sheet - // using the recalc-done signal to trigger the next sheet - - // if already in the middle of a recalculate-all, ignore this. - if ( - SocialCalc.WorkBookRecalculateInfo.current != 0 || - SocialCalc.WorkBookRecalculateInfo.calcorder.length != 0 || - SocialCalc.WorkBookRecalculateInfo.sheets.length != 0 - ) { - return; - } - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - SocialCalc.WorkBookRecalculateInfo.current = 0; - - for (var sheet in control.workbook.sheetArr) { - SocialCalc.WorkBookRecalculateInfo.sheets.push(sheet); - } - - var i = 0; - for (var c = SocialCalc.WorkBookRecalculateInfo.sheets.length; c > 0; c--) { - SocialCalc.WorkBookRecalculateInfo.calcorder[i] = - SocialCalc.WorkBookRecalculateInfo.sheets[c - 1]; - i++; - } - window.setTimeout(SocialCalc.WorkBookRecalculateStep, 500); - }; - - SocialCalc.WorkBookRecalculateStep = function () { - if ( - SocialCalc.WorkBookRecalculateInfo.current == - SocialCalc.WorkBookRecalculateInfo.calcorder.length - ) { - SocialCalc.WorkBookRecalculateInfo.current = 0; - SocialCalc.WorkBookRecalculateInfo.calcorder = []; - SocialCalc.WorkBookRecalculateInfo.sheets = []; - if (SocialCalc.WorkBookRecalculateInfo.pass == 1) { - SocialCalc.WorkBookRecalculateInfo.pass = 0; - SocialCalc.SpinnerWaitHide(); - //alert("load done"); - return; - } else { - SocialCalc.WorkBookRecalculateInfo.pass++; - SocialCalc.WorkBookRecalculateAll(); - return; - } - } - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert("recalculate "+ - // SocialCalc.WorkBookRecalculateInfo.calcorder[ - // SocialCalc.WorkBookRecalculateInfo.current] - // ); - var sheetid = - SocialCalc.WorkBookRecalculateInfo.calcorder[ - SocialCalc.WorkBookRecalculateInfo.current - ]; - SocialCalc.WorkBookControlActivateSheet(sheetid); - SocialCalc.WorkBookRecalculateInfo.current++; - - window.setTimeout(SocialCalc.WorkBookRecalculateStep, 1000); - }; - - SocialCalc.SpinnerWaitCreate = function () { - // if the div exists already just use it - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - return; - } - var main = document.createElement("div"); - main.id = "waitloadingspinner"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - main.style.top = vp.height / 2 + "px"; - main.style.left = vp.width / 2 + "px"; - main.style.zIndex = 110; - - main.style.width = "50px"; - main.style.height = "50px"; - main.innerHTML = - 'Loading...'; - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - }; - - SocialCalc.SpinnerWaitHide = function () { - // if the div exists already just use it - - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - ele.innerHTML = ""; - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - } - }; - - SocialCalc.EditableCells = {}; - SocialCalc.EditableCells.allow = false; - SocialCalc.EditableCells.cells = {}; - - SocialCalc.Callbacks.IsCoordEditable = function (sheetcoord) { - if (!SocialCalc.EditableCells.allow) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[sheetcoord]) { - // by default all cells are editable - return true; - } - - return false; - }; - - SocialCalc.Callbacks.IsCellEditable = function (editor) { - var cellname = editor.workingvalues.currentsheet + "!" + editor.ecell.coord; - if (!SocialCalc.EditableCells.allow) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[cellname]) { - // by default all cells are editable - return true; - } - - return false; - }; - - SocialCalc.IsScrollPossible = function ( - lastrow, - lastcol, - curr_vpos, - curr_hpos, - vamount, - hamount - ) { - //return false; - //console.log(lastrow+","+lastcol); - //console.log(curr_vpos+","+curr_hpos); - //console.log(vamount+","+hamount); - - if (curr_vpos + 10 + vamount > lastrow) { - return false; - } - if (curr_hpos + hamount > lastcol) { - return false; - } - return true; - }; - - // this is for checkmark toggling - SocialCalc.Callbacks.ToggleCell = function (cellname) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var sheetid = control.currentSheetButton.id; - var sheetobj = control.workbook.sheetArr[sheetid].sheet; - var cell = sheetobj.cells[cellname]; - var sheetname = sheetobj.sheetname; - - // check if cell is in constraints - //console.log(sheetname); - //console.log(cellname); - - var constraint = - SocialCalc.EditableCells.constraints[sheetname + "!" + cellname]; - if (!constraint || constraint[0] != "tc") { - return; - } - - var cellinner = document.getElementById("cell_" + cellname); - - if (cellinner.innerHTML.indexOf(" ") != -1) { - // set the value to the img value - cellinner.innerHTML = - '
    '; - if (cell) { - //cell.displaystring = '
    ' ; - //cell.datavalue = '
    ' ; - //console.log("found cell") - cell.displaystring = - '
    '; - cell.datavalue = - '
    '; - //http://img689.imageshack.us/img689/9234/checkmark.png - } - } else { - // set the value to a space - cellinner.innerHTML = "
     
    "; - if (cell) { - cell.datavalue = "
     
    "; - cell.displaystring = "
     
    "; - } - } - }; - - SocialCalc.WorkbookControlCreateSheetHTML = function (sheetlist) { - var context, div, ele; - - var result = ""; - - var control = SocialCalc.GetCurrentWorkBookControl(); - - div = document.createElement("div"); - - if (!sheetlist) { - context = new SocialCalc.RenderContext(spreadsheet.sheet); - ele = context.RenderSheet(null, { type: "html" }); - div.appendChild(ele); - context = undefined; - } else { - for (var sheetid in sheetlist) { - context = new SocialCalc.RenderContext( - control.workbook.sheetArr[sheetid].sheet - ); - ele = context.RenderSheet(null, { type: "html" }); - context = undefined; - div.appendChild(ele); - if (sheetid.substring(5) == control.sheetCnt) { - ele.style.pageBreakAfter = "auto"; - } else { - ele.style.pageBreakAfter = "always"; - } - } - } - - result = div.innerHTML; - ele = undefined; - div = undefined; - //console.log(result); - return result; - }; - - /* - http://www.JSON.org/json2.js - 2010-08-25 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date ? - 'Date(' + this[key] + ')' : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - - /*jslint evil: true, strict: false */ - - /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, - call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - // Create a JSON object only if one does not already exist. We create the - // methods in a closure to avoid creating global variables. - - if (!this.JSON) { - this.JSON = {}; - } - - (function () { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? "0" + n : n; - } - - if (typeof Date.prototype.toJSON !== "function") { - Date.prototype.toJSON = function (key) { - return isFinite(this.valueOf()) - ? this.getUTCFullYear() + - "-" + - f(this.getUTCMonth() + 1) + - "-" + - f(this.getUTCDate()) + - "T" + - f(this.getUTCHours()) + - ":" + - f(this.getUTCMinutes()) + - ":" + - f(this.getUTCSeconds()) + - "Z" - : null; - }; - - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = - function (key) { - return this.valueOf(); - }; - } - - var cx = - /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = - /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { - // table of character substitutions - "\b": "\\b", - "\t": "\\t", - "\n": "\\n", - "\f": "\\f", - "\r": "\\r", - '"': '\\"', - "\\": "\\\\", - }, - rep; - - function quote(string) { - // If the string contains no control characters, no quote characters, and no - // backslash characters, then we can safely slap some quotes around it. - // Otherwise we must also replace the offending characters with safe escape - // sequences. - - escapable.lastIndex = 0; - return escapable.test(string) - ? '"' + - string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === "string" - ? c - : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); - }) + - '"' - : '"' + string + '"'; - } - - function str(key, holder) { - // Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - - // If the value has a toJSON method, call it to obtain a replacement value. - - if ( - value && - typeof value === "object" && - typeof value.toJSON === "function" - ) { - value = value.toJSON(key); - } - - // If we were called with a replacer function, then call the replacer to - // obtain a replacement value. - - if (typeof rep === "function") { - value = rep.call(holder, key, value); - } - - // What happens next depends on the value's type. - - switch (typeof value) { - case "string": - return quote(value); - - case "number": - // JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : "null"; - - case "boolean": - case "null": - // If the value is a boolean or null, convert it to a string. Note: - // typeof null does not produce 'null'. The case is included here in - // the remote chance that this gets fixed someday. - - return String(value); - - // If the type is 'object', we might be dealing with an object or an array or - // null. - - case "object": - // Due to a specification blunder in ECMAScript, typeof null is 'object', - // so watch out for that case. - - if (!value) { - return "null"; - } - - // Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - - // Is the value an array? - - if (Object.prototype.toString.apply(value) === "[object Array]") { - // The value is an array. Stringify every element. Use null as a placeholder - // for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || "null"; - } - - // Join all of the elements together, separated with commas, and wrap them in - // brackets. - - v = - partial.length === 0 - ? "[]" - : gap - ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" - : "[" + partial.join(",") + "]"; - gap = mind; - return v; - } - - // If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === "object") { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === "string") { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ": " : ":") + v); - } - } - } - } else { - // Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ": " : ":") + v); - } - } - } - } - - // Join all of the member texts together, separated with commas, - // and wrap them in braces. - - v = - partial.length === 0 - ? "{}" - : gap - ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" - : "{" + partial.join(",") + "}"; - gap = mind; - return v; - } - } - - // If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== "function") { - JSON.stringify = function (value, replacer, space) { - // The stringify method takes a value and an optional replacer, and an optional - // space parameter, and returns a JSON text. The replacer can be a function - // that can replace values, or an array of strings that will select the keys. - // A default replacer method can be provided. Use of the space parameter can - // produce text that is more easily readable. - - var i; - gap = ""; - indent = ""; - - // If the space parameter is a number, make an indent string containing that - // many spaces. - - if (typeof space === "number") { - for (i = 0; i < space; i += 1) { - indent += " "; - } - - // If the space parameter is a string, it will be used as the indent string. - } else if (typeof space === "string") { - indent = space; - } - - // If there is a replacer, it must be a function or an array. - // Otherwise, throw an error. - - rep = replacer; - if ( - replacer && - typeof replacer !== "function" && - (typeof replacer !== "object" || typeof replacer.length !== "number") - ) { - throw new Error("JSON.stringify"); - } - - // Make a fake root object containing our value under the key of ''. - // Return the result of stringifying the value. - - return str("", { "": value }); - }; - } - - // If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== "function") { - JSON.parse = function (text, reviver) { - // The parse method takes a text and an optional reviver function, and returns - // a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - // The walk method is used to recursively walk the resulting structure so - // that modifications can be made. - - var k, - v, - value = holder[key]; - if (value && typeof value === "object") { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - // Parsing happens in four stages. In the first stage, we replace certain - // Unicode characters with escape sequences. JavaScript handles many characters - // incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - - // In the second stage, we run the text against regular expressions that look - // for non-JSON patterns. We are especially concerned with '()' and 'new' - // because they can cause invocation, and '=' because it can cause mutation. - // But just to be safe, we want to reject all unexpected forms. - - // We split the second stage into 4 regexp operations in order to work around - // crippling inefficiencies in IE's and Safari's regexp engines. First we - // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we - // replace all simple value tokens with ']' characters. Third, we delete all - // open brackets that follow a colon or comma or that begin the text. Finally, - // we look to see that the remaining characters are only whitespace or ']' or - // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if ( - /^[\],:{}\s]*$/.test( - text - .replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") - .replace( - /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - "]" - ) - .replace(/(?:^|:|,)(?:\s*\[)+/g, "") - ) - ) { - // In the third stage we use the eval function to compile the text into a - // JavaScript structure. The '{' operator is subject to a syntactic ambiguity - // in JavaScript: it can begin a block or an object literal. We wrap the text - // in parens to eliminate the ambiguity. - - j = eval("(" + text + ")"); - - // In the optional fourth stage, we recursively walk the new structure, passing - // each name/value pair to a reviver function for possible transformation. - - return typeof reviver === "function" ? walk({ "": j }, "") : j; - } - - // If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError("JSON.parse"); - }; - } - })(); - - SocialCalc.oldBtnActive = 1; - SocialCalc.Constants.defaultImagePrefix = "www/assets/images/sc_"; - SocialCalc.Constants.defaultGridCSS = ""; - SocialCalc.Constants.SCNoColNames = true; - SocialCalc.Constants.SCNoRowName = true; - SocialCalc.Constants.defaultRownameStyle = ""; - SocialCalc.Constants.defaultSelectedRownameStyle = ""; - SocialCalc.Popup.imagePrefix = "www/assets/images/sc_"; - - SocialCalc.ToggleInputLineButtons = function (show) { - var bele = document.getElementById("testtest"); - if (!bele) return; - if (show) { - bele.style.display = "inline"; - } else { - bele.style.display = "none"; - } - }; - - SocialCalc.InputLineClearText = function () { - spreadsheet.editor.inputBox.SetText(""); - }; - - SocialCalc.Callbacks.broadcast = function (type, data) {}; - - // END OF FILE - - if ("undefined" === typeof document) { - // We don't really need a DOM-based presentation layer on the server - SocialCalc.GetEditorCellElement = function () {}; - SocialCalc.ReplaceCell = function () {}; - SocialCalc.EditorRenderSheet = function () {}; - SocialCalc.SpreadsheetControlSortSave = function () { - return ""; - }; - SocialCalc.SpreadsheetControlStatuslineCallback = function () {}; - SocialCalc.DoPositionCalculations = function (editor) { - SocialCalc.EditorSheetStatusCallback(null, "doneposcalc", null, editor); - }; - } - - // Compatibility with webworker-threads - if (typeof self !== "undefined" && self.thread) { - window.setTimeout = function (cb, ms) { - if (ms <= 1) { - self.thread.nextTick(cb); - } - }; - window.clearTimeout = function () {}; - } - - // Just return a value to define the module export. - return SocialCalc; -}); diff --git a/Govt-Billing-React-Ad-Subscriptions/src/components/socialcalc/index.js b/Govt-Billing-React-Ad-Subscriptions/src/components/socialcalc/index.js deleted file mode 100644 index f6bbca4..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/components/socialcalc/index.js +++ /dev/null @@ -1,502 +0,0 @@ -const SocialCalc = require("./aspiring/SocialCalc.js"); - -export function getDeviceType() { - /* Returns the type of the device */ - var device = "default"; - if (navigator.userAgent.match(/iPod/)) device = "iPod"; - if (navigator.userAgent.match(/iPad/)) device = "iPad"; - if (navigator.userAgent.match(/iPhone/)) device = "iPhone"; - if (navigator.userAgent.match(/Android/)) device = "Android"; - return device; -} - -export function initializeApp(data) { - /* Initializes the spreadsheet */ - - let tableeditor = document.getElementById("tableeditor"); - let spreadsheet = new SocialCalc.SpreadsheetControl(); - let workbook = new SocialCalc.WorkBook(spreadsheet); - workbook.InitializeWorkBook("sheet1"); - - spreadsheet.InitializeSpreadsheetControl(tableeditor, 0, 0, 0); - spreadsheet.ExecuteCommand("redisplay", ""); - - let workbookcontrol = new SocialCalc.WorkBookControl( - workbook, - "workbookControl", - "sheet1" - ); - workbookcontrol.InitializeWorkBookControl(); - // alert("app: "+JSON.stringify(data)); - SocialCalc.WorkBookControlLoad(data); - let ele = document.getElementById("te_griddiv"); - ele.style.height = "1600px"; - spreadsheet.DoOnResize(); -} - -export function activateFooterButton(index) { - /* Activates the sheet according to the index*/ - if (index === SocialCalc.oldBtnActive) return; - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheets = []; - for (var key in control.sheetButtonArr) { - //console.log(key); - sheets.push(key); - } - var spreadsheet = control.workbook.spreadsheet; - var ele = document.getElementById(spreadsheet.formulabarDiv.id); - if (ele) { - SocialCalc.ToggleInputLineButtons(false); - var input = ele.firstChild; - input.style.display = "none"; - spreadsheet.editor.state = "start"; - } - SocialCalc.WorkBookControlActivateSheet(sheets[index - 1]); - - SocialCalc.oldBtnActive = index; -} - -export function viewFile(filename, data) { - SocialCalc.WorkBookControlInsertWorkbook(data); - - SocialCalc.GetCurrentWorkBookControl().workbook.spreadsheet.editor.state = - "start"; - - SocialCalc.GetCurrentWorkBookControl().workbook.spreadsheet.ExecuteCommand( - "redisplay", - "" - ); - - window.setTimeout(function () { - SocialCalc.ScrollRelativeBoth( - SocialCalc.GetCurrentWorkBookControl().workbook.spreadsheet.editor, - 1, - 0 - ); - SocialCalc.ScrollRelativeBoth( - SocialCalc.GetCurrentWorkBookControl().workbook.spreadsheet.editor, - -1, - 0 - ); - }, 1000); -} - -export function getCSVContent() { - var val = SocialCalc.WorkBookControlSaveSheet(); - var workBookObject = JSON.parse(val); - var control = SocialCalc.GetCurrentWorkBookControl(); - var currentname = control.currentSheetButton.id; - var savestrr = workBookObject.sheetArr[currentname].sheetstr.savestr; - var res = SocialCalc.ConvertSaveToOtherFormat(savestrr, "csv", false); - return res; -} - -export function mustshowprompt(coord) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var editor = control.workbook.spreadsheet.editor; - var cellname = editor.workingvalues.currentsheet + "!" + editor.ecell.coord; - var constraint = SocialCalc.EditableCells.constraints[cellname]; - if (constraint) { - } - // for phone apps always show prompt - return true; -} - -export function getinputtype(coord) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var editor = control.workbook.spreadsheet.editor; - var cellname = editor.workingvalues.currentsheet + "!" + editor.ecell.coord; - var constraint = SocialCalc.EditableCells.constraints[cellname]; - if (constraint) { - } - return null; -} - -export function prompttype(coord) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var editor = control.workbook.spreadsheet.editor; - var cellname = editor.workingvalues.currentsheet + "!" + editor.ecell.coord; - var constraint = SocialCalc.EditableCells.constraints[cellname]; - - if (constraint) { - } - return null; -} - -export function showprompt(coord) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var editor = control.workbook.spreadsheet.editor; - var cellname = editor.workingvalues.currentsheet + "!" + editor.ecell.coord; - var constraint = SocialCalc.EditableCells.constraints[cellname]; - var highlights = editor.context.highlights; - - //alert(constraint); - var wval = editor.workingvalues; - if (wval.eccord) { - wval.ecoord = null; - console.log("return due to ecoord"); - return; - } - wval.ecoord = coord; - if (!coord) coord = editor.ecell.coord; - var text = SocialCalc.GetCellContents(editor.context.sheetobj, coord); - console.log("in prompt, coord = " + coord + " text=" + text); - - if ( - SocialCalc.Constants.SCNoQuoteInInputBox && - text.substring(0, 1) === "'" - ) { - text = text.substring(1); - } - console.log("continue..."); - - var cell = SocialCalc.GetEditorCellElement( - editor, - editor.ecell.row, - editor.ecell.col - ); - //alert(cell); - - /*var cancelfn = function() { - wval.ecoord = null; - delete highlights[editor.ecell.coord]; - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - - };*/ - - var okfn = function (val) { - var callbackfn = function () { - console.log("callback val " + val); - SocialCalc.EditorSaveEdit(editor, val); - }; - window.setTimeout(callbackfn, 100); - }; - - // highlight the cell - delete highlights[editor.ecell.coord]; - highlights[editor.ecell.coord] = "cursor"; - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - - var celltext = "Enter Value"; - var title = "Input"; - if (constraint) { - } else { - console.log("cell text is null"); - } - - var options = { title: title }; - - options["message"] = celltext; - console.log("text is " + text); - options["textvalue"] = text; - - function onPrompt(results) { - if (results.buttonIndex === 3) return; - else if (results.buttonIndex === 2) { - var onConfirm = function (buttonIndex) { - console.log(buttonIndex); - switch (buttonIndex) { - case 1: //do nothing - break; - case 2: - var onFontConfirm = function (fontIndex) { - switch (fontIndex) { - case 1: //do nothing - break; - case 2: - SocialCalc.EditorChangefontFromWidget(editor, "a"); - break; - case 3: - SocialCalc.EditorChangefontFromWidget(editor, "b"); - break; - case 4: - SocialCalc.EditorChangefontFromWidget(editor, "c"); - break; - case 5: - SocialCalc.EditorChangefontFromWidget(editor, "d"); - break; - default: - break; - } - }; - - navigator.notification.confirm( - "Customise cell options", // message - onFontConfirm, // callback to invoke with index of button pressed - "Customise", // title - ["Cancel", "Small:8pt", "Medium:12pt", "Big:14pt", "Large:16pt"] // buttonLabels - ); - break; - case 3: - var onColorConfirm = function (colorIndex) { - switch (colorIndex) { - case 1: //do nothing - break; - case 2: - SocialCalc.EditorChangecolorFromWidget(editor, "red"); - break; - case 3: - SocialCalc.EditorChangecolorFromWidget(editor, "yellow"); - break; - case 4: - SocialCalc.EditorChangecolorFromWidget(editor, "blue"); - break; - case 5: - SocialCalc.EditorChangecolorFromWidget(editor, "green"); - break; - case 6: - SocialCalc.EditorChangecolorFromWidget(editor, "purple"); - break; - case 7: - SocialCalc.EditorChangecolorFromWidget(editor, "black"); - break; - default: - break; - } - }; - - navigator.notification.confirm( - "Customise cell options", // message - onColorConfirm, // callback to invoke with index of button pressed - "Customise", // title - ["Cancel", "Red", "Yellow", "Blue", "Green", "Purple", "Black"] // buttonLabels - ); - break; - case 4: - editor.context.sheetobj.SheetUndo(); - break; - case 5: - editor.context.sheetobj.SheetRedo(); - break; - case 6: - SocialCalc.EditorCut(editor, "a"); - break; - case 7: - SocialCalc.EditorCut(editor, "b"); - break; - case 8: - SocialCalc.EditorCut(editor, "c"); - break; - case 9: - SocialCalc.EditorCut(editor, "d"); - break; - default: - break; - } - }; - navigator.notification.confirm( - "Customise cell options", // message - onConfirm, // callback to invoke with index of button pressed - "Customise", // title - [ - "Cancel", - "Font", - "Color", - "Undo", - "Redo", - "Cut", - "Copy", - "Paste", - "Clear", - ] // buttonLabels - ); - } else if (results.buttonIndex === 1) { - okfn(results.input1); - } - } - - navigator.notification.prompt( - "Enter value", // message - onPrompt, // callback to invoke - "Input", // title - ["Ok", "Customise", "Cancel"], // buttonLabels - "" + text + "" // defaultText - ); - - return true; -} - -export function getSpreadsheetContent() { - return SocialCalc.WorkBookControlSaveSheet(); -} - -export function getCurrentHTMLContent() { - var control = SocialCalc.GetCurrentWorkBookControl(); - return control.workbook.spreadsheet.CreateSheetHTML(); -} - -export function getAllHTMLContent(sheetdata) { - var appsheets = {}; - // var control = SocialCalc.GetCurrentWorkBookControl(); - - for (var i = 1; i <= sheetdata.numsheets; i++) { - var key = "sheet" + i; - appsheets[key] = key; - } - - return SocialCalc.WorkbookControlCreateSheetHTML(appsheets); -} - -export function saveAs() { - return new Promise(function (resolve, reject) { - navigator.notification.prompt( - "Please enter the filename", // message - function (results) { - if (results.buttonIndex === 2) { - resolve(results.input1); - } - }, // callback to invoke - "Save as", // title - ["Cancel", "Save"], // buttonLabels - "" // defaultText - ); - }); -} - -export function getAllOldFiles() { - return new Promise(function (resolve, reject) { - var files = {}; - - for (var i = 0; i < window.localStorage.length; i++) { - if (window.localStorage.key(i).length >= 30) continue; - var filename = window.localStorage.key(i); - - if (filename === "logoArray") continue; - if (filename === "inapp") continue; - if (filename === "sound") continue; - if (filename === "cloudInapp") continue; - if (filename === "inapplocal") continue; - if (filename === "inappPurchase") continue; - if (filename === "flag") continue; - if (filename === "share") continue; - if (filename === "cellArray") continue; - if (filename === "sk_receiptForProduct") continue; - if (filename === "sk_receiptForTransaction") continue; - if ( - filename === "didTutorial" || - filename === "customise" || - filename === "rename" || - filename === "choice" - ) - continue; - /// console.log(filename); - var filedata = decodeURIComponent(window.localStorage.getItem(filename)); - - files[filename] = filedata; - } - // console.log(files); - resolve(files); - }); -} - -export function deleteAllOldFiles(files) { - return new Promise(function (resolve, reject) { - for (var i in files) { - console.log("Removing.." + i); - window.localStorage.removeItem(i); - } - resolve(true); - }); -} - -export function addLogo(coord, url) { - return new Promise(function (resolve, reject) { - console.log(url); - - var control = SocialCalc.GetCurrentWorkBookControl(); - var currsheet = control.currentSheetButton.id; - // var editor = control.workbook.spreadsheet.editor; - - var cmd = ""; - for (var sheetname in coord) { - if (coord[sheetname] !== null) { - if (currsheet === sheetname) { - console.log(sheetname + " ," + coord[sheetname]); // eslint-disable-next-line - cmd = - "set " + - coord[sheetname] + - ' text t ' + - "\n"; - cmd = { - cmdtype: "scmd", - id: currsheet, - cmdstr: cmd, - saveundo: false, - }; - control.ExecuteWorkBookControlCommand(cmd, false); - } - } - } - resolve(true); - }); -} - -export function removeLogo(coord) { - return new Promise(function (resolve, reject) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var currsheet = control.currentSheetButton.id; - // var editor = control.workbook.spreadsheet.editor; - - var cmd = ""; - for (var sheetname in coord) { - if (coord[sheetname] !== null) { - if (currsheet === sheetname) { - console.log(sheetname + " ," + coord[sheetname]); - cmd = "erase " + coord[sheetname] + " formulas"; - cmd = { - cmdtype: "scmd", - id: currsheet, - cmdstr: cmd, - saveundo: false, - }; - control.ExecuteWorkBookControlCommand(cmd, false); - } - } - } - resolve(true); - }); -} - -export function undo() { - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert('control are'+control); - var editor = control.workbook.spreadsheet.editor; - editor.context.sheetobj.SheetUndo(); -} - -export function redo() { - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert('control are'+control); - var editor = control.workbook.spreadsheet.editor; - editor.context.sheetobj.SheetRedo(); -} - -export function getCurrentSheet() { - return SocialCalc.GetCurrentWorkBookControl().currentSheetButton.id; -} - -export function changeSheetColor(name) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var editor = control.workbook.spreadsheet.editor; - - name = name.toLowerCase(); - //console.log("changing sheet color to: "+name); - SocialCalc.EditorChangeSheetcolor(editor, name); -} - -export function changeFontSheet(cmdline) { - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert('control are'+control); - var editor = control.workbook.spreadsheet.editor; - editor.EditorScheduleSheetCommands(cmdline, true, false); -} - -export function executeCommand(cmdline) { - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert('control are'+control); - var editor = control.workbook.spreadsheet.editor; - editor.EditorScheduleSheetCommands(cmdline, true, false); -} diff --git a/Govt-Billing-React-Ad-Subscriptions/src/components/socialcalc/package.json b/Govt-Billing-React-Ad-Subscriptions/src/components/socialcalc/package.json deleted file mode 100644 index 9b7a147..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/components/socialcalc/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "socialcalc", - "version": "1.0.0", - "description": "socialcalc npm module", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [ - "socialcalc", - "spreadsheet", - "javascript" - ], - "author": "Mini Bhati", - "license": "MIT" -} diff --git a/Govt-Billing-React-Ad-Subscriptions/src/firebase/auth.ts b/Govt-Billing-React-Ad-Subscriptions/src/firebase/auth.ts deleted file mode 100644 index d279b5c..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/firebase/auth.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { - createUserWithEmailAndPassword, - signInWithEmailAndPassword, - signOut, -} from "firebase/auth"; -import { auth } from "./index"; -import { initializeUserSubscription, subscriptionTiers } from "./firestore"; - -const signUpWithEmailAndPassword = async ( - email: string, - password: string, - tier: keyof typeof subscriptionTiers -) => { - try { - const userCredential = await createUserWithEmailAndPassword( - auth, - email, - password - ); - const user = userCredential.user; - - await initializeUserSubscription(user.uid, tier); - - return user; - } catch (error) { - const errorCode = error.code; - const errorMessage = error.message; - alert(errorMessage); - console.error(`${errorCode} - ${errorMessage}`); - } -}; - -const loginWithEmailPassword = async (email: string, password: string) => { - try { - const userCredential = await signInWithEmailAndPassword( - auth, - email, - password - ); - const user = userCredential.user; - return user; - } catch (error) { - const errorCode = error.code; - const errorMessage = error.message; - alert(errorMessage); - console.error(`${errorCode} - ${errorMessage}`); - } -}; - -const logOut = async () => { - try { - await signOut(auth); - } catch (error) { - const errorCode = error.code; - const errorMessage = error.message; - alert(errorMessage); - console.error(`${errorCode} - ${errorMessage}`); - } -}; -export { signUpWithEmailAndPassword, logOut, loginWithEmailPassword }; diff --git a/Govt-Billing-React-Ad-Subscriptions/src/firebase/firestore.ts b/Govt-Billing-React-Ad-Subscriptions/src/firebase/firestore.ts deleted file mode 100644 index cbe038c..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/firebase/firestore.ts +++ /dev/null @@ -1,226 +0,0 @@ -import { User } from "firebase/auth"; -import { db } from "./index"; -import { - doc, - setDoc, - getDocs, - collection, - query, - where, - getDoc, - deleteDoc, - updateDoc, -} from "firebase/firestore"; -import { Local } from "../components/Storage/LocalStorage"; - -interface File { - created: string; - modified: string; - name: string; - content: string; - billType: number; -} - -const uploadFileToCloud = async ( - user: User, - fileData: File, - onSuccess?: Function -) => { - try { - const prevFile = await getDoc( - doc(db, "invoices", `${user.uid}-${fileData.name}`) - ); - if (prevFile.exists()) { - alert("File With the same name exists"); - const newName = prompt("Enter New Name for File"); - if (!newName) { - alert("Name Cannot be empty"); - return; - } - const prevFile = await getDoc( - doc(db, "invoices", `${user.uid}-${newName}`) - ); - if (prevFile.exists()) { - alert("File With the same name exists"); - return; - } - fileData.name = newName; - await setDoc(doc(db, "invoices", `${user.uid}-${newName}`), { - ...fileData, - owner: user.uid, - }); - } - await setDoc(doc(db, "invoices", `${user.uid}-${fileData.name}`), { - ...fileData, - owner: user.uid, - }); - if (onSuccess) onSuccess(); - } catch (e) { - alert(e.message); - console.error(e.message); - } -}; - -const getFilesKeysFromFirestore = async (userid: string) => { - const q = query(collection(db, "invoices"), where("owner", "==", userid)); - const querySnapshot = await getDocs(q); - if (querySnapshot.empty) { - return {}; - } - const files = {}; - querySnapshot.forEach((doc) => { - const data = doc.data(); - files[data.name] = data.modified; - }); - return files; -}; - -const downloadFileFromFirebase = async (userId, key, onSuccess) => { - try { - const local = new Local(); - const getFile = async () => { - const docSnapshot = await getDoc(doc(db, "invoices", `${userId}-${key}`)); - const data = docSnapshot.data(); - delete data["owner"]; - return data; - }; - - const localFile = await local._getFile(key); - let option; - if (localFile) { - option = confirm( - "File With Same Name Exists in Local Storage, Press OK to override and Cancel to Get a New Name" - ); - } - if (option || !localFile) { - const file = await getFile(); - local._saveFile(file as File); - alert("File Downloaded"); - onSuccess && onSuccess(); - return; - } - - if (!option) { - const newName = prompt("Enter New Name for File"); - if (!newName) { - alert("Name Cannot be empty"); - return; - } - const localFile = await local._getFile(newName); - if (localFile) { - alert("File With This Name Also Exists"); - return; - } - const file = await getFile(); - file.name = newName; - local._saveFile(file as File); - alert("File Downloaded"); - onSuccess && onSuccess(); - } - } catch { - alert("Something Went Wrong"); - } -}; -const deleteFileFromFirebase = async (userId, key, onSuccess) => { - try { - await deleteDoc(doc(db, "invoices", `${userId}-${key}`)); - alert("File Deleted"); - onSuccess && onSuccess(); - } catch { - alert("Something went wrong"); - } -}; -const subscriptionTiers = { - bronze: { prints: 10, emails: 10, price: 150 }, - silver: { prints: 20, emails: 20, price: 200 }, - gold: { prints: 30, emails: 30, price: 250 }, -}; - -interface UserSubscription { - tier: keyof typeof subscriptionTiers; - remainingPrints: number; - remainingEmails: number; - expirationDate: Date; -} - -const getUserSubscription = async ( - userId: string -): Promise => { - const docRef = doc(db, "subscriptions", userId); - const docSnap = await getDoc(docRef); - - if (docSnap.exists()) { - return docSnap.data() as UserSubscription; - } else { - console.log("No subscription found for this user"); - return null; - } -}; - -const initializeUserSubscription = async ( - userId: string, - tier: keyof typeof subscriptionTiers -) => { - const subscriptionData: UserSubscription = { - tier, - remainingPrints: subscriptionTiers[tier].prints, - remainingEmails: subscriptionTiers[tier].emails, - expirationDate: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), // 30 days from now - }; - - await setDoc(doc(db, "subscriptions", userId), subscriptionData); -}; - -const updateUserQuota = async ( - userId: string, - action: "print" | "email" -): Promise => { - const subscription = await getUserSubscription(userId); - if (!subscription) return false; - - const quotaField = action === "print" ? "remainingPrints" : "remainingEmails"; - if (subscription[quotaField] > 0) { - await updateDoc(doc(db, "subscriptions", userId), { - [quotaField]: subscription[quotaField] - 1, - }); - return true; - } - return false; -}; - -const canUserPerformAction = async ( - userId: string, - action: "print" | "email" -): Promise => { - const subscription = await getUserSubscription(userId); - if (!subscription) return false; - - const quotaField = action === "print" ? "remainingPrints" : "remainingEmails"; - return subscription[quotaField] > 0; -}; - -const updateUserSubscription = async (userId: string, tier: string) => { - const subscriptionData = { - tier, - remainingPrints: subscriptionTiers[tier].prints, - remainingEmails: subscriptionTiers[tier].emails, - expirationDate: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), // 30 days from now - }; - - await setDoc(doc(db, "subscriptions", userId), subscriptionData, { - merge: true, - }); -}; - -export { - uploadFileToCloud, - getFilesKeysFromFirestore, - downloadFileFromFirebase, - deleteFileFromFirebase, - getUserSubscription, - updateUserQuota, - canUserPerformAction, - initializeUserSubscription, - subscriptionTiers, - updateUserSubscription, -}; diff --git a/Govt-Billing-React-Ad-Subscriptions/src/firebase/index.ts b/Govt-Billing-React-Ad-Subscriptions/src/firebase/index.ts deleted file mode 100644 index b47a0ed..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/firebase/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { FirebaseApp, initializeApp } from "firebase/app"; -import { Auth, getAuth } from "firebase/auth"; -import { Firestore, getFirestore } from "firebase/firestore"; - -const firebaseConfig = { - apiKey: import.meta.env.VITE_FIREBASE_API_KEY, - authDomain: import.meta.env.VITE_FIREBASE_AUTH_DOMAIN, - projectId: import.meta.env.VITE_FIREBASE_PROJECT_ID, - storageBucket: import.meta.env.VITE_FIREBASE_STORAGE_BUCKET, - messagingSenderId: import.meta.env.VITE_FIREBASE_MESSAGING_SENDER_ID, - appId: import.meta.env.VITE_FIREBASE_APP_ID, -}; - -let app: FirebaseApp, auth: Auth, db: Firestore; - -const initFirebase = () => { - if (!app) { - app = initializeApp(firebaseConfig); - } - if (!auth) { - auth = getAuth(app); - } - if (!db) { - db = getFirestore(app); - } -}; - -export { initFirebase, app, auth, db }; diff --git a/Govt-Billing-React-Ad-Subscriptions/src/hooks/useUser.tsx b/Govt-Billing-React-Ad-Subscriptions/src/hooks/useUser.tsx deleted file mode 100644 index e7379fe..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/hooks/useUser.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { auth } from "../firebase"; -import { User } from "firebase/auth"; - -export default function useUser() { - const [user, setUser] = useState(null); - const [isLoading, setIsLoading] = useState(true); - - const handleUser = (user: User) => { - if (user) { - setUser(user); - } else { - setUser(null); - } - - setIsLoading(false); - }; - useEffect(() => { - const unsubscribe = auth.onIdTokenChanged(handleUser); - return () => unsubscribe(); - }, []); - - return { user, isLoading }; -} diff --git a/Govt-Billing-React-Ad-Subscriptions/src/main.tsx b/Govt-Billing-React-Ad-Subscriptions/src/main.tsx deleted file mode 100644 index fbff6c8..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/main.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; -import { createRoot } from 'react-dom/client'; -import App from './App'; - -const container = document.getElementById('root'); -const root = createRoot(container!); -root.render( - - - -); \ No newline at end of file diff --git a/Govt-Billing-React-Ad-Subscriptions/src/pages/Home.css b/Govt-Billing-React-Ad-Subscriptions/src/pages/Home.css deleted file mode 100644 index c9bdc35..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/pages/Home.css +++ /dev/null @@ -1,4 +0,0 @@ -#container { - height: min-content; - overflow: hidden; -} diff --git a/Govt-Billing-React-Ad-Subscriptions/src/pages/Home.tsx b/Govt-Billing-React-Ad-Subscriptions/src/pages/Home.tsx deleted file mode 100644 index 7c03638..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/pages/Home.tsx +++ /dev/null @@ -1,193 +0,0 @@ -import { - IonButton, - IonContent, - IonFab, - IonFabButton, - IonHeader, - IonIcon, - IonPage, - IonPopover, - IonTitle, - IonToolbar, - isPlatform, -} from "@ionic/react"; -import { APP_NAME, DATA } from "../app-data"; -import Login from "../components/Login/Login"; -import * as AppGeneral from "../components/socialcalc/index.js"; -import { useEffect, useState } from "react"; -import { Local } from "../components/Storage/LocalStorage"; -import { cloudOffline, menu, settings, statsChart } from "ionicons/icons"; -import "./Home.css"; -import Menu from "../components/Menu/Menu"; -import Files from "../components/Files/Files"; -import NewFile from "../components/NewFile/NewFile"; -import { initFirebase } from "../firebase/index"; -import { - AdMob, - BannerAdOptions, - BannerAdPosition, - BannerAdSize, -} from "@capacitor-community/admob"; - -const Home: React.FC = () => { - const [showMenu, setShowMenu] = useState(false); - const [showPopover, setShowPopover] = useState<{ - open: boolean; - event: Event | undefined; - }>({ open: false, event: undefined }); - const [selectedFile, updateSelectedFile] = useState("default"); - const [billType, updateBillType] = useState(1); - const [device] = useState("default"); - - initFirebase(); - - const initAdmob = async () => { - const { status } = await AdMob.trackingAuthorizationStatus(); - AdMob.initialize({ - initializeForTesting: true, - }); - }; - - const showBanner = async () => { - await initAdmob(); - const options: BannerAdOptions = { - adId: isPlatform("ios") - ? process.env.IOS_AD_ID - : process.env.ANDROID_AD_ID, - adSize: BannerAdSize.ADAPTIVE_BANNER, - position: BannerAdPosition.TOP_CENTER, - margin: 0, - isTesting: true, - }; - - await AdMob.showBanner(options); - }; - useEffect(() => { - showBanner(); - }, []); - - const store = new Local(); - - const closeMenu = () => { - setShowMenu(false); - }; - - const activateFooter = (footer) => { - AppGeneral.activateFooterButton(footer); - }; - - useEffect(() => { - const data = DATA["home"][device]["msc"]; - AppGeneral.initializeApp(JSON.stringify(data)); - }, []); - - useEffect(() => { - activateFooter(billType); - }, [billType]); - - const footers = DATA["home"][device]["footers"]; - const footersList = footers.map((footerArray) => { - return ( - { - updateBillType(footerArray.index); - activateFooter(footerArray.index); - setShowPopover({ open: false, event: undefined }); - }} - > - {footerArray.name} - - ); - }); - - return ( - - - - {APP_NAME} - - - - - - - { - setShowPopover({ open: true, event: e.nativeEvent }); - console.log("Popover clicked"); - }} - /> - - - - - - setShowPopover({ open: false, event: undefined }) - } - > - {footersList} - - - - - Editing : {selectedFile} - - - - - setShowMenu(true)}> - - - - -
    - -
    -
    -
    -
    -
    - - - ); -}; - -export default Home; diff --git a/Govt-Billing-React-Ad-Subscriptions/src/theme/variables.css b/Govt-Billing-React-Ad-Subscriptions/src/theme/variables.css deleted file mode 100644 index e70de17..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/theme/variables.css +++ /dev/null @@ -1,83 +0,0 @@ -/* Ionic Variables and Theming. For more info, please see: -http://ionicframework.com/docs/theming/ */ - -/** Ionic CSS Variables **/ -:root { - /** primary **/ - --ion-color-primary: #3880ff; - --ion-color-primary-rgb: 56, 128, 255; - --ion-color-primary-contrast: #ffffff; - --ion-color-primary-contrast-rgb: 255, 255, 255; - --ion-color-primary-shade: #3171e0; - --ion-color-primary-tint: #4c8dff; - - /** secondary **/ - --ion-color-secondary: #3dc2ff; - --ion-color-secondary-rgb: 61, 194, 255; - --ion-color-secondary-contrast: #ffffff; - --ion-color-secondary-contrast-rgb: 255, 255, 255; - --ion-color-secondary-shade: #36abe0; - --ion-color-secondary-tint: #50c8ff; - - /** tertiary **/ - --ion-color-tertiary: #5260ff; - --ion-color-tertiary-rgb: 82, 96, 255; - --ion-color-tertiary-contrast: #ffffff; - --ion-color-tertiary-contrast-rgb: 255, 255, 255; - --ion-color-tertiary-shade: #4854e0; - --ion-color-tertiary-tint: #6370ff; - - /** success **/ - --ion-color-success: #2dd36f; - --ion-color-success-rgb: 45, 211, 111; - --ion-color-success-contrast: #ffffff; - --ion-color-success-contrast-rgb: 255, 255, 255; - --ion-color-success-shade: #28ba62; - --ion-color-success-tint: #42d77d; - - /** warning **/ - --ion-color-warning: #ffc409; - --ion-color-warning-rgb: 255, 196, 9; - --ion-color-warning-contrast: #000000; - --ion-color-warning-contrast-rgb: 0, 0, 0; - --ion-color-warning-shade: #e0ac08; - --ion-color-warning-tint: #ffca22; - - /** danger **/ - --ion-color-danger: #eb445a; - --ion-color-danger-rgb: 235, 68, 90; - --ion-color-danger-contrast: #ffffff; - --ion-color-danger-contrast-rgb: 255, 255, 255; - --ion-color-danger-shade: #cf3c4f; - --ion-color-danger-tint: #ed576b; - - /** dark **/ - --ion-color-dark: #222428; - --ion-color-dark-rgb: 34, 36, 40; - --ion-color-dark-contrast: #ffffff; - --ion-color-dark-contrast-rgb: 255, 255, 255; - --ion-color-dark-shade: #1e2023; - --ion-color-dark-tint: #383a3e; - - /** medium **/ - --ion-color-medium: #92949c; - --ion-color-medium-rgb: 146, 148, 156; - --ion-color-medium-contrast: #ffffff; - --ion-color-medium-contrast-rgb: 255, 255, 255; - --ion-color-medium-shade: #808289; - --ion-color-medium-tint: #9d9fa6; - - /** light **/ - --ion-color-light: #f4f5f8; - --ion-color-light-rgb: 244, 245, 248; - --ion-color-light-contrast: #000000; - --ion-color-light-contrast-rgb: 0, 0, 0; - --ion-color-light-shade: #d7d8da; - --ion-color-light-tint: #f5f6f9; -} - -html { - /* For more information on dynamic font scaling, visit the documentation: - https://ionicframework.com/docs/layout/dynamic-font-scaling */ - --ion-dynamic-font: var(--ion-default-dynamic-font); -} diff --git a/Govt-Billing-React-Ad-Subscriptions/src/vite-env.d.ts b/Govt-Billing-React-Ad-Subscriptions/src/vite-env.d.ts deleted file mode 100644 index eecb811..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/src/vite-env.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -/// - -interface ImportMetaEnv { - readonly VITE_FIREBASE_VITE_APP_TITLE: string; - readonly VITE_FIREBASE_API_KEY: string; - readonly VITE_FIREBASE_AUTH_DOMAIN: string; - readonly VITE_FIREBASE_PROJECT_ID: string; - readonly VITE_FIREBASE_STORAGE_BUCKET: string; - readonly VITE_FIREBASE_MESSAGING_SENDER_ID: string; - readonly VITE_FIREBASE_APP_ID: string; -} - -interface ImportMeta { - readonly env: ImportMetaEnv; -} diff --git a/Govt-Billing-React-Ad-Subscriptions/tsconfig.json b/Govt-Billing-React-Ad-Subscriptions/tsconfig.json deleted file mode 100644 index 7b0213a..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "allowJs": true, - "skipLibCheck": true, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, - "strict": false, - "forceConsistentCasingInFileNames": true, - "module": "ESNext", - "moduleResolution": "Node", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx" - }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] -} diff --git a/Govt-Billing-React-Ad-Subscriptions/tsconfig.node.json b/Govt-Billing-React-Ad-Subscriptions/tsconfig.node.json deleted file mode 100644 index 9d31e2a..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/tsconfig.node.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "module": "ESNext", - "moduleResolution": "Node", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/Govt-Billing-React-Ad-Subscriptions/vite.config.ts b/Govt-Billing-React-Ad-Subscriptions/vite.config.ts deleted file mode 100644 index 860227d..0000000 --- a/Govt-Billing-React-Ad-Subscriptions/vite.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import legacy from "@vitejs/plugin-legacy"; -import react from "@vitejs/plugin-react"; -import { defineConfig } from "vite"; -import commonjs from "vite-plugin-commonjs"; -import { VitePWA } from "vite-plugin-pwa"; - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - react(), - legacy(), - commonjs(), - VitePWA({ registerType: "autoUpdate" }), - ], -}); diff --git a/Govt-Billing-React/src/firebase/firestore.ts b/Govt-Billing-React/src/firebase/firestore.ts index bf8cd1b..71bce6c 100644 --- a/Govt-Billing-React/src/firebase/firestore.ts +++ b/Govt-Billing-React/src/firebase/firestore.ts @@ -36,10 +36,10 @@ const uploadFileToCloud = async ( alert("Name Cannot be empty"); return; } - const prevFile = await getDoc( + const prevFileWithNewName = await getDoc( doc(db, "invoices", `${user.uid}-${newName}`) ); - if (prevFile.exists()) { + if (prevFileWithNewName.exists()) { alert("File With the same name exists"); return; } @@ -48,6 +48,10 @@ const uploadFileToCloud = async ( ...fileData, owner: user.uid, }); + // FIX 1: Added return here. Previously the code fell through and + // saved the file a second time under the original duplicate name. + if (onSuccess) onSuccess(); + return; } await setDoc(doc(db, "invoices", `${user.uid}-${fileData.name}`), { ...fileData, @@ -78,7 +82,9 @@ const downloadFileFromFirebase = async (userId, key, onSuccess) => { try { const local = new Local(); const getFile = async () => { - const docSnapshot = await getDoc(doc(db, "invoices", `${userId}-${key}`)); + const docSnapshot = await getDoc( + doc(db, "invoices", `${userId}-${key}`) + ); const data = docSnapshot.data(); delete data["owner"]; return data; @@ -93,7 +99,10 @@ const downloadFileFromFirebase = async (userId, key, onSuccess) => { } if (option || !localFile) { const file = await getFile(); - local._saveFile(file as File); + // FIX 2: Added await here. Previously _saveFile() was called without + // await, so the save started but did not finish before the success + // callback fired, causing silent save failures. + await local._saveFile(file as File); alert("File Downloaded"); onSuccess && onSuccess(); return; @@ -112,7 +121,8 @@ const downloadFileFromFirebase = async (userId, key, onSuccess) => { } const file = await getFile(); file.name = newName; - local._saveFile(file as File); + // FIX 3: Added await here for the same reason as Fix 2. + await local._saveFile(file as File); alert("File Downloaded"); onSuccess && onSuccess(); } @@ -120,6 +130,7 @@ const downloadFileFromFirebase = async (userId, key, onSuccess) => { alert("Something Went Wrong"); } }; + const deleteFileFromFirebase = async (userId, key, onSuccess) => { try { await deleteDoc(doc(db, "invoices", `${userId}-${key}`)); @@ -135,4 +146,4 @@ export { getFilesKeysFromFirestore, downloadFileFromFirebase, deleteFileFromFirebase, -}; +}; \ No newline at end of file diff --git a/OP-RetroPGF.md b/OP-RetroPGF.md deleted file mode 100644 index 5f7dfd7..0000000 --- a/OP-RetroPGF.md +++ /dev/null @@ -1,16 +0,0 @@ -## Github Metrics Summary for Optimism RetroPGF - -Please visit Summary of Github Activity and Metrics for Optimism RetroPGF at https://drive.google.com/drive/folders/1dxOKh33RoJ0jQs5_wm_inwXT2yUg_sDn?usp=drive_link - -Vercel Deployment: https://invoice-ppt-op-mainnet.vercel.app/ - -More Details at https://docs.google.com/document/d/1Rj7RHm_Tog29JU0Hy9DL21lmyK6fj2Latu3OjvFaNg8/edit?usp=sharing - - -#### Supporting Links - -Screencast, Demo and Documentation: https://drive.google.com/drive/u/5/folders/1esP7W1uxkx2mK7eIDC0tY8Cx3VhzwhQS - -Medical Invoice DApp contract deployment: https://optimistic.etherscan.io/address/0x49009CD05805ce571DcE7b577677F73B5828aB53#code - -PPT Token Contract Deployment: https://optimistic.etherscan.io/address/0xc76F004CB35ec0971075060D4DBd6279d2252Acf#code diff --git a/README.md b/README.md deleted file mode 100644 index 8c6f929..0000000 --- a/README.md +++ /dev/null @@ -1,80 +0,0 @@ - - -# About - -Public Goods Initiative to improve transparency and security in procurement and supply of goods at government institutions - -## Invoice and Billing system for Government Universities - -Web3 Billing and Invoicing System on ios, android or as a PWA. - - -### PPT Medical Invoice DApp – Empowering Healthcare on Filecoin, Ethereum, Arbitrum, Starknet, Base and Optimism - -PPT Utility Token Deployment in Medical Invoice DApp - -We have deployed the PPT utility token on the Optimism (OP) Mainnet to power key functions within our Medical Invoice DApp: - -✅ Save: Securely save medical invoices on-chain using PPT tokens, ensuring data integrity and long-term availability. - -✅ Save As: Create multiple versions of invoices for different stakeholders while maintaining data consistency. - -✅ Print: Generate and print invoices securely, ensuring authenticity and alignment with on-chain records. - -#### Impact - -By leveraging Filecoin and Optimism's low-cost and high-speed transaction capabilities, the DApp reduces administrative costs, enhances transparency, and empowers patients with control over their medical data. - - -# OSS Contributors, PGF Volunteers - -Problem Statement - Develop a cross platform ios, Android or PWA application using hybrid frameworks like ionic, react native, flutter, native script or Appgyer framework for the project "Billing and Invoicing system for Government schools/ Private schools" using the project repository: https://github.com/seetadev/GovtInvoice. You may use the web version and convert it to a deep linking mobile project using the google drive link: https://drive.google.com/file/d/1BcPLWBuTlax2dZoebw7P_dAePuYXiE2Q/view?usp=drive_link (please comment the AWS-SDK component). The further objectives of the project: - -1. Save to Filecoin and IPFS or cloud feature: Please find the screenshots attached for a workflow which is documented for dropbox on ionic angular. You could use Filecoin and IPFS or firebase or AWS with ionic react if you wish. Please visit https://drive.google.com/drive/u/2/folders/1ORr1D9dQifuX-fkRux49ZDnu1_u7oAJE - -2. Export as .html or CSV using the email plugin feature to email the worksheet selected. Please -use the plugin like https://github.com/EinfachHans/capacitor-email-composer - -3. Integrate atleast 3 community plugins of your choice from https://capacitorjs.com/docs/plugins/community into the Billing and Invoicing system. - -# Developer Templates using Ionic React and Angular - -Ionic React version: https://github.com/seetadev/GovtInvoice/tree/main/Govt-Billing-React - -Ionic Angular version: https://github.com/seetadev/GovtInvoice/tree/main/Govt-Billing-Angular - -# Learning Resources for Ionic React: -Getting Started: https://ionicframework.com/react -1. https://www.youtube.com/watch?v=xn-qpnT2n3Q -2. https://www.youtube.com/watch?v=WugT638KS3Q&list=PLYxzS__5yYQlhvyLXSKhv4oAvl06MInSE -3. https://www.youtube.com/watch?v=K7ghUiXLef8 -4. https://www.youtube.com/watch?v=-aHBhvkrFlY -5. https://github.com/ionic-team/ionic-react-conference-app -6. https://stackblitz.com/edit/ionic-react-demo?file=index.js - -# Learning Resources for Ionic Angular: - -Summary of development resources: -https://ionic.io/community#section-education -https://thinkster.io/ionic-framework-tutorial -https://www.w3schools.com/ -http://ccoenraets.github.io/ionic-tutorial/ - -Concepts: -https://ionicframework.com/docs -https://ionicframework.com/community#section-education -https://www.w3schools.com/ - -Joshua Morony, Open Source Expert -https://www.joshmorony.com -https://www.youtube.com/user/LittlejTFS -https://github.com/joshuamorony - -More resources -https://www.pluralsight.com/blog/software-development/ionic-framework-on-mac-and-windows -http://mcgivery.com/100-ionic-framework-resources/ - - -# Platform Tools needed: -Computer with Linux, Windows or Mac OS. In case windows, please install git-bash. -Testing Device: Smartphone with Android or ios diff --git a/Website/.env.example b/Website/.env.example deleted file mode 100644 index d20bc3d..0000000 --- a/Website/.env.example +++ /dev/null @@ -1,11 +0,0 @@ -SECRET_KEY= -MYSQL_HOST= -MYSQL_DATABASE= -MYSQL_USER= -MYSQL_PASSWORD= -SQLALCHEMY_DATABASE_URI= -SQLALCHEMY_TRACK_MODIFICATIONS= -APP_TITLE= -AWS_ACCESS_KEY_ID= -AWS_SECRET_ACCESS_KEY= -S3_BUCKET_NAME= \ No newline at end of file diff --git a/Website/.gitignore b/Website/.gitignore deleted file mode 100644 index 68117ba..0000000 --- a/Website/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -env/ -.env - -.DS_Store - -__pycache__/ \ No newline at end of file diff --git a/Website/.python-version b/Website/.python-version deleted file mode 100644 index 1635d0f..0000000 --- a/Website/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.9.6 diff --git a/Website/Readme.md b/Website/Readme.md deleted file mode 100644 index 655e1ff..0000000 --- a/Website/Readme.md +++ /dev/null @@ -1,123 +0,0 @@ -# Flask Application README - -## Prerequisites -Before running this Flask application, ensure you have the following installed on your system: -- Python (3.x recommended) -- pip (Python package installer) -- virtualenv (for creating isolated Python environments) -- PHP (for import/export feature) -- Composer (for import/export feature) - -## Setup Instructions - -### For Windows - -1. **Install virtualenv (if not installed)**: - Open Command Prompt and run: - ```bash - pip install virtualenv - ``` - -2. **Install PHP and Composer**: - - Download PHP from [php.net](https://www.php.net/downloads). - - Install Composer by following the instructions on [getcomposer.org](https://getcomposer.org/download/). - -3. **Clone the repository**: - ```bash - git clone https://github.com/ManasMadan/c4gt-website.git - cd c4gt-website - ``` - -4. **Install PHP dependencies for excelinterop**: - Navigate to the `excelinterop` directory and run: - ```bash - cd excelinterop - composer install - cd .. - ``` - -5. **Create a new virtual environment**: - ```bash - venv env - ``` - -6. **Activate the virtual environment**: - ```bash - .\env\Scripts\activate - ``` - -7. **Install Python dependencies**: - ```bash - pip install -r requirements.txt - ``` - -8. **Configure environment variables**: - Create a `.env` file in the root directory of the project and add the required variables. You can use the provided `.env.example` file as a reference: - ```bash - cp .env.example .env - ``` - -9. **Run the application**: - ```bash - python main.py - ``` - -10. Access the application in your web browser at `http://127.0.0.1:5000`. - -### For Mac/Linux - -1. **Install virtualenv (if not installed)**: - Open Terminal and run: - ```bash - pip3 install virtualenv - ``` - -2. **Install PHP and Composer**: - - Download PHP from [php.net](https://www.php.net/downloads). - - Install Composer by following the instructions on [getcomposer.org](https://getcomposer.org/download/). - -3. **Clone the repository**: - ```bash - git clone https://github.com/ManasMadan/c4gt-website.git - cd c4gt-website - ``` - -4. **Install PHP dependencies for excelinterop**: - Navigate to the `excelinterop` directory and run: - ```bash - cd excelinterop - composer install - cd .. - ``` - -5. **Create a new virtual environment**: - ```bash - python3 -m venv env - ``` - -6. **Activate the virtual environment**: - ```bash - source env/bin/activate - ``` - -7. **Install Python dependencies**: - ```bash - pip3 install -r requirements.txt - ``` - -8. **Configure environment variables**: - Create a `.env` file in the root directory of the project and add the required variables. You can use the provided `.env.example` file as a reference: - ```bash - cp .env.example .env - ``` - -9. **Run the application**: - ```bash - python3 main.py - ``` - -10. Access the application in your web browser at `http://127.0.0.1:5000`. - -## Additional Notes - -- If you encounter any issues during installation or execution, please refer to the official documentation for [Flask](https://flask.palletsprojects.com/) and ensure all prerequisites are correctly installed. \ No newline at end of file diff --git a/Website/cloud/authenticate/__init__.py b/Website/cloud/authenticate/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/Website/cloud/authenticate/authenticate.py b/Website/cloud/authenticate/authenticate.py deleted file mode 100644 index d3dd673..0000000 --- a/Website/cloud/authenticate/authenticate.py +++ /dev/null @@ -1,11 +0,0 @@ -""" -Cloud Authentication -""" - -def authenticateUser(username, userpassword): - pass - -def getUserData(token): - pass - - diff --git a/Website/cloud/authenticate/user.py b/Website/cloud/authenticate/user.py deleted file mode 100644 index b631c39..0000000 --- a/Website/cloud/authenticate/user.py +++ /dev/null @@ -1,136 +0,0 @@ -# -# -# Model of a user -# -# -import json -from passlib.hash import sha256_crypt -from cloud.storage import storage - - -userdir = "users" -userdirpath = ["home",userdir] - - -class User: - def __init__(self, user="", password="", data=None): - if data != None: - self.set_data(data) - return - data = {} - data["email"] = user - # salt and save the salted pw - data["confirmed"] = True - data["pwhash"] = sha256_crypt.encrypt(password) - data["lastlogin"] = "" - data["createdon"] = "" - data["dongle"] = "" - self.data = data - def authenticate(self, password): - return sha256_crypt.verify(password, self.data["pwhash"]) - def set_password(self, newpassword): - self.data["pwhash"] = sha256_crypt.encrypt(newpassword) - def set_confirmed(self): - self.data["confirmed"] = True - def get_confirmed(self): - return self.data["confirmed"] - def set_data(self, data): - self.data = json.loads(data) - def get_data(self): - return json.dumps(self.data) - def get_user(self): - return self.data["email"] - def set_dongle(self, dongle): - self.data["dongle"] = dongle - def get_dongle(self): - return self.data["dongle"] - - -def get_user_path(email): - path = userdirpath[:] - path.append(email) - return path - -def user_exists(email): - #check if the user exists - path = get_user_path(email) - fileobj = storage.getFile(path) - if not fileobj: - return False - else: - return True - -def get_user(email): - path = get_user_path(email) - fileobj = storage.getFile(path) - if not fileobj: - return None - user = User(data=fileobj.data) - return user - -def set_user(userobj): - path = get_user_path(userobj.get_user()) - storage.updateFile(path, userobj.get_data()) - -def create_user(email, password): - #create the user if it does not exist - if user_exists(email): - return - path = get_user_path(email) - # assumes userdir exists - user = User(user=email,password=password) - storage.createFile(path,user.get_data()) - -def delete_user(email): - # delete the user - if not user_exists(email): - return - path = get_user_path(email) - storage.deleteFile(path) - -def authenticate_user(email, password): - user = get_user(email) - if user == None: - return False - if (user.get_confirmed()): - return user.authenticate(password) - return False - -def confirm_user(user): - # set the user to confirmed - userobj = get_user(user) - if userobj == None: - return - userobj.set_confirmed() - set_user(userobj) - -def update_password(user, password): - # update the password - userobj = get_user(user) - if userobj == None: - return - userobj.set_password(password) - set_user(userobj) - -def get_user_dongle(user): - userobj = get_user(user) - if userobj == None: - return None - return userobj.get_dongle() - -def set_user_dongle(user, dongle): - userobj = get_user(user) - if userobj == None: - return - userobj.set_dongle(dongle) - set_user(userobj) - - - -# if userdir does not exist, create it - - -if "__name__" == "__main__": - #create_user("test","test") - pass - diff --git a/Website/cloud/storage/__init__.py b/Website/cloud/storage/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/Website/cloud/storage/storage.py b/Website/cloud/storage/storage.py deleted file mode 100644 index ce672f2..0000000 --- a/Website/cloud/storage/storage.py +++ /dev/null @@ -1,347 +0,0 @@ -""" -Cloud Storage Infrastructure - -using amazon S3 -""" - -import json - -from boto.s3.connection import S3Connection -from boto.s3.key import Key -from dotenv import load_dotenv -import os - -# Load environment variables from .env file -load_dotenv() - -# S3 connection -connection = S3Connection(os.getenv("AWS_ACCESS_KEY_ID"),os.getenv("AWS_SECRET_ACCESS_KEY")) -AspiringStorageBucket = os.getenv("S3_BUCKET_NAME") - -print("Starting cloud import"); - -# -# The following are the base ITEM key, value APIs -# Using this key,value storage is built a -# user storage metaphor -# - - -# store a user item -# returns True/False -def putItem(path, filedata, bucket_name=None): - if bucket_name==None: - bucket_name = AspiringStorageBucket - bucket = getBucket(bucket_name) - k = Key(bucket) - k.key = path - #can set metadata to the key - #k.set_metadata("date","some date string") - k.set_contents_from_string(filedata); - return True - -# get a user item -# returns data/None -def getItem(path, bucket_name=None): - try: - if bucket_name==None: - bucket_name = AspiringStorageBucket - bucket = getBucket(bucket_name) - k = Key(bucket) - k.key = path - data = k.get_contents_as_string() - return data - except: - return None - -# does item exist -# returns boolean -def existsItem(path, bucket_name=None): - try: - if bucket_name==None: - bucket_name = AspiringStorageBucket - bucket = getBucket(bucket_name) - k = Key(bucket) - k.key = path - return k.exists() - except: - return False - - -# delete a user item -# returns True/False -def deleteItem(path, bucket_name=None): - if bucket_name==None: - bucket_name = AspiringStorageBucket - bucket = getBucket(bucket_name) - k = Key(bucket) - k.key = path - k.delete() - return True - -# The following are helpers to implement the API - -def createBucket(bucketname): - conn = getConnection() - bucket = conn.create_bucket(bucketname) - return bucket - -def getBucket(bucketname): - conn = getConnection() - bucket = conn.get_bucket(bucketname) - return bucket - -def getConnection(): - # may need to check if conn is alive etc - return connection - -# -# -# The following are user file abstraction -# built using a key-value storage -# -# The abstraction is simple -# The path to the file is the key -# The metadata on the key indicates if it is a file or directory -# If it is a directory, then, it contains the list of files as the value -# which gets updated when files get added or deleted -# -# Note that the user is embedded into the filesystem path -# -# path itself is a stringified json list -# -# - -# path manipulation apis - -# first define dir, and file classes - -class File: - def __init__(self,name,data): - self.fname = name - self.data = data - -class Directory: - def __init__(self,name,filelist): - self.fname = name - self.files = [File(i,"") for i in filelist] - - -def pathToString(path): - return json.dumps(path) - -# path is a list -# returns True/False -def createDir(path): - # check if dir exists, if so fail - spath = pathToString(path) - data = getItem(spath) - if (data != None): - print("dir exists"); - return False - # create the dir file - dirdata = {} - dirdata["data"] = json.dumps([]) - dirdata["path"] = path - dirdata["type"] = "dir" - if not (putItem(spath, json.dumps(dirdata))): - print("putitem failed"); - return False - #print("createDir passed" ); - return True - - -def deleteDir(path): - # not implemented yet - pass - - -# path is list, return python file object -def getFileRaw(path): - spath = pathToString(path) - data = getItem(spath) - if (data == None): - return None - filedata = json.loads(data) - return filedata - -# path is list, returns directory object or file object as the case -# may be -def getFile(path): - data = getFileRaw(path) - print("getfile",data); - if data == None: - return None - if data["type"] == "dir": - fileslist = json.loads(data["data"]) - fname = path[len(path)-1] - fileobj = Directory(fname, fileslist) - return fileobj - elif data["type"] == "file": - fname = path[len(path)-1] - fileobj = File(fname, data["data"]) - return fileobj - else: - return None - -## -## path is list, data is a string -## -def createFile(path, data): - # make sure parent dir exists - if len(path) <= 1: - print("parent path failed"); - return False - ppath = path[:-1] - parentdata = getFileRaw(ppath) - if parentdata == None: - print("parent data failed" ); - return False - # check if file exists - spath = pathToString(path) - if getItem(spath) != None: - print("file exists failed" ); - return False - # update the file - filedata = {} - filedata["data"] = data - filedata["path"] = path - filedata["type"] = "file" - if (not putItem(spath, json.dumps(filedata))): - print("putfile failed" ); - return False - # the update the directory - fname = path[len(path)-1] - fileslist = json.loads(parentdata["data"]) - fileslist.append(fname) - parentdata["data"] = json.dumps(fileslist) - if (not putItem(pathToString(ppath), json.dumps(parentdata))): - # this is unexpected, unwind ! - print("putdir failed" ); - deleteFile(path) - return False - return True - -## -## path is list, data is a string -## -def updateFile(path, data): - # file must exist - filedata = getFileRaw(path) - if (filedata == None): - return False - filedata["data"] = data - if not putItem(pathToString(path), json.dumps(filedata)): - return False - return True - -## -## path is list -## -def deleteFile(path): - filedata = getFileRaw(path) - if filedata == None or filedata["type"] != "file": - print("file does not exist"); - return False - # - # update the parent directory first - # - ppath = path[:-1] - parentdata = getFileRaw(ppath) - if parentdata == None: - print("parent data failed" ); - return False - fileslist = json.loads(parentdata["data"]) - newlist = [] - fname = path[len(path)-1] - for i in fileslist: - if fname == i: - pass - else: - newlist.append(i) - parentdata["data"] = json.dumps(newlist) - if (not putItem(pathToString(ppath), json.dumps(parentdata))): - # this is unexpected, unwind ! - print("putdir failed" ); - return False - # then delete the file - if not deleteItem(pathToString(path)): - print("delete file failed"); - return False - return True - - -#### The following are unit tests - -def unitTestItems(): - putItem("foobar1","test1") - print(getItem("foobar1")) - putItem("foobar2","test2") - print(getItem("foobar2")) - deleteItem("foobar1") - deleteItem("foobar2") - print(getItem("foobar1") ) - print(getItem("foobar2") ) - -def unitTestItemsInBucket(): - bkt_name = "aspiring-pdf-files" - putItem("foobar1","test1", bkt_name) - print(existsItem("foobar1", bkt_name)) - print(getItem("foobar1", bkt_name)) - putItem("foobar2","test2", bkt_name) - print(existsItem("foobar2", bkt_name)) - print(getItem("foobar2", bkt_name)) - deleteItem("foobar1", bkt_name) - deleteItem("foobar2", bkt_name) - print(existsItem("foobar1", bkt_name)) - print(existsItem("foobar1", bkt_name)) - print(getItem("foobar1", bkt_name) ) - print(getItem("foobar2", bkt_name) ) - - -def unitTestFiles(): - path = ["home","demo"] - print("--create dir--"); - createDir(path) - print(getFileRaw(path)) - fpath = path[:] - fpath.append("fname") - print("--del file--" ); - deleteFile(fpath) - print("--create file--" ); - createFile(fpath, "FileData Test1") - print(getFileRaw(fpath)) - print(getFileRaw(path)) - print(str(getFile(fpath))) - print("--update file--" ); - updateFile(fpath, "FileData Test2") - print(getFileRaw(fpath)) - print(getFileRaw(path)) - print(str(getFile(fpath))) - print("--create second file--"); - fpath2 = path[:] - fpath2.append("fname2") - createFile(fpath2, "FileData2 Test1") - print(getFileRaw(fpath2)) - print(getFileRaw(path)) - print(str(getFile(fpath2))) - print("--update second file--" ); - updateFile(fpath2, "FileData2 Test2") - print(getFileRaw(fpath2)) - print(getFileRaw(path)) - print(str(getFile(fpath2))) - print("--del file--" ); - deleteFile(fpath) - print(getFileRaw(path)) - print(str(getFile(fpath))) - deleteFile(fpath2) - print(getFileRaw(path)) - print(str(getFile(fpath))) - -print("Cloud imported"); - -if __name__ == "__main__": - # unit tests here - #unitTestItems() - #unitTestFiles() - unitTestItemsInBucket() diff --git a/Website/configs/nginx.conf b/Website/configs/nginx.conf deleted file mode 100644 index c8f60cc..0000000 --- a/Website/configs/nginx.conf +++ /dev/null @@ -1,78 +0,0 @@ -user www-data; -worker_processes auto; - -error_log /var/log/nginx/error.log warn; -pid /var/run/nginx.pid; - -events { - worker_connections 1024; -} - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /var/log/nginx/access.log main; - - sendfile on; - #tcp_nopush on; - - keepalive_timeout 65; - - #gzip on; - - upstream flask_app { - server 127.0.0.1:8000; - server 127.0.0.1:8001; - server 127.0.0.1:8002; - server 127.0.0.1:8003; - } - - server { - listen 80; - server_name c4gt.manasmadan.studio; - - # Redirect all HTTP requests to HTTPS - return 301 https://$server_name$request_uri; - } - - server { - listen 443 ssl; - server_name c4gt.manasmadan.studio; - - ssl_certificate /etc/letsencrypt/live/c4gt.manasmadan.studio/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/c4gt.manasmadan.studio/privkey.pem; - - # Improve SSL settings - ssl_protocols TLSv1.2 TLSv1.3; - ssl_prefer_server_ciphers on; - ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; - ssl_session_cache shared:SSL:10m; - ssl_session_timeout 10m; - ssl_stapling on; - ssl_stapling_verify on; - - # Add HSTS (optional) - add_header Strict-Transport-Security "max-age=31536000" always; - - location / { - proxy_pass http://flask_app; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - error_page 404 /404.html; - location = /40x.html { - } - - error_page 500 502 503 504 /50x.html; - location = /50x.html { - } - } -} \ No newline at end of file diff --git a/Website/ec2.md b/Website/ec2.md deleted file mode 100644 index 98c99eb..0000000 --- a/Website/ec2.md +++ /dev/null @@ -1,209 +0,0 @@ -# Setting Up Flask Application on AWS EC2 Instance - -This guide walks you through the steps to deploy a Flask application on an AWS EC2 instance using Ubuntu Server 20.04 LTS. - -## Step 1: Launch an EC2 Instance - -1. **Go to EC2 Dashboard:** - - - Sign in to AWS Management Console. - - Navigate to the EC2 Dashboard. - -2. **Launch Instance:** - - - Click on "Launch Instance". - - Choose "Ubuntu Server 20.04 LTS" (or latest LTS version). - - Select instance type "t2.medium". - -3. **Configure Instance:** - - - Use default settings for VPC and subnet. - - Add storage as needed (default is fine for most cases). - - Add tags for easier identification (optional). - -4. **Configure Security Group:** - - - Create a new security group or use an existing one. - - Configure inbound rules: - - SSH (port 22) from your IP (to access the instance). - - HTTP (port 80) from anywhere (to allow web traffic). - - HTTPS (port 443) from anywhere (if using SSL). - -5. **Review and Launch:** - - - Review your instance configuration. - - Click "Launch" and select or create a new key pair to connect to your instance securely. - -6. **Allocate an Elastic IP:** - - - In the EC2 Dashboard, go to "Elastic IPs". - - Click "Allocate Elastic IP address". - - Select the allocated IP and associate it with your instance. - -7. **Update Domain DNS:** - - Go to your domain registrar's website. - - Update the A record to point to your Elastic IP. - -## Step 2: SSH into your Instance - -Use the following command to SSH into your instance: - -```bash -ssh -i your-key.pem ubuntu@your-elastic-ip -``` - -Replace `your-key.pem` with the path to your private key file and `your-elastic-ip` with your instance's Elastic IP address. - -## Step 3: Set Up the Environment - -1. **Update and Install Dependencies:** - -```bash -sudo apt update && sudo apt upgrade -y -sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \ - libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \ - libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev \ - python3-openssl git -``` - -2. **Install pyenv:** - -```bash -curl https://pyenv.run | bash -``` - -3. **Add pyenv to your path:** - -```bash -echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc -echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc -echo 'eval "$(pyenv init --path)"' >> ~/.bashrc -echo 'eval "$(pyenv init -)"' >> ~/.bashrc -source ~/.bashrc -``` - -4. **Install Python 3.9.6:** - -```bash -pyenv install 3.9.6 -pyenv global 3.9.6 -``` - -5. **Create a Virtual Environment:** - -```bash -python -m venv venv -source venv/bin/activate -``` - -6. **Install wkhtmltopdf:** - -```bash -sudo apt-get update -sudo apt-get install -y wkhtmltopdf -``` - -7. **Verify the installation:** - -```bash -wkhtmltopdf --version -``` - -## Step 4: Deploy Your Flask Application - -1. **Clone your repository and install dependencies:** - -```bash -git clone your-repo-url -cd your-repo-directory -pip install -r requirements.txt -``` - -2. **Create .env file:** - -```bash -nano .env -# Add your environment variables here -``` - -3. **Install and Configure Nginx:** - -```bash -sudo apt install nginx -sudo cp configs/nginx.conf /etc/nginx/nginx.conf -sudo nginx -t -sudo systemctl enable nginx -``` - -4. **Install Gunicorn:** - -```bash -pip install gunicorn -``` - -5. **Make your run scripts executable:** - -```bash -chmod +x run.sh runwithlogs.sh runnginx.sh -``` - -6. **Create a systemd service file for your application:** - -```bash -sudo nano /etc/systemd/system/flask_app.service -``` - -Add the following content: - -```ini -[Unit] -Description=Gunicorn instance to serve flask app -After=network.target - -[Service] -User=ubuntu -WorkingDirectory=/home/ubuntu/your-repo-directory -Environment="PATH=/home/ubuntu/venv/bin" -ExecStart=/home/ubuntu/your-repo-directory/runwithlogs.sh - -[Install] -WantedBy=multi-user.target -``` - -7. **Start and Enable the Service:** - -```bash -sudo systemctl start flask_app -sudo systemctl enable flask_app -``` - -8. **Start Nginx:** - -```bash -sudo systemctl start nginx -``` - -## Step 5: Configure SSH for Better Security (Optional) - -1. **Install Certbot and the Nginx plugin:** - -```bash -sudo apt update -sudo apt install certbot python3-certbot-nginx -``` - -2. **Obtain SSL Certificate, Replace your-domain.com with your actual domain:** - -```bash -sudo certbot --nginx -d your-domain.com -``` - -3. **Configure SSH to use the SSL Certificate, Edit the SSH configuration file:** - -```bash -sudo nano /etc/ssh/sshd_config -``` - -## Step 6: Verify and Access Your Application - -Your Flask application should now be running on your EC2 instance. Access it via your domain name or Elastic IP address in a web browser. diff --git a/Website/excelinterop/.gitignore b/Website/excelinterop/.gitignore deleted file mode 100644 index 5657f6e..0000000 --- a/Website/excelinterop/.gitignore +++ /dev/null @@ -1 +0,0 @@ -vendor \ No newline at end of file diff --git a/Website/excelinterop/composer.json b/Website/excelinterop/composer.json deleted file mode 100644 index 5216da8..0000000 --- a/Website/excelinterop/composer.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "require": { - "phpoffice/phpspreadsheet": "^2.1" - } -} diff --git a/Website/excelinterop/composer.lock b/Website/excelinterop/composer.lock deleted file mode 100644 index ea3a886..0000000 --- a/Website/excelinterop/composer.lock +++ /dev/null @@ -1,522 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "b8fc76d4d2fd9a7199969838cb86a710", - "packages": [ - { - "name": "maennchen/zipstream-php", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "b8174494eda667f7d13876b4a7bfef0f62a7c0d1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/b8174494eda667f7d13876b4a7bfef0f62a7c0d1", - "reference": "b8174494eda667f7d13876b4a7bfef0f62a7c0d1", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "ext-zlib": "*", - "php-64bit": "^8.1" - }, - "require-dev": { - "ext-zip": "*", - "friendsofphp/php-cs-fixer": "^3.16", - "guzzlehttp/guzzle": "^7.5", - "mikey179/vfsstream": "^1.6", - "php-coveralls/php-coveralls": "^2.5", - "phpunit/phpunit": "^10.0", - "vimeo/psalm": "^5.0" - }, - "suggest": { - "guzzlehttp/psr7": "^2.4", - "psr/http-message": "^2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "ZipStream\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paul Duncan", - "email": "pabs@pablotron.org" - }, - { - "name": "Jonatan Männchen", - "email": "jonatan@maennchen.ch" - }, - { - "name": "Jesse Donat", - "email": "donatj@gmail.com" - }, - { - "name": "András Kolesár", - "email": "kolesar@kolesar.hu" - } - ], - "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", - "keywords": [ - "stream", - "zip" - ], - "support": { - "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.0" - }, - "funding": [ - { - "url": "https://github.com/maennchen", - "type": "github" - }, - { - "url": "https://opencollective.com/zipstream", - "type": "open_collective" - } - ], - "time": "2023-06-21T14:59:35+00:00" - }, - { - "name": "markbaker/complex", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/MarkBaker/PHPComplex.git", - "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", - "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "dev-master", - "phpcompatibility/php-compatibility": "^9.3", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "squizlabs/php_codesniffer": "^3.7" - }, - "type": "library", - "autoload": { - "psr-4": { - "Complex\\": "classes/src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Baker", - "email": "mark@lange.demon.co.uk" - } - ], - "description": "PHP Class for working with complex numbers", - "homepage": "https://github.com/MarkBaker/PHPComplex", - "keywords": [ - "complex", - "mathematics" - ], - "support": { - "issues": "https://github.com/MarkBaker/PHPComplex/issues", - "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" - }, - "time": "2022-12-06T16:21:08+00:00" - }, - { - "name": "markbaker/matrix", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/MarkBaker/PHPMatrix.git", - "reference": "728434227fe21be27ff6d86621a1b13107a2562c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", - "reference": "728434227fe21be27ff6d86621a1b13107a2562c", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "dev-master", - "phpcompatibility/php-compatibility": "^9.3", - "phpdocumentor/phpdocumentor": "2.*", - "phploc/phploc": "^4.0", - "phpmd/phpmd": "2.*", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "sebastian/phpcpd": "^4.0", - "squizlabs/php_codesniffer": "^3.7" - }, - "type": "library", - "autoload": { - "psr-4": { - "Matrix\\": "classes/src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Baker", - "email": "mark@demon-angel.eu" - } - ], - "description": "PHP Class for working with matrices", - "homepage": "https://github.com/MarkBaker/PHPMatrix", - "keywords": [ - "mathematics", - "matrix", - "vector" - ], - "support": { - "issues": "https://github.com/MarkBaker/PHPMatrix/issues", - "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" - }, - "time": "2022-12-02T22:17:43+00:00" - }, - { - "name": "phpoffice/phpspreadsheet", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "dbed77bd3a0f68f96c0dd68ad4499d5674fecc3e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/dbed77bd3a0f68f96c0dd68ad4499d5674fecc3e", - "reference": "dbed77bd3a0f68f96c0dd68ad4499d5674fecc3e", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-dom": "*", - "ext-fileinfo": "*", - "ext-gd": "*", - "ext-iconv": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-xml": "*", - "ext-xmlreader": "*", - "ext-xmlwriter": "*", - "ext-zip": "*", - "ext-zlib": "*", - "maennchen/zipstream-php": "^2.1 || ^3.0", - "markbaker/complex": "^3.0", - "markbaker/matrix": "^3.0", - "php": "^8.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "dev-main", - "dompdf/dompdf": "^2.0", - "friendsofphp/php-cs-fixer": "^3.2", - "mitoteam/jpgraph": "^10.3", - "mpdf/mpdf": "^8.1.1", - "phpcompatibility/php-compatibility": "^9.3", - "phpstan/phpstan": "^1.1", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^9.6", - "squizlabs/php_codesniffer": "^3.7", - "tecnickcom/tcpdf": "^6.5" - }, - "suggest": { - "dompdf/dompdf": "Option for rendering PDF with PDF Writer", - "ext-intl": "PHP Internationalization Functions", - "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", - "mpdf/mpdf": "Option for rendering PDF with PDF Writer", - "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" - }, - "type": "library", - "autoload": { - "psr-4": { - "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Maarten Balliauw", - "homepage": "https://blog.maartenballiauw.be" - }, - { - "name": "Mark Baker", - "homepage": "https://markbakeruk.net" - }, - { - "name": "Franck Lefevre", - "homepage": "https://rootslabs.net" - }, - { - "name": "Erik Tilt" - }, - { - "name": "Adrien Crivelli" - } - ], - "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", - "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", - "keywords": [ - "OpenXML", - "excel", - "gnumeric", - "ods", - "php", - "spreadsheet", - "xls", - "xlsx" - ], - "support": { - "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/2.1.0" - }, - "time": "2024-05-11T04:17:56+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client" - }, - "time": "2023-09-23T14:17:50+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory" - }, - "time": "2024-04-15T12:06:14+00:00" - }, - { - "name": "psr/http-message", - "version": "2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" - }, - "time": "2023-04-04T09:54:51+00:00" - }, - { - "name": "psr/simple-cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "support": { - "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" - }, - "time": "2021-10-29T13:26:27+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": [], - "platform-dev": [], - "plugin-api-version": "2.6.0" -} diff --git a/Website/excelinterop/export.php b/Website/excelinterop/export.php deleted file mode 100644 index e65d422..0000000 --- a/Website/excelinterop/export.php +++ /dev/null @@ -1,52 +0,0 @@ -sheetArr; -$workbook = new Spreadsheet(); - -$sindex = 0; -$actualactiveindex = 0; - -foreach ($sheetarr as $key => $value) { - if ($sindex > 0) { - $workbook->createSheet(); - $workbook->setActiveSheetIndex($sindex); - } - if ($key == $book->currentid) { - $actualactiveindex = $sindex; - } - - $title = $value->name; - $sheet = socialcalc_parse_sheet($value->sheetstr->savestr); - - _sheetnode_phpexcel_export_do($workbook, $title, $sheet); - - $sindex++; - echo $sindex . ' done' . PHP_EOL; -} - -$workbook->setActiveSheetIndex($actualactiveindex); - -// Write the workbook into a file -$objWriter = IOFactory::createWriter($workbook, $outfiletype); -$objWriter->save($outfile); - -?> \ No newline at end of file diff --git a/Website/excelinterop/import.php b/Website/excelinterop/import.php deleted file mode 100644 index 457b937..0000000 --- a/Website/excelinterop/import.php +++ /dev/null @@ -1,43 +0,0 @@ -getSheetCount(); - -$book = [ - 'numsheets' => $sheetCount, - 'currentname' => $spreadsheet->getActiveSheet()->getTitle(), - 'sheetArr' => [], -]; - -foreach ($spreadsheet->getSheetNames() as $index => $sheetName) { - $sheet = $spreadsheet->getSheet($index); - $sheetSave = _sheetnode_phpexcel_import_do($spreadsheet, $sheet); - - $sheetData = [ - 'name' => $sheetName, - 'sheetstr' => [ - 'savestr' => $sheetSave, - ], - ]; - - $book['sheetArr']["Sheet$index"] = $sheetData; - - if ($sheetName == $book['currentname']) { - $book['currentid'] = "Sheet$index"; - } -} - -$json = json_encode($book); - -echo "$---$"; // Output delimiter (assuming for parsing purposes) -echo $json; \ No newline at end of file diff --git a/Website/excelinterop/import.py b/Website/excelinterop/import.py deleted file mode 100644 index 62dd83a..0000000 --- a/Website/excelinterop/import.py +++ /dev/null @@ -1,22 +0,0 @@ -import commands -import sys -import json - -wbookenc = commands.getoutput("php import.php %s"%sys.argv[1]) - - - -i = wbookenc.index("$---$") - - -wbookenc = wbookenc[i+5:] - -#print wbookenc - -wbook = json.loads(wbookenc) - -#print wbook['numsheets'],wbook['currentname'],wbook['currentid'] - -f = open("testsc.txt","w") -f.write(wbookenc) -f.close() diff --git a/Website/excelinterop/install.txt b/Website/excelinterop/install.txt deleted file mode 100644 index 3c4458c..0000000 --- a/Website/excelinterop/install.txt +++ /dev/null @@ -1,75 +0,0 @@ -************************************************************************************** -* PHPExcel -* -* Copyright (c) 2006 - 2009 PHPExcel -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; either -* version 2.1 of the License, or (at your option) any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -* -* @copyright Copyright (c) 2006 - 2009 PHPExcel (http://www.codeplex.com/PHPExcel) -* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL -* @version 1.7.5, 2010-12-10 -************************************************************************************** - -Requirements ------------- - -The following requirements should be met prior to using PHPExcel: -* PHP version 5.2.0 or higher -* PHP extension php_zip enabled *) -* PHP extension php_xml enabled -* PHP extension php_gd2 enabled (if not compiled in) - -*) php_zip is only needed by PHPExcel_Reader_Excel2007, PHPExcel_Writer_Excel2007, - PHPExcel_Reader_OOCalc. In other words, if you need PHPExcel to handle .xlsx or .ods - files you will need the zip extension, but otherwise not. - - - -Installation instructions -------------------------- - -Installation is quite easy: copy the contents of the Classes folder to any location -in your application required. - -Example: - -If your web root folder is /var/www/ you may want to create a subfolder called -/var/www/Classes/ and copy the files into that folder so you end up with files: - -/var/www/Classes/PHPExcel.php -/var/www/Classes/PHPExcel/Calculation.php -/var/www/Classes/PHPExcel/Cell.php -... - - - -Getting started ---------------- - -A good way to get started is to run some of the tests included in the download. -Copy the "Tests" folder next to your "Classes" folder from above so you end up with: - -/var/www/Tests/01simple.php -/var/www/Tests/02types.php -... - -Start running the test by pointing your browser to the test scripts: - -http://example.com/Tests/01simple.php -http://example.com/Tests/02types.php -... - -Note: It may be necessary to modify the include/require statements at the beginning of -each of the test scripts if your "Classes" folder from above is named differently. diff --git a/Website/excelinterop/license.txt b/Website/excelinterop/license.txt deleted file mode 100644 index 01b2d31..0000000 --- a/Website/excelinterop/license.txt +++ /dev/null @@ -1,344 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/Website/excelinterop/readxls.php b/Website/excelinterop/readxls.php deleted file mode 100644 index ddad464..0000000 --- a/Website/excelinterop/readxls.php +++ /dev/null @@ -1,54 +0,0 @@ -save(str_replace('.php', '.xlsx', __FILE__)); - - -// Echo memory peak usage -echo date('H:i:s') . " Peak memory usage: " . (memory_get_peak_usage(true) / 1024 / 1024) . " MB\r\n"; - -// Echo done -echo date('H:i:s') . " Done reading file.\r\n"; diff --git a/Website/excelinterop/sheetnode_phpexcel.export.inc b/Website/excelinterop/sheetnode_phpexcel.export.inc deleted file mode 100644 index f1c4e81..0000000 --- a/Website/excelinterop/sheetnode_phpexcel.export.inc +++ /dev/null @@ -1,387 +0,0 @@ -type != 'sheetnode') return drupal_not_found(); - return _sheetnode_phpexcel_export_do($format, $node->title, socialcalc_parse(_sheetnode_load($node->nid, $node->vid))); -} - -//function _sheetnode_phpexcel_export_do($format, $title, $socialcalc) { -// require_once(variable_get('sheetnode_phpexcel_library_path', '') . '/Classes/PHPExcel.php'); - -function _sheetnode_phpexcel_export_do($workbook, $title, $sc) { - // Create new PHPExcel object - //$sc = $socialcalc['sheet']; - //$workbook = new PHPExcel(); - - // Title - try { - // TODO: Split titles with format "Spreadsheet > Workbook" and sanitize. - $workbook->getActiveSheet()->SetTitle($title); - } - catch (Exception $e) { - watchdog('sheetnode_phpexcel', 'Error setting worksheet title to "!title": @error', array('!title' => $title, '@error' => $e->getMessage()), WATCHDOG_WARNING); - } - -/* - // TODO: Properties - $workbook->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); -*/ - // Names - // TODO: Not supported in Excel5. - if (!empty($sc['names'])) foreach ($sc['names'] as $n => $info) { - // TODO: Support external references. - $workbook->addNamedRange(new PHPExcel_NamedRange($n, $workbook->getActiveSheet(), $info['definition'])); - } - - // Cells - if ($sc['cells']) foreach ($sc['cells'] as $coord => $c) { - // Value and format - _sheetnode_phpexcel_export_cell_value_and_format($c, $coord, $sc, $workbook->getActiveSheet()); - - // Comment - // TODO: Not supported in Excel5. - if (!empty($c['comment'])) { - $workbook->getActiveSheet()->getComment($coord)->getText()->createTextRun($c['comment']); - } - - // Font - $style = $workbook->getActiveSheet()->getStyle($coord); - if (!empty($c['font'])) { - $scf = socialcalc_cellformat_parsefont($c, $sc); - $font = $style->getFont(); - if (!empty($scf['family'])) $font->setName($scf['family']); - if (!empty($scf['size'])) $font->setSize(floatval($scf['size'])); - if (!empty($scf['bold'])) $font->setBold(true); - if (!empty($scf['italic'])) $font->setItalic(true); - if (!empty($c['color'])) { - $scc = socialcalc_cellformat_parsecolor($c, $sc, 'color'); - $rgb = sprintf('%02X%02X%02X', $scc['r'], $scc['g'], $scc['b']); - $font->getColor()->setRGB($rgb); - } - } - - // Borders - foreach (array( - 'br' => 'getRight', - 'bl' => 'getLeft', - 'bt' => 'getTop', - 'bb' => 'getBottom', - ) as $pos => $method) { - $border = socialcalc_cellformat_parseborder($c, $sc, $pos); - if (empty($border)) continue; - $borderobj = $style->getBorders()->$method(); - $thickness = str_replace('px', '', $border['thickness']); // TODO: what about other units? - if ($thickness > 0 && $thickness < 7) { - $thickness = 'thin'; - } - else if ($thickness > 7 && $thickness < 15) { - $thickness = 'medium'; - } - else if ($thickness > 15) { - $thickness = 'thick'; - } - $borderstyles = array( - 'thin' => array( - 'solid' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, - 'dashed' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_DASHED, - 'dotted' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_DOTTED, - 'double' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_DOUBLE, - ), - 'medium' => array( - 'solid' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_MEDIUM, - 'dashed' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_MEDIUMDASHED, - ), - 'thick' => array( - 'solid' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK, - ), - ); - // TODO: what about other combinations? - $borderstyle = isset($borderstyles[$thickness][$border['style']]) ? $borderstyles[$thickness][$border['style']] : \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN; - $borderobj->setBorderStyle($borderstyle); - $scc = $border['color']; - $rgb = sprintf('%02X%02X%02X', $scc['r'], $scc['g'], $scc['b']); - $borderobj->getColor()->setRGB($rgb); - } - - // Background color - if (!empty($c['bgcolor'])) { - $scc = socialcalc_cellformat_parsecolor($c, $sc, 'bgcolor'); - $rgb = sprintf('%02X%02X%02X', $scc['r'], $scc['g'], $scc['b']); - $style->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID); - $style->getFill()->getStartColor()->setRGB($rgb); - } - - // Alignment - if (!empty($c['cellformat'])) { - $alignments = array( - 'left' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT, - 'right' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT, - 'center' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER, - ); - $alignment = isset($alignments[$sc['cellformats'][$c['cellformat']]]) ? $alignments[$sc['cellformats'][$c['cellformat']]] : NULL; - if ($alignment) { - $style->getAlignment()->setHorizontal($alignment); - } - } - - // Vertical Alignment - $layout = socialcalc_cellformat_parselayout($c, $sc); - if (!empty($layout['alignvert'])) { - $valignments = array( - 'top' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP, - 'bottom' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_BOTTOM, - 'middle' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER, - ); - $valignment = isset($valignments[$layout['alignvert']]) ? $valignments[$layout['alignvert']] : NULL; - if ($valignment) { - $style->getAlignment()->setVertical($valignment); - } - } - - // Merged regions -if (isset($c['colspan']) && isset($c['rowspan']) && ($c['colspan'] > 1 || $c['rowspan'] > 1)) { - $colspan = isset($c['colspan']) ? $c['colspan'] : 1; - $rowspan = isset($c['rowspan']) ? $c['rowspan'] : 1; - $coord2 = socialcalc_cr_to_coord($c['pos'][0] + max($colspan - 1, 0), $c['pos'][1] + max($rowspan - 1, 0)); - $workbook->getActiveSheet()->mergeCells($coord . ':' . $coord2); -} - } - - // Columns -$defaultStyle = $workbook->getDefaultStyle(); -$defaultFont = $defaultStyle->getFont(); - -if (!empty($sc['colattribs']['width'])) { - foreach ($sc['colattribs']['width'] as $c => $width) { - $columnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($c - 1); - $worksheet = $workbook->getActiveSheet(); - $worksheet->getColumnDimension($columnIndex)->setWidth($width); - } -} - - // Rows - if (!empty($sc['rowattribs']['height'])) foreach($sc['rowattribs']['height'] as $r => $height) { - $workbook->getActiveSheet()->getRowDimension($r)->setRowHeight($height); - } - - // Test formulas and replace with calculated value upon failure. - foreach ($workbook->getActiveSheet()->getCellCollection() as $cellID) { - $cell = $workbook->getActiveSheet()->getCell($cellID); - if ($cell->getDatatype() == \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_FORMULA) { - try { - //$cell->getCalculatedValue(); // don't care about return value - $coord = $cell->getCoordinate(); - $cell->setValue($sc['cells'][$coord]['datavalue']); - } - catch (Exception $e) { - $coord = $cell->getCoordinate(); - $cell->setValue($sc['cells'][$coord]['datavalue']); - $comment = t(variable_get('sheetnode_phpexcel_bad_formula', 'Could not export formula !formula.'), array('!formula' => $sc['cells'][$coord]['formula'])); - $workbook->getActiveSheet()->getComment($coord)->getText()->createTextRun($comment); - } - } - } - //return ''; - - // Redirect output to a client’s web browser. - //$plugins = sheetnode_phpexcel_get_plugins(); - //$plugin = $plugins[$format]; - //header('Content-Type: ' . $plugin['content-type']); - //header('Content-Disposition: attachment;filename="' . _sheetnode_sanitize_filename($title, $format) . '"'); - //header('Cache-Control: max-age=0'); - - //$writer = PHPExcel_IOFactory::createWriter($workbook, $plugin['php-excel-type']); - //$writer->save('php://output'); - //exit; - return; -} - -function _sheetnode_phpexcel_export_cell_value_and_format($c, $coord, $sc, $worksheet) { - // Taken from socialcalc-3.js:SocialCalc.FormatValueForDisplay(). - $cell = $worksheet->getCell($coord); - $style = $worksheet->getStyle($coord); - - $valuetype = substr($c['valuetype'], 0, 1); - $valuesubtype = substr($c['valuetype'], 1); - $displayvalue = $c['datavalue']; - $valueformat = NULL; - - // Error. - if (!empty($c['errors']) || $valuetype == 'e') { - $displayvalue = !empty($c['errors']) ? $c['errors'] : (!empty($valuesubtype) ? $valuesubtype : t('Unknown error')); - $cell->setValueExplicit($displayvalue, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_ERROR); - } - // Text. - else if ($valuetype == 't') { - // Get formatting. - $valueformat = !empty($c['textvalueformat']) ? $sc['valueformats'][$c['textvalueformat']] : ( - !empty($sc['defaulttextvalueformat']) ? $sc['valueformats'][$sc['defaulttextvalueformat']] : NULL); - if (in_array(strtolower($valueformat), array('auto', 'none', 'general'))) { - $valueformat = NULL; - } - - // Default text formatting based on cell type. - if (empty($valueformat)) switch ($valuesubtype) { - case 'h': - $valueformat = 'text-html'; - break; - case 'w': - case 'r': - $valueformat = 'text-wiki'; - break; - case 'l': - $valueformat = 'text-link'; - break; - default: - $valueformat = 'text-plain'; - break; - } - - // Set the value. - if ($c['datatype'] == 'f') { - $cell->setValue('='. $c['formula']); - } - else switch ($valueformat) { - case 'text-plain': - $cell->setValueExplicit($displayvalue, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); - break; - case 'text-html': - // TODO: Parse HTML into rich text. - $cell->setValueExplicit(strip_tags($displayvalue), \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); - break; - case 'text-url': - case 'text-link': - $matches = array(); - if (preg_match('/^(.*)<(.*)>$/', $displayvalue, $matches)) { - $text = trim($matches[1], "\r\n\t \""); - $url = $matches[2]; - } - else { - $url = $displayvalue; - $parse_url = parse_url($url); - $text = $parse_url['host'] . $parse_url['path']; - } - $cell->setValueExplicit($text, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); - $cell->getHyperlink()->setUrl($url); - break; - case 'text-wiki': - // TODO - break; - case 'text-image': - if (function_exists('curl_init')) { - // Download the file using cURL. - $ch = curl_init($displayvalue); - $filename = tempnam(file_directory_temp(), 'sheetnode_phpexcel_'); - $fp = fopen($filename, 'wb'); - $options = array(CURLOPT_FILE => $fp, - CURLOPT_HEADER => 0, - CURLOPT_FOLLOWLOCATION => 1, - CURLOPT_TIMEOUT => 60); - curl_setopt_array($ch, $options); - curl_exec($ch); - curl_close($ch); - fclose($fp); - $image_info = image_get_info($filename); - if (!empty($image_info)) { - // Insert the image in the PHPExcel file. - $objDrawing = new PHPExcel_Worksheet_Drawing(); - $objDrawing->setPath($filename); - $objDrawing->setCoordinates($coord); - $objDrawing->setWidth($image_info['width']); - $objDrawing->setWorksheet($worksheet); - } - } - break; - case 'hidden': - // TODO - break; - case 'formula': - // TODO - break; - default: - if (substr($valueformat, 0, 12) == 'text-custom:') { - // TODO - } - else if (substr($valueformat, 0, 6) == 'custom') { - // TODO - } - else { - $cell->setValue($displayvalue); - } - break; - } - } - // Number. - else if ($valuetype == 'n') { - // Get formatting. - $valueformat = !empty($c['nontextvalueformat']) ? $sc['valueformats'][$c['nontextvalueformat']] : ( - !empty($sc['defaultnontextvalueformat']) ? $sc['valueformats'][$sc['defaultnontextvalueformat']] : NULL); - if ($valueformat !== null && in_array(strtolower($valueformat), array('auto', 'none'))) { - $valueformat = null; // Assign null instead of NULL for consistency -} - - // Default number formatting based on cell type. - if (empty($valueformat)) switch ($valuesubtype) { - case '%': - $valueformat = SocialCalc_Constants::$defaultFormatp; - break; - case '$': - $valueformat = SocialCalc_Constants::$defaultFormatc; - break; - case 'dt': - $valueformat = SocialCalc_Constants::$defaultFormatdt; - break; - case 'd': - $valueformat = SocialCalc_Constants::$defaultFormatd; - break; - case 't': - $valueformat = SocialCalc_Constants::$defaultFormatt; - break; - case 'l': - $valueformat = 'logical'; - break; - default: - $valueformat = \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_GENERAL; - break; - } - - // Set the value. - if ($c['datatype'] == 'f') { - $cell->setValue('='. $c['formula']); - } - else if ($valueformat == 'logical') { - $displayvalue = empty($displayvalue) ? SocialCalc_Constants::$defaultDisplayFALSE : SocialCalc_Constants::$defaultDisplayTRUE; - $cell->setValue($displayvalue); - $valueformat = NULL; - } - else if ($valueformat == 'formula') { - $cell->setValueExplicit('='. $c['formula'], \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); - } - else if ($valueformat == 'forcetext') { - $cell->setValueExplicit($displayvalue, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); - } - else { - $cell->setValueExplicit($displayvalue, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_NUMERIC); - } - - // Set the formatting. - if ($valueformat == 'hidden') { - // TODO - } - else if (!empty($valueformat)) { - $style->getNumberFormat()->setFormatCode($valueformat); - } - } - // Unknown. - else { - $cell->setValueExplicit('', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_NULL); - } -} - diff --git a/Website/excelinterop/sheetnode_phpexcel.import.inc b/Website/excelinterop/sheetnode_phpexcel.import.inc deleted file mode 100644 index 1655e42..0000000 --- a/Website/excelinterop/sheetnode_phpexcel.import.inc +++ /dev/null @@ -1,484 +0,0 @@ - "multipart/form-data"); - $plugins = sheetnode_phpexcel_get_plugins(); - $form['#plugin'] = $plugins[$format]; - $form['import'] = array( - '#type' => 'file', - '#title' => t('!format to import', array('!format' => $form['#plugin']['long-name'])), - '#size' => 40, - ); - $form['submit'] = array( - '#type' => 'submit', - '#value' => t('Submit'), - ); - return $form; -} - -function _sheetnode_phpexcel_import_form_validate($form, &$form_state) { - $source = $_FILES['files']['name']['import']; - - // Handle PHP file upload errors. - switch ($_FILES['files']['error']['import']) { - case UPLOAD_ERR_OK: - break; - case UPLOAD_ERR_FORM_SIZE: - case UPLOAD_ERR_INI_SIZE: - form_set_error('import', t('The file %file could not be saved, because it exceeds %maxsize, the maximum allowed size for uploads. Please choose a smaller file or notify your site administrator.', - array('%file' => $source, '%maxsize' => format_size(file_upload_max_size())))); - return; - case UPLOAD_ERR_PARTIAL: - form_set_error('import', t('The file %file could not be saved, because the upload did not complete. Please try again or notify your site administrator.', array('%file' => $source))); - return; - case UPLOAD_ERR_NO_FILE: - form_set_error('import', t('No file was uploaded. Please choose a file to upload.')); - return; - case UPLOAD_ERR_NO_TMP_DIR: - form_set_error('import', t('The file %file could not be saved, because the temporary upload folder is missing. Please notify your site administrator.', array('%file' => $source))); - return; - case UPLOAD_ERR_CANT_WRITE: - form_set_error('import', t('The file %file could not be saved, because a failure occurred while writing it to the temporary folder. Please notify your site administrator.', array('%file' => $source))); - return; - case UPLOAD_ERR_EXTENSION: - form_set_error('import', t('The file %file could not be saved, because its extension is disallowed. Please notify your site administrator.', array('%file' => $source))); - return; - default: - form_set_error('import', t('The file %file could not be saved. An unknown error %error has occurred. Please notify your site administrator.', - array('%file' => $source, '%error' => $_FILES['files']['error']['import']))); - return; - } - - // TODO: Validate that file is of type $form['#plugin']. -} - -function _sheetnode_phpexcel_import_form_submit($form, &$form_state) { - require_once(variable_get('sheetnode_phpexcel_library_path', '') . '/Classes/PHPExcel.php'); - module_load_include('inc', 'node', 'node.pages'); - set_time_limit(0); - global $user; - - // Open sheet file. - // TODO: What to do with other properties? - $workbook = PHPExcel_IOFactory::load($_FILES['files']['tmp_name']['import']); - $title = $workbook->getProperties()->getTitle(); - if (empty($title)) { - $title = pathinfo($_FILES['files']['name']['import'], PATHINFO_FILENAME); - } - $description = $workbook->getProperties()->getDescription(); - - // Create a book if there are more than one sheet. - $numsheets = $workbook->getSheetCount(); - if ($numsheets > 1 && module_exists('book')) { - $node = array('type' => 'book'); - $form_state_book = array(); - $form_state_book['values']['title'] = $title; - $form_state_book['values']['body'] = $description; - $form_state_book['values']['name'] = $user->name; - $form_state_book['values']['op'] = t('Save'); - $form_state_book['values']['book']['bid'] = 'new'; - $form_state_book['values']['book']['plid'] = -1; - $form_state_book['values']['book']['weight'] = 0; - drupal_execute('book_node_form', $form_state_book, (object)$node); - $book = node_load($form_state_book['nid']); - } - - // Import all sheets. - for ($s = 0; $s < $numsheets; $s++) { - $sheet = $workbook->getSheet($s); - $node = array('type' => 'sheetnode'); - $form_state_node = array(); - $form_state_node['values']['title'] = (empty($book) ? $title .' > ' : '') . $sheet->getTitle(); - $form_state_node['values']['body'] = empty($book) ? $description : ''; - $form_state_node['values']['name'] = $user->name; - $form_state_node['values']['sheetsave'] = _sheetnode_phpexcel_import_do($workbook, $sheet); - $form_state_node['values']['op'] = t('Save'); - if (!empty($book)) { // insert inside the book - $form_state_node['values']['book']['bid'] = $book->nid; - $form_state_node['values']['book']['plid'] = $book->book['mlid']; - $form_state_node['values']['book']['weight'] = $s; - } - // Allow other modules to modify the new node's creation parameters. - // Hook signature: hook_sheetnode_alter(&$form_state_node, $form, $form_state); - drupal_alter('sheetnode', $form_state_node, $form, $form_state); - - drupal_execute('sheetnode_node_form', $form_state_node, (object)$node); - } - - // If more than one sheet, create a book to hold them - if (!empty($book)) { - $form_state['redirect'] = 'node/'. $book->nid; - } - else { - $form_state['redirect'] = 'node/'. $form_state_node['nid']; - } -} - -function _sheetnode_phpexcel_import_do($workbook, $sheet) { - //require_once(drupal_get_path('module', 'sheetnode') . '/socialcalc.inc'); - // require_once 'socialcalc.inc'; - $sc = array(); // SocialCalc array structure - - // Default values. - $defaultFont = $sheet->getParent()->getDefaultStyle()->getFont(); - $defaultcolwidth = $sheet->getDefaultColumnDimension()->getWidth(); - if ($defaultcolwidth > 0) { - $sc['attribs']['defaultcolwidth'] = $defaultcolwidth; - } - $defaultrowheight = $sheet->getDefaultRowDimension()->getRowHeight(); - if ($defaultrowheight > 0) { - $sc['attribs']['defaultrowheight'] = $defaultrowheight; - } - $sc['attribs']['lastrow'] = $sheet->getHighestRow(); - $lastColumn = $sheet->getHighestColumn(); - $lastColumnIndex = PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($lastColumn); - - $sc['attribs']['lastcol'] = $lastColumnIndex; - // Iterate on rows. - foreach ($rit = $sheet->getRowIterator() as $row) { - $r = $row->getRowIndex(); - $height = $sheet->getRowDimension($r)->getRowHeight(); - if ($height != -1 && $height != $sc['attribs']['defaultrowheight']) { - $sc['rowattribs']['height'][$r] = $height; - } - if (!$sheet->getRowDimension($r)->getVisible()) { - $sc['rowattribs']['hide'][$r] = TRUE; - } - - // Iterate on cells. - foreach ($cit = $row->getCellIterator() as $cell) { - $ca = $cell->getColumn(); - $c = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($ca); - $width = $sheet->getColumnDimension($ca)->getWidth(); - if ($width != -1) { - $width = PhpOffice\PhpSpreadsheet\Shared\Drawing::cellDimensionToPixels($width, $defaultFont); - if ($width != $sc['attribs']['defaultcolwidth']) { - $sc['colattribs']['width'][$c] = $width; - } - } - if (!$sheet->getColumnDimension($ca)->getVisible()) { - $sc['colattribs']['hide'][$c] = TRUE; - } - - _sheetnode_phpexcel_import_cell($workbook, $sheet, $cell, $sc); - } - } - - // Cell merges - foreach ($sheet->getMergeCells() as $range) { - list($first, $last) = explode(':', $range); - if (!isset($sc['cells'][$first])) continue; - $firstcr = socialcalc_coord_to_cr($first); - $lastcr = socialcalc_coord_to_cr($last); - $sc['cells'][$first]['colspan'] = $lastcr[0] - $firstcr[0] + 1; - $sc['cells'][$first]['rowspan'] = $lastcr[1] - $firstcr[1] + 1; - } - - // Names - foreach ($workbook->getNamedRanges() as $range) { - // TODO: Handle external references and functions. - $sc['names'][$range->getName()] = array( - 'desc' => '', - 'definition' => $range->getRange(), - ); - } - - // Reset caches. - _sheetnode_phpexcel_get_cached_styles(TRUE); - - $socialcalc = array( - 'sheet' => $sc, - 'edit' => socialcalc_default_edit($sc), - 'audit' => socialcalc_default_audit($sc), - ); - return socialcalc_save($socialcalc); -} - -function _sheetnode_phpexcel_import_cell($workbook, $sheet, $cell, &$sc) { - $c = array(); // output cell - - // Position - $c['pos'] = array(PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($cell->getColumn()), $cell->getRow()); - // Value and type - switch ($cell->getDataType()) { - case PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_BOOL: - $c['datavalue'] = (bool)$cell->getValue(); - $c['datatype'] = 'v'; - $c['valuetype'] = 'n'; - break; - case PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_NUMERIC: - $c['datavalue'] = floatval($cell->getValue()); - $c['datatype'] = 'v'; - $c['valuetype'] = 'n'; - break; - case PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING: - $text = $cell->getValue(); - if ($text instanceof PHPExcel_RichText) { - $style = $sheet->getStyle($cell->getCoordinate()); - $defaultfont = $style->getFont(); - foreach ($text->getRichTextElements() as $element) { - $font = $element instanceof PHPExcel_RichText_Run ? $element->getFont() : $defaultfont; - $cellData .= ''; - - if ($font->getSuperScript()) { - $cellData .= ''; - } else if ($font->getSubScript()) { - $cellData .= ''; - } - - // Convert UTF8 data to PCDATA - $cellText = $element->getText(); - $cellData .= htmlspecialchars($cellText); - - if ($font->getSuperScript()) { - $cellData .= ''; - } else if ($font->getSubScript()) { - $cellData .= ''; - } - - $cellData .= ''; - } - $c['datavalue'] = $cellData; - $c['valuetype'] = 'th'; - } - else { // it is plain text - $c['datavalue'] = $text; - $c['valuetype'] = 't'; - } - $c['datatype'] = 't'; - break; - case PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_FORMULA: - $c['datatype'] = 'f'; - $c['formula'] = ltrim($cell->getValue(), '='); - try { - //$c['datavalue'] = $cell->getCalculatedValue(); - $c['datavalue'] = 0; - } - catch (Exception $e) { - $c['datavalue'] = 0; - //watchdog('sheetnode_phpexcel', 'Error importing formula "!formula" at cell !coord.', array('!formula' => $c['formula'], '!coord' => $cell->getCoordinate()), 'warning'); - } - $c['valuetype'] = is_numeric($c['datavalue']) ? 'n' : 't'; - break; - case PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_ERROR: - $c['errors'] = $cell->getValue(); - break; - case PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_NULL: - break; - } - - // Comment - $comment = $sheet->getComment($cell->getCoordinate()); - if (!empty($comment)) { - $c['comment'] = $comment->getText()->getPlainText(); - } - - // Style - $style = $sheet->getStyle($cell->getCoordinate()); - $styles = _sheetnode_phpexcel_get_cached_styles(); - $hash = $style->getHashCode(); - if (empty($styles[$hash])) { - // Font - $font = _sheetnode_phpexcel_get_font($style->getFont()); - if ($font) { - $styles[$hash]['font'] = _sheetnode_phpexcel_insert_hash($sc, 'font', $font); - } - - // Color - $color = _sheetnode_phpexcel_get_color($style->getFont()->getColor()); - if ($color) { - $styles[$hash]['color'] = _sheetnode_phpexcel_insert_hash($sc, 'color', $color); - } - - // Background color - $bgcolor = _sheetnode_phpexcel_get_color($style->getFill()->getStartColor()); - if ($bgcolor) { - $styles[$hash]['bgcolor'] = _sheetnode_phpexcel_insert_hash($sc, 'color', $bgcolor); - } - - // Borders - $borders = array( - 'bt' => 'getTop', - 'bl' => 'getLeft', - 'bb' => 'getBottom', - 'br' => 'getRight', - ); - foreach ($borders as $bi => $method) { - $border = _sheetnode_phpexcel_get_border($style->getBorders()->$method()); - if ($border) { - $styles[$hash][$bi] = _sheetnode_phpexcel_insert_hash($sc, 'borderstyle', $border); - } - } - - // Cell format (horizontal alignment) - $cellformat = _sheetnode_phpexcel_get_cellformat($style); - if ($cellformat) { - $styles[$hash]['cellformat'] = _sheetnode_phpexcel_insert_hash($sc, 'cellformat', $cellformat); - } - - // Layout (padding + vertical alignment) - $layout = _sheetnode_phpexcel_get_layout($style); - if ($layout) { - $styles[$hash]['layout'] = _sheetnode_phpexcel_insert_hash($sc, 'layout', $layout); - } - - // Number format - $ntvf = _sheetnode_phpexcel_get_valueformat($style->getNumberFormat()); - if ($ntvf) { - $styles[$hash]['nontextvalueformat'] = _sheetnode_phpexcel_insert_hash($sc, 'valueformat', $ntvf); - } - } - $c += $styles[$hash]; // merge the cached styles into the cell directly. - - $sc['cells'][$cell->getCoordinate()] = $c; -} - -function _sheetnode_phpexcel_get_cached_styles($reset = FALSE) { - static $styles = array(); - if ($reset) { - $styles = array(); - } - return $styles; -} - -/** - * LIFTED FROM PHPExcel/Classes/PHPExcel/Writer/HTML.php - * Takes array where of CSS properties / values and converts to CSS string - * - * @param array - * @return string - */ -function _sheetnode_phpexcel_assembleCSS($pValue = array()) -{ - $pairs = array(); - foreach ($pValue as $property => $value) { - $pairs[] = $property . ':' . $value; - } - $string = implode('; ', $pairs); - - return $string; -} - -/** - * LIFTED FROM PHPExcel/Classes/PHPExcel/Writer/HTML.php - * Create CSS style (PHPExcel_Style_Font) - * - * @param PHPExcel_Style_Font $pStyle PHPExcel_Style_Font - * @return array - */ -function _sheetnode_phpexcel_createCSSStyleFont(PHPExcel_Style_Font $pStyle) { - // Construct CSS - $css = array(); - - // Create CSS - if ($pStyle->getBold()) { - $css['font-weight'] = 'bold'; - } - if ($pStyle->getUnderline() != PHPExcel_Style_Font::UNDERLINE_NONE && $pStyle->getStrikethrough()) { - $css['text-decoration'] = 'underline line-through'; - } else if ($pStyle->getUnderline() != PHPExcel_Style_Font::UNDERLINE_NONE) { - $css['text-decoration'] = 'underline'; - } else if ($pStyle->getStrikethrough()) { - $css['text-decoration'] = 'line-through'; - } - if ($pStyle->getItalic()) { - $css['font-style'] = 'italic'; - } - - $css['color'] = '#' . $pStyle->getColor()->getRGB(); - $css['font-family'] = '\'' . $pStyle->getName() . '\''; - $css['font-size'] = $pStyle->getSize() . 'pt'; - - // Return - return $css; -} - -function _sheetnode_phpexcel_insert_hash(&$sc, $key, $style) { - // Initialize $hash if it's not set or null - $hash = isset($sc[$key.'hash'][$style]) ? $sc[$key.'hash'][$style] : null; - - if (is_null($hash)) { - // Ensure $sc[$key.'s'] is initialized as an array if it's not set - if (!isset($sc[$key.'s']) || !is_array($sc[$key.'s'])) { - $sc[$key.'s'] = []; - } - - // Calculate the new hash value - $hash = count($sc[$key.'s']) + 1; - - // Assign $style to $sc[$key.'s'] using $hash as the index - $sc[$key.'s'][$hash] = $style; - - // Store $hash in $sc[$key.'hash'] for future reference - $sc[$key.'hash'][$style] = $hash; - } - - return $hash; -} -function _sheetnode_phpexcel_get_font($font) { - return ($font->getItalic() ? 'italic' : 'normal') .' '. - ($font->getBold() ? 'bold' : 'normal') .' '. - ($font->getSize() .'pt') .' '. - ($font->getName()); -} - -function _sheetnode_phpexcel_get_border($border) { - $borderstyles = array( - PhpOffice\PhpSpreadsheet\Style\Border::BORDER_NONE => FALSE, - PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN => 'thin solid', - PhpOffice\PhpSpreadsheet\Style\Border::BORDER_MEDIUM => 'medium solid', - PhpOffice\PhpSpreadsheet\Style\Border::BORDER_DASHED => 'thin dashed', - PhpOffice\PhpSpreadsheet\Style\Border::BORDER_DOTTED => 'thin dotted', - PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK => 'thick solid', - PhpOffice\PhpSpreadsheet\Style\Border::BORDER_DOUBLE => 'thin double', - PhpOffice\PhpSpreadsheet\Style\Border::BORDER_HAIR => 'thin dotted', // TODO: is it? - PhpOffice\PhpSpreadsheet\Style\Border::BORDER_MEDIUMDASHED => 'medium dashed', - PhpOffice\PhpSpreadsheet\Style\Border::BORDER_DASHDOT => 'thin dashed', // TODO: is it? - PhpOffice\PhpSpreadsheet\Style\Border::BORDER_MEDIUMDASHDOT => 'medium dashed', //TODO: is it? - PhpOffice\PhpSpreadsheet\Style\Border::BORDER_DASHDOTDOT => 'thin dashed', // TODO: is it? - PhpOffice\PhpSpreadsheet\Style\Border::BORDER_MEDIUMDASHDOTDOT => 'medium dashed', // TODO: is it? - PhpOffice\PhpSpreadsheet\Style\Border::BORDER_SLANTDASHDOT => 'thin dashed', // TODO: is it? - ); - $borderstyle = $borderstyles[$border->getBorderStyle()]; - if (!$borderstyle) return FALSE; - $bordercolor = _sheetnode_phpexcel_get_color($border->getColor()); - return $borderstyle .' '. $bordercolor; -} - -function _sheetnode_phpexcel_get_cellformat($style) { - $cellformats = array( - PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_GENERAL => FALSE, - PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT => 'left', - PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER => 'center', - PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT => 'right', - PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_JUSTIFY => 'justify', - PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER_CONTINUOUS => 'center', // TODO: is it? - ); - return $cellformats[$style->getAlignment()->getHorizontal()]; -} - -function _sheetnode_phpexcel_get_layout($style) { - $valignments = array( - PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP => 'top', - PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER => 'middle', - PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_BOTTOM => 'bottom', - PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_JUSTIFY => 'middle', // TODO: is it? - ); - $valignment = $valignments[$style->getAlignment()->getVertical()]; - $padding_left = $style->getAlignment()->getIndent(); - $padding_left = empty($padding_left) ? '*' : PHPExcel_Shared_Drawing::pointsToPixels($padding_left) . 'px'; - return 'padding:* * * '. $padding_left .';vertical-align:'. $valignment .';'; -} - -function _sheetnode_phpexcel_get_valueformat($numberformat) { - $valueformat = $numberformat->getFormatCode(); - if (strtolower($valueformat) == 'general') return FALSE; - $valueformat = str_replace(';@', '', $valueformat); - return $valueformat; -} - -function _sheetnode_phpexcel_get_color($color) { - $rgb = $color->getRGB(); - return 'rgb(' . hexdec(substr($rgb, 0, 2)) .','. hexdec(substr($rgb, 2, 2)) .','. hexdec(substr($rgb, 4, 2)) .')'; -} - diff --git a/Website/excelinterop/socialcalc.inc b/Website/excelinterop/socialcalc.inc deleted file mode 100644 index c676ddd..0000000 --- a/Website/excelinterop/socialcalc.inc +++ /dev/null @@ -1,857 +0,0 @@ - $part) { - $sc[$name] = call_user_func('socialcalc_parse_'. $name, $part); - } - return $sc; -} - -function socialcalc_parse_parts($data) { - // Parse the MIME header. - $matches = array(); - if (!preg_match('/^MIME-Version:\s1\.0/mi', $data, $matches)) return array(); - - $matches = array(); - if (!preg_match('/^Content-Type:\s*multipart\/mixed;\s*boundary=(\S+)/mi', $data, $matches)) return array(); - - $boundary = $matches[1]; - $matches = array(); - $count = preg_match_all("/^(--". $boundary ."(?:\r\n|\n|--))/m", $data, $matches, PREG_OFFSET_CAPTURE | PREG_PATTERN_ORDER); - if ($count === FALSE || $count < 2) return array(); - - // Parse the SocialCalc parts. - for ($i=0; $i<$count; $i++) { - if ($i == $count-1) continue; - $start = $matches[0][$i][1] + strlen($matches[1][$i][0]); - $end = $matches[0][$i+1][1]; - $part = substr($data, $start, $end - $start); - $skip = array(); - preg_match("/^Content-Type:(?:.*?)(?:\r\n|\n)(?:\r\n|\n)/mi", $part, $skip); - $part = substr($part, strlen($skip[0])); - if ($i == 0) { // Sheet header - $j = 1; - $line = strtok($part, "\n"); - while ($line !== FALSE) { - $line = rtrim($line); - $names = explode(':', $line); - if (isset($names)) switch ($names[0]) { - case 'version': - break; - case 'part': - $partnames[$j++] = $names[1]; - break; - } - $line = strtok("\n"); - } - } - else { // Sheet parts - $parts[$partnames[$i]] = $part; - } - } - return $parts; -} - -function socialcalc_parse_edit($data) { - $edit = array( - 'rowpanes' => array(0 => array('first' => 1, 'last' => 1)), - 'colpanes' => array(0 => array('first' => 1, 'last' => 1)), - 'range' => array('hasrange' => FALSE), - ); - $line = strtok($data, "\n"); - while ($line !== FALSE) { - $line = rtrim($line); - $parts = explode(':', $line); - switch ($parts[0]) { - case "version": - break; - - case "rowpane": - $edit['rowpanes'][$parts[1]-0] = array('first' => $parts[2]-0, 'last' => $parts[3]-0); - break; - - case "colpane": - $edit['colpanes'][$parts[1]-0] = array('first' => $parts[2]-0, 'last' => $parts[3]-0); - break; - - case "ecell": - $edit['ecell']['pos'] = socialcalc_coord_to_cr($parts[1]); - $edit['ecell']['coord'] = $parts[1]; - $edit['highlights'][$parts[1]] = "cursor"; - break; - - case "range": - $range['hasrange'] = TRUE; - $range['anchorcoord'] = $parts[1]; - $range['anchorpos'] = socialcalc_coord_to_cr($parts[1]); - $range['top'] = $parts[2]-0; - $range['bottom'] = $parts[3]-0; - $range['left'] = $parts[4]-0; - $range['right'] = $parts[5]-0; - for ($row=$range['top']; $row<=$range['bottom']; $row++) { - for ($col=$range['left']; $col<=$range['right']; $col++) { - $coord = socialcalc_cr_to_coord($col, $row); - if (@$edit['highlights'][$coord] != "cursor") { - $edit['highlights'][$coord] = "range"; - } - } - } - $edit['range'] = $range; - break; - - default: - $key = array_shift($parts); - $edit[$key] = $parts; - break; - } - $line = strtok("\n"); - } - return $edit; -} - -function socialcalc_parse_audit($data) { - return array(); -} - -function socialcalc_parse_sheet($data) { - $line = strtok($data, "\n"); - $sheet = array(); - while ($line !== FALSE) { - $line = rtrim($line); - $parts = explode(':', $line); - switch ($parts[0]) { - case 'cell': - $coord = $parts[1]; - $cell = isset($sheet['cells'][$coord]) ? $sheet['cells'][$coord] : array('pos' => socialcalc_coord_to_cr($coord)); - $cell += socialcalc_parse_cell($parts, 2); - $sheet['cells'][$coord] = $cell; - break; - - case "col": - $coord = $parts[1]; - $pos = socialcalc_coord_to_cr($coord .'1'); // convert to col number - $j = 2; - while ($t = @$parts[$j++]) { - switch ($t) { - case "w": - $sheet['colattribs']['width'][$pos[0]] = strval($parts[$j++]); // must be text - could be auto or %, etc. - break; - case "hide": - $sheet['colattribs']['hide'][$pos[0]] = $parts[$j++]; - break; - } - } - break; - - case "row": - $coord = intval($parts[1]); - $j = 2; - while ($t = @$parts[$j++]) { - switch ($t) { - case "h": - $sheet['rowattribs']['height'][$coord] = intval($parts[$j++]); - break; - case "hide": - $sheet['rowattribs']['hide'][$coord] = $parts[$j++]; - break; - } - } - break; - - case "sheet": - $j = 1; - while ($t = @$parts[$j++]) { - switch ($t) { - case "c": - $sheet['attribs']['lastcol'] = intval($parts[$j++]); - break; - case "r": - $sheet['attribs']['lastrow'] = intval($parts[$j++]); - break; - case "w": - $sheet['attribs']['defaultcolwidth'] = intval($parts[$j++]); - break; - case "h": - $sheet['attribs']['defaultrowheight'] = intval($parts[$j++]); - break; - case "tf": - $sheet['attribs']['defaulttextformat'] = intval($parts[$j++]); - break; - case "ntf": - $sheet['attribs']['defaultnontextformat'] = intval($parts[$j++]); - break; - case "layout": - $sheet['attribs']['defaultlayout'] = intval($parts[$j++]); - break; - case "font": - $sheet['attribs']['defaultfont'] = intval($parts[$j++]); - break; - case "tvf": - $sheet['attribs']['defaulttextvalueformat'] = intval($parts[$j++]); - break; - case "ntvf": - $sheet['attribs']['defaultnontextvalueformat'] = intval($parts[$j++]); - break; - case "color": - $sheet['attribs']['defaultcolor'] = intval($parts[$j++]); - break; - case "bgcolor": - $sheet['attribs']['defaultbgcolor'] = intval($parts[$j++]); - break; - case "circularreferencecell": - $sheet['attribs']['circularreferencecell'] = $parts[$j++]; - break; - case "recalc": - $sheet['attribs']['recalc'] = $parts[$j++]; - break; - case "needsrecalc": - $sheet['attribs']['needsrecalc'] = $parts[$j++]; - break; - case "usermaxcol": - $sheet['attribs']['usermaxcol'] = intval($parts[$j++]); - break; - case "usermaxrow": - $sheet['attribs']['usermaxrow'] = intval($parts[$j++]); - break; - default: - $j += 1; - break; - } - } - break; - - case "name": - $name = strtoupper(socialcalc_decode_value($parts[1])); - $sheet['names'][$name] = array('desc' => socialcalc_decode_value($parts[2]), - 'definition' => socialcalc_decode_value($parts[3])); - break; - - case "layout": - $parts = array(); - preg_match('/^layout\:(\d+)\:(.+)$/', $line, $parts); // layouts can have ":" in them - $sheet['layouts'][intval($parts[1])] = $parts[2]; - $sheet['layouthash'][$parts[2]] = intval($parts[1]); - break; - - case "font": - $sheet['fonts'][intval($parts[1])] = $parts[2]; - $sheet['fonthash'][$parts[2]] = intval($parts[1]); - break; - - case "color": - $sheet['colors'][intval($parts[1])] = $parts[2]; - $sheet['colorhash'][$parts[2]] = intval($parts[1]); - break; - - case "border": - $sheet['borderstyles'][intval($parts[1])] = $parts[2]; - $sheet['borderstylehash'][$parts[2]] = intval($parts[1]); - break; - - case "cellformat": - $sheet['cellformats'][intval($parts[1])] = $parts[2]; - $sheet['cellformathash'][$parts[2]] = intval($parts[1]); - break; - - case "valueformat": - $v = socialcalc_decode_value($parts[2]); - $sheet['valueformats'][intval($parts[1])] = $v; - $sheet['valueformathash'][$v] = intval($parts[1]); - break; - - case "version": - break; - - case "copiedfrom": - $sheet['copiedfrom'] = $parts[1] .':'. $parts[2]; - break; - - case "clipboardrange": // in save versions up to 1.3. Ignored. - case "clipboard": - break; - - case "": - break; - - default: - break; - } - $line = strtok("\n"); - } - return $sheet; -} - -function socialcalc_parse_cell($parts, $j) { - $cell = array(); - while ($t = @$parts[$j++]) { - switch ($t) { - case "v": - $cell['datavalue'] = doubleval(socialcalc_decode_value($parts[$j++])); - $cell['datatype'] = "v"; - $cell['valuetype'] = "n"; - break; - case "t": - $cell['datavalue'] = strval(socialcalc_decode_value($parts[$j++])); - $cell['datatype'] = "t"; - $cell['valuetype'] = "t"; - break; - case "vt": - $v = $parts[$j++]; - $cell['valuetype'] = $v; - $cell['datatype'] = $v[0]=="n" ? "v" : "t"; - $cell['datavalue'] = socialcalc_decode_value($parts[$j++]); - break; - case "vtf": - $cell['valuetype'] = strval($parts[$j++]); - $cell['datavalue'] = socialcalc_decode_value($parts[$j++]); - $cell['formula'] = strval(socialcalc_decode_value($parts[$j++])); - $cell['datatype'] = "f"; - break; - case "vtc": - $cell['valuetype'] = strval($parts[$j++]); - $cell['datavalue'] = socialcalc_decode_value($parts[$j++]); - $cell['formula'] = strval(socialcalc_decode_value($parts[$j++])); - $cell['datatype'] = "c"; - break; - case "e": - $cell['errors'] = strval(socialcalc_decode_value($parts[$j++])); - break; - case "b": - $cell['bt'] = intval($parts[$j++]); - $cell['br'] = intval($parts[$j++]); - $cell['bb'] = intval($parts[$j++]); - $cell['bl'] = intval($parts[$j++]); - break; - case "l": - $cell['layout'] = intval($parts[$j++]); - break; - case "f": - $cell['font'] = intval($parts[$j++]); - break; - case "c": - $cell['color'] = intval($parts[$j++]); - break; - case "bg": - $cell['bgcolor'] = intval($parts[$j++]); - break; - case "cf": - $cell['cellformat'] = intval($parts[$j++]); - break; - case "ntvf": - $cell['nontextvalueformat'] = intval($parts[$j++]); - break; - case "tvf": - $cell['textvalueformat'] = intval($parts[$j++]); - break; - case "colspan": - $cell['colspan'] = intval($parts[$j++]); - break; - case "rowspan": - $cell['rowspan'] = intval($parts[$j++]); - break; - case "cssc": - $cell['cssc'] = strval($parts[$j++]); - break; - case "csss": - $cell['csss'] = strval(socialcalc_decode_value($parts[$j++])); - break; - case "mod": - $j+=1; - break; - case "comment": - $cell['comment'] = strval(socialcalc_decode_value($parts[$j++])); - break; - case "ro": - $cell['readonly'] = strcmp(strtolower(strval(socialcalc_decode_value($parts[$j++]))), "yes") == 0; - break; - } - } - return $cell; -} - -function socialcalc_parse_values($data) { - $line = strtok($data, "\n"); - $sheet = array(); - while ($line !== FALSE) { - $line = rtrim($line); - $parts = explode(':', $line); - if ($parts[0] == 'cell') { - $coord = $parts[1]; - $cell = isset($sheet['cells'][$coord]) ? $sheet['cells'][$coord] : array(); - $cell += socialcalc_parse_cell_value($parts, 2); - $sheet['cells'][$coord] = $cell; - } - $line = strtok("\n"); - } - return $sheet; -} - -function socialcalc_parse_cell_value($parts, $j) { - $cell = array(); - while ($t = @$parts[$j++]) { - switch ($t) { - case "v": - $cell['datavalue'] = doubleval(socialcalc_decode_value($parts[$j++])); - break 2; // first time for me :-) - case "t": - $cell['datavalue'] = strval(socialcalc_decode_value($parts[$j++])); - break 2; - case "vt": - $j++; - $cell['datavalue'] = socialcalc_decode_value($parts[$j++]); - break 2; - case "vtf": - $j++; - $cell['datavalue'] = socialcalc_decode_value($parts[$j++]); - break 2; - case "vtc": - $j++; - $cell['datavalue'] = socialcalc_decode_value($parts[$j++]); - break 2; - } - } - return $cell; -} - -function socialcalc_save($sc) { - $result = "socialcalc:version:1.0\n" . - "MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=" . SOCIALCALC_MULTIPART_BOUNDARY . "\n" . - "--" . SOCIALCALC_MULTIPART_BOUNDARY . "\nContent-type: text/plain; charset=UTF-8\n\n" . - "# SocialCalc Spreadsheet Control Save\nversion:1.0\npart:sheet\npart:edit\npart:audit\n" . - "--" . SOCIALCALC_MULTIPART_BOUNDARY . "\nContent-type: text/plain; charset=UTF-8\n\n" . - socialcalc_save_sheet($sc['sheet']) . - "--" . SOCIALCALC_MULTIPART_BOUNDARY . "\nContent-type: text/plain; charset=UTF-8\n\n" . - socialcalc_save_edit($sc['edit']) . - "--" . SOCIALCALC_MULTIPART_BOUNDARY . "\nContent-type: text/plain; charset=UTF-8\n\n" . - socialcalc_save_audit($sc['audit']) . - "--" . SOCIALCALC_MULTIPART_BOUNDARY . "--\n"; - - return $result; -} - -function socialcalc_save_edit($edit) { - $result = "version:1.0\n"; - - if (!empty($edit['rowpanes'])) foreach ($edit['rowpanes'] as $i => $rowpane) { - $result .= "rowpane:". $i .":". $rowpane['first'] .":". $rowpane['last'] ."\n"; - } - if (!empty($edit['colpanes'])) foreach ($edit['colpanes'] as $i => $colpane) { - $result .= "colpane:". $i .":". $colpane['first'] .":". $colpane['last'] ."\n"; - } - - if (isset($edit['ecell'])) { - $result .= "ecell:". $edit['ecell']['coord'] ."\n"; - } - - if (!empty($edit['range']['hasrange'])) { - $result .= "range:". $edit['range']['anchorcoord'] .":". $edit['range']['top'] .":". $edit['range']['bottom'] .":". $edit['range']['left'] .":". $edit['range']['right'] ."\n"; - } - - return $result; -} - -function socialcalc_default_edit($sheet) { - return array( - 'rowpanes' => array('first' => 1, 'last' => isset($sheet['attribs']['lastrow']) ? $sheet['attribs']['lastrow'] : 1), - 'colpanes' => array('first' => 1, 'last' => isset($sheet['attribs']['lastcol']) ? $sheet['attribs']['lastcol'] : 1), - 'ecell' => array('coord' => 'A1'), - ); -} - -function socialcalc_save_audit($audit) { - return ''; -} - -function socialcalc_default_audit($sheet) { - return ''; -} - -function socialcalc_save_sheet($sheet) { - $sheetar = array(); - $sheetar[] = 'version:1.5'; - if (!empty($sheet['cells'])) foreach ($sheet['cells'] as $cell) { - $sheetar[] = socialcalc_save_cell($cell); - } - if (isset($sheet['colattribs'])) { - if (!empty($sheet['colattribs']['width'])) foreach ($sheet['colattribs']['width'] as $col => $width) { - $coord = socialcalc_cr_to_coord($col, 1); - $sheetar[] = 'col:'. substr($coord, 0, -1) .':w:'. $width; - } - if (!empty($sheet['colattribs']['hide'])) foreach ($sheet['colattribs']['hide'] as $col => $hide) { - $coord = socialcalc_cr_to_coord($col, 1); - $sheetar[] = 'col:'. substr($coord, 0, -1) .':hide:'. $hide; - } - } - if (isset($sheet['rowattribs'])) { - if (!empty($sheet['rowattribs']['height'])) foreach ($sheet['rowattribs']['height'] as $row => $height) { - $sheetar[] = 'row:'. $row .':h:'. $height; - } - if (!empty($sheet['rowattribs']['hide'])) foreach ($sheet['rowattribs']['hide'] as $row => $hide) { - $sheetar[] = 'row:'. $row .':hide:'. $hide; - } - } - if (!empty($sheet['fonts'])) foreach ($sheet['fonts'] as $fid => $font) { - $sheetar[] = 'font:'. $fid .':'. $font; - } - if (!empty($sheet['borderstyles'])) foreach ($sheet['borderstyles'] as $bsid => $borderstyle) { - $sheetar[] = 'border:'. $bsid .':'. $borderstyle; - } - if (!empty($sheet['cellformats'])) foreach ($sheet['cellformats'] as $cfid => $cellformat) { - $sheetar[] = 'cellformat:'. $cfid .':'. socialcalc_encode_value($cellformat); - } - if (!empty($sheet['layouts'])) foreach ($sheet['layouts'] as $lid => $layout) { - $sheetar[] = 'layout:'. $lid .':'. $layout; - } -// if (!empty($sheet['colors'])) foreach ($sheet['colors'] as $cid => $color) { -// $sheetar[] = 'color:'. $cid .':'. $color; -// } - if (!empty($sheet['valueformats'])) foreach ($sheet['valueformats'] as $vfid => $valueformat) { - $sheetar[] = 'valueformat:'. $vfid .':'. socialcalc_encode_value($valueformat); - } - if (!empty($sheet['names'])) foreach ($sheet['names'] as $name => $nameinfo) { - $sheetar[] = 'name:'. socialcalc_encode_value($name) .':'. socialcalc_encode_value($nameinfo['desc']) .':'. socialcalc_encode_value($nameinfo['definition']); - } - - $sheetfields = array( - 'lastcol' => 'c', - 'lastrow' => 'r', - 'defaultcolwidth' => 'w', - 'defaultrowheight' => 'h', - 'defaulttextformat' => 'tf', - 'defaultnontextformat' => 'ntf', - 'defaulttextvalueformat' => 'tvf', - 'defaultnontextvalueformat' => 'ntvf', - 'defaultlayout' => 'layout', - 'defaultfont' => 'font', - 'defaultcolor' => 'color', - 'defaultbgcolor' => 'bgcolor', - 'circularreferencecell' => 'circularreferencecell', - 'recalc' => 'recalc', - 'needsrecalc' => 'needsrecalc', - 'usermaxcol' => 'usermaxcol', - 'usermaxrow' => 'usermaxrow', - ); - $sheetattribs = array(); - foreach ($sheetfields as $key => $attrib) { - if (isset($sheet['attribs'][$key])) { - $sheetattribs[] = $attrib .':'. $sheet['attribs'][$key]; - } - } - if ($sheetattribs) { - $sheetar[] = 'sheet:'. implode(':', $sheetattribs); - } - -return implode("\n", (array) $sheetar) . "\n";} - -function socialcalc_save_cell($cell) { - $line = 'cell:'. socialcalc_cr_to_coord($cell['pos'][0], $cell['pos'][1]); - if (isset($cell['datavalue'])) { - $value = socialcalc_encode_value($cell['datavalue']); - if ($cell['datatype']=='v') { - if ($cell['valuetype']=='n') $line .= ':v:'. $value; - else $line .= ':vt:'. $cell['valuetype'] .':' .$value; - } - else if ($cell['datatype']=='t') { - if ($cell['valuetype']=='t') $line .= ':t:'. $value; - else $line .= ':vt:'. $cell['valuetype'] .':' .$value; - } - else if (isset($cell['formula'])) { - $formula = socialcalc_encode_value($cell['formula']); - if ($cell['datatype']=='f') - $line .= ':vtf:'. $cell['valuetype'] .':'. $value .':'. $formula; - else if ($cell['datatype']=='c') - $line .= ':vtc:'. $cell['valuetype'] .':'. $value .':'. $formula; - } - } - if (isset($cell['errors'])) { - $line .= ':e:'. socialcalc_encode_value($cell['errors']); - } - if (!empty($cell['readonly'])) { - $line .= ':ro:yes'; - } - $t = @$cell['bt']; - $r = @$cell['br']; - $b = @$cell['bb']; - $l = @$cell['bl']; - if ($t || $r || $b || $l) - $line .= ':b:'. $t .':'. $r .':'. $b .':'. $l; - if (isset($cell['layout'])) $line .= ':l:'. $cell['layout']; - if (isset($cell['font'])) $line .= ':f:'. $cell['font']; - if (isset($cell['color'])) $line .= ':c:'. $cell['color']; - if (isset($cell['bgcolor'])) $line .= ':bg:'. $cell['bgcolor']; - if (isset($cell['cellformat'])) $line .= ':cf:'. $cell['cellformat']; - if (isset($cell['textvalueformat'])) $line .= ':tvf:'. $cell['textvalueformat']; - if (isset($cell['nontextvalueformat'])) $line .= ':ntvf:'. $cell['nontextvalueformat']; - if (isset($cell['colspan'])) $line .= ':colspan:'. $cell['colspan']; - if (isset($cell['rowspan'])) $line .= ':rowspan:'. $cell['rowspan']; - if (isset($cell['cssc'])) $line .= ':cssc:' .$cell['cssc']; - if (isset($cell['csss'])) $line .= ':csss:' .socialcalc_encode_value($cell['csss']); - if (isset($cell['mod'])) $line .= ':mod:'. $cell['mod']; - if (isset($cell['comment'])) $line .= ':comment:'. socialcalc_encode_value($cell['comment']); - - return $line; -} - -function socialcalc_encode_value($s) { - if (!is_string($s)) return $s; - return str_replace( - array('\\', ':', "\n"), - array('\\b', '\\c', '\\n'), - $s - ); -} - -function socialcalc_coord_to_cr($coord) { - static $coord_to_cr = array(); - if (isset($coord_to_cr[$coord])) return $coord_to_cr[$coord]; - $c=0;$r=0; - for ($i=0; $i=97) $c = 26*$c + $ch-96; - else if ($ch>=65) $c = 26*$c + $ch-64; - } - $coord_to_cr[$coord] = array($c, $r); - return $coord_to_cr[$coord]; -} - - -function socialcalc_cr_to_coord($c, $r, $return_as_array = FALSE) { - $letters = array( "A","B","C","D","E","F","G","H","I","J","K","L","M", - "N","O","P","Q","R","S","T","U","V","W","X","Y","Z" ); - if ($c < 1) $c = 1; - if ($c > 702) $c = 702; // maximum number of columns - ZZ - if ($r < 1) $r = 1; - $collow = ($c - 1) % 26; - $colhigh = floor(($c - 1) / 26); - if ($colhigh) { - $result = array($letters[$colhigh-1] . $letters[$collow], $r); - } - else { - $result = array($letters[$collow], $r); - } - return $return_as_array ? $result : $result[0].$result[1]; -} - -function socialcalc_decode_value($s) { - if (!is_string($s)) return $s; - if (strstr($s, '\\') === FALSE) return $s; // for performace reasons: replace nothing takes up time - $r = str_replace('\\c', ':', $s); - $r = str_replace('\\n', "\n", $r); - return str_replace('\\b', '\\', $r); -} - -function socialcalc_cellformat_parsefont($cell, $sheet) { - if (empty($cell['font'])) return FALSE; - $parts = array(); - preg_match('/^(\*|\S+? \S+?) (\S+?) (\S.*)$/', $sheet['fonts'][$cell['font']], $parts); - $font = array(); - if ($parts[3] != '*') $font['family'] = $parts[3]; - if ($parts[2] != '*') $font['size'] = $parts[2]; - if ($parts[1] != '*') { - $font['bold'] = strpos($parts[1], 'bold') !== FALSE; - $font['italic'] = strpos($parts[1], 'italic') !== FALSE; - } - return $font; -} - -function socialcalc_cellformat_parsecolor($cell, $sheet, $color) { - if (empty($cell[$color])) return FALSE; - $parts = array(); - preg_match('/^rgb\((\d+?),\s*(\d+?),\s*(\d+?)\)\s*$/', $sheet['colors'][$cell[$color]], $parts); - $rgb = array( - 'r' => intval($parts[1]), - 'g' => intval($parts[2]), - 'b' => intval($parts[3]), - ); - return $rgb; -} - -function socialcalc_cellformat_parselayout($cell, $sheet) { - if (empty($cell['layout'])) return FALSE; - $parts = array(); - preg_match('/^padding:\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+);vertical-align:\s*(\S+);$/', $sheet['layouts'][$cell['layout']], $parts); - $layout = array(); - if ($parts[1] != '*') $layout['padtop'] = str_replace('px', '', $parts[1]); - if ($parts[2] != '*') $layout['padright'] = str_replace('px', '', $parts[2]); - if ($parts[3] != '*') $layout['padbottom'] = str_replace('px', '', $parts[3]); - if ($parts[4] != '*') $layout['padleft'] = str_replace('px', '', $parts[4]); - if ($parts[5] != '*') $layout['alignvert'] = $parts[5]; - return $layout; -} - -function socialcalc_cellformat_parseborder($cell, $sheet, $attrib) { - if (empty($cell[$attrib])) return FALSE; - $parts = array(); - preg_match('/^(\S+)\s+(\S+)\s+(\S.+)$/', $sheet['borderstyles'][$cell[$attrib]], $parts); - $border['thickness'] = $parts[1]; - $border['style'] = $parts[2]; - $color = array(); - preg_match('/^rgb\((\d+?),\s*(\d+?),\s*(\d+?)\)\s*$/', $parts[3], $color); - $border['color'] = array( - 'r' => intval($color[1]), - 'g' => intval($color[2]), - 'b' => intval($color[3]), - ); - return $border; -} - -// The following functions are found in: -/** - * PHPExcel - * - * Copyright (c) 2006 - 2010 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel_Shared - * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.5, 2010-12-10 - */ - -/** - * Convert a date from SocialCalc to a Unix timestamp. - * - * @param long $dateValue SocialCalc date/time value - * @return long Unix timestamp - */ -function socialcalc_export_date($dateValue = 0) { - $myBaseDate = 25569; - // Adjust for the spurious 29-Feb-1900 (Day 60) - if ($dateValue < 60) { - --$myBaseDate; - } - - // Perform conversion - if ($dateValue >= 1) { - $utcDays = $dateValue - $myBaseDate; - $returnValue = round($utcDays * 24 * 60 * 60); - if (($returnValue <= PHP_INT_MAX) && ($returnValue >= -PHP_INT_MAX)) { - $returnValue = (integer) $returnValue; - } - } else { - $hours = round($dateValue * 24); - $mins = round($dateValue * 24 * 60) - round($hours * 60); - $secs = round($dateValue * 24 * 60 * 60) - round($hours * 60 * 60) - round($mins * 60); - $returnValue = (integer) gmmktime($hours, $mins, $secs); - } - - return $returnValue; -} - -/** - * Convert a date from Excel to a PHP DateTime object - * - * @param long $dateValue SocialCalc date/time value - * @return long PHP DateTime object - */ -function socialcalc_export_datetime($dateValue = 0) { - $dateTime = socialcalc_export_date($dateValue); - $days = floor($dateTime / 86400); - $time = round((($dateTime / 86400) - $days) * 86400); - $hours = round($time / 3600); - $minutes = round($time / 60) - ($hours * 60); - $seconds = round($time) - ($hours * 3600) - ($minutes * 60); - - $dateObj = date_create('1-Jan-1970+'.$days.' days'); - $dateObj->setTime($hours,$minutes,$seconds); - - return $dateObj; -} - -/** - * Convert a date from PHP to SocialCalc date/time value - * - * @param mixed $dateValue Unix timestamp or PHP DateTime object - * @return mixed SocialCalc date/time value - * or boolean False on failure - */ -function socialcalc_import_date($dateValue = 0) { - $saveTimeZone = date_default_timezone_get(); - date_default_timezone_set('UTC'); - $retValue = False; - if ((is_object($dateValue)) && ($dateValue instanceof DateTime)) { - $retValue = socialcalc_import_date_explicit( $dateValue->format('Y'), $dateValue->format('m'), $dateValue->format('d'), - $dateValue->format('H'), $dateValue->format('i'), $dateValue->format('s') - ); - } elseif (is_numeric($dateValue)) { - $retValue = socialcalc_import_date_explicit( date('Y',$dateValue), date('m',$dateValue), date('d',$dateValue), - date('H',$dateValue), date('i',$dateValue), date('s',$dateValue) - ); - } - date_default_timezone_set($saveTimeZone); - - return $retValue; -} - -/** - * Convert a date from PHP to SocialCalc date/time value - * - * @param long $year - * @param long $month - * @param long $day - * @param long $hours - * @param long $minutes - * @param long $seconds - * @return long SocialCalc date/time value - */ -function socialcalc_import_date_explicit($year, $month, $day, $hours=0, $minutes=0, $seconds=0) { - // - // Fudge factor for the erroneous fact that the year 1900 is treated as a Leap Year in MS Excel - // This affects every date following 28th February 1900 - // - $excel1900isLeapYear = True; - if (($year == 1900) && ($month <= 2)) { $excel1900isLeapYear = False; } - $myExcelBaseDate = 2415020; - - // Julian base date Adjustment - if ($month > 2) { - $month = $month - 3; - } else { - $month = $month + 9; - --$year; - } - - // Calculate the Julian Date, then subtract the Excel base date (JD 2415020 = 31-Dec-1899 Giving Excel Date of 0) - $century = substr($year,0,2); - $decade = substr($year,2,2); - $excelDate = floor((146097 * $century) / 4) + floor((1461 * $decade) / 4) + floor((153 * $month + 2) / 5) + $day + 1721119 - $myExcelBaseDate + $excel1900isLeapYear; - - $excelTime = (($hours * 3600) + ($minutes * 60) + $seconds) / 86400; - - return (float) $excelDate + $excelTime; -} - diff --git a/Website/excelinterop/testsc.txt b/Website/excelinterop/testsc.txt deleted file mode 100644 index bad46b0..0000000 --- a/Website/excelinterop/testsc.txt +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":9,"currentname":"Issue List","currentid":"sheet0","sheetArr":{"Sheet0":{"name":"Issue List","sheetstr":{"savestr":"socialcalc:version:1.0\nMIME-Version: 1.0\nContent-Type: multipart\/mixed; boundary=SocialCalcSpreadsheetControlSave\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n# SocialCalc Spreadsheet Control Save\nversion:1.0\npart:sheet\npart:edit\npart:audit\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.5\ncell:A1:t:Issue Number:l:1:f:1:c:1:bg:1:comment:\ncell:B1:t:Summary:l:1:f:1:c:1:bg:1:comment:\ncell:C1:t:Type :l:1:f:1:c:1:bg:1:comment:\ncell:D1:t:Skills:l:1:f:1:c:1:bg:1:comment:\ncell:E1:t:Entered By:l:1:f:1:c:1:bg:1:comment:\ncell:F1:t:Assigned To:l:1:f:1:c:1:bg:1:comment:\ncell:G1:t:Priority:l:1:f:1:c:1:bg:1:comment:\ncell:H1:t:Status:l:1:f:1:c:1:bg:1:comment:\ncell:I1:t:Disposition:l:1:f:1:c:1:bg:1:comment:\ncell:J1:t:Component:l:1:f:1:c:1:bg:1:comment:\ncell:K1:t:Severity:l:1:f:1:c:1:bg:1:comment:\ncell:L1:t:Date Entered:l:1:f:1:c:1:bg:1:comment:\ncell:M1:t:Attachments\/ Notes\/ References:l:1:f:1:c:1:bg:1:comment:\ncell:N1:t:Notify To:l:1:f:1:c:1:bg:1:comment:\ncell:O1:t:Versions Found:l:1:f:1:c:1:bg:1:comment:\ncell:P1:t:Steps To Reproduce:l:1:f:1:c:1:bg:1:comment:\ncell:Q1:t:Links:l:1:f:1:c:1:bg:1:comment:\ncell:R1:t:Source Code:l:1:f:1:c:1:bg:1:comment:\ncell:S1:t:History:l:1:f:1:c:1:bg:1:comment:\ncell:A3:v:1:l:1:f:1:c:1:bg:1:comment:\ncell:B3:t:Design and Implementation of the AJAX:l:1:f:1:c:1:bg:1:comment:\ncell:C3:v:9:l:1:f:1:c:1:bg:1:comment:\ncell:D3:t:D:l:1:f:1:c:1:bg:1:comment:\ncell:E3:t:Manu:l:1:f:1:c:1:bg:1:comment:\ncell:G3:v:5:l:1:f:1:c:1:bg:1:comment:\ncell:H3:t:Basic Functionality working:l:1:f:1:c:1:bg:1:comment:\ncell:I3:v:1:l:1:f:1:c:1:bg:1:comment:\ncell:J3:v:7:l:1:f:1:c:1:bg:1:comment:\ncell:A4:v:1.1:l:1:f:1:c:1:bg:1:comment:\ncell:B4:t:Design and Implementation of Long Polling:l:1:f:1:c:1:bg:1:comment:\ncell:C4:v:9:l:1:f:1:c:1:bg:1:comment:\ncell:D4:t:D:l:1:f:1:c:1:bg:1:comment:\ncell:E4:t:Manu:l:1:f:1:c:1:bg:1:comment:\ncell:G4:v:5:l:1:f:1:c:1:bg:1:comment:\ncell:H4:t:Basic Functionality working:l:1:f:1:c:1:bg:1:comment:\ncell:I4:v:1:l:1:f:1:c:1:bg:1:comment:\ncell:J4:v:7:l:1:f:1:c:1:bg:1:comment:\ncell:A5:v:2:l:1:f:1:c:1:bg:1:comment:\ncell:B5:t:Design and Implementation of Touch Gestures:l:1:f:1:c:1:bg:1:comment:\ncell:C5:v:9:l:1:f:1:c:1:bg:1:comment:\ncell:D5:t:JS:l:1:f:1:c:1:bg:1:comment:\ncell:E5:t:Manu:l:1:f:1:c:1:bg:1:comment:\ncell:G5:v:4:l:1:f:1:c:1:bg:1:comment:\ncell:H5:t:Started:l:1:f:1:c:1:bg:1:comment:\ncell:I5:v:2:l:1:f:1:c:1:bg:1:comment:\ncell:J5:v:2:l:1:f:1:c:1:bg:1:comment:\ncell:A6:v:3:l:1:f:1:c:1:bg:1:comment:\ncell:B6:t:WebApp Design:l:1:f:1:c:1:bg:1:comment:\ncell:C6:v:6:l:1:f:1:c:1:bg:1:comment:\ncell:D6:t:D:l:1:f:1:c:1:bg:1:comment:\ncell:E6:t:Ramu:l:1:f:1:c:1:bg:1:comment:\ncell:G6:v:4:l:1:f:1:c:1:bg:1:comment:\ncell:I6:v:3:l:1:f:1:c:1:bg:1:comment:\ncell:J6:t:1,2:l:1:f:1:c:1:bg:1:comment:\ncell:M6:t:Specify flows for user interactions, home page\/landing page etc\/login,logout etc:l:1:f:1:c:1:bg:1:comment:\ncell:A8:v:5:l:1:f:1:c:1:bg:1:comment:\ncell:B8:t:Replicating OSV Spreadsheet:l:1:f:1:c:1:bg:1:comment:\ncell:C8:v:10:l:1:f:1:c:1:bg:1:comment:\ncell:D8:t:F:l:1:f:1:c:1:bg:1:comment:\ncell:E8:t:Manu:l:1:f:1:c:1:bg:1:comment:\ncell:G8:v:5:l:1:f:1:c:1:bg:1:comment:\ncell:I8:v:2:l:1:f:1:c:1:bg:1:comment:\ncell:J8:v:4:l:1:f:1:c:1:bg:1:comment:\ncell:A9:v:6:l:1:f:1:c:1:bg:1:comment:\ncell:B9:t:Context Specific User Interface:l:1:f:1:c:1:bg:1:comment:\ncell:C9:t:6,10:l:1:f:1:c:1:bg:1:comment:\ncell:D9:t:D,JS:l:1:f:1:c:1:bg:1:comment:\ncell:E9:t:Manu:l:1:f:1:c:1:bg:1:comment:\ncell:G9:v:5:l:1:f:1:c:1:bg:1:comment:\ncell:I9:v:2:l:1:f:1:c:1:bg:1:comment:\ncell:J9:v:1:l:1:f:1:c:1:bg:1:comment:\ncell:B10:t:Multiple Sheets:l:1:f:1:c:1:bg:1:comment:\ncell:C10:v:5:l:1:f:1:c:1:bg:1:comment:\ncell:D10:t:JS:l:1:f:1:c:1:bg:1:comment:\ncell:E10:t:Ramu:l:1:f:1:c:1:bg:1:comment:\ncell:G10:v:3:l:1:f:1:c:1:bg:1:comment:\ncell:I10:v:2:l:1:f:1:c:1:bg:1:comment:\ncell:J10:v:1:l:1:f:1:c:1:bg:1:comment:\ncell:B11:t:Export to PDF, Excel:l:1:f:1:c:1:bg:1:comment:\ncell:C11:v:10:l:1:f:1:c:1:bg:1:comment:\ncell:D11:t:D,JS:l:1:f:1:c:1:bg:1:comment:\ncell:E11:t:Ramu:l:1:f:1:c:1:bg:1:comment:\ncell:G11:v:4:l:1:f:1:c:1:bg:1:comment:\ncell:I11:v:2:l:1:f:1:c:1:bg:1:comment:\ncell:J11:v:3:l:1:f:1:c:1:bg:1:comment:\ncell:N11:v:4:l:1:f:1:c:1:bg:1:comment:\ncell:B12:t:Graphing:l:1:f:1:c:1:bg:1:comment:\ncell:C12:v:10:l:1:f:1:c:1:bg:1:comment:\ncell:D12:t:D,JS:l:1:f:1:c:1:bg:1:comment:\ncell:E12:t:Ramu:l:1:f:1:c:1:bg:1:comment:\ncell:G12:v:4:l:1:f:1:c:1:bg:1:comment:\ncell:I12:v:2:l:1:f:1:c:1:bg:1:comment:\ncell:J12:v:4:l:1:f:1:c:1:bg:1:comment:\ncell:M12:t:Improve graphing to make it usable:l:1:f:1:c:1:bg:1:comment:\ncell:B13:t:Print Button:l:1:f:1:c:1:bg:1:comment:\ncell:C13:v:10:l:1:f:1:c:1:bg:1:comment:\ncell:D13:t:JS:l:1:f:1:c:1:bg:1:comment:\ncell:E13:t:Ramu:l:1:f:1:c:1:bg:1:comment:\ncell:G13:v:4:l:1:f:1:c:1:bg:1:comment:\ncell:I13:v:2:l:1:f:1:c:1:bg:1:comment:\ncell:J13:v:1:l:1:f:1:c:1:bg:1:comment:\ncell:M13:t:Add a print button that can print the \"plain\" view to a printer:l:1:f:1:c:1:bg:1:comment:\ncol:A:w:50\ncol:B:w:450\ncol:C:w:73\ncol:D:w:45\ncol:E:w:80\ncol:F:w:81\ncol:G:w:45\ncol:H:w:136\ncol:I:w:70\ncol:J:w:70\ncol:K:w:50\ncol:L:w:70\ncol:M:w:120\ncol:N:w:65\ncol:O:w:60\ncol:P:w:120\ncol:Q:w:70\ncol:R:w:200\ncol:S:w:120\nrow:1:h:38.25\nrow:3:h:38.25\nrow:4:h:38.25\nrow:5:h:51\nrow:6:h:89.25\nrow:8:h:25.5\nrow:9:h:25.5\nrow:11:h:25.5\nrow:12:h:25.5\nrow:13:h:51\nfont:1:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nsheet:c:20:r:89:h:12.75\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.0\nrowpane:first::\nrowpane:last::\ncolpane:first::\ncolpane:last::\necell:A1\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n--SocialCalcSpreadsheetControlSave--\n"}},"Sheet1":{"name":"Skills","sheetstr":{"savestr":"socialcalc:version:1.0\nMIME-Version: 1.0\nContent-Type: multipart\/mixed; boundary=SocialCalcSpreadsheetControlSave\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n# SocialCalc Spreadsheet Control Save\nversion:1.0\npart:sheet\npart:edit\npart:audit\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.5\ncell:A1:t:Skills:l:1:f:1:c:1:bg:1:comment:\ncell:A2:t:D:l:1:f:1:c:1:bg:1:comment:\ncell:B2:t:Design:l:1:f:1:c:1:bg:1:comment:\ncell:A3:t:P:l:1:f:1:c:1:bg:1:comment:\ncell:B3:t:Packaging:l:1:f:1:c:1:bg:1:comment:\ncell:A4:t:B:l:1:f:1:c:1:bg:1:comment:\ncell:B4:t:Build Master:l:1:f:1:c:1:bg:1:comment:\ncell:A5:t:JS:l:1:f:1:c:1:bg:1:comment:\ncell:B5:t:JavaScript Expertise:l:1:f:1:c:1:bg:1:comment:\ncell:A6:t:Py:l:1:f:1:c:1:bg:1:comment:\ncell:B6:t:Python Expertise:l:1:f:1:c:1:bg:1:comment:\ncell:A7:t:Server:l:1:f:1:c:1:bg:1:comment:\ncell:B7:t:Server side management expertise:l:1:f:1:c:1:bg:1:comment:\ncell:A8:t:F:l:1:f:1:c:1:bg:1:comment:\ncell:B8:t:Functionality Expertise:l:1:f:1:c:1:bg:1:comment:\ncol:A:w:120\ncol:B:w:120\nrow:5:h:25.5\nrow:7:h:38.25\nrow:8:h:25.5\nfont:1:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nsheet:c:20:r:99:h:12.75\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.0\nrowpane:first::\nrowpane:last::\ncolpane:first::\ncolpane:last::\necell:A1\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n--SocialCalcSpreadsheetControlSave--\n"}},"Sheet2":{"name":"Type","sheetstr":{"savestr":"socialcalc:version:1.0\nMIME-Version: 1.0\nContent-Type: multipart\/mixed; boundary=SocialCalcSpreadsheetControlSave\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n# SocialCalc Spreadsheet Control Save\nversion:1.0\npart:sheet\npart:edit\npart:audit\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.5\ncell:A1:t:Test Case:l:1:f:1:c:1:bg:1:comment:\ncell:A2:t:Support Reported:l:1:f:1:c:1:bg:1:comment:\ncell:A3:t:Performance :l:1:f:1:c:1:bg:1:comment:\ncell:A4:t:Feature Request:l:1:f:1:c:1:bg:1:comment:\ncell:A5:t:Enhancement:l:1:f:1:c:1:bg:1:comment:\ncell:A6:t:UI Workflow:l:1:f:1:c:1:bg:1:comment:\ncell:A7:t:Inquiry:l:1:f:1:c:1:bg:1:comment:\ncell:A8:t:Regression:l:1:f:1:c:1:bg:1:comment:\ncell:A9:t:Engineering Task:l:1:f:1:c:1:bg:1:comment:\ncell:A10:t:Functionality:l:1:f:1:c:1:bg:1:comment:\ncol:A:w:120\nfont:1:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nsheet:c:20:r:100:h:12.75\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.0\nrowpane:first::\nrowpane:last::\ncolpane:first::\ncolpane:last::\necell:A1\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n--SocialCalcSpreadsheetControlSave--\n"}},"Sheet3":{"name":"Component","sheetstr":{"savestr":"socialcalc:version:1.0\nMIME-Version: 1.0\nContent-Type: multipart\/mixed; boundary=SocialCalcSpreadsheetControlSave\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n# SocialCalc Spreadsheet Control Save\nversion:1.0\npart:sheet\npart:edit\npart:audit\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.5\ncell:H1:t:Component Number:l:1:f:1:c:1:bg:1:comment:\ncell:I1:t:Component Name:l:1:f:1:c:1:bg:1:comment:\ncell:H3:v:1:l:1:f:1:c:1:bg:1:comment:\ncell:I3:t:User Interface:l:1:f:1:c:1:bg:1:comment:\ncell:H4:v:2:l:1:f:1:c:1:bg:1:comment:\ncell:I4:t:Interaction:l:1:f:1:c:1:bg:1:comment:\ncell:H5:v:3:l:1:f:1:c:1:bg:1:comment:\ncell:I5:t:Server Side Management:l:1:f:1:c:1:bg:1:comment:\ncell:H6:v:4:l:1:f:1:c:1:bg:1:comment:\ncell:I6:t:Application:l:1:f:1:c:1:bg:1:comment:\ncell:H7:v:5:l:1:f:1:c:1:bg:1:comment:\ncell:I7:t:Software Update:l:1:f:1:c:1:bg:1:comment:\ncell:H8:v:6:l:1:f:1:c:1:bg:1:comment:\ncell:I8:t:Parameter Settings:l:1:f:1:c:1:bg:1:comment:\ncell:H9:v:7:l:1:f:1:c:1:bg:1:comment:\ncell:I9:t:Platform:l:1:f:1:c:1:bg:1:comment:\ncell:H10:v:8:l:1:f:1:c:1:bg:1:comment:\ncell:I10:t:Automation:l:1:f:1:c:1:bg:1:comment:\ncol:H:w:120\ncol:I:w:120\nrow:1:h:25.5\nrow:5:h:25.5\nrow:8:h:25.5\nfont:1:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nsheet:c:20:r:100:h:12.75\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.0\nrowpane:first::\nrowpane:last::\ncolpane:first::\ncolpane:last::\necell:A1\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n--SocialCalcSpreadsheetControlSave--\n"}},"Sheet4":{"name":"Priority","sheetstr":{"savestr":"socialcalc:version:1.0\nMIME-Version: 1.0\nContent-Type: multipart\/mixed; boundary=SocialCalcSpreadsheetControlSave\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n# SocialCalc Spreadsheet Control Save\nversion:1.0\npart:sheet\npart:edit\npart:audit\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.5\ncell:A1:t:Priority Level:l:1:f:1:c:1:bg:1:comment:\ncell:B1:t:Priority Name:l:1:f:1:c:1:bg:1:comment:\ncell:A2:v:5:l:1:f:1:c:1:bg:1:comment:\ncell:B2:t:Fix in next build:l:1:f:1:c:1:bg:1:comment:\ncell:A3:v:4:l:1:f:1:c:1:bg:1:comment:\ncell:B3:t:Fix before next release:l:1:f:1:c:1:bg:1:comment:\ncell:A4:v:3:l:1:f:1:c:1:bg:1:comment:\ncell:B4:t:Fix if possible before release:l:1:f:1:c:1:bg:1:comment:\ncell:A5:v:2:l:1:f:1:c:1:bg:1:comment:\ncell:B5:t:Fix if time available:l:1:f:1:c:1:bg:1:comment:\ncell:A6:v:1:l:1:f:1:c:1:bg:1:comment:\ncell:B6:t:Feature Request:l:1:f:1:c:1:bg:1:comment:\ncol:A:w:120\ncol:B:w:120\nrow:3:h:25.5\nrow:4:h:25.5\nrow:5:h:25.5\nfont:1:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nsheet:c:20:r:100:h:12.75\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.0\nrowpane:first::\nrowpane:last::\ncolpane:first::\ncolpane:last::\necell:A1\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n--SocialCalcSpreadsheetControlSave--\n"}},"Sheet5":{"name":"Severity","sheetstr":{"savestr":"socialcalc:version:1.0\nMIME-Version: 1.0\nContent-Type: multipart\/mixed; boundary=SocialCalcSpreadsheetControlSave\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n# SocialCalc Spreadsheet Control Save\nversion:1.0\npart:sheet\npart:edit\npart:audit\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.5\ncell:A1:t:Severity Level:l:1:f:1:c:1:bg:1:comment:\ncell:B1:t:Severity Name:l:1:f:1:c:1:bg:1:comment:\ncell:A2:v:1:l:1:f:1:c:1:bg:1:comment:\ncell:B2:t:Crash, No workaround:l:1:f:1:c:1:bg:1:comment:\ncell:A3:v:2:l:1:f:1:c:1:bg:1:comment:\ncell:B3:t:Crash, Workaround:l:1:f:1:c:1:bg:1:comment:\ncell:A4:v:3:l:1:f:1:c:1:bg:1:comment:\ncell:B4:t:Incorrect Results:l:1:f:1:c:1:bg:1:comment:\ncell:A5:v:4:l:1:f:1:c:1:bg:1:comment:\ncell:B5:t:Loss of Functionality:l:1:f:1:c:1:bg:1:comment:\ncell:A6:v:5:l:1:f:1:c:1:bg:1:comment:\ncell:B6:t:Resource Leak:l:1:f:1:c:1:bg:1:comment:\ncell:A7:v:6:l:1:f:1:c:1:bg:1:comment:\ncell:B7:t:Performance:l:1:f:1:c:1:bg:1:comment:\ncell:A8:v:7:l:1:f:1:c:1:bg:1:comment:\ncell:B8:t:Inconsistency:l:1:f:1:c:1:bg:1:comment:\ncell:A9:v:8:l:1:f:1:c:1:bg:1:comment:\ncell:B9:t:Cosmetic:l:1:f:1:c:1:bg:1:comment:\ncell:A10:v:9:l:1:f:1:c:1:bg:1:comment:\ncell:B10:t:Platform Incompatibility:l:1:f:1:c:1:bg:1:comment:\ncell:A11:v:10:l:1:f:1:c:1:bg:1:comment:\ncell:B11:t:Feature Request:l:1:f:1:c:1:bg:1:comment:\ncell:A12:v:11:l:1:f:1:c:1:bg:1:comment:\ncell:B12:t:Documentation:l:1:f:1:c:1:bg:1:comment:\ncell:A13:v:12:l:1:f:1:c:1:bg:1:comment:\ncell:B13:t:Review Request:l:1:f:1:c:1:bg:1:comment:\ncol:A:w:120\ncol:B:w:120\nrow:2:h:25.5\nrow:3:h:25.5\nrow:5:h:25.5\nrow:10:h:25.5\nfont:1:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nsheet:c:20:r:100:h:12.75\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.0\nrowpane:first::\nrowpane:last::\ncolpane:first::\ncolpane:last::\necell:A1\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n--SocialCalcSpreadsheetControlSave--\n"}},"Sheet6":{"name":"Status","sheetstr":{"savestr":"socialcalc:version:1.0\nMIME-Version: 1.0\nContent-Type: multipart\/mixed; boundary=SocialCalcSpreadsheetControlSave\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n# SocialCalc Spreadsheet Control Save\nversion:1.0\npart:sheet\npart:edit\npart:audit\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.5\ncell:A1:t:Status Level:l:1:f:1:c:1:bg:1:comment:\ncell:B1:t:Status Name:l:1:f:1:c:1:bg:1:comment:\ncell:A2:v:1:l:1:f:1:c:1:bg:1:comment:\ncell:B2:t:Release for Design:l:1:f:1:c:1:bg:1:comment:\ncell:A3:v:2:l:1:f:1:c:1:bg:1:comment:\ncell:B3:t:Assigned:l:1:f:1:c:1:bg:1:comment:\ncell:A4:v:3:l:1:f:1:c:1:bg:1:comment:\ncell:B4:t:Open to Development:l:1:f:1:c:1:bg:1:comment:\ncell:A5:v:4:l:1:f:1:c:1:bg:1:comment:\ncell:B5:t:Fixed for Testing:l:1:f:1:c:1:bg:1:comment:\ncell:A6:v:5:l:1:f:1:c:1:bg:1:comment:\ncell:B6:t:Tested by QA:l:1:f:1:c:1:bg:1:comment:\ncell:A7:v:6:l:1:f:1:c:1:bg:1:comment:\ncell:B7:t:Closed Verified\/ Open Verify, Failed:l:1:f:1:c:1:bg:1:comment:\ncol:A:w:120\ncol:B:w:120\nrow:2:h:25.5\nrow:4:h:25.5\nrow:7:h:38.25\nfont:1:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nsheet:c:20:r:100:h:12.75\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.0\nrowpane:first::\nrowpane:last::\ncolpane:first::\ncolpane:last::\necell:A1\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n--SocialCalcSpreadsheetControlSave--\n"}},"Sheet7":{"name":"Assignments","sheetstr":{"savestr":"socialcalc:version:1.0\nMIME-Version: 1.0\nContent-Type: multipart\/mixed; boundary=SocialCalcSpreadsheetControlSave\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n# SocialCalc Spreadsheet Control Save\nversion:1.0\npart:sheet\npart:edit\npart:audit\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.5\nsheet:c:20:r:100:h:12.75\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.0\nrowpane:first::\nrowpane:last::\ncolpane:first::\ncolpane:last::\necell:A1\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n--SocialCalcSpreadsheetControlSave--\n"}},"Sheet8":{"name":"Disposition","sheetstr":{"savestr":"socialcalc:version:1.0\nMIME-Version: 1.0\nContent-Type: multipart\/mixed; boundary=SocialCalcSpreadsheetControlSave\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n# SocialCalc Spreadsheet Control Save\nversion:1.0\npart:sheet\npart:edit\npart:audit\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.5\ncell:A1:t:Platform Issue:l:1:f:1:c:1:bg:1:comment:\ncell:A2:t:Product Specific Issue:l:1:f:1:c:1:bg:1:comment:\ncell:A3:t:Need Input:l:1:f:1:c:1:bg:1:comment:\ncell:A4:t:Reviewed:l:1:f:1:c:1:bg:1:comment:\ncell:A5:t:Not Reviewed:l:1:f:1:c:1:bg:1:comment:\ncell:A6:t:Investigating:l:1:f:1:c:1:bg:1:comment:\ncol:A:w:120\nrow:2:h:25.5\nfont:1:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nsheet:c:20:r:100:h:12.75\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\nversion:1.0\nrowpane:first::\nrowpane:last::\ncolpane:first::\ncolpane:last::\necell:A1\n--SocialCalcSpreadsheetControlSave\nContent-type: text\/plain; charset=UTF-8\n\n--SocialCalcSpreadsheetControlSave--\n"}}}} \ No newline at end of file diff --git a/Website/excelinterop/tmp/10-Year-property-investment-template.xls b/Website/excelinterop/tmp/10-Year-property-investment-template.xls deleted file mode 100644 index 6aae300..0000000 Binary files a/Website/excelinterop/tmp/10-Year-property-investment-template.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/11_1040-1.xls b/Website/excelinterop/tmp/11_1040-1.xls deleted file mode 100644 index 8b92ef6..0000000 Binary files a/Website/excelinterop/tmp/11_1040-1.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/24monthsalesforecast.xls b/Website/excelinterop/tmp/24monthsalesforecast.xls deleted file mode 100644 index d3157b4..0000000 Binary files a/Website/excelinterop/tmp/24monthsalesforecast.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/2ndsemresult.xps b/Website/excelinterop/tmp/2ndsemresult.xps deleted file mode 100644 index 0292d96..0000000 Binary files a/Website/excelinterop/tmp/2ndsemresult.xps and /dev/null differ diff --git a/Website/excelinterop/tmp/Accounts.xls b/Website/excelinterop/tmp/Accounts.xls deleted file mode 100644 index 6ea078a..0000000 Binary files a/Website/excelinterop/tmp/Accounts.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/BANK14.XLS b/Website/excelinterop/tmp/BANK14.XLS deleted file mode 100644 index d414b63..0000000 Binary files a/Website/excelinterop/tmp/BANK14.XLS and /dev/null differ diff --git a/Website/excelinterop/tmp/Bill_Snow_Financial_Model_2004_03_09.xls b/Website/excelinterop/tmp/Bill_Snow_Financial_Model_2004_03_09.xls deleted file mode 100644 index 776213a..0000000 Binary files a/Website/excelinterop/tmp/Bill_Snow_Financial_Model_2004_03_09.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/BondValu.XLS b/Website/excelinterop/tmp/BondValu.XLS deleted file mode 100644 index f91d795..0000000 Binary files a/Website/excelinterop/tmp/BondValu.XLS and /dev/null differ diff --git a/Website/excelinterop/tmp/Business Loan Proceeds14.xls b/Website/excelinterop/tmp/Business Loan Proceeds14.xls deleted file mode 100644 index 34f3de8..0000000 Binary files a/Website/excelinterop/tmp/Business Loan Proceeds14.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/BusinessAcquisitionWorksheet.xls b/Website/excelinterop/tmp/BusinessAcquisitionWorksheet.xls deleted file mode 100644 index a19b4c9..0000000 Binary files a/Website/excelinterop/tmp/BusinessAcquisitionWorksheet.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/BusinessIndebtedness.xls b/Website/excelinterop/tmp/BusinessIndebtedness.xls deleted file mode 100644 index 709aea0..0000000 Binary files a/Website/excelinterop/tmp/BusinessIndebtedness.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/BusinessLoanProceeds.xls b/Website/excelinterop/tmp/BusinessLoanProceeds.xls deleted file mode 100644 index 8b6b1bb..0000000 Binary files a/Website/excelinterop/tmp/BusinessLoanProceeds.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/BusinessValuation.xls b/Website/excelinterop/tmp/BusinessValuation.xls deleted file mode 100644 index 65c157e..0000000 Binary files a/Website/excelinterop/tmp/BusinessValuation.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/Buyout.XLS b/Website/excelinterop/tmp/Buyout.XLS deleted file mode 100644 index 26eb8d1..0000000 Binary files a/Website/excelinterop/tmp/Buyout.XLS and /dev/null differ diff --git a/Website/excelinterop/tmp/CashBudget.xls b/Website/excelinterop/tmp/CashBudget.xls deleted file mode 100644 index 3695228..0000000 Binary files a/Website/excelinterop/tmp/CashBudget.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/CashFlVl.XLS b/Website/excelinterop/tmp/CashFlVl.XLS deleted file mode 100644 index 89cba7a..0000000 Binary files a/Website/excelinterop/tmp/CashFlVl.XLS and /dev/null differ diff --git a/Website/excelinterop/tmp/CashFlowForecastMonths.xls b/Website/excelinterop/tmp/CashFlowForecastMonths.xls deleted file mode 100644 index cdb4744..0000000 Binary files a/Website/excelinterop/tmp/CashFlowForecastMonths.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/CashFlowQuarterly.xls b/Website/excelinterop/tmp/CashFlowQuarterly.xls deleted file mode 100644 index 45e4ebb..0000000 Binary files a/Website/excelinterop/tmp/CashFlowQuarterly.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/CashFlowSensitivityAnalysis3.xls b/Website/excelinterop/tmp/CashFlowSensitivityAnalysis3.xls deleted file mode 100644 index 52e2d09..0000000 Binary files a/Website/excelinterop/tmp/CashFlowSensitivityAnalysis3.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/Cashflowforecast12months.xls b/Website/excelinterop/tmp/Cashflowforecast12months.xls deleted file mode 100644 index 9e4343a..0000000 Binary files a/Website/excelinterop/tmp/Cashflowforecast12months.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/Copy%20of%202012%20Monthly%20Calendar%20-%20Portrait.xls b/Website/excelinterop/tmp/Copy%20of%202012%20Monthly%20Calendar%20-%20Portrait.xls deleted file mode 100644 index bcdcb61..0000000 Binary files a/Website/excelinterop/tmp/Copy%20of%202012%20Monthly%20Calendar%20-%20Portrait.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/CorporateEarningsAnalysis8.xls b/Website/excelinterop/tmp/CorporateEarningsAnalysis8.xls deleted file mode 100644 index 6b386b7..0000000 Binary files a/Website/excelinterop/tmp/CorporateEarningsAnalysis8.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/DisasterPreparednessPlan(10).txt b/Website/excelinterop/tmp/DisasterPreparednessPlan(10).txt deleted file mode 100644 index 9411a7f..0000000 --- a/Website/excelinterop/tmp/DisasterPreparednessPlan(10).txt +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":6,"currentid":"sheet1","currentname":"sheet1","sheetArr":{"sheet1":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Emergency Plan - Master Checklist:f:3:c:3:bg:1:cf:1:colspan:2\ncell:B5:t:Chk:b:1:1:1:1:f:2:cf:1\ncell:C5:t:List:b:1:1:1:1:f:2:cf:1\ncell:B7:t:Family Emergency Plan:b:1:1:1:1:f:2:colspan:2\ncell:B8:b::1::1\ncell:C8:b::1::1\ncell:A9:b::1::\ncell:B9:b::1::1:tvf:1\ncell:C9:t:meet with family members to discuss how to respond to the dangers of fire, severe weather, earthquakes, and other emergencies.:b::1::1\ncell:D9:b::::1\ncell:A10:b::1::\ncell:B10:b::1::1:bg:2:tvf:1\ncell:C10:t:find the safe spots in your home for each type of disaster:b::1::1:bg:2\ncell:D10:b::::1\ncell:A11:b::1::\ncell:B11:b::1::1:tvf:1\ncell:C11:t:discuss what to do about power outages and injuries:b::1::1\ncell:D11:b::::1\ncell:A12:b::1::\ncell:B12:b::1::1:bg:2:tvf:1\ncell:C12:t:draw a floor plan of your home and mark two escape routes from each route:b::1::1:bg:2\ncell:D12:b::::1\ncell:A13:b::1::\ncell:B13:b::1::1:tvf:1\ncell:C13:t:post emergency phone numbers near telephones:b::1::1\ncell:D13:b::::1\ncell:A14:b::1::\ncell:B14:b::1::1:bg:2:tvf:1\ncell:C14:t:teach children how and when to call 911, police, and fire:b::1::1:bg:2\ncell:D14:b::::1\ncell:A15:b::1::\ncell:B15:b::1::1:tvf:1\ncell:C15:t:instruct family members to turn on the radio for information:b::1::1\ncell:D15:b::::1\ncell:A16:b::1::\ncell:B16:b::1::1:bg:2:tvf:1\ncell:C16:t:pick one out-of-state and one local friend/family member to call in a disaster:b::1::1:bg:2\ncell:D16:b::::1\ncell:A17:b::1::\ncell:B17:b::1::1:tvf:1\ncell:C17:t:teach children the phone numbers:b::1::1\ncell:D17:b::::1\ncell:A18:b::1::\ncell:B18:b::1::1:bg:2:tvf:1\ncell:C18:t:pick two reunion locations, one right outside of your home, and one away from your neighborhood in case you cannot return:b::1::1:bg:2\ncell:D18:b::::1\ncell:A19:b::1::\ncell:B19:b::1::1:tvf:1\ncell:C19:t: take a basic first aid and CPR class:b::1::1\ncell:D19:b::::1\ncell:A20:b::1::\ncell:B20:b::1::1:bg:2:tvf:1\ncell:C20:b::1::1:bg:2\ncell:D20:b::::1\ncell:A21:b::1::\ncell:B21:b::1:1:1:tvf:1\ncell:C21:b::1:1:1\ncell:D21:b::::1\ncell:B22:tvf:1\ncell:B23:tvf:1\ncell:B24:t:Disaster Supplies Kit:b:1:1:1:1:f:2:colspan:2\ncell:A25:b::1::\ncell:B25:b::1::1:tvf:1\ncell:C25:b::1::1\ncell:D25:b::::1\ncell:A26:b::1::\ncell:B26:b::1::1:tvf:1\ncell:C26:t:supply of water (one gallon per person per day):b::1::1\ncell:D26:b::::1\ncell:A27:b::1::\ncell:B27:b::1::1:bg:2:tvf:1\ncell:C27:t:first aid kit and prescription medications:b::1::1:bg:2\ncell:D27:b::::1\ncell:A28:b::1::\ncell:B28:b::1::1:tvf:1\ncell:C28:t:extra pair of glasses, or contact solution:b::1::1\ncell:D28:b::::1\ncell:A29:b::1::\ncell:B29:b::1::1:bg:2:tvf:1\ncell:C29:t:credit cards and cash:b::1::1:bg:2\ncell:D29:b::::1\ncell:A30:b::1::\ncell:B30:b::1::1:tvf:1\ncell:C30:t:change of clothes and sturdy shoes:b::1::1\ncell:D30:b::::1\ncell:A31:b::1::\ncell:B31:b::1::1:bg:2:tvf:1\ncell:C31:t:battery powered radio, and extra batteries:b::1::1:bg:2\ncell:D31:b::::1\ncell:A32:b::1::\ncell:B32:b::1::1:tvf:1\ncell:C32:t:blankets or sleeping bags, rain poncho, body warmer, glow stick, tarp to make a tent:b::1::1\ncell:D32:b::::1\ncell:A33:b::1::\ncell:B33:b::1::1:bg:2:tvf:1\ncell:C33:t:list of emergency plan contact info:b::1::1:bg:2\ncell:D33:b::::1\ncell:A34:b::1::\ncell:B34:b::1::1:tvf:1\ncell:C34:t:booster cables for car, car shovel, rope, N95 dust mask, working gloves:b::1::1\ncell:D34:b::::1\ncell:A35:b::1::\ncell:B35:b::1::1:bg:2:tvf:1\ncell:C35:t:flashlight with batteries, or hand-crank flashlight:b::1::1:bg:2\ncell:D35:b::::1\ncell:A36:b::1::\ncell:B36:b::1::1:tvf:1\ncell:C36:t:wind/waterproof matches, and candle, plastic trash bags:b::1::1\ncell:D36:b::::1\ncell:A37:b::1::\ncell:B37:b::1::1:bg:2:tvf:1\ncell:C37:t:personal hygiene products (baby stuff, soap, tooth care, toilet paper, hair ties, wet wipes):b::1::1:bg:2\ncell:D37:b::::1\ncell:A38:b::1::\ncell:B38:b::1::1:tvf:1\ncell:C38:t:tire repair kit and pump, duct tape, swiss army knife, maps of surrounding areas, sewing kit, blank CD or SOS for signaling for help, whistle, multi-purpose tool (screwdriver, knife, saw, pliers, can opener etc), PowerCap (baseball type hat with built in headlights):b::1::1\ncell:D38:b::::1\ncell:A39:b::1::\ncell:B39:b::1::1:bg:2:tvf:1\ncell:C39:b::1::1:bg:2\ncell:D39:b::::1\ncell:A40:b::1::\ncell:B40:b::1:1:1:tvf:1\ncell:C40:b::1:1:1\ncell:D40:b::::1\ncell:B41:tvf:1\ncell:B42:tvf:1\ncell:B43:t:Evacuation List:b:1:1:1:1:f:2:colspan:2\ncell:A44:b::1::\ncell:B44:b::1::1:tvf:1\ncell:C44:b::1::1\ncell:D44:b::::1\ncell:A45:b::1::\ncell:B45:b::1::1:tvf:1\ncell:C45:t:listen to a battery powered radio for the location of emergency shelters:b::1::1\ncell:D45:b::::1\ncell:A46:b::1::\ncell:B46:b::1::1:bg:2:tvf:1\ncell:C46:t:make arrangements for pets:b::1::1:bg:2\ncell:D46:b::::1\ncell:A47:b::1::\ncell:B47:b::1::1:tvf:1\ncell:C47:t:wear protective clothing and sturdy shoes :b::1::1\ncell:D47:b::::1\ncell:A48:b::1::\ncell:B48:b::1::1:bg:2:tvf:1\ncell:C48:t:take your disaster supplies kit:b::1::1:bg:2\ncell:D48:b::::1\ncell:A49:b::1::\ncell:B49:b::1::1:tvf:1\ncell:C49:t:lock your house:b::1::1\ncell:D49:b::::1\ncell:A50:b::1::\ncell:B50:b::1::1:bg:2:tvf:1\ncell:C50:t:use travel routes specified by local officials:b::1::1:bg:2\ncell:D50:b::::1\ncell:A51:b::1::\ncell:B51:b::1::1:tvf:1\ncell:C51:t:shut off water, gas, and electricity:b::1::1\ncell:D51:b::::1\ncell:A52:b::1::\ncell:B52:b::1::1:bg:2:tvf:1\ncell:C52:t:let others know when you left and where you are going:b::1::1:bg:2\ncell:D52:b::::1\ncell:A53:b::1::\ncell:B53:b::1::1:tvf:1\ncell:C53:b::1::1\ncell:D53:b::::1\ncell:A54:b::1::\ncell:B54:b::1:1:1:bg:2:tvf:1\ncell:C54:b::1:1:1:bg:2\ncell:D54:b::::1\ncell:B57:t:Notes:f:2:colspan:2\ncell:B58:b:::1::colspan:2\ncell:B59:b:1::1::bg:2:colspan:2\ncell:C59:b:1:::\ncell:B60:b:1::1::colspan:2\ncell:C60:b:1:::\ncell:B61:b:1::1::bg:2:colspan:2\ncell:C61:b:1:::\ncell:B62:b:1::1::colspan:2\ncell:C62:b:1:::\ncell:B63:b:1::1::bg:2:colspan:2\ncell:C63:b:1:::\ncell:B64:b:1:::\ncell:C64:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:641\nsheet:c:4:r:64:font:1:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt arial,helvetica,sans-serif\nfont:2:* 14pt *\nfont:3:* 22pt *\nlayout:1:padding:4px 4px 4px 4px;vertical-align:*;\nvalueformat:1:text-html\n"},"name":"sheet1","hidden":"0"},"sheet2":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Emergency Essentials:f:3:c:3:bg:1:cf:1:colspan:2\ncell:B5:t:Chk:b:1:1:1:1:f:2:cf:1\ncell:C5:t:List:b:1:1:1:1:f:2:cf:1\ncell:B7:t:Family Emergency Plan:b:1:1:1:1:f:2:colspan:2\ncell:B8:b::1::1\ncell:C8:b::1::1\ncell:A9:b::1::\ncell:B9:b::1::1:tvf:1\ncell:C9:t:Birth certificates:b::1::1\ncell:D9:b::::1\ncell:A10:b::1::\ncell:B10:b::1::1:bg:2:tvf:1\ncell:C10:t:Passports:b::1::1:bg:2\ncell:D10:b::::1\ncell:A11:b::1::\ncell:B11:b::1::1:tvf:1\ncell:C11:t:Social security cards:b::1::1\ncell:D11:b::::1\ncell:A12:b::1::\ncell:B12:b::1::1:bg:2:tvf:1\ncell:C12:t:Copies of your credit cards front and back:b::1::1:bg:2\ncell:D12:b::::1\ncell:A13:b::1::\ncell:B13:b::1::1:tvf:1\ncell:C13:t:Homeowners insurance policy:b::1::1\ncell:D13:b::::1\ncell:A14:b::1::\ncell:B14:b::1::1:bg:2:tvf:1\ncell:C14:t:Auto insurance policy:b::1::1:bg:2\ncell:D14:b::::1\ncell:A15:b::1::\ncell:B15:b::1::1:tvf:1\ncell:C15:t:Life insurance policy:b::1::1\ncell:D15:b::::1\ncell:A16:b::1::\ncell:B16:b::1::1:bg:2:tvf:1\ncell:C16:t:Bank statements:b::1::1:bg:2\ncell:D16:b::::1\ncell:A17:b::1::\ncell:B17:b::1::1:tvf:1\ncell:C17:t:Retirement statements:b::1::1\ncell:D17:b::::1\ncell:A18:b::1::\ncell:B18:b::1::1:bg:2:tvf:1\ncell:C18:t:Internet passwords (banking, personal, work etc):b::1::1:bg:2\ncell:D18:b::::1\ncell:A19:b::1::\ncell:B19:b::1::1:tvf:1\ncell:C19:t:Immunization records:b::1::1\ncell:D19:b::::1\ncell:A20:b::1::\ncell:B20:b::1::1:bg:2:tvf:1\ncell:C20:t:Utility statements:b::1::1:bg:2\ncell:D20:b::::1\ncell:A21:b::1::\ncell:B21:b::1::1:tvf:1\ncell:C21:t:Utility statements:b::1::1\ncell:D21:b::::1\ncell:A22:b::1::\ncell:B22:b::1::1:bg:2:tvf:1\ncell:C22:t:Work/tax documents that would be difficult to replace:b::1::1:bg:2\ncell:D22:b::::1\ncell:A23:b::1::\ncell:B23:b::1::1:tvf:1\ncell:C23:t:CASH - keep a variety of small bills on hand:b::1::1\ncell:D23:b::::1\ncell:A24:b::1::\ncell:B24:b::1::1:bg:2:tvf:1\ncell:C24:b::1::1:bg:2\ncell:D24:b::::1\ncell:A25:b::1::\ncell:B25:b::1:1:1:tvf:1\ncell:C25:b::1:1:1\ncell:D25:b::::1\ncell:B26:tvf:1\ncell:B28:t:Notes:f:2:colspan:2\ncell:B29:b:::1::colspan:2\ncell:B30:b:1::1::bg:2:colspan:2\ncell:B31:b:1::1::colspan:2\ncell:B32:b:1::1::bg:2:colspan:2\ncell:B33:b:1::1::colspan:2\ncell:B34:b:1::1::bg:2:colspan:2\ncol:A:w:10\ncol:B:w:42\ncol:C:w:641\nsheet:c:4:r:34:needsrecalc:yes:font:1:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt arial,helvetica,sans-serif\nfont:2:* 14pt *\nfont:3:* 22pt *\nlayout:1:padding:4px 4px 4px 4px;vertical-align:*;\nvalueformat:1:text-html\n"},"name":"sheet2","hidden":"0"},"sheet3":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Food Supplies:f:3:c:3:bg:1:cf:1:colspan:5\ncell:B5:t:Chk:b:1:1:1:1:f:2:cf:1\ncell:C5:t:List:b:1:1:1:1:f:2:cf:1\ncell:D5:t:No. / Kit:b:1:1:1:1:f:2:cf:1\ncell:E5:t:No.of Kits:b:1:1:1:1:f:2:cf:1\ncell:F5:t:Total:b:1:1:1:1:f:2:cf:1\ncell:B6:b::1::1\ncell:C6:b::1::1\ncell:D6:b::1::1\ncell:E6:b::1::1\ncell:F6:b::1::1\ncell:A7:b::1::\ncell:B7:b::1::1:tvf:1\ncell:C7:t:Tang (1/4 cup each serving):b::1::1\ncell:D7:b::1::1\ncell:E7:b::1::1\ncell:F7:vtf:t::if(or(d7=\"\",e7=\"\"),\"\",d7*e7):b::1::1\ncell:A8:b::1::\ncell:B8:b::1::1:bg:2:tvf:1\ncell:C8:t:instant oatmeal:b::1::1:bg:2\ncell:D8:b::1::1:bg:2\ncell:E8:b::1::1:bg:2\ncell:F8:vtf:t::IF(OR(D8=\"\",E8=\"\"),\"\",D8*E8):b::1::1:bg:2\ncell:A9:b::1::\ncell:B9:b::1::1:tvf:1\ncell:C9:t:granola bars:b::1::1\ncell:D9:b::1::1\ncell:E9:b::1::1\ncell:F9:vtf:t::IF(OR(D9=\"\",E9=\"\"),\"\",D9*E9):b::1::1\ncell:A10:b::1::\ncell:B10:b::1::1:bg:2:tvf:1\ncell:C10:t:cocoa mix (1/4 cup each):b::1::1:bg:2\ncell:D10:b::1::1:bg:2\ncell:E10:b::1::1:bg:2\ncell:F10:vtf:t::IF(OR(D10=\"\",E10=\"\"),\"\",D10*E10):b::1::1:bg:2\ncell:A11:b::1::\ncell:B11:b::1::1:tvf:1\ncell:C11:t:single serving stew or pasta with “pop top” lid:b::1::1\ncell:D11:b::1::1\ncell:E11:b::1::1\ncell:F11:vtf:t::IF(OR(D11=\"\",E11=\"\"),\"\",D11*E11):b::1::1\ncell:A12:b::1::\ncell:B12:b::1::1:bg:2:tvf:1\ncell:C12:t:gum:b::1::1:bg:2\ncell:D12:b::1::1:bg:2\ncell:E12:b::1::1:bg:2\ncell:F12:vtf:t::IF(OR(D12=\"\",E12=\"\"),\"\",D12*E12):b::1::1:bg:2\ncell:A13:b::1::\ncell:B13:b::1::1:tvf:1\ncell:C13:t:jolly rancher candy:b::1::1\ncell:D13:b::1::1\ncell:E13:b::1::1\ncell:F13:vtf:t::IF(OR(D13=\"\",E13=\"\"),\"\",D13*E13):b::1::1\ncell:A14:b::1::\ncell:B14:b::1::1:bg:2:tvf:1\ncell:C14:t:beanie weenies with “pop top” lid:b::1::1:bg:2\ncell:D14:b::1::1:bg:2\ncell:E14:b::1::1:bg:2\ncell:F14:vtf:t::IF(OR(D14=\"\",E14=\"\"),\"\",D14*E14):b::1::1:bg:2\ncell:A15:b::1::\ncell:B15:b::1::1:tvf:1\ncell:C15:t:.5 oz fruit roll-ups:b::1::1\ncell:D15:b::1::1\ncell:E15:b::1::1\ncell:F15:vtf:t::IF(OR(D15=\"\",E15=\"\"),\"\",D15*E15):b::1::1\ncell:A16:b::1::\ncell:B16:b::1::1:bg:2:tvf:1\ncell:C16:t:single serving Lipton Noodles:b::1::1:bg:2\ncell:D16:b::1::1:bg:2\ncell:E16:b::1::1:bg:2\ncell:F16:vtf:t::IF(OR(D16=\"\",E16=\"\"),\"\",D16*E16):b::1::1:bg:2\ncell:A17:b::1::\ncell:B17:b::1::1:tvf:1\ncell:C17:t:1 oz. package raisins:b::1::1\ncell:D17:b::1::1\ncell:E17:b::1::1\ncell:F17:vtf:t::IF(OR(D17=\"\",E17=\"\"),\"\",D17*E17):b::1::1\ncell:A18:b::1::\ncell:B18:b::1::1:bg:2:tvf:1\ncell:C18:t:1 oz. package beef jerky:b::1::1:bg:2\ncell:D18:b::1::1:bg:2\ncell:E18:b::1::1:bg:2\ncell:F18:vtf:t::IF(OR(D18=\"\",E18=\"\"),\"\",D18*E18):b::1::1:bg:2\ncell:A19:b::1::\ncell:B19:b::1::1:tvf:1\ncell:C19:t:plastic spoons:b::1::1\ncell:D19:b::1::1\ncell:E19:b::1::1\ncell:F19:vtf:t::IF(OR(D19=\"\",E19=\"\"),\"\",D19*E19):b::1::1\ncell:A20:b::1::\ncell:B20:b::1::1:bg:2:tvf:1\ncell:C20:t:matches:b::1::1:bg:2\ncell:D20:b::1::1:bg:2\ncell:E20:b::1::1:bg:2\ncell:F20:vtf:t::IF(OR(D20=\"\",E20=\"\"),\"\",D20*E20):b::1::1:bg:2\ncell:A21:b::1::\ncell:B21:b::1::1:tvf:1\ncell:C21:t:snack-size zip lock bags for Tang and cocoa:b::1::1\ncell:D21:b::1::1\ncell:E21:b::1::1\ncell:F21:vtf:t::IF(OR(D21=\"\",E21=\"\"),\"\",D21*E21):b::1::1\ncell:A22:b::1::\ncell:B22:b::1::1:bg:2:tvf:1\ncell:C22:t:clear packing tape to close:b::1::1:bg:2\ncell:D22:b::1::1:bg:2\ncell:E22:b::1::1:bg:2\ncell:F22:vtf:t::IF(OR(D22=\"\",E22=\"\"),\"\",D22*E22):b::1::1:bg:2\ncell:A23:b::1::\ncell:B23:b::1::1:tvf:1\ncell:C23:t:wing stove:b::1::1\ncell:D23:b::1::1\ncell:E23:b::1::1\ncell:F23:vtf:t::IF(OR(D23=\"\",E23=\"\"),\"\",D23*E23):b::1::1\ncell:A24:b::1::\ncell:B24:b::1::1:bg:2:tvf:1\ncell:C24:t:fuel pellets :b::1::1:bg:2\ncell:D24:b::1::1:bg:2\ncell:E24:b::1::1:bg:2\ncell:F24:vtf:t::IF(OR(D24=\"\",E24=\"\"),\"\",D24*E24):b::1::1:bg:2\ncell:A25:b::1::\ncell:B25:b::1::1:tvf:1\ncell:C25:b::1::1\ncell:D25:b::1::1\ncell:E25:b::1::1\ncell:F25:vtf:t::IF(OR(D25=\"\",E25=\"\"),\"\",D25*E25):b::1::1\ncell:A26:b::1::\ncell:B26:b::1::1:bg:2:tvf:1\ncell:C26:b::1::1:bg:2\ncell:D26:b::1::1:bg:2\ncell:E26:b::1::1:bg:2\ncell:F26:vtf:t::IF(OR(D26=\"\",E26=\"\"),\"\",D26*E26):b::1::1:bg:2\ncell:A27:b::1::\ncell:B27:b::1:1:1:tvf:1\ncell:C27:b::1:1:1\ncell:D27:b::1:1:1\ncell:E27:b::1:1:1\ncell:F27:vtf:t::IF(OR(D27=\"\",E27=\"\"),\"\",D27*E27):b::1:1:1\ncell:B28:tvf:1\ncell:B30:t:Notes:f:2:colspan:2\ncell:B31:b:::1::colspan:5\ncell:B32:b:1::1::bg:2:colspan:5\ncell:B33:b:::1::colspan:5\ncell:B34:b:1::1::bg:2:colspan:5\ncell:B35:b:::1::colspan:5\ncell:B36:b:1::1::bg:2:colspan:5\ncol:A:w:10\ncol:B:w:42\ncol:C:w:401\nsheet:c:6:r:36:needsrecalc:yes:font:1:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt arial,helvetica,sans-serif\nfont:2:* 14pt *\nfont:3:* 22pt *\nlayout:1:padding:4px 4px 4px 4px;vertical-align:*;\nvalueformat:1:text-html\n"},"name":"sheet3","hidden":"0"},"sheet4":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Contacts:f:3:c:3:bg:1:cf:1:colspan:2\ncell:B6:t:Out-of-State-Contact\\c:b:1:1:1:1:f:2:colspan:2\ncell:C6:b::1::\ncell:B7:t:Name\\c:b::1::1\ncell:C7:b::1::\ncell:B8:t:City\\c:b::1::1:bg:2\ncell:C8:b::1:::bg:2\ncell:B9:t:Telephone\\c:b::1:1:1\ncell:C9:b::1:1:\ncell:B10:colspan:2\ncell:C10:b::1::\ncell:B11:t:Local Contact\\c:b:1:1:1:1:f:2:colspan:2\ncell:C11:b::1::\ncell:B12:t:Name\\c:b::1::1\ncell:C12:b::1::\ncell:B13:t:Telephone\\c:b::1:1:1:bg:2\ncell:C13:b::1:1::bg:2\ncell:B14:colspan:2\ncell:C14:b::1::\ncell:B15:t:Nearest Relative\\c:b:1:1:1:1:f:2:colspan:2\ncell:C15:b::1::\ncell:B16:t:Name\\c:b::1::1\ncell:C16:b::1::\ncell:B17:t:City\\c:b::1::1:bg:2\ncell:C17:b::1:::bg:2\ncell:B18:t:Telephone\\c:b::1:1:1\ncell:C18:b::1:1:\ncell:B19:colspan:2\ncell:C19:b::1::\ncell:B20:t:Family Work Numbers\\c:b:1:1:1:1:f:2:colspan:2\ncell:C20:b::1::\ncell:B21:t:Mother\\c:b::1::1\ncell:C21:b::1::\ncell:B22:t:Father\\c:b::1::1:bg:2\ncell:C22:b::1:::bg:2\ncell:B23:t:Other\\c:b::1:1:1\ncell:C23:b::1:1:\ncell:B24:colspan:2\ncell:C24:b::1::\ncell:B25:t:Emergency Telephone Numbers\\c:b:1:1:1:1:f:2:colspan:2\ncell:C25:b::1::\ncell:B26:t:Police Department\\c:b::1::1\ncell:C26:b::1::\ncell:B27:t:Fire Department\\c:b::1::1:bg:2\ncell:C27:b::1:::bg:2\ncell:B28:t:Hopsital\\c:b::1:1:1\ncell:C28:b::1:1:\ncell:B29:colspan:2\ncell:C29:b::1::\ncell:B30:t:Family Physicians\\c:b:1:1:1:1:f:2:colspan:2\ncell:C30:b::1::\ncell:B31:t:Name\\c:b::1::1\ncell:C31:b::1::\ncell:B32:t:Telephone\\c:b::1::1:bg:2\ncell:C32:b::1:::bg:2\ncell:B33:t:Name\\c:b::1::1\ncell:C33:b::1::\ncell:B34:t:Telephone\\c:b::1:1:1:bg:2\ncell:C34:b::1:1::bg:2\ncell:B35:colspan:2\ncell:C35:b::1::\ncell:B36:t:Reunion Locations\\c:b:1:1:1:1:f:2:colspan:2\ncell:C36:b::1::\ncell:B37:t:Right outside home\\c:b::1::1\ncell:C37:b::1::\ncell:B38:t:Address\\c:b::1::1:bg:2\ncell:C38:b::1:::bg:2\ncell:B39:t:Away from home\\c:b::1::1\ncell:C39:b::1::\ncell:B40:t:Address\\c:b::1::1:bg:2\ncell:C40:b::1:::bg:2\ncell:B41:t:Telephone\\c:b::1::1\ncell:C41:b::1::\ncell:B42:t:Route to try first\\c:b::1:1:1:bg:2\ncell:C42:b::1:1::bg:2\ncell:B44:t:Others:b:1:1:1:1:f:2:colspan:2\ncell:A45:b::1::\ncell:B45:t:Other:b::1::1\ncell:C45:b::1::1\ncell:D45:b::::1\ncell:A46:b::1::\ncell:B46:t:Other:b::1::1:bg:2\ncell:C46:b::1::1:bg:2\ncell:D46:b::::1\ncell:A47:b::1::\ncell:B47:t:Other:b::1:1:1\ncell:C47:b::1:1:1\ncell:D47:b::::1\ncell:B50:t:Notes:f:2:colspan:2\ncell:B51:b:::1::colspan:2\ncell:B52:b:1::1::bg:2:colspan:2\ncell:B53:b:1::1::colspan:2\ncell:B54:b:1::1::bg:2:colspan:2\ncell:B55:b:1::1::colspan:2\ncell:B56:b:1::1::bg:2:colspan:2\ncol:A:w:10\ncol:B:w:142\ncol:C:w:534\nsheet:c:4:r:56:needsrecalc:yes:font:1:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt arial,helvetica,sans-serif\nfont:2:* 14pt *\nfont:3:* 22pt *\nlayout:1:padding:4px 4px 4px 4px;vertical-align:*;\n"},"name":"sheet4","hidden":"0"},"sheet5":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Car Kit:f:3:c:3:bg:1:cf:1:colspan:2\ncell:B5:t:Chk:b:1:1:1:1:f:2:cf:1\ncell:C5:t:List:b:1:1:1:1:f:2:cf:1\ncell:B7:t:Family Emergency Plan:b:1:1:1:1:f:2:colspan:2\ncell:B8:b::1::1\ncell:C8:b::1::1\ncell:A9:b::1::\ncell:B9:b::1::1:tvf:1\ncell:C9:t:Water (a case of bottles would be excellent):b::1::1\ncell:D9:b::::1\ncell:A10:b::1::\ncell:B10:b::1::1:bg:2:tvf:1\ncell:C10:t:72 hour kit food, high calorie meal bars, or other snacks:b::1::1:bg:2\ncell:D10:b::::1\ncell:A11:b::1::\ncell:B11:b::1::1:tvf:1\ncell:C11:t:Cash ($20-30 in small bills and include some change):b::1::1\ncell:D11:b::::1\ncell:A12:b::1::\ncell:B12:b::1::1:bg:2:tvf:1\ncell:C12:t:Diapers/Wipes if you have kids:b::1::1:bg:2\ncell:D12:b::::1\ncell:A13:b::1::\ncell:B13:b::1::1:tvf:1\ncell:C13:t:Emergency blankets/hand warmers (or an old spare comforter):b::1::1\ncell:D13:b::::1\ncell:A14:b::1::\ncell:B14:b::1::1:bg:2:tvf:1\ncell:C14:t:Jumper cables:b::1::1:bg:2\ncell:D14:b::::1\ncell:A15:b::1::\ncell:B15:b::1::1:tvf:1\ncell:C15:t:Car shovel/pick:b::1::1\ncell:D15:b::::1\ncell:A16:b::1::\ncell:B16:b::1::1:bg:2:tvf:1\ncell:C16:t:Pocket knife:b::1::1:bg:2\ncell:D16:b::::1\ncell:A17:b::1::\ncell:B17:b::1::1:tvf:1\ncell:C17:t:First aid kit:b::1::1\ncell:D17:b::::1\ncell:A18:b::1::\ncell:B18:b::1::1:bg:2:tvf:1\ncell:C18:t:Radio:b::1::1:bg:2\ncell:D18:b::::1\ncell:A19:b::1::\ncell:B19:b::1::1:tvf:1\ncell:C19:t:Package of batteries (for flashlight and radio):b::1::1\ncell:D19:b::::1\ncell:A20:b::1::\ncell:B20:b::1::1:bg:2:tvf:1\ncell:C20:t:Toilet paper roll:b::1::1:bg:2\ncell:D20:b::::1\ncell:A21:b::1::\ncell:B21:b::1::1:tvf:1\ncell:C21:t:Spare clothes for small children:b::1::1\ncell:D21:b::::1\ncell:A22:b::1::\ncell:B22:b::1::1:bg:2:tvf:1\ncell:C22:t:Coffee can heater :b::1::1:bg:2\ncell:D22:b::::1\ncell:A23:b::1::\ncell:B23:b::1::1:tvf:1\ncell:C23:b::1::1\ncell:D23:b::::1\ncell:A24:b::1::\ncell:B24:b::1::1:bg:2:tvf:1\ncell:C24:b::1::1:bg:2\ncell:D24:b::::1\ncell:A25:b::1::\ncell:B25:b::1:1:1:tvf:1\ncell:C25:b::1:1:1\ncell:D25:b::::1\ncell:B26:tvf:1\ncell:B28:t:Notes:f:2:colspan:2\ncell:B29:b:::1::colspan:2\ncell:B30:b:1::1::bg:2:colspan:2\ncell:B31:b:1::1::colspan:2\ncell:B32:b:1::1::bg:2:colspan:2\ncell:B33:b:1::1::colspan:2\ncell:B34:b:1::1::bg:2:colspan:2\ncol:A:w:10\ncol:B:w:42\ncol:C:w:641\nsheet:c:4:r:34:needsrecalc:yes:font:1:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt arial,helvetica,sans-serif\nfont:2:* 14pt *\nfont:3:* 22pt *\nlayout:1:padding:4px 4px 4px 4px;vertical-align:*;\nvalueformat:1:text-html\n"},"name":"sheet5","hidden":"0"},"sheet6":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:To Do List:l:3:f:4:c:3:bg:1:cf:1:colspan:4\ncell:D3:l:3:f:2\ncell:E3:l:3:f:2\ncell:F3:l:3:f:2\ncell:C4:l:3:f:2\ncell:D4:l:3:f:2\ncell:E4:l:3:f:2\ncell:F4:l:3:f:2\ncell:H4:l:1:f:6:cf:2\ncell:C5:l:3:f:2\ncell:D5:l:3:f:2\ncell:E5:t:For \\c:l:2:f:2:cf:3\ncell:F5:b:::1::l:3:f:2\ncell:H5:l:1:f:5:cf:2\ncell:C6:l:3:f:2\ncell:D6:l:3:f:2\ncell:E6:l:3:f:2\ncell:F6:b:1::::l:3:f:2:cf:3\ncell:C7:l:3:f:2\ncell:D7:l:3:f:2\ncell:E7:l:3:f:2\ncell:F7:l:3:f:2\ncell:C8:t:Priority:l:3:f:3:c:3:bg:1:cf:1\ncell:D8:t:Owner:l:3:f:3:c:3:bg:1:cf:1\ncell:E8:t:Project / Task:l:3:f:3:c:3:bg:1:cf:1\ncell:F8:t:Notes:l:3:f:3:c:3:bg:1:cf:1\ncell:G8:l:1:f:1\ncell:B9:l:1:cf:2\ncell:C9:b:1:1:1:1:l:3:f:2:cf:2\ncell:D9:b:1:1:1:1:l:3:f:2:cf:2\ncell:E9:b:1:1:1:1:l:3:f:2:cf:2\ncell:F9:b:1:1:1:1:l:3:f:2:cf:2\ncell:G9:l:1:f:1:cf:2\ncell:H9:l:1:cf:2\ncell:B10:l:1:cf:2\ncell:C10:b:1:1:1:1:l:3:f:2:cf:2\ncell:D10:b:1:1:1:1:l:3:f:2:cf:2\ncell:E10:b:1:1:1:1:l:3:f:2:cf:2\ncell:F10:b:1:1:1:1:l:3:f:2:cf:2\ncell:G10:b::::2:l:1:f:1:cf:2\ncell:H10:l:1:cf:2\ncell:B11:l:1:cf:2\ncell:C11:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D11:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E11:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F11:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G11:b::::2:l:1:f:1:cf:2\ncell:H11:l:1:cf:2\ncell:B12:l:1:cf:2\ncell:C12:b:1:1:1:1:l:3:f:2:cf:2\ncell:D12:b:1:1:1:1:l:3:f:2:cf:2\ncell:E12:b:1:1:1:1:l:3:f:2:cf:2\ncell:F12:b:1:1:1:1:l:3:f:2:cf:2\ncell:G12:b::::2:l:1:f:1:cf:2\ncell:H12:l:1:cf:2\ncell:B13:l:1:cf:2\ncell:C13:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D13:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E13:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F13:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G13:b::::2:l:1:f:1:cf:2\ncell:H13:l:1:cf:2\ncell:B14:l:1:cf:2\ncell:C14:b:1:1:1:1:l:3:f:2:cf:2\ncell:D14:b:1:1:1:1:l:3:f:2:cf:2\ncell:E14:b:1:1:1:1:l:3:f:2:cf:2\ncell:F14:b:1:1:1:1:l:3:f:2:cf:2\ncell:G14:b::::2:l:1:f:1:cf:2\ncell:H14:l:1:cf:2\ncell:B15:l:1:cf:2\ncell:C15:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D15:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E15:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F15:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G15:b::::2:l:1:f:1:cf:2\ncell:H15:l:1:cf:2\ncell:B16:l:1:cf:2\ncell:C16:b:1:1:1:1:l:3:f:2:cf:2\ncell:D16:b:1:1:1:1:l:3:f:2:cf:2\ncell:E16:b:1:1:1:1:l:3:f:2:cf:2\ncell:F16:b:1:1:1:1:l:3:f:2:cf:2\ncell:G16:b::::2:l:1:f:1:cf:2\ncell:H16:l:1:cf:2\ncell:B17:l:1:cf:2\ncell:C17:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D17:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E17:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F17:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G17:b::::2:l:1:f:1:cf:2\ncell:H17:l:1:cf:2\ncell:B18:l:1:cf:2\ncell:C18:b:1:1:1:1:l:3:f:2:cf:2\ncell:D18:b:1:1:1:1:l:3:f:2:cf:2\ncell:E18:b:1:1:1:1:l:3:f:2:cf:2\ncell:F18:b:1:1:1:1:l:3:f:2:cf:2\ncell:G18:b::::2:l:1:f:1:cf:2\ncell:H18:l:1:cf:2\ncell:B19:l:1:cf:2\ncell:C19:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D19:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E19:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F19:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G19:b::::2:l:1:f:1:cf:2\ncell:H19:l:1:cf:2\ncell:B20:l:1:cf:2\ncell:C20:b:1:1:1:1:l:3:f:2:cf:2\ncell:D20:b:1:1:1:1:l:3:f:2:cf:2\ncell:E20:b:1:1:1:1:l:3:f:2:cf:2\ncell:F20:b:1:1:1:1:l:3:f:2:cf:2\ncell:G20:b::::2:l:1:f:1:cf:2\ncell:H20:l:1:cf:2\ncell:B21:l:1:cf:2\ncell:C21:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D21:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E21:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F21:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G21:b::::2:l:1:f:1:cf:2\ncell:H21:l:1:cf:2\ncell:B22:l:1:cf:2\ncell:C22:b:1:1:1:1:l:3:f:2:cf:2\ncell:D22:b:1:1:1:1:l:3:f:2:cf:2\ncell:E22:b:1:1:1:1:l:3:f:2:cf:2\ncell:F22:b:1:1:1:1:l:3:f:2:cf:2\ncell:G22:b::::2:l:1:f:1:cf:2\ncell:H22:l:1:cf:2\ncell:B23:l:1:cf:2\ncell:C23:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D23:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E23:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F23:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G23:b::::2:l:1:f:1:cf:2\ncell:H23:l:1:cf:2\ncell:B24:l:1:cf:2\ncell:C24:b:1:1:1:1:l:3:f:2:cf:2\ncell:D24:b:1:1:1:1:l:3:f:2:cf:2\ncell:E24:b:1:1:1:1:l:3:f:2:cf:2\ncell:F24:b:1:1:1:1:l:3:f:2:cf:2\ncell:G24:b::::2:l:1:f:1:cf:2\ncell:H24:l:1:cf:2\ncell:B25:l:1:cf:2\ncell:C25:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D25:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E25:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F25:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G25:b::::2:l:1:f:1:cf:2\ncell:H25:l:1:cf:2\ncell:B26:l:1:cf:2\ncell:C26:b:1:1:1:1:l:3:f:2:cf:2\ncell:D26:b:1:1:1:1:l:3:f:2:cf:2\ncell:E26:b:1:1:1:1:l:3:f:2:cf:2\ncell:F26:b:1:1:1:1:l:3:f:2:cf:2\ncell:G26:b::::2:l:1:f:1:cf:2\ncell:H26:l:1:cf:2\ncell:B27:l:1:cf:2\ncell:C27:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D27:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E27:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F27:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G27:b::::2:l:1:f:1:cf:2\ncell:H27:l:1:cf:2\ncell:B28:l:1:cf:2\ncell:C28:b:1:1:1:1:l:3:f:2:cf:2\ncell:D28:b:1:1:1:1:l:3:f:2:cf:2\ncell:E28:b:1:1:1:1:l:3:f:2:cf:2\ncell:F28:b:1:1:1:1:l:3:f:2:cf:2\ncell:G28:b::::2:l:1:f:1:cf:2\ncell:H28:l:1:cf:2\ncell:B29:l:1:cf:2\ncell:C29:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D29:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E29:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F29:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G29:b::::2:l:1:f:1:cf:2\ncell:H29:l:1:cf:2\ncell:B30:l:1:cf:2\ncell:C30:b:1:1:1:1:l:3:f:2:cf:2\ncell:D30:b:1:1:1:1:l:3:f:2:cf:2\ncell:E30:b:1:1:1:1:l:3:f:2:cf:2\ncell:F30:b:1:1:1:1:l:3:f:2:cf:2\ncell:G30:b::::2:l:1:f:1:cf:2\ncell:H30:l:1:cf:2\ncell:B31:l:1:cf:2\ncell:C31:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D31:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E31:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F31:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G31:b::::2:l:1:f:1:cf:2\ncell:H31:l:1:cf:2\ncell:B32:l:1:cf:2\ncell:C32:b:1:1:1:1:l:3:f:2:cf:2\ncell:D32:b:1:1:1:1:l:3:f:2:cf:2\ncell:E32:b:1:1:1:1:l:3:f:2:cf:2\ncell:F32:b:1:1:1:1:l:3:f:2:cf:2\ncell:G32:b::::2:l:1:f:1:cf:2\ncell:H32:l:1:cf:2\ncell:B33:l:1:cf:2\ncell:C33:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D33:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E33:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F33:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G33:b::::2:l:1:f:1:cf:2\ncell:H33:l:1:cf:2\ncell:B34:l:1:cf:2\ncell:C34:b:1:1:1:1:l:3:f:2:cf:2\ncell:D34:b:1:1:1:1:l:3:f:2:cf:2\ncell:E34:b:1:1:1:1:l:3:f:2:cf:2\ncell:F34:b:1:1:1:1:l:3:f:2:cf:2\ncell:G34:b::::2:l:1:f:1:cf:2\ncell:H34:l:1:cf:2\ncell:B35:l:1:cf:2\ncell:C35:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D35:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E35:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F35:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G35:b::::2:l:1:f:1:cf:2\ncell:H35:l:1:cf:2\ncell:B36:l:1:cf:2\ncell:C36:b:1:1:1:1:l:3:f:2:cf:2\ncell:D36:b:1:1:1:1:l:3:f:2:cf:2\ncell:E36:b:1:1:1:1:l:3:f:2:cf:2\ncell:F36:b:1:1:1:1:l:3:f:2:cf:2\ncell:G36:b::::2:l:1:f:1:cf:2\ncell:H36:l:1:cf:2\ncell:B37:l:1:cf:2\ncell:C37:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D37:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E37:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F37:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G37:b::::2:l:1:f:1:cf:2\ncell:H37:l:1:cf:2\ncell:B38:l:1:cf:2\ncell:C38:b:1:1:1:1:l:3:f:2:cf:2\ncell:D38:b:1:1:1:1:l:3:f:2:cf:2\ncell:E38:b:1:1:1:1:l:3:f:2:cf:2\ncell:F38:b:1:1:1:1:l:3:f:2:cf:2\ncell:G38:b::::2:l:1:f:1:cf:2\ncell:H38:l:1:cf:2\ncell:B39:l:1:cf:2\ncell:C39:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D39:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E39:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F39:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G39:b::::2:l:1:f:1:cf:2\ncell:H39:l:1:cf:2\ncell:B40:l:1:cf:2\ncell:C40:b:1:1:1:1:l:3:f:2:cf:2\ncell:D40:b:1:1:1:1:l:3:f:2:cf:2\ncell:E40:b:1:1:1:1:l:3:f:2:cf:2\ncell:F40:b:1:1:1:1:l:3:f:2:cf:2\ncell:G40:b::::2:l:1:f:1:cf:2\ncell:H40:l:1:cf:2\ncell:B41:l:1:cf:2\ncell:C41:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D41:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E41:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F41:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G41:b::::2:l:1:f:1:cf:2\ncell:H41:l:1:cf:2\ncell:B42:l:1:cf:2\ncell:C42:b:1:1:1:1:l:3:f:2:cf:2\ncell:D42:b:1:1:1:1:l:3:f:2:cf:2\ncell:E42:b:1:1:1:1:l:3:f:2:cf:2\ncell:F42:b:1:1:1:1:l:3:f:2:cf:2\ncell:G42:b::::2:l:1:f:1:cf:2\ncell:H42:l:1:cf:2\ncell:B43:l:1:cf:2\ncell:C43:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D43:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E43:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F43:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G43:b::::2:l:1:f:1:cf:2\ncell:H43:l:1:cf:2\ncell:B44:l:1:cf:2\ncell:C44:b:1:1:1:1:l:3:f:2:cf:2\ncell:D44:b:1:1:1:1:l:3:f:2:cf:2\ncell:E44:b:1:1:1:1:l:3:f:2:cf:2\ncell:F44:b:1:1:1:1:l:3:f:2:cf:2\ncell:G44:b::::2:l:1:f:1:cf:2\ncell:H44:l:1:cf:2\ncell:B45:l:1:cf:2\ncell:C45:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:D45:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:E45:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:F45:b:1:1:1:1:l:3:f:2:bg:2:cf:2\ncell:G45:b::::2:l:1:f:1:cf:2\ncell:H45:l:1:cf:2\ncell:B46:l:1:cf:2\ncell:C46:b:1:1:1:1:l:3:f:2:cf:2\ncell:D46:b:1:1:1:1:l:3:f:2:cf:2\ncell:E46:b:1:1:1:1:l:3:f:2:cf:2\ncell:F46:b:1:1:1:1:l:3:f:2:cf:2\ncell:G46:b::::2:l:1:f:1:cf:2\ncell:H46:l:1:cf:2\ncell:B47:l:1:cf:2\ncell:C47:l:1:cf:2\ncell:D47:l:1:cf:2\ncell:E47:l:1:cf:2\ncell:F47:l:1:cf:2\ncell:G47:l:1:cf:2\ncell:H47:l:1:cf:2\ncell:B48:l:1:cf:2\ncell:C48:l:1:cf:2\ncell:D48:l:1:cf:2\ncell:E48:l:1:cf:2\ncell:F48:l:1:cf:2\ncell:G48:l:1:cf:2\ncell:H48:l:1:cf:2\ncell:B49:l:1:cf:2\ncell:C49:l:1:cf:2\ncell:D49:l:1:cf:2\ncell:E49:l:1:cf:2\ncell:F49:l:1:cf:2\ncell:G49:l:1:cf:2\ncell:H49:l:1:cf:2\ncell:B50:l:1:cf:2\ncell:C50:l:1:cf:2\ncell:D50:l:1:cf:2\ncell:E50:l:1:cf:2\ncell:F50:l:1:cf:2\ncell:G50:l:1:cf:2\ncell:H50:l:1:cf:2\ncell:B51:l:1:cf:2\ncell:C51:l:1:cf:2\ncell:D51:l:1:cf:2\ncell:E51:l:1:cf:2\ncell:F51:l:1:cf:2\ncell:G51:l:1:cf:2\ncell:H51:l:1:cf:2\ncell:B52:l:1:cf:2\ncell:C52:l:1:cf:2\ncell:D52:l:1:cf:2\ncell:E52:l:1:cf:2\ncell:F52:l:1:cf:2\ncell:G52:l:1:cf:2\ncell:H52:l:1:cf:2\ncol:A:w:10\ncol:B:w:10\ncol:C:w:70\ncol:D:w:99\ncol:E:w:232\ncol:F:w:278\ncol:G:w:64\ncol:H:w:152\nrow:1:h:26.25\nrow:2:h:26.25\nrow:3:h:26.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nsheet:c:8:r:52:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal normal 10pt Arial\nfont:2:normal normal 12pt Arial\nfont:3:normal normal 14pt Arial\nfont:4:normal normal 22pt Arial\nfont:5:normal normal 8pt Arial\nfont:6:normal normal 8pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 16px 4px 4px;vertical-align:bottom;\nlayout:3:padding:4px 4px 4px 4px;vertical-align:bottom;\n"},"name":"todo","hidden":"0"}},"EditableCells":{"allow":true,"cells":{"sheet1!B3":true,"sheet1!B5":true,"sheet1!C5":true,"sheet1!B7":true,"sheet1!C9":true,"sheet1!C10":true,"sheet1!C11":true,"sheet1!C12":true,"sheet1!C13":true,"sheet1!C14":true,"sheet1!C15":true,"sheet1!C16":true,"sheet1!C17":true,"sheet1!C18":true,"sheet1!C19":true,"sheet1!C20":true,"sheet1!C21":true,"sheet1!C26":true,"sheet1!C27":true,"sheet1!C28":true,"sheet1!C29":true,"sheet1!C30":true,"sheet1!C31":true,"sheet1!C32":true,"sheet1!C33":true,"sheet1!C34":true,"sheet1!C35":true,"sheet1!C36":true,"sheet1!C37":true,"sheet1!C38":true,"sheet1!C39":true,"sheet1!C40":true,"sheet1!C45":true,"sheet1!C46":true,"sheet1!C47":true,"sheet1!C48":true,"sheet1!C49":true,"sheet1!C50":true,"sheet1!C51":true,"sheet1!C52":true,"sheet1!C53":true,"sheet1!C54":true,"sheet1!B57":true,"sheet1!B58":true,"sheet1!B59":true,"sheet1!B60":true,"sheet1!B61":true,"sheet1!B62":true,"sheet1!B63":true,"sheet2!B3":true,"sheet2!B5":true,"sheet2!C5":true,"sheet2!B7":true,"sheet2!C9":true,"sheet2!C10":true,"sheet2!C11":true,"sheet2!C12":true,"sheet2!C13":true,"sheet2!C14":true,"sheet2!C15":true,"sheet2!C16":true,"sheet2!C17":true,"sheet2!C18":true,"sheet2!C19":true,"sheet2!C20":true,"sheet2!C21":true,"sheet2!C22":true,"sheet2!C23":true,"sheet2!C24":true,"sheet2!C25":true,"sheet2!B28":true,"sheet2!B29":true,"sheet2!B30":true,"sheet2!B31":true,"sheet2!B32":true,"sheet2!B33":true,"sheet2!B34":true,"sheet5!B3":true,"sheet5!B5":true,"sheet5!C5":true,"sheet5!B7":true,"sheet5!C9":true,"sheet5!C10":true,"sheet5!C11":true,"sheet5!C12":true,"sheet5!C13":true,"sheet5!C14":true,"sheet5!C15":true,"sheet5!C16":true,"sheet5!C17":true,"sheet5!C18":true,"sheet5!C19":true,"sheet5!C20":true,"sheet5!C21":true,"sheet5!C22":true,"sheet5!C23":true,"sheet5!C24":true,"sheet5!C25":true,"sheet5!B28":true,"sheet5!B29":true,"sheet5!B30":true,"sheet5!B31":true,"sheet5!B32":true,"sheet5!B33":true,"sheet5!B34":true,"sheet3!B3":true,"sheet3!B5":true,"sheet3!C5":true,"sheet3!D5":true,"sheet3!E5":true,"sheet3!F5":true,"sheet3!C7":true,"sheet3!C8":true,"sheet3!C9":true,"sheet3!C10":true,"sheet3!C11":true,"sheet3!C12":true,"sheet3!C13":true,"sheet3!C14":true,"sheet3!C15":true,"sheet3!C16":true,"sheet3!C17":true,"sheet3!C18":true,"sheet3!C19":true,"sheet3!C20":true,"sheet3!C21":true,"sheet3!C22":true,"sheet3!C23":true,"sheet3!C24":true,"sheet3!C25":true,"sheet3!C26":true,"sheet3!C27":true,"sheet3!D7":true,"sheet3!D8":true,"sheet3!D9":true,"sheet3!D10":true,"sheet3!D11":true,"sheet3!D12":true,"sheet3!D13":true,"sheet3!D14":true,"sheet3!D15":true,"sheet3!D16":true,"sheet3!D17":true,"sheet3!D18":true,"sheet3!D19":true,"sheet3!D20":true,"sheet3!D21":true,"sheet3!D22":true,"sheet3!D23":true,"sheet3!D24":true,"sheet3!D25":true,"sheet3!D26":true,"sheet3!D27":true,"sheet3!E7":true,"sheet3!E8":true,"sheet3!E9":true,"sheet3!E10":true,"sheet3!E11":true,"sheet3!E12":true,"sheet3!E13":true,"sheet3!E14":true,"sheet3!E15":true,"sheet3!E16":true,"sheet3!E17":true,"sheet3!E18":true,"sheet3!E19":true,"sheet3!E20":true,"sheet3!E21":true,"sheet3!E22":true,"sheet3!E23":true,"sheet3!E24":true,"sheet3!E25":true,"sheet3!E26":true,"sheet3!E27":true,"sheet3!B30":true,"sheet3!B31":true,"sheet3!B32":true,"sheet3!B33":true,"sheet3!B34":true,"sheet3!B35":true,"sheet3!B36":true,"sheet4!B3":true,"sheet4!B6":true,"sheet4!B7":true,"sheet4!B8":true,"sheet4!B9":true,"sheet4!C7":true,"sheet4!C8":true,"sheet4!C9":true,"sheet4!B11":true,"sheet4!B12":true,"sheet4!B13":true,"sheet4!C12":true,"sheet4!C13":true,"sheet4!B15":true,"sheet4!B16":true,"sheet4!B17":true,"sheet4!B18":true,"sheet4!C16":true,"sheet4!C17":true,"sheet4!C18":true,"sheet4!B20":true,"sheet4!B21":true,"sheet4!B22":true,"sheet4!B23":true,"sheet4!C21":true,"sheet4!C22":true,"sheet4!C23":true,"sheet4!B25":true,"sheet4!B26":true,"sheet4!B27":true,"sheet4!B28":true,"sheet4!C26":true,"sheet4!C27":true,"sheet4!C28":true,"sheet4!B30":true,"sheet4!B31":true,"sheet4!B32":true,"sheet4!B33":true,"sheet4!B34":true,"sheet4!C31":true,"sheet4!C32":true,"sheet4!C33":true,"sheet4!C34":true,"sheet4!B36":true,"sheet4!B37":true,"sheet4!B38":true,"sheet4!B39":true,"sheet4!B40":true,"sheet4!B41":true,"sheet4!B42":true,"sheet4!C37":true,"sheet4!C38":true,"sheet4!C39":true,"sheet4!C40":true,"sheet4!C41":true,"sheet4!C42":true,"sheet4!B44":true,"sheet4!B45":true,"sheet4!B46":true,"sheet4!B47":true,"sheet4!C45":true,"sheet4!C46":true,"sheet4!C47":true,"sheet4!B50":true,"sheet4!B51":true,"sheet4!B52":true,"sheet4!B53":true,"sheet4!B54":true,"sheet4!B55":true,"sheet4!B56":true},"constraints":{}}} \ No newline at end of file diff --git a/Website/excelinterop/tmp/EXCEL Gantt_v4.xls b/Website/excelinterop/tmp/EXCEL Gantt_v4.xls deleted file mode 100644 index 2d453a8..0000000 Binary files a/Website/excelinterop/tmp/EXCEL Gantt_v4.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/EXCELGantt.xls b/Website/excelinterop/tmp/EXCELGantt.xls deleted file mode 100644 index f6f599b..0000000 Binary files a/Website/excelinterop/tmp/EXCELGantt.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/Eating Disorder (7) b/Website/excelinterop/tmp/Eating Disorder (7) deleted file mode 100644 index 1dc0dbc..0000000 --- a/Website/excelinterop/tmp/Eating Disorder (7) +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":3,"currentid":"sheet1","currentname":"sheet9","sheetArr":{"sheet1":{"sheetstr":{"savestr":"version:1.5\ncell:A1:l:4:f:1:tvf:4:ntvf:4\ncell:B1:l:4:f:1:tvf:4:ntvf:4\ncell:A2:l:4:f:1:tvf:4:ntvf:4\ncell:B2:l:4:f:1:tvf:4:ntvf:4\ncell:A3:l:4:f:1:tvf:4:ntvf:4\ncell:B3:l:4:f:1:tvf:4:ntvf:4\ncell:C3:t:Weekly Meal Planner :b:3:3:3:3:l:2:f:13:c:3:bg:1:cf:1:colspan:9\ncell:D3:l:2:f:2\ncell:E3:l:2:f:2\ncell:F3:l:1:f:6\ncell:G3:l:1:f:6\ncell:H3:l:1:f:6\ncell:I3:l:1:f:6\ncell:J3:l:1:f:6\ncell:K3:l:1:f:6\ncell:A4:l:4:f:1:tvf:4:ntvf:4\ncell:B4:l:4:f:1:tvf:4:ntvf:4\ncell:C4:t:Week 2:l:3:f:9:cf:2:colspan:9\ncell:D4:t::l:1:f:17:cf:2\ncell:E4:t::l:1:f:17:cf:2\ncell:F4:t::l:1:f:17:cf:2\ncell:G4:t::l:1:f:17:cf:2\ncell:K4:l:1:f:16:cf:3\ncell:A5:l:4:f:1:tvf:4:ntvf:4\ncell:B5:l:4:f:1:tvf:4:ntvf:4\ncell:C5:l:1:f:5\ncell:D5:l:1:f:5\ncell:E5:l:1:f:5\ncell:F5:l:1:f:5\ncell:G5:l:1:f:5\ncell:H5:l:1:f:5\ncell:I5:l:1:f:5\ncell:J5:l:1:f:5\ncell:K5:l:1:f:5\ncell:A6:l:4:f:1:tvf:4:ntvf:4\ncell:B6:l:4:f:1:tvf:4:ntvf:4\ncell:C6:l:1:f:3:cf:2\ncell:D6:t::l:1:f:3:cf:2\ncell:E6:t::l:1:f:3:cf:2\ncell:F6:t::l:1:f:3:cf:2\ncell:G6:t::l:1:f:3:cf:2\ncell:H6:t::l:1:f:3:cf:2\ncell:I6:t::l:1:f:3:cf:2\ncell:J6:t::l:1:f:3:cf:2\ncell:K6:t::l:1:f:3:cf:2\ncell:A7:l:4:f:1:tvf:4:ntvf:4\ncell:B7:l:4:f:1:tvf:4:ntvf:4\ncell:C7:l:1:f:4\ncell:D7:l:1:f:4\ncell:E7:l:1:f:4\ncell:F7:l:1:f:4\ncell:G7:l:1:f:5\ncell:H7:l:1:f:5\ncell:I7:l:1:f:5\ncell:J7:l:1:f:5\ncell:K7:l:1:f:5\ncell:A8:l:4:f:1:tvf:4:ntvf:4\ncell:B8:l:4:f:1:tvf:4:ntvf:4\ncell:C8:t:Monday:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:3\ncell:D8:t:Date\\c:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:5:colspan:3\ncell:E8:t:Date\\c:b:3:3:3:3:l:2:f:9:c:3:bg:1:cf:2:ntvf:5:colspan:2\ncell:F8:b:::5::l:2:f:9:bg:1:cf:1:ntvf:5\ncell:G8:l:5:f:9:bg:3:cf:1\ncell:H8:t:Saturday:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:3\ncell:I8:t:Date\\c:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:5:colspan:3\ncell:J8:t:Date\\c:b:3:3:3:3:l:2:f:12:c:3:bg:1:cf:2:ntvf:5:colspan:2\ncell:K8:vtf:t::IF(F44=\"\",\"\",F44+1):b:::5::l:2:f:7:cf:2:ntvf:5\ncell:A9:l:4:f:1:tvf:4:ntvf:4\ncell:B9:l:4:f:1:tvf:4:ntvf:4\ncell:C9:t:Breakfast\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D9:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E9:b:2::2::l:1:f:7:bg:3:cf:2\ncell:F9:b:2::2::l:1:f:7:bg:3:cf:2\ncell:G9:l:5:f:7:bg:3:cf:2\ncell:H9:t:Breakfast\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:I9:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:J9:b:::4::l:1:f:15:cf:1\ncell:K9:b:::4::l:1:f:15\ncell:A10:l:4:f:1:tvf:4:ntvf:4\ncell:B10:l:4:f:1:tvf:4:ntvf:4\ncell:C10:t:Lunch\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D10:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E10:t::b:2::2::l:1:f:7:cf:2\ncell:F10:b:2::2::l:1:f:7:cf:2\ncell:G10:l:5:f:7:bg:3:cf:2\ncell:H10:t:Lunch\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:I10:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:J10:t::b:4::4::l:1:f:15:cf:2\ncell:K10:b:::4::l:1:f:15\ncell:A11:l:4:f:1:tvf:4:ntvf:4\ncell:B11:l:4:f:1:tvf:4:ntvf:4\ncell:C11:t:Snacks\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D11:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E11:t::b:2::2::l:1:f:7:bg:3:cf:2\ncell:F11:b:2::2::l:1:f:7:bg:3:cf:2\ncell:G11:l:5:f:7:bg:3:cf:2\ncell:H11:t:Snacks\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:I11:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:J11:t::b:4::4::l:1:f:15:cf:2\ncell:K11:b:::4::l:1:f:15\ncell:A12:l:4:f:1:tvf:4:ntvf:4\ncell:B12:l:4:f:1:tvf:4:ntvf:4\ncell:C12:t:Dinner\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D12:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E12:t::b:2::2::l:1:f:7:bg:2:cf:2\ncell:F12:b:2::2::l:1:f:7:bg:2:cf:2\ncell:G12:l:5:f:7:bg:3:cf:2\ncell:H12:t:Dinner\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:I12:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:J12:t::b:4::4::l:1:f:4:cf:2\ncell:K12:b:4::4::l:1:f:4\ncell:A13:l:4:f:1:tvf:4:ntvf:4\ncell:B13:l:4:f:1:tvf:4:ntvf:4\ncell:C13:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D13:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E13:t::b:2::2::l:1:f:7:bg:3:cf:2\ncell:F13:b:2::2::l:1:f:7:bg:3:cf:2\ncell:G13:l:5:f:7:bg:3:cf:2\ncell:H13:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:I13:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:J13:t::b:4::4::l:1:f:4:cf:2\ncell:K13:b:::4::l:1:f:4\ncell:A14:l:4:f:1:tvf:4:ntvf:4\ncell:B14:l:4:f:1:tvf:4:ntvf:4\ncell:C14:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D14:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E14:t::b:2::2::l:1:f:7:bg:2:cf:2\ncell:F14:b:2::2::l:1:f:7:bg:2:cf:2\ncell:G14:l:5:f:7:bg:3:cf:2\ncell:H14:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:I14:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:J14:t::b:4::4::l:1:f:4:cf:2\ncell:K14:b:::4::l:1:f:4\ncell:A15:l:4:f:1:tvf:4:ntvf:4\ncell:B15:l:4:f:1:tvf:4:ntvf:4\ncell:C15:t:Side\\c:b:1:1:1:1:l:1:f:7:cf:2\ncell:D15:b:1:1:1:1:l:1:f:7:cf:2:colspan:3\ncell:E15:t::b:2::2::l:1:f:7:cf:2\ncell:F15:b:2::2::l:1:f:7:cf:2\ncell:G15:l:5:f:7:bg:3:cf:2\ncell:H15:t:Side\\c:b:1:1:1:1:l:1:f:7:cf:2\ncell:I15:b:1:1:1:1:l:1:f:7:cf:2:colspan:3\ncell:J15:t::b:4::4::l:1:f:4:cf:2\ncell:K15:b:::4::l:1:f:4\ncell:A16:l:4:f:1:tvf:4:ntvf:4\ncell:B16:l:4:f:1:tvf:4:ntvf:4:colspan:10\ncell:C16:l:1:f:7:colspan:4\ncell:D16:l:1:f:7:colspan:3\ncell:E16:l:1:f:7\ncell:F16:l:1:f:7\ncell:G16:l:5:f:14:bg:3:cf:1\ncell:H16:l:1:f:7:colspan:4\ncell:I16:l:1:f:7:colspan:3\ncell:J16:l:1:f:7\ncell:K16:l:1:f:7\ncell:A17:l:4:f:1:tvf:4:ntvf:4\ncell:B17:l:4:f:1:tvf:4:ntvf:4\ncell:C17:t:Tuesday:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:3\ncell:D17:t:Date\\c:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:5:colspan:3\ncell:E17:t:Date\\c:b:3:3:3:3:l:2:f:9:c:3:bg:1:cf:2:ntvf:5:colspan:2\ncell:F17:vtf:t::IF(F8=\"\",\"\",F8+1):b:3:3:3:3:l:2:f:9:c:3:bg:1:cf:2:ntvf:5\ncell:G17:l:5:f:9:bg:3:cf:1\ncell:H17:t:Sunday:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:3\ncell:I17:t:Date\\c:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:5:colspan:3\ncell:J17:t:Date\\c:b:3:3:3:3:l:2:f:12:c:3:bg:1:cf:2:ntvf:5:colspan:2\ncell:K17:vtf:t::IF(K8=\"\",\"\",K8+1):b:::5::l:2:f:7:cf:2:ntvf:5\ncell:A18:l:4:f:1:tvf:4:ntvf:4\ncell:B18:l:4:f:1:tvf:4:ntvf:4\ncell:C18:t:Breakfast\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D18:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E18:b:2::2::l:1:f:7:bg:3:cf:2\ncell:F18:b:2::2::l:1:f:7:bg:3:cf:2\ncell:G18:l:5:f:7:bg:3:cf:2\ncell:H18:t:Breakfast\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:I18:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:J18:b:::4::l:1:f:15:cf:1\ncell:K18:b:::4::l:1:f:15\ncell:A19:l:4:f:1:tvf:4:ntvf:4\ncell:B19:l:4:f:1:tvf:4:ntvf:4\ncell:C19:t:Lunch\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D19:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E19:t::b:2::2::l:1:f:7:cf:2\ncell:F19:b:2::2::l:1:f:7:cf:2\ncell:G19:l:5:f:7:bg:3:cf:2\ncell:H19:t:Lunch\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:I19:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:J19:t::b:4::4::l:1:f:15:cf:2\ncell:K19:b:::4::l:1:f:15\ncell:A20:l:4:f:1:tvf:4:ntvf:4\ncell:B20:l:4:f:1:tvf:4:ntvf:4\ncell:C20:t:Snacks\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D20:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E20:t::b:2::2::l:1:f:7:bg:3:cf:2\ncell:F20:b:2::2::l:1:f:7:bg:3:cf:2\ncell:G20:l:5:f:7:bg:3:cf:2\ncell:H20:t:Snacks\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:I20:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:J20:t::b:4::4::l:1:f:15:cf:2\ncell:K20:b:::4::l:1:f:15\ncell:A21:l:4:f:1:tvf:4:ntvf:4\ncell:B21:l:4:f:1:tvf:4:ntvf:4\ncell:C21:t:Dinner\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D21:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E21:t::b:2::2::l:1:f:7:bg:2:cf:2\ncell:F21:b:2::2::l:1:f:7:bg:2:cf:2\ncell:G21:l:5:f:7:bg:3:cf:2\ncell:H21:t:Dinner\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:I21:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:J21:t::b:4::4::l:1:f:4:cf:2\ncell:K21:b:4::4::l:1:f:4\ncell:A22:l:4:f:1:tvf:4:ntvf:4\ncell:B22:l:4:f:1:tvf:4:ntvf:4\ncell:C22:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D22:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E22:t::b:2::2::l:1:f:7:bg:3:cf:2\ncell:F22:b:2::2::l:1:f:7:bg:3:cf:2\ncell:G22:l:5:f:7:bg:3:cf:2\ncell:H22:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:I22:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:J22:t::b:4::4::l:1:f:4:cf:2\ncell:K22:b:::4::l:1:f:4\ncell:A23:l:4:f:1:tvf:4:ntvf:4\ncell:B23:l:4:f:1:tvf:4:ntvf:4\ncell:C23:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D23:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E23:t::b:2::2::l:1:f:7:bg:2:cf:2\ncell:F23:b:2::2::l:1:f:7:bg:2:cf:2\ncell:G23:l:5:f:7:bg:3:cf:2\ncell:H23:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:I23:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:J23:t::b:4::4::l:1:f:4:cf:2\ncell:K23:b:::4::l:1:f:4\ncell:A24:l:4:f:1:tvf:4:ntvf:4\ncell:B24:l:4:f:1:tvf:4:ntvf:4\ncell:C24:t:Side\\c:b:1:1:1:1:l:1:f:7:cf:2\ncell:D24:b:1:1:1:1:l:1:f:7:cf:2:colspan:3\ncell:E24:t::b:2::2::l:1:f:7:cf:2\ncell:F24:b:2::2::l:1:f:7:cf:2\ncell:G24:l:5:f:7:bg:3:cf:2\ncell:H24:t:Side\\c:b:1:1:1:1:l:1:f:7:cf:2\ncell:I24:b:1:1:1:1:l:1:f:7:cf:2:colspan:3\ncell:J24:t::b:4::4::l:1:f:4:cf:2\ncell:K24:b:::4::l:1:f:4\ncell:A25:l:4:f:1:tvf:4:ntvf:4\ncell:B25:l:4:f:1:tvf:4:ntvf:4:colspan:10\ncell:C25:l:1:f:4:colspan:4\ncell:D25:l:1:f:4\ncell:E25:l:1:f:4\ncell:F25:l:1:f:4\ncell:G25:l:5:f:14:bg:3:cf:1\ncell:H25:l:1:f:7:colspan:4\ncell:I25:l:1:f:7\ncell:J25:l:1:f:7\ncell:K25:l:1:f:7\ncell:A26:l:4:f:1:tvf:4:ntvf:4\ncell:B26:l:4:f:1:tvf:4:ntvf:4\ncell:C26:t:Wednesday:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:3\ncell:D26:t:Date\\c:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:5:colspan:3\ncell:E26:t:Date\\c:b:3:3:3:3:l:2:f:9:c:3:bg:1:cf:2:ntvf:5:colspan:2\ncell:F26:vtf:t::IF(F17=\"\",\"\",F17+1):b:3:3:3:3:l:2:f:9:c:3:bg:1:cf:2:ntvf:5\ncell:G26:l:5:f:9:bg:3:cf:1\ncell:H26:t:Notes:b:1:1:1:1:l:2:f:9:c:3:bg:1:ntvf:3:colspan:4\ncell:I26:b:::5::l:2:f:10:ntvf:3\ncell:J26:b:::5::l:2:f:10:ntvf:3\ncell:K26:b:::5::l:2:f:10:ntvf:3\ncell:A27:l:4:f:1:tvf:4:ntvf:4\ncell:B27:l:4:f:1:tvf:4:ntvf:4\ncell:C27:t:Breakfast\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D27:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E27:b:::4::l:1:f:7:cf:2\ncell:F27:b:::4::l:1:f:7:cf:2\ncell:G27:l:5:f:7:bg:3:cf:2\ncell:H27:b:1:1:1:1:l:1:f:7:cf:2:colspan:4\ncell:I27:l:1:f:4\ncell:J27:l:1:f:4\ncell:K27:l:1:f:4\ncell:A28:l:4:f:1:tvf:4:ntvf:4\ncell:B28:l:4:f:1:tvf:4:ntvf:4\ncell:C28:t:Lunch\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D28:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E28:t::b:4::4::l:1:f:7:cf:2\ncell:F28:b:::4::l:1:f:7:cf:2\ncell:G28:l:5:f:7:bg:3:cf:2\ncell:H28:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:4\ncell:I28:l:1:f:4\ncell:J28:l:1:f:4\ncell:K28:l:1:f:4\ncell:A29:l:4:f:1:tvf:4:ntvf:4\ncell:B29:l:4:f:1:tvf:4:ntvf:4\ncell:C29:t:Snacks\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D29:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E29:t::b:4::4::l:1:f:7:cf:2\ncell:F29:b:::4::l:1:f:7:cf:2\ncell:G29:l:5:f:7:bg:3:cf:2\ncell:H29:b:1:1:1:1:l:1:f:7:cf:2:colspan:4\ncell:I29:l:1:f:4\ncell:J29:l:1:f:4\ncell:K29:l:1:f:4\ncell:A30:l:4:f:1:tvf:4:ntvf:4\ncell:B30:l:4:f:1:tvf:4:ntvf:4\ncell:C30:t:Dinner\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D30:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E30:t::b:4::4::l:1:f:7:cf:2\ncell:F30:b:4::4::l:1:f:7:cf:2\ncell:G30:l:5:f:7:bg:3:cf:2\ncell:H30:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:4\ncell:I30:l:1:f:4\ncell:J30:l:1:f:4\ncell:K30:l:1:f:4\ncell:A31:l:4:f:1:tvf:4:ntvf:4\ncell:B31:l:4:f:1:tvf:4:ntvf:4\ncell:C31:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D31:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E31:t::b:4::4::l:1:f:7:cf:2\ncell:F31:b:::4::l:1:f:7:cf:2\ncell:G31:l:5:f:7:bg:3:cf:2\ncell:H31:b:1:1:1:1:l:1:f:7:cf:2:colspan:4\ncell:I31:l:1:f:4\ncell:J31:l:1:f:4\ncell:K31:l:1:f:4\ncell:A32:l:4:f:1:tvf:4:ntvf:4\ncell:B32:l:4:f:1:tvf:4:ntvf:4\ncell:C32:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D32:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E32:t::b:4::4::l:1:f:7:cf:2\ncell:F32:b:::4::l:1:f:7:cf:2\ncell:G32:l:5:f:7:bg:3:cf:2\ncell:H32:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:4\ncell:I32:l:1:f:4\ncell:J32:l:1:f:4\ncell:K32:l:1:f:4\ncell:A33:l:4:f:1:tvf:4:ntvf:4\ncell:B33:l:4:f:1:tvf:4:ntvf:4\ncell:C33:t:Side\\c:b:1:1:1:1:l:1:f:7:cf:2\ncell:D33:b:1:1:1:1:l:1:f:7:cf:2:colspan:3\ncell:E33:t::b:4::4::l:1:f:7:cf:2\ncell:F33:b:::4::l:1:f:7:cf:2\ncell:G33:l:5:f:7:bg:3:cf:2\ncell:H33:b:1:1:1:1:l:1:f:7:cf:2:colspan:4\ncell:I33:l:1:f:4\ncell:J33:l:1:f:4\ncell:K33:l:1:f:4\ncell:A34:l:4:f:1:tvf:4:ntvf:4\ncell:B34:l:4:f:1:tvf:4:ntvf:4:colspan:10\ncell:C34:l:1:f:4:colspan:4\ncell:D34:l:1:f:4\ncell:E34:l:1:f:4\ncell:F34:l:1:f:4\ncell:G34:l:5:f:1:bg:3:cf:1\ncell:H34:l:1:f:4\ncell:I34:l:1:f:4\ncell:J34:l:1:f:4\ncell:K34:l:1:f:4\ncell:A35:l:4:f:1:tvf:4:ntvf:4\ncell:B35:l:4:f:1:tvf:4:ntvf:4\ncell:C35:t:Thursday:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:3\ncell:D35:t:Date\\c:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:5:colspan:3\ncell:E35:t:Date\\c:b:3:3:3:3:l:2:f:9:c:3:bg:1:cf:2:ntvf:5:colspan:2\ncell:F35:vtf:t::IF(F26=\"\",\"\",F26+1):b:3:3:3:3:l:2:f:9:c:3:bg:1:cf:2:ntvf:5\ncell:G35:l:5:f:9:bg:3:cf:1\ncell:H35:t:Grocery List:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:3:colspan:4\ncell:I35:b:1:1:1:1:l:2:f:10:ntvf:3\ncell:J35:b:1:1:1:1:l:2:f:10:ntvf:3\ncell:K35:b:::5::l:2:f:10:ntvf:3\ncell:A36:l:4:f:1:tvf:4:ntvf:4\ncell:B36:l:4:f:1:tvf:4:ntvf:4\ncell:C36:t:Breakfast\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D36:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E36:b:::4::l:1:f:15:cf:1\ncell:F36:b:::4::l:1:f:15\ncell:G36:l:5:f:1:bg:3:cf:1\ncell:H36:b:1:1:1:1:l:1:f:7:cf:2:ntvf:2:colspan:2\ncell:I36:t::b:1:1:1:1:l:1:f:7:cf:2:ntvf:2\ncell:J36:t: :b:1:1:1:1:l:1:f:7:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K36:t::b:5::4::l:1:f:4:cf:2:ntvf:1\ncell:A37:l:4:f:1:tvf:4:ntvf:4\ncell:B37:l:4:f:1:tvf:4:ntvf:4\ncell:C37:t:Lunch\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D37:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E37:t::b:4::4::l:1:f:15:cf:2\ncell:F37:b:::4::l:1:f:15\ncell:G37:l:5:f:1:bg:3:cf:1\ncell:H37:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I37:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J37:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K37:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A38:l:4:f:1:tvf:4:ntvf:4\ncell:B38:l:4:f:1:tvf:4:ntvf:4\ncell:C38:t:Snacks\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D38:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E38:t::b:4::4::l:1:f:15:cf:2\ncell:F38:b:::4::l:1:f:15\ncell:G38:l:5:f:1:bg:3:cf:1\ncell:H38:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I38:t::b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2\ncell:J38:t: :b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K38:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A39:l:4:f:1:tvf:4:ntvf:4\ncell:B39:l:4:f:1:tvf:4:ntvf:4\ncell:C39:t:Dinner\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D39:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E39:t::b:4::4::l:1:f:4:cf:2\ncell:F39:b:4::4::l:1:f:4\ncell:G39:l:5:f:1:bg:3:cf:1\ncell:H39:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I39:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J39:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K39:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A40:l:4:f:1:tvf:4:ntvf:4\ncell:B40:l:4:f:1:tvf:4:ntvf:4\ncell:C40:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D40:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E40:t::b:4::4::l:1:f:4:cf:2\ncell:F40:b:::4::l:1:f:4\ncell:G40:l:5:f:1:bg:3:cf:1\ncell:H40:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I40:t::b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2\ncell:J40:t: :b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K40:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A41:l:4:f:1:tvf:4:ntvf:4\ncell:B41:l:4:f:1:tvf:4:ntvf:4\ncell:C41:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D41:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E41:t::b:4::4::l:1:f:4:cf:2\ncell:F41:b:::4::l:1:f:4\ncell:G41:l:5:f:1:bg:3:cf:1\ncell:H41:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I41:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J41:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K41:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A42:l:4:f:1:tvf:4:ntvf:4\ncell:B42:l:4:f:1:tvf:4:ntvf:4\ncell:C42:t:Side\\c:b:1:1:1:1:l:1:f:7:cf:2\ncell:D42:b:1:1:1:1:l:1:f:7:cf:2:colspan:3\ncell:E42:t::b:4::4::l:1:f:4:cf:2\ncell:F42:b:::4::l:1:f:4\ncell:G42:l:5:f:1:bg:3:cf:1\ncell:H42:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I42:t::b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2\ncell:J42:t: :b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K42:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A43:l:4:f:1:tvf:4:ntvf:4\ncell:B43:l:4:f:1:tvf:4:ntvf:4:colspan:5\ncell:C43:l:1:f:4:colspan:4\ncell:D43:l:1:f:4\ncell:E43:l:1:f:4\ncell:F43:l:1:f:4\ncell:G43:l:5:f:1:bg:3:cf:1\ncell:H43:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I43:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J43:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K43:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A44:l:4:f:1:tvf:4:ntvf:4\ncell:B44:l:4:f:1:tvf:4:ntvf:4\ncell:C44:t:Friday:b:1:1:1:1:l:2:f:8:c:3:bg:1:cf:1:ntvf:3\ncell:D44:t:Date\\c:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:5:colspan:3\ncell:E44:t:Date\\c:b:3:3:3:3:l:2:f:11:c:3:bg:1:cf:2:ntvf:5:colspan:2\ncell:F44:vtf:t::IF(F35=\"\",\"\",F35+1):b:::5::l:2:f:7:cf:2:ntvf:5\ncell:G44:l:5:f:1:bg:3:cf:1\ncell:H44:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I44:t::b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2\ncell:J44:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K44:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A45:l:4:f:1:tvf:4:ntvf:4\ncell:B45:l:4:f:1:tvf:4:ntvf:4\ncell:C45:t:Breakfast\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D45:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E45:b:::4::l:1:f:15:cf:1\ncell:F45:b:::4::l:1:f:15\ncell:G45:l:5:f:1:bg:3:cf:1\ncell:H45:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I45:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J45:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K45:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A46:l:4:f:1:tvf:4:ntvf:4\ncell:B46:l:4:f:1:tvf:4:ntvf:4\ncell:C46:t:Lunch\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D46:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E46:t::b:4::4::l:1:f:15:cf:2\ncell:F46:b:::4::l:1:f:15\ncell:G46:l:5:f:1:bg:3:cf:1\ncell:H46:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I46:t::b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2\ncell:J46:t: :b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K46:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A47:l:4:f:1:tvf:4:ntvf:4\ncell:B47:l:4:f:1:tvf:4:ntvf:4\ncell:C47:t:Snacks:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D47:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E47:t::b:4::4::l:1:f:15:cf:2\ncell:F47:b:::4::l:1:f:15\ncell:G47:l:5:f:1:bg:3:cf:1\ncell:H47:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I47:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J47:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K47:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A48:l:4:f:1:tvf:4:ntvf:4\ncell:B48:l:4:f:1:tvf:4:ntvf:4\ncell:C48:t:Dinner\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D48:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E48:t::b:4::4::l:1:f:4:cf:2\ncell:F48:b:4::4::l:1:f:4\ncell:G48:l:5:f:1:bg:3:cf:1\ncell:H48:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I48:t::b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2\ncell:J48:t: :b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K48:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A49:l:4:f:1:tvf:4:ntvf:4\ncell:B49:l:4:f:1:tvf:4:ntvf:4\ncell:C49:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D49:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E49:t::b:4::4::l:1:f:4:bg:3:cf:2\ncell:F49:b:::4::l:1:f:4:bg:3\ncell:G49:l:5:f:1:bg:3:cf:1\ncell:H49:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I49:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J49:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K49:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A50:l:4:f:1:tvf:4:ntvf:4\ncell:B50:l:4:f:1:tvf:4:ntvf:4\ncell:C50:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D50:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E50:t::b:4::4::l:1:f:4:bg:2:cf:2\ncell:F50:b:::4::l:1:f:4:bg:2\ncell:G50:l:5:f:1:bg:3:cf:1\ncell:H50:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I50:t::b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2\ncell:J50:t: :b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K50:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A51:l:4:f:1:tvf:4:ntvf:4\ncell:B51:l:4:f:1:tvf:4:ntvf:4\ncell:C51:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D51:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E51:t::b:::1::l:1:f:4:bg:3:cf:2\ncell:F51:b:::1::l:1:f:4:bg:3\ncell:G51:l:5:f:1:bg:3:cf:1\ncell:H51:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I51:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J51:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K51:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A52:l:4:f:1:tvf:4:ntvf:4\ncell:B52:l:4:f:1:tvf:4:ntvf:4:colspan:5\ncell:G52:l:5:f:1:bg:3:cf:1\ncell:A53:l:4:f:1:tvf:4:ntvf:4\ncell:B53:l:4:f:1:tvf:4:ntvf:4\ncell:G53:l:5:f:1:bg:3:cf:1\ncell:A54:l:4:f:1:tvf:4:ntvf:4\ncell:B54:l:4:f:1:tvf:4:ntvf:4\ncell:G54:l:5:f:1:bg:3:cf:1\ncell:A55:l:4:f:1:tvf:4:ntvf:4\ncell:B55:l:4:f:1:tvf:4:ntvf:4\ncell:G55:l:5:f:1:bg:3:cf:1\ncell:A56:l:4:f:1:tvf:4:ntvf:4\ncell:B56:l:4:f:1:tvf:4:ntvf:4\ncell:G56:f:1\ncell:A57:l:4:f:1:tvf:4:ntvf:4\ncell:B57:l:4:f:1:tvf:4:ntvf:4\ncell:G57:f:1\ncell:A58:l:4:f:1:tvf:4:ntvf:4\ncell:B58:l:4:f:1:tvf:4:ntvf:4\ncell:G58:f:1\ncell:A59:l:4:f:1:tvf:4:ntvf:4\ncell:B59:l:4:f:1:tvf:4:ntvf:4\ncell:G59:f:1\ncell:A60:l:4:f:1:tvf:4:ntvf:4\ncell:B60:l:4:f:1:tvf:4:ntvf:4\ncell:G60:f:1\ncell:A61:l:4:f:1:tvf:4:ntvf:4\ncell:B61:l:4:f:1:tvf:4:ntvf:4\ncell:G61:f:1\ncell:A62:l:4:f:1\ncell:B62:l:4:f:1\ncell:G62:f:1\ncell:A63:l:4:f:1\ncell:B63:l:4:f:1\ncell:G63:f:1\ncell:A64:l:4:f:1\ncell:B64:l:4:f:1\ncell:G64:f:1\ncell:A65:l:4:f:1\ncell:B65:l:4:f:1\ncell:G65:f:1\ncell:A66:l:4:f:1\ncell:B66:l:4:f:1\ncell:G66:f:1\ncell:A67:l:4:f:1\ncell:B67:l:4:f:1\ncell:G67:f:1\ncell:A68:l:4:f:1\ncell:B68:l:4:f:1\ncell:G68:f:1\ncell:A69:l:4:f:1\ncell:B69:l:4:f:1\ncell:G69:f:1\ncell:A70:l:4:f:1\ncell:B70:l:4:f:1\ncell:G70:f:1\ncell:A71:l:4:f:1\ncell:B71:l:4:f:1\ncell:G71:f:1\ncell:A72:l:4:f:1\ncell:B72:l:4:f:1\ncell:G72:f:1\ncell:A73:l:4:f:1\ncell:B73:l:4:f:1\ncell:G73:f:1\ncell:A74:l:4:f:1\ncell:B74:l:4:f:1\ncell:G74:f:1\ncell:A75:l:4:f:1\ncell:B75:l:4:f:1\ncell:G75:f:1\ncell:A76:l:4:f:1\ncell:B76:l:4:f:1\ncell:G76:f:1\ncell:A77:l:4:f:1\ncell:B77:l:4:f:1\ncell:G77:f:1\ncell:A78:l:4:f:1\ncell:B78:l:4:f:1\ncell:G78:f:1\ncell:A79:l:4:f:1\ncell:B79:l:4:f:1\ncell:A80:l:4:f:1\ncell:B80:l:4:f:1\ncell:A81:l:4:f:1\ncell:B81:l:4:f:1\ncell:A82:l:4:f:1\ncell:B82:l:4:f:1\ncell:A83:l:4:f:1\ncell:B83:l:4:f:1\ncell:A84:l:4:f:1\ncell:B84:l:4:f:1\ncell:A85:l:4:f:1\ncell:B85:l:4:f:1\ncell:A86:l:4:f:1\ncell:B86:l:4:f:1\ncell:A87:l:4:f:1\ncell:B87:l:4:f:1\ncell:A88:l:4:f:1\ncell:B88:l:4:f:1\ncell:A89:l:4:f:1\ncell:B89:l:4:f:1\ncell:A90:l:4:f:1\ncell:B90:l:4:f:1\ncell:A91:l:4:f:1\ncell:B91:l:4:f:1\ncell:A92:l:4:f:1\ncell:B92:l:4:f:1\ncell:A93:l:4:f:1\ncell:B93:l:4:f:1\ncol:A:w:10\ncol:B:w:10\ncol:C:w:90\ncol:D:w:26\ncol:E:w:80\ncol:F:w:24\ncol:G:w:30\ncol:H:w:90\ncol:I:w:28\ncol:J:w:80\ncol:K:w:37\nrow:1:h:24\nrow:2:h:24\nrow:3:h:24\nrow:6:h:20.25\nrow:7:h:18\nrow:8:h:18\nrow:9:h:14.1\nrow:10:h:14.1\nrow:11:h:14.1\nrow:12:h:18\nrow:13:h:18\nrow:14:h:18\nrow:15:h:18\nrow:16:h:14.25\nrow:17:h:18\nrow:18:h:14.1\nrow:19:h:14.1\nrow:20:h:14.1\nrow:21:h:18\nrow:22:h:18\nrow:23:h:18\nrow:24:h:18\nrow:25:h:14.25\nrow:26:h:18\nrow:27:h:14.1\nrow:28:h:14.1\nrow:29:h:14.1\nrow:30:h:18\nrow:31:h:18\nrow:32:h:18\nrow:33:h:18\nrow:35:h:18\nrow:36:h:14.1\nrow:37:h:14.1\nrow:39:h:18\nrow:40:h:18\nrow:41:h:18\nrow:42:h:18\nrow:44:h:18\nrow:48:h:18\nrow:49:h:18\nrow:50:h:18\nrow:51:h:18\nsheet:c:11:r:93:h:12.75:layout:6\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(192,192,192)\nborder:3:1px solid rgb(255, 255, 255)\nborder:4:thin dotted rgb(192,192,192)\nborder:5:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 6pt *\nfont:2:normal bold 14pt Verdana\nfont:3:normal bold 16pt Arial\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 10pt Tahoma\nfont:6:normal normal 10pt Verdana\nfont:7:normal normal 11pt Arial\nfont:8:normal normal 12pt Arial\nfont:9:normal normal 12pt arial,helvetica,sans-serif\nfont:10:normal normal 14pt Arial\nfont:11:normal normal 16pt Arial\nfont:12:normal normal 16pt arial,helvetica,sans-serif\nfont:13:normal normal 18pt arial,helvetica,sans-serif\nfont:14:normal normal 6pt arial,helvetica,sans-serif\nfont:15:normal normal 8pt Arial\nfont:16:normal normal 8pt Tahoma\nfont:17:normal normal 8pt Verdana\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:0px * 0px *;vertical-align:bottom;\nlayout:4:padding:0px 0px 0px 0px;vertical-align:*;\nlayout:5:padding:0px 0px 0px 0px;vertical-align:middle;\nlayout:6:padding:4px 2px 4px 2px;vertical-align:*;\nvalueformat:1:\"□ \"@\nvalueformat:2:#,##0\nvalueformat:3:dddd\nvalueformat:4:hidden\nvalueformat:5:m/d/yy\n"},"name":"sheet9","hidden":"0"},"sheet2":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Shopping Checklist:f:6:c:3:bg:1:cf:1:colspan:5\ncell:B4:f:3:cf:1\ncell:B5:t:Ingredient:b:1:1:1:1:f:4:cf:1\ncell:C5:t:Quantity:b:1:1:1:1:f:4:cf:1\ncell:D5:t:Chk:b:1:1:1:1:f:4:cf:1\ncell:E5:t:Replacement:b:1:1:1:1:f:4:cf:1\ncell:F5:t:Notes:b:1:1:1:1:f:4:cf:1\ncell:B6:t:Grains:b:1:1:1:1:l:2:f:5:cf:2:colspan:5\ncell:B7:t:Wheat:b::1::1:l:2:f:1\ncell:C7:b::1::1:ntvf:1\ncell:D7:t:
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E7:b::1::1\ncell:F7:b::1:1:1\ncell:B8:t:Flour:b::1::1:l:2:f:1:bg:2\ncell:C8:b::1::1:bg:2:ntvf:1\ncell:D8:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E8:b::1::1:bg:2\ncell:F8:b:1:1:1:1:bg:2\ncell:B9:t:Corn Meal:b::1::1:l:2:f:1\ncell:C9:b::1::1:ntvf:1\ncell:D9:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E9:b::1::1\ncell:F9:b::1:1:1\ncell:B10:t:Oats:b::1::1:l:2:f:1:bg:2\ncell:C10:b::1::1:bg:2:ntvf:1\ncell:D10:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E10:b::1::1:bg:2\ncell:F10:b:1:1:1:1:bg:2\ncell:B11:t:Rice:b::1::1:l:2:f:1\ncell:C11:b::1::1:ntvf:1\ncell:D11:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E11:b::1::1\ncell:F11:b::1:1:1\ncell:B12:t:Pasta:b::1::1:l:2:f:1:bg:2\ncell:C12:b::1::1:bg:2:ntvf:1\ncell:D12:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E12:b::1::1:bg:2\ncell:F12:b:1:1:1:1:bg:2\ncell:B13:t:Total Grains:b::1::1:l:2:f:1\ncell:C13:vtf:n:0:SUM(C7\\cC12):b::1::1:ntvf:1\ncell:D13:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E13:b::1::1\ncell:F13:b::1:1:1\ncell:B14:t:Fats and Oils:b:1:1:1:1:l:2:f:5:colspan:5\ncell:C14:b::1::1:ntvf:1\ncell:D14:b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E14:b::1::1\ncell:F14:b:1:1:1:1\ncell:B15:t:Shortening:b::1::1:l:2:f:1\ncell:C15:b::1::1:ntvf:1\ncell:D15:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E15:b::1::1\ncell:F15:b::1:1:1\ncell:B16:t:Vegetable Oil:b::1::1:l:2:f:1:bg:2\ncell:C16:b::1::1:bg:2:ntvf:1\ncell:D16:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E16:b::1::1:bg:2\ncell:F16:b::1::1:bg:2\ncell:B17:t:Mayonnaise:b::1::1:l:2:f:1\ncell:C17:b::1::1:ntvf:1\ncell:D17:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E17:b::1::1\ncell:F17:b:1:1:1:1\ncell:B18:t:Salad Dressing:b::1::1:l:2:f:1:bg:2\ncell:C18:b::1::1:bg:2:ntvf:1\ncell:D18:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E18:b::1::1:bg:2\ncell:F18:b:1:1:1:1:bg:2\ncell:B19:t:Peanut Butter:b::1::1:l:2:f:1\ncell:C19:b::1::1:ntvf:1\ncell:D19:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E19:b::1::1\ncell:F19:b:1:1:1:1\ncell:B20:t:Total Fats and Oils:b::1::1:l:2:f:1:bg:2\ncell:C20:vtf:n:0:SUM(C15\\cC19):b::1::1:bg:2:ntvf:1\ncell:D20:b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E20:b::1::1:bg:2\ncell:F20:b:1:1:1:1:bg:2\ncell:B21:t:Legumes:b:1:1:1:1:l:2:f:5:colspan:5\ncell:C21:b::1::1:ntvf:1\ncell:D21:b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E21:b::1::1\ncell:F21:b::1::1\ncell:B22:t:Beans, dry:b::1::1:l:2:f:1:bg:3\ncell:C22:b::1::1:ntvf:1\ncell:D22:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E22:b::1::1\ncell:F22:b::1:1:1\ncell:B23:t:Lima Beans:b::1::1:l:2:f:1:bg:2\ncell:C23:b::1::1:bg:2:ntvf:1\ncell:D23:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E23:b::1::1:bg:2\ncell:F23:b:1:1:1:1:bg:2\ncell:B24:t:Soy Beans:b::1::1:l:2:f:1:bg:3\ncell:C24:b::1::1:ntvf:1\ncell:D24:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E24:b::1::1\ncell:F24:b::1:1:1\ncell:B25:t:Split Peas:b::1::1:l:2:f:1:bg:2\ncell:C25:b::1::1:bg:2:ntvf:1\ncell:D25:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E25:b::1::1:bg:2\ncell:F25:b:1:1:1:1:bg:2\ncell:B26:t:Lentils:b::1::1:l:2:f:1:bg:3\ncell:C26:b::1::1:ntvf:1\ncell:D26:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E26:b::1::1\ncell:F26:b::1:1:1\ncell:B27:t:Dry Soup Mix:b::1::1:l:2:f:1:bg:2\ncell:C27:b::1::1:bg:2:ntvf:1\ncell:D27:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E27:b::1::1:bg:2\ncell:F27:b::1::1:bg:2\ncell:B28:t:Total Legumes:b::1::1:l:2:f:1:bg:3\ncell:C28:vtf:n:0:SUM(C22\\cC27):b::1::1:ntvf:1\ncell:D28:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E28:b::1::1\ncell:F28:b:1:1:1:1\ncell:B29:t:Sugars:b:1:1:1:1:l:2:f:5:colspan:5\ncell:C29:b::1::1:ntvf:1\ncell:D29:b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E29:b::1::1\ncell:F29:b::1::1\ncell:B30:t:Honey:b::1::1:l:2:f:1:bg:3\ncell:C30:b::1::1:ntvf:1\ncell:D30:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E30:b::1::1\ncell:F30:b::1:1:1\ncell:B31:t:Sugar:b::1::1:l:2:f:1:bg:2\ncell:C31:b::1::1:bg:2:ntvf:1\ncell:D31:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E31:b::1::1:bg:2\ncell:F31:b::1::1:bg:2\ncell:B32:t:Brown Sugar:b::1::1:l:2:f:1:bg:3\ncell:C32:b::1::1:ntvf:1\ncell:D32:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E32:b::1::1\ncell:F32:b:1:1:1:1\ncell:B33:t:Molasses:b::1::1:l:2:f:1:bg:2\ncell:C33:b::1::1:bg:2:ntvf:1\ncell:D33:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E33:b::1::1:bg:2\ncell:F33:b::1::1:bg:2\ncell:B34:t:Corn Syrup:b::1::1:l:2:f:1:bg:3\ncell:C34:b::1::1:ntvf:1\ncell:D34:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E34:b::1::1\ncell:F34:b:1:1:1:1\ncell:B35:t:Jams:b::1::1:l:2:f:1:bg:2\ncell:C35:b::1::1:bg:2:ntvf:1\ncell:D35:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E35:b::1::1:bg:2\ncell:F35:b:1:1:1:1:bg:2\ncell:B36:t:Fruit drink powdered:b::1::1:l:2:f:1:bg:3\ncell:C36:b::1::1:ntvf:1\ncell:D36:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E36:b::1::1\ncell:F36:b::1:1:1\ncell:B37:t:Flavored Gelatin:b::1::1:l:2:f:1:bg:2\ncell:C37:b::1::1:bg:2:ntvf:1\ncell:D37:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E37:b::1::1:bg:2\ncell:F37:b:1:1:1:1:bg:2\ncell:B38:t:Total Sugars:b::1::1:l:2:f:1:bg:3\ncell:C38:vtf:n:0:SUM(C30\\cC37):b::1::1:ntvf:1\ncell:D38:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E38:b::1::1\ncell:F38:b::1:1:1\ncell:B39:t:Milk:b:1:1:1:1:l:2:f:5:bg:3:colspan:5\ncell:C39:b::1::1:ntvf:1\ncell:D39:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E39:b::1::1\ncell:F39:b::1::1\ncell:B40:t:Dry Milk:b::1::1:l:2:f:1:bg:3\ncell:C40:b::1::1:ntvf:1\ncell:D40:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E40:b::1::1\ncell:F40:b:1:1:1:1\ncell:B41:t:Evaporated Milk:b::1::1:l:2:f:1:bg:2\ncell:C41:b::1::1:bg:2:ntvf:1\ncell:D41:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E41:b::1::1:bg:2\ncell:F41:b::1::1:bg:2\ncell:B42:t:Powdered Eggs:b::1::1:l:2:f:1:bg:3\ncell:C42:b::1::1:ntvf:1\ncell:D42:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E42:b::1::1\ncell:F42:b:1:1:1:1\ncell:B43:t:Cooking Essentials:b:1:1:1:1:l:2:f:5:colspan:5\ncell:C43:b::1::1:ntvf:1\ncell:D43:b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E43:b::1::1\ncell:F43:b::1::1\ncell:B44:t:Baking Powder:b::1::1:l:2:f:7:bg:3\ncell:C44:b::1::1:ntvf:1\ncell:D44:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E44:b::1::1\ncell:F44:b::1:1:1\ncell:B45:t:Baking Soda:b::1::1:l:2:f:7:bg:2\ncell:C45:b::1::1:bg:2:ntvf:1\ncell:D45:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E45:b::1::1:bg:2\ncell:F45:b::1::1:bg:2\ncell:B46:t:Yeast:b::1::1:l:2:f:7:bg:3\ncell:C46:b::1::1:ntvf:1\ncell:D46:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E46:b::1::1\ncell:F46:b:1:1:1:1\ncell:B47:t:Salt:b::1::1:l:2:f:7:bg:2\ncell:C47:b::1::1:bg:2:ntvf:1\ncell:D47:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E47:b::1::1:bg:2\ncell:F47:b::1::1:bg:2\ncell:B48:t:Vinegar:b::1::1:l:2:f:7:bg:3\ncell:C48:b::1::1:ntvf:1\ncell:D48:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E48:b::1::1\ncell:F48:b:1:1:1:1\ncell:B49:t:Others:b:1:1:1:1:l:2:f:5:colspan:5\ncell:C49:b::1::1:ntvf:1\ncell:D49:b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E49:b::1::1\ncell:F49:b::1::1\ncell:B50:t:Other:b::1::1:l:2:f:7\ncell:C50:b::1::1:ntvf:1\ncell:D50:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E50:b::1::1\ncell:F50:b::1:1:1\ncell:B51:t:Other:b::1::1:l:2:f:7:bg:2\ncell:C51:b::1::1:bg:2:ntvf:1\ncell:D51:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E51:b::1::1:bg:2\ncell:F51:b::1::1:bg:2\ncell:B52:t:Other:b::1::1:l:2:f:7\ncell:C52:b::1::1:ntvf:1\ncell:D52:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E52:b::1::1\ncell:F52:b:1:1:1:1\ncell:B53:t:Other:b::1::1:l:2:f:7:bg:2\ncell:C53:b::1::1:bg:2:ntvf:1\ncell:D53:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E53:b::1::1:bg:2\ncell:F53:b::1::1:bg:2\ncell:B54:t:Other:b::1:1:1:l:2:f:7\ncell:C54:b::1:1:1:ntvf:1\ncell:D54:t:
     
    :b::1:1:1:l:1:f:2:cf:1:tvf:2\ncell:E54:b::1:1:1\ncell:F54:b:1:1:1:1\ncol:A:w:10\ncol:B:w:116\ncol:C:w:70\ncol:D:w:40\ncol:E:w:131\ncol:F:w:140\ncol:R:w:80\nsheet:c:18:r:54:font:3:layout:2\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* * arial,helvetica,sans-serif\nfont:2:* 11pt *\nfont:3:* 11pt arial,helvetica,sans-serif\nfont:4:* 12pt *\nfont:5:* 14pt arial,helvetica,sans-serif\nfont:6:* 18pt arial,helvetica,sans-serif\nfont:7:normal normal 11pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:4px 2px 4px 2px;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:text-html\n"},"name":"sheet4","hidden":"0"},"sheet3":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Binge Eating Checklist:f:3:c:3:bg:1:cf:1:colspan:3\ncell:B5:t:Chk:b:1:1:1:1:l:1:f:2:cf:1\ncell:C5:t:List:b:1:1:1:1:l:1:f:2:cf:1\ncell:D5:t:Yes/ No:b:1:1:1:1:l:1:f:2:cf:1\ncell:A7:b::1::\ncell:B7:t:
     
    :b:1:1::1:tvf:1\ncell:C7:t:Do you eat in a discrete period of time an amount of food that is larger than most people would eat in a similar period?:b:1:1::1\ncell:D7:b:1:1::1\ncell:E7:b::::1\ncell:B8:t:Prior to the episodes, have you :b:1::1::colspan:3\ncell:A9:b::1::\ncell:B9:t:
     
    :b:1:1::1:tvf:1\ncell:C9:t:undergone an unintentional period of fasting or starvation? :b::1::1\ncell:D9:b::1::1\ncell:E9:b::::1\ncell:A10:b::1::\ncell:B10:t:
     
    :b::1::1:bg:2:tvf:1\ncell:C10:t: performed considerable physical labor or exercise?:b::1::1:bg:2\ncell:D10:b::1::1:bg:2\ncell:E10:b::::1\ncell:A11:b::1::\ncell:B11:t:
     
    :b::1:1:1:tvf:1\ncell:C11:t:Does the exertion seem appropriate for the person's background and circumstances? :b::1:1:1\ncell:D11:b::1:1:1\ncell:E11:b::::1\ncell:B12:t:During these episodes, do you experience the feeling :colspan:3\ncell:A13:b::1::\ncell:B13:t:
     
    :b:1:1::1:tvf:1\ncell:C13:t:of being unable to stop eating?:b:1:1::1\ncell:D13:b:1:1::1\ncell:E13:b::::1\ncell:A14:b::1::\ncell:B14:t:
     
    :b::1::1:bg:2:tvf:1\ncell:C14:t:of controlling what is being eaten?:b::1::1:bg:2\ncell:D14:b::1::1:bg:2\ncell:E14:b::::1\ncell:A15:b::1::\ncell:B15:t:
     
    :b::1:1:1:tvf:1\ncell:C15:t:of deciding how much is being eaten? :b::1:1:1\ncell:D15:b::1:1:1\ncell:E15:b::::1\ncol:A:w:10\ncol:B:w:34\ncol:C:w:362\ncol:D:w:70\nsheet:c:5:r:15:font:1:layout:2\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 11pt arial,helvetica,sans-serif\nfont:2:* 12pt *\nfont:3:* 18pt *\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:4px 2px 4px 2px;vertical-align:*;\nvalueformat:1:text-html\n"},"name":"sheet10","hidden":"0"}},"EditableCells":{"allow":true,"cells":{"sheet9!C3":true,"sheet9!C4":true,"sheet9!C50":true,"sheet9!C51":true,"sheet9!C8":true,"sheet9!C9":true,"sheet9!C10":true,"sheet9!C11":true,"sheet9!C12":true,"sheet9!C13":true,"sheet9!C14":true,"sheet9!C15":true,"sheet9!C17":true,"sheet9!C18":true,"sheet9!C19":true,"sheet9!C20":true,"sheet9!C21":true,"sheet9!C22":true,"sheet9!C23":true,"sheet9!C24":true,"sheet9!C26":true,"sheet9!C27":true,"sheet9!C28":true,"sheet9!C29":true,"sheet9!C30":true,"sheet9!C31":true,"sheet9!C32":true,"sheet9!C33":true,"sheet9!C35":true,"sheet9!C36":true,"sheet9!C37":true,"sheet9!C38":true,"sheet9!C39":true,"sheet9!C40":true,"sheet9!C41":true,"sheet9!C42":true,"sheet9!C43":true,"sheet9!C44":true,"sheet9!C45":true,"sheet9!C46":true,"sheet9!C47":true,"sheet9!C48":true,"sheet9!C49":true,"sheet9!D3":true,"sheet9!D4":true,"sheet9!D50":true,"sheet9!D51":true,"sheet9!D8":true,"sheet9!D9":true,"sheet9!D10":true,"sheet9!D11":true,"sheet9!D12":true,"sheet9!D13":true,"sheet9!D14":true,"sheet9!D15":true,"sheet9!D17":true,"sheet9!D18":true,"sheet9!D19":true,"sheet9!D20":true,"sheet9!D21":true,"sheet9!D22":true,"sheet9!D23":true,"sheet9!D24":true,"sheet9!D26":true,"sheet9!D27":true,"sheet9!D28":true,"sheet9!D29":true,"sheet9!D30":true,"sheet9!D31":true,"sheet9!D32":true,"sheet9!D33":true,"sheet9!D35":true,"sheet9!D36":true,"sheet9!D37":true,"sheet9!D38":true,"sheet9!D39":true,"sheet9!D40":true,"sheet9!D41":true,"sheet9!D42":true,"sheet9!D43":true,"sheet9!D44":true,"sheet9!D45":true,"sheet9!D46":true,"sheet9!D47":true,"sheet9!D48":true,"sheet9!D49":true,"sheet9!H3":true,"sheet9!H4":true,"sheet9!H50":true,"sheet9!H51":true,"sheet9!H17":true,"sheet9!E17":true,"sheet9!H26":true,"sheet9!E26":true,"sheet9!H35":true,"sheet9!H44":true,"sheet9!E8":true,"sheet9!J8":true,"sheet9!H9":true,"sheet9!H10":true,"sheet9!H11":true,"sheet9!H12":true,"sheet9!H13":true,"sheet9!H14":true,"sheet9!H15":true,"sheet9!H18":true,"sheet9!H19":true,"sheet9!H20":true,"sheet9!H21":true,"sheet9!H22":true,"sheet9!H23":true,"sheet9!H24":true,"sheet9!H27":true,"sheet9!H28":true,"sheet9!H29":true,"sheet9!H30":true,"sheet9!H31":true,"sheet9!H32":true,"sheet9!H33":true,"sheet9!H36":true,"sheet9!H37":true,"sheet9!H38":true,"sheet9!H39":true,"sheet9!H40":true,"sheet9!H41":true,"sheet9!H42":true,"sheet9!H43":true,"sheet9!H45":true,"sheet9!H46":true,"sheet9!H47":true,"sheet9!H48":true,"sheet9!H49":true,"sheet9!I3":true,"sheet9!I4":true,"sheet9!I50":true,"sheet9!I51":true,"sheet9!I8":true,"sheet9!I9":true,"sheet9!I10":true,"sheet9!I11":true,"sheet9!I12":true,"sheet9!I13":true,"sheet9!I14":true,"sheet9!I15":true,"sheet9!I17":true,"sheet9!I18":true,"sheet9!I19":true,"sheet9!I20":true,"sheet9!I21":true,"sheet9!I22":true,"sheet9!I23":true,"sheet9!I24":true,"sheet9!I26":true,"sheet9!I27":true,"sheet9!I28":true,"sheet9!I29":true,"sheet9!I30":true,"sheet9!I31":true,"sheet9!I32":true,"sheet9!I33":true,"sheet9!I35":true,"sheet9!I36":true,"sheet9!I37":true,"sheet9!I38":true,"sheet9!I39":true,"sheet9!I40":true,"sheet9!I41":true,"sheet9!I42":true,"sheet9!I43":true,"sheet9!I44":true,"sheet9!I45":true,"sheet9!I46":true,"sheet9!I47":true,"sheet9!I48":true,"sheet9!I49":true,"sheet9!J17":true,"sheet9!E35":true,"sheet9!E44":true,"sheet9!H8":true,"sheet9!J36":true,"sheet9!J37":true,"sheet9!J38":true,"sheet9!J39":true,"sheet9!J40":true,"sheet9!J41":true,"sheet9!J42":true,"sheet9!J43":true,"sheet9!J44":true,"sheet9!J45":true,"sheet9!J46":true,"sheet9!J47":true,"sheet9!J48":true,"sheet9!J49":true,"sheet9!J50":true,"sheet9!J51":true,"sheet4!B3":true,"sheet4!B5":true,"sheet4!C5":true,"sheet4!D5":true,"sheet4!E5":true,"sheet4!F5":true,"sheet4!B6":true,"sheet4!B7":true,"sheet4!C7":true,"sheet4!E7":true,"sheet4!F7":true,"sheet4!B8":true,"sheet4!C8":true,"sheet4!E8":true,"sheet4!F8":true,"sheet4!B9":true,"sheet4!C9":true,"sheet4!E9":true,"sheet4!F9":true,"sheet4!B10":true,"sheet4!C10":true,"sheet4!E10":true,"sheet4!F10":true,"sheet4!B11":true,"sheet4!C11":true,"sheet4!E11":true,"sheet4!F11":true,"sheet4!B12":true,"sheet4!C12":true,"sheet4!E12":true,"sheet4!F12":true,"sheet4!B13":true,"sheet4!B14":true,"sheet4!B15":true,"sheet4!C15":true,"sheet4!D15":true,"sheet4!E15":true,"sheet4!F15":true,"sheet4!B16":true,"sheet4!C16":true,"sheet4!E16":true,"sheet4!F16":true,"sheet4!B17":true,"sheet4!C17":true,"sheet4!E17":true,"sheet4!F17":true,"sheet4!B18":true,"sheet4!C18":true,"sheet4!E18":true,"sheet4!F18":true,"sheet4!B19":true,"sheet4!C19":true,"sheet4!E19":true,"sheet4!F19":true,"sheet4!B20":true,"sheet4!C20":true,"sheet4!F20":true,"sheet4!B21":true,"sheet4!B22":true,"sheet4!C22":true,"sheet4!E22":true,"sheet4!F22":true,"sheet4!B23":true,"sheet4!C23":true,"sheet4!E23":true,"sheet4!F23":true,"sheet4!B24":true,"sheet4!C24":true,"sheet4!E24":true,"sheet4!F24":true,"sheet4!B25":true,"sheet4!C25":true,"sheet4!E25":true,"sheet4!F25":true,"sheet4!B26":true,"sheet4!C26":true,"sheet4!E26":true,"sheet4!F26":true,"sheet4!B27":true,"sheet4!C27":true,"sheet4!E27":true,"sheet4!F27":true,"sheet4!B28":true,"sheet4!B29":true,"sheet4!B30":true,"sheet4!C30":true,"sheet4!E30":true,"sheet4!F30":true,"sheet4!B31":true,"sheet4!C31":true,"sheet4!E31":true,"sheet4!F31":true,"sheet4!B32":true,"sheet4!C32":true,"sheet4!E32":true,"sheet4!F32":true,"sheet4!B33":true,"sheet4!C33":true,"sheet4!E33":true,"sheet4!F33":true,"sheet4!B34":true,"sheet4!C34":true,"sheet4!E34":true,"sheet4!F34":true,"sheet4!B35":true,"sheet4!C35":true,"sheet4!E35":true,"sheet4!F35":true,"sheet4!B36":true,"sheet4!C36":true,"sheet4!E36":true,"sheet4!F36":true,"sheet4!B37":true,"sheet4!C37":true,"sheet4!E37":true,"sheet4!F37":true,"sheet4!B38":true,"sheet4!B39":true,"sheet4!B40":true,"sheet4!C40":true,"sheet4!E40":true,"sheet4!F40":true,"sheet4!B41":true,"sheet4!C41":true,"sheet4!E41":true,"sheet4!F41":true,"sheet4!B42":true,"sheet4!C42":true,"sheet4!E42":true,"sheet4!F42":true,"sheet4!B43":true,"sheet4!B44":true,"sheet4!C44":true,"sheet4!E44":true,"sheet4!F44":true,"sheet4!B45":true,"sheet4!C45":true,"sheet4!E45":true,"sheet4!F45":true,"sheet4!B46":true,"sheet4!C46":true,"sheet4!E46":true,"sheet4!F46":true,"sheet4!B47":true,"sheet4!C47":true,"sheet4!E47":true,"sheet4!F47":true,"sheet4!B48":true,"sheet4!C48":true,"sheet4!E48":true,"sheet4!F48":true,"sheet4!B49":true,"sheet4!B50":true,"sheet4!C50":true,"sheet4!E50":true,"sheet4!F50":true,"sheet4!B51":true,"sheet4!C51":true,"sheet4!E51":true,"sheet4!F51":true,"sheet4!B52":true,"sheet4!C52":true,"sheet4!E52":true,"sheet4!F52":true,"sheet4!B53":true,"sheet4!C53":true,"sheet4!E53":true,"sheet4!F53":true,"sheet4!B54":true,"sheet4!C54":true,"sheet4!E54":true,"sheet4!F54":true,"sheet10!B3":true,"sheet10!B5":true,"sheet10!C5":true,"sheet10!D5":true,"sheet10!C7":true,"sheet10!D7":true,"sheet10!C9":true,"sheet10!C10":true,"sheet10!C11":true,"sheet10!D9":true,"sheet10!D10":true,"sheet10!D11":true,"sheet10!B8":true,"sheet10!B12":true,"sheet10!C13":true,"sheet10!C14":true,"sheet10!C15":true,"sheet10!D13":true,"sheet10!D14":true,"sheet10!D15":true},"constraints":{"sheet10!B7":["tc"],"sheet10!B9":["tc"],"sheet10!B10":["tc"],"sheet10!B11":["tc"],"sheet10!B13":["tc"],"sheet10!B14":["tc"],"sheet10!B15":["tc"]}}} \ No newline at end of file diff --git a/Website/excelinterop/tmp/EatingDisorder(7) b/Website/excelinterop/tmp/EatingDisorder(7) deleted file mode 100644 index 1dc0dbc..0000000 --- a/Website/excelinterop/tmp/EatingDisorder(7) +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":3,"currentid":"sheet1","currentname":"sheet9","sheetArr":{"sheet1":{"sheetstr":{"savestr":"version:1.5\ncell:A1:l:4:f:1:tvf:4:ntvf:4\ncell:B1:l:4:f:1:tvf:4:ntvf:4\ncell:A2:l:4:f:1:tvf:4:ntvf:4\ncell:B2:l:4:f:1:tvf:4:ntvf:4\ncell:A3:l:4:f:1:tvf:4:ntvf:4\ncell:B3:l:4:f:1:tvf:4:ntvf:4\ncell:C3:t:Weekly Meal Planner :b:3:3:3:3:l:2:f:13:c:3:bg:1:cf:1:colspan:9\ncell:D3:l:2:f:2\ncell:E3:l:2:f:2\ncell:F3:l:1:f:6\ncell:G3:l:1:f:6\ncell:H3:l:1:f:6\ncell:I3:l:1:f:6\ncell:J3:l:1:f:6\ncell:K3:l:1:f:6\ncell:A4:l:4:f:1:tvf:4:ntvf:4\ncell:B4:l:4:f:1:tvf:4:ntvf:4\ncell:C4:t:Week 2:l:3:f:9:cf:2:colspan:9\ncell:D4:t::l:1:f:17:cf:2\ncell:E4:t::l:1:f:17:cf:2\ncell:F4:t::l:1:f:17:cf:2\ncell:G4:t::l:1:f:17:cf:2\ncell:K4:l:1:f:16:cf:3\ncell:A5:l:4:f:1:tvf:4:ntvf:4\ncell:B5:l:4:f:1:tvf:4:ntvf:4\ncell:C5:l:1:f:5\ncell:D5:l:1:f:5\ncell:E5:l:1:f:5\ncell:F5:l:1:f:5\ncell:G5:l:1:f:5\ncell:H5:l:1:f:5\ncell:I5:l:1:f:5\ncell:J5:l:1:f:5\ncell:K5:l:1:f:5\ncell:A6:l:4:f:1:tvf:4:ntvf:4\ncell:B6:l:4:f:1:tvf:4:ntvf:4\ncell:C6:l:1:f:3:cf:2\ncell:D6:t::l:1:f:3:cf:2\ncell:E6:t::l:1:f:3:cf:2\ncell:F6:t::l:1:f:3:cf:2\ncell:G6:t::l:1:f:3:cf:2\ncell:H6:t::l:1:f:3:cf:2\ncell:I6:t::l:1:f:3:cf:2\ncell:J6:t::l:1:f:3:cf:2\ncell:K6:t::l:1:f:3:cf:2\ncell:A7:l:4:f:1:tvf:4:ntvf:4\ncell:B7:l:4:f:1:tvf:4:ntvf:4\ncell:C7:l:1:f:4\ncell:D7:l:1:f:4\ncell:E7:l:1:f:4\ncell:F7:l:1:f:4\ncell:G7:l:1:f:5\ncell:H7:l:1:f:5\ncell:I7:l:1:f:5\ncell:J7:l:1:f:5\ncell:K7:l:1:f:5\ncell:A8:l:4:f:1:tvf:4:ntvf:4\ncell:B8:l:4:f:1:tvf:4:ntvf:4\ncell:C8:t:Monday:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:3\ncell:D8:t:Date\\c:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:5:colspan:3\ncell:E8:t:Date\\c:b:3:3:3:3:l:2:f:9:c:3:bg:1:cf:2:ntvf:5:colspan:2\ncell:F8:b:::5::l:2:f:9:bg:1:cf:1:ntvf:5\ncell:G8:l:5:f:9:bg:3:cf:1\ncell:H8:t:Saturday:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:3\ncell:I8:t:Date\\c:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:5:colspan:3\ncell:J8:t:Date\\c:b:3:3:3:3:l:2:f:12:c:3:bg:1:cf:2:ntvf:5:colspan:2\ncell:K8:vtf:t::IF(F44=\"\",\"\",F44+1):b:::5::l:2:f:7:cf:2:ntvf:5\ncell:A9:l:4:f:1:tvf:4:ntvf:4\ncell:B9:l:4:f:1:tvf:4:ntvf:4\ncell:C9:t:Breakfast\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D9:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E9:b:2::2::l:1:f:7:bg:3:cf:2\ncell:F9:b:2::2::l:1:f:7:bg:3:cf:2\ncell:G9:l:5:f:7:bg:3:cf:2\ncell:H9:t:Breakfast\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:I9:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:J9:b:::4::l:1:f:15:cf:1\ncell:K9:b:::4::l:1:f:15\ncell:A10:l:4:f:1:tvf:4:ntvf:4\ncell:B10:l:4:f:1:tvf:4:ntvf:4\ncell:C10:t:Lunch\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D10:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E10:t::b:2::2::l:1:f:7:cf:2\ncell:F10:b:2::2::l:1:f:7:cf:2\ncell:G10:l:5:f:7:bg:3:cf:2\ncell:H10:t:Lunch\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:I10:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:J10:t::b:4::4::l:1:f:15:cf:2\ncell:K10:b:::4::l:1:f:15\ncell:A11:l:4:f:1:tvf:4:ntvf:4\ncell:B11:l:4:f:1:tvf:4:ntvf:4\ncell:C11:t:Snacks\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D11:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E11:t::b:2::2::l:1:f:7:bg:3:cf:2\ncell:F11:b:2::2::l:1:f:7:bg:3:cf:2\ncell:G11:l:5:f:7:bg:3:cf:2\ncell:H11:t:Snacks\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:I11:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:J11:t::b:4::4::l:1:f:15:cf:2\ncell:K11:b:::4::l:1:f:15\ncell:A12:l:4:f:1:tvf:4:ntvf:4\ncell:B12:l:4:f:1:tvf:4:ntvf:4\ncell:C12:t:Dinner\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D12:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E12:t::b:2::2::l:1:f:7:bg:2:cf:2\ncell:F12:b:2::2::l:1:f:7:bg:2:cf:2\ncell:G12:l:5:f:7:bg:3:cf:2\ncell:H12:t:Dinner\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:I12:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:J12:t::b:4::4::l:1:f:4:cf:2\ncell:K12:b:4::4::l:1:f:4\ncell:A13:l:4:f:1:tvf:4:ntvf:4\ncell:B13:l:4:f:1:tvf:4:ntvf:4\ncell:C13:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D13:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E13:t::b:2::2::l:1:f:7:bg:3:cf:2\ncell:F13:b:2::2::l:1:f:7:bg:3:cf:2\ncell:G13:l:5:f:7:bg:3:cf:2\ncell:H13:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:I13:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:J13:t::b:4::4::l:1:f:4:cf:2\ncell:K13:b:::4::l:1:f:4\ncell:A14:l:4:f:1:tvf:4:ntvf:4\ncell:B14:l:4:f:1:tvf:4:ntvf:4\ncell:C14:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D14:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E14:t::b:2::2::l:1:f:7:bg:2:cf:2\ncell:F14:b:2::2::l:1:f:7:bg:2:cf:2\ncell:G14:l:5:f:7:bg:3:cf:2\ncell:H14:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:I14:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:J14:t::b:4::4::l:1:f:4:cf:2\ncell:K14:b:::4::l:1:f:4\ncell:A15:l:4:f:1:tvf:4:ntvf:4\ncell:B15:l:4:f:1:tvf:4:ntvf:4\ncell:C15:t:Side\\c:b:1:1:1:1:l:1:f:7:cf:2\ncell:D15:b:1:1:1:1:l:1:f:7:cf:2:colspan:3\ncell:E15:t::b:2::2::l:1:f:7:cf:2\ncell:F15:b:2::2::l:1:f:7:cf:2\ncell:G15:l:5:f:7:bg:3:cf:2\ncell:H15:t:Side\\c:b:1:1:1:1:l:1:f:7:cf:2\ncell:I15:b:1:1:1:1:l:1:f:7:cf:2:colspan:3\ncell:J15:t::b:4::4::l:1:f:4:cf:2\ncell:K15:b:::4::l:1:f:4\ncell:A16:l:4:f:1:tvf:4:ntvf:4\ncell:B16:l:4:f:1:tvf:4:ntvf:4:colspan:10\ncell:C16:l:1:f:7:colspan:4\ncell:D16:l:1:f:7:colspan:3\ncell:E16:l:1:f:7\ncell:F16:l:1:f:7\ncell:G16:l:5:f:14:bg:3:cf:1\ncell:H16:l:1:f:7:colspan:4\ncell:I16:l:1:f:7:colspan:3\ncell:J16:l:1:f:7\ncell:K16:l:1:f:7\ncell:A17:l:4:f:1:tvf:4:ntvf:4\ncell:B17:l:4:f:1:tvf:4:ntvf:4\ncell:C17:t:Tuesday:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:3\ncell:D17:t:Date\\c:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:5:colspan:3\ncell:E17:t:Date\\c:b:3:3:3:3:l:2:f:9:c:3:bg:1:cf:2:ntvf:5:colspan:2\ncell:F17:vtf:t::IF(F8=\"\",\"\",F8+1):b:3:3:3:3:l:2:f:9:c:3:bg:1:cf:2:ntvf:5\ncell:G17:l:5:f:9:bg:3:cf:1\ncell:H17:t:Sunday:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:3\ncell:I17:t:Date\\c:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:5:colspan:3\ncell:J17:t:Date\\c:b:3:3:3:3:l:2:f:12:c:3:bg:1:cf:2:ntvf:5:colspan:2\ncell:K17:vtf:t::IF(K8=\"\",\"\",K8+1):b:::5::l:2:f:7:cf:2:ntvf:5\ncell:A18:l:4:f:1:tvf:4:ntvf:4\ncell:B18:l:4:f:1:tvf:4:ntvf:4\ncell:C18:t:Breakfast\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D18:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E18:b:2::2::l:1:f:7:bg:3:cf:2\ncell:F18:b:2::2::l:1:f:7:bg:3:cf:2\ncell:G18:l:5:f:7:bg:3:cf:2\ncell:H18:t:Breakfast\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:I18:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:J18:b:::4::l:1:f:15:cf:1\ncell:K18:b:::4::l:1:f:15\ncell:A19:l:4:f:1:tvf:4:ntvf:4\ncell:B19:l:4:f:1:tvf:4:ntvf:4\ncell:C19:t:Lunch\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D19:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E19:t::b:2::2::l:1:f:7:cf:2\ncell:F19:b:2::2::l:1:f:7:cf:2\ncell:G19:l:5:f:7:bg:3:cf:2\ncell:H19:t:Lunch\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:I19:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:J19:t::b:4::4::l:1:f:15:cf:2\ncell:K19:b:::4::l:1:f:15\ncell:A20:l:4:f:1:tvf:4:ntvf:4\ncell:B20:l:4:f:1:tvf:4:ntvf:4\ncell:C20:t:Snacks\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D20:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E20:t::b:2::2::l:1:f:7:bg:3:cf:2\ncell:F20:b:2::2::l:1:f:7:bg:3:cf:2\ncell:G20:l:5:f:7:bg:3:cf:2\ncell:H20:t:Snacks\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:I20:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:J20:t::b:4::4::l:1:f:15:cf:2\ncell:K20:b:::4::l:1:f:15\ncell:A21:l:4:f:1:tvf:4:ntvf:4\ncell:B21:l:4:f:1:tvf:4:ntvf:4\ncell:C21:t:Dinner\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D21:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E21:t::b:2::2::l:1:f:7:bg:2:cf:2\ncell:F21:b:2::2::l:1:f:7:bg:2:cf:2\ncell:G21:l:5:f:7:bg:3:cf:2\ncell:H21:t:Dinner\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:I21:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:J21:t::b:4::4::l:1:f:4:cf:2\ncell:K21:b:4::4::l:1:f:4\ncell:A22:l:4:f:1:tvf:4:ntvf:4\ncell:B22:l:4:f:1:tvf:4:ntvf:4\ncell:C22:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D22:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E22:t::b:2::2::l:1:f:7:bg:3:cf:2\ncell:F22:b:2::2::l:1:f:7:bg:3:cf:2\ncell:G22:l:5:f:7:bg:3:cf:2\ncell:H22:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:I22:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:J22:t::b:4::4::l:1:f:4:cf:2\ncell:K22:b:::4::l:1:f:4\ncell:A23:l:4:f:1:tvf:4:ntvf:4\ncell:B23:l:4:f:1:tvf:4:ntvf:4\ncell:C23:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D23:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E23:t::b:2::2::l:1:f:7:bg:2:cf:2\ncell:F23:b:2::2::l:1:f:7:bg:2:cf:2\ncell:G23:l:5:f:7:bg:3:cf:2\ncell:H23:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:I23:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:J23:t::b:4::4::l:1:f:4:cf:2\ncell:K23:b:::4::l:1:f:4\ncell:A24:l:4:f:1:tvf:4:ntvf:4\ncell:B24:l:4:f:1:tvf:4:ntvf:4\ncell:C24:t:Side\\c:b:1:1:1:1:l:1:f:7:cf:2\ncell:D24:b:1:1:1:1:l:1:f:7:cf:2:colspan:3\ncell:E24:t::b:2::2::l:1:f:7:cf:2\ncell:F24:b:2::2::l:1:f:7:cf:2\ncell:G24:l:5:f:7:bg:3:cf:2\ncell:H24:t:Side\\c:b:1:1:1:1:l:1:f:7:cf:2\ncell:I24:b:1:1:1:1:l:1:f:7:cf:2:colspan:3\ncell:J24:t::b:4::4::l:1:f:4:cf:2\ncell:K24:b:::4::l:1:f:4\ncell:A25:l:4:f:1:tvf:4:ntvf:4\ncell:B25:l:4:f:1:tvf:4:ntvf:4:colspan:10\ncell:C25:l:1:f:4:colspan:4\ncell:D25:l:1:f:4\ncell:E25:l:1:f:4\ncell:F25:l:1:f:4\ncell:G25:l:5:f:14:bg:3:cf:1\ncell:H25:l:1:f:7:colspan:4\ncell:I25:l:1:f:7\ncell:J25:l:1:f:7\ncell:K25:l:1:f:7\ncell:A26:l:4:f:1:tvf:4:ntvf:4\ncell:B26:l:4:f:1:tvf:4:ntvf:4\ncell:C26:t:Wednesday:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:3\ncell:D26:t:Date\\c:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:5:colspan:3\ncell:E26:t:Date\\c:b:3:3:3:3:l:2:f:9:c:3:bg:1:cf:2:ntvf:5:colspan:2\ncell:F26:vtf:t::IF(F17=\"\",\"\",F17+1):b:3:3:3:3:l:2:f:9:c:3:bg:1:cf:2:ntvf:5\ncell:G26:l:5:f:9:bg:3:cf:1\ncell:H26:t:Notes:b:1:1:1:1:l:2:f:9:c:3:bg:1:ntvf:3:colspan:4\ncell:I26:b:::5::l:2:f:10:ntvf:3\ncell:J26:b:::5::l:2:f:10:ntvf:3\ncell:K26:b:::5::l:2:f:10:ntvf:3\ncell:A27:l:4:f:1:tvf:4:ntvf:4\ncell:B27:l:4:f:1:tvf:4:ntvf:4\ncell:C27:t:Breakfast\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D27:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E27:b:::4::l:1:f:7:cf:2\ncell:F27:b:::4::l:1:f:7:cf:2\ncell:G27:l:5:f:7:bg:3:cf:2\ncell:H27:b:1:1:1:1:l:1:f:7:cf:2:colspan:4\ncell:I27:l:1:f:4\ncell:J27:l:1:f:4\ncell:K27:l:1:f:4\ncell:A28:l:4:f:1:tvf:4:ntvf:4\ncell:B28:l:4:f:1:tvf:4:ntvf:4\ncell:C28:t:Lunch\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D28:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E28:t::b:4::4::l:1:f:7:cf:2\ncell:F28:b:::4::l:1:f:7:cf:2\ncell:G28:l:5:f:7:bg:3:cf:2\ncell:H28:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:4\ncell:I28:l:1:f:4\ncell:J28:l:1:f:4\ncell:K28:l:1:f:4\ncell:A29:l:4:f:1:tvf:4:ntvf:4\ncell:B29:l:4:f:1:tvf:4:ntvf:4\ncell:C29:t:Snacks\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D29:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E29:t::b:4::4::l:1:f:7:cf:2\ncell:F29:b:::4::l:1:f:7:cf:2\ncell:G29:l:5:f:7:bg:3:cf:2\ncell:H29:b:1:1:1:1:l:1:f:7:cf:2:colspan:4\ncell:I29:l:1:f:4\ncell:J29:l:1:f:4\ncell:K29:l:1:f:4\ncell:A30:l:4:f:1:tvf:4:ntvf:4\ncell:B30:l:4:f:1:tvf:4:ntvf:4\ncell:C30:t:Dinner\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D30:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E30:t::b:4::4::l:1:f:7:cf:2\ncell:F30:b:4::4::l:1:f:7:cf:2\ncell:G30:l:5:f:7:bg:3:cf:2\ncell:H30:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:4\ncell:I30:l:1:f:4\ncell:J30:l:1:f:4\ncell:K30:l:1:f:4\ncell:A31:l:4:f:1:tvf:4:ntvf:4\ncell:B31:l:4:f:1:tvf:4:ntvf:4\ncell:C31:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D31:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E31:t::b:4::4::l:1:f:7:cf:2\ncell:F31:b:::4::l:1:f:7:cf:2\ncell:G31:l:5:f:7:bg:3:cf:2\ncell:H31:b:1:1:1:1:l:1:f:7:cf:2:colspan:4\ncell:I31:l:1:f:4\ncell:J31:l:1:f:4\ncell:K31:l:1:f:4\ncell:A32:l:4:f:1:tvf:4:ntvf:4\ncell:B32:l:4:f:1:tvf:4:ntvf:4\ncell:C32:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D32:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E32:t::b:4::4::l:1:f:7:cf:2\ncell:F32:b:::4::l:1:f:7:cf:2\ncell:G32:l:5:f:7:bg:3:cf:2\ncell:H32:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:4\ncell:I32:l:1:f:4\ncell:J32:l:1:f:4\ncell:K32:l:1:f:4\ncell:A33:l:4:f:1:tvf:4:ntvf:4\ncell:B33:l:4:f:1:tvf:4:ntvf:4\ncell:C33:t:Side\\c:b:1:1:1:1:l:1:f:7:cf:2\ncell:D33:b:1:1:1:1:l:1:f:7:cf:2:colspan:3\ncell:E33:t::b:4::4::l:1:f:7:cf:2\ncell:F33:b:::4::l:1:f:7:cf:2\ncell:G33:l:5:f:7:bg:3:cf:2\ncell:H33:b:1:1:1:1:l:1:f:7:cf:2:colspan:4\ncell:I33:l:1:f:4\ncell:J33:l:1:f:4\ncell:K33:l:1:f:4\ncell:A34:l:4:f:1:tvf:4:ntvf:4\ncell:B34:l:4:f:1:tvf:4:ntvf:4:colspan:10\ncell:C34:l:1:f:4:colspan:4\ncell:D34:l:1:f:4\ncell:E34:l:1:f:4\ncell:F34:l:1:f:4\ncell:G34:l:5:f:1:bg:3:cf:1\ncell:H34:l:1:f:4\ncell:I34:l:1:f:4\ncell:J34:l:1:f:4\ncell:K34:l:1:f:4\ncell:A35:l:4:f:1:tvf:4:ntvf:4\ncell:B35:l:4:f:1:tvf:4:ntvf:4\ncell:C35:t:Thursday:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:3\ncell:D35:t:Date\\c:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:5:colspan:3\ncell:E35:t:Date\\c:b:3:3:3:3:l:2:f:9:c:3:bg:1:cf:2:ntvf:5:colspan:2\ncell:F35:vtf:t::IF(F26=\"\",\"\",F26+1):b:3:3:3:3:l:2:f:9:c:3:bg:1:cf:2:ntvf:5\ncell:G35:l:5:f:9:bg:3:cf:1\ncell:H35:t:Grocery List:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:3:colspan:4\ncell:I35:b:1:1:1:1:l:2:f:10:ntvf:3\ncell:J35:b:1:1:1:1:l:2:f:10:ntvf:3\ncell:K35:b:::5::l:2:f:10:ntvf:3\ncell:A36:l:4:f:1:tvf:4:ntvf:4\ncell:B36:l:4:f:1:tvf:4:ntvf:4\ncell:C36:t:Breakfast\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D36:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E36:b:::4::l:1:f:15:cf:1\ncell:F36:b:::4::l:1:f:15\ncell:G36:l:5:f:1:bg:3:cf:1\ncell:H36:b:1:1:1:1:l:1:f:7:cf:2:ntvf:2:colspan:2\ncell:I36:t::b:1:1:1:1:l:1:f:7:cf:2:ntvf:2\ncell:J36:t: :b:1:1:1:1:l:1:f:7:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K36:t::b:5::4::l:1:f:4:cf:2:ntvf:1\ncell:A37:l:4:f:1:tvf:4:ntvf:4\ncell:B37:l:4:f:1:tvf:4:ntvf:4\ncell:C37:t:Lunch\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D37:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E37:t::b:4::4::l:1:f:15:cf:2\ncell:F37:b:::4::l:1:f:15\ncell:G37:l:5:f:1:bg:3:cf:1\ncell:H37:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I37:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J37:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K37:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A38:l:4:f:1:tvf:4:ntvf:4\ncell:B38:l:4:f:1:tvf:4:ntvf:4\ncell:C38:t:Snacks\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D38:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E38:t::b:4::4::l:1:f:15:cf:2\ncell:F38:b:::4::l:1:f:15\ncell:G38:l:5:f:1:bg:3:cf:1\ncell:H38:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I38:t::b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2\ncell:J38:t: :b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K38:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A39:l:4:f:1:tvf:4:ntvf:4\ncell:B39:l:4:f:1:tvf:4:ntvf:4\ncell:C39:t:Dinner\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D39:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E39:t::b:4::4::l:1:f:4:cf:2\ncell:F39:b:4::4::l:1:f:4\ncell:G39:l:5:f:1:bg:3:cf:1\ncell:H39:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I39:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J39:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K39:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A40:l:4:f:1:tvf:4:ntvf:4\ncell:B40:l:4:f:1:tvf:4:ntvf:4\ncell:C40:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D40:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E40:t::b:4::4::l:1:f:4:cf:2\ncell:F40:b:::4::l:1:f:4\ncell:G40:l:5:f:1:bg:3:cf:1\ncell:H40:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I40:t::b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2\ncell:J40:t: :b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K40:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A41:l:4:f:1:tvf:4:ntvf:4\ncell:B41:l:4:f:1:tvf:4:ntvf:4\ncell:C41:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D41:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E41:t::b:4::4::l:1:f:4:cf:2\ncell:F41:b:::4::l:1:f:4\ncell:G41:l:5:f:1:bg:3:cf:1\ncell:H41:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I41:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J41:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K41:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A42:l:4:f:1:tvf:4:ntvf:4\ncell:B42:l:4:f:1:tvf:4:ntvf:4\ncell:C42:t:Side\\c:b:1:1:1:1:l:1:f:7:cf:2\ncell:D42:b:1:1:1:1:l:1:f:7:cf:2:colspan:3\ncell:E42:t::b:4::4::l:1:f:4:cf:2\ncell:F42:b:::4::l:1:f:4\ncell:G42:l:5:f:1:bg:3:cf:1\ncell:H42:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I42:t::b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2\ncell:J42:t: :b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K42:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A43:l:4:f:1:tvf:4:ntvf:4\ncell:B43:l:4:f:1:tvf:4:ntvf:4:colspan:5\ncell:C43:l:1:f:4:colspan:4\ncell:D43:l:1:f:4\ncell:E43:l:1:f:4\ncell:F43:l:1:f:4\ncell:G43:l:5:f:1:bg:3:cf:1\ncell:H43:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I43:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J43:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K43:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A44:l:4:f:1:tvf:4:ntvf:4\ncell:B44:l:4:f:1:tvf:4:ntvf:4\ncell:C44:t:Friday:b:1:1:1:1:l:2:f:8:c:3:bg:1:cf:1:ntvf:3\ncell:D44:t:Date\\c:b:1:1:1:1:l:2:f:9:c:3:bg:1:cf:1:ntvf:5:colspan:3\ncell:E44:t:Date\\c:b:3:3:3:3:l:2:f:11:c:3:bg:1:cf:2:ntvf:5:colspan:2\ncell:F44:vtf:t::IF(F35=\"\",\"\",F35+1):b:::5::l:2:f:7:cf:2:ntvf:5\ncell:G44:l:5:f:1:bg:3:cf:1\ncell:H44:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I44:t::b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2\ncell:J44:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K44:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A45:l:4:f:1:tvf:4:ntvf:4\ncell:B45:l:4:f:1:tvf:4:ntvf:4\ncell:C45:t:Breakfast\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D45:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E45:b:::4::l:1:f:15:cf:1\ncell:F45:b:::4::l:1:f:15\ncell:G45:l:5:f:1:bg:3:cf:1\ncell:H45:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I45:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J45:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K45:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A46:l:4:f:1:tvf:4:ntvf:4\ncell:B46:l:4:f:1:tvf:4:ntvf:4\ncell:C46:t:Lunch\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D46:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E46:t::b:4::4::l:1:f:15:cf:2\ncell:F46:b:::4::l:1:f:15\ncell:G46:l:5:f:1:bg:3:cf:1\ncell:H46:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I46:t::b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2\ncell:J46:t: :b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K46:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A47:l:4:f:1:tvf:4:ntvf:4\ncell:B47:l:4:f:1:tvf:4:ntvf:4\ncell:C47:t:Snacks:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D47:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E47:t::b:4::4::l:1:f:15:cf:2\ncell:F47:b:::4::l:1:f:15\ncell:G47:l:5:f:1:bg:3:cf:1\ncell:H47:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I47:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J47:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K47:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A48:l:4:f:1:tvf:4:ntvf:4\ncell:B48:l:4:f:1:tvf:4:ntvf:4\ncell:C48:t:Dinner\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D48:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E48:t::b:4::4::l:1:f:4:cf:2\ncell:F48:b:4::4::l:1:f:4\ncell:G48:l:5:f:1:bg:3:cf:1\ncell:H48:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I48:t::b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2\ncell:J48:t: :b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K48:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A49:l:4:f:1:tvf:4:ntvf:4\ncell:B49:l:4:f:1:tvf:4:ntvf:4\ncell:C49:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D49:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E49:t::b:4::4::l:1:f:4:bg:3:cf:2\ncell:F49:b:::4::l:1:f:4:bg:3\ncell:G49:l:5:f:1:bg:3:cf:1\ncell:H49:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I49:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J49:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K49:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A50:l:4:f:1:tvf:4:ntvf:4\ncell:B50:l:4:f:1:tvf:4:ntvf:4\ncell:C50:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:2:cf:2\ncell:D50:b:1:1:1:1:l:1:f:7:bg:2:cf:2:colspan:3\ncell:E50:t::b:4::4::l:1:f:4:bg:2:cf:2\ncell:F50:b:::4::l:1:f:4:bg:2\ncell:G50:l:5:f:1:bg:3:cf:1\ncell:H50:b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I50:t::b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2\ncell:J50:t: :b:1:1:1:1:l:1:f:7:bg:3:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K50:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A51:l:4:f:1:tvf:4:ntvf:4\ncell:B51:l:4:f:1:tvf:4:ntvf:4\ncell:C51:t:Side\\c:b:1:1:1:1:l:1:f:7:bg:3:cf:2\ncell:D51:b:1:1:1:1:l:1:f:7:bg:3:cf:2:colspan:3\ncell:E51:t::b:::1::l:1:f:4:bg:3:cf:2\ncell:F51:b:::1::l:1:f:4:bg:3\ncell:G51:l:5:f:1:bg:3:cf:1\ncell:H51:b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:I51:t::b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2\ncell:J51:t: :b:1:1:1:1:l:1:f:7:bg:2:cf:2:ntvf:2:colspan:2:rowspan:1\ncell:K51:t::b:4::4::l:1:f:4:cf:2:ntvf:1\ncell:A52:l:4:f:1:tvf:4:ntvf:4\ncell:B52:l:4:f:1:tvf:4:ntvf:4:colspan:5\ncell:G52:l:5:f:1:bg:3:cf:1\ncell:A53:l:4:f:1:tvf:4:ntvf:4\ncell:B53:l:4:f:1:tvf:4:ntvf:4\ncell:G53:l:5:f:1:bg:3:cf:1\ncell:A54:l:4:f:1:tvf:4:ntvf:4\ncell:B54:l:4:f:1:tvf:4:ntvf:4\ncell:G54:l:5:f:1:bg:3:cf:1\ncell:A55:l:4:f:1:tvf:4:ntvf:4\ncell:B55:l:4:f:1:tvf:4:ntvf:4\ncell:G55:l:5:f:1:bg:3:cf:1\ncell:A56:l:4:f:1:tvf:4:ntvf:4\ncell:B56:l:4:f:1:tvf:4:ntvf:4\ncell:G56:f:1\ncell:A57:l:4:f:1:tvf:4:ntvf:4\ncell:B57:l:4:f:1:tvf:4:ntvf:4\ncell:G57:f:1\ncell:A58:l:4:f:1:tvf:4:ntvf:4\ncell:B58:l:4:f:1:tvf:4:ntvf:4\ncell:G58:f:1\ncell:A59:l:4:f:1:tvf:4:ntvf:4\ncell:B59:l:4:f:1:tvf:4:ntvf:4\ncell:G59:f:1\ncell:A60:l:4:f:1:tvf:4:ntvf:4\ncell:B60:l:4:f:1:tvf:4:ntvf:4\ncell:G60:f:1\ncell:A61:l:4:f:1:tvf:4:ntvf:4\ncell:B61:l:4:f:1:tvf:4:ntvf:4\ncell:G61:f:1\ncell:A62:l:4:f:1\ncell:B62:l:4:f:1\ncell:G62:f:1\ncell:A63:l:4:f:1\ncell:B63:l:4:f:1\ncell:G63:f:1\ncell:A64:l:4:f:1\ncell:B64:l:4:f:1\ncell:G64:f:1\ncell:A65:l:4:f:1\ncell:B65:l:4:f:1\ncell:G65:f:1\ncell:A66:l:4:f:1\ncell:B66:l:4:f:1\ncell:G66:f:1\ncell:A67:l:4:f:1\ncell:B67:l:4:f:1\ncell:G67:f:1\ncell:A68:l:4:f:1\ncell:B68:l:4:f:1\ncell:G68:f:1\ncell:A69:l:4:f:1\ncell:B69:l:4:f:1\ncell:G69:f:1\ncell:A70:l:4:f:1\ncell:B70:l:4:f:1\ncell:G70:f:1\ncell:A71:l:4:f:1\ncell:B71:l:4:f:1\ncell:G71:f:1\ncell:A72:l:4:f:1\ncell:B72:l:4:f:1\ncell:G72:f:1\ncell:A73:l:4:f:1\ncell:B73:l:4:f:1\ncell:G73:f:1\ncell:A74:l:4:f:1\ncell:B74:l:4:f:1\ncell:G74:f:1\ncell:A75:l:4:f:1\ncell:B75:l:4:f:1\ncell:G75:f:1\ncell:A76:l:4:f:1\ncell:B76:l:4:f:1\ncell:G76:f:1\ncell:A77:l:4:f:1\ncell:B77:l:4:f:1\ncell:G77:f:1\ncell:A78:l:4:f:1\ncell:B78:l:4:f:1\ncell:G78:f:1\ncell:A79:l:4:f:1\ncell:B79:l:4:f:1\ncell:A80:l:4:f:1\ncell:B80:l:4:f:1\ncell:A81:l:4:f:1\ncell:B81:l:4:f:1\ncell:A82:l:4:f:1\ncell:B82:l:4:f:1\ncell:A83:l:4:f:1\ncell:B83:l:4:f:1\ncell:A84:l:4:f:1\ncell:B84:l:4:f:1\ncell:A85:l:4:f:1\ncell:B85:l:4:f:1\ncell:A86:l:4:f:1\ncell:B86:l:4:f:1\ncell:A87:l:4:f:1\ncell:B87:l:4:f:1\ncell:A88:l:4:f:1\ncell:B88:l:4:f:1\ncell:A89:l:4:f:1\ncell:B89:l:4:f:1\ncell:A90:l:4:f:1\ncell:B90:l:4:f:1\ncell:A91:l:4:f:1\ncell:B91:l:4:f:1\ncell:A92:l:4:f:1\ncell:B92:l:4:f:1\ncell:A93:l:4:f:1\ncell:B93:l:4:f:1\ncol:A:w:10\ncol:B:w:10\ncol:C:w:90\ncol:D:w:26\ncol:E:w:80\ncol:F:w:24\ncol:G:w:30\ncol:H:w:90\ncol:I:w:28\ncol:J:w:80\ncol:K:w:37\nrow:1:h:24\nrow:2:h:24\nrow:3:h:24\nrow:6:h:20.25\nrow:7:h:18\nrow:8:h:18\nrow:9:h:14.1\nrow:10:h:14.1\nrow:11:h:14.1\nrow:12:h:18\nrow:13:h:18\nrow:14:h:18\nrow:15:h:18\nrow:16:h:14.25\nrow:17:h:18\nrow:18:h:14.1\nrow:19:h:14.1\nrow:20:h:14.1\nrow:21:h:18\nrow:22:h:18\nrow:23:h:18\nrow:24:h:18\nrow:25:h:14.25\nrow:26:h:18\nrow:27:h:14.1\nrow:28:h:14.1\nrow:29:h:14.1\nrow:30:h:18\nrow:31:h:18\nrow:32:h:18\nrow:33:h:18\nrow:35:h:18\nrow:36:h:14.1\nrow:37:h:14.1\nrow:39:h:18\nrow:40:h:18\nrow:41:h:18\nrow:42:h:18\nrow:44:h:18\nrow:48:h:18\nrow:49:h:18\nrow:50:h:18\nrow:51:h:18\nsheet:c:11:r:93:h:12.75:layout:6\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(192,192,192)\nborder:3:1px solid rgb(255, 255, 255)\nborder:4:thin dotted rgb(192,192,192)\nborder:5:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 6pt *\nfont:2:normal bold 14pt Verdana\nfont:3:normal bold 16pt Arial\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 10pt Tahoma\nfont:6:normal normal 10pt Verdana\nfont:7:normal normal 11pt Arial\nfont:8:normal normal 12pt Arial\nfont:9:normal normal 12pt arial,helvetica,sans-serif\nfont:10:normal normal 14pt Arial\nfont:11:normal normal 16pt Arial\nfont:12:normal normal 16pt arial,helvetica,sans-serif\nfont:13:normal normal 18pt arial,helvetica,sans-serif\nfont:14:normal normal 6pt arial,helvetica,sans-serif\nfont:15:normal normal 8pt Arial\nfont:16:normal normal 8pt Tahoma\nfont:17:normal normal 8pt Verdana\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:0px * 0px *;vertical-align:bottom;\nlayout:4:padding:0px 0px 0px 0px;vertical-align:*;\nlayout:5:padding:0px 0px 0px 0px;vertical-align:middle;\nlayout:6:padding:4px 2px 4px 2px;vertical-align:*;\nvalueformat:1:\"□ \"@\nvalueformat:2:#,##0\nvalueformat:3:dddd\nvalueformat:4:hidden\nvalueformat:5:m/d/yy\n"},"name":"sheet9","hidden":"0"},"sheet2":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Shopping Checklist:f:6:c:3:bg:1:cf:1:colspan:5\ncell:B4:f:3:cf:1\ncell:B5:t:Ingredient:b:1:1:1:1:f:4:cf:1\ncell:C5:t:Quantity:b:1:1:1:1:f:4:cf:1\ncell:D5:t:Chk:b:1:1:1:1:f:4:cf:1\ncell:E5:t:Replacement:b:1:1:1:1:f:4:cf:1\ncell:F5:t:Notes:b:1:1:1:1:f:4:cf:1\ncell:B6:t:Grains:b:1:1:1:1:l:2:f:5:cf:2:colspan:5\ncell:B7:t:Wheat:b::1::1:l:2:f:1\ncell:C7:b::1::1:ntvf:1\ncell:D7:t:
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E7:b::1::1\ncell:F7:b::1:1:1\ncell:B8:t:Flour:b::1::1:l:2:f:1:bg:2\ncell:C8:b::1::1:bg:2:ntvf:1\ncell:D8:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E8:b::1::1:bg:2\ncell:F8:b:1:1:1:1:bg:2\ncell:B9:t:Corn Meal:b::1::1:l:2:f:1\ncell:C9:b::1::1:ntvf:1\ncell:D9:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E9:b::1::1\ncell:F9:b::1:1:1\ncell:B10:t:Oats:b::1::1:l:2:f:1:bg:2\ncell:C10:b::1::1:bg:2:ntvf:1\ncell:D10:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E10:b::1::1:bg:2\ncell:F10:b:1:1:1:1:bg:2\ncell:B11:t:Rice:b::1::1:l:2:f:1\ncell:C11:b::1::1:ntvf:1\ncell:D11:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E11:b::1::1\ncell:F11:b::1:1:1\ncell:B12:t:Pasta:b::1::1:l:2:f:1:bg:2\ncell:C12:b::1::1:bg:2:ntvf:1\ncell:D12:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E12:b::1::1:bg:2\ncell:F12:b:1:1:1:1:bg:2\ncell:B13:t:Total Grains:b::1::1:l:2:f:1\ncell:C13:vtf:n:0:SUM(C7\\cC12):b::1::1:ntvf:1\ncell:D13:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E13:b::1::1\ncell:F13:b::1:1:1\ncell:B14:t:Fats and Oils:b:1:1:1:1:l:2:f:5:colspan:5\ncell:C14:b::1::1:ntvf:1\ncell:D14:b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E14:b::1::1\ncell:F14:b:1:1:1:1\ncell:B15:t:Shortening:b::1::1:l:2:f:1\ncell:C15:b::1::1:ntvf:1\ncell:D15:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E15:b::1::1\ncell:F15:b::1:1:1\ncell:B16:t:Vegetable Oil:b::1::1:l:2:f:1:bg:2\ncell:C16:b::1::1:bg:2:ntvf:1\ncell:D16:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E16:b::1::1:bg:2\ncell:F16:b::1::1:bg:2\ncell:B17:t:Mayonnaise:b::1::1:l:2:f:1\ncell:C17:b::1::1:ntvf:1\ncell:D17:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E17:b::1::1\ncell:F17:b:1:1:1:1\ncell:B18:t:Salad Dressing:b::1::1:l:2:f:1:bg:2\ncell:C18:b::1::1:bg:2:ntvf:1\ncell:D18:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E18:b::1::1:bg:2\ncell:F18:b:1:1:1:1:bg:2\ncell:B19:t:Peanut Butter:b::1::1:l:2:f:1\ncell:C19:b::1::1:ntvf:1\ncell:D19:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E19:b::1::1\ncell:F19:b:1:1:1:1\ncell:B20:t:Total Fats and Oils:b::1::1:l:2:f:1:bg:2\ncell:C20:vtf:n:0:SUM(C15\\cC19):b::1::1:bg:2:ntvf:1\ncell:D20:b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E20:b::1::1:bg:2\ncell:F20:b:1:1:1:1:bg:2\ncell:B21:t:Legumes:b:1:1:1:1:l:2:f:5:colspan:5\ncell:C21:b::1::1:ntvf:1\ncell:D21:b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E21:b::1::1\ncell:F21:b::1::1\ncell:B22:t:Beans, dry:b::1::1:l:2:f:1:bg:3\ncell:C22:b::1::1:ntvf:1\ncell:D22:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E22:b::1::1\ncell:F22:b::1:1:1\ncell:B23:t:Lima Beans:b::1::1:l:2:f:1:bg:2\ncell:C23:b::1::1:bg:2:ntvf:1\ncell:D23:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E23:b::1::1:bg:2\ncell:F23:b:1:1:1:1:bg:2\ncell:B24:t:Soy Beans:b::1::1:l:2:f:1:bg:3\ncell:C24:b::1::1:ntvf:1\ncell:D24:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E24:b::1::1\ncell:F24:b::1:1:1\ncell:B25:t:Split Peas:b::1::1:l:2:f:1:bg:2\ncell:C25:b::1::1:bg:2:ntvf:1\ncell:D25:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E25:b::1::1:bg:2\ncell:F25:b:1:1:1:1:bg:2\ncell:B26:t:Lentils:b::1::1:l:2:f:1:bg:3\ncell:C26:b::1::1:ntvf:1\ncell:D26:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E26:b::1::1\ncell:F26:b::1:1:1\ncell:B27:t:Dry Soup Mix:b::1::1:l:2:f:1:bg:2\ncell:C27:b::1::1:bg:2:ntvf:1\ncell:D27:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E27:b::1::1:bg:2\ncell:F27:b::1::1:bg:2\ncell:B28:t:Total Legumes:b::1::1:l:2:f:1:bg:3\ncell:C28:vtf:n:0:SUM(C22\\cC27):b::1::1:ntvf:1\ncell:D28:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E28:b::1::1\ncell:F28:b:1:1:1:1\ncell:B29:t:Sugars:b:1:1:1:1:l:2:f:5:colspan:5\ncell:C29:b::1::1:ntvf:1\ncell:D29:b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E29:b::1::1\ncell:F29:b::1::1\ncell:B30:t:Honey:b::1::1:l:2:f:1:bg:3\ncell:C30:b::1::1:ntvf:1\ncell:D30:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E30:b::1::1\ncell:F30:b::1:1:1\ncell:B31:t:Sugar:b::1::1:l:2:f:1:bg:2\ncell:C31:b::1::1:bg:2:ntvf:1\ncell:D31:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E31:b::1::1:bg:2\ncell:F31:b::1::1:bg:2\ncell:B32:t:Brown Sugar:b::1::1:l:2:f:1:bg:3\ncell:C32:b::1::1:ntvf:1\ncell:D32:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E32:b::1::1\ncell:F32:b:1:1:1:1\ncell:B33:t:Molasses:b::1::1:l:2:f:1:bg:2\ncell:C33:b::1::1:bg:2:ntvf:1\ncell:D33:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E33:b::1::1:bg:2\ncell:F33:b::1::1:bg:2\ncell:B34:t:Corn Syrup:b::1::1:l:2:f:1:bg:3\ncell:C34:b::1::1:ntvf:1\ncell:D34:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E34:b::1::1\ncell:F34:b:1:1:1:1\ncell:B35:t:Jams:b::1::1:l:2:f:1:bg:2\ncell:C35:b::1::1:bg:2:ntvf:1\ncell:D35:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E35:b::1::1:bg:2\ncell:F35:b:1:1:1:1:bg:2\ncell:B36:t:Fruit drink powdered:b::1::1:l:2:f:1:bg:3\ncell:C36:b::1::1:ntvf:1\ncell:D36:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E36:b::1::1\ncell:F36:b::1:1:1\ncell:B37:t:Flavored Gelatin:b::1::1:l:2:f:1:bg:2\ncell:C37:b::1::1:bg:2:ntvf:1\ncell:D37:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E37:b::1::1:bg:2\ncell:F37:b:1:1:1:1:bg:2\ncell:B38:t:Total Sugars:b::1::1:l:2:f:1:bg:3\ncell:C38:vtf:n:0:SUM(C30\\cC37):b::1::1:ntvf:1\ncell:D38:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E38:b::1::1\ncell:F38:b::1:1:1\ncell:B39:t:Milk:b:1:1:1:1:l:2:f:5:bg:3:colspan:5\ncell:C39:b::1::1:ntvf:1\ncell:D39:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E39:b::1::1\ncell:F39:b::1::1\ncell:B40:t:Dry Milk:b::1::1:l:2:f:1:bg:3\ncell:C40:b::1::1:ntvf:1\ncell:D40:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E40:b::1::1\ncell:F40:b:1:1:1:1\ncell:B41:t:Evaporated Milk:b::1::1:l:2:f:1:bg:2\ncell:C41:b::1::1:bg:2:ntvf:1\ncell:D41:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E41:b::1::1:bg:2\ncell:F41:b::1::1:bg:2\ncell:B42:t:Powdered Eggs:b::1::1:l:2:f:1:bg:3\ncell:C42:b::1::1:ntvf:1\ncell:D42:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E42:b::1::1\ncell:F42:b:1:1:1:1\ncell:B43:t:Cooking Essentials:b:1:1:1:1:l:2:f:5:colspan:5\ncell:C43:b::1::1:ntvf:1\ncell:D43:b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E43:b::1::1\ncell:F43:b::1::1\ncell:B44:t:Baking Powder:b::1::1:l:2:f:7:bg:3\ncell:C44:b::1::1:ntvf:1\ncell:D44:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E44:b::1::1\ncell:F44:b::1:1:1\ncell:B45:t:Baking Soda:b::1::1:l:2:f:7:bg:2\ncell:C45:b::1::1:bg:2:ntvf:1\ncell:D45:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E45:b::1::1:bg:2\ncell:F45:b::1::1:bg:2\ncell:B46:t:Yeast:b::1::1:l:2:f:7:bg:3\ncell:C46:b::1::1:ntvf:1\ncell:D46:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E46:b::1::1\ncell:F46:b:1:1:1:1\ncell:B47:t:Salt:b::1::1:l:2:f:7:bg:2\ncell:C47:b::1::1:bg:2:ntvf:1\ncell:D47:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E47:b::1::1:bg:2\ncell:F47:b::1::1:bg:2\ncell:B48:t:Vinegar:b::1::1:l:2:f:7:bg:3\ncell:C48:b::1::1:ntvf:1\ncell:D48:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E48:b::1::1\ncell:F48:b:1:1:1:1\ncell:B49:t:Others:b:1:1:1:1:l:2:f:5:colspan:5\ncell:C49:b::1::1:ntvf:1\ncell:D49:b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E49:b::1::1\ncell:F49:b::1::1\ncell:B50:t:Other:b::1::1:l:2:f:7\ncell:C50:b::1::1:ntvf:1\ncell:D50:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E50:b::1::1\ncell:F50:b::1:1:1\ncell:B51:t:Other:b::1::1:l:2:f:7:bg:2\ncell:C51:b::1::1:bg:2:ntvf:1\ncell:D51:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E51:b::1::1:bg:2\ncell:F51:b::1::1:bg:2\ncell:B52:t:Other:b::1::1:l:2:f:7\ncell:C52:b::1::1:ntvf:1\ncell:D52:t:
     
    :b::1::1:l:1:f:2:cf:1:tvf:2\ncell:E52:b::1::1\ncell:F52:b:1:1:1:1\ncell:B53:t:Other:b::1::1:l:2:f:7:bg:2\ncell:C53:b::1::1:bg:2:ntvf:1\ncell:D53:t:
     
    :b::1::1:l:1:f:2:bg:2:cf:1:tvf:2\ncell:E53:b::1::1:bg:2\ncell:F53:b::1::1:bg:2\ncell:B54:t:Other:b::1:1:1:l:2:f:7\ncell:C54:b::1:1:1:ntvf:1\ncell:D54:t:
     
    :b::1:1:1:l:1:f:2:cf:1:tvf:2\ncell:E54:b::1:1:1\ncell:F54:b:1:1:1:1\ncol:A:w:10\ncol:B:w:116\ncol:C:w:70\ncol:D:w:40\ncol:E:w:131\ncol:F:w:140\ncol:R:w:80\nsheet:c:18:r:54:font:3:layout:2\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* * arial,helvetica,sans-serif\nfont:2:* 11pt *\nfont:3:* 11pt arial,helvetica,sans-serif\nfont:4:* 12pt *\nfont:5:* 14pt arial,helvetica,sans-serif\nfont:6:* 18pt arial,helvetica,sans-serif\nfont:7:normal normal 11pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:4px 2px 4px 2px;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:text-html\n"},"name":"sheet4","hidden":"0"},"sheet3":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Binge Eating Checklist:f:3:c:3:bg:1:cf:1:colspan:3\ncell:B5:t:Chk:b:1:1:1:1:l:1:f:2:cf:1\ncell:C5:t:List:b:1:1:1:1:l:1:f:2:cf:1\ncell:D5:t:Yes/ No:b:1:1:1:1:l:1:f:2:cf:1\ncell:A7:b::1::\ncell:B7:t:
     
    :b:1:1::1:tvf:1\ncell:C7:t:Do you eat in a discrete period of time an amount of food that is larger than most people would eat in a similar period?:b:1:1::1\ncell:D7:b:1:1::1\ncell:E7:b::::1\ncell:B8:t:Prior to the episodes, have you :b:1::1::colspan:3\ncell:A9:b::1::\ncell:B9:t:
     
    :b:1:1::1:tvf:1\ncell:C9:t:undergone an unintentional period of fasting or starvation? :b::1::1\ncell:D9:b::1::1\ncell:E9:b::::1\ncell:A10:b::1::\ncell:B10:t:
     
    :b::1::1:bg:2:tvf:1\ncell:C10:t: performed considerable physical labor or exercise?:b::1::1:bg:2\ncell:D10:b::1::1:bg:2\ncell:E10:b::::1\ncell:A11:b::1::\ncell:B11:t:
     
    :b::1:1:1:tvf:1\ncell:C11:t:Does the exertion seem appropriate for the person's background and circumstances? :b::1:1:1\ncell:D11:b::1:1:1\ncell:E11:b::::1\ncell:B12:t:During these episodes, do you experience the feeling :colspan:3\ncell:A13:b::1::\ncell:B13:t:
     
    :b:1:1::1:tvf:1\ncell:C13:t:of being unable to stop eating?:b:1:1::1\ncell:D13:b:1:1::1\ncell:E13:b::::1\ncell:A14:b::1::\ncell:B14:t:
     
    :b::1::1:bg:2:tvf:1\ncell:C14:t:of controlling what is being eaten?:b::1::1:bg:2\ncell:D14:b::1::1:bg:2\ncell:E14:b::::1\ncell:A15:b::1::\ncell:B15:t:
     
    :b::1:1:1:tvf:1\ncell:C15:t:of deciding how much is being eaten? :b::1:1:1\ncell:D15:b::1:1:1\ncell:E15:b::::1\ncol:A:w:10\ncol:B:w:34\ncol:C:w:362\ncol:D:w:70\nsheet:c:5:r:15:font:1:layout:2\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 11pt arial,helvetica,sans-serif\nfont:2:* 12pt *\nfont:3:* 18pt *\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:4px 2px 4px 2px;vertical-align:*;\nvalueformat:1:text-html\n"},"name":"sheet10","hidden":"0"}},"EditableCells":{"allow":true,"cells":{"sheet9!C3":true,"sheet9!C4":true,"sheet9!C50":true,"sheet9!C51":true,"sheet9!C8":true,"sheet9!C9":true,"sheet9!C10":true,"sheet9!C11":true,"sheet9!C12":true,"sheet9!C13":true,"sheet9!C14":true,"sheet9!C15":true,"sheet9!C17":true,"sheet9!C18":true,"sheet9!C19":true,"sheet9!C20":true,"sheet9!C21":true,"sheet9!C22":true,"sheet9!C23":true,"sheet9!C24":true,"sheet9!C26":true,"sheet9!C27":true,"sheet9!C28":true,"sheet9!C29":true,"sheet9!C30":true,"sheet9!C31":true,"sheet9!C32":true,"sheet9!C33":true,"sheet9!C35":true,"sheet9!C36":true,"sheet9!C37":true,"sheet9!C38":true,"sheet9!C39":true,"sheet9!C40":true,"sheet9!C41":true,"sheet9!C42":true,"sheet9!C43":true,"sheet9!C44":true,"sheet9!C45":true,"sheet9!C46":true,"sheet9!C47":true,"sheet9!C48":true,"sheet9!C49":true,"sheet9!D3":true,"sheet9!D4":true,"sheet9!D50":true,"sheet9!D51":true,"sheet9!D8":true,"sheet9!D9":true,"sheet9!D10":true,"sheet9!D11":true,"sheet9!D12":true,"sheet9!D13":true,"sheet9!D14":true,"sheet9!D15":true,"sheet9!D17":true,"sheet9!D18":true,"sheet9!D19":true,"sheet9!D20":true,"sheet9!D21":true,"sheet9!D22":true,"sheet9!D23":true,"sheet9!D24":true,"sheet9!D26":true,"sheet9!D27":true,"sheet9!D28":true,"sheet9!D29":true,"sheet9!D30":true,"sheet9!D31":true,"sheet9!D32":true,"sheet9!D33":true,"sheet9!D35":true,"sheet9!D36":true,"sheet9!D37":true,"sheet9!D38":true,"sheet9!D39":true,"sheet9!D40":true,"sheet9!D41":true,"sheet9!D42":true,"sheet9!D43":true,"sheet9!D44":true,"sheet9!D45":true,"sheet9!D46":true,"sheet9!D47":true,"sheet9!D48":true,"sheet9!D49":true,"sheet9!H3":true,"sheet9!H4":true,"sheet9!H50":true,"sheet9!H51":true,"sheet9!H17":true,"sheet9!E17":true,"sheet9!H26":true,"sheet9!E26":true,"sheet9!H35":true,"sheet9!H44":true,"sheet9!E8":true,"sheet9!J8":true,"sheet9!H9":true,"sheet9!H10":true,"sheet9!H11":true,"sheet9!H12":true,"sheet9!H13":true,"sheet9!H14":true,"sheet9!H15":true,"sheet9!H18":true,"sheet9!H19":true,"sheet9!H20":true,"sheet9!H21":true,"sheet9!H22":true,"sheet9!H23":true,"sheet9!H24":true,"sheet9!H27":true,"sheet9!H28":true,"sheet9!H29":true,"sheet9!H30":true,"sheet9!H31":true,"sheet9!H32":true,"sheet9!H33":true,"sheet9!H36":true,"sheet9!H37":true,"sheet9!H38":true,"sheet9!H39":true,"sheet9!H40":true,"sheet9!H41":true,"sheet9!H42":true,"sheet9!H43":true,"sheet9!H45":true,"sheet9!H46":true,"sheet9!H47":true,"sheet9!H48":true,"sheet9!H49":true,"sheet9!I3":true,"sheet9!I4":true,"sheet9!I50":true,"sheet9!I51":true,"sheet9!I8":true,"sheet9!I9":true,"sheet9!I10":true,"sheet9!I11":true,"sheet9!I12":true,"sheet9!I13":true,"sheet9!I14":true,"sheet9!I15":true,"sheet9!I17":true,"sheet9!I18":true,"sheet9!I19":true,"sheet9!I20":true,"sheet9!I21":true,"sheet9!I22":true,"sheet9!I23":true,"sheet9!I24":true,"sheet9!I26":true,"sheet9!I27":true,"sheet9!I28":true,"sheet9!I29":true,"sheet9!I30":true,"sheet9!I31":true,"sheet9!I32":true,"sheet9!I33":true,"sheet9!I35":true,"sheet9!I36":true,"sheet9!I37":true,"sheet9!I38":true,"sheet9!I39":true,"sheet9!I40":true,"sheet9!I41":true,"sheet9!I42":true,"sheet9!I43":true,"sheet9!I44":true,"sheet9!I45":true,"sheet9!I46":true,"sheet9!I47":true,"sheet9!I48":true,"sheet9!I49":true,"sheet9!J17":true,"sheet9!E35":true,"sheet9!E44":true,"sheet9!H8":true,"sheet9!J36":true,"sheet9!J37":true,"sheet9!J38":true,"sheet9!J39":true,"sheet9!J40":true,"sheet9!J41":true,"sheet9!J42":true,"sheet9!J43":true,"sheet9!J44":true,"sheet9!J45":true,"sheet9!J46":true,"sheet9!J47":true,"sheet9!J48":true,"sheet9!J49":true,"sheet9!J50":true,"sheet9!J51":true,"sheet4!B3":true,"sheet4!B5":true,"sheet4!C5":true,"sheet4!D5":true,"sheet4!E5":true,"sheet4!F5":true,"sheet4!B6":true,"sheet4!B7":true,"sheet4!C7":true,"sheet4!E7":true,"sheet4!F7":true,"sheet4!B8":true,"sheet4!C8":true,"sheet4!E8":true,"sheet4!F8":true,"sheet4!B9":true,"sheet4!C9":true,"sheet4!E9":true,"sheet4!F9":true,"sheet4!B10":true,"sheet4!C10":true,"sheet4!E10":true,"sheet4!F10":true,"sheet4!B11":true,"sheet4!C11":true,"sheet4!E11":true,"sheet4!F11":true,"sheet4!B12":true,"sheet4!C12":true,"sheet4!E12":true,"sheet4!F12":true,"sheet4!B13":true,"sheet4!B14":true,"sheet4!B15":true,"sheet4!C15":true,"sheet4!D15":true,"sheet4!E15":true,"sheet4!F15":true,"sheet4!B16":true,"sheet4!C16":true,"sheet4!E16":true,"sheet4!F16":true,"sheet4!B17":true,"sheet4!C17":true,"sheet4!E17":true,"sheet4!F17":true,"sheet4!B18":true,"sheet4!C18":true,"sheet4!E18":true,"sheet4!F18":true,"sheet4!B19":true,"sheet4!C19":true,"sheet4!E19":true,"sheet4!F19":true,"sheet4!B20":true,"sheet4!C20":true,"sheet4!F20":true,"sheet4!B21":true,"sheet4!B22":true,"sheet4!C22":true,"sheet4!E22":true,"sheet4!F22":true,"sheet4!B23":true,"sheet4!C23":true,"sheet4!E23":true,"sheet4!F23":true,"sheet4!B24":true,"sheet4!C24":true,"sheet4!E24":true,"sheet4!F24":true,"sheet4!B25":true,"sheet4!C25":true,"sheet4!E25":true,"sheet4!F25":true,"sheet4!B26":true,"sheet4!C26":true,"sheet4!E26":true,"sheet4!F26":true,"sheet4!B27":true,"sheet4!C27":true,"sheet4!E27":true,"sheet4!F27":true,"sheet4!B28":true,"sheet4!B29":true,"sheet4!B30":true,"sheet4!C30":true,"sheet4!E30":true,"sheet4!F30":true,"sheet4!B31":true,"sheet4!C31":true,"sheet4!E31":true,"sheet4!F31":true,"sheet4!B32":true,"sheet4!C32":true,"sheet4!E32":true,"sheet4!F32":true,"sheet4!B33":true,"sheet4!C33":true,"sheet4!E33":true,"sheet4!F33":true,"sheet4!B34":true,"sheet4!C34":true,"sheet4!E34":true,"sheet4!F34":true,"sheet4!B35":true,"sheet4!C35":true,"sheet4!E35":true,"sheet4!F35":true,"sheet4!B36":true,"sheet4!C36":true,"sheet4!E36":true,"sheet4!F36":true,"sheet4!B37":true,"sheet4!C37":true,"sheet4!E37":true,"sheet4!F37":true,"sheet4!B38":true,"sheet4!B39":true,"sheet4!B40":true,"sheet4!C40":true,"sheet4!E40":true,"sheet4!F40":true,"sheet4!B41":true,"sheet4!C41":true,"sheet4!E41":true,"sheet4!F41":true,"sheet4!B42":true,"sheet4!C42":true,"sheet4!E42":true,"sheet4!F42":true,"sheet4!B43":true,"sheet4!B44":true,"sheet4!C44":true,"sheet4!E44":true,"sheet4!F44":true,"sheet4!B45":true,"sheet4!C45":true,"sheet4!E45":true,"sheet4!F45":true,"sheet4!B46":true,"sheet4!C46":true,"sheet4!E46":true,"sheet4!F46":true,"sheet4!B47":true,"sheet4!C47":true,"sheet4!E47":true,"sheet4!F47":true,"sheet4!B48":true,"sheet4!C48":true,"sheet4!E48":true,"sheet4!F48":true,"sheet4!B49":true,"sheet4!B50":true,"sheet4!C50":true,"sheet4!E50":true,"sheet4!F50":true,"sheet4!B51":true,"sheet4!C51":true,"sheet4!E51":true,"sheet4!F51":true,"sheet4!B52":true,"sheet4!C52":true,"sheet4!E52":true,"sheet4!F52":true,"sheet4!B53":true,"sheet4!C53":true,"sheet4!E53":true,"sheet4!F53":true,"sheet4!B54":true,"sheet4!C54":true,"sheet4!E54":true,"sheet4!F54":true,"sheet10!B3":true,"sheet10!B5":true,"sheet10!C5":true,"sheet10!D5":true,"sheet10!C7":true,"sheet10!D7":true,"sheet10!C9":true,"sheet10!C10":true,"sheet10!C11":true,"sheet10!D9":true,"sheet10!D10":true,"sheet10!D11":true,"sheet10!B8":true,"sheet10!B12":true,"sheet10!C13":true,"sheet10!C14":true,"sheet10!C15":true,"sheet10!D13":true,"sheet10!D14":true,"sheet10!D15":true},"constraints":{"sheet10!B7":["tc"],"sheet10!B9":["tc"],"sheet10!B10":["tc"],"sheet10!B11":["tc"],"sheet10!B13":["tc"],"sheet10!B14":["tc"],"sheet10!B15":["tc"]}}} \ No newline at end of file diff --git a/Website/excelinterop/tmp/FIXVAR(V2).xls b/Website/excelinterop/tmp/FIXVAR(V2).xls deleted file mode 100644 index 8b154e9..0000000 Binary files a/Website/excelinterop/tmp/FIXVAR(V2).xls and /dev/null differ diff --git a/Website/excelinterop/tmp/FIXVAR.xls b/Website/excelinterop/tmp/FIXVAR.xls deleted file mode 100644 index 3d649a5..0000000 Binary files a/Website/excelinterop/tmp/FIXVAR.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/FIXVARe.xls b/Website/excelinterop/tmp/FIXVARe.xls deleted file mode 100644 index 870509e..0000000 Binary files a/Website/excelinterop/tmp/FIXVARe.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/FinancialCalculator.xls b/Website/excelinterop/tmp/FinancialCalculator.xls deleted file mode 100644 index cbd5ba7..0000000 Binary files a/Website/excelinterop/tmp/FinancialCalculator.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/FinancialCalculator32.xls b/Website/excelinterop/tmp/FinancialCalculator32.xls deleted file mode 100644 index f48de13..0000000 Binary files a/Website/excelinterop/tmp/FinancialCalculator32.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/FinancialComparisonAnalysis33.xls b/Website/excelinterop/tmp/FinancialComparisonAnalysis33.xls deleted file mode 100644 index 0b6f47c..0000000 Binary files a/Website/excelinterop/tmp/FinancialComparisonAnalysis33.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/FinancialStatementRatios.xls b/Website/excelinterop/tmp/FinancialStatementRatios.xls deleted file mode 100644 index f5dcdb9..0000000 Binary files a/Website/excelinterop/tmp/FinancialStatementRatios.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/Financial_model_1.xls b/Website/excelinterop/tmp/Financial_model_1.xls deleted file mode 100644 index 52d66b0..0000000 Binary files a/Website/excelinterop/tmp/Financial_model_1.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/Financialmodel1.xls b/Website/excelinterop/tmp/Financialmodel1.xls deleted file mode 100644 index a5d0d7c..0000000 Binary files a/Website/excelinterop/tmp/Financialmodel1.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/FiveYearProjections1.xls b/Website/excelinterop/tmp/FiveYearProjections1.xls deleted file mode 100644 index 8d08621..0000000 Binary files a/Website/excelinterop/tmp/FiveYearProjections1.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/Gantt_Chart-1.xls b/Website/excelinterop/tmp/Gantt_Chart-1.xls deleted file mode 100644 index 07e53d1..0000000 Binary files a/Website/excelinterop/tmp/Gantt_Chart-1.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/HCS.xls b/Website/excelinterop/tmp/HCS.xls deleted file mode 100644 index a059d22..0000000 Binary files a/Website/excelinterop/tmp/HCS.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/Household.csv b/Website/excelinterop/tmp/Household.csv deleted file mode 100644 index e69de29..0000000 diff --git a/Website/excelinterop/tmp/Household.xls b/Website/excelinterop/tmp/Household.xls deleted file mode 100644 index fe0b29c..0000000 Binary files a/Website/excelinterop/tmp/Household.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/IS logo square large (1).jpg b/Website/excelinterop/tmp/IS logo square large (1).jpg deleted file mode 100644 index 1c70a27..0000000 Binary files a/Website/excelinterop/tmp/IS logo square large (1).jpg and /dev/null differ diff --git a/Website/excelinterop/tmp/MONTHLY%20BILLS b/Website/excelinterop/tmp/MONTHLY%20BILLS deleted file mode 100644 index e69de29..0000000 diff --git a/Website/excelinterop/tmp/Medical-Invoice-Template.docx b/Website/excelinterop/tmp/Medical-Invoice-Template.docx deleted file mode 100644 index 3de0fc4..0000000 Binary files a/Website/excelinterop/tmp/Medical-Invoice-Template.docx and /dev/null differ diff --git a/Website/excelinterop/tmp/Mileage Log.csv b/Website/excelinterop/tmp/Mileage Log.csv deleted file mode 100644 index cb482a7..0000000 --- a/Website/excelinterop/tmp/Mileage Log.csv +++ /dev/null @@ -1,59 +0,0 @@ -MILEAGE LOG,,,,,,, -,,,,,,, -Employee ID :,,,Name :,,,, -,,,,,,, -Title :,,,Dept. :,,,, -,,,,,,, -Vehicle ID :,,,Period :,5-Jun-09,to,10-Jun-09, -,,,,,,, -Rate :,0.5, USD per Mile,Total Mileage :,64,Total Rate :,USD,32 -,,,,,,, -Date,Starting Place,Destination,Purpose,Start Mile,End Mile,Mileage,Rate -5-Jun-09,ABC Company,Wall Street Building,Meeting,75993,76050,57,28.5 -5-Jun-09,Wall Street Building,Kentucky Building,Meeting,76050,76057,7,3.5 -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -Notes :,,,,,,, -,,,,,,, -,,,,,,, -,,,,,,, -Signature of Employee : ,, ,,,Date: ,, -,,,,,,, -Signature of Supervisor : ,, ,,,Date: ,, -,,,,,,, -VISIT EXCELTEMPLATE.NET FOR MORE TEMPLATES AND UPDATES,,,,,,, diff --git a/Website/excelinterop/tmp/Mileage Log.xls b/Website/excelinterop/tmp/Mileage Log.xls deleted file mode 100644 index 619a85d..0000000 Binary files a/Website/excelinterop/tmp/Mileage Log.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/MineBlaster1000-1.xls b/Website/excelinterop/tmp/MineBlaster1000-1.xls deleted file mode 100644 index 81876d1..0000000 Binary files a/Website/excelinterop/tmp/MineBlaster1000-1.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/MineBlaster1000.xls b/Website/excelinterop/tmp/MineBlaster1000.xls deleted file mode 100644 index 6848ae8..0000000 Binary files a/Website/excelinterop/tmp/MineBlaster1000.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/Pro-FormaIncomeStatement34.xls b/Website/excelinterop/tmp/Pro-FormaIncomeStatement34.xls deleted file mode 100644 index 0eca956..0000000 Binary files a/Website/excelinterop/tmp/Pro-FormaIncomeStatement34.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/QuarterlyCashFlowProjection40.xls b/Website/excelinterop/tmp/QuarterlyCashFlowProjection40.xls deleted file mode 100644 index 724fd83..0000000 Binary files a/Website/excelinterop/tmp/QuarterlyCashFlowProjection40.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/RNA.xls b/Website/excelinterop/tmp/RNA.xls deleted file mode 100644 index 49b574b..0000000 Binary files a/Website/excelinterop/tmp/RNA.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/RatioAnalysis.xls b/Website/excelinterop/tmp/RatioAnalysis.xls deleted file mode 100644 index 63a9987..0000000 Binary files a/Website/excelinterop/tmp/RatioAnalysis.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/Sales Suite test.msc b/Website/excelinterop/tmp/Sales Suite test.msc deleted file mode 100644 index 5d6898c..0000000 --- a/Website/excelinterop/tmp/Sales Suite test.msc +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":40,"currentid":"sheet34","currentname":"sheet34","sheetArr":{"sheet1":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1:h:12.75\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"Sheet2","hidden":"0"},"sheet2":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1:h:12.75:needsrecalc:yes\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"Sheet3","hidden":"0"},"sheet3":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Sales Budget:l:1:f:3:cf:2\ncell:C3:l:1:f:3:cf:1\ncell:D3:l:1:f:3:cf:1\ncell:E3:l:1:f:3:cf:1\ncell:F3:l:1:f:3:cf:1\ncell:G3:l:1:f:3:cf:1\ncell:B4:t:2009:l:1:f:2:cf:1:ntvf:5\ncell:B5:b:::1::l:1:f:4\ncell:C5:b:::1::l:1:f:4\ncell:D5:b:::1::l:1:f:4\ncell:E5:b:::1::l:1:f:4\ncell:F5:b:::1::l:1:f:4\ncell:G5:b:::1::l:1:f:4\ncell:A6:b::1:::l:1:f:4\ncell:B6:t:Item Number:b:1:1::1:l:1:f:1:cf:1\ncell:C6:b:1:1::1:l:1:f:1:cf:1\ncell:D6:b:1:1::1:l:1:f:1:cf:1\ncell:E6:t:Selling Price:b:1:1::1:l:1:f:1:cf:1\ncell:F6:t:Budgeted:b:1:1::1:l:1:f:1:cf:1\ncell:G6:t:Percent:b:1:1::1:l:1:f:1:cf:1\ncell:A7:b::1:::l:1:f:4\ncell:B7:t:or SKU:b::1:1:1:l:1:f:1:cf:1\ncell:C7:t:Description:b::1:1:1:l:1:f:1:cf:1\ncell:D7:t:Units:b::1:1:1:l:1:f:1:cf:1\ncell:E7:t:Per Unit:b::1:1:1:l:1:f:1:cf:1\ncell:F7:t:Sales:b::1:1:1:l:1:f:1:cf:1\ncell:G7:t:(of Total):b::1:1:1:l:1:f:1:cf:1\ncell:A8:b::1:::l:1:f:4\ncell:B8:b:1:1:1:1:l:1:f:5:cf:2\ncell:C8:b:1:1:1:1:l:1:f:5\ncell:D8:v:1000:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E8:v:129:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F8:vtf:n:129000:IF(D8,(D8*E8),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G8:vtf:n:0.4564190563801369:IF(SUM(F8),(F8/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A9:b::1:::l:1:f:4\ncell:B9:b:1:1:1:1:l:1:f:5:cf:2\ncell:C9:b:1:1:1:1:l:1:f:5\ncell:D9:v:1200:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E9:v:114:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F9:vtf:n:136800:IF(D9,(D9*E9),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G9:vtf:n:0.4840164876961452:IF(SUM(F9),(F9/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A10:b::1:::l:1:f:4\ncell:B10:b:1:1:1:1:l:1:f:5:cf:2\ncell:C10:b:1:1:1:1:l:1:f:5\ncell:D10:v:1300:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E10:v:12.95:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F10:vtf:n:16835:IF(D10,(D10*E10),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G10:vtf:n:0.05956445592371787:IF(SUM(F10),(F10/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A11:b::1:::l:1:f:4\ncell:B11:b:1:1:1:1:l:1:f:5:cf:2\ncell:C11:b:1:1:1:1:l:1:f:5\ncell:D11:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E11:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F11:vtf:t::IF(D11,(D11*E11),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G11:vtf:t::IF(SUM(F11),(F11/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A12:b::1:::l:1:f:4\ncell:B12:b:1:1:1:1:l:1:f:5:cf:2\ncell:C12:b:1:1:1:1:l:1:f:5\ncell:D12:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E12:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F12:vtf:t::IF(D12,(D12*E12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G12:vtf:t::IF(SUM(F12),(F12/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A13:b::1:::l:1:f:4\ncell:B13:b:1:1:1:1:l:1:f:5:cf:2\ncell:C13:b:1:1:1:1:l:1:f:5\ncell:D13:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E13:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F13:vtf:t::IF(D13,(D13*E13),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G13:vtf:t::IF(SUM(F13),(F13/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A14:b::1:::l:1:f:4\ncell:B14:b:1:1:1:1:l:1:f:5:cf:2\ncell:C14:b:1:1:1:1:l:1:f:5\ncell:D14:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E14:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F14:vtf:t::IF(D14,(D14*E14),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G14:vtf:t::IF(SUM(F14),(F14/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A15:b::1:::l:1:f:4\ncell:B15:b:1:1:1:1:l:1:f:5:cf:2\ncell:C15:b:1:1:1:1:l:1:f:5\ncell:D15:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E15:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F15:vtf:t::IF(D15,(D15*E15),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G15:vtf:t::IF(SUM(F15),(F15/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A16:b::1:::l:1:f:4\ncell:B16:b:1:1:1:1:l:1:f:5:cf:2\ncell:C16:b:1:1:1:1:l:1:f:5\ncell:D16:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E16:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F16:vtf:t::IF(D16,(D16*E16),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G16:vtf:t::IF(SUM(F16),(F16/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A17:b::1:::l:1:f:4\ncell:B17:b:1:1:1:1:l:1:f:5:cf:2\ncell:C17:b:1:1:1:1:l:1:f:5\ncell:D17:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E17:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F17:vtf:t::IF(D17,(D17*E17),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G17:vtf:t::IF(SUM(F17),(F17/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A18:b::1:::l:1:f:4\ncell:B18:b:1:1:1:1:l:1:f:5:cf:2\ncell:C18:b:1:1:1:1:l:1:f:5\ncell:D18:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E18:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F18:vtf:t::IF(D18,(D18*E18),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G18:vtf:t::IF(SUM(F18),(F18/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A19:b::1:::l:1:f:4\ncell:B19:b:1:1:1:1:l:1:f:5:cf:2\ncell:C19:b:1:1:1:1:l:1:f:5\ncell:D19:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E19:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F19:vtf:t::IF(D19,(D19*E19),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G19:vtf:t::IF(SUM(F19),(F19/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A20:b::1:::l:1:f:4\ncell:B20:b:1:1:1:1:l:1:f:5:cf:2\ncell:C20:b:1:1:1:1:l:1:f:5\ncell:D20:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E20:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F20:vtf:t::IF(D20,(D20*E20),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G20:vtf:t::IF(SUM(F20),(F20/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A21:b::1:::l:1:f:4\ncell:B21:b:1:1:1:1:l:1:f:5:cf:2\ncell:C21:b:1:1:1:1:l:1:f:5\ncell:D21:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E21:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F21:vtf:t::IF(D21,(D21*E21),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G21:vtf:t::IF(SUM(F21),(F21/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A22:b::1:::l:1:f:4\ncell:B22:b:1:1:1:1:l:1:f:5:cf:2\ncell:C22:b:1:1:1:1:l:1:f:5\ncell:D22:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E22:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F22:vtf:t::IF(D22,(D22*E22),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G22:vtf:t::IF(SUM(F22),(F22/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A23:b::1:::l:1:f:4\ncell:B23:b:1:1:1:1:l:1:f:5:cf:2\ncell:C23:b:1:1:1:1:l:1:f:5\ncell:D23:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E23:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F23:vtf:t::IF(D23,(D23*E23),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G23:vtf:t::IF(SUM(F23),(F23/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A24:b::1:::l:1:f:4\ncell:B24:b:1:1:1:1:l:1:f:5:cf:2\ncell:C24:b:1:1:1:1:l:1:f:5\ncell:D24:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E24:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F24:vtf:t::IF(D24,(D24*E24),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G24:vtf:t::IF(SUM(F24),(F24/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A25:b::1:::l:1:f:4\ncell:B25:b:1:1:1:1:l:1:f:5:cf:2\ncell:C25:b:1:1:1:1:l:1:f:5\ncell:D25:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E25:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F25:vtf:t::IF(D25,(D25*E25),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G25:vtf:t::IF(SUM(F25),(F25/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A26:b::1:::l:1:f:4\ncell:B26:b:1:1:1:1:l:1:f:5:cf:2\ncell:C26:b:1:1:1:1:l:1:f:5\ncell:D26:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E26:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F26:vtf:t::IF(D26,(D26*E26),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G26:vtf:t::IF(SUM(F26),(F26/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A27:b::1:::l:1:f:4\ncell:B27:b:1:1:1:1:l:1:f:5:cf:2\ncell:C27:b:1:1:1:1:l:1:f:5\ncell:D27:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E27:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F27:vtf:t::IF(D27,(D27*E27),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G27:vtf:t::IF(SUM(F27),(F27/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A28:b::1:::l:1:f:4\ncell:B28:b:1:1:1:1:l:1:f:5:cf:2\ncell:C28:b:1:1:1:1:l:1:f:5\ncell:D28:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E28:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F28:vtf:t::IF(D28,(D28*E28),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G28:vtf:t::IF(SUM(F28),(F28/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A29:b::1:::l:1:f:4\ncell:B29:b:1:1:1:1:l:1:f:5:cf:2\ncell:C29:b:1:1:1:1:l:1:f:5\ncell:D29:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E29:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F29:vtf:t::IF(D29,(D29*E29),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G29:vtf:t::IF(SUM(F29),(F29/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A30:b::1:::l:1:f:4\ncell:B30:b:1:1:1:1:l:1:f:5:cf:2\ncell:C30:b:1:1:1:1:l:1:f:5\ncell:D30:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E30:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F30:vtf:t::IF(D30,(D30*E30),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G30:vtf:t::IF(SUM(F30),(F30/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A31:b::1:::l:1:f:4\ncell:B31:b:1:1:1:1:l:1:f:5:cf:2\ncell:C31:b:1:1:1:1:l:1:f:5\ncell:D31:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E31:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F31:vtf:t::IF(D31,(D31*E31),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G31:vtf:t::IF(SUM(F31),(F31/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A32:b::1:::l:1:f:4\ncell:B32:b:1:1:1:1:l:1:f:5:cf:2\ncell:C32:b:1:1:1:1:l:1:f:5\ncell:D32:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E32:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F32:vtf:t::IF(D32,(D32*E32),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G32:vtf:t::IF(SUM(F32),(F32/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A33:b::1:::l:1:f:4\ncell:B33:t:Totals:b:1:1:1:1:l:1:f:1\ncell:C33:b:1:1:1:1:l:1:f:1\ncell:D33:b:1:1:1:1:l:1:f:1\ncell:E33:b:1:1:1:1:l:1:f:1\ncell:F33:vtf:n:282635:IF(SUM(F8\\cF32),SUM(F8\\cF32),\"\"):b:1:1:1:1:l:1:f:1:ntvf:1\ncell:G33:vtf:n:1:IF(SUM(F33),(F33/$F$33),\"\"):b:1:1:1:1:l:1:f:1:ntvf:4\ncell:B34:b:1::::l:1:f:4\ncell:C34:b:1::::l:1:f:4\ncell:D34:b:1::::l:1:f:4\ncell:E34:b:1::::l:1:f:4\ncell:F34:b:1::::l:1:f:4\ncell:G34:b:1::::l:1:f:4\ncell:B35:l:1:f:4\ncol:A:w:12\ncol:B:w:297\ncol:C:w:163\ncol:D:w:115\ncol:E:w:104\ncol:F:w:89\ncol:G:w:89\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:7:r:35:h:12:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:normal bold 10pt Times New Roman\nfont:2:normal bold 14pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 10pt Times New Roman\nlayout:1:padding:* * * *;vertical-align:bottom;\nvalueformat:1:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:2:\"$\"#,##0.00 ;\"$\"(#,##0.00)\nvalueformat:3:#,##0;(#,##0)\nvalueformat:4:0.00%\nvalueformat:5:@\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet1","hidden":"0"},"sheet4":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Budget:l:2:f:9:c:3:bg:1:cf:1:colspan:6\ncell:D3:l:2:f:2:cf:1\ncell:E3:l:2:f:2:cf:1\ncell:F3:l:2:f:2:cf:1\ncell:G3:l:2:f:2:cf:1\ncell:H3:l:2:f:2:cf:1\ncell:C4:t:2009:l:2:f:6:cf:1:ntvf:5\ncell:D4:l:2\ncell:E4:l:2\ncell:F4:l:2\ncell:G4:l:2\ncell:H4:l:2\ncell:B5:f:5\ncell:C5:l:2:f:5\ncell:D5:l:2:f:5\ncell:E5:l:2:f:5\ncell:F5:l:2:f:5\ncell:G5:l:2:f:5\ncell:H5:l:2:f:5\ncell:I5:f:5\ncell:J5:f:5\ncell:B6:l:1:f:5\ncell:C6:t:Item Number or SKU:l:2:f:7:cf:1\ncell:D6:t:Description:l:2:f:7:cf:1\ncell:E6:t:Units:l:2:f:7:cf:1\ncell:F6:t:Selling Price Per Unit:l:2:f:7:cf:1\ncell:G6:t:Budgeted Sales:l:2:f:7:cf:1\ncell:H6:t:Percent (of Total):l:2:f:7:cf:1\ncell:I6:f:5\ncell:J6:f:5\ncell:B7:l:1:f:5\ncell:C7:l:2:f:8:cf:1\ncell:D7:l:2:f:8:cf:1\ncell:E7:l:2:f:8:cf:1\ncell:F7:l:2:f:8:cf:1\ncell:G7:l:2:f:8:cf:1\ncell:H7:l:2:f:8:cf:1\ncell:I7:f:5\ncell:J7:f:5\ncell:B8:b::2:::l:1:f:3\ncell:C8:b:2:2:2:2:l:2:f:1:cf:2\ncell:D8:b:2:2:2:2:l:2:f:1\ncell:E8:v:1000:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F8:v:129:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G8:vtf:n:129000:IF(E8,(E8*F8),\"\"):l:2:f:1:ntvf:1\ncell:H8:vtf:n:0.4564190563801369:IF(SUM(G8),(G8/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I8:f:1\ncell:B9:b::2:::l:1:f:3\ncell:C9:b:1:1:1:1:l:2:f:1:bg:2:cf:2\ncell:D9:b:1:1:1:1:l:2:f:1:bg:2\ncell:E9:v:1200:b:1:1:1:1:l:2:f:1:bg:2:ntvf:3\ncell:F9:v:114:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G9:vtf:n:136800:IF(E9,(E9*F9),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H9:vtf:n:0.4840164876961452:IF(SUM(G9),(G9/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I9:f:1\ncell:B10:b::2:::l:1:f:3\ncell:C10:b:2:2:2:2:l:2:f:1:cf:2\ncell:D10:b:2:2:2:2:l:2:f:1\ncell:E10:v:1300:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F10:v:12.95:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G10:vtf:n:16835:IF(E10,(E10*F10),\"\"):l:2:f:1:ntvf:1\ncell:H10:vtf:n:0.05956445592371787:IF(SUM(G10),(G10/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I10:f:1\ncell:B11:b::2:::l:1:f:3\ncell:C11:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D11:b:2:2:2:2:l:2:f:1:bg:2\ncell:E11:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F11:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G11:vtf:t::IF(E11,(E11*F11),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H11:vtf:t::IF(SUM(G11),(G11/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I11:f:1\ncell:B12:b::2:::l:1:f:3\ncell:C12:b:2:2:2:2:l:2:f:1:cf:2\ncell:D12:b:2:2:2:2:l:2:f:1\ncell:E12:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F12:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G12:vtf:t::IF(E12,(E12*F12),\"\"):l:2:f:1:ntvf:1\ncell:H12:vtf:t::IF(SUM(G12),(G12/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I12:f:1\ncell:B13:b::2:::l:1:f:3\ncell:C13:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D13:b:2:2:2:2:l:2:f:1:bg:2\ncell:E13:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F13:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G13:vtf:t::IF(E13,(E13*F13),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H13:vtf:t::IF(SUM(G13),(G13/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I13:f:1\ncell:B14:b::2:::l:1:f:3\ncell:C14:b:2:2:2:2:l:2:f:1:cf:2\ncell:D14:b:2:2:2:2:l:2:f:1\ncell:E14:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F14:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G14:vtf:t::IF(E14,(E14*F14),\"\"):l:2:f:1:ntvf:1\ncell:H14:vtf:t::IF(SUM(G14),(G14/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I14:f:1\ncell:B15:b::2:::l:1:f:3\ncell:C15:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D15:b:2:2:2:2:l:2:f:1:bg:2\ncell:E15:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F15:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G15:vtf:t::IF(E15,(E15*F15),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H15:vtf:t::IF(SUM(G15),(G15/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I15:f:1\ncell:B16:b::2:::l:1:f:3\ncell:C16:b:2:2:2:2:l:2:f:1:cf:2\ncell:D16:b:2:2:2:2:l:2:f:1\ncell:E16:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F16:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G16:vtf:t::IF(E16,(E16*F16),\"\"):l:2:f:1:ntvf:1\ncell:H16:vtf:t::IF(SUM(G16),(G16/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I16:f:1\ncell:B17:b::2:::l:1:f:3\ncell:C17:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D17:b:2:2:2:2:l:2:f:1:bg:2\ncell:E17:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F17:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G17:vtf:t::IF(E17,(E17*F17),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H17:vtf:t::IF(SUM(G17),(G17/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I17:f:1\ncell:B18:b::2:::l:1:f:3\ncell:C18:b:2:2:2:2:l:2:f:1:cf:2\ncell:D18:b:2:2:2:2:l:2:f:1\ncell:E18:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F18:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G18:vtf:t::IF(E18,(E18*F18),\"\"):l:2:f:1:ntvf:1\ncell:H18:vtf:t::IF(SUM(G18),(G18/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I18:f:1\ncell:B19:b::2:::l:1:f:3\ncell:C19:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D19:b:2:2:2:2:l:2:f:1:bg:2\ncell:E19:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F19:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G19:vtf:t::IF(E19,(E19*F19),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H19:vtf:t::IF(SUM(G19),(G19/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I19:f:1\ncell:B20:b::2:::l:1:f:3\ncell:C20:b:2:2:2:2:l:2:f:1:cf:2\ncell:D20:b:2:2:2:2:l:2:f:1\ncell:E20:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F20:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G20:vtf:t::IF(E20,(E20*F20),\"\"):l:2:f:1:ntvf:1\ncell:H20:vtf:t::IF(SUM(G20),(G20/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I20:f:1\ncell:B21:b::2:::l:1:f:3\ncell:C21:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D21:b:2:2:2:2:l:2:f:1:bg:2\ncell:E21:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F21:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G21:vtf:t::IF(E21,(E21*F21),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H21:vtf:t::IF(SUM(G21),(G21/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I21:f:1\ncell:B22:b::2:::l:1:f:3\ncell:C22:b:2:2:2:2:l:2:f:1:cf:2\ncell:D22:b:2:2:2:2:l:2:f:1\ncell:E22:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F22:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G22:vtf:t::IF(E22,(E22*F22),\"\"):l:2:f:1:ntvf:1\ncell:H22:vtf:t::IF(SUM(G22),(G22/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I22:f:1\ncell:B23:b::2:::l:1:f:3\ncell:C23:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D23:b:2:2:2:2:l:2:f:1:bg:2\ncell:E23:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F23:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G23:vtf:t::IF(E23,(E23*F23),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H23:vtf:t::IF(SUM(G23),(G23/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I23:f:1\ncell:B24:b::2:::l:1:f:3\ncell:C24:b:2:2:2:2:l:2:f:1:cf:2\ncell:D24:b:2:2:2:2:l:2:f:1\ncell:E24:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F24:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G24:vtf:t::IF(E24,(E24*F24),\"\"):l:2:f:1:ntvf:1\ncell:H24:vtf:t::IF(SUM(G24),(G24/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I24:f:1\ncell:B25:b::2:::l:1:f:3\ncell:C25:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D25:b:2:2:2:2:l:2:f:1:bg:2\ncell:E25:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F25:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G25:vtf:t::IF(E25,(E25*F25),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H25:vtf:t::IF(SUM(G25),(G25/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I25:f:1\ncell:B26:b::2:::l:1:f:3\ncell:C26:b:2:2:2:2:l:2:f:1:cf:2\ncell:D26:b:2:2:2:2:l:2:f:1\ncell:E26:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F26:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G26:vtf:t::IF(E26,(E26*F26),\"\"):l:2:f:1:ntvf:1\ncell:H26:vtf:t::IF(SUM(G26),(G26/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I26:f:1\ncell:B27:b::2:::l:1:f:3\ncell:C27:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D27:b:2:2:2:2:l:2:f:1:bg:2\ncell:E27:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F27:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G27:vtf:t::IF(E27,(E27*F27),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H27:vtf:t::IF(SUM(G27),(G27/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I27:f:1\ncell:B28:b::2:::l:1:f:3\ncell:C28:b:2:2:2:2:l:2:f:1:cf:2\ncell:D28:b:2:2:2:2:l:2:f:1\ncell:E28:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F28:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G28:vtf:t::IF(E28,(E28*F28),\"\"):l:2:f:1:ntvf:1\ncell:H28:vtf:t::IF(SUM(G28),(G28/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I28:f:1\ncell:B29:b::2:::l:1:f:3\ncell:C29:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D29:b:2:2:2:2:l:2:f:1:bg:2\ncell:E29:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F29:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G29:vtf:t::IF(E29,(E29*F29),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H29:vtf:t::IF(SUM(G29),(G29/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I29:f:1\ncell:B30:b::2:::l:1:f:3\ncell:C30:b:2:2:2:2:l:2:f:1:cf:2\ncell:D30:b:2:2:2:2:l:2:f:1\ncell:E30:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F30:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G30:vtf:t::IF(E30,(E30*F30),\"\"):l:2:f:1:ntvf:1\ncell:H30:vtf:t::IF(SUM(G30),(G30/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I30:f:1\ncell:B31:b::2:::l:1:f:3\ncell:C31:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D31:b:2:2:2:2:l:2:f:1:bg:2\ncell:E31:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F31:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G31:vtf:t::IF(E31,(E31*F31),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H31:vtf:t::IF(SUM(G31),(G31/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I31:f:1\ncell:B32:b::2:::l:1:f:3\ncell:C32:b:2:2:2:2:l:2:f:1:cf:2\ncell:D32:b:2:2:2:2:l:2:f:1\ncell:E32:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F32:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G32:vtf:t::IF(E32,(E32*F32),\"\"):l:2:f:1:ntvf:1\ncell:H32:vtf:t::IF(SUM(G32),(G32/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I32:f:1\ncell:B33:l:1:f:3\ncell:C33:t:Totals:l:2:f:7\ncell:D33:l:2:f:7\ncell:E33:l:2:f:7\ncell:F33:l:2:f:7\ncell:G33:vtf:n:282635:IF(SUM(G8\\cG32),SUM(G8\\cG32),\"\"):l:2:f:7:ntvf:1\ncell:H33:vtf:n:1:IF(SUM(G33),(G33/$G$33),\"\"):l:2:f:7:ntvf:4\ncell:I33:f:4\ncell:C34:l:2:f:4\ncell:D34:l:2:f:4\ncell:E34:l:2:f:4\ncell:F34:l:2:f:4\ncell:G34:l:2:f:4\ncell:H34:l:2:f:4\ncell:I34:f:4\ncell:C35:l:2:f:3\ncell:D35:l:2\ncell:E35:l:2\ncell:F35:l:2\ncell:G35:l:2\ncell:H35:l:2\ncol:A:w:12\ncol:B:w:12\ncol:C:w:178\ncol:D:w:143\ncol:E:w:84\ncol:F:w:182\ncol:G:w:137\ncol:H:w:154\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:10:r:35:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold 26pt Times New Roman\nfont:3:normal normal 10pt Arial\nfont:4:normal normal 10pt arial,helvetica,sans-serif\nfont:5:normal normal 14pt *\nfont:6:normal normal 14pt Arial\nfont:7:normal normal 14pt arial,helvetica,sans-serif\nfont:8:normal normal 16pt arial,helvetica,sans-serif\nfont:9:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:2:\"$\"#,##0.00 ;\"$\"(#,##0.00)\nvalueformat:3:#,##0;(#,##0)\nvalueformat:4:0.00%\nvalueformat:5:@\nname:DATA_01::C4\nname:DATA_02::C9\nname:DATA_03::D9\\cD20\nname:DATA_04::G9\\cG20\n"},"name":"sheet101","hidden":"0"},"sheet5":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Product Sales Goals:l:2:f:6:c:3:bg:1:cf:1:colspan:4\ncell:D3:l:2:f:1:cf:1\ncell:E3:l:2:f:1:cf:1\ncell:F3:l:2:f:1:cf:1\ncell:D4:l:2:f:1:cf:1\ncell:E4:l:2:f:1:cf:1\ncell:F4:l:2:f:1:cf:1\ncell:C5:t:2000 Units:l:2:f:3:cf:1:colspan:4\ncell:D5:l:2:f:1:cf:1\ncell:E5:l:2:f:1:cf:1\ncell:F5:l:2:f:1:cf:1\ncell:C6:l:2:f:1\ncell:D6:l:2\ncell:E6:l:2:f:1\ncell:F6:l:2:f:1\ncell:C7:l:2:f:1\ncell:D7:t:TRAINS:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:E7:t::l:2:f:5\ncell:F7:t::l:2:f:5\ncell:C8:l:2:f:1\ncell:D8:t:Last Yr:b:::2::l:2:f:3:cf:1\ncell:E8:t:Goal:b:::2::l:2:f:3:cf:1\ncell:F8:t:Change:l:2:f:3:cf:1\ncell:C9:t:Jan:b::2:::l:2:f:2\ncell:D9:v:1782:b:2:2:2:2:l:2:f:2\ncell:E9:v:2000:b:2:2:2:2:l:2:f:2\ncell:F9:vtf:n:0.122334455667789:IF(ISNUMBER(D9),((E9-D9)/D9),\"\"):l:2:f:2:ntvf:1\ncell:G9:f:2\ncell:C10:t:Feb:b::2:::l:2:f:2:bg:2\ncell:D10:v:1523:b:2:2:2:2:l:2:f:2:bg:2\ncell:E10:v:1700:b:2:2:2:2:l:2:f:2:bg:2\ncell:F10:vtf:n:0.11621799080761655:IF(ISNUMBER(D10),((E10-D10)/D10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G10:f:2\ncell:C11:t:Mar:b::2:::l:2:f:2\ncell:D11:v:1901:b:2:2:2:2:l:2:f:2\ncell:E11:v:2000:b:2:2:2:2:l:2:f:2\ncell:F11:vtf:n:0.05207785376117833:IF(ISNUMBER(D11),((E11-D11)/D11),\"\"):l:2:f:2:ntvf:1\ncell:G11:f:2\ncell:C12:t:Apr:b::1:::l:2:f:2:bg:2\ncell:D12:v:2308:b:2:1:2:2:l:2:f:2:bg:2\ncell:E12:v:2400:b:2:1:2:2:l:2:f:2:bg:2\ncell:F12:vtf:n:0.03986135181975736:IF(ISNUMBER(D12),((E12-D12)/D12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G12:f:2\ncell:C13:t:May:b::2:::l:2:f:2\ncell:D13:v:2538:b:2:2:2:2:l:2:f:2\ncell:E13:v:2800:b:2:2:2:2:l:2:f:2\ncell:F13:vtf:n:0.10323089046493301:IF(ISNUMBER(D13),((E13-D13)/D13),\"\"):l:2:f:2:ntvf:1\ncell:G13:f:2\ncell:C14:t:Jun:b::2:::l:2:f:2:bg:2\ncell:D14:v:1866:b:2:2:2:2:l:2:f:2:bg:2\ncell:E14:v:2000:b:2:2:2:2:l:2:f:2:bg:2\ncell:F14:vtf:n:0.07181136120042872:IF(ISNUMBER(D14),((E14-D14)/D14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G14:f:2\ncell:C15:t:Jul:b::2:::l:2:f:2\ncell:D15:v:2212:b:2:2:2:2:l:2:f:2\ncell:E15:v:2500:b:2:2:2:2:l:2:f:2\ncell:F15:vtf:n:0.1301989150090416:IF(ISNUMBER(D15),((E15-D15)/D15),\"\"):l:2:f:2:ntvf:1\ncell:G15:f:2\ncell:C16:t:Aug:b::2:::l:2:f:2:bg:2\ncell:D16:v:1998:b:2:2:2:2:l:2:f:2:bg:2\ncell:E16:v:2300:b:2:2:2:2:l:2:f:2:bg:2\ncell:F16:vtf:n:0.15115115115115116:IF(ISNUMBER(D16),((E16-D16)/D16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G16:f:2\ncell:C17:t:Sep:b::2:::l:2:f:2\ncell:D17:v:2054:b:2:2:2:2:l:2:f:2\ncell:E17:v:2000:b:2:2:2:2:l:2:f:2\ncell:F17:vtf:n:-0.02629016553067186:IF(ISNUMBER(D17),((E17-D17)/D17),\"\"):l:2:f:2:ntvf:1\ncell:G17:f:2\ncell:C18:t:Oct:b::2:::l:2:f:2:bg:2\ncell:D18:v:2117:b:2:2:2:2:l:2:f:2:bg:2\ncell:E18:v:2400:b:2:2:2:2:l:2:f:2:bg:2\ncell:F18:vtf:n:0.1336797354747284:IF(ISNUMBER(D18),((E18-D18)/D18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G18:f:2\ncell:C19:t:Nov:b::2:::l:2:f:2\ncell:D19:v:1430:b:2:2:2:2:l:2:f:2\ncell:E19:v:1600:b:2:2:2:2:l:2:f:2\ncell:F19:vtf:n:0.11888111888111888:IF(ISNUMBER(D19),((E19-D19)/D19),\"\"):l:2:f:2:ntvf:1\ncell:G19:f:2\ncell:C20:t:Dec:b::1:::l:2:f:2:bg:2\ncell:D20:v:1859:b:2:1:2:2:l:2:f:2:bg:2\ncell:E20:v:2100:b:2:1:2:2:l:2:f:2:bg:2\ncell:F20:vtf:n:0.1296395911780527:IF(ISNUMBER(D20),((E20-D20)/D20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G20:f:2\ncell:C22:t:Year :l:2:f:4\ncell:D22:vtf:n:23588:IF(SUM(D9\\cD20),SUM(D9\\cD20),\"\"):b:1::1::l:2:f:4\ncell:E22:vtf:n:25800:IF(SUM(E9\\cE20),SUM(E9\\cE20),\"\"):b:1::1::l:2:f:4\ncell:F22:vtf:n:0.09377649652365609:IF(ISNUMBER(D22),((E22-D22)/D22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:G22:f:2\ncell:C23:l:2:f:2\ncell:D23:l:2:f:2\ncell:E23:l:2:f:2\ncell:F23:l:2:f:2\ncell:G23:f:2\ncell:C24:t:Date\\c :l:2:f:2:cf:2\ncell:D24:b:::2::l:2:f:2:ntvf:2\ncell:E24:l:2:f:2\ncell:F24:l:2:f:2\ncell:G24:f:2\ncell:C25:l:2:f:2\ncell:D25:b:2::::l:2:f:2\ncell:E25:l:2:f:2\ncell:F25:l:2:f:2\ncell:G25:f:2\ncell:C26:l:2\ncell:D26:l:2\ncell:E26:l:2\ncell:F26:l:2\ncell:C27:l:1:f:1\ncol:A:w:10\ncol:B:w:10\ncol:C:w:52\ncol:D:w:80\ncol:E:w:80\ncol:F:w:71\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:18.75\nrow:6:h:14.25\nrow:7:h:15.75\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:27:h:14.25\nsheet:c:7:r:27:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal normal 10pt Arial\nfont:2:normal normal 12pt arial,helvetica,sans-serif\nfont:3:normal normal 14pt Arial\nfont:4:normal normal 14pt arial,helvetica,sans-serif\nfont:5:normal normal 16pt Arial\nfont:6:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:0%\nvalueformat:2:dd-mmm-yy \nname:DATA_01::C5\nname:DATA_02::C10\nname:DATA_03::D10\\cD22\nname:DATA_04::#REF!\\c#REF!\n"},"name":"sheet4","hidden":"0"},"sheet6":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Product Sales Goals:l:1:f:3:cf:2\ncell:C3:l:1:f:4:cf:1\ncell:D3:l:1:f:4:cf:1\ncell:E3:l:1:f:4:cf:1\ncell:F3:l:1:f:4:cf:1\ncell:G3:l:1:f:4:cf:1\ncell:H3:l:1:f:4:cf:1\ncell:I3:l:1:f:4:cf:1\ncell:J3:l:1:f:4:cf:1\ncell:K3:l:1:f:4:cf:1\ncell:L3:l:1:f:4:cf:1\ncell:M3:l:1:f:4:cf:1\ncell:N3:l:1:f:4:cf:1\ncell:B4:t:2000 Units:l:1:f:2:cf:1\ncell:C4:l:1:f:4:cf:1\ncell:D4:l:1:f:4:cf:1\ncell:E4:l:1:f:4:cf:1\ncell:F4:l:1:f:4:cf:1\ncell:G4:l:1:f:4:cf:1\ncell:H4:l:1:f:4:cf:1\ncell:I4:l:1:f:4:cf:1\ncell:J4:l:1:f:4:cf:1\ncell:K4:l:1:f:4:cf:1\ncell:L4:l:1:f:4:cf:1\ncell:M4:l:1:f:4:cf:1\ncell:N4:l:1:f:4:cf:1\ncell:B5:l:1:f:4\ncell:D5:l:1:f:4\ncell:E5:l:1:f:4\ncell:F5:l:1:f:4\ncell:G5:l:1:f:4\ncell:H5:l:1:f:4\ncell:I5:l:1:f:4\ncell:J5:l:1:f:4\ncell:K5:l:1:f:4\ncell:L5:l:1:f:4\ncell:M5:l:1:f:4\ncell:N5:l:1:f:4\ncell:B6:l:1:f:4\ncell:C6:t:TRAINS:l:1:f:1:cf:1:colspan:3:rowspan:1\ncell:D6:t::l:2:f:4\ncell:E6:t::l:2:f:4\ncell:F6:t:PLANES:l:1:f:1:cf:1:colspan:3:rowspan:1\ncell:G6:t::l:2:f:4\ncell:H6:t::l:2:f:4\ncell:I6:t:AUTOMOBILES:l:1:f:1:cf:1:colspan:3:rowspan:1\ncell:J6:t::l:2:f:4\ncell:K6:t::l:2:f:4\ncell:L6:t:TOTAL:l:1:f:1:cf:1:colspan:3:rowspan:1\ncell:M6:t::l:2:f:4\ncell:N6:t::l:2:f:4\ncell:B7:l:1:f:4\ncell:C7:t:Last Yr:b:::1::l:1:f:4:cf:1\ncell:D7:t:Goal:b:::1::l:1:f:4:cf:1\ncell:E7:t:Change:b:::1::l:1:f:4:cf:1\ncell:F7:t:Last Yr:b:::1::l:1:f:4:cf:1\ncell:G7:t:Goal:b:::1::l:1:f:4:cf:1\ncell:H7:t:Change:b:::1::l:1:f:4:cf:1\ncell:I7:t:Last Yr:b:::1::l:1:f:4:cf:1\ncell:J7:t:Goal:b:::1::l:1:f:4:cf:1\ncell:K7:t:Change:b:::1::l:1:f:4:cf:1\ncell:L7:t:Last Yr:b:::1::l:1:f:4:cf:1\ncell:M7:t:Goal:b:::1::l:1:f:4:cf:1\ncell:N7:t:Change:b:::1::l:1:f:4:cf:1\ncell:B8:t:Jan:b::1:::l:1:f:4\ncell:C8:v:1782:b:1:1:1:1:l:1:f:4\ncell:D8:v:2000:b:1:1:1:1:l:1:f:4\ncell:E8:vtf:n:0.122334455667789:IF(ISNUMBER(C8),((D8-C8)/C8),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F8:v:325:b:1:1:1:1:l:1:f:4\ncell:G8:v:350:b:1:1:1:1:l:1:f:4\ncell:H8:vtf:n:0.07692307692307693:IF(ISNUMBER(F8),((G8-F8)/F8),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I8:v:711:b:1:1:1:1:l:1:f:4\ncell:J8:v:800:b:1:1:1:1:l:1:f:4\ncell:K8:vtf:n:0.12517580872011252:IF(ISNUMBER(I8),((J8-I8)/I8),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L8:vtf:n:2818:IF(SUM(C8,F8,I8),SUM(C8,F8,I8),\"\"):b:1:1:1:1:l:1:f:4\ncell:M8:vtf:n:3150:IF(SUM(D8,G8,J8),SUM(D8,G8,J8),\"\"):b:1:1:1:1:l:1:f:4\ncell:N8:vtf:n:0.11781405251951739:IF(ISNUMBER(L8),((M8-L8)/L8),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B9:t:Feb:b::1:::l:1:f:4\ncell:C9:v:1523:b:1:1:1:1:l:1:f:4\ncell:D9:v:1700:b:1:1:1:1:l:1:f:4\ncell:E9:vtf:n:0.11621799080761655:IF(ISNUMBER(C9),((D9-C9)/C9),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F9:v:158:b:1:1:1:1:l:1:f:4\ncell:G9:v:200:b:1:1:1:1:l:1:f:4\ncell:H9:vtf:n:0.26582278481012656:IF(ISNUMBER(F9),((G9-F9)/F9),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I9:v:564:b:1:1:1:1:l:1:f:4\ncell:J9:v:650:b:1:1:1:1:l:1:f:4\ncell:K9:vtf:n:0.1524822695035461:IF(ISNUMBER(I9),((J9-I9)/I9),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L9:vtf:n:2245:IF(SUM(C9,F9,I9),SUM(C9,F9,I9),\"\"):b:1:1:1:1:l:1:f:4\ncell:M9:vtf:n:2550:IF(SUM(D9,G9,J9),SUM(D9,G9,J9),\"\"):b:1:1:1:1:l:1:f:4\ncell:N9:vtf:n:0.1358574610244989:IF(ISNUMBER(L9),((M9-L9)/L9),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B10:t:Mar:b::1:::l:1:f:4\ncell:C10:v:1901:b:1:1:1:1:l:1:f:4\ncell:D10:v:2000:b:1:1:1:1:l:1:f:4\ncell:E10:vtf:n:0.05207785376117833:IF(ISNUMBER(C10),((D10-C10)/C10),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F10:v:168:b:1:1:1:1:l:1:f:4\ncell:G10:v:200:b:1:1:1:1:l:1:f:4\ncell:H10:vtf:n:0.19047619047619047:IF(ISNUMBER(F10),((G10-F10)/F10),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I10:v:740:b:1:1:1:1:l:1:f:4\ncell:J10:v:850:b:1:1:1:1:l:1:f:4\ncell:K10:vtf:n:0.14864864864864866:IF(ISNUMBER(I10),((J10-I10)/I10),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L10:vtf:n:2809:IF(SUM(C10,F10,I10),SUM(C10,F10,I10),\"\"):b:1:1:1:1:l:1:f:4\ncell:M10:vtf:n:3050:IF(SUM(D10,G10,J10),SUM(D10,G10,J10),\"\"):b:1:1:1:1:l:1:f:4\ncell:N10:vtf:n:0.08579565681737274:IF(ISNUMBER(L10),((M10-L10)/L10),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B11:t:Apr:b::1:::l:1:f:4\ncell:C11:v:2308:b:1:1:1:1:l:1:f:4\ncell:D11:v:2400:b:1:1:1:1:l:1:f:4\ncell:E11:vtf:n:0.03986135181975736:IF(ISNUMBER(C11),((D11-C11)/C11),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F11:v:365:b:1:1:1:1:l:1:f:4\ncell:G11:v:400:b:1:1:1:1:l:1:f:4\ncell:H11:vtf:n:0.0958904109589041:IF(ISNUMBER(F11),((G11-F11)/F11),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I11:v:642:b:1:1:1:1:l:1:f:4\ncell:J11:v:700:b:1:1:1:1:l:1:f:4\ncell:K11:vtf:n:0.09034267912772585:IF(ISNUMBER(I11),((J11-I11)/I11),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L11:vtf:n:3315:IF(SUM(C11,F11,I11),SUM(C11,F11,I11),\"\"):b:1:1:1:1:l:1:f:4\ncell:M11:vtf:n:3500:IF(SUM(D11,G11,J11),SUM(D11,G11,J11),\"\"):b:1:1:1:1:l:1:f:4\ncell:N11:vtf:n:0.05580693815987934:IF(ISNUMBER(L11),((M11-L11)/L11),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B12:t:May:b::1:::l:1:f:4\ncell:C12:v:2538:b:1:1:1:1:l:1:f:4\ncell:D12:v:2800:b:1:1:1:1:l:1:f:4\ncell:E12:vtf:n:0.10323089046493301:IF(ISNUMBER(C12),((D12-C12)/C12),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F12:v:402:b:1:1:1:1:l:1:f:4\ncell:G12:v:450:b:1:1:1:1:l:1:f:4\ncell:H12:vtf:n:0.11940298507462686:IF(ISNUMBER(F12),((G12-F12)/F12),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I12:v:663:b:1:1:1:1:l:1:f:4\ncell:J12:v:800:b:1:1:1:1:l:1:f:4\ncell:K12:vtf:n:0.2066365007541478:IF(ISNUMBER(I12),((J12-I12)/I12),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L12:vtf:n:3603:IF(SUM(C12,F12,I12),SUM(C12,F12,I12),\"\"):b:1:1:1:1:l:1:f:4\ncell:M12:vtf:n:4050:IF(SUM(D12,G12,J12),SUM(D12,G12,J12),\"\"):b:1:1:1:1:l:1:f:4\ncell:N12:vtf:n:0.12406328059950042:IF(ISNUMBER(L12),((M12-L12)/L12),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B13:t:Jun:b::1:::l:1:f:4\ncell:C13:v:1866:b:1:1:1:1:l:1:f:4\ncell:D13:v:2000:b:1:1:1:1:l:1:f:4\ncell:E13:vtf:n:0.07181136120042872:IF(ISNUMBER(C13),((D13-C13)/C13),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F13:v:217:b:1:1:1:1:l:1:f:4\ncell:G13:v:250:b:1:1:1:1:l:1:f:4\ncell:H13:vtf:n:0.15207373271889402:IF(ISNUMBER(F13),((G13-F13)/F13),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I13:v:604:b:1:1:1:1:l:1:f:4\ncell:J13:v:700:b:1:1:1:1:l:1:f:4\ncell:K13:vtf:n:0.15894039735099338:IF(ISNUMBER(I13),((J13-I13)/I13),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L13:vtf:n:2687:IF(SUM(C13,F13,I13),SUM(C13,F13,I13),\"\"):b:1:1:1:1:l:1:f:4\ncell:M13:vtf:n:2950:IF(SUM(D13,G13,J13),SUM(D13,G13,J13),\"\"):b:1:1:1:1:l:1:f:4\ncell:N13:vtf:n:0.09787867510234462:IF(ISNUMBER(L13),((M13-L13)/L13),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B14:t:Jul:b::1:::l:1:f:4\ncell:C14:v:2212:b:1:1:1:1:l:1:f:4\ncell:D14:v:2500:b:1:1:1:1:l:1:f:4\ncell:E14:vtf:n:0.1301989150090416:IF(ISNUMBER(C14),((D14-C14)/C14),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F14:v:264:b:1:1:1:1:l:1:f:4\ncell:G14:v:300:b:1:1:1:1:l:1:f:4\ncell:H14:vtf:n:0.13636363636363635:IF(ISNUMBER(F14),((G14-F14)/F14),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I14:v:653:b:1:1:1:1:l:1:f:4\ncell:J14:v:800:b:1:1:1:1:l:1:f:4\ncell:K14:vtf:n:0.225114854517611:IF(ISNUMBER(I14),((J14-I14)/I14),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L14:vtf:n:3129:IF(SUM(C14,F14,I14),SUM(C14,F14,I14),\"\"):b:1:1:1:1:l:1:f:4\ncell:M14:vtf:n:3600:IF(SUM(D14,G14,J14),SUM(D14,G14,J14),\"\"):b:1:1:1:1:l:1:f:4\ncell:N14:vtf:n:0.15052732502396932:IF(ISNUMBER(L14),((M14-L14)/L14),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B15:t:Aug:b::1:::l:1:f:4\ncell:C15:v:1998:b:1:1:1:1:l:1:f:4\ncell:D15:v:2300:b:1:1:1:1:l:1:f:4\ncell:E15:vtf:n:0.15115115115115116:IF(ISNUMBER(C15),((D15-C15)/C15),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F15:v:267:b:1:1:1:1:l:1:f:4\ncell:G15:v:300:b:1:1:1:1:l:1:f:4\ncell:H15:vtf:n:0.12359550561797752:IF(ISNUMBER(F15),((G15-F15)/F15),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I15:v:537:b:1:1:1:1:l:1:f:4\ncell:J15:v:600:b:1:1:1:1:l:1:f:4\ncell:K15:vtf:n:0.11731843575418995:IF(ISNUMBER(I15),((J15-I15)/I15),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L15:vtf:n:2802:IF(SUM(C15,F15,I15),SUM(C15,F15,I15),\"\"):b:1:1:1:1:l:1:f:4\ncell:M15:vtf:n:3200:IF(SUM(D15,G15,J15),SUM(D15,G15,J15),\"\"):b:1:1:1:1:l:1:f:4\ncell:N15:vtf:n:0.14204139900071378:IF(ISNUMBER(L15),((M15-L15)/L15),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B16:t:Sep:b::1:::l:1:f:4\ncell:C16:v:2054:b:1:1:1:1:l:1:f:4\ncell:D16:v:2000:b:1:1:1:1:l:1:f:4\ncell:E16:vtf:n:-0.02629016553067186:IF(ISNUMBER(C16),((D16-C16)/C16),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F16:v:318:b:1:1:1:1:l:1:f:4\ncell:G16:v:350:b:1:1:1:1:l:1:f:4\ncell:H16:vtf:n:0.10062893081761007:IF(ISNUMBER(F16),((G16-F16)/F16),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I16:v:741:b:1:1:1:1:l:1:f:4\ncell:J16:v:900:b:1:1:1:1:l:1:f:4\ncell:K16:vtf:n:0.2145748987854251:IF(ISNUMBER(I16),((J16-I16)/I16),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L16:vtf:n:3113:IF(SUM(C16,F16,I16),SUM(C16,F16,I16),\"\"):b:1:1:1:1:l:1:f:4\ncell:M16:vtf:n:3250:IF(SUM(D16,G16,J16),SUM(D16,G16,J16),\"\"):b:1:1:1:1:l:1:f:4\ncell:N16:vtf:n:0.04400899453902987:IF(ISNUMBER(L16),((M16-L16)/L16),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B17:t:Oct:b::1:::l:1:f:4\ncell:C17:v:2117:b:1:1:1:1:l:1:f:4\ncell:D17:v:2400:b:1:1:1:1:l:1:f:4\ncell:E17:vtf:n:0.1336797354747284:IF(ISNUMBER(C17),((D17-C17)/C17),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F17:v:159:b:1:1:1:1:l:1:f:4\ncell:G17:v:200:b:1:1:1:1:l:1:f:4\ncell:H17:vtf:n:0.2578616352201258:IF(ISNUMBER(F17),((G17-F17)/F17),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I17:v:554:b:1:1:1:1:l:1:f:4\ncell:J17:v:650:b:1:1:1:1:l:1:f:4\ncell:K17:vtf:n:0.17328519855595667:IF(ISNUMBER(I17),((J17-I17)/I17),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L17:vtf:n:2830:IF(SUM(C17,F17,I17),SUM(C17,F17,I17),\"\"):b:1:1:1:1:l:1:f:4\ncell:M17:vtf:n:3250:IF(SUM(D17,G17,J17),SUM(D17,G17,J17),\"\"):b:1:1:1:1:l:1:f:4\ncell:N17:vtf:n:0.14840989399293286:IF(ISNUMBER(L17),((M17-L17)/L17),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B18:t:Nov:b::1:::l:1:f:4\ncell:C18:v:1430:b:1:1:1:1:l:1:f:4\ncell:D18:v:1600:b:1:1:1:1:l:1:f:4\ncell:E18:vtf:n:0.11888111888111888:IF(ISNUMBER(C18),((D18-C18)/C18),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F18:v:193:b:1:1:1:1:l:1:f:4\ncell:G18:v:200:b:1:1:1:1:l:1:f:4\ncell:H18:vtf:n:0.03626943005181347:IF(ISNUMBER(F18),((G18-F18)/F18),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I18:v:657:b:1:1:1:1:l:1:f:4\ncell:J18:v:800:b:1:1:1:1:l:1:f:4\ncell:K18:vtf:n:0.2176560121765601:IF(ISNUMBER(I18),((J18-I18)/I18),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L18:vtf:n:2280:IF(SUM(C18,F18,I18),SUM(C18,F18,I18),\"\"):b:1:1:1:1:l:1:f:4\ncell:M18:vtf:n:2600:IF(SUM(D18,G18,J18),SUM(D18,G18,J18),\"\"):b:1:1:1:1:l:1:f:4\ncell:N18:vtf:n:0.14035087719298245:IF(ISNUMBER(L18),((M18-L18)/L18),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B19:t:Dec:b::1:::l:1:f:4\ncell:C19:v:1859:b:1:1:1:1:l:1:f:4\ncell:D19:v:2100:b:1:1:1:1:l:1:f:4\ncell:E19:vtf:n:0.1296395911780527:IF(ISNUMBER(C19),((D19-C19)/C19),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F19:v:426:b:1:1:1:1:l:1:f:4\ncell:G19:v:450:b:1:1:1:1:l:1:f:4\ncell:H19:vtf:n:0.056338028169014086:IF(ISNUMBER(F19),((G19-F19)/F19),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I19:v:732:b:1:1:1:1:l:1:f:4\ncell:J19:v:850:b:1:1:1:1:l:1:f:4\ncell:K19:vtf:n:0.16120218579234974:IF(ISNUMBER(I19),((J19-I19)/I19),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L19:vtf:n:3017:IF(SUM(C19,F19,I19),SUM(C19,F19,I19),\"\"):b:1:1:1:1:l:1:f:4\ncell:M19:vtf:n:3400:IF(SUM(D19,G19,J19),SUM(D19,G19,J19),\"\"):b:1:1:1:1:l:1:f:4\ncell:N19:vtf:n:0.12694729864103413:IF(ISNUMBER(L19),((M19-L19)/L19),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B20:t:Year :b::1:::l:1:f:4\ncell:C20:vtf:n:23588:IF(SUM(C8\\cC19),SUM(C8\\cC19),\"\"):b:1:1:1:1:l:1:f:4\ncell:D20:vtf:n:25800:IF(SUM(D8\\cD19),SUM(D8\\cD19),\"\"):b:1:1:1:1:l:1:f:4\ncell:E20:vtf:n:0.09377649652365609:IF(ISNUMBER(C20),((D20-C20)/C20),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F20:vtf:n:3262:IF(SUM(F8\\cF19),SUM(F8\\cF19),\"\"):b:1:1:1:1:l:1:f:4\ncell:G20:vtf:n:3650:IF(SUM(G8\\cG19),SUM(G8\\cG19),\"\"):b:1:1:1:1:l:1:f:4\ncell:H20:vtf:n:0.11894543225015328:IF(ISNUMBER(F20),((G20-F20)/F20),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I20:vtf:n:7798:IF(SUM(I8\\cI19),SUM(I8\\cI19),\"\"):b:1:1:1:1:l:1:f:4\ncell:J20:vtf:n:9100:IF(SUM(J8\\cJ19),SUM(J8\\cJ19),\"\"):b:1:1:1:1:l:1:f:4\ncell:K20:vtf:n:0.16696588868940754:IF(ISNUMBER(I20),((J20-I20)/I20),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L20:vtf:n:34648:IF(SUM(L8\\cL19),SUM(L8\\cL19),\"\"):b:1:1:1:1:l:1:f:4\ncell:M20:vtf:n:38550:IF(SUM(M8\\cM19),SUM(M8\\cM19),\"\"):b:1:1:1:1:l:1:f:4\ncell:N20:vtf:n:0.11261833294851073:IF(ISNUMBER(L20),((M20-L20)/L20),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B21:l:1:f:4\ncell:C21:b:1::::l:1:f:4\ncell:D21:b:1::::l:1:f:4\ncell:E21:b:1::::l:1:f:4\ncell:F21:b:1::::l:1:f:4\ncell:G21:b:1::::l:1:f:4\ncell:H21:b:1::::l:1:f:4\ncell:I21:b:1::::l:1:f:4\ncell:J21:b:1::::l:1:f:4\ncell:K21:b:1::::l:1:f:4\ncell:L21:b:1::::l:1:f:4\ncell:M21:b:1::::l:1:f:4\ncell:N21:b:1::::l:1:f:4\ncell:B22:t:Date\\c :l:1:f:4:cf:3\ncell:C22:b:::1::l:1:f:4:ntvf:2\ncell:D22:l:1:f:4\ncell:E22:l:1:f:4\ncell:F22:l:1:f:4\ncell:G22:l:1:f:4\ncell:H22:l:1:f:4\ncell:I22:l:1:f:4\ncell:J22:t:Prepared by\\c :l:1:f:4:cf:3\ncell:K22:b:::1::l:1:f:4:cf:1\ncell:L22:b:::1::l:1:f:4:cf:1\ncell:M22:b:::1::l:1:f:4:cf:1\ncell:N22:b:::1::l:1:f:4:cf:1\ncell:C23:b:1::::l:1:f:4\ncell:K23:b:1::::l:1:f:4\ncell:L23:b:1::::l:1:f:4\ncell:M23:b:1::::l:1:f:4\ncell:N23:b:1::::l:1:f:4\ncell:B25:l:1:f:4\ncol:B:w:306\ncol:C:w:80\ncol:D:w:80\ncol:E:w:71\ncol:F:w:80\ncol:G:w:80\ncol:H:w:71\ncol:I:w:80\ncol:J:w:80\ncol:K:w:71\ncol:L:w:80\ncol:M:w:80\ncol:N:w:71\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:15.75\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:25:h:14.25\nsheet:c:14:r:25:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\nfont:1:normal bold 12pt Arial\nfont:2:normal bold 14pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:0%\nvalueformat:2:dd-mmm-yy \nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet401","hidden":"0"},"sheet7":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Price Estimate for Services :l:1:f:8:c:3:bg:1:cf:1:colspan:2\ncell:D3:l:1:f:3:cf:1\ncell:C4:vtf:ndt:41099.54668960648:NOW():l:1:f:7:cf:1:ntvf:6\ncell:D4:l:1\ncell:C5:l:1:f:1:cf:1:ntvf:6\ncell:D5:l:1:f:1\ncell:E5:f:1\ncell:F5:f:1\ncell:C6:t:Name of Job:l:1:f:7:cf:1\ncell:D6:t:Job 1:l:1:f:7:cf:1\ncell:C7:t:Wage rate per hour:l:1:f:5:cf:2\ncell:D7:v:10:b:1:1:1:1:l:1:f:5:cf:3:ntvf:3\ncell:E7:f:5\ncell:F7:f:5\ncell:C8:t:Fringe Benefit as a % of wages:l:1:f:5:bg:2:cf:2\ncell:D8:v:0.3:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:5\ncell:E8:f:5\ncell:F8:f:5\ncell:C9:t:Projected Overhead Cost for Year:l:1:f:5:cf:2\ncell:D9:v:40000:b:1:1:1:1:l:1:f:5:cf:3:ntvf:2\ncell:E9:f:5\ncell:F9:f:5\ncell:C10:t:Projected Direct Labor Cost for Year:l:1:f:5:bg:2:cf:2\ncell:D10:v:50000:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:2\ncell:E10:f:5\ncell:F10:f:5\ncell:C11:l:1:f:5:cf:2\ncell:D11:l:1:f:5:cf:3\ncell:E11:f:5\ncell:F11:f:5\ncell:C12:t:Hours worked on job:l:1:f:5:cf:2\ncell:D12:v:1.5:b:1:1:1:1:l:1:f:5:cf:3:ntvf:4\ncell:E12:f:5\ncell:F12:f:5\ncell:C13:t:Direct Labor Cost:l:1:f:5:bg:2:cf:2\ncell:D13:vtf:n:19.5:IF(SUM(D12,D7),((D12*D7)*(1+D8)),\"\"):l:1:f:5:bg:2:cf:3:ntvf:3\ncell:E13:f:5\ncell:F13:f:5\ncell:C14:t:Overhead Cost:l:1:f:5:cf:2\ncell:D14:vtf:n:15.600000000000001:IF((D10>0),((D9/D10)*D13),\"\"):l:1:f:5:cf:3:ntvf:1\ncell:E14:f:5\ncell:F14:f:5\ncell:C15:t:Cost of materials for the job:l:1:f:5:bg:2:cf:2\ncell:D15:v:10:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:1\ncell:E15:f:5\ncell:F15:f:5\ncell:C16:l:1:f:9:cf:2\ncell:D16:l:1:f:9:cf:3:ntvf:1\ncell:E16:f:4\ncell:C17:t:Total cost:l:1:f:6:cf:2\ncell:D17:vtf:n:45.1:IF(SUM(D13\\cD15),SUM(D13\\cD15),\"\"):b:2::2::l:1:f:6:cf:3:ntvf:3\ncell:E17:f:6\ncell:C18:l:1:f:2\ncell:D18:b:2::::l:1:f:2\ncell:C19:l:1:f:2\ncell:D19:l:1\ncol:A:w:10\ncol:B:w:10\ncol:C:w:289\ncol:D:w:110\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:18.75\nrow:6:h:18.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:15.75\nrow:10:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:12\nrow:21:h:12\nrow:22:h:12\nsheet:c:6:r:22:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 6pt *\nfont:2:normal normal 10pt Arial\nfont:3:normal normal 10pt Times New Roman\nfont:4:normal normal 12pt *\nfont:5:normal normal 12pt arial,helvetica,sans-serif\nfont:6:normal normal 14pt arial,helvetica,sans-serif\nfont:7:normal normal 16pt arial,helvetica,sans-serif\nfont:8:normal normal 26pt arial,helvetica,sans-serif\nfont:9:normal normal 6pt *\nlayout:1:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1: #,##0.00 ;(#,##0.00)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:3:\"$\"#,##0.00 ;\"$\"(#,##0.00)\nvalueformat:4:#,##0.00;(#,##0.00)\nvalueformat:5:0%\nvalueformat:6:mmmm d, yyyy\nname:DATA_01::C4\nname:DATA_02::C10\nname:DATA_03::D10\\cD22\nname:DATA_04::#REF!\\c#REF!\n"},"name":"sheet5","hidden":"0"},"sheet8":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Price Estimate for Services :l:1:f:4:cf:2\ncell:C3:l:1:f:6:cf:1\ncell:D3:l:1:f:6:cf:1\ncell:E3:l:1:f:6:cf:1\ncell:F3:l:1:f:6:cf:1\ncell:G3:l:1:f:6:cf:1\ncell:B4:vtf:ndt:41096.725430844905:NOW():l:1:f:3:cf:1:ntvf:6\ncell:B5:t:Name of Job:b:::1::l:1:f:2:cf:2\ncell:C5:t:Job 1:b:::1::l:1:f:1:cf:3\ncell:D5:t:Job 2:b:::1::l:1:f:1:cf:3\ncell:E5:t:Job 3:b:::1::l:1:f:1:cf:3\ncell:F5:t:Job 4:b:::1::l:1:f:1:cf:3\ncell:G5:t:Job 5:b:::1::l:1:f:1:cf:3\ncell:B6:t:Wage rate per hour:b:1::::l:1:f:7\ncell:C6:v:10:b:1::::l:1:f:7:ntvf:3\ncell:D6:v:22:b:1::::l:1:f:7:ntvf:3\ncell:E6:v:14:b:1::::l:1:f:7:ntvf:3\ncell:F6:v:15:b:1::::l:1:f:7:ntvf:3\ncell:G6:v:19:b:1::::l:1:f:7:ntvf:3\ncell:B7:t:Fringe Benefit as a % of wages:l:1:f:7\ncell:C7:v:0.3:l:1:f:7:ntvf:5\ncell:D7:v:0.3:l:1:f:7:ntvf:5\ncell:E7:v:0.3:l:1:f:7:ntvf:5\ncell:F7:v:0.3:l:1:f:7:ntvf:5\ncell:G7:v:0.3:l:1:f:7:ntvf:5\ncell:B8:t:Projected Overhead Cost for Year:l:1:f:7:cf:2\ncell:C8:v:40000:l:1:f:7:ntvf:2\ncell:D8:v:40000:l:1:f:7:ntvf:2\ncell:E8:v:40000:l:1:f:7:ntvf:2\ncell:F8:v:40000:l:1:f:7:ntvf:2\ncell:G8:v:40000:l:1:f:7:ntvf:2\ncell:B9:t:Projected Direct Labor Cost for Year:l:1:f:7:cf:2\ncell:C9:v:50000:l:1:f:7:ntvf:2\ncell:D9:v:50000:l:1:f:7:ntvf:2\ncell:E9:v:50000:l:1:f:7:ntvf:2\ncell:F9:v:50000:l:1:f:7:ntvf:2\ncell:G9:v:50000:l:1:f:7:ntvf:2\ncell:B11:t:Hours worked on job:l:1:f:7\ncell:C11:v:1.5:l:1:f:7:ntvf:4\ncell:D11:v:2:l:1:f:7:ntvf:4\ncell:E11:v:1.5:l:1:f:7:ntvf:4\ncell:F11:v:1.5:l:1:f:7:ntvf:4\ncell:G11:v:1.5:l:1:f:7:ntvf:4\ncell:B12:t:Direct Labor Cost:l:1:f:7:cf:2\ncell:C12:vtf:n:19.5:IF(SUM(C11,C6),((C11*C6)*(1+C7)),\"\"):l:1:f:7:ntvf:3\ncell:D12:vtf:n:57.2:IF(SUM(D11,D6),((D11*D6)*(1+D7)),\"\"):l:1:f:7:ntvf:3\ncell:E12:vtf:n:27.3:IF(SUM(E11,E6),((E11*E6)*(1+E7)),\"\"):l:1:f:7:ntvf:3\ncell:F12:vtf:n:29.25:IF(SUM(F11,F6),((F11*F6)*(1+F7)),\"\"):l:1:f:7:ntvf:3\ncell:G12:vtf:n:37.050000000000004:IF(SUM(G11,G6),((G11*G6)*(1+G7)),\"\"):l:1:f:7:ntvf:3\ncell:B13:t:Overhead Cost:l:1:f:7\ncell:C13:vtf:n:15.600000000000001:IF((C9>0),((C8/C9)*C12),\"\"):l:1:f:7:ntvf:1\ncell:D13:vtf:n:45.760000000000005:IF((D9>0),((D8/D9)*D12),\"\"):l:1:f:7:ntvf:1\ncell:E13:vtf:n:21.840000000000003:IF((E9>0),((E8/E9)*E12),\"\"):l:1:f:7:ntvf:1\ncell:F13:vtf:n:23.400000000000002:IF((F9>0),((F8/F9)*F12),\"\"):l:1:f:7:ntvf:1\ncell:G13:vtf:n:29.640000000000004:IF((G9>0),((G8/G9)*G12),\"\"):l:1:f:7:ntvf:1\ncell:B14:t:Cost of materials for the job:b:::1::l:1:f:7\ncell:C14:v:10:b:::1::l:1:f:7:ntvf:1\ncell:D14:v:10:b:::1::l:1:f:7:ntvf:1\ncell:E14:v:10:b:::1::l:1:f:7:ntvf:1\ncell:F14:v:10:b:::1::l:1:f:7:ntvf:1\ncell:G14:v:10:b:::1::l:1:f:7:ntvf:1\ncell:B15:t:Total cost:b:1::1::l:1:f:1\ncell:C15:vtf:n:45.1:IF(SUM(C12\\cC14),SUM(C12\\cC14),\"\"):b:1::1::l:1:f:1:ntvf:3\ncell:D15:vtf:n:112.96000000000001:IF(SUM(D12\\cD14),SUM(D12\\cD14),\"\"):b:1::1::l:1:f:1:ntvf:3\ncell:E15:vtf:n:59.14:IF(SUM(E12\\cE14),SUM(E12\\cE14),\"\"):b:1::1::l:1:f:1:ntvf:3\ncell:F15:vtf:n:62.650000000000006:IF(SUM(F12\\cF14),SUM(F12\\cF14),\"\"):b:1::1::l:1:f:1:ntvf:3\ncell:G15:vtf:n:76.69000000000001:IF(SUM(G12\\cG14),SUM(G12\\cG14),\"\"):b:1::1::l:1:f:1:ntvf:3\ncell:B16:b:1::::l:1:f:5\ncell:C16:b:1::::l:1:f:5\ncell:D16:b:1::::l:1:f:5\ncell:E16:b:1::::l:1:f:5\ncell:F16:b:1::::l:1:f:5\ncell:G16:b:1::::l:1:f:5\ncell:B17:l:1:f:5\ncol:B:w:289\ncol:C:w:110\ncol:D:w:110\ncol:E:w:110\ncol:F:w:110\ncol:G:w:110\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:18.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:15.75\nrow:11:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:12\nrow:19:h:12\nrow:20:h:12\nsheet:c:7:r:20:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\nfont:1:normal bold 12pt Times New Roman\nfont:2:normal bold 14pt Times New Roman\nfont:3:normal bold 16pt Times New Roman\nfont:4:normal bold 26pt Times New Roman\nfont:5:normal normal 10pt Arial\nfont:6:normal normal 10pt Times New Roman\nfont:7:normal normal 12pt Times New Roman\nlayout:1:padding:* * * *;vertical-align:bottom;\nvalueformat:1: #,##0.00 ;(#,##0.00)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:3:\"$\"#,##0.00 ;\"$\"(#,##0.00)\nvalueformat:4:#,##0.00;(#,##0.00)\nvalueformat:5:0%\nvalueformat:6:mmmm d, yyyy\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet501","hidden":"0"},"sheet9":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:SALES QUOTATION:l:2:f:7:c:3:bg:1:cf:1:colspan:7\ncell:D3:l:2:f:1\ncell:E3:l:2:f:1\ncell:F3:l:2:f:1\ncell:G3:l:2:f:1\ncell:H3:l:2:f:1\ncell:I3:l:2:f:1\ncell:D4:l:2:f:1\ncell:E4:l:2:f:1\ncell:F4:l:2:f:1\ncell:G4:l:2:f:1\ncell:H4:l:2:f:1\ncell:I4:l:2:f:1\ncell:C5:t:Your Company, Inc.:l:2:f:3:cf:2\ncell:D5:l:2:f:1\ncell:E5:l:2:f:1\ncell:F5:l:2:f:1\ncell:G5:l:2:f:1\ncell:H5:l:2:f:1\ncell:I5:l:2:f:1:cf:3\ncell:C6:t:Name:l:2:f:2\ncell:D6:b:::1::l:2:f:2:colspan:2\ncell:E6:l:2:f:2\ncell:F6:l:2:f:2:cf:3\ncell:G6:l:2:f:1\ncell:H6:l:2:f:1\ncell:I6:l:2:f:1\ncell:C7:t:Address:l:2:f:2\ncell:D7:b:::1::l:2:f:2:colspan:2\ncell:E7:l:2:f:2\ncell:F7:l:2:f:2:cf:3\ncell:G7:l:2:f:1\ncell:H7:l:2:f:1\ncell:I7:l:2:f:1\ncell:C8:l:2:f:1\ncell:D8:l:2:f:1\ncell:E8:l:2:f:1\ncell:F8:l:2:f:1:cf:3\ncell:G8:l:2:f:1\ncell:H8:l:2:f:1\ncell:I8:l:2:f:1\ncell:C9:b:::2::l:2:f:1\ncell:D9:b:::2::l:2:f:1\ncell:E9:b:::2::l:2:f:1\ncell:F9:b:::2::l:2:f:1\ncell:G9:l:2:f:1\ncell:H9:l:2:f:1\ncell:I9:l:2:f:1\ncell:B10:b::2:::l:1:f:5\ncell:C10:t:TO\\c:b:1:::1:l:2:f:3\ncell:D10:b:2::::l:2:f:1\ncell:E10:b:2::::l:2:f:1\ncell:F10:b:2:2:::l:2:f:1\ncell:G10:b::::2:l:2:f:2\ncell:H10:l:2:f:2\ncell:I10:l:2:f:2\ncell:B11:b::2:::l:1:f:5\ncell:C11:b::::2:l:2:f:1:colspan:4\ncell:D11:l:2:f:1\ncell:E11:l:2:f:1\ncell:F11:b::2:::l:2:f:1\ncell:G11:b::::2:l:2:f:2\ncell:H11:t:F.O.B. :l:2:f:6:cf:3\ncell:I11:b:::1::l:2:f:2\ncell:B12:b::2:::l:1:f:5\ncell:C12:b::::1:l:2:f:1:bg:2:colspan:4\ncell:D12:l:2:f:1\ncell:E12:l:2:f:1\ncell:F12:b::2:::l:2:f:1\ncell:G12:b::::2:l:2:f:2\ncell:H12:t:TERMS :l:2:f:2:bg:2:cf:3\ncell:I12:b:::1::l:2:f:2:bg:2\ncell:B13:b::2:::l:1:f:5\ncell:C13:b::::2:l:2:f:1:colspan:4\ncell:D13:l:2:f:1\ncell:E13:l:2:f:1\ncell:F13:b::2:::l:2:f:1\ncell:G13:b::::2:l:2:f:2\ncell:H13:t:DELIVERY :l:2:f:2:cf:3\ncell:I13:b:::1::l:2:f:2\ncell:B14:b::2:::l:1:f:5\ncell:C14:b::::1:l:2:f:1:bg:2:colspan:4\ncell:D14:l:2:f:1\ncell:E14:l:2:f:1\ncell:F14:b::2:::l:2:f:1\ncell:G14:b::::2:l:2:f:2\ncell:H14:t:NUMBER :l:2:f:2:bg:2:cf:3\ncell:I14:b:::1::l:2:f:2:bg:2:ntvf:4\ncell:B15:b::2:::l:1:f:5\ncell:C15:b:::2:2:l:2:f:1:colspan:4\ncell:D15:b:::2::l:2:f:1\ncell:E15:b:::2::l:2:f:1\ncell:F15:b::2:2::l:2:f:1\ncell:G15:b::::2:l:2:f:2\ncell:H15:l:2:f:2\ncell:I15:l:2:f:2\ncell:C16:b:2::::l:2:f:1\ncell:D16:b:2::::l:2:f:1\ncell:E16:b:2::::l:2:f:1\ncell:F16:b:2::::l:2:f:1\ncell:G16:l:2:f:1\ncell:H16:l:2:f:1\ncell:I16:l:2:f:1\ncell:C17:t:Thank you for your inquiry dated\\c:l:2:f:2:colspan:3\ncell:D17:l:2:f:2\ncell:E17:l:2:f:2\ncell:F17:v:39199:l:2:f:2:cf:2:ntvf:5\ncell:G17:l:2:f:1\ncell:H17:l:2:f:1\ncell:I17:l:2:f:1\ncell:C18:t:We are pleased to quote you the following\\c:l:2:f:2:colspan:3\ncell:D18:l:2:f:2\ncell:E18:l:2:f:2\ncell:F18:l:2:f:2\ncell:G18:l:2:f:1\ncell:H18:l:2:f:1\ncell:I18:l:2:f:1\ncell:C19:l:2:f:1\ncell:D19:l:2:f:1\ncell:E19:l:2:f:1\ncell:F19:l:2:f:1\ncell:G19:l:2:f:1\ncell:H19:l:2:f:1\ncell:I19:l:2:f:1\ncell:B20:l:1:f:5\ncell:C20:t:ITEM:l:2:f:4:cf:1\ncell:D20:t:QUANTITY:l:2:f:4:cf:1\ncell:E20:t:DESCRIPTION:l:2:f:4:cf:1:colspan:3\ncell:F20:l:2:f:4:cf:1\ncell:G20:l:2:f:4:cf:1\ncell:H20:t:UNIT PRICE :l:2:f:4:cf:1\ncell:I20:t:DELIVERY DATE:l:2:f:4:cf:1\ncell:B21:b::2:::l:1:f:5\ncell:C21:v:1:b:2:1:1:1:l:2:f:2:cf:3:ntvf:3\ncell:D21:b:2:1:1:1:l:2:f:2:cf:3:ntvf:1\ncell:E21:b:2:1:1:1:l:2:f:2:cf:2:colspan:3\ncell:F21:b:2:1:1:1:l:2:f:2\ncell:G21:b:2:1:1:1:l:2:f:2\ncell:H21:b:2:1:1:1:l:2:f:2:cf:3:ntvf:2\ncell:I21:b:2:1:1:1:l:2:f:2:cf:2:ntvf:5\ncell:B22:b::2:::l:1:f:5\ncell:C22:v:2:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:3\ncell:D22:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:1\ncell:E22:b::1:1:1:l:2:f:2:bg:2:cf:2:colspan:3\ncell:F22:b::1:1:1:l:2:f:2:bg:2\ncell:G22:b::1:1:1:l:2:f:2:bg:2\ncell:H22:b::1:1:1:l:2:f:2:bg:2:cf:3\ncell:I22:b::1:1:1:l:2:f:2:bg:2:cf:2:ntvf:5\ncell:B23:b::2:::l:1:f:5\ncell:C23:v:3:b::1:1:1:l:2:f:2:cf:3:ntvf:3\ncell:D23:b::1:1:1:l:2:f:2:cf:3:ntvf:1\ncell:E23:b::1:1:1:l:2:f:2:cf:2:colspan:3\ncell:F23:b::1:1:1:l:2:f:2\ncell:G23:b::1:1:1:l:2:f:2\ncell:H23:b::1:1:1:l:2:f:2:cf:3\ncell:I23:b::1:1:1:l:2:f:2:cf:2:ntvf:5\ncell:B24:b::2:::l:1:f:5\ncell:C24:v:4:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:3\ncell:D24:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:1\ncell:E24:b::1:1:1:l:2:f:2:bg:2:cf:2:colspan:3\ncell:F24:b::1:1:1:l:2:f:2:bg:2\ncell:G24:b::1:1:1:l:2:f:2:bg:2\ncell:H24:b::1:1:1:l:2:f:2:bg:2:cf:3\ncell:I24:b::1:1:1:l:2:f:2:bg:2:cf:2:ntvf:5\ncell:B25:b::2:::l:1:f:5\ncell:C25:v:5:b::1:1:1:l:2:f:2:cf:3:ntvf:3\ncell:D25:b::1:1:1:l:2:f:2:cf:3:ntvf:1\ncell:E25:b::1:1:1:l:2:f:2:cf:2:colspan:3\ncell:F25:b::1:1:1:l:2:f:2\ncell:G25:b::1:1:1:l:2:f:2\ncell:H25:b::1:1:1:l:2:f:2:cf:3\ncell:I25:b::1:1:1:l:2:f:2:cf:2:ntvf:5\ncell:B26:b::2:::l:1:f:5\ncell:C26:v:6:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:3\ncell:D26:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:1\ncell:E26:b::1:1:1:l:2:f:2:bg:2:cf:2:colspan:3\ncell:F26:b::1:1:1:l:2:f:2:bg:2\ncell:G26:b::1:1:1:l:2:f:2:bg:2\ncell:H26:b::1:1:1:l:2:f:2:bg:2:cf:3\ncell:I26:b::1:1:1:l:2:f:2:bg:2:cf:2:ntvf:5\ncell:B27:b::2:::l:1:f:5\ncell:C27:v:7:b::1:1:1:l:2:f:2:cf:3:ntvf:3\ncell:D27:b::1:1:1:l:2:f:2:cf:3:ntvf:1\ncell:E27:b::1:1:1:l:2:f:2:cf:2:colspan:3\ncell:F27:b::1:1:1:l:2:f:2\ncell:G27:b::1:1:1:l:2:f:2\ncell:H27:b::1:1:1:l:2:f:2:cf:3\ncell:I27:b::1:1:1:l:2:f:2:cf:2:ntvf:5\ncell:B28:b::2:::l:1:f:5\ncell:C28:v:8:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:3\ncell:D28:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:1\ncell:E28:b::1:1:1:l:2:f:2:bg:2:cf:2:colspan:3\ncell:F28:b::1:1:1:l:2:f:2:bg:2\ncell:G28:b::1:1:1:l:2:f:2:bg:2\ncell:H28:b::1:1:1:l:2:f:2:bg:2:cf:3\ncell:I28:b::1:1:1:l:2:f:2:bg:2:cf:2:ntvf:5\ncell:B29:b::2:::l:1:f:5\ncell:C29:v:9:b::1:1:1:l:2:f:2:cf:3:ntvf:3\ncell:D29:b::1:1:1:l:2:f:2:cf:3:ntvf:1\ncell:E29:b::1:1:1:l:2:f:2:cf:2:colspan:3\ncell:F29:b::1:1:1:l:2:f:2\ncell:G29:b::1:1:1:l:2:f:2\ncell:H29:b::1:1:1:l:2:f:2:cf:3\ncell:I29:b::1:1:1:l:2:f:2:cf:2:ntvf:5\ncell:B30:b::2:::l:1:f:5\ncell:C30:v:10:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:3\ncell:D30:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:1\ncell:E30:b::1:1:1:l:2:f:2:bg:2:cf:2:colspan:3\ncell:F30:b::1:1:1:l:2:f:2:bg:2\ncell:G30:b::1:1:1:l:2:f:2:bg:2\ncell:H30:b::1:1:1:l:2:f:2:bg:2:cf:3\ncell:I30:b::1:1:1:l:2:f:2:bg:2:cf:2:ntvf:5\ncell:B31:b::2:::l:1:f:5\ncell:C31:v:11:b::1:1:1:l:2:f:2:cf:3:ntvf:3\ncell:D31:b::1:1:1:l:2:f:2:cf:3:ntvf:1\ncell:E31:b::1:1:1:l:2:f:2:cf:2:colspan:3\ncell:F31:b::1:1:1:l:2:f:2\ncell:G31:b::1:1:1:l:2:f:2\ncell:H31:b::1:1:1:l:2:f:2:cf:3\ncell:I31:b::1:1:1:l:2:f:2:cf:2:ntvf:5\ncell:B32:b::2:::l:1:f:5\ncell:C32:v:12:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:3\ncell:D32:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:1\ncell:E32:b::1:1:1:l:2:f:2:bg:2:cf:2:colspan:3\ncell:F32:b::1:1:1:l:2:f:2:bg:2\ncell:G32:b::1:1:1:l:2:f:2:bg:2\ncell:H32:b::1:1:1:l:2:f:2:bg:2:cf:3\ncell:I32:b::1:1:1:l:2:f:2:bg:2:cf:2:ntvf:5\ncell:B33:l:1:f:5\ncell:C33:l:2:f:2:cf:3:ntvf:3\ncell:D33:l:2:f:2:cf:3:ntvf:1\ncell:E33:l:2:f:2:cf:2:colspan:3\ncell:F33:l:2:f:2\ncell:G33:l:2:f:2\ncell:H33:l:2:f:2:cf:3\ncell:I33:l:2:f:2:cf:2:ntvf:5\ncell:C34:t:We will be happy to supply any further information you may need and trust that you call on us to fill your order, which will receive our prompt and careful attention.:l:2:f:2:colspan:7:rowspan:2\ncell:D34:l:2:f:2\ncell:E34:l:2:f:2\ncell:F34:l:2:f:2\ncell:G34:l:2:f:2\ncell:H34:l:2:f:2\ncell:I34:l:2:f:2\ncell:C35:l:2:f:2:colspan:7\ncell:D35:l:2:f:2\ncell:E35:l:2:f:2\ncell:F35:l:2:f:2\ncell:G35:l:2:f:2\ncell:H35:l:2:f:2\ncell:I35:l:2:f:2\ncell:C36:b:::2::l:2:f:2\ncell:D36:b:::2::l:2:f:2\ncell:E36:b:::2::l:2:f:2\ncell:F36:b:::2::l:2:f:2\ncell:G36:l:2:f:2\ncell:H36:l:2:f:2\ncell:I36:b:::2::l:2:f:2:cf:2:ntvf:5\ncell:C37:t:PER:b:2::::l:2:f:2:cf:1\ncell:D37:b:2::::l:2:f:2:cf:1\ncell:E37:b:2::::l:2:f:2:cf:1\ncell:F37:b:2::::l:2:f:2:cf:1\ncell:G37:l:2:f:2\ncell:H37:l:2:f:2\ncell:I37:t:DATE:b:2::::l:2:f:2:cf:1\ncell:C38:l:2:f:2\ncell:D38:l:2:f:2\ncell:E38:l:2:f:2\ncell:F38:l:2:f:2\ncell:G38:l:2:f:2\ncell:H38:l:2:f:2\ncell:I38:l:2:f:2\ncell:C39:l:1:f:5\ncol:A:w:12\ncol:B:w:10\ncol:C:w:226\ncol:D:w:116\ncol:E:w:80\ncol:F:w:131\ncol:G:w:156\ncol:H:w:137\ncol:I:w:193\nrow:4:h:33\nrow:5:h:33\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:15.75\nrow:37:h:14.25\nrow:39:h:14.25\nsheet:c:9:r:39:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* * arial,helvetica,sans-serif\nfont:2:* 12pt arial,helvetica,sans-serif\nfont:3:* 14pt arial,helvetica,sans-serif\nfont:4:* 16pt arial,helvetica,sans-serif\nfont:5:normal normal 10pt Arial\nfont:6:normal normal 12pt arial,helvetica,sans-serif\nfont:7:normal normal 24pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0.00 ;\"$\"(#,##0.00)\nvalueformat:3:0 \nvalueformat:4:0.00 ;(0.00)\nvalueformat:5:mmmm d, yyyy\nname:DATA_01::C6\nname:DATA_02::C11\nname:DATA_03::D11\\cD22\nname:DATA_04::G11\\cG22\n"},"name":"sheet6","hidden":"1"},"sheet10":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Your Company, Inc.:l:2:f:3:cf:2\ncell:C3:l:1:f:5\ncell:D3:l:1:f:5\ncell:E3:l:1:f:5\ncell:F3:l:1:f:5\ncell:G3:l:1:f:5\ncell:H3:t:SALES QUOTATION:l:2:f:7:cf:3\ncell:B4:t:Name:l:1:f:5\ncell:C4:l:1:f:5\ncell:D4:l:1:f:5\ncell:E4:l:1:f:5:cf:3\ncell:F4:l:1:f:5\ncell:G4:l:1:f:5\ncell:H4:l:1:f:5\ncell:B5:t:Address:l:1:f:5\ncell:C5:l:1:f:5\ncell:D5:l:1:f:5\ncell:E5:l:1:f:5:cf:3\ncell:F5:l:1:f:5\ncell:G5:l:1:f:5\ncell:H5:l:1:f:5\ncell:B6:l:1:f:5\ncell:C6:l:1:f:5\ncell:D6:l:1:f:5\ncell:E6:l:1:f:5:cf:3\ncell:F6:l:1:f:5\ncell:G6:l:1:f:5\ncell:H6:l:1:f:5\ncell:B7:b:::1::l:1:f:5\ncell:C7:b:::1::l:1:f:5\ncell:D7:b:::1::l:1:f:5\ncell:E7:b:::1::l:1:f:5\ncell:F7:l:1:f:5\ncell:G7:l:1:f:5\ncell:H7:l:1:f:5\ncell:A8:b::1:::l:1:f:5\ncell:B8:t:TO\\c:b:1:::1:l:1:f:2\ncell:C8:b:1::::l:1:f:5\ncell:D8:b:1::::l:1:f:5\ncell:E8:b:1:1:::l:1:f:5\ncell:F8:b::::1:l:1:f:5\ncell:G8:l:1:f:5\ncell:H8:l:1:f:5\ncell:A9:b::1:::l:1:f:5\ncell:B9:b::::1:l:1:f:5\ncell:C9:l:1:f:5\ncell:D9:l:1:f:5\ncell:E9:b::1:::l:1:f:5\ncell:F9:b::::1:l:1:f:5\ncell:G9:t:F.O.B. :b::1:::l:1:f:5:cf:3\ncell:H9:b::::1:l:1:f:5\ncell:A10:b::1:::l:1:f:5\ncell:B10:b::::1:l:1:f:5\ncell:C10:l:1:f:5\ncell:D10:l:1:f:5\ncell:E10:b::1:::l:1:f:5\ncell:F10:b::::1:l:1:f:5\ncell:G10:t:TERMS :b::1:::l:1:f:5:cf:3\ncell:H10:b::::1:l:1:f:5\ncell:A11:b::1:::l:1:f:5\ncell:B11:b::::1:l:1:f:5\ncell:C11:l:1:f:5\ncell:D11:l:1:f:5\ncell:E11:b::1:::l:1:f:5\ncell:F11:b::::1:l:1:f:5\ncell:G11:t:DELIVERY :b::1:::l:1:f:5:cf:3\ncell:H11:b::::1:l:1:f:5\ncell:A12:b::1:::l:1:f:5\ncell:B12:b::::1:l:1:f:5\ncell:C12:l:1:f:5\ncell:D12:l:1:f:5\ncell:E12:b::1:::l:1:f:5\ncell:F12:b::::1:l:1:f:5\ncell:G12:t:NUMBER :b::1:::l:1:f:5:cf:3\ncell:H12:b::::1:l:1:f:5:ntvf:4\ncell:A13:b::1:::l:1:f:5\ncell:B13:b:::1:1:l:1:f:5\ncell:C13:b:::1::l:1:f:5\ncell:D13:b:::1::l:1:f:5\ncell:E13:b::1:1::l:1:f:5\ncell:F13:b::::1:l:1:f:5\ncell:G13:l:1:f:5\ncell:H13:l:1:f:5\ncell:B14:b:1::::l:1:f:5\ncell:C14:b:1::::l:1:f:5\ncell:D14:b:1::::l:1:f:5\ncell:E14:b:1::::l:1:f:5\ncell:F14:l:1:f:5\ncell:G14:l:1:f:5\ncell:H14:l:1:f:5\ncell:B15:t:Thank you for your inquiry dated\\c:l:1:f:1\ncell:C15:l:1:f:5\ncell:D15:l:1:f:5\ncell:E15:v:39199:l:1:f:1:cf:2:ntvf:5\ncell:F15:l:1:f:5\ncell:G15:l:1:f:5\ncell:H15:l:1:f:5\ncell:B16:t:We are pleased to quote you the following\\c:l:1:f:1\ncell:C16:l:1:f:5\ncell:D16:l:1:f:5\ncell:E16:l:1:f:5\ncell:F16:l:1:f:5\ncell:G16:l:1:f:5\ncell:H16:l:1:f:5\ncell:B17:b:::1::l:1:f:5\ncell:C17:b:::1::l:1:f:5\ncell:D17:b:::1::l:1:f:5\ncell:E17:b:::1::l:1:f:5\ncell:F17:b:::1::l:1:f:5\ncell:G17:b:::1::l:1:f:5\ncell:H17:b:::1::l:1:f:5\ncell:A18:b::1:::l:1:f:5\ncell:B18:t:ITEM:b:1:1:1:1:l:2:f:4:cf:1\ncell:C18:t:QUANTITY:b:1:1:1:1:l:2:f:4:cf:1\ncell:D18:t:DESCRIPTION:b:1::1:1:l:2:f:4:cf:1\ncell:E18:b:1::1::l:1:f:8:cf:1\ncell:F18:b:1:1:1::l:1:f:8:cf:1\ncell:G18:t:UNIT PRICE :b:1:1:1:1:l:2:f:4:cf:1\ncell:H18:t:DELIVERY DATE:b:1:1:1:1:l:2:f:4:cf:1\ncell:A19:b::1:::l:1:f:5\ncell:B19:v:1:b:1:1::1:l:1:f:5:cf:1:ntvf:3\ncell:C19:b:1:1::1:l:1:f:5:cf:1:ntvf:1\ncell:D19:b:1:::1:l:1:f:5\ncell:E19:b:1::::l:1:f:5\ncell:F19:b:1:1:::l:1:f:5\ncell:G19:b:1:1::1:l:1:f:5:ntvf:2\ncell:H19:b:1:1::1:l:1:f:5:cf:1:ntvf:5\ncell:A20:b::1:::l:1:f:5\ncell:B20:v:2:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C20:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D20:b::::1:l:1:f:5\ncell:E20:l:1:f:5\ncell:F20:b::1:::l:1:f:5\ncell:G20:b::1::1:l:1:f:5\ncell:H20:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A21:b::1:::l:1:f:5\ncell:B21:v:3:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C21:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D21:b::::1:l:1:f:5\ncell:E21:l:1:f:5\ncell:F21:b::1:::l:1:f:5\ncell:G21:b::1::1:l:1:f:5\ncell:H21:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A22:b::1:::l:1:f:5\ncell:B22:v:4:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C22:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D22:b::::1:l:1:f:5\ncell:E22:l:1:f:5\ncell:F22:b::1:::l:1:f:5\ncell:G22:b::1::1:l:1:f:5\ncell:H22:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A23:b::1:::l:1:f:5\ncell:B23:v:5:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C23:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D23:b::::1:l:1:f:5\ncell:E23:l:1:f:5\ncell:F23:b::1:::l:1:f:5\ncell:G23:b::1::1:l:1:f:5\ncell:H23:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A24:b::1:::l:1:f:5\ncell:B24:v:6:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C24:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D24:b::::1:l:1:f:5\ncell:E24:l:1:f:5\ncell:F24:b::1:::l:1:f:5\ncell:G24:b::1::1:l:1:f:5\ncell:H24:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A25:b::1:::l:1:f:5\ncell:B25:v:7:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C25:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D25:b::::1:l:1:f:5\ncell:E25:l:1:f:5\ncell:F25:b::1:::l:1:f:5\ncell:G25:b::1::1:l:1:f:5\ncell:H25:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A26:b::1:::l:1:f:5\ncell:B26:v:8:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C26:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D26:b::::1:l:1:f:5\ncell:E26:l:1:f:5\ncell:F26:b::1:::l:1:f:5\ncell:G26:b::1::1:l:1:f:5\ncell:H26:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A27:b::1:::l:1:f:5\ncell:B27:v:9:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C27:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D27:b::::1:l:1:f:5\ncell:E27:l:1:f:5\ncell:F27:b::1:::l:1:f:5\ncell:G27:b::1::1:l:1:f:5\ncell:H27:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A28:b::1:::l:1:f:5\ncell:B28:v:10:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C28:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D28:b::::1:l:1:f:5\ncell:E28:l:1:f:5\ncell:F28:b::1:::l:1:f:5\ncell:G28:b::1::1:l:1:f:5\ncell:H28:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A29:b::1:::l:1:f:5\ncell:B29:v:11:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C29:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D29:b::::1:l:1:f:5\ncell:E29:l:1:f:5\ncell:F29:b::1:::l:1:f:5\ncell:G29:b::1::1:l:1:f:5\ncell:H29:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A30:b::1:::l:1:f:5\ncell:B30:v:12:b::1:1:1:l:1:f:5:cf:1:ntvf:3\ncell:C30:b::1:1:1:l:1:f:5:cf:1:ntvf:1\ncell:D30:b:::1:1:l:1:f:5\ncell:E30:b:::1::l:1:f:5\ncell:F30:b::1:1::l:1:f:5\ncell:G30:b::1:1:1:l:1:f:5\ncell:H30:b::1:1:1:l:1:f:5:cf:1:ntvf:5\ncell:B31:t:We will be happy to supply any further information you may need and trust that you :b:1::::l:1:f:1\ncell:C31:b:1::::l:1:f:5\ncell:D31:b:1::::l:1:f:5\ncell:E31:b:1::::l:1:f:5\ncell:F31:b:1::::l:1:f:5\ncell:G31:b:1::::l:1:f:5\ncell:H31:b:1::::l:1:f:5\ncell:B32:t:call on us to fill your order, which will receive our prompt and careful attention.:l:1:f:1\ncell:C32:l:1:f:5\ncell:D32:l:1:f:5\ncell:E32:l:1:f:5\ncell:F32:l:1:f:5\ncell:G32:l:1:f:5\ncell:H32:l:1:f:5\ncell:B33:b:::1::l:1:f:6\ncell:C33:b:::1::l:1:f:5\ncell:D33:b:::1::l:1:f:5\ncell:E33:b:::1::l:1:f:5\ncell:F33:l:1:f:5\ncell:G33:l:1:f:5\ncell:H33:b:::1::l:1:f:6:cf:1:ntvf:5\ncell:B34:t:PER:b:1::::l:1:f:8:cf:1\ncell:C34:b:1::::l:1:f:5:cf:1\ncell:D34:b:1::::l:1:f:5:cf:1\ncell:E34:b:1::::l:1:f:5:cf:1\ncell:F34:l:1:f:5\ncell:G34:l:1:f:5\ncell:H34:t:DATE:b:1::::l:1:f:8:cf:1\ncell:B36:l:1:f:5\ncol:A:w:12\ncol:B:w:292\ncol:C:w:100\ncol:D:w:80\ncol:E:w:131\ncol:F:w:156\ncol:G:w:90\ncol:H:w:374\nrow:3:h:33\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:15.75\nrow:34:h:14.25\nrow:36:h:14.25\nsheet:c:8:r:36:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\nfont:1:italic normal 10pt Arial\nfont:2:normal bold 10pt Arial\nfont:3:normal bold 18pt Arial\nfont:4:normal bold 8pt Arial\nfont:5:normal normal 10pt Arial\nfont:6:normal normal 12pt Arial\nfont:7:normal normal 26pt Times New Roman\nfont:8:normal normal 8pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0.00 ;\"$\"(#,##0.00)\nvalueformat:3:0 \nvalueformat:4:0.00 ;(0.00)\nvalueformat:5:mmmm d, yyyy\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet601","hidden":"1"},"sheet11":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Promotion Expenditures by Quarter:l:2:f:5:c:3:bg:1:cf:1:colspan:6\ncell:D3:l:2:f:1:cf:1\ncell:E3:l:2:f:1:cf:1\ncell:F3:l:2:f:1:cf:1\ncell:G3:l:2:f:1:cf:1\ncell:H3:l:2:f:1:cf:1\ncell:C4:t:For the Year 2009:l:1:f:3:cf:1\ncell:D4:l:1:f:1:cf:1\ncell:E4:l:1:f:1:cf:1\ncell:F4:l:1:f:1:cf:1\ncell:G4:l:1:f:1:cf:1\ncell:H4:l:1:f:1:cf:1\ncell:D5:l:1:f:1:cf:1\ncell:E5:l:1:f:1:cf:1\ncell:F5:l:1:f:1:cf:1\ncell:G5:l:1:f:1:cf:1\ncell:H5:l:1:f:1:cf:1\ncell:C6:l:1:f:1\ncell:D6:l:1:f:1\ncell:E6:l:1:f:1\ncell:F6:l:1:f:1\ncell:G6:l:1:f:1\ncell:H6:l:1:f:1\ncell:C7:l:1:f:1:cf:2\ncell:D7:t:Q1:l:1:f:4:cf:1\ncell:E7:t:Q2:l:1:f:4:cf:1\ncell:F7:t:Q3:l:1:f:4:cf:1\ncell:G7:t:Q4:l:1:f:4:cf:1\ncell:H7:t:Total:l:1:f:4:cf:1\ncell:C8:t:Trade Promotions to Distributors:l:1:f:4:cf:2\ncell:D8:l:1:f:1\ncell:E8:l:1:f:1\ncell:F8:l:1:f:1\ncell:G8:l:1:f:1\ncell:H8:l:1:f:1\ncell:C9:t:Promotion:l:1:f:2:cf:2\ncell:D9:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:E9:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:F9:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:G9:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:H9:vtf:n:4:IF(SUM(D9\\cG9),SUM(D9\\cG9),\"\"):l:1:f:3:ntvf:2\ncell:C10:t:Promotion:l:1:f:2:bg:2:cf:2\ncell:D10:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E10:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F10:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G10:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H10:vtf:n:4:IF(SUM(D10\\cG10),SUM(D10\\cG10),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C11:t:Promotion:l:1:f:2:cf:2\ncell:D11:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:E11:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:F11:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:G11:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:H11:vtf:n:4:IF(SUM(D11\\cG11),SUM(D11\\cG11),\"\"):l:1:f:3:ntvf:1\ncell:C12:t:Promotion:l:1:f:2:bg:2:cf:2\ncell:D12:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E12:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F12:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G12:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H12:vtf:n:4:IF(SUM(D12\\cG12),SUM(D12\\cG12),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C13:t:Totals:l:1:f:3:cf:2\ncell:D13:vtf:n:4:IF(SUM(D9\\cD12),SUM(D9\\cD12),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:E13:vtf:n:4:IF(SUM(E9\\cE12),SUM(E9\\cE12),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:F13:vtf:n:4:IF(SUM(F9\\cF12),SUM(F9\\cF12),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:G13:vtf:n:4:IF(SUM(G9\\cG12),SUM(G9\\cG12),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:H13:vtf:n:16:IF(SUM(H9\\cH12),SUM(H9\\cH12),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:C14:l:1:f:1:cf:2\ncell:D14:l:1:f:1:ntvf:2\ncell:E14:l:1:f:1:ntvf:2\ncell:F14:l:1:f:1:ntvf:2\ncell:G14:l:1:f:1:ntvf:2\ncell:H14:l:1:f:3:ntvf:2\ncell:C15:t:Trade Shows:l:1:f:4:cf:2\ncell:D15:l:1:f:1:ntvf:2\ncell:E15:l:1:f:1:ntvf:2\ncell:F15:l:1:f:1:ntvf:2\ncell:G15:l:1:f:1:ntvf:2\ncell:H15:l:1:f:3:ntvf:2\ncell:C16:t:Promotion:l:1:f:2:cf:2\ncell:D16:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:E16:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:F16:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:G16:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:H16:vtf:n:4:IF(SUM(D16\\cG16),SUM(D16\\cG16),\"\"):l:1:f:3:ntvf:2\ncell:C17:t:Promotion:l:1:f:2:bg:2:cf:2\ncell:D17:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E17:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F17:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G17:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H17:vtf:n:4:IF(SUM(D17\\cG17),SUM(D17\\cG17),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C18:t:Promotion:l:1:f:2:cf:2\ncell:D18:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:E18:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:F18:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:G18:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:H18:vtf:n:4:IF(SUM(D18\\cG18),SUM(D18\\cG18),\"\"):l:1:f:3:ntvf:1\ncell:C19:t:Promotion:l:1:f:2:bg:2:cf:2\ncell:D19:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E19:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F19:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G19:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H19:vtf:n:4:IF(SUM(D19\\cG19),SUM(D19\\cG19),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C20:t:Totals:l:1:f:3:cf:2\ncell:D20:vtf:n:4:IF(SUM(D16\\cD19),SUM(D16\\cD19),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:E20:vtf:n:4:IF(SUM(E16\\cE19),SUM(E16\\cE19),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:F20:vtf:n:4:IF(SUM(F16\\cF19),SUM(F16\\cF19),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:G20:vtf:n:4:IF(SUM(G16\\cG19),SUM(G16\\cG19),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:H20:vtf:n:16:IF(SUM(H16\\cH19),SUM(H16\\cH19),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:C21:l:1:f:1:cf:2\ncell:D21:l:1:f:1:ntvf:2\ncell:E21:l:1:f:1:ntvf:2\ncell:F21:l:1:f:1:ntvf:2\ncell:G21:l:1:f:1:ntvf:2\ncell:H21:l:1:f:3:ntvf:2\ncell:C22:t:Sales Force Promotion:l:1:f:4:cf:2\ncell:D22:l:1:f:1:ntvf:2\ncell:E22:l:1:f:1:ntvf:2\ncell:F22:l:1:f:1:ntvf:2\ncell:G22:l:1:f:1:ntvf:2\ncell:H22:l:1:f:3:ntvf:2\ncell:C23:t:Promotion:l:1:f:2:cf:2\ncell:D23:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:E23:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:F23:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:G23:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:H23:vtf:n:4:IF(SUM(D23\\cG23),SUM(D23\\cG23),\"\"):l:1:f:3:ntvf:2\ncell:C24:t:Promotion:l:1:f:2:bg:2:cf:2\ncell:D24:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E24:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F24:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G24:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H24:vtf:n:4:IF(SUM(D24\\cG24),SUM(D24\\cG24),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C25:t:Promotion:l:1:f:2:cf:2\ncell:D25:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:E25:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:F25:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:G25:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:H25:vtf:n:4:IF(SUM(D25\\cG25),SUM(D25\\cG25),\"\"):l:1:f:3:ntvf:1\ncell:C26:t:Promotion:l:1:f:2:bg:2:cf:2\ncell:D26:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E26:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F26:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G26:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H26:vtf:n:4:IF(SUM(D26\\cG26),SUM(D26\\cG26),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C27:t:Totals:l:1:f:3:cf:2\ncell:D27:vtf:n:4:IF(SUM(D23\\cD26),SUM(D23\\cD26),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:E27:vtf:n:4:IF(SUM(E23\\cE26),SUM(E23\\cE26),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:F27:vtf:n:4:IF(SUM(F23\\cF26),SUM(F23\\cF26),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:G27:vtf:n:4:IF(SUM(G23\\cG26),SUM(G23\\cG26),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:H27:vtf:n:16:IF(SUM(H23\\cH26),SUM(H23\\cH26),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:C28:l:1:f:1:cf:2\ncell:D28:l:1:f:1:ntvf:2\ncell:E28:l:1:f:1:ntvf:2\ncell:F28:l:1:f:1:ntvf:2\ncell:G28:l:1:f:1:ntvf:2\ncell:H28:l:1:f:3:ntvf:2\ncell:C29:t:Other Promotions:l:1:f:4:cf:2\ncell:D29:l:1:f:1:ntvf:2\ncell:E29:l:1:f:1:ntvf:2\ncell:F29:l:1:f:1:ntvf:2\ncell:G29:l:1:f:1:ntvf:2\ncell:H29:l:1:f:3:ntvf:2\ncell:C30:t:Promotion:l:1:f:2:cf:2\ncell:D30:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:E30:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:F30:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:G30:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:H30:vtf:n:4:IF(SUM(D30\\cG30),SUM(D30\\cG30),\"\"):l:1:f:3:ntvf:2\ncell:C31:l:1:f:2:bg:2:cf:2\ncell:D31:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E31:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F31:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G31:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H31:vtf:n:4:IF(SUM(D31\\cG31),SUM(D31\\cG31),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C32:l:1:f:2:cf:2\ncell:D32:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:E32:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:F32:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:G32:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:H32:vtf:n:4:IF(SUM(D32\\cG32),SUM(D32\\cG32),\"\"):l:1:f:3:ntvf:1\ncell:C33:l:1:f:2:bg:2:cf:2\ncell:D33:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E33:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F33:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G33:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H33:vtf:n:4:IF(SUM(D33\\cG33),SUM(D33\\cG33),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C34:t:Totals:l:1:f:3:cf:2\ncell:D34:vtf:n:4:IF(SUM(D30\\cD33),SUM(D30\\cD33),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:E34:vtf:n:4:IF(SUM(E30\\cE33),SUM(E30\\cE33),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:F34:vtf:n:4:IF(SUM(F30\\cF33),SUM(F30\\cF33),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:G34:vtf:n:4:IF(SUM(G30\\cG33),SUM(G30\\cG33),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:H34:vtf:n:16:IF(SUM(H30\\cH33),SUM(H30\\cH33),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:C35:l:1:f:1:cf:2\ncell:D35:l:1:f:1:ntvf:2\ncell:E35:l:1:f:1:ntvf:2\ncell:F35:l:1:f:1:ntvf:2\ncell:G35:l:1:f:1:ntvf:2\ncell:H35:l:1:f:3:ntvf:2\ncell:C36:t:Total Promotion Budget:l:1:f:3:cf:2\ncell:D36:vtf:n:16:IF(SUM(D13,D20,D27,D34),SUM(D13,D20,D27,D34),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:E36:vtf:n:16:IF(SUM(E13,E20,E27,E34),SUM(E13,E20,E27,E34),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:F36:vtf:n:16:IF(SUM(F13,F20,F27,F34),SUM(F13,F20,F27,F34),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:G36:vtf:n:16:IF(SUM(G13,G20,G27,G34),SUM(G13,G20,G27,G34),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:H36:vtf:n:64:IF(SUM(H13,H20,H27,H34),SUM(H13,H20,H27,H34),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:C37:cf:2\ncell:D37:l:1:f:1\ncell:E37:l:1:f:1\ncell:F37:l:1:f:1\ncell:G37:l:1:f:1\ncell:H37:l:1:f:1\ncell:C38:l:1:f:1:cf:2\ncell:C39:cf:2\ncell:C40:cf:2\ncol:A:w:10\ncol:B:w:10\ncol:C:w:315\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\ncol:H:w:118\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:15.75\nrow:22:h:15.75\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nsheet:c:8:r:40:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal normal 10pt Arial\nfont:2:normal normal 12pt Arial\nfont:3:normal normal 14pt Arial\nfont:4:normal normal 16pt Arial\nfont:5:normal normal 26pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nname:DATA_01::C4\nname:DATA_02::C9\nname:DATA_03::#REF!\\c#REF!\nname:DATA_04::F9\\cF22\n"},"name":"sheet7","hidden":"1"},"sheet12":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Sales Promotion Expenditures by Quarter:l:2:f:4:cf:2\ncell:C3:l:2:f:5:cf:1\ncell:D3:l:2:f:5:cf:1\ncell:E3:l:2:f:5:cf:1\ncell:F3:l:2:f:5:cf:1\ncell:G3:l:2:f:5:cf:1\ncell:H3:l:2:f:5:cf:1\ncell:B4:t:For the Year 2009:l:1:f:3:cf:1\ncell:C4:l:1:f:5:cf:1\ncell:D4:l:1:f:5:cf:1\ncell:E4:l:1:f:5:cf:1\ncell:F4:l:1:f:5:cf:1\ncell:G4:l:1:f:5:cf:1\ncell:H4:l:1:f:5:cf:1\ncell:C5:l:1:f:5:cf:1\ncell:D5:l:1:f:5:cf:1\ncell:E5:l:1:f:5:cf:1\ncell:F5:l:1:f:5:cf:1\ncell:G5:l:1:f:5:cf:1\ncell:H5:l:1:f:5:cf:1\ncell:B6:l:1:f:5\ncell:C6:l:1:f:5\ncell:D6:l:1:f:5\ncell:E6:l:1:f:5\ncell:F6:l:1:f:5\ncell:G6:l:1:f:5\ncell:H6:l:1:f:5\ncell:B7:l:1:f:5\ncell:C7:l:1:f:5\ncell:D7:t:Q1:b:::1::l:1:f:2:cf:1\ncell:E7:vtf:e:Unknown function FIXED. :LEFT(D7,(LEN(D7)-1))&FIXED(CHOOSE(VALUE(RIGHT(D7,1)),2,3,4,1),0,TRUE):e:Unknown function FIXED. :b:::1::l:1:f:2:cf:1\ncell:F7:vtf:e:0:LEFT(E7,(LEN(E7)-1))&FIXED(CHOOSE(VALUE(RIGHT(E7,1)),2,3,4,1),0,TRUE):e:Unknown function FIXED. :b:::1::l:1:f:2:cf:1\ncell:G7:vtf:e:0:LEFT(F7,(LEN(F7)-1))&FIXED(CHOOSE(VALUE(RIGHT(F7,1)),2,3,4,1),0,TRUE):e:Unknown function FIXED. :b:::1::l:1:f:2:cf:1\ncell:H7:t:Total:b:::1::l:1:f:2:cf:1\ncell:B8:t:Trade Promotions to Distributors:l:1:f:2\ncell:C8:l:1:f:5\ncell:D8:b:1::::l:1:f:5\ncell:E8:b:1::::l:1:f:5\ncell:F8:b:1::::l:1:f:5\ncell:G8:b:1::::l:1:f:5\ncell:H8:b:1::::l:1:f:5\ncell:B9:l:1:f:5\ncell:C9:t:Promotion:l:1:f:5\ncell:D9:v:3000:l:1:f:5:ntvf:2\ncell:E9:v:3000:l:1:f:5:ntvf:2\ncell:F9:v:3000:l:1:f:5:ntvf:2\ncell:G9:v:3000:l:1:f:5:ntvf:2\ncell:H9:vtf:n:12000:IF(SUM(D9\\cG9),SUM(D9\\cG9),\"\"):l:1:f:5:ntvf:2\ncell:B10:l:1:f:5\ncell:C10:t:Promotion:l:1:f:5\ncell:D10:v:2000:l:1:f:5:ntvf:1\ncell:E10:v:2000:l:1:f:5:ntvf:1\ncell:F10:v:2000:l:1:f:5:ntvf:1\ncell:G10:v:2000:l:1:f:5:ntvf:1\ncell:H10:vtf:n:8000:IF(SUM(D10\\cG10),SUM(D10\\cG10),\"\"):l:1:f:5:ntvf:1\ncell:B11:l:1:f:5\ncell:C11:t:Promotion:l:1:f:5\ncell:D11:v:2500:l:1:f:5:ntvf:1\ncell:E11:v:2500:l:1:f:5:ntvf:1\ncell:F11:v:2500:l:1:f:5:ntvf:1\ncell:G11:v:2500:l:1:f:5:ntvf:1\ncell:H11:vtf:n:10000:IF(SUM(D11\\cG11),SUM(D11\\cG11),\"\"):l:1:f:5:ntvf:1\ncell:B12:l:1:f:5\ncell:C12:t:Promotion:l:1:f:5\ncell:D12:v:1000:b:::1::l:1:f:5:ntvf:1\ncell:E12:v:1000:b:::1::l:1:f:5:ntvf:1\ncell:F12:v:1000:b:::1::l:1:f:5:ntvf:1\ncell:G12:v:1000:b:::1::l:1:f:5:ntvf:1\ncell:H12:vtf:n:4000:IF(SUM(D12\\cG12),SUM(D12\\cG12),\"\"):b:::1::l:1:f:5:ntvf:1\ncell:B13:l:1:f:5\ncell:C13:t:Totals:l:1:f:5\ncell:D13:vtf:n:8500:IF(SUM(D9\\cD12),SUM(D9\\cD12),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:E13:vtf:n:8500:IF(SUM(E9\\cE12),SUM(E9\\cE12),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:F13:vtf:n:8500:IF(SUM(F9\\cF12),SUM(F9\\cF12),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:G13:vtf:n:8500:IF(SUM(G9\\cG12),SUM(G9\\cG12),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:H13:vtf:n:34000:IF(SUM(H9\\cH12),SUM(H9\\cH12),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:B14:t:Trade Shows:l:1:f:2\ncell:C14:l:1:f:5\ncell:D14:l:1:f:5:ntvf:2\ncell:E14:l:1:f:5:ntvf:2\ncell:F14:l:1:f:5:ntvf:2\ncell:G14:l:1:f:5:ntvf:2\ncell:H14:l:1:f:5:ntvf:2\ncell:B15:l:1:f:5\ncell:C15:t:Promotion:l:1:f:5\ncell:D15:v:1000:l:1:f:5:ntvf:2\ncell:E15:v:1000:l:1:f:5:ntvf:2\ncell:F15:v:1000:l:1:f:5:ntvf:2\ncell:G15:v:1000:l:1:f:5:ntvf:2\ncell:H15:vtf:n:4000:IF(SUM(D15\\cG15),SUM(D15\\cG15),\"\"):l:1:f:5:ntvf:2\ncell:B16:l:1:f:5\ncell:C16:t:Promotion:l:1:f:5\ncell:D16:v:2000:l:1:f:5:ntvf:1\ncell:E16:v:2000:l:1:f:5:ntvf:1\ncell:F16:v:2000:l:1:f:5:ntvf:1\ncell:G16:v:2000:l:1:f:5:ntvf:1\ncell:H16:vtf:n:8000:IF(SUM(D16\\cG16),SUM(D16\\cG16),\"\"):l:1:f:5:ntvf:1\ncell:B17:l:1:f:5\ncell:C17:t:Promotion:l:1:f:5\ncell:D17:v:2000:l:1:f:5:ntvf:1\ncell:E17:v:2000:l:1:f:5:ntvf:1\ncell:F17:v:2000:l:1:f:5:ntvf:1\ncell:G17:v:2000:l:1:f:5:ntvf:1\ncell:H17:vtf:n:8000:IF(SUM(D17\\cG17),SUM(D17\\cG17),\"\"):l:1:f:5:ntvf:1\ncell:B18:l:1:f:5\ncell:C18:t:Promotion:l:1:f:5\ncell:D18:v:3000:b:::1::l:1:f:5:ntvf:1\ncell:E18:v:3000:b:::1::l:1:f:5:ntvf:1\ncell:F18:v:3000:b:::1::l:1:f:5:ntvf:1\ncell:G18:v:3000:b:::1::l:1:f:5:ntvf:1\ncell:H18:vtf:n:12000:IF(SUM(D18\\cG18),SUM(D18\\cG18),\"\"):b:::1::l:1:f:5:ntvf:1\ncell:B19:l:1:f:5\ncell:C19:t:Totals:l:1:f:5\ncell:D19:vtf:n:8000:IF(SUM(D15\\cD18),SUM(D15\\cD18),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:E19:vtf:n:8000:IF(SUM(E15\\cE18),SUM(E15\\cE18),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:F19:vtf:n:8000:IF(SUM(F15\\cF18),SUM(F15\\cF18),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:G19:vtf:n:8000:IF(SUM(G15\\cG18),SUM(G15\\cG18),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:H19:vtf:n:32000:IF(SUM(H15\\cH18),SUM(H15\\cH18),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:B20:t:Sales Force Promotion:l:1:f:2\ncell:C20:l:1:f:5\ncell:D20:l:1:f:5:ntvf:2\ncell:E20:l:1:f:5:ntvf:2\ncell:F20:l:1:f:5:ntvf:2\ncell:G20:l:1:f:5:ntvf:2\ncell:H20:l:1:f:5:ntvf:2\ncell:B21:l:1:f:5\ncell:C21:t:Promotion:l:1:f:5\ncell:D21:v:100:l:1:f:5:ntvf:2\ncell:E21:v:100:l:1:f:5:ntvf:2\ncell:F21:v:100:l:1:f:5:ntvf:2\ncell:G21:v:100:l:1:f:5:ntvf:2\ncell:H21:vtf:n:400:IF(SUM(D21\\cG21),SUM(D21\\cG21),\"\"):l:1:f:5:ntvf:2\ncell:B22:l:1:f:5\ncell:C22:t:Promotion:l:1:f:5\ncell:D22:v:500:l:1:f:5:ntvf:1\ncell:E22:v:500:l:1:f:5:ntvf:1\ncell:F22:v:500:l:1:f:5:ntvf:1\ncell:G22:v:500:l:1:f:5:ntvf:1\ncell:H22:vtf:n:2000:IF(SUM(D22\\cG22),SUM(D22\\cG22),\"\"):l:1:f:5:ntvf:1\ncell:B23:l:1:f:5\ncell:C23:t:Promotion:l:1:f:5\ncell:D23:v:20000:l:1:f:5:ntvf:1\ncell:E23:v:20000:l:1:f:5:ntvf:1\ncell:F23:v:20000:l:1:f:5:ntvf:1\ncell:G23:v:20000:l:1:f:5:ntvf:1\ncell:H23:vtf:n:80000:IF(SUM(D23\\cG23),SUM(D23\\cG23),\"\"):l:1:f:5:ntvf:1\ncell:B24:l:1:f:5\ncell:C24:t:Promotion:l:1:f:5\ncell:D24:v:100000:b:::1::l:1:f:5:ntvf:1\ncell:E24:v:100000:b:::1::l:1:f:5:ntvf:1\ncell:F24:v:100000:b:::1::l:1:f:5:ntvf:1\ncell:G24:v:100000:b:::1::l:1:f:5:ntvf:1\ncell:H24:vtf:n:400000:IF(SUM(D24\\cG24),SUM(D24\\cG24),\"\"):b:::1::l:1:f:5:ntvf:1\ncell:B25:l:1:f:5\ncell:C25:t:Totals:l:1:f:5\ncell:D25:vtf:n:120600:IF(SUM(D21\\cD24),SUM(D21\\cD24),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:E25:vtf:n:120600:IF(SUM(E21\\cE24),SUM(E21\\cE24),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:F25:vtf:n:120600:IF(SUM(F21\\cF24),SUM(F21\\cF24),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:G25:vtf:n:120600:IF(SUM(G21\\cG24),SUM(G21\\cG24),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:H25:vtf:n:482400:IF(SUM(H21\\cH24),SUM(H21\\cH24),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:B26:t:Other Promotions:l:1:f:2\ncell:C26:l:1:f:5\ncell:D26:l:1:f:5:ntvf:2\ncell:E26:l:1:f:5:ntvf:2\ncell:F26:l:1:f:5:ntvf:2\ncell:G26:l:1:f:5:ntvf:2\ncell:H26:l:1:f:5:ntvf:2\ncell:B27:l:1:f:5\ncell:C27:t:Promotion:l:1:f:5\ncell:D27:v:2500:l:1:f:5:ntvf:2\ncell:E27:v:2500:l:1:f:5:ntvf:2\ncell:F27:v:2500:l:1:f:5:ntvf:2\ncell:G27:v:2500:l:1:f:5:ntvf:2\ncell:H27:vtf:n:10000:IF(SUM(D27\\cG27),SUM(D27\\cG27),\"\"):l:1:f:5:ntvf:2\ncell:B28:l:1:f:5\ncell:C28:l:1:f:5\ncell:D28:l:1:f:5:ntvf:1\ncell:E28:l:1:f:5:ntvf:1\ncell:F28:l:1:f:5:ntvf:1\ncell:G28:l:1:f:5:ntvf:1\ncell:H28:vtf:t::IF(SUM(D28\\cG28),SUM(D28\\cG28),\"\"):l:1:f:5:ntvf:1\ncell:B29:l:1:f:5\ncell:C29:l:1:f:5\ncell:D29:l:1:f:5:ntvf:1\ncell:E29:l:1:f:5:ntvf:1\ncell:F29:l:1:f:5:ntvf:1\ncell:G29:l:1:f:5:ntvf:1\ncell:H29:vtf:t::IF(SUM(D29\\cG29),SUM(D29\\cG29),\"\"):l:1:f:5:ntvf:1\ncell:B30:l:1:f:5\ncell:C30:b:::1::l:1:f:5\ncell:D30:b:::1::l:1:f:5:ntvf:1\ncell:E30:b:::1::l:1:f:5:ntvf:1\ncell:F30:b:::1::l:1:f:5:ntvf:1\ncell:G30:b:::1::l:1:f:5:ntvf:1\ncell:H30:vtf:t::IF(SUM(D30\\cG30),SUM(D30\\cG30),\"\"):b:::1::l:1:f:5:ntvf:1\ncell:B31:l:1:f:5\ncell:C31:t:Totals:b:1::::l:1:f:5\ncell:D31:vtf:n:2500:IF(SUM(D27\\cD30),SUM(D27\\cD30),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:E31:vtf:n:2500:IF(SUM(E27\\cE30),SUM(E27\\cE30),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:F31:vtf:n:2500:IF(SUM(F27\\cF30),SUM(F27\\cF30),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:G31:vtf:n:2500:IF(SUM(G27\\cG30),SUM(G27\\cG30),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:H31:vtf:n:10000:IF(SUM(H27\\cH30),SUM(H27\\cH30),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:B32:t:Total Promotion Budget:l:1:f:1\ncell:C32:l:1:f:1\ncell:D32:vtf:n:139600:IF(SUM(D13,D19,D25,D31),SUM(D13,D19,D25,D31),\"\"):b:::1::l:1:f:1:ntvf:2\ncell:E32:vtf:n:139600:IF(SUM(E13,E19,E25,E31),SUM(E13,E19,E25,E31),\"\"):b:::1::l:1:f:1:ntvf:2\ncell:F32:vtf:n:139600:IF(SUM(F13,F19,F25,F31),SUM(F13,F19,F25,F31),\"\"):b:::1::l:1:f:1:ntvf:2\ncell:G32:vtf:n:139600:IF(SUM(G13,G19,G25,G31),SUM(G13,G19,G25,G31),\"\"):b:::1::l:1:f:1:ntvf:2\ncell:H32:vtf:n:558400:IF(SUM(H13,H19,H25,H31),SUM(H13,H19,H25,H31),\"\"):b:::1::l:1:f:1:ntvf:2\ncell:D33:b:1::::l:1:f:5\ncell:E33:b:1::::l:1:f:5\ncell:F33:b:1::::l:1:f:5\ncell:G33:b:1::::l:1:f:5\ncell:H33:b:1::::l:1:f:5\ncell:B34:l:1:f:5\ncol:B:w:729\ncol:C:w:325\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\ncol:H:w:118\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:15.75\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:15.75\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:15.75\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nsheet:c:8:r:34:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:normal bold 10pt Arial\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 14pt Arial\nfont:4:normal bold 26pt Arial\nfont:5:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet701","hidden":"1"},"sheet13":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Sales Activity Report:l:2:f:3:cf:2\ncell:C3:l:2:f:5:cf:1\ncell:D3:l:2:f:5:cf:1\ncell:E3:l:2:f:5:cf:1\ncell:F3:l:2:f:5:cf:1\ncell:G3:l:2:f:5:cf:1\ncell:B4:t:For December 2009:l:1:f:2:cf:1\ncell:C4:l:1:f:5:cf:1\ncell:D4:l:1:f:5:cf:1\ncell:E4:l:1:f:5:cf:1\ncell:F4:l:1:f:5:cf:1\ncell:G4:l:1:f:5:cf:1\ncell:B5:l:1:f:5\ncell:C5:l:1:f:5\ncell:D5:l:1:f:5\ncell:E5:l:1:f:5\ncell:F5:l:1:f:5\ncell:G5:l:1:f:5\ncell:C6:l:1:f:5\ncell:D6:l:1:f:5\ncell:E6:l:1:f:5\ncell:F6:l:1:f:5\ncell:G6:l:1:f:5\ncell:B7:t:Salesperson:l:1:f:5:cf:2\ncell:C7:l:1:f:5\ncell:D7:b:::1::l:1:f:5:cf:2\ncell:E7:b:::1::l:1:f:5\ncell:F7:l:1:f:5\ncell:G7:l:1:f:5\ncell:B8:t:Territory :l:1:f:5:cf:2\ncell:C8:l:1:f:5\ncell:D8:b:1::1::l:1:f:5:cf:2\ncell:E8:b:1::1::l:1:f:5\ncell:F8:t:Date :l:1:f:5:cf:3\ncell:G8:b:::1::l:1:f:5:cf:1:ntvf:6\ncell:B9:l:1:f:5\ncell:C9:l:1:f:5\ncell:D9:b:1::::l:1:f:5\ncell:E9:b:1::::l:1:f:5\ncell:F9:l:1:f:5\ncell:G9:b:1::::l:1:f:5\ncell:B10:b:::1::l:1:f:5\ncell:C10:b:::1::l:1:f:5\ncell:D10:b:::1::l:1:f:5\ncell:E10:b:::1::l:1:f:5\ncell:F10:b:::1::l:1:f:5\ncell:G10:b:::1::l:1:f:5\ncell:A11:b::1:::l:1:f:4\ncell:B11:b:1::1:1:l:1:f:5\ncell:C11:b:1::1::l:1:f:5\ncell:D11:b:1::1::l:1:f:5\ncell:E11:b:1:1:1::l:1:f:5\ncell:F11:t:FORECAST :b:1:1:1:1:l:1:f:1:cf:3\ncell:G11:t:ACTUAL :b:1:1:1:1:l:1:f:1:cf:3\ncell:A12:b::1:::l:1:f:4\ncell:B12:t:Gross Sales:b:1::1:1:l:1:f:5:cf:2\ncell:C12:b:1::1::l:1:f:5\ncell:D12:b:1::1::l:1:f:5\ncell:E12:b:1:1:1::l:1:f:5\ncell:F12:v:100000:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:G12:v:180000:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:A13:b::1:::l:1:f:4\ncell:B13:t:Gross Profit:b:1::1:1:l:1:f:5:cf:2\ncell:C13:b:1::1::l:1:f:5\ncell:D13:b:1::1::l:1:f:5\ncell:E13:b:1:1:1::l:1:f:5\ncell:F13:v:25000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G13:v:50000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A14:b::1:::l:1:f:4\ncell:B14:t:% Gross Profit to Gross Sales:b:1::1:1:l:1:f:5:cf:2\ncell:C14:b:1::1::l:1:f:5\ncell:D14:b:1::1::l:1:f:5\ncell:E14:b:1:1:1::l:1:f:5\ncell:F14:vtf:n:0.25:IF(F12,(F13/F12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:G14:vtf:n:0.2777777777777778:IF(G12,(G13/G12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:A15:b::1:::l:1:f:4\ncell:B15:t:Net Profit:b:1::1:1:l:1:f:5:cf:2\ncell:C15:b:1::1::l:1:f:5\ncell:D15:b:1::1::l:1:f:5\ncell:E15:b:1:1:1::l:1:f:5\ncell:F15:v:15000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G15:v:24000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A16:b::1:::l:1:f:4\ncell:B16:t:% Net Profit to Gross Sales:b:1::1:1:l:1:f:5:cf:2\ncell:C16:b:1::1::l:1:f:5\ncell:D16:b:1::1::l:1:f:5\ncell:E16:b:1:1:1::l:1:f:5\ncell:F16:vtf:n:0.15:IF(F12,(F15/F12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:G16:vtf:n:0.13333333333333333:IF(G12,(G15/G12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:A17:b::1:::l:1:f:4\ncell:B17:t:Salary:b:1::1:1:l:1:f:5:cf:2\ncell:C17:b:1::1::l:1:f:5\ncell:D17:b:1::1::l:1:f:5\ncell:E17:b:1:1:1::l:1:f:5\ncell:F17:v:7000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G17:v:7000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A18:b::1:::l:1:f:4\ncell:B18:t:Commission:b:1::1:1:l:1:f:5:cf:2\ncell:C18:b:1::1::l:1:f:5\ncell:D18:b:1::1::l:1:f:5\ncell:E18:b:1:1:1::l:1:f:5\ncell:F18:v:3500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G18:v:4000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A19:b::1:::l:1:f:4\ncell:B19:t:Expense\\c:b:1::1:1:l:1:f:5:cf:2\ncell:C19:b:1::1::l:1:f:5:cf:2\ncell:D19:t:Auto:b:1::1::l:1:f:5:cf:2\ncell:E19:b:1:1:1::l:1:f:5\ncell:F19:v:1000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G19:v:1100:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A20:b::1:::l:1:f:4\ncell:B20:b:1::1:1:l:1:f:5\ncell:C20:b:1::1::l:1:f:5:cf:2\ncell:D20:t:Travel:b:1::1::l:1:f:5:cf:2\ncell:E20:b:1:1:1::l:1:f:5\ncell:F20:v:500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G20:v:600:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A21:b::1:::l:1:f:4\ncell:B21:b:1::1:1:l:1:f:5\ncell:C21:b:1::1::l:1:f:5:cf:2\ncell:D21:t:Entertainment:b:1::1::l:1:f:5:cf:2\ncell:E21:b:1:1:1::l:1:f:5\ncell:F21:v:1000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G21:v:1200:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A22:b::1:::l:1:f:4\ncell:B22:b:1::1:1:l:1:f:5\ncell:C22:b:1::1::l:1:f:5:cf:2\ncell:D22:t:Other:b:1::1::l:1:f:5:cf:2\ncell:E22:b:1:1:1::l:1:f:5\ncell:F22:v:100:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G22:v:500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A23:b::1:::l:1:f:4\ncell:B23:t:Total Days Worked:b:1::1:1:l:1:f:5:cf:2\ncell:C23:b:1::1::l:1:f:5\ncell:D23:b:1::1::l:1:f:5\ncell:E23:b:1:1:1::l:1:f:5\ncell:F23:v:22:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:G23:v:21:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:A24:b::1:::l:1:f:4\ncell:B24:t:Number of Calls Made:b:1::1:1:l:1:f:5:cf:2\ncell:C24:b:1::1::l:1:f:5\ncell:D24:b:1::1::l:1:f:5\ncell:E24:b:1:1:1::l:1:f:5\ncell:F24:v:100:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G24:v:110:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A25:b::1:::l:1:f:4\ncell:B25:t:Average Calls Per Day:b:1::1:1:l:1:f:5:cf:2\ncell:C25:b:1::1::l:1:f:5\ncell:D25:b:1::1::l:1:f:5\ncell:E25:b:1:1:1::l:1:f:5\ncell:F25:vtf:n:4.545454545454546:IF(F23,(F24/F23),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:G25:vtf:n:5.238095238095238:IF(G23,(G24/G23),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A26:b::1:::l:1:f:4\ncell:B26:t:Number of New Accounts:b:1::1:1:l:1:f:5:cf:2\ncell:C26:b:1::1::l:1:f:5\ncell:D26:b:1::1::l:1:f:5\ncell:E26:b:1:1:1::l:1:f:5\ncell:F26:v:10:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G26:v:12:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A27:b::1:::l:1:f:4\ncell:B27:t:Number of Accounts Lost:b:1::1:1:l:1:f:5:cf:2\ncell:C27:b:1::1::l:1:f:5\ncell:D27:b:1::1::l:1:f:5\ncell:E27:b:1:1:1::l:1:f:5\ncell:F27:v:3:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G27:v:4:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A28:b::1:::l:1:f:4\ncell:B28:t:Number of Accounts at Period End:b:1::1:1:l:1:f:5:cf:2\ncell:C28:b:1::1::l:1:f:5\ncell:D28:b:1::1::l:1:f:5\ncell:E28:b:1:1:1::l:1:f:5\ncell:F28:v:96:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G28:v:97:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A29:b::1:::l:1:f:4\ncell:B29:t:Number of Potential Accounts:b:1::1:1:l:1:f:5:cf:2\ncell:C29:b:1::1::l:1:f:5\ncell:D29:b:1::1::l:1:f:5\ncell:E29:b:1:1:1::l:1:f:5\ncell:F29:v:43:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G29:v:1500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:B30:b:1::::l:1:f:4\ncell:C30:b:1::::l:1:f:4\ncell:D30:b:1::::l:1:f:4\ncell:E30:b:1::::l:1:f:4\ncell:F30:b:1::::l:1:f:4\ncell:G30:b:1::::l:1:f:4\ncell:B31:l:1:f:4\ncol:A:w:12\ncol:B:w:312\ncol:C:w:52\ncol:D:w:136\ncol:E:w:100\ncol:F:w:136\ncol:G:w:164\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:15.75\nrow:10:h:15.75\nrow:11:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:15.75\nrow:19:h:15.75\nrow:20:h:15.75\nrow:21:h:15.75\nrow:22:h:15.75\nrow:23:h:15.75\nrow:24:h:15.75\nrow:25:h:15.75\nrow:26:h:15.75\nrow:27:h:15.75\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nsheet:c:7:r:31:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\nfont:1:normal bold 12pt Arial\nfont:2:normal bold 14pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2: #,##0.00 ;(#,##0.00)\nvalueformat:3:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:4:0.0 \nvalueformat:5:0.0%\nvalueformat:6:mmmm d, yyyy\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet8","hidden":"1"},"sheet14":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Sales Activity Report:l:2:f:3:cf:2\ncell:C3:l:2:f:5:cf:1\ncell:D3:l:2:f:5:cf:1\ncell:E3:l:2:f:5:cf:1\ncell:F3:l:2:f:5:cf:1\ncell:G3:l:2:f:5:cf:1\ncell:B4:t:For December 2009:l:1:f:2:cf:1\ncell:C4:l:1:f:5:cf:1\ncell:D4:l:1:f:5:cf:1\ncell:E4:l:1:f:5:cf:1\ncell:F4:l:1:f:5:cf:1\ncell:G4:l:1:f:5:cf:1\ncell:B5:l:1:f:5\ncell:C5:l:1:f:5\ncell:D5:l:1:f:5\ncell:E5:l:1:f:5\ncell:F5:l:1:f:5\ncell:G5:l:1:f:5\ncell:C6:l:1:f:5\ncell:D6:l:1:f:5\ncell:E6:l:1:f:5\ncell:F6:l:1:f:5\ncell:G6:l:1:f:5\ncell:B7:t:Salesperson:l:1:f:5:cf:2\ncell:C7:l:1:f:5\ncell:D7:b:::1::l:1:f:5:cf:2\ncell:E7:b:::1::l:1:f:5\ncell:F7:l:1:f:5\ncell:G7:l:1:f:5\ncell:B8:t:Territory :l:1:f:5:cf:2\ncell:C8:l:1:f:5\ncell:D8:b:1::1::l:1:f:5:cf:2\ncell:E8:b:1::1::l:1:f:5\ncell:F8:t:Date :l:1:f:5:cf:3\ncell:G8:b:::1::l:1:f:5:cf:1:ntvf:6\ncell:B9:l:1:f:5\ncell:C9:l:1:f:5\ncell:D9:b:1::::l:1:f:5\ncell:E9:b:1::::l:1:f:5\ncell:F9:l:1:f:5\ncell:G9:b:1::::l:1:f:5\ncell:B10:b:::1::l:1:f:5\ncell:C10:b:::1::l:1:f:5\ncell:D10:b:::1::l:1:f:5\ncell:E10:b:::1::l:1:f:5\ncell:F10:b:::1::l:1:f:5\ncell:G10:b:::1::l:1:f:5\ncell:A11:b::1:::l:1:f:4\ncell:B11:b:1::1:1:l:1:f:5\ncell:C11:b:1::1::l:1:f:5\ncell:D11:b:1::1::l:1:f:5\ncell:E11:b:1:1:1::l:1:f:5\ncell:F11:t:FORECAST :b:1:1:1:1:l:1:f:1:cf:3\ncell:G11:t:ACTUAL :b:1:1:1:1:l:1:f:1:cf:3\ncell:A12:b::1:::l:1:f:4\ncell:B12:t:Gross Sales:b:1::1:1:l:1:f:5:cf:2\ncell:C12:b:1::1::l:1:f:5\ncell:D12:b:1::1::l:1:f:5\ncell:E12:b:1:1:1::l:1:f:5\ncell:F12:v:100000:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:G12:v:180000:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:A13:b::1:::l:1:f:4\ncell:B13:t:Gross Profit:b:1::1:1:l:1:f:5:cf:2\ncell:C13:b:1::1::l:1:f:5\ncell:D13:b:1::1::l:1:f:5\ncell:E13:b:1:1:1::l:1:f:5\ncell:F13:v:25000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G13:v:50000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A14:b::1:::l:1:f:4\ncell:B14:t:% Gross Profit to Gross Sales:b:1::1:1:l:1:f:5:cf:2\ncell:C14:b:1::1::l:1:f:5\ncell:D14:b:1::1::l:1:f:5\ncell:E14:b:1:1:1::l:1:f:5\ncell:F14:vtf:n:0.25:IF(F12,(F13/F12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:G14:vtf:n:0.2777777777777778:IF(G12,(G13/G12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:A15:b::1:::l:1:f:4\ncell:B15:t:Net Profit:b:1::1:1:l:1:f:5:cf:2\ncell:C15:b:1::1::l:1:f:5\ncell:D15:b:1::1::l:1:f:5\ncell:E15:b:1:1:1::l:1:f:5\ncell:F15:v:15000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G15:v:24000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A16:b::1:::l:1:f:4\ncell:B16:t:% Net Profit to Gross Sales:b:1::1:1:l:1:f:5:cf:2\ncell:C16:b:1::1::l:1:f:5\ncell:D16:b:1::1::l:1:f:5\ncell:E16:b:1:1:1::l:1:f:5\ncell:F16:vtf:n:0.15:IF(F12,(F15/F12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:G16:vtf:n:0.13333333333333333:IF(G12,(G15/G12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:A17:b::1:::l:1:f:4\ncell:B17:t:Salary:b:1::1:1:l:1:f:5:cf:2\ncell:C17:b:1::1::l:1:f:5\ncell:D17:b:1::1::l:1:f:5\ncell:E17:b:1:1:1::l:1:f:5\ncell:F17:v:7000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G17:v:7000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A18:b::1:::l:1:f:4\ncell:B18:t:Commission:b:1::1:1:l:1:f:5:cf:2\ncell:C18:b:1::1::l:1:f:5\ncell:D18:b:1::1::l:1:f:5\ncell:E18:b:1:1:1::l:1:f:5\ncell:F18:v:3500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G18:v:4000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A19:b::1:::l:1:f:4\ncell:B19:t:Expense\\c:b:1::1:1:l:1:f:5:cf:2\ncell:C19:b:1::1::l:1:f:5:cf:2\ncell:D19:t:Auto:b:1::1::l:1:f:5:cf:2\ncell:E19:b:1:1:1::l:1:f:5\ncell:F19:v:1000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G19:v:1100:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A20:b::1:::l:1:f:4\ncell:B20:b:1::1:1:l:1:f:5\ncell:C20:b:1::1::l:1:f:5:cf:2\ncell:D20:t:Travel:b:1::1::l:1:f:5:cf:2\ncell:E20:b:1:1:1::l:1:f:5\ncell:F20:v:500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G20:v:600:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A21:b::1:::l:1:f:4\ncell:B21:b:1::1:1:l:1:f:5\ncell:C21:b:1::1::l:1:f:5:cf:2\ncell:D21:t:Entertainment:b:1::1::l:1:f:5:cf:2\ncell:E21:b:1:1:1::l:1:f:5\ncell:F21:v:1000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G21:v:1200:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A22:b::1:::l:1:f:4\ncell:B22:b:1::1:1:l:1:f:5\ncell:C22:b:1::1::l:1:f:5:cf:2\ncell:D22:t:Other:b:1::1::l:1:f:5:cf:2\ncell:E22:b:1:1:1::l:1:f:5\ncell:F22:v:100:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G22:v:500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A23:b::1:::l:1:f:4\ncell:B23:t:Total Days Worked:b:1::1:1:l:1:f:5:cf:2\ncell:C23:b:1::1::l:1:f:5\ncell:D23:b:1::1::l:1:f:5\ncell:E23:b:1:1:1::l:1:f:5\ncell:F23:v:22:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:G23:v:21:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:A24:b::1:::l:1:f:4\ncell:B24:t:Number of Calls Made:b:1::1:1:l:1:f:5:cf:2\ncell:C24:b:1::1::l:1:f:5\ncell:D24:b:1::1::l:1:f:5\ncell:E24:b:1:1:1::l:1:f:5\ncell:F24:v:100:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G24:v:110:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A25:b::1:::l:1:f:4\ncell:B25:t:Average Calls Per Day:b:1::1:1:l:1:f:5:cf:2\ncell:C25:b:1::1::l:1:f:5\ncell:D25:b:1::1::l:1:f:5\ncell:E25:b:1:1:1::l:1:f:5\ncell:F25:vtf:n:4.545454545454546:IF(F23,(F24/F23),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:G25:vtf:n:5.238095238095238:IF(G23,(G24/G23),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A26:b::1:::l:1:f:4\ncell:B26:t:Number of New Accounts:b:1::1:1:l:1:f:5:cf:2\ncell:C26:b:1::1::l:1:f:5\ncell:D26:b:1::1::l:1:f:5\ncell:E26:b:1:1:1::l:1:f:5\ncell:F26:v:10:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G26:v:12:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A27:b::1:::l:1:f:4\ncell:B27:t:Number of Accounts Lost:b:1::1:1:l:1:f:5:cf:2\ncell:C27:b:1::1::l:1:f:5\ncell:D27:b:1::1::l:1:f:5\ncell:E27:b:1:1:1::l:1:f:5\ncell:F27:v:3:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G27:v:4:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A28:b::1:::l:1:f:4\ncell:B28:t:Number of Accounts at Period End:b:1::1:1:l:1:f:5:cf:2\ncell:C28:b:1::1::l:1:f:5\ncell:D28:b:1::1::l:1:f:5\ncell:E28:b:1:1:1::l:1:f:5\ncell:F28:v:96:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G28:v:97:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A29:b::1:::l:1:f:4\ncell:B29:t:Number of Potential Accounts:b:1::1:1:l:1:f:5:cf:2\ncell:C29:b:1::1::l:1:f:5\ncell:D29:b:1::1::l:1:f:5\ncell:E29:b:1:1:1::l:1:f:5\ncell:F29:v:43:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G29:v:1500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:B30:b:1::::l:1:f:4\ncell:C30:b:1::::l:1:f:4\ncell:D30:b:1::::l:1:f:4\ncell:E30:b:1::::l:1:f:4\ncell:F30:b:1::::l:1:f:4\ncell:G30:b:1::::l:1:f:4\ncell:B31:l:1:f:4\ncol:A:w:12\ncol:B:w:312\ncol:C:w:52\ncol:D:w:136\ncol:E:w:100\ncol:F:w:136\ncol:G:w:164\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:15.75\nrow:10:h:15.75\nrow:11:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:15.75\nrow:19:h:15.75\nrow:20:h:15.75\nrow:21:h:15.75\nrow:22:h:15.75\nrow:23:h:15.75\nrow:24:h:15.75\nrow:25:h:15.75\nrow:26:h:15.75\nrow:27:h:15.75\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nsheet:c:7:r:31:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\nfont:1:normal bold 12pt Arial\nfont:2:normal bold 14pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2: #,##0.00 ;(#,##0.00)\nvalueformat:3:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:4:0.0 \nvalueformat:5:0.0%\nvalueformat:6:mmmm d, yyyy\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet801","hidden":"1"},"sheet15":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t: Sales Channel Analysis:l:1:f:3:cf:2\ncell:C3:l:1:f:4:cf:1\ncell:D3:l:1:f:4:cf:1\ncell:E3:l:1:f:4:cf:1\ncell:F3:l:1:f:4:cf:1\ncell:G3:l:1:f:4:cf:1\ncell:H3:l:1:f:4:cf:1\ncell:B4:t:For January, 2010:l:1:f:2:cf:1:ntvf:4\ncell:C4:l:1:f:4:cf:1\ncell:D4:l:1:f:4:cf:1\ncell:E4:l:1:f:4:cf:1\ncell:F4:l:1:f:4:cf:1\ncell:G4:l:1:f:4:cf:1\ncell:H4:l:1:f:4:cf:1\ncell:B5:b:::1::l:1:f:4\ncell:C5:b:::1::l:1:f:4:cf:1\ncell:D5:b:::1::l:1:f:4:cf:1\ncell:E5:b:::1::l:1:f:4:cf:1\ncell:F5:b:::1::l:1:f:4:cf:1\ncell:G5:b:::1::l:1:f:4:cf:1\ncell:H5:b:::1::l:1:f:4:cf:1\ncell:A6:b::1:::l:1:f:4\ncell:B6:b:1:::1:l:1:f:4:cf:1\ncell:C6:b:1:1:::l:1:f:4:cf:1\ncell:D6:t:Annual :b:1:1::1:l:1:f:1:cf:1\ncell:E6:t:Annual :b:1:1::1:l:1:f:1:cf:1\ncell:F6:t:% of Total:b:1:1::1:l:1:f:1:cf:1\ncell:G6:t:Avg Units :b:1:1::1:l:1:f:1:cf:1\ncell:H6:t:Avg Dollars :b:1:1::1:l:1:f:1:cf:1\ncell:A7:b::1:::l:1:f:4\ncell:B7:b:::1:1:l:1:f:4:cf:1\ncell:C7:b::1:1::l:1:f:4:cf:1\ncell:D7:t:Unit Volume :b::1:1:1:l:1:f:1:cf:1\ncell:E7:t:Dollar Volume :b::1:1:1:l:1:f:1:cf:1\ncell:F7:t:Sales :b::1:1:1:l:1:f:1:cf:1\ncell:G7:t:per Month :b::1:1:1:l:1:f:1:cf:1\ncell:H7:t:per Month :b::1:1:1:l:1:f:1:cf:1\ncell:B8:t:Company Retail Outlets:b:1::::l:1:f:1\ncell:C8:b:1::::l:1:f:4\ncell:D8:b:1::::l:1:f:4\ncell:E8:b:1::::l:1:f:4\ncell:F8:b:1::::l:1:f:4\ncell:G8:b:1::::l:1:f:4\ncell:H8:b:1::::l:1:f:4:ntvf:2\ncell:B9:l:1:f:4\ncell:C9:t:Freeport:l:1:f:4\ncell:D9:v:1000000:l:1:f:4:ntvf:1\ncell:E9:v:20000000:l:1:f:4:ntvf:2\ncell:F9:vtf:n:0.18518518518518517:IF(AND(SUM(D9),SUM(E9)),(SUM(E9)/SUM($E$13)),\"\"):l:1:f:4:ntvf:3\ncell:G9:vtf:n:83333.33333333333:IF(SUM(F9),(D9/12),\"\"):l:1:f:4:ntvf:1\ncell:H9:vtf:n:1666666.6666666667:IF(SUM(G9),(+E9/12),\"\"):l:1:f:4:ntvf:2\ncell:B10:l:1:f:4\ncell:C10:t:Fall River:l:1:f:4\ncell:D10:v:1500000:l:1:f:4:ntvf:1\ncell:E10:v:30000000:l:1:f:4:ntvf:1\ncell:F10:vtf:n:0.2777777777777778:IF(AND(SUM(D10),SUM(E10)),(SUM(E10)/SUM($E$13)),\"\"):l:1:f:4:ntvf:3\ncell:G10:vtf:n:125000:IF(SUM(F10),(D10/12),\"\"):l:1:f:4:ntvf:1\ncell:H10:vtf:n:2500000:IF(SUM(G10),(+E10/12),\"\"):l:1:f:4:ntvf:1\ncell:B11:l:1:f:4\ncell:C11:t:Orlando:l:1:f:4\ncell:D11:v:2000000:l:1:f:4:ntvf:1\ncell:E11:v:40000000:l:1:f:4:ntvf:1\ncell:F11:vtf:n:0.37037037037037035:IF(AND(SUM(D11),SUM(E11)),(SUM(E11)/SUM($E$13)),\"\"):l:1:f:4:ntvf:3\ncell:G11:vtf:n:166666.66666666666:IF(SUM(F11),(D11/12),\"\"):l:1:f:4:ntvf:1\ncell:H11:vtf:n:3333333.3333333335:IF(SUM(G11),(+E11/12),\"\"):l:1:f:4:ntvf:1\ncell:B12:l:1:f:4\ncell:C12:t:Baltimore:b:::1::l:1:f:4\ncell:D12:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E12:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F12:vtf:n:0.16666666666666666:IF(AND(SUM(D12),SUM(E12)),(SUM(E12)/SUM($E$13)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G12:vtf:n:75000:IF(SUM(F12),(D12/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H12:vtf:n:1500000:IF(SUM(G12),(+E12/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B13:l:1:f:4\ncell:C13:t:Total:b:1::::l:1:f:4\ncell:D13:vtf:n:5400000:IF(SUM(D9\\cD12),SUM(D9\\cD12),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E13:vtf:n:108000000:IF(SUM(E9\\cE12),SUM(E9\\cE12),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F13:vtf:n:0.1581259150805271:IF(AND(SUM(D13),SUM(E13)),(E13/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G13:vtf:n:450000:IF(SUM(G9\\cG12),SUM(G9\\cG12),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H13:vtf:n:9000000:IF(SUM(H9\\cH12),SUM(H9\\cH12),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B14:t:Independent Retail Outlets:l:1:f:1\ncell:C14:l:1:f:4\ncell:D14:l:1:f:4:ntvf:1\ncell:E14:l:1:f:4:ntvf:2\ncell:F14:l:1:f:4\ncell:G14:l:1:f:4:ntvf:1\ncell:H14:l:1:f:4:ntvf:2\ncell:B15:l:1:f:4\ncell:C15:t:North Conway:l:1:f:4\ncell:D15:v:1100000:l:1:f:4:ntvf:1\ncell:E15:v:21000000:l:1:f:4:ntvf:2\ncell:F15:vtf:n:0.1926605504587156:IF(AND(SUM(D15),SUM(E15)),(SUM(E15)/SUM($E$19)),\"\"):l:1:f:4:ntvf:3\ncell:G15:vtf:n:91666.66666666667:IF(SUM(F15),(D15/12),\"\"):l:1:f:4:ntvf:1\ncell:H15:vtf:n:1750000:IF(SUM(G15),(+E15/12),\"\"):l:1:f:4:ntvf:2\ncell:B16:l:1:f:4\ncell:C16:t:Nashua:l:1:f:4\ncell:D16:v:1500000:l:1:f:4:ntvf:1\ncell:E16:v:30000000:l:1:f:4:ntvf:1\ncell:F16:vtf:n:0.27522935779816515:IF(AND(SUM(D16),SUM(E16)),(SUM(E16)/SUM($E$19)),\"\"):l:1:f:4:ntvf:3\ncell:G16:vtf:n:125000:IF(SUM(F16),(D16/12),\"\"):l:1:f:4:ntvf:1\ncell:H16:vtf:n:2500000:IF(SUM(G16),(+E16/12),\"\"):l:1:f:4:ntvf:1\ncell:B17:l:1:f:4\ncell:C17:t:Washington, DC:l:1:f:4\ncell:D17:v:2000000:l:1:f:4:ntvf:1\ncell:E17:v:40000000:l:1:f:4:ntvf:1\ncell:F17:vtf:n:0.3669724770642202:IF(AND(SUM(D17),SUM(E17)),(SUM(E17)/SUM($E$19)),\"\"):l:1:f:4:ntvf:3\ncell:G17:vtf:n:166666.66666666666:IF(SUM(F17),(D17/12),\"\"):l:1:f:4:ntvf:1\ncell:H17:vtf:n:3333333.3333333335:IF(SUM(G17),(+E17/12),\"\"):l:1:f:4:ntvf:1\ncell:B18:l:1:f:4\ncell:C18:t:New Bedford:b:::1::l:1:f:4\ncell:D18:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E18:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F18:vtf:n:0.1651376146788991:IF(AND(SUM(D18),SUM(E18)),(SUM(E18)/SUM($E$19)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G18:vtf:n:75000:IF(SUM(F18),(D18/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H18:vtf:n:1500000:IF(SUM(G18),(+E18/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B19:l:1:f:4\ncell:C19:t:Total:b:1::::l:1:f:4\ncell:D19:vtf:n:5500000:IF(SUM(D15\\cD18),SUM(D15\\cD18),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E19:vtf:n:109000000:IF(SUM(E15\\cE18),SUM(E15\\cE18),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F19:vtf:n:0.1595900439238653:IF(AND(SUM(D19),SUM(E19)),(E19/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G19:vtf:n:458333.3333333334:IF(SUM(G15\\cG18),SUM(G15\\cG18),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H19:vtf:n:9083333.333333334:IF(SUM(H15\\cH18),SUM(H15\\cH18),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B20:t:Salaried Sales Force:l:1:f:1\ncell:C20:l:1:f:4\ncell:D20:l:1:f:4:ntvf:1\ncell:E20:l:1:f:4:ntvf:2\ncell:F20:l:1:f:4\ncell:G20:l:1:f:4:ntvf:1\ncell:H20:l:1:f:4:ntvf:2\ncell:B21:l:1:f:4\ncell:C21:t:Northeast:l:1:f:4\ncell:D21:v:1100000:l:1:f:4:ntvf:1\ncell:E21:v:21000000:l:1:f:4:ntvf:2\ncell:F21:vtf:n:0.1926605504587156:IF(AND(SUM(D21),SUM(E21)),(SUM(E21)/SUM($E$25)),\"\"):l:1:f:4:ntvf:3\ncell:G21:vtf:n:91666.66666666667:IF(SUM(F21),(D21/12),\"\"):l:1:f:4:ntvf:1\ncell:H21:vtf:n:1750000:IF(SUM(G21),(+E21/12),\"\"):l:1:f:4:ntvf:2\ncell:B22:l:1:f:4\ncell:C22:t:Mid-Atlantic:l:1:f:4\ncell:D22:v:1500000:l:1:f:4:ntvf:1\ncell:E22:v:30000000:l:1:f:4:ntvf:1\ncell:F22:vtf:n:0.27522935779816515:IF(AND(SUM(D22),SUM(E22)),(SUM(E22)/SUM($E$25)),\"\"):l:1:f:4:ntvf:3\ncell:G22:vtf:n:125000:IF(SUM(F22),(D22/12),\"\"):l:1:f:4:ntvf:1\ncell:H22:vtf:n:2500000:IF(SUM(G22),(+E22/12),\"\"):l:1:f:4:ntvf:1\ncell:B23:l:1:f:4\ncell:C23:t:Southeast:l:1:f:4\ncell:D23:v:2000000:l:1:f:4:ntvf:1\ncell:E23:v:40000000:l:1:f:4:ntvf:1\ncell:F23:vtf:n:0.3669724770642202:IF(AND(SUM(D23),SUM(E23)),(SUM(E23)/SUM($E$25)),\"\"):l:1:f:4:ntvf:3\ncell:G23:vtf:n:166666.66666666666:IF(SUM(F23),(D23/12),\"\"):l:1:f:4:ntvf:1\ncell:H23:vtf:n:3333333.3333333335:IF(SUM(G23),(+E23/12),\"\"):l:1:f:4:ntvf:1\ncell:B24:l:1:f:4\ncell:C24:t:West:b:::1::l:1:f:4\ncell:D24:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E24:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F24:vtf:n:0.1651376146788991:IF(AND(SUM(D24),SUM(E24)),(SUM(E24)/SUM($E$25)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G24:vtf:n:75000:IF(SUM(F24),(D24/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H24:vtf:n:1500000:IF(SUM(G24),(+E24/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B25:l:1:f:4\ncell:C25:t:Total:b:1::::l:1:f:4\ncell:D25:vtf:n:5500000:IF(SUM(D21\\cD24),SUM(D21\\cD24),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E25:vtf:n:109000000:IF(SUM(E21\\cE24),SUM(E21\\cE24),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F25:vtf:n:0.1595900439238653:IF(AND(SUM(D25),SUM(E25)),(E25/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G25:vtf:n:458333.3333333334:IF(SUM(G21\\cG24),SUM(G21\\cG24),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H25:vtf:n:9083333.333333334:IF(SUM(H21\\cH24),SUM(H21\\cH24),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B26:t:Channel 4:l:1:f:1\ncell:C26:l:1:f:4\ncell:D26:l:1:f:4:ntvf:1\ncell:E26:l:1:f:4:ntvf:2\ncell:F26:l:1:f:4\ncell:G26:l:1:f:4:ntvf:1\ncell:H26:l:1:f:4:ntvf:2\ncell:B27:l:1:f:4\ncell:C27:t:Northeast:l:1:f:4\ncell:D27:v:1100000:l:1:f:4:ntvf:1\ncell:E27:v:21000000:l:1:f:4:ntvf:2\ncell:F27:vtf:n:0.1926605504587156:IF(AND(SUM(D27),SUM(E27)),(SUM(E27)/SUM($E$31)),\"\"):l:1:f:4:ntvf:3\ncell:G27:vtf:n:91666.66666666667:IF(SUM(F27),(D27/12),\"\"):l:1:f:4:ntvf:1\ncell:H27:vtf:n:1750000:IF(SUM(G27),(+E27/12),\"\"):l:1:f:4:ntvf:2\ncell:B28:l:1:f:4\ncell:C28:t:Mid-Atlantic:l:1:f:4\ncell:D28:v:1500000:l:1:f:4:ntvf:1\ncell:E28:v:30000000:l:1:f:4:ntvf:1\ncell:F28:vtf:n:0.27522935779816515:IF(AND(SUM(D28),SUM(E28)),(SUM(E28)/SUM($E$31)),\"\"):l:1:f:4:ntvf:3\ncell:G28:vtf:n:125000:IF(SUM(F28),(D28/12),\"\"):l:1:f:4:ntvf:1\ncell:H28:vtf:n:2500000:IF(SUM(G28),(+E28/12),\"\"):l:1:f:4:ntvf:1\ncell:B29:l:1:f:4\ncell:C29:t:Southeast:l:1:f:4\ncell:D29:v:2000000:l:1:f:4:ntvf:1\ncell:E29:v:40000000:l:1:f:4:ntvf:1\ncell:F29:vtf:n:0.3669724770642202:IF(AND(SUM(D29),SUM(E29)),(SUM(E29)/SUM($E$31)),\"\"):l:1:f:4:ntvf:3\ncell:G29:vtf:n:166666.66666666666:IF(SUM(F29),(D29/12),\"\"):l:1:f:4:ntvf:1\ncell:H29:vtf:n:3333333.3333333335:IF(SUM(G29),(+E29/12),\"\"):l:1:f:4:ntvf:1\ncell:B30:l:1:f:4\ncell:C30:t:West:b:::1::l:1:f:4\ncell:D30:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E30:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F30:vtf:n:0.1651376146788991:IF(AND(SUM(D30),SUM(E30)),(SUM(E30)/SUM($E$31)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G30:vtf:n:75000:IF(SUM(F30),(D30/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H30:vtf:n:1500000:IF(SUM(G30),(+E30/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B31:l:1:f:4\ncell:C31:t:Total:b:1::::l:1:f:4\ncell:D31:vtf:n:5500000:IF(SUM(D27\\cD30),SUM(D27\\cD30),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E31:vtf:n:109000000:IF(SUM(E27\\cE30),SUM(E27\\cE30),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F31:vtf:n:0.1595900439238653:IF(AND(SUM(D31),SUM(E31)),(E31/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G31:vtf:n:458333.3333333334:IF(SUM(G27\\cG30),SUM(G27\\cG30),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H31:vtf:n:9083333.333333334:IF(SUM(H27\\cH30),SUM(H27\\cH30),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B32:t:Wholesalers / Company Owned Distributors:l:1:f:1\ncell:C32:l:1:f:4\ncell:D32:l:1:f:4:ntvf:1\ncell:E32:l:1:f:4:ntvf:2\ncell:F32:l:1:f:4\ncell:G32:l:1:f:4:ntvf:1\ncell:H32:l:1:f:4:ntvf:2\ncell:B33:l:1:f:4\ncell:C33:t:New York:l:1:f:4\ncell:D33:v:1100000:l:1:f:4:ntvf:1\ncell:E33:v:21000000:l:1:f:4:ntvf:2\ncell:F33:vtf:n:0.1926605504587156:IF(AND(SUM(D33),SUM(E33)),(SUM(E33)/SUM($E$37)),\"\"):l:1:f:4:ntvf:3\ncell:G33:vtf:n:91666.66666666667:IF(SUM(F33),(D33/12),\"\"):l:1:f:4:ntvf:1\ncell:H33:vtf:n:1750000:IF(SUM(G33),(+E33/12),\"\"):l:1:f:4:ntvf:2\ncell:B34:l:1:f:4\ncell:C34:t:Nashua:l:1:f:4\ncell:D34:v:1500000:l:1:f:4:ntvf:1\ncell:E34:v:30000000:l:1:f:4:ntvf:1\ncell:F34:vtf:n:0.27522935779816515:IF(AND(SUM(D34),SUM(E34)),(SUM(E34)/SUM($E$37)),\"\"):l:1:f:4:ntvf:3\ncell:G34:vtf:n:125000:IF(SUM(F34),(D34/12),\"\"):l:1:f:4:ntvf:1\ncell:H34:vtf:n:2500000:IF(SUM(G34),(+E34/12),\"\"):l:1:f:4:ntvf:1\ncell:B35:l:1:f:4\ncell:C35:t:Washington, DC:l:1:f:4\ncell:D35:v:2000000:l:1:f:4:ntvf:1\ncell:E35:v:40000000:l:1:f:4:ntvf:1\ncell:F35:vtf:n:0.3669724770642202:IF(AND(SUM(D35),SUM(E35)),(SUM(E35)/SUM($E$37)),\"\"):l:1:f:4:ntvf:3\ncell:G35:vtf:n:166666.66666666666:IF(SUM(F35),(D35/12),\"\"):l:1:f:4:ntvf:1\ncell:H35:vtf:n:3333333.3333333335:IF(SUM(G35),(+E35/12),\"\"):l:1:f:4:ntvf:1\ncell:B36:l:1:f:4\ncell:C36:t:Charleston, NC:b:::1::l:1:f:4\ncell:D36:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E36:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F36:vtf:n:0.1651376146788991:IF(AND(SUM(D36),SUM(E36)),(SUM(E36)/SUM($E$37)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G36:vtf:n:75000:IF(SUM(F36),(D36/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H36:vtf:n:1500000:IF(SUM(G36),(+E36/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B37:l:1:f:4\ncell:C37:t:Total:b:1::::l:1:f:4\ncell:D37:vtf:n:5500000:IF(SUM(D33\\cD36),SUM(D33\\cD36),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E37:vtf:n:109000000:IF(SUM(E33\\cE36),SUM(E33\\cE36),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F37:vtf:n:0.1595900439238653:IF(AND(SUM(D37),SUM(E37)),(E37/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G37:vtf:n:458333.3333333334:IF(SUM(G33\\cG36),SUM(G33\\cG36),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H37:vtf:n:9083333.333333334:IF(SUM(H33\\cH36),SUM(H33\\cH36),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B38:t:Wholesalers / Independent Distributors:l:1:f:1\ncell:C38:l:1:f:4\ncell:D38:l:1:f:4:ntvf:1\ncell:E38:l:1:f:4:ntvf:2\ncell:F38:l:1:f:4\ncell:G38:l:1:f:4:ntvf:1\ncell:H38:l:1:f:4:ntvf:2\ncell:B39:l:1:f:4\ncell:C39:t:Springfield:l:1:f:4\ncell:D39:v:1100000:l:1:f:4:ntvf:1\ncell:E39:v:21000000:l:1:f:4:ntvf:2\ncell:F39:vtf:n:0.1926605504587156:IF(AND(SUM(D39),SUM(E39)),(SUM(E39)/SUM($E$43)),\"\"):l:1:f:4:ntvf:3\ncell:G39:vtf:n:91666.66666666667:IF(SUM(F39),(D39/12),\"\"):l:1:f:4:ntvf:1\ncell:H39:vtf:n:1750000:IF(SUM(G39),(+E39/12),\"\"):l:1:f:4:ntvf:2\ncell:B40:l:1:f:4\ncell:C40:t:Cambridge:l:1:f:4\ncell:D40:v:1500000:l:1:f:4:ntvf:1\ncell:E40:v:30000000:l:1:f:4:ntvf:1\ncell:F40:vtf:n:0.27522935779816515:IF(AND(SUM(D40),SUM(E40)),(SUM(E40)/SUM($E$43)),\"\"):l:1:f:4:ntvf:3\ncell:G40:vtf:n:125000:IF(SUM(F40),(D40/12),\"\"):l:1:f:4:ntvf:1\ncell:H40:vtf:n:2500000:IF(SUM(G40),(+E40/12),\"\"):l:1:f:4:ntvf:1\ncell:B41:l:1:f:4\ncell:C41:t:Chicago:l:1:f:4\ncell:D41:v:2000000:l:1:f:4:ntvf:1\ncell:E41:v:40000000:l:1:f:4:ntvf:1\ncell:F41:vtf:n:0.3669724770642202:IF(AND(SUM(D41),SUM(E41)),(SUM(E41)/SUM($E$43)),\"\"):l:1:f:4:ntvf:3\ncell:G41:vtf:n:166666.66666666666:IF(SUM(F41),(D41/12),\"\"):l:1:f:4:ntvf:1\ncell:H41:vtf:n:3333333.3333333335:IF(SUM(G41),(+E41/12),\"\"):l:1:f:4:ntvf:1\ncell:B42:l:1:f:4\ncell:C42:t:San Francisco:b:::1::l:1:f:4\ncell:D42:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E42:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F42:vtf:n:0.1651376146788991:IF(AND(SUM(D42),SUM(E42)),(SUM(E42)/SUM($E$43)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G42:vtf:n:75000:IF(SUM(F42),(D42/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H42:vtf:n:1500000:IF(SUM(G42),(+E42/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B43:l:1:f:4\ncell:C43:t:Total:b:1::::l:1:f:4\ncell:D43:vtf:n:5500000:IF(SUM(D39\\cD42),SUM(D39\\cD42),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E43:vtf:n:109000000:IF(SUM(E39\\cE42),SUM(E39\\cE42),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F43:vtf:n:0.1595900439238653:IF(AND(SUM(D43),SUM(E43)),(E43/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G43:vtf:n:458333.3333333334:IF(SUM(G39\\cG42),SUM(G39\\cG42),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H43:vtf:n:9083333.333333334:IF(SUM(H39\\cH42),SUM(H39\\cH42),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B44:t:Other:l:1:f:1\ncell:C44:l:1:f:4\ncell:D44:l:1:f:4:ntvf:1\ncell:E44:l:1:f:4:ntvf:2\ncell:F44:l:1:f:4\ncell:G44:l:1:f:4:ntvf:1\ncell:H44:l:1:f:4:ntvf:2\ncell:B45:l:1:f:4\ncell:C45:t:On-Line / Mail Order:l:1:f:4\ncell:D45:v:1500000:l:1:f:4:ntvf:1\ncell:E45:v:30000000:l:1:f:4:ntvf:2\ncell:F45:vtf:n:1:IF(AND(SUM(D45),SUM(E45)),(SUM(E45)/SUM($E$47)),\"\"):l:1:f:4:ntvf:3\ncell:G45:vtf:n:125000:IF(SUM(F45),(D45/12),\"\"):l:1:f:4:ntvf:1\ncell:H45:vtf:n:2500000:IF(SUM(G45),(+E45/12),\"\"):l:1:f:4:ntvf:2\ncell:B46:l:1:f:4\ncell:C46:b:::1::l:1:f:4\ncell:D46:b:::1::l:1:f:4:ntvf:1\ncell:E46:b:::1::l:1:f:4:ntvf:1\ncell:F46:vtf:t::IF(AND(SUM(D46),SUM(E46)),(SUM(E46)/SUM($E$47)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G46:vtf:t::IF(SUM(F46),(D46/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H46:vtf:t::IF(SUM(G46),(+E46/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B47:l:1:f:4\ncell:C47:t:Total:b:1::::l:1:f:4\ncell:D47:vtf:n:1500000:IF(SUM(D45\\cD46),SUM(D45\\cD46),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:E47:vtf:n:30000000:IF(SUM(E45\\cE46),SUM(E45\\cE46),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:F47:vtf:n:1:IF(SUM(F45\\cF46),SUM(F45\\cF46),\"\"):b:1::1::l:1:f:4:ntvf:3\ncell:G47:vtf:n:125000:IF(SUM(G45\\cG46),SUM(G45\\cG46),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:H47:vtf:n:2500000:IF(SUM(H45\\cH46),SUM(H45\\cH46),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:B48:t:Totals for all Channels:l:1:f:1\ncell:C48:l:1:f:4\ncell:D48:vtf:n:34400000:IF(SUM(D13,D19,D25,D31,D37,D43,D47),SUM(D13,D19,D25,D31,D37,D43,D47),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:E48:vtf:n:683000000:IF(SUM(E13,E19,E25,E31,E37,E43,E47),SUM(E13,E19,E25,E31,E37,E43,E47),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:F48:vtf:n:1:IF(AND(SUM(D48\\cE48),SUM(E48)),(SUM(E48)/SUM(E48)),\"\"):b:1::1::l:1:f:4:ntvf:3\ncell:G48:vtf:n:2866666.6666666665:IF(SUM(F48),(D48/12),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:H48:vtf:n:56916666.666666664:IF(SUM(G48),(+E48/12),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:D49:b:1::::l:1:f:4\ncell:E49:b:1::::l:1:f:4\ncell:F49:b:1::::l:1:f:4\ncell:G49:b:1::::l:1:f:4\ncell:H49:b:1::::l:1:f:4\ncell:B50:l:1:f:4\ncol:A:w:12\ncol:B:w:285\ncol:C:w:156\ncol:D:w:100\ncol:E:w:118\ncol:F:w:71\ncol:G:w:90\ncol:H:w:108\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nsheet:c:8:r:50:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:normal bold 10pt Arial\nfont:2:normal bold 14pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:3:0.0%\nvalueformat:4:mmmm d, yyyy\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet9","hidden":"1"},"sheet16":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t: Sales Channel Analysis:l:1:f:3:cf:2\ncell:C3:l:1:f:4:cf:1\ncell:D3:l:1:f:4:cf:1\ncell:E3:l:1:f:4:cf:1\ncell:F3:l:1:f:4:cf:1\ncell:G3:l:1:f:4:cf:1\ncell:H3:l:1:f:4:cf:1\ncell:B4:t:For January, 2010:l:1:f:2:cf:1:ntvf:4\ncell:C4:l:1:f:4:cf:1\ncell:D4:l:1:f:4:cf:1\ncell:E4:l:1:f:4:cf:1\ncell:F4:l:1:f:4:cf:1\ncell:G4:l:1:f:4:cf:1\ncell:H4:l:1:f:4:cf:1\ncell:B5:b:::1::l:1:f:4\ncell:C5:b:::1::l:1:f:4:cf:1\ncell:D5:b:::1::l:1:f:4:cf:1\ncell:E5:b:::1::l:1:f:4:cf:1\ncell:F5:b:::1::l:1:f:4:cf:1\ncell:G5:b:::1::l:1:f:4:cf:1\ncell:H5:b:::1::l:1:f:4:cf:1\ncell:A6:b::1:::l:1:f:4\ncell:B6:b:1:::1:l:1:f:4:cf:1\ncell:C6:b:1:1:::l:1:f:4:cf:1\ncell:D6:t:Annual :b:1:1::1:l:1:f:1:cf:1\ncell:E6:t:Annual :b:1:1::1:l:1:f:1:cf:1\ncell:F6:t:% of Total:b:1:1::1:l:1:f:1:cf:1\ncell:G6:t:Avg Units :b:1:1::1:l:1:f:1:cf:1\ncell:H6:t:Avg Dollars :b:1:1::1:l:1:f:1:cf:1\ncell:A7:b::1:::l:1:f:4\ncell:B7:b:::1:1:l:1:f:4:cf:1\ncell:C7:b::1:1::l:1:f:4:cf:1\ncell:D7:t:Unit Volume :b::1:1:1:l:1:f:1:cf:1\ncell:E7:t:Dollar Volume :b::1:1:1:l:1:f:1:cf:1\ncell:F7:t:Sales :b::1:1:1:l:1:f:1:cf:1\ncell:G7:t:per Month :b::1:1:1:l:1:f:1:cf:1\ncell:H7:t:per Month :b::1:1:1:l:1:f:1:cf:1\ncell:B8:t:Company Retail Outlets:b:1::::l:1:f:1\ncell:C8:b:1::::l:1:f:4\ncell:D8:b:1::::l:1:f:4\ncell:E8:b:1::::l:1:f:4\ncell:F8:b:1::::l:1:f:4\ncell:G8:b:1::::l:1:f:4\ncell:H8:b:1::::l:1:f:4:ntvf:2\ncell:B9:l:1:f:4\ncell:C9:t:Freeport:l:1:f:4\ncell:D9:v:1000000:l:1:f:4:ntvf:1\ncell:E9:v:20000000:l:1:f:4:ntvf:2\ncell:F9:vtf:n:0.18518518518518517:IF(AND(SUM(D9),SUM(E9)),(SUM(E9)/SUM($E$13)),\"\"):l:1:f:4:ntvf:3\ncell:G9:vtf:n:83333.33333333333:IF(SUM(F9),(D9/12),\"\"):l:1:f:4:ntvf:1\ncell:H9:vtf:n:1666666.6666666667:IF(SUM(G9),(+E9/12),\"\"):l:1:f:4:ntvf:2\ncell:B10:l:1:f:4\ncell:C10:t:Fall River:l:1:f:4\ncell:D10:v:1500000:l:1:f:4:ntvf:1\ncell:E10:v:30000000:l:1:f:4:ntvf:1\ncell:F10:vtf:n:0.2777777777777778:IF(AND(SUM(D10),SUM(E10)),(SUM(E10)/SUM($E$13)),\"\"):l:1:f:4:ntvf:3\ncell:G10:vtf:n:125000:IF(SUM(F10),(D10/12),\"\"):l:1:f:4:ntvf:1\ncell:H10:vtf:n:2500000:IF(SUM(G10),(+E10/12),\"\"):l:1:f:4:ntvf:1\ncell:B11:l:1:f:4\ncell:C11:t:Orlando:l:1:f:4\ncell:D11:v:2000000:l:1:f:4:ntvf:1\ncell:E11:v:40000000:l:1:f:4:ntvf:1\ncell:F11:vtf:n:0.37037037037037035:IF(AND(SUM(D11),SUM(E11)),(SUM(E11)/SUM($E$13)),\"\"):l:1:f:4:ntvf:3\ncell:G11:vtf:n:166666.66666666666:IF(SUM(F11),(D11/12),\"\"):l:1:f:4:ntvf:1\ncell:H11:vtf:n:3333333.3333333335:IF(SUM(G11),(+E11/12),\"\"):l:1:f:4:ntvf:1\ncell:B12:l:1:f:4\ncell:C12:t:Baltimore:b:::1::l:1:f:4\ncell:D12:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E12:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F12:vtf:n:0.16666666666666666:IF(AND(SUM(D12),SUM(E12)),(SUM(E12)/SUM($E$13)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G12:vtf:n:75000:IF(SUM(F12),(D12/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H12:vtf:n:1500000:IF(SUM(G12),(+E12/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B13:l:1:f:4\ncell:C13:t:Total:b:1::::l:1:f:4\ncell:D13:vtf:n:5400000:IF(SUM(D9\\cD12),SUM(D9\\cD12),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E13:vtf:n:108000000:IF(SUM(E9\\cE12),SUM(E9\\cE12),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F13:vtf:n:0.1581259150805271:IF(AND(SUM(D13),SUM(E13)),(E13/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G13:vtf:n:450000:IF(SUM(G9\\cG12),SUM(G9\\cG12),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H13:vtf:n:9000000:IF(SUM(H9\\cH12),SUM(H9\\cH12),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B14:t:Independent Retail Outlets:l:1:f:1\ncell:C14:l:1:f:4\ncell:D14:l:1:f:4:ntvf:1\ncell:E14:l:1:f:4:ntvf:2\ncell:F14:l:1:f:4\ncell:G14:l:1:f:4:ntvf:1\ncell:H14:l:1:f:4:ntvf:2\ncell:B15:l:1:f:4\ncell:C15:t:North Conway:l:1:f:4\ncell:D15:v:1100000:l:1:f:4:ntvf:1\ncell:E15:v:21000000:l:1:f:4:ntvf:2\ncell:F15:vtf:n:0.1926605504587156:IF(AND(SUM(D15),SUM(E15)),(SUM(E15)/SUM($E$19)),\"\"):l:1:f:4:ntvf:3\ncell:G15:vtf:n:91666.66666666667:IF(SUM(F15),(D15/12),\"\"):l:1:f:4:ntvf:1\ncell:H15:vtf:n:1750000:IF(SUM(G15),(+E15/12),\"\"):l:1:f:4:ntvf:2\ncell:B16:l:1:f:4\ncell:C16:t:Nashua:l:1:f:4\ncell:D16:v:1500000:l:1:f:4:ntvf:1\ncell:E16:v:30000000:l:1:f:4:ntvf:1\ncell:F16:vtf:n:0.27522935779816515:IF(AND(SUM(D16),SUM(E16)),(SUM(E16)/SUM($E$19)),\"\"):l:1:f:4:ntvf:3\ncell:G16:vtf:n:125000:IF(SUM(F16),(D16/12),\"\"):l:1:f:4:ntvf:1\ncell:H16:vtf:n:2500000:IF(SUM(G16),(+E16/12),\"\"):l:1:f:4:ntvf:1\ncell:B17:l:1:f:4\ncell:C17:t:Washington, DC:l:1:f:4\ncell:D17:v:2000000:l:1:f:4:ntvf:1\ncell:E17:v:40000000:l:1:f:4:ntvf:1\ncell:F17:vtf:n:0.3669724770642202:IF(AND(SUM(D17),SUM(E17)),(SUM(E17)/SUM($E$19)),\"\"):l:1:f:4:ntvf:3\ncell:G17:vtf:n:166666.66666666666:IF(SUM(F17),(D17/12),\"\"):l:1:f:4:ntvf:1\ncell:H17:vtf:n:3333333.3333333335:IF(SUM(G17),(+E17/12),\"\"):l:1:f:4:ntvf:1\ncell:B18:l:1:f:4\ncell:C18:t:New Bedford:b:::1::l:1:f:4\ncell:D18:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E18:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F18:vtf:n:0.1651376146788991:IF(AND(SUM(D18),SUM(E18)),(SUM(E18)/SUM($E$19)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G18:vtf:n:75000:IF(SUM(F18),(D18/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H18:vtf:n:1500000:IF(SUM(G18),(+E18/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B19:l:1:f:4\ncell:C19:t:Total:b:1::::l:1:f:4\ncell:D19:vtf:n:5500000:IF(SUM(D15\\cD18),SUM(D15\\cD18),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E19:vtf:n:109000000:IF(SUM(E15\\cE18),SUM(E15\\cE18),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F19:vtf:n:0.1595900439238653:IF(AND(SUM(D19),SUM(E19)),(E19/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G19:vtf:n:458333.3333333334:IF(SUM(G15\\cG18),SUM(G15\\cG18),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H19:vtf:n:9083333.333333334:IF(SUM(H15\\cH18),SUM(H15\\cH18),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B20:t:Salaried Sales Force:l:1:f:1\ncell:C20:l:1:f:4\ncell:D20:l:1:f:4:ntvf:1\ncell:E20:l:1:f:4:ntvf:2\ncell:F20:l:1:f:4\ncell:G20:l:1:f:4:ntvf:1\ncell:H20:l:1:f:4:ntvf:2\ncell:B21:l:1:f:4\ncell:C21:t:Northeast:l:1:f:4\ncell:D21:v:1100000:l:1:f:4:ntvf:1\ncell:E21:v:21000000:l:1:f:4:ntvf:2\ncell:F21:vtf:n:0.1926605504587156:IF(AND(SUM(D21),SUM(E21)),(SUM(E21)/SUM($E$25)),\"\"):l:1:f:4:ntvf:3\ncell:G21:vtf:n:91666.66666666667:IF(SUM(F21),(D21/12),\"\"):l:1:f:4:ntvf:1\ncell:H21:vtf:n:1750000:IF(SUM(G21),(+E21/12),\"\"):l:1:f:4:ntvf:2\ncell:B22:l:1:f:4\ncell:C22:t:Mid-Atlantic:l:1:f:4\ncell:D22:v:1500000:l:1:f:4:ntvf:1\ncell:E22:v:30000000:l:1:f:4:ntvf:1\ncell:F22:vtf:n:0.27522935779816515:IF(AND(SUM(D22),SUM(E22)),(SUM(E22)/SUM($E$25)),\"\"):l:1:f:4:ntvf:3\ncell:G22:vtf:n:125000:IF(SUM(F22),(D22/12),\"\"):l:1:f:4:ntvf:1\ncell:H22:vtf:n:2500000:IF(SUM(G22),(+E22/12),\"\"):l:1:f:4:ntvf:1\ncell:B23:l:1:f:4\ncell:C23:t:Southeast:l:1:f:4\ncell:D23:v:2000000:l:1:f:4:ntvf:1\ncell:E23:v:40000000:l:1:f:4:ntvf:1\ncell:F23:vtf:n:0.3669724770642202:IF(AND(SUM(D23),SUM(E23)),(SUM(E23)/SUM($E$25)),\"\"):l:1:f:4:ntvf:3\ncell:G23:vtf:n:166666.66666666666:IF(SUM(F23),(D23/12),\"\"):l:1:f:4:ntvf:1\ncell:H23:vtf:n:3333333.3333333335:IF(SUM(G23),(+E23/12),\"\"):l:1:f:4:ntvf:1\ncell:B24:l:1:f:4\ncell:C24:t:West:b:::1::l:1:f:4\ncell:D24:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E24:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F24:vtf:n:0.1651376146788991:IF(AND(SUM(D24),SUM(E24)),(SUM(E24)/SUM($E$25)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G24:vtf:n:75000:IF(SUM(F24),(D24/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H24:vtf:n:1500000:IF(SUM(G24),(+E24/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B25:l:1:f:4\ncell:C25:t:Total:b:1::::l:1:f:4\ncell:D25:vtf:n:5500000:IF(SUM(D21\\cD24),SUM(D21\\cD24),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E25:vtf:n:109000000:IF(SUM(E21\\cE24),SUM(E21\\cE24),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F25:vtf:n:0.1595900439238653:IF(AND(SUM(D25),SUM(E25)),(E25/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G25:vtf:n:458333.3333333334:IF(SUM(G21\\cG24),SUM(G21\\cG24),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H25:vtf:n:9083333.333333334:IF(SUM(H21\\cH24),SUM(H21\\cH24),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B26:t:Channel 4:l:1:f:1\ncell:C26:l:1:f:4\ncell:D26:l:1:f:4:ntvf:1\ncell:E26:l:1:f:4:ntvf:2\ncell:F26:l:1:f:4\ncell:G26:l:1:f:4:ntvf:1\ncell:H26:l:1:f:4:ntvf:2\ncell:B27:l:1:f:4\ncell:C27:t:Northeast:l:1:f:4\ncell:D27:v:1100000:l:1:f:4:ntvf:1\ncell:E27:v:21000000:l:1:f:4:ntvf:2\ncell:F27:vtf:n:0.1926605504587156:IF(AND(SUM(D27),SUM(E27)),(SUM(E27)/SUM($E$31)),\"\"):l:1:f:4:ntvf:3\ncell:G27:vtf:n:91666.66666666667:IF(SUM(F27),(D27/12),\"\"):l:1:f:4:ntvf:1\ncell:H27:vtf:n:1750000:IF(SUM(G27),(+E27/12),\"\"):l:1:f:4:ntvf:2\ncell:B28:l:1:f:4\ncell:C28:t:Mid-Atlantic:l:1:f:4\ncell:D28:v:1500000:l:1:f:4:ntvf:1\ncell:E28:v:30000000:l:1:f:4:ntvf:1\ncell:F28:vtf:n:0.27522935779816515:IF(AND(SUM(D28),SUM(E28)),(SUM(E28)/SUM($E$31)),\"\"):l:1:f:4:ntvf:3\ncell:G28:vtf:n:125000:IF(SUM(F28),(D28/12),\"\"):l:1:f:4:ntvf:1\ncell:H28:vtf:n:2500000:IF(SUM(G28),(+E28/12),\"\"):l:1:f:4:ntvf:1\ncell:B29:l:1:f:4\ncell:C29:t:Southeast:l:1:f:4\ncell:D29:v:2000000:l:1:f:4:ntvf:1\ncell:E29:v:40000000:l:1:f:4:ntvf:1\ncell:F29:vtf:n:0.3669724770642202:IF(AND(SUM(D29),SUM(E29)),(SUM(E29)/SUM($E$31)),\"\"):l:1:f:4:ntvf:3\ncell:G29:vtf:n:166666.66666666666:IF(SUM(F29),(D29/12),\"\"):l:1:f:4:ntvf:1\ncell:H29:vtf:n:3333333.3333333335:IF(SUM(G29),(+E29/12),\"\"):l:1:f:4:ntvf:1\ncell:B30:l:1:f:4\ncell:C30:t:West:b:::1::l:1:f:4\ncell:D30:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E30:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F30:vtf:n:0.1651376146788991:IF(AND(SUM(D30),SUM(E30)),(SUM(E30)/SUM($E$31)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G30:vtf:n:75000:IF(SUM(F30),(D30/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H30:vtf:n:1500000:IF(SUM(G30),(+E30/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B31:l:1:f:4\ncell:C31:t:Total:b:1::::l:1:f:4\ncell:D31:vtf:n:5500000:IF(SUM(D27\\cD30),SUM(D27\\cD30),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E31:vtf:n:109000000:IF(SUM(E27\\cE30),SUM(E27\\cE30),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F31:vtf:n:0.1595900439238653:IF(AND(SUM(D31),SUM(E31)),(E31/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G31:vtf:n:458333.3333333334:IF(SUM(G27\\cG30),SUM(G27\\cG30),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H31:vtf:n:9083333.333333334:IF(SUM(H27\\cH30),SUM(H27\\cH30),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B32:t:Wholesalers / Company Owned Distributors:l:1:f:1\ncell:C32:l:1:f:4\ncell:D32:l:1:f:4:ntvf:1\ncell:E32:l:1:f:4:ntvf:2\ncell:F32:l:1:f:4\ncell:G32:l:1:f:4:ntvf:1\ncell:H32:l:1:f:4:ntvf:2\ncell:B33:l:1:f:4\ncell:C33:t:New York:l:1:f:4\ncell:D33:v:1100000:l:1:f:4:ntvf:1\ncell:E33:v:21000000:l:1:f:4:ntvf:2\ncell:F33:vtf:n:0.1926605504587156:IF(AND(SUM(D33),SUM(E33)),(SUM(E33)/SUM($E$37)),\"\"):l:1:f:4:ntvf:3\ncell:G33:vtf:n:91666.66666666667:IF(SUM(F33),(D33/12),\"\"):l:1:f:4:ntvf:1\ncell:H33:vtf:n:1750000:IF(SUM(G33),(+E33/12),\"\"):l:1:f:4:ntvf:2\ncell:B34:l:1:f:4\ncell:C34:t:Nashua:l:1:f:4\ncell:D34:v:1500000:l:1:f:4:ntvf:1\ncell:E34:v:30000000:l:1:f:4:ntvf:1\ncell:F34:vtf:n:0.27522935779816515:IF(AND(SUM(D34),SUM(E34)),(SUM(E34)/SUM($E$37)),\"\"):l:1:f:4:ntvf:3\ncell:G34:vtf:n:125000:IF(SUM(F34),(D34/12),\"\"):l:1:f:4:ntvf:1\ncell:H34:vtf:n:2500000:IF(SUM(G34),(+E34/12),\"\"):l:1:f:4:ntvf:1\ncell:B35:l:1:f:4\ncell:C35:t:Washington, DC:l:1:f:4\ncell:D35:v:2000000:l:1:f:4:ntvf:1\ncell:E35:v:40000000:l:1:f:4:ntvf:1\ncell:F35:vtf:n:0.3669724770642202:IF(AND(SUM(D35),SUM(E35)),(SUM(E35)/SUM($E$37)),\"\"):l:1:f:4:ntvf:3\ncell:G35:vtf:n:166666.66666666666:IF(SUM(F35),(D35/12),\"\"):l:1:f:4:ntvf:1\ncell:H35:vtf:n:3333333.3333333335:IF(SUM(G35),(+E35/12),\"\"):l:1:f:4:ntvf:1\ncell:B36:l:1:f:4\ncell:C36:t:Charleston, NC:b:::1::l:1:f:4\ncell:D36:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E36:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F36:vtf:n:0.1651376146788991:IF(AND(SUM(D36),SUM(E36)),(SUM(E36)/SUM($E$37)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G36:vtf:n:75000:IF(SUM(F36),(D36/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H36:vtf:n:1500000:IF(SUM(G36),(+E36/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B37:l:1:f:4\ncell:C37:t:Total:b:1::::l:1:f:4\ncell:D37:vtf:n:5500000:IF(SUM(D33\\cD36),SUM(D33\\cD36),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E37:vtf:n:109000000:IF(SUM(E33\\cE36),SUM(E33\\cE36),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F37:vtf:n:0.1595900439238653:IF(AND(SUM(D37),SUM(E37)),(E37/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G37:vtf:n:458333.3333333334:IF(SUM(G33\\cG36),SUM(G33\\cG36),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H37:vtf:n:9083333.333333334:IF(SUM(H33\\cH36),SUM(H33\\cH36),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B38:t:Wholesalers / Independent Distributors:l:1:f:1\ncell:C38:l:1:f:4\ncell:D38:l:1:f:4:ntvf:1\ncell:E38:l:1:f:4:ntvf:2\ncell:F38:l:1:f:4\ncell:G38:l:1:f:4:ntvf:1\ncell:H38:l:1:f:4:ntvf:2\ncell:B39:l:1:f:4\ncell:C39:t:Springfield:l:1:f:4\ncell:D39:v:1100000:l:1:f:4:ntvf:1\ncell:E39:v:21000000:l:1:f:4:ntvf:2\ncell:F39:vtf:n:0.1926605504587156:IF(AND(SUM(D39),SUM(E39)),(SUM(E39)/SUM($E$43)),\"\"):l:1:f:4:ntvf:3\ncell:G39:vtf:n:91666.66666666667:IF(SUM(F39),(D39/12),\"\"):l:1:f:4:ntvf:1\ncell:H39:vtf:n:1750000:IF(SUM(G39),(+E39/12),\"\"):l:1:f:4:ntvf:2\ncell:B40:l:1:f:4\ncell:C40:t:Cambridge:l:1:f:4\ncell:D40:v:1500000:l:1:f:4:ntvf:1\ncell:E40:v:30000000:l:1:f:4:ntvf:1\ncell:F40:vtf:n:0.27522935779816515:IF(AND(SUM(D40),SUM(E40)),(SUM(E40)/SUM($E$43)),\"\"):l:1:f:4:ntvf:3\ncell:G40:vtf:n:125000:IF(SUM(F40),(D40/12),\"\"):l:1:f:4:ntvf:1\ncell:H40:vtf:n:2500000:IF(SUM(G40),(+E40/12),\"\"):l:1:f:4:ntvf:1\ncell:B41:l:1:f:4\ncell:C41:t:Chicago:l:1:f:4\ncell:D41:v:2000000:l:1:f:4:ntvf:1\ncell:E41:v:40000000:l:1:f:4:ntvf:1\ncell:F41:vtf:n:0.3669724770642202:IF(AND(SUM(D41),SUM(E41)),(SUM(E41)/SUM($E$43)),\"\"):l:1:f:4:ntvf:3\ncell:G41:vtf:n:166666.66666666666:IF(SUM(F41),(D41/12),\"\"):l:1:f:4:ntvf:1\ncell:H41:vtf:n:3333333.3333333335:IF(SUM(G41),(+E41/12),\"\"):l:1:f:4:ntvf:1\ncell:B42:l:1:f:4\ncell:C42:t:San Francisco:b:::1::l:1:f:4\ncell:D42:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E42:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F42:vtf:n:0.1651376146788991:IF(AND(SUM(D42),SUM(E42)),(SUM(E42)/SUM($E$43)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G42:vtf:n:75000:IF(SUM(F42),(D42/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H42:vtf:n:1500000:IF(SUM(G42),(+E42/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B43:l:1:f:4\ncell:C43:t:Total:b:1::::l:1:f:4\ncell:D43:vtf:n:5500000:IF(SUM(D39\\cD42),SUM(D39\\cD42),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E43:vtf:n:109000000:IF(SUM(E39\\cE42),SUM(E39\\cE42),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F43:vtf:n:0.1595900439238653:IF(AND(SUM(D43),SUM(E43)),(E43/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G43:vtf:n:458333.3333333334:IF(SUM(G39\\cG42),SUM(G39\\cG42),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H43:vtf:n:9083333.333333334:IF(SUM(H39\\cH42),SUM(H39\\cH42),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B44:t:Other:l:1:f:1\ncell:C44:l:1:f:4\ncell:D44:l:1:f:4:ntvf:1\ncell:E44:l:1:f:4:ntvf:2\ncell:F44:l:1:f:4\ncell:G44:l:1:f:4:ntvf:1\ncell:H44:l:1:f:4:ntvf:2\ncell:B45:l:1:f:4\ncell:C45:t:On-Line / Mail Order:l:1:f:4\ncell:D45:v:1500000:l:1:f:4:ntvf:1\ncell:E45:v:30000000:l:1:f:4:ntvf:2\ncell:F45:vtf:n:1:IF(AND(SUM(D45),SUM(E45)),(SUM(E45)/SUM($E$47)),\"\"):l:1:f:4:ntvf:3\ncell:G45:vtf:n:125000:IF(SUM(F45),(D45/12),\"\"):l:1:f:4:ntvf:1\ncell:H45:vtf:n:2500000:IF(SUM(G45),(+E45/12),\"\"):l:1:f:4:ntvf:2\ncell:B46:l:1:f:4\ncell:C46:b:::1::l:1:f:4\ncell:D46:b:::1::l:1:f:4:ntvf:1\ncell:E46:b:::1::l:1:f:4:ntvf:1\ncell:F46:vtf:t::IF(AND(SUM(D46),SUM(E46)),(SUM(E46)/SUM($E$47)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G46:vtf:t::IF(SUM(F46),(D46/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H46:vtf:t::IF(SUM(G46),(+E46/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B47:l:1:f:4\ncell:C47:t:Total:b:1::::l:1:f:4\ncell:D47:vtf:n:1500000:IF(SUM(D45\\cD46),SUM(D45\\cD46),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:E47:vtf:n:30000000:IF(SUM(E45\\cE46),SUM(E45\\cE46),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:F47:vtf:n:1:IF(SUM(F45\\cF46),SUM(F45\\cF46),\"\"):b:1::1::l:1:f:4:ntvf:3\ncell:G47:vtf:n:125000:IF(SUM(G45\\cG46),SUM(G45\\cG46),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:H47:vtf:n:2500000:IF(SUM(H45\\cH46),SUM(H45\\cH46),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:B48:t:Totals for all Channels:l:1:f:1\ncell:C48:l:1:f:4\ncell:D48:vtf:n:34400000:IF(SUM(D13,D19,D25,D31,D37,D43,D47),SUM(D13,D19,D25,D31,D37,D43,D47),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:E48:vtf:n:683000000:IF(SUM(E13,E19,E25,E31,E37,E43,E47),SUM(E13,E19,E25,E31,E37,E43,E47),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:F48:vtf:n:1:IF(AND(SUM(D48\\cE48),SUM(E48)),(SUM(E48)/SUM(E48)),\"\"):b:1::1::l:1:f:4:ntvf:3\ncell:G48:vtf:n:2866666.6666666665:IF(SUM(F48),(D48/12),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:H48:vtf:n:56916666.666666664:IF(SUM(G48),(+E48/12),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:D49:b:1::::l:1:f:4\ncell:E49:b:1::::l:1:f:4\ncell:F49:b:1::::l:1:f:4\ncell:G49:b:1::::l:1:f:4\ncell:H49:b:1::::l:1:f:4\ncell:B50:t:© Copyright, 2011, Jaxworks, All Rights Reserved.:l:1:f:4\ncol:A:w:12\ncol:B:w:285\ncol:C:w:156\ncol:D:w:100\ncol:E:w:118\ncol:F:w:71\ncol:G:w:90\ncol:H:w:108\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nsheet:c:8:r:50:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:normal bold 10pt Arial\nfont:2:normal bold 14pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:3:0.0%\nvalueformat:4:mmmm d, yyyy\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet901","hidden":"1"},"sheet17":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Revenue:l:1:f:8:c:3:bg:1:cf:1:ntvf:1:colspan:5\ncell:D3:l:1:f:4:cf:1\ncell:E3:l:1:f:3:cf:1:ntvf:1\ncell:F3:l:1:f:3:cf:1:ntvf:1\ncell:G3:l:1:f:3:cf:1:ntvf:1\ncell:C4:t: XYZ, Inc. :l:1:f:7:cf:1:ntvf:1\ncell:D4:l:1:f:4\ncell:E4:l:1:f:2:cf:1:ntvf:1\ncell:F4:l:1:f:2:cf:1:ntvf:1\ncell:G4:l:1:f:2:cf:1:ntvf:1\ncell:C5:t: 2009 Sales:l:1:f:5:cf:1:ntvf:3\ncell:D5:l:1\ncell:E5:l:1:f:2:cf:1:ntvf:1\ncell:F5:l:1:f:2:cf:1:ntvf:1\ncell:G5:l:1:f:2:cf:1:ntvf:1\ncell:C6:l:1\ncell:D6:l:1:f:4:ntvf:1\ncell:E6:l:1:f:4:ntvf:1\ncell:F6:l:1:f:4:ntvf:1\ncell:G6:l:1:f:4:ntvf:1\ncell:C7:l:1:f:4:ntvf:1\ncell:D7:t: Retail :l:1:f:7:cf:1:ntvf:1\ncell:E7:t: Wholesale :l:1:f:7:cf:1:ntvf:1\ncell:F7:t: Mail Order :l:1:f:7:cf:1:ntvf:1\ncell:G7:t:Total Sales:l:1:f:7:cf:1:ntvf:1\ncell:C8:t: Camping Gear :l:1:f:7:ntvf:1\ncell:D8:l:1:f:4:ntvf:1\ncell:E8:l:1:f:4:ntvf:1\ncell:F8:l:1:f:4:ntvf:1\ncell:G8:l:1:f:4:ntvf:1\ncell:C9:t:Product:l:1:f:1:ntvf:1\ncell:D9:v:18000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:E9:v:24000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:F9:v:10000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:G9:vtf:n:52000:IF(SUM(D9\\cF9),SUM(D9\\cF9),\"\"):l:1:f:1:ntvf:2\ncell:H9:f:1\ncell:C10:t:Product:l:1:f:1:bg:2:ntvf:1\ncell:D10:v:14000:b:1:1:1:1:l:1:f:1:bg:2:ntvf:2\ncell:E10:v:15000:b:1:1:1:1:l:1:f:1:bg:2:ntvf:2\ncell:F10:v:9000:b:1:1:1:1:l:1:f:1:bg:2:ntvf:2\ncell:G10:vtf:n:38000:IF(SUM(D10\\cF10),SUM(D10\\cF10),\"\"):l:1:f:1:bg:2:ntvf:2\ncell:H10:f:1\ncell:C11:t:Product:l:1:f:1:ntvf:1\ncell:D11:v:8000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:E11:v:11000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:F11:v:7000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:G11:vtf:n:26000:IF(SUM(D11\\cF11),SUM(D11\\cF11),\"\"):l:1:f:1:ntvf:2\ncell:H11:f:1\ncell:C12:t:Product:l:1:f:1:bg:2:ntvf:1\ncell:D12:v:4000:b:1:1:1:1:l:1:f:1:bg:2:ntvf:2\ncell:E12:v:6000:b:1:1:1:1:l:1:f:1:bg:2:ntvf:2\ncell:F12:v:6000:b:1:1:1:1:l:1:f:1:bg:2:ntvf:2\ncell:G12:vtf:n:16000:IF(SUM(D12\\cF12),SUM(D12\\cF12),\"\"):l:1:f:1:bg:2:ntvf:2\ncell:H12:f:1\ncell:C13:t:Product:l:1:f:1:ntvf:1\ncell:D13:v:2000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:E13:v:3000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:F13:v:3000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:G13:vtf:n:8000:IF(SUM(D13\\cF13),SUM(D13\\cF13),\"\"):l:1:f:1:ntvf:2\ncell:H13:f:1\ncell:C14:l:1:f:1:ntvf:1\ncell:D14:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:E14:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:F14:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:G14:l:1:f:1:ntvf:2\ncell:H14:f:1\ncell:C15:t:Total :l:1:f:6:cf:2:ntvf:1\ncell:D15:vtf:n:46000:IF(SUM(D9\\cD13),SUM(D9\\cD13),\"\"):b:1::1::l:1:f:6:ntvf:2\ncell:E15:vtf:n:59000:IF(SUM(E9\\cE13),SUM(E9\\cE13),\"\"):b:1::1::l:1:f:6:ntvf:2\ncell:F15:vtf:n:35000:IF(SUM(F9\\cF13),SUM(F9\\cF13),\"\"):b:1::1::l:1:f:6:ntvf:2\ncell:G15:vtf:n:140000:IF(SUM(G9\\cG13),SUM(G9\\cG13),\"\"):b:1::1::l:1:f:6:ntvf:2\ncell:H15:f:6\ncol:A:w:10\ncol:B:w:10\ncol:C:w:309\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nsheet:c:8:r:15:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt Arial\nfont:6:normal normal 14pt *\nfont:7:normal normal 16pt Arial\nfont:8:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:#,##0.00;(#,##0.00)\nvalueformat:2:#,##0;(#,##0)\nvalueformat:3:@\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::C9\\c#REF!\nname:DATA_04::F9\\c#REF!\n"},"name":"sheet10","hidden":"1"},"sheet18":{"sheetstr":{"savestr":"version:1.5\ncell:B3:l:1:f:6:ntvf:1\ncell:C3:t:Sales Revenue:b:::1::l:2:f:5:cf:2:ntvf:1\ncell:D3:b:::1::l:2:f:6:cf:1\ncell:E3:b:::1::l:2:f:5:cf:1:ntvf:1\ncell:F3:b:::1::l:2:f:5:cf:1:ntvf:1\ncell:G3:b:::1::l:2:f:5:cf:1:ntvf:1\ncell:B4:l:1:f:6:ntvf:1\ncell:C4:t: XYZ, Inc. :b:1::::l:2:f:4:cf:1:ntvf:1\ncell:D4:b:1::::l:1:f:6\ncell:E4:b:1::::l:2:f:3:cf:1:ntvf:1\ncell:F4:b:1::::l:2:f:3:cf:1:ntvf:1\ncell:G4:b:1::::l:2:f:3:cf:1:ntvf:1\ncell:B5:l:1:f:6:ntvf:1\ncell:C5:t: 2009 Sales:l:2:f:3:cf:1:ntvf:3\ncell:E5:l:2:f:3:cf:1:ntvf:1\ncell:F5:l:2:f:3:cf:1:ntvf:1\ncell:G5:l:2:f:3:cf:1:ntvf:1\ncell:B6:l:1:f:6:ntvf:1\ncell:D6:b:::1::l:1:f:6:ntvf:1\ncell:E6:b:::1::l:1:f:6:ntvf:1\ncell:F6:b:::1::l:1:f:6:ntvf:1\ncell:G6:b:::1::l:1:f:6:ntvf:1\ncell:B7:l:1:f:6:ntvf:1\ncell:C7:b::1:::l:1:f:6:ntvf:1\ncell:D7:t: Retail :b:1::1:1:l:2:f:1:cf:3:ntvf:1\ncell:E7:t: Wholesale :b:1::1::l:2:f:1:cf:3:ntvf:1\ncell:F7:t: Mail Order :b:1::1::l:2:f:1:cf:3:ntvf:1\ncell:G7:t:Total Sales:b:1:1:1::l:2:f:1:cf:3:ntvf:1\ncell:B8:t: Camping Gear :l:1:f:2:ntvf:1\ncell:C8:l:1:f:1:ntvf:1\ncell:D8:b:1::::l:1:f:6:ntvf:1\ncell:E8:b:1::::l:1:f:6:ntvf:1\ncell:F8:b:1:1:::l:1:f:6:ntvf:1\ncell:G8:b:1:::1:l:1:f:6:ntvf:1\ncell:B9:l:1:f:6:ntvf:1\ncell:C9:t:Product:l:1:f:6:ntvf:1\ncell:D9:v:18000:l:1:f:6:ntvf:2\ncell:E9:v:24000:l:1:f:6:ntvf:2\ncell:F9:v:10000:b::1:::l:1:f:6:ntvf:2\ncell:G9:vtf:n:52000:IF(SUM(D9\\cF9),SUM(D9\\cF9),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B10:l:1:f:6:ntvf:1\ncell:C10:t:Product:l:1:f:6:ntvf:1\ncell:D10:v:14000:l:1:f:6:ntvf:2\ncell:E10:v:15000:l:1:f:6:ntvf:2\ncell:F10:v:9000:b::1:::l:1:f:6:ntvf:2\ncell:G10:vtf:n:38000:IF(SUM(D10\\cF10),SUM(D10\\cF10),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B11:l:1:f:6:ntvf:1\ncell:C11:t:Product:l:1:f:6:ntvf:1\ncell:D11:v:8000:l:1:f:6:ntvf:2\ncell:E11:v:11000:l:1:f:6:ntvf:2\ncell:F11:v:7000:b::1:::l:1:f:6:ntvf:2\ncell:G11:vtf:n:26000:IF(SUM(D11\\cF11),SUM(D11\\cF11),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B12:l:1:f:6:ntvf:1\ncell:C12:t:Product:l:1:f:6:ntvf:1\ncell:D12:v:4000:l:1:f:6:ntvf:2\ncell:E12:v:6000:l:1:f:6:ntvf:2\ncell:F12:v:6000:b::1:::l:1:f:6:ntvf:2\ncell:G12:vtf:n:16000:IF(SUM(D12\\cF12),SUM(D12\\cF12),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B13:l:1:f:6:ntvf:1\ncell:C13:t:Product:l:1:f:6:ntvf:1\ncell:D13:v:2000:l:1:f:6:ntvf:2\ncell:E13:v:3000:l:1:f:6:ntvf:2\ncell:F13:v:3000:b::1:::l:1:f:6:ntvf:2\ncell:G13:vtf:n:8000:IF(SUM(D13\\cF13),SUM(D13\\cF13),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B14:l:1:f:6:ntvf:1\ncell:C14:t:Total :l:2:f:1:cf:3:ntvf:1\ncell:D14:vtf:n:46000:IF(SUM(D9\\cD13),SUM(D9\\cD13),\"\"):l:2:f:1:ntvf:2\ncell:E14:vtf:n:59000:IF(SUM(E9\\cE13),SUM(E9\\cE13),\"\"):l:2:f:1:ntvf:2\ncell:F14:vtf:n:35000:IF(SUM(F9\\cF13),SUM(F9\\cF13),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G14:vtf:n:140000:IF(SUM(G9\\cG13),SUM(G9\\cG13),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:B15:l:1:f:6:ntvf:1\ncell:C15:l:1:f:6:ntvf:1\ncell:D15:l:1:f:6:ntvf:2\ncell:E15:l:1:f:6:ntvf:2\ncell:F15:b::1:::l:1:f:6:ntvf:2\ncell:G15:b::::1:l:1:f:6:ntvf:2\ncell:B16:t: Mountain Climbing :l:1:f:2:ntvf:1\ncell:C16:l:1:f:1:ntvf:1\ncell:D16:l:1:f:6:ntvf:2\ncell:E16:l:1:f:6:ntvf:2\ncell:F16:b::1:::l:1:f:6:ntvf:2\ncell:G16:b::::1:l:1:f:6:ntvf:2\ncell:B17:l:1:f:6:ntvf:1\ncell:C17:t:Product:l:1:f:6:ntvf:1\ncell:D17:v:4000:l:1:f:6:ntvf:2\ncell:E17:v:8000:l:1:f:6:ntvf:2\ncell:F17:v:6500:b::1:::l:1:f:6:ntvf:2\ncell:G17:vtf:n:18500:IF(SUM(D17\\cF17),SUM(D17\\cF17),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B18:l:1:f:6:ntvf:1\ncell:C18:t:Product:l:1:f:6:ntvf:1\ncell:D18:v:7000:l:1:f:6:ntvf:2\ncell:E18:v:15000:l:1:f:6:ntvf:2\ncell:F18:v:9000:b::1:::l:1:f:6:ntvf:2\ncell:G18:vtf:n:31000:IF(SUM(D18\\cF18),SUM(D18\\cF18),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B19:l:1:f:6:ntvf:1\ncell:C19:t:Product:l:1:f:6:ntvf:1\ncell:D19:v:6000:l:1:f:6:ntvf:2\ncell:E19:v:11000:l:1:f:6:ntvf:2\ncell:F19:v:8000:b::1:::l:1:f:6:ntvf:2\ncell:G19:vtf:n:25000:IF(SUM(D19\\cF19),SUM(D19\\cF19),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B20:l:1:f:6:ntvf:1\ncell:C20:t:Product:l:1:f:6:ntvf:1\ncell:D20:v:3000:l:1:f:6:ntvf:2\ncell:E20:v:5500:l:1:f:6:ntvf:2\ncell:F20:v:4500:b::1:::l:1:f:6:ntvf:2\ncell:G20:vtf:n:13000:IF(SUM(D20\\cF20),SUM(D20\\cF20),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B21:l:1:f:6:ntvf:1\ncell:C21:t:Product:l:1:f:6:ntvf:1\ncell:D21:v:2000:l:1:f:6:ntvf:2\ncell:E21:v:3500:l:1:f:6:ntvf:2\ncell:F21:v:3000:b::1:::l:1:f:6:ntvf:2\ncell:G21:vtf:n:8500:IF(SUM(D21\\cF21),SUM(D21\\cF21),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B22:l:1:f:6:ntvf:1\ncell:C22:t:Total :l:2:f:1:cf:3:ntvf:1\ncell:D22:vtf:n:22000:IF(SUM(D17\\cD21),SUM(D17\\cD21),\"\"):l:2:f:1:ntvf:2\ncell:E22:vtf:n:43000:IF(SUM(E17\\cE21),SUM(E17\\cE21),\"\"):l:2:f:1:ntvf:2\ncell:F22:vtf:n:31000:IF(SUM(F17\\cF21),SUM(F17\\cF21),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G22:vtf:n:96000:IF(SUM(G17\\cG21),SUM(G17\\cG21),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:B23:l:1:f:6:ntvf:1\ncell:C23:l:1:f:6:ntvf:1\ncell:D23:l:1:f:6:ntvf:2\ncell:E23:l:1:f:6:ntvf:2\ncell:F23:b::1:::l:1:f:6:ntvf:2\ncell:G23:b::::1:l:1:f:6:ntvf:2\ncell:B24:t: Men's Clothing :l:1:f:2:ntvf:1\ncell:C24:l:1:f:1:ntvf:1\ncell:D24:l:1:f:6:ntvf:2\ncell:E24:l:1:f:6:ntvf:2\ncell:F24:b::1:::l:1:f:6:ntvf:2\ncell:G24:b::::1:l:1:f:6:ntvf:2\ncell:B25:l:1:f:6:ntvf:1\ncell:C25:t:Product:l:1:f:6:ntvf:1\ncell:D25:v:16000:l:1:f:6:ntvf:2\ncell:E25:v:30000:l:1:f:6:ntvf:2\ncell:F25:v:15000:b::1:::l:1:f:6:ntvf:2\ncell:G25:vtf:n:61000:IF(SUM(D25\\cF25),SUM(D25\\cF25),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B26:l:1:f:6:ntvf:1\ncell:C26:t:Product:l:1:f:6:ntvf:1\ncell:D26:v:18000:l:1:f:6:ntvf:2\ncell:E26:v:32000:l:1:f:6:ntvf:2\ncell:F26:v:18000:b::1:::l:1:f:6:ntvf:2\ncell:G26:vtf:n:68000:IF(SUM(D26\\cF26),SUM(D26\\cF26),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B27:l:1:f:6:ntvf:1\ncell:C27:t:Product:l:1:f:6:ntvf:1\ncell:D27:v:24000:l:1:f:6:ntvf:2\ncell:E27:v:46000:l:1:f:6:ntvf:2\ncell:F27:v:38000:b::1:::l:1:f:6:ntvf:2\ncell:G27:vtf:n:108000:IF(SUM(D27\\cF27),SUM(D27\\cF27),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B28:l:1:f:6:ntvf:1\ncell:C28:t:Product:l:1:f:6:ntvf:1\ncell:D28:v:16000:l:1:f:6:ntvf:2\ncell:E28:v:32000:l:1:f:6:ntvf:2\ncell:F28:v:19000:b::1:::l:1:f:6:ntvf:2\ncell:G28:vtf:n:67000:IF(SUM(D28\\cF28),SUM(D28\\cF28),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B29:l:1:f:6:ntvf:1\ncell:C29:t:Product:l:1:f:6:ntvf:1\ncell:D29:v:8000:l:1:f:6:ntvf:2\ncell:E29:v:12000:l:1:f:6:ntvf:2\ncell:F29:v:10000:b::1:::l:1:f:6:ntvf:2\ncell:G29:vtf:n:30000:IF(SUM(D29\\cF29),SUM(D29\\cF29),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B30:l:1:f:6:ntvf:1\ncell:C30:t:Total :l:2:f:1:cf:3:ntvf:1\ncell:D30:vtf:n:82000:IF(SUM(D25\\cD29),SUM(D25\\cD29),\"\"):l:2:f:1:ntvf:2\ncell:E30:vtf:n:152000:IF(SUM(E25\\cE29),SUM(E25\\cE29),\"\"):l:2:f:1:ntvf:2\ncell:F30:vtf:n:100000:IF(SUM(F25\\cF29),SUM(F25\\cF29),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G30:vtf:n:334000:IF(SUM(G25\\cG29),SUM(G25\\cG29),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:B31:l:1:f:6:ntvf:1\ncell:C31:l:1:f:6:ntvf:1\ncell:D31:l:1:f:6:ntvf:2\ncell:E31:l:1:f:6:ntvf:2\ncell:F31:b::1:::l:1:f:6:ntvf:2\ncell:G31:b::::1:l:1:f:6:ntvf:2\ncell:B32:t: Women's Clothing :l:1:f:2:ntvf:1\ncell:C32:l:1:f:1:ntvf:1\ncell:D32:l:1:f:6:ntvf:2\ncell:E32:l:1:f:6:ntvf:2\ncell:F32:b::1:::l:1:f:6:ntvf:2\ncell:G32:b::::1:l:1:f:6:ntvf:2\ncell:B33:l:1:f:6:ntvf:1\ncell:C33:t:Product:l:1:f:6:ntvf:1\ncell:D33:v:13000:l:1:f:6:ntvf:2\ncell:E33:v:26000:l:1:f:6:ntvf:2\ncell:F33:v:12000:b::1:::l:1:f:6:ntvf:2\ncell:G33:vtf:n:51000:IF(SUM(D33\\cF33),SUM(D33\\cF33),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B34:l:1:f:6:ntvf:1\ncell:C34:t:Product:l:1:f:6:ntvf:1\ncell:D34:v:17000:l:1:f:6:ntvf:2\ncell:E34:v:32000:l:1:f:6:ntvf:2\ncell:F34:v:15000:b::1:::l:1:f:6:ntvf:2\ncell:G34:vtf:n:64000:IF(SUM(D34\\cF34),SUM(D34\\cF34),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B35:l:1:f:6:ntvf:1\ncell:C35:t:Product:l:1:f:6:ntvf:1\ncell:D35:v:21000:l:1:f:6:ntvf:2\ncell:E35:v:42000:l:1:f:6:ntvf:2\ncell:F35:v:33000:b::1:::l:1:f:6:ntvf:2\ncell:G35:vtf:n:96000:IF(SUM(D35\\cF35),SUM(D35\\cF35),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B36:l:1:f:6:ntvf:1\ncell:C36:t:Product:l:1:f:6:ntvf:1\ncell:D36:v:11000:l:1:f:6:ntvf:2\ncell:E36:v:19000:l:1:f:6:ntvf:2\ncell:F36:v:17500:b::1:::l:1:f:6:ntvf:2\ncell:G36:vtf:n:47500:IF(SUM(D36\\cF36),SUM(D36\\cF36),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B37:l:1:f:6:ntvf:1\ncell:C37:t:Product:l:1:f:6:ntvf:1\ncell:D37:v:6500:l:1:f:6:ntvf:2\ncell:E37:v:11500:l:1:f:6:ntvf:2\ncell:F37:v:8500:b::1:::l:1:f:6:ntvf:2\ncell:G37:vtf:n:26500:IF(SUM(D37\\cF37),SUM(D37\\cF37),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B38:l:1:f:6:ntvf:1\ncell:C38:t:Total :l:2:f:1:cf:3:ntvf:1\ncell:D38:vtf:n:68500:IF(SUM(D33\\cD37),SUM(D33\\cD37),\"\"):l:2:f:1:ntvf:2\ncell:E38:vtf:n:130500:IF(SUM(E33\\cE37),SUM(E33\\cE37),\"\"):l:2:f:1:ntvf:2\ncell:F38:vtf:n:86000:IF(SUM(F33\\cF37),SUM(F33\\cF37),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G38:vtf:n:285000:IF(SUM(G33\\cG37),SUM(G33\\cG37),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:B39:l:1:f:6:ntvf:1\ncell:C39:l:1:f:6:ntvf:1\ncell:D39:l:1:f:6:ntvf:2\ncell:E39:l:1:f:6:ntvf:2\ncell:F39:b::1:::l:1:f:6:ntvf:2\ncell:G39:b::::1:l:1:f:6:ntvf:2\ncell:B40:t: Kids Corner :l:1:f:2:ntvf:1\ncell:C40:l:1:f:1:ntvf:1\ncell:D40:l:1:f:6:ntvf:2\ncell:E40:l:1:f:6:ntvf:2\ncell:F40:b::1:::l:1:f:6:ntvf:2\ncell:G40:b::::1:l:1:f:6:ntvf:2\ncell:B41:l:1:f:6:ntvf:1\ncell:C41:t:Product:l:1:f:6:ntvf:1\ncell:D41:v:7000:l:1:f:6:ntvf:2\ncell:E41:v:13000:l:1:f:6:ntvf:2\ncell:F41:v:9000:b::1:::l:1:f:6:ntvf:2\ncell:G41:vtf:n:29000:IF(SUM(D41\\cF41),SUM(D41\\cF41),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B42:l:1:f:6:ntvf:1\ncell:C42:t:Product:l:1:f:6:ntvf:1\ncell:D42:v:8500:l:1:f:6:ntvf:2\ncell:E42:v:16000:l:1:f:6:ntvf:2\ncell:F42:v:11000:b::1:::l:1:f:6:ntvf:2\ncell:G42:vtf:n:35500:IF(SUM(D42\\cF42),SUM(D42\\cF42),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B43:l:1:f:6:ntvf:1\ncell:C43:t:Product:l:1:f:6:ntvf:1\ncell:D43:v:13000:l:1:f:6:ntvf:2\ncell:E43:v:22000:l:1:f:6:ntvf:2\ncell:F43:v:17000:b::1:::l:1:f:6:ntvf:2\ncell:G43:vtf:n:52000:IF(SUM(D43\\cF43),SUM(D43\\cF43),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B44:l:1:f:6:ntvf:1\ncell:C44:t:Product:l:1:f:6:ntvf:1\ncell:D44:v:6000:l:1:f:6:ntvf:2\ncell:E44:v:11000:l:1:f:6:ntvf:2\ncell:F44:v:9000:b::1:::l:1:f:6:ntvf:2\ncell:G44:vtf:n:26000:IF(SUM(D44\\cF44),SUM(D44\\cF44),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B45:l:1:f:6:ntvf:1\ncell:C45:t:Product:l:1:f:6:ntvf:1\ncell:D45:v:4000:l:1:f:6:ntvf:2\ncell:E45:v:7000:l:1:f:6:ntvf:2\ncell:F45:v:6500:b::1:::l:1:f:6:ntvf:2\ncell:G45:vtf:n:17500:IF(SUM(D45\\cF45),SUM(D45\\cF45),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B46:l:1:f:6:ntvf:1\ncell:C46:t:Total :l:2:f:1:cf:3:ntvf:1\ncell:D46:vtf:n:38500:IF(SUM(D41\\cD45),SUM(D41\\cD45),\"\"):l:2:f:1:ntvf:2\ncell:E46:vtf:n:69000:IF(SUM(E41\\cE45),SUM(E41\\cE45),\"\"):l:2:f:1:ntvf:2\ncell:F46:vtf:n:52500:IF(SUM(F41\\cF45),SUM(F41\\cF45),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G46:vtf:n:160000:IF(SUM(G41\\cG45),SUM(G41\\cG45),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:C49:l:1:f:6\ncol:B:w:162\ncol:C:w:309\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:15\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:15\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:15\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:15\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:49:h:14.25\nsheet:c:7:r:49:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\nfont:1:normal bold 10pt Arial\nfont:2:normal bold 11pt Arial\nfont:3:normal bold 12pt Arial\nfont:4:normal bold 16pt Arial\nfont:5:normal bold 26pt Times New Roman\nfont:6:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00;(#,##0.00)\nvalueformat:2:#,##0;(#,##0)\nvalueformat:3:@\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet12","hidden":"1"},"sheet19":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Revenue:b:::1::l:2:f:4:cf:1:ntvf:1:colspan:5\ncell:D3:b:::1::l:2:f:5:cf:1\ncell:E3:b:::1::l:2:f:4:cf:1:ntvf:1\ncell:F3:b:::1::l:2:f:4:cf:1:ntvf:1\ncell:G3:b:::1::l:2:f:4:cf:1:ntvf:1\ncell:C4:t: XYZ, Inc. :b:1::::l:2:f:3:cf:1:ntvf:1\ncell:D4:b:1::::l:1:f:5\ncell:E4:b:1::::l:2:f:2:cf:1:ntvf:1\ncell:F4:b:1::::l:2:f:2:cf:1:ntvf:1\ncell:G4:b:1::::l:2:f:2:cf:1:ntvf:1\ncell:C5:t: 2009 Sales:l:2:f:2:cf:1:ntvf:3\ncell:E5:l:2:f:2:cf:1:ntvf:1\ncell:F5:l:2:f:2:cf:1:ntvf:1\ncell:G5:l:2:f:2:cf:1:ntvf:1\ncell:D6:b:::1::l:1:f:5:ntvf:1\ncell:E6:b:::1::l:1:f:5:ntvf:1\ncell:F6:b:::1::l:1:f:5:ntvf:1\ncell:G6:b:::1::l:1:f:5:ntvf:1\ncell:C7:b::1:::l:1:f:5:ntvf:1\ncell:D7:t: Retail :b:1::1:1:l:2:f:1:cf:2:ntvf:1\ncell:E7:t: Wholesale :b:1::1::l:2:f:1:cf:2:ntvf:1\ncell:F7:t: Mail Order :b:1::1::l:2:f:1:cf:2:ntvf:1\ncell:G7:t:Total Sales:b:1:1:1::l:2:f:1:cf:2:ntvf:1\ncell:C8:t: Camping Gear :l:1:f:1:ntvf:1\ncell:D8:b:1::::l:1:f:5:ntvf:1\ncell:E8:b:1::::l:1:f:5:ntvf:1\ncell:F8:b:1:1:::l:1:f:5:ntvf:1\ncell:G8:b:1:::1:l:1:f:5:ntvf:1\ncell:C9:t:Product:l:1:f:5:ntvf:1\ncell:D9:v:18000:l:1:f:5:ntvf:2\ncell:E9:v:24000:l:1:f:5:ntvf:2\ncell:F9:v:10000:b::1:::l:1:f:5:ntvf:2\ncell:G9:vtf:n:52000:IF(SUM(D9\\cF9),SUM(D9\\cF9),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C10:t:Product:l:1:f:5:ntvf:1\ncell:D10:v:14000:l:1:f:5:ntvf:2\ncell:E10:v:15000:l:1:f:5:ntvf:2\ncell:F10:v:9000:b::1:::l:1:f:5:ntvf:2\ncell:G10:vtf:n:38000:IF(SUM(D10\\cF10),SUM(D10\\cF10),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C11:t:Product:l:1:f:5:ntvf:1\ncell:D11:v:8000:l:1:f:5:ntvf:2\ncell:E11:v:11000:l:1:f:5:ntvf:2\ncell:F11:v:7000:b::1:::l:1:f:5:ntvf:2\ncell:G11:vtf:n:26000:IF(SUM(D11\\cF11),SUM(D11\\cF11),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C12:t:Product:l:1:f:5:ntvf:1\ncell:D12:v:4000:l:1:f:5:ntvf:2\ncell:E12:v:6000:l:1:f:5:ntvf:2\ncell:F12:v:6000:b::1:::l:1:f:5:ntvf:2\ncell:G12:vtf:n:16000:IF(SUM(D12\\cF12),SUM(D12\\cF12),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C13:t:Product:l:1:f:5:ntvf:1\ncell:D13:v:2000:l:1:f:5:ntvf:2\ncell:E13:v:3000:l:1:f:5:ntvf:2\ncell:F13:v:3000:b::1:::l:1:f:5:ntvf:2\ncell:G13:vtf:n:8000:IF(SUM(D13\\cF13),SUM(D13\\cF13),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C14:t:Total :l:2:f:1:cf:2:ntvf:1\ncell:D14:vtf:n:46000:IF(SUM(D9\\cD13),SUM(D9\\cD13),\"\"):l:2:f:1:ntvf:2\ncell:E14:vtf:n:59000:IF(SUM(E9\\cE13),SUM(E9\\cE13),\"\"):l:2:f:1:ntvf:2\ncell:F14:vtf:n:35000:IF(SUM(F9\\cF13),SUM(F9\\cF13),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G14:vtf:n:140000:IF(SUM(G9\\cG13),SUM(G9\\cG13),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:C15:l:1:f:5:ntvf:1\ncell:D15:l:1:f:5:ntvf:2\ncell:E15:l:1:f:5:ntvf:2\ncell:F15:b::1:::l:1:f:5:ntvf:2\ncell:G15:b::::1:l:1:f:5:ntvf:2\ncell:C16:t: Mountain Climbing :l:1:f:1:ntvf:1\ncell:D16:l:1:f:5:ntvf:2\ncell:E16:l:1:f:5:ntvf:2\ncell:F16:b::1:::l:1:f:5:ntvf:2\ncell:G16:b::::1:l:1:f:5:ntvf:2\ncell:C17:t:Product:l:1:f:5:ntvf:1\ncell:D17:v:4000:l:1:f:5:ntvf:2\ncell:E17:v:8000:l:1:f:5:ntvf:2\ncell:F17:v:6500:b::1:::l:1:f:5:ntvf:2\ncell:G17:vtf:n:18500:IF(SUM(D17\\cF17),SUM(D17\\cF17),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C18:t:Product:l:1:f:5:ntvf:1\ncell:D18:v:7000:l:1:f:5:ntvf:2\ncell:E18:v:15000:l:1:f:5:ntvf:2\ncell:F18:v:9000:b::1:::l:1:f:5:ntvf:2\ncell:G18:vtf:n:31000:IF(SUM(D18\\cF18),SUM(D18\\cF18),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C19:t:Product:l:1:f:5:ntvf:1\ncell:D19:v:6000:l:1:f:5:ntvf:2\ncell:E19:v:11000:l:1:f:5:ntvf:2\ncell:F19:v:8000:b::1:::l:1:f:5:ntvf:2\ncell:G19:vtf:n:25000:IF(SUM(D19\\cF19),SUM(D19\\cF19),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C20:t:Product:l:1:f:5:ntvf:1\ncell:D20:v:3000:l:1:f:5:ntvf:2\ncell:E20:v:5500:l:1:f:5:ntvf:2\ncell:F20:v:4500:b::1:::l:1:f:5:ntvf:2\ncell:G20:vtf:n:13000:IF(SUM(D20\\cF20),SUM(D20\\cF20),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C21:t:Product:l:1:f:5:ntvf:1\ncell:D21:v:2000:l:1:f:5:ntvf:2\ncell:E21:v:3500:l:1:f:5:ntvf:2\ncell:F21:v:3000:b::1:::l:1:f:5:ntvf:2\ncell:G21:vtf:n:8500:IF(SUM(D21\\cF21),SUM(D21\\cF21),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C22:t:Total :l:2:f:1:cf:2:ntvf:1\ncell:D22:vtf:n:22000:IF(SUM(D17\\cD21),SUM(D17\\cD21),\"\"):l:2:f:1:ntvf:2\ncell:E22:vtf:n:43000:IF(SUM(E17\\cE21),SUM(E17\\cE21),\"\"):l:2:f:1:ntvf:2\ncell:F22:vtf:n:31000:IF(SUM(F17\\cF21),SUM(F17\\cF21),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G22:vtf:n:96000:IF(SUM(G17\\cG21),SUM(G17\\cG21),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:C23:l:1:f:5:ntvf:1\ncell:D23:l:1:f:5:ntvf:2\ncell:E23:l:1:f:5:ntvf:2\ncell:F23:b::1:::l:1:f:5:ntvf:2\ncell:G23:b::::1:l:1:f:5:ntvf:2\ncell:C24:t: Men's Clothing :l:1:f:1:ntvf:1\ncell:D24:l:1:f:5:ntvf:2\ncell:E24:l:1:f:5:ntvf:2\ncell:F24:b::1:::l:1:f:5:ntvf:2\ncell:G24:b::::1:l:1:f:5:ntvf:2\ncell:C25:t:Product:l:1:f:5:ntvf:1\ncell:D25:v:16000:l:1:f:5:ntvf:2\ncell:E25:v:30000:l:1:f:5:ntvf:2\ncell:F25:v:15000:b::1:::l:1:f:5:ntvf:2\ncell:G25:vtf:n:61000:IF(SUM(D25\\cF25),SUM(D25\\cF25),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C26:t:Product:l:1:f:5:ntvf:1\ncell:D26:v:18000:l:1:f:5:ntvf:2\ncell:E26:v:32000:l:1:f:5:ntvf:2\ncell:F26:v:18000:b::1:::l:1:f:5:ntvf:2\ncell:G26:vtf:n:68000:IF(SUM(D26\\cF26),SUM(D26\\cF26),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C27:t:Product:l:1:f:5:ntvf:1\ncell:D27:v:24000:l:1:f:5:ntvf:2\ncell:E27:v:46000:l:1:f:5:ntvf:2\ncell:F27:v:38000:b::1:::l:1:f:5:ntvf:2\ncell:G27:vtf:n:108000:IF(SUM(D27\\cF27),SUM(D27\\cF27),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C28:t:Product:l:1:f:5:ntvf:1\ncell:D28:v:16000:l:1:f:5:ntvf:2\ncell:E28:v:32000:l:1:f:5:ntvf:2\ncell:F28:v:19000:b::1:::l:1:f:5:ntvf:2\ncell:G28:vtf:n:67000:IF(SUM(D28\\cF28),SUM(D28\\cF28),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C29:t:Product:l:1:f:5:ntvf:1\ncell:D29:v:8000:l:1:f:5:ntvf:2\ncell:E29:v:12000:l:1:f:5:ntvf:2\ncell:F29:v:10000:b::1:::l:1:f:5:ntvf:2\ncell:G29:vtf:n:30000:IF(SUM(D29\\cF29),SUM(D29\\cF29),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C30:t:Total :l:2:f:1:cf:2:ntvf:1\ncell:D30:vtf:n:82000:IF(SUM(D25\\cD29),SUM(D25\\cD29),\"\"):l:2:f:1:ntvf:2\ncell:E30:vtf:n:152000:IF(SUM(E25\\cE29),SUM(E25\\cE29),\"\"):l:2:f:1:ntvf:2\ncell:F30:vtf:n:100000:IF(SUM(F25\\cF29),SUM(F25\\cF29),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G30:vtf:n:334000:IF(SUM(G25\\cG29),SUM(G25\\cG29),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:C31:l:1:f:5:ntvf:1\ncell:D31:l:1:f:5:ntvf:2\ncell:E31:l:1:f:5:ntvf:2\ncell:F31:b::1:::l:1:f:5:ntvf:2\ncell:G31:b::::1:l:1:f:5:ntvf:2\ncell:C32:t: Women's Clothing :l:1:f:1:ntvf:1\ncell:D32:l:1:f:5:ntvf:2\ncell:E32:l:1:f:5:ntvf:2\ncell:F32:b::1:::l:1:f:5:ntvf:2\ncell:G32:b::::1:l:1:f:5:ntvf:2\ncell:C33:t:Product:l:1:f:5:ntvf:1\ncell:D33:v:13000:l:1:f:5:ntvf:2\ncell:E33:v:26000:l:1:f:5:ntvf:2\ncell:F33:v:12000:b::1:::l:1:f:5:ntvf:2\ncell:G33:vtf:n:51000:IF(SUM(D33\\cF33),SUM(D33\\cF33),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C34:t:Product:l:1:f:5:ntvf:1\ncell:D34:v:17000:l:1:f:5:ntvf:2\ncell:E34:v:32000:l:1:f:5:ntvf:2\ncell:F34:v:15000:b::1:::l:1:f:5:ntvf:2\ncell:G34:vtf:n:64000:IF(SUM(D34\\cF34),SUM(D34\\cF34),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C35:t:Product:l:1:f:5:ntvf:1\ncell:D35:v:21000:l:1:f:5:ntvf:2\ncell:E35:v:42000:l:1:f:5:ntvf:2\ncell:F35:v:33000:b::1:::l:1:f:5:ntvf:2\ncell:G35:vtf:n:96000:IF(SUM(D35\\cF35),SUM(D35\\cF35),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C36:t:Product:l:1:f:5:ntvf:1\ncell:D36:v:11000:l:1:f:5:ntvf:2\ncell:E36:v:19000:l:1:f:5:ntvf:2\ncell:F36:v:17500:b::1:::l:1:f:5:ntvf:2\ncell:G36:vtf:n:47500:IF(SUM(D36\\cF36),SUM(D36\\cF36),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C37:t:Product:l:1:f:5:ntvf:1\ncell:D37:v:6500:l:1:f:5:ntvf:2\ncell:E37:v:11500:l:1:f:5:ntvf:2\ncell:F37:v:8500:b::1:::l:1:f:5:ntvf:2\ncell:G37:vtf:n:26500:IF(SUM(D37\\cF37),SUM(D37\\cF37),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C38:t:Total :l:2:f:1:cf:2:ntvf:1\ncell:D38:vtf:n:68500:IF(SUM(D33\\cD37),SUM(D33\\cD37),\"\"):l:2:f:1:ntvf:2\ncell:E38:vtf:n:130500:IF(SUM(E33\\cE37),SUM(E33\\cE37),\"\"):l:2:f:1:ntvf:2\ncell:F38:vtf:n:86000:IF(SUM(F33\\cF37),SUM(F33\\cF37),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G38:vtf:n:285000:IF(SUM(G33\\cG37),SUM(G33\\cG37),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:C39:l:1:f:5:ntvf:1\ncell:D39:l:1:f:5:ntvf:2\ncell:E39:l:1:f:5:ntvf:2\ncell:F39:b::1:::l:1:f:5:ntvf:2\ncell:G39:b::::1:l:1:f:5:ntvf:2\ncell:C40:t: Kids Corner :l:1:f:1:ntvf:1\ncell:D40:l:1:f:5:ntvf:2\ncell:E40:l:1:f:5:ntvf:2\ncell:F40:b::1:::l:1:f:5:ntvf:2\ncell:G40:b::::1:l:1:f:5:ntvf:2\ncell:C41:t:Product:l:1:f:5:ntvf:1\ncell:D41:v:7000:l:1:f:5:ntvf:2\ncell:E41:v:13000:l:1:f:5:ntvf:2\ncell:F41:v:9000:b::1:::l:1:f:5:ntvf:2\ncell:G41:vtf:n:29000:IF(SUM(D41\\cF41),SUM(D41\\cF41),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C42:t:Product:l:1:f:5:ntvf:1\ncell:D42:v:8500:l:1:f:5:ntvf:2\ncell:E42:v:16000:l:1:f:5:ntvf:2\ncell:F42:v:11000:b::1:::l:1:f:5:ntvf:2\ncell:G42:vtf:n:35500:IF(SUM(D42\\cF42),SUM(D42\\cF42),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C43:t:Product:l:1:f:5:ntvf:1\ncell:D43:v:13000:l:1:f:5:ntvf:2\ncell:E43:v:22000:l:1:f:5:ntvf:2\ncell:F43:v:17000:b::1:::l:1:f:5:ntvf:2\ncell:G43:vtf:n:52000:IF(SUM(D43\\cF43),SUM(D43\\cF43),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C44:t:Product:l:1:f:5:ntvf:1\ncell:D44:v:6000:l:1:f:5:ntvf:2\ncell:E44:v:11000:l:1:f:5:ntvf:2\ncell:F44:v:9000:b::1:::l:1:f:5:ntvf:2\ncell:G44:vtf:n:26000:IF(SUM(D44\\cF44),SUM(D44\\cF44),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C45:t:Product:l:1:f:5:ntvf:1\ncell:D45:v:4000:l:1:f:5:ntvf:2\ncell:E45:v:7000:l:1:f:5:ntvf:2\ncell:F45:v:6500:b::1:::l:1:f:5:ntvf:2\ncell:G45:vtf:n:17500:IF(SUM(D45\\cF45),SUM(D45\\cF45),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C46:t:Total :l:2:f:1:cf:2:ntvf:1\ncell:D46:vtf:n:38500:IF(SUM(D41\\cD45),SUM(D41\\cD45),\"\"):l:2:f:1:ntvf:2\ncell:E46:vtf:n:69000:IF(SUM(E41\\cE45),SUM(E41\\cE45),\"\"):l:2:f:1:ntvf:2\ncell:F46:vtf:n:52500:IF(SUM(F41\\cF45),SUM(F41\\cF45),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G46:vtf:n:160000:IF(SUM(G41\\cG45),SUM(G41\\cG45),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:C49:l:1:f:5\ncol:A:w:10\ncol:B:w:10\ncol:C:w:309\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:15\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:15\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:15\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:15\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:49:h:14.25\nsheet:c:7:r:49:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:right\nfont:1:normal bold 10pt Arial\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 16pt Arial\nfont:4:normal bold 26pt Times New Roman\nfont:5:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00;(#,##0.00)\nvalueformat:2:#,##0;(#,##0)\nvalueformat:3:@\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet13","hidden":"1"},"sheet20":{"sheetstr":{"savestr":"version:1.5\ncell:B1:l:2:f:4\ncell:C3:t:Sales Seasonality by Month:l:1:f:8:c:3:bg:1:cf:1:colspan:6\ncell:D3:l:1:f:4:cf:1\ncell:E3:l:1:f:4:cf:1\ncell:F3:l:1:f:4:cf:1\ncell:G3:l:1:f:4:cf:1\ncell:H3:l:1:f:4:cf:1\ncell:D4:l:1:f:4:cf:1\ncell:E4:l:1:f:4:cf:1\ncell:F4:l:1:f:4:cf:1\ncell:G4:l:1:f:4:cf:1\ncell:H4:l:1:f:4:cf:1\ncell:C5:t:For the Year 2009:l:1:f:7:cf:1:colspan:2\ncell:D5:l:1:f:4:cf:1\ncell:E5:l:1:f:4:cf:1\ncell:F5:l:1:f:4:cf:1\ncell:G5:l:1:f:4:cf:1\ncell:H5:l:1:f:4:cf:1\ncell:D6:l:1:f:4:cf:2\ncell:E6:l:1:f:4:cf:2\ncell:F6:l:1:f:4:cf:2\ncell:G6:l:1:f:4:cf:2\ncell:H6:l:1:f:4:cf:2\ncell:C7:l:1:f:4\ncell:D7:l:1:f:4:cf:2\ncell:E7:l:1:f:4:cf:2\ncell:F7:l:1:f:4:cf:2\ncell:G7:l:1:f:4:cf:2\ncell:H7:l:1:f:4:cf:2\ncell:C8:l:1:f:4\ncell:D8:t:Actual sales:l:1:f:7:cf:1\ncell:E8:t:% of Sales:l:1:f:7:cf:1\ncell:F8:t:Company Index To Average:l:1:f:7:cf:1\ncell:G8:t:Industry % of Sales:l:1:f:7:cf:1\ncell:H8:t:Industry Index to Average:l:1:f:7:cf:1\ncell:C9:l:1:f:4\ncell:D9:l:1:f:2:cf:1\ncell:E9:l:1:f:2:cf:1\ncell:F9:l:1:f:2:cf:1\ncell:G9:l:1:f:2:cf:1\ncell:H9:l:1:f:2:cf:1\ncell:C10:t:Jan:l:1:f:1\ncell:D10:v:100000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:E10:vtf:n:0.0775416776922851:IF(D10,(D10/D23),\"\"):l:1:f:1:ntvf:4\ncell:F10:vtf:n:0.9305001323074212:IF(D10,(D10/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:ntvf:3\ncell:G10:v:0.07:b:1:1:1:1:l:1:f:1:ntvf:3\ncell:H10:vtf:n:0.8400000000000001:IF(G10,(G10/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:ntvf:3\ncell:I10:f:1\ncell:C11:t:Feb:l:1:f:1:bg:2\ncell:D11:v:101300:b:1:1:1:1:l:1:f:1:bg:2:ntvf:1\ncell:E11:vtf:n:0.0785497195022848:IF(D11,(D11/D23),\"\"):l:1:f:1:bg:2:ntvf:4\ncell:F11:vtf:n:0.9425966340274177:IF(D11,(D11/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:G11:v:0.075:b:1:1:1:1:l:1:f:1:bg:2:ntvf:3\ncell:H11:vtf:n:0.9:IF(G11,(G11/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:I11:f:1\ncell:C12:t:Mar:l:1:f:1\ncell:D12:v:102616.9:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:E12:vtf:n:0.07957086585581451:IF(D12,(D12/D23),\"\"):l:1:f:1:ntvf:4\ncell:F12:vtf:n:0.9548503902697741:IF(D12,(D12/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:ntvf:3\ncell:G12:v:0.09:b:1:1:1:1:l:1:f:1:ntvf:3\ncell:H12:vtf:n:1.08:IF(G12,(G12/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:ntvf:3\ncell:I12:f:1\ncell:C13:t:Apr:l:1:f:1:bg:2\ncell:D13:v:103950.9197:b:1:1:1:1:l:1:f:1:bg:2:ntvf:1\ncell:E13:vtf:n:0.0806052871119401:IF(D13,(D13/D23),\"\"):l:1:f:1:bg:2:ntvf:4\ncell:F13:vtf:n:0.9672634453432812:IF(D13,(D13/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:G13:v:0.09:b:1:1:1:1:l:1:f:1:bg:2:ntvf:3\ncell:H13:vtf:n:1.08:IF(G13,(G13/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:I13:f:1\ncell:C14:t:May:l:1:f:1\ncell:D14:v:105302.2816561:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:E14:vtf:n:0.08165315584439532:IF(D14,(D14/D23),\"\"):l:1:f:1:ntvf:4\ncell:F14:vtf:n:0.9798378701327439:IF(D14,(D14/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:ntvf:3\ncell:G14:v:0.09:b:1:1:1:1:l:1:f:1:ntvf:3\ncell:H14:vtf:n:1.08:IF(G14,(G14/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:ntvf:3\ncell:I14:f:1\ncell:C15:t:Jun:l:1:f:1:bg:2\ncell:D15:v:106671.21131763:b:1:1:1:1:l:1:f:1:bg:2:ntvf:1\ncell:E15:vtf:n:0.082714646870373:IF(D15,(D15/D23),\"\"):l:1:f:1:bg:2:ntvf:4\ncell:F15:vtf:n:0.9925757624444761:IF(D15,(D15/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:G15:v:0.08:b:1:1:1:1:l:1:f:1:bg:2:ntvf:3\ncell:H15:vtf:n:0.9600000000000001:IF(G15,(G15/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:I15:f:1\ncell:C16:t:Jul:l:1:f:1\ncell:D16:v:108057.93706476:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:E16:vtf:n:0.08378993727968848:IF(D16,(D16/D23),\"\"):l:1:f:1:ntvf:4\ncell:F16:vtf:n:1.0054792473562617:IF(D16,(D16/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:ntvf:3\ncell:G16:v:0.07:b:1:1:1:1:l:1:f:1:ntvf:3\ncell:H16:vtf:n:0.8400000000000001:IF(G16,(G16/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:ntvf:3\ncell:I16:f:1\ncell:C17:t:Aug:l:1:f:1:bg:2\ncell:D17:v:109462.6902466:b:1:1:1:1:l:1:f:1:bg:2:ntvf:1\ncell:E17:vtf:n:0.08487920646432297:IF(D17,(D17/D23),\"\"):l:1:f:1:bg:2:ntvf:4\ncell:F17:vtf:n:1.0185504775718757:IF(D17,(D17/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:G17:v:0.095:b:1:1:1:1:l:1:f:1:bg:2:ntvf:3\ncell:H17:vtf:n:1.1400000000000001:IF(G17,(G17/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:I17:f:1\ncell:C18:t:Sep:l:1:f:1\ncell:D18:v:110885.70521981:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:E18:vtf:n:0.08598263614836242:IF(D18,(D18/D23),\"\"):l:1:f:1:ntvf:4\ncell:F18:vtf:n:1.0317916337803492:IF(D18,(D18/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:ntvf:3\ncell:G18:v:0.09:b:1:1:1:1:l:1:f:1:ntvf:3\ncell:H18:vtf:n:1.08:IF(G18,(G18/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:ntvf:3\ncell:I18:f:1\ncell:C19:t:Oct:l:1:f:1:bg:2\ncell:D19:v:112327.21938766:b:1:1:1:1:l:1:f:1:bg:2:ntvf:1\ncell:E19:vtf:n:0.0871004104182853:IF(D19,(D19/D23),\"\"):l:1:f:1:bg:2:ntvf:4\ncell:F19:vtf:n:1.0452049250194237:IF(D19,(D19/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:G19:v:0.09:b:1:1:1:1:l:1:f:1:bg:2:ntvf:3\ncell:H19:vtf:n:1.08:IF(G19,(G19/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:I19:f:1\ncell:C20:t:Nov:l:1:f:1\ncell:D20:v:113787.4732397:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:E20:vtf:n:0.08823271575372334:IF(D20,(D20/D23),\"\"):l:1:f:1:ntvf:4\ncell:F20:vtf:n:1.05879258904468:IF(D20,(D20/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:ntvf:3\ncell:G20:v:0.07:b:1:1:1:1:l:1:f:1:ntvf:3\ncell:H20:vtf:n:0.8400000000000001:IF(G20,(G20/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:ntvf:3\ncell:I20:f:1\ncell:C21:t:Dec:l:1:f:1:bg:2\ncell:D21:v:115266.71039182:b:1:1:1:1:l:1:f:1:bg:2:ntvf:1\ncell:E21:vtf:n:0.08937974105852475:IF(D21,(D21/D23),\"\"):l:1:f:1:bg:2:ntvf:4\ncell:F21:vtf:n:1.0725568927022973:IF(D21,(D21/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:G21:v:0.09:b:1:1:1:1:l:1:f:1:bg:2:ntvf:3\ncell:H21:vtf:n:1.08:IF(G21,(G21/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:I21:f:1\ncell:C22:l:1:f:5\ncell:D22:b:::2::l:1:f:5:ntvf:1\ncell:E22:b:::2::l:1:f:5:ntvf:4\ncell:F22:b:::2::l:1:f:5:ntvf:3\ncell:G22:b:::2::l:1:f:5:ntvf:3\ncell:H22:b:::2::l:1:f:5:ntvf:3\ncell:C23:t:Total:l:1:f:6\ncell:D23:vtf:n:1289629.04822408:IF(SUM(D10\\cD21),SUM(D10\\cD21),\"\"):b:1::1::l:1:f:6:ntvf:2\ncell:E23:vtf:n:1:IF(ISNUMBER(D23),(D23/D23),\"\"):b:1::1::l:1:f:6:ntvf:4\ncell:F23:b:1::1::l:1:f:6:ntvf:2\ncell:G23:vtf:n:0.9999999999999999:IF(SUM(G10\\cG21),SUM(G10\\cG21),\"\"):b:1::1::l:1:f:6:ntvf:3\ncell:H23:b:1::1::l:1:f:6:ntvf:2\ncell:I23:f:6\ncell:C24:l:1:f:3\ncell:D24:l:1:f:5:ntvf:2\ncell:E24:l:1:f:5:ntvf:4\ncell:F24:l:1:f:5:ntvf:2\ncell:G24:l:1:f:5:ntvf:3\ncell:H24:l:1:f:5:ntvf:2\ncell:C25:l:1:f:3\ncell:D25:l:1:f:5:ntvf:2\ncell:E25:l:1:f:5:ntvf:4\ncell:F25:l:1:f:5:ntvf:2\ncell:G25:l:1:f:5:ntvf:3\ncell:H25:l:1:f:5:ntvf:2\ncell:C26:l:1:f:3\ncell:D26:l:1:f:5:ntvf:2\ncell:E26:l:1:f:5:ntvf:4\ncell:F26:l:1:f:5:ntvf:2\ncell:G26:l:1:f:5:ntvf:3\ncell:H26:l:1:f:5:ntvf:2\ncell:C27:l:1:f:3\ncell:D27:l:1:f:5:ntvf:2\ncell:E27:l:1:f:5:ntvf:4\ncell:F27:l:1:f:5:ntvf:2\ncell:G27:l:1:f:5:ntvf:3\ncell:H27:l:1:f:5:ntvf:2\ncell:C28:l:1:f:3\ncell:D28:l:1:f:5:ntvf:2\ncell:E28:l:1:f:5:ntvf:4\ncell:F28:l:1:f:5:ntvf:2\ncell:G28:l:1:f:5:ntvf:3\ncell:H28:l:1:f:5:ntvf:2\ncell:C29:l:1:f:3\ncell:D29:l:1:f:5:ntvf:2\ncell:E29:l:1:f:5:ntvf:4\ncell:F29:l:1:f:5:ntvf:2\ncell:G29:l:1:f:5:ntvf:3\ncell:H29:l:1:f:5:ntvf:2\ncell:C30:l:1:f:3\ncell:D30:l:1:f:5:ntvf:2\ncell:E30:l:1:f:5:ntvf:4\ncell:F30:l:1:f:5:ntvf:2\ncell:G30:l:1:f:5:ntvf:3\ncell:H30:l:1:f:5:ntvf:2\ncell:C31:l:1:f:3\ncell:D31:l:1:f:5:ntvf:2\ncell:E31:l:1:f:5:ntvf:4\ncell:F31:l:1:f:5:ntvf:2\ncell:G31:l:1:f:5:ntvf:3\ncell:H31:l:1:f:5:ntvf:2\ncell:C32:l:1:f:3\ncell:D32:l:1:f:5:ntvf:2\ncell:E32:l:1:f:5:ntvf:4\ncell:F32:l:1:f:5:ntvf:2\ncell:G32:l:1:f:5:ntvf:3\ncell:H32:l:1:f:5:ntvf:2\ncell:C33:l:1:f:3\ncell:D33:l:1:f:5:ntvf:2\ncell:E33:l:1:f:5:ntvf:4\ncell:F33:l:1:f:5:ntvf:2\ncell:G33:l:1:f:5:ntvf:3\ncell:H33:l:1:f:5:ntvf:2\ncell:C34:l:1:f:3\ncell:D34:l:1:f:5:ntvf:2\ncell:E34:l:1:f:5:ntvf:4\ncell:F34:l:1:f:5:ntvf:2\ncell:G34:l:1:f:5:ntvf:3\ncell:H34:l:1:f:5:ntvf:2\ncell:C35:l:1:f:3\ncell:D35:l:1:f:5:ntvf:2\ncell:E35:l:1:f:5:ntvf:4\ncell:F35:l:1:f:5:ntvf:2\ncell:G35:l:1:f:5:ntvf:3\ncell:H35:l:1:f:5:ntvf:2\ncell:C36:l:1:f:3\ncell:D36:l:1:f:5:ntvf:2\ncell:E36:l:1:f:5:ntvf:4\ncell:F36:l:1:f:5:ntvf:2\ncell:G36:l:1:f:5:ntvf:3\ncell:H36:l:1:f:5:ntvf:2\ncell:C37:l:1:f:3\ncell:D37:l:1:f:5:ntvf:2\ncell:E37:l:1:f:5:ntvf:4\ncell:F37:l:1:f:5:ntvf:2\ncell:G37:l:1:f:5:ntvf:3\ncell:H37:l:1:f:5:ntvf:2\ncell:C38:l:1:f:3\ncell:D38:l:1:f:5:ntvf:2\ncell:E38:l:1:f:5:ntvf:4\ncell:F38:l:1:f:5:ntvf:2\ncell:G38:l:1:f:5:ntvf:3\ncell:H38:l:1:f:5:ntvf:2\ncell:C39:l:1:f:3\ncell:D39:l:1:f:5:ntvf:2\ncell:E39:l:1:f:5:ntvf:4\ncell:F39:l:1:f:5:ntvf:2\ncell:G39:l:1:f:5:ntvf:3\ncell:H39:l:1:f:5:ntvf:2\ncell:C40:l:1:f:3\ncell:D40:l:1:f:5:ntvf:2\ncell:E40:l:1:f:5:ntvf:4\ncell:F40:l:1:f:5:ntvf:2\ncell:G40:l:1:f:5:ntvf:3\ncell:H40:l:1:f:5:ntvf:2\ncell:C42:t:© Copyright, 2011, Jaxworks, All Rights Reserved.:l:1:f:4\ncol:A:w:10\ncol:B:w:10\ncol:C:w:121\ncol:D:w:118\ncol:E:w:118\ncol:F:w:135\ncol:G:w:99\ncol:H:w:124\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:18.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:15.75\nrow:10:h:15.75\nrow:11:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:15.75\nrow:19:h:15.75\nrow:20:h:15.75\nrow:21:h:15.75\nrow:22:h:15.75\nrow:23:h:15.75\nrow:24:h:15.75\nrow:25:h:15.75\nrow:26:h:15.75\nrow:27:h:15.75\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:15.75\nrow:31:h:15.75\nrow:32:h:15.75\nrow:33:h:15.75\nrow:34:h:15.75\nrow:35:h:15.75\nrow:36:h:15.75\nrow:37:h:15.75\nrow:38:h:15.75\nrow:39:h:15.75\nrow:40:h:15.75\nrow:42:h:14.25\nsheet:c:9:r:42:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold 10pt Arial\nfont:3:normal bold 12pt Arial\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt Arial\nfont:6:normal normal 14pt *\nfont:7:normal normal 14pt Arial\nfont:8:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:3:0.0%\nvalueformat:4:0.00%\nname:DATA_01::C5\nname:DATA_02::C10\nname:DATA_03::D10\\cD21\nname:DATA_04::G10\\cG21\n"},"name":"sheet11","hidden":"0"},"sheet21":{"sheetstr":{"savestr":"version:1.5\ncell:A1:l:2:f:5\ncell:B3:t:Sales Seasonality by Month:l:1:f:4:cf:2\ncell:C3:l:1:f:5:cf:1\ncell:D3:l:1:f:5:cf:1\ncell:E3:l:1:f:5:cf:1\ncell:F3:l:1:f:5:cf:1\ncell:G3:l:1:f:5:cf:1\ncell:B4:t:For the Year 2009:l:1:f:3:cf:1\ncell:C4:l:1:f:5:cf:1\ncell:D4:l:1:f:5:cf:1\ncell:E4:l:1:f:5:cf:1\ncell:F4:l:1:f:5:cf:1\ncell:G4:l:1:f:5:cf:1\ncell:C5:l:1:f:5:cf:3\ncell:D5:l:1:f:5:cf:3\ncell:E5:l:1:f:5:cf:3\ncell:F5:l:1:f:5:cf:3\ncell:G5:l:1:f:5:cf:3\ncell:B6:l:1:f:5\ncell:C6:l:1:f:5:cf:3\ncell:D6:l:1:f:5:cf:3\ncell:E6:l:1:f:5:cf:3\ncell:F6:l:1:f:5:cf:3\ncell:G6:l:1:f:5:cf:3\ncell:B7:l:1:f:5\ncell:C7:t:Actual:l:1:f:1:cf:1\ncell:D7:t:% of :l:1:f:1:cf:1\ncell:E7:t:Company Index:l:1:f:1:cf:1\ncell:F7:t:Industry % :l:1:f:1:cf:1\ncell:G7:t:Industry Index:l:1:f:1:cf:1\ncell:B8:l:1:f:5\ncell:C8:t:Sales:b:::1::l:1:f:1:cf:1\ncell:D8:t:Sales:b:::1::l:1:f:1:cf:1\ncell:E8:t:To Average:b:::1::l:1:f:1:cf:1\ncell:F8:t:of Sales:b:::1::l:1:f:1:cf:1\ncell:G8:t:to Average:b:::1::l:1:f:1:cf:1\ncell:B9:t:Jan:l:1:f:6\ncell:C9:v:100000:b:1::::l:1:f:6:ntvf:2\ncell:D9:vtf:n:0.0775416776922851:IF(C9,(C9/C21),\"\"):b:1::::l:1:f:6:ntvf:4\ncell:E9:vtf:n:0.9305001323074212:IF(C9,(C9/AVERAGE(C9\\cC20)),\"\"):b:1::::l:1:f:6:ntvf:3\ncell:F9:v:0.07:b:1::::l:1:f:6:ntvf:3\ncell:G9:vtf:n:0.8400000000000001:IF(F9,(F9/AVERAGE(F9\\cF20)),\"\"):b:1::::l:1:f:6:ntvf:3\ncell:B10:t:Feb:l:1:f:6\ncell:C10:v:101300:l:1:f:6:ntvf:1\ncell:D10:vtf:n:0.0785497195022848:IF(C10,(C10/C21),\"\"):l:1:f:6:ntvf:4\ncell:E10:vtf:n:0.9425966340274177:IF(C10,(C10/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F10:v:0.075:l:1:f:6:ntvf:3\ncell:G10:vtf:n:0.9:IF(F10,(F10/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B11:t:Mar:l:1:f:6\ncell:C11:v:102616.9:l:1:f:6:ntvf:1\ncell:D11:vtf:n:0.07957086585581451:IF(C11,(C11/C21),\"\"):l:1:f:6:ntvf:4\ncell:E11:vtf:n:0.9548503902697741:IF(C11,(C11/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F11:v:0.09:l:1:f:6:ntvf:3\ncell:G11:vtf:n:1.08:IF(F11,(F11/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B12:t:Apr:l:1:f:6\ncell:C12:v:103950.9197:l:1:f:6:ntvf:1\ncell:D12:vtf:n:0.0806052871119401:IF(C12,(C12/C21),\"\"):l:1:f:6:ntvf:4\ncell:E12:vtf:n:0.9672634453432812:IF(C12,(C12/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F12:v:0.09:l:1:f:6:ntvf:3\ncell:G12:vtf:n:1.08:IF(F12,(F12/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B13:t:May:l:1:f:6\ncell:C13:v:105302.2816561:l:1:f:6:ntvf:1\ncell:D13:vtf:n:0.08165315584439532:IF(C13,(C13/C21),\"\"):l:1:f:6:ntvf:4\ncell:E13:vtf:n:0.9798378701327439:IF(C13,(C13/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F13:v:0.09:l:1:f:6:ntvf:3\ncell:G13:vtf:n:1.08:IF(F13,(F13/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B14:t:Jun:l:1:f:6\ncell:C14:v:106671.21131763:l:1:f:6:ntvf:1\ncell:D14:vtf:n:0.082714646870373:IF(C14,(C14/C21),\"\"):l:1:f:6:ntvf:4\ncell:E14:vtf:n:0.9925757624444761:IF(C14,(C14/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F14:v:0.08:l:1:f:6:ntvf:3\ncell:G14:vtf:n:0.9600000000000001:IF(F14,(F14/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B15:t:Jul:l:1:f:6\ncell:C15:v:108057.93706476:l:1:f:6:ntvf:1\ncell:D15:vtf:n:0.08378993727968848:IF(C15,(C15/C21),\"\"):l:1:f:6:ntvf:4\ncell:E15:vtf:n:1.0054792473562617:IF(C15,(C15/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F15:v:0.07:l:1:f:6:ntvf:3\ncell:G15:vtf:n:0.8400000000000001:IF(F15,(F15/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B16:t:Aug:l:1:f:6\ncell:C16:v:109462.6902466:l:1:f:6:ntvf:1\ncell:D16:vtf:n:0.08487920646432297:IF(C16,(C16/C21),\"\"):l:1:f:6:ntvf:4\ncell:E16:vtf:n:1.0185504775718757:IF(C16,(C16/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F16:v:0.095:l:1:f:6:ntvf:3\ncell:G16:vtf:n:1.1400000000000001:IF(F16,(F16/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B17:t:Sep:l:1:f:6\ncell:C17:v:110885.70521981:l:1:f:6:ntvf:1\ncell:D17:vtf:n:0.08598263614836242:IF(C17,(C17/C21),\"\"):l:1:f:6:ntvf:4\ncell:E17:vtf:n:1.0317916337803492:IF(C17,(C17/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F17:v:0.09:l:1:f:6:ntvf:3\ncell:G17:vtf:n:1.08:IF(F17,(F17/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B18:t:Oct:l:1:f:6\ncell:C18:v:112327.21938766:l:1:f:6:ntvf:1\ncell:D18:vtf:n:0.0871004104182853:IF(C18,(C18/C21),\"\"):l:1:f:6:ntvf:4\ncell:E18:vtf:n:1.0452049250194237:IF(C18,(C18/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F18:v:0.09:l:1:f:6:ntvf:3\ncell:G18:vtf:n:1.08:IF(F18,(F18/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B19:t:Nov:l:1:f:6\ncell:C19:v:113787.4732397:l:1:f:6:ntvf:1\ncell:D19:vtf:n:0.08823271575372334:IF(C19,(C19/C21),\"\"):l:1:f:6:ntvf:4\ncell:E19:vtf:n:1.05879258904468:IF(C19,(C19/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F19:v:0.07:l:1:f:6:ntvf:3\ncell:G19:vtf:n:0.8400000000000001:IF(F19,(F19/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B20:t:Dec:l:1:f:6\ncell:C20:v:115266.71039182:b:::1::l:1:f:6:ntvf:1\ncell:D20:vtf:n:0.08937974105852475:IF(C20,(C20/C21),\"\"):b:::1::l:1:f:6:ntvf:4\ncell:E20:vtf:n:1.0725568927022973:IF(C20,(C20/AVERAGE(C9\\cC20)),\"\"):b:::1::l:1:f:6:ntvf:3\ncell:F20:v:0.09:b:::1::l:1:f:6:ntvf:3\ncell:G20:vtf:n:1.08:IF(F20,(F20/AVERAGE(F9\\cF20)),\"\"):b:::1::l:1:f:6:ntvf:3\ncell:B21:t:Total:l:1:f:2\ncell:C21:vtf:n:1289629.04822408:IF(SUM(C9\\cC20),SUM(C9\\cC20),\"\"):b:1::::l:1:f:2:ntvf:2\ncell:D21:vtf:n:1:IF(ISNUMBER(C21),(C21/C21),\"\"):b:1::::l:1:f:2:ntvf:4\ncell:E21:b:1::::l:1:f:2:ntvf:2\ncell:F21:vtf:n:0.9999999999999999:IF(SUM(F9\\cF20),SUM(F9\\cF20),\"\"):b:1::::l:1:f:2:ntvf:3\ncell:G21:b:1::::l:1:f:2:ntvf:2\ncell:B22:l:1:f:2\ncell:C22:l:1:f:6:ntvf:2\ncell:D22:l:1:f:6:ntvf:4\ncell:E22:l:1:f:6:ntvf:2\ncell:F22:l:1:f:6:ntvf:3\ncell:G22:l:1:f:6:ntvf:2\ncell:B23:l:1:f:2\ncell:C23:l:1:f:6:ntvf:2\ncell:D23:l:1:f:6:ntvf:4\ncell:E23:l:1:f:6:ntvf:2\ncell:F23:l:1:f:6:ntvf:3\ncell:G23:l:1:f:6:ntvf:2\ncell:B24:l:1:f:2\ncell:C24:l:1:f:6:ntvf:2\ncell:D24:l:1:f:6:ntvf:4\ncell:E24:l:1:f:6:ntvf:2\ncell:F24:l:1:f:6:ntvf:3\ncell:G24:l:1:f:6:ntvf:2\ncell:B25:l:1:f:2\ncell:C25:l:1:f:6:ntvf:2\ncell:D25:l:1:f:6:ntvf:4\ncell:E25:l:1:f:6:ntvf:2\ncell:F25:l:1:f:6:ntvf:3\ncell:G25:l:1:f:6:ntvf:2\ncell:B26:l:1:f:2\ncell:C26:l:1:f:6:ntvf:2\ncell:D26:l:1:f:6:ntvf:4\ncell:E26:l:1:f:6:ntvf:2\ncell:F26:l:1:f:6:ntvf:3\ncell:G26:l:1:f:6:ntvf:2\ncell:B27:l:1:f:2\ncell:C27:l:1:f:6:ntvf:2\ncell:D27:l:1:f:6:ntvf:4\ncell:E27:l:1:f:6:ntvf:2\ncell:F27:l:1:f:6:ntvf:3\ncell:G27:l:1:f:6:ntvf:2\ncell:B28:l:1:f:2\ncell:C28:l:1:f:6:ntvf:2\ncell:D28:l:1:f:6:ntvf:4\ncell:E28:l:1:f:6:ntvf:2\ncell:F28:l:1:f:6:ntvf:3\ncell:G28:l:1:f:6:ntvf:2\ncell:B29:l:1:f:2\ncell:C29:l:1:f:6:ntvf:2\ncell:D29:l:1:f:6:ntvf:4\ncell:E29:l:1:f:6:ntvf:2\ncell:F29:l:1:f:6:ntvf:3\ncell:G29:l:1:f:6:ntvf:2\ncell:B30:l:1:f:2\ncell:C30:l:1:f:6:ntvf:2\ncell:D30:l:1:f:6:ntvf:4\ncell:E30:l:1:f:6:ntvf:2\ncell:F30:l:1:f:6:ntvf:3\ncell:G30:l:1:f:6:ntvf:2\ncell:B31:l:1:f:2\ncell:C31:l:1:f:6:ntvf:2\ncell:D31:l:1:f:6:ntvf:4\ncell:E31:l:1:f:6:ntvf:2\ncell:F31:l:1:f:6:ntvf:3\ncell:G31:l:1:f:6:ntvf:2\ncell:B32:l:1:f:2\ncell:C32:l:1:f:6:ntvf:2\ncell:D32:l:1:f:6:ntvf:4\ncell:E32:l:1:f:6:ntvf:2\ncell:F32:l:1:f:6:ntvf:3\ncell:G32:l:1:f:6:ntvf:2\ncell:B33:l:1:f:2\ncell:C33:l:1:f:6:ntvf:2\ncell:D33:l:1:f:6:ntvf:4\ncell:E33:l:1:f:6:ntvf:2\ncell:F33:l:1:f:6:ntvf:3\ncell:G33:l:1:f:6:ntvf:2\ncell:B34:l:1:f:2\ncell:C34:l:1:f:6:ntvf:2\ncell:D34:l:1:f:6:ntvf:4\ncell:E34:l:1:f:6:ntvf:2\ncell:F34:l:1:f:6:ntvf:3\ncell:G34:l:1:f:6:ntvf:2\ncell:B35:l:1:f:2\ncell:C35:l:1:f:6:ntvf:2\ncell:D35:l:1:f:6:ntvf:4\ncell:E35:l:1:f:6:ntvf:2\ncell:F35:l:1:f:6:ntvf:3\ncell:G35:l:1:f:6:ntvf:2\ncell:B36:l:1:f:2\ncell:C36:l:1:f:6:ntvf:2\ncell:D36:l:1:f:6:ntvf:4\ncell:E36:l:1:f:6:ntvf:2\ncell:F36:l:1:f:6:ntvf:3\ncell:G36:l:1:f:6:ntvf:2\ncell:B37:l:1:f:2\ncell:C37:l:1:f:6:ntvf:2\ncell:D37:l:1:f:6:ntvf:4\ncell:E37:l:1:f:6:ntvf:2\ncell:F37:l:1:f:6:ntvf:3\ncell:G37:l:1:f:6:ntvf:2\ncell:B38:l:1:f:2\ncell:C38:l:1:f:6:ntvf:2\ncell:D38:l:1:f:6:ntvf:4\ncell:E38:l:1:f:6:ntvf:2\ncell:F38:l:1:f:6:ntvf:3\ncell:G38:l:1:f:6:ntvf:2\ncell:B40:t:© Copyright, 2011, Jaxworks, All Rights Reserved.:l:1:f:5\ncol:A:w:12\ncol:B:w:178\ncol:C:w:118\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:15.75\nrow:10:h:15.75\nrow:11:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:15.75\nrow:19:h:15.75\nrow:20:h:15.75\nrow:21:h:15.75\nrow:22:h:15.75\nrow:23:h:15.75\nrow:24:h:15.75\nrow:25:h:15.75\nrow:26:h:15.75\nrow:27:h:15.75\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:15.75\nrow:31:h:15.75\nrow:32:h:15.75\nrow:33:h:15.75\nrow:34:h:15.75\nrow:35:h:15.75\nrow:36:h:15.75\nrow:37:h:15.75\nrow:38:h:15.75\nrow:40:h:14.25\nsheet:c:7:r:40:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\nfont:1:normal bold 10pt Arial\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 14pt Arial\nfont:4:normal bold 26pt Times New Roman\nfont:5:normal normal 10pt Arial\nfont:6:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:3:0.0%\nvalueformat:4:0.00%\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet14","hidden":"1"},"sheet22":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Revenue:l:2:f:9:c:3:bg:1:cf:1:ntvf:1:colspan:5\ncell:D3:l:2:f:4:cf:1\ncell:E3:l:2:f:3:cf:1:ntvf:1\ncell:F3:l:2:f:3:cf:1:ntvf:1\ncell:G3:l:2:f:3:cf:1:ntvf:1\ncell:C4:t: XYZ, Inc. :l:2:f:8:cf:1:ntvf:1\ncell:D4:l:2:f:4\ncell:E4:l:2:f:2:cf:1:ntvf:1\ncell:F4:l:2:f:2:cf:1:ntvf:1\ncell:G4:l:2:f:2:cf:1:ntvf:1\ncell:C5:t: 2009 Sales:l:2:f:6:cf:1:ntvf:3\ncell:D5:l:2\ncell:E5:l:2:f:2:cf:1:ntvf:1\ncell:F5:l:2:f:2:cf:1:ntvf:1\ncell:G5:l:2:f:2:cf:1:ntvf:1\ncell:C6:l:2\ncell:D6:l:2:f:4:ntvf:1\ncell:E6:l:2:f:4:ntvf:1\ncell:F6:l:2:f:4:ntvf:1\ncell:G6:l:2:f:4:ntvf:1\ncell:C7:l:2:f:4:ntvf:1\ncell:D7:t: Retail :l:2:f:8:cf:1:ntvf:1\ncell:E7:t: Wholesale :l:2:f:8:cf:1:ntvf:1\ncell:F7:t: Mail Order :l:2:f:8:cf:1:ntvf:1\ncell:G7:t:Total Sales:l:2:f:8:cf:1:ntvf:1\ncell:C8:t: Camping Gear :l:2:f:8:ntvf:1\ncell:D8:l:2:f:4:ntvf:1\ncell:E8:l:2:f:4:ntvf:1\ncell:F8:l:2:f:4:ntvf:1\ncell:G8:l:2:f:4:ntvf:1\ncell:C9:t:Product:l:2:f:1:ntvf:1\ncell:D9:v:18000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E9:v:24000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F9:v:10000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G9:vtf:n:52000:IF(SUM(D9\\cF9),SUM(D9\\cF9),\"\"):l:2:f:1:ntvf:2\ncell:H9:f:1\ncell:C10:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D10:v:14000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E10:v:15000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F10:v:9000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G10:vtf:n:38000:IF(SUM(D10\\cF10),SUM(D10\\cF10),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H10:f:1\ncell:C11:t:Product:l:2:f:1:ntvf:1\ncell:D11:v:8000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E11:v:11000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F11:v:7000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G11:vtf:n:26000:IF(SUM(D11\\cF11),SUM(D11\\cF11),\"\"):l:2:f:1:ntvf:2\ncell:H11:f:1\ncell:C12:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D12:v:4000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G12:vtf:n:16000:IF(SUM(D12\\cF12),SUM(D12\\cF12),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H12:f:1\ncell:C13:t:Product:l:2:f:1:ntvf:1\ncell:D13:v:2000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G13:vtf:n:8000:IF(SUM(D13\\cF13),SUM(D13\\cF13),\"\"):l:2:f:1:ntvf:2\ncell:H13:f:1\ncell:C14:l:2:f:1:ntvf:1\ncell:D14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G14:l:2:f:1:ntvf:2\ncell:H14:f:1\ncell:C15:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D15:vtf:n:46000:IF(SUM(D9\\cD13),SUM(D9\\cD13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E15:vtf:n:59000:IF(SUM(E9\\cE13),SUM(E9\\cE13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F15:vtf:n:35000:IF(SUM(F9\\cF13),SUM(F9\\cF13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G15:vtf:n:140000:IF(SUM(G9\\cG13),SUM(G9\\cG13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H15:f:7\ncell:C16:l:2:f:4:ntvf:1\ncell:D16:l:2:f:4:ntvf:2\ncell:E16:l:2:f:4:ntvf:2\ncell:F16:l:2:f:4:ntvf:2\ncell:G16:l:2:f:4:ntvf:2\ncell:C17:t: Mountain Climbing :l:2:f:8:ntvf:1\ncell:D17:l:2:f:4:ntvf:2\ncell:E17:l:2:f:4:ntvf:2\ncell:F17:l:2:f:4:ntvf:2\ncell:G17:l:2:f:4:ntvf:2\ncell:C18:t:Product:l:2:f:5:ntvf:1\ncell:D18:v:4000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E18:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F18:v:6500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G18:vtf:n:18500:IF(SUM(D18\\cF18),SUM(D18\\cF18),\"\"):l:2:f:5:ntvf:2\ncell:H18:f:5\ncell:C19:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D19:v:7000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E19:v:15000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F19:v:9000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G19:vtf:n:31000:IF(SUM(D19\\cF19),SUM(D19\\cF19),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H19:f:5\ncell:C20:t:Product:l:2:f:5:ntvf:1\ncell:D20:v:6000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E20:v:11000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F20:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G20:vtf:n:25000:IF(SUM(D20\\cF20),SUM(D20\\cF20),\"\"):l:2:f:5:ntvf:2\ncell:H20:f:5\ncell:C21:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D21:v:3000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E21:v:5500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F21:v:4500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G21:vtf:n:13000:IF(SUM(D21\\cF21),SUM(D21\\cF21),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H21:f:5\ncell:C22:t:Product:l:2:f:5:ntvf:1\ncell:D22:v:2000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E22:v:3500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F22:v:3000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G22:vtf:n:8500:IF(SUM(D22\\cF22),SUM(D22\\cF22),\"\"):l:2:f:5:ntvf:2\ncell:H22:f:5\ncell:C23:l:2:f:5:ntvf:1\ncell:D23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G23:l:2:f:5:ntvf:2\ncell:H23:f:5\ncell:C24:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D24:vtf:n:22000:IF(SUM(D18\\cD22),SUM(D18\\cD22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E24:vtf:n:43000:IF(SUM(E18\\cE22),SUM(E18\\cE22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F24:vtf:n:31000:IF(SUM(F18\\cF22),SUM(F18\\cF22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G24:vtf:n:96000:IF(SUM(G18\\cG22),SUM(G18\\cG22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H24:f:7\ncell:C25:l:2:f:4:ntvf:1\ncell:D25:l:2:f:4:ntvf:2\ncell:E25:l:2:f:4:ntvf:2\ncell:F25:l:2:f:4:ntvf:2\ncell:G25:l:2:f:4:ntvf:2\ncell:C26:l:1:f:4\ncol:A:w:10\ncol:B:w:10\ncol:C:w:309\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:15\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nsheet:c:8:r:26:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt *\nfont:6:normal normal 12pt Arial\nfont:7:normal normal 14pt *\nfont:8:normal normal 16pt Arial\nfont:9:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:#,##0.00;(#,##0.00)\nvalueformat:2:#,##0;(#,##0)\nvalueformat:3:@\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::C9\\cC21\nname:DATA_04::F9\\cF21\n"},"name":"sheet22","hidden":"1"},"sheet23":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Revenue:l:2:f:9:c:3:bg:1:cf:1:ntvf:1:colspan:5\ncell:D3:l:2:f:4:cf:1\ncell:E3:l:2:f:3:cf:1:ntvf:1\ncell:F3:l:2:f:3:cf:1:ntvf:1\ncell:G3:l:2:f:3:cf:1:ntvf:1\ncell:C4:t: XYZ, Inc. :l:2:f:8:cf:1:ntvf:1\ncell:D4:l:2:f:4\ncell:E4:l:2:f:2:cf:1:ntvf:1\ncell:F4:l:2:f:2:cf:1:ntvf:1\ncell:G4:l:2:f:2:cf:1:ntvf:1\ncell:C5:t: 2009 Sales:l:2:f:6:cf:1:ntvf:3\ncell:D5:l:2\ncell:E5:l:2:f:2:cf:1:ntvf:1\ncell:F5:l:2:f:2:cf:1:ntvf:1\ncell:G5:l:2:f:2:cf:1:ntvf:1\ncell:C6:l:2\ncell:D6:l:2:f:4:ntvf:1\ncell:E6:l:2:f:4:ntvf:1\ncell:F6:l:2:f:4:ntvf:1\ncell:G6:l:2:f:4:ntvf:1\ncell:C7:l:2:f:4:ntvf:1\ncell:D7:t: Retail :l:2:f:8:cf:1:ntvf:1\ncell:E7:t: Wholesale :l:2:f:8:cf:1:ntvf:1\ncell:F7:t: Mail Order :l:2:f:8:cf:1:ntvf:1\ncell:G7:t:Total Sales:l:2:f:8:cf:1:ntvf:1\ncell:C8:t: Camping Gear :l:2:f:8:ntvf:1\ncell:D8:l:2:f:4:ntvf:1\ncell:E8:l:2:f:4:ntvf:1\ncell:F8:l:2:f:4:ntvf:1\ncell:G8:l:2:f:4:ntvf:1\ncell:C9:t:Product:l:2:f:1:ntvf:1\ncell:D9:v:18000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E9:v:24000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F9:v:10000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G9:vtf:n:52000:IF(SUM(D9\\cF9),SUM(D9\\cF9),\"\"):l:2:f:1:ntvf:2\ncell:H9:f:1\ncell:C10:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D10:v:14000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E10:v:15000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F10:v:9000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G10:vtf:n:38000:IF(SUM(D10\\cF10),SUM(D10\\cF10),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H10:f:1\ncell:C11:t:Product:l:2:f:1:ntvf:1\ncell:D11:v:8000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E11:v:11000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F11:v:7000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G11:vtf:n:26000:IF(SUM(D11\\cF11),SUM(D11\\cF11),\"\"):l:2:f:1:ntvf:2\ncell:H11:f:1\ncell:C12:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D12:v:4000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G12:vtf:n:16000:IF(SUM(D12\\cF12),SUM(D12\\cF12),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H12:f:1\ncell:C13:t:Product:l:2:f:1:ntvf:1\ncell:D13:v:2000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G13:vtf:n:8000:IF(SUM(D13\\cF13),SUM(D13\\cF13),\"\"):l:2:f:1:ntvf:2\ncell:H13:f:1\ncell:C14:l:2:f:1:ntvf:1\ncell:D14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G14:l:2:f:1:ntvf:2\ncell:H14:f:1\ncell:C15:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D15:vtf:n:46000:IF(SUM(D9\\cD13),SUM(D9\\cD13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E15:vtf:n:59000:IF(SUM(E9\\cE13),SUM(E9\\cE13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F15:vtf:n:35000:IF(SUM(F9\\cF13),SUM(F9\\cF13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G15:vtf:n:140000:IF(SUM(G9\\cG13),SUM(G9\\cG13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H15:f:7\ncell:C16:l:2:f:4:ntvf:1\ncell:D16:l:2:f:4:ntvf:2\ncell:E16:l:2:f:4:ntvf:2\ncell:F16:l:2:f:4:ntvf:2\ncell:G16:l:2:f:4:ntvf:2\ncell:C17:t: Mountain Climbing :l:2:f:8:ntvf:1\ncell:D17:l:2:f:4:ntvf:2\ncell:E17:l:2:f:4:ntvf:2\ncell:F17:l:2:f:4:ntvf:2\ncell:G17:l:2:f:4:ntvf:2\ncell:C18:t:Product:l:2:f:5:ntvf:1\ncell:D18:v:4000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E18:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F18:v:6500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G18:vtf:n:18500:IF(SUM(D18\\cF18),SUM(D18\\cF18),\"\"):l:2:f:5:ntvf:2\ncell:H18:f:5\ncell:C19:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D19:v:7000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E19:v:15000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F19:v:9000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G19:vtf:n:31000:IF(SUM(D19\\cF19),SUM(D19\\cF19),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H19:f:5\ncell:C20:t:Product:l:2:f:5:ntvf:1\ncell:D20:v:6000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E20:v:11000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F20:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G20:vtf:n:25000:IF(SUM(D20\\cF20),SUM(D20\\cF20),\"\"):l:2:f:5:ntvf:2\ncell:H20:f:5\ncell:C21:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D21:v:3000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E21:v:5500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F21:v:4500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G21:vtf:n:13000:IF(SUM(D21\\cF21),SUM(D21\\cF21),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H21:f:5\ncell:C22:t:Product:l:2:f:5:ntvf:1\ncell:D22:v:2000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E22:v:3500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F22:v:3000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G22:vtf:n:8500:IF(SUM(D22\\cF22),SUM(D22\\cF22),\"\"):l:2:f:5:ntvf:2\ncell:H22:f:5\ncell:C23:l:2:f:5:ntvf:1\ncell:D23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G23:l:2:f:5:ntvf:2\ncell:H23:f:5\ncell:C24:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D24:vtf:n:22000:IF(SUM(D18\\cD22),SUM(D18\\cD22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E24:vtf:n:43000:IF(SUM(E18\\cE22),SUM(E18\\cE22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F24:vtf:n:31000:IF(SUM(F18\\cF22),SUM(F18\\cF22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G24:vtf:n:96000:IF(SUM(G18\\cG22),SUM(G18\\cG22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H24:f:7\ncell:C25:l:2:f:4:ntvf:1\ncell:D25:l:2:f:4:ntvf:2\ncell:E25:l:2:f:4:ntvf:2\ncell:F25:l:2:f:4:ntvf:2\ncell:G25:l:2:f:4:ntvf:2\ncell:C26:t: Men's Clothing :l:2:f:8:ntvf:1\ncell:D26:l:2:f:4:ntvf:2\ncell:E26:l:2:f:4:ntvf:2\ncell:F26:l:2:f:4:ntvf:2\ncell:G26:l:2:f:4:ntvf:2\ncell:C27:t:Product:l:2:f:5:ntvf:1\ncell:D27:v:16000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E27:v:30000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F27:v:15000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G27:vtf:n:61000:IF(SUM(D27\\cF27),SUM(D27\\cF27),\"\"):l:2:f:5:ntvf:2\ncell:H27:f:5\ncell:C28:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D28:v:18000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E28:v:32000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F28:v:18000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G28:vtf:n:68000:IF(SUM(D28\\cF28),SUM(D28\\cF28),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H28:f:5\ncell:C29:t:Product:l:2:f:5:ntvf:1\ncell:D29:v:24000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E29:v:46000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F29:v:38000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G29:vtf:n:108000:IF(SUM(D29\\cF29),SUM(D29\\cF29),\"\"):l:2:f:5:ntvf:2\ncell:H29:f:5\ncell:C30:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D30:v:16000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E30:v:32000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F30:v:19000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G30:vtf:n:67000:IF(SUM(D30\\cF30),SUM(D30\\cF30),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H30:f:5\ncell:C31:t:Product:l:2:f:5:ntvf:1\ncell:D31:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E31:v:12000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F31:v:10000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G31:vtf:n:30000:IF(SUM(D31\\cF31),SUM(D31\\cF31),\"\"):l:2:f:5:ntvf:2\ncell:H31:f:5\ncell:C32:l:2:f:5:ntvf:1\ncell:D32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G32:l:2:f:5:ntvf:2\ncell:H32:f:5\ncell:C33:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D33:vtf:n:82000:IF(SUM(D27\\cD31),SUM(D27\\cD31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E33:vtf:n:152000:IF(SUM(E27\\cE31),SUM(E27\\cE31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F33:vtf:n:100000:IF(SUM(F27\\cF31),SUM(F27\\cF31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G33:vtf:n:334000:IF(SUM(G27\\cG31),SUM(G27\\cG31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H33:f:7\ncell:C35:l:1:f:4\ncol:A:w:10\ncol:B:w:10\ncol:C:w:309\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:15\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:15\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:35:h:14.25\nsheet:c:8:r:35:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt *\nfont:6:normal normal 12pt Arial\nfont:7:normal normal 14pt *\nfont:8:normal normal 16pt Arial\nfont:9:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:#,##0.00;(#,##0.00)\nvalueformat:2:#,##0;(#,##0)\nvalueformat:3:@\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::C9\\cC21\nname:DATA_04::F9\\cF21\n"},"name":"sheet23","hidden":"1"},"sheet24":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Revenue:l:2:f:9:c:3:bg:1:cf:1:ntvf:1:colspan:5\ncell:D3:l:2:f:4:cf:1\ncell:E3:l:2:f:3:cf:1:ntvf:1\ncell:F3:l:2:f:3:cf:1:ntvf:1\ncell:G3:l:2:f:3:cf:1:ntvf:1\ncell:C4:t: XYZ, Inc. :l:2:f:8:cf:1:ntvf:1\ncell:D4:l:2:f:4\ncell:E4:l:2:f:2:cf:1:ntvf:1\ncell:F4:l:2:f:2:cf:1:ntvf:1\ncell:G4:l:2:f:2:cf:1:ntvf:1\ncell:C5:t: 2009 Sales:l:2:f:6:cf:1:ntvf:3\ncell:D5:l:2\ncell:E5:l:2:f:2:cf:1:ntvf:1\ncell:F5:l:2:f:2:cf:1:ntvf:1\ncell:G5:l:2:f:2:cf:1:ntvf:1\ncell:C6:l:2\ncell:D6:l:2:f:4:ntvf:1\ncell:E6:l:2:f:4:ntvf:1\ncell:F6:l:2:f:4:ntvf:1\ncell:G6:l:2:f:4:ntvf:1\ncell:C7:l:2:f:4:ntvf:1\ncell:D7:t: Retail :l:2:f:8:cf:1:ntvf:1\ncell:E7:t: Wholesale :l:2:f:8:cf:1:ntvf:1\ncell:F7:t: Mail Order :l:2:f:8:cf:1:ntvf:1\ncell:G7:t:Total Sales:l:2:f:8:cf:1:ntvf:1\ncell:C8:t: Camping Gear :l:2:f:8:ntvf:1\ncell:D8:l:2:f:4:ntvf:1\ncell:E8:l:2:f:4:ntvf:1\ncell:F8:l:2:f:4:ntvf:1\ncell:G8:l:2:f:4:ntvf:1\ncell:C9:t:Product:l:2:f:1:ntvf:1\ncell:D9:v:18000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E9:v:24000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F9:v:10000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G9:vtf:n:52000:IF(SUM(D9\\cF9),SUM(D9\\cF9),\"\"):l:2:f:1:ntvf:2\ncell:H9:f:1\ncell:C10:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D10:v:14000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E10:v:15000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F10:v:9000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G10:vtf:n:38000:IF(SUM(D10\\cF10),SUM(D10\\cF10),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H10:f:1\ncell:C11:t:Product:l:2:f:1:ntvf:1\ncell:D11:v:8000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E11:v:11000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F11:v:7000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G11:vtf:n:26000:IF(SUM(D11\\cF11),SUM(D11\\cF11),\"\"):l:2:f:1:ntvf:2\ncell:H11:f:1\ncell:C12:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D12:v:4000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G12:vtf:n:16000:IF(SUM(D12\\cF12),SUM(D12\\cF12),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H12:f:1\ncell:C13:t:Product:l:2:f:1:ntvf:1\ncell:D13:v:2000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G13:vtf:n:8000:IF(SUM(D13\\cF13),SUM(D13\\cF13),\"\"):l:2:f:1:ntvf:2\ncell:H13:f:1\ncell:C14:l:2:f:1:ntvf:1\ncell:D14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G14:l:2:f:1:ntvf:2\ncell:H14:f:1\ncell:C15:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D15:vtf:n:46000:IF(SUM(D9\\cD13),SUM(D9\\cD13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E15:vtf:n:59000:IF(SUM(E9\\cE13),SUM(E9\\cE13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F15:vtf:n:35000:IF(SUM(F9\\cF13),SUM(F9\\cF13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G15:vtf:n:140000:IF(SUM(G9\\cG13),SUM(G9\\cG13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H15:f:7\ncell:C16:l:2:f:4:ntvf:1\ncell:D16:l:2:f:4:ntvf:2\ncell:E16:l:2:f:4:ntvf:2\ncell:F16:l:2:f:4:ntvf:2\ncell:G16:l:2:f:4:ntvf:2\ncell:C17:t: Mountain Climbing :l:2:f:8:ntvf:1\ncell:D17:l:2:f:4:ntvf:2\ncell:E17:l:2:f:4:ntvf:2\ncell:F17:l:2:f:4:ntvf:2\ncell:G17:l:2:f:4:ntvf:2\ncell:C18:t:Product:l:2:f:5:ntvf:1\ncell:D18:v:4000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E18:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F18:v:6500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G18:vtf:n:18500:IF(SUM(D18\\cF18),SUM(D18\\cF18),\"\"):l:2:f:5:ntvf:2\ncell:H18:f:5\ncell:C19:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D19:v:7000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E19:v:15000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F19:v:9000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G19:vtf:n:31000:IF(SUM(D19\\cF19),SUM(D19\\cF19),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H19:f:5\ncell:C20:t:Product:l:2:f:5:ntvf:1\ncell:D20:v:6000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E20:v:11000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F20:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G20:vtf:n:25000:IF(SUM(D20\\cF20),SUM(D20\\cF20),\"\"):l:2:f:5:ntvf:2\ncell:H20:f:5\ncell:C21:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D21:v:3000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E21:v:5500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F21:v:4500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G21:vtf:n:13000:IF(SUM(D21\\cF21),SUM(D21\\cF21),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H21:f:5\ncell:C22:t:Product:l:2:f:5:ntvf:1\ncell:D22:v:2000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E22:v:3500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F22:v:3000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G22:vtf:n:8500:IF(SUM(D22\\cF22),SUM(D22\\cF22),\"\"):l:2:f:5:ntvf:2\ncell:H22:f:5\ncell:C23:l:2:f:5:ntvf:1\ncell:D23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G23:l:2:f:5:ntvf:2\ncell:H23:f:5\ncell:C24:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D24:vtf:n:22000:IF(SUM(D18\\cD22),SUM(D18\\cD22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E24:vtf:n:43000:IF(SUM(E18\\cE22),SUM(E18\\cE22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F24:vtf:n:31000:IF(SUM(F18\\cF22),SUM(F18\\cF22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G24:vtf:n:96000:IF(SUM(G18\\cG22),SUM(G18\\cG22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H24:f:7\ncell:C25:l:2:f:4:ntvf:1\ncell:D25:l:2:f:4:ntvf:2\ncell:E25:l:2:f:4:ntvf:2\ncell:F25:l:2:f:4:ntvf:2\ncell:G25:l:2:f:4:ntvf:2\ncell:C26:t: Men's Clothing :l:2:f:8:ntvf:1\ncell:D26:l:2:f:4:ntvf:2\ncell:E26:l:2:f:4:ntvf:2\ncell:F26:l:2:f:4:ntvf:2\ncell:G26:l:2:f:4:ntvf:2\ncell:C27:t:Product:l:2:f:5:ntvf:1\ncell:D27:v:16000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E27:v:30000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F27:v:15000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G27:vtf:n:61000:IF(SUM(D27\\cF27),SUM(D27\\cF27),\"\"):l:2:f:5:ntvf:2\ncell:H27:f:5\ncell:C28:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D28:v:18000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E28:v:32000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F28:v:18000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G28:vtf:n:68000:IF(SUM(D28\\cF28),SUM(D28\\cF28),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H28:f:5\ncell:C29:t:Product:l:2:f:5:ntvf:1\ncell:D29:v:24000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E29:v:46000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F29:v:38000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G29:vtf:n:108000:IF(SUM(D29\\cF29),SUM(D29\\cF29),\"\"):l:2:f:5:ntvf:2\ncell:H29:f:5\ncell:C30:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D30:v:16000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E30:v:32000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F30:v:19000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G30:vtf:n:67000:IF(SUM(D30\\cF30),SUM(D30\\cF30),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H30:f:5\ncell:C31:t:Product:l:2:f:5:ntvf:1\ncell:D31:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E31:v:12000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F31:v:10000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G31:vtf:n:30000:IF(SUM(D31\\cF31),SUM(D31\\cF31),\"\"):l:2:f:5:ntvf:2\ncell:H31:f:5\ncell:C32:l:2:f:5:ntvf:1\ncell:D32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G32:l:2:f:5:ntvf:2\ncell:H32:f:5\ncell:C33:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D33:vtf:n:82000:IF(SUM(D27\\cD31),SUM(D27\\cD31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E33:vtf:n:152000:IF(SUM(E27\\cE31),SUM(E27\\cE31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F33:vtf:n:100000:IF(SUM(F27\\cF31),SUM(F27\\cF31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G33:vtf:n:334000:IF(SUM(G27\\cG31),SUM(G27\\cG31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H33:f:7\ncell:C34:l:2:f:4:ntvf:1\ncell:D34:l:2:f:4:ntvf:2\ncell:E34:l:2:f:4:ntvf:2\ncell:F34:l:2:f:4:ntvf:2\ncell:G34:l:2:f:4:ntvf:2\ncell:C35:t: Women's Clothing :l:2:f:8:ntvf:1\ncell:D35:l:2:f:4:ntvf:2\ncell:E35:l:2:f:4:ntvf:2\ncell:F35:l:2:f:4:ntvf:2\ncell:G35:l:2:f:4:ntvf:2\ncell:C36:t:Product:l:2:f:1:ntvf:1\ncell:D36:v:13000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E36:v:26000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F36:v:12000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G36:vtf:n:51000:IF(SUM(D36\\cF36),SUM(D36\\cF36),\"\"):l:2:f:1:ntvf:2\ncell:H36:f:1\ncell:C37:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D37:v:17000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E37:v:32000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F37:v:15000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G37:vtf:n:64000:IF(SUM(D37\\cF37),SUM(D37\\cF37),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H37:f:1\ncell:C38:t:Product:l:2:f:1:ntvf:1\ncell:D38:v:21000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E38:v:42000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F38:v:33000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G38:vtf:n:96000:IF(SUM(D38\\cF38),SUM(D38\\cF38),\"\"):l:2:f:1:ntvf:2\ncell:H38:f:1\ncell:C39:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D39:v:11000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E39:v:19000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F39:v:17500:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G39:vtf:n:47500:IF(SUM(D39\\cF39),SUM(D39\\cF39),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H39:f:1\ncell:C40:t:Product:l:2:f:1:ntvf:1\ncell:D40:v:6500:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E40:v:11500:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F40:v:8500:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G40:vtf:n:26500:IF(SUM(D40\\cF40),SUM(D40\\cF40),\"\"):l:2:f:1:ntvf:2\ncell:H40:f:1\ncell:C41:l:2:f:1:ntvf:1\ncell:D41:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E41:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F41:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G41:l:2:f:1:ntvf:2\ncell:H41:f:1\ncell:C42:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D42:vtf:n:68500:IF(SUM(D36\\cD40),SUM(D36\\cD40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E42:vtf:n:130500:IF(SUM(E36\\cE40),SUM(E36\\cE40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F42:vtf:n:86000:IF(SUM(F36\\cF40),SUM(F36\\cF40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G42:vtf:n:285000:IF(SUM(G36\\cG40),SUM(G36\\cG40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H42:f:7\ncell:C43:l:1:f:4\ncol:A:w:10\ncol:B:w:10\ncol:C:w:309\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:15\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:15\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:15\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nsheet:c:8:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt *\nfont:6:normal normal 12pt Arial\nfont:7:normal normal 14pt *\nfont:8:normal normal 16pt Arial\nfont:9:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:#,##0.00;(#,##0.00)\nvalueformat:2:#,##0;(#,##0)\nvalueformat:3:@\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::C9\\cC21\nname:DATA_04::F9\\cF21\n"},"name":"sheet24","hidden":"1"},"sheet25":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Revenue:l:2:f:9:c:3:bg:1:cf:1:ntvf:1:colspan:5\ncell:D3:l:2:f:4:cf:1\ncell:E3:l:2:f:3:cf:1:ntvf:1\ncell:F3:l:2:f:3:cf:1:ntvf:1\ncell:G3:l:2:f:3:cf:1:ntvf:1\ncell:C4:t: XYZ, Inc. :l:2:f:8:cf:1:ntvf:1\ncell:D4:l:2:f:4\ncell:E4:l:2:f:2:cf:1:ntvf:1\ncell:F4:l:2:f:2:cf:1:ntvf:1\ncell:G4:l:2:f:2:cf:1:ntvf:1\ncell:C5:t: 2009 Sales:l:2:f:6:cf:1:ntvf:3\ncell:D5:l:2\ncell:E5:l:2:f:2:cf:1:ntvf:1\ncell:F5:l:2:f:2:cf:1:ntvf:1\ncell:G5:l:2:f:2:cf:1:ntvf:1\ncell:C6:l:2\ncell:D6:l:2:f:4:ntvf:1\ncell:E6:l:2:f:4:ntvf:1\ncell:F6:l:2:f:4:ntvf:1\ncell:G6:l:2:f:4:ntvf:1\ncell:C7:l:2:f:4:ntvf:1\ncell:D7:t: Retail :l:2:f:8:cf:1:ntvf:1\ncell:E7:t: Wholesale :l:2:f:8:cf:1:ntvf:1\ncell:F7:t: Mail Order :l:2:f:8:cf:1:ntvf:1\ncell:G7:t:Total Sales:l:2:f:8:cf:1:ntvf:1\ncell:C8:t: Camping Gear :l:2:f:8:ntvf:1\ncell:D8:l:2:f:4:ntvf:1\ncell:E8:l:2:f:4:ntvf:1\ncell:F8:l:2:f:4:ntvf:1\ncell:G8:l:2:f:4:ntvf:1\ncell:C9:t:Product:l:2:f:1:ntvf:1\ncell:D9:v:18000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E9:v:24000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F9:v:10000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G9:vtf:n:52000:IF(SUM(D9\\cF9),SUM(D9\\cF9),\"\"):l:2:f:1:ntvf:2\ncell:H9:f:1\ncell:C10:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D10:v:14000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E10:v:15000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F10:v:9000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G10:vtf:n:38000:IF(SUM(D10\\cF10),SUM(D10\\cF10),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H10:f:1\ncell:C11:t:Product:l:2:f:1:ntvf:1\ncell:D11:v:8000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E11:v:11000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F11:v:7000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G11:vtf:n:26000:IF(SUM(D11\\cF11),SUM(D11\\cF11),\"\"):l:2:f:1:ntvf:2\ncell:H11:f:1\ncell:C12:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D12:v:4000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G12:vtf:n:16000:IF(SUM(D12\\cF12),SUM(D12\\cF12),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H12:f:1\ncell:C13:t:Product:l:2:f:1:ntvf:1\ncell:D13:v:2000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G13:vtf:n:8000:IF(SUM(D13\\cF13),SUM(D13\\cF13),\"\"):l:2:f:1:ntvf:2\ncell:H13:f:1\ncell:C14:l:2:f:1:ntvf:1\ncell:D14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G14:l:2:f:1:ntvf:2\ncell:H14:f:1\ncell:C15:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D15:vtf:n:46000:IF(SUM(D9\\cD13),SUM(D9\\cD13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E15:vtf:n:59000:IF(SUM(E9\\cE13),SUM(E9\\cE13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F15:vtf:n:35000:IF(SUM(F9\\cF13),SUM(F9\\cF13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G15:vtf:n:140000:IF(SUM(G9\\cG13),SUM(G9\\cG13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H15:f:7\ncell:C16:l:2:f:4:ntvf:1\ncell:D16:l:2:f:4:ntvf:2\ncell:E16:l:2:f:4:ntvf:2\ncell:F16:l:2:f:4:ntvf:2\ncell:G16:l:2:f:4:ntvf:2\ncell:C17:t: Mountain Climbing :l:2:f:8:ntvf:1\ncell:D17:l:2:f:4:ntvf:2\ncell:E17:l:2:f:4:ntvf:2\ncell:F17:l:2:f:4:ntvf:2\ncell:G17:l:2:f:4:ntvf:2\ncell:C18:t:Product:l:2:f:5:ntvf:1\ncell:D18:v:4000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E18:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F18:v:6500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G18:vtf:n:18500:IF(SUM(D18\\cF18),SUM(D18\\cF18),\"\"):l:2:f:5:ntvf:2\ncell:H18:f:5\ncell:C19:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D19:v:7000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E19:v:15000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F19:v:9000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G19:vtf:n:31000:IF(SUM(D19\\cF19),SUM(D19\\cF19),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H19:f:5\ncell:C20:t:Product:l:2:f:5:ntvf:1\ncell:D20:v:6000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E20:v:11000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F20:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G20:vtf:n:25000:IF(SUM(D20\\cF20),SUM(D20\\cF20),\"\"):l:2:f:5:ntvf:2\ncell:H20:f:5\ncell:C21:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D21:v:3000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E21:v:5500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F21:v:4500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G21:vtf:n:13000:IF(SUM(D21\\cF21),SUM(D21\\cF21),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H21:f:5\ncell:C22:t:Product:l:2:f:5:ntvf:1\ncell:D22:v:2000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E22:v:3500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F22:v:3000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G22:vtf:n:8500:IF(SUM(D22\\cF22),SUM(D22\\cF22),\"\"):l:2:f:5:ntvf:2\ncell:H22:f:5\ncell:C23:l:2:f:5:ntvf:1\ncell:D23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G23:l:2:f:5:ntvf:2\ncell:H23:f:5\ncell:C24:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D24:vtf:n:22000:IF(SUM(D18\\cD22),SUM(D18\\cD22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E24:vtf:n:43000:IF(SUM(E18\\cE22),SUM(E18\\cE22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F24:vtf:n:31000:IF(SUM(F18\\cF22),SUM(F18\\cF22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G24:vtf:n:96000:IF(SUM(G18\\cG22),SUM(G18\\cG22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H24:f:7\ncell:C25:l:2:f:4:ntvf:1\ncell:D25:l:2:f:4:ntvf:2\ncell:E25:l:2:f:4:ntvf:2\ncell:F25:l:2:f:4:ntvf:2\ncell:G25:l:2:f:4:ntvf:2\ncell:C26:t: Men's Clothing :l:2:f:8:ntvf:1\ncell:D26:l:2:f:4:ntvf:2\ncell:E26:l:2:f:4:ntvf:2\ncell:F26:l:2:f:4:ntvf:2\ncell:G26:l:2:f:4:ntvf:2\ncell:C27:t:Product:l:2:f:5:ntvf:1\ncell:D27:v:16000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E27:v:30000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F27:v:15000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G27:vtf:n:61000:IF(SUM(D27\\cF27),SUM(D27\\cF27),\"\"):l:2:f:5:ntvf:2\ncell:H27:f:5\ncell:C28:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D28:v:18000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E28:v:32000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F28:v:18000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G28:vtf:n:68000:IF(SUM(D28\\cF28),SUM(D28\\cF28),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H28:f:5\ncell:C29:t:Product:l:2:f:5:ntvf:1\ncell:D29:v:24000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E29:v:46000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F29:v:38000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G29:vtf:n:108000:IF(SUM(D29\\cF29),SUM(D29\\cF29),\"\"):l:2:f:5:ntvf:2\ncell:H29:f:5\ncell:C30:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D30:v:16000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E30:v:32000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F30:v:19000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G30:vtf:n:67000:IF(SUM(D30\\cF30),SUM(D30\\cF30),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H30:f:5\ncell:C31:t:Product:l:2:f:5:ntvf:1\ncell:D31:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E31:v:12000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F31:v:10000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G31:vtf:n:30000:IF(SUM(D31\\cF31),SUM(D31\\cF31),\"\"):l:2:f:5:ntvf:2\ncell:H31:f:5\ncell:C32:l:2:f:5:ntvf:1\ncell:D32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G32:l:2:f:5:ntvf:2\ncell:H32:f:5\ncell:C33:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D33:vtf:n:82000:IF(SUM(D27\\cD31),SUM(D27\\cD31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E33:vtf:n:152000:IF(SUM(E27\\cE31),SUM(E27\\cE31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F33:vtf:n:100000:IF(SUM(F27\\cF31),SUM(F27\\cF31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G33:vtf:n:334000:IF(SUM(G27\\cG31),SUM(G27\\cG31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H33:f:7\ncell:C34:l:2:f:4:ntvf:1\ncell:D34:l:2:f:4:ntvf:2\ncell:E34:l:2:f:4:ntvf:2\ncell:F34:l:2:f:4:ntvf:2\ncell:G34:l:2:f:4:ntvf:2\ncell:C35:t: Women's Clothing :l:2:f:8:ntvf:1\ncell:D35:l:2:f:4:ntvf:2\ncell:E35:l:2:f:4:ntvf:2\ncell:F35:l:2:f:4:ntvf:2\ncell:G35:l:2:f:4:ntvf:2\ncell:C36:t:Product:l:2:f:1:ntvf:1\ncell:D36:v:13000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E36:v:26000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F36:v:12000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G36:vtf:n:51000:IF(SUM(D36\\cF36),SUM(D36\\cF36),\"\"):l:2:f:1:ntvf:2\ncell:H36:f:1\ncell:C37:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D37:v:17000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E37:v:32000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F37:v:15000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G37:vtf:n:64000:IF(SUM(D37\\cF37),SUM(D37\\cF37),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H37:f:1\ncell:C38:t:Product:l:2:f:1:ntvf:1\ncell:D38:v:21000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E38:v:42000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F38:v:33000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G38:vtf:n:96000:IF(SUM(D38\\cF38),SUM(D38\\cF38),\"\"):l:2:f:1:ntvf:2\ncell:H38:f:1\ncell:C39:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D39:v:11000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E39:v:19000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F39:v:17500:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G39:vtf:n:47500:IF(SUM(D39\\cF39),SUM(D39\\cF39),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H39:f:1\ncell:C40:t:Product:l:2:f:1:ntvf:1\ncell:D40:v:6500:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E40:v:11500:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F40:v:8500:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G40:vtf:n:26500:IF(SUM(D40\\cF40),SUM(D40\\cF40),\"\"):l:2:f:1:ntvf:2\ncell:H40:f:1\ncell:C41:l:2:f:1:ntvf:1\ncell:D41:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E41:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F41:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G41:l:2:f:1:ntvf:2\ncell:H41:f:1\ncell:C42:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D42:vtf:n:68500:IF(SUM(D36\\cD40),SUM(D36\\cD40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E42:vtf:n:130500:IF(SUM(E36\\cE40),SUM(E36\\cE40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F42:vtf:n:86000:IF(SUM(F36\\cF40),SUM(F36\\cF40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G42:vtf:n:285000:IF(SUM(G36\\cG40),SUM(G36\\cG40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H42:f:7\ncell:C43:l:2:f:4:ntvf:1\ncell:D43:l:2:f:4:ntvf:2\ncell:E43:l:2:f:4:ntvf:2\ncell:F43:l:2:f:4:ntvf:2\ncell:G43:l:2:f:4:ntvf:2\ncell:C44:t: Kids Corner :l:2:f:8:ntvf:1\ncell:D44:l:2:f:4:ntvf:2\ncell:E44:l:2:f:4:ntvf:2\ncell:F44:l:2:f:4:ntvf:2\ncell:G44:l:2:f:4:ntvf:2\ncell:C45:t:Product:l:2:f:5:ntvf:1\ncell:D45:v:7000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E45:v:13000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F45:v:9000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G45:vtf:n:29000:IF(SUM(D45\\cF45),SUM(D45\\cF45),\"\"):l:2:f:5:ntvf:2\ncell:H45:f:5\ncell:C46:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D46:v:8500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E46:v:16000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F46:v:11000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G46:vtf:n:35500:IF(SUM(D46\\cF46),SUM(D46\\cF46),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H46:f:5\ncell:C47:t:Product:l:2:f:5:ntvf:1\ncell:D47:v:13000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E47:v:22000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F47:v:17000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G47:vtf:n:52000:IF(SUM(D47\\cF47),SUM(D47\\cF47),\"\"):l:2:f:5:ntvf:2\ncell:H47:f:5\ncell:C48:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D48:v:6000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E48:v:11000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F48:v:9000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G48:vtf:n:26000:IF(SUM(D48\\cF48),SUM(D48\\cF48),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H48:f:5\ncell:C49:t:Product:l:2:f:5:ntvf:1\ncell:D49:v:4000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E49:v:7000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F49:v:6500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G49:vtf:n:17500:IF(SUM(D49\\cF49),SUM(D49\\cF49),\"\"):l:2:f:5:ntvf:2\ncell:H49:f:5\ncell:C50:l:2:f:5:ntvf:1\ncell:D50:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E50:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F50:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G50:l:2:f:5:ntvf:2\ncell:H50:f:5\ncell:C51:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D51:vtf:n:38500:IF(SUM(D45\\cD49),SUM(D45\\cD49),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E51:vtf:n:69000:IF(SUM(E45\\cE49),SUM(E45\\cE49),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F51:vtf:n:52500:IF(SUM(F45\\cF49),SUM(F45\\cF49),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G51:vtf:n:160000:IF(SUM(G45\\cG49),SUM(G45\\cG49),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H51:f:7\ncell:C52:l:2\ncell:D52:l:2\ncell:E52:l:2\ncell:F52:l:2\ncell:G52:l:2\ncell:C54:l:1:f:4\ncol:A:w:10\ncol:B:w:10\ncol:C:w:309\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:15\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:15\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:15\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:15\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:54:h:14.25\nsheet:c:8:r:54:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt *\nfont:6:normal normal 12pt Arial\nfont:7:normal normal 14pt *\nfont:8:normal normal 16pt Arial\nfont:9:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:#,##0.00;(#,##0.00)\nvalueformat:2:#,##0;(#,##0)\nvalueformat:3:@\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::C9\\cC21\nname:DATA_04::F9\\cF21\n"},"name":"sheet25","hidden":"1"},"sheet26":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Product Sales Goals:l:2:f:6:c:3:bg:1:cf:1:colspan:12\ncell:D3:l:2:f:1:cf:1\ncell:E3:l:2:f:1:cf:1\ncell:F3:l:2:f:1:cf:1\ncell:G3:l:2:f:1:cf:1\ncell:H3:l:2:f:1:cf:1\ncell:I3:l:2:f:1:cf:1\ncell:J3:l:2:f:1:cf:1\ncell:K3:l:2:f:1:cf:1\ncell:L3:l:2:f:1:cf:1\ncell:M3:l:2:f:1:cf:1\ncell:N3:l:2:f:1:cf:1\ncell:D4:l:2:f:1:cf:1\ncell:E4:l:2:f:1:cf:1\ncell:F4:l:2:f:1:cf:1\ncell:G4:l:2:f:1:cf:1\ncell:H4:l:2:f:1:cf:1\ncell:I4:l:2:f:1:cf:1\ncell:J4:l:2:f:1:cf:1\ncell:K4:l:2:f:1:cf:1\ncell:L4:l:2:f:1:cf:1\ncell:M4:l:2:f:1:cf:1\ncell:N4:l:2:f:1:cf:1\ncell:C5:t:2000 Units:l:2:f:3:cf:1:colspan:4\ncell:D5:l:2:f:1:cf:1\ncell:E5:l:2:f:1:cf:1\ncell:F5:l:2:f:1:cf:1\ncell:G5:l:2:f:1:cf:1\ncell:H5:l:2:f:1:cf:1\ncell:I5:l:2:f:1:cf:1\ncell:J5:l:2:f:1:cf:1\ncell:K5:l:2:f:1:cf:1\ncell:L5:l:2:f:1:cf:1\ncell:M5:l:2:f:1:cf:1\ncell:N5:l:2:f:1:cf:1\ncell:C6:l:2:f:1\ncell:D6:l:2\ncell:E6:l:2:f:1\ncell:F6:l:2:f:1\ncell:G6:l:2:f:1\ncell:H6:l:2:f:1\ncell:I6:l:2:f:1\ncell:J6:l:2:f:1\ncell:K6:l:2:f:1\ncell:L6:l:2:f:1\ncell:M6:l:2:f:1\ncell:N6:l:2:f:1\ncell:C7:l:2:f:1\ncell:D7:t:TRAINS:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:E7:t::l:2:f:5\ncell:F7:t::l:2:f:5\ncell:G7:l:2:f:5\ncell:H7:t:PLANES:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:I7:t::l:2:f:5\ncell:J7:t::l:2:f:5\ncell:K7:l:2:f:5\ncell:L7:t:TOTAL:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:M7:t::l:2:f:1\ncell:N7:t::l:2:f:1\ncell:C8:l:2:f:1\ncell:D8:t:Last Yr:b:::2::l:2:f:3:cf:1\ncell:E8:t:Goal:b:::2::l:2:f:3:cf:1\ncell:F8:t:Change:l:2:f:3:cf:1\ncell:G8:l:2:f:3:cf:1\ncell:H8:t:Last Yr:b:::2::l:2:f:3:cf:1\ncell:I8:t:Goal:b:::2::l:2:f:3:cf:1\ncell:J8:t:Change:l:2:f:3:cf:1\ncell:K8:l:2:f:3:cf:1\ncell:L8:t:Last Yr:l:2:f:3:cf:1\ncell:M8:t:Goal:l:2:f:3:cf:1\ncell:N8:t:Change:l:2:f:3:cf:1\ncell:C9:t:Jan:b::2:::l:2:f:2\ncell:D9:v:1782:b:2:2:2:2:l:2:f:2\ncell:E9:v:2000:b:2:2:2:2:l:2:f:2\ncell:F9:vtf:n:0.122334455667789:IF(ISNUMBER(D9),((E9-D9)/D9),\"\"):l:2:f:2:ntvf:1\ncell:G9:l:2:f:2:ntvf:1\ncell:H9:v:325:b:2:2:2:2:l:2:f:2\ncell:I9:v:350:b:2:2:2:2:l:2:f:2\ncell:J9:vtf:n:0.07692307692307693:IF(ISNUMBER(H9),((I9-H9)/H9),\"\"):l:2:f:2:ntvf:1\ncell:K9:l:2:f:2:ntvf:1\ncell:L9:vtf:n:2107:IF(SUM(D9,H9),SUM(D9,H9),\"\"):l:2:f:2\ncell:M9:vtf:n:2350:IF(SUM(E9,I9),SUM(E9,I9),\"\"):l:2:f:2\ncell:N9:vtf:n:0.11532985287138112:IF(ISNUMBER(L9),((M9-L9)/L9),\"\"):l:2:f:2:ntvf:1\ncell:O9:f:2\ncell:C10:t:Feb:b::2:::l:2:f:2:bg:2\ncell:D10:v:1523:b:2:2:2:2:l:2:f:2:bg:2\ncell:E10:v:1700:b:2:2:2:2:l:2:f:2:bg:2\ncell:F10:vtf:n:0.11621799080761655:IF(ISNUMBER(D10),((E10-D10)/D10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G10:l:2:f:2:ntvf:1\ncell:H10:v:158:b:2:2:2:2:l:2:f:2:bg:2\ncell:I10:v:200:b:2:2:2:2:l:2:f:2:bg:2\ncell:J10:vtf:n:0.26582278481012656:IF(ISNUMBER(H10),((I10-H10)/H10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K10:l:2:f:2:ntvf:1\ncell:L10:vtf:n:1681:IF(SUM(D10,H10),SUM(D10,H10),\"\"):l:2:f:2:bg:2\ncell:M10:vtf:n:1900:IF(SUM(E10,I10),SUM(E10,I10),\"\"):l:2:f:2:bg:2\ncell:N10:vtf:n:0.13027959547888163:IF(ISNUMBER(L10),((M10-L10)/L10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O10:f:2\ncell:C11:t:Mar:b::2:::l:2:f:2\ncell:D11:v:1901:b:2:2:2:2:l:2:f:2\ncell:E11:v:2000:b:2:2:2:2:l:2:f:2\ncell:F11:vtf:n:0.05207785376117833:IF(ISNUMBER(D11),((E11-D11)/D11),\"\"):l:2:f:2:ntvf:1\ncell:G11:l:2:f:2:ntvf:1\ncell:H11:v:168:b:2:2:2:2:l:2:f:2\ncell:I11:v:200:b:2:2:2:2:l:2:f:2\ncell:J11:vtf:n:0.19047619047619047:IF(ISNUMBER(H11),((I11-H11)/H11),\"\"):l:2:f:2:ntvf:1\ncell:K11:l:2:f:2:ntvf:1\ncell:L11:vtf:n:2069:IF(SUM(D11,H11),SUM(D11,H11),\"\"):l:2:f:2\ncell:M11:vtf:n:2200:IF(SUM(E11,I11),SUM(E11,I11),\"\"):l:2:f:2\ncell:N11:vtf:n:0.06331561140647655:IF(ISNUMBER(L11),((M11-L11)/L11),\"\"):l:2:f:2:ntvf:1\ncell:O11:f:2\ncell:C12:t:Apr:b::1:::l:2:f:2:bg:2\ncell:D12:v:2308:b:2:1:2:2:l:2:f:2:bg:2\ncell:E12:v:2400:b:2:1:2:2:l:2:f:2:bg:2\ncell:F12:vtf:n:0.03986135181975736:IF(ISNUMBER(D12),((E12-D12)/D12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G12:l:2:f:2:ntvf:1\ncell:H12:v:365:b:2:1:2:2:l:2:f:2:bg:2\ncell:I12:v:400:b:2:1:2:2:l:2:f:2:bg:2\ncell:J12:vtf:n:0.0958904109589041:IF(ISNUMBER(H12),((I12-H12)/H12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K12:l:2:f:2:ntvf:1\ncell:L12:vtf:n:2673:IF(SUM(D12,H12),SUM(D12,H12),\"\"):l:2:f:2:bg:2\ncell:M12:vtf:n:2800:IF(SUM(E12,I12),SUM(E12,I12),\"\"):l:2:f:2:bg:2\ncell:N12:vtf:n:0.04751215862326973:IF(ISNUMBER(L12),((M12-L12)/L12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O12:f:2\ncell:C13:t:May:b::2:::l:2:f:2\ncell:D13:v:2538:b:2:2:2:2:l:2:f:2\ncell:E13:v:2800:b:2:2:2:2:l:2:f:2\ncell:F13:vtf:n:0.10323089046493301:IF(ISNUMBER(D13),((E13-D13)/D13),\"\"):l:2:f:2:ntvf:1\ncell:G13:l:2:f:2:ntvf:1\ncell:H13:v:402:b:2:2:2:2:l:2:f:2\ncell:I13:v:450:b:2:2:2:2:l:2:f:2\ncell:J13:vtf:n:0.11940298507462686:IF(ISNUMBER(H13),((I13-H13)/H13),\"\"):l:2:f:2:ntvf:1\ncell:K13:l:2:f:2:ntvf:1\ncell:L13:vtf:n:2940:IF(SUM(D13,H13),SUM(D13,H13),\"\"):l:2:f:2\ncell:M13:vtf:n:3250:IF(SUM(E13,I13),SUM(E13,I13),\"\"):l:2:f:2\ncell:N13:vtf:n:0.1054421768707483:IF(ISNUMBER(L13),((M13-L13)/L13),\"\"):l:2:f:2:ntvf:1\ncell:O13:f:2\ncell:C14:t:Jun:b::2:::l:2:f:2:bg:2\ncell:D14:v:1866:b:2:2:2:2:l:2:f:2:bg:2\ncell:E14:v:2000:b:2:2:2:2:l:2:f:2:bg:2\ncell:F14:vtf:n:0.07181136120042872:IF(ISNUMBER(D14),((E14-D14)/D14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G14:l:2:f:2:ntvf:1\ncell:H14:v:217:b:2:2:2:2:l:2:f:2:bg:2\ncell:I14:v:250:b:2:2:2:2:l:2:f:2:bg:2\ncell:J14:vtf:n:0.15207373271889402:IF(ISNUMBER(H14),((I14-H14)/H14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K14:l:2:f:2:ntvf:1\ncell:L14:vtf:n:2083:IF(SUM(D14,H14),SUM(D14,H14),\"\"):l:2:f:2:bg:2\ncell:M14:vtf:n:2250:IF(SUM(E14,I14),SUM(E14,I14),\"\"):l:2:f:2:bg:2\ncell:N14:vtf:n:0.0801728276524244:IF(ISNUMBER(L14),((M14-L14)/L14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O14:f:2\ncell:C15:t:Jul:b::2:::l:2:f:2\ncell:D15:v:2212:b:2:2:2:2:l:2:f:2\ncell:E15:v:2500:b:2:2:2:2:l:2:f:2\ncell:F15:vtf:n:0.1301989150090416:IF(ISNUMBER(D15),((E15-D15)/D15),\"\"):l:2:f:2:ntvf:1\ncell:G15:l:2:f:2:ntvf:1\ncell:H15:v:264:b:2:2:2:2:l:2:f:2\ncell:I15:v:300:b:2:2:2:2:l:2:f:2\ncell:J15:vtf:n:0.13636363636363635:IF(ISNUMBER(H15),((I15-H15)/H15),\"\"):l:2:f:2:ntvf:1\ncell:K15:l:2:f:2:ntvf:1\ncell:L15:vtf:n:2476:IF(SUM(D15,H15),SUM(D15,H15),\"\"):l:2:f:2\ncell:M15:vtf:n:2800:IF(SUM(E15,I15),SUM(E15,I15),\"\"):l:2:f:2\ncell:N15:vtf:n:0.1308562197092084:IF(ISNUMBER(L15),((M15-L15)/L15),\"\"):l:2:f:2:ntvf:1\ncell:O15:f:2\ncell:C16:t:Aug:b::2:::l:2:f:2:bg:2\ncell:D16:v:1998:b:2:2:2:2:l:2:f:2:bg:2\ncell:E16:v:2300:b:2:2:2:2:l:2:f:2:bg:2\ncell:F16:vtf:n:0.15115115115115116:IF(ISNUMBER(D16),((E16-D16)/D16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G16:l:2:f:2:ntvf:1\ncell:H16:v:267:b:2:2:2:2:l:2:f:2:bg:2\ncell:I16:v:300:b:2:2:2:2:l:2:f:2:bg:2\ncell:J16:vtf:n:0.12359550561797752:IF(ISNUMBER(H16),((I16-H16)/H16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K16:l:2:f:2:ntvf:1\ncell:L16:vtf:n:2265:IF(SUM(D16,H16),SUM(D16,H16),\"\"):l:2:f:2:bg:2\ncell:M16:vtf:n:2600:IF(SUM(E16,I16),SUM(E16,I16),\"\"):l:2:f:2:bg:2\ncell:N16:vtf:n:0.1479028697571744:IF(ISNUMBER(L16),((M16-L16)/L16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O16:f:2\ncell:C17:t:Sep:b::2:::l:2:f:2\ncell:D17:v:2054:b:2:2:2:2:l:2:f:2\ncell:E17:v:2000:b:2:2:2:2:l:2:f:2\ncell:F17:vtf:n:-0.02629016553067186:IF(ISNUMBER(D17),((E17-D17)/D17),\"\"):l:2:f:2:ntvf:1\ncell:G17:l:2:f:2:ntvf:1\ncell:H17:v:318:b:2:2:2:2:l:2:f:2\ncell:I17:v:350:b:2:2:2:2:l:2:f:2\ncell:J17:vtf:n:0.10062893081761007:IF(ISNUMBER(H17),((I17-H17)/H17),\"\"):l:2:f:2:ntvf:1\ncell:K17:l:2:f:2:ntvf:1\ncell:L17:vtf:n:2372:IF(SUM(D17,H17),SUM(D17,H17),\"\"):l:2:f:2\ncell:M17:vtf:n:2350:IF(SUM(E17,I17),SUM(E17,I17),\"\"):l:2:f:2\ncell:N17:vtf:n:-0.00927487352445194:IF(ISNUMBER(L17),((M17-L17)/L17),\"\"):l:2:f:2:ntvf:1\ncell:O17:f:2\ncell:C18:t:Oct:b::2:::l:2:f:2:bg:2\ncell:D18:v:2117:b:2:2:2:2:l:2:f:2:bg:2\ncell:E18:v:2400:b:2:2:2:2:l:2:f:2:bg:2\ncell:F18:vtf:n:0.1336797354747284:IF(ISNUMBER(D18),((E18-D18)/D18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G18:l:2:f:2:ntvf:1\ncell:H18:v:159:b:2:2:2:2:l:2:f:2:bg:2\ncell:I18:v:200:b:2:2:2:2:l:2:f:2:bg:2\ncell:J18:vtf:n:0.2578616352201258:IF(ISNUMBER(H18),((I18-H18)/H18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K18:l:2:f:2:ntvf:1\ncell:L18:vtf:n:2276:IF(SUM(D18,H18),SUM(D18,H18),\"\"):l:2:f:2:bg:2\ncell:M18:vtf:n:2600:IF(SUM(E18,I18),SUM(E18,I18),\"\"):l:2:f:2:bg:2\ncell:N18:vtf:n:0.14235500878734622:IF(ISNUMBER(L18),((M18-L18)/L18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O18:f:2\ncell:C19:t:Nov:b::2:::l:2:f:2\ncell:D19:v:1430:b:2:2:2:2:l:2:f:2\ncell:E19:v:1600:b:2:2:2:2:l:2:f:2\ncell:F19:vtf:n:0.11888111888111888:IF(ISNUMBER(D19),((E19-D19)/D19),\"\"):l:2:f:2:ntvf:1\ncell:G19:l:2:f:2:ntvf:1\ncell:H19:v:193:b:2:2:2:2:l:2:f:2\ncell:I19:v:200:b:2:2:2:2:l:2:f:2\ncell:J19:vtf:n:0.03626943005181347:IF(ISNUMBER(H19),((I19-H19)/H19),\"\"):l:2:f:2:ntvf:1\ncell:K19:l:2:f:2:ntvf:1\ncell:L19:vtf:n:1623:IF(SUM(D19,H19),SUM(D19,H19),\"\"):l:2:f:2\ncell:M19:vtf:n:1800:IF(SUM(E19,I19),SUM(E19,I19),\"\"):l:2:f:2\ncell:N19:vtf:n:0.10905730129390019:IF(ISNUMBER(L19),((M19-L19)/L19),\"\"):l:2:f:2:ntvf:1\ncell:O19:f:2\ncell:C20:t:Dec:b::1:::l:2:f:2:bg:2\ncell:D20:v:1859:b:2:1:2:2:l:2:f:2:bg:2\ncell:E20:v:2100:b:2:1:2:2:l:2:f:2:bg:2\ncell:F20:vtf:n:0.1296395911780527:IF(ISNUMBER(D20),((E20-D20)/D20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G20:l:2:f:2:ntvf:1\ncell:H20:v:426:b:2:1:2:2:l:2:f:2:bg:2\ncell:I20:v:450:b:2:1:2:2:l:2:f:2:bg:2\ncell:J20:vtf:n:0.056338028169014086:IF(ISNUMBER(H20),((I20-H20)/H20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K20:l:2:f:2:ntvf:1\ncell:L20:vtf:n:2285:IF(SUM(D20,H20),SUM(D20,H20),\"\"):l:2:f:2:bg:2\ncell:M20:vtf:n:2550:IF(SUM(E20,I20),SUM(E20,I20),\"\"):l:2:f:2:bg:2\ncell:N20:vtf:n:0.11597374179431072:IF(ISNUMBER(L20),((M20-L20)/L20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O20:f:2\ncell:C22:t:Year :l:2:f:4\ncell:D22:vtf:n:23588:IF(SUM(D9\\cD20),SUM(D9\\cD20),\"\"):b:1::1::l:2:f:4\ncell:E22:vtf:n:25800:IF(SUM(E9\\cE20),SUM(E9\\cE20),\"\"):b:1::1::l:2:f:4\ncell:F22:vtf:n:0.09377649652365609:IF(ISNUMBER(D22),((E22-D22)/D22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:G22:b:1::1::l:2:f:2:ntvf:1\ncell:H22:vtf:n:3262:IF(SUM(H9\\cH20),SUM(H9\\cH20),\"\"):b:1::1::l:2:f:4\ncell:I22:vtf:n:3650:IF(SUM(I9\\cI20),SUM(I9\\cI20),\"\"):b:1::1::l:2:f:4\ncell:J22:vtf:n:0.11894543225015328:IF(ISNUMBER(H22),((I22-H22)/H22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:K22:b:1::1::l:2:f:2:ntvf:1\ncell:L22:vtf:n:26850:IF(SUM(L9\\cL20),SUM(L9\\cL20),\"\"):b:1::1::l:2:f:4\ncell:M22:vtf:n:29450:IF(SUM(M9\\cM20),SUM(M9\\cM20),\"\"):b:1::1::l:2:f:4\ncell:N22:vtf:n:0.09683426443202979:IF(ISNUMBER(L22),((M22-L22)/L22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:O22:f:2\ncell:C23:l:2:f:2\ncell:D23:l:2:f:2\ncell:E23:l:2:f:2\ncell:F23:l:2:f:2\ncell:G23:l:2:f:2\ncell:H23:l:2:f:2\ncell:I23:l:2:f:2\ncell:J23:l:2:f:2\ncell:K23:l:2:f:2\ncell:L23:l:2:f:2\ncell:M23:l:2:f:2\ncell:N23:l:2:f:2\ncell:O23:f:2\ncell:C24:t:Date\\c :l:2:f:2:cf:2\ncell:D24:b:::2::l:2:f:2:ntvf:2\ncell:E24:l:2:f:2\ncell:F24:l:2:f:2\ncell:G24:l:2:f:2\ncell:H24:l:2:f:2\ncell:I24:l:2:f:2\ncell:J24:l:2:f:2\ncell:K24:l:2:f:2:cf:1\ncell:L24:b:::2::l:2:f:2:cf:1\ncell:M24:b:::2::l:2:f:2:cf:1\ncell:N24:b:::2::l:2:f:2:cf:1\ncell:O24:f:2\ncell:C25:l:2:f:2\ncell:D25:b:2::::l:2:f:2\ncell:E25:l:2:f:2\ncell:F25:l:2:f:2\ncell:G25:l:2:f:2\ncell:H25:l:2:f:2\ncell:I25:l:2:f:2\ncell:J25:l:2:f:2\ncell:K25:b:2::::l:2:f:2\ncell:L25:b:2::::l:2:f:2\ncell:M25:b:2::::l:2:f:2\ncell:N25:b:2::::l:2:f:2\ncell:O25:f:2\ncell:C26:l:2\ncell:D26:l:2\ncell:E26:l:2\ncell:F26:l:2\ncell:G26:l:2\ncell:H26:l:2\ncell:I26:l:2\ncell:J26:l:2\ncell:K26:l:2\ncell:L26:l:2\ncell:M26:l:2\ncell:N26:l:2\ncell:C27:l:1:f:1\ncol:A:w:10\ncol:B:w:10\ncol:C:w:52\ncol:D:w:80\ncol:E:w:80\ncol:F:w:71\ncol:G:w:15\ncol:H:w:80\ncol:I:w:80\ncol:J:w:71\ncol:K:w:15\ncol:L:w:80\ncol:M:w:80\ncol:N:w:71\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:18.75\nrow:6:h:14.25\nrow:7:h:15.75\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:27:h:14.25\nsheet:c:15:r:27:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal normal 10pt Arial\nfont:2:normal normal 12pt arial,helvetica,sans-serif\nfont:3:normal normal 14pt Arial\nfont:4:normal normal 14pt arial,helvetica,sans-serif\nfont:5:normal normal 16pt Arial\nfont:6:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:0%\nvalueformat:2:dd-mmm-yy \nname:DATA_01::C5\nname:DATA_02::C10\nname:DATA_03::D10\\cD22\nname:DATA_04::H10\\cH22\n"},"name":"sheet26","hidden":"1"},"sheet27":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Product Sales Goals:l:2:f:6:c:3:bg:1:cf:1:colspan:16\ncell:D3:l:2:f:1:cf:1\ncell:E3:l:2:f:1:cf:1\ncell:F3:l:2:f:1:cf:1\ncell:G3:l:2:f:1:cf:1\ncell:H3:l:2:f:1:cf:1\ncell:I3:l:2:f:1:cf:1\ncell:J3:l:2:f:1:cf:1\ncell:K3:l:2:f:1:cf:1\ncell:L3:l:2:f:1:cf:1\ncell:M3:l:2:f:1:cf:1\ncell:N3:l:2:f:1:cf:1\ncell:O3:l:2:f:1:cf:1\ncell:P3:l:2:f:1:cf:1\ncell:Q3:l:2:f:1:cf:1\ncell:R3:l:2:f:1:cf:1\ncell:D4:l:2:f:1:cf:1\ncell:E4:l:2:f:1:cf:1\ncell:F4:l:2:f:1:cf:1\ncell:G4:l:2:f:1:cf:1\ncell:H4:l:2:f:1:cf:1\ncell:I4:l:2:f:1:cf:1\ncell:J4:l:2:f:1:cf:1\ncell:K4:l:2:f:1:cf:1\ncell:L4:l:2:f:1:cf:1\ncell:M4:l:2:f:1:cf:1\ncell:N4:l:2:f:1:cf:1\ncell:O4:l:2:f:1:cf:1\ncell:P4:l:2:f:1:cf:1\ncell:Q4:l:2:f:1:cf:1\ncell:R4:l:2:f:1:cf:1\ncell:C5:t:2000 Units:l:2:f:3:cf:1:colspan:4\ncell:D5:l:2:f:1:cf:1\ncell:E5:l:2:f:1:cf:1\ncell:F5:l:2:f:1:cf:1\ncell:G5:l:2:f:1:cf:1\ncell:H5:l:2:f:1:cf:1\ncell:I5:l:2:f:1:cf:1\ncell:J5:l:2:f:1:cf:1\ncell:K5:l:2:f:1:cf:1\ncell:L5:l:2:f:1:cf:1\ncell:M5:l:2:f:1:cf:1\ncell:N5:l:2:f:1:cf:1\ncell:O5:l:2:f:1:cf:1\ncell:P5:l:2:f:1:cf:1\ncell:Q5:l:2:f:1:cf:1\ncell:R5:l:2:f:1:cf:1\ncell:C6:l:2:f:1\ncell:D6:l:2\ncell:E6:l:2:f:1\ncell:F6:l:2:f:1\ncell:G6:l:2:f:1\ncell:H6:l:2:f:1\ncell:I6:l:2:f:1\ncell:J6:l:2:f:1\ncell:K6:l:2:f:1\ncell:L6:l:2:f:1\ncell:M6:l:2:f:1\ncell:N6:l:2:f:1\ncell:O6:l:2:f:1\ncell:P6:l:2:f:1\ncell:Q6:l:2:f:1\ncell:R6:l:2:f:1\ncell:C7:l:2:f:1\ncell:D7:t:TRAINS:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:E7:t::l:2:f:5\ncell:F7:t::l:2:f:5\ncell:G7:l:2:f:5\ncell:H7:t:PLANES:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:I7:t::l:2:f:5\ncell:J7:t::l:2:f:5\ncell:K7:l:2:f:5\ncell:L7:t:AUTOMOBILES:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:M7:t::l:2:f:5\ncell:N7:t::l:2:f:5\ncell:O7:l:2:f:5\ncell:P7:t:TOTAL:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:Q7:t::l:2:f:1\ncell:R7:t::l:2:f:1\ncell:C8:l:2:f:1\ncell:D8:t:Last Yr:b:::2::l:2:f:3:cf:1\ncell:E8:t:Goal:b:::2::l:2:f:3:cf:1\ncell:F8:t:Change:l:2:f:3:cf:1\ncell:G8:l:2:f:3:cf:1\ncell:H8:t:Last Yr:b:::2::l:2:f:3:cf:1\ncell:I8:t:Goal:b:::2::l:2:f:3:cf:1\ncell:J8:t:Change:l:2:f:3:cf:1\ncell:K8:l:2:f:3:cf:1\ncell:L8:t:Last Yr:b:::2::l:2:f:3:cf:1\ncell:M8:t:Goal:b:::2::l:2:f:3:cf:1\ncell:N8:t:Change:l:2:f:3:cf:1\ncell:O8:l:2:f:3:cf:1\ncell:P8:t:Last Yr:l:2:f:3:cf:1\ncell:Q8:t:Goal:l:2:f:3:cf:1\ncell:R8:t:Change:l:2:f:3:cf:1\ncell:C9:t:Jan:b::2:::l:2:f:2\ncell:D9:v:1782:b:2:2:2:2:l:2:f:2\ncell:E9:v:2000:b:2:2:2:2:l:2:f:2\ncell:F9:vtf:n:0.122334455667789:IF(ISNUMBER(D9),((E9-D9)/D9),\"\"):l:2:f:2:ntvf:1\ncell:G9:l:2:f:2:ntvf:1\ncell:H9:v:325:b:2:2:2:2:l:2:f:2\ncell:I9:v:350:b:2:2:2:2:l:2:f:2\ncell:J9:vtf:n:0.07692307692307693:IF(ISNUMBER(H9),((I9-H9)/H9),\"\"):l:2:f:2:ntvf:1\ncell:K9:l:2:f:2:ntvf:1\ncell:L9:v:711:b:2:2:2:2:l:2:f:2\ncell:M9:v:800:b:2:2:2:2:l:2:f:2\ncell:N9:vtf:n:0.12517580872011252:IF(ISNUMBER(L9),((M9-L9)/L9),\"\"):l:2:f:2:ntvf:1\ncell:O9:l:2:f:2:ntvf:1\ncell:P9:vtf:n:2818:IF(SUM(D9,H9,L9),SUM(D9,H9,L9),\"\"):l:2:f:2\ncell:Q9:vtf:n:3150:IF(SUM(E9,I9,M9),SUM(E9,I9,M9),\"\"):l:2:f:2\ncell:R9:vtf:n:0.11781405251951739:IF(ISNUMBER(P9),((Q9-P9)/P9),\"\"):l:2:f:2:ntvf:1\ncell:S9:f:2\ncell:C10:t:Feb:b::2:::l:2:f:2:bg:2\ncell:D10:v:1523:b:2:2:2:2:l:2:f:2:bg:2\ncell:E10:v:1700:b:2:2:2:2:l:2:f:2:bg:2\ncell:F10:vtf:n:0.11621799080761655:IF(ISNUMBER(D10),((E10-D10)/D10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G10:l:2:f:2:ntvf:1\ncell:H10:v:158:b:2:2:2:2:l:2:f:2:bg:2\ncell:I10:v:200:b:2:2:2:2:l:2:f:2:bg:2\ncell:J10:vtf:n:0.26582278481012656:IF(ISNUMBER(H10),((I10-H10)/H10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K10:l:2:f:2:ntvf:1\ncell:L10:v:564:b:2:2:2:2:l:2:f:2:bg:2\ncell:M10:v:650:b:2:2:2:2:l:2:f:2:bg:2\ncell:N10:vtf:n:0.1524822695035461:IF(ISNUMBER(L10),((M10-L10)/L10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O10:l:2:f:2:ntvf:1\ncell:P10:vtf:n:2245:IF(SUM(D10,H10,L10),SUM(D10,H10,L10),\"\"):l:2:f:2:bg:2\ncell:Q10:vtf:n:2550:IF(SUM(E10,I10,M10),SUM(E10,I10,M10),\"\"):l:2:f:2:bg:2\ncell:R10:vtf:n:0.1358574610244989:IF(ISNUMBER(P10),((Q10-P10)/P10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:S10:f:2\ncell:C11:t:Mar:b::2:::l:2:f:2\ncell:D11:v:1901:b:2:2:2:2:l:2:f:2\ncell:E11:v:2000:b:2:2:2:2:l:2:f:2\ncell:F11:vtf:n:0.05207785376117833:IF(ISNUMBER(D11),((E11-D11)/D11),\"\"):l:2:f:2:ntvf:1\ncell:G11:l:2:f:2:ntvf:1\ncell:H11:v:168:b:2:2:2:2:l:2:f:2\ncell:I11:v:200:b:2:2:2:2:l:2:f:2\ncell:J11:vtf:n:0.19047619047619047:IF(ISNUMBER(H11),((I11-H11)/H11),\"\"):l:2:f:2:ntvf:1\ncell:K11:l:2:f:2:ntvf:1\ncell:L11:v:740:b:2:2:2:2:l:2:f:2\ncell:M11:v:850:b:2:2:2:2:l:2:f:2\ncell:N11:vtf:n:0.14864864864864866:IF(ISNUMBER(L11),((M11-L11)/L11),\"\"):l:2:f:2:ntvf:1\ncell:O11:l:2:f:2:ntvf:1\ncell:P11:vtf:n:2809:IF(SUM(D11,H11,L11),SUM(D11,H11,L11),\"\"):l:2:f:2\ncell:Q11:vtf:n:3050:IF(SUM(E11,I11,M11),SUM(E11,I11,M11),\"\"):l:2:f:2\ncell:R11:vtf:n:0.08579565681737274:IF(ISNUMBER(P11),((Q11-P11)/P11),\"\"):l:2:f:2:ntvf:1\ncell:S11:f:2\ncell:C12:t:Apr:b::1:::l:2:f:2:bg:2\ncell:D12:v:2308:b:2:1:2:2:l:2:f:2:bg:2\ncell:E12:v:2400:b:2:1:2:2:l:2:f:2:bg:2\ncell:F12:vtf:n:0.03986135181975736:IF(ISNUMBER(D12),((E12-D12)/D12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G12:l:2:f:2:ntvf:1\ncell:H12:v:365:b:2:1:2:2:l:2:f:2:bg:2\ncell:I12:v:400:b:2:1:2:2:l:2:f:2:bg:2\ncell:J12:vtf:n:0.0958904109589041:IF(ISNUMBER(H12),((I12-H12)/H12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K12:l:2:f:2:ntvf:1\ncell:L12:v:642:b:2:1:2:2:l:2:f:2:bg:2\ncell:M12:v:700:b:2:1:2:2:l:2:f:2:bg:2\ncell:N12:vtf:n:0.09034267912772585:IF(ISNUMBER(L12),((M12-L12)/L12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O12:l:2:f:2:ntvf:1\ncell:P12:vtf:n:3315:IF(SUM(D12,H12,L12),SUM(D12,H12,L12),\"\"):l:2:f:2:bg:2\ncell:Q12:vtf:n:3500:IF(SUM(E12,I12,M12),SUM(E12,I12,M12),\"\"):l:2:f:2:bg:2\ncell:R12:vtf:n:0.05580693815987934:IF(ISNUMBER(P12),((Q12-P12)/P12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:S12:f:2\ncell:C13:t:May:b::2:::l:2:f:2\ncell:D13:v:2538:b:2:2:2:2:l:2:f:2\ncell:E13:v:2800:b:2:2:2:2:l:2:f:2\ncell:F13:vtf:n:0.10323089046493301:IF(ISNUMBER(D13),((E13-D13)/D13),\"\"):l:2:f:2:ntvf:1\ncell:G13:l:2:f:2:ntvf:1\ncell:H13:v:402:b:2:2:2:2:l:2:f:2\ncell:I13:v:450:b:2:2:2:2:l:2:f:2\ncell:J13:vtf:n:0.11940298507462686:IF(ISNUMBER(H13),((I13-H13)/H13),\"\"):l:2:f:2:ntvf:1\ncell:K13:l:2:f:2:ntvf:1\ncell:L13:v:663:b:2:2:2:2:l:2:f:2\ncell:M13:v:800:b:2:2:2:2:l:2:f:2\ncell:N13:vtf:n:0.2066365007541478:IF(ISNUMBER(L13),((M13-L13)/L13),\"\"):l:2:f:2:ntvf:1\ncell:O13:l:2:f:2:ntvf:1\ncell:P13:vtf:n:3603:IF(SUM(D13,H13,L13),SUM(D13,H13,L13),\"\"):l:2:f:2\ncell:Q13:vtf:n:4050:IF(SUM(E13,I13,M13),SUM(E13,I13,M13),\"\"):l:2:f:2\ncell:R13:vtf:n:0.12406328059950042:IF(ISNUMBER(P13),((Q13-P13)/P13),\"\"):l:2:f:2:ntvf:1\ncell:S13:f:2\ncell:C14:t:Jun:b::2:::l:2:f:2:bg:2\ncell:D14:v:1866:b:2:2:2:2:l:2:f:2:bg:2\ncell:E14:v:2000:b:2:2:2:2:l:2:f:2:bg:2\ncell:F14:vtf:n:0.07181136120042872:IF(ISNUMBER(D14),((E14-D14)/D14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G14:l:2:f:2:ntvf:1\ncell:H14:v:217:b:2:2:2:2:l:2:f:2:bg:2\ncell:I14:v:250:b:2:2:2:2:l:2:f:2:bg:2\ncell:J14:vtf:n:0.15207373271889402:IF(ISNUMBER(H14),((I14-H14)/H14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K14:l:2:f:2:ntvf:1\ncell:L14:v:604:b:2:2:2:2:l:2:f:2:bg:2\ncell:M14:v:700:b:2:2:2:2:l:2:f:2:bg:2\ncell:N14:vtf:n:0.15894039735099338:IF(ISNUMBER(L14),((M14-L14)/L14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O14:l:2:f:2:ntvf:1\ncell:P14:vtf:n:2687:IF(SUM(D14,H14,L14),SUM(D14,H14,L14),\"\"):l:2:f:2:bg:2\ncell:Q14:vtf:n:2950:IF(SUM(E14,I14,M14),SUM(E14,I14,M14),\"\"):l:2:f:2:bg:2\ncell:R14:vtf:n:0.09787867510234462:IF(ISNUMBER(P14),((Q14-P14)/P14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:S14:f:2\ncell:C15:t:Jul:b::2:::l:2:f:2\ncell:D15:v:2212:b:2:2:2:2:l:2:f:2\ncell:E15:v:2500:b:2:2:2:2:l:2:f:2\ncell:F15:vtf:n:0.1301989150090416:IF(ISNUMBER(D15),((E15-D15)/D15),\"\"):l:2:f:2:ntvf:1\ncell:G15:l:2:f:2:ntvf:1\ncell:H15:v:264:b:2:2:2:2:l:2:f:2\ncell:I15:v:300:b:2:2:2:2:l:2:f:2\ncell:J15:vtf:n:0.13636363636363635:IF(ISNUMBER(H15),((I15-H15)/H15),\"\"):l:2:f:2:ntvf:1\ncell:K15:l:2:f:2:ntvf:1\ncell:L15:v:653:b:2:2:2:2:l:2:f:2\ncell:M15:v:800:b:2:2:2:2:l:2:f:2\ncell:N15:vtf:n:0.225114854517611:IF(ISNUMBER(L15),((M15-L15)/L15),\"\"):l:2:f:2:ntvf:1\ncell:O15:l:2:f:2:ntvf:1\ncell:P15:vtf:n:3129:IF(SUM(D15,H15,L15),SUM(D15,H15,L15),\"\"):l:2:f:2\ncell:Q15:vtf:n:3600:IF(SUM(E15,I15,M15),SUM(E15,I15,M15),\"\"):l:2:f:2\ncell:R15:vtf:n:0.15052732502396932:IF(ISNUMBER(P15),((Q15-P15)/P15),\"\"):l:2:f:2:ntvf:1\ncell:S15:f:2\ncell:C16:t:Aug:b::2:::l:2:f:2:bg:2\ncell:D16:v:1998:b:2:2:2:2:l:2:f:2:bg:2\ncell:E16:v:2300:b:2:2:2:2:l:2:f:2:bg:2\ncell:F16:vtf:n:0.15115115115115116:IF(ISNUMBER(D16),((E16-D16)/D16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G16:l:2:f:2:ntvf:1\ncell:H16:v:267:b:2:2:2:2:l:2:f:2:bg:2\ncell:I16:v:300:b:2:2:2:2:l:2:f:2:bg:2\ncell:J16:vtf:n:0.12359550561797752:IF(ISNUMBER(H16),((I16-H16)/H16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K16:l:2:f:2:ntvf:1\ncell:L16:v:537:b:2:2:2:2:l:2:f:2:bg:2\ncell:M16:v:600:b:2:2:2:2:l:2:f:2:bg:2\ncell:N16:vtf:n:0.11731843575418995:IF(ISNUMBER(L16),((M16-L16)/L16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O16:l:2:f:2:ntvf:1\ncell:P16:vtf:n:2802:IF(SUM(D16,H16,L16),SUM(D16,H16,L16),\"\"):l:2:f:2:bg:2\ncell:Q16:vtf:n:3200:IF(SUM(E16,I16,M16),SUM(E16,I16,M16),\"\"):l:2:f:2:bg:2\ncell:R16:vtf:n:0.14204139900071378:IF(ISNUMBER(P16),((Q16-P16)/P16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:S16:f:2\ncell:C17:t:Sep:b::2:::l:2:f:2\ncell:D17:v:2054:b:2:2:2:2:l:2:f:2\ncell:E17:v:2000:b:2:2:2:2:l:2:f:2\ncell:F17:vtf:n:-0.02629016553067186:IF(ISNUMBER(D17),((E17-D17)/D17),\"\"):l:2:f:2:ntvf:1\ncell:G17:l:2:f:2:ntvf:1\ncell:H17:v:318:b:2:2:2:2:l:2:f:2\ncell:I17:v:350:b:2:2:2:2:l:2:f:2\ncell:J17:vtf:n:0.10062893081761007:IF(ISNUMBER(H17),((I17-H17)/H17),\"\"):l:2:f:2:ntvf:1\ncell:K17:l:2:f:2:ntvf:1\ncell:L17:v:741:b:2:2:2:2:l:2:f:2\ncell:M17:v:900:b:2:2:2:2:l:2:f:2\ncell:N17:vtf:n:0.2145748987854251:IF(ISNUMBER(L17),((M17-L17)/L17),\"\"):l:2:f:2:ntvf:1\ncell:O17:l:2:f:2:ntvf:1\ncell:P17:vtf:n:3113:IF(SUM(D17,H17,L17),SUM(D17,H17,L17),\"\"):l:2:f:2\ncell:Q17:vtf:n:3250:IF(SUM(E17,I17,M17),SUM(E17,I17,M17),\"\"):l:2:f:2\ncell:R17:vtf:n:0.04400899453902987:IF(ISNUMBER(P17),((Q17-P17)/P17),\"\"):l:2:f:2:ntvf:1\ncell:S17:f:2\ncell:C18:t:Oct:b::2:::l:2:f:2:bg:2\ncell:D18:v:2117:b:2:2:2:2:l:2:f:2:bg:2\ncell:E18:v:2400:b:2:2:2:2:l:2:f:2:bg:2\ncell:F18:vtf:n:0.1336797354747284:IF(ISNUMBER(D18),((E18-D18)/D18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G18:l:2:f:2:ntvf:1\ncell:H18:v:159:b:2:2:2:2:l:2:f:2:bg:2\ncell:I18:v:200:b:2:2:2:2:l:2:f:2:bg:2\ncell:J18:vtf:n:0.2578616352201258:IF(ISNUMBER(H18),((I18-H18)/H18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K18:l:2:f:2:ntvf:1\ncell:L18:v:554:b:2:2:2:2:l:2:f:2:bg:2\ncell:M18:v:650:b:2:2:2:2:l:2:f:2:bg:2\ncell:N18:vtf:n:0.17328519855595667:IF(ISNUMBER(L18),((M18-L18)/L18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O18:l:2:f:2:ntvf:1\ncell:P18:vtf:n:2830:IF(SUM(D18,H18,L18),SUM(D18,H18,L18),\"\"):l:2:f:2:bg:2\ncell:Q18:vtf:n:3250:IF(SUM(E18,I18,M18),SUM(E18,I18,M18),\"\"):l:2:f:2:bg:2\ncell:R18:vtf:n:0.14840989399293286:IF(ISNUMBER(P18),((Q18-P18)/P18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:S18:f:2\ncell:C19:t:Nov:b::2:::l:2:f:2\ncell:D19:v:1430:b:2:2:2:2:l:2:f:2\ncell:E19:v:1600:b:2:2:2:2:l:2:f:2\ncell:F19:vtf:n:0.11888111888111888:IF(ISNUMBER(D19),((E19-D19)/D19),\"\"):l:2:f:2:ntvf:1\ncell:G19:l:2:f:2:ntvf:1\ncell:H19:v:193:b:2:2:2:2:l:2:f:2\ncell:I19:v:200:b:2:2:2:2:l:2:f:2\ncell:J19:vtf:n:0.03626943005181347:IF(ISNUMBER(H19),((I19-H19)/H19),\"\"):l:2:f:2:ntvf:1\ncell:K19:l:2:f:2:ntvf:1\ncell:L19:v:657:b:2:2:2:2:l:2:f:2\ncell:M19:v:800:b:2:2:2:2:l:2:f:2\ncell:N19:vtf:n:0.2176560121765601:IF(ISNUMBER(L19),((M19-L19)/L19),\"\"):l:2:f:2:ntvf:1\ncell:O19:l:2:f:2:ntvf:1\ncell:P19:vtf:n:2280:IF(SUM(D19,H19,L19),SUM(D19,H19,L19),\"\"):l:2:f:2\ncell:Q19:vtf:n:2600:IF(SUM(E19,I19,M19),SUM(E19,I19,M19),\"\"):l:2:f:2\ncell:R19:vtf:n:0.14035087719298245:IF(ISNUMBER(P19),((Q19-P19)/P19),\"\"):l:2:f:2:ntvf:1\ncell:S19:f:2\ncell:C20:t:Dec:b::1:::l:2:f:2:bg:2\ncell:D20:v:1859:b:2:1:2:2:l:2:f:2:bg:2\ncell:E20:v:2100:b:2:1:2:2:l:2:f:2:bg:2\ncell:F20:vtf:n:0.1296395911780527:IF(ISNUMBER(D20),((E20-D20)/D20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G20:l:2:f:2:ntvf:1\ncell:H20:v:426:b:2:1:2:2:l:2:f:2:bg:2\ncell:I20:v:450:b:2:1:2:2:l:2:f:2:bg:2\ncell:J20:vtf:n:0.056338028169014086:IF(ISNUMBER(H20),((I20-H20)/H20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K20:l:2:f:2:ntvf:1\ncell:L20:v:732:b:2:1:2:2:l:2:f:2:bg:2\ncell:M20:v:850:b:2:1:2:2:l:2:f:2:bg:2\ncell:N20:vtf:n:0.16120218579234974:IF(ISNUMBER(L20),((M20-L20)/L20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O20:l:2:f:2:ntvf:1\ncell:P20:vtf:n:3017:IF(SUM(D20,H20,L20),SUM(D20,H20,L20),\"\"):l:2:f:2:bg:2\ncell:Q20:vtf:n:3400:IF(SUM(E20,I20,M20),SUM(E20,I20,M20),\"\"):l:2:f:2:bg:2\ncell:R20:vtf:n:0.12694729864103413:IF(ISNUMBER(P20),((Q20-P20)/P20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:S20:f:2\ncell:C22:t:Year :l:2:f:4\ncell:D22:vtf:n:23588:IF(SUM(D9\\cD20),SUM(D9\\cD20),\"\"):b:1::1::l:2:f:4\ncell:E22:vtf:n:25800:IF(SUM(E9\\cE20),SUM(E9\\cE20),\"\"):b:1::1::l:2:f:4\ncell:F22:vtf:n:0.09377649652365609:IF(ISNUMBER(D22),((E22-D22)/D22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:G22:b:1::1::l:2:f:2:ntvf:1\ncell:H22:vtf:n:3262:IF(SUM(H9\\cH20),SUM(H9\\cH20),\"\"):b:1::1::l:2:f:4\ncell:I22:vtf:n:3650:IF(SUM(I9\\cI20),SUM(I9\\cI20),\"\"):b:1::1::l:2:f:4\ncell:J22:vtf:n:0.11894543225015328:IF(ISNUMBER(H22),((I22-H22)/H22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:K22:b:1::1::l:2:f:2:ntvf:1\ncell:L22:vtf:n:7798:IF(SUM(L9\\cL20),SUM(L9\\cL20),\"\"):b:1::1::l:2:f:4\ncell:M22:vtf:n:9100:IF(SUM(M9\\cM20),SUM(M9\\cM20),\"\"):b:1::1::l:2:f:4\ncell:N22:vtf:n:0.16696588868940754:IF(ISNUMBER(L22),((M22-L22)/L22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:O22:b:1::1::l:2:f:2:ntvf:1\ncell:P22:vtf:n:34648:IF(SUM(P9\\cP20),SUM(P9\\cP20),\"\"):b:1::1::l:2:f:4\ncell:Q22:vtf:n:38550:IF(SUM(Q9\\cQ20),SUM(Q9\\cQ20),\"\"):b:1::1::l:2:f:4\ncell:R22:vtf:n:0.11261833294851073:IF(ISNUMBER(P22),((Q22-P22)/P22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:S22:f:2\ncell:C23:l:2:f:2\ncell:D23:l:2:f:2\ncell:E23:l:2:f:2\ncell:F23:l:2:f:2\ncell:G23:l:2:f:2\ncell:H23:l:2:f:2\ncell:I23:l:2:f:2\ncell:J23:l:2:f:2\ncell:K23:l:2:f:2\ncell:L23:l:2:f:2\ncell:M23:l:2:f:2\ncell:N23:l:2:f:2\ncell:O23:l:2:f:2\ncell:P23:l:2:f:2\ncell:Q23:l:2:f:2\ncell:R23:l:2:f:2\ncell:S23:f:2\ncell:C24:t:Date\\c :l:2:f:2:cf:2\ncell:D24:b:::2::l:2:f:2:ntvf:2\ncell:E24:l:2:f:2\ncell:F24:l:2:f:2\ncell:G24:l:2:f:2\ncell:H24:l:2:f:2\ncell:I24:l:2:f:2\ncell:J24:l:2:f:2\ncell:K24:l:2:f:2\ncell:L24:l:2:f:2\ncell:M24:t:Prepared by\\c :l:2:f:2:cf:2:colspan:2\ncell:N24:l:2:f:2:cf:1\ncell:O24:l:2:f:2:cf:1\ncell:P24:b:::2::l:2:f:2:cf:1\ncell:Q24:b:::2::l:2:f:2:cf:1\ncell:R24:b:::2::l:2:f:2:cf:1\ncell:S24:f:2\ncell:C25:l:2:f:2\ncell:D25:b:2::::l:2:f:2\ncell:E25:l:2:f:2\ncell:F25:l:2:f:2\ncell:G25:l:2:f:2\ncell:H25:l:2:f:2\ncell:I25:l:2:f:2\ncell:J25:l:2:f:2\ncell:K25:l:2:f:2\ncell:L25:l:2:f:2\ncell:M25:l:2:f:2\ncell:N25:b:2::::l:2:f:2\ncell:O25:b:2::::l:2:f:2\ncell:P25:b:2::::l:2:f:2\ncell:Q25:b:2::::l:2:f:2\ncell:R25:b:2::::l:2:f:2\ncell:S25:f:2\ncell:C26:l:2\ncell:D26:l:2\ncell:E26:l:2\ncell:F26:l:2\ncell:G26:l:2\ncell:H26:l:2\ncell:I26:l:2\ncell:J26:l:2\ncell:K26:l:2\ncell:L26:l:2\ncell:M26:l:2\ncell:N26:l:2\ncell:O26:l:2\ncell:P26:l:2\ncell:Q26:l:2\ncell:R26:l:2\ncell:C27:l:1:f:1\ncol:A:w:10\ncol:B:w:10\ncol:C:w:52\ncol:D:w:80\ncol:E:w:80\ncol:F:w:71\ncol:G:w:10\ncol:H:w:80\ncol:I:w:80\ncol:J:w:71\ncol:K:w:10\ncol:L:w:80\ncol:M:w:80\ncol:N:w:71\ncol:O:w:10\ncol:P:w:80\ncol:Q:w:80\ncol:R:w:71\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:18.75\nrow:6:h:14.25\nrow:7:h:15.75\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:27:h:14.25\nsheet:c:19:r:27:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal normal 10pt Arial\nfont:2:normal normal 12pt arial,helvetica,sans-serif\nfont:3:normal normal 14pt Arial\nfont:4:normal normal 14pt arial,helvetica,sans-serif\nfont:5:normal normal 16pt Arial\nfont:6:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:0%\nvalueformat:2:dd-mmm-yy \nname:DATA_01::C5\nname:DATA_02::C10\nname:DATA_03::D10\\cD22\nname:DATA_04::H10\\cH22\n"},"name":"sheet27","hidden":"1"},"sheet28":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Price Estimate for Services :l:1:f:8:c:3:bg:1:cf:1:colspan:3\ncell:D3:l:1:f:3:cf:1\ncell:E3:l:1:f:3:cf:1\ncell:C4:vtf:ndt:41099.54768677083:NOW():l:1:f:7:cf:1:ntvf:6\ncell:D4:l:1\ncell:E4:l:1\ncell:C5:l:1:f:1:cf:1:ntvf:6\ncell:D5:l:1:f:1\ncell:E5:l:1:f:1\ncell:F5:f:1\ncell:G5:f:1\ncell:C6:t:Name of Job:l:1:f:7:cf:1\ncell:D6:t:Job 1:l:1:f:7:cf:1\ncell:E6:t:Job 2:l:1:f:7:cf:1\ncell:C7:t:Wage rate per hour:l:1:f:5:cf:2\ncell:D7:v:10:b:1:1:1:1:l:1:f:5:cf:3:ntvf:3\ncell:E7:v:22:b:1:1:1:1:l:1:f:5:cf:3:ntvf:3\ncell:F7:f:5\ncell:G7:f:5\ncell:C8:t:Fringe Benefit as a % of wages:l:1:f:5:bg:2:cf:2\ncell:D8:v:0.3:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:5\ncell:E8:v:0.3:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:5\ncell:F8:f:5\ncell:G8:f:5\ncell:C9:t:Projected Overhead Cost for Year:l:1:f:5:cf:2\ncell:D9:v:40000:b:1:1:1:1:l:1:f:5:cf:3:ntvf:2\ncell:E9:v:40000:b:1:1:1:1:l:1:f:5:cf:3:ntvf:2\ncell:F9:f:5\ncell:G9:f:5\ncell:C10:t:Projected Direct Labor Cost for Year:l:1:f:5:bg:2:cf:2\ncell:D10:v:50000:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:2\ncell:E10:v:50000:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:2\ncell:F10:f:5\ncell:G10:f:5\ncell:C11:l:1:f:5:cf:2\ncell:D11:l:1:f:5:cf:3\ncell:E11:l:1:f:5:cf:3\ncell:F11:f:5\ncell:G11:f:5\ncell:C12:t:Hours worked on job:l:1:f:5:cf:2\ncell:D12:v:1.5:b:1:1:1:1:l:1:f:5:cf:3:ntvf:4\ncell:E12:v:2:b:1:1:1:1:l:1:f:5:cf:3:ntvf:4\ncell:F12:f:5\ncell:G12:f:5\ncell:C13:t:Direct Labor Cost:l:1:f:5:bg:2:cf:2\ncell:D13:vtf:n:19.5:IF(SUM(D12,D7),((D12*D7)*(1+D8)),\"\"):l:1:f:5:bg:2:cf:3:ntvf:3\ncell:E13:vtf:n:57.2:IF(SUM(E12,E7),((E12*E7)*(1+E8)),\"\"):l:1:f:5:bg:2:cf:3:ntvf:3\ncell:F13:f:5\ncell:G13:f:5\ncell:C14:t:Overhead Cost:l:1:f:5:cf:2\ncell:D14:vtf:n:15.600000000000001:IF((D10>0),((D9/D10)*D13),\"\"):l:1:f:5:cf:3:ntvf:1\ncell:E14:vtf:n:45.760000000000005:IF((E10>0),((E9/E10)*E13),\"\"):l:1:f:5:cf:3:ntvf:1\ncell:F14:f:5\ncell:G14:f:5\ncell:C15:t:Cost of materials for the job:l:1:f:5:bg:2:cf:2\ncell:D15:v:10:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:1\ncell:E15:v:10:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:1\ncell:F15:f:5\ncell:G15:f:5\ncell:C16:l:1:f:9:cf:2\ncell:D16:l:1:f:9:cf:3:ntvf:1\ncell:E16:l:1:f:9:cf:3:ntvf:1\ncell:F16:f:4\ncell:C17:t:Total cost:l:1:f:6:cf:2\ncell:D17:vtf:n:45.1:IF(SUM(D13\\cD15),SUM(D13\\cD15),\"\"):b:2::2::l:1:f:6:cf:3:ntvf:3\ncell:E17:vtf:n:112.96000000000001:IF(SUM(E13\\cE15),SUM(E13\\cE15),\"\"):b:2::2::l:1:f:6:cf:3:ntvf:3\ncell:F17:f:6\ncell:C18:l:1:f:2\ncell:D18:b:2::::l:1:f:2\ncell:E18:b:2::::l:1:f:2\ncell:C19:l:1:f:2\ncell:D19:l:1\ncell:E19:l:1\ncol:A:w:10\ncol:B:w:10\ncol:C:w:289\ncol:D:w:110\ncol:E:w:110\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:18.75\nrow:6:h:18.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:15.75\nrow:10:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:12\nrow:21:h:12\nrow:22:h:12\nsheet:c:7:r:22:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 6pt *\nfont:2:normal normal 10pt Arial\nfont:3:normal normal 10pt Times New Roman\nfont:4:normal normal 12pt *\nfont:5:normal normal 12pt arial,helvetica,sans-serif\nfont:6:normal normal 14pt arial,helvetica,sans-serif\nfont:7:normal normal 16pt arial,helvetica,sans-serif\nfont:8:normal normal 26pt arial,helvetica,sans-serif\nfont:9:normal normal 6pt *\nlayout:1:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1: #,##0.00 ;(#,##0.00)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:3:\"$\"#,##0.00 ;\"$\"(#,##0.00)\nvalueformat:4:#,##0.00;(#,##0.00)\nvalueformat:5:0%\nvalueformat:6:mmmm d, yyyy\nname:DATA_01::C4\nname:DATA_02::C10\nname:DATA_03::D10\\cD22\nname:DATA_04::#REF!\\c#REF!\n"},"name":"sheet29","hidden":"1"},"sheet29":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1\n"},"name":"sheet29","hidden":"0"},"sheet30":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1\n"},"name":"sheet30","hidden":"0"},"sheet31":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1\n"},"name":"sheet31","hidden":"0"},"sheet32":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1\n"},"name":"sheet32","hidden":"0"},"sheet33":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1\n"},"name":"sheet33","hidden":"0"},"sheet34":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1\n"},"name":"sheet34","hidden":"0"}}} \ No newline at end of file diff --git a/Website/excelinterop/tmp/SalesSuite.xls b/Website/excelinterop/tmp/SalesSuite.xls deleted file mode 100644 index d103db0..0000000 Binary files a/Website/excelinterop/tmp/SalesSuite.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/SalesSuite1.msc b/Website/excelinterop/tmp/SalesSuite1.msc deleted file mode 100644 index 355c94f..0000000 --- a/Website/excelinterop/tmp/SalesSuite1.msc +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":34,"currentid":"sheet34","currentname":"sheet34","sheetArr":{"sheet1":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1:h:12.75\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"Sheet2","hidden":"0"},"sheet2":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1:h:12.75:needsrecalc:yes\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"Sheet3","hidden":"0"},"sheet3":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Sales Budget:l:1:f:3:cf:2\ncell:C3:l:1:f:3:cf:1\ncell:D3:l:1:f:3:cf:1\ncell:E3:l:1:f:3:cf:1\ncell:F3:l:1:f:3:cf:1\ncell:G3:l:1:f:3:cf:1\ncell:B4:t:2009:l:1:f:2:cf:1:ntvf:5\ncell:B5:b:::1::l:1:f:4\ncell:C5:b:::1::l:1:f:4\ncell:D5:b:::1::l:1:f:4\ncell:E5:b:::1::l:1:f:4\ncell:F5:b:::1::l:1:f:4\ncell:G5:b:::1::l:1:f:4\ncell:A6:b::1:::l:1:f:4\ncell:B6:t:Item Number:b:1:1::1:l:1:f:1:cf:1\ncell:C6:b:1:1::1:l:1:f:1:cf:1\ncell:D6:b:1:1::1:l:1:f:1:cf:1\ncell:E6:t:Selling Price:b:1:1::1:l:1:f:1:cf:1\ncell:F6:t:Budgeted:b:1:1::1:l:1:f:1:cf:1\ncell:G6:t:Percent:b:1:1::1:l:1:f:1:cf:1\ncell:A7:b::1:::l:1:f:4\ncell:B7:t:or SKU:b::1:1:1:l:1:f:1:cf:1\ncell:C7:t:Description:b::1:1:1:l:1:f:1:cf:1\ncell:D7:t:Units:b::1:1:1:l:1:f:1:cf:1\ncell:E7:t:Per Unit:b::1:1:1:l:1:f:1:cf:1\ncell:F7:t:Sales:b::1:1:1:l:1:f:1:cf:1\ncell:G7:t:(of Total):b::1:1:1:l:1:f:1:cf:1\ncell:A8:b::1:::l:1:f:4\ncell:B8:b:1:1:1:1:l:1:f:5:cf:2\ncell:C8:b:1:1:1:1:l:1:f:5\ncell:D8:v:1000:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E8:v:129:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F8:vtf:n:129000:IF(D8,(D8*E8),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G8:vtf:n:0.4564190563801369:IF(SUM(F8),(F8/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A9:b::1:::l:1:f:4\ncell:B9:b:1:1:1:1:l:1:f:5:cf:2\ncell:C9:b:1:1:1:1:l:1:f:5\ncell:D9:v:1200:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E9:v:114:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F9:vtf:n:136800:IF(D9,(D9*E9),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G9:vtf:n:0.4840164876961452:IF(SUM(F9),(F9/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A10:b::1:::l:1:f:4\ncell:B10:b:1:1:1:1:l:1:f:5:cf:2\ncell:C10:b:1:1:1:1:l:1:f:5\ncell:D10:v:1300:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E10:v:12.95:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F10:vtf:n:16835:IF(D10,(D10*E10),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G10:vtf:n:0.05956445592371787:IF(SUM(F10),(F10/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A11:b::1:::l:1:f:4\ncell:B11:b:1:1:1:1:l:1:f:5:cf:2\ncell:C11:b:1:1:1:1:l:1:f:5\ncell:D11:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E11:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F11:vtf:t::IF(D11,(D11*E11),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G11:vtf:t::IF(SUM(F11),(F11/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A12:b::1:::l:1:f:4\ncell:B12:b:1:1:1:1:l:1:f:5:cf:2\ncell:C12:b:1:1:1:1:l:1:f:5\ncell:D12:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E12:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F12:vtf:t::IF(D12,(D12*E12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G12:vtf:t::IF(SUM(F12),(F12/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A13:b::1:::l:1:f:4\ncell:B13:b:1:1:1:1:l:1:f:5:cf:2\ncell:C13:b:1:1:1:1:l:1:f:5\ncell:D13:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E13:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F13:vtf:t::IF(D13,(D13*E13),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G13:vtf:t::IF(SUM(F13),(F13/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A14:b::1:::l:1:f:4\ncell:B14:b:1:1:1:1:l:1:f:5:cf:2\ncell:C14:b:1:1:1:1:l:1:f:5\ncell:D14:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E14:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F14:vtf:t::IF(D14,(D14*E14),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G14:vtf:t::IF(SUM(F14),(F14/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A15:b::1:::l:1:f:4\ncell:B15:b:1:1:1:1:l:1:f:5:cf:2\ncell:C15:b:1:1:1:1:l:1:f:5\ncell:D15:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E15:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F15:vtf:t::IF(D15,(D15*E15),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G15:vtf:t::IF(SUM(F15),(F15/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A16:b::1:::l:1:f:4\ncell:B16:b:1:1:1:1:l:1:f:5:cf:2\ncell:C16:b:1:1:1:1:l:1:f:5\ncell:D16:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E16:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F16:vtf:t::IF(D16,(D16*E16),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G16:vtf:t::IF(SUM(F16),(F16/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A17:b::1:::l:1:f:4\ncell:B17:b:1:1:1:1:l:1:f:5:cf:2\ncell:C17:b:1:1:1:1:l:1:f:5\ncell:D17:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E17:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F17:vtf:t::IF(D17,(D17*E17),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G17:vtf:t::IF(SUM(F17),(F17/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A18:b::1:::l:1:f:4\ncell:B18:b:1:1:1:1:l:1:f:5:cf:2\ncell:C18:b:1:1:1:1:l:1:f:5\ncell:D18:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E18:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F18:vtf:t::IF(D18,(D18*E18),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G18:vtf:t::IF(SUM(F18),(F18/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A19:b::1:::l:1:f:4\ncell:B19:b:1:1:1:1:l:1:f:5:cf:2\ncell:C19:b:1:1:1:1:l:1:f:5\ncell:D19:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E19:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F19:vtf:t::IF(D19,(D19*E19),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G19:vtf:t::IF(SUM(F19),(F19/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A20:b::1:::l:1:f:4\ncell:B20:b:1:1:1:1:l:1:f:5:cf:2\ncell:C20:b:1:1:1:1:l:1:f:5\ncell:D20:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E20:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F20:vtf:t::IF(D20,(D20*E20),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G20:vtf:t::IF(SUM(F20),(F20/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A21:b::1:::l:1:f:4\ncell:B21:b:1:1:1:1:l:1:f:5:cf:2\ncell:C21:b:1:1:1:1:l:1:f:5\ncell:D21:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E21:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F21:vtf:t::IF(D21,(D21*E21),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G21:vtf:t::IF(SUM(F21),(F21/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A22:b::1:::l:1:f:4\ncell:B22:b:1:1:1:1:l:1:f:5:cf:2\ncell:C22:b:1:1:1:1:l:1:f:5\ncell:D22:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E22:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F22:vtf:t::IF(D22,(D22*E22),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G22:vtf:t::IF(SUM(F22),(F22/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A23:b::1:::l:1:f:4\ncell:B23:b:1:1:1:1:l:1:f:5:cf:2\ncell:C23:b:1:1:1:1:l:1:f:5\ncell:D23:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E23:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F23:vtf:t::IF(D23,(D23*E23),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G23:vtf:t::IF(SUM(F23),(F23/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A24:b::1:::l:1:f:4\ncell:B24:b:1:1:1:1:l:1:f:5:cf:2\ncell:C24:b:1:1:1:1:l:1:f:5\ncell:D24:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E24:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F24:vtf:t::IF(D24,(D24*E24),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G24:vtf:t::IF(SUM(F24),(F24/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A25:b::1:::l:1:f:4\ncell:B25:b:1:1:1:1:l:1:f:5:cf:2\ncell:C25:b:1:1:1:1:l:1:f:5\ncell:D25:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E25:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F25:vtf:t::IF(D25,(D25*E25),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G25:vtf:t::IF(SUM(F25),(F25/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A26:b::1:::l:1:f:4\ncell:B26:b:1:1:1:1:l:1:f:5:cf:2\ncell:C26:b:1:1:1:1:l:1:f:5\ncell:D26:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E26:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F26:vtf:t::IF(D26,(D26*E26),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G26:vtf:t::IF(SUM(F26),(F26/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A27:b::1:::l:1:f:4\ncell:B27:b:1:1:1:1:l:1:f:5:cf:2\ncell:C27:b:1:1:1:1:l:1:f:5\ncell:D27:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E27:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F27:vtf:t::IF(D27,(D27*E27),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G27:vtf:t::IF(SUM(F27),(F27/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A28:b::1:::l:1:f:4\ncell:B28:b:1:1:1:1:l:1:f:5:cf:2\ncell:C28:b:1:1:1:1:l:1:f:5\ncell:D28:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E28:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F28:vtf:t::IF(D28,(D28*E28),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G28:vtf:t::IF(SUM(F28),(F28/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A29:b::1:::l:1:f:4\ncell:B29:b:1:1:1:1:l:1:f:5:cf:2\ncell:C29:b:1:1:1:1:l:1:f:5\ncell:D29:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E29:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F29:vtf:t::IF(D29,(D29*E29),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G29:vtf:t::IF(SUM(F29),(F29/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A30:b::1:::l:1:f:4\ncell:B30:b:1:1:1:1:l:1:f:5:cf:2\ncell:C30:b:1:1:1:1:l:1:f:5\ncell:D30:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E30:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F30:vtf:t::IF(D30,(D30*E30),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G30:vtf:t::IF(SUM(F30),(F30/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A31:b::1:::l:1:f:4\ncell:B31:b:1:1:1:1:l:1:f:5:cf:2\ncell:C31:b:1:1:1:1:l:1:f:5\ncell:D31:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E31:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F31:vtf:t::IF(D31,(D31*E31),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G31:vtf:t::IF(SUM(F31),(F31/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A32:b::1:::l:1:f:4\ncell:B32:b:1:1:1:1:l:1:f:5:cf:2\ncell:C32:b:1:1:1:1:l:1:f:5\ncell:D32:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:E32:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:F32:vtf:t::IF(D32,(D32*E32),\"\"):b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G32:vtf:t::IF(SUM(F32),(F32/$F$33),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A33:b::1:::l:1:f:4\ncell:B33:t:Totals:b:1:1:1:1:l:1:f:1\ncell:C33:b:1:1:1:1:l:1:f:1\ncell:D33:b:1:1:1:1:l:1:f:1\ncell:E33:b:1:1:1:1:l:1:f:1\ncell:F33:vtf:n:282635:IF(SUM(F8\\cF32),SUM(F8\\cF32),\"\"):b:1:1:1:1:l:1:f:1:ntvf:1\ncell:G33:vtf:n:1:IF(SUM(F33),(F33/$F$33),\"\"):b:1:1:1:1:l:1:f:1:ntvf:4\ncell:B34:b:1::::l:1:f:4\ncell:C34:b:1::::l:1:f:4\ncell:D34:b:1::::l:1:f:4\ncell:E34:b:1::::l:1:f:4\ncell:F34:b:1::::l:1:f:4\ncell:G34:b:1::::l:1:f:4\ncell:B35:l:1:f:4\ncol:A:w:12\ncol:B:w:297\ncol:C:w:163\ncol:D:w:115\ncol:E:w:104\ncol:F:w:89\ncol:G:w:89\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:7:r:35:h:12:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:normal bold 10pt Times New Roman\nfont:2:normal bold 14pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 10pt Times New Roman\nlayout:1:padding:* * * *;vertical-align:bottom;\nvalueformat:1:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:2:\"$\"#,##0.00 ;\"$\"(#,##0.00)\nvalueformat:3:#,##0;(#,##0)\nvalueformat:4:0.00%\nvalueformat:5:@\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet1","hidden":"1"},"sheet4":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Budget:l:2:f:9:c:3:bg:1:cf:1:colspan:6\ncell:D3:l:2:f:2:cf:1\ncell:E3:l:2:f:2:cf:1\ncell:F3:l:2:f:2:cf:1\ncell:G3:l:2:f:2:cf:1\ncell:H3:l:2:f:2:cf:1\ncell:C4:t:2009:l:2:f:6:cf:1:ntvf:5\ncell:D4:l:2\ncell:E4:l:2\ncell:F4:l:2\ncell:G4:l:2\ncell:H4:l:2\ncell:B5:f:5\ncell:C5:l:2:f:5\ncell:D5:l:2:f:5\ncell:E5:l:2:f:5\ncell:F5:l:2:f:5\ncell:G5:l:2:f:5\ncell:H5:l:2:f:5\ncell:I5:f:5\ncell:J5:f:5\ncell:B6:l:1:f:5\ncell:C6:t:Item Number or SKU:l:2:f:7:cf:1\ncell:D6:t:Description:l:2:f:7:cf:1\ncell:E6:t:Units:l:2:f:7:cf:1\ncell:F6:t:Selling Price Per Unit:l:2:f:7:cf:1\ncell:G6:t:Budgeted Sales:l:2:f:7:cf:1\ncell:H6:t:Percent (of Total):l:2:f:7:cf:1\ncell:I6:f:5\ncell:J6:f:5\ncell:B7:l:1:f:5\ncell:C7:l:2:f:8:cf:1\ncell:D7:l:2:f:8:cf:1\ncell:E7:l:2:f:8:cf:1\ncell:F7:l:2:f:8:cf:1\ncell:G7:l:2:f:8:cf:1\ncell:H7:l:2:f:8:cf:1\ncell:I7:f:5\ncell:J7:f:5\ncell:B8:b::2:::l:1:f:3\ncell:C8:b:2:2:2:2:l:2:f:1:cf:2\ncell:D8:b:2:2:2:2:l:2:f:1\ncell:E8:v:1000:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F8:v:129:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G8:vtf:n:129000:IF(E8,(E8*F8),\"\"):l:2:f:1:ntvf:1\ncell:H8:vtf:n:0.4564190563801369:IF(SUM(G8),(G8/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I8:f:1\ncell:B9:b::2:::l:1:f:3\ncell:C9:b:1:1:1:1:l:2:f:1:bg:2:cf:2\ncell:D9:b:1:1:1:1:l:2:f:1:bg:2\ncell:E9:v:1200:b:1:1:1:1:l:2:f:1:bg:2:ntvf:3\ncell:F9:v:114:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G9:vtf:n:136800:IF(E9,(E9*F9),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H9:vtf:n:0.4840164876961452:IF(SUM(G9),(G9/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I9:f:1\ncell:B10:b::2:::l:1:f:3\ncell:C10:b:2:2:2:2:l:2:f:1:cf:2\ncell:D10:b:2:2:2:2:l:2:f:1\ncell:E10:v:1300:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F10:v:12.95:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G10:vtf:n:16835:IF(E10,(E10*F10),\"\"):l:2:f:1:ntvf:1\ncell:H10:vtf:n:0.05956445592371787:IF(SUM(G10),(G10/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I10:f:1\ncell:B11:b::2:::l:1:f:3\ncell:C11:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D11:b:2:2:2:2:l:2:f:1:bg:2\ncell:E11:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F11:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G11:vtf:t::IF(E11,(E11*F11),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H11:vtf:t::IF(SUM(G11),(G11/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I11:f:1\ncell:B12:b::2:::l:1:f:3\ncell:C12:b:2:2:2:2:l:2:f:1:cf:2\ncell:D12:b:2:2:2:2:l:2:f:1\ncell:E12:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F12:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G12:vtf:t::IF(E12,(E12*F12),\"\"):l:2:f:1:ntvf:1\ncell:H12:vtf:t::IF(SUM(G12),(G12/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I12:f:1\ncell:B13:b::2:::l:1:f:3\ncell:C13:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D13:b:2:2:2:2:l:2:f:1:bg:2\ncell:E13:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F13:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G13:vtf:t::IF(E13,(E13*F13),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H13:vtf:t::IF(SUM(G13),(G13/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I13:f:1\ncell:B14:b::2:::l:1:f:3\ncell:C14:b:2:2:2:2:l:2:f:1:cf:2\ncell:D14:b:2:2:2:2:l:2:f:1\ncell:E14:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F14:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G14:vtf:t::IF(E14,(E14*F14),\"\"):l:2:f:1:ntvf:1\ncell:H14:vtf:t::IF(SUM(G14),(G14/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I14:f:1\ncell:B15:b::2:::l:1:f:3\ncell:C15:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D15:b:2:2:2:2:l:2:f:1:bg:2\ncell:E15:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F15:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G15:vtf:t::IF(E15,(E15*F15),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H15:vtf:t::IF(SUM(G15),(G15/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I15:f:1\ncell:B16:b::2:::l:1:f:3\ncell:C16:b:2:2:2:2:l:2:f:1:cf:2\ncell:D16:b:2:2:2:2:l:2:f:1\ncell:E16:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F16:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G16:vtf:t::IF(E16,(E16*F16),\"\"):l:2:f:1:ntvf:1\ncell:H16:vtf:t::IF(SUM(G16),(G16/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I16:f:1\ncell:B17:b::2:::l:1:f:3\ncell:C17:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D17:b:2:2:2:2:l:2:f:1:bg:2\ncell:E17:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F17:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G17:vtf:t::IF(E17,(E17*F17),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H17:vtf:t::IF(SUM(G17),(G17/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I17:f:1\ncell:B18:b::2:::l:1:f:3\ncell:C18:b:2:2:2:2:l:2:f:1:cf:2\ncell:D18:b:2:2:2:2:l:2:f:1\ncell:E18:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F18:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G18:vtf:t::IF(E18,(E18*F18),\"\"):l:2:f:1:ntvf:1\ncell:H18:vtf:t::IF(SUM(G18),(G18/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I18:f:1\ncell:B19:b::2:::l:1:f:3\ncell:C19:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D19:b:2:2:2:2:l:2:f:1:bg:2\ncell:E19:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F19:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G19:vtf:t::IF(E19,(E19*F19),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H19:vtf:t::IF(SUM(G19),(G19/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I19:f:1\ncell:B20:b::2:::l:1:f:3\ncell:C20:b:2:2:2:2:l:2:f:1:cf:2\ncell:D20:b:2:2:2:2:l:2:f:1\ncell:E20:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F20:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G20:vtf:t::IF(E20,(E20*F20),\"\"):l:2:f:1:ntvf:1\ncell:H20:vtf:t::IF(SUM(G20),(G20/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I20:f:1\ncell:B21:b::2:::l:1:f:3\ncell:C21:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D21:b:2:2:2:2:l:2:f:1:bg:2\ncell:E21:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F21:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G21:vtf:t::IF(E21,(E21*F21),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H21:vtf:t::IF(SUM(G21),(G21/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I21:f:1\ncell:B22:b::2:::l:1:f:3\ncell:C22:b:2:2:2:2:l:2:f:1:cf:2\ncell:D22:b:2:2:2:2:l:2:f:1\ncell:E22:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F22:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G22:vtf:t::IF(E22,(E22*F22),\"\"):l:2:f:1:ntvf:1\ncell:H22:vtf:t::IF(SUM(G22),(G22/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I22:f:1\ncell:B23:b::2:::l:1:f:3\ncell:C23:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D23:b:2:2:2:2:l:2:f:1:bg:2\ncell:E23:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F23:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G23:vtf:t::IF(E23,(E23*F23),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H23:vtf:t::IF(SUM(G23),(G23/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I23:f:1\ncell:B24:b::2:::l:1:f:3\ncell:C24:b:2:2:2:2:l:2:f:1:cf:2\ncell:D24:b:2:2:2:2:l:2:f:1\ncell:E24:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F24:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G24:vtf:t::IF(E24,(E24*F24),\"\"):l:2:f:1:ntvf:1\ncell:H24:vtf:t::IF(SUM(G24),(G24/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I24:f:1\ncell:B25:b::2:::l:1:f:3\ncell:C25:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D25:b:2:2:2:2:l:2:f:1:bg:2\ncell:E25:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F25:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G25:vtf:t::IF(E25,(E25*F25),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H25:vtf:t::IF(SUM(G25),(G25/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I25:f:1\ncell:B26:b::2:::l:1:f:3\ncell:C26:b:2:2:2:2:l:2:f:1:cf:2\ncell:D26:b:2:2:2:2:l:2:f:1\ncell:E26:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F26:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G26:vtf:t::IF(E26,(E26*F26),\"\"):l:2:f:1:ntvf:1\ncell:H26:vtf:t::IF(SUM(G26),(G26/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I26:f:1\ncell:B27:b::2:::l:1:f:3\ncell:C27:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D27:b:2:2:2:2:l:2:f:1:bg:2\ncell:E27:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F27:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G27:vtf:t::IF(E27,(E27*F27),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H27:vtf:t::IF(SUM(G27),(G27/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I27:f:1\ncell:B28:b::2:::l:1:f:3\ncell:C28:b:2:2:2:2:l:2:f:1:cf:2\ncell:D28:b:2:2:2:2:l:2:f:1\ncell:E28:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F28:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G28:vtf:t::IF(E28,(E28*F28),\"\"):l:2:f:1:ntvf:1\ncell:H28:vtf:t::IF(SUM(G28),(G28/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I28:f:1\ncell:B29:b::2:::l:1:f:3\ncell:C29:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D29:b:2:2:2:2:l:2:f:1:bg:2\ncell:E29:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F29:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G29:vtf:t::IF(E29,(E29*F29),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H29:vtf:t::IF(SUM(G29),(G29/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I29:f:1\ncell:B30:b::2:::l:1:f:3\ncell:C30:b:2:2:2:2:l:2:f:1:cf:2\ncell:D30:b:2:2:2:2:l:2:f:1\ncell:E30:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F30:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G30:vtf:t::IF(E30,(E30*F30),\"\"):l:2:f:1:ntvf:1\ncell:H30:vtf:t::IF(SUM(G30),(G30/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I30:f:1\ncell:B31:b::2:::l:1:f:3\ncell:C31:b:2:2:2:2:l:2:f:1:bg:2:cf:2\ncell:D31:b:2:2:2:2:l:2:f:1:bg:2\ncell:E31:b:2:2:2:2:l:2:f:1:bg:2:ntvf:3\ncell:F31:b:2:2:2:2:l:2:f:1:bg:2:ntvf:2\ncell:G31:vtf:t::IF(E31,(E31*F31),\"\"):l:2:f:1:bg:2:ntvf:1\ncell:H31:vtf:t::IF(SUM(G31),(G31/$G$33),\"\"):l:2:f:1:bg:2:ntvf:4\ncell:I31:f:1\ncell:B32:b::2:::l:1:f:3\ncell:C32:b:2:2:2:2:l:2:f:1:cf:2\ncell:D32:b:2:2:2:2:l:2:f:1\ncell:E32:b:2:2:2:2:l:2:f:1:ntvf:3\ncell:F32:b:2:2:2:2:l:2:f:1:ntvf:2\ncell:G32:vtf:t::IF(E32,(E32*F32),\"\"):l:2:f:1:ntvf:1\ncell:H32:vtf:t::IF(SUM(G32),(G32/$G$33),\"\"):l:2:f:1:ntvf:4\ncell:I32:f:1\ncell:B33:l:1:f:3\ncell:C33:t:Totals:l:2:f:7\ncell:D33:l:2:f:7\ncell:E33:l:2:f:7\ncell:F33:l:2:f:7\ncell:G33:vtf:n:282635:IF(SUM(G8\\cG32),SUM(G8\\cG32),\"\"):l:2:f:7:ntvf:1\ncell:H33:vtf:n:1:IF(SUM(G33),(G33/$G$33),\"\"):l:2:f:7:ntvf:4\ncell:I33:f:4\ncell:C34:l:2:f:4\ncell:D34:l:2:f:4\ncell:E34:l:2:f:4\ncell:F34:l:2:f:4\ncell:G34:l:2:f:4\ncell:H34:l:2:f:4\ncell:I34:f:4\ncell:C35:l:2:f:3\ncell:D35:l:2\ncell:E35:l:2\ncell:F35:l:2\ncell:G35:l:2\ncell:H35:l:2\ncol:A:w:12\ncol:B:w:12\ncol:C:w:178\ncol:D:w:143\ncol:E:w:84\ncol:F:w:182\ncol:G:w:137\ncol:H:w:154\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:10:r:35:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold 26pt Times New Roman\nfont:3:normal normal 10pt Arial\nfont:4:normal normal 10pt arial,helvetica,sans-serif\nfont:5:normal normal 14pt *\nfont:6:normal normal 14pt Arial\nfont:7:normal normal 14pt arial,helvetica,sans-serif\nfont:8:normal normal 16pt arial,helvetica,sans-serif\nfont:9:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:2:\"$\"#,##0.00 ;\"$\"(#,##0.00)\nvalueformat:3:#,##0;(#,##0)\nvalueformat:4:0.00%\nvalueformat:5:@\nname:DATA_01::C4\nname:DATA_02::C9\nname:DATA_03::D9\\cD20\nname:DATA_04::G9\\cG20\n"},"name":"sheet101","hidden":"1"},"sheet5":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Product Sales Goals:l:2:f:6:c:3:bg:1:cf:1:colspan:4\ncell:D3:l:2:f:1:cf:1\ncell:E3:l:2:f:1:cf:1\ncell:F3:l:2:f:1:cf:1\ncell:D4:l:2:f:1:cf:1\ncell:E4:l:2:f:1:cf:1\ncell:F4:l:2:f:1:cf:1\ncell:C5:t:2000 Units:l:2:f:3:cf:1:colspan:4\ncell:D5:l:2:f:1:cf:1\ncell:E5:l:2:f:1:cf:1\ncell:F5:l:2:f:1:cf:1\ncell:C6:l:2:f:1\ncell:D6:l:2\ncell:E6:l:2:f:1\ncell:F6:l:2:f:1\ncell:C7:l:2:f:1\ncell:D7:t:TRAINS:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:E7:t::l:2:f:5\ncell:F7:t::l:2:f:5\ncell:C8:l:2:f:1\ncell:D8:t:Last Yr:b:::2::l:2:f:3:cf:1\ncell:E8:t:Goal:b:::2::l:2:f:3:cf:1\ncell:F8:t:Change:l:2:f:3:cf:1\ncell:C9:t:Jan:b::2:::l:2:f:2\ncell:D9:v:1782:b:2:2:2:2:l:2:f:2\ncell:E9:v:2000:b:2:2:2:2:l:2:f:2\ncell:F9:vtf:n:0.122334455667789:IF(ISNUMBER(D9),((E9-D9)/D9),\"\"):l:2:f:2:ntvf:1\ncell:G9:f:2\ncell:C10:t:Feb:b::2:::l:2:f:2:bg:2\ncell:D10:v:1523:b:2:2:2:2:l:2:f:2:bg:2\ncell:E10:v:1700:b:2:2:2:2:l:2:f:2:bg:2\ncell:F10:vtf:n:0.11621799080761655:IF(ISNUMBER(D10),((E10-D10)/D10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G10:f:2\ncell:C11:t:Mar:b::2:::l:2:f:2\ncell:D11:v:1901:b:2:2:2:2:l:2:f:2\ncell:E11:v:2000:b:2:2:2:2:l:2:f:2\ncell:F11:vtf:n:0.05207785376117833:IF(ISNUMBER(D11),((E11-D11)/D11),\"\"):l:2:f:2:ntvf:1\ncell:G11:f:2\ncell:C12:t:Apr:b::1:::l:2:f:2:bg:2\ncell:D12:v:2308:b:2:1:2:2:l:2:f:2:bg:2\ncell:E12:v:2400:b:2:1:2:2:l:2:f:2:bg:2\ncell:F12:vtf:n:0.03986135181975736:IF(ISNUMBER(D12),((E12-D12)/D12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G12:f:2\ncell:C13:t:May:b::2:::l:2:f:2\ncell:D13:v:2538:b:2:2:2:2:l:2:f:2\ncell:E13:v:2800:b:2:2:2:2:l:2:f:2\ncell:F13:vtf:n:0.10323089046493301:IF(ISNUMBER(D13),((E13-D13)/D13),\"\"):l:2:f:2:ntvf:1\ncell:G13:f:2\ncell:C14:t:Jun:b::2:::l:2:f:2:bg:2\ncell:D14:v:1866:b:2:2:2:2:l:2:f:2:bg:2\ncell:E14:v:2000:b:2:2:2:2:l:2:f:2:bg:2\ncell:F14:vtf:n:0.07181136120042872:IF(ISNUMBER(D14),((E14-D14)/D14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G14:f:2\ncell:C15:t:Jul:b::2:::l:2:f:2\ncell:D15:v:2212:b:2:2:2:2:l:2:f:2\ncell:E15:v:2500:b:2:2:2:2:l:2:f:2\ncell:F15:vtf:n:0.1301989150090416:IF(ISNUMBER(D15),((E15-D15)/D15),\"\"):l:2:f:2:ntvf:1\ncell:G15:f:2\ncell:C16:t:Aug:b::2:::l:2:f:2:bg:2\ncell:D16:v:1998:b:2:2:2:2:l:2:f:2:bg:2\ncell:E16:v:2300:b:2:2:2:2:l:2:f:2:bg:2\ncell:F16:vtf:n:0.15115115115115116:IF(ISNUMBER(D16),((E16-D16)/D16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G16:f:2\ncell:C17:t:Sep:b::2:::l:2:f:2\ncell:D17:v:2054:b:2:2:2:2:l:2:f:2\ncell:E17:v:2000:b:2:2:2:2:l:2:f:2\ncell:F17:vtf:n:-0.02629016553067186:IF(ISNUMBER(D17),((E17-D17)/D17),\"\"):l:2:f:2:ntvf:1\ncell:G17:f:2\ncell:C18:t:Oct:b::2:::l:2:f:2:bg:2\ncell:D18:v:2117:b:2:2:2:2:l:2:f:2:bg:2\ncell:E18:v:2400:b:2:2:2:2:l:2:f:2:bg:2\ncell:F18:vtf:n:0.1336797354747284:IF(ISNUMBER(D18),((E18-D18)/D18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G18:f:2\ncell:C19:t:Nov:b::2:::l:2:f:2\ncell:D19:v:1430:b:2:2:2:2:l:2:f:2\ncell:E19:v:1600:b:2:2:2:2:l:2:f:2\ncell:F19:vtf:n:0.11888111888111888:IF(ISNUMBER(D19),((E19-D19)/D19),\"\"):l:2:f:2:ntvf:1\ncell:G19:f:2\ncell:C20:t:Dec:b::1:::l:2:f:2:bg:2\ncell:D20:v:1859:b:2:1:2:2:l:2:f:2:bg:2\ncell:E20:v:2100:b:2:1:2:2:l:2:f:2:bg:2\ncell:F20:vtf:n:0.1296395911780527:IF(ISNUMBER(D20),((E20-D20)/D20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G20:f:2\ncell:C22:t:Year :l:2:f:4\ncell:D22:vtf:n:23588:IF(SUM(D9\\cD20),SUM(D9\\cD20),\"\"):b:1::1::l:2:f:4\ncell:E22:vtf:n:25800:IF(SUM(E9\\cE20),SUM(E9\\cE20),\"\"):b:1::1::l:2:f:4\ncell:F22:vtf:n:0.09377649652365609:IF(ISNUMBER(D22),((E22-D22)/D22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:G22:f:2\ncell:C23:l:2:f:2\ncell:D23:l:2:f:2\ncell:E23:l:2:f:2\ncell:F23:l:2:f:2\ncell:G23:f:2\ncell:C24:t:Date\\c :l:2:f:2:cf:2\ncell:D24:b:::2::l:2:f:2:ntvf:2\ncell:E24:l:2:f:2\ncell:F24:l:2:f:2\ncell:G24:f:2\ncell:C25:l:2:f:2\ncell:D25:b:2::::l:2:f:2\ncell:E25:l:2:f:2\ncell:F25:l:2:f:2\ncell:G25:f:2\ncell:C26:l:2\ncell:D26:l:2\ncell:E26:l:2\ncell:F26:l:2\ncell:C27:l:1:f:1\ncol:A:w:10\ncol:B:w:10\ncol:C:w:52\ncol:D:w:80\ncol:E:w:80\ncol:F:w:71\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:18.75\nrow:6:h:14.25\nrow:7:h:15.75\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:27:h:14.25\nsheet:c:7:r:27:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal normal 10pt Arial\nfont:2:normal normal 12pt arial,helvetica,sans-serif\nfont:3:normal normal 14pt Arial\nfont:4:normal normal 14pt arial,helvetica,sans-serif\nfont:5:normal normal 16pt Arial\nfont:6:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:0%\nvalueformat:2:dd-mmm-yy \nname:DATA_01::C5\nname:DATA_02::C10\nname:DATA_03::D10\\cD22\nname:DATA_04::#REF!\\c#REF!\n"},"name":"sheet4","hidden":"1"},"sheet6":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Product Sales Goals:l:1:f:3:cf:2\ncell:C3:l:1:f:4:cf:1\ncell:D3:l:1:f:4:cf:1\ncell:E3:l:1:f:4:cf:1\ncell:F3:l:1:f:4:cf:1\ncell:G3:l:1:f:4:cf:1\ncell:H3:l:1:f:4:cf:1\ncell:I3:l:1:f:4:cf:1\ncell:J3:l:1:f:4:cf:1\ncell:K3:l:1:f:4:cf:1\ncell:L3:l:1:f:4:cf:1\ncell:M3:l:1:f:4:cf:1\ncell:N3:l:1:f:4:cf:1\ncell:B4:t:2000 Units:l:1:f:2:cf:1\ncell:C4:l:1:f:4:cf:1\ncell:D4:l:1:f:4:cf:1\ncell:E4:l:1:f:4:cf:1\ncell:F4:l:1:f:4:cf:1\ncell:G4:l:1:f:4:cf:1\ncell:H4:l:1:f:4:cf:1\ncell:I4:l:1:f:4:cf:1\ncell:J4:l:1:f:4:cf:1\ncell:K4:l:1:f:4:cf:1\ncell:L4:l:1:f:4:cf:1\ncell:M4:l:1:f:4:cf:1\ncell:N4:l:1:f:4:cf:1\ncell:B5:l:1:f:4\ncell:D5:l:1:f:4\ncell:E5:l:1:f:4\ncell:F5:l:1:f:4\ncell:G5:l:1:f:4\ncell:H5:l:1:f:4\ncell:I5:l:1:f:4\ncell:J5:l:1:f:4\ncell:K5:l:1:f:4\ncell:L5:l:1:f:4\ncell:M5:l:1:f:4\ncell:N5:l:1:f:4\ncell:B6:l:1:f:4\ncell:C6:t:TRAINS:l:1:f:1:cf:1:colspan:3:rowspan:1\ncell:D6:t::l:2:f:4\ncell:E6:t::l:2:f:4\ncell:F6:t:PLANES:l:1:f:1:cf:1:colspan:3:rowspan:1\ncell:G6:t::l:2:f:4\ncell:H6:t::l:2:f:4\ncell:I6:t:AUTOMOBILES:l:1:f:1:cf:1:colspan:3:rowspan:1\ncell:J6:t::l:2:f:4\ncell:K6:t::l:2:f:4\ncell:L6:t:TOTAL:l:1:f:1:cf:1:colspan:3:rowspan:1\ncell:M6:t::l:2:f:4\ncell:N6:t::l:2:f:4\ncell:B7:l:1:f:4\ncell:C7:t:Last Yr:b:::1::l:1:f:4:cf:1\ncell:D7:t:Goal:b:::1::l:1:f:4:cf:1\ncell:E7:t:Change:b:::1::l:1:f:4:cf:1\ncell:F7:t:Last Yr:b:::1::l:1:f:4:cf:1\ncell:G7:t:Goal:b:::1::l:1:f:4:cf:1\ncell:H7:t:Change:b:::1::l:1:f:4:cf:1\ncell:I7:t:Last Yr:b:::1::l:1:f:4:cf:1\ncell:J7:t:Goal:b:::1::l:1:f:4:cf:1\ncell:K7:t:Change:b:::1::l:1:f:4:cf:1\ncell:L7:t:Last Yr:b:::1::l:1:f:4:cf:1\ncell:M7:t:Goal:b:::1::l:1:f:4:cf:1\ncell:N7:t:Change:b:::1::l:1:f:4:cf:1\ncell:B8:t:Jan:b::1:::l:1:f:4\ncell:C8:v:1782:b:1:1:1:1:l:1:f:4\ncell:D8:v:2000:b:1:1:1:1:l:1:f:4\ncell:E8:vtf:n:0.122334455667789:IF(ISNUMBER(C8),((D8-C8)/C8),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F8:v:325:b:1:1:1:1:l:1:f:4\ncell:G8:v:350:b:1:1:1:1:l:1:f:4\ncell:H8:vtf:n:0.07692307692307693:IF(ISNUMBER(F8),((G8-F8)/F8),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I8:v:711:b:1:1:1:1:l:1:f:4\ncell:J8:v:800:b:1:1:1:1:l:1:f:4\ncell:K8:vtf:n:0.12517580872011252:IF(ISNUMBER(I8),((J8-I8)/I8),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L8:vtf:n:2818:IF(SUM(C8,F8,I8),SUM(C8,F8,I8),\"\"):b:1:1:1:1:l:1:f:4\ncell:M8:vtf:n:3150:IF(SUM(D8,G8,J8),SUM(D8,G8,J8),\"\"):b:1:1:1:1:l:1:f:4\ncell:N8:vtf:n:0.11781405251951739:IF(ISNUMBER(L8),((M8-L8)/L8),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B9:t:Feb:b::1:::l:1:f:4\ncell:C9:v:1523:b:1:1:1:1:l:1:f:4\ncell:D9:v:1700:b:1:1:1:1:l:1:f:4\ncell:E9:vtf:n:0.11621799080761655:IF(ISNUMBER(C9),((D9-C9)/C9),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F9:v:158:b:1:1:1:1:l:1:f:4\ncell:G9:v:200:b:1:1:1:1:l:1:f:4\ncell:H9:vtf:n:0.26582278481012656:IF(ISNUMBER(F9),((G9-F9)/F9),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I9:v:564:b:1:1:1:1:l:1:f:4\ncell:J9:v:650:b:1:1:1:1:l:1:f:4\ncell:K9:vtf:n:0.1524822695035461:IF(ISNUMBER(I9),((J9-I9)/I9),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L9:vtf:n:2245:IF(SUM(C9,F9,I9),SUM(C9,F9,I9),\"\"):b:1:1:1:1:l:1:f:4\ncell:M9:vtf:n:2550:IF(SUM(D9,G9,J9),SUM(D9,G9,J9),\"\"):b:1:1:1:1:l:1:f:4\ncell:N9:vtf:n:0.1358574610244989:IF(ISNUMBER(L9),((M9-L9)/L9),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B10:t:Mar:b::1:::l:1:f:4\ncell:C10:v:1901:b:1:1:1:1:l:1:f:4\ncell:D10:v:2000:b:1:1:1:1:l:1:f:4\ncell:E10:vtf:n:0.05207785376117833:IF(ISNUMBER(C10),((D10-C10)/C10),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F10:v:168:b:1:1:1:1:l:1:f:4\ncell:G10:v:200:b:1:1:1:1:l:1:f:4\ncell:H10:vtf:n:0.19047619047619047:IF(ISNUMBER(F10),((G10-F10)/F10),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I10:v:740:b:1:1:1:1:l:1:f:4\ncell:J10:v:850:b:1:1:1:1:l:1:f:4\ncell:K10:vtf:n:0.14864864864864866:IF(ISNUMBER(I10),((J10-I10)/I10),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L10:vtf:n:2809:IF(SUM(C10,F10,I10),SUM(C10,F10,I10),\"\"):b:1:1:1:1:l:1:f:4\ncell:M10:vtf:n:3050:IF(SUM(D10,G10,J10),SUM(D10,G10,J10),\"\"):b:1:1:1:1:l:1:f:4\ncell:N10:vtf:n:0.08579565681737274:IF(ISNUMBER(L10),((M10-L10)/L10),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B11:t:Apr:b::1:::l:1:f:4\ncell:C11:v:2308:b:1:1:1:1:l:1:f:4\ncell:D11:v:2400:b:1:1:1:1:l:1:f:4\ncell:E11:vtf:n:0.03986135181975736:IF(ISNUMBER(C11),((D11-C11)/C11),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F11:v:365:b:1:1:1:1:l:1:f:4\ncell:G11:v:400:b:1:1:1:1:l:1:f:4\ncell:H11:vtf:n:0.0958904109589041:IF(ISNUMBER(F11),((G11-F11)/F11),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I11:v:642:b:1:1:1:1:l:1:f:4\ncell:J11:v:700:b:1:1:1:1:l:1:f:4\ncell:K11:vtf:n:0.09034267912772585:IF(ISNUMBER(I11),((J11-I11)/I11),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L11:vtf:n:3315:IF(SUM(C11,F11,I11),SUM(C11,F11,I11),\"\"):b:1:1:1:1:l:1:f:4\ncell:M11:vtf:n:3500:IF(SUM(D11,G11,J11),SUM(D11,G11,J11),\"\"):b:1:1:1:1:l:1:f:4\ncell:N11:vtf:n:0.05580693815987934:IF(ISNUMBER(L11),((M11-L11)/L11),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B12:t:May:b::1:::l:1:f:4\ncell:C12:v:2538:b:1:1:1:1:l:1:f:4\ncell:D12:v:2800:b:1:1:1:1:l:1:f:4\ncell:E12:vtf:n:0.10323089046493301:IF(ISNUMBER(C12),((D12-C12)/C12),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F12:v:402:b:1:1:1:1:l:1:f:4\ncell:G12:v:450:b:1:1:1:1:l:1:f:4\ncell:H12:vtf:n:0.11940298507462686:IF(ISNUMBER(F12),((G12-F12)/F12),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I12:v:663:b:1:1:1:1:l:1:f:4\ncell:J12:v:800:b:1:1:1:1:l:1:f:4\ncell:K12:vtf:n:0.2066365007541478:IF(ISNUMBER(I12),((J12-I12)/I12),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L12:vtf:n:3603:IF(SUM(C12,F12,I12),SUM(C12,F12,I12),\"\"):b:1:1:1:1:l:1:f:4\ncell:M12:vtf:n:4050:IF(SUM(D12,G12,J12),SUM(D12,G12,J12),\"\"):b:1:1:1:1:l:1:f:4\ncell:N12:vtf:n:0.12406328059950042:IF(ISNUMBER(L12),((M12-L12)/L12),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B13:t:Jun:b::1:::l:1:f:4\ncell:C13:v:1866:b:1:1:1:1:l:1:f:4\ncell:D13:v:2000:b:1:1:1:1:l:1:f:4\ncell:E13:vtf:n:0.07181136120042872:IF(ISNUMBER(C13),((D13-C13)/C13),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F13:v:217:b:1:1:1:1:l:1:f:4\ncell:G13:v:250:b:1:1:1:1:l:1:f:4\ncell:H13:vtf:n:0.15207373271889402:IF(ISNUMBER(F13),((G13-F13)/F13),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I13:v:604:b:1:1:1:1:l:1:f:4\ncell:J13:v:700:b:1:1:1:1:l:1:f:4\ncell:K13:vtf:n:0.15894039735099338:IF(ISNUMBER(I13),((J13-I13)/I13),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L13:vtf:n:2687:IF(SUM(C13,F13,I13),SUM(C13,F13,I13),\"\"):b:1:1:1:1:l:1:f:4\ncell:M13:vtf:n:2950:IF(SUM(D13,G13,J13),SUM(D13,G13,J13),\"\"):b:1:1:1:1:l:1:f:4\ncell:N13:vtf:n:0.09787867510234462:IF(ISNUMBER(L13),((M13-L13)/L13),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B14:t:Jul:b::1:::l:1:f:4\ncell:C14:v:2212:b:1:1:1:1:l:1:f:4\ncell:D14:v:2500:b:1:1:1:1:l:1:f:4\ncell:E14:vtf:n:0.1301989150090416:IF(ISNUMBER(C14),((D14-C14)/C14),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F14:v:264:b:1:1:1:1:l:1:f:4\ncell:G14:v:300:b:1:1:1:1:l:1:f:4\ncell:H14:vtf:n:0.13636363636363635:IF(ISNUMBER(F14),((G14-F14)/F14),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I14:v:653:b:1:1:1:1:l:1:f:4\ncell:J14:v:800:b:1:1:1:1:l:1:f:4\ncell:K14:vtf:n:0.225114854517611:IF(ISNUMBER(I14),((J14-I14)/I14),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L14:vtf:n:3129:IF(SUM(C14,F14,I14),SUM(C14,F14,I14),\"\"):b:1:1:1:1:l:1:f:4\ncell:M14:vtf:n:3600:IF(SUM(D14,G14,J14),SUM(D14,G14,J14),\"\"):b:1:1:1:1:l:1:f:4\ncell:N14:vtf:n:0.15052732502396932:IF(ISNUMBER(L14),((M14-L14)/L14),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B15:t:Aug:b::1:::l:1:f:4\ncell:C15:v:1998:b:1:1:1:1:l:1:f:4\ncell:D15:v:2300:b:1:1:1:1:l:1:f:4\ncell:E15:vtf:n:0.15115115115115116:IF(ISNUMBER(C15),((D15-C15)/C15),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F15:v:267:b:1:1:1:1:l:1:f:4\ncell:G15:v:300:b:1:1:1:1:l:1:f:4\ncell:H15:vtf:n:0.12359550561797752:IF(ISNUMBER(F15),((G15-F15)/F15),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I15:v:537:b:1:1:1:1:l:1:f:4\ncell:J15:v:600:b:1:1:1:1:l:1:f:4\ncell:K15:vtf:n:0.11731843575418995:IF(ISNUMBER(I15),((J15-I15)/I15),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L15:vtf:n:2802:IF(SUM(C15,F15,I15),SUM(C15,F15,I15),\"\"):b:1:1:1:1:l:1:f:4\ncell:M15:vtf:n:3200:IF(SUM(D15,G15,J15),SUM(D15,G15,J15),\"\"):b:1:1:1:1:l:1:f:4\ncell:N15:vtf:n:0.14204139900071378:IF(ISNUMBER(L15),((M15-L15)/L15),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B16:t:Sep:b::1:::l:1:f:4\ncell:C16:v:2054:b:1:1:1:1:l:1:f:4\ncell:D16:v:2000:b:1:1:1:1:l:1:f:4\ncell:E16:vtf:n:-0.02629016553067186:IF(ISNUMBER(C16),((D16-C16)/C16),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F16:v:318:b:1:1:1:1:l:1:f:4\ncell:G16:v:350:b:1:1:1:1:l:1:f:4\ncell:H16:vtf:n:0.10062893081761007:IF(ISNUMBER(F16),((G16-F16)/F16),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I16:v:741:b:1:1:1:1:l:1:f:4\ncell:J16:v:900:b:1:1:1:1:l:1:f:4\ncell:K16:vtf:n:0.2145748987854251:IF(ISNUMBER(I16),((J16-I16)/I16),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L16:vtf:n:3113:IF(SUM(C16,F16,I16),SUM(C16,F16,I16),\"\"):b:1:1:1:1:l:1:f:4\ncell:M16:vtf:n:3250:IF(SUM(D16,G16,J16),SUM(D16,G16,J16),\"\"):b:1:1:1:1:l:1:f:4\ncell:N16:vtf:n:0.04400899453902987:IF(ISNUMBER(L16),((M16-L16)/L16),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B17:t:Oct:b::1:::l:1:f:4\ncell:C17:v:2117:b:1:1:1:1:l:1:f:4\ncell:D17:v:2400:b:1:1:1:1:l:1:f:4\ncell:E17:vtf:n:0.1336797354747284:IF(ISNUMBER(C17),((D17-C17)/C17),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F17:v:159:b:1:1:1:1:l:1:f:4\ncell:G17:v:200:b:1:1:1:1:l:1:f:4\ncell:H17:vtf:n:0.2578616352201258:IF(ISNUMBER(F17),((G17-F17)/F17),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I17:v:554:b:1:1:1:1:l:1:f:4\ncell:J17:v:650:b:1:1:1:1:l:1:f:4\ncell:K17:vtf:n:0.17328519855595667:IF(ISNUMBER(I17),((J17-I17)/I17),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L17:vtf:n:2830:IF(SUM(C17,F17,I17),SUM(C17,F17,I17),\"\"):b:1:1:1:1:l:1:f:4\ncell:M17:vtf:n:3250:IF(SUM(D17,G17,J17),SUM(D17,G17,J17),\"\"):b:1:1:1:1:l:1:f:4\ncell:N17:vtf:n:0.14840989399293286:IF(ISNUMBER(L17),((M17-L17)/L17),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B18:t:Nov:b::1:::l:1:f:4\ncell:C18:v:1430:b:1:1:1:1:l:1:f:4\ncell:D18:v:1600:b:1:1:1:1:l:1:f:4\ncell:E18:vtf:n:0.11888111888111888:IF(ISNUMBER(C18),((D18-C18)/C18),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F18:v:193:b:1:1:1:1:l:1:f:4\ncell:G18:v:200:b:1:1:1:1:l:1:f:4\ncell:H18:vtf:n:0.03626943005181347:IF(ISNUMBER(F18),((G18-F18)/F18),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I18:v:657:b:1:1:1:1:l:1:f:4\ncell:J18:v:800:b:1:1:1:1:l:1:f:4\ncell:K18:vtf:n:0.2176560121765601:IF(ISNUMBER(I18),((J18-I18)/I18),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L18:vtf:n:2280:IF(SUM(C18,F18,I18),SUM(C18,F18,I18),\"\"):b:1:1:1:1:l:1:f:4\ncell:M18:vtf:n:2600:IF(SUM(D18,G18,J18),SUM(D18,G18,J18),\"\"):b:1:1:1:1:l:1:f:4\ncell:N18:vtf:n:0.14035087719298245:IF(ISNUMBER(L18),((M18-L18)/L18),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B19:t:Dec:b::1:::l:1:f:4\ncell:C19:v:1859:b:1:1:1:1:l:1:f:4\ncell:D19:v:2100:b:1:1:1:1:l:1:f:4\ncell:E19:vtf:n:0.1296395911780527:IF(ISNUMBER(C19),((D19-C19)/C19),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F19:v:426:b:1:1:1:1:l:1:f:4\ncell:G19:v:450:b:1:1:1:1:l:1:f:4\ncell:H19:vtf:n:0.056338028169014086:IF(ISNUMBER(F19),((G19-F19)/F19),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I19:v:732:b:1:1:1:1:l:1:f:4\ncell:J19:v:850:b:1:1:1:1:l:1:f:4\ncell:K19:vtf:n:0.16120218579234974:IF(ISNUMBER(I19),((J19-I19)/I19),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L19:vtf:n:3017:IF(SUM(C19,F19,I19),SUM(C19,F19,I19),\"\"):b:1:1:1:1:l:1:f:4\ncell:M19:vtf:n:3400:IF(SUM(D19,G19,J19),SUM(D19,G19,J19),\"\"):b:1:1:1:1:l:1:f:4\ncell:N19:vtf:n:0.12694729864103413:IF(ISNUMBER(L19),((M19-L19)/L19),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B20:t:Year :b::1:::l:1:f:4\ncell:C20:vtf:n:23588:IF(SUM(C8\\cC19),SUM(C8\\cC19),\"\"):b:1:1:1:1:l:1:f:4\ncell:D20:vtf:n:25800:IF(SUM(D8\\cD19),SUM(D8\\cD19),\"\"):b:1:1:1:1:l:1:f:4\ncell:E20:vtf:n:0.09377649652365609:IF(ISNUMBER(C20),((D20-C20)/C20),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:F20:vtf:n:3262:IF(SUM(F8\\cF19),SUM(F8\\cF19),\"\"):b:1:1:1:1:l:1:f:4\ncell:G20:vtf:n:3650:IF(SUM(G8\\cG19),SUM(G8\\cG19),\"\"):b:1:1:1:1:l:1:f:4\ncell:H20:vtf:n:0.11894543225015328:IF(ISNUMBER(F20),((G20-F20)/F20),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:I20:vtf:n:7798:IF(SUM(I8\\cI19),SUM(I8\\cI19),\"\"):b:1:1:1:1:l:1:f:4\ncell:J20:vtf:n:9100:IF(SUM(J8\\cJ19),SUM(J8\\cJ19),\"\"):b:1:1:1:1:l:1:f:4\ncell:K20:vtf:n:0.16696588868940754:IF(ISNUMBER(I20),((J20-I20)/I20),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:L20:vtf:n:34648:IF(SUM(L8\\cL19),SUM(L8\\cL19),\"\"):b:1:1:1:1:l:1:f:4\ncell:M20:vtf:n:38550:IF(SUM(M8\\cM19),SUM(M8\\cM19),\"\"):b:1:1:1:1:l:1:f:4\ncell:N20:vtf:n:0.11261833294851073:IF(ISNUMBER(L20),((M20-L20)/L20),\"\"):b:1:1:1:1:l:1:f:4:ntvf:1\ncell:B21:l:1:f:4\ncell:C21:b:1::::l:1:f:4\ncell:D21:b:1::::l:1:f:4\ncell:E21:b:1::::l:1:f:4\ncell:F21:b:1::::l:1:f:4\ncell:G21:b:1::::l:1:f:4\ncell:H21:b:1::::l:1:f:4\ncell:I21:b:1::::l:1:f:4\ncell:J21:b:1::::l:1:f:4\ncell:K21:b:1::::l:1:f:4\ncell:L21:b:1::::l:1:f:4\ncell:M21:b:1::::l:1:f:4\ncell:N21:b:1::::l:1:f:4\ncell:B22:t:Date\\c :l:1:f:4:cf:3\ncell:C22:b:::1::l:1:f:4:ntvf:2\ncell:D22:l:1:f:4\ncell:E22:l:1:f:4\ncell:F22:l:1:f:4\ncell:G22:l:1:f:4\ncell:H22:l:1:f:4\ncell:I22:l:1:f:4\ncell:J22:t:Prepared by\\c :l:1:f:4:cf:3\ncell:K22:b:::1::l:1:f:4:cf:1\ncell:L22:b:::1::l:1:f:4:cf:1\ncell:M22:b:::1::l:1:f:4:cf:1\ncell:N22:b:::1::l:1:f:4:cf:1\ncell:C23:b:1::::l:1:f:4\ncell:K23:b:1::::l:1:f:4\ncell:L23:b:1::::l:1:f:4\ncell:M23:b:1::::l:1:f:4\ncell:N23:b:1::::l:1:f:4\ncell:B25:l:1:f:4\ncol:B:w:306\ncol:C:w:80\ncol:D:w:80\ncol:E:w:71\ncol:F:w:80\ncol:G:w:80\ncol:H:w:71\ncol:I:w:80\ncol:J:w:80\ncol:K:w:71\ncol:L:w:80\ncol:M:w:80\ncol:N:w:71\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:15.75\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:25:h:14.25\nsheet:c:14:r:25:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\nfont:1:normal bold 12pt Arial\nfont:2:normal bold 14pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:0%\nvalueformat:2:dd-mmm-yy \nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet401","hidden":"1"},"sheet7":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Price Estimate for Services :l:1:f:8:c:3:bg:1:cf:1:colspan:2\ncell:D3:l:1:f:3:cf:1\ncell:C4:vtf:ndt:41099.54668960648:NOW():l:1:f:7:cf:1:ntvf:6\ncell:D4:l:1\ncell:C5:l:1:f:1:cf:1:ntvf:6\ncell:D5:l:1:f:1\ncell:E5:f:1\ncell:F5:f:1\ncell:C6:t:Name of Job:l:1:f:7:cf:1\ncell:D6:t:Job 1:l:1:f:7:cf:1\ncell:C7:t:Wage rate per hour:l:1:f:5:cf:2\ncell:D7:v:10:b:1:1:1:1:l:1:f:5:cf:3:ntvf:3\ncell:E7:f:5\ncell:F7:f:5\ncell:C8:t:Fringe Benefit as a % of wages:l:1:f:5:bg:2:cf:2\ncell:D8:v:0.3:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:5\ncell:E8:f:5\ncell:F8:f:5\ncell:C9:t:Projected Overhead Cost for Year:l:1:f:5:cf:2\ncell:D9:v:40000:b:1:1:1:1:l:1:f:5:cf:3:ntvf:2\ncell:E9:f:5\ncell:F9:f:5\ncell:C10:t:Projected Direct Labor Cost for Year:l:1:f:5:bg:2:cf:2\ncell:D10:v:50000:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:2\ncell:E10:f:5\ncell:F10:f:5\ncell:C11:l:1:f:5:cf:2\ncell:D11:l:1:f:5:cf:3\ncell:E11:f:5\ncell:F11:f:5\ncell:C12:t:Hours worked on job:l:1:f:5:cf:2\ncell:D12:v:1.5:b:1:1:1:1:l:1:f:5:cf:3:ntvf:4\ncell:E12:f:5\ncell:F12:f:5\ncell:C13:t:Direct Labor Cost:l:1:f:5:bg:2:cf:2\ncell:D13:vtf:n:19.5:IF(SUM(D12,D7),((D12*D7)*(1+D8)),\"\"):l:1:f:5:bg:2:cf:3:ntvf:3\ncell:E13:f:5\ncell:F13:f:5\ncell:C14:t:Overhead Cost:l:1:f:5:cf:2\ncell:D14:vtf:n:15.600000000000001:IF((D10>0),((D9/D10)*D13),\"\"):l:1:f:5:cf:3:ntvf:1\ncell:E14:f:5\ncell:F14:f:5\ncell:C15:t:Cost of materials for the job:l:1:f:5:bg:2:cf:2\ncell:D15:v:10:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:1\ncell:E15:f:5\ncell:F15:f:5\ncell:C16:l:1:f:9:cf:2\ncell:D16:l:1:f:9:cf:3:ntvf:1\ncell:E16:f:4\ncell:C17:t:Total cost:l:1:f:6:cf:2\ncell:D17:vtf:n:45.1:IF(SUM(D13\\cD15),SUM(D13\\cD15),\"\"):b:2::2::l:1:f:6:cf:3:ntvf:3\ncell:E17:f:6\ncell:C18:l:1:f:2\ncell:D18:b:2::::l:1:f:2\ncell:C19:l:1:f:2\ncell:D19:l:1\ncol:A:w:10\ncol:B:w:10\ncol:C:w:289\ncol:D:w:110\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:18.75\nrow:6:h:18.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:15.75\nrow:10:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:12\nrow:21:h:12\nrow:22:h:12\nsheet:c:6:r:22:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 6pt *\nfont:2:normal normal 10pt Arial\nfont:3:normal normal 10pt Times New Roman\nfont:4:normal normal 12pt *\nfont:5:normal normal 12pt arial,helvetica,sans-serif\nfont:6:normal normal 14pt arial,helvetica,sans-serif\nfont:7:normal normal 16pt arial,helvetica,sans-serif\nfont:8:normal normal 26pt arial,helvetica,sans-serif\nfont:9:normal normal 6pt *\nlayout:1:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1: #,##0.00 ;(#,##0.00)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:3:\"$\"#,##0.00 ;\"$\"(#,##0.00)\nvalueformat:4:#,##0.00;(#,##0.00)\nvalueformat:5:0%\nvalueformat:6:mmmm d, yyyy\nname:DATA_01::C4\nname:DATA_02::C10\nname:DATA_03::D10\\cD22\nname:DATA_04::#REF!\\c#REF!\n"},"name":"sheet5","hidden":"1"},"sheet8":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Price Estimate for Services :l:1:f:4:cf:2\ncell:C3:l:1:f:6:cf:1\ncell:D3:l:1:f:6:cf:1\ncell:E3:l:1:f:6:cf:1\ncell:F3:l:1:f:6:cf:1\ncell:G3:l:1:f:6:cf:1\ncell:B4:vtf:ndt:41096.725430844905:NOW():l:1:f:3:cf:1:ntvf:6\ncell:B5:t:Name of Job:b:::1::l:1:f:2:cf:2\ncell:C5:t:Job 1:b:::1::l:1:f:1:cf:3\ncell:D5:t:Job 2:b:::1::l:1:f:1:cf:3\ncell:E5:t:Job 3:b:::1::l:1:f:1:cf:3\ncell:F5:t:Job 4:b:::1::l:1:f:1:cf:3\ncell:G5:t:Job 5:b:::1::l:1:f:1:cf:3\ncell:B6:t:Wage rate per hour:b:1::::l:1:f:7\ncell:C6:v:10:b:1::::l:1:f:7:ntvf:3\ncell:D6:v:22:b:1::::l:1:f:7:ntvf:3\ncell:E6:v:14:b:1::::l:1:f:7:ntvf:3\ncell:F6:v:15:b:1::::l:1:f:7:ntvf:3\ncell:G6:v:19:b:1::::l:1:f:7:ntvf:3\ncell:B7:t:Fringe Benefit as a % of wages:l:1:f:7\ncell:C7:v:0.3:l:1:f:7:ntvf:5\ncell:D7:v:0.3:l:1:f:7:ntvf:5\ncell:E7:v:0.3:l:1:f:7:ntvf:5\ncell:F7:v:0.3:l:1:f:7:ntvf:5\ncell:G7:v:0.3:l:1:f:7:ntvf:5\ncell:B8:t:Projected Overhead Cost for Year:l:1:f:7:cf:2\ncell:C8:v:40000:l:1:f:7:ntvf:2\ncell:D8:v:40000:l:1:f:7:ntvf:2\ncell:E8:v:40000:l:1:f:7:ntvf:2\ncell:F8:v:40000:l:1:f:7:ntvf:2\ncell:G8:v:40000:l:1:f:7:ntvf:2\ncell:B9:t:Projected Direct Labor Cost for Year:l:1:f:7:cf:2\ncell:C9:v:50000:l:1:f:7:ntvf:2\ncell:D9:v:50000:l:1:f:7:ntvf:2\ncell:E9:v:50000:l:1:f:7:ntvf:2\ncell:F9:v:50000:l:1:f:7:ntvf:2\ncell:G9:v:50000:l:1:f:7:ntvf:2\ncell:B11:t:Hours worked on job:l:1:f:7\ncell:C11:v:1.5:l:1:f:7:ntvf:4\ncell:D11:v:2:l:1:f:7:ntvf:4\ncell:E11:v:1.5:l:1:f:7:ntvf:4\ncell:F11:v:1.5:l:1:f:7:ntvf:4\ncell:G11:v:1.5:l:1:f:7:ntvf:4\ncell:B12:t:Direct Labor Cost:l:1:f:7:cf:2\ncell:C12:vtf:n:19.5:IF(SUM(C11,C6),((C11*C6)*(1+C7)),\"\"):l:1:f:7:ntvf:3\ncell:D12:vtf:n:57.2:IF(SUM(D11,D6),((D11*D6)*(1+D7)),\"\"):l:1:f:7:ntvf:3\ncell:E12:vtf:n:27.3:IF(SUM(E11,E6),((E11*E6)*(1+E7)),\"\"):l:1:f:7:ntvf:3\ncell:F12:vtf:n:29.25:IF(SUM(F11,F6),((F11*F6)*(1+F7)),\"\"):l:1:f:7:ntvf:3\ncell:G12:vtf:n:37.050000000000004:IF(SUM(G11,G6),((G11*G6)*(1+G7)),\"\"):l:1:f:7:ntvf:3\ncell:B13:t:Overhead Cost:l:1:f:7\ncell:C13:vtf:n:15.600000000000001:IF((C9>0),((C8/C9)*C12),\"\"):l:1:f:7:ntvf:1\ncell:D13:vtf:n:45.760000000000005:IF((D9>0),((D8/D9)*D12),\"\"):l:1:f:7:ntvf:1\ncell:E13:vtf:n:21.840000000000003:IF((E9>0),((E8/E9)*E12),\"\"):l:1:f:7:ntvf:1\ncell:F13:vtf:n:23.400000000000002:IF((F9>0),((F8/F9)*F12),\"\"):l:1:f:7:ntvf:1\ncell:G13:vtf:n:29.640000000000004:IF((G9>0),((G8/G9)*G12),\"\"):l:1:f:7:ntvf:1\ncell:B14:t:Cost of materials for the job:b:::1::l:1:f:7\ncell:C14:v:10:b:::1::l:1:f:7:ntvf:1\ncell:D14:v:10:b:::1::l:1:f:7:ntvf:1\ncell:E14:v:10:b:::1::l:1:f:7:ntvf:1\ncell:F14:v:10:b:::1::l:1:f:7:ntvf:1\ncell:G14:v:10:b:::1::l:1:f:7:ntvf:1\ncell:B15:t:Total cost:b:1::1::l:1:f:1\ncell:C15:vtf:n:45.1:IF(SUM(C12\\cC14),SUM(C12\\cC14),\"\"):b:1::1::l:1:f:1:ntvf:3\ncell:D15:vtf:n:112.96000000000001:IF(SUM(D12\\cD14),SUM(D12\\cD14),\"\"):b:1::1::l:1:f:1:ntvf:3\ncell:E15:vtf:n:59.14:IF(SUM(E12\\cE14),SUM(E12\\cE14),\"\"):b:1::1::l:1:f:1:ntvf:3\ncell:F15:vtf:n:62.650000000000006:IF(SUM(F12\\cF14),SUM(F12\\cF14),\"\"):b:1::1::l:1:f:1:ntvf:3\ncell:G15:vtf:n:76.69000000000001:IF(SUM(G12\\cG14),SUM(G12\\cG14),\"\"):b:1::1::l:1:f:1:ntvf:3\ncell:B16:b:1::::l:1:f:5\ncell:C16:b:1::::l:1:f:5\ncell:D16:b:1::::l:1:f:5\ncell:E16:b:1::::l:1:f:5\ncell:F16:b:1::::l:1:f:5\ncell:G16:b:1::::l:1:f:5\ncell:B17:l:1:f:5\ncol:B:w:289\ncol:C:w:110\ncol:D:w:110\ncol:E:w:110\ncol:F:w:110\ncol:G:w:110\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:18.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:15.75\nrow:11:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:12\nrow:19:h:12\nrow:20:h:12\nsheet:c:7:r:20:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\nfont:1:normal bold 12pt Times New Roman\nfont:2:normal bold 14pt Times New Roman\nfont:3:normal bold 16pt Times New Roman\nfont:4:normal bold 26pt Times New Roman\nfont:5:normal normal 10pt Arial\nfont:6:normal normal 10pt Times New Roman\nfont:7:normal normal 12pt Times New Roman\nlayout:1:padding:* * * *;vertical-align:bottom;\nvalueformat:1: #,##0.00 ;(#,##0.00)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:3:\"$\"#,##0.00 ;\"$\"(#,##0.00)\nvalueformat:4:#,##0.00;(#,##0.00)\nvalueformat:5:0%\nvalueformat:6:mmmm d, yyyy\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet501","hidden":"1"},"sheet9":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:SALES QUOTATION:l:2:f:7:c:3:bg:1:cf:1:colspan:7\ncell:D3:l:2:f:1\ncell:E3:l:2:f:1\ncell:F3:l:2:f:1\ncell:G3:l:2:f:1\ncell:H3:l:2:f:1\ncell:I3:l:2:f:1\ncell:D4:l:2:f:1\ncell:E4:l:2:f:1\ncell:F4:l:2:f:1\ncell:G4:l:2:f:1\ncell:H4:l:2:f:1\ncell:I4:l:2:f:1\ncell:C5:t:Your Company, Inc.:l:2:f:3:cf:2\ncell:D5:l:2:f:1\ncell:E5:l:2:f:1\ncell:F5:l:2:f:1\ncell:G5:l:2:f:1\ncell:H5:l:2:f:1\ncell:I5:l:2:f:1:cf:3\ncell:C6:t:Name:l:2:f:2\ncell:D6:b:::1::l:2:f:2:colspan:2\ncell:E6:l:2:f:2\ncell:F6:l:2:f:2:cf:3\ncell:G6:l:2:f:1\ncell:H6:l:2:f:1\ncell:I6:l:2:f:1\ncell:C7:t:Address:l:2:f:2\ncell:D7:b:::1::l:2:f:2:colspan:2\ncell:E7:l:2:f:2\ncell:F7:l:2:f:2:cf:3\ncell:G7:l:2:f:1\ncell:H7:l:2:f:1\ncell:I7:l:2:f:1\ncell:C8:l:2:f:1\ncell:D8:l:2:f:1\ncell:E8:l:2:f:1\ncell:F8:l:2:f:1:cf:3\ncell:G8:l:2:f:1\ncell:H8:l:2:f:1\ncell:I8:l:2:f:1\ncell:C9:b:::2::l:2:f:1\ncell:D9:b:::2::l:2:f:1\ncell:E9:b:::2::l:2:f:1\ncell:F9:b:::2::l:2:f:1\ncell:G9:l:2:f:1\ncell:H9:l:2:f:1\ncell:I9:l:2:f:1\ncell:B10:b::2:::l:1:f:5\ncell:C10:t:TO\\c:b:1:::1:l:2:f:3\ncell:D10:b:2::::l:2:f:1\ncell:E10:b:2::::l:2:f:1\ncell:F10:b:2:2:::l:2:f:1\ncell:G10:b::::2:l:2:f:2\ncell:H10:l:2:f:2\ncell:I10:l:2:f:2\ncell:B11:b::2:::l:1:f:5\ncell:C11:b::::2:l:2:f:1:colspan:4\ncell:D11:l:2:f:1\ncell:E11:l:2:f:1\ncell:F11:b::2:::l:2:f:1\ncell:G11:b::::2:l:2:f:2\ncell:H11:t:F.O.B. :l:2:f:6:cf:3\ncell:I11:b:::1::l:2:f:2\ncell:B12:b::2:::l:1:f:5\ncell:C12:b::::1:l:2:f:1:bg:2:colspan:4\ncell:D12:l:2:f:1\ncell:E12:l:2:f:1\ncell:F12:b::2:::l:2:f:1\ncell:G12:b::::2:l:2:f:2\ncell:H12:t:TERMS :l:2:f:2:bg:2:cf:3\ncell:I12:b:::1::l:2:f:2:bg:2\ncell:B13:b::2:::l:1:f:5\ncell:C13:b::::2:l:2:f:1:colspan:4\ncell:D13:l:2:f:1\ncell:E13:l:2:f:1\ncell:F13:b::2:::l:2:f:1\ncell:G13:b::::2:l:2:f:2\ncell:H13:t:DELIVERY :l:2:f:2:cf:3\ncell:I13:b:::1::l:2:f:2\ncell:B14:b::2:::l:1:f:5\ncell:C14:b::::1:l:2:f:1:bg:2:colspan:4\ncell:D14:l:2:f:1\ncell:E14:l:2:f:1\ncell:F14:b::2:::l:2:f:1\ncell:G14:b::::2:l:2:f:2\ncell:H14:t:NUMBER :l:2:f:2:bg:2:cf:3\ncell:I14:b:::1::l:2:f:2:bg:2:ntvf:4\ncell:B15:b::2:::l:1:f:5\ncell:C15:b:::2:2:l:2:f:1:colspan:4\ncell:D15:b:::2::l:2:f:1\ncell:E15:b:::2::l:2:f:1\ncell:F15:b::2:2::l:2:f:1\ncell:G15:b::::2:l:2:f:2\ncell:H15:l:2:f:2\ncell:I15:l:2:f:2\ncell:C16:b:2::::l:2:f:1\ncell:D16:b:2::::l:2:f:1\ncell:E16:b:2::::l:2:f:1\ncell:F16:b:2::::l:2:f:1\ncell:G16:l:2:f:1\ncell:H16:l:2:f:1\ncell:I16:l:2:f:1\ncell:C17:t:Thank you for your inquiry dated\\c:l:2:f:2:colspan:3\ncell:D17:l:2:f:2\ncell:E17:l:2:f:2\ncell:F17:v:39199:l:2:f:2:cf:2:ntvf:5\ncell:G17:l:2:f:1\ncell:H17:l:2:f:1\ncell:I17:l:2:f:1\ncell:C18:t:We are pleased to quote you the following\\c:l:2:f:2:colspan:3\ncell:D18:l:2:f:2\ncell:E18:l:2:f:2\ncell:F18:l:2:f:2\ncell:G18:l:2:f:1\ncell:H18:l:2:f:1\ncell:I18:l:2:f:1\ncell:C19:l:2:f:1\ncell:D19:l:2:f:1\ncell:E19:l:2:f:1\ncell:F19:l:2:f:1\ncell:G19:l:2:f:1\ncell:H19:l:2:f:1\ncell:I19:l:2:f:1\ncell:B20:l:1:f:5\ncell:C20:t:ITEM:l:2:f:4:cf:1\ncell:D20:t:QUANTITY:l:2:f:4:cf:1\ncell:E20:t:DESCRIPTION:l:2:f:4:cf:1:colspan:3\ncell:F20:l:2:f:4:cf:1\ncell:G20:l:2:f:4:cf:1\ncell:H20:t:UNIT PRICE :l:2:f:4:cf:1\ncell:I20:t:DELIVERY DATE:l:2:f:4:cf:1\ncell:B21:b::2:::l:1:f:5\ncell:C21:v:1:b:2:1:1:1:l:2:f:2:cf:3:ntvf:3\ncell:D21:b:2:1:1:1:l:2:f:2:cf:3:ntvf:1\ncell:E21:b:2:1:1:1:l:2:f:2:cf:2:colspan:3\ncell:F21:b:2:1:1:1:l:2:f:2\ncell:G21:b:2:1:1:1:l:2:f:2\ncell:H21:b:2:1:1:1:l:2:f:2:cf:3:ntvf:2\ncell:I21:b:2:1:1:1:l:2:f:2:cf:2:ntvf:5\ncell:B22:b::2:::l:1:f:5\ncell:C22:v:2:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:3\ncell:D22:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:1\ncell:E22:b::1:1:1:l:2:f:2:bg:2:cf:2:colspan:3\ncell:F22:b::1:1:1:l:2:f:2:bg:2\ncell:G22:b::1:1:1:l:2:f:2:bg:2\ncell:H22:b::1:1:1:l:2:f:2:bg:2:cf:3\ncell:I22:b::1:1:1:l:2:f:2:bg:2:cf:2:ntvf:5\ncell:B23:b::2:::l:1:f:5\ncell:C23:v:3:b::1:1:1:l:2:f:2:cf:3:ntvf:3\ncell:D23:b::1:1:1:l:2:f:2:cf:3:ntvf:1\ncell:E23:b::1:1:1:l:2:f:2:cf:2:colspan:3\ncell:F23:b::1:1:1:l:2:f:2\ncell:G23:b::1:1:1:l:2:f:2\ncell:H23:b::1:1:1:l:2:f:2:cf:3\ncell:I23:b::1:1:1:l:2:f:2:cf:2:ntvf:5\ncell:B24:b::2:::l:1:f:5\ncell:C24:v:4:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:3\ncell:D24:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:1\ncell:E24:b::1:1:1:l:2:f:2:bg:2:cf:2:colspan:3\ncell:F24:b::1:1:1:l:2:f:2:bg:2\ncell:G24:b::1:1:1:l:2:f:2:bg:2\ncell:H24:b::1:1:1:l:2:f:2:bg:2:cf:3\ncell:I24:b::1:1:1:l:2:f:2:bg:2:cf:2:ntvf:5\ncell:B25:b::2:::l:1:f:5\ncell:C25:v:5:b::1:1:1:l:2:f:2:cf:3:ntvf:3\ncell:D25:b::1:1:1:l:2:f:2:cf:3:ntvf:1\ncell:E25:b::1:1:1:l:2:f:2:cf:2:colspan:3\ncell:F25:b::1:1:1:l:2:f:2\ncell:G25:b::1:1:1:l:2:f:2\ncell:H25:b::1:1:1:l:2:f:2:cf:3\ncell:I25:b::1:1:1:l:2:f:2:cf:2:ntvf:5\ncell:B26:b::2:::l:1:f:5\ncell:C26:v:6:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:3\ncell:D26:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:1\ncell:E26:b::1:1:1:l:2:f:2:bg:2:cf:2:colspan:3\ncell:F26:b::1:1:1:l:2:f:2:bg:2\ncell:G26:b::1:1:1:l:2:f:2:bg:2\ncell:H26:b::1:1:1:l:2:f:2:bg:2:cf:3\ncell:I26:b::1:1:1:l:2:f:2:bg:2:cf:2:ntvf:5\ncell:B27:b::2:::l:1:f:5\ncell:C27:v:7:b::1:1:1:l:2:f:2:cf:3:ntvf:3\ncell:D27:b::1:1:1:l:2:f:2:cf:3:ntvf:1\ncell:E27:b::1:1:1:l:2:f:2:cf:2:colspan:3\ncell:F27:b::1:1:1:l:2:f:2\ncell:G27:b::1:1:1:l:2:f:2\ncell:H27:b::1:1:1:l:2:f:2:cf:3\ncell:I27:b::1:1:1:l:2:f:2:cf:2:ntvf:5\ncell:B28:b::2:::l:1:f:5\ncell:C28:v:8:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:3\ncell:D28:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:1\ncell:E28:b::1:1:1:l:2:f:2:bg:2:cf:2:colspan:3\ncell:F28:b::1:1:1:l:2:f:2:bg:2\ncell:G28:b::1:1:1:l:2:f:2:bg:2\ncell:H28:b::1:1:1:l:2:f:2:bg:2:cf:3\ncell:I28:b::1:1:1:l:2:f:2:bg:2:cf:2:ntvf:5\ncell:B29:b::2:::l:1:f:5\ncell:C29:v:9:b::1:1:1:l:2:f:2:cf:3:ntvf:3\ncell:D29:b::1:1:1:l:2:f:2:cf:3:ntvf:1\ncell:E29:b::1:1:1:l:2:f:2:cf:2:colspan:3\ncell:F29:b::1:1:1:l:2:f:2\ncell:G29:b::1:1:1:l:2:f:2\ncell:H29:b::1:1:1:l:2:f:2:cf:3\ncell:I29:b::1:1:1:l:2:f:2:cf:2:ntvf:5\ncell:B30:b::2:::l:1:f:5\ncell:C30:v:10:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:3\ncell:D30:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:1\ncell:E30:b::1:1:1:l:2:f:2:bg:2:cf:2:colspan:3\ncell:F30:b::1:1:1:l:2:f:2:bg:2\ncell:G30:b::1:1:1:l:2:f:2:bg:2\ncell:H30:b::1:1:1:l:2:f:2:bg:2:cf:3\ncell:I30:b::1:1:1:l:2:f:2:bg:2:cf:2:ntvf:5\ncell:B31:b::2:::l:1:f:5\ncell:C31:v:11:b::1:1:1:l:2:f:2:cf:3:ntvf:3\ncell:D31:b::1:1:1:l:2:f:2:cf:3:ntvf:1\ncell:E31:b::1:1:1:l:2:f:2:cf:2:colspan:3\ncell:F31:b::1:1:1:l:2:f:2\ncell:G31:b::1:1:1:l:2:f:2\ncell:H31:b::1:1:1:l:2:f:2:cf:3\ncell:I31:b::1:1:1:l:2:f:2:cf:2:ntvf:5\ncell:B32:b::2:::l:1:f:5\ncell:C32:v:12:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:3\ncell:D32:b::1:1:1:l:2:f:2:bg:2:cf:3:ntvf:1\ncell:E32:b::1:1:1:l:2:f:2:bg:2:cf:2:colspan:3\ncell:F32:b::1:1:1:l:2:f:2:bg:2\ncell:G32:b::1:1:1:l:2:f:2:bg:2\ncell:H32:b::1:1:1:l:2:f:2:bg:2:cf:3\ncell:I32:b::1:1:1:l:2:f:2:bg:2:cf:2:ntvf:5\ncell:B33:l:1:f:5\ncell:C33:l:2:f:2:cf:3:ntvf:3\ncell:D33:l:2:f:2:cf:3:ntvf:1\ncell:E33:l:2:f:2:cf:2:colspan:3\ncell:F33:l:2:f:2\ncell:G33:l:2:f:2\ncell:H33:l:2:f:2:cf:3\ncell:I33:l:2:f:2:cf:2:ntvf:5\ncell:C34:t:We will be happy to supply any further information you may need and trust that you call on us to fill your order, which will receive our prompt and careful attention.:l:2:f:2:colspan:7:rowspan:2\ncell:D34:l:2:f:2\ncell:E34:l:2:f:2\ncell:F34:l:2:f:2\ncell:G34:l:2:f:2\ncell:H34:l:2:f:2\ncell:I34:l:2:f:2\ncell:C35:l:2:f:2:colspan:7\ncell:D35:l:2:f:2\ncell:E35:l:2:f:2\ncell:F35:l:2:f:2\ncell:G35:l:2:f:2\ncell:H35:l:2:f:2\ncell:I35:l:2:f:2\ncell:C36:b:::2::l:2:f:2\ncell:D36:b:::2::l:2:f:2\ncell:E36:b:::2::l:2:f:2\ncell:F36:b:::2::l:2:f:2\ncell:G36:l:2:f:2\ncell:H36:l:2:f:2\ncell:I36:b:::2::l:2:f:2:cf:2:ntvf:5\ncell:C37:t:PER:b:2::::l:2:f:2:cf:1\ncell:D37:b:2::::l:2:f:2:cf:1\ncell:E37:b:2::::l:2:f:2:cf:1\ncell:F37:b:2::::l:2:f:2:cf:1\ncell:G37:l:2:f:2\ncell:H37:l:2:f:2\ncell:I37:t:DATE:b:2::::l:2:f:2:cf:1\ncell:C38:l:2:f:2\ncell:D38:l:2:f:2\ncell:E38:l:2:f:2\ncell:F38:l:2:f:2\ncell:G38:l:2:f:2\ncell:H38:l:2:f:2\ncell:I38:l:2:f:2\ncell:C39:l:1:f:5\ncol:A:w:12\ncol:B:w:10\ncol:C:w:226\ncol:D:w:116\ncol:E:w:80\ncol:F:w:131\ncol:G:w:156\ncol:H:w:137\ncol:I:w:193\nrow:4:h:33\nrow:5:h:33\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:15.75\nrow:37:h:14.25\nrow:39:h:14.25\nsheet:c:9:r:39:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* * arial,helvetica,sans-serif\nfont:2:* 12pt arial,helvetica,sans-serif\nfont:3:* 14pt arial,helvetica,sans-serif\nfont:4:* 16pt arial,helvetica,sans-serif\nfont:5:normal normal 10pt Arial\nfont:6:normal normal 12pt arial,helvetica,sans-serif\nfont:7:normal normal 24pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0.00 ;\"$\"(#,##0.00)\nvalueformat:3:0 \nvalueformat:4:0.00 ;(0.00)\nvalueformat:5:mmmm d, yyyy\nname:DATA_01::C6\nname:DATA_02::C11\nname:DATA_03::D11\\cD22\nname:DATA_04::G11\\cG22\n"},"name":"sheet6","hidden":"1"},"sheet10":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Your Company, Inc.:l:2:f:3:cf:2\ncell:C3:l:1:f:5\ncell:D3:l:1:f:5\ncell:E3:l:1:f:5\ncell:F3:l:1:f:5\ncell:G3:l:1:f:5\ncell:H3:t:SALES QUOTATION:l:2:f:7:cf:3\ncell:B4:t:Name:l:1:f:5\ncell:C4:l:1:f:5\ncell:D4:l:1:f:5\ncell:E4:l:1:f:5:cf:3\ncell:F4:l:1:f:5\ncell:G4:l:1:f:5\ncell:H4:l:1:f:5\ncell:B5:t:Address:l:1:f:5\ncell:C5:l:1:f:5\ncell:D5:l:1:f:5\ncell:E5:l:1:f:5:cf:3\ncell:F5:l:1:f:5\ncell:G5:l:1:f:5\ncell:H5:l:1:f:5\ncell:B6:l:1:f:5\ncell:C6:l:1:f:5\ncell:D6:l:1:f:5\ncell:E6:l:1:f:5:cf:3\ncell:F6:l:1:f:5\ncell:G6:l:1:f:5\ncell:H6:l:1:f:5\ncell:B7:b:::1::l:1:f:5\ncell:C7:b:::1::l:1:f:5\ncell:D7:b:::1::l:1:f:5\ncell:E7:b:::1::l:1:f:5\ncell:F7:l:1:f:5\ncell:G7:l:1:f:5\ncell:H7:l:1:f:5\ncell:A8:b::1:::l:1:f:5\ncell:B8:t:TO\\c:b:1:::1:l:1:f:2\ncell:C8:b:1::::l:1:f:5\ncell:D8:b:1::::l:1:f:5\ncell:E8:b:1:1:::l:1:f:5\ncell:F8:b::::1:l:1:f:5\ncell:G8:l:1:f:5\ncell:H8:l:1:f:5\ncell:A9:b::1:::l:1:f:5\ncell:B9:b::::1:l:1:f:5\ncell:C9:l:1:f:5\ncell:D9:l:1:f:5\ncell:E9:b::1:::l:1:f:5\ncell:F9:b::::1:l:1:f:5\ncell:G9:t:F.O.B. :b::1:::l:1:f:5:cf:3\ncell:H9:b::::1:l:1:f:5\ncell:A10:b::1:::l:1:f:5\ncell:B10:b::::1:l:1:f:5\ncell:C10:l:1:f:5\ncell:D10:l:1:f:5\ncell:E10:b::1:::l:1:f:5\ncell:F10:b::::1:l:1:f:5\ncell:G10:t:TERMS :b::1:::l:1:f:5:cf:3\ncell:H10:b::::1:l:1:f:5\ncell:A11:b::1:::l:1:f:5\ncell:B11:b::::1:l:1:f:5\ncell:C11:l:1:f:5\ncell:D11:l:1:f:5\ncell:E11:b::1:::l:1:f:5\ncell:F11:b::::1:l:1:f:5\ncell:G11:t:DELIVERY :b::1:::l:1:f:5:cf:3\ncell:H11:b::::1:l:1:f:5\ncell:A12:b::1:::l:1:f:5\ncell:B12:b::::1:l:1:f:5\ncell:C12:l:1:f:5\ncell:D12:l:1:f:5\ncell:E12:b::1:::l:1:f:5\ncell:F12:b::::1:l:1:f:5\ncell:G12:t:NUMBER :b::1:::l:1:f:5:cf:3\ncell:H12:b::::1:l:1:f:5:ntvf:4\ncell:A13:b::1:::l:1:f:5\ncell:B13:b:::1:1:l:1:f:5\ncell:C13:b:::1::l:1:f:5\ncell:D13:b:::1::l:1:f:5\ncell:E13:b::1:1::l:1:f:5\ncell:F13:b::::1:l:1:f:5\ncell:G13:l:1:f:5\ncell:H13:l:1:f:5\ncell:B14:b:1::::l:1:f:5\ncell:C14:b:1::::l:1:f:5\ncell:D14:b:1::::l:1:f:5\ncell:E14:b:1::::l:1:f:5\ncell:F14:l:1:f:5\ncell:G14:l:1:f:5\ncell:H14:l:1:f:5\ncell:B15:t:Thank you for your inquiry dated\\c:l:1:f:1\ncell:C15:l:1:f:5\ncell:D15:l:1:f:5\ncell:E15:v:39199:l:1:f:1:cf:2:ntvf:5\ncell:F15:l:1:f:5\ncell:G15:l:1:f:5\ncell:H15:l:1:f:5\ncell:B16:t:We are pleased to quote you the following\\c:l:1:f:1\ncell:C16:l:1:f:5\ncell:D16:l:1:f:5\ncell:E16:l:1:f:5\ncell:F16:l:1:f:5\ncell:G16:l:1:f:5\ncell:H16:l:1:f:5\ncell:B17:b:::1::l:1:f:5\ncell:C17:b:::1::l:1:f:5\ncell:D17:b:::1::l:1:f:5\ncell:E17:b:::1::l:1:f:5\ncell:F17:b:::1::l:1:f:5\ncell:G17:b:::1::l:1:f:5\ncell:H17:b:::1::l:1:f:5\ncell:A18:b::1:::l:1:f:5\ncell:B18:t:ITEM:b:1:1:1:1:l:2:f:4:cf:1\ncell:C18:t:QUANTITY:b:1:1:1:1:l:2:f:4:cf:1\ncell:D18:t:DESCRIPTION:b:1::1:1:l:2:f:4:cf:1\ncell:E18:b:1::1::l:1:f:8:cf:1\ncell:F18:b:1:1:1::l:1:f:8:cf:1\ncell:G18:t:UNIT PRICE :b:1:1:1:1:l:2:f:4:cf:1\ncell:H18:t:DELIVERY DATE:b:1:1:1:1:l:2:f:4:cf:1\ncell:A19:b::1:::l:1:f:5\ncell:B19:v:1:b:1:1::1:l:1:f:5:cf:1:ntvf:3\ncell:C19:b:1:1::1:l:1:f:5:cf:1:ntvf:1\ncell:D19:b:1:::1:l:1:f:5\ncell:E19:b:1::::l:1:f:5\ncell:F19:b:1:1:::l:1:f:5\ncell:G19:b:1:1::1:l:1:f:5:ntvf:2\ncell:H19:b:1:1::1:l:1:f:5:cf:1:ntvf:5\ncell:A20:b::1:::l:1:f:5\ncell:B20:v:2:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C20:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D20:b::::1:l:1:f:5\ncell:E20:l:1:f:5\ncell:F20:b::1:::l:1:f:5\ncell:G20:b::1::1:l:1:f:5\ncell:H20:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A21:b::1:::l:1:f:5\ncell:B21:v:3:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C21:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D21:b::::1:l:1:f:5\ncell:E21:l:1:f:5\ncell:F21:b::1:::l:1:f:5\ncell:G21:b::1::1:l:1:f:5\ncell:H21:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A22:b::1:::l:1:f:5\ncell:B22:v:4:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C22:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D22:b::::1:l:1:f:5\ncell:E22:l:1:f:5\ncell:F22:b::1:::l:1:f:5\ncell:G22:b::1::1:l:1:f:5\ncell:H22:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A23:b::1:::l:1:f:5\ncell:B23:v:5:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C23:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D23:b::::1:l:1:f:5\ncell:E23:l:1:f:5\ncell:F23:b::1:::l:1:f:5\ncell:G23:b::1::1:l:1:f:5\ncell:H23:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A24:b::1:::l:1:f:5\ncell:B24:v:6:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C24:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D24:b::::1:l:1:f:5\ncell:E24:l:1:f:5\ncell:F24:b::1:::l:1:f:5\ncell:G24:b::1::1:l:1:f:5\ncell:H24:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A25:b::1:::l:1:f:5\ncell:B25:v:7:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C25:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D25:b::::1:l:1:f:5\ncell:E25:l:1:f:5\ncell:F25:b::1:::l:1:f:5\ncell:G25:b::1::1:l:1:f:5\ncell:H25:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A26:b::1:::l:1:f:5\ncell:B26:v:8:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C26:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D26:b::::1:l:1:f:5\ncell:E26:l:1:f:5\ncell:F26:b::1:::l:1:f:5\ncell:G26:b::1::1:l:1:f:5\ncell:H26:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A27:b::1:::l:1:f:5\ncell:B27:v:9:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C27:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D27:b::::1:l:1:f:5\ncell:E27:l:1:f:5\ncell:F27:b::1:::l:1:f:5\ncell:G27:b::1::1:l:1:f:5\ncell:H27:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A28:b::1:::l:1:f:5\ncell:B28:v:10:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C28:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D28:b::::1:l:1:f:5\ncell:E28:l:1:f:5\ncell:F28:b::1:::l:1:f:5\ncell:G28:b::1::1:l:1:f:5\ncell:H28:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A29:b::1:::l:1:f:5\ncell:B29:v:11:b::1::1:l:1:f:5:cf:1:ntvf:3\ncell:C29:b::1::1:l:1:f:5:cf:1:ntvf:1\ncell:D29:b::::1:l:1:f:5\ncell:E29:l:1:f:5\ncell:F29:b::1:::l:1:f:5\ncell:G29:b::1::1:l:1:f:5\ncell:H29:b::1::1:l:1:f:5:cf:1:ntvf:5\ncell:A30:b::1:::l:1:f:5\ncell:B30:v:12:b::1:1:1:l:1:f:5:cf:1:ntvf:3\ncell:C30:b::1:1:1:l:1:f:5:cf:1:ntvf:1\ncell:D30:b:::1:1:l:1:f:5\ncell:E30:b:::1::l:1:f:5\ncell:F30:b::1:1::l:1:f:5\ncell:G30:b::1:1:1:l:1:f:5\ncell:H30:b::1:1:1:l:1:f:5:cf:1:ntvf:5\ncell:B31:t:We will be happy to supply any further information you may need and trust that you :b:1::::l:1:f:1\ncell:C31:b:1::::l:1:f:5\ncell:D31:b:1::::l:1:f:5\ncell:E31:b:1::::l:1:f:5\ncell:F31:b:1::::l:1:f:5\ncell:G31:b:1::::l:1:f:5\ncell:H31:b:1::::l:1:f:5\ncell:B32:t:call on us to fill your order, which will receive our prompt and careful attention.:l:1:f:1\ncell:C32:l:1:f:5\ncell:D32:l:1:f:5\ncell:E32:l:1:f:5\ncell:F32:l:1:f:5\ncell:G32:l:1:f:5\ncell:H32:l:1:f:5\ncell:B33:b:::1::l:1:f:6\ncell:C33:b:::1::l:1:f:5\ncell:D33:b:::1::l:1:f:5\ncell:E33:b:::1::l:1:f:5\ncell:F33:l:1:f:5\ncell:G33:l:1:f:5\ncell:H33:b:::1::l:1:f:6:cf:1:ntvf:5\ncell:B34:t:PER:b:1::::l:1:f:8:cf:1\ncell:C34:b:1::::l:1:f:5:cf:1\ncell:D34:b:1::::l:1:f:5:cf:1\ncell:E34:b:1::::l:1:f:5:cf:1\ncell:F34:l:1:f:5\ncell:G34:l:1:f:5\ncell:H34:t:DATE:b:1::::l:1:f:8:cf:1\ncell:B36:l:1:f:5\ncol:A:w:12\ncol:B:w:292\ncol:C:w:100\ncol:D:w:80\ncol:E:w:131\ncol:F:w:156\ncol:G:w:90\ncol:H:w:374\nrow:3:h:33\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:15.75\nrow:34:h:14.25\nrow:36:h:14.25\nsheet:c:8:r:36:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\nfont:1:italic normal 10pt Arial\nfont:2:normal bold 10pt Arial\nfont:3:normal bold 18pt Arial\nfont:4:normal bold 8pt Arial\nfont:5:normal normal 10pt Arial\nfont:6:normal normal 12pt Arial\nfont:7:normal normal 26pt Times New Roman\nfont:8:normal normal 8pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0.00 ;\"$\"(#,##0.00)\nvalueformat:3:0 \nvalueformat:4:0.00 ;(0.00)\nvalueformat:5:mmmm d, yyyy\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet601","hidden":"1"},"sheet11":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Promotion Expenditures by Quarter:l:2:f:5:c:3:bg:1:cf:1:colspan:6\ncell:D3:l:2:f:1:cf:1\ncell:E3:l:2:f:1:cf:1\ncell:F3:l:2:f:1:cf:1\ncell:G3:l:2:f:1:cf:1\ncell:H3:l:2:f:1:cf:1\ncell:C4:t:For the Year 2009:l:1:f:3:cf:1\ncell:D4:l:1:f:1:cf:1\ncell:E4:l:1:f:1:cf:1\ncell:F4:l:1:f:1:cf:1\ncell:G4:l:1:f:1:cf:1\ncell:H4:l:1:f:1:cf:1\ncell:D5:l:1:f:1:cf:1\ncell:E5:l:1:f:1:cf:1\ncell:F5:l:1:f:1:cf:1\ncell:G5:l:1:f:1:cf:1\ncell:H5:l:1:f:1:cf:1\ncell:C6:l:1:f:1\ncell:D6:l:1:f:1\ncell:E6:l:1:f:1\ncell:F6:l:1:f:1\ncell:G6:l:1:f:1\ncell:H6:l:1:f:1\ncell:C7:l:1:f:1:cf:2\ncell:D7:t:Q1:l:1:f:4:cf:1\ncell:E7:t:Q2:l:1:f:4:cf:1\ncell:F7:t:Q3:l:1:f:4:cf:1\ncell:G7:t:Q4:l:1:f:4:cf:1\ncell:H7:t:Total:l:1:f:4:cf:1\ncell:C8:t:Trade Promotions to Distributors:l:1:f:4:cf:2\ncell:D8:l:1:f:1\ncell:E8:l:1:f:1\ncell:F8:l:1:f:1\ncell:G8:l:1:f:1\ncell:H8:l:1:f:1\ncell:C9:t:Promotion:l:1:f:2:cf:2\ncell:D9:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:E9:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:F9:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:G9:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:H9:vtf:n:4:IF(SUM(D9\\cG9),SUM(D9\\cG9),\"\"):l:1:f:3:ntvf:2\ncell:C10:t:Promotion:l:1:f:2:bg:2:cf:2\ncell:D10:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E10:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F10:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G10:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H10:vtf:n:4:IF(SUM(D10\\cG10),SUM(D10\\cG10),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C11:t:Promotion:l:1:f:2:cf:2\ncell:D11:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:E11:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:F11:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:G11:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:H11:vtf:n:4:IF(SUM(D11\\cG11),SUM(D11\\cG11),\"\"):l:1:f:3:ntvf:1\ncell:C12:t:Promotion:l:1:f:2:bg:2:cf:2\ncell:D12:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E12:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F12:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G12:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H12:vtf:n:4:IF(SUM(D12\\cG12),SUM(D12\\cG12),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C13:t:Totals:l:1:f:3:cf:2\ncell:D13:vtf:n:4:IF(SUM(D9\\cD12),SUM(D9\\cD12),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:E13:vtf:n:4:IF(SUM(E9\\cE12),SUM(E9\\cE12),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:F13:vtf:n:4:IF(SUM(F9\\cF12),SUM(F9\\cF12),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:G13:vtf:n:4:IF(SUM(G9\\cG12),SUM(G9\\cG12),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:H13:vtf:n:16:IF(SUM(H9\\cH12),SUM(H9\\cH12),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:C14:l:1:f:1:cf:2\ncell:D14:l:1:f:1:ntvf:2\ncell:E14:l:1:f:1:ntvf:2\ncell:F14:l:1:f:1:ntvf:2\ncell:G14:l:1:f:1:ntvf:2\ncell:H14:l:1:f:3:ntvf:2\ncell:C15:t:Trade Shows:l:1:f:4:cf:2\ncell:D15:l:1:f:1:ntvf:2\ncell:E15:l:1:f:1:ntvf:2\ncell:F15:l:1:f:1:ntvf:2\ncell:G15:l:1:f:1:ntvf:2\ncell:H15:l:1:f:3:ntvf:2\ncell:C16:t:Promotion:l:1:f:2:cf:2\ncell:D16:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:E16:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:F16:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:G16:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:H16:vtf:n:4:IF(SUM(D16\\cG16),SUM(D16\\cG16),\"\"):l:1:f:3:ntvf:2\ncell:C17:t:Promotion:l:1:f:2:bg:2:cf:2\ncell:D17:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E17:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F17:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G17:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H17:vtf:n:4:IF(SUM(D17\\cG17),SUM(D17\\cG17),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C18:t:Promotion:l:1:f:2:cf:2\ncell:D18:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:E18:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:F18:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:G18:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:H18:vtf:n:4:IF(SUM(D18\\cG18),SUM(D18\\cG18),\"\"):l:1:f:3:ntvf:1\ncell:C19:t:Promotion:l:1:f:2:bg:2:cf:2\ncell:D19:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E19:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F19:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G19:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H19:vtf:n:4:IF(SUM(D19\\cG19),SUM(D19\\cG19),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C20:t:Totals:l:1:f:3:cf:2\ncell:D20:vtf:n:4:IF(SUM(D16\\cD19),SUM(D16\\cD19),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:E20:vtf:n:4:IF(SUM(E16\\cE19),SUM(E16\\cE19),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:F20:vtf:n:4:IF(SUM(F16\\cF19),SUM(F16\\cF19),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:G20:vtf:n:4:IF(SUM(G16\\cG19),SUM(G16\\cG19),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:H20:vtf:n:16:IF(SUM(H16\\cH19),SUM(H16\\cH19),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:C21:l:1:f:1:cf:2\ncell:D21:l:1:f:1:ntvf:2\ncell:E21:l:1:f:1:ntvf:2\ncell:F21:l:1:f:1:ntvf:2\ncell:G21:l:1:f:1:ntvf:2\ncell:H21:l:1:f:3:ntvf:2\ncell:C22:t:Sales Force Promotion:l:1:f:4:cf:2\ncell:D22:l:1:f:1:ntvf:2\ncell:E22:l:1:f:1:ntvf:2\ncell:F22:l:1:f:1:ntvf:2\ncell:G22:l:1:f:1:ntvf:2\ncell:H22:l:1:f:3:ntvf:2\ncell:C23:t:Promotion:l:1:f:2:cf:2\ncell:D23:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:E23:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:F23:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:G23:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:H23:vtf:n:4:IF(SUM(D23\\cG23),SUM(D23\\cG23),\"\"):l:1:f:3:ntvf:2\ncell:C24:t:Promotion:l:1:f:2:bg:2:cf:2\ncell:D24:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E24:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F24:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G24:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H24:vtf:n:4:IF(SUM(D24\\cG24),SUM(D24\\cG24),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C25:t:Promotion:l:1:f:2:cf:2\ncell:D25:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:E25:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:F25:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:G25:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:H25:vtf:n:4:IF(SUM(D25\\cG25),SUM(D25\\cG25),\"\"):l:1:f:3:ntvf:1\ncell:C26:t:Promotion:l:1:f:2:bg:2:cf:2\ncell:D26:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E26:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F26:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G26:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H26:vtf:n:4:IF(SUM(D26\\cG26),SUM(D26\\cG26),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C27:t:Totals:l:1:f:3:cf:2\ncell:D27:vtf:n:4:IF(SUM(D23\\cD26),SUM(D23\\cD26),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:E27:vtf:n:4:IF(SUM(E23\\cE26),SUM(E23\\cE26),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:F27:vtf:n:4:IF(SUM(F23\\cF26),SUM(F23\\cF26),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:G27:vtf:n:4:IF(SUM(G23\\cG26),SUM(G23\\cG26),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:H27:vtf:n:16:IF(SUM(H23\\cH26),SUM(H23\\cH26),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:C28:l:1:f:1:cf:2\ncell:D28:l:1:f:1:ntvf:2\ncell:E28:l:1:f:1:ntvf:2\ncell:F28:l:1:f:1:ntvf:2\ncell:G28:l:1:f:1:ntvf:2\ncell:H28:l:1:f:3:ntvf:2\ncell:C29:t:Other Promotions:l:1:f:4:cf:2\ncell:D29:l:1:f:1:ntvf:2\ncell:E29:l:1:f:1:ntvf:2\ncell:F29:l:1:f:1:ntvf:2\ncell:G29:l:1:f:1:ntvf:2\ncell:H29:l:1:f:3:ntvf:2\ncell:C30:t:Promotion:l:1:f:2:cf:2\ncell:D30:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:E30:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:F30:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:G30:v:1:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:H30:vtf:n:4:IF(SUM(D30\\cG30),SUM(D30\\cG30),\"\"):l:1:f:3:ntvf:2\ncell:C31:l:1:f:2:bg:2:cf:2\ncell:D31:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E31:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F31:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G31:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H31:vtf:n:4:IF(SUM(D31\\cG31),SUM(D31\\cG31),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C32:l:1:f:2:cf:2\ncell:D32:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:E32:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:F32:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:G32:v:1:b:1:1:1:1:l:1:f:2:ntvf:1\ncell:H32:vtf:n:4:IF(SUM(D32\\cG32),SUM(D32\\cG32),\"\"):l:1:f:3:ntvf:1\ncell:C33:l:1:f:2:bg:2:cf:2\ncell:D33:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:E33:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:F33:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:G33:v:1:b:1:1:1:1:l:1:f:2:bg:2:ntvf:1\ncell:H33:vtf:n:4:IF(SUM(D33\\cG33),SUM(D33\\cG33),\"\"):l:1:f:3:bg:2:ntvf:1\ncell:C34:t:Totals:l:1:f:3:cf:2\ncell:D34:vtf:n:4:IF(SUM(D30\\cD33),SUM(D30\\cD33),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:E34:vtf:n:4:IF(SUM(E30\\cE33),SUM(E30\\cE33),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:F34:vtf:n:4:IF(SUM(F30\\cF33),SUM(F30\\cF33),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:G34:vtf:n:4:IF(SUM(G30\\cG33),SUM(G30\\cG33),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:H34:vtf:n:16:IF(SUM(H30\\cH33),SUM(H30\\cH33),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:C35:l:1:f:1:cf:2\ncell:D35:l:1:f:1:ntvf:2\ncell:E35:l:1:f:1:ntvf:2\ncell:F35:l:1:f:1:ntvf:2\ncell:G35:l:1:f:1:ntvf:2\ncell:H35:l:1:f:3:ntvf:2\ncell:C36:t:Total Promotion Budget:l:1:f:3:cf:2\ncell:D36:vtf:n:16:IF(SUM(D13,D20,D27,D34),SUM(D13,D20,D27,D34),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:E36:vtf:n:16:IF(SUM(E13,E20,E27,E34),SUM(E13,E20,E27,E34),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:F36:vtf:n:16:IF(SUM(F13,F20,F27,F34),SUM(F13,F20,F27,F34),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:G36:vtf:n:16:IF(SUM(G13,G20,G27,G34),SUM(G13,G20,G27,G34),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:H36:vtf:n:64:IF(SUM(H13,H20,H27,H34),SUM(H13,H20,H27,H34),\"\"):b:1::1::l:1:f:3:ntvf:2\ncell:C37:cf:2\ncell:D37:l:1:f:1\ncell:E37:l:1:f:1\ncell:F37:l:1:f:1\ncell:G37:l:1:f:1\ncell:H37:l:1:f:1\ncell:C38:l:1:f:1:cf:2\ncell:C39:cf:2\ncell:C40:cf:2\ncol:A:w:10\ncol:B:w:10\ncol:C:w:315\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\ncol:H:w:118\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:15.75\nrow:22:h:15.75\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nsheet:c:8:r:40:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal normal 10pt Arial\nfont:2:normal normal 12pt Arial\nfont:3:normal normal 14pt Arial\nfont:4:normal normal 16pt Arial\nfont:5:normal normal 26pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nname:DATA_01::C4\nname:DATA_02::C9\nname:DATA_03::#REF!\\c#REF!\nname:DATA_04::F9\\cF22\n"},"name":"sheet7","hidden":"1"},"sheet12":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Sales Promotion Expenditures by Quarter:l:2:f:4:cf:2\ncell:C3:l:2:f:5:cf:1\ncell:D3:l:2:f:5:cf:1\ncell:E3:l:2:f:5:cf:1\ncell:F3:l:2:f:5:cf:1\ncell:G3:l:2:f:5:cf:1\ncell:H3:l:2:f:5:cf:1\ncell:B4:t:For the Year 2009:l:1:f:3:cf:1\ncell:C4:l:1:f:5:cf:1\ncell:D4:l:1:f:5:cf:1\ncell:E4:l:1:f:5:cf:1\ncell:F4:l:1:f:5:cf:1\ncell:G4:l:1:f:5:cf:1\ncell:H4:l:1:f:5:cf:1\ncell:C5:l:1:f:5:cf:1\ncell:D5:l:1:f:5:cf:1\ncell:E5:l:1:f:5:cf:1\ncell:F5:l:1:f:5:cf:1\ncell:G5:l:1:f:5:cf:1\ncell:H5:l:1:f:5:cf:1\ncell:B6:l:1:f:5\ncell:C6:l:1:f:5\ncell:D6:l:1:f:5\ncell:E6:l:1:f:5\ncell:F6:l:1:f:5\ncell:G6:l:1:f:5\ncell:H6:l:1:f:5\ncell:B7:l:1:f:5\ncell:C7:l:1:f:5\ncell:D7:t:Q1:b:::1::l:1:f:2:cf:1\ncell:E7:vtf:e:Unknown function FIXED. :LEFT(D7,(LEN(D7)-1))&FIXED(CHOOSE(VALUE(RIGHT(D7,1)),2,3,4,1),0,TRUE):e:Unknown function FIXED. :b:::1::l:1:f:2:cf:1\ncell:F7:vtf:e:0:LEFT(E7,(LEN(E7)-1))&FIXED(CHOOSE(VALUE(RIGHT(E7,1)),2,3,4,1),0,TRUE):e:Unknown function FIXED. :b:::1::l:1:f:2:cf:1\ncell:G7:vtf:e:0:LEFT(F7,(LEN(F7)-1))&FIXED(CHOOSE(VALUE(RIGHT(F7,1)),2,3,4,1),0,TRUE):e:Unknown function FIXED. :b:::1::l:1:f:2:cf:1\ncell:H7:t:Total:b:::1::l:1:f:2:cf:1\ncell:B8:t:Trade Promotions to Distributors:l:1:f:2\ncell:C8:l:1:f:5\ncell:D8:b:1::::l:1:f:5\ncell:E8:b:1::::l:1:f:5\ncell:F8:b:1::::l:1:f:5\ncell:G8:b:1::::l:1:f:5\ncell:H8:b:1::::l:1:f:5\ncell:B9:l:1:f:5\ncell:C9:t:Promotion:l:1:f:5\ncell:D9:v:3000:l:1:f:5:ntvf:2\ncell:E9:v:3000:l:1:f:5:ntvf:2\ncell:F9:v:3000:l:1:f:5:ntvf:2\ncell:G9:v:3000:l:1:f:5:ntvf:2\ncell:H9:vtf:n:12000:IF(SUM(D9\\cG9),SUM(D9\\cG9),\"\"):l:1:f:5:ntvf:2\ncell:B10:l:1:f:5\ncell:C10:t:Promotion:l:1:f:5\ncell:D10:v:2000:l:1:f:5:ntvf:1\ncell:E10:v:2000:l:1:f:5:ntvf:1\ncell:F10:v:2000:l:1:f:5:ntvf:1\ncell:G10:v:2000:l:1:f:5:ntvf:1\ncell:H10:vtf:n:8000:IF(SUM(D10\\cG10),SUM(D10\\cG10),\"\"):l:1:f:5:ntvf:1\ncell:B11:l:1:f:5\ncell:C11:t:Promotion:l:1:f:5\ncell:D11:v:2500:l:1:f:5:ntvf:1\ncell:E11:v:2500:l:1:f:5:ntvf:1\ncell:F11:v:2500:l:1:f:5:ntvf:1\ncell:G11:v:2500:l:1:f:5:ntvf:1\ncell:H11:vtf:n:10000:IF(SUM(D11\\cG11),SUM(D11\\cG11),\"\"):l:1:f:5:ntvf:1\ncell:B12:l:1:f:5\ncell:C12:t:Promotion:l:1:f:5\ncell:D12:v:1000:b:::1::l:1:f:5:ntvf:1\ncell:E12:v:1000:b:::1::l:1:f:5:ntvf:1\ncell:F12:v:1000:b:::1::l:1:f:5:ntvf:1\ncell:G12:v:1000:b:::1::l:1:f:5:ntvf:1\ncell:H12:vtf:n:4000:IF(SUM(D12\\cG12),SUM(D12\\cG12),\"\"):b:::1::l:1:f:5:ntvf:1\ncell:B13:l:1:f:5\ncell:C13:t:Totals:l:1:f:5\ncell:D13:vtf:n:8500:IF(SUM(D9\\cD12),SUM(D9\\cD12),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:E13:vtf:n:8500:IF(SUM(E9\\cE12),SUM(E9\\cE12),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:F13:vtf:n:8500:IF(SUM(F9\\cF12),SUM(F9\\cF12),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:G13:vtf:n:8500:IF(SUM(G9\\cG12),SUM(G9\\cG12),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:H13:vtf:n:34000:IF(SUM(H9\\cH12),SUM(H9\\cH12),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:B14:t:Trade Shows:l:1:f:2\ncell:C14:l:1:f:5\ncell:D14:l:1:f:5:ntvf:2\ncell:E14:l:1:f:5:ntvf:2\ncell:F14:l:1:f:5:ntvf:2\ncell:G14:l:1:f:5:ntvf:2\ncell:H14:l:1:f:5:ntvf:2\ncell:B15:l:1:f:5\ncell:C15:t:Promotion:l:1:f:5\ncell:D15:v:1000:l:1:f:5:ntvf:2\ncell:E15:v:1000:l:1:f:5:ntvf:2\ncell:F15:v:1000:l:1:f:5:ntvf:2\ncell:G15:v:1000:l:1:f:5:ntvf:2\ncell:H15:vtf:n:4000:IF(SUM(D15\\cG15),SUM(D15\\cG15),\"\"):l:1:f:5:ntvf:2\ncell:B16:l:1:f:5\ncell:C16:t:Promotion:l:1:f:5\ncell:D16:v:2000:l:1:f:5:ntvf:1\ncell:E16:v:2000:l:1:f:5:ntvf:1\ncell:F16:v:2000:l:1:f:5:ntvf:1\ncell:G16:v:2000:l:1:f:5:ntvf:1\ncell:H16:vtf:n:8000:IF(SUM(D16\\cG16),SUM(D16\\cG16),\"\"):l:1:f:5:ntvf:1\ncell:B17:l:1:f:5\ncell:C17:t:Promotion:l:1:f:5\ncell:D17:v:2000:l:1:f:5:ntvf:1\ncell:E17:v:2000:l:1:f:5:ntvf:1\ncell:F17:v:2000:l:1:f:5:ntvf:1\ncell:G17:v:2000:l:1:f:5:ntvf:1\ncell:H17:vtf:n:8000:IF(SUM(D17\\cG17),SUM(D17\\cG17),\"\"):l:1:f:5:ntvf:1\ncell:B18:l:1:f:5\ncell:C18:t:Promotion:l:1:f:5\ncell:D18:v:3000:b:::1::l:1:f:5:ntvf:1\ncell:E18:v:3000:b:::1::l:1:f:5:ntvf:1\ncell:F18:v:3000:b:::1::l:1:f:5:ntvf:1\ncell:G18:v:3000:b:::1::l:1:f:5:ntvf:1\ncell:H18:vtf:n:12000:IF(SUM(D18\\cG18),SUM(D18\\cG18),\"\"):b:::1::l:1:f:5:ntvf:1\ncell:B19:l:1:f:5\ncell:C19:t:Totals:l:1:f:5\ncell:D19:vtf:n:8000:IF(SUM(D15\\cD18),SUM(D15\\cD18),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:E19:vtf:n:8000:IF(SUM(E15\\cE18),SUM(E15\\cE18),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:F19:vtf:n:8000:IF(SUM(F15\\cF18),SUM(F15\\cF18),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:G19:vtf:n:8000:IF(SUM(G15\\cG18),SUM(G15\\cG18),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:H19:vtf:n:32000:IF(SUM(H15\\cH18),SUM(H15\\cH18),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:B20:t:Sales Force Promotion:l:1:f:2\ncell:C20:l:1:f:5\ncell:D20:l:1:f:5:ntvf:2\ncell:E20:l:1:f:5:ntvf:2\ncell:F20:l:1:f:5:ntvf:2\ncell:G20:l:1:f:5:ntvf:2\ncell:H20:l:1:f:5:ntvf:2\ncell:B21:l:1:f:5\ncell:C21:t:Promotion:l:1:f:5\ncell:D21:v:100:l:1:f:5:ntvf:2\ncell:E21:v:100:l:1:f:5:ntvf:2\ncell:F21:v:100:l:1:f:5:ntvf:2\ncell:G21:v:100:l:1:f:5:ntvf:2\ncell:H21:vtf:n:400:IF(SUM(D21\\cG21),SUM(D21\\cG21),\"\"):l:1:f:5:ntvf:2\ncell:B22:l:1:f:5\ncell:C22:t:Promotion:l:1:f:5\ncell:D22:v:500:l:1:f:5:ntvf:1\ncell:E22:v:500:l:1:f:5:ntvf:1\ncell:F22:v:500:l:1:f:5:ntvf:1\ncell:G22:v:500:l:1:f:5:ntvf:1\ncell:H22:vtf:n:2000:IF(SUM(D22\\cG22),SUM(D22\\cG22),\"\"):l:1:f:5:ntvf:1\ncell:B23:l:1:f:5\ncell:C23:t:Promotion:l:1:f:5\ncell:D23:v:20000:l:1:f:5:ntvf:1\ncell:E23:v:20000:l:1:f:5:ntvf:1\ncell:F23:v:20000:l:1:f:5:ntvf:1\ncell:G23:v:20000:l:1:f:5:ntvf:1\ncell:H23:vtf:n:80000:IF(SUM(D23\\cG23),SUM(D23\\cG23),\"\"):l:1:f:5:ntvf:1\ncell:B24:l:1:f:5\ncell:C24:t:Promotion:l:1:f:5\ncell:D24:v:100000:b:::1::l:1:f:5:ntvf:1\ncell:E24:v:100000:b:::1::l:1:f:5:ntvf:1\ncell:F24:v:100000:b:::1::l:1:f:5:ntvf:1\ncell:G24:v:100000:b:::1::l:1:f:5:ntvf:1\ncell:H24:vtf:n:400000:IF(SUM(D24\\cG24),SUM(D24\\cG24),\"\"):b:::1::l:1:f:5:ntvf:1\ncell:B25:l:1:f:5\ncell:C25:t:Totals:l:1:f:5\ncell:D25:vtf:n:120600:IF(SUM(D21\\cD24),SUM(D21\\cD24),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:E25:vtf:n:120600:IF(SUM(E21\\cE24),SUM(E21\\cE24),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:F25:vtf:n:120600:IF(SUM(F21\\cF24),SUM(F21\\cF24),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:G25:vtf:n:120600:IF(SUM(G21\\cG24),SUM(G21\\cG24),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:H25:vtf:n:482400:IF(SUM(H21\\cH24),SUM(H21\\cH24),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:B26:t:Other Promotions:l:1:f:2\ncell:C26:l:1:f:5\ncell:D26:l:1:f:5:ntvf:2\ncell:E26:l:1:f:5:ntvf:2\ncell:F26:l:1:f:5:ntvf:2\ncell:G26:l:1:f:5:ntvf:2\ncell:H26:l:1:f:5:ntvf:2\ncell:B27:l:1:f:5\ncell:C27:t:Promotion:l:1:f:5\ncell:D27:v:2500:l:1:f:5:ntvf:2\ncell:E27:v:2500:l:1:f:5:ntvf:2\ncell:F27:v:2500:l:1:f:5:ntvf:2\ncell:G27:v:2500:l:1:f:5:ntvf:2\ncell:H27:vtf:n:10000:IF(SUM(D27\\cG27),SUM(D27\\cG27),\"\"):l:1:f:5:ntvf:2\ncell:B28:l:1:f:5\ncell:C28:l:1:f:5\ncell:D28:l:1:f:5:ntvf:1\ncell:E28:l:1:f:5:ntvf:1\ncell:F28:l:1:f:5:ntvf:1\ncell:G28:l:1:f:5:ntvf:1\ncell:H28:vtf:t::IF(SUM(D28\\cG28),SUM(D28\\cG28),\"\"):l:1:f:5:ntvf:1\ncell:B29:l:1:f:5\ncell:C29:l:1:f:5\ncell:D29:l:1:f:5:ntvf:1\ncell:E29:l:1:f:5:ntvf:1\ncell:F29:l:1:f:5:ntvf:1\ncell:G29:l:1:f:5:ntvf:1\ncell:H29:vtf:t::IF(SUM(D29\\cG29),SUM(D29\\cG29),\"\"):l:1:f:5:ntvf:1\ncell:B30:l:1:f:5\ncell:C30:b:::1::l:1:f:5\ncell:D30:b:::1::l:1:f:5:ntvf:1\ncell:E30:b:::1::l:1:f:5:ntvf:1\ncell:F30:b:::1::l:1:f:5:ntvf:1\ncell:G30:b:::1::l:1:f:5:ntvf:1\ncell:H30:vtf:t::IF(SUM(D30\\cG30),SUM(D30\\cG30),\"\"):b:::1::l:1:f:5:ntvf:1\ncell:B31:l:1:f:5\ncell:C31:t:Totals:b:1::::l:1:f:5\ncell:D31:vtf:n:2500:IF(SUM(D27\\cD30),SUM(D27\\cD30),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:E31:vtf:n:2500:IF(SUM(E27\\cE30),SUM(E27\\cE30),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:F31:vtf:n:2500:IF(SUM(F27\\cF30),SUM(F27\\cF30),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:G31:vtf:n:2500:IF(SUM(G27\\cG30),SUM(G27\\cG30),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:H31:vtf:n:10000:IF(SUM(H27\\cH30),SUM(H27\\cH30),\"\"):b:1::::l:1:f:5:ntvf:2\ncell:B32:t:Total Promotion Budget:l:1:f:1\ncell:C32:l:1:f:1\ncell:D32:vtf:n:139600:IF(SUM(D13,D19,D25,D31),SUM(D13,D19,D25,D31),\"\"):b:::1::l:1:f:1:ntvf:2\ncell:E32:vtf:n:139600:IF(SUM(E13,E19,E25,E31),SUM(E13,E19,E25,E31),\"\"):b:::1::l:1:f:1:ntvf:2\ncell:F32:vtf:n:139600:IF(SUM(F13,F19,F25,F31),SUM(F13,F19,F25,F31),\"\"):b:::1::l:1:f:1:ntvf:2\ncell:G32:vtf:n:139600:IF(SUM(G13,G19,G25,G31),SUM(G13,G19,G25,G31),\"\"):b:::1::l:1:f:1:ntvf:2\ncell:H32:vtf:n:558400:IF(SUM(H13,H19,H25,H31),SUM(H13,H19,H25,H31),\"\"):b:::1::l:1:f:1:ntvf:2\ncell:D33:b:1::::l:1:f:5\ncell:E33:b:1::::l:1:f:5\ncell:F33:b:1::::l:1:f:5\ncell:G33:b:1::::l:1:f:5\ncell:H33:b:1::::l:1:f:5\ncell:B34:l:1:f:5\ncol:B:w:729\ncol:C:w:325\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\ncol:H:w:118\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:15.75\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:15.75\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:15.75\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nsheet:c:8:r:34:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:normal bold 10pt Arial\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 14pt Arial\nfont:4:normal bold 26pt Arial\nfont:5:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet701","hidden":"1"},"sheet13":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Sales Activity Report:l:2:f:3:cf:2\ncell:C3:l:2:f:5:cf:1\ncell:D3:l:2:f:5:cf:1\ncell:E3:l:2:f:5:cf:1\ncell:F3:l:2:f:5:cf:1\ncell:G3:l:2:f:5:cf:1\ncell:B4:t:For December 2009:l:1:f:2:cf:1\ncell:C4:l:1:f:5:cf:1\ncell:D4:l:1:f:5:cf:1\ncell:E4:l:1:f:5:cf:1\ncell:F4:l:1:f:5:cf:1\ncell:G4:l:1:f:5:cf:1\ncell:B5:l:1:f:5\ncell:C5:l:1:f:5\ncell:D5:l:1:f:5\ncell:E5:l:1:f:5\ncell:F5:l:1:f:5\ncell:G5:l:1:f:5\ncell:C6:l:1:f:5\ncell:D6:l:1:f:5\ncell:E6:l:1:f:5\ncell:F6:l:1:f:5\ncell:G6:l:1:f:5\ncell:B7:t:Salesperson:l:1:f:5:cf:2\ncell:C7:l:1:f:5\ncell:D7:b:::1::l:1:f:5:cf:2\ncell:E7:b:::1::l:1:f:5\ncell:F7:l:1:f:5\ncell:G7:l:1:f:5\ncell:B8:t:Territory :l:1:f:5:cf:2\ncell:C8:l:1:f:5\ncell:D8:b:1::1::l:1:f:5:cf:2\ncell:E8:b:1::1::l:1:f:5\ncell:F8:t:Date :l:1:f:5:cf:3\ncell:G8:b:::1::l:1:f:5:cf:1:ntvf:6\ncell:B9:l:1:f:5\ncell:C9:l:1:f:5\ncell:D9:b:1::::l:1:f:5\ncell:E9:b:1::::l:1:f:5\ncell:F9:l:1:f:5\ncell:G9:b:1::::l:1:f:5\ncell:B10:b:::1::l:1:f:5\ncell:C10:b:::1::l:1:f:5\ncell:D10:b:::1::l:1:f:5\ncell:E10:b:::1::l:1:f:5\ncell:F10:b:::1::l:1:f:5\ncell:G10:b:::1::l:1:f:5\ncell:A11:b::1:::l:1:f:4\ncell:B11:b:1::1:1:l:1:f:5\ncell:C11:b:1::1::l:1:f:5\ncell:D11:b:1::1::l:1:f:5\ncell:E11:b:1:1:1::l:1:f:5\ncell:F11:t:FORECAST :b:1:1:1:1:l:1:f:1:cf:3\ncell:G11:t:ACTUAL :b:1:1:1:1:l:1:f:1:cf:3\ncell:A12:b::1:::l:1:f:4\ncell:B12:t:Gross Sales:b:1::1:1:l:1:f:5:cf:2\ncell:C12:b:1::1::l:1:f:5\ncell:D12:b:1::1::l:1:f:5\ncell:E12:b:1:1:1::l:1:f:5\ncell:F12:v:100000:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:G12:v:180000:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:A13:b::1:::l:1:f:4\ncell:B13:t:Gross Profit:b:1::1:1:l:1:f:5:cf:2\ncell:C13:b:1::1::l:1:f:5\ncell:D13:b:1::1::l:1:f:5\ncell:E13:b:1:1:1::l:1:f:5\ncell:F13:v:25000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G13:v:50000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A14:b::1:::l:1:f:4\ncell:B14:t:% Gross Profit to Gross Sales:b:1::1:1:l:1:f:5:cf:2\ncell:C14:b:1::1::l:1:f:5\ncell:D14:b:1::1::l:1:f:5\ncell:E14:b:1:1:1::l:1:f:5\ncell:F14:vtf:n:0.25:IF(F12,(F13/F12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:G14:vtf:n:0.2777777777777778:IF(G12,(G13/G12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:A15:b::1:::l:1:f:4\ncell:B15:t:Net Profit:b:1::1:1:l:1:f:5:cf:2\ncell:C15:b:1::1::l:1:f:5\ncell:D15:b:1::1::l:1:f:5\ncell:E15:b:1:1:1::l:1:f:5\ncell:F15:v:15000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G15:v:24000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A16:b::1:::l:1:f:4\ncell:B16:t:% Net Profit to Gross Sales:b:1::1:1:l:1:f:5:cf:2\ncell:C16:b:1::1::l:1:f:5\ncell:D16:b:1::1::l:1:f:5\ncell:E16:b:1:1:1::l:1:f:5\ncell:F16:vtf:n:0.15:IF(F12,(F15/F12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:G16:vtf:n:0.13333333333333333:IF(G12,(G15/G12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:A17:b::1:::l:1:f:4\ncell:B17:t:Salary:b:1::1:1:l:1:f:5:cf:2\ncell:C17:b:1::1::l:1:f:5\ncell:D17:b:1::1::l:1:f:5\ncell:E17:b:1:1:1::l:1:f:5\ncell:F17:v:7000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G17:v:7000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A18:b::1:::l:1:f:4\ncell:B18:t:Commission:b:1::1:1:l:1:f:5:cf:2\ncell:C18:b:1::1::l:1:f:5\ncell:D18:b:1::1::l:1:f:5\ncell:E18:b:1:1:1::l:1:f:5\ncell:F18:v:3500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G18:v:4000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A19:b::1:::l:1:f:4\ncell:B19:t:Expense\\c:b:1::1:1:l:1:f:5:cf:2\ncell:C19:b:1::1::l:1:f:5:cf:2\ncell:D19:t:Auto:b:1::1::l:1:f:5:cf:2\ncell:E19:b:1:1:1::l:1:f:5\ncell:F19:v:1000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G19:v:1100:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A20:b::1:::l:1:f:4\ncell:B20:b:1::1:1:l:1:f:5\ncell:C20:b:1::1::l:1:f:5:cf:2\ncell:D20:t:Travel:b:1::1::l:1:f:5:cf:2\ncell:E20:b:1:1:1::l:1:f:5\ncell:F20:v:500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G20:v:600:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A21:b::1:::l:1:f:4\ncell:B21:b:1::1:1:l:1:f:5\ncell:C21:b:1::1::l:1:f:5:cf:2\ncell:D21:t:Entertainment:b:1::1::l:1:f:5:cf:2\ncell:E21:b:1:1:1::l:1:f:5\ncell:F21:v:1000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G21:v:1200:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A22:b::1:::l:1:f:4\ncell:B22:b:1::1:1:l:1:f:5\ncell:C22:b:1::1::l:1:f:5:cf:2\ncell:D22:t:Other:b:1::1::l:1:f:5:cf:2\ncell:E22:b:1:1:1::l:1:f:5\ncell:F22:v:100:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G22:v:500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A23:b::1:::l:1:f:4\ncell:B23:t:Total Days Worked:b:1::1:1:l:1:f:5:cf:2\ncell:C23:b:1::1::l:1:f:5\ncell:D23:b:1::1::l:1:f:5\ncell:E23:b:1:1:1::l:1:f:5\ncell:F23:v:22:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:G23:v:21:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:A24:b::1:::l:1:f:4\ncell:B24:t:Number of Calls Made:b:1::1:1:l:1:f:5:cf:2\ncell:C24:b:1::1::l:1:f:5\ncell:D24:b:1::1::l:1:f:5\ncell:E24:b:1:1:1::l:1:f:5\ncell:F24:v:100:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G24:v:110:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A25:b::1:::l:1:f:4\ncell:B25:t:Average Calls Per Day:b:1::1:1:l:1:f:5:cf:2\ncell:C25:b:1::1::l:1:f:5\ncell:D25:b:1::1::l:1:f:5\ncell:E25:b:1:1:1::l:1:f:5\ncell:F25:vtf:n:4.545454545454546:IF(F23,(F24/F23),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:G25:vtf:n:5.238095238095238:IF(G23,(G24/G23),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A26:b::1:::l:1:f:4\ncell:B26:t:Number of New Accounts:b:1::1:1:l:1:f:5:cf:2\ncell:C26:b:1::1::l:1:f:5\ncell:D26:b:1::1::l:1:f:5\ncell:E26:b:1:1:1::l:1:f:5\ncell:F26:v:10:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G26:v:12:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A27:b::1:::l:1:f:4\ncell:B27:t:Number of Accounts Lost:b:1::1:1:l:1:f:5:cf:2\ncell:C27:b:1::1::l:1:f:5\ncell:D27:b:1::1::l:1:f:5\ncell:E27:b:1:1:1::l:1:f:5\ncell:F27:v:3:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G27:v:4:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A28:b::1:::l:1:f:4\ncell:B28:t:Number of Accounts at Period End:b:1::1:1:l:1:f:5:cf:2\ncell:C28:b:1::1::l:1:f:5\ncell:D28:b:1::1::l:1:f:5\ncell:E28:b:1:1:1::l:1:f:5\ncell:F28:v:96:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G28:v:97:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A29:b::1:::l:1:f:4\ncell:B29:t:Number of Potential Accounts:b:1::1:1:l:1:f:5:cf:2\ncell:C29:b:1::1::l:1:f:5\ncell:D29:b:1::1::l:1:f:5\ncell:E29:b:1:1:1::l:1:f:5\ncell:F29:v:43:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G29:v:1500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:B30:b:1::::l:1:f:4\ncell:C30:b:1::::l:1:f:4\ncell:D30:b:1::::l:1:f:4\ncell:E30:b:1::::l:1:f:4\ncell:F30:b:1::::l:1:f:4\ncell:G30:b:1::::l:1:f:4\ncell:B31:l:1:f:4\ncol:A:w:12\ncol:B:w:312\ncol:C:w:52\ncol:D:w:136\ncol:E:w:100\ncol:F:w:136\ncol:G:w:164\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:15.75\nrow:10:h:15.75\nrow:11:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:15.75\nrow:19:h:15.75\nrow:20:h:15.75\nrow:21:h:15.75\nrow:22:h:15.75\nrow:23:h:15.75\nrow:24:h:15.75\nrow:25:h:15.75\nrow:26:h:15.75\nrow:27:h:15.75\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nsheet:c:7:r:31:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\nfont:1:normal bold 12pt Arial\nfont:2:normal bold 14pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2: #,##0.00 ;(#,##0.00)\nvalueformat:3:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:4:0.0 \nvalueformat:5:0.0%\nvalueformat:6:mmmm d, yyyy\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet8","hidden":"1"},"sheet14":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Sales Activity Report:l:2:f:3:cf:2\ncell:C3:l:2:f:5:cf:1\ncell:D3:l:2:f:5:cf:1\ncell:E3:l:2:f:5:cf:1\ncell:F3:l:2:f:5:cf:1\ncell:G3:l:2:f:5:cf:1\ncell:B4:t:For December 2009:l:1:f:2:cf:1\ncell:C4:l:1:f:5:cf:1\ncell:D4:l:1:f:5:cf:1\ncell:E4:l:1:f:5:cf:1\ncell:F4:l:1:f:5:cf:1\ncell:G4:l:1:f:5:cf:1\ncell:B5:l:1:f:5\ncell:C5:l:1:f:5\ncell:D5:l:1:f:5\ncell:E5:l:1:f:5\ncell:F5:l:1:f:5\ncell:G5:l:1:f:5\ncell:C6:l:1:f:5\ncell:D6:l:1:f:5\ncell:E6:l:1:f:5\ncell:F6:l:1:f:5\ncell:G6:l:1:f:5\ncell:B7:t:Salesperson:l:1:f:5:cf:2\ncell:C7:l:1:f:5\ncell:D7:b:::1::l:1:f:5:cf:2\ncell:E7:b:::1::l:1:f:5\ncell:F7:l:1:f:5\ncell:G7:l:1:f:5\ncell:B8:t:Territory :l:1:f:5:cf:2\ncell:C8:l:1:f:5\ncell:D8:b:1::1::l:1:f:5:cf:2\ncell:E8:b:1::1::l:1:f:5\ncell:F8:t:Date :l:1:f:5:cf:3\ncell:G8:b:::1::l:1:f:5:cf:1:ntvf:6\ncell:B9:l:1:f:5\ncell:C9:l:1:f:5\ncell:D9:b:1::::l:1:f:5\ncell:E9:b:1::::l:1:f:5\ncell:F9:l:1:f:5\ncell:G9:b:1::::l:1:f:5\ncell:B10:b:::1::l:1:f:5\ncell:C10:b:::1::l:1:f:5\ncell:D10:b:::1::l:1:f:5\ncell:E10:b:::1::l:1:f:5\ncell:F10:b:::1::l:1:f:5\ncell:G10:b:::1::l:1:f:5\ncell:A11:b::1:::l:1:f:4\ncell:B11:b:1::1:1:l:1:f:5\ncell:C11:b:1::1::l:1:f:5\ncell:D11:b:1::1::l:1:f:5\ncell:E11:b:1:1:1::l:1:f:5\ncell:F11:t:FORECAST :b:1:1:1:1:l:1:f:1:cf:3\ncell:G11:t:ACTUAL :b:1:1:1:1:l:1:f:1:cf:3\ncell:A12:b::1:::l:1:f:4\ncell:B12:t:Gross Sales:b:1::1:1:l:1:f:5:cf:2\ncell:C12:b:1::1::l:1:f:5\ncell:D12:b:1::1::l:1:f:5\ncell:E12:b:1:1:1::l:1:f:5\ncell:F12:v:100000:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:G12:v:180000:b:1:1:1:1:l:1:f:5:ntvf:3\ncell:A13:b::1:::l:1:f:4\ncell:B13:t:Gross Profit:b:1::1:1:l:1:f:5:cf:2\ncell:C13:b:1::1::l:1:f:5\ncell:D13:b:1::1::l:1:f:5\ncell:E13:b:1:1:1::l:1:f:5\ncell:F13:v:25000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G13:v:50000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A14:b::1:::l:1:f:4\ncell:B14:t:% Gross Profit to Gross Sales:b:1::1:1:l:1:f:5:cf:2\ncell:C14:b:1::1::l:1:f:5\ncell:D14:b:1::1::l:1:f:5\ncell:E14:b:1:1:1::l:1:f:5\ncell:F14:vtf:n:0.25:IF(F12,(F13/F12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:G14:vtf:n:0.2777777777777778:IF(G12,(G13/G12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:A15:b::1:::l:1:f:4\ncell:B15:t:Net Profit:b:1::1:1:l:1:f:5:cf:2\ncell:C15:b:1::1::l:1:f:5\ncell:D15:b:1::1::l:1:f:5\ncell:E15:b:1:1:1::l:1:f:5\ncell:F15:v:15000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G15:v:24000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A16:b::1:::l:1:f:4\ncell:B16:t:% Net Profit to Gross Sales:b:1::1:1:l:1:f:5:cf:2\ncell:C16:b:1::1::l:1:f:5\ncell:D16:b:1::1::l:1:f:5\ncell:E16:b:1:1:1::l:1:f:5\ncell:F16:vtf:n:0.15:IF(F12,(F15/F12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:G16:vtf:n:0.13333333333333333:IF(G12,(G15/G12),\"\"):b:1:1:1:1:l:1:f:5:ntvf:5\ncell:A17:b::1:::l:1:f:4\ncell:B17:t:Salary:b:1::1:1:l:1:f:5:cf:2\ncell:C17:b:1::1::l:1:f:5\ncell:D17:b:1::1::l:1:f:5\ncell:E17:b:1:1:1::l:1:f:5\ncell:F17:v:7000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G17:v:7000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A18:b::1:::l:1:f:4\ncell:B18:t:Commission:b:1::1:1:l:1:f:5:cf:2\ncell:C18:b:1::1::l:1:f:5\ncell:D18:b:1::1::l:1:f:5\ncell:E18:b:1:1:1::l:1:f:5\ncell:F18:v:3500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G18:v:4000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A19:b::1:::l:1:f:4\ncell:B19:t:Expense\\c:b:1::1:1:l:1:f:5:cf:2\ncell:C19:b:1::1::l:1:f:5:cf:2\ncell:D19:t:Auto:b:1::1::l:1:f:5:cf:2\ncell:E19:b:1:1:1::l:1:f:5\ncell:F19:v:1000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G19:v:1100:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A20:b::1:::l:1:f:4\ncell:B20:b:1::1:1:l:1:f:5\ncell:C20:b:1::1::l:1:f:5:cf:2\ncell:D20:t:Travel:b:1::1::l:1:f:5:cf:2\ncell:E20:b:1:1:1::l:1:f:5\ncell:F20:v:500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G20:v:600:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A21:b::1:::l:1:f:4\ncell:B21:b:1::1:1:l:1:f:5\ncell:C21:b:1::1::l:1:f:5:cf:2\ncell:D21:t:Entertainment:b:1::1::l:1:f:5:cf:2\ncell:E21:b:1:1:1::l:1:f:5\ncell:F21:v:1000:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G21:v:1200:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A22:b::1:::l:1:f:4\ncell:B22:b:1::1:1:l:1:f:5\ncell:C22:b:1::1::l:1:f:5:cf:2\ncell:D22:t:Other:b:1::1::l:1:f:5:cf:2\ncell:E22:b:1:1:1::l:1:f:5\ncell:F22:v:100:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G22:v:500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A23:b::1:::l:1:f:4\ncell:B23:t:Total Days Worked:b:1::1:1:l:1:f:5:cf:2\ncell:C23:b:1::1::l:1:f:5\ncell:D23:b:1::1::l:1:f:5\ncell:E23:b:1:1:1::l:1:f:5\ncell:F23:v:22:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:G23:v:21:b:1:1:1:1:l:1:f:5:ntvf:2\ncell:A24:b::1:::l:1:f:4\ncell:B24:t:Number of Calls Made:b:1::1:1:l:1:f:5:cf:2\ncell:C24:b:1::1::l:1:f:5\ncell:D24:b:1::1::l:1:f:5\ncell:E24:b:1:1:1::l:1:f:5\ncell:F24:v:100:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G24:v:110:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A25:b::1:::l:1:f:4\ncell:B25:t:Average Calls Per Day:b:1::1:1:l:1:f:5:cf:2\ncell:C25:b:1::1::l:1:f:5\ncell:D25:b:1::1::l:1:f:5\ncell:E25:b:1:1:1::l:1:f:5\ncell:F25:vtf:n:4.545454545454546:IF(F23,(F24/F23),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:G25:vtf:n:5.238095238095238:IF(G23,(G24/G23),\"\"):b:1:1:1:1:l:1:f:5:ntvf:4\ncell:A26:b::1:::l:1:f:4\ncell:B26:t:Number of New Accounts:b:1::1:1:l:1:f:5:cf:2\ncell:C26:b:1::1::l:1:f:5\ncell:D26:b:1::1::l:1:f:5\ncell:E26:b:1:1:1::l:1:f:5\ncell:F26:v:10:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G26:v:12:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A27:b::1:::l:1:f:4\ncell:B27:t:Number of Accounts Lost:b:1::1:1:l:1:f:5:cf:2\ncell:C27:b:1::1::l:1:f:5\ncell:D27:b:1::1::l:1:f:5\ncell:E27:b:1:1:1::l:1:f:5\ncell:F27:v:3:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G27:v:4:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A28:b::1:::l:1:f:4\ncell:B28:t:Number of Accounts at Period End:b:1::1:1:l:1:f:5:cf:2\ncell:C28:b:1::1::l:1:f:5\ncell:D28:b:1::1::l:1:f:5\ncell:E28:b:1:1:1::l:1:f:5\ncell:F28:v:96:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G28:v:97:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:A29:b::1:::l:1:f:4\ncell:B29:t:Number of Potential Accounts:b:1::1:1:l:1:f:5:cf:2\ncell:C29:b:1::1::l:1:f:5\ncell:D29:b:1::1::l:1:f:5\ncell:E29:b:1:1:1::l:1:f:5\ncell:F29:v:43:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:G29:v:1500:b:1:1:1:1:l:1:f:5:ntvf:1\ncell:B30:b:1::::l:1:f:4\ncell:C30:b:1::::l:1:f:4\ncell:D30:b:1::::l:1:f:4\ncell:E30:b:1::::l:1:f:4\ncell:F30:b:1::::l:1:f:4\ncell:G30:b:1::::l:1:f:4\ncell:B31:l:1:f:4\ncol:A:w:12\ncol:B:w:312\ncol:C:w:52\ncol:D:w:136\ncol:E:w:100\ncol:F:w:136\ncol:G:w:164\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:15.75\nrow:10:h:15.75\nrow:11:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:15.75\nrow:19:h:15.75\nrow:20:h:15.75\nrow:21:h:15.75\nrow:22:h:15.75\nrow:23:h:15.75\nrow:24:h:15.75\nrow:25:h:15.75\nrow:26:h:15.75\nrow:27:h:15.75\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nsheet:c:7:r:31:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\nfont:1:normal bold 12pt Arial\nfont:2:normal bold 14pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2: #,##0.00 ;(#,##0.00)\nvalueformat:3:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:4:0.0 \nvalueformat:5:0.0%\nvalueformat:6:mmmm d, yyyy\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet801","hidden":"1"},"sheet15":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t: Sales Channel Analysis:l:1:f:3:cf:2\ncell:C3:l:1:f:4:cf:1\ncell:D3:l:1:f:4:cf:1\ncell:E3:l:1:f:4:cf:1\ncell:F3:l:1:f:4:cf:1\ncell:G3:l:1:f:4:cf:1\ncell:H3:l:1:f:4:cf:1\ncell:B4:t:For January, 2010:l:1:f:2:cf:1:ntvf:4\ncell:C4:l:1:f:4:cf:1\ncell:D4:l:1:f:4:cf:1\ncell:E4:l:1:f:4:cf:1\ncell:F4:l:1:f:4:cf:1\ncell:G4:l:1:f:4:cf:1\ncell:H4:l:1:f:4:cf:1\ncell:B5:b:::1::l:1:f:4\ncell:C5:b:::1::l:1:f:4:cf:1\ncell:D5:b:::1::l:1:f:4:cf:1\ncell:E5:b:::1::l:1:f:4:cf:1\ncell:F5:b:::1::l:1:f:4:cf:1\ncell:G5:b:::1::l:1:f:4:cf:1\ncell:H5:b:::1::l:1:f:4:cf:1\ncell:A6:b::1:::l:1:f:4\ncell:B6:b:1:::1:l:1:f:4:cf:1\ncell:C6:b:1:1:::l:1:f:4:cf:1\ncell:D6:t:Annual :b:1:1::1:l:1:f:1:cf:1\ncell:E6:t:Annual :b:1:1::1:l:1:f:1:cf:1\ncell:F6:t:% of Total:b:1:1::1:l:1:f:1:cf:1\ncell:G6:t:Avg Units :b:1:1::1:l:1:f:1:cf:1\ncell:H6:t:Avg Dollars :b:1:1::1:l:1:f:1:cf:1\ncell:A7:b::1:::l:1:f:4\ncell:B7:b:::1:1:l:1:f:4:cf:1\ncell:C7:b::1:1::l:1:f:4:cf:1\ncell:D7:t:Unit Volume :b::1:1:1:l:1:f:1:cf:1\ncell:E7:t:Dollar Volume :b::1:1:1:l:1:f:1:cf:1\ncell:F7:t:Sales :b::1:1:1:l:1:f:1:cf:1\ncell:G7:t:per Month :b::1:1:1:l:1:f:1:cf:1\ncell:H7:t:per Month :b::1:1:1:l:1:f:1:cf:1\ncell:B8:t:Company Retail Outlets:b:1::::l:1:f:1\ncell:C8:b:1::::l:1:f:4\ncell:D8:b:1::::l:1:f:4\ncell:E8:b:1::::l:1:f:4\ncell:F8:b:1::::l:1:f:4\ncell:G8:b:1::::l:1:f:4\ncell:H8:b:1::::l:1:f:4:ntvf:2\ncell:B9:l:1:f:4\ncell:C9:t:Freeport:l:1:f:4\ncell:D9:v:1000000:l:1:f:4:ntvf:1\ncell:E9:v:20000000:l:1:f:4:ntvf:2\ncell:F9:vtf:n:0.18518518518518517:IF(AND(SUM(D9),SUM(E9)),(SUM(E9)/SUM($E$13)),\"\"):l:1:f:4:ntvf:3\ncell:G9:vtf:n:83333.33333333333:IF(SUM(F9),(D9/12),\"\"):l:1:f:4:ntvf:1\ncell:H9:vtf:n:1666666.6666666667:IF(SUM(G9),(+E9/12),\"\"):l:1:f:4:ntvf:2\ncell:B10:l:1:f:4\ncell:C10:t:Fall River:l:1:f:4\ncell:D10:v:1500000:l:1:f:4:ntvf:1\ncell:E10:v:30000000:l:1:f:4:ntvf:1\ncell:F10:vtf:n:0.2777777777777778:IF(AND(SUM(D10),SUM(E10)),(SUM(E10)/SUM($E$13)),\"\"):l:1:f:4:ntvf:3\ncell:G10:vtf:n:125000:IF(SUM(F10),(D10/12),\"\"):l:1:f:4:ntvf:1\ncell:H10:vtf:n:2500000:IF(SUM(G10),(+E10/12),\"\"):l:1:f:4:ntvf:1\ncell:B11:l:1:f:4\ncell:C11:t:Orlando:l:1:f:4\ncell:D11:v:2000000:l:1:f:4:ntvf:1\ncell:E11:v:40000000:l:1:f:4:ntvf:1\ncell:F11:vtf:n:0.37037037037037035:IF(AND(SUM(D11),SUM(E11)),(SUM(E11)/SUM($E$13)),\"\"):l:1:f:4:ntvf:3\ncell:G11:vtf:n:166666.66666666666:IF(SUM(F11),(D11/12),\"\"):l:1:f:4:ntvf:1\ncell:H11:vtf:n:3333333.3333333335:IF(SUM(G11),(+E11/12),\"\"):l:1:f:4:ntvf:1\ncell:B12:l:1:f:4\ncell:C12:t:Baltimore:b:::1::l:1:f:4\ncell:D12:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E12:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F12:vtf:n:0.16666666666666666:IF(AND(SUM(D12),SUM(E12)),(SUM(E12)/SUM($E$13)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G12:vtf:n:75000:IF(SUM(F12),(D12/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H12:vtf:n:1500000:IF(SUM(G12),(+E12/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B13:l:1:f:4\ncell:C13:t:Total:b:1::::l:1:f:4\ncell:D13:vtf:n:5400000:IF(SUM(D9\\cD12),SUM(D9\\cD12),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E13:vtf:n:108000000:IF(SUM(E9\\cE12),SUM(E9\\cE12),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F13:vtf:n:0.1581259150805271:IF(AND(SUM(D13),SUM(E13)),(E13/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G13:vtf:n:450000:IF(SUM(G9\\cG12),SUM(G9\\cG12),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H13:vtf:n:9000000:IF(SUM(H9\\cH12),SUM(H9\\cH12),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B14:t:Independent Retail Outlets:l:1:f:1\ncell:C14:l:1:f:4\ncell:D14:l:1:f:4:ntvf:1\ncell:E14:l:1:f:4:ntvf:2\ncell:F14:l:1:f:4\ncell:G14:l:1:f:4:ntvf:1\ncell:H14:l:1:f:4:ntvf:2\ncell:B15:l:1:f:4\ncell:C15:t:North Conway:l:1:f:4\ncell:D15:v:1100000:l:1:f:4:ntvf:1\ncell:E15:v:21000000:l:1:f:4:ntvf:2\ncell:F15:vtf:n:0.1926605504587156:IF(AND(SUM(D15),SUM(E15)),(SUM(E15)/SUM($E$19)),\"\"):l:1:f:4:ntvf:3\ncell:G15:vtf:n:91666.66666666667:IF(SUM(F15),(D15/12),\"\"):l:1:f:4:ntvf:1\ncell:H15:vtf:n:1750000:IF(SUM(G15),(+E15/12),\"\"):l:1:f:4:ntvf:2\ncell:B16:l:1:f:4\ncell:C16:t:Nashua:l:1:f:4\ncell:D16:v:1500000:l:1:f:4:ntvf:1\ncell:E16:v:30000000:l:1:f:4:ntvf:1\ncell:F16:vtf:n:0.27522935779816515:IF(AND(SUM(D16),SUM(E16)),(SUM(E16)/SUM($E$19)),\"\"):l:1:f:4:ntvf:3\ncell:G16:vtf:n:125000:IF(SUM(F16),(D16/12),\"\"):l:1:f:4:ntvf:1\ncell:H16:vtf:n:2500000:IF(SUM(G16),(+E16/12),\"\"):l:1:f:4:ntvf:1\ncell:B17:l:1:f:4\ncell:C17:t:Washington, DC:l:1:f:4\ncell:D17:v:2000000:l:1:f:4:ntvf:1\ncell:E17:v:40000000:l:1:f:4:ntvf:1\ncell:F17:vtf:n:0.3669724770642202:IF(AND(SUM(D17),SUM(E17)),(SUM(E17)/SUM($E$19)),\"\"):l:1:f:4:ntvf:3\ncell:G17:vtf:n:166666.66666666666:IF(SUM(F17),(D17/12),\"\"):l:1:f:4:ntvf:1\ncell:H17:vtf:n:3333333.3333333335:IF(SUM(G17),(+E17/12),\"\"):l:1:f:4:ntvf:1\ncell:B18:l:1:f:4\ncell:C18:t:New Bedford:b:::1::l:1:f:4\ncell:D18:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E18:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F18:vtf:n:0.1651376146788991:IF(AND(SUM(D18),SUM(E18)),(SUM(E18)/SUM($E$19)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G18:vtf:n:75000:IF(SUM(F18),(D18/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H18:vtf:n:1500000:IF(SUM(G18),(+E18/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B19:l:1:f:4\ncell:C19:t:Total:b:1::::l:1:f:4\ncell:D19:vtf:n:5500000:IF(SUM(D15\\cD18),SUM(D15\\cD18),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E19:vtf:n:109000000:IF(SUM(E15\\cE18),SUM(E15\\cE18),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F19:vtf:n:0.1595900439238653:IF(AND(SUM(D19),SUM(E19)),(E19/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G19:vtf:n:458333.3333333334:IF(SUM(G15\\cG18),SUM(G15\\cG18),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H19:vtf:n:9083333.333333334:IF(SUM(H15\\cH18),SUM(H15\\cH18),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B20:t:Salaried Sales Force:l:1:f:1\ncell:C20:l:1:f:4\ncell:D20:l:1:f:4:ntvf:1\ncell:E20:l:1:f:4:ntvf:2\ncell:F20:l:1:f:4\ncell:G20:l:1:f:4:ntvf:1\ncell:H20:l:1:f:4:ntvf:2\ncell:B21:l:1:f:4\ncell:C21:t:Northeast:l:1:f:4\ncell:D21:v:1100000:l:1:f:4:ntvf:1\ncell:E21:v:21000000:l:1:f:4:ntvf:2\ncell:F21:vtf:n:0.1926605504587156:IF(AND(SUM(D21),SUM(E21)),(SUM(E21)/SUM($E$25)),\"\"):l:1:f:4:ntvf:3\ncell:G21:vtf:n:91666.66666666667:IF(SUM(F21),(D21/12),\"\"):l:1:f:4:ntvf:1\ncell:H21:vtf:n:1750000:IF(SUM(G21),(+E21/12),\"\"):l:1:f:4:ntvf:2\ncell:B22:l:1:f:4\ncell:C22:t:Mid-Atlantic:l:1:f:4\ncell:D22:v:1500000:l:1:f:4:ntvf:1\ncell:E22:v:30000000:l:1:f:4:ntvf:1\ncell:F22:vtf:n:0.27522935779816515:IF(AND(SUM(D22),SUM(E22)),(SUM(E22)/SUM($E$25)),\"\"):l:1:f:4:ntvf:3\ncell:G22:vtf:n:125000:IF(SUM(F22),(D22/12),\"\"):l:1:f:4:ntvf:1\ncell:H22:vtf:n:2500000:IF(SUM(G22),(+E22/12),\"\"):l:1:f:4:ntvf:1\ncell:B23:l:1:f:4\ncell:C23:t:Southeast:l:1:f:4\ncell:D23:v:2000000:l:1:f:4:ntvf:1\ncell:E23:v:40000000:l:1:f:4:ntvf:1\ncell:F23:vtf:n:0.3669724770642202:IF(AND(SUM(D23),SUM(E23)),(SUM(E23)/SUM($E$25)),\"\"):l:1:f:4:ntvf:3\ncell:G23:vtf:n:166666.66666666666:IF(SUM(F23),(D23/12),\"\"):l:1:f:4:ntvf:1\ncell:H23:vtf:n:3333333.3333333335:IF(SUM(G23),(+E23/12),\"\"):l:1:f:4:ntvf:1\ncell:B24:l:1:f:4\ncell:C24:t:West:b:::1::l:1:f:4\ncell:D24:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E24:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F24:vtf:n:0.1651376146788991:IF(AND(SUM(D24),SUM(E24)),(SUM(E24)/SUM($E$25)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G24:vtf:n:75000:IF(SUM(F24),(D24/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H24:vtf:n:1500000:IF(SUM(G24),(+E24/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B25:l:1:f:4\ncell:C25:t:Total:b:1::::l:1:f:4\ncell:D25:vtf:n:5500000:IF(SUM(D21\\cD24),SUM(D21\\cD24),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E25:vtf:n:109000000:IF(SUM(E21\\cE24),SUM(E21\\cE24),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F25:vtf:n:0.1595900439238653:IF(AND(SUM(D25),SUM(E25)),(E25/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G25:vtf:n:458333.3333333334:IF(SUM(G21\\cG24),SUM(G21\\cG24),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H25:vtf:n:9083333.333333334:IF(SUM(H21\\cH24),SUM(H21\\cH24),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B26:t:Channel 4:l:1:f:1\ncell:C26:l:1:f:4\ncell:D26:l:1:f:4:ntvf:1\ncell:E26:l:1:f:4:ntvf:2\ncell:F26:l:1:f:4\ncell:G26:l:1:f:4:ntvf:1\ncell:H26:l:1:f:4:ntvf:2\ncell:B27:l:1:f:4\ncell:C27:t:Northeast:l:1:f:4\ncell:D27:v:1100000:l:1:f:4:ntvf:1\ncell:E27:v:21000000:l:1:f:4:ntvf:2\ncell:F27:vtf:n:0.1926605504587156:IF(AND(SUM(D27),SUM(E27)),(SUM(E27)/SUM($E$31)),\"\"):l:1:f:4:ntvf:3\ncell:G27:vtf:n:91666.66666666667:IF(SUM(F27),(D27/12),\"\"):l:1:f:4:ntvf:1\ncell:H27:vtf:n:1750000:IF(SUM(G27),(+E27/12),\"\"):l:1:f:4:ntvf:2\ncell:B28:l:1:f:4\ncell:C28:t:Mid-Atlantic:l:1:f:4\ncell:D28:v:1500000:l:1:f:4:ntvf:1\ncell:E28:v:30000000:l:1:f:4:ntvf:1\ncell:F28:vtf:n:0.27522935779816515:IF(AND(SUM(D28),SUM(E28)),(SUM(E28)/SUM($E$31)),\"\"):l:1:f:4:ntvf:3\ncell:G28:vtf:n:125000:IF(SUM(F28),(D28/12),\"\"):l:1:f:4:ntvf:1\ncell:H28:vtf:n:2500000:IF(SUM(G28),(+E28/12),\"\"):l:1:f:4:ntvf:1\ncell:B29:l:1:f:4\ncell:C29:t:Southeast:l:1:f:4\ncell:D29:v:2000000:l:1:f:4:ntvf:1\ncell:E29:v:40000000:l:1:f:4:ntvf:1\ncell:F29:vtf:n:0.3669724770642202:IF(AND(SUM(D29),SUM(E29)),(SUM(E29)/SUM($E$31)),\"\"):l:1:f:4:ntvf:3\ncell:G29:vtf:n:166666.66666666666:IF(SUM(F29),(D29/12),\"\"):l:1:f:4:ntvf:1\ncell:H29:vtf:n:3333333.3333333335:IF(SUM(G29),(+E29/12),\"\"):l:1:f:4:ntvf:1\ncell:B30:l:1:f:4\ncell:C30:t:West:b:::1::l:1:f:4\ncell:D30:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E30:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F30:vtf:n:0.1651376146788991:IF(AND(SUM(D30),SUM(E30)),(SUM(E30)/SUM($E$31)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G30:vtf:n:75000:IF(SUM(F30),(D30/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H30:vtf:n:1500000:IF(SUM(G30),(+E30/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B31:l:1:f:4\ncell:C31:t:Total:b:1::::l:1:f:4\ncell:D31:vtf:n:5500000:IF(SUM(D27\\cD30),SUM(D27\\cD30),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E31:vtf:n:109000000:IF(SUM(E27\\cE30),SUM(E27\\cE30),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F31:vtf:n:0.1595900439238653:IF(AND(SUM(D31),SUM(E31)),(E31/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G31:vtf:n:458333.3333333334:IF(SUM(G27\\cG30),SUM(G27\\cG30),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H31:vtf:n:9083333.333333334:IF(SUM(H27\\cH30),SUM(H27\\cH30),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B32:t:Wholesalers / Company Owned Distributors:l:1:f:1\ncell:C32:l:1:f:4\ncell:D32:l:1:f:4:ntvf:1\ncell:E32:l:1:f:4:ntvf:2\ncell:F32:l:1:f:4\ncell:G32:l:1:f:4:ntvf:1\ncell:H32:l:1:f:4:ntvf:2\ncell:B33:l:1:f:4\ncell:C33:t:New York:l:1:f:4\ncell:D33:v:1100000:l:1:f:4:ntvf:1\ncell:E33:v:21000000:l:1:f:4:ntvf:2\ncell:F33:vtf:n:0.1926605504587156:IF(AND(SUM(D33),SUM(E33)),(SUM(E33)/SUM($E$37)),\"\"):l:1:f:4:ntvf:3\ncell:G33:vtf:n:91666.66666666667:IF(SUM(F33),(D33/12),\"\"):l:1:f:4:ntvf:1\ncell:H33:vtf:n:1750000:IF(SUM(G33),(+E33/12),\"\"):l:1:f:4:ntvf:2\ncell:B34:l:1:f:4\ncell:C34:t:Nashua:l:1:f:4\ncell:D34:v:1500000:l:1:f:4:ntvf:1\ncell:E34:v:30000000:l:1:f:4:ntvf:1\ncell:F34:vtf:n:0.27522935779816515:IF(AND(SUM(D34),SUM(E34)),(SUM(E34)/SUM($E$37)),\"\"):l:1:f:4:ntvf:3\ncell:G34:vtf:n:125000:IF(SUM(F34),(D34/12),\"\"):l:1:f:4:ntvf:1\ncell:H34:vtf:n:2500000:IF(SUM(G34),(+E34/12),\"\"):l:1:f:4:ntvf:1\ncell:B35:l:1:f:4\ncell:C35:t:Washington, DC:l:1:f:4\ncell:D35:v:2000000:l:1:f:4:ntvf:1\ncell:E35:v:40000000:l:1:f:4:ntvf:1\ncell:F35:vtf:n:0.3669724770642202:IF(AND(SUM(D35),SUM(E35)),(SUM(E35)/SUM($E$37)),\"\"):l:1:f:4:ntvf:3\ncell:G35:vtf:n:166666.66666666666:IF(SUM(F35),(D35/12),\"\"):l:1:f:4:ntvf:1\ncell:H35:vtf:n:3333333.3333333335:IF(SUM(G35),(+E35/12),\"\"):l:1:f:4:ntvf:1\ncell:B36:l:1:f:4\ncell:C36:t:Charleston, NC:b:::1::l:1:f:4\ncell:D36:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E36:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F36:vtf:n:0.1651376146788991:IF(AND(SUM(D36),SUM(E36)),(SUM(E36)/SUM($E$37)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G36:vtf:n:75000:IF(SUM(F36),(D36/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H36:vtf:n:1500000:IF(SUM(G36),(+E36/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B37:l:1:f:4\ncell:C37:t:Total:b:1::::l:1:f:4\ncell:D37:vtf:n:5500000:IF(SUM(D33\\cD36),SUM(D33\\cD36),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E37:vtf:n:109000000:IF(SUM(E33\\cE36),SUM(E33\\cE36),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F37:vtf:n:0.1595900439238653:IF(AND(SUM(D37),SUM(E37)),(E37/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G37:vtf:n:458333.3333333334:IF(SUM(G33\\cG36),SUM(G33\\cG36),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H37:vtf:n:9083333.333333334:IF(SUM(H33\\cH36),SUM(H33\\cH36),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B38:t:Wholesalers / Independent Distributors:l:1:f:1\ncell:C38:l:1:f:4\ncell:D38:l:1:f:4:ntvf:1\ncell:E38:l:1:f:4:ntvf:2\ncell:F38:l:1:f:4\ncell:G38:l:1:f:4:ntvf:1\ncell:H38:l:1:f:4:ntvf:2\ncell:B39:l:1:f:4\ncell:C39:t:Springfield:l:1:f:4\ncell:D39:v:1100000:l:1:f:4:ntvf:1\ncell:E39:v:21000000:l:1:f:4:ntvf:2\ncell:F39:vtf:n:0.1926605504587156:IF(AND(SUM(D39),SUM(E39)),(SUM(E39)/SUM($E$43)),\"\"):l:1:f:4:ntvf:3\ncell:G39:vtf:n:91666.66666666667:IF(SUM(F39),(D39/12),\"\"):l:1:f:4:ntvf:1\ncell:H39:vtf:n:1750000:IF(SUM(G39),(+E39/12),\"\"):l:1:f:4:ntvf:2\ncell:B40:l:1:f:4\ncell:C40:t:Cambridge:l:1:f:4\ncell:D40:v:1500000:l:1:f:4:ntvf:1\ncell:E40:v:30000000:l:1:f:4:ntvf:1\ncell:F40:vtf:n:0.27522935779816515:IF(AND(SUM(D40),SUM(E40)),(SUM(E40)/SUM($E$43)),\"\"):l:1:f:4:ntvf:3\ncell:G40:vtf:n:125000:IF(SUM(F40),(D40/12),\"\"):l:1:f:4:ntvf:1\ncell:H40:vtf:n:2500000:IF(SUM(G40),(+E40/12),\"\"):l:1:f:4:ntvf:1\ncell:B41:l:1:f:4\ncell:C41:t:Chicago:l:1:f:4\ncell:D41:v:2000000:l:1:f:4:ntvf:1\ncell:E41:v:40000000:l:1:f:4:ntvf:1\ncell:F41:vtf:n:0.3669724770642202:IF(AND(SUM(D41),SUM(E41)),(SUM(E41)/SUM($E$43)),\"\"):l:1:f:4:ntvf:3\ncell:G41:vtf:n:166666.66666666666:IF(SUM(F41),(D41/12),\"\"):l:1:f:4:ntvf:1\ncell:H41:vtf:n:3333333.3333333335:IF(SUM(G41),(+E41/12),\"\"):l:1:f:4:ntvf:1\ncell:B42:l:1:f:4\ncell:C42:t:San Francisco:b:::1::l:1:f:4\ncell:D42:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E42:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F42:vtf:n:0.1651376146788991:IF(AND(SUM(D42),SUM(E42)),(SUM(E42)/SUM($E$43)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G42:vtf:n:75000:IF(SUM(F42),(D42/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H42:vtf:n:1500000:IF(SUM(G42),(+E42/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B43:l:1:f:4\ncell:C43:t:Total:b:1::::l:1:f:4\ncell:D43:vtf:n:5500000:IF(SUM(D39\\cD42),SUM(D39\\cD42),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E43:vtf:n:109000000:IF(SUM(E39\\cE42),SUM(E39\\cE42),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F43:vtf:n:0.1595900439238653:IF(AND(SUM(D43),SUM(E43)),(E43/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G43:vtf:n:458333.3333333334:IF(SUM(G39\\cG42),SUM(G39\\cG42),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H43:vtf:n:9083333.333333334:IF(SUM(H39\\cH42),SUM(H39\\cH42),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B44:t:Other:l:1:f:1\ncell:C44:l:1:f:4\ncell:D44:l:1:f:4:ntvf:1\ncell:E44:l:1:f:4:ntvf:2\ncell:F44:l:1:f:4\ncell:G44:l:1:f:4:ntvf:1\ncell:H44:l:1:f:4:ntvf:2\ncell:B45:l:1:f:4\ncell:C45:t:On-Line / Mail Order:l:1:f:4\ncell:D45:v:1500000:l:1:f:4:ntvf:1\ncell:E45:v:30000000:l:1:f:4:ntvf:2\ncell:F45:vtf:n:1:IF(AND(SUM(D45),SUM(E45)),(SUM(E45)/SUM($E$47)),\"\"):l:1:f:4:ntvf:3\ncell:G45:vtf:n:125000:IF(SUM(F45),(D45/12),\"\"):l:1:f:4:ntvf:1\ncell:H45:vtf:n:2500000:IF(SUM(G45),(+E45/12),\"\"):l:1:f:4:ntvf:2\ncell:B46:l:1:f:4\ncell:C46:b:::1::l:1:f:4\ncell:D46:b:::1::l:1:f:4:ntvf:1\ncell:E46:b:::1::l:1:f:4:ntvf:1\ncell:F46:vtf:t::IF(AND(SUM(D46),SUM(E46)),(SUM(E46)/SUM($E$47)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G46:vtf:t::IF(SUM(F46),(D46/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H46:vtf:t::IF(SUM(G46),(+E46/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B47:l:1:f:4\ncell:C47:t:Total:b:1::::l:1:f:4\ncell:D47:vtf:n:1500000:IF(SUM(D45\\cD46),SUM(D45\\cD46),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:E47:vtf:n:30000000:IF(SUM(E45\\cE46),SUM(E45\\cE46),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:F47:vtf:n:1:IF(SUM(F45\\cF46),SUM(F45\\cF46),\"\"):b:1::1::l:1:f:4:ntvf:3\ncell:G47:vtf:n:125000:IF(SUM(G45\\cG46),SUM(G45\\cG46),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:H47:vtf:n:2500000:IF(SUM(H45\\cH46),SUM(H45\\cH46),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:B48:t:Totals for all Channels:l:1:f:1\ncell:C48:l:1:f:4\ncell:D48:vtf:n:34400000:IF(SUM(D13,D19,D25,D31,D37,D43,D47),SUM(D13,D19,D25,D31,D37,D43,D47),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:E48:vtf:n:683000000:IF(SUM(E13,E19,E25,E31,E37,E43,E47),SUM(E13,E19,E25,E31,E37,E43,E47),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:F48:vtf:n:1:IF(AND(SUM(D48\\cE48),SUM(E48)),(SUM(E48)/SUM(E48)),\"\"):b:1::1::l:1:f:4:ntvf:3\ncell:G48:vtf:n:2866666.6666666665:IF(SUM(F48),(D48/12),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:H48:vtf:n:56916666.666666664:IF(SUM(G48),(+E48/12),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:D49:b:1::::l:1:f:4\ncell:E49:b:1::::l:1:f:4\ncell:F49:b:1::::l:1:f:4\ncell:G49:b:1::::l:1:f:4\ncell:H49:b:1::::l:1:f:4\ncell:B50:l:1:f:4\ncol:A:w:12\ncol:B:w:285\ncol:C:w:156\ncol:D:w:100\ncol:E:w:118\ncol:F:w:71\ncol:G:w:90\ncol:H:w:108\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nsheet:c:8:r:50:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:normal bold 10pt Arial\nfont:2:normal bold 14pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:3:0.0%\nvalueformat:4:mmmm d, yyyy\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet9","hidden":"1"},"sheet16":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t: Sales Channel Analysis:l:1:f:3:cf:2\ncell:C3:l:1:f:4:cf:1\ncell:D3:l:1:f:4:cf:1\ncell:E3:l:1:f:4:cf:1\ncell:F3:l:1:f:4:cf:1\ncell:G3:l:1:f:4:cf:1\ncell:H3:l:1:f:4:cf:1\ncell:B4:t:For January, 2010:l:1:f:2:cf:1:ntvf:4\ncell:C4:l:1:f:4:cf:1\ncell:D4:l:1:f:4:cf:1\ncell:E4:l:1:f:4:cf:1\ncell:F4:l:1:f:4:cf:1\ncell:G4:l:1:f:4:cf:1\ncell:H4:l:1:f:4:cf:1\ncell:B5:b:::1::l:1:f:4\ncell:C5:b:::1::l:1:f:4:cf:1\ncell:D5:b:::1::l:1:f:4:cf:1\ncell:E5:b:::1::l:1:f:4:cf:1\ncell:F5:b:::1::l:1:f:4:cf:1\ncell:G5:b:::1::l:1:f:4:cf:1\ncell:H5:b:::1::l:1:f:4:cf:1\ncell:A6:b::1:::l:1:f:4\ncell:B6:b:1:::1:l:1:f:4:cf:1\ncell:C6:b:1:1:::l:1:f:4:cf:1\ncell:D6:t:Annual :b:1:1::1:l:1:f:1:cf:1\ncell:E6:t:Annual :b:1:1::1:l:1:f:1:cf:1\ncell:F6:t:% of Total:b:1:1::1:l:1:f:1:cf:1\ncell:G6:t:Avg Units :b:1:1::1:l:1:f:1:cf:1\ncell:H6:t:Avg Dollars :b:1:1::1:l:1:f:1:cf:1\ncell:A7:b::1:::l:1:f:4\ncell:B7:b:::1:1:l:1:f:4:cf:1\ncell:C7:b::1:1::l:1:f:4:cf:1\ncell:D7:t:Unit Volume :b::1:1:1:l:1:f:1:cf:1\ncell:E7:t:Dollar Volume :b::1:1:1:l:1:f:1:cf:1\ncell:F7:t:Sales :b::1:1:1:l:1:f:1:cf:1\ncell:G7:t:per Month :b::1:1:1:l:1:f:1:cf:1\ncell:H7:t:per Month :b::1:1:1:l:1:f:1:cf:1\ncell:B8:t:Company Retail Outlets:b:1::::l:1:f:1\ncell:C8:b:1::::l:1:f:4\ncell:D8:b:1::::l:1:f:4\ncell:E8:b:1::::l:1:f:4\ncell:F8:b:1::::l:1:f:4\ncell:G8:b:1::::l:1:f:4\ncell:H8:b:1::::l:1:f:4:ntvf:2\ncell:B9:l:1:f:4\ncell:C9:t:Freeport:l:1:f:4\ncell:D9:v:1000000:l:1:f:4:ntvf:1\ncell:E9:v:20000000:l:1:f:4:ntvf:2\ncell:F9:vtf:n:0.18518518518518517:IF(AND(SUM(D9),SUM(E9)),(SUM(E9)/SUM($E$13)),\"\"):l:1:f:4:ntvf:3\ncell:G9:vtf:n:83333.33333333333:IF(SUM(F9),(D9/12),\"\"):l:1:f:4:ntvf:1\ncell:H9:vtf:n:1666666.6666666667:IF(SUM(G9),(+E9/12),\"\"):l:1:f:4:ntvf:2\ncell:B10:l:1:f:4\ncell:C10:t:Fall River:l:1:f:4\ncell:D10:v:1500000:l:1:f:4:ntvf:1\ncell:E10:v:30000000:l:1:f:4:ntvf:1\ncell:F10:vtf:n:0.2777777777777778:IF(AND(SUM(D10),SUM(E10)),(SUM(E10)/SUM($E$13)),\"\"):l:1:f:4:ntvf:3\ncell:G10:vtf:n:125000:IF(SUM(F10),(D10/12),\"\"):l:1:f:4:ntvf:1\ncell:H10:vtf:n:2500000:IF(SUM(G10),(+E10/12),\"\"):l:1:f:4:ntvf:1\ncell:B11:l:1:f:4\ncell:C11:t:Orlando:l:1:f:4\ncell:D11:v:2000000:l:1:f:4:ntvf:1\ncell:E11:v:40000000:l:1:f:4:ntvf:1\ncell:F11:vtf:n:0.37037037037037035:IF(AND(SUM(D11),SUM(E11)),(SUM(E11)/SUM($E$13)),\"\"):l:1:f:4:ntvf:3\ncell:G11:vtf:n:166666.66666666666:IF(SUM(F11),(D11/12),\"\"):l:1:f:4:ntvf:1\ncell:H11:vtf:n:3333333.3333333335:IF(SUM(G11),(+E11/12),\"\"):l:1:f:4:ntvf:1\ncell:B12:l:1:f:4\ncell:C12:t:Baltimore:b:::1::l:1:f:4\ncell:D12:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E12:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F12:vtf:n:0.16666666666666666:IF(AND(SUM(D12),SUM(E12)),(SUM(E12)/SUM($E$13)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G12:vtf:n:75000:IF(SUM(F12),(D12/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H12:vtf:n:1500000:IF(SUM(G12),(+E12/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B13:l:1:f:4\ncell:C13:t:Total:b:1::::l:1:f:4\ncell:D13:vtf:n:5400000:IF(SUM(D9\\cD12),SUM(D9\\cD12),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E13:vtf:n:108000000:IF(SUM(E9\\cE12),SUM(E9\\cE12),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F13:vtf:n:0.1581259150805271:IF(AND(SUM(D13),SUM(E13)),(E13/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G13:vtf:n:450000:IF(SUM(G9\\cG12),SUM(G9\\cG12),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H13:vtf:n:9000000:IF(SUM(H9\\cH12),SUM(H9\\cH12),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B14:t:Independent Retail Outlets:l:1:f:1\ncell:C14:l:1:f:4\ncell:D14:l:1:f:4:ntvf:1\ncell:E14:l:1:f:4:ntvf:2\ncell:F14:l:1:f:4\ncell:G14:l:1:f:4:ntvf:1\ncell:H14:l:1:f:4:ntvf:2\ncell:B15:l:1:f:4\ncell:C15:t:North Conway:l:1:f:4\ncell:D15:v:1100000:l:1:f:4:ntvf:1\ncell:E15:v:21000000:l:1:f:4:ntvf:2\ncell:F15:vtf:n:0.1926605504587156:IF(AND(SUM(D15),SUM(E15)),(SUM(E15)/SUM($E$19)),\"\"):l:1:f:4:ntvf:3\ncell:G15:vtf:n:91666.66666666667:IF(SUM(F15),(D15/12),\"\"):l:1:f:4:ntvf:1\ncell:H15:vtf:n:1750000:IF(SUM(G15),(+E15/12),\"\"):l:1:f:4:ntvf:2\ncell:B16:l:1:f:4\ncell:C16:t:Nashua:l:1:f:4\ncell:D16:v:1500000:l:1:f:4:ntvf:1\ncell:E16:v:30000000:l:1:f:4:ntvf:1\ncell:F16:vtf:n:0.27522935779816515:IF(AND(SUM(D16),SUM(E16)),(SUM(E16)/SUM($E$19)),\"\"):l:1:f:4:ntvf:3\ncell:G16:vtf:n:125000:IF(SUM(F16),(D16/12),\"\"):l:1:f:4:ntvf:1\ncell:H16:vtf:n:2500000:IF(SUM(G16),(+E16/12),\"\"):l:1:f:4:ntvf:1\ncell:B17:l:1:f:4\ncell:C17:t:Washington, DC:l:1:f:4\ncell:D17:v:2000000:l:1:f:4:ntvf:1\ncell:E17:v:40000000:l:1:f:4:ntvf:1\ncell:F17:vtf:n:0.3669724770642202:IF(AND(SUM(D17),SUM(E17)),(SUM(E17)/SUM($E$19)),\"\"):l:1:f:4:ntvf:3\ncell:G17:vtf:n:166666.66666666666:IF(SUM(F17),(D17/12),\"\"):l:1:f:4:ntvf:1\ncell:H17:vtf:n:3333333.3333333335:IF(SUM(G17),(+E17/12),\"\"):l:1:f:4:ntvf:1\ncell:B18:l:1:f:4\ncell:C18:t:New Bedford:b:::1::l:1:f:4\ncell:D18:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E18:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F18:vtf:n:0.1651376146788991:IF(AND(SUM(D18),SUM(E18)),(SUM(E18)/SUM($E$19)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G18:vtf:n:75000:IF(SUM(F18),(D18/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H18:vtf:n:1500000:IF(SUM(G18),(+E18/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B19:l:1:f:4\ncell:C19:t:Total:b:1::::l:1:f:4\ncell:D19:vtf:n:5500000:IF(SUM(D15\\cD18),SUM(D15\\cD18),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E19:vtf:n:109000000:IF(SUM(E15\\cE18),SUM(E15\\cE18),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F19:vtf:n:0.1595900439238653:IF(AND(SUM(D19),SUM(E19)),(E19/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G19:vtf:n:458333.3333333334:IF(SUM(G15\\cG18),SUM(G15\\cG18),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H19:vtf:n:9083333.333333334:IF(SUM(H15\\cH18),SUM(H15\\cH18),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B20:t:Salaried Sales Force:l:1:f:1\ncell:C20:l:1:f:4\ncell:D20:l:1:f:4:ntvf:1\ncell:E20:l:1:f:4:ntvf:2\ncell:F20:l:1:f:4\ncell:G20:l:1:f:4:ntvf:1\ncell:H20:l:1:f:4:ntvf:2\ncell:B21:l:1:f:4\ncell:C21:t:Northeast:l:1:f:4\ncell:D21:v:1100000:l:1:f:4:ntvf:1\ncell:E21:v:21000000:l:1:f:4:ntvf:2\ncell:F21:vtf:n:0.1926605504587156:IF(AND(SUM(D21),SUM(E21)),(SUM(E21)/SUM($E$25)),\"\"):l:1:f:4:ntvf:3\ncell:G21:vtf:n:91666.66666666667:IF(SUM(F21),(D21/12),\"\"):l:1:f:4:ntvf:1\ncell:H21:vtf:n:1750000:IF(SUM(G21),(+E21/12),\"\"):l:1:f:4:ntvf:2\ncell:B22:l:1:f:4\ncell:C22:t:Mid-Atlantic:l:1:f:4\ncell:D22:v:1500000:l:1:f:4:ntvf:1\ncell:E22:v:30000000:l:1:f:4:ntvf:1\ncell:F22:vtf:n:0.27522935779816515:IF(AND(SUM(D22),SUM(E22)),(SUM(E22)/SUM($E$25)),\"\"):l:1:f:4:ntvf:3\ncell:G22:vtf:n:125000:IF(SUM(F22),(D22/12),\"\"):l:1:f:4:ntvf:1\ncell:H22:vtf:n:2500000:IF(SUM(G22),(+E22/12),\"\"):l:1:f:4:ntvf:1\ncell:B23:l:1:f:4\ncell:C23:t:Southeast:l:1:f:4\ncell:D23:v:2000000:l:1:f:4:ntvf:1\ncell:E23:v:40000000:l:1:f:4:ntvf:1\ncell:F23:vtf:n:0.3669724770642202:IF(AND(SUM(D23),SUM(E23)),(SUM(E23)/SUM($E$25)),\"\"):l:1:f:4:ntvf:3\ncell:G23:vtf:n:166666.66666666666:IF(SUM(F23),(D23/12),\"\"):l:1:f:4:ntvf:1\ncell:H23:vtf:n:3333333.3333333335:IF(SUM(G23),(+E23/12),\"\"):l:1:f:4:ntvf:1\ncell:B24:l:1:f:4\ncell:C24:t:West:b:::1::l:1:f:4\ncell:D24:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E24:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F24:vtf:n:0.1651376146788991:IF(AND(SUM(D24),SUM(E24)),(SUM(E24)/SUM($E$25)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G24:vtf:n:75000:IF(SUM(F24),(D24/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H24:vtf:n:1500000:IF(SUM(G24),(+E24/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B25:l:1:f:4\ncell:C25:t:Total:b:1::::l:1:f:4\ncell:D25:vtf:n:5500000:IF(SUM(D21\\cD24),SUM(D21\\cD24),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E25:vtf:n:109000000:IF(SUM(E21\\cE24),SUM(E21\\cE24),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F25:vtf:n:0.1595900439238653:IF(AND(SUM(D25),SUM(E25)),(E25/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G25:vtf:n:458333.3333333334:IF(SUM(G21\\cG24),SUM(G21\\cG24),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H25:vtf:n:9083333.333333334:IF(SUM(H21\\cH24),SUM(H21\\cH24),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B26:t:Channel 4:l:1:f:1\ncell:C26:l:1:f:4\ncell:D26:l:1:f:4:ntvf:1\ncell:E26:l:1:f:4:ntvf:2\ncell:F26:l:1:f:4\ncell:G26:l:1:f:4:ntvf:1\ncell:H26:l:1:f:4:ntvf:2\ncell:B27:l:1:f:4\ncell:C27:t:Northeast:l:1:f:4\ncell:D27:v:1100000:l:1:f:4:ntvf:1\ncell:E27:v:21000000:l:1:f:4:ntvf:2\ncell:F27:vtf:n:0.1926605504587156:IF(AND(SUM(D27),SUM(E27)),(SUM(E27)/SUM($E$31)),\"\"):l:1:f:4:ntvf:3\ncell:G27:vtf:n:91666.66666666667:IF(SUM(F27),(D27/12),\"\"):l:1:f:4:ntvf:1\ncell:H27:vtf:n:1750000:IF(SUM(G27),(+E27/12),\"\"):l:1:f:4:ntvf:2\ncell:B28:l:1:f:4\ncell:C28:t:Mid-Atlantic:l:1:f:4\ncell:D28:v:1500000:l:1:f:4:ntvf:1\ncell:E28:v:30000000:l:1:f:4:ntvf:1\ncell:F28:vtf:n:0.27522935779816515:IF(AND(SUM(D28),SUM(E28)),(SUM(E28)/SUM($E$31)),\"\"):l:1:f:4:ntvf:3\ncell:G28:vtf:n:125000:IF(SUM(F28),(D28/12),\"\"):l:1:f:4:ntvf:1\ncell:H28:vtf:n:2500000:IF(SUM(G28),(+E28/12),\"\"):l:1:f:4:ntvf:1\ncell:B29:l:1:f:4\ncell:C29:t:Southeast:l:1:f:4\ncell:D29:v:2000000:l:1:f:4:ntvf:1\ncell:E29:v:40000000:l:1:f:4:ntvf:1\ncell:F29:vtf:n:0.3669724770642202:IF(AND(SUM(D29),SUM(E29)),(SUM(E29)/SUM($E$31)),\"\"):l:1:f:4:ntvf:3\ncell:G29:vtf:n:166666.66666666666:IF(SUM(F29),(D29/12),\"\"):l:1:f:4:ntvf:1\ncell:H29:vtf:n:3333333.3333333335:IF(SUM(G29),(+E29/12),\"\"):l:1:f:4:ntvf:1\ncell:B30:l:1:f:4\ncell:C30:t:West:b:::1::l:1:f:4\ncell:D30:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E30:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F30:vtf:n:0.1651376146788991:IF(AND(SUM(D30),SUM(E30)),(SUM(E30)/SUM($E$31)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G30:vtf:n:75000:IF(SUM(F30),(D30/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H30:vtf:n:1500000:IF(SUM(G30),(+E30/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B31:l:1:f:4\ncell:C31:t:Total:b:1::::l:1:f:4\ncell:D31:vtf:n:5500000:IF(SUM(D27\\cD30),SUM(D27\\cD30),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E31:vtf:n:109000000:IF(SUM(E27\\cE30),SUM(E27\\cE30),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F31:vtf:n:0.1595900439238653:IF(AND(SUM(D31),SUM(E31)),(E31/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G31:vtf:n:458333.3333333334:IF(SUM(G27\\cG30),SUM(G27\\cG30),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H31:vtf:n:9083333.333333334:IF(SUM(H27\\cH30),SUM(H27\\cH30),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B32:t:Wholesalers / Company Owned Distributors:l:1:f:1\ncell:C32:l:1:f:4\ncell:D32:l:1:f:4:ntvf:1\ncell:E32:l:1:f:4:ntvf:2\ncell:F32:l:1:f:4\ncell:G32:l:1:f:4:ntvf:1\ncell:H32:l:1:f:4:ntvf:2\ncell:B33:l:1:f:4\ncell:C33:t:New York:l:1:f:4\ncell:D33:v:1100000:l:1:f:4:ntvf:1\ncell:E33:v:21000000:l:1:f:4:ntvf:2\ncell:F33:vtf:n:0.1926605504587156:IF(AND(SUM(D33),SUM(E33)),(SUM(E33)/SUM($E$37)),\"\"):l:1:f:4:ntvf:3\ncell:G33:vtf:n:91666.66666666667:IF(SUM(F33),(D33/12),\"\"):l:1:f:4:ntvf:1\ncell:H33:vtf:n:1750000:IF(SUM(G33),(+E33/12),\"\"):l:1:f:4:ntvf:2\ncell:B34:l:1:f:4\ncell:C34:t:Nashua:l:1:f:4\ncell:D34:v:1500000:l:1:f:4:ntvf:1\ncell:E34:v:30000000:l:1:f:4:ntvf:1\ncell:F34:vtf:n:0.27522935779816515:IF(AND(SUM(D34),SUM(E34)),(SUM(E34)/SUM($E$37)),\"\"):l:1:f:4:ntvf:3\ncell:G34:vtf:n:125000:IF(SUM(F34),(D34/12),\"\"):l:1:f:4:ntvf:1\ncell:H34:vtf:n:2500000:IF(SUM(G34),(+E34/12),\"\"):l:1:f:4:ntvf:1\ncell:B35:l:1:f:4\ncell:C35:t:Washington, DC:l:1:f:4\ncell:D35:v:2000000:l:1:f:4:ntvf:1\ncell:E35:v:40000000:l:1:f:4:ntvf:1\ncell:F35:vtf:n:0.3669724770642202:IF(AND(SUM(D35),SUM(E35)),(SUM(E35)/SUM($E$37)),\"\"):l:1:f:4:ntvf:3\ncell:G35:vtf:n:166666.66666666666:IF(SUM(F35),(D35/12),\"\"):l:1:f:4:ntvf:1\ncell:H35:vtf:n:3333333.3333333335:IF(SUM(G35),(+E35/12),\"\"):l:1:f:4:ntvf:1\ncell:B36:l:1:f:4\ncell:C36:t:Charleston, NC:b:::1::l:1:f:4\ncell:D36:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E36:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F36:vtf:n:0.1651376146788991:IF(AND(SUM(D36),SUM(E36)),(SUM(E36)/SUM($E$37)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G36:vtf:n:75000:IF(SUM(F36),(D36/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H36:vtf:n:1500000:IF(SUM(G36),(+E36/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B37:l:1:f:4\ncell:C37:t:Total:b:1::::l:1:f:4\ncell:D37:vtf:n:5500000:IF(SUM(D33\\cD36),SUM(D33\\cD36),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E37:vtf:n:109000000:IF(SUM(E33\\cE36),SUM(E33\\cE36),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F37:vtf:n:0.1595900439238653:IF(AND(SUM(D37),SUM(E37)),(E37/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G37:vtf:n:458333.3333333334:IF(SUM(G33\\cG36),SUM(G33\\cG36),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H37:vtf:n:9083333.333333334:IF(SUM(H33\\cH36),SUM(H33\\cH36),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B38:t:Wholesalers / Independent Distributors:l:1:f:1\ncell:C38:l:1:f:4\ncell:D38:l:1:f:4:ntvf:1\ncell:E38:l:1:f:4:ntvf:2\ncell:F38:l:1:f:4\ncell:G38:l:1:f:4:ntvf:1\ncell:H38:l:1:f:4:ntvf:2\ncell:B39:l:1:f:4\ncell:C39:t:Springfield:l:1:f:4\ncell:D39:v:1100000:l:1:f:4:ntvf:1\ncell:E39:v:21000000:l:1:f:4:ntvf:2\ncell:F39:vtf:n:0.1926605504587156:IF(AND(SUM(D39),SUM(E39)),(SUM(E39)/SUM($E$43)),\"\"):l:1:f:4:ntvf:3\ncell:G39:vtf:n:91666.66666666667:IF(SUM(F39),(D39/12),\"\"):l:1:f:4:ntvf:1\ncell:H39:vtf:n:1750000:IF(SUM(G39),(+E39/12),\"\"):l:1:f:4:ntvf:2\ncell:B40:l:1:f:4\ncell:C40:t:Cambridge:l:1:f:4\ncell:D40:v:1500000:l:1:f:4:ntvf:1\ncell:E40:v:30000000:l:1:f:4:ntvf:1\ncell:F40:vtf:n:0.27522935779816515:IF(AND(SUM(D40),SUM(E40)),(SUM(E40)/SUM($E$43)),\"\"):l:1:f:4:ntvf:3\ncell:G40:vtf:n:125000:IF(SUM(F40),(D40/12),\"\"):l:1:f:4:ntvf:1\ncell:H40:vtf:n:2500000:IF(SUM(G40),(+E40/12),\"\"):l:1:f:4:ntvf:1\ncell:B41:l:1:f:4\ncell:C41:t:Chicago:l:1:f:4\ncell:D41:v:2000000:l:1:f:4:ntvf:1\ncell:E41:v:40000000:l:1:f:4:ntvf:1\ncell:F41:vtf:n:0.3669724770642202:IF(AND(SUM(D41),SUM(E41)),(SUM(E41)/SUM($E$43)),\"\"):l:1:f:4:ntvf:3\ncell:G41:vtf:n:166666.66666666666:IF(SUM(F41),(D41/12),\"\"):l:1:f:4:ntvf:1\ncell:H41:vtf:n:3333333.3333333335:IF(SUM(G41),(+E41/12),\"\"):l:1:f:4:ntvf:1\ncell:B42:l:1:f:4\ncell:C42:t:San Francisco:b:::1::l:1:f:4\ncell:D42:v:900000:b:::1::l:1:f:4:ntvf:1\ncell:E42:v:18000000:b:::1::l:1:f:4:ntvf:1\ncell:F42:vtf:n:0.1651376146788991:IF(AND(SUM(D42),SUM(E42)),(SUM(E42)/SUM($E$43)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G42:vtf:n:75000:IF(SUM(F42),(D42/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H42:vtf:n:1500000:IF(SUM(G42),(+E42/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B43:l:1:f:4\ncell:C43:t:Total:b:1::::l:1:f:4\ncell:D43:vtf:n:5500000:IF(SUM(D39\\cD42),SUM(D39\\cD42),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:E43:vtf:n:109000000:IF(SUM(E39\\cE42),SUM(E39\\cE42),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:F43:vtf:n:0.1595900439238653:IF(AND(SUM(D43),SUM(E43)),(E43/$E$48),\"\"):b:1::::l:1:f:4:ntvf:3\ncell:G43:vtf:n:458333.3333333334:IF(SUM(G39\\cG42),SUM(G39\\cG42),\"\"):b:1::::l:1:f:4:ntvf:1\ncell:H43:vtf:n:9083333.333333334:IF(SUM(H39\\cH42),SUM(H39\\cH42),\"\"):b:1::::l:1:f:4:ntvf:2\ncell:B44:t:Other:l:1:f:1\ncell:C44:l:1:f:4\ncell:D44:l:1:f:4:ntvf:1\ncell:E44:l:1:f:4:ntvf:2\ncell:F44:l:1:f:4\ncell:G44:l:1:f:4:ntvf:1\ncell:H44:l:1:f:4:ntvf:2\ncell:B45:l:1:f:4\ncell:C45:t:On-Line / Mail Order:l:1:f:4\ncell:D45:v:1500000:l:1:f:4:ntvf:1\ncell:E45:v:30000000:l:1:f:4:ntvf:2\ncell:F45:vtf:n:1:IF(AND(SUM(D45),SUM(E45)),(SUM(E45)/SUM($E$47)),\"\"):l:1:f:4:ntvf:3\ncell:G45:vtf:n:125000:IF(SUM(F45),(D45/12),\"\"):l:1:f:4:ntvf:1\ncell:H45:vtf:n:2500000:IF(SUM(G45),(+E45/12),\"\"):l:1:f:4:ntvf:2\ncell:B46:l:1:f:4\ncell:C46:b:::1::l:1:f:4\ncell:D46:b:::1::l:1:f:4:ntvf:1\ncell:E46:b:::1::l:1:f:4:ntvf:1\ncell:F46:vtf:t::IF(AND(SUM(D46),SUM(E46)),(SUM(E46)/SUM($E$47)),\"\"):b:::1::l:1:f:4:ntvf:3\ncell:G46:vtf:t::IF(SUM(F46),(D46/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:H46:vtf:t::IF(SUM(G46),(+E46/12),\"\"):b:::1::l:1:f:4:ntvf:1\ncell:B47:l:1:f:4\ncell:C47:t:Total:b:1::::l:1:f:4\ncell:D47:vtf:n:1500000:IF(SUM(D45\\cD46),SUM(D45\\cD46),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:E47:vtf:n:30000000:IF(SUM(E45\\cE46),SUM(E45\\cE46),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:F47:vtf:n:1:IF(SUM(F45\\cF46),SUM(F45\\cF46),\"\"):b:1::1::l:1:f:4:ntvf:3\ncell:G47:vtf:n:125000:IF(SUM(G45\\cG46),SUM(G45\\cG46),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:H47:vtf:n:2500000:IF(SUM(H45\\cH46),SUM(H45\\cH46),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:B48:t:Totals for all Channels:l:1:f:1\ncell:C48:l:1:f:4\ncell:D48:vtf:n:34400000:IF(SUM(D13,D19,D25,D31,D37,D43,D47),SUM(D13,D19,D25,D31,D37,D43,D47),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:E48:vtf:n:683000000:IF(SUM(E13,E19,E25,E31,E37,E43,E47),SUM(E13,E19,E25,E31,E37,E43,E47),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:F48:vtf:n:1:IF(AND(SUM(D48\\cE48),SUM(E48)),(SUM(E48)/SUM(E48)),\"\"):b:1::1::l:1:f:4:ntvf:3\ncell:G48:vtf:n:2866666.6666666665:IF(SUM(F48),(D48/12),\"\"):b:1::1::l:1:f:4:ntvf:1\ncell:H48:vtf:n:56916666.666666664:IF(SUM(G48),(+E48/12),\"\"):b:1::1::l:1:f:4:ntvf:2\ncell:D49:b:1::::l:1:f:4\ncell:E49:b:1::::l:1:f:4\ncell:F49:b:1::::l:1:f:4\ncell:G49:b:1::::l:1:f:4\ncell:H49:b:1::::l:1:f:4\ncell:B50:t:© Copyright, 2011, Jaxworks, All Rights Reserved.:l:1:f:4\ncol:A:w:12\ncol:B:w:285\ncol:C:w:156\ncol:D:w:100\ncol:E:w:118\ncol:F:w:71\ncol:G:w:90\ncol:H:w:108\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nsheet:c:8:r:50:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:normal bold 10pt Arial\nfont:2:normal bold 14pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:3:0.0%\nvalueformat:4:mmmm d, yyyy\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet901","hidden":"1"},"sheet17":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Revenue:l:1:f:8:c:3:bg:1:cf:1:ntvf:1:colspan:5\ncell:D3:l:1:f:4:cf:1\ncell:E3:l:1:f:3:cf:1:ntvf:1\ncell:F3:l:1:f:3:cf:1:ntvf:1\ncell:G3:l:1:f:3:cf:1:ntvf:1\ncell:C4:t: XYZ, Inc. :l:1:f:7:cf:1:ntvf:1\ncell:D4:l:1:f:4\ncell:E4:l:1:f:2:cf:1:ntvf:1\ncell:F4:l:1:f:2:cf:1:ntvf:1\ncell:G4:l:1:f:2:cf:1:ntvf:1\ncell:C5:t: 2009 Sales:l:1:f:5:cf:1:ntvf:3\ncell:D5:l:1\ncell:E5:l:1:f:2:cf:1:ntvf:1\ncell:F5:l:1:f:2:cf:1:ntvf:1\ncell:G5:l:1:f:2:cf:1:ntvf:1\ncell:C6:l:1\ncell:D6:l:1:f:4:ntvf:1\ncell:E6:l:1:f:4:ntvf:1\ncell:F6:l:1:f:4:ntvf:1\ncell:G6:l:1:f:4:ntvf:1\ncell:C7:l:1:f:4:ntvf:1\ncell:D7:t: Retail :l:1:f:7:cf:1:ntvf:1\ncell:E7:t: Wholesale :l:1:f:7:cf:1:ntvf:1\ncell:F7:t: Mail Order :l:1:f:7:cf:1:ntvf:1\ncell:G7:t:Total Sales:l:1:f:7:cf:1:ntvf:1\ncell:C8:t: Camping Gear :l:1:f:7:ntvf:1\ncell:D8:l:1:f:4:ntvf:1\ncell:E8:l:1:f:4:ntvf:1\ncell:F8:l:1:f:4:ntvf:1\ncell:G8:l:1:f:4:ntvf:1\ncell:C9:t:Product:l:1:f:1:ntvf:1\ncell:D9:v:18000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:E9:v:24000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:F9:v:10000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:G9:vtf:n:52000:IF(SUM(D9\\cF9),SUM(D9\\cF9),\"\"):l:1:f:1:ntvf:2\ncell:H9:f:1\ncell:C10:t:Product:l:1:f:1:bg:2:ntvf:1\ncell:D10:v:14000:b:1:1:1:1:l:1:f:1:bg:2:ntvf:2\ncell:E10:v:15000:b:1:1:1:1:l:1:f:1:bg:2:ntvf:2\ncell:F10:v:9000:b:1:1:1:1:l:1:f:1:bg:2:ntvf:2\ncell:G10:vtf:n:38000:IF(SUM(D10\\cF10),SUM(D10\\cF10),\"\"):l:1:f:1:bg:2:ntvf:2\ncell:H10:f:1\ncell:C11:t:Product:l:1:f:1:ntvf:1\ncell:D11:v:8000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:E11:v:11000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:F11:v:7000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:G11:vtf:n:26000:IF(SUM(D11\\cF11),SUM(D11\\cF11),\"\"):l:1:f:1:ntvf:2\ncell:H11:f:1\ncell:C12:t:Product:l:1:f:1:bg:2:ntvf:1\ncell:D12:v:4000:b:1:1:1:1:l:1:f:1:bg:2:ntvf:2\ncell:E12:v:6000:b:1:1:1:1:l:1:f:1:bg:2:ntvf:2\ncell:F12:v:6000:b:1:1:1:1:l:1:f:1:bg:2:ntvf:2\ncell:G12:vtf:n:16000:IF(SUM(D12\\cF12),SUM(D12\\cF12),\"\"):l:1:f:1:bg:2:ntvf:2\ncell:H12:f:1\ncell:C13:t:Product:l:1:f:1:ntvf:1\ncell:D13:v:2000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:E13:v:3000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:F13:v:3000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:G13:vtf:n:8000:IF(SUM(D13\\cF13),SUM(D13\\cF13),\"\"):l:1:f:1:ntvf:2\ncell:H13:f:1\ncell:C14:l:1:f:1:ntvf:1\ncell:D14:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:E14:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:F14:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:G14:l:1:f:1:ntvf:2\ncell:H14:f:1\ncell:C15:t:Total :l:1:f:6:cf:2:ntvf:1\ncell:D15:vtf:n:46000:IF(SUM(D9\\cD13),SUM(D9\\cD13),\"\"):b:1::1::l:1:f:6:ntvf:2\ncell:E15:vtf:n:59000:IF(SUM(E9\\cE13),SUM(E9\\cE13),\"\"):b:1::1::l:1:f:6:ntvf:2\ncell:F15:vtf:n:35000:IF(SUM(F9\\cF13),SUM(F9\\cF13),\"\"):b:1::1::l:1:f:6:ntvf:2\ncell:G15:vtf:n:140000:IF(SUM(G9\\cG13),SUM(G9\\cG13),\"\"):b:1::1::l:1:f:6:ntvf:2\ncell:H15:f:6\ncol:A:w:10\ncol:B:w:10\ncol:C:w:309\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nsheet:c:8:r:15:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt Arial\nfont:6:normal normal 14pt *\nfont:7:normal normal 16pt Arial\nfont:8:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:#,##0.00;(#,##0.00)\nvalueformat:2:#,##0;(#,##0)\nvalueformat:3:@\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::C9\\c#REF!\nname:DATA_04::F9\\c#REF!\n"},"name":"sheet10","hidden":"1"},"sheet18":{"sheetstr":{"savestr":"version:1.5\ncell:B3:l:1:f:6:ntvf:1\ncell:C3:t:Sales Revenue:b:::1::l:2:f:5:cf:2:ntvf:1\ncell:D3:b:::1::l:2:f:6:cf:1\ncell:E3:b:::1::l:2:f:5:cf:1:ntvf:1\ncell:F3:b:::1::l:2:f:5:cf:1:ntvf:1\ncell:G3:b:::1::l:2:f:5:cf:1:ntvf:1\ncell:B4:l:1:f:6:ntvf:1\ncell:C4:t: XYZ, Inc. :b:1::::l:2:f:4:cf:1:ntvf:1\ncell:D4:b:1::::l:1:f:6\ncell:E4:b:1::::l:2:f:3:cf:1:ntvf:1\ncell:F4:b:1::::l:2:f:3:cf:1:ntvf:1\ncell:G4:b:1::::l:2:f:3:cf:1:ntvf:1\ncell:B5:l:1:f:6:ntvf:1\ncell:C5:t: 2009 Sales:l:2:f:3:cf:1:ntvf:3\ncell:E5:l:2:f:3:cf:1:ntvf:1\ncell:F5:l:2:f:3:cf:1:ntvf:1\ncell:G5:l:2:f:3:cf:1:ntvf:1\ncell:B6:l:1:f:6:ntvf:1\ncell:D6:b:::1::l:1:f:6:ntvf:1\ncell:E6:b:::1::l:1:f:6:ntvf:1\ncell:F6:b:::1::l:1:f:6:ntvf:1\ncell:G6:b:::1::l:1:f:6:ntvf:1\ncell:B7:l:1:f:6:ntvf:1\ncell:C7:b::1:::l:1:f:6:ntvf:1\ncell:D7:t: Retail :b:1::1:1:l:2:f:1:cf:3:ntvf:1\ncell:E7:t: Wholesale :b:1::1::l:2:f:1:cf:3:ntvf:1\ncell:F7:t: Mail Order :b:1::1::l:2:f:1:cf:3:ntvf:1\ncell:G7:t:Total Sales:b:1:1:1::l:2:f:1:cf:3:ntvf:1\ncell:B8:t: Camping Gear :l:1:f:2:ntvf:1\ncell:C8:l:1:f:1:ntvf:1\ncell:D8:b:1::::l:1:f:6:ntvf:1\ncell:E8:b:1::::l:1:f:6:ntvf:1\ncell:F8:b:1:1:::l:1:f:6:ntvf:1\ncell:G8:b:1:::1:l:1:f:6:ntvf:1\ncell:B9:l:1:f:6:ntvf:1\ncell:C9:t:Product:l:1:f:6:ntvf:1\ncell:D9:v:18000:l:1:f:6:ntvf:2\ncell:E9:v:24000:l:1:f:6:ntvf:2\ncell:F9:v:10000:b::1:::l:1:f:6:ntvf:2\ncell:G9:vtf:n:52000:IF(SUM(D9\\cF9),SUM(D9\\cF9),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B10:l:1:f:6:ntvf:1\ncell:C10:t:Product:l:1:f:6:ntvf:1\ncell:D10:v:14000:l:1:f:6:ntvf:2\ncell:E10:v:15000:l:1:f:6:ntvf:2\ncell:F10:v:9000:b::1:::l:1:f:6:ntvf:2\ncell:G10:vtf:n:38000:IF(SUM(D10\\cF10),SUM(D10\\cF10),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B11:l:1:f:6:ntvf:1\ncell:C11:t:Product:l:1:f:6:ntvf:1\ncell:D11:v:8000:l:1:f:6:ntvf:2\ncell:E11:v:11000:l:1:f:6:ntvf:2\ncell:F11:v:7000:b::1:::l:1:f:6:ntvf:2\ncell:G11:vtf:n:26000:IF(SUM(D11\\cF11),SUM(D11\\cF11),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B12:l:1:f:6:ntvf:1\ncell:C12:t:Product:l:1:f:6:ntvf:1\ncell:D12:v:4000:l:1:f:6:ntvf:2\ncell:E12:v:6000:l:1:f:6:ntvf:2\ncell:F12:v:6000:b::1:::l:1:f:6:ntvf:2\ncell:G12:vtf:n:16000:IF(SUM(D12\\cF12),SUM(D12\\cF12),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B13:l:1:f:6:ntvf:1\ncell:C13:t:Product:l:1:f:6:ntvf:1\ncell:D13:v:2000:l:1:f:6:ntvf:2\ncell:E13:v:3000:l:1:f:6:ntvf:2\ncell:F13:v:3000:b::1:::l:1:f:6:ntvf:2\ncell:G13:vtf:n:8000:IF(SUM(D13\\cF13),SUM(D13\\cF13),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B14:l:1:f:6:ntvf:1\ncell:C14:t:Total :l:2:f:1:cf:3:ntvf:1\ncell:D14:vtf:n:46000:IF(SUM(D9\\cD13),SUM(D9\\cD13),\"\"):l:2:f:1:ntvf:2\ncell:E14:vtf:n:59000:IF(SUM(E9\\cE13),SUM(E9\\cE13),\"\"):l:2:f:1:ntvf:2\ncell:F14:vtf:n:35000:IF(SUM(F9\\cF13),SUM(F9\\cF13),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G14:vtf:n:140000:IF(SUM(G9\\cG13),SUM(G9\\cG13),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:B15:l:1:f:6:ntvf:1\ncell:C15:l:1:f:6:ntvf:1\ncell:D15:l:1:f:6:ntvf:2\ncell:E15:l:1:f:6:ntvf:2\ncell:F15:b::1:::l:1:f:6:ntvf:2\ncell:G15:b::::1:l:1:f:6:ntvf:2\ncell:B16:t: Mountain Climbing :l:1:f:2:ntvf:1\ncell:C16:l:1:f:1:ntvf:1\ncell:D16:l:1:f:6:ntvf:2\ncell:E16:l:1:f:6:ntvf:2\ncell:F16:b::1:::l:1:f:6:ntvf:2\ncell:G16:b::::1:l:1:f:6:ntvf:2\ncell:B17:l:1:f:6:ntvf:1\ncell:C17:t:Product:l:1:f:6:ntvf:1\ncell:D17:v:4000:l:1:f:6:ntvf:2\ncell:E17:v:8000:l:1:f:6:ntvf:2\ncell:F17:v:6500:b::1:::l:1:f:6:ntvf:2\ncell:G17:vtf:n:18500:IF(SUM(D17\\cF17),SUM(D17\\cF17),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B18:l:1:f:6:ntvf:1\ncell:C18:t:Product:l:1:f:6:ntvf:1\ncell:D18:v:7000:l:1:f:6:ntvf:2\ncell:E18:v:15000:l:1:f:6:ntvf:2\ncell:F18:v:9000:b::1:::l:1:f:6:ntvf:2\ncell:G18:vtf:n:31000:IF(SUM(D18\\cF18),SUM(D18\\cF18),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B19:l:1:f:6:ntvf:1\ncell:C19:t:Product:l:1:f:6:ntvf:1\ncell:D19:v:6000:l:1:f:6:ntvf:2\ncell:E19:v:11000:l:1:f:6:ntvf:2\ncell:F19:v:8000:b::1:::l:1:f:6:ntvf:2\ncell:G19:vtf:n:25000:IF(SUM(D19\\cF19),SUM(D19\\cF19),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B20:l:1:f:6:ntvf:1\ncell:C20:t:Product:l:1:f:6:ntvf:1\ncell:D20:v:3000:l:1:f:6:ntvf:2\ncell:E20:v:5500:l:1:f:6:ntvf:2\ncell:F20:v:4500:b::1:::l:1:f:6:ntvf:2\ncell:G20:vtf:n:13000:IF(SUM(D20\\cF20),SUM(D20\\cF20),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B21:l:1:f:6:ntvf:1\ncell:C21:t:Product:l:1:f:6:ntvf:1\ncell:D21:v:2000:l:1:f:6:ntvf:2\ncell:E21:v:3500:l:1:f:6:ntvf:2\ncell:F21:v:3000:b::1:::l:1:f:6:ntvf:2\ncell:G21:vtf:n:8500:IF(SUM(D21\\cF21),SUM(D21\\cF21),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B22:l:1:f:6:ntvf:1\ncell:C22:t:Total :l:2:f:1:cf:3:ntvf:1\ncell:D22:vtf:n:22000:IF(SUM(D17\\cD21),SUM(D17\\cD21),\"\"):l:2:f:1:ntvf:2\ncell:E22:vtf:n:43000:IF(SUM(E17\\cE21),SUM(E17\\cE21),\"\"):l:2:f:1:ntvf:2\ncell:F22:vtf:n:31000:IF(SUM(F17\\cF21),SUM(F17\\cF21),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G22:vtf:n:96000:IF(SUM(G17\\cG21),SUM(G17\\cG21),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:B23:l:1:f:6:ntvf:1\ncell:C23:l:1:f:6:ntvf:1\ncell:D23:l:1:f:6:ntvf:2\ncell:E23:l:1:f:6:ntvf:2\ncell:F23:b::1:::l:1:f:6:ntvf:2\ncell:G23:b::::1:l:1:f:6:ntvf:2\ncell:B24:t: Men's Clothing :l:1:f:2:ntvf:1\ncell:C24:l:1:f:1:ntvf:1\ncell:D24:l:1:f:6:ntvf:2\ncell:E24:l:1:f:6:ntvf:2\ncell:F24:b::1:::l:1:f:6:ntvf:2\ncell:G24:b::::1:l:1:f:6:ntvf:2\ncell:B25:l:1:f:6:ntvf:1\ncell:C25:t:Product:l:1:f:6:ntvf:1\ncell:D25:v:16000:l:1:f:6:ntvf:2\ncell:E25:v:30000:l:1:f:6:ntvf:2\ncell:F25:v:15000:b::1:::l:1:f:6:ntvf:2\ncell:G25:vtf:n:61000:IF(SUM(D25\\cF25),SUM(D25\\cF25),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B26:l:1:f:6:ntvf:1\ncell:C26:t:Product:l:1:f:6:ntvf:1\ncell:D26:v:18000:l:1:f:6:ntvf:2\ncell:E26:v:32000:l:1:f:6:ntvf:2\ncell:F26:v:18000:b::1:::l:1:f:6:ntvf:2\ncell:G26:vtf:n:68000:IF(SUM(D26\\cF26),SUM(D26\\cF26),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B27:l:1:f:6:ntvf:1\ncell:C27:t:Product:l:1:f:6:ntvf:1\ncell:D27:v:24000:l:1:f:6:ntvf:2\ncell:E27:v:46000:l:1:f:6:ntvf:2\ncell:F27:v:38000:b::1:::l:1:f:6:ntvf:2\ncell:G27:vtf:n:108000:IF(SUM(D27\\cF27),SUM(D27\\cF27),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B28:l:1:f:6:ntvf:1\ncell:C28:t:Product:l:1:f:6:ntvf:1\ncell:D28:v:16000:l:1:f:6:ntvf:2\ncell:E28:v:32000:l:1:f:6:ntvf:2\ncell:F28:v:19000:b::1:::l:1:f:6:ntvf:2\ncell:G28:vtf:n:67000:IF(SUM(D28\\cF28),SUM(D28\\cF28),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B29:l:1:f:6:ntvf:1\ncell:C29:t:Product:l:1:f:6:ntvf:1\ncell:D29:v:8000:l:1:f:6:ntvf:2\ncell:E29:v:12000:l:1:f:6:ntvf:2\ncell:F29:v:10000:b::1:::l:1:f:6:ntvf:2\ncell:G29:vtf:n:30000:IF(SUM(D29\\cF29),SUM(D29\\cF29),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B30:l:1:f:6:ntvf:1\ncell:C30:t:Total :l:2:f:1:cf:3:ntvf:1\ncell:D30:vtf:n:82000:IF(SUM(D25\\cD29),SUM(D25\\cD29),\"\"):l:2:f:1:ntvf:2\ncell:E30:vtf:n:152000:IF(SUM(E25\\cE29),SUM(E25\\cE29),\"\"):l:2:f:1:ntvf:2\ncell:F30:vtf:n:100000:IF(SUM(F25\\cF29),SUM(F25\\cF29),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G30:vtf:n:334000:IF(SUM(G25\\cG29),SUM(G25\\cG29),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:B31:l:1:f:6:ntvf:1\ncell:C31:l:1:f:6:ntvf:1\ncell:D31:l:1:f:6:ntvf:2\ncell:E31:l:1:f:6:ntvf:2\ncell:F31:b::1:::l:1:f:6:ntvf:2\ncell:G31:b::::1:l:1:f:6:ntvf:2\ncell:B32:t: Women's Clothing :l:1:f:2:ntvf:1\ncell:C32:l:1:f:1:ntvf:1\ncell:D32:l:1:f:6:ntvf:2\ncell:E32:l:1:f:6:ntvf:2\ncell:F32:b::1:::l:1:f:6:ntvf:2\ncell:G32:b::::1:l:1:f:6:ntvf:2\ncell:B33:l:1:f:6:ntvf:1\ncell:C33:t:Product:l:1:f:6:ntvf:1\ncell:D33:v:13000:l:1:f:6:ntvf:2\ncell:E33:v:26000:l:1:f:6:ntvf:2\ncell:F33:v:12000:b::1:::l:1:f:6:ntvf:2\ncell:G33:vtf:n:51000:IF(SUM(D33\\cF33),SUM(D33\\cF33),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B34:l:1:f:6:ntvf:1\ncell:C34:t:Product:l:1:f:6:ntvf:1\ncell:D34:v:17000:l:1:f:6:ntvf:2\ncell:E34:v:32000:l:1:f:6:ntvf:2\ncell:F34:v:15000:b::1:::l:1:f:6:ntvf:2\ncell:G34:vtf:n:64000:IF(SUM(D34\\cF34),SUM(D34\\cF34),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B35:l:1:f:6:ntvf:1\ncell:C35:t:Product:l:1:f:6:ntvf:1\ncell:D35:v:21000:l:1:f:6:ntvf:2\ncell:E35:v:42000:l:1:f:6:ntvf:2\ncell:F35:v:33000:b::1:::l:1:f:6:ntvf:2\ncell:G35:vtf:n:96000:IF(SUM(D35\\cF35),SUM(D35\\cF35),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B36:l:1:f:6:ntvf:1\ncell:C36:t:Product:l:1:f:6:ntvf:1\ncell:D36:v:11000:l:1:f:6:ntvf:2\ncell:E36:v:19000:l:1:f:6:ntvf:2\ncell:F36:v:17500:b::1:::l:1:f:6:ntvf:2\ncell:G36:vtf:n:47500:IF(SUM(D36\\cF36),SUM(D36\\cF36),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B37:l:1:f:6:ntvf:1\ncell:C37:t:Product:l:1:f:6:ntvf:1\ncell:D37:v:6500:l:1:f:6:ntvf:2\ncell:E37:v:11500:l:1:f:6:ntvf:2\ncell:F37:v:8500:b::1:::l:1:f:6:ntvf:2\ncell:G37:vtf:n:26500:IF(SUM(D37\\cF37),SUM(D37\\cF37),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B38:l:1:f:6:ntvf:1\ncell:C38:t:Total :l:2:f:1:cf:3:ntvf:1\ncell:D38:vtf:n:68500:IF(SUM(D33\\cD37),SUM(D33\\cD37),\"\"):l:2:f:1:ntvf:2\ncell:E38:vtf:n:130500:IF(SUM(E33\\cE37),SUM(E33\\cE37),\"\"):l:2:f:1:ntvf:2\ncell:F38:vtf:n:86000:IF(SUM(F33\\cF37),SUM(F33\\cF37),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G38:vtf:n:285000:IF(SUM(G33\\cG37),SUM(G33\\cG37),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:B39:l:1:f:6:ntvf:1\ncell:C39:l:1:f:6:ntvf:1\ncell:D39:l:1:f:6:ntvf:2\ncell:E39:l:1:f:6:ntvf:2\ncell:F39:b::1:::l:1:f:6:ntvf:2\ncell:G39:b::::1:l:1:f:6:ntvf:2\ncell:B40:t: Kids Corner :l:1:f:2:ntvf:1\ncell:C40:l:1:f:1:ntvf:1\ncell:D40:l:1:f:6:ntvf:2\ncell:E40:l:1:f:6:ntvf:2\ncell:F40:b::1:::l:1:f:6:ntvf:2\ncell:G40:b::::1:l:1:f:6:ntvf:2\ncell:B41:l:1:f:6:ntvf:1\ncell:C41:t:Product:l:1:f:6:ntvf:1\ncell:D41:v:7000:l:1:f:6:ntvf:2\ncell:E41:v:13000:l:1:f:6:ntvf:2\ncell:F41:v:9000:b::1:::l:1:f:6:ntvf:2\ncell:G41:vtf:n:29000:IF(SUM(D41\\cF41),SUM(D41\\cF41),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B42:l:1:f:6:ntvf:1\ncell:C42:t:Product:l:1:f:6:ntvf:1\ncell:D42:v:8500:l:1:f:6:ntvf:2\ncell:E42:v:16000:l:1:f:6:ntvf:2\ncell:F42:v:11000:b::1:::l:1:f:6:ntvf:2\ncell:G42:vtf:n:35500:IF(SUM(D42\\cF42),SUM(D42\\cF42),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B43:l:1:f:6:ntvf:1\ncell:C43:t:Product:l:1:f:6:ntvf:1\ncell:D43:v:13000:l:1:f:6:ntvf:2\ncell:E43:v:22000:l:1:f:6:ntvf:2\ncell:F43:v:17000:b::1:::l:1:f:6:ntvf:2\ncell:G43:vtf:n:52000:IF(SUM(D43\\cF43),SUM(D43\\cF43),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B44:l:1:f:6:ntvf:1\ncell:C44:t:Product:l:1:f:6:ntvf:1\ncell:D44:v:6000:l:1:f:6:ntvf:2\ncell:E44:v:11000:l:1:f:6:ntvf:2\ncell:F44:v:9000:b::1:::l:1:f:6:ntvf:2\ncell:G44:vtf:n:26000:IF(SUM(D44\\cF44),SUM(D44\\cF44),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B45:l:1:f:6:ntvf:1\ncell:C45:t:Product:l:1:f:6:ntvf:1\ncell:D45:v:4000:l:1:f:6:ntvf:2\ncell:E45:v:7000:l:1:f:6:ntvf:2\ncell:F45:v:6500:b::1:::l:1:f:6:ntvf:2\ncell:G45:vtf:n:17500:IF(SUM(D45\\cF45),SUM(D45\\cF45),\"\"):b::::1:l:1:f:6:ntvf:2\ncell:B46:l:1:f:6:ntvf:1\ncell:C46:t:Total :l:2:f:1:cf:3:ntvf:1\ncell:D46:vtf:n:38500:IF(SUM(D41\\cD45),SUM(D41\\cD45),\"\"):l:2:f:1:ntvf:2\ncell:E46:vtf:n:69000:IF(SUM(E41\\cE45),SUM(E41\\cE45),\"\"):l:2:f:1:ntvf:2\ncell:F46:vtf:n:52500:IF(SUM(F41\\cF45),SUM(F41\\cF45),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G46:vtf:n:160000:IF(SUM(G41\\cG45),SUM(G41\\cG45),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:C49:l:1:f:6\ncol:B:w:162\ncol:C:w:309\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:15\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:15\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:15\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:15\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:49:h:14.25\nsheet:c:7:r:49:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\nfont:1:normal bold 10pt Arial\nfont:2:normal bold 11pt Arial\nfont:3:normal bold 12pt Arial\nfont:4:normal bold 16pt Arial\nfont:5:normal bold 26pt Times New Roman\nfont:6:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00;(#,##0.00)\nvalueformat:2:#,##0;(#,##0)\nvalueformat:3:@\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet12","hidden":"1"},"sheet19":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Revenue:b:::1::l:2:f:4:cf:1:ntvf:1:colspan:5\ncell:D3:b:::1::l:2:f:5:cf:1\ncell:E3:b:::1::l:2:f:4:cf:1:ntvf:1\ncell:F3:b:::1::l:2:f:4:cf:1:ntvf:1\ncell:G3:b:::1::l:2:f:4:cf:1:ntvf:1\ncell:C4:t: XYZ, Inc. :b:1::::l:2:f:3:cf:1:ntvf:1\ncell:D4:b:1::::l:1:f:5\ncell:E4:b:1::::l:2:f:2:cf:1:ntvf:1\ncell:F4:b:1::::l:2:f:2:cf:1:ntvf:1\ncell:G4:b:1::::l:2:f:2:cf:1:ntvf:1\ncell:C5:t: 2009 Sales:l:2:f:2:cf:1:ntvf:3\ncell:E5:l:2:f:2:cf:1:ntvf:1\ncell:F5:l:2:f:2:cf:1:ntvf:1\ncell:G5:l:2:f:2:cf:1:ntvf:1\ncell:D6:b:::1::l:1:f:5:ntvf:1\ncell:E6:b:::1::l:1:f:5:ntvf:1\ncell:F6:b:::1::l:1:f:5:ntvf:1\ncell:G6:b:::1::l:1:f:5:ntvf:1\ncell:C7:b::1:::l:1:f:5:ntvf:1\ncell:D7:t: Retail :b:1::1:1:l:2:f:1:cf:2:ntvf:1\ncell:E7:t: Wholesale :b:1::1::l:2:f:1:cf:2:ntvf:1\ncell:F7:t: Mail Order :b:1::1::l:2:f:1:cf:2:ntvf:1\ncell:G7:t:Total Sales:b:1:1:1::l:2:f:1:cf:2:ntvf:1\ncell:C8:t: Camping Gear :l:1:f:1:ntvf:1\ncell:D8:b:1::::l:1:f:5:ntvf:1\ncell:E8:b:1::::l:1:f:5:ntvf:1\ncell:F8:b:1:1:::l:1:f:5:ntvf:1\ncell:G8:b:1:::1:l:1:f:5:ntvf:1\ncell:C9:t:Product:l:1:f:5:ntvf:1\ncell:D9:v:18000:l:1:f:5:ntvf:2\ncell:E9:v:24000:l:1:f:5:ntvf:2\ncell:F9:v:10000:b::1:::l:1:f:5:ntvf:2\ncell:G9:vtf:n:52000:IF(SUM(D9\\cF9),SUM(D9\\cF9),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C10:t:Product:l:1:f:5:ntvf:1\ncell:D10:v:14000:l:1:f:5:ntvf:2\ncell:E10:v:15000:l:1:f:5:ntvf:2\ncell:F10:v:9000:b::1:::l:1:f:5:ntvf:2\ncell:G10:vtf:n:38000:IF(SUM(D10\\cF10),SUM(D10\\cF10),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C11:t:Product:l:1:f:5:ntvf:1\ncell:D11:v:8000:l:1:f:5:ntvf:2\ncell:E11:v:11000:l:1:f:5:ntvf:2\ncell:F11:v:7000:b::1:::l:1:f:5:ntvf:2\ncell:G11:vtf:n:26000:IF(SUM(D11\\cF11),SUM(D11\\cF11),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C12:t:Product:l:1:f:5:ntvf:1\ncell:D12:v:4000:l:1:f:5:ntvf:2\ncell:E12:v:6000:l:1:f:5:ntvf:2\ncell:F12:v:6000:b::1:::l:1:f:5:ntvf:2\ncell:G12:vtf:n:16000:IF(SUM(D12\\cF12),SUM(D12\\cF12),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C13:t:Product:l:1:f:5:ntvf:1\ncell:D13:v:2000:l:1:f:5:ntvf:2\ncell:E13:v:3000:l:1:f:5:ntvf:2\ncell:F13:v:3000:b::1:::l:1:f:5:ntvf:2\ncell:G13:vtf:n:8000:IF(SUM(D13\\cF13),SUM(D13\\cF13),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C14:t:Total :l:2:f:1:cf:2:ntvf:1\ncell:D14:vtf:n:46000:IF(SUM(D9\\cD13),SUM(D9\\cD13),\"\"):l:2:f:1:ntvf:2\ncell:E14:vtf:n:59000:IF(SUM(E9\\cE13),SUM(E9\\cE13),\"\"):l:2:f:1:ntvf:2\ncell:F14:vtf:n:35000:IF(SUM(F9\\cF13),SUM(F9\\cF13),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G14:vtf:n:140000:IF(SUM(G9\\cG13),SUM(G9\\cG13),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:C15:l:1:f:5:ntvf:1\ncell:D15:l:1:f:5:ntvf:2\ncell:E15:l:1:f:5:ntvf:2\ncell:F15:b::1:::l:1:f:5:ntvf:2\ncell:G15:b::::1:l:1:f:5:ntvf:2\ncell:C16:t: Mountain Climbing :l:1:f:1:ntvf:1\ncell:D16:l:1:f:5:ntvf:2\ncell:E16:l:1:f:5:ntvf:2\ncell:F16:b::1:::l:1:f:5:ntvf:2\ncell:G16:b::::1:l:1:f:5:ntvf:2\ncell:C17:t:Product:l:1:f:5:ntvf:1\ncell:D17:v:4000:l:1:f:5:ntvf:2\ncell:E17:v:8000:l:1:f:5:ntvf:2\ncell:F17:v:6500:b::1:::l:1:f:5:ntvf:2\ncell:G17:vtf:n:18500:IF(SUM(D17\\cF17),SUM(D17\\cF17),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C18:t:Product:l:1:f:5:ntvf:1\ncell:D18:v:7000:l:1:f:5:ntvf:2\ncell:E18:v:15000:l:1:f:5:ntvf:2\ncell:F18:v:9000:b::1:::l:1:f:5:ntvf:2\ncell:G18:vtf:n:31000:IF(SUM(D18\\cF18),SUM(D18\\cF18),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C19:t:Product:l:1:f:5:ntvf:1\ncell:D19:v:6000:l:1:f:5:ntvf:2\ncell:E19:v:11000:l:1:f:5:ntvf:2\ncell:F19:v:8000:b::1:::l:1:f:5:ntvf:2\ncell:G19:vtf:n:25000:IF(SUM(D19\\cF19),SUM(D19\\cF19),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C20:t:Product:l:1:f:5:ntvf:1\ncell:D20:v:3000:l:1:f:5:ntvf:2\ncell:E20:v:5500:l:1:f:5:ntvf:2\ncell:F20:v:4500:b::1:::l:1:f:5:ntvf:2\ncell:G20:vtf:n:13000:IF(SUM(D20\\cF20),SUM(D20\\cF20),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C21:t:Product:l:1:f:5:ntvf:1\ncell:D21:v:2000:l:1:f:5:ntvf:2\ncell:E21:v:3500:l:1:f:5:ntvf:2\ncell:F21:v:3000:b::1:::l:1:f:5:ntvf:2\ncell:G21:vtf:n:8500:IF(SUM(D21\\cF21),SUM(D21\\cF21),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C22:t:Total :l:2:f:1:cf:2:ntvf:1\ncell:D22:vtf:n:22000:IF(SUM(D17\\cD21),SUM(D17\\cD21),\"\"):l:2:f:1:ntvf:2\ncell:E22:vtf:n:43000:IF(SUM(E17\\cE21),SUM(E17\\cE21),\"\"):l:2:f:1:ntvf:2\ncell:F22:vtf:n:31000:IF(SUM(F17\\cF21),SUM(F17\\cF21),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G22:vtf:n:96000:IF(SUM(G17\\cG21),SUM(G17\\cG21),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:C23:l:1:f:5:ntvf:1\ncell:D23:l:1:f:5:ntvf:2\ncell:E23:l:1:f:5:ntvf:2\ncell:F23:b::1:::l:1:f:5:ntvf:2\ncell:G23:b::::1:l:1:f:5:ntvf:2\ncell:C24:t: Men's Clothing :l:1:f:1:ntvf:1\ncell:D24:l:1:f:5:ntvf:2\ncell:E24:l:1:f:5:ntvf:2\ncell:F24:b::1:::l:1:f:5:ntvf:2\ncell:G24:b::::1:l:1:f:5:ntvf:2\ncell:C25:t:Product:l:1:f:5:ntvf:1\ncell:D25:v:16000:l:1:f:5:ntvf:2\ncell:E25:v:30000:l:1:f:5:ntvf:2\ncell:F25:v:15000:b::1:::l:1:f:5:ntvf:2\ncell:G25:vtf:n:61000:IF(SUM(D25\\cF25),SUM(D25\\cF25),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C26:t:Product:l:1:f:5:ntvf:1\ncell:D26:v:18000:l:1:f:5:ntvf:2\ncell:E26:v:32000:l:1:f:5:ntvf:2\ncell:F26:v:18000:b::1:::l:1:f:5:ntvf:2\ncell:G26:vtf:n:68000:IF(SUM(D26\\cF26),SUM(D26\\cF26),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C27:t:Product:l:1:f:5:ntvf:1\ncell:D27:v:24000:l:1:f:5:ntvf:2\ncell:E27:v:46000:l:1:f:5:ntvf:2\ncell:F27:v:38000:b::1:::l:1:f:5:ntvf:2\ncell:G27:vtf:n:108000:IF(SUM(D27\\cF27),SUM(D27\\cF27),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C28:t:Product:l:1:f:5:ntvf:1\ncell:D28:v:16000:l:1:f:5:ntvf:2\ncell:E28:v:32000:l:1:f:5:ntvf:2\ncell:F28:v:19000:b::1:::l:1:f:5:ntvf:2\ncell:G28:vtf:n:67000:IF(SUM(D28\\cF28),SUM(D28\\cF28),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C29:t:Product:l:1:f:5:ntvf:1\ncell:D29:v:8000:l:1:f:5:ntvf:2\ncell:E29:v:12000:l:1:f:5:ntvf:2\ncell:F29:v:10000:b::1:::l:1:f:5:ntvf:2\ncell:G29:vtf:n:30000:IF(SUM(D29\\cF29),SUM(D29\\cF29),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C30:t:Total :l:2:f:1:cf:2:ntvf:1\ncell:D30:vtf:n:82000:IF(SUM(D25\\cD29),SUM(D25\\cD29),\"\"):l:2:f:1:ntvf:2\ncell:E30:vtf:n:152000:IF(SUM(E25\\cE29),SUM(E25\\cE29),\"\"):l:2:f:1:ntvf:2\ncell:F30:vtf:n:100000:IF(SUM(F25\\cF29),SUM(F25\\cF29),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G30:vtf:n:334000:IF(SUM(G25\\cG29),SUM(G25\\cG29),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:C31:l:1:f:5:ntvf:1\ncell:D31:l:1:f:5:ntvf:2\ncell:E31:l:1:f:5:ntvf:2\ncell:F31:b::1:::l:1:f:5:ntvf:2\ncell:G31:b::::1:l:1:f:5:ntvf:2\ncell:C32:t: Women's Clothing :l:1:f:1:ntvf:1\ncell:D32:l:1:f:5:ntvf:2\ncell:E32:l:1:f:5:ntvf:2\ncell:F32:b::1:::l:1:f:5:ntvf:2\ncell:G32:b::::1:l:1:f:5:ntvf:2\ncell:C33:t:Product:l:1:f:5:ntvf:1\ncell:D33:v:13000:l:1:f:5:ntvf:2\ncell:E33:v:26000:l:1:f:5:ntvf:2\ncell:F33:v:12000:b::1:::l:1:f:5:ntvf:2\ncell:G33:vtf:n:51000:IF(SUM(D33\\cF33),SUM(D33\\cF33),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C34:t:Product:l:1:f:5:ntvf:1\ncell:D34:v:17000:l:1:f:5:ntvf:2\ncell:E34:v:32000:l:1:f:5:ntvf:2\ncell:F34:v:15000:b::1:::l:1:f:5:ntvf:2\ncell:G34:vtf:n:64000:IF(SUM(D34\\cF34),SUM(D34\\cF34),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C35:t:Product:l:1:f:5:ntvf:1\ncell:D35:v:21000:l:1:f:5:ntvf:2\ncell:E35:v:42000:l:1:f:5:ntvf:2\ncell:F35:v:33000:b::1:::l:1:f:5:ntvf:2\ncell:G35:vtf:n:96000:IF(SUM(D35\\cF35),SUM(D35\\cF35),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C36:t:Product:l:1:f:5:ntvf:1\ncell:D36:v:11000:l:1:f:5:ntvf:2\ncell:E36:v:19000:l:1:f:5:ntvf:2\ncell:F36:v:17500:b::1:::l:1:f:5:ntvf:2\ncell:G36:vtf:n:47500:IF(SUM(D36\\cF36),SUM(D36\\cF36),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C37:t:Product:l:1:f:5:ntvf:1\ncell:D37:v:6500:l:1:f:5:ntvf:2\ncell:E37:v:11500:l:1:f:5:ntvf:2\ncell:F37:v:8500:b::1:::l:1:f:5:ntvf:2\ncell:G37:vtf:n:26500:IF(SUM(D37\\cF37),SUM(D37\\cF37),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C38:t:Total :l:2:f:1:cf:2:ntvf:1\ncell:D38:vtf:n:68500:IF(SUM(D33\\cD37),SUM(D33\\cD37),\"\"):l:2:f:1:ntvf:2\ncell:E38:vtf:n:130500:IF(SUM(E33\\cE37),SUM(E33\\cE37),\"\"):l:2:f:1:ntvf:2\ncell:F38:vtf:n:86000:IF(SUM(F33\\cF37),SUM(F33\\cF37),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G38:vtf:n:285000:IF(SUM(G33\\cG37),SUM(G33\\cG37),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:C39:l:1:f:5:ntvf:1\ncell:D39:l:1:f:5:ntvf:2\ncell:E39:l:1:f:5:ntvf:2\ncell:F39:b::1:::l:1:f:5:ntvf:2\ncell:G39:b::::1:l:1:f:5:ntvf:2\ncell:C40:t: Kids Corner :l:1:f:1:ntvf:1\ncell:D40:l:1:f:5:ntvf:2\ncell:E40:l:1:f:5:ntvf:2\ncell:F40:b::1:::l:1:f:5:ntvf:2\ncell:G40:b::::1:l:1:f:5:ntvf:2\ncell:C41:t:Product:l:1:f:5:ntvf:1\ncell:D41:v:7000:l:1:f:5:ntvf:2\ncell:E41:v:13000:l:1:f:5:ntvf:2\ncell:F41:v:9000:b::1:::l:1:f:5:ntvf:2\ncell:G41:vtf:n:29000:IF(SUM(D41\\cF41),SUM(D41\\cF41),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C42:t:Product:l:1:f:5:ntvf:1\ncell:D42:v:8500:l:1:f:5:ntvf:2\ncell:E42:v:16000:l:1:f:5:ntvf:2\ncell:F42:v:11000:b::1:::l:1:f:5:ntvf:2\ncell:G42:vtf:n:35500:IF(SUM(D42\\cF42),SUM(D42\\cF42),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C43:t:Product:l:1:f:5:ntvf:1\ncell:D43:v:13000:l:1:f:5:ntvf:2\ncell:E43:v:22000:l:1:f:5:ntvf:2\ncell:F43:v:17000:b::1:::l:1:f:5:ntvf:2\ncell:G43:vtf:n:52000:IF(SUM(D43\\cF43),SUM(D43\\cF43),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C44:t:Product:l:1:f:5:ntvf:1\ncell:D44:v:6000:l:1:f:5:ntvf:2\ncell:E44:v:11000:l:1:f:5:ntvf:2\ncell:F44:v:9000:b::1:::l:1:f:5:ntvf:2\ncell:G44:vtf:n:26000:IF(SUM(D44\\cF44),SUM(D44\\cF44),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C45:t:Product:l:1:f:5:ntvf:1\ncell:D45:v:4000:l:1:f:5:ntvf:2\ncell:E45:v:7000:l:1:f:5:ntvf:2\ncell:F45:v:6500:b::1:::l:1:f:5:ntvf:2\ncell:G45:vtf:n:17500:IF(SUM(D45\\cF45),SUM(D45\\cF45),\"\"):b::::1:l:1:f:5:ntvf:2\ncell:C46:t:Total :l:2:f:1:cf:2:ntvf:1\ncell:D46:vtf:n:38500:IF(SUM(D41\\cD45),SUM(D41\\cD45),\"\"):l:2:f:1:ntvf:2\ncell:E46:vtf:n:69000:IF(SUM(E41\\cE45),SUM(E41\\cE45),\"\"):l:2:f:1:ntvf:2\ncell:F46:vtf:n:52500:IF(SUM(F41\\cF45),SUM(F41\\cF45),\"\"):b::1:::l:2:f:1:ntvf:2\ncell:G46:vtf:n:160000:IF(SUM(G41\\cG45),SUM(G41\\cG45),\"\"):b::::1:l:2:f:1:ntvf:2\ncell:C49:l:1:f:5\ncol:A:w:10\ncol:B:w:10\ncol:C:w:309\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:15\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:15\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:15\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:15\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:49:h:14.25\nsheet:c:7:r:49:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:right\nfont:1:normal bold 10pt Arial\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 16pt Arial\nfont:4:normal bold 26pt Times New Roman\nfont:5:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0.00;(#,##0.00)\nvalueformat:2:#,##0;(#,##0)\nvalueformat:3:@\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet13","hidden":"1"},"sheet20":{"sheetstr":{"savestr":"version:1.5\ncell:B1:l:2:f:4\ncell:C3:t:Sales Seasonality by Month:l:1:f:8:c:3:bg:1:cf:1:colspan:6\ncell:D3:l:1:f:4:cf:1\ncell:E3:l:1:f:4:cf:1\ncell:F3:l:1:f:4:cf:1\ncell:G3:l:1:f:4:cf:1\ncell:H3:l:1:f:4:cf:1\ncell:D4:l:1:f:4:cf:1\ncell:E4:l:1:f:4:cf:1\ncell:F4:l:1:f:4:cf:1\ncell:G4:l:1:f:4:cf:1\ncell:H4:l:1:f:4:cf:1\ncell:C5:t:For the Year 2009:l:1:f:7:cf:1:colspan:2\ncell:D5:l:1:f:4:cf:1\ncell:E5:l:1:f:4:cf:1\ncell:F5:l:1:f:4:cf:1\ncell:G5:l:1:f:4:cf:1\ncell:H5:l:1:f:4:cf:1\ncell:D6:l:1:f:4:cf:2\ncell:E6:l:1:f:4:cf:2\ncell:F6:l:1:f:4:cf:2\ncell:G6:l:1:f:4:cf:2\ncell:H6:l:1:f:4:cf:2\ncell:C7:l:1:f:4\ncell:D7:l:1:f:4:cf:2\ncell:E7:l:1:f:4:cf:2\ncell:F7:l:1:f:4:cf:2\ncell:G7:l:1:f:4:cf:2\ncell:H7:l:1:f:4:cf:2\ncell:C8:l:1:f:4\ncell:D8:t:Actual sales:l:1:f:7:cf:1\ncell:E8:t:% of Sales:l:1:f:7:cf:1\ncell:F8:t:Company Index To Average:l:1:f:7:cf:1\ncell:G8:t:Industry % of Sales:l:1:f:7:cf:1\ncell:H8:t:Industry Index to Average:l:1:f:7:cf:1\ncell:C9:l:1:f:4\ncell:D9:l:1:f:2:cf:1\ncell:E9:l:1:f:2:cf:1\ncell:F9:l:1:f:2:cf:1\ncell:G9:l:1:f:2:cf:1\ncell:H9:l:1:f:2:cf:1\ncell:C10:t:Jan:l:1:f:1\ncell:D10:v:100000:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:E10:vtf:n:0.0775416776922851:IF(D10,(D10/D23),\"\"):l:1:f:1:ntvf:4\ncell:F10:vtf:n:0.9305001323074212:IF(D10,(D10/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:ntvf:3\ncell:G10:v:0.07:b:1:1:1:1:l:1:f:1:ntvf:3\ncell:H10:vtf:n:0.8400000000000001:IF(G10,(G10/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:ntvf:3\ncell:I10:f:1\ncell:C11:t:Feb:l:1:f:1:bg:2\ncell:D11:v:101300:b:1:1:1:1:l:1:f:1:bg:2:ntvf:1\ncell:E11:vtf:n:0.0785497195022848:IF(D11,(D11/D23),\"\"):l:1:f:1:bg:2:ntvf:4\ncell:F11:vtf:n:0.9425966340274177:IF(D11,(D11/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:G11:v:0.075:b:1:1:1:1:l:1:f:1:bg:2:ntvf:3\ncell:H11:vtf:n:0.9:IF(G11,(G11/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:I11:f:1\ncell:C12:t:Mar:l:1:f:1\ncell:D12:v:102616.9:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:E12:vtf:n:0.07957086585581451:IF(D12,(D12/D23),\"\"):l:1:f:1:ntvf:4\ncell:F12:vtf:n:0.9548503902697741:IF(D12,(D12/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:ntvf:3\ncell:G12:v:0.09:b:1:1:1:1:l:1:f:1:ntvf:3\ncell:H12:vtf:n:1.08:IF(G12,(G12/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:ntvf:3\ncell:I12:f:1\ncell:C13:t:Apr:l:1:f:1:bg:2\ncell:D13:v:103950.9197:b:1:1:1:1:l:1:f:1:bg:2:ntvf:1\ncell:E13:vtf:n:0.0806052871119401:IF(D13,(D13/D23),\"\"):l:1:f:1:bg:2:ntvf:4\ncell:F13:vtf:n:0.9672634453432812:IF(D13,(D13/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:G13:v:0.09:b:1:1:1:1:l:1:f:1:bg:2:ntvf:3\ncell:H13:vtf:n:1.08:IF(G13,(G13/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:I13:f:1\ncell:C14:t:May:l:1:f:1\ncell:D14:v:105302.2816561:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:E14:vtf:n:0.08165315584439532:IF(D14,(D14/D23),\"\"):l:1:f:1:ntvf:4\ncell:F14:vtf:n:0.9798378701327439:IF(D14,(D14/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:ntvf:3\ncell:G14:v:0.09:b:1:1:1:1:l:1:f:1:ntvf:3\ncell:H14:vtf:n:1.08:IF(G14,(G14/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:ntvf:3\ncell:I14:f:1\ncell:C15:t:Jun:l:1:f:1:bg:2\ncell:D15:v:106671.21131763:b:1:1:1:1:l:1:f:1:bg:2:ntvf:1\ncell:E15:vtf:n:0.082714646870373:IF(D15,(D15/D23),\"\"):l:1:f:1:bg:2:ntvf:4\ncell:F15:vtf:n:0.9925757624444761:IF(D15,(D15/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:G15:v:0.08:b:1:1:1:1:l:1:f:1:bg:2:ntvf:3\ncell:H15:vtf:n:0.9600000000000001:IF(G15,(G15/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:I15:f:1\ncell:C16:t:Jul:l:1:f:1\ncell:D16:v:108057.93706476:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:E16:vtf:n:0.08378993727968848:IF(D16,(D16/D23),\"\"):l:1:f:1:ntvf:4\ncell:F16:vtf:n:1.0054792473562617:IF(D16,(D16/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:ntvf:3\ncell:G16:v:0.07:b:1:1:1:1:l:1:f:1:ntvf:3\ncell:H16:vtf:n:0.8400000000000001:IF(G16,(G16/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:ntvf:3\ncell:I16:f:1\ncell:C17:t:Aug:l:1:f:1:bg:2\ncell:D17:v:109462.6902466:b:1:1:1:1:l:1:f:1:bg:2:ntvf:1\ncell:E17:vtf:n:0.08487920646432297:IF(D17,(D17/D23),\"\"):l:1:f:1:bg:2:ntvf:4\ncell:F17:vtf:n:1.0185504775718757:IF(D17,(D17/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:G17:v:0.095:b:1:1:1:1:l:1:f:1:bg:2:ntvf:3\ncell:H17:vtf:n:1.1400000000000001:IF(G17,(G17/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:I17:f:1\ncell:C18:t:Sep:l:1:f:1\ncell:D18:v:110885.70521981:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:E18:vtf:n:0.08598263614836242:IF(D18,(D18/D23),\"\"):l:1:f:1:ntvf:4\ncell:F18:vtf:n:1.0317916337803492:IF(D18,(D18/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:ntvf:3\ncell:G18:v:0.09:b:1:1:1:1:l:1:f:1:ntvf:3\ncell:H18:vtf:n:1.08:IF(G18,(G18/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:ntvf:3\ncell:I18:f:1\ncell:C19:t:Oct:l:1:f:1:bg:2\ncell:D19:v:112327.21938766:b:1:1:1:1:l:1:f:1:bg:2:ntvf:1\ncell:E19:vtf:n:0.0871004104182853:IF(D19,(D19/D23),\"\"):l:1:f:1:bg:2:ntvf:4\ncell:F19:vtf:n:1.0452049250194237:IF(D19,(D19/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:G19:v:0.09:b:1:1:1:1:l:1:f:1:bg:2:ntvf:3\ncell:H19:vtf:n:1.08:IF(G19,(G19/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:I19:f:1\ncell:C20:t:Nov:l:1:f:1\ncell:D20:v:113787.4732397:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:E20:vtf:n:0.08823271575372334:IF(D20,(D20/D23),\"\"):l:1:f:1:ntvf:4\ncell:F20:vtf:n:1.05879258904468:IF(D20,(D20/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:ntvf:3\ncell:G20:v:0.07:b:1:1:1:1:l:1:f:1:ntvf:3\ncell:H20:vtf:n:0.8400000000000001:IF(G20,(G20/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:ntvf:3\ncell:I20:f:1\ncell:C21:t:Dec:l:1:f:1:bg:2\ncell:D21:v:115266.71039182:b:1:1:1:1:l:1:f:1:bg:2:ntvf:1\ncell:E21:vtf:n:0.08937974105852475:IF(D21,(D21/D23),\"\"):l:1:f:1:bg:2:ntvf:4\ncell:F21:vtf:n:1.0725568927022973:IF(D21,(D21/AVERAGE(D10\\cD21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:G21:v:0.09:b:1:1:1:1:l:1:f:1:bg:2:ntvf:3\ncell:H21:vtf:n:1.08:IF(G21,(G21/AVERAGE(G10\\cG21)),\"\"):l:1:f:1:bg:2:ntvf:3\ncell:I21:f:1\ncell:C22:l:1:f:5\ncell:D22:b:::2::l:1:f:5:ntvf:1\ncell:E22:b:::2::l:1:f:5:ntvf:4\ncell:F22:b:::2::l:1:f:5:ntvf:3\ncell:G22:b:::2::l:1:f:5:ntvf:3\ncell:H22:b:::2::l:1:f:5:ntvf:3\ncell:C23:t:Total:l:1:f:6\ncell:D23:vtf:n:1289629.04822408:IF(SUM(D10\\cD21),SUM(D10\\cD21),\"\"):b:1::1::l:1:f:6:ntvf:2\ncell:E23:vtf:n:1:IF(ISNUMBER(D23),(D23/D23),\"\"):b:1::1::l:1:f:6:ntvf:4\ncell:F23:b:1::1::l:1:f:6:ntvf:2\ncell:G23:vtf:n:0.9999999999999999:IF(SUM(G10\\cG21),SUM(G10\\cG21),\"\"):b:1::1::l:1:f:6:ntvf:3\ncell:H23:b:1::1::l:1:f:6:ntvf:2\ncell:I23:f:6\ncell:C24:l:1:f:3\ncell:D24:l:1:f:5:ntvf:2\ncell:E24:l:1:f:5:ntvf:4\ncell:F24:l:1:f:5:ntvf:2\ncell:G24:l:1:f:5:ntvf:3\ncell:H24:l:1:f:5:ntvf:2\ncell:C25:l:1:f:3\ncell:D25:l:1:f:5:ntvf:2\ncell:E25:l:1:f:5:ntvf:4\ncell:F25:l:1:f:5:ntvf:2\ncell:G25:l:1:f:5:ntvf:3\ncell:H25:l:1:f:5:ntvf:2\ncell:C26:l:1:f:3\ncell:D26:l:1:f:5:ntvf:2\ncell:E26:l:1:f:5:ntvf:4\ncell:F26:l:1:f:5:ntvf:2\ncell:G26:l:1:f:5:ntvf:3\ncell:H26:l:1:f:5:ntvf:2\ncell:C27:l:1:f:3\ncell:D27:l:1:f:5:ntvf:2\ncell:E27:l:1:f:5:ntvf:4\ncell:F27:l:1:f:5:ntvf:2\ncell:G27:l:1:f:5:ntvf:3\ncell:H27:l:1:f:5:ntvf:2\ncell:C28:l:1:f:3\ncell:D28:l:1:f:5:ntvf:2\ncell:E28:l:1:f:5:ntvf:4\ncell:F28:l:1:f:5:ntvf:2\ncell:G28:l:1:f:5:ntvf:3\ncell:H28:l:1:f:5:ntvf:2\ncell:C29:l:1:f:3\ncell:D29:l:1:f:5:ntvf:2\ncell:E29:l:1:f:5:ntvf:4\ncell:F29:l:1:f:5:ntvf:2\ncell:G29:l:1:f:5:ntvf:3\ncell:H29:l:1:f:5:ntvf:2\ncell:C30:l:1:f:3\ncell:D30:l:1:f:5:ntvf:2\ncell:E30:l:1:f:5:ntvf:4\ncell:F30:l:1:f:5:ntvf:2\ncell:G30:l:1:f:5:ntvf:3\ncell:H30:l:1:f:5:ntvf:2\ncell:C31:l:1:f:3\ncell:D31:l:1:f:5:ntvf:2\ncell:E31:l:1:f:5:ntvf:4\ncell:F31:l:1:f:5:ntvf:2\ncell:G31:l:1:f:5:ntvf:3\ncell:H31:l:1:f:5:ntvf:2\ncell:C32:l:1:f:3\ncell:D32:l:1:f:5:ntvf:2\ncell:E32:l:1:f:5:ntvf:4\ncell:F32:l:1:f:5:ntvf:2\ncell:G32:l:1:f:5:ntvf:3\ncell:H32:l:1:f:5:ntvf:2\ncell:C33:l:1:f:3\ncell:D33:l:1:f:5:ntvf:2\ncell:E33:l:1:f:5:ntvf:4\ncell:F33:l:1:f:5:ntvf:2\ncell:G33:l:1:f:5:ntvf:3\ncell:H33:l:1:f:5:ntvf:2\ncell:C34:l:1:f:3\ncell:D34:l:1:f:5:ntvf:2\ncell:E34:l:1:f:5:ntvf:4\ncell:F34:l:1:f:5:ntvf:2\ncell:G34:l:1:f:5:ntvf:3\ncell:H34:l:1:f:5:ntvf:2\ncell:C35:l:1:f:3\ncell:D35:l:1:f:5:ntvf:2\ncell:E35:l:1:f:5:ntvf:4\ncell:F35:l:1:f:5:ntvf:2\ncell:G35:l:1:f:5:ntvf:3\ncell:H35:l:1:f:5:ntvf:2\ncell:C36:l:1:f:3\ncell:D36:l:1:f:5:ntvf:2\ncell:E36:l:1:f:5:ntvf:4\ncell:F36:l:1:f:5:ntvf:2\ncell:G36:l:1:f:5:ntvf:3\ncell:H36:l:1:f:5:ntvf:2\ncell:C37:l:1:f:3\ncell:D37:l:1:f:5:ntvf:2\ncell:E37:l:1:f:5:ntvf:4\ncell:F37:l:1:f:5:ntvf:2\ncell:G37:l:1:f:5:ntvf:3\ncell:H37:l:1:f:5:ntvf:2\ncell:C38:l:1:f:3\ncell:D38:l:1:f:5:ntvf:2\ncell:E38:l:1:f:5:ntvf:4\ncell:F38:l:1:f:5:ntvf:2\ncell:G38:l:1:f:5:ntvf:3\ncell:H38:l:1:f:5:ntvf:2\ncell:C39:l:1:f:3\ncell:D39:l:1:f:5:ntvf:2\ncell:E39:l:1:f:5:ntvf:4\ncell:F39:l:1:f:5:ntvf:2\ncell:G39:l:1:f:5:ntvf:3\ncell:H39:l:1:f:5:ntvf:2\ncell:C40:l:1:f:3\ncell:D40:l:1:f:5:ntvf:2\ncell:E40:l:1:f:5:ntvf:4\ncell:F40:l:1:f:5:ntvf:2\ncell:G40:l:1:f:5:ntvf:3\ncell:H40:l:1:f:5:ntvf:2\ncell:C42:t:© Copyright, 2011, Jaxworks, All Rights Reserved.:l:1:f:4\ncol:A:w:10\ncol:B:w:10\ncol:C:w:121\ncol:D:w:118\ncol:E:w:118\ncol:F:w:135\ncol:G:w:99\ncol:H:w:124\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:18.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:15.75\nrow:10:h:15.75\nrow:11:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:15.75\nrow:19:h:15.75\nrow:20:h:15.75\nrow:21:h:15.75\nrow:22:h:15.75\nrow:23:h:15.75\nrow:24:h:15.75\nrow:25:h:15.75\nrow:26:h:15.75\nrow:27:h:15.75\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:15.75\nrow:31:h:15.75\nrow:32:h:15.75\nrow:33:h:15.75\nrow:34:h:15.75\nrow:35:h:15.75\nrow:36:h:15.75\nrow:37:h:15.75\nrow:38:h:15.75\nrow:39:h:15.75\nrow:40:h:15.75\nrow:42:h:14.25\nsheet:c:9:r:42:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold 10pt Arial\nfont:3:normal bold 12pt Arial\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt Arial\nfont:6:normal normal 14pt *\nfont:7:normal normal 14pt Arial\nfont:8:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:3:0.0%\nvalueformat:4:0.00%\nname:DATA_01::C5\nname:DATA_02::C10\nname:DATA_03::D10\\cD21\nname:DATA_04::G10\\cG21\n"},"name":"sheet11","hidden":"0"},"sheet21":{"sheetstr":{"savestr":"version:1.5\ncell:A1:l:2:f:5\ncell:B3:t:Sales Seasonality by Month:l:1:f:4:cf:2\ncell:C3:l:1:f:5:cf:1\ncell:D3:l:1:f:5:cf:1\ncell:E3:l:1:f:5:cf:1\ncell:F3:l:1:f:5:cf:1\ncell:G3:l:1:f:5:cf:1\ncell:B4:t:For the Year 2009:l:1:f:3:cf:1\ncell:C4:l:1:f:5:cf:1\ncell:D4:l:1:f:5:cf:1\ncell:E4:l:1:f:5:cf:1\ncell:F4:l:1:f:5:cf:1\ncell:G4:l:1:f:5:cf:1\ncell:C5:l:1:f:5:cf:3\ncell:D5:l:1:f:5:cf:3\ncell:E5:l:1:f:5:cf:3\ncell:F5:l:1:f:5:cf:3\ncell:G5:l:1:f:5:cf:3\ncell:B6:l:1:f:5\ncell:C6:l:1:f:5:cf:3\ncell:D6:l:1:f:5:cf:3\ncell:E6:l:1:f:5:cf:3\ncell:F6:l:1:f:5:cf:3\ncell:G6:l:1:f:5:cf:3\ncell:B7:l:1:f:5\ncell:C7:t:Actual:l:1:f:1:cf:1\ncell:D7:t:% of :l:1:f:1:cf:1\ncell:E7:t:Company Index:l:1:f:1:cf:1\ncell:F7:t:Industry % :l:1:f:1:cf:1\ncell:G7:t:Industry Index:l:1:f:1:cf:1\ncell:B8:l:1:f:5\ncell:C8:t:Sales:b:::1::l:1:f:1:cf:1\ncell:D8:t:Sales:b:::1::l:1:f:1:cf:1\ncell:E8:t:To Average:b:::1::l:1:f:1:cf:1\ncell:F8:t:of Sales:b:::1::l:1:f:1:cf:1\ncell:G8:t:to Average:b:::1::l:1:f:1:cf:1\ncell:B9:t:Jan:l:1:f:6\ncell:C9:v:100000:b:1::::l:1:f:6:ntvf:2\ncell:D9:vtf:n:0.0775416776922851:IF(C9,(C9/C21),\"\"):b:1::::l:1:f:6:ntvf:4\ncell:E9:vtf:n:0.9305001323074212:IF(C9,(C9/AVERAGE(C9\\cC20)),\"\"):b:1::::l:1:f:6:ntvf:3\ncell:F9:v:0.07:b:1::::l:1:f:6:ntvf:3\ncell:G9:vtf:n:0.8400000000000001:IF(F9,(F9/AVERAGE(F9\\cF20)),\"\"):b:1::::l:1:f:6:ntvf:3\ncell:B10:t:Feb:l:1:f:6\ncell:C10:v:101300:l:1:f:6:ntvf:1\ncell:D10:vtf:n:0.0785497195022848:IF(C10,(C10/C21),\"\"):l:1:f:6:ntvf:4\ncell:E10:vtf:n:0.9425966340274177:IF(C10,(C10/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F10:v:0.075:l:1:f:6:ntvf:3\ncell:G10:vtf:n:0.9:IF(F10,(F10/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B11:t:Mar:l:1:f:6\ncell:C11:v:102616.9:l:1:f:6:ntvf:1\ncell:D11:vtf:n:0.07957086585581451:IF(C11,(C11/C21),\"\"):l:1:f:6:ntvf:4\ncell:E11:vtf:n:0.9548503902697741:IF(C11,(C11/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F11:v:0.09:l:1:f:6:ntvf:3\ncell:G11:vtf:n:1.08:IF(F11,(F11/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B12:t:Apr:l:1:f:6\ncell:C12:v:103950.9197:l:1:f:6:ntvf:1\ncell:D12:vtf:n:0.0806052871119401:IF(C12,(C12/C21),\"\"):l:1:f:6:ntvf:4\ncell:E12:vtf:n:0.9672634453432812:IF(C12,(C12/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F12:v:0.09:l:1:f:6:ntvf:3\ncell:G12:vtf:n:1.08:IF(F12,(F12/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B13:t:May:l:1:f:6\ncell:C13:v:105302.2816561:l:1:f:6:ntvf:1\ncell:D13:vtf:n:0.08165315584439532:IF(C13,(C13/C21),\"\"):l:1:f:6:ntvf:4\ncell:E13:vtf:n:0.9798378701327439:IF(C13,(C13/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F13:v:0.09:l:1:f:6:ntvf:3\ncell:G13:vtf:n:1.08:IF(F13,(F13/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B14:t:Jun:l:1:f:6\ncell:C14:v:106671.21131763:l:1:f:6:ntvf:1\ncell:D14:vtf:n:0.082714646870373:IF(C14,(C14/C21),\"\"):l:1:f:6:ntvf:4\ncell:E14:vtf:n:0.9925757624444761:IF(C14,(C14/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F14:v:0.08:l:1:f:6:ntvf:3\ncell:G14:vtf:n:0.9600000000000001:IF(F14,(F14/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B15:t:Jul:l:1:f:6\ncell:C15:v:108057.93706476:l:1:f:6:ntvf:1\ncell:D15:vtf:n:0.08378993727968848:IF(C15,(C15/C21),\"\"):l:1:f:6:ntvf:4\ncell:E15:vtf:n:1.0054792473562617:IF(C15,(C15/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F15:v:0.07:l:1:f:6:ntvf:3\ncell:G15:vtf:n:0.8400000000000001:IF(F15,(F15/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B16:t:Aug:l:1:f:6\ncell:C16:v:109462.6902466:l:1:f:6:ntvf:1\ncell:D16:vtf:n:0.08487920646432297:IF(C16,(C16/C21),\"\"):l:1:f:6:ntvf:4\ncell:E16:vtf:n:1.0185504775718757:IF(C16,(C16/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F16:v:0.095:l:1:f:6:ntvf:3\ncell:G16:vtf:n:1.1400000000000001:IF(F16,(F16/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B17:t:Sep:l:1:f:6\ncell:C17:v:110885.70521981:l:1:f:6:ntvf:1\ncell:D17:vtf:n:0.08598263614836242:IF(C17,(C17/C21),\"\"):l:1:f:6:ntvf:4\ncell:E17:vtf:n:1.0317916337803492:IF(C17,(C17/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F17:v:0.09:l:1:f:6:ntvf:3\ncell:G17:vtf:n:1.08:IF(F17,(F17/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B18:t:Oct:l:1:f:6\ncell:C18:v:112327.21938766:l:1:f:6:ntvf:1\ncell:D18:vtf:n:0.0871004104182853:IF(C18,(C18/C21),\"\"):l:1:f:6:ntvf:4\ncell:E18:vtf:n:1.0452049250194237:IF(C18,(C18/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F18:v:0.09:l:1:f:6:ntvf:3\ncell:G18:vtf:n:1.08:IF(F18,(F18/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B19:t:Nov:l:1:f:6\ncell:C19:v:113787.4732397:l:1:f:6:ntvf:1\ncell:D19:vtf:n:0.08823271575372334:IF(C19,(C19/C21),\"\"):l:1:f:6:ntvf:4\ncell:E19:vtf:n:1.05879258904468:IF(C19,(C19/AVERAGE(C9\\cC20)),\"\"):l:1:f:6:ntvf:3\ncell:F19:v:0.07:l:1:f:6:ntvf:3\ncell:G19:vtf:n:0.8400000000000001:IF(F19,(F19/AVERAGE(F9\\cF20)),\"\"):l:1:f:6:ntvf:3\ncell:B20:t:Dec:l:1:f:6\ncell:C20:v:115266.71039182:b:::1::l:1:f:6:ntvf:1\ncell:D20:vtf:n:0.08937974105852475:IF(C20,(C20/C21),\"\"):b:::1::l:1:f:6:ntvf:4\ncell:E20:vtf:n:1.0725568927022973:IF(C20,(C20/AVERAGE(C9\\cC20)),\"\"):b:::1::l:1:f:6:ntvf:3\ncell:F20:v:0.09:b:::1::l:1:f:6:ntvf:3\ncell:G20:vtf:n:1.08:IF(F20,(F20/AVERAGE(F9\\cF20)),\"\"):b:::1::l:1:f:6:ntvf:3\ncell:B21:t:Total:l:1:f:2\ncell:C21:vtf:n:1289629.04822408:IF(SUM(C9\\cC20),SUM(C9\\cC20),\"\"):b:1::::l:1:f:2:ntvf:2\ncell:D21:vtf:n:1:IF(ISNUMBER(C21),(C21/C21),\"\"):b:1::::l:1:f:2:ntvf:4\ncell:E21:b:1::::l:1:f:2:ntvf:2\ncell:F21:vtf:n:0.9999999999999999:IF(SUM(F9\\cF20),SUM(F9\\cF20),\"\"):b:1::::l:1:f:2:ntvf:3\ncell:G21:b:1::::l:1:f:2:ntvf:2\ncell:B22:l:1:f:2\ncell:C22:l:1:f:6:ntvf:2\ncell:D22:l:1:f:6:ntvf:4\ncell:E22:l:1:f:6:ntvf:2\ncell:F22:l:1:f:6:ntvf:3\ncell:G22:l:1:f:6:ntvf:2\ncell:B23:l:1:f:2\ncell:C23:l:1:f:6:ntvf:2\ncell:D23:l:1:f:6:ntvf:4\ncell:E23:l:1:f:6:ntvf:2\ncell:F23:l:1:f:6:ntvf:3\ncell:G23:l:1:f:6:ntvf:2\ncell:B24:l:1:f:2\ncell:C24:l:1:f:6:ntvf:2\ncell:D24:l:1:f:6:ntvf:4\ncell:E24:l:1:f:6:ntvf:2\ncell:F24:l:1:f:6:ntvf:3\ncell:G24:l:1:f:6:ntvf:2\ncell:B25:l:1:f:2\ncell:C25:l:1:f:6:ntvf:2\ncell:D25:l:1:f:6:ntvf:4\ncell:E25:l:1:f:6:ntvf:2\ncell:F25:l:1:f:6:ntvf:3\ncell:G25:l:1:f:6:ntvf:2\ncell:B26:l:1:f:2\ncell:C26:l:1:f:6:ntvf:2\ncell:D26:l:1:f:6:ntvf:4\ncell:E26:l:1:f:6:ntvf:2\ncell:F26:l:1:f:6:ntvf:3\ncell:G26:l:1:f:6:ntvf:2\ncell:B27:l:1:f:2\ncell:C27:l:1:f:6:ntvf:2\ncell:D27:l:1:f:6:ntvf:4\ncell:E27:l:1:f:6:ntvf:2\ncell:F27:l:1:f:6:ntvf:3\ncell:G27:l:1:f:6:ntvf:2\ncell:B28:l:1:f:2\ncell:C28:l:1:f:6:ntvf:2\ncell:D28:l:1:f:6:ntvf:4\ncell:E28:l:1:f:6:ntvf:2\ncell:F28:l:1:f:6:ntvf:3\ncell:G28:l:1:f:6:ntvf:2\ncell:B29:l:1:f:2\ncell:C29:l:1:f:6:ntvf:2\ncell:D29:l:1:f:6:ntvf:4\ncell:E29:l:1:f:6:ntvf:2\ncell:F29:l:1:f:6:ntvf:3\ncell:G29:l:1:f:6:ntvf:2\ncell:B30:l:1:f:2\ncell:C30:l:1:f:6:ntvf:2\ncell:D30:l:1:f:6:ntvf:4\ncell:E30:l:1:f:6:ntvf:2\ncell:F30:l:1:f:6:ntvf:3\ncell:G30:l:1:f:6:ntvf:2\ncell:B31:l:1:f:2\ncell:C31:l:1:f:6:ntvf:2\ncell:D31:l:1:f:6:ntvf:4\ncell:E31:l:1:f:6:ntvf:2\ncell:F31:l:1:f:6:ntvf:3\ncell:G31:l:1:f:6:ntvf:2\ncell:B32:l:1:f:2\ncell:C32:l:1:f:6:ntvf:2\ncell:D32:l:1:f:6:ntvf:4\ncell:E32:l:1:f:6:ntvf:2\ncell:F32:l:1:f:6:ntvf:3\ncell:G32:l:1:f:6:ntvf:2\ncell:B33:l:1:f:2\ncell:C33:l:1:f:6:ntvf:2\ncell:D33:l:1:f:6:ntvf:4\ncell:E33:l:1:f:6:ntvf:2\ncell:F33:l:1:f:6:ntvf:3\ncell:G33:l:1:f:6:ntvf:2\ncell:B34:l:1:f:2\ncell:C34:l:1:f:6:ntvf:2\ncell:D34:l:1:f:6:ntvf:4\ncell:E34:l:1:f:6:ntvf:2\ncell:F34:l:1:f:6:ntvf:3\ncell:G34:l:1:f:6:ntvf:2\ncell:B35:l:1:f:2\ncell:C35:l:1:f:6:ntvf:2\ncell:D35:l:1:f:6:ntvf:4\ncell:E35:l:1:f:6:ntvf:2\ncell:F35:l:1:f:6:ntvf:3\ncell:G35:l:1:f:6:ntvf:2\ncell:B36:l:1:f:2\ncell:C36:l:1:f:6:ntvf:2\ncell:D36:l:1:f:6:ntvf:4\ncell:E36:l:1:f:6:ntvf:2\ncell:F36:l:1:f:6:ntvf:3\ncell:G36:l:1:f:6:ntvf:2\ncell:B37:l:1:f:2\ncell:C37:l:1:f:6:ntvf:2\ncell:D37:l:1:f:6:ntvf:4\ncell:E37:l:1:f:6:ntvf:2\ncell:F37:l:1:f:6:ntvf:3\ncell:G37:l:1:f:6:ntvf:2\ncell:B38:l:1:f:2\ncell:C38:l:1:f:6:ntvf:2\ncell:D38:l:1:f:6:ntvf:4\ncell:E38:l:1:f:6:ntvf:2\ncell:F38:l:1:f:6:ntvf:3\ncell:G38:l:1:f:6:ntvf:2\ncell:B40:t:© Copyright, 2011, Jaxworks, All Rights Reserved.:l:1:f:5\ncol:A:w:12\ncol:B:w:178\ncol:C:w:118\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:9:h:15.75\nrow:10:h:15.75\nrow:11:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:15.75\nrow:19:h:15.75\nrow:20:h:15.75\nrow:21:h:15.75\nrow:22:h:15.75\nrow:23:h:15.75\nrow:24:h:15.75\nrow:25:h:15.75\nrow:26:h:15.75\nrow:27:h:15.75\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:15.75\nrow:31:h:15.75\nrow:32:h:15.75\nrow:33:h:15.75\nrow:34:h:15.75\nrow:35:h:15.75\nrow:36:h:15.75\nrow:37:h:15.75\nrow:38:h:15.75\nrow:40:h:14.25\nsheet:c:7:r:40:h:12.75:needsrecalc:yes\nborder:1:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\nfont:1:normal bold 10pt Arial\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 14pt Arial\nfont:4:normal bold 26pt Times New Roman\nfont:5:normal normal 10pt Arial\nfont:6:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nvalueformat:1: #,##0 ;(#,##0)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:3:0.0%\nvalueformat:4:0.00%\nname:DATA_01::B4\nname:DATA_02::B9\nname:DATA_03::C9\\cC20\nname:DATA_04::F9\\cF20\n"},"name":"sheet14","hidden":"1"},"sheet22":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Revenue:l:2:f:9:c:3:bg:1:cf:1:ntvf:1:colspan:5\ncell:D3:l:2:f:4:cf:1\ncell:E3:l:2:f:3:cf:1:ntvf:1\ncell:F3:l:2:f:3:cf:1:ntvf:1\ncell:G3:l:2:f:3:cf:1:ntvf:1\ncell:C4:t: XYZ, Inc. :l:2:f:8:cf:1:ntvf:1\ncell:D4:l:2:f:4\ncell:E4:l:2:f:2:cf:1:ntvf:1\ncell:F4:l:2:f:2:cf:1:ntvf:1\ncell:G4:l:2:f:2:cf:1:ntvf:1\ncell:C5:t: 2009 Sales:l:2:f:6:cf:1:ntvf:3\ncell:D5:l:2\ncell:E5:l:2:f:2:cf:1:ntvf:1\ncell:F5:l:2:f:2:cf:1:ntvf:1\ncell:G5:l:2:f:2:cf:1:ntvf:1\ncell:C6:l:2\ncell:D6:l:2:f:4:ntvf:1\ncell:E6:l:2:f:4:ntvf:1\ncell:F6:l:2:f:4:ntvf:1\ncell:G6:l:2:f:4:ntvf:1\ncell:C7:l:2:f:4:ntvf:1\ncell:D7:t: Retail :l:2:f:8:cf:1:ntvf:1\ncell:E7:t: Wholesale :l:2:f:8:cf:1:ntvf:1\ncell:F7:t: Mail Order :l:2:f:8:cf:1:ntvf:1\ncell:G7:t:Total Sales:l:2:f:8:cf:1:ntvf:1\ncell:C8:t: Camping Gear :l:2:f:8:ntvf:1\ncell:D8:l:2:f:4:ntvf:1\ncell:E8:l:2:f:4:ntvf:1\ncell:F8:l:2:f:4:ntvf:1\ncell:G8:l:2:f:4:ntvf:1\ncell:C9:t:Product:l:2:f:1:ntvf:1\ncell:D9:v:18000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E9:v:24000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F9:v:10000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G9:vtf:n:52000:IF(SUM(D9\\cF9),SUM(D9\\cF9),\"\"):l:2:f:1:ntvf:2\ncell:H9:f:1\ncell:C10:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D10:v:14000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E10:v:15000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F10:v:9000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G10:vtf:n:38000:IF(SUM(D10\\cF10),SUM(D10\\cF10),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H10:f:1\ncell:C11:t:Product:l:2:f:1:ntvf:1\ncell:D11:v:8000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E11:v:11000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F11:v:7000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G11:vtf:n:26000:IF(SUM(D11\\cF11),SUM(D11\\cF11),\"\"):l:2:f:1:ntvf:2\ncell:H11:f:1\ncell:C12:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D12:v:4000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G12:vtf:n:16000:IF(SUM(D12\\cF12),SUM(D12\\cF12),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H12:f:1\ncell:C13:t:Product:l:2:f:1:ntvf:1\ncell:D13:v:2000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G13:vtf:n:8000:IF(SUM(D13\\cF13),SUM(D13\\cF13),\"\"):l:2:f:1:ntvf:2\ncell:H13:f:1\ncell:C14:l:2:f:1:ntvf:1\ncell:D14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G14:l:2:f:1:ntvf:2\ncell:H14:f:1\ncell:C15:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D15:vtf:n:46000:IF(SUM(D9\\cD13),SUM(D9\\cD13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E15:vtf:n:59000:IF(SUM(E9\\cE13),SUM(E9\\cE13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F15:vtf:n:35000:IF(SUM(F9\\cF13),SUM(F9\\cF13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G15:vtf:n:140000:IF(SUM(G9\\cG13),SUM(G9\\cG13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H15:f:7\ncell:C16:l:2:f:4:ntvf:1\ncell:D16:l:2:f:4:ntvf:2\ncell:E16:l:2:f:4:ntvf:2\ncell:F16:l:2:f:4:ntvf:2\ncell:G16:l:2:f:4:ntvf:2\ncell:C17:t: Mountain Climbing :l:2:f:8:ntvf:1\ncell:D17:l:2:f:4:ntvf:2\ncell:E17:l:2:f:4:ntvf:2\ncell:F17:l:2:f:4:ntvf:2\ncell:G17:l:2:f:4:ntvf:2\ncell:C18:t:Product:l:2:f:5:ntvf:1\ncell:D18:v:4000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E18:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F18:v:6500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G18:vtf:n:18500:IF(SUM(D18\\cF18),SUM(D18\\cF18),\"\"):l:2:f:5:ntvf:2\ncell:H18:f:5\ncell:C19:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D19:v:7000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E19:v:15000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F19:v:9000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G19:vtf:n:31000:IF(SUM(D19\\cF19),SUM(D19\\cF19),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H19:f:5\ncell:C20:t:Product:l:2:f:5:ntvf:1\ncell:D20:v:6000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E20:v:11000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F20:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G20:vtf:n:25000:IF(SUM(D20\\cF20),SUM(D20\\cF20),\"\"):l:2:f:5:ntvf:2\ncell:H20:f:5\ncell:C21:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D21:v:3000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E21:v:5500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F21:v:4500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G21:vtf:n:13000:IF(SUM(D21\\cF21),SUM(D21\\cF21),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H21:f:5\ncell:C22:t:Product:l:2:f:5:ntvf:1\ncell:D22:v:2000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E22:v:3500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F22:v:3000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G22:vtf:n:8500:IF(SUM(D22\\cF22),SUM(D22\\cF22),\"\"):l:2:f:5:ntvf:2\ncell:H22:f:5\ncell:C23:l:2:f:5:ntvf:1\ncell:D23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G23:l:2:f:5:ntvf:2\ncell:H23:f:5\ncell:C24:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D24:vtf:n:22000:IF(SUM(D18\\cD22),SUM(D18\\cD22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E24:vtf:n:43000:IF(SUM(E18\\cE22),SUM(E18\\cE22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F24:vtf:n:31000:IF(SUM(F18\\cF22),SUM(F18\\cF22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G24:vtf:n:96000:IF(SUM(G18\\cG22),SUM(G18\\cG22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H24:f:7\ncell:C25:l:2:f:4:ntvf:1\ncell:D25:l:2:f:4:ntvf:2\ncell:E25:l:2:f:4:ntvf:2\ncell:F25:l:2:f:4:ntvf:2\ncell:G25:l:2:f:4:ntvf:2\ncell:C26:l:1:f:4\ncol:A:w:10\ncol:B:w:10\ncol:C:w:309\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:15\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nsheet:c:8:r:26:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt *\nfont:6:normal normal 12pt Arial\nfont:7:normal normal 14pt *\nfont:8:normal normal 16pt Arial\nfont:9:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:#,##0.00;(#,##0.00)\nvalueformat:2:#,##0;(#,##0)\nvalueformat:3:@\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::C9\\cC21\nname:DATA_04::F9\\cF21\n"},"name":"sheet22","hidden":"1"},"sheet23":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Revenue:l:2:f:9:c:3:bg:1:cf:1:ntvf:1:colspan:5\ncell:D3:l:2:f:4:cf:1\ncell:E3:l:2:f:3:cf:1:ntvf:1\ncell:F3:l:2:f:3:cf:1:ntvf:1\ncell:G3:l:2:f:3:cf:1:ntvf:1\ncell:C4:t: XYZ, Inc. :l:2:f:8:cf:1:ntvf:1\ncell:D4:l:2:f:4\ncell:E4:l:2:f:2:cf:1:ntvf:1\ncell:F4:l:2:f:2:cf:1:ntvf:1\ncell:G4:l:2:f:2:cf:1:ntvf:1\ncell:C5:t: 2009 Sales:l:2:f:6:cf:1:ntvf:3\ncell:D5:l:2\ncell:E5:l:2:f:2:cf:1:ntvf:1\ncell:F5:l:2:f:2:cf:1:ntvf:1\ncell:G5:l:2:f:2:cf:1:ntvf:1\ncell:C6:l:2\ncell:D6:l:2:f:4:ntvf:1\ncell:E6:l:2:f:4:ntvf:1\ncell:F6:l:2:f:4:ntvf:1\ncell:G6:l:2:f:4:ntvf:1\ncell:C7:l:2:f:4:ntvf:1\ncell:D7:t: Retail :l:2:f:8:cf:1:ntvf:1\ncell:E7:t: Wholesale :l:2:f:8:cf:1:ntvf:1\ncell:F7:t: Mail Order :l:2:f:8:cf:1:ntvf:1\ncell:G7:t:Total Sales:l:2:f:8:cf:1:ntvf:1\ncell:C8:t: Camping Gear :l:2:f:8:ntvf:1\ncell:D8:l:2:f:4:ntvf:1\ncell:E8:l:2:f:4:ntvf:1\ncell:F8:l:2:f:4:ntvf:1\ncell:G8:l:2:f:4:ntvf:1\ncell:C9:t:Product:l:2:f:1:ntvf:1\ncell:D9:v:18000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E9:v:24000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F9:v:10000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G9:vtf:n:52000:IF(SUM(D9\\cF9),SUM(D9\\cF9),\"\"):l:2:f:1:ntvf:2\ncell:H9:f:1\ncell:C10:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D10:v:14000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E10:v:15000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F10:v:9000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G10:vtf:n:38000:IF(SUM(D10\\cF10),SUM(D10\\cF10),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H10:f:1\ncell:C11:t:Product:l:2:f:1:ntvf:1\ncell:D11:v:8000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E11:v:11000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F11:v:7000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G11:vtf:n:26000:IF(SUM(D11\\cF11),SUM(D11\\cF11),\"\"):l:2:f:1:ntvf:2\ncell:H11:f:1\ncell:C12:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D12:v:4000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G12:vtf:n:16000:IF(SUM(D12\\cF12),SUM(D12\\cF12),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H12:f:1\ncell:C13:t:Product:l:2:f:1:ntvf:1\ncell:D13:v:2000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G13:vtf:n:8000:IF(SUM(D13\\cF13),SUM(D13\\cF13),\"\"):l:2:f:1:ntvf:2\ncell:H13:f:1\ncell:C14:l:2:f:1:ntvf:1\ncell:D14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G14:l:2:f:1:ntvf:2\ncell:H14:f:1\ncell:C15:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D15:vtf:n:46000:IF(SUM(D9\\cD13),SUM(D9\\cD13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E15:vtf:n:59000:IF(SUM(E9\\cE13),SUM(E9\\cE13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F15:vtf:n:35000:IF(SUM(F9\\cF13),SUM(F9\\cF13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G15:vtf:n:140000:IF(SUM(G9\\cG13),SUM(G9\\cG13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H15:f:7\ncell:C16:l:2:f:4:ntvf:1\ncell:D16:l:2:f:4:ntvf:2\ncell:E16:l:2:f:4:ntvf:2\ncell:F16:l:2:f:4:ntvf:2\ncell:G16:l:2:f:4:ntvf:2\ncell:C17:t: Mountain Climbing :l:2:f:8:ntvf:1\ncell:D17:l:2:f:4:ntvf:2\ncell:E17:l:2:f:4:ntvf:2\ncell:F17:l:2:f:4:ntvf:2\ncell:G17:l:2:f:4:ntvf:2\ncell:C18:t:Product:l:2:f:5:ntvf:1\ncell:D18:v:4000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E18:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F18:v:6500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G18:vtf:n:18500:IF(SUM(D18\\cF18),SUM(D18\\cF18),\"\"):l:2:f:5:ntvf:2\ncell:H18:f:5\ncell:C19:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D19:v:7000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E19:v:15000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F19:v:9000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G19:vtf:n:31000:IF(SUM(D19\\cF19),SUM(D19\\cF19),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H19:f:5\ncell:C20:t:Product:l:2:f:5:ntvf:1\ncell:D20:v:6000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E20:v:11000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F20:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G20:vtf:n:25000:IF(SUM(D20\\cF20),SUM(D20\\cF20),\"\"):l:2:f:5:ntvf:2\ncell:H20:f:5\ncell:C21:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D21:v:3000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E21:v:5500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F21:v:4500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G21:vtf:n:13000:IF(SUM(D21\\cF21),SUM(D21\\cF21),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H21:f:5\ncell:C22:t:Product:l:2:f:5:ntvf:1\ncell:D22:v:2000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E22:v:3500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F22:v:3000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G22:vtf:n:8500:IF(SUM(D22\\cF22),SUM(D22\\cF22),\"\"):l:2:f:5:ntvf:2\ncell:H22:f:5\ncell:C23:l:2:f:5:ntvf:1\ncell:D23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G23:l:2:f:5:ntvf:2\ncell:H23:f:5\ncell:C24:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D24:vtf:n:22000:IF(SUM(D18\\cD22),SUM(D18\\cD22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E24:vtf:n:43000:IF(SUM(E18\\cE22),SUM(E18\\cE22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F24:vtf:n:31000:IF(SUM(F18\\cF22),SUM(F18\\cF22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G24:vtf:n:96000:IF(SUM(G18\\cG22),SUM(G18\\cG22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H24:f:7\ncell:C25:l:2:f:4:ntvf:1\ncell:D25:l:2:f:4:ntvf:2\ncell:E25:l:2:f:4:ntvf:2\ncell:F25:l:2:f:4:ntvf:2\ncell:G25:l:2:f:4:ntvf:2\ncell:C26:t: Men's Clothing :l:2:f:8:ntvf:1\ncell:D26:l:2:f:4:ntvf:2\ncell:E26:l:2:f:4:ntvf:2\ncell:F26:l:2:f:4:ntvf:2\ncell:G26:l:2:f:4:ntvf:2\ncell:C27:t:Product:l:2:f:5:ntvf:1\ncell:D27:v:16000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E27:v:30000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F27:v:15000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G27:vtf:n:61000:IF(SUM(D27\\cF27),SUM(D27\\cF27),\"\"):l:2:f:5:ntvf:2\ncell:H27:f:5\ncell:C28:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D28:v:18000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E28:v:32000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F28:v:18000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G28:vtf:n:68000:IF(SUM(D28\\cF28),SUM(D28\\cF28),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H28:f:5\ncell:C29:t:Product:l:2:f:5:ntvf:1\ncell:D29:v:24000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E29:v:46000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F29:v:38000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G29:vtf:n:108000:IF(SUM(D29\\cF29),SUM(D29\\cF29),\"\"):l:2:f:5:ntvf:2\ncell:H29:f:5\ncell:C30:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D30:v:16000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E30:v:32000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F30:v:19000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G30:vtf:n:67000:IF(SUM(D30\\cF30),SUM(D30\\cF30),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H30:f:5\ncell:C31:t:Product:l:2:f:5:ntvf:1\ncell:D31:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E31:v:12000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F31:v:10000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G31:vtf:n:30000:IF(SUM(D31\\cF31),SUM(D31\\cF31),\"\"):l:2:f:5:ntvf:2\ncell:H31:f:5\ncell:C32:l:2:f:5:ntvf:1\ncell:D32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G32:l:2:f:5:ntvf:2\ncell:H32:f:5\ncell:C33:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D33:vtf:n:82000:IF(SUM(D27\\cD31),SUM(D27\\cD31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E33:vtf:n:152000:IF(SUM(E27\\cE31),SUM(E27\\cE31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F33:vtf:n:100000:IF(SUM(F27\\cF31),SUM(F27\\cF31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G33:vtf:n:334000:IF(SUM(G27\\cG31),SUM(G27\\cG31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H33:f:7\ncell:C35:l:1:f:4\ncol:A:w:10\ncol:B:w:10\ncol:C:w:309\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:15\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:15\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:35:h:14.25\nsheet:c:8:r:35:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt *\nfont:6:normal normal 12pt Arial\nfont:7:normal normal 14pt *\nfont:8:normal normal 16pt Arial\nfont:9:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:#,##0.00;(#,##0.00)\nvalueformat:2:#,##0;(#,##0)\nvalueformat:3:@\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::C9\\cC21\nname:DATA_04::F9\\cF21\n"},"name":"sheet23","hidden":"1"},"sheet24":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Revenue:l:2:f:9:c:3:bg:1:cf:1:ntvf:1:colspan:5\ncell:D3:l:2:f:4:cf:1\ncell:E3:l:2:f:3:cf:1:ntvf:1\ncell:F3:l:2:f:3:cf:1:ntvf:1\ncell:G3:l:2:f:3:cf:1:ntvf:1\ncell:C4:t: XYZ, Inc. :l:2:f:8:cf:1:ntvf:1\ncell:D4:l:2:f:4\ncell:E4:l:2:f:2:cf:1:ntvf:1\ncell:F4:l:2:f:2:cf:1:ntvf:1\ncell:G4:l:2:f:2:cf:1:ntvf:1\ncell:C5:t: 2009 Sales:l:2:f:6:cf:1:ntvf:3\ncell:D5:l:2\ncell:E5:l:2:f:2:cf:1:ntvf:1\ncell:F5:l:2:f:2:cf:1:ntvf:1\ncell:G5:l:2:f:2:cf:1:ntvf:1\ncell:C6:l:2\ncell:D6:l:2:f:4:ntvf:1\ncell:E6:l:2:f:4:ntvf:1\ncell:F6:l:2:f:4:ntvf:1\ncell:G6:l:2:f:4:ntvf:1\ncell:C7:l:2:f:4:ntvf:1\ncell:D7:t: Retail :l:2:f:8:cf:1:ntvf:1\ncell:E7:t: Wholesale :l:2:f:8:cf:1:ntvf:1\ncell:F7:t: Mail Order :l:2:f:8:cf:1:ntvf:1\ncell:G7:t:Total Sales:l:2:f:8:cf:1:ntvf:1\ncell:C8:t: Camping Gear :l:2:f:8:ntvf:1\ncell:D8:l:2:f:4:ntvf:1\ncell:E8:l:2:f:4:ntvf:1\ncell:F8:l:2:f:4:ntvf:1\ncell:G8:l:2:f:4:ntvf:1\ncell:C9:t:Product:l:2:f:1:ntvf:1\ncell:D9:v:18000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E9:v:24000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F9:v:10000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G9:vtf:n:52000:IF(SUM(D9\\cF9),SUM(D9\\cF9),\"\"):l:2:f:1:ntvf:2\ncell:H9:f:1\ncell:C10:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D10:v:14000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E10:v:15000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F10:v:9000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G10:vtf:n:38000:IF(SUM(D10\\cF10),SUM(D10\\cF10),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H10:f:1\ncell:C11:t:Product:l:2:f:1:ntvf:1\ncell:D11:v:8000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E11:v:11000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F11:v:7000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G11:vtf:n:26000:IF(SUM(D11\\cF11),SUM(D11\\cF11),\"\"):l:2:f:1:ntvf:2\ncell:H11:f:1\ncell:C12:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D12:v:4000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G12:vtf:n:16000:IF(SUM(D12\\cF12),SUM(D12\\cF12),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H12:f:1\ncell:C13:t:Product:l:2:f:1:ntvf:1\ncell:D13:v:2000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G13:vtf:n:8000:IF(SUM(D13\\cF13),SUM(D13\\cF13),\"\"):l:2:f:1:ntvf:2\ncell:H13:f:1\ncell:C14:l:2:f:1:ntvf:1\ncell:D14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G14:l:2:f:1:ntvf:2\ncell:H14:f:1\ncell:C15:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D15:vtf:n:46000:IF(SUM(D9\\cD13),SUM(D9\\cD13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E15:vtf:n:59000:IF(SUM(E9\\cE13),SUM(E9\\cE13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F15:vtf:n:35000:IF(SUM(F9\\cF13),SUM(F9\\cF13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G15:vtf:n:140000:IF(SUM(G9\\cG13),SUM(G9\\cG13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H15:f:7\ncell:C16:l:2:f:4:ntvf:1\ncell:D16:l:2:f:4:ntvf:2\ncell:E16:l:2:f:4:ntvf:2\ncell:F16:l:2:f:4:ntvf:2\ncell:G16:l:2:f:4:ntvf:2\ncell:C17:t: Mountain Climbing :l:2:f:8:ntvf:1\ncell:D17:l:2:f:4:ntvf:2\ncell:E17:l:2:f:4:ntvf:2\ncell:F17:l:2:f:4:ntvf:2\ncell:G17:l:2:f:4:ntvf:2\ncell:C18:t:Product:l:2:f:5:ntvf:1\ncell:D18:v:4000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E18:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F18:v:6500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G18:vtf:n:18500:IF(SUM(D18\\cF18),SUM(D18\\cF18),\"\"):l:2:f:5:ntvf:2\ncell:H18:f:5\ncell:C19:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D19:v:7000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E19:v:15000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F19:v:9000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G19:vtf:n:31000:IF(SUM(D19\\cF19),SUM(D19\\cF19),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H19:f:5\ncell:C20:t:Product:l:2:f:5:ntvf:1\ncell:D20:v:6000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E20:v:11000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F20:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G20:vtf:n:25000:IF(SUM(D20\\cF20),SUM(D20\\cF20),\"\"):l:2:f:5:ntvf:2\ncell:H20:f:5\ncell:C21:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D21:v:3000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E21:v:5500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F21:v:4500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G21:vtf:n:13000:IF(SUM(D21\\cF21),SUM(D21\\cF21),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H21:f:5\ncell:C22:t:Product:l:2:f:5:ntvf:1\ncell:D22:v:2000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E22:v:3500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F22:v:3000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G22:vtf:n:8500:IF(SUM(D22\\cF22),SUM(D22\\cF22),\"\"):l:2:f:5:ntvf:2\ncell:H22:f:5\ncell:C23:l:2:f:5:ntvf:1\ncell:D23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G23:l:2:f:5:ntvf:2\ncell:H23:f:5\ncell:C24:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D24:vtf:n:22000:IF(SUM(D18\\cD22),SUM(D18\\cD22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E24:vtf:n:43000:IF(SUM(E18\\cE22),SUM(E18\\cE22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F24:vtf:n:31000:IF(SUM(F18\\cF22),SUM(F18\\cF22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G24:vtf:n:96000:IF(SUM(G18\\cG22),SUM(G18\\cG22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H24:f:7\ncell:C25:l:2:f:4:ntvf:1\ncell:D25:l:2:f:4:ntvf:2\ncell:E25:l:2:f:4:ntvf:2\ncell:F25:l:2:f:4:ntvf:2\ncell:G25:l:2:f:4:ntvf:2\ncell:C26:t: Men's Clothing :l:2:f:8:ntvf:1\ncell:D26:l:2:f:4:ntvf:2\ncell:E26:l:2:f:4:ntvf:2\ncell:F26:l:2:f:4:ntvf:2\ncell:G26:l:2:f:4:ntvf:2\ncell:C27:t:Product:l:2:f:5:ntvf:1\ncell:D27:v:16000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E27:v:30000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F27:v:15000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G27:vtf:n:61000:IF(SUM(D27\\cF27),SUM(D27\\cF27),\"\"):l:2:f:5:ntvf:2\ncell:H27:f:5\ncell:C28:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D28:v:18000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E28:v:32000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F28:v:18000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G28:vtf:n:68000:IF(SUM(D28\\cF28),SUM(D28\\cF28),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H28:f:5\ncell:C29:t:Product:l:2:f:5:ntvf:1\ncell:D29:v:24000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E29:v:46000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F29:v:38000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G29:vtf:n:108000:IF(SUM(D29\\cF29),SUM(D29\\cF29),\"\"):l:2:f:5:ntvf:2\ncell:H29:f:5\ncell:C30:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D30:v:16000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E30:v:32000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F30:v:19000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G30:vtf:n:67000:IF(SUM(D30\\cF30),SUM(D30\\cF30),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H30:f:5\ncell:C31:t:Product:l:2:f:5:ntvf:1\ncell:D31:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E31:v:12000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F31:v:10000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G31:vtf:n:30000:IF(SUM(D31\\cF31),SUM(D31\\cF31),\"\"):l:2:f:5:ntvf:2\ncell:H31:f:5\ncell:C32:l:2:f:5:ntvf:1\ncell:D32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G32:l:2:f:5:ntvf:2\ncell:H32:f:5\ncell:C33:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D33:vtf:n:82000:IF(SUM(D27\\cD31),SUM(D27\\cD31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E33:vtf:n:152000:IF(SUM(E27\\cE31),SUM(E27\\cE31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F33:vtf:n:100000:IF(SUM(F27\\cF31),SUM(F27\\cF31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G33:vtf:n:334000:IF(SUM(G27\\cG31),SUM(G27\\cG31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H33:f:7\ncell:C34:l:2:f:4:ntvf:1\ncell:D34:l:2:f:4:ntvf:2\ncell:E34:l:2:f:4:ntvf:2\ncell:F34:l:2:f:4:ntvf:2\ncell:G34:l:2:f:4:ntvf:2\ncell:C35:t: Women's Clothing :l:2:f:8:ntvf:1\ncell:D35:l:2:f:4:ntvf:2\ncell:E35:l:2:f:4:ntvf:2\ncell:F35:l:2:f:4:ntvf:2\ncell:G35:l:2:f:4:ntvf:2\ncell:C36:t:Product:l:2:f:1:ntvf:1\ncell:D36:v:13000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E36:v:26000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F36:v:12000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G36:vtf:n:51000:IF(SUM(D36\\cF36),SUM(D36\\cF36),\"\"):l:2:f:1:ntvf:2\ncell:H36:f:1\ncell:C37:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D37:v:17000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E37:v:32000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F37:v:15000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G37:vtf:n:64000:IF(SUM(D37\\cF37),SUM(D37\\cF37),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H37:f:1\ncell:C38:t:Product:l:2:f:1:ntvf:1\ncell:D38:v:21000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E38:v:42000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F38:v:33000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G38:vtf:n:96000:IF(SUM(D38\\cF38),SUM(D38\\cF38),\"\"):l:2:f:1:ntvf:2\ncell:H38:f:1\ncell:C39:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D39:v:11000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E39:v:19000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F39:v:17500:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G39:vtf:n:47500:IF(SUM(D39\\cF39),SUM(D39\\cF39),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H39:f:1\ncell:C40:t:Product:l:2:f:1:ntvf:1\ncell:D40:v:6500:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E40:v:11500:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F40:v:8500:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G40:vtf:n:26500:IF(SUM(D40\\cF40),SUM(D40\\cF40),\"\"):l:2:f:1:ntvf:2\ncell:H40:f:1\ncell:C41:l:2:f:1:ntvf:1\ncell:D41:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E41:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F41:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G41:l:2:f:1:ntvf:2\ncell:H41:f:1\ncell:C42:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D42:vtf:n:68500:IF(SUM(D36\\cD40),SUM(D36\\cD40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E42:vtf:n:130500:IF(SUM(E36\\cE40),SUM(E36\\cE40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F42:vtf:n:86000:IF(SUM(F36\\cF40),SUM(F36\\cF40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G42:vtf:n:285000:IF(SUM(G36\\cG40),SUM(G36\\cG40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H42:f:7\ncell:C43:l:1:f:4\ncol:A:w:10\ncol:B:w:10\ncol:C:w:309\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:15\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:15\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:15\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nsheet:c:8:r:43:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt *\nfont:6:normal normal 12pt Arial\nfont:7:normal normal 14pt *\nfont:8:normal normal 16pt Arial\nfont:9:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:#,##0.00;(#,##0.00)\nvalueformat:2:#,##0;(#,##0)\nvalueformat:3:@\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::C9\\cC21\nname:DATA_04::F9\\cF21\n"},"name":"sheet24","hidden":"1"},"sheet25":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Sales Revenue:l:2:f:9:c:3:bg:1:cf:1:ntvf:1:colspan:5\ncell:D3:l:2:f:4:cf:1\ncell:E3:l:2:f:3:cf:1:ntvf:1\ncell:F3:l:2:f:3:cf:1:ntvf:1\ncell:G3:l:2:f:3:cf:1:ntvf:1\ncell:C4:t: XYZ, Inc. :l:2:f:8:cf:1:ntvf:1\ncell:D4:l:2:f:4\ncell:E4:l:2:f:2:cf:1:ntvf:1\ncell:F4:l:2:f:2:cf:1:ntvf:1\ncell:G4:l:2:f:2:cf:1:ntvf:1\ncell:C5:t: 2009 Sales:l:2:f:6:cf:1:ntvf:3\ncell:D5:l:2\ncell:E5:l:2:f:2:cf:1:ntvf:1\ncell:F5:l:2:f:2:cf:1:ntvf:1\ncell:G5:l:2:f:2:cf:1:ntvf:1\ncell:C6:l:2\ncell:D6:l:2:f:4:ntvf:1\ncell:E6:l:2:f:4:ntvf:1\ncell:F6:l:2:f:4:ntvf:1\ncell:G6:l:2:f:4:ntvf:1\ncell:C7:l:2:f:4:ntvf:1\ncell:D7:t: Retail :l:2:f:8:cf:1:ntvf:1\ncell:E7:t: Wholesale :l:2:f:8:cf:1:ntvf:1\ncell:F7:t: Mail Order :l:2:f:8:cf:1:ntvf:1\ncell:G7:t:Total Sales:l:2:f:8:cf:1:ntvf:1\ncell:C8:t: Camping Gear :l:2:f:8:ntvf:1\ncell:D8:l:2:f:4:ntvf:1\ncell:E8:l:2:f:4:ntvf:1\ncell:F8:l:2:f:4:ntvf:1\ncell:G8:l:2:f:4:ntvf:1\ncell:C9:t:Product:l:2:f:1:ntvf:1\ncell:D9:v:18000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E9:v:24000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F9:v:10000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G9:vtf:n:52000:IF(SUM(D9\\cF9),SUM(D9\\cF9),\"\"):l:2:f:1:ntvf:2\ncell:H9:f:1\ncell:C10:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D10:v:14000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E10:v:15000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F10:v:9000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G10:vtf:n:38000:IF(SUM(D10\\cF10),SUM(D10\\cF10),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H10:f:1\ncell:C11:t:Product:l:2:f:1:ntvf:1\ncell:D11:v:8000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E11:v:11000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F11:v:7000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G11:vtf:n:26000:IF(SUM(D11\\cF11),SUM(D11\\cF11),\"\"):l:2:f:1:ntvf:2\ncell:H11:f:1\ncell:C12:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D12:v:4000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F12:v:6000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G12:vtf:n:16000:IF(SUM(D12\\cF12),SUM(D12\\cF12),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H12:f:1\ncell:C13:t:Product:l:2:f:1:ntvf:1\ncell:D13:v:2000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F13:v:3000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G13:vtf:n:8000:IF(SUM(D13\\cF13),SUM(D13\\cF13),\"\"):l:2:f:1:ntvf:2\ncell:H13:f:1\ncell:C14:l:2:f:1:ntvf:1\ncell:D14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F14:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G14:l:2:f:1:ntvf:2\ncell:H14:f:1\ncell:C15:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D15:vtf:n:46000:IF(SUM(D9\\cD13),SUM(D9\\cD13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E15:vtf:n:59000:IF(SUM(E9\\cE13),SUM(E9\\cE13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F15:vtf:n:35000:IF(SUM(F9\\cF13),SUM(F9\\cF13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G15:vtf:n:140000:IF(SUM(G9\\cG13),SUM(G9\\cG13),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H15:f:7\ncell:C16:l:2:f:4:ntvf:1\ncell:D16:l:2:f:4:ntvf:2\ncell:E16:l:2:f:4:ntvf:2\ncell:F16:l:2:f:4:ntvf:2\ncell:G16:l:2:f:4:ntvf:2\ncell:C17:t: Mountain Climbing :l:2:f:8:ntvf:1\ncell:D17:l:2:f:4:ntvf:2\ncell:E17:l:2:f:4:ntvf:2\ncell:F17:l:2:f:4:ntvf:2\ncell:G17:l:2:f:4:ntvf:2\ncell:C18:t:Product:l:2:f:5:ntvf:1\ncell:D18:v:4000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E18:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F18:v:6500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G18:vtf:n:18500:IF(SUM(D18\\cF18),SUM(D18\\cF18),\"\"):l:2:f:5:ntvf:2\ncell:H18:f:5\ncell:C19:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D19:v:7000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E19:v:15000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F19:v:9000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G19:vtf:n:31000:IF(SUM(D19\\cF19),SUM(D19\\cF19),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H19:f:5\ncell:C20:t:Product:l:2:f:5:ntvf:1\ncell:D20:v:6000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E20:v:11000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F20:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G20:vtf:n:25000:IF(SUM(D20\\cF20),SUM(D20\\cF20),\"\"):l:2:f:5:ntvf:2\ncell:H20:f:5\ncell:C21:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D21:v:3000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E21:v:5500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F21:v:4500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G21:vtf:n:13000:IF(SUM(D21\\cF21),SUM(D21\\cF21),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H21:f:5\ncell:C22:t:Product:l:2:f:5:ntvf:1\ncell:D22:v:2000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E22:v:3500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F22:v:3000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G22:vtf:n:8500:IF(SUM(D22\\cF22),SUM(D22\\cF22),\"\"):l:2:f:5:ntvf:2\ncell:H22:f:5\ncell:C23:l:2:f:5:ntvf:1\ncell:D23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F23:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G23:l:2:f:5:ntvf:2\ncell:H23:f:5\ncell:C24:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D24:vtf:n:22000:IF(SUM(D18\\cD22),SUM(D18\\cD22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E24:vtf:n:43000:IF(SUM(E18\\cE22),SUM(E18\\cE22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F24:vtf:n:31000:IF(SUM(F18\\cF22),SUM(F18\\cF22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G24:vtf:n:96000:IF(SUM(G18\\cG22),SUM(G18\\cG22),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H24:f:7\ncell:C25:l:2:f:4:ntvf:1\ncell:D25:l:2:f:4:ntvf:2\ncell:E25:l:2:f:4:ntvf:2\ncell:F25:l:2:f:4:ntvf:2\ncell:G25:l:2:f:4:ntvf:2\ncell:C26:t: Men's Clothing :l:2:f:8:ntvf:1\ncell:D26:l:2:f:4:ntvf:2\ncell:E26:l:2:f:4:ntvf:2\ncell:F26:l:2:f:4:ntvf:2\ncell:G26:l:2:f:4:ntvf:2\ncell:C27:t:Product:l:2:f:5:ntvf:1\ncell:D27:v:16000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E27:v:30000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F27:v:15000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G27:vtf:n:61000:IF(SUM(D27\\cF27),SUM(D27\\cF27),\"\"):l:2:f:5:ntvf:2\ncell:H27:f:5\ncell:C28:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D28:v:18000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E28:v:32000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F28:v:18000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G28:vtf:n:68000:IF(SUM(D28\\cF28),SUM(D28\\cF28),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H28:f:5\ncell:C29:t:Product:l:2:f:5:ntvf:1\ncell:D29:v:24000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E29:v:46000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F29:v:38000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G29:vtf:n:108000:IF(SUM(D29\\cF29),SUM(D29\\cF29),\"\"):l:2:f:5:ntvf:2\ncell:H29:f:5\ncell:C30:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D30:v:16000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E30:v:32000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F30:v:19000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G30:vtf:n:67000:IF(SUM(D30\\cF30),SUM(D30\\cF30),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H30:f:5\ncell:C31:t:Product:l:2:f:5:ntvf:1\ncell:D31:v:8000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E31:v:12000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F31:v:10000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G31:vtf:n:30000:IF(SUM(D31\\cF31),SUM(D31\\cF31),\"\"):l:2:f:5:ntvf:2\ncell:H31:f:5\ncell:C32:l:2:f:5:ntvf:1\ncell:D32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F32:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G32:l:2:f:5:ntvf:2\ncell:H32:f:5\ncell:C33:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D33:vtf:n:82000:IF(SUM(D27\\cD31),SUM(D27\\cD31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E33:vtf:n:152000:IF(SUM(E27\\cE31),SUM(E27\\cE31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F33:vtf:n:100000:IF(SUM(F27\\cF31),SUM(F27\\cF31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G33:vtf:n:334000:IF(SUM(G27\\cG31),SUM(G27\\cG31),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H33:f:7\ncell:C34:l:2:f:4:ntvf:1\ncell:D34:l:2:f:4:ntvf:2\ncell:E34:l:2:f:4:ntvf:2\ncell:F34:l:2:f:4:ntvf:2\ncell:G34:l:2:f:4:ntvf:2\ncell:C35:t: Women's Clothing :l:2:f:8:ntvf:1\ncell:D35:l:2:f:4:ntvf:2\ncell:E35:l:2:f:4:ntvf:2\ncell:F35:l:2:f:4:ntvf:2\ncell:G35:l:2:f:4:ntvf:2\ncell:C36:t:Product:l:2:f:1:ntvf:1\ncell:D36:v:13000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E36:v:26000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F36:v:12000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G36:vtf:n:51000:IF(SUM(D36\\cF36),SUM(D36\\cF36),\"\"):l:2:f:1:ntvf:2\ncell:H36:f:1\ncell:C37:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D37:v:17000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E37:v:32000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F37:v:15000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G37:vtf:n:64000:IF(SUM(D37\\cF37),SUM(D37\\cF37),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H37:f:1\ncell:C38:t:Product:l:2:f:1:ntvf:1\ncell:D38:v:21000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E38:v:42000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F38:v:33000:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G38:vtf:n:96000:IF(SUM(D38\\cF38),SUM(D38\\cF38),\"\"):l:2:f:1:ntvf:2\ncell:H38:f:1\ncell:C39:t:Product:l:2:f:1:bg:2:ntvf:1\ncell:D39:v:11000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:E39:v:19000:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:F39:v:17500:b:1:1:1:1:l:2:f:1:bg:2:ntvf:2\ncell:G39:vtf:n:47500:IF(SUM(D39\\cF39),SUM(D39\\cF39),\"\"):l:2:f:1:bg:2:ntvf:2\ncell:H39:f:1\ncell:C40:t:Product:l:2:f:1:ntvf:1\ncell:D40:v:6500:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E40:v:11500:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F40:v:8500:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G40:vtf:n:26500:IF(SUM(D40\\cF40),SUM(D40\\cF40),\"\"):l:2:f:1:ntvf:2\ncell:H40:f:1\ncell:C41:l:2:f:1:ntvf:1\ncell:D41:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:E41:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:F41:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:G41:l:2:f:1:ntvf:2\ncell:H41:f:1\ncell:C42:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D42:vtf:n:68500:IF(SUM(D36\\cD40),SUM(D36\\cD40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E42:vtf:n:130500:IF(SUM(E36\\cE40),SUM(E36\\cE40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F42:vtf:n:86000:IF(SUM(F36\\cF40),SUM(F36\\cF40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G42:vtf:n:285000:IF(SUM(G36\\cG40),SUM(G36\\cG40),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H42:f:7\ncell:C43:l:2:f:4:ntvf:1\ncell:D43:l:2:f:4:ntvf:2\ncell:E43:l:2:f:4:ntvf:2\ncell:F43:l:2:f:4:ntvf:2\ncell:G43:l:2:f:4:ntvf:2\ncell:C44:t: Kids Corner :l:2:f:8:ntvf:1\ncell:D44:l:2:f:4:ntvf:2\ncell:E44:l:2:f:4:ntvf:2\ncell:F44:l:2:f:4:ntvf:2\ncell:G44:l:2:f:4:ntvf:2\ncell:C45:t:Product:l:2:f:5:ntvf:1\ncell:D45:v:7000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E45:v:13000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F45:v:9000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G45:vtf:n:29000:IF(SUM(D45\\cF45),SUM(D45\\cF45),\"\"):l:2:f:5:ntvf:2\ncell:H45:f:5\ncell:C46:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D46:v:8500:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E46:v:16000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F46:v:11000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G46:vtf:n:35500:IF(SUM(D46\\cF46),SUM(D46\\cF46),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H46:f:5\ncell:C47:t:Product:l:2:f:5:ntvf:1\ncell:D47:v:13000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E47:v:22000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F47:v:17000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G47:vtf:n:52000:IF(SUM(D47\\cF47),SUM(D47\\cF47),\"\"):l:2:f:5:ntvf:2\ncell:H47:f:5\ncell:C48:t:Product:l:2:f:5:bg:2:ntvf:1\ncell:D48:v:6000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:E48:v:11000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:F48:v:9000:b:1:1:1:1:l:2:f:5:bg:2:ntvf:2\ncell:G48:vtf:n:26000:IF(SUM(D48\\cF48),SUM(D48\\cF48),\"\"):l:2:f:5:bg:2:ntvf:2\ncell:H48:f:5\ncell:C49:t:Product:l:2:f:5:ntvf:1\ncell:D49:v:4000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E49:v:7000:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F49:v:6500:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G49:vtf:n:17500:IF(SUM(D49\\cF49),SUM(D49\\cF49),\"\"):l:2:f:5:ntvf:2\ncell:H49:f:5\ncell:C50:l:2:f:5:ntvf:1\ncell:D50:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:E50:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:F50:b:1:1:1:1:l:2:f:5:ntvf:2\ncell:G50:l:2:f:5:ntvf:2\ncell:H50:f:5\ncell:C51:t:Total :l:2:f:7:cf:2:ntvf:1\ncell:D51:vtf:n:38500:IF(SUM(D45\\cD49),SUM(D45\\cD49),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:E51:vtf:n:69000:IF(SUM(E45\\cE49),SUM(E45\\cE49),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:F51:vtf:n:52500:IF(SUM(F45\\cF49),SUM(F45\\cF49),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:G51:vtf:n:160000:IF(SUM(G45\\cG49),SUM(G45\\cG49),\"\"):b:1::1::l:2:f:7:ntvf:2\ncell:H51:f:7\ncell:C52:l:2\ncell:D52:l:2\ncell:E52:l:2\ncell:F52:l:2\ncell:G52:l:2\ncell:C54:l:1:f:4\ncol:A:w:10\ncol:B:w:10\ncol:C:w:309\ncol:D:w:118\ncol:E:w:118\ncol:F:w:118\ncol:G:w:118\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:15\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:15\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:15\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:14.25\nrow:44:h:15\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:51:h:14.25\nrow:54:h:14.25\nsheet:c:8:r:54:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 12pt *\nfont:2:normal bold 12pt Arial\nfont:3:normal bold 26pt Times New Roman\nfont:4:normal normal 10pt Arial\nfont:5:normal normal 12pt *\nfont:6:normal normal 12pt Arial\nfont:7:normal normal 14pt *\nfont:8:normal normal 16pt Arial\nfont:9:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:#,##0.00;(#,##0.00)\nvalueformat:2:#,##0;(#,##0)\nvalueformat:3:@\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::C9\\cC21\nname:DATA_04::F9\\cF21\n"},"name":"sheet25","hidden":"1"},"sheet26":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Product Sales Goals:l:2:f:6:c:3:bg:1:cf:1:colspan:12\ncell:D3:l:2:f:1:cf:1\ncell:E3:l:2:f:1:cf:1\ncell:F3:l:2:f:1:cf:1\ncell:G3:l:2:f:1:cf:1\ncell:H3:l:2:f:1:cf:1\ncell:I3:l:2:f:1:cf:1\ncell:J3:l:2:f:1:cf:1\ncell:K3:l:2:f:1:cf:1\ncell:L3:l:2:f:1:cf:1\ncell:M3:l:2:f:1:cf:1\ncell:N3:l:2:f:1:cf:1\ncell:D4:l:2:f:1:cf:1\ncell:E4:l:2:f:1:cf:1\ncell:F4:l:2:f:1:cf:1\ncell:G4:l:2:f:1:cf:1\ncell:H4:l:2:f:1:cf:1\ncell:I4:l:2:f:1:cf:1\ncell:J4:l:2:f:1:cf:1\ncell:K4:l:2:f:1:cf:1\ncell:L4:l:2:f:1:cf:1\ncell:M4:l:2:f:1:cf:1\ncell:N4:l:2:f:1:cf:1\ncell:C5:t:2000 Units:l:2:f:3:cf:1:colspan:4\ncell:D5:l:2:f:1:cf:1\ncell:E5:l:2:f:1:cf:1\ncell:F5:l:2:f:1:cf:1\ncell:G5:l:2:f:1:cf:1\ncell:H5:l:2:f:1:cf:1\ncell:I5:l:2:f:1:cf:1\ncell:J5:l:2:f:1:cf:1\ncell:K5:l:2:f:1:cf:1\ncell:L5:l:2:f:1:cf:1\ncell:M5:l:2:f:1:cf:1\ncell:N5:l:2:f:1:cf:1\ncell:C6:l:2:f:1\ncell:D6:l:2\ncell:E6:l:2:f:1\ncell:F6:l:2:f:1\ncell:G6:l:2:f:1\ncell:H6:l:2:f:1\ncell:I6:l:2:f:1\ncell:J6:l:2:f:1\ncell:K6:l:2:f:1\ncell:L6:l:2:f:1\ncell:M6:l:2:f:1\ncell:N6:l:2:f:1\ncell:C7:l:2:f:1\ncell:D7:t:TRAINS:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:E7:t::l:2:f:5\ncell:F7:t::l:2:f:5\ncell:G7:l:2:f:5\ncell:H7:t:PLANES:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:I7:t::l:2:f:5\ncell:J7:t::l:2:f:5\ncell:K7:l:2:f:5\ncell:L7:t:TOTAL:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:M7:t::l:2:f:1\ncell:N7:t::l:2:f:1\ncell:C8:l:2:f:1\ncell:D8:t:Last Yr:b:::2::l:2:f:3:cf:1\ncell:E8:t:Goal:b:::2::l:2:f:3:cf:1\ncell:F8:t:Change:l:2:f:3:cf:1\ncell:G8:l:2:f:3:cf:1\ncell:H8:t:Last Yr:b:::2::l:2:f:3:cf:1\ncell:I8:t:Goal:b:::2::l:2:f:3:cf:1\ncell:J8:t:Change:l:2:f:3:cf:1\ncell:K8:l:2:f:3:cf:1\ncell:L8:t:Last Yr:l:2:f:3:cf:1\ncell:M8:t:Goal:l:2:f:3:cf:1\ncell:N8:t:Change:l:2:f:3:cf:1\ncell:C9:t:Jan:b::2:::l:2:f:2\ncell:D9:v:1782:b:2:2:2:2:l:2:f:2\ncell:E9:v:2000:b:2:2:2:2:l:2:f:2\ncell:F9:vtf:n:0.122334455667789:IF(ISNUMBER(D9),((E9-D9)/D9),\"\"):l:2:f:2:ntvf:1\ncell:G9:l:2:f:2:ntvf:1\ncell:H9:v:325:b:2:2:2:2:l:2:f:2\ncell:I9:v:350:b:2:2:2:2:l:2:f:2\ncell:J9:vtf:n:0.07692307692307693:IF(ISNUMBER(H9),((I9-H9)/H9),\"\"):l:2:f:2:ntvf:1\ncell:K9:l:2:f:2:ntvf:1\ncell:L9:vtf:n:2107:IF(SUM(D9,H9),SUM(D9,H9),\"\"):l:2:f:2\ncell:M9:vtf:n:2350:IF(SUM(E9,I9),SUM(E9,I9),\"\"):l:2:f:2\ncell:N9:vtf:n:0.11532985287138112:IF(ISNUMBER(L9),((M9-L9)/L9),\"\"):l:2:f:2:ntvf:1\ncell:O9:f:2\ncell:C10:t:Feb:b::2:::l:2:f:2:bg:2\ncell:D10:v:1523:b:2:2:2:2:l:2:f:2:bg:2\ncell:E10:v:1700:b:2:2:2:2:l:2:f:2:bg:2\ncell:F10:vtf:n:0.11621799080761655:IF(ISNUMBER(D10),((E10-D10)/D10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G10:l:2:f:2:ntvf:1\ncell:H10:v:158:b:2:2:2:2:l:2:f:2:bg:2\ncell:I10:v:200:b:2:2:2:2:l:2:f:2:bg:2\ncell:J10:vtf:n:0.26582278481012656:IF(ISNUMBER(H10),((I10-H10)/H10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K10:l:2:f:2:ntvf:1\ncell:L10:vtf:n:1681:IF(SUM(D10,H10),SUM(D10,H10),\"\"):l:2:f:2:bg:2\ncell:M10:vtf:n:1900:IF(SUM(E10,I10),SUM(E10,I10),\"\"):l:2:f:2:bg:2\ncell:N10:vtf:n:0.13027959547888163:IF(ISNUMBER(L10),((M10-L10)/L10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O10:f:2\ncell:C11:t:Mar:b::2:::l:2:f:2\ncell:D11:v:1901:b:2:2:2:2:l:2:f:2\ncell:E11:v:2000:b:2:2:2:2:l:2:f:2\ncell:F11:vtf:n:0.05207785376117833:IF(ISNUMBER(D11),((E11-D11)/D11),\"\"):l:2:f:2:ntvf:1\ncell:G11:l:2:f:2:ntvf:1\ncell:H11:v:168:b:2:2:2:2:l:2:f:2\ncell:I11:v:200:b:2:2:2:2:l:2:f:2\ncell:J11:vtf:n:0.19047619047619047:IF(ISNUMBER(H11),((I11-H11)/H11),\"\"):l:2:f:2:ntvf:1\ncell:K11:l:2:f:2:ntvf:1\ncell:L11:vtf:n:2069:IF(SUM(D11,H11),SUM(D11,H11),\"\"):l:2:f:2\ncell:M11:vtf:n:2200:IF(SUM(E11,I11),SUM(E11,I11),\"\"):l:2:f:2\ncell:N11:vtf:n:0.06331561140647655:IF(ISNUMBER(L11),((M11-L11)/L11),\"\"):l:2:f:2:ntvf:1\ncell:O11:f:2\ncell:C12:t:Apr:b::1:::l:2:f:2:bg:2\ncell:D12:v:2308:b:2:1:2:2:l:2:f:2:bg:2\ncell:E12:v:2400:b:2:1:2:2:l:2:f:2:bg:2\ncell:F12:vtf:n:0.03986135181975736:IF(ISNUMBER(D12),((E12-D12)/D12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G12:l:2:f:2:ntvf:1\ncell:H12:v:365:b:2:1:2:2:l:2:f:2:bg:2\ncell:I12:v:400:b:2:1:2:2:l:2:f:2:bg:2\ncell:J12:vtf:n:0.0958904109589041:IF(ISNUMBER(H12),((I12-H12)/H12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K12:l:2:f:2:ntvf:1\ncell:L12:vtf:n:2673:IF(SUM(D12,H12),SUM(D12,H12),\"\"):l:2:f:2:bg:2\ncell:M12:vtf:n:2800:IF(SUM(E12,I12),SUM(E12,I12),\"\"):l:2:f:2:bg:2\ncell:N12:vtf:n:0.04751215862326973:IF(ISNUMBER(L12),((M12-L12)/L12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O12:f:2\ncell:C13:t:May:b::2:::l:2:f:2\ncell:D13:v:2538:b:2:2:2:2:l:2:f:2\ncell:E13:v:2800:b:2:2:2:2:l:2:f:2\ncell:F13:vtf:n:0.10323089046493301:IF(ISNUMBER(D13),((E13-D13)/D13),\"\"):l:2:f:2:ntvf:1\ncell:G13:l:2:f:2:ntvf:1\ncell:H13:v:402:b:2:2:2:2:l:2:f:2\ncell:I13:v:450:b:2:2:2:2:l:2:f:2\ncell:J13:vtf:n:0.11940298507462686:IF(ISNUMBER(H13),((I13-H13)/H13),\"\"):l:2:f:2:ntvf:1\ncell:K13:l:2:f:2:ntvf:1\ncell:L13:vtf:n:2940:IF(SUM(D13,H13),SUM(D13,H13),\"\"):l:2:f:2\ncell:M13:vtf:n:3250:IF(SUM(E13,I13),SUM(E13,I13),\"\"):l:2:f:2\ncell:N13:vtf:n:0.1054421768707483:IF(ISNUMBER(L13),((M13-L13)/L13),\"\"):l:2:f:2:ntvf:1\ncell:O13:f:2\ncell:C14:t:Jun:b::2:::l:2:f:2:bg:2\ncell:D14:v:1866:b:2:2:2:2:l:2:f:2:bg:2\ncell:E14:v:2000:b:2:2:2:2:l:2:f:2:bg:2\ncell:F14:vtf:n:0.07181136120042872:IF(ISNUMBER(D14),((E14-D14)/D14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G14:l:2:f:2:ntvf:1\ncell:H14:v:217:b:2:2:2:2:l:2:f:2:bg:2\ncell:I14:v:250:b:2:2:2:2:l:2:f:2:bg:2\ncell:J14:vtf:n:0.15207373271889402:IF(ISNUMBER(H14),((I14-H14)/H14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K14:l:2:f:2:ntvf:1\ncell:L14:vtf:n:2083:IF(SUM(D14,H14),SUM(D14,H14),\"\"):l:2:f:2:bg:2\ncell:M14:vtf:n:2250:IF(SUM(E14,I14),SUM(E14,I14),\"\"):l:2:f:2:bg:2\ncell:N14:vtf:n:0.0801728276524244:IF(ISNUMBER(L14),((M14-L14)/L14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O14:f:2\ncell:C15:t:Jul:b::2:::l:2:f:2\ncell:D15:v:2212:b:2:2:2:2:l:2:f:2\ncell:E15:v:2500:b:2:2:2:2:l:2:f:2\ncell:F15:vtf:n:0.1301989150090416:IF(ISNUMBER(D15),((E15-D15)/D15),\"\"):l:2:f:2:ntvf:1\ncell:G15:l:2:f:2:ntvf:1\ncell:H15:v:264:b:2:2:2:2:l:2:f:2\ncell:I15:v:300:b:2:2:2:2:l:2:f:2\ncell:J15:vtf:n:0.13636363636363635:IF(ISNUMBER(H15),((I15-H15)/H15),\"\"):l:2:f:2:ntvf:1\ncell:K15:l:2:f:2:ntvf:1\ncell:L15:vtf:n:2476:IF(SUM(D15,H15),SUM(D15,H15),\"\"):l:2:f:2\ncell:M15:vtf:n:2800:IF(SUM(E15,I15),SUM(E15,I15),\"\"):l:2:f:2\ncell:N15:vtf:n:0.1308562197092084:IF(ISNUMBER(L15),((M15-L15)/L15),\"\"):l:2:f:2:ntvf:1\ncell:O15:f:2\ncell:C16:t:Aug:b::2:::l:2:f:2:bg:2\ncell:D16:v:1998:b:2:2:2:2:l:2:f:2:bg:2\ncell:E16:v:2300:b:2:2:2:2:l:2:f:2:bg:2\ncell:F16:vtf:n:0.15115115115115116:IF(ISNUMBER(D16),((E16-D16)/D16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G16:l:2:f:2:ntvf:1\ncell:H16:v:267:b:2:2:2:2:l:2:f:2:bg:2\ncell:I16:v:300:b:2:2:2:2:l:2:f:2:bg:2\ncell:J16:vtf:n:0.12359550561797752:IF(ISNUMBER(H16),((I16-H16)/H16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K16:l:2:f:2:ntvf:1\ncell:L16:vtf:n:2265:IF(SUM(D16,H16),SUM(D16,H16),\"\"):l:2:f:2:bg:2\ncell:M16:vtf:n:2600:IF(SUM(E16,I16),SUM(E16,I16),\"\"):l:2:f:2:bg:2\ncell:N16:vtf:n:0.1479028697571744:IF(ISNUMBER(L16),((M16-L16)/L16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O16:f:2\ncell:C17:t:Sep:b::2:::l:2:f:2\ncell:D17:v:2054:b:2:2:2:2:l:2:f:2\ncell:E17:v:2000:b:2:2:2:2:l:2:f:2\ncell:F17:vtf:n:-0.02629016553067186:IF(ISNUMBER(D17),((E17-D17)/D17),\"\"):l:2:f:2:ntvf:1\ncell:G17:l:2:f:2:ntvf:1\ncell:H17:v:318:b:2:2:2:2:l:2:f:2\ncell:I17:v:350:b:2:2:2:2:l:2:f:2\ncell:J17:vtf:n:0.10062893081761007:IF(ISNUMBER(H17),((I17-H17)/H17),\"\"):l:2:f:2:ntvf:1\ncell:K17:l:2:f:2:ntvf:1\ncell:L17:vtf:n:2372:IF(SUM(D17,H17),SUM(D17,H17),\"\"):l:2:f:2\ncell:M17:vtf:n:2350:IF(SUM(E17,I17),SUM(E17,I17),\"\"):l:2:f:2\ncell:N17:vtf:n:-0.00927487352445194:IF(ISNUMBER(L17),((M17-L17)/L17),\"\"):l:2:f:2:ntvf:1\ncell:O17:f:2\ncell:C18:t:Oct:b::2:::l:2:f:2:bg:2\ncell:D18:v:2117:b:2:2:2:2:l:2:f:2:bg:2\ncell:E18:v:2400:b:2:2:2:2:l:2:f:2:bg:2\ncell:F18:vtf:n:0.1336797354747284:IF(ISNUMBER(D18),((E18-D18)/D18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G18:l:2:f:2:ntvf:1\ncell:H18:v:159:b:2:2:2:2:l:2:f:2:bg:2\ncell:I18:v:200:b:2:2:2:2:l:2:f:2:bg:2\ncell:J18:vtf:n:0.2578616352201258:IF(ISNUMBER(H18),((I18-H18)/H18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K18:l:2:f:2:ntvf:1\ncell:L18:vtf:n:2276:IF(SUM(D18,H18),SUM(D18,H18),\"\"):l:2:f:2:bg:2\ncell:M18:vtf:n:2600:IF(SUM(E18,I18),SUM(E18,I18),\"\"):l:2:f:2:bg:2\ncell:N18:vtf:n:0.14235500878734622:IF(ISNUMBER(L18),((M18-L18)/L18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O18:f:2\ncell:C19:t:Nov:b::2:::l:2:f:2\ncell:D19:v:1430:b:2:2:2:2:l:2:f:2\ncell:E19:v:1600:b:2:2:2:2:l:2:f:2\ncell:F19:vtf:n:0.11888111888111888:IF(ISNUMBER(D19),((E19-D19)/D19),\"\"):l:2:f:2:ntvf:1\ncell:G19:l:2:f:2:ntvf:1\ncell:H19:v:193:b:2:2:2:2:l:2:f:2\ncell:I19:v:200:b:2:2:2:2:l:2:f:2\ncell:J19:vtf:n:0.03626943005181347:IF(ISNUMBER(H19),((I19-H19)/H19),\"\"):l:2:f:2:ntvf:1\ncell:K19:l:2:f:2:ntvf:1\ncell:L19:vtf:n:1623:IF(SUM(D19,H19),SUM(D19,H19),\"\"):l:2:f:2\ncell:M19:vtf:n:1800:IF(SUM(E19,I19),SUM(E19,I19),\"\"):l:2:f:2\ncell:N19:vtf:n:0.10905730129390019:IF(ISNUMBER(L19),((M19-L19)/L19),\"\"):l:2:f:2:ntvf:1\ncell:O19:f:2\ncell:C20:t:Dec:b::1:::l:2:f:2:bg:2\ncell:D20:v:1859:b:2:1:2:2:l:2:f:2:bg:2\ncell:E20:v:2100:b:2:1:2:2:l:2:f:2:bg:2\ncell:F20:vtf:n:0.1296395911780527:IF(ISNUMBER(D20),((E20-D20)/D20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G20:l:2:f:2:ntvf:1\ncell:H20:v:426:b:2:1:2:2:l:2:f:2:bg:2\ncell:I20:v:450:b:2:1:2:2:l:2:f:2:bg:2\ncell:J20:vtf:n:0.056338028169014086:IF(ISNUMBER(H20),((I20-H20)/H20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K20:l:2:f:2:ntvf:1\ncell:L20:vtf:n:2285:IF(SUM(D20,H20),SUM(D20,H20),\"\"):l:2:f:2:bg:2\ncell:M20:vtf:n:2550:IF(SUM(E20,I20),SUM(E20,I20),\"\"):l:2:f:2:bg:2\ncell:N20:vtf:n:0.11597374179431072:IF(ISNUMBER(L20),((M20-L20)/L20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O20:f:2\ncell:C22:t:Year :l:2:f:4\ncell:D22:vtf:n:23588:IF(SUM(D9\\cD20),SUM(D9\\cD20),\"\"):b:1::1::l:2:f:4\ncell:E22:vtf:n:25800:IF(SUM(E9\\cE20),SUM(E9\\cE20),\"\"):b:1::1::l:2:f:4\ncell:F22:vtf:n:0.09377649652365609:IF(ISNUMBER(D22),((E22-D22)/D22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:G22:b:1::1::l:2:f:2:ntvf:1\ncell:H22:vtf:n:3262:IF(SUM(H9\\cH20),SUM(H9\\cH20),\"\"):b:1::1::l:2:f:4\ncell:I22:vtf:n:3650:IF(SUM(I9\\cI20),SUM(I9\\cI20),\"\"):b:1::1::l:2:f:4\ncell:J22:vtf:n:0.11894543225015328:IF(ISNUMBER(H22),((I22-H22)/H22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:K22:b:1::1::l:2:f:2:ntvf:1\ncell:L22:vtf:n:26850:IF(SUM(L9\\cL20),SUM(L9\\cL20),\"\"):b:1::1::l:2:f:4\ncell:M22:vtf:n:29450:IF(SUM(M9\\cM20),SUM(M9\\cM20),\"\"):b:1::1::l:2:f:4\ncell:N22:vtf:n:0.09683426443202979:IF(ISNUMBER(L22),((M22-L22)/L22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:O22:f:2\ncell:C23:l:2:f:2\ncell:D23:l:2:f:2\ncell:E23:l:2:f:2\ncell:F23:l:2:f:2\ncell:G23:l:2:f:2\ncell:H23:l:2:f:2\ncell:I23:l:2:f:2\ncell:J23:l:2:f:2\ncell:K23:l:2:f:2\ncell:L23:l:2:f:2\ncell:M23:l:2:f:2\ncell:N23:l:2:f:2\ncell:O23:f:2\ncell:C24:t:Date\\c :l:2:f:2:cf:2\ncell:D24:b:::2::l:2:f:2:ntvf:2\ncell:E24:l:2:f:2\ncell:F24:l:2:f:2\ncell:G24:l:2:f:2\ncell:H24:l:2:f:2\ncell:I24:l:2:f:2\ncell:J24:l:2:f:2\ncell:K24:l:2:f:2:cf:1\ncell:L24:b:::2::l:2:f:2:cf:1\ncell:M24:b:::2::l:2:f:2:cf:1\ncell:N24:b:::2::l:2:f:2:cf:1\ncell:O24:f:2\ncell:C25:l:2:f:2\ncell:D25:b:2::::l:2:f:2\ncell:E25:l:2:f:2\ncell:F25:l:2:f:2\ncell:G25:l:2:f:2\ncell:H25:l:2:f:2\ncell:I25:l:2:f:2\ncell:J25:l:2:f:2\ncell:K25:b:2::::l:2:f:2\ncell:L25:b:2::::l:2:f:2\ncell:M25:b:2::::l:2:f:2\ncell:N25:b:2::::l:2:f:2\ncell:O25:f:2\ncell:C26:l:2\ncell:D26:l:2\ncell:E26:l:2\ncell:F26:l:2\ncell:G26:l:2\ncell:H26:l:2\ncell:I26:l:2\ncell:J26:l:2\ncell:K26:l:2\ncell:L26:l:2\ncell:M26:l:2\ncell:N26:l:2\ncell:C27:l:1:f:1\ncol:A:w:10\ncol:B:w:10\ncol:C:w:52\ncol:D:w:80\ncol:E:w:80\ncol:F:w:71\ncol:G:w:15\ncol:H:w:80\ncol:I:w:80\ncol:J:w:71\ncol:K:w:15\ncol:L:w:80\ncol:M:w:80\ncol:N:w:71\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:18.75\nrow:6:h:14.25\nrow:7:h:15.75\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:27:h:14.25\nsheet:c:15:r:27:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal normal 10pt Arial\nfont:2:normal normal 12pt arial,helvetica,sans-serif\nfont:3:normal normal 14pt Arial\nfont:4:normal normal 14pt arial,helvetica,sans-serif\nfont:5:normal normal 16pt Arial\nfont:6:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:0%\nvalueformat:2:dd-mmm-yy \nname:DATA_01::C5\nname:DATA_02::C10\nname:DATA_03::D10\\cD22\nname:DATA_04::H10\\cH22\n"},"name":"sheet26","hidden":"1"},"sheet27":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Product Sales Goals:l:2:f:6:c:3:bg:1:cf:1:colspan:16\ncell:D3:l:2:f:1:cf:1\ncell:E3:l:2:f:1:cf:1\ncell:F3:l:2:f:1:cf:1\ncell:G3:l:2:f:1:cf:1\ncell:H3:l:2:f:1:cf:1\ncell:I3:l:2:f:1:cf:1\ncell:J3:l:2:f:1:cf:1\ncell:K3:l:2:f:1:cf:1\ncell:L3:l:2:f:1:cf:1\ncell:M3:l:2:f:1:cf:1\ncell:N3:l:2:f:1:cf:1\ncell:O3:l:2:f:1:cf:1\ncell:P3:l:2:f:1:cf:1\ncell:Q3:l:2:f:1:cf:1\ncell:R3:l:2:f:1:cf:1\ncell:D4:l:2:f:1:cf:1\ncell:E4:l:2:f:1:cf:1\ncell:F4:l:2:f:1:cf:1\ncell:G4:l:2:f:1:cf:1\ncell:H4:l:2:f:1:cf:1\ncell:I4:l:2:f:1:cf:1\ncell:J4:l:2:f:1:cf:1\ncell:K4:l:2:f:1:cf:1\ncell:L4:l:2:f:1:cf:1\ncell:M4:l:2:f:1:cf:1\ncell:N4:l:2:f:1:cf:1\ncell:O4:l:2:f:1:cf:1\ncell:P4:l:2:f:1:cf:1\ncell:Q4:l:2:f:1:cf:1\ncell:R4:l:2:f:1:cf:1\ncell:C5:t:2000 Units:l:2:f:3:cf:1:colspan:4\ncell:D5:l:2:f:1:cf:1\ncell:E5:l:2:f:1:cf:1\ncell:F5:l:2:f:1:cf:1\ncell:G5:l:2:f:1:cf:1\ncell:H5:l:2:f:1:cf:1\ncell:I5:l:2:f:1:cf:1\ncell:J5:l:2:f:1:cf:1\ncell:K5:l:2:f:1:cf:1\ncell:L5:l:2:f:1:cf:1\ncell:M5:l:2:f:1:cf:1\ncell:N5:l:2:f:1:cf:1\ncell:O5:l:2:f:1:cf:1\ncell:P5:l:2:f:1:cf:1\ncell:Q5:l:2:f:1:cf:1\ncell:R5:l:2:f:1:cf:1\ncell:C6:l:2:f:1\ncell:D6:l:2\ncell:E6:l:2:f:1\ncell:F6:l:2:f:1\ncell:G6:l:2:f:1\ncell:H6:l:2:f:1\ncell:I6:l:2:f:1\ncell:J6:l:2:f:1\ncell:K6:l:2:f:1\ncell:L6:l:2:f:1\ncell:M6:l:2:f:1\ncell:N6:l:2:f:1\ncell:O6:l:2:f:1\ncell:P6:l:2:f:1\ncell:Q6:l:2:f:1\ncell:R6:l:2:f:1\ncell:C7:l:2:f:1\ncell:D7:t:TRAINS:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:E7:t::l:2:f:5\ncell:F7:t::l:2:f:5\ncell:G7:l:2:f:5\ncell:H7:t:PLANES:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:I7:t::l:2:f:5\ncell:J7:t::l:2:f:5\ncell:K7:l:2:f:5\ncell:L7:t:AUTOMOBILES:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:M7:t::l:2:f:5\ncell:N7:t::l:2:f:5\ncell:O7:l:2:f:5\ncell:P7:t:TOTAL:l:2:f:5:cf:1:colspan:3:rowspan:1\ncell:Q7:t::l:2:f:1\ncell:R7:t::l:2:f:1\ncell:C8:l:2:f:1\ncell:D8:t:Last Yr:b:::2::l:2:f:3:cf:1\ncell:E8:t:Goal:b:::2::l:2:f:3:cf:1\ncell:F8:t:Change:l:2:f:3:cf:1\ncell:G8:l:2:f:3:cf:1\ncell:H8:t:Last Yr:b:::2::l:2:f:3:cf:1\ncell:I8:t:Goal:b:::2::l:2:f:3:cf:1\ncell:J8:t:Change:l:2:f:3:cf:1\ncell:K8:l:2:f:3:cf:1\ncell:L8:t:Last Yr:b:::2::l:2:f:3:cf:1\ncell:M8:t:Goal:b:::2::l:2:f:3:cf:1\ncell:N8:t:Change:l:2:f:3:cf:1\ncell:O8:l:2:f:3:cf:1\ncell:P8:t:Last Yr:l:2:f:3:cf:1\ncell:Q8:t:Goal:l:2:f:3:cf:1\ncell:R8:t:Change:l:2:f:3:cf:1\ncell:C9:t:Jan:b::2:::l:2:f:2\ncell:D9:v:1782:b:2:2:2:2:l:2:f:2\ncell:E9:v:2000:b:2:2:2:2:l:2:f:2\ncell:F9:vtf:n:0.122334455667789:IF(ISNUMBER(D9),((E9-D9)/D9),\"\"):l:2:f:2:ntvf:1\ncell:G9:l:2:f:2:ntvf:1\ncell:H9:v:325:b:2:2:2:2:l:2:f:2\ncell:I9:v:350:b:2:2:2:2:l:2:f:2\ncell:J9:vtf:n:0.07692307692307693:IF(ISNUMBER(H9),((I9-H9)/H9),\"\"):l:2:f:2:ntvf:1\ncell:K9:l:2:f:2:ntvf:1\ncell:L9:v:711:b:2:2:2:2:l:2:f:2\ncell:M9:v:800:b:2:2:2:2:l:2:f:2\ncell:N9:vtf:n:0.12517580872011252:IF(ISNUMBER(L9),((M9-L9)/L9),\"\"):l:2:f:2:ntvf:1\ncell:O9:l:2:f:2:ntvf:1\ncell:P9:vtf:n:2818:IF(SUM(D9,H9,L9),SUM(D9,H9,L9),\"\"):l:2:f:2\ncell:Q9:vtf:n:3150:IF(SUM(E9,I9,M9),SUM(E9,I9,M9),\"\"):l:2:f:2\ncell:R9:vtf:n:0.11781405251951739:IF(ISNUMBER(P9),((Q9-P9)/P9),\"\"):l:2:f:2:ntvf:1\ncell:S9:f:2\ncell:C10:t:Feb:b::2:::l:2:f:2:bg:2\ncell:D10:v:1523:b:2:2:2:2:l:2:f:2:bg:2\ncell:E10:v:1700:b:2:2:2:2:l:2:f:2:bg:2\ncell:F10:vtf:n:0.11621799080761655:IF(ISNUMBER(D10),((E10-D10)/D10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G10:l:2:f:2:ntvf:1\ncell:H10:v:158:b:2:2:2:2:l:2:f:2:bg:2\ncell:I10:v:200:b:2:2:2:2:l:2:f:2:bg:2\ncell:J10:vtf:n:0.26582278481012656:IF(ISNUMBER(H10),((I10-H10)/H10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K10:l:2:f:2:ntvf:1\ncell:L10:v:564:b:2:2:2:2:l:2:f:2:bg:2\ncell:M10:v:650:b:2:2:2:2:l:2:f:2:bg:2\ncell:N10:vtf:n:0.1524822695035461:IF(ISNUMBER(L10),((M10-L10)/L10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O10:l:2:f:2:ntvf:1\ncell:P10:vtf:n:2245:IF(SUM(D10,H10,L10),SUM(D10,H10,L10),\"\"):l:2:f:2:bg:2\ncell:Q10:vtf:n:2550:IF(SUM(E10,I10,M10),SUM(E10,I10,M10),\"\"):l:2:f:2:bg:2\ncell:R10:vtf:n:0.1358574610244989:IF(ISNUMBER(P10),((Q10-P10)/P10),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:S10:f:2\ncell:C11:t:Mar:b::2:::l:2:f:2\ncell:D11:v:1901:b:2:2:2:2:l:2:f:2\ncell:E11:v:2000:b:2:2:2:2:l:2:f:2\ncell:F11:vtf:n:0.05207785376117833:IF(ISNUMBER(D11),((E11-D11)/D11),\"\"):l:2:f:2:ntvf:1\ncell:G11:l:2:f:2:ntvf:1\ncell:H11:v:168:b:2:2:2:2:l:2:f:2\ncell:I11:v:200:b:2:2:2:2:l:2:f:2\ncell:J11:vtf:n:0.19047619047619047:IF(ISNUMBER(H11),((I11-H11)/H11),\"\"):l:2:f:2:ntvf:1\ncell:K11:l:2:f:2:ntvf:1\ncell:L11:v:740:b:2:2:2:2:l:2:f:2\ncell:M11:v:850:b:2:2:2:2:l:2:f:2\ncell:N11:vtf:n:0.14864864864864866:IF(ISNUMBER(L11),((M11-L11)/L11),\"\"):l:2:f:2:ntvf:1\ncell:O11:l:2:f:2:ntvf:1\ncell:P11:vtf:n:2809:IF(SUM(D11,H11,L11),SUM(D11,H11,L11),\"\"):l:2:f:2\ncell:Q11:vtf:n:3050:IF(SUM(E11,I11,M11),SUM(E11,I11,M11),\"\"):l:2:f:2\ncell:R11:vtf:n:0.08579565681737274:IF(ISNUMBER(P11),((Q11-P11)/P11),\"\"):l:2:f:2:ntvf:1\ncell:S11:f:2\ncell:C12:t:Apr:b::1:::l:2:f:2:bg:2\ncell:D12:v:2308:b:2:1:2:2:l:2:f:2:bg:2\ncell:E12:v:2400:b:2:1:2:2:l:2:f:2:bg:2\ncell:F12:vtf:n:0.03986135181975736:IF(ISNUMBER(D12),((E12-D12)/D12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G12:l:2:f:2:ntvf:1\ncell:H12:v:365:b:2:1:2:2:l:2:f:2:bg:2\ncell:I12:v:400:b:2:1:2:2:l:2:f:2:bg:2\ncell:J12:vtf:n:0.0958904109589041:IF(ISNUMBER(H12),((I12-H12)/H12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K12:l:2:f:2:ntvf:1\ncell:L12:v:642:b:2:1:2:2:l:2:f:2:bg:2\ncell:M12:v:700:b:2:1:2:2:l:2:f:2:bg:2\ncell:N12:vtf:n:0.09034267912772585:IF(ISNUMBER(L12),((M12-L12)/L12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O12:l:2:f:2:ntvf:1\ncell:P12:vtf:n:3315:IF(SUM(D12,H12,L12),SUM(D12,H12,L12),\"\"):l:2:f:2:bg:2\ncell:Q12:vtf:n:3500:IF(SUM(E12,I12,M12),SUM(E12,I12,M12),\"\"):l:2:f:2:bg:2\ncell:R12:vtf:n:0.05580693815987934:IF(ISNUMBER(P12),((Q12-P12)/P12),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:S12:f:2\ncell:C13:t:May:b::2:::l:2:f:2\ncell:D13:v:2538:b:2:2:2:2:l:2:f:2\ncell:E13:v:2800:b:2:2:2:2:l:2:f:2\ncell:F13:vtf:n:0.10323089046493301:IF(ISNUMBER(D13),((E13-D13)/D13),\"\"):l:2:f:2:ntvf:1\ncell:G13:l:2:f:2:ntvf:1\ncell:H13:v:402:b:2:2:2:2:l:2:f:2\ncell:I13:v:450:b:2:2:2:2:l:2:f:2\ncell:J13:vtf:n:0.11940298507462686:IF(ISNUMBER(H13),((I13-H13)/H13),\"\"):l:2:f:2:ntvf:1\ncell:K13:l:2:f:2:ntvf:1\ncell:L13:v:663:b:2:2:2:2:l:2:f:2\ncell:M13:v:800:b:2:2:2:2:l:2:f:2\ncell:N13:vtf:n:0.2066365007541478:IF(ISNUMBER(L13),((M13-L13)/L13),\"\"):l:2:f:2:ntvf:1\ncell:O13:l:2:f:2:ntvf:1\ncell:P13:vtf:n:3603:IF(SUM(D13,H13,L13),SUM(D13,H13,L13),\"\"):l:2:f:2\ncell:Q13:vtf:n:4050:IF(SUM(E13,I13,M13),SUM(E13,I13,M13),\"\"):l:2:f:2\ncell:R13:vtf:n:0.12406328059950042:IF(ISNUMBER(P13),((Q13-P13)/P13),\"\"):l:2:f:2:ntvf:1\ncell:S13:f:2\ncell:C14:t:Jun:b::2:::l:2:f:2:bg:2\ncell:D14:v:1866:b:2:2:2:2:l:2:f:2:bg:2\ncell:E14:v:2000:b:2:2:2:2:l:2:f:2:bg:2\ncell:F14:vtf:n:0.07181136120042872:IF(ISNUMBER(D14),((E14-D14)/D14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G14:l:2:f:2:ntvf:1\ncell:H14:v:217:b:2:2:2:2:l:2:f:2:bg:2\ncell:I14:v:250:b:2:2:2:2:l:2:f:2:bg:2\ncell:J14:vtf:n:0.15207373271889402:IF(ISNUMBER(H14),((I14-H14)/H14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K14:l:2:f:2:ntvf:1\ncell:L14:v:604:b:2:2:2:2:l:2:f:2:bg:2\ncell:M14:v:700:b:2:2:2:2:l:2:f:2:bg:2\ncell:N14:vtf:n:0.15894039735099338:IF(ISNUMBER(L14),((M14-L14)/L14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O14:l:2:f:2:ntvf:1\ncell:P14:vtf:n:2687:IF(SUM(D14,H14,L14),SUM(D14,H14,L14),\"\"):l:2:f:2:bg:2\ncell:Q14:vtf:n:2950:IF(SUM(E14,I14,M14),SUM(E14,I14,M14),\"\"):l:2:f:2:bg:2\ncell:R14:vtf:n:0.09787867510234462:IF(ISNUMBER(P14),((Q14-P14)/P14),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:S14:f:2\ncell:C15:t:Jul:b::2:::l:2:f:2\ncell:D15:v:2212:b:2:2:2:2:l:2:f:2\ncell:E15:v:2500:b:2:2:2:2:l:2:f:2\ncell:F15:vtf:n:0.1301989150090416:IF(ISNUMBER(D15),((E15-D15)/D15),\"\"):l:2:f:2:ntvf:1\ncell:G15:l:2:f:2:ntvf:1\ncell:H15:v:264:b:2:2:2:2:l:2:f:2\ncell:I15:v:300:b:2:2:2:2:l:2:f:2\ncell:J15:vtf:n:0.13636363636363635:IF(ISNUMBER(H15),((I15-H15)/H15),\"\"):l:2:f:2:ntvf:1\ncell:K15:l:2:f:2:ntvf:1\ncell:L15:v:653:b:2:2:2:2:l:2:f:2\ncell:M15:v:800:b:2:2:2:2:l:2:f:2\ncell:N15:vtf:n:0.225114854517611:IF(ISNUMBER(L15),((M15-L15)/L15),\"\"):l:2:f:2:ntvf:1\ncell:O15:l:2:f:2:ntvf:1\ncell:P15:vtf:n:3129:IF(SUM(D15,H15,L15),SUM(D15,H15,L15),\"\"):l:2:f:2\ncell:Q15:vtf:n:3600:IF(SUM(E15,I15,M15),SUM(E15,I15,M15),\"\"):l:2:f:2\ncell:R15:vtf:n:0.15052732502396932:IF(ISNUMBER(P15),((Q15-P15)/P15),\"\"):l:2:f:2:ntvf:1\ncell:S15:f:2\ncell:C16:t:Aug:b::2:::l:2:f:2:bg:2\ncell:D16:v:1998:b:2:2:2:2:l:2:f:2:bg:2\ncell:E16:v:2300:b:2:2:2:2:l:2:f:2:bg:2\ncell:F16:vtf:n:0.15115115115115116:IF(ISNUMBER(D16),((E16-D16)/D16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G16:l:2:f:2:ntvf:1\ncell:H16:v:267:b:2:2:2:2:l:2:f:2:bg:2\ncell:I16:v:300:b:2:2:2:2:l:2:f:2:bg:2\ncell:J16:vtf:n:0.12359550561797752:IF(ISNUMBER(H16),((I16-H16)/H16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K16:l:2:f:2:ntvf:1\ncell:L16:v:537:b:2:2:2:2:l:2:f:2:bg:2\ncell:M16:v:600:b:2:2:2:2:l:2:f:2:bg:2\ncell:N16:vtf:n:0.11731843575418995:IF(ISNUMBER(L16),((M16-L16)/L16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O16:l:2:f:2:ntvf:1\ncell:P16:vtf:n:2802:IF(SUM(D16,H16,L16),SUM(D16,H16,L16),\"\"):l:2:f:2:bg:2\ncell:Q16:vtf:n:3200:IF(SUM(E16,I16,M16),SUM(E16,I16,M16),\"\"):l:2:f:2:bg:2\ncell:R16:vtf:n:0.14204139900071378:IF(ISNUMBER(P16),((Q16-P16)/P16),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:S16:f:2\ncell:C17:t:Sep:b::2:::l:2:f:2\ncell:D17:v:2054:b:2:2:2:2:l:2:f:2\ncell:E17:v:2000:b:2:2:2:2:l:2:f:2\ncell:F17:vtf:n:-0.02629016553067186:IF(ISNUMBER(D17),((E17-D17)/D17),\"\"):l:2:f:2:ntvf:1\ncell:G17:l:2:f:2:ntvf:1\ncell:H17:v:318:b:2:2:2:2:l:2:f:2\ncell:I17:v:350:b:2:2:2:2:l:2:f:2\ncell:J17:vtf:n:0.10062893081761007:IF(ISNUMBER(H17),((I17-H17)/H17),\"\"):l:2:f:2:ntvf:1\ncell:K17:l:2:f:2:ntvf:1\ncell:L17:v:741:b:2:2:2:2:l:2:f:2\ncell:M17:v:900:b:2:2:2:2:l:2:f:2\ncell:N17:vtf:n:0.2145748987854251:IF(ISNUMBER(L17),((M17-L17)/L17),\"\"):l:2:f:2:ntvf:1\ncell:O17:l:2:f:2:ntvf:1\ncell:P17:vtf:n:3113:IF(SUM(D17,H17,L17),SUM(D17,H17,L17),\"\"):l:2:f:2\ncell:Q17:vtf:n:3250:IF(SUM(E17,I17,M17),SUM(E17,I17,M17),\"\"):l:2:f:2\ncell:R17:vtf:n:0.04400899453902987:IF(ISNUMBER(P17),((Q17-P17)/P17),\"\"):l:2:f:2:ntvf:1\ncell:S17:f:2\ncell:C18:t:Oct:b::2:::l:2:f:2:bg:2\ncell:D18:v:2117:b:2:2:2:2:l:2:f:2:bg:2\ncell:E18:v:2400:b:2:2:2:2:l:2:f:2:bg:2\ncell:F18:vtf:n:0.1336797354747284:IF(ISNUMBER(D18),((E18-D18)/D18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G18:l:2:f:2:ntvf:1\ncell:H18:v:159:b:2:2:2:2:l:2:f:2:bg:2\ncell:I18:v:200:b:2:2:2:2:l:2:f:2:bg:2\ncell:J18:vtf:n:0.2578616352201258:IF(ISNUMBER(H18),((I18-H18)/H18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K18:l:2:f:2:ntvf:1\ncell:L18:v:554:b:2:2:2:2:l:2:f:2:bg:2\ncell:M18:v:650:b:2:2:2:2:l:2:f:2:bg:2\ncell:N18:vtf:n:0.17328519855595667:IF(ISNUMBER(L18),((M18-L18)/L18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O18:l:2:f:2:ntvf:1\ncell:P18:vtf:n:2830:IF(SUM(D18,H18,L18),SUM(D18,H18,L18),\"\"):l:2:f:2:bg:2\ncell:Q18:vtf:n:3250:IF(SUM(E18,I18,M18),SUM(E18,I18,M18),\"\"):l:2:f:2:bg:2\ncell:R18:vtf:n:0.14840989399293286:IF(ISNUMBER(P18),((Q18-P18)/P18),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:S18:f:2\ncell:C19:t:Nov:b::2:::l:2:f:2\ncell:D19:v:1430:b:2:2:2:2:l:2:f:2\ncell:E19:v:1600:b:2:2:2:2:l:2:f:2\ncell:F19:vtf:n:0.11888111888111888:IF(ISNUMBER(D19),((E19-D19)/D19),\"\"):l:2:f:2:ntvf:1\ncell:G19:l:2:f:2:ntvf:1\ncell:H19:v:193:b:2:2:2:2:l:2:f:2\ncell:I19:v:200:b:2:2:2:2:l:2:f:2\ncell:J19:vtf:n:0.03626943005181347:IF(ISNUMBER(H19),((I19-H19)/H19),\"\"):l:2:f:2:ntvf:1\ncell:K19:l:2:f:2:ntvf:1\ncell:L19:v:657:b:2:2:2:2:l:2:f:2\ncell:M19:v:800:b:2:2:2:2:l:2:f:2\ncell:N19:vtf:n:0.2176560121765601:IF(ISNUMBER(L19),((M19-L19)/L19),\"\"):l:2:f:2:ntvf:1\ncell:O19:l:2:f:2:ntvf:1\ncell:P19:vtf:n:2280:IF(SUM(D19,H19,L19),SUM(D19,H19,L19),\"\"):l:2:f:2\ncell:Q19:vtf:n:2600:IF(SUM(E19,I19,M19),SUM(E19,I19,M19),\"\"):l:2:f:2\ncell:R19:vtf:n:0.14035087719298245:IF(ISNUMBER(P19),((Q19-P19)/P19),\"\"):l:2:f:2:ntvf:1\ncell:S19:f:2\ncell:C20:t:Dec:b::1:::l:2:f:2:bg:2\ncell:D20:v:1859:b:2:1:2:2:l:2:f:2:bg:2\ncell:E20:v:2100:b:2:1:2:2:l:2:f:2:bg:2\ncell:F20:vtf:n:0.1296395911780527:IF(ISNUMBER(D20),((E20-D20)/D20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:G20:l:2:f:2:ntvf:1\ncell:H20:v:426:b:2:1:2:2:l:2:f:2:bg:2\ncell:I20:v:450:b:2:1:2:2:l:2:f:2:bg:2\ncell:J20:vtf:n:0.056338028169014086:IF(ISNUMBER(H20),((I20-H20)/H20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:K20:l:2:f:2:ntvf:1\ncell:L20:v:732:b:2:1:2:2:l:2:f:2:bg:2\ncell:M20:v:850:b:2:1:2:2:l:2:f:2:bg:2\ncell:N20:vtf:n:0.16120218579234974:IF(ISNUMBER(L20),((M20-L20)/L20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:O20:l:2:f:2:ntvf:1\ncell:P20:vtf:n:3017:IF(SUM(D20,H20,L20),SUM(D20,H20,L20),\"\"):l:2:f:2:bg:2\ncell:Q20:vtf:n:3400:IF(SUM(E20,I20,M20),SUM(E20,I20,M20),\"\"):l:2:f:2:bg:2\ncell:R20:vtf:n:0.12694729864103413:IF(ISNUMBER(P20),((Q20-P20)/P20),\"\"):l:2:f:2:bg:2:ntvf:1\ncell:S20:f:2\ncell:C22:t:Year :l:2:f:4\ncell:D22:vtf:n:23588:IF(SUM(D9\\cD20),SUM(D9\\cD20),\"\"):b:1::1::l:2:f:4\ncell:E22:vtf:n:25800:IF(SUM(E9\\cE20),SUM(E9\\cE20),\"\"):b:1::1::l:2:f:4\ncell:F22:vtf:n:0.09377649652365609:IF(ISNUMBER(D22),((E22-D22)/D22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:G22:b:1::1::l:2:f:2:ntvf:1\ncell:H22:vtf:n:3262:IF(SUM(H9\\cH20),SUM(H9\\cH20),\"\"):b:1::1::l:2:f:4\ncell:I22:vtf:n:3650:IF(SUM(I9\\cI20),SUM(I9\\cI20),\"\"):b:1::1::l:2:f:4\ncell:J22:vtf:n:0.11894543225015328:IF(ISNUMBER(H22),((I22-H22)/H22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:K22:b:1::1::l:2:f:2:ntvf:1\ncell:L22:vtf:n:7798:IF(SUM(L9\\cL20),SUM(L9\\cL20),\"\"):b:1::1::l:2:f:4\ncell:M22:vtf:n:9100:IF(SUM(M9\\cM20),SUM(M9\\cM20),\"\"):b:1::1::l:2:f:4\ncell:N22:vtf:n:0.16696588868940754:IF(ISNUMBER(L22),((M22-L22)/L22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:O22:b:1::1::l:2:f:2:ntvf:1\ncell:P22:vtf:n:34648:IF(SUM(P9\\cP20),SUM(P9\\cP20),\"\"):b:1::1::l:2:f:4\ncell:Q22:vtf:n:38550:IF(SUM(Q9\\cQ20),SUM(Q9\\cQ20),\"\"):b:1::1::l:2:f:4\ncell:R22:vtf:n:0.11261833294851073:IF(ISNUMBER(P22),((Q22-P22)/P22),\"\"):b:1::1::l:2:f:4:ntvf:1\ncell:S22:f:2\ncell:C23:l:2:f:2\ncell:D23:l:2:f:2\ncell:E23:l:2:f:2\ncell:F23:l:2:f:2\ncell:G23:l:2:f:2\ncell:H23:l:2:f:2\ncell:I23:l:2:f:2\ncell:J23:l:2:f:2\ncell:K23:l:2:f:2\ncell:L23:l:2:f:2\ncell:M23:l:2:f:2\ncell:N23:l:2:f:2\ncell:O23:l:2:f:2\ncell:P23:l:2:f:2\ncell:Q23:l:2:f:2\ncell:R23:l:2:f:2\ncell:S23:f:2\ncell:C24:t:Date\\c :l:2:f:2:cf:2\ncell:D24:b:::2::l:2:f:2:ntvf:2\ncell:E24:l:2:f:2\ncell:F24:l:2:f:2\ncell:G24:l:2:f:2\ncell:H24:l:2:f:2\ncell:I24:l:2:f:2\ncell:J24:l:2:f:2\ncell:K24:l:2:f:2\ncell:L24:l:2:f:2\ncell:M24:t:Prepared by\\c :l:2:f:2:cf:2:colspan:2\ncell:N24:l:2:f:2:cf:1\ncell:O24:l:2:f:2:cf:1\ncell:P24:b:::2::l:2:f:2:cf:1\ncell:Q24:b:::2::l:2:f:2:cf:1\ncell:R24:b:::2::l:2:f:2:cf:1\ncell:S24:f:2\ncell:C25:l:2:f:2\ncell:D25:b:2::::l:2:f:2\ncell:E25:l:2:f:2\ncell:F25:l:2:f:2\ncell:G25:l:2:f:2\ncell:H25:l:2:f:2\ncell:I25:l:2:f:2\ncell:J25:l:2:f:2\ncell:K25:l:2:f:2\ncell:L25:l:2:f:2\ncell:M25:l:2:f:2\ncell:N25:b:2::::l:2:f:2\ncell:O25:b:2::::l:2:f:2\ncell:P25:b:2::::l:2:f:2\ncell:Q25:b:2::::l:2:f:2\ncell:R25:b:2::::l:2:f:2\ncell:S25:f:2\ncell:C26:l:2\ncell:D26:l:2\ncell:E26:l:2\ncell:F26:l:2\ncell:G26:l:2\ncell:H26:l:2\ncell:I26:l:2\ncell:J26:l:2\ncell:K26:l:2\ncell:L26:l:2\ncell:M26:l:2\ncell:N26:l:2\ncell:O26:l:2\ncell:P26:l:2\ncell:Q26:l:2\ncell:R26:l:2\ncell:C27:l:1:f:1\ncol:A:w:10\ncol:B:w:10\ncol:C:w:52\ncol:D:w:80\ncol:E:w:80\ncol:F:w:71\ncol:G:w:10\ncol:H:w:80\ncol:I:w:80\ncol:J:w:71\ncol:K:w:10\ncol:L:w:80\ncol:M:w:80\ncol:N:w:71\ncol:O:w:10\ncol:P:w:80\ncol:Q:w:80\ncol:R:w:71\nrow:3:h:33\nrow:4:h:18.75\nrow:5:h:18.75\nrow:6:h:14.25\nrow:7:h:15.75\nrow:8:h:14.25\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:27:h:14.25\nsheet:c:19:r:27:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal normal 10pt Arial\nfont:2:normal normal 12pt arial,helvetica,sans-serif\nfont:3:normal normal 14pt Arial\nfont:4:normal normal 14pt arial,helvetica,sans-serif\nfont:5:normal normal 16pt Arial\nfont:6:normal normal 26pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:0%\nvalueformat:2:dd-mmm-yy \nname:DATA_01::C5\nname:DATA_02::C10\nname:DATA_03::D10\\cD22\nname:DATA_04::H10\\cH22\n"},"name":"sheet27","hidden":"1"},"sheet28":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Price Estimate for Services :l:1:f:8:c:3:bg:1:cf:1:colspan:3\ncell:D3:l:1:f:3:cf:1\ncell:E3:l:1:f:3:cf:1\ncell:C4:vtf:ndt:41099.54768677083:NOW():l:1:f:7:cf:1:ntvf:6\ncell:D4:l:1\ncell:E4:l:1\ncell:C5:l:1:f:1:cf:1:ntvf:6\ncell:D5:l:1:f:1\ncell:E5:l:1:f:1\ncell:F5:f:1\ncell:G5:f:1\ncell:C6:t:Name of Job:l:1:f:7:cf:1\ncell:D6:t:Job 1:l:1:f:7:cf:1\ncell:E6:t:Job 2:l:1:f:7:cf:1\ncell:C7:t:Wage rate per hour:l:1:f:5:cf:2\ncell:D7:v:10:b:1:1:1:1:l:1:f:5:cf:3:ntvf:3\ncell:E7:v:22:b:1:1:1:1:l:1:f:5:cf:3:ntvf:3\ncell:F7:f:5\ncell:G7:f:5\ncell:C8:t:Fringe Benefit as a % of wages:l:1:f:5:bg:2:cf:2\ncell:D8:v:0.3:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:5\ncell:E8:v:0.3:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:5\ncell:F8:f:5\ncell:G8:f:5\ncell:C9:t:Projected Overhead Cost for Year:l:1:f:5:cf:2\ncell:D9:v:40000:b:1:1:1:1:l:1:f:5:cf:3:ntvf:2\ncell:E9:v:40000:b:1:1:1:1:l:1:f:5:cf:3:ntvf:2\ncell:F9:f:5\ncell:G9:f:5\ncell:C10:t:Projected Direct Labor Cost for Year:l:1:f:5:bg:2:cf:2\ncell:D10:v:50000:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:2\ncell:E10:v:50000:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:2\ncell:F10:f:5\ncell:G10:f:5\ncell:C11:l:1:f:5:cf:2\ncell:D11:l:1:f:5:cf:3\ncell:E11:l:1:f:5:cf:3\ncell:F11:f:5\ncell:G11:f:5\ncell:C12:t:Hours worked on job:l:1:f:5:cf:2\ncell:D12:v:1.5:b:1:1:1:1:l:1:f:5:cf:3:ntvf:4\ncell:E12:v:2:b:1:1:1:1:l:1:f:5:cf:3:ntvf:4\ncell:F12:f:5\ncell:G12:f:5\ncell:C13:t:Direct Labor Cost:l:1:f:5:bg:2:cf:2\ncell:D13:vtf:n:19.5:IF(SUM(D12,D7),((D12*D7)*(1+D8)),\"\"):l:1:f:5:bg:2:cf:3:ntvf:3\ncell:E13:vtf:n:57.2:IF(SUM(E12,E7),((E12*E7)*(1+E8)),\"\"):l:1:f:5:bg:2:cf:3:ntvf:3\ncell:F13:f:5\ncell:G13:f:5\ncell:C14:t:Overhead Cost:l:1:f:5:cf:2\ncell:D14:vtf:n:15.600000000000001:IF((D10>0),((D9/D10)*D13),\"\"):l:1:f:5:cf:3:ntvf:1\ncell:E14:vtf:n:45.760000000000005:IF((E10>0),((E9/E10)*E13),\"\"):l:1:f:5:cf:3:ntvf:1\ncell:F14:f:5\ncell:G14:f:5\ncell:C15:t:Cost of materials for the job:l:1:f:5:bg:2:cf:2\ncell:D15:v:10:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:1\ncell:E15:v:10:b:1:1:1:1:l:1:f:5:bg:2:cf:3:ntvf:1\ncell:F15:f:5\ncell:G15:f:5\ncell:C16:l:1:f:9:cf:2\ncell:D16:l:1:f:9:cf:3:ntvf:1\ncell:E16:l:1:f:9:cf:3:ntvf:1\ncell:F16:f:4\ncell:C17:t:Total cost:l:1:f:6:cf:2\ncell:D17:vtf:n:45.1:IF(SUM(D13\\cD15),SUM(D13\\cD15),\"\"):b:2::2::l:1:f:6:cf:3:ntvf:3\ncell:E17:vtf:n:112.96000000000001:IF(SUM(E13\\cE15),SUM(E13\\cE15),\"\"):b:2::2::l:1:f:6:cf:3:ntvf:3\ncell:F17:f:6\ncell:C18:l:1:f:2\ncell:D18:b:2::::l:1:f:2\ncell:E18:b:2::::l:1:f:2\ncell:C19:l:1:f:2\ncell:D19:l:1\ncell:E19:l:1\ncol:A:w:10\ncol:B:w:10\ncol:C:w:289\ncol:D:w:110\ncol:E:w:110\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:18.75\nrow:6:h:18.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:15.75\nrow:10:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:12\nrow:21:h:12\nrow:22:h:12\nsheet:c:7:r:22:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 6pt *\nfont:2:normal normal 10pt Arial\nfont:3:normal normal 10pt Times New Roman\nfont:4:normal normal 12pt *\nfont:5:normal normal 12pt arial,helvetica,sans-serif\nfont:6:normal normal 14pt arial,helvetica,sans-serif\nfont:7:normal normal 16pt arial,helvetica,sans-serif\nfont:8:normal normal 26pt arial,helvetica,sans-serif\nfont:9:normal normal 6pt *\nlayout:1:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1: #,##0.00 ;(#,##0.00)\nvalueformat:2:\"$\"#,##0 ;\"$\"(#,##0)\nvalueformat:3:\"$\"#,##0.00 ;\"$\"(#,##0.00)\nvalueformat:4:#,##0.00;(#,##0.00)\nvalueformat:5:0%\nvalueformat:6:mmmm d, yyyy\nname:DATA_01::C4\nname:DATA_02::C10\nname:DATA_03::D10\\cD22\nname:DATA_04::#REF!\\c#REF!\n"},"name":"sheet29","hidden":"1"},"sheet29":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1\n"},"name":"sheet29","hidden":"0"},"sheet30":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1\n"},"name":"sheet30","hidden":"0"},"sheet31":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1\n"},"name":"sheet31","hidden":"0"},"sheet32":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1\n"},"name":"sheet32","hidden":"0"},"sheet33":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1\n"},"name":"sheet33","hidden":"0"},"sheet34":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1\n"},"name":"sheet34","hidden":"0"}}} \ No newline at end of file diff --git a/Website/excelinterop/tmp/Tool-Project Manager.xls b/Website/excelinterop/tmp/Tool-Project Manager.xls deleted file mode 100644 index f532003..0000000 Binary files a/Website/excelinterop/tmp/Tool-Project Manager.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/Weight and Diet Manager(10).txt b/Website/excelinterop/tmp/Weight and Diet Manager(10).txt deleted file mode 100644 index 8f17175..0000000 --- a/Website/excelinterop/tmp/Weight and Diet Manager(10).txt +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":4,"currentid":"sheet1","currentname":"sheet1","sheetArr":{"sheet1":{"sheetstr":{"savestr":"version:1.5\ncell:D2:t:Analysis:b:1:1:1:1:f:4:cf:1:colspan:6\ncell:B3:b:1:1:1:1:l:1:f:3:cf:1:ntvf:3:rowspan:2\ncell:B4:b:1:1:1:1:l:1:cf:1:ntvf:3\ncell:D4:t:
    \\n\\n:tvf:4:colspan:6:rowspan:10\ncell:B5:t:Start date:b:1:1:1:1:l:1:cf:1:ntvf:3\ncell:B6:l:1:cf:1:ntvf:3\ncell:B7:b:1:1:1:1:l:1:f:3:cf:1:ntvf:3:rowspan:2\ncell:B8:b:1:1:1:1:l:1:cf:1\ncell:B9:t:End Date:b:1:1:1:1:l:1:cf:1\ncell:B10:l:1:cf:1\ncell:B11:b:1:1:1:1:l:1:f:3:cf:1:ntvf:2:rowspan:2\ncell:B12:b:1:1:1:1:l:1:cf:1:ntvf:2\ncell:B13:t:Start Weight:b:1:1:1:1:l:1:cf:1:ntvf:2\ncell:B14:l:1:cf:1:ntvf:2\ncell:E14:t:Exercise Routine:f:2:cf:1:colspan:3\ncell:B15:b:1:1:1:1:l:1:f:3:cf:1:ntvf:2:rowspan:2\ncell:E15:f:2:cf:1\ncell:B16:b:1:1:1:1:l:1:cf:1:ntvf:2\ncell:B17:t:End Weight:b:1:1:1:1:l:1:cf:1:ntvf:2\ncell:D17:t:
    \\n\\n:tvf:4:colspan:6:rowspan:10\ncell:B18:l:1:cf:1:ntvf:2\ncell:B19:vtf:t::IF(OR(B11=\"\",B15=\"\"),\"\",B11-b15):b:1:1:1:1:l:1:f:3:cf:1:ntvf:2:rowspan:2\ncell:B20:b:1:1:1:1:l:1:cf:1\ncell:B21:t:Goal Loss:b:1:1:1:1:l:1:cf:1\ncell:B22:l:1:cf:1\ncell:B23:vtf:t::IF(OR(B7=\"\",B3=\"\"),\"\",b7-b3):b:1:1:1:1:l:1:f:3:cf:1:ntvf:1:rowspan:2\ncell:B24:b:1:1:1:1:l:1:cf:1\ncell:B25:t:Days to Lose:b:1:1:1:1:l:1:cf:1\ncell:B26:l:1:cf:1\ncell:B27:vtf:t::IF(OR(B23=\"\",B19=\"\",B23=0),\"\",b19/b23):b:1:1:1:1:l:1:f:3:cf:1:ntvf:2:rowspan:2\ncell:E27:t:Weight Chart:f:2:cf:1:colspan:3\ncell:B28:b:1:1:1:1:l:1:cf:1\ncell:B29:t:Loss Per Day:b:1:1:1:1:l:1:cf:1\ncell:B30:cf:1\ncell:D30:t:
    \\n\\n\\n:tvf:4:colspan:6:rowspan:9\ncell:B31:cf:1\ncell:D39:t:How satisfied were you with your meals this week ?:f:2:cf:1:colspan:6\ncol:A:w:10\ncol:B:w:162\ncol:C:w:15\nsheet:c:5:r:39:font:1:layout:2\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\nfont:1:* 12pt arial,helvetica,sans-serif\nfont:2:* 14pt *\nfont:3:* 18pt *\nfont:4:* 22pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:*;\nvalueformat:1:#,##0\nvalueformat:2:#,##0.00\nvalueformat:3:mm/dd/yyyy\nvalueformat:4:text-html\n"},"name":"sheet1","hidden":"0"},"sheet2":{"sheetstr":{"savestr":"version:1.5\ncell:B3:t:Weight Tracker:f:3:c:3:bg:1:cf:1:colspan:5\ncell:J4:t:Hidden Columns:cf:1:colspan:3\ncell:B5:t:Date:b:1:1:1:1:f:2:cf:1\ncell:C5:t:Weight:b:1:1:1:1:f:2:cf:1\ncell:D5:t:Goal:b:1:1:1:1:f:2:cf:1\ncell:E5:t:From Goal:b:1:1:1:1:f:2:cf:1\ncell:F5:t:Notes:b:1:1:1:1:f:2:cf:1\ncell:J5:t:date\ncell:K5:t:Weight\ncell:L5:t:Goal\ncell:A6:b::1::\ncell:B6:b::1::1\ncell:C6:vtf:t::IF(SHEET1!b11=\"\",\"\",SHEET1!B11):b::1::1:ntvf:1\ncell:D6:vtf:t::C6:b::1::1:ntvf:1\ncell:E6:b::1::1\ncell:F6:b::1::1\ncell:G6:b::::1\ncell:A7:b::1::\ncell:B7:vtf:t::IF(SHEET1!b3=\"\",\"\",sheet1!b3):b::1::1:ntvf:2\ncell:C7:vtf:t::IF(SHEET1!B11=\"\",\"\",sheet1!B11):b::1::1:ntvf:1\ncell:D7:vtf:t::c7:b::1::1:ntvf:1\ncell:E7:vtf:t::if(or(c7=\"\",d7=\"\"),\"\",c7-d7):b::1::1:ntvf:1\ncell:F7:b::1::1\ncell:G7:b::::1\ncell:J7:vtf:t:null:if(c7=\"\",\"null\",b7)\ncell:K7:vtf:t:null:if($c7=\"\",\"null\",c7):ntvf:1\ncell:L7:vtf:t:null:IF($C7=\"\",\"null\",D7):ntvf:1\ncell:A8:b::1::\ncell:B8:vtf:t::if(b7=\"\",\"\",if(b7 \\n\\n:tvf:4:colspan:7:rowspan:14\ncell:B27:t:Date:b:1:1:1:1:l:1:f:2:cf:1\ncell:C27:t:Weight (kg):b:1:1:1:1:l:1:f:2:cf:1\ncell:D27:t:+/-:b:1:1:1:1:l:1:f:2:cf:1\ncell:E27:t:BMI:b:1:1:1:1:l:1:f:2:cf:1\ncell:F27:t:Lower Limit:b:1:1:1:1:l:1:f:2:cf:1\ncell:G27:t:Upper Limit:b:1:1:1:1:l:1:f:2:cf:1\ncell:I27:t:Weight (hidden row):tvf:2:ntvf:2:colspan:2\ncell:A28:b::1::\ncell:B28:vtf:t::if(c6=\"\",\"\",c6+1):b::1::1:l:1:f:1:ntvf:3\ncell:C28:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D28:vtf:t::if(c28=\"\",\"\",c28-$c$5):b::1::1:l:1:f:1:ntvf:1\ncell:E28:vtf:t::if(c28=\"\",\"\",c28/($g$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F28:vtf:t::if($b28=\"\",\"\",$C$5-($B28-$C$6)*($f$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G28:vtf:t::if(b28=\"\",\"\",$C$5-($B28-$C$6)*($f$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H28:b::::1\ncell:I28:vtf:t:null:if(c28=\"\",\"null\",c28):tvf:2:ntvf:2\ncell:A29:b::1::\ncell:B29:vtf:t::if(b28=\"\",\"\",b28+1):b::1::1:l:1:f:1:ntvf:3\ncell:C29:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D29:vtf:t::IF(C29=\"\",\"\",C29-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E29:vtf:t::IF(C29=\"\",\"\",C29/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F29:vtf:t::IF($B29=\"\",\"\",$C$5-($B29-$C$6)*($f$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G29:vtf:t::IF(B29=\"\",\"\",$C$5-($B29-$C$6)*($f$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H29:b::::1\ncell:I29:vtf:t:null:IF(C29=\"\",\"null\",C29):tvf:2:ntvf:2\ncell:A30:b::1::\ncell:B30:vtf:t::IF(B29=\"\",\"\",B29+1):b::1::1:l:1:f:1:ntvf:3\ncell:C30:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D30:vtf:t::IF(C30=\"\",\"\",C30-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E30:vtf:t::IF(C30=\"\",\"\",C30/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F30:vtf:t::IF($B30=\"\",\"\",$C$5-($B30-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G30:vtf:t::IF(B30=\"\",\"\",$C$5-($B30-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H30:b::::1\ncell:I30:vtf:t:null:IF(C30=\"\",\"null\",C30):tvf:2:ntvf:2\ncell:A31:b::1::\ncell:B31:vtf:t::IF(B30=\"\",\"\",B30+1):b::1::1:l:1:f:1:ntvf:3\ncell:C31:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D31:vtf:t::IF(C31=\"\",\"\",C31-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E31:vtf:t::IF(C31=\"\",\"\",C31/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F31:vtf:t::IF($B31=\"\",\"\",$C$5-($B31-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G31:vtf:t::IF(B31=\"\",\"\",$C$5-($B31-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H31:b::::1\ncell:I31:vtf:t:null:IF(C31=\"\",\"null\",C31):tvf:2:ntvf:2\ncell:A32:b::1::\ncell:B32:vtf:t::IF(B31=\"\",\"\",B31+1):b::1::1:l:1:f:1:ntvf:3\ncell:C32:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D32:vtf:t::IF(C32=\"\",\"\",C32-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E32:vtf:t::IF(C32=\"\",\"\",C32/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F32:vtf:t::IF($B32=\"\",\"\",$C$5-($B32-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G32:vtf:t::IF(B32=\"\",\"\",$C$5-($B32-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H32:b::::1\ncell:I32:vtf:t:null:IF(C32=\"\",\"null\",C32):tvf:2:ntvf:2\ncell:A33:b::1::\ncell:B33:vtf:t::IF(B32=\"\",\"\",B32+1):b::1::1:l:1:f:1:ntvf:3\ncell:C33:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D33:vtf:t::IF(C33=\"\",\"\",C33-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E33:vtf:t::IF(C33=\"\",\"\",C33/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F33:vtf:t::IF($B33=\"\",\"\",$C$5-($B33-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G33:vtf:t::IF(B33=\"\",\"\",$C$5-($B33-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H33:b::::1\ncell:I33:vtf:t:null:IF(C33=\"\",\"null\",C33):tvf:2:ntvf:2\ncell:A34:b::1::\ncell:B34:vtf:t::IF(B33=\"\",\"\",B33+1):b::1::1:l:1:f:1:ntvf:3\ncell:C34:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D34:vtf:t::IF(C34=\"\",\"\",C34-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E34:vtf:t::IF(C34=\"\",\"\",C34/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F34:vtf:t::IF($B34=\"\",\"\",$C$5-($B34-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G34:vtf:t::IF(B34=\"\",\"\",$C$5-($B34-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H34:b::::1\ncell:I34:vtf:t:null:IF(C34=\"\",\"null\",C34):tvf:2:ntvf:2\ncell:A35:b::1::\ncell:B35:vtf:t::IF(B34=\"\",\"\",B34+1):b::1::1:l:1:f:1:ntvf:3\ncell:C35:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D35:vtf:t::IF(C35=\"\",\"\",C35-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E35:vtf:t::IF(C35=\"\",\"\",C35/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F35:vtf:t::IF($B35=\"\",\"\",$C$5-($B35-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G35:vtf:t::IF(B35=\"\",\"\",$C$5-($B35-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H35:b::::1\ncell:I35:vtf:t:null:IF(C35=\"\",\"null\",C35):tvf:2:ntvf:2\ncell:A36:b::1::\ncell:B36:vtf:t::IF(B35=\"\",\"\",B35+1):b::1::1:l:1:f:1:ntvf:3\ncell:C36:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D36:vtf:t::IF(C36=\"\",\"\",C36-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E36:vtf:t::IF(C36=\"\",\"\",C36/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F36:vtf:t::IF($B36=\"\",\"\",$C$5-($B36-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G36:vtf:t::IF(B36=\"\",\"\",$C$5-($B36-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H36:b::::1\ncell:I36:vtf:t:null:IF(C36=\"\",\"null\",C36):tvf:2:ntvf:2\ncell:A37:b::1::\ncell:B37:vtf:t::IF(B36=\"\",\"\",B36+1):b::1::1:l:1:f:1:ntvf:3\ncell:C37:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D37:vtf:t::IF(C37=\"\",\"\",C37-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E37:vtf:t::IF(C37=\"\",\"\",C37/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F37:vtf:t::IF($B37=\"\",\"\",$C$5-($B37-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G37:vtf:t::IF(B37=\"\",\"\",$C$5-($B37-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H37:b::::1\ncell:I37:vtf:t:null:IF(C37=\"\",\"null\",C37):tvf:2:ntvf:2\ncell:A38:b::1::\ncell:B38:vtf:t::IF(B37=\"\",\"\",B37+1):b::1::1:l:1:f:1:ntvf:3\ncell:C38:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D38:vtf:t::IF(C38=\"\",\"\",C38-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E38:vtf:t::IF(C38=\"\",\"\",C38/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F38:vtf:t::IF($B38=\"\",\"\",$C$5-($B38-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G38:vtf:t::IF(B38=\"\",\"\",$C$5-($B38-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H38:b::::1\ncell:I38:vtf:t:null:IF(C38=\"\",\"null\",C38):tvf:2:ntvf:2\ncell:A39:b::1::\ncell:B39:vtf:t::IF(B38=\"\",\"\",B38+1):b::1::1:l:1:f:1:ntvf:3\ncell:C39:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D39:vtf:t::IF(C39=\"\",\"\",C39-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E39:vtf:t::IF(C39=\"\",\"\",C39/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F39:vtf:t::IF($B39=\"\",\"\",$C$5-($B39-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G39:vtf:t::IF(B39=\"\",\"\",$C$5-($B39-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H39:b::::1\ncell:I39:vtf:t:null:IF(C39=\"\",\"null\",C39):tvf:2:ntvf:2\ncell:A40:b::1::\ncell:B40:vtf:t::IF(B39=\"\",\"\",B39+1):b::1::1:l:1:f:1:ntvf:3\ncell:C40:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D40:vtf:t::IF(C40=\"\",\"\",C40-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E40:vtf:t::IF(C40=\"\",\"\",C40/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F40:vtf:t::IF($B40=\"\",\"\",$C$5-($B40-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G40:vtf:t::IF(B40=\"\",\"\",$C$5-($B40-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H40:b::::1\ncell:I40:vtf:t:null:IF(C40=\"\",\"null\",C40):tvf:2:ntvf:2\ncell:A41:b::1::\ncell:B41:vtf:t::IF(B40=\"\",\"\",B40+1):b::1::1:l:1:f:1:ntvf:3\ncell:C41:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D41:vtf:t::IF(C41=\"\",\"\",C41-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E41:vtf:t::IF(C41=\"\",\"\",C41/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F41:vtf:t::IF($B41=\"\",\"\",$C$5-($B41-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G41:vtf:t::IF(B41=\"\",\"\",$C$5-($B41-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H41:b::::1\ncell:I41:vtf:t:null:IF(C41=\"\",\"null\",C41):tvf:2:ntvf:2\ncell:A42:b::1::\ncell:B42:vtf:t::IF(B41=\"\",\"\",B41+1):b::1::1:l:1:f:1:ntvf:3\ncell:C42:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D42:vtf:t::IF(C42=\"\",\"\",C42-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E42:vtf:t::IF(C42=\"\",\"\",C42/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F42:vtf:t::IF($B42=\"\",\"\",$C$5-($B42-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G42:vtf:t::IF(B42=\"\",\"\",$C$5-($B42-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H42:b::::1\ncell:I42:vtf:t:null:IF(C42=\"\",\"null\",C42):tvf:2:ntvf:2\ncell:A43:b::1::\ncell:B43:vtf:t::IF(B42=\"\",\"\",B42+1):b::1::1:l:1:f:1:ntvf:3\ncell:C43:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D43:vtf:t::IF(C43=\"\",\"\",C43-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E43:vtf:t::IF(C43=\"\",\"\",C43/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F43:vtf:t::IF($B43=\"\",\"\",$C$5-($B43-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G43:vtf:t::IF(B43=\"\",\"\",$C$5-($B43-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H43:b::::1\ncell:I43:vtf:t:null:IF(C43=\"\",\"null\",C43):tvf:2:ntvf:2\ncell:A44:b::1::\ncell:B44:vtf:t::IF(B43=\"\",\"\",B43+1):b::1::1:l:1:f:1:ntvf:3\ncell:C44:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D44:vtf:t::IF(C44=\"\",\"\",C44-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E44:vtf:t::IF(C44=\"\",\"\",C44/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F44:vtf:t::IF($B44=\"\",\"\",$C$5-($B44-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G44:vtf:t::IF(B44=\"\",\"\",$C$5-($B44-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H44:b::::1\ncell:I44:vtf:t:null:IF(C44=\"\",\"null\",C44):tvf:2:ntvf:2\ncell:A45:b::1::\ncell:B45:vtf:t::IF(B44=\"\",\"\",B44+1):b::1::1:l:1:f:1:ntvf:3\ncell:C45:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D45:vtf:t::IF(C45=\"\",\"\",C45-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E45:vtf:t::IF(C45=\"\",\"\",C45/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F45:vtf:t::IF($B45=\"\",\"\",$C$5-($B45-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G45:vtf:t::IF(B45=\"\",\"\",$C$5-($B45-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H45:b::::1\ncell:I45:vtf:t:null:IF(C45=\"\",\"null\",C45):tvf:2:ntvf:2\ncell:A46:b::1::\ncell:B46:vtf:t::IF(B45=\"\",\"\",B45+1):b::1::1:l:1:f:1:ntvf:3\ncell:C46:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D46:vtf:t::IF(C46=\"\",\"\",C46-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E46:vtf:t::IF(C46=\"\",\"\",C46/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F46:vtf:t::IF($B46=\"\",\"\",$C$5-($B46-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G46:vtf:t::IF(B46=\"\",\"\",$C$5-($B46-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H46:b::::1\ncell:I46:vtf:t:null:IF(C46=\"\",\"null\",C46):tvf:2:ntvf:2\ncell:A47:b::1::\ncell:B47:vtf:t::IF(B46=\"\",\"\",B46+1):b::1::1:l:1:f:1:ntvf:3\ncell:C47:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D47:vtf:t::IF(C47=\"\",\"\",C47-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E47:vtf:t::IF(C47=\"\",\"\",C47/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F47:vtf:t::IF($B47=\"\",\"\",$C$5-($B47-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G47:vtf:t::IF(B47=\"\",\"\",$C$5-($B47-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H47:b::::1\ncell:I47:vtf:t:null:IF(C47=\"\",\"null\",C47):tvf:2:ntvf:2\ncell:A48:b::1::\ncell:B48:vtf:t::IF(B47=\"\",\"\",B47+1):b::1::1:l:1:f:1:ntvf:3\ncell:C48:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D48:vtf:t::IF(C48=\"\",\"\",C48-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E48:vtf:t::IF(C48=\"\",\"\",C48/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F48:vtf:t::IF($B48=\"\",\"\",$C$5-($B48-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G48:vtf:t::IF(B48=\"\",\"\",$C$5-($B48-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H48:b::::1\ncell:I48:vtf:t:null:IF(C48=\"\",\"null\",C48):tvf:2:ntvf:2\ncell:A49:b::1::\ncell:B49:vtf:t::IF(B48=\"\",\"\",B48+1):b::1::1:l:1:f:1:ntvf:3\ncell:C49:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D49:vtf:t::IF(C49=\"\",\"\",C49-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E49:vtf:t::IF(C49=\"\",\"\",C49/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F49:vtf:t::IF($B49=\"\",\"\",$C$5-($B49-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G49:vtf:t::IF(B49=\"\",\"\",$C$5-($B49-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H49:b::::1\ncell:I49:vtf:t:null:IF(C49=\"\",\"null\",C49):tvf:2:ntvf:2\ncell:A50:b::1::\ncell:B50:vtf:t::IF(B49=\"\",\"\",B49+1):b::1::1:l:1:f:1:ntvf:3\ncell:C50:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D50:vtf:t::IF(C50=\"\",\"\",C50-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E50:vtf:t::IF(C50=\"\",\"\",C50/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F50:vtf:t::IF($B50=\"\",\"\",$C$5-($B50-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G50:vtf:t::IF(B50=\"\",\"\",$C$5-($B50-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H50:b::::1\ncell:I50:vtf:t:null:IF(C50=\"\",\"null\",C50):tvf:2:ntvf:2\ncell:A51:b::1::\ncell:B51:vtf:t::IF(B50=\"\",\"\",B50+1):b::1::1:l:1:f:1:ntvf:3\ncell:C51:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D51:vtf:t::IF(C51=\"\",\"\",C51-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E51:vtf:t::IF(C51=\"\",\"\",C51/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F51:vtf:t::IF($B51=\"\",\"\",$C$5-($B51-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G51:vtf:t::IF(B51=\"\",\"\",$C$5-($B51-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H51:b::::1\ncell:I51:vtf:t:null:IF(C51=\"\",\"null\",C51):tvf:2:ntvf:2\ncell:A52:b::1::\ncell:B52:vtf:t::IF(B51=\"\",\"\",B51+1):b::1::1:l:1:f:1:ntvf:3\ncell:C52:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D52:vtf:t::IF(C52=\"\",\"\",C52-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E52:vtf:t::IF(C52=\"\",\"\",C52/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F52:vtf:t::IF($B52=\"\",\"\",$C$5-($B52-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G52:vtf:t::IF(B52=\"\",\"\",$C$5-($B52-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H52:b::::1\ncell:I52:vtf:t:null:IF(C52=\"\",\"null\",C52):tvf:2:ntvf:2\ncell:A53:b::1::\ncell:B53:vtf:t::IF(B52=\"\",\"\",B52+1):b::1::1:l:1:f:1:ntvf:3\ncell:C53:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D53:vtf:t::IF(C53=\"\",\"\",C53-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E53:vtf:t::IF(C53=\"\",\"\",C53/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F53:vtf:t::IF($B53=\"\",\"\",$C$5-($B53-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G53:vtf:t::IF(B53=\"\",\"\",$C$5-($B53-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H53:b::::1\ncell:I53:vtf:t:null:IF(C53=\"\",\"null\",C53):tvf:2:ntvf:2\ncell:A54:b::1::\ncell:B54:vtf:t::IF(B53=\"\",\"\",B53+1):b::1::1:l:1:f:1:ntvf:3\ncell:C54:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D54:vtf:t::IF(C54=\"\",\"\",C54-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E54:vtf:t::IF(C54=\"\",\"\",C54/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F54:vtf:t::IF($B54=\"\",\"\",$C$5-($B54-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G54:vtf:t::IF(B54=\"\",\"\",$C$5-($B54-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H54:b::::1\ncell:I54:vtf:t:null:IF(C54=\"\",\"null\",C54):tvf:2:ntvf:2\ncell:A55:b::1::\ncell:B55:vtf:t::IF(B54=\"\",\"\",B54+1):b::1::1:l:1:f:1:ntvf:3\ncell:C55:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D55:vtf:t::IF(C55=\"\",\"\",C55-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E55:vtf:t::IF(C55=\"\",\"\",C55/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F55:vtf:t::IF($B55=\"\",\"\",$C$5-($B55-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G55:vtf:t::IF(B55=\"\",\"\",$C$5-($B55-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H55:b::::1\ncell:I55:vtf:t:null:IF(C55=\"\",\"null\",C55):tvf:2:ntvf:2\ncell:A56:b::1::\ncell:B56:vtf:t::IF(B55=\"\",\"\",B55+1):b::1::1:l:1:f:1:ntvf:3\ncell:C56:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D56:vtf:t::IF(C56=\"\",\"\",C56-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E56:vtf:t::IF(C56=\"\",\"\",C56/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F56:vtf:t::IF($B56=\"\",\"\",$C$5-($B56-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G56:vtf:t::IF(B56=\"\",\"\",$C$5-($B56-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H56:b::::1\ncell:I56:vtf:t:null:IF(C56=\"\",\"null\",C56):tvf:2:ntvf:2\ncell:A57:b::1::\ncell:B57:vtf:t::IF(B56=\"\",\"\",B56+1):b::1::1:l:1:f:1:ntvf:3\ncell:C57:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D57:vtf:t::IF(C57=\"\",\"\",C57-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E57:vtf:t::IF(C57=\"\",\"\",C57/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F57:vtf:t::IF($B57=\"\",\"\",$C$5-($B57-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G57:vtf:t::IF(B57=\"\",\"\",$C$5-($B57-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H57:b::::1\ncell:I57:vtf:t:null:IF(C57=\"\",\"null\",C57):tvf:2:ntvf:2\ncell:A58:b::1::\ncell:B58:vtf:t::IF(B57=\"\",\"\",B57+1):b::1::1:l:1:f:1:ntvf:3\ncell:C58:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D58:vtf:t::IF(C58=\"\",\"\",C58-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E58:vtf:t::IF(C58=\"\",\"\",C58/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F58:vtf:t::IF($B58=\"\",\"\",$C$5-($B58-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G58:vtf:t::IF(B58=\"\",\"\",$C$5-($B58-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H58:b::::1\ncell:I58:vtf:t:null:IF(C58=\"\",\"null\",C58):tvf:2:ntvf:2\ncell:A59:b::1::\ncell:B59:vtf:t::IF(B58=\"\",\"\",B58+1):b::1::1:l:1:f:1:ntvf:3\ncell:C59:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D59:vtf:t::IF(C59=\"\",\"\",C59-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E59:vtf:t::IF(C59=\"\",\"\",C59/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F59:vtf:t::IF($B59=\"\",\"\",$C$5-($B59-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G59:vtf:t::IF(B59=\"\",\"\",$C$5-($B59-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H59:b::::1\ncell:I59:vtf:t:null:IF(C59=\"\",\"null\",C59):tvf:2:ntvf:2\ncell:A60:b::1::\ncell:B60:vtf:t::IF(B59=\"\",\"\",B59+1):b::1::1:l:1:f:1:ntvf:3\ncell:C60:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D60:vtf:t::IF(C60=\"\",\"\",C60-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E60:vtf:t::IF(C60=\"\",\"\",C60/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F60:vtf:t::IF($B60=\"\",\"\",$C$5-($B60-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G60:vtf:t::IF(B60=\"\",\"\",$C$5-($B60-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H60:b::::1\ncell:I60:vtf:t:null:IF(C60=\"\",\"null\",C60):tvf:2:ntvf:2\ncell:A61:b::1::\ncell:B61:vtf:t::IF(B60=\"\",\"\",B60+1):b::1::1:l:1:f:1:ntvf:3\ncell:C61:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D61:vtf:t::IF(C61=\"\",\"\",C61-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E61:vtf:t::IF(C61=\"\",\"\",C61/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F61:vtf:t::IF($B61=\"\",\"\",$C$5-($B61-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G61:vtf:t::IF(B61=\"\",\"\",$C$5-($B61-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H61:b::::1\ncell:I61:vtf:t:null:IF(C61=\"\",\"null\",C61):tvf:2:ntvf:2\ncell:A62:b::1::\ncell:B62:vtf:t::IF(B61=\"\",\"\",B61+1):b::1::1:l:1:f:1:ntvf:3\ncell:C62:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D62:vtf:t::IF(C62=\"\",\"\",C62-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E62:vtf:t::IF(C62=\"\",\"\",C62/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F62:vtf:t::IF($B62=\"\",\"\",$C$5-($B62-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G62:vtf:t::IF(B62=\"\",\"\",$C$5-($B62-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H62:b::::1\ncell:I62:vtf:t:null:IF(C62=\"\",\"null\",C62):tvf:2:ntvf:2\ncell:A63:b::1::\ncell:B63:vtf:t::IF(B62=\"\",\"\",B62+1):b::1::1:l:1:f:1:ntvf:3\ncell:C63:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D63:vtf:t::IF(C63=\"\",\"\",C63-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E63:vtf:t::IF(C63=\"\",\"\",C63/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F63:vtf:t::IF($B63=\"\",\"\",$C$5-($B63-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G63:vtf:t::IF(B63=\"\",\"\",$C$5-($B63-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H63:b::::1\ncell:I63:vtf:t:null:IF(C63=\"\",\"null\",C63):tvf:2:ntvf:2\ncell:A64:b::1::\ncell:B64:vtf:t::IF(B63=\"\",\"\",B63+1):b::1::1:l:1:f:1:ntvf:3\ncell:C64:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D64:vtf:t::IF(C64=\"\",\"\",C64-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E64:vtf:t::IF(C64=\"\",\"\",C64/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F64:vtf:t::IF($B64=\"\",\"\",$C$5-($B64-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G64:vtf:t::IF(B64=\"\",\"\",$C$5-($B64-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H64:b::::1\ncell:I64:vtf:t:null:IF(C64=\"\",\"null\",C64):tvf:2:ntvf:2\ncell:A65:b::1::\ncell:B65:vtf:t::IF(B64=\"\",\"\",B64+1):b::1::1:l:1:f:1:ntvf:3\ncell:C65:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D65:vtf:t::IF(C65=\"\",\"\",C65-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E65:vtf:t::IF(C65=\"\",\"\",C65/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F65:vtf:t::IF($B65=\"\",\"\",$C$5-($B65-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G65:vtf:t::IF(B65=\"\",\"\",$C$5-($B65-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H65:b::::1\ncell:I65:vtf:t:null:IF(C65=\"\",\"null\",C65):tvf:2:ntvf:2\ncell:A66:b::1::\ncell:B66:vtf:t::IF(B65=\"\",\"\",B65+1):b::1::1:l:1:f:1:ntvf:3\ncell:C66:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D66:vtf:t::IF(C66=\"\",\"\",C66-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E66:vtf:t::IF(C66=\"\",\"\",C66/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F66:vtf:t::IF($B66=\"\",\"\",$C$5-($B66-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G66:vtf:t::IF(B66=\"\",\"\",$C$5-($B66-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H66:b::::1\ncell:I66:vtf:t:null:IF(C66=\"\",\"null\",C66):tvf:2:ntvf:2\ncell:A67:b::1::\ncell:B67:vtf:t::IF(B66=\"\",\"\",B66+1):b::1::1:l:1:f:1:ntvf:3\ncell:C67:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D67:vtf:t::IF(C67=\"\",\"\",C67-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E67:vtf:t::IF(C67=\"\",\"\",C67/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F67:vtf:t::IF($B67=\"\",\"\",$C$5-($B67-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G67:vtf:t::IF(B67=\"\",\"\",$C$5-($B67-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H67:b::::1\ncell:I67:vtf:t:null:IF(C67=\"\",\"null\",C67):tvf:2:ntvf:2\ncell:A68:b::1::\ncell:B68:vtf:t::IF(B67=\"\",\"\",B67+1):b::1::1:l:1:f:1:ntvf:3\ncell:C68:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D68:vtf:t::IF(C68=\"\",\"\",C68-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E68:vtf:t::IF(C68=\"\",\"\",C68/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F68:vtf:t::IF($B68=\"\",\"\",$C$5-($B68-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G68:vtf:t::IF(B68=\"\",\"\",$C$5-($B68-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H68:b::::1\ncell:I68:vtf:t:null:IF(C68=\"\",\"null\",C68):tvf:2:ntvf:2\ncell:A69:b::1::\ncell:B69:vtf:t::IF(B68=\"\",\"\",B68+1):b::1::1:l:1:f:1:ntvf:3\ncell:C69:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D69:vtf:t::IF(C69=\"\",\"\",C69-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E69:vtf:t::IF(C69=\"\",\"\",C69/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F69:vtf:t::IF($B69=\"\",\"\",$C$5-($B69-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G69:vtf:t::IF(B69=\"\",\"\",$C$5-($B69-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H69:b::::1\ncell:I69:vtf:t:null:IF(C69=\"\",\"null\",C69):tvf:2:ntvf:2\ncell:A70:b::1::\ncell:B70:vtf:t::IF(B69=\"\",\"\",B69+1):b::1::1:l:1:f:1:ntvf:3\ncell:C70:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D70:vtf:t::IF(C70=\"\",\"\",C70-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E70:vtf:t::IF(C70=\"\",\"\",C70/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F70:vtf:t::IF($B70=\"\",\"\",$C$5-($B70-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G70:vtf:t::IF(B70=\"\",\"\",$C$5-($B70-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H70:b::::1\ncell:I70:vtf:t:null:IF(C70=\"\",\"null\",C70):tvf:2:ntvf:2\ncell:A71:b::1::\ncell:B71:vtf:t::IF(B70=\"\",\"\",B70+1):b::1::1:l:1:f:1:ntvf:3\ncell:C71:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D71:vtf:t::IF(C71=\"\",\"\",C71-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E71:vtf:t::IF(C71=\"\",\"\",C71/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F71:vtf:t::IF($B71=\"\",\"\",$C$5-($B71-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G71:vtf:t::IF(B71=\"\",\"\",$C$5-($B71-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H71:b::::1\ncell:I71:vtf:t:null:IF(C71=\"\",\"null\",C71):tvf:2:ntvf:2\ncell:A72:b::1::\ncell:B72:vtf:t::IF(B71=\"\",\"\",B71+1):b::1::1:l:1:f:1:ntvf:3\ncell:C72:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D72:vtf:t::IF(C72=\"\",\"\",C72-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E72:vtf:t::IF(C72=\"\",\"\",C72/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F72:vtf:t::IF($B72=\"\",\"\",$C$5-($B72-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G72:vtf:t::IF(B72=\"\",\"\",$C$5-($B72-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H72:b::::1\ncell:I72:vtf:t:null:IF(C72=\"\",\"null\",C72):tvf:2:ntvf:2\ncell:A73:b::1::\ncell:B73:vtf:t::IF(B72=\"\",\"\",B72+1):b::1::1:l:1:f:1:ntvf:3\ncell:C73:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D73:vtf:t::IF(C73=\"\",\"\",C73-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E73:vtf:t::IF(C73=\"\",\"\",C73/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F73:vtf:t::IF($B73=\"\",\"\",$C$5-($B73-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G73:vtf:t::IF(B73=\"\",\"\",$C$5-($B73-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H73:b::::1\ncell:I73:vtf:t:null:IF(C73=\"\",\"null\",C73):tvf:2:ntvf:2\ncell:A74:b::1::\ncell:B74:vtf:t::IF(B73=\"\",\"\",B73+1):b::1::1:l:1:f:1:ntvf:3\ncell:C74:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D74:vtf:t::IF(C74=\"\",\"\",C74-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E74:vtf:t::IF(C74=\"\",\"\",C74/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F74:vtf:t::IF($B74=\"\",\"\",$C$5-($B74-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G74:vtf:t::IF(B74=\"\",\"\",$C$5-($B74-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H74:b::::1\ncell:I74:vtf:t:null:IF(C74=\"\",\"null\",C74):tvf:2:ntvf:2\ncell:A75:b::1::\ncell:B75:vtf:t::IF(B74=\"\",\"\",B74+1):b::1::1:l:1:f:1:ntvf:3\ncell:C75:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D75:vtf:t::IF(C75=\"\",\"\",C75-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E75:vtf:t::IF(C75=\"\",\"\",C75/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F75:vtf:t::IF($B75=\"\",\"\",$C$5-($B75-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G75:vtf:t::IF(B75=\"\",\"\",$C$5-($B75-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H75:b::::1\ncell:I75:vtf:t:null:IF(C75=\"\",\"null\",C75):tvf:2:ntvf:2\ncell:A76:b::1::\ncell:B76:vtf:t::IF(B75=\"\",\"\",B75+1):b::1::1:l:1:f:1:ntvf:3\ncell:C76:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D76:vtf:t::IF(C76=\"\",\"\",C76-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E76:vtf:t::IF(C76=\"\",\"\",C76/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F76:vtf:t::IF($B76=\"\",\"\",$C$5-($B76-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G76:vtf:t::IF(B76=\"\",\"\",$C$5-($B76-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H76:b::::1\ncell:I76:vtf:t:null:IF(C76=\"\",\"null\",C76):tvf:2:ntvf:2\ncell:A77:b::1::\ncell:B77:vtf:t::IF(B76=\"\",\"\",B76+1):b::1::1:l:1:f:1:ntvf:3\ncell:C77:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D77:vtf:t::IF(C77=\"\",\"\",C77-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E77:vtf:t::IF(C77=\"\",\"\",C77/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F77:vtf:t::IF($B77=\"\",\"\",$C$5-($B77-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G77:vtf:t::IF(B77=\"\",\"\",$C$5-($B77-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H77:b::::1\ncell:I77:vtf:t:null:IF(C77=\"\",\"null\",C77):tvf:2:ntvf:2\ncell:A78:b::1::\ncell:B78:vtf:t::IF(B77=\"\",\"\",B77+1):b::1::1:l:1:f:1:ntvf:3\ncell:C78:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D78:vtf:t::IF(C78=\"\",\"\",C78-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E78:vtf:t::IF(C78=\"\",\"\",C78/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F78:vtf:t::IF($B78=\"\",\"\",$C$5-($B78-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G78:vtf:t::IF(B78=\"\",\"\",$C$5-($B78-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H78:b::::1\ncell:I78:vtf:t:null:IF(C78=\"\",\"null\",C78):tvf:2:ntvf:2\ncell:A79:b::1::\ncell:B79:vtf:t::IF(B78=\"\",\"\",B78+1):b::1::1:l:1:f:1:ntvf:3\ncell:C79:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D79:vtf:t::IF(C79=\"\",\"\",C79-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E79:vtf:t::IF(C79=\"\",\"\",C79/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F79:vtf:t::IF($B79=\"\",\"\",$C$5-($B79-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G79:vtf:t::IF(B79=\"\",\"\",$C$5-($B79-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H79:b::::1\ncell:I79:vtf:t:null:IF(C79=\"\",\"null\",C79):tvf:2:ntvf:2\ncell:A80:b::1::\ncell:B80:vtf:t::IF(B79=\"\",\"\",B79+1):b::1::1:l:1:f:1:ntvf:3\ncell:C80:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D80:vtf:t::IF(C80=\"\",\"\",C80-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E80:vtf:t::IF(C80=\"\",\"\",C80/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F80:vtf:t::IF($B80=\"\",\"\",$C$5-($B80-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G80:vtf:t::IF(B80=\"\",\"\",$C$5-($B80-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H80:b::::1\ncell:I80:vtf:t:null:IF(C80=\"\",\"null\",C80):tvf:2:ntvf:2\ncell:A81:b::1::\ncell:B81:vtf:t::IF(B80=\"\",\"\",B80+1):b::1::1:l:1:f:1:ntvf:3\ncell:C81:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D81:vtf:t::IF(C81=\"\",\"\",C81-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E81:vtf:t::IF(C81=\"\",\"\",C81/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F81:vtf:t::IF($B81=\"\",\"\",$C$5-($B81-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G81:vtf:t::IF(B81=\"\",\"\",$C$5-($B81-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H81:b::::1\ncell:I81:vtf:t:null:IF(C81=\"\",\"null\",C81):tvf:2:ntvf:2\ncell:A82:b::1::\ncell:B82:vtf:t::IF(B81=\"\",\"\",B81+1):b::1::1:l:1:f:1:ntvf:3\ncell:C82:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D82:vtf:t::IF(C82=\"\",\"\",C82-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E82:vtf:t::IF(C82=\"\",\"\",C82/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F82:vtf:t::IF($B82=\"\",\"\",$C$5-($B82-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G82:vtf:t::IF(B82=\"\",\"\",$C$5-($B82-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H82:b::::1\ncell:I82:vtf:t:null:IF(C82=\"\",\"null\",C82):tvf:2:ntvf:2\ncell:A83:b::1::\ncell:B83:vtf:t::IF(B82=\"\",\"\",B82+1):b::1::1:l:1:f:1:ntvf:3\ncell:C83:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D83:vtf:t::IF(C83=\"\",\"\",C83-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E83:vtf:t::IF(C83=\"\",\"\",C83/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F83:vtf:t::IF($B83=\"\",\"\",$C$5-($B83-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G83:vtf:t::IF(B83=\"\",\"\",$C$5-($B83-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H83:b::::1\ncell:I83:vtf:t:null:IF(C83=\"\",\"null\",C83):tvf:2:ntvf:2\ncell:A84:b::1::\ncell:B84:vtf:t::IF(B83=\"\",\"\",B83+1):b::1::1:l:1:f:1:ntvf:3\ncell:C84:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D84:vtf:t::IF(C84=\"\",\"\",C84-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E84:vtf:t::IF(C84=\"\",\"\",C84/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F84:vtf:t::IF($B84=\"\",\"\",$C$5-($B84-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G84:vtf:t::IF(B84=\"\",\"\",$C$5-($B84-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H84:b::::1\ncell:I84:vtf:t:null:IF(C84=\"\",\"null\",C84):tvf:2:ntvf:2\ncell:A85:b::1::\ncell:B85:vtf:t::IF(B84=\"\",\"\",B84+1):b::1::1:l:1:f:1:ntvf:3\ncell:C85:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D85:vtf:t::IF(C85=\"\",\"\",C85-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E85:vtf:t::IF(C85=\"\",\"\",C85/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F85:vtf:t::IF($B85=\"\",\"\",$C$5-($B85-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G85:vtf:t::IF(B85=\"\",\"\",$C$5-($B85-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H85:b::::1\ncell:I85:vtf:t:null:IF(C85=\"\",\"null\",C85):tvf:2:ntvf:2\ncell:A86:b::1::\ncell:B86:vtf:t::IF(B85=\"\",\"\",B85+1):b::1::1:l:1:f:1:ntvf:3\ncell:C86:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D86:vtf:t::IF(C86=\"\",\"\",C86-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E86:vtf:t::IF(C86=\"\",\"\",C86/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F86:vtf:t::IF($B86=\"\",\"\",$C$5-($B86-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G86:vtf:t::IF(B86=\"\",\"\",$C$5-($B86-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H86:b::::1\ncell:I86:vtf:t:null:IF(C86=\"\",\"null\",C86):tvf:2:ntvf:2\ncell:A87:b::1::\ncell:B87:vtf:t::IF(B86=\"\",\"\",B86+1):b::1::1:l:1:f:1:ntvf:3\ncell:C87:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D87:vtf:t::IF(C87=\"\",\"\",C87-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E87:vtf:t::IF(C87=\"\",\"\",C87/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F87:vtf:t::IF($B87=\"\",\"\",$C$5-($B87-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G87:vtf:t::IF(B87=\"\",\"\",$C$5-($B87-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H87:b::::1\ncell:I87:vtf:t:null:IF(C87=\"\",\"null\",C87):tvf:2:ntvf:2\ncell:A88:b::1::\ncell:B88:vtf:t::IF(B87=\"\",\"\",B87+1):b::1::1:l:1:f:1:ntvf:3\ncell:C88:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D88:vtf:t::IF(C88=\"\",\"\",C88-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E88:vtf:t::IF(C88=\"\",\"\",C88/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F88:vtf:t::IF($B88=\"\",\"\",$C$5-($B88-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G88:vtf:t::IF(B88=\"\",\"\",$C$5-($B88-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H88:b::::1\ncell:I88:vtf:t:null:IF(C88=\"\",\"null\",C88):tvf:2:ntvf:2\ncell:A89:b::1::\ncell:B89:vtf:t::IF(B88=\"\",\"\",B88+1):b::1::1:l:1:f:1:ntvf:3\ncell:C89:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D89:vtf:t::IF(C89=\"\",\"\",C89-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E89:vtf:t::IF(C89=\"\",\"\",C89/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F89:vtf:t::IF($B89=\"\",\"\",$C$5-($B89-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G89:vtf:t::IF(B89=\"\",\"\",$C$5-($B89-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H89:b::::1\ncell:I89:vtf:t:null:IF(C89=\"\",\"null\",C89):tvf:2:ntvf:2\ncell:A90:b::1::\ncell:B90:vtf:t::IF(B89=\"\",\"\",B89+1):b::1::1:l:1:f:1:ntvf:3\ncell:C90:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D90:vtf:t::IF(C90=\"\",\"\",C90-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E90:vtf:t::IF(C90=\"\",\"\",C90/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F90:vtf:t::IF($B90=\"\",\"\",$C$5-($B90-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G90:vtf:t::IF(B90=\"\",\"\",$C$5-($B90-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H90:b::::1\ncell:I90:vtf:t:null:IF(C90=\"\",\"null\",C90):tvf:2:ntvf:2\ncell:A91:b::1::\ncell:B91:vtf:t::IF(B90=\"\",\"\",B90+1):b::1::1:l:1:f:1:ntvf:3\ncell:C91:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D91:vtf:t::IF(C91=\"\",\"\",C91-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E91:vtf:t::IF(C91=\"\",\"\",C91/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F91:vtf:t::IF($B91=\"\",\"\",$C$5-($B91-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G91:vtf:t::IF(B91=\"\",\"\",$C$5-($B91-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H91:b::::1\ncell:I91:vtf:t:null:IF(C91=\"\",\"null\",C91):tvf:2:ntvf:2\ncell:A92:b::1::\ncell:B92:vtf:t::IF(B91=\"\",\"\",B91+1):b::1::1:l:1:f:1:ntvf:3\ncell:C92:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D92:vtf:t::IF(C92=\"\",\"\",C92-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E92:vtf:t::IF(C92=\"\",\"\",C92/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F92:vtf:t::IF($B92=\"\",\"\",$C$5-($B92-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G92:vtf:t::IF(B92=\"\",\"\",$C$5-($B92-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H92:b::::1\ncell:I92:vtf:t:null:IF(C92=\"\",\"null\",C92):tvf:2:ntvf:2\ncell:A93:b::1::\ncell:B93:vtf:t::IF(B92=\"\",\"\",B92+1):b::1::1:l:1:f:1:ntvf:3\ncell:C93:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D93:vtf:t::IF(C93=\"\",\"\",C93-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E93:vtf:t::IF(C93=\"\",\"\",C93/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F93:vtf:t::IF($B93=\"\",\"\",$C$5-($B93-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G93:vtf:t::IF(B93=\"\",\"\",$C$5-($B93-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H93:b::::1\ncell:I93:vtf:t:null:IF(C93=\"\",\"null\",C93):tvf:2:ntvf:2\ncell:A94:b::1::\ncell:B94:vtf:t::IF(B93=\"\",\"\",B93+1):b::1::1:l:1:f:1:ntvf:3\ncell:C94:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D94:vtf:t::IF(C94=\"\",\"\",C94-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E94:vtf:t::IF(C94=\"\",\"\",C94/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F94:vtf:t::IF($B94=\"\",\"\",$C$5-($B94-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G94:vtf:t::IF(B94=\"\",\"\",$C$5-($B94-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H94:b::::1\ncell:I94:vtf:t:null:IF(C94=\"\",\"null\",C94):tvf:2:ntvf:2\ncell:A95:b::1::\ncell:B95:vtf:t::IF(B94=\"\",\"\",B94+1):b::1::1:l:1:f:1:ntvf:3\ncell:C95:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D95:vtf:t::IF(C95=\"\",\"\",C95-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E95:vtf:t::IF(C95=\"\",\"\",C95/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F95:vtf:t::IF($B95=\"\",\"\",$C$5-($B95-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G95:vtf:t::IF(B95=\"\",\"\",$C$5-($B95-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H95:b::::1\ncell:I95:vtf:t:null:IF(C95=\"\",\"null\",C95):tvf:2:ntvf:2\ncell:A96:b::1::\ncell:B96:vtf:t::IF(B95=\"\",\"\",B95+1):b::1::1:l:1:f:1:ntvf:3\ncell:C96:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D96:vtf:t::IF(C96=\"\",\"\",C96-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E96:vtf:t::IF(C96=\"\",\"\",C96/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F96:vtf:t::IF($B96=\"\",\"\",$C$5-($B96-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G96:vtf:t::IF(B96=\"\",\"\",$C$5-($B96-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H96:b::::1\ncell:I96:vtf:t:null:IF(C96=\"\",\"null\",C96):tvf:2:ntvf:2\ncell:A97:b::1::\ncell:B97:vtf:t::IF(B96=\"\",\"\",B96+1):b::1::1:l:1:f:1:ntvf:3\ncell:C97:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D97:vtf:t::IF(C97=\"\",\"\",C97-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E97:vtf:t::IF(C97=\"\",\"\",C97/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F97:vtf:t::IF($B97=\"\",\"\",$C$5-($B97-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G97:vtf:t::IF(B97=\"\",\"\",$C$5-($B97-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H97:b::::1\ncell:I97:vtf:t:null:IF(C97=\"\",\"null\",C97):tvf:2:ntvf:2\ncell:A98:b::1::\ncell:B98:vtf:t::IF(B97=\"\",\"\",B97+1):b::1::1:l:1:f:1:ntvf:3\ncell:C98:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D98:vtf:t::IF(C98=\"\",\"\",C98-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E98:vtf:t::IF(C98=\"\",\"\",C98/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F98:vtf:t::IF($B98=\"\",\"\",$C$5-($B98-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G98:vtf:t::IF(B98=\"\",\"\",$C$5-($B98-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H98:b::::1\ncell:I98:vtf:t:null:IF(C98=\"\",\"null\",C98):tvf:2:ntvf:2\ncell:A99:b::1::\ncell:B99:vtf:t::IF(B98=\"\",\"\",B98+1):b::1::1:l:1:f:1:ntvf:3\ncell:C99:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D99:vtf:t::IF(C99=\"\",\"\",C99-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E99:vtf:t::IF(C99=\"\",\"\",C99/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F99:vtf:t::IF($B99=\"\",\"\",$C$5-($B99-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G99:vtf:t::IF(B99=\"\",\"\",$C$5-($B99-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H99:b::::1\ncell:I99:vtf:t:null:IF(C99=\"\",\"null\",C99):tvf:2:ntvf:2\ncell:A100:b::1::\ncell:B100:vtf:t::IF(B99=\"\",\"\",B99+1):b::1::1:l:1:f:1:ntvf:3\ncell:C100:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D100:vtf:t::IF(C100=\"\",\"\",C100-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E100:vtf:t::IF(C100=\"\",\"\",C100/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F100:vtf:t::IF($B100=\"\",\"\",$C$5-($B100-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G100:vtf:t::IF(B100=\"\",\"\",$C$5-($B100-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H100:b::::1\ncell:I100:vtf:t:null:IF(C100=\"\",\"null\",C100):tvf:2:ntvf:2\ncell:A101:b::1::\ncell:B101:vtf:t::IF(B100=\"\",\"\",B100+1):b::1::1:l:1:f:1:ntvf:3\ncell:C101:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D101:vtf:t::IF(C101=\"\",\"\",C101-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E101:vtf:t::IF(C101=\"\",\"\",C101/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F101:vtf:t::IF($B101=\"\",\"\",$C$5-($B101-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G101:vtf:t::IF(B101=\"\",\"\",$C$5-($B101-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H101:b::::1\ncell:I101:vtf:t:null:IF(C101=\"\",\"null\",C101):tvf:2:ntvf:2\ncell:A102:b::1::\ncell:B102:vtf:t::IF(B101=\"\",\"\",B101+1):b::1::1:l:1:f:1:ntvf:3\ncell:C102:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D102:vtf:t::IF(C102=\"\",\"\",C102-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E102:vtf:t::IF(C102=\"\",\"\",C102/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F102:vtf:t::IF($B102=\"\",\"\",$C$5-($B102-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G102:vtf:t::IF(B102=\"\",\"\",$C$5-($B102-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H102:b::::1\ncell:I102:vtf:t:null:IF(C102=\"\",\"null\",C102):tvf:2:ntvf:2\ncell:A103:b::1::\ncell:B103:vtf:t::IF(B102=\"\",\"\",B102+1):b::1::1:l:1:f:1:ntvf:3\ncell:C103:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D103:vtf:t::IF(C103=\"\",\"\",C103-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E103:vtf:t::IF(C103=\"\",\"\",C103/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F103:vtf:t::IF($B103=\"\",\"\",$C$5-($B103-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G103:vtf:t::IF(B103=\"\",\"\",$C$5-($B103-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H103:b::::1\ncell:I103:vtf:t:null:IF(C103=\"\",\"null\",C103):tvf:2:ntvf:2\ncell:A104:b::1::\ncell:B104:vtf:t::IF(B103=\"\",\"\",B103+1):b::1::1:l:1:f:1:ntvf:3\ncell:C104:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D104:vtf:t::IF(C104=\"\",\"\",C104-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E104:vtf:t::IF(C104=\"\",\"\",C104/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F104:vtf:t::IF($B104=\"\",\"\",$C$5-($B104-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G104:vtf:t::IF(B104=\"\",\"\",$C$5-($B104-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H104:b::::1\ncell:I104:vtf:t:null:IF(C104=\"\",\"null\",C104):tvf:2:ntvf:2\ncell:A105:b::1::\ncell:B105:vtf:t::IF(B104=\"\",\"\",B104+1):b::1::1:l:1:f:1:ntvf:3\ncell:C105:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D105:vtf:t::IF(C105=\"\",\"\",C105-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E105:vtf:t::IF(C105=\"\",\"\",C105/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F105:vtf:t::IF($B105=\"\",\"\",$C$5-($B105-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G105:vtf:t::IF(B105=\"\",\"\",$C$5-($B105-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H105:b::::1\ncell:I105:vtf:t:null:IF(C105=\"\",\"null\",C105):tvf:2:ntvf:2\ncell:A106:b::1::\ncell:B106:vtf:t::IF(B105=\"\",\"\",B105+1):b::1::1:l:1:f:1:ntvf:3\ncell:C106:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D106:vtf:t::IF(C106=\"\",\"\",C106-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E106:vtf:t::IF(C106=\"\",\"\",C106/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F106:vtf:t::IF($B106=\"\",\"\",$C$5-($B106-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G106:vtf:t::IF(B106=\"\",\"\",$C$5-($B106-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H106:b::::1\ncell:I106:vtf:t:null:IF(C106=\"\",\"null\",C106):tvf:2:ntvf:2\ncell:A107:b::1::\ncell:B107:vtf:t::IF(B106=\"\",\"\",B106+1):b::1::1:l:1:f:1:ntvf:3\ncell:C107:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D107:vtf:t::IF(C107=\"\",\"\",C107-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E107:vtf:t::IF(C107=\"\",\"\",C107/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F107:vtf:t::IF($B107=\"\",\"\",$C$5-($B107-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G107:vtf:t::IF(B107=\"\",\"\",$C$5-($B107-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H107:b::::1\ncell:I107:vtf:t:null:IF(C107=\"\",\"null\",C107):tvf:2:ntvf:2\ncell:A108:b::1::\ncell:B108:vtf:t::IF(B107=\"\",\"\",B107+1):b::1::1:l:1:f:1:ntvf:3\ncell:C108:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D108:vtf:t::IF(C108=\"\",\"\",C108-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E108:vtf:t::IF(C108=\"\",\"\",C108/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F108:vtf:t::IF($B108=\"\",\"\",$C$5-($B108-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G108:vtf:t::IF(B108=\"\",\"\",$C$5-($B108-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H108:b::::1\ncell:I108:vtf:t:null:IF(C108=\"\",\"null\",C108):tvf:2:ntvf:2\ncell:A109:b::1::\ncell:B109:vtf:t::IF(B108=\"\",\"\",B108+1):b::1::1:l:1:f:1:ntvf:3\ncell:C109:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D109:vtf:t::IF(C109=\"\",\"\",C109-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E109:vtf:t::IF(C109=\"\",\"\",C109/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F109:vtf:t::IF($B109=\"\",\"\",$C$5-($B109-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G109:vtf:t::IF(B109=\"\",\"\",$C$5-($B109-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H109:b::::1\ncell:I109:vtf:t:null:IF(C109=\"\",\"null\",C109):tvf:2:ntvf:2\ncell:A110:b::1::\ncell:B110:vtf:t::IF(B109=\"\",\"\",B109+1):b::1::1:l:1:f:1:ntvf:3\ncell:C110:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D110:vtf:t::IF(C110=\"\",\"\",C110-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E110:vtf:t::IF(C110=\"\",\"\",C110/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F110:vtf:t::IF($B110=\"\",\"\",$C$5-($B110-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G110:vtf:t::IF(B110=\"\",\"\",$C$5-($B110-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H110:b::::1\ncell:I110:vtf:t:null:IF(C110=\"\",\"null\",C110):tvf:2:ntvf:2\ncell:A111:b::1::\ncell:B111:vtf:t::IF(B110=\"\",\"\",B110+1):b::1::1:l:1:f:1:ntvf:3\ncell:C111:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D111:vtf:t::IF(C111=\"\",\"\",C111-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E111:vtf:t::IF(C111=\"\",\"\",C111/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F111:vtf:t::IF($B111=\"\",\"\",$C$5-($B111-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G111:vtf:t::IF(B111=\"\",\"\",$C$5-($B111-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H111:b::::1\ncell:I111:vtf:t:null:IF(C111=\"\",\"null\",C111):tvf:2:ntvf:2\ncell:A112:b::1::\ncell:B112:vtf:t::IF(B111=\"\",\"\",B111+1):b::1::1:l:1:f:1:ntvf:3\ncell:C112:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D112:vtf:t::IF(C112=\"\",\"\",C112-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E112:vtf:t::IF(C112=\"\",\"\",C112/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F112:vtf:t::IF($B112=\"\",\"\",$C$5-($B112-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G112:vtf:t::IF(B112=\"\",\"\",$C$5-($B112-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H112:b::::1\ncell:I112:vtf:t:null:IF(C112=\"\",\"null\",C112):tvf:2:ntvf:2\ncell:A113:b::1::\ncell:B113:vtf:t::IF(B112=\"\",\"\",B112+1):b::1::1:l:1:f:1:ntvf:3\ncell:C113:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D113:vtf:t::IF(C113=\"\",\"\",C113-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E113:vtf:t::IF(C113=\"\",\"\",C113/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F113:vtf:t::IF($B113=\"\",\"\",$C$5-($B113-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G113:vtf:t::IF(B113=\"\",\"\",$C$5-($B113-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H113:b::::1\ncell:I113:vtf:t:null:IF(C113=\"\",\"null\",C113):tvf:2:ntvf:2\ncell:A114:b::1::\ncell:B114:vtf:t::IF(B113=\"\",\"\",B113+1):b::1::1:l:1:f:1:ntvf:3\ncell:C114:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D114:vtf:t::IF(C114=\"\",\"\",C114-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E114:vtf:t::IF(C114=\"\",\"\",C114/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F114:vtf:t::IF($B114=\"\",\"\",$C$5-($B114-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G114:vtf:t::IF(B114=\"\",\"\",$C$5-($B114-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H114:b::::1\ncell:I114:vtf:t:null:IF(C114=\"\",\"null\",C114):tvf:2:ntvf:2\ncell:A115:b::1::\ncell:B115:vtf:t::IF(B114=\"\",\"\",B114+1):b::1::1:l:1:f:1:ntvf:3\ncell:C115:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D115:vtf:t::IF(C115=\"\",\"\",C115-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E115:vtf:t::IF(C115=\"\",\"\",C115/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F115:vtf:t::IF($B115=\"\",\"\",$C$5-($B115-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G115:vtf:t::IF(B115=\"\",\"\",$C$5-($B115-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H115:b::::1\ncell:I115:vtf:t:null:IF(C115=\"\",\"null\",C115):tvf:2:ntvf:2\ncell:A116:b::1::\ncell:B116:vtf:t::IF(B115=\"\",\"\",B115+1):b::1::1:l:1:f:1:ntvf:3\ncell:C116:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D116:vtf:t::IF(C116=\"\",\"\",C116-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E116:vtf:t::IF(C116=\"\",\"\",C116/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F116:vtf:t::IF($B116=\"\",\"\",$C$5-($B116-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G116:vtf:t::IF(B116=\"\",\"\",$C$5-($B116-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H116:b::::1\ncell:I116:vtf:t:null:IF(C116=\"\",\"null\",C116):tvf:2:ntvf:2\ncell:A117:b::1::\ncell:B117:vtf:t::IF(B116=\"\",\"\",B116+1):b::1::1:l:1:f:1:ntvf:3\ncell:C117:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D117:vtf:t::IF(C117=\"\",\"\",C117-$C$5):b::1::1:l:1:f:1:ntvf:1\ncell:E117:vtf:t::IF(C117=\"\",\"\",C117/($G$5/100)^2):b::1::1:l:1:f:1:ntvf:1\ncell:F117:vtf:t::IF($B117=\"\",\"\",$C$5-($B117-$C$6)*($F$10/7)):b::1::1:l:1:f:1:ntvf:1\ncell:G117:vtf:t::IF(B117=\"\",\"\",$C$5-($B117-$C$6)*($F$9/7)):b::1::1:l:1:f:1:ntvf:1\ncell:H117:b::::1\ncell:I117:vtf:t:null:IF(C117=\"\",\"null\",C117):tvf:2:ntvf:2\ncell:A118:b::1::\ncell:B118:vtf:t::IF(B117=\"\",\"\",B117+1):b::1::1:l:1:f:1:ntvf:3\ncell:C118:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:D118:vtf:t::IF(C118=\"\",\"\",C118-$C$5):b::1:1:1:l:1:f:1:ntvf:1\ncell:E118:vtf:t::IF(C118=\"\",\"\",C118/($G$5/100)^2):b::1:1:1:l:1:f:1:ntvf:1\ncell:F118:vtf:t::IF($B118=\"\",\"\",$C$5-($B118-$C$6)*($F$10/7)):b::1:1:1:l:1:f:1:ntvf:1\ncell:G118:vtf:t::IF(B118=\"\",\"\",$C$5-($B118-$C$6)*($F$9/7)):b::1:1:1:l:1:f:1:ntvf:1\ncell:H118:b::::1\ncell:I118:vtf:t:null:IF(C118=\"\",\"null\",C118):tvf:2:ntvf:2\ncell:B119:b:1:::\ncell:C119:b:1:::\ncell:D119:b:1:::\ncell:E119:b:1:::\ncell:F119:b:1:::\ncell:G119:b:1:::\ncol:A:w:10\ncol:C:w:89\nsheet:c:12:r:119\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\nfont:1:* 11pt arial,helvetica,sans-serif\nfont:2:* 12pt arial,helvetica,sans-serif\nfont:3:* 18pt arial,helvetica,sans-serif\nlayout:1:padding:4px 3px 4px 3px;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n"},"name":"sheet2","hidden":"0"}},"EditableCells":{"allow":true,"cells":{"sheet2!B2":true,"sheet2!B5":true,"sheet2!B6":true,"sheet2!B7":true,"sheet2!C5":true,"sheet2!C6":true,"sheet2!D5":true,"sheet2!D6":true,"sheet2!D7":true,"sheet2!E5":true,"sheet2!E6":true,"sheet2!F5":true,"sheet2!G5":true,"sheet2!B9":true,"sheet2!F9":true,"sheet2!F10":true,"sheet2!B10":true,"sheet2!B27":true,"sheet2!C27":true,"sheet2!D27":true,"sheet2!E27":true,"sheet2!F27":true,"sheet2!G27":true,"sheet2!C28":true,"sheet2!C29":true,"sheet2!C30":true,"sheet2!C31":true,"sheet2!C32":true,"sheet2!C33":true,"sheet2!C34":true,"sheet2!C35":true,"sheet2!C36":true,"sheet2!C37":true,"sheet2!C38":true,"sheet2!C39":true,"sheet2!C40":true,"sheet2!C41":true,"sheet2!C42":true,"sheet2!C43":true,"sheet2!C44":true,"sheet2!C45":true,"sheet2!C46":true,"sheet2!C47":true,"sheet2!C48":true,"sheet2!C49":true,"sheet2!C50":true,"sheet2!C51":true,"sheet2!C52":true,"sheet2!C53":true,"sheet2!C54":true,"sheet2!C55":true,"sheet2!C56":true,"sheet2!C57":true,"sheet2!C58":true,"sheet2!C59":true,"sheet2!C60":true,"sheet2!C61":true,"sheet2!C62":true,"sheet2!C63":true,"sheet2!C64":true,"sheet2!C65":true,"sheet2!C66":true,"sheet2!C67":true,"sheet2!C68":true,"sheet2!C69":true,"sheet2!C70":true,"sheet2!C71":true,"sheet2!C72":true,"sheet2!C73":true,"sheet2!C74":true,"sheet2!C75":true,"sheet2!C76":true,"sheet2!C77":true,"sheet2!C78":true,"sheet2!C79":true,"sheet2!C80":true,"sheet2!C81":true,"sheet2!C82":true,"sheet2!C83":true,"sheet2!C84":true,"sheet2!C85":true,"sheet2!C86":true,"sheet2!C87":true,"sheet2!C88":true,"sheet2!C89":true,"sheet2!C90":true,"sheet2!C91":true,"sheet2!C92":true,"sheet2!C93":true,"sheet2!C94":true,"sheet2!C95":true,"sheet2!C96":true,"sheet2!C97":true,"sheet2!C98":true,"sheet2!C99":true,"sheet2!C100":true,"sheet2!C101":true,"sheet2!C102":true,"sheet2!C103":true,"sheet2!C104":true,"sheet2!C105":true,"sheet2!C106":true,"sheet2!C107":true,"sheet2!C108":true,"sheet2!C109":true,"sheet2!C110":true,"sheet2!C111":true,"sheet2!C112":true,"sheet2!C113":true,"sheet2!C114":true,"sheet2!C115":true,"sheet2!C116":true,"sheet2!C117":true,"sheet2!C118":true},"constraints":{}}} \ No newline at end of file diff --git a/Website/excelinterop/tmp/a-journal b/Website/excelinterop/tmp/a-journal deleted file mode 100644 index c0d5ecf..0000000 Binary files a/Website/excelinterop/tmp/a-journal and /dev/null differ diff --git a/Website/excelinterop/tmp/account-statement.xls b/Website/excelinterop/tmp/account-statement.xls deleted file mode 100644 index d61c682..0000000 Binary files a/Website/excelinterop/tmp/account-statement.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/billing-statement-1.xls b/Website/excelinterop/tmp/billing-statement-1.xls deleted file mode 100644 index 5cfa632..0000000 Binary files a/Website/excelinterop/tmp/billing-statement-1.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/bills.msc.txt b/Website/excelinterop/tmp/bills.msc.txt deleted file mode 100644 index 1750ccd..0000000 --- a/Website/excelinterop/tmp/bills.msc.txt +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":4,"currentid":"sheet1","currentname":"sheet4","sheetArr":{"sheet1":{"sheetstr":{"savestr":"version:1.5\ncell:F1:colspan:2\ncell:B2:t:Bill Tracker:b::3:3::l:1:f:4:c:3:bg:1:cf:1:colspan:7\ncell:C2:l:1\ncell:D2:l:1\ncell:E2:l:1\ncell:F2:l:1\ncell:G2:l:1\ncell:H2:l:1\ncell:B3:b:2::2::l:1:f:1:cf:1\ncell:C3:l:1:colspan:3\ncell:D3:l:1\ncell:E3:l:1\ncell:F3:l:1:colspan:2\ncell:G3:l:1\ncell:H3:l:1\ncell:A4:b::2::\ncell:B4:t:Business Name:b:2:2:2:2:l:1:f:3:cf:1\ncell:C4:b:2:2:2:2:l:1:f:3:cf:2:colspan:5\ncell:D4:l:1:f:2:c:3:cf:1\ncell:E4:l:1:f:2:c:3:cf:3:ntvf:1\ncell:F4:l:1:f:2:c:3:cf:1:ntvf:1:colspan:2\ncell:G4:l:1:f:2:c:3:cf:3:tvf:4:ntvf:1\ncell:H4:l:1:f:2:c:3:cf:3:ntvf:1\ncell:A5:b::2::\ncell:B5:t:Budget Name:b:2:2:2:2:l:1:f:3:bg:2:cf:1\ncell:C5:b:2:2:2:2:l:1:f:3:bg:2:cf:2:colspan:5\ncell:D5:l:1:f:2:c:3:cf:1\ncell:E5:l:1:f:2:c:3:cf:3:ntvf:1\ncell:F5:l:1:f:2:c:3:cf:1:ntvf:1:colspan:2\ncell:G5:l:1:f:2:c:3:cf:3:ntvf:1\ncell:H5:l:1:f:2:c:3:cf:3:ntvf:1\ncell:A6:b::2::\ncell:B6:t:Budget Description:b:2:2:2:2:l:1:f:3:cf:1\ncell:C6:b:2:2:2:2:l:1:f:3:cf:2:colspan:5\ncell:D6:l:1:f:2:c:3:cf:1\ncell:E6:l:1:f:2:c:3:cf:1:ntvf:1\ncell:F6:l:1:f:2:c:3:cf:1:ntvf:1:colspan:2\ncell:G6:l:1:f:2:c:3:cf:1:ntvf:1\ncell:H6:l:1:f:2:c:3:cf:1:ntvf:1\ncell:A7:b::2::\ncell:B7:t:Maintainer:b:2:2:2:2:l:1:f:3:bg:2:cf:1\ncell:C7:b:2:2:2:2:l:1:f:3:bg:2:cf:2:colspan:5\ncell:D7:l:1:f:2:c:3:cf:1\ncell:E7:l:1:f:2:c:3:cf:1:ntvf:1\ncell:F7:l:1:f:2:c:3:cf:1:ntvf:1:colspan:2\ncell:G7:l:1:f:2:c:3:cf:1:ntvf:1\ncell:H7:l:1:f:2:c:3:cf:1:ntvf:1\ncell:B8:l:1:f:2\ncell:C8:b:2::::l:1:f:2:colspan:3\ncell:D8:b:2::::l:1:f:2\ncell:E8:b:2::::l:1:f:2\ncell:F8:l:1:f:2:colspan:2\ncell:G8:l:1:f:2\ncell:H8:l:1:f:2\ncell:A9:b::3::\ncell:B9:t:Payee:b:::2:3:l:1:f:3:c:3:bg:1:cf:1\ncell:C9:t:Prio- rity:b:::2:3:l:1:f:3:c:3:bg:1:cf:1\ncell:D9:t:Recieved Date:b:::2:3:l:1:f:3:c:3:bg:1:cf:1:colspan:2\ncell:E9:t:Due Date:b:::2:3:l:1:f:3:c:3:bg:1:cf:1\ncell:F9:t:Category:b:::2:3:l:1:f:3:c:3:bg:1:cf:1:colspan:2\ncell:G9:t:Category:b:::2:3:l:1:f:3:c:3:bg:1:cf:1\ncell:H9:t:Description:b:::2:3:l:1:f:3:c:3:bg:1:cf:1\ncell:A10:b::2::\ncell:B10:t::b::1::2:l:1:f:3:bg:3:cf:2\ncell:C10:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D10:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E10:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F10:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G10:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H10:b:2:1::2:l:1:f:3:bg:3:cf:2:ntvf:2\ncell:A11:b::2::\ncell:B11:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C11:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D11:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E11:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F11:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G11:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H11:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A12:b::2::\ncell:B12:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C12:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D12:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E12:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F12:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G12:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H12:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A13:b::2::\ncell:B13:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C13:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D13:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E13:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F13:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G13:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H13:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A14:b::2::\ncell:B14:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C14:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D14:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E14:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F14:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G14:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H14:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A15:b::2::\ncell:B15:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C15:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D15:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E15:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F15:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G15:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H15:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A16:b::2::\ncell:B16:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C16:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D16:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E16:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F16:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G16:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H16:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A17:b::2::\ncell:B17:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C17:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D17:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E17:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F17:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G17:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H17:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A18:b::2::\ncell:B18:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C18:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D18:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E18:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F18:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G18:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H18:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A19:b::2::\ncell:B19:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C19:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D19:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E19:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F19:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G19:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H19:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A20:b::2::\ncell:B20:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C20:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D20:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E20:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F20:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G20:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H20:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A21:b::2::\ncell:B21:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C21:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D21:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E21:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F21:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G21:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H21:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A22:b::2::\ncell:B22:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C22:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D22:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E22:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F22:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G22:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H22:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A23:b::2::\ncell:B23:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C23:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D23:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E23:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F23:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G23:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H23:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A24:b::2::\ncell:B24:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C24:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D24:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E24:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F24:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G24:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H24:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A25:b::2::\ncell:B25:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C25:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D25:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E25:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F25:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G25:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H25:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A26:b::2::\ncell:B26:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C26:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D26:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E26:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F26:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G26:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H26:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A27:b::2::\ncell:B27:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C27:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D27:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E27:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F27:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G27:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H27:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A28:b::2::\ncell:B28:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C28:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D28:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E28:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F28:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G28:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H28:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A29:b::2::\ncell:B29:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C29:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D29:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E29:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F29:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G29:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H29:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A30:b::2::\ncell:B30:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C30:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D30:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E30:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F30:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G30:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H30:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A31:b::2::\ncell:B31:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C31:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D31:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E31:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F31:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G31:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H31:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A32:b::2::\ncell:B32:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C32:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D32:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E32:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F32:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G32:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H32:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A33:b::2::\ncell:B33:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C33:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D33:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E33:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F33:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G33:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H33:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A34:b::2::\ncell:B34:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C34:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D34:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E34:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F34:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G34:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H34:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A35:b::2::\ncell:B35:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C35:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D35:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E35:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F35:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G35:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H35:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A36:b::2::\ncell:B36:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C36:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D36:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E36:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F36:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G36:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H36:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A37:b::2::\ncell:B37:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C37:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D37:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E37:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F37:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G37:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H37:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A38:b::2::\ncell:B38:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C38:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D38:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E38:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F38:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G38:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H38:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A39:b::2::\ncell:B39:b::1::2:l:1:f:3:bg:2:cf:2\ncell:C39:b::1::2:l:1:f:3:bg:2:cf:3\ncell:D39:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E39:b::1::2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F39:b::1::2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G39:b::1::2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H39:b::1::2:l:1:f:3:bg:2:cf:2\ncell:A40:b::2::\ncell:B40:b::1::2:l:1:f:3:bg:3:cf:2\ncell:C40:b::1::2:l:1:f:3:bg:3:cf:3\ncell:D40:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:3:colspan:2\ncell:E40:b::1::2:l:1:f:3:bg:3:cf:2:ntvf:3\ncell:F40:b::1::2:l:1:f:3:bg:3:cf:2:colspan:2\ncell:G40:b::1::2:l:1:f:3:bg:3:cf:3:ntvf:1\ncell:H40:b::1::2:l:1:f:3:bg:3:cf:2\ncell:A41:b::2::\ncell:B41:b::1:2:2:l:1:f:3:bg:2:cf:2\ncell:C41:b::1:2:2:l:1:f:3:bg:2:cf:3\ncell:D41:b::1:2:2:l:1:f:3:bg:2:cf:3:ntvf:3:colspan:2\ncell:E41:b::1:2:2:l:1:f:3:bg:2:cf:2:ntvf:3\ncell:F41:b::1:2:2:l:1:f:3:bg:2:cf:2:colspan:2\ncell:G41:b::1:2:2:l:1:f:3:bg:2:cf:3:ntvf:1\ncell:H41:b::1:2:2:l:1:f:3:bg:2:cf:2\ncol:A:w:10\ncol:B:w:120\ncol:C:w:57\ncol:D:w:41\ncol:E:w:30\ncol:F:w:40\ncol:G:w:45\ncol:H:w:185\nsheet:c:8:r:41\nborder:1:1px solid rgb(0, 0, 0)\nborder:2:1px solid rgb(0,0,0)\nborder:3:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal bold 12pt arial,helvetica,sans-serif\nfont:2:normal bold 9pt arial,helvetica,sans-serif\nfont:3:normal normal 11pt arial,helvetica,sans-serif\nfont:4:normal normal 18pt arial,helvetica,sans-serif\nlayout:1:padding:6px 2px 6px 2px;vertical-align:bottom;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00;\\b-#,##0.00;\\b-\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n"},"name":"sheet4","hidden":"0"},"sheet2":{"sheetstr":{"savestr":"version:1.5\ncell:B1:tvf:2:ntvf:2\ncell:B3:vtf:t:Business Name:IF(SHEET4!B4=\"\", \"\", SHEET4!B4):b:2:2:2:2:l:2:f:1:cf:1:colspan:2\ncell:C3:b:2:2:2:2:l:2:f:1\ncell:D3:vtf:t::IF(SHEET4!C4=\"\", \"\", SHEET4!C4):b:2:2:2:2:l:2:f:1:c:1:cf:2:colspan:3\ncell:E3:l:2:f:1\ncell:F3:l:2:f:1\ncell:G3:l:2:f:1\ncell:H3:l:2:f:1\ncell:I3:l:1:f:2:cf:2\ncell:B4:vtf:t:Budget Name:IF(SHEET4!B5=\"\", \"\", SHEET4!B5):b:2:2:2:2:l:2:f:1:bg:3:cf:1:colspan:2\ncell:C4:b:2:2:2:2:l:2:f:1:bg:3\ncell:D4:vtf:t::IF(SHEET4!C5=\"\", \"\", SHEET4!C5):b:2:2:2:2:l:2:f:1:c:1:bg:3:cf:2:colspan:3\ncell:E4:b:2:2:2:2:l:2:f:1\ncell:F4:b:2:2:2:2:l:2:f:1\ncell:G4:l:2:f:1\ncell:H4:l:2:f:1\ncell:I4:l:1:f:2\ncell:B5:vtf:t:Budget Description:IF(SHEET4!B6=\"\", \"\", SHEET4!B6):b:2:2:2:2:l:2:f:1:cf:1:colspan:2\ncell:C5:b:2:2:2:2:l:2:f:1\ncell:D5:vtf:t::IF(SHEET4!C6=\"\", \"\", SHEET4!C6):b:2:2:2:2:l:2:f:1:c:1:cf:2:colspan:3\ncell:E5:l:2:f:1\ncell:F5:l:2:f:1\ncell:G5:l:2:f:1\ncell:H5:l:2:f:1\ncell:B6:vtf:t:Maintainer:IF(SHEET4!B7=\"\", \"\", SHEET4!B7):b:2:2:2:2:l:2:f:1:bg:3:cf:1:colspan:2\ncell:C6:b:2:2:2:2:l:2:f:1:bg:3\ncell:D6:vtf:t::IF(SHEET4!C7=\"\", \"\", SHEET4!C7):b:2:2:2:2:l:2:f:1:c:1:bg:3:cf:2:colspan:3\ncell:E6:l:2:f:1\ncell:F6:l:2:f:1\ncell:G6:l:2:f:1\ncell:H6:l:2:f:1\ncell:B7:l:2:f:1:colspan:2\ncell:C7:l:2:f:1\ncell:D7:l:2:f:1:colspan:3\ncell:E7:l:2:f:1\ncell:F7:l:2:f:1\ncell:G7:l:2:f:1\ncell:H7:l:2:f:1\ncell:A8:b::3::\ncell:B8:vtf:t:Payee:IF(SHEET4!B9=\"\", \"\", SHEET4!B9):b:::2:3:l:2:f:1:c:4:bg:2:cf:1:colspan:2\ncell:C8:t:Num:b:::2:3:l:2:f:1:c:4:bg:2:cf:1\ncell:D8:t:Billed Amount:b:::2:3:l:2:f:1:c:4:bg:2:cf:1\ncell:E8:t:Due Date:b:::2:3:l:2:f:1:c:4:bg:2:cf:1\ncell:F8:t:Paid:b:::2:3:l:2:f:1:c:4:bg:2:cf:1\ncell:G8:t:Date Paid:b:::2:3:l:2:f:1:c:4:bg:2:cf:1:ntvf:3\ncell:H8:t:Amount Paid:b::3:2:3:l:2:f:1:c:4:bg:2:cf:1\ncell:A9:b::2::\ncell:B9:vtf:t::IF(SHEET4!B10=\"\", \"\", SHEET4!B10):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C9:b::1::2:l:2:f:1:cf:2\ncell:D9:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E9:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F9:b::1::2:l:2:f:1:cf:2\ncell:G9:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H9:b:2:2::2:l:2:f:1:cf:3:ntvf:1\ncell:A10:b::2::\ncell:B10:vtf:t::IF(SHEET4!B11=\"\", \"\", SHEET4!B11):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C10:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D10:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E10:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F10:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G10:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H10:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A11:b::2::\ncell:B11:vtf:t::IF(SHEET4!B12=\"\", \"\", SHEET4!B12):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C11:b::1::2:l:2:f:1:cf:2\ncell:D11:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E11:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F11:b::1::2:l:2:f:1:cf:2\ncell:G11:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H11:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A12:b::2::\ncell:B12:vtf:t::IF(SHEET4!B13=\"\", \"\", SHEET4!B13):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C12:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D12:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E12:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F12:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G12:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H12:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A13:b::2::\ncell:B13:vtf:t::IF(SHEET4!B14=\"\", \"\", SHEET4!B14):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C13:b::1::2:l:2:f:1:cf:2\ncell:D13:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E13:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F13:b::1::2:l:2:f:1:cf:2\ncell:G13:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H13:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A14:b::2::\ncell:B14:vtf:t::IF(SHEET4!B15=\"\", \"\", SHEET4!B15):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C14:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D14:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E14:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F14:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G14:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H14:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A15:b::2::\ncell:B15:vtf:t::IF(SHEET4!B16=\"\", \"\", SHEET4!B16):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C15:b::1::2:l:2:f:1:cf:2\ncell:D15:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E15:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F15:b::1::2:l:2:f:1:cf:2\ncell:G15:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H15:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A16:b::2::\ncell:B16:vtf:t::IF(SHEET4!B17=\"\", \"\", SHEET4!B17):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C16:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D16:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E16:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F16:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G16:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H16:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A17:b::2::\ncell:B17:vtf:t::IF(SHEET4!B18=\"\", \"\", SHEET4!B18):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C17:b::1::2:l:2:f:1:cf:2\ncell:D17:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E17:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F17:b::1::2:l:2:f:1:cf:2\ncell:G17:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H17:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A18:b::2::\ncell:B18:vtf:t::IF(SHEET4!B19=\"\", \"\", SHEET4!B19):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C18:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D18:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E18:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F18:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G18:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H18:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A19:b::2::\ncell:B19:vtf:t::IF(SHEET4!B20=\"\", \"\", SHEET4!B20):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C19:b::1::2:l:2:f:1:cf:2\ncell:D19:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E19:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F19:b::1::2:l:2:f:1:cf:2\ncell:G19:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H19:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A20:b::2::\ncell:B20:vtf:t::IF(SHEET4!B21=\"\", \"\", SHEET4!B21):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C20:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D20:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E20:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F20:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G20:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H20:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A21:b::2::\ncell:B21:vtf:t::IF(SHEET4!B22=\"\", \"\", SHEET4!B22):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C21:b::1::2:l:2:f:1:cf:2\ncell:D21:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E21:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F21:b::1::2:l:2:f:1:cf:2\ncell:G21:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H21:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A22:b::2::\ncell:B22:vtf:t::IF(SHEET4!B23=\"\", \"\", SHEET4!B23):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C22:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D22:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E22:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F22:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G22:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H22:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A23:b::2::\ncell:B23:vtf:t::IF(SHEET4!B24=\"\", \"\", SHEET4!B24):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C23:b::1::2:l:2:f:1:cf:2\ncell:D23:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E23:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F23:b::1::2:l:2:f:1:cf:2\ncell:G23:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H23:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A24:b::2::\ncell:B24:vtf:t::IF(SHEET4!B25=\"\", \"\", SHEET4!B25):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C24:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D24:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E24:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F24:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G24:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H24:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A25:b::2::\ncell:B25:vtf:t::IF(SHEET4!B26=\"\", \"\", SHEET4!B26):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C25:b::1::2:l:2:f:1:cf:2\ncell:D25:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E25:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F25:b::1::2:l:2:f:1:cf:2\ncell:G25:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H25:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A26:b::2::\ncell:B26:vtf:t::IF(SHEET4!B27=\"\", \"\", SHEET4!B27):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C26:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D26:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E26:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F26:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G26:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H26:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A27:b::2::\ncell:B27:vtf:t::IF(SHEET4!B28=\"\", \"\", SHEET4!B28):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C27:b::1::2:l:2:f:1:cf:2\ncell:D27:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E27:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F27:b::1::2:l:2:f:1:cf:2\ncell:G27:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H27:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A28:b::2::\ncell:B28:vtf:t::IF(SHEET4!B29=\"\", \"\", SHEET4!B29):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C28:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D28:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E28:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F28:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G28:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H28:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A29:b::2::\ncell:B29:vtf:t::IF(SHEET4!B30=\"\", \"\", SHEET4!B30):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C29:b::1::2:l:2:f:1:cf:2\ncell:D29:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E29:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F29:b::1::2:l:2:f:1:cf:2\ncell:G29:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H29:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A30:b::2::\ncell:B30:vtf:t::IF(SHEET4!B31=\"\", \"\", SHEET4!B31):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C30:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D30:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E30:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F30:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G30:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H30:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A31:b::2::\ncell:B31:vtf:t::IF(SHEET4!B32=\"\", \"\", SHEET4!B32):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C31:b::1::2:l:2:f:1:cf:2\ncell:D31:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E31:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F31:b::1::2:l:2:f:1:cf:2\ncell:G31:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H31:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A32:b::2::\ncell:B32:vtf:t::IF(SHEET4!B33=\"\", \"\", SHEET4!B33):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C32:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D32:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E32:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F32:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G32:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H32:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A33:b::2::\ncell:B33:vtf:t::IF(SHEET4!B34=\"\", \"\", SHEET4!B34):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C33:b::1::2:l:2:f:1:cf:2\ncell:D33:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E33:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F33:b::1::2:l:2:f:1:cf:2\ncell:G33:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H33:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A34:b::2::\ncell:B34:vtf:t::IF(SHEET4!B35=\"\", \"\", SHEET4!B35):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C34:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D34:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E34:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F34:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G34:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H34:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A35:b::2::\ncell:B35:vtf:t::IF(SHEET4!B36=\"\", \"\", SHEET4!B36):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C35:b::1::2:l:2:f:1:cf:2\ncell:D35:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E35:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F35:b::1::2:l:2:f:1:cf:2\ncell:G35:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H35:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A36:b::2::\ncell:B36:vtf:t::IF(SHEET4!B37=\"\", \"\", SHEET4!B37):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C36:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D36:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E36:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F36:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G36:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H36:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A37:b::2::\ncell:B37:vtf:t::IF(SHEET4!B38=\"\", \"\", SHEET4!B38):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C37:b::1::2:l:2:f:1:cf:2\ncell:D37:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E37:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F37:b::1::2:l:2:f:1:cf:2\ncell:G37:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H37:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A38:b::2::\ncell:B38:vtf:t::IF(SHEET4!B39=\"\", \"\", SHEET4!B39):b::1::2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C38:b::1::2:l:2:f:1:bg:3:cf:2\ncell:D38:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E38:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F38:b::1::2:l:2:f:1:bg:3:cf:2\ncell:G38:b::1::2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H38:b::2::2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:A39:b::2::\ncell:B39:vtf:t::IF(SHEET4!B40=\"\", \"\", SHEET4!B40):b::1::2:l:2:f:1:cf:2:colspan:2\ncell:C39:b::1::2:l:2:f:1:cf:2\ncell:D39:b::1::2:l:2:f:1:cf:3:ntvf:1\ncell:E39:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:F39:b::1::2:l:2:f:1:cf:2\ncell:G39:b::1::2:l:2:f:1:cf:3:ntvf:3\ncell:H39:b::2::2:l:2:f:1:cf:3:ntvf:1\ncell:A40:b::2::\ncell:B40:vtf:t::IF(SHEET4!B41=\"\", \"\", SHEET4!B41):b::1:2:2:l:2:f:1:bg:3:cf:2:colspan:2\ncell:C40:b::1:2:2:l:2:f:1:bg:3:cf:2\ncell:D40:b::1:2:2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:E40:b::1:2:2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:F40:b::1:2:2:l:2:f:1:bg:3:cf:2\ncell:G40:b::1:2:2:l:2:f:1:bg:3:cf:3:ntvf:3\ncell:H40:b::2:2:2:l:2:f:1:bg:3:cf:3:ntvf:1\ncell:B41:l:2:f:1\ncell:C41:b:2::::l:2:f:1\ncell:D41:b:2::::l:2:f:1\ncell:E41:t:Total:b:2:2:2:2:l:2:f:1:c:4:bg:2:cf:1:colspan:3\ncell:F41:b:2:2:2:2:l:2:f:1:c:4:bg:2\ncell:G41:vtf:n:0:SUM(G9\\cG40):b:2:2:2:2:l:2:f:1:c:4:bg:2\ncell:H41:vtf:n:0:SUM(H9\\cH40):b:2:2:2:2:l:2:f:1:c:4:bg:2:ntvf:1\ncol:A:w:10\ncol:B:w:60\ncol:C:w:60\ncol:D:w:100\ncol:E:w:68\ncol:F:w:50\ncol:G:w:72\ncol:H:w:100\ncol:I:w:144\nrow:1:h:23.25\nrow:2:h:23.25\nrow:3:h:14.2\nrow:4:h:16.6\nrow:5:h:15\nrow:6:h:15\nrow:8:h:27.75\nrow:38:h:13.5\nrow:39:h:13.5\nrow:39:hide:1\nrow:40:h:15\nsheet:c:9:r:41:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0, 0, 0)\nborder:2:1px solid rgb(0,0,0)\nborder:3:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:* 11pt arial,helvetica,sans-serif\nfont:2:normal normal 8pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 2px 4px 2px;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\n"},"name":"Expenses","hidden":"0"},"sheet3":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Bill Tracker:b::3:3::l:2:f:3:c:3:bg:1:cf:1:colspan:7\ncell:B3:b:2::2::l:4:f:1:cf:1\ncell:C3:colspan:3\ncell:B4:t:Business Name:b:2:2:2:2:l:3:f:2:cf:1\ncell:C4:t:Aspiring Investments:b:2:2:2:2:l:6:f:2:cf:2:colspan:4\ncell:D4:l:4:f:2:c:3:cf:1\ncell:E4:l:4:f:2:c:3:cf:3:ntvf:1\ncell:F4:l:4:f:2:c:3:cf:1:ntvf:1\ncell:G4:l:4:f:2:c:3:cf:3:tvf:3:ntvf:1\ncell:H4:l:4:f:2:c:3:cf:3:ntvf:1\ncell:B5:t:Budget Name:b:2:2:2:2:l:3:f:2:bg:2:cf:1\ncell:C5:t:Sales Budget:b:2:2:2:2:l:6:f:2:bg:2:cf:2:colspan:4\ncell:D5:l:4:f:2:c:3:cf:1\ncell:E5:l:4:f:2:c:3:cf:3:ntvf:1\ncell:F5:l:4:f:2:c:3:cf:1:ntvf:1\ncell:G5:l:4:f:2:c:3:cf:3:ntvf:1\ncell:H5:l:4:f:2:c:3:cf:3:ntvf:1\ncell:B6:t:Budget Description:b:2:2:2:2:l:3:f:2:cf:1\ncell:C6:t:Festive Season Budget :b:2:2:2:2:l:6:f:2:cf:2:colspan:4\ncell:D6:l:4:f:2:c:3:cf:1\ncell:E6:l:4:f:2:c:3:cf:1:ntvf:1\ncell:F6:l:4:f:2:c:3:cf:1:ntvf:1\ncell:G6:l:4:f:2:c:3:cf:1:ntvf:1\ncell:H6:l:4:f:2:c:3:cf:1:ntvf:1\ncell:B7:t:Maintainer:b:2:2:2:2:l:3:f:2:bg:2:cf:1\ncell:C7:t:Dan Bender:b:2:2:2:2:l:6:f:2:bg:2:cf:2:colspan:4\ncell:D7:l:4:f:2:c:3:cf:1\ncell:E7:l:4:f:2:c:3:cf:1:ntvf:1\ncell:F7:l:4:f:2:c:3:cf:1:ntvf:1\ncell:G7:l:4:f:2:c:3:cf:1:ntvf:1\ncell:H7:l:4:f:2:c:3:cf:1:ntvf:1\ncell:B8:b:2::::l:1:f:2\ncell:C8:b:2::::l:1:f:2:colspan:3\ncell:D8:b:2::::l:1:f:2\ncell:E8:b:2::::l:1:f:2\ncell:F8:l:1:f:2\ncell:G8:l:1:f:2\ncell:H8:l:1:f:2\ncell:A9:b::3::\ncell:B9:t:Payee:b:::2:3:l:5:f:2:c:3:bg:1:cf:1\ncell:C9:t:Prio- rity:b:::2:3:l:5:f:2:c:3:bg:1:cf:1\ncell:D9:t:Recieved Date:b:::2:3:l:5:f:2:c:3:bg:1:cf:1:colspan:2\ncell:E9:t:Category:b:::2:3:l:5:f:2:c:3:bg:1:cf:1\ncell:F9:t:Category:b:::2:3:l:5:f:2:c:3:bg:1:cf:1:colspan:2\ncell:G9:t:Estimate:b:::2:3:l:5:f:2:c:3:bg:1:cf:1\ncell:H9:t:Description:b:::2:3:l:5:f:2:c:3:bg:1:cf:1\ncell:A10:b::2::\ncell:B10:t:Google AdWords:b::1::2:l:6:f:2:cf:2\ncell:C10:v:1:b::1::2:l:6:f:2:cf:3\ncell:D10:vtc:nd:41275:1/1/2013:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E10:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F10:t:Online Advertising:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G10:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H10:t:Keywords Purchase:b:2:1::2:l:6:f:2:cf:2\ncell:A11:b::2::\ncell:B11:t:Tech Crunch Banner:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C11:v:2:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D11:vtc:nd:41306:2/1/13:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E11:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F11:t:Online Advertising:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G11:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H11:t:Banner Advertising:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A12:b::2::\ncell:B12:t:Sales Force Solution Purchase:b::1::2:l:6:f:2:cf:2\ncell:C12:v:1:b::1::2:l:6:f:2:cf:3\ncell:D12:vtc:nd:41324:2/19/13:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E12:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F12:t:Sales :b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G12:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H12:t:CRM,Sales Management Team:b::1::2:l:6:f:2:cf:2\ncell:A13:b::2::\ncell:B13:t:Events:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C13:v:1:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D13:vtc:nd:41356:3/23/2013:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E13:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F13:t:Direct Marketing:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G13:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H13:t:Festival and Promotional Events:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A14:b::2::\ncell:B14:b::1::2:l:6:f:2:cf:2\ncell:C14:b::1::2:l:6:f:2:cf:3\ncell:D14:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E14:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F14:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G14:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H14:b::1::2:l:6:f:2:cf:2\ncell:A15:b::2::\ncell:B15:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C15:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D15:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E15:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F15:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G15:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H15:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A16:b::2::\ncell:B16:b::1::2:l:6:f:2:cf:2\ncell:C16:b::1::2:l:6:f:2:cf:3\ncell:D16:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E16:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F16:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G16:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H16:b::1::2:l:6:f:2:cf:2\ncell:A17:b::2::\ncell:B17:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C17:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D17:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E17:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F17:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G17:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H17:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A18:b::2::\ncell:B18:b::1::2:l:6:f:2:cf:2\ncell:C18:b::1::2:l:6:f:2:cf:3\ncell:D18:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E18:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F18:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G18:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H18:b::1::2:l:6:f:2:cf:2\ncell:A19:b::2::\ncell:B19:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C19:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D19:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E19:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F19:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G19:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H19:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A20:b::2::\ncell:B20:b::1::2:l:6:f:2:cf:2\ncell:C20:b::1::2:l:6:f:2:cf:3\ncell:D20:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E20:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F20:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G20:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H20:b::1::2:l:6:f:2:cf:2\ncell:A21:b::2::\ncell:B21:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C21:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D21:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E21:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F21:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G21:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H21:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A22:b::2::\ncell:B22:b::1::2:l:6:f:2:cf:2\ncell:C22:b::1::2:l:6:f:2:cf:3\ncell:D22:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E22:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F22:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G22:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H22:b::1::2:l:6:f:2:cf:2\ncell:A23:b::2::\ncell:B23:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C23:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D23:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E23:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F23:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G23:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H23:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A24:b::2::\ncell:B24:b::1::2:l:6:f:2:cf:2\ncell:C24:b::1::2:l:6:f:2:cf:3\ncell:D24:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E24:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F24:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G24:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H24:b::1::2:l:6:f:2:cf:2\ncell:A25:b::2::\ncell:B25:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C25:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D25:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E25:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F25:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G25:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H25:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A26:b::2::\ncell:B26:b::1::2:l:6:f:2:cf:2\ncell:C26:b::1::2:l:6:f:2:cf:3\ncell:D26:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E26:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F26:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G26:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H26:b::1::2:l:6:f:2:cf:2\ncell:A27:b::2::\ncell:B27:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C27:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D27:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E27:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F27:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G27:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H27:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A28:b::2::\ncell:B28:b::1::2:l:6:f:2:cf:2\ncell:C28:b::1::2:l:6:f:2:cf:3\ncell:D28:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E28:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F28:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G28:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H28:b::1::2:l:6:f:2:cf:2\ncell:A29:b::2::\ncell:B29:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C29:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D29:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E29:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F29:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G29:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H29:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A30:b::2::\ncell:B30:b::1::2:l:6:f:2:cf:2\ncell:C30:b::1::2:l:6:f:2:cf:3\ncell:D30:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E30:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F30:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G30:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H30:b::1::2:l:6:f:2:cf:2\ncell:A31:b::2::\ncell:B31:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C31:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D31:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E31:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F31:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G31:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H31:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A32:b::2::\ncell:B32:b::1::2:l:6:f:2:cf:2\ncell:C32:b::1::2:l:6:f:2:cf:3\ncell:D32:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E32:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F32:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G32:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H32:b::1::2:l:6:f:2:cf:2\ncell:A33:b::2::\ncell:B33:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C33:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D33:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E33:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F33:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G33:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H33:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A34:b::2::\ncell:B34:b::1::2:l:6:f:2:cf:2\ncell:C34:b::1::2:l:6:f:2:cf:3\ncell:D34:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E34:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F34:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G34:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H34:b::1::2:l:6:f:2:cf:2\ncell:A35:b::2::\ncell:B35:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C35:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D35:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E35:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F35:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G35:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H35:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A36:b::2::\ncell:B36:b::1::2:l:6:f:2:cf:2\ncell:C36:b::1::2:l:6:f:2:cf:3\ncell:D36:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E36:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F36:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G36:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H36:b::1::2:l:6:f:2:cf:2\ncell:A37:b::2::\ncell:B37:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C37:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D37:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E37:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F37:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G37:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H37:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A38:b::2::\ncell:B38:b::1::2:l:6:f:2:cf:2\ncell:C38:b::1::2:l:6:f:2:cf:3\ncell:D38:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E38:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F38:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G38:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H38:b::1::2:l:6:f:2:cf:2\ncell:A39:b::2::\ncell:B39:b::1::2:l:6:f:2:bg:2:cf:2\ncell:C39:b::1::2:l:6:f:2:bg:2:cf:3\ncell:D39:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E39:b::1::2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F39:b::1::2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G39:b::1::2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H39:b::1::2:l:6:f:2:bg:2:cf:2\ncell:A40:b::2::\ncell:B40:b::1::2:l:6:f:2:cf:2\ncell:C40:b::1::2:l:6:f:2:cf:3\ncell:D40:b::1::2:l:6:f:2:cf:3:ntvf:2:colspan:2\ncell:E40:b::1::2:l:6:f:2:cf:2:ntvf:2\ncell:F40:b::1::2:l:6:f:2:cf:2:colspan:2\ncell:G40:b::1::2:l:6:f:2:cf:3:ntvf:1\ncell:H40:b::1::2:l:6:f:2:cf:2\ncell:A41:b::2::\ncell:B41:b::1:2:2:l:6:f:2:bg:2:cf:2\ncell:C41:b::1:2:2:l:6:f:2:bg:2:cf:3\ncell:D41:b::1:2:2:l:6:f:2:bg:2:cf:3:ntvf:2:colspan:2\ncell:E41:b::1:2:2:l:6:f:2:bg:2:cf:2:ntvf:2\ncell:F41:b::1:2:2:l:6:f:2:bg:2:cf:2:colspan:2\ncell:G41:b::1:2:2:l:6:f:2:bg:2:cf:3:ntvf:1\ncell:H41:b::1:2:2:l:6:f:2:bg:2:cf:2\ncol:A:w:10\ncol:B:w:120\ncol:C:w:41\ncol:D:w:40\ncol:E:w:28\ncol:F:w:39\ncol:G:w:46\ncol:H:w:192\nsheet:c:8:r:41:needsrecalc:yes\nborder:1:1px solid rgb(0, 0, 0)\nborder:2:1px solid rgb(0,0,0)\nborder:3:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal bold 12pt Arial\nfont:2:normal normal 11pt arial,helvetica,sans-serif\nfont:3:normal normal 18pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 2px 4px 2px;vertical-align:bottom;\nlayout:3:padding:4px 4px 4px 4px;vertical-align:bottom;\nlayout:4:padding:4px 8px 4px *;vertical-align:bottom;\nlayout:5:padding:6px * 6px *;vertical-align:middle;\nlayout:6:padding:6px 4px 6px 4px;vertical-align:bottom;\nvalueformat:1:#,##0.00\nvalueformat:2:m/d/yy\nvalueformat:3:text-html\n"},"name":"sheet5","hidden":"0"},"sheet4":{"sheetstr":{"savestr":"version:1.5\ncell:B1:tvf:2:ntvf:2\ncell:B3:vtf:t:Business Name:IF(SHEET5!b4=\"\", \"\", SHEET5!b4):b:2:2:2:2:l:1:f:1:cf:1:colspan:2\ncell:C3:b:2:2:2:2:l:1:f:1\ncell:D3:vtf:t:Aspiring Investments:IF(SHEET5!c4=\"\", \"\", SHEET5!c4):b:2:2:2:2:l:1:f:1:c:1:cf:2:colspan:3\ncell:E3:l:1:f:1\ncell:F3:l:1:f:1\ncell:G3:l:1:f:1\ncell:H3:l:1:f:1\ncell:B4:vtf:t:Budget Name:IF(SHEET5!b5=\"\", \"\", SHEET5!b5):b:2:2:2:2:l:1:f:1:bg:3:cf:1:colspan:2\ncell:C4:b:2:2:2:2:l:1:f:1:bg:3\ncell:D4:vtf:t:Sales Budget:IF(SHEET5!c5=\"\", \"\", SHEET5!c5):b:2:2:2:2:l:1:f:1:c:1:bg:3:cf:2:colspan:3\ncell:E4:l:1:f:1\ncell:F4:l:1:f:1\ncell:G4:l:1:f:1\ncell:H4:l:1:f:1\ncell:B5:vtf:t:Budget Description:IF(SHEET5!b6=\"\", \"\", SHEET5!b6):b:2:2:2:2:l:1:f:1:cf:1:colspan:2\ncell:C5:b:2:2:2:2:l:1:f:1\ncell:D5:vtf:t:Festive Season Budget :IF(SHEET5!c6=\"\", \"\", SHEET5!c6):b:2:2:2:2:l:1:f:1:c:1:cf:2:colspan:3\ncell:E5:l:1:f:1\ncell:F5:l:1:f:1\ncell:G5:l:1:f:1\ncell:H5:l:1:f:1\ncell:B6:vtf:t:Maintainer:IF(SHEET5!b7=\"\", \"\", SHEET5!b7):b:2:2:2:2:l:1:f:1:bg:3:cf:1:colspan:2\ncell:C6:b:2:2:2:2:l:1:f:1:bg:3\ncell:D6:vtf:t:Dan Bender:IF(SHEET5!c7=\"\", \"\", SHEET5!c7):b:2:2:2:2:l:1:f:1:bg:3:cf:2:colspan:3\ncell:E6:l:1:f:1\ncell:F6:l:1:f:1\ncell:G6:l:1:f:1\ncell:H6:l:1:f:1\ncell:B7:l:1:f:1:colspan:2\ncell:C7:l:1:f:1\ncell:D7:l:1:f:1:colspan:3\ncell:E7:l:1:f:1\ncell:F7:l:1:f:1\ncell:G7:l:1:f:1\ncell:H7:l:1:f:1\ncell:A8:b::3::\ncell:B8:vtf:t:Payee:IF(SHEET5!b9=\"\", \"\", SHEET5!b9):b:::2:3:l:1:f:1:c:4:bg:2:cf:1:colspan:2\ncell:C8:t:Num:b:::2:3:l:1:f:1:c:4:bg:2:cf:1\ncell:D8:t:Billed Amount:b:::2:3:l:1:f:1:c:4:bg:2:cf:1\ncell:E8:t:Due Date:b:::2:3:l:1:f:1:c:4:bg:2:cf:1\ncell:F8:t:Paid:b:::2:3:l:1:f:1:c:4:bg:2:cf:1\ncell:G8:t:Date Paid:b:::2:3:l:1:f:1:c:4:bg:2:cf:1:ntvf:3\ncell:H8:t:Amount Paid:b:::2:3:l:1:f:1:c:4:bg:2:cf:1\ncell:A9:b::2::\ncell:B9:vtf:t:Google AdWords:IF(SHEET5!b10=\"\", \"\", SHEET5!b10):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C9:b::1::2:l:1:f:1:cf:2\ncell:D9:v:200:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E9:vtc:nd:41306:2/1/13:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F9:t:yes:b::1::2:l:1:f:1:cf:3\ncell:G9:vtc:nd:41314:2/9/13:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H9:v:200:b:2:2::2:l:1:f:1:ntvf:1\ncell:A10:b::2::\ncell:B10:vtf:t:Tech Crunch Banner:IF(SHEET5!b11=\"\", \"\", SHEET5!b11):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C10:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D10:v:1000:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E10:vtc:nd:41315:2/10/13:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F10:t:yes:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G10:vtc:nd:41321:2/16/13:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H10:v:1000:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A11:b::2::\ncell:B11:vtf:t:Sales Force Solution Purchase:IF(SHEET5!B12=\"\", \"\", SHEET5!B12):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C11:b::1::2:l:1:f:1:cf:2\ncell:D11:v:2000:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E11:vtc:nd:41341:3/8/13:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F11:t:yes:b::1::2:l:1:f:1:cf:3\ncell:G11:vtc:nd:41368:4/4/13:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H11:v:2000:b::2::2:l:1:f:1:ntvf:1\ncell:A12:b::2::\ncell:B12:vtf:t:Events:IF(SHEET5!B13=\"\", \"\", SHEET5!B13):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C12:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D12:v:10000:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E12:vtc:nd:41394:4/30/2013:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F12:t:no:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G12:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H12:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A13:b::2::\ncell:B13:vtf:t::IF(SHEET5!B14=\"\", \"\", SHEET5!B14):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C13:b::1::2:l:1:f:1:cf:2\ncell:D13:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E13:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F13:b::1::2:l:1:f:1:cf:3\ncell:G13:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H13:b::2::2:l:1:f:1:ntvf:1\ncell:A14:b::2::\ncell:B14:vtf:t::IF(SHEET5!B15=\"\", \"\", SHEET5!B15):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C14:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D14:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E14:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F14:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G14:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H14:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A15:b::2::\ncell:B15:vtf:t::IF(SHEET5!B16=\"\", \"\", SHEET5!B16):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C15:b::1::2:l:1:f:1:cf:2\ncell:D15:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E15:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F15:b::1::2:l:1:f:1:cf:3\ncell:G15:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H15:b::2::2:l:1:f:1:ntvf:1\ncell:A16:b::2::\ncell:B16:vtf:t::IF(SHEET5!B17=\"\", \"\", SHEET5!B17):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C16:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D16:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E16:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F16:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G16:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H16:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A17:b::2::\ncell:B17:vtf:t::IF(SHEET5!B18=\"\", \"\", SHEET5!B18):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C17:b::1::2:l:1:f:1:cf:2\ncell:D17:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E17:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F17:b::1::2:l:1:f:1:cf:3\ncell:G17:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H17:b::2::2:l:1:f:1:ntvf:1\ncell:A18:b::2::\ncell:B18:vtf:t::IF(SHEET5!B19=\"\", \"\", SHEET5!B19):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C18:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D18:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E18:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F18:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G18:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H18:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A19:b::2::\ncell:B19:vtf:t::IF(SHEET5!B20=\"\", \"\", SHEET5!B20):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C19:b::1::2:l:1:f:1:cf:2\ncell:D19:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E19:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F19:b::1::2:l:1:f:1:cf:3\ncell:G19:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H19:b::2::2:l:1:f:1:ntvf:1\ncell:A20:b::2::\ncell:B20:vtf:t::IF(SHEET5!B21=\"\", \"\", SHEET5!B21):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C20:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D20:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E20:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F20:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G20:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H20:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A21:b::2::\ncell:B21:vtf:t::IF(SHEET5!B22=\"\", \"\", SHEET5!B22):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C21:b::1::2:l:1:f:1:cf:2\ncell:D21:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E21:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F21:b::1::2:l:1:f:1:cf:3\ncell:G21:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H21:b::2::2:l:1:f:1:ntvf:1\ncell:A22:b::2::\ncell:B22:vtf:t::IF(SHEET5!B23=\"\", \"\", SHEET5!B23):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C22:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D22:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E22:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F22:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G22:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H22:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A23:b::2::\ncell:B23:vtf:t::IF(SHEET5!B24=\"\", \"\", SHEET5!B24):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C23:b::1::2:l:1:f:1:cf:2\ncell:D23:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E23:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F23:b::1::2:l:1:f:1:cf:3\ncell:G23:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H23:b::2::2:l:1:f:1:ntvf:1\ncell:A24:b::2::\ncell:B24:vtf:t::IF(SHEET5!B25=\"\", \"\", SHEET5!B25):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C24:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D24:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E24:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F24:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G24:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H24:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A25:b::2::\ncell:B25:vtf:t::IF(SHEET5!B26=\"\", \"\", SHEET5!B26):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C25:b::1::2:l:1:f:1:cf:2\ncell:D25:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E25:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F25:b::1::2:l:1:f:1:cf:3\ncell:G25:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H25:b::2::2:l:1:f:1:ntvf:1\ncell:A26:b::2::\ncell:B26:vtf:t::IF(SHEET5!B27=\"\", \"\", SHEET5!B27):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C26:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D26:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E26:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F26:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G26:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H26:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A27:b::2::\ncell:B27:vtf:t::IF(SHEET5!B28=\"\", \"\", SHEET5!B28):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C27:b::1::2:l:1:f:1:cf:2\ncell:D27:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E27:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F27:b::1::2:l:1:f:1:cf:3\ncell:G27:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H27:b::2::2:l:1:f:1:ntvf:1\ncell:A28:b::2::\ncell:B28:vtf:t::IF(SHEET5!B29=\"\", \"\", SHEET5!B29):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C28:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D28:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E28:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F28:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G28:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H28:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A29:b::2::\ncell:B29:vtf:t::IF(SHEET5!B30=\"\", \"\", SHEET5!B30):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C29:b::1::2:l:1:f:1:cf:2\ncell:D29:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E29:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F29:b::1::2:l:1:f:1:cf:3\ncell:G29:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H29:b::2::2:l:1:f:1:ntvf:1\ncell:A30:b::2::\ncell:B30:vtf:t::IF(SHEET5!B31=\"\", \"\", SHEET5!B31):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C30:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D30:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E30:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F30:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G30:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H30:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A31:b::2::\ncell:B31:vtf:t::IF(SHEET5!B32=\"\", \"\", SHEET5!B32):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C31:b::1::2:l:1:f:1:cf:2\ncell:D31:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E31:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F31:b::1::2:l:1:f:1:cf:3\ncell:G31:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H31:b::2::2:l:1:f:1:ntvf:1\ncell:A32:b::2::\ncell:B32:vtf:t::IF(SHEET5!B33=\"\", \"\", SHEET5!B33):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C32:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D32:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E32:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F32:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G32:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H32:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A33:b::2::\ncell:B33:vtf:t::IF(SHEET5!B34=\"\", \"\", SHEET5!B34):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C33:b::1::2:l:1:f:1:cf:2\ncell:D33:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E33:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F33:b::1::2:l:1:f:1:cf:3\ncell:G33:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H33:b::2::2:l:1:f:1:ntvf:1\ncell:A34:b::2::\ncell:B34:vtf:t::IF(SHEET5!B35=\"\", \"\", SHEET5!B35):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C34:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D34:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E34:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F34:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G34:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H34:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A35:b::2::\ncell:B35:vtf:t::IF(SHEET5!B36=\"\", \"\", SHEET5!B36):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C35:b::1::2:l:1:f:1:cf:2\ncell:D35:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E35:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F35:b::1::2:l:1:f:1:cf:3\ncell:G35:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H35:b::2::2:l:1:f:1:ntvf:1\ncell:A36:b::2::\ncell:B36:vtf:t::IF(SHEET5!B37=\"\", \"\", SHEET5!B37):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C36:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D36:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E36:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F36:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G36:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H36:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A37:b::2::\ncell:B37:vtf:t::IF(SHEET5!B38=\"\", \"\", SHEET5!B38):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C37:b::1::2:l:1:f:1:cf:2\ncell:D37:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E37:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F37:b::1::2:l:1:f:1:cf:3\ncell:G37:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H37:b::2::2:l:1:f:1:ntvf:1\ncell:A38:b::2::\ncell:B38:vtf:t::IF(SHEET5!B39=\"\", \"\", SHEET5!B39):b::1::2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C38:b::1::2:l:1:f:1:bg:3:cf:2\ncell:D38:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E38:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F38:b::1::2:l:1:f:1:bg:3:cf:3\ncell:G38:b::1::2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H38:b::2::2:l:1:f:1:bg:3:ntvf:1\ncell:A39:b::2::\ncell:B39:vtf:t::IF(SHEET5!B40=\"\", \"\", SHEET5!B40):b::1::2:l:1:f:1:cf:2:colspan:2\ncell:C39:b::1::2:l:1:f:1:cf:2\ncell:D39:b::1::2:l:1:f:1:cf:3:ntvf:1\ncell:E39:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:F39:b::1::2:l:1:f:1:cf:3\ncell:G39:b::1::2:l:1:f:1:cf:3:ntvf:3\ncell:H39:b::2::2:l:1:f:1:ntvf:1\ncell:A40:b::2::\ncell:B40:vtf:t::IF(SHEET5!B41=\"\", \"\", SHEET5!B41):b::1:2:2:l:1:f:1:bg:3:cf:2:colspan:2\ncell:C40:b::1:2:2:l:1:f:1:bg:3:cf:2\ncell:D40:b::1:2:2:l:1:f:1:bg:3:cf:3:ntvf:1\ncell:E40:b::1:2:2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:F40:b::1:2:2:l:1:f:1:bg:3:cf:3\ncell:G40:b::1:2:2:l:1:f:1:bg:3:cf:3:ntvf:3\ncell:H40:b::2:2:2:l:1:f:1:bg:3:ntvf:1\ncell:B41:b:2::::l:1:f:1\ncell:C41:b:2::::l:1:f:1\ncell:D41:l:1:f:1\ncell:E41:t:Total:b:2:2:2:2:l:1:f:1:c:4:bg:2:cf:1:colspan:3\ncell:F41:b:2:2:2:2:l:1:f:1:c:4:bg:2\ncell:G41:vtf:nd:124003:SUM(G9\\cG40):b:2:2:2:2:l:1:f:1:c:4:bg:2\ncell:H41:vtf:n:3200:SUM(H9\\cH40):b:2:2:2:2:l:1:f:1:c:4:bg:2\ncol:A:w:10\ncol:B:w:56\ncol:C:w:82\ncol:D:w:90\ncol:E:w:67\ncol:F:w:45\ncol:G:w:60\ncol:H:w:90\nsheet:c:8:r:41:needsrecalc:yes\nborder:1:1px solid rgb(0, 0, 0)\nborder:2:1px solid rgb(0,0,0)\nborder:3:1px solid rgb(255, 255, 255)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:normal normal 11pt arial,helvetica,sans-serif\nlayout:1:padding:4px 3px 4px 3px;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\n"},"name":"sheet3","hidden":"0"}},"EditableCells":{"allow":true,"cells":{"sheet4!B2":true,"sheet4!B4":true,"sheet4!B5":true,"sheet4!B6":true,"sheet4!B7":true,"sheet4!C4":true,"sheet4!C5":true,"sheet4!C6":true,"sheet4!C7":true,"sheet4!B9":true,"sheet4!B10":true,"sheet4!B11":true,"sheet4!B12":true,"sheet4!B13":true,"sheet4!B14":true,"sheet4!B15":true,"sheet4!B16":true,"sheet4!B17":true,"sheet4!B18":true,"sheet4!B19":true,"sheet4!B20":true,"sheet4!B21":true,"sheet4!B22":true,"sheet4!B23":true,"sheet4!B24":true,"sheet4!B25":true,"sheet4!B26":true,"sheet4!B27":true,"sheet4!B28":true,"sheet4!B29":true,"sheet4!B30":true,"sheet4!B31":true,"sheet4!B32":true,"sheet4!B33":true,"sheet4!B34":true,"sheet4!B35":true,"sheet4!B36":true,"sheet4!B37":true,"sheet4!B38":true,"sheet4!B39":true,"sheet4!B40":true,"sheet4!B41":true,"sheet4!C9":true,"sheet4!C10":true,"sheet4!C11":true,"sheet4!C12":true,"sheet4!C13":true,"sheet4!C14":true,"sheet4!C15":true,"sheet4!C16":true,"sheet4!C17":true,"sheet4!C18":true,"sheet4!C19":true,"sheet4!C20":true,"sheet4!C21":true,"sheet4!C22":true,"sheet4!C23":true,"sheet4!C24":true,"sheet4!C25":true,"sheet4!C26":true,"sheet4!C27":true,"sheet4!C28":true,"sheet4!C29":true,"sheet4!C30":true,"sheet4!C31":true,"sheet4!C32":true,"sheet4!C33":true,"sheet4!C34":true,"sheet4!C35":true,"sheet4!C36":true,"sheet4!C37":true,"sheet4!C38":true,"sheet4!C39":true,"sheet4!C40":true,"sheet4!C41":true,"sheet4!D9":true,"sheet4!D10":true,"sheet4!D11":true,"sheet4!D12":true,"sheet4!D13":true,"sheet4!D14":true,"sheet4!D15":true,"sheet4!D16":true,"sheet4!D17":true,"sheet4!D18":true,"sheet4!D19":true,"sheet4!D20":true,"sheet4!D21":true,"sheet4!D22":true,"sheet4!D23":true,"sheet4!D24":true,"sheet4!D25":true,"sheet4!D26":true,"sheet4!D27":true,"sheet4!D28":true,"sheet4!D29":true,"sheet4!D30":true,"sheet4!D31":true,"sheet4!D32":true,"sheet4!D33":true,"sheet4!D34":true,"sheet4!D35":true,"sheet4!D36":true,"sheet4!D37":true,"sheet4!D38":true,"sheet4!D39":true,"sheet4!D40":true,"sheet4!D41":true,"sheet4!F9":true,"sheet4!F10":true,"sheet4!F11":true,"sheet4!F12":true,"sheet4!F13":true,"sheet4!F14":true,"sheet4!F15":true,"sheet4!F16":true,"sheet4!F17":true,"sheet4!F18":true,"sheet4!F19":true,"sheet4!F20":true,"sheet4!F21":true,"sheet4!F22":true,"sheet4!F23":true,"sheet4!F24":true,"sheet4!F25":true,"sheet4!F26":true,"sheet4!F27":true,"sheet4!F28":true,"sheet4!F29":true,"sheet4!F30":true,"sheet4!F31":true,"sheet4!F32":true,"sheet4!F33":true,"sheet4!F34":true,"sheet4!F35":true,"sheet4!F36":true,"sheet4!F37":true,"sheet4!F38":true,"sheet4!F39":true,"sheet4!F40":true,"sheet4!F41":true,"sheet4!H9":true,"sheet4!H10":true,"sheet4!H11":true,"sheet4!H12":true,"sheet4!H13":true,"sheet4!H14":true,"sheet4!H15":true,"sheet4!H16":true,"sheet4!H17":true,"sheet4!H18":true,"sheet4!H19":true,"sheet4!H20":true,"sheet4!H21":true,"sheet4!H22":true,"sheet4!H23":true,"sheet4!H24":true,"sheet4!H25":true,"sheet4!H26":true,"sheet4!H27":true,"sheet4!H28":true,"sheet4!H29":true,"sheet4!H30":true,"sheet4!H31":true,"sheet4!H32":true,"sheet4!H33":true,"sheet4!H34":true,"sheet4!H35":true,"sheet4!H36":true,"sheet4!H37":true,"sheet4!H38":true,"sheet4!H39":true,"sheet4!H40":true,"sheet4!H41":true,"Expenses!D8":true,"Expenses!D9":true,"Expenses!D10":true,"Expenses!D11":true,"Expenses!D12":true,"Expenses!D13":true,"Expenses!D14":true,"Expenses!D15":true,"Expenses!D16":true,"Expenses!D17":true,"Expenses!D18":true,"Expenses!D19":true,"Expenses!D20":true,"Expenses!D21":true,"Expenses!D22":true,"Expenses!D23":true,"Expenses!D24":true,"Expenses!D25":true,"Expenses!D26":true,"Expenses!D27":true,"Expenses!D28":true,"Expenses!D29":true,"Expenses!D30":true,"Expenses!D31":true,"Expenses!D32":true,"Expenses!D33":true,"Expenses!D34":true,"Expenses!D35":true,"Expenses!D36":true,"Expenses!D37":true,"Expenses!D38":true,"Expenses!D39":true,"Expenses!D40":true,"Expenses!E8":true,"Expenses!E9":true,"Expenses!E10":true,"Expenses!E11":true,"Expenses!E12":true,"Expenses!E13":true,"Expenses!E14":true,"Expenses!E15":true,"Expenses!E16":true,"Expenses!E17":true,"Expenses!E18":true,"Expenses!E19":true,"Expenses!E20":true,"Expenses!E21":true,"Expenses!E22":true,"Expenses!E23":true,"Expenses!E24":true,"Expenses!E25":true,"Expenses!E26":true,"Expenses!E27":true,"Expenses!E28":true,"Expenses!E29":true,"Expenses!E30":true,"Expenses!E31":true,"Expenses!E32":true,"Expenses!E33":true,"Expenses!E34":true,"Expenses!E35":true,"Expenses!E36":true,"Expenses!E37":true,"Expenses!E38":true,"Expenses!E39":true,"Expenses!E40":true,"Expenses!F8":true,"Expenses!F9":true,"Expenses!F10":true,"Expenses!F11":true,"Expenses!F12":true,"Expenses!F13":true,"Expenses!F14":true,"Expenses!F15":true,"Expenses!F16":true,"Expenses!F17":true,"Expenses!F18":true,"Expenses!F19":true,"Expenses!F20":true,"Expenses!F21":true,"Expenses!F22":true,"Expenses!F23":true,"Expenses!F24":true,"Expenses!F25":true,"Expenses!F26":true,"Expenses!F27":true,"Expenses!F28":true,"Expenses!F29":true,"Expenses!F30":true,"Expenses!F31":true,"Expenses!F32":true,"Expenses!F33":true,"Expenses!F34":true,"Expenses!F35":true,"Expenses!F36":true,"Expenses!F37":true,"Expenses!F38":true,"Expenses!F39":true,"Expenses!F40":true,"Expenses!G8":true,"Expenses!G9":true,"Expenses!G10":true,"Expenses!G11":true,"Expenses!G12":true,"Expenses!G13":true,"Expenses!G14":true,"Expenses!G15":true,"Expenses!G16":true,"Expenses!G17":true,"Expenses!G18":true,"Expenses!G19":true,"Expenses!G20":true,"Expenses!G21":true,"Expenses!G22":true,"Expenses!G23":true,"Expenses!G24":true,"Expenses!G25":true,"Expenses!G26":true,"Expenses!G27":true,"Expenses!G28":true,"Expenses!G29":true,"Expenses!G30":true,"Expenses!G31":true,"Expenses!G32":true,"Expenses!G33":true,"Expenses!G34":true,"Expenses!G35":true,"Expenses!G36":true,"Expenses!G37":true,"Expenses!G38":true,"Expenses!G39":true,"Expenses!G40":true,"Expenses!H8":true,"Expenses!H9":true,"Expenses!H10":true,"Expenses!H11":true,"Expenses!H12":true,"Expenses!H13":true,"Expenses!H14":true,"Expenses!H15":true,"Expenses!H16":true,"Expenses!H17":true,"Expenses!H18":true,"Expenses!H19":true,"Expenses!H20":true,"Expenses!H21":true,"Expenses!H22":true,"Expenses!H23":true,"Expenses!H24":true,"Expenses!H25":true,"Expenses!H26":true,"Expenses!H27":true,"Expenses!H28":true,"Expenses!H29":true,"Expenses!H30":true,"Expenses!H31":true,"Expenses!H32":true,"Expenses!H33":true,"Expenses!H34":true,"Expenses!H35":true,"Expenses!H36":true,"Expenses!H37":true,"Expenses!H38":true,"Expenses!H39":true,"Expenses!H40":true,"sheet5!B2":true,"sheet5!B4":true,"sheet5!B5":true,"sheet5!B6":true,"sheet5!B7":true,"sheet5!C4":true,"sheet5!C5":true,"sheet5!C6":true,"sheet5!C7":true,"sheet5!B9":true,"sheet5!B10":true,"sheet5!B11":true,"sheet5!B12":true,"sheet5!B13":true,"sheet5!B14":true,"sheet5!B15":true,"sheet5!B16":true,"sheet5!B17":true,"sheet5!B18":true,"sheet5!B19":true,"sheet5!B20":true,"sheet5!B21":true,"sheet5!B22":true,"sheet5!B23":true,"sheet5!B24":true,"sheet5!B25":true,"sheet5!B26":true,"sheet5!B27":true,"sheet5!B28":true,"sheet5!B29":true,"sheet5!B30":true,"sheet5!B31":true,"sheet5!B32":true,"sheet5!B33":true,"sheet5!B34":true,"sheet5!B35":true,"sheet5!B36":true,"sheet5!B37":true,"sheet5!B38":true,"sheet5!B39":true,"sheet5!B40":true,"sheet5!B41":true,"sheet5!C9":true,"sheet5!C10":true,"sheet5!C11":true,"sheet5!C12":true,"sheet5!C13":true,"sheet5!C14":true,"sheet5!C15":true,"sheet5!C16":true,"sheet5!C17":true,"sheet5!C18":true,"sheet5!C19":true,"sheet5!C20":true,"sheet5!C21":true,"sheet5!C22":true,"sheet5!C23":true,"sheet5!C24":true,"sheet5!C25":true,"sheet5!C26":true,"sheet5!C27":true,"sheet5!C28":true,"sheet5!C29":true,"sheet5!C30":true,"sheet5!C31":true,"sheet5!C32":true,"sheet5!C33":true,"sheet5!C34":true,"sheet5!C35":true,"sheet5!C36":true,"sheet5!C37":true,"sheet5!C38":true,"sheet5!C39":true,"sheet5!C40":true,"sheet5!C41":true,"sheet5!D9":true,"sheet5!D10":true,"sheet5!D11":true,"sheet5!D12":true,"sheet5!D13":true,"sheet5!D14":true,"sheet5!D15":true,"sheet5!D16":true,"sheet5!D17":true,"sheet5!D18":true,"sheet5!D19":true,"sheet5!D20":true,"sheet5!D21":true,"sheet5!D22":true,"sheet5!D23":true,"sheet5!D24":true,"sheet5!D25":true,"sheet5!D26":true,"sheet5!D27":true,"sheet5!D28":true,"sheet5!D29":true,"sheet5!D30":true,"sheet5!D31":true,"sheet5!D32":true,"sheet5!D33":true,"sheet5!D34":true,"sheet5!D35":true,"sheet5!D36":true,"sheet5!D37":true,"sheet5!D38":true,"sheet5!D39":true,"sheet5!D40":true,"sheet5!D41":true,"sheet5!F9":true,"sheet5!F10":true,"sheet5!F11":true,"sheet5!F12":true,"sheet5!F13":true,"sheet5!F14":true,"sheet5!F15":true,"sheet5!F16":true,"sheet5!F17":true,"sheet5!F18":true,"sheet5!F19":true,"sheet5!F20":true,"sheet5!F21":true,"sheet5!F22":true,"sheet5!F23":true,"sheet5!F24":true,"sheet5!F25":true,"sheet5!F26":true,"sheet5!F27":true,"sheet5!F28":true,"sheet5!F29":true,"sheet5!F30":true,"sheet5!F31":true,"sheet5!F32":true,"sheet5!F33":true,"sheet5!F34":true,"sheet5!F35":true,"sheet5!F36":true,"sheet5!F37":true,"sheet5!F38":true,"sheet5!F39":true,"sheet5!F40":true,"sheet5!F41":true,"sheet5!H9":true,"sheet5!H10":true,"sheet5!H11":true,"sheet5!H12":true,"sheet5!H13":true,"sheet5!H14":true,"sheet5!H15":true,"sheet5!H16":true,"sheet5!H17":true,"sheet5!H18":true,"sheet5!H19":true,"sheet5!H20":true,"sheet5!H21":true,"sheet5!H22":true,"sheet5!H23":true,"sheet5!H24":true,"sheet5!H25":true,"sheet5!H26":true,"sheet5!H27":true,"sheet5!H28":true,"sheet5!H29":true,"sheet5!H30":true,"sheet5!H31":true,"sheet5!H32":true,"sheet5!H33":true,"sheet5!H34":true,"sheet5!H35":true,"sheet5!H36":true,"sheet5!H37":true,"sheet5!H38":true,"sheet5!H39":true,"sheet5!H40":true,"sheet5!H41":true,"sheet3!D8":true,"sheet3!D9":true,"sheet3!D10":true,"sheet3!D11":true,"sheet3!D12":true,"sheet3!D13":true,"sheet3!D14":true,"sheet3!D15":true,"sheet3!D16":true,"sheet3!D17":true,"sheet3!D18":true,"sheet3!D19":true,"sheet3!D20":true,"sheet3!D21":true,"sheet3!D22":true,"sheet3!D23":true,"sheet3!D24":true,"sheet3!D25":true,"sheet3!D26":true,"sheet3!D27":true,"sheet3!D28":true,"sheet3!D29":true,"sheet3!D30":true,"sheet3!D31":true,"sheet3!D32":true,"sheet3!D33":true,"sheet3!D34":true,"sheet3!D35":true,"sheet3!D36":true,"sheet3!D37":true,"sheet3!D38":true,"sheet3!D39":true,"sheet3!D40":true,"sheet3!E8":true,"sheet3!E9":true,"sheet3!E10":true,"sheet3!E11":true,"sheet3!E12":true,"sheet3!E13":true,"sheet3!E14":true,"sheet3!E15":true,"sheet3!E16":true,"sheet3!E17":true,"sheet3!E18":true,"sheet3!E19":true,"sheet3!E20":true,"sheet3!E21":true,"sheet3!E22":true,"sheet3!E23":true,"sheet3!E24":true,"sheet3!E25":true,"sheet3!E26":true,"sheet3!E27":true,"sheet3!E28":true,"sheet3!E29":true,"sheet3!E30":true,"sheet3!E31":true,"sheet3!E32":true,"sheet3!E33":true,"sheet3!E34":true,"sheet3!E35":true,"sheet3!E36":true,"sheet3!E37":true,"sheet3!E38":true,"sheet3!E39":true,"sheet3!E40":true,"sheet3!F8":true,"sheet3!F9":true,"sheet3!F10":true,"sheet3!F11":true,"sheet3!F12":true,"sheet3!F13":true,"sheet3!F14":true,"sheet3!F15":true,"sheet3!F16":true,"sheet3!F17":true,"sheet3!F18":true,"sheet3!F19":true,"sheet3!F20":true,"sheet3!F21":true,"sheet3!F22":true,"sheet3!F23":true,"sheet3!F24":true,"sheet3!F25":true,"sheet3!F26":true,"sheet3!F27":true,"sheet3!F28":true,"sheet3!F29":true,"sheet3!F30":true,"sheet3!F31":true,"sheet3!F32":true,"sheet3!F33":true,"sheet3!F34":true,"sheet3!F35":true,"sheet3!F36":true,"sheet3!F37":true,"sheet3!F38":true,"sheet3!F39":true,"sheet3!F40":true,"sheet3!G8":true,"sheet3!G9":true,"sheet3!G10":true,"sheet3!G11":true,"sheet3!G12":true,"sheet3!G13":true,"sheet3!G14":true,"sheet3!G15":true,"sheet3!G16":true,"sheet3!G17":true,"sheet3!G18":true,"sheet3!G19":true,"sheet3!G20":true,"sheet3!G21":true,"sheet3!G22":true,"sheet3!G23":true,"sheet3!G24":true,"sheet3!G25":true,"sheet3!G26":true,"sheet3!G27":true,"sheet3!G28":true,"sheet3!G29":true,"sheet3!G30":true,"sheet3!G31":true,"sheet3!G32":true,"sheet3!G33":true,"sheet3!G34":true,"sheet3!G35":true,"sheet3!G36":true,"sheet3!G37":true,"sheet3!G38":true,"sheet3!G39":true,"sheet3!G40":true,"sheet3!H8":true,"sheet3!H9":true,"sheet3!H10":true,"sheet3!H11":true,"sheet3!H12":true,"sheet3!H13":true,"sheet3!H14":true,"sheet3!H15":true,"sheet3!H16":true,"sheet3!H17":true,"sheet3!H18":true,"sheet3!H19":true,"sheet3!H20":true,"sheet3!H21":true,"sheet3!H22":true,"sheet3!H23":true,"sheet3!H24":true,"sheet3!H25":true,"sheet3!H26":true,"sheet3!H27":true,"sheet3!H28":true,"sheet3!H29":true,"sheet3!H30":true,"sheet3!H31":true,"sheet3!H32":true,"sheet3!H33":true,"sheet3!H34":true,"sheet3!H35":true,"sheet3!H36":true,"sheet3!H37":true,"sheet3!H38":true,"sheet3!H39":true,"sheet3!H40":true},"constraints":{}}} \ No newline at end of file diff --git a/Website/excelinterop/tmp/blank-sudoku-grid.xls b/Website/excelinterop/tmp/blank-sudoku-grid.xls deleted file mode 100644 index 0845b23..0000000 Binary files a/Website/excelinterop/tmp/blank-sudoku-grid.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/blood-sugar-chart.xls b/Website/excelinterop/tmp/blood-sugar-chart.xls deleted file mode 100644 index a8477ee..0000000 Binary files a/Website/excelinterop/tmp/blood-sugar-chart.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/bmi-chart.xls b/Website/excelinterop/tmp/bmi-chart.xls deleted file mode 100644 index 225e607..0000000 Binary files a/Website/excelinterop/tmp/bmi-chart.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/break-even-analysis_L-1.xls b/Website/excelinterop/tmp/break-even-analysis_L-1.xls deleted file mode 100644 index 0bb4d82..0000000 Binary files a/Website/excelinterop/tmp/break-even-analysis_L-1.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/break-even-analysis_L-2.xls b/Website/excelinterop/tmp/break-even-analysis_L-2.xls deleted file mode 100644 index 7de6e1d..0000000 Binary files a/Website/excelinterop/tmp/break-even-analysis_L-2.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/building.msc b/Website/excelinterop/tmp/building.msc deleted file mode 100644 index a8fe469..0000000 --- a/Website/excelinterop/tmp/building.msc +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":10,"currentid":"sheet1","currentname":"jul","sheetArr":{"sheet1":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:January:f:3:c:3:bg:1:cf:1:colspan:4\ncell:B3:f:4:bg:4:cf:1:colspan:4\ncell:B5:t:Chk:f:1:cf:1\ncell:C5:t:Date:f:1:cf:1:colspan:2\ncell:D5:f:1:cf:1\ncell:E5:t:Notes:f:1:cf:1\ncell:B6:b:::1::f:1\ncell:C6:b:::1::f:1\ncell:D6:b:::1::f:1\ncell:E6:b:::1::f:1\ncell:A7:b::1::\ncell:B7:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C7:t:Wed:b:1:1::1:f:1\ncell:D7:v:1:b:1:1::1:f:1\ncell:E7:b:1:1:1:1:f:1\ncell:F7:b::::1\ncell:A8:b::1::\ncell:B8:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C8:t:Thurs:b::1::1:f:1:bg:2\ncell:D8:v:2:b::1::1:f:1:bg:2\ncell:E8:b:1:1:1:1:f:1:bg:2\ncell:F8:b::::1\ncell:A9:b::1::\ncell:B9:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C9:t:Fri:b::1::1:f:1\ncell:D9:v:3:b::1::1:f:1\ncell:E9:b:1:1:1:1:f:1\ncell:F9:b::::1\ncell:A10:b::1::\ncell:B10:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C10:t:Sat:b::1::1:f:1:bg:2\ncell:D10:v:4:b::1::1:f:1:bg:2\ncell:E10:b:1:1:1:1:f:1:bg:2\ncell:F10:b::::1\ncell:A11:b::1::\ncell:B11:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C11:t:Sun:b::1::1:f:1\ncell:D11:v:5:b::1::1:f:1\ncell:E11:b:1:1:1:1:f:1\ncell:F11:b::::1\ncell:A12:b::1::\ncell:B12:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C12:t:Mon:b::1::1:f:1:bg:2\ncell:D12:v:6:b::1::1:f:1:bg:2\ncell:E12:b:1:1:1:1:f:1:bg:2\ncell:F12:b::::1\ncell:A13:b::1::\ncell:B13:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C13:t:Tue:b::1::1:f:1\ncell:D13:v:7:b::1::1:f:1\ncell:E13:b:1:1:1:1:f:1\ncell:F13:b::::1\ncell:A14:b::1::\ncell:B14:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C14:t:Wed:b::1::1:f:1:bg:2\ncell:D14:v:8:b::1::1:f:1:bg:2\ncell:E14:b:1:1:1:1:f:1:bg:2\ncell:F14:b::::1\ncell:A15:b::1::\ncell:B15:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C15:t:Thurs:b::1::1:f:1\ncell:D15:v:9:b::1::1:f:1\ncell:E15:b:1:1:1:1:f:1\ncell:F15:b::::1\ncell:A16:b::1::\ncell:B16:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C16:t:Fri:b::1::1:f:1:bg:2\ncell:D16:v:10:b::1::1:f:1:bg:2\ncell:E16:b:1:1:1:1:f:1:bg:2\ncell:F16:b::::1\ncell:A17:b::1::\ncell:B17:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C17:t:Sat:b::1::1:f:1\ncell:D17:v:11:b::1::1:f:1\ncell:E17:b:1:1:1:1:f:1\ncell:F17:b::::1\ncell:A18:b::1::\ncell:B18:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C18:t:Sun:b::1::1:f:1:bg:2\ncell:D18:v:12:b::1::1:f:1:bg:2\ncell:E18:b:1:1:1:1:f:1:bg:2\ncell:F18:b::::1\ncell:A19:b::1::\ncell:B19:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C19:t:Mon:b::1::1:f:1\ncell:D19:v:13:b::1::1:f:1\ncell:E19:b:1:1:1:1:f:1\ncell:F19:b::::1\ncell:A20:b::1::\ncell:B20:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C20:t:Tue:b::1::1:f:1:bg:2\ncell:D20:v:14:b::1::1:f:1:bg:2\ncell:E20:b:1:1:1:1:f:1:bg:2\ncell:F20:b::::1\ncell:A21:b::1::\ncell:B21:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C21:t:Wed:b::1::1:f:1\ncell:D21:v:15:b::1::1:f:1\ncell:E21:b:1:1:1:1:f:1\ncell:F21:b::::1\ncell:A22:b::1::\ncell:B22:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C22:t:Thurs:b::1::1:f:1:bg:2\ncell:D22:v:16:b::1::1:f:1:bg:2\ncell:E22:b:1:1:1:1:f:1:bg:2\ncell:F22:b::::1\ncell:A23:b::1::\ncell:B23:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C23:t:Fri:b::1::1:f:1\ncell:D23:v:17:b::1::1:f:1\ncell:E23:b:1:1:1:1:f:1\ncell:F23:b::::1\ncell:A24:b::1::\ncell:B24:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C24:t:Sat:b::1::1:f:1:bg:2\ncell:D24:v:18:b::1::1:f:1:bg:2\ncell:E24:b:1:1:1:1:f:1:bg:2\ncell:F24:b::::1\ncell:A25:b::1::\ncell:B25:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C25:t:Sun:b::1::1:f:1\ncell:D25:v:19:b::1::1:f:1\ncell:E25:b:1:1:1:1:f:1\ncell:F25:b::::1\ncell:A26:b::1::\ncell:B26:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C26:t:day:b::1::1:f:1:bg:2\ncell:D26:v:20:b::1::1:f:1:bg:2\ncell:E26:b:1:1:1:1:f:1:bg:2\ncell:F26:b::::1\ncell:A27:b::1::\ncell:B27:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C27:t:Tue:b::1::1:f:1\ncell:D27:v:21:b::1::1:f:1\ncell:E27:b:1:1:1:1:f:1\ncell:F27:b::::1\ncell:A28:b::1::\ncell:B28:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C28:t:Wed:b::1::1:f:1:bg:2\ncell:D28:v:22:b::1::1:f:1:bg:2\ncell:E28:b:1:1:1:1:f:1:bg:2\ncell:F28:b::::1\ncell:A29:b::1::\ncell:B29:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C29:t:Thurs:b::1::1:f:1\ncell:D29:v:23:b::1::1:f:1\ncell:E29:b:1:1:1:1:f:1\ncell:F29:b::::1\ncell:A30:b::1::\ncell:B30:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C30:t:Fri:b::1::1:f:1:bg:2\ncell:D30:v:24:b::1::1:f:1:bg:2\ncell:E30:b:1:1:1:1:f:1:bg:2\ncell:F30:b::::1\ncell:A31:b::1::\ncell:B31:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C31:t:Sat:b::1::1:f:1\ncell:D31:v:25:b::1::1:f:1\ncell:E31:b:1:1:1:1:f:1\ncell:F31:b::::1\ncell:A32:b::1::\ncell:B32:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C32:t:Sun:b::1::1:f:1:bg:2\ncell:D32:v:26:b::1::1:f:1:bg:2\ncell:E32:b:1:1:1:1:f:1:bg:2\ncell:F32:b::::1\ncell:A33:b::1::\ncell:B33:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C33:t:Mon:b::1::1:f:1\ncell:D33:v:27:b::1::1:f:1\ncell:E33:b:1:1:1:1:f:1\ncell:F33:b::::1\ncell:A34:b::1::\ncell:B34:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C34:t:Tue:b::1::1:f:1:bg:2\ncell:D34:v:28:b::1::1:f:1:bg:2\ncell:E34:b:1:1:1:1:f:1:bg:2\ncell:F34:b::::1\ncell:A35:b::1::\ncell:B35:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C35:t:Wed:b::1::1:f:1\ncell:D35:v:29:b::1::1:f:1\ncell:E35:b:1:1:1:1:f:1\ncell:F35:b::::1\ncell:A36:b::1::\ncell:B36:t:
    :b:1:1:1:1:f:1:bg:2:tvf:1\ncell:C36:t:Thurs:b::1::1:f:1:bg:2\ncell:D36:v:30:b::1::1:f:1:bg:2\ncell:E36:b:1:1:1:1:f:1:bg:2\ncell:F36:b::::1\ncell:A37:b::1::\ncell:B37:t:
    :b:1:1:1:1:f:1:tvf:1\ncell:C37:t:Fri:b::1:1:1:f:1\ncell:D37:v:31:b::1:1:1:f:1\ncell:E37:b:1:1:1:1:f:1\ncell:F37:b::::1\ncell:C38:b:1:::\ncol:A:w:13\ncol:B:w:40\ncol:C:w:46\ncol:D:w:35\ncol:E:w:107\nsheet:c:6:r:38:font:2:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(136,100,8)\ncolor:2:rgb(233,233,233)\ncolor:3:rgb(255, 255, 255)\ncolor:4:rgb(91,17,1)\nfont:1:* 10pt *\nfont:2:* 10pt arial,helvetica,sans-serif\nfont:3:* 14pt *\nfont:4:* 7pt *\nlayout:1:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:text-html\n"},"name":"jul","hidden":"0"},"sheet2":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Basic Information:f:3:c:3:bg:1:cf:1:colspan:2\ncell:B4:t:Owner Name:f:1\ncell:C4:b:1:1:1:1:f:1\ncell:B5:f:1\ncell:C5:f:1\ncell:B6:t:Home Address:f:1\ncell:C6:b:1:1:1:1:f:1\ncell:B7:f:1\ncell:C7:b:1:1:1:1:f:1\ncell:B8:f:1\ncell:C8:f:1\ncell:B9:t:Phone Number:f:1\ncell:C9:b:1:1:1:1:f:1:cf:2\ncell:B10:t:Email:f:1\ncell:C10:b:1:1:1:1:f:1\ncell:B11:f:1\ncell:C11:f:1\ncell:B12:t:Purchase Price:f:1\ncell:C12:b:1:1:1:1:l:2:f:1:ntvf:1\ncell:B13:t:Purchase Date:f:1\ncell:C13:b:1:1:1:1:l:2:f:1:ntvf:2\ncell:B14:t:Appraised Value:f:1\ncell:C14:b:1:1:1:1:l:2:f:1:ntvf:1\ncell:B15:f:1\ncell:C15:f:1\ncell:B17:t:Contacts:l:1:f:3:c:3:bg:1:cf:1:colspan:2\ncell:A18:b::1::\ncell:B18:t:Name:b:1:1:1:1:l:1:f:1:cf:1\ncell:C18:t:Contact info:b:1:1:1:1:l:1:f:1:cf:1\ncell:D18:b::::1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1\ncell:C19:t:(123) 456-9870:b::1::1:f:1\ncell:D19:b::::1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:bg:2\ncell:C20:b::1::1:f:1:bg:2\ncell:D20:b::::1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1\ncell:C21:b::1::1:f:1\ncell:D21:b::::1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:bg:2\ncell:C22:b::1::1:f:1:bg:2\ncell:D22:b::::1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1\ncell:C23:b::1::1:f:1\ncell:D23:b::::1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:bg:2\ncell:C24:b::1::1:f:1:bg:2\ncell:D24:b::::1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1\ncell:C25:b::1::1:f:1\ncell:D25:b::::1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:bg:2\ncell:C26:b::1::1:f:1:bg:2\ncell:D26:b::::1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1\ncell:C27:b::1::1:f:1\ncell:D27:b::::1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:bg:2\ncell:C28:b::1::1:f:1:bg:2\ncell:D28:b::::1\ncell:A29:b::1::\ncell:B29:b::1::1:f:1\ncell:C29:b::1::1:f:1\ncell:D29:b::::1\ncell:A30:b::1::\ncell:B30:b::1::1:f:1:bg:2\ncell:C30:b::1::1:f:1:bg:2\ncell:D30:b::::1\ncell:A31:b::1::\ncell:B31:b::1::1:f:1\ncell:C31:b::1::1:f:1\ncell:D31:b::::1\ncell:A32:b::1::\ncell:B32:b::1::1:f:1:bg:2\ncell:C32:b::1::1:f:1:bg:2\ncell:D32:b::::1\ncell:A33:b::1::\ncell:B33:b::1:1:1:f:1\ncell:C33:b::1:1:1:f:1\ncell:D33:b::::1\ncell:B34:b:1:::\ncell:C34:b:1:::\ncol:A:w:10\ncol:B:w:109\ncol:C:w:116\ncol:D:w:87\nsheet:c:4:r:34:needsrecalc:yes:font:2:layout:3\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 10pt *\nfont:2:* 11pt arial,helvetica,sans-serif\nfont:3:* 14pt *\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:* 16px * *;vertical-align:*;\nlayout:3:padding:4px 2px 4px 2px;vertical-align:bottom;\nvalueformat:1:#,##0.00\nvalueformat:2:m/d/yy\n"},"name":"help","hidden":"0"},"sheet3":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Maintenance Budget:l:5:f:5:c:3:bg:1:cf:1:colspan:3\ncell:C2:t::l:2:f:3\ncell:D2:t::l:2:f:3\ncell:B3:l:6:f:4:cf:1\ncell:C3:l:2:f:3\ncell:D3:l:2:f:3\ncell:B4:t:Total Actual Expenditure:l:6:f:1:cf:2:colspan:2\ncell:C4:f:1\ncell:D4:vtf:n:0:D32:b:1::1::l:2:f:1:cf:3:ntvf:1\ncell:B5:t:Money Left:l:6:f:1:cf:2:colspan:2\ncell:C5:f:1\ncell:D5:vtf:n:0:C32-D4:b:1::1::l:2:f:1:cf:3:ntvf:1\ncell:B6:t::l:2:f:1\ncell:C6:t::l:2:f:1\ncell:D6:t::b:1::::l:2:f:1\ncell:A7:l:1:f:3\ncell:B7:t:Activity:b:1:1:1:1:l:6:f:1:cf:1\ncell:C7:t:Budget:b:1:1:1:1:l:6:f:1:cf:1\ncell:D7:t:Actual:b:1:1:1:1:l:6:f:1:cf:1\ncell:A8:b::2:::l:1:f:4\ncell:B8:t:Cleaning services:b::1::1:l:4:f:1:cf:2\ncell:C8:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:D8:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:A9:b::2:::l:1:f:4\ncell:B9:t:Plumbing:b::1::1:l:4:f:1:bg:2:cf:2\ncell:C9:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:D9:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:A10:b::2:::l:1:f:4\ncell:B10:t:Repairs:b::1::1:l:4:f:1:cf:2\ncell:C10:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:D10:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:A11:b::2:::l:1:f:4\ncell:B11:t:Appliances:b::1::1:l:4:f:1:bg:2:cf:2\ncell:C11:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:D11:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:A12:b::2:::l:1:f:4\ncell:B12:b::1::1:l:4:f:1:cf:2\ncell:C12:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:D12:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:A13:b::2:::l:1:f:4\ncell:B13:b::1::1:l:4:f:1:bg:2:cf:2\ncell:C13:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:D13:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:A14:b::2:::l:1:f:4\ncell:B14:b::1::1:l:4:f:1:cf:2\ncell:C14:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:D14:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:A15:b::2:::l:1:f:4\ncell:B15:b::1::1:l:4:f:1:bg:2:cf:2\ncell:C15:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:D15:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:A16:b::2:::l:1:f:4\ncell:B16:b::1::1:l:4:f:1:cf:2\ncell:C16:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:D16:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:A17:b::2:::l:1:f:4\ncell:B17:b::1::1:l:4:f:1:bg:2:cf:2\ncell:C17:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:D17:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:A18:b::2:::l:1:f:4\ncell:B18:b::1::1:l:4:f:1:cf:2\ncell:C18:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:D18:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:A19:b::2:::l:1:f:4\ncell:B19:b::1::1:l:4:f:1:bg:2:cf:2\ncell:C19:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:D19:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:A20:b::2:::l:1:f:4\ncell:B20:b::1::1:l:4:f:1:cf:2\ncell:C20:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:D20:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:A21:b::2:::l:1:f:4\ncell:B21:b::1::1:l:4:f:1:bg:2:cf:2\ncell:C21:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:D21:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:A22:b::2:::l:1:f:4\ncell:B22:b::1::1:l:4:f:1:cf:2\ncell:C22:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:D22:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:A23:b::2:::l:1:f:4\ncell:B23:b::1::1:l:4:f:1:bg:2:cf:2\ncell:C23:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:D23:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:A24:b::2:::l:1:f:4\ncell:B24:b::1::1:l:4:f:1:cf:2\ncell:C24:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:D24:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:A25:b::2:::l:1:f:4\ncell:B25:b::1::1:l:4:f:1:bg:2:cf:2\ncell:C25:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:D25:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:A26:b::2:::l:1:f:4\ncell:B26:b::1::1:l:4:f:1:cf:2\ncell:C26:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:D26:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:A27:b::2:::l:1:f:4\ncell:B27:b::1::1:l:4:f:1:bg:2:cf:2\ncell:C27:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:D27:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:A28:b::2:::l:1:f:4\ncell:B28:b::1::1:l:4:f:1:cf:2\ncell:C28:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:D28:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:A29:b::2:::l:1:f:4\ncell:B29:b::1::1:l:4:f:1:bg:2:cf:2\ncell:C29:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:D29:b::1::1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:A30:b::2:::l:1:f:4\ncell:B30:b::1::1:l:4:f:1:cf:2\ncell:C30:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:D30:b::1::1:l:4:f:1:cf:3:ntvf:1\ncell:A31:b::2:::l:1:f:4\ncell:B31:b::1:1:1:l:4:f:1:bg:2:cf:2\ncell:C31:b::1:1:1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:D31:b::1:1:1:l:4:f:1:bg:2:cf:3:ntvf:1\ncell:B32:t:Total :f:1:cf:3\ncell:C32:vtf:n:0:sum(C8\\cC31):b:1::1::f:1:ntvf:1\ncell:D32:vtf:n:0:sum(D8\\cD31):b:1::1::f:1:ntvf:1\ncell:C33:b:1:::\ncell:D33:b:1:::\ncol:A:w:10\ncol:B:w:90\ncol:C:w:74\ncol:D:w:57\ncol:E:w:109\ncol:F:w:250\nrow:2:h:30\nrow:7:h:15\nrow:8:h:15.75\nrow:9:h:15.75\nrow:10:h:15.75\nrow:11:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:15.75\nrow:19:h:15.75\nrow:20:h:15.75\nrow:21:h:15.75\nrow:22:h:15.75\nrow:23:h:15.75\nrow:24:h:15.75\nrow:25:h:15.75\nrow:26:h:15.75\nrow:27:h:15.75\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:15.75\nrow:31:h:15.75\nsheet:c:6:r:33:h:12.75:w:260:needsrecalc:yes:font:2:layout:3\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 10pt *\nfont:2:* 11pt arial,helvetica,sans-serif\nfont:3:normal normal 10pt Arial\nfont:4:normal normal 11pt Arial\nfont:5:normal normal 14pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 2px 4px 2px;vertical-align:*;\nlayout:4:padding:4px 2px 4px 2px;vertical-align:bottom;\nlayout:5:padding:4px 2px 4px 2px;vertical-align:middle;\nlayout:6:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:#,##0.00\n"},"name":"budget","hidden":"0"},"sheet4":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Priority:l:2:f:2:c:3:bg:1:cf:1:colspan:3\ncell:B4:t:Task:b:1:1:1:1:l:2:f:3:cf:1\ncell:C4:t:Priority:b:1:1:1:1:l:2:f:3:cf:1\ncell:D4:t:Assigned to:b:1:1:1:1:l:1:f:3:cf:1\ncell:E4:b::::1\ncell:A5:b::1::\ncell:B5:b::1::1:l:4:f:3:cf:2\ncell:C5:b::1::1:l:3:f:3\ncell:D5:b::1::1:l:3:f:3\ncell:A6:b::1::\ncell:B6:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C6:b::1::1:l:3:f:3:bg:2\ncell:D6:b::1::1:l:3:f:3:bg:2\ncell:A7:b::1::\ncell:B7:b::1::1:l:4:f:3:cf:2\ncell:C7:b::1::1:l:3:f:3\ncell:D7:b::1::1:l:3:f:3\ncell:A8:b::1::\ncell:B8:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C8:b::1::1:l:3:f:3:bg:2\ncell:D8:b::1::1:l:3:f:3:bg:2\ncell:A9:b::1::\ncell:B9:b::1::1:l:4:f:3:cf:2\ncell:C9:b::1::1:l:3:f:3\ncell:D9:b::1::1:l:3:f:3\ncell:A10:b::1::\ncell:B10:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C10:b::1::1:l:3:f:3:bg:2\ncell:D10:b::1::1:l:3:f:3:bg:2\ncell:A11:b::1::\ncell:B11:b::1::1:l:4:f:3:cf:2\ncell:C11:b::1::1:l:3:f:3\ncell:D11:b::1::1:l:3:f:3\ncell:A12:b::1::\ncell:B12:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C12:b::1::1:l:3:f:3:bg:2\ncell:D12:b::1::1:l:3:f:3:bg:2\ncell:A13:b::1::\ncell:B13:b::1::1:l:4:f:3:cf:2\ncell:C13:b::1::1:l:3:f:3\ncell:D13:b::1::1:l:3:f:3\ncell:A14:b::1::\ncell:B14:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C14:b::1::1:l:3:f:3:bg:2\ncell:D14:b::1::1:l:3:f:3:bg:2\ncell:A15:b::1::\ncell:B15:b::1::1:l:4:f:3:cf:2\ncell:C15:b::1::1:l:3:f:3\ncell:D15:b::1::1:l:3:f:3\ncell:A16:b::1::\ncell:B16:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C16:b::1::1:l:3:f:3:bg:2\ncell:D16:b::1::1:l:3:f:3:bg:2\ncell:A17:b::1::\ncell:B17:b::1::1:l:4:f:3:cf:2\ncell:C17:b::1::1:l:3:f:3\ncell:D17:b::1::1:l:3:f:3\ncell:A18:b::1::\ncell:B18:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C18:b::1::1:l:3:f:3:bg:2\ncell:D18:b::1::1:l:3:f:3:bg:2\ncell:A19:b::1::\ncell:B19:b::1::1:l:4:f:3:cf:2\ncell:C19:b::1::1:l:3:f:3\ncell:D19:b::1::1:l:3:f:3\ncell:A20:b::1::\ncell:B20:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C20:b::1::1:l:3:f:3:bg:2\ncell:D20:b::1::1:l:3:f:3:bg:2\ncell:A21:b::1::\ncell:B21:b::1::1:l:4:f:3:cf:2\ncell:C21:b::1::1:l:3:f:3\ncell:D21:b::1::1:l:3:f:3\ncell:A22:b::1::\ncell:B22:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C22:b::1::1:l:3:f:3:bg:2\ncell:D22:b::1::1:l:3:f:3:bg:2\ncell:A23:b::1::\ncell:B23:b::1::1:l:4:f:3:cf:2\ncell:C23:b::1::1:l:3:f:3\ncell:D23:b::1::1:l:3:f:3\ncell:A24:b::1::\ncell:B24:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C24:b::1::1:l:3:f:3:bg:2\ncell:D24:b::1::1:l:3:f:3:bg:2\ncell:A25:b::1::\ncell:B25:b::1::1:l:4:f:3:cf:2\ncell:C25:b::1::1:l:3:f:3\ncell:D25:b::1::1:l:3:f:3\ncell:A26:b::1::\ncell:B26:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C26:b::1::1:l:3:f:3:bg:2\ncell:D26:b::1::1:l:3:f:3:bg:2\ncell:A27:b::1::\ncell:B27:b::1::1:l:4:f:3:cf:2\ncell:C27:b::1::1:l:3:f:3\ncell:D27:b::1::1:l:3:f:3\ncell:A28:b::1::\ncell:B28:b::1:1:1:l:4:f:3:bg:2:cf:2\ncell:C28:b::1:1:1:l:3:f:3:bg:2\ncell:D28:b::1:1:1:l:3:f:3:bg:2\ncell:E28:b::::1\ncell:B29:b:1:::\ncell:C29:b:1:::\ncell:D29:b:1:::\ncol:A:w:10\ncol:B:w:91\ncol:C:w:57\ncol:D:w:75\ncol:K:w:10\nsheet:c:11:r:29:needsrecalc:yes:font:1:layout:3\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 10pt arial,helvetica,sans-serif\nfont:2:* 14pt *\nfont:3:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 2px 4px 2px;vertical-align:*;\nlayout:4:padding:4px 2px 4px 2px;vertical-align:bottom;\n"},"name":"sheet15","hidden":"0"},"sheet5":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Building Maintenance:l:5:f:4:c:3:bg:1:cf:1:colspan:3\ncell:C2:t::l:2:f:2\ncell:D2:t::l:2:f:2\ncell:B3:t::l:2:f:2\ncell:C3:t::l:2:f:2\ncell:D3:t::l:2:f:2\ncell:A4:l:1:f:2\ncell:B4:t:Task:b:1:1:1:1:l:2:f:2:cf:1\ncell:C4:t:Person Incharge:b:1:1:1:1:l:2:f:2:cf:1\ncell:D4:t:Chk:b:1:1:1:1:l:2:f:2:cf:1\ncell:A5:b::2:::l:1:f:3\ncell:B5:vtf:t::IF(SHEET15!B5=\"\",\"\",SHEET15!B5):b::1::1:l:4:f:2:cf:2\ncell:C5:b::1::1:l:3:f:2\ncell:D5:t:
    :b::1::1:l:3:f:2:tvf:2\ncell:A6:b::2:::l:1:f:3\ncell:B6:vtf:t::IF(SHEET15!B6=\"\",\"\",SHEET15!B6):b::1::1:l:4:f:2:bg:2:cf:2\ncell:C6:b::1::1:l:3:f:2:bg:2\ncell:D6:t:
    :b::1::1:l:3:f:2:bg:2:tvf:2\ncell:A7:b::2:::l:1:f:3\ncell:B7:vtf:t::IF(SHEET15!B7=\"\",\"\",SHEET15!B7):b::1::1:l:4:f:2:cf:2\ncell:C7:b::1::1:l:3:f:2\ncell:D7:t:
    :b::1::1:l:3:f:2:tvf:2\ncell:A8:b::2:::l:1:f:3\ncell:B8:vtf:t::IF(SHEET15!B8=\"\",\"\",SHEET15!B8):b::1::1:l:4:f:2:bg:2:cf:2\ncell:C8:b::1::1:l:3:f:2:bg:2\ncell:D8:t:
    :b::1::1:l:3:f:2:bg:2:tvf:2\ncell:A9:b::2:::l:1:f:3\ncell:B9:vtf:t::IF(SHEET15!B9=\"\",\"\",SHEET15!B9):b::1::1:l:4:f:2:cf:2\ncell:C9:b::1::1:l:3:f:2\ncell:D9:t:
    :b::1::1:l:3:f:2:tvf:2\ncell:A10:b::2:::l:1:f:3\ncell:B10:vtf:t::IF(SHEET15!B10=\"\",\"\",SHEET15!B10):b::1::1:l:4:f:2:bg:2:cf:2\ncell:C10:b::1::1:l:3:f:2:bg:2\ncell:D10:t:
    :b::1::1:l:3:f:2:bg:2:tvf:2\ncell:A11:b::2:::l:1:f:3\ncell:B11:vtf:t::IF(SHEET15!B11=\"\",\"\",SHEET15!B11):b::1::1:l:4:f:2:cf:2\ncell:C11:b::1::1:l:3:f:2\ncell:D11:t:
    :b::1::1:l:3:f:2:tvf:2\ncell:A12:b::2:::l:1:f:3\ncell:B12:vtf:t::IF(SHEET15!B12=\"\",\"\",SHEET15!B12):b::1::1:l:4:f:2:bg:2:cf:2\ncell:C12:b::1::1:l:3:f:2:bg:2\ncell:D12:t:
    :b::1::1:l:3:f:2:bg:2:tvf:2\ncell:A13:b::2:::l:1:f:3\ncell:B13:vtf:t::IF(SHEET15!B13=\"\",\"\",SHEET15!B13):b::1::1:l:4:f:2:cf:2\ncell:C13:b::1::1:l:3:f:2\ncell:D13:t:
    :b::1::1:l:3:f:2:tvf:2\ncell:A14:b::2:::l:1:f:3\ncell:B14:vtf:t::IF(SHEET15!B14=\"\",\"\",SHEET15!B14):b::1::1:l:4:f:2:bg:2:cf:2\ncell:C14:b::1::1:l:3:f:2:bg:2\ncell:D14:t:
    :b::1::1:l:3:f:2:bg:2:tvf:2\ncell:A15:b::2:::l:1:f:3\ncell:B15:vtf:t::IF(SHEET15!B15=\"\",\"\",SHEET15!B15):b::1::1:l:4:f:2:cf:2\ncell:C15:b::1::1:l:3:f:2\ncell:D15:t:
    :b::1::1:l:3:f:2:tvf:2\ncell:A16:b::2:::l:1:f:3\ncell:B16:vtf:t::IF(SHEET15!B16=\"\",\"\",SHEET15!B16):b::1::1:l:4:f:2:bg:2:cf:2\ncell:C16:b::1::1:l:3:f:2:bg:2\ncell:D16:t:
    :b::1::1:l:3:f:2:bg:2:tvf:2\ncell:A17:b::2:::l:1:f:3\ncell:B17:vtf:t::IF(SHEET15!B17=\"\",\"\",SHEET15!B17):b::1::1:l:4:f:2:cf:2\ncell:C17:b::1::1:l:3:f:2\ncell:D17:t:
    :b::1::1:l:3:f:2:tvf:2\ncell:A18:b::2:::l:1:f:3\ncell:B18:vtf:t::IF(SHEET15!B18=\"\",\"\",SHEET15!B18):b::1::1:l:4:f:2:bg:2:cf:2\ncell:C18:b::1::1:l:3:f:2:bg:2\ncell:D18:t:
    :b::1::1:l:3:f:2:bg:2:tvf:2\ncell:A19:b::2:::l:1:f:3\ncell:B19:vtf:t::IF(SHEET15!B19=\"\",\"\",SHEET15!B19):b::1::1:l:4:f:2:cf:2\ncell:C19:b::1::1:l:3:f:2\ncell:D19:t:
    :b::1::1:l:3:f:2:tvf:2\ncell:A20:b::2:::l:1:f:3\ncell:B20:vtf:t::IF(SHEET15!B20=\"\",\"\",SHEET15!B20):b::1::1:l:4:f:2:bg:2:cf:2\ncell:C20:b::1::1:l:3:f:2:bg:2\ncell:D20:t:
    :b::1::1:l:3:f:2:bg:2:tvf:2\ncell:A21:b::2:::l:1:f:3\ncell:B21:vtf:t::IF(SHEET15!B21=\"\",\"\",SHEET15!B21):b::1::1:l:4:f:2:cf:2\ncell:C21:b::1::1:l:3:f:2\ncell:D21:t:
    :b::1::1:l:3:f:2:tvf:2\ncell:A22:b::2:::l:1:f:3\ncell:B22:vtf:t::IF(SHEET15!B22=\"\",\"\",SHEET15!B22):b::1::1:l:4:f:2:bg:2:cf:2\ncell:C22:b::1::1:l:3:f:2:bg:2\ncell:D22:t:
    :b::1::1:l:3:f:2:bg:2:tvf:2\ncell:A23:b::2:::l:1:f:3\ncell:B23:vtf:t::IF(SHEET15!B23=\"\",\"\",SHEET15!B23):b::1::1:l:4:f:2:cf:2\ncell:C23:b::1::1:l:3:f:2\ncell:D23:t:
    :b::1::1:l:3:f:2:tvf:2\ncell:A24:b::2:::l:1:f:3\ncell:B24:vtf:t::IF(SHEET15!B24=\"\",\"\",SHEET15!B24):b::1::1:l:4:f:2:bg:2:cf:2\ncell:C24:b::1::1:l:3:f:2:bg:2\ncell:D24:t:
    :b::1::1:l:3:f:2:bg:2:tvf:2\ncell:A25:b::2:::l:1:f:3\ncell:B25:vtf:t::IF(SHEET15!B25=\"\",\"\",SHEET15!B25):b::1::1:l:4:f:2:cf:2\ncell:C25:b::1::1:l:3:f:2\ncell:D25:t:
    :b::1::1:l:3:f:2:tvf:2\ncell:A26:b::2:::l:1:f:3\ncell:B26:vtf:t::IF(SHEET15!B26=\"\",\"\",SHEET15!B26):b::1::1:l:4:f:2:bg:2:cf:2\ncell:C26:b::1::1:l:3:f:2:bg:2\ncell:D26:t:
    :b::1::1:l:3:f:2:bg:2:tvf:2\ncell:A27:b::2:::l:1:f:3\ncell:B27:vtf:t::IF(SHEET15!B27=\"\",\"\",SHEET15!B27):b::1::1:l:4:f:2:cf:2\ncell:C27:b::1::1:l:3:f:2\ncell:D27:t:
    :b::1::1:l:3:f:2:tvf:2\ncell:A28:b::2:::l:1:f:3\ncell:B28:vtf:t::IF(SHEET15!B28=\"\",\"\",SHEET15!B28):b::1:1:1:l:4:f:2:bg:2:cf:2\ncell:C28:b::1:1:1:l:3:f:2:bg:2\ncell:D28:t:
    :b::1::1:l:3:f:2:bg:2:tvf:2\ncell:B29:cf:3\ncell:C29:b:1::::ntvf:1\ncell:D29:b:1:::\ncol:A:w:10\ncol:B:w:94\ncol:C:w:92\ncol:D:w:41\ncol:E:w:250\nrow:2:h:30\nrow:3:h:15.75\nrow:4:h:15.75\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:15.75\nrow:10:h:15.75\nrow:11:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:15.75\nrow:19:h:15.75\nrow:20:h:15.75\nrow:21:h:15.75\nrow:22:h:15.75\nrow:23:h:15.75\nrow:24:h:15.75\nrow:25:h:15.75\nrow:26:h:15.75\nrow:27:h:15.75\nrow:28:h:15.75\nsheet:c:5:r:29:h:12.75:w:260:font:1:layout:3\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 11pt arial,helvetica,sans-serif\nfont:2:normal normal 10pt Arial\nfont:3:normal normal 11pt Arial\nfont:4:normal normal 14pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 2px 4px 2px;vertical-align:*;\nlayout:4:padding:4px 2px 4px 2px;vertical-align:bottom;\nlayout:5:padding:4px 2px 4px 2px;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:text-html\n"},"name":"status","hidden":"0"},"sheet6":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Left:l:2:f:2:c:3:bg:1:cf:1:colspan:3\ncell:B4:t:Task:b:1:1:1:1:l:2:f:3:cf:1\ncell:C4:t:Person Incharge:b:1:1:1:1:l:2:f:3:cf:1\ncell:D4:t:What has to be done:b:1:1:1:1:l:1:f:3:cf:1\ncell:E4:b::::1\ncell:A5:b::1::\ncell:B5:b::1::1:l:4:f:3:cf:2\ncell:C5:b::1::1:l:3:f:3\ncell:D5:b::1::1:l:3:f:3\ncell:A6:b::1::\ncell:B6:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C6:b::1::1:l:3:f:3:bg:2\ncell:D6:b::1::1:l:3:f:3:bg:2\ncell:A7:b::1::\ncell:B7:b::1::1:l:4:f:3:cf:2\ncell:C7:b::1::1:l:3:f:3\ncell:D7:b::1::1:l:3:f:3\ncell:A8:b::1::\ncell:B8:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C8:b::1::1:l:3:f:3:bg:2\ncell:D8:b::1::1:l:3:f:3:bg:2\ncell:A9:b::1::\ncell:B9:b::1::1:l:4:f:3:cf:2\ncell:C9:b::1::1:l:3:f:3\ncell:D9:b::1::1:l:3:f:3\ncell:A10:b::1::\ncell:B10:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C10:b::1::1:l:3:f:3:bg:2\ncell:D10:b::1::1:l:3:f:3:bg:2\ncell:A11:b::1::\ncell:B11:b::1::1:l:4:f:3:cf:2\ncell:C11:b::1::1:l:3:f:3\ncell:D11:b::1::1:l:3:f:3\ncell:A12:b::1::\ncell:B12:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C12:b::1::1:l:3:f:3:bg:2\ncell:D12:b::1::1:l:3:f:3:bg:2\ncell:A13:b::1::\ncell:B13:b::1::1:l:4:f:3:cf:2\ncell:C13:b::1::1:l:3:f:3\ncell:D13:b::1::1:l:3:f:3\ncell:A14:b::1::\ncell:B14:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C14:b::1::1:l:3:f:3:bg:2\ncell:D14:b::1::1:l:3:f:3:bg:2\ncell:A15:b::1::\ncell:B15:b::1::1:l:4:f:3:cf:2\ncell:C15:b::1::1:l:3:f:3\ncell:D15:b::1::1:l:3:f:3\ncell:A16:b::1::\ncell:B16:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C16:b::1::1:l:3:f:3:bg:2\ncell:D16:b::1::1:l:3:f:3:bg:2\ncell:A17:b::1::\ncell:B17:b::1::1:l:4:f:3:cf:2\ncell:C17:b::1::1:l:3:f:3\ncell:D17:b::1::1:l:3:f:3\ncell:A18:b::1::\ncell:B18:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C18:b::1::1:l:3:f:3:bg:2\ncell:D18:b::1::1:l:3:f:3:bg:2\ncell:A19:b::1::\ncell:B19:b::1::1:l:4:f:3:cf:2\ncell:C19:b::1::1:l:3:f:3\ncell:D19:b::1::1:l:3:f:3\ncell:A20:b::1::\ncell:B20:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C20:b::1::1:l:3:f:3:bg:2\ncell:D20:b::1::1:l:3:f:3:bg:2\ncell:A21:b::1::\ncell:B21:b::1::1:l:4:f:3:cf:2\ncell:C21:b::1::1:l:3:f:3\ncell:D21:b::1::1:l:3:f:3\ncell:A22:b::1::\ncell:B22:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C22:b::1::1:l:3:f:3:bg:2\ncell:D22:b::1::1:l:3:f:3:bg:2\ncell:A23:b::1::\ncell:B23:b::1::1:l:4:f:3:cf:2\ncell:C23:b::1::1:l:3:f:3\ncell:D23:b::1::1:l:3:f:3\ncell:A24:b::1::\ncell:B24:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C24:b::1::1:l:3:f:3:bg:2\ncell:D24:b::1::1:l:3:f:3:bg:2\ncell:A25:b::1::\ncell:B25:b::1::1:l:4:f:3:cf:2\ncell:C25:b::1::1:l:3:f:3\ncell:D25:b::1::1:l:3:f:3\ncell:A26:b::1::\ncell:B26:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C26:b::1::1:l:3:f:3:bg:2\ncell:D26:b::1::1:l:3:f:3:bg:2\ncell:A27:b::1::\ncell:B27:b::1::1:l:4:f:3:cf:2\ncell:C27:b::1::1:l:3:f:3\ncell:D27:b::1::1:l:3:f:3\ncell:A28:b::1::\ncell:B28:b::1:1:1:l:4:f:3:bg:2:cf:2\ncell:C28:b::1:1:1:l:3:f:3:bg:2\ncell:D28:b::1:1:1:l:3:f:3:bg:2\ncell:E28:b::::1\ncell:B29:b:1:::\ncell:C29:b:1:::\ncell:D29:b:1:::\ncol:A:w:10\ncol:B:w:90\ncol:C:w:57\ncol:D:w:81\ncol:K:w:10\nsheet:c:11:r:29:font:1:layout:3\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 10pt arial,helvetica,sans-serif\nfont:2:* 14pt *\nfont:3:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 2px 4px 2px;vertical-align:*;\nlayout:4:padding:4px 2px 4px 2px;vertical-align:bottom;\n"},"name":"sheet11","hidden":"0"},"sheet7":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Reminder:l:2:f:2:c:3:bg:1:cf:1:colspan:3\ncell:B4:t:Task:b:1:1:1:1:l:2:f:3:cf:1\ncell:C4:t:Date:b:1:1:1:1:l:2:f:3:cf:1\ncell:D4:t:Time:b:1:1:1:1:l:1:f:3:cf:1\ncell:E4:b::::1\ncell:A5:b::1::\ncell:B5:b::1::1:l:4:f:3:cf:2\ncell:C5:b::1::1:l:3:f:3:ntvf:2\ncell:D5:b::1::1:l:3:f:3:cf:3:ntvf:1\ncell:A6:b::1::\ncell:B6:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C6:b::1::1:l:3:f:3:bg:2:ntvf:2\ncell:D6:b::1::1:l:3:f:3:bg:2:cf:3:ntvf:1\ncell:A7:b::1::\ncell:B7:b::1::1:l:4:f:3:cf:2\ncell:C7:b::1::1:l:3:f:3:ntvf:2\ncell:D7:b::1::1:l:3:f:3:cf:3:ntvf:1\ncell:A8:b::1::\ncell:B8:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C8:b::1::1:l:3:f:3:bg:2:ntvf:2\ncell:D8:b::1::1:l:3:f:3:bg:2:cf:3:ntvf:1\ncell:A9:b::1::\ncell:B9:b::1::1:l:4:f:3:cf:2\ncell:C9:b::1::1:l:3:f:3:ntvf:2\ncell:D9:b::1::1:l:3:f:3:cf:3:ntvf:1\ncell:A10:b::1::\ncell:B10:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C10:b::1::1:l:3:f:3:bg:2:ntvf:2\ncell:D10:b::1::1:l:3:f:3:bg:2:cf:3:ntvf:1\ncell:A11:b::1::\ncell:B11:b::1::1:l:4:f:3:cf:2\ncell:C11:b::1::1:l:3:f:3:ntvf:2\ncell:D11:b::1::1:l:3:f:3:cf:3:ntvf:1\ncell:A12:b::1::\ncell:B12:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C12:b::1::1:l:3:f:3:bg:2:ntvf:2\ncell:D12:b::1::1:l:3:f:3:bg:2:cf:3:ntvf:1\ncell:A13:b::1::\ncell:B13:b::1::1:l:4:f:3:cf:2\ncell:C13:b::1::1:l:3:f:3:ntvf:2\ncell:D13:b::1::1:l:3:f:3:cf:3:ntvf:1\ncell:A14:b::1::\ncell:B14:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C14:b::1::1:l:3:f:3:bg:2:ntvf:2\ncell:D14:b::1::1:l:3:f:3:bg:2:cf:3:ntvf:1\ncell:A15:b::1::\ncell:B15:b::1::1:l:4:f:3:cf:2\ncell:C15:b::1::1:l:3:f:3:ntvf:2\ncell:D15:b::1::1:l:3:f:3:cf:3:ntvf:1\ncell:A16:b::1::\ncell:B16:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C16:b::1::1:l:3:f:3:bg:2:ntvf:2\ncell:D16:b::1::1:l:3:f:3:bg:2:cf:3:ntvf:1\ncell:A17:b::1::\ncell:B17:b::1::1:l:4:f:3:cf:2\ncell:C17:b::1::1:l:3:f:3:ntvf:2\ncell:D17:b::1::1:l:3:f:3:cf:3:ntvf:1\ncell:A18:b::1::\ncell:B18:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C18:b::1::1:l:3:f:3:bg:2:ntvf:2\ncell:D18:b::1::1:l:3:f:3:bg:2:cf:3:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:l:4:f:3:cf:2\ncell:C19:b::1::1:l:3:f:3:ntvf:2\ncell:D19:b::1::1:l:3:f:3:cf:3:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C20:b::1::1:l:3:f:3:bg:2:ntvf:2\ncell:D20:b::1::1:l:3:f:3:bg:2:cf:3:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:l:4:f:3:cf:2\ncell:C21:b::1::1:l:3:f:3:ntvf:2\ncell:D21:b::1::1:l:3:f:3:cf:3:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C22:b::1::1:l:3:f:3:bg:2:ntvf:2\ncell:D22:b::1::1:l:3:f:3:bg:2:cf:3:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:l:4:f:3:cf:2\ncell:C23:b::1::1:l:3:f:3:ntvf:2\ncell:D23:b::1::1:l:3:f:3:cf:3:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C24:b::1::1:l:3:f:3:bg:2:ntvf:2\ncell:D24:b::1::1:l:3:f:3:bg:2:cf:3:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:l:4:f:3:cf:2\ncell:C25:b::1::1:l:3:f:3:ntvf:2\ncell:D25:b::1::1:l:3:f:3:cf:3:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:l:4:f:3:bg:2:cf:2\ncell:C26:b::1::1:l:3:f:3:bg:2:ntvf:2\ncell:D26:b::1::1:l:3:f:3:bg:2:cf:3:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:l:4:f:3:cf:2\ncell:C27:b::1::1:l:3:f:3:ntvf:2\ncell:D27:b::1::1:l:3:f:3:cf:3:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1:1:1:l:4:f:3:bg:2:cf:2\ncell:C28:b::1:1:1:l:3:f:3:bg:2:ntvf:2\ncell:D28:b::1:1:1:l:3:f:3:bg:2:cf:3:ntvf:1\ncell:E28:b::::1\ncell:B29:b:1:::\ncell:C29:b:1:::\ncell:D29:b:1:::\ncol:A:w:10\ncol:B:w:101\ncol:C:w:65\ncol:D:w:63\ncol:K:w:10\nsheet:c:11:r:29:font:1:layout:3\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 10pt arial,helvetica,sans-serif\nfont:2:* 14pt *\nfont:3:normal normal 10pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:4px 2px 4px 2px;vertical-align:*;\nlayout:4:padding:4px 2px 4px 2px;vertical-align:bottom;\nvalueformat:1:h\\cmm\nvalueformat:2:m/d/yy\n"},"name":"sheet10","hidden":"0"},"sheet8":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Historical Maintenance Cost:f:3:c:3:bg:1:cf:1:colspan:3\ncell:B4:t:Date:b:1:1:1:1:l:1:f:1:cf:1\ncell:C4:t:Total Cost:b:1:1:1:1:l:1:f:1:cf:1\ncell:D4:t:Notes:b:1:1:1:1:l:1:f:1:cf:1\ncell:A5:b::1::\ncell:B5:b::1::1:f:1:cf:2:ntvf:2\ncell:C5:b::1::1:f:1:cf:3:ntvf:1\ncell:D5:b::1::1:f:1:cf:2\ncell:A6:b::1::\ncell:B6:b::1::1:f:1:bg:2:cf:2:ntvf:2\ncell:C6:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D6:b::1::1:f:1:bg:2:cf:2:ntvf:1\ncell:A7:b::1::\ncell:B7:b::1::1:f:1:cf:2:ntvf:2\ncell:C7:b::1::1:f:1:cf:3:ntvf:1\ncell:D7:b::1::1:f:1:cf:2\ncell:A8:b::1::\ncell:B8:b::1::1:f:1:bg:2:cf:2:ntvf:2\ncell:C8:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D8:b::1::1:f:1:bg:2:cf:2:ntvf:1\ncell:A9:b::1::\ncell:B9:b::1::1:f:1:cf:2:ntvf:2\ncell:C9:b::1::1:f:1:cf:3:ntvf:1\ncell:D9:b::1::1:f:1:cf:2\ncell:A10:b::1::\ncell:B10:b::1::1:f:1:bg:2:cf:2:ntvf:2\ncell:C10:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D10:b::1::1:f:1:bg:2:cf:2:ntvf:1\ncell:A11:b::1::\ncell:B11:b::1::1:f:1:cf:2:ntvf:2\ncell:C11:b::1::1:f:1:cf:3:ntvf:1\ncell:D11:b::1::1:f:1:cf:2\ncell:A12:b::1::\ncell:B12:b::1::1:f:1:bg:2:cf:2:ntvf:2\ncell:C12:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D12:b::1::1:f:1:bg:2:cf:2:ntvf:1\ncell:A13:b::1::\ncell:B13:b::1::1:f:1:cf:2:ntvf:2\ncell:C13:b::1::1:f:1:cf:3:ntvf:1\ncell:D13:b::1::1:f:1:cf:2\ncell:A14:b::1::\ncell:B14:b::1::1:f:1:bg:2:cf:2:ntvf:2\ncell:C14:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D14:b::1::1:f:1:bg:2:cf:2:ntvf:1\ncell:A15:b::1::\ncell:B15:b::1::1:f:1:cf:2:ntvf:2\ncell:C15:b::1::1:f:1:cf:3:ntvf:1\ncell:D15:b::1::1:f:1:cf:2\ncell:A16:b::1::\ncell:B16:b::1::1:f:1:bg:2:cf:2:ntvf:2\ncell:C16:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D16:b::1::1:f:1:bg:2:cf:2:ntvf:1\ncell:A17:b::1::\ncell:B17:b::1::1:f:1:cf:2:ntvf:2\ncell:C17:b::1::1:f:1:cf:3:ntvf:1\ncell:D17:b::1::1:f:1:cf:2\ncell:A18:b::1::\ncell:B18:b::1::1:f:1:bg:2:cf:2:ntvf:2\ncell:C18:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D18:b::1::1:f:1:bg:2:cf:2:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:ntvf:2\ncell:C19:b::1::1:f:1:cf:3:ntvf:1\ncell:D19:b::1::1:f:1:cf:2\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:bg:2:cf:2:ntvf:2\ncell:C20:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D20:b::1::1:f:1:bg:2:cf:2:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:ntvf:2\ncell:C21:b::1::1:f:1:cf:3:ntvf:1\ncell:D21:b::1::1:f:1:cf:2\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:bg:2:cf:2:ntvf:2\ncell:C22:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D22:b::1::1:f:1:bg:2:cf:2:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:ntvf:2\ncell:C23:b::1::1:f:1:cf:3:ntvf:1\ncell:D23:b::1::1:f:1:cf:2\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:bg:2:cf:2:ntvf:2\ncell:C24:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D24:b::1::1:f:1:bg:2:cf:2:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:ntvf:2\ncell:C25:b::1::1:f:1:cf:3:ntvf:1\ncell:D25:b::1::1:f:1:cf:2\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:bg:2:cf:2:ntvf:2\ncell:C26:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D26:b::1::1:f:1:bg:2:cf:2:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:ntvf:2\ncell:C27:b::1::1:f:1:cf:3:ntvf:1\ncell:D27:b::1::1:f:1:cf:2\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:bg:2:cf:2:ntvf:2\ncell:C28:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D28:b::1::1:f:1:bg:2:cf:2:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:f:1:cf:2:ntvf:2\ncell:C29:b::1::1:f:1:cf:3:ntvf:1\ncell:D29:b::1::1:f:1:cf:2\ncell:A30:b::1::\ncell:B30:b::1:1:1:f:1:bg:2:cf:2:ntvf:2\ncell:C30:b::1:1:1:f:1:bg:2:cf:3:ntvf:1\ncell:D30:b::1::1:f:1:bg:2:cf:2:ntvf:1\ncell:D31:b:1:::\ncol:A:w:10\ncol:B:w:69\ncol:C:w:61\ncol:D:w:97\nsheet:c:4:r:31:needsrecalc:yes:font:2:layout:2\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 10pt *\nfont:2:* 11pt arial,helvetica,sans-serif\nfont:3:* 14pt *\nlayout:1:padding:* * * *;vertical-align:middle;\nlayout:2:padding:4px 2px 4px 2px;vertical-align:bottom;\nvalueformat:1: #,##0.00;\\b-#,##0.00;\\b-\nvalueformat:2:m/d/yy\n"},"name":"sheet7","hidden":"0"},"sheet9":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Building Maintenance:l:5:f:6:c:3:bg:1:cf:1:colspan:2\ncell:A4:b::1::\ncell:B4:t:Annual Maintenance:b:1:1:1:1:l:1:f:4:cf:1\ncell:C4:t:Next Service Date:b:1:1:1:1:l:4:f:2:cf:1\ncell:D4:b::::1\ncell:A5:b::1::\ncell:B5:t:Replace smoke detector batteries.:b::1::1:l:4:f:1\ncell:C5:b::1::1:f:1:cf:3:ntvf:1\ncell:D5:b::::1\ncell:A6:b::1::\ncell:B6:t:Heating and Airconditioning\\c Inspect and Service if necessary:b::1::1:l:4:f:1:bg:2\ncell:C6:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D6:b::::1\ncell:A7:b::1::\ncell:B7:t:Chimneys\\c Inspect and Clean:b::1::1:l:4:f:1\ncell:C7:b::1::1:f:1:cf:3:ntvf:1\ncell:D7:b::::1\ncell:A8:b::1::\ncell:B8:t:Electrical panels and wiring\\c Inspect, exercise circuit breakers:b::1::1:l:4:f:1:bg:2\ncell:C8:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D8:b::::1\ncell:A9:b::1::\ncell:B9:t:Water heater\\c Inspect and service:b::1::1:l:4:f:1\ncell:C9:b::1::1:f:1:cf:3:ntvf:1\ncell:D9:b::::1\ncell:A10:b::1::\ncell:B10:t:Main cleanout drain\\c Inspect and service:b::1::1:l:4:f:1:bg:2\ncell:C10:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D10:b::::1\ncell:A11:b::1::\ncell:B11:t:Inspect home for pest activity (termites/ants):b::1::1:l:4:f:1\ncell:C11:b::1::1:f:1:cf:3:ntvf:1\ncell:D11:b::::1\ncell:A12:b::1::\ncell:B12:t:Ceramic Tiles/Granite\\c Check, clean grout, apply sealant:b::1::1:l:4:f:1:bg:2\ncell:C12:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D12:b::::1\ncell:A13:b::1::\ncell:B13:t:Water Heater\\c Flush water, and remove accumulated sediment:b::1::1:l:4:f:1\ncell:C13:b::1::1:f:1:cf:3:ntvf:1\ncell:D13:b::::1\ncell:A14:b::1::\ncell:B14:t:Other (edit):b::1::1:l:4:f:1:bg:2\ncell:C14:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D14:b::::1\ncell:A15:b::1::\ncell:B15:t:Other (edit):b::1::1:l:4:f:1\ncell:C15:b::1::1:f:1:cf:3:ntvf:1\ncell:D15:b::::1\ncell:A16:b::1::\ncell:B16:t:Other (edit):b::1::1:l:4:f:1:bg:2\ncell:C16:b::1::1:f:1:bg:2:cf:3:ntvf:1\ncell:D16:b::::1\ncell:A17:b::1::\ncell:B17:t:Other (edit):b::1::1:l:4:f:1\ncell:C17:b::1::1:f:1:cf:3:ntvf:1\ncell:D17:b::::1\ncell:A18:b::1::\ncell:B18:t:Other (edit):b::1:1:1:l:4:f:1:bg:2\ncell:C18:b::1:1:1:f:1:bg:2:cf:3:ntvf:1\ncell:D18:b::::1\ncell:B19:b:1::::l:6:f:1\ncell:C19:b:1::::f:1:cf:3:ntvf:1\ncell:A21:b::1::\ncell:B21:t:Quaterly Maintenance:b:1:1:1:1:l:1:f:4:cf:1\ncell:C21:t:Next Service Date:b:1:1:1:1:l:4:f:2:cf:1\ncell:D21:b::::1\ncell:A22:b::1::\ncell:B22:t:Roof\\c inspect for any damage, leaks and birds/pests:b::1::1:l:2:f:1\ncell:C22:b::1::1:ntvf:1\ncell:D22:b::::1\ncell:A23:b::1::\ncell:B23:t:Attic\\c check roof vents are clear. check for leaks. check for pest activity. Check insulation:b::1::1:l:2:f:1:bg:2\ncell:C23:b::1::1:bg:2:ntvf:1\ncell:D23:b::::1\ncell:A24:b::1::\ncell:B24:t:Exterior\\c Check and trim trees and shrubs which are close to the house:b::1::1:l:2:f:1\ncell:C24:b::1::1:ntvf:1\ncell:D24:b::::1\ncell:A25:b::1::\ncell:B25:t:Exterior\\c Inspect siding, clean and repair:b::1::1:l:2:f:1:bg:2\ncell:C25:b::1::1:bg:2:ntvf:1\ncell:D25:b::::1\ncell:A26:b::1::\ncell:B26:t:Exterior walls\\c Check for damage or cracking.:b::1::1:l:2:f:1\ncell:C26:b::1::1:ntvf:1\ncell:D26:b::::1\ncell:A27:b::1::\ncell:B27:t:Foundation\\c Check for cracks or damage:b::1::1:l:2:f:1:bg:2\ncell:C27:b::1::1:bg:2:ntvf:1\ncell:D27:b::::1\ncell:A28:b::1::\ncell:B28:t:Basement / Crawl space\\c Check for moisture, leaks, pest activity:b::1::1:l:2:f:1\ncell:C28:b::1::1:ntvf:1\ncell:D28:b::::1\ncell:A29:b::1::\ncell:B29:t:Trees\\c trim trees, and keep clear of overhead wires:b::1::1:l:2:f:1:bg:2\ncell:C29:b::1::1:bg:2:ntvf:1\ncell:D29:b::::1\ncell:A30:b::1::\ncell:B30:t:Drainage\\c Ensure water flows away from the house and foundation:b::1::1:l:2:f:1\ncell:C30:b::1::1:ntvf:1\ncell:D30:b::::1\ncell:A31:b::1::\ncell:B31:t:Driveways / Walkways\\c Inspect for damage:b::1::1:l:2:f:1:bg:2\ncell:C31:b::1::1:bg:2:ntvf:1\ncell:D31:b::::1\ncell:A32:b::1::\ncell:B32:t:Windows\\c Inspect and test operation.:b::1::1:l:2:f:1\ncell:C32:b::1::1:ntvf:1\ncell:D32:b::::1\ncell:A33:b::1::\ncell:B33:t:Garage doors\\c Inspect and test operation, lubricate door hinges:b::1::1:l:2:f:1:bg:2\ncell:C33:b::1::1:bg:2:ntvf:1\ncell:D33:b::::1\ncell:A34:b::1::\ncell:B34:t:Doors and Windows\\c Lubricate hinges:b::1::1:l:2:f:1\ncell:C34:b::1::1:ntvf:1\ncell:D34:b::::1\ncell:A35:b::1::\ncell:B35:t:Air Filters\\c Inspect and replace air filters in heaters, exhausts, range hood:b::1::1:l:2:f:1:bg:2\ncell:C35:b::1::1:bg:2:ntvf:1\ncell:D35:b::::1\ncell:A36:b::1::\ncell:B36:t:Caulking\\c Inspect and replace caulking around tubs, sinks, and showers:b::1::1:l:2:f:1\ncell:C36:b::1::1:ntvf:1\ncell:D36:b::::1\ncell:A37:b::1::\ncell:B37:t:Washer/Dryer\\c Clean ducts and inlets. Check hoses:b::1::1:l:2:f:1:bg:2\ncell:C37:b::1::1:bg:2:ntvf:1\ncell:D37:b::::1\ncell:A38:b::1::\ncell:B38:t:Other (edit):b::1::1:l:2:f:1\ncell:C38:b::1::1:ntvf:1\ncell:D38:b::::1\ncell:A39:b::1::\ncell:B39:t:Other (edit):b::1::1:l:2:f:1:bg:2\ncell:C39:b::1::1:bg:2:ntvf:1\ncell:D39:b::::1\ncell:A40:b::1::\ncell:B40:t:Other (edit):b::1::1:l:2:f:1\ncell:C40:b::1::1:ntvf:1\ncell:D40:b::::1\ncell:A41:b::1::\ncell:B41:t:Other (edit):b::1::1:l:2:f:1:bg:2\ncell:C41:b::1::1:bg:2:ntvf:1\ncell:D41:b::::1\ncell:A42:b::1::\ncell:B42:t:Other (edit):b::1:1:1:l:2:f:1\ncell:C42:b::1:1:1:ntvf:1\ncell:D42:b::::1\ncell:B43:b:1:::\ncell:C43:b:1:::\ncell:B44:t:Notes:f:5:c:3:bg:1:cf:2:colspan:2\ncell:A45:b::1::\ncell:B45:b::1::1:colspan:2\ncell:D45:b::::1\ncell:A46:b::1::\ncell:B46:b::1::1:bg:2:colspan:2\ncell:D46:b::::1\ncell:A47:b::1::\ncell:B47:b::1::1:colspan:2\ncell:D47:b::::1\ncell:A48:b::1::\ncell:B48:b::1::1:bg:2:colspan:2\ncell:D48:b::::1\ncell:A49:b::1::\ncell:B49:b::1::1:colspan:2\ncell:D49:b::::1\ncell:A50:b::1::\ncell:B50:b::1::1:bg:2:colspan:2\ncell:D50:b::::1\ncell:A51:b::1::\ncell:B51:b::1::1:colspan:2\ncell:D51:b::::1\ncell:A52:b::1::\ncell:B52:b::1:1:1:bg:2:colspan:2\ncell:D52:b::::1\ncell:B53:b:1:::\ncell:C53:b:1:::\ncol:A:w:10\ncol:B:w:163\ncol:C:w:72\nsheet:c:4:r:53:needsrecalc:yes:font:3:layout:3\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 10pt *\nfont:2:* 11pt *\nfont:3:* 11pt arial,helvetica,sans-serif\nfont:4:* 12pt arial,helvetica,sans-serif\nfont:5:* 14pt *\nfont:6:normal normal 14pt arial,helvetica,sans-serif\nlayout:1:padding:3px 2px 3px 2px;vertical-align:middle;\nlayout:2:padding:4px 2px 4px 2px;vertical-align:*;\nlayout:3:padding:4px 2px 4px 2px;vertical-align:bottom;\nlayout:4:padding:4px 2px 4px 2px;vertical-align:middle;\nlayout:5:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:6:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:m/d/yy\n"},"name":"annual","hidden":"0"},"sheet10":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Building Maintenance:l:4:f:6:c:3:bg:1:cf:1:colspan:2\ncell:A4:b::1::\ncell:B4:t:Monthly Maintenance:b:1:1:1:1:l:3:f:4:cf:1\ncell:C4:t:Next Service Date:b:1:1:1:1:l:3:f:2:cf:1\ncell:D4:b::::1\ncell:A5:b::1::\ncell:B5:t:Fire Extinguisher\\c Inspect and charge:b::1::1:f:1\ncell:C5:b::1::1:l:1:f:1:cf:2:ntvf:1\ncell:D5:b::::1\ncell:A6:b::1::\ncell:B6:t:Heating/Cooling\\c Inspect and clean air filters.:b::1::1:f:1:bg:2\ncell:C6:b::1::1:l:1:f:1:bg:2:cf:2:ntvf:1\ncell:D6:b::::1\ncell:A7:b::1::\ncell:B7:t:Humidifiers\\c Inspect and clean:b::1::1:f:1\ncell:C7:b::1::1:l:1:f:1:cf:2:ntvf:1\ncell:D7:b::::1\ncell:A8:b::1::\ncell:B8:t:Gutters/Downspouts\\c Inspect and Clean. Check for proper drainage:b::1::1:f:1:bg:2\ncell:C8:b::1::1:l:1:f:1:bg:2:cf:2:ntvf:1\ncell:D8:b::::1\ncell:A9:b::1::\ncell:B9:t:Sink/Tub/Shower drains\\c Clean debris:b::1::1:f:1\ncell:C9:b::1::1:l:1:f:1:cf:2:ntvf:1\ncell:D9:b::::1\ncell:A10:b::1::\ncell:B10:t:Tubs/Showers\\c Inspect for leaks.:b::1::1:f:1:bg:2\ncell:C10:b::1::1:l:1:f:1:bg:2:cf:2:ntvf:1\ncell:D10:b::::1\ncell:A11:b::1::\ncell:B11:t:Inspect kitchen sinks for water leaks and water damage.:b::1::1:f:1\ncell:C11:b::1::1:l:1:f:1:cf:2:ntvf:1\ncell:D11:b::::1\ncell:A12:b::1::\ncell:B12:t:Faucets/Shower Heads/Toilets\\c Inspect for leaks and water damage:b::1::1:f:1:bg:2\ncell:C12:b::1::1:l:1:f:1:bg:2:cf:2:ntvf:1\ncell:D12:b::::1\ncell:A13:b::1::\ncell:B13:t:Toilet\\c Inspect for stability, and flush operation:b::1::1:f:1\ncell:C13:b::1::1:l:1:f:1:cf:2:ntvf:1\ncell:D13:b::::1\ncell:A14:b::1::\ncell:B14:t:Other (edit):b::1::1:f:1:bg:2\ncell:C14:b::1::1:l:1:f:1:bg:2:cf:2:ntvf:1\ncell:D14:b::::1\ncell:A15:b::1::\ncell:B15:t:Other (edit):b::1::1:f:1\ncell:C15:b::1::1:l:1:f:1:cf:2:ntvf:1\ncell:D15:b::::1\ncell:A16:b::1::\ncell:B16:t:Other (edit):b::1::1:f:1:bg:2\ncell:C16:b::1::1:l:1:f:1:bg:2:cf:2:ntvf:1\ncell:D16:b::::1\ncell:A17:b::1::\ncell:B17:t:Other (edit):b::1::1:f:1\ncell:C17:b::1::1:l:1:f:1:cf:2:ntvf:1\ncell:D17:b::::1\ncell:A18:b::1::\ncell:B18:t:Other (edit):b::1:1:1:f:1:bg:2\ncell:C18:b::1:1:1:l:1:f:1:bg:2:cf:2:ntvf:1\ncell:D18:b::::1\ncell:B19:b:1:::\ncell:C19:b:1:::\ncell:B20:t:Notes:f:5:c:3:bg:1:colspan:2\ncell:A21:b::1::\ncell:B21:b::1::1:colspan:2\ncell:D21:b::::1\ncell:A22:b::1::\ncell:B22:b::1::1:bg:2:colspan:2\ncell:D22:b::::1\ncell:A23:b::1::\ncell:B23:b::1::1:colspan:2\ncell:D23:b::::1\ncell:A24:b::1::\ncell:B24:b::1::1:bg:2:colspan:2\ncell:D24:b::::1\ncell:A25:b::1::\ncell:B25:b::1::1:colspan:2\ncell:D25:b::::1\ncell:A26:b::1::\ncell:B26:b::1::1:bg:2:colspan:2\ncell:D26:b::::1\ncell:A27:b::1::\ncell:B27:b::1::1:colspan:2\ncell:D27:b::::1\ncell:A28:b::1::\ncell:B28:b::1::1:bg:2:colspan:2\ncell:D28:b::::1\ncell:B29:b:1:::\ncell:C29:b:1:::\ncol:A:w:10\ncol:B:w:161\ncol:C:w:78\nsheet:c:4:r:29:needsrecalc:yes:font:3:layout:2\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 10pt *\nfont:2:* 11pt *\nfont:3:* 11pt arial,helvetica,sans-serif\nfont:4:* 12pt *\nfont:5:* 14pt *\nfont:6:normal normal 14pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:4px 2px 4px 2px;vertical-align:bottom;\nlayout:3:padding:4px 2px 4px 2px;vertical-align:middle;\nlayout:4:padding:4px 4px 4px 4px;vertical-align:*;\nvalueformat:1:m/d/yy\n"},"name":"monthly","hidden":"0"}},"EditableCells":{"allow":true,"cells":{"help!B2":true,"help!B4":true,"help!B6":true,"help!B9":true,"help!B10":true,"help!B12":true,"help!B13":true,"help!B14":true,"help!B17":true,"help!B18":true,"help!B19":true,"help!B20":true,"help!B21":true,"help!B22":true,"help!B23":true,"help!B24":true,"help!B25":true,"help!B26":true,"help!B27":true,"help!B28":true,"help!B29":true,"help!B30":true,"help!B32":true,"help!B33":true,"help!C4":true,"help!C6":true,"help!C7":true,"help!C9":true,"help!C10":true,"help!C12":true,"help!C13":true,"help!C14":true,"help!C18":true,"help!C19":true,"help!C20":true,"help!C21":true,"help!C22":true,"help!C23":true,"help!C24":true,"help!C25":true,"help!C26":true,"help!C27":true,"help!C28":true,"help!C29":true,"help!C30":true,"help!C32":true,"help!C33":true,"budget!B2":true,"budget!B4":true,"budget!B5":true,"budget!B7":true,"budget!B8":true,"budget!B9":true,"budget!B10":true,"budget!B11":true,"budget!B12":true,"budget!B13":true,"budget!B14":true,"budget!B15":true,"budget!B16":true,"budget!B17":true,"budget!B18":true,"budget!B19":true,"budget!B20":true,"budget!B21":true,"budget!B22":true,"budget!B23":true,"budget!B24":true,"budget!B25":true,"budget!B26":true,"budget!B27":true,"budget!B28":true,"budget!B29":true,"budget!B30":true,"budget!B31":true,"budget!B32":true,"budget!C7":true,"budget!C8":true,"budget!C9":true,"budget!C10":true,"budget!C11":true,"budget!C12":true,"budget!C13":true,"budget!C14":true,"budget!C15":true,"budget!C16":true,"budget!C17":true,"budget!C18":true,"budget!C19":true,"budget!C20":true,"budget!C21":true,"budget!C22":true,"budget!C23":true,"budget!C24":true,"budget!C25":true,"budget!C26":true,"budget!C27":true,"budget!C28":true,"budget!C29":true,"budget!C30":true,"budget!C31":true,"budget!D7":true,"budget!D8":true,"budget!D9":true,"budget!D10":true,"budget!D11":true,"budget!D12":true,"budget!D13":true,"budget!D14":true,"budget!D15":true,"budget!D16":true,"budget!D17":true,"budget!D18":true,"budget!D19":true,"budget!D20":true,"budget!D21":true,"budget!D22":true,"budget!D23":true,"budget!D24":true,"budget!D25":true,"budget!D26":true,"budget!D27":true,"budget!D28":true,"budget!D29":true,"budget!D30":true,"budget!D31":true,"sheet7!B2":true,"sheet7!B4":true,"sheet7!B5":true,"sheet7!B6":true,"sheet7!B7":true,"sheet7!B8":true,"sheet7!B9":true,"sheet7!B10":true,"sheet7!B11":true,"sheet7!B12":true,"sheet7!B13":true,"sheet7!B14":true,"sheet7!B15":true,"sheet7!B16":true,"sheet7!B17":true,"sheet7!B18":true,"sheet7!B19":true,"sheet7!B20":true,"sheet7!B21":true,"sheet7!B22":true,"sheet7!B23":true,"sheet7!B24":true,"sheet7!B25":true,"sheet7!B26":true,"sheet7!B27":true,"sheet7!B28":true,"sheet7!B29":true,"sheet7!B30":true,"sheet7!C4":true,"sheet7!C5":true,"sheet7!C6":true,"sheet7!C7":true,"sheet7!C8":true,"sheet7!C9":true,"sheet7!C10":true,"sheet7!C11":true,"sheet7!C12":true,"sheet7!C13":true,"sheet7!C14":true,"sheet7!C15":true,"sheet7!C16":true,"sheet7!C17":true,"sheet7!C18":true,"sheet7!C19":true,"sheet7!C20":true,"sheet7!C21":true,"sheet7!C22":true,"sheet7!C23":true,"sheet7!C24":true,"sheet7!C25":true,"sheet7!C26":true,"sheet7!C27":true,"sheet7!C28":true,"sheet7!C29":true,"sheet7!C30":true,"sheet7!D4":true,"sheet7!D5":true,"sheet7!D6":true,"sheet7!D7":true,"sheet7!D8":true,"sheet7!D9":true,"sheet7!D10":true,"sheet7!D11":true,"sheet7!D12":true,"sheet7!D13":true,"sheet7!D14":true,"sheet7!D15":true,"sheet7!D16":true,"sheet7!D17":true,"sheet7!D18":true,"sheet7!D19":true,"sheet7!D20":true,"sheet7!D21":true,"sheet7!D22":true,"sheet7!D23":true,"sheet7!D24":true,"sheet7!D25":true,"sheet7!D26":true,"sheet7!D27":true,"sheet7!D28":true,"sheet7!D29":true,"sheet7!D30":true,"annual!B2":true,"annual!B4":true,"annual!B5":true,"annual!B6":true,"annual!B7":true,"annual!B8":true,"annual!B9":true,"annual!B10":true,"annual!B11":true,"annual!B12":true,"annual!B13":true,"annual!B14":true,"annual!B15":true,"annual!B16":true,"annual!B17":true,"annual!B18":true,"annual!B21":true,"annual!B22":true,"annual!B23":true,"annual!B24":true,"annual!B25":true,"annual!B26":true,"annual!B27":true,"annual!B28":true,"annual!B29":true,"annual!B30":true,"annual!B31":true,"annual!B32":true,"annual!B33":true,"annual!B34":true,"annual!B35":true,"annual!B36":true,"annual!B37":true,"annual!B38":true,"annual!B39":true,"annual!B40":true,"annual!B41":true,"annual!B42":true,"annual!B44":true,"annual!B45":true,"annual!B46":true,"annual!B47":true,"annual!B48":true,"annual!B49":true,"annual!B50":true,"annual!B51":true,"annual!B52":true,"annual!C4":true,"annual!C5":true,"annual!C6":true,"annual!C7":true,"annual!C8":true,"annual!C9":true,"annual!C10":true,"annual!C11":true,"annual!C12":true,"annual!C13":true,"annual!C14":true,"annual!C15":true,"annual!C16":true,"annual!C17":true,"annual!C18":true,"annual!C21":true,"annual!C22":true,"annual!C23":true,"annual!C24":true,"annual!C25":true,"annual!C26":true,"annual!C27":true,"annual!C28":true,"annual!C29":true,"annual!C30":true,"annual!C31":true,"annual!C32":true,"annual!C33":true,"annual!C34":true,"annual!C35":true,"annual!C36":true,"annual!C37":true,"annual!C38":true,"annual!C39":true,"annual!C40":true,"annual!C41":true,"annual!C42":true,"monthly!B2":true,"monthly!B4":true,"monthly!B5":true,"monthly!B6":true,"monthly!B7":true,"monthly!B8":true,"monthly!B9":true,"monthly!B10":true,"monthly!B11":true,"monthly!B12":true,"monthly!B13":true,"monthly!B14":true,"monthly!B15":true,"monthly!B16":true,"monthly!B17":true,"monthly!B18":true,"monthly!B20":true,"monthly!B21":true,"monthly!B22":true,"monthly!B23":true,"monthly!B24":true,"monthly!B25":true,"monthly!B26":true,"monthly!B27":true,"monthly!B28":true,"monthly!C4":true,"monthly!C5":true,"monthly!C6":true,"monthly!C7":true,"monthly!C8":true,"monthly!C9":true,"monthly!C10":true,"monthly!C11":true,"monthly!C12":true,"monthly!C13":true,"monthly!C14":true,"monthly!C15":true,"monthly!C16":true,"monthly!C17":true,"monthly!C18":true,"help!B31":true,"help!C31":true,"jul!E7":true,"jul!E8":true,"jul!E9":true,"jul!E10":true,"jul!E11":true,"jul!E12":true,"jul!E13":true,"jul!E14":true,"jul!E15":true,"jul!E16":true,"jul!E17":true,"jul!E18":true,"jul!E19":true,"jul!E20":true,"jul!E21":true,"jul!E22":true,"jul!E23":true,"jul!E24":true,"jul!E25":true,"jul!E26":true,"jul!E27":true,"jul!E28":true,"jul!E29":true,"jul!E30":true,"jul!E31":true,"jul!E32":true,"jul!E33":true,"jul!E34":true,"jul!E35":true,"jul!E36":true,"jul!E37":true,"status!B2":true,"status!B4":true,"status!C2":true,"status!C4":true,"status!C5":true,"status!C6":true,"status!C7":true,"status!C8":true,"status!C9":true,"status!C10":true,"status!C11":true,"status!C12":true,"status!C13":true,"status!C14":true,"status!C15":true,"status!C16":true,"status!C17":true,"status!C18":true,"status!C19":true,"status!C20":true,"status!C21":true,"status!C22":true,"status!C23":true,"status!C24":true,"status!C25":true,"status!C26":true,"status!C27":true,"status!C28":true,"status!D2":true,"status!D4":true,"sheet15!B2":true,"sheet15!B4":true,"sheet15!B5":true,"sheet15!B6":true,"sheet15!B7":true,"sheet15!B8":true,"sheet15!B9":true,"sheet15!B10":true,"sheet15!B11":true,"sheet15!B12":true,"sheet15!B13":true,"sheet15!B14":true,"sheet15!B15":true,"sheet15!B16":true,"sheet15!B17":true,"sheet15!B18":true,"sheet15!B19":true,"sheet15!B20":true,"sheet15!B21":true,"sheet15!B22":true,"sheet15!B23":true,"sheet15!B24":true,"sheet15!B25":true,"sheet15!B26":true,"sheet15!B27":true,"sheet15!B28":true,"sheet15!C2":true,"sheet15!C4":true,"sheet15!C5":true,"sheet15!C6":true,"sheet15!C7":true,"sheet15!C8":true,"sheet15!C9":true,"sheet15!C10":true,"sheet15!C11":true,"sheet15!C12":true,"sheet15!C13":true,"sheet15!C14":true,"sheet15!C15":true,"sheet15!C16":true,"sheet15!C17":true,"sheet15!C18":true,"sheet15!C19":true,"sheet15!C20":true,"sheet15!C21":true,"sheet15!C22":true,"sheet15!C23":true,"sheet15!C24":true,"sheet15!C25":true,"sheet15!C26":true,"sheet15!C27":true,"sheet15!C28":true,"sheet15!D2":true,"sheet15!D4":true,"sheet15!D5":true,"sheet15!D6":true,"sheet15!D7":true,"sheet15!D8":true,"sheet15!D9":true,"sheet15!D10":true,"sheet15!D11":true,"sheet15!D12":true,"sheet15!D13":true,"sheet15!D14":true,"sheet15!D15":true,"sheet15!D16":true,"sheet15!D17":true,"sheet15!D18":true,"sheet15!D19":true,"sheet15!D20":true,"sheet15!D21":true,"sheet15!D22":true,"sheet15!D23":true,"sheet15!D24":true,"sheet15!D25":true,"sheet15!D26":true,"sheet15!D27":true,"sheet15!D28":true,"sheet10!B2":true,"sheet10!B4":true,"sheet10!B5":true,"sheet10!B6":true,"sheet10!B7":true,"sheet10!B8":true,"sheet10!B9":true,"sheet10!B10":true,"sheet10!B11":true,"sheet10!B12":true,"sheet10!B13":true,"sheet10!B14":true,"sheet10!B15":true,"sheet10!B16":true,"sheet10!B17":true,"sheet10!B18":true,"sheet10!B19":true,"sheet10!B20":true,"sheet10!B21":true,"sheet10!B22":true,"sheet10!B23":true,"sheet10!B24":true,"sheet10!B25":true,"sheet10!B26":true,"sheet10!B27":true,"sheet10!B28":true,"sheet10!C2":true,"sheet10!C4":true,"sheet10!C5":true,"sheet10!C6":true,"sheet10!C7":true,"sheet10!C8":true,"sheet10!C9":true,"sheet10!C10":true,"sheet10!C11":true,"sheet10!C12":true,"sheet10!C13":true,"sheet10!C14":true,"sheet10!C15":true,"sheet10!C16":true,"sheet10!C17":true,"sheet10!C18":true,"sheet10!C19":true,"sheet10!C20":true,"sheet10!C21":true,"sheet10!C22":true,"sheet10!C23":true,"sheet10!C24":true,"sheet10!C25":true,"sheet10!C26":true,"sheet10!C27":true,"sheet10!C28":true,"sheet10!D2":true,"sheet10!D4":true,"sheet10!D5":true,"sheet10!D6":true,"sheet10!D7":true,"sheet10!D8":true,"sheet10!D9":true,"sheet10!D10":true,"sheet10!D11":true,"sheet10!D12":true,"sheet10!D13":true,"sheet10!D14":true,"sheet10!D15":true,"sheet10!D16":true,"sheet10!D17":true,"sheet10!D18":true,"sheet10!D19":true,"sheet10!D20":true,"sheet10!D21":true,"sheet10!D22":true,"sheet10!D23":true,"sheet10!D24":true,"sheet10!D25":true,"sheet10!D26":true,"sheet10!D27":true,"sheet10!D28":true,"sheet11!B2":true,"sheet11!B4":true,"sheet11!B5":true,"sheet11!B6":true,"sheet11!B7":true,"sheet11!B8":true,"sheet11!B9":true,"sheet11!B10":true,"sheet11!B11":true,"sheet11!B12":true,"sheet11!B13":true,"sheet11!B14":true,"sheet11!B15":true,"sheet11!B16":true,"sheet11!B17":true,"sheet11!B18":true,"sheet11!B19":true,"sheet11!B20":true,"sheet11!B21":true,"sheet11!B22":true,"sheet11!B23":true,"sheet11!B24":true,"sheet11!B25":true,"sheet11!B26":true,"sheet11!B27":true,"sheet11!B28":true,"sheet11!C2":true,"sheet11!C4":true,"sheet11!C5":true,"sheet11!C6":true,"sheet11!C7":true,"sheet11!C8":true,"sheet11!C9":true,"sheet11!C10":true,"sheet11!C11":true,"sheet11!C12":true,"sheet11!C13":true,"sheet11!C14":true,"sheet11!C15":true,"sheet11!C16":true,"sheet11!C17":true,"sheet11!C18":true,"sheet11!C19":true,"sheet11!C20":true,"sheet11!C21":true,"sheet11!C22":true,"sheet11!C23":true,"sheet11!C24":true,"sheet11!C25":true,"sheet11!C26":true,"sheet11!C27":true,"sheet11!C28":true,"sheet11!D2":true,"sheet11!D4":true,"sheet11!D5":true,"sheet11!D6":true,"sheet11!D7":true,"sheet11!D8":true,"sheet11!D9":true,"sheet11!D10":true,"sheet11!D11":true,"sheet11!D12":true,"sheet11!D13":true,"sheet11!D14":true,"sheet11!D15":true,"sheet11!D16":true,"sheet11!D17":true,"sheet11!D18":true,"sheet11!D19":true,"sheet11!D20":true,"sheet11!D21":true,"sheet11!D22":true,"sheet11!D23":true,"sheet11!D24":true,"sheet11!D25":true,"sheet11!D26":true,"sheet11!D27":true,"sheet11!D28":true},"constraints":{"status!D5":["tc"],"status!D6":["tc"],"status!D7":["tc"],"status!D8":["tc"],"status!D9":["tc"],"status!D10":["tc"],"status!D11":["tc"],"status!D12":["tc"],"status!D13":["tc"],"status!D14":["tc"],"status!D15":["tc"],"status!D16":["tc"],"status!D17":["tc"],"status!D18":["tc"],"status!D19":["tc"],"status!D20":["tc"],"status!D21":["tc"],"status!D22":["tc"],"status!D23":["tc"],"status!D24":["tc"],"status!D25":["tc"],"status!D26":["tc"],"status!D27":["tc"],"status!D28":["tc"],"jul!B7":["tc"],"jul!B8":["tc"],"jul!B9":["tc"],"jul!B10":["tc"],"jul!B11":["tc"],"jul!B12":["tc"],"jul!B13":["tc"],"jul!B14":["tc"],"jul!B15":["tc"],"jul!B16":["tc"],"jul!B17":["tc"],"jul!B18":["tc"],"jul!B19":["tc"],"jul!B20":["tc"],"jul!B21":["tc"],"jul!B22":["tc"],"jul!B23":["tc"],"jul!B24":["tc"],"jul!B25":["tc"],"jul!B26":["tc"],"jul!B27":["tc"],"jul!B28":["tc"],"jul!B29":["tc"],"jul!B30":["tc"],"jul!B31":["tc"],"jul!B32":["tc"],"jul!B33":["tc"],"jul!B34":["tc"],"jul!B35":["tc"],"jul!B36":["tc"],"jul!B37":["tc"]}}} \ No newline at end of file diff --git a/Website/excelinterop/tmp/capbudgmsc.xls b/Website/excelinterop/tmp/capbudgmsc.xls deleted file mode 100644 index ab81275..0000000 Binary files a/Website/excelinterop/tmp/capbudgmsc.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/checkbook-register.xls b/Website/excelinterop/tmp/checkbook-register.xls deleted file mode 100644 index 36ea2ac..0000000 Binary files a/Website/excelinterop/tmp/checkbook-register.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/christmas-gift-budget.xls b/Website/excelinterop/tmp/christmas-gift-budget.xls deleted file mode 100644 index 681eb77..0000000 Binary files a/Website/excelinterop/tmp/christmas-gift-budget.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/ci_example1.xls b/Website/excelinterop/tmp/ci_example1.xls deleted file mode 100644 index 2604a71..0000000 Binary files a/Website/excelinterop/tmp/ci_example1.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/course-sign-in-sheet.xls b/Website/excelinterop/tmp/course-sign-in-sheet.xls deleted file mode 100644 index 083dc67..0000000 Binary files a/Website/excelinterop/tmp/course-sign-in-sheet.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/credit-card-payoff-calculator.xls b/Website/excelinterop/tmp/credit-card-payoff-calculator.xls deleted file mode 100644 index e69de29..0000000 diff --git a/Website/excelinterop/tmp/critical-path-method.xls b/Website/excelinterop/tmp/critical-path-method.xls deleted file mode 100644 index a7c383a..0000000 Binary files a/Website/excelinterop/tmp/critical-path-method.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/definitions.html b/Website/excelinterop/tmp/definitions.html deleted file mode 100644 index f32e80d..0000000 --- a/Website/excelinterop/tmp/definitions.html +++ /dev/null @@ -1 +0,0 @@ -
                  
                  
                  
     

    Definitions

     
      

    About You

      
         
       

    These are age related inputs required for retirement planning. Your Age is your current age. Desired Retirement Age is the age at which you wish to retire. Life Expectancy is the age at which retirement ends.

      
         
         
                  
      

    Retirement Savings

      
       


    Retirement Plans    

             These are plans such as 401K and IRA. Current Amount is the total amount you have already saved in retirement plans (such as 401K, IRA). Annual Contributions is the  total amount contributed annually to retirement plans (such as 401K, IRA). 

    Savings & Investments

             These are savings in savings and investment accounts which are not included in retirement plans such as 401K or IRA. Current Amount is the amount which is already saved and is available for retirement. Do not include amounts that may be used for non-retirement purposes such as college education, house purchase, etc. Annual Contribution is the total amount contributed annually into savings and investment accounts which are not included in Retirement Plans such as 401K, IRA etc.

      
         
         
                  
      

    Income After Retirement

      
       


    Social Security: If you expect to be paid a monthly or annual amount from government sources such as Social Security benefits, then you may enter values here. Monthly amount is the amount of Social Security benefit that you expect to receive at the beginning age in today's currency. Beginning age is the age at which you expect to begin receiving social security benefits. To estimate your social security benefit, you can visit this link.

    Pension: If you expect to be paid a monthly or annual amount from a Pension plan, then you may enter values here. Monthly amount is the amount of Pension benefit that you expect to receive at the beginning age in today's currency. Beginning age is the age at which you expect to begin receiving Pension benefits.

      
         
         
                  
      

    Expenses After Retirement

      
       

    Estimate your monthly living expenses after retirement in today's currency amounts. If you were retired today, how much would you expect to spend on different categories such as Housing & Utilities, Food & Beverages, Transportation, Healthcare, Entertainment, Education. For all other spending, include in the Miscellaneous category.

    Create a spending budget for retirement living.

      
         
         
                  
      

    Return on Investments

      
       

    Before Retirement: Before retirement, this is the annual rate of return you expect from your investments after taxes. 
    After Retirement: After retirement, this is the annual rate of return you expect from your investments after taxes. The rate of return after retirement may be lower than the rate of return before retirement because of more conservative investment choices to ensure a steady income during retirement. 

      
         
         
                  
      

    Advanced

      
       

    Inflation Rate: The expected annual inflation rate. 

    Tax Rate: The expected tax rate after retirement


      
         
         
                  
                  
    \ No newline at end of file diff --git a/Website/excelinterop/tmp/expense-reimbursement-form.xls b/Website/excelinterop/tmp/expense-reimbursement-form.xls deleted file mode 100644 index 5362bde..0000000 Binary files a/Website/excelinterop/tmp/expense-reimbursement-form.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/expense-tracking.xls b/Website/excelinterop/tmp/expense-tracking.xls deleted file mode 100644 index 734cf0c..0000000 Binary files a/Website/excelinterop/tmp/expense-tracking.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/fax-cover-sheet.xls b/Website/excelinterop/tmp/fax-cover-sheet.xls deleted file mode 100644 index ba63af9..0000000 Binary files a/Website/excelinterop/tmp/fax-cover-sheet.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/fiveyearbplan.xls b/Website/excelinterop/tmp/fiveyearbplan.xls deleted file mode 100644 index ff9ee90..0000000 Binary files a/Website/excelinterop/tmp/fiveyearbplan.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/gantt-chart_L.xls b/Website/excelinterop/tmp/gantt-chart_L.xls deleted file mode 100644 index 2309b95..0000000 Binary files a/Website/excelinterop/tmp/gantt-chart_L.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/gift-certificate-tracking-log.xls b/Website/excelinterop/tmp/gift-certificate-tracking-log.xls deleted file mode 100644 index 09874ec..0000000 Binary files a/Website/excelinterop/tmp/gift-certificate-tracking-log.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/globalbilling.msc.txt b/Website/excelinterop/tmp/globalbilling.msc.txt deleted file mode 100644 index 5544540..0000000 --- a/Website/excelinterop/tmp/globalbilling.msc.txt +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":10,"currentid":"sheet1","currentname":"bs(global)","sheetArr":{"sheet1":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:Introduction:f:3:c:3:bg:1:cf:1:colspan:2\ncell:C5:t:Customer record keeping is essential for all enterprises. For the firms involved in domestic and international trade, Global Billing Statement app caters to your billing needs.:colspan:2\ncell:C7:t:The billing sheet helps you keep a record of regular payments for a particular customer. The app allows you to list invoices, write descriptions and include amount details for numerous transactions as separate files for a number of customers. Further, it employs payment details to calculate the balance due. :bg:2:colspan:2\ncell:C9:t:The sheet comprises of the fields and columns explained as follows\\c:colspan:2\ncell:C11:t:Heading :f:2:c:3:bg:1:cf:1\ncell:D11:t:Description:f:2:c:3:bg:1:cf:1\ncell:C12:b:::1:\ncell:D12:b:::1:\ncell:B13:b::1::\ncell:C13:t:Bill to :b:1:1::1\ncell:D13:t:Details of the customer to whom the bill is directed.:b:1:1::1\ncell:E13:b::::1\ncell:B14:b::1::\ncell:C14:b::1::1\ncell:D14:b::1::1\ncell:E14:b::::1\ncell:B15:b::1::\ncell:C15:t:Statement Date:b::1::1:bg:2\ncell:D15:t:Date of the statement entry:b::1::1:bg:2\ncell:E15:b::::1\ncell:B16:b::1::\ncell:C16:b::1::1\ncell:D16:b::1::1\ncell:E16:b::::1\ncell:B17:b::1::\ncell:C17:t:Statement #:b::1::1\ncell:D17:t:Serial number of the statement:b::1::1\ncell:E17:b::::1\ncell:B18:b::1::\ncell:C18:b::1::1\ncell:D18:b::1::1\ncell:E18:b::::1\ncell:B19:b::1::\ncell:C19:t:Customer ID:b::1::1:bg:2\ncell:D19:t:ID number assigned to the customer:b::1::1:bg:2\ncell:E19:b::::1\ncell:B20:b::1::\ncell:C20:b::1::1\ncell:D20:b::1::1\ncell:E20:b::::1\ncell:B21:b::1::\ncell:C21:t:Remittance :b::1::1\ncell:D21:t:Details of the service/goods provider:b::1::1\ncell:E21:b::::1\ncell:B22:b::1::\ncell:C22:b::1::1\ncell:D22:b::1::1\ncell:E22:b::::1\ncell:B23:b::1::\ncell:C23:t:Summary :b::1:1:1:bg:2\ncell:D23:t:Details of balance due, payment due date and amount enclosed:b::1:1:1:bg:2\ncell:E23:b::::1\ncell:C24:b:1:::\ncell:D24:b:1:::\ncell:C26:t:Column name:f:2:c:3:bg:1:cf:1\ncell:D26:t:Description:f:2:c:3:bg:1:cf:1\ncell:C27:b:::1:\ncell:D27:b:::1:\ncell:B28:b::1::\ncell:C28:t:Date :b:1:1::1\ncell:D28:t:Date on which the transaction took place:b:1:1::1\ncell:E28:b::::1\ncell:B29:b::1::\ncell:C29:b::1::1\ncell:D29:b::1::1\ncell:E29:b::::1\ncell:B30:b::1::\ncell:C30:t:Type :b::1::1:bg:2\ncell:D30:t:The type of action taking place for your billing sub-account. For example, Payment. :b::1::1:bg:2\ncell:E30:b::::1\ncell:B31:b::1::\ncell:C31:b::1::1\ncell:D31:b::1::1\ncell:E31:b::::1\ncell:B32:b::1::\ncell:C32:t:Invoice :b::1::1\ncell:D32:t:Serial number of the Invoice :b::1::1\ncell:E32:b::::1\ncell:B33:b::1::\ncell:C33:b::1::1\ncell:D33:b::1::1\ncell:E33:b::::1\ncell:B34:b::1::\ncell:C34:t:Description :b::1::1:bg:2\ncell:D34:t:Details of the transaction:b::1::1:bg:2\ncell:E34:b::::1\ncell:B35:b::1::\ncell:C35:b::1::1\ncell:D35:b::1::1\ncell:E35:b::::1\ncell:B36:b::1::\ncell:C36:t:Payment :b::1::1\ncell:D36:t:The amount that has been paid:b::1::1\ncell:E36:b::::1\ncell:B37:b::1::\ncell:C37:b::1::1\ncell:D37:b::1::1\ncell:E37:b::::1\ncell:B38:b::1::\ncell:C38:t:Amount :b::1::1:bg:2\ncell:D38:t:The total amount that needs to be paid:b::1::1:bg:2\ncell:E38:b::::1\ncell:B39:b::1::\ncell:C39:b::1::1\ncell:D39:b::1::1\ncell:E39:b::::1\ncell:B40:b::1::\ncell:C40:t:Balance :b::1:1:1\ncell:D40:t:Remaining balance that the customer needs to pay.:b::1:1:1\ncell:E40:b::::1\ncell:C41:b:1:::\ncell:D41:b:1:::\ncell:C42:t:The current balance from billing i sheet gets automatically borrowed to the balance of the first entry of billing i+1 sheet. Here, i varies from 1-2 for Billing 1 to Billing 3 sheets. Similarly,customer details, remittance information and statement details should be entered only once in Billing Sheet 1.The corresponding value gets automatically populated in all the other Billing sheets. :colspan:2\ncell:C44:t:The invoice templates raise invoices for transactions of goods and services.:colspan:2\ncell:C45:t:The invoice sheets offer you with a range of templates for pro forma as well as service and/or goods invoices. Simply add the basic information about you and your clients along with specifics of the order.Taxes and totals are automatically calculated for you. So there's no extra work. Just add your invoice items and the app does the rest.:bg:2:colspan:2\ncell:C46:t:You can locally save the invoices as a file, and re-use it with minimal changes.:colspan:2\ncell:C47:t:Simply tap e-mail to send your files to customers instantly and get feedback from them. Alternatively, you can email the invoices and receipts to yourself. :bg:2:colspan:2\ncell:C49:t:The invoice sheets comprises of the fields and columns explained as follows\\c:colspan:2\ncell:C51:t:Heading :f:2:c:3:bg:1:cf:1\ncell:D51:t:Description:f:2:c:3:bg:1:cf:1\ncell:C52:b:::1:\ncell:D52:b:::1:\ncell:B53:b::1::\ncell:C53:t:Invoice Date :b:1:1::1\ncell:D53:t:Date on which the invoice has been entered.:b:1:1::1\ncell:E53:b::::1\ncell:B54:b::1::\ncell:C54:b::1::1\ncell:D54:b::1::1\ncell:E54:b::::1\ncell:B55:b::1::\ncell:C55:t:Invoice # :b::1::1:bg:2\ncell:D55:t:Serial number of the invoice:b::1::1:bg:2\ncell:E55:b::::1\ncell:B56:b::1::\ncell:C56:b::1::1\ncell:D56:b::1::1\ncell:E56:b::::1\ncell:B57:b::1::\ncell:C57:t:Bill To :b::1::1\ncell:D57:t:Details of the customer to whom the bill is directed.:b::1::1\ncell:E57:b::::1\ncell:B58:b::1::\ncell:C58:b::1::1\ncell:D58:b::1::1\ncell:E58:b::::1\ncell:B59:b::1::\ncell:C59:t:From :b::1:1:1:bg:2\ncell:D59:t:Details of the seller:b::1:1:1:bg:2\ncell:E59:b::::1\ncell:C60:b:1:::\ncell:D60:b:1:::\ncell:C63:t:Column :f:2:c:3:bg:1:cf:1\ncell:D63:t:Description:f:2:c:3:bg:1:cf:1\ncell:C64:b:::1:\ncell:D64:b:::1:\ncell:B65:b::1::\ncell:C65:t:Description :b:1:1::1\ncell:D65:t:Description of the charges:b:1:1::1\ncell:E65:b::::1\ncell:B66:b::1::\ncell:C66:b::1::1\ncell:D66:b::1::1\ncell:E66:b::::1\ncell:B67:b::1::\ncell:C67:t:Amount :b::1::1:bg:2\ncell:D67:t:Total amount that needs to be paid.:b::1::1:bg:2\ncell:E67:b::::1\ncell:B68:b::1::\ncell:C68:b::1::1\ncell:D68:b::1::1\ncell:E68:b::::1\ncell:B69:b::1::\ncell:C69:t:Hours :b::1::1\ncell:D69:t:Hours for which the services have been provided:b::1::1\ncell:E69:b::::1\ncell:B70:b::1::\ncell:C70:b::1::1\ncell:D70:b::1::1\ncell:E70:b::::1\ncell:B71:b::1::\ncell:C71:t:Rate :b::1::1:bg:2\ncell:D71:t:Amount charged per hour for the service:b::1::1:bg:2\ncell:E71:b::::1\ncell:B72:b::1::\ncell:C72:b::1::1\ncell:D72:b::1::1\ncell:E72:b::::1\ncell:B73:b::1::\ncell:C73:t:Quantity:b::1::1\ncell:D73:t:Units of goods being sold:b::1::1\ncell:E73:b::::1\ncell:B74:b::1::\ncell:C74:b::1::1\ncell:D74:b::1::1\ncell:E74:b::::1\ncell:B75:b::1::\ncell:C75:t:Price per unit :b::1:1:1:bg:2\ncell:D75:t:Price of one unit :b::1:1:1:bg:2\ncell:E75:b::::1\ncell:C76:b:1:::\ncell:D76:b:1:::\ncell:C78:t:If you need any further assistance in using the Global Billing Statement application, or would like to see some new features in the future versions of the application, please write to us at marketing@tickervalue.com. You can also meet us on Skype by sending a contact request to aspiring.investments:cf:1:colspan:2\ncol:A:w:10\ncol:B:w:10\ncol:C:w:130\ncol:D:w:380\nsheet:c:5:r:78:font:1:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* 10pt arial,helvetica,sans-serif\nfont:2:* 12pt *\nfont:3:* 18pt *\nlayout:1:padding:4px 4px 4px 4px;vertical-align:*;\n"},"name":"bs(global)","hidden":"0"},"sheet2":{"sheetstr":{"savestr":"version:1.5\ncell:B1:l:3:f:1\ncell:C1:l:4:f:1\ncell:D1:l:4:f:1\ncell:E1:l:4:f:1\ncell:F1:l:4:f:1\ncell:G1:l:4:f:1\ncell:H1:l:4:f:1\ncell:I1:l:4:f:1\ncell:J1:l:4:f:1\ncell:K1:l:4:f:1\ncell:L1:f:1\ncell:A2:l:2\ncell:B2:l:2:f:1\ncell:C2:l:4:f:1\ncell:D2:l:4:f:1\ncell:E2:l:4:f:1\ncell:F2:l:4:f:1\ncell:G2:l:4:f:1\ncell:H2:l:4:f:1\ncell:I2:l:4:f:1\ncell:J2:l:4:f:1\ncell:K2:l:4:f:1\ncell:L2:f:1\ncell:A3:l:2\ncell:B3:l:2:f:1\ncell:C3:t:Statement:l:4:f:5:c:3:bg:1:cf:1:colspan:8\ncell:D3:l:4:f:1\ncell:E3:l:4:f:1\ncell:F3:l:4:f:1\ncell:G3:l:4:f:1\ncell:H3:l:4:f:1\ncell:I3:l:4:f:1\ncell:J3:l:4:f:1:cf:3\ncell:K3:l:4:f:1\ncell:L3:f:1\ncell:A4:l:2\ncell:B4:l:2:f:1\ncell:C4:l:4:f:1:colspan:3\ncell:D4:l:4:f:1\ncell:E4:l:4:f:1\ncell:F4:l:4:f:1\ncell:G4:l:4:f:1\ncell:H4:l:4:f:1\ncell:I4:l:4:f:1\ncell:J4:l:4:f:1:cf:3\ncell:K4:l:4:f:1\ncell:L4:f:1\ncell:A5:l:2\ncell:B5:l:2:f:1\ncell:C5:t:[Company Name]:l:4:f:2:colspan:6\ncell:D5:t:Company Name:l:4:f:4:colspan:2\ncell:E5:l:4:f:4\ncell:F5:b:::2::l:4:f:4:colspan:3\ncell:G5:b:::2::l:4:f:1:colspan:2\ncell:H5:b:::2::l:4:f:1\ncell:I5:l:4:f:1\ncell:J5:l:4:f:1\ncell:K5:l:4:f:1\ncell:L5:f:1\ncell:A6:l:2\ncell:B6:l:2:f:1\ncell:C6:l:4:f:1\ncell:D6:l:4:f:1:colspan:2\ncell:E6:l:4:f:1\ncell:F6:l:4:f:1\ncell:G6:l:4:f:1\ncell:H6:l:4:f:1\ncell:I6:l:4:f:1\ncell:J6:l:4:f:1\ncell:K6:l:4:f:1\ncell:L6:f:1\ncell:A7:l:2\ncell:B7:l:2:f:1\ncell:C7:t:Bill To\\c:l:4:f:3:cf:2\ncell:D7:t:[Customer Name]:l:4:f:3:bg:2:colspan:3\ncell:E7:l:4:f:3:bg:2\ncell:F7:b:::2::l:4:f:3:bg:2\ncell:G7:l:4:f:3\ncell:H7:t:Statement Date:l:4:f:3:colspan:2\ncell:I7:t:Statement Date:l:4:f:3:cf:3:ntvf:4\ncell:J7:b:::1::l:4:f:3:cf:2:ntvf:3\ncell:K7:l:4:f:1\ncell:L7:f:1\ncell:A8:l:2\ncell:B8:l:2:f:1\ncell:C8:l:4:f:3\ncell:D8:t:[Street Address]:l:4:f:3:cf:2:colspan:3\ncell:E8:l:4:f:3\ncell:F8:b:::2::l:4:f:3\ncell:G8:l:4:f:3:cf:2\ncell:H8:t:Statement #:l:4:f:3:bg:2:colspan:2\ncell:I8:t:Statement #:l:4:f:3:bg:2:cf:3:ntvf:4\ncell:J8:b:1:3:1:3:l:4:f:3:bg:2:cf:2\ncell:K8:l:4:f:1\ncell:L8:f:1\ncell:A9:l:2\ncell:B9:l:2:f:1\ncell:C9:l:4:f:3\ncell:D9:t:[City, ST ZIP]:l:4:f:3:bg:2:cf:2:colspan:3\ncell:E9:l:4:f:3:bg:2\ncell:F9:b:::2::l:4:f:3:bg:2\ncell:G9:l:4:f:3:cf:2\ncell:H9:t:Customer ID:l:4:f:3:colspan:2\ncell:I9:t:Customer ID:l:4:f:3:cf:3:ntvf:4\ncell:J9:b:1:3:1:3:l:4:f:3:cf:2\ncell:K9:l:4:f:1\ncell:L9:f:1\ncell:A10:l:2\ncell:B10:l:2:f:1\ncell:C10:l:4:f:3\ncell:D10:t:[Phone]:l:4:f:3:colspan:3\ncell:E10:l:4:f:3\ncell:F10:b:::2::l:4:f:3\ncell:G10:l:4:f:3\ncell:H10:l:4:f:3\ncell:I10:l:4:f:3\ncell:J10:b:1::::l:4:f:3\ncell:K10:l:4:f:1\ncell:L10:f:1\ncell:A11:l:2\ncell:B11:l:2:f:1\ncell:C11:l:4:f:1\ncell:D11:l:4:f:1:cf:2\ncell:E11:l:4:f:1\ncell:F11:l:4:f:1:cf:2\ncell:G11:l:4:f:1:cf:2\ncell:H11:l:4:f:1\ncell:I11:l:4:f:1\ncell:J11:l:4:f:1\ncell:K11:l:4:f:1\ncell:L11:f:1\ncell:A12:l:2\ncell:B12:l:2:f:1\ncell:C12:t:Remittance:l:4:f:3:c:3:bg:1:cf:1:colspan:4\ncell:D12:l:4:f:3:c:3:bg:1:cf:1\ncell:E12:l:4:f:3:c:3:bg:1:cf:1\ncell:F12:l:4:f:3:c:3:bg:1:cf:1\ncell:G12:l:4:f:3\ncell:H12:t:Account Summary:l:4:f:3:c:3:bg:1:cf:1:colspan:3:rowspan:1\ncell:I12:t::l:4:f:1:cf:2\ncell:J12:t::l:4:f:1:cf:2\ncell:K12:l:4:f:1\ncell:L12:f:1\ncell:A13:l:2\ncell:B13:l:2:f:1\ncell:C13:t:To ensure proper credit, please enclose a copy of this statement with your check and remit to\\c:l:4:f:2:colspan:4:rowspan:2\ncell:D13:l:4:f:2\ncell:E13:l:4:f:2\ncell:F13:l:4:f:2\ncell:G13:l:4:f:2\ncell:H13:t:Balance Due:l:4:f:7:colspan:2\ncell:I13:t:Balance Due:l:4:f:7:cf:3\ncell:J13:vtf:n:0:J40:b:::2::l:4:f:7:ntvf:1\ncell:K13:l:4:f:2\ncell:L13:f:1\ncell:A14:l:2\ncell:B14:l:2:f:1\ncell:C14:vt:th:with your check and remit to\\c:l:4:f:2:colspan:4\ncell:D14:l:4:f:2\ncell:E14:l:4:f:2\ncell:F14:l:4:f:2\ncell:G14:l:4:f:2\ncell:H14:t:Payment Due Date:l:4:f:7:bg:2:colspan:2\ncell:I14:t:Payment Due Date:l:4:f:7:bg:2:cf:3\ncell:J14:b:2::2::l:4:f:7:bg:2:cf:1:ntvf:4\ncell:K14:l:4:f:2\ncell:L14:f:1\ncell:A15:l:2\ncell:B15:l:2:f:1\ncell:C15:t:[Company Name]:l:4:f:2:colspan:4\ncell:D15:t:[Company Name]:l:4:f:2\ncell:E15:l:4:f:2\ncell:F15:b:2:2:2:2:l:4:f:2\ncell:G15:l:4:f:2\ncell:H15:t:Amount Enclosed $:l:4:f:7:colspan:2\ncell:I15:t:Amount Enclosed $:l:4:f:7:cf:3\ncell:J15:b:2::2::l:4:f:7:cf:3:ntvf:2\ncell:K15:l:4:f:2\ncell:L15:f:1\ncell:A16:l:2\ncell:B16:l:2:f:1\ncell:C16:t:[Street Address]:l:4:f:2:bg:2:colspan:4\ncell:D16:t:[Street Address]:l:4:f:2:bg:2\ncell:E16:l:4:f:2:bg:2\ncell:F16:b::2:2:2:l:4:f:2:bg:2\ncell:G16:l:4:f:2\ncell:H16:vtf:t:.:IF(J13<0,\"Negative Balance. Do Not Pay\",\".\"):l:4:f:2:colspan:3\ncell:I16:l:4:f:2\ncell:J16:vtf:t:.:IF(J13<0,\"Negative Balance. Do Not Pay\",\".\"):b:2::::l:4:f:2:cf:3\ncell:K16:l:4:f:2\ncell:L16:f:1\ncell:A17:l:2\ncell:B17:l:2:f:1\ncell:C17:t:[City, ST Zip]:l:4:f:2:colspan:4\ncell:D17:t:[City, ST Zip]:l:4:f:2\ncell:E17:l:4:f:2\ncell:F17:b::2:2:2:l:4:f:2\ncell:G17:l:4:f:2\ncell:H17:t:Make all checks payable to [Company Name]:l:5:f:2:cf:1:colspan:3:rowspan:2\ncell:I17:t::l:4:f:2:cf:1\ncell:J17:t::l:4:f:2:cf:1\ncell:K17:l:4:f:2\ncell:L17:f:1\ncell:A18:l:2\ncell:B18:l:2:f:1\ncell:C18:t:Please write your Customer ID on your check.:l:4:f:2:cf:2:colspan:4\ncell:D18:l:4:f:2\ncell:E18:l:4:f:2\ncell:F18:l:4:f:2\ncell:G18:l:4:f:2\ncell:H18:l:4:f:2:cf:1:colspan:3:rowspan:1\ncell:I18:t::l:4:f:2:cf:1\ncell:J18:t::l:4:f:2:cf:1\ncell:K18:l:4:f:2\ncell:L18:f:1\ncell:A19:l:2\ncell:B19:l:2:f:1\ncell:C19:l:4:f:1\ncell:D19:l:4:f:1:cf:2\ncell:E19:l:4:f:1\ncell:F19:l:4:f:1:cf:2\ncell:G19:l:4:f:1:cf:2\ncell:H19:l:4:f:1\ncell:I19:l:4:f:1\ncell:J19:l:4:f:1\ncell:K19:l:4:f:1\ncell:L19:f:1\ncell:A20:l:2\ncell:B20:l:2:f:1\ncell:C20:l:4:f:1\ncell:D20:l:4:f:1:cf:2\ncell:E20:l:4:f:1\ncell:F20:l:4:f:1:cf:2\ncell:G20:l:4:f:1:cf:2\ncell:H20:l:4:f:1\ncell:I20:l:4:f:1\ncell:J20:l:4:f:1\ncell:K20:l:4:f:1\ncell:L20:f:1\ncell:A21:l:2\ncell:B21:l:2:f:1\ncell:C21:t:Account Activity:l:4:f:8:c:3:bg:1:cf:1:colspan:3\ncell:D21:l:4:f:1\ncell:E21:l:4:f:1\ncell:F21:l:4:f:1\ncell:G21:l:4:f:1\ncell:H21:l:4:f:1\ncell:I21:l:4:f:1\ncell:J21:l:4:f:1\ncell:K21:l:4:f:1\ncell:L21:f:1\ncell:A22:l:2\ncell:B22:l:2:f:1\ncell:C22:t:Date:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:D22:t:Type:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:E22:t:Invoice:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:F22:t:Description:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1:colspan:2\ncell:G22:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:H22:t:Payment:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:I22:t:Amount:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:J22:t:Balance:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:K22:l:4:f:1\ncell:L22:f:1\ncell:A23:l:2\ncell:B23:b::2:::l:2:f:1\ncell:C23:b::2:3:2:l:4:f:6:ntvf:3\ncell:D23:t:Balance:b::2:3:2:l:4:f:6:cf:1:colspan:6\ncell:E23:b::2:3:2:l:4:f:6:cf:2\ncell:F23:t:Balance Forward:b::2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G23:b::2:3:2:l:4:f:6\ncell:H23:b::2:3:2:l:4:f:6:ntvf:2\ncell:I23:b::2:3:2:l:4:f:6:ntvf:2\ncell:J23:b:3:2:3:2:l:4:f:6\ncell:K23:b::::2:l:4:f:1\ncell:L23:f:1\ncell:A24:l:2\ncell:B24:b::2:::l:2:f:1\ncell:C24:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D24:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E24:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F24:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G24:b:3:2:3:2:l:4:f:6:bg:2\ncell:H24:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I24:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J24:vtf:t: :IF(AND(ISBLANK(H24),ISBLANK(I24)),\" \",I24-H24):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K24:b::::2:l:4:f:1\ncell:L24:f:1\ncell:A25:l:2\ncell:B25:b::2:::l:2:f:1\ncell:C25:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D25:b:5:2:3:2:l:4:f:6:cf:2\ncell:E25:b:5:2:3:2:l:4:f:6:cf:2\ncell:F25:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G25:b:5:2:3:2:l:4:f:6\ncell:H25:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I25:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J25:vtf:t: :IF(AND(ISBLANK(H25),ISBLANK(I25)),\" \",I25-H25):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K25:b::::2:l:4:f:1\ncell:L25:f:1\ncell:A26:l:2\ncell:B26:b::2:::l:2:f:1\ncell:C26:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D26:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E26:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F26:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G26:b:3:2:3:2:l:4:f:6:bg:2\ncell:H26:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I26:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J26:vtf:t: :IF(AND(ISBLANK(H26),ISBLANK(I26)),\" \",I26-H26):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K26:b::::2:l:4:f:1\ncell:L26:f:1\ncell:A27:l:2\ncell:B27:b::2:::l:2:f:1\ncell:C27:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D27:b:5:2:3:2:l:4:f:6:cf:2\ncell:E27:b:5:2:3:2:l:4:f:6:cf:2\ncell:F27:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G27:b:5:2:3:2:l:4:f:6\ncell:H27:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I27:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J27:vtf:t: :IF(AND(ISBLANK(H27),ISBLANK(I27)),\" \",I27-H27):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K27:b::::2:l:4:f:1\ncell:L27:f:1\ncell:A28:l:2\ncell:B28:b::2:::l:2:f:1\ncell:C28:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D28:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E28:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F28:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G28:b:3:2:3:2:l:4:f:6:bg:2\ncell:H28:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I28:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J28:vtf:t: :IF(AND(ISBLANK(H28),ISBLANK(I28)),\" \",I28-H28):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K28:b::::2:l:4:f:1\ncell:L28:f:1\ncell:A29:l:2\ncell:B29:b::2:::l:2:f:1\ncell:C29:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D29:b:5:2:3:2:l:4:f:6:cf:2\ncell:E29:b:5:2:3:2:l:4:f:6:cf:2\ncell:F29:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G29:b:5:2:3:2:l:4:f:6\ncell:H29:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I29:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J29:vtf:t: :IF(AND(ISBLANK(H29),ISBLANK(I29)),\" \",I29-H29):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K29:b::::2:l:4:f:1\ncell:L29:f:1\ncell:A30:l:2\ncell:B30:b::2:::l:2:f:1\ncell:C30:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D30:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E30:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F30:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G30:b:3:2:3:2:l:4:f:6:bg:2\ncell:H30:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I30:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J30:vtf:t: :IF(AND(ISBLANK(H30),ISBLANK(I30)),\" \",I30-H30):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K30:b::::2:l:4:f:1\ncell:L30:f:1\ncell:A31:l:2\ncell:B31:b::2:::l:2:f:1\ncell:C31:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D31:b:5:2:3:2:l:4:f:6:cf:2\ncell:E31:b:5:2:3:2:l:4:f:6:cf:2\ncell:F31:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G31:b:5:2:3:2:l:4:f:6\ncell:H31:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I31:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J31:vtf:t: :IF(AND(ISBLANK(H31),ISBLANK(I31)),\" \",I31-H31):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K31:b::::2:l:4:f:1\ncell:L31:f:1\ncell:A32:l:2\ncell:B32:b::2:::l:2:f:1\ncell:C32:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D32:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E32:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F32:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G32:b:3:2:3:2:l:4:f:6:bg:2\ncell:H32:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I32:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J32:vtf:t: :IF(AND(ISBLANK(H32),ISBLANK(I32)),\" \",I32-H32):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K32:b::::2:l:4:f:1\ncell:L32:f:1\ncell:A33:l:2\ncell:B33:b::2:::l:2:f:1\ncell:C33:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D33:b:5:2:3:2:l:4:f:6:cf:2\ncell:E33:b:5:2:3:2:l:4:f:6:cf:2\ncell:F33:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G33:b:5:2:3:2:l:4:f:6\ncell:H33:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I33:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J33:vtf:t: :IF(AND(ISBLANK(H33),ISBLANK(I33)),\" \",I33-H33):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K33:b::::2:l:4:f:1\ncell:L33:f:1\ncell:A34:l:2\ncell:B34:b::2:::l:2:f:1\ncell:C34:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D34:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E34:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F34:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G34:b:3:2:3:2:l:4:f:6:bg:2\ncell:H34:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I34:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J34:vtf:t: :IF(AND(ISBLANK(H34),ISBLANK(I34)),\" \",I34-H34):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K34:b::::2:l:4:f:1\ncell:L34:f:1\ncell:A35:l:2\ncell:B35:b::2:::l:2:f:1\ncell:C35:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D35:b:5:2:3:2:l:4:f:6:cf:2\ncell:E35:b:5:2:3:2:l:4:f:6:cf:2\ncell:F35:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G35:b:5:2:3:2:l:4:f:6\ncell:H35:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I35:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J35:vtf:t: :IF(AND(ISBLANK(H35),ISBLANK(I35)),\" \",I35-H35):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K35:b::::2:l:4:f:1\ncell:L35:f:1\ncell:A36:l:2\ncell:B36:b::2:::l:2:f:1\ncell:C36:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D36:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E36:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F36:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G36:b:3:2:3:2:l:4:f:6:bg:2\ncell:H36:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I36:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J36:vtf:t: :IF(AND(ISBLANK(H36),ISBLANK(I36)),\" \",I36-H36):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K36:b::::2:l:4:f:1\ncell:L36:f:1\ncell:A37:l:2\ncell:B37:b::2:::l:2:f:1\ncell:C37:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D37:b:5:2:3:2:l:4:f:6:cf:2\ncell:E37:b:5:2:3:2:l:4:f:6:cf:2\ncell:F37:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G37:b:5:2:3:2:l:4:f:6\ncell:H37:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I37:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J37:vtf:t: :IF(AND(ISBLANK(H37),ISBLANK(I37)),\" \",I37-H37):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K37:b::::2:l:4:f:1\ncell:L37:f:1\ncell:A38:l:2\ncell:B38:b::2:::l:2:f:1\ncell:C38:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D38:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E38:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F38:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G38:b:3:2:3:2:l:4:f:6:bg:2\ncell:H38:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I38:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J38:vtf:t: :IF(AND(ISBLANK(H38),ISBLANK(I38)),\" \",I38-H38):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K38:b::::2:l:4:f:1\ncell:L38:f:1\ncell:A39:l:2\ncell:B39:b::2:::l:2:f:1\ncell:C39:b:3:2:1:2:l:4:f:6:ntvf:3\ncell:D39:b:3:2:1:2:l:4:f:6:cf:2\ncell:E39:b:3:2:1:2:l:4:f:6:cf:2\ncell:F39:b:3:2:1:2:l:4:f:6:cf:2:colspan:2\ncell:G39:b:3:2:1:2:l:4:f:6\ncell:H39:b:3:2:1:2:l:4:f:6:ntvf:2\ncell:I39:b:3:2:1:2:l:4:f:6:ntvf:2\ncell:J39:vtf:t: :IF(AND(ISBLANK(H39),ISBLANK(I39)),\" \",I39-H39):b:3:2:1:2:l:4:f:6:ntvf:2\ncell:K39:b::::2:l:4:f:1\ncell:L39:f:1\ncell:A40:l:2\ncell:B40:l:2:f:1\ncell:C40:l:4:f:1\ncell:D40:l:4:f:1\ncell:E40:l:4:f:1:ntvf:2\ncell:F40:l:4:f:1:cf:3\ncell:G40:l:4:f:1:cf:3\ncell:H40:t:Current Balance\\c:b:2::2::l:4:f:7:cf:3:colspan:2\ncell:I40:t:Current Balance\\c:b:2::2::l:4:f:7:cf:3:ntvf:2\ncell:J40:vtf:n:0:SUM(J23\\cJ39):b:2::2::l:4:f:7:ntvf:1\ncell:K40:l:4:f:1\ncell:L40:f:1\ncell:A41:l:2\ncell:B41:l:2:f:1\ncell:C41:l:4:f:1\ncell:D41:l:4:f:1\ncell:E41:l:4:f:1\ncell:F41:l:4:f:1\ncell:G41:l:4:f:1\ncell:H41:b:2::::l:4:f:1\ncell:I41:b:2::::l:4:f:1\ncell:J41:b:2::::l:4:f:1\ncell:K41:l:4:f:1\ncell:L41:f:1\ncell:A42:l:2\ncell:B42:l:2:f:1\ncell:C42:t:If you have any questions about this statement, please contact:l:4:f:2:cf:1:colspan:8:rowspan:1\ncell:D42:t::l:4:f:1:cf:1\ncell:E42:t::l:4:f:1:cf:1\ncell:F42:t::l:4:f:1:cf:1\ncell:G42:t::l:4:f:1:cf:1\ncell:H42:t::l:4:f:1:cf:1\ncell:I42:t::l:4:f:1:cf:1\ncell:J42:t::l:4:f:1:cf:1\ncell:K42:l:4:f:1\ncell:L42:l:1:f:1\ncell:A43:l:2\ncell:B43:l:2:f:1\ncell:C43:t:[Name], [Street Address],[ City, ST ZiP]:l:4:f:2:cf:1:colspan:8\ncell:D43:t::l:4:f:2:cf:1\ncell:E43:t::l:4:f:2:cf:1\ncell:F43:t::l:4:f:2:cf:1\ncell:G43:t::l:4:f:2:cf:1\ncell:H43:b:::2::l:4:f:2:cf:2:colspan:3\ncell:I43:t::l:4:f:1:cf:1\ncell:J43:t::l:4:f:1:cf:1\ncell:K43:l:4:f:1\ncell:L43:l:1:f:1\ncell:A44:l:2\ncell:B44:l:2:f:1\ncell:C44:t:Phone[000-000-0000], Fax[000-000-0000], [Email]:l:4:f:2:cf:1:colspan:8\ncell:D44:t::l:4:f:2:cf:1\ncell:E44:t::l:4:f:2:cf:1\ncell:F44:t::l:4:f:2:cf:1\ncell:G44:t::l:4:f:2:cf:1\ncell:H44:b:::2::l:4:f:2:cf:2:colspan:3\ncell:I44:t::l:4:f:1:cf:1\ncell:J44:t::l:4:f:1:cf:1\ncell:K44:l:4:f:1\ncell:L44:l:1:f:1\ncell:A45:l:2\ncell:B45:l:2:f:1\ncell:C45:l:4:f:1\ncell:D45:l:4:f:1\ncell:E45:l:4:f:1\ncell:F45:l:4:f:1\ncell:G45:l:4:f:1\ncell:H45:l:4:f:1\ncell:I45:l:4:f:1\ncell:J45:l:4:f:1\ncell:K45:l:4:f:1\ncell:L45:l:1:f:1\ncell:A46:l:2\ncell:B46:l:2:f:1\ncell:C46:t:Thank You For Business:l:4:f:7:cf:1:colspan:8:rowspan:1\ncell:D46:t::l:4:f:1:cf:1\ncell:E46:t::l:4:f:1:cf:1\ncell:F46:t::l:4:f:1:cf:1\ncell:G46:t::l:4:f:1:cf:1\ncell:H46:t::l:4:f:1:cf:1\ncell:I46:t::l:4:f:1:cf:1\ncell:J46:t::l:4:f:1:cf:1\ncell:K46:l:4:f:1\ncell:L46:f:1\ncell:A47:l:2\ncell:B47:l:2:f:1\ncell:C47:l:4:f:1\ncell:D47:l:4:f:1\ncell:E47:l:4:f:1\ncell:F47:l:4:f:1\ncell:G47:l:4:f:1\ncell:H47:l:4:f:1\ncell:I47:l:4:f:1\ncell:J47:l:4:f:1\ncell:K47:l:4:f:1\ncell:L47:f:1\ncell:A48:l:2\ncell:B48:l:2:f:1\ncell:C48:l:4:f:1\ncell:D48:l:4:f:1\ncell:E48:l:4:f:1\ncell:F48:l:4:f:1\ncell:G48:l:4:f:1\ncell:H48:l:4:f:1\ncell:I48:l:4:f:1\ncell:J48:l:4:f:1\ncell:K48:l:4:f:1\ncell:L48:f:1\ncell:A49:l:2\ncell:B49:l:2\ncell:C49:l:4\ncell:D49:l:4\ncell:E49:l:4\ncell:F49:l:4\ncell:G49:l:4\ncell:H49:l:4\ncell:I49:l:4\ncell:J49:l:4\ncell:K49:l:4\ncell:A50:l:2\ncell:B50:l:2\ncell:C50:l:4\ncell:D50:l:4\ncell:E50:l:4\ncell:F50:l:4\ncell:G50:l:4\ncell:H50:l:4\ncell:I50:l:4\ncell:J50:l:4\ncell:K50:l:4\ncol:A:w:10\ncol:B:w:10\ncol:C:w:58\ncol:D:w:50\ncol:E:w:66\ncol:F:w:96\ncol:G:w:30\ncol:H:w:72\ncol:I:w:72\ncol:J:w:75\ncol:K:w:55\ncol:L:w:75\nrow:1:h:36\nrow:2:h:36\nrow:3:h:36\nrow:12:h:16.5\nrow:13:h:16.5\nrow:15:h:18\nrow:21:h:18\nrow:46:h:18\nsheet:c:12:r:50:h:15:w:58:needsrecalc:yes\nborder:1:1px solid rgb(0, 0, 0)\nborder:2:1px solid rgb(0,0,0)\nborder:3:1px solid rgb(192,192,192)\nborder:4:1px solid rgb(255, 255, 255)\nborder:5:thin solid rgb(192,192,192)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* * arial,helvetica,sans-serif\nfont:2:* 10pt arial,helvetica,sans-serif\nfont:3:* 11pt arial,helvetica,sans-serif\nfont:4:* 12pt arial,helvetica,sans-serif\nfont:5:* 18pt arial,helvetica,sans-serif\nfont:6:* 9pt arial,helvetica,sans-serif\nfont:7:normal normal 11pt arial,helvetica,sans-serif\nfont:8:normal normal 12pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:0px 0px 0px 0px;vertical-align:*;\nlayout:3:padding:0px 0px 0px 0px;vertical-align:bottom;\nlayout:4:padding:4px 4px 4px 4px;vertical-align:bottom;\nlayout:5:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:\"$\"#,##0.00\nvalueformat:2:#,##0.00\nvalueformat:3:m/d/yy\nvalueformat:4:mm-dd-yy\n"},"name":"statement","hidden":"0"},"sheet3":{"sheetstr":{"savestr":"version:1.5\ncell:B1:l:3:f:1\ncell:C1:l:4:f:1\ncell:D1:l:4:f:1\ncell:E1:l:4:f:1\ncell:F1:l:4:f:1\ncell:G1:l:4:f:1\ncell:H1:l:4:f:1\ncell:I1:l:4:f:1\ncell:J1:l:4:f:1\ncell:K1:l:4:f:1\ncell:L1:f:1\ncell:A2:l:2\ncell:B2:l:2:f:1\ncell:C2:l:4:f:1\ncell:D2:l:4:f:1\ncell:E2:l:4:f:1\ncell:F2:l:4:f:1\ncell:G2:l:4:f:1\ncell:H2:l:4:f:1\ncell:I2:l:4:f:1\ncell:J2:l:4:f:1\ncell:K2:l:4:f:1\ncell:L2:f:1\ncell:A3:l:2\ncell:B3:l:2:f:1\ncell:C3:vtf:t:Statement:if(statement!C3=\"\",\"\",statement!C3):l:4:f:5:c:3:bg:1:cf:1:colspan:8\ncell:D3:l:4:f:1\ncell:E3:l:4:f:1\ncell:F3:l:4:f:1\ncell:G3:l:4:f:1\ncell:H3:l:4:f:1\ncell:I3:l:4:f:1\ncell:J3:l:4:f:1:cf:3\ncell:K3:l:4:f:1\ncell:L3:f:1\ncell:A4:l:2\ncell:B4:l:2:f:1\ncell:C4:l:4:f:1:colspan:3\ncell:D4:l:4:f:1\ncell:E4:l:4:f:1\ncell:F4:l:4:f:1\ncell:G4:l:4:f:1\ncell:H4:l:4:f:1\ncell:I4:l:4:f:1\ncell:J4:l:4:f:1:cf:3\ncell:K4:l:4:f:1\ncell:L4:f:1\ncell:A5:l:2\ncell:B5:l:2:f:1\ncell:C5:vtf:t:[Company Name]:IF(STATEMENT!C5=\"\",\"\",STATEMENT!C5):l:4:f:2:colspan:6\ncell:D5:t:Company Name:l:4:f:4:colspan:2\ncell:E5:l:4:f:4\ncell:F5:b:::2::l:4:f:4:colspan:3\ncell:G5:b:::2::l:4:f:1:colspan:2\ncell:H5:b:::2::l:4:f:1\ncell:I5:l:4:f:1\ncell:J5:l:4:f:1\ncell:K5:l:4:f:1\ncell:L5:f:1\ncell:A6:l:2\ncell:B6:l:2:f:1\ncell:C6:l:4:f:1\ncell:D6:l:4:f:1:colspan:2\ncell:E6:l:4:f:1\ncell:F6:l:4:f:1\ncell:G6:l:4:f:1\ncell:H6:l:4:f:1\ncell:I6:l:4:f:1\ncell:J6:l:4:f:1\ncell:K6:l:4:f:1\ncell:L6:f:1\ncell:A7:l:2\ncell:B7:l:2:f:1\ncell:C7:vtf:t:Bill To\\c:IF(STATEMENT!C7=\"\",\"\",STATEMENT!C7):l:4:f:3:cf:2\ncell:D7:vtf:t:[Customer Name]:IF(STATEMENT!D7=\"\",\"\",STATEMENT!D7):l:4:f:3:bg:2:colspan:3\ncell:E7:l:4:f:3:bg:2\ncell:F7:b:::2::l:4:f:3:bg:2\ncell:G7:l:4:f:3\ncell:H7:vtf:t:Statement Date:IF(STATEMENT!H7=\"\",\"\",STATEMENT!H7):l:4:f:3:colspan:2\ncell:I7:t:Statement Date:l:4:f:3:cf:3:ntvf:4\ncell:J7:vtf:t::IF(STATEMENT!J7=\"\",\"\",STATEMENT!J7):b:::1::l:4:f:3:cf:2:ntvf:3\ncell:K7:l:4:f:1\ncell:L7:f:1\ncell:A8:l:2\ncell:B8:l:2:f:1\ncell:C8:l:4:f:3\ncell:D8:vtf:t:[Street Address]:IF(STATEMENT!D8=\"\",\"\",STATEMENT!D8):l:4:f:3:cf:2:colspan:3\ncell:E8:l:4:f:3\ncell:F8:b:::2::l:4:f:3\ncell:G8:l:4:f:3:cf:2\ncell:H8:vtf:t:Statement #:IF(STATEMENT!H8=\"\",\"\",STATEMENT!H8):l:4:f:3:bg:2:colspan:2\ncell:I8:t:Statement #:l:4:f:3:bg:2:cf:3:ntvf:4\ncell:J8:vtf:t::IF(STATEMENT!J8=\"\",\"\",STATEMENT!J8):b:1:3:1:3:l:4:f:3:bg:2:cf:2\ncell:K8:l:4:f:1\ncell:L8:f:1\ncell:A9:l:2\ncell:B9:l:2:f:1\ncell:C9:l:4:f:3\ncell:D9:vtf:t:[City, ST ZIP]:IF(STATEMENT!D9=\"\",\"\",STATEMENT!D9):l:4:f:3:bg:2:cf:2:colspan:3\ncell:E9:l:4:f:3:bg:2\ncell:F9:b:::2::l:4:f:3:bg:2\ncell:G9:l:4:f:3:cf:2\ncell:H9:vtf:t:Customer ID:IF(STATEMENT!H9=\"\",\"\",STATEMENT!H9):l:4:f:3:colspan:2\ncell:I9:t:Customer ID:l:4:f:3:cf:3:ntvf:4\ncell:J9:vtf:t::IF(STATEMENT!J9=\"\",\"\",STATEMENT!J9):b:1:3:1:3:l:4:f:3:cf:2\ncell:K9:l:4:f:1\ncell:L9:f:1\ncell:A10:l:2\ncell:B10:l:2:f:1\ncell:C10:l:4:f:3\ncell:D10:vtf:t:[Phone]:IF(STATEMENT!D10=\"\",\"\",STATEMENT!D10):l:4:f:3:colspan:3\ncell:E10:l:4:f:3\ncell:F10:b:::2::l:4:f:3\ncell:G10:l:4:f:3\ncell:H10:l:4:f:3\ncell:I10:l:4:f:3\ncell:J10:b:1::::l:4:f:3\ncell:K10:l:4:f:1\ncell:L10:f:1\ncell:A11:l:2\ncell:B11:l:2:f:1\ncell:C11:l:4:f:1\ncell:D11:l:4:f:1:cf:2\ncell:E11:l:4:f:1\ncell:F11:l:4:f:1:cf:2\ncell:G11:l:4:f:1:cf:2\ncell:H11:l:4:f:1\ncell:I11:l:4:f:1\ncell:J11:l:4:f:1\ncell:K11:l:4:f:1\ncell:L11:f:1\ncell:A12:l:2\ncell:B12:l:2:f:1\ncell:C12:vtf:t:Remittance:IF(STATEMENT!C12=\"\",\"\",STATEMENT!C12):l:4:f:4:c:3:bg:1:cf:1:colspan:4\ncell:D12:l:4:f:4:c:3:bg:1:cf:1\ncell:E12:l:4:f:4:c:3:bg:1:cf:1\ncell:F12:l:4:f:4:c:3:bg:1:cf:1\ncell:G12:l:4:f:4\ncell:H12:vtf:t:Account Summary:IF(STATEMENT!H12=\"\",\"\",STATEMENT!H12):l:4:f:4:c:3:bg:1:cf:1:colspan:3:rowspan:1\ncell:I12:t::l:4:f:1:cf:2\ncell:J12:t::l:4:f:1:cf:2\ncell:K12:l:4:f:1\ncell:L12:f:1\ncell:A13:l:2\ncell:B13:l:2:f:1\ncell:C13:vtf:t:To ensure proper credit, please enclose a copy of this statement with your check and remit to\\c:IF(STATEMENT!C13=\"\",\"\",STATEMENT!C13):l:4:f:2:colspan:4:rowspan:2\ncell:D13:l:4:f:2\ncell:E13:l:4:f:2\ncell:F13:l:4:f:2\ncell:G13:l:4:f:2\ncell:H13:vtf:t:Balance Due:IF(STATEMENT!H13=\"\",\"\",STATEMENT!H13):l:4:f:3:colspan:2\ncell:I13:t:Balance Due:l:4:f:3:cf:3\ncell:J13:vtf:n:0:J40:b:::2::l:4:f:3:ntvf:1\ncell:K13:l:4:f:3\ncell:L13:f:1\ncell:A14:l:2\ncell:B14:l:2:f:1\ncell:C14:vt:th:with your check and remit to\\c:l:4:f:2:colspan:4\ncell:D14:l:4:f:2\ncell:E14:l:4:f:2\ncell:F14:l:4:f:2\ncell:G14:l:4:f:2\ncell:H14:vtf:t:Payment Due Date:IF(STATEMENT!H14=\"\",\"\",STATEMENT!H14):l:4:f:3:bg:2:colspan:2\ncell:I14:t:Payment Due Date:l:4:f:3:bg:2:cf:3\ncell:J14:b:2::2::l:4:f:3:bg:2:cf:1:ntvf:4\ncell:K14:l:4:f:3\ncell:L14:f:1\ncell:A15:l:2\ncell:B15:l:2:f:1\ncell:C15:vtf:t:[Company Name]:IF(STATEMENT!C15=\"\",\"\",STATEMENT!C15):l:4:f:2:colspan:4\ncell:D15:t:[Company Name]:l:4:f:2\ncell:E15:l:4:f:2\ncell:F15:b:2:2:2:2:l:4:f:2\ncell:G15:l:4:f:2\ncell:H15:vtf:t:Amount Enclosed $:IF(STATEMENT!H15=\"\",\"\",STATEMENT!H15):l:4:f:3:colspan:2\ncell:I15:t:Amount Enclosed $:l:4:f:3:cf:3\ncell:J15:b:2::2::l:4:f:3:cf:3:ntvf:2\ncell:K15:l:4:f:3\ncell:L15:f:1\ncell:A16:l:2\ncell:B16:l:2:f:1\ncell:C16:vtf:t:[Street Address]:IF(STATEMENT!C16=\"\",\"\",STATEMENT!C16):l:4:f:2:bg:2:colspan:4\ncell:D16:t:[Street Address]:l:4:f:2:bg:2\ncell:E16:l:4:f:2:bg:2\ncell:F16:b::2:2:2:l:4:f:2:bg:2\ncell:G16:l:4:f:2\ncell:H16:vtf:t:.:IF(J13<0,\"Negative Balance. Do Not Pay\",\".\"):l:4:f:2:colspan:3\ncell:I16:l:4:f:2\ncell:J16:vtf:t:.:IF(J13<0,\"Negative Balance. Do Not Pay\",\".\"):b:2::::l:4:f:2:cf:3\ncell:K16:l:4:f:2\ncell:L16:f:1\ncell:A17:l:2\ncell:B17:l:2:f:1\ncell:C17:vtf:t:[City, ST Zip]:IF(STATEMENT!C17=\"\",\"\",STATEMENT!C17):l:4:f:2:colspan:4\ncell:D17:t:[City, ST Zip]:l:4:f:2\ncell:E17:l:4:f:2\ncell:F17:b::2:2:2:l:4:f:2\ncell:G17:l:4:f:2\ncell:H17:vtf:t:Make all checks payable to [Company Name]:IF(STATEMENT!H17=\"\",\"\",STATEMENT!H17):l:5:f:2:cf:1:colspan:3:rowspan:2\ncell:I17:t::l:4:f:2:cf:1\ncell:J17:t::l:4:f:2:cf:1\ncell:K17:l:4:f:2\ncell:L17:f:1\ncell:A18:l:2\ncell:B18:l:2:f:1\ncell:C18:vtf:t:Please write your Customer ID on your check.:IF(STATEMENT!C18=\"\",\"\",STATEMENT!C18):l:4:f:2:cf:2:colspan:4\ncell:D18:l:4:f:2\ncell:E18:l:4:f:2\ncell:F18:l:4:f:2\ncell:G18:l:4:f:2\ncell:H18:l:4:f:2:cf:1:colspan:3:rowspan:1\ncell:I18:t::l:4:f:2:cf:1\ncell:J18:t::l:4:f:2:cf:1\ncell:K18:l:4:f:2\ncell:L18:f:1\ncell:A19:l:2\ncell:B19:l:2:f:1\ncell:C19:l:4:f:1\ncell:D19:l:4:f:1:cf:2\ncell:E19:l:4:f:1\ncell:F19:l:4:f:1:cf:2\ncell:G19:l:4:f:1:cf:2\ncell:H19:l:4:f:1\ncell:I19:l:4:f:1\ncell:J19:l:4:f:1\ncell:K19:l:4:f:1\ncell:L19:f:1\ncell:A20:l:2\ncell:B20:l:2:f:1\ncell:C20:l:4:f:1\ncell:D20:l:4:f:1:cf:2\ncell:E20:l:4:f:1\ncell:F20:l:4:f:1:cf:2\ncell:G20:l:4:f:1:cf:2\ncell:H20:l:4:f:1\ncell:I20:l:4:f:1\ncell:J20:l:4:f:1\ncell:K20:l:4:f:1\ncell:L20:f:1\ncell:A21:l:2\ncell:B21:l:2:f:1\ncell:C21:t:Account Activity:l:4:f:8:c:3:bg:1:cf:1:colspan:3\ncell:D21:l:4:f:1\ncell:E21:l:4:f:1\ncell:F21:l:4:f:1\ncell:G21:l:4:f:1\ncell:H21:l:4:f:1\ncell:I21:l:4:f:1\ncell:J21:l:4:f:1\ncell:K21:l:4:f:1\ncell:L21:f:1\ncell:A22:l:2\ncell:B22:l:2:f:1\ncell:C22:t:Date:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:D22:t:Type:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:E22:t:Invoice:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:F22:t:Description:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1:colspan:2\ncell:G22:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:H22:t:Payment:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:I22:t:Amount:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:J22:t:Balance:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:K22:l:4:f:1\ncell:L22:f:1\ncell:A23:l:2\ncell:B23:b::2:::l:2:f:1\ncell:C23:b::2:3:2:l:4:f:6:ntvf:3\ncell:D23:t:Balance Forward:b::2:3:2:l:4:f:6:cf:1:colspan:6\ncell:E23:b::2:3:2:l:4:f:6:cf:2\ncell:F23:t:Balance Forward:b::2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G23:b::2:3:2:l:4:f:6\ncell:H23:b::2:3:2:l:4:f:6:ntvf:2\ncell:I23:b::2:3:2:l:4:f:6:ntvf:2\ncell:J23:vtf:t::if(statement!J39=\" \",\"\",statement!J40):b:3:2:3:2:l:4:f:6\ncell:K23:b::::2:l:4:f:1\ncell:L23:f:1\ncell:A24:l:2\ncell:B24:b::2:::l:2:f:1\ncell:C24:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D24:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E24:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F24:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G24:b:3:2:3:2:l:4:f:6:bg:2\ncell:H24:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I24:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J24:vtf:t: :IF(AND(ISBLANK(H24),ISBLANK(I24)),\" \",I24-H24):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K24:b::::2:l:4:f:1\ncell:L24:f:1\ncell:A25:l:2\ncell:B25:b::2:::l:2:f:1\ncell:C25:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D25:b:5:2:3:2:l:4:f:6:cf:2\ncell:E25:b:5:2:3:2:l:4:f:6:cf:2\ncell:F25:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G25:b:5:2:3:2:l:4:f:6\ncell:H25:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I25:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J25:vtf:t: :IF(AND(ISBLANK(H25),ISBLANK(I25)),\" \",I25-H25):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K25:b::::2:l:4:f:1\ncell:L25:f:1\ncell:A26:l:2\ncell:B26:b::2:::l:2:f:1\ncell:C26:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D26:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E26:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F26:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G26:b:3:2:3:2:l:4:f:6:bg:2\ncell:H26:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I26:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J26:vtf:t: :IF(AND(ISBLANK(H26),ISBLANK(I26)),\" \",I26-H26):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K26:b::::2:l:4:f:1\ncell:L26:f:1\ncell:A27:l:2\ncell:B27:b::2:::l:2:f:1\ncell:C27:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D27:b:5:2:3:2:l:4:f:6:cf:2\ncell:E27:b:5:2:3:2:l:4:f:6:cf:2\ncell:F27:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G27:b:5:2:3:2:l:4:f:6\ncell:H27:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I27:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J27:vtf:t: :IF(AND(ISBLANK(H27),ISBLANK(I27)),\" \",I27-H27):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K27:b::::2:l:4:f:1\ncell:L27:f:1\ncell:A28:l:2\ncell:B28:b::2:::l:2:f:1\ncell:C28:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D28:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E28:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F28:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G28:b:3:2:3:2:l:4:f:6:bg:2\ncell:H28:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I28:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J28:vtf:t: :IF(AND(ISBLANK(H28),ISBLANK(I28)),\" \",I28-H28):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K28:b::::2:l:4:f:1\ncell:L28:f:1\ncell:A29:l:2\ncell:B29:b::2:::l:2:f:1\ncell:C29:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D29:b:5:2:3:2:l:4:f:6:cf:2\ncell:E29:b:5:2:3:2:l:4:f:6:cf:2\ncell:F29:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G29:b:5:2:3:2:l:4:f:6\ncell:H29:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I29:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J29:vtf:t: :IF(AND(ISBLANK(H29),ISBLANK(I29)),\" \",I29-H29):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K29:b::::2:l:4:f:1\ncell:L29:f:1\ncell:A30:l:2\ncell:B30:b::2:::l:2:f:1\ncell:C30:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D30:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E30:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F30:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G30:b:3:2:3:2:l:4:f:6:bg:2\ncell:H30:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I30:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J30:vtf:t: :IF(AND(ISBLANK(H30),ISBLANK(I30)),\" \",I30-H30):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K30:b::::2:l:4:f:1\ncell:L30:f:1\ncell:A31:l:2\ncell:B31:b::2:::l:2:f:1\ncell:C31:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D31:b:5:2:3:2:l:4:f:6:cf:2\ncell:E31:b:5:2:3:2:l:4:f:6:cf:2\ncell:F31:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G31:b:5:2:3:2:l:4:f:6\ncell:H31:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I31:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J31:vtf:t: :IF(AND(ISBLANK(H31),ISBLANK(I31)),\" \",I31-H31):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K31:b::::2:l:4:f:1\ncell:L31:f:1\ncell:A32:l:2\ncell:B32:b::2:::l:2:f:1\ncell:C32:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D32:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E32:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F32:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G32:b:3:2:3:2:l:4:f:6:bg:2\ncell:H32:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I32:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J32:vtf:t: :IF(AND(ISBLANK(H32),ISBLANK(I32)),\" \",I32-H32):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K32:b::::2:l:4:f:1\ncell:L32:f:1\ncell:A33:l:2\ncell:B33:b::2:::l:2:f:1\ncell:C33:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D33:b:5:2:3:2:l:4:f:6:cf:2\ncell:E33:b:5:2:3:2:l:4:f:6:cf:2\ncell:F33:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G33:b:5:2:3:2:l:4:f:6\ncell:H33:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I33:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J33:vtf:t: :IF(AND(ISBLANK(H33),ISBLANK(I33)),\" \",I33-H33):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K33:b::::2:l:4:f:1\ncell:L33:f:1\ncell:A34:l:2\ncell:B34:b::2:::l:2:f:1\ncell:C34:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D34:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E34:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F34:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G34:b:3:2:3:2:l:4:f:6:bg:2\ncell:H34:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I34:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J34:vtf:t: :IF(AND(ISBLANK(H34),ISBLANK(I34)),\" \",I34-H34):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K34:b::::2:l:4:f:1\ncell:L34:f:1\ncell:A35:l:2\ncell:B35:b::2:::l:2:f:1\ncell:C35:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D35:b:5:2:3:2:l:4:f:6:cf:2\ncell:E35:b:5:2:3:2:l:4:f:6:cf:2\ncell:F35:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G35:b:5:2:3:2:l:4:f:6\ncell:H35:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I35:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J35:vtf:t: :IF(AND(ISBLANK(H35),ISBLANK(I35)),\" \",I35-H35):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K35:b::::2:l:4:f:1\ncell:L35:f:1\ncell:A36:l:2\ncell:B36:b::2:::l:2:f:1\ncell:C36:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D36:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E36:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F36:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G36:b:3:2:3:2:l:4:f:6:bg:2\ncell:H36:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I36:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J36:vtf:t: :IF(AND(ISBLANK(H36),ISBLANK(I36)),\" \",I36-H36):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K36:b::::2:l:4:f:1\ncell:L36:f:1\ncell:A37:l:2\ncell:B37:b::2:::l:2:f:1\ncell:C37:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D37:b:5:2:3:2:l:4:f:6:cf:2\ncell:E37:b:5:2:3:2:l:4:f:6:cf:2\ncell:F37:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G37:b:5:2:3:2:l:4:f:6\ncell:H37:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I37:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J37:vtf:t: :IF(AND(ISBLANK(H37),ISBLANK(I37)),\" \",I37-H37):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K37:b::::2:l:4:f:1\ncell:L37:f:1\ncell:A38:l:2\ncell:B38:b::2:::l:2:f:1\ncell:C38:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D38:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E38:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F38:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G38:b:3:2:3:2:l:4:f:6:bg:2\ncell:H38:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I38:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J38:vtf:t: :IF(AND(ISBLANK(H38),ISBLANK(I38)),\" \",I38-H38):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K38:b::::2:l:4:f:1\ncell:L38:f:1\ncell:A39:l:2\ncell:B39:b::2:::l:2:f:1\ncell:C39:b:3:2:1:2:l:4:f:6:ntvf:3\ncell:D39:b:3:2:1:2:l:4:f:6:cf:2\ncell:E39:b:3:2:1:2:l:4:f:6:cf:2\ncell:F39:b:3:2:1:2:l:4:f:6:cf:2:colspan:2\ncell:G39:b:3:2:1:2:l:4:f:6\ncell:H39:b:3:2:1:2:l:4:f:6:ntvf:2\ncell:I39:b:3:2:1:2:l:4:f:6:ntvf:2\ncell:J39:vtf:t: :IF(AND(ISBLANK(H39),ISBLANK(I39)),\" \",I39-H39):b:3:2:1:2:l:4:f:6:ntvf:2\ncell:K39:b::::2:l:4:f:1\ncell:L39:f:1\ncell:A40:l:2\ncell:B40:l:2:f:1\ncell:C40:l:4:f:1\ncell:D40:l:4:f:1\ncell:E40:l:4:f:1:ntvf:2\ncell:F40:l:4:f:1:cf:3\ncell:G40:l:4:f:1:cf:3\ncell:H40:t:Current Balance\\c:b:2::2::l:4:f:7:cf:3:colspan:2\ncell:I40:t:Current Balance\\c:b:2::2::l:4:f:7:cf:3:ntvf:2\ncell:J40:vtf:n:0:SUM(J23\\cJ39):b:2::2::l:4:f:7:ntvf:1\ncell:K40:l:4:f:1\ncell:L40:f:1\ncell:A41:l:2\ncell:B41:l:2:f:1\ncell:C41:l:4:f:1\ncell:D41:l:4:f:1\ncell:E41:l:4:f:1\ncell:F41:l:4:f:1\ncell:G41:l:4:f:1\ncell:H41:b:2::::l:4:f:1\ncell:I41:b:2::::l:4:f:1\ncell:J41:b:2::::l:4:f:1\ncell:K41:l:4:f:1\ncell:L41:f:1\ncell:A42:l:2\ncell:B42:l:2:f:1\ncell:C42:t:If you have any questions about this statement, please contact:l:4:f:2:cf:1:colspan:8:rowspan:1\ncell:D42:t::l:4:f:1:cf:1\ncell:E42:t::l:4:f:1:cf:1\ncell:F42:t::l:4:f:1:cf:1\ncell:G42:t::l:4:f:1:cf:1\ncell:H42:t::l:4:f:1:cf:1\ncell:I42:t::l:4:f:1:cf:1\ncell:J42:t::l:4:f:1:cf:1\ncell:K42:l:4:f:1\ncell:L42:l:1:f:1\ncell:A43:l:2\ncell:B43:l:2:f:1\ncell:C43:t:[Name], [Street Address],[ City, ST ZiP]:l:4:f:2:cf:1:colspan:8\ncell:D43:t::l:4:f:2:cf:1\ncell:E43:t::l:4:f:2:cf:1\ncell:F43:t::l:4:f:2:cf:1\ncell:G43:t::l:4:f:2:cf:1\ncell:H43:b:::2::l:4:f:2:cf:2:colspan:3\ncell:I43:t::l:4:f:1:cf:1\ncell:J43:t::l:4:f:1:cf:1\ncell:K43:l:4:f:1\ncell:L43:l:1:f:1\ncell:A44:l:2\ncell:B44:l:2:f:1\ncell:C44:t:Phone[000-000-0000], Fax[000-000-0000], [Email]:l:4:f:2:cf:1:colspan:8\ncell:D44:t::l:4:f:2:cf:1\ncell:E44:t::l:4:f:2:cf:1\ncell:F44:t::l:4:f:2:cf:1\ncell:G44:t::l:4:f:2:cf:1\ncell:H44:b:::2::l:4:f:2:cf:2:colspan:3\ncell:I44:t::l:4:f:1:cf:1\ncell:J44:t::l:4:f:1:cf:1\ncell:K44:l:4:f:1\ncell:L44:l:1:f:1\ncell:A45:l:2\ncell:B45:l:2:f:1\ncell:C45:l:4:f:1\ncell:D45:l:4:f:1\ncell:E45:l:4:f:1\ncell:F45:l:4:f:1\ncell:G45:l:4:f:1\ncell:H45:l:4:f:1\ncell:I45:l:4:f:1\ncell:J45:l:4:f:1\ncell:K45:l:4:f:1\ncell:L45:l:1:f:1\ncell:A46:l:2\ncell:B46:l:2:f:1\ncell:C46:t:Thank You For Business:l:4:f:7:cf:1:colspan:8:rowspan:1\ncell:D46:t::l:4:f:1:cf:1\ncell:E46:t::l:4:f:1:cf:1\ncell:F46:t::l:4:f:1:cf:1\ncell:G46:t::l:4:f:1:cf:1\ncell:H46:t::l:4:f:1:cf:1\ncell:I46:t::l:4:f:1:cf:1\ncell:J46:t::l:4:f:1:cf:1\ncell:K46:l:4:f:1\ncell:L46:f:1\ncell:A47:l:2\ncell:B47:l:2:f:1\ncell:C47:l:4:f:1\ncell:D47:l:4:f:1\ncell:E47:l:4:f:1\ncell:F47:l:4:f:1\ncell:G47:l:4:f:1\ncell:H47:l:4:f:1\ncell:I47:l:4:f:1\ncell:J47:l:4:f:1\ncell:K47:l:4:f:1\ncell:L47:f:1\ncell:A48:l:2\ncell:B48:l:2:f:1\ncell:C48:l:4:f:1\ncell:D48:l:4:f:1\ncell:E48:l:4:f:1\ncell:F48:l:4:f:1\ncell:G48:l:4:f:1\ncell:H48:l:4:f:1\ncell:I48:l:4:f:1\ncell:J48:l:4:f:1\ncell:K48:l:4:f:1\ncell:L48:f:1\ncell:A49:l:2\ncell:B49:l:2\ncell:C49:l:4\ncell:D49:l:4\ncell:E49:l:4\ncell:F49:l:4\ncell:G49:l:4\ncell:H49:l:4\ncell:I49:l:4\ncell:J49:l:4\ncell:K49:l:4\ncell:A50:l:2\ncell:B50:l:2\ncell:C50:l:4\ncell:D50:l:4\ncell:E50:l:4\ncell:F50:l:4\ncell:G50:l:4\ncell:H50:l:4\ncell:I50:l:4\ncell:J50:l:4\ncell:K50:l:4\ncol:A:w:10\ncol:B:w:10\ncol:C:w:58\ncol:D:w:50\ncol:E:w:65\ncol:F:w:96\ncol:G:w:30\ncol:H:w:72\ncol:I:w:71\ncol:J:w:75\ncol:K:w:55\ncol:L:w:75\nrow:1:h:36\nrow:2:h:36\nrow:3:h:36\nrow:12:h:16.5\nrow:13:h:16.5\nrow:15:h:18\nrow:21:h:18\nrow:46:h:18\nsheet:c:12:r:50:h:15:w:58:needsrecalc:yes\nborder:1:1px solid rgb(0, 0, 0)\nborder:2:1px solid rgb(0,0,0)\nborder:3:1px solid rgb(192,192,192)\nborder:4:1px solid rgb(255, 255, 255)\nborder:5:thin solid rgb(192,192,192)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* * arial,helvetica,sans-serif\nfont:2:* 10pt arial,helvetica,sans-serif\nfont:3:* 11pt arial,helvetica,sans-serif\nfont:4:* 12pt arial,helvetica,sans-serif\nfont:5:* 18pt arial,helvetica,sans-serif\nfont:6:* 9pt arial,helvetica,sans-serif\nfont:7:normal normal 11pt arial,helvetica,sans-serif\nfont:8:normal normal 12pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:0px 0px 0px 0px;vertical-align:*;\nlayout:3:padding:0px 0px 0px 0px;vertical-align:bottom;\nlayout:4:padding:4px 4px 4px 4px;vertical-align:bottom;\nlayout:5:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:\"$\"#,##0.00\nvalueformat:2:#,##0.00\nvalueformat:3:m/d/yy\nvalueformat:4:mm-dd-yy\n"},"name":"statement1","hidden":"0"},"sheet4":{"sheetstr":{"savestr":"version:1.5\ncell:B1:l:3:f:1\ncell:C1:l:4:f:1\ncell:D1:l:4:f:1\ncell:E1:l:4:f:1\ncell:F1:l:4:f:1\ncell:G1:l:4:f:1\ncell:H1:l:4:f:1\ncell:I1:l:4:f:1\ncell:J1:l:4:f:1\ncell:K1:l:4:f:1\ncell:L1:f:1\ncell:A2:l:2\ncell:B2:l:2:f:1\ncell:C2:l:4:f:1\ncell:D2:l:4:f:1\ncell:E2:l:4:f:1\ncell:F2:l:4:f:1\ncell:G2:l:4:f:1\ncell:H2:l:4:f:1\ncell:I2:l:4:f:1\ncell:J2:l:4:f:1\ncell:K2:l:4:f:1\ncell:L2:f:1\ncell:A3:l:2\ncell:B3:l:2:f:1\ncell:C3:vtf:t:Statement:IF(STATEMENT!C3=\"\",\"\",STATEMENT!C3):l:4:f:5:c:3:bg:1:cf:1:colspan:8\ncell:D3:l:4:f:1\ncell:E3:l:4:f:1\ncell:F3:l:4:f:1\ncell:G3:l:4:f:1\ncell:H3:l:4:f:1\ncell:I3:l:4:f:1\ncell:J3:l:4:f:1:cf:3\ncell:K3:l:4:f:1\ncell:L3:f:1\ncell:A4:l:2\ncell:B4:l:2:f:1\ncell:C4:l:4:f:1:colspan:3\ncell:D4:l:4:f:1\ncell:E4:l:4:f:1\ncell:F4:l:4:f:1\ncell:G4:l:4:f:1\ncell:H4:l:4:f:1\ncell:I4:l:4:f:1\ncell:J4:l:4:f:1:cf:3\ncell:K4:l:4:f:1\ncell:L4:f:1\ncell:A5:l:2\ncell:B5:l:2:f:1\ncell:C5:vtf:t:[Company Name]:IF(STATEMENT!C5=\"\",\"\",STATEMENT!C5):l:4:f:2:colspan:6\ncell:D5:t:Company Name:l:4:f:4:colspan:2\ncell:E5:l:4:f:4\ncell:F5:b:::2::l:4:f:4:colspan:3\ncell:G5:b:::2::l:4:f:1:colspan:2\ncell:H5:b:::2::l:4:f:1\ncell:I5:l:4:f:1\ncell:J5:l:4:f:1\ncell:K5:l:4:f:1\ncell:L5:f:1\ncell:A6:l:2\ncell:B6:l:2:f:1\ncell:C6:l:4:f:1\ncell:D6:l:4:f:1:colspan:2\ncell:E6:l:4:f:1\ncell:F6:l:4:f:1\ncell:G6:l:4:f:1\ncell:H6:l:4:f:1\ncell:I6:l:4:f:1\ncell:J6:l:4:f:1\ncell:K6:l:4:f:1\ncell:L6:f:1\ncell:A7:l:2\ncell:B7:l:2:f:1\ncell:C7:vtf:t:Bill To\\c:IF(STATEMENT!C7=\"\",\"\",STATEMENT!C7):l:4:f:3:cf:2\ncell:D7:vtf:t:[Customer Name]:IF(STATEMENT!D7=\"\",\"\",STATEMENT!D7):l:4:f:3:bg:2:colspan:3\ncell:E7:l:4:f:3:bg:2\ncell:F7:b:::2::l:4:f:3:bg:2\ncell:G7:l:4:f:3\ncell:H7:vtf:t:Statement Date:IF(STATEMENT!H7=\"\",\"\",STATEMENT!H7):l:4:f:3:colspan:2\ncell:I7:t:Statement Date:l:4:f:3:cf:3:ntvf:4\ncell:J7:vtf:t::IF(STATEMENT!J7=\"\",\"\",STATEMENT!J7):b:::1::l:4:f:3:cf:2:ntvf:3\ncell:K7:l:4:f:1\ncell:L7:f:1\ncell:A8:l:2\ncell:B8:l:2:f:1\ncell:C8:l:4:f:3\ncell:D8:vtf:t:[Street Address]:IF(STATEMENT!D8=\"\",\"\",STATEMENT!D8):l:4:f:3:cf:2:colspan:3\ncell:E8:l:4:f:3\ncell:F8:b:::2::l:4:f:3\ncell:G8:l:4:f:3:cf:2\ncell:H8:vtf:t:Statement #:IF(STATEMENT!H8=\"\",\"\",STATEMENT!H8):l:4:f:3:bg:2:colspan:2\ncell:I8:t:Statement #:l:4:f:3:bg:2:cf:3:ntvf:4\ncell:J8:vtf:t::IF(STATEMENT!J8=\"\",\"\",STATEMENT!J8):b:1:3:1:3:l:4:f:3:bg:2:cf:2\ncell:K8:l:4:f:1\ncell:L8:f:1\ncell:A9:l:2\ncell:B9:l:2:f:1\ncell:C9:l:4:f:3\ncell:D9:vtf:t:[City, ST ZIP]:IF(STATEMENT!D9=\"\",\"\",STATEMENT!D9):l:4:f:3:bg:2:cf:2:colspan:3\ncell:E9:l:4:f:3:bg:2\ncell:F9:b:::2::l:4:f:3:bg:2\ncell:G9:l:4:f:3:cf:2\ncell:H9:vtf:t:Customer ID:IF(STATEMENT!H9=\"\",\"\",STATEMENT!H9):l:4:f:3:colspan:2\ncell:I9:t:Customer ID:l:4:f:3:cf:3:ntvf:4\ncell:J9:vtf:t::IF(STATEMENT!J9=\"\",\"\",STATEMENT!J9):b:1:3:1:3:l:4:f:3:cf:2\ncell:K9:l:4:f:1\ncell:L9:f:1\ncell:A10:l:2\ncell:B10:l:2:f:1\ncell:C10:l:4:f:3\ncell:D10:vtf:t:[Phone]:IF(STATEMENT!D10=\"\",\"\",STATEMENT!D10):l:4:f:3:colspan:3\ncell:E10:l:4:f:3\ncell:F10:b:::2::l:4:f:3\ncell:G10:l:4:f:3\ncell:H10:l:4:f:3\ncell:I10:l:4:f:3\ncell:J10:b:1::::l:4:f:3\ncell:K10:l:4:f:1\ncell:L10:f:1\ncell:A11:l:2\ncell:B11:l:2:f:1\ncell:C11:l:4:f:1\ncell:D11:l:4:f:1:cf:2\ncell:E11:l:4:f:1\ncell:F11:l:4:f:1:cf:2\ncell:G11:l:4:f:1:cf:2\ncell:H11:l:4:f:1\ncell:I11:l:4:f:1\ncell:J11:l:4:f:1\ncell:K11:l:4:f:1\ncell:L11:f:1\ncell:A12:l:2\ncell:B12:l:2:f:1\ncell:C12:vtf:t:Remittance:IF(STATEMENT!C12=\"\",\"\",STATEMENT!C12):l:4:f:4:c:3:bg:1:cf:1:colspan:4\ncell:D12:l:4:f:4:c:3:bg:1:cf:1\ncell:E12:l:4:f:4:c:3:bg:1:cf:1\ncell:F12:l:4:f:4:c:3:bg:1:cf:1\ncell:G12:l:4:f:4\ncell:H12:vtf:t:Account Summary:IF(STATEMENT!H12=\"\",\"\",STATEMENT!H12):l:4:f:4:c:3:bg:1:cf:1:colspan:3:rowspan:1\ncell:I12:t::l:4:f:1:cf:2\ncell:J12:t::l:4:f:1:cf:2\ncell:K12:l:4:f:1\ncell:L12:f:1\ncell:A13:l:2\ncell:B13:l:2:f:1\ncell:C13:vtf:t:To ensure proper credit, please enclose a copy of this statement with your check and remit to\\c:IF(STATEMENT!C13=\"\",\"\",STATEMENT!C13):l:4:f:2:colspan:4:rowspan:2\ncell:D13:l:4:f:2\ncell:E13:l:4:f:2\ncell:F13:l:4:f:2\ncell:G13:l:4:f:2\ncell:H13:vtf:t:Balance Due:IF(STATEMENT!H13=\"\",\"\",STATEMENT!H13):l:4:f:3:colspan:2\ncell:I13:t:Balance Due:l:4:f:3:cf:3\ncell:J13:vtf:n:0:J40:b:::2::l:4:f:3:ntvf:1\ncell:K13:l:4:f:3\ncell:L13:f:1\ncell:A14:l:2\ncell:B14:l:2:f:1\ncell:C14:vt:th:with your check and remit to\\c:l:4:f:2:colspan:4\ncell:D14:l:4:f:2\ncell:E14:l:4:f:2\ncell:F14:l:4:f:2\ncell:G14:l:4:f:2\ncell:H14:vtf:t:Payment Due Date:IF(STATEMENT!H14=\"\",\"\",STATEMENT!H14):l:4:f:3:bg:2:colspan:2\ncell:I14:t:Payment Due Date:l:4:f:3:bg:2:cf:3\ncell:J14:b:2::2::l:4:f:3:bg:2:cf:1:ntvf:4\ncell:K14:l:4:f:3\ncell:L14:f:1\ncell:A15:l:2\ncell:B15:l:2:f:1\ncell:C15:vtf:t:[Company Name]:IF(STATEMENT!C15=\"\",\"\",STATEMENT!C15):l:4:f:2:colspan:4\ncell:D15:t:[Company Name]:l:4:f:2\ncell:E15:l:4:f:2\ncell:F15:b:2:2:2:2:l:4:f:2\ncell:G15:l:4:f:2\ncell:H15:vtf:t:Amount Enclosed $:IF(STATEMENT!H15=\"\",\"\",STATEMENT!H15):l:4:f:3:colspan:2\ncell:I15:t:Amount Enclosed $:l:4:f:3:cf:3\ncell:J15:b:2::2::l:4:f:3:cf:3:ntvf:2\ncell:K15:l:4:f:3\ncell:L15:f:1\ncell:A16:l:2\ncell:B16:l:2:f:1\ncell:C16:vtf:t:[Street Address]:IF(STATEMENT!C16=\"\",\"\",STATEMENT!C16):l:4:f:2:bg:2:colspan:4\ncell:D16:t:[Street Address]:l:4:f:2:bg:2\ncell:E16:l:4:f:2:bg:2\ncell:F16:b::2:2:2:l:4:f:2:bg:2\ncell:G16:l:4:f:2\ncell:H16:vtf:t:.:IF(J13<0,\"Negative Balance. Do Not Pay\",\".\"):l:4:f:2:colspan:3\ncell:I16:l:4:f:2\ncell:J16:vtf:t:.:IF(J13<0,\"Negative Balance. Do Not Pay\",\".\"):b:2::::l:4:f:2:cf:3\ncell:K16:l:4:f:2\ncell:L16:f:1\ncell:A17:l:2\ncell:B17:l:2:f:1\ncell:C17:vtf:t:[City, ST Zip]:IF(STATEMENT!C17=\"\",\"\",STATEMENT!C17):l:4:f:2:colspan:4\ncell:D17:t:[City, ST Zip]:l:4:f:2\ncell:E17:l:4:f:2\ncell:F17:b::2:2:2:l:4:f:2\ncell:G17:l:4:f:2\ncell:H17:vtf:t:Make all checks payable to [Company Name]:IF(STATEMENT!H17=\"\",\"\",STATEMENT!H17):l:5:f:2:cf:1:colspan:3:rowspan:2\ncell:I17:t::l:4:f:2:cf:1\ncell:J17:t::l:4:f:2:cf:1\ncell:K17:l:4:f:2\ncell:L17:f:1\ncell:A18:l:2\ncell:B18:l:2:f:1\ncell:C18:vtf:t:Please write your Customer ID on your check.:IF(STATEMENT!C18=\"\",\"\",STATEMENT!C18):l:4:f:2:cf:2:colspan:4\ncell:D18:l:4:f:2\ncell:E18:l:4:f:2\ncell:F18:l:4:f:2\ncell:G18:l:4:f:2\ncell:H18:l:4:f:2:cf:1:colspan:3:rowspan:1\ncell:I18:t::l:4:f:2:cf:1\ncell:J18:t::l:4:f:2:cf:1\ncell:K18:l:4:f:2\ncell:L18:f:1\ncell:A19:l:2\ncell:B19:l:2:f:1\ncell:C19:l:4:f:1\ncell:D19:l:4:f:1:cf:2\ncell:E19:l:4:f:1\ncell:F19:l:4:f:1:cf:2\ncell:G19:l:4:f:1:cf:2\ncell:H19:l:4:f:1\ncell:I19:l:4:f:1\ncell:J19:l:4:f:1\ncell:K19:l:4:f:1\ncell:L19:f:1\ncell:A20:l:2\ncell:B20:l:2:f:1\ncell:C20:l:4:f:1\ncell:D20:l:4:f:1:cf:2\ncell:E20:l:4:f:1\ncell:F20:l:4:f:1:cf:2\ncell:G20:l:4:f:1:cf:2\ncell:H20:l:4:f:1\ncell:I20:l:4:f:1\ncell:J20:l:4:f:1\ncell:K20:l:4:f:1\ncell:L20:f:1\ncell:A21:l:2\ncell:B21:l:2:f:1\ncell:C21:t:Account Activity:l:4:f:8:c:3:bg:1:cf:1:colspan:3\ncell:D21:l:4:f:1\ncell:E21:l:4:f:1\ncell:F21:l:4:f:1\ncell:G21:l:4:f:1\ncell:H21:l:4:f:1\ncell:I21:l:4:f:1\ncell:J21:l:4:f:1\ncell:K21:l:4:f:1\ncell:L21:f:1\ncell:A22:l:2\ncell:B22:l:2:f:1\ncell:C22:t:Date:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:D22:t:Type:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:E22:t:Invoice:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:F22:t:Description:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1:colspan:2\ncell:G22:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:H22:t:Payment:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:I22:t:Amount:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:J22:t:Balance:b:4:4:4:4:l:4:f:7:c:3:bg:1:cf:1\ncell:K22:l:4:f:1\ncell:L22:f:1\ncell:A23:l:2\ncell:B23:b::2:::l:2:f:1\ncell:C23:b::2:3:2:l:4:f:6:ntvf:3\ncell:D23:t:Balance Forward:b::2:3:2:l:4:f:6:cf:1:colspan:6\ncell:E23:b::2:3:2:l:4:f:6:cf:2\ncell:F23:t:Balance Forward:b::2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G23:b::2:3:2:l:4:f:6\ncell:H23:b::2:3:2:l:4:f:6:ntvf:2\ncell:I23:b::2:3:2:l:4:f:6:ntvf:2\ncell:J23:vtf:t::if(statement1!J39=\" \",\"\",statement1!J40):b:3:2:3:2:l:4:f:6\ncell:K23:b::::2:l:4:f:1\ncell:L23:f:1\ncell:A24:l:2\ncell:B24:b::2:::l:2:f:1\ncell:C24:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D24:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E24:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F24:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G24:b:3:2:3:2:l:4:f:6:bg:2\ncell:H24:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I24:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J24:vtf:t: :IF(AND(ISBLANK(H24),ISBLANK(I24)),\" \",I24-H24):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K24:b::::2:l:4:f:1\ncell:L24:f:1\ncell:A25:l:2\ncell:B25:b::2:::l:2:f:1\ncell:C25:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D25:b:5:2:3:2:l:4:f:6:cf:2\ncell:E25:b:5:2:3:2:l:4:f:6:cf:2\ncell:F25:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G25:b:5:2:3:2:l:4:f:6\ncell:H25:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I25:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J25:vtf:t: :IF(AND(ISBLANK(H25),ISBLANK(I25)),\" \",I25-H25):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K25:b::::2:l:4:f:1\ncell:L25:f:1\ncell:A26:l:2\ncell:B26:b::2:::l:2:f:1\ncell:C26:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D26:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E26:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F26:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G26:b:3:2:3:2:l:4:f:6:bg:2\ncell:H26:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I26:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J26:vtf:t: :IF(AND(ISBLANK(H26),ISBLANK(I26)),\" \",I26-H26):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K26:b::::2:l:4:f:1\ncell:L26:f:1\ncell:A27:l:2\ncell:B27:b::2:::l:2:f:1\ncell:C27:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D27:b:5:2:3:2:l:4:f:6:cf:2\ncell:E27:b:5:2:3:2:l:4:f:6:cf:2\ncell:F27:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G27:b:5:2:3:2:l:4:f:6\ncell:H27:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I27:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J27:vtf:t: :IF(AND(ISBLANK(H27),ISBLANK(I27)),\" \",I27-H27):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K27:b::::2:l:4:f:1\ncell:L27:f:1\ncell:A28:l:2\ncell:B28:b::2:::l:2:f:1\ncell:C28:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D28:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E28:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F28:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G28:b:3:2:3:2:l:4:f:6:bg:2\ncell:H28:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I28:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J28:vtf:t: :IF(AND(ISBLANK(H28),ISBLANK(I28)),\" \",I28-H28):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K28:b::::2:l:4:f:1\ncell:L28:f:1\ncell:A29:l:2\ncell:B29:b::2:::l:2:f:1\ncell:C29:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D29:b:5:2:3:2:l:4:f:6:cf:2\ncell:E29:b:5:2:3:2:l:4:f:6:cf:2\ncell:F29:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G29:b:5:2:3:2:l:4:f:6\ncell:H29:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I29:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J29:vtf:t: :IF(AND(ISBLANK(H29),ISBLANK(I29)),\" \",I29-H29):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K29:b::::2:l:4:f:1\ncell:L29:f:1\ncell:A30:l:2\ncell:B30:b::2:::l:2:f:1\ncell:C30:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D30:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E30:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F30:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G30:b:3:2:3:2:l:4:f:6:bg:2\ncell:H30:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I30:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J30:vtf:t: :IF(AND(ISBLANK(H30),ISBLANK(I30)),\" \",I30-H30):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K30:b::::2:l:4:f:1\ncell:L30:f:1\ncell:A31:l:2\ncell:B31:b::2:::l:2:f:1\ncell:C31:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D31:b:5:2:3:2:l:4:f:6:cf:2\ncell:E31:b:5:2:3:2:l:4:f:6:cf:2\ncell:F31:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G31:b:5:2:3:2:l:4:f:6\ncell:H31:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I31:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J31:vtf:t: :IF(AND(ISBLANK(H31),ISBLANK(I31)),\" \",I31-H31):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K31:b::::2:l:4:f:1\ncell:L31:f:1\ncell:A32:l:2\ncell:B32:b::2:::l:2:f:1\ncell:C32:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D32:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E32:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F32:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G32:b:3:2:3:2:l:4:f:6:bg:2\ncell:H32:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I32:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J32:vtf:t: :IF(AND(ISBLANK(H32),ISBLANK(I32)),\" \",I32-H32):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K32:b::::2:l:4:f:1\ncell:L32:f:1\ncell:A33:l:2\ncell:B33:b::2:::l:2:f:1\ncell:C33:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D33:b:5:2:3:2:l:4:f:6:cf:2\ncell:E33:b:5:2:3:2:l:4:f:6:cf:2\ncell:F33:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G33:b:5:2:3:2:l:4:f:6\ncell:H33:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I33:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J33:vtf:t: :IF(AND(ISBLANK(H33),ISBLANK(I33)),\" \",I33-H33):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K33:b::::2:l:4:f:1\ncell:L33:f:1\ncell:A34:l:2\ncell:B34:b::2:::l:2:f:1\ncell:C34:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D34:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E34:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F34:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G34:b:3:2:3:2:l:4:f:6:bg:2\ncell:H34:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I34:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J34:vtf:t: :IF(AND(ISBLANK(H34),ISBLANK(I34)),\" \",I34-H34):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K34:b::::2:l:4:f:1\ncell:L34:f:1\ncell:A35:l:2\ncell:B35:b::2:::l:2:f:1\ncell:C35:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D35:b:5:2:3:2:l:4:f:6:cf:2\ncell:E35:b:5:2:3:2:l:4:f:6:cf:2\ncell:F35:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G35:b:5:2:3:2:l:4:f:6\ncell:H35:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I35:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J35:vtf:t: :IF(AND(ISBLANK(H35),ISBLANK(I35)),\" \",I35-H35):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K35:b::::2:l:4:f:1\ncell:L35:f:1\ncell:A36:l:2\ncell:B36:b::2:::l:2:f:1\ncell:C36:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D36:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E36:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F36:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G36:b:3:2:3:2:l:4:f:6:bg:2\ncell:H36:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I36:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J36:vtf:t: :IF(AND(ISBLANK(H36),ISBLANK(I36)),\" \",I36-H36):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K36:b::::2:l:4:f:1\ncell:L36:f:1\ncell:A37:l:2\ncell:B37:b::2:::l:2:f:1\ncell:C37:b:5:2:3:2:l:4:f:6:ntvf:3\ncell:D37:b:5:2:3:2:l:4:f:6:cf:2\ncell:E37:b:5:2:3:2:l:4:f:6:cf:2\ncell:F37:b:5:2:3:2:l:4:f:6:cf:2:colspan:2\ncell:G37:b:5:2:3:2:l:4:f:6\ncell:H37:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:I37:b:5:2:3:2:l:4:f:6:ntvf:2\ncell:J37:vtf:t: :IF(AND(ISBLANK(H37),ISBLANK(I37)),\" \",I37-H37):b:5:2:3:2:l:4:f:6:ntvf:2\ncell:K37:b::::2:l:4:f:1\ncell:L37:f:1\ncell:A38:l:2\ncell:B38:b::2:::l:2:f:1\ncell:C38:b:3:2:3:2:l:4:f:6:bg:2:ntvf:3\ncell:D38:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:E38:b:3:2:3:2:l:4:f:6:bg:2:cf:2\ncell:F38:b:3:2:3:2:l:4:f:6:bg:2:cf:2:colspan:2\ncell:G38:b:3:2:3:2:l:4:f:6:bg:2\ncell:H38:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:I38:b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:J38:vtf:t: :IF(AND(ISBLANK(H38),ISBLANK(I38)),\" \",I38-H38):b:3:2:3:2:l:4:f:6:bg:2:ntvf:2\ncell:K38:b::::2:l:4:f:1\ncell:L38:f:1\ncell:A39:l:2\ncell:B39:b::2:::l:2:f:1\ncell:C39:b:3:2:1:2:l:4:f:6:ntvf:3\ncell:D39:b:3:2:1:2:l:4:f:6:cf:2\ncell:E39:b:3:2:1:2:l:4:f:6:cf:2\ncell:F39:b:3:2:1:2:l:4:f:6:cf:2:colspan:2\ncell:G39:b:3:2:1:2:l:4:f:6\ncell:H39:b:3:2:1:2:l:4:f:6:ntvf:2\ncell:I39:b:3:2:1:2:l:4:f:6:ntvf:2\ncell:J39:vtf:t: :IF(AND(ISBLANK(H39),ISBLANK(I39)),\" \",I39-H39):b:3:2:1:2:l:4:f:6:ntvf:2\ncell:K39:b::::2:l:4:f:1\ncell:L39:f:1\ncell:A40:l:2\ncell:B40:l:2:f:1\ncell:C40:l:4:f:1\ncell:D40:l:4:f:1\ncell:E40:l:4:f:1:ntvf:2\ncell:F40:l:4:f:1:cf:3\ncell:G40:l:4:f:1:cf:3\ncell:H40:t:Current Balance\\c:b:2::2::l:4:f:7:cf:3:colspan:2\ncell:I40:t:Current Balance\\c:b:2::2::l:4:f:7:cf:3:ntvf:2\ncell:J40:vtf:n:0:SUM(J23\\cJ39):b:2::2::l:4:f:7:ntvf:1\ncell:K40:l:4:f:1\ncell:L40:f:1\ncell:A41:l:2\ncell:B41:l:2:f:1\ncell:C41:l:4:f:1\ncell:D41:l:4:f:1\ncell:E41:l:4:f:1\ncell:F41:l:4:f:1\ncell:G41:l:4:f:1\ncell:H41:b:2::::l:4:f:1\ncell:I41:b:2::::l:4:f:1\ncell:J41:b:2::::l:4:f:1\ncell:K41:l:4:f:1\ncell:L41:f:1\ncell:A42:l:2\ncell:B42:l:2:f:1\ncell:C42:t:If you have any questions about this statement, please contact:l:4:f:2:cf:1:colspan:8:rowspan:1\ncell:D42:t::l:4:f:1:cf:1\ncell:E42:t::l:4:f:1:cf:1\ncell:F42:t::l:4:f:1:cf:1\ncell:G42:t::l:4:f:1:cf:1\ncell:H42:t::l:4:f:1:cf:1\ncell:I42:t::l:4:f:1:cf:1\ncell:J42:t::l:4:f:1:cf:1\ncell:K42:l:4:f:1\ncell:L42:l:1:f:1\ncell:A43:l:2\ncell:B43:l:2:f:1\ncell:C43:t:[Name], [Street Address],[ City, ST ZiP]:l:4:f:2:cf:1:colspan:8\ncell:D43:t::l:4:f:2:cf:1\ncell:E43:t::l:4:f:2:cf:1\ncell:F43:t::l:4:f:2:cf:1\ncell:G43:t::l:4:f:2:cf:1\ncell:H43:b:::2::l:4:f:2:cf:2:colspan:3\ncell:I43:t::l:4:f:1:cf:1\ncell:J43:t::l:4:f:1:cf:1\ncell:K43:l:4:f:1\ncell:L43:l:1:f:1\ncell:A44:l:2\ncell:B44:l:2:f:1\ncell:C44:t:Phone[000-000-0000], Fax[000-000-0000], [Email]:l:4:f:2:cf:1:colspan:8\ncell:D44:t::l:4:f:2:cf:1\ncell:E44:t::l:4:f:2:cf:1\ncell:F44:t::l:4:f:2:cf:1\ncell:G44:t::l:4:f:2:cf:1\ncell:H44:b:::2::l:4:f:2:cf:2:colspan:3\ncell:I44:t::l:4:f:1:cf:1\ncell:J44:t::l:4:f:1:cf:1\ncell:K44:l:4:f:1\ncell:L44:l:1:f:1\ncell:A45:l:2\ncell:B45:l:2:f:1\ncell:C45:l:4:f:1\ncell:D45:l:4:f:1\ncell:E45:l:4:f:1\ncell:F45:l:4:f:1\ncell:G45:l:4:f:1\ncell:H45:l:4:f:1\ncell:I45:l:4:f:1\ncell:J45:l:4:f:1\ncell:K45:l:4:f:1\ncell:L45:l:1:f:1\ncell:A46:l:2\ncell:B46:l:2:f:1\ncell:C46:t:Thank You For Business:l:4:f:7:cf:1:colspan:8:rowspan:1\ncell:D46:t::l:4:f:1:cf:1\ncell:E46:t::l:4:f:1:cf:1\ncell:F46:t::l:4:f:1:cf:1\ncell:G46:t::l:4:f:1:cf:1\ncell:H46:t::l:4:f:1:cf:1\ncell:I46:t::l:4:f:1:cf:1\ncell:J46:t::l:4:f:1:cf:1\ncell:K46:l:4:f:1\ncell:L46:f:1\ncell:A47:l:2\ncell:B47:l:2:f:1\ncell:C47:l:4:f:1\ncell:D47:l:4:f:1\ncell:E47:l:4:f:1\ncell:F47:l:4:f:1\ncell:G47:l:4:f:1\ncell:H47:l:4:f:1\ncell:I47:l:4:f:1\ncell:J47:l:4:f:1\ncell:K47:l:4:f:1\ncell:L47:f:1\ncell:A48:l:2\ncell:B48:l:2:f:1\ncell:C48:l:4:f:1\ncell:D48:l:4:f:1\ncell:E48:l:4:f:1\ncell:F48:l:4:f:1\ncell:G48:l:4:f:1\ncell:H48:l:4:f:1\ncell:I48:l:4:f:1\ncell:J48:l:4:f:1\ncell:K48:l:4:f:1\ncell:L48:f:1\ncell:A49:l:2\ncell:B49:l:2\ncell:C49:l:4\ncell:D49:l:4\ncell:E49:l:4\ncell:F49:l:4\ncell:G49:l:4\ncell:H49:l:4\ncell:I49:l:4\ncell:J49:l:4\ncell:K49:l:4\ncell:A50:l:2\ncell:B50:l:2\ncell:C50:l:4\ncell:D50:l:4\ncell:E50:l:4\ncell:F50:l:4\ncell:G50:l:4\ncell:H50:l:4\ncell:I50:l:4\ncell:J50:l:4\ncell:K50:l:4\ncol:A:w:10\ncol:B:w:10\ncol:C:w:58\ncol:D:w:50\ncol:E:w:65\ncol:F:w:96\ncol:G:w:30\ncol:H:w:72\ncol:I:w:72\ncol:J:w:75\ncol:K:w:55\ncol:L:w:75\nrow:1:h:36\nrow:2:h:36\nrow:3:h:36\nrow:12:h:16.5\nrow:13:h:16.5\nrow:15:h:18\nrow:21:h:18\nrow:46:h:18\nsheet:c:12:r:50:h:15:w:58:needsrecalc:yes\nborder:1:1px solid rgb(0, 0, 0)\nborder:2:1px solid rgb(0,0,0)\nborder:3:1px solid rgb(192,192,192)\nborder:4:1px solid rgb(255, 255, 255)\nborder:5:thin solid rgb(192,192,192)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:* * arial,helvetica,sans-serif\nfont:2:* 10pt arial,helvetica,sans-serif\nfont:3:* 11pt arial,helvetica,sans-serif\nfont:4:* 12pt arial,helvetica,sans-serif\nfont:5:* 18pt arial,helvetica,sans-serif\nfont:6:* 9pt arial,helvetica,sans-serif\nfont:7:normal normal 11pt arial,helvetica,sans-serif\nfont:8:normal normal 12pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:0px 0px 0px 0px;vertical-align:*;\nlayout:3:padding:0px 0px 0px 0px;vertical-align:bottom;\nlayout:4:padding:4px 4px 4px 4px;vertical-align:bottom;\nlayout:5:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:\"$\"#,##0.00\nvalueformat:2:#,##0.00\nvalueformat:3:m/d/yy\nvalueformat:4:mm-dd-yy\n"},"name":"statement2","hidden":"0"},"sheet5":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:[Company Name]:l:1:f:3:c:4:bg:2:cf:2:colspan:3\ncell:C2:t::l:1:f:2\ncell:D2:t::l:1:f:2\ncell:E2:l:1:f:2:c:1:cf:3\ncell:F2:t:INVOICE:l:1:f:4:c:4:bg:2:cf:2:colspan:2\ncell:G2:t::l:1:f:2\ncell:B3:t:[Company Slogan]:l:1:f:1:c:4:bg:5:cf:2:colspan:3\ncell:C3:t::l:1:f:2:c:4:bg:5\ncell:D3:t::l:1:f:2:c:4:bg:5\ncell:E3:l:1:f:2:c:1:cf:3\ncell:F3:l:1:f:2:c:4:bg:5:colspan:2\ncell:G3:l:1:f:2:c:4:bg:5\ncell:B4:l:1:f:2:colspan:2\ncell:C4:l:1:f:2\ncell:D4:l:1:f:2\ncell:E4:l:1:f:2\ncell:F4:l:1:f:2:tvf:4:rowspan:4\ncell:G4:l:1:f:2\ncell:B5:t:[Street Address]:l:1:f:2:cf:2:colspan:2\ncell:C5:l:1:f:2\ncell:D5:l:1:f:2\ncell:E5:l:1:f:2\ncell:F5:l:1:f:2\ncell:G5:l:1:f:2:cf:1\ncell:B6:t:[City, State, Zip]:l:1:f:2:bg:3:cf:2:colspan:2\ncell:C6:l:1:f:2\ncell:D6:l:1:f:2\ncell:E6:l:1:f:2\ncell:F6:l:1:f:2\ncell:G6:l:1:f:2\ncell:B7:t:Phone\\c :l:1:f:2:cf:2:colspan:2\ncell:C7:l:1:f:2\ncell:D7:l:1:f:2\ncell:E7:l:1:f:2\ncell:F7:l:1:f:2\ncell:G7:l:1:f:2\ncell:B8:t:Email\\c:l:1:f:2:bg:3:cf:2:colspan:2\ncell:C8:l:1:f:2\ncell:D8:l:1:f:2\ncell:E8:l:1:f:2\ncell:F8:l:1:f:2\ncell:G8:l:1:f:2\ncell:B9:l:1:f:2:colspan:2\ncell:C9:l:1:f:2\ncell:D9:l:1:f:2\ncell:E9:l:1:f:2\ncell:F9:t:DATE \\c:l:1:f:2:cf:2\ncell:G9:b:::1::l:1:f:2:cf:2:ntvf:3\ncell:B10:t:BILL TO\\c:l:1:f:3:c:4:bg:2:cf:2:colspan:2\ncell:C10:l:1:f:2\ncell:D10:l:1:f:2\ncell:E10:l:1:f:2\ncell:F10:t:INVOICE # \\c:l:1:f:2:cf:2\ncell:G10:b:1::1::l:1:f:2:cf:2\ncell:B11:t:[Name]:l:1:f:2:cf:2:colspan:2\ncell:C11:l:1:f:2\ncell:D11:l:1:f:2\ncell:E11:l:1:f:2\ncell:F11:l:1:f:2\ncell:G11:b:1::::l:1:f:2\ncell:B12:t:[Company Name]:l:1:f:2:bg:3:cf:2:colspan:2\ncell:C12:l:1:f:2\ncell:D12:l:1:f:2\ncell:E12:l:1:f:2\ncell:F12:t: :l:1:f:2\ncell:G12:l:1:f:2\ncell:B13:t:[Street Address]:l:1:f:2:cf:2:colspan:2\ncell:C13:l:1:f:2\ncell:D13:l:1:f:2\ncell:E13:l:1:f:2\ncell:F13:l:1:f:2\ncell:G13:l:1:f:2\ncell:B14:t:[City, State, Zip]:l:1:f:2:bg:3:cf:2:colspan:2\ncell:C14:l:1:f:2\ncell:D14:l:1:f:2\ncell:E14:l:1:f:2\ncell:F14:l:1:f:2\ncell:G14:l:1:f:2\ncell:B15:t:Phone\\c :l:1:f:2:cf:2:colspan:2\ncell:C15:l:1:f:2\ncell:D15:l:1:f:2\ncell:E15:l:1:f:2\ncell:F15:l:1:f:2\ncell:G15:l:1:f:2\ncell:B16:l:1:f:2\ncell:C16:l:1:f:2\ncell:D16:l:1:f:2\ncell:E16:l:1:f:2\ncell:F16:l:1:f:2\ncell:G16:l:1:f:2\ncell:B17:t:DESCRIPTION:l:1:f:3:c:4:bg:2:cf:1:colspan:5:rowspan:1\ncell:C17:t::l:1:f:3:c:4:bg:2\ncell:D17:t::l:1:f:3:c:4:bg:2\ncell:E17:t::l:1:f:3:c:4:bg:2\ncell:F17:t::l:1:f:3:c:4:bg:2\ncell:G17:t:AMOUNT:l:1:f:3:c:4:bg:2:cf:1\ncell:A18:b::1::\ncell:B18:b::1::1:l:1:f:1:cf:2:colspan:5:rowspan:1\ncell:C18:t::l:1:f:1\ncell:D18:t::l:1:f:1\ncell:E18:t::l:1:f:1\ncell:F18:t::b::2:::l:1:f:1\ncell:G18:b::1::1:l:1:f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:l:1:f:1:bg:3:cf:2:colspan:5:rowspan:1\ncell:C19:t::l:1:f:1:bg:3\ncell:D19:t::l:1:f:1:bg:3\ncell:E19:t::l:1:f:1:bg:3\ncell:F19:t::b::2:::l:1:f:1:bg:3\ncell:G19:b::1::1:l:1:f:1:bg:3:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:l:1:f:1:cf:2:colspan:5:rowspan:1\ncell:C20:t::l:1:f:1\ncell:D20:t::l:1:f:1\ncell:E20:t::l:1:f:1\ncell:F20:t::b::2:::l:1:f:1\ncell:G20:b::1::1:l:1:f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:l:1:f:1:bg:3:cf:2:colspan:5:rowspan:1\ncell:C21:t::l:1:f:1:bg:3\ncell:D21:t::l:1:f:1:bg:3\ncell:E21:t::l:1:f:1:bg:3\ncell:F21:t::b::2:::l:1:f:1:bg:3\ncell:G21:b::1::1:l:1:f:1:bg:3:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:l:1:f:1:cf:2:colspan:5:rowspan:1\ncell:C22:t::l:1:f:1\ncell:D22:t::l:1:f:1\ncell:E22:t::l:1:f:1\ncell:F22:t::b::2:::l:1:f:1\ncell:G22:b::1::1:l:1:f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:l:1:f:1:bg:3:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:1:f:1:bg:3\ncell:D23:t::l:1:f:1:bg:3\ncell:E23:t::l:1:f:1:bg:3\ncell:F23:t::b::2:::l:1:f:1:bg:3\ncell:G23:b::1::1:l:1:f:1:bg:3:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:l:1:f:1:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:1:f:1\ncell:D24:t::l:1:f:1\ncell:E24:t::l:1:f:1\ncell:F24:t::b::2:::l:1:f:1\ncell:G24:b::1::1:l:1:f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:l:1:f:1:bg:3:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:1:f:1:bg:3\ncell:D25:t::l:1:f:1:bg:3\ncell:E25:t::l:1:f:1:bg:3\ncell:F25:t::b::2:::l:1:f:1:bg:3\ncell:G25:b::1::1:l:1:f:1:bg:3:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:l:1:f:1:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:1:f:1\ncell:D26:t::l:1:f:1\ncell:E26:t::l:1:f:1\ncell:F26:t::b::2:::l:1:f:1\ncell:G26:b::1::1:l:1:f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:l:1:f:1:bg:3:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:1:f:1:bg:3\ncell:D27:t::l:1:f:1:bg:3\ncell:E27:t::l:1:f:1:bg:3\ncell:F27:t::b::2:::l:1:f:1:bg:3\ncell:G27:b::1::1:l:1:f:1:bg:3:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:l:1:f:1:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:1:f:1\ncell:D28:t::l:1:f:1\ncell:E28:t::l:1:f:1\ncell:F28:t::b::2:::l:1:f:1\ncell:G28:b::1::1:l:1:f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:l:1:f:1:bg:3:cf:2:colspan:5:rowspan:1\ncell:C29:t::b:::2::l:1:f:1:bg:3\ncell:D29:t::b:::2::l:1:f:1:bg:3\ncell:E29:t::b:::2::l:1:f:1:bg:3\ncell:F29:t::b::2:2::l:1:f:1:bg:3\ncell:G29:b::1:1:1:l:1:f:1:bg:3:ntvf:1\ncell:B30:b:2::::l:1:f:2\ncell:C30:b:2::::l:1:f:2\ncell:D30:b:2::::l:1:f:2\ncell:E30:b:2::::l:1:f:2\ncell:F30:t:Subtotal:b:1::::l:1:f:2\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::1::l:1:f:2:ntvf:1\ncell:B31:t:NOTES:b:::1::l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:2\ncell:D31:t::b:::2::l:1:f:2\ncell:E31:l:1:f:2\ncell:F31:t:Tax Rate:l:1:f:1\ncell:G31:v:0:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:A32:b::1::\ncell:B32:b:1:1::1:l:1:f:1:cf:2:colspan:3\ncell:C32:t::b:2::::l:1:f:2\ncell:D32:t::b:2::::l:1:f:2\ncell:E32:l:1:f:2\ncell:F32:t:Tax:l:1:f:1\ncell:G32:vtf:n:0:G31*G30:b:::1::l:1:f:1:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:l:1:f:1:bg:3:cf:2:colspan:3\ncell:C33:t::l:1:f:2\ncell:D33:t::l:1:f:2\ncell:E33:l:1:f:2\ncell:F33:t:Other:l:1:f:1\ncell:G33:v:0:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:B34:b::1:1:1:l:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:1:f:2\ncell:D34:t::l:1:f:2\ncell:E34:l:1:f:2\ncell:F34:t:TOTAL:l:1:f:2\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::1::l:1:f:2:ntvf:1\ncell:B35:l:1:f:2\ncell:C35:l:1:f:2\ncell:D35:l:1:f:2\ncell:E35:l:1:f:2\ncell:F35:l:1:f:2\ncell:G35:b:1::::l:1:f:2\ncell:B36:l:1:f:2\ncell:C36:l:1:f:2\ncell:D36:l:1:f:2\ncell:E36:l:1:f:2\ncell:F36:l:1:f:2\ncell:G36:l:1:f:2\ncell:B37:t:Thank you for business:l:1:f:2:cf:1:colspan:6:rowspan:1\ncell:C37:t::l:1:f:2\ncell:D37:t::l:1:f:2\ncell:E37:t::l:1:f:2\ncell:F37:t::l:1:f:2\ncell:G37:t::l:1:f:2\ncell:B38:l:1:f:2\ncell:C38:l:1:f:2\ncell:D38:l:1:f:2\ncell:E38:l:1:f:2\ncell:F38:l:1:f:2\ncell:G38:l:1:f:2\ncell:B39:l:1:f:2:bg:5:colspan:6\ncell:C39:l:1:f:2\ncell:D39:l:1:f:2\ncell:E39:l:1:f:2\ncell:F39:l:1:f:2\ncell:G39:l:1:f:2\ncell:B40:l:1:f:2:bg:2:colspan:6:rowspan:2\ncell:C40:l:1:f:2\ncell:D40:l:1:f:2\ncell:E40:l:1:f:2\ncell:F40:l:1:f:2\ncell:G40:l:1:f:2\ncell:B41:l:1:f:2\ncell:C41:l:1:f:2\ncell:D41:l:1:f:2\ncell:E41:l:1:f:2\ncell:F41:l:1:f:2\ncell:G41:l:1:f:2\ncell:B42:l:1:f:2\ncell:C42:l:1:f:2\ncell:D42:l:1:f:2\ncell:E42:l:1:f:2\ncell:F42:l:1:f:2\ncell:G42:l:1:f:2\ncol:A:w:40\ncol:B:w:125\ncol:C:w:53\ncol:D:w:50\ncol:E:w:54\ncol:F:w:91\ncol:G:w:118\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:37:h:15.75\nsheet:c:7:r:42:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0,0,0)\ncolor:2:rgb(136,100,8)\ncolor:3:rgb(233,233,233)\ncolor:4:rgb(255, 255, 255)\ncolor:5:rgb(91,17,1)\nfont:1:normal normal 10pt arial,helvetica,sans-serif\nfont:2:normal normal 11pt arial,helvetica,sans-serif\nfont:3:normal normal 12pt arial,helvetica,sans-serif\nfont:4:normal normal 18pt arial,helvetica,sans-serif\nlayout:1:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n"},"name":"typeiii","hidden":"0"},"sheet6":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:[Company Name]:l:1:f:3:c:3:bg:1:cf:2:colspan:3:rowspan:1\ncell:C2:t::l:1:f:2\ncell:D2:t::l:1:f:2\ncell:E2:l:1:f:2\ncell:F2:t:INVOICE:l:1:f:4:c:3:bg:1:cf:2:colspan:2\ncell:G2:t::l:1:f:2\ncell:B3:t:[Company slogan]:l:1:f:1:c:3:bg:4:cf:2:colspan:3:rowspan:1\ncell:C3:t::l:1:f:2:c:3:bg:4\ncell:D3:t::l:1:f:2:c:3:bg:4\ncell:E3:l:1:f:2\ncell:F3:l:1:f:2:c:3:bg:4:colspan:2\ncell:G3:l:1:f:2\ncell:B4:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C4:l:1:f:2\ncell:D4:l:1:f:2\ncell:E4:l:1:f:2\ncell:F4:l:1:f:2:tvf:4:rowspan:4\ncell:G4:l:1:f:2\ncell:B5:t:[Street Address]:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C5:l:1:f:2\ncell:D5:l:1:f:2\ncell:E5:l:1:f:2\ncell:F5:l:1:f:2\ncell:G5:l:1:f:2:cf:1\ncell:B6:t:[City, State, Zip]:l:1:f:2:bg:2:cf:2:colspan:3:rowspan:1\ncell:C6:l:1:f:2\ncell:D6:l:1:f:2\ncell:E6:l:1:f:2\ncell:F6:l:1:f:2\ncell:G6:l:1:f:2\ncell:B7:t:Phone\\c :l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C7:l:1:f:2\ncell:D7:l:1:f:2\ncell:E7:l:1:f:2\ncell:F7:l:1:f:2\ncell:G7:l:1:f:2\ncell:B8:t:Email\\c:l:1:f:2:bg:2:cf:2:colspan:3:rowspan:1\ncell:C8:l:1:f:2\ncell:D8:l:1:f:2\ncell:E8:l:1:f:2\ncell:F8:l:1:f:2\ncell:G8:l:1:f:2\ncell:B9:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C9:l:1:f:2\ncell:D9:l:1:f:2\ncell:E9:l:1:f:2\ncell:F9:l:1:f:2\ncell:G9:l:1:f:2\ncell:B10:t:BILL TO\\c:l:1:f:3:c:3:bg:1:cf:2:colspan:3\ncell:C10:l:1:f:2\ncell:D10:l:1:f:2\ncell:E10:l:1:f:2\ncell:F10:t:DATE\\c:l:1:f:2:cf:2\ncell:G10:b:::1::l:1:f:2:cf:2:ntvf:3\ncell:B11:t:[Name]:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C11:l:1:f:2\ncell:D11:l:1:f:2\ncell:E11:l:1:f:2\ncell:F11:t:INVOICE # \\c:l:1:f:2:cf:2\ncell:G11:b:1::1::l:1:f:2:cf:2\ncell:B12:t:[Company Name]:l:1:f:2:bg:2:cf:2:colspan:3:rowspan:1\ncell:C12:l:1:f:2\ncell:D12:l:1:f:2\ncell:E12:l:1:f:2\ncell:F12:l:1:f:2\ncell:G12:b:1::::l:1:f:2\ncell:J12:tvf:4\ncell:B13:t:[Street Address]:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C13:l:1:f:2\ncell:D13:l:1:f:2\ncell:E13:l:1:f:2\ncell:F13:l:1:f:2\ncell:G13:l:1:f:2\ncell:B14:t:[City, State, Zip]:l:1:f:2:bg:2:cf:2:colspan:3:rowspan:1\ncell:C14:l:1:f:2\ncell:D14:l:1:f:2\ncell:E14:l:1:f:2\ncell:F14:l:1:f:2\ncell:G14:l:1:f:2\ncell:B15:t:Phone\\c :l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C15:l:1:f:2\ncell:D15:l:1:f:2\ncell:E15:l:1:f:2\ncell:F15:l:1:f:2\ncell:G15:l:1:f:2\ncell:B16:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C16:l:1:f:2\ncell:D16:l:1:f:2\ncell:E16:l:1:f:2\ncell:F16:l:1:f:2\ncell:G16:l:1:f:2\ncell:B17:t:DESCRIPTION:l:1:f:3:c:3:bg:1:cf:1:colspan:3:rowspan:1\ncell:C17:t::l:1:f:3:c:3:bg:1\ncell:D17:t::l:1:f:3:c:3:bg:1\ncell:E17:t:HOURS:l:1:f:3:c:3:bg:1:cf:1\ncell:F17:t:RATE:l:1:f:3:c:3:bg:1:cf:1\ncell:G17:t:AMOUNT:l:1:f:3:c:3:bg:1:cf:1\ncell:A18:b::1::\ncell:B18:b::1::1:l:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C18:t::l:1:f:1\ncell:D18:t::b::2:::l:1:f:1\ncell:E18:b::1::1:l:1:f:1:ntvf:1\ncell:F18:b::1::1:l:1:f:1:ntvf:1\ncell:G18:vtf:t::IF(E18*F18>0,E18*F18,\"\"):b::1::1:l:1:f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:l:1:f:1:bg:2:cf:2:colspan:3:rowspan:1\ncell:C19:t::l:1:f:1:bg:2\ncell:D19:t::b::2:::l:1:f:1:bg:2\ncell:E19:b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:F19:b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:G19:vtf:t::IF(E19*F19>0,E19*F19,\"\"):b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:l:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C20:t::l:1:f:1\ncell:D20:t::b::2:::l:1:f:1\ncell:E20:b::1::1:l:1:f:1:ntvf:1\ncell:F20:b::1::1:l:1:f:1:ntvf:1\ncell:G20:vtf:t::IF(E20*F20>0,E20*F20,\"\"):b::1::1:l:1:f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:l:1:f:1:bg:2:cf:2:colspan:3:rowspan:1\ncell:C21:t::l:1:f:1:bg:2\ncell:D21:t::b::2:::l:1:f:1:bg:2\ncell:E21:b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:F21:b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:G21:vtf:t::IF(E21*F21>0,E21*F21,\"\"):b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:l:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C22:t::l:1:f:1\ncell:D22:t::b::2:::l:1:f:1\ncell:E22:b::1::1:l:1:f:1:ntvf:1\ncell:F22:b::1::1:l:1:f:1:ntvf:1\ncell:G22:vtf:t::IF(E22*F22>0,E22*F22,\"\"):b::1::1:l:1:f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:l:1:f:1:bg:2:cf:2:colspan:3:rowspan:1\ncell:C23:t::l:1:f:1:bg:2\ncell:D23:t::b::2:::l:1:f:1:bg:2\ncell:E23:b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:F23:b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:G23:vtf:t::IF(E23*F23>0,E23*F23,\"\"):b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:l:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C24:t::l:1:f:1\ncell:D24:t::b::2:::l:1:f:1\ncell:E24:b::1::1:l:1:f:1:ntvf:1\ncell:F24:b::1::1:l:1:f:1:ntvf:1\ncell:G24:vtf:t::IF(E24*F24>0,E24*F24,\"\"):b::1::1:l:1:f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:l:1:f:1:bg:2:cf:2:colspan:3:rowspan:1\ncell:C25:t::l:1:f:1:bg:2\ncell:D25:t::b::2:::l:1:f:1:bg:2\ncell:E25:b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:F25:b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:G25:vtf:t::IF(E25*F25>0,E25*F25,\"\"):b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:l:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C26:t::l:1:f:1\ncell:D26:t::b::2:::l:1:f:1\ncell:E26:b::1::1:l:1:f:1:ntvf:1\ncell:F26:b::1::1:l:1:f:1:ntvf:1\ncell:G26:vtf:t::IF(E26*F26>0,E26*F26,\"\"):b::1::1:l:1:f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:l:1:f:1:bg:2:cf:2:colspan:3:rowspan:1\ncell:C27:t::l:1:f:1:bg:2\ncell:D27:t::b::2:::l:1:f:1:bg:2\ncell:E27:b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:F27:b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:G27:vtf:t::IF(E27*F27>0,E27*F27,\"\"):b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:l:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C28:t::l:1:f:1\ncell:D28:t::b::2:::l:1:f:1\ncell:E28:b::1::1:l:1:f:1:ntvf:1\ncell:F28:b::1::1:l:1:f:1:ntvf:1\ncell:G28:vtf:t::IF(E28*F28>0,E28*F28,\"\"):b::1::1:l:1:f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:l:1:f:1:bg:2:cf:2:colspan:3:rowspan:1\ncell:C29:t::b:::2::l:1:f:1:bg:2\ncell:D29:t::b::2:2::l:1:f:1:bg:2\ncell:E29:b::1:1:1:l:1:f:1:bg:2:ntvf:1\ncell:F29:b::1:1:1:l:1:f:1:bg:2:ntvf:1\ncell:G29:vtf:t::IF(E29*F29>0,E29*F29,\"\"):b::1::1:l:1:f:1:bg:2:ntvf:1\ncell:B30:b:2::::l:1:f:2:cf:1:colspan:3:rowspan:1\ncell:C30:t::b:2::::l:1:f:2\ncell:D30:t::b:2::::l:1:f:2\ncell:E30:b:2::::l:1:f:2\ncell:F30:t:Subtotal:b:1::::l:1:f:2\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::1::l:1:f:2:ntvf:1\ncell:B31:t:NOTES:b:::1::l:1:f:3:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:2\ncell:D31:t::b:::2::l:1:f:2\ncell:E31:l:1:f:2\ncell:F31:t:Tax Rate:l:1:f:1\ncell:G31:v:0:b:1:1:1:1:l:1:f:1:ntvf:2\ncell:A32:b::1::\ncell:B32:b:1:1::1:l:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C32:t::b:2::::l:1:f:2\ncell:D32:t::b:2::::l:1:f:2\ncell:E32:l:1:f:2\ncell:F32:t:Tax:l:1:f:1\ncell:G32:vtf:n:0:G31*G30:b:::1::l:1:f:1:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:l:1:f:1:bg:2:cf:2:colspan:3:rowspan:1\ncell:C33:t::l:1:f:2\ncell:D33:t::l:1:f:2\ncell:E33:l:1:f:2\ncell:F33:t:Other:l:1:f:1\ncell:G33:v:0:b:1:1:1:1:l:1:f:1:ntvf:1\ncell:B34:b::1:1:1:l:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:1:f:2\ncell:D34:t::l:1:f:2\ncell:E34:l:1:f:2\ncell:F34:t:TOTAL:l:1:f:2\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::1::l:1:f:2:ntvf:1\ncell:B35:b:2::::l:1:f:2\ncell:C35:b:2::::l:1:f:2\ncell:D35:b:2::::l:1:f:2\ncell:E35:l:1:f:2\ncell:F35:l:1:f:2\ncell:G35:b:1::::l:1:f:2\ncell:B36:l:1:f:2\ncell:C36:l:1:f:2\ncell:D36:l:1:f:2\ncell:E36:l:1:f:2\ncell:F36:l:1:f:2\ncell:G36:l:1:f:2\ncell:B37:t:Thank you for business:l:1:f:2:cf:1:colspan:6:rowspan:1\ncell:C37:t::l:1:f:2\ncell:D37:t::l:1:f:2\ncell:E37:t::l:1:f:2\ncell:F37:t::l:1:f:2\ncell:G37:t::l:1:f:2\ncell:B38:l:1:f:2\ncell:C38:l:1:f:2\ncell:D38:l:1:f:2\ncell:E38:l:1:f:2\ncell:F38:l:1:f:2\ncell:G38:l:1:f:2\ncell:B39:l:1:f:2:bg:4:colspan:6\ncell:C39:l:1:f:2\ncell:D39:l:1:f:2\ncell:E39:l:1:f:2\ncell:F39:l:1:f:2\ncell:G39:l:1:f:2\ncell:B40:l:1:f:2:bg:1:colspan:6:rowspan:2\ncell:C40:l:1:f:2\ncell:D40:l:1:f:2\ncell:E40:l:1:f:2\ncell:F40:l:1:f:2\ncell:G40:l:1:f:2\ncell:B41:l:1:f:2\ncell:C41:l:1:f:2\ncell:D41:l:1:f:2\ncell:E41:l:1:f:2\ncell:F41:l:1:f:2\ncell:G41:l:1:f:2\ncell:B42:l:1:f:2\ncell:C42:l:1:f:2\ncell:D42:l:1:f:2\ncell:E42:l:1:f:2\ncell:F42:l:1:f:2\ncell:G42:l:1:f:2\ncell:B43:l:1:f:2\ncell:C43:l:1:f:2\ncell:D43:l:1:f:2\ncell:E43:l:1:f:2\ncell:F43:l:1:f:2\ncell:G43:l:1:f:2\ncell:B44:l:1:f:2\ncell:C44:l:1:f:2\ncell:D44:l:1:f:2\ncell:E44:l:1:f:2\ncell:F44:l:1:f:2\ncell:G44:l:1:f:2\ncell:B45:l:1:f:2\ncell:C45:l:1:f:2\ncell:D45:l:1:f:2\ncell:E45:l:1:f:2\ncell:F45:l:1:f:2\ncell:G45:l:1:f:2\ncell:B46:l:1:f:2\ncell:C46:l:1:f:2\ncell:D46:l:1:f:2\ncell:E46:l:1:f:2\ncell:F46:l:1:f:2\ncell:G46:l:1:f:2\ncol:A:w:40\ncol:B:w:50\ncol:C:w:114\ncol:D:w:74\ncol:E:w:80\ncol:F:w:90\ncol:G:w:85\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:37:h:15.75\nsheet:c:10:r:46:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(136,100,8)\ncolor:2:rgb(233,233,233)\ncolor:3:rgb(255, 255, 255)\ncolor:4:rgb(91,17,1)\nfont:1:normal normal 10pt arial,helvetica,sans-serif\nfont:2:normal normal 11pt arial,helvetica,sans-serif\nfont:3:normal normal 12pt arial,helvetica,sans-serif\nfont:4:normal normal 18pt arial,helvetica,sans-serif\nlayout:1:padding:4px 4px 4px 4px;vertical-align:bottom;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n"},"name":"typeiv","hidden":"0"},"sheet7":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:[Company Name]:l:2:f:4:c:4:bg:2:cf:2:colspan:3\ncell:C2:t::l:1:f:1\ncell:D2:t::l:1:f:1\ncell:E2:l:1:f:1:c:1:cf:3\ncell:F2:t:INVOICE:l:1:f:5:c:4:bg:2:cf:1:colspan:2\ncell:G2:t::l:1:f:1\ncell:H2:l:1:f:1\ncell:B3:t:[Company Slogan]:l:1:f:2:cf:2:colspan:3\ncell:C3:t::l:1:f:1\ncell:D3:t::l:1:f:1\ncell:E3:l:1:f:1\ncell:F3:l:1:f:1\ncell:G3:l:1:f:1\ncell:H3:l:1:f:1\ncell:B4:l:1:f:1:colspan:2\ncell:C4:l:1:f:1\ncell:D4:l:1:f:1\ncell:E4:l:1:f:1\ncell:F4:l:1:f:1:tvf:5:rowspan:4\ncell:G4:l:1:f:1\ncell:H4:l:1:f:1\ncell:B5:t:[Street Address]:l:1:f:3:cf:2:colspan:2\ncell:C5:l:1:f:1\ncell:D5:l:1:f:1\ncell:E5:l:1:f:1\ncell:F5:l:1:f:1\ncell:G5:l:1:f:1:cf:1\ncell:H5:l:1:f:1\ncell:B6:t:[City, State, Zip]:l:1:f:3:bg:3:cf:2:colspan:2\ncell:C6:l:1:f:1\ncell:D6:l:1:f:1\ncell:E6:l:1:f:1\ncell:F6:l:1:f:1\ncell:G6:l:1:f:1\ncell:H6:l:1:f:1\ncell:B7:t:Phone\\c :l:1:f:3:cf:2:colspan:2\ncell:C7:l:1:f:1\ncell:D7:l:1:f:1:ntvf:1\ncell:E7:l:1:f:1\ncell:F7:l:1:f:1\ncell:G7:l:1:f:1\ncell:H7:l:1:f:1\ncell:B8:t:[Email\\c]:l:1:f:3:bg:3:cf:2:colspan:2\ncell:C8:l:1:f:1\ncell:D8:l:1:f:1\ncell:E8:l:1:f:1\ncell:F8:t:Invoice Number:l:1:f:3\ncell:G8:b:::1::l:1:f:3:ntvf:1\ncell:H8:l:1:f:1\ncell:B9:l:1:f:1:colspan:2\ncell:C9:l:1:f:1\ncell:D9:l:1:f:1\ncell:E9:l:1:f:1\ncell:F9:t:Invoice Date:l:1:f:3\ncell:G9:b:1::1::l:1:f:3:ntvf:4\ncell:H9:l:1:f:1\ncell:B10:t:BILL TO\\c:l:3:f:4:c:4:bg:2:cf:1:colspan:2\ncell:C10:l:1:f:1\ncell:D10:l:1:f:1\ncell:E10:l:1:f:1\ncell:F10:t:Order Number:l:1:f:3\ncell:G10:b:1::1::l:1:f:3:ntvf:1\ncell:H10:l:1:f:1\ncell:B11:t:[Name]:l:1:f:3:cf:2:colspan:2\ncell:C11:l:1:f:1\ncell:D11:l:1:f:1\ncell:E11:l:1:f:1\ncell:F11:t:Terms:l:1:f:3\ncell:G11:b:1::1::l:1:f:3\ncell:H11:l:1:f:1\ncell:B12:t:[Company Name]:l:1:f:3:bg:3:cf:2:colspan:2\ncell:C12:l:1:f:1\ncell:D12:l:1:f:1\ncell:E12:l:1:f:1\ncell:F12:t:Sales Rep:l:1:f:3\ncell:G12:b:1::1::l:1:f:3\ncell:H12:l:1:f:1\ncell:B13:t:[Street Address]:l:1:f:3:cf:2:colspan:2\ncell:C13:l:1:f:1\ncell:D13:l:1:f:1\ncell:E13:l:1:f:1\ncell:F13:t:Shipped Via:l:1:f:3\ncell:G13:b:1::1::l:1:f:3\ncell:H13:l:1:f:1\ncell:B14:t:[City, State, Zip]:l:1:f:3:bg:3:cf:2:colspan:2\ncell:C14:l:1:f:1\ncell:D14:l:1:f:1\ncell:E14:l:1:f:1\ncell:F14:t:FOB:l:1:f:3\ncell:G14:b:1::1::l:1:f:3\ncell:H14:l:1:f:1\ncell:B15:t:Phone\\c :l:1:f:3:cf:2:colspan:2\ncell:C15:l:1:f:1\ncell:D15:l:1:f:1:ntvf:1\ncell:E15:l:1:f:1\ncell:F15:t:Prepaid or Collect:l:1:f:3\ncell:G15:b:1::1::l:1:f:3\ncell:H15:l:1:f:1\ncell:B16:l:1:f:1\ncell:C16:l:1:f:1\ncell:D16:l:1:f:1\ncell:E16:l:1:f:1\ncell:F16:l:1:f:1\ncell:G16:b:1::::l:1:f:1\ncell:H16:l:1:f:1\ncell:B17:t:DESCRIPTION:l:1:f:4:c:4:bg:2:cf:1:colspan:5:rowspan:1\ncell:C17:t::l:1:f:4:c:4:bg:2\ncell:D17:t::l:1:f:4:c:4:bg:2\ncell:E17:t::l:1:f:4:c:4:bg:2\ncell:F17:t::l:1:f:4:c:4:bg:2\ncell:G17:t:AMOUNT:l:1:f:4:c:4:bg:2:cf:1\ncell:H17:l:1:f:1\ncell:A18:b::1::\ncell:B18:b::1::1:l:1:f:2:cf:2:colspan:5:rowspan:1\ncell:C18:t::l:1:f:2\ncell:D18:t::l:1:f:2\ncell:E18:t::l:1:f:2\ncell:F18:t::b::2:::l:1:f:2\ncell:G18:b::1::1:l:1:f:2:ntvf:2\ncell:H18:l:1:f:1\ncell:A19:b::1::\ncell:B19:b::1::1:l:1:f:2:bg:3:cf:2:colspan:5:rowspan:1\ncell:C19:t::l:1:f:2:bg:3\ncell:D19:t::l:1:f:2:bg:3\ncell:E19:t::l:1:f:2:bg:3\ncell:F19:t::b::2:::l:1:f:2:bg:3\ncell:G19:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:H19:l:1:f:1\ncell:A20:b::1::\ncell:B20:b::1::1:l:1:f:2:cf:2:colspan:5:rowspan:1\ncell:C20:t::l:1:f:2\ncell:D20:t::l:1:f:2\ncell:E20:t::l:1:f:2\ncell:F20:t::b::2:::l:1:f:2\ncell:G20:b::1::1:l:1:f:2:ntvf:2\ncell:H20:l:1:f:1\ncell:A21:b::1::\ncell:B21:b::1::1:l:1:f:2:bg:3:cf:2:colspan:5:rowspan:1\ncell:C21:t::l:1:f:2:bg:3\ncell:D21:t::l:1:f:2:bg:3\ncell:E21:t::l:1:f:2:bg:3\ncell:F21:t::b::2:::l:1:f:2:bg:3\ncell:G21:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:H21:l:1:f:1\ncell:A22:b::1::\ncell:B22:b::1::1:l:1:f:2:cf:2:colspan:5:rowspan:1\ncell:C22:t::l:1:f:2\ncell:D22:t::l:1:f:2\ncell:E22:t::l:1:f:2\ncell:F22:t::b::2:::l:1:f:2\ncell:G22:b::1::1:l:1:f:2:ntvf:2\ncell:H22:l:1:f:1\ncell:A23:b::1::\ncell:B23:b::1::1:l:1:f:2:bg:3:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:1:f:2:bg:3\ncell:D23:t::l:1:f:2:bg:3\ncell:E23:t::l:1:f:2:bg:3\ncell:F23:t::b::2:::l:1:f:2:bg:3\ncell:G23:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:H23:l:1:f:1\ncell:A24:b::1::\ncell:B24:b::1::1:l:1:f:2:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:1:f:2\ncell:D24:t::l:1:f:2\ncell:E24:t::l:1:f:2\ncell:F24:t::b::2:::l:1:f:2\ncell:G24:b::1::1:l:1:f:2:ntvf:2\ncell:H24:l:1:f:1\ncell:A25:b::1::\ncell:B25:b::1::1:l:1:f:2:bg:3:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:1:f:2:bg:3\ncell:D25:t::l:1:f:2:bg:3\ncell:E25:t::l:1:f:2:bg:3\ncell:F25:t::b::2:::l:1:f:2:bg:3\ncell:G25:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:H25:l:1:f:1\ncell:A26:b::1::\ncell:B26:b::1::1:l:1:f:2:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:1:f:2\ncell:D26:t::l:1:f:2\ncell:E26:t::l:1:f:2\ncell:F26:t::b::2:::l:1:f:2\ncell:G26:b::1::1:l:1:f:2:ntvf:2\ncell:H26:l:1:f:1\ncell:A27:b::1::\ncell:B27:b::1::1:l:1:f:2:bg:3:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:1:f:2:bg:3\ncell:D27:t::l:1:f:2:bg:3\ncell:E27:t::l:1:f:2:bg:3\ncell:F27:t::b::2:::l:1:f:2:bg:3\ncell:G27:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:H27:l:1:f:1\ncell:A28:b::1::\ncell:B28:b::1::1:l:1:f:2:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:1:f:2\ncell:D28:t::l:1:f:2\ncell:E28:t::l:1:f:2\ncell:F28:t::b::2:::l:1:f:2\ncell:G28:b::1::1:l:1:f:2:ntvf:2\ncell:H28:l:1:f:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:l:1:f:2:bg:3:cf:2:colspan:5:rowspan:1\ncell:C29:t::b:::2::l:1:f:2:bg:3\ncell:D29:t::b:::2::l:1:f:2:bg:3\ncell:E29:t::b:::2::l:1:f:2:bg:3\ncell:F29:t::b::2:2::l:1:f:2:bg:3\ncell:G29:b::1:1:1:l:1:f:2:bg:3:ntvf:2\ncell:H29:l:1:f:1\ncell:B30:b:2::::l:1:f:1\ncell:C30:b:2::::l:1:f:1\ncell:D30:b:2::::l:1:f:1\ncell:E30:b:2:1:::l:1:f:1\ncell:F30:t:Subtotal:b:1:::1:l:1:f:2\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::l:1:f:2:ntvf:2\ncell:H30:b::::1:l:1:f:1\ncell:C31:t::l:1:f:1\ncell:D31:t::l:1:f:1\ncell:E31:b::1:::l:1:f:1\ncell:F31:t:Tax Rate:b::::1:l:1:f:2\ncell:G31:b:1:1:1:1:l:1:f:2:ntvf:3\ncell:H31:b::::1:l:1:f:1\ncell:B32:t:Direct all inquiries to\\c:l:1:f:3:c:4:bg:2:cf:2:colspan:3\ncell:C32:t::l:1:f:1\ncell:D32:t::l:1:f:1\ncell:E32:b::1:::l:1:f:1\ncell:F32:t:Tax:b::::1:l:1:f:2\ncell:G32:vtf:n:0:G31*G30:l:1:f:2:ntvf:2\ncell:H32:b::::1:l:1:f:1\ncell:B33:t:[Name]:l:1:f:2:cf:2\ncell:C33:l:1:f:2\ncell:D33:l:1:f:2\ncell:E33:b::1:::l:1:f:1\ncell:F33:t:Freight:b::::1:l:1:f:2\ncell:G33:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:H33:b::::1:l:1:f:1\ncell:B34:t:Phone:l:1:f:2:cf:2\ncell:C34:l:1:f:2:ntvf:1:colspan:2\ncell:D34:t::l:1:f:2\ncell:E34:b::1:::l:1:f:1\ncell:F34:t:Other:b:::1:1:l:1:f:2\ncell:G34:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:H34:b::::1:l:1:f:1\ncell:B35:t:[Email]:l:1:f:2:cf:2\ncell:C35:t::l:1:f:2\ncell:D35:t::l:1:f:2\ncell:E35:l:1:f:1\ncell:F35:t:TOTAL:b:1::1::l:3:f:3:cf:1\ncell:G35:vtf:n:0:(G30+G32)+G34:b:1::1::l:1:f:3:cf:1:ntvf:2\ncell:H35:l:1:f:1\ncell:B36:l:1:f:1\ncell:C36:l:1:f:1\ncell:D36:l:1:f:1\ncell:E36:l:1:f:1\ncell:F36:b:1::::l:1:f:1\ncell:G36:b:1::::l:1:f:1\ncell:H36:l:1:f:1\ncell:B37:l:1:f:1\ncell:C37:l:1:f:1\ncell:D37:l:1:f:1\ncell:E37:l:1:f:1\ncell:F37:l:1:f:1\ncell:G37:l:1:f:1\ncell:H37:l:1:f:1\ncell:B38:t:THANK YOU FOR BUSINESS:l:3:f:4:c:4:bg:2:cf:1:colspan:6\ncell:C38:t::l:1:f:1\ncell:D38:t::l:1:f:1\ncell:E38:t::l:1:f:1\ncell:F38:t::l:1:f:1\ncell:G38:t::l:1:f:1\ncell:H38:l:1:f:1\ncol:A:w:40\ncol:B:w:162\ncol:C:w:10\ncol:D:w:10\ncol:E:w:54\ncol:F:w:145\ncol:G:w:99\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:38:h:15.75\nsheet:c:8:r:38:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0,0,0)\ncolor:2:rgb(119,136,221)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:normal normal * arial,helvetica,sans-serif\nfont:2:normal normal 10pt arial,helvetica,sans-serif\nfont:3:normal normal 11pt arial,helvetica,sans-serif\nfont:4:normal normal 12pt arial,helvetica,sans-serif\nfont:5:normal normal 18pt arial,helvetica,sans-serif\nlayout:1:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nlayout:3:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:#,##0.00\nvalueformat:3:#,##0.00%\nvalueformat:4:m/d/yy\nvalueformat:5:text-html\n"},"name":"sheet6","hidden":"0"},"sheet8":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:[Company Name]:l:1:f:4:c:4:bg:1:cf:2:colspan:3:rowspan:1\ncell:C2:t::l:1:f:1\ncell:D2:t::l:1:f:1\ncell:E2:l:1:f:1\ncell:F2:t:INVOICE:l:2:f:5:c:4:bg:1:cf:1:colspan:2\ncell:G2:t::l:1:f:1\ncell:B3:t:[Company slogan]:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C3:t::l:1:f:1\ncell:D3:t::l:1:f:1\ncell:E3:l:1:f:1\ncell:F3:l:1:f:1\ncell:G3:l:1:f:1\ncell:B4:l:1:f:4:cf:2:colspan:3:rowspan:1\ncell:C4:l:1:f:1\ncell:D4:l:1:f:1\ncell:E4:l:1:f:1\ncell:F4:l:1:f:1:tvf:5:rowspan:4\ncell:G4:l:1:f:1\ncell:B5:t:[Street Address]:l:1:f:3:cf:2:colspan:3:rowspan:1\ncell:C5:l:1:f:3\ncell:D5:l:1:f:3\ncell:E5:l:1:f:3\ncell:F5:l:1:f:3\ncell:G5:l:1:f:3:cf:1\ncell:B6:t:[City, State, Zip]:l:1:f:3:cf:2:colspan:3:rowspan:1\ncell:C6:l:1:f:3\ncell:D6:l:1:f:3\ncell:E6:l:1:f:3\ncell:F6:l:1:f:3\ncell:G6:l:1:f:3\ncell:B7:t:Phone\\c :l:1:f:3:cf:2:colspan:3:rowspan:1\ncell:C7:l:1:f:3\ncell:D7:l:1:f:3\ncell:E7:l:1:f:3\ncell:F7:l:1:f:3\ncell:G7:l:1:f:3\ncell:B8:t:Email\\c:l:1:f:3:cf:2:colspan:3:rowspan:1\ncell:C8:l:1:f:3\ncell:D8:l:1:f:3\ncell:E8:l:1:f:3\ncell:F8:t:Invoice Number:l:1:f:3\ncell:G8:b:::1::l:1:f:3:ntvf:1\ncell:B9:l:1:f:3:cf:2:colspan:3:rowspan:1\ncell:C9:l:1:f:3\ncell:D9:l:1:f:3\ncell:E9:l:1:f:3\ncell:F9:t:Invoice Date:l:1:f:3\ncell:G9:b:1::1::l:1:f:3:ntvf:4\ncell:B10:t:BILL TO\\c:l:2:f:4:c:4:bg:1:cf:1:colspan:3\ncell:C10:l:1:f:3\ncell:D10:l:1:f:3\ncell:E10:l:1:f:3\ncell:F10:t:Terms:f:3\ncell:G10:b:1::1::f:3\ncell:B11:t:[Name]:l:1:f:3:cf:2:colspan:3:rowspan:1\ncell:C11:l:1:f:3\ncell:D11:l:1:f:3\ncell:E11:l:1:f:3\ncell:F11:t:Sales Rep:f:3\ncell:G11:b:1::1::f:3\ncell:B12:t:[Company Name]:l:1:f:3:cf:2:colspan:3:rowspan:1\ncell:C12:l:1:f:3\ncell:D12:l:1:f:3\ncell:E12:l:1:f:3\ncell:F12:t:Shipped Via:l:1:f:3\ncell:G12:b:1::1::l:1:f:3\ncell:J12:tvf:5\ncell:B13:t:[Street Address]:l:1:f:3:cf:2:colspan:3:rowspan:1\ncell:C13:l:1:f:3\ncell:D13:l:1:f:3\ncell:E13:l:1:f:3\ncell:F13:t:FOB:l:1:f:3\ncell:G13:b:1::1::l:1:f:3\ncell:B14:t:[City, State, Zip]:l:1:f:3:cf:2:colspan:3:rowspan:1\ncell:C14:l:1:f:3\ncell:D14:l:1:f:3\ncell:E14:l:1:f:3\ncell:F14:t:Prepaid or Collect:l:1:f:3\ncell:G14:b:1::1::l:1:f:3\ncell:B15:t:Phone\\c :l:1:f:3:cf:2:colspan:3:rowspan:1\ncell:C15:l:1:f:3\ncell:D15:l:1:f:3\ncell:E15:l:1:f:3\ncell:F15:t:Order Number:l:1:f:3\ncell:G15:b:1::1::l:1:f:3:ntvf:1\ncell:B16:l:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C16:l:1:f:1\ncell:D16:l:1:f:1\ncell:E16:l:1:f:1\ncell:F16:l:1:f:1\ncell:G16:b:1::::l:1:f:1\ncell:B17:t:DESCRIPTION:l:1:f:4:c:4:bg:2:cf:1:colspan:3:rowspan:1\ncell:C17:t::l:1:f:4:c:4:bg:2\ncell:D17:t::l:1:f:4:c:4:bg:2\ncell:E17:t:QUANTITY:l:1:f:4:c:4:bg:2:cf:1\ncell:F17:t:PRICE PER UNIT:l:1:f:4:c:4:bg:2:cf:1\ncell:G17:t:AMOUNT:l:1:f:4:c:4:bg:2:cf:1\ncell:A18:b::1::\ncell:B18:b::1::1:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C18:t::b::1:::l:1:f:2\ncell:D18:t::b::1:::l:1:f:2\ncell:E18:b::1::1:l:1:f:2:ntvf:2\ncell:F18:b::1::1:l:1:f:2:ntvf:2\ncell:G18:vtf:t::IF(E18*F18>0,E18*F18,\"\"):b::1::1:l:1:f:2:ntvf:2\ncell:A19:b::1::\ncell:B19:b::1::1:l:1:f:2:bg:3:cf:2:colspan:3:rowspan:1\ncell:C19:t::l:1:f:2:bg:3\ncell:D19:t::b::2:::l:1:f:2:bg:3\ncell:E19:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:F19:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:G19:vtf:t::IF(E19*F19>0,E19*F19,\"\"):b::1:::l:1:f:2:bg:3:ntvf:2\ncell:A20:b::1::\ncell:B20:b::1::1:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C20:t::l:1:f:2\ncell:D20:t::b::2:::l:1:f:2\ncell:E20:b::1::1:l:1:f:2:ntvf:2\ncell:F20:b::1::1:l:1:f:2:ntvf:2\ncell:G20:vtf:t::IF(E20*F20>0,E20*F20,\"\"):b::1:::l:1:f:2:ntvf:2\ncell:A21:b::1::\ncell:B21:b::1::1:l:1:f:2:bg:3:cf:2:colspan:3:rowspan:1\ncell:C21:t::l:1:f:2:bg:3\ncell:D21:t::b::2:::l:1:f:2:bg:3\ncell:E21:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:F21:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:G21:vtf:t::IF(E21*F21>0,E21*F21,\"\"):b::1:::l:1:f:2:bg:3:ntvf:2\ncell:A22:b::1::\ncell:B22:b::1::1:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C22:t::l:1:f:2\ncell:D22:t::b::2:::l:1:f:2\ncell:E22:b::1::1:l:1:f:2:ntvf:2\ncell:F22:b::1::1:l:1:f:2:ntvf:2\ncell:G22:vtf:t::IF(E22*F22>0,E22*F22,\"\"):b::1:::l:1:f:2:ntvf:2\ncell:A23:b::1::\ncell:B23:b::1::1:l:1:f:2:bg:3:cf:2:colspan:3:rowspan:1\ncell:C23:t::l:1:f:2:bg:3\ncell:D23:t::b::2:::l:1:f:2:bg:3\ncell:E23:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:F23:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:G23:vtf:t::IF(E23*F23>0,E23*F23,\"\"):b::1:::l:1:f:2:bg:3:ntvf:2\ncell:A24:b::1::\ncell:B24:b::1::1:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C24:t::l:1:f:2\ncell:D24:t::b::2:::l:1:f:2\ncell:E24:b::1::1:l:1:f:2:ntvf:2\ncell:F24:b::1::1:l:1:f:2:ntvf:2\ncell:G24:vtf:t::IF(E24*F24>0,E24*F24,\"\"):b::1:::l:1:f:2:ntvf:2\ncell:A25:b::1::\ncell:B25:b::1::1:l:1:f:2:bg:3:cf:2:colspan:3:rowspan:1\ncell:C25:t::l:1:f:2:bg:3\ncell:D25:t::b::2:::l:1:f:2:bg:3\ncell:E25:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:F25:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:G25:vtf:t::IF(E25*F25>0,E25*F25,\"\"):b::1:::l:1:f:2:bg:3:ntvf:2\ncell:A26:b::1::\ncell:B26:b::1::1:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C26:t::l:1:f:2\ncell:D26:t::b::2:::l:1:f:2\ncell:E26:b::1::1:l:1:f:2:ntvf:2\ncell:F26:b::1::1:l:1:f:2:ntvf:2\ncell:G26:vtf:t::IF(E26*F26>0,E26*F26,\"\"):b::1:::l:1:f:2:ntvf:2\ncell:A27:b::1::\ncell:B27:b::1::1:l:1:f:2:bg:3:cf:2:colspan:3:rowspan:1\ncell:C27:t::l:1:f:2:bg:3\ncell:D27:t::b::2:::l:1:f:2:bg:3\ncell:E27:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:F27:b::1::1:l:1:f:2:bg:3:ntvf:2\ncell:G27:vtf:t::IF(E27*F27>0,E27*F27,\"\"):b::1:::l:1:f:2:bg:3:ntvf:2\ncell:A28:b::1::\ncell:B28:b::1::1:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C28:t::l:1:f:2\ncell:D28:t::b::2:::l:1:f:2\ncell:E28:b::1::1:l:1:f:2:ntvf:2\ncell:F28:b::1::1:l:1:f:2:ntvf:2\ncell:G28:vtf:t::IF(E28*F28>0,E28*F28,\"\"):b::1:::l:1:f:2:ntvf:2\ncell:A29:b::1::\ncell:B29:b::1:1:1:l:1:f:2:bg:3:cf:2:colspan:3:rowspan:1\ncell:C29:t::b:::2::l:1:f:2:bg:3\ncell:D29:t::b::2:2::l:1:f:2:bg:3\ncell:E29:b::1:1:1:l:1:f:2:bg:3:ntvf:2\ncell:F29:b::1:1:1:l:1:f:2:bg:3:ntvf:2\ncell:G29:vtf:t::IF(E29*F29>0,E29*F29,\"\"):b::1:::l:1:f:2:bg:3:ntvf:2\ncell:B30:b:2::::l:1:f:1:cf:1\ncell:C30:t::b:2::::l:1:f:1\ncell:D30:t::b:2::::l:1:f:1\ncell:E30:b:2:1:::l:1:f:1\ncell:F30:t:Subtotal:b:1::::l:1:f:2\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::l:1:f:2:ntvf:2\ncell:H30:b::::1\ncell:C31:t::l:1:f:1\ncell:D31:t::l:1:f:1\ncell:E31:b::1:::l:1:f:1\ncell:F31:t:Tax Rate:l:1:f:2\ncell:G31:v:0:b:1:1:1:1:l:1:f:2:ntvf:3\ncell:H31:b::::1\ncell:C32:t::l:1:f:1\ncell:D32:t::l:1:f:1\ncell:E32:b::1:::l:1:f:1\ncell:F32:t:Tax:l:1:f:2\ncell:G32:vtf:n:0:G31*G30:l:1:f:2:ntvf:2\ncell:H32:b::::1\ncell:C33:t::l:1:f:1\ncell:D33:t::l:1:f:1\ncell:E33:b::1:::l:1:f:1\ncell:F33:t:Other:b:::1::l:1:f:2\ncell:G33:v:0:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:H33:b::::1\ncell:C34:t::l:1:f:1\ncell:D34:t::l:1:f:1\ncell:E34:l:1:f:1\ncell:F34:t:TOTAL:b:1::1::l:2:f:3:cf:1\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::1::l:1:f:3:cf:1:ntvf:2\ncell:B35:t:Direct all inquiries to\\c:l:1:f:3:c:4:bg:1:colspan:3\ncell:C35:l:1:f:1\ncell:D35:l:1:f:1\ncell:E35:l:1:f:1\ncell:F35:b:1::::l:1:f:1\ncell:G35:b:1::::l:1:f:1\ncell:B36:t:[Name]:l:1:f:2:colspan:3\ncell:C36:l:1:f:1\ncell:D36:l:1:f:1\ncell:E36:l:1:f:1\ncell:F36:t:Make all checks payable to\\c:l:1:f:3:c:4:bg:1:colspan:2\ncell:G36:l:1:f:1\ncell:B37:t:[Phone]:f:2:colspan:3\ncell:C37:l:1:f:1:ntvf:1:colspan:2\ncell:D37:t::l:1:f:1\ncell:E37:t::l:1:f:1\ncell:F37:t:[Company]:l:1:f:2:colspan:2\ncell:G37:t::l:1:f:1\ncell:B38:t:[Email]:l:1:f:2:colspan:3\ncell:C38:l:1:f:1\ncell:D38:l:1:f:1\ncell:E38:l:1:f:1\ncell:F38:t:[Accounts Receivable]:l:1:f:2:colspan:2\ncell:G38:l:1:f:1\ncell:F39:t:[Address]:l:1:f:2:colspan:2\ncell:F40:l:1:f:4\ncell:B42:t:THANK YOU FOR BUSINESS:l:1:f:4:c:4:bg:1:cf:1:colspan:6\ncol:A:w:40\ncol:B:w:80\ncol:C:w:45\ncol:D:w:41\ncol:E:w:92\ncol:F:w:111\ncol:G:w:116\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:37:h:15.75\nsheet:c:10:r:42:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(120,141,208)\ncolor:3:rgb(230,230,250)\ncolor:4:rgb(255, 255, 255)\nfont:1:normal normal * arial,helvetica,sans-serif\nfont:2:normal normal 10pt arial,helvetica,sans-serif\nfont:3:normal normal 11pt arial,helvetica,sans-serif\nfont:4:normal normal 12pt arial,helvetica,sans-serif\nfont:5:normal normal 18pt arial,helvetica,sans-serif\nlayout:1:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:#,##0.00\nvalueformat:3:#,##0.00%\nvalueformat:4:m/d/yy\nvalueformat:5:text-html\n"},"name":"sheet10","hidden":"0"},"sheet9":{"sheetstr":{"savestr":"version:1.5\ncell:C1:b:::1:\ncell:D1:b:::1:\ncell:E1:b:::1:\ncell:F1:b:::1:\ncell:G1:b:::1:\ncell:H1:b:::1:\ncell:B2:b::1::\ncell:C2:b:1:::1:cf:2\ncell:D2:b:1::::cf:2\ncell:E2:b:1::::cf:2\ncell:F2:b:1::::cf:2\ncell:G2:b:1:::\ncell:H2:b:1:1::\ncell:I2:b::::1\ncell:B3:b::1::\ncell:C3:t:[First Name]:b::::1:l:1:f:3:cf:2\ncell:D3:t:[Last Name]:l:1:f:3:cf:2\ncell:E3:l:1:f:3:cf:2\ncell:F3:l:1:f:3:cf:2\ncell:G3:l:1:f:3\ncell:H3:t:[Date]:b::1:::l:1:f:3:cf:1:ntvf:4\ncell:I3:b::::1:l:1:f:3\ncell:B4:b::1::\ncell:C4:t:[Company]:b::::1:l:1:f:3:cf:2:colspan:2\ncell:D4:l:1:f:3:cf:2\ncell:E4:l:1:f:3:cf:2\ncell:F4:l:1:f:3:cf:2\ncell:G4:l:1:f:3\ncell:H4:b::1:::l:1:f:3\ncell:I4:b::::1:l:1:f:3\ncell:B5:b::1::\ncell:C5:t:[street]:b::::1:l:1:f:3:cf:2:colspan:2\ncell:D5:l:1:f:3:cf:2\ncell:E5:l:1:f:3:cf:2\ncell:F5:l:1:f:3:cf:2\ncell:G5:l:1:f:3\ncell:H5:b::1:::l:1:f:3\ncell:I5:b::::1:l:1:f:3\ncell:B6:b::1::\ncell:C6:t:[city]:b::::1:l:1:f:3:cf:2\ncell:D6:t:[state]:l:1:f:3:cf:2\ncell:E6:t:[zip]:l:1:f:3:cf:2:ntvf:1\ncell:F6:l:1:f:3:cf:2\ncell:G6:l:1:f:3\ncell:H6:b::1:::l:1:f:3\ncell:I6:b::::1:l:1:f:3\ncell:B7:b::1::\ncell:C7:b::::1:l:1:f:3:cf:2\ncell:D7:l:1:f:3:cf:2\ncell:E7:l:1:f:3:cf:2\ncell:F7:l:1:f:3:cf:2\ncell:G7:l:1:f:3\ncell:H7:b::1:::l:1:f:3\ncell:I7:b::::1:l:1:f:3\ncell:B8:b::1::\ncell:C8:b::::1:l:1:f:3:cf:2\ncell:D8:l:1:f:3:cf:2\ncell:E8:l:1:f:3:cf:2\ncell:F8:l:1:f:3:cf:2\ncell:G8:l:1:f:3\ncell:H8:b::1:::l:1:f:3\ncell:I8:b::::1:l:1:f:3\ncell:B9:b::1::\ncell:C9:t:[AddFormMail]:b::::1:l:1:f:3:cf:2:colspan:2\ncell:D9:l:1:f:3:cf:2\ncell:E9:l:1:f:3:cf:2\ncell:F9:l:1:f:3:cf:2\ncell:G9:l:1:f:3\ncell:H9:b::1:::l:1:f:3\ncell:I9:b::::1:l:1:f:3\ncell:B10:b::1::\ncell:C10:b::::1:l:1:f:3:cf:2\ncell:D10:l:1:f:3:cf:2\ncell:E10:l:1:f:3:cf:2\ncell:F10:l:1:f:3:cf:2\ncell:G10:l:1:f:3\ncell:H10:b::1:::l:1:f:3\ncell:I10:b::::1:l:1:f:3\ncell:B11:b::1::\ncell:C11:b::::1:l:1:f:3\ncell:D11:l:1:f:3\ncell:E11:l:1:f:3\ncell:F11:l:1:f:3\ncell:G11:l:1:f:3\ncell:H11:b::1:::l:1:f:3\ncell:I11:b::::1:l:1:f:3\ncell:B12:b::1::\ncell:C12:b::::1:l:1:f:3\ncell:D12:t:INVOICE:l:3:f:3:cf:1\ncell:E12:t:[Invoice No]:b:1:1:1:1:l:3:f:3:cf:1:ntvf:1\ncell:F12:t:ORDERED ON:l:3:f:3:cf:1\ncell:G12:t:[Purchase Order Date]:b:1:1:1:1:l:3:f:3:bg:3:cf:1:ntvf:4\ncell:H12:b::1:::l:1:f:3\ncell:I12:b::::1:l:1:f:3\ncell:B13:b::1::\ncell:C13:b::::1:l:1:f:3\ncell:D13:l:1:f:3\ncell:E13:l:1:f:3\ncell:F13:l:1:f:3\ncell:G13:l:1:f:3\ncell:H13:b::1:::l:1:f:3\ncell:I13:b::::1:l:1:f:3\ncell:B14:b::1::\ncell:C14:t:We are charging you according to our Conditions of Sales and terms of Delivery as follows\\c:b::1::1:l:2:f:3:cf:1:colspan:6\ncell:D14:l:1:f:3\ncell:E14:l:1:f:3\ncell:F14:l:1:f:3\ncell:G14:l:1:f:3\ncell:H14:b::1:::l:1:f:3\ncell:I14:b::::1:l:1:f:3\ncell:B15:b::1::\ncell:C15:b::::1:l:1:f:1\ncell:D15:l:1:f:1\ncell:E15:l:1:f:1\ncell:F15:l:1:f:1\ncell:G15:l:1:f:1\ncell:H15:b::1:::l:1:f:1\ncell:I15:b::::1:l:1:f:1\ncell:B16:b::1::\ncell:C16:t:DESCRIPTION:b::::1:l:3:f:4:c:3:bg:1:cf:1:colspan:3\ncell:D16:t::l:3:f:4:c:3:bg:1:cf:1\ncell:E16:t::l:3:f:4:c:3:bg:1:cf:1\ncell:F16:t:QUANTITY:l:3:f:4:c:3:bg:1:cf:1\ncell:G16:t:PRICE PER UNIT:l:3:f:4:c:3:bg:1:cf:1\ncell:H16:t:AMOUNT:b::1:::l:3:f:4:c:3:bg:1:cf:1\ncell:I16:b::::1:l:1:f:1\ncell:B17:b::1::\ncell:C17:b::1::1:l:1:f:2:cf:2:colspan:3\ncell:D17:t::l:1:f:2\ncell:E17:t::l:1:f:2\ncell:F17:b::1::1:l:1:f:2:ntvf:2\ncell:G17:b::1::1:l:1:f:2:ntvf:2\ncell:H17:vtf:t::IF(F17*G17>0,F17*G17,\"\"):b::1::1:l:1:f:2:ntvf:2\ncell:I17:b::::1:l:1:f:1\ncell:B18:b::1::\ncell:C18:b::1::1:l:1:f:2:bg:2:cf:2:colspan:3\ncell:D18:t::l:1:f:2:bg:2\ncell:E18:t::l:1:f:2:bg:2\ncell:F18:b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:G18:b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:H18:vtf:t::IF(F18*G18>0,F18*G18,\"\"):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:I18:b::::1:l:1:f:1\ncell:B19:b::1::\ncell:C19:b::1::1:l:1:f:2:cf:2:colspan:3\ncell:D19:t::l:1:f:2\ncell:E19:t::l:1:f:2\ncell:F19:b::1::1:l:1:f:2:ntvf:2\ncell:G19:b::1::1:l:1:f:2:ntvf:2\ncell:H19:vtf:t::IF(F19*G19>0,F19*G19,\"\"):b::1::1:l:1:f:2:ntvf:2\ncell:I19:b::::1:l:1:f:1\ncell:B20:b::1::\ncell:C20:b::1::1:l:1:f:2:bg:2:cf:2:colspan:3\ncell:D20:t::l:1:f:2:bg:2\ncell:E20:t::l:1:f:2:bg:2\ncell:F20:b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:G20:b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:H20:vtf:t::IF(F20*G20>0,F20*G20,\"\"):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:I20:b::::1:l:1:f:1\ncell:B21:b::1::\ncell:C21:b::1::1:l:1:f:2:cf:2:colspan:3\ncell:D21:t::l:1:f:2\ncell:E21:t::l:1:f:2\ncell:F21:b::1::1:l:1:f:2:ntvf:2\ncell:G21:b::1::1:l:1:f:2:ntvf:2\ncell:H21:vtf:t::IF(F21*G21>0,F21*G21,\"\"):b::1::1:l:1:f:2:ntvf:2\ncell:I21:b::::1:l:1:f:1\ncell:B22:b::1::\ncell:C22:b::1::1:l:1:f:2:bg:2:cf:2:colspan:3\ncell:D22:t::l:1:f:2:bg:2\ncell:E22:t::l:1:f:2:bg:2\ncell:F22:b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:G22:b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:H22:vtf:t::IF(F22*G22>0,F22*G22,\"\"):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:I22:b::::1:l:1:f:1\ncell:B23:b::1::\ncell:C23:b::1::1:l:1:f:2:cf:2:colspan:3\ncell:D23:t::l:1:f:2\ncell:E23:t::l:1:f:2\ncell:F23:b::1::1:l:1:f:2:ntvf:2\ncell:G23:b::1::1:l:1:f:2:ntvf:2\ncell:H23:vtf:t::IF(F23*G23>0,F23*G23,\"\"):b::1::1:l:1:f:2:ntvf:2\ncell:I23:b::::1:l:1:f:1\ncell:B24:b::1::\ncell:C24:b::1::1:l:1:f:2:bg:2:cf:2:colspan:3\ncell:D24:t::l:1:f:2:bg:2\ncell:E24:t::l:1:f:2:bg:2\ncell:F24:b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:G24:b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:H24:vtf:t::IF(F24*G24>0,F24*G24,\"\"):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:I24:b::::1:l:1:f:1\ncell:B25:b::1::\ncell:C25:b::1::1:l:1:f:2:cf:2:colspan:3\ncell:D25:t::l:1:f:2\ncell:E25:t::l:1:f:2\ncell:F25:b::1::1:l:1:f:2:ntvf:2\ncell:G25:b::1::1:l:1:f:2:ntvf:2\ncell:H25:vtf:t::IF(F25*G25>0,F25*G25,\"\"):b::1::1:l:1:f:2:ntvf:2\ncell:I25:b::::1:l:1:f:1\ncell:B26:b::1::\ncell:C26:b::1::1:l:1:f:2:bg:2:cf:2:colspan:3\ncell:D26:t::l:1:f:2:bg:2\ncell:E26:t::l:1:f:2:bg:2\ncell:F26:b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:G26:b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:H26:vtf:t::IF(F26*G26>0,F26*G26,\"\"):b::1::1:l:1:f:2:bg:2:ntvf:2\ncell:I26:b::::1:l:1:f:1\ncell:B27:b::1::\ncell:C27:b::1::1:l:1:f:2:cf:2:colspan:3\ncell:D27:t::l:1:f:2\ncell:E27:t::l:1:f:2\ncell:F27:b::1::1:l:1:f:2:ntvf:2\ncell:G27:b::1::1:l:1:f:2:ntvf:2\ncell:H27:vtf:t::IF(F27*G27>0,F27*G27,\"\"):b::1::1:l:1:f:2:ntvf:2\ncell:I27:b::::1:l:1:f:1\ncell:B28:b::1::\ncell:C28:b::1:1:1:l:1:f:2:bg:2:cf:2:colspan:3\ncell:D28:t::b:::1::l:1:f:2:bg:2\ncell:E28:t::b:::1::l:1:f:2:bg:2\ncell:F28:b::1:1:1:l:1:f:2:bg:2:ntvf:2\ncell:G28:b::1:1:1:l:1:f:2:bg:2:ntvf:2\ncell:H28:vtf:t::IF(F28*G28>0,F28*G28,\"\"):b::1:1:1:l:1:f:2:bg:2:ntvf:2\ncell:I28:b::::1:l:1:f:1\ncell:B29:b::1::\ncell:C29:b::::1:l:1:f:1\ncell:D29:t::l:1:f:1\ncell:E29:t::l:1:f:1\ncell:F29:b::1:::l:1:f:1\ncell:G29:t:Subtotal:l:1:f:2\ncell:H29:vtf:n:0:SUM(H17\\cH28):b::1:::l:1:f:2:ntvf:2\ncell:I29:b::::1:l:1:f:1\ncell:B30:b::1::\ncell:C30:b::::1:l:1:f:1\ncell:D30:t::l:1:f:1\ncell:E30:t::l:1:f:1\ncell:F30:b::1:::l:1:f:1\ncell:G30:t:Tax Rate:l:1:f:2\ncell:H30:v:0:b:1:1:1:1:l:1:f:2:ntvf:3\ncell:I30:b::::1:l:1:f:1\ncell:B31:b::1::\ncell:C31:t:[Terms Of Payment]:b::::1:l:1:f:2:cf:1:colspan:2\ncell:D31:t::l:1:f:1\ncell:E31:t::l:1:f:1\ncell:F31:b::1:::l:1:f:1\ncell:G31:t:Tax:l:1:f:2\ncell:H31:vtf:n:0:H30*H29:b::1:::l:1:f:2:ntvf:2\ncell:I31:b::::1:l:1:f:1\ncell:B32:b::1::\ncell:C32:b::::1:l:1:f:1:colspan:2\ncell:D32:t::l:1:f:1\ncell:E32:t::l:1:f:1\ncell:F32:b::1:::l:1:f:1\ncell:G32:t:Other:l:1:f:2\ncell:H32:v:0:b:1:1:1:1:l:1:f:2:ntvf:2\ncell:I32:b::::1:l:1:f:1\ncell:B33:b::1::\ncell:C33:b::::1:l:1:f:1:colspan:2\ncell:D33:t::l:1:f:1\ncell:E33:t::l:1:f:1\ncell:F33:b::1:::l:1:f:1\ncell:G33:t:TOTAL:b:1::1:1:l:1:f:3:cf:1\ncell:H33:vtf:n:0:(H29+H31)+H32:b:1:1:1::l:1:f:3:cf:1:ntvf:2\ncell:I33:b::::1:l:1:f:1\ncell:B34:b::1::\ncell:C34:b::::1:l:1:f:1:colspan:2\ncell:D34:l:1:f:1\ncell:E34:l:1:f:1\ncell:F34:l:1:f:1\ncell:G34:b:1::::l:1:f:1\ncell:H34:b:1:1:::l:1:f:1\ncell:I34:b::::1:l:1:f:1\ncell:B35:b::1::\ncell:C35:b::::1:l:1:f:1:colspan:2\ncell:D35:l:1:f:1\ncell:E35:l:1:f:1\ncell:F35:l:1:f:1\ncell:G35:l:1:f:1\ncell:H35:b::1:::l:1:f:1\ncell:I35:b::::1:l:1:f:1\ncell:B36:b::1::\ncell:C36:b::::1:l:1:f:1:colspan:2\ncell:D36:l:1:f:1\ncell:E36:t::l:1:f:1\ncell:F36:t::l:1:f:1\ncell:G36:l:1:f:1\ncell:H36:t::b::1:::l:1:f:1\ncell:I36:b::::1:l:1:f:1\ncell:B37:b::1::\ncell:C37:b::::1:l:1:f:1\ncell:D37:l:1:f:1\ncell:E37:l:1:f:1\ncell:F37:l:1:f:1\ncell:G37:l:1:f:1\ncell:H37:b::1:::l:1:f:1\ncell:I37:b::::1:l:1:f:1\ncell:C38:t:THANK YOU FOR BUSINESS:l:1:f:4:c:3:bg:1:cf:1:colspan:6\ncell:D38:l:1:f:1\ncell:E38:l:1:f:1\ncell:F38:l:1:f:1\ncell:G38:l:1:f:1\ncell:H38:l:1:f:1\ncell:I38:l:1:f:1\ncol:A:w:10\ncol:B:w:10\ncol:C:w:90\ncol:D:w:90\ncol:E:w:70\ncol:F:w:93\ncol:G:w:89\ncol:H:w:84\nsheet:c:9:r:38:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal normal * arial,helvetica,sans-serif\nfont:2:normal normal 10pt arial,helvetica,sans-serif\nfont:3:normal normal 11pt arial,helvetica,sans-serif\nfont:4:normal normal 12pt arial,helvetica,sans-serif\nlayout:1:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:2:padding:4px 4px 4px 4px;vertical-align:bottom;\nlayout:3:padding:4px 4px 4px 4px;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:#,##0.00\nvalueformat:3:#,##0.00%\nvalueformat:4:m/d/yy\n"},"name":"sheet9","hidden":"0"},"sheet10":{"sheetstr":{"savestr":"version:1.5\ncell:C3:t:PRO FORMA INVOICE:f:13:c:3:bg:1:cf:1:colspan:11\ncell:C5:t:[Company Name]:l:7:f:11:cf:1:colspan:8\ncell:D5:l:1:f:7\ncell:E5:b:::1::l:1:f:7:colspan:5\ncell:F5:l:1:f:12\ncell:G5:l:1:f:12\ncell:H5:l:1:f:12\ncell:I5:l:1:f:12\ncell:J5:l:1:f:12\ncell:K5:l:1:f:4\ncell:M5:l:1:f:3:cf:3\ncell:C6:t:[Company Slogan]:l:6:f:7:cf:2:colspan:7\ncell:D6:l:6:f:7:colspan:2\ncell:E6:l:6:f:7\ncell:F6:l:6:f:5\ncell:G6:l:6:f:5\ncell:H6:l:6:f:5\ncell:I6:l:6:f:5\ncell:J6:l:6:f:5\ncell:K6:t:Date:l:6:f:7:cf:2:colspan:2\ncell:L6:l:6:f:7\ncell:M6:b:::1::l:6:f:7:cf:2:ntvf:4\ncell:O6:l:1:f:14:cf:2\ncell:C7:l:6:f:7:cf:2:colspan:2\ncell:D7:l:6:f:7:bg:2:colspan:2\ncell:E7:l:3:f:7:cf:2\ncell:F7:l:3:f:5:cf:2\ncell:G7:l:6:f:5:cf:2\ncell:H7:l:3:f:5:cf:2\ncell:I7:l:6:f:5:cf:2\ncell:J7:l:6:f:5:cf:2\ncell:K7:t:Expiration Date:l:6:f:7:bg:2:cf:2:colspan:2\ncell:L7:l:6:f:7:bg:2\ncell:M7:b:1::1::l:6:f:7:bg:2:cf:2:ntvf:4\ncell:O7:l:1:f:6\ncell:C8:t:[Street Address]:l:6:f:7:colspan:5\ncell:D8:l:6:f:7\ncell:E8:l:3:f:7:cf:2\ncell:F8:l:3:f:5:cf:2\ncell:G8:l:6:f:5:cf:2\ncell:H8:l:3:f:5:cf:2\ncell:I8:l:6:f:5:cf:2\ncell:J8:l:6:f:5\ncell:K8:t:Invoice #:l:6:f:7:cf:2:colspan:2\ncell:L8:l:6:f:7\ncell:M8:b:1::1::l:6:f:7:cf:2\ncell:C9:t:[City, ST ZIP]:l:6:f:7:bg:2:colspan:5\ncell:D9:l:6:f:7:bg:2:colspan:2\ncell:E9:l:3:f:7\ncell:F9:l:3:f:5\ncell:G9:l:6:f:5\ncell:H9:l:3:f:5\ncell:I9:l:6:f:5\ncell:J9:l:6:f:5\ncell:K9:t:Customer ID:l:6:f:7:bg:2:colspan:2\ncell:L9:l:6:f:7:bg:2\ncell:M9:b:1::1::l:6:f:7:bg:2:cf:2\ncell:C10:t:Phone\\c :l:6:f:7:colspan:5\ncell:D10:l:6:f:7:colspan:2\ncell:E10:l:6:f:7\ncell:F10:l:3:f:5\ncell:G10:l:6:f:5\ncell:H10:l:3:f:5\ncell:I10:l:6:f:5\ncell:J10:l:6:f:5\ncell:K10:l:6:f:8\ncell:L10:l:6:f:8\ncell:M10:b:1::::l:6:f:8\ncell:C11:t:Email\\c:l:6:f:7:bg:2:colspan:5\ncell:D11:l:6:f:7:bg:2:colspan:2\ncell:E11:l:6:f:7\ncell:F11:l:3:f:5\ncell:G11:l:6:f:5\ncell:H11:l:3:f:5\ncell:I11:l:6:f:5\ncell:J11:l:6:f:5\ncell:K11:l:6\ncell:L11:l:6\ncell:M11:l:6\ncell:C12:t:Fax\\c:l:6:f:7:colspan:5\ncell:D12:l:6:f:7:colspan:2\ncell:E12:l:3:f:7\ncell:F12:l:3:f:5\ncell:G12:l:6:f:5\ncell:H12:l:3:f:5\ncell:I12:l:6:f:5\ncell:J12:l:6:f:5\ncell:K12:l:6\ncell:L12:l:6\ncell:M12:l:6\ncell:E13:l:3\ncell:F13:l:3\ncell:H13:l:3\ncell:C14:t:CUSTOMER:b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:1:colspan:2\ncell:D14:b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:1\ncell:E14:b:3:3:3:3:l:3:f:7:c:3:cf:1\ncell:F14:b:3:3:3:3:l:3:f:7:c:3:cf:1\ncell:G14:t:SHIP TO:b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:1:colspan:3\ncell:H14:b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:1\ncell:I14:b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:1\ncell:J14:b:3:3:3:3:l:7:f:7:c:3:cf:1\ncell:K14:t:SHIPPING DETAILS:b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:1:colspan:3\ncell:L14:l:1:f:2:cf:2\ncell:M14:l:1:f:2:cf:2\ncell:C15:t:[Name]:b:1:1:1:1:l:6:f:16:colspan:2\ncell:D15:l:6:f:16:colspan:2\ncell:E15:l:3:f:16\ncell:F15:l:3:f:16\ncell:G15:t:[Name]:b:1:1:1:1:l:6:f:16:colspan:3\ncell:H15:l:6:f:16\ncell:I15:l:6:f:16\ncell:J15:l:6:f:16\ncell:K15:t:Freight Type:b:1:1:1:1:l:6:f:16:colspan:2\ncell:L15:b:1:1:1:1:l:6:f:16\ncell:M15:t:[Air or Ocean]:b:1:1:1:1:l:6:f:16\ncell:O15:t:`\ncell:C16:t:[Company Name]:b:1:1:1:1:l:6:f:16:bg:2:colspan:2\ncell:D16:l:6:f:16:bg:2:colspan:2\ncell:E16:l:3:f:16\ncell:F16:l:3:f:16\ncell:G16:t:[Company Name]:b:1:1:1:1:l:6:f:16:bg:2:colspan:3\ncell:H16:l:6:f:16:bg:2\ncell:I16:l:6:f:16:bg:2:colspan:2\ncell:J16:l:6:f:16\ncell:K16:t:Est Ship Date:b:1:1:1:1:l:6:f:16:bg:2:colspan:2\ncell:L16:b:1:1:1:1:l:6:f:16:bg:2\ncell:M16:t:[Date]:b:1:1:1:1:l:6:f:16:bg:2\ncell:C17:t:[Street Address]:b:1:1:1:1:l:6:f:16:colspan:2\ncell:D17:l:6:f:16:colspan:2\ncell:E17:l:3:f:16\ncell:F17:l:3:f:16\ncell:G17:t:[Street Address]:b:1:1:1:1:l:6:f:16:colspan:3\ncell:H17:l:6:f:16\ncell:I17:l:6:f:16:colspan:2\ncell:J17:l:6:f:16\ncell:K17:t:Est Gross Weight:b:1:1:1:1:l:6:f:16:colspan:2\ncell:L17:b:1:1:1:1:l:6:f:16\ncell:M17:t:[weight] [units]:b:1:1:1:1:l:6:f:16\ncell:C18:t:[City, ST ZIP]:b:1:1:1:1:l:6:f:16:bg:2:colspan:2\ncell:D18:l:6:f:16:bg:2:colspan:2\ncell:E18:l:3:f:16\ncell:F18:l:3:f:16\ncell:G18:t:[City, ST ZIP]:b:1:1:1:1:l:6:f:16:bg:2:colspan:3\ncell:H18:l:6:f:16:bg:2\ncell:I18:l:6:f:16:bg:2:colspan:2\ncell:J18:l:6:f:16\ncell:K18:t:Est Cubic Weight:b:1:1:1:1:l:6:f:16:bg:2:colspan:2\ncell:L18:b:1:1:1:1:l:6:f:16:bg:2\ncell:M18:t:[weight] [units]:b:1:1:1:1:l:6:f:16:bg:2\ncell:C19:t:[Email]:b:1:1:1:1:l:6:f:16:colspan:2\ncell:D19:l:6:f:16:colspan:2\ncell:E19:l:3:f:16\ncell:F19:l:3:f:16\ncell:G19:t:[Email]:b:1:1:1:1:l:6:f:16:colspan:3\ncell:H19:l:6:f:16\ncell:I19:l:6:f:16:colspan:2\ncell:J19:l:6:f:16\ncell:K19:t:Total Packages:b:1:1:1:1:l:6:f:16:colspan:2\ncell:L19:b:1:1:1:1:l:6:f:16\ncell:M19:t:[Qty]:b:1:1:1:1:l:6:f:16\ncell:C20:t:[Phone]:b:1:1:1:1:l:6:f:16:bg:2:colspan:2\ncell:D20:l:6:f:16:bg:2:colspan:2\ncell:E20:l:3:f:16\ncell:F20:l:3:f:16\ncell:G20:t:[Phone]:b:1:1:1:1:l:6:f:16:bg:2:colspan:3\ncell:H20:l:6:f:16:bg:2\ncell:I20:l:6:f:16:bg:2:colspan:2\ncell:J20:l:6:f:16\ncell:K20:b:1:1:1:1:l:6:f:16:bg:2:colspan:2\ncell:L20:b:1:1:1:1:l:6:f:16:bg:2\ncell:M20:b:1:1:1:1:l:6:f:16:bg:2\ncell:E21:l:3\ncell:F21:l:3\ncell:H21:l:3\ncell:C22:t:PART NUMBER:b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:1\ncell:D22:t:UNIT OF MEASURE:b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:1\ncell:E22:t:DESCRIPTION:b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:1:colspan:5:rowspan:1\ncell:F22:t::b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:2\ncell:G22:t::b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:2\ncell:H22:t::b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:2\ncell:I22:t::b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:2\ncell:J22:t:QTY:b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:1\ncell:K22:t:UNIT PRICE:b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:1\ncell:L22:t:TAX:b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:1\ncell:M22:t:TOTAL AMOUNT:b:3:3:3:3:l:7:f:7:c:3:bg:1:cf:1\ncell:C23:b::5::5:l:8:f:16:cf:2\ncell:D23:b::5::5:l:8:f:16:cf:2\ncell:E23:b::::5:l:8:f:16:cf:2:colspan:5:rowspan:1\ncell:F23:l:8:f:16\ncell:G23:l:8:f:16\ncell:H23:l:8:f:16\ncell:I23:b::5:::l:8:f:16\ncell:J23:b::5::5:l:8:f:16:cf:3\ncell:K23:b::1::1:l:8:f:16:cf:3:ntvf:1\ncell:L23:b::5::5:l:8:f:16:cf:3\ncell:M23:vtf:t: :IF(AND(ISBLANK(J23),ISBLANK(K23)),\" \",J23*K23):b::5::5:l:8:f:16\ncell:O23:l:1:f:5\ncell:C24:b::1::1:l:8:f:16:bg:2:cf:2\ncell:D24:b::1::1:l:8:f:16:bg:2:cf:2\ncell:E24:b::1::1:l:8:f:16:bg:2:cf:2:colspan:5:rowspan:1\ncell:F24:b::1::1:l:8:f:16:bg:2\ncell:G24:b::1::1:l:8:f:16:bg:2\ncell:H24:b::1::1:l:8:f:16:bg:2\ncell:I24:b::1::1:l:8:f:16:bg:2\ncell:J24:b::1::1:l:8:f:16:bg:2:cf:3\ncell:K24:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:L24:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:M24:vtf:t: :IF(AND(ISBLANK(J24),ISBLANK(K24)),\" \",J24*K24):b::1::1:l:8:f:16:bg:2\ncell:C25:b::5::5:l:8:f:16:cf:2\ncell:D25:b::5::5:l:8:f:16:cf:2\ncell:E25:b::::5:l:8:f:16:cf:2:colspan:5:rowspan:1\ncell:F25:l:8:f:16\ncell:G25:l:8:f:16\ncell:H25:l:8:f:16\ncell:I25:b::5:::l:8:f:16\ncell:J25:b::5::5:l:8:f:16:cf:3\ncell:K25:b::5::5:l:8:f:16:cf:3:ntvf:1\ncell:L25:b::5::5:l:8:f:16:cf:3:ntvf:1\ncell:M25:vtf:t: :IF(AND(ISBLANK(J25),ISBLANK(K25)),\" \",J25*K25):b::5::5:l:8:f:16\ncell:C26:b::1::1:l:8:f:16:bg:2:cf:2\ncell:D26:b::1::1:l:8:f:16:bg:2:cf:2\ncell:E26:b::1::1:l:8:f:16:bg:2:cf:2:colspan:5:rowspan:1\ncell:F26:b::1::1:l:8:f:16:bg:2\ncell:G26:b::1::1:l:8:f:16:bg:2\ncell:H26:b::1::1:l:8:f:16:bg:2\ncell:I26:b::1::1:l:8:f:16:bg:2\ncell:J26:b::1::1:l:8:f:16:bg:2:cf:3\ncell:K26:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:L26:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:M26:vtf:t: :IF(AND(ISBLANK(J26),ISBLANK(K26)),\" \",J26*K26):b::1::1:l:8:f:16:bg:2\ncell:C27:b::5::5:l:8:f:16:cf:2\ncell:D27:b::5::5:l:8:f:16:cf:2\ncell:E27:b::::5:l:8:f:16:cf:2:colspan:5:rowspan:1\ncell:F27:l:8:f:16\ncell:G27:l:8:f:16\ncell:H27:l:8:f:16\ncell:I27:b::5:::l:8:f:16\ncell:J27:b::5::5:l:8:f:16:cf:3\ncell:K27:b::5::5:l:8:f:16:cf:3:ntvf:1\ncell:L27:b::5::5:l:8:f:16:cf:3:ntvf:1\ncell:M27:vtf:t: :IF(AND(ISBLANK(J27),ISBLANK(K27)),\" \",J27*K27):b::5::5:l:8:f:16\ncell:C28:b::1::1:l:8:f:16:bg:2:cf:2\ncell:D28:b::1::1:l:8:f:16:bg:2:cf:2\ncell:E28:b::1::1:l:8:f:16:bg:2:cf:2:colspan:5:rowspan:1\ncell:F28:b::1::1:l:8:f:16:bg:2\ncell:G28:b::1::1:l:8:f:16:bg:2\ncell:H28:b::1::1:l:8:f:16:bg:2\ncell:I28:b::1::1:l:8:f:16:bg:2\ncell:J28:b::1::1:l:8:f:16:bg:2:cf:3\ncell:K28:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:L28:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:M28:vtf:t: :IF(AND(ISBLANK(J28),ISBLANK(K28)),\" \",J28*K28):b::1::1:l:8:f:16:bg:2\ncell:C29:b::5::5:l:8:f:16:cf:2\ncell:D29:b::5::5:l:8:f:16:cf:2\ncell:E29:b::::5:l:8:f:16:cf:2:colspan:5:rowspan:1\ncell:F29:l:8:f:16\ncell:G29:l:8:f:16\ncell:H29:l:8:f:16\ncell:I29:b::5:::l:8:f:16\ncell:J29:b::5::5:l:8:f:16:cf:3\ncell:K29:b::5::5:l:8:f:16:cf:3:ntvf:1\ncell:L29:b::5::5:l:8:f:16:cf:3:ntvf:1\ncell:M29:vtf:t: :IF(AND(ISBLANK(J29),ISBLANK(K29)),\" \",J29*K29):b::5::5:l:8:f:16\ncell:C30:b::1::1:l:8:f:16:bg:2:cf:2\ncell:D30:b::1::1:l:8:f:16:bg:2:cf:2\ncell:E30:b::1::1:l:8:f:16:bg:2:cf:2:colspan:5:rowspan:1\ncell:F30:b::1::1:l:8:f:16:bg:2\ncell:G30:b::1::1:l:8:f:16:bg:2\ncell:H30:b::1::1:l:8:f:16:bg:2\ncell:I30:b::1::1:l:8:f:16:bg:2\ncell:J30:b::1::1:l:8:f:16:bg:2:cf:3\ncell:K30:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:L30:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:M30:vtf:t: :IF(AND(ISBLANK(J30),ISBLANK(K30)),\" \",J30*K30):b::1::1:l:8:f:16:bg:2\ncell:O30:l:1:f:5\ncell:C31:b::5::5:l:8:f:16:cf:2\ncell:D31:b::5::5:l:8:f:16:cf:2\ncell:E31:b::::5:l:8:f:16:cf:2:colspan:5:rowspan:1\ncell:F31:l:8:f:16\ncell:G31:l:8:f:16\ncell:H31:l:8:f:16\ncell:I31:b::5:::l:8:f:16\ncell:J31:b::5::5:l:8:f:16:cf:3\ncell:K31:b::5::5:l:8:f:16:cf:3:ntvf:1\ncell:L31:b::5::5:l:8:f:16:cf:3:ntvf:1\ncell:M31:vtf:t: :IF(AND(ISBLANK(J31),ISBLANK(K31)),\" \",J31*K31):b::5::5:l:8:f:16\ncell:O31:l:1:f:5\ncell:C32:b::1::1:l:8:f:16:bg:2:cf:2\ncell:D32:b::1::1:l:8:f:16:bg:2:cf:2\ncell:E32:b::1::1:l:8:f:16:bg:2:cf:2:colspan:5:rowspan:1\ncell:F32:b::1::1:l:8:f:16:bg:2\ncell:G32:b::1::1:l:8:f:16:bg:2\ncell:H32:b::1::1:l:8:f:16:bg:2\ncell:I32:b::1::1:l:8:f:16:bg:2\ncell:J32:b::1::1:l:8:f:16:bg:2:cf:3\ncell:K32:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:L32:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:M32:vtf:t: :IF(AND(ISBLANK(J32),ISBLANK(K32)),\" \",J32*K32):b::1::1:l:8:f:16:bg:2\ncell:C33:b::5::5:l:8:f:16:cf:2\ncell:D33:b::5::5:l:8:f:16:cf:2\ncell:E33:b::::5:l:8:f:16:cf:2:colspan:5:rowspan:1\ncell:F33:l:8:f:16\ncell:G33:l:8:f:16\ncell:H33:l:8:f:16\ncell:I33:b::5:::l:8:f:16\ncell:J33:b::5::5:l:8:f:16:cf:3\ncell:K33:b::5::5:l:8:f:16:cf:3:ntvf:1\ncell:L33:b::5::5:l:8:f:16:cf:3:ntvf:1\ncell:M33:vtf:t: :IF(AND(ISBLANK(J33),ISBLANK(K33)),\" \",J33*K33):b::5::5:l:8:f:16\ncell:C34:b::1::1:l:8:f:16:bg:2:cf:2\ncell:D34:b::1::1:l:8:f:16:bg:2:cf:2\ncell:E34:b::1::1:l:8:f:16:bg:2:cf:2:colspan:5:rowspan:1\ncell:F34:b::1::1:l:8:f:16:bg:2\ncell:G34:b::1::1:l:8:f:16:bg:2\ncell:H34:b::1::1:l:8:f:16:bg:2\ncell:I34:b::1::1:l:8:f:16:bg:2\ncell:J34:b::1::1:l:8:f:16:bg:2:cf:3\ncell:K34:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:L34:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:M34:vtf:t: :IF(AND(ISBLANK(J34),ISBLANK(K34)),\" \",J34*K34):b::1::1:l:8:f:16:bg:2\ncell:C35:b::5::5:l:8:f:16:cf:2\ncell:D35:b::5::5:l:8:f:16:cf:2\ncell:E35:b::::5:l:8:f:16:cf:2:colspan:5:rowspan:1\ncell:F35:l:8:f:16\ncell:G35:l:8:f:16\ncell:H35:l:8:f:16\ncell:I35:b::5:::l:8:f:16\ncell:J35:b::5::5:l:8:f:16:cf:3\ncell:K35:b::5::5:l:8:f:16:cf:3:ntvf:1\ncell:L35:b::5::5:l:8:f:16:cf:3:ntvf:1\ncell:M35:vtf:t: :IF(AND(ISBLANK(J35),ISBLANK(K35)),\" \",J35*K35):b::5::5:l:8:f:16\ncell:C36:b::1::1:l:8:f:16:bg:2:cf:2\ncell:D36:b::1::1:l:8:f:16:bg:2:cf:2\ncell:E36:b::1::1:l:8:f:16:bg:2:cf:2:colspan:5:rowspan:1\ncell:F36:b::1::1:l:8:f:16:bg:2\ncell:G36:b::1::1:l:8:f:16:bg:2\ncell:H36:b::1::1:l:8:f:16:bg:2\ncell:I36:b::1::1:l:8:f:16:bg:2\ncell:J36:b::1::1:l:8:f:16:bg:2:cf:3\ncell:K36:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:L36:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:M36:vtf:t: :IF(AND(ISBLANK(J36),ISBLANK(K36)),\" \",J36*K36):b::1::1:l:8:f:16:bg:2\ncell:C37:b::5::5:l:8:f:16:cf:2\ncell:D37:b::5::5:l:8:f:16:cf:2\ncell:E37:b::::5:l:8:f:16:cf:2:colspan:5:rowspan:1\ncell:F37:l:8:f:16\ncell:G37:l:8:f:16\ncell:H37:l:8:f:16\ncell:I37:b::5:::l:8:f:16\ncell:J37:b::5::5:l:8:f:16:cf:3\ncell:K37:b::5::5:l:8:f:16:cf:3:ntvf:1\ncell:L37:b::5::5:l:8:f:16:cf:3:ntvf:1\ncell:M37:vtf:t: :IF(AND(ISBLANK(J37),ISBLANK(K37)),\" \",J37*K37):b::5::5:l:8:f:16\ncell:C38:b::1:5:1:l:8:f:16:bg:2:cf:2\ncell:D38:b::1::1:l:8:f:16:bg:2:cf:2\ncell:E38:b::1::1:l:8:f:16:bg:2:cf:2:colspan:5:rowspan:1\ncell:F38:b::1::1:l:8:f:16:bg:2\ncell:G38:b::1::1:l:8:f:16:bg:2\ncell:H38:b::1::1:l:8:f:16:bg:2\ncell:I38:b::1::1:l:8:f:16:bg:2\ncell:J38:b::1::1:l:8:f:16:bg:2:cf:3\ncell:K38:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:L38:b::1::1:l:8:f:16:bg:2:cf:3:ntvf:1\ncell:M38:vtf:t: :IF(AND(ISBLANK(J38),ISBLANK(K38)),\" \",J38*K38):b::1::1:l:8:f:16:bg:2\ncell:C39:b:5::::l:1:f:5\ncell:D39:b:5::::l:1:f:5\ncell:E39:b:1::::l:4:f:5\ncell:F39:b:5::::l:1:f:5\ncell:G39:b:5::::l:1:f:5\ncell:H39:b:5::::l:1:f:5\ncell:I39:b:5::::l:1:f:5\ncell:J39:b:5::::l:1:f:15\ncell:K39:t:Subtotal:b:1:1::1:l:7:f:7:colspan:2\ncell:L39:b:5:1::1:l:7:f:5\ncell:M39:vtf:n:0:SUM(M23\\cM38):b:1:1::1:l:7:f:7\ncell:C40:t:TERMS OF SALE AND OTHER COMMENTS:b:1:1:1:1:l:7:f:7:c:3:bg:1:cf:1:colspan:7\ncell:D40:l:1:f:2\ncell:E40:l:1:f:2\ncell:F40:l:1:f:2\ncell:G40:l:1:f:2\ncell:H40:l:1:f:2\ncell:I40:l:1:f:2\ncell:K40:t:Taxable:b::1::1:l:7:f:7:bg:2:colspan:2\ncell:L40:b::1::1:l:7:bg:2\ncell:M40:vtf:n:0:SUMIF(L23\\cL38,\"=x\",M23\\cM38):b::1::1:l:7:f:7:bg:2\ncell:O40:l:1:f:5\ncell:C41:t:[Include and terms of sale or other information as needed]:b::1::1:l:7:f:16:colspan:7\ncell:D41:b:5::::l:2:f:5\ncell:E41:b:5::::l:2:f:5\ncell:F41:b:5::::l:2:f:5\ncell:G41:b:5::::l:2:f:5\ncell:H41:b:5::::l:2:f:5\ncell:I41:b:5:5:::l:2:f:5\ncell:K41:t:Tax rate:b::1::1:l:7:f:7:colspan:2\ncell:L41:b::1::1:l:7\ncell:M41:b:1:1:1:1:l:7:f:7:ntvf:2\ncell:O41:l:1:f:5\ncell:C42:t:[Include payment terms such as Letter of Credit, Open Account or other terms.]:b::1::1:l:7:f:16:bg:2:colspan:7\ncell:D42:l:2:f:5\ncell:E42:l:2:f:5\ncell:F42:l:2:f:5\ncell:G42:l:2:f:5\ncell:H42:l:2:f:5\ncell:I42:b::5:::l:2:f:5\ncell:K42:t:Tax:b::1::1:l:7:f:7:bg:2:colspan:2\ncell:L42:b::1::1:l:7:bg:2\ncell:M42:vtf:n:0:ROUND(M40*M41,2):b:1:1:1:1:l:7:f:7:bg:2\ncell:C43:b::1::1:l:7:f:16:colspan:7\ncell:D43:l:2:f:5\ncell:E43:l:2:f:5\ncell:F43:l:2:f:5\ncell:G43:l:2:f:5\ncell:H43:l:2:f:5\ncell:I43:b::5:::l:2:f:5\ncell:K43:t:Freight:b::1::1:l:7:f:7:colspan:2\ncell:L43:b::1::1:l:7\ncell:M43:b:1:1:1:1:l:7:f:7\ncell:O43:l:1:f:5\ncell:C44:b::1::1:l:7:f:16:bg:2:colspan:7\ncell:D44:l:2:f:5\ncell:E44:l:2:f:5\ncell:F44:l:2:f:5\ncell:G44:l:2:f:5\ncell:H44:l:2:f:5\ncell:I44:b::5:::l:2:f:5\ncell:K44:t:Insurance:b::1::1:l:7:f:7:bg:2:colspan:2\ncell:L44:b::1::1:l:7:bg:2\ncell:M44:b:1:1:1:1:l:7:f:7:bg:2\ncell:O44:l:1:f:5\ncell:C45:b::1::1:l:7:f:16:colspan:7\ncell:D45:l:2:f:5\ncell:E45:l:2:f:5\ncell:F45:l:2:f:5\ncell:G45:l:2:f:5\ncell:H45:l:2:f:5\ncell:I45:b::5:::l:2:f:5\ncell:K45:t:Legal/Consular:b::1::1:l:7:f:7:colspan:2\ncell:L45:b::1::1:l:7\ncell:M45:b:1:1:1:1:l:7:f:7\ncell:O45:l:1:f:5\ncell:C46:b::1::1:l:7:f:16:bg:2:colspan:7\ncell:D46:l:2:f:5\ncell:E46:l:2:f:5\ncell:F46:l:2:f:5\ncell:G46:l:2:f:5\ncell:H46:l:2:f:5\ncell:I46:b::5:::l:2:f:5\ncell:K46:t:Inspection/Cert.:b::1:2:1:l:7:f:7:bg:2:colspan:2\ncell:L46:b::1:2:1:l:7:f:5:bg:2\ncell:M46:b:1:1:1:1:l:7:f:7:bg:2\ncell:O46:l:1:f:5\ncell:C47:b::1::1:l:7:f:16:colspan:7\ncell:D47:l:2:f:5\ncell:E47:l:2:f:5\ncell:F47:l:2:f:5\ncell:G47:l:2:f:5\ncell:H47:l:2:f:5\ncell:I47:b::5:::l:2:f:5\ncell:K47:t:Other (specify):b::1::1:l:7:f:7:colspan:2\ncell:L47:b::1::1:l:7\ncell:M47:b:1:1:1:1:l:7:f:7\ncell:C48:b::1::1:l:7:f:16:bg:2:colspan:7\ncell:D48:l:2:f:5\ncell:E48:l:2:f:5\ncell:F48:l:2:f:5\ncell:G48:l:2:f:5\ncell:H48:l:2:f:5\ncell:I48:b::5:::l:2:f:5\ncell:K48:t:Other (specify):b::1:1:1:l:7:f:7:bg:2:colspan:2\ncell:L48:b::1:1:1:l:7:bg:2\ncell:M48:b:1:1:1:1:l:7:f:7:bg:2\ncell:C49:b::1:1:1:l:7:f:16:colspan:7\ncell:D49:b:::5::l:1:f:5\ncell:E49:b:::5::l:1:f:5\ncell:F49:b:::5::l:2:f:5:cf:2\ncell:G49:b:::5::l:2:f:5:cf:2\ncell:H49:b:::5::l:2:f:5:cf:2\ncell:I49:b::5:5::l:2:f:5:cf:2\ncell:K49:t:TOTAL:b:1::::l:8:f:10:colspan:2\ncell:L49:b:4::::l:8:f:9\ncell:M49:vtf:n:0:M39+M42+SUM(M43\\cM48):b:1::::l:8:f:10\ncell:K50:t:Currency:l:8:f:7:cf:2:colspan:2\ncell:L50:l:8:f:7:cf:1\ncell:M50:t:USD:l:8:f:7:cf:1\ncell:O50:l:1:f:5\ncell:K51:l:2:f:1:cf:1\ncell:L51:l:2:f:1:cf:1\ncell:M51:l:2:f:1:cf:1\ncell:C52:t:ADDITIONAL DETAILS:l:7:f:7:c:3:bg:1:colspan:11\ncell:D52:l:1:f:2\ncell:E52:l:1:f:2\ncell:F52:l:1:f:2\ncell:G52:l:1:f:2\ncell:H52:l:1:f:2\ncell:I52:l:1:f:2\ncell:J52:l:2:f:1:cf:1\ncell:K52:l:2:f:1:cf:1\ncell:L52:l:2:f:1:cf:1\ncell:M52:l:2:f:1:cf:1\ncell:C53:t:Country of Origin:l:8:f:7:colspan:2\ncell:D53:b:::1::l:8:f:7:colspan:4\ncell:E53:b:::1::l:8:f:7:colspan:5\ncell:F53:f:7\ncell:G53:f:7\ncell:H53:f:7\ncell:I53:f:7\ncell:J53:f:7\ncell:K53:l:2:f:1:cf:1\ncell:L53:l:2:f:1:cf:1\ncell:M53:l:2:f:1:cf:1\ncell:C54:t:Port of Embarkation:l:8:f:7:bg:2:colspan:2\ncell:D54:b:::1::l:8:f:7:bg:2:colspan:4\ncell:E54:b:::1::l:8:f:7:bg:2:colspan:5\ncell:F54:f:7\ncell:G54:f:7\ncell:H54:f:7\ncell:I54:f:7\ncell:J54:f:7\ncell:K54:l:2:f:1:cf:1\ncell:L54:l:2:f:1:cf:1\ncell:M54:l:2:f:1:cf:1\ncell:C55:t:Port of Discharge:l:8:f:7:colspan:2\ncell:D55:b:::1::l:8:f:7:colspan:4\ncell:E55:b:::1::l:8:f:7:colspan:5\ncell:F55:f:7\ncell:G55:f:7\ncell:H55:f:7\ncell:I55:f:7\ncell:J55:f:7\ncell:K55:l:2:f:1:cf:1\ncell:L55:l:2:f:1:cf:1\ncell:M55:l:2:f:1:cf:1\ncell:C56:l:8:f:7\ncell:D56:l:8:f:7\ncell:E56:b:::1::l:5:f:7\ncell:F56:b:::1::f:7\ncell:G56:b:::1::f:7\ncell:H56:b:::1::f:7\ncell:I56:b:::1::f:7\ncell:J56:b:::1::f:7\ncell:K56:b:::1::l:2:f:1:cf:1\ncell:L56:b:::1::l:2:f:1:cf:1\ncell:M56:b:::1::l:2:f:1:cf:1\ncell:C57:t:Reason for Export\\c:l:8:f:7:bg:2:cf:2:colspan:2\ncell:D57:l:8:f:7:bg:2:cf:2:colspan:10\ncell:E57:b:1:1:1:1:l:5:f:7:bg:2:cf:2:colspan:9\ncell:F57:t::l:2:f:7:cf:1\ncell:G57:t::l:2:f:7:cf:1\ncell:H57:t::l:2:f:7:cf:1\ncell:I57:t::l:2:f:7:cf:1\ncell:J57:f:7\ncell:K57:l:2:f:1:cf:1\ncell:L57:l:2:f:1:cf:1\ncell:M57:l:2:f:1:cf:1\ncell:O57:l:1:f:5\ncell:C58:l:2:f:7:cf:2\ncell:D58:l:2:f:7:cf:2\ncell:E58:l:5:f:7:cf:2\ncell:F58:l:2:f:7:cf:2\ncell:G58:l:2:f:7:cf:2\ncell:H58:l:2:f:7:cf:2\ncell:I58:l:2:f:7:cf:2\ncell:J58:f:7\ncell:K58:l:2:f:1:cf:1\ncell:L58:l:2:f:1:cf:1\ncell:M58:l:2:f:1:cf:1\ncell:O58:l:1:f:5\ncell:C59:t:I certify the above to be true and correct to the best of my knowledge.:l:8:f:7:cf:2:colspan:11:rowspan:2\ncell:D59:l:2:f:7:cf:2\ncell:E59:l:2:f:7:cf:2\ncell:F59:l:2:f:7:cf:2\ncell:G59:l:2:f:7:cf:2\ncell:H59:l:2:f:7:cf:2\ncell:I59:l:2:f:7:cf:2\ncell:J59:f:7\ncell:K59:l:2:f:1:cf:1\ncell:L59:l:2:f:1:cf:1\ncell:M59:l:2:f:1:cf:1\ncell:C60:l:2:f:7:cf:2\ncell:D60:l:2:f:7:cf:2\ncell:E60:l:2:f:7:cf:2\ncell:F60:l:2:f:7:cf:2\ncell:G60:l:2:f:7:cf:2\ncell:H60:l:2:f:7:cf:2\ncell:I60:l:2:f:7:cf:2\ncell:J60:f:7\ncell:K60:l:2:f:1:cf:1\ncell:L60:l:2:f:1:cf:1\ncell:M60:l:2:f:1:cf:1\ncell:C61:t:x :b:::1::l:8:f:7:cf:2:colspan:6\ncell:D61:l:8:f:7:cf:2\ncell:E61:l:8:f:7:cf:2\ncell:F61:l:8:f:7:cf:2\ncell:G61:l:8:f:7:cf:2\ncell:H61:l:8:f:7:cf:1:colspan:2:rowspan:1\ncell:I61:l:8:f:7:cf:1\ncell:J61:b:::1::l:8:f:7:cf:2:ntvf:3:colspan:2\ncell:K61:l:8:f:1:cf:1\ncell:L61:l:2:f:1:cf:1\ncell:M61:l:2:f:1:cf:1\ncell:C62:t:[Typed Name]:b:1::::l:8:f:7:cf:2:colspan:4\ncell:D62:b:::1::l:8:f:7:cf:2:colspan:4\ncell:E62:l:8:f:7:cf:2\ncell:F62:l:8:f:7:cf:2\ncell:G62:l:8:f:7:cf:2\ncell:H62:l:5:f:7:cf:2\ncell:I62:l:8:f:7:cf:2\ncell:J62:t:Date:l:8:f:7:colspan:2\ncell:K62:l:8:f:1:cf:1\ncell:L62:l:2:f:1:cf:1\ncell:M62:l:2:f:1:cf:1\ncell:C63:t:[Company Name]:l:8:f:7:colspan:4\ncell:D63:b:::1::l:8:f:7:cf:2:colspan:4\ncell:E63:l:8:f:7\ncell:F63:l:8:f:7\ncell:G63:l:8:f:7\ncell:H63:l:5:f:7\ncell:I63:l:8:f:7\ncell:J63:l:8:f:7\ncell:K63:l:8:f:1:cf:1\ncell:L63:l:2:f:1:cf:1\ncell:M63:l:2:f:1:cf:1\ncell:E64:l:3\ncell:E65:l:3\ncol:A:w:10\ncol:B:w:10\ncol:C:w:67\ncol:D:w:78\ncol:E:w:10\ncol:F:w:10\ncol:G:w:71\ncol:H:w:10\ncol:I:w:35\ncol:J:w:35\ncol:K:w:75\ncol:L:w:34\ncol:M:w:93\ncol:N:w:53\ncol:O:w:63\ncol:P:w:57\ncol:Q:w:54\ncol:R:w:51\ncol:S:w:60\ncol:T:w:53\ncol:U:w:57\ncol:V:w:53\ncol:W:w:59\ncol:X:w:55\ncol:Y:w:52\nrow:1:h:36\nrow:2:h:36\nrow:3:h:36\nrow:4:h:36\nrow:5:h:36\nrow:14:h:16.5\nrow:22:h:33\nrow:40:h:16.5\nrow:41:h:16.5\nrow:42:h:16.5\nrow:43:h:16.5\nrow:44:h:16.5\nrow:45:h:16.5\nrow:46:h:16.5\nrow:47:h:16.5\nrow:48:h:16.5\nrow:49:h:17.25\nrow:52:h:16.5\nsheet:c:25:r:65:h:15:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:1px solid rgb(192,192,192)\nborder:3:1px solid rgb(255, 255, 255)\nborder:4:thin double rgb(0,0,0)\nborder:5:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(119,136,221)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal bold 10pt Trebuchet MS\nfont:2:normal bold 11pt Trebuchet MS\nfont:3:normal bold 14pt Trebuchet MS\nfont:4:normal bold 28pt Trebuchet MS\nfont:5:normal normal 10pt Trebuchet MS\nfont:6:normal normal 10pt Verdana\nfont:7:normal normal 10pt arial,helvetica,sans-serif\nfont:8:normal normal 11pt *\nfont:9:normal normal 12pt Trebuchet MS\nfont:10:normal normal 12pt arial,helvetica,sans-serif\nfont:11:normal normal 14pt arial,helvetica,sans-serif\nfont:12:normal normal 18pt Trebuchet MS\nfont:13:normal normal 24pt arial,helvetica,sans-serif\nfont:14:normal normal 8pt Tahoma\nfont:15:normal normal 8pt Trebuchet MS\nfont:16:normal normal 9pt arial,helvetica,sans-serif\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:top;\nlayout:3:padding:0px 0px 0px 0px;vertical-align:*;\nlayout:4:padding:0px 0px 0px 0px;vertical-align:bottom;\nlayout:5:padding:0px 0px 0px 0px;vertical-align:top;\nlayout:6:padding:4px 4px 4px 4px;vertical-align:*;\nlayout:7:padding:4px 4px 4px 4px;vertical-align:bottom;\nlayout:8:padding:4px 4px 4px 4px;vertical-align:top;\nvalueformat:1:#,##0.00\nvalueformat:2:0.000%\nvalueformat:3:m/d/yy\nvalueformat:4:mm-dd-yy\n"},"name":"proforma","hidden":"0"}},"EditableCells":{"allow":true,"cells":{"statement!C3":true,"statement!C5":true,"statement!C7":true,"statement!D7":true,"statement!D8":true,"statement!D9":true,"statement!D10":true,"statement!H7":true,"statement!H8":true,"statement!H9":true,"statement!J7":true,"statement!J8":true,"statement!J9":true,"statement!C12":true,"statement!C13":true,"statement!C14":true,"statement!C15":true,"statement!C16":true,"statement!C17":true,"statement!C18":true,"statement!H12":true,"statement!H13":true,"statement!H14":true,"statement!H15":true,"statement!H17":true,"statement!J14":true,"statement!J15":true,"statement!C21":true,"statement!C22":true,"statement!C23":true,"statement!C24":true,"statement!C25":true,"statement!C26":true,"statement!C27":true,"statement!C28":true,"statement!C29":true,"statement!C30":true,"statement!C31":true,"statement!C32":true,"statement!C33":true,"statement!C34":true,"statement!C35":true,"statement!C36":true,"statement!C37":true,"statement!C38":true,"statement!C39":true,"statement!D22":true,"statement!D23":true,"statement!D24":true,"statement!D25":true,"statement!D26":true,"statement!D27":true,"statement!D28":true,"statement!D29":true,"statement!D30":true,"statement!D31":true,"statement!D32":true,"statement!D33":true,"statement!D34":true,"statement!D35":true,"statement!D36":true,"statement!D37":true,"statement!D38":true,"statement!D39":true,"statement!E22":true,"statement!E23":true,"statement!E24":true,"statement!E25":true,"statement!E26":true,"statement!E27":true,"statement!E28":true,"statement!E29":true,"statement!E30":true,"statement!E31":true,"statement!E32":true,"statement!E33":true,"statement!E34":true,"statement!E35":true,"statement!E36":true,"statement!E37":true,"statement!E38":true,"statement!E39":true,"statement!F22":true,"statement!F23":true,"statement!F24":true,"statement!F25":true,"statement!F26":true,"statement!F27":true,"statement!F28":true,"statement!F29":true,"statement!F30":true,"statement!F31":true,"statement!F32":true,"statement!F33":true,"statement!F34":true,"statement!F35":true,"statement!F36":true,"statement!F37":true,"statement!F38":true,"statement!F39":true,"statement!H22":true,"statement!H23":true,"statement!H24":true,"statement!H25":true,"statement!H26":true,"statement!H27":true,"statement!H28":true,"statement!H29":true,"statement!H30":true,"statement!H31":true,"statement!H32":true,"statement!H33":true,"statement!H34":true,"statement!H35":true,"statement!H36":true,"statement!H37":true,"statement!H38":true,"statement!H39":true,"statement!I22":true,"statement!I23":true,"statement!I24":true,"statement!I25":true,"statement!I26":true,"statement!I27":true,"statement!I28":true,"statement!I29":true,"statement!I30":true,"statement!I31":true,"statement!I32":true,"statement!I33":true,"statement!I34":true,"statement!I35":true,"statement!I36":true,"statement!I37":true,"statement!I38":true,"statement!I39":true,"statement!J22":true,"statement!J23":true,"statement!H40":true,"statement!C42":true,"statement!C43":true,"statement!C44":true,"statement!C46":true,"statement1!J14":true,"statement1!J15":true,"statement1!C21":true,"statement1!C22":true,"statement1!C23":true,"statement1!C24":true,"statement1!C25":true,"statement1!C26":true,"statement1!C27":true,"statement1!C28":true,"statement1!C29":true,"statement1!C30":true,"statement1!C31":true,"statement1!C32":true,"statement1!C33":true,"statement1!C34":true,"statement1!C35":true,"statement1!C36":true,"statement1!C37":true,"statement1!C38":true,"statement1!C39":true,"statement1!D22":true,"statement1!D23":true,"statement1!D24":true,"statement1!D25":true,"statement1!D26":true,"statement1!D27":true,"statement1!D28":true,"statement1!D29":true,"statement1!D30":true,"statement1!D31":true,"statement1!D32":true,"statement1!D33":true,"statement1!D34":true,"statement1!D35":true,"statement1!D36":true,"statement1!D37":true,"statement1!D38":true,"statement1!D39":true,"statement1!E22":true,"statement1!E23":true,"statement1!E24":true,"statement1!E25":true,"statement1!E26":true,"statement1!E27":true,"statement1!E28":true,"statement1!E29":true,"statement1!E30":true,"statement1!E31":true,"statement1!E32":true,"statement1!E33":true,"statement1!E34":true,"statement1!E35":true,"statement1!E36":true,"statement1!E37":true,"statement1!E38":true,"statement1!E39":true,"statement1!F22":true,"statement1!F23":true,"statement1!F24":true,"statement1!F25":true,"statement1!F26":true,"statement1!F27":true,"statement1!F28":true,"statement1!F29":true,"statement1!F30":true,"statement1!F31":true,"statement1!F32":true,"statement1!F33":true,"statement1!F34":true,"statement1!F35":true,"statement1!F36":true,"statement1!F37":true,"statement1!F38":true,"statement1!F39":true,"statement1!H22":true,"statement1!H23":true,"statement1!H24":true,"statement1!H25":true,"statement1!H26":true,"statement1!H27":true,"statement1!H28":true,"statement1!H29":true,"statement1!H30":true,"statement1!H31":true,"statement1!H32":true,"statement1!H33":true,"statement1!H34":true,"statement1!H35":true,"statement1!H36":true,"statement1!H37":true,"statement1!H38":true,"statement1!H39":true,"statement1!I22":true,"statement1!I23":true,"statement1!I24":true,"statement1!I25":true,"statement1!I26":true,"statement1!I27":true,"statement1!I28":true,"statement1!I29":true,"statement1!I30":true,"statement1!I31":true,"statement1!I32":true,"statement1!I33":true,"statement1!I34":true,"statement1!I35":true,"statement1!I36":true,"statement1!I37":true,"statement1!I38":true,"statement1!I39":true,"statement1!J22":true,"statement1!H40":true,"statement1!C42":true,"statement1!C43":true,"statement1!C44":true,"statement1!C46":true,"statement2!J14":true,"statement2!J15":true,"statement2!C21":true,"statement2!C22":true,"statement2!C23":true,"statement2!C24":true,"statement2!C25":true,"statement2!C26":true,"statement2!C27":true,"statement2!C28":true,"statement2!C29":true,"statement2!C30":true,"statement2!C31":true,"statement2!C32":true,"statement2!C33":true,"statement2!C34":true,"statement2!C35":true,"statement2!C36":true,"statement2!C37":true,"statement2!C38":true,"statement2!C39":true,"statement2!D22":true,"statement2!D23":true,"statement2!D24":true,"statement2!D25":true,"statement2!D26":true,"statement2!D27":true,"statement2!D28":true,"statement2!D29":true,"statement2!D30":true,"statement2!D31":true,"statement2!D32":true,"statement2!D33":true,"statement2!D34":true,"statement2!D35":true,"statement2!D36":true,"statement2!D37":true,"statement2!D38":true,"statement2!D39":true,"statement2!E22":true,"statement2!E23":true,"statement2!E24":true,"statement2!E25":true,"statement2!E26":true,"statement2!E27":true,"statement2!E28":true,"statement2!E29":true,"statement2!E30":true,"statement2!E31":true,"statement2!E32":true,"statement2!E33":true,"statement2!E34":true,"statement2!E35":true,"statement2!E36":true,"statement2!E37":true,"statement2!E38":true,"statement2!E39":true,"statement2!F22":true,"statement2!F23":true,"statement2!F24":true,"statement2!F25":true,"statement2!F26":true,"statement2!F27":true,"statement2!F28":true,"statement2!F29":true,"statement2!F30":true,"statement2!F31":true,"statement2!F32":true,"statement2!F33":true,"statement2!F34":true,"statement2!F35":true,"statement2!F36":true,"statement2!F37":true,"statement2!F38":true,"statement2!F39":true,"statement2!H22":true,"statement2!H23":true,"statement2!H24":true,"statement2!H25":true,"statement2!H26":true,"statement2!H27":true,"statement2!H28":true,"statement2!H29":true,"statement2!H30":true,"statement2!H31":true,"statement2!H32":true,"statement2!H33":true,"statement2!H34":true,"statement2!H35":true,"statement2!H36":true,"statement2!H37":true,"statement2!H38":true,"statement2!H39":true,"statement2!I22":true,"statement2!I23":true,"statement2!I24":true,"statement2!I25":true,"statement2!I26":true,"statement2!I27":true,"statement2!I28":true,"statement2!I29":true,"statement2!I30":true,"statement2!I31":true,"statement2!I32":true,"statement2!I33":true,"statement2!I34":true,"statement2!I35":true,"statement2!I36":true,"statement2!I37":true,"statement2!I38":true,"statement2!I39":true,"statement2!J22":true,"statement2!H40":true,"statement2!C42":true,"statement2!C43":true,"statement2!C44":true,"statement2!C46":true,"typei!B2":true,"typei!C4":true,"typei!C6":true,"typei!C9":true,"typei!E9":true,"typei!C15":true,"typei!F15":true,"typei!C29":true,"typei!C10":true,"typei!C11":true,"typei!C12":true,"typei!C13":true,"typei!D9":true,"typei!D4":true,"typei!D6":true,"typei!E10":true,"typei!E11":true,"typei!E12":true,"typei!E13":true,"typei!F9":true,"typei!C16":true,"typei!C17":true,"typei!C18":true,"typei!C19":true,"typei!C20":true,"typei!C21":true,"typei!C22":true,"typei!C23":true,"typei!C24":true,"typei!C25":true,"typei!C26":true,"typei!C27":true,"typei!C28":true,"typei!F16":true,"typei!F17":true,"typei!F18":true,"typei!F19":true,"typei!F20":true,"typei!F21":true,"typei!F22":true,"typei!F23":true,"typei!F24":true,"typei!F25":true,"typei!F26":true,"typei!F27":true,"typei!F28":true,"typei!E35":true,"typeii!C2":true,"typeii!C4":true,"typeii!C6":true,"typeii!C9":true,"typeii!E9":true,"typeii!C15":true,"typeii!H15":true,"typeii!F15":true,"typeii!G15":true,"typeii!C29":true,"typeii!D4":true,"typeii!C10":true,"typeii!C11":true,"typeii!C12":true,"typeii!C13":true,"typeii!D9":true,"typeii!E10":true,"typeii!E11":true,"typeii!E12":true,"typeii!E13":true,"typeii!F9":true,"typeii!C16":true,"typeii!C17":true,"typeii!C18":true,"typeii!C19":true,"typeii!C20":true,"typeii!C21":true,"typeii!C22":true,"typeii!C23":true,"typeii!C24":true,"typeii!C25":true,"typeii!C26":true,"typeii!C27":true,"typeii!C28":true,"typeii!F16":true,"typeii!F17":true,"typeii!F18":true,"typeii!F19":true,"typeii!F20":true,"typeii!F21":true,"typeii!F22":true,"typeii!F23":true,"typeii!F24":true,"typeii!F25":true,"typeii!F26":true,"typeii!F27":true,"typeii!F28":true,"typeii!G16":true,"typeii!G17":true,"typeii!G18":true,"typeii!G19":true,"typeii!G20":true,"typeii!G21":true,"typeii!G22":true,"typeii!G23":true,"typeii!G24":true,"typeii!G25":true,"typeii!G26":true,"typeii!G27":true,"typeii!G28":true,"typeii!E35":true,"typeiii!F2":true,"typeiii!B10":true,"typeiii!B17":true,"typeiii!G17":true,"typeiii!B31":true,"typeiii!F30":true,"typeiii!F31":true,"typeiii!F32":true,"typeiii!F33":true,"typeiii!F34":true,"typeiii!G9":true,"typeiii!G10":true,"typeiii!B2":true,"typeiii!B3":true,"typeiii!B4":true,"typeiii!B5":true,"typeiii!B6":true,"typeiii!B7":true,"typeiii!B8":true,"typeiii!B9":true,"typeiii!B11":true,"typeiii!B12":true,"typeiii!B13":true,"typeiii!B14":true,"typeiii!B15":true,"typeiii!B18":true,"typeiii!B19":true,"typeiii!B20":true,"typeiii!B21":true,"typeiii!B22":true,"typeiii!B23":true,"typeiii!B24":true,"typeiii!B25":true,"typeiii!B26":true,"typeiii!B27":true,"typeiii!B28":true,"typeiii!B29":true,"typeiii!G18":true,"typeiii!G19":true,"typeiii!G20":true,"typeiii!G21":true,"typeiii!G22":true,"typeiii!G23":true,"typeiii!G24":true,"typeiii!G25":true,"typeiii!G26":true,"typeiii!G27":true,"typeiii!G28":true,"typeiii!G29":true,"typeiii!B32":true,"typeiii!B33":true,"typeiii!B34":true,"typeiii!G31":true,"typeiii!G33":true,"typeiii!B37":true,"typeiv!F2":true,"typeiv!B10":true,"typeiv!B17":true,"typeiv!E17":true,"typeiv!F17":true,"typeiv!G17":true,"typeiv!B31":true,"typeiv!F30":true,"typeiv!F31":true,"typeiv!F32":true,"typeiv!F33":true,"typeiv!F34":true,"typeiv!G10":true,"typeiv!B2":true,"typeiv!B3":true,"typeiv!B4":true,"typeiv!B5":true,"typeiv!B6":true,"typeiv!B7":true,"typeiv!B8":true,"typeiv!B11":true,"typeiv!B12":true,"typeiv!B13":true,"typeiv!B14":true,"typeiv!B15":true,"typeiv!B18":true,"typeiv!B19":true,"typeiv!B20":true,"typeiv!B21":true,"typeiv!B22":true,"typeiv!B23":true,"typeiv!B24":true,"typeiv!B25":true,"typeiv!B26":true,"typeiv!B27":true,"typeiv!B28":true,"typeiv!B29":true,"typeiv!E18":true,"typeiv!E19":true,"typeiv!E20":true,"typeiv!E21":true,"typeiv!E22":true,"typeiv!E23":true,"typeiv!E24":true,"typeiv!E25":true,"typeiv!E26":true,"typeiv!E27":true,"typeiv!E28":true,"typeiv!E29":true,"typeiv!F18":true,"typeiv!F19":true,"typeiv!F20":true,"typeiv!F21":true,"typeiv!F22":true,"typeiv!F23":true,"typeiv!F24":true,"typeiv!F25":true,"typeiv!F26":true,"typeiv!F27":true,"typeiv!F28":true,"typeiv!F29":true,"typeiv!B32":true,"typeiv!B33":true,"typeiv!B34":true,"typeiv!G31":true,"typeiv!G33":true,"typeiv!B37":true,"typei!F4":true,"typeii!D6":true,"typeiii!F4":true,"typeiv!F4":true,"typeiv!G11":true,"typeiii!F10":true,"typeiv!F11":true,"typeiv!F10":true,"typeiii!F9":true,"proforma!C3":true,"proforma!C5":true,"proforma!C6":true,"proforma!C8":true,"proforma!C9":true,"proforma!C10":true,"proforma!C11":true,"proforma!C12":true,"proforma!K6":true,"proforma!K7":true,"proforma!K8":true,"proforma!K9":true,"proforma!M6":true,"proforma!M7":true,"proforma!M8":true,"proforma!M9":true,"proforma!C14":true,"proforma!G14":true,"proforma!K14":true,"proforma!C15":true,"proforma!C16":true,"proforma!C17":true,"proforma!C18":true,"proforma!C19":true,"proforma!C20":true,"proforma!K20":true,"proforma!M20":true,"proforma!G15":true,"proforma!G16":true,"proforma!G17":true,"proforma!G18":true,"proforma!G19":true,"proforma!G20":true,"proforma!K15":true,"proforma!K16":true,"proforma!K17":true,"proforma!K18":true,"proforma!K19":true,"proforma!M15":true,"proforma!M16":true,"proforma!M17":true,"proforma!M18":true,"proforma!M19":true,"proforma!C22":true,"proforma!C23":true,"proforma!C24":true,"proforma!C25":true,"proforma!C26":true,"proforma!C27":true,"proforma!C28":true,"proforma!C29":true,"proforma!C30":true,"proforma!C31":true,"proforma!C32":true,"proforma!C33":true,"proforma!C34":true,"proforma!C35":true,"proforma!C36":true,"proforma!C37":true,"proforma!C38":true,"proforma!D22":true,"proforma!D23":true,"proforma!D24":true,"proforma!D25":true,"proforma!D26":true,"proforma!D27":true,"proforma!D28":true,"proforma!D29":true,"proforma!D30":true,"proforma!D31":true,"proforma!D32":true,"proforma!D33":true,"proforma!D34":true,"proforma!D35":true,"proforma!D36":true,"proforma!D37":true,"proforma!D38":true,"proforma!E22":true,"proforma!E23":true,"proforma!E24":true,"proforma!E25":true,"proforma!E26":true,"proforma!E27":true,"proforma!E28":true,"proforma!E29":true,"proforma!E30":true,"proforma!E31":true,"proforma!E32":true,"proforma!E33":true,"proforma!E34":true,"proforma!E35":true,"proforma!E36":true,"proforma!E37":true,"proforma!E38":true,"proforma!J22":true,"proforma!J23":true,"proforma!J24":true,"proforma!J25":true,"proforma!J26":true,"proforma!J27":true,"proforma!J28":true,"proforma!J29":true,"proforma!J30":true,"proforma!J31":true,"proforma!J32":true,"proforma!J33":true,"proforma!J34":true,"proforma!J35":true,"proforma!J36":true,"proforma!J37":true,"proforma!J38":true,"proforma!K22":true,"proforma!K23":true,"proforma!K24":true,"proforma!K25":true,"proforma!K26":true,"proforma!K27":true,"proforma!K28":true,"proforma!K29":true,"proforma!K30":true,"proforma!K31":true,"proforma!K32":true,"proforma!K33":true,"proforma!K34":true,"proforma!K35":true,"proforma!K36":true,"proforma!K37":true,"proforma!K38":true,"proforma!L22":true,"proforma!L23":true,"proforma!L24":true,"proforma!L25":true,"proforma!L26":true,"proforma!L27":true,"proforma!L28":true,"proforma!L29":true,"proforma!L30":true,"proforma!L31":true,"proforma!L32":true,"proforma!L33":true,"proforma!L34":true,"proforma!L35":true,"proforma!L36":true,"proforma!L37":true,"proforma!L38":true,"proforma!M22":true,"proforma!C40":true,"proforma!C41":true,"proforma!C42":true,"proforma!C43":true,"proforma!C44":true,"proforma!C45":true,"proforma!C46":true,"proforma!C47":true,"proforma!C48":true,"proforma!C49":true,"proforma!K39":true,"proforma!K40":true,"proforma!K41":true,"proforma!K42":true,"proforma!K43":true,"proforma!K44":true,"proforma!K45":true,"proforma!K46":true,"proforma!K47":true,"proforma!K48":true,"proforma!K49":true,"proforma!K50":true,"proforma!M41":true,"proforma!M43":true,"proforma!M44":true,"proforma!M45":true,"proforma!M46":true,"proforma!M47":true,"proforma!M48":true,"proforma!M50":true,"proforma!C52":true,"proforma!C53":true,"proforma!C54":true,"proforma!C55":true,"proforma!C57":true,"proforma!C59":true,"proforma!C61":true,"proforma!C62":true,"proforma!C63":true,"proforma!E57":true,"proforma!E53":true,"proforma!E54":true,"proforma!E55":true,"proforma!J61":true,"proforma!J62":true,"pf1!C3":true,"pf1!C5":true,"pf1!C6":true,"pf1!C8":true,"pf1!C9":true,"pf1!C10":true,"pf1!C11":true,"pf1!C12":true,"pf1!K6":true,"pf1!K7":true,"pf1!K8":true,"pf1!K9":true,"pf1!M6":true,"pf1!M7":true,"pf1!M8":true,"pf1!M9":true,"pf1!C14":true,"pf1!G14":true,"pf1!K14":true,"pf1!C15":true,"pf1!C16":true,"pf1!C17":true,"pf1!C18":true,"pf1!C19":true,"pf1!C20":true,"pf1!G15":true,"pf1!G16":true,"pf1!G17":true,"pf1!G18":true,"pf1!G19":true,"pf1!G20":true,"pf1!K20":true,"pf1!M20":true,"pf1!K15":true,"pf1!K16":true,"pf1!K17":true,"pf1!K18":true,"pf1!K19":true,"pf1!M15":true,"pf1!M16":true,"pf1!M17":true,"pf1!M18":true,"pf1!M19":true,"pf1!C22":true,"pf1!C23":true,"pf1!C24":true,"pf1!C25":true,"pf1!C26":true,"pf1!C27":true,"pf1!C28":true,"pf1!C29":true,"pf1!C30":true,"pf1!C31":true,"pf1!C32":true,"pf1!C33":true,"pf1!C34":true,"pf1!C35":true,"pf1!C36":true,"pf1!C37":true,"pf1!C38":true,"pf1!D22":true,"pf1!D23":true,"pf1!D24":true,"pf1!D25":true,"pf1!D26":true,"pf1!D27":true,"pf1!D28":true,"pf1!D29":true,"pf1!D30":true,"pf1!D31":true,"pf1!D32":true,"pf1!D33":true,"pf1!D34":true,"pf1!D35":true,"pf1!D36":true,"pf1!D37":true,"pf1!D38":true,"pf1!E22":true,"pf1!E23":true,"pf1!E24":true,"pf1!E25":true,"pf1!E26":true,"pf1!E27":true,"pf1!E28":true,"pf1!E29":true,"pf1!E30":true,"pf1!E31":true,"pf1!E32":true,"pf1!E33":true,"pf1!E34":true,"pf1!E35":true,"pf1!E36":true,"pf1!E37":true,"pf1!E38":true,"pf1!J22":true,"pf1!J23":true,"pf1!J24":true,"pf1!J25":true,"pf1!J26":true,"pf1!J27":true,"pf1!J28":true,"pf1!J29":true,"pf1!J30":true,"pf1!J31":true,"pf1!J32":true,"pf1!J33":true,"pf1!J34":true,"pf1!J35":true,"pf1!J36":true,"pf1!J37":true,"pf1!J38":true,"pf1!K22":true,"pf1!K23":true,"pf1!K24":true,"pf1!K25":true,"pf1!K26":true,"pf1!K27":true,"pf1!K28":true,"pf1!K29":true,"pf1!K30":true,"pf1!K31":true,"pf1!K32":true,"pf1!K33":true,"pf1!K34":true,"pf1!K35":true,"pf1!K36":true,"pf1!K37":true,"pf1!K38":true,"pf1!L22":true,"pf1!L23":true,"pf1!L24":true,"pf1!L25":true,"pf1!L26":true,"pf1!L27":true,"pf1!L28":true,"pf1!L29":true,"pf1!L30":true,"pf1!L31":true,"pf1!L32":true,"pf1!L33":true,"pf1!L34":true,"pf1!L35":true,"pf1!L36":true,"pf1!L37":true,"pf1!L38":true,"pf1!M22":true,"pf1!C40":true,"pf1!C41":true,"pf1!C42":true,"pf1!C43":true,"pf1!C44":true,"pf1!C45":true,"pf1!C46":true,"pf1!C47":true,"pf1!C48":true,"pf1!C49":true,"pf1!K39":true,"pf1!K40":true,"pf1!K41":true,"pf1!K42":true,"pf1!K43":true,"pf1!K44":true,"pf1!K45":true,"pf1!K46":true,"pf1!K47":true,"pf1!K48":true,"pf1!K49":true,"pf1!K50":true,"pf1!M41":true,"pf1!M43":true,"pf1!M44":true,"pf1!M45":true,"pf1!M46":true,"pf1!M47":true,"pf1!M48":true,"pf1!M50":true,"pf1!C52":true,"pf1!C53":true,"pf1!C54":true,"pf1!C55":true,"pf1!C57":true,"pf1!C59":true,"pf1!C61":true,"pf1!C62":true,"pf1!C63":true,"pf1!E57":true,"pf1!E53":true,"pf1!E54":true,"pf1!E55":true,"pf1!J61":true,"pf1!J62":true,"pf2!C3":true,"pf2!C5":true,"pf2!C6":true,"pf2!C8":true,"pf2!C9":true,"pf2!C10":true,"pf2!C11":true,"pf2!C12":true,"pf2!K6":true,"pf2!K7":true,"pf2!K8":true,"pf2!K9":true,"pf2!M6":true,"pf2!M7":true,"pf2!M8":true,"pf2!M9":true,"pf2!C14":true,"pf2!G14":true,"pf2!K14":true,"pf2!C15":true,"pf2!C16":true,"pf2!C17":true,"pf2!C18":true,"pf2!C19":true,"pf2!C20":true,"pf2!G15":true,"pf2!G16":true,"pf2!G17":true,"pf2!G18":true,"pf2!G19":true,"pf2!G20":true,"pf2!K20":true,"pf2!M20":true,"pf2!K15":true,"pf2!K16":true,"pf2!K17":true,"pf2!K18":true,"pf2!K19":true,"pf2!M15":true,"pf2!M16":true,"pf2!M17":true,"pf2!M18":true,"pf2!M19":true,"pf2!C22":true,"pf2!C23":true,"pf2!C24":true,"pf2!C25":true,"pf2!C26":true,"pf2!C27":true,"pf2!C28":true,"pf2!C29":true,"pf2!C30":true,"pf2!C31":true,"pf2!C32":true,"pf2!C33":true,"pf2!C34":true,"pf2!C35":true,"pf2!C36":true,"pf2!C37":true,"pf2!C38":true,"pf2!D22":true,"pf2!D23":true,"pf2!D24":true,"pf2!D25":true,"pf2!D26":true,"pf2!D27":true,"pf2!D28":true,"pf2!D29":true,"pf2!D30":true,"pf2!D31":true,"pf2!D32":true,"pf2!D33":true,"pf2!D34":true,"pf2!D35":true,"pf2!D36":true,"pf2!D37":true,"pf2!D38":true,"pf2!E22":true,"pf2!E23":true,"pf2!E24":true,"pf2!E25":true,"pf2!E26":true,"pf2!E27":true,"pf2!E28":true,"pf2!E29":true,"pf2!E30":true,"pf2!E31":true,"pf2!E32":true,"pf2!E33":true,"pf2!E34":true,"pf2!E35":true,"pf2!E36":true,"pf2!E37":true,"pf2!E38":true,"pf2!J22":true,"pf2!J23":true,"pf2!J24":true,"pf2!J25":true,"pf2!J26":true,"pf2!J27":true,"pf2!J28":true,"pf2!J29":true,"pf2!J30":true,"pf2!J31":true,"pf2!J32":true,"pf2!J33":true,"pf2!J34":true,"pf2!J35":true,"pf2!J36":true,"pf2!J37":true,"pf2!J38":true,"pf2!K22":true,"pf2!K23":true,"pf2!K24":true,"pf2!K25":true,"pf2!K26":true,"pf2!K27":true,"pf2!K28":true,"pf2!K29":true,"pf2!K30":true,"pf2!K31":true,"pf2!K32":true,"pf2!K33":true,"pf2!K34":true,"pf2!K35":true,"pf2!K36":true,"pf2!K37":true,"pf2!K38":true,"pf2!L22":true,"pf2!L23":true,"pf2!L24":true,"pf2!L25":true,"pf2!L26":true,"pf2!L27":true,"pf2!L28":true,"pf2!L29":true,"pf2!L30":true,"pf2!L31":true,"pf2!L32":true,"pf2!L33":true,"pf2!L34":true,"pf2!L35":true,"pf2!L36":true,"pf2!L37":true,"pf2!L38":true,"pf2!M22":true,"pf2!C40":true,"pf2!C41":true,"pf2!C42":true,"pf2!C43":true,"pf2!C44":true,"pf2!C45":true,"pf2!C46":true,"pf2!C47":true,"pf2!C48":true,"pf2!C49":true,"pf2!K39":true,"pf2!K40":true,"pf2!K41":true,"pf2!K42":true,"pf2!K43":true,"pf2!K44":true,"pf2!K45":true,"pf2!K46":true,"pf2!K47":true,"pf2!K48":true,"pf2!K49":true,"pf2!K50":true,"pf2!M41":true,"pf2!M43":true,"pf2!M44":true,"pf2!M45":true,"pf2!M46":true,"pf2!M47":true,"pf2!M48":true,"pf2!M50":true,"pf2!C52":true,"pf2!C53":true,"pf2!C54":true,"pf2!C55":true,"pf2!C57":true,"pf2!C59":true,"pf2!C61":true,"pf2!C62":true,"pf2!C63":true,"pf2!E57":true,"pf2!E53":true,"pf2!E54":true,"pf2!E55":true,"pf2!J61":true,"pf2!J62":true,"pf3!C3":true,"pf3!C5":true,"pf3!C6":true,"pf3!C8":true,"pf3!C9":true,"pf3!C10":true,"pf3!C11":true,"pf3!C12":true,"pf3!K6":true,"pf3!K7":true,"pf3!K8":true,"pf3!K9":true,"pf3!M6":true,"pf3!M7":true,"pf3!M8":true,"pf3!M9":true,"pf3!C14":true,"pf3!G14":true,"pf3!K14":true,"pf3!C15":true,"pf3!C16":true,"pf3!C17":true,"pf3!C18":true,"pf3!C19":true,"pf3!C20":true,"pf3!G15":true,"pf3!G16":true,"pf3!G17":true,"pf3!G18":true,"pf3!G19":true,"pf3!G20":true,"pf3!K15":true,"pf3!K16":true,"pf3!K17":true,"pf3!K18":true,"pf3!K19":true,"pf3!M15":true,"pf3!M16":true,"pf3!M17":true,"pf3!M18":true,"pf3!M19":true,"pf3!C22":true,"pf3!C23":true,"pf3!C24":true,"pf3!C25":true,"pf3!C26":true,"pf3!C27":true,"pf3!C28":true,"pf3!C29":true,"pf3!C30":true,"pf3!C31":true,"pf3!C32":true,"pf3!C33":true,"pf3!C34":true,"pf3!C35":true,"pf3!C36":true,"pf3!C37":true,"pf3!C38":true,"pf3!D22":true,"pf3!D23":true,"pf3!D24":true,"pf3!D25":true,"pf3!D26":true,"pf3!D27":true,"pf3!D28":true,"pf3!D29":true,"pf3!D30":true,"pf3!D31":true,"pf3!D32":true,"pf3!D33":true,"pf3!D34":true,"pf3!D35":true,"pf3!D36":true,"pf3!D37":true,"pf3!D38":true,"pf3!E22":true,"pf3!E23":true,"pf3!E24":true,"pf3!E25":true,"pf3!E26":true,"pf3!E27":true,"pf3!E28":true,"pf3!E29":true,"pf3!E30":true,"pf3!E31":true,"pf3!E32":true,"pf3!E33":true,"pf3!E34":true,"pf3!E35":true,"pf3!E36":true,"pf3!E37":true,"pf3!E38":true,"pf3!J22":true,"pf3!J23":true,"pf3!J24":true,"pf3!J25":true,"pf3!J26":true,"pf3!J27":true,"pf3!J28":true,"pf3!J29":true,"pf3!J30":true,"pf3!J31":true,"pf3!J32":true,"pf3!J33":true,"pf3!J34":true,"pf3!J35":true,"pf3!J36":true,"pf3!J37":true,"pf3!J38":true,"pf3!K22":true,"pf3!K23":true,"pf3!K24":true,"pf3!K25":true,"pf3!K26":true,"pf3!K27":true,"pf3!K28":true,"pf3!K29":true,"pf3!K30":true,"pf3!K31":true,"pf3!K32":true,"pf3!K33":true,"pf3!K34":true,"pf3!K35":true,"pf3!K36":true,"pf3!K37":true,"pf3!K38":true,"pf3!L22":true,"pf3!L23":true,"pf3!L24":true,"pf3!L25":true,"pf3!L26":true,"pf3!L27":true,"pf3!L28":true,"pf3!L29":true,"pf3!L30":true,"pf3!L31":true,"pf3!L32":true,"pf3!L33":true,"pf3!L34":true,"pf3!L35":true,"pf3!L36":true,"pf3!L37":true,"pf3!L38":true,"pf3!M22":true,"pf3!C40":true,"pf3!C41":true,"pf3!C42":true,"pf3!C43":true,"pf3!C44":true,"pf3!C45":true,"pf3!C46":true,"pf3!C47":true,"pf3!C48":true,"pf3!C49":true,"pf3!K39":true,"pf3!K40":true,"pf3!K41":true,"pf3!K42":true,"pf3!K43":true,"pf3!K44":true,"pf3!K45":true,"pf3!K46":true,"pf3!K47":true,"pf3!K48":true,"pf3!K49":true,"pf3!K50":true,"pf3!M41":true,"pf3!M43":true,"pf3!M44":true,"pf3!M45":true,"pf3!M46":true,"pf3!M47":true,"pf3!M48":true,"pf3!M50":true,"pf3!C52":true,"pf3!C53":true,"pf3!C54":true,"pf3!C55":true,"pf3!C57":true,"pf3!C59":true,"pf3!C61":true,"pf3!C62":true,"pf3!C63":true,"pf3!E57":true,"pf3!E53":true,"pf3!E54":true,"pf3!E55":true,"pf3!J61":true,"pf3!J62":true,"pf4!C3":true,"pf4!C5":true,"pf4!C6":true,"pf4!C8":true,"pf4!C9":true,"pf4!C10":true,"pf4!C11":true,"pf4!C12":true,"pf4!K6":true,"pf4!K7":true,"pf4!K8":true,"pf4!K9":true,"pf4!M6":true,"pf4!M7":true,"pf4!M8":true,"pf4!M9":true,"pf4!C14":true,"pf4!G14":true,"pf4!K14":true,"pf4!C15":true,"pf4!C16":true,"pf4!C17":true,"pf4!C18":true,"pf4!C19":true,"pf4!C20":true,"pf4!G15":true,"pf4!G16":true,"pf4!G17":true,"pf4!G18":true,"pf4!G19":true,"pf4!G20":true,"pf4!K15":true,"pf4!K16":true,"pf4!K17":true,"pf4!K18":true,"pf4!K19":true,"pf4!M15":true,"pf4!M16":true,"pf4!M17":true,"pf4!M18":true,"pf4!M19":true,"pf4!C22":true,"pf4!C23":true,"pf4!C24":true,"pf4!C25":true,"pf4!C26":true,"pf4!C27":true,"pf4!C28":true,"pf4!C29":true,"pf4!C30":true,"pf4!C31":true,"pf4!C32":true,"pf4!C33":true,"pf4!C34":true,"pf4!C35":true,"pf4!C36":true,"pf4!C37":true,"pf4!C38":true,"pf4!D22":true,"pf4!D23":true,"pf4!D24":true,"pf4!D25":true,"pf4!D26":true,"pf4!D27":true,"pf4!D28":true,"pf4!D29":true,"pf4!D30":true,"pf4!D31":true,"pf4!D32":true,"pf4!D33":true,"pf4!D34":true,"pf4!D35":true,"pf4!D36":true,"pf4!D37":true,"pf4!D38":true,"pf4!E22":true,"pf4!E23":true,"pf4!E24":true,"pf4!E25":true,"pf4!E26":true,"pf4!E27":true,"pf4!E28":true,"pf4!E29":true,"pf4!E30":true,"pf4!E31":true,"pf4!E32":true,"pf4!E33":true,"pf4!E34":true,"pf4!E35":true,"pf4!E36":true,"pf4!E37":true,"pf4!E38":true,"pf4!J22":true,"pf4!J23":true,"pf4!J24":true,"pf4!J25":true,"pf4!J26":true,"pf4!J27":true,"pf4!J28":true,"pf4!J29":true,"pf4!J30":true,"pf4!J31":true,"pf4!J32":true,"pf4!J33":true,"pf4!J34":true,"pf4!J35":true,"pf4!J36":true,"pf4!J37":true,"pf4!J38":true,"pf4!K22":true,"pf4!K23":true,"pf4!K24":true,"pf4!K25":true,"pf4!K26":true,"pf4!K27":true,"pf4!K28":true,"pf4!K29":true,"pf4!K30":true,"pf4!K31":true,"pf4!K32":true,"pf4!K33":true,"pf4!K34":true,"pf4!K35":true,"pf4!K36":true,"pf4!K37":true,"pf4!K38":true,"pf4!L22":true,"pf4!L23":true,"pf4!L24":true,"pf4!L25":true,"pf4!L26":true,"pf4!L27":true,"pf4!L28":true,"pf4!L29":true,"pf4!L30":true,"pf4!L31":true,"pf4!L32":true,"pf4!L33":true,"pf4!L34":true,"pf4!L35":true,"pf4!L36":true,"pf4!L37":true,"pf4!L38":true,"pf4!M22":true,"pf4!C40":true,"pf4!C41":true,"pf4!C42":true,"pf4!C43":true,"pf4!C44":true,"pf4!C45":true,"pf4!C46":true,"pf4!C47":true,"pf4!C48":true,"pf4!C49":true,"pf4!K39":true,"pf4!K40":true,"pf4!K41":true,"pf4!K42":true,"pf4!K43":true,"pf4!K44":true,"pf4!K45":true,"pf4!K46":true,"pf4!K47":true,"pf4!K48":true,"pf4!K49":true,"pf4!K50":true,"pf4!M41":true,"pf4!M43":true,"pf4!M44":true,"pf4!M45":true,"pf4!M46":true,"pf4!M47":true,"pf4!M48":true,"pf4!M50":true,"pf4!C52":true,"pf4!C53":true,"pf4!C54":true,"pf4!C55":true,"pf4!C57":true,"pf4!C59":true,"pf4!C61":true,"pf4!C62":true,"pf4!C63":true,"pf4!E57":true,"pf4!E53":true,"pf4!E54":true,"pf4!E55":true,"pf4!J61":true,"pf4!J62":true,"sheet6!B2":true,"sheet6!B3":true,"sheet6!B5":true,"sheet6!B6":true,"sheet6!B7":true,"sheet6!B8":true,"sheet6!F2":true,"sheet6!F4":true,"sheet6!F8":true,"sheet6!F9":true,"sheet6!F10":true,"sheet6!F11":true,"sheet6!F12":true,"sheet6!F13":true,"sheet6!F14":true,"sheet6!F15":true,"sheet6!B10":true,"sheet6!B11":true,"sheet6!B12":true,"sheet6!B13":true,"sheet6!B14":true,"sheet6!B15":true,"sheet6!G8":true,"sheet6!G9":true,"sheet6!G10":true,"sheet6!G11":true,"sheet6!G12":true,"sheet6!G13":true,"sheet6!G14":true,"sheet6!G15":true,"sheet6!B17":true,"sheet6!B18":true,"sheet6!B19":true,"sheet6!B20":true,"sheet6!B21":true,"sheet6!B22":true,"sheet6!B23":true,"sheet6!B24":true,"sheet6!B25":true,"sheet6!B26":true,"sheet6!B27":true,"sheet6!B28":true,"sheet6!B29":true,"sheet6!G17":true,"sheet6!G18":true,"sheet6!G19":true,"sheet6!G20":true,"sheet6!G21":true,"sheet6!G22":true,"sheet6!G23":true,"sheet6!G24":true,"sheet6!G25":true,"sheet6!G26":true,"sheet6!G27":true,"sheet6!G28":true,"sheet6!G29":true,"sheet6!F30":true,"sheet6!F31":true,"sheet6!F32":true,"sheet6!F33":true,"sheet6!F34":true,"sheet6!F35":true,"sheet6!G31":true,"sheet6!G33":true,"sheet6!G34":true,"sheet6!B32":true,"sheet6!B33":true,"sheet6!B34":true,"sheet6!B35":true,"sheet6!B38":true,"sheet6!":true,"sheet7!B2":true,"sheet7!B3":true,"sheet7!B5":true,"sheet7!B6":true,"sheet7!B7":true,"sheet7!B8":true,"sheet7!F2":true,"sheet7!F4":true,"sheet7!F8":true,"sheet7!F9":true,"sheet7!F10":true,"sheet7!F11":true,"sheet7!F12":true,"sheet7!F13":true,"sheet7!F14":true,"sheet7!F15":true,"sheet7!B10":true,"sheet7!B11":true,"sheet7!B12":true,"sheet7!B13":true,"sheet7!B14":true,"sheet7!B15":true,"sheet7!G8":true,"sheet7!G9":true,"sheet7!G10":true,"sheet7!G11":true,"sheet7!G12":true,"sheet7!G13":true,"sheet7!G14":true,"sheet7!G15":true,"sheet7!G17":true,"sheet7!B17":true,"sheet7!B18":true,"sheet7!B19":true,"sheet7!B20":true,"sheet7!B21":true,"sheet7!B22":true,"sheet7!B23":true,"sheet7!B24":true,"sheet7!B25":true,"sheet7!B26":true,"sheet7!B27":true,"sheet7!B28":true,"sheet7!B29":true,"sheet7!E17":true,"sheet7!E18":true,"sheet7!E19":true,"sheet7!E20":true,"sheet7!E21":true,"sheet7!E22":true,"sheet7!E23":true,"sheet7!E24":true,"sheet7!E25":true,"sheet7!E26":true,"sheet7!E27":true,"sheet7!E28":true,"sheet7!E29":true,"sheet7!F17":true,"sheet7!F18":true,"sheet7!F19":true,"sheet7!F20":true,"sheet7!F21":true,"sheet7!F22":true,"sheet7!F23":true,"sheet7!F24":true,"sheet7!F25":true,"sheet7!F26":true,"sheet7!F27":true,"sheet7!F28":true,"sheet7!F29":true,"sheet7!F30":true,"sheet7!F31":true,"sheet7!F32":true,"sheet7!F33":true,"sheet7!F34":true,"sheet7!G31":true,"sheet7!G33":true,"sheet7!B35":true,"sheet7!B38":true,"sheet7!B36":true,"sheet7!B37":true,"sheet7!C37":true,"sheet7!F36":true,"sheet7!F37":true,"sheet7!F38":true,"sheet7!F39":true,"sheet7!B42":true,"sheet10!B2":true,"sheet10!B3":true,"sheet10!B5":true,"sheet10!B6":true,"sheet10!B7":true,"sheet10!B8":true,"sheet10!F2":true,"sheet10!F4":true,"sheet10!F8":true,"sheet10!F9":true,"sheet10!F10":true,"sheet10!F11":true,"sheet10!F12":true,"sheet10!F13":true,"sheet10!F14":true,"sheet10!F15":true,"sheet10!B10":true,"sheet10!B11":true,"sheet10!B12":true,"sheet10!B13":true,"sheet10!B14":true,"sheet10!B15":true,"sheet10!G8":true,"sheet10!G9":true,"sheet10!G10":true,"sheet10!G11":true,"sheet10!G12":true,"sheet10!G13":true,"sheet10!G14":true,"sheet10!G15":true,"sheet10!B17":true,"sheet10!B18":true,"sheet10!B19":true,"sheet10!B20":true,"sheet10!B21":true,"sheet10!B22":true,"sheet10!B23":true,"sheet10!B24":true,"sheet10!B25":true,"sheet10!B26":true,"sheet10!B27":true,"sheet10!B28":true,"sheet10!B29":true,"sheet10!E17":true,"sheet10!E18":true,"sheet10!E19":true,"sheet10!E20":true,"sheet10!E21":true,"sheet10!E22":true,"sheet10!E23":true,"sheet10!E24":true,"sheet10!E25":true,"sheet10!E26":true,"sheet10!E27":true,"sheet10!E28":true,"sheet10!E29":true,"sheet10!F17":true,"sheet10!F18":true,"sheet10!F19":true,"sheet10!F20":true,"sheet10!F21":true,"sheet10!F22":true,"sheet10!F23":true,"sheet10!F24":true,"sheet10!F25":true,"sheet10!F26":true,"sheet10!F27":true,"sheet10!F28":true,"sheet10!F29":true,"sheet10!F30":true,"sheet10!F31":true,"sheet10!F32":true,"sheet10!F33":true,"sheet10!F34":true,"sheet10!G31":true,"sheet10!G33":true,"sheet10!B35":true,"sheet10!B38":true,"sheet10!B36":true,"sheet10!B37":true,"sheet10!C37":true,"sheet10!F36":true,"sheet10!F37":true,"sheet10!F38":true,"sheet10!F39":true,"sheet10!B42":true,"sheet9!C3":true,"sheet9!D3":true,"sheet9!C4":true,"sheet9!C5":true,"sheet9!C6":true,"sheet9!D6":true,"sheet9!E6":true,"sheet9!H3":true,"sheet9!C9":true,"sheet9!D12":true,"sheet9!E12":true,"sheet9!F12":true,"sheet9!G12":true,"sheet9!C14":true,"sheet9!C16":true,"sheet9!C17":true,"sheet9!C18":true,"sheet9!C19":true,"sheet9!C20":true,"sheet9!C21":true,"sheet9!C22":true,"sheet9!C23":true,"sheet9!C24":true,"sheet9!C25":true,"sheet9!C26":true,"sheet9!C27":true,"sheet9!C28":true,"sheet9!F16":true,"sheet9!H16":true,"sheet9!F17":true,"sheet9!F18":true,"sheet9!F19":true,"sheet9!F20":true,"sheet9!F21":true,"sheet9!F22":true,"sheet9!F23":true,"sheet9!F24":true,"sheet9!F25":true,"sheet9!F26":true,"sheet9!F27":true,"sheet9!F28":true,"sheet9!G16":true,"sheet9!G17":true,"sheet9!G18":true,"sheet9!G19":true,"sheet9!G20":true,"sheet9!G21":true,"sheet9!G22":true,"sheet9!G23":true,"sheet9!G24":true,"sheet9!G25":true,"sheet9!G26":true,"sheet9!G27":true,"sheet9!G28":true,"sheet9!C31":true,"sheet9!G29":true,"sheet9!G30":true,"sheet9!G31":true,"sheet9!G32":true,"sheet9!G33":true,"sheet9!H30":true,"sheet9!H32":true,"sheet9!C38":true,"typeii!F4":true,"sheet16!C2":true,"sheet16!C4":true,"sheet16!C6":true,"sheet16!C9":true,"sheet16!E9":true,"sheet16!C15":true,"sheet16!H15":true,"sheet16!F15":true,"sheet16!G15":true,"sheet16!C29":true,"sheet16!D4":true,"sheet16!C10":true,"sheet16!C11":true,"sheet16!C12":true,"sheet16!C13":true,"sheet16!D9":true,"sheet16!E10":true,"sheet16!E11":true,"sheet16!E12":true,"sheet16!E13":true,"sheet16!F9":true,"sheet16!C16":true,"sheet16!C17":true,"sheet16!C18":true,"sheet16!C19":true,"sheet16!C20":true,"sheet16!C21":true,"sheet16!C22":true,"sheet16!C23":true,"sheet16!C24":true,"sheet16!C25":true,"sheet16!C26":true,"sheet16!C27":true,"sheet16!C28":true,"sheet16!F16":true,"sheet16!F17":true,"sheet16!F18":true,"sheet16!F19":true,"sheet16!F20":true,"sheet16!F21":true,"sheet16!F22":true,"sheet16!F23":true,"sheet16!F24":true,"sheet16!F25":true,"sheet16!F26":true,"sheet16!F27":true,"sheet16!F28":true,"sheet16!G16":true,"sheet16!G17":true,"sheet16!G18":true,"sheet16!G19":true,"sheet16!G20":true,"sheet16!G21":true,"sheet16!G22":true,"sheet16!G23":true,"sheet16!G24":true,"sheet16!G25":true,"sheet16!G26":true,"sheet16!G27":true,"sheet16!G28":true,"sheet16!E35":true,"sheet16!D6":true,"sheet16!F4":true,"sheet17!B2":true,"sheet17!C4":true,"sheet17!D4":true,"sheet17!C6":true,"sheet17!D6":true,"sheet17!C9":true,"sheet17!C10":true,"sheet17!C11":true,"sheet17!C12":true,"sheet17!C13":true,"sheet17!E9":true,"sheet17!E10":true,"sheet17!E11":true,"sheet17!E12":true,"sheet17!E13":true,"sheet17!C15":true,"sheet17!F15":true,"sheet17!G15":true,"sheet17!H15":true,"sheet17!I15":true,"sheet17!C16":true,"sheet17!C17":true,"sheet17!C18":true,"sheet17!C19":true,"sheet17!C20":true,"sheet17!C21":true,"sheet17!C22":true,"sheet17!C23":true,"sheet17!C24":true,"sheet17!C25":true,"sheet17!C26":true,"sheet17!C27":true,"sheet17!C28":true,"sheet17!F16":true,"sheet17!F17":true,"sheet17!F18":true,"sheet17!F19":true,"sheet17!F20":true,"sheet17!F21":true,"sheet17!F22":true,"sheet17!F23":true,"sheet17!F24":true,"sheet17!F25":true,"sheet17!F26":true,"sheet17!F27":true,"sheet17!F28":true,"sheet17!G16":true,"sheet17!G17":true,"sheet17!G18":true,"sheet17!G19":true,"sheet17!G20":true,"sheet17!G21":true,"sheet17!G22":true,"sheet17!G23":true,"sheet17!G24":true,"sheet17!G25":true,"sheet17!G26":true,"sheet17!G27":true,"sheet17!G28":true,"sheet17!H16":true,"sheet17!H17":true,"sheet17!H18":true,"sheet17!H19":true,"sheet17!H20":true,"sheet17!H21":true,"sheet17!H22":true,"sheet17!H23":true,"sheet17!H24":true,"sheet17!H25":true,"sheet17!H26":true,"sheet17!H27":true,"sheet17!H28":true,"sheet17!C29":true,"sheet17!E35":true},"constraints":{}}} \ No newline at end of file diff --git a/Website/excelinterop/tmp/graph-paper.xls b/Website/excelinterop/tmp/graph-paper.xls deleted file mode 100644 index 7b70e75..0000000 Binary files a/Website/excelinterop/tmp/graph-paper.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/grocerylist.xls b/Website/excelinterop/tmp/grocerylist.xls deleted file mode 100644 index 79d4ec1..0000000 Binary files a/Website/excelinterop/tmp/grocerylist.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/headache-log.xls b/Website/excelinterop/tmp/headache-log.xls deleted file mode 100644 index 69f1014..0000000 Binary files a/Website/excelinterop/tmp/headache-log.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/home-expense-calculator.xls b/Website/excelinterop/tmp/home-expense-calculator.xls deleted file mode 100644 index 625870b..0000000 Binary files a/Website/excelinterop/tmp/home-expense-calculator.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/immunization-record.xls b/Website/excelinterop/tmp/immunization-record.xls deleted file mode 100644 index cf28463..0000000 Binary files a/Website/excelinterop/tmp/immunization-record.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/income-statement-1.xls b/Website/excelinterop/tmp/income-statement-1.xls deleted file mode 100644 index 9c71d2b..0000000 Binary files a/Website/excelinterop/tmp/income-statement-1.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/income-statement.xls b/Website/excelinterop/tmp/income-statement.xls deleted file mode 100644 index d83b8a6..0000000 Binary files a/Website/excelinterop/tmp/income-statement.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/invoice.msc.txt b/Website/excelinterop/tmp/invoice.msc.txt deleted file mode 100644 index 1e9d5f8..0000000 --- a/Website/excelinterop/tmp/invoice.msc.txt +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":4,"currentid":"sheet1","currentname":"typei","sheetArr":{"sheet1":{"sheetstr":{"savestr":"version:1.5\ncell:A1:l:4\ncell:B1:b:::2::l:1:f:8\ncell:C1:b:::2::l:1:f:8\ncell:D1:b:::2::l:1:f:8\ncell:E1:b:::2::l:1:f:8\ncell:F1:b:::2::l:1:f:8\ncell:G1:b:::2::l:1:f:8\ncell:A2:b::2:::l:1:f:8\ncell:B2:t:INVOICE:b:1:1:1:1:f:7:cf:1:colspan:6\ncell:C2:t::b:2::2::l:1:f:8\ncell:D2:t::b:2::2::l:1:f:8\ncell:E2:t::b:2::2::l:1:f:8\ncell:F2:t::b:2::2::l:1:f:8\ncell:G2:t::b:2::2::l:1:f:8\ncell:A3:b::2:::l:3:f:8\ncell:B3:b:2:::2:l:3:f:8\ncell:C3:b:2::::l:1:f:8\ncell:D3:b:2::::l:1:f:8\ncell:E3:b:2::::l:1:f:8\ncell:F3:b:2::::l:1:f:8\ncell:G3:b:2:2:::l:3:f:8\ncell:A4:b::2:::l:3:f:8\ncell:B4:b::::2:l:3:f:4\ncell:C4:t:INVOICE # \\c:f:3:cf:2\ncell:D4:v:1:f:3:cf:2\ncell:F4:tvf:4:rowspan:4\ncell:G4:b::2:::l:3:f:8\ncell:A5:b::2:::l:3:f:8\ncell:B5:b::::2:l:3:f:5\ncell:F5:t::l:2:f:8\ncell:G5:t::b::1:::l:2:f:8\ncell:A6:b::2:::l:3:f:8\ncell:B6:b::::2:l:3:f:5\ncell:C6:t:INVOICE DATE\\c:f:3:cf:2\ncell:D6:f:3:cf:2:ntvf:3\ncell:F6:l:2:f:8\ncell:G6:b::1:::l:2:f:8\ncell:A7:b::2:::l:3:f:8\ncell:B7:b::::2:l:3:f:5\ncell:G7:b::2:::l:3:f:8\ncell:A8:b::2:::l:3:f:8\ncell:B8:b::::2:l:3:f:5\ncell:G8:b::2:::l:3:f:8\ncell:A9:b::2:::l:3:f:8\ncell:B9:b::::2:l:3:f:5\ncell:C9:t:BILL TO\\c:l:3:f:3\ncell:E9:t:FROM\\c:f:3:cf:2\ncell:G9:b::2:::l:3:f:8\ncell:A10:b::2:::l:3:f:8\ncell:B10:b::::2:l:3:f:4\ncell:C10:t:[Name]:f:1:cf:2:colspan:2\ncell:E10:t:[Name]:f:1:cf:2:colspan:2\ncell:G10:b::2:::l:3:f:8\ncell:A11:b::2:::l:3:f:8\ncell:B11:b::::2:l:3:f:8\ncell:C11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:E11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:G11:b::2:::l:3:f:8\ncell:A12:b::2:::l:3:f:8\ncell:B12:b::::2:l:3:f:8\ncell:C12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:E12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:G12:b::2:::l:3:f:8\ncell:A13:b::2:::l:3:f:8\ncell:B13:b::::2:l:3:f:8\ncell:C13:t:Phone\\c:f:1:cf:2:colspan:2\ncell:E13:t:Phone\\c:f:1:cf:2:colspan:2\ncell:G13:b::2:::l:3:f:8\ncell:A14:b::2:::l:3:f:8\ncell:B14:b::::2:l:3:f:4:cf:2\ncell:C14:b:::2::l:1:f:8\ncell:D14:b:::2::l:3:f:4:cf:2\ncell:E14:b:::2::l:1:f:8\ncell:F14:b:::2::l:1:f:8\ncell:G14:b::2:::l:3:f:8\ncell:A15:b::2:::l:3:f:8\ncell:B15:b::2::2:l:3:f:8\ncell:C15:t:Description:b:1::1:1:f:3:cf:1:colspan:3\ncell:D15:t:Description:b:1::1::l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:E15:t::b:2:2:2::l:1:f:8\ncell:F15:t:Amount:b:1:1:1:1:f:3:cf:1\ncell:G15:b::2::2:l:3:f:8\ncell:A16:b::2:::l:3:f:8\ncell:B16:b::2::2:l:3:f:8\ncell:C16:b:1:1::1:f:1:cf:2:colspan:3\ncell:D16:b:1:1:::l:3:f:8:cf:2:colspan:2:rowspan:1\ncell:E16:t::b:2:2:2::l:1:f:8\ncell:F16:b:1:1:::f:1:ntvf:1\ncell:G16:b::2::2:l:3:f:8\ncell:A17:b::2:::l:3:f:8\ncell:B17:b::2::2:l:3:f:8:cf:2\ncell:C17:b::1::1:f:1:cf:2:colspan:3\ncell:D17:b::1:::l:1:f:8:colspan:2\ncell:E17:l:1:f:8\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::2::2:l:3:f:8\ncell:A18:b::2:::l:3:f:8\ncell:B18:b::2::2:l:3:f:8:cf:2:ntvf:2\ncell:C18:b::1::1:f:1:cf:2:colspan:3\ncell:D18:b::1:::colspan:2\ncell:F18:b::1:::f:1:ntvf:1\ncell:G18:b::2::2:l:3:f:8\ncell:A19:b::2:::l:3:f:8\ncell:B19:b::2::2:l:3:f:8:cf:2:ntvf:2\ncell:C19:b::1::1:f:1:cf:2:colspan:3\ncell:D19:b::1:::colspan:2\ncell:F19:b::1:::f:1:ntvf:1\ncell:G19:b::2::2:l:3:f:8\ncell:A20:b::2:::l:3:f:8\ncell:B20:b::2::2:l:3:f:8:cf:2:ntvf:2\ncell:C20:b::1::1:f:1:cf:2:colspan:3\ncell:D20:b::1:::colspan:2\ncell:F20:b::1:::f:1:ntvf:1\ncell:G20:b::2::2:l:3:f:8\ncell:A21:b::2:::l:3:f:8\ncell:B21:b::2::2:l:3:f:8:cf:2:ntvf:2\ncell:C21:b::1::1:f:1:cf:2:colspan:3\ncell:D21:b::1:::colspan:2\ncell:F21:b::1:::f:1:ntvf:1\ncell:G21:b::2::2:l:3:f:8\ncell:A22:b::2:::l:3:f:8\ncell:B22:b::2::2:l:3:f:8:cf:2:ntvf:2\ncell:C22:b::1::1:f:1:cf:2:colspan:3\ncell:D22:b::1:::colspan:2\ncell:F22:b::1:::f:1:ntvf:1\ncell:G22:b::2::2:l:3:f:8\ncell:A23:b::2:::l:3:f:8\ncell:B23:b::2::2:l:3:f:8:cf:2\ncell:C23:b::1::1:f:1:cf:2:colspan:3\ncell:D23:b::1:::colspan:2\ncell:F23:b::1:::f:1:ntvf:1\ncell:G23:b::2::2:l:3:f:8\ncell:A24:b::2:::l:3:f:8\ncell:B24:b::2::2:l:3:f:8:cf:2\ncell:C24:b::1::1:f:1:cf:2:colspan:3\ncell:D24:b::1:::colspan:2\ncell:F24:b::1:::f:1:ntvf:1\ncell:G24:b::2::2:l:3:f:8\ncell:A25:b::2:::l:3:f:8\ncell:B25:b::2::2:l:3:f:8:cf:2\ncell:C25:b::1::1:f:1:cf:2:colspan:3\ncell:D25:b::1:::colspan:2\ncell:F25:b::1:::f:1:ntvf:1\ncell:G25:b::2::2:l:3:f:8\ncell:A26:b::2:::l:3:f:8\ncell:B26:b::2::2:l:3:f:8:cf:2\ncell:C26:b::1::1:f:1:cf:2:colspan:3\ncell:D26:b::1:::colspan:2\ncell:F26:b::1:::f:1:ntvf:1\ncell:G26:b::2::2:l:3:f:8\ncell:A27:b::2:::l:3:f:8\ncell:B27:b::2::2:l:3:f:8:cf:2\ncell:C27:b::1::1:f:1:cf:2:colspan:3\ncell:D27:b::1:::colspan:2\ncell:F27:b::1:::f:1:ntvf:1\ncell:G27:b::2::2:l:3:f:8\ncell:A28:b::2:::l:3:f:5\ncell:B28:b::2::2:l:3:f:8:cf:2\ncell:C28:b::1:1:1:f:1:cf:2:colspan:3\ncell:D28:b::1:1::l:3:f:8:cf:2:colspan:2\ncell:E28:b:::2::l:3:f:8:cf:2\ncell:F28:b::1:1::f:1:ntvf:1\ncell:G28:b::2::2:l:3:f:8\ncell:A29:b::2:::l:3:f:4\ncell:B29:b::2::2:l:3:f:4\ncell:C29:t:TOTAL:b:1:1:1:1:f:6:cf:2:colspan:3\ncell:D29:b:2::2::l:3:f:9:cf:2\ncell:E29:b:2:2:2::l:3:f:9:cf:2\ncell:F29:vtf:n:0:SUM(F16\\cF28):b:1:1:1::f:6:ntvf:1\ncell:G29:b::2::2:l:3:f:5\ncell:A30:b::2:::l:3:f:8\ncell:B30:b::::2:l:3:f:4:cf:2\ncell:C30:b:2::::l:1:f:8\ncell:D30:b:2::::l:1:f:8\ncell:E30:b:2::::l:1:f:8\ncell:F30:b:2::::l:1:f:8\ncell:G30:b::2:::l:3:f:4\ncell:A31:b::2:::l:3:f:8\ncell:B31:b::::2:l:3:f:8\ncell:G31:b::2:::l:3:f:8\ncell:A32:b::2:::l:3:f:8\ncell:B32:b::::2:l:3:f:8\ncell:G32:b::2:::l:3:f:8\ncell:A33:b::2:::l:3:f:8\ncell:B33:b::::2:l:3:f:8\ncell:G33:b::2:::l:3:f:8\ncell:A34:b::2:::l:3:f:8\ncell:B34:b::::2:l:3:f:8\ncell:G34:b::2:::l:3:f:8\ncell:A35:b::2:::l:3:f:8\ncell:B35:b::::2:l:3:f:8:cf:2\ncell:E35:t:Thank you for your business:f:2:colspan:2\ncell:F35:t::l:2:f:8\ncell:G35:b::2:::l:3:f:8\ncell:A36:b::2:::l:3:f:8\ncell:B36:b::::2:l:3:f:8\ncell:G36:b::2:::l:3:f:8\ncell:A37:b::2:::l:3:f:8\ncell:B37:b:::2:2:l:3:f:8\ncell:C37:b:::2::l:3:f:8\ncell:D37:b:::2::l:3:f:8\ncell:E37:b:::2::l:3:f:8\ncell:F37:b:::2::l:3:f:8\ncell:G37:b::2:2::l:3:f:8\ncell:B38:b:1:::\ncell:C38:b:1:::\ncell:D38:b:1:::\ncell:E38:b:1:::\ncell:F38:b:1:::\ncell:G38:b:1:::\ncol:A:w:26\ncol:B:w:42\ncol:C:w:105\ncol:D:w:182\ncol:E:w:110\ncol:F:w:115\ncol:G:w:65\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nsheet:c:7:r:38:h:12.75\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:normal bold * Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal bold 12pt Trebuchet MS\nfont:7:normal bold 14pt Trebuchet MS\nfont:8:normal normal 10pt Arial\nfont:9:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nlayout:4:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:d-mmm\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n"},"name":"typei","hidden":"0"},"sheet2":{"sheetstr":{"savestr":"version:1.5\ncell:A1:l:4\ncell:B1:b:::2::l:1:f:8\ncell:C1:b:::2::l:1:f:8\ncell:D1:b:::2::l:1:f:8\ncell:E1:b:::2::l:1:f:8\ncell:F1:b:::2::l:1:f:8\ncell:G1:b:::2::l:1:f:8\ncell:H1:b:::2::l:1:f:8\ncell:I1:b:::2::l:1:f:8\ncell:A2:b::2:::l:1:f:8\ncell:B2:t:INVOICE:b:1:1:1:1:l:3:f:7:cf:1:colspan:8\ncell:C2:t::b:2::2::l:1:f:8\ncell:D2:t::b:2::2::l:1:f:8\ncell:E2:t::b:2::2::l:1:f:8\ncell:F2:t::b:2::2::l:1:f:8\ncell:G2:b:2::2::l:1:f:8\ncell:H2:b:2::2::l:1:f:8\ncell:I2:t::b:2::2::l:1:f:8\ncell:A3:b::2:::l:3:f:8\ncell:B3:b:2:::2:l:3:f:8\ncell:E3:b:2::::l:1:f:8\ncell:F3:b:2::::l:1:f:8\ncell:G3:b:2::::l:1:f:8\ncell:H3:b:2::::l:1:f:8\ncell:I3:b:2:2:::l:3:f:8\ncell:A4:b::2:::l:3:f:8\ncell:B4:b::::2:l:3:f:4\ncell:C4:t:INVOICE # \\c:f:3:cf:2\ncell:D4:v:1:f:3:cf:2\ncell:F4:tvf:5:colspan:2:rowspan:4\ncell:I4:b::2:::l:3:f:8\ncell:A5:b::2:::l:3:f:8\ncell:B5:b::::2:l:3:f:5\ncell:F5:t::l:2:f:8\ncell:G5:l:2:f:8\ncell:H5:l:2:f:8\ncell:I5:t::b::1:::l:2:f:8\ncell:A6:b::2:::l:3:f:8\ncell:B6:b::::2:l:3:f:5\ncell:C6:t:INVOICE DATE\\c:f:3:cf:2\ncell:D6:f:3:cf:2:ntvf:4\ncell:F6:l:2:f:8\ncell:G6:l:2:f:8\ncell:H6:l:2:f:8\ncell:I6:b::1:::l:2:f:8\ncell:A7:b::2:::l:3:f:8\ncell:B7:b::::2:l:3:f:5\ncell:I7:b::2:::l:3:f:8\ncell:A8:b::2:::l:3:f:8\ncell:B8:b::::2:l:3:f:5\ncell:I8:b::2:::l:3:f:8\ncell:A9:b::2:::l:3:f:8\ncell:B9:b::::2:l:3:f:5\ncell:C9:t:BILL TO\\c:f:3\ncell:E9:t:FROM\\c:f:3:cf:2\ncell:F9:colspan:3\ncell:I9:b::2:::l:3:f:8\ncell:A10:b::2:::l:3:f:8\ncell:B10:b::::2:l:3:f:4\ncell:C10:t:[Name]:f:1:cf:2:colspan:2\ncell:E10:t:[Name]:f:1:cf:2:colspan:4\ncell:I10:b::2:::l:3:f:8\ncell:A11:b::2:::l:3:f:8\ncell:B11:b::::2:l:3:f:8\ncell:C11:t:[Street Address]:f:1:cf:2:colspan:2\ncell:E11:t:[Street Address]:f:1:colspan:4\ncell:I11:b::2:::l:3:f:8\ncell:A12:b::2:::l:3:f:8\ncell:B12:b::::2:l:3:f:8\ncell:C12:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:E12:t:[City, State, Zip]:f:1:cf:2:colspan:4\ncell:I12:b::2:::l:3:f:8\ncell:A13:b::2:::l:3:f:8\ncell:B13:b::::2:l:3:f:8\ncell:C13:t:Phone\\c :f:1:cf:2:colspan:2\ncell:E13:t:Phone\\c :f:1:cf:2:colspan:4\ncell:I13:b::2:::l:3:f:8\ncell:A14:b::2:::l:3:f:8\ncell:B14:b::::2:l:3:f:4:cf:2\ncell:C14:b:::2::l:1:f:8\ncell:D14:b:::2::l:3:f:4:cf:2\ncell:E14:b:::2::l:1:f:8\ncell:F14:b:::2::l:1:f:8\ncell:G14:b:::2::l:1:f:8\ncell:H14:b:::2::l:1:f:8\ncell:I14:b::2:::l:3:f:8\ncell:A15:b::2:::l:3:f:8\ncell:B15:b::2::2:l:3:f:8\ncell:C15:t:Description:b:1:1:1:1:f:3:cf:1:colspan:3\ncell:D15:t:Description:b:2::2:2:l:3:f:4:cf:2:colspan:2:rowspan:1\ncell:E15:t::b:2:2:2::l:1:f:8\ncell:F15:t:Hours:b:1:1:1:1:f:3:cf:1\ncell:G15:t:Rate:b:1:1:1:1:f:3:cf:1\ncell:H15:t:Amount:b:1:1:1:1:f:3:cf:1\ncell:I15:b::2::2:l:3:f:8\ncell:A16:b::2:::l:3:f:8\ncell:B16:b::2::2:l:3:f:8\ncell:C16:b:1:1::1:f:1:cf:2:colspan:3\ncell:D16:b:1:1::1:l:3:f:8:cf:2:colspan:2:rowspan:1\ncell:E16:t::b:2:2:2::l:1:f:8\ncell:F16:b:1:1:::f:1:ntvf:1\ncell:G16:b:1:1:::f:1:ntvf:1\ncell:H16:vtf:t::IF(F16*G16>0,F16*G16,\"\"):b:1:1:::f:1:ntvf:1\ncell:I16:b::2::2:l:3:f:8\ncell:A17:b::2:::l:3:f:8\ncell:B17:b::2::2:l:3:f:8:cf:2\ncell:C17:b::1::1:f:1:cf:2:colspan:3\ncell:D17:b::1::1:l:1:f:8:colspan:2\ncell:E17:l:1:f:8\ncell:F17:b::1:::f:1:ntvf:1\ncell:G17:b::1:::f:1:ntvf:1\ncell:H17:vtf:t::IF(F17*G17>0,F17*G17,\"\"):b::1:::f:1:ntvf:1\ncell:I17:b::2::2:l:3:f:8\ncell:A18:b::2:::l:3:f:8\ncell:B18:b::2::2:l:3:f:8:cf:2:ntvf:3\ncell:C18:b::1::1:f:1:cf:2:colspan:3\ncell:D18:b::1::1:colspan:2\ncell:F18:b::1:::f:1:ntvf:1\ncell:G18:b::1:::f:1:ntvf:1\ncell:H18:vtf:t::IF(F18*G18>0,F18*G18,\"\"):b::1:::f:1:ntvf:1\ncell:I18:b::2::2:l:3:f:8\ncell:A19:b::2:::l:3:f:8\ncell:B19:b::2::2:l:3:f:8:cf:2:ntvf:3\ncell:C19:b::1::1:f:1:cf:2:colspan:3\ncell:D19:b::1::1:colspan:2\ncell:F19:b::1:::f:1:ntvf:1\ncell:G19:b::1:::f:1:ntvf:1\ncell:H19:vtf:t::IF(F19*G19>0,F19*G19,\"\"):b::1:::f:1:ntvf:1\ncell:I19:b::2::2:l:3:f:8\ncell:A20:b::2:::l:3:f:8\ncell:B20:b::2::2:l:3:f:8:cf:2:ntvf:3\ncell:C20:b::1::1:f:1:cf:2:colspan:3\ncell:D20:b::1::1:colspan:2\ncell:F20:b::1:::f:1:ntvf:1\ncell:G20:b::1:::f:1:ntvf:1\ncell:H20:vtf:t::IF(F20*G20>0,F20*G20,\"\"):b::1:::f:1:ntvf:1\ncell:I20:b::2::2:l:3:f:8\ncell:A21:b::2:::l:3:f:8\ncell:B21:b::2::2:l:3:f:8:cf:2:ntvf:3\ncell:C21:b::1::1:f:1:cf:2:colspan:3\ncell:D21:b::1::1:colspan:2\ncell:F21:b::1:::f:1:ntvf:1\ncell:G21:b::1:::f:1:ntvf:1\ncell:H21:vtf:t::IF(F21*G21>0,F21*G21,\"\"):b::1:::f:1:ntvf:1\ncell:I21:b::2::2:l:3:f:8\ncell:A22:b::2:::l:3:f:8\ncell:B22:b::2::2:l:3:f:8:cf:2:ntvf:3\ncell:C22:b::1::1:f:1:cf:2:colspan:3\ncell:D22:b::1::1:colspan:2\ncell:F22:b::1:::f:1:ntvf:1\ncell:G22:b::1:::f:1:ntvf:1\ncell:H22:vtf:t::IF(F22*G22>0,F22*G22,\"\"):b::1:::f:1:ntvf:1\ncell:I22:b::2::2:l:3:f:8\ncell:A23:b::2:::l:3:f:8\ncell:B23:b::2::2:l:3:f:8:cf:2\ncell:C23:b::1::1:f:1:cf:2:colspan:3\ncell:D23:b::1::1:colspan:2\ncell:F23:b::1:::f:1:ntvf:1\ncell:G23:b::1:::f:1:ntvf:1\ncell:H23:vtf:t::IF(F23*G23>0,F23*G23,\"\"):b::1:::f:1:ntvf:1\ncell:I23:b::2::2:l:3:f:8\ncell:A24:b::2:::l:3:f:8\ncell:B24:b::2::2:l:3:f:8:cf:2\ncell:C24:b::1::1:f:1:cf:2:colspan:3\ncell:D24:b::1::1:colspan:2\ncell:F24:b::1:::f:1:ntvf:1\ncell:G24:b::1:::f:1:ntvf:1\ncell:H24:vtf:t::IF(F24*G24>0,F24*G24,\"\"):b::1:::f:1:ntvf:1\ncell:I24:b::2::2:l:3:f:8\ncell:A25:b::2:::l:3:f:8\ncell:B25:b::2::2:l:3:f:8:cf:2\ncell:C25:b::1::1:f:1:cf:2:colspan:3\ncell:D25:b::1::1:colspan:2\ncell:F25:b::1:::f:1:ntvf:1\ncell:G25:b::1:::f:1:ntvf:1\ncell:H25:vtf:t::IF(F25*G25>0,F25*G25,\"\"):b::1:::f:1:ntvf:1\ncell:I25:b::2::2:l:3:f:8\ncell:A26:b::2:::l:3:f:8\ncell:B26:b::2::2:l:3:f:8:cf:2\ncell:C26:b::1::1:f:1:cf:2:colspan:3\ncell:D26:b::1::1:colspan:2\ncell:F26:b::1:::f:1:ntvf:1\ncell:G26:b::1:::f:1:ntvf:1\ncell:H26:vtf:t::IF(F26*G26>0,F26*G26,\"\"):b::1:::f:1:ntvf:1\ncell:I26:b::2::2:l:3:f:8\ncell:A27:b::2:::l:3:f:8\ncell:B27:b::2::2:l:3:f:8:cf:2\ncell:C27:b::1::1:f:1:cf:2:colspan:3\ncell:D27:b::1::1:colspan:2\ncell:F27:b::1:::f:1:ntvf:1\ncell:G27:b::1:::f:1:ntvf:1\ncell:H27:vtf:t::IF(F27*G27>0,F27*G27,\"\"):b::1:::f:1:ntvf:1\ncell:I27:b::2::2:l:3:f:8\ncell:A28:b::2:::l:3:f:5\ncell:B28:b::2::2:l:3:f:8:cf:2\ncell:C28:b::1:1:1:f:1:cf:2:colspan:3\ncell:D28:b::1:1:1:l:3:f:8:cf:2:colspan:2\ncell:E28:b:::2::l:3:f:8:cf:2\ncell:F28:b::1:1::f:1:ntvf:1\ncell:G28:b::1:1::f:1:ntvf:1\ncell:H28:vtf:t::IF(F28*G28>0,F28*G28,\"\"):b::1:::f:1:ntvf:1\ncell:I28:b::2::2:l:3:f:8\ncell:A29:b::2:::l:3:f:4\ncell:B29:b::2::2:l:3:f:4\ncell:C29:t:TOTAL:b:1:1:1:1:l:3:f:6:cf:2:colspan:5\ncell:D29:b:2::2::l:3:f:9:cf:2\ncell:E29:b:2:2:2::l:3:f:9:cf:2\ncell:F29:vtf:n:0:SUM(F16\\cF28):b:2:2:2::l:3:f:5:ntvf:2\ncell:G29:b:2:2:2::l:3:f:5:ntvf:2\ncell:H29:vtf:n:0:SUM(H16\\cH28):b:1:1:1::f:6:ntvf:1\ncell:I29:b::2::2:l:3:f:5\ncell:A30:b::2:::l:3:f:8\ncell:B30:b::::2:l:3:f:4:cf:2\ncell:C30:b:2::::l:1:f:8\ncell:D30:b:2::::l:1:f:8\ncell:E30:b:2::::l:1:f:8\ncell:F30:b:2::::l:1:f:8\ncell:G30:b:2::::l:1:f:8\ncell:H30:b:2::::l:1:f:8\ncell:I30:b::2:::l:3:f:4\ncell:A31:b::2:::l:3:f:8\ncell:B31:b::::2:l:3:f:8\ncell:I31:b::2:::l:3:f:8\ncell:A32:b::2:::l:3:f:8\ncell:B32:b::::2:l:3:f:8\ncell:I32:b::2:::l:3:f:8\ncell:A33:b::2:::l:3:f:8\ncell:B33:b::::2:l:3:f:8\ncell:I33:b::2:::l:3:f:8\ncell:A34:b::2:::l:3:f:8\ncell:B34:b::::2:l:3:f:8\ncell:I34:b::2:::l:3:f:8\ncell:A35:b::2:::l:3:f:8\ncell:B35:b::::2:l:3:f:8:cf:2\ncell:E35:t:Thank you for your business:f:2:colspan:4\ncell:F35:t::l:2:f:8\ncell:G35:l:2:f:8\ncell:H35:l:2:f:8\ncell:I35:b::2:::l:3:f:8\ncell:A36:b::2:::l:3:f:8\ncell:B36:b::::2:l:3:f:8\ncell:I36:b::2:::l:3:f:8\ncell:A37:b::2:::l:3:f:8\ncell:B37:b:::2:2:l:3:f:8\ncell:C37:b:::2::l:3:f:8\ncell:D37:b:::2::l:3:f:8\ncell:E37:b:::2::l:3:f:8\ncell:F37:b:::2::l:3:f:8\ncell:G37:b:::2::l:3:f:8\ncell:H37:b:::2::l:3:f:8\ncell:I37:b::2:2::l:3:f:8\ncell:B38:b:1:::\ncell:C38:b:1:::\ncell:D38:b:1:::\ncell:E38:b:1:::\ncell:F38:b:1:::\ncell:G38:b:1:::\ncell:H38:b:1:::\ncell:I38:b:1:::\ncol:A:w:26\ncol:B:w:28\ncol:C:w:96\ncol:D:w:203\ncol:E:w:51\ncol:F:w:50\ncol:G:w:58\ncol:H:w:80\ncol:I:w:28\nrow:1:h:14.25\nrow:2:h:18.75\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nsheet:c:9:r:38:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\nfont:1:* * Trebuchet MS\nfont:2:italic bold * Trebuchet MS\nfont:3:normal bold * Trebuchet MS\nfont:4:normal bold 10pt Arial\nfont:5:normal bold 12pt Arial\nfont:6:normal bold 12pt Trebuchet MS\nfont:7:normal bold 14pt Trebuchet MS\nfont:8:normal normal 10pt Arial\nfont:9:normal normal 12pt Arial\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:* * * *;vertical-align:top;\nlayout:4:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00;(#,##0.00)\nvalueformat:3:d-mmm\nvalueformat:4:m/d/yy\nvalueformat:5:text-html\n"},"name":"typeii","hidden":"0"},"sheet3":{"sheetstr":{"savestr":"version:1.5\ncell:A1:l:3\ncell:B2:t:[Company Name]:l:1:f:3:cf:2:colspan:3\ncell:C2:t::l:2:f:10\ncell:D2:t::l:2:f:10\ncell:E2:l:1:f:8:c:2:cf:3\ncell:F2:t:INVOICE:l:1:f:8:c:2:cf:2:colspan:2\ncell:G2:t::l:2:f:10\ncell:B3:t:[Company Slogan]:f:5:cf:2:colspan:3\ncell:C3:t::l:2:f:10\ncell:D3:t::l:2:f:10\ncell:B4:f:2:colspan:2\ncell:F4:tvf:4:rowspan:4\ncell:B5:t:[Street Address]:f:1:cf:2:colspan:2\ncell:F5:l:1:f:7\ncell:G5:l:1:f:11:cf:1\ncell:B6:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:G6:l:1:f:10\ncell:B7:t:Phone\\c :f:1:cf:2:colspan:2\ncell:B8:t:Email\\c:f:1:cf:2:colspan:2\ncell:B9:colspan:2\ncell:F9:t:DATE \\c:l:1:f:7:cf:2\ncell:G9:l:1:f:11:cf:2:ntvf:3\ncell:B10:t:BILL TO\\c:f:6:c:1:bg:3:cf:2:colspan:2\ncell:F10:t:INVOICE # \\c:l:1:f:7:cf:2\ncell:G10:v:1:l:1:f:11:cf:2\ncell:B11:t:[Name]:f:1:cf:2:colspan:2\ncell:B12:t:[Company Name]:f:1:cf:2:colspan:2\ncell:F12:t: \ncell:B13:t:[Street Address]:f:1:cf:2:colspan:2\ncell:B14:t:[City, State, Zip]:f:1:cf:2:colspan:2\ncell:B15:t:Phone\\c :f:1:cf:2:colspan:2\ncell:A17:b::1::\ncell:B17:t:DESCRIPTION:b:1:1:1:1:l:1:f:7:c:1:bg:3:cf:1:colspan:5:rowspan:1\ncell:C17:t::l:2:f:10\ncell:D17:t::l:2:f:10\ncell:E17:t::l:2:f:10\ncell:F17:t::l:2:f:10\ncell:G17:t:AMOUNT:b:1:1:1::l:1:f:7:c:1:bg:3:cf:1\ncell:A18:b::1::\ncell:B18:b:1:1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C18:t::l:2:f:10\ncell:D18:t::l:2:f:10\ncell:E18:t::l:2:f:10\ncell:F18:t::b::2:::l:1:f:10\ncell:G18:b::1::1:f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C19:t::l:2:f:10\ncell:D19:t::l:2:f:10\ncell:E19:t::l:2:f:10\ncell:F19:t::b::2:::l:1:f:10\ncell:G19:b::1::1:f:1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C20:t::l:2:f:10\ncell:D20:t::l:2:f:10\ncell:E20:t::l:2:f:10\ncell:F20:t::b::2:::l:1:f:10\ncell:G20:b::1::1:f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C21:t::l:2:f:10\ncell:D21:t::l:2:f:10\ncell:E21:t::l:2:f:10\ncell:F21:t::b::2:::l:1:f:10\ncell:G21:b::1::1:f:1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C22:t::l:2:f:10\ncell:D22:t::l:2:f:10\ncell:E22:t::l:2:f:10\ncell:F22:t::b::2:::l:1:f:10\ncell:G22:b::1::1:f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C23:t::l:2:f:10\ncell:D23:t::l:2:f:10\ncell:E23:t::l:2:f:10\ncell:F23:t::b::2:::l:1:f:10\ncell:G23:b::1::1:f:1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C24:t::l:2:f:10\ncell:D24:t::l:2:f:10\ncell:E24:t::l:2:f:10\ncell:F24:t::b::2:::l:1:f:10\ncell:G24:b::1::1:f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C25:t::l:2:f:10\ncell:D25:t::l:2:f:10\ncell:E25:t::l:2:f:10\ncell:F25:t::b::2:::l:1:f:10\ncell:G25:b::1::1:f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C26:t::l:2:f:10\ncell:D26:t::l:2:f:10\ncell:E26:t::l:2:f:10\ncell:F26:t::b::2:::l:1:f:10\ncell:G26:b::1::1:f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C27:t::l:2:f:10\ncell:D27:t::l:2:f:10\ncell:E27:t::l:2:f:10\ncell:F27:t::b::2:::l:1:f:10\ncell:G27:b::1::1:f:1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:cf:2:colspan:5:rowspan:1\ncell:C28:t::l:2:f:10\ncell:D28:t::l:2:f:10\ncell:E28:t::l:2:f:10\ncell:F28:t::b::2:::l:1:f:10\ncell:G28:b::1::1:f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:f:1:cf:2:colspan:5:rowspan:1\ncell:C29:t::b:::2::l:1:f:10\ncell:D29:t::b:::2::l:1:f:10\ncell:E29:t::b:::2::l:1:f:10\ncell:F29:t::b::2:2::l:1:f:10\ncell:G29:b::1:1:1:f:1:ntvf:1\ncell:B30:b:2::::l:1:f:10\ncell:C30:b:2::::l:1:f:10\ncell:D30:b:2::::l:1:f:10\ncell:E30:b:2::::l:1:f:11\ncell:F30:t:Subtotal:b:2::::l:1:f:11\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::f:9:ntvf:1\ncell:B31:t:NOTES:b:::2::l:1:f:7:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:10\ncell:D31:t::b:::2::l:1:f:10\ncell:F31:t:Tax Rate:l:1:f:1\ncell:G31:v:0:f:1:ntvf:2\ncell:B32:b:1::::f:1:cf:2:colspan:3\ncell:C32:t::b:2::::l:1:f:10\ncell:D32:t::b:2::::l:1:f:10\ncell:F32:t:Tax:l:1:f:1\ncell:G32:vtf:n:0:G31*G30:f:1:ntvf:1\ncell:B33:f:1:cf:2:colspan:3\ncell:C33:t::l:2:f:10\ncell:D33:t::l:2:f:10\ncell:F33:t:Other:b:::1::l:1:f:1\ncell:G33:v:0:b:::1::f:1:ntvf:1\ncell:B34:b:::1::f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:2:f:10\ncell:D34:t::l:2:f:10\ncell:F34:t:TOTAL:b:2::::l:1:f:7\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::::f:6:ntvf:1\ncell:B37:t:Thank you for your business:l:1:f:4:cf:1:colspan:6:rowspan:1\ncell:C37:t::l:2:f:10\ncell:D37:t::l:2:f:10\ncell:E37:t::l:2:f:10\ncell:F37:t::l:2:f:10\ncell:G37:t::l:2:f:10\ncol:A:w:40\ncol:B:w:232\ncol:C:w:53\ncol:D:w:90\ncol:E:w:54\ncol:F:w:91\ncol:G:w:99\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:37:h:15.75\nsheet:c:7:r:37:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(0,0,0)\ncolor:3:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 10pt *\nfont:3:* 16pt Trebuchet MS\nfont:4:italic bold 12pt Trebuchet MS\nfont:5:italic normal * Trebuchet MS\nfont:6:normal bold * Trebuchet MS\nfont:7:normal bold 10pt Trebuchet MS\nfont:8:normal bold 28pt Trebuchet MS\nfont:9:normal normal * Trebuchet MS\nfont:10:normal normal 10pt Arial\nfont:11:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n"},"name":"typeiii","hidden":"0"},"sheet4":{"sheetstr":{"savestr":"version:1.5\ncell:A1:l:3\ncell:B2:t:[Company Name]:l:1:f:2:cf:2:colspan:3:rowspan:1\ncell:C2:t::l:2:f:8\ncell:D2:t::l:2:f:8\ncell:F2:t:INVOICE:l:1:f:7:c:1:cf:2:colspan:2\ncell:G2:t::l:2:f:8\ncell:B3:t:[Company slogan]:f:4:cf:2:colspan:3:rowspan:1\ncell:C3:t::l:2:f:8\ncell:D3:t::l:2:f:8\ncell:B4:cf:2:colspan:3:rowspan:1\ncell:F4:tvf:4:rowspan:4\ncell:B5:t:[Street Address]:f:1:cf:2:colspan:3:rowspan:1\ncell:F5:l:1:f:6\ncell:G5:l:1:f:9:cf:1\ncell:B6:t:[City, State, Zip]:f:1:cf:2:colspan:3:rowspan:1\ncell:G6:l:1:f:8\ncell:B7:t:Phone\\c :f:1:cf:2:colspan:3:rowspan:1\ncell:B8:t:Email\\c:f:1:cf:2:colspan:3:rowspan:1\ncell:B9:cf:2:colspan:3:rowspan:1\ncell:B10:t:BILL TO\\c:l:1:f:6:bg:2:cf:2:colspan:2\ncell:F10:t:DATE\\c:l:1:f:6:cf:2\ncell:G10:l:1:f:9:cf:2:ntvf:3\ncell:B11:t:[Name]:f:1:cf:2:colspan:3:rowspan:1\ncell:F11:t:INVOICE # \\c:l:1:f:6:cf:2\ncell:G11:v:1:l:1:f:9:cf:2\ncell:B12:t:[Company Name]:f:1:cf:2:colspan:3:rowspan:1\ncell:J12:tvf:4\ncell:B13:t:[Street Address]:f:1:cf:2:colspan:3:rowspan:1\ncell:B14:t:[City, State, Zip]:f:1:cf:2:colspan:3:rowspan:1\ncell:B15:t:Phone\\c :f:1:cf:2:colspan:3:rowspan:1\ncell:B16:cf:2:colspan:3:rowspan:1\ncell:A17:b::1::\ncell:B17:t:DESCRIPTION:b:1:1:1:1:l:1:f:6:bg:2:cf:1:colspan:3:rowspan:1\ncell:C17:t::b:1::1::l:1:f:8:bg:2\ncell:D17:t::b:1::1::l:1:f:8:bg:2\ncell:E17:t:HOURS:b:1:1:1::l:1:f:6:bg:2:cf:1\ncell:F17:t:RATE:b:1:1:1::l:1:f:6:bg:2:cf:1\ncell:G17:t:AMOUNT:b:1:1:1::l:1:f:6:bg:2:cf:1\ncell:A18:b::1::\ncell:B18:b:1:1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C18:t::b:2::::l:1:f:8\ncell:D18:t::b:2:2:::l:1:f:8\ncell:E18:b:1:1::1:f:1:ntvf:1\ncell:F18:b:1:1::1:f:1:ntvf:1\ncell:G18:vtf:t::IF(E18*F18>0,E18*F18,\"\"):b:1:1:::f:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C19:t::l:2:f:8\ncell:D19:t::b::2:::l:1:f:8\ncell:E19:b::1::1:f:1:ntvf:1\ncell:F19:b::1::1:f:1:ntvf:1\ncell:G19:vtf:t::IF(E19*F19>0,E19*F19,\"\"):b::1:::f:1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C20:t::l:2:f:8\ncell:D20:t::b::2:::l:1:f:8\ncell:E20:b::1::1:f:1:ntvf:1\ncell:F20:b::1::1:f:1:ntvf:1\ncell:G20:vtf:t::IF(E20*F20>0,E20*F20,\"\"):b::1:::f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C21:t::l:2:f:8\ncell:D21:t::b::2:::l:1:f:8\ncell:E21:b::1::1:f:1:ntvf:1\ncell:F21:b::1::1:f:1:ntvf:1\ncell:G21:vtf:t::IF(E21*F21>0,E21*F21,\"\"):b::1:::f:1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C22:t::l:2:f:8\ncell:D22:t::b::2:::l:1:f:8\ncell:E22:b::1::1:f:1:ntvf:1\ncell:F22:b::1::1:f:1:ntvf:1\ncell:G22:vtf:t::IF(E22*F22>0,E22*F22,\"\"):b::1:::f:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C23:t::l:2:f:8\ncell:D23:t::b::2:::l:1:f:8\ncell:E23:b::1::1:f:1:ntvf:1\ncell:F23:b::1::1:f:1:ntvf:1\ncell:G23:vtf:t::IF(E23*F23>0,E23*F23,\"\"):b::1:::f:1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C24:t::l:2:f:8\ncell:D24:t::b::2:::l:1:f:8\ncell:E24:b::1::1:f:1:ntvf:1\ncell:F24:b::1::1:f:1:ntvf:1\ncell:G24:vtf:t::IF(E24*F24>0,E24*F24,\"\"):b::1:::f:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C25:t::l:2:f:8\ncell:D25:t::b::2:::l:1:f:8\ncell:E25:b::1::1:f:1:ntvf:1\ncell:F25:b::1::1:f:1:ntvf:1\ncell:G25:vtf:t::IF(E25*F25>0,E25*F25,\"\"):b::1:::f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C26:t::l:2:f:8\ncell:D26:t::b::2:::l:1:f:8\ncell:E26:b::1::1:f:1:ntvf:1\ncell:F26:b::1::1:f:1:ntvf:1\ncell:G26:vtf:t::IF(E26*F26>0,E26*F26,\"\"):b::1:::f:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C27:t::l:2:f:8\ncell:D27:t::b::2:::l:1:f:8\ncell:E27:b::1::1:f:1:ntvf:1\ncell:F27:b::1::1:f:1:ntvf:1\ncell:G27:vtf:t::IF(E27*F27>0,E27*F27,\"\"):b::1:::f:1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:f:1:cf:2:colspan:3:rowspan:1\ncell:C28:t::l:2:f:8\ncell:D28:t::b::2:::l:1:f:8\ncell:E28:b::1::1:f:1:ntvf:1\ncell:F28:b::1::1:f:1:ntvf:1\ncell:G28:vtf:t::IF(E28*F28>0,E28*F28,\"\"):b::1:::f:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1:1:1:f:1:cf:2:colspan:3:rowspan:1\ncell:C29:t::b:::2::l:1:f:8\ncell:D29:t::b::2:2::l:1:f:8\ncell:E29:b::1:1:1:f:1:ntvf:1\ncell:F29:b::1:1:1:f:1:ntvf:1\ncell:G29:vtf:t::IF(E29*F29>0,E29*F29,\"\"):b::1:::f:1:ntvf:1\ncell:B30:b:2::::l:1:f:9:cf:1:colspan:3:rowspan:1\ncell:C30:t::b:2::::l:1:f:8\ncell:D30:t::b:2::::l:1:f:8\ncell:E30:b:2::::l:1:f:9\ncell:F30:t:Subtotal:b:1::::f:1\ncell:G30:vtf:n:0:SUM(G18\\cG29):b:1::::f:1:ntvf:1\ncell:B31:t:NOTES:b:::2::l:1:f:6:cf:2:colspan:3:rowspan:1\ncell:C31:t::b:::2::l:1:f:8\ncell:D31:t::b:::2::l:1:f:8\ncell:F31:t:Tax Rate:f:1\ncell:G31:v:0:f:1:ntvf:2\ncell:B32:b:1::::f:1:cf:2:colspan:3:rowspan:1\ncell:C32:t::b:2::::l:1:f:8\ncell:D32:t::b:2::::l:1:f:8\ncell:F32:t:Tax:f:1\ncell:G32:vtf:n:0:G31*G30:f:1:ntvf:1\ncell:B33:f:1:cf:2:colspan:3:rowspan:1\ncell:C33:t::l:2:f:8\ncell:D33:t::l:2:f:8\ncell:F33:t:Other:b:::1::l:1:f:1\ncell:G33:v:0:b:::1::f:1:ntvf:1\ncell:B34:f:1:cf:2:colspan:3:rowspan:1\ncell:C34:t::l:2:f:8\ncell:D34:t::l:2:f:8\ncell:F34:t:TOTAL:b:1::::l:1:f:5\ncell:G34:vtf:n:0:(G30+G32)+G33:b:1::::f:5:ntvf:1\ncell:B35:b:2::::l:1:f:8\ncell:C35:b:2::::l:1:f:8\ncell:D35:b:2::::l:1:f:8\ncell:B37:t:Thank you for your business:l:1:f:3:cf:1:colspan:6:rowspan:1\ncell:C37:t::l:2:f:8\ncell:D37:t::l:2:f:8\ncell:E37:t::l:2:f:8\ncell:F37:t::l:2:f:8\ncell:G37:t::l:2:f:8\ncol:A:w:40\ncol:B:w:194\ncol:C:w:128\ncol:D:w:60\ncol:E:w:65\ncol:F:w:95\ncol:G:w:90\nrow:1:h:34.5\nrow:2:h:34.5\nrow:3:h:14.25\nrow:4:h:14.25\nrow:5:h:14.25\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:37:h:15.75\nsheet:c:10:r:37:h:12.75:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\nborder:2:thin solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncolor:1:rgb(0,0,0)\ncolor:2:rgb(221, 221, 221)\nfont:1:* * Trebuchet MS\nfont:2:* 16pt Trebuchet MS\nfont:3:italic bold 12pt Trebuchet MS\nfont:4:italic normal * Trebuchet MS\nfont:5:normal bold * Trebuchet MS\nfont:6:normal bold 10pt Trebuchet MS\nfont:7:normal bold 28pt Trebuchet MS\nfont:8:normal normal 10pt Arial\nfont:9:normal normal 10pt Trebuchet MS\nlayout:1:padding:* * * *;vertical-align:bottom;\nlayout:2:padding:* * * *;vertical-align:middle;\nlayout:3:padding:36px * 28px *;vertical-align:*;\nvalueformat:1:#,##0.00\nvalueformat:2:#,##0.00%\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n"},"name":"typeiv","hidden":"0"}},"EditableCells":{"allow":true,"cells":{"typei!C10":true,"typei!B2":true,"typei!C11":true,"typei!C12":true,"typei!C13":true,"typei!D9":true,"typei!D4":true,"typei!D6":true,"typei!E10":true,"typei!E11":true,"typei!E12":true,"typei!E13":true,"typei!F9":true,"typei!C16":true,"typei!C17":true,"typei!C18":true,"typei!C19":true,"typei!C20":true,"typei!C21":true,"typei!C22":true,"typei!C23":true,"typei!C24":true,"typei!C25":true,"typei!C26":true,"typei!C27":true,"typei!C28":true,"typei!F16":true,"typei!F17":true,"typei!F18":true,"typei!F19":true,"typei!F20":true,"typei!F21":true,"typei!F22":true,"typei!F23":true,"typei!F24":true,"typei!F25":true,"typei!F26":true,"typei!F27":true,"typei!F28":true,"typei!E35":true,"typeii!B2":true,"typeii!D4":true,"typeii!C10":true,"typeii!C11":true,"typeii!C12":true,"typeii!C13":true,"typeii!D9":true,"typeii!E10":true,"typeii!E11":true,"typeii!E12":true,"typeii!E13":true,"typeii!F9":true,"typeii!C16":true,"typeii!C17":true,"typeii!C18":true,"typeii!C19":true,"typeii!C20":true,"typeii!C21":true,"typeii!C22":true,"typeii!C23":true,"typeii!C24":true,"typeii!C25":true,"typeii!C26":true,"typeii!C27":true,"typeii!C28":true,"typeii!F16":true,"typeii!F17":true,"typeii!F18":true,"typeii!F19":true,"typeii!F20":true,"typeii!F21":true,"typeii!F22":true,"typeii!F23":true,"typeii!F24":true,"typeii!F25":true,"typeii!F26":true,"typeii!F27":true,"typeii!F28":true,"typeii!G16":true,"typeii!G17":true,"typeii!G18":true,"typeii!G19":true,"typeii!G20":true,"typeii!G21":true,"typeii!G22":true,"typeii!G23":true,"typeii!G24":true,"typeii!G25":true,"typeii!G26":true,"typeii!G27":true,"typeii!G28":true,"typeii!E35":true,"typeiii!G9":true,"typeiii!G10":true,"typeiii!B2":true,"typeiii!B3":true,"typeiii!B4":true,"typeiii!B5":true,"typeiii!B6":true,"typeiii!B7":true,"typeiii!B8":true,"typeiii!B9":true,"typeiii!B11":true,"typeiii!B12":true,"typeiii!B13":true,"typeiii!B14":true,"typeiii!B15":true,"typeiii!B18":true,"typeiii!B19":true,"typeiii!B20":true,"typeiii!B21":true,"typeiii!B22":true,"typeiii!B23":true,"typeiii!B24":true,"typeiii!B25":true,"typeiii!B26":true,"typeiii!B27":true,"typeiii!B28":true,"typeiii!B29":true,"typeiii!G18":true,"typeiii!G19":true,"typeiii!G20":true,"typeiii!G21":true,"typeiii!G22":true,"typeiii!G23":true,"typeiii!G24":true,"typeiii!G25":true,"typeiii!G26":true,"typeiii!G27":true,"typeiii!G28":true,"typeiii!G29":true,"typeiii!B32":true,"typeiii!B33":true,"typeiii!B34":true,"typeiii!G31":true,"typeiii!G33":true,"typeiii!B37":true,"typeiv!G9":true,"typeiv!G10":true,"typeiv!B2":true,"typeiv!B3":true,"typeiv!B4":true,"typeiv!B5":true,"typeiv!B6":true,"typeiv!B7":true,"typeiv!B8":true,"typeiv!B11":true,"typeiv!B12":true,"typeiv!B13":true,"typeiv!B14":true,"typeiv!B15":true,"typeiv!B16":true,"typeiv!B18":true,"typeiv!B19":true,"typeiv!B20":true,"typeiv!B21":true,"typeiv!B22":true,"typeiv!B23":true,"typeiv!B24":true,"typeiv!B25":true,"typeiv!B26":true,"typeiv!B27":true,"typeiv!B28":true,"typeiv!B29":true,"typeiv!E18":true,"typeiv!E19":true,"typeiv!E20":true,"typeiv!E21":true,"typeiv!E22":true,"typeiv!E23":true,"typeiv!E24":true,"typeiv!E25":true,"typeiv!E26":true,"typeiv!E27":true,"typeiv!E28":true,"typeiv!E29":true,"typeiv!F18":true,"typeiv!F19":true,"typeiv!F2":true,"typeiv!F20":true,"typeiv!F21":true,"typeiv!F22":true,"typeiv!F23":true,"typeiv!F24":true,"typeiv!F25":true,"typeiv!F26":true,"typeiv!F27":true,"typeiv!F28":true,"typeiv!F29":true,"typeiv!B32":true,"typeiv!B33":true,"typeiv!B34":true,"typeiv!G31":true,"typeiv!G33":true,"typeiv!B37":true,"typeii!F15":true,"typeii!G15":true,"typeiv!E17":true,"typeiv!F17":true,"typeii!D6":true,"typeiv!G11":true,"typei!C4":true,"typeii!C4":true,"typeiii!F10":true,"typeiv!F11":true,"typeiv!F10":true,"typeiii!F9":true,"typeii!C6":true,"typei!C6":true,"typei!F4":true,"typeii!F4":true,"typeiii!F4":true,"typeiii!F2":true,"typeiv!F4":true},"constraints":{}}} \ No newline at end of file diff --git a/Website/excelinterop/tmp/job-application-form.xls b/Website/excelinterop/tmp/job-application-form.xls deleted file mode 100644 index 20337a2..0000000 Binary files a/Website/excelinterop/tmp/job-application-form.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/meeting-sign-in-sheet.xls b/Website/excelinterop/tmp/meeting-sign-in-sheet.xls deleted file mode 100644 index 22e597b..0000000 Binary files a/Website/excelinterop/tmp/meeting-sign-in-sheet.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/money-manager-for-kids-1.xls b/Website/excelinterop/tmp/money-manager-for-kids-1.xls deleted file mode 100644 index d7e2b3a..0000000 Binary files a/Website/excelinterop/tmp/money-manager-for-kids-1.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/mortgage-payment-calculator.xls b/Website/excelinterop/tmp/mortgage-payment-calculator.xls deleted file mode 100644 index e69de29..0000000 diff --git a/Website/excelinterop/tmp/net worth.msc b/Website/excelinterop/tmp/net worth.msc deleted file mode 100644 index 6bb1864..0000000 --- a/Website/excelinterop/tmp/net worth.msc +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":4,"currentid":"sheet1","currentname":"summary","sheetArr":{"sheet1":{"sheetstr":{"savestr":"version:1.5\ncell:B4:t:Net Worth:l:1:f:2:c:1:bg:2:cf:2:colspan:2\ncell:D4:vtf:n:13500:D16-D29:b:1:1:1:1:f:1:ntvf:1:colspan:2\ncell:G4:t:Date:cf:1:ntvf:3\ncell:H4:vtf:ndt:40824.380267465276:NETWORTH1!D2:ntvf:3\ncell:B5:l:1:f:2:c:1:bg:2:cf:2:colspan:2\ncell:D5:b:1::::ntvf:2:colspan:2\ncell:G5:cf:1:ntvf:3\ncell:H5:ntvf:3\ncell:B6:l:1:f:2:c:1:bg:2:cf:2:colspan:2\ncell:D6:ntvf:2:colspan:2\ncell:G6:cf:1:ntvf:3\ncell:H6:ntvf:3\ncell:B7:l:1:f:2:c:1:bg:2:cf:2\ncell:D7:colspan:2\ncell:E7:b:1:::\ncell:B8:t:Assets:l:1:f:2:c:1:bg:2:cf:2:colspan:3\ncell:F8:t:\\n
    \\n\\n\\n:tvf:4:colspan:4:rowspan:10\ncell:A9:b::1::\ncell:B9:t:Source:b:1:::1:c:2:bg:4:colspan:2\ncell:C9:b:1::::bg:4\ncell:D9:t:Amount:b:1:1:::c:2:bg:4:cf:3\ncell:A10:b::1::\ncell:B10:vtf:t:Cash & Equivalents:NETWORTH1!B9:b::::1:colspan:2\ncell:D10:vtf:n:6000:NETWORTH1!D9:b::1:::ntvf:1\ncell:A11:b::1::\ncell:B11:vtf:t:Investments:NETWORTH1!B16:b::::1:colspan:2\ncell:D11:vtf:n:2000:NETWORTH1!D16:b::1:::ntvf:1\ncell:A12:b::1::\ncell:B12:vtf:t:Retirement:NETWORTH1!B21:b::::1:colspan:2\ncell:D12:vtf:n:6000:NETWORTH1!D21:b::1:::ntvf:1\ncell:A13:b::1::\ncell:B13:vtf:t:Real Estate:NETWORTH1!B25:b::::1:colspan:2\ncell:D13:vtf:n:20000:NETWORTH1!D25:b::1:::ntvf:1\ncell:A14:b::1::\ncell:B14:vtf:t:Vehicles:NETWORTH1!B29:b::::1:colspan:2\ncell:D14:vtf:n:14000:NETWORTH1!D29:b::1:::ntvf:1\ncell:A15:b::1::\ncell:B15:vtf:t:Other Assets:NETWORTH1!B32:b::::1:colspan:2\ncell:D15:vtf:n:1500:NETWORTH1!D32:b::1:::ntvf:1\ncell:A16:b::1::\ncell:B16:t:Total Assets:b:1::1:1:f:1:colspan:2\ncell:C16:b:1::1:\ncell:D16:vtf:n:49500:NETWORTH1!D39:b:1:1:1::ntvf:1\ncell:B17:b:1:::\ncell:C17:b:1:::\ncell:D17:b:1:::\ncell:B24:t:Liabilities:l:1:f:2:c:1:bg:2:cf:2:colspan:3\ncell:F24:t:
    \\n\\n\\n:tvf:4:colspan:3:rowspan:11\ncell:A25:b::1::\ncell:B25:t:Source:b:1:::1:c:2:bg:3:colspan:2\ncell:C25:b:1::::bg:3\ncell:D25:t:Amount:b:1:1:::c:2:bg:3:cf:3\ncell:A26:b::1::\ncell:B26:vtf:t:Loans:LIABS!B9:b::::1:colspan:2\ncell:D26:vtf:n:34000:LIABS!D9:b::1:::ntvf:1\ncell:A27:b::1::\ncell:B27:vtf:t:Credit Card Balances:LIABS!B20:b::::1:colspan:2\ncell:D27:vtf:n:1000:LIABS!D20:b::1:::ntvf:1\ncell:A28:b::1::\ncell:B28:vtf:t:Other Debt:LIABS!B25:b::::1:colspan:2\ncell:D28:vtf:n:1000:LIABS!D25:b::1:::ntvf:1\ncell:A29:b::1::\ncell:B29:t:Total Liabilities:b:1::1:1:f:1:colspan:2\ncell:C29:b:1::1:\ncell:D29:vtf:n:36000:LIABS!D32:b:1:1:1::ntvf:1\ncell:B30:b:1:::\ncell:C30:b:1:::\ncell:D30:b:1:::\ncol:A:w:56\ncol:B:w:80\ncol:D:w:113\ncol:E:w:36\ncol:F:w:116\ncol:G:w:99\nsheet:c:8:r:30\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(255, 255, 255)\ncolor:3:rgb(255,3,13)\ncolor:4:rgb(33,108,42)\nfont:1:normal bold * *\nfont:2:normal bold 14pt Arial\nlayout:1:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:#,##0.00\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n"},"name":"summary","hidden":"0"},"sheet2":{"sheetstr":{"savestr":"version:1.5\ncell:B2:colspan:2\ncell:D2:vtf:ndt:40824.380267465276:NOW():ntvf:2\ncell:B3:t:Total Assets:f:2:cf:2:colspan:2\ncell:D3:vtf:n:49500:D39:b:1:1:1:1:f:1:ntvf:1\ncell:B5:t:Assets:f:2:cf:1:colspan:3\ncell:C5:f:3:colspan:2\ncell:A7:b::1::\ncell:B7:t:Source:b:1:::1:f:1:c:1:bg:2:colspan:2\ncell:C7:b:1:::1:f:1:c:1:bg:2\ncell:D7:t:Amount:b:1:1:::c:1:bg:2:cf:3\ncell:E7:b::::1\ncell:A8:b::1::\ncell:B8:b::::1:bg:1:colspan:2\ncell:C8:b::::1:bg:1\ncell:D8:b::1:::bg:1:ntvf:1\ncell:E8:b::::1\ncell:A9:b::1::\ncell:B9:t:Cash & Equivalents:b::::1:f:1:bg:1:colspan:2\ncell:C9:b::::1\ncell:D9:vtf:n:6000:SUM(D10\\cD15):b::1:::f:1:bg:1:ntvf:1\ncell:E9:b::::1\ncell:A10:b::1::\ncell:B10:b::::1\ncell:C10:t:Checking Accounts\ncell:D10:v:4000:b::1:::bg:1:ntvf:1\ncell:E10:b::::1\ncell:A11:b::1::\ncell:B11:b::::1\ncell:C11:t:Savings Accounts\ncell:D11:v:2000:b::1:::bg:1:ntvf:1\ncell:E11:b::::1\ncell:A12:b::1::\ncell:B12:b::::1\ncell:C12:t:CDs\ncell:D12:b::1:::bg:1:ntvf:1\ncell:E12:b::::1\ncell:A13:b::1::\ncell:B13:b::::1\ncell:C13:t:Annuities\ncell:D13:b::1:::bg:1:ntvf:1\ncell:E13:b::::1\ncell:A14:b::1::\ncell:B14:b::::1\ncell:C14:t:Life Insurance\ncell:D14:b::1:::bg:1:ntvf:1\ncell:E14:b::::1\ncell:A15:b::1::\ncell:B15:b::::1\ncell:C15:t:Other\ncell:D15:b::1:::bg:1:ntvf:1\ncell:E15:b::::1\ncell:A16:b::1::\ncell:B16:t:Investments:b::::1:f:1:bg:1:colspan:2\ncell:C16:b::::1\ncell:D16:vtf:n:2000:SUM(D17\\cD20):b::1:::f:1:bg:1:ntvf:1\ncell:E16:b::::1\ncell:A17:b::1::\ncell:B17:b::::1\ncell:C17:t:Brokerage Account 1\ncell:D17:v:2000:b::1:::bg:1:ntvf:1\ncell:E17:b::::1\ncell:A18:b::1::\ncell:B18:b::::1\ncell:C18:t:Brokerage Account 2\ncell:D18:b::1:::bg:1:ntvf:1\ncell:E18:b::::1\ncell:A19:b::1::\ncell:B19:b::::1\ncell:C19:t:Brokerage Account 3\ncell:D19:b::1:::bg:1:ntvf:1\ncell:E19:b::::1\ncell:A20:b::1::\ncell:B20:b::::1\ncell:C20:t:Other\ncell:D20:b::1:::bg:1:ntvf:1\ncell:E20:b::::1\ncell:A21:b::1::\ncell:B21:t:Retirement:b::::1:f:1:bg:1:colspan:2\ncell:C21:b::::1\ncell:D21:vtf:n:6000:SUM(D22\\cD24):b::1:::f:1:bg:1:ntvf:1\ncell:E21:b::::1\ncell:A22:b::1::\ncell:B22:b::::1\ncell:C22:t:401-K\ncell:D22:v:6000:b::1:::bg:1:ntvf:1\ncell:E22:b::::1\ncell:A23:b::1::\ncell:B23:b::::1\ncell:C23:t:IRA\ncell:D23:b::1:::bg:1:ntvf:1\ncell:E23:b::::1\ncell:A24:b::1::\ncell:B24:b::::1\ncell:C24:t:Other\ncell:D24:b::1:::bg:1:ntvf:1\ncell:E24:b::::1\ncell:A25:b::1::\ncell:B25:t:Real Estate:b::::1:f:1:bg:1:colspan:2\ncell:C25:b::::1\ncell:D25:vtf:n:20000:SUM(D26\\cD28):b::1:::f:1:bg:1:ntvf:1\ncell:E25:b::::1\ncell:A26:b::1::\ncell:B26:b::::1\ncell:C26:t:Home\ncell:D26:v:20000:b::1:::bg:1:ntvf:1\ncell:E26:b::::1\ncell:A27:b::1::\ncell:B27:b::::1\ncell:C27:t:Other Property\ncell:D27:b::1:::bg:1:ntvf:1\ncell:E27:b::::1\ncell:A28:b::1::\ncell:B28:b::::1\ncell:C28:t:Other\ncell:D28:b::1:::bg:1:ntvf:1\ncell:E28:b::::1\ncell:A29:b::1::\ncell:B29:t:Vehicles:b::::1:f:1:bg:1:colspan:2\ncell:D29:vtf:n:14000:SUM(D30\\cD31):b::1:::f:1:bg:1:ntvf:1\ncell:E29:b::::1\ncell:A30:b::1::\ncell:B30:b::::1:f:1\ncell:C30:t:Cars\ncell:D30:v:14000:b::1:::bg:1:ntvf:1\ncell:E30:b::::1\ncell:A31:b::1::\ncell:B31:b::::1:f:1\ncell:C31:t:Other\ncell:D31:b::1:::bg:1:ntvf:1\ncell:E31:b::::1\ncell:A32:b::1::\ncell:B32:t:Other Assets:b::::1:f:1:bg:1:colspan:2\ncell:C32:b::::1\ncell:D32:vtf:n:1500:SUM(D33\\cD38):b::1:::f:1:bg:1:ntvf:1\ncell:E32:b::::1\ncell:A33:b::1::\ncell:B33:b::::1\ncell:C33:t:Precious Metals\ncell:D33:b::1:::bg:1:ntvf:1\ncell:E33:b::::1\ncell:A34:b::1::\ncell:B34:b::::1\ncell:C34:t:Jewelry & Art\ncell:D34:b::1:::bg:1:ntvf:1\ncell:E34:b::::1\ncell:A35:b::1::\ncell:B35:b::::1\ncell:C35:t:Furnishings/Appliances\ncell:D35:v:500:b::1:::bg:1:ntvf:1\ncell:E35:b::::1\ncell:A36:b::1::\ncell:B36:b::::1\ncell:C36:t:Electronics\ncell:D36:v:1000:b::1:::bg:1:ntvf:1\ncell:E36:b::::1\ncell:A37:b::1::\ncell:B37:b::::1\ncell:C37:t:Business Interest\ncell:D37:b::1:::bg:1:ntvf:1\ncell:E37:b::::1\ncell:A38:b::1::\ncell:B38:b:::1:1\ncell:C38:t:Other:b:::1:\ncell:D38:b::1:::bg:1:ntvf:1\ncell:E38:b::::1\ncell:A39:b::1::\ncell:B39:t:Total Assets:b:1::1:1:f:1:bg:1:colspan:2\ncell:C39:b:1::1:1:f:1:bg:1\ncell:D39:vtf:n:49500:D9+D16+D21+D25+D29+D32:b:1:1:1::f:1:bg:1:ntvf:1\ncell:E39:b::::1\ncell:B40:b:1:::\ncell:C40:b:1:::\ncell:D40:b:1:::\ncol:A:w:130\ncol:B:w:30\ncol:C:w:250\ncol:D:w:115\ncol:E:w:30\ncol:F:w:30\ncol:G:w:175\nsheet:c:7:r:40:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(255, 255, 255)\ncolor:2:rgb(33,108,42)\nfont:1:normal bold * *\nfont:2:normal bold 12pt *\nfont:3:normal bold 18pt *\nvalueformat:1:#,##0\nvalueformat:2:m/d/yy\n"},"name":"networth1","hidden":"0"},"sheet3":{"sheetstr":{"savestr":"version:1.5\ncell:D2:vtf:ndt:40824.38027322917:NOW():ntvf:2\ncell:B3:t:Total Liabilities:f:2:colspan:2\ncell:D3:vtf:n:36000:D32:b:1:1:1:1:f:1:ntvf:1\ncell:B5:t:Liabilities:f:2:cf:1:colspan:3\ncell:C5:f:3:cf:1:colspan:2\ncell:D5:cf:1\ncell:A7:b::1::\ncell:B7:t:Source:b:1:::1:f:1:c:1:bg:2:colspan:2\ncell:C7:b:1:::1:f:1:c:1:bg:2\ncell:D7:t:Amount:b:1:1:::c:1:bg:2:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:bg:1:colspan:2\ncell:C8:b::::1:bg:1\ncell:D8:b::1:::bg:1:ntvf:1\ncell:A9:b::1::\ncell:B9:t:Loans:b::::1:f:1:colspan:2\ncell:C9:b::::1\ncell:D9:vtf:n:34000:SUM(D10\\cD19):b::1:::f:1:ntvf:1\ncell:A10:b::1::\ncell:B10:b::::1\ncell:C10:t:Mortgage\ncell:D10:v:10000:b::1:::ntvf:1\ncell:A11:b::1::\ncell:B11:b::::1\ncell:C11:t:Home Equity\ncell:D11:v:2000:b::1:::ntvf:1\ncell:A12:b::1::\ncell:B12:b::::1\ncell:C12:t:Vehicle Loan\ncell:D12:v:12000:b::1:::ntvf:1\ncell:A13:b::1::\ncell:B13:b::::1:f:1\ncell:C13:t:Student Loan\ncell:D13:v:10000:b::1:::ntvf:1\ncell:A14:b::1::\ncell:B14:b::::1:f:1\ncell:C14:t:Consumer Loan\ncell:D14:b::1:::ntvf:1\ncell:A15:b::1::\ncell:B15:b::::1\ncell:C15:t:Money Owed\ncell:D15:b::1:::ntvf:1\ncell:A16:b::1::\ncell:B16:b::::1\ncell:C16:t:401K Loan\ncell:D16:b::1:::ntvf:1\ncell:A17:b::1::\ncell:B17:b::::1\ncell:C17:t:Other Loan\ncell:D17:b::1:::ntvf:1\ncell:A18:b::1::\ncell:B18:b::::1\ncell:C18:t:Other\ncell:D18:b::1:::ntvf:1\ncell:A19:b::1::\ncell:B19:b::::1\ncell:C19:t:Other\ncell:D19:b::1:::ntvf:1\ncell:A20:b::1::\ncell:B20:t:Credit Card Balances:b::::1:f:1:colspan:2\ncell:C20:b::::1\ncell:D20:vtf:n:1000:SUM(D21\\cD24):b::1:::f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::::1\ncell:C21:t:Credit Card 1\ncell:D21:v:1000:b::1:::ntvf:1\ncell:A22:b::1::\ncell:B22:b::::1\ncell:C22:t:Credit Card 2\ncell:D22:b::1:::ntvf:1\ncell:A23:b::1::\ncell:B23:b::::1\ncell:C23:t:Credit Card 3\ncell:D23:b::1:::ntvf:1\ncell:A24:b::1::\ncell:B24:b::::1\ncell:C24:t:Other\ncell:D24:b::1:::ntvf:1\ncell:A25:b::1::\ncell:B25:t:Other Debt:b::::1:f:1:colspan:2\ncell:C25:b::::1\ncell:D25:vtf:n:1000:SUM(D26\\cD31):b::1:::f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::::1\ncell:C26:t:Unpaid Taxes\ncell:D26:v:1000:b::1:::ntvf:1\ncell:A27:b::1::\ncell:B27:b::::1\ncell:C27:t:Other Outstanding Debt\ncell:D27:b::1:::ntvf:1\ncell:A28:b::1::\ncell:B28:b::::1\ncell:C28:t:Other\ncell:D28:b::1:::ntvf:1\ncell:A29:b::1::\ncell:B29:b::::1\ncell:C29:t:Other\ncell:D29:b::1:::ntvf:1\ncell:A30:b::1::\ncell:B30:b::::1\ncell:C30:t:Other\ncell:D30:b::1:::ntvf:1\ncell:A31:b::1::\ncell:B31:b::::1\ncell:C31:t:Other:b:::1:\ncell:D31:b::1:::ntvf:1\ncell:A32:b::1::\ncell:B32:t:Total Liabilities:b:1::1:1:f:1:colspan:2\ncell:C32:b:1:1:1:\ncell:D32:vtf:n:36000:D9+D20+D25:b:1:1:1::f:1:ntvf:1\ncell:B33:b:1:::\ncell:C33:b:1:::\ncell:D33:b:1:::\ncol:A:w:130\ncol:B:w:30\ncol:C:w:250\ncol:D:w:115\ncol:E:w:33\nsheet:c:5:r:33:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:right\ncolor:1:rgb(255, 255, 255)\ncolor:2:rgb(255,3,13)\nfont:1:normal bold * *\nfont:2:normal bold 12pt *\nfont:3:normal bold 18pt *\nvalueformat:1:#,##0\nvalueformat:2:m/d/yy\n"},"name":"liabs","hidden":"0"},"sheet4":{"sheetstr":{"savestr":"version:1.5\ncell:B4:t:Net Worth Growth:l:1:f:1:c:1:bg:3:cf:1:colspan:3\ncell:B6:bg:2\ncell:C6:bg:2\ncell:D6:bg:2\ncell:E6:bg:2\ncell:F6:bg:2\ncell:B7:bg:2\ncell:C7:t:Current Net Worth:bg:3:colspan:2\ncell:D7:bg:3\ncell:E7:vtf:n:13500:NETWORTH1!D3-LIABS!D3:bg:3:ntvf:1\ncell:F7:bg:2\ncell:B8:bg:2\ncell:C8:t:Savings Per Year:bg:3:colspan:2\ncell:D8:bg:3\ncell:E8:v:2000:b:1:1:1:1:bg:3:ntvf:1\ncell:F8:bg:2\ncell:A9:vtf:n:0.06:E9*0.01:tvf:2:ntvf:2\ncell:B9:bg:2\ncell:C9:t:Compound Growth Rate (%):bg:3:colspan:2\ncell:D9:bg:3\ncell:E9:v:6:b:1:1:1:1:bg:3\ncell:F9:bg:2\ncell:B10:bg:2\ncell:C10:bg:3\ncell:D10:bg:3\ncell:E10:bg:3\ncell:F10:bg:2\ncell:B11:bg:2\ncell:C11:t:Net Worth after 5 Years:bg:3:colspan:2\ncell:D11:bg:3\ncell:E11:vtf:n:29340.231217600012:E7*POWER((1+A9),5)+E8*IF(A9=0,5,(((POWER((1+A9),5))-1)/A9)):bg:3:ntvf:1\ncell:F11:bg:2\ncell:B12:bg:2\ncell:C12:t:Net Worth after 10 Years:bg:3:colspan:2\ncell:D12:bg:3\ncell:E12:vtf:n:50538.03378809035:E7*POWER((1+A9),10)+E8*IF(A9=0,10,(((POWER((1+A9),10))-1)/A9)):bg:3:ntvf:1\ncell:F12:bg:2\ncell:B13:bg:2\ncell:C13:t:Net Worth after 20 Years:bg:3:colspan:2\ncell:D13:bg:3\ncell:E13:vtf:n:116867.51128196839:E7*POWER((1+A9),20)+E8*IF(A9=0,20,(((POWER((1+A9),20))-1)/A9)):bg:3:ntvf:1\ncell:F13:bg:2\ncell:B14:bg:2\ncell:C14:bg:2\ncell:D14:bg:2\ncell:E14:bg:2\ncell:F14:bg:2\ncell:B18:t:
    \\n\\n\\n:tvf:3:colspan:7:rowspan:12\ncol:A:w:23\ncol:B:w:20\ncol:C:w:101\ncol:D:w:105\ncol:F:w:20\ncol:G:w:16\nsheet:c:7:r:18\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:left\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal bold 14pt Arial\nlayout:1:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:text-html\n"},"name":"growth","hidden":"0"}},"EditableCells":{"allow":true,"cells":{"networth1!C10":true,"networth1!C11":true,"networth1!C12":true,"networth1!C13":true,"networth1!C14":true,"networth1!C15":true,"networth1!D10":true,"networth1!D11":true,"networth1!D12":true,"networth1!D13":true,"networth1!D14":true,"networth1!D15":true,"networth1!C17":true,"networth1!C18":true,"networth1!C19":true,"networth1!C20":true,"networth1!D17":true,"networth1!D18":true,"networth1!D19":true,"networth1!D20":true,"networth1!C22":true,"networth1!C23":true,"networth1!C24":true,"networth1!D22":true,"networth1!D23":true,"networth1!D24":true,"networth1!C26":true,"networth1!C27":true,"networth1!C28":true,"networth1!D26":true,"networth1!D27":true,"networth1!D28":true,"networth1!C30":true,"networth1!C31":true,"networth1!D30":true,"networth1!D31":true,"networth1!C33":true,"networth1!C34":true,"networth1!C35":true,"networth1!C36":true,"networth1!C37":true,"networth1!C38":true,"networth1!D33":true,"networth1!D34":true,"networth1!D35":true,"networth1!D36":true,"networth1!D37":true,"networth1!D38":true,"liabs!C10":true,"liabs!C11":true,"liabs!C12":true,"liabs!C13":true,"liabs!C14":true,"liabs!C15":true,"liabs!C16":true,"liabs!C17":true,"liabs!C18":true,"liabs!C19":true,"liabs!D10":true,"liabs!D11":true,"liabs!D12":true,"liabs!D13":true,"liabs!D14":true,"liabs!D15":true,"liabs!D16":true,"liabs!D17":true,"liabs!D18":true,"liabs!D19":true,"liabs!C21":true,"liabs!C22":true,"liabs!C23":true,"liabs!C24":true,"liabs!D21":true,"liabs!D22":true,"liabs!D23":true,"liabs!D24":true,"liabs!C26":true,"liabs!C27":true,"liabs!C28":true,"liabs!C29":true,"liabs!C30":true,"liabs!C31":true,"liabs!D26":true,"liabs!D27":true,"liabs!D28":true,"liabs!D29":true,"liabs!D30":true,"liabs!D31":true,"growth!E8":true,"growth!E9":true},"constraints":{}}} diff --git a/Website/excelinterop/tmp/net-worth-calculator.xls b/Website/excelinterop/tmp/net-worth-calculator.xls deleted file mode 100644 index b8944c1..0000000 Binary files a/Website/excelinterop/tmp/net-worth-calculator.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/networth.msc b/Website/excelinterop/tmp/networth.msc deleted file mode 100644 index 6bb1864..0000000 --- a/Website/excelinterop/tmp/networth.msc +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":4,"currentid":"sheet1","currentname":"summary","sheetArr":{"sheet1":{"sheetstr":{"savestr":"version:1.5\ncell:B4:t:Net Worth:l:1:f:2:c:1:bg:2:cf:2:colspan:2\ncell:D4:vtf:n:13500:D16-D29:b:1:1:1:1:f:1:ntvf:1:colspan:2\ncell:G4:t:Date:cf:1:ntvf:3\ncell:H4:vtf:ndt:40824.380267465276:NETWORTH1!D2:ntvf:3\ncell:B5:l:1:f:2:c:1:bg:2:cf:2:colspan:2\ncell:D5:b:1::::ntvf:2:colspan:2\ncell:G5:cf:1:ntvf:3\ncell:H5:ntvf:3\ncell:B6:l:1:f:2:c:1:bg:2:cf:2:colspan:2\ncell:D6:ntvf:2:colspan:2\ncell:G6:cf:1:ntvf:3\ncell:H6:ntvf:3\ncell:B7:l:1:f:2:c:1:bg:2:cf:2\ncell:D7:colspan:2\ncell:E7:b:1:::\ncell:B8:t:Assets:l:1:f:2:c:1:bg:2:cf:2:colspan:3\ncell:F8:t:\\n
    \\n\\n\\n:tvf:4:colspan:4:rowspan:10\ncell:A9:b::1::\ncell:B9:t:Source:b:1:::1:c:2:bg:4:colspan:2\ncell:C9:b:1::::bg:4\ncell:D9:t:Amount:b:1:1:::c:2:bg:4:cf:3\ncell:A10:b::1::\ncell:B10:vtf:t:Cash & Equivalents:NETWORTH1!B9:b::::1:colspan:2\ncell:D10:vtf:n:6000:NETWORTH1!D9:b::1:::ntvf:1\ncell:A11:b::1::\ncell:B11:vtf:t:Investments:NETWORTH1!B16:b::::1:colspan:2\ncell:D11:vtf:n:2000:NETWORTH1!D16:b::1:::ntvf:1\ncell:A12:b::1::\ncell:B12:vtf:t:Retirement:NETWORTH1!B21:b::::1:colspan:2\ncell:D12:vtf:n:6000:NETWORTH1!D21:b::1:::ntvf:1\ncell:A13:b::1::\ncell:B13:vtf:t:Real Estate:NETWORTH1!B25:b::::1:colspan:2\ncell:D13:vtf:n:20000:NETWORTH1!D25:b::1:::ntvf:1\ncell:A14:b::1::\ncell:B14:vtf:t:Vehicles:NETWORTH1!B29:b::::1:colspan:2\ncell:D14:vtf:n:14000:NETWORTH1!D29:b::1:::ntvf:1\ncell:A15:b::1::\ncell:B15:vtf:t:Other Assets:NETWORTH1!B32:b::::1:colspan:2\ncell:D15:vtf:n:1500:NETWORTH1!D32:b::1:::ntvf:1\ncell:A16:b::1::\ncell:B16:t:Total Assets:b:1::1:1:f:1:colspan:2\ncell:C16:b:1::1:\ncell:D16:vtf:n:49500:NETWORTH1!D39:b:1:1:1::ntvf:1\ncell:B17:b:1:::\ncell:C17:b:1:::\ncell:D17:b:1:::\ncell:B24:t:Liabilities:l:1:f:2:c:1:bg:2:cf:2:colspan:3\ncell:F24:t:
    \\n\\n\\n:tvf:4:colspan:3:rowspan:11\ncell:A25:b::1::\ncell:B25:t:Source:b:1:::1:c:2:bg:3:colspan:2\ncell:C25:b:1::::bg:3\ncell:D25:t:Amount:b:1:1:::c:2:bg:3:cf:3\ncell:A26:b::1::\ncell:B26:vtf:t:Loans:LIABS!B9:b::::1:colspan:2\ncell:D26:vtf:n:34000:LIABS!D9:b::1:::ntvf:1\ncell:A27:b::1::\ncell:B27:vtf:t:Credit Card Balances:LIABS!B20:b::::1:colspan:2\ncell:D27:vtf:n:1000:LIABS!D20:b::1:::ntvf:1\ncell:A28:b::1::\ncell:B28:vtf:t:Other Debt:LIABS!B25:b::::1:colspan:2\ncell:D28:vtf:n:1000:LIABS!D25:b::1:::ntvf:1\ncell:A29:b::1::\ncell:B29:t:Total Liabilities:b:1::1:1:f:1:colspan:2\ncell:C29:b:1::1:\ncell:D29:vtf:n:36000:LIABS!D32:b:1:1:1::ntvf:1\ncell:B30:b:1:::\ncell:C30:b:1:::\ncell:D30:b:1:::\ncol:A:w:56\ncol:B:w:80\ncol:D:w:113\ncol:E:w:36\ncol:F:w:116\ncol:G:w:99\nsheet:c:8:r:30\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(255, 255, 255)\ncolor:3:rgb(255,3,13)\ncolor:4:rgb(33,108,42)\nfont:1:normal bold * *\nfont:2:normal bold 14pt Arial\nlayout:1:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:#,##0.00\nvalueformat:3:m/d/yy\nvalueformat:4:text-html\n"},"name":"summary","hidden":"0"},"sheet2":{"sheetstr":{"savestr":"version:1.5\ncell:B2:colspan:2\ncell:D2:vtf:ndt:40824.380267465276:NOW():ntvf:2\ncell:B3:t:Total Assets:f:2:cf:2:colspan:2\ncell:D3:vtf:n:49500:D39:b:1:1:1:1:f:1:ntvf:1\ncell:B5:t:Assets:f:2:cf:1:colspan:3\ncell:C5:f:3:colspan:2\ncell:A7:b::1::\ncell:B7:t:Source:b:1:::1:f:1:c:1:bg:2:colspan:2\ncell:C7:b:1:::1:f:1:c:1:bg:2\ncell:D7:t:Amount:b:1:1:::c:1:bg:2:cf:3\ncell:E7:b::::1\ncell:A8:b::1::\ncell:B8:b::::1:bg:1:colspan:2\ncell:C8:b::::1:bg:1\ncell:D8:b::1:::bg:1:ntvf:1\ncell:E8:b::::1\ncell:A9:b::1::\ncell:B9:t:Cash & Equivalents:b::::1:f:1:bg:1:colspan:2\ncell:C9:b::::1\ncell:D9:vtf:n:6000:SUM(D10\\cD15):b::1:::f:1:bg:1:ntvf:1\ncell:E9:b::::1\ncell:A10:b::1::\ncell:B10:b::::1\ncell:C10:t:Checking Accounts\ncell:D10:v:4000:b::1:::bg:1:ntvf:1\ncell:E10:b::::1\ncell:A11:b::1::\ncell:B11:b::::1\ncell:C11:t:Savings Accounts\ncell:D11:v:2000:b::1:::bg:1:ntvf:1\ncell:E11:b::::1\ncell:A12:b::1::\ncell:B12:b::::1\ncell:C12:t:CDs\ncell:D12:b::1:::bg:1:ntvf:1\ncell:E12:b::::1\ncell:A13:b::1::\ncell:B13:b::::1\ncell:C13:t:Annuities\ncell:D13:b::1:::bg:1:ntvf:1\ncell:E13:b::::1\ncell:A14:b::1::\ncell:B14:b::::1\ncell:C14:t:Life Insurance\ncell:D14:b::1:::bg:1:ntvf:1\ncell:E14:b::::1\ncell:A15:b::1::\ncell:B15:b::::1\ncell:C15:t:Other\ncell:D15:b::1:::bg:1:ntvf:1\ncell:E15:b::::1\ncell:A16:b::1::\ncell:B16:t:Investments:b::::1:f:1:bg:1:colspan:2\ncell:C16:b::::1\ncell:D16:vtf:n:2000:SUM(D17\\cD20):b::1:::f:1:bg:1:ntvf:1\ncell:E16:b::::1\ncell:A17:b::1::\ncell:B17:b::::1\ncell:C17:t:Brokerage Account 1\ncell:D17:v:2000:b::1:::bg:1:ntvf:1\ncell:E17:b::::1\ncell:A18:b::1::\ncell:B18:b::::1\ncell:C18:t:Brokerage Account 2\ncell:D18:b::1:::bg:1:ntvf:1\ncell:E18:b::::1\ncell:A19:b::1::\ncell:B19:b::::1\ncell:C19:t:Brokerage Account 3\ncell:D19:b::1:::bg:1:ntvf:1\ncell:E19:b::::1\ncell:A20:b::1::\ncell:B20:b::::1\ncell:C20:t:Other\ncell:D20:b::1:::bg:1:ntvf:1\ncell:E20:b::::1\ncell:A21:b::1::\ncell:B21:t:Retirement:b::::1:f:1:bg:1:colspan:2\ncell:C21:b::::1\ncell:D21:vtf:n:6000:SUM(D22\\cD24):b::1:::f:1:bg:1:ntvf:1\ncell:E21:b::::1\ncell:A22:b::1::\ncell:B22:b::::1\ncell:C22:t:401-K\ncell:D22:v:6000:b::1:::bg:1:ntvf:1\ncell:E22:b::::1\ncell:A23:b::1::\ncell:B23:b::::1\ncell:C23:t:IRA\ncell:D23:b::1:::bg:1:ntvf:1\ncell:E23:b::::1\ncell:A24:b::1::\ncell:B24:b::::1\ncell:C24:t:Other\ncell:D24:b::1:::bg:1:ntvf:1\ncell:E24:b::::1\ncell:A25:b::1::\ncell:B25:t:Real Estate:b::::1:f:1:bg:1:colspan:2\ncell:C25:b::::1\ncell:D25:vtf:n:20000:SUM(D26\\cD28):b::1:::f:1:bg:1:ntvf:1\ncell:E25:b::::1\ncell:A26:b::1::\ncell:B26:b::::1\ncell:C26:t:Home\ncell:D26:v:20000:b::1:::bg:1:ntvf:1\ncell:E26:b::::1\ncell:A27:b::1::\ncell:B27:b::::1\ncell:C27:t:Other Property\ncell:D27:b::1:::bg:1:ntvf:1\ncell:E27:b::::1\ncell:A28:b::1::\ncell:B28:b::::1\ncell:C28:t:Other\ncell:D28:b::1:::bg:1:ntvf:1\ncell:E28:b::::1\ncell:A29:b::1::\ncell:B29:t:Vehicles:b::::1:f:1:bg:1:colspan:2\ncell:D29:vtf:n:14000:SUM(D30\\cD31):b::1:::f:1:bg:1:ntvf:1\ncell:E29:b::::1\ncell:A30:b::1::\ncell:B30:b::::1:f:1\ncell:C30:t:Cars\ncell:D30:v:14000:b::1:::bg:1:ntvf:1\ncell:E30:b::::1\ncell:A31:b::1::\ncell:B31:b::::1:f:1\ncell:C31:t:Other\ncell:D31:b::1:::bg:1:ntvf:1\ncell:E31:b::::1\ncell:A32:b::1::\ncell:B32:t:Other Assets:b::::1:f:1:bg:1:colspan:2\ncell:C32:b::::1\ncell:D32:vtf:n:1500:SUM(D33\\cD38):b::1:::f:1:bg:1:ntvf:1\ncell:E32:b::::1\ncell:A33:b::1::\ncell:B33:b::::1\ncell:C33:t:Precious Metals\ncell:D33:b::1:::bg:1:ntvf:1\ncell:E33:b::::1\ncell:A34:b::1::\ncell:B34:b::::1\ncell:C34:t:Jewelry & Art\ncell:D34:b::1:::bg:1:ntvf:1\ncell:E34:b::::1\ncell:A35:b::1::\ncell:B35:b::::1\ncell:C35:t:Furnishings/Appliances\ncell:D35:v:500:b::1:::bg:1:ntvf:1\ncell:E35:b::::1\ncell:A36:b::1::\ncell:B36:b::::1\ncell:C36:t:Electronics\ncell:D36:v:1000:b::1:::bg:1:ntvf:1\ncell:E36:b::::1\ncell:A37:b::1::\ncell:B37:b::::1\ncell:C37:t:Business Interest\ncell:D37:b::1:::bg:1:ntvf:1\ncell:E37:b::::1\ncell:A38:b::1::\ncell:B38:b:::1:1\ncell:C38:t:Other:b:::1:\ncell:D38:b::1:::bg:1:ntvf:1\ncell:E38:b::::1\ncell:A39:b::1::\ncell:B39:t:Total Assets:b:1::1:1:f:1:bg:1:colspan:2\ncell:C39:b:1::1:1:f:1:bg:1\ncell:D39:vtf:n:49500:D9+D16+D21+D25+D29+D32:b:1:1:1::f:1:bg:1:ntvf:1\ncell:E39:b::::1\ncell:B40:b:1:::\ncell:C40:b:1:::\ncell:D40:b:1:::\ncol:A:w:130\ncol:B:w:30\ncol:C:w:250\ncol:D:w:115\ncol:E:w:30\ncol:F:w:30\ncol:G:w:175\nsheet:c:7:r:40:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:left\ncellformat:3:right\ncolor:1:rgb(255, 255, 255)\ncolor:2:rgb(33,108,42)\nfont:1:normal bold * *\nfont:2:normal bold 12pt *\nfont:3:normal bold 18pt *\nvalueformat:1:#,##0\nvalueformat:2:m/d/yy\n"},"name":"networth1","hidden":"0"},"sheet3":{"sheetstr":{"savestr":"version:1.5\ncell:D2:vtf:ndt:40824.38027322917:NOW():ntvf:2\ncell:B3:t:Total Liabilities:f:2:colspan:2\ncell:D3:vtf:n:36000:D32:b:1:1:1:1:f:1:ntvf:1\ncell:B5:t:Liabilities:f:2:cf:1:colspan:3\ncell:C5:f:3:cf:1:colspan:2\ncell:D5:cf:1\ncell:A7:b::1::\ncell:B7:t:Source:b:1:::1:f:1:c:1:bg:2:colspan:2\ncell:C7:b:1:::1:f:1:c:1:bg:2\ncell:D7:t:Amount:b:1:1:::c:1:bg:2:cf:2\ncell:A8:b::1::\ncell:B8:b::::1:bg:1:colspan:2\ncell:C8:b::::1:bg:1\ncell:D8:b::1:::bg:1:ntvf:1\ncell:A9:b::1::\ncell:B9:t:Loans:b::::1:f:1:colspan:2\ncell:C9:b::::1\ncell:D9:vtf:n:34000:SUM(D10\\cD19):b::1:::f:1:ntvf:1\ncell:A10:b::1::\ncell:B10:b::::1\ncell:C10:t:Mortgage\ncell:D10:v:10000:b::1:::ntvf:1\ncell:A11:b::1::\ncell:B11:b::::1\ncell:C11:t:Home Equity\ncell:D11:v:2000:b::1:::ntvf:1\ncell:A12:b::1::\ncell:B12:b::::1\ncell:C12:t:Vehicle Loan\ncell:D12:v:12000:b::1:::ntvf:1\ncell:A13:b::1::\ncell:B13:b::::1:f:1\ncell:C13:t:Student Loan\ncell:D13:v:10000:b::1:::ntvf:1\ncell:A14:b::1::\ncell:B14:b::::1:f:1\ncell:C14:t:Consumer Loan\ncell:D14:b::1:::ntvf:1\ncell:A15:b::1::\ncell:B15:b::::1\ncell:C15:t:Money Owed\ncell:D15:b::1:::ntvf:1\ncell:A16:b::1::\ncell:B16:b::::1\ncell:C16:t:401K Loan\ncell:D16:b::1:::ntvf:1\ncell:A17:b::1::\ncell:B17:b::::1\ncell:C17:t:Other Loan\ncell:D17:b::1:::ntvf:1\ncell:A18:b::1::\ncell:B18:b::::1\ncell:C18:t:Other\ncell:D18:b::1:::ntvf:1\ncell:A19:b::1::\ncell:B19:b::::1\ncell:C19:t:Other\ncell:D19:b::1:::ntvf:1\ncell:A20:b::1::\ncell:B20:t:Credit Card Balances:b::::1:f:1:colspan:2\ncell:C20:b::::1\ncell:D20:vtf:n:1000:SUM(D21\\cD24):b::1:::f:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::::1\ncell:C21:t:Credit Card 1\ncell:D21:v:1000:b::1:::ntvf:1\ncell:A22:b::1::\ncell:B22:b::::1\ncell:C22:t:Credit Card 2\ncell:D22:b::1:::ntvf:1\ncell:A23:b::1::\ncell:B23:b::::1\ncell:C23:t:Credit Card 3\ncell:D23:b::1:::ntvf:1\ncell:A24:b::1::\ncell:B24:b::::1\ncell:C24:t:Other\ncell:D24:b::1:::ntvf:1\ncell:A25:b::1::\ncell:B25:t:Other Debt:b::::1:f:1:colspan:2\ncell:C25:b::::1\ncell:D25:vtf:n:1000:SUM(D26\\cD31):b::1:::f:1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::::1\ncell:C26:t:Unpaid Taxes\ncell:D26:v:1000:b::1:::ntvf:1\ncell:A27:b::1::\ncell:B27:b::::1\ncell:C27:t:Other Outstanding Debt\ncell:D27:b::1:::ntvf:1\ncell:A28:b::1::\ncell:B28:b::::1\ncell:C28:t:Other\ncell:D28:b::1:::ntvf:1\ncell:A29:b::1::\ncell:B29:b::::1\ncell:C29:t:Other\ncell:D29:b::1:::ntvf:1\ncell:A30:b::1::\ncell:B30:b::::1\ncell:C30:t:Other\ncell:D30:b::1:::ntvf:1\ncell:A31:b::1::\ncell:B31:b::::1\ncell:C31:t:Other:b:::1:\ncell:D31:b::1:::ntvf:1\ncell:A32:b::1::\ncell:B32:t:Total Liabilities:b:1::1:1:f:1:colspan:2\ncell:C32:b:1:1:1:\ncell:D32:vtf:n:36000:D9+D20+D25:b:1:1:1::f:1:ntvf:1\ncell:B33:b:1:::\ncell:C33:b:1:::\ncell:D33:b:1:::\ncol:A:w:130\ncol:B:w:30\ncol:C:w:250\ncol:D:w:115\ncol:E:w:33\nsheet:c:5:r:33:needsrecalc:yes\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncellformat:2:right\ncolor:1:rgb(255, 255, 255)\ncolor:2:rgb(255,3,13)\nfont:1:normal bold * *\nfont:2:normal bold 12pt *\nfont:3:normal bold 18pt *\nvalueformat:1:#,##0\nvalueformat:2:m/d/yy\n"},"name":"liabs","hidden":"0"},"sheet4":{"sheetstr":{"savestr":"version:1.5\ncell:B4:t:Net Worth Growth:l:1:f:1:c:1:bg:3:cf:1:colspan:3\ncell:B6:bg:2\ncell:C6:bg:2\ncell:D6:bg:2\ncell:E6:bg:2\ncell:F6:bg:2\ncell:B7:bg:2\ncell:C7:t:Current Net Worth:bg:3:colspan:2\ncell:D7:bg:3\ncell:E7:vtf:n:13500:NETWORTH1!D3-LIABS!D3:bg:3:ntvf:1\ncell:F7:bg:2\ncell:B8:bg:2\ncell:C8:t:Savings Per Year:bg:3:colspan:2\ncell:D8:bg:3\ncell:E8:v:2000:b:1:1:1:1:bg:3:ntvf:1\ncell:F8:bg:2\ncell:A9:vtf:n:0.06:E9*0.01:tvf:2:ntvf:2\ncell:B9:bg:2\ncell:C9:t:Compound Growth Rate (%):bg:3:colspan:2\ncell:D9:bg:3\ncell:E9:v:6:b:1:1:1:1:bg:3\ncell:F9:bg:2\ncell:B10:bg:2\ncell:C10:bg:3\ncell:D10:bg:3\ncell:E10:bg:3\ncell:F10:bg:2\ncell:B11:bg:2\ncell:C11:t:Net Worth after 5 Years:bg:3:colspan:2\ncell:D11:bg:3\ncell:E11:vtf:n:29340.231217600012:E7*POWER((1+A9),5)+E8*IF(A9=0,5,(((POWER((1+A9),5))-1)/A9)):bg:3:ntvf:1\ncell:F11:bg:2\ncell:B12:bg:2\ncell:C12:t:Net Worth after 10 Years:bg:3:colspan:2\ncell:D12:bg:3\ncell:E12:vtf:n:50538.03378809035:E7*POWER((1+A9),10)+E8*IF(A9=0,10,(((POWER((1+A9),10))-1)/A9)):bg:3:ntvf:1\ncell:F12:bg:2\ncell:B13:bg:2\ncell:C13:t:Net Worth after 20 Years:bg:3:colspan:2\ncell:D13:bg:3\ncell:E13:vtf:n:116867.51128196839:E7*POWER((1+A9),20)+E8*IF(A9=0,20,(((POWER((1+A9),20))-1)/A9)):bg:3:ntvf:1\ncell:F13:bg:2\ncell:B14:bg:2\ncell:C14:bg:2\ncell:D14:bg:2\ncell:E14:bg:2\ncell:F14:bg:2\ncell:B18:t:
    \\n\\n\\n:tvf:3:colspan:7:rowspan:12\ncol:A:w:23\ncol:B:w:20\ncol:C:w:101\ncol:D:w:105\ncol:F:w:20\ncol:G:w:16\nsheet:c:7:r:18\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:left\ncolor:1:rgb(0, 0, 0)\ncolor:2:rgb(230,230,250)\ncolor:3:rgb(255, 255, 255)\nfont:1:normal bold 14pt Arial\nlayout:1:padding:* * * *;vertical-align:middle;\nvalueformat:1:#,##0\nvalueformat:2:hidden\nvalueformat:3:text-html\n"},"name":"growth","hidden":"0"}},"EditableCells":{"allow":true,"cells":{"networth1!C10":true,"networth1!C11":true,"networth1!C12":true,"networth1!C13":true,"networth1!C14":true,"networth1!C15":true,"networth1!D10":true,"networth1!D11":true,"networth1!D12":true,"networth1!D13":true,"networth1!D14":true,"networth1!D15":true,"networth1!C17":true,"networth1!C18":true,"networth1!C19":true,"networth1!C20":true,"networth1!D17":true,"networth1!D18":true,"networth1!D19":true,"networth1!D20":true,"networth1!C22":true,"networth1!C23":true,"networth1!C24":true,"networth1!D22":true,"networth1!D23":true,"networth1!D24":true,"networth1!C26":true,"networth1!C27":true,"networth1!C28":true,"networth1!D26":true,"networth1!D27":true,"networth1!D28":true,"networth1!C30":true,"networth1!C31":true,"networth1!D30":true,"networth1!D31":true,"networth1!C33":true,"networth1!C34":true,"networth1!C35":true,"networth1!C36":true,"networth1!C37":true,"networth1!C38":true,"networth1!D33":true,"networth1!D34":true,"networth1!D35":true,"networth1!D36":true,"networth1!D37":true,"networth1!D38":true,"liabs!C10":true,"liabs!C11":true,"liabs!C12":true,"liabs!C13":true,"liabs!C14":true,"liabs!C15":true,"liabs!C16":true,"liabs!C17":true,"liabs!C18":true,"liabs!C19":true,"liabs!D10":true,"liabs!D11":true,"liabs!D12":true,"liabs!D13":true,"liabs!D14":true,"liabs!D15":true,"liabs!D16":true,"liabs!D17":true,"liabs!D18":true,"liabs!D19":true,"liabs!C21":true,"liabs!C22":true,"liabs!C23":true,"liabs!C24":true,"liabs!D21":true,"liabs!D22":true,"liabs!D23":true,"liabs!D24":true,"liabs!C26":true,"liabs!C27":true,"liabs!C28":true,"liabs!C29":true,"liabs!C30":true,"liabs!C31":true,"liabs!D26":true,"liabs!D27":true,"liabs!D28":true,"liabs!D29":true,"liabs!D30":true,"liabs!D31":true,"growth!E8":true,"growth!E9":true},"constraints":{}}} diff --git a/Website/excelinterop/tmp/packing-slip.xls b/Website/excelinterop/tmp/packing-slip.xls deleted file mode 100644 index 5440193..0000000 Binary files a/Website/excelinterop/tmp/packing-slip.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/patient-sign-in-sheet.xls b/Website/excelinterop/tmp/patient-sign-in-sheet.xls deleted file mode 100644 index 8be442d..0000000 Binary files a/Website/excelinterop/tmp/patient-sign-in-sheet.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/paycheck-calculator.xls b/Website/excelinterop/tmp/paycheck-calculator.xls deleted file mode 100644 index b0e83af..0000000 Binary files a/Website/excelinterop/tmp/paycheck-calculator.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/payroll1.xls b/Website/excelinterop/tmp/payroll1.xls deleted file mode 100644 index 3596722..0000000 Binary files a/Website/excelinterop/tmp/payroll1.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/per.csv b/Website/excelinterop/tmp/per.csv deleted file mode 100644 index 58a9d93..0000000 --- a/Website/excelinterop/tmp/per.csv +++ /dev/null @@ -1,113 +0,0 @@ -,,,,,,,,,,,,,Periodic Table of the Elements,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,HIDE BACKGROUND COLOR? -,,"GROUP 1 -IA",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"18 -VIIIA",,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,No -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -Period,1,1,,1.00794,,,,,,,,,,,,,,,,,Atomic Number,1,,1.00794,,,,†Atomic Weight,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,4.002602,,,,, -,,H,,,2S1/2,,,,,,,,,,,,,,,,Symbol,H,,,2S1/2,,,†Ground-State Level,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,He,,,1S0,,,, -,,,,,2.2,,,,,,,,,,,,,,,,,,,,2.2,,,*Electronegativity (Pauling),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,,,, -,,Hydrogen,,,,,,,,,,,,,,,,,,,Name,Hydrogen,,,,,,,,,,,,,,,,,,,,,,,,Free Downloads at Vertex42.com,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Helium,,,,,,,FALSE -,,0.0899,,,13.5984,,,"2 -IIA",,,,,,,,,,,,,*Density [Note],0.0899,,,13.5984,,,†Ionization Energy (eV),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"13 -IIIA",,,,,,"14 -IVA",,,,,,"15 -VA",,,,,,"16 -VIA",,,,,,"17 -VIIA",,,,,,0.1785,,,24.5874,,,, -,,-259.14,,,-252.87,,,,,,,,,,,,,,,,*Melting Point (°C),-259.14,,,-252.87,,,*Boiling Point (°C),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,,,-268.93,,,, -,,(v) 37,,, - ,,,,,,,,,,,,,,,,Atomic radius (pm)[Note],(v) 37,,,FCC,,,Crystal Structure [Note],,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(v) 32,,, - ,,,, -,,1s1,,,,,,,,,,,,,,,,,,,,1s1,,,,,,†Electron Configuration,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1s2,,,,,,, -,,"+1,-1",,,,,,,,,,,,,,,,,,,,"+1,-1",,,,,,Possible Oxidation States [Note],,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,,,, -,2,3,,6.941,,,,4,,9.012182,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,,10.811,,,,6,,12.0107,,,,7,,14.0067,,,,8,,15.9994,,,,9,,18.9984032,,,,10,,20.1797,,,,, -,,Li,,,2S1/2,,,Be,,,1S0,,,,,,Phase at STP,,,,,,,,,,,,,,,,†Common Constants,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Source: physics.nist.gov,,,B,,,2P°1/2,,,C,,,3P0,,,N,,,4S°3/2,,,O,,,3P2,,,F,,,2P°3/2,,,Ne,,,1S0,,,, -,,,,,0.98,,,,,,1.57,,,,,,Gas,,,Liquid,,,,Solid,,,Synthetic,,,,,,Absolute Zero,,,,,,,,,,,,-273.15 °C,,,,,,,Gravitation Constant,,,,,,,,,G,,,6.67428x10-11 m3 kg-1 s-2,,,,,,,,,,,,,2.04,,,,,,2.55,,,,,,3.04,,,,,,3.44,,,,,,3.98,,,,,,-,,,, -,,Lithium,,,,,,Beryllium,,,,,,,,,,,,,,,,,,,,,,,,,Atomic Mass Unit,,,,,,,,,mu,,,1.660539x10-27 kg,,,,,,,Molar Gas Constant,,,,,,,,,R,,,8.314472 J mol-1 K-1,,,,,,,,,,Boron,,,,,,Carbon,,,,,,Nitrogen,,,,,,Oxygen,,,,,,Fluorine,,,,,,Neon,,,,,,, -,,0.535,,,5.3917,,,1.848,,,9.3227,,,,,,Categories,,,,,,,,,,,,,,,,Avogadro Constant,,,,,,,,,,,,6.022142x1023 mol-1,,,,,,,Molar Volume (Ideal Gas),,,,,,,,,,,,0.02241410 m3/mol,,,,,,,,,,2.46,,,8.2980,,,2.26,,,11.2603,,,1.251,,,14.5341,,,1.429,,,13.6181,,,1.696,,,17.4228,,,0.9,,,21.5645,,,, -,,180.54,,,1342,,,1287,,,2470,,,,,,Alkali Metals,,,,,,Noble Gas,,,,,,,,,,Base of Natural Logarithms,,,,,,,,,e,,,2.718281828,,,,,,,PI,,,,,,,,,p,,,3.14159265358979,,,,,,,,,,2075,,,4000,,,3550,,,4027,,,-210.1,,,-195.79,,,-218.3,,,-182.9,,,-219.6,,,-188.12,,,-248.59,,,-246.08,,,, -,,(m) 152,,,BCC,,,(m) 112,,,HCP,,,,,,,,,,,,,,,,,,,,,,Boltzmann constant,,,,,,,,,k,,,1.380650x10-23 J/K,,,,,,,Planck Constant,,,,,,,,,h,,,6.626069x10-34 J s,,,,,,,,,,(v) 82,,,rhom.,,,(v) 77,,,hex,,,(v) 75,,, - ,,,(v) 73,,, - ,,,(v) 71,,, - ,,,(v) 69,,, - ,,,, -,,[He] 2s1,,,,,,[He] 2s2,,,,,,,,,Alkaline Earth Metals,,,,,,Halogens,,,,,,,,,,Electron Mass,,,,,,,,,me,,,9.10938215x10-31 kg,,,,,,,Proton-Electron Mass Ratio,,,,,,,,,me/mp,,,1836.15267247,,,,,,,,,,[He] 2s2 2p1,,,,,,[He] 2s2 2p2,,,,,,[He] 2s2 2p3,,,,,,[He] 2s2 2p4,,,,,,[He] 2s2 2p5,,,,,,[He] 2s2 2p6,,,,,,, -,,+1,,,,,,+2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mec2,,,0.5110 MeV,,,,,,,Rydberg Constant,,,,,,,,,R∞,,,10 973 732 m-1,,,,,,,,,,+3,,,,,,"+2,4,-4",,,,,,"+2,3,4,5,-2,-3",,,,,,-2,,,,,,-1,,,,,,0,,,,,,, -,3,11,,22.989770,,,,12,,24.3050,,,,,,,Transition Metals,,,,,,Non Metals,,,,,,,,,,Electron Radius (Classical),,,,,,,,,r0,,,2.8179403x10-15 m,,,,,,,,,,,,,,,,R∞c,,,3.289842x1015 Hz,,,,,,,,,,13,,26.981538,,,,14,,28.0855,,,,15,,30.97361,,,,16,,32.065,,,,17,,35.453,,,,18,,39.948,,,,, -,,Na,,,2S1/2,,,Mg,,,1S0,,,,,,,,,,,,,,,,,,,,,,Electron Volt,,,,,,,,,eV,,,1.602176x10-19 J,,,,,,,,,,,,,,,,R∞hc,,,13.6057 eV,,,,,,,,,,Al,,,2P°1/2,,,Si,,,3P0,,,P,,,4S°3/2,,,S,,,3P2,,,Cl,,,2P°3/2,,,Ar,,,1S0,,,, -,,,,,0.93,,,,,,1.31,,,,,,Rare Earth Metals,,,,,,,,,,,,,,,,Elementry Charge,,,,,,,,,e,,,1.602176x10-19 C,,,,,,,Second Radiation Constant,,,,,,,,,ch/k,,,0.01438769 m K,,,,,,,,,,,,,1.61,,,,,,1.90,,,,,,2.19,,,,,,2.58,,,,,,3.16,,,,,,-,,,, -,,Sodium,,,,,,Magnesium,,,,,,,,,,,,,,,,,,,,,,,,,Faraday Constant,,,,,,,,,F,,,96 485.3399 C/mol,,,,,,,Speed of Light in a Vacuum,,,,,,,,,c,,,299 792 458 m/s,,,,,,,,,,Aluminum,,,,,,Silicon,,,,,,Phosphorus,,,,,,Sulfur,,,,,,Chlorine,,,,,,Argon,,,,,,, -,,0.968,,,5.1391,,,1.738,,,7.6462,,,,,,Poor Metals,,,,,,Metalloids,,,,,,,,,,fine-structure constant,,,,,,,,,a,,,0.0072973525,,,,,,,Speed of sound in air at STP,,,,,,,,,,,,343.2 m/s,,,,,,,,,,2.7,,,5.9858,,,2.33,,,8.1517,,,1.823,,,10.4867,,,1.96,,,10.3600,,,3.214,,,12.9676,,,1.784,,,15.7596,,,, -,,97.72,,,883,,,650,,,1090,,,[42],,,,,,,,,,,,,,,,,,,First Radiation Constant,,,,,,,,,2phc2,,,3.7417749x10-16 W m2,,,,,,,Standard Pressure,,,,,,,,,,,,101 325 Pa,,,,,,,,,{42},660.32,,,2519,,,1414,,,2900,,,44.2,,,280.5,,,115.21,,,444.72,,,-101.5,,,-34.04,,,-189.3,,,-185.8,,,, -,,(m) 186,,,BCC,,,(m) 160,,,HCP,,,"3 -IIIB",,,,,,"4 -IVB",,,,,,"5 -VB",,,,,,"6 -VIB",,,,,,"7 -VIIB",,,,,,"8 -VIII",,,,,,"9 -VIII",,,,,,"10 -VIII",,,,,,"11 -IB",,,,,,"12 -IIB",,,,,,(m) 143,,,FCC,,,(v) 111,,,cubic,,,(v) 106,,,§,,,(v) 102,,,FCO,,,(v) 99,,, - ,,,(v) 97,,, - ,,,, -,,[Ne] 3s1,,,,,,[Ne] 3s2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,[Ne] 3s2 3p1,,,,,,[Ne] 3s2 3p2,,,,,,[Ne] 3s2 3p3,,,,,,[Ne] 3s2 3p4,,,,,,[Ne] 3s2 3p5,,,,,,[Ne] 3s2 3p6,,,,,,, -,,+1,,,,,,+2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+3,,,,,,"+2,4,-4",,,,,,"+3,4,5,-3",,,,,,"+2,4,6,-2",,,,,,"+1,3,5,7,-1",,,,,,0,,,,,,, -,4,19,,39.0983,,,,20,,40.078,,,,21,,44.955910,,,,22,,47.867,,,,23,,50.9415,,,,24,,51.9961,,,,25,,54.938049,,,,26,,55.845,,,,27,,58.933200,,,,28,,58.6934,,,,29,,63.546,,,,30,,65.409,,,,31,,69.723,,,,32,,72.64,,,,33,,74.92160,,,,34,,78.96,,,,35,,79.904,,,,36,,83.798,,,,, -,,K,,,2S1/2,,,Ca,,,1S0,,,Sc,,,2D3/2,,,Ti,,,3F2,,,V,,,4F3/2,,,Cr,,,7S3,,,Mn,,,6S5/2,,,Fe,,,5D4,,,Co,,,4F9/2,,,Ni,,,3F4,,,Cu,,,2S1/2,,,Zn,,,1S0,,,Ga,,,2P°1/2,,,Ge,,,3P0,,,As,,,4S°3/2,,,Se,,,3P2,,,Br,,,2P°3/2,,,Kr,,,1S0,,,, -,,,,,0.82,,,,,,1.00,,,,,,1.36,,,,,,1.54,,,,,,1.63,,,,,,1.66,,,,,,1.55,,,,,,1.83,,,,,,1.88,,,,,,1.91,,,,,,1.90,,,,,,1.65,,,,,,1.81,,,,,,2.01,,,,,,2.18,,,,,,2.55,,,,,,2.96,,,,,,3,,,, -,,Potassium,,,,,,Calcium,,,,,,Scandium,,,,,,Titanium,,,,,,Vanadium,,,,,,Chromium,,,,,,Manganese,,,,,,Iron,,,,,,Cobalt,,,,,,Nickel,,,,,,Copper,,,,,,Zinc,,,,,,Gallium,,,,,,Germanium,,,,,,Arsenic,,,,,,Selenium,,,,,,Bromine,,,,,,Krypton,,,,,,, -,,0.856,,,4.3407,,,1.55,,,6.1132,,,2.985,,,6.5615,,,4.507,,,6.8281,,,6.11,,,6.7462,,,7.14,,,6.7665,,,7.47,,,7.4340,,,7.874,,,7.9024,,,8.9,,,7.8810,,,8.908,,,7.6398,,,8.92,,,7.7264,,,7.14,,,9.3942,,,5.904,,,5.9993,,,5.323,,,7.8994,,,5.727,,,9.7886,,,4.819,,,9.7524,,,3.12,,,11.8138,,,3.75,,,13.9996,,,, -,,63.38,,,759,,,842,,,1484,,,1541,,,2830,,,1668,,,3287,,,1910,,,3407,,,1907,,,2671,,,1246,,,2061,,,1538,,,2861,,,1495,,,2927,,,1455,,,2913,,,1084.62,,,2927,,,419.53,,,907,,,29.76,,,2204,,,938.3,,,2820,,,817,,,614,,,221,,,685,,,-7.3,,,59,,,-157.36,,,-153.22,,,, -,,(m) 227,,,BCC,,,(m) 197,,,FCC,,,(m) 162,,,HCP,,,(m) 147,,,HCP,,,(m) 134,,,BCC,,,(m) 128,,,BCC,,,(m) 127,,,§cubic,,,(m) 126,,,BCC,,,(m) 125,,,HCP,,,(m) 124,,,FCC,,,(m) 128,,,FCC,,,(m) 134,,,§hex,,,(m) 135,,,§BCO,,,(v) 122,,,§cubic,,,(v) 119,,,rhom.,,,(v) 116,,,§hex,,,(v) 114,,,BCO,,,(v) 110,,, - ,,,, -,,[Ar] 4s1,,,,,,[Ar] 4s2,,,,,,[Ar] 3d1 4s2,,,,,,[Ar] 3d2 4s2,,,,,,[Ar] 3d3 4s2,,,,,,[Ar] 3d5 4s1,,,,,,[Ar] 3d5 4s2,,,,,,[Ar] 3d6 4s2,,,,,,[Ar] 3d7 4s2,,,,,,[Ar] 3d8 4s2,,,,,,[Ar] 3d10 4s1,,,,,,[Ar] 3d10 4s2,,,,,,[Ar] 3d10 4s2 4p1,,,,,,[Ar] 3d10 4s2 4p2,,,,,,[Ar] 3d10 4s2 4p3,,,,,,[Ar] 3d10 4s2 4p4,,,,,,[Ar] 3d10 4s2 4p5,,,,,,[Ar] 3d10 4s2 4p6,,,,,,, -,,+1,,,,,,+2,,,,,,+3,,,,,,"+2,3,4",,,,,,"+2,3,4,5",,,,,,"+2,3,6",,,,,,"+2,3,4,6,7",,,,,,"+2,3",,,,,,"+2,3",,,,,,"+2,3",,,,,,"+1,2",,,,,,+2,,,,,,+3,,,,,,"+2,4",,,,,,"+3,5,-3",,,,,,"+2,4,6,-2",,,,,,"+1,5,-1",,,,,,0,,,,,,, -,5,37,,85.4678,,,,38,,87.62,,,,39,,88.90585,,,,40,,91.224,,,,41,,92.90638,,,,42,,95.94,,,,43,,(98),,,,44,,101.07,,,,45,,102.90550,,,,46,,106.42,,,,47,,107.8682,,,,48,,112.411,,,,49,,114.818,,,,50,,118.710,,,,51,,121.760,,,,52,,127.60,,,,53,,126.90447,,,,54,,131.293,,,,, -,,Rb,,,2S1/2,,,Sr,,,1S0,,,Y,,,2D3/2,,,Zr,,,3F2,,,Nb,,,6D1/2,,,Mo,,,7S3,,,Tc,,,6S5/2,,,Ru,,,5F5,,,Rh,,,4F9/2,,,Pd,,,1S0,,,Ag,,,2S1/2,,,Cd,,,1S0,,,In,,,2P°1/2,,,Sn,,,3P0,,,Sb,,,4S°3/2,,,Te,,,3P2,,,I,,,2P°3/2,,,Xe,,,1S0,,,, -,,,,,0.82,,,,,,0.95,,,,,,1.22,,,,,,1.33,,,,,,1.60,,,,,,2.16,,,,,,1.9,,,,,,2.20,,,,,,2.28,,,,,,2.20,,,,,,1.93,,,,,,1.69,,,,,,1.78,,,,,,1.96,,,,,,2.05,,,,,,2.10,,,,,,2.66,,,,,,2.60,,,, -,,Rubidium,,,,,,Strontium,,,,,,Yttrium,,,,,,Zirconium,,,,,,Niobium,,,,,,Molybdenum,,,,,,Technetium,,,,,,Ruthenium,,,,,,Rhodium,,,,,,Palladium,,,,,,Silver,,,,,,Cadmium,,,,,,Indium,,,,,,Tin,,,,,,Antimony,,,,,,Tellurium,,,,,,Iodine,,,,,,Xenon,,,,,,, -,,1.532,,,4.1771,,,2.63,,,5.6949,,,4.472,,,6.2173,,,6.511,,,6.6339,,,8.57,,,6.7589,,,10.28,,,7.0924,,,11.5,,,7.28,,,12.37,,,7.3605,,,12.45,,,7.4589,,,12.023,,,8.3369,,,10.49,,,7.5762,,,8.65,,,8.9938,,,7.31,,,5.7864,,,7.31,,,7.3439,,,6.697,,,8.6084,,,6.24,,,9.0096,,,4.94,,,10.4513,,,5.9,,,12.1298,,,, -,,39.31,,,688,,,777,,,1382,,,1526,,,3345,,,1855,,,4409,,,2477,,,4744,,,2623,,,4639,,,2157,,,4265,,,2334,,,4150,,,1964,,,3695,,,1554.9,,,2963,,,961.78,,,2162,,,321.07,,,767,,,156.6,,,2072,,,231.93,,,2602,,,630.63,,,1587,,,449.51,,,988,,,113.7,,,184.3,,,-111.8,,,-108,,,, -,,(m) 248,,,BCC,,,(m) 215,,,FCC,,,(m) 180,,,HCP,,,(m) 160,,,HCP,,,(m) 146,,,BCC,,,(m) 139,,,BCC,,,(m) 136,,,HCP,,,(m) 134,,,HCP,,,(m) 134,,,FCC,,,(m) 137,,,FCC,,,(m) 144,,,FCC,,,(m) 151,,,§hex,,,(m) 167,,,§tetra.,,,(v) 141,,,§tetra.,,,(v) 138,,,§rhom.,,,(v) 135,,,hex,,,(v) 133,,,BCO,,,(v) 130,,, - ,,,, -,,[Kr] 5s1,,,,,,[Kr] 5s2,,,,,,[Kr] 4d1 5s2,,,,,,[Kr] 4d2 5s2,,,,,,[Kr] 4d4 5s1,,,,,,[Kr] 4d5 5s1,,,,,,[Kr] 4d5 5s2,,,,,,[Kr] 4d7 5s1,,,,,,[Kr] 4d8 5s1,,,,,,[Kr] 4d10,,,,,,[Kr] 4d10 5s1,,,,,,[Kr] 4d10 5s2,,,,,,[Kr] 4d10 5s2 5p1,,,,,,[Kr] 4d10 5s2 5p2,,,,,,[Kr] 4d10 5s2 5p3,,,,,,[Kr] 4d10 5s2 5p4,,,,,,[Kr] 4d10 5s2 5p5,,,,,,[Kr] 4d10 5s2 5p6,,,,,,, -,,+1,,,,,,+2,,,,,,+3,,,,,,+4,,,,,,"+3,5",,,,,,"+2,3,4,5,6",,,,,,"+4,7",,,,,,"+2,3,4,6,8",,,,,,"+2,3,4",,,,,,"+2,4",,,,,,+1,,,,,,+2,,,,,,+3,,,,,,"+2,4",,,,,,"+3,5,-3",,,,,,"+2,4,6,-2",,,,,,"+1,5,7,-1",,,,,,0,,,,,,, -,6,55,,132.90545,,,,56,,137.327,,,,Lanthanide Series,,,,,,72,,178.49,,,,73,,180.9479,,,,74,,183.84,,,,75,,186.207,,,,76,,190.23,,,,77,,192.217,,,,78,,195.078,,,,79,,196.96655,,,,80,,200.59,,,,81,,204.3833,,,,82,,207.2,,,,83,,208.98038,,,,84,,(209),,,,85,,(210),,,,86,,(222),,,,, -,,Cs,,,2S1/2,,,Ba,,,1S0,,,,,,,,,Hf,,,3F2,,,Ta,,,4F3/2,,,W,,,5D0,,,Re,,,6S5/2,,,Os,,,5D4,,,Ir,,,4F9/2,,,Pt,,,3D3,,,Au,,,2S1/2,,,Hg,,,1S0,,,Tl,,,2P°1/2,,,Pb,,,3P0,,,Bi,,,4S°3/2,,,Po,,,3P2,,,At,,,2P°3/2,,,Rn,,,1S0,,,, -,,,,,0.79,,,,,,0.89,,,,,,,,,,,,1.3,,,,,,1.5,,,,,,2.36,,,,,,1.9,,,,,,2.2,,,,,,2.2,,,,,,2.28,,,,,,2.54,,,,,,2,,,,,,1.62,,,,,,2.33,,,,,,2.02,,,,,,2.0,,,,,,2.2,,,,,,-,,,, -,,Cesium,,,,,,Barium,,,,,,,,,,,,Hafnium,,,,,,Tantalum,,,,,,Tungsten,,,,,,Rhenium,,,,,,Osmium,,,,,,Iridium,,,,,,Platinum,,,,,,Gold,,,,,,Mercury,,,,,,Thallium,,,,,,Lead,,,,,,Bismuth,,,,,,Polonium,,,,,,Astatine,,,,,,Radon,,,,,,, -,,1.879,,,3.8939,,,3.51,,,5.2117,,,,,,,,,13.31,,,6.8251,,,16.65,,,7.5496,,,19.25,,,7.8640,,,21.02,,,7.8335,,,22.61,,,8.4382,,,22.65,,,8.9670,,,21.09,,,8.9588,,,19.3,,,9.2255,,,13.534,,,10.4375,,,11.85,,,6.1082,,,11.34,,,7.4167,,,9.78,,,7.2855,,,9.196,,,8.414,,,-,,,-,,,9.73,,,10.7485,,,, -,,28.44,,,671,,,727,,,1870,,,,,,,,,2233,,,4603,,,3017,,,5458,,,3422,,,5555,,,3186,,,5596,,,3033,,,5012,,,2466,,,4428,,,1768.3,,,3825,,,1064.18,,,2856,,,-38.83,,,356.73,,,304,,,1473,,,327.46,,,1749,,,271.3,,,1564,,,254,,,962,,,302,,,-,,,-71,,,-61.7,,,, -,,(m) 265,,,BCC,,,(m) 222,,,BCC,,,,,,,,,(m) 159,,,HCP,,,(m) 146,,,BCC,,,(m) 139,,,BCC,,,(m) 137,,,HCP,,,(m) 135,,,HCP,,,(m) 136,,,FCC,,,(m) 139,,,FCC,,,(m) 144,,,FCC,,,(m) 151,,,§rhom.,,,(m) 170,,,HCP,,,(m) 175,,,FCC,,,(v) 146,,,§rhom.,,,-,,,§cubic,,,-,,, - ,,,(v) 145,,,-,,,, -,,[Xe] 6s1,,,,,,[Xe] 6s2,,,,,,,,,,,,[Xe] 4f14 5d2 6s2,,,,,,[Xe] 4f14 5d3 6s2,,,,,,[Xe] 4f14 5d4 6s2,,,,,,[Xe] 4f14 5d5 6s2,,,,,,[Xe] 4f14 5d6 6s2,,,,,,[Xe] 4f14 5d7 6s2,,,,,,[Xe] 4f14 5d9 6s1,,,,,,[Xe] 4f14 5d10 6s1,,,,,,[Xe] 4f14 5d10 6s2,,,,,,[Hg] 6p1,,,,,,[Hg] 6p2,,,,,,[Hg] 6p3,,,,,,[Hg] 6p4,,,,,,[Hg] 6p5,,,,,,[Hg] 6p6,,,,,,, -,,+1,,,,,,+2,,,,,,,,,,,,+4,,,,,,+5,,,,,,"+2,3,4,5,6",,,,,,"+2,4,6,7,-1",,,,,,"+2,3,4,6,8",,,,,,"+2,3,4,6",,,,,,"+2,4",,,,,,"+1,3",,,,,,"+1,2",,,,,,"+1,3",,,,,,"+2,4",,,,,,"+3,5",,,,,,"+2,4",,,,,,"+1,3,5,7,-1",,,,,,0,,,,,,, -,7,87,,(223),,,,88,,(226),,,,"Actinide -Series",,,,,,104,,(261),,,,105,,(262),,,,106,,(266),,,,107,,(264),,,,108,,(277),,,,109,,(268),,,,110,,(281),,,,111,,(272),,,,112,,(285),,,,113,,,,,,114,,(289),,,,115,,,,,,116,,(292),,,,117,,,,,,118,,,,,,, -,,Fr,,,2S1/2,,,Ra,,,1S0,,,,,,,,,Rf,,,3F2 ?,,,Db,,, ,,,Sg,,, ,,,Bh,,, ,,,Hs,,, ,,,Mt,,, ,,,Ds,,, ,,,Rg,,, ,,,Cn,,, ,,,Uut,,,,,,Uuq,,,,,,Uup,,,,,,Uuh,,,,,,Uus,,,,,,Uuo,,,,,,, -,,,,,0.7,,,,,,0.9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,Francium,,,,,,Radium,,,,,,,,,,,,Rutherfordium,,,,,,Dubnium,,,,,,Seaborgium,,,,,,Bohrium,,,,,,Hassium,,,,,,Meitnerium,,,,,,Darmstadtium,,,,,,Roentgenium,,,,,,Copernicium,,,,,,Ununtrium,,,,,,Ununquadium,,,,,,Ununpentium,,,,,,Ununhexium,,,,,,Ununseptium,,,,,,Ununoctium,,,,,,, -,,-,,,4.0727,,,5,,,5.2784,,,,,,,,,,,,6.0 ?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,-,,,-,,,700,,,1737,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,-,,,-,,,-,,,BCC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,[Rn] 7s1,,,,,,[Rn] 7s2,,,,,,,,,,,,[Rn] 5f14 6d2 7s2 ?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,+1,,,,,,+2,,,,,,,,,,,,+4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,"Notes: -- Density units are g/cm3 for solids and g/L or kg/cm3 at 0° Celsius for gases -- Atomic Weight based on 12C -- ( ) indicate mass number of most stable isotope -- Common Oxidation States in bold -- Electron Config. based on IUPAC guidelines -- § indicates crystal structure is unusual or may require explanation -- (m) Metallic radius, (v) Covalent radius",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,Lanthanides,,,57,,138.9055,,,,58,,140.116,,,,59,,140.90765,,,,60,,144.24,,,,61,,(145),,,,62,,150.36,,,,63,,151.964,,,,64,,157.25,,,,65,,158.92534,,,,66,,162.500,,,,67,,164.93032,,,,68,,167.259,,,,69,,168.93421,,,,70,,173.04,,,,71,,174.967,,,,, -,,,,,,,,,,,,,,,,,,,,La,,,2D3/2,,,Ce,,,1G°4,,,Pr,,,4I°9/2,,,Nd,,,5I4,,,Pm,,,6H°5/2,,,Sm,,,7F0,,,Eu,,,8S°7/2,,,Gd,,,9D°2,,,Tb,,,6H°15/2,,,Dy,,,5I8,,,Ho,,,4I°15/2,,,Er,,,3H6,,,Tm,,,2F°7/2,,,Yb,,,1S0,,,Lu,,,2D3/2,,,, -,,,,,,,,,,,,,,,,,,,,,,,1.10,,,,,,1.12,,,,,,1.13,,,,,,1.14,,,,,,-,,,,,,1.17,,,,,,-,,,,,,1.20,,,,,,-,,,,,,1.22,,,,,,1.23,,,,,,1.24,,,,,,1.25,,,,,,-,,,,,,1.27,,,, -,,,,,,,,,,,,,,,,,,,,Lanthanum,,,,,,Cerium,,,,,,Praseodymium,,,,,,Neodymium,,,,,,Promethium,,,,,,Samarium,,,,,,Europium,,,,,,Gadolinium,,,,,,Terbium,,,,,,Dysprosium,,,,,,Holmium,,,,,,Erbium,,,,,,Thulium,,,,,,Ytterbium,,,,,,Lutetium,,,,,,, -,,,,,,,,,,,,,,,,,,,,6.146,,,5.5769,,,6.689,,,5.5387,,,6.64,,,5.473,,,7.01,,,5.5250,,,7.264,,,5.582,,,7.353,,,5.6437,,,5.244,,,5.6704,,,7.901,,,6.1498,,,8.219,,,5.8638,,,8.551,,,5.9389,,,8.795,,,6.0215,,,9.066,,,6.1077,,,9.321,,,6.1843,,,6.57,,,6.2542,,,9.841,,,5.4259,,,, -,,,,,,,,,,,,,,,,,,,,920,,,3464,,,798,,,3360,,,931,,,3290,,,1021,,,3100,,,1100,,,3000,,,1072,,,1803,,,822,,,1527,,,1313,,,3250,,,1356,,,3230,,,1412,,,2567,,,1474,,,2700,,,1497,,,2868,,,1545,,,1950,,,819,,,1196,,,1663,,,3402,,,, -,,,,,,,,,,,,,,,,,,,,(m) 187,,,§hex,,,(m) 182,,,FCC,,,(m) 182,,,§hex,,,(m) 181,,,§hex,,,(m) 183,,,HCP,,,(m) 180,,,§hex,,,(m) 180,,,BCC,,,(m) 180,,,HCP,,,(m) 177,,,HCP,,,(m) 178,,,HCP,,,(m) 176,,,HCP,,,(m) 176,,,HCP,,,(m) 176,,,HCP,,,(m) 176,,,FCC,,,(m) 174,,,HCP,,,, -,,,,,,,,,,,,,,,,,,,,[Xe] 5d1 6s2,,,,,,[Xe] 4f1 5d1 6s2,,,,,,[Xe] 4f3 6s2,,,,,,[Xe] 4f4 6s2,,,,,,[Xe] 4f5 6s2,,,,,,[Xe] 4f6 6s2,,,,,,[Xe] 4f7 6s2,,,,,,[Xe] 4f7 5d1 6s2,,,,,,[Xe] 4f9 6s2,,,,,,[Xe] 4f10 6s2,,,,,,[Xe] 4f11 6s2,,,,,,[Xe] 4f12 6s2,,,,,,[Xe] 4f13 6s2,,,,,,[Xe] 4f14 6s2,,,,,,[Xe] 4f14 5d1 6s2,,,,,,, -,,,,,,,,,,,,,,,,,,,,+3,,,,,,"+3,4",,,,,,"+3,4",,,,,,+3,,,,,,+3,,,,,,"+2,3",,,,,,"+2,3",,,,,,+3,,,,,,"+3,4",,,,,,+3,,,,,,+3,,,,,,+3,,,,,,"+2,3",,,,,,"+2,3",,,,,,+3,,,,,,, -,,,,,,,,,,,,,,,,,Actinides,,,89,,(227),,,,90,,232.0381,,,,91,,231.0359,,,,92,,238.0289,,,,93,,(237),,,,94,,(244),,,,95,,(243),,,,96,,(247),,,,97,,(247),,,,98,,(251),,,,99,,(252),,,,100,,(257),,,,101,,(258),,,,102,,(259),,,,103,,(262),,,,, -,,References:,,,,,,,,,,,,,,,,,,Ac,,,2D3/2,,,Th,,,3F2,,,Pa,,,4K11/2,,,U,,,5L°6,,,Np,,,6L11/2,,,Pu,,,7F0,,,Am,,,8S°7/2,,,Cm,,,9D°2,,,Bk,,,6H°15/2,,,Cf,,,5I8,,,Es,,,4I°15/2,,,Fm,,,3H6,,,Md,,,2F°7/2,,,No,,,1S0,,,Lr,,,2P°1/2 ?,,,, -,,"†Nist.gov, *Wolfram.com (Mathematic),",,,,,,,,,,,,,,,,,,,,,1.1,,,,,,1.3,,,,,,1.5,,,,,,1.38,,,,,,1.36,,,,,,1.28,,,,,,1.3,,,,,,1.3,,,,,,1.3,,,,,,1.3,,,,,,1.3,,,,,,1.3,,,,,,1.3,,,,,,1.3,,,,,,-,,,, -,,CRC Handbook of Chemistry and Physics,,,,,,,,,,,,,,,,,,Actinium,,,,,,Thorium,,,,,,Protactinium,,,,,,Uranium,,,,,,Neptunium,,,,,,Plutonium,,,,,,Americium,,,,,,Curium,,,,,,Berkelium,,,,,,Californium,,,,,,Einsteinium,,,,,,Fermium,,,,,,Mendelevium,,,,,,Nobelium,,,,,,Lawrencium,,,,,,, -,,"81st Edition, 2000-2001, and others",,,,,,,,,,,,,,,,,,10.07,,,5.17,,,11.724,,,6.3067,,,15.37,,,5.89,,,19.05,,,6.1941,,,20.45,,,6.2657,,,19.816,,,6.0260,,,-,,,5.9738,,,13.51,,,5.9914,,,14.78,,,6.1979,,,15.1,,,6.2817,,,-,,,6.42,,,-,,,6.50,,,-,,,6.58,,,-,,,6.65,,,-,,,4.9 ?,,,, -,,,,,,,,,,,,,,,,,,,,1050,,,3200,,,1750,,,4820,,,1572,,,4000,,,1135,,,3927,,,644,,,4000,,,640,,,3230,,,1176,,,2011,,,1345,,,3110,,,1050,,,-,,,900,,,-,,,860,,,-,,,1527,,,-,,,827,,,-,,,827,,,-,,,1627,,,-,,,, -,,Periodic Table of the Elements,,,,,,,,,,,,,,,,,,-,,,FCC,,,(m) 179,,,FCC,,,(m) 163,,,§tetra,,,(m) 156,,,BCP,,,(m) 155,,,SO,,,(m) 159,,,§mono.,,,(m) 173,,,HCP,,,(m) 174,,,HCP,,,(m) 170,,,hex,,,-,,,hex,,,-,,,-,,,-,,,-,,,-,,,-,,,-,,,-,,,-,,,-,,,, -,,Design by Vertex42.com,,,,,,,,,,,,,,,,,,[Rn] 6d1 7s2,,,,,,[Rn] 6d2 7s2,,,,,,[Rn] 5f2 6d1 7s2,,,,,,[Rn] 5f3 6d1 7s2,,,,,,[Rn] 5f4 6d1 7s2,,,,,,[Rn] 5f6 7s2,,,,,,[Rn] 5f7 7s2,,,,,,[Rn] 5f7 6d 7s2,,,,,,[Rn] 5f9 7s2,,,,,,[Rn] 5f10 7s2,,,,,,[Rn] 5f11 7s2,,,,,,[Rn] 5f12 7s2,,,,,,[Rn] 5f13 7s2,,,,,,[Rn] 5f14 7s2,,,,,,[Rn] 5f14 7s2 7p ?,,,,,,, -,,© 2011 Vertex42 LLC. All rights reserved.,,,,,,,,,,,,,,,,,,+3,,,,,,+4,,,,,,"+4,5",,,,,,"+3,4,5,6",,,,,,"+3,4,5,6",,,,,,"+3,4,5,6",,,,,,"+3,4,5,6",,,,,,+3,,,,,,"+3,4",,,,,,+3,,,,,,+3,,,,,,+3,,,,,,"+2,3",,,,,,"+2,3",,,,,,+3,,,,,,, \ No newline at end of file diff --git a/Website/excelinterop/tmp/periodic-table.csv b/Website/excelinterop/tmp/periodic-table.csv deleted file mode 100644 index 8dad95b..0000000 Binary files a/Website/excelinterop/tmp/periodic-table.csv and /dev/null differ diff --git a/Website/excelinterop/tmp/periodic-table.xls b/Website/excelinterop/tmp/periodic-table.xls deleted file mode 100644 index 8dad95b..0000000 Binary files a/Website/excelinterop/tmp/periodic-table.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/periodic-table.xlsx - Data.csv b/Website/excelinterop/tmp/periodic-table.xlsx - Data.csv deleted file mode 100644 index 546cbfd..0000000 --- a/Website/excelinterop/tmp/periodic-table.xlsx - Data.csv +++ /dev/null @@ -1,131 +0,0 @@ -Atomic Number,Name,Symbol,† Atomic Weight,Atomic Weight Estimated,Atomic Weight Display,† Phase at STP,Type,Group,Group 2,Period,† Electron Configuration,Ground-state Level,† Ionization Energy (eV),* Melting Point (°C),* Boiling Point (°C),Crystal Structure,Atomic Radius (display),Metallic Radius (pm),* Covalent radius (pm),* Atomic Radius (calculated) (pm),"* Van der Waals Radius, (pm)",* Electro-negativity (Pauling),* Density (g/cm3),* Electron Affinity (kJ/mol),"* Thermal Conductivity, W/(m K)",* Electrical Resistivity (Ωm),* CAS Number,Possible Oxidation States,Discoverer,Discovery (Year) -1,Hydrogen,H,1.00794,,1.00794,Gas,Non Metal,1,IA,1,1s1,2S1/2,13.5984,-259.14,-252.87,hex,(v) 37,,37,53,120,2.2,0.0899,72.8,0.1805,#N/A,CAS1333-74-0,"+1,-1","Cavendish, Henry",1766 -2,Helium,He,4.002602,,4.002602,Gas,Noble Gas,18,VIIIA,1,1s2,1S0,24.5874,#N/A,-268.93,,(v) 32,,32,31,140,#N/A,0.1785,#N/A,0.1513,#N/A,CAS7440-59-7,0,"Ramsey, Sir William & Cleve, Per Teodor",1895 -3,Lithium,Li,6.941,,6.941,Solid,Alkali Metal,1,IA,2,[He] 2s1,2S1/2,5.3917,180.54,1342,BCC,(m) 152,152,134,167,182,0.98,0.535,59.6,85,0.000000094,CAS7439-93-2,+1,"Arfvedson, Johan August",1817 -4,Beryllium,Be,9.012182,,9.012182,Solid,Alkaline Earth Metal,2,IIA,2,[He] 2s2,1S0,9.3227,1287,2470,HCP,(m) 112,112,90,112,153,1.57,1.848,#N/A,190,0.00000004,CAS7440-41-7,+2,"Vauquelin, Nicholas Louis",1797 -5,Boron,B,10.811,,10.811,Solid,Metalloids,13,IIIA,2,[He] 2s2 2p1,2P°1/2,8.298,2075,4000,rhom.,(v) 82,,82,87,192,2.04,2.46,26.7,27,10000,CAS7440-42-8,+3,"Davy, Sir Humphry & Thénard, Louis-Jaques & Gay-Lussac, Louis-Joseph",1808 -6,Carbon,C,12.0107,,12.0107,Solid,Non Metal,14,IVA,2,[He] 2s2 2p2,3P0,11.2603,3550,4027,hex,(v) 77,,77,67,170,2.55,2.26,153.9,140,0.00001,CAS7440-44-0,"+2,4/-4",unknown,ancient -7,Nitrogen,N,14.0067,,14.0067,Gas,Non Metal,15,VA,2,[He] 2s2 2p3,4S°3/2,14.5341,-210.1,-195.79,hex,(v) 75,,75,56,155,3.04,1.251,7,0.02583,#N/A,CAS7727-37-9,"+1,2,3,4,5/-1,2,3","Rutherford, Daniel",1772 -8,Oxygen,O,15.9994,,15.9994,Gas,Non Metal,16,VIA,2,[He] 2s2 2p4,3P2,13.6181,-218.3,-182.9,§cubic,(v) 73,,73,48,152,3.44,1.429,141,0.02658,#N/A,CAS7782-44-7,-2,"Priestley, Joseph & Scheele, Carl Wilhelm",1774 -9,Fluorine,F,18.9984032,,18.9984032,Gas,Halogen,17,VIIA,2,[He] 2s2 2p5,2P°3/2,17.4228,-219.6,-188.12,§cubic,(v) 71,,71,42,147,3.98,1.696,328,0.0277,#N/A,CAS7782-41-4,-1,"Moissan, Henri",1886 -10,Neon,Ne,20.1797,,20.1797,Gas,Noble Gas,18,VIIIA,2,[He] 2s2 2p6,1S0,21.5645,-248.59,-246.08,FCC,(v) 69,,69,38,154,#N/A,0.9,#N/A,0.0491,#N/A,CAS7440-01-9,0,"Ramsay, William & Travers, Morris",1898 -11,Sodium,Na,22.98977,,22.98977,Solid,Alkali Metal,1,IA,3,[Ne] 3s1,2S1/2,5.1391,97.72,883,BCC,(m) 186,186,154,190,227,0.93,0.968,52.8,140,0.000000047,CAS7440-23-5,+1,"Davy, Sir Humphry",1807 -12,Magnesium,Mg,24.305,,24.305,Solid,Alkaline Earth Metal,2,IIA,3,[Ne] 3s2,1S0,7.6462,650,1090,HCP,(m) 160,160,130,145,173,1.31,1.738,#N/A,160,0.000000044,CAS7439-95-4,+2,"Black, Joseph",1755 -13,Aluminum,Al,26.981538,,26.981538,Solid,Poor Metal,13,IIIA,3,[Ne] 3s2 3p1,2P°1/2,5.9858,660.32,2519,FCC,(m) 143,143,118,118,184,1.61,2.7,42.5,235,0.000000026,CAS7429-90-5,+3,"Oersted, Hans Christian",1825 -14,Silicon,Si,28.0855,,28.0855,Solid,Metalloids,14,IVA,3,[Ne] 3s2 3p2,3P0,8.1517,1414,2900,cubic,(v) 111,,111,111,210,1.9,2.33,133.6,150,0.001,CAS7440-21-3,"+2,4/-4","Berzelius, Jöns Jacob",1824 -15,Phosphorus,P,30.97361,,30.97361,Solid,Non Metal,15,VA,3,[Ne] 3s2 3p3,4S°3/2,10.4867,44.2,280.5,§,(v) 106,,106,98,180,2.19,1.823,72,0.236,0.0000001,CAS7723-14-0,"+3,5/-3","Brandt, Hennig",1669 -16,Sulfur,S,32.065,,32.065,Solid,Non Metal,16,VIA,3,[Ne] 3s2 3p4,3P2,10.36,115.21,444.72,FCO,(v) 102,,102,88,180,2.58,1.96,200,0.205,#N/A,CAS7704-34-9,"+4,6/-2",unknown,ancient -17,Chlorine,Cl,35.453,,35.453,Gas,Halogen,17,VIIA,3,[Ne] 3s2 3p5,2P°3/2,12.9676,-101.5,-34.04,BCO,(v) 99,,99,79,175,3.16,3.214,349,0.0089,#N/A,CAS7782-50-5,"+1,5,7/-1","Scheele, Carl Wilhelm",1774 -18,Argon,Ar,39.948,,39.948,Gas,Noble Gas,18,VIIIA,3,[Ne] 3s2 3p6,1S0,15.7596,-189.3,-185.8,FCC,(v) 97,,97,71,188,#N/A,1.784,#N/A,0.01772,#N/A,CAS7440-37-1,0,"Ramsay, Sir William & Strutt, John (Lord Rayleigh)",1894 -19,Potassium,K,39.0983,,39.0983,Solid,Alkali Metal,1,IA,4,[Ar] 4s1,2S1/2,4.3407,63.38,759,BCC,(m) 227,227,196,243,275,0.82,0.856,48.4,100,0.00000007,CAS7440-09-7,+1,"Davy, Sir Humphry",1807 -20,Calcium,Ca,40.078,,40.078,Solid,Alkaline Earth Metal,2,IIA,4,[Ar] 4s2,1S0,6.1132,842,1484,FCC,(m) 197,197,174,194,231,1,1.55,2.37,200,0.000000034,CAS7440-70-2,+2,"Davy, Sir Humphry",1808 -21,Scandium,Sc,44.95591,,44.95591,Solid,Transition Metal,3,IIIB,4,[Ar] 3d1 4s2,2D3/2,6.5615,1541,2830,HCP,(m) 162,162,144,184,211,1.36,2.985,18.1,16,0.00000055,CAS7440-20-2,+3,"Nilson, Lars Fredrik",1879 -22,Titanium,Ti,47.867,,47.867,Solid,Transition Metal,4,IVB,4,[Ar] 3d2 4s2,3F2,6.8281,1668,3287,HCP,(m) 147,147,136,176,#N/A,1.54,4.507,7.6,22,0.0000004,CAS7440-32-6,"+2,3,4","Gregor, William",1791 -23,Vanadium,V,50.9415,,50.9415,Solid,Transition Metal,5,VB,4,[Ar] 3d3 4s2,4F3/2,6.7462,1910,3407,BCC,(m) 134,134,125,171,#N/A,1.63,6.11,50.6,31,0.0000002,CAS7440-62-2,"+2,3,4,5","Del Rio, Andrés Manuel (1801) & Sefström, Nils Gabriel (1830)",1801 -24,Chromium,Cr,51.9961,,51.9961,Solid,Transition Metal,6,VIB,4,[Ar] 3d5 4s1,7S3,6.7665,1907,2671,BCC,(m) 128,128,127,166,#N/A,1.66,7.14,64.3,94,0.00000013,CAS7440-47-3,"+2,3,6",Vauquelin,1797 -25,Manganese,Mn,54.938049,,54.938049,Solid,Transition Metal,7,VIIB,4,[Ar] 3d5 4s2,6S5/2,7.434,1246,2061,§cubic,(m) 127,127,139,161,#N/A,1.55,7.47,#N/A,7.8,0.0000016,CAS7439-96-5,"+2,3,4,7","Gahn, Johan Gottlieb",1774 -26,Iron,Fe,55.845,,55.845,Solid,Transition Metal,8,VIIIB,4,[Ar] 3d6 4s2,5D4,7.9024,1538,2861,BCC,(m) 126,126,125,156,#N/A,1.83,7.874,15.7,80,0.000000097,CAS7439-89-6,"+2,3",unknown,ancient -27,Cobalt,Co,58.9332,,58.9332,Solid,Transition Metal,9,VIIIB,4,[Ar] 3d7 4s2,4F9/2,7.881,1495,2927,HCP,(m) 125,125,126,152,#N/A,1.88,8.9,63.7,100,0.00000006,CAS7440-48-4,"+2,3","Brandt, Georg",1735 -28,Nickel,Ni,58.6934,,58.6934,Solid,Transition Metal,10,VIIIB,4,[Ar] 3d8 4s2,3F4,7.6398,1455,2913,FCC,(m) 124,124,121,149,163,1.91,8.908,112,91,0.00000007,CAS7440-02-0,"+2,3","Cronstedt, Alex Fredrik",1751 -29,Copper,Cu,63.546,,63.546,Solid,Transition Metal,11,IB,4,[Ar] 3d10 4s1,2S1/2,7.7264,1084.62,2927,FCC,(m) 128,128,138,145,140,1.9,8.92,118.4,400,0.000000017,CAS7440-50-8,"+1,2",unknown,ancient -30,Zinc,Zn,65.409,,65.409,Solid,Transition Metal,12,IIB,4,[Ar] 3d10 4s2,1S0,9.3942,419.53,907,§hex,(m) 134,134,131,142,139,1.65,7.14,#N/A,120,0.000000059,CAS7440-66-6,+2,unknown,ancient -31,Gallium,Ga,69.723,,69.723,Solid,Poor Metal,13,IIIA,4,[Ar] 3d10 4s2 4p1,2P°1/2,5.9993,29.76,2204,§BCO,(m) 135,135,126,136,187,1.81,5.904,28.9,29,0.00000014,CAS7440-55-3,+3,"Lecoq de Boisbaudran, Paul-Émile",1875 -32,Germanium,Ge,72.64,,72.64,Solid,Metalloids,14,IVA,4,[Ar] 3d10 4s2 4p2,3P0,7.8994,938.3,2820,§cubic,(v) 122,,122,125,211,2.01,5.323,119,60,0.0005,CAS7440-56-4,"+2,4","Winkler, Clemens A.",1886 -33,Arsenic,As,74.9216,,74.9216,Solid,Metalloids,15,VA,4,[Ar] 3d10 4s2 4p3,4S°3/2,9.7886,817,614,rhom.,(v) 119,,119,114,185,2.18,5.727,78,50,0.0000003,CAS7440-38-2,"+3,5/-3",unknown,ancient -34,Selenium,Se,78.96,,78.96,Solid,Non Metal,16,VIA,4,[Ar] 3d10 4s2 4p4,3P2,9.7524,221,685,§hex,(v) 116,,116,103,190,2.55,4.819,195,0.52,#N/A,CAS7782-49-2,"+4,6/-2","Berzelius, Jöns Jacob",1817 -35,Bromine,Br,79.904,,79.904,Liquid,Halogen,17,VIIA,4,[Ar] 3d10 4s2 4p5,2P°3/2,11.8138,-7.3,59,BCO,(v) 114,,114,94,185,2.96,3.12,324.6,0.12,#N/A,CAS7726-95-6,"+1,5/-1","Balard, Antoine-Jérôme",1826 -36,Krypton,Kr,83.798,,83.798,Gas,Noble Gas,18,VIIIA,4,[Ar] 3d10 4s2 4p6,1S0,13.9996,-157.36,-153.22,FCC,(v) 110,,110,88,202,3,3.75,#N/A,0.00943,#N/A,CAS7439-90-9,0,"Ramsay, Sir William & Travers, Morris",1898 -37,Rubidium,Rb,85.4678,,85.4678,Solid,Alkali Metal,1,IA,5,[Kr] 5s1,2S1/2,4.1771,39.31,688,BCC,(m) 248,248,211,265,303,0.82,1.532,46.9,58,0.00000012,CAS7440-17-7,+1,"Bunsen, Robert Wilhelm & Kirchhoff, Gustav Robert",1861 -38,Strontium,Sr,87.62,,87.62,Solid,Alkaline Earth Metal,2,IIA,5,[Kr] 5s2,1S0,5.6949,777,1382,FCC,(m) 215,215,192,219,249,0.95,2.63,5.03,35,0.00000013,CAS7440-24-6,+2,"Crawford, Adair",1790 -39,Yttrium,Y,88.90585,,88.90585,Solid,Transition Metal,3,IIIB,5,[Kr] 4d1 5s2,2D3/2,6.2173,1526,3345,HCP,(m) 180,180,162,212,#N/A,1.22,4.472,29.6,17,0.00000056,CAS7440-65-5,+3,"Gadolin, Johan",1789 -40,Zirconium,Zr,91.224,,91.224,Solid,Transition Metal,4,IVB,5,[Kr] 4d2 5s2,3F2,6.6339,1855,4409,HCP,(m) 160,160,148,206,#N/A,1.33,6.511,41.1,23,0.00000042,CAS7440-67-7,+4,"Klaproth, Martin Heinrich",1789 -41,Niobium,Nb,92.90638,,92.90638,Solid,Transition Metal,5,VB,5,[Kr] 4d4 5s1,6D1/2,6.7589,2477,4744,BCC,(m) 146,146,137,198,#N/A,1.6,8.57,86.1,54,0.00000015,CAS7440-03-1,"+3,5","Hatchet, Charles",1801 -42,Molybdenum,Mo,95.94,,95.94,Solid,Transition Metal,6,VIB,5,[Kr] 4d5 5s1,7S3,7.0924,2623,4639,BCC,(m) 139,139,145,190,#N/A,2.16,10.28,71.9,139,0.00000005,CAS7439-98-7,+6,"Scheele, Carl Welhelm",1778 -43,Technetium,Tc,98,x,(98),Synthetic,Transition Metal,7,VIIB,5,[Kr] 4d5 5s2,6S5/2,7.28,2157,4265,HCP,(m) 136,136,156,183,#N/A,1.9,11.5,53,51,0.0000002,CAS7440-26-8,"+4,7","Perrier, Carlo & Segrè, Emilio",1937 -44,Ruthenium,Ru,101.07,,101.07,Solid,Transition Metal,8,VIIIB,5,[Kr] 4d7 5s1,5F5,7.3605,2334,4150,HCP,(m) 134,134,126,178,#N/A,2.2,12.37,101.3,120,0.000000071,CAS7440-18-8,+3,"Klaus, Karl Karlovich",1844 -45,Rhodium,Rh,102.9055,,102.9055,Solid,Transition Metal,9,VIIIB,5,[Kr] 4d8 5s1,4F9/2,7.4589,1964,3695,FCC,(m) 134,134,135,173,#N/A,2.28,12.45,109.7,150,0.000000043,CAS7440-16-6,+3,"Wollaston, William Hyde",1803 -46,Palladium,Pd,106.42,,106.42,Solid,Transition Metal,10,VIIIB,5,[Kr] 4d10,1S0,8.3369,1554.9,2963,FCC,(m) 137,137,131,169,163,2.2,12.023,53.7,72,0.0000001,CAS7440-05-3,"+2,4","Wollaston, William Hyde",1803 -47,Silver,Ag,107.8682,,107.8682,Solid,Transition Metal,11,IB,5,[Kr] 4d10 5s1,2S1/2,7.5762,961.78,2162,FCC,(m) 144,144,153,165,172,1.93,10.49,125.6,430,0.000000016,CAS7440-22-4,+1,unknown,ancient -48,Cadmium,Cd,112.411,,112.411,Solid,Transition Metal,12,IIB,5,[Kr] 4d10 5s2,1S0,8.9938,321.07,767,§hex,(m) 151,151,148,161,158,1.69,8.65,#N/A,97,0.00000007,CAS7440-43-9,+2,"Stromeyer, Prof. Friedrich",1817 -49,Indium,In,114.818,,114.818,Solid,Poor Metal,13,IIIA,5,[Kr] 4d10 5s2 5p1,2P°1/2,5.7864,156.6,2072,§tetra.,(m) 167,167,144,156,193,1.78,7.31,28.9,82,0.00000008,CAS7440-74-6,+3,"Reich, Ferdinand & Richter, Hieronymus",1863 -50,Tin,Sn,118.71,,118.71,Solid,Poor Metal,14,IVA,5,[Kr] 4d10 5s2 5p2,3P0,7.3439,231.93,2602,§tetra.,(v) 141,,141,145,217,1.96,7.31,107.3,67,0.00000011,CAS7440-31-5,"+2,4",unknown,ancient -51,Antimony,Sb,121.76,,121.76,Solid,Metalloids,15,VA,5,[Kr] 4d10 5s2 5p3,4S°3/2,8.6084,630.63,1587,§rhom.,(v) 138,,138,133,206,2.05,6.697,103.2,24,0.0000004,CAS7440-36-0,"+3,5/-3",unknown,ancient -52,Tellurium,Te,127.6,,127.6,Solid,Metalloids,16,VIA,5,[Kr] 4d10 5s2 5p4,3P2,9.0096,449.51,988,hex,(v) 135,,135,123,206,2.1,6.24,190.2,3,0.0001,CAS13494-80-9,"+4,6/-2","Müller von Reichenstein, Franz Joseph",1782 -53,Iodine,I,126.90447,,126.90447,Solid,Halogen,17,VIIA,5,[Kr] 4d10 5s2 5p5,2P°3/2,10.4513,113.7,184.3,BCO,(v) 133,,133,115,198,2.66,4.94,295.2,0.449,#N/A,CAS7553-56-2,"+1,5,7/-1","Courtois, Bernard",1811 -54,Xenon,Xe,131.293,,131.293,Gas,Noble Gas,18,VIIIA,5,[Kr] 4d10 5s2 5p6,1S0,12.1298,-111.8,-108,FCC,(v) 130,,130,108,216,2.6,5.9,#N/A,0.00565,#N/A,CAS7440-63-3,0,"Ramsay, William & Travers, Morris William",1898 -55,Cesium,Cs,132.90545,,132.90545,Solid,Alkali Metal,1,IA,6,[Xe] 6s1,2S1/2,3.8939,28.44,671,BCC,(m) 265,265,225,298,343,0.79,1.879,45.5,36,0.0000002,CAS7440-46-2,+1,"Kirchhoff, Gustav & Bunsen, Robert",1860 -56,Barium,Ba,137.327,,137.327,Solid,Alkaline Earth Metal,2,IIA,6,[Xe] 6s2,1S0,5.2117,727,1870,BCC,(m) 222,222,198,253,268,0.89,3.51,13.95,18,0.00000035,CAS7440-39-3,+2,"Davy, Sir Humphry",1808 -57,Lanthanum,La,138.9055,,138.9055,Solid,Rare Earth Metal,3,Lanthanides,6,[Xe] 5d1 6s2,2D3/2,5.5769,920,3464,§hex,(m) 187,187,169,#N/A,#N/A,1.1,6.146,48,13,0.00000061,CAS7439-91-0,+3,"Mosander, Carl Gustav",1839 -58,Cerium,Ce,140.116,,140.116,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f1 5d1 6s2,1G°4,5.5387,798,3360,FCC,(m) 182,182,#N/A,#N/A,#N/A,1.12,6.689,50,11,0.00000074,CAS7440-45-1,"+3,4","Hisinger, Wilhelm & Berzelius, Jöns Jacob/Klaproth, Martin Heinrich",1803 -59,Praseodymium,Pr,140.90765,,140.90765,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f3 6s2,4I°9/2,5.473,931,3290,§hex,(m) 182,182,#N/A,247,#N/A,1.13,6.64,50,13,0.0000007,CAS7440-10-0,+3,"Von Welsbach, Baron Auer",1885 -60,Neodymium,Nd,144.24,,144.24,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f4 6s2,5I4,5.525,1021,3100,§hex,(m) 181,181,#N/A,206,#N/A,1.14,7.01,50,17,0.00000064,CAS7440-00-8,+3,"Von Welsbach, Baron Auer",1885 -61,Promethium,Pm,145,x,(145),Synthetic,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f5 6s2,6H°5/2,5.582,1100,3000,HCP,(m) 183,183,#N/A,205,#N/A,#N/A,7.264,50,15,0.00000075,CAS7440-12-2,+3,"Marinsky, Jacob A. & Coryell, Charles D. & Glendenin, Lawerence. E.",1944 -62,Samarium,Sm,150.36,,150.36,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f6 6s2,7F0,5.6437,1072,1803,§hex,(m) 180,180,#N/A,238,#N/A,1.17,7.353,50,13,0.00000094,CAS7440-19-9,"+2,3","Lecoq de Boisbaudran, Paul-Émile",1879 -63,Europium,Eu,151.964,,151.964,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f7 6s2,8S°7/2,5.6704,822,1527,BCC,(m) 180,180,#N/A,231,#N/A,#N/A,5.244,50,14,0.0000009,CAS7440-53-1,"+2,3","Demarçay, Eugène-Antole",1901 -64,Gadolinium,Gd,157.25,,157.25,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f7 5d1 6s2,9D°2,6.1498,1313,3250,HCP,(m) 180,180,#N/A,233,#N/A,1.2,7.901,50,11,0.0000013,CAS7440-54-2,+3,"De Marignac, Charles Galissard",1880 -65,Terbium,Tb,158.92534,,158.92534,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f9 6s2,6H°15/2,5.8638,1356,3230,HCP,(m) 177,177,#N/A,225,#N/A,#N/A,8.219,50,11,0.0000012,CAS7440-27-9,+3,"Mosander, Carl Gustav",1843 -66,Dysprosium,Dy,162.5,,162.5,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f10 6s2,5I8,5.9389,1412,2567,HCP,(m) 178,178,#N/A,228,#N/A,1.22,8.551,50,11,0.00000091,CAS7429-91-6,+3,"Lecoq de Boisbaudran, Paul-Émile",1886 -67,Holmium,Ho,164.93032,,164.93032,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f11 6s2,4I°15/2,6.0215,1474,2700,HCP,(m) 176,176,#N/A,#N/A,#N/A,1.23,8.795,50,16,0.00000094,CAS7440-60-0,+3,"Cleve, Per Theodor",1879 -68,Erbium,Er,167.259,,167.259,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f12 6s2,3H6,6.1077,1497,2868,HCP,(m) 176,176,#N/A,226,#N/A,1.24,9.066,50,15,0.00000086,CAS7440-52-0,+3,"Mosander, Carl Gustav",1842 -69,Thulium,Tm,168.93421,,168.93421,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f13 6s2,2F°7/2,6.1843,1545,1950,HCP,(m) 176,176,#N/A,222,#N/A,1.25,9.321,50,17,0.0000007,CAS7440-30-4,+3,"Cleve, Per Teodor",1879 -70,Ytterbium,Yb,173.04,,173.04,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f14 6s2,1S0,6.2542,819,1196,FCC,(m) 176,176,#N/A,222,#N/A,#N/A,6.57,50,39,0.00000028,CAS7440-64-4,"+2,3","De Marignac, Jean Charles Galissard",1878 -71,Lutetium,Lu,174.967,,174.967,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f14 5d1 6s2,2D3/2,5.4259,1663,3402,HCP,(m) 174,174,160,217,#N/A,1.27,9.841,50,16,0.00000056,CAS7439-94-3,+3,"Urbain, Georges",1907 -72,Hafnium,Hf,178.49,,178.49,Solid,Transition Metal,4,IVB,6,[Xe] 4f14 5d2 6s2,3F2,6.8251,2233,4603,HCP,(m) 159,159,150,208,#N/A,1.3,13.31,0,23,0.0000003,CAS7440-58-6,+4,"Coster, Dirk & De Hevesy, George Charles",1923 -73,Tantalum,Ta,180.9479,,180.9479,Solid,Transition Metal,5,VB,6,[Xe] 4f14 5d3 6s2,4F3/2,7.5496,3017,5458,BCC,(m) 146,146,138,200,#N/A,1.5,16.65,31,57,0.00000013,CAS7440-25-7,+5,"Ekeberg, Anders Gustav",1802 -74,Tungsten,W,183.84,,183.84,Solid,Transition Metal,6,VIB,6,[Xe] 4f14 5d4 6s2,5D0,7.864,3422,5555,BCC,(m) 139,139,146,193,#N/A,2.36,19.25,78.6,170,0.00000005,CAS7440-33-7,+6,"Elhuyar, Juan José & Elhuyar, Fausto",1783 -75,Rhenium,Re,186.207,,186.207,Solid,Transition Metal,7,VIIB,6,[Xe] 4f14 5d5 6s2,6S5/2,7.8335,3186,5596,HCP,(m) 137,137,159,188,#N/A,1.9,21.02,14.5,48,0.00000018,CAS7440-15-5,"+4,67","Noddack, Walter & Berg, Otto Carl & Tacke, Ida",1925 -76,Osmium,Os,190.23,,190.23,Solid,Transition Metal,8,VIIIB,6,[Xe] 4f14 5d6 6s2,5D4,8.4382,3033,5012,HCP,(m) 135,135,128,185,#N/A,2.2,22.61,106.1,88,0.000000081,CAS7440-04-2,"+3,4","Tennant, Smithson",1803 -77,Iridium,Ir,192.217,,192.217,Solid,Transition Metal,9,VIIIB,6,[Xe] 4f14 5d7 6s2,4F9/2,8.967,2466,4428,FCC,(m) 136,136,137,180,#N/A,2.2,22.65,151,150,0.000000047,CAS7439-88-5,"+3,4","Tennant, Smithson",1803 -78,Platinum,Pt,195.078,,195.078,Solid,Transition Metal,10,VIIIB,6,[Xe] 4f14 5d9 6s1,3D3,8.9588,1768.3,3825,FCC,(m) 139,139,128,177,175,2.28,21.09,205.3,72,0.00000011,CAS7440-06-4,"+2,4","Ulloa, Antonio de",1735 -79,Gold,Au,196.96655,,196.96655,Solid,Transition Metal,11,IB,6,[Xe] 4f14 5d10 6s1,2S1/2,9.2255,1064.18,2856,FCC,(m) 144,144,144,174,166,2.54,19.3,222.8,320,0.000000022,CAS7440-57-5,"+1,3",unknown,ancient -80,Mercury,Hg,200.59,,200.59,Liquid,Transition Metal,12,IIB,6,[Xe] 4f14 5d10 6s2,1S0,10.4375,-38.83,356.73,§rhom.,(m) 151,151,149,171,155,2,13.534,#N/A,8.3,0.00000096,CAS7439-97-6,"+1,2",unknown,ancient -81,Thallium,Tl,204.3833,,204.3833,Solid,Poor Metal,13,IIIA,6,[Hg] 6p1,2P01/2,6.1082,304,1473,HCP,(m) 170,170,148,156,196,1.62,11.85,19.2,46,0.00000015,CAS7440-28-0,"+1,3","Crookes, William",1861 -82,Lead,Pb,207.2,,207.2,Solid,Poor Metal,14,IVA,6,[Hg] 6p2,3P0,7.4167,327.46,1749,FCC,(m) 175,175,147,154,202,2.33,11.34,35.1,35,0.00000021,CAS7439-92-1,"+2,4",unknown,ancient -83,Bismuth,Bi,208.98038,,208.98038,Solid,Poor Metal,15,VA,6,[Hg] 6p3,4S03/2,7.2855,271.3,1564,§rhom.,(v) 146,,146,143,207,2.02,9.78,91.2,8,0.0000013,CAS7440-69-9,"+3,5","Geoffroy, Claude ",ancient -84,Polonium,Po,209,x,(209),Solid,Metalloids,16,VIA,6,[Hg] 6p4,3P2,8.414,254,962,§cubic,,,#N/A,135,197,2,9.196,183.3,#N/A,0.00000043,CAS7440-08-6,"+2,4","Curie, Marie & Pierre",1898 -85,Astatine,At,210,x,(210),Solid,Halogen,17,VIIA,6,[Hg] 6p5,2P03/2,#N/A,302,#N/A,,,,#N/A,#N/A,202,2.2,#N/A,270.1,2,#N/A,CAS7440-68-8,,"Corson, Dale R. & Mackenzie, K. R.",1940 -86,Radon,Rn,222,x,(222),Gas,Noble Gas,18,VIIIA,6,[Hg] 6p6,1S0,10.7485,-71,-61.7,,(v) 145,,145,120,220,#N/A,9.73,#N/A,0.00361,#N/A,CAS10043-92-2,0,"Dorn, Friedrich Ernst",1900 -87,Francium,Fr,223,x,(223),Solid,Alkali Metal,1,IA,7,[Rn] 7s1,2S1/2,4.0727,#N/A,#N/A,,,,#N/A,#N/A,348,0.7,#N/A,#N/A,#N/A,#N/A,CAS7440-73-5,+1,"Perey, Marguerite",1939 -88,Radium,Ra,226,x,(226),Solid,Alkaline Earth Metal,2,IIA,7,[Rn] 7s2,1S0,5.2784,700,1737,BCC,,,#N/A,#N/A,283,0.9,5,#N/A,19,0.000001,CAS7440-14-4,+2,"Curie, Marie & Pierre",1898 -89,Actinium,Ac,227,x,(227),Solid,Rare Earth Metal,3,Actinides,7,[Rn] 6d1 7s2,2D3/2,5.17,1050,3200,FCC,,,#N/A,#N/A,#N/A,1.1,10.07,#N/A,12,#N/A,CAS7440-34-8,+3,"Debierne, André",1899 -90,Thorium,Th,232.0381,,232.0381,Solid,Rare Earth Metal,102,Actinides,7,[Rn] 6d2 7s2,3F2,6.3067,1750,4820,FCC,(m) 179,179,#N/A,#N/A,#N/A,1.3,11.724,#N/A,54,0.00000015,CAS7440-29-1,+4,"Berzelius, Jöns Jacob",1829 -91,Protactinium,Pa,231.03588,,231.03588,Solid,Rare Earth Metal,102,Actinides,7,[Rn] 5f2 6d1 7s2,4K11/2,5.89,1572,4000,§tetra,(m) 163,163,#N/A,#N/A,#N/A,1.5,15.37,#N/A,47,0.00000018,CAS7440-13-3,"+4,5","Göhring, Otto & Fajans, Kasimir",1913 -92,Uranium,U,238.02891,,238.02891,Solid,Rare Earth Metal,102,Actinides,7,[Rn] 5f3 6d1 7s2,5L°6,6.1941,1135,3927,BCO,(m) 156,156,#N/A,#N/A,186,1.38,19.05,#N/A,27,0.00000028,CAS7440-61-1,"+3,4,5,6","Klaproth, Martin Heinrich",1789 -93,Neptunium,Np,237,x,(237),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f4 6d1 7s2,6L11/2,6.2657,644,4000,SO,(m) 155,155,#N/A,#N/A,#N/A,1.36,20.45,#N/A,6,0.0000012,CAS7439-99-8,"+3,4,5,6","McMillan, Edwin M. & Abelson, Philip H.",1940 -94,Plutonium,Pu,244,x,(244),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f6 7s2,7F0,6.0260,640,3230,§mono.,(m) 159,159,#N/A,#N/A,#N/A,1.28,19.816,#N/A,6,0.0000015,CAS7440-07-5,"+3,4,5,6","Glenn T. Seaborg, Joseph W. Kennedy, Edward M. McMillan, Arthur C. Wohl",1940 -95,Americium,Am,243,x,(243),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f7 7s2,8S°7/2,5.9738,1176,2011,HCP,(m) 173,173,#N/A,#N/A,#N/A,1.3,#N/A,#N/A,10,#N/A,CAS7440-35-9,"+3,4,5,6","Glenn T. Seaborg, Ralph A. James, Leon O. Morgan, Albert Ghiorso",1944 -96,Curium,Cm,247,x,(247),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f7 6d 7s2,9D°2,5.9914,1345,3110,HCP,(m) 174,174,#N/A,#N/A,#N/A,1.3,13.51,#N/A,#N/A,#N/A,CAS7440-51-9,+3,"Glenn T. Seaborg, Ralph A. James, Albert Ghiorso",1944 -97,Berkelium,Bk,247,x,(247),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f9 7s2,6H°15/2,6.1979,1050,#N/A,hex,(m) 170,170,#N/A,#N/A,#N/A,1.3,14.78,#N/A,10,#N/A,CAS7440-40-6,"+3,4","Stanley G. Thompson, Glenn T. Seaborg, Kenneth Street, Jr., Albert Ghiorso",1949 -98,Californium,Cf,251,x,(251),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f10 7s2,5I8,6.2817,900,#N/A,hex,,,#N/A,#N/A,#N/A,1.3,15.1,#N/A,#N/A,#N/A,CAS7440-71-3,+3,"Stanley G. Thompson, Glenn T. Seaborg, Kenneth Street, Jr., Albert Ghiorso",1950 -99,Einsteinium,Es,252,x,(252),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f11 7s2,4I°15/2,6.42,860,#N/A,,,,#N/A,#N/A,#N/A,1.3,#N/A,#N/A,#N/A,#N/A,CAS7429-92-7,+3,Albert Ghiorso et. al.,1952 -100,Fermium,Fm,257,x,(257),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f12 7s2,3H6,6.5,1527,#N/A,,,,#N/A,#N/A,#N/A,1.3,#N/A,#N/A,#N/A,#N/A,CAS7440-72-4,+3,Albert Ghiorso et. al.,1952 -101,Mendelevium,Md,258,x,(258),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f13 7s2,2F°7/2,6.58,827,#N/A,,,,#N/A,#N/A,#N/A,1.3,#N/A,#N/A,#N/A,#N/A,CAS7440-11-1,"+2,3","Stanley G. Thompson, Glenn T. Seaborg, Bernard G. Harvey, Gregory R. Choppin, Albert Ghiorso",1955 -102,Nobelium,No,259,x,(259),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f14 7s2,1S0,6.65,827,#N/A,,,,#N/A,#N/A,#N/A,1.3,#N/A,#N/A,#N/A,#N/A,CAS10028-14-5,"+2,3","Albert Ghiorso, Glenn T. Seaborg, Torbørn Sikkeland, John R. Walton",1958 -103,Lawrencium,Lr,262,x,(262),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f14 7s2 7p ?,2P°1/2 ?,4.9 ?,1627,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS22537-19-5,+3,"Albert Ghiorso, Torbjørn Sikkeland, Almon E. Larsh, Robert M. Latimer",1961 -104,Rutherfordium,Rf,261,x,(261),Synthetic,Transition Metal,4,IVB,7,[Rn] 5f14 6d2 7s2 ?,3F2 ?,6.0 ?,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS53850-36-5,+4,"Scientists at Dubna, Russia (1964)/Albert Ghiorso et. al. (1969)",1964 -105,Dubnium,Db,262,x,(262),Synthetic,Transition Metal,5,VB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS53850-35-4,,"Scientists at Dubna, Russia (1967)/Lawrence Berkeley Laboratory (1970)",1967 -106,Seaborgium,Sg,266,x,(266),Synthetic,Transition Metal,6,VIB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54038-81-2,,Albert Ghiorso et. al.,1974 -107,Bohrium,Bh,264,x,(264),Synthetic,Transition Metal,7,VIIB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54037-14-8,,"Scientists at Dubna, Russia",1976 -108,Hassium,Hs,277,x,(277),Synthetic,Transition Metal,8,VIIIB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54037-57-9,,"Armbruster, Paula & Muenzenberg, Dr. Gottfried",1984 -109,Meitnerium,Mt,268,x,(268),Synthetic,Transition Metal,9,VIIIB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54038-01-6,,"Armbruster, Paula & Muenzenberg, Dr. Gottfried",1982 -110,Darmstadtium,Ds,281,x,(281),Synthetic,Transition Metal,10,VIIIB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54083-77-1,,"Armbruster, Paula & Muenzenberg, Dr. Gottfried",1994 -111,Roentgenium,Rg,272,x,(272),Synthetic,Transition Metal,11,IB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54386-24-2,,"Hofmann, Sigurd et. al.",1994 -112,Copernicium,Cn,285,x,(285),Synthetic,Transition Metal,12,IIB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54084-26-3,,"Armbruster, Paula & Muenzenberg, Dr. Gottfried",1996 -113,Ununtrium,Uut,#N/A,,#N/A,Synthetic,Transition Metal,13,IIIA,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54084-70-7,,Y. T. Oganessian et. al.,2004 -114,Ununquadium,Uuq,289,x,(289),Synthetic,Transition Metal,14,IVA,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54085-16-4,,"Scientists at Dubna, Russia",1998 -115,Ununpentium,Uup,#N/A,,#N/A,Synthetic,Transition Metal,,,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54085-64-2,,Y. T. Oganessian et. al.,2004 -116,Ununhexium,Uuh,292,x,(292),Synthetic,Transition Metal,16,VIA,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54100-71-9,,"Scientists at Dubna, Russia",2001 -117,Ununseptium,Uus,#N/A,,#N/A,Synthetic,Transition Metal,,,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS87658-56-8,,Yet to be produced,NA -118,Ununoctium,Uuo,#N/A,,#N/A,Synthetic,Transition Metal,,,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54144-19-3,,Y. T. Oganessian et. al.,2006 -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,References:,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,† NIST.gov,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,* Mathematica (references.wolfram.com),,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,Various including:,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,http://education.jlab.org/qa/discover_ele.html,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,http://www.lenntech.com/periodic-chart-elements/inventor-surname.htm,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,http://www.sciencegeek.net/tables/lbltable.pdf,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,http://ptable.com,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,http://en.wikipedia.org/wiki/Atomic_radii_of_the_elements_(data_page),,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,http://environmentalchemistry.com/yogi/periodic/crystal.html,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,http://www.periodictable.com,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/Website/excelinterop/tmp/periodic.csv b/Website/excelinterop/tmp/periodic.csv deleted file mode 100644 index 546cbfd..0000000 --- a/Website/excelinterop/tmp/periodic.csv +++ /dev/null @@ -1,131 +0,0 @@ -Atomic Number,Name,Symbol,† Atomic Weight,Atomic Weight Estimated,Atomic Weight Display,† Phase at STP,Type,Group,Group 2,Period,† Electron Configuration,Ground-state Level,† Ionization Energy (eV),* Melting Point (°C),* Boiling Point (°C),Crystal Structure,Atomic Radius (display),Metallic Radius (pm),* Covalent radius (pm),* Atomic Radius (calculated) (pm),"* Van der Waals Radius, (pm)",* Electro-negativity (Pauling),* Density (g/cm3),* Electron Affinity (kJ/mol),"* Thermal Conductivity, W/(m K)",* Electrical Resistivity (Ωm),* CAS Number,Possible Oxidation States,Discoverer,Discovery (Year) -1,Hydrogen,H,1.00794,,1.00794,Gas,Non Metal,1,IA,1,1s1,2S1/2,13.5984,-259.14,-252.87,hex,(v) 37,,37,53,120,2.2,0.0899,72.8,0.1805,#N/A,CAS1333-74-0,"+1,-1","Cavendish, Henry",1766 -2,Helium,He,4.002602,,4.002602,Gas,Noble Gas,18,VIIIA,1,1s2,1S0,24.5874,#N/A,-268.93,,(v) 32,,32,31,140,#N/A,0.1785,#N/A,0.1513,#N/A,CAS7440-59-7,0,"Ramsey, Sir William & Cleve, Per Teodor",1895 -3,Lithium,Li,6.941,,6.941,Solid,Alkali Metal,1,IA,2,[He] 2s1,2S1/2,5.3917,180.54,1342,BCC,(m) 152,152,134,167,182,0.98,0.535,59.6,85,0.000000094,CAS7439-93-2,+1,"Arfvedson, Johan August",1817 -4,Beryllium,Be,9.012182,,9.012182,Solid,Alkaline Earth Metal,2,IIA,2,[He] 2s2,1S0,9.3227,1287,2470,HCP,(m) 112,112,90,112,153,1.57,1.848,#N/A,190,0.00000004,CAS7440-41-7,+2,"Vauquelin, Nicholas Louis",1797 -5,Boron,B,10.811,,10.811,Solid,Metalloids,13,IIIA,2,[He] 2s2 2p1,2P°1/2,8.298,2075,4000,rhom.,(v) 82,,82,87,192,2.04,2.46,26.7,27,10000,CAS7440-42-8,+3,"Davy, Sir Humphry & Thénard, Louis-Jaques & Gay-Lussac, Louis-Joseph",1808 -6,Carbon,C,12.0107,,12.0107,Solid,Non Metal,14,IVA,2,[He] 2s2 2p2,3P0,11.2603,3550,4027,hex,(v) 77,,77,67,170,2.55,2.26,153.9,140,0.00001,CAS7440-44-0,"+2,4/-4",unknown,ancient -7,Nitrogen,N,14.0067,,14.0067,Gas,Non Metal,15,VA,2,[He] 2s2 2p3,4S°3/2,14.5341,-210.1,-195.79,hex,(v) 75,,75,56,155,3.04,1.251,7,0.02583,#N/A,CAS7727-37-9,"+1,2,3,4,5/-1,2,3","Rutherford, Daniel",1772 -8,Oxygen,O,15.9994,,15.9994,Gas,Non Metal,16,VIA,2,[He] 2s2 2p4,3P2,13.6181,-218.3,-182.9,§cubic,(v) 73,,73,48,152,3.44,1.429,141,0.02658,#N/A,CAS7782-44-7,-2,"Priestley, Joseph & Scheele, Carl Wilhelm",1774 -9,Fluorine,F,18.9984032,,18.9984032,Gas,Halogen,17,VIIA,2,[He] 2s2 2p5,2P°3/2,17.4228,-219.6,-188.12,§cubic,(v) 71,,71,42,147,3.98,1.696,328,0.0277,#N/A,CAS7782-41-4,-1,"Moissan, Henri",1886 -10,Neon,Ne,20.1797,,20.1797,Gas,Noble Gas,18,VIIIA,2,[He] 2s2 2p6,1S0,21.5645,-248.59,-246.08,FCC,(v) 69,,69,38,154,#N/A,0.9,#N/A,0.0491,#N/A,CAS7440-01-9,0,"Ramsay, William & Travers, Morris",1898 -11,Sodium,Na,22.98977,,22.98977,Solid,Alkali Metal,1,IA,3,[Ne] 3s1,2S1/2,5.1391,97.72,883,BCC,(m) 186,186,154,190,227,0.93,0.968,52.8,140,0.000000047,CAS7440-23-5,+1,"Davy, Sir Humphry",1807 -12,Magnesium,Mg,24.305,,24.305,Solid,Alkaline Earth Metal,2,IIA,3,[Ne] 3s2,1S0,7.6462,650,1090,HCP,(m) 160,160,130,145,173,1.31,1.738,#N/A,160,0.000000044,CAS7439-95-4,+2,"Black, Joseph",1755 -13,Aluminum,Al,26.981538,,26.981538,Solid,Poor Metal,13,IIIA,3,[Ne] 3s2 3p1,2P°1/2,5.9858,660.32,2519,FCC,(m) 143,143,118,118,184,1.61,2.7,42.5,235,0.000000026,CAS7429-90-5,+3,"Oersted, Hans Christian",1825 -14,Silicon,Si,28.0855,,28.0855,Solid,Metalloids,14,IVA,3,[Ne] 3s2 3p2,3P0,8.1517,1414,2900,cubic,(v) 111,,111,111,210,1.9,2.33,133.6,150,0.001,CAS7440-21-3,"+2,4/-4","Berzelius, Jöns Jacob",1824 -15,Phosphorus,P,30.97361,,30.97361,Solid,Non Metal,15,VA,3,[Ne] 3s2 3p3,4S°3/2,10.4867,44.2,280.5,§,(v) 106,,106,98,180,2.19,1.823,72,0.236,0.0000001,CAS7723-14-0,"+3,5/-3","Brandt, Hennig",1669 -16,Sulfur,S,32.065,,32.065,Solid,Non Metal,16,VIA,3,[Ne] 3s2 3p4,3P2,10.36,115.21,444.72,FCO,(v) 102,,102,88,180,2.58,1.96,200,0.205,#N/A,CAS7704-34-9,"+4,6/-2",unknown,ancient -17,Chlorine,Cl,35.453,,35.453,Gas,Halogen,17,VIIA,3,[Ne] 3s2 3p5,2P°3/2,12.9676,-101.5,-34.04,BCO,(v) 99,,99,79,175,3.16,3.214,349,0.0089,#N/A,CAS7782-50-5,"+1,5,7/-1","Scheele, Carl Wilhelm",1774 -18,Argon,Ar,39.948,,39.948,Gas,Noble Gas,18,VIIIA,3,[Ne] 3s2 3p6,1S0,15.7596,-189.3,-185.8,FCC,(v) 97,,97,71,188,#N/A,1.784,#N/A,0.01772,#N/A,CAS7440-37-1,0,"Ramsay, Sir William & Strutt, John (Lord Rayleigh)",1894 -19,Potassium,K,39.0983,,39.0983,Solid,Alkali Metal,1,IA,4,[Ar] 4s1,2S1/2,4.3407,63.38,759,BCC,(m) 227,227,196,243,275,0.82,0.856,48.4,100,0.00000007,CAS7440-09-7,+1,"Davy, Sir Humphry",1807 -20,Calcium,Ca,40.078,,40.078,Solid,Alkaline Earth Metal,2,IIA,4,[Ar] 4s2,1S0,6.1132,842,1484,FCC,(m) 197,197,174,194,231,1,1.55,2.37,200,0.000000034,CAS7440-70-2,+2,"Davy, Sir Humphry",1808 -21,Scandium,Sc,44.95591,,44.95591,Solid,Transition Metal,3,IIIB,4,[Ar] 3d1 4s2,2D3/2,6.5615,1541,2830,HCP,(m) 162,162,144,184,211,1.36,2.985,18.1,16,0.00000055,CAS7440-20-2,+3,"Nilson, Lars Fredrik",1879 -22,Titanium,Ti,47.867,,47.867,Solid,Transition Metal,4,IVB,4,[Ar] 3d2 4s2,3F2,6.8281,1668,3287,HCP,(m) 147,147,136,176,#N/A,1.54,4.507,7.6,22,0.0000004,CAS7440-32-6,"+2,3,4","Gregor, William",1791 -23,Vanadium,V,50.9415,,50.9415,Solid,Transition Metal,5,VB,4,[Ar] 3d3 4s2,4F3/2,6.7462,1910,3407,BCC,(m) 134,134,125,171,#N/A,1.63,6.11,50.6,31,0.0000002,CAS7440-62-2,"+2,3,4,5","Del Rio, Andrés Manuel (1801) & Sefström, Nils Gabriel (1830)",1801 -24,Chromium,Cr,51.9961,,51.9961,Solid,Transition Metal,6,VIB,4,[Ar] 3d5 4s1,7S3,6.7665,1907,2671,BCC,(m) 128,128,127,166,#N/A,1.66,7.14,64.3,94,0.00000013,CAS7440-47-3,"+2,3,6",Vauquelin,1797 -25,Manganese,Mn,54.938049,,54.938049,Solid,Transition Metal,7,VIIB,4,[Ar] 3d5 4s2,6S5/2,7.434,1246,2061,§cubic,(m) 127,127,139,161,#N/A,1.55,7.47,#N/A,7.8,0.0000016,CAS7439-96-5,"+2,3,4,7","Gahn, Johan Gottlieb",1774 -26,Iron,Fe,55.845,,55.845,Solid,Transition Metal,8,VIIIB,4,[Ar] 3d6 4s2,5D4,7.9024,1538,2861,BCC,(m) 126,126,125,156,#N/A,1.83,7.874,15.7,80,0.000000097,CAS7439-89-6,"+2,3",unknown,ancient -27,Cobalt,Co,58.9332,,58.9332,Solid,Transition Metal,9,VIIIB,4,[Ar] 3d7 4s2,4F9/2,7.881,1495,2927,HCP,(m) 125,125,126,152,#N/A,1.88,8.9,63.7,100,0.00000006,CAS7440-48-4,"+2,3","Brandt, Georg",1735 -28,Nickel,Ni,58.6934,,58.6934,Solid,Transition Metal,10,VIIIB,4,[Ar] 3d8 4s2,3F4,7.6398,1455,2913,FCC,(m) 124,124,121,149,163,1.91,8.908,112,91,0.00000007,CAS7440-02-0,"+2,3","Cronstedt, Alex Fredrik",1751 -29,Copper,Cu,63.546,,63.546,Solid,Transition Metal,11,IB,4,[Ar] 3d10 4s1,2S1/2,7.7264,1084.62,2927,FCC,(m) 128,128,138,145,140,1.9,8.92,118.4,400,0.000000017,CAS7440-50-8,"+1,2",unknown,ancient -30,Zinc,Zn,65.409,,65.409,Solid,Transition Metal,12,IIB,4,[Ar] 3d10 4s2,1S0,9.3942,419.53,907,§hex,(m) 134,134,131,142,139,1.65,7.14,#N/A,120,0.000000059,CAS7440-66-6,+2,unknown,ancient -31,Gallium,Ga,69.723,,69.723,Solid,Poor Metal,13,IIIA,4,[Ar] 3d10 4s2 4p1,2P°1/2,5.9993,29.76,2204,§BCO,(m) 135,135,126,136,187,1.81,5.904,28.9,29,0.00000014,CAS7440-55-3,+3,"Lecoq de Boisbaudran, Paul-Émile",1875 -32,Germanium,Ge,72.64,,72.64,Solid,Metalloids,14,IVA,4,[Ar] 3d10 4s2 4p2,3P0,7.8994,938.3,2820,§cubic,(v) 122,,122,125,211,2.01,5.323,119,60,0.0005,CAS7440-56-4,"+2,4","Winkler, Clemens A.",1886 -33,Arsenic,As,74.9216,,74.9216,Solid,Metalloids,15,VA,4,[Ar] 3d10 4s2 4p3,4S°3/2,9.7886,817,614,rhom.,(v) 119,,119,114,185,2.18,5.727,78,50,0.0000003,CAS7440-38-2,"+3,5/-3",unknown,ancient -34,Selenium,Se,78.96,,78.96,Solid,Non Metal,16,VIA,4,[Ar] 3d10 4s2 4p4,3P2,9.7524,221,685,§hex,(v) 116,,116,103,190,2.55,4.819,195,0.52,#N/A,CAS7782-49-2,"+4,6/-2","Berzelius, Jöns Jacob",1817 -35,Bromine,Br,79.904,,79.904,Liquid,Halogen,17,VIIA,4,[Ar] 3d10 4s2 4p5,2P°3/2,11.8138,-7.3,59,BCO,(v) 114,,114,94,185,2.96,3.12,324.6,0.12,#N/A,CAS7726-95-6,"+1,5/-1","Balard, Antoine-Jérôme",1826 -36,Krypton,Kr,83.798,,83.798,Gas,Noble Gas,18,VIIIA,4,[Ar] 3d10 4s2 4p6,1S0,13.9996,-157.36,-153.22,FCC,(v) 110,,110,88,202,3,3.75,#N/A,0.00943,#N/A,CAS7439-90-9,0,"Ramsay, Sir William & Travers, Morris",1898 -37,Rubidium,Rb,85.4678,,85.4678,Solid,Alkali Metal,1,IA,5,[Kr] 5s1,2S1/2,4.1771,39.31,688,BCC,(m) 248,248,211,265,303,0.82,1.532,46.9,58,0.00000012,CAS7440-17-7,+1,"Bunsen, Robert Wilhelm & Kirchhoff, Gustav Robert",1861 -38,Strontium,Sr,87.62,,87.62,Solid,Alkaline Earth Metal,2,IIA,5,[Kr] 5s2,1S0,5.6949,777,1382,FCC,(m) 215,215,192,219,249,0.95,2.63,5.03,35,0.00000013,CAS7440-24-6,+2,"Crawford, Adair",1790 -39,Yttrium,Y,88.90585,,88.90585,Solid,Transition Metal,3,IIIB,5,[Kr] 4d1 5s2,2D3/2,6.2173,1526,3345,HCP,(m) 180,180,162,212,#N/A,1.22,4.472,29.6,17,0.00000056,CAS7440-65-5,+3,"Gadolin, Johan",1789 -40,Zirconium,Zr,91.224,,91.224,Solid,Transition Metal,4,IVB,5,[Kr] 4d2 5s2,3F2,6.6339,1855,4409,HCP,(m) 160,160,148,206,#N/A,1.33,6.511,41.1,23,0.00000042,CAS7440-67-7,+4,"Klaproth, Martin Heinrich",1789 -41,Niobium,Nb,92.90638,,92.90638,Solid,Transition Metal,5,VB,5,[Kr] 4d4 5s1,6D1/2,6.7589,2477,4744,BCC,(m) 146,146,137,198,#N/A,1.6,8.57,86.1,54,0.00000015,CAS7440-03-1,"+3,5","Hatchet, Charles",1801 -42,Molybdenum,Mo,95.94,,95.94,Solid,Transition Metal,6,VIB,5,[Kr] 4d5 5s1,7S3,7.0924,2623,4639,BCC,(m) 139,139,145,190,#N/A,2.16,10.28,71.9,139,0.00000005,CAS7439-98-7,+6,"Scheele, Carl Welhelm",1778 -43,Technetium,Tc,98,x,(98),Synthetic,Transition Metal,7,VIIB,5,[Kr] 4d5 5s2,6S5/2,7.28,2157,4265,HCP,(m) 136,136,156,183,#N/A,1.9,11.5,53,51,0.0000002,CAS7440-26-8,"+4,7","Perrier, Carlo & Segrè, Emilio",1937 -44,Ruthenium,Ru,101.07,,101.07,Solid,Transition Metal,8,VIIIB,5,[Kr] 4d7 5s1,5F5,7.3605,2334,4150,HCP,(m) 134,134,126,178,#N/A,2.2,12.37,101.3,120,0.000000071,CAS7440-18-8,+3,"Klaus, Karl Karlovich",1844 -45,Rhodium,Rh,102.9055,,102.9055,Solid,Transition Metal,9,VIIIB,5,[Kr] 4d8 5s1,4F9/2,7.4589,1964,3695,FCC,(m) 134,134,135,173,#N/A,2.28,12.45,109.7,150,0.000000043,CAS7440-16-6,+3,"Wollaston, William Hyde",1803 -46,Palladium,Pd,106.42,,106.42,Solid,Transition Metal,10,VIIIB,5,[Kr] 4d10,1S0,8.3369,1554.9,2963,FCC,(m) 137,137,131,169,163,2.2,12.023,53.7,72,0.0000001,CAS7440-05-3,"+2,4","Wollaston, William Hyde",1803 -47,Silver,Ag,107.8682,,107.8682,Solid,Transition Metal,11,IB,5,[Kr] 4d10 5s1,2S1/2,7.5762,961.78,2162,FCC,(m) 144,144,153,165,172,1.93,10.49,125.6,430,0.000000016,CAS7440-22-4,+1,unknown,ancient -48,Cadmium,Cd,112.411,,112.411,Solid,Transition Metal,12,IIB,5,[Kr] 4d10 5s2,1S0,8.9938,321.07,767,§hex,(m) 151,151,148,161,158,1.69,8.65,#N/A,97,0.00000007,CAS7440-43-9,+2,"Stromeyer, Prof. Friedrich",1817 -49,Indium,In,114.818,,114.818,Solid,Poor Metal,13,IIIA,5,[Kr] 4d10 5s2 5p1,2P°1/2,5.7864,156.6,2072,§tetra.,(m) 167,167,144,156,193,1.78,7.31,28.9,82,0.00000008,CAS7440-74-6,+3,"Reich, Ferdinand & Richter, Hieronymus",1863 -50,Tin,Sn,118.71,,118.71,Solid,Poor Metal,14,IVA,5,[Kr] 4d10 5s2 5p2,3P0,7.3439,231.93,2602,§tetra.,(v) 141,,141,145,217,1.96,7.31,107.3,67,0.00000011,CAS7440-31-5,"+2,4",unknown,ancient -51,Antimony,Sb,121.76,,121.76,Solid,Metalloids,15,VA,5,[Kr] 4d10 5s2 5p3,4S°3/2,8.6084,630.63,1587,§rhom.,(v) 138,,138,133,206,2.05,6.697,103.2,24,0.0000004,CAS7440-36-0,"+3,5/-3",unknown,ancient -52,Tellurium,Te,127.6,,127.6,Solid,Metalloids,16,VIA,5,[Kr] 4d10 5s2 5p4,3P2,9.0096,449.51,988,hex,(v) 135,,135,123,206,2.1,6.24,190.2,3,0.0001,CAS13494-80-9,"+4,6/-2","Müller von Reichenstein, Franz Joseph",1782 -53,Iodine,I,126.90447,,126.90447,Solid,Halogen,17,VIIA,5,[Kr] 4d10 5s2 5p5,2P°3/2,10.4513,113.7,184.3,BCO,(v) 133,,133,115,198,2.66,4.94,295.2,0.449,#N/A,CAS7553-56-2,"+1,5,7/-1","Courtois, Bernard",1811 -54,Xenon,Xe,131.293,,131.293,Gas,Noble Gas,18,VIIIA,5,[Kr] 4d10 5s2 5p6,1S0,12.1298,-111.8,-108,FCC,(v) 130,,130,108,216,2.6,5.9,#N/A,0.00565,#N/A,CAS7440-63-3,0,"Ramsay, William & Travers, Morris William",1898 -55,Cesium,Cs,132.90545,,132.90545,Solid,Alkali Metal,1,IA,6,[Xe] 6s1,2S1/2,3.8939,28.44,671,BCC,(m) 265,265,225,298,343,0.79,1.879,45.5,36,0.0000002,CAS7440-46-2,+1,"Kirchhoff, Gustav & Bunsen, Robert",1860 -56,Barium,Ba,137.327,,137.327,Solid,Alkaline Earth Metal,2,IIA,6,[Xe] 6s2,1S0,5.2117,727,1870,BCC,(m) 222,222,198,253,268,0.89,3.51,13.95,18,0.00000035,CAS7440-39-3,+2,"Davy, Sir Humphry",1808 -57,Lanthanum,La,138.9055,,138.9055,Solid,Rare Earth Metal,3,Lanthanides,6,[Xe] 5d1 6s2,2D3/2,5.5769,920,3464,§hex,(m) 187,187,169,#N/A,#N/A,1.1,6.146,48,13,0.00000061,CAS7439-91-0,+3,"Mosander, Carl Gustav",1839 -58,Cerium,Ce,140.116,,140.116,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f1 5d1 6s2,1G°4,5.5387,798,3360,FCC,(m) 182,182,#N/A,#N/A,#N/A,1.12,6.689,50,11,0.00000074,CAS7440-45-1,"+3,4","Hisinger, Wilhelm & Berzelius, Jöns Jacob/Klaproth, Martin Heinrich",1803 -59,Praseodymium,Pr,140.90765,,140.90765,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f3 6s2,4I°9/2,5.473,931,3290,§hex,(m) 182,182,#N/A,247,#N/A,1.13,6.64,50,13,0.0000007,CAS7440-10-0,+3,"Von Welsbach, Baron Auer",1885 -60,Neodymium,Nd,144.24,,144.24,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f4 6s2,5I4,5.525,1021,3100,§hex,(m) 181,181,#N/A,206,#N/A,1.14,7.01,50,17,0.00000064,CAS7440-00-8,+3,"Von Welsbach, Baron Auer",1885 -61,Promethium,Pm,145,x,(145),Synthetic,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f5 6s2,6H°5/2,5.582,1100,3000,HCP,(m) 183,183,#N/A,205,#N/A,#N/A,7.264,50,15,0.00000075,CAS7440-12-2,+3,"Marinsky, Jacob A. & Coryell, Charles D. & Glendenin, Lawerence. E.",1944 -62,Samarium,Sm,150.36,,150.36,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f6 6s2,7F0,5.6437,1072,1803,§hex,(m) 180,180,#N/A,238,#N/A,1.17,7.353,50,13,0.00000094,CAS7440-19-9,"+2,3","Lecoq de Boisbaudran, Paul-Émile",1879 -63,Europium,Eu,151.964,,151.964,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f7 6s2,8S°7/2,5.6704,822,1527,BCC,(m) 180,180,#N/A,231,#N/A,#N/A,5.244,50,14,0.0000009,CAS7440-53-1,"+2,3","Demarçay, Eugène-Antole",1901 -64,Gadolinium,Gd,157.25,,157.25,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f7 5d1 6s2,9D°2,6.1498,1313,3250,HCP,(m) 180,180,#N/A,233,#N/A,1.2,7.901,50,11,0.0000013,CAS7440-54-2,+3,"De Marignac, Charles Galissard",1880 -65,Terbium,Tb,158.92534,,158.92534,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f9 6s2,6H°15/2,5.8638,1356,3230,HCP,(m) 177,177,#N/A,225,#N/A,#N/A,8.219,50,11,0.0000012,CAS7440-27-9,+3,"Mosander, Carl Gustav",1843 -66,Dysprosium,Dy,162.5,,162.5,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f10 6s2,5I8,5.9389,1412,2567,HCP,(m) 178,178,#N/A,228,#N/A,1.22,8.551,50,11,0.00000091,CAS7429-91-6,+3,"Lecoq de Boisbaudran, Paul-Émile",1886 -67,Holmium,Ho,164.93032,,164.93032,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f11 6s2,4I°15/2,6.0215,1474,2700,HCP,(m) 176,176,#N/A,#N/A,#N/A,1.23,8.795,50,16,0.00000094,CAS7440-60-0,+3,"Cleve, Per Theodor",1879 -68,Erbium,Er,167.259,,167.259,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f12 6s2,3H6,6.1077,1497,2868,HCP,(m) 176,176,#N/A,226,#N/A,1.24,9.066,50,15,0.00000086,CAS7440-52-0,+3,"Mosander, Carl Gustav",1842 -69,Thulium,Tm,168.93421,,168.93421,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f13 6s2,2F°7/2,6.1843,1545,1950,HCP,(m) 176,176,#N/A,222,#N/A,1.25,9.321,50,17,0.0000007,CAS7440-30-4,+3,"Cleve, Per Teodor",1879 -70,Ytterbium,Yb,173.04,,173.04,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f14 6s2,1S0,6.2542,819,1196,FCC,(m) 176,176,#N/A,222,#N/A,#N/A,6.57,50,39,0.00000028,CAS7440-64-4,"+2,3","De Marignac, Jean Charles Galissard",1878 -71,Lutetium,Lu,174.967,,174.967,Solid,Rare Earth Metal,101,Lanthanides,6,[Xe] 4f14 5d1 6s2,2D3/2,5.4259,1663,3402,HCP,(m) 174,174,160,217,#N/A,1.27,9.841,50,16,0.00000056,CAS7439-94-3,+3,"Urbain, Georges",1907 -72,Hafnium,Hf,178.49,,178.49,Solid,Transition Metal,4,IVB,6,[Xe] 4f14 5d2 6s2,3F2,6.8251,2233,4603,HCP,(m) 159,159,150,208,#N/A,1.3,13.31,0,23,0.0000003,CAS7440-58-6,+4,"Coster, Dirk & De Hevesy, George Charles",1923 -73,Tantalum,Ta,180.9479,,180.9479,Solid,Transition Metal,5,VB,6,[Xe] 4f14 5d3 6s2,4F3/2,7.5496,3017,5458,BCC,(m) 146,146,138,200,#N/A,1.5,16.65,31,57,0.00000013,CAS7440-25-7,+5,"Ekeberg, Anders Gustav",1802 -74,Tungsten,W,183.84,,183.84,Solid,Transition Metal,6,VIB,6,[Xe] 4f14 5d4 6s2,5D0,7.864,3422,5555,BCC,(m) 139,139,146,193,#N/A,2.36,19.25,78.6,170,0.00000005,CAS7440-33-7,+6,"Elhuyar, Juan José & Elhuyar, Fausto",1783 -75,Rhenium,Re,186.207,,186.207,Solid,Transition Metal,7,VIIB,6,[Xe] 4f14 5d5 6s2,6S5/2,7.8335,3186,5596,HCP,(m) 137,137,159,188,#N/A,1.9,21.02,14.5,48,0.00000018,CAS7440-15-5,"+4,67","Noddack, Walter & Berg, Otto Carl & Tacke, Ida",1925 -76,Osmium,Os,190.23,,190.23,Solid,Transition Metal,8,VIIIB,6,[Xe] 4f14 5d6 6s2,5D4,8.4382,3033,5012,HCP,(m) 135,135,128,185,#N/A,2.2,22.61,106.1,88,0.000000081,CAS7440-04-2,"+3,4","Tennant, Smithson",1803 -77,Iridium,Ir,192.217,,192.217,Solid,Transition Metal,9,VIIIB,6,[Xe] 4f14 5d7 6s2,4F9/2,8.967,2466,4428,FCC,(m) 136,136,137,180,#N/A,2.2,22.65,151,150,0.000000047,CAS7439-88-5,"+3,4","Tennant, Smithson",1803 -78,Platinum,Pt,195.078,,195.078,Solid,Transition Metal,10,VIIIB,6,[Xe] 4f14 5d9 6s1,3D3,8.9588,1768.3,3825,FCC,(m) 139,139,128,177,175,2.28,21.09,205.3,72,0.00000011,CAS7440-06-4,"+2,4","Ulloa, Antonio de",1735 -79,Gold,Au,196.96655,,196.96655,Solid,Transition Metal,11,IB,6,[Xe] 4f14 5d10 6s1,2S1/2,9.2255,1064.18,2856,FCC,(m) 144,144,144,174,166,2.54,19.3,222.8,320,0.000000022,CAS7440-57-5,"+1,3",unknown,ancient -80,Mercury,Hg,200.59,,200.59,Liquid,Transition Metal,12,IIB,6,[Xe] 4f14 5d10 6s2,1S0,10.4375,-38.83,356.73,§rhom.,(m) 151,151,149,171,155,2,13.534,#N/A,8.3,0.00000096,CAS7439-97-6,"+1,2",unknown,ancient -81,Thallium,Tl,204.3833,,204.3833,Solid,Poor Metal,13,IIIA,6,[Hg] 6p1,2P01/2,6.1082,304,1473,HCP,(m) 170,170,148,156,196,1.62,11.85,19.2,46,0.00000015,CAS7440-28-0,"+1,3","Crookes, William",1861 -82,Lead,Pb,207.2,,207.2,Solid,Poor Metal,14,IVA,6,[Hg] 6p2,3P0,7.4167,327.46,1749,FCC,(m) 175,175,147,154,202,2.33,11.34,35.1,35,0.00000021,CAS7439-92-1,"+2,4",unknown,ancient -83,Bismuth,Bi,208.98038,,208.98038,Solid,Poor Metal,15,VA,6,[Hg] 6p3,4S03/2,7.2855,271.3,1564,§rhom.,(v) 146,,146,143,207,2.02,9.78,91.2,8,0.0000013,CAS7440-69-9,"+3,5","Geoffroy, Claude ",ancient -84,Polonium,Po,209,x,(209),Solid,Metalloids,16,VIA,6,[Hg] 6p4,3P2,8.414,254,962,§cubic,,,#N/A,135,197,2,9.196,183.3,#N/A,0.00000043,CAS7440-08-6,"+2,4","Curie, Marie & Pierre",1898 -85,Astatine,At,210,x,(210),Solid,Halogen,17,VIIA,6,[Hg] 6p5,2P03/2,#N/A,302,#N/A,,,,#N/A,#N/A,202,2.2,#N/A,270.1,2,#N/A,CAS7440-68-8,,"Corson, Dale R. & Mackenzie, K. R.",1940 -86,Radon,Rn,222,x,(222),Gas,Noble Gas,18,VIIIA,6,[Hg] 6p6,1S0,10.7485,-71,-61.7,,(v) 145,,145,120,220,#N/A,9.73,#N/A,0.00361,#N/A,CAS10043-92-2,0,"Dorn, Friedrich Ernst",1900 -87,Francium,Fr,223,x,(223),Solid,Alkali Metal,1,IA,7,[Rn] 7s1,2S1/2,4.0727,#N/A,#N/A,,,,#N/A,#N/A,348,0.7,#N/A,#N/A,#N/A,#N/A,CAS7440-73-5,+1,"Perey, Marguerite",1939 -88,Radium,Ra,226,x,(226),Solid,Alkaline Earth Metal,2,IIA,7,[Rn] 7s2,1S0,5.2784,700,1737,BCC,,,#N/A,#N/A,283,0.9,5,#N/A,19,0.000001,CAS7440-14-4,+2,"Curie, Marie & Pierre",1898 -89,Actinium,Ac,227,x,(227),Solid,Rare Earth Metal,3,Actinides,7,[Rn] 6d1 7s2,2D3/2,5.17,1050,3200,FCC,,,#N/A,#N/A,#N/A,1.1,10.07,#N/A,12,#N/A,CAS7440-34-8,+3,"Debierne, André",1899 -90,Thorium,Th,232.0381,,232.0381,Solid,Rare Earth Metal,102,Actinides,7,[Rn] 6d2 7s2,3F2,6.3067,1750,4820,FCC,(m) 179,179,#N/A,#N/A,#N/A,1.3,11.724,#N/A,54,0.00000015,CAS7440-29-1,+4,"Berzelius, Jöns Jacob",1829 -91,Protactinium,Pa,231.03588,,231.03588,Solid,Rare Earth Metal,102,Actinides,7,[Rn] 5f2 6d1 7s2,4K11/2,5.89,1572,4000,§tetra,(m) 163,163,#N/A,#N/A,#N/A,1.5,15.37,#N/A,47,0.00000018,CAS7440-13-3,"+4,5","Göhring, Otto & Fajans, Kasimir",1913 -92,Uranium,U,238.02891,,238.02891,Solid,Rare Earth Metal,102,Actinides,7,[Rn] 5f3 6d1 7s2,5L°6,6.1941,1135,3927,BCO,(m) 156,156,#N/A,#N/A,186,1.38,19.05,#N/A,27,0.00000028,CAS7440-61-1,"+3,4,5,6","Klaproth, Martin Heinrich",1789 -93,Neptunium,Np,237,x,(237),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f4 6d1 7s2,6L11/2,6.2657,644,4000,SO,(m) 155,155,#N/A,#N/A,#N/A,1.36,20.45,#N/A,6,0.0000012,CAS7439-99-8,"+3,4,5,6","McMillan, Edwin M. & Abelson, Philip H.",1940 -94,Plutonium,Pu,244,x,(244),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f6 7s2,7F0,6.0260,640,3230,§mono.,(m) 159,159,#N/A,#N/A,#N/A,1.28,19.816,#N/A,6,0.0000015,CAS7440-07-5,"+3,4,5,6","Glenn T. Seaborg, Joseph W. Kennedy, Edward M. McMillan, Arthur C. Wohl",1940 -95,Americium,Am,243,x,(243),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f7 7s2,8S°7/2,5.9738,1176,2011,HCP,(m) 173,173,#N/A,#N/A,#N/A,1.3,#N/A,#N/A,10,#N/A,CAS7440-35-9,"+3,4,5,6","Glenn T. Seaborg, Ralph A. James, Leon O. Morgan, Albert Ghiorso",1944 -96,Curium,Cm,247,x,(247),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f7 6d 7s2,9D°2,5.9914,1345,3110,HCP,(m) 174,174,#N/A,#N/A,#N/A,1.3,13.51,#N/A,#N/A,#N/A,CAS7440-51-9,+3,"Glenn T. Seaborg, Ralph A. James, Albert Ghiorso",1944 -97,Berkelium,Bk,247,x,(247),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f9 7s2,6H°15/2,6.1979,1050,#N/A,hex,(m) 170,170,#N/A,#N/A,#N/A,1.3,14.78,#N/A,10,#N/A,CAS7440-40-6,"+3,4","Stanley G. Thompson, Glenn T. Seaborg, Kenneth Street, Jr., Albert Ghiorso",1949 -98,Californium,Cf,251,x,(251),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f10 7s2,5I8,6.2817,900,#N/A,hex,,,#N/A,#N/A,#N/A,1.3,15.1,#N/A,#N/A,#N/A,CAS7440-71-3,+3,"Stanley G. Thompson, Glenn T. Seaborg, Kenneth Street, Jr., Albert Ghiorso",1950 -99,Einsteinium,Es,252,x,(252),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f11 7s2,4I°15/2,6.42,860,#N/A,,,,#N/A,#N/A,#N/A,1.3,#N/A,#N/A,#N/A,#N/A,CAS7429-92-7,+3,Albert Ghiorso et. al.,1952 -100,Fermium,Fm,257,x,(257),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f12 7s2,3H6,6.5,1527,#N/A,,,,#N/A,#N/A,#N/A,1.3,#N/A,#N/A,#N/A,#N/A,CAS7440-72-4,+3,Albert Ghiorso et. al.,1952 -101,Mendelevium,Md,258,x,(258),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f13 7s2,2F°7/2,6.58,827,#N/A,,,,#N/A,#N/A,#N/A,1.3,#N/A,#N/A,#N/A,#N/A,CAS7440-11-1,"+2,3","Stanley G. Thompson, Glenn T. Seaborg, Bernard G. Harvey, Gregory R. Choppin, Albert Ghiorso",1955 -102,Nobelium,No,259,x,(259),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f14 7s2,1S0,6.65,827,#N/A,,,,#N/A,#N/A,#N/A,1.3,#N/A,#N/A,#N/A,#N/A,CAS10028-14-5,"+2,3","Albert Ghiorso, Glenn T. Seaborg, Torbørn Sikkeland, John R. Walton",1958 -103,Lawrencium,Lr,262,x,(262),Synthetic,Rare Earth Metal,102,Actinides,7,[Rn] 5f14 7s2 7p ?,2P°1/2 ?,4.9 ?,1627,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS22537-19-5,+3,"Albert Ghiorso, Torbjørn Sikkeland, Almon E. Larsh, Robert M. Latimer",1961 -104,Rutherfordium,Rf,261,x,(261),Synthetic,Transition Metal,4,IVB,7,[Rn] 5f14 6d2 7s2 ?,3F2 ?,6.0 ?,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS53850-36-5,+4,"Scientists at Dubna, Russia (1964)/Albert Ghiorso et. al. (1969)",1964 -105,Dubnium,Db,262,x,(262),Synthetic,Transition Metal,5,VB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS53850-35-4,,"Scientists at Dubna, Russia (1967)/Lawrence Berkeley Laboratory (1970)",1967 -106,Seaborgium,Sg,266,x,(266),Synthetic,Transition Metal,6,VIB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54038-81-2,,Albert Ghiorso et. al.,1974 -107,Bohrium,Bh,264,x,(264),Synthetic,Transition Metal,7,VIIB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54037-14-8,,"Scientists at Dubna, Russia",1976 -108,Hassium,Hs,277,x,(277),Synthetic,Transition Metal,8,VIIIB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54037-57-9,,"Armbruster, Paula & Muenzenberg, Dr. Gottfried",1984 -109,Meitnerium,Mt,268,x,(268),Synthetic,Transition Metal,9,VIIIB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54038-01-6,,"Armbruster, Paula & Muenzenberg, Dr. Gottfried",1982 -110,Darmstadtium,Ds,281,x,(281),Synthetic,Transition Metal,10,VIIIB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54083-77-1,,"Armbruster, Paula & Muenzenberg, Dr. Gottfried",1994 -111,Roentgenium,Rg,272,x,(272),Synthetic,Transition Metal,11,IB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54386-24-2,,"Hofmann, Sigurd et. al.",1994 -112,Copernicium,Cn,285,x,(285),Synthetic,Transition Metal,12,IIB,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54084-26-3,,"Armbruster, Paula & Muenzenberg, Dr. Gottfried",1996 -113,Ununtrium,Uut,#N/A,,#N/A,Synthetic,Transition Metal,13,IIIA,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54084-70-7,,Y. T. Oganessian et. al.,2004 -114,Ununquadium,Uuq,289,x,(289),Synthetic,Transition Metal,14,IVA,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54085-16-4,,"Scientists at Dubna, Russia",1998 -115,Ununpentium,Uup,#N/A,,#N/A,Synthetic,Transition Metal,,,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54085-64-2,,Y. T. Oganessian et. al.,2004 -116,Ununhexium,Uuh,292,x,(292),Synthetic,Transition Metal,16,VIA,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54100-71-9,,"Scientists at Dubna, Russia",2001 -117,Ununseptium,Uus,#N/A,,#N/A,Synthetic,Transition Metal,,,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS87658-56-8,,Yet to be produced,NA -118,Ununoctium,Uuo,#N/A,,#N/A,Synthetic,Transition Metal,,,7,, ,#N/A,#N/A,#N/A,,,,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,#N/A,CAS54144-19-3,,Y. T. Oganessian et. al.,2006 -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,References:,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,† NIST.gov,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,* Mathematica (references.wolfram.com),,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,Various including:,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,http://education.jlab.org/qa/discover_ele.html,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,http://www.lenntech.com/periodic-chart-elements/inventor-surname.htm,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,http://www.sciencegeek.net/tables/lbltable.pdf,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,http://ptable.com,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,http://en.wikipedia.org/wiki/Atomic_radii_of_the_elements_(data_page),,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,http://environmentalchemistry.com/yogi/periodic/crystal.html,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,http://www.periodictable.com,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/Website/excelinterop/tmp/perpetual-calendar.xls b/Website/excelinterop/tmp/perpetual-calendar.xls deleted file mode 100644 index da299ac..0000000 Binary files a/Website/excelinterop/tmp/perpetual-calendar.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/pricequote.xls b/Website/excelinterop/tmp/pricequote.xls deleted file mode 100644 index 5b5c284..0000000 Binary files a/Website/excelinterop/tmp/pricequote.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/printable-daily-planner.csv b/Website/excelinterop/tmp/printable-daily-planner.csv deleted file mode 100644 index 8da470d..0000000 --- a/Website/excelinterop/tmp/printable-daily-planner.csv +++ /dev/null @@ -1,62 +0,0 @@ -,,,,Printable Daily Planner,,,,,,, -More Calendars,,,,,,,,,© 2009 Vertex42 LLC,,This template is designed to help you print daily planner pages. -,,,,,,,,,,,"If you enter info on this worksheet, it will not change when you" -,,Date:,14/02/2010,,,,,,,,change the date (this spreadsheet isn't that sophisticated). -,,,,,,,,,,, -14,,,"February, 2010",,,,,,,, -,,,,,,,,,,, -,,,Sunday,,,,,,,, -,,,,,,,,,,, -Valentines Day,,,,W06-7,,,,,,, -,,,,,,,,,,, -,,,,,,,,,,, -,,,,,,,,,,, -Remember,,,,,,,Appointments,,Notes,, -Mom&Dad's Anniversary,,,,,7,:00,,,,, -Birthdays: Ted & Mary,,,,,,:30,,,,, -,,,,,8,:00,,,,, -,,,,,,:15,,,,, -,,,,,,:30,,,,, -,,,,,,:45,,,,, -,,,,,9,:00,,,,, -,,,,,,:15,,,,, -,,,,,,:30,,,,, -,,,,,,:45,,,,, -,,,,,10,:00,,,,, -þ,ABC,Prioritized Task List,,,,:15,,,,, -,,,,,,:30,,,,, -,,,,,,:45,,,,, -,,,,,11,:00,,,,, -,,,,,,:15,,,,, -,,,,,,:30,,,,, -,,,,,,:45,,,,, -,,,,,12,:00,,,,, -,,,,,,:15,,,,, -,,,,,,:30,,,,, -,,,,,,:45,,,,, -,,,,,1,:00,,,,, -,,,,,,:15,,,,, -,,,,,,:30,,,,, -,,,,,,:45,,,,, -,,,,,2,:00,,,,, -,,,,,,:15,,,,, -,,,,,,:30,,,,, -Time,,People to Call,,,,:45,,,,, -,,,,,3,:00,,,,, -,,,,,,:15,,,,, -,,,,,,:30,,,,, -,,,,,,:45,,,,, -,,,,,4,:00,,,,, -,,,,,,:15,,,,, -,,,,,,:30,,,,, -,,,,,,:45,,,,, -,,,,,5,:00,,,,, -$Amt,,Expenses,,,,:30,,,,, -,,,,,6,:00,,,,, -,,,,,,:30,,,,, -,,,,,7,:00,,,,, -,,,,,,:30,,,,, -,,,,,8,:00,,,,, -,,,,,,:30,,,,, -,,,,,9,:00,,,,, -,,,,,,:30,,,,, diff --git a/Website/excelinterop/tmp/printable-daily-planner.xls b/Website/excelinterop/tmp/printable-daily-planner.xls deleted file mode 100644 index ba0f479..0000000 Binary files a/Website/excelinterop/tmp/printable-daily-planner.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/proforma-invoice.xls b/Website/excelinterop/tmp/proforma-invoice.xls deleted file mode 100644 index 80adc36..0000000 Binary files a/Website/excelinterop/tmp/proforma-invoice.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/pv_fv.xls b/Website/excelinterop/tmp/pv_fv.xls deleted file mode 100644 index e69de29..0000000 diff --git a/Website/excelinterop/tmp/ratio_anlys.xls b/Website/excelinterop/tmp/ratio_anlys.xls deleted file mode 100644 index 36918ee..0000000 Binary files a/Website/excelinterop/tmp/ratio_anlys.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/rent-receipt.xls b/Website/excelinterop/tmp/rent-receipt.xls deleted file mode 100644 index fa2a82b..0000000 Binary files a/Website/excelinterop/tmp/rent-receipt.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/sales-receipt.xls b/Website/excelinterop/tmp/sales-receipt.xls deleted file mode 100644 index 1ce7521..0000000 Binary files a/Website/excelinterop/tmp/sales-receipt.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/salesreceipt.xls b/Website/excelinterop/tmp/salesreceipt.xls deleted file mode 100644 index d66fe70..0000000 Binary files a/Website/excelinterop/tmp/salesreceipt.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/sheet.xls b/Website/excelinterop/tmp/sheet.xls deleted file mode 100644 index 372b10e..0000000 Binary files a/Website/excelinterop/tmp/sheet.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/sign-in-form.xls b/Website/excelinterop/tmp/sign-in-form.xls deleted file mode 100644 index 1ecbd50..0000000 Binary files a/Website/excelinterop/tmp/sign-in-form.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/simple-loan-calculator.xls b/Website/excelinterop/tmp/simple-loan-calculator.xls deleted file mode 100644 index 8a3a06f..0000000 Binary files a/Website/excelinterop/tmp/simple-loan-calculator.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/t.csv b/Website/excelinterop/tmp/t.csv deleted file mode 100644 index df1b0fc..0000000 --- a/Website/excelinterop/tmp/t.csv +++ /dev/null @@ -1,69 +0,0 @@ -,Information from Form W-2,,,,,,,,,,,,, -,< Enter Your Name Here >,Employer #1,Employer #2,Employer #3,Employer #4,Total,Excess,,No. of Employers,Maximum SS Tax Earnings,,,, -1,"Wages, tips, other compensation",,,,,0.00,,,0,"106,800.00",0,0,0,0 -2,Federal income tax withheld,,,,,0.00,,,2011,4.2%,,,, -3,Social security wages,,,,,0.00,,,Max. SS Tax,,,,, -4,Social security tax withheld,,,,,0.00,0.00,,"4,485.60",0,0,0,0,0 -5,Medicare wages and tips,,,,,0.00,,,,,,,, -6,Medicare tax withheld,,,,,0.00,,,,,,,, -7,Social Security Tips,,,,,0.00,,,,,,,, -8,Allocated Tips,,,,,0.00,,,,,,,, -9,Advance EIC payment,,,,,0.00,,,,,,,, -10,Dependent Care Benefits,,,,,0.00,,,,,,,, -11,Nonqualified plans,,,,,0.00,,,,,,,, -12a,See instructions for box 12,,,,,0.00,,,,,,,, -12b,,,,,,0.00,,,,,,,, -12c,,,,,,0.00,,,,,,,, -12d,,,,,,0.00,,,,,,,, -13,Stat Emp / Retire / 3rd Party Sick,,,,,0.00,,,,,,,, -14,Other,,,,,0.00,,,,,,,, -16,"State wages, tips, etc. ",,,,,0.00,,,,,,,, -17,State income tax withheld,,,,,0.00,,,,,,,, -18,"Local wages, tips, etc.",,,,,0.00,,,,,,,, -19,Local income tax withheld,,,,,0.00,,,,,,,, -,,,,,,,,,,,,,, -,< Enter Spouse's Name Here >,Employer #1,Employer #2,Employer #3,Employer #4,Total,Excess,,No. of Employers,,,,, -1,"Wages, tips, other compensation",,,,,0.00,,,0,,0,0,0,0 -2,Federal income tax withheld,,,,,0.00,,,,,,,, -3,Social security wages,,,,,0.00,,,,,,,, -4,Social security tax withheld,,,,,0.00,0.00,,,0,0,0,0,0 -5,Medicare wages and tips,,,,,0.00,,,,,,,, -6,Medicare tax withheld,,,,,0.00,,,,,,,, -7,Social Security Tips,,,,,0.00,,,,,,,, -8,Allocated Tips,,,,,0.00,,,,,,,, -9,Advance EIC payment,,,,,0.00,,,,,,,, -10,Dependent Care Benefits,,,,,0.00,,,,,,,, -11,Nonqualified plans,,,,,0.00,,,,,,,, -12a,See instructions for box 12,,,,,0.00,,,,,,,, -12b,,,,,,0.00,,,,,,,, -12c,,,,,,0.00,,,,,,,, -12d,,,,,,0.00,,,,,,,, -13,Stat Emp / Retire / 3rd Party Sick,,,,,0.00,,,,,,,, -14,Other,,,,,0.00,,,,,,,, -16,"State wages, tips, etc. ",,,,,0.00,,,,,,,, -17,State income tax withheld,,,,,0.00,,,,,,,, -18,"Local wages, tips, etc.",,,,,0.00,,,,,,,, -19,Local income tax withheld,,,,,0.00,,,,,,,, -,,,,,,,,,,,,,, -,TOTALs,TOTALs,,,,,,,,,,,, -1,"Wages, tips, other compensation",0.00,,,,,,,,,,,, -2,Federal income tax withheld,0.00,,,,,,,,,,,, -3,Social security wages,0.00,,,,,,,,,,,, -4,Social security tax withheld,0.00,,,,,0.00,,,,,,, -5,Medicare wages and tips,0.00,,,,,,,,,,,, -6,Medicare tax withheld,0.00,,,,,,,,,,,, -7,Social Security Tips,0.00,,,,,,,,,,,, -8,Allocated Tips,0.00,,,,,,,,,,,, -9,Advance EIC payment,0.00,,,,,,,,,,,, -10,Dependent Care Benefits,0.00,,,,,,,,,,,, -11,Nonqualified plans,0.00,,,,,,,,,,,, -12a,See instructions for box 12,0.00,,,,,,,,,,,, -12b,,0.00,,,,,,,,,,,, -12c,,0.00,,,,,,,,,,,, -12d,,0.00,,,,,,,,,,,, -13,Stat Emp / Retire / 3rd Party Sick,0.00,,,,,,,,,,,, -14,Other,0.00,,,,,,,,,,,, -16,"State wages, tips, etc. ",0.00,,,,,,,,,,,, -17,State income tax withheld,0.00,,,,,,,,,,,, -18,"Local wages, tips, etc.",0.00,,,,,,,,,,,, -19,Local income tax withheld,0.00,,,,,,,,,,,, \ No newline at end of file diff --git a/Website/excelinterop/tmp/ta.xls b/Website/excelinterop/tmp/ta.xls deleted file mode 100644 index ac46053..0000000 Binary files a/Website/excelinterop/tmp/ta.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/tab.xls b/Website/excelinterop/tmp/tab.xls deleted file mode 100644 index 993ee5f..0000000 Binary files a/Website/excelinterop/tmp/tab.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/tac.xls b/Website/excelinterop/tmp/tac.xls deleted file mode 100644 index 0223c50..0000000 Binary files a/Website/excelinterop/tmp/tac.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/tad.xls b/Website/excelinterop/tmp/tad.xls deleted file mode 100644 index 4267974..0000000 Binary files a/Website/excelinterop/tmp/tad.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/tax.xls b/Website/excelinterop/tmp/tax.xls deleted file mode 100644 index 4ec9504..0000000 Binary files a/Website/excelinterop/tmp/tax.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/tax1.csv b/Website/excelinterop/tmp/tax1.csv deleted file mode 100644 index 3194a85..0000000 Binary files a/Website/excelinterop/tmp/tax1.csv and /dev/null differ diff --git a/Website/excelinterop/tmp/taxationsuite copy.xls b/Website/excelinterop/tmp/taxationsuite copy.xls deleted file mode 100644 index 4ec9504..0000000 Binary files a/Website/excelinterop/tmp/taxationsuite copy.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/taxationsuite.xls b/Website/excelinterop/tmp/taxationsuite.xls deleted file mode 100644 index 3fddb7e..0000000 Binary files a/Website/excelinterop/tmp/taxationsuite.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/taxsuite.xls b/Website/excelinterop/tmp/taxsuite.xls deleted file mode 100644 index 9ed4c92..0000000 Binary files a/Website/excelinterop/tmp/taxsuite.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/taxw2.xls b/Website/excelinterop/tmp/taxw2.xls deleted file mode 100644 index 9e63f7e..0000000 Binary files a/Website/excelinterop/tmp/taxw2.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/time-tracking-template.xlsx b/Website/excelinterop/tmp/time-tracking-template.xlsx deleted file mode 100644 index 5ec6618..0000000 Binary files a/Website/excelinterop/tmp/time-tracking-template.xlsx and /dev/null differ diff --git a/Website/excelinterop/tmp/time.xlsx b/Website/excelinterop/tmp/time.xlsx deleted file mode 100644 index 5ec6618..0000000 Binary files a/Website/excelinterop/tmp/time.xlsx and /dev/null differ diff --git a/Website/excelinterop/tmp/timesheet-with-breaks-in-minutes.xls b/Website/excelinterop/tmp/timesheet-with-breaks-in-minutes.xls deleted file mode 100644 index 9bd3971..0000000 Binary files a/Website/excelinterop/tmp/timesheet-with-breaks-in-minutes.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/tmp (11) copy.html b/Website/excelinterop/tmp/tmp (11) copy.html deleted file mode 100644 index eda20b0..0000000 --- a/Website/excelinterop/tmp/tmp (11) copy.html +++ /dev/null @@ -1 +0,0 @@ -
        
      Instructions
        
        
      Household Budget lets you create the budgeted entries for your income and expenses including but not limited to housing, food, transportation, clothes and personal services, healthcare, entertainment, education, contributions and debt payments, and their sub-categories, on a monthly and yearly basis.
       
      You can also set goals to manage your budget on a monthly, quarterly, half-yearly or yearly basis. Further, you can create what-if scenarios for your income and expenses to better manage and plan your finances.
        
      How to use the Household Budget application? 
      Open the default file. 
      Click on the Income tab and enter the budgeted entries. 
      Click on the Expenses Tab and enter the expenses for different categories. 
      Click on the Summary Tab. 
      Graphically visualize different kinds of expenses incurred to the total monthly expense, and how your monthly and annual savings change with the addition of income and expenses.  
      Click on the Goals Tab. 
      Enter the Goal description, amount, term (in months) for a respective goal number. Monthly and weekly goal values are automatically calculated for you. 
      Enter the different steps/ways to achieve the goal in "How to Achieve" section. 
        
      How to fill entries in the Expenses tab? 
      Click on the Expenses Tab. 
      Enter the monthly budget values for the different expense fields under the respective categories and subcategories. 
      Generally, the editable field have a cell border for entering their respective values. Clicking on the cell opens an input box.  
      Yearly values are automatically calculated for you. 
      You can edit or modify "other" for adding more expense fields or you can add them in the existing expense fields by modifying their names, and adding them together under one common heading. 
      Example - Cable and Dish expense is clubbed under TV-Cable, Dish, Other under Utilities expense category. 
      Visualize the contribution of the different categories of expense to the total expense through pie chart by clicking on the Summary Tab. 
    \ No newline at end of file diff --git a/Website/excelinterop/tmp/tmp.b b/Website/excelinterop/tmp/tmp.b deleted file mode 100644 index 18e30d2..0000000 --- a/Website/excelinterop/tmp/tmp.b +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":1,"currentid":"sheet1","currentname":"sheet1","sheetArr":{"sheet1":{"sheetstr":{"savestr":"version:1.5\nsheet:c:1:r:1\n"},"name":"sheet1","hidden":"0"}}} \ No newline at end of file diff --git a/Website/excelinterop/tmp/tmp.csv b/Website/excelinterop/tmp/tmp.csv deleted file mode 100644 index 5cc99fd..0000000 --- a/Website/excelinterop/tmp/tmp.csv +++ /dev/null @@ -1,2 +0,0 @@ -"12","" -"","manas" diff --git a/Website/excelinterop/tmp/tmp.html b/Website/excelinterop/tmp/tmp.html deleted file mode 100644 index c938d4b..0000000 --- a/Website/excelinterop/tmp/tmp.html +++ /dev/null @@ -1 +0,0 @@ -
    12
    \ No newline at end of file diff --git a/Website/excelinterop/tmp/tmp.msc.txt b/Website/excelinterop/tmp/tmp.msc.txt deleted file mode 100644 index 6ed3ffa..0000000 --- a/Website/excelinterop/tmp/tmp.msc.txt +++ /dev/null @@ -1 +0,0 @@ -{"numsheets":8,"currentid":"sheet1","currentname":"budget1","sheetArr":{"sheet1":{"sheetstr":{"savestr":"version:1.5\ncell:B1:t:ledger:tvf:2:ntvf:2\ncell:B2:t:Ledger:b:1:1:1:1:f:1:cf:1:colspan:4\ncell:A4:b::1::\ncell:B4:t:Date 2016:b:1:1:1:1:cf:1\ncell:C4:t:Details:b:1:1:1:1:cf:1\ncell:D4:t:Credit , Debit:b:1:1:1:1:cf:1\ncell:E4:t:Balance:b:1:1:1:1:cf:1\ncell:A5:b::1::\ncell:B5:b::1::1:ntvf:3\ncell:C5:t:Initial Balance:b::1::1:colspan:2\ncell:D5:b::1::1:ntvf:1\ncell:E5:b:1:1:1:1:ntvf:1\ncell:A6:b::1::\ncell:B6:b::1::1:bg:1:ntvf:3\ncell:C6:b::1::1:bg:1\ncell:D6:b::1::1:bg:1:ntvf:1\ncell:E6:vtf:t::IF(OR(E5=\"\",D6=\"\"),\"\",D6+E5):b::1::1:bg:1:ntvf:1\ncell:A7:b::1::\ncell:B7:b::1::1:ntvf:3\ncell:C7:b::1::1\ncell:D7:b::1::1:ntvf:1\ncell:E7:vtf:t::IF(OR(E6=\"\",D7=\"\"),\"\",D7+E6):b::1::1:ntvf:1\ncell:A8:b::1::\ncell:B8:b::1::1:bg:1:ntvf:3\ncell:C8:b::1::1:bg:1\ncell:D8:b::1::1:bg:1:ntvf:1\ncell:E8:vtf:t::IF(OR(E7=\"\",D8=\"\"),\"\",D8+E7):b::1::1:bg:1:ntvf:1\ncell:A9:b::1::\ncell:B9:b::1::1:ntvf:3\ncell:C9:b::1::1\ncell:D9:b::1::1:ntvf:1\ncell:E9:vtf:t::IF(OR(E8=\"\",D9=\"\"),\"\",D9+E8):b::1::1:ntvf:1\ncell:A10:b::1::\ncell:B10:b::1::1:bg:1:ntvf:3\ncell:C10:b::1::1:bg:1\ncell:D10:b::1::1:bg:1:ntvf:1\ncell:E10:vtf:t::IF(OR(E9=\"\",D10=\"\"),\"\",D10+E9):b::1::1:bg:1:ntvf:1\ncell:A11:b::1::\ncell:B11:b::1::1:ntvf:3\ncell:C11:b::1::1\ncell:D11:b::1::1:ntvf:1\ncell:E11:vtf:t::IF(OR(E10=\"\",D11=\"\"),\"\",D11+E10):b::1::1:ntvf:1\ncell:A12:b::1::\ncell:B12:b::1::1:bg:1:ntvf:3\ncell:C12:b::1::1:bg:1\ncell:D12:b::1::1:bg:1:ntvf:1\ncell:E12:vtf:t::IF(OR(E11=\"\",D12=\"\"),\"\",D12+E11):b::1::1:bg:1:ntvf:1\ncell:A13:b::1::\ncell:B13:b::1::1:ntvf:3\ncell:C13:b::1::1\ncell:D13:b::1::1:ntvf:1\ncell:E13:vtf:t::IF(OR(E12=\"\",D13=\"\"),\"\",D13+E12):b::1::1:ntvf:1\ncell:A14:b::1::\ncell:B14:b::1::1:bg:1:ntvf:3\ncell:C14:b::1::1:bg:1\ncell:D14:b::1::1:bg:1:ntvf:1\ncell:E14:vtf:t::IF(OR(E13=\"\",D14=\"\"),\"\",D14+E13):b::1::1:bg:1:ntvf:1\ncell:A15:b::1::\ncell:B15:b::1::1:ntvf:3\ncell:C15:b::1::1\ncell:D15:b::1::1:ntvf:1\ncell:E15:vtf:t::IF(OR(E14=\"\",D15=\"\"),\"\",D15+E14):b::1::1:ntvf:1\ncell:A16:b::1::\ncell:B16:b::1::1:bg:1:ntvf:3\ncell:C16:b::1::1:bg:1\ncell:D16:b::1::1:bg:1:ntvf:1\ncell:E16:vtf:t::IF(OR(E15=\"\",D16=\"\"),\"\",D16+E15):b::1::1:bg:1:ntvf:1\ncell:A17:b::1::\ncell:B17:b::1::1:ntvf:3\ncell:C17:b::1::1\ncell:D17:b::1::1:ntvf:1\ncell:E17:vtf:t::IF(OR(E16=\"\",D17=\"\"),\"\",D17+E16):b::1::1:ntvf:1\ncell:A18:b::1::\ncell:B18:b::1::1:bg:1:ntvf:3\ncell:C18:b::1::1:bg:1\ncell:D18:b::1::1:bg:1:ntvf:1\ncell:E18:vtf:t::IF(OR(E17=\"\",D18=\"\"),\"\",D18+E17):b::1::1:bg:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:ntvf:3\ncell:C19:b::1::1\ncell:D19:b::1::1:ntvf:1\ncell:E19:vtf:t::IF(OR(E18=\"\",D19=\"\"),\"\",D19+E18):b::1::1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:bg:1:ntvf:3\ncell:C20:b::1::1:bg:1\ncell:D20:b::1::1:bg:1:ntvf:1\ncell:E20:vtf:t::IF(OR(E19=\"\",D20=\"\"),\"\",D20+E19):b::1::1:bg:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:ntvf:3\ncell:C21:b::1::1\ncell:D21:b::1::1:ntvf:1\ncell:E21:vtf:t::IF(OR(E20=\"\",D21=\"\"),\"\",D21+E20):b::1::1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:bg:1:ntvf:3\ncell:C22:b::1::1:bg:1\ncell:D22:b::1::1:bg:1:ntvf:1\ncell:E22:vtf:t::IF(OR(E21=\"\",D22=\"\"),\"\",D22+E21):b::1::1:bg:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:ntvf:3\ncell:C23:b::1::1\ncell:D23:b::1::1:ntvf:1\ncell:E23:vtf:t::IF(OR(E22=\"\",D23=\"\"),\"\",D23+E22):b::1::1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:bg:1:ntvf:3\ncell:C24:b::1::1:bg:1\ncell:D24:b::1::1:bg:1:ntvf:1\ncell:E24:vtf:t::IF(OR(E23=\"\",D24=\"\"),\"\",D24+E23):b::1::1:bg:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:ntvf:3\ncell:C25:b::1::1\ncell:D25:b::1::1:ntvf:1\ncell:E25:vtf:t::IF(OR(E24=\"\",D25=\"\"),\"\",D25+E24):b::1::1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:bg:1:ntvf:3\ncell:C26:b::1::1:bg:1\ncell:D26:b::1::1:bg:1:ntvf:1\ncell:E26:vtf:t::IF(OR(E25=\"\",D26=\"\"),\"\",D26+E25):b::1::1:bg:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:ntvf:3\ncell:C27:b::1::1\ncell:D27:b::1::1:ntvf:1\ncell:E27:vtf:t::IF(OR(E26=\"\",D27=\"\"),\"\",D27+E26):b::1::1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:bg:1:ntvf:3\ncell:C28:b::1::1:bg:1\ncell:D28:b::1::1:bg:1:ntvf:1\ncell:E28:vtf:t::IF(OR(E27=\"\",D28=\"\"),\"\",D28+E27):b::1::1:bg:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:ntvf:3\ncell:C29:b::1::1\ncell:D29:b::1::1:ntvf:1\ncell:E29:vtf:t::IF(OR(E28=\"\",D29=\"\"),\"\",D29+E28):b::1::1:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:bg:1:ntvf:3\ncell:C30:b::1::1:bg:1\ncell:D30:b::1::1:bg:1:ntvf:1\ncell:E30:vtf:t::IF(OR(E29=\"\",D30=\"\"),\"\",D30+E29):b::1::1:bg:1:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:ntvf:3\ncell:C31:b::1::1\ncell:D31:b::1::1:ntvf:1\ncell:E31:vtf:t::IF(OR(E30=\"\",D31=\"\"),\"\",D31+E30):b::1::1:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:bg:1:ntvf:3\ncell:C32:b::1::1:bg:1\ncell:D32:b::1::1:bg:1:ntvf:1\ncell:E32:vtf:t::IF(OR(E31=\"\",D32=\"\"),\"\",D32+E31):b::1::1:bg:1:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:ntvf:3\ncell:C33:b::1::1\ncell:D33:b::1::1:ntvf:1\ncell:E33:vtf:t::IF(OR(E32=\"\",D33=\"\"),\"\",D33+E32):b::1::1:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:bg:1:ntvf:3\ncell:C34:b::1::1:bg:1\ncell:D34:b::1::1:bg:1:ntvf:1\ncell:E34:vtf:t::IF(OR(E33=\"\",D34=\"\"),\"\",D34+E33):b::1::1:bg:1:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:ntvf:3\ncell:C35:b::1:1:1\ncell:D35:b::1:1:1:ntvf:1\ncell:E35:vtf:t::IF(OR(E34=\"\",D35=\"\"),\"\",D35+E34):b::1:1:1:ntvf:1\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncol:A:w:10\ncol:B:w:43\ncol:C:w:62\ncol:D:w:66\ncol:E:w:63\nsheet:c:5:r:36:font:2:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(221,221,221)\nfont:1:* 12pt *\nfont:2:* 9pt arial,helvetica,sans-serif\nlayout:1:padding:2px 2px 2px 2px;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:hidden\nvalueformat:3:m/d/yy\n"},"name":"budget1","hidden":"0"},"sheet2":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Ledger:b:1:1:1:1:f:1:cf:1:colspan:4\ncell:A4:b::1::\ncell:B4:t:Date 2016:b:1:1:1:1:cf:1\ncell:C4:t:Details:b:1:1:1:1:cf:1\ncell:D4:t:Credit , Debit:b:1:1:1:1:cf:1\ncell:E4:t:Balance:b:1:1:1:1:cf:1\ncell:A5:b::1::\ncell:B5:b::1::1:ntvf:2\ncell:C5:t:Forwarded Balance:b::1::1:colspan:2\ncell:D5:b::1::1:ntvf:1\ncell:E5:vtf:t::budget1!E35:b:1:1:1:1:ntvf:1\ncell:A6:b::1::\ncell:B6:b::1::1:bg:1:ntvf:2\ncell:C6:b::1::1:bg:1\ncell:D6:b::1::1:bg:1:ntvf:1\ncell:E6:vtf:t::IF(OR(E5=\"\",D6=\"\"),\"\",D6+E5):b::1::1:bg:1:ntvf:1\ncell:A7:b::1::\ncell:B7:b::1::1:ntvf:2\ncell:C7:b::1::1\ncell:D7:b::1::1:ntvf:1\ncell:E7:vtf:t::IF(OR(E6=\"\",D7=\"\"),\"\",D7+E6):b::1::1:ntvf:1\ncell:A8:b::1::\ncell:B8:b::1::1:bg:1:ntvf:2\ncell:C8:b::1::1:bg:1\ncell:D8:b::1::1:bg:1:ntvf:1\ncell:E8:vtf:t::IF(OR(E7=\"\",D8=\"\"),\"\",D8+E7):b::1::1:bg:1:ntvf:1\ncell:A9:b::1::\ncell:B9:b::1::1:ntvf:2\ncell:C9:b::1::1\ncell:D9:b::1::1:ntvf:1\ncell:E9:vtf:t::IF(OR(E8=\"\",D9=\"\"),\"\",D9+E8):b::1::1:ntvf:1\ncell:A10:b::1::\ncell:B10:b::1::1:bg:1:ntvf:2\ncell:C10:b::1::1:bg:1\ncell:D10:b::1::1:bg:1:ntvf:1\ncell:E10:vtf:t::IF(OR(E9=\"\",D10=\"\"),\"\",D10+E9):b::1::1:bg:1:ntvf:1\ncell:A11:b::1::\ncell:B11:b::1::1:ntvf:2\ncell:C11:b::1::1\ncell:D11:b::1::1:ntvf:1\ncell:E11:vtf:t::IF(OR(E10=\"\",D11=\"\"),\"\",D11+E10):b::1::1:ntvf:1\ncell:A12:b::1::\ncell:B12:b::1::1:bg:1:ntvf:2\ncell:C12:b::1::1:bg:1\ncell:D12:b::1::1:bg:1:ntvf:1\ncell:E12:vtf:t::IF(OR(E11=\"\",D12=\"\"),\"\",D12+E11):b::1::1:bg:1:ntvf:1\ncell:A13:b::1::\ncell:B13:b::1::1:ntvf:2\ncell:C13:b::1::1\ncell:D13:b::1::1:ntvf:1\ncell:E13:vtf:t::IF(OR(E12=\"\",D13=\"\"),\"\",D13+E12):b::1::1:ntvf:1\ncell:A14:b::1::\ncell:B14:b::1::1:bg:1:ntvf:2\ncell:C14:b::1::1:bg:1\ncell:D14:b::1::1:bg:1:ntvf:1\ncell:E14:vtf:t::IF(OR(E13=\"\",D14=\"\"),\"\",D14+E13):b::1::1:bg:1:ntvf:1\ncell:A15:b::1::\ncell:B15:b::1::1:ntvf:2\ncell:C15:b::1::1\ncell:D15:b::1::1:ntvf:1\ncell:E15:vtf:t::IF(OR(E14=\"\",D15=\"\"),\"\",D15+E14):b::1::1:ntvf:1\ncell:A16:b::1::\ncell:B16:b::1::1:bg:1:ntvf:2\ncell:C16:b::1::1:bg:1\ncell:D16:b::1::1:bg:1:ntvf:1\ncell:E16:vtf:t::IF(OR(E15=\"\",D16=\"\"),\"\",D16+E15):b::1::1:bg:1:ntvf:1\ncell:A17:b::1::\ncell:B17:b::1::1:ntvf:2\ncell:C17:b::1::1\ncell:D17:b::1::1:ntvf:1\ncell:E17:vtf:t::IF(OR(E16=\"\",D17=\"\"),\"\",D17+E16):b::1::1:ntvf:1\ncell:A18:b::1::\ncell:B18:b::1::1:bg:1:ntvf:2\ncell:C18:b::1::1:bg:1\ncell:D18:b::1::1:bg:1:ntvf:1\ncell:E18:vtf:t::IF(OR(E17=\"\",D18=\"\"),\"\",D18+E17):b::1::1:bg:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:ntvf:2\ncell:C19:b::1::1\ncell:D19:b::1::1:ntvf:1\ncell:E19:vtf:t::IF(OR(E18=\"\",D19=\"\"),\"\",D19+E18):b::1::1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:bg:1:ntvf:2\ncell:C20:b::1::1:bg:1\ncell:D20:b::1::1:bg:1:ntvf:1\ncell:E20:vtf:t::IF(OR(E19=\"\",D20=\"\"),\"\",D20+E19):b::1::1:bg:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:ntvf:2\ncell:C21:b::1::1\ncell:D21:b::1::1:ntvf:1\ncell:E21:vtf:t::IF(OR(E20=\"\",D21=\"\"),\"\",D21+E20):b::1::1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:bg:1:ntvf:2\ncell:C22:b::1::1:bg:1\ncell:D22:b::1::1:bg:1:ntvf:1\ncell:E22:vtf:t::IF(OR(E21=\"\",D22=\"\"),\"\",D22+E21):b::1::1:bg:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:ntvf:2\ncell:C23:b::1::1\ncell:D23:b::1::1:ntvf:1\ncell:E23:vtf:t::IF(OR(E22=\"\",D23=\"\"),\"\",D23+E22):b::1::1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:bg:1:ntvf:2\ncell:C24:b::1::1:bg:1\ncell:D24:b::1::1:bg:1:ntvf:1\ncell:E24:vtf:t::IF(OR(E23=\"\",D24=\"\"),\"\",D24+E23):b::1::1:bg:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:ntvf:2\ncell:C25:b::1::1\ncell:D25:b::1::1:ntvf:1\ncell:E25:vtf:t::IF(OR(E24=\"\",D25=\"\"),\"\",D25+E24):b::1::1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:bg:1:ntvf:2\ncell:C26:b::1::1:bg:1\ncell:D26:b::1::1:bg:1:ntvf:1\ncell:E26:vtf:t::IF(OR(E25=\"\",D26=\"\"),\"\",D26+E25):b::1::1:bg:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:ntvf:2\ncell:C27:b::1::1\ncell:D27:b::1::1:ntvf:1\ncell:E27:vtf:t::IF(OR(E26=\"\",D27=\"\"),\"\",D27+E26):b::1::1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:bg:1:ntvf:2\ncell:C28:b::1::1:bg:1\ncell:D28:b::1::1:bg:1:ntvf:1\ncell:E28:vtf:t::IF(OR(E27=\"\",D28=\"\"),\"\",D28+E27):b::1::1:bg:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:ntvf:2\ncell:C29:b::1::1\ncell:D29:b::1::1:ntvf:1\ncell:E29:vtf:t::IF(OR(E28=\"\",D29=\"\"),\"\",D29+E28):b::1::1:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:bg:1:ntvf:2\ncell:C30:b::1::1:bg:1\ncell:D30:b::1::1:bg:1:ntvf:1\ncell:E30:vtf:t::IF(OR(E29=\"\",D30=\"\"),\"\",D30+E29):b::1::1:bg:1:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:ntvf:2\ncell:C31:b::1::1\ncell:D31:b::1::1:ntvf:1\ncell:E31:vtf:t::IF(OR(E30=\"\",D31=\"\"),\"\",D31+E30):b::1::1:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:bg:1:ntvf:2\ncell:C32:b::1::1:bg:1\ncell:D32:b::1::1:bg:1:ntvf:1\ncell:E32:vtf:t::IF(OR(E31=\"\",D32=\"\"),\"\",D32+E31):b::1::1:bg:1:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:ntvf:2\ncell:C33:b::1::1\ncell:D33:b::1::1:ntvf:1\ncell:E33:vtf:t::IF(OR(E32=\"\",D33=\"\"),\"\",D33+E32):b::1::1:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:bg:1:ntvf:2\ncell:C34:b::1::1:bg:1\ncell:D34:b::1::1:bg:1:ntvf:1\ncell:E34:vtf:t::IF(OR(E33=\"\",D34=\"\"),\"\",D34+E33):b::1::1:bg:1:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:ntvf:2\ncell:C35:b::1:1:1\ncell:D35:b::1:1:1:ntvf:1\ncell:E35:vtf:t::IF(OR(E34=\"\",D35=\"\"),\"\",D35+E34):b::1:1:1:ntvf:1\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncol:A:w:10\ncol:B:w:45\ncol:C:w:68\ncol:D:w:62\ncol:E:w:63\nrow:1:h:14.25\nrow:2:h:15.75\nrow:3:h:14.25\nrow:4:h:15.75\nrow:5:h:15.75\nrow:6:h:15.75\nrow:7:h:15.75\nrow:8:h:15.75\nrow:9:h:15.75\nrow:10:h:15.75\nrow:11:h:15.75\nrow:12:h:15.75\nrow:13:h:15.75\nrow:14:h:15.75\nrow:15:h:15.75\nrow:16:h:15.75\nrow:17:h:15.75\nrow:18:h:15.75\nrow:19:h:15.75\nrow:20:h:15.75\nrow:21:h:15.75\nrow:22:h:15.75\nrow:23:h:15.75\nrow:24:h:15.75\nrow:25:h:15.75\nrow:26:h:15.75\nrow:27:h:15.75\nrow:28:h:15.75\nrow:29:h:15.75\nrow:30:h:15.75\nrow:31:h:15.75\nrow:32:h:15.75\nrow:33:h:15.75\nrow:34:h:15.75\nrow:35:h:15.75\nrow:36:h:15.75\nrow:37:h:15.75\nrow:38:h:15.75\nrow:39:h:15.75\nrow:40:h:15.75\nrow:41:h:15.75\nrow:42:h:15.75\nrow:43:h:15.75\nrow:44:h:15.75\nrow:45:h:15.75\nrow:46:h:15.75\nrow:47:h:15.75\nrow:48:h:15.75\nrow:49:h:15.75\nrow:50:h:15.75\nrow:51:h:15.75\nrow:52:h:15.75\nrow:53:h:15.75\nrow:54:h:15.75\nrow:55:h:15.75\nrow:56:h:15.75\nrow:57:h:15.75\nrow:58:h:15.75\nrow:59:h:15.75\nrow:60:h:15.75\nrow:61:h:15.75\nrow:62:h:14.25\nrow:64:h:14.25\nsheet:c:5:r:64:h:12:font:2:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(221,221,221)\nfont:1:* 12pt *\nfont:2:* 9pt arial,helvetica,sans-serif\nlayout:1:padding:2px 2px 2px 2px;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:m/d/yy\n"},"name":"budget2","hidden":"0"},"sheet3":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Ledger:b:1:1:1:1:f:1:cf:1:colspan:4\ncell:A4:b::1::\ncell:B4:t:Date 2016:b:1:1:1:1:cf:1\ncell:C4:t:Details:b:1:1:1:1:cf:1\ncell:D4:t:Credit , Debit:b:1:1:1:1:cf:1\ncell:E4:t:Balance:b:1:1:1:1:cf:1\ncell:A5:b::1::\ncell:B5:b::1::1:ntvf:2\ncell:C5:t:Forwarded Balance:b::1::1:colspan:2\ncell:D5:b::1::1:ntvf:1\ncell:E5:vtf:t::budget2!E35:b:1:1:1:1:ntvf:1\ncell:A6:b::1::\ncell:B6:b::1::1:bg:1:ntvf:2\ncell:C6:b::1::1:bg:1\ncell:D6:b::1::1:bg:1:ntvf:1\ncell:E6:vtf:t::IF(OR(E5=\"\",D6=\"\"),\"\",D6+E5):b::1::1:bg:1:ntvf:1\ncell:A7:b::1::\ncell:B7:b::1::1:ntvf:2\ncell:C7:b::1::1\ncell:D7:b::1::1:ntvf:1\ncell:E7:vtf:t::IF(OR(E6=\"\",D7=\"\"),\"\",D7+E6):b::1::1:ntvf:1\ncell:A8:b::1::\ncell:B8:b::1::1:bg:1:ntvf:2\ncell:C8:b::1::1:bg:1\ncell:D8:b::1::1:bg:1:ntvf:1\ncell:E8:vtf:t::IF(OR(E7=\"\",D8=\"\"),\"\",D8+E7):b::1::1:bg:1:ntvf:1\ncell:A9:b::1::\ncell:B9:b::1::1:ntvf:2\ncell:C9:b::1::1\ncell:D9:b::1::1:ntvf:1\ncell:E9:vtf:t::IF(OR(E8=\"\",D9=\"\"),\"\",D9+E8):b::1::1:ntvf:1\ncell:A10:b::1::\ncell:B10:b::1::1:bg:1:ntvf:2\ncell:C10:b::1::1:bg:1\ncell:D10:b::1::1:bg:1:ntvf:1\ncell:E10:vtf:t::IF(OR(E9=\"\",D10=\"\"),\"\",D10+E9):b::1::1:bg:1:ntvf:1\ncell:A11:b::1::\ncell:B11:b::1::1:ntvf:2\ncell:C11:b::1::1\ncell:D11:b::1::1:ntvf:1\ncell:E11:vtf:t::IF(OR(E10=\"\",D11=\"\"),\"\",D11+E10):b::1::1:ntvf:1\ncell:A12:b::1::\ncell:B12:b::1::1:bg:1:ntvf:2\ncell:C12:b::1::1:bg:1\ncell:D12:b::1::1:bg:1:ntvf:1\ncell:E12:vtf:t::IF(OR(E11=\"\",D12=\"\"),\"\",D12+E11):b::1::1:bg:1:ntvf:1\ncell:A13:b::1::\ncell:B13:b::1::1:ntvf:2\ncell:C13:b::1::1\ncell:D13:b::1::1:ntvf:1\ncell:E13:vtf:t::IF(OR(E12=\"\",D13=\"\"),\"\",D13+E12):b::1::1:ntvf:1\ncell:A14:b::1::\ncell:B14:b::1::1:bg:1:ntvf:2\ncell:C14:b::1::1:bg:1\ncell:D14:b::1::1:bg:1:ntvf:1\ncell:E14:vtf:t::IF(OR(E13=\"\",D14=\"\"),\"\",D14+E13):b::1::1:bg:1:ntvf:1\ncell:A15:b::1::\ncell:B15:b::1::1:ntvf:2\ncell:C15:b::1::1\ncell:D15:b::1::1:ntvf:1\ncell:E15:vtf:t::IF(OR(E14=\"\",D15=\"\"),\"\",D15+E14):b::1::1:ntvf:1\ncell:A16:b::1::\ncell:B16:b::1::1:bg:1:ntvf:2\ncell:C16:b::1::1:bg:1\ncell:D16:b::1::1:bg:1:ntvf:1\ncell:E16:vtf:t::IF(OR(E15=\"\",D16=\"\"),\"\",D16+E15):b::1::1:bg:1:ntvf:1\ncell:A17:b::1::\ncell:B17:b::1::1:ntvf:2\ncell:C17:b::1::1\ncell:D17:b::1::1:ntvf:1\ncell:E17:vtf:t::IF(OR(E16=\"\",D17=\"\"),\"\",D17+E16):b::1::1:ntvf:1\ncell:A18:b::1::\ncell:B18:b::1::1:bg:1:ntvf:2\ncell:C18:b::1::1:bg:1\ncell:D18:b::1::1:bg:1:ntvf:1\ncell:E18:vtf:t::IF(OR(E17=\"\",D18=\"\"),\"\",D18+E17):b::1::1:bg:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:ntvf:2\ncell:C19:b::1::1\ncell:D19:b::1::1:ntvf:1\ncell:E19:vtf:t::IF(OR(E18=\"\",D19=\"\"),\"\",D19+E18):b::1::1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:bg:1:ntvf:2\ncell:C20:b::1::1:bg:1\ncell:D20:b::1::1:bg:1:ntvf:1\ncell:E20:vtf:t::IF(OR(E19=\"\",D20=\"\"),\"\",D20+E19):b::1::1:bg:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:ntvf:2\ncell:C21:b::1::1\ncell:D21:b::1::1:ntvf:1\ncell:E21:vtf:t::IF(OR(E20=\"\",D21=\"\"),\"\",D21+E20):b::1::1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:bg:1:ntvf:2\ncell:C22:b::1::1:bg:1\ncell:D22:b::1::1:bg:1:ntvf:1\ncell:E22:vtf:t::IF(OR(E21=\"\",D22=\"\"),\"\",D22+E21):b::1::1:bg:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:ntvf:2\ncell:C23:b::1::1\ncell:D23:b::1::1:ntvf:1\ncell:E23:vtf:t::IF(OR(E22=\"\",D23=\"\"),\"\",D23+E22):b::1::1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:bg:1:ntvf:2\ncell:C24:b::1::1:bg:1\ncell:D24:b::1::1:bg:1:ntvf:1\ncell:E24:vtf:t::IF(OR(E23=\"\",D24=\"\"),\"\",D24+E23):b::1::1:bg:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:ntvf:2\ncell:C25:b::1::1\ncell:D25:b::1::1:ntvf:1\ncell:E25:vtf:t::IF(OR(E24=\"\",D25=\"\"),\"\",D25+E24):b::1::1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:bg:1:ntvf:2\ncell:C26:b::1::1:bg:1\ncell:D26:b::1::1:bg:1:ntvf:1\ncell:E26:vtf:t::IF(OR(E25=\"\",D26=\"\"),\"\",D26+E25):b::1::1:bg:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:ntvf:2\ncell:C27:b::1::1\ncell:D27:b::1::1:ntvf:1\ncell:E27:vtf:t::IF(OR(E26=\"\",D27=\"\"),\"\",D27+E26):b::1::1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:bg:1:ntvf:2\ncell:C28:b::1::1:bg:1\ncell:D28:b::1::1:bg:1:ntvf:1\ncell:E28:vtf:t::IF(OR(E27=\"\",D28=\"\"),\"\",D28+E27):b::1::1:bg:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:ntvf:2\ncell:C29:b::1::1\ncell:D29:b::1::1:ntvf:1\ncell:E29:vtf:t::IF(OR(E28=\"\",D29=\"\"),\"\",D29+E28):b::1::1:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:bg:1:ntvf:2\ncell:C30:b::1::1:bg:1\ncell:D30:b::1::1:bg:1:ntvf:1\ncell:E30:vtf:t::IF(OR(E29=\"\",D30=\"\"),\"\",D30+E29):b::1::1:bg:1:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:ntvf:2\ncell:C31:b::1::1\ncell:D31:b::1::1:ntvf:1\ncell:E31:vtf:t::IF(OR(E30=\"\",D31=\"\"),\"\",D31+E30):b::1::1:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:bg:1:ntvf:2\ncell:C32:b::1::1:bg:1\ncell:D32:b::1::1:bg:1:ntvf:1\ncell:E32:vtf:t::IF(OR(E31=\"\",D32=\"\"),\"\",D32+E31):b::1::1:bg:1:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:ntvf:2\ncell:C33:b::1::1\ncell:D33:b::1::1:ntvf:1\ncell:E33:vtf:t::IF(OR(E32=\"\",D33=\"\"),\"\",D33+E32):b::1::1:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:bg:1:ntvf:2\ncell:C34:b::1::1:bg:1\ncell:D34:b::1::1:bg:1:ntvf:1\ncell:E34:vtf:t::IF(OR(E33=\"\",D34=\"\"),\"\",D34+E33):b::1::1:bg:1:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:ntvf:2\ncell:C35:b::1:1:1\ncell:D35:b::1:1:1:ntvf:1\ncell:E35:vtf:t::IF(OR(E34=\"\",D35=\"\"),\"\",D35+E34):b::1:1:1:ntvf:1\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncol:A:w:10\ncol:B:w:44\ncol:C:w:61\ncol:D:w:59\ncol:E:w:70\nrow:2:h:33\nrow:3:h:20.25\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:14.25\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nsheet:c:5:r:36:h:12.75:font:2:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(221,221,221)\nfont:1:* 12pt *\nfont:2:* 9pt arial,helvetica,sans-serif\nlayout:1:padding:2px 2px 2px 2px;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:m/d/yy\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::B9\\c#REF!\nname:DATA_04::#REF!\\c#REF!\n"},"name":"sheet10","hidden":"0"},"sheet4":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Ledger:b:1:1:1:1:f:1:cf:1:colspan:4\ncell:A4:b::1::\ncell:B4:t:Date 2016:b:1:1:1:1:cf:1\ncell:C4:t:Details:b:1:1:1:1:cf:1\ncell:D4:t:Credit , Debit:b:1:1:1:1:cf:1\ncell:E4:t:Balance:b:1:1:1:1:cf:1\ncell:A5:b::1::\ncell:B5:b::1::1:ntvf:2\ncell:C5:t:Forwarded Balance:b::1::1:colspan:2\ncell:D5:b::1::1:ntvf:1\ncell:E5:vtf:t::sheet10!E35:b:1:1:1:1:ntvf:1\ncell:A6:b::1::\ncell:B6:b::1::1:bg:1:ntvf:2\ncell:C6:b::1::1:bg:1\ncell:D6:b::1::1:bg:1:ntvf:1\ncell:E6:vtf:t::IF(OR(E5=\"\",D6=\"\"),\"\",D6+E5):b::1::1:bg:1:ntvf:1\ncell:A7:b::1::\ncell:B7:b::1::1:ntvf:2\ncell:C7:b::1::1\ncell:D7:b::1::1:ntvf:1\ncell:E7:vtf:t::IF(OR(E6=\"\",D7=\"\"),\"\",D7+E6):b::1::1:ntvf:1\ncell:A8:b::1::\ncell:B8:b::1::1:bg:1:ntvf:2\ncell:C8:b::1::1:bg:1\ncell:D8:b::1::1:bg:1:ntvf:1\ncell:E8:vtf:t::IF(OR(E7=\"\",D8=\"\"),\"\",D8+E7):b::1::1:bg:1:ntvf:1\ncell:A9:b::1::\ncell:B9:b::1::1:ntvf:2\ncell:C9:b::1::1\ncell:D9:b::1::1:ntvf:1\ncell:E9:vtf:t::IF(OR(E8=\"\",D9=\"\"),\"\",D9+E8):b::1::1:ntvf:1\ncell:A10:b::1::\ncell:B10:b::1::1:bg:1:ntvf:2\ncell:C10:b::1::1:bg:1\ncell:D10:b::1::1:bg:1:ntvf:1\ncell:E10:vtf:t::IF(OR(E9=\"\",D10=\"\"),\"\",D10+E9):b::1::1:bg:1:ntvf:1\ncell:A11:b::1::\ncell:B11:b::1::1:ntvf:2\ncell:C11:b::1::1\ncell:D11:b::1::1:ntvf:1\ncell:E11:vtf:t::IF(OR(E10=\"\",D11=\"\"),\"\",D11+E10):b::1::1:ntvf:1\ncell:A12:b::1::\ncell:B12:b::1::1:bg:1:ntvf:2\ncell:C12:b::1::1:bg:1\ncell:D12:b::1::1:bg:1:ntvf:1\ncell:E12:vtf:t::IF(OR(E11=\"\",D12=\"\"),\"\",D12+E11):b::1::1:bg:1:ntvf:1\ncell:A13:b::1::\ncell:B13:b::1::1:ntvf:2\ncell:C13:b::1::1\ncell:D13:b::1::1:ntvf:1\ncell:E13:vtf:t::IF(OR(E12=\"\",D13=\"\"),\"\",D13+E12):b::1::1:ntvf:1\ncell:A14:b::1::\ncell:B14:b::1::1:bg:1:ntvf:2\ncell:C14:b::1::1:bg:1\ncell:D14:b::1::1:bg:1:ntvf:1\ncell:E14:vtf:t::IF(OR(E13=\"\",D14=\"\"),\"\",D14+E13):b::1::1:bg:1:ntvf:1\ncell:A15:b::1::\ncell:B15:b::1::1:ntvf:2\ncell:C15:b::1::1\ncell:D15:b::1::1:ntvf:1\ncell:E15:vtf:t::IF(OR(E14=\"\",D15=\"\"),\"\",D15+E14):b::1::1:ntvf:1\ncell:A16:b::1::\ncell:B16:b::1::1:bg:1:ntvf:2\ncell:C16:b::1::1:bg:1\ncell:D16:b::1::1:bg:1:ntvf:1\ncell:E16:vtf:t::IF(OR(E15=\"\",D16=\"\"),\"\",D16+E15):b::1::1:bg:1:ntvf:1\ncell:A17:b::1::\ncell:B17:b::1::1:ntvf:2\ncell:C17:b::1::1\ncell:D17:b::1::1:ntvf:1\ncell:E17:vtf:t::IF(OR(E16=\"\",D17=\"\"),\"\",D17+E16):b::1::1:ntvf:1\ncell:A18:b::1::\ncell:B18:b::1::1:bg:1:ntvf:2\ncell:C18:b::1::1:bg:1\ncell:D18:b::1::1:bg:1:ntvf:1\ncell:E18:vtf:t::IF(OR(E17=\"\",D18=\"\"),\"\",D18+E17):b::1::1:bg:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:ntvf:2\ncell:C19:b::1::1\ncell:D19:b::1::1:ntvf:1\ncell:E19:vtf:t::IF(OR(E18=\"\",D19=\"\"),\"\",D19+E18):b::1::1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:bg:1:ntvf:2\ncell:C20:b::1::1:bg:1\ncell:D20:b::1::1:bg:1:ntvf:1\ncell:E20:vtf:t::IF(OR(E19=\"\",D20=\"\"),\"\",D20+E19):b::1::1:bg:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:ntvf:2\ncell:C21:b::1::1\ncell:D21:b::1::1:ntvf:1\ncell:E21:vtf:t::IF(OR(E20=\"\",D21=\"\"),\"\",D21+E20):b::1::1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:bg:1:ntvf:2\ncell:C22:b::1::1:bg:1\ncell:D22:b::1::1:bg:1:ntvf:1\ncell:E22:vtf:t::IF(OR(E21=\"\",D22=\"\"),\"\",D22+E21):b::1::1:bg:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:ntvf:2\ncell:C23:b::1::1\ncell:D23:b::1::1:ntvf:1\ncell:E23:vtf:t::IF(OR(E22=\"\",D23=\"\"),\"\",D23+E22):b::1::1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:bg:1:ntvf:2\ncell:C24:b::1::1:bg:1\ncell:D24:b::1::1:bg:1:ntvf:1\ncell:E24:vtf:t::IF(OR(E23=\"\",D24=\"\"),\"\",D24+E23):b::1::1:bg:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:ntvf:2\ncell:C25:b::1::1\ncell:D25:b::1::1:ntvf:1\ncell:E25:vtf:t::IF(OR(E24=\"\",D25=\"\"),\"\",D25+E24):b::1::1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:bg:1:ntvf:2\ncell:C26:b::1::1:bg:1\ncell:D26:b::1::1:bg:1:ntvf:1\ncell:E26:vtf:t::IF(OR(E25=\"\",D26=\"\"),\"\",D26+E25):b::1::1:bg:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:ntvf:2\ncell:C27:b::1::1\ncell:D27:b::1::1:ntvf:1\ncell:E27:vtf:t::IF(OR(E26=\"\",D27=\"\"),\"\",D27+E26):b::1::1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:bg:1:ntvf:2\ncell:C28:b::1::1:bg:1\ncell:D28:b::1::1:bg:1:ntvf:1\ncell:E28:vtf:t::IF(OR(E27=\"\",D28=\"\"),\"\",D28+E27):b::1::1:bg:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:ntvf:2\ncell:C29:b::1::1\ncell:D29:b::1::1:ntvf:1\ncell:E29:vtf:t::IF(OR(E28=\"\",D29=\"\"),\"\",D29+E28):b::1::1:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:bg:1:ntvf:2\ncell:C30:b::1::1:bg:1\ncell:D30:b::1::1:bg:1:ntvf:1\ncell:E30:vtf:t::IF(OR(E29=\"\",D30=\"\"),\"\",D30+E29):b::1::1:bg:1:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:ntvf:2\ncell:C31:b::1::1\ncell:D31:b::1::1:ntvf:1\ncell:E31:vtf:t::IF(OR(E30=\"\",D31=\"\"),\"\",D31+E30):b::1::1:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:bg:1:ntvf:2\ncell:C32:b::1::1:bg:1\ncell:D32:b::1::1:bg:1:ntvf:1\ncell:E32:vtf:t::IF(OR(E31=\"\",D32=\"\"),\"\",D32+E31):b::1::1:bg:1:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:ntvf:2\ncell:C33:b::1::1\ncell:D33:b::1::1:ntvf:1\ncell:E33:vtf:t::IF(OR(E32=\"\",D33=\"\"),\"\",D33+E32):b::1::1:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:bg:1:ntvf:2\ncell:C34:b::1::1:bg:1\ncell:D34:b::1::1:bg:1:ntvf:1\ncell:E34:vtf:t::IF(OR(E33=\"\",D34=\"\"),\"\",D34+E33):b::1::1:bg:1:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:ntvf:2\ncell:C35:b::1:1:1\ncell:D35:b::1:1:1:ntvf:1\ncell:E35:vtf:t::IF(OR(E34=\"\",D35=\"\"),\"\",D35+E34):b::1:1:1:ntvf:1\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncol:A:w:10\ncol:B:w:46\ncol:C:w:58\ncol:D:w:52\ncol:E:w:63\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:15\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:14.25\nsheet:c:5:r:36:h:12.75:needsrecalc:yes:font:2:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(221,221,221)\nfont:1:* 12pt *\nfont:2:* 9pt arial,helvetica,sans-serif\nlayout:1:padding:2px 2px 2px 2px;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:m/d/yy\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::#REF!\\c#REF!\nname:DATA_04::#REF!\\c#REF!\n"},"name":"sheet22","hidden":"0"},"sheet5":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Ledger:b:1:1:1:1:f:1:cf:1:colspan:4\ncell:A4:b::1::\ncell:B4:t:Date 2016:b:1:1:1:1:cf:1\ncell:C4:t:Details:b:1:1:1:1:cf:1\ncell:D4:t:Credit , Debit:b:1:1:1:1:cf:1\ncell:E4:t:Balance:b:1:1:1:1:cf:1\ncell:A5:b::1::\ncell:B5:b::1::1:ntvf:2\ncell:C5:t:Forwarded Balance:b::1::1:colspan:2\ncell:D5:b::1::1:ntvf:1\ncell:E5:vtf:t::sheet22!E35:b:1:1:1:1:ntvf:1\ncell:A6:b::1::\ncell:B6:b::1::1:bg:1:ntvf:2\ncell:C6:b::1::1:bg:1\ncell:D6:b::1::1:bg:1:ntvf:1\ncell:E6:vtf:t::IF(OR(E5=\"\",D6=\"\"),\"\",D6+E5):b::1::1:bg:1:ntvf:1\ncell:A7:b::1::\ncell:B7:b::1::1:ntvf:2\ncell:C7:b::1::1\ncell:D7:b::1::1:ntvf:1\ncell:E7:vtf:t::IF(OR(E6=\"\",D7=\"\"),\"\",D7+E6):b::1::1:ntvf:1\ncell:A8:b::1::\ncell:B8:b::1::1:bg:1:ntvf:2\ncell:C8:b::1::1:bg:1\ncell:D8:b::1::1:bg:1:ntvf:1\ncell:E8:vtf:t::IF(OR(E7=\"\",D8=\"\"),\"\",D8+E7):b::1::1:bg:1:ntvf:1\ncell:A9:b::1::\ncell:B9:b::1::1:ntvf:2\ncell:C9:b::1::1\ncell:D9:b::1::1:ntvf:1\ncell:E9:vtf:t::IF(OR(E8=\"\",D9=\"\"),\"\",D9+E8):b::1::1:ntvf:1\ncell:A10:b::1::\ncell:B10:b::1::1:bg:1:ntvf:2\ncell:C10:b::1::1:bg:1\ncell:D10:b::1::1:bg:1:ntvf:1\ncell:E10:vtf:t::IF(OR(E9=\"\",D10=\"\"),\"\",D10+E9):b::1::1:bg:1:ntvf:1\ncell:A11:b::1::\ncell:B11:b::1::1:ntvf:2\ncell:C11:b::1::1\ncell:D11:b::1::1:ntvf:1\ncell:E11:vtf:t::IF(OR(E10=\"\",D11=\"\"),\"\",D11+E10):b::1::1:ntvf:1\ncell:A12:b::1::\ncell:B12:b::1::1:bg:1:ntvf:2\ncell:C12:b::1::1:bg:1\ncell:D12:b::1::1:bg:1:ntvf:1\ncell:E12:vtf:t::IF(OR(E11=\"\",D12=\"\"),\"\",D12+E11):b::1::1:bg:1:ntvf:1\ncell:A13:b::1::\ncell:B13:b::1::1:ntvf:2\ncell:C13:b::1::1\ncell:D13:b::1::1:ntvf:1\ncell:E13:vtf:t::IF(OR(E12=\"\",D13=\"\"),\"\",D13+E12):b::1::1:ntvf:1\ncell:A14:b::1::\ncell:B14:b::1::1:bg:1:ntvf:2\ncell:C14:b::1::1:bg:1\ncell:D14:b::1::1:bg:1:ntvf:1\ncell:E14:vtf:t::IF(OR(E13=\"\",D14=\"\"),\"\",D14+E13):b::1::1:bg:1:ntvf:1\ncell:A15:b::1::\ncell:B15:b::1::1:ntvf:2\ncell:C15:b::1::1\ncell:D15:b::1::1:ntvf:1\ncell:E15:vtf:t::IF(OR(E14=\"\",D15=\"\"),\"\",D15+E14):b::1::1:ntvf:1\ncell:A16:b::1::\ncell:B16:b::1::1:bg:1:ntvf:2\ncell:C16:b::1::1:bg:1\ncell:D16:b::1::1:bg:1:ntvf:1\ncell:E16:vtf:t::IF(OR(E15=\"\",D16=\"\"),\"\",D16+E15):b::1::1:bg:1:ntvf:1\ncell:A17:b::1::\ncell:B17:b::1::1:ntvf:2\ncell:C17:b::1::1\ncell:D17:b::1::1:ntvf:1\ncell:E17:vtf:t::IF(OR(E16=\"\",D17=\"\"),\"\",D17+E16):b::1::1:ntvf:1\ncell:A18:b::1::\ncell:B18:b::1::1:bg:1:ntvf:2\ncell:C18:b::1::1:bg:1\ncell:D18:b::1::1:bg:1:ntvf:1\ncell:E18:vtf:t::IF(OR(E17=\"\",D18=\"\"),\"\",D18+E17):b::1::1:bg:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:ntvf:2\ncell:C19:b::1::1\ncell:D19:b::1::1:ntvf:1\ncell:E19:vtf:t::IF(OR(E18=\"\",D19=\"\"),\"\",D19+E18):b::1::1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:bg:1:ntvf:2\ncell:C20:b::1::1:bg:1\ncell:D20:b::1::1:bg:1:ntvf:1\ncell:E20:vtf:t::IF(OR(E19=\"\",D20=\"\"),\"\",D20+E19):b::1::1:bg:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:ntvf:2\ncell:C21:b::1::1\ncell:D21:b::1::1:ntvf:1\ncell:E21:vtf:t::IF(OR(E20=\"\",D21=\"\"),\"\",D21+E20):b::1::1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:bg:1:ntvf:2\ncell:C22:b::1::1:bg:1\ncell:D22:b::1::1:bg:1:ntvf:1\ncell:E22:vtf:t::IF(OR(E21=\"\",D22=\"\"),\"\",D22+E21):b::1::1:bg:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:ntvf:2\ncell:C23:b::1::1\ncell:D23:b::1::1:ntvf:1\ncell:E23:vtf:t::IF(OR(E22=\"\",D23=\"\"),\"\",D23+E22):b::1::1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:bg:1:ntvf:2\ncell:C24:b::1::1:bg:1\ncell:D24:b::1::1:bg:1:ntvf:1\ncell:E24:vtf:t::IF(OR(E23=\"\",D24=\"\"),\"\",D24+E23):b::1::1:bg:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:ntvf:2\ncell:C25:b::1::1\ncell:D25:b::1::1:ntvf:1\ncell:E25:vtf:t::IF(OR(E24=\"\",D25=\"\"),\"\",D25+E24):b::1::1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:bg:1:ntvf:2\ncell:C26:b::1::1:bg:1\ncell:D26:b::1::1:bg:1:ntvf:1\ncell:E26:vtf:t::IF(OR(E25=\"\",D26=\"\"),\"\",D26+E25):b::1::1:bg:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:ntvf:2\ncell:C27:b::1::1\ncell:D27:b::1::1:ntvf:1\ncell:E27:vtf:t::IF(OR(E26=\"\",D27=\"\"),\"\",D27+E26):b::1::1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:bg:1:ntvf:2\ncell:C28:b::1::1:bg:1\ncell:D28:b::1::1:bg:1:ntvf:1\ncell:E28:vtf:t::IF(OR(E27=\"\",D28=\"\"),\"\",D28+E27):b::1::1:bg:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:ntvf:2\ncell:C29:b::1::1\ncell:D29:b::1::1:ntvf:1\ncell:E29:vtf:t::IF(OR(E28=\"\",D29=\"\"),\"\",D29+E28):b::1::1:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:bg:1:ntvf:2\ncell:C30:b::1::1:bg:1\ncell:D30:b::1::1:bg:1:ntvf:1\ncell:E30:vtf:t::IF(OR(E29=\"\",D30=\"\"),\"\",D30+E29):b::1::1:bg:1:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:ntvf:2\ncell:C31:b::1::1\ncell:D31:b::1::1:ntvf:1\ncell:E31:vtf:t::IF(OR(E30=\"\",D31=\"\"),\"\",D31+E30):b::1::1:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:bg:1:ntvf:2\ncell:C32:b::1::1:bg:1\ncell:D32:b::1::1:bg:1:ntvf:1\ncell:E32:vtf:t::IF(OR(E31=\"\",D32=\"\"),\"\",D32+E31):b::1::1:bg:1:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:ntvf:2\ncell:C33:b::1::1\ncell:D33:b::1::1:ntvf:1\ncell:E33:vtf:t::IF(OR(E32=\"\",D33=\"\"),\"\",D33+E32):b::1::1:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:bg:1:ntvf:2\ncell:C34:b::1::1:bg:1\ncell:D34:b::1::1:bg:1:ntvf:1\ncell:E34:vtf:t::IF(OR(E33=\"\",D34=\"\"),\"\",D34+E33):b::1::1:bg:1:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:ntvf:2\ncell:C35:b::1:1:1\ncell:D35:b::1:1:1:ntvf:1\ncell:E35:vtf:t::IF(OR(E34=\"\",D35=\"\"),\"\",D35+E34):b::1:1:1:ntvf:1\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:64\ncol:D:w:69\ncol:E:w:66\nsheet:c:5:r:36:needsrecalc:yes:font:2:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(221,221,221)\nfont:1:* 12pt *\nfont:2:* 9pt arial,helvetica,sans-serif\nlayout:1:padding:2px 2px 2px 2px;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:m/d/yy\n"},"name":"ssheet23","hidden":"0"},"sheet6":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Ledger:b:1:1:1:1:f:1:cf:1:colspan:4\ncell:A4:b::1::\ncell:B4:t:Date 2016:b:1:1:1:1:cf:1\ncell:C4:t:Details:b:1:1:1:1:cf:1\ncell:D4:t:Credit , Debit:b:1:1:1:1:cf:1\ncell:E4:t:Balance:b:1:1:1:1:cf:1\ncell:A5:b::1::\ncell:B5:b::1::1:ntvf:2\ncell:C5:t:Forwarded Balance:b::1::1:colspan:2\ncell:D5:b::1::1:ntvf:1\ncell:E5:vtf:t::ssheet23!E35:b:1:1:1:1:ntvf:1\ncell:A6:b::1::\ncell:B6:b::1::1:bg:1:ntvf:2\ncell:C6:b::1::1:bg:1\ncell:D6:b::1::1:bg:1:ntvf:1\ncell:E6:vtf:t::IF(OR(E5=\"\",D6=\"\"),\"\",D6+E5):b::1::1:bg:1:ntvf:1\ncell:A7:b::1::\ncell:B7:b::1::1:ntvf:2\ncell:C7:b::1::1\ncell:D7:b::1::1:ntvf:1\ncell:E7:vtf:t::IF(OR(E6=\"\",D7=\"\"),\"\",D7+E6):b::1::1:ntvf:1\ncell:A8:b::1::\ncell:B8:b::1::1:bg:1:ntvf:2\ncell:C8:b::1::1:bg:1\ncell:D8:b::1::1:bg:1:ntvf:1\ncell:E8:vtf:t::IF(OR(E7=\"\",D8=\"\"),\"\",D8+E7):b::1::1:bg:1:ntvf:1\ncell:A9:b::1::\ncell:B9:b::1::1:ntvf:2\ncell:C9:b::1::1\ncell:D9:b::1::1:ntvf:1\ncell:E9:vtf:t::IF(OR(E8=\"\",D9=\"\"),\"\",D9+E8):b::1::1:ntvf:1\ncell:A10:b::1::\ncell:B10:b::1::1:bg:1:ntvf:2\ncell:C10:b::1::1:bg:1\ncell:D10:b::1::1:bg:1:ntvf:1\ncell:E10:vtf:t::IF(OR(E9=\"\",D10=\"\"),\"\",D10+E9):b::1::1:bg:1:ntvf:1\ncell:A11:b::1::\ncell:B11:b::1::1:ntvf:2\ncell:C11:b::1::1\ncell:D11:b::1::1:ntvf:1\ncell:E11:vtf:t::IF(OR(E10=\"\",D11=\"\"),\"\",D11+E10):b::1::1:ntvf:1\ncell:A12:b::1::\ncell:B12:b::1::1:bg:1:ntvf:2\ncell:C12:b::1::1:bg:1\ncell:D12:b::1::1:bg:1:ntvf:1\ncell:E12:vtf:t::IF(OR(E11=\"\",D12=\"\"),\"\",D12+E11):b::1::1:bg:1:ntvf:1\ncell:A13:b::1::\ncell:B13:b::1::1:ntvf:2\ncell:C13:b::1::1\ncell:D13:b::1::1:ntvf:1\ncell:E13:vtf:t::IF(OR(E12=\"\",D13=\"\"),\"\",D13+E12):b::1::1:ntvf:1\ncell:A14:b::1::\ncell:B14:b::1::1:bg:1:ntvf:2\ncell:C14:b::1::1:bg:1\ncell:D14:b::1::1:bg:1:ntvf:1\ncell:E14:vtf:t::IF(OR(E13=\"\",D14=\"\"),\"\",D14+E13):b::1::1:bg:1:ntvf:1\ncell:A15:b::1::\ncell:B15:b::1::1:ntvf:2\ncell:C15:b::1::1\ncell:D15:b::1::1:ntvf:1\ncell:E15:vtf:t::IF(OR(E14=\"\",D15=\"\"),\"\",D15+E14):b::1::1:ntvf:1\ncell:A16:b::1::\ncell:B16:b::1::1:bg:1:ntvf:2\ncell:C16:b::1::1:bg:1\ncell:D16:b::1::1:bg:1:ntvf:1\ncell:E16:vtf:t::IF(OR(E15=\"\",D16=\"\"),\"\",D16+E15):b::1::1:bg:1:ntvf:1\ncell:A17:b::1::\ncell:B17:b::1::1:ntvf:2\ncell:C17:b::1::1\ncell:D17:b::1::1:ntvf:1\ncell:E17:vtf:t::IF(OR(E16=\"\",D17=\"\"),\"\",D17+E16):b::1::1:ntvf:1\ncell:A18:b::1::\ncell:B18:b::1::1:bg:1:ntvf:2\ncell:C18:b::1::1:bg:1\ncell:D18:b::1::1:bg:1:ntvf:1\ncell:E18:vtf:t::IF(OR(E17=\"\",D18=\"\"),\"\",D18+E17):b::1::1:bg:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:ntvf:2\ncell:C19:b::1::1\ncell:D19:b::1::1:ntvf:1\ncell:E19:vtf:t::IF(OR(E18=\"\",D19=\"\"),\"\",D19+E18):b::1::1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:bg:1:ntvf:2\ncell:C20:b::1::1:bg:1\ncell:D20:b::1::1:bg:1:ntvf:1\ncell:E20:vtf:t::IF(OR(E19=\"\",D20=\"\"),\"\",D20+E19):b::1::1:bg:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:ntvf:2\ncell:C21:b::1::1\ncell:D21:b::1::1:ntvf:1\ncell:E21:vtf:t::IF(OR(E20=\"\",D21=\"\"),\"\",D21+E20):b::1::1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:bg:1:ntvf:2\ncell:C22:b::1::1:bg:1\ncell:D22:b::1::1:bg:1:ntvf:1\ncell:E22:vtf:t::IF(OR(E21=\"\",D22=\"\"),\"\",D22+E21):b::1::1:bg:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:ntvf:2\ncell:C23:b::1::1\ncell:D23:b::1::1:ntvf:1\ncell:E23:vtf:t::IF(OR(E22=\"\",D23=\"\"),\"\",D23+E22):b::1::1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:bg:1:ntvf:2\ncell:C24:b::1::1:bg:1\ncell:D24:b::1::1:bg:1:ntvf:1\ncell:E24:vtf:t::IF(OR(E23=\"\",D24=\"\"),\"\",D24+E23):b::1::1:bg:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:ntvf:2\ncell:C25:b::1::1\ncell:D25:b::1::1:ntvf:1\ncell:E25:vtf:t::IF(OR(E24=\"\",D25=\"\"),\"\",D25+E24):b::1::1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:bg:1:ntvf:2\ncell:C26:b::1::1:bg:1\ncell:D26:b::1::1:bg:1:ntvf:1\ncell:E26:vtf:t::IF(OR(E25=\"\",D26=\"\"),\"\",D26+E25):b::1::1:bg:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:ntvf:2\ncell:C27:b::1::1\ncell:D27:b::1::1:ntvf:1\ncell:E27:vtf:t::IF(OR(E26=\"\",D27=\"\"),\"\",D27+E26):b::1::1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:bg:1:ntvf:2\ncell:C28:b::1::1:bg:1\ncell:D28:b::1::1:bg:1:ntvf:1\ncell:E28:vtf:t::IF(OR(E27=\"\",D28=\"\"),\"\",D28+E27):b::1::1:bg:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:ntvf:2\ncell:C29:b::1::1\ncell:D29:b::1::1:ntvf:1\ncell:E29:vtf:t::IF(OR(E28=\"\",D29=\"\"),\"\",D29+E28):b::1::1:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:bg:1:ntvf:2\ncell:C30:b::1::1:bg:1\ncell:D30:b::1::1:bg:1:ntvf:1\ncell:E30:vtf:t::IF(OR(E29=\"\",D30=\"\"),\"\",D30+E29):b::1::1:bg:1:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:ntvf:2\ncell:C31:b::1::1\ncell:D31:b::1::1:ntvf:1\ncell:E31:vtf:t::IF(OR(E30=\"\",D31=\"\"),\"\",D31+E30):b::1::1:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:bg:1:ntvf:2\ncell:C32:b::1::1:bg:1\ncell:D32:b::1::1:bg:1:ntvf:1\ncell:E32:vtf:t::IF(OR(E31=\"\",D32=\"\"),\"\",D32+E31):b::1::1:bg:1:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:ntvf:2\ncell:C33:b::1::1\ncell:D33:b::1::1:ntvf:1\ncell:E33:vtf:t::IF(OR(E32=\"\",D33=\"\"),\"\",D33+E32):b::1::1:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:bg:1:ntvf:2\ncell:C34:b::1::1:bg:1\ncell:D34:b::1::1:bg:1:ntvf:1\ncell:E34:vtf:t::IF(OR(E33=\"\",D34=\"\"),\"\",D34+E33):b::1::1:bg:1:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:ntvf:2\ncell:C35:b::1:1:1\ncell:D35:b::1:1:1:ntvf:1\ncell:E35:vtf:t::IF(OR(E34=\"\",D35=\"\"),\"\",D35+E34):b::1:1:1:ntvf:1\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncol:A:w:10\ncol:B:w:42\ncol:C:w:60\ncol:D:w:59\ncol:E:w:64\nsheet:c:5:r:36:needsrecalc:yes:font:2:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(221,221,221)\nfont:1:* 12pt *\nfont:2:* 9pt arial,helvetica,sans-serif\nlayout:1:padding:2px 2px 2px 2px;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:m/d/yy\n"},"name":"ssheet24","hidden":"0"},"sheet7":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Ledger:b:1:1:1:1:f:1:cf:1:colspan:4\ncell:A4:b::1::\ncell:B4:t:Date 2016:b:1:1:1:1:cf:1\ncell:C4:t:Details:b:1:1:1:1:cf:1\ncell:D4:t:Credit , Debit:b:1:1:1:1:cf:1\ncell:E4:t:Balance:b:1:1:1:1:cf:1\ncell:A5:b::1::\ncell:B5:b::1::1:ntvf:2\ncell:C5:t:Forwarded Balance:b::1::1:colspan:2\ncell:D5:b::1::1:ntvf:1\ncell:E5:vtf:t::ssheet24!E35:b:1:1:1:1:ntvf:1\ncell:A6:b::1::\ncell:B6:b::1::1:bg:1:ntvf:2\ncell:C6:b::1::1:bg:1\ncell:D6:b::1::1:bg:1:ntvf:1\ncell:E6:vtf:t::IF(OR(E5=\"\",D6=\"\"),\"\",D6+E5):b::1::1:bg:1:ntvf:1\ncell:A7:b::1::\ncell:B7:b::1::1:ntvf:2\ncell:C7:b::1::1\ncell:D7:b::1::1:ntvf:1\ncell:E7:vtf:t::IF(OR(E6=\"\",D7=\"\"),\"\",D7+E6):b::1::1:ntvf:1\ncell:A8:b::1::\ncell:B8:b::1::1:bg:1:ntvf:2\ncell:C8:b::1::1:bg:1\ncell:D8:b::1::1:bg:1:ntvf:1\ncell:E8:vtf:t::IF(OR(E7=\"\",D8=\"\"),\"\",D8+E7):b::1::1:bg:1:ntvf:1\ncell:A9:b::1::\ncell:B9:b::1::1:ntvf:2\ncell:C9:b::1::1\ncell:D9:b::1::1:ntvf:1\ncell:E9:vtf:t::IF(OR(E8=\"\",D9=\"\"),\"\",D9+E8):b::1::1:ntvf:1\ncell:A10:b::1::\ncell:B10:b::1::1:bg:1:ntvf:2\ncell:C10:b::1::1:bg:1\ncell:D10:b::1::1:bg:1:ntvf:1\ncell:E10:vtf:t::IF(OR(E9=\"\",D10=\"\"),\"\",D10+E9):b::1::1:bg:1:ntvf:1\ncell:A11:b::1::\ncell:B11:b::1::1:ntvf:2\ncell:C11:b::1::1\ncell:D11:b::1::1:ntvf:1\ncell:E11:vtf:t::IF(OR(E10=\"\",D11=\"\"),\"\",D11+E10):b::1::1:ntvf:1\ncell:A12:b::1::\ncell:B12:b::1::1:bg:1:ntvf:2\ncell:C12:b::1::1:bg:1\ncell:D12:b::1::1:bg:1:ntvf:1\ncell:E12:vtf:t::IF(OR(E11=\"\",D12=\"\"),\"\",D12+E11):b::1::1:bg:1:ntvf:1\ncell:A13:b::1::\ncell:B13:b::1::1:ntvf:2\ncell:C13:b::1::1\ncell:D13:b::1::1:ntvf:1\ncell:E13:vtf:t::IF(OR(E12=\"\",D13=\"\"),\"\",D13+E12):b::1::1:ntvf:1\ncell:A14:b::1::\ncell:B14:b::1::1:bg:1:ntvf:2\ncell:C14:b::1::1:bg:1\ncell:D14:b::1::1:bg:1:ntvf:1\ncell:E14:vtf:t::IF(OR(E13=\"\",D14=\"\"),\"\",D14+E13):b::1::1:bg:1:ntvf:1\ncell:A15:b::1::\ncell:B15:b::1::1:ntvf:2\ncell:C15:b::1::1\ncell:D15:b::1::1:ntvf:1\ncell:E15:vtf:t::IF(OR(E14=\"\",D15=\"\"),\"\",D15+E14):b::1::1:ntvf:1\ncell:A16:b::1::\ncell:B16:b::1::1:bg:1:ntvf:2\ncell:C16:b::1::1:bg:1\ncell:D16:b::1::1:bg:1:ntvf:1\ncell:E16:vtf:t::IF(OR(E15=\"\",D16=\"\"),\"\",D16+E15):b::1::1:bg:1:ntvf:1\ncell:A17:b::1::\ncell:B17:b::1::1:ntvf:2\ncell:C17:b::1::1\ncell:D17:b::1::1:ntvf:1\ncell:E17:vtf:t::IF(OR(E16=\"\",D17=\"\"),\"\",D17+E16):b::1::1:ntvf:1\ncell:A18:b::1::\ncell:B18:b::1::1:bg:1:ntvf:2\ncell:C18:b::1::1:bg:1\ncell:D18:b::1::1:bg:1:ntvf:1\ncell:E18:vtf:t::IF(OR(E17=\"\",D18=\"\"),\"\",D18+E17):b::1::1:bg:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:ntvf:2\ncell:C19:b::1::1\ncell:D19:b::1::1:ntvf:1\ncell:E19:vtf:t::IF(OR(E18=\"\",D19=\"\"),\"\",D19+E18):b::1::1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:bg:1:ntvf:2\ncell:C20:b::1::1:bg:1\ncell:D20:b::1::1:bg:1:ntvf:1\ncell:E20:vtf:t::IF(OR(E19=\"\",D20=\"\"),\"\",D20+E19):b::1::1:bg:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:ntvf:2\ncell:C21:b::1::1\ncell:D21:b::1::1:ntvf:1\ncell:E21:vtf:t::IF(OR(E20=\"\",D21=\"\"),\"\",D21+E20):b::1::1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:bg:1:ntvf:2\ncell:C22:b::1::1:bg:1\ncell:D22:b::1::1:bg:1:ntvf:1\ncell:E22:vtf:t::IF(OR(E21=\"\",D22=\"\"),\"\",D22+E21):b::1::1:bg:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:ntvf:2\ncell:C23:b::1::1\ncell:D23:b::1::1:ntvf:1\ncell:E23:vtf:t::IF(OR(E22=\"\",D23=\"\"),\"\",D23+E22):b::1::1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:bg:1:ntvf:2\ncell:C24:b::1::1:bg:1\ncell:D24:b::1::1:bg:1:ntvf:1\ncell:E24:vtf:t::IF(OR(E23=\"\",D24=\"\"),\"\",D24+E23):b::1::1:bg:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:ntvf:2\ncell:C25:b::1::1\ncell:D25:b::1::1:ntvf:1\ncell:E25:vtf:t::IF(OR(E24=\"\",D25=\"\"),\"\",D25+E24):b::1::1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:bg:1:ntvf:2\ncell:C26:b::1::1:bg:1\ncell:D26:b::1::1:bg:1:ntvf:1\ncell:E26:vtf:t::IF(OR(E25=\"\",D26=\"\"),\"\",D26+E25):b::1::1:bg:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:ntvf:2\ncell:C27:b::1::1\ncell:D27:b::1::1:ntvf:1\ncell:E27:vtf:t::IF(OR(E26=\"\",D27=\"\"),\"\",D27+E26):b::1::1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:bg:1:ntvf:2\ncell:C28:b::1::1:bg:1\ncell:D28:b::1::1:bg:1:ntvf:1\ncell:E28:vtf:t::IF(OR(E27=\"\",D28=\"\"),\"\",D28+E27):b::1::1:bg:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:ntvf:2\ncell:C29:b::1::1\ncell:D29:b::1::1:ntvf:1\ncell:E29:vtf:t::IF(OR(E28=\"\",D29=\"\"),\"\",D29+E28):b::1::1:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:bg:1:ntvf:2\ncell:C30:b::1::1:bg:1\ncell:D30:b::1::1:bg:1:ntvf:1\ncell:E30:vtf:t::IF(OR(E29=\"\",D30=\"\"),\"\",D30+E29):b::1::1:bg:1:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:ntvf:2\ncell:C31:b::1::1\ncell:D31:b::1::1:ntvf:1\ncell:E31:vtf:t::IF(OR(E30=\"\",D31=\"\"),\"\",D31+E30):b::1::1:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:bg:1:ntvf:2\ncell:C32:b::1::1:bg:1\ncell:D32:b::1::1:bg:1:ntvf:1\ncell:E32:vtf:t::IF(OR(E31=\"\",D32=\"\"),\"\",D32+E31):b::1::1:bg:1:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:ntvf:2\ncell:C33:b::1::1\ncell:D33:b::1::1:ntvf:1\ncell:E33:vtf:t::IF(OR(E32=\"\",D33=\"\"),\"\",D33+E32):b::1::1:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:bg:1:ntvf:2\ncell:C34:b::1::1:bg:1\ncell:D34:b::1::1:bg:1:ntvf:1\ncell:E34:vtf:t::IF(OR(E33=\"\",D34=\"\"),\"\",D34+E33):b::1::1:bg:1:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:ntvf:2\ncell:C35:b::1:1:1\ncell:D35:b::1:1:1:ntvf:1\ncell:E35:vtf:t::IF(OR(E34=\"\",D35=\"\"),\"\",D35+E34):b::1:1:1:ntvf:1\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncol:A:w:10\ncol:B:w:46\ncol:C:w:56\ncol:D:w:60\ncol:E:w:67\nrow:3:h:33\nrow:4:h:20.25\nrow:5:h:15.75\nrow:6:h:14.25\nrow:7:h:14.25\nrow:8:h:15\nrow:9:h:14.25\nrow:10:h:14.25\nrow:11:h:14.25\nrow:12:h:14.25\nrow:13:h:14.25\nrow:14:h:14.25\nrow:15:h:14.25\nrow:16:h:14.25\nrow:17:h:15\nrow:18:h:14.25\nrow:19:h:14.25\nrow:20:h:14.25\nrow:21:h:14.25\nrow:22:h:14.25\nrow:23:h:14.25\nrow:24:h:14.25\nrow:25:h:14.25\nrow:26:h:15\nrow:27:h:14.25\nrow:28:h:14.25\nrow:29:h:14.25\nrow:30:h:14.25\nrow:31:h:14.25\nrow:32:h:14.25\nrow:33:h:14.25\nrow:34:h:14.25\nrow:35:h:14.25\nrow:36:h:14.25\nrow:37:h:14.25\nrow:38:h:14.25\nrow:39:h:14.25\nrow:40:h:14.25\nrow:41:h:14.25\nrow:42:h:14.25\nrow:43:h:15\nrow:44:h:14.25\nrow:45:h:14.25\nrow:46:h:14.25\nrow:47:h:14.25\nrow:48:h:14.25\nrow:49:h:14.25\nrow:50:h:14.25\nrow:53:h:14.25\nsheet:c:5:r:53:h:12.75:needsrecalc:yes:font:2:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(221,221,221)\nfont:1:* 12pt *\nfont:2:* 9pt arial,helvetica,sans-serif\nlayout:1:padding:2px 2px 2px 2px;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:m/d/yy\nname:DATA_01::#REF!\nname:DATA_02::#REF!\nname:DATA_03::#REF!\\c#REF!\nname:DATA_04::#REF!\\c#REF!\n"},"name":"sheet25","hidden":"0"},"sheet8":{"sheetstr":{"savestr":"version:1.5\ncell:B2:t:Ledger:b:1:1:1:1:f:1:cf:1:colspan:4\ncell:A4:b::1::\ncell:B4:t:Date 2016:b:1:1:1:1:cf:1\ncell:C4:t:Details:b:1:1:1:1:cf:1\ncell:D4:t:Credit , Debit:b:1:1:1:1:cf:1\ncell:E4:t:Balance:b:1:1:1:1:cf:1\ncell:A5:b::1::\ncell:B5:b::1::1:ntvf:2\ncell:C5:t:Forwarded Balance:b::1::1:colspan:2\ncell:D5:b::1::1:ntvf:1\ncell:E5:vtf:t::sheet25!E35:b:1:1:1:1:ntvf:1\ncell:A6:b::1::\ncell:B6:b::1::1:bg:1:ntvf:2\ncell:C6:b::1::1:bg:1\ncell:D6:b::1::1:bg:1:ntvf:1\ncell:E6:vtf:t::IF(OR(E5=\"\",D6=\"\"),\"\",D6+E5):b::1::1:bg:1:ntvf:1\ncell:A7:b::1::\ncell:B7:b::1::1:ntvf:2\ncell:C7:b::1::1\ncell:D7:b::1::1:ntvf:1\ncell:E7:vtf:t::IF(OR(E6=\"\",D7=\"\"),\"\",D7+E6):b::1::1:ntvf:1\ncell:A8:b::1::\ncell:B8:b::1::1:bg:1:ntvf:2\ncell:C8:b::1::1:bg:1\ncell:D8:b::1::1:bg:1:ntvf:1\ncell:E8:vtf:t::IF(OR(E7=\"\",D8=\"\"),\"\",D8+E7):b::1::1:bg:1:ntvf:1\ncell:A9:b::1::\ncell:B9:b::1::1:ntvf:2\ncell:C9:b::1::1\ncell:D9:b::1::1:ntvf:1\ncell:E9:vtf:t::IF(OR(E8=\"\",D9=\"\"),\"\",D9+E8):b::1::1:ntvf:1\ncell:A10:b::1::\ncell:B10:b::1::1:bg:1:ntvf:2\ncell:C10:b::1::1:bg:1\ncell:D10:b::1::1:bg:1:ntvf:1\ncell:E10:vtf:t::IF(OR(E9=\"\",D10=\"\"),\"\",D10+E9):b::1::1:bg:1:ntvf:1\ncell:A11:b::1::\ncell:B11:b::1::1:ntvf:2\ncell:C11:b::1::1\ncell:D11:b::1::1:ntvf:1\ncell:E11:vtf:t::IF(OR(E10=\"\",D11=\"\"),\"\",D11+E10):b::1::1:ntvf:1\ncell:A12:b::1::\ncell:B12:b::1::1:bg:1:ntvf:2\ncell:C12:b::1::1:bg:1\ncell:D12:b::1::1:bg:1:ntvf:1\ncell:E12:vtf:t::IF(OR(E11=\"\",D12=\"\"),\"\",D12+E11):b::1::1:bg:1:ntvf:1\ncell:A13:b::1::\ncell:B13:b::1::1:ntvf:2\ncell:C13:b::1::1\ncell:D13:b::1::1:ntvf:1\ncell:E13:vtf:t::IF(OR(E12=\"\",D13=\"\"),\"\",D13+E12):b::1::1:ntvf:1\ncell:A14:b::1::\ncell:B14:b::1::1:bg:1:ntvf:2\ncell:C14:b::1::1:bg:1\ncell:D14:b::1::1:bg:1:ntvf:1\ncell:E14:vtf:t::IF(OR(E13=\"\",D14=\"\"),\"\",D14+E13):b::1::1:bg:1:ntvf:1\ncell:A15:b::1::\ncell:B15:b::1::1:ntvf:2\ncell:C15:b::1::1\ncell:D15:b::1::1:ntvf:1\ncell:E15:vtf:t::IF(OR(E14=\"\",D15=\"\"),\"\",D15+E14):b::1::1:ntvf:1\ncell:A16:b::1::\ncell:B16:b::1::1:bg:1:ntvf:2\ncell:C16:b::1::1:bg:1\ncell:D16:b::1::1:bg:1:ntvf:1\ncell:E16:vtf:t::IF(OR(E15=\"\",D16=\"\"),\"\",D16+E15):b::1::1:bg:1:ntvf:1\ncell:A17:b::1::\ncell:B17:b::1::1:ntvf:2\ncell:C17:b::1::1\ncell:D17:b::1::1:ntvf:1\ncell:E17:vtf:t::IF(OR(E16=\"\",D17=\"\"),\"\",D17+E16):b::1::1:ntvf:1\ncell:A18:b::1::\ncell:B18:b::1::1:bg:1:ntvf:2\ncell:C18:b::1::1:bg:1\ncell:D18:b::1::1:bg:1:ntvf:1\ncell:E18:vtf:t::IF(OR(E17=\"\",D18=\"\"),\"\",D18+E17):b::1::1:bg:1:ntvf:1\ncell:A19:b::1::\ncell:B19:b::1::1:ntvf:2\ncell:C19:b::1::1\ncell:D19:b::1::1:ntvf:1\ncell:E19:vtf:t::IF(OR(E18=\"\",D19=\"\"),\"\",D19+E18):b::1::1:ntvf:1\ncell:A20:b::1::\ncell:B20:b::1::1:bg:1:ntvf:2\ncell:C20:b::1::1:bg:1\ncell:D20:b::1::1:bg:1:ntvf:1\ncell:E20:vtf:t::IF(OR(E19=\"\",D20=\"\"),\"\",D20+E19):b::1::1:bg:1:ntvf:1\ncell:A21:b::1::\ncell:B21:b::1::1:ntvf:2\ncell:C21:b::1::1\ncell:D21:b::1::1:ntvf:1\ncell:E21:vtf:t::IF(OR(E20=\"\",D21=\"\"),\"\",D21+E20):b::1::1:ntvf:1\ncell:A22:b::1::\ncell:B22:b::1::1:bg:1:ntvf:2\ncell:C22:b::1::1:bg:1\ncell:D22:b::1::1:bg:1:ntvf:1\ncell:E22:vtf:t::IF(OR(E21=\"\",D22=\"\"),\"\",D22+E21):b::1::1:bg:1:ntvf:1\ncell:A23:b::1::\ncell:B23:b::1::1:ntvf:2\ncell:C23:b::1::1\ncell:D23:b::1::1:ntvf:1\ncell:E23:vtf:t::IF(OR(E22=\"\",D23=\"\"),\"\",D23+E22):b::1::1:ntvf:1\ncell:A24:b::1::\ncell:B24:b::1::1:bg:1:ntvf:2\ncell:C24:b::1::1:bg:1\ncell:D24:b::1::1:bg:1:ntvf:1\ncell:E24:vtf:t::IF(OR(E23=\"\",D24=\"\"),\"\",D24+E23):b::1::1:bg:1:ntvf:1\ncell:A25:b::1::\ncell:B25:b::1::1:ntvf:2\ncell:C25:b::1::1\ncell:D25:b::1::1:ntvf:1\ncell:E25:vtf:t::IF(OR(E24=\"\",D25=\"\"),\"\",D25+E24):b::1::1:ntvf:1\ncell:A26:b::1::\ncell:B26:b::1::1:bg:1:ntvf:2\ncell:C26:b::1::1:bg:1\ncell:D26:b::1::1:bg:1:ntvf:1\ncell:E26:vtf:t::IF(OR(E25=\"\",D26=\"\"),\"\",D26+E25):b::1::1:bg:1:ntvf:1\ncell:A27:b::1::\ncell:B27:b::1::1:ntvf:2\ncell:C27:b::1::1\ncell:D27:b::1::1:ntvf:1\ncell:E27:vtf:t::IF(OR(E26=\"\",D27=\"\"),\"\",D27+E26):b::1::1:ntvf:1\ncell:A28:b::1::\ncell:B28:b::1::1:bg:1:ntvf:2\ncell:C28:b::1::1:bg:1\ncell:D28:b::1::1:bg:1:ntvf:1\ncell:E28:vtf:t::IF(OR(E27=\"\",D28=\"\"),\"\",D28+E27):b::1::1:bg:1:ntvf:1\ncell:A29:b::1::\ncell:B29:b::1::1:ntvf:2\ncell:C29:b::1::1\ncell:D29:b::1::1:ntvf:1\ncell:E29:vtf:t::IF(OR(E28=\"\",D29=\"\"),\"\",D29+E28):b::1::1:ntvf:1\ncell:A30:b::1::\ncell:B30:b::1::1:bg:1:ntvf:2\ncell:C30:b::1::1:bg:1\ncell:D30:b::1::1:bg:1:ntvf:1\ncell:E30:vtf:t::IF(OR(E29=\"\",D30=\"\"),\"\",D30+E29):b::1::1:bg:1:ntvf:1\ncell:A31:b::1::\ncell:B31:b::1::1:ntvf:2\ncell:C31:b::1::1\ncell:D31:b::1::1:ntvf:1\ncell:E31:vtf:t::IF(OR(E30=\"\",D31=\"\"),\"\",D31+E30):b::1::1:ntvf:1\ncell:A32:b::1::\ncell:B32:b::1::1:bg:1:ntvf:2\ncell:C32:b::1::1:bg:1\ncell:D32:b::1::1:bg:1:ntvf:1\ncell:E32:vtf:t::IF(OR(E31=\"\",D32=\"\"),\"\",D32+E31):b::1::1:bg:1:ntvf:1\ncell:A33:b::1::\ncell:B33:b::1::1:ntvf:2\ncell:C33:b::1::1\ncell:D33:b::1::1:ntvf:1\ncell:E33:vtf:t::IF(OR(E32=\"\",D33=\"\"),\"\",D33+E32):b::1::1:ntvf:1\ncell:A34:b::1::\ncell:B34:b::1::1:bg:1:ntvf:2\ncell:C34:b::1::1:bg:1\ncell:D34:b::1::1:bg:1:ntvf:1\ncell:E34:vtf:t::IF(OR(E33=\"\",D34=\"\"),\"\",D34+E33):b::1::1:bg:1:ntvf:1\ncell:A35:b::1::\ncell:B35:b::1:1:1:ntvf:2\ncell:C35:b::1:1:1\ncell:D35:b::1:1:1:ntvf:1\ncell:E35:vtf:t::IF(OR(E34=\"\",D35=\"\"),\"\",D35+E34):b::1:1:1:ntvf:1\ncell:B36:b:1:::\ncell:C36:b:1:::\ncell:D36:b:1:::\ncell:E36:b:1:::\ncol:A:w:10\ncol:B:w:41\ncol:C:w:58\ncol:D:w:63\ncol:E:w:61\nsheet:c:5:r:36:needsrecalc:yes:font:2:layout:1\nborder:1:1px solid rgb(0,0,0)\ncellformat:1:center\ncolor:1:rgb(221,221,221)\nfont:1:* 12pt *\nfont:2:* 9pt arial,helvetica,sans-serif\nlayout:1:padding:2px 2px 2px 2px;vertical-align:middle;\nvalueformat:1:#,##0.00\nvalueformat:2:m/d/yy\n"},"name":"sheet8","hidden":"0"}},"EditableCells":{"allow":true,"cells":{"budget1!B4":true,"budget1!B5":true,"budget1!B6":true,"budget1!B7":true,"budget1!B8":true,"budget1!B9":true,"budget1!B10":true,"budget1!B11":true,"budget1!B12":true,"budget1!B13":true,"budget1!B14":true,"budget1!B15":true,"budget1!B16":true,"budget1!B17":true,"budget1!B18":true,"budget1!B19":true,"budget1!B20":true,"budget1!B21":true,"budget1!B22":true,"budget1!B23":true,"budget1!B24":true,"budget1!B25":true,"budget1!B26":true,"budget1!B27":true,"budget1!B28":true,"budget1!B29":true,"budget1!B30":true,"budget1!B31":true,"budget1!B32":true,"budget1!B33":true,"budget1!B34":true,"budget1!B35":true,"budget1!C4":true,"budget1!C5":true,"budget1!C6":true,"budget1!C7":true,"budget1!C8":true,"budget1!C9":true,"budget1!C10":true,"budget1!C11":true,"budget1!C12":true,"budget1!C13":true,"budget1!C14":true,"budget1!C15":true,"budget1!C16":true,"budget1!C17":true,"budget1!C18":true,"budget1!C19":true,"budget1!C20":true,"budget1!C21":true,"budget1!C22":true,"budget1!C23":true,"budget1!C24":true,"budget1!C25":true,"budget1!C26":true,"budget1!C27":true,"budget1!C28":true,"budget1!C29":true,"budget1!C30":true,"budget1!C31":true,"budget1!C32":true,"budget1!C33":true,"budget1!C34":true,"budget1!C35":true,"budget1!D4":true,"budget1!D5":true,"budget1!D6":true,"budget1!D7":true,"budget1!D8":true,"budget1!D9":true,"budget1!D10":true,"budget1!D11":true,"budget1!D12":true,"budget1!D13":true,"budget1!D14":true,"budget1!D15":true,"budget1!D16":true,"budget1!D17":true,"budget1!D18":true,"budget1!D19":true,"budget1!D20":true,"budget1!D21":true,"budget1!D22":true,"budget1!D23":true,"budget1!D24":true,"budget1!D25":true,"budget1!D26":true,"budget1!D27":true,"budget1!D28":true,"budget1!D29":true,"budget1!D30":true,"budget1!D31":true,"budget1!D32":true,"budget1!D33":true,"budget1!D34":true,"budget1!D35":true,"budget1!E4":true,"budget1!E5":true,"budget1!E6":true,"budget1!E7":true,"budget1!E8":true,"budget1!E9":true,"budget1!E10":true,"budget1!E11":true,"budget1!E12":true,"budget1!E13":true,"budget1!E14":true,"budget1!E15":true,"budget1!E16":true,"budget1!E17":true,"budget1!E18":true,"budget1!E19":true,"budget1!E20":true,"budget1!E21":true,"budget1!E22":true,"budget1!E23":true,"budget1!E24":true,"budget1!E25":true,"budget1!E26":true,"budget1!E27":true,"budget1!E28":true,"budget1!E29":true,"budget1!E30":true,"budget1!E31":true,"budget1!E32":true,"budget1!E33":true,"budget1!E34":true,"budget1!E35":true,"budget1!B2":true,"budget2!B4":true,"budget2!B5":true,"budget2!B6":true,"budget2!B7":true,"budget2!B8":true,"budget2!B9":true,"budget2!B10":true,"budget2!B11":true,"budget2!B12":true,"budget2!B13":true,"budget2!B14":true,"budget2!B15":true,"budget2!B16":true,"budget2!B17":true,"budget2!B18":true,"budget2!B19":true,"budget2!B20":true,"budget2!B21":true,"budget2!B22":true,"budget2!B23":true,"budget2!B24":true,"budget2!B25":true,"budget2!B26":true,"budget2!B27":true,"budget2!B28":true,"budget2!B29":true,"budget2!B30":true,"budget2!B31":true,"budget2!B32":true,"budget2!B33":true,"budget2!B34":true,"budget2!B35":true,"budget2!C4":true,"budget2!C5":true,"budget2!C6":true,"budget2!C7":true,"budget2!C8":true,"budget2!C9":true,"budget2!C10":true,"budget2!C11":true,"budget2!C12":true,"budget2!C13":true,"budget2!C14":true,"budget2!C15":true,"budget2!C16":true,"budget2!C17":true,"budget2!C18":true,"budget2!C19":true,"budget2!C20":true,"budget2!C21":true,"budget2!C22":true,"budget2!C23":true,"budget2!C24":true,"budget2!C25":true,"budget2!C26":true,"budget2!C27":true,"budget2!C28":true,"budget2!C29":true,"budget2!C30":true,"budget2!C31":true,"budget2!C32":true,"budget2!C33":true,"budget2!C34":true,"budget2!C35":true,"budget2!D4":true,"budget2!D5":true,"budget2!D6":true,"budget2!D7":true,"budget2!D8":true,"budget2!D9":true,"budget2!D10":true,"budget2!D11":true,"budget2!D12":true,"budget2!D13":true,"budget2!D14":true,"budget2!D15":true,"budget2!D16":true,"budget2!D17":true,"budget2!D18":true,"budget2!D19":true,"budget2!D20":true,"budget2!D21":true,"budget2!D22":true,"budget2!D23":true,"budget2!D24":true,"budget2!D25":true,"budget2!D26":true,"budget2!D27":true,"budget2!D28":true,"budget2!D29":true,"budget2!D30":true,"budget2!D31":true,"budget2!D32":true,"budget2!D33":true,"budget2!D34":true,"budget2!D35":true,"budget2!E4":true,"budget2!E5":true,"budget2!E6":true,"budget2!E7":true,"budget2!E8":true,"budget2!E9":true,"budget2!E10":true,"budget2!E11":true,"budget2!E12":true,"budget2!E13":true,"budget2!E14":true,"budget2!E15":true,"budget2!E16":true,"budget2!E17":true,"budget2!E18":true,"budget2!E19":true,"budget2!E20":true,"budget2!E21":true,"budget2!E22":true,"budget2!E23":true,"budget2!E24":true,"budget2!E25":true,"budget2!E26":true,"budget2!E27":true,"budget2!E28":true,"budget2!E29":true,"budget2!E30":true,"budget2!E31":true,"budget2!E32":true,"budget2!E33":true,"budget2!E34":true,"budget2!E35":true,"budget2!B2":true,"sheet10!B4":true,"sheet10!B5":true,"sheet10!B6":true,"sheet10!B7":true,"sheet10!B8":true,"sheet10!B9":true,"sheet10!B10":true,"sheet10!B11":true,"sheet10!B12":true,"sheet10!B13":true,"sheet10!B14":true,"sheet10!B15":true,"sheet10!B16":true,"sheet10!B17":true,"sheet10!B18":true,"sheet10!B19":true,"sheet10!B20":true,"sheet10!B21":true,"sheet10!B22":true,"sheet10!B23":true,"sheet10!B24":true,"sheet10!B25":true,"sheet10!B26":true,"sheet10!B27":true,"sheet10!B28":true,"sheet10!B29":true,"sheet10!B30":true,"sheet10!B31":true,"sheet10!B32":true,"sheet10!B33":true,"sheet10!B34":true,"sheet10!B35":true,"sheet10!C4":true,"sheet10!C5":true,"sheet10!C6":true,"sheet10!C7":true,"sheet10!C8":true,"sheet10!C9":true,"sheet10!C10":true,"sheet10!C11":true,"sheet10!C12":true,"sheet10!C13":true,"sheet10!C14":true,"sheet10!C15":true,"sheet10!C16":true,"sheet10!C17":true,"sheet10!C18":true,"sheet10!C19":true,"sheet10!C20":true,"sheet10!C21":true,"sheet10!C22":true,"sheet10!C23":true,"sheet10!C24":true,"sheet10!C25":true,"sheet10!C26":true,"sheet10!C27":true,"sheet10!C28":true,"sheet10!C29":true,"sheet10!C30":true,"sheet10!C31":true,"sheet10!C32":true,"sheet10!C33":true,"sheet10!C34":true,"sheet10!C35":true,"sheet10!D4":true,"sheet10!D5":true,"sheet10!D6":true,"sheet10!D7":true,"sheet10!D8":true,"sheet10!D9":true,"sheet10!D10":true,"sheet10!D11":true,"sheet10!D12":true,"sheet10!D13":true,"sheet10!D14":true,"sheet10!D15":true,"sheet10!D16":true,"sheet10!D17":true,"sheet10!D18":true,"sheet10!D19":true,"sheet10!D20":true,"sheet10!D21":true,"sheet10!D22":true,"sheet10!D23":true,"sheet10!D24":true,"sheet10!D25":true,"sheet10!D26":true,"sheet10!D27":true,"sheet10!D28":true,"sheet10!D29":true,"sheet10!D30":true,"sheet10!D31":true,"sheet10!D32":true,"sheet10!D33":true,"sheet10!D34":true,"sheet10!D35":true,"sheet10!E4":true,"sheet10!E5":true,"sheet10!E6":true,"sheet10!E7":true,"sheet10!E8":true,"sheet10!E9":true,"sheet10!E10":true,"sheet10!E11":true,"sheet10!E12":true,"sheet10!E13":true,"sheet10!E14":true,"sheet10!E15":true,"sheet10!E16":true,"sheet10!E17":true,"sheet10!E18":true,"sheet10!E19":true,"sheet10!E20":true,"sheet10!E21":true,"sheet10!E22":true,"sheet10!E23":true,"sheet10!E24":true,"sheet10!E25":true,"sheet10!E26":true,"sheet10!E27":true,"sheet10!E28":true,"sheet10!E29":true,"sheet10!E30":true,"sheet10!E31":true,"sheet10!E32":true,"sheet10!E33":true,"sheet10!E34":true,"sheet10!E35":true,"sheet10!B2":true,"sheet22!B4":true,"sheet22!B5":true,"sheet22!B6":true,"sheet22!B7":true,"sheet22!B8":true,"sheet22!B9":true,"sheet22!B10":true,"sheet22!B11":true,"sheet22!B12":true,"sheet22!B13":true,"sheet22!B14":true,"sheet22!B15":true,"sheet22!B16":true,"sheet22!B17":true,"sheet22!B18":true,"sheet22!B19":true,"sheet22!B20":true,"sheet22!B21":true,"sheet22!B22":true,"sheet22!B23":true,"sheet22!B24":true,"sheet22!B25":true,"sheet22!B26":true,"sheet22!B27":true,"sheet22!B28":true,"sheet22!B29":true,"sheet22!B30":true,"sheet22!B31":true,"sheet22!B32":true,"sheet22!B33":true,"sheet22!B34":true,"sheet22!B35":true,"sheet22!C4":true,"sheet22!C5":true,"sheet22!C6":true,"sheet22!C7":true,"sheet22!C8":true,"sheet22!C9":true,"sheet22!C10":true,"sheet22!C11":true,"sheet22!C12":true,"sheet22!C13":true,"sheet22!C14":true,"sheet22!C15":true,"sheet22!C16":true,"sheet22!C17":true,"sheet22!C18":true,"sheet22!C19":true,"sheet22!C20":true,"sheet22!C21":true,"sheet22!C22":true,"sheet22!C23":true,"sheet22!C24":true,"sheet22!C25":true,"sheet22!C26":true,"sheet22!C27":true,"sheet22!C28":true,"sheet22!C29":true,"sheet22!C30":true,"sheet22!C31":true,"sheet22!C32":true,"sheet22!C33":true,"sheet22!C34":true,"sheet22!C35":true,"sheet22!D4":true,"sheet22!D5":true,"sheet22!D6":true,"sheet22!D7":true,"sheet22!D8":true,"sheet22!D9":true,"sheet22!D10":true,"sheet22!D11":true,"sheet22!D12":true,"sheet22!D13":true,"sheet22!D14":true,"sheet22!D15":true,"sheet22!D16":true,"sheet22!D17":true,"sheet22!D18":true,"sheet22!D19":true,"sheet22!D20":true,"sheet22!D21":true,"sheet22!D22":true,"sheet22!D23":true,"sheet22!D24":true,"sheet22!D25":true,"sheet22!D26":true,"sheet22!D27":true,"sheet22!D28":true,"sheet22!D29":true,"sheet22!D30":true,"sheet22!D31":true,"sheet22!D32":true,"sheet22!D33":true,"sheet22!D34":true,"sheet22!D35":true,"sheet22!E4":true,"sheet22!E5":true,"sheet22!E6":true,"sheet22!E7":true,"sheet22!E8":true,"sheet22!E9":true,"sheet22!E10":true,"sheet22!E11":true,"sheet22!E12":true,"sheet22!E13":true,"sheet22!E14":true,"sheet22!E15":true,"sheet22!E16":true,"sheet22!E17":true,"sheet22!E18":true,"sheet22!E19":true,"sheet22!E20":true,"sheet22!E21":true,"sheet22!E22":true,"sheet22!E23":true,"sheet22!E24":true,"sheet22!E25":true,"sheet22!E26":true,"sheet22!E27":true,"sheet22!E28":true,"sheet22!E29":true,"sheet22!E30":true,"sheet22!E31":true,"sheet22!E32":true,"sheet22!E33":true,"sheet22!E34":true,"sheet22!E35":true,"sheet22!B2":true,"ssheet23!B4":true,"ssheet23!B5":true,"ssheet23!B6":true,"ssheet23!B7":true,"ssheet23!B8":true,"ssheet23!B9":true,"ssheet23!B10":true,"ssheet23!B11":true,"ssheet23!B12":true,"ssheet23!B13":true,"ssheet23!B14":true,"ssheet23!B15":true,"ssheet23!B16":true,"ssheet23!B17":true,"ssheet23!B18":true,"ssheet23!B19":true,"ssheet23!B20":true,"ssheet23!B21":true,"ssheet23!B22":true,"ssheet23!B23":true,"ssheet23!B24":true,"ssheet23!B25":true,"ssheet23!B26":true,"ssheet23!B27":true,"ssheet23!B28":true,"ssheet23!B29":true,"ssheet23!B30":true,"ssheet23!B31":true,"ssheet23!B32":true,"ssheet23!B33":true,"ssheet23!B34":true,"ssheet23!B35":true,"ssheet23!C4":true,"ssheet23!C5":true,"ssheet23!C6":true,"ssheet23!C7":true,"ssheet23!C8":true,"ssheet23!C9":true,"ssheet23!C10":true,"ssheet23!C11":true,"ssheet23!C12":true,"ssheet23!C13":true,"ssheet23!C14":true,"ssheet23!C15":true,"ssheet23!C16":true,"ssheet23!C17":true,"ssheet23!C18":true,"ssheet23!C19":true,"ssheet23!C20":true,"ssheet23!C21":true,"ssheet23!C22":true,"ssheet23!C23":true,"ssheet23!C24":true,"ssheet23!C25":true,"ssheet23!C26":true,"ssheet23!C27":true,"ssheet23!C28":true,"ssheet23!C29":true,"ssheet23!C30":true,"ssheet23!C31":true,"ssheet23!C32":true,"ssheet23!C33":true,"ssheet23!C34":true,"ssheet23!C35":true,"ssheet23!D4":true,"ssheet23!D5":true,"ssheet23!D6":true,"ssheet23!D7":true,"ssheet23!D8":true,"ssheet23!D9":true,"ssheet23!D10":true,"ssheet23!D11":true,"ssheet23!D12":true,"ssheet23!D13":true,"ssheet23!D14":true,"ssheet23!D15":true,"ssheet23!D16":true,"ssheet23!D17":true,"ssheet23!D18":true,"ssheet23!D19":true,"ssheet23!D20":true,"ssheet23!D21":true,"ssheet23!D22":true,"ssheet23!D23":true,"ssheet23!D24":true,"ssheet23!D25":true,"ssheet23!D26":true,"ssheet23!D27":true,"ssheet23!D28":true,"ssheet23!D29":true,"ssheet23!D30":true,"ssheet23!D31":true,"ssheet23!D32":true,"ssheet23!D33":true,"ssheet23!D34":true,"ssheet23!D35":true,"ssheet23!E4":true,"ssheet23!E5":true,"ssheet23!E6":true,"ssheet23!E7":true,"ssheet23!E8":true,"ssheet23!E9":true,"ssheet23!E10":true,"ssheet23!E11":true,"ssheet23!E12":true,"ssheet23!E13":true,"ssheet23!E14":true,"ssheet23!E15":true,"ssheet23!E16":true,"ssheet23!E17":true,"ssheet23!E18":true,"ssheet23!E19":true,"ssheet23!E20":true,"ssheet23!E21":true,"ssheet23!E22":true,"ssheet23!E23":true,"ssheet23!E24":true,"ssheet23!E25":true,"ssheet23!E26":true,"ssheet23!E27":true,"ssheet23!E28":true,"ssheet23!E29":true,"ssheet23!E30":true,"ssheet23!E31":true,"ssheet23!E32":true,"ssheet23!E33":true,"ssheet23!E34":true,"ssheet23!E35":true,"ssheet23!B2":true,"ssheet24!B4":true,"ssheet24!B5":true,"ssheet24!B6":true,"ssheet24!B7":true,"ssheet24!B8":true,"ssheet24!B9":true,"ssheet24!B10":true,"ssheet24!B11":true,"ssheet24!B12":true,"ssheet24!B13":true,"ssheet24!B14":true,"ssheet24!B15":true,"ssheet24!B16":true,"ssheet24!B17":true,"ssheet24!B18":true,"ssheet24!B19":true,"ssheet24!B20":true,"ssheet24!B21":true,"ssheet24!B22":true,"ssheet24!B23":true,"ssheet24!B24":true,"ssheet24!B25":true,"ssheet24!B26":true,"ssheet24!B27":true,"ssheet24!B28":true,"ssheet24!B29":true,"ssheet24!B30":true,"ssheet24!B31":true,"ssheet24!B32":true,"ssheet24!B33":true,"ssheet24!B34":true,"ssheet24!B35":true,"ssheet24!C4":true,"ssheet24!C5":true,"ssheet24!C6":true,"ssheet24!C7":true,"ssheet24!C8":true,"ssheet24!C9":true,"ssheet24!C10":true,"ssheet24!C11":true,"ssheet24!C12":true,"ssheet24!C13":true,"ssheet24!C14":true,"ssheet24!C15":true,"ssheet24!C16":true,"ssheet24!C17":true,"ssheet24!C18":true,"ssheet24!C19":true,"ssheet24!C20":true,"ssheet24!C21":true,"ssheet24!C22":true,"ssheet24!C23":true,"ssheet24!C24":true,"ssheet24!C25":true,"ssheet24!C26":true,"ssheet24!C27":true,"ssheet24!C28":true,"ssheet24!C29":true,"ssheet24!C30":true,"ssheet24!C31":true,"ssheet24!C32":true,"ssheet24!C33":true,"ssheet24!C34":true,"ssheet24!C35":true,"ssheet24!D4":true,"ssheet24!D5":true,"ssheet24!D6":true,"ssheet24!D7":true,"ssheet24!D8":true,"ssheet24!D9":true,"ssheet24!D10":true,"ssheet24!D11":true,"ssheet24!D12":true,"ssheet24!D13":true,"ssheet24!D14":true,"ssheet24!D15":true,"ssheet24!D16":true,"ssheet24!D17":true,"ssheet24!D18":true,"ssheet24!D19":true,"ssheet24!D20":true,"ssheet24!D21":true,"ssheet24!D22":true,"ssheet24!D23":true,"ssheet24!D24":true,"ssheet24!D25":true,"ssheet24!D26":true,"ssheet24!D27":true,"ssheet24!D28":true,"ssheet24!D29":true,"ssheet24!D30":true,"ssheet24!D31":true,"ssheet24!D32":true,"ssheet24!D33":true,"ssheet24!D34":true,"ssheet24!D35":true,"ssheet24!E4":true,"ssheet24!E5":true,"ssheet24!E6":true,"ssheet24!E7":true,"ssheet24!E8":true,"ssheet24!E9":true,"ssheet24!E10":true,"ssheet24!E11":true,"ssheet24!E12":true,"ssheet24!E13":true,"ssheet24!E14":true,"ssheet24!E15":true,"ssheet24!E16":true,"ssheet24!E17":true,"ssheet24!E18":true,"ssheet24!E19":true,"ssheet24!E20":true,"ssheet24!E21":true,"ssheet24!E22":true,"ssheet24!E23":true,"ssheet24!E24":true,"ssheet24!E25":true,"ssheet24!E26":true,"ssheet24!E27":true,"ssheet24!E28":true,"ssheet24!E29":true,"ssheet24!E30":true,"ssheet24!E31":true,"ssheet24!E32":true,"ssheet24!E33":true,"ssheet24!E34":true,"ssheet24!E35":true,"ssheet24!B2":true,"sheet25!B4":true,"sheet25!B5":true,"sheet25!B6":true,"sheet25!B7":true,"sheet25!B8":true,"sheet25!B9":true,"sheet25!B10":true,"sheet25!B11":true,"sheet25!B12":true,"sheet25!B13":true,"sheet25!B14":true,"sheet25!B15":true,"sheet25!B16":true,"sheet25!B17":true,"sheet25!B18":true,"sheet25!B19":true,"sheet25!B20":true,"sheet25!B21":true,"sheet25!B22":true,"sheet25!B23":true,"sheet25!B24":true,"sheet25!B25":true,"sheet25!B26":true,"sheet25!B27":true,"sheet25!B28":true,"sheet25!B29":true,"sheet25!B30":true,"sheet25!B31":true,"sheet25!B32":true,"sheet25!B33":true,"sheet25!B34":true,"sheet25!B35":true,"sheet25!C4":true,"sheet25!C5":true,"sheet25!C6":true,"sheet25!C7":true,"sheet25!C8":true,"sheet25!C9":true,"sheet25!C10":true,"sheet25!C11":true,"sheet25!C12":true,"sheet25!C13":true,"sheet25!C14":true,"sheet25!C15":true,"sheet25!C16":true,"sheet25!C17":true,"sheet25!C18":true,"sheet25!C19":true,"sheet25!C20":true,"sheet25!C21":true,"sheet25!C22":true,"sheet25!C23":true,"sheet25!C24":true,"sheet25!C25":true,"sheet25!C26":true,"sheet25!C27":true,"sheet25!C28":true,"sheet25!C29":true,"sheet25!C30":true,"sheet25!C31":true,"sheet25!C32":true,"sheet25!C33":true,"sheet25!C34":true,"sheet25!C35":true,"sheet25!D4":true,"sheet25!D5":true,"sheet25!D6":true,"sheet25!D7":true,"sheet25!D8":true,"sheet25!D9":true,"sheet25!D10":true,"sheet25!D11":true,"sheet25!D12":true,"sheet25!D13":true,"sheet25!D14":true,"sheet25!D15":true,"sheet25!D16":true,"sheet25!D17":true,"sheet25!D18":true,"sheet25!D19":true,"sheet25!D20":true,"sheet25!D21":true,"sheet25!D22":true,"sheet25!D23":true,"sheet25!D24":true,"sheet25!D25":true,"sheet25!D26":true,"sheet25!D27":true,"sheet25!D28":true,"sheet25!D29":true,"sheet25!D30":true,"sheet25!D31":true,"sheet25!D32":true,"sheet25!D33":true,"sheet25!D34":true,"sheet25!D35":true,"sheet25!E4":true,"sheet25!E5":true,"sheet25!E6":true,"sheet25!E7":true,"sheet25!E8":true,"sheet25!E9":true,"sheet25!E10":true,"sheet25!E11":true,"sheet25!E12":true,"sheet25!E13":true,"sheet25!E14":true,"sheet25!E15":true,"sheet25!E16":true,"sheet25!E17":true,"sheet25!E18":true,"sheet25!E19":true,"sheet25!E20":true,"sheet25!E21":true,"sheet25!E22":true,"sheet25!E23":true,"sheet25!E24":true,"sheet25!E25":true,"sheet25!E26":true,"sheet25!E27":true,"sheet25!E28":true,"sheet25!E29":true,"sheet25!E30":true,"sheet25!E31":true,"sheet25!E32":true,"sheet25!E33":true,"sheet25!E34":true,"sheet25!E35":true,"sheet25!B2":true,"sheet8!B4":true,"sheet8!B5":true,"sheet8!B6":true,"sheet8!B7":true,"sheet8!B8":true,"sheet8!B9":true,"sheet8!B10":true,"sheet8!B11":true,"sheet8!B12":true,"sheet8!B13":true,"sheet8!B14":true,"sheet8!B15":true,"sheet8!B16":true,"sheet8!B17":true,"sheet8!B18":true,"sheet8!B19":true,"sheet8!B20":true,"sheet8!B21":true,"sheet8!B22":true,"sheet8!B23":true,"sheet8!B24":true,"sheet8!B25":true,"sheet8!B26":true,"sheet8!B27":true,"sheet8!B28":true,"sheet8!B29":true,"sheet8!B30":true,"sheet8!B31":true,"sheet8!B32":true,"sheet8!B33":true,"sheet8!B34":true,"sheet8!B35":true,"sheet8!C4":true,"sheet8!C5":true,"sheet8!C6":true,"sheet8!C7":true,"sheet8!C8":true,"sheet8!C9":true,"sheet8!C10":true,"sheet8!C11":true,"sheet8!C12":true,"sheet8!C13":true,"sheet8!C14":true,"sheet8!C15":true,"sheet8!C16":true,"sheet8!C17":true,"sheet8!C18":true,"sheet8!C19":true,"sheet8!C20":true,"sheet8!C21":true,"sheet8!C22":true,"sheet8!C23":true,"sheet8!C24":true,"sheet8!C25":true,"sheet8!C26":true,"sheet8!C27":true,"sheet8!C28":true,"sheet8!C29":true,"sheet8!C30":true,"sheet8!C31":true,"sheet8!C32":true,"sheet8!C33":true,"sheet8!C34":true,"sheet8!C35":true,"sheet8!D4":true,"sheet8!D5":true,"sheet8!D6":true,"sheet8!D7":true,"sheet8!D8":true,"sheet8!D9":true,"sheet8!D10":true,"sheet8!D11":true,"sheet8!D12":true,"sheet8!D13":true,"sheet8!D14":true,"sheet8!D15":true,"sheet8!D16":true,"sheet8!D17":true,"sheet8!D18":true,"sheet8!D19":true,"sheet8!D20":true,"sheet8!D21":true,"sheet8!D22":true,"sheet8!D23":true,"sheet8!D24":true,"sheet8!D25":true,"sheet8!D26":true,"sheet8!D27":true,"sheet8!D28":true,"sheet8!D29":true,"sheet8!D30":true,"sheet8!D31":true,"sheet8!D32":true,"sheet8!D33":true,"sheet8!D34":true,"sheet8!D35":true,"sheet8!E4":true,"sheet8!E5":true,"sheet8!E6":true,"sheet8!E7":true,"sheet8!E8":true,"sheet8!E9":true,"sheet8!E10":true,"sheet8!E11":true,"sheet8!E12":true,"sheet8!E13":true,"sheet8!E14":true,"sheet8!E15":true,"sheet8!E16":true,"sheet8!E17":true,"sheet8!E18":true,"sheet8!E19":true,"sheet8!E20":true,"sheet8!E21":true,"sheet8!E22":true,"sheet8!E23":true,"sheet8!E24":true,"sheet8!E25":true,"sheet8!E26":true,"sheet8!E27":true,"sheet8!E28":true,"sheet8!E29":true,"sheet8!E30":true,"sheet8!E31":true,"sheet8!E32":true,"sheet8!E33":true,"sheet8!E34":true,"sheet8!E35":true,"sheet8!B2":true},"constraints":{}}} \ No newline at end of file diff --git a/Website/excelinterop/tmp/tmp.pdf b/Website/excelinterop/tmp/tmp.pdf deleted file mode 100644 index aa181fe..0000000 Binary files a/Website/excelinterop/tmp/tmp.pdf and /dev/null differ diff --git a/Website/excelinterop/tmp/tmp.xls b/Website/excelinterop/tmp/tmp.xls deleted file mode 100644 index 17c7a82..0000000 Binary files a/Website/excelinterop/tmp/tmp.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/tmp.xlsx b/Website/excelinterop/tmp/tmp.xlsx deleted file mode 100644 index f48b31a..0000000 Binary files a/Website/excelinterop/tmp/tmp.xlsx and /dev/null differ diff --git a/Website/excelinterop/tmp/to-do-list-1.xls b/Website/excelinterop/tmp/to-do-list-1.xls deleted file mode 100644 index e1e2860..0000000 Binary files a/Website/excelinterop/tmp/to-do-list-1.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/to-do-list.xls b/Website/excelinterop/tmp/to-do-list.xls deleted file mode 100644 index a804b03..0000000 Binary files a/Website/excelinterop/tmp/to-do-list.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/travel-expense-report.xls b/Website/excelinterop/tmp/travel-expense-report.xls deleted file mode 100644 index 4bb20f8..0000000 Binary files a/Website/excelinterop/tmp/travel-expense-report.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/visitor-sign-in-out-sheet.xls b/Website/excelinterop/tmp/visitor-sign-in-out-sheet.xls deleted file mode 100644 index 997313f..0000000 Binary files a/Website/excelinterop/tmp/visitor-sign-in-out-sheet.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/w2.xls b/Website/excelinterop/tmp/w2.xls deleted file mode 100644 index 75b3f17..0000000 Binary files a/Website/excelinterop/tmp/w2.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/weekly-meal-planner.xls b/Website/excelinterop/tmp/weekly-meal-planner.xls deleted file mode 100644 index 7b9245b..0000000 Binary files a/Website/excelinterop/tmp/weekly-meal-planner.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/weekly-timecard-by-project.xls b/Website/excelinterop/tmp/weekly-timecard-by-project.xls deleted file mode 100644 index 13cfa88..0000000 Binary files a/Website/excelinterop/tmp/weekly-timecard-by-project.xls and /dev/null differ diff --git a/Website/excelinterop/tmp/work-order-template.xls b/Website/excelinterop/tmp/work-order-template.xls deleted file mode 100644 index 5dd25cd..0000000 Binary files a/Website/excelinterop/tmp/work-order-template.xls and /dev/null differ diff --git a/Website/main.py b/Website/main.py deleted file mode 100644 index 6154f1b..0000000 --- a/Website/main.py +++ /dev/null @@ -1,152 +0,0 @@ -from flask import Flask, g, session -from flask_sqlalchemy import SQLAlchemy -import json -from dotenv import load_dotenv -import os - -# Route Handlers -from route_handlers.Auth.UserLoginHandler import UserLoginHandler -from route_handlers.Auth.UserRegisterHandler import UserRegisterHandler -from route_handlers.Auth.UserLostPasswordHandler import UserLostPasswordHandler -from route_handlers.Auth.UserLogoutHandler import UserLogoutHandler -from route_handlers.Auth.PWResetHandler import PWResetHandler -from route_handlers.SaveHandler import SaveHandler -from route_handlers.HomeHandler import HomeHandler -from route_handlers.UserSheetHandler import UserSheetHandler -from route_handlers.DownloadFileHander import DownloadFileHander -from route_handlers.ImportHandler import ImportHandler -from route_handlers.HTMLToPDFHandler import HtmlToPdfHandler - -# Load environment variables from .env file -load_dotenv() - -app = Flask(__name__, template_folder='templates') -app.secret_key = os.getenv('SECRET_KEY') - -app.config.update( - MYSQL_HOST=os.getenv('MYSQL_HOST'), - MYSQL_DATABASE=os.getenv('MYSQL_DATABASE'), - MYSQL_USER=os.getenv('MYSQL_USER'), - MYSQL_PASSWORD=os.getenv('MYSQL_PASSWORD'), - SQLALCHEMY_DATABASE_URI=os.getenv('SQLALCHEMY_DATABASE_URI'), - SQLALCHEMY_TRACK_MODIFICATIONS=os.getenv('SQLALCHEMY_TRACK_MODIFICATIONS'), - APP_TITLE=os.getenv('APP_TITLE') -) - -# Initialising Database -db = SQLAlchemy(app) - -@app.context_processor -def inject_app_title(): - return dict(APP_TITLE=app.config['APP_TITLE']) - -# Base Handlers -class BaseHandler: - @property - def db(self): - if 'db' not in g: - g.db = db - return g.db - - def get_current_user(self): - user_json = session.get('user') - if user_json: - return json.loads(user_json) - return None - - def set_current_user(self, user): - if user: - session['user'] = json.dumps(user) - else: - session.pop('user', None) - -# This code runs before every request -@app.before_request -def before_request(): - g.handler = BaseHandler() - -# This code runs when app shuts down -@app.teardown_appcontext -def teardown_db(error): - if 'db' in g: - g.db.session.close() - -# Routes -@app.route('/', methods=['GET']) -def index(): - return HomeHandler.get() - -@app.route('/login', methods=['GET']) -def login_get(): - return UserLoginHandler.get() - -@app.route('/login', methods=['POST']) -def login_post(): - return UserLoginHandler.post() - -@app.route('/register', methods=['GET']) -def register_get(): - return UserRegisterHandler.get() - -@app.route('/register', methods=['POST']) -def register_post(): - return UserRegisterHandler.post() - -@app.route('/lostpw', methods=['GET']) -def lostpw_get(): - return UserLostPasswordHandler.get() - -@app.route('/lostpw', methods=['POST']) -def lostpw_post(): - return UserLostPasswordHandler.post() - -@app.route('/logout', methods=['GET']) -def logout_get(): - return UserLogoutHandler.get() - -@app.route('/logout', methods=['POST']) -def logout_post(): - return UserLogoutHandler.post() - -@app.route('/save', methods=['GET']) -def save_get(): - return SaveHandler.get() - -@app.route('/save', methods=['POST']) -def save_post(): - return SaveHandler.post() - -@app.route('/usersheet', methods=['POST']) -def usersheet_post(): - return UserSheetHandler.post() - -@app.route('/pwreset', methods=['GET']) -def pwreset_get(): - return PWResetHandler.get() - -@app.route('/pwreset', methods=['POST']) -def pwreset_post(): - return PWResetHandler.post() - -@app.route('/downloadfile', methods=['POST']) -def download_post(): - return DownloadFileHander.post() - -@app.route('/import', methods=['GET']) -def import_get(): - return ImportHandler.get() - -@app.route('/import', methods=['POST']) -def import_post(): - return ImportHandler.post() - -@app.route('/htmltopdf', methods=['GET']) -def import_post(): - return HtmlToPdfHandler.get() - -@app.route('/htmltopdf', methods=['POST']) -def import_post(): - return HtmlToPdfHandler.post() - -if __name__ == '__main__': - app.run(debug=True) diff --git a/Website/req.txt b/Website/req.txt deleted file mode 100644 index 14b3152..0000000 --- a/Website/req.txt +++ /dev/null @@ -1,26 +0,0 @@ -blinker==1.8.2 -boto==2.49.0 -click==8.1.7 -et-xmlfile==1.1.0 -Flask==3.0.3 -Flask-SQLAlchemy==3.1.1 -gunicorn==22.0.0 -importlib_metadata==7.1.0 -itsdangerous==2.2.0 -Jinja2==3.1.4 -MarkupSafe==2.1.5 -numpy==2.0.0 -packaging==24.1 -pandas==2.2.2 -passlib==1.7.4 -pdfkit==1.0.0 -PyMySQL==1.1.1 -python-dateutil==2.9.0.post0 -python-dotenv==1.0.1 -pytz==2024.1 -six==1.16.0 -SQLAlchemy==2.0.31 -typing_extensions==4.12.2 -tzdata==2024.1 -Werkzeug==3.0.3 -zipp==3.19.2 diff --git a/Website/route_handlers/Auth/PWResetHandler.py b/Website/route_handlers/Auth/PWResetHandler.py deleted file mode 100644 index 33bc617..0000000 --- a/Website/route_handlers/Auth/PWResetHandler.py +++ /dev/null @@ -1,34 +0,0 @@ -from flask import render_template, request, session, redirect, url_for -import logging -import cloud - -class PWResetHandler: - @staticmethod - def get(): - # Retrieve user and dongle from the request arguments - user = request.args.get('u') - dongle = request.args.get('d') - logging.info(user) - logging.info(dongle) - - # Verify the dongle - if dongle and dongle == cloud.authenticate.user.get_user_dongle(user): - return render_template("pwreset.html", reguser=user) - - # Invalid dongle or user - return render_template("pwreset-invalid.html", reguser=user) - - @staticmethod - def post(): - user = request.form.get('email') - password = request.form.get('password') - logging.info(user) - logging.info(password) - - # Verify if user exists - if not cloud.authenticate.user.user_exists(user): - return render_template("lostpassword-baduser.html", reguser=user) - - # Update the user's password - cloud.authenticate.user.update_password(user, password) - return render_template("pwreset-ok.html", reguser=user) diff --git a/Website/route_handlers/Auth/UserLoginHandler.py b/Website/route_handlers/Auth/UserLoginHandler.py deleted file mode 100644 index 6b1267c..0000000 --- a/Website/route_handlers/Auth/UserLoginHandler.py +++ /dev/null @@ -1,26 +0,0 @@ -from flask import render_template, request, redirect, make_response,session -import logging -import cloud - -class UserLoginHandler: - @staticmethod - def get(): - session.pop('user', None) - response = make_response(render_template("userlogin.html", user=None)) - return response - - @staticmethod - def post(): - # Verify user login - user = request.form.get('email') - password = request.form.get('password') - logging.info(user) - logging.info(password) - if cloud.authenticate.user.authenticate_user(user, password): - logging.info("authenticate succeeded") - response = redirect('/save') - session['user'] = user - else: - logging.info("authenticate failed") - response = redirect('login') - return response diff --git a/Website/route_handlers/Auth/UserLogoutHandler.py b/Website/route_handlers/Auth/UserLogoutHandler.py deleted file mode 100644 index cea4735..0000000 --- a/Website/route_handlers/Auth/UserLogoutHandler.py +++ /dev/null @@ -1,9 +0,0 @@ -from flask import redirect, session - -class UserLogoutHandler: - @staticmethod - def get(): - # Clear the user session - session.pop('user', None) - # Redirect to the login page - return redirect('login') diff --git a/Website/route_handlers/Auth/UserLostPasswordHandler.py b/Website/route_handlers/Auth/UserLostPasswordHandler.py deleted file mode 100644 index 1b4945c..0000000 --- a/Website/route_handlers/Auth/UserLostPasswordHandler.py +++ /dev/null @@ -1,53 +0,0 @@ -from flask import render_template, request, make_response -import logging -import cloud -import string -import random -from email.message import EmailMessage - -class UserLostPasswordHandler: - @staticmethod - def get(): - # Send the lost password page - response = make_response(render_template("lostpassword.html", user=None)) - response.delete_cookie('user') - return response - - @staticmethod - def post(): - user = request.form.get('email') - logging.info(user) - - # Verify if user exists - if not cloud.authenticate.user.user_exists(user): - return render_template("lostpassword-baduser.html", reguser=user) - - # Send email with password reset link - UserLostPasswordHandler.send_lost_pw_email(user) - return render_template("lostpassword-sentemail.html", reguser=user) - - @staticmethod - def send_lost_pw_email(user): - dongle = UserLostPasswordHandler.get_random_string(20) - cloud.authenticate.user.set_user_dongle(user, dongle) - link = UserLostPasswordHandler.get_lost_pw_link(user, dongle) - msg = f"Please click the following link to reset password for user {user}\n{link}" - logging.info(msg) - - message = EmailMessage() - message['Subject'] = 'Reset Password' - message.set_content(msg) - - # TODO : Replace with your email sending code (e.g., Flask-Mail or other) - # Example using print to simulate sending - print(f"Email sent to {user}: {msg}") - - @staticmethod - def get_random_string(size): - char_set = string.ascii_uppercase + string.digits - return ''.join(random.sample(char_set, size)) - - @staticmethod - def get_lost_pw_link(user, dongle): - # Example link generation, adjust as per your application's needs - return f"http://{request.host}/pwreset?u={user}&d={dongle}" diff --git a/Website/route_handlers/Auth/UserRegisterHandler.py b/Website/route_handlers/Auth/UserRegisterHandler.py deleted file mode 100644 index 94608e5..0000000 --- a/Website/route_handlers/Auth/UserRegisterHandler.py +++ /dev/null @@ -1,25 +0,0 @@ -from flask import render_template, request, make_response -import logging -from cloud.authenticate.user import user_exists,create_user - -class UserRegisterHandler: - @staticmethod - def get(): - # Send the registration page - response = make_response(render_template("userregister.html", user=None)) - response.delete_cookie('user') - return response - - @staticmethod - def post(): - user = request.form.get('email') - password = request.form.get('password') - logging.info(user) - logging.info(password) - if user_exists(user): - # User already exists - return render_template("userregister-exists.html", user=None, reguser=user) - create_user(user, password) - response = make_response(render_template("userregister-ok.html", user=user)) - response.set_cookie('user', user) - return response \ No newline at end of file diff --git a/Website/route_handlers/Auth/__init__.py b/Website/route_handlers/Auth/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/Website/route_handlers/DownloadFileHander.py b/Website/route_handlers/DownloadFileHander.py deleted file mode 100644 index c563c6d..0000000 --- a/Website/route_handlers/DownloadFileHander.py +++ /dev/null @@ -1,85 +0,0 @@ -from flask import request, Response -import codecs -import subprocess -import logging - -def capitalize_first_letter(word): - if len(word) > 0: - return word[0].upper() + word[1:] - else: - return word # Return empty string if input is empty - -contenttypes = { - "MSC": "text/plain", - "MSCE": "text/plain", - "HTML": "text/html", - "PDF": "application/pdf", - "Excel2007": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - "Excel5": "application/vnd.ms-excel", - "CSV": "text/plain", - "ODS": "application/vnd.oasis.opendocument.spreadsheet" -} - -suffix = { - "MSC": "msc", - "MSCE": "msce", - "HTML": "html", - "PDF": "pdf", - "Excel2007": "xlsx", - "Excel5": "xls", - "CSV": "csv", - "ODS":"ods" -} - - -class DownloadFileHander: - @staticmethod - def post(): - type = request.form.get('type') - content = request.form.get('content') - - if type not in ["MSC", "MSCE", "HTML", "PDF"]: - fullfname = "excelinterop/tmp/tmp" - inpfile = fullfname + ".b" - - with codecs.open(inpfile, encoding='utf-8', mode="w") as f: - f.write(content) - outfile = fullfname + "." + suffix.get(type, "txt") - logging.info(outfile) - logging.info(inpfile) - cmdname = "excelinterop/export.php" - writer = capitalize_first_letter(suffix.get(type, "txt")) - output = subprocess.getoutput(f"php {cmdname} {inpfile} {outfile} {writer}") - logging.info(output) - - with open(outfile, 'rb') as f: - content = f.read() - - elif type == "PDF": - logging.info("type is PDF") - fullfname = "excelinterop/tmp/tmp" - inpfile = fullfname + ".html" - - with codecs.open(inpfile, encoding='utf-8', mode="w+") as f: - f.write(content) - - outfile = fullfname + "." + suffix.get(type, "pdf") - logging.info(outfile) - logging.info(inpfile) - cmdname = "wkhtmltopdf" - output = subprocess.getoutput(f"{cmdname} {inpfile} {outfile}") - logging.info(output) - - with open(outfile, 'rb') as f: - content = f.read() - - else: - # This assumes the content is directly returned if it's a supported type without conversion - content = content.encode('utf-8') - - response = Response(content) - response.headers['Content-Type'] = contenttypes.get(type, 'application/octet-stream') - response.headers['Content-Disposition'] = f'attachment; filename="tmp.{suffix.get(type, "txt")}"' - response.headers['Cache-Control'] = 'max-age=0' - - return response \ No newline at end of file diff --git a/Website/route_handlers/HTMLToPDFHandler.py b/Website/route_handlers/HTMLToPDFHandler.py deleted file mode 100644 index d199c7b..0000000 --- a/Website/route_handlers/HTMLToPDFHandler.py +++ /dev/null @@ -1,100 +0,0 @@ -from flask import request, jsonify, send_file, make_response -import logging -import os -import random -import string -import json -import time -import subprocess -from cloud.storage.storage import existsItem,getItem - -class HtmlToPdfHandler: - def __init__(self): - self.base_path = "excelinterop/tmp/tmp" - self.preview_path = os.path.join(self.base_path, "preview") - - def exists_in_storage(self, fname): - return existsItem(fname, "aspiring-pdf-files") - - def get_from_storage(self, fname): - return getItem(fname, "aspiring-pdf-files") - - def get_random_string(self, size): - char_set = string.ascii_uppercase + string.digits - return ''.join(random.sample(char_set, size)) - - def get(self): - logging.info("in htmltopdf converter get") - fname = request.args.get('fname') - action = request.args.get('action', default=None) - - if action == "preview": - fullfname = os.path.join(self.preview_path, fname) - inpfile = fullfname + ".pdf" - logging.info(f"fname={inpfile}") - - if os.path.exists(inpfile): - logging.info(f"found {fname} on disk") - return send_file(inpfile, mimetype="application/pdf") - else: - return "Not Found", 404 - - fullfname = os.path.join(self.base_path, fname) - inpfile = fullfname + ".pdf" - logging.info(f"fname={inpfile}") - - if os.path.exists(inpfile): - logging.info(f"found {fname} on disk") - return send_file(inpfile, mimetype="application/pdf") - else: - data = self.get_from_storage(fname) - if data: - logging.info(f"found {fname} in s3") - response = make_response(data) - response.headers.set('Content-Type', 'application/pdf') - return response - else: - return "Not Found", 404 - - def post(self): - logging.info("in htmltopdf converter post") - action = request.form.get('action', default=None) - - if action == "preview": - while True: - fname = self.get_random_string(20) - fullfname = os.path.join(self.preview_path, fname) - if not os.path.exists(fullfname): - break - else: - while True: - fname = self.get_random_string(20) - fullfname = os.path.join(self.base_path, fname) - if not os.path.exists(fullfname) and not self.exists_in_storage(fname): - break - - if action == "send": - uuid = request.form.get('uuid', default=None) - appname = request.form.get('appname', default=None) - filename = request.form.get('filename', default=None) - created = time.strftime("%Y:%m:%d %H:%M:%S") - jsondata = {"uuid": uuid, "appname": appname, "filename": filename, "created": created} - jsonstr = json.dumps(jsondata) - jsonfile = fullfname + ".json" - with open(jsonfile, "w") as f: - f.write(jsonstr) - - inpfile = fullfname + ".html" - content = request.form.get('content') - - with open(inpfile, "w") as f: - f.write(content) - - outfile = fullfname + ".pdf" - logging.info(outfile) - logging.info(inpfile) - cmdname = "wkhtmltopdf" - subprocess_output = subprocess.getoutput(f"{cmdname} {inpfile} {outfile}") - - pdfurl = f"http://{request.host}/htmltopdf?fname={fname}&action={action}" if action else f"http://{request.host}/htmltopdf?fname={fname}" - return jsonify(pdfurl=pdfurl, result="ok") \ No newline at end of file diff --git a/Website/route_handlers/HomeHandler.py b/Website/route_handlers/HomeHandler.py deleted file mode 100644 index 316bf97..0000000 --- a/Website/route_handlers/HomeHandler.py +++ /dev/null @@ -1,10 +0,0 @@ -from flask import redirect, session - -class HomeHandler: - @staticmethod - def get(): - if 'user' not in session: - return redirect("/login") - return redirect("/save") - #self.render("sheetshome.html") - #self.render("testtouch.html") \ No newline at end of file diff --git a/Website/route_handlers/ImportHandler.py b/Website/route_handlers/ImportHandler.py deleted file mode 100644 index f85699d..0000000 --- a/Website/route_handlers/ImportHandler.py +++ /dev/null @@ -1,68 +0,0 @@ -from flask import request, render_template, make_response -import logging -import string -import random -import subprocess - -channels = {} -sessionfileuploads = {} - -def get_random_string(size): - char_set = string.ascii_uppercase + string.digits - return ''.join(random.sample(char_set, size)) - -class MessageMixin: - def __init__(self, session, sheetstr, sheetmscestr): - self.session = session - self.sheetstr = sheetstr - self.sheetmscestr = sheetmscestr - -class ImportHandler: - @staticmethod - def get(): - session = get_random_string(6) - logging.info(f"session is {session}") - - resp = make_response(render_template('importcollab.html', entry={ - 'fname': 'test', - 'sheetstr': '', - 'sheetmscestr': '', - 'session': session - })) - resp.set_cookie('session', session) - resp.set_cookie('idinsession', '1') - - channels[session] = MessageMixin(session, "", "") - return resp - - def post(): - session = request.cookies.get('session') - upload_file = request.files['upload'] - fname = upload_file.filename - fcontent = upload_file.read() - - if fname[-3:] != "msc" and fname[-4:] != "msce": - fullfname = f"excelinterop/tmp/{fname}" - with open(fullfname, 'wb') as f: - f.write(fcontent) - - cmdname = "excelinterop/import.php" - output = subprocess.getoutput(f"php {cmdname} {fullfname}") - i = output.index("$---$") - wbook = output[i + 5:] - else: - wbook = fcontent.decode('utf-8') - - sessionfileuploads[fname] = wbook - - resp = make_response(render_template('importcollabload.html', entry={ - 'fname': fname, - 'sheetmscestr': wbook if fname[-4:] == 'msce' else '', - 'sheetstr': '' if fname[-4:] == 'msce' else wbook, - 'session': session - })) - resp.set_cookie('idinsession', '1') - - return resp - - diff --git a/Website/route_handlers/SaveHandler.py b/Website/route_handlers/SaveHandler.py deleted file mode 100644 index e8ddd2f..0000000 --- a/Website/route_handlers/SaveHandler.py +++ /dev/null @@ -1,55 +0,0 @@ -from flask import render_template, request, redirect, session,jsonify -import logging -from cloud.storage.storage import getFile,createDir,createFile,updateFile -import json - -class SaveHandler: - @staticmethod - def get(): - if 'user' not in session: - return redirect('/') - - user = session['user'] - - path = ["home", user] - dirobj = getFile(path) - - if not dirobj or len(dirobj.files) == 0: - logging.info("no directory") - createDir(path) - filedata = { - "user": user, - "fname": "default", - "data": "\n" - } - fpath = path + ["default"] - logging.info(fpath) - createFile(fpath, json.dumps(filedata)) - dirobj = getFile(path) - - entries = dirobj.files - logging.info(entries) - logging.info("done") - - return render_template("allusersheets.html", entries=entries) - - def post(): - if 'user' not in session: - return redirect('/') - - user = session['user'] - - fname = request.form.get('fname') - logging.info("fname is " + fname) - sheetstr = request.form.get("data", None) - path = ["home", user, fname] - - if sheetstr is not None: - fileobj = getFile(path) - if fileobj is None: - createFile(path, sheetstr) - else: - updateFile(path, sheetstr) - - return jsonify(data="Done") - diff --git a/Website/route_handlers/UserSheetHandler.py b/Website/route_handlers/UserSheetHandler.py deleted file mode 100644 index 6c52153..0000000 --- a/Website/route_handlers/UserSheetHandler.py +++ /dev/null @@ -1,47 +0,0 @@ -from flask import render_template, request, redirect, session,jsonify -import logging -from cloud.storage.storage import deleteFile,getFile - -import string -import random - -def get_random_string(size): - char_set = string.ascii_uppercase + string.digits - return ''.join(random.sample(char_set, size)) - -class UserSheetHandler: - @staticmethod - def post(): - if 'user' not in session: - return redirect('/') - user = session['user'] - - fname = request.form.get("pagename") - logging.info(request.form) - - path = ["home", user, fname] - - # Check if delete parameter is set to delete the file - if request.form.get("delete") == "yes": - logging.info(f"Deleting {fname}") - deleteFile(path) - return redirect('save') - - session_id = get_random_string(6) - logging.info(f"Session ID is {session_id}") - - fileobj = getFile(path) - - if fileobj is None: - logging.info(f"File not found: {fname}") - return redirect('/save') - - entry = { - 'fname': fname, - 'sheetstr': fileobj.data, - 'sheetmscestr': "", - 'session': session_id - } - - # Render template with entry data - return render_template("importcollabload.html", entry=entry) \ No newline at end of file diff --git a/Website/route_handlers/__init__.py b/Website/route_handlers/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/Website/run.sh b/Website/run.sh deleted file mode 100644 index b643340..0000000 --- a/Website/run.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -nohup gunicorn -w 4 -b 0.0.0.0:8000 main:app > /dev/null 2> /dev/null < /dev/null & -nohup gunicorn -w 4 -b 0.0.0.0:8001 main:app > /dev/null 2> /dev/null < /dev/null & -nohup gunicorn -w 4 -b 0.0.0.0:8002 main:app > /dev/null 2> /dev/null < /dev/null & -nohup gunicorn -w 4 -b 0.0.0.0:8003 main:app > /dev/null 2> /dev/null < /dev/null & \ No newline at end of file diff --git a/Website/runnginx.sh b/Website/runnginx.sh deleted file mode 100644 index 1600163..0000000 --- a/Website/runnginx.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -sudo systemctl start nginx \ No newline at end of file diff --git a/Website/runwithlogs.sh b/Website/runwithlogs.sh deleted file mode 100644 index 26176c0..0000000 --- a/Website/runwithlogs.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -nohup gunicorn -w 4 -b 0.0.0.0:8000 main:app > /home/ubuntu/logs/cloudmain/8000.log 2> /home/ubuntu/logs/cloudmain/8000.err < /dev/null & -nohup gunicorn -w 4 -b 0.0.0.0:8001 main:app > /home/ubuntu/logs/cloudmain/8001.log 2> /home/ubuntu/logs/cloudmain/8001.err < /dev/null & -nohup gunicorn -w 4 -b 0.0.0.0:8002 main:app > /home/ubuntu/logs/cloudmain/8002.log 2> /home/ubuntu/logs/cloudmain/8002.err < /dev/null & -nohup gunicorn -w 4 -b 0.0.0.0:8003 main:app > /home/ubuntu/logs/cloudmain/8003.log 2> /home/ubuntu/logs/cloudmain/8003.err < /dev/null & \ No newline at end of file diff --git a/Website/static/#%2Amerge%2A#850aay# b/Website/static/#%2Amerge%2A#850aay# deleted file mode 100644 index e9e434e..0000000 --- a/Website/static/#%2Amerge%2A#850aay# +++ /dev/null @@ -1,1870 +0,0 @@ -// -// Workbook Control controls workbook actions (add/del/rename etc) and can appear at the -// bottom of the screen (?). Right now its just a proof of concept -// and appears at the top of the screen -// -// Author: Ramu Ramamurthy -// -// - -var SocialCalc; -if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; -} - -SocialCalc.CurrentWorkbookControlObject = null; - -SocialCalc.TestWorkBookSaveStr = ""; - - -// Constructor: - -SocialCalc.WorkBookControl = function(book, divid, defaultsheetname) { - - this.workbook = book; - this.div = divid; - this.defaultsheetname = defaultsheetname; - this.sheetButtonArr = {}; - this.sheetCnt = 0; - this.numSheets = 0; - this.currentSheetButton = null; - this.renameDialogId = "sheetRenameDialog"; - this.deleteDialogId = "sheetDeleteDialog"; - this.hideDialogId = "sheetHideDialog"; - this.unhideDialogId = "sheetUnhideDialog"; - - this.sheetshtml = ''; - -//this.buttonshtml = -//'
    '+ -//'
    '+ -//''+ -//''+ -//''+ - -// ''+ -// ''+ -// ''+ - -//''+ -//''+ -//'
    '+ -//'
    '; - - SocialCalc.CurrentWorkbookControlObject = this; - this.sheetbar = new SocialCalc.SheetBar(); -} - -// methods -SocialCalc.WorkBookControl.prototype.GetCurrentWorkBookControl = function() {return SocialCalc.GetCurrentWorkBookControl();}; -SocialCalc.WorkBookControl.prototype.InitializeWorkBookControl = function() {return SocialCalc.InitializeWorkBookControl(this);}; - - -SocialCalc.WorkBookControl.prototype.ExecuteWorkBookControlCommand = function(cmd, isremote) { - return SocialCalc.ExecuteWorkBookControlCommand(this, cmd, isremote); -} - -SocialCalc.ExecuteWorkBookControlCommand = function(control, cmd, isremote) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - //if (!isremote) { - // return; - //} - - if (cmd.cmdtype == "scmd") { - // dispatch a sheet command - control.workbook.WorkbookScheduleCommand(cmd, isremote); - return; - - } - - if (cmd.cmdtype != "wcmd") { - return; - } - - var parseobj = new SocialCalc.Parse(cmd.cmdstr); - - var cmd1 = parseobj.NextToken(); - - switch (cmd1) { - case "addsheet": - SocialCalc.WorkBookControlAddSheetRemote(null); - break; - - case "addsheetstr": - var sheetstr = cmd.sheetstr; - SocialCalc.WorkBookControlAddSheetRemote(sheetstr); - break; - - case "delsheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlDelSheetRemote(sheetid); - break; - - case "rensheet": - var sheetid = parseobj.NextToken(); - var oldname = parseobj.NextToken(); - var newname = parseobj.NextToken(); - SocialCalc.WorkBookControlRenameSheetRemote(sheetid, oldname, newname); - break; - - case "activatesheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlActivateSheet(sheetid); - break; - - case "hidesheet": - var sheetid = parseobj.NextToken(); - - break; - - case "unhidesheet": - var sheetid = parseobj.NextToken(); - - break; - } -} - -SocialCalc.GetCurrentWorkBookControl = function() { - return SocialCalc.CurrentWorkbookControlObject; -} - -SocialCalc.InitializeWorkBookControl = function(control) { - var element = document.createElement("div"); - element.innerHTML = control.sheetshtml; - var foo = document.getElementById(control.div); - foo.appendChild(element); - //var element2 = document.createElement("div"); - //element2.innerHTML = control.buttonshtml; - //foo.appendChild(element2); - SocialCalc.WorkBookControlAddSheet(false); // this is for the default sheet -} - -SocialCalc.WorkBookControlDelSheetRemote = function(sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (sheetid == control.currentSheetButton.id) { - // the active sheet is being deleted - SocialCalc.WorkBookControlDelSheet(); - return; - } - // some non active sheet is being deleted - var foo = document.getElementById("fooBar"); - var deletedbutton = document.getElementById(sheetid); - - var did = deletedbutton.id; - var dname = deletedbutton.value; - delete control.sheetButtonArr[did]; - - foo.removeChild(deletedbutton); - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+did); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - // delete the sheet - control.workbook.DeleteWorkBookSheet(did, dname); - control.numSheets = control.numSheets-1; - -} - -// assumes that the current active sheet is being deleted -SocialCalc.WorkBookControlDelSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } -if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='To delete the selected sheet, you must first insert a new sheet.
    '; -str +='
    '+ - '
    '; - var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the deletion of the sheet - // the popup has two buttons : Confirm and Cancel -var element = document.getElementById(control.deleteDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+ 'The selected sheet will be permanently deleted.'+ '
    '; -str +='
      '; - str +='
    • To delete the selected sheet, click OK.
    • '; - str +='
    • To cancel the deletion, click cancel.
    • '; -str+='
    '; -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.WorkBookControlDeleteSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.deleteDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlDeleteSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlDeleteSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.currentSheetButton = null; - // delete the sheets - control.workbook.DeleteWorkBookSheet(name, curname); - control.numSheets = control.numSheets-1; - - var cmdstr = "delsheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true) - break; - } - } - if (control.currentSheetButton != null) { - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } -} - -// assumes that the current active sheet is being hidden -SocialCalc.WorkBookControlHideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='Before hiding the selected sheet, you must first insert a new sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the hiding of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.hideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The selected sheet will be hidden.'+ '
    '; - str +='
      '; - str +='
    • To hide the selected sheet, click OK.
    • '; - str +='
    • To cancel the hiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - -SocialCalc.WorkBookControlHideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.hideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlHideSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlHideSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, false); - sheetbarbutton.style.display="none"; - control.currentSheetButton = null; - // delete the sheets - - control.numSheets = control.numSheets-1; - - var cmdstr = "hidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - -// displays all hidden sheets, and then unhides whatever is selected -SocialCalc.WorkBookControlUnhideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - - var unhiddencount = 0; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - unhiddencount++; - } - } - - if(unhiddencount==0) { //no hidden sheets, error message here - var str = '
    '+ - ''+' There are no hidden worksheets. ' + '

    '; - str +='Before unhiding any sheets, you must first hide a sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - var element = document.getElementById(control.unhideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The following sheets are hidden.'+ '
      ' + - ''; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - str += '' + control.sheetButtonArr[sheet].value +'
      '; - } - } - - str +='
    \n
      '; - str +='
    • To unhide the selected sheet, click OK.
    • '; - str +='
    • To cancel the unhiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - - - -SocialCalc.WorkBookControlUnhideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.unhideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} - - -SocialCalc.WorkBookControlUnhideSheetSubmit = function(name) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlUnhideSheetHide(); - var current = document.getElementById(control.currentSheetButton.id); - - var curid = current.id; - var curname = control.currentSheetButton.value; - - control.currentSheetButton.setAttribute("style",""); - var old = control.currentSheetButton.id; - console.log(old); - SocialCalc.SheetBarButtonActivate(old, false); - - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unhide the button - sheetbarbutton.style.display = "inline"; - control.currentSheetButton = null; - - control.numSheets = control.numSheets+1; - - var cmdstr = "unhidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - - - -SocialCalc.WorkBookControlAddSheetButton = function(sheetname, sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - //Create an input type dynamically. - var element = document.createElement("input"); - - var name = null; - - if (sheetid != null) { - name = sheetid - } else { - name = "sheet"+ (control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt + 1; - } - - //Assign different attributes to the element. - element.setAttribute("type", "button"); - if (sheetname == null) { - element.setAttribute("value", name); - } else { - element.setAttribute("value", sheetname); - } - element.setAttribute("id", name); - element.setAttribute("name", name); - - var fnname = "SocialCalc.WorkBookControlActivateSheet("+"'"+name+"'"+")"; - - element.setAttribute("onclick",fnname); - - control.sheetButtonArr[name] = element; - - - var foo = document.getElementById("fooBar"); - - //Append the element in page (in span). - foo.appendChild(element); - - control.numSheets = control.numSheets + 1; - - var el = new SocialCalc.SheetBarSheetButton("sbsb-"+name, (sheetname?sheetname:name), - document.getElementById("SocialCalc-sheetbar-buttons"), - { - //normalstyle: "border:1px solid #000;backgroundColor:#FFF;", - //downstyle: "border:1px solid #000;backgroundColor:#CCC;", - //hoverstyle: "border:1px solid #000;backgroundColor:#FFF;" - }, - { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(name);}, - Repeat:function(){}, - Disabled: function() {} - } - ); - - return element; -} - -SocialCalc.WorkBookControlAddSheet = function(addworksheet, sheetname){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(sheetname); - - // then change the highlight - - var old="sheet1"; - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style", ""); - old = control.currentSheetButton.id; - SocialCalc.SheetBarButtonActivate(old, false); - } - - element.setAttribute("style","background-color:lightgreen"); - control.currentSheetButton = element; - var newsheetid = element.id; - SocialCalc.SheetBarButtonActivate(newsheetid, true); - - // create the sheet - if (addworksheet) { - control.workbook.AddNewWorkBookSheet(newsheetid, old, false); - // broadcast an add command here - var cmdstr = "addsheet" - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - } - -} - -SocialCalc.WorkBookControlAddSheetRemote = function(savestr){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(); - - // add the sheet, dont switch to it - control.workbook.AddNewWorkBookSheetNoSwitch(element.id, - element.value, savestr); -} - - -SocialCalc.WorkBookControlActivateSheet = function(name) { - - //alert("in activate sheet="+name) - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById(name); - foo.setAttribute("style","background-color:lightgreen;"); - SocialCalc.SheetBarButtonActivate(name, true) - - var old = control.currentSheetButton.id; - if (control.currentSheetButton.id != foo.id) { - control.currentSheetButton.setAttribute("style", ""); - SocialCalc.SheetBarButtonActivate(old, false) - } - - control.currentSheetButton = foo; - - control.workbook.ActivateWorkBookSheet(name, old); - -} - -SocialCalc.WorkBookControlHttpRequest = null; - -SocialCalc.WorkBookControlAlertContents = function(){ - - var loadedstr = ""; - var http_request = SocialCalc.WorkBookControlHttpRequest; - - if (http_request.readyState == 4) { - //addmsg("received:" + http_request.responseText.length + " chars"); - try { - if (http_request.status == 200) { - loadedstr = http_request.responseText || ""; - http_request = null; - } - else { - ; - } - } - catch (e) { - } - // do something with loaded str - //alert("loaded="+loadedstr); - SocialCalc.TestWorkBookSaveStr = loadedstr; - SocialCalc.Clipboard.clipboard = loadedstr; - } -} - - -SocialCalc.WorkBookControlAjaxCall = function(url, contents) { - - var http_request = null; - - alert("in ajax") - if (window.XMLHttpRequest) { // Mozilla, Safari,... - http_request = new XMLHttpRequest(); - } - else - if (window.ActiveXObject) { // IE - try { - http_request = new ActiveXObject("Msxml2.XMLHTTP"); - } - catch (e) { - try { - http_request = new ActiveXObject("Microsoft.XMLHTTP"); - } - catch (e) { - } - } - } - if (!http_request) { - alert('Giving up :( Cannot create an XMLHTTP instance'); - return false; - } - - // Make the actual request - SocialCalc.WorkBookControlHttpRequest = http_request; - - http_request.onreadystatechange = SocialCalc.WorkBookControlAlertContents; - http_request.open('POST', document.URL, true); // async - http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - http_request.send(contents); - - return true; - -} - -SocialCalc.WorkBookControlSaveSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetsave = {}; - - sheetsave.numsheets = control.numSheets; - sheetsave.currentid = control.currentSheetButton.id; - sheetsave.currentname = control.currentSheetButton.value; - - sheetsave.sheetArr = {} - for (var sheet in control.sheetButtonArr) { - var sheetstr = control.workbook.SaveWorkBookSheet(sheet); - sheetsave.sheetArr[sheet] = {} - sheetsave.sheetArr[sheet].sheetstr = sheetstr; - sheetsave.sheetArr[sheet].name = control.sheetButtonArr[sheet].value; - sheetsave.sheetArr[sheet].hidden = document.getElementById("sbsb-" + sheet).style.display == "none" ? "1" : "0"; - } - - // Save the editable cells if specified - if (SocialCalc.EditableCells && SocialCalc.EditableCells.allow) { - sheetsave.EditableCells = {}; - for (var i in SocialCalc.EditableCells) { - sheetsave.EditableCells[i] = SocialCalc.EditableCells[i]; - } - } - - SocialCalc.TestWorkBookSaveStr = JSON.stringify(sheetsave); - //alert(SocialCalc.TestWorkBookSaveStr); - // send it to the backend - // SocialCalc.WorkBookControlAjaxCall("/", "&sheetdata="+encodeURIComponent(SocialCalc.TestWorkBookSaveStr)); - return SocialCalc.TestWorkBookSaveStr; -} - - -// insert another workbook into an existing workbook -// assumption is at least 1 sheet exists in existing workbook -// sheets with same names will be overwritten ! -SocialCalc.WorkBookControlInsertWorkbook = function(savestr) { - var sheetsave - if (savestr) { - sheetsave = JSON.parse(savestr); - } - var control = SocialCalc.GetCurrentWorkBookControl(); - for (var sheet in sheetsave.sheetArr) { - - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end) - } - } - // check if sheetname already exists - var sheetname = sheetsave.sheetArr[sheet].name - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - if (sheetid) { - //alert(sheetname+"exists") - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, sheetname) - } - else { - //just test-brand new insert first - sheetid = "sheet"+(control.sheetCnt+1).toString() - control.sheetCnt = control.sheetCnt+1 - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid) - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr) - - } - } - -} - -SocialCalc.WorkBookControlLoad = function(savestr){ - - var sheetsave; - - if (savestr == "") return; - - if (savestr) { - sheetsave = JSON.parse(savestr); - } else { - sheetsave = JSON.parse(SocialCalc.TestWorkBookSaveStr); - } - //alert(sheetsave.currentid+","+sheetsave.currentname) - - // first create a new workbook - var control = SocialCalc.GetCurrentWorkBookControl(); - - SocialCalc.WorkBookControlCreateNewBook(); - - // at this point there is one sheet, and 1 button - // create the sequence of buttons, and sheets - var firstrun = true; - var newbuttons = 0 - var sheetid = null; - var currentsheetid = sheetsave.currentid; - //alert("button="+newbuttons) - for (var sheet in sheetsave.sheetArr) { - //alert(sheet); - if (newbuttons > sheetsave.numsheets) { - break; - } - //alert("button="+newbuttons) - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - if (firstrun) { - firstrun=false; - // set the first button's name correctly - sheetid = control.currentSheetButton.id; - control.currentSheetButton.value = sheetsave.sheetArr[sheet].name; - SocialCalc.SheetBarButtonSetName(sheetid, sheetsave.sheetArr[sheet].name); - // set the sheet data for the first sheet which already exists - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, control.currentSheetButton.value); - // need to also set the formula cache - currentsheetid = sheetid; - } - else { - sheetid = "sheet"+(control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt+1; - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr); - } - if(sheetsave.sheetArr[sheet].hidden=="1") { - // unregister with mouse ? etc - var sheetbarbutton = document.getElementById("sbsb-" + sheetid); - sheetbarbutton.style.display="none"; - SocialCalc.SheetBarButtonActivate(sheet, false); - newbuttons= newbuttons - 1; - } - if (sheet == sheetsave.currentid) { - currentsheetid = sheetid - } - newbuttons = newbuttons + 1; - } - // Save the user script data - if (sheetsave.EditableCells) { - SocialCalc.EditableCells = {}; - for (var i in sheetsave.EditableCells) { - SocialCalc.EditableCells[i] = sheetsave.EditableCells[i]; - } - } - var timeoutFn = function() { - SocialCalc.WorkBookControlActivateSheet(currentsheetid); - }; - window.setTimeout(timeoutFn, 200); -} - - -SocialCalc.WorkBookControlRenameSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // do a popup to get the new name of the sheet - // the popup has an input element with submit, and cancel buttons - var element = document.getElementById(control.renameDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+'Rename-'+ currentsheet + '
    '+ - '' + 'Please ensure that you DO NOT have ANY spaces in the sheet name.' + '' + - '
    '+'
    '; - -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.renameDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - -var ele = document.getElementById("newSheetName"); -ele.focus(); -SocialCalc.CmdGotFocus(ele); - -} - -SocialCalc.WorkBookControlRenameSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.renameDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlRenameSheetSubmit = function(){ - - // this handles all the rename action - var ele = document.getElementById("newSheetName"); - //alert(ele.value); - var control = SocialCalc.GetCurrentWorkBookControl(); - if (ele.value.length == 0) { - ele.focus(); - return; - } - var oldname = control.currentSheetButton.value; - var newname = ele.value; - - - SocialCalc.WorkBookControlRenameSheetHide(); - // verify newname does not clash with any existing sheet name - // if so reject - for (var sheet in control.sheetButtonArr) { - if (control.sheetButtonArr[sheet].value == newname) { - alert(newname+" already exists"); - return; - } - } - - control.currentSheetButton.value = newname; - - SocialCalc.SheetBarButtonSetName (control.currentSheetButton.id, newname); - - // perform a rename for formula references to this sheet in all the - // sheets in the workbook - control.workbook.RenameWorkBookSheet(oldname, ele.value, control.currentSheetButton.id); - - var cmdstr = "rensheet "+control.currentSheetButton.id+" "+oldname+" "+newname; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - -} - -SocialCalc.WorkBookControlRenameSheetRemote = function(sheetid, oldname, newname) { - //console.log("rename sheet ",sheetid, oldname, newname) - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById("fooBar"); - var renbutton = document.getElementById(sheetid); - - renbutton.value = newname; - - SocialCalc.SheetBarButtonSetName(sheetid, newname); - -control.workbook.RenameWorkBookSheet(oldname, newname, sheetid); - -} - - -SocialCalc.WorkBookControlCreateNewBook = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // delete all the sheets except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - control.workbook.DeleteWorkBookSheet(control.sheetButtonArr[sheet].id, control.sheetButtonArr[sheet].value); - } - } - // Reset that 1 sheet - - control.workbook.LoadRenameWorkBookSheet(control.currentSheetButton.id, "", control.workbook.defaultsheetname) - - - // delete all the buttons except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.sheetButtonArr[sheet].id); - - var name = current.id; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - control.numSheets = control.numSheets - 1; - } - } - // rename that button - control.currentSheetButton.value = control.workbook.defaultsheetname; - //alert("done new workbook") -} - -SocialCalc.WorkBookControlNewBook = function() { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlCreateNewBook(); - control.workbook.RenderWorkBookSheet(); -} - - -SocialCalc.WorkBookControlMove = function(direction){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - return; - } - var sheetArr = control.sheetButtonArr; - var newSheetArr = {}; - var sheetid = control.currentSheetButton.id; - - var curr_button = document.getElementById(sheetid); - var curr_sb_button = document.getElementById("sbsb-"+sheetid); - var sib_button = null; - var sib_sb_button = null; - if (direction == "left") { - sib_button = curr_button.previousSibling; - sib_sb_button = curr_sb_button.previousSibling; - if(!sib_sb_button) { - alert("Cannot move leftmost Sheet further to the left"); - return; - } - } - else { - sib_button = curr_button.nextSibling; - sib_sb_button = curr_sb_button.nextSibling; - if(!sib_sb_button) { - alert("Cannot move rightmost Sheet further to the right"); - return; - } - } - var currid = sheetid; - var sibid = sib_button.id; - var parent = curr_button.parentNode; - var sb_parent = curr_sb_button.parentNode; - - var cloned = {}; - var clonedsb = {}; - for(button in sheetArr) { - clonedsb[button] = document.getElementById("sbsb-"+button); - cloned[button] = document.getElementById(button); - sb_parent.removeChild(document.getElementById("sbsb-"+button)); - parent.removeChild(document.getElementById(button)); - } - for(button in sheetArr) { - if(button != currid && button != sibid) { - newSheetArr[button] = sheetArr[button]; - sb_parent.appendChild(clonedsb[button]); - parent.appendChild(cloned[button]); - } - else if(button == currid) { - if (direction == "left") { - newSheetArr[currid] = sheetArr[currid]; - newSheetArr[sibid] = sheetArr[sibid]; - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - } else { - newSheetArr[sibid] = sheetArr[sibid]; - newSheetArr[currid] = sheetArr[currid]; - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - } - } - } - control.sheetButtonArr = newSheetArr; - SocialCalc.SheetBarButtonActivate(currid,true); -} - -SocialCalc.WorkBookControlMoveLeft = function(){ - SocialCalc.WorkBookControlMove("left"); -} -SocialCalc.WorkBookControlMoveRight = function(){ - SocialCalc.WorkBookControlMove("right"); -} - - - -SocialCalc.WorkBookControlCopySheet = function(){ - - //alert("in copy"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - control.workbook.CopyWorkBookSheet(control.currentSheetButton.id); - - alert("copied sheet:"+control.currentSheetButton.value); -} - -SocialCalc.WorkBookControlPasteSheet = function() { - - //alert("in paste"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - var oldid = control.currentSheetButton.id; - - SocialCalc.WorkBookControlAddSheet(false); - - var newid = control.currentSheetButton.id; - - //alert(newid+oldid); - - control.workbook.PasteWorkBookSheet(newid, oldid); - - var cmdstr = "addsheetstr"; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr, sheetstr: control.workbook.clipsheet.savestr}); - -} - -SocialCalc.SheetBar = function() { - this.baseDiv = document.getElementById("SocialCalc-sheetbar"); - - this.prebuttonsDiv = document.createElement("div"); - this.prebuttonsDiv.style.cssText = "display:inline;"; - this.prebuttonsDiv.innerHTML="        "; - this.prebuttonsDiv.id = "SocialCalc-sheetbar-prebuttons"; - - this.buttonsDiv = document.createElement("div"); - this.buttonsDiv.id = "SocialCalc-sheetbar-buttons"; - this.buttonsDiv.style.cssText = "display:inline;"; - - this.buttonActionsDiv = document.createElement("div"); - this.buttonActionsDiv.id = "SocialCalc-sheetbar-buttonactions"; - this.buttonActionsDiv.style.display = "inline"; - var addbutton = new SocialCalc.SheetBarSheetButton("sbsba-add", "sbsba-add", this.buttonActionsDiv, - {}, - { - MouseDown:function(){var abc=SocialCalc.WorkBookControlAddSheet(true);} - }, - "add-2.png"); - - - this.baseDiv.appendChild(this.prebuttonsDiv); - this.baseDiv.appendChild(this.buttonsDiv); - this.baseDiv.appendChild(this.buttonActionsDiv); -} - -// define a new class for sheetbarsheetbutton - -SocialCalc.SheetBarSheetButton = function(id, name, parentdiv, params, functions, img) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.name = name; - if (!img) { - this.ele.innerHTML = name; - this.ele.style.cssText = "font-size:small;display:inline;padding:5px 5px 2px 5px;border:1px solid #000;"; - imgele = document.createElement("img"); - imgele.id = id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - SocialCalc.ButtonRegister(this.ele, params, functions); - SocialCalc.ButtonRegister(imgele, params, functions); - } else { - var imgele = document.createElement("img"); - imgele.src = SocialCalc.Constants.defaultImagePrefix +img; - imgele.style.cssText = "width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - this.ele.style.cssText = "display:inline;padding:5px 5px 2px 5px;"; - SocialCalc.ButtonRegister(imgele, params, functions); - } - parentdiv.appendChild(this.ele); -} - -SocialCalc.SheetBarButtonActivate = function(id, active) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.isactive = active; - if (active) { - sbbutton.style.backgroundColor = "#FFF"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (!imgele) { - imgele = document.createElement("img"); - imgele.id = "sbsb-"+id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - } - sbbutton.appendChild(imgele); - SocialCalc.ButtonRegister(imgele, {}, { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(id);}, - Repeat:function(){}, - Disabled: function() {} - } ); - } - else { - sbbutton.style.backgroundColor = "#CCC"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (imgele) { - sbbutton.removeChild(imgele); - } - } - var menu = document.getElementById("sbsb-menu"); - if (menu && menu.style.display != "none") { - menu.style.display = "none"; - } -} - -SocialCalc.SheetBarButtonSetName = function(id, name) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.name = name; - sbbutton.innerHTML = name; - if (sbbutton.isactive) { - SocialCalc.SheetBarButtonActivate(id, true); - } -} - - -SocialCalc.SheetBarSheetButtonPress = function(id) { - //console.log("button press") - var sbbutton = document.getElementById("sbsb-"+id); - if (sbbutton && sbbutton.isactive) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) { - var sbsbm = new SocialCalc.SheetBarSheetButtonMenu("sbsb-menu", id); - } else { - menu.clickedsheetid = id; - if (menu.style.display == "none") { - menu.style.display = "inline"; - SocialCalc.SheetBarSheetButtonMenuPosition(menu, id); - } else { - menu.style.display = "none"; - } - } - - } else if (sbbutton) { - SocialCalc.WorkBookControlActivateSheet(id); - } - -} - - -// define a new class for sheetbarsheet button menu item - -SocialCalc.SheetBarSheetButtonMenuItem = function(id, t) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.innerHTML = t; - this.ele.className = ""; - this.ele.style.cssText = "padding:3px 4px;width:100px;height:20px;background-color:#FFF;"; - - var params = { - normalstyle: "backgroundColor:#FFF;", - downstyle: "backgroundColor:#CCC;", - hoverstyle: "backgroundColor:#CCC;"}; - var functions = {MouseDown:function(){SocialCalc.SheetBarMenuItemPress(id);}, - Repeat:function(){}, - Disabled: function() {}}; - - SocialCalc.ButtonRegister(this.ele, params, functions); - - SocialCalc.TouchRegister(this.ele, {SingleTap:functions.MouseDown}); - - return this.ele; - -} - -SocialCalc.SheetBarMenuItemPress = function(id) { - - var menu = document.getElementById("sbsb-menu"); - if (!menu) return; - - var clickedsheetid = menu.clickedsheetid; - - switch(id) { - case "sbsb_deletesheet": - //console.log("delete "+clickedsheetid); - SocialCalc.WorkBookControlDelSheet(); - break; - case "sbsb_hidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlHideSheet(); - break; - case "sbsb_unhidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlUnhideSheet(); - break; - case "sbsb_copysheet": - //console.log("copy "+clickedsheetid); - SocialCalc.WorkBookControlCopySheet(); - break; - case "sbsb_moveleft": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveLeft(); - break; - case "sbsb_moveright": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveRight(); - break; - - case "sbsb_pastesheet": - //console.log("paste "+clickedsheetid); - SocialCalc.WorkBookControlPasteSheet(); - break; - case "sbsb_renamesheet": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlRenameSheet(); - break; - case "sbsb_closemenu": - //console.log("rename "+clickedsheetid); - menu.style.display = "none"; - break; - default: - break; - } - menu.style.display = "none"; - -} - -// define a new class for sheetbarsheet button menu -SocialCalc.SheetBarSheetButtonMenu = function(id, clickedsheetid) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.className = ""; - this.ele.clickedsheetid = clickedsheetid; - this.ele.style.cssText = "border:1px solid #000;position:absolute;top:200px;left:0px;width=100px;z-index:120"; - - var ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_deletesheet"," Delete Sheet"); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_hidesheet"," Hide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_unhidesheet"," Unhide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_renamesheet"," Rename Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveleft"," Move Left "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveright"," Move Right "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_copysheet"," Copy Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_pastesheet"," Paste Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_closemenu"," Cancel"); - this.ele.appendChild(ele1); - - - SocialCalc.SheetBarSheetButtonMenuPosition(this.ele, clickedsheetid); - - //var clickedsheet = document.getElementById(clickedsheetid); - //var position = SocialCalc.GetElementPosition(clickedsheet); - //console.log(clickedsheet.offsetHeight,clickedsheet.offsetWidth,clickedsheet.offsetLeft, clickedsheet.offsetTop); - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.editor.toplevel.appendChild(this.ele); - - - - - -} - -// position the sheet menu -SocialCalc.SheetBarSheetButtonMenuPosition = function(menu, clickedsheetid) { - - var hlessbutton = document.getElementById("te_lessbuttonh"); - - //console.log(hlessbutton.style.top, hlessbutton.style.left); - - var sbbutton = document.getElementById("sbsb-"+clickedsheetid); - - //console.log(sbbutton.offsetLeft,clickedsheetid); - - var top = hlessbutton.style.top.slice(0,-2)-220; - var left = sbbutton.offsetLeft+7; - - menu.style.top = top+"px"; - menu.style.left = left+"px"; - - //console.log(menu.style.top, menu.style.left); -} - -SocialCalc.ScriptInfo = { - scripts : {}, - handle:null -}; - -SocialCalc.ScriptCheck = function(sheetid, coord, text) { -var commentstart = text.indexOf(""); -if ((commentstart != -1) && (commentend != -1)) { - script = text.slice(commentstart+10,commentend); - //alert(script); - SocialCalc.ScriptInfo.scripts[coord] = script; - if (SocialCalc.ScriptInfo.handle == null) { - SocialCalc.ScriptInfo.handle = - window.setTimeout(SocialCalc.EvalUserScripts,500); - } - //alert(coord+"-"+sheetid); -} -} - -SocialCalc.EvalUserScript = function(data) { - var head = document.getElementsByTagName("head")[0] || - document.documentElement; - - if (data == "") return; - - var script = document.createElement("script"); - - script.type = "text/javascript"; - try { - // doesn't work on ie... - script.appendChild(document.createTextNode(data)); - } catch(e) { - // IE has funky script nodes - script.text = data; - } - - head.insertBefore(script, head.firstChild); - head.removeChild(script); -} - -SocialCalc.EvalUserScripts = function() { -for (var cr in SocialCalc.ScriptInfo.scripts) { - SocialCalc.EvalUserScript(SocialCalc.ScriptInfo.scripts[cr]); - //console.log(cr,SocialCalc.ScriptInfo.scripts[cr]) -} -SocialCalc.ScriptInfo.handle = null; -SocialCalc.ScriptInfo.scripts = {}; -} - -SocialCalc.CallOutOnRenderCell = function(sheetobj, value, cr) { -var cell=sheetobj.cells[cr]; -if (!cell) return; -var valuetype = cell.valuetype || ""; // get type of value to determine formatting -var valuesubtype = valuetype.substring(1); -var sheetattribs=sheetobj.attribs; -valuetype = valuetype.charAt(0); -if (valuetype=="t") { - valueformat = sheetobj.valueformats[cell.textvalueformat-0] || sheetobj.valueformats[sheetattribs.defaulttextvalueformat-0] || ""; - if (valueformat == "text-html") {SocialCalc.ScriptCheck(sheetobj.sheetid,cr,value);} -} -} - -SocialCalc.GetCellDataValue = function(coord) { - - var sheetname = null; - var sheetid = ""; - var bindex = coord.indexOf("!"); - if (bindex != -1) { - sheetname = coord.slice(0,bindex); - coord = coord.slice(bindex+1); - //console.log(sheetname,coord) - } - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (sheetname == null) { - sheetid = control.currentSheetButton.id - } else { - sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - } - - if ((sheetid == null) || (sheetid == "")) { - return "0"; - } - - var sheetobj = control.workbook.sheetArr[sheetid].sheet - - var cell = sheetobj.cells[coord] - - if (cell) {return cell.datavalue;} else {return 0;} -} - -SocialCalc.GetCellDataArray = function(coordstr,sheetname) { - var vals = [] - var coords = coordstr.split(","); - if (sheetname == null) { sheetname=""; } - else { - sheetname = sheetname+"!"; - } - for (var c in coords) { - - vals.push(SocialCalc.GetCellDataValue(sheetname+coords[c])); - } - return vals; -} - -SocialCalc.UserScriptData = {} - - -SocialCalc.WorkBookRecalculateInfo = { - sheets : [], - calcorder: [], - current: 0, - pass: 0 -}; - -SocialCalc.WorkBookRecalculateAll = function() { - // do it from the last sheet to the first sheet - // using the recalc-done signal to trigger the next sheet - - // if already in the middle of a recalculate-all, ignore this. - if ((SocialCalc.WorkBookRecalculateInfo.current != 0) || - (SocialCalc.WorkBookRecalculateInfo.calcorder.length != 0) || - (SocialCalc.WorkBookRecalculateInfo.sheets.length != 0)) { - return; - } - - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - SocialCalc.WorkBookRecalculateInfo.current = 0; - - for (var sheet in control.workbook.sheetArr) { - SocialCalc.WorkBookRecalculateInfo.sheets.push(sheet); - } - - var i = 0; - for (var c=SocialCalc.WorkBookRecalculateInfo.sheets.length; - c>0; c--) { - SocialCalc.WorkBookRecalculateInfo.calcorder[i] = - SocialCalc.WorkBookRecalculateInfo.sheets[c-1]; - i++; - } - window.setTimeout(SocialCalc.WorkBookRecalculateStep,500); -} - -SocialCalc.WorkBookRecalculateStep = function() { - if (SocialCalc.WorkBookRecalculateInfo.current == - SocialCalc.WorkBookRecalculateInfo.calcorder.length) { - SocialCalc.WorkBookRecalculateInfo.current = 0; - SocialCalc.WorkBookRecalculateInfo.calcorder = []; - SocialCalc.WorkBookRecalculateInfo.sheets = []; - if (SocialCalc.WorkBookRecalculateInfo.pass == - 1) { - SocialCalc.WorkBookRecalculateInfo.pass = 0; - SocialCalc.SpinnerWaitHide(); - //alert("load done"); - return; - } else { - SocialCalc.WorkBookRecalculateInfo.pass++; - SocialCalc.WorkBookRecalculateAll(); - return; - } - } - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert("recalculate "+ - // SocialCalc.WorkBookRecalculateInfo.calcorder[ - // SocialCalc.WorkBookRecalculateInfo.current] - // ); - var sheetid = -SocialCalc.WorkBookRecalculateInfo.calcorder[ - SocialCalc.WorkBookRecalculateInfo.current]; - SocialCalc.WorkBookControlActivateSheet(sheetid); - SocialCalc.WorkBookRecalculateInfo.current++; - - - window.setTimeout(SocialCalc.WorkBookRecalculateStep,1000); -} - - -SocialCalc.SpinnerWaitCreate = function() { - // if the div exists already just use it - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - return; - } - var main = document.createElement("div"); - main.id = "waitloadingspinner"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - main.style.top = (vp.height/2)+"px"; - main.style.left = (vp.width/2)+"px"; - main.style.zIndex = 110; - - main.style.width='50px' - main.style.height = '50px' - main.innerHTML = 'Loading...'; - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.SpinnerWaitHide = function() { - // if the div exists already just use it - -var ele = document.getElementById("waitloadingspinner"); -if (ele) { - ele.innerHTML = ""; - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} -} - -SocialCalc.EditableCells = {}; -SocialCalc.EditableCells.allow = false; -SocialCalc.EditableCells.cells = {}; -SocialCalc.EditableCells.constraints = {}; - -SocialCalc.Callbacks.IsCellEditable = function(editor) { - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - - if (!(SocialCalc.EditableCells.allow)) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[cellname]) { - // by default all cells are editable - return true; - } - return false; -} - -SocialCalc.Callbacks.CheckConstraints = function(editor, value) -{ - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - var constraint = SocialCalc.EditableCells.constraints[cellname]; - //alert(JSON.stringify(constraint)) - if (constraint != null) { - switch (constraint[0]) { - case "numeric": - // check that value is numeric - var val = parseInt(value); - //alert(val) - if (isNaN(val)) { - alert("please input a number"); - return false; - } - - break; - case "percent": - break; - } - } - return true; -} - -// this is for checkmark toggling -SocialCalc.Callbacks.ToggleCell = function() -{ - // check what the current ecell is - var control = SocialCalc.GetCurrentWorkBookControl(); - - var editor = control.workbook.spreadsheet.editor; - - var cellname = editor.ecell.coord; - - var value = SocialCalc.GetCellDataValue(cellname); - - console.log(cellname) - console.log(value) - - var cmdstr = ""; - if (value.indexOf(" ") != -1) { - // set the value to the img value - //cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - - } else { - // set the value to a space - cmdstr = "set " + cellname + ' text t
     
    ' + "\n"; - } - - var sheetid = control.currentSheetButton.id - console.log(sheetid) - console.log(cmdstr) - cmd = {cmdtype:"scmd", id:sheetid, cmdstr: cmdstr, saveundo: false}; - control.ExecuteWorkBookControlCommand(cmd, false); - -} - - -SocialCalc.WorkbookControlCreateSheetHTML = function(sheetlist) { - - var context, div, ele; - - var result = ""; - - var control = SocialCalc.GetCurrentWorkBookControl(); - - div = document.createElement("div"); - - if (!sheetlist) { - context = new SocialCalc.RenderContext(spreadsheet.sheet); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - } else { - for (var sheetid in sheetlist) { - context = control.workbook.sheetArr[sheetid].context; - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - } - } - - result = div.innerHTML; - delete ele; - delete div; - return result; - - } \ No newline at end of file diff --git a/Website/static/Anton.ttf b/Website/static/Anton.ttf deleted file mode 100755 index 0d9c9ac..0000000 Binary files a/Website/static/Anton.ttf and /dev/null differ diff --git a/Website/static/Highcharts-2/examples/analytics.csv b/Website/static/Highcharts-2/examples/analytics.csv deleted file mode 100755 index 68e08a3..0000000 --- a/Website/static/Highcharts-2/examples/analytics.csv +++ /dev/null @@ -1,87 +0,0 @@ -# ---------------------------------------- -highcharts.com -Daily visits -"September 5, 2010","October 5, 2010" -# ---------------------------------------- - -# ---------------------------------------- -# Graph -# ---------------------------------------- -Day,All Visits (Segment),New Visitors (Segment) -"Sunday, September 5, 2010",966,433 -"Monday, September 6, 2010","2,475",983 -"Tuesday, September 7, 2010","3,336","1,463" -"Wednesday, September 8, 2010","3,211","1,316" -"Thursday, September 9, 2010","3,229","1,351" -"Friday, September 10, 2010","2,802","1,270" -"Saturday, September 11, 2010","1,168",604 -"Sunday, September 12, 2010","1,110",498 -"Monday, September 13, 2010","3,112","1,352" -"Tuesday, September 14, 2010","3,590","1,626" -"Wednesday, September 15, 2010","3,529","1,549" -"Thursday, September 16, 2010","3,519","1,574" -"Friday, September 17, 2010","3,696","1,680" -"Saturday, September 18, 2010","1,400",677 -"Sunday, September 19, 2010","1,302",603 -"Monday, September 20, 2010","3,348","1,472" -"Tuesday, September 21, 2010","3,606","1,570" -"Wednesday, September 22, 2010","3,320","1,438" -"Thursday, September 23, 2010","2,677","1,140" -"Friday, September 24, 2010","2,795","1,256" -"Saturday, September 25, 2010","1,299",589 -"Sunday, September 26, 2010","1,189",533 -"Monday, September 27, 2010","3,189","1,253" -"Tuesday, September 28, 2010","3,223","1,266" -"Wednesday, September 29, 2010","3,231","1,249" -"Thursday, September 30, 2010","3,608","1,684" -"Friday, October 1, 2010","2,945","1,185" -"Saturday, October 2, 2010","1,058",460 -"Sunday, October 3, 2010","1,114",499 -"Monday, October 4, 2010","2,774","1,131" -"Tuesday, October 5, 2010","2,679","1,047" - -# ---------------------------------------- -# Table -# ---------------------------------------- -Day,Visits,New Visits -"Friday, September 17, 2010" -All Visits,3696,1680 -New Visitors,1680,1680 -% of Total,0.45454545454545453,1.0 -"Thursday, September 30, 2010" -All Visits,3608,1684 -New Visitors,1684,1684 -% of Total,0.46674057649667405,1.0 -"Tuesday, September 21, 2010" -All Visits,3606,1570 -New Visitors,1570,1570 -% of Total,0.4353854686633389,1.0 -"Tuesday, September 14, 2010" -All Visits,3590,1626 -New Visitors,1626,1626 -% of Total,0.452924791086351,1.0 -"Wednesday, September 15, 2010" -All Visits,3529,1549 -New Visitors,1549,1549 -% of Total,0.4389345423632757,1.0 -"Thursday, September 16, 2010" -All Visits,3519,1574 -New Visitors,1574,1574 -% of Total,0.44728616084114803,1.0 -"Monday, September 20, 2010" -All Visits,3348,1472 -New Visitors,1472,1472 -% of Total,0.43966547192353644,1.0 -"Tuesday, September 7, 2010" -All Visits,3336,1463 -New Visitors,1463,1463 -% of Total,0.4385491606714628,1.0 -"Wednesday, September 22, 2010" -All Visits,3320,1438 -New Visitors,1438,1438 -% of Total,0.4331325301204819,1.0 -"Wednesday, September 29, 2010" -All Visits,3231,1249 -New Visitors,1249,1249 -% of Total,0.3865676261219437,1.0 -# -------------------------------------------------------------------------------- diff --git a/Website/static/Highcharts-2/examples/analytics.tsv b/Website/static/Highcharts-2/examples/analytics.tsv deleted file mode 100755 index 025f7ac..0000000 --- a/Website/static/Highcharts-2/examples/analytics.tsv +++ /dev/null @@ -1,87 +0,0 @@ -# ---------------------------------------- -highcharts.com -Daily visits -September 5, 2010 October 5, 2010 -# ---------------------------------------- - -# ---------------------------------------- -# Graph -# ---------------------------------------- -Day All Visits (Segment) New Visitors (Segment) -Sunday, September 5, 2010 966 433 -Monday, September 6, 2010 2,475 983 -Tuesday, September 7, 2010 3,336 1,463 -Wednesday, September 8, 2010 3,211 1,316 -Thursday, September 9, 2010 3,229 1,351 -Friday, September 10, 2010 2,802 1,270 -Saturday, September 11, 2010 1,168 604 -Sunday, September 12, 2010 1,110 498 -Monday, September 13, 2010 3,112 1,352 -Tuesday, September 14, 2010 3,590 1,626 -Wednesday, September 15, 2010 3,529 1,549 -Thursday, September 16, 2010 3,519 1,574 -Friday, September 17, 2010 3,696 1,680 -Saturday, September 18, 2010 1,400 677 -Sunday, September 19, 2010 1,302 603 -Monday, September 20, 2010 3,348 1,472 -Tuesday, September 21, 2010 3,606 1,570 -Wednesday, September 22, 2010 3,320 1,438 -Thursday, September 23, 2010 2,677 1,140 -Friday, September 24, 2010 2,795 1,256 -Saturday, September 25, 2010 1,299 589 -Sunday, September 26, 2010 1,189 533 -Monday, September 27, 2010 3,189 1,253 -Tuesday, September 28, 2010 3,223 1,266 -Wednesday, September 29, 2010 3,231 1,249 -Thursday, September 30, 2010 3,608 1,684 -Friday, October 1, 2010 2,945 1,185 -Saturday, October 2, 2010 1,058 460 -Sunday, October 3, 2010 1,114 499 -Monday, October 4, 2010 2,774 1,131 -Tuesday, October 5, 2010 2,679 1,047 - -# ---------------------------------------- -# Table -# ---------------------------------------- -Day Visits New Visits -Friday, September 17, 2010 -All Visits 3696 1680 -New Visitors 1680 1680 -% of Total 0.45454545454545453 1.0 -Thursday, September 30, 2010 -All Visits 3608 1684 -New Visitors 1684 1684 -% of Total 0.46674057649667405 1.0 -Tuesday, September 21, 2010 -All Visits 3606 1570 -New Visitors 1570 1570 -% of Total 0.4353854686633389 1.0 -Tuesday, September 14, 2010 -All Visits 3590 1626 -New Visitors 1626 1626 -% of Total 0.452924791086351 1.0 -Wednesday, September 15, 2010 -All Visits 3529 1549 -New Visitors 1549 1549 -% of Total 0.4389345423632757 1.0 -Thursday, September 16, 2010 -All Visits 3519 1574 -New Visitors 1574 1574 -% of Total 0.44728616084114803 1.0 -Monday, September 20, 2010 -All Visits 3348 1472 -New Visitors 1472 1472 -% of Total 0.43966547192353644 1.0 -Tuesday, September 7, 2010 -All Visits 3336 1463 -New Visitors 1463 1463 -% of Total 0.4385491606714628 1.0 -Wednesday, September 22, 2010 -All Visits 3320 1438 -New Visitors 1438 1438 -% of Total 0.4331325301204819 1.0 -Wednesday, September 29, 2010 -All Visits 3231 1249 -New Visitors 1249 1249 -% of Total 0.3865676261219437 1.0 -# -------------------------------------------------------------------------------- diff --git a/Website/static/Highcharts-2/examples/area-basic.htm b/Website/static/Highcharts-2/examples/area-basic.htm deleted file mode 100755 index 10c5832..0000000 --- a/Website/static/Highcharts-2/examples/area-basic.htm +++ /dev/null @@ -1,110 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/area-inverted.htm b/Website/static/Highcharts-2/examples/area-inverted.htm deleted file mode 100755 index 882128e..0000000 --- a/Website/static/Highcharts-2/examples/area-inverted.htm +++ /dev/null @@ -1,107 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/area-missing.htm b/Website/static/Highcharts-2/examples/area-missing.htm deleted file mode 100755 index 7a9fa96..0000000 --- a/Website/static/Highcharts-2/examples/area-missing.htm +++ /dev/null @@ -1,101 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/area-negative.htm b/Website/static/Highcharts-2/examples/area-negative.htm deleted file mode 100755 index 9208dfa..0000000 --- a/Website/static/Highcharts-2/examples/area-negative.htm +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/area-stacked-percent.htm b/Website/static/Highcharts-2/examples/area-stacked-percent.htm deleted file mode 100755 index 12e4062..0000000 --- a/Website/static/Highcharts-2/examples/area-stacked-percent.htm +++ /dev/null @@ -1,98 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/area-stacked.htm b/Website/static/Highcharts-2/examples/area-stacked.htm deleted file mode 100755 index c9257f6..0000000 --- a/Website/static/Highcharts-2/examples/area-stacked.htm +++ /dev/null @@ -1,102 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/areaspline.htm b/Website/static/Highcharts-2/examples/areaspline.htm deleted file mode 100755 index a891bf8..0000000 --- a/Website/static/Highcharts-2/examples/areaspline.htm +++ /dev/null @@ -1,101 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/bar-basic.htm b/Website/static/Highcharts-2/examples/bar-basic.htm deleted file mode 100755 index 3f90c26..0000000 --- a/Website/static/Highcharts-2/examples/bar-basic.htm +++ /dev/null @@ -1,102 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/bar-negative-stack.htm b/Website/static/Highcharts-2/examples/bar-negative-stack.htm deleted file mode 100755 index 68fb06b..0000000 --- a/Website/static/Highcharts-2/examples/bar-negative-stack.htm +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/bar-stacked.htm b/Website/static/Highcharts-2/examples/bar-stacked.htm deleted file mode 100755 index 1a45aa9..0000000 --- a/Website/static/Highcharts-2/examples/bar-stacked.htm +++ /dev/null @@ -1,83 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/column-basic.htm b/Website/static/Highcharts-2/examples/column-basic.htm deleted file mode 100755 index bd12ac4..0000000 --- a/Website/static/Highcharts-2/examples/column-basic.htm +++ /dev/null @@ -1,113 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/column-negative.htm b/Website/static/Highcharts-2/examples/column-negative.htm deleted file mode 100755 index 50100de..0000000 --- a/Website/static/Highcharts-2/examples/column-negative.htm +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/column-parsed.htm b/Website/static/Highcharts-2/examples/column-parsed.htm deleted file mode 100755 index 9372bc8..0000000 --- a/Website/static/Highcharts-2/examples/column-parsed.htm +++ /dev/null @@ -1,137 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    JaneJohn
    Apples34
    Pears20
    Plums511
    Bananas11
    Oranges24
    - - - - diff --git a/Website/static/Highcharts-2/examples/column-rotated-labels.htm b/Website/static/Highcharts-2/examples/column-rotated-labels.htm deleted file mode 100755 index 18fcca6..0000000 --- a/Website/static/Highcharts-2/examples/column-rotated-labels.htm +++ /dev/null @@ -1,117 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/column-stacked-and-grouped.htm b/Website/static/Highcharts-2/examples/column-stacked-and-grouped.htm deleted file mode 100755 index 0a983e9..0000000 --- a/Website/static/Highcharts-2/examples/column-stacked-and-grouped.htm +++ /dev/null @@ -1,95 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/column-stacked-percent.htm b/Website/static/Highcharts-2/examples/column-stacked-percent.htm deleted file mode 100755 index b2f7e1d..0000000 --- a/Website/static/Highcharts-2/examples/column-stacked-percent.htm +++ /dev/null @@ -1,79 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/column-stacked.htm b/Website/static/Highcharts-2/examples/column-stacked.htm deleted file mode 100755 index e831362..0000000 --- a/Website/static/Highcharts-2/examples/column-stacked.htm +++ /dev/null @@ -1,91 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/combo-dual-axes.htm b/Website/static/Highcharts-2/examples/combo-dual-axes.htm deleted file mode 100755 index d98ef20..0000000 --- a/Website/static/Highcharts-2/examples/combo-dual-axes.htm +++ /dev/null @@ -1,117 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/combo-multi-axes.htm b/Website/static/Highcharts-2/examples/combo-multi-axes.htm deleted file mode 100755 index e008c04..0000000 --- a/Website/static/Highcharts-2/examples/combo-multi-axes.htm +++ /dev/null @@ -1,153 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/combo-regression.htm b/Website/static/Highcharts-2/examples/combo-regression.htm deleted file mode 100755 index b6077e2..0000000 --- a/Website/static/Highcharts-2/examples/combo-regression.htm +++ /dev/null @@ -1,75 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/combo.htm b/Website/static/Highcharts-2/examples/combo.htm deleted file mode 100755 index f7fe92b..0000000 --- a/Website/static/Highcharts-2/examples/combo.htm +++ /dev/null @@ -1,113 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/dynamic-click-to-add.htm b/Website/static/Highcharts-2/examples/dynamic-click-to-add.htm deleted file mode 100755 index bc9cecb..0000000 --- a/Website/static/Highcharts-2/examples/dynamic-click-to-add.htm +++ /dev/null @@ -1,104 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/dynamic-master-detail.htm b/Website/static/Highcharts-2/examples/dynamic-master-detail.htm deleted file mode 100755 index 10b8f2d..0000000 --- a/Website/static/Highcharts-2/examples/dynamic-master-detail.htm +++ /dev/null @@ -1,389 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/dynamic-update.htm b/Website/static/Highcharts-2/examples/dynamic-update.htm deleted file mode 100755 index 0902f3c..0000000 --- a/Website/static/Highcharts-2/examples/dynamic-update.htm +++ /dev/null @@ -1,105 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/line-ajax.htm b/Website/static/Highcharts-2/examples/line-ajax.htm deleted file mode 100755 index 7a27e3a..0000000 --- a/Website/static/Highcharts-2/examples/line-ajax.htm +++ /dev/null @@ -1,197 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/line-basic.htm b/Website/static/Highcharts-2/examples/line-basic.htm deleted file mode 100755 index 99c7a5a..0000000 --- a/Website/static/Highcharts-2/examples/line-basic.htm +++ /dev/null @@ -1,97 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/line-labels.htm b/Website/static/Highcharts-2/examples/line-labels.htm deleted file mode 100755 index 7970624..0000000 --- a/Website/static/Highcharts-2/examples/line-labels.htm +++ /dev/null @@ -1,82 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/line-time-series.htm b/Website/static/Highcharts-2/examples/line-time-series.htm deleted file mode 100755 index 21955bd..0000000 --- a/Website/static/Highcharts-2/examples/line-time-series.htm +++ /dev/null @@ -1,222 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/pie-basic.htm b/Website/static/Highcharts-2/examples/pie-basic.htm deleted file mode 100755 index 590ec71..0000000 --- a/Website/static/Highcharts-2/examples/pie-basic.htm +++ /dev/null @@ -1,85 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/pie-donut.htm b/Website/static/Highcharts-2/examples/pie-donut.htm deleted file mode 100755 index 788ffcd..0000000 --- a/Website/static/Highcharts-2/examples/pie-donut.htm +++ /dev/null @@ -1,95 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/pie-legend.htm b/Website/static/Highcharts-2/examples/pie-legend.htm deleted file mode 100755 index 8005818..0000000 --- a/Website/static/Highcharts-2/examples/pie-legend.htm +++ /dev/null @@ -1,81 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/scatter.htm b/Website/static/Highcharts-2/examples/scatter.htm deleted file mode 100755 index 05a75b0..0000000 --- a/Website/static/Highcharts-2/examples/scatter.htm +++ /dev/null @@ -1,214 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/spline-inverted.htm b/Website/static/Highcharts-2/examples/spline-inverted.htm deleted file mode 100755 index b7029e2..0000000 --- a/Website/static/Highcharts-2/examples/spline-inverted.htm +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/spline-plot-bands.htm b/Website/static/Highcharts-2/examples/spline-plot-bands.htm deleted file mode 100755 index e05a253..0000000 --- a/Website/static/Highcharts-2/examples/spline-plot-bands.htm +++ /dev/null @@ -1,185 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/spline-symbols.htm b/Website/static/Highcharts-2/examples/spline-symbols.htm deleted file mode 100755 index e19a507..0000000 --- a/Website/static/Highcharts-2/examples/spline-symbols.htm +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Highcharts Example - - - - - - - - - - - - - - - - - - - - -
    - - - - diff --git a/Website/static/Highcharts-2/examples/tokyo.json b/Website/static/Highcharts-2/examples/tokyo.json deleted file mode 100755 index 0b38f96..0000000 --- a/Website/static/Highcharts-2/examples/tokyo.json +++ /dev/null @@ -1 +0,0 @@ -[7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6] \ No newline at end of file diff --git a/Website/static/Highcharts-2/exporting-server/index.php b/Website/static/Highcharts-2/exporting-server/index.php deleted file mode 100755 index b8fe1f9..0000000 --- a/Website/static/Highcharts-2/exporting-server/index.php +++ /dev/null @@ -1,97 +0,0 @@ -$output"; - echo "Error while converting SVG"; - } - - // stream it - else { - header("Content-Disposition: attachment; filename=$filename.$ext"); - header("Content-Type: $type"); - echo file_get_contents($outfile); - } - - // delete it - unlink("temp/$tempName.svg"); - unlink($outfile); - -// SVG can be streamed directly back -} else if ($ext == 'svg') { - header("Content-Disposition: attachment; filename=$filename.$ext"); - header("Content-Type: $type"); - echo $svg; - -} else { - echo "Invalid type"; -} -?> diff --git a/Website/static/Highcharts-2/graphics/skies.jpg b/Website/static/Highcharts-2/graphics/skies.jpg deleted file mode 100755 index 259f46a..0000000 Binary files a/Website/static/Highcharts-2/graphics/skies.jpg and /dev/null differ diff --git a/Website/static/Highcharts-2/graphics/snow.png b/Website/static/Highcharts-2/graphics/snow.png deleted file mode 100755 index 0171485..0000000 Binary files a/Website/static/Highcharts-2/graphics/snow.png and /dev/null differ diff --git a/Website/static/Highcharts-2/graphics/sun.png b/Website/static/Highcharts-2/graphics/sun.png deleted file mode 100755 index 2c89e40..0000000 Binary files a/Website/static/Highcharts-2/graphics/sun.png and /dev/null differ diff --git a/Website/static/Highcharts-2/index.htm b/Website/static/Highcharts-2/index.htm deleted file mode 100755 index c60ca30..0000000 --- a/Website/static/Highcharts-2/index.htm +++ /dev/null @@ -1,98 +0,0 @@ - - - - - Highcharts Examples - - -

    Highcharts Examples

    -

    Line and scatter charts

    - -

    Area charts

    - -

    Column and bar charts

    - -

    Pie charts

    - -

    Dynamic charts

    - -

    Combinations

    - - - diff --git a/Website/static/Highcharts-2/js/adapters/mootools-adapter.js b/Website/static/Highcharts-2/js/adapters/mootools-adapter.js deleted file mode 100755 index 7cd304f..0000000 --- a/Website/static/Highcharts-2/js/adapters/mootools-adapter.js +++ /dev/null @@ -1,12 +0,0 @@ -/* - Highcharts JS v2.1.4 (2011-03-30) - MooTools adapter - - (c) 2010 Torstein H?nsi - - License: www.highcharts.com/license -*/ -(function(){var g=window,i=!!g.$merge;$extend=g.$extend||function(){return Object.append.apply(Object,arguments)};g.HighchartsAdapter={init:function(){var a=Fx.prototype,b=a.start,c=Fx.Morph.prototype,d=c.compute;a.start=function(f){var e=this.element;if(f.d)this.paths=Highcharts.pathAnim.init(e,e.d,this.toD);b.apply(this,arguments)};c.compute=function(f,e,j){var h=this.paths;if(h)this.element.attr("d",Highcharts.pathAnim.step(h[0],h[1],j,this.toD));else return d.apply(this,arguments)}},animate:function(a, -b,c){var d=a.attr,f=c&&c.complete;if(d&&!a.setStyle){a.getStyle=a.attr;a.setStyle=function(){var e=arguments;a.attr.call(a,e[0],e[1][0])};a.$family=a.uid=true}HighchartsAdapter.stop(a);c=new Fx.Morph(d?a:$(a),$extend({transition:Fx.Transitions.Quad.easeInOut},c));if(b.d)c.toD=b.d;f&&c.addEvent("complete",f);c.start(b);a.fx=c},each:function(a,b){return i?$each(a,b):a.each(b)},map:function(a,b){return a.map(b)},grep:function(a,b){return a.filter(b)},merge:function(){var a=arguments,b=[{}],c=a.length; -if(i)a=$merge.apply(null,a);else{for(;c--;)b[c+1]=a[c];a=Object.merge.apply(Object,b)}return a},hyphenate:function(a){return a.hyphenate()},addEvent:function(a,b,c){if(typeof b=="string"){if(b=="unload")b="beforeunload";if(!a.addEvent)if(a.nodeName)a=$(a);else $extend(a,new Events);a.addEvent(b,c)}},removeEvent:function(a,b,c){if(b){if(b=="unload")b="beforeunload";a.removeEvent(b,c)}},fireEvent:function(a,b,c,d){b=new Event({type:b,target:a});b=$extend(b,c);b.preventDefault=function(){d=null};a.fireEvent&& -a.fireEvent(b.type,b);d&&d(b)},stop:function(a){a.fx&&a.fx.cancel()}}})(); diff --git a/Website/static/Highcharts-2/js/adapters/mootools-adapter.src.js b/Website/static/Highcharts-2/js/adapters/mootools-adapter.src.js deleted file mode 100755 index deef75a..0000000 --- a/Website/static/Highcharts-2/js/adapters/mootools-adapter.src.js +++ /dev/null @@ -1,244 +0,0 @@ -/** - * @license Highcharts JS v2.1.4 (2011-03-30) - * MooTools adapter - * - * (c) 2010 Torstein Hønsi - * - * License: www.highcharts.com/license - */ - -// JSLint options: -/*global Highcharts, Fx, $, $extend, $each, $merge, Events, Event */ - -(function() { - -var win = window, - legacy = !!win.$merge - $extend = win.$extend || function() { - return Object.append.apply(Object, arguments) - }; - -win.HighchartsAdapter = { - /** - * Initialize the adapter. This is run once as Highcharts is first run. - */ - init: function() { - var fxProto = Fx.prototype, - fxStart = fxProto.start, - morphProto = Fx.Morph.prototype, - morphCompute = morphProto.compute; - - // override Fx.start to allow animation of SVG element wrappers - fxProto.start = function(from, to) { - var fx = this, - elem = fx.element; - - // special for animating paths - if (from.d) { - //this.fromD = this.element.d.split(' '); - fx.paths = Highcharts.pathAnim.init( - elem, - elem.d, - fx.toD - ); - } - fxStart.apply(fx, arguments); - }; - - // override Fx.step to allow animation of SVG element wrappers - morphProto.compute = function(from, to, delta) { - var fx = this, - paths = fx.paths; - - if (paths) { - fx.element.attr( - 'd', - Highcharts.pathAnim.step(paths[0], paths[1], delta, fx.toD) - ); - } else { - return morphCompute.apply(fx, arguments); - } - }; - - }, - - /** - * Animate a HTML element or SVG element wrapper - * @param {Object} el - * @param {Object} params - * @param {Object} options jQuery-like animation options: duration, easing, callback - */ - animate: function (el, params, options) { - var isSVGElement = el.attr, - effect, - complete = options && options.complete; - - if (isSVGElement && !el.setStyle) { - // add setStyle and getStyle methods for internal use in Moo - el.getStyle = el.attr; - el.setStyle = function() { // property value is given as array in Moo - break it down - var args = arguments; - el.attr.call(el, args[0], args[1][0]); - } - // dirty hack to trick Moo into handling el as an element wrapper - el.$family = el.uid = true; - } - - // stop running animations - HighchartsAdapter.stop(el); - - // define and run the effect - effect = new Fx.Morph( - isSVGElement ? el : $(el), - $extend({ - transition: Fx.Transitions.Quad.easeInOut - }, options) - ); - - // special treatment for paths - if (params.d) { - effect.toD = params.d; - } - - // jQuery-like events - if (complete) { - effect.addEvent('complete', complete); - } - - // run - effect.start(params); - - // record for use in stop method - el.fx = effect; - }, - - /** - * MooTool's each function - * - */ - each: function(arr, fn) { - return legacy ? - $each(arr, fn) : - arr.each(fn); - }, - - /** - * Map an array - * @param {Array} arr - * @param {Function} fn - */ - map: function (arr, fn){ - return arr.map(fn); - }, - - /** - * Grep or filter an array - * @param {Array} arr - * @param {Function} fn - */ - grep: function(arr, fn) { - return arr.filter(fn); - }, - - /** - * Deep merge two objects and return a third - */ - merge: function() { - var args = arguments, - args13 = [{}], // MooTools 1.3+ - i = args.length, - ret; - - if (legacy) { - ret = $merge.apply(null, args); - } else { - while (i--) { - args13[i + 1] = args[i]; - } - ret = Object.merge.apply(Object, args13); - } - - return ret; - }, - - /** - * Hyphenate a string, like minWidth becomes min-width - * @param {Object} str - */ - hyphenate: function (str){ - return str.hyphenate(); - }, - - /** - * Add an event listener - * @param {Object} el HTML element or custom object - * @param {String} type Event type - * @param {Function} fn Event handler - */ - addEvent: function (el, type, fn) { - if (typeof type == 'string') { // chart broke due to el being string, type function - - if (type == 'unload') { // Moo self destructs before custom unload events - type = 'beforeunload'; - } - - // if the addEvent method is not defined, el is a custom Highcharts object - // like series or point - if (!el.addEvent) { - if (el.nodeName) { - el = $(el); // a dynamically generated node - } else { - $extend(el, new Events()); // a custom object - } - } - - el.addEvent(type, fn); - } - }, - - removeEvent: function(el, type, fn) { - if (type) { - if (type == 'unload') { // Moo self destructs before custom unload events - type = 'beforeunload'; - } - - - el.removeEvent(type, fn); - } - }, - - fireEvent: function(el, event, eventArguments, defaultFunction) { - // create an event object that keeps all functions - event = new Event({ - type: event, - target: el - }); - event = $extend(event, eventArguments); - // override the preventDefault function to be able to use - // this for custom events - event.preventDefault = function() { - defaultFunction = null; - }; - // if fireEvent is not available on the object, there hasn't been added - // any events to it above - if (el.fireEvent) { - el.fireEvent(event.type, event); - } - - // fire the default if it is passed and it is not prevented above - if (defaultFunction) { - defaultFunction(event); - } - }, - - /** - * Stop running animations on the object - */ - stop: function (el) { - if (el.fx) { - el.fx.cancel(); - } - } -} - -})(); \ No newline at end of file diff --git a/Website/static/Highcharts-2/js/adapters/prototype-adapter.js b/Website/static/Highcharts-2/js/adapters/prototype-adapter.js deleted file mode 100755 index 2591f6b..0000000 --- a/Website/static/Highcharts-2/js/adapters/prototype-adapter.js +++ /dev/null @@ -1,14 +0,0 @@ -/* - Highcharts JS v2.1.4 (2011-03-02) - Prototype adapter - - @author Michael Nelson, Torstein H?nsi. - - Feel free to use and modify this script. - Highcharts license: www.highcharts.com/license. -*/ -var HighchartsAdapter=function(){var f=typeof Effect!="undefined";return{init:function(){if(f)Effect.HighchartsTransition=Class.create(Effect.Base,{initialize:function(a,b,c,d){var e;this.element=a;e=a.attr(b);if(b=="d"){this.paths=Highcharts.pathAnim.init(a,a.d,c);this.toD=c;e=0;c=1}this.start(Object.extend(d||{},{from:e,to:c,attribute:b}))},setup:function(){HighchartsAdapter._extend(this.element);this.element._highchart_animation=this},update:function(a){var b=this.paths;if(b)a=Highcharts.pathAnim.step(b[0], -b[1],a,this.toD);this.element.attr(this.options.attribute,a)},finish:function(){this.element._highchart_animation=null}})},addEvent:function(a,b,c){if(a.addEventListener||a.attachEvent)Event.observe($(a),b,c);else{HighchartsAdapter._extend(a);a._highcharts_observe(b,c)}},animate:function(a,b,c){var d;c=c||{};c.delay=0;c.duration=(c.duration||500)/1E3;if(f)for(d in b)new Effect.HighchartsTransition($(a),d,b[d],c);else for(d in b)a.attr(d,b[d]);if(!a.attr)throw"Todo: implement animate DOM objects"; -},stop:function(a){a._highcharts_extended&&a._highchart_animation&&a._highchart_animation.cancel()},each:function(a,b){$A(a).each(b)},fireEvent:function(a,b,c,d){if(b.preventDefault)d=null;if(a.fire)a.fire(b,c);else a._highcharts_extended&&a._highcharts_fire(b,c);d&&d(c)},removeEvent:function(a,b,c){if($(a).stopObserving)a.stopObserving(a,b,c);else{HighchartsAdapter._extend(a);a._highcharts_stop_observing(b,c)}},grep:function(a,b){return a.findAll(b)},hyphenate:function(a){return a.replace(/([A-Z])/g, -function(b,c){return"-"+c.toLowerCase()})},map:function(a,b){return a.map(b)},merge:function(){function a(b,c){var d,e;for(e in c){d=c[e];b[e]=d&&typeof d=="object"&&d.constructor!=Array?a(b[e]||{},d):c[e]}return b}return function(){for(var b=arguments,c={},d=0;d {a : 'a', b : {b1 : 'b1', b2 : 'b2_prime'}, c : 'c'} - /*merge: function(){ - function doCopy(copy, original) { - var value, - key, - undef, - nil, - same, - obj, - arr, - node; - - for (key in original) { - value = original[key]; - undef = typeof(value) === 'undefined'; - nil = value === null; - same = original === copy[key]; - - if (undef || nil || same) { - continue; - } - - obj = typeof(value) === 'object'; - arr = value && obj && value.constructor == Array; - node = !!value.nodeType; - - if (obj && !arr && !node) { - copy[key] = doCopy(typeof copy[key] == 'object' ? copy[key] : {}, value); - } - else { - copy[key] = original[key]; - } - } - return copy; - } - - var args = arguments, retVal = {}; - - for (var i = 0; i < args.length; i++) { - retVal = doCopy(retVal, args[i]); - } - - return retVal; - },*/ - merge: function() { // the built-in prototype merge function doesn't do deep copy - function doCopy(copy, original) { - var value; - - for (var key in original) { - value = original[key]; - if (value && typeof value == 'object' && value.constructor != Array) { - copy[key] = doCopy(copy[key] || {}, value); // copy - - } else { - copy[key] = original[key]; - } - } - return copy; - } - - function merge() { - var args = arguments, - retVal = {}; - - for (var i = 0; i < args.length; i++) { - retVal = doCopy(retVal, args[i]) - - } - return retVal; - } - - return merge.apply(this, arguments); - }, - - // extend an object to handle highchart events (highchart objects, not svg elements). - // this is a very simple way of handling events but whatever, it works (i think) - _extend: function(object){ - if (!object._highcharts_extended) { - Object.extend(object, { - _highchart_events: {}, - _highchart_animation: null, - _highcharts_extended: true, - _highcharts_observe: function(name, fn){ - this._highchart_events[name] = [this._highchart_events[name], fn].compact().flatten(); - }, - _highcharts_stop_observing: function(name, fn){ - this._highchart_events[name] = [this._highchart_events[name]].compact().flatten().without(fn); - }, - _highcharts_fire: function(name, args){ - (this._highchart_events[name] || []).each(function(fn){ - if (args && args.stopped) { - return; // "throw $break" wasn't working. i think because of the scope of 'this'. - } - fn.bind(this)(args); - } -.bind(this)); - } - }); - } - } -}; -})(); diff --git a/Website/static/Highcharts-2/js/highcharts.js b/Website/static/Highcharts-2/js/highcharts.js deleted file mode 100755 index aa9de94..0000000 --- a/Website/static/Highcharts-2/js/highcharts.js +++ /dev/null @@ -1,162 +0,0 @@ -/* - Highcharts JS v2.1.4 (2011-03-02) - - (c) 2009-2010 Torstein H?nsi - - License: www.highcharts.com/license -*/ -(function(){function qa(a,b){a||(a={});for(var c in b)a[c]=b[c];return a}function oa(a,b){return parseInt(a,b||10)}function Kb(a){return typeof a=="string"}function Eb(a){return typeof a=="object"}function ac(a){return typeof a=="number"}function mc(a,b){for(var c=a.length;c--;)if(a[c]==b){a.splice(c,1);break}}function J(a){return a!==Ra&&a!==null}function za(a,b,c){var d,e;if(Kb(b))if(J(c))a.setAttribute(b,c);else{if(a&&a.getAttribute)e=a.getAttribute(b)}else if(J(b)&&Eb(b))for(d in b)a.setAttribute(d, -b[d]);return e}function nc(a){if(!a||a.constructor!=Array)a=[a];return a}function y(){var a=arguments,b,c,d=a.length;for(b=0;b3?g%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+cb(a-c).toFixed(f).slice(2):"")}function Hc(){}function Hd(a,b){function c(m,h){function x(l, -p){this.pos=l;this.minor=p;this.isNew=true;p||this.addLabel()}function w(l){if(l){this.options=l;this.id=l.id}return this}function O(){var l=[],p=[],r;Ta=u=null;Z=[];t(Ba,function(o){r=false;t(["xAxis","yAxis"],function(la){if(o.isCartesian&&(la=="xAxis"&&ma||la=="yAxis"&&!ma)&&(o.options[la]==h.index||o.options[la]===Ra&&h.index===0)){o[la]=s;Z.push(o);r=true}});if(!o.visible&&v.ignoreHiddenSeries)r=false;if(r){var T,Y,G,B,ia;if(!ma){T=o.options.stacking;Ic=T=="percent";if(T){B=o.type+y(o.options.stack, -"");ia="-"+B;o.stackKey=B;Y=l[B]||[];l[B]=Y;G=p[ia]||[];p[ia]=G}if(Ic){Ta=0;u=99}}if(o.isCartesian){t(o.data,function(la){var C=la.x,na=la.y,S=na<0,$=S?G:Y;S=S?ia:B;if(Ta===null)Ta=u=la[H];if(ma)if(C>u)u=C;else{if(Cu)u=na;else if(la=0){Ta=0;Id=true}else if(u<0){u=0;Jd=true}}}})}function ja(l,p){var r; -Fb=p?1:Ua.pow(10,ob(Ua.log(l)/Ua.LN10));r=l/Fb;if(!p){p=[1,2,2.5,5,10];if(h.allowDecimals===false)if(Fb==1)p=[1,2,5,10];else if(Fb<=0.1)p=[1/Fb]}for(var o=0;o0||!Jd))P+=l*Kd}Wa=K==P?1:Mb&&!T&&Y==r.options.tickPixelInterval?r.tickInterval:y(T,Va?1:(P-K)*Y/A);if(!N&&!J(h.tickInterval))Wa=ja(Wa);s.tickInterval=Wa;Jc=h.minorTickInterval==="auto"&&Wa?Wa/5:h.minorTickInterval;if(N){ra=[];T=Sa.global.useUTC; -var G=1E3/qb,B=6E4/qb,ia=36E5/qb;Y=864E5/qb;l=6048E5/qb;o=2592E6/qb;var la=31556952E3/qb,C=[["second",G,[1,2,5,10,15,30]],["minute",B,[1,2,5,10,15,30]],["hour",ia,[1,2,3,4,6,8,12]],["day",Y,[1,2]],["week",l,[1,2]],["month",o,[1,2,3,4,6]],["year",la,null]],na=C[6],S=na[1],$=na[2];for(r=0;r=G)$.setSeconds(S>=B?0:C*ob($.getSeconds()/ -C));if(S>=B)$[Cd](S>=ia?0:C*ob($[bd]()/C));if(S>=ia)$[Dd](S>=Y?0:C*ob($[cd]()/C));if(S>=Y)$[ed](S>=o?1:C*ob($[oc]()/C));if(S>=o){$[Ed](S>=la?0:C*ob($[Dc]()/C));p=$[Ec]()}if(S>=la){p-=p%C;$[Fd](p)}S==l&&$[ed]($[oc]()-$[dd]()+h.startOfWeek);r=1;p=$[Ec]();G=$.getTime()/qb;B=$[Dc]();for(ia=$[oc]();Gp&&ra.shift();if(h.endOnTick)P=r;else PGb[H])Gb[H]=ra.length}}function Ea(){var l,p;gb=K;cc=P;O();ga();ha=D;D=A/(P-K||1);if(!ma)for(l in ea)for(p in ea[l])ea[l][p].cum=ea[l][p].total;if(!s.isDirty)s.isDirty=K!=gb||P!=cc}function ua(l){l= -(new w(l)).render();Nb.push(l);return l}function bb(){var l=h.title,p=h.alternateGridColor,r=h.lineWidth,o,T,Y=m.hasRendered,G=Y&&J(gb)&&!isNaN(gb);o=Z.length&&J(K)&&J(P);A=M?wa:sa;D=A/(P-K||1);xa=M?V:rb;if(o||Mb){if(Jc&&!Va)for(o=K+(ra[0]-K)%Jc;o<=P;o+=Jc){Wb[o]||(Wb[o]=new x(o,true));G&&Wb[o].isNew&&Wb[o].render(null,true);Wb[o].isActive=true;Wb[o].render()}t(ra,function(B,ia){if(!Mb||B>=K&&B<=P){G&&sb[B].isNew&&sb[B].render(ia,true);sb[B].isActive=true;sb[B].render(ia)}});p&&t(ra,function(B,ia){if(ia% -2===0&&B=1E3?Gd(l,0):l},Nc=M&&h.labels.staggerLines,Xb=h.reversed,Yb=Va&&h.tickmarkPlacement=="between"?0.5:0;x.prototype={addLabel:function(){var l=this.pos,p=h.labels,r=!(l== -K&&!y(h.showFirstLabel,1)||l==P&&!y(h.showLastLabel,0)),o=Va&&M&&Va.length&&!p.step&&!p.staggerLines&&!p.rotation&&wa/Va.length||!M&&wa/2,T=this.label;l=$d.call({isFirst:l==ra[0],isLast:l==ra[ra.length-1],dateTimeLabelFormat:Kc,value:Va&&Va[l]?Va[l]:l});o=o&&{width:o-2*(p.padding||10)+$a};o=qa(o,p.style);if(T===Ra)this.label=J(l)&&r&&p.enabled?aa.text(l,0,0).attr({align:p.align,rotation:p.rotation}).css(o).add(tb):null;else T&&T.attr({text:l}).css(o)},getLabelSize:function(){var l=this.label;return l? -(this.labelBBox=l.getBBox())[M?"height":"width"]:0},render:function(l,p){var r=!this.minor,o=this.label,T=this.pos,Y=h.labels,G=this.gridLine,B=r?h.gridLineWidth:h.minorGridLineWidth,ia=r?h.gridLineColor:h.minorGridLineColor,la=r?h.gridLineDashStyle:h.minorGridLineDashStyle,C=this.mark,na=r?h.tickLength:h.minorTickLength,S=r?h.tickWidth:h.minorTickWidth||0,$=r?h.tickColor:h.minorTickColor,pc=r?h.tickPosition:h.minorTickPosition;r=Y.step;var hb=p&&Oc||Pa,Ob;Ob=M?va(T+Yb,null,null,p)+xa:V+Q+(Oa?(p&& -jd||Xa)-Ab-V:0);hb=M?hb-rb+Q-(Oa?sa:0):hb-va(T+Yb,null,null,p)-xa;if(B){T=Ka(T+Yb,B,p);if(G===Ra){G={stroke:ia,"stroke-width":B};if(la)G.dashstyle=la;this.gridLine=G=B?aa.path(T).attr(G).add(Hb):null}G&&T&&G.animate({d:T})}if(S){if(pc=="inside")na=-na;if(Oa)na=-na;B=aa.crispLine([Za,Ob,hb,Da,Ob+(M?0:-na),hb+(M?na:0)],S);if(C)C.animate({d:B});else this.mark=aa.path(B).attr({stroke:$,"stroke-width":S}).add(tb)}if(o){Ob=Ob+Y.x-(Yb&&M?Yb*D*(Xb?-1:1):0);hb=hb+Y.y-(Yb&&!M?Yb*D*(Xb?1:-1):0);J(Y.y)||(hb+= -parseInt(o.styles.lineHeight)*0.9-o.getBBox().height/2);if(Nc)hb+=l%Nc*16;if(r)o[l%r?"hide":"show"]();o[this.isNew?"attr":"animate"]({x:Ob,y:hb})}this.isNew=false},destroy:function(){for(var l in this)this[l]&&this[l].destroy&&this[l].destroy()}};w.prototype={render:function(){var l=this,p=l.options,r=p.label,o=l.label,T=p.width,Y=p.to,G,B=p.from,ia=p.dashStyle,la=l.svgElem,C=[],na,S,$=p.color;S=p.zIndex;var pc=p.events;if(T){C=Ka(p.value,T);p={stroke:$,"stroke-width":T};if(ia)p.dashstyle=ia}else if(J(B)&& -J(Y)){B=Ca(B,K);Y=pb(Y,P);G=Ka(Y);if((C=Ka(B))&&G)C.push(G[4],G[5],G[1],G[2]);else C=null;p={fill:$}}else return;if(J(S))p.zIndex=S;if(la)if(C)la.animate({d:C},null,la.onGetPath);else{la.hide();la.onGetPath=function(){la.show()}}else if(C&&C.length){l.svgElem=la=aa.path(C).attr(p).add();if(pc){ia=function(hb){la.on(hb,function(Ob){pc[hb].apply(l,[Ob])})};for(na in pc)ia(na)}}if(r&&J(r.text)&&C&&C.length&&wa>0&&sa>0){r=ya({align:M&&G&&"center",x:M?!G&&4:10,verticalAlign:!M&&G&&"middle",y:M?G?16:10: -G?6:-4,rotation:M&&!G&&90},r);if(!o)l.label=o=aa.text(r.text,0,0).attr({align:r.textAlign||r.align,rotation:r.rotation,zIndex:S}).css(r.style).add();G=[C[1],C[4],C[6]||C[1]];C=[C[2],C[5],C[7]||C[2]];na=pb.apply(Ua,G);S=pb.apply(Ua,C);o.align(r,false,{x:na,y:S,width:Ca.apply(Ua,G)-na,height:Ca.apply(Ua,C)-S});o.show()}else o&&o.hide();return l},destroy:function(){for(var l in this){this[l]&&this[l].destroy&&this[l].destroy();delete this[l]}mc(Nb,this)}};va=function(l,p,r,o){var T=1,Y=0,G=o?ha:D;o= -o?gb:K;G||(G=D);if(r){T*=-1;Y=A}if(Xb){T*=-1;Y-=T*A}if(p){if(Xb)l=A-l;l=l/G+o}else l=T*(l-o)*G+Y;return l};Ka=function(l,p,r){var o,T,Y;l=va(l,null,null,r);var G=r&&Oc||Pa,B=r&&jd||Xa,ia;r=T=fa(l+xa);o=Y=fa(G-l-xa);if(isNaN(l))ia=true;else if(M){o=ba;Y=G-rb;if(rV+wa)ia=true}else{r=V;T=B-Ab;if(oba+sa)ia=true}return ia?null:aa.crispLine([Za,r,o,Da,T,Y],p||0)};if(Ga&&ma&&Xb===Ra)Xb=true;qa(s,{addPlotBand:ua,addPlotLine:ua,adjustTickAmount:function(){if(Gb&&!N&&!Va&&!Mb){var l=ec,p=ra.length; -ec=Gb[H];if(pl)l=K;else if(P', -A?Mc("%A, %b %e, %Y",D):D,"
    "]:[];t(H,function(va){xa.push(va.point.tooltipFormatter(ha))});return xa.join("")}function x(H,A){E=ma?H:(2*E+H)/3;ea=ma?A:(ea+A)/2;s.translate(E,ea);kd=cb(H-E)>1||cb(A-ea)>1?function(){x(H,A)}:null}function w(){if(!ma){var H=q.hoverPoints;s.hide();t(ga,function(A){A&&A.hide()});H&&t(H,function(A){A.setState()});q.hoverPoints=null;ma=true}}var O,ja=m.borderWidth,L=m.crosshairs,ga=[],Ea=m.style,ua=m.shared,bb=oa(Ea.padding),Ja=ja+bb,ma=true,Oa,M,E=0,ea=0;Ea.padding= -0;var s=aa.g("tooltip").attr({zIndex:8}).add(),N=aa.rect(Ja,Ja,0,0,m.borderRadius,ja).attr({fill:m.backgroundColor,"stroke-width":ja}).add(s).shadow(m.shadow),Q=aa.text("",bb+Ja,oa(Ea.fontSize)+bb+Ja).attr({zIndex:1}).css(Ea).add(s);s.hide();return{shared:ua,refresh:function(H){var A,D,ha,xa=0,va={},Ka=[];ha=H.tooltipPos;A=m.formatter||h;va=q.hoverPoints;var tb=function(Fa){return{series:Fa.series,point:Fa,x:Fa.category,y:Fa.y,percentage:Fa.percentage,total:Fa.total||Fa.stackTotal}};if(ua){va&&t(va, -function(Fa){Fa.setState()});q.hoverPoints=H;t(H,function(Fa){Fa.setState(yb);xa+=Fa.plotY;Ka.push(tb(Fa))});D=H[0].plotX;xa=fa(xa)/H.length;va={x:H[0].category};va.points=Ka;H=H[0]}else va=tb(H);va=A.call(va);O=H.series;D=ua?D:H.plotX;xa=ua?xa:H.plotY;A=fa(ha?ha[0]:Ga?wa-xa:D);D=fa(ha?ha[1]:Ga?sa-D:xa);ha=ua||!H.series.isCartesian||hc(A,D);if(va===false||!ha)w();else{if(ma){s.show();ma=false}Q.attr({text:va});ha=Q.getBBox();Oa=ha.width+2*bb;M=ha.height+2*bb;N.attr({width:Oa,height:M,stroke:m.borderColor|| -H.color||O.color||"#606060"});A=A-Oa+V-25;D=D-M+ba+10;if(A<7){A=7;D-=30}if(D<5)D=5;else if(D+M>Pa)D=Pa-M-5;x(fa(A-Ja),fa(D-Ja))}if(L){L=nc(L);D=L.length;for(var Hb;D--;)if(L[D]&&(Hb=H.series[D?"yAxis":"xAxis"])){A=Hb.getPlotLinePath(H[D?"y":"x"],1);if(ga[D])ga[D].attr({d:A,visibility:Bb});else{ha={"stroke-width":L[D].width||1,stroke:L[D].color||"#C0C0C0",zIndex:2};if(L[D].dashStyle)ha.dashstyle=L[D].dashStyle;ga[D]=aa.path(A).attr(ha).add()}}}},hide:w}}function f(m,h){function x(E){var ea;E=E||ib.event; -if(!E.target)E.target=E.srcElement;ea=E.touches?E.touches.item(0):E;if(E.type!="mousemove"||ib.opera){for(var s=ta,N={left:s.offsetLeft,top:s.offsetTop};s=s.offsetParent;){N.left+=s.offsetLeft;N.top+=s.offsetTop;if(s!=Aa.body&&s!=Aa.documentElement){N.left-=s.scrollLeft;N.top-=s.scrollTop}}qc=N}if(Ac){E.chartX=E.x;E.chartY=E.y}else if(ea.layerX===Ra){E.chartX=ea.pageX-qc.left;E.chartY=ea.pageY-qc.top}else{E.chartX=E.layerX;E.chartY=E.layerY}return E}function w(E){var ea={xAxis:[],yAxis:[]};t(ab,function(s){var N= -s.translate,Q=s.isXAxis;ea[Q?"xAxis":"yAxis"].push({axis:s,value:N((Ga?!Q:Q)?E.chartX-V:sa-E.chartY+ba,true)})});return ea}function O(){var E=m.hoverSeries,ea=m.hoverPoint;ea&&ea.onMouseOut();E&&E.onMouseOut();rc&&rc.hide();ld=null}function ja(){if(ua){var E={xAxis:[],yAxis:[]},ea=ua.getBBox(),s=ea.x-V,N=ea.y-ba;if(Ea){t(ab,function(Q){var H=Q.translate,A=Q.isXAxis,D=Ga?!A:A,ha=H(D?s:sa-N-ea.height,true);H=H(D?s+ea.width:sa-N,true);E[A?"xAxis":"yAxis"].push({axis:Q,min:pb(ha,H),max:Ca(ha,H)})});La(m, -"selection",E,md)}ua=ua.destroy()}m.mouseIsDown=nd=Ea=false;Cb(Aa,Ib?"touchend":"mouseup",ja)}var L,ga,Ea,ua,bb=v.zoomType,Ja=/x/.test(bb),ma=/y/.test(bb),Oa=Ja&&!Ga||ma&&Ga,M=ma&&!Ga||Ja&&Ga;Pc=function(){if(Qc){Qc.translate(V,ba);Ga&&Qc.attr({width:m.plotWidth,height:m.plotHeight}).invert()}else m.trackerGroup=Qc=aa.g("tracker").attr({zIndex:9}).add()};Pc();if(h.enabled)m.tooltip=rc=e(h);(function(){var E=true;ta.onmousedown=function(s){s=x(s);m.mouseIsDown=nd=true;L=s.chartX;ga=s.chartY;Qa(Aa, -Ib?"touchend":"mouseup",ja)};var ea=function(s){if(!(s&&s.touches&&s.touches.length>1)){s=x(s);if(!Ib)s.returnValue=false;var N=s.chartX,Q=s.chartY,H=!hc(N-V,Q-ba);if(Ib&&s.type=="touchstart")if(za(s.target,"isTracker"))m.runTrackerClick||s.preventDefault();else!ae&&!H&&s.preventDefault();if(H){E||O();if(NV+wa)N=V+wa;if(Qba+sa)Q=ba+sa}if(nd&&s.type!="touchstart"){if(Ea=Math.sqrt(Math.pow(L-N,2)+Math.pow(ga-Q,2))>10){if(ic&&(Ja||ma)&&hc(L-V,ga-ba))ua||(ua=aa.rect(V, -ba,Oa?1:wa,M?1:sa,0).attr({fill:"rgba(69,114,167,0.25)",zIndex:7}).add());if(ua&&Oa){N=N-L;ua.attr({width:cb(N),x:(N>0?0:N)+L})}if(ua&&M){Q=Q-ga;ua.attr({height:cb(Q),y:(Q>0?0:Q)+ga})}}}else if(!H){var A;Q=m.hoverPoint;N=m.hoverSeries;var D,ha,xa=Xa,va=Ga?s.chartY:s.chartX-V;if(rc&&h.shared){A=[];D=Ba.length;for(ha=0;haxa&&A.splice(D, -1);if(A.length&&A[0].plotX!=ld){rc.refresh(A);ld=A[0].plotX}}if(N&&N.tracker)(s=N.tooltipPoints[va])&&s!=Q&&s.onMouseOver()}return(E=H)||!ic}};ta.onmousemove=ea;Qa(ta,"mouseleave",O);ta.ontouchstart=function(s){if(Ja||ma)ta.onmousedown(s);ea(s)};ta.ontouchmove=ea;ta.ontouchend=function(){Ea&&O()};ta.onclick=function(s){var N=m.hoverPoint;s=x(s);s.cancelBubble=true;if(!Ea)if(N&&za(s.target,"isTracker")){var Q=N.plotX,H=N.plotY;qa(N,{pageX:qc.left+V+(Ga?wa-H:Q),pageY:qc.top+ba+(Ga?sa-Q:H)});La(N.series, -"click",qa(s,{point:N}));N.firePointEvent("click",s)}else{qa(s,w(s));hc(s.chartX-V,s.chartY-ba)&&La(m,"click",s)}Ea=false}})();Nd=setInterval(function(){kd&&kd()},32);qa(this,{zoomX:Ja,zoomY:ma,resetTracker:O})}function g(m){var h=m.type||v.type||v.defaultSeriesType,x=ub[h],w=q.hasRendered;if(w)if(Ga&&h=="column")x=ub.bar;else if(!Ga&&h=="bar")x=ub.column;h=new x;h.init(q,m);if(!w&&h.inverted)Ga=true;if(h.isCartesian)ic=h.isCartesian;Ba.push(h);return h}function i(){v.alignTicks!==false&&t(ab,function(m){m.adjustTickAmount()}); -Gb=null}function k(m){var h=q.isDirtyLegend,x,w=q.isDirtyBox,O=Ba.length,ja=O,L=q.clipRect;for(bc(m,q);ja--;){m=Ba[ja];if(m.isDirty&&m.options.stacking){x=true;break}}if(x)for(ja=O;ja--;){m=Ba[ja];if(m.options.stacking)m.isDirty=true}t(Ba,function(ga){if(ga.isDirty){ga.cleanData();ga.getSegments();if(ga.options.legendType=="point")h=true}});if(h&&od.renderLegend){od.renderLegend();q.isDirtyLegend=false}if(ic){if(!Rc){Gb=null;t(ab,function(ga){ga.setScale()})}i();sc();t(ab,function(ga){if(ga.isDirty|| -w){ga.redraw();w=true}})}if(w){pd();Pc();if(L){Sc(L);L.animate({width:q.plotSizeX,height:q.plotSizeY})}}t(Ba,function(ga){if(ga.isDirty&&ga.visible&&(!ga.isCartesian||ga.xAxis))ga.redraw()});gc&&gc.resetTracker&&gc.resetTracker();La(q,"redraw")}function j(){var m=a.xAxis||{},h=a.yAxis||{},x;m=nc(m);t(m,function(w,O){w.index=O;w.isX=true});h=nc(h);t(h,function(w,O){w.index=O});ab=m.concat(h);q.xAxis=[];q.yAxis=[];ab=jc(ab,function(w){x=new c(q,w);q[x.isXAxis?"xAxis":"yAxis"].push(x);return x});i()} -function n(m,h){kc=ya(a.title,m);tc=ya(a.subtitle,h);t([["title",m,kc],["subtitle",h,tc]],function(x){var w=x[0],O=q[w],ja=x[1];x=x[2];if(O&&ja){O.destroy();O=null}if(x&&x.text&&!O)q[w]=aa.text(x.text,0,0).attr({align:x.align,"class":"highcharts-"+w,zIndex:1}).css(x.style).add().align(x,false,uc)})}function z(){jb=v.renderTo;Od=Zb+qd++;if(Kb(jb))jb=Aa.getElementById(jb);jb.innerHTML="";if(!jb.offsetWidth){Qb=jb.cloneNode(0);Ia(Qb,{position:lc,top:"-9999px",display:""});Aa.body.appendChild(Qb)}Tc= -(Qb||jb).offsetWidth;vc=(Qb||jb).offsetHeight;q.chartWidth=Xa=v.width||Tc||600;q.chartHeight=Pa=v.height||(vc>19?vc:400);q.container=ta=fb(Lb,{className:"highcharts-container"+(v.className?" "+v.className:""),id:Od},qa({position:Pd,overflow:vb,width:Xa+$a,height:Pa+$a,textAlign:"left"},v.style),Qb||jb);q.renderer=aa=v.forExport?new Uc(ta,Xa,Pa,true):new Qd(ta,Xa,Pa);var m,h;if(Rd&&ta.getBoundingClientRect){m=function(){Ia(ta,{left:0,top:0});h=ta.getBoundingClientRect();Ia(ta,{left:-h.left%1+$a,top:-h.top% -1+$a})};m();Qa(ib,"resize",m);Qa(q,"destroy",function(){Cb(ib,"resize",m)})}}function F(){function m(){var x=v.width||jb.offsetWidth,w=v.height||jb.offsetHeight;if(x&&w){if(x!=Tc||w!=vc){clearTimeout(h);h=setTimeout(function(){rd(x,w,false)},100)}Tc=x;vc=w}}var h;Qa(window,"resize",m);Qa(q,"destroy",function(){Cb(window,"resize",m)})}function W(){var m=a.labels,h=a.credits,x;n();od=q.legend=new be(q);sc();t(ab,function(w){w.setTickPositions(true)});i();sc();pd();ic&&t(ab,function(w){w.render()}); -if(!q.seriesGroup)q.seriesGroup=aa.g("series-group").attr({zIndex:3}).add();t(Ba,function(w){w.translate();w.setTooltipPoints();w.render()});m.items&&t(m.items,function(){var w=qa(m.style,this.style),O=oa(w.left)+V,ja=oa(w.top)+ba+12;delete w.left;delete w.top;aa.text(this.html,O,ja).attr({zIndex:2}).css(w).add()});if(!q.toolbar)q.toolbar=d(q);if(h.enabled&&!q.credits){x=h.href;aa.text(h.text,0,0).on("click",function(){if(x)location.href=x}).attr({align:h.position.align,zIndex:8}).css(h.style).add().align(h.position)}Pc(); -q.hasRendered=true;if(Qb){jb.appendChild(ta);Fc(Qb)}}function ca(){var m=Ba.length,h=ta&&ta.parentNode;La(q,"destroy");Cb(ib,"unload",ca);Cb(q);for(t(ab,function(x){Cb(x)});m--;)Ba[m].destroy();if(ta){ta.innerHTML="";Cb(ta);h&&h.removeChild(ta);ta=null}if(aa)aa.alignedObjects=null;clearInterval(Nd);for(m in q)delete q[m]}function ka(){if(!wc&&ib==ib.top&&Aa.readyState!="complete")Aa.attachEvent("onreadystatechange",function(){Aa.detachEvent("onreadystatechange",ka);ka()});else{z();sd();td();t(a.series|| -[],function(m){g(m)});q.inverted=Ga=y(Ga,a.chart.inverted);j();q.render=W;q.tracker=gc=new f(q,a.tooltip);W();La(q,"load");b&&b.apply(q,[q]);t(q.callbacks,function(m){m.apply(q,[q])})}}Lc=ya(Lc,Sa.xAxis);hd=ya(hd,Sa.yAxis);Sa.xAxis=Sa.yAxis=null;a=ya(Sa,a);var v=a.chart,I=v.margin;I=Eb(I)?I:[I,I,I,I];var da=y(v.marginTop,I[0]),X=y(v.marginRight,I[1]),U=y(v.marginBottom,I[2]),R=y(v.marginLeft,I[3]),Ha=v.spacingTop,Ya=v.spacingRight,ud=v.spacingBottom,Vc=v.spacingLeft,uc,kc,tc,ba,Ab,rb,V,Pb,jb,Qb,ta, -Od,Tc,vc,Xa,Pa,jd,Oc,Wc,vd,wd,Xc,q=this,ae=(I=v.events)&&!!I.click,xd,hc,rc,nd,$b,Sd,yd,sa,wa,gc,Qc,Pc,od,Rb,Sb,qc,ic=v.showAxes,Rc=0,ab=[],Gb,Ba=[],Ga,aa,kd,Nd,ld,pd,sc,sd,td,rd,md,Td,be=function(m){function h(u,Z){var pa=u.legendItem,Na=u.legendLine,P=u.legendSymbol,K=M.color,gb=Z?L.itemStyle.color:K;K=Z?u.color:K;pa&&pa.css({fill:gb});Na&&Na.attr({stroke:K});P&&P.attr({stroke:K,fill:K})}function x(u,Z,pa){var Na=u.legendItem,P=u.legendLine,K=u.legendSymbol;u=u.checkbox;Na&&Na.attr({x:Z,y:pa}); -P&&P.translate(Z,pa-4);K&&K.attr({x:Z+K.xOff,y:pa+K.yOff});if(u){u.x=Z;u.y=pa}}function w(){t(bb,function(u){var Z=u.checkbox;Z&&Ia(Z,{left:Ka.attr("translateX")+u.legendItemWidth+Z.x-40+$a,top:Ka.attr("translateY")+Z.y-11+$a})})}function O(u){var Z,pa,Na,P,K,gb=u.legendItem;P=u.series||u;if(!gb){K=/^(bar|pie|area|column)$/.test(P.type);u.legendItem=gb=aa.text(L.labelFormatter.call(u),0,0).css(u.visible?ma:M).on("mouseover",function(){u.setState(yb);gb.css(Oa)}).on("mouseout",function(){gb.css(u.visible? -ma:M);u.setState()}).on("click",function(){var Vb=function(){u.setVisible()};u.firePointEvent?u.firePointEvent("legendItemClick",null,Vb):La(u,"legendItemClick",null,Vb)}).attr({zIndex:2}).add(Ka);if(!K&&u.options&&u.options.lineWidth){var cc=u.options;P={"stroke-width":cc.lineWidth,zIndex:2};if(cc.dashStyle)P.dashstyle=cc.dashStyle;u.legendLine=aa.path([Za,-Ea-ua,0,Da,-ua,0]).attr(P).add(Ka)}if(K)Z=aa.rect(pa=-Ea-ua,Na=-11,Ea,12,2).attr({"stroke-width":0,zIndex:3}).add(Ka);else if(u.options&&u.options.marker&& -u.options.marker.enabled)Z=aa.symbol(u.symbol,pa=-Ea/2-ua,Na=-4,u.options.marker.radius).attr(u.pointAttr[db]).attr({zIndex:3}).add(Ka);if(Z){Z.xOff=pa;Z.yOff=Na}u.legendSymbol=Z;h(u,u.visible);if(u.options&&u.options.showCheckbox){u.checkbox=fb("input",{type:"checkbox",checked:u.selected,defaultChecked:u.selected},L.itemCheckboxStyle,ta);Qa(u.checkbox,"click",function(Vb){La(u,"checkboxClick",{checked:Vb.target.checked},function(){u.select()})})}}Z=gb.getBBox();pa=u.legendItemWidth=L.itemWidth|| -Ea+ua+Z.width+ea;D=Z.height;if(ga&&Q-N+pa>(Hb||Xa-2*E-N)){Q=N;H+=D}A=H;x(u,Q,H);if(ga)Q+=pa;else H+=D;tb=Hb||Ca(ga?Q-N:pa,tb);bb.push(u)}function ja(){Q=N;H=s;A=tb=0;bb=[];Ka||(Ka=aa.g("legend").attr({zIndex:7}).add());Ta&&Fa.reverse();t(Fa,function(Na){if(Na.options.showInLegend)t(Na.options.legendType=="point"?Na.data:[Na],O)});Ta&&Fa.reverse();Rb=Hb||tb;Sb=A-s+D;if(xa||va){Rb+=2*E;Sb+=2*E;if(ha)Rb>0&&Sb>0&&ha.animate(ha.crisp(null,null,null,Rb,Sb));else ha=aa.rect(0,0,Rb,Sb,L.borderRadius,xa|| -0).attr({stroke:L.borderColor,"stroke-width":xa||0,fill:va||nb}).add(Ka).shadow(L.shadow);ha[bb.length?"show":"hide"]()}for(var u=["left","right","top","bottom"],Z,pa=4;pa--;){Z=u[pa];if(Ja[Z]&&Ja[Z]!="auto"){L[pa<2?"align":"verticalAlign"]=Z;L[pa<2?"x":"y"]=oa(Ja[Z])*(pa%2?-1:1)}}Ka.align(qa(L,{width:Rb,height:Sb}),true,uc);Rc||w()}var L=m.options.legend;if(L.enabled){var ga=L.layout=="horizontal",Ea=L.symbolWidth,ua=L.symbolPadding,bb,Ja=L.style,ma=L.itemStyle,Oa=L.itemHoverStyle,M=L.itemHiddenStyle, -E=oa(Ja.padding),ea=20,s=18,N=4+E+Ea+ua,Q,H,A,D=0,ha,xa=L.borderWidth,va=L.backgroundColor,Ka,tb,Hb=L.width,Fa=m.series,Ta=L.reversed;ja();Qa(m,"endResize",w);return{colorizeItem:h,destroyItem:function(u){var Z=u.checkbox;t(["legendItem","legendLine","legendSymbol"],function(pa){u[pa]&&u[pa].destroy()});Z&&Fc(u.checkbox)},renderLegend:ja}}};hc=function(m,h){return m>=0&&m<=wa&&h>=0&&h<=sa};Td=function(){La(q,"selection",{resetSelection:true},md);q.toolbar.remove("zoom")};md=function(m){var h=Sa.lang, -x=q.pointCount<100;q.toolbar.add("zoom",h.resetZoom,h.resetZoomTitle,Td);!m||m.resetSelection?t(ab,function(w){w.setExtremes(null,null,false,x)}):t(m.xAxis.concat(m.yAxis),function(w){var O=w.axis;if(q.tracker[O.isXAxis?"zoomX":"zoomY"])O.setExtremes(w.min,w.max,false,x)});k()};sc=function(){var m=a.legend,h=y(m.margin,10),x=m.x,w=m.y,O=m.align,ja=m.verticalAlign,L;sd();if((q.title||q.subtitle)&&!J(da))if(L=Ca(q.title&&!kc.floating&&!kc.verticalAlign&&kc.y||0,q.subtitle&&!tc.floating&&!tc.verticalAlign&& -tc.y||0))ba=Ca(ba,L+y(kc.margin,15)+Ha);if(m.enabled&&!m.floating)if(O=="right")J(X)||(Ab=Ca(Ab,Rb-x+h+Ya));else if(O=="left")J(R)||(V=Ca(V,Rb+x+h+Vc));else if(ja=="top")J(da)||(ba=Ca(ba,Sb+w+h+Ha));else if(ja=="bottom")J(U)||(rb=Ca(rb,Sb-w+h+ud));ic&&t(ab,function(ga){ga.getOffset()});J(R)||(V+=Pb[3]);J(da)||(ba+=Pb[0]);J(U)||(rb+=Pb[2]);J(X)||(Ab+=Pb[1]);td()};rd=function(m,h,x){var w=q.title,O=q.subtitle;Rc+=1;bc(x,q);Oc=Pa;jd=Xa;Xa=fa(m);Pa=fa(h);Ia(ta,{width:Xa+$a,height:Pa+$a});aa.setSize(Xa, -Pa,x);wa=Xa-V-Ab;sa=Pa-ba-rb;Gb=null;t(ab,function(ja){ja.isDirty=true;ja.setScale()});t(Ba,function(ja){ja.isDirty=true});q.isDirtyLegend=true;q.isDirtyBox=true;sc();w&&w.align(null,null,uc);O&&O.align(null,null,uc);k(x);Oc=null;La(q,"resize");setTimeout(function(){La(q,"endResize",null,function(){Rc-=1})},Bc&&Bc.duration||500)};td=function(){q.plotLeft=V=fa(V);q.plotTop=ba=fa(ba);q.plotWidth=wa=fa(Xa-V-Ab);q.plotHeight=sa=fa(Pa-ba-rb);q.plotSizeX=Ga?sa:wa;q.plotSizeY=Ga?wa:sa;uc={x:Vc,y:Ha,width:Xa- -Vc-Ya,height:Pa-Ha-ud}};sd=function(){ba=y(da,Ha);Ab=y(X,Ya);rb=y(U,ud);V=y(R,Vc);Pb=[0,0,0,0]};pd=function(){var m=v.borderWidth||0,h=v.backgroundColor,x=v.plotBackgroundColor,w=v.plotBackgroundImage,O,ja={x:V,y:ba,width:wa,height:sa};O=m+(v.shadow?8:0);if(m||h)if(Wc)Wc.animate(Wc.crisp(null,null,null,Xa-O,Pa-O));else Wc=aa.rect(O/2,O/2,Xa-O,Pa-O,v.borderRadius,m).attr({stroke:v.borderColor,"stroke-width":m,fill:h||nb}).add().shadow(v.shadow);if(x)if(vd)vd.animate(ja);else vd=aa.rect(V,ba,wa,sa, -0).attr({fill:x}).add().shadow(v.plotShadow);if(w)if(wd)wd.animate(ja);else wd=aa.image(w,V,ba,wa,sa).add();if(v.plotBorderWidth)if(Xc)Xc.animate(Xc.crisp(null,V,ba,wa,sa));else Xc=aa.rect(V,ba,wa,sa,0,v.plotBorderWidth).attr({stroke:v.plotBorderColor,"stroke-width":v.plotBorderWidth,zIndex:4}).add();q.isDirtyBox=false};Yc=Jb=0;Qa(ib,"unload",ca);v.reflow!==false&&Qa(q,"load",F);if(I)for(xd in I)Qa(q,xd,I[xd]);q.options=a;q.series=Ba;q.addSeries=function(m,h,x){var w;if(m){bc(x,q);h=y(h,true);La(q, -"addSeries",{options:m},function(){w=g(m);w.isDirty=true;q.isDirtyLegend=true;h&&q.redraw()})}return w};q.animation=y(v.animation,true);q.destroy=ca;q.get=function(m){var h,x,w;for(h=0;h-1,f=e?7:3,g;b=b.split(" ");c=[].concat(c);var i,k,j=function(n){for(g=n.length;g--;)n[g]==Za&&n.splice(g+1,0,n[g+1],n[g+2],n[g+1],n[g+2])};if(e){j(b);j(c)}if(a.isArea){i= -b.splice(b.length-6,6);k=c.splice(c.length-6,6)}if(d){c=[].concat(c).splice(0,f).concat(c);a.shift=false}if(b.length)for(a=c.length;b.length255)b[e]=255}}return this},setOpacity:function(d){b[3]=d;return this}}};Mc=function(a,b,c){function d(F){return F.toString().replace(/^([0-9])$/,"0$1")}if(!J(b)||isNaN(b))return"Invalid date";a=y(a,"%Y-%m-%d %H:%M:%S");b=new Date(b* -qb);var e=b[cd](),f=b[dd](),g=b[oc](),i=b[Dc](),k=b[Ec](),j=Sa.lang,n=j.weekdays;j=j.months;b={a:n[f].substr(0,3),A:n[f],d:d(g),e:g,b:j[i].substr(0,3),B:j[i],m:d(i+1),y:k.toString().substr(2,2),Y:k,H:d(e),I:d(e%12||12),l:e%12||12,M:d(b[bd]()),p:e<12?"AM":"PM",P:e<12?"am":"pm",S:d(b.getSeconds())};for(var z in b)a=a.replace("%"+z,b[z]);return c?a.substr(0,1).toUpperCase()+a.substr(1):a};Hc.prototype={init:function(a,b){this.element=Aa.createElementNS("http://www.w3.org/2000/svg",b);this.renderer=a}, -animate:function(a,b,c){if(b=y(b,Bc,true)){b=ya(b);if(c)b.complete=c;Zc(this,a,b)}else{this.attr(a);c&&c()}},attr:function(a,b){var c,d,e,f,g=this.element,i=g.nodeName,k=this.renderer,j,n=this.shadows,z,F=this;if(Kb(a)&&J(b)){c=a;a={};a[c]=b}if(Kb(a)){c=a;if(i=="circle")c={x:"cx",y:"cy"}[c]||c;else if(c=="strokeWidth")c="stroke-width";F=za(g,c)||this[c]||0;if(c!="d"&&c!="visibility")F=parseFloat(F)}else for(c in a){j=false;d=a[c];if(c=="d"){if(d&&d.join)d=d.join(" ");if(/(NaN| {2}|^$)/.test(d))d= -"M 0 0";this.d=d}else if(c=="x"&&i=="text"){for(e=0;eg||!J(g)&& -J(b))){d.insertBefore(f,a);return this}}d.appendChild(f);this.added=true;return this},destroy:function(){var a=this.element||{},b=this.shadows,c=a.parentNode,d;a.onclick=a.onmouseout=a.onmouseover=a.onmousemove=null;Sc(this);c&&c.removeChild(a);b&&t(b,function(e){(c=e.parentNode)&&c.removeChild(e)});mc(this.renderer.alignedObjects,this);for(d in this)delete this[d];return null},empty:function(){for(var a=this.element,b=a.childNodes,c=b.length;c--;)a.removeChild(b[c])},shadow:function(a){var b=[], -c,d=this.element,e=this.parentInverted?"(-1,-1)":"(1,1)";if(a){for(a=1;a<=3;a++){c=d.cloneNode(0);za(c,{isShadow:"true",stroke:"rgb(0, 0, 0)","stroke-opacity":0.05*a,"stroke-width":7-2*a,transform:"translate"+e,fill:nb});d.parentNode.insertBefore(c,d);b.push(c)}this.shadows=b}return this}};var Uc=function(){this.init.apply(this,arguments)};Uc.prototype={init:function(a,b,c,d){var e=location,f;this.Element=Hc;f=this.createElement("svg").attr({xmlns:"http://www.w3.org/2000/svg",version:"1.1"});a.appendChild(f.element); -this.box=f.element;this.boxWrapper=f;this.alignedObjects=[];this.url=Ac?"":e.href.replace(/#.*?$/,"");this.defs=this.createElement("defs").add();this.forExport=d;this.setSize(b,c,false)},createElement:function(a){var b=new this.Element;b.init(this,a);return b},buildText:function(a){for(var b=a.element,c=y(a.textStr,"").toString().replace(/<(b|strong)>/g,'').replace(/<(i|em)>/g,'').replace(//g, -"").split(/]?>/g),d=b.childNodes,e=/style="([^"]+)"/,f=/href="([^"]+)"/,g=za(b,"x"),i=a.styles,k=Rd&&i&&i.HcDirection=="rtl"&&!this.forExport,j,n=i&&oa(i.width),z=i&&i.lineHeight,F,W=d.length;W--;)b.removeChild(d[W]);n&&!a.added&&this.box.appendChild(b);t(c,function(ca,ka){var v,I=0,da;ca=ca.replace(//g,"|||");v=ca.split("|||");t(v,function(X){if(X!==""||v.length==1){var U={},R=Aa.createElementNS("http://www.w3.org/2000/svg","tspan");e.test(X)&& -za(R,"style",X.match(e)[1].replace(/(;| |^)color([ :])/,"$1fill$2"));if(f.test(X)){za(R,"onclick",'location.href="'+X.match(f)[1]+'"');Ia(R,{cursor:"pointer"})}X=X.replace(/<(.|\n)*?>/g,"")||" ";if(k){j=[];for(W=X.length;W--;)j.push(X.charAt(W));X=j.join("")}R.appendChild(Aa.createTextNode(X));if(I)U.dx=3;else U.x=g;if(!I){if(ka){da=oa(window.getComputedStyle(F,null).getPropertyValue("line-height"));if(isNaN(da))da=z||F.offsetHeight||18;za(R,"dy",da)}F=R}za(R,U);b.appendChild(R);I++;if(n){X=X.replace(/-/g, -"- ").split(" ");for(var Ha,Ya=[];X.length||Ya.length;){Ha=b.getBBox().width;U=Ha>n;if(!U||X.length==1){X=Ya;Ya=[];if(X.length){R=Aa.createElementNS("http://www.w3.org/2000/svg","tspan");za(R,{x:g,dy:z||16});b.appendChild(R);if(Ha>n)n=Ha}}else{R.removeChild(R.firstChild);Ya.unshift(X.pop())}R.appendChild(Aa.createTextNode(X.join(" ").replace(/- /g,"-")))}}}})})},crispLine:function(a,b){if(a[1]==a[4])a[1]=a[4]=fa(a[1])+b%2/2;if(a[2]==a[5])a[2]=a[5]=fa(a[2])+b%2/2;return a},path:function(a){return this.createElement("path").attr({d:a, -fill:nb})},circle:function(a,b,c){a=Eb(a)?a:{x:a,y:b,r:c};return this.createElement("circle").attr(a)},arc:function(a,b,c,d,e,f){if(Eb(a)){b=a.y;c=a.r;d=a.innerR;e=a.start;f=a.end;a=a.x}return this.symbol("arc",a||0,b||0,c||0,{innerR:d||0,start:e||0,end:f||0})},rect:function(a,b,c,d,e,f){if(Eb(a)){b=a.y;c=a.width;d=a.height;e=a.r;a=a.x}e=this.createElement("rect").attr({rx:e,ry:e,fill:nb});return e.attr(e.crisp(f,a,b,Ca(c,0),Ca(d,0)))},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length; -this.width=a;this.height=b;for(this.boxWrapper[y(c,true)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){return this.createElement("g").attr(J(a)&&{"class":Zb+a})},image:function(a,b,c,d,e){var f={preserveAspectRatio:nb};arguments.length>1&&qa(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a);return f},symbol:function(a,b,c,d,e){var f,g=this.symbols[a];g=g&&g(b,c,d,e);var i=/^url\((.*?)\)$/; -if(g){f=this.path(g);qa(f,{symbolName:a,x:b,y:c,r:d});e&&qa(f,e)}else if(i.test(a)){a=a.match(i)[1];f=this.image(a).attr({x:b,y:c});fb("img",{onload:function(){var k=de[this.src]||[this.width,this.height];f.attr({width:k[0],height:k[1]}).translate(-fa(k[0]/2),-fa(k[1]/2))},src:a})}else f=this.circle(b,c,d);return f},symbols:{square:function(a,b,c){c=0.707*c;return[Za,a-c,b-c,Da,a+c,b-c,a+c,b+c,a-c,b+c,"Z"]},triangle:function(a,b,c){return[Za,a,b-1.33*c,Da,a+c,b+0.67*c,a-c,b+0.67*c,"Z"]},"triangle-down":function(a, -b,c){return[Za,a,b+1.33*c,Da,a-c,b-0.67*c,a+c,b-0.67*c,"Z"]},diamond:function(a,b,c){return[Za,a,b-c,Da,a+c,b,a,b+c,a-c,b,"Z"]},arc:function(a,b,c,d){var e=d.start,f=d.end-1.0E-6,g=d.innerR,i=kb(e),k=zb(e),j=kb(f);f=zb(f);d=d.end-e');if(b){c=b==Lb||b=="span"||b=="img"?c.join(""): -a.prepVML(c);this.element=fb(c)}this.renderer=a},add:function(a){var b=this.renderer,c=this.element,d=b.box;d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);yc&&d.gVis==vb&&Ia(c,{visibility:vb});d.appendChild(c);this.added=true;this.alignOnAdd&&this.updateTransform();return this},attr:function(a,b){var c,d,e,f=this.element||{},g=f.style,i=f.nodeName,k=this.renderer,j=this.symbolName,n,z,F=this.shadows,W=this;if(Kb(a)&&J(b)){c=a;a={};a[c]=b}if(Kb(a)){c=a;W=c=="strokeWidth"||c=="stroke-width"?this.strokeweight: -this[c]}else for(c in a){d=a[c];n=false;if(j&&/^(x|y|r|start|end|width|height|innerR)/.test(c)){if(!z){this.symbolAttr(a);z=true}n=true}else if(c=="d"){d=d||[];this.d=d.join(" ");e=d.length;for(n=[];e--;)n[e]=ac(d[e])?fa(d[e]*10)-5:d[e]=="Z"?"x":d[e];d=n.join(" ")||"x";f.path=d;if(F)for(e=F.length;e--;)F[e].path=d;n=true}else if(c=="zIndex"||c=="visibility"){if(yc&&c=="visibility"&&i=="DIV"){f.gVis=d;n=f.childNodes;for(e=n.length;e--;)Ia(n[e],{visibility:d});if(d==Bb)d=null}if(d)g[c]=d;n=true}else if(/^(width|height)$/.test(c)){if(this.updateClipping){this[c]= -d;this.updateClipping()}else g[c]=d;n=true}else if(/^(x|y)$/.test(c)){this[c]=d;if(f.tagName=="SPAN")this.updateTransform();else g[{x:"left",y:"top"}[c]]=d}else if(c=="class")f.className=d;else if(c=="stroke"){d=k.color(d,f,c);c="strokecolor"}else if(c=="stroke-width"||c=="strokeWidth"){f.stroked=d?true:false;c="strokeweight";this[c]=d;if(ac(d))d+=$a}else if(c=="dashstyle"){(f.getElementsByTagName("stroke")[0]||fb(k.prepVML([""]),null,null,f))[c]=d||"solid";this.dashstyle=d;n=true}else if(c== -"fill")if(i=="SPAN")g.color=d;else{f.filled=d!=nb?true:false;d=k.color(d,f,c);c="fillcolor"}else if(c=="translateX"||c=="translateY"||c=="rotation"||c=="align"){if(c=="align")c="textAlign";this[c]=d;this.updateTransform();n=true}else if(c=="text"){f.innerHTML=d;n=true}if(F&&c=="visibility")for(e=F.length;e--;)F[e].style[c]=d;if(!n)if(yc)f[c]=d;else za(f,c,d)}return W},clip:function(a){var b=this,c=a.members;c.push(b);b.destroyClip=function(){mc(c,b)};return b.css(a.getCSS(b.inverted))},css:function(a){var b= -this.element;if(b=a&&b.tagName=="SPAN"&&a.width){delete a.width;this.textWidth=b;this.updateTransform()}this.styles=qa(this.styles,a);Ia(this.element,a);return this},destroy:function(){this.destroyClip&&this.destroyClip();Hc.prototype.destroy.apply(this)},empty:function(){for(var a=this.element.childNodes,b=a.length,c;b--;){c=a[b];c.parentNode.removeChild(c)}},getBBox:function(){var a=this.element;if(a.nodeName=="text")a.style.position=lc;return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}}, -on:function(a,b){this.element["on"+a]=function(){var c=ib.event;c.target=c.srcElement;b(c)};return this},updateTransform:function(){if(this.added){var a=this,b=a.element,c=a.translateX||0,d=a.translateY||0,e=a.x||0,f=a.y||0,g=a.textAlign||"left",i={left:0,center:0.5,right:1}[g],k=g&&g!="left";if(c||d)a.css({marginLeft:c,marginTop:d});a.inverted&&t(b.childNodes,function(I){a.renderer.invertChild(I,b)});if(b.tagName=="SPAN"){var j,n;c=a.rotation;var z;j=0;d=1;var F=0,W;z=oa(a.textWidth);var ca=a.xCorr|| -0,ka=a.yCorr||0,v=[c,g,b.innerHTML,a.textWidth].join(",");if(v!=a.cTT){if(J(c)){j=c*Ud;d=kb(j);F=zb(j);Ia(b,{filter:c?["progid:DXImageTransform.Microsoft.Matrix(M11=",d,", M12=",-F,", M21=",F,", M22=",d,", sizingMethod='auto expand')"].join(""):nb})}j=b.offsetWidth;n=b.offsetHeight;if(j>z){Ia(b,{width:z+$a,display:"block",whiteSpace:"normal"});j=z}z=fa(oa(b.style.fontSize||12)*1.2);ca=d<0&&-j;ka=F<0&&-n;W=d*F<0;ca+=F*z*(W?1-i:i);ka-=d*z*(c?W?i:1-i:1);if(k){ca-=j*i*(d<0?-1:1);if(c)ka-=n*i*(F<0?-1: -1);Ia(b,{textAlign:g})}a.xCorr=ca;a.yCorr=ka}Ia(b,{left:e+ca,top:f+ka});a.cTT=v}}else this.alignOnAdd=true},shadow:function(a){var b=[],c=this.element,d=this.renderer,e,f=c.style,g,i=c.path;if(""+c.path==="")i="x";if(a){for(a=1;a<=3;a++){g=[''];e=fb(d.prepVML(g),null,{left:oa(f.left)+1,top:oa(f.top)+1});g=[''];fb(d.prepVML(g),null, -null,e);c.parentNode.insertBefore(e,c);b.push(e)}this.shadows=b}return this}});Ma=function(){this.init.apply(this,arguments)};Ma.prototype=ya(Uc.prototype,{isIE8:xc.indexOf("MSIE 8.0")>-1,init:function(a,b,c){var d;this.Element=ge;this.alignedObjects=[];d=this.createElement(Lb);a.appendChild(d.element);this.box=d.element;this.boxWrapper=d;this.setSize(b,c,false);if(!Aa.namespaces.hcv){Aa.namespaces.add("hcv","urn:schemas-microsoft-com:vml");Aa.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}, -clipRect:function(a,b,c,d){var e=this.createElement();return qa(e,{members:[],left:a,top:b,width:c,height:d,getCSS:function(f){var g=this.top,i=this.left,k=i+this.width,j=g+this.height;g={clip:"rect("+fa(f?i:g)+"px,"+fa(f?j:k)+"px,"+fa(f?k:j)+"px,"+fa(f?g:i)+"px)"};!f&&yc&&qa(g,{width:k+$a,height:j+$a});return g},updateClipping:function(){t(e.members,function(f){f.css(e.getCSS(f.inverted))})}})},color:function(a,b,c){var d,e=/^rgba/;if(a&&a.linearGradient){var f,g,i=a.linearGradient,k,j,n,z;t(a.stops, -function(F,W){if(e.test(F[1])){d=Ub(F[1]);f=d.get("rgb");g=d.get("a")}else{f=F[1];g=1}if(W){n=f;z=g}else{k=f;j=g}});a=90-Ua.atan((i[3]-i[1])/(i[2]-i[0]))*180/Tb;c=["<",c,' colors="0% ',k,",100% ",n,'" angle="',a,'" opacity="',z,'" o:opacity2="',j,'" type="gradient" focus="100%" />'];fb(this.prepVML(c),null,null,b)}else if(e.test(a)&&b.tagName!="IMG"){d=Ub(a);c=["<",c,' opacity="',d.get("a"),'"/>'];fb(this.prepVML(c),null,null,b);return d.get("rgb")}else return a},prepVML:function(a){var b=this.isIE8; -a=a.join("");if(b){a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />');a=a.indexOf('style="')==-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')}else a=a.replace("<","1&&f.css({left:b,top:c,width:d,height:e});return f},rect:function(a,b,c,d,e,f){if(Eb(a)){b=a.y;c=a.width;d=a.height;e=a.r;a=a.x}var g=this.symbol("rect");g.r=e;return g.attr(g.crisp(f,a,b,Ca(c,0),Ca(d,0)))},invertChild:function(a,b){var c=b.style; -Ia(a,{flip:"x",left:oa(c.width)-10,top:oa(c.height)-10,rotation:-90})},symbols:{arc:function(a,b,c,d){var e=d.start,f=d.end,g=kb(e),i=zb(e),k=kb(f),j=zb(f);d=d.innerR;var n=0.07/c,z=d&&0.1/d||0;if(f-e===0)return["x"];else if(2*Tb-f+e=c.length)Jb=0}a.chart.pointCount++;return this},applyOptions:function(a){var b=this.series;this.config=a;if(ac(a)||a===null)this.y=a;else if(Eb(a)&&!ac(a.length)){qa(this,a);this.options=a}else if(Kb(a[0])){this.name=a[0];this.y=a[1]}else if(ac(a[0])){this.x=a[0];this.y=a[1]}if(this.x===Ra)this.x=b.autoIncrement()},destroy:function(){var a=this,b=a.series,c;b.chart.pointCount--;a==b.chart.hoverPoint&&a.onMouseOut();b.chart.hoverPoints=null;Cb(a);t(["graphic","tracker","group","dataLabel", -"connector"],function(d){a[d]&&a[d].destroy()});a.legendItem&&a.series.chart.legend.destroyItem(a);for(c in a)a[c]=null},select:function(a,b){var c=this,d=c.series.chart;c.selected=a=y(a,!c.selected);c.firePointEvent(a?"select":"unselect");c.setState(a&&"select");b||t(d.getSelectedPoints(),function(e){if(e.selected&&e!=c){e.selected=false;e.setState(db);e.firePointEvent("unselect")}})},onMouseOver:function(){var a=this.series.chart,b=a.tooltip,c=a.hoverPoint;c&&c!=this&&c.onMouseOut();this.firePointEvent("mouseOver"); -b&&!b.shared&&b.refresh(this);this.setState(yb);a.hoverPoint=this},onMouseOut:function(){this.firePointEvent("mouseOut");this.setState();this.series.chart.hoverPoint=null},tooltipFormatter:function(a){var b=this.series;return['',this.name||b.name,": ",!a?"x = "+(this.name||this.x)+", ":"","",!a?"y = ":"",this.y,"
    "].join("")},getDataLabelText:function(){return this.series.options.dataLabels.formatter.call({x:this.x,y:this.y,series:this.series, -point:this,percentage:this.percentage,total:this.total||this.stackTotal})},update:function(a,b,c){var d=this,e=d.series,f=d.dataLabel,g=d.graphic,i=e.chart;b=y(b,true);d.firePointEvent("update",{options:a},function(){d.applyOptions(a);f&&f.attr({text:d.getDataLabelText()});if(Eb(a)){e.getAttribs();g&&g.attr(d.pointAttr[e.state])}e.isDirty=true;b&&i.redraw(c)})},remove:function(a,b){var c=this,d=c.series,e=d.chart,f=d.data;bc(b,e);a=y(a,true);c.firePointEvent("remove",null,function(){mc(f,c);c.destroy(); -d.isDirty=true;a&&e.redraw()})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;if(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])this.importEvents();if(a=="click"&&e.allowPointSelect)c=function(f){d.select(null,f.ctrlKey||f.metaKey||f.shiftKey)};La(this,a,b,c)},importEvents:function(){if(!this.hasImportedEvents){var a=ya(this.series.options.point,this.options).events,b;this.events=a;for(b in a)Qa(this,b,a[b]);this.hasImportedEvents=true}},setState:function(a){var b= -this.series,c=b.options.states,d=wb[b.type].marker&&b.options.marker,e=d&&!d.enabled,f=(d=d&&d.states[a])&&d.enabled===false,g=b.stateMarkerGraphic,i=b.chart,k=this.pointAttr;a||(a=db);if(!(a==this.state||this.selected&&a!="select"||c[a]&&c[a].enabled===false||a&&(f||e&&!d.enabled))){if(this.graphic)this.graphic.attr(k[a]);else{if(a){if(!g)b.stateMarkerGraphic=g=i.renderer.circle(0,0,k[a].r).attr(k[a]).add(b.group);g.translate(this.plotX,this.plotY)}if(g)g[a?"show":"hide"]()}this.state=a}}};var mb= -function(){};mb.prototype={isCartesian:true,type:"line",pointClass:zc,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor",r:"radius"},init:function(a,b){var c,d;d=a.series.length;this.chart=a;b=this.setOptions(b);qa(this,{index:d,options:b,name:b.name||"Series "+(d+1),state:db,pointAttr:{},visible:b.visible!==false,selected:b.selected===true});d=b.events;for(c in d)Qa(this,c,d[c]);if(d&&d.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick= -true;this.getColor();this.getSymbol();this.setData(b.data,false)},autoIncrement:function(){var a=this.options,b=this.xIncrement;b=y(b,a.pointStart,0);this.pointInterval=y(this.pointInterval,a.pointInterval,1);this.xIncrement=b+this.pointInterval;return b},cleanData:function(){var a=this.chart,b=this.data,c,d,e=a.smallestInterval,f,g;b.sort(function(i,k){return i.x-k.x});for(g=b.length-1;g>=0;g--)b[g-1]&&b[g-1].x==b[g].x&&b.splice(g-1,1);for(g=b.length-1;g>=0;g--)if(b[g-1]){f=b[g].x-b[g-1].x;if(d=== -Ra||fa+1&&b.push(c.slice(a+1,e));a=e}else e==c.length-1&&b.push(c.slice(a+1,e+1))});this.segments=b},setOptions:function(a){var b=this.chart.options.plotOptions;return ya(b[this.type],b.series,a)},getColor:function(){var a=this.chart.options.colors;this.color=this.options.color||a[Jb++]||"#0000ff";if(Jb>=a.length)Jb=0},getSymbol:function(){var a= -this.chart.options.symbols;this.symbol=this.options.marker.symbol||a[Yc++];if(Yc>=a.length)Yc=0},addPoint:function(a,b,c,d){var e=this.data,f=this.graph,g=this.area,i=this.chart;a=(new this.pointClass).init(this,a);bc(d,i);if(f&&c)f.shift=c;if(g){g.shift=c;g.isArea=true}b=y(b,true);e.push(a);c&&e[0].remove(false);this.isDirty=true;b&&i.redraw()},setData:function(a,b){var c=this,d=c.data,e=c.initialColor,f=c.chart,g=d&&d.length||0;c.xIncrement=null;if(J(e))Jb=e;for(a=jc(nc(a||[]),function(i){return(new c.pointClass).init(c, -i)});g--;)d[g].destroy();c.data=a;c.cleanData();c.getSegments();c.isDirty=true;f.isDirtyBox=true;y(b,true)&&f.redraw(false)},remove:function(a,b){var c=this,d=c.chart;a=y(a,true);if(!c.isRemoving){c.isRemoving=true;La(c,"remove",null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=true;a&&d.redraw(b)})}c.isRemoving=false},translate:function(){for(var a=this.chart,b=this.options.stacking,c=this.xAxis.categories,d=this.yAxis,e=this.data,f=e.length;f--;){var g=e[f],i=g.x,k=g.y,j=g.low,n=d.stacks[(k< -0?"-":"")+this.stackKey];g.plotX=this.xAxis.translate(i);if(b&&this.visible&&n&&n[i]){j=n[i];i=j.total;j.cum=j=j.cum-k;k=j+k;if(b=="percent"){j=i?j*100/i:0;k=i?k*100/i:0}g.percentage=i?g.y*100/i:0;g.stackTotal=i}if(J(j))g.yBottom=d.translate(j,0,1);if(k!==null)g.plotY=d.translate(k,0,1);g.clientX=a.inverted?a.plotHeight-g.plotX:g.plotX;g.category=c&&c[g.x]!==Ra?c[g.x]:g.x}},setTooltipPoints:function(a){var b=this.chart,c=b.inverted,d=[],e=fa((c?b.plotTop:b.plotLeft)+b.plotSizeX),f,g,i=[];if(a)this.tooltipPoints= -null;t(this.segments,function(k){d=d.concat(k)});if(this.xAxis&&this.xAxis.reversed)d=d.reverse();t(d,function(k,j){f=d[j-1]?d[j-1].high+1:0;for(g=k.high=d[j+1]?ob((k.plotX+(d[j+1]?d[j+1].plotX:e))/2):e;f<=g;)i[c?e-f++:f++]=k});this.tooltipPoints=i},onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(!(!Ib&&a.mouseIsDown)){b&&b!=this&&b.onMouseOut();this.options.events.mouseOver&&La(this,"mouseOver");this.tracker&&this.tracker.toFront();this.setState(yb);a.hoverSeries=this}},onMouseOut:function(){var a= -this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;d&&d.onMouseOut();this&&a.events.mouseOut&&La(this,"mouseOut");c&&!a.stickyTracking&&c.hide();this.setState();b.hoverSeries=null},animate:function(a){var b=this.chart,c=this.clipRect,d=this.options.animation;if(d&&!Eb(d))d={};if(a){if(!c.isAnimating){c.attr("width",0);c.isAnimating=true}}else{c.animate({width:b.plotSizeX},d);this.animate=null}},drawPoints:function(){var a,b=this.data,c=this.chart,d,e,f,g,i,k;if(this.options.marker.enabled)for(f= -b.length;f--;){g=b[f];d=g.plotX;e=g.plotY;k=g.graphic;if(e!==Ra&&!isNaN(e)){a=g.pointAttr[g.selected?"select":db];i=a.r;if(k)k.animate({x:d,y:e,r:i});else g.graphic=c.renderer.symbol(y(g.marker&&g.marker.symbol,this.symbol),d,e,i).attr(a).add(this.group)}}},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,i={};a=a||{};b=b||{};c=c||{};d=d||{};for(f in e){g=e[f];i[f]=y(a[g],b[f],c[f],d[f])}return i},getAttribs:function(){var a=this,b=wb[a.type].marker?a.options.marker:a.options,c= -b.states,d=c[yb],e,f=a.color,g={stroke:f,fill:f},i=a.data,k=[],j,n=a.pointAttrToOptions;if(a.options.marker){d.radius=d.radius||b.radius+2;d.lineWidth=d.lineWidth||b.lineWidth+1}else d.color=d.color||Ub(d.color||f).brighten(d.brightness).get();k[db]=a.convertAttribs(b,g);t([yb,"select"],function(F){k[F]=a.convertAttribs(c[F],k[db])});a.pointAttr=k;for(f=i.length;f--;){g=i[f];if((b=g.options&&g.options.marker||g.options)&&b.enabled===false)b.radius=0;e=false;if(g.options)for(var z in n)if(J(b[n[z]]))e= -true;if(e){j=[];c=b.states||{};e=c[yb]=c[yb]||{};if(!a.options.marker)e.color=Ub(e.color||g.options.color).brighten(e.brightness||d.brightness).get();j[db]=a.convertAttribs(b,k[db]);j[yb]=a.convertAttribs(c[yb],k[yb],j[db]);j.select=a.convertAttribs(c.select,k.select,j[db])}else j=k;g.pointAttr=j}},destroy:function(){var a=this,b=a.chart,c=/\/5[0-9\.]+ (Safari|Mobile)\//.test(xc),d,e;Cb(a);a.legendItem&&a.chart.legend.destroyItem(a);t(a.data,function(f){f.destroy()});t(["area","graph","dataLabelsGroup", -"group","tracker"],function(f){if(a[f]){d=c&&f=="group"?"hide":"destroy";a[f][d]()}});if(b.hoverSeries==a)b.hoverSeries=null;mc(b.series,a);for(e in a)delete a[e]},drawDataLabels:function(){if(this.options.dataLabels.enabled){var a,b,c=this.data,d=this.options.dataLabels,e,f=this.dataLabelsGroup,g=this.chart,i=g.inverted,k=this.type,j;if(!f)f=this.dataLabelsGroup=g.renderer.g(Zb+"data-labels").attr({visibility:this.visible?Bb:vb,zIndex:5}).translate(g.plotLeft,g.plotTop).add();j=d.color;if(j=="auto")j= -null;d.style.color=y(j,this.color);t(c,function(n){var z=n.barX;z=z&&z+n.barW/2||n.plotX||-999;var F=y(n.plotY,-999),W=n.dataLabel,ca=d.align;e=n.getDataLabelText();a=(i?g.plotWidth-F:z)+d.x;b=(i?g.plotHeight-z:F)+d.y;if(k=="column")a+={left:-1,right:1}[ca]*n.barW/2||0;if(W)W.animate({x:a,y:b});else if(J(e))W=n.dataLabel=g.renderer.text(e,a,b).attr({align:ca,rotation:d.rotation,zIndex:1}).css(d.style).add(f);i&&!d.y&&W.attr({y:b+parseInt(W.styles.lineHeight)*0.9-W.getBBox().height/2})})}},drawGraph:function(){var a= -this,b=a.options,c=a.graph,d=[],e,f=a.area,g=a.group,i=b.lineColor||a.color,k=b.lineWidth,j=b.dashStyle,n,z=a.chart.renderer,F=a.yAxis.getThreshold(b.threshold||0),W=/^area/.test(a.type),ca=[],ka=[];t(a.segments,function(v){n=[];t(v,function(U,R){if(a.getPointSpline)n.push.apply(n,a.getPointSpline(v,U,R));else{n.push(R?Da:Za);R&&b.step&&n.push(U.plotX,v[R-1].plotY);n.push(U.plotX,U.plotY)}});if(v.length>1)d=d.concat(n);else ca.push(v[0]);if(W){var I=[],da,X=n.length;for(da=0;da=0;da--)I.push(v[da].plotX,v[da].yBottom);else I.push(Da,v[v.length-1].plotX,F,Da,v[0].plotX,F);ka=ka.concat(I)}});a.graphPath=d;a.singlePoints=ca;if(W){e=y(b.fillColor,Ub(a.color).setOpacity(b.fillOpacity||0.75).get());if(f)f.animate({d:ka});else a.area=a.chart.renderer.path(ka).attr({fill:e}).add(g)}if(c)c.animate({d:d});else if(k){c={stroke:i,"stroke-width":k};if(j)c.dashstyle=j;a.graph=z.path(d).attr(c).add(g).shadow(b.shadow)}}, -render:function(){var a=this,b=a.chart,c,d,e=a.options,f=e.animation,g=f&&a.animate;f=g?f&&f.duration||500:0;var i=a.clipRect;d=b.renderer;if(!i){i=a.clipRect=!b.hasRendered&&b.clipRect?b.clipRect:d.clipRect(0,0,b.plotSizeX,b.plotSizeY);if(!b.clipRect)b.clipRect=i}if(!a.group){c=a.group=d.g("series");if(b.inverted){d=function(){c.attr({width:b.plotWidth,height:b.plotHeight}).invert()};d();Qa(b,"resize",d)}c.clip(a.clipRect).attr({visibility:a.visible?Bb:vb,zIndex:e.zIndex}).translate(b.plotLeft,b.plotTop).add(b.seriesGroup)}a.drawDataLabels(); -g&&a.animate(true);a.getAttribs();a.drawGraph&&a.drawGraph();a.drawPoints();a.options.enableMouseTracking!==false&&a.drawTracker();g&&a.animate();setTimeout(function(){i.isAnimating=false;if((c=a.group)&&i!=b.clipRect&&i.renderer){c.clip(a.clipRect=b.clipRect);i.destroy()}},f);a.isDirty=false},redraw:function(){var a=this.chart,b=this.group;if(b){a.inverted&&b.attr({width:a.plotWidth,height:a.plotHeight});b.animate({translateX:a.plotLeft,translateY:a.plotTop})}this.translate();this.setTooltipPoints(true); -this.render()},setState:function(a){var b=this.options,c=this.graph,d=b.states;b=b.lineWidth;a=a||db;if(this.state!=a){this.state=a;if(!(d[a]&&d[a].enabled===false)){if(a)b=d[a].lineWidth||b+1;if(c&&!c.dashstyle)c.attr({"stroke-width":b},a?0:500)}}},setVisible:function(a,b){var c=this.chart,d=this.legendItem,e=this.group,f=this.tracker,g=this.dataLabelsGroup,i,k=this.data,j=c.options.chart.ignoreHiddenSeries;i=this.visible;i=(this.visible=a=a===Ra?!i:a)?"show":"hide";e&&e[i]();if(f)f[i]();else for(e= -k.length;e--;){f=k[e];f.tracker&&f.tracker[i]()}g&&g[i]();d&&c.legend.colorizeItem(this,a);this.isDirty=true;this.options.stacking&&t(c.series,function(n){if(n.options.stacking&&n.visible)n.isDirty=true});if(j)c.isDirtyBox=true;b!==false&&c.redraw();La(this,i)},show:function(){this.setVisible(true)},hide:function(){this.setVisible(false)},select:function(a){this.selected=a=a===Ra?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;La(this,a?"select":"unselect")},drawTracker:function(){var a= -this,b=a.options,c=[].concat(a.graphPath),d=c.length,e=a.chart,f=e.options.tooltip.snap,g=a.tracker,i=b.cursor;i=i&&{cursor:i};var k=a.singlePoints,j;if(d)for(j=d+1;j--;){c[j]==Za&&c.splice(j+1,0,c[j+1]-f,c[j+2],Da);if(j&&c[j]==Za||j==d)c.splice(j,0,Da,c[j-2]+f,c[j-1])}for(j=0;j -a&&k>e){k=Ca(a,e);n=2*e-k}else if(kg&&n>e){n=Ca(g,e);k=2*e-n}else if(nv?X-v:ka-(da<=ka?v:0)}Ya=R-3}qa(I,{barX:U,barY:R,barW:W,barH:Ha});I.shapeType="rect";I.shapeArgs={x:U,y:R,width:W,height:Ha,r:k.borderRadius}; -I.trackerArgs=J(Ya)&&ya(I.shapeArgs,{height:Ca(6,Ha+3),y:Ya})})},getSymbol:function(){},drawGraph:function(){},drawPoints:function(){var a=this,b=a.options,c=a.chart.renderer,d,e;t(a.data,function(f){var g=f.plotY;if(g!==Ra&&!isNaN(g)){d=f.graphic;e=f.shapeArgs;if(d){Sc(d);d.animate(e)}else f.graphic=c[f.shapeType](e).attr(f.pointAttr[f.selected?"select":db]).add(a.group).shadow(b.shadow)}})},drawTracker:function(){var a=this,b=a.chart,c=b.renderer,d,e,f=+new Date,g=a.options.cursor,i=g&&{cursor:g}, -k;t(a.data,function(j){e=j.tracker;d=j.trackerArgs||j.shapeArgs;if(j.y!==null)if(e)e.attr(d);else j.tracker=c[j.shapeType](d).attr({isTracker:f,fill:Vd,visibility:a.visible?Bb:vb,zIndex:1}).on(Ib?"touchstart":"mouseover",function(n){k=n.relatedTarget||n.fromElement;b.hoverSeries!=a&&za(k,"isTracker")!=f&&a.onMouseOver();j.onMouseOver()}).on("mouseout",function(n){if(!a.options.stickyTracking){k=n.relatedTarget||n.toElement;za(k,"isTracker")!=f&&a.onMouseOut()}}).css(i).add(b.trackerGroup)})},animate:function(a){var b= -this,c=b.data;if(!a){t(c,function(d){var e=d.graphic;if(e){e.attr({height:0,y:b.yAxis.translate(0,0,1)});e.animate({height:d.barH,y:d.barY},b.options.animation)}});b.animate=null}},remove:function(){var a=this,b=a.chart;b.hasRendered&&t(b.series,function(c){if(c.type==a.type)c.isDirty=true});mb.prototype.remove.apply(a,arguments)}});ub.column=ad;Ma=xb(ad,{type:"bar",init:function(a){a.inverted=this.inverted=true;ad.prototype.init.apply(this,arguments)}});ub.bar=Ma;Ma=xb(mb,{type:"scatter",translate:function(){var a= -this;mb.prototype.translate.apply(a);t(a.data,function(b){b.shapeType="circle";b.shapeArgs={x:b.plotX,y:b.plotY,r:a.chart.options.tooltip.snap}})},drawTracker:function(){var a=this,b=a.options.cursor,c=b&&{cursor:b},d;t(a.data,function(e){(d=e.graphic)&&d.attr({isTracker:true}).on("mouseover",function(){a.onMouseOver();e.onMouseOver()}).on("mouseout",function(){a.options.stickyTracking||a.onMouseOut()}).css(c)})},cleanData:function(){}});ub.scatter=Ma;Ma=xb(zc,{init:function(){zc.prototype.init.apply(this, -arguments);var a=this,b;qa(a,{visible:a.visible!==false,name:y(a.name,"Slice")});b=function(){a.slice()};Qa(a,"select",b);Qa(a,"unselect",b);return a},setVisible:function(a){var b=this.series.chart,c=this.tracker,d=this.dataLabel,e=this.connector,f;f=(this.visible=a=a===Ra?!this.visible:a)?"show":"hide";this.group[f]();c&&c[f]();d&&d[f]();e&&e[f]();this.legendItem&&b.legend.colorizeItem(this,a)},slice:function(a,b,c){var d=this.series.chart,e=this.slicedTranslation;bc(c,d);y(b,true);a=this.sliced= -J(a)?a:!this.sliced;this.group.animate({translateX:a?e[0]:d.plotLeft,translateY:a?e[1]:d.plotTop})}});Ma=xb(mb,{type:"pie",isCartesian:false,pointClass:Ma,pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:function(){this.initialColor=Jb},animate:function(){var a=this;t(a.data,function(b){var c=b.graphic;b=b.shapeArgs;var d=-Tb/2;if(c){c.attr({r:0,start:d,end:d});c.animate({r:b.r,start:b.start,end:b.end},a.options.animation)}});a.animate=null},translate:function(){var a= -0,b=-0.25,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f=c.center,g=this.chart,i=g.plotWidth,k=g.plotHeight,j,n,z,F=this.data,W=2*Tb,ca,ka=pb(i,k),v,I,da,X=c.dataLabels.distance;f.push(c.size,c.innerSize||0);f=jc(f,function(U,R){return(v=/%$/.test(U))?[i,k,ka,ka][R]*oa(U)/100:U});this.getX=function(U,R){z=Ua.asin((U-f[1])/(f[2]/2+X));return f[0]+(R?-1:1)*kb(z)*(f[2]/2+X)};this.center=f;t(F,function(U){a+=U.y});t(F,function(U){ca=a?U.y/a:0;j=fa(b*W*1E3)/1E3;b+=ca;n=fa(b*W*1E3)/1E3;U.shapeType= -"arc";U.shapeArgs={x:f[0],y:f[1],r:f[2]/2,innerR:f[3]/2,start:j,end:n};z=(n+j)/2;U.slicedTranslation=jc([kb(z)*d+g.plotLeft,zb(z)*d+g.plotTop],fa);I=kb(z)*f[2]/2;da=zb(z)*f[2]/2;U.tooltipPos=[f[0]+I*0.7,f[1]+da*0.7];U.labelPos=[f[0]+I+kb(z)*X,f[1]+da+zb(z)*X,f[0]+I+kb(z)*e,f[1]+da+zb(z)*e,f[0]+I,f[1]+da,X<0?"center":z0,j,n,z=this.center[1],F=[[],[],[],[]],W,ca,ka,v,I,da,X,U=4,R;mb.prototype.drawDataLabels.apply(this);t(a,function(Ha){var Ya=Ha.labelPos[7];F[Ya<0?0:YaYa.y};U--;){a=0;b=[].concat(F[U]);b.sort(X);for(R=b.length;R--;)b[R].rank=R;for(v=0;v<2;v++){n=(da=U%3)?9999:-9999;I=da?-1:1;for(R=0;Rn-j){ca=n+I*j;W=this.getX(ca,U>1);if(!da&&ca+j>z||da&&ca-j
    /g, '
    ') - .split(/]?>/g), - childNodes = textNode.childNodes, - styleRegex = /style="([^"]+)"/, - hrefRegex = /href="([^"]+)"/, - parentX = attr(textNode, 'x'), - textStyles = wrapper.styles, - reverse = isFirefox && textStyles && textStyles.HcDirection == 'rtl' && !this.forExport, // issue #38 - arr, - width = textStyles && pInt(textStyles.width), - textLineHeight = textStyles && textStyles.lineHeight, - lastLine, - i = childNodes.length; - - // remove old text - while (i--) { - textNode.removeChild(childNodes[i]); - } - - if (width && !wrapper.added) { - this.box.appendChild(textNode); // attach it to the DOM to read offset width - } - - each(lines, function(line, lineNo) { - var spans, spanNo = 0, lineHeight; - - line = line.replace(//g, '|||'); - spans = line.split('|||'); - - each(spans, function (span) { - if (span !== '' || spans.length == 1) { - var attributes = {}, - tspan = doc.createElementNS(SVG_NS, 'tspan'); - if (styleRegex.test(span)) { - attr( - tspan, - 'style', - span.match(styleRegex)[1].replace(/(;| |^)color([ :])/, '$1fill$2') - ); - } - if (hrefRegex.test(span)) { - attr(tspan, 'onclick', 'location.href=\"'+ span.match(hrefRegex)[1] +'\"'); - css(tspan, { cursor: 'pointer' }); - } - - span = span.replace(/<(.|\n)*?>/g, '') || ' '; - - // issue #38 workaround. - if (reverse) { - arr = []; - i = span.length; - while (i--) { - arr.push(span.charAt(i)) - } - span = arr.join(''); - } - - // add the text node - tspan.appendChild(doc.createTextNode(span)); - - if (!spanNo) { // first span in a line, align it to the left - attributes.x = parentX; - } else { - // Firefox ignores spaces at the front or end of the tspan - attributes.dx = 3; // space - } - - // first span on subsequent line, add the line height - if (!spanNo) { - if (lineNo) { - // Webkit and opera sometimes return 'normal' as the line height. In that - // case, webkit uses offsetHeight, while Opera falls back to 18 - lineHeight = pInt(window.getComputedStyle(lastLine, null).getPropertyValue('line-height')); - if (isNaN(lineHeight)) { - lineHeight = textLineHeight || lastLine.offsetHeight || 18; - } - attr(tspan, 'dy', lineHeight); - } - lastLine = tspan; // record for use in next line - } - - // add attributes - attr(tspan, attributes); - - // append it - textNode.appendChild(tspan); - - spanNo++; - - // check width and apply soft breaks - if (width) { - var words = span.replace(/-/g, '- ').split(' '), - tooLong, - actualWidth, - rest = []; - - while (words.length || rest.length) { - actualWidth = textNode.getBBox().width; - tooLong = actualWidth > width; - if (!tooLong || words.length == 1) { // new line needed - words = rest; - rest = []; - if (words.length) { - tspan = doc.createElementNS(SVG_NS, 'tspan'); - attr(tspan, { - x: parentX, - dy: textLineHeight || 16 - }); - textNode.appendChild(tspan); - - if (actualWidth > width) { // a single word is pressing it out - width = actualWidth; - } - } - } else { // append to existing line tspan - tspan.removeChild(tspan.firstChild); - rest.unshift(words.pop()); - } - - tspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-'))); - } - - } - } - }); - }); - - - }, - - /** - * Make a straight line crisper by not spilling out to neighbour pixels - * @param {Array} points - * @param {Number} width - */ - crispLine: function(points, width) { - // points format: [M, 0, 0, L, 100, 0] - // normalize to a crisp line - if (points[1] == points[4]) { - points[1] = points[4] = mathRound(points[1]) + (width % 2 / 2); - } - if (points[2] == points[5]) { - points[2] = points[5] = mathRound(points[2]) + (width % 2 / 2); - } - return points; - }, - - - /** - * Draw a path - * @param {Array} path An SVG path in array form - */ - path: function (path) { - return this.createElement('path').attr({ - d: path, - fill: NONE - }); - }, - - /** - * Draw and return an SVG circle - * @param {Number} x The x position - * @param {Number} y The y position - * @param {Number} r The radius - */ - circle: function (x, y, r) { - var attr = isObject(x) ? - x : - { - x: x, - y: y, - r: r - }; - - return this.createElement('circle').attr(attr); - }, - - /** - * Draw and return an arc - * @param {Number} x X position - * @param {Number} y Y position - * @param {Number} r Radius - * @param {Number} innerR Inner radius like used in donut charts - * @param {Number} start Starting angle - * @param {Number} end Ending angle - */ - arc: function (x, y, r, innerR, start, end) { - // arcs are defined as symbols for the ability to set - // attributes in attr and animate - - if (isObject(x)) { - y = x.y; - r = x.r; - innerR = x.innerR; - start = x.start; - end = x.end; - x = x.x; - } - - return this.symbol('arc', x || 0, y || 0, r || 0, { - innerR: innerR || 0, - start: start || 0, - end: end || 0 - }); - }, - - /** - * Draw and return a rectangle - * @param {Number} x Left position - * @param {Number} y Top position - * @param {Number} width - * @param {Number} height - * @param {Number} r Border corner radius - * @param {Number} strokeWidth A stroke width can be supplied to allow crisp drawing - */ - rect: function (x, y, width, height, r, strokeWidth) { - if (isObject(x)) { - y = x.y; - width = x.width; - height = x.height; - r = x.r; - x = x.x; - } - var wrapper = this.createElement('rect').attr({ - rx: r, - ry: r, - fill: NONE - }); - - return wrapper.attr(wrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0))); - }, - - /** - * Resize the box and re-align all aligned elements - * @param {Object} width - * @param {Object} height - * @param {Boolean} animate - * - */ - setSize: function(width, height, animate) { - var renderer = this, - alignedObjects = renderer.alignedObjects, - i = alignedObjects.length; - - renderer.width = width; - renderer.height = height; - - renderer.boxWrapper[pick(animate, true) ? 'animate' : 'attr']({ - width: width, - height: height - }); - - while (i--) { - alignedObjects[i].align(); - } - }, - - /** - * Create a group - * @param {String} name The group will be given a class name of 'highcharts-{name}'. - * This can be used for styling and scripting. - */ - g: function(name) { - return this.createElement('g').attr( - defined(name) && { 'class': PREFIX + name } - ); - }, - - /** - * Display an image - * @param {String} src - * @param {Number} x - * @param {Number} y - * @param {Number} width - * @param {Number} height - */ - image: function(src, x, y, width, height) { - var attribs = { - preserveAspectRatio: NONE - }, - elemWrapper; - - // optional properties - if (arguments.length > 1) { - extend(attribs, { - x: x, - y: y, - width: width, - height: height - }); - } - - elemWrapper = this.createElement('image').attr(attribs); - - // set the href in the xlink namespace - elemWrapper.element.setAttributeNS('http://www.w3.org/1999/xlink', - 'href', src); - - return elemWrapper; - }, - - /** - * Draw a symbol out of pre-defined shape paths from the namespace 'symbol' object. - * - * @param {Object} symbol - * @param {Object} x - * @param {Object} y - * @param {Object} radius - * @param {Object} options - */ - symbol: function(symbol, x, y, radius, options) { - - var obj, - - // get the symbol definition function - symbolFn = this.symbols[symbol], - - // check if there's a path defined for this symbol - path = symbolFn && symbolFn( - x, - y, - radius, - options - ), - - imageRegex = /^url\((.*?)\)$/, - imageSrc; - - if (path) { - - obj = this.path(path); - // expando properties for use in animate and attr - extend(obj, { - symbolName: symbol, - x: x, - y: y, - r: radius - }); - if (options) { - extend(obj, options); - } - - - // image symbols - } else if (imageRegex.test(symbol)) { - - imageSrc = symbol.match(imageRegex)[1]; - - // create the image synchronously, add attribs async - obj = this.image(imageSrc) - .attr({ - x: x, - y: y - }); - - // create a dummy JavaScript image to get the width and height - createElement('img', { - onload: function() { - var img = this, - size = symbolSizes[img.src] || [img.width, img.height]; - obj.attr({ - width: size[0], - height: size[1] - }).translate( - -mathRound(size[0] / 2), - -mathRound(size[1] / 2) - ); - }, - src: imageSrc - }); - - // default circles - } else { - obj = this.circle(x, y, radius); - } - - return obj; - }, - - /** - * An extendable collection of functions for defining symbol paths. - */ - symbols: { - 'square': function (x, y, radius) { - var len = 0.707 * radius; - return [ - M, x-len, y-len, - L, x+len, y-len, - x+len, y+len, - x-len, y+len, - 'Z' - ]; - }, - - 'triangle': function (x, y, radius) { - return [ - M, x, y-1.33 * radius, - L, x+radius, y + 0.67 * radius, - x-radius, y + 0.67 * radius, - 'Z' - ]; - }, - - 'triangle-down': function (x, y, radius) { - return [ - M, x, y + 1.33 * radius, - L, x-radius, y-0.67 * radius, - x+radius, y-0.67 * radius, - 'Z' - ]; - }, - 'diamond': function (x, y, radius) { - return [ - M, x, y-radius, - L, x+radius, y, - x, y+radius, - x-radius, y, - 'Z' - ]; - }, - 'arc': function (x, y, radius, options) { - var start = options.start, - end = options.end - 0.000001, // to prevent cos and sin of start and end from becoming equal on 360 arcs - innerRadius = options.innerR, - cosStart = mathCos(start), - sinStart = mathSin(start), - cosEnd = mathCos(end), - sinEnd = mathSin(end), - longArc = options.end - start < mathPI ? 0 : 1; - - return [ - M, - x + radius * cosStart, - y + radius * sinStart, - 'A', // arcTo - radius, // x radius - radius, // y radius - 0, // slanting - longArc, // long or short arc - 1, // clockwise - x + radius * cosEnd, - y + radius * sinEnd, - L, - x + innerRadius * cosEnd, - y + innerRadius * sinEnd, - 'A', // arcTo - innerRadius, // x radius - innerRadius, // y radius - 0, // slanting - longArc, // long or short arc - 0, // clockwise - x + innerRadius * cosStart, - y + innerRadius * sinStart, - - 'Z' // close - ]; - } - }, - - /** - * Define a clipping rectangle - * @param {String} id - * @param {Number} x - * @param {Number} y - * @param {Number} width - * @param {Number} height - */ - clipRect: function (x, y, width, height) { - var wrapper, - id = PREFIX + idCounter++, - - clipPath = this.createElement('clipPath').attr({ - id: id - }).add(this.defs); - - wrapper = this.rect(x, y, width, height, 0).add(clipPath); - wrapper.id = id; - - return wrapper; - }, - - - /** - * Take a color and return it if it's a string, make it a gradient if it's a - * gradient configuration object - * - * @param {Object} color The color or config object - */ - color: function(color, elem, prop) { - var colorObject, - regexRgba = /^rgba/; - if (color && color.linearGradient) { - var renderer = this, - strLinearGradient = 'linearGradient', - linearGradient = color[strLinearGradient], - id = PREFIX + idCounter++, - gradientObject, - stopColor, - stopOpacity; - gradientObject = renderer.createElement(strLinearGradient).attr({ - id: id, - gradientUnits: 'userSpaceOnUse', - x1: linearGradient[0], - y1: linearGradient[1], - x2: linearGradient[2], - y2: linearGradient[3] - }).add(renderer.defs); - - each(color.stops, function(stop) { - if (regexRgba.test(stop[1])) { - colorObject = Color(stop[1]); - stopColor = colorObject.get('rgb'); - stopOpacity = colorObject.get('a'); - } else { - stopColor = stop[1]; - stopOpacity = 1; - } - renderer.createElement('stop').attr({ - offset: stop[0], - 'stop-color': stopColor, - 'stop-opacity': stopOpacity - }).add(gradientObject); - }); - - return 'url('+ this.url +'#'+ id +')'; - - // Webkit and Batik can't show rgba. - } else if (regexRgba.test(color)) { - colorObject = Color(color); - attr(elem, prop +'-opacity', colorObject.get('a')); - - return colorObject.get('rgb'); - - - } else { - return color; - } - - }, - - - /** - * Add text to the SVG object - * @param {String} str - * @param {Number} x Left position - * @param {Number} y Top position - */ - text: function(str, x, y) { - - // declare variables - var defaultChartStyle = defaultOptions.chart.style, - wrapper; - - x = mathRound(pick(x, 0)); - y = mathRound(pick(y, 0)); - - wrapper = this.createElement('text') - .attr({ - x: x, - y: y, - text: str - }) - .css({ - 'font-family': defaultChartStyle.fontFamily, - 'font-size': defaultChartStyle.fontSize - }); - - wrapper.x = x; - wrapper.y = y; - return wrapper; - } -}; // end SVGRenderer - - - - -/* **************************************************************************** - * * - * START OF INTERNET EXPLORER <= 8 SPECIFIC CODE * - * * - * For applications and websites that don't need IE support, like platform * - * targeted mobile apps and web apps, this code can be removed. * - * * - *****************************************************************************/ -var VMLRenderer; -if (!hasSVG) { - -/** - * The VML element wrapper. - */ -var VMLElement = extendClass( SVGElement, { - - /** - * Initialize a new VML element wrapper. It builds the markup as a string - * to minimize DOM traffic. - * @param {Object} renderer - * @param {Object} nodeName - */ - init: function(renderer, nodeName) { - var markup = ['<', nodeName, ' filled="f" stroked="f"'], - style = ['position: ', ABSOLUTE, ';']; - - // divs and shapes need size - if (nodeName == 'shape' || nodeName == DIV) { - style.push('left:0;top:0;width:10px;height:10px;'); - } - if (docMode8) { - style.push('visibility: ', nodeName == DIV ? HIDDEN : VISIBLE); - } - - markup.push(' style="', style.join(''), '"/>'); - - // create element with default attributes and style - if (nodeName) { - markup = nodeName == DIV || nodeName == 'span' || nodeName == 'img' ? - markup.join('') - : renderer.prepVML(markup); - this.element = createElement(markup); - } - - this.renderer = renderer; - }, - - /** - * Add the node to the given parent - * @param {Object} parent - */ - add: function(parent) { - var wrapper = this, - renderer = wrapper.renderer, - element = wrapper.element, - box = renderer.box, - inverted = parent && parent.inverted, - - // get the parent node - parentNode = parent ? - parent.element || parent : - box; - - - // if the parent group is inverted, apply inversion on all children - if (inverted) { // only on groups - renderer.invertChild(element, parentNode); - } - - // issue #140 workaround - related to #61 and #74 - if (docMode8 && parentNode.gVis == HIDDEN) { - css(element, { visibility: HIDDEN }); - } - - // append it - parentNode.appendChild(element); - - // align text after adding to be able to read offset - wrapper.added = true; - if (wrapper.alignOnAdd) { - wrapper.updateTransform(); - } - - return wrapper; - }, - - /** - * Get or set attributes - */ - attr: function(hash, val) { - var key, - value, - i, - element = this.element || {}, - elemStyle = element.style, - nodeName = element.nodeName, - renderer = this.renderer, - symbolName = this.symbolName, - childNodes, - hasSetSymbolSize, - shadows = this.shadows, - skipAttr, - ret = this; - - // single key-value pair - if (isString(hash) && defined(val)) { - key = hash; - hash = {}; - hash[key] = val; - } - - // used as a getter, val is undefined - if (isString(hash)) { - key = hash; - if (key == 'strokeWidth' || key == 'stroke-width') { - ret = this.strokeweight; - } else { - ret = this[key]; - } - - // setter - } else { - for (key in hash) { - value = hash[key]; - skipAttr = false; - - // prepare paths - // symbols - if (symbolName && /^(x|y|r|start|end|width|height|innerR)/.test(key)) { - // if one of the symbol size affecting parameters are changed, - // check all the others only once for each call to an element's - // .attr() method - if (!hasSetSymbolSize) { - - this.symbolAttr(hash); - - hasSetSymbolSize = true; - } - - skipAttr = true; - - } else if (key == 'd') { - value = value || []; - this.d = value.join(' '); // used in getter for animation - - // convert paths - i = value.length; - var convertedPath = []; - while (i--) { - - // Multiply by 10 to allow subpixel precision. - // Substracting half a pixel seems to make the coordinates - // align with SVG, but this hasn't been tested thoroughly - if (isNumber(value[i])) { - convertedPath[i] = mathRound(value[i] * 10) - 5; - } - // close the path - else if (value[i] == 'Z') { - convertedPath[i] = 'x'; - } - else { - convertedPath[i] = value[i]; - } - - } - value = convertedPath.join(' ') || 'x'; - element.path = value; - - // update shadows - if (shadows) { - i = shadows.length; - while (i--) { - shadows[i].path = value; - } - } - skipAttr = true; - - // directly mapped to css - } else if (key == 'zIndex' || key == 'visibility') { - - // issue 61 workaround - if (docMode8 && key == 'visibility' && nodeName == 'DIV') { - element.gVis = value; - childNodes = element.childNodes; - i = childNodes.length; - while (i--) { - css(childNodes[i], { visibility: value }); - } - if (value == VISIBLE) { // issue 74 - value = null; - } - } - - if (value) { - elemStyle[key] = value; - } - - - - skipAttr = true; - - // width and height - } else if (/^(width|height)$/.test(key)) { - - - // clipping rectangle special - if (this.updateClipping) { - this[key] = value; - this.updateClipping(); - - } else { - // normal - elemStyle[key] = value; - } - - skipAttr = true; - - // x and y - } else if (/^(x|y)$/.test(key)) { - - this[key] = value; // used in getter - - if (element.tagName == 'SPAN') { - this.updateTransform(); - - } else { - elemStyle[{ x: 'left', y: 'top' }[key]] = value; - } - - // class name - } else if (key == 'class') { - // IE8 Standards mode has problems retrieving the className - element.className = value; - - // stroke - } else if (key == 'stroke') { - - value = renderer.color(value, element, key); - - key = 'strokecolor'; - - // stroke width - } else if (key == 'stroke-width' || key == 'strokeWidth') { - element.stroked = value ? true : false; - key = 'strokeweight'; - this[key] = value; // used in getter, issue #113 - if (isNumber(value)) { - value += PX; - } - - // dashStyle - } else if (key == 'dashstyle') { - var strokeElem = element.getElementsByTagName('stroke')[0] || - createElement(renderer.prepVML(['']), null, null, element); - strokeElem[key] = value || 'solid'; - this.dashstyle = value; /* because changing stroke-width will change the dash length - and cause an epileptic effect */ - skipAttr = true; - - // fill - } else if (key == 'fill') { - - if (nodeName == 'SPAN') { // text color - elemStyle.color = value; - } else { - element.filled = value != NONE ? true : false; - - value = renderer.color(value, element, key); - - key = 'fillcolor'; - } - - // translation for animation - } else if (key == 'translateX' || key == 'translateY' || key == 'rotation' || key == 'align') { - if (key == 'align') { - key = 'textAlign'; - } - this[key] = value; - this.updateTransform(); - - skipAttr = true; - } - - // text for rotated and non-rotated elements - else if (key == 'text') { - element.innerHTML = value; - skipAttr = true; - } - - - // let the shadow follow the main element - if (shadows && key == 'visibility') { - i = shadows.length; - while (i--) { - shadows[i].style[key] = value; - } - } - - - - if (!skipAttr) { - if (docMode8) { // IE8 setAttribute bug - element[key] = value; - } else { - attr(element, key, value); - } - } - } - } - return ret; - }, - - /** - * Set the element's clipping to a predefined rectangle - * - * @param {String} id The id of the clip rectangle - */ - clip: function(clipRect) { - var wrapper = this, - clipMembers = clipRect.members; - - clipMembers.push(wrapper); - wrapper.destroyClip = function() { - erase(clipMembers, wrapper); - }; - return wrapper.css(clipRect.getCSS(wrapper.inverted)); - }, - - /** - * Set styles for the element - * @param {Object} styles - */ - css: function(styles) { - var wrapper = this, - element = wrapper.element, - textWidth = styles && element.tagName == 'SPAN' && styles.width; - - /*if (textWidth) { - extend(styles, { - display: 'block', - whiteSpace: 'normal' - }); - }*/ - if (textWidth) { - delete styles.width; - wrapper.textWidth = textWidth; - wrapper.updateTransform(); - } - - wrapper.styles = extend(wrapper.styles, styles); - css(wrapper.element, styles); - - - - return wrapper; - }, - - /** - * Extend element.destroy by removing it from the clip members array - */ - destroy: function() { - var wrapper = this; - - if (wrapper.destroyClip) { - wrapper.destroyClip(); - } - - SVGElement.prototype.destroy.apply(wrapper); - }, - - /** - * Remove all child nodes of a group, except the v:group element - */ - empty: function() { - var element = this.element, - childNodes = element.childNodes, - i = childNodes.length, - node; - - while (i--) { - node = childNodes[i]; - node.parentNode.removeChild(node); - } - }, - - /** - * VML override for calculating the bounding box based on offsets - * - * @return {Object} A hash containing values for x, y, width and height - */ - - getBBox: function() { - var element = this.element; - - // faking getBBox in exported SVG in legacy IE - if (element.nodeName == 'text') { - element.style.position = ABSOLUTE; - } - - return { - x: element.offsetLeft, - y: element.offsetTop, - width: element.offsetWidth, - height: element.offsetHeight - }; - - }, - - /** - * Add an event listener. VML override for normalizing event parameters. - * @param {String} eventType - * @param {Function} handler - */ - on: function(eventType, handler) { - // simplest possible event model for internal use - this.element['on'+ eventType] = function() { - var evt = win.event; - evt.target = evt.srcElement; - handler(evt); - }; - return this; - }, - - - /** - * VML override private method to update elements based on internal - * properties based on SVG transform - */ - updateTransform: function(hash) { - // aligning non added elements is expensive - if (!this.added) { - this.alignOnAdd = true; - return; - } - - var wrapper = this, - elem = wrapper.element, - translateX = wrapper.translateX || 0, - translateY = wrapper.translateY || 0, - x = wrapper.x || 0, - y = wrapper.y || 0, - align = wrapper.textAlign || 'left', - alignCorrection = { left: 0, center: 0.5, right: 1 }[align], - nonLeft = align && align != 'left'; - - // apply translate - if (translateX || translateY) { - wrapper.css({ - marginLeft: translateX, - marginTop: translateY - }); - } - - // apply inversion - if (wrapper.inverted) { // wrapper is a group - each(elem.childNodes, function(child) { - wrapper.renderer.invertChild(child, elem); - }); - } - - if (elem.tagName == 'SPAN') { - - var width, height, - rotation = wrapper.rotation, - lineHeight, - radians = 0, - costheta = 1, - sintheta = 0, - quad, - textWidth = pInt(wrapper.textWidth), - xCorr = wrapper.xCorr || 0, - yCorr = wrapper.yCorr || 0, - currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth].join(','); - - if (currentTextTransform != wrapper.cTT) { // do the calculations and DOM access only if properties changed - - if (defined(rotation)) { - radians = rotation * deg2rad; // deg to rad - costheta = mathCos(radians); - sintheta = mathSin(radians); - - // Adjust for alignment and rotation. - // Test case: http://highcharts.com/tests/?file=text-rotation - css(elem, { - filter: rotation ? ['progid:DXImageTransform.Microsoft.Matrix(M11=', costheta, - ', M12=', -sintheta, ', M21=', sintheta, ', M22=', costheta, - ', sizingMethod=\'auto expand\')'].join('') : NONE - }); - } - - width = elem.offsetWidth; - height = elem.offsetHeight; - - // update textWidth - if (width > textWidth) { - css(elem, { - width: textWidth +PX, - display: 'block', - whiteSpace: 'normal' - }); - width = textWidth; - } - - // correct x and y - lineHeight = mathRound(pInt(elem.style.fontSize || 12) * 1.2); - xCorr = costheta < 0 && -width; - yCorr = sintheta < 0 && -height; - - // correct for lineHeight and corners spilling out after rotation - quad = costheta * sintheta < 0; - xCorr += sintheta * lineHeight * (quad ? 1 - alignCorrection : alignCorrection); - yCorr -= costheta * lineHeight * (rotation ? (quad ? alignCorrection : 1 - alignCorrection) : 1); - - // correct for the length/height of the text - if (nonLeft) { - xCorr -= width * alignCorrection * (costheta < 0 ? -1 : 1); - if (rotation) { - yCorr -= height * alignCorrection * (sintheta < 0 ? -1 : 1); - } - css(elem, { - textAlign: align - }); - } - - // record correction - wrapper.xCorr = xCorr; - wrapper.yCorr = yCorr; - } - - // apply position with correction - css(elem, { - left: x + xCorr, - top: y + yCorr - }); - - // record current text transform - wrapper.cTT = currentTextTransform; - } - }, - - /** - * Apply a drop shadow by copying elements and giving them different strokes - * @param {Boolean} apply - */ - shadow: function(apply) { - var shadows = [], - i, - element = this.element, - renderer = this.renderer, - shadow, - elemStyle = element.style, - markup, - path = element.path; - - // the path is some mysterious string-like object that can be cast to a string - if (''+ element.path === '') { - path = 'x'; - } - - if (apply) { - for (i = 1; i <= 3; i++) { - markup = ['']; - shadow = createElement(renderer.prepVML(markup), - null, { - left: pInt(elemStyle.left) + 1, - top: pInt(elemStyle.top) + 1 - } - ); - - // apply the opacity - markup = ['']; - createElement(renderer.prepVML(markup), null, null, shadow); - - - // insert it - element.parentNode.insertBefore(shadow, element); - - // record it - shadows.push(shadow); - - } - - this.shadows = shadows; - } - return this; - - } -}); - -/** - * The VML renderer - */ -VMLRenderer = function() { - this.init.apply(this, arguments); -}; -VMLRenderer.prototype = merge( SVGRenderer.prototype, { // inherit SVGRenderer - - isIE8: userAgent.indexOf('MSIE 8.0') > -1, - - - /** - * Initialize the VMLRenderer - * @param {Object} container - * @param {Number} width - * @param {Number} height - */ - init: function(container, width, height) { - var renderer = this, - boxWrapper; - - renderer.Element = VMLElement; - renderer.alignedObjects = []; - - boxWrapper = renderer.createElement(DIV); - container.appendChild(boxWrapper.element); - - - // generate the containing box - renderer.box = boxWrapper.element; - renderer.boxWrapper = boxWrapper; - - - renderer.setSize(width, height, false); - - // The only way to make IE6 and IE7 print is to use a global namespace. However, - // with IE8 the only way to make the dynamic shapes visible in screen and print mode - // seems to be to add the xmlns attribute and the behaviour style inline. - if (!doc.namespaces.hcv) { - - doc.namespaces.add('hcv', 'urn:schemas-microsoft-com:vml'); - - // setup default css - doc.createStyleSheet().cssText = - 'hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke'+ - '{ behavior:url(#default#VML); display: inline-block; } '; - - } - }, - - /** - * Define a clipping rectangle. In VML it is accomplished by storing the values - * for setting the CSS style to all associated members. - * - * @param {Number} x - * @param {Number} y - * @param {Number} width - * @param {Number} height - */ - clipRect: function (x, y, width, height) { - - // create a dummy element - var clipRect = this.createElement(); - - // mimic a rectangle with its style object for automatic updating in attr - return extend(clipRect, { - members: [], - left: x, - top: y, - width: width, - height: height, - getCSS: function(inverted) { - var rect = this,//clipRect.element.style, - top = rect.top, - left = rect.left, - right = left + rect.width, - bottom = top + rect.height, - ret = { - clip: 'rect('+ - mathRound(inverted ? left : top) + 'px,'+ - mathRound(inverted ? bottom : right) + 'px,'+ - mathRound(inverted ? right : bottom) + 'px,'+ - mathRound(inverted ? top : left) +'px)' - }; - - // issue 74 workaround - if (!inverted && docMode8) { - extend(ret, { - width: right +PX, - height: bottom +PX - }); - } - return ret; - }, - - // used in attr and animation to update the clipping of all members - updateClipping: function() { - each(clipRect.members, function(member) { - member.css(clipRect.getCSS(member.inverted)); - }); - } - }); - - }, - - - /** - * Take a color and return it if it's a string, make it a gradient if it's a - * gradient configuration object, and apply opacity. - * - * @param {Object} color The color or config object - */ - color: function(color, elem, prop) { - var colorObject, - regexRgba = /^rgba/, - markup; - - if (color && color.linearGradient) { - - var stopColor, - stopOpacity, - linearGradient = color.linearGradient, - angle, - color1, - opacity1, - color2, - opacity2; - - each(color.stops, function(stop, i) { - if (regexRgba.test(stop[1])) { - colorObject = Color(stop[1]); - stopColor = colorObject.get('rgb'); - stopOpacity = colorObject.get('a'); - } else { - stopColor = stop[1]; - stopOpacity = 1; - } - - if (!i) { // first - color1 = stopColor; - opacity1 = stopOpacity; - } else { - color2 = stopColor; - opacity2 = stopOpacity; - } - }); - - - - // calculate the angle based on the linear vector - angle = 90 - math.atan( - (linearGradient[3] - linearGradient[1]) / // y vector - (linearGradient[2] - linearGradient[0]) // x vector - ) * 180 / mathPI; - - // when colors attribute is used, the meanings of opacity and o:opacity2 - // are reversed. - markup = ['<', prop, ' colors="0% ', color1, ',100% ', color2, '" angle="', angle, - '" opacity="', opacity2, '" o:opacity2="', opacity1, - '" type="gradient" focus="100%" />']; - createElement(this.prepVML(markup), null, null, elem); - - - - // if the color is an rgba color, split it and add a fill node - // to hold the opacity component - } else if (regexRgba.test(color) && elem.tagName != 'IMG') { - - colorObject = Color(color); - - markup = ['<', prop, ' opacity="', colorObject.get('a'), '"/>']; - createElement(this.prepVML(markup), null, null, elem); - - return colorObject.get('rgb'); - - - } else { - return color; - } - - }, - - /** - * Take a VML string and prepare it for either IE8 or IE6/IE7. - * @param {Array} markup A string array of the VML markup to prepare - */ - prepVML: function(markup) { - var vmlStyle = 'display:inline-block;behavior:url(#default#VML);', - isIE8 = this.isIE8; - - markup = markup.join(''); - - if (isIE8) { // add xmlns and style inline - markup = markup.replace('/>', ' xmlns="urn:schemas-microsoft-com:vml" />'); - if (markup.indexOf('style="') == -1) { - markup = markup.replace('/>', ' style="'+ vmlStyle +'" />'); - } else { - markup = markup.replace('style="', 'style="'+ vmlStyle); - } - - } else { // add namespace - markup = markup.replace('<', ' 1) { - obj.css({ - left: x, - top: y, - width: width, - height: height - }); - } - return obj; - }, - - /** - * VML uses a shape for rect to overcome bugs and rotation problems - */ - rect: function(x, y, width, height, r, strokeWidth) { - - if (isObject(x)) { - y = x.y; - width = x.width; - height = x.height; - r = x.r; - x = x.x; - } - var wrapper = this.symbol('rect'); - wrapper.r = r; - - return wrapper.attr(wrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0))); - }, - - /** - * In the VML renderer, each child of an inverted div (group) is inverted - * @param {Object} element - * @param {Object} parentNode - */ - invertChild: function(element, parentNode) { - var parentStyle = parentNode.style; - - css(element, { - flip: 'x', - left: pInt(parentStyle.width) - 10, - top: pInt(parentStyle.height) - 10, - rotation: -90 - }); - }, - - /** - * Symbol definitions that override the parent SVG renderer's symbols - * - */ - symbols: { - // VML specific arc function - arc: function (x, y, radius, options) { - var start = options.start, - end = options.end, - cosStart = mathCos(start), - sinStart = mathSin(start), - cosEnd = mathCos(end), - sinEnd = mathSin(end), - innerRadius = options.innerR, - circleCorrection = 0.07 / radius, - innerCorrection = innerRadius && 0.1 / innerRadius || 0; - - if (end - start === 0) { // no angle, don't show it. - return ['x']; - - //} else if (end - start == 2 * mathPI) { // full circle - } else if (2 * mathPI - end + start < circleCorrection) { // full circle - // empirical correction found by trying out the limits for different radii - cosEnd = - circleCorrection; - } else if (end - start < innerCorrection) { // issue #186, another mysterious VML arc problem - cosEnd = mathCos(start + innerCorrection); - } - - return [ - 'wa', // clockwise arc to - x - radius, // left - y - radius, // top - x + radius, // right - y + radius, // bottom - x + radius * cosStart, // start x - y + radius * sinStart, // start y - x + radius * cosEnd, // end x - y + radius * sinEnd, // end y - - - 'at', // anti clockwise arc to - x - innerRadius, // left - y - innerRadius, // top - x + innerRadius, // right - y + innerRadius, // bottom - x + innerRadius * cosEnd, // start x - y + innerRadius * sinEnd, // start y - x + innerRadius * cosStart, // end x - y + innerRadius * sinStart, // end y - - 'x', // finish path - 'e' // close - ]; - - }, - // Add circle symbol path. This performs significantly faster than v:oval. - circle: function (x, y, r) { - return [ - 'wa', // clockwisearcto - x - r, // left - y - r, // top - x + r, // right - y + r, // bottom - x + r, // start x - y, // start y - x + r, // end x - y, // end y - //'x', // finish path - 'e' // close - ]; - }, - /** - * Add rectangle symbol path which eases rotation and omits arcsize problems - * compared to the built-in VML roundrect shape - * - * @param {Number} left Left position - * @param {Number} top Top position - * @param {Number} r Border radius - * @param {Object} options Width and height - */ - - rect: function (left, top, r, options) { - if (!defined(options)) { - return []; - } - var width = options.width, - height = options.height, - right = left + width, - bottom = top + height; - - r = mathMin(r, width, height); - - return [ - M, - left + r, top, - - L, - right - r, top, - 'wa', - right - 2 * r, top, - right, top + 2 * r, - right - r, top, - right, top + r, - - L, - right, bottom - r, - 'wa', - right - 2 * r, bottom - 2 * r, - right, bottom, - right, bottom - r, - right - r, bottom, - - L, - left + r, bottom, - 'wa', - left, bottom - 2 * r, - left + 2 * r, bottom, - left + r, bottom, - left, bottom - r, - - L, - left, top + r, - 'wa', - left, top, - left + 2 * r, top + 2 * r, - left, top + r, - left + r, top, - - - 'x', - 'e' - ]; - - } - } -}); -} -/* **************************************************************************** - * * - * END OF INTERNET EXPLORER <= 8 SPECIFIC CODE * - * * - *****************************************************************************/ - -/** - * General renderer - */ -var Renderer = hasSVG ? SVGRenderer : VMLRenderer; - - -/** - * The chart class - * @param {Object} options - * @param {Function} callback Function to run when the chart has loaded - */ -function Chart (options, callback) { - - defaultXAxisOptions = merge(defaultXAxisOptions, defaultOptions.xAxis); - defaultYAxisOptions = merge(defaultYAxisOptions, defaultOptions.yAxis); - defaultOptions.xAxis = defaultOptions.yAxis = null; - - // Handle regular options - options = merge(defaultOptions, options); - - // Define chart variables - var optionsChart = options.chart, - optionsMargin = optionsChart.margin, - margin = isObject(optionsMargin) ? - optionsMargin : - [optionsMargin, optionsMargin, optionsMargin, optionsMargin], - optionsMarginTop = pick(optionsChart.marginTop, margin[0]), - optionsMarginRight = pick(optionsChart.marginRight, margin[1]), - optionsMarginBottom = pick(optionsChart.marginBottom, margin[2]), - optionsMarginLeft = pick(optionsChart.marginLeft, margin[3]), - spacingTop = optionsChart.spacingTop, - spacingRight = optionsChart.spacingRight, - spacingBottom = optionsChart.spacingBottom, - spacingLeft = optionsChart.spacingLeft, - spacingBox, - chartTitleOptions, - chartSubtitleOptions, - plotTop, - marginRight, - marginBottom, - plotLeft, - axisOffset, - renderTo, - renderToClone, - container, - containerId, - containerWidth, - containerHeight, - chartWidth, - chartHeight, - oldChartWidth, - oldChartHeight, - chartBackground, - plotBackground, - plotBGImage, - plotBorder, - chart = this, - chartEvents = optionsChart.events, - runChartClick = chartEvents && !!chartEvents.click, - eventType, - isInsidePlot, // function - tooltip, - mouseIsDown, - loadingDiv, - loadingSpan, - loadingShown, - plotHeight, - plotWidth, - tracker, - trackerGroup, - placeTrackerGroup, - legend, - legendWidth, - legendHeight, - chartPosition,// = getPosition(container), - hasCartesianSeries = optionsChart.showAxes, - isResizing = 0, - axes = [], - maxTicks, // handle the greatest amount of ticks on grouped axes - series = [], - inverted, - renderer, - tooltipTick, - tooltipInterval, - hoverX, - drawChartBox, // function - getMargins, // function - resetMargins, // function - setChartSize, // function - resize, - zoom, // function - zoomOut; // function - - - /** - * Create a new axis object - * @param {Object} chart - * @param {Object} options - */ - function Axis (chart, options) { - - // Define variables - var isXAxis = options.isX, - opposite = options.opposite, // needed in setOptions - horiz = inverted ? !isXAxis : isXAxis, - side = horiz ? - (opposite ? 0 /* top */ : 2 /* bottom */) : - (opposite ? 1 /* right*/ : 3 /* left */ ), - stacks = {}; - - - options = merge( - isXAxis ? defaultXAxisOptions : defaultYAxisOptions, - [defaultTopAxisOptions, defaultRightAxisOptions, - defaultBottomAxisOptions, defaultLeftAxisOptions][side], - options - ); - - var axis = this, - isDatetimeAxis = options.type == 'datetime', - offset = options.offset || 0, - xOrY = isXAxis ? 'x' : 'y', - axisLength, - transA, // translation factor - oldTransA, // used for prerendering - transB = horiz ? plotLeft : marginBottom, // translation addend - translate, // fn - getPlotLinePath, // fn - axisGroup, - gridGroup, - axisLine, - dataMin, - dataMax, - associatedSeries, - userSetMin, - userSetMax, - max = null, - min = null, - oldMin, - oldMax, - minPadding = options.minPadding, - maxPadding = options.maxPadding, - isLinked = defined(options.linkedTo), - ignoreMinPadding, // can be set to true by a column or bar series - ignoreMaxPadding, - usePercentage, - events = options.events, - eventType, - plotLinesAndBands = [], - tickInterval, - minorTickInterval, - magnitude, - tickPositions, // array containing predefined positions - ticks = {}, - minorTicks = {}, - alternateBands = {}, - tickAmount, - labelOffset, - axisTitleMargin,// = options.title.margin, - dateTimeLabelFormat, - categories = options.categories, - labelFormatter = options.labels.formatter || // can be overwritten by dynamic format - function() { - var value = this.value, - ret; - - if (dateTimeLabelFormat) { // datetime axis - ret = dateFormat(dateTimeLabelFormat, value); - - } else if (tickInterval % 1000000 === 0) { // use M abbreviation - ret = (value / 1000000) +'M'; - - } else if (tickInterval % 1000 === 0) { // use k abbreviation - ret = (value / 1000) +'k'; - - } else if (!categories && value >= 1000) { // add thousands separators - ret = numberFormat(value, 0); - - } else { // strings (categories) and small numbers - ret = value; - } - return ret; - }, - - staggerLines = horiz && options.labels.staggerLines, - reversed = options.reversed, - tickmarkOffset = (categories && options.tickmarkPlacement == 'between') ? 0.5 : 0; - - /** - * The Tick class - */ - function Tick(pos, minor) { - var tick = this; - tick.pos = pos; - tick.minor = minor; - tick.isNew = true; - - if (!minor) { - tick.addLabel(); - } - } - Tick.prototype = { - /** - * Write the tick label - */ - addLabel: function() { - var pos = this.pos, - labelOptions = options.labels, - str, - withLabel = !((pos == min && !pick(options.showFirstLabel, 1)) || - (pos == max && !pick(options.showLastLabel, 0))), - width = categories && horiz && categories.length && - !labelOptions.step && !labelOptions.staggerLines && - !labelOptions.rotation && - plotWidth / categories.length || - !horiz && plotWidth / 2, - css, - label = this.label; - - - // get the string - str = labelFormatter.call({ - isFirst: pos == tickPositions[0], - isLast: pos == tickPositions[tickPositions.length - 1], - dateTimeLabelFormat: dateTimeLabelFormat, - value: (categories && categories[pos] ? categories[pos] : pos) - }); - - // prepare CSS - css = width && { width: (width - 2 * (labelOptions.padding || 10)) +PX }; - css = extend(css, labelOptions.style); - - // first call - if (label === UNDEFINED) { - this.label = - defined(str) && withLabel && labelOptions.enabled ? - renderer.text( - str, - 0, - 0 - ) - .attr({ - align: labelOptions.align, - rotation: labelOptions.rotation - }) - // without position absolute, IE export sometimes is wrong - .css(css) - .add(axisGroup): - null; - - // update - } else if (label) { - label.attr({ text: str }) - .css(css); - } - }, - /** - * Get the offset height or width of the label - */ - getLabelSize: function() { - var label = this.label; - return label ? - ((this.labelBBox = label.getBBox()))[horiz ? 'height' : 'width'] : - 0; - }, - /** - * Put everything in place - * - * @param index {Number} - * @param old {Boolean} Use old coordinates to prepare an animation into new position - */ - render: function(index, old) { - var tick = this, - major = !tick.minor, - label = tick.label, - pos = tick.pos, - labelOptions = options.labels, - gridLine = tick.gridLine, - gridLineWidth = major ? options.gridLineWidth : options.minorGridLineWidth, - gridLineColor = major ? options.gridLineColor : options.minorGridLineColor, - dashStyle = major ? - options.gridLineDashStyle : - options.minorGridLineDashStyle, - gridLinePath, - mark = tick.mark, - markPath, - tickLength = major ? options.tickLength : options.minorTickLength, - tickWidth = major ? options.tickWidth : (options.minorTickWidth || 0), - tickColor = major ? options.tickColor : options.minorTickColor, - tickPosition = major ? options.tickPosition : options.minorTickPosition, - step = labelOptions.step, - cHeight = old && oldChartHeight || chartHeight, - attribs, - x, - y; - - // get x and y position for ticks and labels - x = horiz ? - translate(pos + tickmarkOffset, null, null, old) + transB : - plotLeft + offset + (opposite ? (old && oldChartWidth || chartWidth) - marginRight - plotLeft : 0); - - y = horiz ? - cHeight - marginBottom + offset - (opposite ? plotHeight : 0) : - cHeight - translate(pos + tickmarkOffset, null, null, old) - transB; - - // create the grid line - if (gridLineWidth) { - gridLinePath = getPlotLinePath(pos + tickmarkOffset, gridLineWidth, old); - - if (gridLine === UNDEFINED) { - attribs = { - stroke: gridLineColor, - 'stroke-width': gridLineWidth - }; - if (dashStyle) { - attribs.dashstyle = dashStyle; - } - tick.gridLine = gridLine = - gridLineWidth ? - renderer.path(gridLinePath) - .attr(attribs).add(gridGroup) : - null; - } - if (gridLine && gridLinePath) { - gridLine.animate({ - d: gridLinePath - }); - } - } - - // create the tick mark - if (tickWidth) { - - // negate the length - if (tickPosition == 'inside') { - tickLength = -tickLength; - } - if (opposite) { - tickLength = -tickLength; - } - - markPath = renderer.crispLine([ - M, - x, - y, - L, - x + (horiz ? 0 : -tickLength), - y + (horiz ? tickLength : 0) - ], tickWidth); - - if (mark) { // updating - mark.animate({ - d: markPath - }); - } else { // first time - tick.mark = renderer.path( - markPath - ).attr({ - stroke: tickColor, - 'stroke-width': tickWidth - }).add(axisGroup); - } - } - - // the label is created on init - now move it into place - if (label) { - x = x + labelOptions.x - (tickmarkOffset && horiz ? - tickmarkOffset * transA * (reversed ? -1 : 1) : 0); - y = y + labelOptions.y - (tickmarkOffset && !horiz ? - tickmarkOffset * transA * (reversed ? 1 : -1) : 0); - - // vertically centered - if (!defined(labelOptions.y)) { - y += parseInt(label.styles.lineHeight) * 0.9 - label.getBBox().height / 2; - } - - - // correct for staggered labels - if (staggerLines) { - y += (index % staggerLines) * 16; - } - // apply step - if (step) { - // show those indices dividable by step - label[index % step ? 'hide' : 'show'](); - } - - label[tick.isNew ? 'attr' : 'animate']({ - x: x, - y: y - }); - - } - - tick.isNew = false; - }, - /** - * Destructor for the tick prototype - */ - destroy: function() { - var tick = this, - n; - for (n in tick) { - if (tick[n] && tick[n].destroy) { - tick[n].destroy(); - } - } - } - }; - - /** - * The object wrapper for plot lines and plot bands - * @param {Object} options - */ - function PlotLineOrBand(options) { - var plotLine = this; - if (options) { - plotLine.options = options; - plotLine.id = options.id; - } - - //plotLine.render() - return plotLine; - } - - PlotLineOrBand.prototype = { - - /** - * Render the plot line or plot band. If it is already existing, - * move it. - */ - render: function () { - var plotLine = this, - options = plotLine.options, - optionsLabel = options.label, - label = plotLine.label, - width = options.width, - to = options.to, - toPath, // bands only - from = options.from, - dashStyle = options.dashStyle, - svgElem = plotLine.svgElem, - path = [], - addEvent, - eventType, - xs, - ys, - x, - y, - color = options.color, - zIndex = options.zIndex, - events = options.events, - attribs; - - // plot line - if (width) { - path = getPlotLinePath(options.value, width); - attribs = { - stroke: color, - 'stroke-width': width - }; - if (dashStyle) { - attribs.dashstyle = dashStyle; - } - } - - // plot band - else if (defined(from) && defined(to)) { - // keep within plot area - from = mathMax(from, min); - to = mathMin(to, max); - - toPath = getPlotLinePath(to); - path = getPlotLinePath(from); - if (path && toPath) { - path.push( - toPath[4], - toPath[5], - toPath[1], - toPath[2] - ); - } else { // outside the axis area - path = null; - } - attribs = { - fill: color - }; - } else { - return; - } - // zIndex - if (defined(zIndex)) { - attribs.zIndex = zIndex; - } - - // common for lines and bands - if (svgElem) { - if (path) { - svgElem.animate({ - d: path - }, null, svgElem.onGetPath); - } else { - svgElem.hide(); - svgElem.onGetPath = function() { - svgElem.show(); - } - } - } else if (path && path.length) { - plotLine.svgElem = svgElem = renderer.path(path) - .attr(attribs).add(); - - // events - if (events) { - addEvent = function(eventType) { - svgElem.on(eventType, function(e) { - events[eventType].apply(plotLine, [e]); - }); - }; - for (eventType in events) { - addEvent(eventType); - } - } - } - - // the plot band/line label - if (optionsLabel && defined(optionsLabel.text) && path && path.length && plotWidth > 0 && plotHeight > 0) { - // apply defaults - optionsLabel = merge({ - align: horiz && toPath && 'center', - x: horiz ? !toPath && 4 : 10, - verticalAlign : !horiz && toPath && 'middle', - y: horiz ? toPath ? 16 : 10 : toPath ? 6 : -4, - rotation: horiz && !toPath && 90 - }, optionsLabel); - - // add the SVG element - if (!label) { - plotLine.label = label = renderer.text( - optionsLabel.text, - 0, - 0 - ) - .attr({ - align: optionsLabel.textAlign || optionsLabel.align, - rotation: optionsLabel.rotation, - zIndex: zIndex - }) - .css(optionsLabel.style) - .add(); - } - - // get the bounding box and align the label - xs = [path[1], path[4], path[6] || path[1]]; - ys = [path[2], path[5], path[7] || path[2]]; - x = mathMin.apply(math, xs); - y = mathMin.apply(math, ys); - - label.align(optionsLabel, false, { - x: x, - y: y, - width: mathMax.apply(math, xs) - x, - height: mathMax.apply(math, ys) - y - }); - label.show(); - - } else if (label) { // move out of sight - label.hide(); - } - - // chainable - return plotLine; - }, - - /** - * Remove the plot line or band - */ - destroy: function() { - var obj = this, - n; - - for (n in obj) { - if (obj[n] && obj[n].destroy) { - obj[n].destroy(); // destroy SVG wrappers - } - delete obj[n]; - } - // remove it from the lookup - erase(plotLinesAndBands, obj); - } - }; - - - /** - * Get the minimum and maximum for the series of each axis - */ - function getSeriesExtremes() { - var posStack = [], - negStack = [], - run; - - // reset dataMin and dataMax in case we're redrawing - dataMin = dataMax = null; - - // get an overview of what series are associated with this axis - associatedSeries = []; - - each(series, function(serie) { - run = false; - - - // match this axis against the series' given or implicated axis - each(['xAxis', 'yAxis'], function(strAxis) { - if ( - // the series is a cartesian type, and... - serie.isCartesian && - // we're in the right x or y dimension, and... - (strAxis == 'xAxis' && isXAxis || strAxis == 'yAxis' && !isXAxis) && ( - // the axis number is given in the options and matches this axis index, or - (serie.options[strAxis] == options.index) || - // the axis index is not given - (serie.options[strAxis] === UNDEFINED && options.index === 0) - ) - ) { - serie[strAxis] = axis; - associatedSeries.push(serie); - - // the series is visible, run the min/max detection - run = true; - } - }); - // ignore hidden series if opted - if (!serie.visible && optionsChart.ignoreHiddenSeries) { - run = false; - } - - if (run) { - - var stacking, - posPointStack, - negPointStack, - stackKey, - negKey; - - if (!isXAxis) { - stacking = serie.options.stacking; - usePercentage = stacking == 'percent'; - - // create a stack for this particular series type - if (stacking) { - stackKey = serie.type + pick(serie.options.stack, ''); - negKey = '-'+ stackKey; - serie.stackKey = stackKey; // used in translate - - posPointStack = posStack[stackKey] || []; // contains the total values for each x - posStack[stackKey] = posPointStack; - - negPointStack = negStack[negKey] || []; - negStack[negKey] = negPointStack; - } - if (usePercentage) { - dataMin = 0; - dataMax = 99; - } - } - if (serie.isCartesian) { // line, column etc. need axes, pie doesn't - each(serie.data, function(point, i) { - var pointX = point.x, - pointY = point.y, - isNegative = pointY < 0, - pointStack = isNegative ? negPointStack : posPointStack, - key = isNegative ? negKey : stackKey, - totalPos, - pointLow; - - // initial values - if (dataMin === null) { - - // start out with the first point - dataMin = dataMax = point[xOrY]; - } - - // x axis - if (isXAxis) { - if (pointX > dataMax) { - dataMax = pointX; - } else if (pointX < dataMin) { - dataMin = pointX; - } - } - - // y axis - else if (defined(pointY)) { - if (stacking) { - pointStack[pointX] = - defined(pointStack[pointX]) ? - pointStack[pointX] + pointY : pointY; - } - totalPos = pointStack ? pointStack[pointX] : pointY; - pointLow = pick(point.low, totalPos); - if (!usePercentage) { - if (totalPos > dataMax) { - dataMax = totalPos; - } else if (pointLow < dataMin) { - dataMin = pointLow; - } - } - if (stacking) { - // add the series - if (!stacks[key]) { - stacks[key] = {}; - } - stacks[key][pointX] = { - total: totalPos, - cum: totalPos - }; - } - } - }); - - - // For column, areas and bars, set the minimum automatically to zero - // and prevent that minPadding is added in setScale - if (/(area|column|bar)/.test(serie.type) && !isXAxis) { - if (dataMin >= 0) { - dataMin = 0; - ignoreMinPadding = true; - } else if (dataMax < 0) { - dataMax = 0; - ignoreMaxPadding = true; - } - } - } - } - }); - - } - - /** - * Translate from axis value to pixel position on the chart, or back - * - */ - translate = function(val, backwards, cvsCoord, old) { - var sign = 1, - cvsOffset = 0, - localA = old ? oldTransA : transA, - localMin = old ? oldMin : min, - returnValue; - - if (!localA) { - localA = transA; - } - - if (cvsCoord) { - sign *= -1; // canvas coordinates inverts the value - cvsOffset = axisLength; - } - if (reversed) { // reversed axis - sign *= -1; - cvsOffset -= sign * axisLength; - } - - if (backwards) { // reverse translation - if (reversed) { - val = axisLength - val; - } - returnValue = val / localA + localMin; // from chart pixel to value - - } else { // normal translation - returnValue = sign * (val - localMin) * localA + cvsOffset; // from value to chart pixel - } - - return returnValue; - }; - - /** - * Create the path for a plot line that goes from the given value on - * this axis, across the plot to the opposite side - * @param {Number} value - * @param {Number} lineWidth Used for calculation crisp line - * @param {Number] old Use old coordinates (for resizing and rescaling) - */ - getPlotLinePath = function(value, lineWidth, old) { - var x1, - y1, - x2, - y2, - translatedValue = translate(value, null, null, old), - cHeight = old && oldChartHeight || chartHeight, - cWidth = old && oldChartWidth || chartWidth, - skip; - - x1 = x2 = mathRound(translatedValue + transB); - y1 = y2 = mathRound(cHeight - translatedValue - transB); - - if (isNaN(translatedValue)) { // no min or max - skip = true; - - } else if (horiz) { - y1 = plotTop; - y2 = cHeight - marginBottom; - if (x1 < plotLeft || x1 > plotLeft + plotWidth) { - skip = true; - } - } else { - x1 = plotLeft; - x2 = cWidth - marginRight; - if (y1 < plotTop || y1 > plotTop + plotHeight) { - skip = true; - } - } - return skip ? - null : - renderer.crispLine([M, x1, y1, L, x2, y2], lineWidth || 0); - }; - - /** - * Take an interval and normalize it to multiples of 1, 2, 2.5 and 5 - * @param {Number} interval - */ - function normalizeTickInterval(interval, multiples) { - var normalized; - - // round to a tenfold of 1, 2, 2.5 or 5 - magnitude = multiples ? 1 : math.pow(10, mathFloor(math.log(interval) / math.LN10)); - normalized = interval / magnitude; - - // multiples for a linear scale - if (!multiples) { - multiples = [1, 2, 2.5, 5, 10]; - //multiples = [1, 2, 2.5, 4, 5, 7.5, 10]; - - // the allowDecimals option - if (options.allowDecimals === false) { - if (magnitude == 1) { - multiples = [1, 2, 5, 10]; - } else if (magnitude <= 0.1) { - multiples = [1 / magnitude]; - } - } - } - - // normalize the interval to the nearest multiple - for (var i = 0; i < multiples.length; i++) { - interval = multiples[i]; - if (normalized <= (multiples[i] + (multiples[i+1] || multiples[i])) / 2) { - break; - } - } - - // multiply back to the correct magnitude - interval *= magnitude; - - return interval; - } - - /** - * Set the tick positions to a time unit that makes sense, for example - * on the first of each month or on every Monday. - */ - function setDateTimeTickPositions() { - tickPositions = []; - var i, - useUTC = defaultOptions.global.useUTC, - oneSecond = 1000 / timeFactor, - oneMinute = 60000 / timeFactor, - oneHour = 3600000 / timeFactor, - oneDay = 24 * 3600000 / timeFactor, - oneWeek = 7 * 24 * 3600000 / timeFactor, - oneMonth = 30 * 24 * 3600000 / timeFactor, - oneYear = 31556952000 / timeFactor, - - units = [[ - 'second', // unit name - oneSecond, // fixed incremental unit - [1, 2, 5, 10, 15, 30] // allowed multiples - ], [ - 'minute', // unit name - oneMinute, // fixed incremental unit - [1, 2, 5, 10, 15, 30] // allowed multiples - ], [ - 'hour', // unit name - oneHour, // fixed incremental unit - [1, 2, 3, 4, 6, 8, 12] // allowed multiples - ], [ - 'day', // unit name - oneDay, // fixed incremental unit - [1, 2] // allowed multiples - ], [ - 'week', // unit name - oneWeek, // fixed incremental unit - [1, 2] // allowed multiples - ], [ - 'month', - oneMonth, - [1, 2, 3, 4, 6] - ], [ - 'year', - oneYear, - null - ]], - - unit = units[6], // default unit is years - interval = unit[1], - multiples = unit[2]; - - // loop through the units to find the one that best fits the tickInterval - for (i = 0; i < units.length; i++) { - unit = units[i]; - interval = unit[1]; - multiples = unit[2]; - - - if (units[i+1]) { - // lessThan is in the middle between the highest multiple and the next unit. - var lessThan = (interval * multiples[multiples.length - 1] + - units[i + 1][1]) / 2; - - // break and keep the current unit - if (tickInterval <= lessThan) { - break; - } - } - } - - // prevent 2.5 years intervals, though 25, 250 etc. are allowed - if (interval == oneYear && tickInterval < 5 * interval) { - multiples = [1, 2, 5]; - } - - // get the minimum value by flooring the date - var multitude = normalizeTickInterval(tickInterval / interval, multiples), - minYear, // used in months and years as a basis for Date.UTC() - minDate = new Date(min * timeFactor); - - minDate.setMilliseconds(0); - - if (interval >= oneSecond) { // second - minDate.setSeconds(interval >= oneMinute ? 0 : - multitude * mathFloor(minDate.getSeconds() / multitude)); - } - - if (interval >= oneMinute) { // minute - minDate[setMinutes](interval >= oneHour ? 0 : - multitude * mathFloor(minDate[getMinutes]() / multitude)); - } - - if (interval >= oneHour) { // hour - minDate[setHours](interval >= oneDay ? 0 : - multitude * mathFloor(minDate[getHours]() / multitude)); - } - - if (interval >= oneDay) { // day - minDate[setDate](interval >= oneMonth ? 1 : - multitude * mathFloor(minDate[getDate]() / multitude)); - } - - if (interval >= oneMonth) { // month - minDate[setMonth](interval >= oneYear ? 0 : - multitude * mathFloor(minDate[getMonth]() / multitude)); - minYear = minDate[getFullYear](); - } - - if (interval >= oneYear) { // year - minYear -= minYear % multitude; - minDate[setFullYear](minYear); - } - - // week is a special case that runs outside the hierarchy - if (interval == oneWeek) { - // get start of current week, independent of multitude - minDate[setDate](minDate[getDate]() - minDate[getDay]() + - options.startOfWeek); - } - - - // get tick positions - i = 1; // prevent crash just in case - minYear = minDate[getFullYear](); - var time = minDate.getTime() / timeFactor, - minMonth = minDate[getMonth](), - minDateDate = minDate[getDate](); - - // iterate and add tick positions at appropriate values - while (time < max && i < plotWidth) { - tickPositions.push(time); - - // if the interval is years, use Date.UTC to increase years - if (interval == oneYear) { - time = makeTime(minYear + i * multitude, 0) / timeFactor; - - // if the interval is months, use Date.UTC to increase months - } else if (interval == oneMonth) { - time = makeTime(minYear, minMonth + i * multitude) / timeFactor; - - // if we're using global time, the interval is not fixed as it jumps - // one hour at the DST crossover - } else if (!useUTC && (interval == oneDay || interval == oneWeek)) { - time = makeTime(minYear, minMonth, minDateDate + - i * multitude * (interval == oneDay ? 1 : 7)); - - // else, the interval is fixed and we use simple addition - } else { - time += interval * multitude; - } - - i++; - } - // push the last time - tickPositions.push(time); - - - // dynamic label formatter - dateTimeLabelFormat = options.dateTimeLabelFormats[unit[0]]; - } - - /** - * Fix JS round off float errors - * @param {Number} num - */ - function correctFloat(num) { - var invMag, ret = num; - if (defined(magnitude)) { - invMag = (magnitude < 1 ? mathRound(1 / magnitude) : 1) * 10; - ret = mathRound(num * invMag) / invMag; - } - return ret; - } - - /** - * Set the tick positions of a linear axis to round values like whole tens or every five. - */ - function setLinearTickPositions() { - - var i, - roundedMin = mathFloor(min / tickInterval) * tickInterval, - roundedMax = mathCeil(max / tickInterval) * tickInterval; - - tickPositions = []; - - // populate the intermediate values - i = correctFloat(roundedMin); - while (i <= roundedMax) { - tickPositions.push(i); - i = correctFloat(i + tickInterval); - } - - } - - /** - * Set the tick positions to round values and optionally extend the extremes - * to the nearest tick - */ - function setTickPositions(secondPass) { - var length, - catPad, - linkedParent, - linkedParentExtremes, - tickIntervalOption = options.tickInterval, - tickPixelIntervalOption = options.tickPixelInterval, - maxZoom = options.maxZoom || ( - isXAxis ? - mathMin(chart.smallestInterval * 5, dataMax - dataMin) : - null - ), - zoomOffset; - - - axisLength = horiz ? plotWidth : plotHeight; - - // linked axis gets the extremes from the parent axis - if (isLinked) { - linkedParent = chart[isXAxis ? 'xAxis' : 'yAxis'][options.linkedTo]; - linkedParentExtremes = linkedParent.getExtremes(); - min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin); - max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax); - } - - // initial min and max from the extreme data values - else { - min = pick(userSetMin, options.min, dataMin); - max = pick(userSetMax, options.max, dataMax); - } - - // maxZoom exceeded, just center the selection - if (max - min < maxZoom) { - zoomOffset = (maxZoom - max + min) / 2; - // if min and max options have been set, don't go beyond it - min = mathMax(min - zoomOffset, pick(options.min, min - zoomOffset), dataMin); - max = mathMin(min + maxZoom, pick(options.max, min + maxZoom), dataMax); - } - - // pad the values to get clear of the chart's edges - if (!categories && !usePercentage && !isLinked && defined(min) && defined(max)) { - length = (max - min) || 1; - if (!defined(options.min) && !defined(userSetMin) && minPadding && (dataMin < 0 || !ignoreMinPadding)) { - min -= length * minPadding; - } - if (!defined(options.max) && !defined(userSetMax) && maxPadding && (dataMax > 0 || !ignoreMaxPadding)) { - max += length * maxPadding; - } - } - - // get tickInterval - if (min == max) { - tickInterval = 1; - } else if (isLinked && !tickIntervalOption && - tickPixelIntervalOption == linkedParent.options.tickPixelInterval) { - tickInterval = linkedParent.tickInterval; - } else { - tickInterval = pick( - tickIntervalOption, - categories ? // for categoried axis, 1 is default, for linear axis use tickPix - 1 : - (max - min) * tickPixelIntervalOption / axisLength - ); - } - - if (!isDatetimeAxis && !defined(options.tickInterval)) { // linear - tickInterval = normalizeTickInterval(tickInterval); - } - axis.tickInterval = tickInterval; // record for linked axis - - // get minorTickInterval - minorTickInterval = options.minorTickInterval === 'auto' && tickInterval ? - tickInterval / 5 : options.minorTickInterval; - - // find the tick positions - if (isDatetimeAxis) { - setDateTimeTickPositions(); - } else { - setLinearTickPositions(); - } - - if (!isLinked) { - // pad categorised axis to nearest half unit - if (categories || (isXAxis && chart.hasColumn)) { - catPad = (categories ? 1 : tickInterval) * 0.5; - if (categories || !defined(pick(options.min, userSetMin))) { - min -= catPad; - } - if (categories || !defined(pick(options.max, userSetMax))) { - max += catPad; - } - } - - // reset min/max or remove extremes based on start/end on tick - var roundedMin = tickPositions[0], - roundedMax = tickPositions[tickPositions.length - 1]; - - if (options.startOnTick) { - min = roundedMin; - } else if (min > roundedMin) { - tickPositions.shift(); - } - - if (options.endOnTick) { - max = roundedMax; - } else if (max < roundedMax) { - tickPositions.pop(); - } - - // record the greatest number of ticks for multi axis - if (!maxTicks) { // first call, or maxTicks have been reset after a zoom operation - maxTicks = { - x: 0, - y: 0 - }; - } - - if (!isDatetimeAxis && tickPositions.length > maxTicks[xOrY]) { - maxTicks[xOrY] = tickPositions.length; - } - } - - - } - - /** - * When using multiple axes, adjust the number of ticks to match the highest - * number of ticks in that group - */ - function adjustTickAmount() { - - if (maxTicks && !isDatetimeAxis && !categories && !isLinked) { // only apply to linear scale - var oldTickAmount = tickAmount, - calculatedTickAmount = tickPositions.length; - - // set the axis-level tickAmount to use below - tickAmount = maxTicks[xOrY]; - - if (calculatedTickAmount < tickAmount) { - while (tickPositions.length < tickAmount) { - tickPositions.push( correctFloat( - tickPositions[tickPositions.length - 1] + tickInterval - )); - } - transA *= (calculatedTickAmount - 1) / (tickAmount - 1); - max = tickPositions[tickPositions.length - 1]; - - } - if (defined(oldTickAmount) && tickAmount != oldTickAmount) { - axis.isDirty = true; - } - } - - } - - /** - * Set the scale based on data min and max, user set min and max or options - * - */ - function setScale() { - var type, - i; - - oldMin = min; - oldMax = max; - - // get data extremes if needed - getSeriesExtremes(); - - // get fixed positions based on tickInterval - setTickPositions(); - - // the translation factor used in translate function - oldTransA = transA; - transA = axisLength / ((max - min) || 1); - - // reset stacks - if (!isXAxis) { - for (type in stacks) { - for (i in stacks[type]) { - stacks[type][i].cum = stacks[type][i].total; - } - } - } - - // mark as dirty if it is not already set to dirty and extremes have changed - if (!axis.isDirty) { - axis.isDirty = (min != oldMin || max != oldMax); - } - - } - - /** - * Set the extremes and optionally redraw - * @param {Number} newMin - * @param {Number} newMax - * @param {Boolean} redraw - * @param {Boolean|Object} animation Whether to apply animation, and optionally animation - * configuration - * - */ - function setExtremes(newMin, newMax, redraw, animation) { - - redraw = pick(redraw, true); // defaults to true - - fireEvent(axis, 'setExtremes', { // fire an event to enable syncing of multiple charts - min: newMin, - max: newMax - }, function() { // the default event handler - - userSetMin = newMin; - userSetMax = newMax; - - - // redraw - if (redraw) { - chart.redraw(animation); - } - }); - - } - - /** - * Get the actual axis extremes - */ - function getExtremes() { - return { - min: min, - max: max, - dataMin: dataMin, - dataMax: dataMax - }; - } - - /** - * Get the zero plane either based on zero or on the min or max value. - * Used in bar and area plots - */ - function getThreshold(threshold) { - if (min > threshold) { - threshold = min; - } else if (max < threshold) { - threshold = max; - } - - return translate(threshold, 0, 1); - } - - /** - * Add a plot band or plot line after render time - * - * @param options {Object} The plotBand or plotLine configuration object - */ - function addPlotBandOrLine(options) { - var obj = new PlotLineOrBand(options).render(); - plotLinesAndBands.push(obj); - return obj; - } - - /** - * Render the tick labels to a preliminary position to get their sizes - */ - function getOffset() { - - var hasData = associatedSeries.length && defined(min) && defined(max), - titleOffset = 0, - titleMargin = 0, - axisTitleOptions = options.title, - labelOptions = options.labels, - directionFactor = [-1, 1, 1, -1][side]; - - if (!axisGroup) { - axisGroup = renderer.g('axis') - .attr({ zIndex: 7 }) - .add(); - gridGroup = renderer.g('grid') - .attr({ zIndex: 1 }) - .add(); - } - - labelOffset = 0; // reset - - if (hasData || isLinked) { - each(tickPositions, function(pos) { - if (!ticks[pos]) { - ticks[pos] = new Tick(pos); - } else { - ticks[pos].addLabel(); // update labels depending on tick interval - } - - // left side must be align: right and right side must have align: left for labels - if (side === 0 || side == 2 || { 1: 'left', 3: 'right' }[side] == labelOptions.align) { - - // get the highest offset - labelOffset = mathMax( - ticks[pos].getLabelSize(), - labelOffset - ); - } - - }); - - if (staggerLines) { - labelOffset += (staggerLines - 1) * 16; - } - - } else { // doesn't have data - for (var n in ticks) { - ticks[n].destroy(); - delete ticks[n]; - } - } - - if (axisTitleOptions && axisTitleOptions.text) { - if (!axis.axisTitle) { - axis.axisTitle = renderer.text( - axisTitleOptions.text, - 0, - 0 - ) - .attr({ - zIndex: 7, - rotation: axisTitleOptions.rotation || 0, - align: - axisTitleOptions.textAlign || - { low: 'left', middle: 'center', high: 'right' }[axisTitleOptions.align] - }) - .css(axisTitleOptions.style) - .add(); - } - - titleOffset = axis.axisTitle.getBBox()[horiz ? 'height' : 'width']; - titleMargin = pick(axisTitleOptions.margin, horiz ? 5 : 10); - - } - - // handle automatic or user set offset - offset = directionFactor * (options.offset || axisOffset[side]); - - axisTitleMargin = - labelOffset + - (side != 2 && labelOffset && directionFactor * options.labels[horiz ? 'y' : 'x']) + - titleMargin; - - axisOffset[side] = mathMax( - axisOffset[side], - axisTitleMargin + titleOffset + directionFactor * offset - ); - - } - - /** - * Render the axis - */ - function render() { - var axisTitleOptions = options.title, - alternateGridColor = options.alternateGridColor, - lineWidth = options.lineWidth, - lineLeft, - lineTop, - linePath, - hasRendered = chart.hasRendered, - slideInTicks = hasRendered && defined(oldMin) && !isNaN(oldMin), - hasData = associatedSeries.length && defined(min) && defined(max); - - // update metrics - axisLength = horiz ? plotWidth : plotHeight; - transA = axisLength / ((max - min) || 1); - transB = horiz ? plotLeft : marginBottom; // translation addend - - // If the series has data draw the ticks. Else only the line and title - if (hasData || isLinked) { - - // minor ticks - if (minorTickInterval && !categories) { - var pos = min + (tickPositions[0] - min) % minorTickInterval; - for (pos; pos <= max; pos += minorTickInterval) { - if (!minorTicks[pos]) { - minorTicks[pos] = new Tick(pos, true); - } - - // render new ticks in old position - if (slideInTicks && minorTicks[pos].isNew) { - minorTicks[pos].render(null, true); - } - - - minorTicks[pos].isActive = true; - minorTicks[pos].render(); - } - } - - // major ticks - each(tickPositions, function(pos, i) { - // linked axes need an extra check to find out if - if (!isLinked || (pos >= min && pos <= max)) { - - // render new ticks in old position - if (slideInTicks && ticks[pos].isNew) { - ticks[pos].render(i, true); - } - - ticks[pos].isActive = true; - ticks[pos].render(i); - } - }); - - // alternate grid color - if (alternateGridColor) { - each(tickPositions, function(pos, i) { - if (i % 2 === 0 && pos < max) { - /*plotLinesAndBands.push(new PlotLineOrBand({ - from: pos, - to: tickPositions[i + 1] !== UNDEFINED ? tickPositions[i + 1] : max, - color: alternateGridColor - }));*/ - - if (!alternateBands[pos]) { - alternateBands[pos] = new PlotLineOrBand(); - } - alternateBands[pos].options = { - from: pos, - to: tickPositions[i + 1] !== UNDEFINED ? tickPositions[i + 1] : max, - color: alternateGridColor - }; - alternateBands[pos].render(); - alternateBands[pos].isActive = true; - } - }); - } - - // custom plot bands (behind grid lines) - /*if (!hasRendered) { // only first time - each(options.plotBands || [], function(plotBandOptions) { - plotLinesAndBands.push(new PlotLineOrBand( - extend({ zIndex: 1 }, plotBandOptions) - ).render()); - }); - }*/ - - - - - // custom plot lines and bands - if (!hasRendered) { // only first time - each((options.plotLines || []).concat(options.plotBands || []), function(plotLineOptions) { - plotLinesAndBands.push(new PlotLineOrBand(plotLineOptions).render()); - }); - } - - - - } // end if hasData - - // remove inactive ticks - each([ticks, minorTicks, alternateBands], function(coll) { - for (var pos in coll) { - if (!coll[pos].isActive) { - coll[pos].destroy(); - delete coll[pos]; - } else { - coll[pos].isActive = false; // reset - } - } - }); - - - - - // Static items. As the axis group is cleared on subsequent calls - // to render, these items are added outside the group. - // axis line - if (lineWidth) { - lineLeft = plotLeft + (opposite ? plotWidth : 0) + offset; - lineTop = chartHeight - marginBottom - (opposite ? plotHeight : 0) + offset; - - linePath = renderer.crispLine([ - M, - horiz ? - plotLeft: - lineLeft, - horiz ? - lineTop: - plotTop, - L, - horiz ? - chartWidth - marginRight : - lineLeft, - horiz ? - lineTop: - chartHeight - marginBottom - ], lineWidth); - if (!axisLine) { - axisLine = renderer.path(linePath) - .attr({ - stroke: options.lineColor, - 'stroke-width': lineWidth, - zIndex: 7 - }) - .add(); - } else { - axisLine.animate({ d: linePath }); - } - - } - - if (axis.axisTitle) { - // compute anchor points for each of the title align options - var margin = horiz ? plotLeft : plotTop, - fontSize = pInt(axisTitleOptions.style.fontSize || 12), - // the position in the length direction of the axis - alongAxis = { - low: margin + (horiz ? 0 : axisLength), - middle: margin + axisLength / 2, - high: margin + (horiz ? axisLength : 0) - }[axisTitleOptions.align], - - // the position in the perpendicular direction of the axis - offAxis = (horiz ? plotTop + plotHeight : plotLeft) + - (horiz ? 1 : -1) * // horizontal axis reverses the margin - (opposite ? -1 : 1) * // so does opposite axes - axisTitleMargin + - //(isIE ? fontSize / 3 : 0)+ // preliminary fix for vml's centerline - (side == 2 ? fontSize : 0); - - axis.axisTitle[hasRendered ? 'animate' : 'attr']({ - x: horiz ? - alongAxis: - offAxis + (opposite ? plotWidth : 0) + offset + - (axisTitleOptions.x || 0), // x - y: horiz ? - offAxis - (opposite ? plotHeight : 0) + offset: - alongAxis + (axisTitleOptions.y || 0) // y - }); - - } - - axis.isDirty = false; - } - - /** - * Remove a plot band or plot line from the chart by id - * @param {Object} id - */ - function removePlotBandOrLine(id) { - var i = plotLinesAndBands.length; - while (i--) { - if (plotLinesAndBands[i].id == id) { - plotLinesAndBands[i].destroy(); - } - } - } - - /** - * Redraw the axis to reflect changes in the data or axis extremes - */ - function redraw() { - - // hide tooltip and hover states - if (tracker.resetTracker) { - tracker.resetTracker(); - } - - // render the axis - render(); - - // move plot lines and bands - each(plotLinesAndBands, function(plotLine) { - plotLine.render(); - }); - - // mark associated series as dirty and ready for redraw - each(associatedSeries, function(series) { - series.isDirty = true; - }); - - } - - /** - * Set new axis categories and optionally redraw - * @param {Array} newCategories - * @param {Boolean} doRedraw - */ - function setCategories(newCategories, doRedraw) { - // set the categories - axis.categories = categories = newCategories; - - // force reindexing tooltips - each(associatedSeries, function(series) { - series.translate(); - series.setTooltipPoints(true); - }); - - - // optionally redraw - axis.isDirty = true; - - if (pick(doRedraw, true)) { - chart.redraw(); - } - } - - - - // Run Axis - - // inverted charts have reversed xAxes as default - if (inverted && isXAxis && reversed === UNDEFINED) { - reversed = true; - } - - - // expose some variables - extend(axis, { - addPlotBand: addPlotBandOrLine, - addPlotLine: addPlotBandOrLine, - adjustTickAmount: adjustTickAmount, - categories: categories, - getExtremes: getExtremes, - getPlotLinePath: getPlotLinePath, - getThreshold: getThreshold, - isXAxis: isXAxis, - options: options, - plotLinesAndBands: plotLinesAndBands, - getOffset: getOffset, - render: render, - setCategories: setCategories, - setExtremes: setExtremes, - setScale: setScale, - setTickPositions: setTickPositions, - translate: translate, - redraw: redraw, - removePlotBand: removePlotBandOrLine, - removePlotLine: removePlotBandOrLine, - reversed: reversed, - stacks: stacks - }); - - // register event listeners - for (eventType in events) { - addEvent(axis, eventType, events[eventType]); - } - - // set min and max - setScale(); - - } // end Axis - - - /** - * The toolbar object - * - * @param {Object} chart - */ - function Toolbar(chart) { - var buttons = {}; - - function add(id, text, title, fn) { - if (!buttons[id]) { - var button = renderer.text( - text, - 0, - 0 - ) - .css(options.toolbar.itemStyle) - .align({ - align: 'right', - x: - marginRight - 20, - y: plotTop + 30 - }) - .on('click', fn) - /*.on('touchstart', function(e) { - e.stopPropagation(); // don't fire the container event - fn(); - })*/ - .attr({ - align: 'right', - zIndex: 20 - }) - .add(); - buttons[id] = button; - } - } - function remove(id) { - discardElement(buttons[id].element); - buttons[id] = null; - } - - // public - return { - add: add, - remove: remove - }; - } - - /** - * The tooltip object - * @param {Object} options Tooltip options - */ - function Tooltip (options) { - var currentSeries, - borderWidth = options.borderWidth, - crosshairsOptions = options.crosshairs, - crosshairs = [], - style = options.style, - shared = options.shared, - padding = pInt(style.padding), - boxOffLeft = borderWidth + padding, // off left/top position as IE can't - //properly handle negative positioned shapes - tooltipIsHidden = true, - boxWidth, - boxHeight, - currentX = 0, - currentY = 0; - - // remove padding CSS and apply padding on box instead - style.padding = 0; - - // create the elements - var group = renderer.g('tooltip') - .attr({ zIndex: 8 }) - .add(), - - box = renderer.rect(boxOffLeft, boxOffLeft, 0, 0, options.borderRadius, borderWidth) - .attr({ - fill: options.backgroundColor, - 'stroke-width': borderWidth - }) - .add(group) - .shadow(options.shadow), - label = renderer.text('', padding + boxOffLeft, pInt(style.fontSize) + padding + boxOffLeft) - .attr({ zIndex: 1 }) - .css(style) - .add(group); - - group.hide(); - - /** - * In case no user defined formatter is given, this will be used - */ - function defaultFormatter() { - var pThis = this, - items = pThis.points || splat(pThis), - xAxis = items[0].series.xAxis, - x = pThis.x, - isDateTime = xAxis && xAxis.options.type == 'datetime', - useHeader = isString(x) || isDateTime, - series, - s; - - // build the header - s = useHeader ? - ['', - (isDateTime ? dateFormat('%A, %b %e, %Y', x) : x), - '
    '] : []; - - // build the values - each(items, function(item) { - s.push(item.point.tooltipFormatter(useHeader)); - }); - return s.join(''); - } - - /** - * Provide a soft movement for the tooltip - * - * @param {Number} finalX - * @param {Number} finalY - */ - function move(finalX, finalY) { - - currentX = tooltipIsHidden ? finalX : (2 * currentX + finalX) / 3; - currentY = tooltipIsHidden ? finalY : (currentY + finalY) / 2; - - group.translate(currentX, currentY); - - - // run on next tick of the mouse tracker - if (mathAbs(finalX - currentX) > 1 || mathAbs(finalY - currentY) > 1) { - tooltipTick = function() { - move(finalX, finalY); - }; - } else { - tooltipTick = null; - } - } - - /** - * Hide the tooltip - */ - function hide() { - if (!tooltipIsHidden) { - var hoverPoints = chart.hoverPoints; - - group.hide(); - - each(crosshairs, function(crosshair) { - if (crosshair) { - crosshair.hide(); - } - }); - - // hide previous hoverPoints and set new - if (hoverPoints) { - each (hoverPoints, function(point) { - point.setState(); - }); - } - chart.hoverPoints = null; - - - tooltipIsHidden = true; - } - - } - - /** - * Refresh the tooltip's text and position. - * @param {Object} point - * - */ - function refresh(point) { - var x, - y, - boxX, - boxY, - show, - bBox, - plotX, - plotY = 0, - textConfig = {}, - text, - pointConfig = [], - tooltipPos = point.tooltipPos, - formatter = options.formatter || defaultFormatter, - hoverPoints = chart.hoverPoints, - getConfig = function(point) { - return { - series: point.series, - point: point, - x: point.category, - y: point.y, - percentage: point.percentage, - total: point.total || point.stackTotal - }; - }; - - // shared tooltip, array is sent over - if (shared) { - - // hide previous hoverPoints and set new - if (hoverPoints) { - each (hoverPoints, function(point) { - point.setState(); - }); - } - chart.hoverPoints = point; - - each(point, function(item, i) { - /*var series = item.series, - hoverPoint = series.hoverPoint; - if (hoverPoint) { - hoverPoint.setState(); - } - series.hoverPoint = item;*/ - item.setState(HOVER_STATE); - plotY += item.plotY; // for average - - pointConfig.push(getConfig(item)); - }); - - plotX = point[0].plotX; - plotY = mathRound(plotY) / point.length; // mathRound because Opera 10 has problems here - - textConfig = { - x: point[0].category - }; - textConfig.points = pointConfig; - point = point[0]; - - // single point tooltip - } else { - textConfig = getConfig(point); - } - text = formatter.call(textConfig); - - // register the current series - currentSeries = point.series; - - // get the reference point coordinates (pie charts use tooltipPos) - plotX = shared ? plotX : point.plotX; - plotY = shared ? plotY : point.plotY; - x = mathRound(tooltipPos ? tooltipPos[0] : (inverted ? plotWidth - plotY : plotX)); - y = mathRound(tooltipPos ? tooltipPos[1] : (inverted ? plotHeight - plotX : plotY)); - - - // hide tooltip if the point falls outside the plot - show = shared || !point.series.isCartesian || isInsidePlot(x, y); - - // update the inner HTML - if (text === false || !show) { - hide(); - } else { - - // show it - if (tooltipIsHidden) { - group.show(); - tooltipIsHidden = false; - } - - // update text - label.attr({ - text: text - }); - - // get the bounding box - bBox = label.getBBox(); - boxWidth = bBox.width + 2 * padding; - boxHeight = bBox.height + 2 * padding; - - // set the size of the box - box.attr({ - width: boxWidth, - height: boxHeight, - stroke: options.borderColor || point.color || currentSeries.color || '#606060' - }); - - // keep the box within the chart area - boxX = x - boxWidth + plotLeft - 25; - boxY = y - boxHeight + plotTop + 10; - - // it is too far to the left, adjust it - if (boxX < 7) { - boxX = 7; - boxY -= 30; - } - - - if (boxY < 5) { - boxY = 5; // above - } else if (boxY + boxHeight > chartHeight) { - boxY = chartHeight - boxHeight - 5; // below - } - - // do the move - move(mathRound(boxX - boxOffLeft), mathRound(boxY - boxOffLeft)); - - - } - - - // crosshairs - if (crosshairsOptions) { - crosshairsOptions = splat(crosshairsOptions); // [x, y] - - var path, - i = crosshairsOptions.length, - attribs, - axis; - - while (i--) { - if (crosshairsOptions[i] && (axis = point.series[i ? 'yAxis' : 'xAxis'])) { - path = axis - .getPlotLinePath(point[i ? 'y' : 'x'], 1); - if (crosshairs[i]) { - crosshairs[i].attr({ d: path, visibility: VISIBLE }); - - } else { - attribs = { - 'stroke-width': crosshairsOptions[i].width || 1, - stroke: crosshairsOptions[i].color || '#C0C0C0', - zIndex: 2 - }; - if (crosshairsOptions[i].dashStyle) { - attribs.dashstyle = crosshairsOptions[i].dashStyle; - } - crosshairs[i] = renderer.path(path) - .attr(attribs) - .add(); - } - } - } - } - } - - - - // public members - return { - shared: shared, - refresh: refresh, - hide: hide - }; - } - - /** - * The mouse tracker object - * @param {Object} chart - * @param {Object} options - */ - function MouseTracker (chart, options) { - - - var mouseDownX, - mouseDownY, - hasDragged, - selectionMarker, - zoomType = optionsChart.zoomType, - zoomX = /x/.test(zoomType), - zoomY = /y/.test(zoomType), - zoomHor = zoomX && !inverted || zoomY && inverted, - zoomVert = zoomY && !inverted || zoomX && inverted; - - /** - * Add crossbrowser support for chartX and chartY - * @param {Object} e The event object in standard browsers - */ - function normalizeMouseEvent(e) { - var ePos; - - // common IE normalizing - e = e || win.event; - if (!e.target) { - e.target = e.srcElement; - } - - // iOS - ePos = e.touches ? e.touches.item(0) : e; - - // in certain cases, get mouse position - if (e.type != 'mousemove' || win.opera) { // only Opera needs position on mouse move, see below - chartPosition = getPosition(container); - } - - // chartX and chartY - if (isIE) { // IE including IE9 that has chartX but in a different meaning - e.chartX = e.x; - e.chartY = e.y; - } else { - if (ePos.layerX === UNDEFINED) { // Opera and iOS - e.chartX = ePos.pageX - chartPosition.left; - e.chartY = ePos.pageY - chartPosition.top; - } else { - e.chartX = e.layerX; - e.chartY = e.layerY; - } - } - - return e; - } - - /** - * Get the click position in terms of axis values. - * - * @param {Object} e A mouse event - */ - function getMouseCoordinates(e) { - var coordinates = { - xAxis: [], - yAxis: [] - }; - each(axes, function(axis, i) { - var translate = axis.translate, - isXAxis = axis.isXAxis, - isHorizontal = inverted ? !isXAxis : isXAxis; - - coordinates[isXAxis ? 'xAxis' : 'yAxis'].push({ - axis: axis, - value: translate( - isHorizontal ? - e.chartX - plotLeft : - plotHeight - e.chartY + plotTop, - true - ) - }); - }); - return coordinates; - } - - /** - * With line type charts with a single tracker, get the point closest to the mouse - */ - function onmousemove (e) { - var point, - points, - hoverPoint = chart.hoverPoint, - hoverSeries = chart.hoverSeries, - i, - j, - distance = chartWidth, - index = inverted ? e.chartY : e.chartX - plotLeft; // wtf? - - // shared tooltip - if (tooltip && options.shared) { - points = []; - - // loop over all series and find the ones with points closest to the mouse - i = series.length; - for (j = 0; j < i; j++) { - if (series[j].visible && series[j].tooltipPoints.length) { - point = series[j].tooltipPoints[index]; - point._dist = mathAbs(index - point.plotX); - distance = mathMin(distance, point._dist); - points.push(point); - } - } - // remove furthest points - i = points.length; - while (i--) { - if (points[i]._dist > distance) { - points.splice(i, 1); - } - } - // refresh the tooltip if necessary - if (points.length && (points[0].plotX != hoverX)) { - tooltip.refresh(points); - hoverX = points[0].plotX; - } - } - - // separate tooltip and general mouse events - if (hoverSeries && hoverSeries.tracker) { // only use for line-type series with common tracker - - // get the point - point = hoverSeries.tooltipPoints[index]; - - // a new point is hovered, refresh the tooltip - if (point && point != hoverPoint) { - - // trigger the events - point.onMouseOver(); - - } - } - } - - - - /** - * Reset the tracking by hiding the tooltip, the hover series state and the hover point - */ - function resetTracker() { - var hoverSeries = chart.hoverSeries, - hoverPoint = chart.hoverPoint; - - if (hoverPoint) { - hoverPoint.onMouseOut(); - } - - if (hoverSeries) { - hoverSeries.onMouseOut(); - } - - if (tooltip) { - tooltip.hide(); - } - - hoverX = null; - } - - /** - * Mouse up or outside the plot area - */ - function drop() { - if (selectionMarker) { - var selectionData = { - xAxis: [], - yAxis: [] - }, - selectionBox = selectionMarker.getBBox(), - selectionLeft = selectionBox.x - plotLeft, - selectionTop = selectionBox.y - plotTop; - - - // a selection has been made - if (hasDragged) { - - // record each axis' min and max - each(axes, function(axis, i) { - var translate = axis.translate, - isXAxis = axis.isXAxis, - isHorizontal = inverted ? !isXAxis : isXAxis, - selectionMin = translate( - isHorizontal ? - selectionLeft : - plotHeight - selectionTop - selectionBox.height, - true - ), - selectionMax = translate( - isHorizontal ? - selectionLeft + selectionBox.width : - plotHeight - selectionTop, - true - ); - - selectionData[isXAxis ? 'xAxis' : 'yAxis'].push({ - axis: axis, - min: mathMin(selectionMin, selectionMax), // for reversed axes - max: mathMax(selectionMin, selectionMax) - }); - - }); - fireEvent(chart, 'selection', selectionData, zoom); - - } - selectionMarker = selectionMarker.destroy(); - } - - chart.mouseIsDown = mouseIsDown = hasDragged = false; - removeEvent(doc, hasTouch ? 'touchend' : 'mouseup', drop); - - } - - /** - * Set the JS events on the container element - */ - function setDOMEvents () { - var lastWasOutsidePlot = true; - - /* - * Record the starting position of a dragoperation - */ - container.onmousedown = function(e) { - e = normalizeMouseEvent(e); - - // record the start position - //e.preventDefault && e.preventDefault(); - - chart.mouseIsDown = mouseIsDown = true; - mouseDownX = e.chartX; - mouseDownY = e.chartY; - - addEvent(doc, hasTouch ? 'touchend' : 'mouseup', drop); - }; - - // The mousemove, touchmove and touchstart event handler - var mouseMove = function(e) { - - // let the system handle multitouch operations like two finger scroll - // and pinching - if (e && e.touches && e.touches.length > 1) { - return; - } - - // normalize - e = normalizeMouseEvent(e); - if (!hasTouch) { // not for touch devices - e.returnValue = false; - } - - var chartX = e.chartX, - chartY = e.chartY, - isOutsidePlot = !isInsidePlot(chartX - plotLeft, chartY - plotTop); - - // on touch devices, only trigger click if a handler is defined - if (hasTouch && e.type == 'touchstart') { - if (attr(e.target, 'isTracker')) { - if (!chart.runTrackerClick) { - e.preventDefault(); - } - } else if (!runChartClick && !isOutsidePlot) { - e.preventDefault(); - } - } - - // cancel on mouse outside - if (isOutsidePlot) { - - if (!lastWasOutsidePlot) { - // reset the tracker - resetTracker(); - } - - // drop the selection if any and reset mouseIsDown and hasDragged - //drop(); - if (chartX < plotLeft) { - chartX = plotLeft; - } else if (chartX > plotLeft + plotWidth) { - chartX = plotLeft + plotWidth; - } - - if (chartY < plotTop) { - chartY = plotTop; - } else if (chartY > plotTop + plotHeight) { - chartY = plotTop + plotHeight; - } - - } - - if (mouseIsDown && e.type != 'touchstart') { // make selection - - // determine if the mouse has moved more than 10px - if ((hasDragged = Math.sqrt( - Math.pow(mouseDownX - chartX, 2) + - Math.pow(mouseDownY - chartY, 2) - ) > 10)) { - - // make a selection - if (hasCartesianSeries && (zoomX || zoomY) && - isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop)) { - if (!selectionMarker) { - selectionMarker = renderer.rect( - plotLeft, - plotTop, - zoomHor ? 1 : plotWidth, - zoomVert ? 1 : plotHeight, - 0 - ) - .attr({ - fill: 'rgba(69,114,167,0.25)', - zIndex: 7 - }) - .add(); - } - } - - // adjust the width of the selection marker - if (selectionMarker && zoomHor) { - var xSize = chartX - mouseDownX; - selectionMarker.attr({ - width: mathAbs(xSize), - x: (xSize > 0 ? 0 : xSize) + mouseDownX - }); - } - // adjust the height of the selection marker - if (selectionMarker && zoomVert) { - var ySize = chartY - mouseDownY; - selectionMarker.attr({ - height: mathAbs(ySize), - y: (ySize > 0 ? 0 : ySize) + mouseDownY - }); - } - } - - } else if (!isOutsidePlot) { - // show the tooltip - onmousemove(e); - } - - lastWasOutsidePlot = isOutsidePlot; - - // when outside plot, allow touch-drag by returning true - return isOutsidePlot || !hasCartesianSeries; - }; - - /* - * When the mouse enters the container, run mouseMove - */ - container.onmousemove = mouseMove; - - /* - * When the mouse leaves the container, hide the tracking (tooltip). - */ - addEvent(container, 'mouseleave', resetTracker); - - - container.ontouchstart = function(e) { - // For touch devices, use touchmove to zoom - if (zoomX || zoomY) { - container.onmousedown(e); - } - // Show tooltip and prevent the lower mouse pseudo event - mouseMove(e); - }; - - /* - * Allow dragging the finger over the chart to read the values on touch - * devices - */ - container.ontouchmove = mouseMove; - - /* - * Allow dragging the finger over the chart to read the values on touch - * devices - */ - container.ontouchend = function() { - if (hasDragged) { - resetTracker(); - } - }; - - - // MooTools 1.2.3 doesn't fire this in IE when using addEvent - container.onclick = function(e) { - var hoverPoint = chart.hoverPoint; - e = normalizeMouseEvent(e); - - e.cancelBubble = true; // IE specific - - - if (!hasDragged) { - if (hoverPoint && attr(e.target, 'isTracker')) { - var plotX = hoverPoint.plotX, - plotY = hoverPoint.plotY; - - // add page position info - extend(hoverPoint, { - pageX: chartPosition.left + plotLeft + - (inverted ? plotWidth - plotY : plotX), - pageY: chartPosition.top + plotTop + - (inverted ? plotHeight - plotX : plotY) - }); - - // the series click event - fireEvent(hoverPoint.series, 'click', extend(e, { - point: hoverPoint - })); - - // the point click event - hoverPoint.firePointEvent('click', e); - - } else { - extend(e, getMouseCoordinates(e)); - - // fire a click event in the chart - if (isInsidePlot(e.chartX - plotLeft, e.chartY - plotTop)) { - fireEvent(chart, 'click', e); - } - } - - - } - // reset mouseIsDown and hasDragged - hasDragged = false; - }; - - } - - /** - * Create the image map that listens for mouseovers - */ - placeTrackerGroup = function() { - - // first create - plot positions is not final at this stage - if (!trackerGroup) { - chart.trackerGroup = trackerGroup = renderer.g('tracker') - .attr({ zIndex: 9 }) - .add(); - - // then position - this happens on load and after resizing and changing - // axis or box positions - } else { - trackerGroup.translate(plotLeft, plotTop); - if (inverted) { - trackerGroup.attr({ - width: chart.plotWidth, - height: chart.plotHeight - }).invert(); - } - } - }; - - - // Run MouseTracker - placeTrackerGroup(); - if (options.enabled) { - chart.tooltip = tooltip = Tooltip(options); - } - - setDOMEvents(); - - // set the fixed interval ticking for the smooth tooltip - tooltipInterval = setInterval(function() { - if (tooltipTick) { - tooltipTick(); - } - }, 32); - - // expose properties - extend(this, { - zoomX: zoomX, - zoomY: zoomY, - resetTracker: resetTracker - }); - } - - - - /** - * The overview of the chart's series - * @param {Object} chart - */ - var Legend = function(chart) { - - var options = chart.options.legend; - - if (!options.enabled) { - return; - } - - var horizontal = options.layout == 'horizontal', - symbolWidth = options.symbolWidth, - symbolPadding = options.symbolPadding, - allItems, - style = options.style, - itemStyle = options.itemStyle, - itemHoverStyle = options.itemHoverStyle, - itemHiddenStyle = options.itemHiddenStyle, - padding = pInt(style.padding), - rightPadding = 20, - //lineHeight = options.lineHeight || 16, - y = 18, - initialItemX = 4 + padding + symbolWidth + symbolPadding, - itemX, - itemY, - lastItemY, - itemHeight = 0, - box, - legendBorderWidth = options.borderWidth, - legendBackgroundColor = options.backgroundColor, - legendGroup, - offsetWidth, - widthOption = options.width, - series = chart.series, - reversedLegend = options.reversed; - - - - /** - * Set the colors for the legend item - * @param {Object} item A Series or Point instance - * @param {Object} visible Dimmed or colored - */ - function colorizeItem(item, visible) { - var legendItem = item.legendItem, - legendLine = item.legendLine, - legendSymbol = item.legendSymbol, - hiddenColor = itemHiddenStyle.color, - textColor = visible ? options.itemStyle.color : hiddenColor, - symbolColor = visible ? item.color : hiddenColor; - if (legendItem) { - legendItem.css({ fill: textColor }); - } - if (legendLine) { - legendLine.attr({ stroke: symbolColor }); - } - if (legendSymbol) { - legendSymbol.attr({ - stroke: symbolColor, - fill: symbolColor - }); - } - } - - /** - * Position the legend item - * @param {Object} item A Series or Point instance - * @param {Object} visible Dimmed or colored - */ - function positionItem(item, itemX, itemY) { - var legendItem = item.legendItem, - legendLine = item.legendLine, - legendSymbol = item.legendSymbol, - checkbox = item.checkbox; - if (legendItem) { - legendItem.attr({ - x: itemX, - y: itemY - }); - } - if (legendLine) { - legendLine.translate(itemX, itemY - 4); - } - if (legendSymbol) { - legendSymbol.attr({ - x: itemX + legendSymbol.xOff, - y: itemY + legendSymbol.yOff - }); - } - if (checkbox) { - checkbox.x = itemX; - checkbox.y = itemY; - } - } - - /** - * Destroy a single legend item - * @param {Object} item The series or point - */ - function destroyItem(item) { - var checkbox = item.checkbox; - - // pull out from the array - //erase(allItems, item); - - // destroy SVG elements - each(['legendItem', 'legendLine', 'legendSymbol'], function(key) { - if (item[key]) { - item[key].destroy(); - } - }); - - if (checkbox) { - discardElement(item.checkbox); - } - - - } - - - /** - * Position the checkboxes after the width is determined - */ - function positionCheckboxes() { - each(allItems, function(item) { - var checkbox = item.checkbox; - if (checkbox) { - css(checkbox, { - left: (legendGroup.attr('translateX') + item.legendItemWidth + checkbox.x - 40) +PX, - top: (legendGroup.attr('translateY') + checkbox.y - 11) + PX - }); - } - }); - } - - /** - * Render a single specific legend item - * @param {Object} item A series or point - */ - function renderItem(item) { - var bBox, - itemWidth, - legendSymbol, - symbolX, - symbolY, - attribs, - simpleSymbol, - li = item.legendItem, - series = item.series || item, - i = allItems.length; - - - if (!li) { // generate it once, later move it - - // let these series types use a simple symbol - simpleSymbol = /^(bar|pie|area|column)$/.test(series.type); - - // generate the list item text - item.legendItem = li = renderer.text( - options.labelFormatter.call(item), - 0, - 0 - ) - .css(item.visible ? itemStyle : itemHiddenStyle) - .on('mouseover', function() { - item.setState(HOVER_STATE); - li.css(itemHoverStyle); - }) - .on('mouseout', function() { - li.css(item.visible ? itemStyle : itemHiddenStyle); - item.setState(); - }) - .on('click', function(event) { - var strLegendItemClick = 'legendItemClick', - fnLegendItemClick = function() { - item.setVisible(); - }; - - // click the name or symbol - if (item.firePointEvent) { // point - item.firePointEvent(strLegendItemClick, null, fnLegendItemClick); - } else { - fireEvent(item, strLegendItemClick, null, fnLegendItemClick); - } - }) - .attr({ zIndex: 2 }) - .add(legendGroup); - - // draw the line - if (!simpleSymbol && item.options && item.options.lineWidth) { - var itemOptions = item.options; - attribs = { - 'stroke-width': itemOptions.lineWidth, - zIndex: 2 - }; - if (itemOptions.dashStyle) { - attribs.dashstyle = itemOptions.dashStyle; - } - item.legendLine = renderer.path([ - M, - -symbolWidth - symbolPadding, - 0, - L, - -symbolPadding, - 0 - ]) - .attr(attribs) - .add(legendGroup); - } - - // draw a simple symbol - if (simpleSymbol) { // bar|pie|area|column - //legendLayer.drawRect( - legendSymbol = renderer.rect( - (symbolX = -symbolWidth - symbolPadding), - (symbolY = -11), - symbolWidth, - 12, - 2 - ).attr({ - 'stroke-width': 0, - zIndex: 3 - }).add(legendGroup); - } - - // draw the marker - else if (item.options && item.options.marker && item.options.marker.enabled) { - legendSymbol = renderer.symbol( - item.symbol, - (symbolX = -symbolWidth / 2 - symbolPadding), - (symbolY = -4), - item.options.marker.radius - ) - .attr(item.pointAttr[NORMAL_STATE]) - .attr({ zIndex: 3 }) - .add(legendGroup); - - - } - if (legendSymbol) { - legendSymbol.xOff = symbolX; - legendSymbol.yOff = symbolY; - } - - item.legendSymbol = legendSymbol; - - // colorize the items - colorizeItem(item, item.visible); - - - // add the HTML checkbox on top - if (item.options && item.options.showCheckbox) { - item.checkbox = createElement('input', { - type: 'checkbox', - checked: item.selected, - defaultChecked: item.selected // required by IE7 - }, options.itemCheckboxStyle, container); - - addEvent(item.checkbox, 'click', function(event) { - var target = event.target; - fireEvent(item, 'checkboxClick', { - checked: target.checked - }, - function() { - item.select(); - } - ); - }); - } - } - - - // calculate the positions for the next line - bBox = li.getBBox(); - - itemWidth = item.legendItemWidth = - options.itemWidth || symbolWidth + symbolPadding + bBox.width + rightPadding; - itemHeight = bBox.height; - - // if the item exceeds the width, start a new line - if (horizontal && itemX - initialItemX + itemWidth > - (widthOption || (chartWidth - 2 * padding - initialItemX))) { - itemX = initialItemX; - itemY += itemHeight; - } - lastItemY = itemY; - - // position the newly generated or reordered items - positionItem(item, itemX, itemY); - - // advance - if (horizontal) { - itemX += itemWidth; - } else { - itemY += itemHeight; - } - - // the width of the widest item - offsetWidth = widthOption || mathMax( - horizontal ? itemX - initialItemX : itemWidth, - offsetWidth - ); - - - - // add it all to an array to use below - allItems.push(item); - } - - /** - * Render the legend. This method can be called both before and after - * chart.render. If called after, it will only rearrange items instead - * of creating new ones. - */ - function renderLegend() { - itemX = initialItemX; - itemY = y; - offsetWidth = 0; - lastItemY = 0; - - allItems = []; - - if (!legendGroup) { - legendGroup = renderer.g('legend') - .attr({ zIndex: 7 }) - .add(); - } - - - // add HTML for each series - if (reversedLegend) { - series.reverse(); - } - each(series, function(serie) { - if (!serie.options.showInLegend) { - return; - } - - // use points or series for the legend item depending on legendType - var items = (serie.options.legendType == 'point') ? - serie.data : [serie]; - - // render all items - each(items, renderItem); - }); - if (reversedLegend) { // restore - series.reverse(); - } - - - - // Draw the border - legendWidth = widthOption || offsetWidth; - legendHeight = lastItemY - y + itemHeight; - - if (legendBorderWidth || legendBackgroundColor) { - legendWidth += 2 * padding; - legendHeight += 2 * padding; - - if (!box) { - box = renderer.rect( - 0, - 0, - legendWidth, - legendHeight, - options.borderRadius, - legendBorderWidth || 0 - ).attr({ - stroke: options.borderColor, - 'stroke-width': legendBorderWidth || 0, - fill: legendBackgroundColor || NONE - }) - .add(legendGroup) - .shadow(options.shadow); - - } else if (legendWidth > 0 && legendHeight > 0) { - box.animate( - box.crisp(null, null, null, legendWidth, legendHeight) - ); - } - - // hide the border if no items - box[allItems.length ? 'show' : 'hide'](); - } - - // 1.x compatibility: positioning based on style - var props = ['left', 'right', 'top', 'bottom'], - prop, - i = 4; - while(i--) { - prop = props[i]; - if (style[prop] && style[prop] != 'auto') { - options[i < 2 ? 'align' : 'verticalAlign'] = prop; - options[i < 2 ? 'x' : 'y'] = pInt(style[prop]) * (i % 2 ? -1 : 1); - } - } - - legendGroup.align(extend(options, { - width: legendWidth, - height: legendHeight - }), true, spacingBox); - - if (!isResizing) { - positionCheckboxes(); - } - } - - - // run legend - renderLegend(); - - // move checkboxes - addEvent(chart, 'endResize', positionCheckboxes); - - // expose - return { - colorizeItem: colorizeItem, - destroyItem: destroyItem, - renderLegend: renderLegend - }; - }; - - - - - - - /** - * Initialize an individual series, called internally before render time - */ - function initSeries(options) { - var type = options.type || optionsChart.type || optionsChart.defaultSeriesType, - typeClass = seriesTypes[type], - serie, - hasRendered = chart.hasRendered; - - // an inverted chart can't take a column series and vice versa - if (hasRendered) { - if (inverted && type == 'column') { - typeClass = seriesTypes.bar; - } else if (!inverted && type == 'bar') { - typeClass = seriesTypes.column; - } - } - - serie = new typeClass(); - - serie.init(chart, options); - - // set internal chart properties - if (!hasRendered && serie.inverted) { - inverted = true; - } - if (serie.isCartesian) { - hasCartesianSeries = serie.isCartesian; - } - - series.push(serie); - - return serie; - } - - /** - * Add a series dynamically after time - * - * @param {Object} options The config options - * @param {Boolean} redraw Whether to redraw the chart after adding. Defaults to true. - * @param {Boolean|Object} animation Whether to apply animation, and optionally animation - * configuration - * - * @return {Object} series The newly created series object - */ - function addSeries(options, redraw, animation) { - var series; - - if (options) { - setAnimation(animation, chart); - redraw = pick(redraw, true); // defaults to true - - fireEvent(chart, 'addSeries', { options: options }, function() { - series = initSeries(options); - series.isDirty = true; - - chart.isDirtyLegend = true; // the series array is out of sync with the display - if (redraw) { - chart.redraw(); - } - }); - } - - return series; - } - - /** - * Check whether a given point is within the plot area - * - * @param {Number} x Pixel x relative to the coordinateSystem - * @param {Number} y Pixel y relative to the coordinateSystem - */ - isInsidePlot = function(x, y) { - return x >= 0 && - x <= plotWidth && - y >= 0 && - y <= plotHeight; - }; - - /** - * Adjust all axes tick amounts - */ - function adjustTickAmounts() { - if (optionsChart.alignTicks !== false) { - each(axes, function(axis) { - axis.adjustTickAmount(); - }); - } - maxTicks = null; - } - - /** - * Redraw legend, axes or series based on updated data - * - * @param {Boolean|Object} animation Whether to apply animation, and optionally animation - * configuration - */ - function redraw(animation) { - var redrawLegend = chart.isDirtyLegend, - hasStackedSeries, - isDirtyBox = chart.isDirtyBox, // todo: check if it has actually changed? - seriesLength = series.length, - i = seriesLength, - clipRect = chart.clipRect, - serie; - - setAnimation(animation, chart); - - // link stacked series - while (i--) { - serie = series[i]; - if (serie.isDirty && serie.options.stacking) { - hasStackedSeries = true; - break; - } - } - if (hasStackedSeries) { // mark others as dirty - i = seriesLength; - while (i--) { - serie = series[i]; - if (serie.options.stacking) { - serie.isDirty = true; - } - } - } - - // handle updated data in the series - each(series, function(serie) { - if (serie.isDirty) { // prepare the data so axis can read it - serie.cleanData(); - serie.getSegments(); - - if (serie.options.legendType == 'point') { - redrawLegend = true; - } - } - }); - - // handle added or removed series - if (redrawLegend && legend.renderLegend) { // series or pie points are added or removed - // draw legend graphics - legend.renderLegend(); - - chart.isDirtyLegend = false; - } - - if (hasCartesianSeries) { - if (!isResizing) { - - // reset maxTicks - maxTicks = null; - - // set axes scales - each(axes, function(axis) { - axis.setScale(); - }); - } - adjustTickAmounts(); - getMargins(); - - // redraw axes - each(axes, function(axis) { - if (axis.isDirty || isDirtyBox) { - axis.redraw(); - isDirtyBox = true; // always redraw box to reflect changes in the axis labels - } - }); - - - } - - // the plot areas size has changed - if (isDirtyBox) { - drawChartBox(); - placeTrackerGroup(); - - // move clip rect - if (clipRect) { - stop(clipRect); - clipRect.animate({ // for chart resize - width: chart.plotSizeX, - height: chart.plotSizeY - }); - } - - } - - - // redraw affected series - each(series, function(serie) { - if (serie.isDirty && serie.visible && - (!serie.isCartesian || serie.xAxis)) { // issue #153 - serie.redraw(); - } - }); - - - // hide tooltip and hover states - if (tracker && tracker.resetTracker) { - tracker.resetTracker(); - } - - // fire the event - fireEvent(chart, 'redraw'); - } - - - - /** - * Dim the chart and show a loading text or symbol - * @param {String} str An optional text to show in the loading label instead of the default one - */ - function showLoading(str) { - var loadingOptions = options.loading; - - // create the layer at the first call - if (!loadingDiv) { - loadingDiv = createElement(DIV, { - className: 'highcharts-loading' - }, extend(loadingOptions.style, { - left: plotLeft + PX, - top: plotTop + PX, - width: plotWidth + PX, - height: plotHeight + PX, - zIndex: 10, - display: NONE - }), container); - - loadingSpan = createElement( - 'span', - null, - loadingOptions.labelStyle, - loadingDiv - ); - - } - - // update text - loadingSpan.innerHTML = str || options.lang.loading; - - // show it - if (!loadingShown) { - css(loadingDiv, { opacity: 0, display: '' }); - animate(loadingDiv, { - opacity: loadingOptions.style.opacity - }, { - duration: loadingOptions.showDuration - }); - loadingShown = true; - } - } - /** - * Hide the loading layer - */ - function hideLoading() { - animate(loadingDiv, { - opacity: 0 - }, { - duration: options.loading.hideDuration, - complete: function() { - css(loadingDiv, { display: NONE }); - } - }); - loadingShown = false; - } - - /** - * Get an axis, series or point object by id. - * @param id {String} The id as given in the configuration options - */ - function get(id) { - var i, - j, - data; - - // search axes - for (i = 0; i < axes.length; i++) { - if (axes[i].options.id == id) { - return axes[i]; - } - } - - // search series - for (i = 0; i < series.length; i++) { - if (series[i].options.id == id) { - return series[i]; - } - } - - // search points - for (i = 0; i < series.length; i++) { - data = series[i].data; - for (j = 0; j < data.length; j++) { - if (data[j].id == id) { - return data[j]; - } - } - } - return null; - } - - /** - * Create the Axis instances based on the config options - */ - function getAxes() { - var xAxisOptions = options.xAxis || {}, - yAxisOptions = options.yAxis || {}, - axis; - - // make sure the options are arrays and add some members - xAxisOptions = splat(xAxisOptions); - each(xAxisOptions, function(axis, i) { - axis.index = i; - axis.isX = true; - }); - - yAxisOptions = splat(yAxisOptions); - each(yAxisOptions, function(axis, i) { - axis.index = i; - }); - - // concatenate all axis options into one array - axes = xAxisOptions.concat(yAxisOptions); - - // loop the options and construct axis objects - chart.xAxis = []; - chart.yAxis = []; - axes = map(axes, function(axisOptions) { - axis = new Axis(chart, axisOptions); - chart[axis.isXAxis ? 'xAxis' : 'yAxis'].push(axis); - - return axis; - }); - - adjustTickAmounts(); - } - - - /** - * Get the currently selected points from all series - */ - function getSelectedPoints() { - var points = []; - each(series, function(serie) { - points = points.concat( grep( serie.data, function(point) { - return point.selected; - })); - }); - return points; - } - - /** - * Get the currently selected series - */ - function getSelectedSeries() { - return grep(series, function (serie) { - return serie.selected; - }); - } - - /** - * Zoom out to 1:1 - */ - zoomOut = function () { - fireEvent(chart, 'selection', { resetSelection: true }, zoom); - chart.toolbar.remove('zoom'); - - }; - /** - * Zoom into a given portion of the chart given by axis coordinates - * @param {Object} event - */ - zoom = function (event) { - - // add button to reset selection - var lang = defaultOptions.lang, - animate = chart.pointCount < 100; - chart.toolbar.add('zoom', lang.resetZoom, lang.resetZoomTitle, zoomOut); - - // if zoom is called with no arguments, reset the axes - if (!event || event.resetSelection) { - each(axes, function(axis) { - axis.setExtremes(null, null, false, animate); - }); - } - - // else, zoom in on all axes - else { - each(event.xAxis.concat(event.yAxis), function(axisData) { - var axis = axisData.axis; - - // don't zoom more than maxZoom - if (chart.tracker[axis.isXAxis ? 'zoomX' : 'zoomY']) { - axis.setExtremes(axisData.min, axisData.max, false, animate); - } - }); - } - - // redraw chart - redraw(); - }; - - /** - * Show the title and subtitle of the chart - * - * @param titleOptions {Object} New title options - * @param subtitleOptions {Object} New subtitle options - * - */ - function setTitle (titleOptions, subtitleOptions) { - - chartTitleOptions = merge(options.title, titleOptions); - chartSubtitleOptions = merge(options.subtitle, subtitleOptions); - - // add title and subtitle - each([ - ['title', titleOptions, chartTitleOptions], - ['subtitle', subtitleOptions, chartSubtitleOptions] - ], function(arr) { - var name = arr[0], - title = chart[name], - titleOptions = arr[1], - chartTitleOptions = arr[2]; - - if (title && titleOptions) { - title.destroy(); // remove old - title = null; - } - if (chartTitleOptions && chartTitleOptions.text && !title) { - chart[name] = renderer.text( - chartTitleOptions.text, - 0, - 0 - ) - .attr({ - align: chartTitleOptions.align, - 'class': 'highcharts-'+ name, - zIndex: 1 - }) - .css(chartTitleOptions.style) - .add() - .align(chartTitleOptions, false, spacingBox); - } - }); - - } - - /** - * Get chart width and height according to options and container size - */ - function getChartSize() { - - containerWidth = (renderToClone || renderTo).offsetWidth; - containerHeight = (renderToClone || renderTo).offsetHeight; - chart.chartWidth = chartWidth = optionsChart.width || containerWidth || 600; - chart.chartHeight = chartHeight = optionsChart.height || - // the offsetHeight of an empty container is 0 in standard browsers, but 19 in IE7: - (containerHeight > 19 ? containerHeight : 400); - } - - - /** - * Get the containing element, determine the size and create the inner container - * div to hold the chart - */ - function getContainer() { - renderTo = optionsChart.renderTo; - containerId = PREFIX + idCounter++; - - if (isString(renderTo)) { - renderTo = doc.getElementById(renderTo); - } - - // remove previous chart - renderTo.innerHTML = ''; - - // If the container doesn't have an offsetWidth, it has or is a child of a node - // that has display:none. We need to temporarily move it out to a visible - // state to determine the size, else the legend and tooltips won't render - // properly - if (!renderTo.offsetWidth) { - renderToClone = renderTo.cloneNode(0); - css(renderToClone, { - position: ABSOLUTE, - top: '-9999px', - display: '' - }); - doc.body.appendChild(renderToClone); - } - - // get the width and height - getChartSize(); - - // create the inner container - chart.container = container = createElement(DIV, { - className: 'highcharts-container' + - (optionsChart.className ? ' '+ optionsChart.className : ''), - id: containerId - }, extend({ - position: RELATIVE, - overflow: HIDDEN, // needed for context menu (avoid scrollbars) and - // content overflow in IE - width: chartWidth + PX, - height: chartHeight + PX, - textAlign: 'left' - }, optionsChart.style), - renderToClone || renderTo - ); - - chart.renderer = renderer = - optionsChart.forExport ? // force SVG, used for SVG export - new SVGRenderer(container, chartWidth, chartHeight, true) : - new Renderer(container, chartWidth, chartHeight); - - // Issue 110 workaround: - // In Firefox, if a div is positioned by percentage, its pixel position may land - // between pixels. The container itself doesn't display this, but an SVG element - // inside this container will be drawn at subpixel precision. In order to draw - // sharp lines, this must be compensated for. This doesn't seem to work inside - // iframes though (like in jsFiddle). - var subPixelFix, rect; - if (isFirefox && container.getBoundingClientRect) { - subPixelFix = function() { - css(container, { left: 0, top: 0 }); - rect = container.getBoundingClientRect(); - css(container, { - left: (-rect.left % 1) + PX, - top: (-rect.top % 1) + PX - }); - }; - - // run the fix now - subPixelFix(); - - // run it on resize - addEvent(win, 'resize', subPixelFix); - - // remove it on chart destroy - addEvent(chart, 'destroy', function() { - removeEvent(win, 'resize', subPixelFix); - }); - } - } - - /** - * Calculate margins by rendering axis labels in a preliminary position. Title, - * subtitle and legend have already been rendered at this stage, but will be - * moved into their final positions - */ - getMargins = function() { - var legendOptions = options.legend, - legendMargin = pick(legendOptions.margin, 10), - legendX = legendOptions.x, - legendY = legendOptions.y, - align = legendOptions.align, - verticalAlign = legendOptions.verticalAlign, - titleOffset; - - resetMargins(); - - // adjust for title and subtitle - if ((chart.title || chart.subtitle) && !defined(optionsMarginTop)) { - titleOffset = mathMax( - chart.title && !chartTitleOptions.floating && !chartTitleOptions.verticalAlign && chartTitleOptions.y || 0, - chart.subtitle && !chartSubtitleOptions.floating && !chartSubtitleOptions.verticalAlign && chartSubtitleOptions.y || 0 - ); - if (titleOffset) { - plotTop = mathMax(plotTop, titleOffset + pick(chartTitleOptions.margin, 15) + spacingTop); - } - } - // adjust for legend - if (legendOptions.enabled && !legendOptions.floating) { - if (align == 'right') { // horizontal alignment handled first - if (!defined(optionsMarginRight)) { - marginRight = mathMax( - marginRight, - legendWidth - legendX + legendMargin + spacingRight - ); - } - } else if (align == 'left') { - if (!defined(optionsMarginLeft)) { - plotLeft = mathMax( - plotLeft, - legendWidth + legendX + legendMargin + spacingLeft - ); - } - - } else if (verticalAlign == 'top') { - if (!defined(optionsMarginTop)) { - plotTop = mathMax( - plotTop, - legendHeight + legendY + legendMargin + spacingTop - ); - } - - } else if (verticalAlign == 'bottom') { - if (!defined(optionsMarginBottom)) { - marginBottom = mathMax( - marginBottom, - legendHeight - legendY + legendMargin + spacingBottom - ); - } - } - } - - // pre-render axes to get labels offset width - if (hasCartesianSeries) { - each(axes, function(axis) { - axis.getOffset(); - }); - } - - if (!defined(optionsMarginLeft)) { - plotLeft += axisOffset[3]; - } - if (!defined(optionsMarginTop)) { - plotTop += axisOffset[0]; - } - if (!defined(optionsMarginBottom)) { - marginBottom += axisOffset[2]; - } - if (!defined(optionsMarginRight)) { - marginRight += axisOffset[1]; - } - - setChartSize(); - - }; - - /** - * Add the event handlers necessary for auto resizing - * - */ - function initReflow() { - var reflowTimeout; - function reflow() { - var width = optionsChart.width || renderTo.offsetWidth, - height = optionsChart.height || renderTo.offsetHeight; - - if (width && height) { // means container is display:none - if (width != containerWidth || height != containerHeight) { - clearTimeout(reflowTimeout); - reflowTimeout = setTimeout(function() { - resize(width, height, false); - }, 100); - } - containerWidth = width; - containerHeight = height; - } - } - addEvent(window, 'resize', reflow); - addEvent(chart, 'destroy', function() { - removeEvent(window, 'resize', reflow); - }); - } - - /** - * Resize the chart to a given width and height - * @param {Number} width - * @param {Number} height - * @param {Object|Boolean} animation - */ - resize = function(width, height, animation) { - var chartTitle = chart.title, - chartSubtitle = chart.subtitle; - - isResizing += 1; - - // set the animation for the current process - setAnimation(animation, chart); - - oldChartHeight = chartHeight; - oldChartWidth = chartWidth; - chartWidth = mathRound(width); - chartHeight = mathRound(height); - - css(container, { - width: chartWidth + PX, - height: chartHeight + PX - }); - renderer.setSize(chartWidth, chartHeight, animation); - - // update axis lengths for more correct tick intervals: - plotWidth = chartWidth - plotLeft - marginRight; - plotHeight = chartHeight - plotTop - marginBottom; - - // handle axes - maxTicks = null; - each(axes, function(axis) { - axis.isDirty = true; - axis.setScale(); - }); - - // make sure non-cartesian series are also handled - each(series, function(serie) { - serie.isDirty = true; - }); - - chart.isDirtyLegend = true; // force legend redraw - chart.isDirtyBox = true; // force redraw of plot and chart border - - getMargins(); - - // move titles - if (chartTitle) { - chartTitle.align(null, null, spacingBox); - } - if (chartSubtitle) { - chartSubtitle.align(null, null, spacingBox); - } - - redraw(animation); - - - oldChartHeight = null; - fireEvent(chart, 'resize'); - - // fire endResize and set isResizing back - setTimeout(function() { - fireEvent(chart, 'endResize', null, function() { - isResizing -= 1; - }); - }, globalAnimation && globalAnimation.duration || 500); - }; - - /** - * Set the public chart properties. This is done before and after the pre-render - * to determine margin sizes - */ - setChartSize = function() { - - chart.plotLeft = plotLeft = mathRound(plotLeft); - chart.plotTop = plotTop = mathRound(plotTop); - chart.plotWidth = plotWidth = mathRound(chartWidth - plotLeft - marginRight); - chart.plotHeight = plotHeight = mathRound(chartHeight - plotTop - marginBottom); - - chart.plotSizeX = inverted ? plotHeight : plotWidth; - chart.plotSizeY = inverted ? plotWidth : plotHeight; - - spacingBox = { - x: spacingLeft, - y: spacingTop, - width: chartWidth - spacingLeft - spacingRight, - height: chartHeight - spacingTop - spacingBottom - }; - }; - - /** - * Initial margins before auto size margins are applied - */ - resetMargins = function() { - plotTop = pick(optionsMarginTop, spacingTop); - marginRight = pick(optionsMarginRight, spacingRight); - marginBottom = pick(optionsMarginBottom, spacingBottom); - plotLeft = pick(optionsMarginLeft, spacingLeft); - axisOffset = [0, 0, 0, 0]; // top, right, bottom, left - }; - - /** - * Draw the borders and backgrounds for chart and plot area - */ - drawChartBox = function() { - var chartBorderWidth = optionsChart.borderWidth || 0, - chartBackgroundColor = optionsChart.backgroundColor, - plotBackgroundColor = optionsChart.plotBackgroundColor, - plotBackgroundImage = optionsChart.plotBackgroundImage, - mgn, - plotSize = { - x: plotLeft, - y: plotTop, - width: plotWidth, - height: plotHeight - }; - - // Chart area - mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0); - - if (chartBorderWidth || chartBackgroundColor) { - if (!chartBackground) { - chartBackground = renderer.rect(mgn / 2, mgn / 2, chartWidth - mgn, chartHeight - mgn, - optionsChart.borderRadius, chartBorderWidth) - .attr({ - stroke: optionsChart.borderColor, - 'stroke-width': chartBorderWidth, - fill: chartBackgroundColor || NONE - }) - .add() - .shadow(optionsChart.shadow); - } else { // resize - chartBackground.animate( - chartBackground.crisp(null, null, null, chartWidth - mgn, chartHeight - mgn) - ); - } - } - - - // Plot background - if (plotBackgroundColor) { - if (!plotBackground) { - plotBackground = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0) - .attr({ - fill: plotBackgroundColor - }) - .add() - .shadow(optionsChart.plotShadow); - } else { - plotBackground.animate(plotSize); - } - } - if (plotBackgroundImage) { - if (!plotBGImage) { - plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight) - .add(); - } else { - plotBGImage.animate(plotSize); - } - } - - // Plot area border - if (optionsChart.plotBorderWidth) { - if (!plotBorder) { - plotBorder = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0, optionsChart.plotBorderWidth) - .attr({ - stroke: optionsChart.plotBorderColor, - 'stroke-width': optionsChart.plotBorderWidth, - zIndex: 4 - }) - .add(); - } else { - plotBorder.animate( - plotBorder.crisp(null, plotLeft, plotTop, plotWidth, plotHeight) - ); - } - } - - // reset - chart.isDirtyBox = false; - }; - - /** - * Render all graphics for the chart - */ - function render () { - var labels = options.labels, - credits = options.credits, - creditsHref; - - // Title - setTitle(); - - - // Legend - legend = chart.legend = new Legend(chart); - - // Get margins by pre-rendering axes - getMargins(); - each(axes, function(axis) { - axis.setTickPositions(true); // update to reflect the new margins - }); - adjustTickAmounts(); - getMargins(); // second pass to check for new labels - - - // Draw the borders and backgrounds - drawChartBox(); - - // Axes - if (hasCartesianSeries) { - each(axes, function(axis) { - axis.render(); - }); - } - - - // The series - if (!chart.seriesGroup) { - chart.seriesGroup = renderer.g('series-group') - .attr({ zIndex: 3 }) - .add(); - } - each(series, function(serie) { - serie.translate(); - serie.setTooltipPoints(); - serie.render(); - }); - - - // Labels - if (labels.items) { - each(labels.items, function() { - var style = extend(labels.style, this.style), - x = pInt(style.left) + plotLeft, - y = pInt(style.top) + plotTop + 12; - - // delete to prevent rewriting in IE - delete style.left; - delete style.top; - - renderer.text( - this.html, - x, - y - ) - .attr({ zIndex: 2 }) - .css(style) - .add(); - - }); - } - - // Toolbar (don't redraw) - if (!chart.toolbar) { - chart.toolbar = Toolbar(chart); - } - - // Credits - if (credits.enabled && !chart.credits) { - creditsHref = credits.href; - renderer.text( - credits.text, - 0, - 0 - ) - .on('click', function() { - if (creditsHref) { - location.href = creditsHref; - } - }) - .attr({ - align: credits.position.align, - zIndex: 8 - }) - .css(credits.style) - .add() - .align(credits.position); - } - - placeTrackerGroup(); - - // Set flag - chart.hasRendered = true; - - // If the chart was rendered outside the top container, put it back in - if (renderToClone) { - renderTo.appendChild(container); - discardElement(renderToClone); - //updatePosition(container); - } - } - - /** - * Clean up memory usage - */ - function destroy() { - var i = series.length, - parentNode = container && container.parentNode; - - // fire the chart.destoy event - fireEvent(chart, 'destroy'); - - // remove events - removeEvent(win, 'unload', destroy); - removeEvent(chart); - - each(axes, function(axis) { - removeEvent(axis); - }); - - // destroy each series - while (i--) { - series[i].destroy(); - } - - // remove container and all SVG - if (container) { // can break in IE when destroyed before finished loading - container.innerHTML = ''; - removeEvent(container); - if (parentNode) { - parentNode.removeChild(container); - } - - // IE6 leak - container = null; - } - - // IE7 leak - if (renderer) { // can break in IE when destroyed before finished loading - renderer.alignedObjects = null; - } - - // memory and CPU leak - clearInterval(tooltipInterval); - - // clean it all up - for (i in chart) { - delete chart[i]; - } - - } - /** - * Prepare for first rendering after all data are loaded - */ - function firstRender() { - - // VML namespaces can't be added until after complete. Listening - // for Perini's doScroll hack is not enough. - var onreadystatechange = 'onreadystatechange'; - if (!hasSVG && win == win.top && doc.readyState != 'complete') { - doc.attachEvent(onreadystatechange, function() { - doc.detachEvent(onreadystatechange, firstRender); - firstRender(); - }); - return; - } - - // create the container - getContainer(); - - resetMargins(); - setChartSize(); - - // Initialize the series - each(options.series || [], function(serieOptions) { - initSeries(serieOptions); - }); - - // Set the common inversion and transformation for inverted series after initSeries - chart.inverted = inverted = pick(inverted, options.chart.inverted); - - - getAxes(); - - - chart.render = render; - - // depends on inverted and on margins being set - chart.tracker = tracker = new MouseTracker(chart, options.tooltip); - - //globalAnimation = false; - render(); - - fireEvent(chart, 'load'); - - //globalAnimation = true; - - // run callbacks - if (callback) { - callback.apply(chart, [chart]); - } - each(chart.callbacks, function(fn) { - fn.apply(chart, [chart]); - }); - } - - // Run chart - - - - // Set to zero for each new chart - colorCounter = 0; - symbolCounter = 0; - - // Destroy the chart and free up memory. - addEvent(win, 'unload', destroy); - - // Set up auto resize - if (optionsChart.reflow !== false) { - addEvent(chart, 'load', initReflow); - } - - // Chart event handlers - if (chartEvents) { - for (eventType in chartEvents) { - addEvent(chart, eventType, chartEvents[eventType]); - } - } - - - chart.options = options; - chart.series = series; - - - - - - - // Expose methods and variables - chart.addSeries = addSeries; - chart.animation = pick(optionsChart.animation, true); - chart.destroy = destroy; - chart.get = get; - chart.getSelectedPoints = getSelectedPoints; - chart.getSelectedSeries = getSelectedSeries; - chart.hideLoading = hideLoading; - chart.isInsidePlot = isInsidePlot; - chart.redraw = redraw; - chart.setSize = resize; - chart.setTitle = setTitle; - chart.showLoading = showLoading; - chart.pointCount = 0; - /* - if ($) $(function() { - $container = $('#container'); - var origChartWidth, - origChartHeight; - if ($container) { - $('') - .insertBefore($container) - .click(function() { - if (origChartWidth === UNDEFINED) { - origChartWidth = chartWidth; - origChartHeight = chartHeight; - } - chart.resize(chartWidth *= 1.1, chartHeight *= 1.1); - }); - $('') - .insertBefore($container) - .click(function() { - if (origChartWidth === UNDEFINED) { - origChartWidth = chartWidth; - origChartHeight = chartHeight; - } - chart.resize(chartWidth *= 0.9, chartHeight *= 0.9); - }); - $('') - .insertBefore($container) - .click(function() { - if (origChartWidth === UNDEFINED) { - origChartWidth = chartWidth; - origChartHeight = chartHeight; - } - chart.resize(origChartWidth, origChartHeight); - }); - } - }) - */ - - - - - firstRender(); - - -} // end Chart - -// Hook for exporting module -Chart.prototype.callbacks = []; - -/** - * The Point object and prototype. Inheritable and used as base for PiePoint - */ -var Point = function() {}; -Point.prototype = { - - /** - * Initialize the point - * @param {Object} series The series object containing this point - * @param {Object} options The data in either number, array or object format - */ - init: function(series, options) { - var point = this, - defaultColors; - point.series = series; - point.applyOptions(options); - point.pointAttr = {}; - - if (series.options.colorByPoint) { - defaultColors = series.chart.options.colors; - if (!point.options) { - point.options = {}; - } - point.color = point.options.color = point.color || defaultColors[colorCounter++]; - - // loop back to zero - if (colorCounter >= defaultColors.length) { - colorCounter = 0; - } - } - - series.chart.pointCount++; - return point; - }, - /** - * Apply the options containing the x and y data and possible some extra properties. - * This is called on point init or from point.update. - * - * @param {Object} options - */ - applyOptions: function(options) { - var point = this, - series = point.series; - - point.config = options; - - // onedimensional array input - if (isNumber(options) || options === null) { - point.y = options; - } - - // object input - else if (isObject(options) && !isNumber(options.length)) { - - // copy options directly to point - extend(point, options); - point.options = options; - } - - // categorized data with name in first position - else if (isString(options[0])) { - point.name = options[0]; - point.y = options[1]; - } - - // two-dimentional array - else if (isNumber(options[0])) { - point.x = options[0]; - point.y = options[1]; - } - - /* - * If no x is set by now, get auto incremented value. All points must have an - * x value, however the y value can be null to create a gap in the series - */ - if (point.x === UNDEFINED) { - point.x = series.autoIncrement(); - } - - }, - - /** - * Destroy a point to clear memory. Its reference still stays in series.data. - */ - destroy: function() { - var point = this, - series = point.series, - prop; - - series.chart.pointCount--; - - if (point == series.chart.hoverPoint) { - point.onMouseOut(); - } - series.chart.hoverPoints = null; // remove reference - - // remove all events - removeEvent(point); - - each(['graphic', 'tracker', 'group', 'dataLabel', 'connector'], function(prop) { - if (point[prop]) { - point[prop].destroy(); - } - }); - - if (point.legendItem) { // pies have legend items - point.series.chart.legend.destroyItem(point); - } - - for (prop in point) { - point[prop] = null; - } - - - }, - - /** - * Toggle the selection status of a point - * @param {Boolean} selected Whether to select or unselect the point. - * @param {Boolean} accumulate Whether to add to the previous selection. By default, - * this happens if the control key (Cmd on Mac) was pressed during clicking. - */ - select: function(selected, accumulate) { - var point = this, - series = point.series, - chart = series.chart; - - point.selected = selected = pick(selected, !point.selected); - - //series.isDirty = true; - point.firePointEvent(selected ? 'select' : 'unselect'); - point.setState(selected && SELECT_STATE); - - // unselect all other points unless Ctrl or Cmd + click - if (!accumulate) { - each(chart.getSelectedPoints(), function (loopPoint) { - if (loopPoint.selected && loopPoint != point) { - loopPoint.selected = false; - loopPoint.setState(NORMAL_STATE); - loopPoint.firePointEvent('unselect'); - } - }); - } - - }, - - onMouseOver: function() { - var point = this, - chart = point.series.chart, - tooltip = chart.tooltip, - hoverPoint = chart.hoverPoint; - - // set normal state to previous series - if (hoverPoint && hoverPoint != point) { - hoverPoint.onMouseOut(); - } - - // trigger the event - point.firePointEvent('mouseOver'); - - // update the tooltip - if (tooltip && !tooltip.shared) { - tooltip.refresh(point); - } - - // hover this - point.setState(HOVER_STATE); - chart.hoverPoint = point; - }, - - onMouseOut: function() { - var point = this; - point.firePointEvent('mouseOut'); - - point.setState(); - point.series.chart.hoverPoint = null; - }, - - /** - * Extendable method for formatting each point's tooltip line - * - * @param {Boolean} useHeader Whether a common header is used for multiple series in the tooltip - * - * @return {String} A string to be concatenated in to the common tooltip text - */ - tooltipFormatter: function(useHeader) { - var point = this, - series = point.series; - - return ['', (point.name || series.name), ': ', - (!useHeader ? ('x = '+ (point.name || point.x) + ', ') : ''), - '', (!useHeader ? 'y = ' : '' ), point.y, '
    '].join(''); - - }, - - /** - * Get the formatted text for this point's data label - * - * @return {String} The formatted data label pseudo-HTML - */ - getDataLabelText: function() { - var point = this; - return this.series.options.dataLabels.formatter.call({ - x: point.x, - y: point.y, - series: point.series, - point: point, - percentage: point.percentage, - total: point.total || point.stackTotal - }); - }, - - /** - * Update the point with new options (typically x/y data) and optionally redraw the series. - * - * @param {Object} options Point options as defined in the series.data array - * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call - * @param {Boolean|Object} animation Whether to apply animation, and optionally animation - * configuration - * - */ - update: function(options, redraw, animation) { - var point = this, - series = point.series, - dataLabel = point.dataLabel, - graphic = point.graphic, - chart = series.chart; - - redraw = pick(redraw, true); - - // fire the event with a default handler of doing the update - point.firePointEvent('update', { options: options }, function() { - - point.applyOptions(options); - - if (dataLabel) { - dataLabel.attr({ - text: point.getDataLabelText() - }) - } - - // update visuals - if (isObject(options)) { - series.getAttribs(); - if (graphic) { - graphic.attr(point.pointAttr[series.state]); - } - } - - // redraw - series.isDirty = true; - if (redraw) { - chart.redraw(animation); - } - }); - }, - - /** - * Remove a point and optionally redraw the series and if necessary the axes - * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call - * @param {Boolean|Object} animation Whether to apply animation, and optionally animation - * configuration - */ - remove: function(redraw, animation) { - var point = this, - series = point.series, - chart = series.chart, - data = series.data; - - setAnimation(animation, chart); - redraw = pick(redraw, true); - - // fire the event with a default handler of removing the point - point.firePointEvent('remove', null, function() { - - erase(data, point); - - point.destroy(); - - - // redraw - series.isDirty = true; - if (redraw) { - chart.redraw(); - } - }); - - - }, - - /** - * Fire an event on the Point object. Must not be renamed to fireEvent, as this - * causes a name clash in MooTools - * @param {String} eventType - * @param {Object} eventArgs Additional event arguments - * @param {Function} defaultFunction Default event handler - */ - firePointEvent: function(eventType, eventArgs, defaultFunction) { - var point = this, - series = this.series, - seriesOptions = series.options; - - // load event handlers on demand to save time on mouseover/out - if (seriesOptions.point.events[eventType] || ( - point.options && point.options.events && point.options.events[eventType])) { - this.importEvents(); - } - - // add default handler if in selection mode - if (eventType == 'click' && seriesOptions.allowPointSelect) { - defaultFunction = function (event) { - // Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera - point.select(null, event.ctrlKey || event.metaKey || event.shiftKey); - }; - } - - fireEvent(this, eventType, eventArgs, defaultFunction); - }, - /** - * Import events from the series' and point's options. Only do it on - * demand, to save processing time on hovering. - */ - importEvents: function() { - if (!this.hasImportedEvents) { - var point = this, - options = merge(point.series.options.point, point.options), - events = options.events, - eventType; - - point.events = events; - - for (eventType in events) { - addEvent(point, eventType, events[eventType]); - } - this.hasImportedEvents = true; - - } - }, - - /** - * Set the point's state - * @param {String} state - */ - setState: function(state) { - var point = this, - series = point.series, - stateOptions = series.options.states, - markerOptions = defaultPlotOptions[series.type].marker && series.options.marker, - normalDisabled = markerOptions && !markerOptions.enabled, - markerStateOptions = markerOptions && markerOptions.states[state], - stateDisabled = markerStateOptions && markerStateOptions.enabled === false, - stateMarkerGraphic = series.stateMarkerGraphic, - chart = series.chart, - pointAttr = point.pointAttr; - - if (!state) { - state = NORMAL_STATE; // empty string - } - - if ( - // already has this state - state == point.state || - // selected points don't respond to hover - (point.selected && state != SELECT_STATE) || - // series' state options is disabled - (stateOptions[state] && stateOptions[state].enabled === false) || - // point marker's state options is disabled - (state && (stateDisabled || normalDisabled && !markerStateOptions.enabled)) - - ) { - return; - } - - // apply hover styles to the existing point - if (point.graphic) { - point.graphic.attr(pointAttr[state]); - } - // if a graphic is not applied to each point in the normal state, create a shared - // graphic for the hover state - else { - if (state) { - if (!stateMarkerGraphic) { - series.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.circle( - 0, 0, pointAttr[state].r - ) - .attr(pointAttr[state]) - .add(series.group); - } - - stateMarkerGraphic.translate( - point.plotX, - point.plotY - ); - } - - if (stateMarkerGraphic) { - stateMarkerGraphic[state ? 'show' : 'hide'](); - } - } - - point.state = state; - } -}; - -/** - * The base function which all other series types inherit from - * @param {Object} chart - * @param {Object} options - */ -var Series = function() {}; - -Series.prototype = { - - isCartesian: true, - type: 'line', - pointClass: Point, - pointAttrToOptions: { // mapping between SVG attributes and the corresponding options - stroke: 'lineColor', - 'stroke-width': 'lineWidth', - fill: 'fillColor', - r: 'radius' - }, - init: function(chart, options) { - var series = this, - eventType, - events, - //pointEvent, - index = chart.series.length; - - series.chart = chart; - options = series.setOptions(options); // merge with plotOptions - - // set some variables - extend(series, { - index: index, - options: options, - name: options.name || 'Series '+ (index + 1), - state: NORMAL_STATE, - pointAttr: {}, - visible: options.visible !== false, // true by default - selected: options.selected === true // false by default - }); - - // register event listeners - events = options.events; - for (eventType in events) { - addEvent(series, eventType, events[eventType]); - } - if ( - (events && events.click) || - (options.point && options.point.events && options.point.events.click) || - options.allowPointSelect - ) { - chart.runTrackerClick = true; - } - - series.getColor(); - series.getSymbol(); - - // set the data - series.setData(options.data, false); - - }, - - - /** - * Return an auto incremented x value based on the pointStart and pointInterval options. - * This is only used if an x value is not given for the point that calls autoIncrement. - */ - autoIncrement: function() { - var series = this, - options = series.options, - xIncrement = series.xIncrement; - - xIncrement = pick(xIncrement, options.pointStart, 0); - - series.pointInterval = pick(series.pointInterval, options.pointInterval, 1); - - series.xIncrement = xIncrement + series.pointInterval; - return xIncrement; - }, - - /** - * Sort the data and remove duplicates - */ - cleanData: function() { - var series = this, - chart = series.chart, - data = series.data, - closestPoints, - smallestInterval, - chartSmallestInterval = chart.smallestInterval, - interval, - i; - - // sort the data points - data.sort(function(a, b){ - return (a.x - b.x); - }); - - // remove points with equal x values - // record the closest distance for calculation of column widths - for (i = data.length - 1; i >= 0; i--) { - if (data[i - 1]) { - if (data[i - 1].x == data[i].x) { - data.splice(i - 1, 1); // remove the duplicate - } - - } - } - - - // find the closes pair of points - for (i = data.length - 1; i >= 0; i--) { - if (data[i - 1]) { - interval = data[i].x - data[i - 1].x; - if (smallestInterval === UNDEFINED || interval < smallestInterval) { - smallestInterval = interval; - closestPoints = i; - } - } - } - - if (chartSmallestInterval === UNDEFINED || smallestInterval < chartSmallestInterval) { - chart.smallestInterval = smallestInterval; - } - series.closestPoints = closestPoints; - }, - - /** - * Divide the series data into segments divided by null values. Also sort - * the data points and delete duplicate values. - */ - getSegments: function() { - var lastNull = -1, - segments = [], - data = this.data; - - // create the segments - each(data, function(point, i) { - if (point.y === null) { - if (i > lastNull + 1) { - segments.push(data.slice(lastNull + 1, i)); - } - lastNull = i; - } else if (i == data.length - 1) { // last value - segments.push(data.slice(lastNull + 1, i + 1)); - } - }); - this.segments = segments; - - - }, - /** - * Set the series options by merging from the options tree - * @param {Object} itemOptions - */ - setOptions: function(itemOptions) { - var plotOptions = this.chart.options.plotOptions, - options = merge( - plotOptions[this.type], - plotOptions.series, - itemOptions - ); - - return options; - - }, - /** - * Get the series' color - */ - getColor: function(){ - var defaultColors = this.chart.options.colors; - this.color = this.options.color || defaultColors[colorCounter++] || '#0000ff'; - if (colorCounter >= defaultColors.length) { - colorCounter = 0; - } - }, - /** - * Get the series' symbol - */ - getSymbol: function(){ - var defaultSymbols = this.chart.options.symbols, - symbol = this.options.marker.symbol || defaultSymbols[symbolCounter++]; - this.symbol = symbol; - if (symbolCounter >= defaultSymbols.length) { - symbolCounter = 0; - } - }, - - /** - * Add a point dynamically after chart load time - * @param {Object} options Point options as given in series.data - * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call - * @param {Boolean} shift If shift is true, a point is shifted off the start - * of the series as one is appended to the end. - * @param {Boolean|Object} animation Whether to apply animation, and optionally animation - * configuration - */ - addPoint: function(options, redraw, shift, animation) { - var series = this, - data = series.data, - graph = series.graph, - area = series.area, - chart = series.chart, - point = (new series.pointClass()).init(series, options); - - setAnimation(animation, chart); - - if (graph && shift) { // make graph animate sideways - graph.shift = shift; - } - if (area) { - area.shift = shift; - area.isArea = true; - } - - redraw = pick(redraw, true); - - data.push(point); - if (shift) { - data[0].remove(false); - } - - - // redraw - series.isDirty = true; - if (redraw) { - chart.redraw(); - } - }, - - /** - * Replace the series data with a new set of data - * @param {Object} data - * @param {Object} redraw - */ - setData: function(data, redraw) { - var series = this, - oldData = series.data, - initialColor = series.initialColor, - chart = series.chart, - i = oldData && oldData.length || 0; - - series.xIncrement = null; // reset for new data - if (defined(initialColor)) { // reset colors for pie - colorCounter = initialColor; - } - - data = map(splat(data || []), function(pointOptions) { - return (new series.pointClass()).init(series, pointOptions); - }); - - // destroy old points - while (i--) { - oldData[i].destroy(); - } - - // set the data - series.data = data; - - series.cleanData(); - series.getSegments(); - - // redraw - series.isDirty = true; - chart.isDirtyBox = true; - if (pick(redraw, true)) { - chart.redraw(false); - } - }, - - /** - * Remove a series and optionally redraw the chart - * - * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call - * @param {Boolean|Object} animation Whether to apply animation, and optionally animation - * configuration - */ - - remove: function(redraw, animation) { - var series = this, - chart = series.chart; - redraw = pick(redraw, true); - - if (!series.isRemoving) { /* prevent triggering native event in jQuery - (calling the remove function from the remove event) */ - series.isRemoving = true; - - // fire the event with a default handler of removing the point - fireEvent(series, 'remove', null, function() { - - - // destroy elements - series.destroy(); - - - // redraw - chart.isDirtyLegend = chart.isDirtyBox = true; - if (redraw) { - chart.redraw(animation); - } - }); - - } - series.isRemoving = false; - }, - - /** - * Translate data points from raw data values to chart specific positioning data - * needed later in drawPoints, drawGraph and drawTracker. - */ - translate: function() { - var series = this, - chart = series.chart, - stacking = series.options.stacking, - categories = series.xAxis.categories, - yAxis = series.yAxis, - data = series.data, - i = data.length; - - // do the translation - while (i--) { - var point = data[i], - xValue = point.x, - yValue = point.y, - yBottom = point.low, - stack = yAxis.stacks[(yValue < 0 ? '-' : '') + series.stackKey], - pointStack, - pointStackTotal; - point.plotX = series.xAxis.translate(xValue); - - // calculate the bottom y value for stacked series - if (stacking && series.visible && stack && stack[xValue]) { - pointStack = stack[xValue]; - pointStackTotal = pointStack.total; - pointStack.cum = yBottom = pointStack.cum - yValue; // start from top - yValue = yBottom + yValue; - - if (stacking == 'percent') { - yBottom = pointStackTotal ? yBottom * 100 / pointStackTotal : 0; - yValue = pointStackTotal ? yValue * 100 / pointStackTotal : 0; - } - - point.percentage = pointStackTotal ? point.y * 100 / pointStackTotal : 0; - point.stackTotal = pointStackTotal; - } - - if (defined(yBottom)) { - point.yBottom = yAxis.translate(yBottom, 0, 1); - } - - // set the y value - if (yValue !== null) { - point.plotY = yAxis.translate(yValue, 0, 1); - } - - // set client related positions for mouse tracking - point.clientX = chart.inverted ? - chart.plotHeight - point.plotX : - point.plotX; // for mouse tracking - - // some API data - point.category = categories && categories[point.x] !== UNDEFINED ? - categories[point.x] : point.x; - - } - }, - /** - * Memoize tooltip texts and positions - */ - setTooltipPoints: function (renew) { - var series = this, - chart = series.chart, - inverted = chart.inverted, - data = [], - plotSize = mathRound((inverted ? chart.plotTop : chart.plotLeft) + chart.plotSizeX), - low, - high, - tooltipPoints = []; // a lookup array for each pixel in the x dimension - - // renew - if (renew) { - series.tooltipPoints = null; - } - - // concat segments to overcome null values - each(series.segments, function(segment){ - data = data.concat(segment); - }); - - // loop the concatenated data and apply each point to all the closest - // pixel positions - if (series.xAxis && series.xAxis.reversed) { - data = data.reverse();//reverseArray(data); - } - - each(data, function(point, i) { - - low = data[i - 1] ? data[i - 1].high + 1 : 0; - high = point.high = data[i + 1] ? ( - mathFloor((point.plotX + (data[i + 1] ? - data[i + 1].plotX : plotSize)) / 2)) : - plotSize; - - while (low <= high) { - tooltipPoints[inverted ? plotSize - low++ : low++] = point; - } - }); - series.tooltipPoints = tooltipPoints; - }, - - - - - /** - * Series mouse over handler - */ - onMouseOver: function() { - var series = this, - chart = series.chart, - hoverSeries = chart.hoverSeries; - - if (!hasTouch && chart.mouseIsDown) { - return; - } - - // set normal state to previous series - if (hoverSeries && hoverSeries != series) { - hoverSeries.onMouseOut(); - } - - // trigger the event, but to save processing time, - // only if defined - if (series.options.events.mouseOver) { - fireEvent(series, 'mouseOver'); - } - - - // bring to front - // Todo: optimize. This is one of two operations slowing down the tooltip in Firefox. - // Can the tracking be done otherwise? - if (series.tracker) { - series.tracker.toFront(); - } - - // hover this - series.setState(HOVER_STATE); - chart.hoverSeries = series; - }, - - /** - * Series mouse out handler - */ - onMouseOut: function() { - // trigger the event only if listeners exist - var series = this, - options = series.options, - chart = series.chart, - tooltip = chart.tooltip, - hoverPoint = chart.hoverPoint; - - // trigger mouse out on the point, which must be in this series - if (hoverPoint) { - hoverPoint.onMouseOut(); - } - - // fire the mouse out event - if (series && options.events.mouseOut) { - fireEvent(series, 'mouseOut'); - } - - - // hide the tooltip - if (tooltip && !options.stickyTracking) { - tooltip.hide(); - } - - // set normal state - series.setState(); - chart.hoverSeries = null; - }, - - /** - * Animate in the series - */ - animate: function(init) { - var series = this, - chart = series.chart, - clipRect = series.clipRect, - animation = series.options.animation; - - if (animation && !isObject(animation)) { - animation = {}; - } - - if (init) { // initialize the animation - if (!clipRect.isAnimating) { // apply it only for one of the series - clipRect.attr( 'width', 0 ); - clipRect.isAnimating = true; - } - - } else { // run the animation - clipRect.animate({ - width: chart.plotSizeX - }, animation); - - // delete this function to allow it only once - this.animate = null; - } - }, - - - /** - * Draw the markers - */ - drawPoints: function(){ - var series = this, - pointAttr, - data = series.data, - chart = series.chart, - plotX, - plotY, - i, - point, - radius, - graphic; - - if (series.options.marker.enabled) { - i = data.length; - while (i--) { - point = data[i]; - plotX = point.plotX; - plotY = point.plotY; - graphic = point.graphic; - - // only draw the point if y is defined - if (plotY !== UNDEFINED && !isNaN(plotY)) { - - /* && removed this code because points stayed after zoom - point.plotX >= 0 && point.plotX <= chart.plotSizeX && - point.plotY >= 0 && point.plotY <= chart.plotSizeY*/ - - // shortcuts - pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE]; - radius = pointAttr.r; - - if (graphic) { // update - graphic.animate({ - x: plotX, - y: plotY, - r: radius - }); - } else { - point.graphic = chart.renderer.symbol( - pick(point.marker && point.marker.symbol, series.symbol), - plotX, - plotY, - radius - ) - .attr(pointAttr) - .add(series.group); - } - } - } - } - - }, - - /** - * Convert state properties from API naming conventions to SVG attributes - * - * @param {Object} options API options object - * @param {Object} base1 SVG attribute object to inherit from - * @param {Object} base2 Second level SVG attribute object to inherit from - */ - convertAttribs: function(options, base1, base2, base3) { - var conversion = this.pointAttrToOptions, - attr, - option, - obj = {}; - - options = options || {}; - base1 = base1 || {}; - base2 = base2 || {}; - base3 = base3 || {}; - - for (attr in conversion) { - option = conversion[attr]; - obj[attr] = pick(options[option], base1[attr], base2[attr], base3[attr]); - } - return obj; - }, - - /** - * Get the state attributes. Each series type has its own set of attributes - * that are allowed to change on a point's state change. Series wide attributes are stored for - * all series, and additionally point specific attributes are stored for all - * points with individual marker options. If such options are not defined for the point, - * a reference to the series wide attributes is stored in point.pointAttr. - */ - getAttribs: function() { - var series = this, - normalOptions = defaultPlotOptions[series.type].marker ? series.options.marker : series.options, - stateOptions = normalOptions.states, - stateOptionsHover = stateOptions[HOVER_STATE], - pointStateOptionsHover, - seriesColor = series.color, - normalDefaults = { - stroke: seriesColor, - fill: seriesColor - }, - data = series.data, - i, - point, - seriesPointAttr = [], - pointAttr, - pointAttrToOptions = series.pointAttrToOptions, - hasPointSpecificOptions; - - // series type specific modifications - if (series.options.marker) { // line, spline, area, areaspline, scatter - - // if no hover radius is given, default to normal radius + 2 - stateOptionsHover.radius = stateOptionsHover.radius || normalOptions.radius + 2; - stateOptionsHover.lineWidth = stateOptionsHover.lineWidth || normalOptions.lineWidth + 1; - - } else { // column, bar, pie - - // if no hover color is given, brighten the normal color - stateOptionsHover.color = stateOptionsHover.color || - Color(stateOptionsHover.color || seriesColor) - .brighten(stateOptionsHover.brightness).get(); - } - - // general point attributes for the series normal state - seriesPointAttr[NORMAL_STATE] = series.convertAttribs(normalOptions, normalDefaults); - - // HOVER_STATE and SELECT_STATE states inherit from normal state except the default radius - each([HOVER_STATE, SELECT_STATE], function(state) { - seriesPointAttr[state] = - series.convertAttribs(stateOptions[state], seriesPointAttr[NORMAL_STATE]); - }); - - // set it - series.pointAttr = seriesPointAttr; - - - // Generate the point-specific attribute collections if specific point - // options are given. If not, create a referance to the series wide point - // attributes - i = data.length; - while (i--) { - point = data[i]; - normalOptions = (point.options && point.options.marker) || point.options; - if (normalOptions && normalOptions.enabled === false) { - normalOptions.radius = 0; - } - hasPointSpecificOptions = false; - - // check if the point has specific visual options - if (point.options) { - for (var key in pointAttrToOptions) { - if (defined(normalOptions[pointAttrToOptions[key]])) { - hasPointSpecificOptions = true; - } - } - } - - - - // a specific marker config object is defined for the individual point: - // create it's own attribute collection - if (hasPointSpecificOptions) { - - pointAttr = []; - stateOptions = normalOptions.states || {}; // reassign for individual point - pointStateOptionsHover = stateOptions[HOVER_STATE] = stateOptions[HOVER_STATE] || {}; - - // if no hover color is given, brighten the normal color - if (!series.options.marker) { // column, bar, point - pointStateOptionsHover.color = - Color(pointStateOptionsHover.color || point.options.color) - .brighten(pointStateOptionsHover.brightness || - stateOptionsHover.brightness).get(); - - } - - // normal point state inherits series wide normal state - pointAttr[NORMAL_STATE] = series.convertAttribs(normalOptions, seriesPointAttr[NORMAL_STATE]); - - // inherit from point normal and series hover - pointAttr[HOVER_STATE] = series.convertAttribs( - stateOptions[HOVER_STATE], - seriesPointAttr[HOVER_STATE], - pointAttr[NORMAL_STATE] - ); - // inherit from point normal and series hover - pointAttr[SELECT_STATE] = series.convertAttribs( - stateOptions[SELECT_STATE], - seriesPointAttr[SELECT_STATE], - pointAttr[NORMAL_STATE] - ); - - - - // no marker config object is created: copy a reference to the series-wide - // attribute collection - } else { - pointAttr = seriesPointAttr; - } - - point.pointAttr = pointAttr; - - } - - }, - - - /** - * Clear DOM objects and free up memory - */ - destroy: function() { - var series = this, - chart = series.chart, - //chartSeries = series.chart.series, - clipRect = series.clipRect, - issue134 = /\/5[0-9\.]+ (Safari|Mobile)\//.test(userAgent), // todo: update when Safari bug is fixed - destroy, - prop; - - // remove all events - removeEvent(series); - - // remove legend items - if (series.legendItem) { - series.chart.legend.destroyItem(series); - } - - // destroy all points with their elements - each(series.data, function(point) { - point.destroy(); - }); - // destroy all SVGElements associated to the series - each(['area', 'graph', 'dataLabelsGroup', 'group', 'tracker'], function(prop) { - if (series[prop]) { - - // issue 134 workaround - destroy = issue134 && prop == 'group' ? - 'hide' : - 'destroy'; - - series[prop][destroy](); - } - }); - - // remove from hoverSeries - if (chart.hoverSeries == series) { - chart.hoverSeries = null; - } - erase(chart.series, series); - - // clear all members - for (prop in series) { - delete series[prop]; - } - }, - - /** - * Draw the data labels - */ - drawDataLabels: function() { - if (this.options.dataLabels.enabled) { - var series = this, - x, - y, - data = series.data, - options = series.options.dataLabels, - str, - dataLabelsGroup = series.dataLabelsGroup, - chart = series.chart, - inverted = chart.inverted, - seriesType = series.type, - color; - - // create a separate group for the data labels to avoid rotation - if (!dataLabelsGroup) { - dataLabelsGroup = series.dataLabelsGroup = - chart.renderer.g(PREFIX +'data-labels') - .attr({ - visibility: series.visible ? VISIBLE : HIDDEN, - zIndex: 5 - }) - .translate(chart.plotLeft, chart.plotTop) - .add(); - } - - // determine the color - color = options.color; - if (color == 'auto') { // 1.0 backwards compatibility - color = null; - } - options.style.color = pick(color, series.color); - - // make the labels for each point - each(data, function(point, i){ - var barX = point.barX, - plotX = barX && barX + point.barW / 2 || point.plotX || -999, - plotY = pick(point.plotY, -999), - dataLabel = point.dataLabel, - align = options.align; - - // get the string - str = point.getDataLabelText(); - x = (inverted ? chart.plotWidth - plotY : plotX) + options.x; - y = (inverted ? chart.plotHeight - plotX : plotY) + options.y; - - // in columns, align the string to the column - if (seriesType == 'column') { - x += { left: -1, right: 1 }[align] * point.barW / 2 || 0; - } - - - if (dataLabel) { - dataLabel.animate({ - x: x, - y: y - }); - } else if (defined(str)) { - dataLabel = point.dataLabel = chart.renderer.text( - str, - x, - y - ) - .attr({ - align: align, - rotation: options.rotation, - zIndex: 1 - }) - .css(options.style) - .add(dataLabelsGroup); - } - - // vertically centered - if (inverted && !options.y) { - dataLabel.attr({ - y: y + parseInt(dataLabel.styles.lineHeight) * 0.9 - dataLabel.getBBox().height / 2 - }); - } - - /*if (series.isCartesian) { - dataLabel[chart.isInsidePlot(plotX, plotY) ? 'show' : 'hide'](); - }*/ - - }); - } - }, - - /** - * Draw the actual graph - */ - drawGraph: function(state) { - var series = this, - options = series.options, - chart = series.chart, - graph = series.graph, - graphPath = [], - fillColor, - area = series.area, - group = series.group, - color = options.lineColor || series.color, - lineWidth = options.lineWidth, - dashStyle = options.dashStyle, - segmentPath, - renderer = chart.renderer, - translatedThreshold = series.yAxis.getThreshold(options.threshold || 0), - useArea = /^area/.test(series.type), - singlePoints = [], // used in drawTracker - areaPath = [], - attribs; - - - // divide into segments and build graph and area paths - each(series.segments, function(segment) { - segmentPath = []; - - // build the segment line - each(segment, function(point, i) { - - if (series.getPointSpline) { // generate the spline as defined in the SplineSeries object - segmentPath.push.apply(segmentPath, series.getPointSpline(segment, point, i)); - - } else { - - // moveTo or lineTo - segmentPath.push(i ? L : M); - - // step line? - if (i && options.step) { - var lastPoint = segment[i - 1]; - segmentPath.push( - point.plotX, - lastPoint.plotY - ); - } - - // normal line to next point - segmentPath.push( - point.plotX, - point.plotY - ); - } - }); - - // add the segment to the graph, or a single point for tracking - if (segment.length > 1) { - graphPath = graphPath.concat(segmentPath); - } else { - singlePoints.push(segment[0]); - } - - // build the area - if (useArea) { - var areaSegmentPath = [], - i, - segLength = segmentPath.length; - for (i = 0; i < segLength; i++) { - areaSegmentPath.push(segmentPath[i]); - } - if (segLength == 3) { // for animation from 1 to two points - areaSegmentPath.push(L, segmentPath[1], segmentPath[2]); - } - if (options.stacking && series.type != 'areaspline') { - // follow stack back. Todo: implement areaspline - for (i = segment.length - 1; i >= 0; i--) { - areaSegmentPath.push(segment[i].plotX, segment[i].yBottom); - } - - } else { // follow zero line back - areaSegmentPath.push( - L, - segment[segment.length - 1].plotX, - translatedThreshold, - L, - segment[0].plotX, - translatedThreshold - ); - } - areaPath = areaPath.concat(areaSegmentPath); - } - }); - - // used in drawTracker: - series.graphPath = graphPath; - series.singlePoints = singlePoints; - - // draw the area if area series or areaspline - if (useArea) { - fillColor = pick( - options.fillColor, - Color(series.color).setOpacity(options.fillOpacity || 0.75).get() - ); - if (area) { - area.animate({ d: areaPath }); - - } else { - // draw the area - series.area = series.chart.renderer.path(areaPath) - .attr({ - fill: fillColor - }).add(group); - } - } - - // draw the graph - if (graph) { - //graph.animate({ d: graphPath.join(' ') }); - graph.animate({ d: graphPath }); - - } else { - if (lineWidth) { - attribs = { - 'stroke': color, - 'stroke-width': lineWidth - }; - if (dashStyle) { - attribs.dashstyle = dashStyle; - } - - series.graph = renderer.path(graphPath) - .attr(attribs).add(group).shadow(options.shadow); - } - } - }, - - - /** - * Render the graph and markers - */ - render: function() { - var series = this, - chart = series.chart, - group, - setInvert, - options = series.options, - animation = options.animation, - doAnimation = animation && series.animate, - duration = doAnimation ? animation && animation.duration || 500 : 0, - clipRect = series.clipRect, - renderer = chart.renderer; - - - // Add plot area clipping rectangle. If this is before chart.hasRendered, - // create one shared clipRect. - if (!clipRect) { - clipRect = series.clipRect = !chart.hasRendered && chart.clipRect ? - chart.clipRect : - renderer.clipRect(0, 0, chart.plotSizeX, chart.plotSizeY); - if (!chart.clipRect) { - chart.clipRect = clipRect; - } - } - - - // the group - if (!series.group) { - group = series.group = renderer.g('series'); - - if (chart.inverted) { - setInvert = function() { - group.attr({ - width: chart.plotWidth, - height: chart.plotHeight - }).invert(); - }; - - setInvert(); // do it now - addEvent(chart, 'resize', setInvert); // do it on resize - } - group.clip(series.clipRect) - .attr({ - visibility: series.visible ? VISIBLE : HIDDEN, - zIndex: options.zIndex - }) - .translate(chart.plotLeft, chart.plotTop) - .add(chart.seriesGroup); - } - - series.drawDataLabels(); - - // initiate the animation - if (doAnimation) { - series.animate(true); - } - - // cache attributes for shapes - series.getAttribs(); - - // draw the graph if any - if (series.drawGraph) { - series.drawGraph(); - } - - // draw the points - series.drawPoints(); - - // draw the mouse tracking area - if (series.options.enableMouseTracking !== false) { - series.drawTracker(); - } - - // run the animation - if (doAnimation) { - series.animate(); - } - - // finish the individual clipRect - setTimeout(function() { - clipRect.isAnimating = false; - group = series.group; // can be destroyed during the timeout - if (group && clipRect != chart.clipRect && clipRect.renderer) { - group.clip((series.clipRect = chart.clipRect)); - clipRect.destroy(); - } - }, duration); - - - series.isDirty = false; // means data is in accordance with what you see - - }, - - /** - * Redraw the series after an update in the axes. - */ - redraw: function() { - var series = this, - chart = series.chart, - clipRect = series.clipRect, - group = series.group; - - /*if (clipRect) { - stop(clipRect); - clipRect.animate({ // for chart resize - width: chart.plotSizeX, - height: chart.plotSizeY - }); - }*/ - - // reposition on resize - if (group) { - if (chart.inverted) { - group.attr({ - width: chart.plotWidth, - height: chart.plotHeight - }); - } - - group.animate({ - translateX: chart.plotLeft, - translateY: chart.plotTop - }); - } - - series.translate(); - series.setTooltipPoints(true); - series.render(); - }, - - /** - * Set the state of the graph - */ - setState: function(state) { - var series = this, - options = series.options, - graph = series.graph, - stateOptions = options.states, - lineWidth = options.lineWidth; - - state = state || NORMAL_STATE; - - if (series.state != state) { - series.state = state; - - if (stateOptions[state] && stateOptions[state].enabled === false) { - return; - } - - if (state) { - lineWidth = stateOptions[state].lineWidth || lineWidth + 1; - } - - if (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML - graph.attr({ // use attr because animate will cause any other animation on the graph to stop - 'stroke-width': lineWidth - }, state ? 0 : 500); - } - } - }, - - /** - * Set the visibility of the graph - * - * @param vis {Boolean} True to show the series, false to hide. If UNDEFINED, - * the visibility is toggled. - */ - setVisible: function(vis, redraw) { - var series = this, - chart = series.chart, - legendItem = series.legendItem, - seriesGroup = series.group, - seriesTracker = series.tracker, - dataLabelsGroup = series.dataLabelsGroup, - showOrHide, - i, - data = series.data, - point, - ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries, - oldVisibility = series.visible; - - // if called without an argument, toggle visibility - series.visible = vis = vis === UNDEFINED ? !oldVisibility : vis; - showOrHide = vis ? 'show' : 'hide'; - - // show or hide series - if (seriesGroup) { // pies don't have one - seriesGroup[showOrHide](); - } - - // show or hide trackers - if (seriesTracker) { - seriesTracker[showOrHide](); - } else { - i = data.length; - while (i--) { - point = data[i]; - if (point.tracker) { - point.tracker[showOrHide](); - } - } - } - - - if (dataLabelsGroup) { - dataLabelsGroup[showOrHide](); - } - - if (legendItem) { - chart.legend.colorizeItem(series, vis); - } - - - // rescale or adapt to resized chart - series.isDirty = true; - // in a stack, all other series are affected - if (series.options.stacking) { - each(chart.series, function(otherSeries) { - if (otherSeries.options.stacking && otherSeries.visible) { - otherSeries.isDirty = true; - } - }); - } - - if (ignoreHiddenSeries) { - chart.isDirtyBox = true; - } - if (redraw !== false) { - chart.redraw(); - } - - fireEvent(series, showOrHide); - }, - - /** - * Show the graph - */ - show: function() { - this.setVisible(true); - }, - - /** - * Hide the graph - */ - hide: function() { - this.setVisible(false); - }, - - - /** - * Set the selected state of the graph - * - * @param selected {Boolean} True to select the series, false to unselect. If - * UNDEFINED, the selection state is toggled. - */ - select: function(selected) { - var series = this; - // if called without an argument, toggle - series.selected = selected = (selected === UNDEFINED) ? !series.selected : selected; - - if (series.checkbox) { - series.checkbox.checked = selected; - } - - fireEvent(series, selected ? 'select' : 'unselect'); - }, - - - /** - * Draw the tracker object that sits above all data labels and markers to - * track mouse events on the graph or points. For the line type charts - * the tracker uses the same graphPath, but with a greater stroke width - * for better control. - */ - drawTracker: function() { - var series = this, - options = series.options, - trackerPath = [].concat(series.graphPath), - trackerPathLength = trackerPath.length, - chart = series.chart, - snap = chart.options.tooltip.snap, - tracker = series.tracker, - cursor = options.cursor, - css = cursor && { cursor: cursor }, - singlePoints = series.singlePoints, - singlePoint, - i; - - // Extend end points. A better way would be to use round linecaps, - // but those are not clickable in VML. - if (trackerPathLength) { - i = trackerPathLength + 1; - while (i--) { - if (trackerPath[i] == M) { // extend left side - trackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], L); - } - if ((i && trackerPath[i] == M) || i == trackerPathLength) { // extend right side - trackerPath.splice(i, 0, L, trackerPath[i - 2] + snap, trackerPath[i - 1]); - } - } - } - - // handle single points - for (i = 0; i < singlePoints.length; i++) { - singlePoint = singlePoints[i]; - trackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY, - L, singlePoint.plotX + snap, singlePoint.plotY); - } - - // draw the tracker - if (tracker) { - tracker.attr({ d: trackerPath }); - - } else { // create - series.tracker = chart.renderer.path(trackerPath) - .attr({ - isTracker: true, - stroke: TRACKER_FILL, - fill: NONE, - 'stroke-width' : options.lineWidth + 2 * snap, - visibility: series.visible ? VISIBLE : HIDDEN, - zIndex: 1 - }) - .on(hasTouch ? 'touchstart' : 'mouseover', function() { - if (chart.hoverSeries != series) { - series.onMouseOver(); - } - }) - .on('mouseout', function() { - if (!options.stickyTracking) { - series.onMouseOut(); - } - }) - .css(css) - .add(chart.trackerGroup); - } - - } - -}; // end Series prototype - - -/** - * LineSeries object - */ -var LineSeries = extendClass(Series); -seriesTypes.line = LineSeries; - -/** - * AreaSeries object - */ -var AreaSeries = extendClass(Series, { - type: 'area' -}); -seriesTypes.area = AreaSeries; - - - - -/** - * SplineSeries object - */ -var SplineSeries = extendClass( Series, { - type: 'spline', - - /** - * Draw the actual graph - */ - getPointSpline: function(segment, point, i) { - var smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc - denom = smoothing + 1, - plotX = point.plotX, - plotY = point.plotY, - lastPoint = segment[i - 1], - nextPoint = segment[i + 1], - leftContX, - leftContY, - rightContX, - rightContY, - ret; - - // find control points - if (i && i < segment.length - 1) { - var lastX = lastPoint.plotX, - lastY = lastPoint.plotY, - nextX = nextPoint.plotX, - nextY = nextPoint.plotY, - correction; - - leftContX = (smoothing * plotX + lastX) / denom; - leftContY = (smoothing * plotY + lastY) / denom; - rightContX = (smoothing * plotX + nextX) / denom; - rightContY = (smoothing * plotY + nextY) / denom; - - // have the two control points make a straight line through main point - correction = ((rightContY - leftContY) * (rightContX - plotX)) / - (rightContX - leftContX) + plotY - rightContY; - - leftContY += correction; - rightContY += correction; - - // to prevent false extremes, check that control points are between - // neighbouring points' y values - if (leftContY > lastY && leftContY > plotY) { - leftContY = mathMax(lastY, plotY); - rightContY = 2 * plotY - leftContY; // mirror of left control point - } else if (leftContY < lastY && leftContY < plotY) { - leftContY = mathMin(lastY, plotY); - rightContY = 2 * plotY - leftContY; - } - if (rightContY > nextY && rightContY > plotY) { - rightContY = mathMax(nextY, plotY); - leftContY = 2 * plotY - rightContY; - } else if (rightContY < nextY && rightContY < plotY) { - rightContY = mathMin(nextY, plotY); - leftContY = 2 * plotY - rightContY; - } - - // record for drawing in next point - point.rightContX = rightContX; - point.rightContY = rightContY; - - } - - // moveTo or lineTo - if (!i) { - ret = [M, plotX, plotY]; - } - - // curve from last point to this - else { - ret = [ - 'C', - lastPoint.rightContX || lastPoint.plotX, - lastPoint.rightContY || lastPoint.plotY, - leftContX || plotX, - leftContY || plotY, - plotX, - plotY - ]; - lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later - } - return ret; - } -}); -seriesTypes.spline = SplineSeries; - - - -/** - * AreaSplineSeries object - */ -var AreaSplineSeries = extendClass(SplineSeries, { - type: 'areaspline' -}); -seriesTypes.areaspline = AreaSplineSeries; - -/** - * ColumnSeries object - */ -var ColumnSeries = extendClass(Series, { - type: 'column', - pointAttrToOptions: { // mapping between SVG attributes and the corresponding options - stroke: 'borderColor', - 'stroke-width': 'borderWidth', - fill: 'color', - r: 'borderRadius' - }, - init: function() { - Series.prototype.init.apply(this, arguments); - - var series = this, - chart = series.chart; - - // flag the chart in order to pad the x axis - chart.hasColumn = true; - - // if the series is added dynamically, force redraw of other - // series affected by a new column - if (chart.hasRendered) { - each(chart.series, function(otherSeries) { - if (otherSeries.type == series.type) { - otherSeries.isDirty = true; - } - }); - } - }, - - /** - * Translate each point to the plot area coordinate system and find shape positions - */ - translate: function() { - var series = this, - chart = series.chart, - columnCount = 0, - reversedXAxis = series.xAxis.reversed, - categories = series.xAxis.categories, - stackGroups = {}, - stackKey, - columnIndex; - - Series.prototype.translate.apply(series); - - // Get the total number of column type series. - // This is called on every series. Consider moving this logic to a - // chart.orderStacks() function and call it on init, addSeries and removeSeries - each(chart.series, function(otherSeries) { - if (otherSeries.type == series.type) { - if (otherSeries.options.stacking) { - stackKey = otherSeries.stackKey; - if (stackGroups[stackKey] === UNDEFINED) { - stackGroups[stackKey] = columnCount++; - } - columnIndex = stackGroups[stackKey]; - } else if (otherSeries.visible){ - columnIndex = columnCount++; - } - otherSeries.columnIndex = columnIndex; - } - }); - - // calculate the width and position of each column based on - // the number of column series in the plot, the groupPadding - // and the pointPadding options - var options = series.options, - data = series.data, - closestPoints = series.closestPoints, - categoryWidth = mathAbs( - data[1] ? data[closestPoints].plotX - data[closestPoints - 1].plotX : - chart.plotSizeX / (categories ? categories.length : 1) - ), - groupPadding = categoryWidth * options.groupPadding, - groupWidth = categoryWidth - 2 * groupPadding, - pointOffsetWidth = groupWidth / columnCount, - optionPointWidth = options.pointWidth, - pointPadding = defined(optionPointWidth) ? (pointOffsetWidth - optionPointWidth) / 2 : - pointOffsetWidth * options.pointPadding, - pointWidth = mathMax(pick(optionPointWidth, pointOffsetWidth - 2 * pointPadding), 1), - colIndex = (reversedXAxis ? columnCount - - series.columnIndex : series.columnIndex) || 0, - pointXOffset = pointPadding + (groupPadding + colIndex * - pointOffsetWidth -(categoryWidth / 2)) * - (reversedXAxis ? -1 : 1), - threshold = options.threshold || 0, - translatedThreshold = series.yAxis.getThreshold(threshold), - minPointLength = pick(options.minPointLength, 5); - - // record the new values - each(data, function(point) { - var plotY = point.plotY, - yBottom = point.yBottom || translatedThreshold, - barX = point.plotX + pointXOffset, - barY = mathCeil(mathMin(plotY, yBottom)), - barH = mathCeil(mathMax(plotY, yBottom) - barY), - trackerY; - - // handle options.minPointLength and tracker for small points - if (mathAbs(barH) < minPointLength) { - if (minPointLength) { - barH = minPointLength; - barY = - mathAbs(barY - translatedThreshold) > minPointLength ? // stacked - yBottom - minPointLength : // keep position - translatedThreshold - (plotY <= translatedThreshold ? minPointLength : 0); - } - trackerY = barY - 3; - } - - extend(point, { - barX: barX, - barY: barY, - barW: pointWidth, - barH: barH - }); - point.shapeType = 'rect'; - point.shapeArgs = { - x: barX, - y: barY, - width: pointWidth, - height: barH, - r: options.borderRadius - }; - - // make small columns responsive to mouse - point.trackerArgs = defined(trackerY) && merge(point.shapeArgs, { - height: mathMax(6, barH + 3), - y: trackerY - }); - }); - - }, - - getSymbol: function(){ - }, - - /** - * Columns have no graph - */ - drawGraph: function() {}, - - /** - * Draw the columns. For bars, the series.group is rotated, so the same coordinates - * apply for columns and bars. This method is inherited by scatter series. - * - */ - drawPoints: function() { - var series = this, - options = series.options, - renderer = series.chart.renderer, - graphic, - shapeArgs; - - - // draw the columns - each(series.data, function(point) { - var plotY = point.plotY; - if (plotY !== UNDEFINED && !isNaN(plotY)) { - graphic = point.graphic; - shapeArgs = point.shapeArgs; - if (graphic) { // update - stop(graphic); - graphic.animate(shapeArgs); - - } else { - point.graphic = renderer[point.shapeType](shapeArgs) - .attr(point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE]) - .add(series.group) - .shadow(options.shadow); - } - - } - }); - }, - /** - * Draw the individual tracker elements. - * This method is inherited by scatter and pie charts too. - */ - drawTracker: function() { - var series = this, - chart = series.chart, - renderer = chart.renderer, - shapeArgs, - tracker, - trackerLabel = +new Date(), - cursor = series.options.cursor, - css = cursor && { cursor: cursor }, - rel; - - each(series.data, function(point) { - tracker = point.tracker; - shapeArgs = point.trackerArgs || point.shapeArgs; - if (point.y !== null) { - if (tracker) {// update - tracker.attr(shapeArgs); - - } else { - point.tracker = - renderer[point.shapeType](shapeArgs) - .attr({ - isTracker: trackerLabel, - fill: TRACKER_FILL, - visibility: series.visible ? VISIBLE : HIDDEN, - zIndex: 1 - }) - .on(hasTouch ? 'touchstart' : 'mouseover', function(event) { - rel = event.relatedTarget || event.fromElement; - if (chart.hoverSeries != series && attr(rel, 'isTracker') != trackerLabel) { - series.onMouseOver(); - } - point.onMouseOver(); - - }) - .on('mouseout', function(event) { - if (!series.options.stickyTracking) { - rel = event.relatedTarget || event.toElement; - if (attr(rel, 'isTracker') != trackerLabel) { - series.onMouseOut(); - } - } - }) - .css(css) - .add(chart.trackerGroup); - } - } - }); - }, - - - /** - * Animate the column heights one by one from zero - * @param {Boolean} init Whether to initialize the animation or run it - */ - animate: function(init) { - var series = this, - data = series.data; - - if (!init) { // run the animation - /* - * Note: Ideally the animation should be initialized by calling - * series.group.hide(), and then calling series.group.show() - * after the animation was started. But this rendered the shadows - * invisible in IE8 standards mode. If the columns flicker on large - * datasets, this is the cause. - */ - - each(data, function(point) { - var graphic = point.graphic; - - if (graphic) { - // start values - graphic.attr({ - height: 0, - y: series.yAxis.translate(0, 0, 1) - }); - - // animate - graphic.animate({ - height: point.barH, - y: point.barY - }, series.options.animation); - } - }); - - - // delete this function to allow it only once - series.animate = null; - } - - }, - /** - * Remove this series from the chart - */ - remove: function() { - var series = this, - chart = series.chart; - - // column and bar series affects other series of the same type - // as they are either stacked or grouped - if (chart.hasRendered) { - each(chart.series, function(otherSeries) { - if (otherSeries.type == series.type) { - otherSeries.isDirty = true; - } - }); - } - - Series.prototype.remove.apply(series, arguments); - } -}); -seriesTypes.column = ColumnSeries; - -var BarSeries = extendClass(ColumnSeries, { - type: 'bar', - init: function(chart) { - chart.inverted = this.inverted = true; - ColumnSeries.prototype.init.apply(this, arguments); - } -}); -seriesTypes.bar = BarSeries; - -/** - * The scatter series class - */ -var ScatterSeries = extendClass(Series, { - type: 'scatter', - - /** - * Extend the base Series' translate method by adding shape type and - * arguments for the point trackers - */ - translate: function() { - var series = this; - - Series.prototype.translate.apply(series); - - each(series.data, function(point) { - point.shapeType = 'circle'; - point.shapeArgs = { - x: point.plotX, - y: point.plotY, - r: series.chart.options.tooltip.snap - }; - }); - }, - - - /** - * Create individual tracker elements for each point - */ - //drawTracker: ColumnSeries.prototype.drawTracker, - drawTracker: function() { - var series = this, - cursor = series.options.cursor, - css = cursor && { cursor: cursor }, - graphic; - - each(series.data, function(point) { - graphic = point.graphic; - if (graphic) { // doesn't exist for null points - graphic - .attr({ isTracker: true }) - .on('mouseover', function(event) { - series.onMouseOver(); - point.onMouseOver(); - }) - .on('mouseout', function(event) { - if (!series.options.stickyTracking) { - series.onMouseOut(); - } - }) - .css(css); - } - }); - - }, - - /** - * Cleaning the data is not necessary in a scatter plot - */ - cleanData: function() {} -}); -seriesTypes.scatter = ScatterSeries; - -/** - * Extended point object for pies - */ -var PiePoint = extendClass(Point, { - /** - * Initiate the pie slice - */ - init: function () { - - Point.prototype.init.apply(this, arguments); - - var point = this, - toggleSlice; - - //visible: options.visible !== false, - extend(point, { - visible: point.visible !== false, - name: pick(point.name, 'Slice') - }); - - // add event listener for select - toggleSlice = function() { - point.slice(); - }; - addEvent(point, 'select', toggleSlice); - addEvent(point, 'unselect', toggleSlice); - - return point; - }, - - /** - * Toggle the visibility of the pie slice - * @param {Boolean} vis Whether to show the slice or not. If undefined, the - * visibility is toggled - */ - setVisible: function(vis) { - var point = this, - chart = point.series.chart, - tracker = point.tracker, - dataLabel = point.dataLabel, - connector = point.connector, - method; - - // if called without an argument, toggle visibility - point.visible = vis = vis === UNDEFINED ? !point.visible : vis; - - method = vis ? 'show' : 'hide'; - - point.group[method](); - if (tracker) { - tracker[method](); - } - if (dataLabel) { - dataLabel[method](); - } - if (connector) { - connector[method](); - } - if (point.legendItem) { - chart.legend.colorizeItem(point, vis); - } - }, - - /** - * Set or toggle whether the slice is cut out from the pie - * @param {Boolean} sliced When undefined, the slice state is toggled - * @param {Boolean} redraw Whether to redraw the chart. True by default. - */ - slice: function(sliced, redraw, animation) { - var point = this, - series = point.series, - chart = series.chart, - slicedTranslation = point.slicedTranslation; - - setAnimation(animation, chart); - - // redraw is true by default - redraw = pick(redraw, true); - - // if called without an argument, toggle - sliced = point.sliced = defined(sliced) ? sliced : !point.sliced; - - point.group.animate({ - translateX: (sliced ? slicedTranslation[0] : chart.plotLeft), - translateY: (sliced ? slicedTranslation[1] : chart.plotTop) - }); - - } -}); - -/** - * The Pie series class - */ -var PieSeries = extendClass(Series, { - type: 'pie', - isCartesian: false, - pointClass: PiePoint, - pointAttrToOptions: { // mapping between SVG attributes and the corresponding options - stroke: 'borderColor', - 'stroke-width': 'borderWidth', - fill: 'color' - }, - - /** - * Pies have one color each point - */ - getColor: function() { - // record first color for use in setData - this.initialColor = colorCounter; - }, - - /** - * Animate the column heights one by one from zero - * @param {Boolean} init Whether to initialize the animation or run it - */ - animate: function(init) { - var series = this, - data = series.data; - - each(data, function(point) { - var graphic = point.graphic, - args = point.shapeArgs, - up = -mathPI / 2; - - if (graphic) { - // start values - graphic.attr({ - r: 0, - start: up, - end: up - }); - - // animate - graphic.animate({ - r: args.r, - start: args.start, - end: args.end - }, series.options.animation); - } - }); - - // delete this function to allow it only once - series.animate = null; - - }, - /** - * Do translation for pie slices - */ - translate: function() { - var total = 0, - series = this, - cumulative = -0.25, // start at top - precision = 1000, // issue #172 - options = series.options, - slicedOffset = options.slicedOffset, - connectorOffset = slicedOffset + options.borderWidth, - positions = options.center, - chart = series.chart, - plotWidth = chart.plotWidth, - plotHeight = chart.plotHeight, - start, - end, - angle, - data = series.data, - circ = 2 * mathPI, - fraction, - smallestSize = mathMin(plotWidth, plotHeight), - isPercent, - radiusX, // the x component of the radius vector for a given point - radiusY, - labelDistance = options.dataLabels.distance; - - // get positions - either an integer or a percentage string must be given - positions.push(options.size, options.innerSize || 0); - positions = map(positions, function(length, i) { - - isPercent = /%$/.test(length); - return isPercent ? - // i == 0: centerX, relative to width - // i == 1: centerY, relative to height - // i == 2: size, relative to smallestSize - [plotWidth, plotHeight, smallestSize, smallestSize][i] * - pInt(length) / 100: - length; - }); - - // utility for getting the x value from a given y, used for anticollision logic in data labels - series.getX = function(y, left) { - - angle = math.asin((y - positions[1]) / (positions[2] / 2 + labelDistance)); - - return positions[0] + - (left ? -1 : 1) * - (mathCos(angle) * (positions[2] / 2 + labelDistance)); - }; - - // set center for later use - series.center = positions; - - // get the total sum - each(data, function(point) { - total += point.y; - }); - - each(data, function(point) { - // set start and end angle - fraction = total ? point.y / total : 0; - start = mathRound(cumulative * circ * precision) / precision; - cumulative += fraction; - end = mathRound(cumulative * circ * precision) / precision; - - // set the shape - point.shapeType = 'arc'; - point.shapeArgs = { - x: positions[0], - y: positions[1], - r: positions[2] / 2, - innerR: positions[3] / 2, - start: start, - end: end - }; - - // center for the sliced out slice - angle = (end + start) / 2; - point.slicedTranslation = map([ - mathCos(angle) * slicedOffset + chart.plotLeft, - mathSin(angle) * slicedOffset + chart.plotTop - ], mathRound); - - // set the anchor point for tooltips - radiusX = mathCos(angle) * positions[2] / 2; - radiusY = mathSin(angle) * positions[2] / 2; - point.tooltipPos = [ - positions[0] + radiusX * 0.7, - positions[1] + radiusY * 0.7 - ]; - - // set the anchor point for data labels - point.labelPos = [ - positions[0] + radiusX + mathCos(angle) * labelDistance, // first break of connector - positions[1] + radiusY + mathSin(angle) * labelDistance, // a/a - positions[0] + radiusX + mathCos(angle) * connectorOffset, // second break, right outside pie - positions[1] + radiusY + mathSin(angle) * connectorOffset, // a/a - positions[0] + radiusX, // landing point for connector - positions[1] + radiusY, // a/a - labelDistance < 0 ? // alignment - 'center' : - angle < circ / 4 ? 'left' : 'right', // alignment - angle // center angle - ]; - - - // API properties - point.percentage = fraction * 100; - point.total = total; - - }); - - this.setTooltipPoints(); - }, - - /** - * Render the slices - */ - render: function() { - var series = this; - - // cache attributes for shapes - series.getAttribs(); - - this.drawPoints(); - - // draw the mouse tracking area - if (series.options.enableMouseTracking !== false) { - series.drawTracker(); - } - - this.drawDataLabels(); - - if (series.options.animation && series.animate) { - series.animate(); - } - - series.isDirty = false; // means data is in accordance with what you see - }, - - /** - * Draw the data points - */ - drawPoints: function() { - var series = this, - chart = series.chart, - renderer = chart.renderer, - groupTranslation, - //center, - graphic, - group, - shapeArgs; - - // draw the slices - each(series.data, function(point) { - graphic = point.graphic; - shapeArgs = point.shapeArgs; - group = point.group; - - // create the group the first time - if (!group) { - group = point.group = renderer.g('point') - .attr({ zIndex: 5 }) - .add(); - } - - // if the point is sliced, use special translation, else use plot area traslation - groupTranslation = point.sliced ? point.slicedTranslation : [chart.plotLeft, chart.plotTop]; - group.translate(groupTranslation[0], groupTranslation[1]) - - - // draw the slice - if (graphic) { - graphic.animate(shapeArgs); - } else { - point.graphic = - renderer.arc(shapeArgs) - .attr(extend( - point.pointAttr[NORMAL_STATE], - { 'stroke-linejoin': 'round' } - )) - .add(point.group); - } - - // detect point specific visibility - if (point.visible === false) { - point.setVisible(false); - } - - }); - - }, - - /** - * Override the base drawDataLabels method by pie specific functionality - */ - drawDataLabels: function() { - var series = this, - data = series.data, - point, - chart = series.chart, - options = series.options.dataLabels, - connectorPadding = pick(options.connectorPadding, 10), - connectorWidth = pick(options.connectorWidth, 1), - connector, - connectorPath, - outside = options.distance > 0, - dataLabel, - labelPos, - labelHeight, - lastY, - centerY = series.center[1], - quarters = [// divide the points into quarters for anti collision - [], // top right - [], // bottom right - [], // bottom left - [] // top left - ], - x, - y, - visibility, - overlapping, - rankArr, - secondPass, - sign, - lowerHalf, - sort, - i = 4, - j; - - // run parent method - Series.prototype.drawDataLabels.apply(series); - - // arrange points for detection collision - each(data, function(point) { - var angle = point.labelPos[7], - quarter; - if (angle < 0) { - quarter = 0; - } else if (angle < mathPI / 2) { - quarter = 1; - } else if (angle < mathPI) { - quarter = 2; - } else { - quarter = 3; - } - quarters[quarter].push(point); - }); - quarters[1].reverse(); - quarters[3].reverse(); - - // define the sorting algorithm - sort = function(a,b) { - return a.y > b.y; - }; - /* Loop over the points in each quartile, starting from the top and bottom - * of the pie to detect overlapping labels. - */ - while (i--) { - overlapping = 0; - - // create an array for sorting and ranking the points within each quarter - rankArr = [].concat(quarters[i]); - rankArr.sort(sort); - j = rankArr.length; - while (j--) { - rankArr[j].rank = j; - } - - /* In the first pass, count the number of overlapping labels. In the second - * pass, remove the labels with lowest rank/values. - */ - for (secondPass = 0; secondPass < 2; secondPass++) { - lowerHalf = i % 3; - lastY = lowerHalf ? 9999 : -9999; - sign = lowerHalf ? -1 : 1; - - for (j = 0; j < quarters[i].length; j++) { - point = quarters[i][j]; - - if ((dataLabel = point.dataLabel)) { - labelPos = point.labelPos; - visibility = VISIBLE; - x = labelPos[0]; - y = labelPos[1]; - - - // assume all labels have equal height - if (!labelHeight) { - labelHeight = dataLabel && dataLabel.getBBox().height; - } - - // anticollision - if (outside) { - if (secondPass && point.rank < overlapping) { - visibility = HIDDEN; - } else if ((!lowerHalf && y < lastY + labelHeight) || - (lowerHalf && y > lastY - labelHeight)) { - y = lastY + sign * labelHeight; - x = series.getX(y, i > 1); - if ((!lowerHalf && y + labelHeight > centerY) || - (lowerHalf && y -labelHeight < centerY)) { - if (secondPass) { - visibility = HIDDEN; - } else { - overlapping++; - } - } - } - } - - if (point.visible === false) { - visibility = HIDDEN; - } - - if (visibility == VISIBLE) { - lastY = y; - } - - if (secondPass) { - - // move or place the data label - dataLabel - .attr({ - visibility: visibility, - align: labelPos[6] - }) - [dataLabel.moved ? 'animate' : 'attr']({ - x: x + options.x + - ({ left: connectorPadding, right: -connectorPadding }[labelPos[6]] || 0), - y: y + options.y - }); - dataLabel.moved = true; - - // draw the connector - if (outside && connectorWidth) { - connector = point.connector; - - connectorPath = [ - M, - x + (labelPos[6] == 'left' ? 5 : -5), y, // end of the string at the label - L, - x, y, // first break, next to the label - L, - labelPos[2], labelPos[3], // second break - L, - labelPos[4], labelPos[5] // base - ]; - - if (connector) { - connector.animate({ d: connectorPath }); - connector.attr('visibility', visibility); - - } else { - point.connector = connector = series.chart.renderer.path(connectorPath).attr({ - 'stroke-width': connectorWidth, - stroke: options.connectorColor || '#606060', - visibility: visibility, - zIndex: 3 - }) - .translate(chart.plotLeft, chart.plotTop) - .add(); - } - } - } - } - } - } - } - }, - - /** - * Draw point specific tracker objects. Inherit directly from column series. - */ - drawTracker: ColumnSeries.prototype.drawTracker, - - /** - * Pies don't have point marker symbols - */ - getSymbol: function() {} - -}); -seriesTypes.pie = PieSeries; - - -// global variables -win.Highcharts = { - Chart: Chart, - dateFormat: dateFormat, - pathAnim: pathAnim, - getOptions: getOptions, - numberFormat: numberFormat, - Point: Point, - Color: Color, - Renderer: Renderer, - seriesTypes: seriesTypes, - setOptions: setOptions, - Series: Series, - - // Expose utility funcitons for modules - addEvent: addEvent, - createElement: createElement, - discardElement: discardElement, - css: css, - each: each, - extend: extend, - map: map, - merge: merge, - pick: pick, - extendClass: extendClass, - version: '2.1.4' -}; -})(); - diff --git a/Website/static/Highcharts-2/js/modules/exporting.js b/Website/static/Highcharts-2/js/modules/exporting.js deleted file mode 100755 index 792c127..0000000 --- a/Website/static/Highcharts-2/js/modules/exporting.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - Highcharts JS v2.1.4 (2011-03-02) - Exporting module - - (c) 2010 Torstein H?nsi - - License: www.highcharts.com/license -*/ -(function(){var k=Highcharts,y=k.Chart,C=k.addEvent,r=k.createElement,z=k.discardElement,u=k.css,w=k.merge,s=k.each,p=k.extend,D=Math.max,q=document,E=window,A="ontouchstart"in q.documentElement,B=k.setOptions({lang:{downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",exportButtonTitle:"Export to raster or vector image",printButtonTitle:"Print the chart"}});B.navigation={menuStyle:{border:"1px solid #A0A0A0", -background:"#FFFFFF"},menuItemStyle:{padding:"0 5px",background:"none",color:"#303030",fontSize:A?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{align:"right",backgroundColor:{linearGradient:[0,0,0,20],stops:[[0.4,"#F7F7F7"],[0.6,"#E3E3E3"]]},borderColor:"#B0B0B0",borderRadius:3,borderWidth:1,height:20,hoverBorderColor:"#909090",hoverSymbolFill:"#81A7CF",hoverSymbolStroke:"#4572A5",symbolFill:"#E0E0E0",symbolStroke:"#A0A0A0",symbolX:11.5,symbolY:10.5,verticalAlign:"top", -width:24,y:10}};B.exporting={type:"image/png",url:"http://export.highcharts.com/",width:800,buttons:{exportButton:{symbol:"exportIcon",x:-10,symbolFill:"#A8BF77",hoverSymbolFill:"#768F3E",_titleKey:"exportButtonTitle",menuItems:[{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}, -printButton:{symbol:"printIcon",x:-36,symbolFill:"#B5C9DF",hoverSymbolFill:"#779ABF",_titleKey:"printButtonTitle",onclick:function(){this.print()}}}};p(y.prototype,{getSVG:function(b){var c=this,a,f,d,i,e,h,j=w(c.options,b);if(!q.createElementNS)q.createElementNS=function(l,g){var n=q.createElement(g);n.getBBox=function(){return c.renderer.Element.prototype.getBBox.apply({element:n})};return n};a=r("div",null,{position:"absolute",top:"-9999em",width:c.chartWidth+"px",height:c.chartHeight+"px"},q.body); -p(j.chart,{renderTo:a,forExport:true});j.exporting.enabled=false;j.chart.plotBackgroundImage=null;j.series=[];s(c.series,function(l){d=l.options;d.animation=false;d.showCheckbox=false;if(d&&d.marker&&/^url\(/.test(d.marker.symbol))d.marker.symbol="circle";d.data=[];s(l.data,function(g){i=g.config;e={x:g.x,y:g.y,name:g.name};typeof i=="object"&&g.config&&i.constructor!=Array&&p(e,i);d.data.push(e);(h=g.config&&g.config.marker)&&/^url\(/.test(h.symbol)&&delete h.symbol});j.series.push(d)});b=new Highcharts.Chart(j); -f=b.container.innerHTML;j=null;b.destroy();z(a);f=f.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/isTracker="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/id=([^" >]+)/g,'id="$1"').replace(/class=([^" ]+)/g,'class="$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(l){return l.toLowerCase()});f=f.replace(/(url\(#highcharts-[0-9]+)"/g,"$1").replace(/"/g, -"'");if(f.match(/ xmlns="/g).length==2)f=f.replace(/xmlns="[^"]+"/,"");return f},exportChart:function(b,c){var a,f=this.getSVG(c);b=w(this.options.exporting,b);a=r("form",{method:"post",action:b.url},{display:"none"},q.body);s(["filename","type","width","svg"],function(d){r("input",{type:"hidden",name:d,value:{filename:b.filename||"chart",type:b.type,width:b.width,svg:f}[d]},null,a)});a.submit();z(a)},print:function(){var b=this,c=b.container,a=[],f=c.parentNode,d=q.body,i=d.childNodes;if(!b.isPrinting){b.isPrinting= -true;s(i,function(e,h){if(e.nodeType==1){a[h]=e.style.display;e.style.display="none"}});d.appendChild(c);E.print();setTimeout(function(){f.appendChild(c);s(i,function(e,h){if(e.nodeType==1)e.style.display=a[h]});b.isPrinting=false},1E3)}},contextMenu:function(b,c,a,f,d,i){var e=this,h=e.options.navigation,j=h.menuItemStyle,l=e.chartWidth,g=e.chartHeight,n="cache-"+b,m=e[n],o=D(d,i),t,x;if(!m){e[n]=m=r("div",{className:"highcharts-"+b},{position:"absolute",zIndex:1E3,padding:o+"px"},e.container);t= -r("div",null,p({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},h.menuStyle),m);x=function(){u(m,{display:"none"})};C(m,"mouseleave",x);s(c,function(v){if(v)r("div",{onmouseover:function(){u(this,h.menuItemHoverStyle)},onmouseout:function(){u(this,j)},innerHTML:v.text||k.getOptions().lang[v.textKey]},p({cursor:"pointer"},j),t)[A?"ontouchstart":"onclick"]=function(){x();v.onclick.apply(e,arguments)}});e.exportMenuWidth=m.offsetWidth;e.exportMenuHeight= -m.offsetHeight}b={display:"block"};if(a+e.exportMenuWidth>l)b.right=l-a-d-o+"px";else b.left=a-o+"px";if(f+i+e.exportMenuHeight>g)b.bottom=g-f-o+"px";else b.top=f+i-o+"px";u(m,b)},addButton:function(b){function c(){g.attr(o);l.attr(m)}var a=this,f=a.renderer,d=w(a.options.navigation.buttonOptions,b),i=d.onclick,e=d.menuItems,h=d.width,j=d.height,l,g,n;b=d.borderWidth;var m={stroke:d.borderColor},o={stroke:d.symbolStroke,fill:d.symbolFill};if(d.enabled!==false){l=f.rect(0,0,h,j,d.borderRadius,b).align(d, -true).attr(p({fill:d.backgroundColor,"stroke-width":b,zIndex:19},m)).add();n=f.rect(0,0,h,j,0).align(d).attr({fill:"rgba(255, 255, 255, 0.001)",title:k.getOptions().lang[d._titleKey],zIndex:21}).css({cursor:"pointer"}).on("mouseover",function(){g.attr({stroke:d.hoverSymbolStroke,fill:d.hoverSymbolFill});l.attr({stroke:d.hoverBorderColor})}).on("mouseout",c).on("click",c).add();if(e)i=function(){c();var t=n.getBBox();a.contextMenu("export-menu",e,t.x,t.y,h,j)};n.on("click",function(){i.apply(a,arguments)}); -g=f.symbol(d.symbol,d.symbolX,d.symbolY,(d.symbolSize||12)/2).align(d,true).attr(p(o,{"stroke-width":d.symbolStrokeWidth||1,zIndex:20})).add()}}});k.Renderer.prototype.symbols.exportIcon=function(b,c,a){return["M",b-a,c+a,"L",b+a,c+a,b+a,c+a*0.5,b-a,c+a*0.5,"Z","M",b,c+a*0.5,"L",b-a*0.5,c-a/3,b-a/6,c-a/3,b-a/6,c-a,b+a/6,c-a,b+a/6,c-a/3,b+a*0.5,c-a/3,"Z"]};k.Renderer.prototype.symbols.printIcon=function(b,c,a){return["M",b-a,c+a*0.5,"L",b+a,c+a*0.5,b+a,c-a/3,b-a,c-a/3,"Z","M",b-a*0.5,c-a/3,"L",b-a* -0.5,c-a,b+a*0.5,c-a,b+a*0.5,c-a/3,"Z","M",b-a*0.5,c+a*0.5,"L",b-a*0.75,c+a,b+a*0.75,c+a,b+a*0.5,c+a*0.5,"Z"]};y.prototype.callbacks.push(function(b){var c,a=b.options.exporting,f=a.buttons;if(a.enabled!==false)for(c in f)b.addButton(f[c])})})(); diff --git a/Website/static/Highcharts-2/js/modules/exporting.src.js b/Website/static/Highcharts-2/js/modules/exporting.src.js deleted file mode 100755 index 0417c10..0000000 --- a/Website/static/Highcharts-2/js/modules/exporting.src.js +++ /dev/null @@ -1,673 +0,0 @@ -/** - * @license Highcharts JS v2.1.4 (2011-03-02) - * Exporting module - * - * (c) 2010 Torstein Hønsi - * - * License: www.highcharts.com/license - */ - -// JSLint options: -/*global Highcharts, document, window, Math, setTimeout */ - -(function() { // encapsulate - -// create shortcuts -var HC = Highcharts, - Chart = HC.Chart, - addEvent = HC.addEvent, - createElement = HC.createElement, - discardElement = HC.discardElement, - css = HC.css, - merge = HC.merge, - each = HC.each, - extend = HC.extend, - math = Math, - mathMax = math.max, - doc = document, - win = window, - hasTouch = 'ontouchstart' in doc.documentElement, - M = 'M', - L = 'L', - DIV = 'div', - HIDDEN = 'hidden', - NONE = 'none', - PREFIX = 'highcharts-', - ABSOLUTE = 'absolute', - PX = 'px', - - - - // Add language and get the defaultOptions - defaultOptions = HC.setOptions({ - lang: { - downloadPNG: 'Download PNG image', - downloadJPEG: 'Download JPEG image', - downloadPDF: 'Download PDF document', - downloadSVG: 'Download SVG vector image', - exportButtonTitle: 'Export to raster or vector image', - printButtonTitle: 'Print the chart' - } - }); - -// Buttons and menus are collected in a separate config option set called 'navigation'. -// This can be extended later to add control buttons like zoom and pan right click menus. -defaultOptions.navigation = { - menuStyle: { - border: '1px solid #A0A0A0', - background: '#FFFFFF' - }, - menuItemStyle: { - padding: '0 5px', - background: NONE, - color: '#303030', - fontSize: hasTouch ? '14px' : '11px' - }, - menuItemHoverStyle: { - background: '#4572A5', - color: '#FFFFFF' - }, - - buttonOptions: { - align: 'right', - backgroundColor: { - linearGradient: [0, 0, 0, 20], - stops: [ - [0.4, '#F7F7F7'], - [0.6, '#E3E3E3'] - ] - }, - borderColor: '#B0B0B0', - borderRadius: 3, - borderWidth: 1, - //enabled: true, - height: 20, - hoverBorderColor: '#909090', - hoverSymbolFill: '#81A7CF', - hoverSymbolStroke: '#4572A5', - symbolFill: '#E0E0E0', - //symbolSize: 12, - symbolStroke: '#A0A0A0', - //symbolStrokeWidth: 1, - symbolX: 11.5, - symbolY: 10.5, - verticalAlign: 'top', - width: 24, - y: 10 - } -}; - - - -// Add the export related options -defaultOptions.exporting = { - //enabled: true, - //filename: 'chart', - type: 'image/png', - url: 'http://export.highcharts.com/', - width: 800, - buttons: { - exportButton: { - //enabled: true, - symbol: 'exportIcon', - x: -10, - symbolFill: '#A8BF77', - hoverSymbolFill: '#768F3E', - _titleKey: 'exportButtonTitle', - menuItems: [{ - textKey: 'downloadPNG', - onclick: function() { - this.exportChart(); - } - }, { - textKey: 'downloadJPEG', - onclick: function() { - this.exportChart({ - type: 'image/jpeg' - }); - } - }, { - textKey: 'downloadPDF', - onclick: function() { - this.exportChart({ - type: 'application/pdf' - }); - } - }, { - textKey: 'downloadSVG', - onclick: function() { - this.exportChart({ - type: 'image/svg+xml' - }); - } - }/*, { - text: 'View SVG', - onclick: function() { - var svg = this.getSVG() - .replace(//g, '>'); - - doc.body.innerHTML = '
    '+ svg +'
    '; - } - }*/] - - }, - printButton: { - //enabled: true, - symbol: 'printIcon', - x: -36, - symbolFill: '#B5C9DF', - hoverSymbolFill: '#779ABF', - _titleKey: 'printButtonTitle', - onclick: function() { - this.print(); - } - } - } -}; - - - -extend(Chart.prototype, { - /** - * Return an SVG representation of the chart - * - * @param additionalOptions {Object} Additional chart options for the generated SVG representation - */ - getSVG: function(additionalOptions) { - var chart = this, - chartCopy, - sandbox, - svg, - seriesOptions, - config, - pointOptions, - pointMarker, - options = merge(chart.options, additionalOptions); // copy the options and add extra options - - // IE compatibility hack for generating SVG content that it doesn't really understand - if (!doc.createElementNS) { - doc.createElementNS = function(ns, tagName) { - var elem = doc.createElement(tagName); - elem.getBBox = function() { - return chart.renderer.Element.prototype.getBBox.apply({ element: elem }); - }; - return elem; - }; - } - - // create a sandbox where a new chart will be generated - sandbox = createElement(DIV, null, { - position: ABSOLUTE, - top: '-9999em', - width: chart.chartWidth + PX, - height: chart.chartHeight + PX - }, doc.body); - - // override some options - extend(options.chart, { - renderTo: sandbox, - forExport: true - }); - options.exporting.enabled = false; // hide buttons in print - options.chart.plotBackgroundImage = null; // the converter doesn't handle images - // prepare for replicating the chart - options.series = []; - each(chart.series, function(serie) { - seriesOptions = serie.options; - - seriesOptions.animation = false; // turn off animation - seriesOptions.showCheckbox = false; - - // remove image markers - if (seriesOptions && seriesOptions.marker && /^url\(/.test(seriesOptions.marker.symbol)) { - seriesOptions.marker.symbol = 'circle'; - } - - seriesOptions.data = []; - - each(serie.data, function(point) { - - // extend the options by those values that can be expressed in a number or array config - config = point.config; - pointOptions = { - x: point.x, - y: point.y, - name: point.name - }; - - if (typeof config == 'object' && point.config && config.constructor != Array) { - extend(pointOptions, config); - } - - seriesOptions.data.push(pointOptions); // copy fresh updated data - - // remove image markers - pointMarker = point.config && point.config.marker; - if (pointMarker && /^url\(/.test(pointMarker.symbol)) { - delete pointMarker.symbol; - } - }); - - options.series.push(seriesOptions); - }); - - // generate the chart copy - chartCopy = new Highcharts.Chart(options); - - // get the SVG from the container's innerHTML - svg = chartCopy.container.innerHTML; - - // free up memory - options = null; - chartCopy.destroy(); - discardElement(sandbox); - - // sanitize - svg = svg - .replace(/zIndex="[^"]+"/g, '') - .replace(/isShadow="[^"]+"/g, '') - .replace(/symbolName="[^"]+"/g, '') - .replace(/jQuery[0-9]+="[^"]+"/g, '') - .replace(/isTracker="[^"]+"/g, '') - .replace(/url\([^#]+#/g, 'url(#') - /*.replace(/')*/ - /* This fails in IE < 8 - .replace(/([0-9]+)\.([0-9]+)/g, function(s1, s2, s3) { // round off to save weight - return s2 +'.'+ s3[0]; - })*/ - - // IE specific - .replace(/id=([^" >]+)/g, 'id="$1"') - .replace(/class=([^" ]+)/g, 'class="$1"') - .replace(/ transform /g, ' ') - .replace(/:(path|rect)/g, '$1') - .replace(/style="([^"]+)"/g, function(s) { - return s.toLowerCase(); - }); - - // IE9 beta bugs with innerHTML. Test again with final IE9. - svg = svg.replace(/(url\(#highcharts-[0-9]+)"/g, '$1') - .replace(/"/g, "'"); - if (svg.match(/ xmlns="/g).length == 2) { - svg = svg.replace(/xmlns="[^"]+"/, ''); - } - - return svg; - }, - - /** - * Submit the SVG representation of the chart to the server - * @param {Object} options Exporting options. Possible members are url, type and width. - * @param {Object} chartOptions Additional chart options for the SVG representation of the chart - */ - exportChart: function(options, chartOptions) { - var form, - chart = this, - svg = chart.getSVG(chartOptions); - - // merge the options - options = merge(chart.options.exporting, options); - - // create the form - form = createElement('form', { - method: 'post', - action: options.url - }, { - display: NONE - }, doc.body); - - // add the values - each(['filename', 'type', 'width', 'svg'], function(name) { - createElement('input', { - type: HIDDEN, - name: name, - value: { - filename: options.filename || 'chart', - type: options.type, - width: options.width, - svg: svg - }[name] - }, null, form); - }); - - // submit - form.submit(); - - // clean up - discardElement(form); - }, - - /** - * Print the chart - */ - print: function() { - - var chart = this, - container = chart.container, - origDisplay = [], - origParent = container.parentNode, - body = doc.body, - childNodes = body.childNodes; - - if (chart.isPrinting) { // block the button while in printing mode - return; - } - - chart.isPrinting = true; - - // hide all body content - each(childNodes, function(node, i) { - if (node.nodeType == 1) { - origDisplay[i] = node.style.display; - node.style.display = NONE; - } - }); - - // pull out the chart - body.appendChild(container); - - // print - win.print(); - - // allow the browser to prepare before reverting - setTimeout(function() { - - // put the chart back in - origParent.appendChild(container); - - // restore all body content - each(childNodes, function(node, i) { - if (node.nodeType == 1) { - node.style.display = origDisplay[i]; - } - }); - - chart.isPrinting = false; - - }, 1000); - - }, - - /** - * Display a popup menu for choosing the export type - * - * @param {String} name An identifier for the menu - * @param {Array} items A collection with text and onclicks for the items - * @param {Number} x The x position of the opener button - * @param {Number} y The y position of the opener button - * @param {Number} width The width of the opener button - * @param {Number} height The height of the opener button - */ - contextMenu: function(name, items, x, y, width, height) { - var chart = this, - navOptions = chart.options.navigation, - menuItemStyle = navOptions.menuItemStyle, - chartWidth = chart.chartWidth, - chartHeight = chart.chartHeight, - cacheName = 'cache-'+ name, - menu = chart[cacheName], - menuPadding = mathMax(width, height), // for mouse leave detection - boxShadow = '3px 3px 10px #888', - innerMenu, - hide, - menuStyle; - - // create the menu only the first time - if (!menu) { - - // create a HTML element above the SVG - chart[cacheName] = menu = createElement(DIV, { - className: PREFIX + name - }, { - position: ABSOLUTE, - zIndex: 1000, - padding: menuPadding + PX - }, chart.container); - - innerMenu = createElement(DIV, null, - extend({ - MozBoxShadow: boxShadow, - WebkitBoxShadow: boxShadow, - boxShadow: boxShadow - }, navOptions.menuStyle) , menu); - - // hide on mouse out - hide = function() { - css(menu, { display: NONE }); - }; - - addEvent(menu, 'mouseleave', hide); - - - // create the items - each(items, function(item) { - if (item) { - var div = createElement(DIV, { - onmouseover: function() { - css(this, navOptions.menuItemHoverStyle); - }, - onmouseout: function() { - css(this, menuItemStyle); - }, - innerHTML: item.text || HC.getOptions().lang[item.textKey] - }, extend({ - cursor: 'pointer' - }, menuItemStyle), innerMenu); - - div[hasTouch ? 'ontouchstart' : 'onclick'] = function() { - hide(); - item.onclick.apply(chart, arguments); - }; - - } - }); - - chart.exportMenuWidth = menu.offsetWidth; - chart.exportMenuHeight = menu.offsetHeight; - } - - menuStyle = { display: 'block' }; - - // if outside right, right align it - if (x + chart.exportMenuWidth > chartWidth) { - menuStyle.right = (chartWidth - x - width - menuPadding) + PX; - } else { - menuStyle.left = (x - menuPadding) + PX; - } - // if outside bottom, bottom align it - if (y + height + chart.exportMenuHeight > chartHeight) { - menuStyle.bottom = (chartHeight - y - menuPadding) + PX; - } else { - menuStyle.top = (y + height - menuPadding) + PX; - } - - css(menu, menuStyle); - }, - - /** - * Add the export button to the chart - */ - addButton: function(options) { - var chart = this, - renderer = chart.renderer, - btnOptions = merge(chart.options.navigation.buttonOptions, options), - onclick = btnOptions.onclick, - menuItems = btnOptions.menuItems, - /*position = chart.getAlignment(btnOptions), - buttonLeft = position.x, - buttonTop = position.y,*/ - buttonWidth = btnOptions.width, - buttonHeight = btnOptions.height, - box, - symbol, - button, - borderWidth = btnOptions.borderWidth, - boxAttr = { - stroke: btnOptions.borderColor - - }, - symbolAttr = { - stroke: btnOptions.symbolStroke, - fill: btnOptions.symbolFill - }; - - if (btnOptions.enabled === false) { - return; - } - - // element to capture the click - function revert() { - symbol.attr(symbolAttr); - box.attr(boxAttr); - } - - // the box border - box = renderer.rect( - 0, - 0, - buttonWidth, - buttonHeight, - btnOptions.borderRadius, - borderWidth - ) - //.translate(buttonLeft, buttonTop) // to allow gradients - .align(btnOptions, true) - .attr(extend({ - fill: btnOptions.backgroundColor, - 'stroke-width': borderWidth, - zIndex: 19 - }, boxAttr)).add(); - - // the invisible element to track the clicks - button = renderer.rect( - 0, - 0, - buttonWidth, - buttonHeight, - 0 - ) - .align(btnOptions) - .attr({ - fill: 'rgba(255, 255, 255, 0.001)', - title: HC.getOptions().lang[btnOptions._titleKey], - zIndex: 21 - }).css({ - cursor: 'pointer' - }) - .on('mouseover', function() { - symbol.attr({ - stroke: btnOptions.hoverSymbolStroke, - fill: btnOptions.hoverSymbolFill - }); - box.attr({ - stroke: btnOptions.hoverBorderColor - }); - }) - .on('mouseout', revert) - .on('click', revert) - .add(); - - //addEvent(button.element, 'click', revert); - - // add the click event - if (menuItems) { - onclick = function(e) { - revert(); - var bBox = button.getBBox(); - chart.contextMenu('export-menu', menuItems, bBox.x, bBox.y, buttonWidth, buttonHeight); - }; - } - /*addEvent(button.element, 'click', function() { - onclick.apply(chart, arguments); - });*/ - button.on('click', function() { - onclick.apply(chart, arguments); - }); - - // the icon - symbol = renderer.symbol( - btnOptions.symbol, - btnOptions.symbolX, - btnOptions.symbolY, - (btnOptions.symbolSize || 12) / 2 - ) - .align(btnOptions, true) - .attr(extend(symbolAttr, { - 'stroke-width': btnOptions.symbolStrokeWidth || 1, - zIndex: 20 - })).add(); - - - - } -}); - -// Create the export icon -HC.Renderer.prototype.symbols.exportIcon = function(x, y, radius) { - return [ - M, // the disk - x - radius, y + radius, - L, - x + radius, y + radius, - x + radius, y + radius * 0.5, - x - radius, y + radius * 0.5, - 'Z', - M, // the arrow - x, y + radius * 0.5, - L, - x - radius * 0.5, y - radius / 3, - x - radius / 6, y - radius / 3, - x - radius / 6, y - radius, - x + radius / 6, y - radius, - x + radius / 6, y - radius / 3, - x + radius * 0.5, y - radius / 3, - 'Z' - ]; -}; -// Create the print icon -HC.Renderer.prototype.symbols.printIcon = function(x, y, radius) { - return [ - M, // the printer - x - radius, y + radius * 0.5, - L, - x + radius, y + radius * 0.5, - x + radius, y - radius / 3, - x - radius, y - radius / 3, - 'Z', - M, // the upper sheet - x - radius * 0.5, y - radius / 3, - L, - x - radius * 0.5, y - radius, - x + radius * 0.5, y - radius, - x + radius * 0.5, y - radius / 3, - 'Z', - M, // the lower sheet - x - radius * 0.5, y + radius * 0.5, - L, - x - radius * 0.75, y + radius, - x + radius * 0.75, y + radius, - x + radius * 0.5, y + radius * 0.5, - 'Z' - ]; -}; - - -// Add the buttons on chart load -Chart.prototype.callbacks.push(function(chart) { - var n, - exportingOptions = chart.options.exporting, - buttons = exportingOptions.buttons; - - if (exportingOptions.enabled !== false) { - - for (n in buttons) { - chart.addButton(buttons[n]); - } - } -}); - - -})(); \ No newline at end of file diff --git a/Website/static/Highcharts-2/js/themes/dark-blue.js b/Website/static/Highcharts-2/js/themes/dark-blue.js deleted file mode 100755 index a39d6ca..0000000 --- a/Website/static/Highcharts-2/js/themes/dark-blue.js +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Dark blue theme for Highcharts JS - * @author Torstein Hønsi - */ - -Highcharts.theme = { - colors: ["#DDDF0D", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee", - "#55BF3B", "#DF5353", "#7798BF", "#aaeeee"], - chart: { - backgroundColor: { - linearGradient: [0, 0, 250, 500], - stops: [ - [0, 'rgb(48, 48, 96)'], - [1, 'rgb(0, 0, 0)'] - ] - }, - borderColor: '#000000', - borderWidth: 2, - className: 'dark-container', - plotBackgroundColor: 'rgba(255, 255, 255, .1)', - plotBorderColor: '#CCCCCC', - plotBorderWidth: 1 - }, - title: { - style: { - color: '#C0C0C0', - font: 'bold 16px "Trebuchet MS", Verdana, sans-serif' - } - }, - subtitle: { - style: { - color: '#666666', - font: 'bold 12px "Trebuchet MS", Verdana, sans-serif' - } - }, - xAxis: { - gridLineColor: '#333333', - gridLineWidth: 1, - labels: { - style: { - color: '#A0A0A0' - } - }, - lineColor: '#A0A0A0', - tickColor: '#A0A0A0', - title: { - style: { - color: '#CCC', - fontWeight: 'bold', - fontSize: '12px', - fontFamily: 'Trebuchet MS, Verdana, sans-serif' - - } - } - }, - yAxis: { - gridLineColor: '#333333', - labels: { - style: { - color: '#A0A0A0' - } - }, - lineColor: '#A0A0A0', - minorTickInterval: null, - tickColor: '#A0A0A0', - tickWidth: 1, - title: { - style: { - color: '#CCC', - fontWeight: 'bold', - fontSize: '12px', - fontFamily: 'Trebuchet MS, Verdana, sans-serif' - } - } - }, - legend: { - itemStyle: { - font: '9pt Trebuchet MS, Verdana, sans-serif', - color: '#A0A0A0' - } - }, - tooltip: { - backgroundColor: 'rgba(0, 0, 0, 0.75)', - style: { - color: '#F0F0F0' - } - }, - toolbar: { - itemStyle: { - color: 'silver' - } - }, - plotOptions: { - line: { - dataLabels: { - color: '#CCC' - }, - marker: { - lineColor: '#333' - } - }, - spline: { - marker: { - lineColor: '#333' - } - }, - scatter: { - marker: { - lineColor: '#333' - } - } - }, - legend: { - itemStyle: { - color: '#CCC' - }, - itemHoverStyle: { - color: '#FFF' - }, - itemHiddenStyle: { - color: '#444' - } - }, - credits: { - style: { - color: '#666' - } - }, - labels: { - style: { - color: '#CCC' - } - }, - - navigation: { - buttonOptions: { - backgroundColor: { - linearGradient: [0, 0, 0, 20], - stops: [ - [0.4, '#606060'], - [0.6, '#333333'] - ] - }, - borderColor: '#000000', - symbolStroke: '#C0C0C0', - hoverSymbolStroke: '#FFFFFF' - } - }, - - exporting: { - buttons: { - exportButton: { - symbolFill: '#55BE3B' - }, - printButton: { - symbolFill: '#7797BE' - } - } - }, - - // special colors for some of the - legendBackgroundColor: 'rgba(0, 0, 0, 0.5)', - legendBackgroundColorSolid: 'rgb(35, 35, 70)', - dataLabelsColor: '#444', - textColor: '#C0C0C0', - maskColor: 'rgba(255,255,255,0.3)' -}; - -// Apply the theme -var highchartsOptions = Highcharts.setOptions(Highcharts.theme); \ No newline at end of file diff --git a/Website/static/Highcharts-2/js/themes/dark-green.js b/Website/static/Highcharts-2/js/themes/dark-green.js deleted file mode 100755 index cec50e7..0000000 --- a/Website/static/Highcharts-2/js/themes/dark-green.js +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Dark blue theme for Highcharts JS - * @author Torstein Hønsi - */ - -Highcharts.theme = { - colors: ["#DDDF0D", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee", - "#55BF3B", "#DF5353", "#7798BF", "#aaeeee"], - chart: { - backgroundColor: { - linearGradient: [0, 0, 250, 500], - stops: [ - [0, 'rgb(48, 96, 48)'], - [1, 'rgb(0, 0, 0)'] - ] - }, - borderColor: '#000000', - borderWidth: 2, - className: 'dark-container', - plotBackgroundColor: 'rgba(255, 255, 255, .1)', - plotBorderColor: '#CCCCCC', - plotBorderWidth: 1 - }, - title: { - style: { - color: '#C0C0C0', - font: 'bold 16px "Trebuchet MS", Verdana, sans-serif' - } - }, - subtitle: { - style: { - color: '#666666', - font: 'bold 12px "Trebuchet MS", Verdana, sans-serif' - } - }, - xAxis: { - gridLineColor: '#333333', - gridLineWidth: 1, - labels: { - style: { - color: '#A0A0A0' - } - }, - lineColor: '#A0A0A0', - tickColor: '#A0A0A0', - title: { - style: { - color: '#CCC', - fontWeight: 'bold', - fontSize: '12px', - fontFamily: 'Trebuchet MS, Verdana, sans-serif' - - } - } - }, - yAxis: { - gridLineColor: '#333333', - labels: { - style: { - color: '#A0A0A0' - } - }, - lineColor: '#A0A0A0', - minorTickInterval: null, - tickColor: '#A0A0A0', - tickWidth: 1, - title: { - style: { - color: '#CCC', - fontWeight: 'bold', - fontSize: '12px', - fontFamily: 'Trebuchet MS, Verdana, sans-serif' - } - } - }, - legend: { - itemStyle: { - font: '9pt Trebuchet MS, Verdana, sans-serif', - color: '#A0A0A0' - } - }, - tooltip: { - backgroundColor: 'rgba(0, 0, 0, 0.75)', - style: { - color: '#F0F0F0' - } - }, - toolbar: { - itemStyle: { - color: 'silver' - } - }, - plotOptions: { - line: { - dataLabels: { - color: '#CCC' - }, - marker: { - lineColor: '#333' - } - }, - spline: { - marker: { - lineColor: '#333' - } - }, - scatter: { - marker: { - lineColor: '#333' - } - } - }, - legend: { - itemStyle: { - color: '#CCC' - }, - itemHoverStyle: { - color: '#FFF' - }, - itemHiddenStyle: { - color: '#444' - } - }, - credits: { - style: { - color: '#666' - } - }, - labels: { - style: { - color: '#CCC' - } - }, - - navigation: { - buttonOptions: { - backgroundColor: { - linearGradient: [0, 0, 0, 20], - stops: [ - [0.4, '#606060'], - [0.6, '#333333'] - ] - }, - borderColor: '#000000', - symbolStroke: '#C0C0C0', - hoverSymbolStroke: '#FFFFFF' - } - }, - - exporting: { - buttons: { - exportButton: { - symbolFill: '#55BE3B' - }, - printButton: { - symbolFill: '#7797BE' - } - } - }, - - // special colors for some of the - legendBackgroundColor: 'rgba(0, 0, 0, 0.5)', - legendBackgroundColorSolid: 'rgb(35, 35, 70)', - dataLabelsColor: '#444', - textColor: '#C0C0C0', - maskColor: 'rgba(255,255,255,0.3)' -}; - -// Apply the theme -var highchartsOptions = Highcharts.setOptions(Highcharts.theme); \ No newline at end of file diff --git a/Website/static/Highcharts-2/js/themes/gray.js b/Website/static/Highcharts-2/js/themes/gray.js deleted file mode 100755 index a292a76..0000000 --- a/Website/static/Highcharts-2/js/themes/gray.js +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Gray theme for Highcharts JS - * @author Torstein Hønsi - */ - -Highcharts.theme = { - colors: ["#DDDF0D", "#7798BF", "#55BF3B", "#DF5353", "#aaeeee", "#ff0066", "#eeaaee", - "#55BF3B", "#DF5353", "#7798BF", "#aaeeee"], - chart: { - backgroundColor: { - linearGradient: [0, 0, 0, 400], - stops: [ - [0, 'rgb(96, 96, 96)'], - [1, 'rgb(16, 16, 16)'] - ] - }, - borderWidth: 0, - borderRadius: 15, - plotBackgroundColor: null, - plotShadow: false, - plotBorderWidth: 0 - }, - title: { - style: { - color: '#FFF', - font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' - } - }, - subtitle: { - style: { - color: '#DDD', - font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' - } - }, - xAxis: { - gridLineWidth: 0, - lineColor: '#999', - tickColor: '#999', - labels: { - style: { - color: '#999', - fontWeight: 'bold' - } - }, - title: { - style: { - color: '#AAA', - font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' - } - } - }, - yAxis: { - alternateGridColor: null, - minorTickInterval: null, - gridLineColor: 'rgba(255, 255, 255, .1)', - lineWidth: 0, - tickWidth: 0, - labels: { - style: { - color: '#999', - fontWeight: 'bold' - } - }, - title: { - style: { - color: '#AAA', - font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' - } - } - }, - legend: { - itemStyle: { - color: '#CCC' - }, - itemHoverStyle: { - color: '#FFF' - }, - itemHiddenStyle: { - color: '#333' - } - }, - labels: { - style: { - color: '#CCC' - } - }, - tooltip: { - backgroundColor: { - linearGradient: [0, 0, 0, 50], - stops: [ - [0, 'rgba(96, 96, 96, .8)'], - [1, 'rgba(16, 16, 16, .8)'] - ] - }, - borderWidth: 0, - style: { - color: '#FFF' - } - }, - - - plotOptions: { - line: { - dataLabels: { - color: '#CCC' - }, - marker: { - lineColor: '#333' - } - }, - spline: { - marker: { - lineColor: '#333' - } - }, - scatter: { - marker: { - lineColor: '#333' - } - } - }, - - toolbar: { - itemStyle: { - color: '#CCC' - } - }, - - navigation: { - buttonOptions: { - backgroundColor: { - linearGradient: [0, 0, 0, 20], - stops: [ - [0.4, '#606060'], - [0.6, '#333333'] - ] - }, - borderColor: '#000000', - symbolStroke: '#C0C0C0', - hoverSymbolStroke: '#FFFFFF' - } - }, - - exporting: { - buttons: { - exportButton: { - symbolFill: '#55BE3B' - }, - printButton: { - symbolFill: '#7797BE' - } - } - }, - - // special colors for some of the demo examples - legendBackgroundColor: 'rgba(48, 48, 48, 0.8)', - legendBackgroundColorSolid: 'rgb(70, 70, 70)', - dataLabelsColor: '#444', - textColor: '#E0E0E0', - maskColor: 'rgba(255,255,255,0.3)' -}; - -// Apply the theme -var highchartsOptions = Highcharts.setOptions(Highcharts.theme); diff --git a/Website/static/Highcharts-2/js/themes/grid.js b/Website/static/Highcharts-2/js/themes/grid.js deleted file mode 100755 index ab2011b..0000000 --- a/Website/static/Highcharts-2/js/themes/grid.js +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Grid theme for Highcharts JS - * @author Torstein Hønsi - */ - -Highcharts.theme = { - colors: ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4'], - chart: { - backgroundColor: { - linearGradient: [0, 0, 500, 500], - stops: [ - [0, 'rgb(255, 255, 255)'], - [1, 'rgb(240, 240, 255)'] - ] - } -, - borderWidth: 2, - plotBackgroundColor: 'rgba(255, 255, 255, .9)', - plotShadow: true, - plotBorderWidth: 1 - }, - title: { - style: { - color: '#000', - font: 'bold 16px "Trebuchet MS", Verdana, sans-serif' - } - }, - subtitle: { - style: { - color: '#666666', - font: 'bold 12px "Trebuchet MS", Verdana, sans-serif' - } - }, - xAxis: { - gridLineWidth: 1, - lineColor: '#000', - tickColor: '#000', - labels: { - style: { - color: '#000', - font: '11px Trebuchet MS, Verdana, sans-serif' - } - }, - title: { - style: { - color: '#333', - fontWeight: 'bold', - fontSize: '12px', - fontFamily: 'Trebuchet MS, Verdana, sans-serif' - - } - } - }, - yAxis: { - minorTickInterval: 'auto', - lineColor: '#000', - lineWidth: 1, - tickWidth: 1, - tickColor: '#000', - labels: { - style: { - color: '#000', - font: '11px Trebuchet MS, Verdana, sans-serif' - } - }, - title: { - style: { - color: '#333', - fontWeight: 'bold', - fontSize: '12px', - fontFamily: 'Trebuchet MS, Verdana, sans-serif' - } - } - }, - legend: { - itemStyle: { - font: '9pt Trebuchet MS, Verdana, sans-serif', - color: 'black' - - }, - itemHoverStyle: { - color: '#039' - }, - itemHiddenStyle: { - color: 'gray' - } - }, - labels: { - style: { - color: '#99b' - } - } -}; - -// Apply the theme -var highchartsOptions = Highcharts.setOptions(Highcharts.theme); - diff --git a/Website/static/autosave.js b/Website/static/autosave.js deleted file mode 100644 index ea509a7..0000000 --- a/Website/static/autosave.js +++ /dev/null @@ -1,72 +0,0 @@ -// -// Autosave functionality -- this is the browser version that saves to the server -// -// External interfaces are from: -// SocialCalcTableEditor (for autosave upon edit) -// - -if (!Aspiring) { - Aspiring = {}; -} -Aspiring.AutoSave = {}; -Aspiring.AutoSave.selectedFile = "default"; -Aspiring.AutoSave.autoSaveTimeoutId = null; -Aspiring.AutoSave.SaveTimeout = 10000; // 10 seconds - - -// This is called from the SocialCalcTableEditor -// EditorSaveEdit function -SocialCalc.Callbacks.editAutoSave = function() { - // mark filename dirty - // start a timer - console.log("in auto save"); - Aspiring.AutoSave.setCurrentFileDirty(); - if (Aspiring.AutoSave.autoSaveTimeoutId != null) { - console.log("timer already running"); - } else { - Aspiring.AutoSave.autoSaveTimeoutId = - window.setTimeout(Aspiring.AutoSave.TimerExpiry, Aspiring.AutoSave.SaveTimeout ); - } -} - -Aspiring.AutoSave.TimerExpiry = function() { - console.log("auto save timer"); - if (SocialCalc.GetCurrentWorkBookControl().workbook.spreadsheet.editor.state == "start") { - // save file - if ( Aspiring.AutoSave.selectedFile == "default") { - Aspiring.AutoSave.selectedFile = "Untitled"; - } - - var message = {}; - message.fname = Aspiring.AutoSave.selectedFile; - message.data = SocialCalc.WorkBookControlSaveSheet(); - - $.postJSON("/save", message, function(response) { - msg = response["data"]; - console.log(msg); - }); - - - console.log("saved as "+Aspiring.AutoSave.selectedFile); - Aspiring.AutoSave.autoSaveTimeoutId = null; - // unmark dirty - Aspiring.AutoSave.updateFileName(Aspiring.AutoSave.selectedFile); - } else { - // user is editing - console.log("skip autosave, user is editing"); - Aspiring.AutoSave.autoSaveTimeoutId = window.setTimeout(fileAutoSaveTimerExpiry, Aspiring.AutoSave.SaveTimeout); - } -}; - -Aspiring.AutoSave.updateFileName = function(name) { - Aspiring.AutoSave.selectedFile = name; - document.getElementById("filenameholder").innerHTML=name; -}; - -Aspiring.AutoSave.setCurrentFileDirty = function() { - if (Aspiring.AutoSave.selectedFile == "default") { - Aspiring.AutoSave.selectedFile = "Untitled"; - } - document.getElementById("filenameholder").innerHTML=Aspiring.AutoSave.selectedFile+"(*)"; -}; - diff --git a/Website/static/checkmark.png b/Website/static/checkmark.png deleted file mode 100644 index b435424..0000000 Binary files a/Website/static/checkmark.png and /dev/null differ diff --git a/Website/static/excanvas.min.js b/Website/static/excanvas.min.js deleted file mode 100644 index 12c74f7..0000000 --- a/Website/static/excanvas.min.js +++ /dev/null @@ -1 +0,0 @@ -if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&").replace(/"/g,""")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AHAL.x){AL.x=Z.x}if(AG.y==null||Z.yAL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('','','');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()}; \ No newline at end of file diff --git a/Website/static/fonts.css b/Website/static/fonts.css deleted file mode 100644 index 27bb751..0000000 --- a/Website/static/fonts.css +++ /dev/null @@ -1,4 +0,0 @@ -@font-face{ - font-family: Anton; /*Custom name of the font*/ - src:url(/static/Anton.ttf); /*static url of the font*/ - } \ No newline at end of file diff --git a/Website/static/formatnumber2.js b/Website/static/formatnumber2.js deleted file mode 100644 index 0cf3f94..0000000 --- a/Website/static/formatnumber2.js +++ /dev/null @@ -1,950 +0,0 @@ -// -/* -// SocialCalc Number Formatting Library -// -// Part of the SocialCalc package. -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - -SocialCalc.FormatNumber = {}; - -SocialCalc.FormatNumber.format_definitions = {}; // Parsed formats are stored here globally - -// Most constants that are often customized for localization are in the SocialCalc.Constants module. -// If you use this module standalone, provide at least the "FormatNumber" values. -// - -// The following values may be customized externally for further localization of the format definitions themselves, -// but that would make them incompatible with other uses and is discouraged. -// - -SocialCalc.FormatNumber.separatorchar = ","; -SocialCalc.FormatNumber.decimalchar = "."; -SocialCalc.FormatNumber.daynames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; -SocialCalc.FormatNumber.daynames3 = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; -SocialCalc.FormatNumber.monthnames3 = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; -SocialCalc.FormatNumber.monthnames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", - "October", "November", "December"]; - -SocialCalc.FormatNumber.allowedcolors = - {BLACK: "#000000", BLUE: "#0000FF", CYAN: "#00FFFF", GREEN: "#00FF00", MAGENTA: "#FF00FF", - RED: "#FF0000", WHITE: "#FFFFFF", YELLOW: "#FFFF00"}; - -SocialCalc.FormatNumber.alloweddates = - {H: "h]", M: "m]", MM: "mm]", S: "s]", SS: "ss]"}; - -// Other constants - -SocialCalc.FormatNumber.commands = - {copy: 1, color: 2, integer_placeholder: 3, fraction_placeholder: 4, decimal: 5, - currency: 6, general:7, separator: 8, date: 9, comparison: 10, section: 11, style: 12}; - -SocialCalc.FormatNumber.datevalues = {julian_offset: 2415019, seconds_in_a_day: 24 * 60 * 60, seconds_in_an_hour: 60 * 60}; - -/* ******************* - - result = SocialCalc.FormatNumber.formatNumberWithFormat = function(rawvalue, format_string, currency_char) - -************************* */ - -SocialCalc.FormatNumber.formatNumberWithFormat = function(rawvalue, format_string, currency_char) { - - var scc = SocialCalc.Constants; - var scfn = SocialCalc.FormatNumber; - - var op, operandstr, fromend, cval, operandstrlc; - var startval, estartval; - var hrs, mins, secs, ehrs, emins, esecs, ampmstr, ymd; - var minOK, mpos; - var result=""; - var thisformat; - var section, gotcomparison, compop, compval, cpos, oppos; - var sectioninfo; - var i, decimalscale, scaledvalue, strvalue, strparts, integervalue, fractionvalue; - var integerdigits2, integerpos, fractionpos, textcolor, textstyle, separatorchar, decimalchar; - var value; // working copy to change sign, etc. - - rawvalue = rawvalue-0; // make sure a number - value = rawvalue; - if (!isFinite(value)) return "NaN"; - - var negativevalue = value < 0 ? 1 : 0; // determine sign, etc. - if (negativevalue) value = -value; - var zerovalue = value == 0 ? 1 : 0; - - currency_char = currency_char || scc.FormatNumber_DefaultCurrency; - - scfn.parse_format_string(scfn.format_definitions, format_string); // make sure format is parsed - thisformat = scfn.format_definitions[format_string]; // Get format structure - - if (!thisformat) throw "Format not parsed error!"; - - section = thisformat.sectioninfo.length - 1; // get number of sections - 1 - - if (thisformat.hascomparison) { // has comparisons - determine which section - section = 0; // set to which section we will use - gotcomparison = 0; // this section has no comparison - for (cpos=0; ;cpos++) { // scan for comparisons - op = thisformat.operators[cpos]; - operandstr = thisformat.operands[cpos]; // get next operator and operand - if (!op) { // at end with no match - if (gotcomparison) { // if comparison but no match - format_string = "General"; // use default of General - scfn.parse_format_string(scfn.format_definitions, format_string); - thisformat = scfn.format_definitions[format_string]; - section = 0; - } - break; // if no comparision, matches on this section - } - if (op == scfn.commands.section) { // end of section - if (!gotcomparison) { // no comparison, so it's a match - break; - } - gotcomparison = 0; - section++; // check out next one - continue; - } - if (op == scfn.commands.comparison) { // found a comparison - do we meet it? - i=operandstr.indexOf(":"); - compop=operandstr.substring(0,i); - compval=operandstr.substring(i+1)-0; - if ((compop == "<" && rawvalue < compval) || - (compop == "<=" && rawvalue <= compval) || - (compop == "=" && rawvalue == compval) || - (compop == "<>" && rawvalue != compval) || - (compop == ">=" && rawvalue >= compval) || - (compop == ">" && rawvalue > compval)) { // a match - break; - } - gotcomparison = 1; - } - } - } - else if (section > 0) { // more than one section (separated by ";") - if (section == 1) { // two sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } - else { - section = 0; // use first for all others - } - } - else if (section == 2) { // three sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } - else if (zerovalue) { - section = 2; // use third section for zero values - } - else { - section = 0; // use first for positive - } - } - } - - sectioninfo = thisformat.sectioninfo[section]; // look at values for our section - - if (sectioninfo.commas > 0) { // scale by thousands - for (i=0; i 0) { // do percent scaling - for (i=0; i=0) { // converted to scientific notation - return rawvalue+""; // Just return plain converted raw value - } - - strparts=strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - if (!strparts) return "NaN"; // if not a number - integervalue = strparts[1]; - if (!integervalue || integervalue=="0") integervalue=""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - - if (sectioninfo.hasdate) { // there are date placeholders - if (rawvalue < 0) { // bad date - return "??-???-?? ??:??:??"; - } - startval = (rawvalue-Math.floor(rawvalue)) * scfn.datevalues.seconds_in_a_day; // get date/time parts - estartval = rawvalue * scfn.datevalues.seconds_in_a_day; // do elapsed time version, too - hrs = Math.floor(startval / scfn.datevalues.seconds_in_an_hour); - ehrs = Math.floor(estartval / scfn.datevalues.seconds_in_an_hour); - startval = startval - hrs * scfn.datevalues.seconds_in_an_hour; - mins = Math.floor(startval / 60); - emins = Math.floor(estartval / 60); - secs = startval - mins * 60; - decimalscale = 1; // round appropriately depending if there is ss.0 - for (i=0; i= 60) { // handle round up into next second, minute, etc. - secs = 0; - mins++; emins++; - if (mins >= 60) { - mins = 0; - hrs++; ehrs++; - if (hrs >= 24) { - hrs = 0; - rawvalue++; - } - } - } - fractionvalue = (secs-Math.floor(secs))+""; // for "hh:mm:ss.000" - fractionvalue = fractionvalue.substring(2); // skip "0." - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian(Math.floor(rawvalue+scfn.datevalues.julian_offset)); - - minOK = 0; // says "m" can be minutes if true - mspos = sectioninfo.sectionstart; // m scan position in ops - for ( ; ; mspos++) { // scan for "m" and "mm" to see if any minutes fields, and am/pm - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op==scfn.commands.section) break; - if (op==scfn.commands.date) { - if ((operandstr.toLowerCase()=="am/pm" || operandstr.toLowerCase()=="a/p") && !ampmstr) { - if (hrs >= 12) { - hrs -= 12; - ampmstr = operandstr.toLowerCase()=="a/p" ? scc.s_FormatNumber_pm1 : scc.s_FormatNumber_pm; // "P" : "PM"; - } - else { - ampmstr = operandstr.toLowerCase()=="a/p" ? scc.s_FormatNumber_am1 : scc.s_FormatNumber_am; // "A" : "AM"; - } - if (operandstr.indexOf(ampmstr)<0) - ampmstr = ampmstr.toLowerCase(); // have case match case in format - } - if (minOK && (operandstr=="m" || operandstr=="mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr.charAt(0)=="h") { - minOK = 1; // m following h or hh or [h] is minutes not months - } - else { - minOK = 0; - } - } - else if (op!=scfn.commands.copy) { // copying chars can be between h and m - minOK = 0; - } - } - minOK = 0; - for (--mspos; ; mspos--) { // scan other way for s after m - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op==scfn.commands.section) break; - if (op==scfn.commands.date) { - if (minOK && (operandstr=="m" || operandstr=="mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr=="ss") { - minOK = 1; // m before ss is minutes not months - } - else { - minOK = 0; - } - } - else if (op!=scfn.commands.copy) { // copying chars can be between ss and m - minOK = 0; - } - } - } - - integerdigits2 = 0; // init counters, etc. - integerpos = 0; - fractionpos = 0; - textcolor = ""; - textstyle = ""; - separatorchar = scc.FormatNumber_separatorchar; - if (separatorchar.indexOf(" ")>=0) separatorchar = separatorchar.replace(/ /g, " "); - decimalchar = scc.FormatNumber_decimalchar; - if (decimalchar.indexOf(" ")>=0) decimalchar = decimalchar.replace(/ /g, " "); - - oppos = sectioninfo.sectionstart; - - while (op = thisformat.operators[oppos]) { // execute format - operandstr = thisformat.operands[oppos++]; // get next operator and operand - - if (op == scfn.commands.copy) { // put char in result - result += operandstr; - } - - else if (op == scfn.commands.color) { // set color - textcolor = operandstr; - } - - else if (op == scfn.commands.style) { // set style - textstyle = operandstr; - } - - else if (op == scfn.commands.integer_placeholder) { // insert number part - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - integerdigits2++; - if (integerdigits2 == 1) { // first one - if (integervalue.length > sectioninfo.integerdigits) { // see if integer wider than field - for (;integerpos < (integervalue.length - sectioninfo.integerdigits); integerpos++) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - } - if (integervalue.length < sectioninfo.integerdigits - && integerdigits2 <= sectioninfo.integerdigits - integervalue.length) { // field is wider than value - if (operandstr == "0" || operandstr == "?") { // fill with appropriate characters - result += operandstr == "0" ? "0" : " "; - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = sectioninfo.integerdigits - integerdigits2; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - else { // normal integer digit - add it - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - integerpos++; - } - } - else if (op == scfn.commands.fraction_placeholder) { // add fraction part of number - if (fractionpos >= fractionvalue.length) { - if (operandstr == "0" || operandstr == "?") { - result += operandstr == "0" ? "0" : " "; - } - } - else { - result += fractionvalue.charAt(fractionpos); - } - fractionpos++; - } - - else if (op == scfn.commands.decimal) { // decimal point - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += decimalchar; - } - - else if (op == scfn.commands.currency) { // currency symbol - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += operandstr; - } - - else if (op == scfn.commands.general) { // insert "General" conversion - - // *** Cut down number of significant digits to avoid floating point artifacts: - - if (value!=0) { // only if non-zero - var factor = Math.floor(Math.LOG10E * Math.log(value)); // get integer magnitude as a power of 10 - factor = Math.pow(10, 13-factor); // turn into scaling factor - value = Math.floor(factor * value + 0.5)/factor; // scale positive value, round, undo scaling - if (!isFinite(value)) return "NaN"; - } - if (negativevalue) { - result += "-"; - } - strvalue = value+""; // convert original value to string - if (strvalue.indexOf("e")>=0) { // converted to scientific notation - result += strvalue; - continue; - } - strparts=strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - integervalue = strparts[1]; - if (!integervalue || integervalue=="0") integervalue=""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - integerpos = 0; - fractionpos = 0; - if (integervalue.length) { - for (;integerpos < integervalue.length; integerpos++) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - else { - result += "0"; - } - if (fractionvalue.length) { - result += decimalchar; - for (;fractionpos < fractionvalue.length; fractionpos++) { - result += fractionvalue.charAt(fractionpos); - } - } - } - else if (op==scfn.commands.date) { // date placeholder - operandstrlc = operandstr.toLowerCase(); - if (operandstrlc=="y" || operandstrlc=="yy") { - result += (ymd.year+"").substring(2); - } - else if (operandstrlc=="yyyy") { - result += ymd.year+""; - } - else if (operandstrlc=="d") { - result += ymd.day+""; - } - else if (operandstrlc=="dd") { - cval = 1000 + ymd.day; - result += (cval+"").substr(2); - } - else if (operandstrlc=="ddd") { - cval = Math.floor(rawvalue+6) % 7; - result += scc.s_FormatNumber_daynames3[cval]; - } - else if (operandstrlc=="dddd") { - cval = Math.floor(rawvalue+6) % 7; - result += scc.s_FormatNumber_daynames[cval]; - } - else if (operandstrlc=="m") { - result += ymd.month+""; - } - else if (operandstrlc=="mm") { - cval = 1000 + ymd.month; - result += (cval+"").substr(2); - } - else if (operandstrlc=="mmm") { - result += scc.s_FormatNumber_monthnames3[ymd.month-1]; - } - else if (operandstrlc=="mmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month-1]; - } - else if (operandstrlc=="mmmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month-1].charAt(0); - } - else if (operandstrlc=="h") { - result += hrs+""; - } - else if (operandstrlc=="h]") { - result += ehrs+""; - } - else if (operandstrlc=="mmin") { - cval = (1000 + mins)+""; - result += cval.substr(2); - } - else if (operandstrlc=="mm]") { - if (emins < 100) { - cval = (1000 + emins)+""; - result += cval.substr(2); - } - else { - result += emins+""; - } - } - else if (operandstrlc=="min") { - result += mins+""; - } - else if (operandstrlc=="m]") { - result += emins+""; - } - else if (operandstrlc=="hh") { - cval = (1000 + hrs)+""; - result += cval.substr(2); - } - else if (operandstrlc=="s") { - cval = Math.floor(secs); - result += cval+""; - } - else if (operandstrlc=="ss") { - cval = (1000 + Math.floor(secs))+""; - result += cval.substr(2); - } - else if (operandstrlc=="am/pm" || operandstrlc=="a/p") { - result += ampmstr; - } - else if (operandstrlc=="ss]") { - if (esecs < 100) { - cval = (1000 + Math.floor(esecs))+""; - result += cval.substr(2); - } - else { - cval = Math.floor(esecs); - result += cval+""; - } - } - } - else if (op == scfn.commands.section) { // end of section - break; - } - - else if (op == scfn.commands.comparison) { // ignore - continue; - } - - else { - result += "!! Parse error !!"; - } - } - - if (textcolor) { - result = ''+result+''; - } - if (textstyle) { - result = ''+result+''; - } - - return result; - - }; - -/* ******************* - - SocialCalc.FormatNumber.parse_format_string(format_defs, format_string) - - Takes a format string (e.g., "#,##0.00_);(#,##0.00)") and fills in format_defs with the parsed info - - format_defs - ["#,##0.0"]->{} - elements in the hash are one hash for each format - .operators->[] - array of operators from parsing the format string (each a number) - .operands->[] - array of corresponding operators (each usually a string) - .sectioninfo->[] - one hash for each section of the format - .start - .integerdigits - .fractiondigits - .commas - .percent - .thousandssep - .hasdates - .hascomparison - true if any section has [<100], etc. - -************************* */ - -SocialCalc.FormatNumber.parse_format_string = function(format_defs, format_string) { - - var scfn = SocialCalc.FormatNumber; - - var thisformat, section, sectionfinfo; - var integerpart = 1; // start out in integer part - var lastwasinteger; // last char was an integer placeholder - var lastwasslash; // last char was a backslash - escaping following character - var lastwasasterisk; // repeat next char - var lastwasunderscore; // last char was _ which picks up following char for width - var inquote, quotestr; // processing a quoted string - var inbracket, bracketstr, bracketdata; // processing a bracketed string - var ingeneral, gpos; // checks for characters "General" - var ampmstr, part; // checks for characters "A/P" and "AM/PM" - var indate; // keeps track of date/time placeholders - var chpos; // character position being looked at - var ch; // character being looked at - - if (format_defs[format_string]) return; // already defined - nothing to do - - thisformat = {operators: [], operands: [], sectioninfo: [{}]}; // create info structure for this format - format_defs[format_string] = thisformat; // add to other format definitions - - section = 0; // start with section 0 - sectioninfo = thisformat.sectioninfo[section]; // get reference to info for current section - sectioninfo.sectionstart = 0; // position in operands that starts this section - sectioninfo.integerdigits = 0; // number of integer-part placeholders - sectioninfo.fractiondigits = 0; // fraction placeholders - sectioninfo.commas = 0; // commas encountered, to handle scaling - sectioninfo.percent = 0; // times to scale by 100 - - for (chpos=0; chpos=0) { - indate = ch; - } - else { - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } - } - - if (indate) { // last char was part of unsaved date placeholder - thisformat.operators.push(scfn.commands.date); - thisformat.operands.push(indate); - sectioninfo.hasdate = 1; - } - - return; - - } - - -/* ******************* - - bracketdata = SocialCalc.FormatNumber.parse_format_bracket(bracketstr) - - Takes a bracket contents (e.g., "RED", ">10") and returns an operator and operand - - bracketdata->{} - .operator - .operand - -************************* */ - -SocialCalc.FormatNumber.parse_format_bracket = function(bracketstr) { - - var scfn = SocialCalc.FormatNumber; - var scc = SocialCalc.Constants; - - var bracketdata={}; - var parts; - - if (bracketstr.charAt(0)=='$') { // currency - bracketdata.operator = scfn.commands.currency; - parts=bracketstr.match(/^\$(.+?)(\-.+?){0,1}$/); - if (parts) { - bracketdata.operand = parts[1] || scc.FormatNumber_defaultCurrency || '$'; - } - else { - bracketdata.operand = bracketstr.substring(1) || scc.FormatNumber_defaultCurrency || '$'; - } - } - else if (bracketstr=='?$') { - bracketdata.operator = scfn.commands.currency; - bracketdata.operand = '[?$]'; - } - else if (scfn.allowedcolors[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.color; - bracketdata.operand = scfn.allowedcolors[bracketstr.toUpperCase()]; - } - else if (parts=bracketstr.match(/^style=([^"]*)$/)) { // [style=...] - bracketdata.operator = scfn.commands.style; - bracketdata.operand = parts[1]; - } - else if (bracketstr==",") { - bracketdata.operator = scfn.commands.separator; - bracketdata.operand = bracketstr; - } - else if (scfn.alloweddates[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.date; - bracketdata.operand = scfn.alloweddates[bracketstr.toUpperCase()]; - } - else if (parts=bracketstr.match(/^[<>=]/)) { // comparison operator - parts=bracketstr.match(/^([<>=]+)(.+)$/); // split operator and value - bracketdata.operator = scfn.commands.comparison; - bracketdata.operand = parts[1]+":"+parts[2]; - } - else { // unknown bracket - bracketdata.operator = scfn.commands.copy; - bracketdata.operand = "["+bracketstr+"]"; - } - - return bracketdata; - - } - -/* ******************* - - juliandate = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, month, day) - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - - I= YEAR - J= MONTH - K= DAY -C - JD= K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12) - 2 /12-3*((I+4900+(J-14)/12)/100)/4 - -************************* */ - -SocialCalc.FormatNumber.convert_date_gregorian_to_julian = function(year, month, day) { - - var juliandate; - - juliandate = day-32075+SocialCalc.intFunc(1461*(year+4800+SocialCalc.intFunc((month-14)/12))/4); - juliandate += SocialCalc.intFunc(367*(month-2-SocialCalc.intFunc((month-14)/12)*12)/12); - juliandate = juliandate - SocialCalc.intFunc(3*SocialCalc.intFunc((year+4900+SocialCalc.intFunc((month-14)/12))/100)/4); - - return juliandate; - - } - - -/* ******************* - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian(juliandate) - - ymd->{} - .year - .month - .day - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - -************************* */ - -SocialCalc.FormatNumber.convert_date_julian_to_gregorian = function(juliandate) { - - var L, N, I, J, K; - - L = juliandate+68569; - N = Math.floor(4*L/146097); - L = L-Math.floor((146097*N+3)/4); - I = Math.floor(4000*(L+1)/1461001); - L = L-Math.floor(1461*I/4)+31; - J = Math.floor(80*L/2447); - K = L-Math.floor(2447*J/80); - L = Math.floor(J/11); - J = J+2-12*L; - I = 100*(N-49)+I+L; - - return {year:I, month:J, day:K}; - - } - -SocialCalc.intFunc = function(n) { - if (n < 0) { - return -Math.floor(-n); - } - else { - return Math.floor(n); - } - } - diff --git a/Website/static/formula1.js b/Website/static/formula1.js deleted file mode 100644 index 9e9231f..0000000 --- a/Website/static/formula1.js +++ /dev/null @@ -1,4749 +0,0 @@ -// -/* -// SocialCalc Spreadsheet Formula Library -// -// Part of the SocialCalc package -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - // In any case, requires SocialCalc.Constants. - -SocialCalc.Formula = {}; - -// -// Formula constants for parsing: -// - - SocialCalc.Formula.ParseState = {num: 1, alpha: 2, coord: 3, string: 4, stringquote: 5, numexp1: 6, numexp2: 7, alphanumeric: 8, specialvalue:9}; - - SocialCalc.Formula.TokenType = {num: 1, coord: 2, op: 3, name: 4, error: 5, string: 6, space: 7}; - - SocialCalc.Formula.CharClass = {num: 1, numstart: 2, op: 3, eof: 4, alpha: 5, incoord: 6, error: 7, quote: 8, space: 9, specialstart: 10}; - - SocialCalc.Formula.CharClassTable = { - " ": 9, "!": 3, '"': 8, "#": 10, "$":6, "%":3, "&":3, "(": 3, ")": 3, "*": 3, "+": 3, ",": 3, "-": 3, ".": 2, "/": 3, - "0": 1, "1": 1, "2": 1, "3": 1, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "9": 1, - ":": 3, "<": 3, "=": 3, ">": 3, - "A": 5, "B": 5, "C": 5, "D": 5, "E": 5, "F": 5, "G": 5, "H": 5, "I": 5, "J": 5, "K": 5, "L": 5, "M": 5, "N": 5, - "O": 5, "P": 5, "Q": 5, "R": 5, "S": 5, "T": 5, "U": 5, "V": 5, "W": 5, "X": 5, "Y": 5, "Z": 5, - "^": 3, "_": 5, - "a": 5, "b": 5, "c": 5, "d": 5, "e": 5, "f": 5, "g": 5, "h": 5, "i": 5, "j": 5, "k": 5, "l": 5, "m": 5, "n": 5, - "o": 5, "p": 5, "q": 5, "r": 5, "s": 5, "t": 5, "u": 5, "v": 5, "w": 5, "x": 5, "y": 5, "z": 5 - }; - - SocialCalc.Formula.UpperCaseTable = { - "a": "A", "b": "B", "c": "C", "d": "D", "e": "E", "f": "F", "g": "G", "h": "H", "i": "I", "j": "J", "k": "K", "l": "L", "m": "M", - "n": "N", "o": "O", "p": "P", "q": "Q", "r": "R", "s": "S", "t": "T", "u": "U", "v": "V", "w": "W", "x": "X", "y": "Y", "z": "Z" - } - - SocialCalc.Formula.SpecialConstants = { // names that turn into constants for name lookup - "#NULL!": "0,e#NULL!", "#NUM!": "0,e#NUM!", "#DIV/0!": "0,e#DIV/0!", "#VALUE!": "0,e#VALUE!", - "#REF!": "0,e#REF!", "#NAME?": "0,e#NAME?"}; - - - // Operator Precedence table - // - // 1- !, 2- : ,, 3- M P, 4- %, 5- ^, 6- * /, 7- + -, 8- &, 9- < > = G(>=) L(<=) N(<>), - // Negative value means Right Associative - - SocialCalc.Formula.TokenPrecedence = { - "!": 1, - ":": 2, ",": 2, - "M": -3, "P": -3, - "%": 4, - "^": 5, - "*": 6, "/": 6, - "+": 7, "-": 7, - "&": 8, - "<": 9, ">": 9, "G": 9, "L": 9, "N": 9 - }; - - // Convert one-char token text to input text: - - SocialCalc.Formula.TokenOpExpansion = {'G': '>=', 'L': '<=', 'M': '-', 'N': '<>', 'P': '+'}; - - // - // Information about the resulting value types when doing operations on values (used by LookupResultType) - // - // Each object entry is an object with specific types with result type info as follows: - // - // 'type1a': '|type2a:resulta|type2b:resultb|... - // Type of t* or n* matches any of those types not listed - // Results may be a type or the numbers 1 or 2 specifying to return type1 or type2 - - - SocialCalc.Formula.TypeLookupTable = { - unaryminus: { 'n*': '|n*:1|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - unaryplus: { 'n*': '|n*:1|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - unarypercent: { 'n*': '|n:n%|n*:n|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - plus: { - 'n%': '|n%:n%|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nd': '|n%:n|nd:nd|nt:ndt|ndt:ndt|n$:n|n:nd|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nt': '|n%:n|nd:ndt|nt:nt|ndt:ndt|n$:n|n:nt|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'ndt': '|n%:n|nd:ndt|nt:ndt|ndt:ndt|n$:n|n:ndt|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'n$': '|n%:n|nd:n|nt:n|ndt:n|n$:n$|n:n$|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nl': '|n%:n|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'n': '|n%:n|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'b': '|n%:n%|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 't*': '|n*:e#VALUE!|t*:e#VALUE!|b:e#VALUE!|e*:2|', - 'e*': '|e*:1|n*:1|t*:1|b:1|' - }, - concat: { - 't': '|t:t|th:th|tw:tw|tl:t|t*:2|e*:2|', - 'th': '|t:th|th:th|tw:t|tl:th|t*:t|e*:2|', - 'tw': '|t:tw|th:t|tw:tw|tl:tw|t*:t|e*:2|', - 'tl': '|t:tl|th:th|tw:tw|tl:tl|t*:t|e*:2|', - 'e*': '|e*:1|n*:1|t*:1|' - }, - oneargnumeric: { 'n*': '|n*:n|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - twoargnumeric: { 'n*': '|n*:n|t*:e#VALUE!|e*:2|', 'e*': '|e*:1|n*:1|t*:1|', 't*': '|t*:e#VALUE!|n*:e#VALUE!|e*:2|'}, - propagateerror: { 'n*': '|n*:2|e*:2|', 'e*': '|e*:2|', 't*': '|t*:2|e*:2|', 'b': '|b:2|e*:2|'} - }; - -/* ******************* - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(line) - - Parses a text string as if it was a spreadsheet formula - - This uses a simple state machine run on each character in turn. - States remember whether a number is being gathered, etc. - The result is parseinfo which is an array with one entry for each token: - parseinfo[i] = { - text: "the characters making up the parsed token", - type: the type of the token (a number), - opcode: a single character version of an operator suitable for use in the - precedence table and distinguishing between unary and binary + and -. - -************************* */ - -SocialCalc.Formula.ParseFormulaIntoTokens = function(line) { - - var i, ch, chclass, haddecimal, last_token, last_token_type, last_token_text, t; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var parsestate = scf.ParseState; - var tokentype = scf.TokenType; - var charclass = scf.CharClass; - var charclasstable = scf.CharClassTable; - var uppercasetable = scf.UpperCaseTable; // much faster than toUpperCase function - var pushtoken = scf.ParsePushToken; - var coordregex = /^\$?[A-Z]{1,2}\$?[1-9]\d*$/i; - - var parseinfo = []; - var str = ""; - var state = 0; - haddecimal = false; - - for (i=0; i<=line.length; i++) { - if (i0) { - last_token = parseinfo[parseinfo.length-1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - if (last_token_type == charclass.op) { - if (last_token_text == '<' || last_token_text == ">") { - str = last_token_text + str; - parseinfo.pop(); - if (parseinfo.length>0) { - last_token = parseinfo[parseinfo.length-1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - } - else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - } - } - } - else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - t = tokentype.op; - if ((parseinfo.length == 0) - || (last_token_type == charclass.op && last_token_text != ')' && last_token_text != '%')) { // Unary operator - if (str == '-') { // M is unary minus - str = "M"; - ch = "M"; - } - else if (str == '+') { // P is unary plus - str = "P"; - ch = "P"; - } - else if (str == ')' && last_token_text == '(') { // null arg list OK - ; - } - else if (str != '(') { // binary-op open-paren OK, others no - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } - else if (str.length > 1) { - if (str == '>=') { // G is >= - str = "G"; - ch = "G"; - } - else if (str == '<=') { // L is <= - str = "L"; - ch = "L"; - } - else if (str == '<>') { // N is <> - str = "N"; - ch = "N"; - } - else { - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } - pushtoken(parseinfo, str, t, ch); - state = 0; - } - else if (cclass == charclass.quote) { // starting a string - str = ""; - state = parsestate.string; - } - else if (cclass == charclass.space) { // store so can reconstruct spacing - pushtoken(parseinfo, " ", tokentype.space, 0); - } - else if (cclass == charclass.eof) { // ignore -- needed to have extra loop to close out other things - } - else { // unknown class - such as unknown char - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - } - } - } - - return parseinfo; - - } - -SocialCalc.Formula.ParsePushToken = function(parseinfo, ttext, ttype, topcode) { - - parseinfo.push({text: ttext, type: ttype, opcode: topcode}); - - } - -/* ******************* - - result = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, allowrangereturn) - - Does the calculation expressed in a parsed formula, returning a value, its type, and error info - returns: {value: value, type: valuetype, error: errortext}. - - If allowrangereturn is present and true, can return a range (e.g., "A1:A10" - translated from "A1|A10|") - -************************* */ - -SocialCalc.Formula.evaluate_parsed_formula = function(parseinfo, sheet, allowrangereturn) { - - var result; - - var scf = SocialCalc.Formula; - var tokentype = scf.TokenType; - - var revpolish; - var parsestack = []; - - var errortext = ""; - - revpolish = scf.ConvertInfixToPolish(parseinfo); // result is either an array or a string with error text - - result = scf.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn); - - return result; - -} - -// -// revpolish = SocialCalc.Formula.ConvertInfixToPolish(parseinfo) -// -// Convert infix to reverse polish notation -// -// Returns revpolish array with a sequence of references to tokens by number if successful. -// Errors return a string with the error. -// -// Based upon the algorithm shown in Wikipedia "Reverse Polish notation" article -// and then enhanced for additional spreadsheet things -// - -SocialCalc.Formula.ConvertInfixToPolish = function(parseinfo) { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var token_precedence = scf.TokenPrecedence; - - var revpolish = []; - var parsestack = []; - - var errortext = ""; - - var function_start = -1; - - var i, pii, ttype, ttext, tprecedence, tstackprecedence; - - for (i=0; i= 0 && tprecedence < tstackprecedence) { - break; - } - else if (tprecedence < 0) { - tprecedence = -tprecedence; - if (tstackprecedence < 0) tstackprecedence = -tstackprecedence; - if (tprecedence <= tstackprecedence) { - break; - } - } - revpolish.push(parsestack.pop()); - } - parsestack.push(i); - } - else if (ttype == tokentype.error) { - errortext = ttext; - break; - } - else { - errortext = "Internal error while processing parsed formula. "; - break; - } - } - while (parsestack.length>0) { - if (parseinfo[parsestack[parsestack.length-1]].text == '(') { - errortext = scc.s_parseerrmissingcloseparen; - break; - } - revpolish.push(parsestack.pop()); - } - - if (errortext) { - return errortext; - } - - return revpolish; - - } - - -// -// result = SocialCalc.Formula.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn) -// -// Execute reverse polish representation of formula -// -// Operand values are objects in the operand array with a "type" and an optional "value". -// Type can have these values (many are type and sub-type as two or more letters): -// "tw", "th", "t", "n", "nt", "coord", "range", "start", "eErrorType", "b" (blank) -// The value of a coord is in the form A57 or A57!sheetname -// The value of a range is coord|coord|number where number starts at 0 and is -// the offset of the next item to fetch if you are going through the range one by one -// The number starts as a null string ("A1|B3|") -// - -SocialCalc.Formula.EvaluatePolish = function(parseinfo, revpolish, sheet, allowrangereturn) { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var lookup_result_type = scf.LookupResultType; - var typelookup = scf.TypeLookupTable; - var operand_as_number = scf.OperandAsNumber; - var operand_as_text = scf.OperandAsText; - var operand_value_and_type = scf.OperandValueAndType; - var operands_as_coord_on_sheet = scf.OperandsAsCoordOnSheet; - var format_number_for_display = SocialCalc.format_number_for_display || function(v, t, f) {return v+"";}; - - var errortext = ""; - var function_start = -1; - var missingOperandError = {value: "", type: "e#VALUE!", error: scc.s_parseerrmissingoperand}; - - var operand = []; - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var i, rii, prii, ttype, ttext, value1, value2, tostype, tostype2, resulttype, valuetype, cond, vmatch, smatch; - - if (!parseinfo.length || (! (revpolish instanceof Array))) { - return ({value: "", type: "e#VALUE!", error: (typeof revpolish == "string" ? revpolish : "")}); - } - - for (i=0; i N (< <= = >= > <>) - - else if (ttext == "<" || ttext == "L" || ttext == "=" || ttext == "G" || ttext == ">" || ttext == "N") { - if (operand.length <= 1) { // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_value_and_type(sheet, operand); - value1 = operand_value_and_type(sheet, operand); - if (value1.type.charAt(0) == "n" && value2.type.charAt(0) == "n") { // compare two numbers - cond = 0; - if (ttext == "<") { cond = value1.value < value2.value ? 1 : 0; } - else if (ttext == "L") { cond = value1.value <= value2.value ? 1 : 0; } - else if (ttext == "=") { cond = value1.value == value2.value ? 1 : 0; } - else if (ttext == "G") { cond = value1.value >= value2.value ? 1 : 0; } - else if (ttext == ">") { cond = value1.value > value2.value ? 1 : 0; } - else if (ttext == "N") { cond = value1.value != value2.value ? 1 : 0; } - PushOperand("nl", cond); - } - else if (value1.type.charAt(0) == "e") { // error on left - PushOperand(value1.type, 0); - } - else if (value2.type.charAt(0) == "e") { // error on right - PushOperand(value2.type, 0); - } - else { // text maybe mixed with numbers or blank - tostype = value1.type.charAt(0); - tostype2 = value2.type.charAt(0); - if (tostype == "n") { - value1.value = format_number_for_display(value1.value, "n", ""); - } - else if (tostype == "b") { - value1.value = ""; - } - if (tostype2 == "n") { - value2.value = format_number_for_display(value2.value, "n", ""); - } - else if (tostype2 == "b") { - value2.value = ""; - } - cond = 0; - value1.value = value1.value.toLowerCase(); // ignore case - value2.value = value2.value.toLowerCase(); - if (ttext == "<") { cond = value1.value < value2.value ? 1 : 0; } - else if (ttext == "L") { cond = value1.value <= value2.value ? 1 : 0; } - else if (ttext == "=") { cond = value1.value == value2.value ? 1 : 0; } - else if (ttext == "G") { cond = value1.value >= value2.value ? 1 : 0; } - else if (ttext == ">") { cond = value1.value > value2.value ? 1 : 0; } - else if (ttext == "N") { cond = value1.value != value2.value ? 1 : 0; } - PushOperand("nl", cond); - } - } - - // Normal infix arithmethic operators: +, -. *, /, ^ - - else { // what's left are the normal infix arithmetic operators - if (operand.length <= 1) { // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_as_number(sheet, operand); - value1 = operand_as_number(sheet, operand); - if (ttext == '+') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value + value2.value); - } - else if (ttext == '-') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value - value2.value); - } - else if (ttext == '*') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value * value2.value); - } - else if (ttext == '/') { - if (value2.value != 0) { - PushOperand("n", value1.value / value2.value); // gives plain numeric result type - } - else { - PushOperand("e#DIV/0!", 0); - } - } - else if (ttext == '^') { - value1.value = Math.pow(value1.value, value2.value); - value1.type = "n"; // gives plain numeric result type - if (isNaN(value1.value)) { - value1.value = 0; - value1.type = "e#NUM!"; - } - PushOperand(value1.type, value1.value); - } - } - } - - // function or name - - else if (ttype == tokentype.name) { - errortext = scf.CalculateFunction(ttext, operand, sheet); - if (errortext) break; - } - - else { - errortext = scc.s_InternalError+"Unknown token "+ttype+" ("+ttext+"). "; - break; - } - } - - // look at final value and handle special cases - - value = operand[0] ? operand[0].value : ""; - tostype = operand[0] ? operand[0].type : ""; - - if (tostype == "name") { // name - expand it - value1 = SocialCalc.Formula.LookupName(sheet, value); - value = value1.value; - tostype = value1.type; - errortext = errortext || value1.error; - } - - if (tostype == "coord") { // the value is a coord reference, get its value and type - value1 = operand_value_and_type(sheet, operand); - value = value1.value; - tostype = value1.type; - if (tostype == "b") { - tostype = "n"; - value = 0; - } - } - - if (operand.length > 1 && !errortext) { // something left - error - errortext += scc.s_parseerrerrorinformula; - } - - // set return type - - valuetype = tostype; - - if (tostype.charAt(0) == "e") { // error value - errortext = errortext || tostype.substring(1) || scc.s_calcerrerrorvalueinformula; - } - else if (tostype == "range") { - vmatch = value.match(/^(.*)\|(.*)\|/); - smatch = vmatch[1].indexOf("!"); - if (smatch>=0) { // swap sheetname - vmatch[1] = vmatch[1].substring(smatch+1) + "!" + vmatch[1].substring(0, smatch).toUpperCase(); - } - else { - vmatch[1] = vmatch[1].toUpperCase(); - } - value = vmatch[1] + ":" + vmatch[2].toUpperCase(); - if (!allowrangereturn) { - errortext = scc.s_formularangeresult+" "+value; - } - } - - if (errortext && valuetype.charAt(0) != "e") { - value = errortext; - valuetype = "e"; - } - - // look for overflow - - if (valuetype.charAt(0) == "n" && (isNaN(value) || !isFinite(value))) { - value = 0; - valuetype = "e#NUM!"; - errortext = isNaN(value) ? scc.s_calcerrnumericnan: scc.s_calcerrnumericoverflow; - } - - return ({value: value, type: valuetype, error: errortext}); - - } - - -/* -# -# resulttype = SocialCalc.Formula.LookupResultType(type1, type2, typelookup); -# -# typelookup has values of the following form: -# -# typelookup{"typespec1"} = "|typespec2A:resultA|typespec2B:resultB|..." -# -# First type1 is looked up. If no match, then the first letter (major type) of type1 plus "*" is looked up -# resulttype is type1 if result is "1", type2 if result is "2", otherwise the value of result. -# -*/ - -SocialCalc.Formula.LookupResultType = function(type1, type2, typelookup) { - - var pos1, pos2, result; - - var table1 = typelookup[type1]; - - if (!table1) { - table1 = typelookup[type1.charAt(0)+'*']; - if (!table1) { - return "e#VALUE! (internal error, missing LookupResultType "+type1.charAt(0)+"*)"; // missing from table -- please add it - } - } - pos1 = table1.indexOf("|"+type2+":"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1+1); - if (pos2<0) return "e#VALUE! (internal error, incorrect LookupResultType "+table1+")"; - result = table1.substring(pos1+type2.length+2, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - pos1 = table1.indexOf("|"+type2.charAt(0)+"*:"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1+1); - if (pos2<0) return "e#VALUE! (internal error, incorrect LookupResultType "+table1+")"; - result = table1.substring(pos1+4, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - return "e#VALUE!"; - - } - -/* -# -# operandinfo = SocialCalc.Formula.TopOfStackValueAndType(sheet, operand) -# -# Returns top of stack value and type and then pops the stack. -# The result is {value: value, type: type, error: "only if bad error"} -# -*/ - -SocialCalc.Formula.TopOfStackValueAndType = function(sheet, operand) { - - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - if (!stacklen) { // make sure something is there - result.error = SocialCalc.Constants.s_InternalError+"no operand on stack"; - return result; - } - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - return result; - - } - - -/* -# -# operandinfo = OperandAsNumber(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns numeric value and type. -# Text values are treated as 0 if they can't be converted somehow. -# -*/ - -SocialCalc.Formula.OperandAsNumber = function(sheet, operand) { - - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "n") { - operandinfo.value = operandinfo.value-0; - } - else if (t == "b") { // blank cell - operandinfo.type = "n"; - operandinfo.value = 0; - } - else if (t == "e") { // error - operandinfo.value = 0; - } - else { - valueinfo = SocialCalc.DetermineValueType ? SocialCalc.DetermineValueType(operandinfo.value) : - {value: operandinfo.value-0, type: "n"}; // if without rest of SocialCalc - if (valueinfo.type.charAt(0) == "n") { - operandinfo.value = valueinfo.value-0; - operandinfo.type = valueinfo.type; - } - else { - operandinfo.value = 0; - operandinfo.type = valueinfo.type; - } - } - - return operandinfo; - - } - -/* -# -# operandinfo = OperandAsText(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns text value, preserving sub-type. -# -*/ - -SocialCalc.Formula.OperandAsText = function(sheet, operand) { - - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "t") { // any flavor of text returns as is - ; - } - else if (t == "n") { - operandinfo.value = SocialCalc.format_number_for_display ? - SocialCalc.format_number_for_display(operandinfo.value, operandinfo.type, "") : - operandinfo.value = operandinfo.value+""; - operandinfo.type = "t"; - } - else if (t == "b") { // blank - operandinfo.value = ""; - operandinfo.type = "t"; - } - else if (t == "e") { // error - operandinfo.value = ""; - } - else { - operand.value = operandinfo.value + ""; - operand.type = "t"; - } - - return operandinfo; - - } - -/* -# -# result = SocialCalc.Formula.OperandValueAndType(sheet, operand) -# -# Pops the top of stack and returns it, following a coord reference if necessary. -# The result is {value: value, type: type, error: "only if bad error"} -# Ranges are returned as if they were pushed onto the stack first coord first -# Also sets type with "t", "n", "th", etc., as appropriate -# -*/ - -SocialCalc.Formula.OperandValueAndType = function(sheet, operand) { - - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - if (!stacklen) { // make sure something is there - result.error = SocialCalc.Constants.s_InternalError+"no operand on stack"; - return result; - } - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - if (result.type == "range") { - result = scf.StepThroughRangeDown(operand, result.value); - } - - if (result.type == "coord") { // value is a coord reference - coordsheet = sheet; - pos = result.value.indexOf("!"); - if (pos != -1) { // sheet reference - coordsheet = scf.FindInSheetCache(result.value.substring(pos+1)); // get other sheet - if (coordsheet == null) { // unavailable - result.type = "e#REF!"; - result.error = SocialCalc.Constants.s_sheetunavailable+" "+result.value.substring(pos+1); - result.value = 0; - return result; - } - result.value = result.value.substring(0, pos); // get coord part - } - - if (coordsheet) { - cell = coordsheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - cellvtype = cell.valuetype; // get type of value in the cell it points to - result.value = cell.datavalue; - } - else { - cellvtype = "b"; - } - } - else { - cellvtype = "e#N/A"; - result.value = 0; - } - result.type = cellvtype || "b"; - if (result.type == "b") { // blank - result.value = 0; - } - } - - return result; - - } - -/* -# -# operandinfo = SocialCalc.Formula.OperandAsCoord(sheet, operand) -# -# Gets top of stack and pops it. -# Returns coord value. All others are treated as an error. -# -*/ - - -SocialCalc.Formula.OperandAsCoord = function(sheet, operand) { - - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - result = SocialCalc.Formula.LookupName(sheet, result.value); - } - if (result.type == "coord") { // value is a coord reference - return result; - } - else { - result.value = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - return result; - } -} - - -/* -# -# result = SocialCalc.Formula.OperandsAsCoordOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as sheetname!coord-or-name. -# Returns stack-style coord value (coord!sheetname, or coord!sheetname|coord|) with -# a type of coord or range. All others are treated as an error. -# If sheetname not available, sets result.error. -# -*/ - -SocialCalc.Formula.OperandsAsCoordOnSheet = function(sheet, operand) { - - var sheetname, othersheet, pos1, pos2; - var value1 = {}; - var result = {}; - var scf = SocialCalc.Formula; - - var stacklen = operand.length; - value1.value = operand[stacklen-1].value; // get top of stack - coord or name - value1.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - sheetname = scf.OperandAsSheetName(sheet, operand); // get sheetname as text - othersheet = scf.FindInSheetCache(sheetname.value); - if (othersheet == null) { // unavailable - result.type = "e#REF!"; - result.value = 0; - result.error = SocialCalc.Constants.s_sheetunavailable+" "+sheetname.value; - return result; - } - - if (value1.type == "name") { - value1 = scf.LookupName(othersheet, value1.value); - } - result.type = value1.type; - if (value1.type == "coord") { // value is a coord reference - result.value = value1.value + "!" + sheetname.value; // return in the format as used on stack - } - else if (value1.type == "range") { // value is a range reference - pos1 = value1.value.indexOf("|"); - pos2 = value1.value.indexOf("|", pos1+1); - result.value = value1.value.substring(0, pos1) + "!" + sheetname.value + - "|" + value1.value.substring(pos1+1, pos2) + "|"; - } - else if (value1.type.charAt(0)=="e") { - result.value = value1.value; - } - else { - result.error = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - result.value = 0; - } - return result; - - } - -/* -# -# result = SocialCalc.Formula.OperandsAsRangeOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as coord2-or-name:coord1. -# Name is evaluated on sheet of coord1. -# Returns result with "value" of stack-style range value (coord!sheetname|coord|) and -# "type" of "range". All others are treated as an error. -# -*/ - -SocialCalc.Formula.OperandsAsRangeOnSheet = function(sheet, operand) { - - var value1, othersheet, pos1, pos2; - var value2 = {}; - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var stacklen = operand.length; - value2.value = operand[stacklen-1].value; // get top of stack - coord or name for "right" side - value2.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - value1 = scf.OperandAsCoord(sheet, operand); // get "left" coord - if (value1.type != "coord") { // not a coord, which it must be - return {value: 0, type: "e#REF!"}; - } - - othersheet = sheet; - pos1 = value1.value.indexOf("!"); - if (pos1 != -1) { // sheet reference - pos2 = value1.value.indexOf("|", pos1+1); - if (pos2 < 0) pos2 = value1.value.length; - othersheet = scf.FindInSheetCache(value1.value.substring(pos1+1,pos2)); // get other sheet - if (othersheet == null) { // unavailable - return {value: 0, type: "e#REF!", errortext: scc.s_sheetunavailable+" "+value1.value.substring(pos1+1,pos2)}; - } - } - - if (value2.type == "name") { // coord:name is allowed, if name is just one cell - value2 = scf.LookupName(othersheet, value2.value); - } - - if (value2.type == "coord") { // value is a coord reference, so return the combined range - return {value: value1.value+"|"+value2.value+"|", type: "range"}; // return range in the format as used on stack - } - else { // bad form - return {value: scc.s_calcerrcellrefmissing, type: "e#REF!"}; - } - } - - -/* -# -# result = SocialCalc.Formula.OperandAsSheetName(sheet, operand) -# -# Gets top of stack and pops it. -# Returns sheetname value. All others are treated as an error. -# Accepts text, cell reference, and named value which is one of those two. -# -*/ - -SocialCalc.Formula.OperandAsSheetName = function(sheet, operand) { - - var nvalue, cell; - - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - nvalue = SocialCalc.Formula.LookupName(sheet, result.value); - if (!nvalue.value) { // not a known name - return bare name as the name value - return result; - } - result.value = nvalue.value; - result.type = nvalue.type; - } - if (result.type == "coord") { // value is a coord reference, follow it to find sheet name - cell = sheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - result.value = cell.datavalue; - result.type = cell.valuetype; - } - else { - result.value = ""; - result.type = "b"; - } - } - if (result.type.charAt(0) == "t") { // value is a string which could be a sheet name - return result; - } - else { - result.value = ""; - result.error = SocialCalc.Constants.s_calcerrsheetnamemissing; - return result; - } - - } - -// -// value = SocialCalc.Formula.LookupName(sheet, name) -// -// Returns value and type of a named value -// Names are case insensitive -// Names may have a definition which is a coord (A1), a range (A1:B7), or a formula (=OFFSET(A1,0,0,5,1)) -// Note: The range must not have sheet names ("!") in them. -// - -SocialCalc.Formula.LookupName = function(sheet, name) { - - var pos, specialc, parseinfo; - var names = sheet.names; - var value = {}; - var startedwalk = false; - - if (names[name.toUpperCase()]) { // is name defined? - - value.value = names[name.toUpperCase()].definition; // yes - - if (value.value.charAt(0) == "=") { // formula - if (!sheet.checknamecirc) { // are we possibly walking the name tree? - sheet.checknamecirc = {}; // not yet - startedwalk = true; // remember we are the reference that started it - } - else { - if (sheet.checknamecirc[name]) { // circular reference - value.type = "e#NAME?"; - value.error = SocialCalc.Constants.s_circularnameref+' "' + name + '".'; - return value; - } - } - sheet.checknamecirc[name] = true; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(value.value.substring(1)); - value = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, 1); // parse formula, allowing range return - - delete sheet.checknamecirc[name]; // done with us - if (startedwalk) { - delete sheet.checknamecirc; // done with walk - } - - if (value.type != "range") { - return value; - } - } - - pos = value.value.indexOf(":"); - if (pos != -1) { // range - value.type = "range"; - value.value = value.value.substring(0, pos) + "|" + value.value.substring(pos+1)+"|"; - value.value = value.value.toUpperCase(); - } - else { - value.type = "coord"; - value.value = value.value.toUpperCase(); - } - return value; - } - else if (specialc=SocialCalc.Formula.SpecialConstants[name.toUpperCase()]) { // special constant, like #REF! - pos = specialc.indexOf(","); - value.value = specialc.substring(0,pos)-0; - value.type = specialc.substring(pos+1); - return value; - } - else { - value.value = ""; - value.type = "e#NAME?"; - value.error = SocialCalc.Constants.s_calcerrunknownname+' "'+name+'"'; - return value; - } - } - -/* -# -# coord = SocialCalc.Formula.StepThroughRangeDown(operand, rangevalue) -# -# Returns next coord in a range, keeping track on the operand stack -# Goes from upper left across and down to bottom right. -# -*/ - -SocialCalc.Formula.StepThroughRangeDown = function(operand, rangevalue) { - - var value1, value2, sequence, pos1, pos2, sheet1, rp, c, r, count; - var scf = SocialCalc.Formula; - - pos1 = rangevalue.indexOf("|"); - pos2 = rangevalue.indexOf("|", pos1+1); - value1 = rangevalue.substring(0, pos1); - value2 = rangevalue.substring(pos1+1, pos2); - sequence = rangevalue.substring(pos2+1) - 0; - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1); - value1 = value1.substring(0, pos1); - } - else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - rp = scf.OrderRangeParts(value1, value2); - - count = 0; - for (r=rp.r1; r<=rp.r2; r++) { - for (c=rp.c1; c<=rp.c2; c++) { - count++; - if (count > sequence) { - if (r!=rp.r2 || c!=rp.c2) { // keep on stack until done - scf.PushOperand(operand, "range", value1+sheet1+"|"+value2+"|"+count); - } - return {value: SocialCalc.crToCoord(c, r)+sheet1, type: "coord"}; - } - } - } - } - -/* -# -# result = SocialCalc.Formula.DecodeRangeParts(sheetdata, range) -# -# Returns sheetdata for the sheet where the range is, as well as -# the number of the first column in the range, the number of columns, -# and equivalent row information: -# -# {sheetdata: sheet, sheetname: name-or-"", col1num: n, ncols: n, row1num: n, nrows: n} -# -# If any errors, a null result is returned. -# -*/ - -SocialCalc.Formula.DecodeRangeParts = function(sheetdata, range) { - - var value1, value2, pos1, pos2, sheet1, coordsheetdata, rp; - - var scf = SocialCalc.Formula; - - pos1 = range.indexOf("|"); - pos2 = range.indexOf("|", pos1+1); - value1 = range.substring(0, pos1); - value2 = range.substring(pos1+1, pos2); - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1+1); - value1 = value1.substring(0, pos1); - } - else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - coordsheetdata = sheetdata; - if (sheet1) { // sheet reference - coordsheetdata = scf.FindInSheetCache(sheet1); - if (coordsheetdata == null) { // unavailable - return null; - } - } - - rp = scf.OrderRangeParts(value1, value2); - - return {sheetdata: coordsheetdata, sheetname: sheet1, col1num: rp.c1, ncols: rp.c2-rp.c1+1, row1num: rp.r1, nrows: rp.r2-rp.r1+1} - - } - - -//********************* -// -// Function Handling -// -//********************* - -// List of functions -- Define after functions are defined -// -// SocialCalc.Formula.FunctionList["function_name"] = [function_subroutine, number_of_arguments, arg_def, func_def, func_class] -// function_subroutine takes arguments (fname, operand, foperand, sheet), returns -// errortext or null, pushing result on operand stack. -// number_of_arguments is: -// 0 = no arguments -// >0 = exactly that many arguments -// <0 = that many arguments (abs value) or more -// 100 = don't check -// -// arg_def, if present, is the name of the element in SocialCalc.Formula.FunctionArgDefs. -// func_def, if present, is a string explaining the function. If not, looked up in SocialCalc.Constants. -// func_class, if present, is the comma-separated names of the elements in SocialCalc.Formula.FunctionClasses. -// -// To add a function, just add it to this object. - - if (!SocialCalc.Formula.FunctionList) { // make sure it is defined (could have been in another module) - SocialCalc.Formula.FunctionList = {}; - } - - // FunctionClasses[classname] = {name: full-name-string, items: [sorted list of function names]}; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionClasses = null; // start null to say needs filling in - - // FunctionArgDef[argname] = explicit-string-for-arg-list; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionArgDefs = {}; - - -/* -# -# errortext = SocialCalc.Formula.CalculateFunction(fname, operand, sheet) -# -# Dispatches for function fname. -# -*/ - -SocialCalc.Formula.CalculateFunction = function(fname, operand, sheet) { - - var fobj, foperand, ffunc, argnum, ttext; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = ""; - - fobj = scf.FunctionList[fname]; - - if (fobj) { - foperand = []; - ffunc = fobj[0]; - argnum = fobj[1]; - scf.CopyFunctionArgs(operand, foperand); - if (argnum != 100) { - if (argnum < 0) { - if (foperand.length < -argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } - else { - if (foperand.length != argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } - } - errortext = ffunc(fname, operand, foperand, sheet); - } - - else { - ttext = fname; - - if (operand.length && operand[operand.length-1].type == "start") { // no arguments - name or zero arg function - operand.pop(); - scf.PushOperand(operand, "name", ttext); - } - - else { - errortext = SocialCalc.Constants.s_sheetfuncunknownfunction+" " + ttext +". "; - } - } - - return errortext; - -} - -// -// SocialCalc.Formula.PushOperand(operand, t, v) -// -// Pushes the type and value onto the operand stack -// - -SocialCalc.Formula.PushOperand = function(operand, t, v) { - - operand.push({type: t, value: v}); - - } - -// -// SocialCalc.Formula.CopyFunctionArgs(operand, foperand) -// -// Pops operands from operand and pushes on foperand up to function start -// reversing order in the process. -// - -SocialCalc.Formula.CopyFunctionArgs = function(operand, foperand) { - - var fobj, foperand, ffunc, argnum; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = null; - - while (operand.length>0 && operand[operand.length-1].type != "start") { // get each arg - foperand.push(operand.pop()); // copy it - } - operand.pop(); // get rid of "start" - - return; - - } - -// -// errortext = SocialCalc.Formula.FunctionArgsError(fname, operand) -// -// Pushes appropriate error on operand stack and returns errortext, including fname -// - -SocialCalc.Formula.FunctionArgsError = function(fname, operand) { - - var errortext = SocialCalc.Constants.s_calcerrincorrectargstofunction+" " + fname + ". "; - SocialCalc.Formula.PushOperand(operand, "e#VALUE!", errortext); - - return errortext; - - } - - -// -// errortext = SocialCalc.Formula.FunctionSpecificError(fname, operand, errortype, errortext) -// -// Pushes specified error and text on operand stack. -// - -SocialCalc.Formula.FunctionSpecificError = function(fname, operand, errortype, errortext) { - - SocialCalc.Formula.PushOperand(operand, errortype, errortext); - - return errortext; - - } - -// -// haserror = SocialCalc.Formula.CheckForErrorValue(operand, v) -// -// If v.type is an error, push it on operand stack and return true, otherwise return false. -// - -SocialCalc.Formula.CheckForErrorValue = function(operand, v) { - - if (v.type.charAt(0) == "e") { - operand.push(v); - return true; - } - else { - return false; - } - - } - -///////////////////////// -// -// FUNCTION INFORMATION ROUTINES -// - -// -// SocialCalc.Formula.FillFunctionInfo() -// -// Goes through function definitions and fills out FunctionArgDefs and FunctionClasses. -// Execute this after any changes to SocialCalc.Constants but before UI is used. -// - -SocialCalc.Formula.FillFunctionInfo = function() { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var fname, f, classes, cname, i; - - if (scf.FunctionClasses) { // only do once - return; - } - - for (fname in scf.FunctionList) { - f = scf.FunctionList[fname]; - if (f[2]) { // has an arg def - scf.FunctionArgDefs[f[2]] = scc["s_farg_"+f[2]] || ""; // get it from constants - } - if (!f[3]) { // no text def, see if in constants - if (scc["s_fdef_"+fname]) { - scf.FunctionList[fname][3] = scc["s_fdef_"+fname]; - } - } - } - - scf.FunctionClasses = {}; - - for (i=0; i 0) { - str = "v1"; - for (i=2; i<=nargs; i++) { - str += ", v"+i; - } - return str; - } - else if (nargs < 0) { - str = "v1"; - for (i=2; i<-nargs; i++) { - str += ", v"+i; - } - return str+", ..."; - } - else { - return "nargs: "+nargs; - } - } - - str = scf.FunctionArgDefs[adef] || adef; - - return str; - - } - - -///////////////////////// -// -// FUNCTION DEFINITIONS -// -// The standard function definitions follow. -// -// Note that some need SocialCalc.DetermineValueType to be defined. -// - -/* -# -# AVERAGE(v1,c1:c2,...) -# COUNT(v1,c1:c2,...) -# COUNTA(v1,c1:c2,...) -# COUNTBLANK(v1,c1:c2,...) -# MAX(v1,c1:c2,...) -# MIN(v1,c1:c2,...) -# PRODUCT(v1,c1:c2,...) -# STDEV(v1,c1:c2,...) -# STDEVP(v1,c1:c2,...) -# SUM(v1,c1:c2,...) -# VAR(v1,c1:c2,...) -# VARP(v1,c1:c2,...) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the dseries_functions, too. -# -*/ - -SocialCalc.Formula.SeriesFunctions = function(fname, operand, foperand, sheet) { - - var value1, t, v1; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - while (foperand.length > 0) { - value1 = operand_value_and_type(sheet, foperand); - t = value1.type.charAt(0); - if (t == "n") count += 1; - if (t != "b") counta += 1; - if (t == "b") countblank += 1; - - if (t == "n") { - v1 = value1.value-0; // get it as a number - sum += v1; - product *= v1; - maxval = (maxval!=undefined) ? (v1 > maxval ? v1 : maxval) : v1; - minval = (minval!=undefined) ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } - else { // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type(value1.type, resulttypesum || value1.type, typelookupplus); - } - else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "SUM": - PushOperand(resulttypesum, sum); - break; - - case "PRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "MIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "MAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "COUNT": - PushOperand("n", count); - break; - - case "COUNTA": - PushOperand("n", counta); - break; - - case "COUNTBLANK": - PushOperand("n", countblank); - break; - - case "AVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum/count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - } - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["AVERAGE"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNT"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNTA"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNTBLANK"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["MAX"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["MIN"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["PRODUCT"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["STDEV"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["STDEVP"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["SUM"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["VAR"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["VARP"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; - -/* -# -# DAVERAGE(databaserange, fieldname, criteriarange) -# DCOUNT(databaserange, fieldname, criteriarange) -# DCOUNTA(databaserange, fieldname, criteriarange) -# DGET(databaserange, fieldname, criteriarange) -# DMAX(databaserange, fieldname, criteriarange) -# DMIN(databaserange, fieldname, criteriarange) -# DPRODUCT(databaserange, fieldname, criteriarange) -# DSTDEV(databaserange, fieldname, criteriarange) -# DSTDEVP(databaserange, fieldname, criteriarange) -# DSUM(databaserange, fieldname, criteriarange) -# DVAR(databaserange, fieldname, criteriarange) -# DVARP(databaserange, fieldname, criteriarange) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the series_functions, too. -# -*/ - -SocialCalc.Formula.DSeriesFunctions = function(fname, operand, foperand, sheet) { - - var value1, tostype, cr, dbrange, fieldname, criteriarange, dbinfo, criteriainfo; - var fieldasnum, targetcol, i, j, k, cell, criteriafieldnums; - var testok, criteriacr, criteria, testcol, testcr; - var t; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var value1 = {}; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - dbrange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - fieldname = scf.OperandValueAndType(sheet, foperand); // get a value - criteriarange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - - if (dbrange.type != "range" || criteriarange.type != "range") { - return scf.FunctionArgsError(fname, operand); - } - - dbinfo = scf.DecodeRangeParts(sheet, dbrange.value); - criteriainfo = scf.DecodeRangeParts(sheet, criteriarange.value); - - fieldasnum = scf.FieldToColnum(dbinfo.sheetdata, dbinfo.col1num, dbinfo.ncols, dbinfo.row1num, fieldname.value, fieldname.type); - if (fieldasnum <= 0) { - PushOperand("e#VALUE!", 0); - return; - } - - targetcol = dbinfo.col1num + fieldasnum - 1; - criteriafieldnums = []; - - for (i=0; i maxval ? v1 : maxval) : v1; - minval = (minval!=undefined) ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } - else { // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type(value1.type, resulttypesum || value1.type, typelookupplus); - } - else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "DSUM": - PushOperand(resulttypesum, sum); - break; - - case "DPRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "DMIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "DMAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "DCOUNT": - PushOperand("n", count); - break; - - case "DCOUNTA": - PushOperand("n", counta); - break; - - case "DAVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum/count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DGET": - if (count == 1) { - PushOperand(resulttypesum, sum); - } - else if (count == 0) { - PushOperand("e#VALUE!", 0); - } - else { - PushOperand("e#NUM!", 0); - } - break; - - } - - return; - - } - -SocialCalc.Formula.FunctionList["DAVERAGE"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DCOUNT"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DCOUNTA"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DGET"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DMAX"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DMIN"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DPRODUCT"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSTDEV"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSTDEVP"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSUM"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DVAR"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DVARP"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; - -/* -# -# colnum = SocialCalc.Formula.FieldToColnum(sheet, col1num, ncols, row1num, fieldname, fieldtype) -# -# If fieldname is a number, uses it, otherwise looks up string in cells in row to find field number -# -# If not found, returns 0. -# -*/ - -SocialCalc.Formula.FieldToColnum = function(sheet, col1num, ncols, row1num, fieldname, fieldtype) { - - var colnum, cell, value; - - if (fieldtype.charAt(0) == "n") { // number - return it if legal - colnum = fieldname - 0; // make sure a number - if (colnum <= 0 || colnum > ncols) { - return 0; - } - return Math.floor(colnum); - } - - if (fieldtype.charAt(0) != "t") { // must be text otherwise - return 0; - } - - fieldname = fieldname ? fieldname.toLowerCase() : ""; - - for (colnum=0; colnum < ncols; colnum++) { // look through column headers for a match - cell = sheet.GetAssuredCell(SocialCalc.crToCoord(col1num+colnum, row1num)); - value = cell.datavalue; - value = (value+"").toLowerCase(); // ignore case - if (value == fieldname) { // match - return colnum+1; - } - } - return 0; // looked at all and no match - - } - - -/* -# -# HLOOKUP(value, range, row, [rangelookup]) -# VLOOKUP(value, range, col, [rangelookup]) -# MATCH(value, range, [rangelookup]) -# -*/ - -SocialCalc.Formula.LookupFunctions = function(fname, operand, foperand, sheet) { - - var lookupvalue, range, offset, rangelookup, offsetvalue, rangeinfo; - var c, r, cincr, rincr, previousOK, csave, rsave, cell, value, valuetype, cr, lookupvalue; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - lookupvalue = operand_value_and_type(sheet, foperand); - if (typeof lookupvalue.value == "string") { - lookupvalue.value = lookupvalue.value.toLowerCase(); - } - - range = scf.TopOfStackValueAndType(sheet, foperand); - - rangelookup = 1; // default to true or 1 - if (fname == "MATCH") { - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value - 0; - } - } - else { - offsetvalue = scf.OperandAsNumber(sheet, foperand); - if (offsetvalue.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - offsetvalue = Math.floor(offsetvalue.value); - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value ? 1 : 0; // convert to 1 or 0 - } - } - lookupvalue.type = lookupvalue.type.charAt(0); // only deal with general type - if (lookupvalue.type == "n") { // if number, make sure a number - lookupvalue.value = lookupvalue.value - 0; - } - - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - rangeinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (!rangeinfo) { - PushOperand("e#REF!", 0); - return; - } - - c = 0; - r = 0; - cincr = 0; - rincr = 0; - if (fname == "HLOOKUP") { - cincr = 1; - if (offsetvalue > rangeinfo.nrows) { - PushOperand("e#REF!", 0); - return; - } - } - else if (fname == "VLOOKUP") { - rincr = 1; - if (offsetvalue > rangeinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - } - else if (fname == "MATCH") { - if (rangeinfo.ncols > 1) { - if (rangeinfo.nrows > 1) { - PushOperand("e#N/A", 0); - return; - } - cincr = 1; - } - else { - rincr = 1; - } - } - else { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (offsetvalue < 1 && fname != "MATCH") { - PushOperand("e#VALUE!", 0); - return 0; - } - - previousOK; // if 1, previous test was <. If 2, also this one wasn't - - while (1) { - cr = SocialCalc.crToCoord(rangeinfo.col1num + c, rangeinfo.row1num + r); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype ? cell.valuetype.charAt(0) : "b"; // only deal with general types - if (valuetype == "n") { - value = value - 0; // make sure number - } - if (rangelookup) { // rangelookup type 1 or -1: look for within brackets for matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { // match - break; - } - if ((rangelookup > 0 && lookupvalue.value > value) - || (rangelookup < 0 && lookupvalue.value < value)) { // possible match: wait and see - previousOK = 1; - csave = c; // remember col and row of last OK - rsave = r; - } - else if (previousOK) { // last one was OK, this one isn't - previousOK = 2; - break; - } - } - - else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { // match - break; - } - if ((rangelookup > 0 && lookupvalue.value > value) - || (rangelookup < 0 && lookupvalue.value < value)) { // possible match: wait and see - previousOK = 1; - csave = c; - rsave = r; - } - else if (previousOK) { // last one was OK, this one isn't - previousOK = 2; - break; - } - } - } - else { // exact value matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { // match - break; - } - } - else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { // match - break; - } - } - } - - r += rincr; - c += cincr; - if (r >= rangeinfo.nrows || c >= rangeinfo.ncols) { // end of range to check, no exact match - if (previousOK) { // at least one could have been OK - previousOK = 2; - break; - } - PushOperand("e#N/A", 0); - return; - } - } - - if (previousOK == 2) { // back to last OK - r = rsave; - c = csave; - } - - if (fname == "MATCH") { - value = c + r + 1; // only one may be <> 0 - valuetype = "n"; - } - else { - cr = SocialCalc.crToCoord(rangeinfo.col1num+c+(fname == "VLOOKUP" ? offsetvalue-1 : 0), rangeinfo.row1num+r+(fname == "HLOOKUP" ? offsetvalue-1 : 0)); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype; - } - PushOperand(valuetype, value); - - return; - - } - -SocialCalc.Formula.FunctionList["HLOOKUP"] = [SocialCalc.Formula.LookupFunctions, -3, "hlookup", "", "lookup"]; -SocialCalc.Formula.FunctionList["MATCH"] = [SocialCalc.Formula.LookupFunctions, -2, "match", "", "lookup"]; -SocialCalc.Formula.FunctionList["VLOOKUP"] = [SocialCalc.Formula.LookupFunctions, -3, "vlookup", "", "lookup"]; - -/* -# -# INDEX(range, rownum, colnum) -# -*/ - -SocialCalc.Formula.IndexFunction = function(fname, operand, foperand, sheet) { - - var range, sheetname, indexinfo, rowindex, colindex, result, resulttype; - - var scf = SocialCalc.Formula; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - indexinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (indexinfo.sheetname) { - sheetname = "!" + indexinfo.sheetname; - } - else { - sheetname = ""; - } - - rowindex = {value:0}; - colindex = {value:0}; - - if (foperand.length) { // look for row number - rowindex = scf.OperandAsNumber(sheet, foperand); - if (rowindex.type.charAt(0) != "n" || rowindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { // look for col number - colindex = scf.OperandAsNumber(sheet, foperand); - if (colindex.type.charAt(0) != "n" || colindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - } - else { // col number missing - if (indexinfo.nrows == 1) { // if only one row, then rowindex is really colindex - colindex.value = rowindex.value; - rowindex.value = 0; - } - } - } - - if (rowindex.value > indexinfo.nrows || colindex.value > indexinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - - if (rowindex.value == 0) { - if (colindex.value == 0) { - if (indexinfo.nrows == 1 && indexinfo.ncols == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+indexinfo.ncols-1, indexinfo.row1num+indexinfo.nrows-1) + - "|"; - resulttype = "range"; - } - } - else { - if (indexinfo.nrows == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num+indexinfo.nrows-1) + - "|"; - resulttype = "range"; - } - } - } - else { - if (colindex.value == 0) { - if (indexinfo.ncols == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num+rowindex.value-1) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num+rowindex.value-1) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+indexinfo.ncols-1, indexinfo.row1num+rowindex.value-1) + - "|"; - resulttype = "range"; - } - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num+rowindex.value-1) + sheetname; - resulttype = "coord"; - } - } - - PushOperand(resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["INDEX"] = [SocialCalc.Formula.IndexFunction, -1, "index", "", "lookup"]; - -/* -# -# COUNTIF(c1:c2,"criteria") -# SUMIF(c1:c2,"criteria",[range2]) -# -*/ - -SocialCalc.Formula.CountifSumifFunctions = function(fname, operand, foperand, sheet) { - - var range, criteria, sumrange, f2operand, result, resulttype, value1, value2; - var sum = 0; - var resulttypesum = ""; - var count = 0; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range or coord - criteria = scf.OperandAsText(sheet, foperand); // get criteria - if (fname == "SUMIF") { - if (foperand.length == 1) { // three arg form of SUMIF - sumrange = scf.TopOfStackValueAndType(sheet, foperand); - } - else if (foperand.length == 0) { // two arg form - sumrange = {value: range.value, type: range.type}; - } - else { - scf.FunctionArgsError(fname, operand); - return 0; - } - } - else { - sumrange = {value: range.value, type: range.type}; - } - - if (criteria.type.charAt(0) == "n") { - criteria.value = criteria.value + ""; // make text - } - else if (criteria.type.charAt(0) == "e") { // error - criteria.value = null; - } - else if (criteria.type.charAt(0) == "b") { // blank here is undefined - criteria.value = null; - } - - if (range.type != "coord" && range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - if (fname == "SUMIF" && sumrange.type != "coord" && sumrange.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - foperand.push(range); - f2operand = []; // to allow for 3 arg form - f2operand.push(sumrange); - - while (foperand.length) { - value1 = operand_value_and_type(sheet, foperand); - value2 = operand_value_and_type(sheet, f2operand); - - if (!scf.TestCriteria(value1.value, value1.type, criteria.value)) { - continue; - } - - count += 1; - - if (value2.type.charAt(0) == "n") { - sum += value2.value-0; - resulttypesum = lookup_result_type(value2.type, resulttypesum || value2.type, typelookupplus); - } - else if (value2.type.charAt(0) == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value2.type; - } - } - - resulttypesum = resulttypesum || "n"; - - if (fname == "SUMIF") { - PushOperand(resulttypesum, sum); - } - else if (fname == "COUNTIF") { - PushOperand("n", count); - } - - return; - - } - -SocialCalc.Formula.FunctionList["COUNTIF"] = [SocialCalc.Formula.CountifSumifFunctions, 2, "rangec", "", "stat"]; -SocialCalc.Formula.FunctionList["SUMIF"] = [SocialCalc.Formula.CountifSumifFunctions, -2, "sumif", "", "stat"]; - -/* -# -# IF(cond,truevalue,falsevalue) -# -*/ - -SocialCalc.Formula.IfFunction = function(fname, operand, foperand, sheet) { - - var cond, t; - - cond = SocialCalc.Formula.OperandValueAndType(sheet, foperand); - t = cond.type.charAt(0); - if (t != "n" && t != "b") { - operand.push({type: "e#VALUE!", value: 0}); - return; - } - - if (!cond.value) foperand.pop(); - operand.push(foperand.pop()); - if (cond.value) foperand.pop(); - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["IF"] = [SocialCalc.Formula.IfFunction, 3, "iffunc", "", "test"]; - -/* -# -# DATE(year,month,day) -# -*/ - -SocialCalc.Formula.DateFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var year = scf.OperandAsNumber(sheet, foperand); - var month = scf.OperandAsNumber(sheet, foperand); - var day = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(year.type, month.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, day.type, scf.TypeLookupTable.twoargnumeric); - if (resulttype.charAt(0) == "n") { - result = SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - Math.floor(year.value), Math.floor(month.value), Math.floor(day.value) - ) - SocialCalc.FormatNumber.datevalues.julian_offset; - resulttype = "nd"; - } - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["DATE"] = [SocialCalc.Formula.DateFunction, 3, "date", "", "datetime"]; - -/* -# -# TIME(hour,minute,second) -# -*/ - -SocialCalc.Formula.TimeFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var hours = scf.OperandAsNumber(sheet, foperand); - var minutes = scf.OperandAsNumber(sheet, foperand); - var seconds = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(hours.type, minutes.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, seconds.type, scf.TypeLookupTable.twoargnumeric); - if (resulttype.charAt(0) == "n") { - result = ((hours.value * 60 * 60) + (minutes.value * 60) + seconds.value) / (24*60*60); - resulttype = "nt"; - } - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["TIME"] = [SocialCalc.Formula.TimeFunction, 3, "hms", "", "datetime"]; - -/* -# -# DAY(date) -# MONTH(date) -# YEAR(date) -# WEEKDAY(date, [type]) -# -*/ - -SocialCalc.Formula.DMYFunctions = function(fname, operand, foperand, sheet) { - - var ymd, dtype, doffset; - var scf = SocialCalc.Formula; - var result = 0; - - var datevalue = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(datevalue.type, datevalue.type, scf.TypeLookupTable.oneargnumeric); - - if (resulttype.charAt(0) == "n") { - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian( - Math.floor(datevalue.value + SocialCalc.FormatNumber.datevalues.julian_offset)); - switch (fname) { - case "DAY": - result = ymd.day; - break; - - case "MONTH": - result = ymd.month; - break; - - case "YEAR": - result = ymd.year; - break; - - case "WEEKDAY": - dtype = {value: 1}; - if (foperand.length) { // get type if present - dtype = scf.OperandAsNumber(sheet, foperand); - if (dtype.type.charAt(0) != "n" || dtype.value < 1 || dtype.value > 3) { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { // extra args - scf.FunctionArgsError(fname, operand); - return; - } - } - doffset = 6; - if (dtype.value > 1) { - doffset -= 1; - } - result = Math.floor(datevalue.value+doffset) % 7 + (dtype.value < 3 ? 1 : 0); - break; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["DAY"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["MONTH"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["YEAR"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["WEEKDAY"] = [SocialCalc.Formula.DMYFunctions, -1, "weekday", "", "datetime"]; - -/* -# -# HOUR(datetime) -# MINUTE(datetime) -# SECOND(datetime) -# -*/ - -SocialCalc.Formula.HMSFunctions = function(fname, operand, foperand, sheet) { - - var hours, minutes, seconds, fraction; - var scf = SocialCalc.Formula; - var result = 0; - - var datetime = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(datetime.type, datetime.type, scf.TypeLookupTable.oneargnumeric); - - if (resulttype.charAt(0) == "n") { - if (datetime.value < 0) { - scf.PushOperand(operand, "e#NUM!", 0); // must be non-negative - return; - } - fraction = datetime.value - Math.floor(datetime.value); // fraction of a day - fraction *= 24; - hours = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - minutes = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - seconds = Math.floor(fraction + (datetime.value >= 0 ? 0.5: -0.5)); - if (fname == "HOUR") { - result = hours; - } - else if (fname == "MINUTE") { - result = minutes; - } - else if (fname == "SECOND") { - result = seconds; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["HOUR"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["MINUTE"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["SECOND"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; - -/* -# -# EXACT(v1,v2) -# -*/ - -SocialCalc.Formula.ExactFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value1 = scf.OperandValueAndType(sheet, foperand); - var v1type = value1.type.charAt(0); - var value2 = scf.OperandValueAndType(sheet, foperand); - var v2type = value2.type.charAt(0); - - if (v1type == "t") { - if (v2type == "t") { - result = value1.value == value2.value ? 1 : 0; - } - else if (v2type == "b") { - result = value1.value.length ? 0 : 1; - } - else if (v2type == "n") { - result = value1.value == value2.value+"" ? 1 : 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "n") { - if (v2type == "n") { - result = value1.value-0 == value2.value-0 ? 1 : 0; - } - else if (v2type == "b") { - result = 0; - } - else if (v2type == "t") { - result = value1.value+"" == value2.value ? 1 : 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "b") { - if (v2type == "t") { - result = value2.value.length ? 0 : 1; - } - else if (v2type == "b") { - result = 1; - } - else if (v2type == "n") { - result = 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "e") { - result = value1.value; - resulttype = value1.type; - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["EXACT"] = [SocialCalc.Formula.ExactFunction, 2, "", "", "text"]; - -/* -# -# FIND(key,string,[start]) -# LEFT(string,[length]) -# LEN(string) -# LOWER(string) -# MID(string,start,length) -# PROPER(string) -# REPLACE(string,start,length,new) -# REPT(string,count) -# RIGHT(string,[length]) -# SUBSTITUTE(string,old,new,[which]) -# TRIM(string) -# UPPER(string) -# -*/ - -// SocialCalc.Formula.ArgList has an array for each function, one entry for each possible arg (up to max). -// Min args are specified in SocialCalc.Formula.FunctionList. -// If array element is 1 then it's a text argument, if it's 0 then it's numeric, if -1 then just get whatever's there -// Text values are manipulated as UTF-8, converting from and back to byte strings - -SocialCalc.Formula.ArgList = { - FIND: [1, 1, 0], - LEFT: [1, 0], - LEN: [1], - LOWER: [1], - MID: [1, 0, 0], - PROPER: [1], - REPLACE: [1, 0, 0, 1], - REPT: [1, 0], - RIGHT: [1, 0], - SUBSTITUTE: [1, 1, 1, 0], - TRIM: [1], - UPPER: [1] - }; - -SocialCalc.Formula.StringFunctions = function(fname, operand, foperand, sheet) { - - var i, value, offset, len, start, count; - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var numargs = foperand.length; - var argdef = scf.ArgList[fname]; - var operand_value = []; - var operand_type = []; - - for (i=1; i <= numargs; i++) { // go through each arg, get value and type, and check for errors - if (i > argdef.length) { // too many args - scf.FunctionArgsError(fname, operand); - return; - } - if (argdef[i-1] == 0) { - value = scf.OperandAsNumber(sheet, foperand); - } - else if (argdef[i-1] == 1) { - value = scf.OperandAsText(sheet, foperand); - } - else if (argdef[i-1] == -1) { - value = scf.OperandValueAndType(sheet, foperand); - } - operand_value[i] = value.value; - operand_type[i] = value.type; - if (value.type.charAt(0) == "e") { - scf.PushOperand(operand, value.type, result); - return; - } - } - - switch (fname) { - case "FIND": - offset = operand_type[3] ? operand_value[3]-1 : 0; - if (offset < 0) { - result = "Start is before string"; // !! not displayed, no need to translate - } - else { - result = operand_value[2].indexOf(operand_value[1], offset); // (null string matches first char) - if (result >= 0) { - result += 1; - resulttype = "n"; - } - else { - result = "Not found"; // !! not displayed, error is e#VALUE! - } - } - break; - - case "LEFT": - len = operand_type[2] ? operand_value[2]-0 : 1; - if (len < 0) { - result = "Negative length"; - } - else { - result = operand_value[1].substring(0, len); - resulttype = "t"; - } - break; - - case "LEN": - result = operand_value[1].length; - resulttype = "n"; - break; - - case "LOWER": - result = operand_value[1].toLowerCase(); - resulttype = "t"; - break; - - case "MID": - start = operand_value[2]-0; - len = operand_value[3]-0; - if (len < 1 || start < 1) { - result = "Bad arguments"; - } - else { - result = operand_value[1].substring(start-1, start+len-1); - resulttype = "t"; - } - break; - - case "PROPER": - result = operand_value[1].replace(/\b\w+\b/g, function(word) { - return word.substring(0,1).toUpperCase() + - word.substring(1); - }); // uppercase first character of words (see JavaScript, Flanagan, 5th edition, page 704) - resulttype = "t"; - break; - - case "REPLACE": - start = operand_value[2]-0; - len = operand_value[3]-0; - if (len < 0 || start < 1) { - result = "Bad arguments"; - } - else { - result = operand_value[1].substring(0, start-1) + operand_value[4] + - operand_value[1].substring(start-1+len); - resulttype = "t"; - } - break; - - case "REPT": - count = operand_value[2]-0; - if (count < 0) { - result = "Negative count"; - } - else { - result = ""; - for (; count > 0; count--) { - result += operand_value[1]; - } - resulttype = "t"; - } - break; - - case "RIGHT": - len = operand_type[2] ? operand_value[2]-0 : 1; - if (len < 0) { - result = "Negative length"; - } - else { - result = operand_value[1].slice(-len); - resulttype = "t"; - } - break; - - case "SUBSTITUTE": - fulltext = operand_value[1]; - oldtext = operand_value[2]; - newtext = operand_value[3]; - if (operand_value[4] != null) { - which = operand_value[4]-0; - if (which <= 0) { - result = "Non-positive instance number"; - break; - } - } - else { - which = 0; - } - count = 0; - oldpos = 0; - result = ""; - while (true) { - pos = fulltext.indexOf(oldtext, oldpos); - if (pos >= 0) { - count++; //!!!!!! old test just in case: if (count>1000) {alert(pos); break;} - result += fulltext.substring(oldpos, pos); - if (which==0) { - result += newtext; // substitute - } - else if (which==count) { - result += newtext + fulltext.substring(pos+oldtext.length); - break; - } - else { - result += oldtext; // leave as was - } - oldpos = pos + oldtext.length; - } - else { // no more - result += fulltext.substring(oldpos); - break; - } - } - resulttype = "t"; - break; - - case "TRIM": - result = operand_value[1]; - result = result.replace(/^ */, ""); - result = result.replace(/ *$/, ""); - result = result.replace(/ +/g, " "); - resulttype = "t"; - break; - - case "UPPER": - result = operand_value[1].toUpperCase(); - resulttype = "t"; - break; - - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["FIND"] = [SocialCalc.Formula.StringFunctions, -2, "find", "", "text"]; -SocialCalc.Formula.FunctionList["LEFT"] = [SocialCalc.Formula.StringFunctions, -2, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["LEN"] = [SocialCalc.Formula.StringFunctions, 1, "txt", "", "text"]; -SocialCalc.Formula.FunctionList["LOWER"] = [SocialCalc.Formula.StringFunctions, 1, "txt", "", "text"]; -SocialCalc.Formula.FunctionList["MID"] = [SocialCalc.Formula.StringFunctions, 3, "mid", "", "text"]; -SocialCalc.Formula.FunctionList["PROPER"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["REPLACE"] = [SocialCalc.Formula.StringFunctions, 4, "replace", "", "text"]; -SocialCalc.Formula.FunctionList["REPT"] = [SocialCalc.Formula.StringFunctions, 2, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["RIGHT"] = [SocialCalc.Formula.StringFunctions, -1, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["SUBSTITUTE"] = [SocialCalc.Formula.StringFunctions, -3, "subs", "", "text"]; -SocialCalc.Formula.FunctionList["TRIM"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["UPPER"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; - -/* -# -# is_functions: -# -# ISBLANK(value) -# ISERR(value) -# ISERROR(value) -# ISLOGICAL(value) -# ISNA(value) -# ISNONTEXT(value) -# ISNUMBER(value) -# ISTEXT(value) -# -*/ - -SocialCalc.Formula.IsFunctions = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - - case "ISBLANK": - result = value.type == "b" ? 1 : 0; - break; - - case "ISERR": - result = t == "e" ? (value.type == "e#N/A" ? 0 : 1) : 0; - break; - - case "ISERROR": - result = t == "e" ? 1 : 0; - break; - - case "ISLOGICAL": - result = value.type == "nl" ? 1 : 0; - break; - - case "ISNA": - result = value.type == "e#N/A" ? 1 : 0; - break; - - case "ISNONTEXT": - result = t == "t" ? 0 : 1; - break; - - case "ISNUMBER": - result = t == "n" ? 1 : 0; - break; - - case "ISTEXT": - result = t == "t" ? 1 : 0; - break; - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["ISBLANK"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISERR"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISERROR"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISLOGICAL"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNA"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNONTEXT"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNUMBER"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISTEXT"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; - -/* -# -# ntv_functions: -# -# N(value) -# T(value) -# VALUE(value) -# -*/ - -SocialCalc.Formula.NTVFunctions = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - - case "N": - result = t == "n" ? value.value-0 : 0; - resulttype = "n"; - break; - - case "T": - result = t == "t" ? value.value+"" : ""; - resulttype = "t"; - break; - - case "VALUE": - if (t == "n" || t == "b") { - result = value.value || 0; - resulttype = "n"; - } - else if (t == "t") { - value = SocialCalc.DetermineValueType(value.value); - if (value.type.charAt(0) != "n") { - result = 0; - resulttype = "e#VALUE!"; - } - else { - result = value.value-0; - resulttype = "n"; - } - } - break; - } - - if (t == "e") { // error trumps - resulttype = value.type; - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["N"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["T"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["VALUE"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "text"]; - -/* -# -# ABS(value) -# ACOS(value) -# ASIN(value) -# ATAN(value) -# COS(value) -# DEGREES(value) -# EVEN(value) -# EXP(value) -# FACT(value) -# INT(value) -# LN(value) -# LOG10(value) -# ODD(value) -# RADIANS(value) -# SIN(value) -# SQRT(value) -# TAN(value) -# -*/ - -SocialCalc.Formula.Math1Functions = function(fname, operand, foperand, sheet) { - - var v1, value, f; - var result = {}; - - var scf = SocialCalc.Formula; - - v1 = scf.OperandAsNumber(sheet, foperand); - value = v1.value; - result.type = scf.LookupResultType(v1.type, v1.type, scf.TypeLookupTable.oneargnumeric); - - if (result.type == "n") { - switch (fname) { - case "ABS": - value = Math.abs(value); - break; - - case "ACOS": - if (value >= -1 && value <= 1) { - value = Math.acos(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "ASIN": - if (value >= -1 && value <= 1) { - value = Math.asin(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "ATAN": - value = Math.atan(value); - break; - - case "COS": - value = Math.cos(value); - break; - - case "DEGREES": - value = value * 180/Math.PI; - break; - - case "EVEN": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (Math.floor(value + 1) % 2); - } - else { // integer - value = value + (value % 2); - } - if (v1.value < 0) value = -value; - break; - - case "EXP": - value = Math.exp(value); - break; - - case "FACT": - f = 1; - value = Math.floor(value); - for (;value>0;value--) { - f *= value; - } - value = f; - break; - - case "INT": - value = Math.floor(value); // spreadsheet INT is floor(), not int() - break; - - case "LN": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclnarg; - } - value = Math.log(value); - break; - - case "LOG10": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclog10arg; - } - value = Math.log(value)/Math.log(10); - break; - - case "ODD": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (1 - (Math.floor(value + 1) % 2)); - } - else { // integer - value = value + (1 - (value % 2)); - } - if (v1.value < 0) value = -value; - break; - - case "RADIANS": - value = value * Math.PI/180; - break; - - case "SIN": - value = Math.sin(value); - break; - - case "SQRT": - if (value >= 0) { - value = Math.sqrt(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "TAN": - if (Math.cos(value) != 0) { - value = Math.tan(value); - } - else { - result.type = "e#NUM!"; - } - break; - } - } - - result.value = value; - operand.push(result); - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["ABS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ACOS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ASIN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ATAN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["COS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["DEGREES"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["EVEN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["EXP"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["FACT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["INT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["LN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["LOG10"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ODD"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["RADIANS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["SIN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["SQRT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["TAN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; - - -/* -# -# ATAN2(x, y) -# MOD(a, b) -# POWER(a, b) -# TRUNC(value, precision) -# -*/ - -SocialCalc.Formula.Math2Functions = function(fname, operand, foperand, sheet) { - - var xval, yval, value, quotient, decimalscale, i; - var result = {}; - - var scf = SocialCalc.Formula; - - xval = scf.OperandAsNumber(sheet, foperand); - yval = scf.OperandAsNumber(sheet, foperand); - value = 0; - result.type = scf.LookupResultType(xval.type, yval.type, scf.TypeLookupTable.twoargnumeric); - - if (result.type == "n") { - switch (fname) { - case "ATAN2": - if (xval.value == 0 && yval.value == 0) { - result.type = "e#DIV/0!"; - } - else { - result.value = Math.atan2(yval.value, xval.value); - } - break; - - case "POWER": - result.value = Math.pow(xval.value, yval.value); - if (isNaN(result.value)) { - result.value = 0; - result.type = "e#NUM!"; - } - break; - - case "MOD": // en.wikipedia.org/wiki/Modulo_operation, etc. - if (yval.value == 0) { - result.type = "e#DIV/0!"; - } - else { - quotient = xval.value/yval.value; - quotient = Math.floor(quotient); - result.value = xval.value - (quotient * yval.value); - } - break; - - case "TRUNC": - decimalscale = 1; // cut down to required number of decimal digits - if (yval.value >= 0) { - yval.value = Math.floor(yval.value); - for (i=0; i 0) { - decimalscale = 1; // cut down to required number of decimal digits - value2.value = Math.floor(value2.value); - for (i=0; i 0 ) { - method = scf.OperandAsNumber(sheet, foperand); - } - if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (scf.CheckForErrorValue(operand, method)) return; - - depreciation = 0; // calculated for each period - accumulateddepreciation = 0; // accumulated by adding each period's - - for (i=1; i<=period.value-0 && i<=lifetime.value; i++) { // calculate for each period based on net from previous - depreciation = (cost.value - accumulateddepreciation) * (method.value / lifetime.value); - if (cost.value - accumulateddepreciation - depreciation < salvage.value) { // don't go lower than salvage value - depreciation = cost.value - accumulateddepreciation - salvage.value; - } - accumulateddepreciation += depreciation; - } - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["DDB"] = [SocialCalc.Formula.DDBFunction, -4, "ddb", "", "financial"]; - -/* -# -# SLN(cost,salvage,lifetime) -# -# Depreciation for each period by straight-line method -# See: http://en.wikipedia.org/wiki/Depreciation -# -*/ - -SocialCalc.Formula.SLNFunction = function(fname, operand, foperand, sheet) { - - var depreciation; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - - if (lifetime.value < 1) { - scf.FunctionSpecificError(fname, operand, "e#NUM!", SocialCalc.Constants.s_sheetfuncslnlife); - return 0; - } - - depreciation = (cost.value - salvage.value) / lifetime.value; - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["SLN"] = [SocialCalc.Formula.SLNFunction, 3, "csl", "", "financial"]; - -/* -# -# SYD(cost,salvage,lifetime,period) -# -# Depreciation by Sum of Year's Digits method -# -*/ - -SocialCalc.Formula.SYDFunction = function(fname, operand, foperand, sheet) { - - var depreciation, sumperiods; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - var period = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - if (scf.CheckForErrorValue(operand, period)) return; - - if (lifetime.value < 1 || period.value <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return 0; - } - - sumperiods = ((lifetime.value + 1) * lifetime.value)/2; // add up 1 through lifetime - depreciation = (cost.value - salvage.value) * (lifetime.value - period.value + 1) / sumperiods; // calc depreciation - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["SYD"] = [SocialCalc.Formula.SYDFunction, 4, "cslp", "", "financial"]; - -/* -# -# FV(rate, n, payment, [pv, [paytype]]) -# NPER(rate, payment, pv, [fv, [paytype]]) -# PMT(rate, n, pv, [fv, [paytype]]) -# PV(rate, n, payment, [fv, [paytype]]) -# RATE(n, payment, pv, [fv, [paytype, [guess]]]) -# -# Following the Open Document Format formula specification: -# -# PV = - Fv - (Payment * Nper) [if rate equals 0] -# Pv*(1+Rate)^Nper + Payment * (1 + Rate*PaymentType) * ( (1+Rate)^nper -1)/Rate + Fv = 0 -# -# For each function, the formulas are solved for the appropriate value (transformed using -# basic algebra). -# -*/ - -SocialCalc.Formula.InterestFunctions = function(fname, operand, foperand, sheet) { - - var resulttype, result, dval, eval, fval; - var pv, fv, rate, n, payment, paytype, guess, part1, part2, part3, part4, part5; - var olddelta, maxloop, tries, deltaepsilon, rate, oldrate, m; - - var scf = SocialCalc.Formula; - - var aval = scf.OperandAsNumber(sheet, foperand); - var bval = scf.OperandAsNumber(sheet, foperand); - var cval = scf.OperandAsNumber(sheet, foperand); - - resulttype = scf.LookupResultType(aval.type, bval.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, cval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - dval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, dval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - eval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, eval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - if (fname != "RATE") { // only rate has 6 possible args - scf.FunctionArgsError(fname, operand); - return 0; - } - fval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, fval.type, scf.TypeLookupTable.twoargnumeric); - } - } - } - - if (resulttype == "n") { - switch (fname) { - case "FV": // FV(rate, n, payment, [pv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - pv = dval!=null ? dval.value : 0; // get value if present, or use default - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == 0) { // simple calculation if no interest - fv = -pv - (payment * n); - } - else { - fv = -(pv*Math.pow(1+rate,n) + payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate); - } - result = fv; - resulttype = 'n$'; - break; - - case "NPER": // NPER(rate, payment, pv, [fv, [paytype]]) - rate = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == 0) { // simple calculation if no interest - if (payment == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - n = (pv + fv)/(-payment); - } - else { - part1 = payment * (1 + rate * paytype) / rate; - part2 = pv + part1; - if (part2 == 0 || rate <= -1) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part3 = (part1 - fv) / part2; - if (part3 <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part4 = Math.log(part3); - part5 = Math.log(1 + rate); // rate > -1 - n = part4/part5; - } - result = n; - resulttype = 'n'; - break; - - case "PMT": // PMT(rate, n, pv, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (n == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - else if (rate == 0) { // simple calculation if no interest - payment = (fv - pv)/n; - } - else { - payment = (0 - fv - pv*Math.pow(1+rate,n))/((1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate); - } - result = payment; - resulttype = 'n$'; - break; - - case "PV": // PV(rate, n, payment, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == -1) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - else if (rate == 0) { // simple calculation if no interest - pv = -fv - (payment * n); - } - else { - pv = (-fv - payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate)/(Math.pow(1+rate,n)); - } - result = pv; - resulttype = 'n$'; - break; - - case "RATE": // RATE(n, payment, pv, [fv, [paytype, [guess]]]) - n = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - guess = fval!=null ? fval.value : 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 100; - tries = 0; - delta = 1; - epsilon = 0.0000001; // this is close enough - rate = guess || 0.00000001; // zero is not allowed - while ((delta >= 0 ? delta : -delta) > epsilon && (rate != oldrate)) { - delta = fv + pv*Math.pow(1+rate,n) + payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate; - if (olddelta!=null) { - m = (delta - olddelta)/(rate - oldrate) || .001; // get slope (not zero) - oldrate = rate; - rate = rate - delta / m; // look for zero crossing - olddelta = delta; - } - else { // first time - no old values - oldrate = rate; - rate = 1.1 * rate; - olddelta = delta; - } - tries++; - if (tries >= maxloop) { // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - result = rate; - resulttype = 'n%'; - break; - } - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["FV"] = [SocialCalc.Formula.InterestFunctions, -3, "fv", "", "financial"]; -SocialCalc.Formula.FunctionList["NPER"] = [SocialCalc.Formula.InterestFunctions, -3, "nper", "", "financial"]; -SocialCalc.Formula.FunctionList["PMT"] = [SocialCalc.Formula.InterestFunctions, -3, "pmt", "", "financial"]; -SocialCalc.Formula.FunctionList["PV"] = [SocialCalc.Formula.InterestFunctions, -3, "pv", "", "financial"]; -SocialCalc.Formula.FunctionList["RATE"] = [SocialCalc.Formula.InterestFunctions, -3, "rate", "", "financial"]; - -/* -# -# NPV(rate,v1,v2,c1:c2,...) -# -*/ - -SocialCalc.Formula.NPVFunction = function(fname, operand, foperand, sheet) { - - var resulttypenpv, rate, sum, factor, value1; - - var scf = SocialCalc.Formula; - - var rate = scf.OperandAsNumber(sheet, foperand); - if (scf.CheckForErrorValue(operand, rate)) return; - - sum = 0; - resulttypenpv = "n"; - factor = 1; - - while (foperand.length) { - value1 = scf.OperandValueAndType(sheet, foperand); - if (value1.type.charAt(0) == "n") { - factor *= (1 + rate.value); - if (factor == 0) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - sum += value1.value / factor; - resulttypenpv = scf.LookupResultType(value1.type, resulttypenpv || value1.type, scf.TypeLookupTable.plus); - } - else if (value1.type.charAt(0) == "e" && resulttypenpv.charAt(0) != "e") { - resulttypenpv = value1.type; - break; - } - } - - if (resulttypenpv.charAt(0) == "n") { - resulttypenpv = 'n$'; - } - - scf.PushOperand(operand, resulttypenpv, sum); - - return; - - } - -SocialCalc.Formula.FunctionList["NPV"] = [SocialCalc.Formula.NPVFunction, -2, "npv", "", "financial"]; - -/* -# -# IRR(c1:c2,[guess]) -# -*/ - -SocialCalc.Formula.IRRFunction = function(fname, operand, foperand, sheet) { - - var value1, guess, oldsum, maxloop, tries, epsilon, rate, oldrate, m, sum, factor, i; - var rangeoperand = []; - var cashflows = []; - - var scf = SocialCalc.Formula; - - rangeoperand.push(foperand.pop()); // first operand is a range - - while (rangeoperand.length) { // get values from range so we can do iterative approximations - value1 = scf.OperandValueAndType(sheet, rangeoperand); - if (value1.type.charAt(0) == "n") { - cashflows.push(value1.value); - } - else if (value1.type.charAt(0) == "e") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - } - - if (!cashflows.length) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - - guess = {value: 0}; - - if (foperand.length) { // guess is provided - guess = scf.OperandAsNumber(sheet, foperand); - if (guess.type.charAt(0) != "n" && guess.type.charAt(0) != "b") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { // should be no more args - scf.FunctionArgsError(fname, operand); - return; - } - } - - guess.value = guess.value || 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 20; - tries = 0; - epsilon = 0.0000001; // this is close enough - rate = guess.value; - sum = 1; - - while ((sum >= 0 ? sum : -sum) > epsilon && (rate != oldrate)) { - sum = 0; - factor = 1; - for (i=0; i= maxloop) { // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - - scf.PushOperand(operand, 'n%', rate); - - return; - - } - -SocialCalc.Formula.FunctionList["IRR"] = [SocialCalc.Formula.IRRFunction, -1, "irr", "", "financial"]; - -// -// SHEET CACHE -// - -SocialCalc.Formula.SheetCache = { - - // Sheet data: Attributes are each sheet in the cache with values of an object with: - // - // sheet: sheet-obj (or null, meaning not found) - // recalcstate: constants.asloaded = as loaded - // constants.recalcing = being recalced now - // constants.recalcdone = recalc done - // name: name of sheet (in case just have object and don't know name) - // - - sheets: {}, - - // Waiting for loading: - // If sheet is not in cache, this is set to the sheetname being loaded - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForLoading: null, - - // Constants to use for setting sheets[*].recalcstate: - - constants: {asloaded: 0, recalcing: 1, recalcdone: 2}, - - loadsheet: null // (deprecated - use SocialCalc.RecalcInfo.LoadSheet) - - }; - -// -// othersheet = SocialCalc.Formula.FindInSheetCache(sheetname) -// -// Returns a SocialCalc.Sheet object corresponding to string sheetname -// or null if the sheet is not available or in error. -// -// Each sheet is loaded only once and then stored in a cache. -// Loading is handled elsewhere, e.g., in the recalc loop. -// - -SocialCalc.Formula.FindInSheetCache = function(sheetname) { - - var str; - var sfsc = SocialCalc.Formula.SheetCache; - - var nsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); // normalize different versions - - if (sfsc.sheets[nsheetname]) { // a sheet by that name is in the cache already - return sfsc.sheets[nsheetname].sheet; // return it - } - - if (sfsc.waitingForLoading) { // waiting already - only queue up one - return null; // return not found - } - - sfsc.waitingForLoading = nsheetname; // let recalc loop know that we have a sheet to load - - return null; // return not found - - } - -// -// newsheet = SocialCalc.Formula.AddSheetToCache(sheetname, str) -// -// Adds a new sheet to the sheet cache. -// Returns the sheet object filled out with the str (a saved sheet). -// - -SocialCalc.Formula.AddSheetToCache = function(sheetname, str) { - - var newsheet = null; - var sfsc = SocialCalc.Formula.SheetCache; - var sfscc = sfsc.constants; - var newsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); - - if (str) { - newsheet = new SocialCalc.Sheet(); - newsheet.ParseSheetSave(str); - } - - sfsc.sheets[newsheetname] = {sheet: newsheet, recalcstate: sfscc.asloaded, name: newsheetname}; - - SocialCalc.Formula.FreshnessInfo.sheets[newsheetname] = true; - - return newsheet; - - } - -// -// nsheet = SocialCalc.Formula.NormalizeSheetName(sheetname) -// - -SocialCalc.Formula.NormalizeSheetName = function(sheetname) { - - if (SocialCalc.Callbacks.NormalizeSheetName) { - return SocialCalc.Callbacks.NormalizeSheetName(sheetname); - } - else { - return sheetname.toLowerCase(); - } - } - -// -// REMOTE FUNCTION INFO -// - -SocialCalc.Formula.RemoteFunctionInfo = { - - // Waiting for server: - // If waiting for an XHR response from the server, this is set to some non-blank status text - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForServer: null - - }; - -// -// FRESHNESS INFO -// -// This information is generated during recalc. -// It may be used to help determine when the recalc data in a spreadsheet -// may be out of date. -// For example, it may be used to display a message like: -// "Dependent on sheet 'FOO' which was updated more recently than this printout" - -SocialCalc.Formula.FreshnessInfo = { - - // For each external sheet referenced successfully an attribute of that name with value true. - - sheets: {}, - - // For each volatile function that is called an attribute of that name with value true. - - volatile: {}, - - // Set to false when started and true when recalc completes - - recalc_completed: false - - }; - -SocialCalc.Formula.FreshnessInfoReset = function() { - - var scffi = SocialCalc.Formula.FreshnessInfo; - - scffi.sheets = {}; - scffi.volatile = {}; - scffi.recalc_completed = false; - - } - -// -// MISC ROUTINES -// - -// -// result = SocialCalc.Formula.PlainCoord(coord) -// -// Returns: coord without any $'s -// - -SocialCalc.Formula.PlainCoord = function(coord) { - - if (coord.indexOf("$") == -1) return coord; - - return coord.replace(/\$/g, ""); // remove any $'s - - } - -// -// result = SocialCalc.Formula.OrderRangeParts(coord1, coord2) -// -// Returns: {c1: col, r1: row, c2: col, r2 = row} with c1/r1 upper left -// - -SocialCalc.Formula.OrderRangeParts = function(coord1, coord2) { - - var cr1, cr2; - var result = {}; - - cr1 = SocialCalc.coordToCr(coord1); - cr2 = SocialCalc.coordToCr(coord2); - if (cr1.col > cr2.col) { result.c1 = cr2.col; result.c2 = cr1.col; } - else { result.c1 = cr1.col; result.c2 = cr2.col; } - if (cr1.row > cr2.row) { result.r1 = cr2.row; result.r2 = cr1.row; } - else { result.r1 = cr1.row; result.r2 = cr2.row; } - - return result; - - } - -// -// cond = SocialCalc.Formula.TestCriteria(value, type, criteria) -// -// Determines whether a value/type meets the criteria. -// A criteria can be a numeric value, text beginning with <, <=, =, >=, >, <>, text by itself is start of text to match. -// Used by a variety of functions, including the "D" functions (DSUM, etc.). -// -// Returns true or false -// - -SocialCalc.Formula.TestCriteria = function(value, type, criteria) { - - var comparitor, basestring, basevalue, cond, testvalue; - - if (criteria == null) { // undefined (e.g., error value) is always false - return false; - } - - criteria = criteria + ""; - comparitor = criteria.charAt(0); // look for comparitor - if (comparitor == "=" || comparitor == "<" || comparitor == ">") { - basestring = criteria.substring(1); - } - else { - comparitor = criteria.substring(0,2); - if (comparitor == "<=" || comparitor == "<>" || comparitor == ">=") { - basestring = criteria.substring(2); - } - else { - comparitor = "none"; - basestring = criteria; - } - } - - basevalue = SocialCalc.DetermineValueType(basestring); // get type of value being compared - if (!basevalue.type) { // no criteria base value given - if (comparitor == "none") { // blank criteria matches nothing - return false; - } - if (type.charAt(0) == "b") { // comparing to empty cell - if (comparitor == "=") { // empty equals empty - return true; - } - } - else { - if (comparitor == "<>") { // "something" does not equal empty - return true; - } - } - return false; // otherwise false - } - - cond = false; - - if (basevalue.type.charAt(0) == "n" && type.charAt(0) == "t") { // criteria is number, but value is text - testvalue = SocialCalc.DetermineValueType(value); - if (testvalue.type.charAt(0) == "n") { // could be number - make it one - value = testvalue.value; - type = testvalue.type; - } - } - - if (type.charAt(0) == "n" && basevalue.type.charAt(0) == "n") { // compare two numbers - value = value - 0; // make sure numbers - basevalue.value = basevalue.value - 0; - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - case "none": - cond = value == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } - - else if (type.charAt(0) == "e") { // error on left - cond = false; - } - - else if (basevalue.type.charAt(0) == "e") { // error on right - cond = false; - } - - else { // text, maybe mixed with number or blank - if (type.charAt(0) == "n") { - value = SocialCalc.format_number_for_display(value, "n", ""); - } - if (basevalue.type.charAt(0) == "n") { - return false; // if number and didn't match already, isn't a match - } - - value = value ? value.toLowerCase() : ""; - basevalue.value = basevalue.value ? basevalue.value.toLowerCase() : ""; - - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - cond = value == basevalue.value; - break; - - case "none": - cond = value.substring(0, basevalue.value.length) == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } - - return cond; - - } - diff --git a/Website/static/highslide/examples/ajax.html b/Website/static/highslide/examples/ajax.html deleted file mode 100644 index 9216027..0000000 --- a/Website/static/highslide/examples/ajax.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - -
    -AJAX requesting the body of a HTML page, - - click here. - -
    - -AJAX requesting a specific id in an external HTML page, - - intro, - - div3. - - -
    - - \ No newline at end of file diff --git a/Website/static/highslide/examples/flash.html b/Website/static/highslide/examples/flash.html deleted file mode 100644 index 2d6dd1d..0000000 --- a/Website/static/highslide/examples/flash.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/gallery-controls-in-heading.html b/Website/static/highslide/examples/gallery-controls-in-heading.html deleted file mode 100644 index 49e3e0c..0000000 --- a/Website/static/highslide/examples/gallery-controls-in-heading.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/gallery-dark.html b/Website/static/highslide/examples/gallery-dark.html deleted file mode 100644 index 2a73f36..0000000 --- a/Website/static/highslide/examples/gallery-dark.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/gallery-floating-caption.html b/Website/static/highslide/examples/gallery-floating-caption.html deleted file mode 100644 index e37baa1..0000000 --- a/Website/static/highslide/examples/gallery-floating-caption.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/gallery-floating-thumbs.html b/Website/static/highslide/examples/gallery-floating-thumbs.html deleted file mode 100644 index fd2f845..0000000 --- a/Website/static/highslide/examples/gallery-floating-thumbs.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/gallery-horizontal-strip.html b/Website/static/highslide/examples/gallery-horizontal-strip.html deleted file mode 100644 index 530f216..0000000 --- a/Website/static/highslide/examples/gallery-horizontal-strip.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/gallery-in-box.html b/Website/static/highslide/examples/gallery-in-box.html deleted file mode 100644 index fd8f0ac..0000000 --- a/Website/static/highslide/examples/gallery-in-box.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/gallery-in-page.html b/Website/static/highslide/examples/gallery-in-page.html deleted file mode 100644 index 4a5201d..0000000 --- a/Website/static/highslide/examples/gallery-in-page.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/gallery-thumbstrip-above.html b/Website/static/highslide/examples/gallery-thumbstrip-above.html deleted file mode 100644 index 607c24f..0000000 --- a/Website/static/highslide/examples/gallery-thumbstrip-above.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/gallery-vertical-strip.html b/Website/static/highslide/examples/gallery-vertical-strip.html deleted file mode 100644 index fc8e9f6..0000000 --- a/Website/static/highslide/examples/gallery-vertical-strip.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/gallery-white.html b/Website/static/highslide/examples/gallery-white.html deleted file mode 100644 index 7b6540d..0000000 --- a/Website/static/highslide/examples/gallery-white.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/headline.html b/Website/static/highslide/examples/headline.html deleted file mode 100644 index b9b526e..0000000 --- a/Website/static/highslide/examples/headline.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - -
    - - - Open HTML-content - -
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam dapibus leo quis nisl. In lectus. Vivamus consectetuer pede in nisl. Mauris cursus pretium mauris. Suspendisse condimentum mi ac tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec sed enim. Ut vel ipsum. Cras consequat velit et justo. Donec mollis, mi at tincidunt vehicula, nisl mi luctus risus, quis scelerisque arcu nibh ac nisi. Sed risus. Curabitur urna. Aliquam vitae nisl. Quisque imperdiet semper justo. Pellentesque nonummy pretium tellus. -
    - - - - -
    - - \ No newline at end of file diff --git a/Website/static/highslide/examples/html.html b/Website/static/highslide/examples/html.html deleted file mode 100644 index bf86435..0000000 --- a/Website/static/highslide/examples/html.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - -
    - - - - - HTML content - - -
    -
    - -
    -
    - Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam dapibus leo quis nisl. In lectus. Vivamus consectetuer pede in nisl. Mauris cursus pretium mauris. Suspendisse condimentum mi ac tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec sed enim. Ut vel ipsum. Cras consequat velit et justo. Donec mollis, mi at tincidunt vehicula, nisl mi luctus risus, quis scelerisque arcu nibh ac nisi. Sed risus. Curabitur urna. Aliquam vitae nisl. Quisque imperdiet semper justo. Pellentesque nonummy pretium tellus. -
    - -
    - -
    - - \ No newline at end of file diff --git a/Website/static/highslide/examples/iframe.html b/Website/static/highslide/examples/iframe.html deleted file mode 100644 index eab43a1..0000000 --- a/Website/static/highslide/examples/iframe.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/image-map.html b/Website/static/highslide/examples/image-map.html deleted file mode 100644 index 21854a5..0000000 --- a/Website/static/highslide/examples/image-map.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - -
    - - - - - - Iceland - Denmark - Norway - Sweden - Finland - -
    - - \ No newline at end of file diff --git a/Website/static/highslide/examples/includes/Flash.swf b/Website/static/highslide/examples/includes/Flash.swf deleted file mode 100644 index cc7c747..0000000 Binary files a/Website/static/highslide/examples/includes/Flash.swf and /dev/null differ diff --git a/Website/static/highslide/examples/includes/ajax.htm b/Website/static/highslide/examples/includes/ajax.htm deleted file mode 100644 index 7185544..0000000 --- a/Website/static/highslide/examples/includes/ajax.htm +++ /dev/null @@ -1,45 +0,0 @@ - - - - - -AJAX content - - - -
    -

    AJAX content

    -

    Highslide's AJAX engine lets you put your content in a separate file and display - it within a Highslide popup. If the file is HTML, you can specify a specific id - for Highslide to fetch. In this case, the id intro was fetched.

    -

    To see the source of the linked AJAX file, right click on the anchor link that you clicked - to open this popup, then choose Open in new window.

    -

    Highslide caches the AJAX content upon page load, so that it sits ready to display - instantly when the user clicks the thumbnail or link.

    -
    - -
    -

    Dynamic content

    -

    Highslide HTML allows the popup size to be recalculated after the content has been - changed, either through internal scripts or through external AJAX calls.

    -

    This example also has hs.preserveContent set to true. Try updating - the content and move the popup, then close it and open it again.

    -
    - Read more - -
    -
    - -
    -

    Header for div3

    -Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam dapibus leo quis nisl. In lectus. Vivamus consectetuer pede in nisl. Mauris cursus pretium mauris. Suspendisse condimentum mi ac tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec sed enim. Ut vel ipsum. Cras consequat velit et justo. Donec mollis, mi at tincidunt vehicula, nisl mi luctus risus, quis scelerisque arcu nibh ac nisi. Sed risus. Curabitur urna. Aliquam vitae nisl. Quisque imperdiet semper justo. Pellentesque nonummy pretium tellus. -
    - -
    -

    Header for div4

    -Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam dapibus leo quis nisl. In lectus. Vivamus consectetuer pede in nisl. Mauris cursus pretium mauris. Suspendisse condimentum mi ac tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec sed enim. Ut vel ipsum. Cras consequat velit et justo. Donec mollis, mi at tincidunt vehicula, nisl mi luctus risus, quis scelerisque arcu nibh ac nisi. Sed risus. Curabitur urna. Aliquam vitae nisl. Quisque imperdiet semper justo. Pellentesque nonummy pretium tellus. -
    - - \ No newline at end of file diff --git a/Website/static/highslide/examples/includes/include-short.htm b/Website/static/highslide/examples/includes/include-short.htm deleted file mode 100644 index da3d44f..0000000 --- a/Website/static/highslide/examples/includes/include-short.htm +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Included content - - - - -

    Full HTML content

    -

    -Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam dapibus leo quis nisl. -In lectus. Vivamus consectetuer pede in nisl. Mauris cursus pretium mauris. Suspendisse -condimentum mi ac tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada -fames ac turpis egestas. Donec sed enim. Ut vel ipsum. Cras consequat velit et justo. Donec -mollis, mi at tincidunt vehicula, nisl mi luctus risus, quis scelerisque arcu nibh ac nisi. - Sed risus. Curabitur urna. Aliquam vitae nisl. Quisque imperdiet semper justo. Pellentesque - nonummy pretium tellus. -

    -

    -Cras interdum accumsan diam. Nam neque neque, feugiat sed, blandit quis, feugiat et, magna. -Etiam ornare cursus eros. Duis gravida. Integer bibendum. Nulla nonummy ante eu est. Mauris -dapibus quam eget orci. Praesent nec metus eget mauris sagittis consequat. Cras rutrum. Etiam -dictum. Cras placerat orci non quam. Suspendisse nec nulla sit amet enim ultricies malesuada. -Nullam lobortis. Ut gravida. Morbi hendrerit. Integer pretium euismod mauris. Duis condimentum -sagittis arcu. Integer est. Nulla ante ligula, auctor sit amet, vulputate in, aliquet in, sem. -

    - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/inline.html b/Website/static/highslide/examples/inline.html deleted file mode 100644 index 45092d8..0000000 --- a/Website/static/highslide/examples/inline.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - -
    - - - Open HTML-content - -
    -

    Lorem ipsum

    - Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam dapibus leo quis nisl. In lectus. Vivamus consectetuer pede in nisl. Mauris cursus pretium mauris. Suspendisse condimentum mi ac tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec sed enim. Ut vel ipsum. Cras consequat velit et justo. Donec mollis, mi at tincidunt vehicula, nisl mi luctus risus, quis scelerisque arcu nibh ac nisi. Sed risus. Curabitur urna. Aliquam vitae nisl. Quisque imperdiet semper justo. Pellentesque nonummy pretium tellus. -
    - - - - -
    - - \ No newline at end of file diff --git a/Website/static/highslide/examples/mini-galleries.html b/Website/static/highslide/examples/mini-galleries.html deleted file mode 100644 index 752706a..0000000 --- a/Website/static/highslide/examples/mini-galleries.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/mini-gallery.html b/Website/static/highslide/examples/mini-gallery.html deleted file mode 100644 index 3fc32c4..0000000 --- a/Website/static/highslide/examples/mini-gallery.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/examples/no-border.html b/Website/static/highslide/examples/no-border.html deleted file mode 100644 index 58f192f..0000000 --- a/Website/static/highslide/examples/no-border.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - -Highslide JS - - - - - - - - - - - - - - - - -
    - - - Highslide JS - - - -
    - This caption can be styled using CSS. -
    - -
    - - \ No newline at end of file diff --git a/Website/static/highslide/examples/no-outline.html b/Website/static/highslide/examples/no-outline.html deleted file mode 100644 index 2ca595a..0000000 --- a/Website/static/highslide/examples/no-outline.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - -
    - - - Highslide JS - - - -
    - This caption can be styled using CSS. -
    - - -
    - - \ No newline at end of file diff --git a/Website/static/highslide/examples/outer-glow.html b/Website/static/highslide/examples/outer-glow.html deleted file mode 100644 index ee69062..0000000 --- a/Website/static/highslide/examples/outer-glow.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - -
    - - - Highslide JS - - - -
    - This caption can be styled using CSS. -
    - - -
    - - \ No newline at end of file diff --git a/Website/static/highslide/examples/white-10px.html b/Website/static/highslide/examples/white-10px.html deleted file mode 100644 index d0f716d..0000000 --- a/Website/static/highslide/examples/white-10px.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - -Highslide JS - - - - - - - - - - - - - - - -
    - - - Highslide JS - - - -
    - This caption can be styled using CSS. -
    - -
    - - \ No newline at end of file diff --git a/Website/static/highslide/examples/white-rounded-outline.html b/Website/static/highslide/examples/white-rounded-outline.html deleted file mode 100644 index 7a23ab8..0000000 --- a/Website/static/highslide/examples/white-rounded-outline.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - -
    - - - Highslide JS - - - -
    - This caption can be styled using CSS. -
    - -
    - - \ No newline at end of file diff --git a/Website/static/highslide/examples/youtube.html b/Website/static/highslide/examples/youtube.html deleted file mode 100644 index 6b606f8..0000000 --- a/Website/static/highslide/examples/youtube.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - -Highslide JS - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Website/static/highslide/highslide/graphics/close.png b/Website/static/highslide/highslide/graphics/close.png deleted file mode 100644 index 4de4396..0000000 Binary files a/Website/static/highslide/highslide/graphics/close.png and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/closeX.png b/Website/static/highslide/highslide/graphics/closeX.png deleted file mode 100644 index cf5d018..0000000 Binary files a/Website/static/highslide/highslide/graphics/closeX.png and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/controlbar-black-border.gif b/Website/static/highslide/highslide/graphics/controlbar-black-border.gif deleted file mode 100644 index e2403fe..0000000 Binary files a/Website/static/highslide/highslide/graphics/controlbar-black-border.gif and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/controlbar-text-buttons.png b/Website/static/highslide/highslide/graphics/controlbar-text-buttons.png deleted file mode 100644 index d2f72e0..0000000 Binary files a/Website/static/highslide/highslide/graphics/controlbar-text-buttons.png and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/controlbar-white-small.gif b/Website/static/highslide/highslide/graphics/controlbar-white-small.gif deleted file mode 100644 index 462fce7..0000000 Binary files a/Website/static/highslide/highslide/graphics/controlbar-white-small.gif and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/controlbar-white.gif b/Website/static/highslide/highslide/graphics/controlbar-white.gif deleted file mode 100644 index 1f143f5..0000000 Binary files a/Website/static/highslide/highslide/graphics/controlbar-white.gif and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/controlbar2.gif b/Website/static/highslide/highslide/graphics/controlbar2.gif deleted file mode 100644 index 39ad652..0000000 Binary files a/Website/static/highslide/highslide/graphics/controlbar2.gif and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/controlbar3.gif b/Website/static/highslide/highslide/graphics/controlbar3.gif deleted file mode 100644 index 3eebb81..0000000 Binary files a/Website/static/highslide/highslide/graphics/controlbar3.gif and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/controlbar4-hover.gif b/Website/static/highslide/highslide/graphics/controlbar4-hover.gif deleted file mode 100644 index ca08b59..0000000 Binary files a/Website/static/highslide/highslide/graphics/controlbar4-hover.gif and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/controlbar4.gif b/Website/static/highslide/highslide/graphics/controlbar4.gif deleted file mode 100644 index 7a3ad34..0000000 Binary files a/Website/static/highslide/highslide/graphics/controlbar4.gif and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/fullexpand.gif b/Website/static/highslide/highslide/graphics/fullexpand.gif deleted file mode 100644 index 26d9ed0..0000000 Binary files a/Website/static/highslide/highslide/graphics/fullexpand.gif and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/geckodimmer.png b/Website/static/highslide/highslide/graphics/geckodimmer.png deleted file mode 100644 index 309bb27..0000000 Binary files a/Website/static/highslide/highslide/graphics/geckodimmer.png and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/icon.gif b/Website/static/highslide/highslide/graphics/icon.gif deleted file mode 100644 index b74a073..0000000 Binary files a/Website/static/highslide/highslide/graphics/icon.gif and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/loader.gif b/Website/static/highslide/highslide/graphics/loader.gif deleted file mode 100644 index 0b31f6f..0000000 Binary files a/Website/static/highslide/highslide/graphics/loader.gif and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/loader.white.gif b/Website/static/highslide/highslide/graphics/loader.white.gif deleted file mode 100644 index f2a1bc0..0000000 Binary files a/Website/static/highslide/highslide/graphics/loader.white.gif and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/outlines/Outlines.psd b/Website/static/highslide/highslide/graphics/outlines/Outlines.psd deleted file mode 100644 index 5405651..0000000 Binary files a/Website/static/highslide/highslide/graphics/outlines/Outlines.psd and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/outlines/beveled.png b/Website/static/highslide/highslide/graphics/outlines/beveled.png deleted file mode 100644 index fc428f4..0000000 Binary files a/Website/static/highslide/highslide/graphics/outlines/beveled.png and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/outlines/drop-shadow.png b/Website/static/highslide/highslide/graphics/outlines/drop-shadow.png deleted file mode 100644 index 0186c2e..0000000 Binary files a/Website/static/highslide/highslide/graphics/outlines/drop-shadow.png and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/outlines/glossy-dark.png b/Website/static/highslide/highslide/graphics/outlines/glossy-dark.png deleted file mode 100644 index 3c64c0d..0000000 Binary files a/Website/static/highslide/highslide/graphics/outlines/glossy-dark.png and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/outlines/outer-glow.png b/Website/static/highslide/highslide/graphics/outlines/outer-glow.png deleted file mode 100644 index 288d43f..0000000 Binary files a/Website/static/highslide/highslide/graphics/outlines/outer-glow.png and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/outlines/rounded-black.png b/Website/static/highslide/highslide/graphics/outlines/rounded-black.png deleted file mode 100644 index a77e65d..0000000 Binary files a/Website/static/highslide/highslide/graphics/outlines/rounded-black.png and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/outlines/rounded-white.png b/Website/static/highslide/highslide/graphics/outlines/rounded-white.png deleted file mode 100644 index 0d4b817..0000000 Binary files a/Website/static/highslide/highslide/graphics/outlines/rounded-white.png and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/resize.gif b/Website/static/highslide/highslide/graphics/resize.gif deleted file mode 100644 index 9100de7..0000000 Binary files a/Website/static/highslide/highslide/graphics/resize.gif and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/scrollarrows.png b/Website/static/highslide/highslide/graphics/scrollarrows.png deleted file mode 100644 index b3d5575..0000000 Binary files a/Website/static/highslide/highslide/graphics/scrollarrows.png and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/zoomin.cur b/Website/static/highslide/highslide/graphics/zoomin.cur deleted file mode 100644 index cb79124..0000000 Binary files a/Website/static/highslide/highslide/graphics/zoomin.cur and /dev/null differ diff --git a/Website/static/highslide/highslide/graphics/zoomout.cur b/Website/static/highslide/highslide/graphics/zoomout.cur deleted file mode 100644 index acf6199..0000000 Binary files a/Website/static/highslide/highslide/graphics/zoomout.cur and /dev/null differ diff --git a/Website/static/highslide/highslide/highslide-full.js b/Website/static/highslide/highslide/highslide-full.js deleted file mode 100644 index c1a4967..0000000 --- a/Website/static/highslide/highslide/highslide-full.js +++ /dev/null @@ -1,3320 +0,0 @@ -/** - * Name: Highslide JS - * Version: 4.1.13 (2011-10-06) - * Config: default +events +unobtrusive +imagemap +slideshow +positioning +transitions +viewport +thumbstrip +inline +ajax +iframe +flash - * Author: Torstein Hønsi - * Support: www.highslide.com/support - * License: www.highslide.com/#license - */ -if (!hs) { var hs = { -// Language strings -lang : { - cssDirection: 'ltr', - loadingText : 'Loading...', - loadingTitle : 'Click to cancel', - focusTitle : 'Click to bring to front', - fullExpandTitle : 'Expand to actual size (f)', - creditsText : 'Powered by Highslide JS', - creditsTitle : 'Go to the Highslide JS homepage', - previousText : 'Previous', - nextText : 'Next', - moveText : 'Move', - closeText : 'Close', - closeTitle : 'Close (esc)', - resizeTitle : 'Resize', - playText : 'Play', - playTitle : 'Play slideshow (spacebar)', - pauseText : 'Pause', - pauseTitle : 'Pause slideshow (spacebar)', - previousTitle : 'Previous (arrow left)', - nextTitle : 'Next (arrow right)', - moveTitle : 'Move', - fullExpandText : '1:1', - number: 'Image %1 of %2', - restoreTitle : 'Click to close image, click and drag to move. Use arrow keys for next and previous.' -}, -// See http://highslide.com/ref for examples of settings -graphicsDir : 'highslide/graphics/', -expandCursor : 'zoomin.cur', // null disables -restoreCursor : 'zoomout.cur', // null disables -expandDuration : 250, // milliseconds -restoreDuration : 250, -marginLeft : 15, -marginRight : 15, -marginTop : 15, -marginBottom : 15, -zIndexCounter : 1001, // adjust to other absolutely positioned elements -loadingOpacity : 0.75, -allowMultipleInstances: true, -numberOfImagesToPreload : 5, -outlineWhileAnimating : 2, // 0 = never, 1 = always, 2 = HTML only -outlineStartOffset : 3, // ends at 10 -padToMinWidth : false, // pad the popup width to make room for wide caption -fullExpandPosition : 'bottom right', -fullExpandOpacity : 1, -showCredits : true, // you can set this to false if you want -creditsHref : 'http://highslide.com/', -creditsTarget : '_self', -enableKeyListener : true, -openerTagNames : ['a', 'area'], // Add more to allow slideshow indexing -transitions : [], -transitionDuration: 250, -dimmingOpacity: 0, // Lightbox style dimming background -dimmingDuration: 50, // 0 for instant dimming - -allowWidthReduction : false, -allowHeightReduction : true, -preserveContent : true, // Preserve changes made to the content and position of HTML popups. -objectLoadTime : 'before', // Load iframes 'before' or 'after' expansion. -cacheAjax : true, // Cache ajax popups for instant display. Can be overridden for each popup. -anchor : 'auto', // where the image expands from -align : 'auto', // position in the client (overrides anchor) -targetX: null, // the id of a target element -targetY: null, -dragByHeading: true, -minWidth: 200, -minHeight: 200, -allowSizeReduction: true, // allow the image to reduce to fit client size. If false, this overrides minWidth and minHeight -outlineType : 'drop-shadow', // set null to disable outlines -skin : { - controls: - '
    ' - , - contentWrapper: - '
    '+ - '
    '+ - '' -}, -// END OF YOUR SETTINGS - - -// declare internal properties -preloadTheseImages : [], -continuePreloading: true, -expanders : [], -overrides : [ - 'allowSizeReduction', - 'useBox', - 'anchor', - 'align', - 'targetX', - 'targetY', - 'outlineType', - 'outlineWhileAnimating', - 'captionId', - 'captionText', - 'captionEval', - 'captionOverlay', - 'headingId', - 'headingText', - 'headingEval', - 'headingOverlay', - 'creditsPosition', - 'dragByHeading', - 'autoplay', - 'numberPosition', - 'transitions', - 'dimmingOpacity', - - 'width', - 'height', - - 'contentId', - 'allowWidthReduction', - 'allowHeightReduction', - 'preserveContent', - 'maincontentId', - 'maincontentText', - 'maincontentEval', - 'objectType', - 'cacheAjax', - 'objectWidth', - 'objectHeight', - 'objectLoadTime', - 'swfOptions', - 'wrapperClassName', - 'minWidth', - 'minHeight', - 'maxWidth', - 'maxHeight', - 'pageOrigin', - 'slideshowGroup', - 'easing', - 'easingClose', - 'fadeInOut', - 'src' -], -overlays : [], -idCounter : 0, -oPos : { - x: ['leftpanel', 'left', 'center', 'right', 'rightpanel'], - y: ['above', 'top', 'middle', 'bottom', 'below'] -}, -mouse: {}, -headingOverlay: {}, -captionOverlay: {}, -swfOptions: { flashvars: {}, params: {}, attributes: {} }, -timers : [], - -slideshows : [], - -pendingOutlines : {}, -sleeping : [], -preloadTheseAjax : [], -cacheBindings : [], -cachedGets : {}, -clones : {}, -onReady: [], -uaVersion: /Trident\/4\.0/.test(navigator.userAgent) ? 8 : - parseFloat((navigator.userAgent.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1]), -ie : (document.all && !window.opera), -//ie : navigator && /MSIE [678]/.test(navigator.userAgent), // ie9 compliant? -safari : /Safari/.test(navigator.userAgent), -geckoMac : /Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent), - -$ : function (id) { - if (id) return document.getElementById(id); -}, - -push : function (arr, val) { - arr[arr.length] = val; -}, - -createElement : function (tag, attribs, styles, parent, nopad) { - var el = document.createElement(tag); - if (attribs) hs.extend(el, attribs); - if (nopad) hs.setStyles(el, {padding: 0, border: 'none', margin: 0}); - if (styles) hs.setStyles(el, styles); - if (parent) parent.appendChild(el); - return el; -}, - -extend : function (el, attribs) { - for (var x in attribs) el[x] = attribs[x]; - return el; -}, - -setStyles : function (el, styles) { - for (var x in styles) { - if (hs.ieLt9 && x == 'opacity') { - if (styles[x] > 0.99) el.style.removeAttribute('filter'); - else el.style.filter = 'alpha(opacity='+ (styles[x] * 100) +')'; - } - else el.style[x] = styles[x]; - } -}, -animate: function(el, prop, opt) { - var start, - end, - unit; - if (typeof opt != 'object' || opt === null) { - var args = arguments; - opt = { - duration: args[2], - easing: args[3], - complete: args[4] - }; - } - if (typeof opt.duration != 'number') opt.duration = 250; - opt.easing = Math[opt.easing] || Math.easeInQuad; - opt.curAnim = hs.extend({}, prop); - for (var name in prop) { - var e = new hs.fx(el, opt , name ); - - start = parseFloat(hs.css(el, name)) || 0; - end = parseFloat(prop[name]); - unit = name != 'opacity' ? 'px' : ''; - - e.custom( start, end, unit ); - } -}, -css: function(el, prop) { - if (el.style[prop]) { - return el.style[prop]; - } else if (document.defaultView) { - return document.defaultView.getComputedStyle(el, null).getPropertyValue(prop); - - } else { - if (prop == 'opacity') prop = 'filter'; - var val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b){ return b.toUpperCase(); })]; - if (prop == 'filter') - val = val.replace(/alpha\(opacity=([0-9]+)\)/, - function (a, b) { return b / 100 }); - return val === '' ? 1 : val; - } -}, - -getPageSize : function () { - var d = document, w = window, iebody = d.compatMode && d.compatMode != 'BackCompat' - ? d.documentElement : d.body, - ieLt9 = hs.ie && (hs.uaVersion < 9 || typeof pageXOffset == 'undefined'); - - var width = ieLt9 ? iebody.clientWidth : - (d.documentElement.clientWidth || self.innerWidth), - height = ieLt9 ? iebody.clientHeight : self.innerHeight; - hs.page = { - width: width, - height: height, - scrollLeft: ieLt9 ? iebody.scrollLeft : pageXOffset, - scrollTop: ieLt9 ? iebody.scrollTop : pageYOffset - }; - return hs.page; -}, - -getPosition : function(el) { - if (/area/i.test(el.tagName)) { - var imgs = document.getElementsByTagName('img'); - for (var i = 0; i < imgs.length; i++) { - var u = imgs[i].useMap; - if (u && u.replace(/^.*?#/, '') == el.parentNode.name) { - el = imgs[i]; - break; - } - } - } - var p = { x: el.offsetLeft, y: el.offsetTop }; - while (el.offsetParent) { - el = el.offsetParent; - p.x += el.offsetLeft; - p.y += el.offsetTop; - if (el != document.body && el != document.documentElement) { - p.x -= el.scrollLeft; - p.y -= el.scrollTop; - } - } - return p; -}, - -expand : function(a, params, custom, type) { - if (!a) a = hs.createElement('a', null, { display: 'none' }, hs.container); - if (typeof a.getParams == 'function') return params; - if (type == 'html') { - for (var i = 0; i < hs.sleeping.length; i++) { - if (hs.sleeping[i] && hs.sleeping[i].a == a) { - hs.sleeping[i].awake(); - hs.sleeping[i] = null; - return false; - } - } - hs.hasHtmlExpanders = true; - } - try { - new hs.Expander(a, params, custom, type); - return false; - } catch (e) { return true; } -}, - -htmlExpand : function(a, params, custom) { - return hs.expand(a, params, custom, 'html'); -}, - -getSelfRendered : function() { - return hs.createElement('div', { - className: 'highslide-html-content', - innerHTML: hs.replaceLang(hs.skin.contentWrapper) - }); -}, -getElementByClass : function (el, tagName, className) { - var els = el.getElementsByTagName(tagName); - for (var i = 0; i < els.length; i++) { - if ((new RegExp(className)).test(els[i].className)) { - return els[i]; - } - } - return null; -}, -replaceLang : function(s) { - s = s.replace(/\s/g, ' '); - var re = /{hs\.lang\.([^}]+)\}/g, - matches = s.match(re), - lang; - if (matches) for (var i = 0; i < matches.length; i++) { - lang = matches[i].replace(re, "$1"); - if (typeof hs.lang[lang] != 'undefined') s = s.replace(matches[i], hs.lang[lang]); - } - return s; -}, - - -setClickEvents : function () { - var els = document.getElementsByTagName('a'); - for (var i = 0; i < els.length; i++) { - var type = hs.isUnobtrusiveAnchor(els[i]); - if (type && !els[i].hsHasSetClick) { - (function(){ - var t = type; - if (hs.fireEvent(hs, 'onSetClickEvent', { element: els[i], type: t })) { - els[i].onclick =(type == 'image') ?function() { return hs.expand(this) }: - function() { return hs.htmlExpand(this, { objectType: t } );}; - } - })(); - els[i].hsHasSetClick = true; - } - } - hs.getAnchors(); -}, -isUnobtrusiveAnchor: function(el) { - if (el.rel == 'highslide') return 'image'; - else if (el.rel == 'highslide-ajax') return 'ajax'; - else if (el.rel == 'highslide-iframe') return 'iframe'; - else if (el.rel == 'highslide-swf') return 'swf'; -}, - -getCacheBinding : function (a) { - for (var i = 0; i < hs.cacheBindings.length; i++) { - if (hs.cacheBindings[i][0] == a) { - var c = hs.cacheBindings[i][1]; - hs.cacheBindings[i][1] = c.cloneNode(1); - return c; - } - } - return null; -}, - -preloadAjax : function (e) { - var arr = hs.getAnchors(); - for (var i = 0; i < arr.htmls.length; i++) { - var a = arr.htmls[i]; - if (hs.getParam(a, 'objectType') == 'ajax' && hs.getParam(a, 'cacheAjax')) - hs.push(hs.preloadTheseAjax, a); - } - - hs.preloadAjaxElement(0); -}, - -preloadAjaxElement : function (i) { - if (!hs.preloadTheseAjax[i]) return; - var a = hs.preloadTheseAjax[i]; - var cache = hs.getNode(hs.getParam(a, 'contentId')); - if (!cache) cache = hs.getSelfRendered(); - var ajax = new hs.Ajax(a, cache, 1); - ajax.onError = function () { }; - ajax.onLoad = function () { - hs.push(hs.cacheBindings, [a, cache]); - hs.preloadAjaxElement(i + 1); - }; - ajax.run(); -}, - -focusTopmost : function() { - var topZ = 0, - topmostKey = -1, - expanders = hs.expanders, - exp, - zIndex; - for (var i = 0; i < expanders.length; i++) { - exp = expanders[i]; - if (exp) { - zIndex = exp.wrapper.style.zIndex; - if (zIndex && zIndex > topZ) { - topZ = zIndex; - topmostKey = i; - } - } - } - if (topmostKey == -1) hs.focusKey = -1; - else expanders[topmostKey].focus(); -}, - -getParam : function (a, param) { - a.getParams = a.onclick; - var p = a.getParams ? a.getParams() : null; - a.getParams = null; - - return (p && typeof p[param] != 'undefined') ? p[param] : - (typeof hs[param] != 'undefined' ? hs[param] : null); -}, - -getSrc : function (a) { - var src = hs.getParam(a, 'src'); - if (src) return src; - return a.href; -}, - -getNode : function (id) { - var node = hs.$(id), clone = hs.clones[id], a = {}; - if (!node && !clone) return null; - if (!clone) { - clone = node.cloneNode(true); - clone.id = ''; - hs.clones[id] = clone; - return node; - } else { - return clone.cloneNode(true); - } -}, - -discardElement : function(d) { - if (d) hs.garbageBin.appendChild(d); - hs.garbageBin.innerHTML = ''; -}, -dim : function(exp) { - if (!hs.dimmer) { - isNew = true; - hs.dimmer = hs.createElement ('div', { - className: 'highslide-dimming highslide-viewport-size', - owner: '', - onclick: function() { - if (hs.fireEvent(hs, 'onDimmerClick')) - - hs.close(); - } - }, { - visibility: 'visible', - opacity: 0 - }, hs.container, true); - - if (/(Android|iPad|iPhone|iPod)/.test(navigator.userAgent)) { - var body = document.body; - function pixDimmerSize() { - hs.setStyles(hs.dimmer, { - width: body.scrollWidth +'px', - height: body.scrollHeight +'px' - }); - } - pixDimmerSize(); - hs.addEventListener(window, 'resize', pixDimmerSize); - } - } - hs.dimmer.style.display = ''; - - var isNew = hs.dimmer.owner == ''; - hs.dimmer.owner += '|'+ exp.key; - - if (isNew) { - if (hs.geckoMac && hs.dimmingGeckoFix) - hs.setStyles(hs.dimmer, { - background: 'url('+ hs.graphicsDir + 'geckodimmer.png)', - opacity: 1 - }); - else - hs.animate(hs.dimmer, { opacity: exp.dimmingOpacity }, hs.dimmingDuration); - } -}, -undim : function(key) { - if (!hs.dimmer) return; - if (typeof key != 'undefined') hs.dimmer.owner = hs.dimmer.owner.replace('|'+ key, ''); - - if ( - (typeof key != 'undefined' && hs.dimmer.owner != '') - || (hs.upcoming && hs.getParam(hs.upcoming, 'dimmingOpacity')) - ) return; - - if (hs.geckoMac && hs.dimmingGeckoFix) hs.dimmer.style.display = 'none'; - else hs.animate(hs.dimmer, { opacity: 0 }, hs.dimmingDuration, null, function() { - hs.dimmer.style.display = 'none'; - }); -}, -transit : function (adj, exp) { - var last = exp || hs.getExpander(); - exp = last; - if (hs.upcoming) return false; - else hs.last = last; - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - try { - hs.upcoming = adj; - adj.onclick(); - } catch (e){ - hs.last = hs.upcoming = null; - } - try { - if (!adj || exp.transitions[1] != 'crossfade') - exp.close(); - } catch (e) {} - return false; -}, - -previousOrNext : function (el, op) { - var exp = hs.getExpander(el); - if (exp) return hs.transit(exp.getAdjacentAnchor(op), exp); - else return false; -}, - -previous : function (el) { - return hs.previousOrNext(el, -1); -}, - -next : function (el) { - return hs.previousOrNext(el, 1); -}, - -keyHandler : function(e) { - if (!e) e = window.event; - if (!e.target) e.target = e.srcElement; // ie - if (typeof e.target.form != 'undefined') return true; // form element has focus - if (!hs.fireEvent(hs, 'onKeyDown', e)) return true; - var exp = hs.getExpander(); - - var op = null; - switch (e.keyCode) { - case 70: // f - if (exp) exp.doFullExpand(); - return true; - case 32: // Space - op = 2; - break; - case 34: // Page Down - case 39: // Arrow right - case 40: // Arrow down - op = 1; - break; - case 8: // Backspace - case 33: // Page Up - case 37: // Arrow left - case 38: // Arrow up - op = -1; - break; - case 27: // Escape - case 13: // Enter - op = 0; - } - if (op !== null) {if (op != 2)hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - if (!hs.enableKeyListener) return true; - - if (e.preventDefault) e.preventDefault(); - else e.returnValue = false; - if (exp) { - if (op == 0) { - exp.close(); - } else if (op == 2) { - if (exp.slideshow) exp.slideshow.hitSpace(); - } else { - if (exp.slideshow) exp.slideshow.pause(); - hs.previousOrNext(exp.key, op); - } - return false; - } - } - return true; -}, - - -registerOverlay : function (overlay) { - hs.push(hs.overlays, hs.extend(overlay, { hsId: 'hsId'+ hs.idCounter++ } )); -}, - - -addSlideshow : function (options) { - var sg = options.slideshowGroup; - if (typeof sg == 'object') { - for (var i = 0; i < sg.length; i++) { - var o = {}; - for (var x in options) o[x] = options[x]; - o.slideshowGroup = sg[i]; - hs.push(hs.slideshows, o); - } - } else { - hs.push(hs.slideshows, options); - } -}, - -getWrapperKey : function (element, expOnly) { - var el, re = /^highslide-wrapper-([0-9]+)$/; - // 1. look in open expanders - el = element; - while (el.parentNode) { - if (el.hsKey !== undefined) return el.hsKey; - if (el.id && re.test(el.id)) return el.id.replace(re, "$1"); - el = el.parentNode; - } - // 2. look in thumbnail - if (!expOnly) { - el = element; - while (el.parentNode) { - if (el.tagName && hs.isHsAnchor(el)) { - for (var key = 0; key < hs.expanders.length; key++) { - var exp = hs.expanders[key]; - if (exp && exp.a == el) return key; - } - } - el = el.parentNode; - } - } - return null; -}, - -getExpander : function (el, expOnly) { - if (typeof el == 'undefined') return hs.expanders[hs.focusKey] || null; - if (typeof el == 'number') return hs.expanders[el] || null; - if (typeof el == 'string') el = hs.$(el); - return hs.expanders[hs.getWrapperKey(el, expOnly)] || null; -}, - -isHsAnchor : function (a) { - return (a.onclick && a.onclick.toString().replace(/\s/g, ' ').match(/hs.(htmlE|e)xpand/)); -}, - -reOrder : function () { - for (var i = 0; i < hs.expanders.length; i++) - if (hs.expanders[i] && hs.expanders[i].isExpanded) hs.focusTopmost(); -}, -fireEvent : function (obj, evt, args) { - return obj && obj[evt] ? (obj[evt](obj, args) !== false) : true; -}, - -mouseClickHandler : function(e) -{ - if (!e) e = window.event; - if (e.button > 1) return true; - if (!e.target) e.target = e.srcElement; - - var el = e.target; - while (el.parentNode - && !(/highslide-(image|move|html|resize)/.test(el.className))) - { - el = el.parentNode; - } - var exp = hs.getExpander(el); - if (exp && (exp.isClosing || !exp.isExpanded)) return true; - - if (exp && e.type == 'mousedown') { - if (e.target.form) return true; - var match = el.className.match(/highslide-(image|move|resize)/); - if (match) { - hs.dragArgs = { - exp: exp , - type: match[1], - left: exp.x.pos, - width: exp.x.size, - top: exp.y.pos, - height: exp.y.size, - clickX: e.clientX, - clickY: e.clientY - }; - - - hs.addEventListener(document, 'mousemove', hs.dragHandler); - if (e.preventDefault) e.preventDefault(); // FF - - if (/highslide-(image|html)-blur/.test(exp.content.className)) { - exp.focus(); - hs.hasFocused = true; - } - return false; - } - else if (/highslide-html/.test(el.className) && hs.focusKey != exp.key) { - exp.focus(); - exp.doShowHide('hidden'); - } - } else if (e.type == 'mouseup') { - - hs.removeEventListener(document, 'mousemove', hs.dragHandler); - - if (hs.dragArgs) { - if (hs.styleRestoreCursor && hs.dragArgs.type == 'image') - hs.dragArgs.exp.content.style.cursor = hs.styleRestoreCursor; - var hasDragged = hs.dragArgs.hasDragged; - - if (!hasDragged &&!hs.hasFocused && !/(move|resize)/.test(hs.dragArgs.type)) { - if (hs.fireEvent(exp, 'onImageClick')) - exp.close(); - } - else if (hasDragged || (!hasDragged && hs.hasHtmlExpanders)) { - hs.dragArgs.exp.doShowHide('hidden'); - } - - if (hs.dragArgs.exp.releaseMask) - hs.dragArgs.exp.releaseMask.style.display = 'none'; - - if (hasDragged) hs.fireEvent(hs.dragArgs.exp, 'onDrop', hs.dragArgs); - hs.hasFocused = false; - hs.dragArgs = null; - - } else if (/highslide-image-blur/.test(el.className)) { - el.style.cursor = hs.styleRestoreCursor; - } - } - return false; -}, - -dragHandler : function(e) -{ - if (!hs.dragArgs) return true; - if (!e) e = window.event; - var a = hs.dragArgs, exp = a.exp; - if (exp.iframe) { - if (!exp.releaseMask) exp.releaseMask = hs.createElement('div', null, - { position: 'absolute', width: exp.x.size+'px', height: exp.y.size+'px', - left: exp.x.cb+'px', top: exp.y.cb+'px', zIndex: 4, background: (hs.ieLt9 ? 'white' : 'none'), - opacity: 0.01 }, - exp.wrapper, true); - if (exp.releaseMask.style.display == 'none') - exp.releaseMask.style.display = ''; - } - - a.dX = e.clientX - a.clickX; - a.dY = e.clientY - a.clickY; - - var distance = Math.sqrt(Math.pow(a.dX, 2) + Math.pow(a.dY, 2)); - if (!a.hasDragged) a.hasDragged = (a.type != 'image' && distance > 0) - || (distance > (hs.dragSensitivity || 5)); - - if (a.hasDragged && e.clientX > 5 && e.clientY > 5) { - if (!hs.fireEvent(exp, 'onDrag', a)) return false; - - if (a.type == 'resize') exp.resize(a); - else { - exp.moveTo(a.left + a.dX, a.top + a.dY); - if (a.type == 'image') exp.content.style.cursor = 'move'; - } - } - return false; -}, - -wrapperMouseHandler : function (e) { - try { - if (!e) e = window.event; - var over = /mouseover/i.test(e.type); - if (!e.target) e.target = e.srcElement; // ie - if (!e.relatedTarget) e.relatedTarget = - over ? e.fromElement : e.toElement; // ie - var exp = hs.getExpander(e.target); - if (!exp.isExpanded) return; - if (!exp || !e.relatedTarget || hs.getExpander(e.relatedTarget, true) == exp - || hs.dragArgs) return; - hs.fireEvent(exp, over ? 'onMouseOver' : 'onMouseOut', e); - for (var i = 0; i < exp.overlays.length; i++) (function() { - var o = hs.$('hsId'+ exp.overlays[i]); - if (o && o.hideOnMouseOut) { - if (over) hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: over ? o.opacity : 0 }, o.dur); - } - })(); - } catch (e) {} -}, -addEventListener : function (el, event, func) { - if (el == document && event == 'ready') { - hs.push(hs.onReady, func); - } - try { - el.addEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - el.attachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = func; - } - } -}, - -removeEventListener : function (el, event, func) { - try { - el.removeEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = null; - } - } -}, - -preloadFullImage : function (i) { - if (hs.continuePreloading && hs.preloadTheseImages[i] && hs.preloadTheseImages[i] != 'undefined') { - var img = document.createElement('img'); - img.onload = function() { - img = null; - hs.preloadFullImage(i + 1); - }; - img.src = hs.preloadTheseImages[i]; - } -}, -preloadImages : function (number) { - if (number && typeof number != 'object') hs.numberOfImagesToPreload = number; - - var arr = hs.getAnchors(); - for (var i = 0; i < arr.images.length && i < hs.numberOfImagesToPreload; i++) { - hs.push(hs.preloadTheseImages, hs.getSrc(arr.images[i])); - } - - // preload outlines - if (hs.outlineType) new hs.Outline(hs.outlineType, function () { hs.preloadFullImage(0)} ); - else - - hs.preloadFullImage(0); - - // preload cursor - if (hs.restoreCursor) var cur = hs.createElement('img', { src: hs.graphicsDir + hs.restoreCursor }); -}, - - -init : function () { - if (!hs.container) { - - hs.ieLt7 = hs.ie && hs.uaVersion < 7; - hs.ieLt9 = hs.ie && hs.uaVersion < 9; - - hs.getPageSize(); - hs.ie6SSL = hs.ieLt7 && location.protocol == 'https:'; - for (var x in hs.langDefaults) { - if (typeof hs[x] != 'undefined') hs.lang[x] = hs[x]; - else if (typeof hs.lang[x] == 'undefined' && typeof hs.langDefaults[x] != 'undefined') - hs.lang[x] = hs.langDefaults[x]; - } - - hs.container = hs.createElement('div', { - className: 'highslide-container' - }, { - position: 'absolute', - left: 0, - top: 0, - width: '100%', - zIndex: hs.zIndexCounter, - direction: 'ltr' - }, - document.body, - true - ); - hs.loading = hs.createElement('a', { - className: 'highslide-loading', - title: hs.lang.loadingTitle, - innerHTML: hs.lang.loadingText, - href: 'javascript:;' - }, { - position: 'absolute', - top: '-9999px', - opacity: hs.loadingOpacity, - zIndex: 1 - }, hs.container - ); - hs.garbageBin = hs.createElement('div', null, { display: 'none' }, hs.container); - hs.viewport = hs.createElement('div', { - className: 'highslide-viewport highslide-viewport-size' - }, { - visibility: (hs.safari && hs.uaVersion < 525) ? 'visible' : 'hidden' - }, hs.container, 1 - ); - hs.clearing = hs.createElement('div', null, - { clear: 'both', paddingTop: '1px' }, null, true); - - // http://www.robertpenner.com/easing/ - Math.linearTween = function (t, b, c, d) { - return c*t/d + b; - }; - Math.easeInQuad = function (t, b, c, d) { - return c*(t/=d)*t + b; - }; - Math.easeOutQuad = function (t, b, c, d) { - return -c *(t/=d)*(t-2) + b; - }; - - hs.hideSelects = hs.ieLt7; - hs.hideIframes = ((window.opera && hs.uaVersion < 9) || navigator.vendor == 'KDE' - || (hs.ieLt7 && hs.uaVersion < 5.5)); - hs.fireEvent(this, 'onActivate'); - } -}, -ready : function() { - if (hs.isReady) return; - hs.isReady = true; - for (var i = 0; i < hs.onReady.length; i++) hs.onReady[i](); -}, - -updateAnchors : function() { - var el, els, all = [], images = [], htmls = [],groups = {}, re; - - for (var i = 0; i < hs.openerTagNames.length; i++) { - els = document.getElementsByTagName(hs.openerTagNames[i]); - for (var j = 0; j < els.length; j++) { - el = els[j]; - re = hs.isHsAnchor(el); - if (re) { - hs.push(all, el); - if (re[0] == 'hs.expand') hs.push(images, el); - else if (re[0] == 'hs.htmlExpand') hs.push(htmls, el); - var g = hs.getParam(el, 'slideshowGroup') || 'none'; - if (!groups[g]) groups[g] = []; - hs.push(groups[g], el); - } - } - } - hs.anchors = { all: all, groups: groups, images: images, htmls: htmls }; - return hs.anchors; - -}, - -getAnchors : function() { - return hs.anchors || hs.updateAnchors(); -}, - - -close : function(el) { - var exp = hs.getExpander(el); - if (exp) exp.close(); - return false; -} -}; // end hs object -hs.fx = function( elem, options, prop ){ - this.options = options; - this.elem = elem; - this.prop = prop; - - if (!options.orig) options.orig = {}; -}; -hs.fx.prototype = { - update: function(){ - (hs.fx.step[this.prop] || hs.fx.step._default)(this); - - if (this.options.step) - this.options.step.call(this.elem, this.now, this); - - }, - custom: function(from, to, unit){ - this.startTime = (new Date()).getTime(); - this.start = from; - this.end = to; - this.unit = unit;// || this.unit || "px"; - this.now = this.start; - this.pos = this.state = 0; - - var self = this; - function t(gotoEnd){ - return self.step(gotoEnd); - } - - t.elem = this.elem; - - if ( t() && hs.timers.push(t) == 1 ) { - hs.timerId = setInterval(function(){ - var timers = hs.timers; - - for ( var i = 0; i < timers.length; i++ ) - if ( !timers[i]() ) - timers.splice(i--, 1); - - if ( !timers.length ) { - clearInterval(hs.timerId); - } - }, 13); - } - }, - step: function(gotoEnd){ - var t = (new Date()).getTime(); - if ( gotoEnd || t >= this.options.duration + this.startTime ) { - this.now = this.end; - this.pos = this.state = 1; - this.update(); - - this.options.curAnim[ this.prop ] = true; - - var done = true; - for ( var i in this.options.curAnim ) - if ( this.options.curAnim[i] !== true ) - done = false; - - if ( done ) { - if (this.options.complete) this.options.complete.call(this.elem); - } - return false; - } else { - var n = t - this.startTime; - this.state = n / this.options.duration; - this.pos = this.options.easing(n, 0, 1, this.options.duration); - this.now = this.start + ((this.end - this.start) * this.pos); - this.update(); - } - return true; - } - -}; - -hs.extend( hs.fx, { - step: { - - opacity: function(fx){ - hs.setStyles(fx.elem, { opacity: fx.now }); - }, - - _default: function(fx){ - try { - if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) - fx.elem.style[ fx.prop ] = fx.now + fx.unit; - else - fx.elem[ fx.prop ] = fx.now; - } catch (e) {} - } - } -}); - -hs.Outline = function (outlineType, onLoad) { - this.onLoad = onLoad; - this.outlineType = outlineType; - var v = hs.uaVersion, tr; - - this.hasAlphaImageLoader = hs.ie && hs.uaVersion < 7; - if (!outlineType) { - if (onLoad) onLoad(); - return; - } - - hs.init(); - this.table = hs.createElement( - 'table', { - cellSpacing: 0 - }, { - visibility: 'hidden', - position: 'absolute', - borderCollapse: 'collapse', - width: 0 - }, - hs.container, - true - ); - var tbody = hs.createElement('tbody', null, null, this.table, 1); - - this.td = []; - for (var i = 0; i <= 8; i++) { - if (i % 3 == 0) tr = hs.createElement('tr', null, { height: 'auto' }, tbody, true); - this.td[i] = hs.createElement('td', null, null, tr, true); - var style = i != 4 ? { lineHeight: 0, fontSize: 0} : { position : 'relative' }; - hs.setStyles(this.td[i], style); - } - this.td[4].className = outlineType +' highslide-outline'; - - this.preloadGraphic(); -}; - -hs.Outline.prototype = { -preloadGraphic : function () { - var src = hs.graphicsDir + (hs.outlinesDir || "outlines/")+ this.outlineType +".png"; - - var appendTo = hs.safari && hs.uaVersion < 525 ? hs.container : null; - this.graphic = hs.createElement('img', null, { position: 'absolute', - top: '-9999px' }, appendTo, true); // for onload trigger - - var pThis = this; - this.graphic.onload = function() { pThis.onGraphicLoad(); }; - - this.graphic.src = src; -}, - -onGraphicLoad : function () { - var o = this.offset = this.graphic.width / 4, - pos = [[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]], - dim = { height: (2*o) +'px', width: (2*o) +'px' }; - for (var i = 0; i <= 8; i++) { - if (pos[i]) { - if (this.hasAlphaImageLoader) { - var w = (i == 1 || i == 7) ? '100%' : this.graphic.width +'px'; - var div = hs.createElement('div', null, { width: '100%', height: '100%', position: 'relative', overflow: 'hidden'}, this.td[i], true); - hs.createElement ('div', null, { - filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+ this.graphic.src + "')", - position: 'absolute', - width: w, - height: this.graphic.height +'px', - left: (pos[i][0]*o)+'px', - top: (pos[i][1]*o)+'px' - }, - div, - true); - } else { - hs.setStyles(this.td[i], { background: 'url('+ this.graphic.src +') '+ (pos[i][0]*o)+'px '+(pos[i][1]*o)+'px'}); - } - - if (window.opera && (i == 3 || i ==5)) - hs.createElement('div', null, dim, this.td[i], true); - - hs.setStyles (this.td[i], dim); - } - } - this.graphic = null; - if (hs.pendingOutlines[this.outlineType]) hs.pendingOutlines[this.outlineType].destroy(); - hs.pendingOutlines[this.outlineType] = this; - if (this.onLoad) this.onLoad(); -}, - -setPosition : function (pos, offset, vis, dur, easing) { - var exp = this.exp, - stl = exp.wrapper.style, - offset = offset || 0, - pos = pos || { - x: exp.x.pos + offset, - y: exp.y.pos + offset, - w: exp.x.get('wsize') - 2 * offset, - h: exp.y.get('wsize') - 2 * offset - }; - if (vis) this.table.style.visibility = (pos.h >= 4 * this.offset) - ? 'visible' : 'hidden'; - hs.setStyles(this.table, { - left: (pos.x - this.offset) +'px', - top: (pos.y - this.offset) +'px', - width: (pos.w + 2 * this.offset) +'px' - }); - - pos.w -= 2 * this.offset; - pos.h -= 2 * this.offset; - hs.setStyles (this.td[4], { - width: pos.w >= 0 ? pos.w +'px' : 0, - height: pos.h >= 0 ? pos.h +'px' : 0 - }); - if (this.hasAlphaImageLoader) this.td[3].style.height - = this.td[5].style.height = this.td[4].style.height; - -}, - -destroy : function(hide) { - if (hide) this.table.style.visibility = 'hidden'; - else hs.discardElement(this.table); -} -}; - -hs.Dimension = function(exp, dim) { - this.exp = exp; - this.dim = dim; - this.ucwh = dim == 'x' ? 'Width' : 'Height'; - this.wh = this.ucwh.toLowerCase(); - this.uclt = dim == 'x' ? 'Left' : 'Top'; - this.lt = this.uclt.toLowerCase(); - this.ucrb = dim == 'x' ? 'Right' : 'Bottom'; - this.rb = this.ucrb.toLowerCase(); - this.p1 = this.p2 = 0; -}; -hs.Dimension.prototype = { -get : function(key) { - switch (key) { - case 'loadingPos': - return this.tpos + this.tb + (this.t - hs.loading['offset'+ this.ucwh]) / 2; - case 'loadingPosXfade': - return this.pos + this.cb+ this.p1 + (this.size - hs.loading['offset'+ this.ucwh]) / 2; - case 'wsize': - return this.size + 2 * this.cb + this.p1 + this.p2; - case 'fitsize': - return this.clientSize - this.marginMin - this.marginMax; - case 'maxsize': - return this.get('fitsize') - 2 * this.cb - this.p1 - this.p2 ; - case 'opos': - return this.pos - (this.exp.outline ? this.exp.outline.offset : 0); - case 'osize': - return this.get('wsize') + (this.exp.outline ? 2*this.exp.outline.offset : 0); - case 'imgPad': - return this.imgSize ? Math.round((this.size - this.imgSize) / 2) : 0; - - } -}, -calcBorders: function() { - // correct for borders - this.cb = (this.exp.content['offset'+ this.ucwh] - this.t) / 2; - - this.marginMax = hs['margin'+ this.ucrb]; -}, -calcThumb: function() { - this.t = this.exp.el[this.wh] ? parseInt(this.exp.el[this.wh]) : - this.exp.el['offset'+ this.ucwh]; - this.tpos = this.exp.tpos[this.dim]; - this.tb = (this.exp.el['offset'+ this.ucwh] - this.t) / 2; - if (this.tpos == 0 || this.tpos == -1) { - this.tpos = (hs.page[this.wh] / 2) + hs.page['scroll'+ this.uclt]; - }; -}, -calcExpanded: function() { - var exp = this.exp; - this.justify = 'auto'; - - // get alignment - if (exp.align == 'center') this.justify = 'center'; - else if (new RegExp(this.lt).test(exp.anchor)) this.justify = null; - else if (new RegExp(this.rb).test(exp.anchor)) this.justify = 'max'; - - - // size and position - this.pos = this.tpos - this.cb + this.tb; - - if (this.maxHeight && this.dim == 'x') - exp.maxWidth = Math.min(exp.maxWidth || this.full, exp.maxHeight * this.full / exp.y.full); - - this.size = Math.min(this.full, exp['max'+ this.ucwh] || this.full); - this.minSize = exp.allowSizeReduction ? - Math.min(exp['min'+ this.ucwh], this.full) :this.full; - if (exp.isImage && exp.useBox) { - this.size = exp[this.wh]; - this.imgSize = this.full; - } - if (this.dim == 'x' && hs.padToMinWidth) this.minSize = exp.minWidth; - this.target = exp['target'+ this.dim.toUpperCase()]; - this.marginMin = hs['margin'+ this.uclt]; - this.scroll = hs.page['scroll'+ this.uclt]; - this.clientSize = hs.page[this.wh]; -}, -setSize: function(i) { - var exp = this.exp; - if (exp.isImage && (exp.useBox || hs.padToMinWidth)) { - this.imgSize = i; - this.size = Math.max(this.size, this.imgSize); - exp.content.style[this.lt] = this.get('imgPad')+'px'; - } else - this.size = i; - - exp.content.style[this.wh] = i +'px'; - exp.wrapper.style[this.wh] = this.get('wsize') +'px'; - if (exp.outline) exp.outline.setPosition(); - if (exp.releaseMask) exp.releaseMask.style[this.wh] = i +'px'; - if (this.dim == 'y' && exp.iDoc && exp.body.style.height != 'auto') try { - exp.iDoc.body.style.overflow = 'auto'; - } catch (e) {} - if (exp.isHtml) { - var d = exp.scrollerDiv; - if (this.sizeDiff === undefined) - this.sizeDiff = exp.innerContent['offset'+ this.ucwh] - d['offset'+ this.ucwh]; - d.style[this.wh] = (this.size - this.sizeDiff) +'px'; - - if (this.dim == 'x') exp.mediumContent.style.width = 'auto'; - if (exp.body) exp.body.style[this.wh] = 'auto'; - } - if (this.dim == 'x' && exp.overlayBox) exp.sizeOverlayBox(true); - if (this.dim == 'x' && exp.slideshow && exp.isImage) { - if (i == this.full) exp.slideshow.disable('full-expand'); - else exp.slideshow.enable('full-expand'); - } -}, -setPos: function(i) { - this.pos = i; - this.exp.wrapper.style[this.lt] = i +'px'; - - if (this.exp.outline) this.exp.outline.setPosition(); - -} -}; - -hs.Expander = function(a, params, custom, contentType) { - if (document.readyState && hs.ie && !hs.isReady) { - hs.addEventListener(document, 'ready', function() { - new hs.Expander(a, params, custom, contentType); - }); - return; - } - this.a = a; - this.custom = custom; - this.contentType = contentType || 'image'; - this.isHtml = (contentType == 'html'); - this.isImage = !this.isHtml; - - hs.continuePreloading = false; - this.overlays = []; - this.last = hs.last; - hs.last = null; - hs.init(); - var key = this.key = hs.expanders.length; - // override inline parameters - for (var i = 0; i < hs.overrides.length; i++) { - var name = hs.overrides[i]; - this[name] = params && typeof params[name] != 'undefined' ? - params[name] : hs[name]; - } - if (!this.src) this.src = a.href; - - // get thumb - var el = (params && params.thumbnailId) ? hs.$(params.thumbnailId) : a; - el = this.thumb = el.getElementsByTagName('img')[0] || el; - this.thumbsUserSetId = el.id || a.id; - if (!hs.fireEvent(this, 'onInit')) return true; - - // check if already open - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].a == a - && !(this.last && this.transitions[1] == 'crossfade')) { - hs.expanders[i].focus(); - return false; - } - } - - // cancel other - if (!hs.allowSimultaneousLoading) for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].thumb != el && !hs.expanders[i].onLoadStarted) { - hs.expanders[i].cancelLoading(); - } - } - hs.expanders[key] = this; - if (!hs.allowMultipleInstances && !hs.upcoming) { - if (hs.expanders[key-1]) hs.expanders[key-1].close(); - if (typeof hs.focusKey != 'undefined' && hs.expanders[hs.focusKey]) - hs.expanders[hs.focusKey].close(); - } - - // initiate metrics - this.el = el; - this.tpos = this.pageOrigin || hs.getPosition(el); - hs.getPageSize(); - var x = this.x = new hs.Dimension(this, 'x'); - x.calcThumb(); - var y = this.y = new hs.Dimension(this, 'y'); - y.calcThumb(); - if (/area/i.test(el.tagName)) this.getImageMapAreaCorrection(el); - this.wrapper = hs.createElement( - 'div', { - id: 'highslide-wrapper-'+ this.key, - className: 'highslide-wrapper '+ this.wrapperClassName - }, { - visibility: 'hidden', - position: 'absolute', - zIndex: hs.zIndexCounter += 2 - }, null, true ); - - this.wrapper.onmouseover = this.wrapper.onmouseout = hs.wrapperMouseHandler; - if (this.contentType == 'image' && this.outlineWhileAnimating == 2) - this.outlineWhileAnimating = 0; - - // get the outline - if (!this.outlineType - || (this.last && this.isImage && this.transitions[1] == 'crossfade')) { - this[this.contentType +'Create'](); - - } else if (hs.pendingOutlines[this.outlineType]) { - this.connectOutline(); - this[this.contentType +'Create'](); - - } else { - this.showLoading(); - var exp = this; - new hs.Outline(this.outlineType, - function () { - exp.connectOutline(); - exp[exp.contentType +'Create'](); - } - ); - } - return true; -}; - -hs.Expander.prototype = { -error : function(e) { - if (hs.debug) alert ('Line '+ e.lineNumber +': '+ e.message); - else window.location.href = this.src; -}, - -connectOutline : function() { - var outline = this.outline = hs.pendingOutlines[this.outlineType]; - outline.exp = this; - outline.table.style.zIndex = this.wrapper.style.zIndex - 1; - hs.pendingOutlines[this.outlineType] = null; -}, - -showLoading : function() { - if (this.onLoadStarted || this.loading) return; - - this.loading = hs.loading; - var exp = this; - this.loading.onclick = function() { - exp.cancelLoading(); - }; - - - if (!hs.fireEvent(this, 'onShowLoading')) return; - var exp = this, - l = this.x.get('loadingPos') +'px', - t = this.y.get('loadingPos') +'px'; - if (!tgt && this.last && this.transitions[1] == 'crossfade') - var tgt = this.last; - if (tgt) { - l = tgt.x.get('loadingPosXfade') +'px'; - t = tgt.y.get('loadingPosXfade') +'px'; - this.loading.style.zIndex = hs.zIndexCounter++; - } - setTimeout(function () { - if (exp.loading) hs.setStyles(exp.loading, { left: l, top: t, zIndex: hs.zIndexCounter++ })} - , 100); -}, - -imageCreate : function() { - var exp = this; - - var img = document.createElement('img'); - this.content = img; - img.onload = function () { - if (hs.expanders[exp.key]) exp.contentLoaded(); - }; - if (hs.blockRightClick) img.oncontextmenu = function() { return false; }; - img.className = 'highslide-image'; - hs.setStyles(img, { - visibility: 'hidden', - display: 'block', - position: 'absolute', - maxWidth: '9999px', - zIndex: 3 - }); - img.title = hs.lang.restoreTitle; - if (hs.safari && hs.uaVersion < 525) hs.container.appendChild(img); - if (hs.ie && hs.flushImgSize) img.src = null; - img.src = this.src; - - this.showLoading(); -}, - -htmlCreate : function () { - if (!hs.fireEvent(this, 'onBeforeGetContent')) return; - - this.content = hs.getCacheBinding(this.a); - if (!this.content) - this.content = hs.getNode(this.contentId); - if (!this.content) - this.content = hs.getSelfRendered(); - this.getInline(['maincontent']); - if (this.maincontent) { - var body = hs.getElementByClass(this.content, 'div', 'highslide-body'); - if (body) body.appendChild(this.maincontent); - this.maincontent.style.display = 'block'; - } - hs.fireEvent(this, 'onAfterGetContent'); - - var innerContent = this.innerContent = this.content; - - if (/(swf|iframe)/.test(this.objectType)) this.setObjContainerSize(innerContent); - - // the content tree - hs.container.appendChild(this.wrapper); - hs.setStyles( this.wrapper, { - position: 'static', - padding: '0 '+ hs.marginRight +'px 0 '+ hs.marginLeft +'px' - }); - this.content = hs.createElement( - 'div', { - className: 'highslide-html' - }, { - position: 'relative', - zIndex: 3, - height: 0, - overflow: 'hidden' - }, - this.wrapper - ); - this.mediumContent = hs.createElement('div', null, null, this.content, 1); - this.mediumContent.appendChild(innerContent); - - hs.setStyles (innerContent, { - position: 'relative', - display: 'block', - direction: hs.lang.cssDirection || '' - }); - if (this.width) innerContent.style.width = this.width +'px'; - if (this.height) hs.setStyles(innerContent, { - height: this.height +'px', - overflow: 'hidden' - }); - if (innerContent.offsetWidth < this.minWidth) - innerContent.style.width = this.minWidth +'px'; - - - - if (this.objectType == 'ajax' && !hs.getCacheBinding(this.a)) { - this.showLoading(); - var exp = this; - var ajax = new hs.Ajax(this.a, innerContent); - ajax.src = this.src; - ajax.onLoad = function () { if (hs.expanders[exp.key]) exp.contentLoaded(); }; - ajax.onError = function () { location.href = exp.src; }; - ajax.run(); - } - else - - if (this.objectType == 'iframe' && this.objectLoadTime == 'before') { - this.writeExtendedContent(); - } - else - this.contentLoaded(); -}, - -contentLoaded : function() { - try { - if (!this.content) return; - this.content.onload = null; - if (this.onLoadStarted) return; - else this.onLoadStarted = true; - - var x = this.x, y = this.y; - - if (this.loading) { - hs.setStyles(this.loading, { top: '-9999px' }); - this.loading = null; - hs.fireEvent(this, 'onHideLoading'); - } - if (this.isImage) { - x.full = this.content.width; - y.full = this.content.height; - - hs.setStyles(this.content, { - width: x.t +'px', - height: y.t +'px' - }); - this.wrapper.appendChild(this.content); - hs.container.appendChild(this.wrapper); - } else if (this.htmlGetSize) this.htmlGetSize(); - - x.calcBorders(); - y.calcBorders(); - - hs.setStyles (this.wrapper, { - left: (x.tpos + x.tb - x.cb) +'px', - top: (y.tpos + x.tb - y.cb) +'px' - }); - - - this.initSlideshow(); - this.getOverlays(); - - var ratio = x.full / y.full; - x.calcExpanded(); - this.justify(x); - - y.calcExpanded(); - this.justify(y); - if (this.isHtml) this.htmlSizeOperations(); - if (this.overlayBox) this.sizeOverlayBox(0, 1); - - - if (this.allowSizeReduction) { - if (this.isImage) - this.correctRatio(ratio); - else this.fitOverlayBox(); - var ss = this.slideshow; - if (ss && this.last && ss.controls && ss.fixedControls) { - var pos = ss.overlayOptions.position || '', p; - for (var dim in hs.oPos) for (var i = 0; i < 5; i++) { - p = this[dim]; - if (pos.match(hs.oPos[dim][i])) { - p.pos = this.last[dim].pos - + (this.last[dim].p1 - p.p1) - + (this.last[dim].size - p.size) * [0, 0, .5, 1, 1][i]; - if (ss.fixedControls == 'fit') { - if (p.pos + p.size + p.p1 + p.p2 > p.scroll + p.clientSize - p.marginMax) - p.pos = p.scroll + p.clientSize - p.size - p.marginMin - p.marginMax - p.p1 - p.p2; - if (p.pos < p.scroll + p.marginMin) p.pos = p.scroll + p.marginMin; - } - } - } - } - if (this.isImage && this.x.full > (this.x.imgSize || this.x.size)) { - this.createFullExpand(); - if (this.overlays.length == 1) this.sizeOverlayBox(); - } - } - this.show(); - - } catch (e) { - this.error(e); - } -}, - - -setObjContainerSize : function(parent, auto) { - var c = hs.getElementByClass(parent, 'DIV', 'highslide-body'); - if (/(iframe|swf)/.test(this.objectType)) { - if (this.objectWidth) c.style.width = this.objectWidth +'px'; - if (this.objectHeight) c.style.height = this.objectHeight +'px'; - } -}, - -writeExtendedContent : function () { - if (this.hasExtendedContent) return; - var exp = this; - this.body = hs.getElementByClass(this.innerContent, 'DIV', 'highslide-body'); - if (this.objectType == 'iframe') { - this.showLoading(); - var ruler = hs.clearing.cloneNode(1); - this.body.appendChild(ruler); - this.newWidth = this.innerContent.offsetWidth; - if (!this.objectWidth) this.objectWidth = ruler.offsetWidth; - var hDiff = this.innerContent.offsetHeight - this.body.offsetHeight, - h = this.objectHeight || hs.page.height - hDiff - hs.marginTop - hs.marginBottom, - onload = this.objectLoadTime == 'before' ? - ' onload="if (hs.expanders['+ this.key +']) hs.expanders['+ this.key +'].contentLoaded()" ' : ''; - this.body.innerHTML += ''; - this.ruler = this.body.getElementsByTagName('div')[0]; - this.iframe = this.body.getElementsByTagName('iframe')[0]; - - if (this.objectLoadTime == 'after') this.correctIframeSize(); - - } - if (this.objectType == 'swf') { - this.body.id = this.body.id || 'hs-flash-id-' + this.key; - var a = this.swfOptions; - if (!a.params) a.params = {}; - if (typeof a.params.wmode == 'undefined') a.params.wmode = 'transparent'; - if (swfobject) swfobject.embedSWF(this.src, this.body.id, this.objectWidth, this.objectHeight, - a.version || '7', a.expressInstallSwfurl, a.flashvars, a.params, a.attributes); - } - this.hasExtendedContent = true; -}, -htmlGetSize : function() { - if (this.iframe && !this.objectHeight) { // loadtime before - this.iframe.style.height = this.body.style.height = this.getIframePageHeight() +'px'; - } - this.innerContent.appendChild(hs.clearing); - if (!this.x.full) this.x.full = this.innerContent.offsetWidth; - this.y.full = this.innerContent.offsetHeight; - this.innerContent.removeChild(hs.clearing); - if (hs.ie && this.newHeight > parseInt(this.innerContent.currentStyle.height)) { // ie css bug - this.newHeight = parseInt(this.innerContent.currentStyle.height); - } - hs.setStyles( this.wrapper, { position: 'absolute', padding: '0'}); - hs.setStyles( this.content, { width: this.x.t +'px', height: this.y.t +'px'}); - -}, - -getIframePageHeight : function() { - var h; - try { - var doc = this.iDoc = this.iframe.contentDocument || this.iframe.contentWindow.document; - var clearing = doc.createElement('div'); - clearing.style.clear = 'both'; - doc.body.appendChild(clearing); - h = clearing.offsetTop; - if (hs.ie) h += parseInt(doc.body.currentStyle.marginTop) - + parseInt(doc.body.currentStyle.marginBottom) - 1; - } catch (e) { // other domain - h = 300; - } - return h; -}, -correctIframeSize : function () { - var wDiff = this.innerContent.offsetWidth - this.ruler.offsetWidth; - hs.discardElement(this.ruler); - if (wDiff < 0) wDiff = 0; - - var hDiff = this.innerContent.offsetHeight - this.iframe.offsetHeight; - if (this.iDoc && !this.objectHeight && !this.height && this.y.size == this.y.full) try { - this.iDoc.body.style.overflow = 'hidden'; - } catch (e) {} - hs.setStyles(this.iframe, { - width: Math.abs(this.x.size - wDiff) +'px', - height: Math.abs(this.y.size - hDiff) +'px' - }); - hs.setStyles(this.body, { - width: this.iframe.style.width, - height: this.iframe.style.height - }); - - this.scrollingContent = this.iframe; - this.scrollerDiv = this.scrollingContent; - -}, -htmlSizeOperations : function () { - - this.setObjContainerSize(this.innerContent); - - - if (this.objectType == 'swf' && this.objectLoadTime == 'before') this.writeExtendedContent(); - - // handle minimum size - if (this.x.size < this.x.full && !this.allowWidthReduction) this.x.size = this.x.full; - if (this.y.size < this.y.full && !this.allowHeightReduction) this.y.size = this.y.full; - this.scrollerDiv = this.innerContent; - hs.setStyles(this.mediumContent, { - position: 'relative', - width: this.x.size +'px' - }); - hs.setStyles(this.innerContent, { - border: 'none', - width: 'auto', - height: 'auto' - }); - var node = hs.getElementByClass(this.innerContent, 'DIV', 'highslide-body'); - if (node && !/(iframe|swf)/.test(this.objectType)) { - var cNode = node; // wrap to get true size - node = hs.createElement(cNode.nodeName, null, {overflow: 'hidden'}, null, true); - cNode.parentNode.insertBefore(node, cNode); - node.appendChild(hs.clearing); // IE6 - node.appendChild(cNode); - - var wDiff = this.innerContent.offsetWidth - node.offsetWidth; - var hDiff = this.innerContent.offsetHeight - node.offsetHeight; - node.removeChild(hs.clearing); - - var kdeBugCorr = hs.safari || navigator.vendor == 'KDE' ? 1 : 0; // KDE repainting bug - hs.setStyles(node, { - width: (this.x.size - wDiff - kdeBugCorr) +'px', - height: (this.y.size - hDiff) +'px', - overflow: 'auto', - position: 'relative' - } - ); - if (kdeBugCorr && cNode.offsetHeight > node.offsetHeight) { - node.style.width = (parseInt(node.style.width) + kdeBugCorr) + 'px'; - } - this.scrollingContent = node; - this.scrollerDiv = this.scrollingContent; - } - if (this.iframe && this.objectLoadTime == 'before') this.correctIframeSize(); - if (!this.scrollingContent && this.y.size < this.mediumContent.offsetHeight) this.scrollerDiv = this.content; - - if (this.scrollerDiv == this.content && !this.allowWidthReduction && !/(iframe|swf)/.test(this.objectType)) { - this.x.size += 17; // room for scrollbars - } - if (this.scrollerDiv && this.scrollerDiv.offsetHeight > this.scrollerDiv.parentNode.offsetHeight) { - setTimeout("try { hs.expanders["+ this.key +"].scrollerDiv.style.overflow = 'auto'; } catch(e) {}", - hs.expandDuration); - } -}, - -getImageMapAreaCorrection : function(area) { - var c = area.coords.split(','); - for (var i = 0; i < c.length; i++) c[i] = parseInt(c[i]); - - if (area.shape.toLowerCase() == 'circle') { - this.x.tpos += c[0] - c[2]; - this.y.tpos += c[1] - c[2]; - this.x.t = this.y.t = 2 * c[2]; - } else { - var maxX, maxY, minX = maxX = c[0], minY = maxY = c[1]; - for (var i = 0; i < c.length; i++) { - if (i % 2 == 0) { - minX = Math.min(minX, c[i]); - maxX = Math.max(maxX, c[i]); - } else { - minY = Math.min(minY, c[i]); - maxY = Math.max(maxY, c[i]); - } - } - this.x.tpos += minX; - this.x.t = maxX - minX; - this.y.tpos += minY; - this.y.t = maxY - minY; - } -}, -justify : function (p, moveOnly) { - var tgtArr, tgt = p.target, dim = p == this.x ? 'x' : 'y'; - - if (tgt && tgt.match(/ /)) { - tgtArr = tgt.split(' '); - tgt = tgtArr[0]; - } - if (tgt && hs.$(tgt)) { - p.pos = hs.getPosition(hs.$(tgt))[dim]; - if (tgtArr && tgtArr[1] && tgtArr[1].match(/^[-]?[0-9]+px$/)) - p.pos += parseInt(tgtArr[1]); - if (p.size < p.minSize) p.size = p.minSize; - - } else if (p.justify == 'auto' || p.justify == 'center') { - - var hasMovedMin = false; - - var allowReduce = p.exp.allowSizeReduction; - if (p.justify == 'center') - p.pos = Math.round(p.scroll + (p.clientSize + p.marginMin - p.marginMax - p.get('wsize')) / 2); - else - p.pos = Math.round(p.pos - ((p.get('wsize') - p.t) / 2)); - if (p.pos < p.scroll + p.marginMin) { - p.pos = p.scroll + p.marginMin; - hasMovedMin = true; - } - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - if (p.pos + p.get('wsize') > p.scroll + p.clientSize - p.marginMax) { - if (!moveOnly && hasMovedMin && allowReduce) { - p.size = Math.min(p.size, p.get(dim == 'y' ? 'fitsize' : 'maxsize')); - } else if (p.get('wsize') < p.get('fitsize')) { - p.pos = p.scroll + p.clientSize - p.marginMax - p.get('wsize'); - } else { // image larger than viewport - p.pos = p.scroll + p.marginMin; - if (!moveOnly && allowReduce) p.size = p.get(dim == 'y' ? 'fitsize' : 'maxsize'); - } - } - - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - - - } else if (p.justify == 'max') { - p.pos = Math.floor(p.pos - p.size + p.t); - } - - - if (p.pos < p.marginMin) { - var tmpMin = p.pos; - p.pos = p.marginMin; - - if (allowReduce && !moveOnly) p.size = p.size - (p.pos - tmpMin); - - } -}, - -correctRatio : function(ratio) { - var x = this.x, - y = this.y, - changed = false, - xSize = Math.min(x.full, x.size), - ySize = Math.min(y.full, y.size), - useBox = (this.useBox || hs.padToMinWidth); - - if (xSize / ySize > ratio) { // width greater - xSize = ySize * ratio; - if (xSize < x.minSize) { // below minWidth - xSize = x.minSize; - ySize = xSize / ratio; - } - changed = true; - - } else if (xSize / ySize < ratio) { // height greater - ySize = xSize / ratio; - changed = true; - } - - if (hs.padToMinWidth && x.full < x.minSize) { - x.imgSize = x.full; - y.size = y.imgSize = y.full; - } else if (this.useBox) { - x.imgSize = xSize; - y.imgSize = ySize; - } else { - x.size = xSize; - y.size = ySize; - } - changed = this.fitOverlayBox(this.useBox ? null : ratio, changed); - if (useBox && y.size < y.imgSize) { - y.imgSize = y.size; - x.imgSize = y.size * ratio; - } - if (changed || useBox) { - x.pos = x.tpos - x.cb + x.tb; - x.minSize = x.size; - this.justify(x, true); - - y.pos = y.tpos - y.cb + y.tb; - y.minSize = y.size; - this.justify(y, true); - if (this.overlayBox) this.sizeOverlayBox(); - } - - -}, -fitOverlayBox : function(ratio, changed) { - var x = this.x, y = this.y; - if (this.overlayBox && (this.isImage || this.allowHeightReduction)) { - while (y.size > this.minHeight && x.size > this.minWidth - && y.get('wsize') > y.get('fitsize')) { - y.size -= 10; - if (ratio) x.size = y.size * ratio; - this.sizeOverlayBox(0, 1); - changed = true; - } - } - return changed; -}, - -reflow : function () { - if (this.scrollerDiv) { - var h = /iframe/i.test(this.scrollerDiv.tagName) ? (this.getIframePageHeight() + 1) +'px' : 'auto'; - if (this.body) this.body.style.height = h; - this.scrollerDiv.style.height = h; - this.y.setSize(this.innerContent.offsetHeight); - } -}, - -show : function () { - var x = this.x, y = this.y; - this.doShowHide('hidden'); - hs.fireEvent(this, 'onBeforeExpand'); - if (this.slideshow && this.slideshow.thumbstrip) this.slideshow.thumbstrip.selectThumb(); - - // Apply size change - this.changeSize( - 1, { - wrapper: { - width : x.get('wsize'), - height : y.get('wsize'), - left: x.pos, - top: y.pos - }, - content: { - left: x.p1 + x.get('imgPad'), - top: y.p1 + y.get('imgPad'), - width:x.imgSize ||x.size, - height:y.imgSize ||y.size - } - }, - hs.expandDuration - ); -}, - -changeSize : function(up, to, dur) { - // transition - var trans = this.transitions, - other = up ? (this.last ? this.last.a : null) : hs.upcoming, - t = (trans[1] && other - && hs.getParam(other, 'transitions')[1] == trans[1]) ? - trans[1] : trans[0]; - - if (this[t] && t != 'expand') { - this[t](up, to); - return; - } - - if (this.outline && !this.outlineWhileAnimating) { - if (up) this.outline.setPosition(); - else this.outline.destroy( - (this.isHtml && this.preserveContent)); - } - - - if (!up) this.destroyOverlays(); - - var exp = this, - x = exp.x, - y = exp.y, - easing = this.easing; - if (!up) easing = this.easingClose || easing; - var after = up ? - function() { - - if (exp.outline) exp.outline.table.style.visibility = "visible"; - setTimeout(function() { - exp.afterExpand(); - }, 50); - } : - function() { - exp.afterClose(); - }; - if (up) hs.setStyles( this.wrapper, { - width: x.t +'px', - height: y.t +'px' - }); - if (up && this.isHtml) { - hs.setStyles(this.wrapper, { - left: (x.tpos - x.cb + x.tb) +'px', - top: (y.tpos - y.cb + y.tb) +'px' - }); - } - if (this.fadeInOut) { - hs.setStyles(this.wrapper, { opacity: up ? 0 : 1 }); - hs.extend(to.wrapper, { opacity: up }); - } - hs.animate( this.wrapper, to.wrapper, { - duration: dur, - easing: easing, - step: function(val, args) { - if (exp.outline && exp.outlineWhileAnimating && args.prop == 'top') { - var fac = up ? args.pos : 1 - args.pos; - var pos = { - w: x.t + (x.get('wsize') - x.t) * fac, - h: y.t + (y.get('wsize') - y.t) * fac, - x: x.tpos + (x.pos - x.tpos) * fac, - y: y.tpos + (y.pos - y.tpos) * fac - }; - exp.outline.setPosition(pos, 0, 1); - } - if (exp.isHtml) { - if (args.prop == 'left') - exp.mediumContent.style.left = (x.pos - val) +'px'; - if (args.prop == 'top') - exp.mediumContent.style.top = (y.pos - val) +'px'; - } - } - }); - hs.animate( this.content, to.content, dur, easing, after); - if (up) { - this.wrapper.style.visibility = 'visible'; - this.content.style.visibility = 'visible'; - if (this.isHtml) this.innerContent.style.visibility = 'visible'; - this.a.className += ' highslide-active-anchor'; - } -}, - - - -fade : function(up, to) { - this.outlineWhileAnimating = false; - var exp = this, t = up ? hs.expandDuration : 0; - - if (up) { - hs.animate(this.wrapper, to.wrapper, 0); - hs.setStyles(this.wrapper, { opacity: 0, visibility: 'visible' }); - hs.animate(this.content, to.content, 0); - this.content.style.visibility = 'visible'; - - hs.animate(this.wrapper, { opacity: 1 }, t, null, - function() { exp.afterExpand(); }); - } - - if (this.outline) { - this.outline.table.style.zIndex = this.wrapper.style.zIndex; - var dir = up || -1, - offset = this.outline.offset, - startOff = up ? 3 : offset, - endOff = up? offset : 3; - for (var i = startOff; dir * i <= dir * endOff; i += dir, t += 25) { - (function() { - var o = up ? endOff - i : startOff - i; - setTimeout(function() { - exp.outline.setPosition(0, o, 1); - }, t); - })(); - } - } - - - if (up) {}//setTimeout(function() { exp.afterExpand(); }, t+50); - else { - setTimeout( function() { - if (exp.outline) exp.outline.destroy(exp.preserveContent); - - exp.destroyOverlays(); - - hs.animate( exp.wrapper, { opacity: 0 }, hs.restoreDuration, null, function(){ - exp.afterClose(); - }); - }, t); - } -}, -crossfade : function (up, to, from) { - if (!up) return; - var exp = this, - last = this.last, - x = this.x, - y = this.y, - lastX = last.x, - lastY = last.y, - wrapper = this.wrapper, - content = this.content, - overlayBox = this.overlayBox; - hs.removeEventListener(document, 'mousemove', hs.dragHandler); - - hs.setStyles(content, { - width: (x.imgSize || x.size) +'px', - height: (y.imgSize || y.size) +'px' - }); - if (overlayBox) overlayBox.style.overflow = 'visible'; - this.outline = last.outline; - if (this.outline) this.outline.exp = exp; - last.outline = null; - var fadeBox = hs.createElement('div', { - className: 'highslide-'+ this.contentType - }, { - position: 'absolute', - zIndex: 4, - overflow: 'hidden', - display: 'none' - } - ); - var names = { oldImg: last, newImg: this }; - for (var n in names) { - this[n] = names[n].content.cloneNode(1); - hs.setStyles(this[n], { - position: 'absolute', - border: 0, - visibility: 'visible' - }); - fadeBox.appendChild(this[n]); - } - wrapper.appendChild(fadeBox); - if (this.isHtml) hs.setStyles(this.mediumContent, { - left: 0, - top: 0 - }); - if (overlayBox) { - overlayBox.className = ''; - wrapper.appendChild(overlayBox); - } - fadeBox.style.display = ''; - last.content.style.display = 'none'; - - - if (hs.safari && hs.uaVersion < 525) { - this.wrapper.style.visibility = 'visible'; - } - hs.animate(wrapper, { - width: x.size - }, { - duration: hs.transitionDuration, - step: function(val, args) { - var pos = args.pos, - invPos = 1 - pos; - var prop, - size = {}, - props = ['pos', 'size', 'p1', 'p2']; - for (var n in props) { - prop = props[n]; - size['x'+ prop] = Math.round(invPos * lastX[prop] + pos * x[prop]); - size['y'+ prop] = Math.round(invPos * lastY[prop] + pos * y[prop]); - size.ximgSize = Math.round( - invPos * (lastX.imgSize || lastX.size) + pos * (x.imgSize || x.size)); - size.ximgPad = Math.round(invPos * lastX.get('imgPad') + pos * x.get('imgPad')); - size.yimgSize = Math.round( - invPos * (lastY.imgSize || lastY.size) + pos * (y.imgSize || y.size)); - size.yimgPad = Math.round(invPos * lastY.get('imgPad') + pos * y.get('imgPad')); - } - if (exp.outline) exp.outline.setPosition({ - x: size.xpos, - y: size.ypos, - w: size.xsize + size.xp1 + size.xp2 + 2 * x.cb, - h: size.ysize + size.yp1 + size.yp2 + 2 * y.cb - }); - last.wrapper.style.clip = 'rect(' - + (size.ypos - lastY.pos)+'px, ' - + (size.xsize + size.xp1 + size.xp2 + size.xpos + 2 * lastX.cb - lastX.pos) +'px, ' - + (size.ysize + size.yp1 + size.yp2 + size.ypos + 2 * lastY.cb - lastY.pos) +'px, ' - + (size.xpos - lastX.pos)+'px)'; - - hs.setStyles(content, { - top: (size.yp1 + y.get('imgPad')) +'px', - left: (size.xp1 + x.get('imgPad')) +'px', - marginTop: (y.pos - size.ypos) +'px', - marginLeft: (x.pos - size.xpos) +'px' - }); - hs.setStyles(wrapper, { - top: size.ypos +'px', - left: size.xpos +'px', - width: (size.xp1 + size.xp2 + size.xsize + 2 * x.cb)+ 'px', - height: (size.yp1 + size.yp2 + size.ysize + 2 * y.cb) + 'px' - }); - hs.setStyles(fadeBox, { - width: (size.ximgSize || size.xsize) + 'px', - height: (size.yimgSize || size.ysize) +'px', - left: (size.xp1 + size.ximgPad) +'px', - top: (size.yp1 + size.yimgPad) +'px', - visibility: 'visible' - }); - - hs.setStyles(exp.oldImg, { - top: (lastY.pos - size.ypos + lastY.p1 - size.yp1 + lastY.get('imgPad') - size.yimgPad)+'px', - left: (lastX.pos - size.xpos + lastX.p1 - size.xp1 + lastX.get('imgPad') - size.ximgPad)+'px' - }); - - hs.setStyles(exp.newImg, { - opacity: pos, - top: (y.pos - size.ypos + y.p1 - size.yp1 + y.get('imgPad') - size.yimgPad) +'px', - left: (x.pos - size.xpos + x.p1 - size.xp1 + x.get('imgPad') - size.ximgPad) +'px' - }); - if (overlayBox) hs.setStyles(overlayBox, { - width: size.xsize + 'px', - height: size.ysize +'px', - left: (size.xp1 + x.cb) +'px', - top: (size.yp1 + y.cb) +'px' - }); - }, - complete: function () { - wrapper.style.visibility = content.style.visibility = 'visible'; - content.style.display = 'block'; - hs.discardElement(fadeBox); - exp.afterExpand(); - last.afterClose(); - exp.last = null; - } - - }); -}, -reuseOverlay : function(o, el) { - if (!this.last) return false; - for (var i = 0; i < this.last.overlays.length; i++) { - var oDiv = hs.$('hsId'+ this.last.overlays[i]); - if (oDiv && oDiv.hsId == o.hsId) { - this.genOverlayBox(); - oDiv.reuse = this.key; - hs.push(this.overlays, this.last.overlays[i]); - return true; - } - } - return false; -}, - - -afterExpand : function() { - this.isExpanded = true; - this.focus(); - - if (this.isHtml && this.objectLoadTime == 'after') this.writeExtendedContent(); - if (this.iframe) { - try { - var exp = this, - doc = this.iframe.contentDocument || this.iframe.contentWindow.document; - hs.addEventListener(doc, 'mousedown', function () { - if (hs.focusKey != exp.key) exp.focus(); - }); - } catch(e) {} - if (hs.ie && typeof this.isClosing != 'boolean') // first open - this.iframe.style.width = (this.objectWidth - 1) +'px'; // hasLayout - } - if (this.dimmingOpacity) hs.dim(this); - if (hs.upcoming && hs.upcoming == this.a) hs.upcoming = null; - this.prepareNextOutline(); - var p = hs.page, mX = hs.mouse.x + p.scrollLeft, mY = hs.mouse.y + p.scrollTop; - this.mouseIsOver = this.x.pos < mX && mX < this.x.pos + this.x.get('wsize') - && this.y.pos < mY && mY < this.y.pos + this.y.get('wsize'); - if (this.overlayBox) this.showOverlays(); - hs.fireEvent(this, 'onAfterExpand'); - -}, - - -prepareNextOutline : function() { - var key = this.key; - var outlineType = this.outlineType; - new hs.Outline(outlineType, - function () { try { hs.expanders[key].preloadNext(); } catch (e) {} }); -}, - - -preloadNext : function() { - var next = this.getAdjacentAnchor(1); - if (next && next.onclick.toString().match(/hs\.expand/)) - var img = hs.createElement('img', { src: hs.getSrc(next) }); -}, - - -getAdjacentAnchor : function(op) { - var current = this.getAnchorIndex(), as = hs.anchors.groups[this.slideshowGroup || 'none']; - if (as && !as[current + op] && this.slideshow && this.slideshow.repeat) { - if (op == 1) return as[0]; - else if (op == -1) return as[as.length-1]; - } - return (as && as[current + op]) || null; -}, - -getAnchorIndex : function() { - var arr = hs.getAnchors().groups[this.slideshowGroup || 'none']; - if (arr) for (var i = 0; i < arr.length; i++) { - if (arr[i] == this.a) return i; - } - return null; -}, - - -getNumber : function() { - if (this[this.numberPosition]) { - var arr = hs.anchors.groups[this.slideshowGroup || 'none']; - if (arr) { - var s = hs.lang.number.replace('%1', this.getAnchorIndex() + 1).replace('%2', arr.length); - this[this.numberPosition].innerHTML = - '
    '+ s +'
    '+ this[this.numberPosition].innerHTML; - } - } -}, -initSlideshow : function() { - if (!this.last) { - for (var i = 0; i < hs.slideshows.length; i++) { - var ss = hs.slideshows[i], sg = ss.slideshowGroup; - if (typeof sg == 'undefined' || sg === null || sg === this.slideshowGroup) - this.slideshow = new hs.Slideshow(this.key, ss); - } - } else { - this.slideshow = this.last.slideshow; - } - var ss = this.slideshow; - if (!ss) return; - var key = ss.expKey = this.key; - - ss.checkFirstAndLast(); - ss.disable('full-expand'); - if (ss.controls) { - this.createOverlay(hs.extend(ss.overlayOptions || {}, { - overlayId: ss.controls, - hsId: 'controls', - zIndex: 5 - })); - } - if (ss.thumbstrip) ss.thumbstrip.add(this); - if (!this.last && this.autoplay) ss.play(true); - if (ss.autoplay) { - ss.autoplay = setTimeout(function() { - hs.next(key); - }, (ss.interval || 500)); - } -}, - -cancelLoading : function() { - hs.discardElement (this.wrapper); - hs.expanders[this.key] = null; - if (hs.upcoming == this.a) hs.upcoming = null; - hs.undim(this.key); - if (this.loading) hs.loading.style.left = '-9999px'; - hs.fireEvent(this, 'onHideLoading'); -}, - -writeCredits : function () { - if (this.credits) return; - this.credits = hs.createElement('a', { - href: hs.creditsHref, - target: hs.creditsTarget, - className: 'highslide-credits', - innerHTML: hs.lang.creditsText, - title: hs.lang.creditsTitle - }); - this.createOverlay({ - overlayId: this.credits, - position: this.creditsPosition || 'top left', - hsId: 'credits' - }); -}, - -getInline : function(types, addOverlay) { - for (var i = 0; i < types.length; i++) { - var type = types[i], s = null; - if (type == 'caption' && !hs.fireEvent(this, 'onBeforeGetCaption')) return; - else if (type == 'heading' && !hs.fireEvent(this, 'onBeforeGetHeading')) return; - if (!this[type +'Id'] && this.thumbsUserSetId) - this[type +'Id'] = type +'-for-'+ this.thumbsUserSetId; - if (this[type +'Id']) this[type] = hs.getNode(this[type +'Id']); - if (!this[type] && !this[type +'Text'] && this[type +'Eval']) try { - s = eval(this[type +'Eval']); - } catch (e) {} - if (!this[type] && this[type +'Text']) { - s = this[type +'Text']; - } - if (!this[type] && !s) { - this[type] = hs.getNode(this.a['_'+ type + 'Id']); - if (!this[type]) { - var next = this.a.nextSibling; - while (next && !hs.isHsAnchor(next)) { - if ((new RegExp('highslide-'+ type)).test(next.className || null)) { - if (!next.id) this.a['_'+ type + 'Id'] = next.id = 'hsId'+ hs.idCounter++; - this[type] = hs.getNode(next.id); - break; - } - next = next.nextSibling; - } - } - } - if (!this[type] && !s && this.numberPosition == type) s = '\n'; - - if (!this[type] && s) this[type] = hs.createElement('div', - { className: 'highslide-'+ type, innerHTML: s } ); - - if (addOverlay && this[type]) { - var o = { position: (type == 'heading') ? 'above' : 'below' }; - for (var x in this[type+'Overlay']) o[x] = this[type+'Overlay'][x]; - o.overlayId = this[type]; - this.createOverlay(o); - } - } -}, - - -// on end move and resize -doShowHide : function(visibility) { - if (hs.hideSelects) this.showHideElements('SELECT', visibility); - if (hs.hideIframes) this.showHideElements('IFRAME', visibility); - if (hs.geckoMac) this.showHideElements('*', visibility); -}, -showHideElements : function (tagName, visibility) { - var els = document.getElementsByTagName(tagName); - var prop = tagName == '*' ? 'overflow' : 'visibility'; - for (var i = 0; i < els.length; i++) { - if (prop == 'visibility' || (document.defaultView.getComputedStyle( - els[i], "").getPropertyValue('overflow') == 'auto' - || els[i].getAttribute('hidden-by') != null)) { - var hiddenBy = els[i].getAttribute('hidden-by'); - if (visibility == 'visible' && hiddenBy) { - hiddenBy = hiddenBy.replace('['+ this.key +']', ''); - els[i].setAttribute('hidden-by', hiddenBy); - if (!hiddenBy) els[i].style[prop] = els[i].origProp; - } else if (visibility == 'hidden') { // hide if behind - var elPos = hs.getPosition(els[i]); - elPos.w = els[i].offsetWidth; - elPos.h = els[i].offsetHeight; - if (!this.dimmingOpacity) { // hide all if dimming - - var clearsX = (elPos.x + elPos.w < this.x.get('opos') - || elPos.x > this.x.get('opos') + this.x.get('osize')); - var clearsY = (elPos.y + elPos.h < this.y.get('opos') - || elPos.y > this.y.get('opos') + this.y.get('osize')); - } - var wrapperKey = hs.getWrapperKey(els[i]); - if (!clearsX && !clearsY && wrapperKey != this.key) { // element falls behind image - if (!hiddenBy) { - els[i].setAttribute('hidden-by', '['+ this.key +']'); - els[i].origProp = els[i].style[prop]; - els[i].style[prop] = 'hidden'; - - } else if (hiddenBy.indexOf('['+ this.key +']') == -1) { - els[i].setAttribute('hidden-by', hiddenBy + '['+ this.key +']'); - } - } else if ((hiddenBy == '['+ this.key +']' || hs.focusKey == wrapperKey) - && wrapperKey != this.key) { // on move - els[i].setAttribute('hidden-by', ''); - els[i].style[prop] = els[i].origProp || ''; - } else if (hiddenBy && hiddenBy.indexOf('['+ this.key +']') > -1) { - els[i].setAttribute('hidden-by', hiddenBy.replace('['+ this.key +']', '')); - } - - } - } - } -}, - -focus : function() { - this.wrapper.style.zIndex = hs.zIndexCounter += 2; - // blur others - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && i == hs.focusKey) { - var blurExp = hs.expanders[i]; - blurExp.content.className += ' highslide-'+ blurExp.contentType +'-blur'; - if (blurExp.isImage) { - blurExp.content.style.cursor = hs.ieLt7 ? 'hand' : 'pointer'; - blurExp.content.title = hs.lang.focusTitle; - } - hs.fireEvent(blurExp, 'onBlur'); - } - } - - // focus this - if (this.outline) this.outline.table.style.zIndex - = this.wrapper.style.zIndex - 1; - this.content.className = 'highslide-'+ this.contentType; - if (this.isImage) { - this.content.title = hs.lang.restoreTitle; - - if (hs.restoreCursor) { - hs.styleRestoreCursor = window.opera ? 'pointer' : 'url('+ hs.graphicsDir + hs.restoreCursor +'), pointer'; - if (hs.ieLt7 && hs.uaVersion < 6) hs.styleRestoreCursor = 'hand'; - this.content.style.cursor = hs.styleRestoreCursor; - } - } - hs.focusKey = this.key; - hs.addEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - hs.fireEvent(this, 'onFocus'); -}, -moveTo: function(x, y) { - this.x.setPos(x); - this.y.setPos(y); -}, -resize : function (e) { - var w, h, r = e.width / e.height; - w = Math.max(e.width + e.dX, Math.min(this.minWidth, this.x.full)); - if (this.isImage && Math.abs(w - this.x.full) < 12) w = this.x.full; - h = this.isHtml ? e.height + e.dY : w / r; - if (h < Math.min(this.minHeight, this.y.full)) { - h = Math.min(this.minHeight, this.y.full); - if (this.isImage) w = h * r; - } - this.resizeTo(w, h); -}, -resizeTo: function(w, h) { - this.y.setSize(h); - this.x.setSize(w); - this.wrapper.style.height = this.y.get('wsize') +'px'; -}, - -close : function() { - if (this.isClosing || !this.isExpanded) return; - if (this.transitions[1] == 'crossfade' && hs.upcoming) { - hs.getExpander(hs.upcoming).cancelLoading(); - hs.upcoming = null; - } - if (!hs.fireEvent(this, 'onBeforeClose')) return; - this.isClosing = true; - if (this.slideshow && !hs.upcoming) this.slideshow.pause(); - - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - - try { - if (this.isHtml) this.htmlPrepareClose(); - this.content.style.cursor = 'default'; - this.changeSize( - 0, { - wrapper: { - width : this.x.t, - height : this.y.t, - left: this.x.tpos - this.x.cb + this.x.tb, - top: this.y.tpos - this.y.cb + this.y.tb - }, - content: { - left: 0, - top: 0, - width: this.x.t, - height: this.y.t - } - }, hs.restoreDuration - ); - } catch (e) { this.afterClose(); } -}, - -htmlPrepareClose : function() { - if (hs.geckoMac) { // bad redraws - if (!hs.mask) hs.mask = hs.createElement('div', null, - { position: 'absolute' }, hs.container); - hs.setStyles(hs.mask, { width: this.x.size +'px', height: this.y.size +'px', - left: this.x.pos +'px', top: this.y.pos +'px', display: 'block' }); - } - if (this.objectType == 'swf') try { hs.$(this.body.id).StopPlay(); } catch (e) {} - - if (this.objectLoadTime == 'after' && !this.preserveContent) this.destroyObject(); - if (this.scrollerDiv && this.scrollerDiv != this.scrollingContent) - this.scrollerDiv.style.overflow = 'hidden'; -}, - -destroyObject : function () { - if (hs.ie && this.iframe) - try { this.iframe.contentWindow.document.body.innerHTML = ''; } catch (e) {} - if (this.objectType == 'swf') swfobject.removeSWF(this.body.id); - this.body.innerHTML = ''; -}, - -sleep : function() { - if (this.outline) this.outline.table.style.display = 'none'; - this.releaseMask = null; - this.wrapper.style.display = 'none'; - this.isExpanded = false; - hs.push(hs.sleeping, this); -}, - -awake : function() {try { - - hs.expanders[this.key] = this; - - if (!hs.allowMultipleInstances &&hs.focusKey != this.key) { - try { hs.expanders[hs.focusKey].close(); } catch (e){} - } - - var z = hs.zIndexCounter++, stl = { display: '', zIndex: z }; - hs.setStyles (this.wrapper, stl); - this.isClosing = false; - - var o = this.outline || 0; - if (o) { - if (!this.outlineWhileAnimating) stl.visibility = 'hidden'; - hs.setStyles (o.table, stl); - } - if (this.slideshow) { - this.initSlideshow(); - } - - this.show(); -} catch (e) {} - - -}, - -createOverlay : function (o) { - var el = o.overlayId, - relToVP = (o.relativeTo == 'viewport' && !/panel$/.test(o.position)); - if (typeof el == 'string') el = hs.getNode(el); - if (o.html) el = hs.createElement('div', { innerHTML: o.html }); - if (!el || typeof el == 'string') return; - if (!hs.fireEvent(this, 'onCreateOverlay', { overlay: el })) return; - el.style.display = 'block'; - o.hsId = o.hsId || o.overlayId; - if (this.transitions[1] == 'crossfade' && this.reuseOverlay(o, el)) return; - this.genOverlayBox(); - var width = o.width && /^[0-9]+(px|%)$/.test(o.width) ? o.width : 'auto'; - if (/^(left|right)panel$/.test(o.position) && !/^[0-9]+px$/.test(o.width)) width = '200px'; - var overlay = hs.createElement( - 'div', { - id: 'hsId'+ hs.idCounter++, - hsId: o.hsId - }, { - position: 'absolute', - visibility: 'hidden', - width: width, - direction: hs.lang.cssDirection || '', - opacity: 0 - }, - relToVP ? hs.viewport :this.overlayBox, - true - ); - if (relToVP) overlay.hsKey = this.key; - - overlay.appendChild(el); - hs.extend(overlay, { - opacity: 1, - offsetX: 0, - offsetY: 0, - dur: (o.fade === 0 || o.fade === false || (o.fade == 2 && hs.ie)) ? 0 : 250 - }); - hs.extend(overlay, o); - - - if (this.gotOverlays) { - this.positionOverlay(overlay); - if (!overlay.hideOnMouseOut || this.mouseIsOver) - hs.animate(overlay, { opacity: overlay.opacity }, overlay.dur); - } - hs.push(this.overlays, hs.idCounter - 1); -}, -positionOverlay : function(overlay) { - var p = overlay.position || 'middle center', - relToVP = (overlay.relativeTo == 'viewport'), - offX = overlay.offsetX, - offY = overlay.offsetY; - if (relToVP) { - hs.viewport.style.display = 'block'; - overlay.hsKey = this.key; - if (overlay.offsetWidth > overlay.parentNode.offsetWidth) - overlay.style.width = '100%'; - } else - if (overlay.parentNode != this.overlayBox) this.overlayBox.appendChild(overlay); - if (/left$/.test(p)) overlay.style.left = offX +'px'; - - if (/center$/.test(p)) hs.setStyles (overlay, { - left: '50%', - marginLeft: (offX - Math.round(overlay.offsetWidth / 2)) +'px' - }); - - if (/right$/.test(p)) overlay.style.right = - offX +'px'; - - if (/^leftpanel$/.test(p)) { - hs.setStyles(overlay, { - right: '100%', - marginRight: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p1 = overlay.offsetWidth; - - } else if (/^rightpanel$/.test(p)) { - hs.setStyles(overlay, { - left: '100%', - marginLeft: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p2 = overlay.offsetWidth; - } - var parOff = overlay.parentNode.offsetHeight; - overlay.style.height = 'auto'; - if (relToVP && overlay.offsetHeight > parOff) - overlay.style.height = hs.ieLt7 ? parOff +'px' : '100%'; - - if (/^top/.test(p)) overlay.style.top = offY +'px'; - if (/^middle/.test(p)) hs.setStyles (overlay, { - top: '50%', - marginTop: (offY - Math.round(overlay.offsetHeight / 2)) +'px' - }); - if (/^bottom/.test(p)) overlay.style.bottom = - offY +'px'; - if (/^above$/.test(p)) { - hs.setStyles(overlay, { - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - bottom: '100%', - marginBottom: this.y.cb +'px', - width: 'auto' - }); - this.y.p1 = overlay.offsetHeight; - - } else if (/^below$/.test(p)) { - hs.setStyles(overlay, { - position: 'relative', - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - top: '100%', - marginTop: this.y.cb +'px', - width: 'auto' - }); - this.y.p2 = overlay.offsetHeight; - overlay.style.position = 'absolute'; - } -}, - -getOverlays : function() { - this.getInline(['heading', 'caption'], true); - this.getNumber(); - if (this.caption) hs.fireEvent(this, 'onAfterGetCaption'); - if (this.heading) hs.fireEvent(this, 'onAfterGetHeading'); - if (this.heading && this.dragByHeading) this.heading.className += ' highslide-move'; - if (hs.showCredits) this.writeCredits(); - for (var i = 0; i < hs.overlays.length; i++) { - var o = hs.overlays[i], tId = o.thumbnailId, sg = o.slideshowGroup; - if ((!tId && !sg) || (tId && tId == this.thumbsUserSetId) - || (sg && sg === this.slideshowGroup)) { - if (this.isImage || (this.isHtml && o.useOnHtml)) - this.createOverlay(o); - } - } - var os = []; - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - if (/panel$/.test(o.position)) this.positionOverlay(o); - else hs.push(os, o); - } - for (var i = 0; i < os.length; i++) this.positionOverlay(os[i]); - this.gotOverlays = true; -}, -genOverlayBox : function() { - if (!this.overlayBox) this.overlayBox = hs.createElement ( - 'div', { - className: this.wrapperClassName - }, { - position : 'absolute', - width: (this.x.size || (this.useBox ? this.width : null) - || this.x.full) +'px', - height: (this.y.size || this.y.full) +'px', - visibility : 'hidden', - overflow : 'hidden', - zIndex : hs.ie ? 4 : 'auto' - }, - hs.container, - true - ); -}, -sizeOverlayBox : function(doWrapper, doPanels) { - var overlayBox = this.overlayBox, - x = this.x, - y = this.y; - hs.setStyles( overlayBox, { - width: x.size +'px', - height: y.size +'px' - }); - if (doWrapper || doPanels) { - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - var ie6 = (hs.ieLt7 || document.compatMode == 'BackCompat'); - if (o && /^(above|below)$/.test(o.position)) { - if (ie6) { - o.style.width = (overlayBox.offsetWidth + 2 * x.cb - + x.p1 + x.p2) +'px'; - } - y[o.position == 'above' ? 'p1' : 'p2'] = o.offsetHeight; - } - if (o && ie6 && /^(left|right)panel$/.test(o.position)) { - o.style.height = (overlayBox.offsetHeight + 2* y.cb) +'px'; - } - } - } - if (doWrapper) { - hs.setStyles(this.content, { - top: y.p1 +'px' - }); - hs.setStyles(overlayBox, { - top: (y.p1 + y.cb) +'px' - }); - } -}, - -showOverlays : function() { - var b = this.overlayBox; - b.className = ''; - hs.setStyles(b, { - top: (this.y.p1 + this.y.cb) +'px', - left: (this.x.p1 + this.x.cb) +'px', - overflow : 'visible' - }); - if (hs.safari) b.style.visibility = 'visible'; - this.wrapper.appendChild (b); - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - o.style.zIndex = o.zIndex || 4; - if (!o.hideOnMouseOut || this.mouseIsOver) { - o.style.visibility = 'visible'; - hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: o.opacity }, o.dur); - } - } -}, - -destroyOverlays : function() { - if (!this.overlays.length) return; - if (this.slideshow) { - var c = this.slideshow.controls; - if (c && hs.getExpander(c) == this) c.parentNode.removeChild(c); - } - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - if (o && o.parentNode == hs.viewport && hs.getExpander(o) == this) hs.discardElement(o); - } - if (this.isHtml && this.preserveContent) { - this.overlayBox.style.top = '-9999px'; - hs.container.appendChild(this.overlayBox); - } else - hs.discardElement(this.overlayBox); -}, - - - -createFullExpand : function () { - if (this.slideshow && this.slideshow.controls) { - this.slideshow.enable('full-expand'); - return; - } - this.fullExpandLabel = hs.createElement( - 'a', { - href: 'javascript:hs.expanders['+ this.key +'].doFullExpand();', - title: hs.lang.fullExpandTitle, - className: 'highslide-full-expand' - } - ); - if (!hs.fireEvent(this, 'onCreateFullExpand')) return; - - this.createOverlay({ - overlayId: this.fullExpandLabel, - position: hs.fullExpandPosition, - hideOnMouseOut: true, - opacity: hs.fullExpandOpacity - }); -}, - -doFullExpand : function () { - try { - if (!hs.fireEvent(this, 'onDoFullExpand')) return; - if (this.fullExpandLabel) hs.discardElement(this.fullExpandLabel); - - this.focus(); - var xSize = this.x.size, - ySize = this.y.size; - this.resizeTo(this.x.full, this.y.full); - - var xpos = this.x.pos - (this.x.size - xSize) / 2; - if (xpos < hs.marginLeft) xpos = hs.marginLeft; - - var ypos = this.y.pos - (this.y.size - ySize) / 2; - if (ypos < hs.marginTop) ypos = hs.marginTop; - - this.moveTo(xpos, ypos); - this.doShowHide('hidden'); - - } catch (e) { - this.error(e); - } -}, - - -afterClose : function () { - this.a.className = this.a.className.replace('highslide-active-anchor', ''); - - this.doShowHide('visible'); - - if (this.isHtml && this.preserveContent - && this.transitions[1] != 'crossfade') { - this.sleep(); - } else { - if (this.outline && this.outlineWhileAnimating) this.outline.destroy(); - - hs.discardElement(this.wrapper); - } - if (hs.mask) hs.mask.style.display = 'none'; - this.destroyOverlays(); - if (!hs.viewport.childNodes.length) hs.viewport.style.display = 'none'; - - if (this.dimmingOpacity) hs.undim(this.key); - hs.fireEvent(this, 'onAfterClose'); - hs.expanders[this.key] = null; - hs.reOrder(); -} - -}; - - -// hs.Ajax object prototype -hs.Ajax = function (a, content, pre) { - this.a = a; - this.content = content; - this.pre = pre; -}; - -hs.Ajax.prototype = { -run : function () { - var xhr; - if (!this.src) this.src = hs.getSrc(this.a); - if (this.src.match('#')) { - var arr = this.src.split('#'); - this.src = arr[0]; - this.id = arr[1]; - } - if (hs.cachedGets[this.src]) { - this.cachedGet = hs.cachedGets[this.src]; - if (this.id) this.getElementContent(); - else this.loadHTML(); - return; - } - try { xhr = new XMLHttpRequest(); } - catch (e) { - try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } - catch (e) { - try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } - catch (e) { this.onError(); } - } - } - var pThis = this; - xhr.onreadystatechange = function() { - if(pThis.xhr.readyState == 4) { - if (pThis.id) pThis.getElementContent(); - else pThis.loadHTML(); - } - }; - var src = this.src; - this.xhr = xhr; - if (hs.forceAjaxReload) - src = src.replace(/$/, (/\?/.test(src) ? '&' : '?') +'dummy='+ (new Date()).getTime()); - xhr.open('GET', src, true); - xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); - xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - xhr.send(null); -}, - -getElementContent : function() { - hs.init(); - var attribs = window.opera || hs.ie6SSL ? { src: 'about:blank' } : null; - - this.iframe = hs.createElement('iframe', attribs, - { position: 'absolute', top: '-9999px' }, hs.container); - - this.loadHTML(); -}, - -loadHTML : function() { - var s = this.cachedGet || this.xhr.responseText, - regBody; - if (this.pre) hs.cachedGets[this.src] = s; - if (!hs.ie || hs.uaVersion >= 5.5) { - s = s.replace(new RegExp(']*>', 'gi'), '') - .replace(new RegExp(']*>.*?', 'gi'), ''); - if (this.iframe) { - var doc = this.iframe.contentDocument; - if (!doc && this.iframe.contentWindow) doc = this.iframe.contentWindow.document; - if (!doc) { // Opera - var pThis = this; - setTimeout(function() { pThis.loadHTML(); }, 25); - return; - } - doc.open(); - doc.write(s); - doc.close(); - try { s = doc.getElementById(this.id).innerHTML; } catch (e) { - try { s = this.iframe.document.getElementById(this.id).innerHTML; } catch (e) {} // opera - } - hs.discardElement(this.iframe); - } else { - regBody = /(]*>|<\/body>)/ig; - if (regBody.test(s)) s = s.split(regBody)[hs.ieLt9 ? 1 : 2]; - - } - } - hs.getElementByClass(this.content, 'DIV', 'highslide-body').innerHTML = s; - this.onLoad(); - for (var x in this) this[x] = null; -} -}; - - -hs.Slideshow = function (expKey, options) { - if (hs.dynamicallyUpdateAnchors !== false) hs.updateAnchors(); - this.expKey = expKey; - for (var x in options) this[x] = options[x]; - if (this.useControls) this.getControls(); - if (this.thumbstrip) this.thumbstrip = hs.Thumbstrip(this); -}; -hs.Slideshow.prototype = { -getControls: function() { - this.controls = hs.createElement('div', { innerHTML: hs.replaceLang(hs.skin.controls) }, - null, hs.container); - - var buttons = ['play', 'pause', 'previous', 'next', 'move', 'full-expand', 'close']; - this.btn = {}; - var pThis = this; - for (var i = 0; i < buttons.length; i++) { - this.btn[buttons[i]] = hs.getElementByClass(this.controls, 'li', 'highslide-'+ buttons[i]); - this.enable(buttons[i]); - } - this.btn.pause.style.display = 'none'; - //this.disable('full-expand'); -}, -checkFirstAndLast: function() { - if (this.repeat || !this.controls) return; - var exp = hs.expanders[this.expKey], - cur = exp.getAnchorIndex(), - re = /disabled$/; - if (cur == 0) - this.disable('previous'); - else if (re.test(this.btn.previous.getElementsByTagName('a')[0].className)) - this.enable('previous'); - if (cur + 1 == hs.anchors.groups[exp.slideshowGroup || 'none'].length) { - this.disable('next'); - this.disable('play'); - } else if (re.test(this.btn.next.getElementsByTagName('a')[0].className)) { - this.enable('next'); - this.enable('play'); - } -}, -enable: function(btn) { - if (!this.btn) return; - var sls = this, a = this.btn[btn].getElementsByTagName('a')[0], re = /disabled$/; - a.onclick = function() { - sls[btn](); - return false; - }; - if (re.test(a.className)) a.className = a.className.replace(re, ''); -}, -disable: function(btn) { - if (!this.btn) return; - var a = this.btn[btn].getElementsByTagName('a')[0]; - a.onclick = function() { return false; }; - if (!/disabled$/.test(a.className)) a.className += ' disabled'; -}, -hitSpace: function() { - if (this.autoplay) this.pause(); - else this.play(); -}, -play: function(wait) { - if (this.btn) { - this.btn.play.style.display = 'none'; - this.btn.pause.style.display = ''; - } - - this.autoplay = true; - if (!wait) hs.next(this.expKey); -}, -pause: function() { - if (this.btn) { - this.btn.pause.style.display = 'none'; - this.btn.play.style.display = ''; - } - - clearTimeout(this.autoplay); - this.autoplay = null; -}, -previous: function() { - this.pause(); - hs.previous(this.btn.previous); -}, -next: function() { - this.pause(); - hs.next(this.btn.next); -}, -move: function() {}, -'full-expand': function() { - hs.getExpander().doFullExpand(); -}, -close: function() { - hs.close(this.btn.close); -} -}; -hs.Thumbstrip = function(slideshow) { - function add (exp) { - hs.extend(options || {}, { - overlayId: dom, - hsId: 'thumbstrip', - className: 'highslide-thumbstrip-'+ mode +'-overlay ' + (options.className || '') - }); - if (hs.ieLt7) options.fade = 0; - exp.createOverlay(options); - hs.setStyles(dom.parentNode, { overflow: 'hidden' }); - }; - - function scroll (delta) { - selectThumb(undefined, Math.round(delta * dom[isX ? 'offsetWidth' : 'offsetHeight'] * 0.7)); - }; - - function selectThumb (i, scrollBy) { - if (i === undefined) for (var j = 0; j < group.length; j++) { - if (group[j] == hs.expanders[slideshow.expKey].a) { - i = j; - break; - } - } - if (i === undefined) return; - var as = dom.getElementsByTagName('a'), - active = as[i], - cell = active.parentNode, - left = isX ? 'Left' : 'Top', - right = isX ? 'Right' : 'Bottom', - width = isX ? 'Width' : 'Height', - offsetLeft = 'offset' + left, - offsetWidth = 'offset' + width, - overlayWidth = div.parentNode.parentNode[offsetWidth], - minTblPos = overlayWidth - table[offsetWidth], - curTblPos = parseInt(table.style[isX ? 'left' : 'top']) || 0, - tblPos = curTblPos, - mgnRight = 20; - if (scrollBy !== undefined) { - tblPos = curTblPos - scrollBy; - - if (minTblPos > 0) minTblPos = 0; - if (tblPos > 0) tblPos = 0; - if (tblPos < minTblPos) tblPos = minTblPos; - - - } else { - for (var j = 0; j < as.length; j++) as[j].className = ''; - active.className = 'highslide-active-anchor'; - var activeLeft = i > 0 ? as[i - 1].parentNode[offsetLeft] : cell[offsetLeft], - activeRight = cell[offsetLeft] + cell[offsetWidth] + - (as[i + 1] ? as[i + 1].parentNode[offsetWidth] : 0); - if (activeRight > overlayWidth - curTblPos) tblPos = overlayWidth - activeRight; - else if (activeLeft < -curTblPos) tblPos = -activeLeft; - } - var markerPos = cell[offsetLeft] + (cell[offsetWidth] - marker[offsetWidth]) / 2 + tblPos; - hs.animate(table, isX ? { left: tblPos } : { top: tblPos }, null, 'easeOutQuad'); - hs.animate(marker, isX ? { left: markerPos } : { top: markerPos }, null, 'easeOutQuad'); - scrollUp.style.display = tblPos < 0 ? 'block' : 'none'; - scrollDown.style.display = (tblPos > minTblPos) ? 'block' : 'none'; - - }; - - - // initialize - var group = hs.anchors.groups[hs.expanders[slideshow.expKey].slideshowGroup || 'none'], - options = slideshow.thumbstrip, - mode = options.mode || 'horizontal', - floatMode = (mode == 'float'), - tree = floatMode ? ['div', 'ul', 'li', 'span'] : ['table', 'tbody', 'tr', 'td'], - isX = (mode == 'horizontal'), - dom = hs.createElement('div', { - className: 'highslide-thumbstrip highslide-thumbstrip-'+ mode, - innerHTML: - '
    '+ - '<'+ tree[0] +'><'+ tree[1] +'>
    '+ - '
    '+ - '
    '+ - '
    ' - }, { - display: 'none' - }, hs.container), - domCh = dom.childNodes, - div = domCh[0], - scrollUp = domCh[1], - scrollDown = domCh[2], - marker = domCh[3], - table = div.firstChild, - tbody = dom.getElementsByTagName(tree[1])[0], - tr; - for (var i = 0; i < group.length; i++) { - if (i == 0 || !isX) tr = hs.createElement(tree[2], null, null, tbody); - (function(){ - var a = group[i], - cell = hs.createElement(tree[3], null, null, tr), - pI = i; - hs.createElement('a', { - href: a.href, - title: a.title, - onclick: function() { - if (/highslide-active-anchor/.test(this.className)) return false; - hs.getExpander(this).focus(); - return hs.transit(a); - }, - innerHTML: hs.stripItemFormatter ? hs.stripItemFormatter(a) : a.innerHTML - }, null, cell); - })(); - } - if (!floatMode) { - scrollUp.onclick = function () { scroll(-1); }; - scrollDown.onclick = function() { scroll(1); }; - hs.addEventListener(tbody, document.onmousewheel !== undefined ? - 'mousewheel' : 'DOMMouseScroll', function(e) { - var delta = 0; - e = e || window.event; - if (e.wheelDelta) { - delta = e.wheelDelta/120; - if (hs.opera) delta = -delta; - } else if (e.detail) { - delta = -e.detail/3; - } - if (delta) scroll(-delta * 0.2); - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - }); - } - - return { - add: add, - selectThumb: selectThumb - } -}; -hs.langDefaults = hs.lang; -// history -var HsExpander = hs.Expander; -if (hs.ie && window == window.top) { - (function () { - try { - document.documentElement.doScroll('left'); - } catch (e) { - setTimeout(arguments.callee, 50); - return; - } - hs.ready(); - })(); -} -hs.addEventListener(document, 'DOMContentLoaded', hs.ready); -hs.addEventListener(window, 'load', hs.ready); - -// set handlers -hs.addEventListener(document, 'ready', function() { - if (hs.expandCursor || hs.dimmingOpacity) { - var style = hs.createElement('style', { type: 'text/css' }, null, - document.getElementsByTagName('HEAD')[0]), - backCompat = document.compatMode == 'BackCompat'; - - - function addRule(sel, dec) { - if (hs.ie && (hs.uaVersion < 9 || backCompat)) { - var last = document.styleSheets[document.styleSheets.length - 1]; - if (typeof(last.addRule) == "object") last.addRule(sel, dec); - } else { - style.appendChild(document.createTextNode(sel + " {" + dec + "}")); - } - } - function fix(prop) { - return 'expression( ( ( ignoreMe = document.documentElement.'+ prop + - ' ? document.documentElement.'+ prop +' : document.body.'+ prop +' ) ) + \'px\' );'; - } - if (hs.expandCursor) addRule ('.highslide img', - 'cursor: url('+ hs.graphicsDir + hs.expandCursor +'), pointer !important;'); - addRule ('.highslide-viewport-size', - hs.ie && (hs.uaVersion < 7 || backCompat) ? - 'position: absolute; '+ - 'left:'+ fix('scrollLeft') + - 'top:'+ fix('scrollTop') + - 'width:'+ fix('clientWidth') + - 'height:'+ fix('clientHeight') : - 'position: fixed; width: 100%; height: 100%; left: 0; top: 0'); - } -}); -hs.addEventListener(window, 'resize', function() { - hs.getPageSize(); - if (hs.viewport) for (var i = 0; i < hs.viewport.childNodes.length; i++) { - var node = hs.viewport.childNodes[i], - exp = hs.getExpander(node); - exp.positionOverlay(node); - if (node.hsId == 'thumbstrip') exp.slideshow.thumbstrip.selectThumb(); - } -}); -hs.addEventListener(document, 'mousemove', function(e) { - hs.mouse = { x: e.clientX, y: e.clientY }; -}); -hs.addEventListener(document, 'mousedown', hs.mouseClickHandler); -hs.addEventListener(document, 'mouseup', hs.mouseClickHandler); -hs.addEventListener(document, 'ready', hs.setClickEvents); -hs.addEventListener(window, 'load', hs.preloadImages); -hs.addEventListener(window, 'load', hs.preloadAjax); -} diff --git a/Website/static/highslide/highslide/highslide-full.min.js b/Website/static/highslide/highslide/highslide-full.min.js deleted file mode 100644 index a20c406..0000000 --- a/Website/static/highslide/highslide/highslide-full.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Name: Highslide JS - * Version: 4.1.13 (2011-10-06) - * Config: default +events +unobtrusive +imagemap +slideshow +positioning +transitions +viewport +thumbstrip +inline +ajax +iframe +flash - * Author: Torstein Hønsi - * Support: www.highslide.com/support - * License: www.highslide.com/#license - */ -if(!hs){var hs={lang:{cssDirection:"ltr",loadingText:"Loading...",loadingTitle:"Click to cancel",focusTitle:"Click to bring to front",fullExpandTitle:"Expand to actual size (f)",creditsText:"Powered by Highslide JS",creditsTitle:"Go to the Highslide JS homepage",previousText:"Previous",nextText:"Next",moveText:"Move",closeText:"Close",closeTitle:"Close (esc)",resizeTitle:"Resize",playText:"Play",playTitle:"Play slideshow (spacebar)",pauseText:"Pause",pauseTitle:"Pause slideshow (spacebar)",previousTitle:"Previous (arrow left)",nextTitle:"Next (arrow right)",moveTitle:"Move",fullExpandText:"1:1",number:"Image %1 of %2",restoreTitle:"Click to close image, click and drag to move. Use arrow keys for next and previous."},graphicsDir:"highslide/graphics/",expandCursor:"zoomin.cur",restoreCursor:"zoomout.cur",expandDuration:250,restoreDuration:250,marginLeft:15,marginRight:15,marginTop:15,marginBottom:15,zIndexCounter:1001,loadingOpacity:0.75,allowMultipleInstances:true,numberOfImagesToPreload:5,outlineWhileAnimating:2,outlineStartOffset:3,padToMinWidth:false,fullExpandPosition:"bottom right",fullExpandOpacity:1,showCredits:true,creditsHref:"http://highslide.com/",creditsTarget:"_self",enableKeyListener:true,openerTagNames:["a","area"],transitions:[],transitionDuration:250,dimmingOpacity:0,dimmingDuration:50,allowWidthReduction:false,allowHeightReduction:true,preserveContent:true,objectLoadTime:"before",cacheAjax:true,anchor:"auto",align:"auto",targetX:null,targetY:null,dragByHeading:true,minWidth:200,minHeight:200,allowSizeReduction:true,outlineType:"drop-shadow",skin:{controls:'',contentWrapper:'
    '},preloadTheseImages:[],continuePreloading:true,expanders:[],overrides:["allowSizeReduction","useBox","anchor","align","targetX","targetY","outlineType","outlineWhileAnimating","captionId","captionText","captionEval","captionOverlay","headingId","headingText","headingEval","headingOverlay","creditsPosition","dragByHeading","autoplay","numberPosition","transitions","dimmingOpacity","width","height","contentId","allowWidthReduction","allowHeightReduction","preserveContent","maincontentId","maincontentText","maincontentEval","objectType","cacheAjax","objectWidth","objectHeight","objectLoadTime","swfOptions","wrapperClassName","minWidth","minHeight","maxWidth","maxHeight","pageOrigin","slideshowGroup","easing","easingClose","fadeInOut","src"],overlays:[],idCounter:0,oPos:{x:["leftpanel","left","center","right","rightpanel"],y:["above","top","middle","bottom","below"]},mouse:{},headingOverlay:{},captionOverlay:{},swfOptions:{flashvars:{},params:{},attributes:{}},timers:[],slideshows:[],pendingOutlines:{},sleeping:[],preloadTheseAjax:[],cacheBindings:[],cachedGets:{},clones:{},onReady:[],uaVersion:/Trident\/4\.0/.test(navigator.userAgent)?8:parseFloat((navigator.userAgent.toLowerCase().match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1]),ie:(document.all&&!window.opera),safari:/Safari/.test(navigator.userAgent),geckoMac:/Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent),$:function(a){if(a){return document.getElementById(a)}},push:function(a,b){a[a.length]=b},createElement:function(a,f,e,d,c){var b=document.createElement(a);if(f){hs.extend(b,f)}if(c){hs.setStyles(b,{padding:0,border:"none",margin:0})}if(e){hs.setStyles(b,e)}if(d){d.appendChild(b)}return b},extend:function(b,c){for(var a in c){b[a]=c[a]}return b},setStyles:function(b,c){for(var a in c){if(hs.ieLt9&&a=="opacity"){if(c[a]>0.99){b.style.removeAttribute("filter")}else{b.style.filter="alpha(opacity="+(c[a]*100)+")"}}else{b.style[a]=c[a]}}},animate:function(f,a,d){var c,g,j;if(typeof d!="object"||d===null){var i=arguments;d={duration:i[2],easing:i[3],complete:i[4]}}if(typeof d.duration!="number"){d.duration=250}d.easing=Math[d.easing]||Math.easeInQuad;d.curAnim=hs.extend({},a);for(var b in a){var h=new hs.fx(f,d,b);c=parseFloat(hs.css(f,b))||0;g=parseFloat(a[b]);j=b!="opacity"?"px":"";h.custom(c,g,j)}},css:function(a,c){if(a.style[c]){return a.style[c]}else{if(document.defaultView){return document.defaultView.getComputedStyle(a,null).getPropertyValue(c)}else{if(c=="opacity"){c="filter"}var b=a.currentStyle[c.replace(/\-(\w)/g,function(e,d){return d.toUpperCase()})];if(c=="filter"){b=b.replace(/alpha\(opacity=([0-9]+)\)/,function(e,d){return d/100})}return b===""?1:b}}},getPageSize:function(){var f=document,b=window,e=f.compatMode&&f.compatMode!="BackCompat"?f.documentElement:f.body,g=hs.ie&&(hs.uaVersion<9||typeof pageXOffset=="undefined");var c=g?e.clientWidth:(f.documentElement.clientWidth||self.innerWidth),a=g?e.clientHeight:self.innerHeight;hs.page={width:c,height:a,scrollLeft:g?e.scrollLeft:pageXOffset,scrollTop:g?e.scrollTop:pageYOffset};return hs.page},getPosition:function(c){if(/area/i.test(c.tagName)){var e=document.getElementsByTagName("img");for(var b=0;bc){c=f;b=d}}}if(b==-1){hs.focusKey=-1}else{a[b].focus()}},getParam:function(b,d){b.getParams=b.onclick;var c=b.getParams?b.getParams():null;b.getParams=null;return(c&&typeof c[d]!="undefined")?c[d]:(typeof hs[d]!="undefined"?hs[d]:null)},getSrc:function(b){var c=hs.getParam(b,"src");if(c){return c}return b.href},getNode:function(e){var c=hs.$(e),d=hs.clones[e],b={};if(!c&&!d){return null}if(!d){d=c.cloneNode(true);d.id="";hs.clones[e]=d;return c}else{return d.cloneNode(true)}},discardElement:function(a){if(a){hs.garbageBin.appendChild(a)}hs.garbageBin.innerHTML=""},dim:function(d){if(!hs.dimmer){a=true;hs.dimmer=hs.createElement("div",{className:"highslide-dimming highslide-viewport-size",owner:"",onclick:function(){if(hs.fireEvent(hs,"onDimmerClick")){hs.close()}}},{visibility:"visible",opacity:0},hs.container,true);if(/(Android|iPad|iPhone|iPod)/.test(navigator.userAgent)){var b=document.body;function c(){hs.setStyles(hs.dimmer,{width:b.scrollWidth+"px",height:b.scrollHeight+"px"})}c();hs.addEventListener(window,"resize",c)}}hs.dimmer.style.display="";var a=hs.dimmer.owner=="";hs.dimmer.owner+="|"+d.key;if(a){if(hs.geckoMac&&hs.dimmingGeckoFix){hs.setStyles(hs.dimmer,{background:"url("+hs.graphicsDir+"geckodimmer.png)",opacity:1})}else{hs.animate(hs.dimmer,{opacity:d.dimmingOpacity},hs.dimmingDuration)}}},undim:function(a){if(!hs.dimmer){return}if(typeof a!="undefined"){hs.dimmer.owner=hs.dimmer.owner.replace("|"+a,"")}if((typeof a!="undefined"&&hs.dimmer.owner!="")||(hs.upcoming&&hs.getParam(hs.upcoming,"dimmingOpacity"))){return}if(hs.geckoMac&&hs.dimmingGeckoFix){hs.dimmer.style.display="none"}else{hs.animate(hs.dimmer,{opacity:0},hs.dimmingDuration,null,function(){hs.dimmer.style.display="none"})}},transit:function(a,d){var b=d||hs.getExpander();d=b;if(hs.upcoming){return false}else{hs.last=b}hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler);try{hs.upcoming=a;a.onclick()}catch(c){hs.last=hs.upcoming=null}try{if(!a||d.transitions[1]!="crossfade"){d.close()}}catch(c){}return false},previousOrNext:function(a,c){var b=hs.getExpander(a);if(b){return hs.transit(b.getAdjacentAnchor(c),b)}else{return false}},previous:function(a){return hs.previousOrNext(a,-1)},next:function(a){return hs.previousOrNext(a,1)},keyHandler:function(a){if(!a){a=window.event}if(!a.target){a.target=a.srcElement}if(typeof a.target.form!="undefined"){return true}if(!hs.fireEvent(hs,"onKeyDown",a)){return true}var b=hs.getExpander();var c=null;switch(a.keyCode){case 70:if(b){b.doFullExpand()}return true;case 32:c=2;break;case 34:case 39:case 40:c=1;break;case 8:case 33:case 37:case 38:c=-1;break;case 27:case 13:c=0}if(c!==null){if(c!=2){hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler)}if(!hs.enableKeyListener){return true}if(a.preventDefault){a.preventDefault()}else{a.returnValue=false}if(b){if(c==0){b.close()}else{if(c==2){if(b.slideshow){b.slideshow.hitSpace()}}else{if(b.slideshow){b.slideshow.pause()}hs.previousOrNext(b.key,c)}}return false}}return true},registerOverlay:function(a){hs.push(hs.overlays,hs.extend(a,{hsId:"hsId"+hs.idCounter++}))},addSlideshow:function(b){var d=b.slideshowGroup;if(typeof d=="object"){for(var c=0;c1){return true}if(!d.target){d.target=d.srcElement}var b=d.target;while(b.parentNode&&!(/highslide-(image|move|html|resize)/.test(b.className))){b=b.parentNode}var f=hs.getExpander(b);if(f&&(f.isClosing||!f.isExpanded)){return true}if(f&&d.type=="mousedown"){if(d.target.form){return true}var a=b.className.match(/highslide-(image|move|resize)/);if(a){hs.dragArgs={exp:f,type:a[1],left:f.x.pos,width:f.x.size,top:f.y.pos,height:f.y.size,clickX:d.clientX,clickY:d.clientY};hs.addEventListener(document,"mousemove",hs.dragHandler);if(d.preventDefault){d.preventDefault()}if(/highslide-(image|html)-blur/.test(f.content.className)){f.focus();hs.hasFocused=true}return false}else{if(/highslide-html/.test(b.className)&&hs.focusKey!=f.key){f.focus();f.doShowHide("hidden")}}}else{if(d.type=="mouseup"){hs.removeEventListener(document,"mousemove",hs.dragHandler);if(hs.dragArgs){if(hs.styleRestoreCursor&&hs.dragArgs.type=="image"){hs.dragArgs.exp.content.style.cursor=hs.styleRestoreCursor}var c=hs.dragArgs.hasDragged;if(!c&&!hs.hasFocused&&!/(move|resize)/.test(hs.dragArgs.type)){if(hs.fireEvent(f,"onImageClick")){f.close()}}else{if(c||(!c&&hs.hasHtmlExpanders)){hs.dragArgs.exp.doShowHide("hidden")}}if(hs.dragArgs.exp.releaseMask){hs.dragArgs.exp.releaseMask.style.display="none"}if(c){hs.fireEvent(hs.dragArgs.exp,"onDrop",hs.dragArgs)}hs.hasFocused=false;hs.dragArgs=null}else{if(/highslide-image-blur/.test(b.className)){b.style.cursor=hs.styleRestoreCursor}}}}return false},dragHandler:function(c){if(!hs.dragArgs){return true}if(!c){c=window.event}var b=hs.dragArgs,d=b.exp;if(d.iframe){if(!d.releaseMask){d.releaseMask=hs.createElement("div",null,{position:"absolute",width:d.x.size+"px",height:d.y.size+"px",left:d.x.cb+"px",top:d.y.cb+"px",zIndex:4,background:(hs.ieLt9?"white":"none"),opacity:0.01},d.wrapper,true)}if(d.releaseMask.style.display=="none"){d.releaseMask.style.display=""}}b.dX=c.clientX-b.clickX;b.dY=c.clientY-b.clickY;var f=Math.sqrt(Math.pow(b.dX,2)+Math.pow(b.dY,2));if(!b.hasDragged){b.hasDragged=(b.type!="image"&&f>0)||(f>(hs.dragSensitivity||5))}if(b.hasDragged&&c.clientX>5&&c.clientY>5){if(!hs.fireEvent(d,"onDrag",b)){return false}if(b.type=="resize"){d.resize(b)}else{d.moveTo(b.left+b.dX,b.top+b.dY);if(b.type=="image"){d.content.style.cursor="move"}}}return false},wrapperMouseHandler:function(c){try{if(!c){c=window.event}var b=/mouseover/i.test(c.type);if(!c.target){c.target=c.srcElement}if(!c.relatedTarget){c.relatedTarget=b?c.fromElement:c.toElement}var d=hs.getExpander(c.target);if(!d.isExpanded){return}if(!d||!c.relatedTarget||hs.getExpander(c.relatedTarget,true)==d||hs.dragArgs){return}hs.fireEvent(d,b?"onMouseOver":"onMouseOut",c);for(var a=0;a=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var a=true;for(var b in this.options.curAnim){if(this.options.curAnim[b]!==true){a=false}}if(a){if(this.options.complete){this.options.complete.call(this.elem)}}return false}else{var e=c-this.startTime;this.state=e/this.options.duration;this.pos=this.options.easing(e,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};hs.extend(hs.fx,{step:{opacity:function(a){hs.setStyles(a.elem,{opacity:a.now})},_default:function(a){try{if(a.elem.style&&a.elem.style[a.prop]!=null){a.elem.style[a.prop]=a.now+a.unit}else{a.elem[a.prop]=a.now}}catch(b){}}}});hs.Outline=function(g,e){this.onLoad=e;this.outlineType=g;var a=hs.uaVersion,f;this.hasAlphaImageLoader=hs.ie&&hs.uaVersion<7;if(!g){if(e){e()}return}hs.init();this.table=hs.createElement("table",{cellSpacing:0},{visibility:"hidden",position:"absolute",borderCollapse:"collapse",width:0},hs.container,true);var b=hs.createElement("tbody",null,null,this.table,1);this.td=[];for(var c=0;c<=8;c++){if(c%3==0){f=hs.createElement("tr",null,{height:"auto"},b,true)}this.td[c]=hs.createElement("td",null,null,f,true);var d=c!=4?{lineHeight:0,fontSize:0}:{position:"relative"};hs.setStyles(this.td[c],d)}this.td[4].className=g+" highslide-outline";this.preloadGraphic()};hs.Outline.prototype={preloadGraphic:function(){var b=hs.graphicsDir+(hs.outlinesDir||"outlines/")+this.outlineType+".png";var a=hs.safari&&hs.uaVersion<525?hs.container:null;this.graphic=hs.createElement("img",null,{position:"absolute",top:"-9999px"},a,true);var c=this;this.graphic.onload=function(){c.onGraphicLoad()};this.graphic.src=b},onGraphicLoad:function(){var d=this.offset=this.graphic.width/4,f=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],c={height:(2*d)+"px",width:(2*d)+"px"};for(var b=0;b<=8;b++){if(f[b]){if(this.hasAlphaImageLoader){var a=(b==1||b==7)?"100%":this.graphic.width+"px";var e=hs.createElement("div",null,{width:"100%",height:"100%",position:"relative",overflow:"hidden"},this.td[b],true);hs.createElement("div",null,{filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+this.graphic.src+"')",position:"absolute",width:a,height:this.graphic.height+"px",left:(f[b][0]*d)+"px",top:(f[b][1]*d)+"px"},e,true)}else{hs.setStyles(this.td[b],{background:"url("+this.graphic.src+") "+(f[b][0]*d)+"px "+(f[b][1]*d)+"px"})}if(window.opera&&(b==3||b==5)){hs.createElement("div",null,c,this.td[b],true)}hs.setStyles(this.td[b],c)}}this.graphic=null;if(hs.pendingOutlines[this.outlineType]){hs.pendingOutlines[this.outlineType].destroy()}hs.pendingOutlines[this.outlineType]=this;if(this.onLoad){this.onLoad()}},setPosition:function(g,e,c,b,f){var d=this.exp,a=d.wrapper.style,e=e||0,g=g||{x:d.x.pos+e,y:d.y.pos+e,w:d.x.get("wsize")-2*e,h:d.y.get("wsize")-2*e};if(c){this.table.style.visibility=(g.h>=4*this.offset)?"visible":"hidden"}hs.setStyles(this.table,{left:(g.x-this.offset)+"px",top:(g.y-this.offset)+"px",width:(g.w+2*this.offset)+"px"});g.w-=2*this.offset;g.h-=2*this.offset;hs.setStyles(this.td[4],{width:g.w>=0?g.w+"px":0,height:g.h>=0?g.h+"px":0});if(this.hasAlphaImageLoader){this.td[3].style.height=this.td[5].style.height=this.td[4].style.height}},destroy:function(a){if(a){this.table.style.visibility="hidden"}else{hs.discardElement(this.table)}}};hs.Dimension=function(b,a){this.exp=b;this.dim=a;this.ucwh=a=="x"?"Width":"Height";this.wh=this.ucwh.toLowerCase();this.uclt=a=="x"?"Left":"Top";this.lt=this.uclt.toLowerCase();this.ucrb=a=="x"?"Right":"Bottom";this.rb=this.ucrb.toLowerCase();this.p1=this.p2=0};hs.Dimension.prototype={get:function(a){switch(a){case"loadingPos":return this.tpos+this.tb+(this.t-hs.loading["offset"+this.ucwh])/2;case"loadingPosXfade":return this.pos+this.cb+this.p1+(this.size-hs.loading["offset"+this.ucwh])/2;case"wsize":return this.size+2*this.cb+this.p1+this.p2;case"fitsize":return this.clientSize-this.marginMin-this.marginMax;case"maxsize":return this.get("fitsize")-2*this.cb-this.p1-this.p2;case"opos":return this.pos-(this.exp.outline?this.exp.outline.offset:0);case"osize":return this.get("wsize")+(this.exp.outline?2*this.exp.outline.offset:0);case"imgPad":return this.imgSize?Math.round((this.size-this.imgSize)/2):0}},calcBorders:function(){this.cb=(this.exp.content["offset"+this.ucwh]-this.t)/2;this.marginMax=hs["margin"+this.ucrb]},calcThumb:function(){this.t=this.exp.el[this.wh]?parseInt(this.exp.el[this.wh]):this.exp.el["offset"+this.ucwh];this.tpos=this.exp.tpos[this.dim];this.tb=(this.exp.el["offset"+this.ucwh]-this.t)/2;if(this.tpos==0||this.tpos==-1){this.tpos=(hs.page[this.wh]/2)+hs.page["scroll"+this.uclt]}},calcExpanded:function(){var a=this.exp;this.justify="auto";if(a.align=="center"){this.justify="center"}else{if(new RegExp(this.lt).test(a.anchor)){this.justify=null}else{if(new RegExp(this.rb).test(a.anchor)){this.justify="max"}}}this.pos=this.tpos-this.cb+this.tb;if(this.maxHeight&&this.dim=="x"){a.maxWidth=Math.min(a.maxWidth||this.full,a.maxHeight*this.full/a.y.full)}this.size=Math.min(this.full,a["max"+this.ucwh]||this.full);this.minSize=a.allowSizeReduction?Math.min(a["min"+this.ucwh],this.full):this.full;if(a.isImage&&a.useBox){this.size=a[this.wh];this.imgSize=this.full}if(this.dim=="x"&&hs.padToMinWidth){this.minSize=a.minWidth}this.target=a["target"+this.dim.toUpperCase()];this.marginMin=hs["margin"+this.uclt];this.scroll=hs.page["scroll"+this.uclt];this.clientSize=hs.page[this.wh]},setSize:function(a){var f=this.exp;if(f.isImage&&(f.useBox||hs.padToMinWidth)){this.imgSize=a;this.size=Math.max(this.size,this.imgSize);f.content.style[this.lt]=this.get("imgPad")+"px"}else{this.size=a}f.content.style[this.wh]=a+"px";f.wrapper.style[this.wh]=this.get("wsize")+"px";if(f.outline){f.outline.setPosition()}if(f.releaseMask){f.releaseMask.style[this.wh]=a+"px"}if(this.dim=="y"&&f.iDoc&&f.body.style.height!="auto"){try{f.iDoc.body.style.overflow="auto"}catch(b){}}if(f.isHtml){var c=f.scrollerDiv;if(this.sizeDiff===undefined){this.sizeDiff=f.innerContent["offset"+this.ucwh]-c["offset"+this.ucwh]}c.style[this.wh]=(this.size-this.sizeDiff)+"px";if(this.dim=="x"){f.mediumContent.style.width="auto"}if(f.body){f.body.style[this.wh]="auto"}}if(this.dim=="x"&&f.overlayBox){f.sizeOverlayBox(true)}if(this.dim=="x"&&f.slideshow&&f.isImage){if(a==this.full){f.slideshow.disable("full-expand")}else{f.slideshow.enable("full-expand")}}},setPos:function(a){this.pos=a;this.exp.wrapper.style[this.lt]=a+"px";if(this.exp.outline){this.exp.outline.setPosition()}}};hs.Expander=function(k,f,b,l){if(document.readyState&&hs.ie&&!hs.isReady){hs.addEventListener(document,"ready",function(){new hs.Expander(k,f,b,l)});return}this.a=k;this.custom=b;this.contentType=l||"image";this.isHtml=(l=="html");this.isImage=!this.isHtml;hs.continuePreloading=false;this.overlays=[];this.last=hs.last;hs.last=null;hs.init();var m=this.key=hs.expanders.length;for(var g=0;ga.scroll+a.clientSize-a.marginMax){a.pos=a.scroll+a.clientSize-a.size-a.marginMin-a.marginMax-a.p1-a.p2}if(a.pos(this.x.imgSize||this.x.size)){this.createFullExpand();if(this.overlays.length==1){this.sizeOverlayBox()}}}this.show()}catch(d){this.error(d)}},setObjContainerSize:function(a,d){var b=hs.getElementByClass(a,"DIV","highslide-body");if(/(iframe|swf)/.test(this.objectType)){if(this.objectWidth){b.style.width=this.objectWidth+"px"}if(this.objectHeight){b.style.height=this.objectHeight+"px"}}},writeExtendedContent:function(){if(this.hasExtendedContent){return}var f=this;this.body=hs.getElementByClass(this.innerContent,"DIV","highslide-body");if(this.objectType=="iframe"){this.showLoading();var g=hs.clearing.cloneNode(1);this.body.appendChild(g);this.newWidth=this.innerContent.offsetWidth;if(!this.objectWidth){this.objectWidth=g.offsetWidth}var c=this.innerContent.offsetHeight-this.body.offsetHeight,d=this.objectHeight||hs.page.height-c-hs.marginTop-hs.marginBottom,e=this.objectLoadTime=="before"?' onload="if (hs.expanders['+this.key+"]) hs.expanders["+this.key+'].contentLoaded()" ':"";this.body.innerHTML+='';this.ruler=this.body.getElementsByTagName("div")[0];this.iframe=this.body.getElementsByTagName("iframe")[0];if(this.objectLoadTime=="after"){this.correctIframeSize()}}if(this.objectType=="swf"){this.body.id=this.body.id||"hs-flash-id-"+this.key;var b=this.swfOptions;if(!b.params){b.params={}}if(typeof b.params.wmode=="undefined"){b.params.wmode="transparent"}if(swfobject){swfobject.embedSWF(this.src,this.body.id,this.objectWidth,this.objectHeight,b.version||"7",b.expressInstallSwfurl,b.flashvars,b.params,b.attributes)}}this.hasExtendedContent=true},htmlGetSize:function(){if(this.iframe&&!this.objectHeight){this.iframe.style.height=this.body.style.height=this.getIframePageHeight()+"px"}this.innerContent.appendChild(hs.clearing);if(!this.x.full){this.x.full=this.innerContent.offsetWidth}this.y.full=this.innerContent.offsetHeight;this.innerContent.removeChild(hs.clearing);if(hs.ie&&this.newHeight>parseInt(this.innerContent.currentStyle.height)){this.newHeight=parseInt(this.innerContent.currentStyle.height)}hs.setStyles(this.wrapper,{position:"absolute",padding:"0"});hs.setStyles(this.content,{width:this.x.t+"px",height:this.y.t+"px"})},getIframePageHeight:function(){var a;try{var d=this.iDoc=this.iframe.contentDocument||this.iframe.contentWindow.document;var b=d.createElement("div");b.style.clear="both";d.body.appendChild(b);a=b.offsetTop;if(hs.ie){a+=parseInt(d.body.currentStyle.marginTop)+parseInt(d.body.currentStyle.marginBottom)-1}}catch(c){a=300}return a},correctIframeSize:function(){var b=this.innerContent.offsetWidth-this.ruler.offsetWidth;hs.discardElement(this.ruler);if(b<0){b=0}var a=this.innerContent.offsetHeight-this.iframe.offsetHeight;if(this.iDoc&&!this.objectHeight&&!this.height&&this.y.size==this.y.full){try{this.iDoc.body.style.overflow="hidden"}catch(c){}}hs.setStyles(this.iframe,{width:Math.abs(this.x.size-b)+"px",height:Math.abs(this.y.size-a)+"px"});hs.setStyles(this.body,{width:this.iframe.style.width,height:this.iframe.style.height});this.scrollingContent=this.iframe;this.scrollerDiv=this.scrollingContent},htmlSizeOperations:function(){this.setObjContainerSize(this.innerContent);if(this.objectType=="swf"&&this.objectLoadTime=="before"){this.writeExtendedContent()}if(this.x.sizee.offsetHeight){e.style.width=(parseInt(e.style.width)+d)+"px"}this.scrollingContent=e;this.scrollerDiv=this.scrollingContent}if(this.iframe&&this.objectLoadTime=="before"){this.correctIframeSize()}if(!this.scrollingContent&&this.y.sizethis.scrollerDiv.parentNode.offsetHeight){setTimeout("try { hs.expanders["+this.key+"].scrollerDiv.style.overflow = 'auto'; } catch(e) {}",hs.expandDuration)}},getImageMapAreaCorrection:function(d){var h=d.coords.split(",");for(var b=0;bf.scroll+f.clientSize-f.marginMax){if(!b&&d&&a){f.size=Math.min(f.size,f.get(e=="y"?"fitsize":"maxsize"))}else{if(f.get("wsize")c){d=b*c;if(dthis.minHeight&&a.size>this.minWidth&&d.get("wsize")>d.get("fitsize")){d.size-=10;if(b){a.size=d.size*b}this.sizeOverlayBox(0,1);c=true}}return c},reflow:function(){if(this.scrollerDiv){var a=/iframe/i.test(this.scrollerDiv.tagName)?(this.getIframePageHeight()+1)+"px":"auto";if(this.body){this.body.style.height=a}this.scrollerDiv.style.height=a;this.y.setSize(this.innerContent.offsetHeight)}},show:function(){var a=this.x,b=this.y;this.doShowHide("hidden");hs.fireEvent(this,"onBeforeExpand");if(this.slideshow&&this.slideshow.thumbstrip){this.slideshow.thumbstrip.selectThumb()}this.changeSize(1,{wrapper:{width:a.get("wsize"),height:b.get("wsize"),left:a.pos,top:b.pos},content:{left:a.p1+a.get("imgPad"),top:b.p1+b.get("imgPad"),width:a.imgSize||a.size,height:b.imgSize||b.size}},hs.expandDuration)},changeSize:function(d,i,b){var k=this.transitions,e=d?(this.last?this.last.a:null):hs.upcoming,j=(k[1]&&e&&hs.getParam(e,"transitions")[1]==k[1])?k[1]:k[0];if(this[j]&&j!="expand"){this[j](d,i);return}if(this.outline&&!this.outlineWhileAnimating){if(d){this.outline.setPosition()}else{this.outline.destroy((this.isHtml&&this.preserveContent))}}if(!d){this.destroyOverlays()}var c=this,h=c.x,g=c.y,f=this.easing;if(!d){f=this.easingClose||f}var a=d?function(){if(c.outline){c.outline.table.style.visibility="visible"}setTimeout(function(){c.afterExpand()},50)}:function(){c.afterClose()};if(d){hs.setStyles(this.wrapper,{width:h.t+"px",height:g.t+"px"})}if(d&&this.isHtml){hs.setStyles(this.wrapper,{left:(h.tpos-h.cb+h.tb)+"px",top:(g.tpos-g.cb+g.tb)+"px"})}if(this.fadeInOut){hs.setStyles(this.wrapper,{opacity:d?0:1});hs.extend(i.wrapper,{opacity:d})}hs.animate(this.wrapper,i.wrapper,{duration:b,easing:f,step:function(n,l){if(c.outline&&c.outlineWhileAnimating&&l.prop=="top"){var m=d?l.pos:1-l.pos;var o={w:h.t+(h.get("wsize")-h.t)*m,h:g.t+(g.get("wsize")-g.t)*m,x:h.tpos+(h.pos-h.tpos)*m,y:g.tpos+(g.pos-g.tpos)*m};c.outline.setPosition(o,0,1)}if(c.isHtml){if(l.prop=="left"){c.mediumContent.style.left=(h.pos-n)+"px"}if(l.prop=="top"){c.mediumContent.style.top=(g.pos-n)+"px"}}}});hs.animate(this.content,i.content,b,f,a);if(d){this.wrapper.style.visibility="visible";this.content.style.visibility="visible";if(this.isHtml){this.innerContent.style.visibility="visible"}this.a.className+=" highslide-active-anchor"}},fade:function(f,h){this.outlineWhileAnimating=false;var c=this,j=f?hs.expandDuration:0;if(f){hs.animate(this.wrapper,h.wrapper,0);hs.setStyles(this.wrapper,{opacity:0,visibility:"visible"});hs.animate(this.content,h.content,0);this.content.style.visibility="visible";hs.animate(this.wrapper,{opacity:1},j,null,function(){c.afterExpand()})}if(this.outline){this.outline.table.style.zIndex=this.wrapper.style.zIndex;var b=f||-1,d=this.outline.offset,a=f?3:d,g=f?d:3;for(var e=a;b*e<=b*g;e+=b,j+=25){(function(){var i=f?g-e:a-e;setTimeout(function(){c.outline.setPosition(0,i,1)},j)})()}}if(f){}else{setTimeout(function(){if(c.outline){c.outline.destroy(c.preserveContent)}c.destroyOverlays();hs.animate(c.wrapper,{opacity:0},hs.restoreDuration,null,function(){c.afterClose()})},j)}},crossfade:function(g,m,o){if(!g){return}var f=this,p=this.last,l=this.x,k=this.y,d=p.x,b=p.y,a=this.wrapper,i=this.content,c=this.overlayBox;hs.removeEventListener(document,"mousemove",hs.dragHandler);hs.setStyles(i,{width:(l.imgSize||l.size)+"px",height:(k.imgSize||k.size)+"px"});if(c){c.style.overflow="visible"}this.outline=p.outline;if(this.outline){this.outline.exp=f}p.outline=null;var h=hs.createElement("div",{className:"highslide-"+this.contentType},{position:"absolute",zIndex:4,overflow:"hidden",display:"none"});var j={oldImg:p,newImg:this};for(var e in j){this[e]=j[e].content.cloneNode(1);hs.setStyles(this[e],{position:"absolute",border:0,visibility:"visible"});h.appendChild(this[e])}a.appendChild(h);if(this.isHtml){hs.setStyles(this.mediumContent,{left:0,top:0})}if(c){c.className="";a.appendChild(c)}h.style.display="";p.content.style.display="none";if(hs.safari&&hs.uaVersion<525){this.wrapper.style.visibility="visible"}hs.animate(a,{width:l.size},{duration:hs.transitionDuration,step:function(u,r){var x=r.pos,q=1-x;var w,s={},t=["pos","size","p1","p2"];for(var v in t){w=t[v];s["x"+w]=Math.round(q*d[w]+x*l[w]);s["y"+w]=Math.round(q*b[w]+x*k[w]);s.ximgSize=Math.round(q*(d.imgSize||d.size)+x*(l.imgSize||l.size));s.ximgPad=Math.round(q*d.get("imgPad")+x*l.get("imgPad"));s.yimgSize=Math.round(q*(b.imgSize||b.size)+x*(k.imgSize||k.size));s.yimgPad=Math.round(q*b.get("imgPad")+x*k.get("imgPad"))}if(f.outline){f.outline.setPosition({x:s.xpos,y:s.ypos,w:s.xsize+s.xp1+s.xp2+2*l.cb,h:s.ysize+s.yp1+s.yp2+2*k.cb})}p.wrapper.style.clip="rect("+(s.ypos-b.pos)+"px, "+(s.xsize+s.xp1+s.xp2+s.xpos+2*d.cb-d.pos)+"px, "+(s.ysize+s.yp1+s.yp2+s.ypos+2*b.cb-b.pos)+"px, "+(s.xpos-d.pos)+"px)";hs.setStyles(i,{top:(s.yp1+k.get("imgPad"))+"px",left:(s.xp1+l.get("imgPad"))+"px",marginTop:(k.pos-s.ypos)+"px",marginLeft:(l.pos-s.xpos)+"px"});hs.setStyles(a,{top:s.ypos+"px",left:s.xpos+"px",width:(s.xp1+s.xp2+s.xsize+2*l.cb)+"px",height:(s.yp1+s.yp2+s.ysize+2*k.cb)+"px"});hs.setStyles(h,{width:(s.ximgSize||s.xsize)+"px",height:(s.yimgSize||s.ysize)+"px",left:(s.xp1+s.ximgPad)+"px",top:(s.yp1+s.yimgPad)+"px",visibility:"visible"});hs.setStyles(f.oldImg,{top:(b.pos-s.ypos+b.p1-s.yp1+b.get("imgPad")-s.yimgPad)+"px",left:(d.pos-s.xpos+d.p1-s.xp1+d.get("imgPad")-s.ximgPad)+"px"});hs.setStyles(f.newImg,{opacity:x,top:(k.pos-s.ypos+k.p1-s.yp1+k.get("imgPad")-s.yimgPad)+"px",left:(l.pos-s.xpos+l.p1-s.xp1+l.get("imgPad")-s.ximgPad)+"px"});if(c){hs.setStyles(c,{width:s.xsize+"px",height:s.ysize+"px",left:(s.xp1+l.cb)+"px",top:(s.yp1+k.cb)+"px"})}},complete:function(){a.style.visibility=i.style.visibility="visible";i.style.display="block";hs.discardElement(h);f.afterExpand();p.afterClose();f.last=null}})},reuseOverlay:function(d,c){if(!this.last){return false}for(var b=0;b'+b+""+this[this.numberPosition].innerHTML}}},initSlideshow:function(){if(!this.last){for(var c=0;cthis.x.get("opos")+this.x.get("osize"));var g=(k.y+k.hthis.y.get("opos")+this.y.get("osize"))}var d=hs.getWrapperKey(e[f]);if(!j&&!g&&d!=this.key){if(!h){e[f].setAttribute("hidden-by","["+this.key+"]");e[f].origProp=e[f].style[a];e[f].style[a]="hidden"}else{if(h.indexOf("["+this.key+"]")==-1){e[f].setAttribute("hidden-by",h+"["+this.key+"]")}}}else{if((h=="["+this.key+"]"||hs.focusKey==d)&&d!=this.key){e[f].setAttribute("hidden-by","");e[f].style[a]=e[f].origProp||""}else{if(h&&h.indexOf("["+this.key+"]")>-1){e[f].setAttribute("hidden-by",h.replace("["+this.key+"]",""))}}}}}}}},focus:function(){this.wrapper.style.zIndex=hs.zIndexCounter+=2;for(var a=0;ae.parentNode.offsetWidth){e.style.width="100%"}}else{if(e.parentNode!=this.overlayBox){this.overlayBox.appendChild(e)}}if(/left$/.test(f)){e.style.left=b+"px"}if(/center$/.test(f)){hs.setStyles(e,{left:"50%",marginLeft:(b-Math.round(e.offsetWidth/2))+"px"})}if(/right$/.test(f)){e.style.right=-b+"px"}if(/^leftpanel$/.test(f)){hs.setStyles(e,{right:"100%",marginRight:this.x.cb+"px",top:-this.y.cb+"px",bottom:-this.y.cb+"px",overflow:"auto"});this.x.p1=e.offsetWidth}else{if(/^rightpanel$/.test(f)){hs.setStyles(e,{left:"100%",marginLeft:this.x.cb+"px",top:-this.y.cb+"px",bottom:-this.y.cb+"px",overflow:"auto"});this.x.p2=e.offsetWidth}}var d=e.parentNode.offsetHeight;e.style.height="auto";if(c&&e.offsetHeight>d){e.style.height=hs.ieLt7?d+"px":"100%"}if(/^top/.test(f)){e.style.top=a+"px"}if(/^middle/.test(f)){hs.setStyles(e,{top:"50%",marginTop:(a-Math.round(e.offsetHeight/2))+"px"})}if(/^bottom/.test(f)){e.style.bottom=-a+"px"}if(/^above$/.test(f)){hs.setStyles(e,{left:(-this.x.p1-this.x.cb)+"px",right:(-this.x.p2-this.x.cb)+"px",bottom:"100%",marginBottom:this.y.cb+"px",width:"auto"});this.y.p1=e.offsetHeight}else{if(/^below$/.test(f)){hs.setStyles(e,{position:"relative",left:(-this.x.p1-this.x.cb)+"px",right:(-this.x.p2-this.x.cb)+"px",top:"100%",marginTop:this.y.cb+"px",width:"auto"});this.y.p2=e.offsetHeight;e.style.position="absolute"}}},getOverlays:function(){this.getInline(["heading","caption"],true);this.getNumber();if(this.caption){hs.fireEvent(this,"onAfterGetCaption")}if(this.heading){hs.fireEvent(this,"onAfterGetHeading")}if(this.heading&&this.dragByHeading){this.heading.className+=" highslide-move"}if(hs.showCredits){this.writeCredits()}for(var a=0;a=5.5){c=c.replace(new RegExp("]*>","gi"),"").replace(new RegExp("]*>.*?<\/script>","gi"),"");if(this.iframe){var f=this.iframe.contentDocument;if(!f&&this.iframe.contentWindow){f=this.iframe.contentWindow.document}if(!f){var g=this;setTimeout(function(){g.loadHTML()},25);return}f.open();f.write(c);f.close();try{c=f.getElementById(this.id).innerHTML}catch(d){try{c=this.iframe.document.getElementById(this.id).innerHTML}catch(d){}}hs.discardElement(this.iframe)}else{b=/(]*>|<\/body>)/ig;if(b.test(c)){c=c.split(b)[hs.ieLt9?1:2]}}}hs.getElementByClass(this.content,"DIV","highslide-body").innerHTML=c;this.onLoad();for(var a in this){this[a]=null}}};hs.Slideshow=function(c,b){if(hs.dynamicallyUpdateAnchors!==false){hs.updateAnchors()}this.expKey=c;for(var a in b){this[a]=b[a]}if(this.useControls){this.getControls()}if(this.thumbstrip){this.thumbstrip=hs.Thumbstrip(this)}};hs.Slideshow.prototype={getControls:function(){this.controls=hs.createElement("div",{innerHTML:hs.replaceLang(hs.skin.controls)},null,hs.container);var b=["play","pause","previous","next","move","full-expand","close"];this.btn={};var c=this;for(var a=0;a0){F=0}if(C>0){C=0}if(C0?G[L-1].parentNode[B]:w[B],A=w[B]+w[H]+(G[L+1]?G[L+1].parentNode[H]:0);if(A>x-v){C=x-A}else{if(J<-v){C=-J}}}var E=w[B]+(w[H]-g[H])/2+C;hs.animate(s,h?{left:C}:{top:C},null,"easeOutQuad");hs.animate(g,h?{left:E}:{top:E},null,"easeOutQuad");l.style.display=C<0?"block":"none";t.style.display=(C>F)?"block":"none"}var j=hs.anchors.groups[hs.expanders[k.expKey].slideshowGroup||"none"],f=k.thumbstrip,m=f.mode||"horizontal",u=(m=="float"),o=u?["div","ul","li","span"]:["table","tbody","tr","td"],h=(m=="horizontal"),r=hs.createElement("div",{className:"highslide-thumbstrip highslide-thumbstrip-"+m,innerHTML:'
    <'+o[0]+"><"+o[1]+">
    '},{display:"none"},hs.container),e=r.childNodes,n=e[0],l=e[1],t=e[2],g=e[3],s=n.firstChild,a=r.getElementsByTagName(o[1])[0],b;for(var q=0;q35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q(!m){A m={18:{97:\'aK\',aZ:\'fw...\',aY:\'8G 2i fP\',bD:\'8G 2i g0 2i eR\',9Z:\'eZ 2i fc D (f)\',cq:\'f8 by an ao\',cr:\'f4 2i f6 an ao fg\',8Y:\'aq\',8W:\'ay\',8Z:\'ag\',92:\'am\',90:\'am (eD)\',b0:\'eY\',ab:\'al\',au:\'al 1p (aj)\',ac:\'ah\',ad:\'ah 1p (aj)\',8s:\'aq (8w 1b)\',8X:\'ay (8w 3m)\',8V:\'ag\',ae:\'1:1\',3G:\'g7 %1 fz %2\',9W:\'8G 2i 26 2R, dC aA dE 2i 3u. dF 8w dB O 1D aA 3a.\'},5c:\'K/dw/\',7R:\'dv.5q\',6h:\'dx.5q\',6W:5Z,9A:5Z,4W:15,9B:15,4d:15,6L:15,4F:cY,be:0.75,9l:M,9f:5,3Y:2,ei:3,5S:1j,bz:\'4Q 3m\',bA:1,br:M,ct:\'em://K.eh/\',cs:\'ec\',aS:M,9w:[\'a\',\'5v\'],3q:[],cE:5Z,4b:0,87:50,6J:1j,6X:M,4D:M,3U:\'60\',7W:M,46:\'1M\',9n:\'1M\',b1:I,aC:I,a7:M,4s:aw,6k:aw,5Y:M,1Z:\'ev-dV\',8i:{2X:\'

    <6t>\'+\'<1H 1W="K-3a">\'+\'\'+\'<1C>{m.18.8Y}\'+\'\'+\'<1H 1W="K-3L">\'+\'\'+\'<1C>{m.18.ab}\'+\'\'+\'<1H 1W="K-3p">\'+\'\'+\'<1C>{m.18.ac}\'+\'\'+\'<1H 1W="K-1D">\'+\'\'+\'<1C>{m.18.8W}\'+\'\'+\'<1H 1W="K-3u">\'+\'\'+\'<1C>{m.18.8Z}\'+\'\'+\'<1H 1W="K-1a-2F">\'+\'\'+\'<1C>{m.18.ae}\'+\'\'+\'<1H 1W="K-26">\'+\'\'+\'<1C>{m.18.92}\'+\'\'+\'

    \',bd:\'

    <6t>\'+\'<1H 1W="K-3a">\'+\'\'+\'<1C>{m.18.8Y}\'+\'\'+\'<1H 1W="K-1D">\'+\'\'+\'<1C>{m.18.8W}\'+\'\'+\'<1H 1W="K-3u">\'+\'\'+\'<1C>{m.18.8Z}\'+\'\'+\'<1H 1W="K-26">\'+\'\'+\'<1C>{m.18.92}\'+\'\'+\'

    \'+\'

    \'+\'

    \'+\'<1C 1W="K-3O" 24="{m.18.b0}"><1C>\'+\'

    \'},64:[],a1:M,16:[],a4:[\'5Y\',\'3t\',\'46\',\'9n\',\'b1\',\'aC\',\'1Z\',\'3Y\',\'dU\',\'dM\',\'dL\',\'b3\',\'dK\',\'dI\',\'dJ\',\'b2\',\'cv\',\'a7\',\'42\',\'6l\',\'3q\',\'4b\',\'L\',\'N\',\'88\',\'6J\',\'6X\',\'4D\',\'dN\',\'dO\',\'dT\',\'2I\',\'7W\',\'4j\',\'4x\',\'3U\',\'8e\',\'a9\',\'4s\',\'6k\',\'6M\',\'9i\',\'aX\',\'2N\',\'2Q\',\'cF\',\'cD\',\'1e\'],1T:[],61:0,8g:{x:[\'bM\',\'1b\',\'4X\',\'3m\',\'bC\'],y:[\'5N\',\'Y\',\'9a\',\'4Q\',\'7E\']},7B:{},b2:{},b3:{},8e:{aG:{},29:{},aF:{}},4m:[],6u:[],4n:{},4R:[],7q:[],5a:[],7k:{},8c:{},7l:[],2t:/dP\\/4\\.0/.11(4A.6d)?8:8J((4A.6d.5G().3b(/.+(?:b9|dQ|e9|2h)[\\/: ]([\\d.]+)/)||[0,\'0\'])[1]),2h:(W.6q&&!1S.3z),4M:/ea/.11(4A.6d),6y:/eu.+b9:1\\.[0-8].+es/.11(4A.6d),$:C(1v){q(1v)E W.9Q(1v)},2o:C(2a,3j){2a[2a.V]=3j},1d:C(ba,4l,49,6c,bh){A el=W.1d(ba);q(4l)m.3A(el,4l);q(bh)m.R(el,{94:0,8H:\'1E\',9D:0});q(49)m.R(el,49);q(6c)6c.1X(el);E el},3A:C(el,4l){O(A x 2Y 4l)el[x]=4l[x];E el},R:C(el,49){O(A x 2Y 49){q(m.3R&&x==\'1z\'){q(49[x]>0.99)el.G.ew(\'5Q\');J el.G.5Q=\'bg(1z=\'+(49[x]*2w)+\')\'}J el.G[x]=49[x]}},2z:C(el,1f,3C){A 4T,51,4w;q(1F 3C!=\'7j\'||3C===I){A 2H=c5;3C={4h:2H[2],2Q:2H[3],76:2H[4]}}q(1F 3C.4h!=\'3G\')3C.4h=5Z;3C.2Q=1h[3C.2Q]||1h.bj;3C.7g=m.3A({},1f);O(A 2Z 2Y 1f){A e=1J m.fx(el,3C,2Z);4T=8J(m.8I(el,2Z))||0;51=8J(1f[2Z]);4w=2Z!=\'1z\'?\'F\':\'\';e.3E(4T,51,4w)}},8I:C(el,1f){q(el.G[1f]){E el.G[1f]}J q(W.8L){E W.8L.cK(el,I).co(1f)}J{q(1f==\'1z\')1f=\'5Q\';A 3j=el.5y[1f.2k(/\\-(\\w)/g,C(a,b){E b.bi()})];q(1f==\'5Q\')3j=3j.2k(/bg\\(1z=([0-9]+)\\)/,C(a,b){E b/2w});E 3j===\'\'?1:3j}},7S:C(){A d=W,w=1S,63=d.7a&&d.7a!=\'8v\'?d.5h:d.19,3R=m.2h&&(m.2t<9||1F bf==\'1L\');A L=3R?63.8F:(d.5h.8F||7c.ep),N=3R?63.c4:7c.eo;m.4g={L:L,N:N,5O:3R?63.5O:bf,5R:3R?63.5R:ed};E m.4g},6K:C(el){q(/5v/i.11(el.3J)){A 7N=W.2C(\'1N\');O(A i=0;i<7N.V;i++){A u=7N[i].eb;q(u&&u.2k(/^.*?#/,\'\')==el.23.2Z){el=7N[i];5m}}}A p={x:el.4V,y:el.8O};5g(el.bb){el=el.bb;p.x+=el.4V;p.y+=el.8O;q(el!=W.19&&el!=W.5h){p.x-=el.5O;p.y-=el.5R}}E p},2F:C(a,29,3E,T){q(!a)a=m.1d(\'a\',I,{1o:\'1E\'},m.2b);q(1F a.6a==\'C\')E 29;q(T==\'3D\'){O(A i=0;i8d){8d=1B;7n=i}}}q(7n==-1)m.3d=-1;J 16[7n].3M()},43:C(a,6b){a.6a=a.2p;A p=a.6a?a.6a():I;a.6a=I;E(p&&1F p[6b]!=\'1L\')?p[6b]:(1F m[6b]!=\'1L\'?m[6b]:I)},7s:C(a){A 1e=m.43(a,\'1e\');q(1e)E 1e;E a.21},4J:C(1v){A 1P=m.$(1v),4q=m.8c[1v],a={};q(!1P&&!4q)E I;q(!4q){4q=1P.5J(M);4q.1v=\'\';m.8c[1v]=4q;E 1P}J{E 4q.5J(M)}},3B:C(d){q(d)m.9y.1X(d);m.9y.2d=\'\'},1u:C(B){q(!m.2v){84=M;m.2v=m.1d(\'P\',{1c:\'K-dc K-2x-D\',5r:\'\',2p:C(){q(m.1A(m,\'d3\'))m.26()}},{1n:\'1Y\',1z:0},m.2b,M);q(/(df|d2|cU|cT)/.11(4A.6d)){A 19=W.19;C 81(){m.R(m.2v,{L:19.cR+\'F\',N:19.cV+\'F\'})}81();m.2j(1S,\'3O\',81)}}m.2v.G.1o=\'\';A 84=m.2v.5r==\'\';m.2v.5r+=\'|\'+B.Q;q(84){q(m.6y&&m.aR)m.R(m.2v,{9t:\'7T(\'+m.5c+\'d0.ak)\',1z:1});J m.2z(m.2v,{1z:B.4b},m.87)}},9x:C(Q){q(!m.2v)E;q(1F Q!=\'1L\')m.2v.5r=m.2v.5r.2k(\'|\'+Q,\'\');q((1F Q!=\'1L\'&&m.2v.5r!=\'\')||(m.2q&&m.43(m.2q,\'4b\')))E;q(m.6y&&m.aR)m.2v.G.1o=\'1E\';J m.2z(m.2v,{1z:0},m.87,I,C(){m.2v.G.1o=\'1E\'})},8N:C(7z,B){A 1i=B||m.2G();B=1i;q(m.2q)E 1j;J m.1i=1i;m.4z(W,1S.3z?\'6U\':\'71\',m.68);1t{m.2q=7z;7z.2p()}1y(e){m.1i=m.2q=I}1t{q(!7z||B.3q[1]!=\'4e\')B.26()}1y(e){}E 1j},7O:C(el,2n){A B=m.2G(el);q(B)E m.8N(B.7V(2n),B);J E 1j},3a:C(el){E m.7O(el,-1)},1D:C(el){E m.7O(el,1)},68:C(e){q(!e)e=1S.2u;q(!e.2L)e.2L=e.9k;q(1F e.2L.9j!=\'1L\')E M;q(!m.1A(m,\'dz\',e))E M;A B=m.2G();A 2n=I;b6(e.dy){2c 70:q(B)B.7r();E M;2c 32:2n=2;5m;2c 34:2c 39:2c 40:2n=1;5m;2c 8:2c 33:2c 37:2c 38:2n=-1;5m;2c 27:2c 13:2n=0}q(2n!==I){q(2n!=2)m.4z(W,1S.3z?\'6U\':\'71\',m.68);q(!m.aS)E M;q(e.5n)e.5n();J e.c0=1j;q(B){q(2n==0){B.26()}J q(2n==2){q(B.1p)B.1p.cl()}J{q(B.1p)B.1p.3p();m.7O(B.Q,2n)}E 1j}}E M},du:C(14){m.2o(m.1T,m.3A(14,{22:\'22\'+m.61++}))},dt:C(1r){A 3c=1r.2N;q(1F 3c==\'7j\'){O(A i=0;i<3c.V;i++){A o={};O(A x 2Y 1r)o[x]=1r[x];o.2N=3c[i];m.2o(m.6u,o)}}J{m.2o(m.6u,1r)}},9U:C(7y,7h){A el,2m=/^K-U-([0-9]+)$/;el=7y;5g(el.23){q(el.6R!==1L)E el.6R;q(el.1v&&2m.11(el.1v))E el.1v.2k(2m,"$1");el=el.23}q(!7h){el=7y;5g(el.23){q(el.3J&&m.77(el)){O(A Q=0;Q1)E M;q(!e.2L)e.2L=e.9k;A el=e.2L;5g(el.23&&!(/K-(2R|3u|3D|3O)/.11(el.1c))){el=el.23}A B=m.2G(el);q(B&&(B.62||!B.55))E M;q(B&&e.T==\'8y\'){q(e.2L.9j)E M;A 3b=el.1c.3b(/K-(2R|3u|3O)/);q(3b){m.2y={B:B,T:3b[1],1b:B.x.H,L:B.x.D,Y:B.y.H,N:B.y.D,aV:e.7A,aO:e.7F};m.2j(W,\'7D\',m.6H);q(e.5n)e.5n();q(/K-(2R|3D)-9J/.11(B.S.1c)){B.3M();m.a6=M}E 1j}J q(/K-3D/.11(el.1c)&&m.3d!=B.Q){B.3M();B.59(\'1q\')}}J q(e.T==\'c3\'){m.4z(W,\'7D\',m.6H);q(m.2y){q(m.54&&m.2y.T==\'2R\')m.2y.B.S.G.4L=m.54;A 3I=m.2y.3I;q(!3I&&!m.a6&&!/(3u|3O)/.11(m.2y.T)){q(m.1A(B,\'dr\'))B.26()}J q(3I||(!3I&&m.aU)){m.2y.B.59(\'1q\')}q(m.2y.B.3W)m.2y.B.3W.G.1o=\'1E\';q(3I)m.1A(m.2y.B,\'do\',m.2y);m.a6=1j;m.2y=I}J q(/K-2R-9J/.11(el.1c)){el.G.4L=m.54}}E 1j},6H:C(e){q(!m.2y)E M;q(!e)e=1S.2u;A a=m.2y,B=a.B;q(B.1k){q(!B.3W)B.3W=m.1d(\'P\',I,{1l:\'2l\',L:B.x.D+\'F\',N:B.y.D+\'F\',1b:B.x.cb+\'F\',Y:B.y.cb+\'F\',1B:4,9t:(m.3R?\'eB\':\'1E\'),1z:0.eU},B.U,M);q(B.3W.G.1o==\'1E\')B.3W.G.1o=\'\'}a.dX=e.7A-a.aV;a.dY=e.7F-a.aO;A 9g=1h.fG(1h.aE(a.dX,2)+1h.aE(a.dY,2));q(!a.3I)a.3I=(a.T!=\'2R\'&&9g>0)||(9g>(m.fK||5));q(a.3I&&e.7A>5&&e.7F>5){q(!m.1A(B,\'fN\',a))E 1j;q(a.T==\'3O\')B.3O(a);J{B.9m(a.1b+a.dX,a.Y+a.dY);q(a.T==\'2R\')B.S.G.4L=\'3u\'}}E 1j},aP:C(e){1t{q(!e)e=1S.2u;A 66=/fM/i.11(e.T);q(!e.2L)e.2L=e.9k;q(!e.7P)e.7P=66?e.fE:e.fD;A B=m.2G(e.2L);q(!B.55)E;q(!B||!e.7P||m.2G(e.7P,M)==B||m.2y)E;m.1A(B,66?\'ft\':\'fr\',e);O(A i=0;i=k.1r.4h+k.9c){k.4o=k.51;k.H=k.96=1;k.82();k.1r.7g[k.1f]=M;A 9s=M;O(A i 2Y k.1r.7g)q(k.1r.7g[i]!==M)9s=1j;q(9s){q(k.1r.76)k.1r.76.ax(k.30)}E 1j}J{A n=t-k.9c;k.96=n/k.1r.4h;k.H=k.1r.2Q(n,0,1,k.1r.4h);k.4o=k.4T+((k.51-k.4T)*k.H);k.82()}E M}};m.3A(m.fx,{3P:{1z:C(fx){m.R(fx.30,{1z:fx.4o})},ap:C(fx){1t{q(fx.30.G&&fx.30.G[fx.1f]!=I)fx.30.G[fx.1f]=fx.4o+fx.4w;J fx.30[fx.1f]=fx.4o}1y(e){}}}});m.6r=C(1Z,3F){k.3F=3F;k.1Z=1Z;A v=m.2t,47;k.9G=m.2h&&m.2t<7;q(!1Z){q(3F)3F();E}m.7m();k.2g=m.1d(\'2g\',{eJ:0},{1n:\'1q\',1l:\'2l\',eN:\'eM\',L:0},m.2b,M);A 4G=m.1d(\'4G\',I,I,k.2g,1);k.2J=[];O(A i=0;i<=8;i++){q(i%3==0)47=m.1d(\'47\',I,{N:\'1M\'},4G,M);k.2J[i]=m.1d(\'2J\',I,I,47,M);A G=i!=4?{eL:0,eK:0}:{1l:\'4y\'};m.R(k.2J[i],G)}k.2J[4].1c=1Z+\' K-1g\';k.ai()};m.6r.5w={ai:C(){A 1e=m.5c+(m.f1||"fi/")+k.1Z+".ak";A ar=m.4M&&m.2t<73?m.2b:I;k.3V=m.1d(\'1N\',I,{1l:\'2l\',Y:\'-4v\'},ar,M);A 3v=k;k.3V.4N=C(){3v.az()};k.3V.1e=1e},az:C(){A o=k.1w=k.3V.L/4,H=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],1u={N:(2*o)+\'F\',L:(2*o)+\'F\'};O(A i=0;i<=8;i++){q(H[i]){q(k.9G){A w=(i==1||i==7)?\'2w%\':k.3V.L+\'F\';A P=m.1d(\'P\',I,{L:\'2w%\',N:\'2w%\',1l:\'4y\',2e:\'1q\'},k.2J[i],M);m.1d(\'P\',I,{5Q:"fo:fn.bv.fm(fl=fe, 1e=\'"+k.3V.1e+"\')",1l:\'2l\',L:w,N:k.3V.N+\'F\',1b:(H[i][0]*o)+\'F\',Y:(H[i][1]*o)+\'F\'},P,M)}J{m.R(k.2J[i],{9t:\'7T(\'+k.3V.1e+\') \'+(H[i][0]*o)+\'F \'+(H[i][1]*o)+\'F\'})}q(1S.3z&&(i==3||i==5))m.1d(\'P\',I,1u,k.2J[i],M);m.R(k.2J[i],1u)}}k.3V=I;q(m.4n[k.1Z])m.4n[k.1Z].5U();m.4n[k.1Z]=k;q(k.3F)k.3F()},4C:C(H,1w,aB,4i,2Q){A B=k.B,5X=B.U.G,1w=1w||0,H=H||{x:B.x.H+1w,y:B.y.H+1w,w:B.x.Z(\'2f\')-2*1w,h:B.y.Z(\'2f\')-2*1w};q(aB)k.2g.G.1n=(H.h>=4*k.1w)?\'1Y\':\'1q\';m.R(k.2g,{1b:(H.x-k.1w)+\'F\',Y:(H.y-k.1w)+\'F\',L:(H.w+2*k.1w)+\'F\'});H.w-=2*k.1w;H.h-=2*k.1w;m.R(k.2J[4],{L:H.w>=0?H.w+\'F\':0,N:H.h>=0?H.h+\'F\':0});q(k.9G)k.2J[3].G.N=k.2J[5].G.N=k.2J[4].G.N},5U:C(bk){q(bk)k.2g.G.1n=\'1q\';J m.3B(k.2g)}};m.6A=C(B,1u){k.B=B;k.1u=1u;k.3l=1u==\'x\'?\'bY\':\'bW\';k.3k=k.3l.5G();k.6m=1u==\'x\'?\'cj\':\'c8\';k.6Y=k.6m.5G();k.9L=1u==\'x\'?\'c7\':\'bX\';k.b5=k.9L.5G();k.1G=k.36=0};m.6A.5w={Z:C(Q){b6(Q){2c\'9T\':E k.1K+k.3s+(k.t-m.2r[\'1w\'+k.3l])/2;2c\'9v\':E k.H+k.cb+k.1G+(k.D-m.2r[\'1w\'+k.3l])/2;2c\'2f\':E k.D+2*k.cb+k.1G+k.36;2c\'5e\':E k.4K-k.3o-k.4S;2c\'8D\':E k.Z(\'5e\')-2*k.cb-k.1G-k.36;2c\'6e\':E k.H-(k.B.1g?k.B.1g.1w:0);2c\'9R\':E k.Z(\'2f\')+(k.B.1g?2*k.B.1g.1w:0);2c\'2K\':E k.1V?1h.3e((k.D-k.1V)/2):0}},8a:C(){k.cb=(k.B.S[\'1w\'+k.3l]-k.t)/2;k.4S=m[\'9D\'+k.9L]},9M:C(){k.t=k.B.el[k.3k]?3H(k.B.el[k.3k]):k.B.el[\'1w\'+k.3l];k.1K=k.B.1K[k.1u];k.3s=(k.B.el[\'1w\'+k.3l]-k.t)/2;q(k.1K==0||k.1K==-1){k.1K=(m.4g[k.3k]/2)+m.4g[\'28\'+k.6m]}},8h:C(){A B=k.B;k.2T=\'1M\';q(B.9n==\'4X\')k.2T=\'4X\';J q(1J 4Y(k.6Y).11(B.46))k.2T=I;J q(1J 4Y(k.b5).11(B.46))k.2T=\'4t\';k.H=k.1K-k.cb+k.3s;q(k.9i&&k.1u==\'x\')B.6M=1h.31(B.6M||k.1a,B.9i*k.1a/B.y.1a);k.D=1h.31(k.1a,B[\'4t\'+k.3l]||k.1a);k.2U=B.5Y?1h.31(B[\'31\'+k.3l],k.1a):k.1a;q(B.2E&&B.3t){k.D=B[k.3k];k.1V=k.1a}q(k.1u==\'x\'&&m.5S)k.2U=B.4s;k.2L=B[\'2L\'+k.1u.bi()];k.3o=m[\'9D\'+k.6m];k.28=m.4g[\'28\'+k.6m];k.4K=m.4g[k.3k]},72:C(i){A B=k.B;q(B.2E&&(B.3t||m.5S)){k.1V=i;k.D=1h.4t(k.D,k.1V);B.S.G[k.6Y]=k.Z(\'2K\')+\'F\'}J k.D=i;B.S.G[k.3k]=i+\'F\';B.U.G[k.3k]=k.Z(\'2f\')+\'F\';q(B.1g)B.1g.4C();q(B.3W)B.3W.G[k.3k]=i+\'F\';q(k.1u==\'y\'&&B.5C&&B.19.G.N!=\'1M\')1t{B.5C.19.G.2e=\'1M\'}1y(e){}q(B.2A){A d=B.2s;q(k.9e===1L)k.9e=B.1s[\'1w\'+k.3l]-d[\'1w\'+k.3l];d.G[k.3k]=(k.D-k.9e)+\'F\';q(k.1u==\'x\')B.4c.G.L=\'1M\';q(B.19)B.19.G[k.3k]=\'1M\'}q(k.1u==\'x\'&&B.1x)B.57(M);q(k.1u==\'x\'&&B.1p&&B.2E){q(i==k.1a)B.1p.5d(\'1a-2F\');J B.1p.4u(\'1a-2F\')}},aa:C(i){k.H=i;k.B.U.G[k.6Y]=i+\'F\';q(k.B.1g)k.B.1g.4C()}};m.5A=C(a,29,3E,35){q(W.bS&&m.2h&&!m.9F){m.2j(W,\'41\',C(){1J m.5A(a,29,3E,35)});E}k.a=a;k.3E=3E;k.35=35||\'2R\';k.2A=(35==\'3D\');k.2E=!k.2A;m.a1=1j;k.1T=[];k.1i=m.1i;m.1i=I;m.7m();A Q=k.Q=m.16.V;O(A i=0;ip.28+p.4K-p.4S)p.H=p.28+p.4K-p.D-p.3o-p.4S-p.1G-p.36;q(p.H(k.x.1V||k.x.D)){k.bs();q(k.1T.V==1)k.57()}}k.a5()}1y(e){k.9o(e)}},91:C(6c,1M){A c=m.4p(6c,\'7J\',\'K-19\');q(/(1k|3x)/.11(k.2I)){q(k.4j)c.G.L=k.4j+\'F\';q(k.4x)c.G.N=k.4x+\'F\'}},6T:C(){q(k.aD)E;A B=k;k.19=m.4p(k.1s,\'7J\',\'K-19\');q(k.2I==\'1k\'){k.6n();A 5o=m.3w.5J(1);k.19.1X(5o);k.eP=k.1s.1O;q(!k.4j)k.4j=5o.1O;A 5b=k.1s.1U-k.19.1U,h=k.4x||m.4g.N-5b-m.4d-m.6L,4N=k.3U==\'60\'?\' 4N="q (m.16[\'+k.Q+\']) m.16[\'+k.Q+\'].69()" \':\'\';k.19.2d+=\'<1k 2Z="m\'+(1J 7K()).79()+\'" eQ="0" Q="\'+k.Q+\'" \'+\' G="L:\'+k.4j+\'F; N:\'+h+\'F" \'+4N+\' 1e="\'+k.1e+\'" >\';k.5o=k.19.2C(\'P\')[0];k.1k=k.19.2C(\'1k\')[0];q(k.3U==\'6x\')k.8A()}q(k.2I==\'3x\'){k.19.1v=k.19.1v||\'m-fY-1v-\'+k.Q;A a=k.8e;q(!a.29)a.29={};q(1F a.29.aN==\'1L\')a.29.aN=\'fR\';q(9p)9p.fT(k.1e,k.19.1v,k.4j,k.4x,a.g1||\'7\',a.gb,a.aG,a.29,a.aF)}k.aD=M},7Z:C(){q(k.1k&&!k.4x){k.1k.G.N=k.19.G.N=k.8p()+\'F\'}k.1s.1X(m.3w);q(!k.x.1a)k.x.1a=k.1s.1O;k.y.1a=k.1s.1U;k.1s.9q(m.3w);q(m.2h&&k.aL>3H(k.1s.5y.N)){k.aL=3H(k.1s.5y.N)}m.R(k.U,{1l:\'2l\',94:\'0\'});m.R(k.S,{L:k.x.t+\'F\',N:k.y.t+\'F\'})},8p:C(){A h;1t{A 2B=k.5C=k.1k.9O||k.1k.6g.W;A 3w=2B.1d(\'P\');3w.G.aJ=\'bc\';2B.19.1X(3w);h=3w.8O;q(m.2h)h+=3H(2B.19.5y.4d)+3H(2B.19.5y.6L)-1}1y(e){h=de}E h},8A:C(){A 5i=k.1s.1O-k.5o.1O;m.3B(k.5o);q(5i<0)5i=0;A 5b=k.1s.1U-k.1k.1U;q(k.5C&&!k.4x&&!k.N&&k.y.D==k.y.1a)1t{k.5C.19.G.2e=\'1q\'}1y(e){}m.R(k.1k,{L:1h.9Y(k.x.D-5i)+\'F\',N:1h.9Y(k.y.D-5b)+\'F\'});m.R(k.19,{L:k.1k.G.L,N:k.1k.G.N});k.52=k.1k;k.2s=k.52},b4:C(){k.91(k.1s);q(k.2I==\'3x\'&&k.3U==\'60\')k.6T();q(k.x.D1P.1U){1P.G.L=(3H(1P.G.L)+6E)+\'F\'}k.52=1P;k.2s=k.52}q(k.1k&&k.3U==\'60\')k.8A();q(!k.52&&k.y.Dk.2s.23.1U){4a("1t { m.16["+k.Q+"].2s.G.2e = \'1M\'; } 1y(e) {}",m.6W)}},b8:C(5v){A c=5v.fC.7G(\',\');O(A i=0;ip.28+p.4K-p.4S){q(!5u&&8C&&5s){p.D=1h.31(p.D,p.Z(1u==\'y\'?\'5e\':\'8D\'))}J q(p.Z(\'2f\')2M){ 3f=3y*2M;q(3fk.6k&&x.D>k.4s&&y.Z(\'2f\')>y.Z(\'5e\')){y.D-=10;q(2M)x.D=y.D*2M;k.57(0,1);3T=M}}E 3T},dS:C(){q(k.2s){A h=/1k/i.11(k.2s.3J)?(k.8p()+1)+\'F\':\'1M\';q(k.19)k.19.G.N=h;k.2s.G.N=h;k.y.72(k.1s.1U)}},a5:C(){A x=k.x,y=k.y;k.59(\'1q\');m.1A(k,\'et\');q(k.1p&&k.1p.2D)k.1p.2D.5t();k.9b(1,{U:{L:x.Z(\'2f\'),N:y.Z(\'2f\'),1b:x.H,Y:y.H},S:{1b:x.1G+x.Z(\'2K\'),Y:y.1G+y.Z(\'2K\'),L:x.1V||x.D,N:y.1V||y.D}},m.6W)},9b:C(1I,2i,4i){A 5M=k.3q,8o=1I?(k.1i?k.1i.a:I):m.2q,t=(5M[1]&&8o&&m.43(8o,\'3q\')[1]==5M[1])?5M[1]:5M[0];q(k[t]&&t!=\'2F\'){k[t](1I,2i);E}q(k.1g&&!k.3Y){q(1I)k.1g.4C();J k.1g.5U((k.2A&&k.4D))}q(!1I)k.78();A B=k,x=B.x,y=B.y,2Q=k.2Q;q(!1I)2Q=k.cF||2Q;A 6x=1I?C(){q(B.1g)B.1g.2g.G.1n="1Y";4a(C(){B.6I()},50)}:C(){B.5D()};q(1I)m.R(k.U,{L:x.t+\'F\',N:y.t+\'F\'});q(1I&&k.2A){m.R(k.U,{1b:(x.1K-x.cb+x.3s)+\'F\',Y:(y.1K-y.cb+y.3s)+\'F\'})}q(k.cD){m.R(k.U,{1z:1I?0:1});m.3A(2i.U,{1z:1I})}m.2z(k.U,2i.U,{4h:4i,2Q:2Q,3P:C(3j,2H){q(B.1g&&B.3Y&&2H.1f==\'Y\'){A 5W=1I?2H.H:1-2H.H;A H={w:x.t+(x.Z(\'2f\')-x.t)*5W,h:y.t+(y.Z(\'2f\')-y.t)*5W,x:x.1K+(x.H-x.1K)*5W,y:y.1K+(y.H-y.1K)*5W};B.1g.4C(H,0,1)}q(B.2A){q(2H.1f==\'1b\')B.4c.G.1b=(x.H-3j)+\'F\';q(2H.1f==\'Y\')B.4c.G.Y=(y.H-3j)+\'F\'}}});m.2z(k.S,2i.S,4i,2Q,6x);q(1I){k.U.G.1n=\'1Y\';k.S.G.1n=\'1Y\';q(k.2A)k.1s.G.1n=\'1Y\';k.a.1c+=\' K-4I-46\'}},6w:C(1I,2i){k.3Y=1j;A B=k,t=1I?m.6W:0;q(1I){m.2z(k.U,2i.U,0);m.R(k.U,{1z:0,1n:\'1Y\'});m.2z(k.S,2i.S,0);k.S.G.1n=\'1Y\';m.2z(k.U,{1z:1},t,I,C(){B.6I()})}q(k.1g){k.1g.2g.G.1B=k.U.G.1B;A 6Z=1I||-1,1w=k.1g.1w,8r=1I?3:1w,8q=1I?1w:3;O(A i=8r;6Z*i<=6Z*8q;i+=6Z,t+=25){(C(){A o=1I?8q-i:8r-i;4a(C(){B.1g.4C(0,o,1)},t)})()}}q(1I){}J{4a(C(){q(B.1g)B.1g.5U(B.4D);B.78();m.2z(B.U,{1z:0},m.9A,I,C(){B.5D()})},t)}},4e:C(1I,2i,8u){q(!1I)E;A B=k,1i=k.1i,x=k.x,y=k.y,3n=1i.x,3g=1i.y,U=k.U,S=k.S,1x=k.1x;m.4z(W,\'7D\',m.6H);m.R(S,{L:(x.1V||x.D)+\'F\',N:(y.1V||y.D)+\'F\'});q(1x)1x.G.2e=\'1Y\';k.1g=1i.1g;q(k.1g)k.1g.B=B;1i.1g=I;A 5l=m.1d(\'P\',{1c:\'K-\'+k.35},{1l:\'2l\',1B:4,2e:\'1q\',1o:\'1E\'});A 8t={cN:1i,cM:k};O(A n 2Y 8t){k[n]=8t[n].S.5J(1);m.R(k[n],{1l:\'2l\',8H:0,1n:\'1Y\'});5l.1X(k[n])}U.1X(5l);q(k.2A)m.R(k.4c,{1b:0,Y:0});q(1x){1x.1c=\'\';U.1X(1x)}5l.G.1o=\'\';1i.S.G.1o=\'1E\';q(m.4M&&m.2t<73){k.U.G.1n=\'1Y\'}m.2z(U,{L:x.D},{4h:m.cE,3P:C(3j,2H){A H=2H.H,4B=1-H;A 1f,D={},93=[\'H\',\'D\',\'1G\',\'36\'];O(A n 2Y 93){1f=93[n];D[\'x\'+1f]=1h.3e(4B*3n[1f]+H*x[1f]);D[\'y\'+1f]=1h.3e(4B*3g[1f]+H*y[1f]);D.cI=1h.3e(4B*(3n.1V||3n.D)+H*(x.1V||x.D));D.6S=1h.3e(4B*3n.Z(\'2K\')+H*x.Z(\'2K\'));D.cJ=1h.3e(4B*(3g.1V||3g.D)+H*(y.1V||y.D));D.6V=1h.3e(4B*3g.Z(\'2K\')+H*y.Z(\'2K\'))}q(B.1g)B.1g.4C({x:D.3h,y:D.3r,w:D.5L+D.44+D.8U+2*x.cb,h:D.5K+D.45+D.8T+2*y.cb});1i.U.G.d7=\'d6(\'+(D.3r-3g.H)+\'F, \'+(D.5L+D.44+D.8U+D.3h+2*3n.cb-3n.H)+\'F, \'+(D.5K+D.45+D.8T+D.3r+2*3g.cb-3g.H)+\'F, \'+(D.3h-3n.H)+\'F)\';m.R(S,{Y:(D.45+y.Z(\'2K\'))+\'F\',1b:(D.44+x.Z(\'2K\'))+\'F\',4d:(y.H-D.3r)+\'F\',4W:(x.H-D.3h)+\'F\'});m.R(U,{Y:D.3r+\'F\',1b:D.3h+\'F\',L:(D.44+D.8U+D.5L+2*x.cb)+\'F\',N:(D.45+D.8T+D.5K+2*y.cb)+\'F\'});m.R(5l,{L:(D.cI||D.5L)+\'F\',N:(D.cJ||D.5K)+\'F\',1b:(D.44+D.6S)+\'F\',Y:(D.45+D.6V)+\'F\',1n:\'1Y\'});m.R(B.cN,{Y:(3g.H-D.3r+3g.1G-D.45+3g.Z(\'2K\')-D.6V)+\'F\',1b:(3n.H-D.3h+3n.1G-D.44+3n.Z(\'2K\')-D.6S)+\'F\'});m.R(B.cM,{1z:H,Y:(y.H-D.3r+y.1G-D.45+y.Z(\'2K\')-D.6V)+\'F\',1b:(x.H-D.3h+x.1G-D.44+x.Z(\'2K\')-D.6S)+\'F\'});q(1x)m.R(1x,{L:D.5L+\'F\',N:D.5K+\'F\',1b:(D.44+x.cb)+\'F\',Y:(D.45+y.cb)+\'F\'})},76:C(){U.G.1n=S.G.1n=\'1Y\';S.G.1o=\'3X\';m.3B(5l);B.6I();1i.5D();B.1i=I}})},bQ:C(o,el){q(!k.1i)E 1j;O(A i=0;i\'+s+\'

    \'+k[k.6l].2d}}},a0:C(){q(!k.1i){O(A i=0;ik.x.Z(\'6e\')+k.x.Z(\'9R\'));A bG=(3N.y+3N.hk.y.Z(\'6e\')+k.y.Z(\'9R\'))}A 6F=m.9U(1m[i]);q(!bl&&!bG&&6F!=k.Q){q(!2S){1m[i].5F(\'1q-by\',\'[\'+k.Q+\']\');1m[i].9N=1m[i].G[1f];1m[i].G[1f]=\'1q\'}J q(2S.bF(\'[\'+k.Q+\']\')==-1){1m[i].5F(\'1q-by\',2S+\'[\'+k.Q+\']\')}}J q((2S==\'[\'+k.Q+\']\'||m.3d==6F)&&6F!=k.Q){1m[i].5F(\'1q-by\',\'\');1m[i].G[1f]=1m[i].9N||\'\'}J q(2S&&2S.bF(\'[\'+k.Q+\']\')>-1){1m[i].5F(\'1q-by\',2S.2k(\'[\'+k.Q+\']\',\'\'))}}}}},3M:C(){k.U.G.1B=m.4F+=2;O(A i=0;i14.23.1O)14.G.L=\'2w%\'}J q(14.23!=k.1x)k.1x.1X(14);q(/1b$/.11(p))14.G.1b=74+\'F\';q(/4X$/.11(p))m.R(14,{1b:\'50%\',4W:(74-1h.3e(14.1O/2))+\'F\'});q(/3m$/.11(p))14.G.3m=-74+\'F\';q(/^bM$/.11(p)){m.R(14,{3m:\'2w%\',9B:k.x.cb+\'F\',Y:-k.y.cb+\'F\',4Q:-k.y.cb+\'F\',2e:\'1M\'});k.x.1G=14.1O}J q(/^bC$/.11(p)){m.R(14,{1b:\'2w%\',4W:k.x.cb+\'F\',Y:-k.y.cb+\'F\',4Q:-k.y.cb+\'F\',2e:\'1M\'});k.x.36=14.1O}A 9d=14.23.1U;14.G.N=\'1M\';q(53&&14.1U>9d)14.G.N=m.3Z?9d+\'F\':\'2w%\';q(/^Y/.11(p))14.G.Y=6O+\'F\';q(/^9a/.11(p))m.R(14,{Y:\'50%\',4d:(6O-1h.3e(14.1U/2))+\'F\'});q(/^4Q/.11(p))14.G.4Q=-6O+\'F\';q(/^5N$/.11(p)){m.R(14,{1b:(-k.x.1G-k.x.cb)+\'F\',3m:(-k.x.36-k.x.cb)+\'F\',4Q:\'2w%\',6L:k.y.cb+\'F\',L:\'1M\'});k.y.1G=14.1U}J q(/^7E$/.11(p)){m.R(14,{1l:\'4y\',1b:(-k.x.1G-k.x.cb)+\'F\',3m:(-k.x.36-k.x.cb)+\'F\',Y:\'2w%\',4d:k.y.cb+\'F\',L:\'1M\'});k.y.36=14.1U;14.G.1l=\'2l\'}},bB:C(){k.a2([\'58\',\'9X\'],M);k.bq();q(k.9X)m.1A(k,\'eE\');q(k.58)m.1A(k,\'eF\');q(k.58&&k.a7)k.58.1c+=\' K-3u\';q(m.br)k.bp();O(A i=0;i=5.5){s=s.2k(1J 4Y(\']*>\',\'c9\'),\'\').2k(1J 4Y(\']*>.*?\',\'c9\'),\'\');q(k.1k){A 2B=k.1k.9O;q(!2B&&k.1k.6g)2B=k.1k.6g.W;q(!2B){A 3v=k;4a(C(){3v.6f()},25);E}2B.ca();2B.dg(s);2B.26();1t{s=2B.9Q(k.1v).2d}1y(e){1t{s=k.1k.W.9Q(k.1v).2d}1y(e){}}m.3B(k.1k)}J{7H=/(<19[^>]*>|<\\/19>)/db;q(7H.11(s))s=s.7G(7H)[m.3R?1:2]}}m.4p(k.S,\'7J\',\'K-19\').2d=s;k.3F();O(A x 2Y k)k[x]=I}};m.83=C(4k,1r){q(m.cX!==1j)m.95();k.4k=4k;O(A x 2Y 1r)k[x]=1r[x];q(k.cZ)k.cg();q(k.2D)k.2D=m.ci(k)};m.83.5w={cg:C(){k.2X=m.1d(\'P\',{2d:m.8b(m.8i.2X)},I,m.2b);A 6j=[\'3L\',\'3p\',\'3a\',\'1D\',\'3u\',\'1a-2F\',\'26\'];k.1Q={};A 3v=k;O(A i=0;i<6j.V;i++){k.1Q[6j[i]]=m.4p(k.2X,\'1H\',\'K-\'+6j[i]);k.4u(6j[i])}k.1Q.3p.G.1o=\'1E\'},ch:C(){q(k.cm||!k.2X)E;A B=m.16[k.4k],5q=B.7v(),2m=/7w$/;q(5q==0)k.5d(\'3a\');J q(2m.11(k.1Q.3a.2C(\'a\')[0].1c))k.4u(\'3a\');q(5q+1==m.4U.3i[B.2N||\'1E\'].V){k.5d(\'1D\');k.5d(\'3L\')}J q(2m.11(k.1Q.1D.2C(\'a\')[0].1c)){k.4u(\'1D\');k.4u(\'3L\')}},4u:C(1Q){q(!k.1Q)E;A cn=k,a=k.1Q[1Q].2C(\'a\')[0],2m=/7w$/;a.2p=C(){cn[1Q]();E 1j};q(2m.11(a.1c))a.1c=a.1c.2k(2m,\'\')},5d:C(1Q){q(!k.1Q)E;A a=k.1Q[1Q].2C(\'a\')[0];a.2p=C(){E 1j};q(!/7w$/.11(a.1c))a.1c+=\' 7w\'},cl:C(){q(k.42)k.3p();J k.3L()},3L:C(ck){q(k.1Q){k.1Q.3L.G.1o=\'1E\';k.1Q.3p.G.1o=\'\'}k.42=M;q(!ck)m.1D(k.4k)},3p:C(){q(k.1Q){k.1Q.3p.G.1o=\'1E\';k.1Q.3L.G.1o=\'\'}d9(k.42);k.42=I},3a:C(){k.3p();m.3a(k.1Q.3a)},1D:C(){k.3p();m.1D(k.1Q.1D)},3u:C(){},\'1a-2F\':C(){m.2G().7r()},26:C(){m.26(k.1Q.26)}};m.ci=C(1p){C 7p(B){m.3A(1r||{},{4P:4E,22:\'2D\',1c:\'K-2D-\'+5k+\'-14 \'+(1r.1c||\'\')});q(m.3Z)1r.6w=0;B.4O(1r);m.R(4E.23,{2e:\'1q\'})};C 28(3K){5t(1L,1h.3e(3K*4E[3S?\'1O\':\'1U\']*0.7))};C 5t(i,80){q(i===1L)O(A j=0;j<5I.V;j++){q(5I[j]==m.16[1p.4k].a){i=j;5m}}q(i===1L)E;A as=4E.2C(\'a\'),4I=as[i],48=4I.23,1b=3S?\'cj\':\'c8\',3m=3S?\'c7\':\'bX\',L=3S?\'bY\':\'bW\',4V=\'1w\'+1b,1O=\'1w\'+L,7e=P.23.23[1O],5j=7e-2g[1O],6o=3H(2g.G[3S?\'1b\':\'Y\'])||0,2O=6o,ej=20;q(80!==1L){2O=6o-80;q(5j>0)5j=0;q(2O>0)2O=0;q(2O<5j)2O=5j}J{O(A j=0;j0?as[i-1].23[4V]:48[4V],7Y=48[4V]+48[1O]+(as[i+1]?as[i+1].23[1O]:0);q(7Y>7e-6o)2O=7e-7Y;J q(7X<-6o)2O=-7X}A 8R=48[4V]+(48[1O]-7f[1O])/2+2O;m.2z(2g,3S?{1b:2O}:{Y:2O},I,\'8S\');m.2z(7f,3S?{1b:8R}:{Y:8R},I,\'8S\');8l.G.1o=2O<0?\'3X\':\'1E\';8M.G.1o=(2O>5j)?\'3X\':\'1E\'};A 5I=m.4U.3i[m.16[1p.4k].2N||\'1E\'],1r=1p.2D,5k=1r.5k||\'bV\',8K=(5k==\'en\'),4f=8K?[\'P\',\'6t\',\'1H\',\'1C\']:[\'2g\',\'4G\',\'47\',\'2J\'],3S=(5k==\'bV\'),4E=m.1d(\'P\',{1c:\'K-2D K-2D-\'+5k,2d:\'

    \'+\'<\'+4f[0]+\'><\'+4f[1]+\'>

    \'+\'

    \'+\'

    \'+\'

    \'},{1o:\'1E\'},m.2b),5E=4E.7L,P=5E[0],8l=5E[1],8M=5E[2],7f=5E[3],2g=P.ef,4G=4E.2C(4f[1])[0],47;O(A i=0;i<5I.V;i++){q(i==0||!3S)47=m.1d(4f[2],I,I,4G);(C(){A a=5I[i],48=m.1d(4f[3],I,I,47),ex=i;m.1d(\'a\',{21:a.21,24:a.24,2p:C(){q(/K-4I-46/.11(k.1c))E 1j;m.2G(k).3M();E m.8N(a)},2d:m.bT?m.bT(a):a.2d},I,48)})()}q(!8K){8l.2p=C(){28(-1)};8M.2p=C(){28(1)};m.2j(4G,W.eA!==1L?\'er\':\'eq\',C(e){A 3K=0;e=e||1S.2u;q(e.bU){3K=e.bU/dR;q(m.3z)3K=-3K}J q(e.bZ){3K=-e.bZ/3}q(3K)28(-3K*0.2);q(e.5n)e.5n();e.c0=1j})}E{7p:7p,5t:5t}};m.7o=m.18;A e8=m.5A;q(m.2h&&1S==1S.Y){(C(){1t{W.5h.e4(\'1b\')}1y(e){4a(c5.dZ,50);E}m.41()})()}m.2j(W,\'dW\',m.41);m.2j(1S,\'8B\',m.41);m.2j(W,\'41\',C(){q(m.7R||m.4b){A G=m.1d(\'G\',{T:\'e0/8I\'},I,W.2C(\'e1\')[0]),8E=W.7a==\'8v\';C 5P(8m,8n){q(m.2h&&(m.2t<9||8E)){A 1i=W.c6[W.c6.V-1];q(1F(1i.5P)=="7j")1i.5P(8m,8n)}J{G.1X(W.e6(8m+" {"+8n+"}"))}}C 5T(1f){E\'e5( ( ( ez = W.5h.\'+1f+\' ? W.5h.\'+1f+\' : W.19.\'+1f+\' ) ) + \\\'F\\\' );\'}q(m.7R)5P(\'.K 1N\',\'4L: 7T(\'+m.5c+m.7R+\'), 7Q !dA;\');5P(\'.K-2x-D\',m.2h&&(m.2t<7||8E)?\'1l: 2l; \'+\'1b:\'+5T(\'5O\')+\'Y:\'+5T(\'5R\')+\'L:\'+5T(\'8F\')+\'N:\'+5T(\'c4\'):\'1l: fV; L: 2w%; N: 2w%; 1b: 0; Y: 0\')}});m.2j(1S,\'3O\',C(){m.7S();q(m.2x)O(A i=0;iHighslide JS
    ', - creditsTitle : 'Go to the Highslide JS homepage', - previousText : 'Previous', - nextText : 'Next', - moveText : 'Move', - closeText : 'Close', - closeTitle : 'Close (esc)', - resizeTitle : 'Resize', - playText : 'Play', - playTitle : 'Play slideshow (spacebar)', - pauseText : 'Pause', - pauseTitle : 'Pause slideshow (spacebar)', - previousTitle : 'Previous (arrow left)', - nextTitle : 'Next (arrow right)', - moveTitle : 'Move', - fullExpandText : '1:1', - number: 'Image %1 of %2', - restoreTitle : 'Click to close image, click and drag to move. Use arrow keys for next and previous.' -}, -// See http://highslide.com/ref for examples of settings -graphicsDir : 'highslide/graphics/', -expandCursor : 'zoomin.cur', // null disables -restoreCursor : 'zoomout.cur', // null disables -expandDuration : 250, // milliseconds -restoreDuration : 250, -marginLeft : 15, -marginRight : 15, -marginTop : 15, -marginBottom : 15, -zIndexCounter : 1001, // adjust to other absolutely positioned elements -loadingOpacity : 0.75, -allowMultipleInstances: true, -numberOfImagesToPreload : 5, -outlineWhileAnimating : 2, // 0 = never, 1 = always, 2 = HTML only -outlineStartOffset : 3, // ends at 10 -padToMinWidth : false, // pad the popup width to make room for wide caption -fullExpandPosition : 'bottom right', -fullExpandOpacity : 1, -showCredits : true, // you can set this to false if you want -creditsHref : 'http://highslide.com/', -creditsTarget : '_self', -enableKeyListener : true, -openerTagNames : ['a'], // Add more to allow slideshow indexing -transitions : [], -transitionDuration: 250, -dimmingOpacity: 0, // Lightbox style dimming background -dimmingDuration: 50, // 0 for instant dimming - -anchor : 'auto', // where the image expands from -align : 'auto', // position in the client (overrides anchor) -targetX: null, // the id of a target element -targetY: null, -dragByHeading: true, -minWidth: 200, -minHeight: 200, -allowSizeReduction: true, // allow the image to reduce to fit client size. If false, this overrides minWidth and minHeight -outlineType : 'drop-shadow', // set null to disable outlines -skin : { - controls: - '
    ' -}, -// END OF YOUR SETTINGS - - -// declare internal properties -preloadTheseImages : [], -continuePreloading: true, -expanders : [], -overrides : [ - 'allowSizeReduction', - 'useBox', - 'anchor', - 'align', - 'targetX', - 'targetY', - 'outlineType', - 'outlineWhileAnimating', - 'captionId', - 'captionText', - 'captionEval', - 'captionOverlay', - 'headingId', - 'headingText', - 'headingEval', - 'headingOverlay', - 'creditsPosition', - 'dragByHeading', - 'autoplay', - 'numberPosition', - 'transitions', - 'dimmingOpacity', - - 'width', - 'height', - - 'wrapperClassName', - 'minWidth', - 'minHeight', - 'maxWidth', - 'maxHeight', - 'pageOrigin', - 'slideshowGroup', - 'easing', - 'easingClose', - 'fadeInOut', - 'src' -], -overlays : [], -idCounter : 0, -oPos : { - x: ['leftpanel', 'left', 'center', 'right', 'rightpanel'], - y: ['above', 'top', 'middle', 'bottom', 'below'] -}, -mouse: {}, -headingOverlay: {}, -captionOverlay: {}, -timers : [], - -slideshows : [], - -pendingOutlines : {}, -clones : {}, -onReady: [], -uaVersion: /Trident\/4\.0/.test(navigator.userAgent) ? 8 : - parseFloat((navigator.userAgent.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1]), -ie : (document.all && !window.opera), -//ie : navigator && /MSIE [678]/.test(navigator.userAgent), // ie9 compliant? -safari : /Safari/.test(navigator.userAgent), -geckoMac : /Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent), - -$ : function (id) { - if (id) return document.getElementById(id); -}, - -push : function (arr, val) { - arr[arr.length] = val; -}, - -createElement : function (tag, attribs, styles, parent, nopad) { - var el = document.createElement(tag); - if (attribs) hs.extend(el, attribs); - if (nopad) hs.setStyles(el, {padding: 0, border: 'none', margin: 0}); - if (styles) hs.setStyles(el, styles); - if (parent) parent.appendChild(el); - return el; -}, - -extend : function (el, attribs) { - for (var x in attribs) el[x] = attribs[x]; - return el; -}, - -setStyles : function (el, styles) { - for (var x in styles) { - if (hs.ieLt9 && x == 'opacity') { - if (styles[x] > 0.99) el.style.removeAttribute('filter'); - else el.style.filter = 'alpha(opacity='+ (styles[x] * 100) +')'; - } - else el.style[x] = styles[x]; - } -}, -animate: function(el, prop, opt) { - var start, - end, - unit; - if (typeof opt != 'object' || opt === null) { - var args = arguments; - opt = { - duration: args[2], - easing: args[3], - complete: args[4] - }; - } - if (typeof opt.duration != 'number') opt.duration = 250; - opt.easing = Math[opt.easing] || Math.easeInQuad; - opt.curAnim = hs.extend({}, prop); - for (var name in prop) { - var e = new hs.fx(el, opt , name ); - - start = parseFloat(hs.css(el, name)) || 0; - end = parseFloat(prop[name]); - unit = name != 'opacity' ? 'px' : ''; - - e.custom( start, end, unit ); - } -}, -css: function(el, prop) { - if (el.style[prop]) { - return el.style[prop]; - } else if (document.defaultView) { - return document.defaultView.getComputedStyle(el, null).getPropertyValue(prop); - - } else { - if (prop == 'opacity') prop = 'filter'; - var val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b){ return b.toUpperCase(); })]; - if (prop == 'filter') - val = val.replace(/alpha\(opacity=([0-9]+)\)/, - function (a, b) { return b / 100 }); - return val === '' ? 1 : val; - } -}, - -getPageSize : function () { - var d = document, w = window, iebody = d.compatMode && d.compatMode != 'BackCompat' - ? d.documentElement : d.body, - ieLt9 = hs.ie && (hs.uaVersion < 9 || typeof pageXOffset == 'undefined'); - - var width = ieLt9 ? iebody.clientWidth : - (d.documentElement.clientWidth || self.innerWidth), - height = ieLt9 ? iebody.clientHeight : self.innerHeight; - hs.page = { - width: width, - height: height, - scrollLeft: ieLt9 ? iebody.scrollLeft : pageXOffset, - scrollTop: ieLt9 ? iebody.scrollTop : pageYOffset - }; - return hs.page; -}, - -getPosition : function(el) { - var p = { x: el.offsetLeft, y: el.offsetTop }; - while (el.offsetParent) { - el = el.offsetParent; - p.x += el.offsetLeft; - p.y += el.offsetTop; - if (el != document.body && el != document.documentElement) { - p.x -= el.scrollLeft; - p.y -= el.scrollTop; - } - } - return p; -}, - -expand : function(a, params, custom, type) { - if (!a) a = hs.createElement('a', null, { display: 'none' }, hs.container); - if (typeof a.getParams == 'function') return params; - try { - new hs.Expander(a, params, custom); - return false; - } catch (e) { return true; } -}, -getElementByClass : function (el, tagName, className) { - var els = el.getElementsByTagName(tagName); - for (var i = 0; i < els.length; i++) { - if ((new RegExp(className)).test(els[i].className)) { - return els[i]; - } - } - return null; -}, -replaceLang : function(s) { - s = s.replace(/\s/g, ' '); - var re = /{hs\.lang\.([^}]+)\}/g, - matches = s.match(re), - lang; - if (matches) for (var i = 0; i < matches.length; i++) { - lang = matches[i].replace(re, "$1"); - if (typeof hs.lang[lang] != 'undefined') s = s.replace(matches[i], hs.lang[lang]); - } - return s; -}, - - -focusTopmost : function() { - var topZ = 0, - topmostKey = -1, - expanders = hs.expanders, - exp, - zIndex; - for (var i = 0; i < expanders.length; i++) { - exp = expanders[i]; - if (exp) { - zIndex = exp.wrapper.style.zIndex; - if (zIndex && zIndex > topZ) { - topZ = zIndex; - topmostKey = i; - } - } - } - if (topmostKey == -1) hs.focusKey = -1; - else expanders[topmostKey].focus(); -}, - -getParam : function (a, param) { - a.getParams = a.onclick; - var p = a.getParams ? a.getParams() : null; - a.getParams = null; - - return (p && typeof p[param] != 'undefined') ? p[param] : - (typeof hs[param] != 'undefined' ? hs[param] : null); -}, - -getSrc : function (a) { - var src = hs.getParam(a, 'src'); - if (src) return src; - return a.href; -}, - -getNode : function (id) { - var node = hs.$(id), clone = hs.clones[id], a = {}; - if (!node && !clone) return null; - if (!clone) { - clone = node.cloneNode(true); - clone.id = ''; - hs.clones[id] = clone; - return node; - } else { - return clone.cloneNode(true); - } -}, - -discardElement : function(d) { - if (d) hs.garbageBin.appendChild(d); - hs.garbageBin.innerHTML = ''; -}, -dim : function(exp) { - if (!hs.dimmer) { - isNew = true; - hs.dimmer = hs.createElement ('div', { - className: 'highslide-dimming highslide-viewport-size', - owner: '', - onclick: function() { - - hs.close(); - } - }, { - visibility: 'visible', - opacity: 0 - }, hs.container, true); - - if (/(Android|iPad|iPhone|iPod)/.test(navigator.userAgent)) { - var body = document.body; - function pixDimmerSize() { - hs.setStyles(hs.dimmer, { - width: body.scrollWidth +'px', - height: body.scrollHeight +'px' - }); - } - pixDimmerSize(); - hs.addEventListener(window, 'resize', pixDimmerSize); - } - } - hs.dimmer.style.display = ''; - - var isNew = hs.dimmer.owner == ''; - hs.dimmer.owner += '|'+ exp.key; - - if (isNew) { - if (hs.geckoMac && hs.dimmingGeckoFix) - hs.setStyles(hs.dimmer, { - background: 'url('+ hs.graphicsDir + 'geckodimmer.png)', - opacity: 1 - }); - else - hs.animate(hs.dimmer, { opacity: exp.dimmingOpacity }, hs.dimmingDuration); - } -}, -undim : function(key) { - if (!hs.dimmer) return; - if (typeof key != 'undefined') hs.dimmer.owner = hs.dimmer.owner.replace('|'+ key, ''); - - if ( - (typeof key != 'undefined' && hs.dimmer.owner != '') - || (hs.upcoming && hs.getParam(hs.upcoming, 'dimmingOpacity')) - ) return; - - if (hs.geckoMac && hs.dimmingGeckoFix) hs.dimmer.style.display = 'none'; - else hs.animate(hs.dimmer, { opacity: 0 }, hs.dimmingDuration, null, function() { - hs.dimmer.style.display = 'none'; - }); -}, -transit : function (adj, exp) { - var last = exp || hs.getExpander(); - exp = last; - if (hs.upcoming) return false; - else hs.last = last; - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - try { - hs.upcoming = adj; - adj.onclick(); - } catch (e){ - hs.last = hs.upcoming = null; - } - try { - if (!adj || exp.transitions[1] != 'crossfade') - exp.close(); - } catch (e) {} - return false; -}, - -previousOrNext : function (el, op) { - var exp = hs.getExpander(el); - if (exp) return hs.transit(exp.getAdjacentAnchor(op), exp); - else return false; -}, - -previous : function (el) { - return hs.previousOrNext(el, -1); -}, - -next : function (el) { - return hs.previousOrNext(el, 1); -}, - -keyHandler : function(e) { - if (!e) e = window.event; - if (!e.target) e.target = e.srcElement; // ie - if (typeof e.target.form != 'undefined') return true; // form element has focus - var exp = hs.getExpander(); - - var op = null; - switch (e.keyCode) { - case 70: // f - if (exp) exp.doFullExpand(); - return true; - case 32: // Space - op = 2; - break; - case 34: // Page Down - case 39: // Arrow right - case 40: // Arrow down - op = 1; - break; - case 8: // Backspace - case 33: // Page Up - case 37: // Arrow left - case 38: // Arrow up - op = -1; - break; - case 27: // Escape - case 13: // Enter - op = 0; - } - if (op !== null) {if (op != 2)hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - if (!hs.enableKeyListener) return true; - - if (e.preventDefault) e.preventDefault(); - else e.returnValue = false; - if (exp) { - if (op == 0) { - exp.close(); - } else if (op == 2) { - if (exp.slideshow) exp.slideshow.hitSpace(); - } else { - if (exp.slideshow) exp.slideshow.pause(); - hs.previousOrNext(exp.key, op); - } - return false; - } - } - return true; -}, - - -registerOverlay : function (overlay) { - hs.push(hs.overlays, hs.extend(overlay, { hsId: 'hsId'+ hs.idCounter++ } )); -}, - - -addSlideshow : function (options) { - var sg = options.slideshowGroup; - if (typeof sg == 'object') { - for (var i = 0; i < sg.length; i++) { - var o = {}; - for (var x in options) o[x] = options[x]; - o.slideshowGroup = sg[i]; - hs.push(hs.slideshows, o); - } - } else { - hs.push(hs.slideshows, options); - } -}, - -getWrapperKey : function (element, expOnly) { - var el, re = /^highslide-wrapper-([0-9]+)$/; - // 1. look in open expanders - el = element; - while (el.parentNode) { - if (el.hsKey !== undefined) return el.hsKey; - if (el.id && re.test(el.id)) return el.id.replace(re, "$1"); - el = el.parentNode; - } - // 2. look in thumbnail - if (!expOnly) { - el = element; - while (el.parentNode) { - if (el.tagName && hs.isHsAnchor(el)) { - for (var key = 0; key < hs.expanders.length; key++) { - var exp = hs.expanders[key]; - if (exp && exp.a == el) return key; - } - } - el = el.parentNode; - } - } - return null; -}, - -getExpander : function (el, expOnly) { - if (typeof el == 'undefined') return hs.expanders[hs.focusKey] || null; - if (typeof el == 'number') return hs.expanders[el] || null; - if (typeof el == 'string') el = hs.$(el); - return hs.expanders[hs.getWrapperKey(el, expOnly)] || null; -}, - -isHsAnchor : function (a) { - return (a.onclick && a.onclick.toString().replace(/\s/g, ' ').match(/hs.(htmlE|e)xpand/)); -}, - -reOrder : function () { - for (var i = 0; i < hs.expanders.length; i++) - if (hs.expanders[i] && hs.expanders[i].isExpanded) hs.focusTopmost(); -}, - -mouseClickHandler : function(e) -{ - if (!e) e = window.event; - if (e.button > 1) return true; - if (!e.target) e.target = e.srcElement; - - var el = e.target; - while (el.parentNode - && !(/highslide-(image|move|html|resize)/.test(el.className))) - { - el = el.parentNode; - } - var exp = hs.getExpander(el); - if (exp && (exp.isClosing || !exp.isExpanded)) return true; - - if (exp && e.type == 'mousedown') { - if (e.target.form) return true; - var match = el.className.match(/highslide-(image|move|resize)/); - if (match) { - hs.dragArgs = { - exp: exp , - type: match[1], - left: exp.x.pos, - width: exp.x.size, - top: exp.y.pos, - height: exp.y.size, - clickX: e.clientX, - clickY: e.clientY - }; - - - hs.addEventListener(document, 'mousemove', hs.dragHandler); - if (e.preventDefault) e.preventDefault(); // FF - - if (/highslide-(image|html)-blur/.test(exp.content.className)) { - exp.focus(); - hs.hasFocused = true; - } - return false; - } - } else if (e.type == 'mouseup') { - - hs.removeEventListener(document, 'mousemove', hs.dragHandler); - - if (hs.dragArgs) { - if (hs.styleRestoreCursor && hs.dragArgs.type == 'image') - hs.dragArgs.exp.content.style.cursor = hs.styleRestoreCursor; - var hasDragged = hs.dragArgs.hasDragged; - - if (!hasDragged &&!hs.hasFocused && !/(move|resize)/.test(hs.dragArgs.type)) { - exp.close(); - } - else if (hasDragged || (!hasDragged && hs.hasHtmlExpanders)) { - hs.dragArgs.exp.doShowHide('hidden'); - } - hs.hasFocused = false; - hs.dragArgs = null; - - } else if (/highslide-image-blur/.test(el.className)) { - el.style.cursor = hs.styleRestoreCursor; - } - } - return false; -}, - -dragHandler : function(e) -{ - if (!hs.dragArgs) return true; - if (!e) e = window.event; - var a = hs.dragArgs, exp = a.exp; - - a.dX = e.clientX - a.clickX; - a.dY = e.clientY - a.clickY; - - var distance = Math.sqrt(Math.pow(a.dX, 2) + Math.pow(a.dY, 2)); - if (!a.hasDragged) a.hasDragged = (a.type != 'image' && distance > 0) - || (distance > (hs.dragSensitivity || 5)); - - if (a.hasDragged && e.clientX > 5 && e.clientY > 5) { - - if (a.type == 'resize') exp.resize(a); - else { - exp.moveTo(a.left + a.dX, a.top + a.dY); - if (a.type == 'image') exp.content.style.cursor = 'move'; - } - } - return false; -}, - -wrapperMouseHandler : function (e) { - try { - if (!e) e = window.event; - var over = /mouseover/i.test(e.type); - if (!e.target) e.target = e.srcElement; // ie - if (!e.relatedTarget) e.relatedTarget = - over ? e.fromElement : e.toElement; // ie - var exp = hs.getExpander(e.target); - if (!exp.isExpanded) return; - if (!exp || !e.relatedTarget || hs.getExpander(e.relatedTarget, true) == exp - || hs.dragArgs) return; - for (var i = 0; i < exp.overlays.length; i++) (function() { - var o = hs.$('hsId'+ exp.overlays[i]); - if (o && o.hideOnMouseOut) { - if (over) hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: over ? o.opacity : 0 }, o.dur); - } - })(); - } catch (e) {} -}, -addEventListener : function (el, event, func) { - if (el == document && event == 'ready') { - hs.push(hs.onReady, func); - } - try { - el.addEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - el.attachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = func; - } - } -}, - -removeEventListener : function (el, event, func) { - try { - el.removeEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = null; - } - } -}, - -preloadFullImage : function (i) { - if (hs.continuePreloading && hs.preloadTheseImages[i] && hs.preloadTheseImages[i] != 'undefined') { - var img = document.createElement('img'); - img.onload = function() { - img = null; - hs.preloadFullImage(i + 1); - }; - img.src = hs.preloadTheseImages[i]; - } -}, -preloadImages : function (number) { - if (number && typeof number != 'object') hs.numberOfImagesToPreload = number; - - var arr = hs.getAnchors(); - for (var i = 0; i < arr.images.length && i < hs.numberOfImagesToPreload; i++) { - hs.push(hs.preloadTheseImages, hs.getSrc(arr.images[i])); - } - - // preload outlines - if (hs.outlineType) new hs.Outline(hs.outlineType, function () { hs.preloadFullImage(0)} ); - else - - hs.preloadFullImage(0); - - // preload cursor - if (hs.restoreCursor) var cur = hs.createElement('img', { src: hs.graphicsDir + hs.restoreCursor }); -}, - - -init : function () { - if (!hs.container) { - - hs.ieLt7 = hs.ie && hs.uaVersion < 7; - hs.ieLt9 = hs.ie && hs.uaVersion < 9; - - hs.getPageSize(); - for (var x in hs.langDefaults) { - if (typeof hs[x] != 'undefined') hs.lang[x] = hs[x]; - else if (typeof hs.lang[x] == 'undefined' && typeof hs.langDefaults[x] != 'undefined') - hs.lang[x] = hs.langDefaults[x]; - } - - hs.container = hs.createElement('div', { - className: 'highslide-container' - }, { - position: 'absolute', - left: 0, - top: 0, - width: '100%', - zIndex: hs.zIndexCounter, - direction: 'ltr' - }, - document.body, - true - ); - hs.loading = hs.createElement('a', { - className: 'highslide-loading', - title: hs.lang.loadingTitle, - innerHTML: hs.lang.loadingText, - href: 'javascript:;' - }, { - position: 'absolute', - top: '-9999px', - opacity: hs.loadingOpacity, - zIndex: 1 - }, hs.container - ); - hs.garbageBin = hs.createElement('div', null, { display: 'none' }, hs.container); - hs.viewport = hs.createElement('div', { - className: 'highslide-viewport highslide-viewport-size' - }, { - visibility: (hs.safari && hs.uaVersion < 525) ? 'visible' : 'hidden' - }, hs.container, 1 - ); - - // http://www.robertpenner.com/easing/ - Math.linearTween = function (t, b, c, d) { - return c*t/d + b; - }; - Math.easeInQuad = function (t, b, c, d) { - return c*(t/=d)*t + b; - }; - Math.easeOutQuad = function (t, b, c, d) { - return -c *(t/=d)*(t-2) + b; - }; - - hs.hideSelects = hs.ieLt7; - hs.hideIframes = ((window.opera && hs.uaVersion < 9) || navigator.vendor == 'KDE' - || (hs.ieLt7 && hs.uaVersion < 5.5)); - } -}, -ready : function() { - if (hs.isReady) return; - hs.isReady = true; - for (var i = 0; i < hs.onReady.length; i++) hs.onReady[i](); -}, - -updateAnchors : function() { - var el, els, all = [], images = [],groups = {}, re; - - for (var i = 0; i < hs.openerTagNames.length; i++) { - els = document.getElementsByTagName(hs.openerTagNames[i]); - for (var j = 0; j < els.length; j++) { - el = els[j]; - re = hs.isHsAnchor(el); - if (re) { - hs.push(all, el); - if (re[0] == 'hs.expand') hs.push(images, el); - var g = hs.getParam(el, 'slideshowGroup') || 'none'; - if (!groups[g]) groups[g] = []; - hs.push(groups[g], el); - } - } - } - hs.anchors = { all: all, groups: groups, images: images }; - return hs.anchors; - -}, - -getAnchors : function() { - return hs.anchors || hs.updateAnchors(); -}, - - -close : function(el) { - var exp = hs.getExpander(el); - if (exp) exp.close(); - return false; -} -}; // end hs object -hs.fx = function( elem, options, prop ){ - this.options = options; - this.elem = elem; - this.prop = prop; - - if (!options.orig) options.orig = {}; -}; -hs.fx.prototype = { - update: function(){ - (hs.fx.step[this.prop] || hs.fx.step._default)(this); - - if (this.options.step) - this.options.step.call(this.elem, this.now, this); - - }, - custom: function(from, to, unit){ - this.startTime = (new Date()).getTime(); - this.start = from; - this.end = to; - this.unit = unit;// || this.unit || "px"; - this.now = this.start; - this.pos = this.state = 0; - - var self = this; - function t(gotoEnd){ - return self.step(gotoEnd); - } - - t.elem = this.elem; - - if ( t() && hs.timers.push(t) == 1 ) { - hs.timerId = setInterval(function(){ - var timers = hs.timers; - - for ( var i = 0; i < timers.length; i++ ) - if ( !timers[i]() ) - timers.splice(i--, 1); - - if ( !timers.length ) { - clearInterval(hs.timerId); - } - }, 13); - } - }, - step: function(gotoEnd){ - var t = (new Date()).getTime(); - if ( gotoEnd || t >= this.options.duration + this.startTime ) { - this.now = this.end; - this.pos = this.state = 1; - this.update(); - - this.options.curAnim[ this.prop ] = true; - - var done = true; - for ( var i in this.options.curAnim ) - if ( this.options.curAnim[i] !== true ) - done = false; - - if ( done ) { - if (this.options.complete) this.options.complete.call(this.elem); - } - return false; - } else { - var n = t - this.startTime; - this.state = n / this.options.duration; - this.pos = this.options.easing(n, 0, 1, this.options.duration); - this.now = this.start + ((this.end - this.start) * this.pos); - this.update(); - } - return true; - } - -}; - -hs.extend( hs.fx, { - step: { - - opacity: function(fx){ - hs.setStyles(fx.elem, { opacity: fx.now }); - }, - - _default: function(fx){ - try { - if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) - fx.elem.style[ fx.prop ] = fx.now + fx.unit; - else - fx.elem[ fx.prop ] = fx.now; - } catch (e) {} - } - } -}); - -hs.Outline = function (outlineType, onLoad) { - this.onLoad = onLoad; - this.outlineType = outlineType; - var v = hs.uaVersion, tr; - - this.hasAlphaImageLoader = hs.ie && hs.uaVersion < 7; - if (!outlineType) { - if (onLoad) onLoad(); - return; - } - - hs.init(); - this.table = hs.createElement( - 'table', { - cellSpacing: 0 - }, { - visibility: 'hidden', - position: 'absolute', - borderCollapse: 'collapse', - width: 0 - }, - hs.container, - true - ); - var tbody = hs.createElement('tbody', null, null, this.table, 1); - - this.td = []; - for (var i = 0; i <= 8; i++) { - if (i % 3 == 0) tr = hs.createElement('tr', null, { height: 'auto' }, tbody, true); - this.td[i] = hs.createElement('td', null, null, tr, true); - var style = i != 4 ? { lineHeight: 0, fontSize: 0} : { position : 'relative' }; - hs.setStyles(this.td[i], style); - } - this.td[4].className = outlineType +' highslide-outline'; - - this.preloadGraphic(); -}; - -hs.Outline.prototype = { -preloadGraphic : function () { - var src = hs.graphicsDir + (hs.outlinesDir || "outlines/")+ this.outlineType +".png"; - - var appendTo = hs.safari && hs.uaVersion < 525 ? hs.container : null; - this.graphic = hs.createElement('img', null, { position: 'absolute', - top: '-9999px' }, appendTo, true); // for onload trigger - - var pThis = this; - this.graphic.onload = function() { pThis.onGraphicLoad(); }; - - this.graphic.src = src; -}, - -onGraphicLoad : function () { - var o = this.offset = this.graphic.width / 4, - pos = [[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]], - dim = { height: (2*o) +'px', width: (2*o) +'px' }; - for (var i = 0; i <= 8; i++) { - if (pos[i]) { - if (this.hasAlphaImageLoader) { - var w = (i == 1 || i == 7) ? '100%' : this.graphic.width +'px'; - var div = hs.createElement('div', null, { width: '100%', height: '100%', position: 'relative', overflow: 'hidden'}, this.td[i], true); - hs.createElement ('div', null, { - filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+ this.graphic.src + "')", - position: 'absolute', - width: w, - height: this.graphic.height +'px', - left: (pos[i][0]*o)+'px', - top: (pos[i][1]*o)+'px' - }, - div, - true); - } else { - hs.setStyles(this.td[i], { background: 'url('+ this.graphic.src +') '+ (pos[i][0]*o)+'px '+(pos[i][1]*o)+'px'}); - } - - if (window.opera && (i == 3 || i ==5)) - hs.createElement('div', null, dim, this.td[i], true); - - hs.setStyles (this.td[i], dim); - } - } - this.graphic = null; - if (hs.pendingOutlines[this.outlineType]) hs.pendingOutlines[this.outlineType].destroy(); - hs.pendingOutlines[this.outlineType] = this; - if (this.onLoad) this.onLoad(); -}, - -setPosition : function (pos, offset, vis, dur, easing) { - var exp = this.exp, - stl = exp.wrapper.style, - offset = offset || 0, - pos = pos || { - x: exp.x.pos + offset, - y: exp.y.pos + offset, - w: exp.x.get('wsize') - 2 * offset, - h: exp.y.get('wsize') - 2 * offset - }; - if (vis) this.table.style.visibility = (pos.h >= 4 * this.offset) - ? 'visible' : 'hidden'; - hs.setStyles(this.table, { - left: (pos.x - this.offset) +'px', - top: (pos.y - this.offset) +'px', - width: (pos.w + 2 * this.offset) +'px' - }); - - pos.w -= 2 * this.offset; - pos.h -= 2 * this.offset; - hs.setStyles (this.td[4], { - width: pos.w >= 0 ? pos.w +'px' : 0, - height: pos.h >= 0 ? pos.h +'px' : 0 - }); - if (this.hasAlphaImageLoader) this.td[3].style.height - = this.td[5].style.height = this.td[4].style.height; - -}, - -destroy : function(hide) { - if (hide) this.table.style.visibility = 'hidden'; - else hs.discardElement(this.table); -} -}; - -hs.Dimension = function(exp, dim) { - this.exp = exp; - this.dim = dim; - this.ucwh = dim == 'x' ? 'Width' : 'Height'; - this.wh = this.ucwh.toLowerCase(); - this.uclt = dim == 'x' ? 'Left' : 'Top'; - this.lt = this.uclt.toLowerCase(); - this.ucrb = dim == 'x' ? 'Right' : 'Bottom'; - this.rb = this.ucrb.toLowerCase(); - this.p1 = this.p2 = 0; -}; -hs.Dimension.prototype = { -get : function(key) { - switch (key) { - case 'loadingPos': - return this.tpos + this.tb + (this.t - hs.loading['offset'+ this.ucwh]) / 2; - case 'loadingPosXfade': - return this.pos + this.cb+ this.p1 + (this.size - hs.loading['offset'+ this.ucwh]) / 2; - case 'wsize': - return this.size + 2 * this.cb + this.p1 + this.p2; - case 'fitsize': - return this.clientSize - this.marginMin - this.marginMax; - case 'maxsize': - return this.get('fitsize') - 2 * this.cb - this.p1 - this.p2 ; - case 'opos': - return this.pos - (this.exp.outline ? this.exp.outline.offset : 0); - case 'osize': - return this.get('wsize') + (this.exp.outline ? 2*this.exp.outline.offset : 0); - case 'imgPad': - return this.imgSize ? Math.round((this.size - this.imgSize) / 2) : 0; - - } -}, -calcBorders: function() { - // correct for borders - this.cb = (this.exp.content['offset'+ this.ucwh] - this.t) / 2; - - this.marginMax = hs['margin'+ this.ucrb]; -}, -calcThumb: function() { - this.t = this.exp.el[this.wh] ? parseInt(this.exp.el[this.wh]) : - this.exp.el['offset'+ this.ucwh]; - this.tpos = this.exp.tpos[this.dim]; - this.tb = (this.exp.el['offset'+ this.ucwh] - this.t) / 2; - if (this.tpos == 0 || this.tpos == -1) { - this.tpos = (hs.page[this.wh] / 2) + hs.page['scroll'+ this.uclt]; - }; -}, -calcExpanded: function() { - var exp = this.exp; - this.justify = 'auto'; - - // get alignment - if (exp.align == 'center') this.justify = 'center'; - else if (new RegExp(this.lt).test(exp.anchor)) this.justify = null; - else if (new RegExp(this.rb).test(exp.anchor)) this.justify = 'max'; - - - // size and position - this.pos = this.tpos - this.cb + this.tb; - - if (this.maxHeight && this.dim == 'x') - exp.maxWidth = Math.min(exp.maxWidth || this.full, exp.maxHeight * this.full / exp.y.full); - - this.size = Math.min(this.full, exp['max'+ this.ucwh] || this.full); - this.minSize = exp.allowSizeReduction ? - Math.min(exp['min'+ this.ucwh], this.full) :this.full; - if (exp.isImage && exp.useBox) { - this.size = exp[this.wh]; - this.imgSize = this.full; - } - if (this.dim == 'x' && hs.padToMinWidth) this.minSize = exp.minWidth; - this.target = exp['target'+ this.dim.toUpperCase()]; - this.marginMin = hs['margin'+ this.uclt]; - this.scroll = hs.page['scroll'+ this.uclt]; - this.clientSize = hs.page[this.wh]; -}, -setSize: function(i) { - var exp = this.exp; - if (exp.isImage && (exp.useBox || hs.padToMinWidth)) { - this.imgSize = i; - this.size = Math.max(this.size, this.imgSize); - exp.content.style[this.lt] = this.get('imgPad')+'px'; - } else - this.size = i; - - exp.content.style[this.wh] = i +'px'; - exp.wrapper.style[this.wh] = this.get('wsize') +'px'; - if (exp.outline) exp.outline.setPosition(); - if (this.dim == 'x' && exp.overlayBox) exp.sizeOverlayBox(true); - if (this.dim == 'x' && exp.slideshow && exp.isImage) { - if (i == this.full) exp.slideshow.disable('full-expand'); - else exp.slideshow.enable('full-expand'); - } -}, -setPos: function(i) { - this.pos = i; - this.exp.wrapper.style[this.lt] = i +'px'; - - if (this.exp.outline) this.exp.outline.setPosition(); - -} -}; - -hs.Expander = function(a, params, custom, contentType) { - if (document.readyState && hs.ie && !hs.isReady) { - hs.addEventListener(document, 'ready', function() { - new hs.Expander(a, params, custom, contentType); - }); - return; - } - this.a = a; - this.custom = custom; - this.contentType = contentType || 'image'; - this.isImage = !this.isHtml; - - hs.continuePreloading = false; - this.overlays = []; - this.last = hs.last; - hs.last = null; - hs.init(); - var key = this.key = hs.expanders.length; - // override inline parameters - for (var i = 0; i < hs.overrides.length; i++) { - var name = hs.overrides[i]; - this[name] = params && typeof params[name] != 'undefined' ? - params[name] : hs[name]; - } - if (!this.src) this.src = a.href; - - // get thumb - var el = (params && params.thumbnailId) ? hs.$(params.thumbnailId) : a; - el = this.thumb = el.getElementsByTagName('img')[0] || el; - this.thumbsUserSetId = el.id || a.id; - - // check if already open - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].a == a - && !(this.last && this.transitions[1] == 'crossfade')) { - hs.expanders[i].focus(); - return false; - } - } - - // cancel other - if (!hs.allowSimultaneousLoading) for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].thumb != el && !hs.expanders[i].onLoadStarted) { - hs.expanders[i].cancelLoading(); - } - } - hs.expanders[key] = this; - if (!hs.allowMultipleInstances && !hs.upcoming) { - if (hs.expanders[key-1]) hs.expanders[key-1].close(); - if (typeof hs.focusKey != 'undefined' && hs.expanders[hs.focusKey]) - hs.expanders[hs.focusKey].close(); - } - - // initiate metrics - this.el = el; - this.tpos = this.pageOrigin || hs.getPosition(el); - hs.getPageSize(); - var x = this.x = new hs.Dimension(this, 'x'); - x.calcThumb(); - var y = this.y = new hs.Dimension(this, 'y'); - y.calcThumb(); - this.wrapper = hs.createElement( - 'div', { - id: 'highslide-wrapper-'+ this.key, - className: 'highslide-wrapper '+ this.wrapperClassName - }, { - visibility: 'hidden', - position: 'absolute', - zIndex: hs.zIndexCounter += 2 - }, null, true ); - - this.wrapper.onmouseover = this.wrapper.onmouseout = hs.wrapperMouseHandler; - if (this.contentType == 'image' && this.outlineWhileAnimating == 2) - this.outlineWhileAnimating = 0; - - // get the outline - if (!this.outlineType - || (this.last && this.isImage && this.transitions[1] == 'crossfade')) { - this[this.contentType +'Create'](); - - } else if (hs.pendingOutlines[this.outlineType]) { - this.connectOutline(); - this[this.contentType +'Create'](); - - } else { - this.showLoading(); - var exp = this; - new hs.Outline(this.outlineType, - function () { - exp.connectOutline(); - exp[exp.contentType +'Create'](); - } - ); - } - return true; -}; - -hs.Expander.prototype = { -error : function(e) { - if (hs.debug) alert ('Line '+ e.lineNumber +': '+ e.message); - else window.location.href = this.src; -}, - -connectOutline : function() { - var outline = this.outline = hs.pendingOutlines[this.outlineType]; - outline.exp = this; - outline.table.style.zIndex = this.wrapper.style.zIndex - 1; - hs.pendingOutlines[this.outlineType] = null; -}, - -showLoading : function() { - if (this.onLoadStarted || this.loading) return; - - this.loading = hs.loading; - var exp = this; - this.loading.onclick = function() { - exp.cancelLoading(); - }; - var exp = this, - l = this.x.get('loadingPos') +'px', - t = this.y.get('loadingPos') +'px'; - if (!tgt && this.last && this.transitions[1] == 'crossfade') - var tgt = this.last; - if (tgt) { - l = tgt.x.get('loadingPosXfade') +'px'; - t = tgt.y.get('loadingPosXfade') +'px'; - this.loading.style.zIndex = hs.zIndexCounter++; - } - setTimeout(function () { - if (exp.loading) hs.setStyles(exp.loading, { left: l, top: t, zIndex: hs.zIndexCounter++ })} - , 100); -}, - -imageCreate : function() { - var exp = this; - - var img = document.createElement('img'); - this.content = img; - img.onload = function () { - if (hs.expanders[exp.key]) exp.contentLoaded(); - }; - if (hs.blockRightClick) img.oncontextmenu = function() { return false; }; - img.className = 'highslide-image'; - hs.setStyles(img, { - visibility: 'hidden', - display: 'block', - position: 'absolute', - maxWidth: '9999px', - zIndex: 3 - }); - img.title = hs.lang.restoreTitle; - if (hs.safari && hs.uaVersion < 525) hs.container.appendChild(img); - if (hs.ie && hs.flushImgSize) img.src = null; - img.src = this.src; - - this.showLoading(); -}, - -contentLoaded : function() { - try { - if (!this.content) return; - this.content.onload = null; - if (this.onLoadStarted) return; - else this.onLoadStarted = true; - - var x = this.x, y = this.y; - - if (this.loading) { - hs.setStyles(this.loading, { top: '-9999px' }); - this.loading = null; - } - x.full = this.content.width; - y.full = this.content.height; - - hs.setStyles(this.content, { - width: x.t +'px', - height: y.t +'px' - }); - this.wrapper.appendChild(this.content); - hs.container.appendChild(this.wrapper); - - x.calcBorders(); - y.calcBorders(); - - hs.setStyles (this.wrapper, { - left: (x.tpos + x.tb - x.cb) +'px', - top: (y.tpos + x.tb - y.cb) +'px' - }); - - - this.initSlideshow(); - this.getOverlays(); - - var ratio = x.full / y.full; - x.calcExpanded(); - this.justify(x); - - y.calcExpanded(); - this.justify(y); - if (this.overlayBox) this.sizeOverlayBox(0, 1); - - - if (this.allowSizeReduction) { - this.correctRatio(ratio); - var ss = this.slideshow; - if (ss && this.last && ss.controls && ss.fixedControls) { - var pos = ss.overlayOptions.position || '', p; - for (var dim in hs.oPos) for (var i = 0; i < 5; i++) { - p = this[dim]; - if (pos.match(hs.oPos[dim][i])) { - p.pos = this.last[dim].pos - + (this.last[dim].p1 - p.p1) - + (this.last[dim].size - p.size) * [0, 0, .5, 1, 1][i]; - if (ss.fixedControls == 'fit') { - if (p.pos + p.size + p.p1 + p.p2 > p.scroll + p.clientSize - p.marginMax) - p.pos = p.scroll + p.clientSize - p.size - p.marginMin - p.marginMax - p.p1 - p.p2; - if (p.pos < p.scroll + p.marginMin) p.pos = p.scroll + p.marginMin; - } - } - } - } - if (this.isImage && this.x.full > (this.x.imgSize || this.x.size)) { - this.createFullExpand(); - if (this.overlays.length == 1) this.sizeOverlayBox(); - } - } - this.show(); - - } catch (e) { - this.error(e); - } -}, - -justify : function (p, moveOnly) { - var tgtArr, tgt = p.target, dim = p == this.x ? 'x' : 'y'; - - if (tgt && tgt.match(/ /)) { - tgtArr = tgt.split(' '); - tgt = tgtArr[0]; - } - if (tgt && hs.$(tgt)) { - p.pos = hs.getPosition(hs.$(tgt))[dim]; - if (tgtArr && tgtArr[1] && tgtArr[1].match(/^[-]?[0-9]+px$/)) - p.pos += parseInt(tgtArr[1]); - if (p.size < p.minSize) p.size = p.minSize; - - } else if (p.justify == 'auto' || p.justify == 'center') { - - var hasMovedMin = false; - - var allowReduce = p.exp.allowSizeReduction; - if (p.justify == 'center') - p.pos = Math.round(p.scroll + (p.clientSize + p.marginMin - p.marginMax - p.get('wsize')) / 2); - else - p.pos = Math.round(p.pos - ((p.get('wsize') - p.t) / 2)); - if (p.pos < p.scroll + p.marginMin) { - p.pos = p.scroll + p.marginMin; - hasMovedMin = true; - } - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - if (p.pos + p.get('wsize') > p.scroll + p.clientSize - p.marginMax) { - if (!moveOnly && hasMovedMin && allowReduce) { - p.size = Math.min(p.size, p.get(dim == 'y' ? 'fitsize' : 'maxsize')); - } else if (p.get('wsize') < p.get('fitsize')) { - p.pos = p.scroll + p.clientSize - p.marginMax - p.get('wsize'); - } else { // image larger than viewport - p.pos = p.scroll + p.marginMin; - if (!moveOnly && allowReduce) p.size = p.get(dim == 'y' ? 'fitsize' : 'maxsize'); - } - } - - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - - - } else if (p.justify == 'max') { - p.pos = Math.floor(p.pos - p.size + p.t); - } - - - if (p.pos < p.marginMin) { - var tmpMin = p.pos; - p.pos = p.marginMin; - - if (allowReduce && !moveOnly) p.size = p.size - (p.pos - tmpMin); - - } -}, - -correctRatio : function(ratio) { - var x = this.x, - y = this.y, - changed = false, - xSize = Math.min(x.full, x.size), - ySize = Math.min(y.full, y.size), - useBox = (this.useBox || hs.padToMinWidth); - - if (xSize / ySize > ratio) { // width greater - xSize = ySize * ratio; - if (xSize < x.minSize) { // below minWidth - xSize = x.minSize; - ySize = xSize / ratio; - } - changed = true; - - } else if (xSize / ySize < ratio) { // height greater - ySize = xSize / ratio; - changed = true; - } - - if (hs.padToMinWidth && x.full < x.minSize) { - x.imgSize = x.full; - y.size = y.imgSize = y.full; - } else if (this.useBox) { - x.imgSize = xSize; - y.imgSize = ySize; - } else { - x.size = xSize; - y.size = ySize; - } - changed = this.fitOverlayBox(this.useBox ? null : ratio, changed); - if (useBox && y.size < y.imgSize) { - y.imgSize = y.size; - x.imgSize = y.size * ratio; - } - if (changed || useBox) { - x.pos = x.tpos - x.cb + x.tb; - x.minSize = x.size; - this.justify(x, true); - - y.pos = y.tpos - y.cb + y.tb; - y.minSize = y.size; - this.justify(y, true); - if (this.overlayBox) this.sizeOverlayBox(); - } - - -}, -fitOverlayBox : function(ratio, changed) { - var x = this.x, y = this.y; - if (this.overlayBox) { - while (y.size > this.minHeight && x.size > this.minWidth - && y.get('wsize') > y.get('fitsize')) { - y.size -= 10; - if (ratio) x.size = y.size * ratio; - this.sizeOverlayBox(0, 1); - changed = true; - } - } - return changed; -}, - -show : function () { - var x = this.x, y = this.y; - this.doShowHide('hidden'); - if (this.slideshow && this.slideshow.thumbstrip) this.slideshow.thumbstrip.selectThumb(); - - // Apply size change - this.changeSize( - 1, { - wrapper: { - width : x.get('wsize'), - height : y.get('wsize'), - left: x.pos, - top: y.pos - }, - content: { - left: x.p1 + x.get('imgPad'), - top: y.p1 + y.get('imgPad'), - width:x.imgSize ||x.size, - height:y.imgSize ||y.size - } - }, - hs.expandDuration - ); -}, - -changeSize : function(up, to, dur) { - // transition - var trans = this.transitions, - other = up ? (this.last ? this.last.a : null) : hs.upcoming, - t = (trans[1] && other - && hs.getParam(other, 'transitions')[1] == trans[1]) ? - trans[1] : trans[0]; - - if (this[t] && t != 'expand') { - this[t](up, to); - return; - } - - if (this.outline && !this.outlineWhileAnimating) { - if (up) this.outline.setPosition(); - else this.outline.destroy(); - } - - - if (!up) this.destroyOverlays(); - - var exp = this, - x = exp.x, - y = exp.y, - easing = this.easing; - if (!up) easing = this.easingClose || easing; - var after = up ? - function() { - - if (exp.outline) exp.outline.table.style.visibility = "visible"; - setTimeout(function() { - exp.afterExpand(); - }, 50); - } : - function() { - exp.afterClose(); - }; - if (up) hs.setStyles( this.wrapper, { - width: x.t +'px', - height: y.t +'px' - }); - if (this.fadeInOut) { - hs.setStyles(this.wrapper, { opacity: up ? 0 : 1 }); - hs.extend(to.wrapper, { opacity: up }); - } - hs.animate( this.wrapper, to.wrapper, { - duration: dur, - easing: easing, - step: function(val, args) { - if (exp.outline && exp.outlineWhileAnimating && args.prop == 'top') { - var fac = up ? args.pos : 1 - args.pos; - var pos = { - w: x.t + (x.get('wsize') - x.t) * fac, - h: y.t + (y.get('wsize') - y.t) * fac, - x: x.tpos + (x.pos - x.tpos) * fac, - y: y.tpos + (y.pos - y.tpos) * fac - }; - exp.outline.setPosition(pos, 0, 1); - } - } - }); - hs.animate( this.content, to.content, dur, easing, after); - if (up) { - this.wrapper.style.visibility = 'visible'; - this.content.style.visibility = 'visible'; - this.a.className += ' highslide-active-anchor'; - } -}, - - - -fade : function(up, to) { - this.outlineWhileAnimating = false; - var exp = this, t = up ? hs.expandDuration : 0; - - if (up) { - hs.animate(this.wrapper, to.wrapper, 0); - hs.setStyles(this.wrapper, { opacity: 0, visibility: 'visible' }); - hs.animate(this.content, to.content, 0); - this.content.style.visibility = 'visible'; - - hs.animate(this.wrapper, { opacity: 1 }, t, null, - function() { exp.afterExpand(); }); - } - - if (this.outline) { - this.outline.table.style.zIndex = this.wrapper.style.zIndex; - var dir = up || -1, - offset = this.outline.offset, - startOff = up ? 3 : offset, - endOff = up? offset : 3; - for (var i = startOff; dir * i <= dir * endOff; i += dir, t += 25) { - (function() { - var o = up ? endOff - i : startOff - i; - setTimeout(function() { - exp.outline.setPosition(0, o, 1); - }, t); - })(); - } - } - - - if (up) {}//setTimeout(function() { exp.afterExpand(); }, t+50); - else { - setTimeout( function() { - if (exp.outline) exp.outline.destroy(exp.preserveContent); - - exp.destroyOverlays(); - - hs.animate( exp.wrapper, { opacity: 0 }, hs.restoreDuration, null, function(){ - exp.afterClose(); - }); - }, t); - } -}, -crossfade : function (up, to, from) { - if (!up) return; - var exp = this, - last = this.last, - x = this.x, - y = this.y, - lastX = last.x, - lastY = last.y, - wrapper = this.wrapper, - content = this.content, - overlayBox = this.overlayBox; - hs.removeEventListener(document, 'mousemove', hs.dragHandler); - - hs.setStyles(content, { - width: (x.imgSize || x.size) +'px', - height: (y.imgSize || y.size) +'px' - }); - if (overlayBox) overlayBox.style.overflow = 'visible'; - this.outline = last.outline; - if (this.outline) this.outline.exp = exp; - last.outline = null; - var fadeBox = hs.createElement('div', { - className: 'highslide-'+ this.contentType - }, { - position: 'absolute', - zIndex: 4, - overflow: 'hidden', - display: 'none' - } - ); - var names = { oldImg: last, newImg: this }; - for (var n in names) { - this[n] = names[n].content.cloneNode(1); - hs.setStyles(this[n], { - position: 'absolute', - border: 0, - visibility: 'visible' - }); - fadeBox.appendChild(this[n]); - } - wrapper.appendChild(fadeBox); - if (overlayBox) { - overlayBox.className = ''; - wrapper.appendChild(overlayBox); - } - fadeBox.style.display = ''; - last.content.style.display = 'none'; - - - if (hs.safari && hs.uaVersion < 525) { - this.wrapper.style.visibility = 'visible'; - } - hs.animate(wrapper, { - width: x.size - }, { - duration: hs.transitionDuration, - step: function(val, args) { - var pos = args.pos, - invPos = 1 - pos; - var prop, - size = {}, - props = ['pos', 'size', 'p1', 'p2']; - for (var n in props) { - prop = props[n]; - size['x'+ prop] = Math.round(invPos * lastX[prop] + pos * x[prop]); - size['y'+ prop] = Math.round(invPos * lastY[prop] + pos * y[prop]); - size.ximgSize = Math.round( - invPos * (lastX.imgSize || lastX.size) + pos * (x.imgSize || x.size)); - size.ximgPad = Math.round(invPos * lastX.get('imgPad') + pos * x.get('imgPad')); - size.yimgSize = Math.round( - invPos * (lastY.imgSize || lastY.size) + pos * (y.imgSize || y.size)); - size.yimgPad = Math.round(invPos * lastY.get('imgPad') + pos * y.get('imgPad')); - } - if (exp.outline) exp.outline.setPosition({ - x: size.xpos, - y: size.ypos, - w: size.xsize + size.xp1 + size.xp2 + 2 * x.cb, - h: size.ysize + size.yp1 + size.yp2 + 2 * y.cb - }); - last.wrapper.style.clip = 'rect(' - + (size.ypos - lastY.pos)+'px, ' - + (size.xsize + size.xp1 + size.xp2 + size.xpos + 2 * lastX.cb - lastX.pos) +'px, ' - + (size.ysize + size.yp1 + size.yp2 + size.ypos + 2 * lastY.cb - lastY.pos) +'px, ' - + (size.xpos - lastX.pos)+'px)'; - - hs.setStyles(content, { - top: (size.yp1 + y.get('imgPad')) +'px', - left: (size.xp1 + x.get('imgPad')) +'px', - marginTop: (y.pos - size.ypos) +'px', - marginLeft: (x.pos - size.xpos) +'px' - }); - hs.setStyles(wrapper, { - top: size.ypos +'px', - left: size.xpos +'px', - width: (size.xp1 + size.xp2 + size.xsize + 2 * x.cb)+ 'px', - height: (size.yp1 + size.yp2 + size.ysize + 2 * y.cb) + 'px' - }); - hs.setStyles(fadeBox, { - width: (size.ximgSize || size.xsize) + 'px', - height: (size.yimgSize || size.ysize) +'px', - left: (size.xp1 + size.ximgPad) +'px', - top: (size.yp1 + size.yimgPad) +'px', - visibility: 'visible' - }); - - hs.setStyles(exp.oldImg, { - top: (lastY.pos - size.ypos + lastY.p1 - size.yp1 + lastY.get('imgPad') - size.yimgPad)+'px', - left: (lastX.pos - size.xpos + lastX.p1 - size.xp1 + lastX.get('imgPad') - size.ximgPad)+'px' - }); - - hs.setStyles(exp.newImg, { - opacity: pos, - top: (y.pos - size.ypos + y.p1 - size.yp1 + y.get('imgPad') - size.yimgPad) +'px', - left: (x.pos - size.xpos + x.p1 - size.xp1 + x.get('imgPad') - size.ximgPad) +'px' - }); - if (overlayBox) hs.setStyles(overlayBox, { - width: size.xsize + 'px', - height: size.ysize +'px', - left: (size.xp1 + x.cb) +'px', - top: (size.yp1 + y.cb) +'px' - }); - }, - complete: function () { - wrapper.style.visibility = content.style.visibility = 'visible'; - content.style.display = 'block'; - hs.discardElement(fadeBox); - exp.afterExpand(); - last.afterClose(); - exp.last = null; - } - - }); -}, -reuseOverlay : function(o, el) { - if (!this.last) return false; - for (var i = 0; i < this.last.overlays.length; i++) { - var oDiv = hs.$('hsId'+ this.last.overlays[i]); - if (oDiv && oDiv.hsId == o.hsId) { - this.genOverlayBox(); - oDiv.reuse = this.key; - hs.push(this.overlays, this.last.overlays[i]); - return true; - } - } - return false; -}, - - -afterExpand : function() { - this.isExpanded = true; - this.focus(); - if (this.dimmingOpacity) hs.dim(this); - if (hs.upcoming && hs.upcoming == this.a) hs.upcoming = null; - this.prepareNextOutline(); - var p = hs.page, mX = hs.mouse.x + p.scrollLeft, mY = hs.mouse.y + p.scrollTop; - this.mouseIsOver = this.x.pos < mX && mX < this.x.pos + this.x.get('wsize') - && this.y.pos < mY && mY < this.y.pos + this.y.get('wsize'); - if (this.overlayBox) this.showOverlays(); - -}, - - -prepareNextOutline : function() { - var key = this.key; - var outlineType = this.outlineType; - new hs.Outline(outlineType, - function () { try { hs.expanders[key].preloadNext(); } catch (e) {} }); -}, - - -preloadNext : function() { - var next = this.getAdjacentAnchor(1); - if (next && next.onclick.toString().match(/hs\.expand/)) - var img = hs.createElement('img', { src: hs.getSrc(next) }); -}, - - -getAdjacentAnchor : function(op) { - var current = this.getAnchorIndex(), as = hs.anchors.groups[this.slideshowGroup || 'none']; - if (as && !as[current + op] && this.slideshow && this.slideshow.repeat) { - if (op == 1) return as[0]; - else if (op == -1) return as[as.length-1]; - } - return (as && as[current + op]) || null; -}, - -getAnchorIndex : function() { - var arr = hs.getAnchors().groups[this.slideshowGroup || 'none']; - if (arr) for (var i = 0; i < arr.length; i++) { - if (arr[i] == this.a) return i; - } - return null; -}, - - -getNumber : function() { - if (this[this.numberPosition]) { - var arr = hs.anchors.groups[this.slideshowGroup || 'none']; - if (arr) { - var s = hs.lang.number.replace('%1', this.getAnchorIndex() + 1).replace('%2', arr.length); - this[this.numberPosition].innerHTML = - '
    '+ s +'
    '+ this[this.numberPosition].innerHTML; - } - } -}, -initSlideshow : function() { - if (!this.last) { - for (var i = 0; i < hs.slideshows.length; i++) { - var ss = hs.slideshows[i], sg = ss.slideshowGroup; - if (typeof sg == 'undefined' || sg === null || sg === this.slideshowGroup) - this.slideshow = new hs.Slideshow(this.key, ss); - } - } else { - this.slideshow = this.last.slideshow; - } - var ss = this.slideshow; - if (!ss) return; - var key = ss.expKey = this.key; - - ss.checkFirstAndLast(); - ss.disable('full-expand'); - if (ss.controls) { - this.createOverlay(hs.extend(ss.overlayOptions || {}, { - overlayId: ss.controls, - hsId: 'controls', - zIndex: 5 - })); - } - if (ss.thumbstrip) ss.thumbstrip.add(this); - if (!this.last && this.autoplay) ss.play(true); - if (ss.autoplay) { - ss.autoplay = setTimeout(function() { - hs.next(key); - }, (ss.interval || 500)); - } -}, - -cancelLoading : function() { - hs.discardElement (this.wrapper); - hs.expanders[this.key] = null; - if (hs.upcoming == this.a) hs.upcoming = null; - hs.undim(this.key); - if (this.loading) hs.loading.style.left = '-9999px'; -}, - -writeCredits : function () { - if (this.credits) return; - this.credits = hs.createElement('a', { - href: hs.creditsHref, - target: hs.creditsTarget, - className: 'highslide-credits', - innerHTML: hs.lang.creditsText, - title: hs.lang.creditsTitle - }); - this.createOverlay({ - overlayId: this.credits, - position: this.creditsPosition || 'top left', - hsId: 'credits' - }); -}, - -getInline : function(types, addOverlay) { - for (var i = 0; i < types.length; i++) { - var type = types[i], s = null; - if (!this[type +'Id'] && this.thumbsUserSetId) - this[type +'Id'] = type +'-for-'+ this.thumbsUserSetId; - if (this[type +'Id']) this[type] = hs.getNode(this[type +'Id']); - if (!this[type] && !this[type +'Text'] && this[type +'Eval']) try { - s = eval(this[type +'Eval']); - } catch (e) {} - if (!this[type] && this[type +'Text']) { - s = this[type +'Text']; - } - if (!this[type] && !s) { - this[type] = hs.getNode(this.a['_'+ type + 'Id']); - if (!this[type]) { - var next = this.a.nextSibling; - while (next && !hs.isHsAnchor(next)) { - if ((new RegExp('highslide-'+ type)).test(next.className || null)) { - if (!next.id) this.a['_'+ type + 'Id'] = next.id = 'hsId'+ hs.idCounter++; - this[type] = hs.getNode(next.id); - break; - } - next = next.nextSibling; - } - } - } - if (!this[type] && !s && this.numberPosition == type) s = '\n'; - - if (!this[type] && s) this[type] = hs.createElement('div', - { className: 'highslide-'+ type, innerHTML: s } ); - - if (addOverlay && this[type]) { - var o = { position: (type == 'heading') ? 'above' : 'below' }; - for (var x in this[type+'Overlay']) o[x] = this[type+'Overlay'][x]; - o.overlayId = this[type]; - this.createOverlay(o); - } - } -}, - - -// on end move and resize -doShowHide : function(visibility) { - if (hs.hideSelects) this.showHideElements('SELECT', visibility); - if (hs.hideIframes) this.showHideElements('IFRAME', visibility); - if (hs.geckoMac) this.showHideElements('*', visibility); -}, -showHideElements : function (tagName, visibility) { - var els = document.getElementsByTagName(tagName); - var prop = tagName == '*' ? 'overflow' : 'visibility'; - for (var i = 0; i < els.length; i++) { - if (prop == 'visibility' || (document.defaultView.getComputedStyle( - els[i], "").getPropertyValue('overflow') == 'auto' - || els[i].getAttribute('hidden-by') != null)) { - var hiddenBy = els[i].getAttribute('hidden-by'); - if (visibility == 'visible' && hiddenBy) { - hiddenBy = hiddenBy.replace('['+ this.key +']', ''); - els[i].setAttribute('hidden-by', hiddenBy); - if (!hiddenBy) els[i].style[prop] = els[i].origProp; - } else if (visibility == 'hidden') { // hide if behind - var elPos = hs.getPosition(els[i]); - elPos.w = els[i].offsetWidth; - elPos.h = els[i].offsetHeight; - if (!this.dimmingOpacity) { // hide all if dimming - - var clearsX = (elPos.x + elPos.w < this.x.get('opos') - || elPos.x > this.x.get('opos') + this.x.get('osize')); - var clearsY = (elPos.y + elPos.h < this.y.get('opos') - || elPos.y > this.y.get('opos') + this.y.get('osize')); - } - var wrapperKey = hs.getWrapperKey(els[i]); - if (!clearsX && !clearsY && wrapperKey != this.key) { // element falls behind image - if (!hiddenBy) { - els[i].setAttribute('hidden-by', '['+ this.key +']'); - els[i].origProp = els[i].style[prop]; - els[i].style[prop] = 'hidden'; - - } else if (hiddenBy.indexOf('['+ this.key +']') == -1) { - els[i].setAttribute('hidden-by', hiddenBy + '['+ this.key +']'); - } - } else if ((hiddenBy == '['+ this.key +']' || hs.focusKey == wrapperKey) - && wrapperKey != this.key) { // on move - els[i].setAttribute('hidden-by', ''); - els[i].style[prop] = els[i].origProp || ''; - } else if (hiddenBy && hiddenBy.indexOf('['+ this.key +']') > -1) { - els[i].setAttribute('hidden-by', hiddenBy.replace('['+ this.key +']', '')); - } - - } - } - } -}, - -focus : function() { - this.wrapper.style.zIndex = hs.zIndexCounter += 2; - // blur others - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && i == hs.focusKey) { - var blurExp = hs.expanders[i]; - blurExp.content.className += ' highslide-'+ blurExp.contentType +'-blur'; - blurExp.content.style.cursor = hs.ieLt7 ? 'hand' : 'pointer'; - blurExp.content.title = hs.lang.focusTitle; - } - } - - // focus this - if (this.outline) this.outline.table.style.zIndex - = this.wrapper.style.zIndex - 1; - this.content.className = 'highslide-'+ this.contentType; - this.content.title = hs.lang.restoreTitle; - - if (hs.restoreCursor) { - hs.styleRestoreCursor = window.opera ? 'pointer' : 'url('+ hs.graphicsDir + hs.restoreCursor +'), pointer'; - if (hs.ieLt7 && hs.uaVersion < 6) hs.styleRestoreCursor = 'hand'; - this.content.style.cursor = hs.styleRestoreCursor; - } - - hs.focusKey = this.key; - hs.addEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); -}, -moveTo: function(x, y) { - this.x.setPos(x); - this.y.setPos(y); -}, -resize : function (e) { - var w, h, r = e.width / e.height; - w = Math.max(e.width + e.dX, Math.min(this.minWidth, this.x.full)); - if (this.isImage && Math.abs(w - this.x.full) < 12) w = this.x.full; - h = w / r; - if (h < Math.min(this.minHeight, this.y.full)) { - h = Math.min(this.minHeight, this.y.full); - if (this.isImage) w = h * r; - } - this.resizeTo(w, h); -}, -resizeTo: function(w, h) { - this.y.setSize(h); - this.x.setSize(w); - this.wrapper.style.height = this.y.get('wsize') +'px'; -}, - -close : function() { - if (this.isClosing || !this.isExpanded) return; - if (this.transitions[1] == 'crossfade' && hs.upcoming) { - hs.getExpander(hs.upcoming).cancelLoading(); - hs.upcoming = null; - } - this.isClosing = true; - if (this.slideshow && !hs.upcoming) this.slideshow.pause(); - - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - - try { - this.content.style.cursor = 'default'; - this.changeSize( - 0, { - wrapper: { - width : this.x.t, - height : this.y.t, - left: this.x.tpos - this.x.cb + this.x.tb, - top: this.y.tpos - this.y.cb + this.y.tb - }, - content: { - left: 0, - top: 0, - width: this.x.t, - height: this.y.t - } - }, hs.restoreDuration - ); - } catch (e) { this.afterClose(); } -}, - -createOverlay : function (o) { - var el = o.overlayId, - relToVP = (o.relativeTo == 'viewport' && !/panel$/.test(o.position)); - if (typeof el == 'string') el = hs.getNode(el); - if (o.html) el = hs.createElement('div', { innerHTML: o.html }); - if (!el || typeof el == 'string') return; - el.style.display = 'block'; - o.hsId = o.hsId || o.overlayId; - if (this.transitions[1] == 'crossfade' && this.reuseOverlay(o, el)) return; - this.genOverlayBox(); - var width = o.width && /^[0-9]+(px|%)$/.test(o.width) ? o.width : 'auto'; - if (/^(left|right)panel$/.test(o.position) && !/^[0-9]+px$/.test(o.width)) width = '200px'; - var overlay = hs.createElement( - 'div', { - id: 'hsId'+ hs.idCounter++, - hsId: o.hsId - }, { - position: 'absolute', - visibility: 'hidden', - width: width, - direction: hs.lang.cssDirection || '', - opacity: 0 - }, - relToVP ? hs.viewport :this.overlayBox, - true - ); - if (relToVP) overlay.hsKey = this.key; - - overlay.appendChild(el); - hs.extend(overlay, { - opacity: 1, - offsetX: 0, - offsetY: 0, - dur: (o.fade === 0 || o.fade === false || (o.fade == 2 && hs.ie)) ? 0 : 250 - }); - hs.extend(overlay, o); - - - if (this.gotOverlays) { - this.positionOverlay(overlay); - if (!overlay.hideOnMouseOut || this.mouseIsOver) - hs.animate(overlay, { opacity: overlay.opacity }, overlay.dur); - } - hs.push(this.overlays, hs.idCounter - 1); -}, -positionOverlay : function(overlay) { - var p = overlay.position || 'middle center', - relToVP = (overlay.relativeTo == 'viewport'), - offX = overlay.offsetX, - offY = overlay.offsetY; - if (relToVP) { - hs.viewport.style.display = 'block'; - overlay.hsKey = this.key; - if (overlay.offsetWidth > overlay.parentNode.offsetWidth) - overlay.style.width = '100%'; - } else - if (overlay.parentNode != this.overlayBox) this.overlayBox.appendChild(overlay); - if (/left$/.test(p)) overlay.style.left = offX +'px'; - - if (/center$/.test(p)) hs.setStyles (overlay, { - left: '50%', - marginLeft: (offX - Math.round(overlay.offsetWidth / 2)) +'px' - }); - - if (/right$/.test(p)) overlay.style.right = - offX +'px'; - - if (/^leftpanel$/.test(p)) { - hs.setStyles(overlay, { - right: '100%', - marginRight: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p1 = overlay.offsetWidth; - - } else if (/^rightpanel$/.test(p)) { - hs.setStyles(overlay, { - left: '100%', - marginLeft: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p2 = overlay.offsetWidth; - } - var parOff = overlay.parentNode.offsetHeight; - overlay.style.height = 'auto'; - if (relToVP && overlay.offsetHeight > parOff) - overlay.style.height = hs.ieLt7 ? parOff +'px' : '100%'; - - if (/^top/.test(p)) overlay.style.top = offY +'px'; - if (/^middle/.test(p)) hs.setStyles (overlay, { - top: '50%', - marginTop: (offY - Math.round(overlay.offsetHeight / 2)) +'px' - }); - if (/^bottom/.test(p)) overlay.style.bottom = - offY +'px'; - if (/^above$/.test(p)) { - hs.setStyles(overlay, { - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - bottom: '100%', - marginBottom: this.y.cb +'px', - width: 'auto' - }); - this.y.p1 = overlay.offsetHeight; - - } else if (/^below$/.test(p)) { - hs.setStyles(overlay, { - position: 'relative', - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - top: '100%', - marginTop: this.y.cb +'px', - width: 'auto' - }); - this.y.p2 = overlay.offsetHeight; - overlay.style.position = 'absolute'; - } -}, - -getOverlays : function() { - this.getInline(['heading', 'caption'], true); - this.getNumber(); - if (this.heading && this.dragByHeading) this.heading.className += ' highslide-move'; - if (hs.showCredits) this.writeCredits(); - for (var i = 0; i < hs.overlays.length; i++) { - var o = hs.overlays[i], tId = o.thumbnailId, sg = o.slideshowGroup; - if ((!tId && !sg) || (tId && tId == this.thumbsUserSetId) - || (sg && sg === this.slideshowGroup)) { - this.createOverlay(o); - } - } - var os = []; - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - if (/panel$/.test(o.position)) this.positionOverlay(o); - else hs.push(os, o); - } - for (var i = 0; i < os.length; i++) this.positionOverlay(os[i]); - this.gotOverlays = true; -}, -genOverlayBox : function() { - if (!this.overlayBox) this.overlayBox = hs.createElement ( - 'div', { - className: this.wrapperClassName - }, { - position : 'absolute', - width: (this.x.size || (this.useBox ? this.width : null) - || this.x.full) +'px', - height: (this.y.size || this.y.full) +'px', - visibility : 'hidden', - overflow : 'hidden', - zIndex : hs.ie ? 4 : 'auto' - }, - hs.container, - true - ); -}, -sizeOverlayBox : function(doWrapper, doPanels) { - var overlayBox = this.overlayBox, - x = this.x, - y = this.y; - hs.setStyles( overlayBox, { - width: x.size +'px', - height: y.size +'px' - }); - if (doWrapper || doPanels) { - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - var ie6 = (hs.ieLt7 || document.compatMode == 'BackCompat'); - if (o && /^(above|below)$/.test(o.position)) { - if (ie6) { - o.style.width = (overlayBox.offsetWidth + 2 * x.cb - + x.p1 + x.p2) +'px'; - } - y[o.position == 'above' ? 'p1' : 'p2'] = o.offsetHeight; - } - if (o && ie6 && /^(left|right)panel$/.test(o.position)) { - o.style.height = (overlayBox.offsetHeight + 2* y.cb) +'px'; - } - } - } - if (doWrapper) { - hs.setStyles(this.content, { - top: y.p1 +'px' - }); - hs.setStyles(overlayBox, { - top: (y.p1 + y.cb) +'px' - }); - } -}, - -showOverlays : function() { - var b = this.overlayBox; - b.className = ''; - hs.setStyles(b, { - top: (this.y.p1 + this.y.cb) +'px', - left: (this.x.p1 + this.x.cb) +'px', - overflow : 'visible' - }); - if (hs.safari) b.style.visibility = 'visible'; - this.wrapper.appendChild (b); - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - o.style.zIndex = o.zIndex || 4; - if (!o.hideOnMouseOut || this.mouseIsOver) { - o.style.visibility = 'visible'; - hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: o.opacity }, o.dur); - } - } -}, - -destroyOverlays : function() { - if (!this.overlays.length) return; - if (this.slideshow) { - var c = this.slideshow.controls; - if (c && hs.getExpander(c) == this) c.parentNode.removeChild(c); - } - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - if (o && o.parentNode == hs.viewport && hs.getExpander(o) == this) hs.discardElement(o); - } - hs.discardElement(this.overlayBox); -}, - - - -createFullExpand : function () { - if (this.slideshow && this.slideshow.controls) { - this.slideshow.enable('full-expand'); - return; - } - this.fullExpandLabel = hs.createElement( - 'a', { - href: 'javascript:hs.expanders['+ this.key +'].doFullExpand();', - title: hs.lang.fullExpandTitle, - className: 'highslide-full-expand' - } - ); - - this.createOverlay({ - overlayId: this.fullExpandLabel, - position: hs.fullExpandPosition, - hideOnMouseOut: true, - opacity: hs.fullExpandOpacity - }); -}, - -doFullExpand : function () { - try { - if (this.fullExpandLabel) hs.discardElement(this.fullExpandLabel); - - this.focus(); - var xSize = this.x.size, - ySize = this.y.size; - this.resizeTo(this.x.full, this.y.full); - - var xpos = this.x.pos - (this.x.size - xSize) / 2; - if (xpos < hs.marginLeft) xpos = hs.marginLeft; - - var ypos = this.y.pos - (this.y.size - ySize) / 2; - if (ypos < hs.marginTop) ypos = hs.marginTop; - - this.moveTo(xpos, ypos); - this.doShowHide('hidden'); - - } catch (e) { - this.error(e); - } -}, - - -afterClose : function () { - this.a.className = this.a.className.replace('highslide-active-anchor', ''); - - this.doShowHide('visible'); - if (this.outline && this.outlineWhileAnimating) this.outline.destroy(); - - hs.discardElement(this.wrapper); - this.destroyOverlays(); - if (!hs.viewport.childNodes.length) hs.viewport.style.display = 'none'; - - if (this.dimmingOpacity) hs.undim(this.key); - hs.expanders[this.key] = null; - hs.reOrder(); -} - -}; - - -hs.Slideshow = function (expKey, options) { - if (hs.dynamicallyUpdateAnchors !== false) hs.updateAnchors(); - this.expKey = expKey; - for (var x in options) this[x] = options[x]; - if (this.useControls) this.getControls(); - if (this.thumbstrip) this.thumbstrip = hs.Thumbstrip(this); -}; -hs.Slideshow.prototype = { -getControls: function() { - this.controls = hs.createElement('div', { innerHTML: hs.replaceLang(hs.skin.controls) }, - null, hs.container); - - var buttons = ['play', 'pause', 'previous', 'next', 'move', 'full-expand', 'close']; - this.btn = {}; - var pThis = this; - for (var i = 0; i < buttons.length; i++) { - this.btn[buttons[i]] = hs.getElementByClass(this.controls, 'li', 'highslide-'+ buttons[i]); - this.enable(buttons[i]); - } - this.btn.pause.style.display = 'none'; - //this.disable('full-expand'); -}, -checkFirstAndLast: function() { - if (this.repeat || !this.controls) return; - var exp = hs.expanders[this.expKey], - cur = exp.getAnchorIndex(), - re = /disabled$/; - if (cur == 0) - this.disable('previous'); - else if (re.test(this.btn.previous.getElementsByTagName('a')[0].className)) - this.enable('previous'); - if (cur + 1 == hs.anchors.groups[exp.slideshowGroup || 'none'].length) { - this.disable('next'); - this.disable('play'); - } else if (re.test(this.btn.next.getElementsByTagName('a')[0].className)) { - this.enable('next'); - this.enable('play'); - } -}, -enable: function(btn) { - if (!this.btn) return; - var sls = this, a = this.btn[btn].getElementsByTagName('a')[0], re = /disabled$/; - a.onclick = function() { - sls[btn](); - return false; - }; - if (re.test(a.className)) a.className = a.className.replace(re, ''); -}, -disable: function(btn) { - if (!this.btn) return; - var a = this.btn[btn].getElementsByTagName('a')[0]; - a.onclick = function() { return false; }; - if (!/disabled$/.test(a.className)) a.className += ' disabled'; -}, -hitSpace: function() { - if (this.autoplay) this.pause(); - else this.play(); -}, -play: function(wait) { - if (this.btn) { - this.btn.play.style.display = 'none'; - this.btn.pause.style.display = ''; - } - - this.autoplay = true; - if (!wait) hs.next(this.expKey); -}, -pause: function() { - if (this.btn) { - this.btn.pause.style.display = 'none'; - this.btn.play.style.display = ''; - } - - clearTimeout(this.autoplay); - this.autoplay = null; -}, -previous: function() { - this.pause(); - hs.previous(this.btn.previous); -}, -next: function() { - this.pause(); - hs.next(this.btn.next); -}, -move: function() {}, -'full-expand': function() { - hs.getExpander().doFullExpand(); -}, -close: function() { - hs.close(this.btn.close); -} -}; -hs.Thumbstrip = function(slideshow) { - function add (exp) { - hs.extend(options || {}, { - overlayId: dom, - hsId: 'thumbstrip', - className: 'highslide-thumbstrip-'+ mode +'-overlay ' + (options.className || '') - }); - if (hs.ieLt7) options.fade = 0; - exp.createOverlay(options); - hs.setStyles(dom.parentNode, { overflow: 'hidden' }); - }; - - function scroll (delta) { - selectThumb(undefined, Math.round(delta * dom[isX ? 'offsetWidth' : 'offsetHeight'] * 0.7)); - }; - - function selectThumb (i, scrollBy) { - if (i === undefined) for (var j = 0; j < group.length; j++) { - if (group[j] == hs.expanders[slideshow.expKey].a) { - i = j; - break; - } - } - if (i === undefined) return; - var as = dom.getElementsByTagName('a'), - active = as[i], - cell = active.parentNode, - left = isX ? 'Left' : 'Top', - right = isX ? 'Right' : 'Bottom', - width = isX ? 'Width' : 'Height', - offsetLeft = 'offset' + left, - offsetWidth = 'offset' + width, - overlayWidth = div.parentNode.parentNode[offsetWidth], - minTblPos = overlayWidth - table[offsetWidth], - curTblPos = parseInt(table.style[isX ? 'left' : 'top']) || 0, - tblPos = curTblPos, - mgnRight = 20; - if (scrollBy !== undefined) { - tblPos = curTblPos - scrollBy; - - if (minTblPos > 0) minTblPos = 0; - if (tblPos > 0) tblPos = 0; - if (tblPos < minTblPos) tblPos = minTblPos; - - - } else { - for (var j = 0; j < as.length; j++) as[j].className = ''; - active.className = 'highslide-active-anchor'; - var activeLeft = i > 0 ? as[i - 1].parentNode[offsetLeft] : cell[offsetLeft], - activeRight = cell[offsetLeft] + cell[offsetWidth] + - (as[i + 1] ? as[i + 1].parentNode[offsetWidth] : 0); - if (activeRight > overlayWidth - curTblPos) tblPos = overlayWidth - activeRight; - else if (activeLeft < -curTblPos) tblPos = -activeLeft; - } - var markerPos = cell[offsetLeft] + (cell[offsetWidth] - marker[offsetWidth]) / 2 + tblPos; - hs.animate(table, isX ? { left: tblPos } : { top: tblPos }, null, 'easeOutQuad'); - hs.animate(marker, isX ? { left: markerPos } : { top: markerPos }, null, 'easeOutQuad'); - scrollUp.style.display = tblPos < 0 ? 'block' : 'none'; - scrollDown.style.display = (tblPos > minTblPos) ? 'block' : 'none'; - - }; - - - // initialize - var group = hs.anchors.groups[hs.expanders[slideshow.expKey].slideshowGroup || 'none'], - options = slideshow.thumbstrip, - mode = options.mode || 'horizontal', - floatMode = (mode == 'float'), - tree = floatMode ? ['div', 'ul', 'li', 'span'] : ['table', 'tbody', 'tr', 'td'], - isX = (mode == 'horizontal'), - dom = hs.createElement('div', { - className: 'highslide-thumbstrip highslide-thumbstrip-'+ mode, - innerHTML: - '
    '+ - '<'+ tree[0] +'><'+ tree[1] +'>
    '+ - '
    '+ - '
    '+ - '
    ' - }, { - display: 'none' - }, hs.container), - domCh = dom.childNodes, - div = domCh[0], - scrollUp = domCh[1], - scrollDown = domCh[2], - marker = domCh[3], - table = div.firstChild, - tbody = dom.getElementsByTagName(tree[1])[0], - tr; - for (var i = 0; i < group.length; i++) { - if (i == 0 || !isX) tr = hs.createElement(tree[2], null, null, tbody); - (function(){ - var a = group[i], - cell = hs.createElement(tree[3], null, null, tr), - pI = i; - hs.createElement('a', { - href: a.href, - title: a.title, - onclick: function() { - if (/highslide-active-anchor/.test(this.className)) return false; - hs.getExpander(this).focus(); - return hs.transit(a); - }, - innerHTML: hs.stripItemFormatter ? hs.stripItemFormatter(a) : a.innerHTML - }, null, cell); - })(); - } - if (!floatMode) { - scrollUp.onclick = function () { scroll(-1); }; - scrollDown.onclick = function() { scroll(1); }; - hs.addEventListener(tbody, document.onmousewheel !== undefined ? - 'mousewheel' : 'DOMMouseScroll', function(e) { - var delta = 0; - e = e || window.event; - if (e.wheelDelta) { - delta = e.wheelDelta/120; - if (hs.opera) delta = -delta; - } else if (e.detail) { - delta = -e.detail/3; - } - if (delta) scroll(-delta * 0.2); - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - }); - } - - return { - add: add, - selectThumb: selectThumb - } -}; -hs.langDefaults = hs.lang; -// history -var HsExpander = hs.Expander; -if (hs.ie && window == window.top) { - (function () { - try { - document.documentElement.doScroll('left'); - } catch (e) { - setTimeout(arguments.callee, 50); - return; - } - hs.ready(); - })(); -} -hs.addEventListener(document, 'DOMContentLoaded', hs.ready); -hs.addEventListener(window, 'load', hs.ready); - -// set handlers -hs.addEventListener(document, 'ready', function() { - if (hs.expandCursor || hs.dimmingOpacity) { - var style = hs.createElement('style', { type: 'text/css' }, null, - document.getElementsByTagName('HEAD')[0]), - backCompat = document.compatMode == 'BackCompat'; - - - function addRule(sel, dec) { - if (hs.ie && (hs.uaVersion < 9 || backCompat)) { - var last = document.styleSheets[document.styleSheets.length - 1]; - if (typeof(last.addRule) == "object") last.addRule(sel, dec); - } else { - style.appendChild(document.createTextNode(sel + " {" + dec + "}")); - } - } - function fix(prop) { - return 'expression( ( ( ignoreMe = document.documentElement.'+ prop + - ' ? document.documentElement.'+ prop +' : document.body.'+ prop +' ) ) + \'px\' );'; - } - if (hs.expandCursor) addRule ('.highslide img', - 'cursor: url('+ hs.graphicsDir + hs.expandCursor +'), pointer !important;'); - addRule ('.highslide-viewport-size', - hs.ie && (hs.uaVersion < 7 || backCompat) ? - 'position: absolute; '+ - 'left:'+ fix('scrollLeft') + - 'top:'+ fix('scrollTop') + - 'width:'+ fix('clientWidth') + - 'height:'+ fix('clientHeight') : - 'position: fixed; width: 100%; height: 100%; left: 0; top: 0'); - } -}); -hs.addEventListener(window, 'resize', function() { - hs.getPageSize(); - if (hs.viewport) for (var i = 0; i < hs.viewport.childNodes.length; i++) { - var node = hs.viewport.childNodes[i], - exp = hs.getExpander(node); - exp.positionOverlay(node); - if (node.hsId == 'thumbstrip') exp.slideshow.thumbstrip.selectThumb(); - } -}); -hs.addEventListener(document, 'mousemove', function(e) { - hs.mouse = { x: e.clientX, y: e.clientY }; -}); -hs.addEventListener(document, 'mousedown', hs.mouseClickHandler); -hs.addEventListener(document, 'mouseup', hs.mouseClickHandler); - -hs.addEventListener(document, 'ready', hs.getAnchors); -hs.addEventListener(window, 'load', hs.preloadImages); -} diff --git a/Website/static/highslide/highslide/highslide-with-gallery.min.js b/Website/static/highslide/highslide/highslide-with-gallery.min.js deleted file mode 100644 index 5f86699..0000000 --- a/Website/static/highslide/highslide/highslide-with-gallery.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Name: Highslide JS - * Version: 4.1.13 (2011-10-06) - * Config: default +slideshow +positioning +transitions +viewport +thumbstrip - * Author: Torstein Hønsi - * Support: www.highslide.com/support - * License: www.highslide.com/#license - */ -if(!hs){var hs={lang:{cssDirection:"ltr",loadingText:"Loading...",loadingTitle:"Click to cancel",focusTitle:"Click to bring to front",fullExpandTitle:"Expand to actual size (f)",creditsText:"Powered by Highslide JS",creditsTitle:"Go to the Highslide JS homepage",previousText:"Previous",nextText:"Next",moveText:"Move",closeText:"Close",closeTitle:"Close (esc)",resizeTitle:"Resize",playText:"Play",playTitle:"Play slideshow (spacebar)",pauseText:"Pause",pauseTitle:"Pause slideshow (spacebar)",previousTitle:"Previous (arrow left)",nextTitle:"Next (arrow right)",moveTitle:"Move",fullExpandText:"1:1",number:"Image %1 of %2",restoreTitle:"Click to close image, click and drag to move. Use arrow keys for next and previous."},graphicsDir:"highslide/graphics/",expandCursor:"zoomin.cur",restoreCursor:"zoomout.cur",expandDuration:250,restoreDuration:250,marginLeft:15,marginRight:15,marginTop:15,marginBottom:15,zIndexCounter:1001,loadingOpacity:0.75,allowMultipleInstances:true,numberOfImagesToPreload:5,outlineWhileAnimating:2,outlineStartOffset:3,padToMinWidth:false,fullExpandPosition:"bottom right",fullExpandOpacity:1,showCredits:true,creditsHref:"http://highslide.com/",creditsTarget:"_self",enableKeyListener:true,openerTagNames:["a"],transitions:[],transitionDuration:250,dimmingOpacity:0,dimmingDuration:50,anchor:"auto",align:"auto",targetX:null,targetY:null,dragByHeading:true,minWidth:200,minHeight:200,allowSizeReduction:true,outlineType:"drop-shadow",skin:{controls:''},preloadTheseImages:[],continuePreloading:true,expanders:[],overrides:["allowSizeReduction","useBox","anchor","align","targetX","targetY","outlineType","outlineWhileAnimating","captionId","captionText","captionEval","captionOverlay","headingId","headingText","headingEval","headingOverlay","creditsPosition","dragByHeading","autoplay","numberPosition","transitions","dimmingOpacity","width","height","wrapperClassName","minWidth","minHeight","maxWidth","maxHeight","pageOrigin","slideshowGroup","easing","easingClose","fadeInOut","src"],overlays:[],idCounter:0,oPos:{x:["leftpanel","left","center","right","rightpanel"],y:["above","top","middle","bottom","below"]},mouse:{},headingOverlay:{},captionOverlay:{},timers:[],slideshows:[],pendingOutlines:{},clones:{},onReady:[],uaVersion:/Trident\/4\.0/.test(navigator.userAgent)?8:parseFloat((navigator.userAgent.toLowerCase().match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1]),ie:(document.all&&!window.opera),safari:/Safari/.test(navigator.userAgent),geckoMac:/Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent),$:function(a){if(a){return document.getElementById(a)}},push:function(a,b){a[a.length]=b},createElement:function(a,f,e,d,c){var b=document.createElement(a);if(f){hs.extend(b,f)}if(c){hs.setStyles(b,{padding:0,border:"none",margin:0})}if(e){hs.setStyles(b,e)}if(d){d.appendChild(b)}return b},extend:function(b,c){for(var a in c){b[a]=c[a]}return b},setStyles:function(b,c){for(var a in c){if(hs.ieLt9&&a=="opacity"){if(c[a]>0.99){b.style.removeAttribute("filter")}else{b.style.filter="alpha(opacity="+(c[a]*100)+")"}}else{b.style[a]=c[a]}}},animate:function(f,a,d){var c,g,j;if(typeof d!="object"||d===null){var i=arguments;d={duration:i[2],easing:i[3],complete:i[4]}}if(typeof d.duration!="number"){d.duration=250}d.easing=Math[d.easing]||Math.easeInQuad;d.curAnim=hs.extend({},a);for(var b in a){var h=new hs.fx(f,d,b);c=parseFloat(hs.css(f,b))||0;g=parseFloat(a[b]);j=b!="opacity"?"px":"";h.custom(c,g,j)}},css:function(a,c){if(a.style[c]){return a.style[c]}else{if(document.defaultView){return document.defaultView.getComputedStyle(a,null).getPropertyValue(c)}else{if(c=="opacity"){c="filter"}var b=a.currentStyle[c.replace(/\-(\w)/g,function(e,d){return d.toUpperCase()})];if(c=="filter"){b=b.replace(/alpha\(opacity=([0-9]+)\)/,function(e,d){return d/100})}return b===""?1:b}}},getPageSize:function(){var f=document,b=window,e=f.compatMode&&f.compatMode!="BackCompat"?f.documentElement:f.body,g=hs.ie&&(hs.uaVersion<9||typeof pageXOffset=="undefined");var c=g?e.clientWidth:(f.documentElement.clientWidth||self.innerWidth),a=g?e.clientHeight:self.innerHeight;hs.page={width:c,height:a,scrollLeft:g?e.scrollLeft:pageXOffset,scrollTop:g?e.scrollTop:pageYOffset};return hs.page},getPosition:function(a){var b={x:a.offsetLeft,y:a.offsetTop};while(a.offsetParent){a=a.offsetParent;b.x+=a.offsetLeft;b.y+=a.offsetTop;if(a!=document.body&&a!=document.documentElement){b.x-=a.scrollLeft;b.y-=a.scrollTop}}return b},expand:function(b,g,d,c){if(!b){b=hs.createElement("a",null,{display:"none"},hs.container)}if(typeof b.getParams=="function"){return g}try{new hs.Expander(b,g,d);return false}catch(f){return true}},getElementByClass:function(e,c,d){var b=e.getElementsByTagName(c);for(var a=0;ac){c=f;b=d}}}if(b==-1){hs.focusKey=-1}else{a[b].focus()}},getParam:function(b,d){b.getParams=b.onclick;var c=b.getParams?b.getParams():null;b.getParams=null;return(c&&typeof c[d]!="undefined")?c[d]:(typeof hs[d]!="undefined"?hs[d]:null)},getSrc:function(b){var c=hs.getParam(b,"src");if(c){return c}return b.href},getNode:function(e){var c=hs.$(e),d=hs.clones[e],b={};if(!c&&!d){return null}if(!d){d=c.cloneNode(true);d.id="";hs.clones[e]=d;return c}else{return d.cloneNode(true)}},discardElement:function(a){if(a){hs.garbageBin.appendChild(a)}hs.garbageBin.innerHTML=""},dim:function(d){if(!hs.dimmer){a=true;hs.dimmer=hs.createElement("div",{className:"highslide-dimming highslide-viewport-size",owner:"",onclick:function(){hs.close()}},{visibility:"visible",opacity:0},hs.container,true);if(/(Android|iPad|iPhone|iPod)/.test(navigator.userAgent)){var b=document.body;function c(){hs.setStyles(hs.dimmer,{width:b.scrollWidth+"px",height:b.scrollHeight+"px"})}c();hs.addEventListener(window,"resize",c)}}hs.dimmer.style.display="";var a=hs.dimmer.owner=="";hs.dimmer.owner+="|"+d.key;if(a){if(hs.geckoMac&&hs.dimmingGeckoFix){hs.setStyles(hs.dimmer,{background:"url("+hs.graphicsDir+"geckodimmer.png)",opacity:1})}else{hs.animate(hs.dimmer,{opacity:d.dimmingOpacity},hs.dimmingDuration)}}},undim:function(a){if(!hs.dimmer){return}if(typeof a!="undefined"){hs.dimmer.owner=hs.dimmer.owner.replace("|"+a,"")}if((typeof a!="undefined"&&hs.dimmer.owner!="")||(hs.upcoming&&hs.getParam(hs.upcoming,"dimmingOpacity"))){return}if(hs.geckoMac&&hs.dimmingGeckoFix){hs.dimmer.style.display="none"}else{hs.animate(hs.dimmer,{opacity:0},hs.dimmingDuration,null,function(){hs.dimmer.style.display="none"})}},transit:function(a,d){var b=d||hs.getExpander();d=b;if(hs.upcoming){return false}else{hs.last=b}hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler);try{hs.upcoming=a;a.onclick()}catch(c){hs.last=hs.upcoming=null}try{if(!a||d.transitions[1]!="crossfade"){d.close()}}catch(c){}return false},previousOrNext:function(a,c){var b=hs.getExpander(a);if(b){return hs.transit(b.getAdjacentAnchor(c),b)}else{return false}},previous:function(a){return hs.previousOrNext(a,-1)},next:function(a){return hs.previousOrNext(a,1)},keyHandler:function(a){if(!a){a=window.event}if(!a.target){a.target=a.srcElement}if(typeof a.target.form!="undefined"){return true}var b=hs.getExpander();var c=null;switch(a.keyCode){case 70:if(b){b.doFullExpand()}return true;case 32:c=2;break;case 34:case 39:case 40:c=1;break;case 8:case 33:case 37:case 38:c=-1;break;case 27:case 13:c=0}if(c!==null){if(c!=2){hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler)}if(!hs.enableKeyListener){return true}if(a.preventDefault){a.preventDefault()}else{a.returnValue=false}if(b){if(c==0){b.close()}else{if(c==2){if(b.slideshow){b.slideshow.hitSpace()}}else{if(b.slideshow){b.slideshow.pause()}hs.previousOrNext(b.key,c)}}return false}}return true},registerOverlay:function(a){hs.push(hs.overlays,hs.extend(a,{hsId:"hsId"+hs.idCounter++}))},addSlideshow:function(b){var d=b.slideshowGroup;if(typeof d=="object"){for(var c=0;c1){return true}if(!d.target){d.target=d.srcElement}var b=d.target;while(b.parentNode&&!(/highslide-(image|move|html|resize)/.test(b.className))){b=b.parentNode}var f=hs.getExpander(b);if(f&&(f.isClosing||!f.isExpanded)){return true}if(f&&d.type=="mousedown"){if(d.target.form){return true}var a=b.className.match(/highslide-(image|move|resize)/);if(a){hs.dragArgs={exp:f,type:a[1],left:f.x.pos,width:f.x.size,top:f.y.pos,height:f.y.size,clickX:d.clientX,clickY:d.clientY};hs.addEventListener(document,"mousemove",hs.dragHandler);if(d.preventDefault){d.preventDefault()}if(/highslide-(image|html)-blur/.test(f.content.className)){f.focus();hs.hasFocused=true}return false}}else{if(d.type=="mouseup"){hs.removeEventListener(document,"mousemove",hs.dragHandler);if(hs.dragArgs){if(hs.styleRestoreCursor&&hs.dragArgs.type=="image"){hs.dragArgs.exp.content.style.cursor=hs.styleRestoreCursor}var c=hs.dragArgs.hasDragged;if(!c&&!hs.hasFocused&&!/(move|resize)/.test(hs.dragArgs.type)){f.close()}else{if(c||(!c&&hs.hasHtmlExpanders)){hs.dragArgs.exp.doShowHide("hidden")}}hs.hasFocused=false;hs.dragArgs=null}else{if(/highslide-image-blur/.test(b.className)){b.style.cursor=hs.styleRestoreCursor}}}}return false},dragHandler:function(c){if(!hs.dragArgs){return true}if(!c){c=window.event}var b=hs.dragArgs,d=b.exp;b.dX=c.clientX-b.clickX;b.dY=c.clientY-b.clickY;var f=Math.sqrt(Math.pow(b.dX,2)+Math.pow(b.dY,2));if(!b.hasDragged){b.hasDragged=(b.type!="image"&&f>0)||(f>(hs.dragSensitivity||5))}if(b.hasDragged&&c.clientX>5&&c.clientY>5){if(b.type=="resize"){d.resize(b)}else{d.moveTo(b.left+b.dX,b.top+b.dY);if(b.type=="image"){d.content.style.cursor="move"}}}return false},wrapperMouseHandler:function(c){try{if(!c){c=window.event}var b=/mouseover/i.test(c.type);if(!c.target){c.target=c.srcElement}if(!c.relatedTarget){c.relatedTarget=b?c.fromElement:c.toElement}var d=hs.getExpander(c.target);if(!d.isExpanded){return}if(!d||!c.relatedTarget||hs.getExpander(c.relatedTarget,true)==d||hs.dragArgs){return}for(var a=0;a=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var a=true;for(var b in this.options.curAnim){if(this.options.curAnim[b]!==true){a=false}}if(a){if(this.options.complete){this.options.complete.call(this.elem)}}return false}else{var e=c-this.startTime;this.state=e/this.options.duration;this.pos=this.options.easing(e,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};hs.extend(hs.fx,{step:{opacity:function(a){hs.setStyles(a.elem,{opacity:a.now})},_default:function(a){try{if(a.elem.style&&a.elem.style[a.prop]!=null){a.elem.style[a.prop]=a.now+a.unit}else{a.elem[a.prop]=a.now}}catch(b){}}}});hs.Outline=function(g,e){this.onLoad=e;this.outlineType=g;var a=hs.uaVersion,f;this.hasAlphaImageLoader=hs.ie&&hs.uaVersion<7;if(!g){if(e){e()}return}hs.init();this.table=hs.createElement("table",{cellSpacing:0},{visibility:"hidden",position:"absolute",borderCollapse:"collapse",width:0},hs.container,true);var b=hs.createElement("tbody",null,null,this.table,1);this.td=[];for(var c=0;c<=8;c++){if(c%3==0){f=hs.createElement("tr",null,{height:"auto"},b,true)}this.td[c]=hs.createElement("td",null,null,f,true);var d=c!=4?{lineHeight:0,fontSize:0}:{position:"relative"};hs.setStyles(this.td[c],d)}this.td[4].className=g+" highslide-outline";this.preloadGraphic()};hs.Outline.prototype={preloadGraphic:function(){var b=hs.graphicsDir+(hs.outlinesDir||"outlines/")+this.outlineType+".png";var a=hs.safari&&hs.uaVersion<525?hs.container:null;this.graphic=hs.createElement("img",null,{position:"absolute",top:"-9999px"},a,true);var c=this;this.graphic.onload=function(){c.onGraphicLoad()};this.graphic.src=b},onGraphicLoad:function(){var d=this.offset=this.graphic.width/4,f=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],c={height:(2*d)+"px",width:(2*d)+"px"};for(var b=0;b<=8;b++){if(f[b]){if(this.hasAlphaImageLoader){var a=(b==1||b==7)?"100%":this.graphic.width+"px";var e=hs.createElement("div",null,{width:"100%",height:"100%",position:"relative",overflow:"hidden"},this.td[b],true);hs.createElement("div",null,{filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+this.graphic.src+"')",position:"absolute",width:a,height:this.graphic.height+"px",left:(f[b][0]*d)+"px",top:(f[b][1]*d)+"px"},e,true)}else{hs.setStyles(this.td[b],{background:"url("+this.graphic.src+") "+(f[b][0]*d)+"px "+(f[b][1]*d)+"px"})}if(window.opera&&(b==3||b==5)){hs.createElement("div",null,c,this.td[b],true)}hs.setStyles(this.td[b],c)}}this.graphic=null;if(hs.pendingOutlines[this.outlineType]){hs.pendingOutlines[this.outlineType].destroy()}hs.pendingOutlines[this.outlineType]=this;if(this.onLoad){this.onLoad()}},setPosition:function(g,e,c,b,f){var d=this.exp,a=d.wrapper.style,e=e||0,g=g||{x:d.x.pos+e,y:d.y.pos+e,w:d.x.get("wsize")-2*e,h:d.y.get("wsize")-2*e};if(c){this.table.style.visibility=(g.h>=4*this.offset)?"visible":"hidden"}hs.setStyles(this.table,{left:(g.x-this.offset)+"px",top:(g.y-this.offset)+"px",width:(g.w+2*this.offset)+"px"});g.w-=2*this.offset;g.h-=2*this.offset;hs.setStyles(this.td[4],{width:g.w>=0?g.w+"px":0,height:g.h>=0?g.h+"px":0});if(this.hasAlphaImageLoader){this.td[3].style.height=this.td[5].style.height=this.td[4].style.height}},destroy:function(a){if(a){this.table.style.visibility="hidden"}else{hs.discardElement(this.table)}}};hs.Dimension=function(b,a){this.exp=b;this.dim=a;this.ucwh=a=="x"?"Width":"Height";this.wh=this.ucwh.toLowerCase();this.uclt=a=="x"?"Left":"Top";this.lt=this.uclt.toLowerCase();this.ucrb=a=="x"?"Right":"Bottom";this.rb=this.ucrb.toLowerCase();this.p1=this.p2=0};hs.Dimension.prototype={get:function(a){switch(a){case"loadingPos":return this.tpos+this.tb+(this.t-hs.loading["offset"+this.ucwh])/2;case"loadingPosXfade":return this.pos+this.cb+this.p1+(this.size-hs.loading["offset"+this.ucwh])/2;case"wsize":return this.size+2*this.cb+this.p1+this.p2;case"fitsize":return this.clientSize-this.marginMin-this.marginMax;case"maxsize":return this.get("fitsize")-2*this.cb-this.p1-this.p2;case"opos":return this.pos-(this.exp.outline?this.exp.outline.offset:0);case"osize":return this.get("wsize")+(this.exp.outline?2*this.exp.outline.offset:0);case"imgPad":return this.imgSize?Math.round((this.size-this.imgSize)/2):0}},calcBorders:function(){this.cb=(this.exp.content["offset"+this.ucwh]-this.t)/2;this.marginMax=hs["margin"+this.ucrb]},calcThumb:function(){this.t=this.exp.el[this.wh]?parseInt(this.exp.el[this.wh]):this.exp.el["offset"+this.ucwh];this.tpos=this.exp.tpos[this.dim];this.tb=(this.exp.el["offset"+this.ucwh]-this.t)/2;if(this.tpos==0||this.tpos==-1){this.tpos=(hs.page[this.wh]/2)+hs.page["scroll"+this.uclt]}},calcExpanded:function(){var a=this.exp;this.justify="auto";if(a.align=="center"){this.justify="center"}else{if(new RegExp(this.lt).test(a.anchor)){this.justify=null}else{if(new RegExp(this.rb).test(a.anchor)){this.justify="max"}}}this.pos=this.tpos-this.cb+this.tb;if(this.maxHeight&&this.dim=="x"){a.maxWidth=Math.min(a.maxWidth||this.full,a.maxHeight*this.full/a.y.full)}this.size=Math.min(this.full,a["max"+this.ucwh]||this.full);this.minSize=a.allowSizeReduction?Math.min(a["min"+this.ucwh],this.full):this.full;if(a.isImage&&a.useBox){this.size=a[this.wh];this.imgSize=this.full}if(this.dim=="x"&&hs.padToMinWidth){this.minSize=a.minWidth}this.target=a["target"+this.dim.toUpperCase()];this.marginMin=hs["margin"+this.uclt];this.scroll=hs.page["scroll"+this.uclt];this.clientSize=hs.page[this.wh]},setSize:function(a){var b=this.exp;if(b.isImage&&(b.useBox||hs.padToMinWidth)){this.imgSize=a;this.size=Math.max(this.size,this.imgSize);b.content.style[this.lt]=this.get("imgPad")+"px"}else{this.size=a}b.content.style[this.wh]=a+"px";b.wrapper.style[this.wh]=this.get("wsize")+"px";if(b.outline){b.outline.setPosition()}if(this.dim=="x"&&b.overlayBox){b.sizeOverlayBox(true)}if(this.dim=="x"&&b.slideshow&&b.isImage){if(a==this.full){b.slideshow.disable("full-expand")}else{b.slideshow.enable("full-expand")}}},setPos:function(a){this.pos=a;this.exp.wrapper.style[this.lt]=a+"px";if(this.exp.outline){this.exp.outline.setPosition()}}};hs.Expander=function(k,f,b,l){if(document.readyState&&hs.ie&&!hs.isReady){hs.addEventListener(document,"ready",function(){new hs.Expander(k,f,b,l)});return}this.a=k;this.custom=b;this.contentType=l||"image";this.isImage=!this.isHtml;hs.continuePreloading=false;this.overlays=[];this.last=hs.last;hs.last=null;hs.init();var m=this.key=hs.expanders.length;for(var g=0;ga.scroll+a.clientSize-a.marginMax){a.pos=a.scroll+a.clientSize-a.size-a.marginMin-a.marginMax-a.p1-a.p2}if(a.pos(this.x.imgSize||this.x.size)){this.createFullExpand();if(this.overlays.length==1){this.sizeOverlayBox()}}}this.show()}catch(d){this.error(d)}},justify:function(f,b){var g,h=f.target,e=f==this.x?"x":"y";if(h&&h.match(/ /)){g=h.split(" ");h=g[0]}if(h&&hs.$(h)){f.pos=hs.getPosition(hs.$(h))[e];if(g&&g[1]&&g[1].match(/^[-]?[0-9]+px$/)){f.pos+=parseInt(g[1])}if(f.sizef.scroll+f.clientSize-f.marginMax){if(!b&&d&&a){f.size=Math.min(f.size,f.get(e=="y"?"fitsize":"maxsize"))}else{if(f.get("wsize")c){d=b*c;if(dthis.minHeight&&a.size>this.minWidth&&d.get("wsize")>d.get("fitsize")){d.size-=10;if(b){a.size=d.size*b}this.sizeOverlayBox(0,1);c=true}}return c},show:function(){var a=this.x,b=this.y;this.doShowHide("hidden");if(this.slideshow&&this.slideshow.thumbstrip){this.slideshow.thumbstrip.selectThumb()}this.changeSize(1,{wrapper:{width:a.get("wsize"),height:b.get("wsize"),left:a.pos,top:b.pos},content:{left:a.p1+a.get("imgPad"),top:b.p1+b.get("imgPad"),width:a.imgSize||a.size,height:b.imgSize||b.size}},hs.expandDuration)},changeSize:function(d,i,b){var k=this.transitions,e=d?(this.last?this.last.a:null):hs.upcoming,j=(k[1]&&e&&hs.getParam(e,"transitions")[1]==k[1])?k[1]:k[0];if(this[j]&&j!="expand"){this[j](d,i);return}if(this.outline&&!this.outlineWhileAnimating){if(d){this.outline.setPosition()}else{this.outline.destroy()}}if(!d){this.destroyOverlays()}var c=this,h=c.x,g=c.y,f=this.easing;if(!d){f=this.easingClose||f}var a=d?function(){if(c.outline){c.outline.table.style.visibility="visible"}setTimeout(function(){c.afterExpand()},50)}:function(){c.afterClose()};if(d){hs.setStyles(this.wrapper,{width:h.t+"px",height:g.t+"px"})}if(this.fadeInOut){hs.setStyles(this.wrapper,{opacity:d?0:1});hs.extend(i.wrapper,{opacity:d})}hs.animate(this.wrapper,i.wrapper,{duration:b,easing:f,step:function(n,l){if(c.outline&&c.outlineWhileAnimating&&l.prop=="top"){var m=d?l.pos:1-l.pos;var o={w:h.t+(h.get("wsize")-h.t)*m,h:g.t+(g.get("wsize")-g.t)*m,x:h.tpos+(h.pos-h.tpos)*m,y:g.tpos+(g.pos-g.tpos)*m};c.outline.setPosition(o,0,1)}}});hs.animate(this.content,i.content,b,f,a);if(d){this.wrapper.style.visibility="visible";this.content.style.visibility="visible";this.a.className+=" highslide-active-anchor"}},fade:function(f,h){this.outlineWhileAnimating=false;var c=this,j=f?hs.expandDuration:0;if(f){hs.animate(this.wrapper,h.wrapper,0);hs.setStyles(this.wrapper,{opacity:0,visibility:"visible"});hs.animate(this.content,h.content,0);this.content.style.visibility="visible";hs.animate(this.wrapper,{opacity:1},j,null,function(){c.afterExpand()})}if(this.outline){this.outline.table.style.zIndex=this.wrapper.style.zIndex;var b=f||-1,d=this.outline.offset,a=f?3:d,g=f?d:3;for(var e=a;b*e<=b*g;e+=b,j+=25){(function(){var i=f?g-e:a-e;setTimeout(function(){c.outline.setPosition(0,i,1)},j)})()}}if(f){}else{setTimeout(function(){if(c.outline){c.outline.destroy(c.preserveContent)}c.destroyOverlays();hs.animate(c.wrapper,{opacity:0},hs.restoreDuration,null,function(){c.afterClose()})},j)}},crossfade:function(g,m,o){if(!g){return}var f=this,p=this.last,l=this.x,k=this.y,d=p.x,b=p.y,a=this.wrapper,i=this.content,c=this.overlayBox;hs.removeEventListener(document,"mousemove",hs.dragHandler);hs.setStyles(i,{width:(l.imgSize||l.size)+"px",height:(k.imgSize||k.size)+"px"});if(c){c.style.overflow="visible"}this.outline=p.outline;if(this.outline){this.outline.exp=f}p.outline=null;var h=hs.createElement("div",{className:"highslide-"+this.contentType},{position:"absolute",zIndex:4,overflow:"hidden",display:"none"});var j={oldImg:p,newImg:this};for(var e in j){this[e]=j[e].content.cloneNode(1);hs.setStyles(this[e],{position:"absolute",border:0,visibility:"visible"});h.appendChild(this[e])}a.appendChild(h);if(c){c.className="";a.appendChild(c)}h.style.display="";p.content.style.display="none";if(hs.safari&&hs.uaVersion<525){this.wrapper.style.visibility="visible"}hs.animate(a,{width:l.size},{duration:hs.transitionDuration,step:function(u,r){var x=r.pos,q=1-x;var w,s={},t=["pos","size","p1","p2"];for(var v in t){w=t[v];s["x"+w]=Math.round(q*d[w]+x*l[w]);s["y"+w]=Math.round(q*b[w]+x*k[w]);s.ximgSize=Math.round(q*(d.imgSize||d.size)+x*(l.imgSize||l.size));s.ximgPad=Math.round(q*d.get("imgPad")+x*l.get("imgPad"));s.yimgSize=Math.round(q*(b.imgSize||b.size)+x*(k.imgSize||k.size));s.yimgPad=Math.round(q*b.get("imgPad")+x*k.get("imgPad"))}if(f.outline){f.outline.setPosition({x:s.xpos,y:s.ypos,w:s.xsize+s.xp1+s.xp2+2*l.cb,h:s.ysize+s.yp1+s.yp2+2*k.cb})}p.wrapper.style.clip="rect("+(s.ypos-b.pos)+"px, "+(s.xsize+s.xp1+s.xp2+s.xpos+2*d.cb-d.pos)+"px, "+(s.ysize+s.yp1+s.yp2+s.ypos+2*b.cb-b.pos)+"px, "+(s.xpos-d.pos)+"px)";hs.setStyles(i,{top:(s.yp1+k.get("imgPad"))+"px",left:(s.xp1+l.get("imgPad"))+"px",marginTop:(k.pos-s.ypos)+"px",marginLeft:(l.pos-s.xpos)+"px"});hs.setStyles(a,{top:s.ypos+"px",left:s.xpos+"px",width:(s.xp1+s.xp2+s.xsize+2*l.cb)+"px",height:(s.yp1+s.yp2+s.ysize+2*k.cb)+"px"});hs.setStyles(h,{width:(s.ximgSize||s.xsize)+"px",height:(s.yimgSize||s.ysize)+"px",left:(s.xp1+s.ximgPad)+"px",top:(s.yp1+s.yimgPad)+"px",visibility:"visible"});hs.setStyles(f.oldImg,{top:(b.pos-s.ypos+b.p1-s.yp1+b.get("imgPad")-s.yimgPad)+"px",left:(d.pos-s.xpos+d.p1-s.xp1+d.get("imgPad")-s.ximgPad)+"px"});hs.setStyles(f.newImg,{opacity:x,top:(k.pos-s.ypos+k.p1-s.yp1+k.get("imgPad")-s.yimgPad)+"px",left:(l.pos-s.xpos+l.p1-s.xp1+l.get("imgPad")-s.ximgPad)+"px"});if(c){hs.setStyles(c,{width:s.xsize+"px",height:s.ysize+"px",left:(s.xp1+l.cb)+"px",top:(s.yp1+k.cb)+"px"})}},complete:function(){a.style.visibility=i.style.visibility="visible";i.style.display="block";hs.discardElement(h);f.afterExpand();p.afterClose();f.last=null}})},reuseOverlay:function(d,c){if(!this.last){return false}for(var b=0;b'+b+""+this[this.numberPosition].innerHTML}}},initSlideshow:function(){if(!this.last){for(var c=0;cthis.x.get("opos")+this.x.get("osize"));var g=(k.y+k.hthis.y.get("opos")+this.y.get("osize"))}var d=hs.getWrapperKey(e[f]);if(!j&&!g&&d!=this.key){if(!h){e[f].setAttribute("hidden-by","["+this.key+"]");e[f].origProp=e[f].style[a];e[f].style[a]="hidden"}else{if(h.indexOf("["+this.key+"]")==-1){e[f].setAttribute("hidden-by",h+"["+this.key+"]")}}}else{if((h=="["+this.key+"]"||hs.focusKey==d)&&d!=this.key){e[f].setAttribute("hidden-by","");e[f].style[a]=e[f].origProp||""}else{if(h&&h.indexOf("["+this.key+"]")>-1){e[f].setAttribute("hidden-by",h.replace("["+this.key+"]",""))}}}}}}}},focus:function(){this.wrapper.style.zIndex=hs.zIndexCounter+=2;for(var a=0;ae.parentNode.offsetWidth){e.style.width="100%"}}else{if(e.parentNode!=this.overlayBox){this.overlayBox.appendChild(e)}}if(/left$/.test(f)){e.style.left=b+"px"}if(/center$/.test(f)){hs.setStyles(e,{left:"50%",marginLeft:(b-Math.round(e.offsetWidth/2))+"px"})}if(/right$/.test(f)){e.style.right=-b+"px"}if(/^leftpanel$/.test(f)){hs.setStyles(e,{right:"100%",marginRight:this.x.cb+"px",top:-this.y.cb+"px",bottom:-this.y.cb+"px",overflow:"auto"});this.x.p1=e.offsetWidth}else{if(/^rightpanel$/.test(f)){hs.setStyles(e,{left:"100%",marginLeft:this.x.cb+"px",top:-this.y.cb+"px",bottom:-this.y.cb+"px",overflow:"auto"});this.x.p2=e.offsetWidth}}var d=e.parentNode.offsetHeight;e.style.height="auto";if(c&&e.offsetHeight>d){e.style.height=hs.ieLt7?d+"px":"100%"}if(/^top/.test(f)){e.style.top=a+"px"}if(/^middle/.test(f)){hs.setStyles(e,{top:"50%",marginTop:(a-Math.round(e.offsetHeight/2))+"px"})}if(/^bottom/.test(f)){e.style.bottom=-a+"px"}if(/^above$/.test(f)){hs.setStyles(e,{left:(-this.x.p1-this.x.cb)+"px",right:(-this.x.p2-this.x.cb)+"px",bottom:"100%",marginBottom:this.y.cb+"px",width:"auto"});this.y.p1=e.offsetHeight}else{if(/^below$/.test(f)){hs.setStyles(e,{position:"relative",left:(-this.x.p1-this.x.cb)+"px",right:(-this.x.p2-this.x.cb)+"px",top:"100%",marginTop:this.y.cb+"px",width:"auto"});this.y.p2=e.offsetHeight;e.style.position="absolute"}}},getOverlays:function(){this.getInline(["heading","caption"],true);this.getNumber();if(this.heading&&this.dragByHeading){this.heading.className+=" highslide-move"}if(hs.showCredits){this.writeCredits()}for(var a=0;a0){F=0}if(C>0){C=0}if(C0?G[L-1].parentNode[B]:w[B],A=w[B]+w[H]+(G[L+1]?G[L+1].parentNode[H]:0);if(A>x-v){C=x-A}else{if(J<-v){C=-J}}}var E=w[B]+(w[H]-g[H])/2+C;hs.animate(s,h?{left:C}:{top:C},null,"easeOutQuad");hs.animate(g,h?{left:E}:{top:E},null,"easeOutQuad");l.style.display=C<0?"block":"none";t.style.display=(C>F)?"block":"none"}var j=hs.anchors.groups[hs.expanders[k.expKey].slideshowGroup||"none"],f=k.thumbstrip,m=f.mode||"horizontal",u=(m=="float"),o=u?["div","ul","li","span"]:["table","tbody","tr","td"],h=(m=="horizontal"),r=hs.createElement("div",{className:"highslide-thumbstrip highslide-thumbstrip-"+m,innerHTML:'
    <'+o[0]+"><"+o[1]+">
    '},{display:"none"},hs.container),e=r.childNodes,n=e[0],l=e[1],t=e[2],g=e[3],s=n.firstChild,a=r.getElementsByTagName(o[1])[0],b;for(var q=0;q35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q(!m){u m={18:{9C:\'9t\',9f:\'bb...\',9g:\'8o 1L ba\',9Y:\'8o 1L bd 1L bw\',7p:\'bx 1L bl B (f)\',aS:\'bp by 8H 8I\',b0:\'bn 1L bj 8H 8I bz\',8T:\'8C\',8U:\'8D\',8w:\'8E\',8v:\'8J\',8t:\'8J (bv)\',bu:\'bg\',8P:\'8G\',8A:\'8G 1g (8B)\',8N:\'8F\',8M:\'8F 1g (8B)\',8S:\'8C (8l 14)\',8O:\'8D (8l 2V)\',8s:\'8E\',8r:\'1:1\',3n:\'b9 %1 bq %2\',84:\'8o 1L 26 2M, c4 8L c6 1L 3i. c0 8l c1 K 1p 8L 3c.\'},4p:\'L/bX/\',5M:\'bI.4y\',5m:\'bK.4y\',7f:53,8p:53,4L:15,9M:15,4j:15,9K:15,4z:bE,91:0.75,9j:J,7A:5,3B:2,bP:3,4R:1f,at:\'4g 2V\',aq:1,an:J,aF:\'bQ://L.c2/\',aE:\'bO\',8V:J,8e:[\'a\'],2Z:[],aL:53,3I:0,7G:50,3Q:\'2n\',6H:\'2n\',8y:H,8x:H,7v:J,5c:8R,5w:8R,5q:J,1B:\'bR-bS\',a6:{2B:\'<7V>\'+\'<1R 2s="L-3c">\'+\'\'+\'<23>{m.18.8T}\'+\'\'+\'<1R 2s="L-3r">\'+\'\'+\'<23>{m.18.8P}\'+\'\'+\'<1R 2s="L-2S">\'+\'\'+\'<23>{m.18.8N}\'+\'\'+\'<1R 2s="L-1p">\'+\'\'+\'<23>{m.18.8U}\'+\'\'+\'<1R 2s="L-3i">\'+\'\'+\'<23>{m.18.8w}\'+\'\'+\'<1R 2s="L-1a-2D">\'+\'\'+\'<23>{m.18.8r}\'+\'\'+\'<1R 2s="L-26">\'+\'\'+\'<23>{m.18.8v}\'+\'\'+\'\'},4X:[],6Z:J,W:[],6V:[\'5q\',\'30\',\'3Q\',\'6H\',\'8y\',\'8x\',\'1B\',\'3B\',\'bG\',\'bH\',\'bJ\',\'8u\',\'bW\',\'cd\',\'cc\',\'8z\',\'aW\',\'7v\',\'3D\',\'5b\',\'2Z\',\'3I\',\'M\',\'1b\',\'7B\',\'5c\',\'5w\',\'6F\',\'6R\',\'9i\',\'2t\',\'2r\',\'aT\',\'aD\',\'1G\'],1x:[],4V:0,7q:{x:[\'9H\',\'14\',\'4i\',\'2V\',\'9L\'],y:[\'4T\',\'11\',\'8h\',\'4g\',\'6D\']},66:{},8z:{},8u:{},3u:[],4U:[],48:{},7I:{},5G:[],21:/ca\\/4\\.0/.19(4B.5r)?8:8n((4B.5r.5Y().2H(/.+(?:9y|c9|ce|2m)[\\/: ]([\\d.]+)/)||[0,\'0\'])[1]),2m:(R.52&&!1A.3q),4u:/cf/.19(4B.5r),5Z:/ci.+9y:1\\.[0-8].+cg/.19(4B.5r),$:z(1M){q(1M)D R.c7(1M)},2p:z(2o,3j){2o[2o.S]=3j},1c:z(9m,4k,3P,8b,9n){u C=R.1c(9m);q(4k)m.3b(C,4k);q(9n)m.V(C,{bY:0,aM:\'1F\',6S:0});q(3P)m.V(C,3P);q(8b)8b.2E(C);D C},3b:z(C,4k){K(u x 2T 4k)C[x]=4k[x];D C},V:z(C,3P){K(u x 2T 3P){q(m.4d&&x==\'1n\'){q(3P[x]>0.99)C.G.c5(\'5j\');I C.G.5j=\'9o(1n=\'+(3P[x]*28)+\')\'}I C.G[x]=3P[x]}},2b:z(C,Z,31){u 41,4v,47;q(1q 31!=\'6q\'||31===H){u 36=9V;31={3J:36[2],2r:36[3],63:36[4]}}q(1q 31.3J!=\'3n\')31.3J=53;31.2r=1d[31.2r]||1d.93;31.5S=m.3b({},Z);K(u 35 2T Z){u e=24 m.1E(C,31,35);41=8n(m.7U(C,35))||0;4v=8n(Z[35]);47=35!=\'1n\'?\'F\':\'\';e.3F(41,4v,47)}},7U:z(C,Z){q(C.G[Z]){D C.G[Z]}I q(R.6T){D R.6T.9P(C,H).9Q(Z)}I{q(Z==\'1n\')Z=\'5j\';u 3j=C.bf[Z.2j(/\\-(\\w)/g,z(a,b){D b.92()})];q(Z==\'5j\')3j=3j.2j(/9o\\(1n=([0-9]+)\\)/,z(a,b){D b/28});D 3j===\'\'?1:3j}},6v:z(){u d=R,w=1A,5d=d.6i&&d.6i!=\'7P\'?d.4l:d.3x,4d=m.2m&&(m.21<9||1q 9l==\'1C\');u M=4d?5d.8m:(d.4l.8m||5J.b2),1b=4d?5d.aK:5J.b3;m.3S={M:M,1b:1b,5l:4d?5d.5l:9l,5i:4d?5d.5i:be};D m.3S},6g:z(C){u p={x:C.4f,y:C.9h};4o(C.9k){C=C.9k;p.x+=C.4f;p.y+=C.9h;q(C!=R.3x&&C!=R.4l){p.x-=C.5l;p.y-=C.5i}}D p},2D:z(a,2O,3F,T){q(!a)a=m.1c(\'a\',H,{1u:\'1F\'},m.22);q(1q a.5u==\'z\')D 2O;2d{24 m.4Z(a,2O,3F);D 1f}1W(e){D J}},a4:z(C,4F,U){u 1i=C.2L(4F);K(u i=0;i<1i.S;i++){q((24 5X(U)).19(1i[i].U)){D 1i[i]}}D H},a7:z(s){s=s.2j(/\\s/g,\' \');u 1T=/{m\\.18\\.([^}]+)\\}/g,4S=s.2H(1T),18;q(4S)K(u i=0;i<4S.S;i++){18=4S[i].2j(1T,"$1");q(1q m.18[18]!=\'1C\')s=s.2j(4S[i],m.18[18])}D s},9w:z(){u 7J=0,6j=-1,W=m.W,A,1r;K(u i=0;i7J){7J=1r;6j=i}}}q(6j==-1)m.3v=-1;I W[6j].43()},5h:z(a,5p){a.5u=a.2G;u p=a.5u?a.5u():H;a.5u=H;D(p&&1q p[5p]!=\'1C\')?p[5p]:(1q m[5p]!=\'1C\'?m[5p]:H)},73:z(a){u 1G=m.5h(a,\'1G\');q(1G)D 1G;D a.1Y},4W:z(1M){u 3w=m.$(1M),45=m.7I[1M],a={};q(!3w&&!45)D H;q(!45){45=3w.7j(J);45.1M=\'\';m.7I[1M]=45;D 3w}I{D 45.7j(J)}},3H:z(d){q(d)m.8j.2E(d);m.8j.2R=\'\'},1m:z(A){q(!m.2a){7E=J;m.2a=m.1c(\'X\',{U:\'L-bk L-1Z-B\',4x:\'\',2G:z(){m.26()}},{1e:\'1D\',1n:0},m.22,J);q(/(bm|bt|bo|br)/.19(4B.5r)){u 3x=R.3x;z 7H(){m.V(m.2a,{M:3x.bA+\'F\',1b:3x.b5+\'F\'})}7H();m.1Q(1A,\'3O\',7H)}}m.2a.G.1u=\'\';u 7E=m.2a.4x==\'\';m.2a.4x+=\'|\'+A.P;q(7E){q(m.5Z&&m.9q)m.V(m.2a,{9e:\'5O(\'+m.4p+\'bh.97)\',1n:1});I m.2b(m.2a,{1n:A.3I},m.7G)}},7Q:z(P){q(!m.2a)D;q(1q P!=\'1C\')m.2a.4x=m.2a.4x.2j(\'|\'+P,\'\');q((1q P!=\'1C\'&&m.2a.4x!=\'\')||(m.1U&&m.5h(m.1U,\'3I\')))D;q(m.5Z&&m.9q)m.2a.G.1u=\'1F\';I m.2b(m.2a,{1n:0},m.7G,H,z(){m.2a.G.1u=\'1F\'})},83:z(6n,A){u Y=A||m.2h();A=Y;q(m.1U)D 1f;I m.Y=Y;m.49(R,1A.3q?\'5P\':\'5Q\',m.4N);2d{m.1U=6n;6n.2G()}1W(e){m.Y=m.1U=H}2d{q(!6n||A.2Z[1]!=\'3Y\')A.26()}1W(e){}D 1f},6d:z(C,1P){u A=m.2h(C);q(A)D m.83(A.7b(1P),A);I D 1f},3c:z(C){D m.6d(C,-1)},1p:z(C){D m.6d(C,1)},4N:z(e){q(!e)e=1A.29;q(!e.2i)e.2i=e.7l;q(1q e.2i.9x!=\'1C\')D J;u A=m.2h();u 1P=H;8Y(e.cq){1I 70:q(A)A.6k();D J;1I 32:1P=2;5B;1I 34:1I 39:1I 40:1P=1;5B;1I 8:1I 33:1I 37:1I 38:1P=-1;5B;1I 27:1I 13:1P=0}q(1P!==H){q(1P!=2)m.49(R,1A.3q?\'5P\':\'5Q\',m.4N);q(!m.8V)D J;q(e.4D)e.4D();I e.9W=1f;q(A){q(1P==0){A.26()}I q(1P==2){q(A.1g)A.1g.ad()}I{q(A.1g)A.1g.2S();m.6d(A.P,1P)}D 1f}}D J},d5:z(O){m.2p(m.1x,m.3b(O,{1H:\'1H\'+m.4V++}))},d4:z(1h){u 2C=1h.2t;q(1q 2C==\'6q\'){K(u i=0;i<2C.S;i++){u o={};K(u x 2T 1h)o[x]=1h[x];o.2t=2C[i];m.2p(m.4U,o)}}I{m.2p(m.4U,1h)}},86:z(7N,65){u C,1T=/^L-Q-([0-9]+)$/;C=7N;4o(C.1O){q(C.5F!==1C)D C.5F;q(C.1M&&1T.19(C.1M))D C.1M.2j(1T,"$1");C=C.1O}q(!65){C=7N;4o(C.1O){q(C.4F&&m.5L(C)){K(u P=0;P1)D J;q(!e.2i)e.2i=e.7l;u C=e.2i;4o(C.1O&&!(/L-(2M|3i|5W|3O)/.19(C.U))){C=C.1O}u A=m.2h(C);q(A&&(A.8c||!A.55))D J;q(A&&e.T==\'aH\'){q(e.2i.9x)D J;u 2H=C.U.2H(/L-(2M|3i|3O)/);q(2H){m.2I={A:A,T:2H[1],14:A.x.E,M:A.x.B,11:A.y.E,1b:A.y.B,9v:e.6c,9u:e.68};m.1Q(R,\'6o\',m.5V);q(e.4D)e.4D();q(/L-(2M|5W)-89/.19(A.17.U)){A.43();m.7R=J}D 1f}}I q(e.T==\'aA\'){m.49(R,\'6o\',m.5V);q(m.2I){q(m.4I&&m.2I.T==\'2M\')m.2I.A.17.G.46=m.4I;u 3y=m.2I.3y;q(!3y&&!m.7R&&!/(3i|3O)/.19(m.2I.T)){A.26()}I q(3y||(!3y&&m.d8)){m.2I.A.5s(\'1s\')}m.7R=1f;m.2I=H}I q(/L-2M-89/.19(C.U)){C.G.46=m.4I}}D 1f},5V:z(e){q(!m.2I)D J;q(!e)e=1A.29;u a=m.2I,A=a.A;a.5T=e.6c-a.9v;a.7o=e.68-a.9u;u 7s=1d.ck(1d.9r(a.5T,2)+1d.9r(a.7o,2));q(!a.3y)a.3y=(a.T!=\'2M\'&&7s>0)||(7s>(m.cX||5));q(a.3y&&e.6c>5&&e.68>5){q(a.T==\'3O\')A.3O(a);I{A.7C(a.14+a.5T,a.11+a.7o);q(a.T==\'2M\')A.17.G.46=\'3i\'}}D 1f},8Q:z(e){2d{q(!e)e=1A.29;u 6C=/cW/i.19(e.T);q(!e.2i)e.2i=e.7l;q(!e.6E)e.6E=6C?e.db:e.di;u A=m.2h(e.2i);q(!A.55)D;q(!A||!e.6E||m.2h(e.6E,J)==A||m.2I)D;K(u i=0;i=k.1h.3J+k.80){k.4c=k.4v;k.E=k.7X=1;k.8a();k.1h.5S[k.Z]=J;u 8d=J;K(u i 2T k.1h.5S)q(k.1h.5S[i]!==J)8d=1f;q(8d){q(k.1h.63)k.1h.63.95(k.2F)}D 1f}I{u n=t-k.80;k.7X=n/k.1h.3J;k.E=k.1h.2r(n,0,1,k.1h.3J);k.4c=k.41+((k.4v-k.41)*k.E);k.8a()}D J}};m.3b(m.1E,{3k:{1n:z(1E){m.V(1E.2F,{1n:1E.4c})},96:z(1E){2d{q(1E.2F.G&&1E.2F.G[1E.Z]!=H)1E.2F.G[1E.Z]=1E.4c+1E.47;I 1E.2F[1E.Z]=1E.4c}1W(e){}}}});m.4O=z(1B,3V){k.3V=3V;k.1B=1B;u v=m.21,3L;k.7h=m.2m&&m.21<7;q(!1B){q(3V)3V();D}m.71();k.1V=m.1c(\'1V\',{cr:0},{1e:\'1s\',1j:\'2v\',cC:\'cD\',M:0},m.22,J);u 4a=m.1c(\'4a\',H,H,k.1V,1);k.2e=[];K(u i=0;i<=8;i++){q(i%3==0)3L=m.1c(\'3L\',H,{1b:\'2n\'},4a,J);k.2e[i]=m.1c(\'2e\',H,H,3L,J);u G=i!=4?{cP:0,cO:0}:{1j:\'8i\'};m.V(k.2e[i],G)}k.2e[4].U=1B+\' L-16\';k.98()};m.4O.5o={98:z(){u 1G=m.4p+(m.cN||"cQ/")+k.1B+".97";u 9a=m.4u&&m.21<6t?m.22:H;k.3d=m.1c(\'1y\',H,{1j:\'2v\',11:\'-4P\'},9a,J);u 7T=k;k.3d.64=z(){7T.9b()};k.3d.1G=1G},9b:z(){u o=k.1k=k.3d.M/4,E=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],1m={1b:(2*o)+\'F\',M:(2*o)+\'F\'};K(u i=0;i<=8;i++){q(E[i]){q(k.7h){u w=(i==1||i==7)?\'28%\':k.3d.M+\'F\';u X=m.1c(\'X\',H,{M:\'28%\',1b:\'28%\',1j:\'8i\',3a:\'1s\'},k.2e[i],J);m.1c(\'X\',H,{5j:"cL:cG.cF.cE(cH=cI, 1G=\'"+k.3d.1G+"\')",1j:\'2v\',M:w,1b:k.3d.1b+\'F\',14:(E[i][0]*o)+\'F\',11:(E[i][1]*o)+\'F\'},X,J)}I{m.V(k.2e[i],{9e:\'5O(\'+k.3d.1G+\') \'+(E[i][0]*o)+\'F \'+(E[i][1]*o)+\'F\'})}q(1A.3q&&(i==3||i==5))m.1c(\'X\',H,1m,k.2e[i],J);m.V(k.2e[i],1m)}}k.3d=H;q(m.48[k.1B])m.48[k.1B].5x();m.48[k.1B]=k;q(k.3V)k.3V()},3Z:z(E,1k,9d,3t,2r){u A=k.A,cK=A.Q.G,1k=1k||0,E=E||{x:A.x.E+1k,y:A.y.E+1k,w:A.x.N(\'1N\')-2*1k,h:A.y.N(\'1N\')-2*1k};q(9d)k.1V.G.1e=(E.h>=4*k.1k)?\'1D\':\'1s\';m.V(k.1V,{14:(E.x-k.1k)+\'F\',11:(E.y-k.1k)+\'F\',M:(E.w+2*k.1k)+\'F\'});E.w-=2*k.1k;E.h-=2*k.1k;m.V(k.2e[4],{M:E.w>=0?E.w+\'F\':0,1b:E.h>=0?E.h+\'F\':0});q(k.7h)k.2e[3].G.1b=k.2e[5].G.1b=k.2e[4].G.1b},5x:z(9c){q(9c)k.1V.G.1e=\'1s\';I m.3H(k.1V)}};m.6r=z(A,1m){k.A=A;k.1m=1m;k.3m=1m==\'x\'?\'ah\':\'au\';k.3G=k.3m.5Y();k.4M=1m==\'x\'?\'af\':\'ag\';k.6B=k.4M.5Y();k.7d=1m==\'x\'?\'a5\':\'a8\';k.90=k.7d.5Y();k.1o=k.2z=0};m.6r.5o={N:z(P){8Y(P){1I\'78\':D k.1K+k.3o+(k.t-m.1S[\'1k\'+k.3m])/2;1I\'6Q\':D k.E+k.cb+k.1o+(k.B-m.1S[\'1k\'+k.3m])/2;1I\'1N\':D k.B+2*k.cb+k.1o+k.2z;1I\'4n\':D k.3W-k.2P-k.3X;1I\'7a\':D k.N(\'4n\')-2*k.cb-k.1o-k.2z;1I\'5t\':D k.E-(k.A.16?k.A.16.1k:0);1I\'7M\':D k.N(\'1N\')+(k.A.16?2*k.A.16.1k:0);1I\'2f\':D k.1z?1d.2y((k.B-k.1z)/2):0}},74:z(){k.cb=(k.A.17[\'1k\'+k.3m]-k.t)/2;k.3X=m[\'6S\'+k.7d]},6X:z(){k.t=k.A.C[k.3G]?7L(k.A.C[k.3G]):k.A.C[\'1k\'+k.3m];k.1K=k.A.1K[k.1m];k.3o=(k.A.C[\'1k\'+k.3m]-k.t)/2;q(k.1K==0||k.1K==-1){k.1K=(m.3S[k.3G]/2)+m.3S[\'1J\'+k.4M]}},6P:z(){u A=k.A;k.2k=\'2n\';q(A.6H==\'4i\')k.2k=\'4i\';I q(24 5X(k.6B).19(A.3Q))k.2k=H;I q(24 5X(k.90).19(A.3Q))k.2k=\'56\';k.E=k.1K-k.cb+k.3o;q(k.6R&&k.1m==\'x\')A.6F=1d.2X(A.6F||k.1a,A.6R*k.1a/A.y.1a);k.B=1d.2X(k.1a,A[\'56\'+k.3m]||k.1a);k.2q=A.5q?1d.2X(A[\'2X\'+k.3m],k.1a):k.1a;q(A.3A&&A.30){k.B=A[k.3G];k.1z=k.1a}q(k.1m==\'x\'&&m.4R)k.2q=A.5c;k.2i=A[\'2i\'+k.1m.92()];k.2P=m[\'6S\'+k.4M];k.1J=m.3S[\'1J\'+k.4M];k.3W=m.3S[k.3G]},82:z(i){u A=k.A;q(A.3A&&(A.30||m.4R)){k.1z=i;k.B=1d.56(k.B,k.1z);A.17.G[k.6B]=k.N(\'2f\')+\'F\'}I k.B=i;A.17.G[k.3G]=i+\'F\';A.Q.G[k.3G]=k.N(\'1N\')+\'F\';q(A.16)A.16.3Z();q(k.1m==\'x\'&&A.1l)A.4K(J);q(k.1m==\'x\'&&A.1g&&A.3A){q(i==k.1a)A.1g.4J(\'1a-2D\');I A.1g.3T(\'1a-2D\')}},7Z:z(i){k.E=i;k.A.Q.G[k.6B]=i+\'F\';q(k.A.16)k.A.16.3Z()}};m.4Z=z(a,2O,3F,2Q){q(R.cs&&m.2m&&!m.6I){m.1Q(R,\'3s\',z(){24 m.4Z(a,2O,3F,2Q)});D}k.a=a;k.3F=3F;k.2Q=2Q||\'2M\';k.3A=!k.cp;m.6Z=1f;k.1x=[];k.Y=m.Y;m.Y=H;m.71();u P=k.P=m.W.S;K(u i=0;ip.1J+p.3W-p.3X)p.E=p.1J+p.3W-p.B-p.2P-p.3X-p.1o-p.2z;q(p.E(k.x.1z||k.x.B)){k.ap();q(k.1x.S==1)k.4K()}}k.aG()}1W(e){k.7D(e)}},2k:z(p,4C){u 4b,2l=p.2i,1m=p==k.x?\'x\':\'y\';q(2l&&2l.2H(/ /)){4b=2l.dh(\' \');2l=4b[0]}q(2l&&m.$(2l)){p.E=m.6g(m.$(2l))[1m];q(4b&&4b[1]&&4b[1].2H(/^[-]?[0-9]+F$/))p.E+=7L(4b[1]);q(p.Bp.1J+p.3W-p.3X){q(!4C&&79&&4q){p.B=1d.2X(p.B,p.N(1m==\'y\'?\'4n\':\'7a\'))}I q(p.N(\'1N\')2x){ 2A=2Y*2x;q(2Ak.5w&&x.B>k.5c&&y.N(\'1N\')>y.N(\'4n\')){y.B-=10;q(2x)x.B=y.B*2x;k.4K(0,1);3e=J}}D 3e},aG:z(){u x=k.x,y=k.y;k.5s(\'1s\');q(k.1g&&k.1g.2g)k.1g.2g.4G();k.8f(1,{Q:{M:x.N(\'1N\'),1b:y.N(\'1N\'),14:x.E,11:y.E},17:{14:x.1o+x.N(\'2f\'),11:y.1o+y.N(\'2f\'),M:x.1z||x.B,1b:y.1z||y.B}},m.7f)},8f:z(1t,1L,3t){u 5k=k.2Z,6M=1t?(k.Y?k.Y.a:H):m.1U,t=(5k[1]&&6M&&m.5h(6M,\'2Z\')[1]==5k[1])?5k[1]:5k[0];q(k[t]&&t!=\'2D\'){k[t](1t,1L);D}q(k.16&&!k.3B){q(1t)k.16.3Z();I k.16.5x()}q(!1t)k.67();u A=k,x=A.x,y=A.y,2r=k.2r;q(!1t)2r=k.aT||2r;u ay=1t?z(){q(A.16)A.16.1V.G.1e="1D";4r(z(){A.62()},50)}:z(){A.5v()};q(1t)m.V(k.Q,{M:x.t+\'F\',1b:y.t+\'F\'});q(k.aD){m.V(k.Q,{1n:1t?0:1});m.3b(1L.Q,{1n:1t})}m.2b(k.Q,1L.Q,{3J:3t,2r:2r,3k:z(3j,36){q(A.16&&A.3B&&36.Z==\'11\'){u 4Q=1t?36.E:1-36.E;u E={w:x.t+(x.N(\'1N\')-x.t)*4Q,h:y.t+(y.N(\'1N\')-y.t)*4Q,x:x.1K+(x.E-x.1K)*4Q,y:y.1K+(y.E-y.1K)*4Q};A.16.3Z(E,0,1)}}});m.2b(k.17,1L.17,3t,2r,ay);q(1t){k.Q.G.1e=\'1D\';k.17.G.1e=\'1D\';k.a.U+=\' L-42-3Q\'}},5n:z(1t,1L){k.3B=1f;u A=k,t=1t?m.7f:0;q(1t){m.2b(k.Q,1L.Q,0);m.V(k.Q,{1n:0,1e:\'1D\'});m.2b(k.17,1L.17,0);k.17.G.1e=\'1D\';m.2b(k.Q,{1n:1},t,H,z(){A.62()})}q(k.16){k.16.1V.G.1r=k.Q.G.1r;u 5D=1t||-1,1k=k.16.1k,7c=1t?3:1k,6Y=1t?1k:3;K(u i=7c;5D*i<=5D*6Y;i+=5D,t+=25){(z(){u o=1t?6Y-i:7c-i;4r(z(){A.16.3Z(0,o,1)},t)})()}}q(1t){}I{4r(z(){q(A.16)A.16.5x(A.cz);A.67();m.2b(A.Q,{1n:0},m.8p,H,z(){A.5v()})},t)}},3Y:z(1t,1L,72){q(!1t)D;u A=k,Y=k.Y,x=k.x,y=k.y,2W=Y.x,2U=Y.y,Q=k.Q,17=k.17,1l=k.1l;m.49(R,\'6o\',m.5V);m.V(17,{M:(x.1z||x.B)+\'F\',1b:(y.1z||y.B)+\'F\'});q(1l)1l.G.3a=\'1D\';k.16=Y.16;q(k.16)k.16.A=A;Y.16=H;u 4s=m.1c(\'X\',{U:\'L-\'+k.2Q},{1j:\'2v\',1r:4,3a:\'1s\',1u:\'1F\'});u 77={aO:Y,aR:k};K(u n 2T 77){k[n]=77[n].17.7j(1);m.V(k[n],{1j:\'2v\',aM:0,1e:\'1D\'});4s.2E(k[n])}Q.2E(4s);q(1l){1l.U=\'\';Q.2E(1l)}4s.G.1u=\'\';Y.17.G.1u=\'1F\';q(m.4u&&m.21<6t){k.Q.G.1e=\'1D\'}m.2b(Q,{M:x.B},{3J:m.aL,3k:z(3j,36){u E=36.E,3U=1-E;u Z,B={},6N=[\'E\',\'B\',\'1o\',\'2z\'];K(u n 2T 6N){Z=6N[n];B[\'x\'+Z]=1d.2y(3U*2W[Z]+E*x[Z]);B[\'y\'+Z]=1d.2y(3U*2U[Z]+E*y[Z]);B.aJ=1d.2y(3U*(2W.1z||2W.B)+E*(x.1z||x.B));B.6p=1d.2y(3U*2W.N(\'2f\')+E*x.N(\'2f\'));B.aN=1d.2y(3U*(2U.1z||2U.B)+E*(y.1z||y.B));B.6f=1d.2y(3U*2U.N(\'2f\')+E*y.N(\'2f\'))}q(A.16)A.16.3Z({x:B.2K,y:B.2J,w:B.58+B.3C+B.6O+2*x.cb,h:B.5a+B.3z+B.6W+2*y.cb});Y.Q.G.ct=\'cn(\'+(B.2J-2U.E)+\'F, \'+(B.58+B.3C+B.6O+B.2K+2*2W.cb-2W.E)+\'F, \'+(B.5a+B.3z+B.6W+B.2J+2*2U.cb-2U.E)+\'F, \'+(B.2K-2W.E)+\'F)\';m.V(17,{11:(B.3z+y.N(\'2f\'))+\'F\',14:(B.3C+x.N(\'2f\'))+\'F\',4j:(y.E-B.2J)+\'F\',4L:(x.E-B.2K)+\'F\'});m.V(Q,{11:B.2J+\'F\',14:B.2K+\'F\',M:(B.3C+B.6O+B.58+2*x.cb)+\'F\',1b:(B.3z+B.6W+B.5a+2*y.cb)+\'F\'});m.V(4s,{M:(B.aJ||B.58)+\'F\',1b:(B.aN||B.5a)+\'F\',14:(B.3C+B.6p)+\'F\',11:(B.3z+B.6f)+\'F\',1e:\'1D\'});m.V(A.aO,{11:(2U.E-B.2J+2U.1o-B.3z+2U.N(\'2f\')-B.6f)+\'F\',14:(2W.E-B.2K+2W.1o-B.3C+2W.N(\'2f\')-B.6p)+\'F\'});m.V(A.aR,{1n:E,11:(y.E-B.2J+y.1o-B.3z+y.N(\'2f\')-B.6f)+\'F\',14:(x.E-B.2K+x.1o-B.3C+x.N(\'2f\')-B.6p)+\'F\'});q(1l)m.V(1l,{M:B.58+\'F\',1b:B.5a+\'F\',14:(B.3C+x.cb)+\'F\',11:(B.3z+y.cb)+\'F\'})},63:z(){Q.G.1e=17.G.1e=\'1D\';17.G.1u=\'4H\';m.3H(4s);A.62();Y.5v();A.Y=H}})},9E:z(o,C){q(!k.Y)D 1f;K(u i=0;i\'+s+\'\'+k[k.5b].2R}}},aB:z(){q(!k.Y){K(u i=0;ik.x.N(\'5t\')+k.x.N(\'7M\'));u 9Z=(3g.y+3g.hk.y.N(\'5t\')+k.y.N(\'7M\'))}u 5H=m.86(1i[i]);q(!ax&&!9Z&&5H!=k.P){q(!2u){1i[i].5A(\'1s-by\',\'[\'+k.P+\']\');1i[i].88=1i[i].G[Z];1i[i].G[Z]=\'1s\'}I q(2u.9X(\'[\'+k.P+\']\')==-1){1i[i].5A(\'1s-by\',2u+\'[\'+k.P+\']\')}}I q((2u==\'[\'+k.P+\']\'||m.3v==5H)&&5H!=k.P){1i[i].5A(\'1s-by\',\'\');1i[i].G[Z]=1i[i].88||\'\'}I q(2u&&2u.9X(\'[\'+k.P+\']\')>-1){1i[i].5A(\'1s-by\',2u.2j(\'[\'+k.P+\']\',\'\'))}}}}},43:z(){k.Q.G.1r=m.4z+=2;K(u i=0;iO.1O.2c)O.G.M=\'28%\'}I q(O.1O!=k.1l)k.1l.2E(O);q(/14$/.19(p))O.G.14=5E+\'F\';q(/4i$/.19(p))m.V(O,{14:\'50%\',4L:(5E-1d.2y(O.2c/2))+\'F\'});q(/2V$/.19(p))O.G.2V=-5E+\'F\';q(/^9H$/.19(p)){m.V(O,{2V:\'28%\',9M:k.x.cb+\'F\',11:-k.y.cb+\'F\',4g:-k.y.cb+\'F\',3a:\'2n\'});k.x.1o=O.2c}I q(/^9L$/.19(p)){m.V(O,{14:\'28%\',4L:k.x.cb+\'F\',11:-k.y.cb+\'F\',4g:-k.y.cb+\'F\',3a:\'2n\'});k.x.2z=O.2c}u 8g=O.1O.3f;O.G.1b=\'2n\';q(4E&&O.3f>8g)O.G.1b=m.3E?8g+\'F\':\'28%\';q(/^11/.19(p))O.G.11=5C+\'F\';q(/^8h/.19(p))m.V(O,{11:\'50%\',4j:(5C-1d.2y(O.3f/2))+\'F\'});q(/^4g/.19(p))O.G.4g=-5C+\'F\';q(/^4T$/.19(p)){m.V(O,{14:(-k.x.1o-k.x.cb)+\'F\',2V:(-k.x.2z-k.x.cb)+\'F\',4g:\'28%\',9K:k.y.cb+\'F\',M:\'2n\'});k.y.1o=O.3f}I q(/^6D$/.19(p)){m.V(O,{1j:\'8i\',14:(-k.x.1o-k.x.cb)+\'F\',2V:(-k.x.2z-k.x.cb)+\'F\',11:\'28%\',4j:k.y.cb+\'F\',M:\'2n\'});k.y.2z=O.3f;O.G.1j=\'2v\'}},9J:z(){k.a2([\'6z\',\'dd\'],J);k.a3();q(k.6z&&k.7v)k.6z.U+=\' L-3i\';q(m.an)k.am();K(u i=0;i0)4w=0;q(2w>0)2w=0;q(2w<4w)2w=4w}I{K(u j=0;j0?as[i-1].1O[4f]:3M[4f],7x=3M[4f]+3M[2c]+(as[i+1]?as[i+1].1O[2c]:0);q(7x>6h-5z)2w=6h-7x;I q(7F<-5z)2w=-7F}u 7r=3M[4f]+(3M[2c]-6b[2c])/2+2w;m.2b(1V,3p?{14:2w}:{11:2w},H,\'7n\');m.2b(6b,3p?{14:7r}:{11:7r},H,\'7n\');7Y.G.1u=2w<0?\'4H\':\'1F\';85.G.1u=(2w>4w)?\'4H\':\'1F\'};u 51=m.3R.2N[m.W[1g.3N].2t||\'1F\'],1h=1g.2g,4m=1h.4m||\'ao\',81=(4m==\'bi\'),3K=81?[\'X\',\'7V\',\'1R\',\'23\']:[\'1V\',\'4a\',\'3L\',\'2e\'],3p=(4m==\'ao\'),4e=m.1c(\'X\',{U:\'L-2g L-2g-\'+4m,2R:\'\'+\'<\'+3K[0]+\'><\'+3K[1]+\'>\'+\'\'+\'\'+\'\'},{1u:\'1F\'},m.22),57=4e.6l,X=57[0],7Y=57[1],85=57[2],6b=57[3],1V=X.b7,4a=4e.2L(3K[1])[0],3L;K(u i=0;i<51.S;i++){q(i==0||!3p)3L=m.1c(3K[2],H,H,4a);(z(){u a=51[i],3M=m.1c(3K[3],H,H,3L),cj=i;m.1c(\'a\',{1Y:a.1Y,1X:a.1X,2G:z(){q(/L-42-3Q/.19(k.U))D 1f;m.2h(k).43();D m.83(a)},2R:m.9I?m.9I(a):a.2R},H,3M)})()}q(!81){7Y.2G=z(){1J(-1)};85.2G=z(){1J(1)};m.1Q(4a,R.c3!==1C?\'bB\':\'bZ\',z(e){u 3h=0;e=e||1A.29;q(e.9D){3h=e.9D/ch;q(m.3q)3h=-3h}I q(e.9N){3h=-e.9N/3}q(3h)1J(-3h*0.2);q(e.4D)e.4D();e.9W=1f})}D{6s:6s,4G:4G}};m.5U=m.18;u bC=m.4Z;q(m.2m&&1A==1A.11){(z(){2d{R.4l.bD(\'14\')}1W(e){4r(9V.bF,50);D}m.3s()})()}m.1Q(R,\'bL\',m.3s);m.1Q(1A,\'az\',m.3s);m.1Q(R,\'3s\',z(){q(m.5M||m.3I){u G=m.1c(\'G\',{T:\'bM/7U\'},H,R.2L(\'bT\')[0]),8k=R.6i==\'7P\';z 5e(7w,7W){q(m.2m&&(m.21<9||8k)){u Y=R.9S[R.9S.S-1];q(1q(Y.5e)=="6q")Y.5e(7w,7W)}I{G.2E(R.bU(7w+" {"+7W+"}"))}}z 5f(Z){D\'bV( ( ( bN = R.4l.\'+Z+\' ? R.4l.\'+Z+\' : R.3x.\'+Z+\' ) ) + \\\'F\\\' );\'}q(m.5M)5e(\'.L 1y\',\'46: 5O(\'+m.4p+m.5M+\'), 5R !c8;\');5e(\'.L-1Z-B\',m.2m&&(m.21<7||8k)?\'1j: 2v; \'+\'14:\'+5f(\'5l\')+\'11:\'+5f(\'5i\')+\'M:\'+5f(\'8m\')+\'1b:\'+5f(\'aK\'):\'1j: bc; M: 28%; 1b: 28%; 14: 0; 11: 0\')}});m.1Q(1A,\'3O\',z(){m.6v();q(m.1Z)K(u i=0;iHighslide JS', - creditsTitle : 'Go to the Highslide JS homepage', - previousText : 'Previous', - nextText : 'Next', - moveText : 'Move', - closeText : 'Close', - closeTitle : 'Close (esc)', - resizeTitle : 'Resize', - playText : 'Play', - playTitle : 'Play slideshow (spacebar)', - pauseText : 'Pause', - pauseTitle : 'Pause slideshow (spacebar)', - previousTitle : 'Previous (arrow left)', - nextTitle : 'Next (arrow right)', - moveTitle : 'Move', - fullExpandText : '1:1', - restoreTitle : 'Click to close image, click and drag to move. Use arrow keys for next and previous.' -}, -// See http://highslide.com/ref for examples of settings -graphicsDir : 'highslide/graphics/', -expandCursor : 'zoomin.cur', // null disables -restoreCursor : 'zoomout.cur', // null disables -expandDuration : 250, // milliseconds -restoreDuration : 250, -marginLeft : 15, -marginRight : 15, -marginTop : 15, -marginBottom : 15, -zIndexCounter : 1001, // adjust to other absolutely positioned elements -loadingOpacity : 0.75, -allowMultipleInstances: true, -numberOfImagesToPreload : 5, -outlineWhileAnimating : 2, // 0 = never, 1 = always, 2 = HTML only -outlineStartOffset : 3, // ends at 10 -padToMinWidth : false, // pad the popup width to make room for wide caption -fullExpandPosition : 'bottom right', -fullExpandOpacity : 1, -showCredits : true, // you can set this to false if you want -creditsHref : 'http://highslide.com/', -creditsTarget : '_self', -enableKeyListener : true, -openerTagNames : ['a'], // Add more to allow slideshow indexing - -allowWidthReduction : false, -allowHeightReduction : true, -preserveContent : true, // Preserve changes made to the content and position of HTML popups. -objectLoadTime : 'before', // Load iframes 'before' or 'after' expansion. -cacheAjax : true, // Cache ajax popups for instant display. Can be overridden for each popup. -dragByHeading: true, -minWidth: 200, -minHeight: 200, -allowSizeReduction: true, // allow the image to reduce to fit client size. If false, this overrides minWidth and minHeight -outlineType : 'drop-shadow', // set null to disable outlines -skin : { - contentWrapper: - '
    '+ - '
    '+ - '' -}, -// END OF YOUR SETTINGS - - -// declare internal properties -preloadTheseImages : [], -continuePreloading: true, -expanders : [], -overrides : [ - 'allowSizeReduction', - 'useBox', - 'outlineType', - 'outlineWhileAnimating', - 'captionId', - 'captionText', - 'captionEval', - 'captionOverlay', - 'headingId', - 'headingText', - 'headingEval', - 'headingOverlay', - 'creditsPosition', - 'dragByHeading', - - 'width', - 'height', - - 'contentId', - 'allowWidthReduction', - 'allowHeightReduction', - 'preserveContent', - 'maincontentId', - 'maincontentText', - 'maincontentEval', - 'objectType', - 'cacheAjax', - 'objectWidth', - 'objectHeight', - 'objectLoadTime', - 'swfOptions', - 'wrapperClassName', - 'minWidth', - 'minHeight', - 'maxWidth', - 'maxHeight', - 'pageOrigin', - 'slideshowGroup', - 'easing', - 'easingClose', - 'fadeInOut', - 'src' -], -overlays : [], -idCounter : 0, -oPos : { - x: ['leftpanel', 'left', 'center', 'right', 'rightpanel'], - y: ['above', 'top', 'middle', 'bottom', 'below'] -}, -mouse: {}, -headingOverlay: {}, -captionOverlay: {}, -swfOptions: { flashvars: {}, params: {}, attributes: {} }, -timers : [], - -pendingOutlines : {}, -sleeping : [], -preloadTheseAjax : [], -cacheBindings : [], -cachedGets : {}, -clones : {}, -onReady: [], -uaVersion: /Trident\/4\.0/.test(navigator.userAgent) ? 8 : - parseFloat((navigator.userAgent.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1]), -ie : (document.all && !window.opera), -//ie : navigator && /MSIE [678]/.test(navigator.userAgent), // ie9 compliant? -safari : /Safari/.test(navigator.userAgent), -geckoMac : /Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent), - -$ : function (id) { - if (id) return document.getElementById(id); -}, - -push : function (arr, val) { - arr[arr.length] = val; -}, - -createElement : function (tag, attribs, styles, parent, nopad) { - var el = document.createElement(tag); - if (attribs) hs.extend(el, attribs); - if (nopad) hs.setStyles(el, {padding: 0, border: 'none', margin: 0}); - if (styles) hs.setStyles(el, styles); - if (parent) parent.appendChild(el); - return el; -}, - -extend : function (el, attribs) { - for (var x in attribs) el[x] = attribs[x]; - return el; -}, - -setStyles : function (el, styles) { - for (var x in styles) { - if (hs.ieLt9 && x == 'opacity') { - if (styles[x] > 0.99) el.style.removeAttribute('filter'); - else el.style.filter = 'alpha(opacity='+ (styles[x] * 100) +')'; - } - else el.style[x] = styles[x]; - } -}, -animate: function(el, prop, opt) { - var start, - end, - unit; - if (typeof opt != 'object' || opt === null) { - var args = arguments; - opt = { - duration: args[2], - easing: args[3], - complete: args[4] - }; - } - if (typeof opt.duration != 'number') opt.duration = 250; - opt.easing = Math[opt.easing] || Math.easeInQuad; - opt.curAnim = hs.extend({}, prop); - for (var name in prop) { - var e = new hs.fx(el, opt , name ); - - start = parseFloat(hs.css(el, name)) || 0; - end = parseFloat(prop[name]); - unit = name != 'opacity' ? 'px' : ''; - - e.custom( start, end, unit ); - } -}, -css: function(el, prop) { - if (el.style[prop]) { - return el.style[prop]; - } else if (document.defaultView) { - return document.defaultView.getComputedStyle(el, null).getPropertyValue(prop); - - } else { - if (prop == 'opacity') prop = 'filter'; - var val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b){ return b.toUpperCase(); })]; - if (prop == 'filter') - val = val.replace(/alpha\(opacity=([0-9]+)\)/, - function (a, b) { return b / 100 }); - return val === '' ? 1 : val; - } -}, - -getPageSize : function () { - var d = document, w = window, iebody = d.compatMode && d.compatMode != 'BackCompat' - ? d.documentElement : d.body, - ieLt9 = hs.ie && (hs.uaVersion < 9 || typeof pageXOffset == 'undefined'); - - var width = ieLt9 ? iebody.clientWidth : - (d.documentElement.clientWidth || self.innerWidth), - height = ieLt9 ? iebody.clientHeight : self.innerHeight; - hs.page = { - width: width, - height: height, - scrollLeft: ieLt9 ? iebody.scrollLeft : pageXOffset, - scrollTop: ieLt9 ? iebody.scrollTop : pageYOffset - }; - return hs.page; -}, - -getPosition : function(el) { - var p = { x: el.offsetLeft, y: el.offsetTop }; - while (el.offsetParent) { - el = el.offsetParent; - p.x += el.offsetLeft; - p.y += el.offsetTop; - if (el != document.body && el != document.documentElement) { - p.x -= el.scrollLeft; - p.y -= el.scrollTop; - } - } - return p; -}, - -expand : function(a, params, custom, type) { - if (!a) a = hs.createElement('a', null, { display: 'none' }, hs.container); - if (typeof a.getParams == 'function') return params; - if (type == 'html') { - for (var i = 0; i < hs.sleeping.length; i++) { - if (hs.sleeping[i] && hs.sleeping[i].a == a) { - hs.sleeping[i].awake(); - hs.sleeping[i] = null; - return false; - } - } - hs.hasHtmlExpanders = true; - } - try { - new hs.Expander(a, params, custom, type); - return false; - } catch (e) { return true; } -}, - -htmlExpand : function(a, params, custom) { - return hs.expand(a, params, custom, 'html'); -}, - -getSelfRendered : function() { - return hs.createElement('div', { - className: 'highslide-html-content', - innerHTML: hs.replaceLang(hs.skin.contentWrapper) - }); -}, -getElementByClass : function (el, tagName, className) { - var els = el.getElementsByTagName(tagName); - for (var i = 0; i < els.length; i++) { - if ((new RegExp(className)).test(els[i].className)) { - return els[i]; - } - } - return null; -}, -replaceLang : function(s) { - s = s.replace(/\s/g, ' '); - var re = /{hs\.lang\.([^}]+)\}/g, - matches = s.match(re), - lang; - if (matches) for (var i = 0; i < matches.length; i++) { - lang = matches[i].replace(re, "$1"); - if (typeof hs.lang[lang] != 'undefined') s = s.replace(matches[i], hs.lang[lang]); - } - return s; -}, - - -getCacheBinding : function (a) { - for (var i = 0; i < hs.cacheBindings.length; i++) { - if (hs.cacheBindings[i][0] == a) { - var c = hs.cacheBindings[i][1]; - hs.cacheBindings[i][1] = c.cloneNode(1); - return c; - } - } - return null; -}, - -preloadAjax : function (e) { - var arr = hs.getAnchors(); - for (var i = 0; i < arr.htmls.length; i++) { - var a = arr.htmls[i]; - if (hs.getParam(a, 'objectType') == 'ajax' && hs.getParam(a, 'cacheAjax')) - hs.push(hs.preloadTheseAjax, a); - } - - hs.preloadAjaxElement(0); -}, - -preloadAjaxElement : function (i) { - if (!hs.preloadTheseAjax[i]) return; - var a = hs.preloadTheseAjax[i]; - var cache = hs.getNode(hs.getParam(a, 'contentId')); - if (!cache) cache = hs.getSelfRendered(); - var ajax = new hs.Ajax(a, cache, 1); - ajax.onError = function () { }; - ajax.onLoad = function () { - hs.push(hs.cacheBindings, [a, cache]); - hs.preloadAjaxElement(i + 1); - }; - ajax.run(); -}, - -focusTopmost : function() { - var topZ = 0, - topmostKey = -1, - expanders = hs.expanders, - exp, - zIndex; - for (var i = 0; i < expanders.length; i++) { - exp = expanders[i]; - if (exp) { - zIndex = exp.wrapper.style.zIndex; - if (zIndex && zIndex > topZ) { - topZ = zIndex; - topmostKey = i; - } - } - } - if (topmostKey == -1) hs.focusKey = -1; - else expanders[topmostKey].focus(); -}, - -getParam : function (a, param) { - a.getParams = a.onclick; - var p = a.getParams ? a.getParams() : null; - a.getParams = null; - - return (p && typeof p[param] != 'undefined') ? p[param] : - (typeof hs[param] != 'undefined' ? hs[param] : null); -}, - -getSrc : function (a) { - var src = hs.getParam(a, 'src'); - if (src) return src; - return a.href; -}, - -getNode : function (id) { - var node = hs.$(id), clone = hs.clones[id], a = {}; - if (!node && !clone) return null; - if (!clone) { - clone = node.cloneNode(true); - clone.id = ''; - hs.clones[id] = clone; - return node; - } else { - return clone.cloneNode(true); - } -}, - -discardElement : function(d) { - if (d) hs.garbageBin.appendChild(d); - hs.garbageBin.innerHTML = ''; -}, -transit : function (adj, exp) { - var last = exp || hs.getExpander(); - exp = last; - if (hs.upcoming) return false; - else hs.last = last; - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - try { - hs.upcoming = adj; - adj.onclick(); - } catch (e){ - hs.last = hs.upcoming = null; - } - try { - exp.close(); - } catch (e) {} - return false; -}, - -previousOrNext : function (el, op) { - var exp = hs.getExpander(el); - if (exp) return hs.transit(exp.getAdjacentAnchor(op), exp); - else return false; -}, - -previous : function (el) { - return hs.previousOrNext(el, -1); -}, - -next : function (el) { - return hs.previousOrNext(el, 1); -}, - -keyHandler : function(e) { - if (!e) e = window.event; - if (!e.target) e.target = e.srcElement; // ie - if (typeof e.target.form != 'undefined') return true; // form element has focus - var exp = hs.getExpander(); - - var op = null; - switch (e.keyCode) { - case 70: // f - if (exp) exp.doFullExpand(); - return true; - case 32: // Space - case 34: // Page Down - case 39: // Arrow right - case 40: // Arrow down - op = 1; - break; - case 8: // Backspace - case 33: // Page Up - case 37: // Arrow left - case 38: // Arrow up - op = -1; - break; - case 27: // Escape - case 13: // Enter - op = 0; - } - if (op !== null) {hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - if (!hs.enableKeyListener) return true; - - if (e.preventDefault) e.preventDefault(); - else e.returnValue = false; - if (exp) { - if (op == 0) { - exp.close(); - } else { - hs.previousOrNext(exp.key, op); - } - return false; - } - } - return true; -}, - - -registerOverlay : function (overlay) { - hs.push(hs.overlays, hs.extend(overlay, { hsId: 'hsId'+ hs.idCounter++ } )); -}, - - -getWrapperKey : function (element, expOnly) { - var el, re = /^highslide-wrapper-([0-9]+)$/; - // 1. look in open expanders - el = element; - while (el.parentNode) { - if (el.id && re.test(el.id)) return el.id.replace(re, "$1"); - el = el.parentNode; - } - // 2. look in thumbnail - if (!expOnly) { - el = element; - while (el.parentNode) { - if (el.tagName && hs.isHsAnchor(el)) { - for (var key = 0; key < hs.expanders.length; key++) { - var exp = hs.expanders[key]; - if (exp && exp.a == el) return key; - } - } - el = el.parentNode; - } - } - return null; -}, - -getExpander : function (el, expOnly) { - if (typeof el == 'undefined') return hs.expanders[hs.focusKey] || null; - if (typeof el == 'number') return hs.expanders[el] || null; - if (typeof el == 'string') el = hs.$(el); - return hs.expanders[hs.getWrapperKey(el, expOnly)] || null; -}, - -isHsAnchor : function (a) { - return (a.onclick && a.onclick.toString().replace(/\s/g, ' ').match(/hs.(htmlE|e)xpand/)); -}, - -reOrder : function () { - for (var i = 0; i < hs.expanders.length; i++) - if (hs.expanders[i] && hs.expanders[i].isExpanded) hs.focusTopmost(); -}, - -mouseClickHandler : function(e) -{ - if (!e) e = window.event; - if (e.button > 1) return true; - if (!e.target) e.target = e.srcElement; - - var el = e.target; - while (el.parentNode - && !(/highslide-(image|move|html|resize)/.test(el.className))) - { - el = el.parentNode; - } - var exp = hs.getExpander(el); - if (exp && (exp.isClosing || !exp.isExpanded)) return true; - - if (exp && e.type == 'mousedown') { - if (e.target.form) return true; - var match = el.className.match(/highslide-(image|move|resize)/); - if (match) { - hs.dragArgs = { - exp: exp , - type: match[1], - left: exp.x.pos, - width: exp.x.size, - top: exp.y.pos, - height: exp.y.size, - clickX: e.clientX, - clickY: e.clientY - }; - - - hs.addEventListener(document, 'mousemove', hs.dragHandler); - if (e.preventDefault) e.preventDefault(); // FF - - if (/highslide-(image|html)-blur/.test(exp.content.className)) { - exp.focus(); - hs.hasFocused = true; - } - return false; - } - else if (/highslide-html/.test(el.className) && hs.focusKey != exp.key) { - exp.focus(); - exp.doShowHide('hidden'); - } - } else if (e.type == 'mouseup') { - - hs.removeEventListener(document, 'mousemove', hs.dragHandler); - - if (hs.dragArgs) { - if (hs.styleRestoreCursor && hs.dragArgs.type == 'image') - hs.dragArgs.exp.content.style.cursor = hs.styleRestoreCursor; - var hasDragged = hs.dragArgs.hasDragged; - - if (!hasDragged &&!hs.hasFocused && !/(move|resize)/.test(hs.dragArgs.type)) { - exp.close(); - } - else if (hasDragged || (!hasDragged && hs.hasHtmlExpanders)) { - hs.dragArgs.exp.doShowHide('hidden'); - } - - if (hs.dragArgs.exp.releaseMask) - hs.dragArgs.exp.releaseMask.style.display = 'none'; - hs.hasFocused = false; - hs.dragArgs = null; - - } else if (/highslide-image-blur/.test(el.className)) { - el.style.cursor = hs.styleRestoreCursor; - } - } - return false; -}, - -dragHandler : function(e) -{ - if (!hs.dragArgs) return true; - if (!e) e = window.event; - var a = hs.dragArgs, exp = a.exp; - if (exp.iframe) { - if (!exp.releaseMask) exp.releaseMask = hs.createElement('div', null, - { position: 'absolute', width: exp.x.size+'px', height: exp.y.size+'px', - left: exp.x.cb+'px', top: exp.y.cb+'px', zIndex: 4, background: (hs.ieLt9 ? 'white' : 'none'), - opacity: 0.01 }, - exp.wrapper, true); - if (exp.releaseMask.style.display == 'none') - exp.releaseMask.style.display = ''; - } - - a.dX = e.clientX - a.clickX; - a.dY = e.clientY - a.clickY; - - var distance = Math.sqrt(Math.pow(a.dX, 2) + Math.pow(a.dY, 2)); - if (!a.hasDragged) a.hasDragged = (a.type != 'image' && distance > 0) - || (distance > (hs.dragSensitivity || 5)); - - if (a.hasDragged && e.clientX > 5 && e.clientY > 5) { - - if (a.type == 'resize') exp.resize(a); - else { - exp.moveTo(a.left + a.dX, a.top + a.dY); - if (a.type == 'image') exp.content.style.cursor = 'move'; - } - } - return false; -}, - -wrapperMouseHandler : function (e) { - try { - if (!e) e = window.event; - var over = /mouseover/i.test(e.type); - if (!e.target) e.target = e.srcElement; // ie - if (!e.relatedTarget) e.relatedTarget = - over ? e.fromElement : e.toElement; // ie - var exp = hs.getExpander(e.target); - if (!exp.isExpanded) return; - if (!exp || !e.relatedTarget || hs.getExpander(e.relatedTarget, true) == exp - || hs.dragArgs) return; - for (var i = 0; i < exp.overlays.length; i++) (function() { - var o = hs.$('hsId'+ exp.overlays[i]); - if (o && o.hideOnMouseOut) { - if (over) hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: over ? o.opacity : 0 }, o.dur); - } - })(); - } catch (e) {} -}, -addEventListener : function (el, event, func) { - if (el == document && event == 'ready') { - hs.push(hs.onReady, func); - } - try { - el.addEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - el.attachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = func; - } - } -}, - -removeEventListener : function (el, event, func) { - try { - el.removeEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = null; - } - } -}, - -preloadFullImage : function (i) { - if (hs.continuePreloading && hs.preloadTheseImages[i] && hs.preloadTheseImages[i] != 'undefined') { - var img = document.createElement('img'); - img.onload = function() { - img = null; - hs.preloadFullImage(i + 1); - }; - img.src = hs.preloadTheseImages[i]; - } -}, -preloadImages : function (number) { - if (number && typeof number != 'object') hs.numberOfImagesToPreload = number; - - var arr = hs.getAnchors(); - for (var i = 0; i < arr.images.length && i < hs.numberOfImagesToPreload; i++) { - hs.push(hs.preloadTheseImages, hs.getSrc(arr.images[i])); - } - - // preload outlines - if (hs.outlineType) new hs.Outline(hs.outlineType, function () { hs.preloadFullImage(0)} ); - else - - hs.preloadFullImage(0); - - // preload cursor - if (hs.restoreCursor) var cur = hs.createElement('img', { src: hs.graphicsDir + hs.restoreCursor }); -}, - - -init : function () { - if (!hs.container) { - - hs.ieLt7 = hs.ie && hs.uaVersion < 7; - hs.ieLt9 = hs.ie && hs.uaVersion < 9; - - hs.getPageSize(); - hs.ie6SSL = hs.ieLt7 && location.protocol == 'https:'; - for (var x in hs.langDefaults) { - if (typeof hs[x] != 'undefined') hs.lang[x] = hs[x]; - else if (typeof hs.lang[x] == 'undefined' && typeof hs.langDefaults[x] != 'undefined') - hs.lang[x] = hs.langDefaults[x]; - } - - hs.container = hs.createElement('div', { - className: 'highslide-container' - }, { - position: 'absolute', - left: 0, - top: 0, - width: '100%', - zIndex: hs.zIndexCounter, - direction: 'ltr' - }, - document.body, - true - ); - hs.loading = hs.createElement('a', { - className: 'highslide-loading', - title: hs.lang.loadingTitle, - innerHTML: hs.lang.loadingText, - href: 'javascript:;' - }, { - position: 'absolute', - top: '-9999px', - opacity: hs.loadingOpacity, - zIndex: 1 - }, hs.container - ); - hs.garbageBin = hs.createElement('div', null, { display: 'none' }, hs.container); - hs.clearing = hs.createElement('div', null, - { clear: 'both', paddingTop: '1px' }, null, true); - - // http://www.robertpenner.com/easing/ - Math.linearTween = function (t, b, c, d) { - return c*t/d + b; - }; - Math.easeInQuad = function (t, b, c, d) { - return c*(t/=d)*t + b; - }; - - hs.hideSelects = hs.ieLt7; - hs.hideIframes = ((window.opera && hs.uaVersion < 9) || navigator.vendor == 'KDE' - || (hs.ieLt7 && hs.uaVersion < 5.5)); - } -}, -ready : function() { - if (hs.isReady) return; - hs.isReady = true; - for (var i = 0; i < hs.onReady.length; i++) hs.onReady[i](); -}, - -updateAnchors : function() { - var el, els, all = [], images = [], htmls = [],groups = {}, re; - - for (var i = 0; i < hs.openerTagNames.length; i++) { - els = document.getElementsByTagName(hs.openerTagNames[i]); - for (var j = 0; j < els.length; j++) { - el = els[j]; - re = hs.isHsAnchor(el); - if (re) { - hs.push(all, el); - if (re[0] == 'hs.expand') hs.push(images, el); - else if (re[0] == 'hs.htmlExpand') hs.push(htmls, el); - var g = hs.getParam(el, 'slideshowGroup') || 'none'; - if (!groups[g]) groups[g] = []; - hs.push(groups[g], el); - } - } - } - hs.anchors = { all: all, groups: groups, images: images, htmls: htmls }; - return hs.anchors; - -}, - -getAnchors : function() { - return hs.anchors || hs.updateAnchors(); -}, - - -close : function(el) { - var exp = hs.getExpander(el); - if (exp) exp.close(); - return false; -} -}; // end hs object -hs.fx = function( elem, options, prop ){ - this.options = options; - this.elem = elem; - this.prop = prop; - - if (!options.orig) options.orig = {}; -}; -hs.fx.prototype = { - update: function(){ - (hs.fx.step[this.prop] || hs.fx.step._default)(this); - - if (this.options.step) - this.options.step.call(this.elem, this.now, this); - - }, - custom: function(from, to, unit){ - this.startTime = (new Date()).getTime(); - this.start = from; - this.end = to; - this.unit = unit;// || this.unit || "px"; - this.now = this.start; - this.pos = this.state = 0; - - var self = this; - function t(gotoEnd){ - return self.step(gotoEnd); - } - - t.elem = this.elem; - - if ( t() && hs.timers.push(t) == 1 ) { - hs.timerId = setInterval(function(){ - var timers = hs.timers; - - for ( var i = 0; i < timers.length; i++ ) - if ( !timers[i]() ) - timers.splice(i--, 1); - - if ( !timers.length ) { - clearInterval(hs.timerId); - } - }, 13); - } - }, - step: function(gotoEnd){ - var t = (new Date()).getTime(); - if ( gotoEnd || t >= this.options.duration + this.startTime ) { - this.now = this.end; - this.pos = this.state = 1; - this.update(); - - this.options.curAnim[ this.prop ] = true; - - var done = true; - for ( var i in this.options.curAnim ) - if ( this.options.curAnim[i] !== true ) - done = false; - - if ( done ) { - if (this.options.complete) this.options.complete.call(this.elem); - } - return false; - } else { - var n = t - this.startTime; - this.state = n / this.options.duration; - this.pos = this.options.easing(n, 0, 1, this.options.duration); - this.now = this.start + ((this.end - this.start) * this.pos); - this.update(); - } - return true; - } - -}; - -hs.extend( hs.fx, { - step: { - - opacity: function(fx){ - hs.setStyles(fx.elem, { opacity: fx.now }); - }, - - _default: function(fx){ - try { - if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) - fx.elem.style[ fx.prop ] = fx.now + fx.unit; - else - fx.elem[ fx.prop ] = fx.now; - } catch (e) {} - } - } -}); - -hs.Outline = function (outlineType, onLoad) { - this.onLoad = onLoad; - this.outlineType = outlineType; - var v = hs.uaVersion, tr; - - this.hasAlphaImageLoader = hs.ie && hs.uaVersion < 7; - if (!outlineType) { - if (onLoad) onLoad(); - return; - } - - hs.init(); - this.table = hs.createElement( - 'table', { - cellSpacing: 0 - }, { - visibility: 'hidden', - position: 'absolute', - borderCollapse: 'collapse', - width: 0 - }, - hs.container, - true - ); - var tbody = hs.createElement('tbody', null, null, this.table, 1); - - this.td = []; - for (var i = 0; i <= 8; i++) { - if (i % 3 == 0) tr = hs.createElement('tr', null, { height: 'auto' }, tbody, true); - this.td[i] = hs.createElement('td', null, null, tr, true); - var style = i != 4 ? { lineHeight: 0, fontSize: 0} : { position : 'relative' }; - hs.setStyles(this.td[i], style); - } - this.td[4].className = outlineType +' highslide-outline'; - - this.preloadGraphic(); -}; - -hs.Outline.prototype = { -preloadGraphic : function () { - var src = hs.graphicsDir + (hs.outlinesDir || "outlines/")+ this.outlineType +".png"; - - var appendTo = hs.safari && hs.uaVersion < 525 ? hs.container : null; - this.graphic = hs.createElement('img', null, { position: 'absolute', - top: '-9999px' }, appendTo, true); // for onload trigger - - var pThis = this; - this.graphic.onload = function() { pThis.onGraphicLoad(); }; - - this.graphic.src = src; -}, - -onGraphicLoad : function () { - var o = this.offset = this.graphic.width / 4, - pos = [[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]], - dim = { height: (2*o) +'px', width: (2*o) +'px' }; - for (var i = 0; i <= 8; i++) { - if (pos[i]) { - if (this.hasAlphaImageLoader) { - var w = (i == 1 || i == 7) ? '100%' : this.graphic.width +'px'; - var div = hs.createElement('div', null, { width: '100%', height: '100%', position: 'relative', overflow: 'hidden'}, this.td[i], true); - hs.createElement ('div', null, { - filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+ this.graphic.src + "')", - position: 'absolute', - width: w, - height: this.graphic.height +'px', - left: (pos[i][0]*o)+'px', - top: (pos[i][1]*o)+'px' - }, - div, - true); - } else { - hs.setStyles(this.td[i], { background: 'url('+ this.graphic.src +') '+ (pos[i][0]*o)+'px '+(pos[i][1]*o)+'px'}); - } - - if (window.opera && (i == 3 || i ==5)) - hs.createElement('div', null, dim, this.td[i], true); - - hs.setStyles (this.td[i], dim); - } - } - this.graphic = null; - if (hs.pendingOutlines[this.outlineType]) hs.pendingOutlines[this.outlineType].destroy(); - hs.pendingOutlines[this.outlineType] = this; - if (this.onLoad) this.onLoad(); -}, - -setPosition : function (pos, offset, vis, dur, easing) { - var exp = this.exp, - stl = exp.wrapper.style, - offset = offset || 0, - pos = pos || { - x: exp.x.pos + offset, - y: exp.y.pos + offset, - w: exp.x.get('wsize') - 2 * offset, - h: exp.y.get('wsize') - 2 * offset - }; - if (vis) this.table.style.visibility = (pos.h >= 4 * this.offset) - ? 'visible' : 'hidden'; - hs.setStyles(this.table, { - left: (pos.x - this.offset) +'px', - top: (pos.y - this.offset) +'px', - width: (pos.w + 2 * this.offset) +'px' - }); - - pos.w -= 2 * this.offset; - pos.h -= 2 * this.offset; - hs.setStyles (this.td[4], { - width: pos.w >= 0 ? pos.w +'px' : 0, - height: pos.h >= 0 ? pos.h +'px' : 0 - }); - if (this.hasAlphaImageLoader) this.td[3].style.height - = this.td[5].style.height = this.td[4].style.height; - -}, - -destroy : function(hide) { - if (hide) this.table.style.visibility = 'hidden'; - else hs.discardElement(this.table); -} -}; - -hs.Dimension = function(exp, dim) { - this.exp = exp; - this.dim = dim; - this.ucwh = dim == 'x' ? 'Width' : 'Height'; - this.wh = this.ucwh.toLowerCase(); - this.uclt = dim == 'x' ? 'Left' : 'Top'; - this.lt = this.uclt.toLowerCase(); - this.ucrb = dim == 'x' ? 'Right' : 'Bottom'; - this.rb = this.ucrb.toLowerCase(); - this.p1 = this.p2 = 0; -}; -hs.Dimension.prototype = { -get : function(key) { - switch (key) { - case 'loadingPos': - return this.tpos + this.tb + (this.t - hs.loading['offset'+ this.ucwh]) / 2; - case 'wsize': - return this.size + 2 * this.cb + this.p1 + this.p2; - case 'fitsize': - return this.clientSize - this.marginMin - this.marginMax; - case 'maxsize': - return this.get('fitsize') - 2 * this.cb - this.p1 - this.p2 ; - case 'opos': - return this.pos - (this.exp.outline ? this.exp.outline.offset : 0); - case 'osize': - return this.get('wsize') + (this.exp.outline ? 2*this.exp.outline.offset : 0); - case 'imgPad': - return this.imgSize ? Math.round((this.size - this.imgSize) / 2) : 0; - - } -}, -calcBorders: function() { - // correct for borders - this.cb = (this.exp.content['offset'+ this.ucwh] - this.t) / 2; - - this.marginMax = hs['margin'+ this.ucrb]; -}, -calcThumb: function() { - this.t = this.exp.el[this.wh] ? parseInt(this.exp.el[this.wh]) : - this.exp.el['offset'+ this.ucwh]; - this.tpos = this.exp.tpos[this.dim]; - this.tb = (this.exp.el['offset'+ this.ucwh] - this.t) / 2; - if (this.tpos == 0 || this.tpos == -1) { - this.tpos = (hs.page[this.wh] / 2) + hs.page['scroll'+ this.uclt]; - }; -}, -calcExpanded: function() { - var exp = this.exp; - this.justify = 'auto'; - - - // size and position - this.pos = this.tpos - this.cb + this.tb; - - if (this.maxHeight && this.dim == 'x') - exp.maxWidth = Math.min(exp.maxWidth || this.full, exp.maxHeight * this.full / exp.y.full); - - this.size = Math.min(this.full, exp['max'+ this.ucwh] || this.full); - this.minSize = exp.allowSizeReduction ? - Math.min(exp['min'+ this.ucwh], this.full) :this.full; - if (exp.isImage && exp.useBox) { - this.size = exp[this.wh]; - this.imgSize = this.full; - } - if (this.dim == 'x' && hs.padToMinWidth) this.minSize = exp.minWidth; - this.marginMin = hs['margin'+ this.uclt]; - this.scroll = hs.page['scroll'+ this.uclt]; - this.clientSize = hs.page[this.wh]; -}, -setSize: function(i) { - var exp = this.exp; - if (exp.isImage && (exp.useBox || hs.padToMinWidth)) { - this.imgSize = i; - this.size = Math.max(this.size, this.imgSize); - exp.content.style[this.lt] = this.get('imgPad')+'px'; - } else - this.size = i; - - exp.content.style[this.wh] = i +'px'; - exp.wrapper.style[this.wh] = this.get('wsize') +'px'; - if (exp.outline) exp.outline.setPosition(); - if (exp.releaseMask) exp.releaseMask.style[this.wh] = i +'px'; - if (this.dim == 'y' && exp.iDoc && exp.body.style.height != 'auto') try { - exp.iDoc.body.style.overflow = 'auto'; - } catch (e) {} - if (exp.isHtml) { - var d = exp.scrollerDiv; - if (this.sizeDiff === undefined) - this.sizeDiff = exp.innerContent['offset'+ this.ucwh] - d['offset'+ this.ucwh]; - d.style[this.wh] = (this.size - this.sizeDiff) +'px'; - - if (this.dim == 'x') exp.mediumContent.style.width = 'auto'; - if (exp.body) exp.body.style[this.wh] = 'auto'; - } - if (this.dim == 'x' && exp.overlayBox) exp.sizeOverlayBox(true); -}, -setPos: function(i) { - this.pos = i; - this.exp.wrapper.style[this.lt] = i +'px'; - - if (this.exp.outline) this.exp.outline.setPosition(); - -} -}; - -hs.Expander = function(a, params, custom, contentType) { - if (document.readyState && hs.ie && !hs.isReady) { - hs.addEventListener(document, 'ready', function() { - new hs.Expander(a, params, custom, contentType); - }); - return; - } - this.a = a; - this.custom = custom; - this.contentType = contentType || 'image'; - this.isHtml = (contentType == 'html'); - this.isImage = !this.isHtml; - - hs.continuePreloading = false; - this.overlays = []; - hs.init(); - var key = this.key = hs.expanders.length; - // override inline parameters - for (var i = 0; i < hs.overrides.length; i++) { - var name = hs.overrides[i]; - this[name] = params && typeof params[name] != 'undefined' ? - params[name] : hs[name]; - } - if (!this.src) this.src = a.href; - - // get thumb - var el = (params && params.thumbnailId) ? hs.$(params.thumbnailId) : a; - el = this.thumb = el.getElementsByTagName('img')[0] || el; - this.thumbsUserSetId = el.id || a.id; - - // check if already open - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].a == a) { - hs.expanders[i].focus(); - return false; - } - } - - // cancel other - if (!hs.allowSimultaneousLoading) for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].thumb != el && !hs.expanders[i].onLoadStarted) { - hs.expanders[i].cancelLoading(); - } - } - hs.expanders[key] = this; - if (!hs.allowMultipleInstances && !hs.upcoming) { - if (hs.expanders[key-1]) hs.expanders[key-1].close(); - if (typeof hs.focusKey != 'undefined' && hs.expanders[hs.focusKey]) - hs.expanders[hs.focusKey].close(); - } - - // initiate metrics - this.el = el; - this.tpos = this.pageOrigin || hs.getPosition(el); - hs.getPageSize(); - var x = this.x = new hs.Dimension(this, 'x'); - x.calcThumb(); - var y = this.y = new hs.Dimension(this, 'y'); - y.calcThumb(); - this.wrapper = hs.createElement( - 'div', { - id: 'highslide-wrapper-'+ this.key, - className: 'highslide-wrapper '+ this.wrapperClassName - }, { - visibility: 'hidden', - position: 'absolute', - zIndex: hs.zIndexCounter += 2 - }, null, true ); - - this.wrapper.onmouseover = this.wrapper.onmouseout = hs.wrapperMouseHandler; - if (this.contentType == 'image' && this.outlineWhileAnimating == 2) - this.outlineWhileAnimating = 0; - - // get the outline - if (!this.outlineType) { - this[this.contentType +'Create'](); - - } else if (hs.pendingOutlines[this.outlineType]) { - this.connectOutline(); - this[this.contentType +'Create'](); - - } else { - this.showLoading(); - var exp = this; - new hs.Outline(this.outlineType, - function () { - exp.connectOutline(); - exp[exp.contentType +'Create'](); - } - ); - } - return true; -}; - -hs.Expander.prototype = { -error : function(e) { - if (hs.debug) alert ('Line '+ e.lineNumber +': '+ e.message); - else window.location.href = this.src; -}, - -connectOutline : function() { - var outline = this.outline = hs.pendingOutlines[this.outlineType]; - outline.exp = this; - outline.table.style.zIndex = this.wrapper.style.zIndex - 1; - hs.pendingOutlines[this.outlineType] = null; -}, - -showLoading : function() { - if (this.onLoadStarted || this.loading) return; - - this.loading = hs.loading; - var exp = this; - this.loading.onclick = function() { - exp.cancelLoading(); - }; - var exp = this, - l = this.x.get('loadingPos') +'px', - t = this.y.get('loadingPos') +'px'; - setTimeout(function () { - if (exp.loading) hs.setStyles(exp.loading, { left: l, top: t, zIndex: hs.zIndexCounter++ })} - , 100); -}, - -imageCreate : function() { - var exp = this; - - var img = document.createElement('img'); - this.content = img; - img.onload = function () { - if (hs.expanders[exp.key]) exp.contentLoaded(); - }; - if (hs.blockRightClick) img.oncontextmenu = function() { return false; }; - img.className = 'highslide-image'; - hs.setStyles(img, { - visibility: 'hidden', - display: 'block', - position: 'absolute', - maxWidth: '9999px', - zIndex: 3 - }); - img.title = hs.lang.restoreTitle; - if (hs.safari && hs.uaVersion < 525) hs.container.appendChild(img); - if (hs.ie && hs.flushImgSize) img.src = null; - img.src = this.src; - - this.showLoading(); -}, - -htmlCreate : function () { - - this.content = hs.getCacheBinding(this.a); - if (!this.content) - this.content = hs.getNode(this.contentId); - if (!this.content) - this.content = hs.getSelfRendered(); - this.getInline(['maincontent']); - if (this.maincontent) { - var body = hs.getElementByClass(this.content, 'div', 'highslide-body'); - if (body) body.appendChild(this.maincontent); - this.maincontent.style.display = 'block'; - } - - var innerContent = this.innerContent = this.content; - - if (/(swf|iframe)/.test(this.objectType)) this.setObjContainerSize(innerContent); - - // the content tree - hs.container.appendChild(this.wrapper); - hs.setStyles( this.wrapper, { - position: 'static', - padding: '0 '+ hs.marginRight +'px 0 '+ hs.marginLeft +'px' - }); - this.content = hs.createElement( - 'div', { - className: 'highslide-html' - }, { - position: 'relative', - zIndex: 3, - height: 0, - overflow: 'hidden' - }, - this.wrapper - ); - this.mediumContent = hs.createElement('div', null, null, this.content, 1); - this.mediumContent.appendChild(innerContent); - - hs.setStyles (innerContent, { - position: 'relative', - display: 'block', - direction: hs.lang.cssDirection || '' - }); - if (this.width) innerContent.style.width = this.width +'px'; - if (this.height) hs.setStyles(innerContent, { - height: this.height +'px', - overflow: 'hidden' - }); - if (innerContent.offsetWidth < this.minWidth) - innerContent.style.width = this.minWidth +'px'; - - - - if (this.objectType == 'ajax' && !hs.getCacheBinding(this.a)) { - this.showLoading(); - var exp = this; - var ajax = new hs.Ajax(this.a, innerContent); - ajax.src = this.src; - ajax.onLoad = function () { if (hs.expanders[exp.key]) exp.contentLoaded(); }; - ajax.onError = function () { location.href = exp.src; }; - ajax.run(); - } - else - - if (this.objectType == 'iframe' && this.objectLoadTime == 'before') { - this.writeExtendedContent(); - } - else - this.contentLoaded(); -}, - -contentLoaded : function() { - try { - if (!this.content) return; - this.content.onload = null; - if (this.onLoadStarted) return; - else this.onLoadStarted = true; - - var x = this.x, y = this.y; - - if (this.loading) { - hs.setStyles(this.loading, { top: '-9999px' }); - this.loading = null; - } - if (this.isImage) { - x.full = this.content.width; - y.full = this.content.height; - - hs.setStyles(this.content, { - width: x.t +'px', - height: y.t +'px' - }); - this.wrapper.appendChild(this.content); - hs.container.appendChild(this.wrapper); - } else if (this.htmlGetSize) this.htmlGetSize(); - - x.calcBorders(); - y.calcBorders(); - - hs.setStyles (this.wrapper, { - left: (x.tpos + x.tb - x.cb) +'px', - top: (y.tpos + x.tb - y.cb) +'px' - }); - this.getOverlays(); - - var ratio = x.full / y.full; - x.calcExpanded(); - this.justify(x); - - y.calcExpanded(); - this.justify(y); - if (this.isHtml) this.htmlSizeOperations(); - if (this.overlayBox) this.sizeOverlayBox(0, 1); - - - if (this.allowSizeReduction) { - if (this.isImage) - this.correctRatio(ratio); - else this.fitOverlayBox(); - if (this.isImage && this.x.full > (this.x.imgSize || this.x.size)) { - this.createFullExpand(); - if (this.overlays.length == 1) this.sizeOverlayBox(); - } - } - this.show(); - - } catch (e) { - this.error(e); - } -}, - - -setObjContainerSize : function(parent, auto) { - var c = hs.getElementByClass(parent, 'DIV', 'highslide-body'); - if (/(iframe|swf)/.test(this.objectType)) { - if (this.objectWidth) c.style.width = this.objectWidth +'px'; - if (this.objectHeight) c.style.height = this.objectHeight +'px'; - } -}, - -writeExtendedContent : function () { - if (this.hasExtendedContent) return; - var exp = this; - this.body = hs.getElementByClass(this.innerContent, 'DIV', 'highslide-body'); - if (this.objectType == 'iframe') { - this.showLoading(); - var ruler = hs.clearing.cloneNode(1); - this.body.appendChild(ruler); - this.newWidth = this.innerContent.offsetWidth; - if (!this.objectWidth) this.objectWidth = ruler.offsetWidth; - var hDiff = this.innerContent.offsetHeight - this.body.offsetHeight, - h = this.objectHeight || hs.page.height - hDiff - hs.marginTop - hs.marginBottom, - onload = this.objectLoadTime == 'before' ? - ' onload="if (hs.expanders['+ this.key +']) hs.expanders['+ this.key +'].contentLoaded()" ' : ''; - this.body.innerHTML += ''; - this.ruler = this.body.getElementsByTagName('div')[0]; - this.iframe = this.body.getElementsByTagName('iframe')[0]; - - if (this.objectLoadTime == 'after') this.correctIframeSize(); - - } - if (this.objectType == 'swf') { - this.body.id = this.body.id || 'hs-flash-id-' + this.key; - var a = this.swfOptions; - if (!a.params) a.params = {}; - if (typeof a.params.wmode == 'undefined') a.params.wmode = 'transparent'; - if (swfobject) swfobject.embedSWF(this.src, this.body.id, this.objectWidth, this.objectHeight, - a.version || '7', a.expressInstallSwfurl, a.flashvars, a.params, a.attributes); - } - this.hasExtendedContent = true; -}, -htmlGetSize : function() { - if (this.iframe && !this.objectHeight) { // loadtime before - this.iframe.style.height = this.body.style.height = this.getIframePageHeight() +'px'; - } - this.innerContent.appendChild(hs.clearing); - if (!this.x.full) this.x.full = this.innerContent.offsetWidth; - this.y.full = this.innerContent.offsetHeight; - this.innerContent.removeChild(hs.clearing); - if (hs.ie && this.newHeight > parseInt(this.innerContent.currentStyle.height)) { // ie css bug - this.newHeight = parseInt(this.innerContent.currentStyle.height); - } - hs.setStyles( this.wrapper, { position: 'absolute', padding: '0'}); - hs.setStyles( this.content, { width: this.x.t +'px', height: this.y.t +'px'}); - -}, - -getIframePageHeight : function() { - var h; - try { - var doc = this.iDoc = this.iframe.contentDocument || this.iframe.contentWindow.document; - var clearing = doc.createElement('div'); - clearing.style.clear = 'both'; - doc.body.appendChild(clearing); - h = clearing.offsetTop; - if (hs.ie) h += parseInt(doc.body.currentStyle.marginTop) - + parseInt(doc.body.currentStyle.marginBottom) - 1; - } catch (e) { // other domain - h = 300; - } - return h; -}, -correctIframeSize : function () { - var wDiff = this.innerContent.offsetWidth - this.ruler.offsetWidth; - hs.discardElement(this.ruler); - if (wDiff < 0) wDiff = 0; - - var hDiff = this.innerContent.offsetHeight - this.iframe.offsetHeight; - if (this.iDoc && !this.objectHeight && !this.height && this.y.size == this.y.full) try { - this.iDoc.body.style.overflow = 'hidden'; - } catch (e) {} - hs.setStyles(this.iframe, { - width: Math.abs(this.x.size - wDiff) +'px', - height: Math.abs(this.y.size - hDiff) +'px' - }); - hs.setStyles(this.body, { - width: this.iframe.style.width, - height: this.iframe.style.height - }); - - this.scrollingContent = this.iframe; - this.scrollerDiv = this.scrollingContent; - -}, -htmlSizeOperations : function () { - - this.setObjContainerSize(this.innerContent); - - - if (this.objectType == 'swf' && this.objectLoadTime == 'before') this.writeExtendedContent(); - - // handle minimum size - if (this.x.size < this.x.full && !this.allowWidthReduction) this.x.size = this.x.full; - if (this.y.size < this.y.full && !this.allowHeightReduction) this.y.size = this.y.full; - this.scrollerDiv = this.innerContent; - hs.setStyles(this.mediumContent, { - position: 'relative', - width: this.x.size +'px' - }); - hs.setStyles(this.innerContent, { - border: 'none', - width: 'auto', - height: 'auto' - }); - var node = hs.getElementByClass(this.innerContent, 'DIV', 'highslide-body'); - if (node && !/(iframe|swf)/.test(this.objectType)) { - var cNode = node; // wrap to get true size - node = hs.createElement(cNode.nodeName, null, {overflow: 'hidden'}, null, true); - cNode.parentNode.insertBefore(node, cNode); - node.appendChild(hs.clearing); // IE6 - node.appendChild(cNode); - - var wDiff = this.innerContent.offsetWidth - node.offsetWidth; - var hDiff = this.innerContent.offsetHeight - node.offsetHeight; - node.removeChild(hs.clearing); - - var kdeBugCorr = hs.safari || navigator.vendor == 'KDE' ? 1 : 0; // KDE repainting bug - hs.setStyles(node, { - width: (this.x.size - wDiff - kdeBugCorr) +'px', - height: (this.y.size - hDiff) +'px', - overflow: 'auto', - position: 'relative' - } - ); - if (kdeBugCorr && cNode.offsetHeight > node.offsetHeight) { - node.style.width = (parseInt(node.style.width) + kdeBugCorr) + 'px'; - } - this.scrollingContent = node; - this.scrollerDiv = this.scrollingContent; - } - if (this.iframe && this.objectLoadTime == 'before') this.correctIframeSize(); - if (!this.scrollingContent && this.y.size < this.mediumContent.offsetHeight) this.scrollerDiv = this.content; - - if (this.scrollerDiv == this.content && !this.allowWidthReduction && !/(iframe|swf)/.test(this.objectType)) { - this.x.size += 17; // room for scrollbars - } - if (this.scrollerDiv && this.scrollerDiv.offsetHeight > this.scrollerDiv.parentNode.offsetHeight) { - setTimeout("try { hs.expanders["+ this.key +"].scrollerDiv.style.overflow = 'auto'; } catch(e) {}", - hs.expandDuration); - } -}, - -justify : function (p, moveOnly) { - var tgtArr, tgt = p.target, dim = p == this.x ? 'x' : 'y'; - - var hasMovedMin = false; - - var allowReduce = p.exp.allowSizeReduction; - p.pos = Math.round(p.pos - ((p.get('wsize') - p.t) / 2)); - if (p.pos < p.scroll + p.marginMin) { - p.pos = p.scroll + p.marginMin; - hasMovedMin = true; - } - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - if (p.pos + p.get('wsize') > p.scroll + p.clientSize - p.marginMax) { - if (!moveOnly && hasMovedMin && allowReduce) { - p.size = Math.min(p.size, p.get(dim == 'y' ? 'fitsize' : 'maxsize')); - } else if (p.get('wsize') < p.get('fitsize')) { - p.pos = p.scroll + p.clientSize - p.marginMax - p.get('wsize'); - } else { // image larger than viewport - p.pos = p.scroll + p.marginMin; - if (!moveOnly && allowReduce) p.size = p.get(dim == 'y' ? 'fitsize' : 'maxsize'); - } - } - - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - - - - if (p.pos < p.marginMin) { - var tmpMin = p.pos; - p.pos = p.marginMin; - - if (allowReduce && !moveOnly) p.size = p.size - (p.pos - tmpMin); - - } -}, - -correctRatio : function(ratio) { - var x = this.x, - y = this.y, - changed = false, - xSize = Math.min(x.full, x.size), - ySize = Math.min(y.full, y.size), - useBox = (this.useBox || hs.padToMinWidth); - - if (xSize / ySize > ratio) { // width greater - xSize = ySize * ratio; - if (xSize < x.minSize) { // below minWidth - xSize = x.minSize; - ySize = xSize / ratio; - } - changed = true; - - } else if (xSize / ySize < ratio) { // height greater - ySize = xSize / ratio; - changed = true; - } - - if (hs.padToMinWidth && x.full < x.minSize) { - x.imgSize = x.full; - y.size = y.imgSize = y.full; - } else if (this.useBox) { - x.imgSize = xSize; - y.imgSize = ySize; - } else { - x.size = xSize; - y.size = ySize; - } - changed = this.fitOverlayBox(this.useBox ? null : ratio, changed); - if (useBox && y.size < y.imgSize) { - y.imgSize = y.size; - x.imgSize = y.size * ratio; - } - if (changed || useBox) { - x.pos = x.tpos - x.cb + x.tb; - x.minSize = x.size; - this.justify(x, true); - - y.pos = y.tpos - y.cb + y.tb; - y.minSize = y.size; - this.justify(y, true); - if (this.overlayBox) this.sizeOverlayBox(); - } - - -}, -fitOverlayBox : function(ratio, changed) { - var x = this.x, y = this.y; - if (this.overlayBox && (this.isImage || this.allowHeightReduction)) { - while (y.size > this.minHeight && x.size > this.minWidth - && y.get('wsize') > y.get('fitsize')) { - y.size -= 10; - if (ratio) x.size = y.size * ratio; - this.sizeOverlayBox(0, 1); - changed = true; - } - } - return changed; -}, - -show : function () { - var x = this.x, y = this.y; - this.doShowHide('hidden'); - - // Apply size change - this.changeSize( - 1, { - wrapper: { - width : x.get('wsize'), - height : y.get('wsize'), - left: x.pos, - top: y.pos - }, - content: { - left: x.p1 + x.get('imgPad'), - top: y.p1 + y.get('imgPad'), - width:x.imgSize ||x.size, - height:y.imgSize ||y.size - } - }, - hs.expandDuration - ); -}, - -changeSize : function(up, to, dur) { - - if (this.outline && !this.outlineWhileAnimating) { - if (up) this.outline.setPosition(); - else this.outline.destroy( - (this.isHtml && this.preserveContent)); - } - - - if (!up) this.destroyOverlays(); - - var exp = this, - x = exp.x, - y = exp.y, - easing = this.easing; - if (!up) easing = this.easingClose || easing; - var after = up ? - function() { - - if (exp.outline) exp.outline.table.style.visibility = "visible"; - setTimeout(function() { - exp.afterExpand(); - }, 50); - } : - function() { - exp.afterClose(); - }; - if (up) hs.setStyles( this.wrapper, { - width: x.t +'px', - height: y.t +'px' - }); - if (up && this.isHtml) { - hs.setStyles(this.wrapper, { - left: (x.tpos - x.cb + x.tb) +'px', - top: (y.tpos - y.cb + y.tb) +'px' - }); - } - if (this.fadeInOut) { - hs.setStyles(this.wrapper, { opacity: up ? 0 : 1 }); - hs.extend(to.wrapper, { opacity: up }); - } - hs.animate( this.wrapper, to.wrapper, { - duration: dur, - easing: easing, - step: function(val, args) { - if (exp.outline && exp.outlineWhileAnimating && args.prop == 'top') { - var fac = up ? args.pos : 1 - args.pos; - var pos = { - w: x.t + (x.get('wsize') - x.t) * fac, - h: y.t + (y.get('wsize') - y.t) * fac, - x: x.tpos + (x.pos - x.tpos) * fac, - y: y.tpos + (y.pos - y.tpos) * fac - }; - exp.outline.setPosition(pos, 0, 1); - } - if (exp.isHtml) { - if (args.prop == 'left') - exp.mediumContent.style.left = (x.pos - val) +'px'; - if (args.prop == 'top') - exp.mediumContent.style.top = (y.pos - val) +'px'; - } - } - }); - hs.animate( this.content, to.content, dur, easing, after); - if (up) { - this.wrapper.style.visibility = 'visible'; - this.content.style.visibility = 'visible'; - if (this.isHtml) this.innerContent.style.visibility = 'visible'; - this.a.className += ' highslide-active-anchor'; - } -}, - - - - -afterExpand : function() { - this.isExpanded = true; - this.focus(); - - if (this.isHtml && this.objectLoadTime == 'after') this.writeExtendedContent(); - if (this.iframe) { - try { - var exp = this, - doc = this.iframe.contentDocument || this.iframe.contentWindow.document; - hs.addEventListener(doc, 'mousedown', function () { - if (hs.focusKey != exp.key) exp.focus(); - }); - } catch(e) {} - if (hs.ie && typeof this.isClosing != 'boolean') // first open - this.iframe.style.width = (this.objectWidth - 1) +'px'; // hasLayout - } - if (hs.upcoming && hs.upcoming == this.a) hs.upcoming = null; - this.prepareNextOutline(); - var p = hs.page, mX = hs.mouse.x + p.scrollLeft, mY = hs.mouse.y + p.scrollTop; - this.mouseIsOver = this.x.pos < mX && mX < this.x.pos + this.x.get('wsize') - && this.y.pos < mY && mY < this.y.pos + this.y.get('wsize'); - if (this.overlayBox) this.showOverlays(); - -}, - - -prepareNextOutline : function() { - var key = this.key; - var outlineType = this.outlineType; - new hs.Outline(outlineType, - function () { try { hs.expanders[key].preloadNext(); } catch (e) {} }); -}, - - -preloadNext : function() { - var next = this.getAdjacentAnchor(1); - if (next && next.onclick.toString().match(/hs\.expand/)) - var img = hs.createElement('img', { src: hs.getSrc(next) }); -}, - - -getAdjacentAnchor : function(op) { - var current = this.getAnchorIndex(), as = hs.anchors.groups[this.slideshowGroup || 'none']; - return (as && as[current + op]) || null; -}, - -getAnchorIndex : function() { - var arr = hs.getAnchors().groups[this.slideshowGroup || 'none']; - if (arr) for (var i = 0; i < arr.length; i++) { - if (arr[i] == this.a) return i; - } - return null; -}, - - -cancelLoading : function() { - hs.discardElement (this.wrapper); - hs.expanders[this.key] = null; - if (this.loading) hs.loading.style.left = '-9999px'; -}, - -writeCredits : function () { - this.credits = hs.createElement('a', { - href: hs.creditsHref, - target: hs.creditsTarget, - className: 'highslide-credits', - innerHTML: hs.lang.creditsText, - title: hs.lang.creditsTitle - }); - this.createOverlay({ - overlayId: this.credits, - position: this.creditsPosition || 'top left' - }); -}, - -getInline : function(types, addOverlay) { - for (var i = 0; i < types.length; i++) { - var type = types[i], s = null; - if (!this[type +'Id'] && this.thumbsUserSetId) - this[type +'Id'] = type +'-for-'+ this.thumbsUserSetId; - if (this[type +'Id']) this[type] = hs.getNode(this[type +'Id']); - if (!this[type] && !this[type +'Text'] && this[type +'Eval']) try { - s = eval(this[type +'Eval']); - } catch (e) {} - if (!this[type] && this[type +'Text']) { - s = this[type +'Text']; - } - if (!this[type] && !s) { - this[type] = hs.getNode(this.a['_'+ type + 'Id']); - if (!this[type]) { - var next = this.a.nextSibling; - while (next && !hs.isHsAnchor(next)) { - if ((new RegExp('highslide-'+ type)).test(next.className || null)) { - if (!next.id) this.a['_'+ type + 'Id'] = next.id = 'hsId'+ hs.idCounter++; - this[type] = hs.getNode(next.id); - break; - } - next = next.nextSibling; - } - } - } - - if (!this[type] && s) this[type] = hs.createElement('div', - { className: 'highslide-'+ type, innerHTML: s } ); - - if (addOverlay && this[type]) { - var o = { position: (type == 'heading') ? 'above' : 'below' }; - for (var x in this[type+'Overlay']) o[x] = this[type+'Overlay'][x]; - o.overlayId = this[type]; - this.createOverlay(o); - } - } -}, - - -// on end move and resize -doShowHide : function(visibility) { - if (hs.hideSelects) this.showHideElements('SELECT', visibility); - if (hs.hideIframes) this.showHideElements('IFRAME', visibility); - if (hs.geckoMac) this.showHideElements('*', visibility); -}, -showHideElements : function (tagName, visibility) { - var els = document.getElementsByTagName(tagName); - var prop = tagName == '*' ? 'overflow' : 'visibility'; - for (var i = 0; i < els.length; i++) { - if (prop == 'visibility' || (document.defaultView.getComputedStyle( - els[i], "").getPropertyValue('overflow') == 'auto' - || els[i].getAttribute('hidden-by') != null)) { - var hiddenBy = els[i].getAttribute('hidden-by'); - if (visibility == 'visible' && hiddenBy) { - hiddenBy = hiddenBy.replace('['+ this.key +']', ''); - els[i].setAttribute('hidden-by', hiddenBy); - if (!hiddenBy) els[i].style[prop] = els[i].origProp; - } else if (visibility == 'hidden') { // hide if behind - var elPos = hs.getPosition(els[i]); - elPos.w = els[i].offsetWidth; - elPos.h = els[i].offsetHeight; - - - var clearsX = (elPos.x + elPos.w < this.x.get('opos') - || elPos.x > this.x.get('opos') + this.x.get('osize')); - var clearsY = (elPos.y + elPos.h < this.y.get('opos') - || elPos.y > this.y.get('opos') + this.y.get('osize')); - var wrapperKey = hs.getWrapperKey(els[i]); - if (!clearsX && !clearsY && wrapperKey != this.key) { // element falls behind image - if (!hiddenBy) { - els[i].setAttribute('hidden-by', '['+ this.key +']'); - els[i].origProp = els[i].style[prop]; - els[i].style[prop] = 'hidden'; - - } else if (hiddenBy.indexOf('['+ this.key +']') == -1) { - els[i].setAttribute('hidden-by', hiddenBy + '['+ this.key +']'); - } - } else if ((hiddenBy == '['+ this.key +']' || hs.focusKey == wrapperKey) - && wrapperKey != this.key) { // on move - els[i].setAttribute('hidden-by', ''); - els[i].style[prop] = els[i].origProp || ''; - } else if (hiddenBy && hiddenBy.indexOf('['+ this.key +']') > -1) { - els[i].setAttribute('hidden-by', hiddenBy.replace('['+ this.key +']', '')); - } - - } - } - } -}, - -focus : function() { - this.wrapper.style.zIndex = hs.zIndexCounter += 2; - // blur others - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && i == hs.focusKey) { - var blurExp = hs.expanders[i]; - blurExp.content.className += ' highslide-'+ blurExp.contentType +'-blur'; - if (blurExp.isImage) { - blurExp.content.style.cursor = hs.ieLt7 ? 'hand' : 'pointer'; - blurExp.content.title = hs.lang.focusTitle; - } - } - } - - // focus this - if (this.outline) this.outline.table.style.zIndex - = this.wrapper.style.zIndex - 1; - this.content.className = 'highslide-'+ this.contentType; - if (this.isImage) { - this.content.title = hs.lang.restoreTitle; - - if (hs.restoreCursor) { - hs.styleRestoreCursor = window.opera ? 'pointer' : 'url('+ hs.graphicsDir + hs.restoreCursor +'), pointer'; - if (hs.ieLt7 && hs.uaVersion < 6) hs.styleRestoreCursor = 'hand'; - this.content.style.cursor = hs.styleRestoreCursor; - } - } - hs.focusKey = this.key; - hs.addEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); -}, -moveTo: function(x, y) { - this.x.setPos(x); - this.y.setPos(y); -}, -resize : function (e) { - var w, h, r = e.width / e.height; - w = Math.max(e.width + e.dX, Math.min(this.minWidth, this.x.full)); - if (this.isImage && Math.abs(w - this.x.full) < 12) w = this.x.full; - h = this.isHtml ? e.height + e.dY : w / r; - if (h < Math.min(this.minHeight, this.y.full)) { - h = Math.min(this.minHeight, this.y.full); - if (this.isImage) w = h * r; - } - this.resizeTo(w, h); -}, -resizeTo: function(w, h) { - this.y.setSize(h); - this.x.setSize(w); - this.wrapper.style.height = this.y.get('wsize') +'px'; -}, - -close : function() { - if (this.isClosing || !this.isExpanded) return; - this.isClosing = true; - - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - - try { - if (this.isHtml) this.htmlPrepareClose(); - this.content.style.cursor = 'default'; - this.changeSize( - 0, { - wrapper: { - width : this.x.t, - height : this.y.t, - left: this.x.tpos - this.x.cb + this.x.tb, - top: this.y.tpos - this.y.cb + this.y.tb - }, - content: { - left: 0, - top: 0, - width: this.x.t, - height: this.y.t - } - }, hs.restoreDuration - ); - } catch (e) { this.afterClose(); } -}, - -htmlPrepareClose : function() { - if (hs.geckoMac) { // bad redraws - if (!hs.mask) hs.mask = hs.createElement('div', null, - { position: 'absolute' }, hs.container); - hs.setStyles(hs.mask, { width: this.x.size +'px', height: this.y.size +'px', - left: this.x.pos +'px', top: this.y.pos +'px', display: 'block' }); - } - if (this.objectType == 'swf') try { hs.$(this.body.id).StopPlay(); } catch (e) {} - - if (this.objectLoadTime == 'after' && !this.preserveContent) this.destroyObject(); - if (this.scrollerDiv && this.scrollerDiv != this.scrollingContent) - this.scrollerDiv.style.overflow = 'hidden'; -}, - -destroyObject : function () { - if (hs.ie && this.iframe) - try { this.iframe.contentWindow.document.body.innerHTML = ''; } catch (e) {} - if (this.objectType == 'swf') swfobject.removeSWF(this.body.id); - this.body.innerHTML = ''; -}, - -sleep : function() { - if (this.outline) this.outline.table.style.display = 'none'; - this.releaseMask = null; - this.wrapper.style.display = 'none'; - this.isExpanded = false; - hs.push(hs.sleeping, this); -}, - -awake : function() {try { - - hs.expanders[this.key] = this; - - if (!hs.allowMultipleInstances &&hs.focusKey != this.key) { - try { hs.expanders[hs.focusKey].close(); } catch (e){} - } - - var z = hs.zIndexCounter++, stl = { display: '', zIndex: z }; - hs.setStyles (this.wrapper, stl); - this.isClosing = false; - - var o = this.outline || 0; - if (o) { - if (!this.outlineWhileAnimating) stl.visibility = 'hidden'; - hs.setStyles (o.table, stl); - } - - this.show(); -} catch (e) {} - - -}, - -createOverlay : function (o) { - var el = o.overlayId; - if (typeof el == 'string') el = hs.getNode(el); - if (o.html) el = hs.createElement('div', { innerHTML: o.html }); - if (!el || typeof el == 'string') return; - el.style.display = 'block'; - this.genOverlayBox(); - var width = o.width && /^[0-9]+(px|%)$/.test(o.width) ? o.width : 'auto'; - if (/^(left|right)panel$/.test(o.position) && !/^[0-9]+px$/.test(o.width)) width = '200px'; - var overlay = hs.createElement( - 'div', { - id: 'hsId'+ hs.idCounter++, - hsId: o.hsId - }, { - position: 'absolute', - visibility: 'hidden', - width: width, - direction: hs.lang.cssDirection || '', - opacity: 0 - },this.overlayBox, - true - ); - - overlay.appendChild(el); - hs.extend(overlay, { - opacity: 1, - offsetX: 0, - offsetY: 0, - dur: (o.fade === 0 || o.fade === false || (o.fade == 2 && hs.ie)) ? 0 : 250 - }); - hs.extend(overlay, o); - - - if (this.gotOverlays) { - this.positionOverlay(overlay); - if (!overlay.hideOnMouseOut || this.mouseIsOver) - hs.animate(overlay, { opacity: overlay.opacity }, overlay.dur); - } - hs.push(this.overlays, hs.idCounter - 1); -}, -positionOverlay : function(overlay) { - var p = overlay.position || 'middle center', - offX = overlay.offsetX, - offY = overlay.offsetY; - if (overlay.parentNode != this.overlayBox) this.overlayBox.appendChild(overlay); - if (/left$/.test(p)) overlay.style.left = offX +'px'; - - if (/center$/.test(p)) hs.setStyles (overlay, { - left: '50%', - marginLeft: (offX - Math.round(overlay.offsetWidth / 2)) +'px' - }); - - if (/right$/.test(p)) overlay.style.right = - offX +'px'; - - if (/^leftpanel$/.test(p)) { - hs.setStyles(overlay, { - right: '100%', - marginRight: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p1 = overlay.offsetWidth; - - } else if (/^rightpanel$/.test(p)) { - hs.setStyles(overlay, { - left: '100%', - marginLeft: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p2 = overlay.offsetWidth; - } - - if (/^top/.test(p)) overlay.style.top = offY +'px'; - if (/^middle/.test(p)) hs.setStyles (overlay, { - top: '50%', - marginTop: (offY - Math.round(overlay.offsetHeight / 2)) +'px' - }); - if (/^bottom/.test(p)) overlay.style.bottom = - offY +'px'; - if (/^above$/.test(p)) { - hs.setStyles(overlay, { - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - bottom: '100%', - marginBottom: this.y.cb +'px', - width: 'auto' - }); - this.y.p1 = overlay.offsetHeight; - - } else if (/^below$/.test(p)) { - hs.setStyles(overlay, { - position: 'relative', - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - top: '100%', - marginTop: this.y.cb +'px', - width: 'auto' - }); - this.y.p2 = overlay.offsetHeight; - overlay.style.position = 'absolute'; - } -}, - -getOverlays : function() { - this.getInline(['heading', 'caption'], true); - if (this.heading && this.dragByHeading) this.heading.className += ' highslide-move'; - if (hs.showCredits) this.writeCredits(); - for (var i = 0; i < hs.overlays.length; i++) { - var o = hs.overlays[i], tId = o.thumbnailId, sg = o.slideshowGroup; - if ((!tId && !sg) || (tId && tId == this.thumbsUserSetId) - || (sg && sg === this.slideshowGroup)) { - if (this.isImage || (this.isHtml && o.useOnHtml)) - this.createOverlay(o); - } - } - var os = []; - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - if (/panel$/.test(o.position)) this.positionOverlay(o); - else hs.push(os, o); - } - for (var i = 0; i < os.length; i++) this.positionOverlay(os[i]); - this.gotOverlays = true; -}, -genOverlayBox : function() { - if (!this.overlayBox) this.overlayBox = hs.createElement ( - 'div', { - className: this.wrapperClassName - }, { - position : 'absolute', - width: (this.x.size || (this.useBox ? this.width : null) - || this.x.full) +'px', - height: (this.y.size || this.y.full) +'px', - visibility : 'hidden', - overflow : 'hidden', - zIndex : hs.ie ? 4 : 'auto' - }, - hs.container, - true - ); -}, -sizeOverlayBox : function(doWrapper, doPanels) { - var overlayBox = this.overlayBox, - x = this.x, - y = this.y; - hs.setStyles( overlayBox, { - width: x.size +'px', - height: y.size +'px' - }); - if (doWrapper || doPanels) { - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - var ie6 = (hs.ieLt7 || document.compatMode == 'BackCompat'); - if (o && /^(above|below)$/.test(o.position)) { - if (ie6) { - o.style.width = (overlayBox.offsetWidth + 2 * x.cb - + x.p1 + x.p2) +'px'; - } - y[o.position == 'above' ? 'p1' : 'p2'] = o.offsetHeight; - } - if (o && ie6 && /^(left|right)panel$/.test(o.position)) { - o.style.height = (overlayBox.offsetHeight + 2* y.cb) +'px'; - } - } - } - if (doWrapper) { - hs.setStyles(this.content, { - top: y.p1 +'px' - }); - hs.setStyles(overlayBox, { - top: (y.p1 + y.cb) +'px' - }); - } -}, - -showOverlays : function() { - var b = this.overlayBox; - b.className = ''; - hs.setStyles(b, { - top: (this.y.p1 + this.y.cb) +'px', - left: (this.x.p1 + this.x.cb) +'px', - overflow : 'visible' - }); - if (hs.safari) b.style.visibility = 'visible'; - this.wrapper.appendChild (b); - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - o.style.zIndex = o.zIndex || 4; - if (!o.hideOnMouseOut || this.mouseIsOver) { - o.style.visibility = 'visible'; - hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: o.opacity }, o.dur); - } - } -}, - -destroyOverlays : function() { - if (!this.overlays.length) return; - if (this.isHtml && this.preserveContent) { - this.overlayBox.style.top = '-9999px'; - hs.container.appendChild(this.overlayBox); - } else - hs.discardElement(this.overlayBox); -}, - - - -createFullExpand : function () { - this.fullExpandLabel = hs.createElement( - 'a', { - href: 'javascript:hs.expanders['+ this.key +'].doFullExpand();', - title: hs.lang.fullExpandTitle, - className: 'highslide-full-expand' - } - ); - - this.createOverlay({ - overlayId: this.fullExpandLabel, - position: hs.fullExpandPosition, - hideOnMouseOut: true, - opacity: hs.fullExpandOpacity - }); -}, - -doFullExpand : function () { - try { - if (this.fullExpandLabel) hs.discardElement(this.fullExpandLabel); - - this.focus(); - var xSize = this.x.size, - ySize = this.y.size; - this.resizeTo(this.x.full, this.y.full); - - var xpos = this.x.pos - (this.x.size - xSize) / 2; - if (xpos < hs.marginLeft) xpos = hs.marginLeft; - - var ypos = this.y.pos - (this.y.size - ySize) / 2; - if (ypos < hs.marginTop) ypos = hs.marginTop; - - this.moveTo(xpos, ypos); - this.doShowHide('hidden'); - - } catch (e) { - this.error(e); - } -}, - - -afterClose : function () { - this.a.className = this.a.className.replace('highslide-active-anchor', ''); - - this.doShowHide('visible'); - - if (this.isHtml && this.preserveContent) { - this.sleep(); - } else { - if (this.outline && this.outlineWhileAnimating) this.outline.destroy(); - - hs.discardElement(this.wrapper); - } - if (hs.mask) hs.mask.style.display = 'none'; - - hs.expanders[this.key] = null; - hs.reOrder(); -} - -}; - - -// hs.Ajax object prototype -hs.Ajax = function (a, content, pre) { - this.a = a; - this.content = content; - this.pre = pre; -}; - -hs.Ajax.prototype = { -run : function () { - var xhr; - if (!this.src) this.src = hs.getSrc(this.a); - if (this.src.match('#')) { - var arr = this.src.split('#'); - this.src = arr[0]; - this.id = arr[1]; - } - if (hs.cachedGets[this.src]) { - this.cachedGet = hs.cachedGets[this.src]; - if (this.id) this.getElementContent(); - else this.loadHTML(); - return; - } - try { xhr = new XMLHttpRequest(); } - catch (e) { - try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } - catch (e) { - try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } - catch (e) { this.onError(); } - } - } - var pThis = this; - xhr.onreadystatechange = function() { - if(pThis.xhr.readyState == 4) { - if (pThis.id) pThis.getElementContent(); - else pThis.loadHTML(); - } - }; - var src = this.src; - this.xhr = xhr; - if (hs.forceAjaxReload) - src = src.replace(/$/, (/\?/.test(src) ? '&' : '?') +'dummy='+ (new Date()).getTime()); - xhr.open('GET', src, true); - xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); - xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - xhr.send(null); -}, - -getElementContent : function() { - hs.init(); - var attribs = window.opera || hs.ie6SSL ? { src: 'about:blank' } : null; - - this.iframe = hs.createElement('iframe', attribs, - { position: 'absolute', top: '-9999px' }, hs.container); - - this.loadHTML(); -}, - -loadHTML : function() { - var s = this.cachedGet || this.xhr.responseText, - regBody; - if (this.pre) hs.cachedGets[this.src] = s; - if (!hs.ie || hs.uaVersion >= 5.5) { - s = s.replace(new RegExp(']*>', 'gi'), '') - .replace(new RegExp(']*>.*?', 'gi'), ''); - if (this.iframe) { - var doc = this.iframe.contentDocument; - if (!doc && this.iframe.contentWindow) doc = this.iframe.contentWindow.document; - if (!doc) { // Opera - var pThis = this; - setTimeout(function() { pThis.loadHTML(); }, 25); - return; - } - doc.open(); - doc.write(s); - doc.close(); - try { s = doc.getElementById(this.id).innerHTML; } catch (e) { - try { s = this.iframe.document.getElementById(this.id).innerHTML; } catch (e) {} // opera - } - hs.discardElement(this.iframe); - } else { - regBody = /(]*>|<\/body>)/ig; - if (regBody.test(s)) s = s.split(regBody)[hs.ieLt9 ? 1 : 2]; - - } - } - hs.getElementByClass(this.content, 'DIV', 'highslide-body').innerHTML = s; - this.onLoad(); - for (var x in this) this[x] = null; -} -}; -hs.langDefaults = hs.lang; -// history -var HsExpander = hs.Expander; -if (hs.ie && window == window.top) { - (function () { - try { - document.documentElement.doScroll('left'); - } catch (e) { - setTimeout(arguments.callee, 50); - return; - } - hs.ready(); - })(); -} -hs.addEventListener(document, 'DOMContentLoaded', hs.ready); -hs.addEventListener(window, 'load', hs.ready); - -// set handlers -hs.addEventListener(document, 'ready', function() { - if (hs.expandCursor) { - var style = hs.createElement('style', { type: 'text/css' }, null, - document.getElementsByTagName('HEAD')[0]), - backCompat = document.compatMode == 'BackCompat'; - - - function addRule(sel, dec) { - if (hs.ie && (hs.uaVersion < 9 || backCompat)) { - var last = document.styleSheets[document.styleSheets.length - 1]; - if (typeof(last.addRule) == "object") last.addRule(sel, dec); - } else { - style.appendChild(document.createTextNode(sel + " {" + dec + "}")); - } - } - function fix(prop) { - return 'expression( ( ( ignoreMe = document.documentElement.'+ prop + - ' ? document.documentElement.'+ prop +' : document.body.'+ prop +' ) ) + \'px\' );'; - } - if (hs.expandCursor) addRule ('.highslide img', - 'cursor: url('+ hs.graphicsDir + hs.expandCursor +'), pointer !important;'); - } -}); -hs.addEventListener(window, 'resize', function() { - hs.getPageSize(); -}); -hs.addEventListener(document, 'mousemove', function(e) { - hs.mouse = { x: e.clientX, y: e.clientY }; -}); -hs.addEventListener(document, 'mousedown', hs.mouseClickHandler); -hs.addEventListener(document, 'mouseup', hs.mouseClickHandler); - -hs.addEventListener(document, 'ready', hs.getAnchors); -hs.addEventListener(window, 'load', hs.preloadImages); -hs.addEventListener(window, 'load', hs.preloadAjax); -} diff --git a/Website/static/highslide/highslide/highslide-with-html.min.js b/Website/static/highslide/highslide/highslide-with-html.min.js deleted file mode 100644 index 7b4a3b8..0000000 --- a/Website/static/highslide/highslide/highslide-with-html.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Name: Highslide JS - * Version: 4.1.13 (2011-10-06) - * Config: default +inline +ajax +iframe +flash - * Author: Torstein Hønsi - * Support: www.highslide.com/support - * License: www.highslide.com/#license - */ -if(!hs){var hs={lang:{cssDirection:"ltr",loadingText:"Loading...",loadingTitle:"Click to cancel",focusTitle:"Click to bring to front",fullExpandTitle:"Expand to actual size (f)",creditsText:"Powered by Highslide JS",creditsTitle:"Go to the Highslide JS homepage",previousText:"Previous",nextText:"Next",moveText:"Move",closeText:"Close",closeTitle:"Close (esc)",resizeTitle:"Resize",playText:"Play",playTitle:"Play slideshow (spacebar)",pauseText:"Pause",pauseTitle:"Pause slideshow (spacebar)",previousTitle:"Previous (arrow left)",nextTitle:"Next (arrow right)",moveTitle:"Move",fullExpandText:"1:1",restoreTitle:"Click to close image, click and drag to move. Use arrow keys for next and previous."},graphicsDir:"highslide/graphics/",expandCursor:"zoomin.cur",restoreCursor:"zoomout.cur",expandDuration:250,restoreDuration:250,marginLeft:15,marginRight:15,marginTop:15,marginBottom:15,zIndexCounter:1001,loadingOpacity:0.75,allowMultipleInstances:true,numberOfImagesToPreload:5,outlineWhileAnimating:2,outlineStartOffset:3,padToMinWidth:false,fullExpandPosition:"bottom right",fullExpandOpacity:1,showCredits:true,creditsHref:"http://highslide.com/",creditsTarget:"_self",enableKeyListener:true,openerTagNames:["a"],allowWidthReduction:false,allowHeightReduction:true,preserveContent:true,objectLoadTime:"before",cacheAjax:true,dragByHeading:true,minWidth:200,minHeight:200,allowSizeReduction:true,outlineType:"drop-shadow",skin:{contentWrapper:'
    '},preloadTheseImages:[],continuePreloading:true,expanders:[],overrides:["allowSizeReduction","useBox","outlineType","outlineWhileAnimating","captionId","captionText","captionEval","captionOverlay","headingId","headingText","headingEval","headingOverlay","creditsPosition","dragByHeading","width","height","contentId","allowWidthReduction","allowHeightReduction","preserveContent","maincontentId","maincontentText","maincontentEval","objectType","cacheAjax","objectWidth","objectHeight","objectLoadTime","swfOptions","wrapperClassName","minWidth","minHeight","maxWidth","maxHeight","pageOrigin","slideshowGroup","easing","easingClose","fadeInOut","src"],overlays:[],idCounter:0,oPos:{x:["leftpanel","left","center","right","rightpanel"],y:["above","top","middle","bottom","below"]},mouse:{},headingOverlay:{},captionOverlay:{},swfOptions:{flashvars:{},params:{},attributes:{}},timers:[],pendingOutlines:{},sleeping:[],preloadTheseAjax:[],cacheBindings:[],cachedGets:{},clones:{},onReady:[],uaVersion:/Trident\/4\.0/.test(navigator.userAgent)?8:parseFloat((navigator.userAgent.toLowerCase().match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1]),ie:(document.all&&!window.opera),safari:/Safari/.test(navigator.userAgent),geckoMac:/Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent),$:function(a){if(a){return document.getElementById(a)}},push:function(a,b){a[a.length]=b},createElement:function(a,f,e,d,c){var b=document.createElement(a);if(f){hs.extend(b,f)}if(c){hs.setStyles(b,{padding:0,border:"none",margin:0})}if(e){hs.setStyles(b,e)}if(d){d.appendChild(b)}return b},extend:function(b,c){for(var a in c){b[a]=c[a]}return b},setStyles:function(b,c){for(var a in c){if(hs.ieLt9&&a=="opacity"){if(c[a]>0.99){b.style.removeAttribute("filter")}else{b.style.filter="alpha(opacity="+(c[a]*100)+")"}}else{b.style[a]=c[a]}}},animate:function(f,a,d){var c,g,j;if(typeof d!="object"||d===null){var i=arguments;d={duration:i[2],easing:i[3],complete:i[4]}}if(typeof d.duration!="number"){d.duration=250}d.easing=Math[d.easing]||Math.easeInQuad;d.curAnim=hs.extend({},a);for(var b in a){var h=new hs.fx(f,d,b);c=parseFloat(hs.css(f,b))||0;g=parseFloat(a[b]);j=b!="opacity"?"px":"";h.custom(c,g,j)}},css:function(a,c){if(a.style[c]){return a.style[c]}else{if(document.defaultView){return document.defaultView.getComputedStyle(a,null).getPropertyValue(c)}else{if(c=="opacity"){c="filter"}var b=a.currentStyle[c.replace(/\-(\w)/g,function(e,d){return d.toUpperCase()})];if(c=="filter"){b=b.replace(/alpha\(opacity=([0-9]+)\)/,function(e,d){return d/100})}return b===""?1:b}}},getPageSize:function(){var f=document,b=window,e=f.compatMode&&f.compatMode!="BackCompat"?f.documentElement:f.body,g=hs.ie&&(hs.uaVersion<9||typeof pageXOffset=="undefined");var c=g?e.clientWidth:(f.documentElement.clientWidth||self.innerWidth),a=g?e.clientHeight:self.innerHeight;hs.page={width:c,height:a,scrollLeft:g?e.scrollLeft:pageXOffset,scrollTop:g?e.scrollTop:pageYOffset};return hs.page},getPosition:function(a){var b={x:a.offsetLeft,y:a.offsetTop};while(a.offsetParent){a=a.offsetParent;b.x+=a.offsetLeft;b.y+=a.offsetTop;if(a!=document.body&&a!=document.documentElement){b.x-=a.scrollLeft;b.y-=a.scrollTop}}return b},expand:function(b,h,f,d){if(!b){b=hs.createElement("a",null,{display:"none"},hs.container)}if(typeof b.getParams=="function"){return h}if(d=="html"){for(var c=0;cc){c=f;b=d}}}if(b==-1){hs.focusKey=-1}else{a[b].focus()}},getParam:function(b,d){b.getParams=b.onclick;var c=b.getParams?b.getParams():null;b.getParams=null;return(c&&typeof c[d]!="undefined")?c[d]:(typeof hs[d]!="undefined"?hs[d]:null)},getSrc:function(b){var c=hs.getParam(b,"src");if(c){return c}return b.href},getNode:function(e){var c=hs.$(e),d=hs.clones[e],b={};if(!c&&!d){return null}if(!d){d=c.cloneNode(true);d.id="";hs.clones[e]=d;return c}else{return d.cloneNode(true)}},discardElement:function(a){if(a){hs.garbageBin.appendChild(a)}hs.garbageBin.innerHTML=""},transit:function(a,d){var b=d||hs.getExpander();d=b;if(hs.upcoming){return false}else{hs.last=b}hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler);try{hs.upcoming=a;a.onclick()}catch(c){hs.last=hs.upcoming=null}try{d.close()}catch(c){}return false},previousOrNext:function(a,c){var b=hs.getExpander(a);if(b){return hs.transit(b.getAdjacentAnchor(c),b)}else{return false}},previous:function(a){return hs.previousOrNext(a,-1)},next:function(a){return hs.previousOrNext(a,1)},keyHandler:function(a){if(!a){a=window.event}if(!a.target){a.target=a.srcElement}if(typeof a.target.form!="undefined"){return true}var b=hs.getExpander();var c=null;switch(a.keyCode){case 70:if(b){b.doFullExpand()}return true;case 32:case 34:case 39:case 40:c=1;break;case 8:case 33:case 37:case 38:c=-1;break;case 27:case 13:c=0}if(c!==null){hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler);if(!hs.enableKeyListener){return true}if(a.preventDefault){a.preventDefault()}else{a.returnValue=false}if(b){if(c==0){b.close()}else{hs.previousOrNext(b.key,c)}return false}}return true},registerOverlay:function(a){hs.push(hs.overlays,hs.extend(a,{hsId:"hsId"+hs.idCounter++}))},getWrapperKey:function(c,b){var e,d=/^highslide-wrapper-([0-9]+)$/;e=c;while(e.parentNode){if(e.id&&d.test(e.id)){return e.id.replace(d,"$1")}e=e.parentNode}if(!b){e=c;while(e.parentNode){if(e.tagName&&hs.isHsAnchor(e)){for(var a=0;a1){return true}if(!d.target){d.target=d.srcElement}var b=d.target;while(b.parentNode&&!(/highslide-(image|move|html|resize)/.test(b.className))){b=b.parentNode}var f=hs.getExpander(b);if(f&&(f.isClosing||!f.isExpanded)){return true}if(f&&d.type=="mousedown"){if(d.target.form){return true}var a=b.className.match(/highslide-(image|move|resize)/);if(a){hs.dragArgs={exp:f,type:a[1],left:f.x.pos,width:f.x.size,top:f.y.pos,height:f.y.size,clickX:d.clientX,clickY:d.clientY};hs.addEventListener(document,"mousemove",hs.dragHandler);if(d.preventDefault){d.preventDefault()}if(/highslide-(image|html)-blur/.test(f.content.className)){f.focus();hs.hasFocused=true}return false}else{if(/highslide-html/.test(b.className)&&hs.focusKey!=f.key){f.focus();f.doShowHide("hidden")}}}else{if(d.type=="mouseup"){hs.removeEventListener(document,"mousemove",hs.dragHandler);if(hs.dragArgs){if(hs.styleRestoreCursor&&hs.dragArgs.type=="image"){hs.dragArgs.exp.content.style.cursor=hs.styleRestoreCursor}var c=hs.dragArgs.hasDragged;if(!c&&!hs.hasFocused&&!/(move|resize)/.test(hs.dragArgs.type)){f.close()}else{if(c||(!c&&hs.hasHtmlExpanders)){hs.dragArgs.exp.doShowHide("hidden")}}if(hs.dragArgs.exp.releaseMask){hs.dragArgs.exp.releaseMask.style.display="none"}hs.hasFocused=false;hs.dragArgs=null}else{if(/highslide-image-blur/.test(b.className)){b.style.cursor=hs.styleRestoreCursor}}}}return false},dragHandler:function(c){if(!hs.dragArgs){return true}if(!c){c=window.event}var b=hs.dragArgs,d=b.exp;if(d.iframe){if(!d.releaseMask){d.releaseMask=hs.createElement("div",null,{position:"absolute",width:d.x.size+"px",height:d.y.size+"px",left:d.x.cb+"px",top:d.y.cb+"px",zIndex:4,background:(hs.ieLt9?"white":"none"),opacity:0.01},d.wrapper,true)}if(d.releaseMask.style.display=="none"){d.releaseMask.style.display=""}}b.dX=c.clientX-b.clickX;b.dY=c.clientY-b.clickY;var f=Math.sqrt(Math.pow(b.dX,2)+Math.pow(b.dY,2));if(!b.hasDragged){b.hasDragged=(b.type!="image"&&f>0)||(f>(hs.dragSensitivity||5))}if(b.hasDragged&&c.clientX>5&&c.clientY>5){if(b.type=="resize"){d.resize(b)}else{d.moveTo(b.left+b.dX,b.top+b.dY);if(b.type=="image"){d.content.style.cursor="move"}}}return false},wrapperMouseHandler:function(c){try{if(!c){c=window.event}var b=/mouseover/i.test(c.type);if(!c.target){c.target=c.srcElement}if(!c.relatedTarget){c.relatedTarget=b?c.fromElement:c.toElement}var d=hs.getExpander(c.target);if(!d.isExpanded){return}if(!d||!c.relatedTarget||hs.getExpander(c.relatedTarget,true)==d||hs.dragArgs){return}for(var a=0;a=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var a=true;for(var b in this.options.curAnim){if(this.options.curAnim[b]!==true){a=false}}if(a){if(this.options.complete){this.options.complete.call(this.elem)}}return false}else{var e=c-this.startTime;this.state=e/this.options.duration;this.pos=this.options.easing(e,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};hs.extend(hs.fx,{step:{opacity:function(a){hs.setStyles(a.elem,{opacity:a.now})},_default:function(a){try{if(a.elem.style&&a.elem.style[a.prop]!=null){a.elem.style[a.prop]=a.now+a.unit}else{a.elem[a.prop]=a.now}}catch(b){}}}});hs.Outline=function(g,e){this.onLoad=e;this.outlineType=g;var a=hs.uaVersion,f;this.hasAlphaImageLoader=hs.ie&&hs.uaVersion<7;if(!g){if(e){e()}return}hs.init();this.table=hs.createElement("table",{cellSpacing:0},{visibility:"hidden",position:"absolute",borderCollapse:"collapse",width:0},hs.container,true);var b=hs.createElement("tbody",null,null,this.table,1);this.td=[];for(var c=0;c<=8;c++){if(c%3==0){f=hs.createElement("tr",null,{height:"auto"},b,true)}this.td[c]=hs.createElement("td",null,null,f,true);var d=c!=4?{lineHeight:0,fontSize:0}:{position:"relative"};hs.setStyles(this.td[c],d)}this.td[4].className=g+" highslide-outline";this.preloadGraphic()};hs.Outline.prototype={preloadGraphic:function(){var b=hs.graphicsDir+(hs.outlinesDir||"outlines/")+this.outlineType+".png";var a=hs.safari&&hs.uaVersion<525?hs.container:null;this.graphic=hs.createElement("img",null,{position:"absolute",top:"-9999px"},a,true);var c=this;this.graphic.onload=function(){c.onGraphicLoad()};this.graphic.src=b},onGraphicLoad:function(){var d=this.offset=this.graphic.width/4,f=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],c={height:(2*d)+"px",width:(2*d)+"px"};for(var b=0;b<=8;b++){if(f[b]){if(this.hasAlphaImageLoader){var a=(b==1||b==7)?"100%":this.graphic.width+"px";var e=hs.createElement("div",null,{width:"100%",height:"100%",position:"relative",overflow:"hidden"},this.td[b],true);hs.createElement("div",null,{filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+this.graphic.src+"')",position:"absolute",width:a,height:this.graphic.height+"px",left:(f[b][0]*d)+"px",top:(f[b][1]*d)+"px"},e,true)}else{hs.setStyles(this.td[b],{background:"url("+this.graphic.src+") "+(f[b][0]*d)+"px "+(f[b][1]*d)+"px"})}if(window.opera&&(b==3||b==5)){hs.createElement("div",null,c,this.td[b],true)}hs.setStyles(this.td[b],c)}}this.graphic=null;if(hs.pendingOutlines[this.outlineType]){hs.pendingOutlines[this.outlineType].destroy()}hs.pendingOutlines[this.outlineType]=this;if(this.onLoad){this.onLoad()}},setPosition:function(g,e,c,b,f){var d=this.exp,a=d.wrapper.style,e=e||0,g=g||{x:d.x.pos+e,y:d.y.pos+e,w:d.x.get("wsize")-2*e,h:d.y.get("wsize")-2*e};if(c){this.table.style.visibility=(g.h>=4*this.offset)?"visible":"hidden"}hs.setStyles(this.table,{left:(g.x-this.offset)+"px",top:(g.y-this.offset)+"px",width:(g.w+2*this.offset)+"px"});g.w-=2*this.offset;g.h-=2*this.offset;hs.setStyles(this.td[4],{width:g.w>=0?g.w+"px":0,height:g.h>=0?g.h+"px":0});if(this.hasAlphaImageLoader){this.td[3].style.height=this.td[5].style.height=this.td[4].style.height}},destroy:function(a){if(a){this.table.style.visibility="hidden"}else{hs.discardElement(this.table)}}};hs.Dimension=function(b,a){this.exp=b;this.dim=a;this.ucwh=a=="x"?"Width":"Height";this.wh=this.ucwh.toLowerCase();this.uclt=a=="x"?"Left":"Top";this.lt=this.uclt.toLowerCase();this.ucrb=a=="x"?"Right":"Bottom";this.rb=this.ucrb.toLowerCase();this.p1=this.p2=0};hs.Dimension.prototype={get:function(a){switch(a){case"loadingPos":return this.tpos+this.tb+(this.t-hs.loading["offset"+this.ucwh])/2;case"wsize":return this.size+2*this.cb+this.p1+this.p2;case"fitsize":return this.clientSize-this.marginMin-this.marginMax;case"maxsize":return this.get("fitsize")-2*this.cb-this.p1-this.p2;case"opos":return this.pos-(this.exp.outline?this.exp.outline.offset:0);case"osize":return this.get("wsize")+(this.exp.outline?2*this.exp.outline.offset:0);case"imgPad":return this.imgSize?Math.round((this.size-this.imgSize)/2):0}},calcBorders:function(){this.cb=(this.exp.content["offset"+this.ucwh]-this.t)/2;this.marginMax=hs["margin"+this.ucrb]},calcThumb:function(){this.t=this.exp.el[this.wh]?parseInt(this.exp.el[this.wh]):this.exp.el["offset"+this.ucwh];this.tpos=this.exp.tpos[this.dim];this.tb=(this.exp.el["offset"+this.ucwh]-this.t)/2;if(this.tpos==0||this.tpos==-1){this.tpos=(hs.page[this.wh]/2)+hs.page["scroll"+this.uclt]}},calcExpanded:function(){var a=this.exp;this.justify="auto";this.pos=this.tpos-this.cb+this.tb;if(this.maxHeight&&this.dim=="x"){a.maxWidth=Math.min(a.maxWidth||this.full,a.maxHeight*this.full/a.y.full)}this.size=Math.min(this.full,a["max"+this.ucwh]||this.full);this.minSize=a.allowSizeReduction?Math.min(a["min"+this.ucwh],this.full):this.full;if(a.isImage&&a.useBox){this.size=a[this.wh];this.imgSize=this.full}if(this.dim=="x"&&hs.padToMinWidth){this.minSize=a.minWidth}this.marginMin=hs["margin"+this.uclt];this.scroll=hs.page["scroll"+this.uclt];this.clientSize=hs.page[this.wh]},setSize:function(a){var f=this.exp;if(f.isImage&&(f.useBox||hs.padToMinWidth)){this.imgSize=a;this.size=Math.max(this.size,this.imgSize);f.content.style[this.lt]=this.get("imgPad")+"px"}else{this.size=a}f.content.style[this.wh]=a+"px";f.wrapper.style[this.wh]=this.get("wsize")+"px";if(f.outline){f.outline.setPosition()}if(f.releaseMask){f.releaseMask.style[this.wh]=a+"px"}if(this.dim=="y"&&f.iDoc&&f.body.style.height!="auto"){try{f.iDoc.body.style.overflow="auto"}catch(b){}}if(f.isHtml){var c=f.scrollerDiv;if(this.sizeDiff===undefined){this.sizeDiff=f.innerContent["offset"+this.ucwh]-c["offset"+this.ucwh]}c.style[this.wh]=(this.size-this.sizeDiff)+"px";if(this.dim=="x"){f.mediumContent.style.width="auto"}if(f.body){f.body.style[this.wh]="auto"}}if(this.dim=="x"&&f.overlayBox){f.sizeOverlayBox(true)}},setPos:function(a){this.pos=a;this.exp.wrapper.style[this.lt]=a+"px";if(this.exp.outline){this.exp.outline.setPosition()}}};hs.Expander=function(k,f,b,l){if(document.readyState&&hs.ie&&!hs.isReady){hs.addEventListener(document,"ready",function(){new hs.Expander(k,f,b,l)});return}this.a=k;this.custom=b;this.contentType=l||"image";this.isHtml=(l=="html");this.isImage=!this.isHtml;hs.continuePreloading=false;this.overlays=[];hs.init();var m=this.key=hs.expanders.length;for(var g=0;g(this.x.imgSize||this.x.size)){this.createFullExpand();if(this.overlays.length==1){this.sizeOverlayBox()}}}this.show()}catch(c){this.error(c)}},setObjContainerSize:function(a,d){var b=hs.getElementByClass(a,"DIV","highslide-body");if(/(iframe|swf)/.test(this.objectType)){if(this.objectWidth){b.style.width=this.objectWidth+"px"}if(this.objectHeight){b.style.height=this.objectHeight+"px"}}},writeExtendedContent:function(){if(this.hasExtendedContent){return}var f=this;this.body=hs.getElementByClass(this.innerContent,"DIV","highslide-body");if(this.objectType=="iframe"){this.showLoading();var g=hs.clearing.cloneNode(1);this.body.appendChild(g);this.newWidth=this.innerContent.offsetWidth;if(!this.objectWidth){this.objectWidth=g.offsetWidth}var c=this.innerContent.offsetHeight-this.body.offsetHeight,d=this.objectHeight||hs.page.height-c-hs.marginTop-hs.marginBottom,e=this.objectLoadTime=="before"?' onload="if (hs.expanders['+this.key+"]) hs.expanders["+this.key+'].contentLoaded()" ':"";this.body.innerHTML+='';this.ruler=this.body.getElementsByTagName("div")[0];this.iframe=this.body.getElementsByTagName("iframe")[0];if(this.objectLoadTime=="after"){this.correctIframeSize()}}if(this.objectType=="swf"){this.body.id=this.body.id||"hs-flash-id-"+this.key;var b=this.swfOptions;if(!b.params){b.params={}}if(typeof b.params.wmode=="undefined"){b.params.wmode="transparent"}if(swfobject){swfobject.embedSWF(this.src,this.body.id,this.objectWidth,this.objectHeight,b.version||"7",b.expressInstallSwfurl,b.flashvars,b.params,b.attributes)}}this.hasExtendedContent=true},htmlGetSize:function(){if(this.iframe&&!this.objectHeight){this.iframe.style.height=this.body.style.height=this.getIframePageHeight()+"px"}this.innerContent.appendChild(hs.clearing);if(!this.x.full){this.x.full=this.innerContent.offsetWidth}this.y.full=this.innerContent.offsetHeight;this.innerContent.removeChild(hs.clearing);if(hs.ie&&this.newHeight>parseInt(this.innerContent.currentStyle.height)){this.newHeight=parseInt(this.innerContent.currentStyle.height)}hs.setStyles(this.wrapper,{position:"absolute",padding:"0"});hs.setStyles(this.content,{width:this.x.t+"px",height:this.y.t+"px"})},getIframePageHeight:function(){var a;try{var d=this.iDoc=this.iframe.contentDocument||this.iframe.contentWindow.document;var b=d.createElement("div");b.style.clear="both";d.body.appendChild(b);a=b.offsetTop;if(hs.ie){a+=parseInt(d.body.currentStyle.marginTop)+parseInt(d.body.currentStyle.marginBottom)-1}}catch(c){a=300}return a},correctIframeSize:function(){var b=this.innerContent.offsetWidth-this.ruler.offsetWidth;hs.discardElement(this.ruler);if(b<0){b=0}var a=this.innerContent.offsetHeight-this.iframe.offsetHeight;if(this.iDoc&&!this.objectHeight&&!this.height&&this.y.size==this.y.full){try{this.iDoc.body.style.overflow="hidden"}catch(c){}}hs.setStyles(this.iframe,{width:Math.abs(this.x.size-b)+"px",height:Math.abs(this.y.size-a)+"px"});hs.setStyles(this.body,{width:this.iframe.style.width,height:this.iframe.style.height});this.scrollingContent=this.iframe;this.scrollerDiv=this.scrollingContent},htmlSizeOperations:function(){this.setObjContainerSize(this.innerContent);if(this.objectType=="swf"&&this.objectLoadTime=="before"){this.writeExtendedContent()}if(this.x.sizee.offsetHeight){e.style.width=(parseInt(e.style.width)+d)+"px"}this.scrollingContent=e;this.scrollerDiv=this.scrollingContent}if(this.iframe&&this.objectLoadTime=="before"){this.correctIframeSize()}if(!this.scrollingContent&&this.y.sizethis.scrollerDiv.parentNode.offsetHeight){setTimeout("try { hs.expanders["+this.key+"].scrollerDiv.style.overflow = 'auto'; } catch(e) {}",hs.expandDuration)}},justify:function(f,b){var g,h=f.target,e=f==this.x?"x":"y";var d=false;var a=f.exp.allowSizeReduction;f.pos=Math.round(f.pos-((f.get("wsize")-f.t)/2));if(f.posf.scroll+f.clientSize-f.marginMax){if(!b&&d&&a){f.size=Math.min(f.size,f.get(e=="y"?"fitsize":"maxsize"))}else{if(f.get("wsize")c){d=b*c;if(dthis.minHeight&&a.size>this.minWidth&&d.get("wsize")>d.get("fitsize")){d.size-=10;if(b){a.size=d.size*b}this.sizeOverlayBox(0,1);c=true}}return c},show:function(){var a=this.x,b=this.y;this.doShowHide("hidden");this.changeSize(1,{wrapper:{width:a.get("wsize"),height:b.get("wsize"),left:a.pos,top:b.pos},content:{left:a.p1+a.get("imgPad"),top:b.p1+b.get("imgPad"),width:a.imgSize||a.size,height:b.imgSize||b.size}},hs.expandDuration)},changeSize:function(b,h,c){if(this.outline&&!this.outlineWhileAnimating){if(b){this.outline.setPosition()}else{this.outline.destroy((this.isHtml&&this.preserveContent))}}if(!b){this.destroyOverlays()}var e=this,a=e.x,g=e.y,f=this.easing;if(!b){f=this.easingClose||f}var d=b?function(){if(e.outline){e.outline.table.style.visibility="visible"}setTimeout(function(){e.afterExpand()},50)}:function(){e.afterClose()};if(b){hs.setStyles(this.wrapper,{width:a.t+"px",height:g.t+"px"})}if(b&&this.isHtml){hs.setStyles(this.wrapper,{left:(a.tpos-a.cb+a.tb)+"px",top:(g.tpos-g.cb+g.tb)+"px"})}if(this.fadeInOut){hs.setStyles(this.wrapper,{opacity:b?0:1});hs.extend(h.wrapper,{opacity:b})}hs.animate(this.wrapper,h.wrapper,{duration:c,easing:f,step:function(k,i){if(e.outline&&e.outlineWhileAnimating&&i.prop=="top"){var j=b?i.pos:1-i.pos;var l={w:a.t+(a.get("wsize")-a.t)*j,h:g.t+(g.get("wsize")-g.t)*j,x:a.tpos+(a.pos-a.tpos)*j,y:g.tpos+(g.pos-g.tpos)*j};e.outline.setPosition(l,0,1)}if(e.isHtml){if(i.prop=="left"){e.mediumContent.style.left=(a.pos-k)+"px"}if(i.prop=="top"){e.mediumContent.style.top=(g.pos-k)+"px"}}}});hs.animate(this.content,h.content,c,f,d);if(b){this.wrapper.style.visibility="visible";this.content.style.visibility="visible";if(this.isHtml){this.innerContent.style.visibility="visible"}this.a.className+=" highslide-active-anchor"}},afterExpand:function(){this.isExpanded=true;this.focus();if(this.isHtml&&this.objectLoadTime=="after"){this.writeExtendedContent()}if(this.iframe){try{var g=this,f=this.iframe.contentDocument||this.iframe.contentWindow.document;hs.addEventListener(f,"mousedown",function(){if(hs.focusKey!=g.key){g.focus()}})}catch(d){}if(hs.ie&&typeof this.isClosing!="boolean"){this.iframe.style.width=(this.objectWidth-1)+"px"}}if(hs.upcoming&&hs.upcoming==this.a){hs.upcoming=null}this.prepareNextOutline();var c=hs.page,b=hs.mouse.x+c.scrollLeft,a=hs.mouse.y+c.scrollTop;this.mouseIsOver=this.x.posthis.x.get("opos")+this.x.get("osize"));var g=(k.y+k.hthis.y.get("opos")+this.y.get("osize"));var d=hs.getWrapperKey(e[f]);if(!j&&!g&&d!=this.key){if(!h){e[f].setAttribute("hidden-by","["+this.key+"]");e[f].origProp=e[f].style[a];e[f].style[a]="hidden"}else{if(h.indexOf("["+this.key+"]")==-1){e[f].setAttribute("hidden-by",h+"["+this.key+"]")}}}else{if((h=="["+this.key+"]"||hs.focusKey==d)&&d!=this.key){e[f].setAttribute("hidden-by","");e[f].style[a]=e[f].origProp||""}else{if(h&&h.indexOf("["+this.key+"]")>-1){e[f].setAttribute("hidden-by",h.replace("["+this.key+"]",""))}}}}}}}},focus:function(){this.wrapper.style.zIndex=hs.zIndexCounter+=2;for(var a=0;a=5.5){c=c.replace(new RegExp("]*>","gi"),"").replace(new RegExp("]*>.*?<\/script>","gi"),"");if(this.iframe){var f=this.iframe.contentDocument;if(!f&&this.iframe.contentWindow){f=this.iframe.contentWindow.document}if(!f){var g=this;setTimeout(function(){g.loadHTML()},25);return}f.open();f.write(c);f.close();try{c=f.getElementById(this.id).innerHTML}catch(d){try{c=this.iframe.document.getElementById(this.id).innerHTML}catch(d){}}hs.discardElement(this.iframe)}else{b=/(]*>|<\/body>)/ig;if(b.test(c)){c=c.split(b)[hs.ieLt9?1:2]}}}hs.getElementByClass(this.content,"DIV","highslide-body").innerHTML=c;this.onLoad();for(var a in this){this[a]=null}}};hs.langDefaults=hs.lang;var HsExpander=hs.Expander;if(hs.ie&&window==window.top){(function(){try{document.documentElement.doScroll("left")}catch(a){setTimeout(arguments.callee,50);return}hs.ready()})()}hs.addEventListener(document,"DOMContentLoaded",hs.ready);hs.addEventListener(window,"load",hs.ready);hs.addEventListener(document,"ready",function(){if(hs.expandCursor){var d=hs.createElement("style",{type:"text/css"},null,document.getElementsByTagName("HEAD")[0]),c=document.compatMode=="BackCompat";function b(f,g){if(hs.ie&&(hs.uaVersion<9||c)){var e=document.styleSheets[document.styleSheets.length-1];if(typeof(e.addRule)=="object"){e.addRule(f,g)}}else{d.appendChild(document.createTextNode(f+" {"+g+"}"))}}function a(e){return"expression( ( ( ignoreMe = document.documentElement."+e+" ? document.documentElement."+e+" : document.body."+e+" ) ) + 'px' );"}if(hs.expandCursor){b(".highslide img","cursor: url("+hs.graphicsDir+hs.expandCursor+"), pointer !important;")}}});hs.addEventListener(window,"resize",function(){hs.getPageSize()});hs.addEventListener(document,"mousemove",function(a){hs.mouse={x:a.clientX,y:a.clientY}});hs.addEventListener(document,"mousedown",hs.mouseClickHandler);hs.addEventListener(document,"mouseup",hs.mouseClickHandler);hs.addEventListener(document,"ready",hs.getAnchors);hs.addEventListener(window,"load",hs.preloadImages);hs.addEventListener(window,"load",hs.preloadAjax)}; \ No newline at end of file diff --git a/Website/static/highslide/highslide/highslide-with-html.packed.js b/Website/static/highslide/highslide/highslide-with-html.packed.js deleted file mode 100644 index 401c8e4..0000000 --- a/Website/static/highslide/highslide/highslide-with-html.packed.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Name: Highslide JS - * Version: 4.1.13 (2011-10-06) - * Config: default +inline +ajax +iframe +flash +packed - * Author: Torstein Hønsi - * Support: www.highslide.com/support - * License: www.highslide.com/#license - */ -eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q(!m){u m={1e:{89:\'8H\',8K:\'co...\',8G:\'6Q 2h cA\',9s:\'6Q 2h cB 2h c1\',9Y:\'bX 2h bT G (f)\',ag:\'c7 by 8g 8f\',9F:\'d3 2h d6 8g 8f dg\',91:\'8n\',8W:\'8e\',8R:\'9g\',8V:\'8j\',8U:\'8j (di)\',93:\'dj\',dd:\'8h\',d2:\'8h 8m (8l)\',cM:\'8k\',bR:\'8k 8m (8l)\',90:\'8n (6L 1f)\',8X:\'8e (6L 2G)\',8S:\'9g\',b8:\'1:1\',7h:\'6Q 2h 28 2D, aR 8Y aL 2h 3I. aH 6L aT W 1M 8Y 5n.\'},56:\'U/aN/\',5v:\'bG.6E\',4E:\'bB.6E\',7c:6j,a7:6j,4j:15,6m:15,3N:15,6f:15,4l:bt,8N:0.75,7m:J,71:5,3g:2,aZ:3,4M:1h,9Z:\'3E 2G\',9U:1,a1:J,9y:\'b2://U.b4/\',9E:\'aO\',8C:J,7B:[\'a\'],5D:1h,5A:J,48:J,31:\'4K\',82:J,7b:J,3O:8Z,4s:8Z,4I:J,1x:\'aS-aP\',8A:{8B:\'<1i 3n="U-aU"><92>\'+\'<3u 3n="U-5n">\'+\'\'+\'<2p>{m.1e.91}\'+\'\'+\'<3u 3n="U-1M">\'+\'\'+\'<2p>{m.1e.8W}\'+\'\'+\'<3u 3n="U-3I">\'+\'\'+\'<2p>{m.1e.8R}\'+\'\'+\'<3u 3n="U-28">\'+\'\'+\'<2p>{m.1e.8V}\'+\'\'+\'\'+\'<1i 3n="U-V">\'+\'<1i 3n="U-b0"><1i>\'+\'<2p 3n="U-3q" 2u="{m.1e.93}"><2p>\'+\'\'},4P:[],6n:J,P:[],6s:[\'4I\',\'2K\',\'1x\',\'3g\',\'b5\',\'bc\',\'aG\',\'9e\',\'aM\',\'b3\',\'bQ\',\'9c\',\'9K\',\'7b\',\'K\',\'M\',\'7f\',\'5D\',\'5A\',\'48\',\'bD\',\'bC\',\'bH\',\'2f\',\'82\',\'3i\',\'3J\',\'31\',\'7I\',\'78\',\'3O\',\'4s\',\'5X\',\'6N\',\'8d\',\'4h\',\'2g\',\'an\',\'am\',\'T\'],1Q:[],4y:0,bI:{x:[\'ad\',\'1f\',\'6H\',\'2G\',\'ac\'],y:[\'4U\',\'18\',\'6q\',\'3E\',\'6a\']},5R:{},9c:{},9e:{},7I:{al:{},1E:{},ay:{}},3t:[],3G:{},3C:[],5b:[],4o:[],5J:{},7k:{},6h:[],26:/bM\\/4\\.0/.16(46.5V)?8:6t((46.5V.5x().2Z(/.+(?:9f|bJ|bK|1L)[\\/: ]([\\d.]+)/)||[0,\'0\'])[1]),1L:(N.4F&&!1y.30),4X:/bL/.16(46.5V),7V:/bx.+9f:1\\.[0-8].+bi/.16(46.5V),$:B(1j){q(1j)D N.6F(1j)},20:B(1P,2R){1P[1P.1c]=2R},14:B(9b,3h,3l,4r,95){u C=N.14(9b);q(3h)m.3e(C,3h);q(95)m.Q(C,{6z:0,ap:\'24\',6V:0});q(3l)m.Q(C,3l);q(4r)4r.1G(C);D C},3e:B(C,3h){W(u x 3A 3h)C[x]=3h[x];D C},Q:B(C,3l){W(u x 3A 3l){q(m.2Y&&x==\'1B\'){q(3l[x]>0.99)C.F.bp(\'4C\');L C.F.4C=\'97(1B=\'+(3l[x]*2A)+\')\'}L C.F[x]=3l[x]}},41:B(C,1a,2P){u 3S,3Y,3P;q(1t 2P!=\'6W\'||2P===I){u 2S=aE;2P={3w:2S[2],2g:2S[3],83:2S[4]}}q(1t 2P.3w!=\'42\')2P.3w=6j;2P.2g=1r[2P.2g]||1r.8M;2P.5d=m.3e({},1a);W(u 2z 3A 1a){u e=1w m.1C(C,2P,2z);3S=6t(m.79(C,2z))||0;3Y=6t(1a[2z]);3P=2z!=\'1B\'?\'E\':\'\';e.2O(3S,3Y,3P)}},79:B(C,1a){q(C.F[1a]){D C.F[1a]}L q(N.87){D N.87.9k(C,I).9i(1a)}L{q(1a==\'1B\')1a=\'4C\';u 2R=C.4u[1a.2i(/\\-(\\w)/g,B(a,b){D b.bo()})];q(1a==\'4C\')2R=2R.2i(/97\\(1B=([0-9]+)\\)/,B(a,b){D b/2A});D 2R===\'\'?1:2R}},5y:B(){u d=N,w=1y,58=d.5G&&d.5G!=\'6M\'?d.44:d.V,2Y=m.1L&&(m.26<9||1t 8y==\'1X\');u K=2Y?58.8Q:(d.44.8Q||5o.bv),M=2Y?58.bu:5o.bm;m.3k={K:K,M:M,5T:2Y?58.5T:8y,5U:2Y?58.5U:bf};D m.3k},85:B(C){u p={x:C.8x,y:C.6G};3T(C.8p){C=C.8p;p.x+=C.8x;p.y+=C.6G;q(C!=N.V&&C!=N.44){p.x-=C.5T;p.y-=C.5U}}D p},53:B(a,1E,2O,R){q(!a)a=m.14(\'a\',I,{1O:\'24\'},m.1S);q(1t a.4V==\'B\')D 1E;q(R==\'2Q\'){W(u i=0;i7n){7n=1u;5g=i}}}q(5g==-1)m.2q=-1;L P[5g].3d()},3U:B(a,4R){a.4V=a.2M;u p=a.4V?a.4V():I;a.4V=I;D(p&&1t p[4R]!=\'1X\')?p[4R]:(1t m[4R]!=\'1X\'?m[4R]:I)},5m:B(a){u T=m.3U(a,\'T\');q(T)D T;D a.2v},3z:B(1j){u 1D=m.$(1j),3M=m.7k[1j],a={};q(!1D&&!3M)D I;q(!3M){3M=1D.61(J);3M.1j=\'\';m.7k[1j]=3M;D 1D}L{D 3M.61(J)}},3j:B(d){q(d)m.7g.1G(d);m.7g.2n=\'\'},8t:B(7F,A){u 3r=A||m.3v();A=3r;q(m.3B)D 1h;L m.3r=3r;m.4g(N,1y.30?\'5i\':\'5h\',m.4D);1m{m.3B=7F;7F.2M()}1l(e){m.3r=m.3B=I}1m{A.28()}1l(e){}D 1h},5k:B(C,2w){u A=m.3v(C);q(A)D m.8t(A.6B(2w),A);L D 1h},5n:B(C){D m.5k(C,-1)},1M:B(C){D m.5k(C,1)},4D:B(e){q(!e)e=1y.1Y;q(!e.2j)e.2j=e.6p;q(1t e.2j.7O!=\'1X\')D J;u A=m.3v();u 2w=I;8T(e.aI){1J 70:q(A)A.7i();D J;1J 32:1J 34:1J 39:1J 40:2w=1;7N;1J 8:1J 33:1J 37:1J 38:2w=-1;7N;1J 27:1J 13:2w=0}q(2w!==I){m.4g(N,1y.30?\'5i\':\'5h\',m.4D);q(!m.8C)D J;q(e.65)e.65();L e.aY=1h;q(A){q(2w==0){A.28()}L{m.5k(A.S,2w)}D 1h}}D J},b1:B(19){m.20(m.1Q,m.3e(19,{2F:\'2F\'+m.4y++}))},7S:B(7C,5M){u C,2t=/^U-Y-([0-9]+)$/;C=7C;3T(C.3a){q(C.1j&&2t.16(C.1j))D C.1j.2i(2t,"$1");C=C.3a}q(!5M){C=7C;3T(C.3a){q(C.4c&&m.5W(C)){W(u S=0;S1)D J;q(!e.2j)e.2j=e.6p;u C=e.2j;3T(C.3a&&!(/U-(2D|3I|2Q|3q)/.16(C.1p))){C=C.3a}u A=m.3v(C);q(A&&(A.4z||!A.4e))D J;q(A&&e.R==\'7H\'){q(e.2j.7O)D J;u 2Z=C.1p.2Z(/U-(2D|3I|3q)/);q(2Z){m.2a={A:A,R:2Z[1],1f:A.x.H,K:A.x.G,18:A.y.H,M:A.y.G,8J:e.5Q,8F:e.5f};m.1R(N,\'6o\',m.8a);q(e.65)e.65();q(/U-(2D|2Q)-7s/.16(A.O.1p)){A.3d();m.7p=J}D 1h}L q(/U-2Q/.16(C.1p)&&m.2q!=A.S){A.3d();A.4a(\'1n\')}}L q(e.R==\'9t\'){m.4g(N,\'6o\',m.8a);q(m.2a){q(m.4i&&m.2a.R==\'2D\')m.2a.A.O.F.3L=m.4i;u 3f=m.2a.3f;q(!3f&&!m.7p&&!/(3I|3q)/.16(m.2a.R)){A.28()}L q(3f||(!3f&&m.8O)){m.2a.A.4a(\'1n\')}q(m.2a.A.2W)m.2a.A.2W.F.1O=\'24\';m.7p=1h;m.2a=I}L q(/U-2D-7s/.16(C.1p)){C.F.3L=m.4i}}D 1h},8a:B(e){q(!m.2a)D J;q(!e)e=1y.1Y;u a=m.2a,A=a.A;q(A.11){q(!A.2W)A.2W=m.14(\'1i\',I,{1d:\'22\',K:A.x.G+\'E\',M:A.y.G+\'E\',1f:A.x.cb+\'E\',18:A.y.cb+\'E\',1u:4,94:(m.2Y?\'bh\':\'24\'),1B:0.cD},A.Y,J);q(A.2W.F.1O==\'24\')A.2W.F.1O=\'\'}a.5q=e.5Q-a.8J;a.5r=e.5f-a.8F;u 6A=1r.cU(1r.8E(a.5q,2)+1r.8E(a.5r,2));q(!a.3f)a.3f=(a.R!=\'2D\'&&6A>0)||(6A>(m.cR||5));q(a.3f&&e.5Q>5&&e.5f>5){q(a.R==\'3q\')A.3q(a);L{A.7x(a.1f+a.5q,a.18+a.5r);q(a.R==\'2D\')A.O.F.3L=\'3I\'}}D 1h},8c:B(e){1m{q(!e)e=1y.1Y;u 67=/cW/i.16(e.R);q(!e.2j)e.2j=e.6p;q(!e.6l)e.6l=67?e.cZ:e.cY;u A=m.3v(e.2j);q(!A.4e)D;q(!A||!e.6l||m.3v(e.6l,J)==A||m.2a)D;W(u i=0;i=k.1N.3w+k.84){k.3Q=k.3Y;k.H=k.80=1;k.7Q();k.1N.5d[k.1a]=J;u 86=J;W(u i 3A k.1N.5d)q(k.1N.5d[i]!==J)86=1h;q(86){q(k.1N.83)k.1N.83.8v(k.2k)}D 1h}L{u n=t-k.84;k.80=n/k.1N.3w;k.H=k.1N.2g(n,0,1,k.1N.3w);k.3Q=k.3S+((k.3Y-k.3S)*k.H);k.7Q()}D J}};m.3e(m.1C,{3o:{1B:B(1C){m.Q(1C.2k,{1B:1C.3Q})},8z:B(1C){1m{q(1C.2k.F&&1C.2k.F[1C.1a]!=I)1C.2k.F[1C.1a]=1C.3Q+1C.3P;L 1C.2k[1C.1a]=1C.3Q}1l(e){}}}});m.4L=B(1x,2J){k.2J=2J;k.1x=1x;u v=m.26,5O;k.6C=m.1L&&m.26<7;q(!1x){q(2J)2J();D}m.5N();k.2m=m.14(\'2m\',{d7:0},{1q:\'1n\',1d:\'22\',d8:\'dc\',K:0},m.1S,J);u 7W=m.14(\'7W\',I,I,k.2m,1);k.29=[];W(u i=0;i<=8;i++){q(i%3==0)5O=m.14(\'5O\',I,{M:\'1H\'},7W,J);k.29[i]=m.14(\'29\',I,I,5O,J);u F=i!=4?{db:0,da:0}:{1d:\'3K\'};m.Q(k.29[i],F)}k.29[4].1p=1x+\' U-1o\';k.8P()};m.4L.54={8P:B(){u T=m.56+(m.d9||"cL/")+k.1x+".cE";u 98=m.4X&&m.26<8i?m.1S:I;k.2X=m.14(\'1v\',I,{1d:\'22\',18:\'-3R\'},98,J);u 36=k;k.2X.3H=B(){36.96()};k.2X.T=T},96:B(){u o=k.1s=k.2X.K/4,H=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],1F={M:(2*o)+\'E\',K:(2*o)+\'E\'};W(u i=0;i<=8;i++){q(H[i]){q(k.6C){u w=(i==1||i==7)?\'2A%\':k.2X.K+\'E\';u 1i=m.14(\'1i\',I,{K:\'2A%\',M:\'2A%\',1d:\'3K\',1W:\'1n\'},k.29[i],J);m.14(\'1i\',I,{4C:"c6:c5.9M.c4(c8=c9, T=\'"+k.2X.T+"\')",1d:\'22\',K:w,M:k.2X.M+\'E\',1f:(H[i][0]*o)+\'E\',18:(H[i][1]*o)+\'E\'},1i,J)}L{m.Q(k.29[i],{94:\'6X(\'+k.2X.T+\') \'+(H[i][0]*o)+\'E \'+(H[i][1]*o)+\'E\'})}q(1y.30&&(i==3||i==5))m.14(\'1i\',I,1F,k.29[i],J);m.Q(k.29[i],1F)}}k.2X=I;q(m.3G[k.1x])m.3G[k.1x].5l();m.3G[k.1x]=k;q(k.2J)k.2J()},4B:B(H,1s,9a,3b,2g){u A=k.A,4A=A.Y.F,1s=1s||0,H=H||{x:A.x.H+1s,y:A.y.H+1s,w:A.x.1b(\'1K\')-2*1s,h:A.y.1b(\'1K\')-2*1s};q(9a)k.2m.F.1q=(H.h>=4*k.1s)?\'2l\':\'1n\';m.Q(k.2m,{1f:(H.x-k.1s)+\'E\',18:(H.y-k.1s)+\'E\',K:(H.w+2*k.1s)+\'E\'});H.w-=2*k.1s;H.h-=2*k.1s;m.Q(k.29[4],{K:H.w>=0?H.w+\'E\':0,M:H.h>=0?H.h+\'E\':0});q(k.6C)k.29[3].F.M=k.29[5].F.M=k.29[4].F.M},5l:B(9d){q(9d)k.2m.F.1q=\'1n\';L m.3j(k.2m)}};m.5t=B(A,1F){k.A=A;k.1F=1F;k.2H=1F==\'x\'?\'cd\':\'cc\';k.2C=k.2H.5x();k.4J=1F==\'x\'?\'ca\':\'c3\';k.6J=k.4J.5x();k.6P=1F==\'x\'?\'c2\':\'bV\';k.bU=k.6P.5x();k.1V=k.2U=0};m.5t.54={1b:B(S){8T(S){1J\'7R\':D k.1A+k.2s+(k.t-m.21[\'1s\'+k.2H])/2;1J\'1K\':D k.G+2*k.cb+k.1V+k.2U;1J\'4b\':D k.5E-k.3y-k.5F;1J\'6K\':D k.1b(\'4b\')-2*k.cb-k.1V-k.2U;1J\'4w\':D k.H-(k.A.1o?k.A.1o.1s:0);1J\'88\':D k.1b(\'1K\')+(k.A.1o?2*k.A.1o.1s:0);1J\'5u\':D k.1T?1r.5Y((k.G-k.1T)/2):0}},6v:B(){k.cb=(k.A.O[\'1s\'+k.2H]-k.t)/2;k.5F=m[\'6V\'+k.6P]},6y:B(){k.t=k.A.C[k.2C]?49(k.A.C[k.2C]):k.A.C[\'1s\'+k.2H];k.1A=k.A.1A[k.1F];k.2s=(k.A.C[\'1s\'+k.2H]-k.t)/2;q(k.1A==0||k.1A==-1){k.1A=(m.3k[k.2C]/2)+m.3k[\'3s\'+k.4J]}},6u:B(){u A=k.A;k.3X=\'1H\';k.H=k.1A-k.cb+k.2s;q(k.6N&&k.1F==\'x\')A.5X=1r.2L(A.5X||k.Z,A.6N*k.Z/A.y.Z);k.G=1r.2L(k.Z,A[\'7l\'+k.2H]||k.Z);k.2E=A.4I?1r.2L(A[\'2L\'+k.2H],k.Z):k.Z;q(A.2o&&A.2K){k.G=A[k.2C];k.1T=k.Z}q(k.1F==\'x\'&&m.4M)k.2E=A.3O;k.3y=m[\'6V\'+k.4J];k.3s=m.3k[\'3s\'+k.4J];k.5E=m.3k[k.2C]},7J:B(i){u A=k.A;q(A.2o&&(A.2K||m.4M)){k.1T=i;k.G=1r.7l(k.G,k.1T);A.O.F[k.6J]=k.1b(\'5u\')+\'E\'}L k.G=i;A.O.F[k.2C]=i+\'E\';A.Y.F[k.2C]=k.1b(\'1K\')+\'E\';q(A.1o)A.1o.4B();q(A.2W)A.2W.F[k.2C]=i+\'E\';q(k.1F==\'y\'&&A.4v&&A.V.F.M!=\'1H\')1m{A.4v.V.F.1W=\'1H\'}1l(e){}q(A.1Z){u d=A.2c;q(k.7a===1X)k.7a=A.1g[\'1s\'+k.2H]-d[\'1s\'+k.2H];d.F[k.2C]=(k.G-k.7a)+\'E\';q(k.1F==\'x\')A.3D.F.K=\'1H\';q(A.V)A.V.F[k.2C]=\'1H\'}q(k.1F==\'x\'&&A.1z)A.4m(J)},7j:B(i){k.H=i;k.A.Y.F[k.6J]=i+\'E\';q(k.A.1o)k.A.1o.4B()}};m.4S=B(a,1E,2O,2B){q(N.9r&&m.1L&&!m.6Z){m.1R(N,\'3p\',B(){1w m.4S(a,1E,2O,2B)});D}k.a=a;k.2O=2O;k.2B=2B||\'2D\';k.1Z=(2B==\'2Q\');k.2o=!k.1Z;m.6n=1h;k.1Q=[];m.5N();u S=k.S=m.P.1c;W(u i=0;i(k.x.1T||k.x.G)){k.9W();q(k.1Q.1c==1)k.4m()}}k.7M()}1l(e){k.7w(e)}},7d:B(4r,1H){u c=m.4d(4r,\'5H\',\'U-V\');q(/(11|3c)/.16(k.2f)){q(k.3i)c.F.K=k.3i+\'E\';q(k.3J)c.F.M=k.3J+\'E\'}},5S:B(){q(k.av)D;u A=k;k.V=m.4d(k.1g,\'5H\',\'U-V\');q(k.2f==\'11\'){k.4t();u 4n=m.2I.61(1);k.V.1G(4n);k.cn=k.1g.2e;q(!k.3i)k.3i=4n.2e;u 45=k.1g.1I-k.V.1I,h=k.3J||m.3k.M-45-m.3N-m.6f,3H=k.31==\'4K\'?\' 3H="q (m.P[\'+k.S+\']) m.P[\'+k.S+\'].4x()" \':\'\';k.V.2n+=\'<11 2z="m\'+(1w 5s()).59()+\'" cq="0" S="\'+k.S+\'" \'+\' F="K:\'+k.3i+\'E; M:\'+h+\'E" \'+3H+\' T="\'+k.T+\'" >\';k.4n=k.V.3x(\'1i\')[0];k.11=k.V.3x(\'11\')[0];q(k.31==\'4O\')k.6S()}q(k.2f==\'3c\'){k.V.1j=k.V.1j||\'m-cm-1j-\'+k.S;u a=k.7I;q(!a.1E)a.1E={};q(1t a.1E.aF==\'1X\')a.1E.aF=\'ci\';q(7D)7D.cj(k.T,k.V.1j,k.3i,k.3J,a.ck||\'7\',a.cC,a.al,a.1E,a.ay)}k.av=J},76:B(){q(k.11&&!k.3J){k.11.F.M=k.V.F.M=k.at()+\'E\'}k.1g.1G(m.2I);q(!k.x.Z)k.x.Z=k.1g.2e;k.y.Z=k.1g.1I;k.1g.aj(m.2I);q(m.1L&&k.au>49(k.1g.4u.M)){k.au=49(k.1g.4u.M)}m.Q(k.Y,{1d:\'22\',6z:\'0\'});m.Q(k.O,{K:k.x.t+\'E\',M:k.y.t+\'E\'})},at:B(){u h;1m{u 1U=k.4v=k.11.6r||k.11.52.N;u 2I=1U.14(\'1i\');2I.F.ar=\'aw\';1U.V.1G(2I);h=2I.6G;q(m.1L)h+=49(1U.V.4u.3N)+49(1U.V.4u.6f)-1}1l(e){h=bY}D h},6S:B(){u 4k=k.1g.2e-k.4n.2e;m.3j(k.4n);q(4k<0)4k=0;u 45=k.1g.1I-k.11.1I;q(k.4v&&!k.3J&&!k.M&&k.y.G==k.y.Z)1m{k.4v.V.F.1W=\'1n\'}1l(e){}m.Q(k.11,{K:1r.7u(k.x.G-4k)+\'E\',M:1r.7u(k.y.G-45)+\'E\'});m.Q(k.V,{K:k.11.F.K,M:k.11.F.M});k.4p=k.11;k.2c=k.4p},aq:B(){k.7d(k.1g);q(k.2f==\'3c\'&&k.31==\'4K\')k.5S();q(k.x.G1D.1I){1D.F.K=(49(1D.F.K)+5C)+\'E\'}k.4p=1D;k.2c=k.4p}q(k.11&&k.31==\'4K\')k.6S();q(!k.4p&&k.y.Gk.2c.3a.1I){4T("1m { m.P["+k.S+"].2c.F.1W = \'1H\'; } 1l(e) {}",m.7c)}},3X:B(p,3W){u bW,bS=p.2j,1F=p==k.x?\'x\':\'y\';u 6R=1h;u 3V=p.A.4I;p.H=1r.5Y(p.H-((p.1b(\'1K\')-p.t)/2));q(p.Hp.3s+p.5E-p.5F){q(!3W&&6R&&3V){p.G=1r.2L(p.G,p.1b(1F==\'y\'?\'4b\':\'6K\'))}L q(p.1b(\'1K\')2d){ 2r=2N*2d;q(2rk.4s&&x.G>k.3O&&y.1b(\'1K\')>y.1b(\'4b\')){y.G-=10;q(2d)x.G=y.G*2d;k.4m(0,1);2V=J}}D 2V},7M:B(){u x=k.x,y=k.y;k.4a(\'1n\');k.7z(1,{Y:{K:x.1b(\'1K\'),M:y.1b(\'1K\'),1f:x.H,18:y.H},O:{1f:x.1V+x.1b(\'5u\'),18:y.1V+y.1b(\'5u\'),K:x.1T||x.G,M:y.1T||y.G}},m.7c)},7z:B(2y,2h,3b){q(k.1o&&!k.3g){q(2y)k.1o.4B();L k.1o.5l((k.1Z&&k.48))}q(!2y)k.9V();u A=k,x=A.x,y=A.y,2g=k.2g;q(!2y)2g=k.an||2g;u 4O=2y?B(){q(A.1o)A.1o.2m.F.1q="2l";4T(B(){A.aC()},50)}:B(){A.7A()};q(2y)m.Q(k.Y,{K:x.t+\'E\',M:y.t+\'E\'});q(2y&&k.1Z){m.Q(k.Y,{1f:(x.1A-x.cb+x.2s)+\'E\',18:(y.1A-y.cb+y.2s)+\'E\'})}q(k.am){m.Q(k.Y,{1B:2y?0:1});m.3e(2h.Y,{1B:2y})}m.41(k.Y,2h.Y,{3w:3b,2g:2g,3o:B(2R,2S){q(A.1o&&A.3g&&2S.1a==\'18\'){u 4G=2y?2S.H:1-2S.H;u H={w:x.t+(x.1b(\'1K\')-x.t)*4G,h:y.t+(y.1b(\'1K\')-y.t)*4G,x:x.1A+(x.H-x.1A)*4G,y:y.1A+(y.H-y.1A)*4G};A.1o.4B(H,0,1)}q(A.1Z){q(2S.1a==\'1f\')A.3D.F.1f=(x.H-2R)+\'E\';q(2S.1a==\'18\')A.3D.F.18=(y.H-2R)+\'E\'}}});m.41(k.O,2h.O,3b,2g,4O);q(2y){k.Y.F.1q=\'2l\';k.O.F.1q=\'2l\';q(k.1Z)k.1g.F.1q=\'2l\';k.a.1p+=\' U-9T-9O\'}},aC:B(){k.4e=J;k.3d();q(k.1Z&&k.31==\'4O\')k.5S();q(k.11){1m{u A=k,1U=k.11.6r||k.11.52.N;m.1R(1U,\'7H\',B(){q(m.2q!=A.S)A.3d()})}1l(e){}q(m.1L&&1t k.4z!=\'ce\')k.11.F.K=(k.3i-1)+\'E\'}q(m.3B&&m.3B==k.a)m.3B=I;k.ax();u p=m.3k,6I=m.5R.x+p.5T,6D=m.5R.y+p.5U;k.6x=k.x.H<6I&&6Ik.x.1b(\'4w\')+k.x.1b(\'88\'));u 9p=(2T.y+2T.hk.y.1b(\'4w\')+k.y.1b(\'88\'));u 5c=m.7S(1k[i]);q(!9o&&!9p&&5c!=k.S){q(!23){1k[i].4N(\'1n-by\',\'[\'+k.S+\']\');1k[i].7q=1k[i].F[1a];1k[i].F[1a]=\'1n\'}L q(23.9v(\'[\'+k.S+\']\')==-1){1k[i].4N(\'1n-by\',23+\'[\'+k.S+\']\')}}L q((23==\'[\'+k.S+\']\'||m.2q==5c)&&5c!=k.S){1k[i].4N(\'1n-by\',\'\');1k[i].F[1a]=1k[i].7q||\'\'}L q(23&&23.9v(\'[\'+k.S+\']\')>-1){1k[i].4N(\'1n-by\',23.2i(\'[\'+k.S+\']\',\'\'))}}}}},3d:B(){k.Y.F.1u=m.4l+=2;W(u i=0;i=5.5){s=s.2i(1w 5P(\']*>\',\'aB\'),\'\').2i(1w 5P(\']*>.*?\',\'aB\'),\'\');q(k.11){u 1U=k.11.6r;q(!1U&&k.11.52)1U=k.11.52.N;q(!1U){u 36=k;4T(B(){36.4Y()},25);D}1U.ak();1U.bO(s);1U.28();1m{s=1U.6F(k.1j).2n}1l(e){1m{s=k.11.N.6F(k.1j).2n}1l(e){}}m.3j(k.11)}L{5I=/(]*>|<\\/V>)/ba;q(5I.16(s))s=s.az(5I)[m.2Y?1:2]}}m.4d(k.O,\'5H\',\'U-V\').2n=s;k.2J();W(u x 3A k)k[x]=I}};m.5z=m.1e;u b6=m.4S;q(m.1L&&1y==1y.18){(B(){1m{N.44.aW(\'1f\')}1l(e){4T(aE.aX,50);D}m.3p()})()}m.1R(N,\'b9\',m.3p);m.1R(1y,\'7o\',m.3p);m.1R(N,\'3p\',B(){q(m.5v){u F=m.14(\'F\',{R:\'aK/79\'},I,N.3x(\'aQ\')[0]),a2=N.5G==\'6M\';B 5B(6U,6T){q(m.1L&&(m.26<9||a2)){u 3r=N.a3[N.a3.1c-1];q(1t(3r.5B)=="6W")3r.5B(6U,6T)}L{F.1G(N.bb(6U+" {"+6T+"}"))}}B cT(1a){D\'cS( ( ( cV = N.44.\'+1a+\' ? N.44.\'+1a+\' : N.V.\'+1a+\' ) ) + \\\'E\\\' );\'}q(m.5v)5B(\'.U 1v\',\'3L: 6X(\'+m.56+m.5v+\'), 5w !d0;\')}});m.1R(1y,\'3q\',B(){m.5y()});m.1R(N,\'6o\',B(e){m.5R={x:e.5Q,y:e.5f}});m.1R(N,\'7H\',m.7K);m.1R(N,\'9t\',m.7K);m.1R(N,\'3p\',m.4Z);m.1R(1y,\'7o\',m.9u);m.1R(1y,\'7o\',m.af)}',62,827,'||||||||||||||||||||this||hs||||if||||var||||||exp|function|el|return|px|style|size|pos|null|true|width|else|height|document|content|expanders|setStyles|type|key|src|highslide|body|for||wrapper|full||iframe|||createElement||test||top|overlay|prop|get|length|position|lang|left|innerContent|false|div|id|els|catch|try|hidden|outline|className|visibility|Math|offset|typeof|zIndex|img|new|outlineType|window|overlayBox|tpos|opacity|fx|node|params|dim|appendChild|auto|offsetHeight|case|wsize|ie|next|options|display|arr|overlays|addEventListener|container|imgSize|doc|p1|overflow|undefined|event|isHtml|push|loading|absolute|hiddenBy|none||uaVersion||close|td|dragArgs|xhr|scrollerDiv|ratio|offsetWidth|objectType|easing|to|replace|target|elem|visible|table|innerHTML|isImage|span|focusKey|xSize|tb|re|title|href|op|ajax|up|name|100|contentType|wh|image|minSize|hsId|right|ucwh|clearing|onLoad|useBox|min|onclick|ySize|custom|opt|html|val|args|elPos|p2|changed|releaseMask|graphic|ieLt9|match|opera|objectLoadTime||||func|pThis||||parentNode|dur|swf|focus|extend|hasDragged|outlineWhileAnimating|attribs|objectWidth|discardElement|page|styles|groups|class|step|ready|resize|last|scroll|timers|li|getExpander|duration|getElementsByTagName|marginMin|getNode|in|upcoming|sleeping|mediumContent|bottom|ieLt7|pendingOutlines|onload|move|objectHeight|relative|cursor|clone|marginTop|minWidth|unit|now|9999px|start|while|getParam|allowReduce|moveOnly|justify|end|images||animate|number|Id|documentElement|hDiff|navigator|cNode|preserveContent|parseInt|doShowHide|fitsize|tagName|getElementByClass|isExpanded|blurExp|removeEventListener|slideshowGroup|styleRestoreCursor|marginLeft|wDiff|zIndexCounter|sizeOverlayBox|ruler|cacheBindings|scrollingContent|htmls|parent|minHeight|showLoading|currentStyle|iDoc|opos|contentLoaded|idCounter|isClosing|stl|setPosition|filter|keyHandler|restoreCursor|all|fac|block|allowSizeReduction|uclt|before|Outline|padToMinWidth|setAttribute|after|preloadTheseImages|on|param|Expander|setTimeout|above|getParams|createOverlay|safari|loadHTML|getAnchors||cache|contentWindow|expand|prototype|matches|graphicsDir|mask|iebody|getTime|showHideElements|preloadTheseAjax|wrapperKey|curAnim|gotoEnd|clientY|topmostKey|keydown|keypress|Ajax|previousOrNext|destroy|getSrc|previous|self|positionOverlay|dX|dY|Date|Dimension|imgPad|expandCursor|pointer|toLowerCase|getPageSize|langDefaults|allowHeightReduction|addRule|kdeBugCorr|allowWidthReduction|clientSize|marginMax|compatMode|DIV|regBody|cachedGets|anchors|pre|expOnly|init|tr|RegExp|clientX|mouse|writeExtendedContent|scrollLeft|scrollTop|userAgent|isHsAnchor|maxWidth|round|hideOnMouseOut|overlayId|cloneNode|offY|tId|offX|preventDefault|heading|over|preloadFullImage|fullExpandLabel|below|thumbsUserSetId|ypos|sg|onLoadStarted|marginBottom|os|onReady|maincontent|250|xpos|relatedTarget|marginRight|continuePreloading|mousemove|srcElement|middle|contentDocument|overrides|parseFloat|calcExpanded|calcBorders|cancelLoading|mouseIsOver|calcThumb|padding|distance|getAdjacentAnchor|hasAlphaImageLoader|mY|cur|getElementById|offsetTop|center|mX|lt|maxsize|arrow|BackCompat|maxHeight|thumbnailId|ucrb|Click|hasMovedMin|correctIframeSize|dec|sel|margin|object|url|fitOverlayBox|isReady||numberOfImagesToPreload|ie6|panel|doWrapper||htmlGetSize|getInline|wrapperClassName|css|sizeDiff|dragByHeading|expandDuration|setObjContainerSize|credits|contentId|garbageBin|restoreTitle|doFullExpand|setPos|clones|max|allowMultipleInstances|topZ|load|hasFocused|origProp|preloadAjaxElement|blur|getCacheBinding|abs|onError|error|moveTo|run|changeSize|afterClose|openerTagNames|element|swfobject|getSelfRendered|adj|resizeTo|mousedown|swfOptions|setSize|mouseClickHandler|string|show|break|form|Create|update|loadingPos|getWrapperKey|location|fade|geckoMac|tbody|types|getElementContent|Text|state|connectOutline|cacheAjax|complete|startTime|getPosition|done|defaultView|osize|cssDirection|dragHandler|direction|wrapperMouseHandler|pageOrigin|Next|JS|Highslide|Play|525|Close|Pause|spacebar|slideshow|Previous|thumb|offsetParent|from|timerId|orig|transit|updateAnchors|call|replaceLang|offsetLeft|pageXOffset|_default|skin|contentWrapper|enableKeyListener|htmlExpand|pow|clickY|loadingTitle|ltr|detachEvent|clickX|loadingText|focusTopmost|easeInQuad|loadingOpacity|hasHtmlExpanders|preloadGraphic|clientWidth|moveText|moveTitle|switch|closeTitle|closeText|nextText|nextTitle|and|200|previousTitle|previousText|ul|resizeTitle|background|nopad|onGraphicLoad|alpha|appendTo||vis|tag|headingOverlay|hide|captionOverlay|rv|Move|preloadNext|getPropertyValue|getAttribute|getComputedStyle|hideIframes|hideSelects|XMLHttpRequest|clearsX|clearsY|hand|readyState|focusTitle|mouseup|preloadImages|indexOf|Overlay|addOverlay|creditsHref|ie6SSL|getAnchorIndex|current|toString|cachedGet|creditsTarget|creditsTitle|_|nextSibling|Eval|setRequestHeader|creditsPosition|XMLHTTP|Microsoft|showOverlays|anchor|doPanels|genOverlayBox|gotOverlays|sleep|active|fullExpandOpacity|destroyOverlays|createFullExpand|javascript|fullExpandTitle|fullExpandPosition|writeCredits|showCredits|backCompat|styleSheets|destroyObject|htmlPrepareClose|ActiveXObject|restoreDuration|awake|offsetX|getOverlays|reOrder|rightpanel|leftpanel|offsetY|preloadAjax|creditsText|KDE|vendor|removeChild|open|flashvars|fadeInOut|easingClose|tmpMin|border|htmlSizeOperations|clear||getIframePageHeight|newHeight|hasExtendedContent|both|prepareNextOutline|attributes|split|correctRatio|gi|afterExpand|script|arguments|wmode|captionEval|Use|keyCode|button|text|drag|headingId|graphics|_self|shadow|HEAD|click|drop|keys|header|htmlE|doScroll|callee|returnValue|outlineStartOffset|footer|registerOverlay|http|headingText|com|captionId|HsExpander|xpand|fullExpandText|DOMContentLoaded|ig|createTextNode|captionText|forceAjaxReload|urlencoded|pageYOffset|send|white|Gecko|Type|application|www|innerHeight|link|toUpperCase|removeAttribute|responseText|blank|about|1001|clientHeight|innerWidth|Content|Macintosh||dummy|GET|zoomout|maincontentText|maincontentId|Msxml2|onreadystatechange|zoomin|maincontentEval|oPos|it|ra|Safari|Trident|With|write|Requested|headingEval|pauseTitle|tgt|actual|rb|Bottom|tgtArr|Expand|300|nodeName|insertBefore|front|Right|Top|AlphaImageLoader|DXImageTransform|progid|Powered|sizingMethod|scale|Left||Height|Width|boolean|allowSimultaneousLoading|onmouseover|flushImgSize|transparent|embedSWF|version|htmlCreate|flash|newWidth|Loading|static|frameborder|oncontextmenu|blockRightClick|Line|alert|debug|onmouseout|lineNumber|message|imageCreate|cancel|bring|expressInstallSwfurl|01|png|paddingTop|200px|https|protocol|1px|linearTween|outlines|pauseText|StopPlay|removeSWF|caption|useOnHtml|dragSensitivity|expression|fix|sqrt|ignoreMe|mouseover|attachEvent|toElement|fromElement|important|default|playTitle|Go|eval|SELECT|the|cellSpacing|borderCollapse|outlinesDir|fontSize|lineHeight|collapse|playText|IFRAME|clearInterval|homepage|splice|esc|Resize|setInterval'.split('|'),0,{})) diff --git a/Website/static/highslide/highslide/highslide.css b/Website/static/highslide/highslide/highslide.css deleted file mode 100644 index c9a0e80..0000000 --- a/Website/static/highslide/highslide/highslide.css +++ /dev/null @@ -1,889 +0,0 @@ -/** -* @file: highslide.css -* @version: 4.1.13 -*/ -.highslide-container div { - font-family: Verdana, Helvetica; - font-size: 10pt; -} -.highslide-container table { - background: none; -} -.highslide { - outline: none; - text-decoration: none; -} -.highslide img { - border: 2px solid silver; -} -.highslide:hover img { - border-color: gray; -} -.highslide-active-anchor img { - visibility: hidden; -} -.highslide-gallery .highslide-active-anchor img { - border-color: black; - visibility: visible; - cursor: default; -} -.highslide-image { - border-width: 2px; - border-style: solid; - border-color: white; -} -.highslide-wrapper, .highslide-outline { - background: white; -} -.glossy-dark { - background: #111; -} - -.highslide-image-blur { -} -.highslide-number { - font-weight: bold; - color: gray; - font-size: .9em; -} -.highslide-caption { - display: none; - font-size: 1em; - padding: 5px; - /*background: white;*/ -} -.highslide-heading { - display: none; - font-weight: bold; - margin: 0.4em; -} -.highslide-dimming { - /*position: absolute;*/ - background: black; -} -a.highslide-full-expand { - background: url(graphics/fullexpand.gif) no-repeat; - display: block; - margin: 0 10px 10px 0; - width: 34px; - height: 34px; -} -.highslide-loading { - display: block; - color: black; - font-size: 9px; - font-weight: bold; - text-transform: uppercase; - text-decoration: none; - padding: 3px; - border: 1px solid white; - background-color: white; - padding-left: 22px; - background-image: url(graphics/loader.white.gif); - background-repeat: no-repeat; - background-position: 3px 1px; -} -a.highslide-credits, -a.highslide-credits i { - padding: 2px; - color: silver; - text-decoration: none; - font-size: 10px; -} -a.highslide-credits:hover, -a.highslide-credits:hover i { - color: white; - background-color: gray; -} -.highslide-move, .highslide-move * { - cursor: move; -} - -.highslide-viewport { - display: none; - position: fixed; - width: 100%; - height: 100%; - z-index: 1; - background: none; - left: 0; - top: 0; -} -.highslide-overlay { - display: none; -} -.hidden-container { - display: none; -} -/* Example of a semitransparent, offset closebutton */ -.closebutton { - position: relative; - top: -15px; - left: 15px; - width: 30px; - height: 30px; - cursor: pointer; - background: url(graphics/close.png); - /* NOTE! For IE6, you also need to update the highslide-ie6.css file. */ -} - -/*****************************************************************************/ -/* Thumbnail boxes for the galleries. */ -/* Remove these if you are not using a gallery. */ -/*****************************************************************************/ -.highslide-gallery ul { - list-style-type: none; - margin: 0; - padding: 0; -} -.highslide-gallery ul li { - display: block; - position: relative; - float: left; - width: 106px; - height: 106px; - border: 1px solid silver; - background: #ededed; - margin: 2px; - padding: 0; - line-height: 0; - overflow: hidden; -} -.highslide-gallery ul a { - position: absolute; - top: 50%; - left: 50%; -} -.highslide-gallery ul img { - position: relative; - top: -50%; - left: -50%; -} -html>/**/body .highslide-gallery ul li { - display: table; - text-align: center; -} -html>/**/body .highslide-gallery ul li { - text-align: center; -} -html>/**/body .highslide-gallery ul a { - position: static; - display: table-cell; - vertical-align: middle; -} -html>/**/body .highslide-gallery ul img { - position: static; -} - -/*****************************************************************************/ -/* Controls for the galleries. */ -/* Remove these if you are not using a gallery */ -/*****************************************************************************/ -.highslide-controls { - width: 195px; - height: 40px; - background: url(graphics/controlbar-white.gif) 0 -90px no-repeat; - margin: 20px 15px 10px 0; -} -.highslide-controls ul { - position: relative; - left: 15px; - height: 40px; - list-style: none; - margin: 0; - padding: 0; - background: url(graphics/controlbar-white.gif) right -90px no-repeat; - -} -.highslide-controls li { - float: left; - padding: 5px 0; - margin:0; - list-style: none; -} -.highslide-controls a { - background-image: url(graphics/controlbar-white.gif); - display: block; - float: left; - height: 30px; - width: 30px; - outline: none; -} -.highslide-controls a.disabled { - cursor: default; -} -.highslide-controls a.disabled span { - cursor: default; -} -.highslide-controls a span { - /* hide the text for these graphic buttons */ - display: none; - cursor: pointer; -} - - -/* The CSS sprites for the controlbar - see http://www.google.com/search?q=css+sprites */ -.highslide-controls .highslide-previous a { - background-position: 0 0; -} -.highslide-controls .highslide-previous a:hover { - background-position: 0 -30px; -} -.highslide-controls .highslide-previous a.disabled { - background-position: 0 -60px !important; -} -.highslide-controls .highslide-play a { - background-position: -30px 0; -} -.highslide-controls .highslide-play a:hover { - background-position: -30px -30px; -} -.highslide-controls .highslide-play a.disabled { - background-position: -30px -60px !important; -} -.highslide-controls .highslide-pause a { - background-position: -60px 0; -} -.highslide-controls .highslide-pause a:hover { - background-position: -60px -30px; -} -.highslide-controls .highslide-next a { - background-position: -90px 0; -} -.highslide-controls .highslide-next a:hover { - background-position: -90px -30px; -} -.highslide-controls .highslide-next a.disabled { - background-position: -90px -60px !important; -} -.highslide-controls .highslide-move a { - background-position: -120px 0; -} -.highslide-controls .highslide-move a:hover { - background-position: -120px -30px; -} -.highslide-controls .highslide-full-expand a { - background-position: -150px 0; -} -.highslide-controls .highslide-full-expand a:hover { - background-position: -150px -30px; -} -.highslide-controls .highslide-full-expand a.disabled { - background-position: -150px -60px !important; -} -.highslide-controls .highslide-close a { - background-position: -180px 0; -} -.highslide-controls .highslide-close a:hover { - background-position: -180px -30px; -} - -/*****************************************************************************/ -/* Styles for the HTML popups */ -/* Remove these if you are not using Highslide HTML */ -/*****************************************************************************/ -.highslide-maincontent { - display: none; -} -.highslide-html { - background-color: white; -} -.mobile .highslide-html { - border: 1px solid silver; -} -.highslide-html-content { - display: none; - width: 400px; - padding: 0 5px 5px 5px; -} -.highslide-header { - padding-bottom: 5px; -} -.highslide-header ul { - margin: 0; - padding: 0; - text-align: right; -} -.highslide-header ul li { - display: inline; - padding-left: 1em; -} -.highslide-header ul li.highslide-previous, .highslide-header ul li.highslide-next { - display: none; -} -.highslide-header a { - font-weight: bold; - color: gray; - text-transform: uppercase; - text-decoration: none; -} -.highslide-header a:hover { - color: black; -} -.highslide-header .highslide-move a { - cursor: move; -} -.highslide-footer { - height: 16px; -} -.highslide-footer .highslide-resize { - display: block; - float: right; - margin-top: 5px; - height: 11px; - width: 11px; - background: url(graphics/resize.gif) no-repeat; -} -.highslide-footer .highslide-resize span { - display: none; -} -.highslide-body { -} -.highslide-resize { - cursor: nw-resize; -} - -/*****************************************************************************/ -/* Styles for the Individual wrapper class names. */ -/* See www.highslide.com/ref/hs.wrapperClassName */ -/* You can safely remove the class name themes you don't use */ -/*****************************************************************************/ - -/* hs.wrapperClassName = 'draggable-header' */ -.draggable-header .highslide-header { - height: 18px; - border-bottom: 1px solid #dddddd; -} -.draggable-header .highslide-heading { - position: absolute; - margin: 2px 0.4em; -} - -.draggable-header .highslide-header .highslide-move { - cursor: move; - display: block; - height: 16px; - position: absolute; - right: 24px; - top: 0; - width: 100%; - z-index: 1; -} -.draggable-header .highslide-header .highslide-move * { - display: none; -} -.draggable-header .highslide-header .highslide-close { - position: absolute; - right: 2px; - top: 2px; - z-index: 5; - padding: 0; -} -.draggable-header .highslide-header .highslide-close a { - display: block; - height: 16px; - width: 16px; - background-image: url(graphics/closeX.png); -} -.draggable-header .highslide-header .highslide-close a:hover { - background-position: 0 16px; -} -.draggable-header .highslide-header .highslide-close span { - display: none; -} -.draggable-header .highslide-maincontent { - padding-top: 1em; -} - -/* hs.wrapperClassName = 'titlebar' */ -.titlebar .highslide-header { - height: 18px; - border-bottom: 1px solid #dddddd; -} -.titlebar .highslide-heading { - position: absolute; - width: 90%; - margin: 1px 0 1px 5px; - color: #666666; -} - -.titlebar .highslide-header .highslide-move { - cursor: move; - display: block; - height: 16px; - position: absolute; - right: 24px; - top: 0; - width: 100%; - z-index: 1; -} -.titlebar .highslide-header .highslide-move * { - display: none; -} -.titlebar .highslide-header li { - position: relative; - top: 3px; - z-index: 2; - padding: 0 0 0 1em; -} -.titlebar .highslide-maincontent { - padding-top: 1em; -} - -/* hs.wrapperClassName = 'no-footer' */ -.no-footer .highslide-footer { - display: none; -} - -/* hs.wrapperClassName = 'wide-border' */ -.wide-border { - background: white; -} -.wide-border .highslide-image { - border-width: 10px; -} -.wide-border .highslide-caption { - padding: 0 10px 10px 10px; -} - -/* hs.wrapperClassName = 'borderless' */ -.borderless .highslide-image { - border: none; -} -.borderless .highslide-caption { - border-bottom: 1px solid white; - border-top: 1px solid white; - background: silver; -} - -/* hs.wrapperClassName = 'outer-glow' */ -.outer-glow { - background: #444; -} -.outer-glow .highslide-image { - border: 5px solid #444444; -} -.outer-glow .highslide-caption { - border: 5px solid #444444; - border-top: none; - padding: 5px; - background-color: gray; -} - -/* hs.wrapperClassName = 'colored-border' */ -.colored-border { - background: white; -} -.colored-border .highslide-image { - border: 2px solid green; -} -.colored-border .highslide-caption { - border: 2px solid green; - border-top: none; -} - -/* hs.wrapperClassName = 'dark' */ -.dark { - background: #111; -} -.dark .highslide-image { - border-color: black black #202020 black; - background: gray; -} -.dark .highslide-caption { - color: white; - background: #111; -} -.dark .highslide-controls, -.dark .highslide-controls ul, -.dark .highslide-controls a { - background-image: url(graphics/controlbar-black-border.gif); -} - -/* hs.wrapperClassName = 'floating-caption' */ -.floating-caption .highslide-caption { - position: absolute; - padding: 1em 0 0 0; - background: none; - color: white; - border: none; - font-weight: bold; -} - -/* hs.wrapperClassName = 'controls-in-heading' */ -.controls-in-heading .highslide-heading { - color: gray; - font-weight: bold; - height: 20px; - overflow: hidden; - cursor: default; - padding: 0 0 0 22px; - margin: 0; - background: url(graphics/icon.gif) no-repeat 0 1px; -} -.controls-in-heading .highslide-controls { - width: 105px; - height: 20px; - position: relative; - margin: 0; - top: -23px; - left: 7px; - background: none; -} -.controls-in-heading .highslide-controls ul { - position: static; - height: 20px; - background: none; -} -.controls-in-heading .highslide-controls li { - padding: 0; -} -.controls-in-heading .highslide-controls a { - background-image: url(graphics/controlbar-white-small.gif); - height: 20px; - width: 20px; -} - -.controls-in-heading .highslide-controls .highslide-move { - display: none; -} - -.controls-in-heading .highslide-controls .highslide-previous a { - background-position: 0 0; -} -.controls-in-heading .highslide-controls .highslide-previous a:hover { - background-position: 0 -20px; -} -.controls-in-heading .highslide-controls .highslide-previous a.disabled { - background-position: 0 -40px !important; -} -.controls-in-heading .highslide-controls .highslide-play a { - background-position: -20px 0; -} -.controls-in-heading .highslide-controls .highslide-play a:hover { - background-position: -20px -20px; -} -.controls-in-heading .highslide-controls .highslide-play a.disabled { - background-position: -20px -40px !important; -} -.controls-in-heading .highslide-controls .highslide-pause a { - background-position: -40px 0; -} -.controls-in-heading .highslide-controls .highslide-pause a:hover { - background-position: -40px -20px; -} -.controls-in-heading .highslide-controls .highslide-next a { - background-position: -60px 0; -} -.controls-in-heading .highslide-controls .highslide-next a:hover { - background-position: -60px -20px; -} -.controls-in-heading .highslide-controls .highslide-next a.disabled { - background-position: -60px -40px !important; -} -.controls-in-heading .highslide-controls .highslide-full-expand a { - background-position: -100px 0; -} -.controls-in-heading .highslide-controls .highslide-full-expand a:hover { - background-position: -100px -20px; -} -.controls-in-heading .highslide-controls .highslide-full-expand a.disabled { - background-position: -100px -40px !important; -} -.controls-in-heading .highslide-controls .highslide-close a { - background-position: -120px 0; -} -.controls-in-heading .highslide-controls .highslide-close a:hover { - background-position: -120px -20px; -} - -/*****************************************************************************/ -/* Styles for text based controls. */ -/* You can safely remove this if you don't use text based controls */ -/*****************************************************************************/ - -.text-controls .highslide-controls { - width: auto; - height: auto; - margin: 0; - text-align: center; - background: none; -} -.text-controls ul { - position: static; - background: none; - height: auto; - left: 0; -} -.text-controls .highslide-move { - display: none; -} -.text-controls li { - background-image: url(graphics/controlbar-text-buttons.png); - background-position: right top !important; - padding: 0; - margin-left: 15px; - display: block; - width: auto; -} -.text-controls a { - background: url(graphics/controlbar-text-buttons.png) no-repeat; - background-position: left top !important; - position: relative; - left: -10px; - display: block; - width: auto; - height: auto; - text-decoration: none !important; -} -.text-controls a span { - background: url(graphics/controlbar-text-buttons.png) no-repeat; - margin: 1px 2px 1px 10px; - display: block; - min-width: 4em; - height: 18px; - line-height: 18px; - padding: 1px 0 1px 18px; - color: #333; - font-family: "Trebuchet MS", Arial, sans-serif; - font-size: 12px; - font-weight: bold; - white-space: nowrap; -} -.text-controls .highslide-next { - margin-right: 1em; -} -.text-controls .highslide-full-expand a span { - min-width: 0; - margin: 1px 0; - padding: 1px 0 1px 10px; -} -.text-controls .highslide-close a span { - min-width: 0; -} -.text-controls a:hover span { - color: black; -} -.text-controls a.disabled span { - color: #999; -} - -.text-controls .highslide-previous span { - background-position: 0 -40px; -} -.text-controls .highslide-previous a.disabled { - background-position: left top !important; -} -.text-controls .highslide-previous a.disabled span { - background-position: 0 -140px; -} -.text-controls .highslide-play span { - background-position: 0 -60px; -} -.text-controls .highslide-play a.disabled { - background-position: left top !important; -} -.text-controls .highslide-play a.disabled span { - background-position: 0 -160px; -} -.text-controls .highslide-pause span { - background-position: 0 -80px; -} -.text-controls .highslide-next span { - background-position: 0 -100px; -} -.text-controls .highslide-next a.disabled { - background-position: left top !important; -} -.text-controls .highslide-next a.disabled span { - background-position: 0 -200px; -} -.text-controls .highslide-full-expand span { - background: none; -} -.text-controls .highslide-full-expand a.disabled { - background-position: left top !important; -} -.text-controls .highslide-close span { - background-position: 0 -120px; -} - - -/*****************************************************************************/ -/* Styles for the thumbstrip. */ -/* See www.highslide.com/ref/hs.addSlideshow */ -/* You can safely remove this if you don't use a thumbstrip */ -/*****************************************************************************/ - -.highslide-thumbstrip { - height: 100%; - direction: ltr; -} -.highslide-thumbstrip div { - overflow: hidden; -} -.highslide-thumbstrip table { - position: relative; - padding: 0; - border-collapse: collapse; -} -.highslide-thumbstrip td { - padding: 1px; - /*text-align: center;*/ -} -.highslide-thumbstrip a { - outline: none; -} -.highslide-thumbstrip img { - display: block; - border: 1px solid gray; - margin: 0 auto; -} -.highslide-thumbstrip .highslide-active-anchor img { - visibility: visible; -} -.highslide-thumbstrip .highslide-marker { - position: absolute; - width: 0; - height: 0; - border-width: 0; - border-style: solid; - border-color: transparent; /* change this to actual background color in highslide-ie6.css */ -} -.highslide-thumbstrip-horizontal div { - width: auto; - /* width: 100% breaks in small strips in IE */ -} -.highslide-thumbstrip-horizontal .highslide-scroll-up { - display: none; - position: absolute; - top: 3px; - left: 3px; - width: 25px; - height: 42px; -} -.highslide-thumbstrip-horizontal .highslide-scroll-up div { - margin-bottom: 10px; - cursor: pointer; - background: url(graphics/scrollarrows.png) left center no-repeat; - height: 42px; -} -.highslide-thumbstrip-horizontal .highslide-scroll-down { - display: none; - position: absolute; - top: 3px; - right: 3px; - width: 25px; - height: 42px; -} -.highslide-thumbstrip-horizontal .highslide-scroll-down div { - margin-bottom: 10px; - cursor: pointer; - background: url(graphics/scrollarrows.png) center right no-repeat; - height: 42px; -} -.highslide-thumbstrip-horizontal table { - margin: 2px 0 10px 0; -} -.highslide-viewport .highslide-thumbstrip-horizontal table { - margin-left: 10px; -} -.highslide-thumbstrip-horizontal img { - width: auto; - height: 40px; -} -.highslide-thumbstrip-horizontal .highslide-marker { - top: 47px; - border-left-width: 6px; - border-right-width: 6px; - border-bottom: 6px solid gray; -} -.highslide-viewport .highslide-thumbstrip-horizontal .highslide-marker { - margin-left: 10px; -} -.dark .highslide-thumbstrip-horizontal .highslide-marker, .highslide-viewport .highslide-thumbstrip-horizontal .highslide-marker { - border-bottom-color: white !important; -} - -.highslide-thumbstrip-vertical-overlay { - overflow: hidden !important; -} -.highslide-thumbstrip-vertical div { - height: 100%; -} -.highslide-thumbstrip-vertical a { - display: block; -} -.highslide-thumbstrip-vertical .highslide-scroll-up { - display: none; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 25px; -} -.highslide-thumbstrip-vertical .highslide-scroll-up div { - margin-left: 10px; - cursor: pointer; - background: url(graphics/scrollarrows.png) top center no-repeat; - height: 25px; -} -.highslide-thumbstrip-vertical .highslide-scroll-down { - display: none; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - height: 25px; -} -.highslide-thumbstrip-vertical .highslide-scroll-down div { - margin-left: 10px; - cursor: pointer; - background: url(graphics/scrollarrows.png) bottom center no-repeat; - height: 25px; -} -.highslide-thumbstrip-vertical table { - margin: 10px 0 0 10px; -} -.highslide-thumbstrip-vertical img { - width: 60px; /* t=5481 */ -} -.highslide-thumbstrip-vertical .highslide-marker { - left: 0; - margin-top: 8px; - border-top-width: 6px; - border-bottom-width: 6px; - border-left: 6px solid gray; -} -.dark .highslide-thumbstrip-vertical .highslide-marker, .highslide-viewport .highslide-thumbstrip-vertical .highslide-marker { - border-left-color: white; -} - -.highslide-viewport .highslide-thumbstrip-float { - overflow: auto; -} -.highslide-thumbstrip-float ul { - margin: 2px 0; - padding: 0; -} -.highslide-thumbstrip-float li { - display: block; - height: 60px; - margin: 0 2px; - list-style: none; - float: left; -} -.highslide-thumbstrip-float img { - display: inline; - border-color: silver; - max-height: 56px; -} -.highslide-thumbstrip-float .highslide-active-anchor img { - border-color: black; -} -.highslide-thumbstrip-float .highslide-scroll-up div, .highslide-thumbstrip-float .highslide-scroll-down div { - display: none; -} -.highslide-thumbstrip-float .highslide-marker { - display: none; -} \ No newline at end of file diff --git a/Website/static/highslide/highslide/highslide.js b/Website/static/highslide/highslide/highslide.js deleted file mode 100644 index f1d645b..0000000 --- a/Website/static/highslide/highslide/highslide.js +++ /dev/null @@ -1,1891 +0,0 @@ -/** - * Name: Highslide JS - * Version: 4.1.13 (2011-10-06) - * Config: default - * Author: Torstein Hønsi - * Support: www.highslide.com/support - * License: www.highslide.com/#license - */ -if (!hs) { var hs = { -// Language strings -lang : { - cssDirection: 'ltr', - loadingText : 'Loading...', - loadingTitle : 'Click to cancel', - focusTitle : 'Click to bring to front', - fullExpandTitle : 'Expand to actual size (f)', - creditsText : 'Powered by Highslide JS', - creditsTitle : 'Go to the Highslide JS homepage', - restoreTitle : 'Click to close image, click and drag to move. Use arrow keys for next and previous.' -}, -// See http://highslide.com/ref for examples of settings -graphicsDir : 'highslide/graphics/', -expandCursor : 'zoomin.cur', // null disables -restoreCursor : 'zoomout.cur', // null disables -expandDuration : 250, // milliseconds -restoreDuration : 250, -marginLeft : 15, -marginRight : 15, -marginTop : 15, -marginBottom : 15, -zIndexCounter : 1001, // adjust to other absolutely positioned elements -loadingOpacity : 0.75, -allowMultipleInstances: true, -numberOfImagesToPreload : 5, -outlineWhileAnimating : 2, // 0 = never, 1 = always, 2 = HTML only -outlineStartOffset : 3, // ends at 10 -padToMinWidth : false, // pad the popup width to make room for wide caption -fullExpandPosition : 'bottom right', -fullExpandOpacity : 1, -showCredits : true, // you can set this to false if you want -creditsHref : 'http://highslide.com/', -creditsTarget : '_self', -enableKeyListener : true, -openerTagNames : ['a'], // Add more to allow slideshow indexing - -dragByHeading: true, -minWidth: 200, -minHeight: 200, -allowSizeReduction: true, // allow the image to reduce to fit client size. If false, this overrides minWidth and minHeight -outlineType : 'drop-shadow', // set null to disable outlines -// END OF YOUR SETTINGS - - -// declare internal properties -preloadTheseImages : [], -continuePreloading: true, -expanders : [], -overrides : [ - 'allowSizeReduction', - 'useBox', - 'outlineType', - 'outlineWhileAnimating', - 'captionId', - 'captionText', - 'captionEval', - 'captionOverlay', - 'headingId', - 'headingText', - 'headingEval', - 'headingOverlay', - 'creditsPosition', - 'dragByHeading', - - 'width', - 'height', - - 'wrapperClassName', - 'minWidth', - 'minHeight', - 'maxWidth', - 'maxHeight', - 'pageOrigin', - 'slideshowGroup', - 'easing', - 'easingClose', - 'fadeInOut', - 'src' -], -overlays : [], -idCounter : 0, -oPos : { - x: ['leftpanel', 'left', 'center', 'right', 'rightpanel'], - y: ['above', 'top', 'middle', 'bottom', 'below'] -}, -mouse: {}, -headingOverlay: {}, -captionOverlay: {}, -timers : [], - -pendingOutlines : {}, -clones : {}, -onReady: [], -uaVersion: /Trident\/4\.0/.test(navigator.userAgent) ? 8 : - parseFloat((navigator.userAgent.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1]), -ie : (document.all && !window.opera), -//ie : navigator && /MSIE [678]/.test(navigator.userAgent), // ie9 compliant? -safari : /Safari/.test(navigator.userAgent), -geckoMac : /Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent), - -$ : function (id) { - if (id) return document.getElementById(id); -}, - -push : function (arr, val) { - arr[arr.length] = val; -}, - -createElement : function (tag, attribs, styles, parent, nopad) { - var el = document.createElement(tag); - if (attribs) hs.extend(el, attribs); - if (nopad) hs.setStyles(el, {padding: 0, border: 'none', margin: 0}); - if (styles) hs.setStyles(el, styles); - if (parent) parent.appendChild(el); - return el; -}, - -extend : function (el, attribs) { - for (var x in attribs) el[x] = attribs[x]; - return el; -}, - -setStyles : function (el, styles) { - for (var x in styles) { - if (hs.ieLt9 && x == 'opacity') { - if (styles[x] > 0.99) el.style.removeAttribute('filter'); - else el.style.filter = 'alpha(opacity='+ (styles[x] * 100) +')'; - } - else el.style[x] = styles[x]; - } -}, -animate: function(el, prop, opt) { - var start, - end, - unit; - if (typeof opt != 'object' || opt === null) { - var args = arguments; - opt = { - duration: args[2], - easing: args[3], - complete: args[4] - }; - } - if (typeof opt.duration != 'number') opt.duration = 250; - opt.easing = Math[opt.easing] || Math.easeInQuad; - opt.curAnim = hs.extend({}, prop); - for (var name in prop) { - var e = new hs.fx(el, opt , name ); - - start = parseFloat(hs.css(el, name)) || 0; - end = parseFloat(prop[name]); - unit = name != 'opacity' ? 'px' : ''; - - e.custom( start, end, unit ); - } -}, -css: function(el, prop) { - if (el.style[prop]) { - return el.style[prop]; - } else if (document.defaultView) { - return document.defaultView.getComputedStyle(el, null).getPropertyValue(prop); - - } else { - if (prop == 'opacity') prop = 'filter'; - var val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b){ return b.toUpperCase(); })]; - if (prop == 'filter') - val = val.replace(/alpha\(opacity=([0-9]+)\)/, - function (a, b) { return b / 100 }); - return val === '' ? 1 : val; - } -}, - -getPageSize : function () { - var d = document, w = window, iebody = d.compatMode && d.compatMode != 'BackCompat' - ? d.documentElement : d.body, - ieLt9 = hs.ie && (hs.uaVersion < 9 || typeof pageXOffset == 'undefined'); - - var width = ieLt9 ? iebody.clientWidth : - (d.documentElement.clientWidth || self.innerWidth), - height = ieLt9 ? iebody.clientHeight : self.innerHeight; - hs.page = { - width: width, - height: height, - scrollLeft: ieLt9 ? iebody.scrollLeft : pageXOffset, - scrollTop: ieLt9 ? iebody.scrollTop : pageYOffset - }; - return hs.page; -}, - -getPosition : function(el) { - var p = { x: el.offsetLeft, y: el.offsetTop }; - while (el.offsetParent) { - el = el.offsetParent; - p.x += el.offsetLeft; - p.y += el.offsetTop; - if (el != document.body && el != document.documentElement) { - p.x -= el.scrollLeft; - p.y -= el.scrollTop; - } - } - return p; -}, - -expand : function(a, params, custom, type) { - if (!a) a = hs.createElement('a', null, { display: 'none' }, hs.container); - if (typeof a.getParams == 'function') return params; - try { - new hs.Expander(a, params, custom); - return false; - } catch (e) { return true; } -}, - - -focusTopmost : function() { - var topZ = 0, - topmostKey = -1, - expanders = hs.expanders, - exp, - zIndex; - for (var i = 0; i < expanders.length; i++) { - exp = expanders[i]; - if (exp) { - zIndex = exp.wrapper.style.zIndex; - if (zIndex && zIndex > topZ) { - topZ = zIndex; - topmostKey = i; - } - } - } - if (topmostKey == -1) hs.focusKey = -1; - else expanders[topmostKey].focus(); -}, - -getParam : function (a, param) { - a.getParams = a.onclick; - var p = a.getParams ? a.getParams() : null; - a.getParams = null; - - return (p && typeof p[param] != 'undefined') ? p[param] : - (typeof hs[param] != 'undefined' ? hs[param] : null); -}, - -getSrc : function (a) { - var src = hs.getParam(a, 'src'); - if (src) return src; - return a.href; -}, - -getNode : function (id) { - var node = hs.$(id), clone = hs.clones[id], a = {}; - if (!node && !clone) return null; - if (!clone) { - clone = node.cloneNode(true); - clone.id = ''; - hs.clones[id] = clone; - return node; - } else { - return clone.cloneNode(true); - } -}, - -discardElement : function(d) { - if (d) hs.garbageBin.appendChild(d); - hs.garbageBin.innerHTML = ''; -}, -transit : function (adj, exp) { - var last = exp || hs.getExpander(); - exp = last; - if (hs.upcoming) return false; - else hs.last = last; - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - try { - hs.upcoming = adj; - adj.onclick(); - } catch (e){ - hs.last = hs.upcoming = null; - } - try { - exp.close(); - } catch (e) {} - return false; -}, - -previousOrNext : function (el, op) { - var exp = hs.getExpander(el); - if (exp) return hs.transit(exp.getAdjacentAnchor(op), exp); - else return false; -}, - -previous : function (el) { - return hs.previousOrNext(el, -1); -}, - -next : function (el) { - return hs.previousOrNext(el, 1); -}, - -keyHandler : function(e) { - if (!e) e = window.event; - if (!e.target) e.target = e.srcElement; // ie - if (typeof e.target.form != 'undefined') return true; // form element has focus - var exp = hs.getExpander(); - - var op = null; - switch (e.keyCode) { - case 70: // f - if (exp) exp.doFullExpand(); - return true; - case 32: // Space - case 34: // Page Down - case 39: // Arrow right - case 40: // Arrow down - op = 1; - break; - case 8: // Backspace - case 33: // Page Up - case 37: // Arrow left - case 38: // Arrow up - op = -1; - break; - case 27: // Escape - case 13: // Enter - op = 0; - } - if (op !== null) {hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - if (!hs.enableKeyListener) return true; - - if (e.preventDefault) e.preventDefault(); - else e.returnValue = false; - if (exp) { - if (op == 0) { - exp.close(); - } else { - hs.previousOrNext(exp.key, op); - } - return false; - } - } - return true; -}, - - -registerOverlay : function (overlay) { - hs.push(hs.overlays, hs.extend(overlay, { hsId: 'hsId'+ hs.idCounter++ } )); -}, - - -getWrapperKey : function (element, expOnly) { - var el, re = /^highslide-wrapper-([0-9]+)$/; - // 1. look in open expanders - el = element; - while (el.parentNode) { - if (el.id && re.test(el.id)) return el.id.replace(re, "$1"); - el = el.parentNode; - } - // 2. look in thumbnail - if (!expOnly) { - el = element; - while (el.parentNode) { - if (el.tagName && hs.isHsAnchor(el)) { - for (var key = 0; key < hs.expanders.length; key++) { - var exp = hs.expanders[key]; - if (exp && exp.a == el) return key; - } - } - el = el.parentNode; - } - } - return null; -}, - -getExpander : function (el, expOnly) { - if (typeof el == 'undefined') return hs.expanders[hs.focusKey] || null; - if (typeof el == 'number') return hs.expanders[el] || null; - if (typeof el == 'string') el = hs.$(el); - return hs.expanders[hs.getWrapperKey(el, expOnly)] || null; -}, - -isHsAnchor : function (a) { - return (a.onclick && a.onclick.toString().replace(/\s/g, ' ').match(/hs.(htmlE|e)xpand/)); -}, - -reOrder : function () { - for (var i = 0; i < hs.expanders.length; i++) - if (hs.expanders[i] && hs.expanders[i].isExpanded) hs.focusTopmost(); -}, - -mouseClickHandler : function(e) -{ - if (!e) e = window.event; - if (e.button > 1) return true; - if (!e.target) e.target = e.srcElement; - - var el = e.target; - while (el.parentNode - && !(/highslide-(image|move|html|resize)/.test(el.className))) - { - el = el.parentNode; - } - var exp = hs.getExpander(el); - if (exp && (exp.isClosing || !exp.isExpanded)) return true; - - if (exp && e.type == 'mousedown') { - if (e.target.form) return true; - var match = el.className.match(/highslide-(image|move|resize)/); - if (match) { - hs.dragArgs = { - exp: exp , - type: match[1], - left: exp.x.pos, - width: exp.x.size, - top: exp.y.pos, - height: exp.y.size, - clickX: e.clientX, - clickY: e.clientY - }; - - - hs.addEventListener(document, 'mousemove', hs.dragHandler); - if (e.preventDefault) e.preventDefault(); // FF - - if (/highslide-(image|html)-blur/.test(exp.content.className)) { - exp.focus(); - hs.hasFocused = true; - } - return false; - } - } else if (e.type == 'mouseup') { - - hs.removeEventListener(document, 'mousemove', hs.dragHandler); - - if (hs.dragArgs) { - if (hs.styleRestoreCursor && hs.dragArgs.type == 'image') - hs.dragArgs.exp.content.style.cursor = hs.styleRestoreCursor; - var hasDragged = hs.dragArgs.hasDragged; - - if (!hasDragged &&!hs.hasFocused && !/(move|resize)/.test(hs.dragArgs.type)) { - exp.close(); - } - else if (hasDragged || (!hasDragged && hs.hasHtmlExpanders)) { - hs.dragArgs.exp.doShowHide('hidden'); - } - hs.hasFocused = false; - hs.dragArgs = null; - - } else if (/highslide-image-blur/.test(el.className)) { - el.style.cursor = hs.styleRestoreCursor; - } - } - return false; -}, - -dragHandler : function(e) -{ - if (!hs.dragArgs) return true; - if (!e) e = window.event; - var a = hs.dragArgs, exp = a.exp; - - a.dX = e.clientX - a.clickX; - a.dY = e.clientY - a.clickY; - - var distance = Math.sqrt(Math.pow(a.dX, 2) + Math.pow(a.dY, 2)); - if (!a.hasDragged) a.hasDragged = (a.type != 'image' && distance > 0) - || (distance > (hs.dragSensitivity || 5)); - - if (a.hasDragged && e.clientX > 5 && e.clientY > 5) { - - if (a.type == 'resize') exp.resize(a); - else { - exp.moveTo(a.left + a.dX, a.top + a.dY); - if (a.type == 'image') exp.content.style.cursor = 'move'; - } - } - return false; -}, - -wrapperMouseHandler : function (e) { - try { - if (!e) e = window.event; - var over = /mouseover/i.test(e.type); - if (!e.target) e.target = e.srcElement; // ie - if (!e.relatedTarget) e.relatedTarget = - over ? e.fromElement : e.toElement; // ie - var exp = hs.getExpander(e.target); - if (!exp.isExpanded) return; - if (!exp || !e.relatedTarget || hs.getExpander(e.relatedTarget, true) == exp - || hs.dragArgs) return; - for (var i = 0; i < exp.overlays.length; i++) (function() { - var o = hs.$('hsId'+ exp.overlays[i]); - if (o && o.hideOnMouseOut) { - if (over) hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: over ? o.opacity : 0 }, o.dur); - } - })(); - } catch (e) {} -}, -addEventListener : function (el, event, func) { - if (el == document && event == 'ready') { - hs.push(hs.onReady, func); - } - try { - el.addEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - el.attachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = func; - } - } -}, - -removeEventListener : function (el, event, func) { - try { - el.removeEventListener(event, func, false); - } catch (e) { - try { - el.detachEvent('on'+ event, func); - } catch (e) { - el['on'+ event] = null; - } - } -}, - -preloadFullImage : function (i) { - if (hs.continuePreloading && hs.preloadTheseImages[i] && hs.preloadTheseImages[i] != 'undefined') { - var img = document.createElement('img'); - img.onload = function() { - img = null; - hs.preloadFullImage(i + 1); - }; - img.src = hs.preloadTheseImages[i]; - } -}, -preloadImages : function (number) { - if (number && typeof number != 'object') hs.numberOfImagesToPreload = number; - - var arr = hs.getAnchors(); - for (var i = 0; i < arr.images.length && i < hs.numberOfImagesToPreload; i++) { - hs.push(hs.preloadTheseImages, hs.getSrc(arr.images[i])); - } - - // preload outlines - if (hs.outlineType) new hs.Outline(hs.outlineType, function () { hs.preloadFullImage(0)} ); - else - - hs.preloadFullImage(0); - - // preload cursor - if (hs.restoreCursor) var cur = hs.createElement('img', { src: hs.graphicsDir + hs.restoreCursor }); -}, - - -init : function () { - if (!hs.container) { - - hs.ieLt7 = hs.ie && hs.uaVersion < 7; - hs.ieLt9 = hs.ie && hs.uaVersion < 9; - - hs.getPageSize(); - for (var x in hs.langDefaults) { - if (typeof hs[x] != 'undefined') hs.lang[x] = hs[x]; - else if (typeof hs.lang[x] == 'undefined' && typeof hs.langDefaults[x] != 'undefined') - hs.lang[x] = hs.langDefaults[x]; - } - - hs.container = hs.createElement('div', { - className: 'highslide-container' - }, { - position: 'absolute', - left: 0, - top: 0, - width: '100%', - zIndex: hs.zIndexCounter, - direction: 'ltr' - }, - document.body, - true - ); - hs.loading = hs.createElement('a', { - className: 'highslide-loading', - title: hs.lang.loadingTitle, - innerHTML: hs.lang.loadingText, - href: 'javascript:;' - }, { - position: 'absolute', - top: '-9999px', - opacity: hs.loadingOpacity, - zIndex: 1 - }, hs.container - ); - hs.garbageBin = hs.createElement('div', null, { display: 'none' }, hs.container); - - // http://www.robertpenner.com/easing/ - Math.linearTween = function (t, b, c, d) { - return c*t/d + b; - }; - Math.easeInQuad = function (t, b, c, d) { - return c*(t/=d)*t + b; - }; - - hs.hideSelects = hs.ieLt7; - hs.hideIframes = ((window.opera && hs.uaVersion < 9) || navigator.vendor == 'KDE' - || (hs.ieLt7 && hs.uaVersion < 5.5)); - } -}, -ready : function() { - if (hs.isReady) return; - hs.isReady = true; - for (var i = 0; i < hs.onReady.length; i++) hs.onReady[i](); -}, - -updateAnchors : function() { - var el, els, all = [], images = [],groups = {}, re; - - for (var i = 0; i < hs.openerTagNames.length; i++) { - els = document.getElementsByTagName(hs.openerTagNames[i]); - for (var j = 0; j < els.length; j++) { - el = els[j]; - re = hs.isHsAnchor(el); - if (re) { - hs.push(all, el); - if (re[0] == 'hs.expand') hs.push(images, el); - var g = hs.getParam(el, 'slideshowGroup') || 'none'; - if (!groups[g]) groups[g] = []; - hs.push(groups[g], el); - } - } - } - hs.anchors = { all: all, groups: groups, images: images }; - return hs.anchors; - -}, - -getAnchors : function() { - return hs.anchors || hs.updateAnchors(); -}, - - -close : function(el) { - var exp = hs.getExpander(el); - if (exp) exp.close(); - return false; -} -}; // end hs object -hs.fx = function( elem, options, prop ){ - this.options = options; - this.elem = elem; - this.prop = prop; - - if (!options.orig) options.orig = {}; -}; -hs.fx.prototype = { - update: function(){ - (hs.fx.step[this.prop] || hs.fx.step._default)(this); - - if (this.options.step) - this.options.step.call(this.elem, this.now, this); - - }, - custom: function(from, to, unit){ - this.startTime = (new Date()).getTime(); - this.start = from; - this.end = to; - this.unit = unit;// || this.unit || "px"; - this.now = this.start; - this.pos = this.state = 0; - - var self = this; - function t(gotoEnd){ - return self.step(gotoEnd); - } - - t.elem = this.elem; - - if ( t() && hs.timers.push(t) == 1 ) { - hs.timerId = setInterval(function(){ - var timers = hs.timers; - - for ( var i = 0; i < timers.length; i++ ) - if ( !timers[i]() ) - timers.splice(i--, 1); - - if ( !timers.length ) { - clearInterval(hs.timerId); - } - }, 13); - } - }, - step: function(gotoEnd){ - var t = (new Date()).getTime(); - if ( gotoEnd || t >= this.options.duration + this.startTime ) { - this.now = this.end; - this.pos = this.state = 1; - this.update(); - - this.options.curAnim[ this.prop ] = true; - - var done = true; - for ( var i in this.options.curAnim ) - if ( this.options.curAnim[i] !== true ) - done = false; - - if ( done ) { - if (this.options.complete) this.options.complete.call(this.elem); - } - return false; - } else { - var n = t - this.startTime; - this.state = n / this.options.duration; - this.pos = this.options.easing(n, 0, 1, this.options.duration); - this.now = this.start + ((this.end - this.start) * this.pos); - this.update(); - } - return true; - } - -}; - -hs.extend( hs.fx, { - step: { - - opacity: function(fx){ - hs.setStyles(fx.elem, { opacity: fx.now }); - }, - - _default: function(fx){ - try { - if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) - fx.elem.style[ fx.prop ] = fx.now + fx.unit; - else - fx.elem[ fx.prop ] = fx.now; - } catch (e) {} - } - } -}); - -hs.Outline = function (outlineType, onLoad) { - this.onLoad = onLoad; - this.outlineType = outlineType; - var v = hs.uaVersion, tr; - - this.hasAlphaImageLoader = hs.ie && hs.uaVersion < 7; - if (!outlineType) { - if (onLoad) onLoad(); - return; - } - - hs.init(); - this.table = hs.createElement( - 'table', { - cellSpacing: 0 - }, { - visibility: 'hidden', - position: 'absolute', - borderCollapse: 'collapse', - width: 0 - }, - hs.container, - true - ); - var tbody = hs.createElement('tbody', null, null, this.table, 1); - - this.td = []; - for (var i = 0; i <= 8; i++) { - if (i % 3 == 0) tr = hs.createElement('tr', null, { height: 'auto' }, tbody, true); - this.td[i] = hs.createElement('td', null, null, tr, true); - var style = i != 4 ? { lineHeight: 0, fontSize: 0} : { position : 'relative' }; - hs.setStyles(this.td[i], style); - } - this.td[4].className = outlineType +' highslide-outline'; - - this.preloadGraphic(); -}; - -hs.Outline.prototype = { -preloadGraphic : function () { - var src = hs.graphicsDir + (hs.outlinesDir || "outlines/")+ this.outlineType +".png"; - - var appendTo = hs.safari && hs.uaVersion < 525 ? hs.container : null; - this.graphic = hs.createElement('img', null, { position: 'absolute', - top: '-9999px' }, appendTo, true); // for onload trigger - - var pThis = this; - this.graphic.onload = function() { pThis.onGraphicLoad(); }; - - this.graphic.src = src; -}, - -onGraphicLoad : function () { - var o = this.offset = this.graphic.width / 4, - pos = [[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]], - dim = { height: (2*o) +'px', width: (2*o) +'px' }; - for (var i = 0; i <= 8; i++) { - if (pos[i]) { - if (this.hasAlphaImageLoader) { - var w = (i == 1 || i == 7) ? '100%' : this.graphic.width +'px'; - var div = hs.createElement('div', null, { width: '100%', height: '100%', position: 'relative', overflow: 'hidden'}, this.td[i], true); - hs.createElement ('div', null, { - filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+ this.graphic.src + "')", - position: 'absolute', - width: w, - height: this.graphic.height +'px', - left: (pos[i][0]*o)+'px', - top: (pos[i][1]*o)+'px' - }, - div, - true); - } else { - hs.setStyles(this.td[i], { background: 'url('+ this.graphic.src +') '+ (pos[i][0]*o)+'px '+(pos[i][1]*o)+'px'}); - } - - if (window.opera && (i == 3 || i ==5)) - hs.createElement('div', null, dim, this.td[i], true); - - hs.setStyles (this.td[i], dim); - } - } - this.graphic = null; - if (hs.pendingOutlines[this.outlineType]) hs.pendingOutlines[this.outlineType].destroy(); - hs.pendingOutlines[this.outlineType] = this; - if (this.onLoad) this.onLoad(); -}, - -setPosition : function (pos, offset, vis, dur, easing) { - var exp = this.exp, - stl = exp.wrapper.style, - offset = offset || 0, - pos = pos || { - x: exp.x.pos + offset, - y: exp.y.pos + offset, - w: exp.x.get('wsize') - 2 * offset, - h: exp.y.get('wsize') - 2 * offset - }; - if (vis) this.table.style.visibility = (pos.h >= 4 * this.offset) - ? 'visible' : 'hidden'; - hs.setStyles(this.table, { - left: (pos.x - this.offset) +'px', - top: (pos.y - this.offset) +'px', - width: (pos.w + 2 * this.offset) +'px' - }); - - pos.w -= 2 * this.offset; - pos.h -= 2 * this.offset; - hs.setStyles (this.td[4], { - width: pos.w >= 0 ? pos.w +'px' : 0, - height: pos.h >= 0 ? pos.h +'px' : 0 - }); - if (this.hasAlphaImageLoader) this.td[3].style.height - = this.td[5].style.height = this.td[4].style.height; - -}, - -destroy : function(hide) { - if (hide) this.table.style.visibility = 'hidden'; - else hs.discardElement(this.table); -} -}; - -hs.Dimension = function(exp, dim) { - this.exp = exp; - this.dim = dim; - this.ucwh = dim == 'x' ? 'Width' : 'Height'; - this.wh = this.ucwh.toLowerCase(); - this.uclt = dim == 'x' ? 'Left' : 'Top'; - this.lt = this.uclt.toLowerCase(); - this.ucrb = dim == 'x' ? 'Right' : 'Bottom'; - this.rb = this.ucrb.toLowerCase(); - this.p1 = this.p2 = 0; -}; -hs.Dimension.prototype = { -get : function(key) { - switch (key) { - case 'loadingPos': - return this.tpos + this.tb + (this.t - hs.loading['offset'+ this.ucwh]) / 2; - case 'wsize': - return this.size + 2 * this.cb + this.p1 + this.p2; - case 'fitsize': - return this.clientSize - this.marginMin - this.marginMax; - case 'maxsize': - return this.get('fitsize') - 2 * this.cb - this.p1 - this.p2 ; - case 'opos': - return this.pos - (this.exp.outline ? this.exp.outline.offset : 0); - case 'osize': - return this.get('wsize') + (this.exp.outline ? 2*this.exp.outline.offset : 0); - case 'imgPad': - return this.imgSize ? Math.round((this.size - this.imgSize) / 2) : 0; - - } -}, -calcBorders: function() { - // correct for borders - this.cb = (this.exp.content['offset'+ this.ucwh] - this.t) / 2; - - this.marginMax = hs['margin'+ this.ucrb]; -}, -calcThumb: function() { - this.t = this.exp.el[this.wh] ? parseInt(this.exp.el[this.wh]) : - this.exp.el['offset'+ this.ucwh]; - this.tpos = this.exp.tpos[this.dim]; - this.tb = (this.exp.el['offset'+ this.ucwh] - this.t) / 2; - if (this.tpos == 0 || this.tpos == -1) { - this.tpos = (hs.page[this.wh] / 2) + hs.page['scroll'+ this.uclt]; - }; -}, -calcExpanded: function() { - var exp = this.exp; - this.justify = 'auto'; - - - // size and position - this.pos = this.tpos - this.cb + this.tb; - - if (this.maxHeight && this.dim == 'x') - exp.maxWidth = Math.min(exp.maxWidth || this.full, exp.maxHeight * this.full / exp.y.full); - - this.size = Math.min(this.full, exp['max'+ this.ucwh] || this.full); - this.minSize = exp.allowSizeReduction ? - Math.min(exp['min'+ this.ucwh], this.full) :this.full; - if (exp.isImage && exp.useBox) { - this.size = exp[this.wh]; - this.imgSize = this.full; - } - if (this.dim == 'x' && hs.padToMinWidth) this.minSize = exp.minWidth; - this.marginMin = hs['margin'+ this.uclt]; - this.scroll = hs.page['scroll'+ this.uclt]; - this.clientSize = hs.page[this.wh]; -}, -setSize: function(i) { - var exp = this.exp; - if (exp.isImage && (exp.useBox || hs.padToMinWidth)) { - this.imgSize = i; - this.size = Math.max(this.size, this.imgSize); - exp.content.style[this.lt] = this.get('imgPad')+'px'; - } else - this.size = i; - - exp.content.style[this.wh] = i +'px'; - exp.wrapper.style[this.wh] = this.get('wsize') +'px'; - if (exp.outline) exp.outline.setPosition(); - if (this.dim == 'x' && exp.overlayBox) exp.sizeOverlayBox(true); -}, -setPos: function(i) { - this.pos = i; - this.exp.wrapper.style[this.lt] = i +'px'; - - if (this.exp.outline) this.exp.outline.setPosition(); - -} -}; - -hs.Expander = function(a, params, custom, contentType) { - if (document.readyState && hs.ie && !hs.isReady) { - hs.addEventListener(document, 'ready', function() { - new hs.Expander(a, params, custom, contentType); - }); - return; - } - this.a = a; - this.custom = custom; - this.contentType = contentType || 'image'; - this.isImage = !this.isHtml; - - hs.continuePreloading = false; - this.overlays = []; - hs.init(); - var key = this.key = hs.expanders.length; - // override inline parameters - for (var i = 0; i < hs.overrides.length; i++) { - var name = hs.overrides[i]; - this[name] = params && typeof params[name] != 'undefined' ? - params[name] : hs[name]; - } - if (!this.src) this.src = a.href; - - // get thumb - var el = (params && params.thumbnailId) ? hs.$(params.thumbnailId) : a; - el = this.thumb = el.getElementsByTagName('img')[0] || el; - this.thumbsUserSetId = el.id || a.id; - - // check if already open - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].a == a) { - hs.expanders[i].focus(); - return false; - } - } - - // cancel other - if (!hs.allowSimultaneousLoading) for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && hs.expanders[i].thumb != el && !hs.expanders[i].onLoadStarted) { - hs.expanders[i].cancelLoading(); - } - } - hs.expanders[key] = this; - if (!hs.allowMultipleInstances && !hs.upcoming) { - if (hs.expanders[key-1]) hs.expanders[key-1].close(); - if (typeof hs.focusKey != 'undefined' && hs.expanders[hs.focusKey]) - hs.expanders[hs.focusKey].close(); - } - - // initiate metrics - this.el = el; - this.tpos = this.pageOrigin || hs.getPosition(el); - hs.getPageSize(); - var x = this.x = new hs.Dimension(this, 'x'); - x.calcThumb(); - var y = this.y = new hs.Dimension(this, 'y'); - y.calcThumb(); - this.wrapper = hs.createElement( - 'div', { - id: 'highslide-wrapper-'+ this.key, - className: 'highslide-wrapper '+ this.wrapperClassName - }, { - visibility: 'hidden', - position: 'absolute', - zIndex: hs.zIndexCounter += 2 - }, null, true ); - - this.wrapper.onmouseover = this.wrapper.onmouseout = hs.wrapperMouseHandler; - if (this.contentType == 'image' && this.outlineWhileAnimating == 2) - this.outlineWhileAnimating = 0; - - // get the outline - if (!this.outlineType) { - this[this.contentType +'Create'](); - - } else if (hs.pendingOutlines[this.outlineType]) { - this.connectOutline(); - this[this.contentType +'Create'](); - - } else { - this.showLoading(); - var exp = this; - new hs.Outline(this.outlineType, - function () { - exp.connectOutline(); - exp[exp.contentType +'Create'](); - } - ); - } - return true; -}; - -hs.Expander.prototype = { -error : function(e) { - if (hs.debug) alert ('Line '+ e.lineNumber +': '+ e.message); - else window.location.href = this.src; -}, - -connectOutline : function() { - var outline = this.outline = hs.pendingOutlines[this.outlineType]; - outline.exp = this; - outline.table.style.zIndex = this.wrapper.style.zIndex - 1; - hs.pendingOutlines[this.outlineType] = null; -}, - -showLoading : function() { - if (this.onLoadStarted || this.loading) return; - - this.loading = hs.loading; - var exp = this; - this.loading.onclick = function() { - exp.cancelLoading(); - }; - var exp = this, - l = this.x.get('loadingPos') +'px', - t = this.y.get('loadingPos') +'px'; - setTimeout(function () { - if (exp.loading) hs.setStyles(exp.loading, { left: l, top: t, zIndex: hs.zIndexCounter++ })} - , 100); -}, - -imageCreate : function() { - var exp = this; - - var img = document.createElement('img'); - this.content = img; - img.onload = function () { - if (hs.expanders[exp.key]) exp.contentLoaded(); - }; - if (hs.blockRightClick) img.oncontextmenu = function() { return false; }; - img.className = 'highslide-image'; - hs.setStyles(img, { - visibility: 'hidden', - display: 'block', - position: 'absolute', - maxWidth: '9999px', - zIndex: 3 - }); - img.title = hs.lang.restoreTitle; - if (hs.safari && hs.uaVersion < 525) hs.container.appendChild(img); - if (hs.ie && hs.flushImgSize) img.src = null; - img.src = this.src; - - this.showLoading(); -}, - -contentLoaded : function() { - try { - if (!this.content) return; - this.content.onload = null; - if (this.onLoadStarted) return; - else this.onLoadStarted = true; - - var x = this.x, y = this.y; - - if (this.loading) { - hs.setStyles(this.loading, { top: '-9999px' }); - this.loading = null; - } - x.full = this.content.width; - y.full = this.content.height; - - hs.setStyles(this.content, { - width: x.t +'px', - height: y.t +'px' - }); - this.wrapper.appendChild(this.content); - hs.container.appendChild(this.wrapper); - - x.calcBorders(); - y.calcBorders(); - - hs.setStyles (this.wrapper, { - left: (x.tpos + x.tb - x.cb) +'px', - top: (y.tpos + x.tb - y.cb) +'px' - }); - this.getOverlays(); - - var ratio = x.full / y.full; - x.calcExpanded(); - this.justify(x); - - y.calcExpanded(); - this.justify(y); - if (this.overlayBox) this.sizeOverlayBox(0, 1); - - - if (this.allowSizeReduction) { - this.correctRatio(ratio); - if (this.isImage && this.x.full > (this.x.imgSize || this.x.size)) { - this.createFullExpand(); - if (this.overlays.length == 1) this.sizeOverlayBox(); - } - } - this.show(); - - } catch (e) { - this.error(e); - } -}, - -justify : function (p, moveOnly) { - var tgtArr, tgt = p.target, dim = p == this.x ? 'x' : 'y'; - - var hasMovedMin = false; - - var allowReduce = p.exp.allowSizeReduction; - p.pos = Math.round(p.pos - ((p.get('wsize') - p.t) / 2)); - if (p.pos < p.scroll + p.marginMin) { - p.pos = p.scroll + p.marginMin; - hasMovedMin = true; - } - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - if (p.pos + p.get('wsize') > p.scroll + p.clientSize - p.marginMax) { - if (!moveOnly && hasMovedMin && allowReduce) { - p.size = Math.min(p.size, p.get(dim == 'y' ? 'fitsize' : 'maxsize')); - } else if (p.get('wsize') < p.get('fitsize')) { - p.pos = p.scroll + p.clientSize - p.marginMax - p.get('wsize'); - } else { // image larger than viewport - p.pos = p.scroll + p.marginMin; - if (!moveOnly && allowReduce) p.size = p.get(dim == 'y' ? 'fitsize' : 'maxsize'); - } - } - - if (!moveOnly && p.size < p.minSize) { - p.size = p.minSize; - allowReduce = false; - } - - - - if (p.pos < p.marginMin) { - var tmpMin = p.pos; - p.pos = p.marginMin; - - if (allowReduce && !moveOnly) p.size = p.size - (p.pos - tmpMin); - - } -}, - -correctRatio : function(ratio) { - var x = this.x, - y = this.y, - changed = false, - xSize = Math.min(x.full, x.size), - ySize = Math.min(y.full, y.size), - useBox = (this.useBox || hs.padToMinWidth); - - if (xSize / ySize > ratio) { // width greater - xSize = ySize * ratio; - if (xSize < x.minSize) { // below minWidth - xSize = x.minSize; - ySize = xSize / ratio; - } - changed = true; - - } else if (xSize / ySize < ratio) { // height greater - ySize = xSize / ratio; - changed = true; - } - - if (hs.padToMinWidth && x.full < x.minSize) { - x.imgSize = x.full; - y.size = y.imgSize = y.full; - } else if (this.useBox) { - x.imgSize = xSize; - y.imgSize = ySize; - } else { - x.size = xSize; - y.size = ySize; - } - changed = this.fitOverlayBox(this.useBox ? null : ratio, changed); - if (useBox && y.size < y.imgSize) { - y.imgSize = y.size; - x.imgSize = y.size * ratio; - } - if (changed || useBox) { - x.pos = x.tpos - x.cb + x.tb; - x.minSize = x.size; - this.justify(x, true); - - y.pos = y.tpos - y.cb + y.tb; - y.minSize = y.size; - this.justify(y, true); - if (this.overlayBox) this.sizeOverlayBox(); - } - - -}, -fitOverlayBox : function(ratio, changed) { - var x = this.x, y = this.y; - if (this.overlayBox) { - while (y.size > this.minHeight && x.size > this.minWidth - && y.get('wsize') > y.get('fitsize')) { - y.size -= 10; - if (ratio) x.size = y.size * ratio; - this.sizeOverlayBox(0, 1); - changed = true; - } - } - return changed; -}, - -show : function () { - var x = this.x, y = this.y; - this.doShowHide('hidden'); - - // Apply size change - this.changeSize( - 1, { - wrapper: { - width : x.get('wsize'), - height : y.get('wsize'), - left: x.pos, - top: y.pos - }, - content: { - left: x.p1 + x.get('imgPad'), - top: y.p1 + y.get('imgPad'), - width:x.imgSize ||x.size, - height:y.imgSize ||y.size - } - }, - hs.expandDuration - ); -}, - -changeSize : function(up, to, dur) { - - if (this.outline && !this.outlineWhileAnimating) { - if (up) this.outline.setPosition(); - else this.outline.destroy(); - } - - - if (!up) this.destroyOverlays(); - - var exp = this, - x = exp.x, - y = exp.y, - easing = this.easing; - if (!up) easing = this.easingClose || easing; - var after = up ? - function() { - - if (exp.outline) exp.outline.table.style.visibility = "visible"; - setTimeout(function() { - exp.afterExpand(); - }, 50); - } : - function() { - exp.afterClose(); - }; - if (up) hs.setStyles( this.wrapper, { - width: x.t +'px', - height: y.t +'px' - }); - if (this.fadeInOut) { - hs.setStyles(this.wrapper, { opacity: up ? 0 : 1 }); - hs.extend(to.wrapper, { opacity: up }); - } - hs.animate( this.wrapper, to.wrapper, { - duration: dur, - easing: easing, - step: function(val, args) { - if (exp.outline && exp.outlineWhileAnimating && args.prop == 'top') { - var fac = up ? args.pos : 1 - args.pos; - var pos = { - w: x.t + (x.get('wsize') - x.t) * fac, - h: y.t + (y.get('wsize') - y.t) * fac, - x: x.tpos + (x.pos - x.tpos) * fac, - y: y.tpos + (y.pos - y.tpos) * fac - }; - exp.outline.setPosition(pos, 0, 1); - } - } - }); - hs.animate( this.content, to.content, dur, easing, after); - if (up) { - this.wrapper.style.visibility = 'visible'; - this.content.style.visibility = 'visible'; - this.a.className += ' highslide-active-anchor'; - } -}, - - - - -afterExpand : function() { - this.isExpanded = true; - this.focus(); - if (hs.upcoming && hs.upcoming == this.a) hs.upcoming = null; - this.prepareNextOutline(); - var p = hs.page, mX = hs.mouse.x + p.scrollLeft, mY = hs.mouse.y + p.scrollTop; - this.mouseIsOver = this.x.pos < mX && mX < this.x.pos + this.x.get('wsize') - && this.y.pos < mY && mY < this.y.pos + this.y.get('wsize'); - if (this.overlayBox) this.showOverlays(); - -}, - - -prepareNextOutline : function() { - var key = this.key; - var outlineType = this.outlineType; - new hs.Outline(outlineType, - function () { try { hs.expanders[key].preloadNext(); } catch (e) {} }); -}, - - -preloadNext : function() { - var next = this.getAdjacentAnchor(1); - if (next && next.onclick.toString().match(/hs\.expand/)) - var img = hs.createElement('img', { src: hs.getSrc(next) }); -}, - - -getAdjacentAnchor : function(op) { - var current = this.getAnchorIndex(), as = hs.anchors.groups[this.slideshowGroup || 'none']; - return (as && as[current + op]) || null; -}, - -getAnchorIndex : function() { - var arr = hs.getAnchors().groups[this.slideshowGroup || 'none']; - if (arr) for (var i = 0; i < arr.length; i++) { - if (arr[i] == this.a) return i; - } - return null; -}, - - -cancelLoading : function() { - hs.discardElement (this.wrapper); - hs.expanders[this.key] = null; - if (this.loading) hs.loading.style.left = '-9999px'; -}, - -writeCredits : function () { - this.credits = hs.createElement('a', { - href: hs.creditsHref, - target: hs.creditsTarget, - className: 'highslide-credits', - innerHTML: hs.lang.creditsText, - title: hs.lang.creditsTitle - }); - this.createOverlay({ - overlayId: this.credits, - position: this.creditsPosition || 'top left' - }); -}, - -getInline : function(types, addOverlay) { - for (var i = 0; i < types.length; i++) { - var type = types[i], s = null; - if (!this[type +'Id'] && this.thumbsUserSetId) - this[type +'Id'] = type +'-for-'+ this.thumbsUserSetId; - if (this[type +'Id']) this[type] = hs.getNode(this[type +'Id']); - if (!this[type] && !this[type +'Text'] && this[type +'Eval']) try { - s = eval(this[type +'Eval']); - } catch (e) {} - if (!this[type] && this[type +'Text']) { - s = this[type +'Text']; - } - if (!this[type] && !s) { - this[type] = hs.getNode(this.a['_'+ type + 'Id']); - if (!this[type]) { - var next = this.a.nextSibling; - while (next && !hs.isHsAnchor(next)) { - if ((new RegExp('highslide-'+ type)).test(next.className || null)) { - if (!next.id) this.a['_'+ type + 'Id'] = next.id = 'hsId'+ hs.idCounter++; - this[type] = hs.getNode(next.id); - break; - } - next = next.nextSibling; - } - } - } - - if (!this[type] && s) this[type] = hs.createElement('div', - { className: 'highslide-'+ type, innerHTML: s } ); - - if (addOverlay && this[type]) { - var o = { position: (type == 'heading') ? 'above' : 'below' }; - for (var x in this[type+'Overlay']) o[x] = this[type+'Overlay'][x]; - o.overlayId = this[type]; - this.createOverlay(o); - } - } -}, - - -// on end move and resize -doShowHide : function(visibility) { - if (hs.hideSelects) this.showHideElements('SELECT', visibility); - if (hs.hideIframes) this.showHideElements('IFRAME', visibility); - if (hs.geckoMac) this.showHideElements('*', visibility); -}, -showHideElements : function (tagName, visibility) { - var els = document.getElementsByTagName(tagName); - var prop = tagName == '*' ? 'overflow' : 'visibility'; - for (var i = 0; i < els.length; i++) { - if (prop == 'visibility' || (document.defaultView.getComputedStyle( - els[i], "").getPropertyValue('overflow') == 'auto' - || els[i].getAttribute('hidden-by') != null)) { - var hiddenBy = els[i].getAttribute('hidden-by'); - if (visibility == 'visible' && hiddenBy) { - hiddenBy = hiddenBy.replace('['+ this.key +']', ''); - els[i].setAttribute('hidden-by', hiddenBy); - if (!hiddenBy) els[i].style[prop] = els[i].origProp; - } else if (visibility == 'hidden') { // hide if behind - var elPos = hs.getPosition(els[i]); - elPos.w = els[i].offsetWidth; - elPos.h = els[i].offsetHeight; - - - var clearsX = (elPos.x + elPos.w < this.x.get('opos') - || elPos.x > this.x.get('opos') + this.x.get('osize')); - var clearsY = (elPos.y + elPos.h < this.y.get('opos') - || elPos.y > this.y.get('opos') + this.y.get('osize')); - var wrapperKey = hs.getWrapperKey(els[i]); - if (!clearsX && !clearsY && wrapperKey != this.key) { // element falls behind image - if (!hiddenBy) { - els[i].setAttribute('hidden-by', '['+ this.key +']'); - els[i].origProp = els[i].style[prop]; - els[i].style[prop] = 'hidden'; - - } else if (hiddenBy.indexOf('['+ this.key +']') == -1) { - els[i].setAttribute('hidden-by', hiddenBy + '['+ this.key +']'); - } - } else if ((hiddenBy == '['+ this.key +']' || hs.focusKey == wrapperKey) - && wrapperKey != this.key) { // on move - els[i].setAttribute('hidden-by', ''); - els[i].style[prop] = els[i].origProp || ''; - } else if (hiddenBy && hiddenBy.indexOf('['+ this.key +']') > -1) { - els[i].setAttribute('hidden-by', hiddenBy.replace('['+ this.key +']', '')); - } - - } - } - } -}, - -focus : function() { - this.wrapper.style.zIndex = hs.zIndexCounter += 2; - // blur others - for (var i = 0; i < hs.expanders.length; i++) { - if (hs.expanders[i] && i == hs.focusKey) { - var blurExp = hs.expanders[i]; - blurExp.content.className += ' highslide-'+ blurExp.contentType +'-blur'; - blurExp.content.style.cursor = hs.ieLt7 ? 'hand' : 'pointer'; - blurExp.content.title = hs.lang.focusTitle; - } - } - - // focus this - if (this.outline) this.outline.table.style.zIndex - = this.wrapper.style.zIndex - 1; - this.content.className = 'highslide-'+ this.contentType; - this.content.title = hs.lang.restoreTitle; - - if (hs.restoreCursor) { - hs.styleRestoreCursor = window.opera ? 'pointer' : 'url('+ hs.graphicsDir + hs.restoreCursor +'), pointer'; - if (hs.ieLt7 && hs.uaVersion < 6) hs.styleRestoreCursor = 'hand'; - this.content.style.cursor = hs.styleRestoreCursor; - } - - hs.focusKey = this.key; - hs.addEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); -}, -moveTo: function(x, y) { - this.x.setPos(x); - this.y.setPos(y); -}, -resize : function (e) { - var w, h, r = e.width / e.height; - w = Math.max(e.width + e.dX, Math.min(this.minWidth, this.x.full)); - if (this.isImage && Math.abs(w - this.x.full) < 12) w = this.x.full; - h = w / r; - if (h < Math.min(this.minHeight, this.y.full)) { - h = Math.min(this.minHeight, this.y.full); - if (this.isImage) w = h * r; - } - this.resizeTo(w, h); -}, -resizeTo: function(w, h) { - this.y.setSize(h); - this.x.setSize(w); - this.wrapper.style.height = this.y.get('wsize') +'px'; -}, - -close : function() { - if (this.isClosing || !this.isExpanded) return; - this.isClosing = true; - - hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler); - - try { - this.content.style.cursor = 'default'; - this.changeSize( - 0, { - wrapper: { - width : this.x.t, - height : this.y.t, - left: this.x.tpos - this.x.cb + this.x.tb, - top: this.y.tpos - this.y.cb + this.y.tb - }, - content: { - left: 0, - top: 0, - width: this.x.t, - height: this.y.t - } - }, hs.restoreDuration - ); - } catch (e) { this.afterClose(); } -}, - -createOverlay : function (o) { - var el = o.overlayId; - if (typeof el == 'string') el = hs.getNode(el); - if (o.html) el = hs.createElement('div', { innerHTML: o.html }); - if (!el || typeof el == 'string') return; - el.style.display = 'block'; - this.genOverlayBox(); - var width = o.width && /^[0-9]+(px|%)$/.test(o.width) ? o.width : 'auto'; - if (/^(left|right)panel$/.test(o.position) && !/^[0-9]+px$/.test(o.width)) width = '200px'; - var overlay = hs.createElement( - 'div', { - id: 'hsId'+ hs.idCounter++, - hsId: o.hsId - }, { - position: 'absolute', - visibility: 'hidden', - width: width, - direction: hs.lang.cssDirection || '', - opacity: 0 - },this.overlayBox, - true - ); - - overlay.appendChild(el); - hs.extend(overlay, { - opacity: 1, - offsetX: 0, - offsetY: 0, - dur: (o.fade === 0 || o.fade === false || (o.fade == 2 && hs.ie)) ? 0 : 250 - }); - hs.extend(overlay, o); - - - if (this.gotOverlays) { - this.positionOverlay(overlay); - if (!overlay.hideOnMouseOut || this.mouseIsOver) - hs.animate(overlay, { opacity: overlay.opacity }, overlay.dur); - } - hs.push(this.overlays, hs.idCounter - 1); -}, -positionOverlay : function(overlay) { - var p = overlay.position || 'middle center', - offX = overlay.offsetX, - offY = overlay.offsetY; - if (overlay.parentNode != this.overlayBox) this.overlayBox.appendChild(overlay); - if (/left$/.test(p)) overlay.style.left = offX +'px'; - - if (/center$/.test(p)) hs.setStyles (overlay, { - left: '50%', - marginLeft: (offX - Math.round(overlay.offsetWidth / 2)) +'px' - }); - - if (/right$/.test(p)) overlay.style.right = - offX +'px'; - - if (/^leftpanel$/.test(p)) { - hs.setStyles(overlay, { - right: '100%', - marginRight: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p1 = overlay.offsetWidth; - - } else if (/^rightpanel$/.test(p)) { - hs.setStyles(overlay, { - left: '100%', - marginLeft: this.x.cb +'px', - top: - this.y.cb +'px', - bottom: - this.y.cb +'px', - overflow: 'auto' - }); - this.x.p2 = overlay.offsetWidth; - } - - if (/^top/.test(p)) overlay.style.top = offY +'px'; - if (/^middle/.test(p)) hs.setStyles (overlay, { - top: '50%', - marginTop: (offY - Math.round(overlay.offsetHeight / 2)) +'px' - }); - if (/^bottom/.test(p)) overlay.style.bottom = - offY +'px'; - if (/^above$/.test(p)) { - hs.setStyles(overlay, { - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - bottom: '100%', - marginBottom: this.y.cb +'px', - width: 'auto' - }); - this.y.p1 = overlay.offsetHeight; - - } else if (/^below$/.test(p)) { - hs.setStyles(overlay, { - position: 'relative', - left: (- this.x.p1 - this.x.cb) +'px', - right: (- this.x.p2 - this.x.cb) +'px', - top: '100%', - marginTop: this.y.cb +'px', - width: 'auto' - }); - this.y.p2 = overlay.offsetHeight; - overlay.style.position = 'absolute'; - } -}, - -getOverlays : function() { - this.getInline(['heading', 'caption'], true); - if (this.heading && this.dragByHeading) this.heading.className += ' highslide-move'; - if (hs.showCredits) this.writeCredits(); - for (var i = 0; i < hs.overlays.length; i++) { - var o = hs.overlays[i], tId = o.thumbnailId, sg = o.slideshowGroup; - if ((!tId && !sg) || (tId && tId == this.thumbsUserSetId) - || (sg && sg === this.slideshowGroup)) { - this.createOverlay(o); - } - } - var os = []; - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - if (/panel$/.test(o.position)) this.positionOverlay(o); - else hs.push(os, o); - } - for (var i = 0; i < os.length; i++) this.positionOverlay(os[i]); - this.gotOverlays = true; -}, -genOverlayBox : function() { - if (!this.overlayBox) this.overlayBox = hs.createElement ( - 'div', { - className: this.wrapperClassName - }, { - position : 'absolute', - width: (this.x.size || (this.useBox ? this.width : null) - || this.x.full) +'px', - height: (this.y.size || this.y.full) +'px', - visibility : 'hidden', - overflow : 'hidden', - zIndex : hs.ie ? 4 : 'auto' - }, - hs.container, - true - ); -}, -sizeOverlayBox : function(doWrapper, doPanels) { - var overlayBox = this.overlayBox, - x = this.x, - y = this.y; - hs.setStyles( overlayBox, { - width: x.size +'px', - height: y.size +'px' - }); - if (doWrapper || doPanels) { - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - var ie6 = (hs.ieLt7 || document.compatMode == 'BackCompat'); - if (o && /^(above|below)$/.test(o.position)) { - if (ie6) { - o.style.width = (overlayBox.offsetWidth + 2 * x.cb - + x.p1 + x.p2) +'px'; - } - y[o.position == 'above' ? 'p1' : 'p2'] = o.offsetHeight; - } - if (o && ie6 && /^(left|right)panel$/.test(o.position)) { - o.style.height = (overlayBox.offsetHeight + 2* y.cb) +'px'; - } - } - } - if (doWrapper) { - hs.setStyles(this.content, { - top: y.p1 +'px' - }); - hs.setStyles(overlayBox, { - top: (y.p1 + y.cb) +'px' - }); - } -}, - -showOverlays : function() { - var b = this.overlayBox; - b.className = ''; - hs.setStyles(b, { - top: (this.y.p1 + this.y.cb) +'px', - left: (this.x.p1 + this.x.cb) +'px', - overflow : 'visible' - }); - if (hs.safari) b.style.visibility = 'visible'; - this.wrapper.appendChild (b); - for (var i = 0; i < this.overlays.length; i++) { - var o = hs.$('hsId'+ this.overlays[i]); - o.style.zIndex = o.zIndex || 4; - if (!o.hideOnMouseOut || this.mouseIsOver) { - o.style.visibility = 'visible'; - hs.setStyles(o, { visibility: 'visible', display: '' }); - hs.animate(o, { opacity: o.opacity }, o.dur); - } - } -}, - -destroyOverlays : function() { - if (!this.overlays.length) return; - hs.discardElement(this.overlayBox); -}, - - - -createFullExpand : function () { - this.fullExpandLabel = hs.createElement( - 'a', { - href: 'javascript:hs.expanders['+ this.key +'].doFullExpand();', - title: hs.lang.fullExpandTitle, - className: 'highslide-full-expand' - } - ); - - this.createOverlay({ - overlayId: this.fullExpandLabel, - position: hs.fullExpandPosition, - hideOnMouseOut: true, - opacity: hs.fullExpandOpacity - }); -}, - -doFullExpand : function () { - try { - if (this.fullExpandLabel) hs.discardElement(this.fullExpandLabel); - - this.focus(); - var xSize = this.x.size, - ySize = this.y.size; - this.resizeTo(this.x.full, this.y.full); - - var xpos = this.x.pos - (this.x.size - xSize) / 2; - if (xpos < hs.marginLeft) xpos = hs.marginLeft; - - var ypos = this.y.pos - (this.y.size - ySize) / 2; - if (ypos < hs.marginTop) ypos = hs.marginTop; - - this.moveTo(xpos, ypos); - this.doShowHide('hidden'); - - } catch (e) { - this.error(e); - } -}, - - -afterClose : function () { - this.a.className = this.a.className.replace('highslide-active-anchor', ''); - - this.doShowHide('visible'); - if (this.outline && this.outlineWhileAnimating) this.outline.destroy(); - - hs.discardElement(this.wrapper); - - hs.expanders[this.key] = null; - hs.reOrder(); -} - -}; -hs.langDefaults = hs.lang; -// history -var HsExpander = hs.Expander; -if (hs.ie && window == window.top) { - (function () { - try { - document.documentElement.doScroll('left'); - } catch (e) { - setTimeout(arguments.callee, 50); - return; - } - hs.ready(); - })(); -} -hs.addEventListener(document, 'DOMContentLoaded', hs.ready); -hs.addEventListener(window, 'load', hs.ready); - -// set handlers -hs.addEventListener(document, 'ready', function() { - if (hs.expandCursor) { - var style = hs.createElement('style', { type: 'text/css' }, null, - document.getElementsByTagName('HEAD')[0]), - backCompat = document.compatMode == 'BackCompat'; - - - function addRule(sel, dec) { - if (hs.ie && (hs.uaVersion < 9 || backCompat)) { - var last = document.styleSheets[document.styleSheets.length - 1]; - if (typeof(last.addRule) == "object") last.addRule(sel, dec); - } else { - style.appendChild(document.createTextNode(sel + " {" + dec + "}")); - } - } - function fix(prop) { - return 'expression( ( ( ignoreMe = document.documentElement.'+ prop + - ' ? document.documentElement.'+ prop +' : document.body.'+ prop +' ) ) + \'px\' );'; - } - if (hs.expandCursor) addRule ('.highslide img', - 'cursor: url('+ hs.graphicsDir + hs.expandCursor +'), pointer !important;'); - } -}); -hs.addEventListener(window, 'resize', function() { - hs.getPageSize(); -}); -hs.addEventListener(document, 'mousemove', function(e) { - hs.mouse = { x: e.clientX, y: e.clientY }; -}); -hs.addEventListener(document, 'mousedown', hs.mouseClickHandler); -hs.addEventListener(document, 'mouseup', hs.mouseClickHandler); - -hs.addEventListener(document, 'ready', hs.getAnchors); -hs.addEventListener(window, 'load', hs.preloadImages); -} diff --git a/Website/static/highslide/highslide/highslide.min.js b/Website/static/highslide/highslide/highslide.min.js deleted file mode 100644 index 44e11b9..0000000 --- a/Website/static/highslide/highslide/highslide.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Name: Highslide JS - * Version: 4.1.13 (2011-10-06) - * Config: default - * Author: Torstein Hønsi - * Support: www.highslide.com/support - * License: www.highslide.com/#license - */ -if(!hs){var hs={lang:{cssDirection:"ltr",loadingText:"Loading...",loadingTitle:"Click to cancel",focusTitle:"Click to bring to front",fullExpandTitle:"Expand to actual size (f)",creditsText:"Powered by Highslide JS",creditsTitle:"Go to the Highslide JS homepage",restoreTitle:"Click to close image, click and drag to move. Use arrow keys for next and previous."},graphicsDir:"highslide/graphics/",expandCursor:"zoomin.cur",restoreCursor:"zoomout.cur",expandDuration:250,restoreDuration:250,marginLeft:15,marginRight:15,marginTop:15,marginBottom:15,zIndexCounter:1001,loadingOpacity:0.75,allowMultipleInstances:true,numberOfImagesToPreload:5,outlineWhileAnimating:2,outlineStartOffset:3,padToMinWidth:false,fullExpandPosition:"bottom right",fullExpandOpacity:1,showCredits:true,creditsHref:"http://highslide.com/",creditsTarget:"_self",enableKeyListener:true,openerTagNames:["a"],dragByHeading:true,minWidth:200,minHeight:200,allowSizeReduction:true,outlineType:"drop-shadow",preloadTheseImages:[],continuePreloading:true,expanders:[],overrides:["allowSizeReduction","useBox","outlineType","outlineWhileAnimating","captionId","captionText","captionEval","captionOverlay","headingId","headingText","headingEval","headingOverlay","creditsPosition","dragByHeading","width","height","wrapperClassName","minWidth","minHeight","maxWidth","maxHeight","pageOrigin","slideshowGroup","easing","easingClose","fadeInOut","src"],overlays:[],idCounter:0,oPos:{x:["leftpanel","left","center","right","rightpanel"],y:["above","top","middle","bottom","below"]},mouse:{},headingOverlay:{},captionOverlay:{},timers:[],pendingOutlines:{},clones:{},onReady:[],uaVersion:/Trident\/4\.0/.test(navigator.userAgent)?8:parseFloat((navigator.userAgent.toLowerCase().match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1]),ie:(document.all&&!window.opera),safari:/Safari/.test(navigator.userAgent),geckoMac:/Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent),$:function(a){if(a){return document.getElementById(a)}},push:function(a,b){a[a.length]=b},createElement:function(a,f,e,d,c){var b=document.createElement(a);if(f){hs.extend(b,f)}if(c){hs.setStyles(b,{padding:0,border:"none",margin:0})}if(e){hs.setStyles(b,e)}if(d){d.appendChild(b)}return b},extend:function(b,c){for(var a in c){b[a]=c[a]}return b},setStyles:function(b,c){for(var a in c){if(hs.ieLt9&&a=="opacity"){if(c[a]>0.99){b.style.removeAttribute("filter")}else{b.style.filter="alpha(opacity="+(c[a]*100)+")"}}else{b.style[a]=c[a]}}},animate:function(f,a,d){var c,g,j;if(typeof d!="object"||d===null){var i=arguments;d={duration:i[2],easing:i[3],complete:i[4]}}if(typeof d.duration!="number"){d.duration=250}d.easing=Math[d.easing]||Math.easeInQuad;d.curAnim=hs.extend({},a);for(var b in a){var h=new hs.fx(f,d,b);c=parseFloat(hs.css(f,b))||0;g=parseFloat(a[b]);j=b!="opacity"?"px":"";h.custom(c,g,j)}},css:function(a,c){if(a.style[c]){return a.style[c]}else{if(document.defaultView){return document.defaultView.getComputedStyle(a,null).getPropertyValue(c)}else{if(c=="opacity"){c="filter"}var b=a.currentStyle[c.replace(/\-(\w)/g,function(e,d){return d.toUpperCase()})];if(c=="filter"){b=b.replace(/alpha\(opacity=([0-9]+)\)/,function(e,d){return d/100})}return b===""?1:b}}},getPageSize:function(){var f=document,b=window,e=f.compatMode&&f.compatMode!="BackCompat"?f.documentElement:f.body,g=hs.ie&&(hs.uaVersion<9||typeof pageXOffset=="undefined");var c=g?e.clientWidth:(f.documentElement.clientWidth||self.innerWidth),a=g?e.clientHeight:self.innerHeight;hs.page={width:c,height:a,scrollLeft:g?e.scrollLeft:pageXOffset,scrollTop:g?e.scrollTop:pageYOffset};return hs.page},getPosition:function(a){var b={x:a.offsetLeft,y:a.offsetTop};while(a.offsetParent){a=a.offsetParent;b.x+=a.offsetLeft;b.y+=a.offsetTop;if(a!=document.body&&a!=document.documentElement){b.x-=a.scrollLeft;b.y-=a.scrollTop}}return b},expand:function(b,g,d,c){if(!b){b=hs.createElement("a",null,{display:"none"},hs.container)}if(typeof b.getParams=="function"){return g}try{new hs.Expander(b,g,d);return false}catch(f){return true}},focusTopmost:function(){var c=0,b=-1,a=hs.expanders,e,f;for(var d=0;dc){c=f;b=d}}}if(b==-1){hs.focusKey=-1}else{a[b].focus()}},getParam:function(b,d){b.getParams=b.onclick;var c=b.getParams?b.getParams():null;b.getParams=null;return(c&&typeof c[d]!="undefined")?c[d]:(typeof hs[d]!="undefined"?hs[d]:null)},getSrc:function(b){var c=hs.getParam(b,"src");if(c){return c}return b.href},getNode:function(e){var c=hs.$(e),d=hs.clones[e],b={};if(!c&&!d){return null}if(!d){d=c.cloneNode(true);d.id="";hs.clones[e]=d;return c}else{return d.cloneNode(true)}},discardElement:function(a){if(a){hs.garbageBin.appendChild(a)}hs.garbageBin.innerHTML=""},transit:function(a,d){var b=d||hs.getExpander();d=b;if(hs.upcoming){return false}else{hs.last=b}hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler);try{hs.upcoming=a;a.onclick()}catch(c){hs.last=hs.upcoming=null}try{d.close()}catch(c){}return false},previousOrNext:function(a,c){var b=hs.getExpander(a);if(b){return hs.transit(b.getAdjacentAnchor(c),b)}else{return false}},previous:function(a){return hs.previousOrNext(a,-1)},next:function(a){return hs.previousOrNext(a,1)},keyHandler:function(a){if(!a){a=window.event}if(!a.target){a.target=a.srcElement}if(typeof a.target.form!="undefined"){return true}var b=hs.getExpander();var c=null;switch(a.keyCode){case 70:if(b){b.doFullExpand()}return true;case 32:case 34:case 39:case 40:c=1;break;case 8:case 33:case 37:case 38:c=-1;break;case 27:case 13:c=0}if(c!==null){hs.removeEventListener(document,window.opera?"keypress":"keydown",hs.keyHandler);if(!hs.enableKeyListener){return true}if(a.preventDefault){a.preventDefault()}else{a.returnValue=false}if(b){if(c==0){b.close()}else{hs.previousOrNext(b.key,c)}return false}}return true},registerOverlay:function(a){hs.push(hs.overlays,hs.extend(a,{hsId:"hsId"+hs.idCounter++}))},getWrapperKey:function(c,b){var e,d=/^highslide-wrapper-([0-9]+)$/;e=c;while(e.parentNode){if(e.id&&d.test(e.id)){return e.id.replace(d,"$1")}e=e.parentNode}if(!b){e=c;while(e.parentNode){if(e.tagName&&hs.isHsAnchor(e)){for(var a=0;a1){return true}if(!d.target){d.target=d.srcElement}var b=d.target;while(b.parentNode&&!(/highslide-(image|move|html|resize)/.test(b.className))){b=b.parentNode}var f=hs.getExpander(b);if(f&&(f.isClosing||!f.isExpanded)){return true}if(f&&d.type=="mousedown"){if(d.target.form){return true}var a=b.className.match(/highslide-(image|move|resize)/);if(a){hs.dragArgs={exp:f,type:a[1],left:f.x.pos,width:f.x.size,top:f.y.pos,height:f.y.size,clickX:d.clientX,clickY:d.clientY};hs.addEventListener(document,"mousemove",hs.dragHandler);if(d.preventDefault){d.preventDefault()}if(/highslide-(image|html)-blur/.test(f.content.className)){f.focus();hs.hasFocused=true}return false}}else{if(d.type=="mouseup"){hs.removeEventListener(document,"mousemove",hs.dragHandler);if(hs.dragArgs){if(hs.styleRestoreCursor&&hs.dragArgs.type=="image"){hs.dragArgs.exp.content.style.cursor=hs.styleRestoreCursor}var c=hs.dragArgs.hasDragged;if(!c&&!hs.hasFocused&&!/(move|resize)/.test(hs.dragArgs.type)){f.close()}else{if(c||(!c&&hs.hasHtmlExpanders)){hs.dragArgs.exp.doShowHide("hidden")}}hs.hasFocused=false;hs.dragArgs=null}else{if(/highslide-image-blur/.test(b.className)){b.style.cursor=hs.styleRestoreCursor}}}}return false},dragHandler:function(c){if(!hs.dragArgs){return true}if(!c){c=window.event}var b=hs.dragArgs,d=b.exp;b.dX=c.clientX-b.clickX;b.dY=c.clientY-b.clickY;var f=Math.sqrt(Math.pow(b.dX,2)+Math.pow(b.dY,2));if(!b.hasDragged){b.hasDragged=(b.type!="image"&&f>0)||(f>(hs.dragSensitivity||5))}if(b.hasDragged&&c.clientX>5&&c.clientY>5){if(b.type=="resize"){d.resize(b)}else{d.moveTo(b.left+b.dX,b.top+b.dY);if(b.type=="image"){d.content.style.cursor="move"}}}return false},wrapperMouseHandler:function(c){try{if(!c){c=window.event}var b=/mouseover/i.test(c.type);if(!c.target){c.target=c.srcElement}if(!c.relatedTarget){c.relatedTarget=b?c.fromElement:c.toElement}var d=hs.getExpander(c.target);if(!d.isExpanded){return}if(!d||!c.relatedTarget||hs.getExpander(c.relatedTarget,true)==d||hs.dragArgs){return}for(var a=0;a=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var a=true;for(var b in this.options.curAnim){if(this.options.curAnim[b]!==true){a=false}}if(a){if(this.options.complete){this.options.complete.call(this.elem)}}return false}else{var e=c-this.startTime;this.state=e/this.options.duration;this.pos=this.options.easing(e,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};hs.extend(hs.fx,{step:{opacity:function(a){hs.setStyles(a.elem,{opacity:a.now})},_default:function(a){try{if(a.elem.style&&a.elem.style[a.prop]!=null){a.elem.style[a.prop]=a.now+a.unit}else{a.elem[a.prop]=a.now}}catch(b){}}}});hs.Outline=function(g,e){this.onLoad=e;this.outlineType=g;var a=hs.uaVersion,f;this.hasAlphaImageLoader=hs.ie&&hs.uaVersion<7;if(!g){if(e){e()}return}hs.init();this.table=hs.createElement("table",{cellSpacing:0},{visibility:"hidden",position:"absolute",borderCollapse:"collapse",width:0},hs.container,true);var b=hs.createElement("tbody",null,null,this.table,1);this.td=[];for(var c=0;c<=8;c++){if(c%3==0){f=hs.createElement("tr",null,{height:"auto"},b,true)}this.td[c]=hs.createElement("td",null,null,f,true);var d=c!=4?{lineHeight:0,fontSize:0}:{position:"relative"};hs.setStyles(this.td[c],d)}this.td[4].className=g+" highslide-outline";this.preloadGraphic()};hs.Outline.prototype={preloadGraphic:function(){var b=hs.graphicsDir+(hs.outlinesDir||"outlines/")+this.outlineType+".png";var a=hs.safari&&hs.uaVersion<525?hs.container:null;this.graphic=hs.createElement("img",null,{position:"absolute",top:"-9999px"},a,true);var c=this;this.graphic.onload=function(){c.onGraphicLoad()};this.graphic.src=b},onGraphicLoad:function(){var d=this.offset=this.graphic.width/4,f=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],c={height:(2*d)+"px",width:(2*d)+"px"};for(var b=0;b<=8;b++){if(f[b]){if(this.hasAlphaImageLoader){var a=(b==1||b==7)?"100%":this.graphic.width+"px";var e=hs.createElement("div",null,{width:"100%",height:"100%",position:"relative",overflow:"hidden"},this.td[b],true);hs.createElement("div",null,{filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='"+this.graphic.src+"')",position:"absolute",width:a,height:this.graphic.height+"px",left:(f[b][0]*d)+"px",top:(f[b][1]*d)+"px"},e,true)}else{hs.setStyles(this.td[b],{background:"url("+this.graphic.src+") "+(f[b][0]*d)+"px "+(f[b][1]*d)+"px"})}if(window.opera&&(b==3||b==5)){hs.createElement("div",null,c,this.td[b],true)}hs.setStyles(this.td[b],c)}}this.graphic=null;if(hs.pendingOutlines[this.outlineType]){hs.pendingOutlines[this.outlineType].destroy()}hs.pendingOutlines[this.outlineType]=this;if(this.onLoad){this.onLoad()}},setPosition:function(g,e,c,b,f){var d=this.exp,a=d.wrapper.style,e=e||0,g=g||{x:d.x.pos+e,y:d.y.pos+e,w:d.x.get("wsize")-2*e,h:d.y.get("wsize")-2*e};if(c){this.table.style.visibility=(g.h>=4*this.offset)?"visible":"hidden"}hs.setStyles(this.table,{left:(g.x-this.offset)+"px",top:(g.y-this.offset)+"px",width:(g.w+2*this.offset)+"px"});g.w-=2*this.offset;g.h-=2*this.offset;hs.setStyles(this.td[4],{width:g.w>=0?g.w+"px":0,height:g.h>=0?g.h+"px":0});if(this.hasAlphaImageLoader){this.td[3].style.height=this.td[5].style.height=this.td[4].style.height}},destroy:function(a){if(a){this.table.style.visibility="hidden"}else{hs.discardElement(this.table)}}};hs.Dimension=function(b,a){this.exp=b;this.dim=a;this.ucwh=a=="x"?"Width":"Height";this.wh=this.ucwh.toLowerCase();this.uclt=a=="x"?"Left":"Top";this.lt=this.uclt.toLowerCase();this.ucrb=a=="x"?"Right":"Bottom";this.rb=this.ucrb.toLowerCase();this.p1=this.p2=0};hs.Dimension.prototype={get:function(a){switch(a){case"loadingPos":return this.tpos+this.tb+(this.t-hs.loading["offset"+this.ucwh])/2;case"wsize":return this.size+2*this.cb+this.p1+this.p2;case"fitsize":return this.clientSize-this.marginMin-this.marginMax;case"maxsize":return this.get("fitsize")-2*this.cb-this.p1-this.p2;case"opos":return this.pos-(this.exp.outline?this.exp.outline.offset:0);case"osize":return this.get("wsize")+(this.exp.outline?2*this.exp.outline.offset:0);case"imgPad":return this.imgSize?Math.round((this.size-this.imgSize)/2):0}},calcBorders:function(){this.cb=(this.exp.content["offset"+this.ucwh]-this.t)/2;this.marginMax=hs["margin"+this.ucrb]},calcThumb:function(){this.t=this.exp.el[this.wh]?parseInt(this.exp.el[this.wh]):this.exp.el["offset"+this.ucwh];this.tpos=this.exp.tpos[this.dim];this.tb=(this.exp.el["offset"+this.ucwh]-this.t)/2;if(this.tpos==0||this.tpos==-1){this.tpos=(hs.page[this.wh]/2)+hs.page["scroll"+this.uclt]}},calcExpanded:function(){var a=this.exp;this.justify="auto";this.pos=this.tpos-this.cb+this.tb;if(this.maxHeight&&this.dim=="x"){a.maxWidth=Math.min(a.maxWidth||this.full,a.maxHeight*this.full/a.y.full)}this.size=Math.min(this.full,a["max"+this.ucwh]||this.full);this.minSize=a.allowSizeReduction?Math.min(a["min"+this.ucwh],this.full):this.full;if(a.isImage&&a.useBox){this.size=a[this.wh];this.imgSize=this.full}if(this.dim=="x"&&hs.padToMinWidth){this.minSize=a.minWidth}this.marginMin=hs["margin"+this.uclt];this.scroll=hs.page["scroll"+this.uclt];this.clientSize=hs.page[this.wh]},setSize:function(a){var b=this.exp;if(b.isImage&&(b.useBox||hs.padToMinWidth)){this.imgSize=a;this.size=Math.max(this.size,this.imgSize);b.content.style[this.lt]=this.get("imgPad")+"px"}else{this.size=a}b.content.style[this.wh]=a+"px";b.wrapper.style[this.wh]=this.get("wsize")+"px";if(b.outline){b.outline.setPosition()}if(this.dim=="x"&&b.overlayBox){b.sizeOverlayBox(true)}},setPos:function(a){this.pos=a;this.exp.wrapper.style[this.lt]=a+"px";if(this.exp.outline){this.exp.outline.setPosition()}}};hs.Expander=function(k,f,b,l){if(document.readyState&&hs.ie&&!hs.isReady){hs.addEventListener(document,"ready",function(){new hs.Expander(k,f,b,l)});return}this.a=k;this.custom=b;this.contentType=l||"image";this.isImage=!this.isHtml;hs.continuePreloading=false;this.overlays=[];hs.init();var m=this.key=hs.expanders.length;for(var g=0;g(this.x.imgSize||this.x.size)){this.createFullExpand();if(this.overlays.length==1){this.sizeOverlayBox()}}}this.show()}catch(c){this.error(c)}},justify:function(f,b){var g,h=f.target,e=f==this.x?"x":"y";var d=false;var a=f.exp.allowSizeReduction;f.pos=Math.round(f.pos-((f.get("wsize")-f.t)/2));if(f.posf.scroll+f.clientSize-f.marginMax){if(!b&&d&&a){f.size=Math.min(f.size,f.get(e=="y"?"fitsize":"maxsize"))}else{if(f.get("wsize")c){d=b*c;if(dthis.minHeight&&a.size>this.minWidth&&d.get("wsize")>d.get("fitsize")){d.size-=10;if(b){a.size=d.size*b}this.sizeOverlayBox(0,1);c=true}}return c},show:function(){var a=this.x,b=this.y;this.doShowHide("hidden");this.changeSize(1,{wrapper:{width:a.get("wsize"),height:b.get("wsize"),left:a.pos,top:b.pos},content:{left:a.p1+a.get("imgPad"),top:b.p1+b.get("imgPad"),width:a.imgSize||a.size,height:b.imgSize||b.size}},hs.expandDuration)},changeSize:function(b,h,c){if(this.outline&&!this.outlineWhileAnimating){if(b){this.outline.setPosition()}else{this.outline.destroy()}}if(!b){this.destroyOverlays()}var e=this,a=e.x,g=e.y,f=this.easing;if(!b){f=this.easingClose||f}var d=b?function(){if(e.outline){e.outline.table.style.visibility="visible"}setTimeout(function(){e.afterExpand()},50)}:function(){e.afterClose()};if(b){hs.setStyles(this.wrapper,{width:a.t+"px",height:g.t+"px"})}if(this.fadeInOut){hs.setStyles(this.wrapper,{opacity:b?0:1});hs.extend(h.wrapper,{opacity:b})}hs.animate(this.wrapper,h.wrapper,{duration:c,easing:f,step:function(k,i){if(e.outline&&e.outlineWhileAnimating&&i.prop=="top"){var j=b?i.pos:1-i.pos;var l={w:a.t+(a.get("wsize")-a.t)*j,h:g.t+(g.get("wsize")-g.t)*j,x:a.tpos+(a.pos-a.tpos)*j,y:g.tpos+(g.pos-g.tpos)*j};e.outline.setPosition(l,0,1)}}});hs.animate(this.content,h.content,c,f,d);if(b){this.wrapper.style.visibility="visible";this.content.style.visibility="visible";this.a.className+=" highslide-active-anchor"}},afterExpand:function(){this.isExpanded=true;this.focus();if(hs.upcoming&&hs.upcoming==this.a){hs.upcoming=null}this.prepareNextOutline();var c=hs.page,b=hs.mouse.x+c.scrollLeft,a=hs.mouse.y+c.scrollTop;this.mouseIsOver=this.x.posthis.x.get("opos")+this.x.get("osize"));var g=(k.y+k.hthis.y.get("opos")+this.y.get("osize"));var d=hs.getWrapperKey(e[f]);if(!j&&!g&&d!=this.key){if(!h){e[f].setAttribute("hidden-by","["+this.key+"]");e[f].origProp=e[f].style[a];e[f].style[a]="hidden"}else{if(h.indexOf("["+this.key+"]")==-1){e[f].setAttribute("hidden-by",h+"["+this.key+"]")}}}else{if((h=="["+this.key+"]"||hs.focusKey==d)&&d!=this.key){e[f].setAttribute("hidden-by","");e[f].style[a]=e[f].origProp||""}else{if(h&&h.indexOf("["+this.key+"]")>-1){e[f].setAttribute("hidden-by",h.replace("["+this.key+"]",""))}}}}}}}},focus:function(){this.wrapper.style.zIndex=hs.zIndexCounter+=2;for(var a=0;a35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q(!m){u m={1F:{8l:\'6P\',6K:\'93...\',6L:\'6b 1L 92\',7T:\'6b 1L 91 1L 8Z\',88:\'90 1L 94 I (f)\',8e:\'95 2t 6I 6F\',8b:\'9a 1L 98 6I 6F 97\',5V:\'6b 1L 2h 1Y, 96 6O 8Y 1L 3c. 8X 8Q 8P S 1A 6O 79.\'},47:\'1c/8O/\',4l:\'8M.6A\',3S:\'8N.6A\',84:5c,7y:5c,43:15,7J:15,48:15,7N:15,3L:8R,7g:0.75,8j:G,5U:5,2R:2,8S:3,3V:1a,7z:\'2S 2o\',7O:1,7W:G,8x:\'8W://1c.8V/\',8o:\'8U\',7e:G,5t:[\'a\'],68:G,3Y:6W,3K:6W,3N:G,1h:\'9b-9c\',3U:[],5j:G,N:[],5i:[\'3N\',\'2d\',\'1h\',\'2R\',\'9u\',\'9t\',\'9s\',\'6R\',\'9q\',\'9r\',\'9v\',\'6X\',\'89\',\'68\',\'M\',\'16\',\'60\',\'3Y\',\'3K\',\'4X\',\'5q\',\'8h\',\'3b\',\'1J\',\'85\',\'86\',\'1l\'],1v:[],3F:0,9w:{x:[\'8n\',\'18\',\'6c\',\'2o\',\'7x\'],y:[\'42\',\'W\',\'6a\',\'2S\',\'4r\']},4B:{},6X:{},6R:{},2A:[],2Q:{},6m:{},4a:[],1R:/9A\\/4\\.0/.14(3W.4V)?8:6g((3W.4V.58().2X(/.+(?:6V|9z|9y|1P)[\\/: ]([\\d.]+)/)||[0,\'0\'])[1]),1P:(L.3R&&!1n.2r),4D:/9x/.14(3W.4V),8y:/9p.+6V:1\\.[0-8].+9o/.14(3W.4V),$:A(1t){q(1t)C L.9h(1t)},2e:A(2c,2v){2c[2c.X]=2v},Z:A(6S,3a,2F,6f,6U){u B=L.Z(6S);q(3a)m.2q(B,3a);q(6U)m.T(B,{9f:0,9d:\'3r\',5h:0});q(2F)m.T(B,2F);q(6f)6f.2g(B);C B},2q:A(B,3a){S(u x 3v 3a)B[x]=3a[x];C B},T:A(B,2F){S(u x 3v 2F){q(m.2Y&&x==\'1o\'){q(2F[x]>0.99)B.F.9e(\'3P\');K B.F.3P=\'7k(1o=\'+(2F[x]*1V)+\')\'}K B.F[x]=2F[x]}},3p:A(B,Q,25){u 2O,3h,2M;q(1m 25!=\'5I\'||25===H){u 2y=87;25={2Z:2y[2],1J:2y[3],5y:2y[4]}}q(1m 25.2Z!=\'3g\')25.2Z=5c;25.1J=1d[25.1J]||1d.6Z;25.4c=m.2q({},Q);S(u 2b 3v Q){u e=1S m.1k(B,25,2b);2O=6g(m.5s(B,2b))||0;3h=6g(Q[2b]);2M=2b!=\'1o\'?\'D\':\'\';e.2z(2O,3h,2M)}},5s:A(B,Q){q(B.F[Q]){C B.F[Q]}K q(L.63){C L.63.8B(B,H).8s(Q)}K{q(Q==\'1o\')Q=\'3P\';u 2v=B.8L[Q.31(/\\-(\\w)/g,A(a,b){C b.9j()})];q(Q==\'3P\')2v=2v.31(/7k\\(1o=([0-9]+)\\)/,A(a,b){C b/1V});C 2v===\'\'?1:2v}},4N:A(){u d=L,w=1n,3D=d.5a&&d.5a!=\'5K\'?d.3i:d.4J,2Y=m.1P&&(m.1R<9||1m 71==\'1Z\');u M=2Y?3D.7j:(d.3i.7j||4H.9n),16=2Y?3D.9m:4H.9l;m.2J={M:M,16:16,4w:2Y?3D.4w:71,4y:2Y?3D.4y:9k};C m.2J},62:A(B){u p={x:B.7n,y:B.7s};3m(B.7m){B=B.7m;p.x+=B.7n;p.y+=B.7s;q(B!=L.4J&&B!=L.3i){p.x-=B.4w;p.y-=B.4y}}C p},4b:A(a,21,2z,J){q(!a)a=m.Z(\'a\',H,{3q:\'3r\'},m.20);q(1m a.3E==\'A\')C 21;1z{1S m.46(a,21,2z);C 1a}1C(e){C G}},7a:A(){u 5X=0,54=-1,N=m.N,z,1p;S(u i=0;i5X){5X=1p;54=i}}}q(54==-1)m.2u=-1;K N[54].3k()},5r:A(a,3J){a.3E=a.3x;u p=a.3E?a.3E():H;a.3E=H;C(p&&1m p[3J]!=\'1Z\')?p[3J]:(1m m[3J]!=\'1Z\'?m[3J]:H)},5l:A(a){u 1l=m.5r(a,\'1l\');q(1l)C 1l;C a.3y},3B:A(1t){u 4s=m.$(1t),2U=m.6m[1t],a={};q(!4s&&!2U)C H;q(!2U){2U=4s.7f(G);2U.1t=\'\';m.6m[1t]=2U;C 4s}K{C 2U.7f(G)}},3t:A(d){q(d)m.5k.2g(d);m.5k.3G=\'\'},74:A(66,z){u 2G=z||m.2C();z=2G;q(m.2W)C 1a;K m.2G=2G;m.3d(L,1n.2r?\'4R\':\'4T\',m.3H);1z{m.2W=66;66.3x()}1C(e){m.2G=m.2W=H}1z{z.2h()}1C(e){}C 1a},4e:A(B,1W){u z=m.2C(B);q(z)C m.74(z.5m(1W),z);K C 1a},79:A(B){C m.4e(B,-1)},1A:A(B){C m.4e(B,1)},3H:A(e){q(!e)e=1n.1G;q(!e.1M)e.1M=e.6x;q(1m e.1M.7c!=\'1Z\')C G;u z=m.2C();u 1W=H;7u(e.8F){1q 70:q(z)z.5M();C G;1q 32:1q 34:1q 39:1q 40:1W=1;6r;1q 8:1q 33:1q 37:1q 38:1W=-1;6r;1q 27:1q 13:1W=0}q(1W!==H){m.3d(L,1n.2r?\'4R\':\'4T\',m.3H);q(!m.7e)C G;q(e.4F)e.4F();K e.8E=1a;q(z){q(1W==0){z.2h()}K{m.4e(z.R,1W)}C 1a}}C G},8G:A(O){m.2e(m.1v,m.2q(O,{2a:\'2a\'+m.3F++}))},65:A(6l,4u){u B,30=/^1c-V-([0-9]+)$/;B=6l;3m(B.2V){q(B.1t&&30.14(B.1t))C B.1t.31(30,"$1");B=B.2V}q(!4u){B=6l;3m(B.2V){q(B.4g&&m.4E(B)){S(u R=0;R1)C G;q(!e.1M)e.1M=e.6x;u B=e.1M;3m(B.2V&&!(/1c-(1Y|3c|4Z|2T)/.14(B.1g))){B=B.2V}u z=m.2C(B);q(z&&(z.6k||!z.3C))C G;q(z&&e.J==\'7o\'){q(e.1M.7c)C G;u 2X=B.1g.2X(/1c-(1Y|3c|2T)/);q(2X){m.1U={z:z,J:2X[1],18:z.x.E,M:z.x.I,W:z.y.E,16:z.y.I,72:e.4z,76:e.4o};m.1D(L,\'6w\',m.6D);q(e.4F)e.4F();q(/1c-(1Y|4Z)-5W/.14(z.11.1g)){z.3k();m.6B=G}C 1a}}K q(e.J==\'7i\'){m.3d(L,\'6w\',m.6D);q(m.1U){q(m.3e&&m.1U.J==\'1Y\')m.1U.z.11.F.2N=m.3e;u 2E=m.1U.2E;q(!2E&&!m.6B&&!/(3c|2T)/.14(m.1U.J)){z.2h()}K q(2E||(!2E&&m.8C)){m.1U.z.45(\'1i\')}m.6B=1a;m.1U=H}K q(/1c-1Y-5W/.14(B.1g)){B.F.2N=m.3e}}C 1a},6D:A(e){q(!m.1U)C G;q(!e)e=1n.1G;u a=m.1U,z=a.z;a.5b=e.4z-a.72;a.6o=e.4o-a.76;u 6n=1d.a7(1d.7q(a.5b,2)+1d.7q(a.6o,2));q(!a.2E)a.2E=(a.J!=\'1Y\'&&6n>0)||(6n>(m.al||5));q(a.2E&&e.4z>5&&e.4o>5){q(a.J==\'2T\')z.2T(a);K{z.5v(a.18+a.5b,a.W+a.6o);q(a.J==\'1Y\')z.11.F.2N=\'3c\'}}C 1a},8g:A(e){1z{q(!e)e=1n.1G;u 4C=/ao/i.14(e.J);q(!e.1M)e.1M=e.6x;q(!e.4v)e.4v=4C?e.an:e.9C;u z=m.2C(e.1M);q(!z.3C)C;q(!z||!e.4v||m.2C(e.4v,G)==z||m.1U)C;S(u i=0;i=k.1w.2Z+k.5x){k.2I=k.3h;k.E=k.5E=1;k.5C();k.1w.4c[k.Q]=G;u 5z=G;S(u i 3v k.1w.4c)q(k.1w.4c[i]!==G)5z=1a;q(5z){q(k.1w.5y)k.1w.5y.77(k.1Q)}C 1a}K{u n=t-k.5x;k.5E=n/k.1w.2Z;k.E=k.1w.1J(n,0,1,k.1w.2Z);k.2I=k.2O+((k.3h-k.2O)*k.E);k.5C()}C G}};m.2q(m.1k,{2x:{1o:A(1k){m.T(1k.1Q,{1o:1k.2I})},7r:A(1k){1z{q(1k.1Q.F&&1k.1Q.F[1k.Q]!=H)1k.1Q.F[1k.Q]=1k.2I+1k.2M;K 1k.1Q[1k.Q]=1k.2I}1C(e){}}}});m.41=A(1h,2P){k.2P=2P;k.1h=1h;u v=m.1R,4Y;k.5J=m.1P&&m.1R<7;q(!1h){q(2P)2P();C}m.6y();k.28=m.Z(\'28\',{9V:0},{1b:\'1i\',1e:\'29\',9X:\'9Y\',M:0},m.20,G);u 5R=m.Z(\'5R\',H,H,k.28,1);k.1H=[];S(u i=0;i<=8;i++){q(i%3==0)4Y=m.Z(\'4Y\',H,{16:\'2l\'},5R,G);k.1H[i]=m.Z(\'1H\',H,H,4Y,G);u F=i!=4?{9Z:0,aF:0}:{1e:\'6j\'};m.T(k.1H[i],F)}k.1H[4].1g=1h+\' 1c-19\';k.7t()};m.41.53={7t:A(){u 1l=m.47+(m.9K||"9O/")+k.1h+".9N";u 6T=m.4D&&m.1R<7v?m.20:H;k.2k=m.Z(\'1f\',H,{1e:\'29\',W:\'-3X\'},6T,G);u 6E=k;k.2k.4S=A(){6E.6N()};k.2k.1l=1l},6N:A(){u o=k.1j=k.2k.M/4,E=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],1x={16:(2*o)+\'D\',M:(2*o)+\'D\'};S(u i=0;i<=8;i++){q(E[i]){q(k.5J){u w=(i==1||i==7)?\'1V%\':k.2k.M+\'D\';u 1O=m.Z(\'1O\',H,{M:\'1V%\',16:\'1V%\',1e:\'6j\',2L:\'1i\'},k.1H[i],G);m.Z(\'1O\',H,{3P:"a0:9U.9W.a1(a8=9I, 1l=\'"+k.2k.1l+"\')",1e:\'29\',M:w,16:k.2k.16+\'D\',18:(E[i][0]*o)+\'D\',W:(E[i][1]*o)+\'D\'},1O,G)}K{m.T(k.1H[i],{9J:\'5T(\'+k.2k.1l+\') \'+(E[i][0]*o)+\'D \'+(E[i][1]*o)+\'D\'})}q(1n.2r&&(i==3||i==5))m.Z(\'1O\',H,1x,k.1H[i],G);m.T(k.1H[i],1x)}}k.2k=H;q(m.2Q[k.1h])m.2Q[k.1h].4q();m.2Q[k.1h]=k;q(k.2P)k.2P()},3A:A(E,1j,6H,2p,1J){u z=k.z,9E=z.V.F,1j=1j||0,E=E||{x:z.x.E+1j,y:z.y.E+1j,w:z.x.P(\'1u\')-2*1j,h:z.y.P(\'1u\')-2*1j};q(6H)k.28.F.1b=(E.h>=4*k.1j)?\'1X\':\'1i\';m.T(k.28,{18:(E.x-k.1j)+\'D\',W:(E.y-k.1j)+\'D\',M:(E.w+2*k.1j)+\'D\'});E.w-=2*k.1j;E.h-=2*k.1j;m.T(k.1H[4],{M:E.w>=0?E.w+\'D\':0,16:E.h>=0?E.h+\'D\':0});q(k.5J)k.1H[3].F.16=k.1H[5].F.16=k.1H[4].F.16},4q:A(6Y){q(6Y)k.28.F.1b=\'1i\';K m.3t(k.28)}};m.4W=A(z,1x){k.z=z;k.1x=1x;k.2D=1x==\'x\'?\'ax\':\'av\';k.2w=k.2D.58();k.3O=1x==\'x\'?\'ar\':\'au\';k.5o=k.3O.58();k.5f=1x==\'x\'?\'az\':\'aA\';k.aG=k.5f.58();k.1B=k.2f=0};m.4W.53={P:A(R){7u(R){1q\'5O\':C k.1s+k.2j+(k.t-m.1E[\'1j\'+k.2D])/2;1q\'1u\':C k.I+2*k.Y+k.1B+k.2f;1q\'3o\':C k.55-k.2K-k.4I;1q\'5G\':C k.P(\'3o\')-2*k.Y-k.1B-k.2f;1q\'3Q\':C k.E-(k.z.19?k.z.19.1j:0);1q\'64\':C k.P(\'1u\')+(k.z.19?2*k.z.19.1j:0);1q\'4h\':C k.1y?1d.56((k.I-k.1y)/2):0}},5w:A(){k.Y=(k.z.11[\'1j\'+k.2D]-k.t)/2;k.4I=m[\'5h\'+k.5f]},5g:A(){k.t=k.z.B[k.2w]?aC(k.z.B[k.2w]):k.z.B[\'1j\'+k.2D];k.1s=k.z.1s[k.1x];k.2j=(k.z.B[\'1j\'+k.2D]-k.t)/2;q(k.1s==0||k.1s==-1){k.1s=(m.2J[k.2w]/2)+m.2J[\'2B\'+k.3O]}},5B:A(){u z=k.z;k.3n=\'2l\';k.E=k.1s-k.Y+k.2j;q(k.5q&&k.1x==\'x\')z.4X=1d.22(z.4X||k.U,z.5q*k.U/z.y.U);k.I=1d.22(k.U,z[\'67\'+k.2D]||k.U);k.1T=z.3N?1d.22(z[\'22\'+k.2D],k.U):k.U;q(z.3f&&z.2d){k.I=z[k.2w];k.1y=k.U}q(k.1x==\'x\'&&m.3V)k.1T=z.3Y;k.2K=m[\'5h\'+k.3O];k.2B=m.2J[\'2B\'+k.3O];k.55=m.2J[k.2w]},6h:A(i){u z=k.z;q(z.3f&&(z.2d||m.3V)){k.1y=i;k.I=1d.67(k.I,k.1y);z.11.F[k.5o]=k.P(\'4h\')+\'D\'}K k.I=i;z.11.F[k.2w]=i+\'D\';z.V.F[k.2w]=k.P(\'1u\')+\'D\';q(z.19)z.19.3A();q(k.1x==\'x\'&&z.1r)z.35(G)},5Z:A(i){k.E=i;k.z.V.F[k.5o]=i+\'D\';q(k.z.19)k.z.19.3A()}};m.46=A(a,21,2z,26){q(L.ab&&m.1P&&!m.5n){m.1D(L,\'2H\',A(){1S m.46(a,21,2z,26)});C}k.a=a;k.2z=2z;k.26=26||\'1Y\';k.3f=!k.ak;m.5j=1a;k.1v=[];m.6y();u R=k.R=m.N.X;S(u i=0;i(k.x.1y||k.x.I)){k.8p();q(k.1v.X==1)k.35()}}k.7U()}1C(e){k.5Q(e)}},3n:A(p,3l){u a5,a3=p.1M,1x=p==k.x?\'x\':\'y\';u 5D=1a;u 3s=p.z.3N;p.E=1d.56(p.E-((p.P(\'1u\')-p.t)/2));q(p.Ep.2B+p.55-p.4I){q(!3l&&5D&&3s){p.I=1d.22(p.I,p.P(1x==\'y\'?\'3o\':\'5G\'))}K q(p.P(\'1u\')1K){ 1N=24*1K;q(1Nk.3K&&x.I>k.3Y&&y.P(\'1u\')>y.P(\'3o\')){y.I-=10;q(1K)x.I=y.I*1K;k.35(0,1);2m=G}}C 2m},7U:A(){u x=k.x,y=k.y;k.45(\'1i\');k.6e(1,{V:{M:x.P(\'1u\'),16:y.P(\'1u\'),18:x.E,W:y.E},11:{18:x.1B+x.P(\'4h\'),W:y.1B+y.P(\'4h\'),M:x.1y||x.I,16:y.1y||y.I}},m.84)},6e:A(23,1L,2p){q(k.19&&!k.2R){q(23)k.19.3A();K k.19.4q()}q(!23)k.8v();u z=k,x=z.x,y=z.y,1J=k.1J;q(!23)1J=k.85||1J;u 7A=23?A(){q(z.19)z.19.28.F.1b="1X";5S(A(){z.7B()},50)}:A(){z.5P()};q(23)m.T(k.V,{M:x.t+\'D\',16:y.t+\'D\'});q(k.86){m.T(k.V,{1o:23?0:1});m.2q(1L.V,{1o:23})}m.3p(k.V,1L.V,{2Z:2p,1J:1J,2x:A(2v,2y){q(z.19&&z.2R&&2y.Q==\'W\'){u 3I=23?2y.E:1-2y.E;u E={w:x.t+(x.P(\'1u\')-x.t)*3I,h:y.t+(y.P(\'1u\')-y.t)*3I,x:x.1s+(x.E-x.1s)*3I,y:y.1s+(y.E-y.1s)*3I};z.19.3A(E,0,1)}}});m.3p(k.11,1L.11,2p,1J,7A);q(23){k.V.F.1b=\'1X\';k.11.F.1b=\'1X\';k.a.1g+=\' 1c-7P-7Q\'}},7B:A(){k.3C=G;k.3k();q(m.2W&&m.2W==k.a)m.2W=H;k.7w();u p=m.2J,5u=m.4B.x+p.4w,5p=m.4B.y+p.4y;k.6q=k.x.E<5u&&5uk.x.P(\'3Q\')+k.x.P(\'64\'));u 7M=(2n.y+2n.hk.y.P(\'3Q\')+k.y.P(\'64\'));u 4j=m.65(17[i]);q(!7G&&!7M&&4j!=k.R){q(!1I){17[i].3T(\'1i-2t\',\'[\'+k.R+\']\');17[i].61=17[i].F[Q];17[i].F[Q]=\'1i\'}K q(1I.7L(\'[\'+k.R+\']\')==-1){17[i].3T(\'1i-2t\',1I+\'[\'+k.R+\']\')}}K q((1I==\'[\'+k.R+\']\'||m.2u==4j)&&4j!=k.R){17[i].3T(\'1i-2t\',\'\');17[i].F[Q]=17[i].61||\'\'}K q(1I&&1I.7L(\'[\'+k.R+\']\')>-1){17[i].3T(\'1i-2t\',1I.31(\'[\'+k.R+\']\',\'\'))}}}}},3k:A(){k.V.F.1p=m.3L+=2;S(u i=0;i - - - - -Highslide JS - - - - -

    Highslide JS

    - - -

    Barebones samples

    -

    Go to one of these examples and modify the code to suit your needs:

    - -

    Highslide JS core

    - - -

    With Gallery

    - - -

    With HTML

    - - - - - \ No newline at end of file diff --git a/Website/static/ie.css b/Website/static/ie.css deleted file mode 100644 index 61a5371..0000000 --- a/Website/static/ie.css +++ /dev/null @@ -1,36 +0,0 @@ -/* ----------------------------------------------------------------------- - - - Blueprint CSS Framework 1.0 - http://blueprintcss.org - - * Copyright (c) 2007-Present. See LICENSE for more info. - * See README for instructions on how to use Blueprint. - * For credits and origins, see AUTHORS. - * This is a compressed file. See the sources in the 'src' directory. - ------------------------------------------------------------------------ */ - -/* ie.css */ -body {text-align:center;} -.container {text-align:left;} -* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 {display:inline;overflow-x:hidden;} -* html legend {margin:0px -8px 16px 0;padding:0;} -sup {vertical-align:text-top;} -sub {vertical-align:text-bottom;} -html>body p code {*white-space:normal;} -hr {margin:-8px auto 11px;} -img {-ms-interpolation-mode:bicubic;} -.clearfix, .container {display:inline-block;} -* html .clearfix, * html .container {height:1%;} -fieldset {padding-top:0;} -legend {margin-top:-0.2em;margin-bottom:1em;margin-left:-0.5em;} -textarea {overflow:auto;} -label {vertical-align:middle;position:relative;top:-0.25em;} -input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;} -input.text:focus, input.title:focus {border-color:#666;} -input.text, input.title, textarea, select {margin:0.5em 0;} -input.checkbox, input.radio {position:relative;top:.25em;} -form.inline div, form.inline p {vertical-align:middle;} -form.inline input.checkbox, form.inline input.radio, form.inline input.button, form.inline button {margin:0.5em 0;} -button, input.button {position:relative;top:0.25em;} \ No newline at end of file diff --git a/Website/static/images/sc-1x1.gif b/Website/static/images/sc-1x1.gif deleted file mode 100644 index 1d9a4f5..0000000 Binary files a/Website/static/images/sc-1x1.gif and /dev/null differ diff --git a/Website/static/images/sc-add-2.png b/Website/static/images/sc-add-2.png deleted file mode 100755 index 3cd3b73..0000000 Binary files a/Website/static/images/sc-add-2.png and /dev/null differ diff --git a/Website/static/images/sc-aligncenter.gif b/Website/static/images/sc-aligncenter.gif deleted file mode 100644 index 81fae2a..0000000 Binary files a/Website/static/images/sc-aligncenter.gif and /dev/null differ diff --git a/Website/static/images/sc-alignleft.gif b/Website/static/images/sc-alignleft.gif deleted file mode 100644 index 0f3fea7..0000000 Binary files a/Website/static/images/sc-alignleft.gif and /dev/null differ diff --git a/Website/static/images/sc-alignright.gif b/Website/static/images/sc-alignright.gif deleted file mode 100644 index c89e242..0000000 Binary files a/Website/static/images/sc-alignright.gif and /dev/null differ diff --git a/Website/static/images/sc-bordersoff.gif b/Website/static/images/sc-bordersoff.gif deleted file mode 100644 index ffad4a2..0000000 Binary files a/Website/static/images/sc-bordersoff.gif and /dev/null differ diff --git a/Website/static/images/sc-borderson.gif b/Website/static/images/sc-borderson.gif deleted file mode 100644 index 0224acc..0000000 Binary files a/Website/static/images/sc-borderson.gif and /dev/null differ diff --git a/Website/static/images/sc-chooserarrow.gif b/Website/static/images/sc-chooserarrow.gif deleted file mode 100644 index b9010e2..0000000 Binary files a/Website/static/images/sc-chooserarrow.gif and /dev/null differ diff --git a/Website/static/images/sc-commentbg.gif b/Website/static/images/sc-commentbg.gif deleted file mode 100644 index 0b5e17a..0000000 Binary files a/Website/static/images/sc-commentbg.gif and /dev/null differ diff --git a/Website/static/images/sc-copy.gif b/Website/static/images/sc-copy.gif deleted file mode 100644 index 4ed54d0..0000000 Binary files a/Website/static/images/sc-copy.gif and /dev/null differ diff --git a/Website/static/images/sc-cursorinsertleft.gif b/Website/static/images/sc-cursorinsertleft.gif deleted file mode 100644 index 03e9769..0000000 Binary files a/Website/static/images/sc-cursorinsertleft.gif and /dev/null differ diff --git a/Website/static/images/sc-cursorinsertup.gif b/Website/static/images/sc-cursorinsertup.gif deleted file mode 100644 index 03e9769..0000000 Binary files a/Website/static/images/sc-cursorinsertup.gif and /dev/null differ diff --git a/Website/static/images/sc-cut.gif b/Website/static/images/sc-cut.gif deleted file mode 100644 index cb906cc..0000000 Binary files a/Website/static/images/sc-cut.gif and /dev/null differ diff --git a/Website/static/images/sc-defaultcolor.gif b/Website/static/images/sc-defaultcolor.gif deleted file mode 100644 index e9d69cd..0000000 Binary files a/Website/static/images/sc-defaultcolor.gif and /dev/null differ diff --git a/Website/static/images/sc-delete.gif b/Website/static/images/sc-delete.gif deleted file mode 100644 index b8d18a7..0000000 Binary files a/Website/static/images/sc-delete.gif and /dev/null differ diff --git a/Website/static/images/sc-deletecol.gif b/Website/static/images/sc-deletecol.gif deleted file mode 100644 index 0242f70..0000000 Binary files a/Website/static/images/sc-deletecol.gif and /dev/null differ diff --git a/Website/static/images/sc-deleterow.gif b/Website/static/images/sc-deleterow.gif deleted file mode 100644 index 0ff543e..0000000 Binary files a/Website/static/images/sc-deleterow.gif and /dev/null differ diff --git a/Website/static/images/sc-divider1.gif b/Website/static/images/sc-divider1.gif deleted file mode 100644 index 2f3ac5b..0000000 Binary files a/Website/static/images/sc-divider1.gif and /dev/null differ diff --git a/Website/static/images/sc-drag-handles.gif b/Website/static/images/sc-drag-handles.gif deleted file mode 100644 index e2ffef1..0000000 Binary files a/Website/static/images/sc-drag-handles.gif and /dev/null differ diff --git a/Website/static/images/sc-drag-handles.png b/Website/static/images/sc-drag-handles.png deleted file mode 100644 index b57b5a2..0000000 Binary files a/Website/static/images/sc-drag-handles.png and /dev/null differ diff --git a/Website/static/images/sc-endcap-h.gif b/Website/static/images/sc-endcap-h.gif deleted file mode 100644 index 900afd6..0000000 Binary files a/Website/static/images/sc-endcap-h.gif and /dev/null differ diff --git a/Website/static/images/sc-endcap-v.gif b/Website/static/images/sc-endcap-v.gif deleted file mode 100644 index 3e6ba4f..0000000 Binary files a/Website/static/images/sc-endcap-v.gif and /dev/null differ diff --git a/Website/static/images/sc-filldown.gif b/Website/static/images/sc-filldown.gif deleted file mode 100644 index a0d6cba..0000000 Binary files a/Website/static/images/sc-filldown.gif and /dev/null differ diff --git a/Website/static/images/sc-fillright.gif b/Website/static/images/sc-fillright.gif deleted file mode 100644 index 5169a72..0000000 Binary files a/Website/static/images/sc-fillright.gif and /dev/null differ diff --git a/Website/static/images/sc-formuladialog.gif b/Website/static/images/sc-formuladialog.gif deleted file mode 100644 index 404f991..0000000 Binary files a/Website/static/images/sc-formuladialog.gif and /dev/null differ diff --git a/Website/static/images/sc-insertcol.gif b/Website/static/images/sc-insertcol.gif deleted file mode 100644 index 8be72e8..0000000 Binary files a/Website/static/images/sc-insertcol.gif and /dev/null differ diff --git a/Website/static/images/sc-insertrow.gif b/Website/static/images/sc-insertrow.gif deleted file mode 100644 index 28ab390..0000000 Binary files a/Website/static/images/sc-insertrow.gif and /dev/null differ diff --git a/Website/static/images/sc-less-hd.gif b/Website/static/images/sc-less-hd.gif deleted file mode 100644 index 689ebc9..0000000 Binary files a/Website/static/images/sc-less-hd.gif and /dev/null differ diff --git a/Website/static/images/sc-less-hh.gif b/Website/static/images/sc-less-hh.gif deleted file mode 100644 index f1d978e..0000000 Binary files a/Website/static/images/sc-less-hh.gif and /dev/null differ diff --git a/Website/static/images/sc-less-hn.gif b/Website/static/images/sc-less-hn.gif deleted file mode 100644 index 81245b8..0000000 Binary files a/Website/static/images/sc-less-hn.gif and /dev/null differ diff --git a/Website/static/images/sc-less-vd.gif b/Website/static/images/sc-less-vd.gif deleted file mode 100644 index 605801f..0000000 Binary files a/Website/static/images/sc-less-vd.gif and /dev/null differ diff --git a/Website/static/images/sc-less-vh.gif b/Website/static/images/sc-less-vh.gif deleted file mode 100644 index aa2de92..0000000 Binary files a/Website/static/images/sc-less-vh.gif and /dev/null differ diff --git a/Website/static/images/sc-less-vn.gif b/Website/static/images/sc-less-vn.gif deleted file mode 100644 index 88290ef..0000000 Binary files a/Website/static/images/sc-less-vn.gif and /dev/null differ diff --git a/Website/static/images/sc-linkdialog.gif b/Website/static/images/sc-linkdialog.gif deleted file mode 100644 index d206394..0000000 Binary files a/Website/static/images/sc-linkdialog.gif and /dev/null differ diff --git a/Website/static/images/sc-linkout.gif b/Website/static/images/sc-linkout.gif deleted file mode 100644 index 9215def..0000000 Binary files a/Website/static/images/sc-linkout.gif and /dev/null differ diff --git a/Website/static/images/sc-logo.gif b/Website/static/images/sc-logo.gif deleted file mode 100644 index b76d534..0000000 Binary files a/Website/static/images/sc-logo.gif and /dev/null differ diff --git a/Website/static/images/sc-main-h.gif b/Website/static/images/sc-main-h.gif deleted file mode 100644 index 0b260ed..0000000 Binary files a/Website/static/images/sc-main-h.gif and /dev/null differ diff --git a/Website/static/images/sc-main-v.gif b/Website/static/images/sc-main-v.gif deleted file mode 100644 index 0fb12bb..0000000 Binary files a/Website/static/images/sc-main-v.gif and /dev/null differ diff --git a/Website/static/images/sc-menu-dropdown.png b/Website/static/images/sc-menu-dropdown.png deleted file mode 100755 index 938cee8..0000000 Binary files a/Website/static/images/sc-menu-dropdown.png and /dev/null differ diff --git a/Website/static/images/sc-merge.gif b/Website/static/images/sc-merge.gif deleted file mode 100644 index 666b597..0000000 Binary files a/Website/static/images/sc-merge.gif and /dev/null differ diff --git a/Website/static/images/sc-more-hd.gif b/Website/static/images/sc-more-hd.gif deleted file mode 100644 index 2eb56e0..0000000 Binary files a/Website/static/images/sc-more-hd.gif and /dev/null differ diff --git a/Website/static/images/sc-more-hh.gif b/Website/static/images/sc-more-hh.gif deleted file mode 100644 index fc1059a..0000000 Binary files a/Website/static/images/sc-more-hh.gif and /dev/null differ diff --git a/Website/static/images/sc-more-hn.gif b/Website/static/images/sc-more-hn.gif deleted file mode 100644 index 7e07204..0000000 Binary files a/Website/static/images/sc-more-hn.gif and /dev/null differ diff --git a/Website/static/images/sc-more-vd.gif b/Website/static/images/sc-more-vd.gif deleted file mode 100644 index 055f4ac..0000000 Binary files a/Website/static/images/sc-more-vd.gif and /dev/null differ diff --git a/Website/static/images/sc-more-vh.gif b/Website/static/images/sc-more-vh.gif deleted file mode 100644 index 07acdf7..0000000 Binary files a/Website/static/images/sc-more-vh.gif and /dev/null differ diff --git a/Website/static/images/sc-more-vn.gif b/Website/static/images/sc-more-vn.gif deleted file mode 100644 index 922756d..0000000 Binary files a/Website/static/images/sc-more-vn.gif and /dev/null differ diff --git a/Website/static/images/sc-movefrom.gif b/Website/static/images/sc-movefrom.gif deleted file mode 100644 index 7f665eb..0000000 Binary files a/Website/static/images/sc-movefrom.gif and /dev/null differ diff --git a/Website/static/images/sc-movefromoff.gif b/Website/static/images/sc-movefromoff.gif deleted file mode 100644 index 1760f02..0000000 Binary files a/Website/static/images/sc-movefromoff.gif and /dev/null differ diff --git a/Website/static/images/sc-moveinsert.gif b/Website/static/images/sc-moveinsert.gif deleted file mode 100644 index f082171..0000000 Binary files a/Website/static/images/sc-moveinsert.gif and /dev/null differ diff --git a/Website/static/images/sc-moveinsertoff.gif b/Website/static/images/sc-moveinsertoff.gif deleted file mode 100644 index cbb4f30..0000000 Binary files a/Website/static/images/sc-moveinsertoff.gif and /dev/null differ diff --git a/Website/static/images/sc-movepaste.gif b/Website/static/images/sc-movepaste.gif deleted file mode 100644 index 93108d1..0000000 Binary files a/Website/static/images/sc-movepaste.gif and /dev/null differ diff --git a/Website/static/images/sc-movepasteoff.gif b/Website/static/images/sc-movepasteoff.gif deleted file mode 100644 index 254c572..0000000 Binary files a/Website/static/images/sc-movepasteoff.gif and /dev/null differ diff --git a/Website/static/images/sc-multilinedialog.gif b/Website/static/images/sc-multilinedialog.gif deleted file mode 100644 index 1e0d6d6..0000000 Binary files a/Website/static/images/sc-multilinedialog.gif and /dev/null differ diff --git a/Website/static/images/sc-paneslider-h.gif b/Website/static/images/sc-paneslider-h.gif deleted file mode 100644 index 8cb31d4..0000000 Binary files a/Website/static/images/sc-paneslider-h.gif and /dev/null differ diff --git a/Website/static/images/sc-paneslider-v.gif b/Website/static/images/sc-paneslider-v.gif deleted file mode 100644 index c4bcaee..0000000 Binary files a/Website/static/images/sc-paneslider-v.gif and /dev/null differ diff --git a/Website/static/images/sc-paste.gif b/Website/static/images/sc-paste.gif deleted file mode 100644 index e39f06c..0000000 Binary files a/Website/static/images/sc-paste.gif and /dev/null differ diff --git a/Website/static/images/sc-pasteformats.gif b/Website/static/images/sc-pasteformats.gif deleted file mode 100644 index 94b2f50..0000000 Binary files a/Website/static/images/sc-pasteformats.gif and /dev/null differ diff --git a/Website/static/images/sc-peerbg.gif b/Website/static/images/sc-peerbg.gif deleted file mode 100644 index bef9c21..0000000 Binary files a/Website/static/images/sc-peerbg.gif and /dev/null differ diff --git a/Website/static/images/sc-range2.gif b/Website/static/images/sc-range2.gif deleted file mode 100644 index e9d69cd..0000000 Binary files a/Website/static/images/sc-range2.gif and /dev/null differ diff --git a/Website/static/images/sc-recalc.gif b/Website/static/images/sc-recalc.gif deleted file mode 100644 index 6e1ebb8..0000000 Binary files a/Website/static/images/sc-recalc.gif and /dev/null differ diff --git a/Website/static/images/sc-redo.gif b/Website/static/images/sc-redo.gif deleted file mode 100644 index b14aca8..0000000 Binary files a/Website/static/images/sc-redo.gif and /dev/null differ diff --git a/Website/static/images/sc-scrollarea-h.gif b/Website/static/images/sc-scrollarea-h.gif deleted file mode 100644 index c12715b..0000000 Binary files a/Website/static/images/sc-scrollarea-h.gif and /dev/null differ diff --git a/Website/static/images/sc-scrollarea-v.gif b/Website/static/images/sc-scrollarea-v.gif deleted file mode 100644 index df99311..0000000 Binary files a/Website/static/images/sc-scrollarea-v.gif and /dev/null differ diff --git a/Website/static/images/sc-sumdialog.gif b/Website/static/images/sc-sumdialog.gif deleted file mode 100644 index f6bb9ad..0000000 Binary files a/Website/static/images/sc-sumdialog.gif and /dev/null differ diff --git a/Website/static/images/sc-swapcolors.gif b/Website/static/images/sc-swapcolors.gif deleted file mode 100644 index 49c6e80..0000000 Binary files a/Website/static/images/sc-swapcolors.gif and /dev/null differ diff --git a/Website/static/images/sc-thumb-hd.gif b/Website/static/images/sc-thumb-hd.gif deleted file mode 100644 index e3afbd2..0000000 Binary files a/Website/static/images/sc-thumb-hd.gif and /dev/null differ diff --git a/Website/static/images/sc-thumb-hh.gif b/Website/static/images/sc-thumb-hh.gif deleted file mode 100644 index 47237c2..0000000 Binary files a/Website/static/images/sc-thumb-hh.gif and /dev/null differ diff --git a/Website/static/images/sc-thumb-hn.gif b/Website/static/images/sc-thumb-hn.gif deleted file mode 100644 index a8e0f08..0000000 Binary files a/Website/static/images/sc-thumb-hn.gif and /dev/null differ diff --git a/Website/static/images/sc-thumb-vd.gif b/Website/static/images/sc-thumb-vd.gif deleted file mode 100644 index c900734..0000000 Binary files a/Website/static/images/sc-thumb-vd.gif and /dev/null differ diff --git a/Website/static/images/sc-thumb-vh.gif b/Website/static/images/sc-thumb-vh.gif deleted file mode 100644 index a3229c7..0000000 Binary files a/Website/static/images/sc-thumb-vh.gif and /dev/null differ diff --git a/Website/static/images/sc-thumb-vn.gif b/Website/static/images/sc-thumb-vn.gif deleted file mode 100644 index d528f43..0000000 Binary files a/Website/static/images/sc-thumb-vn.gif and /dev/null differ diff --git a/Website/static/images/sc-trackingline-h.gif b/Website/static/images/sc-trackingline-h.gif deleted file mode 100644 index efeff83..0000000 Binary files a/Website/static/images/sc-trackingline-h.gif and /dev/null differ diff --git a/Website/static/images/sc-trackingline-v.gif b/Website/static/images/sc-trackingline-v.gif deleted file mode 100644 index ce6e8cb..0000000 Binary files a/Website/static/images/sc-trackingline-v.gif and /dev/null differ diff --git a/Website/static/images/sc-undo.gif b/Website/static/images/sc-undo.gif deleted file mode 100644 index 66a07f8..0000000 Binary files a/Website/static/images/sc-undo.gif and /dev/null differ diff --git a/Website/static/images/sc-unmerge.gif b/Website/static/images/sc-unmerge.gif deleted file mode 100644 index 7e0df32..0000000 Binary files a/Website/static/images/sc-unmerge.gif and /dev/null differ diff --git a/Website/static/images/sc-wikiflag.gif b/Website/static/images/sc-wikiflag.gif deleted file mode 100644 index caf0e3f..0000000 Binary files a/Website/static/images/sc-wikiflag.gif and /dev/null differ diff --git a/Website/static/images/sc-wikilinkflag.gif b/Website/static/images/sc-wikilinkflag.gif deleted file mode 100644 index 5ed3700..0000000 Binary files a/Website/static/images/sc-wikilinkflag.gif and /dev/null differ diff --git a/Website/static/images/spinner.gif b/Website/static/images/spinner.gif deleted file mode 100644 index cc70a7a..0000000 Binary files a/Website/static/images/spinner.gif and /dev/null differ diff --git a/Website/static/imgsgraph.txt.chrome b/Website/static/imgsgraph.txt.chrome deleted file mode 100755 index f32854a..0000000 --- a/Website/static/imgsgraph.txt.chrome +++ /dev/null @@ -1,1091 +0,0 @@ -' - --------- - -' -1,4,4,7,5,9,10,20,30,40 - - - ---------- - - -html here - --------- -' -

    Flot Examples

    - -
    - -

    Simple example. You don't need to specify much to get an - attractive look. Put in a placeholder, make sure you set its - dimensions (otherwise the plot library will barf) and call the - plot function with the data. The axes are automatically - scaled.

    - --------- -'

    Flot Examples

    - -
    - -

    Here is an example with real data: military budgets for - various countries in constant (2005) million US dollars (source: SIPRI).

    - -

    Since all data is available client-side, it's pretty easy to - make the plot interactive. Try turning countries on/off with the - checkboxes below.

    - -

    Show:

    - - - ------------------ -

    Flot Examples

    - -
    - -

    One of the goals of Flot is to support user interactions. Try - pointing and clicking on the points.

    - -

    Mouse hovers at - (0, 0).

    - -

    A tooltip is easy to build with a bit of jQuery code and the - data returned from the plot.

    - -

    Enable tooltip

    - - ------------- -html here - ------------------- - -
    - - ----------- - -
    - - ---------------- -
    - - ---------- - -
    - ----------------- - -
    - ------------ - ------------ - -'

    Flot Examples

    - -
    - -

    Simple example. You don't need to specify much to get an - attractive look. Put in a placeholder, make sure you set its - dimensions (otherwise the plot library will barf) and call the - plot function with the data. The axes are automatically - scaled.

    - ----------- -

    hello

    - - ------- - -'Loading.. - - ---------- -Loading.. - - ---------- - -'Loading.. - - ------------- - - -$(function () { - -var dates = "B2,C2,D2,E2,F2" -var roe = "D23,E23,F23,G23,H23" -var roa = "D22,E22,F22,G22,H22" -var valsroe = SocialCalc.GetCellDataArray(roe,"dcf") -var valsroa = SocialCalc.GetCellDataArray(roa,"dcf") - -var rawdates = SocialCalc.GetCellDataArray(dates,"balance") - -var jdate = []; -var years = []; -SocialCalc.UserScriptData.dates = null -var min = 0; -if (SocialCalc.UserScriptData.dates == null) { - for (var c in rawdates) { - var d = rawdates[c] - var comps = d.split("/") - console.log(comps) - var jd = new Date(parseInt(comps[2]),parseInt(comps[0])-1,parseInt(comps[1])) - years.push(comps[2]); - var timestamp = jd.getTime() - if (min==0) { min = timestamp;} else { - if (min > timestamp) {min = timestamp;} - } - jdate.push(timestamp) - } - SocialCalc.UserScriptData.dates = jdate; -} else { - jdate = SocialCalc.UserScriptData.dates -} - - -var d1roe = [] -var d1roa = [] -var ticks = [] -for (var c in jdate) { - d1roe.push([jdate[c],valsroe[c]]) - d1roa.push([jdate[c],valsroa[c]]) - ticks.push([jdate[c],years[c]]) -} - - $.plot($("#placeholder1"), [ {data:d1roe,label:"ROE"}, - {data:d1roa, label:"ROA"} ], { - series: {stack: 0}, - xaxis: {ticks: ticks}, - ticks: ticks - }); - - - ------------------ -Highcharts example -'
    - - ----------- -
    - - - - - - - - - - - - ------------------ -Highcharts example -'
    - - ----------- - -
    - - - - - - - - - - - - diff --git a/Website/static/jquery.flot.js b/Website/static/jquery.flot.js deleted file mode 100644 index 6534a46..0000000 --- a/Website/static/jquery.flot.js +++ /dev/null @@ -1,2119 +0,0 @@ -/* Javascript plotting library for jQuery, v. 0.6. - * - * Released under the MIT license by IOLA, December 2007. - * - */ - -// first an inline dependency, jquery.colorhelpers.js, we inline it here -// for convenience - -/* Plugin for jQuery for working with colors. - * - * Version 1.0. - * - * Inspiration from jQuery color animation plugin by John Resig. - * - * Released under the MIT license by Ole Laursen, October 2009. - * - * Examples: - * - * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() - * var c = $.color.extract($("#mydiv"), 'background-color'); - * console.log(c.r, c.g, c.b, c.a); - * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" - * - * Note that .scale() and .add() work in-place instead of returning - * new objects. - */ -(function(){jQuery.color={};jQuery.color.make=function(E,D,B,C){var F={};F.r=E||0;F.g=D||0;F.b=B||0;F.a=C!=null?C:1;F.add=function(I,H){for(var G=0;G=1){return"rgb("+[F.r,F.g,F.b].join(",")+")"}else{return"rgba("+[F.r,F.g,F.b,F.a].join(",")+")"}};F.normalize=function(){function G(I,J,H){return JH?H:J)}F.r=G(0,parseInt(F.r),255);F.g=G(0,parseInt(F.g),255);F.b=G(0,parseInt(F.b),255);F.a=G(0,F.a,1);return F};F.clone=function(){return jQuery.color.make(F.r,F.b,F.g,F.a)};return F.normalize()};jQuery.color.extract=function(C,B){var D;do{D=C.css(B).toLowerCase();if(D!=""&&D!="transparent"){break}C=C.parent()}while(!jQuery.nodeName(C.get(0),"body"));if(D=="rgba(0, 0, 0, 0)"){D="transparent"}return jQuery.color.parse(D)};jQuery.color.parse=function(E){var D,B=jQuery.color.make;if(D=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(E)){return B(parseInt(D[1],10),parseInt(D[2],10),parseInt(D[3],10))}if(D=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(E)){return B(parseInt(D[1],10),parseInt(D[2],10),parseInt(D[3],10),parseFloat(D[4]))}if(D=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(E)){return B(parseFloat(D[1])*2.55,parseFloat(D[2])*2.55,parseFloat(D[3])*2.55)}if(D=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(E)){return B(parseFloat(D[1])*2.55,parseFloat(D[2])*2.55,parseFloat(D[3])*2.55,parseFloat(D[4]))}if(D=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(E)){return B(parseInt(D[1],16),parseInt(D[2],16),parseInt(D[3],16))}if(D=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(E)){return B(parseInt(D[1]+D[1],16),parseInt(D[2]+D[2],16),parseInt(D[3]+D[3],16))}var C=jQuery.trim(E).toLowerCase();if(C=="transparent"){return B(255,255,255,0)}else{D=A[C];return B(D[0],D[1],D[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(); - -// the actual Flot code -(function($) { - function Plot(placeholder, data_, options_, plugins) { - // data is on the form: - // [ series1, series2 ... ] - // where series is either just the data as [ [x1, y1], [x2, y2], ... ] - // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... } - - var series = [], - options = { - // the color theme used for graphs - colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], - legend: { - show: true, - noColumns: 1, // number of colums in legend table - labelFormatter: null, // fn: string -> string - labelBoxBorderColor: "#ccc", // border color for the little label boxes - container: null, // container (as jQuery object) to put legend in, null means default on top of graph - position: "ne", // position of default legend container within plot - margin: 5, // distance from grid edge to default legend container within plot - backgroundColor: null, // null means auto-detect - backgroundOpacity: 0.85 // set to 0 to avoid background - }, - xaxis: { - mode: null, // null or "time" - transform: null, // null or f: number -> number to transform axis - inverseTransform: null, // if transform is set, this should be the inverse function - min: null, // min. value to show, null means set automatically - max: null, // max. value to show, null means set automatically - autoscaleMargin: null, // margin in % to add if auto-setting min/max - ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks - tickFormatter: null, // fn: number -> string - labelWidth: null, // size of tick labels in pixels - labelHeight: null, - - // mode specific options - tickDecimals: null, // no. of decimals, null means auto - tickSize: null, // number or [number, "unit"] - minTickSize: null, // number or [number, "unit"] - monthNames: null, // list of names of months - timeformat: null, // format string to use - twelveHourClock: false // 12 or 24 time in time mode - }, - yaxis: { - autoscaleMargin: 0.02 - }, - x2axis: { - autoscaleMargin: null - }, - y2axis: { - autoscaleMargin: 0.02 - }, - series: { - points: { - show: false, - radius: 3, - lineWidth: 2, // in pixels - fill: true, - fillColor: "#ffffff" - }, - lines: { - // we don't put in show: false so we can see - // whether lines were actively disabled - lineWidth: 2, // in pixels - fill: false, - fillColor: null, - steps: false - }, - bars: { - show: false, - lineWidth: 2, // in pixels - barWidth: 1, // in units of the x axis - fill: true, - fillColor: null, - align: "left", // or "center" - horizontal: false // when horizontal, left is now top - }, - shadowSize: 3 - }, - grid: { - show: true, - aboveData: false, - color: "#545454", // primary color used for outline and labels - backgroundColor: null, // null for transparent, else color - tickColor: "rgba(0,0,0,0.15)", // color used for the ticks - labelMargin: 5, // in pixels - borderWidth: 2, // in pixels - borderColor: null, // set if different from the grid color - markings: null, // array of ranges or fn: axes -> array of ranges - markingsColor: "#f4f4f4", - markingsLineWidth: 2, - // interactive stuff - clickable: false, - hoverable: false, - autoHighlight: true, // highlight in case mouse is near - mouseActiveRadius: 10 // how far the mouse can be away to activate an item - }, - hooks: {} - }, - canvas = null, // the canvas for the plot itself - overlay = null, // canvas for interactive stuff on top of plot - eventHolder = null, // jQuery object that events should be bound to - ctx = null, octx = null, - axes = { xaxis: {}, yaxis: {}, x2axis: {}, y2axis: {} }, - plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, - canvasWidth = 0, canvasHeight = 0, - plotWidth = 0, plotHeight = 0, - hooks = { - processOptions: [], - processRawData: [], - processDatapoints: [], - draw: [], - bindEvents: [], - drawOverlay: [] - }, - plot = this; - - // public functions - plot.setData = setData; - plot.setupGrid = setupGrid; - plot.draw = draw; - plot.getPlaceholder = function() { return placeholder; }; - plot.getCanvas = function() { return canvas; }; - plot.getPlotOffset = function() { return plotOffset; }; - plot.width = function () { return plotWidth; }; - plot.height = function () { return plotHeight; }; - plot.offset = function () { - var o = eventHolder.offset(); - o.left += plotOffset.left; - o.top += plotOffset.top; - return o; - }; - plot.getData = function() { return series; }; - plot.getAxes = function() { return axes; }; - plot.getOptions = function() { return options; }; - plot.highlight = highlight; - plot.unhighlight = unhighlight; - plot.triggerRedrawOverlay = triggerRedrawOverlay; - plot.pointOffset = function(point) { - return { left: parseInt(axisSpecToRealAxis(point, "xaxis").p2c(+point.x) + plotOffset.left), - top: parseInt(axisSpecToRealAxis(point, "yaxis").p2c(+point.y) + plotOffset.top) }; - }; - - - // public attributes - plot.hooks = hooks; - - // initialize - initPlugins(plot); - parseOptions(options_); - constructCanvas(); - setData(data_); - setupGrid(); - draw(); - bindEvents(); - - - function executeHooks(hook, args) { - args = [plot].concat(args); - for (var i = 0; i < hook.length; ++i) - hook[i].apply(this, args); - } - - function initPlugins() { - for (var i = 0; i < plugins.length; ++i) { - var p = plugins[i]; - p.init(plot); - if (p.options) - $.extend(true, options, p.options); - } - } - - function parseOptions(opts) { - $.extend(true, options, opts); - if (options.grid.borderColor == null) - options.grid.borderColor = options.grid.color; - // backwards compatibility, to be removed in future - if (options.xaxis.noTicks && options.xaxis.ticks == null) - options.xaxis.ticks = options.xaxis.noTicks; - if (options.yaxis.noTicks && options.yaxis.ticks == null) - options.yaxis.ticks = options.yaxis.noTicks; - if (options.grid.coloredAreas) - options.grid.markings = options.grid.coloredAreas; - if (options.grid.coloredAreasColor) - options.grid.markingsColor = options.grid.coloredAreasColor; - if (options.lines) - $.extend(true, options.series.lines, options.lines); - if (options.points) - $.extend(true, options.series.points, options.points); - if (options.bars) - $.extend(true, options.series.bars, options.bars); - if (options.shadowSize) - options.series.shadowSize = options.shadowSize; - - for (var n in hooks) - if (options.hooks[n] && options.hooks[n].length) - hooks[n] = hooks[n].concat(options.hooks[n]); - - executeHooks(hooks.processOptions, [options]); - } - - function setData(d) { - series = parseData(d); - fillInSeriesOptions(); - processData(); - } - - function parseData(d) { - var res = []; - for (var i = 0; i < d.length; ++i) { - var s = $.extend(true, {}, options.series); - - if (d[i].data) { - s.data = d[i].data; // move the data instead of deep-copy - delete d[i].data; - - $.extend(true, s, d[i]); - - d[i].data = s.data; - } - else - s.data = d[i]; - res.push(s); - } - - return res; - } - - function axisSpecToRealAxis(obj, attr) { - var a = obj[attr]; - if (!a || a == 1) - return axes[attr]; - if (typeof a == "number") - return axes[attr.charAt(0) + a + attr.slice(1)]; - return a; // assume it's OK - } - - function fillInSeriesOptions() { - var i; - - // collect what we already got of colors - var neededColors = series.length, - usedColors = [], - assignedColors = []; - for (i = 0; i < series.length; ++i) { - var sc = series[i].color; - if (sc != null) { - --neededColors; - if (typeof sc == "number") - assignedColors.push(sc); - else - usedColors.push($.color.parse(series[i].color)); - } - } - - // we might need to generate more colors if higher indices - // are assigned - for (i = 0; i < assignedColors.length; ++i) { - neededColors = Math.max(neededColors, assignedColors[i] + 1); - } - - // produce colors as needed - var colors = [], variation = 0; - i = 0; - while (colors.length < neededColors) { - var c; - if (options.colors.length == i) // check degenerate case - c = $.color.make(100, 100, 100); - else - c = $.color.parse(options.colors[i]); - - // vary color if needed - var sign = variation % 2 == 1 ? -1 : 1; - c.scale('rgb', 1 + sign * Math.ceil(variation / 2) * 0.2) - - // FIXME: if we're getting to close to something else, - // we should probably skip this one - colors.push(c); - - ++i; - if (i >= options.colors.length) { - i = 0; - ++variation; - } - } - - // fill in the options - var colori = 0, s; - for (i = 0; i < series.length; ++i) { - s = series[i]; - - // assign colors - if (s.color == null) { - s.color = colors[colori].toString(); - ++colori; - } - else if (typeof s.color == "number") - s.color = colors[s.color].toString(); - - // turn on lines automatically in case nothing is set - if (s.lines.show == null) { - var v, show = true; - for (v in s) - if (s[v].show) { - show = false; - break; - } - if (show) - s.lines.show = true; - } - - // setup axes - s.xaxis = axisSpecToRealAxis(s, "xaxis"); - s.yaxis = axisSpecToRealAxis(s, "yaxis"); - } - } - - function processData() { - var topSentry = Number.POSITIVE_INFINITY, - bottomSentry = Number.NEGATIVE_INFINITY, - i, j, k, m, length, - s, points, ps, x, y, axis, val, f, p; - - for (axis in axes) { - axes[axis].datamin = topSentry; - axes[axis].datamax = bottomSentry; - axes[axis].used = false; - } - - function updateAxis(axis, min, max) { - if (min < axis.datamin) - axis.datamin = min; - if (max > axis.datamax) - axis.datamax = max; - } - - for (i = 0; i < series.length; ++i) { - s = series[i]; - s.datapoints = { points: [] }; - - executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]); - } - - // first pass: clean and copy data - for (i = 0; i < series.length; ++i) { - s = series[i]; - - var data = s.data, format = s.datapoints.format; - - if (!format) { - format = []; - // find out how to copy - format.push({ x: true, number: true, required: true }); - format.push({ y: true, number: true, required: true }); - - if (s.bars.show) - format.push({ y: true, number: true, required: false, defaultValue: 0 }); - - s.datapoints.format = format; - } - - if (s.datapoints.pointsize != null) - continue; // already filled in - - if (s.datapoints.pointsize == null) - s.datapoints.pointsize = format.length; - - ps = s.datapoints.pointsize; - points = s.datapoints.points; - - insertSteps = s.lines.show && s.lines.steps; - s.xaxis.used = s.yaxis.used = true; - - for (j = k = 0; j < data.length; ++j, k += ps) { - p = data[j]; - - var nullify = p == null; - if (!nullify) { - for (m = 0; m < ps; ++m) { - val = p[m]; - f = format[m]; - - if (f) { - if (f.number && val != null) { - val = +val; // convert to number - if (isNaN(val)) - val = null; - } - - if (val == null) { - if (f.required) - nullify = true; - - if (f.defaultValue != null) - val = f.defaultValue; - } - } - - points[k + m] = val; - } - } - - if (nullify) { - for (m = 0; m < ps; ++m) { - val = points[k + m]; - if (val != null) { - f = format[m]; - // extract min/max info - if (f.x) - updateAxis(s.xaxis, val, val); - if (f.y) - updateAxis(s.yaxis, val, val); - } - points[k + m] = null; - } - } - else { - // a little bit of line specific stuff that - // perhaps shouldn't be here, but lacking - // better means... - if (insertSteps && k > 0 - && points[k - ps] != null - && points[k - ps] != points[k] - && points[k - ps + 1] != points[k + 1]) { - // copy the point to make room for a middle point - for (m = 0; m < ps; ++m) - points[k + ps + m] = points[k + m]; - - // middle point has same y - points[k + 1] = points[k - ps + 1]; - - // we've added a point, better reflect that - k += ps; - } - } - } - } - - // give the hooks a chance to run - for (i = 0; i < series.length; ++i) { - s = series[i]; - - executeHooks(hooks.processDatapoints, [ s, s.datapoints]); - } - - // second pass: find datamax/datamin for auto-scaling - for (i = 0; i < series.length; ++i) { - s = series[i]; - points = s.datapoints.points, - ps = s.datapoints.pointsize; - - var xmin = topSentry, ymin = topSentry, - xmax = bottomSentry, ymax = bottomSentry; - - for (j = 0; j < points.length; j += ps) { - if (points[j] == null) - continue; - - for (m = 0; m < ps; ++m) { - val = points[j + m]; - f = format[m]; - if (!f) - continue; - - if (f.x) { - if (val < xmin) - xmin = val; - if (val > xmax) - xmax = val; - } - if (f.y) { - if (val < ymin) - ymin = val; - if (val > ymax) - ymax = val; - } - } - } - - if (s.bars.show) { - // make sure we got room for the bar on the dancing floor - var delta = s.bars.align == "left" ? 0 : -s.bars.barWidth/2; - if (s.bars.horizontal) { - ymin += delta; - ymax += delta + s.bars.barWidth; - } - else { - xmin += delta; - xmax += delta + s.bars.barWidth; - } - } - - updateAxis(s.xaxis, xmin, xmax); - updateAxis(s.yaxis, ymin, ymax); - } - - for (axis in axes) { - if (axes[axis].datamin == topSentry) - axes[axis].datamin = null; - if (axes[axis].datamax == bottomSentry) - axes[axis].datamax = null; - } - } - - function constructCanvas() { - function makeCanvas(width, height) { - var c = document.createElement('canvas'); - c.width = width; - c.height = height; - if ($.browser.msie) // excanvas hack - c = window.G_vmlCanvasManager.initElement(c); - return c; - } - - canvasWidth = placeholder.width(); - canvasHeight = placeholder.height(); - placeholder.html(""); // clear placeholder - if (placeholder.css("position") == 'static') - placeholder.css("position", "relative"); // for positioning labels and overlay - - if (canvasWidth <= 0 || canvasHeight <= 0) - throw "Invalid dimensions for plot, width = " + canvasWidth + ", height = " + canvasHeight; - - if ($.browser.msie) // excanvas hack - window.G_vmlCanvasManager.init_(document); // make sure everything is setup - - // the canvas - canvas = $(makeCanvas(canvasWidth, canvasHeight)).appendTo(placeholder).get(0); - ctx = canvas.getContext("2d"); - - // overlay canvas for interactive features - overlay = $(makeCanvas(canvasWidth, canvasHeight)).css({ position: 'absolute', left: 0, top: 0 }).appendTo(placeholder).get(0); - octx = overlay.getContext("2d"); - octx.stroke(); - } - - function bindEvents() { - // we include the canvas in the event holder too, because IE 7 - // sometimes has trouble with the stacking order - eventHolder = $([overlay, canvas]); - - // bind events - if (options.grid.hoverable) - eventHolder.mousemove(onMouseMove); - - if (options.grid.clickable) - eventHolder.click(onClick); - - executeHooks(hooks.bindEvents, [eventHolder]); - } - - function setupGrid() { - function setTransformationHelpers(axis, o) { - function identity(x) { return x; } - - var s, m, t = o.transform || identity, - it = o.inverseTransform; - - // add transformation helpers - if (axis == axes.xaxis || axis == axes.x2axis) { - // precompute how much the axis is scaling a point - // in canvas space - s = axis.scale = plotWidth / (t(axis.max) - t(axis.min)); - m = t(axis.min); - - // data point to canvas coordinate - if (t == identity) // slight optimization - axis.p2c = function (p) { return (p - m) * s; }; - else - axis.p2c = function (p) { return (t(p) - m) * s; }; - // canvas coordinate to data point - if (!it) - axis.c2p = function (c) { return m + c / s; }; - else - axis.c2p = function (c) { return it(m + c / s); }; - } - else { - s = axis.scale = plotHeight / (t(axis.max) - t(axis.min)); - m = t(axis.max); - - if (t == identity) - axis.p2c = function (p) { return (m - p) * s; }; - else - axis.p2c = function (p) { return (m - t(p)) * s; }; - if (!it) - axis.c2p = function (c) { return m - c / s; }; - else - axis.c2p = function (c) { return it(m - c / s); }; - } - } - - function measureLabels(axis, axisOptions) { - var i, labels = [], l; - - axis.labelWidth = axisOptions.labelWidth; - axis.labelHeight = axisOptions.labelHeight; - - if (axis == axes.xaxis || axis == axes.x2axis) { - // to avoid measuring the widths of the labels, we - // construct fixed-size boxes and put the labels inside - // them, we don't need the exact figures and the - // fixed-size box content is easy to center - if (axis.labelWidth == null) - axis.labelWidth = canvasWidth / (axis.ticks.length > 0 ? axis.ticks.length : 1); - - // measure x label heights - if (axis.labelHeight == null) { - labels = []; - for (i = 0; i < axis.ticks.length; ++i) { - l = axis.ticks[i].label; - if (l) - labels.push('
    ' + l + '
    '); - } - - if (labels.length > 0) { - var dummyDiv = $('
    ' - + labels.join("") + '
    ').appendTo(placeholder); - axis.labelHeight = dummyDiv.height(); - dummyDiv.remove(); - } - } - } - else if (axis.labelWidth == null || axis.labelHeight == null) { - // calculate y label dimensions - for (i = 0; i < axis.ticks.length; ++i) { - l = axis.ticks[i].label; - if (l) - labels.push('
    ' + l + '
    '); - } - - if (labels.length > 0) { - var dummyDiv = $('
    ' - + labels.join("") + '
    ').appendTo(placeholder); - if (axis.labelWidth == null) - axis.labelWidth = dummyDiv.width(); - if (axis.labelHeight == null) - axis.labelHeight = dummyDiv.find("div").height(); - dummyDiv.remove(); - } - - } - - if (axis.labelWidth == null) - axis.labelWidth = 0; - if (axis.labelHeight == null) - axis.labelHeight = 0; - } - - function setGridSpacing() { - // get the most space needed around the grid for things - // that may stick out - var maxOutset = options.grid.borderWidth; - for (i = 0; i < series.length; ++i) - maxOutset = Math.max(maxOutset, 2 * (series[i].points.radius + series[i].points.lineWidth/2)); - - plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = maxOutset; - - var margin = options.grid.labelMargin + options.grid.borderWidth; - - if (axes.xaxis.labelHeight > 0) - plotOffset.bottom = Math.max(maxOutset, axes.xaxis.labelHeight + margin); - if (axes.yaxis.labelWidth > 0) - plotOffset.left = Math.max(maxOutset, axes.yaxis.labelWidth + margin); - if (axes.x2axis.labelHeight > 0) - plotOffset.top = Math.max(maxOutset, axes.x2axis.labelHeight + margin); - if (axes.y2axis.labelWidth > 0) - plotOffset.right = Math.max(maxOutset, axes.y2axis.labelWidth + margin); - - plotWidth = canvasWidth - plotOffset.left - plotOffset.right; - plotHeight = canvasHeight - plotOffset.bottom - plotOffset.top; - } - - var axis; - for (axis in axes) - setRange(axes[axis], options[axis]); - - if (options.grid.show) { - for (axis in axes) { - prepareTickGeneration(axes[axis], options[axis]); - setTicks(axes[axis], options[axis]); - measureLabels(axes[axis], options[axis]); - } - - setGridSpacing(); - } - else { - plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = 0; - plotWidth = canvasWidth; - plotHeight = canvasHeight; - } - - for (axis in axes) - setTransformationHelpers(axes[axis], options[axis]); - - if (options.grid.show) - insertLabels(); - - insertLegend(); - } - - function setRange(axis, axisOptions) { - var min = +(axisOptions.min != null ? axisOptions.min : axis.datamin), - max = +(axisOptions.max != null ? axisOptions.max : axis.datamax), - delta = max - min; - - if (delta == 0.0) { - // degenerate case - var widen = max == 0 ? 1 : 0.01; - - if (axisOptions.min == null) - min -= widen; - // alway widen max if we couldn't widen min to ensure we - // don't fall into min == max which doesn't work - if (axisOptions.max == null || axisOptions.min != null) - max += widen; - } - else { - // consider autoscaling - var margin = axisOptions.autoscaleMargin; - if (margin != null) { - if (axisOptions.min == null) { - min -= delta * margin; - // make sure we don't go below zero if all values - // are positive - if (min < 0 && axis.datamin != null && axis.datamin >= 0) - min = 0; - } - if (axisOptions.max == null) { - max += delta * margin; - if (max > 0 && axis.datamax != null && axis.datamax <= 0) - max = 0; - } - } - } - axis.min = min; - axis.max = max; - } - - function prepareTickGeneration(axis, axisOptions) { - // estimate number of ticks - var noTicks; - if (typeof axisOptions.ticks == "number" && axisOptions.ticks > 0) - noTicks = axisOptions.ticks; - else if (axis == axes.xaxis || axis == axes.x2axis) - // heuristic based on the model a*sqrt(x) fitted to - // some reasonable data points - noTicks = 0.3 * Math.sqrt(canvasWidth); - else - noTicks = 0.3 * Math.sqrt(canvasHeight); - - var delta = (axis.max - axis.min) / noTicks, - size, generator, unit, formatter, i, magn, norm; - - if (axisOptions.mode == "time") { - // pretty handling of time - - // map of app. size of time units in milliseconds - var timeUnitSize = { - "second": 1000, - "minute": 60 * 1000, - "hour": 60 * 60 * 1000, - "day": 24 * 60 * 60 * 1000, - "month": 30 * 24 * 60 * 60 * 1000, - "year": 365.2425 * 24 * 60 * 60 * 1000 - }; - - - // the allowed tick sizes, after 1 year we use - // an integer algorithm - var spec = [ - [1, "second"], [2, "second"], [5, "second"], [10, "second"], - [30, "second"], - [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], - [30, "minute"], - [1, "hour"], [2, "hour"], [4, "hour"], - [8, "hour"], [12, "hour"], - [1, "day"], [2, "day"], [3, "day"], - [0.25, "month"], [0.5, "month"], [1, "month"], - [2, "month"], [3, "month"], [6, "month"], - [1, "year"] - ]; - - var minSize = 0; - if (axisOptions.minTickSize != null) { - if (typeof axisOptions.tickSize == "number") - minSize = axisOptions.tickSize; - else - minSize = axisOptions.minTickSize[0] * timeUnitSize[axisOptions.minTickSize[1]]; - } - - for (i = 0; i < spec.length - 1; ++i) - if (delta < (spec[i][0] * timeUnitSize[spec[i][1]] - + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 - && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) - break; - size = spec[i][0]; - unit = spec[i][1]; - - // special-case the possibility of several years - if (unit == "year") { - magn = Math.pow(10, Math.floor(Math.log(delta / timeUnitSize.year) / Math.LN10)); - norm = (delta / timeUnitSize.year) / magn; - if (norm < 1.5) - size = 1; - else if (norm < 3) - size = 2; - else if (norm < 7.5) - size = 5; - else - size = 10; - - size *= magn; - } - - if (axisOptions.tickSize) { - size = axisOptions.tickSize[0]; - unit = axisOptions.tickSize[1]; - } - - generator = function(axis) { - var ticks = [], - tickSize = axis.tickSize[0], unit = axis.tickSize[1], - d = new Date(axis.min); - - var step = tickSize * timeUnitSize[unit]; - - if (unit == "second") - d.setUTCSeconds(floorInBase(d.getUTCSeconds(), tickSize)); - if (unit == "minute") - d.setUTCMinutes(floorInBase(d.getUTCMinutes(), tickSize)); - if (unit == "hour") - d.setUTCHours(floorInBase(d.getUTCHours(), tickSize)); - if (unit == "month") - d.setUTCMonth(floorInBase(d.getUTCMonth(), tickSize)); - if (unit == "year") - d.setUTCFullYear(floorInBase(d.getUTCFullYear(), tickSize)); - - // reset smaller components - d.setUTCMilliseconds(0); - if (step >= timeUnitSize.minute) - d.setUTCSeconds(0); - if (step >= timeUnitSize.hour) - d.setUTCMinutes(0); - if (step >= timeUnitSize.day) - d.setUTCHours(0); - if (step >= timeUnitSize.day * 4) - d.setUTCDate(1); - if (step >= timeUnitSize.year) - d.setUTCMonth(0); - - - var carry = 0, v = Number.NaN, prev; - do { - prev = v; - v = d.getTime(); - ticks.push({ v: v, label: axis.tickFormatter(v, axis) }); - if (unit == "month") { - if (tickSize < 1) { - // a bit complicated - we'll divide the month - // up but we need to take care of fractions - // so we don't end up in the middle of a day - d.setUTCDate(1); - var start = d.getTime(); - d.setUTCMonth(d.getUTCMonth() + 1); - var end = d.getTime(); - d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize); - carry = d.getUTCHours(); - d.setUTCHours(0); - } - else - d.setUTCMonth(d.getUTCMonth() + tickSize); - } - else if (unit == "year") { - d.setUTCFullYear(d.getUTCFullYear() + tickSize); - } - else - d.setTime(v + step); - } while (v < axis.max && v != prev); - - return ticks; - }; - - formatter = function (v, axis) { - var d = new Date(v); - - // first check global format - if (axisOptions.timeformat != null) - return $.plot.formatDate(d, axisOptions.timeformat, axisOptions.monthNames); - - var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; - var span = axis.max - axis.min; - var suffix = (axisOptions.twelveHourClock) ? " %p" : ""; - - if (t < timeUnitSize.minute) - fmt = "%h:%M:%S" + suffix; - else if (t < timeUnitSize.day) { - if (span < 2 * timeUnitSize.day) - fmt = "%h:%M" + suffix; - else - fmt = "%b %d %h:%M" + suffix; - } - else if (t < timeUnitSize.month) - fmt = "%b %d"; - else if (t < timeUnitSize.year) { - if (span < timeUnitSize.year) - fmt = "%b"; - else - fmt = "%b %y"; - } - else - fmt = "%y"; - - return $.plot.formatDate(d, fmt, axisOptions.monthNames); - }; - } - else { - // pretty rounding of base-10 numbers - var maxDec = axisOptions.tickDecimals; - var dec = -Math.floor(Math.log(delta) / Math.LN10); - if (maxDec != null && dec > maxDec) - dec = maxDec; - - magn = Math.pow(10, -dec); - norm = delta / magn; // norm is between 1.0 and 10.0 - - if (norm < 1.5) - size = 1; - else if (norm < 3) { - size = 2; - // special case for 2.5, requires an extra decimal - if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) { - size = 2.5; - ++dec; - } - } - else if (norm < 7.5) - size = 5; - else - size = 10; - - size *= magn; - - if (axisOptions.minTickSize != null && size < axisOptions.minTickSize) - size = axisOptions.minTickSize; - - if (axisOptions.tickSize != null) - size = axisOptions.tickSize; - - axis.tickDecimals = Math.max(0, (maxDec != null) ? maxDec : dec); - - generator = function (axis) { - var ticks = []; - - // spew out all possible ticks - var start = floorInBase(axis.min, axis.tickSize), - i = 0, v = Number.NaN, prev; - do { - prev = v; - v = start + i * axis.tickSize; - ticks.push({ v: v, label: axis.tickFormatter(v, axis) }); - ++i; - } while (v < axis.max && v != prev); - return ticks; - }; - - formatter = function (v, axis) { - return v.toFixed(axis.tickDecimals); - }; - } - - axis.tickSize = unit ? [size, unit] : size; - axis.tickGenerator = generator; - if ($.isFunction(axisOptions.tickFormatter)) - axis.tickFormatter = function (v, axis) { return "" + axisOptions.tickFormatter(v, axis); }; - else - axis.tickFormatter = formatter; - } - - function setTicks(axis, axisOptions) { - axis.ticks = []; - - if (!axis.used) - return; - - if (axisOptions.ticks == null) - axis.ticks = axis.tickGenerator(axis); - else if (typeof axisOptions.ticks == "number") { - if (axisOptions.ticks > 0) - axis.ticks = axis.tickGenerator(axis); - } - else if (axisOptions.ticks) { - var ticks = axisOptions.ticks; - - if ($.isFunction(ticks)) - // generate the ticks - ticks = ticks({ min: axis.min, max: axis.max }); - - // clean up the user-supplied ticks, copy them over - var i, v; - for (i = 0; i < ticks.length; ++i) { - var label = null; - var t = ticks[i]; - if (typeof t == "object") { - v = t[0]; - if (t.length > 1) - label = t[1]; - } - else - v = t; - if (label == null) - label = axis.tickFormatter(v, axis); - axis.ticks[i] = { v: v, label: label }; - } - } - - if (axisOptions.autoscaleMargin != null && axis.ticks.length > 0) { - // snap to ticks - if (axisOptions.min == null) - axis.min = Math.min(axis.min, axis.ticks[0].v); - if (axisOptions.max == null && axis.ticks.length > 1) - axis.max = Math.max(axis.max, axis.ticks[axis.ticks.length - 1].v); - } - } - - function draw() { - ctx.clearRect(0, 0, canvasWidth, canvasHeight); - - var grid = options.grid; - - if (grid.show && !grid.aboveData) - drawGrid(); - - for (var i = 0; i < series.length; ++i) - drawSeries(series[i]); - - executeHooks(hooks.draw, [ctx]); - - if (grid.show && grid.aboveData) - drawGrid(); - } - - function extractRange(ranges, coord) { - var firstAxis = coord + "axis", - secondaryAxis = coord + "2axis", - axis, from, to, reverse; - - if (ranges[firstAxis]) { - axis = axes[firstAxis]; - from = ranges[firstAxis].from; - to = ranges[firstAxis].to; - } - else if (ranges[secondaryAxis]) { - axis = axes[secondaryAxis]; - from = ranges[secondaryAxis].from; - to = ranges[secondaryAxis].to; - } - else { - // backwards-compat stuff - to be removed in future - axis = axes[firstAxis]; - from = ranges[coord + "1"]; - to = ranges[coord + "2"]; - } - - // auto-reverse as an added bonus - if (from != null && to != null && from > to) - return { from: to, to: from, axis: axis }; - - return { from: from, to: to, axis: axis }; - } - - function drawGrid() { - var i; - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - // draw background, if any - if (options.grid.backgroundColor) { - ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)"); - ctx.fillRect(0, 0, plotWidth, plotHeight); - } - - // draw markings - var markings = options.grid.markings; - if (markings) { - if ($.isFunction(markings)) - // xmin etc. are backwards-compatible, to be removed in future - markings = markings({ xmin: axes.xaxis.min, xmax: axes.xaxis.max, ymin: axes.yaxis.min, ymax: axes.yaxis.max, xaxis: axes.xaxis, yaxis: axes.yaxis, x2axis: axes.x2axis, y2axis: axes.y2axis }); - - for (i = 0; i < markings.length; ++i) { - var m = markings[i], - xrange = extractRange(m, "x"), - yrange = extractRange(m, "y"); - - // fill in missing - if (xrange.from == null) - xrange.from = xrange.axis.min; - if (xrange.to == null) - xrange.to = xrange.axis.max; - if (yrange.from == null) - yrange.from = yrange.axis.min; - if (yrange.to == null) - yrange.to = yrange.axis.max; - - // clip - if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || - yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) - continue; - - xrange.from = Math.max(xrange.from, xrange.axis.min); - xrange.to = Math.min(xrange.to, xrange.axis.max); - yrange.from = Math.max(yrange.from, yrange.axis.min); - yrange.to = Math.min(yrange.to, yrange.axis.max); - - if (xrange.from == xrange.to && yrange.from == yrange.to) - continue; - - // then draw - xrange.from = xrange.axis.p2c(xrange.from); - xrange.to = xrange.axis.p2c(xrange.to); - yrange.from = yrange.axis.p2c(yrange.from); - yrange.to = yrange.axis.p2c(yrange.to); - - if (xrange.from == xrange.to || yrange.from == yrange.to) { - // draw line - ctx.beginPath(); - ctx.strokeStyle = m.color || options.grid.markingsColor; - ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth; - //ctx.moveTo(Math.floor(xrange.from), yrange.from); - //ctx.lineTo(Math.floor(xrange.to), yrange.to); - ctx.moveTo(xrange.from, yrange.from); - ctx.lineTo(xrange.to, yrange.to); - ctx.stroke(); - } - else { - // fill area - ctx.fillStyle = m.color || options.grid.markingsColor; - ctx.fillRect(xrange.from, yrange.to, - xrange.to - xrange.from, - yrange.from - yrange.to); - } - } - } - - // draw the inner grid - ctx.lineWidth = 1; - ctx.strokeStyle = options.grid.tickColor; - ctx.beginPath(); - var v, axis = axes.xaxis; - for (i = 0; i < axis.ticks.length; ++i) { - v = axis.ticks[i].v; - if (v <= axis.min || v >= axes.xaxis.max) - continue; // skip those lying on the axes - - ctx.moveTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, 0); - ctx.lineTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, plotHeight); - } - - axis = axes.yaxis; - for (i = 0; i < axis.ticks.length; ++i) { - v = axis.ticks[i].v; - if (v <= axis.min || v >= axis.max) - continue; - - ctx.moveTo(0, Math.floor(axis.p2c(v)) + ctx.lineWidth/2); - ctx.lineTo(plotWidth, Math.floor(axis.p2c(v)) + ctx.lineWidth/2); - } - - axis = axes.x2axis; - for (i = 0; i < axis.ticks.length; ++i) { - v = axis.ticks[i].v; - if (v <= axis.min || v >= axis.max) - continue; - - ctx.moveTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, -5); - ctx.lineTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, 5); - } - - axis = axes.y2axis; - for (i = 0; i < axis.ticks.length; ++i) { - v = axis.ticks[i].v; - if (v <= axis.min || v >= axis.max) - continue; - - ctx.moveTo(plotWidth-5, Math.floor(axis.p2c(v)) + ctx.lineWidth/2); - ctx.lineTo(plotWidth+5, Math.floor(axis.p2c(v)) + ctx.lineWidth/2); - } - - ctx.stroke(); - - if (options.grid.borderWidth) { - // draw border - var bw = options.grid.borderWidth; - ctx.lineWidth = bw; - ctx.strokeStyle = options.grid.borderColor; - ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); - } - - ctx.restore(); - } - - function insertLabels() { - placeholder.find(".tickLabels").remove(); - - var html = ['
    ']; - - function addLabels(axis, labelGenerator) { - for (var i = 0; i < axis.ticks.length; ++i) { - var tick = axis.ticks[i]; - if (!tick.label || tick.v < axis.min || tick.v > axis.max) - continue; - html.push(labelGenerator(tick, axis)); - } - } - - var margin = options.grid.labelMargin + options.grid.borderWidth; - - addLabels(axes.xaxis, function (tick, axis) { - return '
    ' + tick.label + "
    "; - }); - - - addLabels(axes.yaxis, function (tick, axis) { - return '
    ' + tick.label + "
    "; - }); - - addLabels(axes.x2axis, function (tick, axis) { - return '
    ' + tick.label + "
    "; - }); - - addLabels(axes.y2axis, function (tick, axis) { - return '
    ' + tick.label + "
    "; - }); - - html.push('
    '); - - placeholder.append(html.join("")); - } - - function drawSeries(series) { - if (series.lines.show) - drawSeriesLines(series); - if (series.bars.show) - drawSeriesBars(series); - if (series.points.show) - drawSeriesPoints(series); - } - - function drawSeriesLines(series) { - function plotLine(datapoints, xoffset, yoffset, axisx, axisy) { - var points = datapoints.points, - ps = datapoints.pointsize, - prevx = null, prevy = null; - - ctx.beginPath(); - for (var i = ps; i < points.length; i += ps) { - var x1 = points[i - ps], y1 = points[i - ps + 1], - x2 = points[i], y2 = points[i + 1]; - - if (x1 == null || x2 == null) - continue; - - // clip with ymin - if (y1 <= y2 && y1 < axisy.min) { - if (y2 < axisy.min) - continue; // line segment is outside - // compute new intersection point - x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.min; - } - else if (y2 <= y1 && y2 < axisy.min) { - if (y1 < axisy.min) - continue; - x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.min; - } - - // clip with ymax - if (y1 >= y2 && y1 > axisy.max) { - if (y2 > axisy.max) - continue; - x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.max; - } - else if (y2 >= y1 && y2 > axisy.max) { - if (y1 > axisy.max) - continue; - x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.max; - } - - // clip with xmin - if (x1 <= x2 && x1 < axisx.min) { - if (x2 < axisx.min) - continue; - y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.min; - } - else if (x2 <= x1 && x2 < axisx.min) { - if (x1 < axisx.min) - continue; - y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.min; - } - - // clip with xmax - if (x1 >= x2 && x1 > axisx.max) { - if (x2 > axisx.max) - continue; - y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.max; - } - else if (x2 >= x1 && x2 > axisx.max) { - if (x1 > axisx.max) - continue; - y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.max; - } - - if (x1 != prevx || y1 != prevy) - ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); - - prevx = x2; - prevy = y2; - ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset); - } - ctx.stroke(); - } - - function plotLineArea(datapoints, axisx, axisy) { - var points = datapoints.points, - ps = datapoints.pointsize, - bottom = Math.min(Math.max(0, axisy.min), axisy.max), - top, lastX = 0, areaOpen = false; - - for (var i = ps; i < points.length; i += ps) { - var x1 = points[i - ps], y1 = points[i - ps + 1], - x2 = points[i], y2 = points[i + 1]; - - if (areaOpen && x1 != null && x2 == null) { - // close area - ctx.lineTo(axisx.p2c(lastX), axisy.p2c(bottom)); - ctx.fill(); - areaOpen = false; - continue; - } - - if (x1 == null || x2 == null) - continue; - - // clip x values - - // clip with xmin - if (x1 <= x2 && x1 < axisx.min) { - if (x2 < axisx.min) - continue; - y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.min; - } - else if (x2 <= x1 && x2 < axisx.min) { - if (x1 < axisx.min) - continue; - y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.min; - } - - // clip with xmax - if (x1 >= x2 && x1 > axisx.max) { - if (x2 > axisx.max) - continue; - y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.max; - } - else if (x2 >= x1 && x2 > axisx.max) { - if (x1 > axisx.max) - continue; - y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.max; - } - - if (!areaOpen) { - // open area - ctx.beginPath(); - ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom)); - areaOpen = true; - } - - // now first check the case where both is outside - if (y1 >= axisy.max && y2 >= axisy.max) { - ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); - ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); - lastX = x2; - continue; - } - else if (y1 <= axisy.min && y2 <= axisy.min) { - ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); - ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); - lastX = x2; - continue; - } - - // else it's a bit more complicated, there might - // be two rectangles and two triangles we need to fill - // in; to find these keep track of the current x values - var x1old = x1, x2old = x2; - - // and clip the y values, without shortcutting - - // clip with ymin - if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { - x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.min; - } - else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { - x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.min; - } - - // clip with ymax - if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { - x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.max; - } - else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { - x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.max; - } - - - // if the x value was changed we got a rectangle - // to fill - if (x1 != x1old) { - if (y1 <= axisy.min) - top = axisy.min; - else - top = axisy.max; - - ctx.lineTo(axisx.p2c(x1old), axisy.p2c(top)); - ctx.lineTo(axisx.p2c(x1), axisy.p2c(top)); - } - - // fill the triangles - ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1)); - ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); - - // fill the other rectangle if it's there - if (x2 != x2old) { - if (y2 <= axisy.min) - top = axisy.min; - else - top = axisy.max; - - ctx.lineTo(axisx.p2c(x2), axisy.p2c(top)); - ctx.lineTo(axisx.p2c(x2old), axisy.p2c(top)); - } - - lastX = Math.max(x2, x2old); - } - - if (areaOpen) { - ctx.lineTo(axisx.p2c(lastX), axisy.p2c(bottom)); - ctx.fill(); - } - } - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - ctx.lineJoin = "round"; - - var lw = series.lines.lineWidth, - sw = series.shadowSize; - // FIXME: consider another form of shadow when filling is turned on - if (lw > 0 && sw > 0) { - // draw shadow as a thick and thin line with transparency - ctx.lineWidth = sw; - ctx.strokeStyle = "rgba(0,0,0,0.1)"; - // position shadow at angle from the mid of line - var angle = Math.PI/18; - plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis); - ctx.lineWidth = sw/2; - plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis); - } - - ctx.lineWidth = lw; - ctx.strokeStyle = series.color; - var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight); - if (fillStyle) { - ctx.fillStyle = fillStyle; - plotLineArea(series.datapoints, series.xaxis, series.yaxis); - } - - if (lw > 0) - plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis); - ctx.restore(); - } - - function drawSeriesPoints(series) { - function plotPoints(datapoints, radius, fillStyle, offset, circumference, axisx, axisy) { - var points = datapoints.points, ps = datapoints.pointsize; - - for (var i = 0; i < points.length; i += ps) { - var x = points[i], y = points[i + 1]; - if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) - continue; - - ctx.beginPath(); - ctx.arc(axisx.p2c(x), axisy.p2c(y) + offset, radius, 0, circumference, false); - if (fillStyle) { - ctx.fillStyle = fillStyle; - ctx.fill(); - } - ctx.stroke(); - } - } - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - var lw = series.lines.lineWidth, - sw = series.shadowSize, - radius = series.points.radius; - if (lw > 0 && sw > 0) { - // draw shadow in two steps - var w = sw / 2; - ctx.lineWidth = w; - ctx.strokeStyle = "rgba(0,0,0,0.1)"; - plotPoints(series.datapoints, radius, null, w + w/2, Math.PI, - series.xaxis, series.yaxis); - - ctx.strokeStyle = "rgba(0,0,0,0.2)"; - plotPoints(series.datapoints, radius, null, w/2, Math.PI, - series.xaxis, series.yaxis); - } - - ctx.lineWidth = lw; - ctx.strokeStyle = series.color; - plotPoints(series.datapoints, radius, - getFillStyle(series.points, series.color), 0, 2 * Math.PI, - series.xaxis, series.yaxis); - ctx.restore(); - } - - function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal) { - var left, right, bottom, top, - drawLeft, drawRight, drawTop, drawBottom, - tmp; - - if (horizontal) { - drawBottom = drawRight = drawTop = true; - drawLeft = false; - left = b; - right = x; - top = y + barLeft; - bottom = y + barRight; - - // account for negative bars - if (right < left) { - tmp = right; - right = left; - left = tmp; - drawLeft = true; - drawRight = false; - } - } - else { - drawLeft = drawRight = drawTop = true; - drawBottom = false; - left = x + barLeft; - right = x + barRight; - bottom = b; - top = y; - - // account for negative bars - if (top < bottom) { - tmp = top; - top = bottom; - bottom = tmp; - drawBottom = true; - drawTop = false; - } - } - - // clip - if (right < axisx.min || left > axisx.max || - top < axisy.min || bottom > axisy.max) - return; - - if (left < axisx.min) { - left = axisx.min; - drawLeft = false; - } - - if (right > axisx.max) { - right = axisx.max; - drawRight = false; - } - - if (bottom < axisy.min) { - bottom = axisy.min; - drawBottom = false; - } - - if (top > axisy.max) { - top = axisy.max; - drawTop = false; - } - - left = axisx.p2c(left); - bottom = axisy.p2c(bottom); - right = axisx.p2c(right); - top = axisy.p2c(top); - - // fill the bar - if (fillStyleCallback) { - c.beginPath(); - c.moveTo(left, bottom); - c.lineTo(left, top); - c.lineTo(right, top); - c.lineTo(right, bottom); - c.fillStyle = fillStyleCallback(bottom, top); - c.fill(); - } - - // draw outline - if (drawLeft || drawRight || drawTop || drawBottom) { - c.beginPath(); - - // FIXME: inline moveTo is buggy with excanvas - c.moveTo(left, bottom + offset); - if (drawLeft) - c.lineTo(left, top + offset); - else - c.moveTo(left, top + offset); - if (drawTop) - c.lineTo(right, top + offset); - else - c.moveTo(right, top + offset); - if (drawRight) - c.lineTo(right, bottom + offset); - else - c.moveTo(right, bottom + offset); - if (drawBottom) - c.lineTo(left, bottom + offset); - else - c.moveTo(left, bottom + offset); - c.stroke(); - } - } - - function drawSeriesBars(series) { - function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) { - var points = datapoints.points, ps = datapoints.pointsize; - - for (var i = 0; i < points.length; i += ps) { - if (points[i] == null) - continue; - drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal); - } - } - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - // FIXME: figure out a way to add shadows (for instance along the right edge) - ctx.lineWidth = series.bars.lineWidth; - ctx.strokeStyle = series.color; - var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; - var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; - plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis); - ctx.restore(); - } - - function getFillStyle(filloptions, seriesColor, bottom, top) { - var fill = filloptions.fill; - if (!fill) - return null; - - if (filloptions.fillColor) - return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); - - var c = $.color.parse(seriesColor); - c.a = typeof fill == "number" ? fill : 0.4; - c.normalize(); - return c.toString(); - } - - function insertLegend() { - placeholder.find(".legend").remove(); - - if (!options.legend.show) - return; - - var fragments = [], rowStarted = false, - lf = options.legend.labelFormatter, s, label; - for (i = 0; i < series.length; ++i) { - s = series[i]; - label = s.label; - if (!label) - continue; - - if (i % options.legend.noColumns == 0) { - if (rowStarted) - fragments.push(''); - fragments.push(''); - rowStarted = true; - } - - if (lf) - label = lf(label, s); - - fragments.push( - '
    ' + - '' + label + ''); - } - if (rowStarted) - fragments.push(''); - - if (fragments.length == 0) - return; - - var table = '' + fragments.join("") + '
    '; - if (options.legend.container != null) - $(options.legend.container).html(table); - else { - var pos = "", - p = options.legend.position, - m = options.legend.margin; - if (m[0] == null) - m = [m, m]; - if (p.charAt(0) == "n") - pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; - else if (p.charAt(0) == "s") - pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; - if (p.charAt(1) == "e") - pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; - else if (p.charAt(1) == "w") - pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; - var legend = $('
    ' + table.replace('style="', 'style="position:absolute;' + pos +';') + '
    ').appendTo(placeholder); - if (options.legend.backgroundOpacity != 0.0) { - // put in the transparent background - // separately to avoid blended labels and - // label boxes - var c = options.legend.backgroundColor; - if (c == null) { - c = options.grid.backgroundColor; - if (c && typeof c == "string") - c = $.color.parse(c); - else - c = $.color.extract(legend, 'background-color'); - c.a = 1; - c = c.toString(); - } - var div = legend.children(); - $('
    ').prependTo(legend).css('opacity', options.legend.backgroundOpacity); - } - } - } - - - // interactive features - - var highlights = [], - redrawTimeout = null; - - // returns the data item the mouse is over, or null if none is found - function findNearbyItem(mouseX, mouseY, seriesFilter) { - var maxDistance = options.grid.mouseActiveRadius, - smallestDistance = maxDistance * maxDistance + 1, - item = null, foundPoint = false, i, j; - - for (i = 0; i < series.length; ++i) { - if (!seriesFilter(series[i])) - continue; - - var s = series[i], - axisx = s.xaxis, - axisy = s.yaxis, - points = s.datapoints.points, - ps = s.datapoints.pointsize, - mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster - my = axisy.c2p(mouseY), - maxx = maxDistance / axisx.scale, - maxy = maxDistance / axisy.scale; - - if (s.lines.show || s.points.show) { - for (j = 0; j < points.length; j += ps) { - var x = points[j], y = points[j + 1]; - if (x == null) - continue; - - // For points and lines, the cursor must be within a - // certain distance to the data point - if (x - mx > maxx || x - mx < -maxx || - y - my > maxy || y - my < -maxy) - continue; - - // We have to calculate distances in pixels, not in - // data units, because the scales of the axes may be different - var dx = Math.abs(axisx.p2c(x) - mouseX), - dy = Math.abs(axisy.p2c(y) - mouseY), - dist = dx * dx + dy * dy; // we save the sqrt - - // use <= to ensure last point takes precedence - // (last generally means on top of) - if (dist <= smallestDistance) { - smallestDistance = dist; - item = [i, j / ps]; - } - } - } - - if (s.bars.show && !item) { // no other point can be nearby - var barLeft = s.bars.align == "left" ? 0 : -s.bars.barWidth/2, - barRight = barLeft + s.bars.barWidth; - - for (j = 0; j < points.length; j += ps) { - var x = points[j], y = points[j + 1], b = points[j + 2]; - if (x == null) - continue; - - // for a bar graph, the cursor must be inside the bar - if (series[i].bars.horizontal ? - (mx <= Math.max(b, x) && mx >= Math.min(b, x) && - my >= y + barLeft && my <= y + barRight) : - (mx >= x + barLeft && mx <= x + barRight && - my >= Math.min(b, y) && my <= Math.max(b, y))) - item = [i, j / ps]; - } - } - } - - if (item) { - i = item[0]; - j = item[1]; - ps = series[i].datapoints.pointsize; - - return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps), - dataIndex: j, - series: series[i], - seriesIndex: i }; - } - - return null; - } - - function onMouseMove(e) { - if (options.grid.hoverable) - triggerClickHoverEvent("plothover", e, - function (s) { return s["hoverable"] != false; }); - } - - function onClick(e) { - triggerClickHoverEvent("plotclick", e, - function (s) { return s["clickable"] != false; }); - } - - // trigger click or hover event (they send the same parameters - // so we share their code) - function triggerClickHoverEvent(eventname, event, seriesFilter) { - var offset = eventHolder.offset(), - pos = { pageX: event.pageX, pageY: event.pageY }, - canvasX = event.pageX - offset.left - plotOffset.left, - canvasY = event.pageY - offset.top - plotOffset.top; - - if (axes.xaxis.used) - pos.x = axes.xaxis.c2p(canvasX); - if (axes.yaxis.used) - pos.y = axes.yaxis.c2p(canvasY); - if (axes.x2axis.used) - pos.x2 = axes.x2axis.c2p(canvasX); - if (axes.y2axis.used) - pos.y2 = axes.y2axis.c2p(canvasY); - - var item = findNearbyItem(canvasX, canvasY, seriesFilter); - - if (item) { - // fill in mouse pos for any listeners out there - item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left); - item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top); - } - - if (options.grid.autoHighlight) { - // clear auto-highlights - for (var i = 0; i < highlights.length; ++i) { - var h = highlights[i]; - if (h.auto == eventname && - !(item && h.series == item.series && h.point == item.datapoint)) - unhighlight(h.series, h.point); - } - - if (item) - highlight(item.series, item.datapoint, eventname); - } - - placeholder.trigger(eventname, [ pos, item ]); - } - - function triggerRedrawOverlay() { - if (!redrawTimeout) - redrawTimeout = setTimeout(drawOverlay, 30); - } - - function drawOverlay() { - redrawTimeout = null; - - // draw highlights - octx.save(); - octx.clearRect(0, 0, canvasWidth, canvasHeight); - octx.translate(plotOffset.left, plotOffset.top); - - var i, hi; - for (i = 0; i < highlights.length; ++i) { - hi = highlights[i]; - - if (hi.series.bars.show) - drawBarHighlight(hi.series, hi.point); - else - drawPointHighlight(hi.series, hi.point); - } - octx.restore(); - - executeHooks(hooks.drawOverlay, [octx]); - } - - function highlight(s, point, auto) { - if (typeof s == "number") - s = series[s]; - - if (typeof point == "number") - point = s.data[point]; - - var i = indexOfHighlight(s, point); - if (i == -1) { - highlights.push({ series: s, point: point, auto: auto }); - - triggerRedrawOverlay(); - } - else if (!auto) - highlights[i].auto = false; - } - - function unhighlight(s, point) { - if (s == null && point == null) { - highlights = []; - triggerRedrawOverlay(); - } - - if (typeof s == "number") - s = series[s]; - - if (typeof point == "number") - point = s.data[point]; - - var i = indexOfHighlight(s, point); - if (i != -1) { - highlights.splice(i, 1); - - triggerRedrawOverlay(); - } - } - - function indexOfHighlight(s, p) { - for (var i = 0; i < highlights.length; ++i) { - var h = highlights[i]; - if (h.series == s && h.point[0] == p[0] - && h.point[1] == p[1]) - return i; - } - return -1; - } - - function drawPointHighlight(series, point) { - var x = point[0], y = point[1], - axisx = series.xaxis, axisy = series.yaxis; - - if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) - return; - - var pointRadius = series.points.radius + series.points.lineWidth / 2; - octx.lineWidth = pointRadius; - octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); - var radius = 1.5 * pointRadius; - octx.beginPath(); - octx.arc(axisx.p2c(x), axisy.p2c(y), radius, 0, 2 * Math.PI, false); - octx.stroke(); - } - - function drawBarHighlight(series, point) { - octx.lineWidth = series.bars.lineWidth; - octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); - var fillStyle = $.color.parse(series.color).scale('a', 0.5).toString(); - var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; - drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth, - 0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal); - } - - function getColorOrGradient(spec, bottom, top, defaultColor) { - if (typeof spec == "string") - return spec; - else { - // assume this is a gradient spec; IE currently only - // supports a simple vertical gradient properly, so that's - // what we support too - var gradient = ctx.createLinearGradient(0, top, 0, bottom); - - for (var i = 0, l = spec.colors.length; i < l; ++i) { - var c = spec.colors[i]; - if (typeof c != "string") { - c = $.color.parse(defaultColor).scale('rgb', c.brightness); - c.a *= c.opacity; - c = c.toString(); - } - gradient.addColorStop(i / (l - 1), c); - } - - return gradient; - } - } - } - - $.plot = function(placeholder, data, options) { - var plot = new Plot($(placeholder), data, options, $.plot.plugins); - /*var t0 = new Date(); - var t1 = new Date(); - var tstr = "time used (msecs): " + (t1.getTime() - t0.getTime()) - if (window.console) - console.log(tstr); - else - alert(tstr);*/ - return plot; - }; - - $.plot.plugins = []; - - // returns a string with the date d formatted according to fmt - $.plot.formatDate = function(d, fmt, monthNames) { - var leftPad = function(n) { - n = "" + n; - return n.length == 1 ? "0" + n : n; - }; - - var r = []; - var escape = false; - var hours = d.getUTCHours(); - var isAM = hours < 12; - if (monthNames == null) - monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - - if (fmt.search(/%p|%P/) != -1) { - if (hours > 12) { - hours = hours - 12; - } else if (hours == 0) { - hours = 12; - } - } - for (var i = 0; i < fmt.length; ++i) { - var c = fmt.charAt(i); - - if (escape) { - switch (c) { - case 'h': c = "" + hours; break; - case 'H': c = leftPad(hours); break; - case 'M': c = leftPad(d.getUTCMinutes()); break; - case 'S': c = leftPad(d.getUTCSeconds()); break; - case 'd': c = "" + d.getUTCDate(); break; - case 'm': c = "" + (d.getUTCMonth() + 1); break; - case 'y': c = "" + d.getUTCFullYear(); break; - case 'b': c = "" + monthNames[d.getUTCMonth()]; break; - case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break; - case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break; - } - r.push(c); - escape = false; - } - else { - if (c == "%") - escape = true; - else - r.push(c); - } - } - return r.join(""); - }; - - // round to nearby lower multiple of base - function floorInBase(n, base) { - return base * Math.floor(n / base); - } - -})(jQuery); diff --git a/Website/static/jquery.flot.min.js b/Website/static/jquery.flot.min.js deleted file mode 100644 index 31f465b..0000000 --- a/Website/static/jquery.flot.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){jQuery.color={};jQuery.color.make=function(G,H,J,I){var A={};A.r=G||0;A.g=H||0;A.b=J||0;A.a=I!=null?I:1;A.add=function(C,D){for(var E=0;E=1){return"rgb("+[A.r,A.g,A.b].join(",")+")"}else{return"rgba("+[A.r,A.g,A.b,A.a].join(",")+")"}};A.normalize=function(){function C(E,D,F){return DF?F:D)}A.r=C(0,parseInt(A.r),255);A.g=C(0,parseInt(A.g),255);A.b=C(0,parseInt(A.b),255);A.a=C(0,A.a,1);return A};A.clone=function(){return jQuery.color.make(A.r,A.b,A.g,A.a)};return A.normalize()};jQuery.color.extract=function(E,F){var A;do{A=E.css(F).toLowerCase();if(A!=""&&A!="transparent"){break}E=E.parent()}while(!jQuery.nodeName(E.get(0),"body"));if(A=="rgba(0, 0, 0, 0)"){A="transparent"}return jQuery.color.parse(A)};jQuery.color.parse=function(A){var F,H=jQuery.color.make;if(F=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(A)){return H(parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10))}if(F=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(A)){return H(parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10),parseFloat(F[4]))}if(F=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(A)){return H(parseFloat(F[1])*2.55,parseFloat(F[2])*2.55,parseFloat(F[3])*2.55)}if(F=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(A)){return H(parseFloat(F[1])*2.55,parseFloat(F[2])*2.55,parseFloat(F[3])*2.55,parseFloat(F[4]))}if(F=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(A)){return H(parseInt(F[1],16),parseInt(F[2],16),parseInt(F[3],16))}if(F=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(A)){return H(parseInt(F[1]+F[1],16),parseInt(F[2]+F[2],16),parseInt(F[3]+F[3],16))}var G=jQuery.trim(A).toLowerCase();if(G=="transparent"){return H(255,255,255,0)}else{F=B[G];return H(F[0],F[1],F[2])}};var B={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})();(function(C){function B(l,W,X,E){var O=[],g={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{mode:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,twelveHourClock:false},yaxis:{autoscaleMargin:0.02},x2axis:{autoscaleMargin:null},y2axis:{autoscaleMargin:0.02},series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false},shadowSize:3},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,tickColor:"rgba(0,0,0,0.15)",labelMargin:5,borderWidth:2,borderColor:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},hooks:{}},P=null,AC=null,AD=null,Y=null,AJ=null,s={xaxis:{},yaxis:{},x2axis:{},y2axis:{}},e={left:0,right:0,top:0,bottom:0},y=0,Q=0,I=0,t=0,L={processOptions:[],processRawData:[],processDatapoints:[],draw:[],bindEvents:[],drawOverlay:[]},G=this;G.setData=f;G.setupGrid=k;G.draw=AH;G.getPlaceholder=function(){return l};G.getCanvas=function(){return P};G.getPlotOffset=function(){return e};G.width=function(){return I};G.height=function(){return t};G.offset=function(){var AK=AD.offset();AK.left+=e.left;AK.top+=e.top;return AK};G.getData=function(){return O};G.getAxes=function(){return s};G.getOptions=function(){return g};G.highlight=AE;G.unhighlight=x;G.triggerRedrawOverlay=q;G.pointOffset=function(AK){return{left:parseInt(T(AK,"xaxis").p2c(+AK.x)+e.left),top:parseInt(T(AK,"yaxis").p2c(+AK.y)+e.top)}};G.hooks=L;b(G);r(X);c();f(W);k();AH();AG();function Z(AM,AK){AK=[G].concat(AK);for(var AL=0;AL=g.colors.length){AP=0;++AO}}var AQ=0,AW;for(AP=0;APAl.datamax){Al.datamax=Aj}}for(Ac=0;Ac0&&Ab[AZ-AX]!=null&&Ab[AZ-AX]!=Ab[AZ]&&Ab[AZ-AX+1]!=Ab[AZ+1]){for(AV=0;AVAU){AU=Ai}}if(Af.y){if(AiAd){Ad=Ai}}}}if(AR.bars.show){var Ag=AR.bars.align=="left"?0:-AR.bars.barWidth/2;if(AR.bars.horizontal){AY+=Ag;Ad+=Ag+AR.bars.barWidth}else{AS+=Ag;AU+=Ag+AR.bars.barWidth}}AN(AR.xaxis,AS,AU);AN(AR.yaxis,AY,Ad)}for(AK in s){if(s[AK].datamin==AW){s[AK].datamin=null}if(s[AK].datamax==AQ){s[AK].datamax=null}}}function c(){function AK(AM,AL){var AN=document.createElement("canvas");AN.width=AM;AN.height=AL;if(C.browser.msie){AN=window.G_vmlCanvasManager.initElement(AN)}return AN}y=l.width();Q=l.height();l.html("");if(l.css("position")=="static"){l.css("position","relative")}if(y<=0||Q<=0){throw"Invalid dimensions for plot, width = "+y+", height = "+Q}if(C.browser.msie){window.G_vmlCanvasManager.init_(document)}P=C(AK(y,Q)).appendTo(l).get(0);Y=P.getContext("2d");AC=C(AK(y,Q)).css({position:"absolute",left:0,top:0}).appendTo(l).get(0);AJ=AC.getContext("2d");AJ.stroke()}function AG(){AD=C([AC,P]);if(g.grid.hoverable){AD.mousemove(D)}if(g.grid.clickable){AD.click(d)}Z(L.bindEvents,[AD])}function k(){function AL(AT,AU){function AP(AV){return AV}var AS,AO,AQ=AU.transform||AP,AR=AU.inverseTransform;if(AT==s.xaxis||AT==s.x2axis){AS=AT.scale=I/(AQ(AT.max)-AQ(AT.min));AO=AQ(AT.min);if(AQ==AP){AT.p2c=function(AV){return(AV-AO)*AS}}else{AT.p2c=function(AV){return(AQ(AV)-AO)*AS}}if(!AR){AT.c2p=function(AV){return AO+AV/AS}}else{AT.c2p=function(AV){return AR(AO+AV/AS)}}}else{AS=AT.scale=t/(AQ(AT.max)-AQ(AT.min));AO=AQ(AT.max);if(AQ==AP){AT.p2c=function(AV){return(AO-AV)*AS}}else{AT.p2c=function(AV){return(AO-AQ(AV))*AS}}if(!AR){AT.c2p=function(AV){return AO-AV/AS}}else{AT.c2p=function(AV){return AR(AO-AV/AS)}}}}function AN(AR,AT){var AQ,AS=[],AP;AR.labelWidth=AT.labelWidth;AR.labelHeight=AT.labelHeight;if(AR==s.xaxis||AR==s.x2axis){if(AR.labelWidth==null){AR.labelWidth=y/(AR.ticks.length>0?AR.ticks.length:1)}if(AR.labelHeight==null){AS=[];for(AQ=0;AQ'+AP+"")}}if(AS.length>0){var AO=C('
    '+AS.join("")+'
    ').appendTo(l);AR.labelHeight=AO.height();AO.remove()}}}else{if(AR.labelWidth==null||AR.labelHeight==null){for(AQ=0;AQ'+AP+"")}}if(AS.length>0){var AO=C('
    '+AS.join("")+"
    ").appendTo(l);if(AR.labelWidth==null){AR.labelWidth=AO.width()}if(AR.labelHeight==null){AR.labelHeight=AO.find("div").height()}AO.remove()}}}if(AR.labelWidth==null){AR.labelWidth=0}if(AR.labelHeight==null){AR.labelHeight=0}}function AM(){var AP=g.grid.borderWidth;for(i=0;i0){e.bottom=Math.max(AP,s.xaxis.labelHeight+AO)}if(s.yaxis.labelWidth>0){e.left=Math.max(AP,s.yaxis.labelWidth+AO)}if(s.x2axis.labelHeight>0){e.top=Math.max(AP,s.x2axis.labelHeight+AO)}if(s.y2axis.labelWidth>0){e.right=Math.max(AP,s.y2axis.labelWidth+AO)}I=y-e.left-e.right;t=Q-e.bottom-e.top}var AK;for(AK in s){K(s[AK],g[AK])}if(g.grid.show){for(AK in s){F(s[AK],g[AK]);p(s[AK],g[AK]);AN(s[AK],g[AK])}AM()}else{e.left=e.right=e.top=e.bottom=0;I=y;t=Q}for(AK in s){AL(s[AK],g[AK])}if(g.grid.show){h()}AI()}function K(AN,AQ){var AM=+(AQ.min!=null?AQ.min:AN.datamin),AK=+(AQ.max!=null?AQ.max:AN.datamax),AP=AK-AM;if(AP==0){var AL=AK==0?1:0.01;if(AQ.min==null){AM-=AL}if(AQ.max==null||AQ.min!=null){AK+=AL}}else{var AO=AQ.autoscaleMargin;if(AO!=null){if(AQ.min==null){AM-=AP*AO;if(AM<0&&AN.datamin!=null&&AN.datamin>=0){AM=0}}if(AQ.max==null){AK+=AP*AO;if(AK>0&&AN.datamax!=null&&AN.datamax<=0){AK=0}}}}AN.min=AM;AN.max=AK}function F(AP,AS){var AO;if(typeof AS.ticks=="number"&&AS.ticks>0){AO=AS.ticks}else{if(AP==s.xaxis||AP==s.x2axis){AO=0.3*Math.sqrt(y)}else{AO=0.3*Math.sqrt(Q)}}var AX=(AP.max-AP.min)/AO,AZ,AT,AV,AW,AR,AM,AL;if(AS.mode=="time"){var AU={second:1000,minute:60*1000,hour:60*60*1000,day:24*60*60*1000,month:30*24*60*60*1000,year:365.2425*24*60*60*1000};var AY=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[0.25,"month"],[0.5,"month"],[1,"month"],[2,"month"],[3,"month"],[6,"month"],[1,"year"]];var AN=0;if(AS.minTickSize!=null){if(typeof AS.tickSize=="number"){AN=AS.tickSize}else{AN=AS.minTickSize[0]*AU[AS.minTickSize[1]]}}for(AR=0;AR=AN){break}}AZ=AY[AR][0];AV=AY[AR][1];if(AV=="year"){AM=Math.pow(10,Math.floor(Math.log(AX/AU.year)/Math.LN10));AL=(AX/AU.year)/AM;if(AL<1.5){AZ=1}else{if(AL<3){AZ=2}else{if(AL<7.5){AZ=5}else{AZ=10}}}AZ*=AM}if(AS.tickSize){AZ=AS.tickSize[0];AV=AS.tickSize[1]}AT=function(Ac){var Ah=[],Af=Ac.tickSize[0],Ai=Ac.tickSize[1],Ag=new Date(Ac.min);var Ab=Af*AU[Ai];if(Ai=="second"){Ag.setUTCSeconds(A(Ag.getUTCSeconds(),Af))}if(Ai=="minute"){Ag.setUTCMinutes(A(Ag.getUTCMinutes(),Af))}if(Ai=="hour"){Ag.setUTCHours(A(Ag.getUTCHours(),Af))}if(Ai=="month"){Ag.setUTCMonth(A(Ag.getUTCMonth(),Af))}if(Ai=="year"){Ag.setUTCFullYear(A(Ag.getUTCFullYear(),Af))}Ag.setUTCMilliseconds(0);if(Ab>=AU.minute){Ag.setUTCSeconds(0)}if(Ab>=AU.hour){Ag.setUTCMinutes(0)}if(Ab>=AU.day){Ag.setUTCHours(0)}if(Ab>=AU.day*4){Ag.setUTCDate(1)}if(Ab>=AU.year){Ag.setUTCMonth(0)}var Ak=0,Aj=Number.NaN,Ad;do{Ad=Aj;Aj=Ag.getTime();Ah.push({v:Aj,label:Ac.tickFormatter(Aj,Ac)});if(Ai=="month"){if(Af<1){Ag.setUTCDate(1);var Aa=Ag.getTime();Ag.setUTCMonth(Ag.getUTCMonth()+1);var Ae=Ag.getTime();Ag.setTime(Aj+Ak*AU.hour+(Ae-Aa)*Af);Ak=Ag.getUTCHours();Ag.setUTCHours(0)}else{Ag.setUTCMonth(Ag.getUTCMonth()+Af)}}else{if(Ai=="year"){Ag.setUTCFullYear(Ag.getUTCFullYear()+Af)}else{Ag.setTime(Aj+Ab)}}}while(AjAK){AQ=AK}AM=Math.pow(10,-AQ);AL=AX/AM;if(AL<1.5){AZ=1}else{if(AL<3){AZ=2;if(AL>2.25&&(AK==null||AQ+1<=AK)){AZ=2.5;++AQ}}else{if(AL<7.5){AZ=5}else{AZ=10}}}AZ*=AM;if(AS.minTickSize!=null&&AZ0){AO.ticks=AO.tickGenerator(AO)}}else{if(AQ.ticks){var AP=AQ.ticks;if(C.isFunction(AP)){AP=AP({min:AO.min,max:AO.max})}var AN,AK;for(AN=0;AN1){AL=AM[1]}}else{AK=AM}if(AL==null){AL=AO.tickFormatter(AK,AO)}AO.ticks[AN]={v:AK,label:AL}}}}}if(AQ.autoscaleMargin!=null&&AO.ticks.length>0){if(AQ.min==null){AO.min=Math.min(AO.min,AO.ticks[0].v)}if(AQ.max==null&&AO.ticks.length>1){AO.max=Math.max(AO.max,AO.ticks[AO.ticks.length-1].v)}}}function AH(){Y.clearRect(0,0,y,Q);var AL=g.grid;if(AL.show&&!AL.aboveData){S()}for(var AK=0;AKAP){return{from:AP,to:AQ,axis:AN}}return{from:AQ,to:AP,axis:AN}}function S(){var AO;Y.save();Y.translate(e.left,e.top);if(g.grid.backgroundColor){Y.fillStyle=R(g.grid.backgroundColor,t,0,"rgba(255, 255, 255, 0)");Y.fillRect(0,0,I,t)}var AL=g.grid.markings;if(AL){if(C.isFunction(AL)){AL=AL({xmin:s.xaxis.min,xmax:s.xaxis.max,ymin:s.yaxis.min,ymax:s.yaxis.max,xaxis:s.xaxis,yaxis:s.yaxis,x2axis:s.x2axis,y2axis:s.y2axis})}for(AO=0;AOAQ.axis.max||AN.toAN.axis.max){continue}AQ.from=Math.max(AQ.from,AQ.axis.min);AQ.to=Math.min(AQ.to,AQ.axis.max);AN.from=Math.max(AN.from,AN.axis.min);AN.to=Math.min(AN.to,AN.axis.max);if(AQ.from==AQ.to&&AN.from==AN.to){continue}AQ.from=AQ.axis.p2c(AQ.from);AQ.to=AQ.axis.p2c(AQ.to);AN.from=AN.axis.p2c(AN.from);AN.to=AN.axis.p2c(AN.to);if(AQ.from==AQ.to||AN.from==AN.to){Y.beginPath();Y.strokeStyle=AK.color||g.grid.markingsColor;Y.lineWidth=AK.lineWidth||g.grid.markingsLineWidth;Y.moveTo(AQ.from,AN.from);Y.lineTo(AQ.to,AN.to);Y.stroke()}else{Y.fillStyle=AK.color||g.grid.markingsColor;Y.fillRect(AQ.from,AN.to,AQ.to-AQ.from,AN.from-AN.to)}}}Y.lineWidth=1;Y.strokeStyle=g.grid.tickColor;Y.beginPath();var AM,AP=s.xaxis;for(AO=0;AO=s.xaxis.max){continue}Y.moveTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,0);Y.lineTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,t)}AP=s.yaxis;for(AO=0;AO=AP.max){continue}Y.moveTo(0,Math.floor(AP.p2c(AM))+Y.lineWidth/2);Y.lineTo(I,Math.floor(AP.p2c(AM))+Y.lineWidth/2)}AP=s.x2axis;for(AO=0;AO=AP.max){continue}Y.moveTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,-5);Y.lineTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,5)}AP=s.y2axis;for(AO=0;AO=AP.max){continue}Y.moveTo(I-5,Math.floor(AP.p2c(AM))+Y.lineWidth/2);Y.lineTo(I+5,Math.floor(AP.p2c(AM))+Y.lineWidth/2)}Y.stroke();if(g.grid.borderWidth){var AR=g.grid.borderWidth;Y.lineWidth=AR;Y.strokeStyle=g.grid.borderColor;Y.strokeRect(-AR/2,-AR/2,I+AR,t+AR)}Y.restore()}function h(){l.find(".tickLabels").remove();var AK=['
    '];function AM(AP,AQ){for(var AO=0;AOAP.max){continue}AK.push(AQ(AN,AP))}}var AL=g.grid.labelMargin+g.grid.borderWidth;AM(s.xaxis,function(AN,AO){return'
    '+AN.label+"
    "});AM(s.yaxis,function(AN,AO){return'
    '+AN.label+"
    "});AM(s.x2axis,function(AN,AO){return'
    '+AN.label+"
    "});AM(s.y2axis,function(AN,AO){return'
    '+AN.label+"
    "});AK.push("
    ");l.append(AK.join(""))}function AA(AK){if(AK.lines.show){a(AK)}if(AK.bars.show){n(AK)}if(AK.points.show){o(AK)}}function a(AN){function AM(AY,AZ,AR,Ad,Ac){var Ae=AY.points,AS=AY.pointsize,AW=null,AV=null;Y.beginPath();for(var AX=AS;AX=Aa&&Ab>Ac.max){if(Aa>Ac.max){continue}AU=(Ac.max-Ab)/(Aa-Ab)*(AT-AU)+AU;Ab=Ac.max}else{if(Aa>=Ab&&Aa>Ac.max){if(Ab>Ac.max){continue}AT=(Ac.max-Ab)/(Aa-Ab)*(AT-AU)+AU;Aa=Ac.max}}if(AU<=AT&&AU=AT&&AU>Ad.max){if(AT>Ad.max){continue}Ab=(Ad.max-AU)/(AT-AU)*(Aa-Ab)+Ab;AU=Ad.max}else{if(AT>=AU&&AT>Ad.max){if(AU>Ad.max){continue}Aa=(Ad.max-AU)/(AT-AU)*(Aa-Ab)+Ab;AT=Ad.max}}if(AU!=AW||Ab!=AV){Y.moveTo(Ad.p2c(AU)+AZ,Ac.p2c(Ab)+AR)}AW=AT;AV=Aa;Y.lineTo(Ad.p2c(AT)+AZ,Ac.p2c(Aa)+AR)}Y.stroke()}function AO(AX,Ae,Ac){var Af=AX.points,AR=AX.pointsize,AS=Math.min(Math.max(0,Ac.min),Ac.max),Aa,AV=0,Ad=false;for(var AW=AR;AW=AT&&AU>Ae.max){if(AT>Ae.max){continue}Ab=(Ae.max-AU)/(AT-AU)*(AZ-Ab)+Ab;AU=Ae.max}else{if(AT>=AU&&AT>Ae.max){if(AU>Ae.max){continue}AZ=(Ae.max-AU)/(AT-AU)*(AZ-Ab)+Ab;AT=Ae.max}}if(!Ad){Y.beginPath();Y.moveTo(Ae.p2c(AU),Ac.p2c(AS));Ad=true}if(Ab>=Ac.max&&AZ>=Ac.max){Y.lineTo(Ae.p2c(AU),Ac.p2c(Ac.max));Y.lineTo(Ae.p2c(AT),Ac.p2c(Ac.max));AV=AT;continue}else{if(Ab<=Ac.min&&AZ<=Ac.min){Y.lineTo(Ae.p2c(AU),Ac.p2c(Ac.min));Y.lineTo(Ae.p2c(AT),Ac.p2c(Ac.min));AV=AT;continue}}var Ag=AU,AY=AT;if(Ab<=AZ&&Ab=Ac.min){AU=(Ac.min-Ab)/(AZ-Ab)*(AT-AU)+AU;Ab=Ac.min}else{if(AZ<=Ab&&AZ=Ac.min){AT=(Ac.min-Ab)/(AZ-Ab)*(AT-AU)+AU;AZ=Ac.min}}if(Ab>=AZ&&Ab>Ac.max&&AZ<=Ac.max){AU=(Ac.max-Ab)/(AZ-Ab)*(AT-AU)+AU;Ab=Ac.max}else{if(AZ>=Ab&&AZ>Ac.max&&Ab<=Ac.max){AT=(Ac.max-Ab)/(AZ-Ab)*(AT-AU)+AU;AZ=Ac.max}}if(AU!=Ag){if(Ab<=Ac.min){Aa=Ac.min}else{Aa=Ac.max}Y.lineTo(Ae.p2c(Ag),Ac.p2c(Aa));Y.lineTo(Ae.p2c(AU),Ac.p2c(Aa))}Y.lineTo(Ae.p2c(AU),Ac.p2c(Ab));Y.lineTo(Ae.p2c(AT),Ac.p2c(AZ));if(AT!=AY){if(AZ<=Ac.min){Aa=Ac.min}else{Aa=Ac.max}Y.lineTo(Ae.p2c(AT),Ac.p2c(Aa));Y.lineTo(Ae.p2c(AY),Ac.p2c(Aa))}AV=Math.max(AT,AY)}if(Ad){Y.lineTo(Ae.p2c(AV),Ac.p2c(AS));Y.fill()}}Y.save();Y.translate(e.left,e.top);Y.lineJoin="round";var AP=AN.lines.lineWidth,AK=AN.shadowSize;if(AP>0&&AK>0){Y.lineWidth=AK;Y.strokeStyle="rgba(0,0,0,0.1)";var AQ=Math.PI/18;AM(AN.datapoints,Math.sin(AQ)*(AP/2+AK/2),Math.cos(AQ)*(AP/2+AK/2),AN.xaxis,AN.yaxis);Y.lineWidth=AK/2;AM(AN.datapoints,Math.sin(AQ)*(AP/2+AK/4),Math.cos(AQ)*(AP/2+AK/4),AN.xaxis,AN.yaxis)}Y.lineWidth=AP;Y.strokeStyle=AN.color;var AL=V(AN.lines,AN.color,0,t);if(AL){Y.fillStyle=AL;AO(AN.datapoints,AN.xaxis,AN.yaxis)}if(AP>0){AM(AN.datapoints,0,0,AN.xaxis,AN.yaxis)}Y.restore()}function o(AN){function AP(AU,AT,Ab,AR,AV,AZ,AY){var Aa=AU.points,AQ=AU.pointsize;for(var AS=0;ASAZ.max||AWAY.max){continue}Y.beginPath();Y.arc(AZ.p2c(AX),AY.p2c(AW)+AR,AT,0,AV,false);if(Ab){Y.fillStyle=Ab;Y.fill()}Y.stroke()}}Y.save();Y.translate(e.left,e.top);var AO=AN.lines.lineWidth,AL=AN.shadowSize,AK=AN.points.radius;if(AO>0&&AL>0){var AM=AL/2;Y.lineWidth=AM;Y.strokeStyle="rgba(0,0,0,0.1)";AP(AN.datapoints,AK,null,AM+AM/2,Math.PI,AN.xaxis,AN.yaxis);Y.strokeStyle="rgba(0,0,0,0.2)";AP(AN.datapoints,AK,null,AM/2,Math.PI,AN.xaxis,AN.yaxis)}Y.lineWidth=AO;Y.strokeStyle=AN.color;AP(AN.datapoints,AK,V(AN.points,AN.color),0,2*Math.PI,AN.xaxis,AN.yaxis);Y.restore()}function AB(AV,AU,Ad,AQ,AY,AN,AL,AT,AS,Ac,AZ){var AM,Ab,AR,AX,AO,AK,AW,AP,Aa;if(AZ){AP=AK=AW=true;AO=false;AM=Ad;Ab=AV;AX=AU+AQ;AR=AU+AY;if(AbAT.max||AXAS.max){return }if(AMAT.max){Ab=AT.max;AK=false}if(ARAS.max){AX=AS.max;AW=false}AM=AT.p2c(AM);AR=AS.p2c(AR);Ab=AT.p2c(Ab);AX=AS.p2c(AX);if(AL){Ac.beginPath();Ac.moveTo(AM,AR);Ac.lineTo(AM,AX);Ac.lineTo(Ab,AX);Ac.lineTo(Ab,AR);Ac.fillStyle=AL(AR,AX);Ac.fill()}if(AO||AK||AW||AP){Ac.beginPath();Ac.moveTo(AM,AR+AN);if(AO){Ac.lineTo(AM,AX+AN)}else{Ac.moveTo(AM,AX+AN)}if(AW){Ac.lineTo(Ab,AX+AN)}else{Ac.moveTo(Ab,AX+AN)}if(AK){Ac.lineTo(Ab,AR+AN)}else{Ac.moveTo(Ab,AR+AN)}if(AP){Ac.lineTo(AM,AR+AN)}else{Ac.moveTo(AM,AR+AN)}Ac.stroke()}}function n(AM){function AL(AS,AR,AU,AP,AT,AW,AV){var AX=AS.points,AO=AS.pointsize;for(var AQ=0;AQ")}AP.push("");AN=true}if(AV){AR=AV(AR,AU)}AP.push('
    '+AR+"")}if(AN){AP.push("")}if(AP.length==0){return }var AT=''+AP.join("")+"
    ";if(g.legend.container!=null){C(g.legend.container).html(AT)}else{var AQ="",AL=g.legend.position,AM=g.legend.margin;if(AM[0]==null){AM=[AM,AM]}if(AL.charAt(0)=="n"){AQ+="top:"+(AM[1]+e.top)+"px;"}else{if(AL.charAt(0)=="s"){AQ+="bottom:"+(AM[1]+e.bottom)+"px;"}}if(AL.charAt(1)=="e"){AQ+="right:"+(AM[0]+e.right)+"px;"}else{if(AL.charAt(1)=="w"){AQ+="left:"+(AM[0]+e.left)+"px;"}}var AS=C('
    '+AT.replace('style="','style="position:absolute;'+AQ+";")+"
    ").appendTo(l);if(g.legend.backgroundOpacity!=0){var AO=g.legend.backgroundColor;if(AO==null){AO=g.grid.backgroundColor;if(AO&&typeof AO=="string"){AO=C.color.parse(AO)}else{AO=C.color.extract(AS,"background-color")}AO.a=1;AO=AO.toString()}var AK=AS.children();C('
    ').prependTo(AS).css("opacity",g.legend.backgroundOpacity)}}}var w=[],J=null;function AF(AR,AP,AM){var AX=g.grid.mouseActiveRadius,Aj=AX*AX+1,Ah=null,Aa=false,Af,Ad;for(Af=0;AfAL||AT-AZ<-AL||AS-AW>AK||AS-AW<-AK){continue}var AV=Math.abs(AQ.p2c(AT)-AR),AU=Math.abs(AO.p2c(AS)-AP),Ab=AV*AV+AU*AU;if(Ab<=Aj){Aj=Ab;Ah=[Af,Ad/Ac]}}}if(AY.bars.show&&!Ah){var AN=AY.bars.align=="left"?0:-AY.bars.barWidth/2,Ag=AN+AY.bars.barWidth;for(Ad=0;Ad=Math.min(Ai,AT)&&AW>=AS+AN&&AW<=AS+Ag):(AZ>=AT+AN&&AZ<=AT+Ag&&AW>=Math.min(Ai,AS)&&AW<=Math.max(Ai,AS))){Ah=[Af,Ad/Ac]}}}}if(Ah){Af=Ah[0];Ad=Ah[1];Ac=O[Af].datapoints.pointsize;return{datapoint:O[Af].datapoints.points.slice(Ad*Ac,(Ad+1)*Ac),dataIndex:Ad,series:O[Af],seriesIndex:Af}}return null}function D(AK){if(g.grid.hoverable){H("plothover",AK,function(AL){return AL.hoverable!=false})}}function d(AK){H("plotclick",AK,function(AL){return AL.clickable!=false})}function H(AL,AK,AM){var AN=AD.offset(),AS={pageX:AK.pageX,pageY:AK.pageY},AQ=AK.pageX-AN.left-e.left,AO=AK.pageY-AN.top-e.top;if(s.xaxis.used){AS.x=s.xaxis.c2p(AQ)}if(s.yaxis.used){AS.y=s.yaxis.c2p(AO)}if(s.x2axis.used){AS.x2=s.x2axis.c2p(AQ)}if(s.y2axis.used){AS.y2=s.y2axis.c2p(AO)}var AT=AF(AQ,AO,AM);if(AT){AT.pageX=parseInt(AT.series.xaxis.p2c(AT.datapoint[0])+AN.left+e.left);AT.pageY=parseInt(AT.series.yaxis.p2c(AT.datapoint[1])+AN.top+e.top)}if(g.grid.autoHighlight){for(var AP=0;APAQ.max||ARAP.max){return }var AO=AN.points.radius+AN.points.lineWidth/2;AJ.lineWidth=AO;AJ.strokeStyle=C.color.parse(AN.color).scale("a",0.5).toString();var AK=1.5*AO;AJ.beginPath();AJ.arc(AQ.p2c(AL),AP.p2c(AR),AK,0,2*Math.PI,false);AJ.stroke()}function z(AN,AK){AJ.lineWidth=AN.bars.lineWidth;AJ.strokeStyle=C.color.parse(AN.color).scale("a",0.5).toString();var AM=C.color.parse(AN.color).scale("a",0.5).toString();var AL=AN.bars.align=="left"?0:-AN.bars.barWidth/2;AB(AK[0],AK[1],AK[2]||0,AL,AL+AN.bars.barWidth,0,function(){return AM},AN.xaxis,AN.yaxis,AJ,AN.bars.horizontal)}function R(AM,AL,AQ,AO){if(typeof AM=="string"){return AM}else{var AP=Y.createLinearGradient(0,AQ,0,AL);for(var AN=0,AK=AM.colors.length;AN12){K=K-12}else{if(K==0){K=12}}}for(var F=0;F1) - options.series.pie.tilt=1; - if (options.series.pie.tilt<0) - options.series.pie.tilt=0; - - // add processData hook to do transformations on the data - plot.hooks.processDatapoints.push(processDatapoints); - plot.hooks.drawOverlay.push(drawOverlay); - - // add draw hook - plot.hooks.draw.push(draw); - } - } - - // bind hoverable events - function bindEvents(plot, eventHolder) - { - var options = plot.getOptions(); - - if (options.series.pie.show && options.grid.hoverable) - eventHolder.unbind('mousemove').mousemove(onMouseMove); - - if (options.series.pie.show && options.grid.clickable) - eventHolder.unbind('click').click(onClick); - } - - - // debugging function that prints out an object - function alertObject(obj) - { - var msg = ''; - function traverse(obj, depth) - { - if (!depth) - depth = 0; - for (var i = 0; i < obj.length; ++i) - { - for (var j=0; jcanvas.width-maxRadius) - centerLeft = canvas.width-maxRadius; - } - - function fixData(data) - { - for (var i = 0; i < data.length; ++i) - { - if (typeof(data[i].data)=='number') - data[i].data = [[1,data[i].data]]; - else if (typeof(data[i].data)=='undefined' || typeof(data[i].data[0])=='undefined') - { - if (typeof(data[i].data)!='undefined' && typeof(data[i].data.label)!='undefined') - data[i].label = data[i].data.label; // fix weirdness coming from flot - data[i].data = [[1,0]]; - - } - } - return data; - } - - function combine(data) - { - data = fixData(data); - calcTotal(data); - var combined = 0; - var numCombined = 0; - var color = options.series.pie.combine.color; - - var newdata = []; - for (var i = 0; i < data.length; ++i) - { - // make sure its a number - data[i].data[0][1] = parseFloat(data[i].data[0][1]); - if (!data[i].data[0][1]) - data[i].data[0][1] = 0; - - if (data[i].data[0][1]/total<=options.series.pie.combine.threshold) - { - combined += data[i].data[0][1]; - numCombined++; - if (!color) - color = data[i].color; - } - else - { - newdata.push({ - data: [[1,data[i].data[0][1]]], - color: data[i].color, - label: data[i].label, - angle: (data[i].data[0][1]*(Math.PI*2))/total, - percent: (data[i].data[0][1]/total*100) - }); - } - } - if (numCombined>0) - newdata.push({ - data: [[1,combined]], - color: color, - label: options.series.pie.combine.label, - angle: (combined*(Math.PI*2))/total, - percent: (combined/total*100) - }); - return newdata; - } - - function draw(plot, newCtx) - { - if (!target) return; // if no series were passed - ctx = newCtx; - - setupPie(); - var slices = plot.getData(); - - var attempts = 0; - while (redraw && attempts0) - maxRadius *= shrink; - attempts += 1; - clear(); - if (options.series.pie.tilt<=0.8) - drawShadow(); - drawPie(); - } - if (attempts >= redrawAttempts) { - clear(); - target.prepend('
    Could not draw pie with labels contained inside canvas
    '); - } - - if ( plot.setSeries && plot.insertLegend ) - { - plot.setSeries(slices); - plot.insertLegend(); - } - - // we're actually done at this point, just defining internal functions at this point - - function clear() - { - ctx.clearRect(0,0,canvas.width,canvas.height); - target.children().filter('.pieLabel, .pieLabelBackground').remove(); - } - - function drawShadow() - { - var shadowLeft = 5; - var shadowTop = 15; - var edge = 10; - var alpha = 0.02; - - // set radius - if (options.series.pie.radius>1) - var radius = options.series.pie.radius; - else - var radius = maxRadius * options.series.pie.radius; - - if (radius>=(canvas.width/2)-shadowLeft || radius*options.series.pie.tilt>=(canvas.height/2)-shadowTop || radius<=edge) - return; // shadow would be outside canvas, so don't draw it - - ctx.save(); - ctx.translate(shadowLeft,shadowTop); - ctx.globalAlpha = alpha; - ctx.fillStyle = '#000'; - - // center and rotate to starting position - ctx.translate(centerLeft,centerTop); - ctx.scale(1, options.series.pie.tilt); - - //radius -= edge; - for (var i=1; i<=edge; i++) - { - ctx.beginPath(); - ctx.arc(0,0,radius,0,Math.PI*2,false); - ctx.fill(); - radius -= i; - } - - ctx.restore(); - } - - function drawPie() - { - startAngle = Math.PI*options.series.pie.startAngle; - - // set radius - if (options.series.pie.radius>1) - var radius = options.series.pie.radius; - else - var radius = maxRadius * options.series.pie.radius; - - // center and rotate to starting position - ctx.save(); - ctx.translate(centerLeft,centerTop); - ctx.scale(1, options.series.pie.tilt); - //ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera - - // draw slices - ctx.save(); - var currentAngle = startAngle; - for (var i = 0; i < slices.length; ++i) - { - slices[i].startAngle = currentAngle; - drawSlice(slices[i].angle, slices[i].color, true); - } - ctx.restore(); - - // draw slice outlines - ctx.save(); - ctx.lineWidth = options.series.pie.stroke.width; - currentAngle = startAngle; - for (var i = 0; i < slices.length; ++i) - drawSlice(slices[i].angle, options.series.pie.stroke.color, false); - ctx.restore(); - - // draw donut hole - drawDonutHole(ctx); - - // draw labels - if (options.series.pie.label.show) - drawLabels(); - - // restore to original state - ctx.restore(); - - function drawSlice(angle, color, fill) - { - if (angle<=0) - return; - - if (fill) - ctx.fillStyle = color; - else - { - ctx.strokeStyle = color; - ctx.lineJoin = 'round'; - } - - ctx.beginPath(); - if (Math.abs(angle - Math.PI*2) > 0.000000001) - ctx.moveTo(0,0); // Center of the pie - else if ($.browser.msie) - angle -= 0.0001; - //ctx.arc(0,0,radius,0,angle,false); // This doesn't work properly in Opera - ctx.arc(0,0,radius,currentAngle,currentAngle+angle,false); - ctx.closePath(); - //ctx.rotate(angle); // This doesn't work properly in Opera - currentAngle += angle; - - if (fill) - ctx.fill(); - else - ctx.stroke(); - } - - function drawLabels() - { - var currentAngle = startAngle; - - // set radius - if (options.series.pie.label.radius>1) - var radius = options.series.pie.label.radius; - else - var radius = maxRadius * options.series.pie.label.radius; - - for (var i = 0; i < slices.length; ++i) - { - if (slices[i].percent >= options.series.pie.label.threshold*100) - drawLabel(slices[i], currentAngle, i); - currentAngle += slices[i].angle; - } - - function drawLabel(slice, startAngle, index) - { - if (slice.data[0][1]==0) - return; - - // format label text - var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter; - if (lf) - text = lf(slice.label, slice); - else - text = slice.label; - if (plf) - text = plf(text, slice); - - var halfAngle = ((startAngle+slice.angle) + startAngle)/2; - var x = centerLeft + Math.round(Math.cos(halfAngle) * radius); - var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt; - - var html = '' + text + ""; - target.append(html); - var label = target.children('#pieLabel'+index); - var labelTop = (y - label.height()/2); - var labelLeft = (x - label.width()/2); - label.css('top', labelTop); - label.css('left', labelLeft); - - // check to make sure that the label is not outside the canvas - if (0-labelTop>0 || 0-labelLeft>0 || canvas.height-(labelTop+label.height())<0 || canvas.width-(labelLeft+label.width())<0) - redraw = true; - - if (options.series.pie.label.background.opacity != 0) { - // put in the transparent background separately to avoid blended labels and label boxes - var c = options.series.pie.label.background.color; - if (c == null) { - c = slice.color; - } - var pos = 'top:'+labelTop+'px;left:'+labelLeft+'px;'; - $('
    ').insertBefore(label).css('opacity', options.series.pie.label.background.opacity); - } - } // end individual label function - } // end drawLabels function - } // end drawPie function - } // end draw function - - // Placed here because it needs to be accessed from multiple locations - function drawDonutHole(layer) - { - // draw donut hole - if(options.series.pie.innerRadius > 0) - { - // subtract the center - layer.save(); - innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius; - layer.globalCompositeOperation = 'destination-out'; // this does not work with excanvas, but it will fall back to using the stroke color - layer.beginPath(); - layer.fillStyle = options.series.pie.stroke.color; - layer.arc(0,0,innerRadius,0,Math.PI*2,false); - layer.fill(); - layer.closePath(); - layer.restore(); - - // add inner stroke - layer.save(); - layer.beginPath(); - layer.strokeStyle = options.series.pie.stroke.color; - layer.arc(0,0,innerRadius,0,Math.PI*2,false); - layer.stroke(); - layer.closePath(); - layer.restore(); - // TODO: add extra shadow inside hole (with a mask) if the pie is tilted. - } - } - - //-- Additional Interactive related functions -- - - function isPointInPoly(poly, pt) - { - for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) - ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1])) - && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]) - && (c = !c); - return c; - } - - function findNearbySlice(mouseX, mouseY) - { - var slices = plot.getData(), - options = plot.getOptions(), - radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; - - for (var i = 0; i < slices.length; ++i) - { - var s = slices[i]; - - if(s.pie.show) - { - ctx.save(); - ctx.beginPath(); - ctx.moveTo(0,0); // Center of the pie - //ctx.scale(1, options.series.pie.tilt); // this actually seems to break everything when here. - ctx.arc(0,0,radius,s.startAngle,s.startAngle+s.angle,false); - ctx.closePath(); - x = mouseX-centerLeft; - y = mouseY-centerTop; - if(ctx.isPointInPath) - { - if (ctx.isPointInPath(mouseX-centerLeft, mouseY-centerTop)) - { - //alert('found slice!'); - ctx.restore(); - return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; - } - } - else - { - // excanvas for IE doesn;t support isPointInPath, this is a workaround. - p1X = (radius * Math.cos(s.startAngle)); - p1Y = (radius * Math.sin(s.startAngle)); - p2X = (radius * Math.cos(s.startAngle+(s.angle/4))); - p2Y = (radius * Math.sin(s.startAngle+(s.angle/4))); - p3X = (radius * Math.cos(s.startAngle+(s.angle/2))); - p3Y = (radius * Math.sin(s.startAngle+(s.angle/2))); - p4X = (radius * Math.cos(s.startAngle+(s.angle/1.5))); - p4Y = (radius * Math.sin(s.startAngle+(s.angle/1.5))); - p5X = (radius * Math.cos(s.startAngle+s.angle)); - p5Y = (radius * Math.sin(s.startAngle+s.angle)); - arrPoly = [[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,p5Y]]; - arrPoint = [x,y]; - // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt? - if(isPointInPoly(arrPoly, arrPoint)) - { - ctx.restore(); - return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; - } - } - ctx.restore(); - } - } - - return null; - } - - function onMouseMove(e) - { - triggerClickHoverEvent('plothover', e); - } - - function onClick(e) - { - triggerClickHoverEvent('plotclick', e); - } - - // trigger click or hover event (they send the same parameters so we share their code) - function triggerClickHoverEvent(eventname, e) - { - var offset = plot.offset(), - canvasX = parseInt(e.pageX - offset.left), - canvasY = parseInt(e.pageY - offset.top), - item = findNearbySlice(canvasX, canvasY); - - if (options.grid.autoHighlight) - { - // clear auto-highlights - for (var i = 0; i < highlights.length; ++i) - { - var h = highlights[i]; - if (h.auto == eventname && !(item && h.series == item.series)) - unhighlight(h.series); - } - } - - // highlight the slice - if (item) - highlight(item.series, eventname); - - // trigger any hover bind events - var pos = { pageX: e.pageX, pageY: e.pageY }; - target.trigger(eventname, [ pos, item ]); - } - - function highlight(s, auto) - { - if (typeof s == "number") - s = series[s]; - - var i = indexOfHighlight(s); - if (i == -1) - { - highlights.push({ series: s, auto: auto }); - plot.triggerRedrawOverlay(); - } - else if (!auto) - highlights[i].auto = false; - } - - function unhighlight(s) - { - if (s == null) - { - highlights = []; - plot.triggerRedrawOverlay(); - } - - if (typeof s == "number") - s = series[s]; - - var i = indexOfHighlight(s); - if (i != -1) - { - highlights.splice(i, 1); - plot.triggerRedrawOverlay(); - } - } - - function indexOfHighlight(s) - { - for (var i = 0; i < highlights.length; ++i) - { - var h = highlights[i]; - if (h.series == s) - return i; - } - return -1; - } - - function drawOverlay(plot, octx) - { - //alert(options.series.pie.radius); - var options = plot.getOptions(); - //alert(options.series.pie.radius); - - var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; - - octx.save(); - octx.translate(centerLeft, centerTop); - octx.scale(1, options.series.pie.tilt); - - for (i = 0; i < highlights.length; ++i) - drawHighlight(highlights[i].series); - - drawDonutHole(octx); - - octx.restore(); - - function drawHighlight(series) - { - if (series.angle < 0) return; - - //octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString(); - octx.fillStyle = "rgba(255, 255, 255, "+options.series.pie.highlight.opacity+")"; // this is temporary until we have access to parseColor - - octx.beginPath(); - if (Math.abs(series.angle - Math.PI*2) > 0.000000001) - octx.moveTo(0,0); // Center of the pie - octx.arc(0,0,radius,series.startAngle,series.startAngle+series.angle,false); - octx.closePath(); - octx.fill(); - } - - } - - } // end init (plugin body) - - // define pie specific options and their default values - var options = { - series: { - pie: { - show: false, - radius: 'auto', // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value) - innerRadius:0, /* for donut */ - startAngle: 3/2, - tilt: 1, - offset: { - top: 0, - left: 'auto' - }, - stroke: { - color: '#FFF', - width: 1 - }, - label: { - show: 'auto', - formatter: function(label, slice){ - return '
    '+label+'
    '+Math.round(slice.percent)+'%
    '; - }, // formatter function - radius: 1, // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value) - background: { - color: null, - opacity: 0 - }, - threshold: 0 // percentage at which to hide the label (i.e. the slice is too narrow) - }, - combine: { - threshold: -1, // percentage at which to combine little slices into one larger slice - color: null, // color to give the new slice (auto-generated if null) - label: 'Other' // label to give the new slice - }, - highlight: { - //color: '#FFF', // will add this functionality once parseColor is available - opacity: 0.5 - } - } - } - }; - - $.plot.plugins.push({ - init: init, - options: options, - name: "pie", - version: "1.0" - }); -})(jQuery); diff --git a/Website/static/jquery.flot.stack.js b/Website/static/jquery.flot.stack.js deleted file mode 100644 index a31d5dc..0000000 --- a/Website/static/jquery.flot.stack.js +++ /dev/null @@ -1,184 +0,0 @@ -/* -Flot plugin for stacking data sets, i.e. putting them on top of each -other, for accumulative graphs. - -The plugin assumes the data is sorted on x (or y if stacking -horizontally). For line charts, it is assumed that if a line has an -undefined gap (from a null point), then the line above it should have -the same gap - insert zeros instead of "null" if you want another -behaviour. This also holds for the start and end of the chart. Note -that stacking a mix of positive and negative values in most instances -doesn't make sense (so it looks weird). - -Two or more series are stacked when their "stack" attribute is set to -the same key (which can be any number or string or just "true"). To -specify the default stack, you can set - - series: { - stack: null or true or key (number/string) - } - -or specify it for a specific series - - $.plot($("#placeholder"), [{ data: [ ... ], stack: true }]) - -The stacking order is determined by the order of the data series in -the array (later series end up on top of the previous). - -Internally, the plugin modifies the datapoints in each series, adding -an offset to the y value. For line series, extra data points are -inserted through interpolation. If there's a second y value, it's also -adjusted (e.g for bar charts or filled areas). -*/ - -(function ($) { - var options = { - series: { stack: null } // or number/string - }; - - function init(plot) { - function findMatchingSeries(s, allseries) { - var res = null - for (var i = 0; i < allseries.length; ++i) { - if (s == allseries[i]) - break; - - if (allseries[i].stack == s.stack) - res = allseries[i]; - } - - return res; - } - - function stackData(plot, s, datapoints) { - if (s.stack == null) - return; - - var other = findMatchingSeries(s, plot.getData()); - if (!other) - return; - - var ps = datapoints.pointsize, - points = datapoints.points, - otherps = other.datapoints.pointsize, - otherpoints = other.datapoints.points, - newpoints = [], - px, py, intery, qx, qy, bottom, - withlines = s.lines.show, - horizontal = s.bars.horizontal, - withbottom = ps > 2 && (horizontal ? datapoints.format[2].x : datapoints.format[2].y), - withsteps = withlines && s.lines.steps, - fromgap = true, - keyOffset = horizontal ? 1 : 0, - accumulateOffset = horizontal ? 0 : 1, - i = 0, j = 0, l; - - while (true) { - if (i >= points.length) - break; - - l = newpoints.length; - - if (points[i] == null) { - // copy gaps - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - i += ps; - } - else if (j >= otherpoints.length) { - // for lines, we can't use the rest of the points - if (!withlines) { - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - } - i += ps; - } - else if (otherpoints[j] == null) { - // oops, got a gap - for (m = 0; m < ps; ++m) - newpoints.push(null); - fromgap = true; - j += otherps; - } - else { - // cases where we actually got two points - px = points[i + keyOffset]; - py = points[i + accumulateOffset]; - qx = otherpoints[j + keyOffset]; - qy = otherpoints[j + accumulateOffset]; - bottom = 0; - - if (px == qx) { - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - - newpoints[l + accumulateOffset] += qy; - bottom = qy; - - i += ps; - j += otherps; - } - else if (px > qx) { - // we got past point below, might need to - // insert interpolated extra point - if (withlines && i > 0 && points[i - ps] != null) { - intery = py + (points[i - ps + accumulateOffset] - py) * (qx - px) / (points[i - ps + keyOffset] - px); - newpoints.push(qx); - newpoints.push(intery + qy); - for (m = 2; m < ps; ++m) - newpoints.push(points[i + m]); - bottom = qy; - } - - j += otherps; - } - else { // px < qx - if (fromgap && withlines) { - // if we come from a gap, we just skip this point - i += ps; - continue; - } - - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - - // we might be able to interpolate a point below, - // this can give us a better y - if (withlines && j > 0 && otherpoints[j - otherps] != null) - bottom = qy + (otherpoints[j - otherps + accumulateOffset] - qy) * (px - qx) / (otherpoints[j - otherps + keyOffset] - qx); - - newpoints[l + accumulateOffset] += bottom; - - i += ps; - } - - fromgap = false; - - if (l != newpoints.length && withbottom) - newpoints[l + 2] += bottom; - } - - // maintain the line steps invariant - if (withsteps && l != newpoints.length && l > 0 - && newpoints[l] != null - && newpoints[l] != newpoints[l - ps] - && newpoints[l + 1] != newpoints[l - ps + 1]) { - for (m = 0; m < ps; ++m) - newpoints[l + ps + m] = newpoints[l + m]; - newpoints[l + 1] = newpoints[l - ps + 1]; - } - } - - datapoints.points = newpoints; - } - - plot.hooks.processDatapoints.push(stackData); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'stack', - version: '1.2' - }); -})(jQuery); diff --git a/Website/static/jquery.flot.threshold.multiple.js b/Website/static/jquery.flot.threshold.multiple.js deleted file mode 100755 index d00390e..0000000 --- a/Website/static/jquery.flot.threshold.multiple.js +++ /dev/null @@ -1,191 +0,0 @@ -/* -Flot plugin for specifying range of thresolds on data. -Controlled through the option "constraints" in a specific series - -usage - - $.plot($("#placeholder"), [{ data: [ ... ], constraints: [constraint1, constraint2]},{data:[...],constraints:[...]}]) - - where constraint1 = { - threshold: 2, - color: "rgb(0,0,0)", - evaluate : function(y,threshold){ return y < threshold; } - } - threshold -> y-limit on the plot. - evaluate -> the function which defines the limit.This function defines wheteher y < threshold or y > threshold. - color -> the color with which to plot portion of the graph which satisfies the limit condition. - - - -Internally, the plugin works by splitting the data into different series, one for each constraint. - -*/ -(function($){ - - function testing(){ - return "working"; - } - function init(plot){ - - function plotWithMultipleThresholds(plot,s,datapoints){ - if(s.data && s.data.length > 0 && s.constraints && s.constraints.length>0){ - var series = new Graph(s.data,s.constraints).getPlotData(); - for(var i=0;i= 0 ; i--) { - var constraint = this._constraints[i]; - if(null != constraint.threshold){ - var set = new Resolve(this._dataset).using(constraint.threshold, constraint.evaluate); - this._plotData.push( { - data : set, - color : constraint.color - }); - } - } - return this._plotData; - }; - - function Resolve(originalPonits) { - this._originalPoints = originalPonits; - this._data = []; - this._getPointOnThreshold = _getPointOnThreshold; - this.using = using ; - - function using(threshold, evaluate) { - var count = 0; - for ( var i = 0; i < this._originalPoints.length; i++) { - var currentPoint = this._originalPoints[i]; - if (evaluate(currentPoint[1],threshold)) { - if (i > 0 - && (this._data.length == 0 || this._data[count - 1] == null)) { - this._data[count++] = this._getPointOnThreshold(threshold,this._originalPoints[i - 1], currentPoint); - } - this._data[count++] = currentPoint; - } else { - if (this._data.length > 0 && this._data[count - 1] != null) { - this._data[count++] = this._getPointOnThreshold(threshold,this._originalPoints[i - 1], currentPoint); - this._data[count++] = null; - this._data[count++] = null; - } - } - } - return this._data; - } - - function _getPointOnThreshold(threshold, prevP, currP) { - var currentX = currP[0]; - var currentY = currP[1]; - - var prevX = prevP[0]; - var prevY = prevP[1]; - - var slope = (threshold - currentY) - / (prevY - currentY); - var xOnConstraintLine = slope * (prevX - currentX) + currentX; - - return [ xOnConstraintLine, threshold ]; - } - } - - function _getSortedConstraints(originalpoints,constraints){ - - var dataRange = _findMaxAndMin(originalpoints); - - if(undefined == dataRange)return []; - - var max = dataRange.max; - var min = dataRange.min; - var thresholdRanges = []; - var sortedConstraints = []; - for(var i = 0; i < constraints.length ; i++){ - var constraint = constraints[i]; - var range = 0; - if(constraint.evaluate(min,constraint.threshold)){ - range = Math.abs(constraint.threshold - min); - }else{ - range = Math.abs(max - constraint.threshold); - } - thresholdRanges.push({constraint:constraint,range:range}); - } - QuickSort(thresholdRanges,function(obj1,obj2){ return obj1.range < obj2.range;}); - for(var i=thresholdRanges.length-1;i>=0;i--){ - sortedConstraints[i] = thresholdRanges[i].constraint; - } - return sortedConstraints; - } - - function _findMaxAndMin(dataset){ - if(undefined == dataset)return undefined; - var arr = []; - for( var i=0;i left){ - var pivotIndex = Math.floor(( left + right )/2); - var pivotNewIndex = partition(array,left,right,pivotIndex,comparator); - sort(array, left, pivotNewIndex - 1,comparator); - sort(array, pivotNewIndex + 1, right,comparator); - - } - } - - function partition(array,left,right,pivotIndex,comparator){ - var pivot = array[pivotIndex]; - swap(array,pivotIndex,right); - var storeIndex = left; - for( var i= left ; i < right ; i++){ - if(comparator(array[i] , pivot)){ - swap(array,i,storeIndex); - storeIndex = storeIndex + 1; - } - } - swap(array,storeIndex,right); - - return storeIndex; - } - - function swap(array,index1,index2){ - var temp = array[index1]; - array[index1] = array[index2]; - array[index2] = temp; - } - } - - - plot.hooks.processRawData.push(plotWithMultipleThresholds); - } - -$.plot.plugins.push({ - init: init, - name: 'multiple.threshold', - version: '1.0' - }); -})(jQuery); - - diff --git a/Website/static/jquery.flot.valuelabels.js b/Website/static/jquery.flot.valuelabels.js deleted file mode 100644 index 9a47e60..0000000 --- a/Website/static/jquery.flot.valuelabels.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Value Labels Plugin for flot. - * http://leonardoeloy.github.com/flot-valuelabels - * http://wiki.github.com/leonardoeloy/flot-valuelabels/ - * - * Using canvas.fillText instead of divs, which is better for printing - by Leonardo Eloy, March 2010. - * Tested with Flot 0.6 and JQuery 1.3.2. - * - * Original homepage: http://sites.google.com/site/petrsstuff/projects/flotvallab - * Released under the MIT license by Petr Blahos, December 2009. - */ -(function ($) { - var options = { - valueLabels: { - show: false, - showAsHtml: false, // Set to true if you wanna switch back to DIV usage (you need plot.css for this) - showLastValue: false // Use this to show the label only for the last value in the series - } - }; - - function init(plot) { - plot.hooks.draw.push(function (plot, ctx) { - if (!plot.getOptions().valueLabels.show) return; - - var showLastValue = plot.getOptions().valueLabels.showLastValue; - var showAsHtml = plot.getOptions().valueLabels.showAsHtml; - var ctx = plot.getCanvas().getContext("2d"); - $.each(plot.getData(), function(ii, series) { - // Workaround, since Flot doesn't set this value anymore - series.seriesIndex = ii; - if (showAsHtml) plot.getPlaceholder().find("#valueLabels"+ii).remove(); - var html = '
    '; - - var last_val = null; - var last_x = -1000; - var last_y = -1000; - for (var i = 0; i < series.data.length; ++i) { - if (series.data[i] == null || (showLastValue && i != series.data.length-1)) continue; - - var x = series.data[i][0], y = series.data[i][1]; - if (x < series.xaxis.min || x > series.xaxis.max || y < series.yaxis.min || y > series.yaxis.max) continue; - var val = y; - - if (series.valueLabelFunc) val = series.valueLabelFunc({ series: series, seriesIndex: ii, index: i }); - val = ""+val; - - if (val!=last_val || i==series.data.length-1) { - var xx = series.xaxis.p2c(x)+plot.getPlotOffset().left; - var yy = series.yaxis.p2c(y)-12+plot.getPlotOffset().top; - if (Math.abs(yy-last_y)>20 || last_x= plot.width()) x_pos = plot.width(); - - ctx.fillText(val, x_pos, y_pos); - } else { - var head = '
    ' + val + '
    '; - html+= head + "Light" + tail + head + tail; - } - } - } - } - - if (showAsHtml) { - html+= "
    "; - plot.getPlaceholder().append(html); - } - }); - }); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'valueLabels', - version: '1.1' - }); -})(jQuery); - diff --git a/Website/static/jquery.min.js b/Website/static/jquery.min.js deleted file mode 100755 index 48590ec..0000000 --- a/Website/static/jquery.min.js +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Jun 30 14:16:56 2011 -0400 - */ -(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
    a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
    ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. -shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j -)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
    ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/Website/static/jquery.sparkline.min.js b/Website/static/jquery.sparkline.min.js deleted file mode 100644 index fe745b4..0000000 --- a/Website/static/jquery.sparkline.min.js +++ /dev/null @@ -1,94 +0,0 @@ -/* jquery.sparkline 1.6 - http://omnipotent.net/jquery.sparkline/ -** Licensed under the New BSD License - see above site for details */ - -(function($){var defaults={common:{type:'line',lineColor:'#00f',fillColor:'#cdf',defaultPixelsPerValue:3,width:'auto',height:'auto',composite:false,tagValuesAttribute:'values',tagOptionsPrefix:'spark',enableTagOptions:false},line:{spotColor:'#f80',spotRadius:1.5,minSpotColor:'#f80',maxSpotColor:'#f80',lineWidth:1,normalRangeMin:undefined,normalRangeMax:undefined,normalRangeColor:'#ccc',drawNormalOnTop:false,chartRangeMin:undefined,chartRangeMax:undefined,chartRangeMinX:undefined,chartRangeMaxX:undefined},bar:{barColor:'#00f',negBarColor:'#f44',zeroColor:undefined,nullColor:undefined,zeroAxis:undefined,barWidth:4,barSpacing:1,chartRangeMax:undefined,chartRangeMin:undefined,chartRangeClip:false,colorMap:undefined},tristate:{barWidth:4,barSpacing:1,posBarColor:'#6f6',negBarColor:'#f44',zeroBarColor:'#999',colorMap:{}},discrete:{lineHeight:'auto',thresholdColor:undefined,thresholdValue:0,chartRangeMax:undefined,chartRangeMin:undefined,chartRangeClip:false},bullet:{targetColor:'red',targetWidth:3,performanceColor:'blue',rangeColors:['#D3DAFE','#A8B6FF','#7F94FF'],base:undefined},pie:{sliceColors:['#f00','#0f0','#00f']},box:{raw:false,boxLineColor:'black',boxFillColor:'#cdf',whiskerColor:'black',outlierLineColor:'#333',outlierFillColor:'white',medianColor:'red',showOutliers:true,outlierIQR:1.5,spotRadius:1.5,target:undefined,targetColor:'#4a2',chartRangeMax:undefined,chartRangeMin:undefined}};var VCanvas_base,VCanvas_canvas,VCanvas_vml;$.fn.simpledraw=function(width,height,use_existing){if(use_existing&&this[0].VCanvas){return this[0].VCanvas;} -if(width===undefined){width=$(this).innerWidth();} -if(height===undefined){height=$(this).innerHeight();} -if($.browser.hasCanvas){return new VCanvas_canvas(width,height,this);}else if($.browser.msie){return new VCanvas_vml(width,height,this);}else{return false;}};var pending=[];$.fn.sparkline=function(uservalues,userOptions){return this.each(function(){var options=new $.fn.sparkline.options(this,userOptions);var render=function(){var values,width,height;if(uservalues==='html'||uservalues===undefined){var vals=this.getAttribute(options.get('tagValuesAttribute'));if(vals===undefined||vals===null){vals=$(this).html();} -values=vals.replace(/(^\s*\s*$)|\s+/g,'').split(',');}else{values=uservalues;} -width=options.get('width')=='auto'?values.length*options.get('defaultPixelsPerValue'):options.get('width');if(options.get('height')=='auto'){if(!options.get('composite')||!this.VCanvas){var tmp=document.createElement('span');tmp.innerHTML='a';$(this).html(tmp);height=$(tmp).innerHeight();$(tmp).remove();}}else{height=options.get('height');} -$.fn.sparkline[options.get('type')].call(this,values,options,width,height);};if(($(this).html()&&$(this).is(':hidden'))||($.fn.jquery<"1.3.0"&&$(this).parents().is(':hidden'))||!$(this).parents('body').length){pending.push([this,render]);}else{render.call(this);}});};$.fn.sparkline.defaults=defaults;$.sparkline_display_visible=function(){for(var i=pending.length-1;i>=0;i--){var el=pending[i][0];if($(el).is(':visible')&&!$(el).parents().is(':hidden')){pending[i][1].call(el);pending.splice(i,1);}}};var UNSET_OPTION={};var normalizeValue=function(val){switch(val){case'undefined':val=undefined;break;case'null':val=null;break;case'true':val=true;break;case'false':val=false;break;default:var nf=parseFloat(val);if(val==nf){val=nf;}} -return val;};$.fn.sparkline.options=function(tag,userOptions){var extendedOptions;this.userOptions=userOptions=userOptions||{};this.tag=tag;this.tagValCache={};var defaults=$.fn.sparkline.defaults;var base=defaults.common;this.tagOptionsPrefix=userOptions.enableTagOptions&&(userOptions.tagOptionsPrefix||base.tagOptionsPrefix);var tagOptionType=this.getTagSetting('type');if(tagOptionType===UNSET_OPTION){extendedOptions=defaults[userOptions.type||base.type];}else{extendedOptions=defaults[tagOptionType];} -this.mergedOptions=$.extend({},base,extendedOptions,userOptions);};$.fn.sparkline.options.prototype.getTagSetting=function(key){var val,i,prefix=this.tagOptionsPrefix;if(prefix===false||prefix===undefined){return UNSET_OPTION;} -if(this.tagValCache.hasOwnProperty(key)){val=this.tagValCache.key;}else{val=this.tag.getAttribute(prefix+key);if(val===undefined||val===null){val=UNSET_OPTION;}else if(val.substr(0,1)=='['){val=val.substr(1,val.length-2).split(',');for(i=val.length;i--;){val[i]=normalizeValue(val[i].replace(/(^\s*)|(\s*$)/g,''));}}else if(val.substr(0,1)=='{'){var pairs=val.substr(1,val.length-2).split(',');val={};for(i=pairs.length;i--;){var keyval=pairs[i].split(':',2);val[keyval[0].replace(/(^\s*)|(\s*$)/g,'')]=normalizeValue(keyval[1].replace(/(^\s*)|(\s*$)/g,''));}}else{val=normalizeValue(val);} -this.tagValCache.key=val;} -return val;};$.fn.sparkline.options.prototype.get=function(key){var tagOption=this.getTagSetting(key);if(tagOption!==UNSET_OPTION){return tagOption;} -return this.mergedOptions[key];};$.fn.sparkline.line=function(values,options,width,height){var xvalues=[],yvalues=[],yminmax=[];for(var i=0;imaxy){maxy=normalRangeMax;}} -if(options.get('chartRangeMin')!==undefined&&(options.get('chartRangeClip')||options.get('chartRangeMin')maxy)){maxy=options.get('chartRangeMax');} -if(options.get('chartRangeMinX')!==undefined&&(options.get('chartRangeClipX')||options.get('chartRangeMinX')maxx)){maxx=options.get('chartRangeMaxX');} -var rangex=maxx-minx===0?1:maxx-minx;var rangey=maxy-miny===0?1:maxy-miny;var vl=yvalues.length-1;if(vl<1){this.innerHTML='';return;} -var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var canvas_width=target.pixel_width;var canvas_height=target.pixel_height;var canvas_top=0;var canvas_left=0;var spotRadius=options.get('spotRadius');if(spotRadius&&(canvas_width<(spotRadius*4)||canvas_height<(spotRadius*4))){spotRadius=0;} -if(spotRadius){if(options.get('minSpotColor')||(options.get('spotColor')&&yvalues[vl]==miny)){canvas_height-=Math.ceil(spotRadius);} -if(options.get('maxSpotColor')||(options.get('spotColor')&&yvalues[vl]==maxy)){canvas_height-=Math.ceil(spotRadius);canvas_top+=Math.ceil(spotRadius);} -if(options.get('minSpotColor')||options.get('maxSpotColor')&&(yvalues[0]==miny||yvalues[0]==maxy)){canvas_left+=Math.ceil(spotRadius);canvas_width-=Math.ceil(spotRadius);} -if(options.get('spotColor')||(options.get('minSpotColor')||options.get('maxSpotColor')&&(yvalues[vl]==miny||yvalues[vl]==maxy))){canvas_width-=Math.ceil(spotRadius);}} -canvas_height--;var drawNormalRange=function(){if(normalRangeMin!==undefined){var ytop=canvas_top+Math.round(canvas_height-(canvas_height*((normalRangeMax-miny)/rangey)));var height=Math.round((canvas_height*(normalRangeMax-normalRangeMin))/rangey);target.drawRect(canvas_left,ytop,canvas_width,height,undefined,options.get('normalRangeColor'));}};if(!options.get('drawNormalOnTop')){drawNormalRange();} -var path=[];var paths=[path];var x,y,vlen=yvalues.length;for(i=0;imaxy){y=maxy;} -if(!path.length){path.push([canvas_left+Math.round((x-minx)*(canvas_width/rangex)),canvas_top+canvas_height]);} -path.push([canvas_left+Math.round((x-minx)*(canvas_width/rangex)),canvas_top+Math.round(canvas_height-(canvas_height*((y-miny)/rangey)))]);}} -var lineshapes=[];var fillshapes=[];var plen=paths.length;for(i=0;i2){path[0]=[path[0][0],path[1][1]];} -lineshapes.push(path);} -plen=fillshapes.length;for(i=0;imax)){max=options.get('chartRangeMax');} -var zeroAxis=options.get('zeroAxis');if(zeroAxis===undefined){zeroAxis=min<0;} -var range=max-min===0?1:max-min;var colorMapByIndex,colorMapByValue;if($.isArray(options.get('colorMap'))){colorMapByIndex=options.get('colorMap');colorMapByValue=null;}else{colorMapByIndex=null;colorMapByValue=options.get('colorMap');} -var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var color,canvas_height=target.pixel_height,yzero=min<0&&zeroAxis?canvas_height-Math.round(canvas_height*(Math.abs(min)/range))-1:canvas_height-1;for(i=values.length;i--;){var x=i*(options.get('barWidth')+options.get('barSpacing')),y,val=values[i];if(val===null){if(options.get('nullColor')){color=options.get('nullColor');val=(zeroAxis&&min<0)?0:min;height=1;y=(zeroAxis&&min<0)?yzero:canvas_height-height;}else{continue;}}else{if(valmax){val=max;} -color=(val<0)?options.get('negBarColor'):options.get('barColor');if(zeroAxis&&min<0){height=Math.round(canvas_height*((Math.abs(val)/range)))+1;y=(val<0)?yzero:yzero-height;}else{height=Math.round(canvas_height*((val-min)/range))+1;y=canvas_height-height;} -if(val===0&&options.get('zeroColor')!==undefined){color=options.get('zeroColor');} -if(colorMapByValue&&colorMapByValue[val]){color=colorMapByValue[val];}else if(colorMapByIndex&&colorMapByIndex.length>i){color=colorMapByIndex[i];} -if(color===null){continue;}} -target.drawRect(x,y,options.get('barWidth')-1,height-1,color,color);}}else{this.innerHTML='';}};$.fn.sparkline.tristate=function(values,options,width,height){values=$.map(values,Number);width=(values.length*options.get('barWidth'))+((values.length-1)*options.get('barSpacing'));var colorMapByIndex,colorMapByValue;if($.isArray(options.get('colorMap'))){colorMapByIndex=options.get('colorMap');colorMapByValue=null;}else{colorMapByIndex=null;colorMapByValue=options.get('colorMap');} -var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var canvas_height=target.pixel_height,half_height=Math.round(canvas_height/2);for(var i=values.length;i--;){var x=i*(options.get('barWidth')+options.get('barSpacing')),y,color;if(values[i]<0){y=half_height;height=half_height-1;color=options.get('negBarColor');}else if(values[i]>0){y=0;height=half_height-1;color=options.get('posBarColor');}else{y=half_height-1;height=2;color=options.get('zeroBarColor');} -if(colorMapByValue&&colorMapByValue[values[i]]){color=colorMapByValue[values[i]];}else if(colorMapByIndex&&colorMapByIndex.length>i){color=colorMapByIndex[i];} -if(color===null){continue;} -target.drawRect(x,y,options.get('barWidth')-1,height-1,color,color);}}else{this.innerHTML='';}};$.fn.sparkline.discrete=function(values,options,width,height){values=$.map(values,Number);width=options.get('width')=='auto'?values.length*2:width;var interval=Math.floor(width/values.length);var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var canvas_height=target.pixel_height,line_height=options.get('lineHeight')=='auto'?Math.round(canvas_height*0.3):options.get('lineHeight'),pheight=canvas_height-line_height,min=Math.min.apply(Math,values),max=Math.max.apply(Math,values);if(options.get('chartRangeMin')!==undefined&&(options.get('chartRangeClip')||options.get('chartRangeMin')max)){max=options.get('chartRangeMax');} -var range=max-min;for(var i=values.length;i--;){var val=values[i];if(valmax){val=max;} -var x=(i*interval),ytop=Math.round(pheight-pheight*((val-min)/range));target.drawLine(x,ytop,x,ytop+line_height,(options.get('thresholdColor')&&val1){var canvas_width=target.pixel_width-Math.ceil(options.get('targetWidth')/2),canvas_height=target.pixel_height,min=Math.min.apply(Math,values),max=Math.max.apply(Math,values);if(options.get('base')===undefined){min=min<0?min:0;}else{min=options.get('base');} -var range=max-min;for(var i=2,vlen=values.length;i1){var canvas_width=target.pixel_width,canvas_height=target.pixel_height,radius=Math.floor(Math.min(canvas_width,canvas_height)/2),total=0,next=0,circle=2*Math.PI;for(var i=values.length;i--;){total+=values[i];} -if(options.get('offset')){next+=(2*Math.PI)*(options.get('offset')/360);} -var vlen=values.length;for(i=0;i0){end=next+(circle*(values[i]/total));} -target.drawPieSlice(radius,radius,radius,start,end,undefined,options.get('sliceColors')[i%options.get('sliceColors').length]);next=end;}}};var quartile=function(values,q){if(q==2){var vl2=Math.floor(values.length/2);return values.length%2?values[vl2]:(values[vl2]+values[vl2+1])/2;}else{var vl4=Math.floor(values.length/4);return values.length%2?(values[vl4*q]+values[vl4*q+1])/2:values[vl4*q];}};$.fn.sparkline.box=function(values,options,width,height){values=$.map(values,Number);width=options.get('width')=='auto'?'4.0em':width;var minvalue=options.get('chartRangeMin')===undefined?Math.min.apply(Math,values):options.get('chartRangeMin'),maxvalue=options.get('chartRangeMax')===undefined?Math.max.apply(Math,values):options.get('chartRangeMax'),target=$(this).simpledraw(width,height,options.get('composite')),vlen=values.length,lwhisker,loutlier,q1,q2,q3,rwhisker,routlier;if(target&&values.length>1){var canvas_width=target.pixel_width,canvas_height=target.pixel_height;if(options.get('raw')){if(options.get('showOutliers')&&values.length>5){loutlier=values[0];lwhisker=values[1];q1=values[2];q2=values[3];q3=values[4];rwhisker=values[5];routlier=values[6];}else{lwhisker=values[0];q1=values[1];q2=values[2];q3=values[3];rwhisker=values[4];}}else{values.sort(function(a,b){return a-b;});q1=quartile(values,1);q2=quartile(values,2);q3=quartile(values,3);var iqr=q3-q1;if(options.get('showOutliers')){lwhisker=undefined;rwhisker=undefined;for(var i=0;iq1-(iqr*options.get('outlierIQR'))){lwhisker=values[i];} -if(values[i]rwhisker){target.drawCircle((routlier-minvalue)*unitsize+canvas_left,canvas_height/2,options.get('spotRadius'),options.get('outlierLineColor'),options.get('outlierFillColor'));}} -target.drawRect(Math.round((q1-minvalue)*unitsize+canvas_left),Math.round(canvas_height*0.1),Math.round((q3-q1)*unitsize),Math.round(canvas_height*0.8),options.get('boxLineColor'),options.get('boxFillColor'));target.drawLine(Math.round((lwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),Math.round((q1-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),options.get('lineColor'));target.drawLine(Math.round((lwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/4),Math.round((lwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height-canvas_height/4),options.get('whiskerColor'));target.drawLine(Math.round((rwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),Math.round((q3-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),options.get('lineColor'));target.drawLine(Math.round((rwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/4),Math.round((rwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height-canvas_height/4),options.get('whiskerColor'));target.drawLine(Math.round((q2-minvalue)*unitsize+canvas_left),Math.round(canvas_height*0.1),Math.round((q2-minvalue)*unitsize+canvas_left),Math.round(canvas_height*0.9),options.get('medianColor'));if(options.get('target')){var size=Math.ceil(options.get('spotRadius'));target.drawLine(Math.round((options.get('target')-minvalue)*unitsize+canvas_left),Math.round((canvas_height/2)-size),Math.round((options.get('target')-minvalue)*unitsize+canvas_left),Math.round((canvas_height/2)+size),options.get('targetColor'));target.drawLine(Math.round((options.get('target')-minvalue)*unitsize+canvas_left-size),Math.round(canvas_height/2),Math.round((options.get('target')-minvalue)*unitsize+canvas_left+size),Math.round(canvas_height/2),options.get('targetColor'));}}else{this.innerHTML='';}};if($.browser.msie&&!document.namespaces.v){document.namespaces.add('v','urn:schemas-microsoft-com:vml','#default#VML');} -if($.browser.hasCanvas===undefined){var t=document.createElement('canvas');$.browser.hasCanvas=t.getContext!==undefined;} -VCanvas_base=function(width,height,target){};VCanvas_base.prototype={init:function(width,height,target){this.width=width;this.height=height;this.target=target;if(target[0]){target=target[0];} -target.VCanvas=this;},drawShape:function(path,lineColor,fillColor,lineWidth){alert('drawShape not implemented');},drawLine:function(x1,y1,x2,y2,lineColor,lineWidth){return this.drawShape([[x1,y1],[x2,y2]],lineColor,lineWidth);},drawCircle:function(x,y,radius,lineColor,fillColor){alert('drawCircle not implemented');},drawPieSlice:function(x,y,radius,startAngle,endAngle,lineColor,fillColor){alert('drawPieSlice not implemented');},drawRect:function(x,y,width,height,lineColor,fillColor){alert('drawRect not implemented');},getElement:function(){return this.canvas;},_insert:function(el,target){$(target).html(el);}};VCanvas_canvas=function(width,height,target){return this.init(width,height,target);};VCanvas_canvas.prototype=$.extend(new VCanvas_base(),{_super:VCanvas_base.prototype,init:function(width,height,target){this._super.init(width,height,target);this.canvas=document.createElement('canvas');if(target[0]){target=target[0];} -target.VCanvas=this;$(this.canvas).css({display:'inline-block',width:width,height:height,verticalAlign:'top'});this._insert(this.canvas,target);this.pixel_height=$(this.canvas).height();this.pixel_width=$(this.canvas).width();this.canvas.width=this.pixel_width;this.canvas.height=this.pixel_height;$(this.canvas).css({width:this.pixel_width,height:this.pixel_height});},_getContext:function(lineColor,fillColor,lineWidth){var context=this.canvas.getContext('2d');if(lineColor!==undefined){context.strokeStyle=lineColor;} -context.lineWidth=lineWidth===undefined?1:lineWidth;if(fillColor!==undefined){context.fillStyle=fillColor;} -return context;},drawShape:function(path,lineColor,fillColor,lineWidth){var context=this._getContext(lineColor,fillColor,lineWidth);context.beginPath();context.moveTo(path[0][0]+0.5,path[0][1]+0.5);for(var i=1,plen=path.length;i';this.canvas.insertAdjacentHTML('beforeEnd',groupel);this.group=$(this.canvas).children()[0];},drawShape:function(path,lineColor,fillColor,lineWidth){var vpath=[];for(var i=0,plen=path.length;i'+' ';this.group.insertAdjacentHTML('beforeEnd',vel);},drawCircle:function(x,y,radius,lineColor,fillColor){x-=radius+1;y-=radius+1;var stroke=lineColor===undefined?' stroked="false" ':' strokeWeight="1" strokeColor="'+lineColor+'" ';var fill=fillColor===undefined?' filled="false"':' fillColor="'+fillColor+'" filled="true" ';var vel='';this.group.insertAdjacentHTML('beforeEnd',vel);},drawPieSlice:function(x,y,radius,startAngle,endAngle,lineColor,fillColor){if(startAngle==endAngle){return;} -if((endAngle-startAngle)==(2*Math.PI)){startAngle=0.0;endAngle=(2*Math.PI);} -var startx=x+Math.round(Math.cos(startAngle)*radius);var starty=y+Math.round(Math.sin(startAngle)*radius);var endx=x+Math.round(Math.cos(endAngle)*radius);var endy=y+Math.round(Math.sin(endAngle)*radius);if(startx==endx&&starty==endy&&(endAngle-startAngle)'+' ';this.group.insertAdjacentHTML('beforeEnd',vel);},drawRect:function(x,y,width,height,lineColor,fillColor){return this.drawShape([[x,y],[x,y+height],[x+width,y+height],[x+width,y],[x,y]],lineColor,fillColor);}});})(jQuery); \ No newline at end of file diff --git a/Website/static/json2.js b/Website/static/json2.js deleted file mode 100644 index 6bdea10..0000000 --- a/Website/static/json2.js +++ /dev/null @@ -1,482 +0,0 @@ -/* - http://www.JSON.org/json2.js - 2010-08-25 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date ? - 'Date(' + this[key] + ')' : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - -/*jslint evil: true, strict: false */ - -/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, - call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - -// Create a JSON object only if one does not already exist. We create the -// methods in a closure to avoid creating global variables. - -if (!this.JSON) { - this.JSON = {}; -} - -(function () { - - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - if (typeof Date.prototype.toJSON !== 'function') { - - Date.prototype.toJSON = function (key) { - - return isFinite(this.valueOf()) ? - this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z' : null; - }; - - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = function (key) { - return this.valueOf(); - }; - } - - var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; - - - function quote(string) { - -// If the string contains no control characters, no quote characters, and no -// backslash characters, then we can safely slap some quotes around it. -// Otherwise we must also replace the offending characters with safe escape -// sequences. - - escapable.lastIndex = 0; - return escapable.test(string) ? - '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : - '"' + string + '"'; - } - - - function str(key, holder) { - -// Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - -// If the value has a toJSON method, call it to obtain a replacement value. - - if (value && typeof value === 'object' && - typeof value.toJSON === 'function') { - value = value.toJSON(key); - } - -// If we were called with a replacer function, then call the replacer to -// obtain a replacement value. - - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } - -// What happens next depends on the value's type. - - switch (typeof value) { - case 'string': - return quote(value); - - case 'number': - -// JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : 'null'; - - case 'boolean': - case 'null': - -// If the value is a boolean or null, convert it to a string. Note: -// typeof null does not produce 'null'. The case is included here in -// the remote chance that this gets fixed someday. - - return String(value); - -// If the type is 'object', we might be dealing with an object or an array or -// null. - - case 'object': - -// Due to a specification blunder in ECMAScript, typeof null is 'object', -// so watch out for that case. - - if (!value) { - return 'null'; - } - -// Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - -// Is the value an array? - - if (Object.prototype.toString.apply(value) === '[object Array]') { - -// The value is an array. Stringify every element. Use null as a placeholder -// for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } - -// Join all of the elements together, separated with commas, and wrap them in -// brackets. - - v = partial.length === 0 ? '[]' : - gap ? '[\n' + gap + - partial.join(',\n' + gap) + '\n' + - mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - -// If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === 'string') { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } else { - -// Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - -// Join all of the member texts together, separated with commas, -// and wrap them in braces. - - v = partial.length === 0 ? '{}' : - gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + - mind + '}' : '{' + partial.join(',') + '}'; - gap = mind; - return v; - } - } - -// If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== 'function') { - JSON.stringify = function (value, replacer, space) { - -// The stringify method takes a value and an optional replacer, and an optional -// space parameter, and returns a JSON text. The replacer can be a function -// that can replace values, or an array of strings that will select the keys. -// A default replacer method can be provided. Use of the space parameter can -// produce text that is more easily readable. - - var i; - gap = ''; - indent = ''; - -// If the space parameter is a number, make an indent string containing that -// many spaces. - - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - -// If the space parameter is a string, it will be used as the indent string. - - } else if (typeof space === 'string') { - indent = space; - } - -// If there is a replacer, it must be a function or an array. -// Otherwise, throw an error. - - rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - -// Make a fake root object containing our value under the key of ''. -// Return the result of stringifying the value. - - return str('', {'': value}); - }; - } - - -// If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== 'function') { - JSON.parse = function (text, reviver) { - -// The parse method takes a text and an optional reviver function, and returns -// a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - -// The walk method is used to recursively walk the resulting structure so -// that modifications can be made. - - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - -// Parsing happens in four stages. In the first stage, we replace certain -// Unicode characters with escape sequences. JavaScript handles many characters -// incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return '\\u' + - ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - -// In the second stage, we run the text against regular expressions that look -// for non-JSON patterns. We are especially concerned with '()' and 'new' -// because they can cause invocation, and '=' because it can cause mutation. -// But just to be safe, we want to reject all unexpected forms. - -// We split the second stage into 4 regexp operations in order to work around -// crippling inefficiencies in IE's and Safari's regexp engines. First we -// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we -// replace all simple value tokens with ']' characters. Third, we delete all -// open brackets that follow a colon or comma or that begin the text. Finally, -// we look to see that the remaining characters are only whitespace or ']' or -// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if (/^[\],:{}\s]*$/ -.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') -.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') -.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { - -// In the third stage we use the eval function to compile the text into a -// JavaScript structure. The '{' operator is subject to a syntactic ambiguity -// in JavaScript: it can begin a block or an object literal. We wrap the text -// in parens to eliminate the ambiguity. - - j = eval('(' + text + ')'); - -// In the optional fourth stage, we recursively walk the new structure, passing -// each name/value pair to a reviver function for possible transformation. - - return typeof reviver === 'function' ? - walk({'': j}, '') : j; - } - -// If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError('JSON.parse'); - }; - } -}()); diff --git a/Website/static/jsxgraphcore.js b/Website/static/jsxgraphcore.js deleted file mode 100644 index c150316..0000000 --- a/Website/static/jsxgraphcore.js +++ /dev/null @@ -1,26 +0,0 @@ -/* Version 0.83rc4 */ -/* - Copyright 2008-2011 - Matthias Ehmann, - Michael Gerhaeuser, - Carsten Miller, - Bianca Valentin, - Alfred Wassermann, - Peter Wilfahrt - - This file is part of JSXGraph. - - JSXGraph is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - JSXGraph is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with JSXGraph. If not, see . -*/ - var JXG={};(function(){var d,e;JXG.countDrawings=0;JXG.countTime=0;JXG.require=function(f){};JXG.rendererFiles=[];JXG.rendererFiles.svg="SVGRenderer";JXG.rendererFiles.vml="VMLRenderer";JXG.rendererFiles.canvas="CanvasRenderer";JXG.baseFiles=null;JXG.requirePath="";for(d=0;d0?h[0].length:0,w=h.length,v=this.matrix(q,p),u,t,x,r;for(u=0;u0?r[0].length:0;l=this.matrix(q,h);for(p=0;pz){z=d.abs(m[v][u]);h=v}}if(z<=e.Math.eps){return false}if(h>u){for(t=0;tm||j<0){return NaN}j=d.floor(j);m=d.floor(m);if(j===0||j===m){return 1}h=1;for(l=0;l0){return d.exp(h*d.log(d.abs(j)))}else{return NaN}}},squampow:function(k,j){var h;if(d.floor(j)===j){h=1;if(j<0){k=1/k;j*=-1}while(j!=0){if(j&1){h*=k}j>>=1;k*=k}return h}else{return this.pow(k,j)}},normalize:function(k){var h=2*k[3],l=k[4]/(h),m,j;k[5]=l;k[6]=-k[1]/h;k[7]=-k[2]/h;if(l===Infinity||isNaN(l)){m=d.sqrt(k[1]*k[1]+k[2]*k[2]);k[0]/=m;k[1]/=m;k[2]/=m;k[3]=0;k[4]=1}else{if(d.abs(l)>=1){k[0]=(k[6]*k[6]+k[7]*k[7]-l*l)/(2*l);k[1]=-k[6]/l;k[2]=-k[7]/l;k[3]=1/(2*l);k[4]=1}else{j=(l<=0)?(-1):(1);k[0]=j*(k[6]*k[6]+k[7]*k[7]-l*l)*0.5;k[1]=-j*k[6];k[2]=-j*k[7];k[3]=j/2;k[4]=j*l}}return k}}})(JXG,Math);JXG.Math.Numerics=(function(e,d){var f={rk4:{s:4,A:[[0,0,0,0],[0.5,0,0,0],[0,0.5,0,0],[0,0,1,0]],b:[1/6,1/3,1/3,1/6],c:[0,0.5,0.5,1]},heun:{s:2,A:[[0,0],[1,0]],b:[0.5,0.5],c:[0,1]},euler:{s:1,A:[[0]],b:[1],c:[0]}};return{Gauss:function(g,s){var u=e.Math.eps,h=g.length>0?g[0].length:0,q,t,r,p,m,l=function(v,n){var k=this[v];this[v]=this[n];this[n]=k};if((h!==s.length)||(h!==g.length)){throw new Error("JXG.Math.Numerics.Gauss: Dimensions don't match. A must be a square matrix and b must be of the same length as A.")}q=new Array(h);t=s.slice(0,h);for(r=0;rp;r--){if(d.abs(q[r][p])>u){if(d.abs(q[p][p])0?r[0].length:0;for(p=g-1;p>=0;p--){for(l=s-1;l>p;l--){h[p]-=r[p][l]*h[l]}h[p]/=r[p][p]}return h},gaussBareiss:function(v){var l,u,y,q,m,g,h,r,w,x=e.Math.eps;h=v.length;if(h<=0){return 0}if(v[0].length=x){break}}if(q==h){return 0}for(m=l;mr){r=g}v+=g;if(g>=B){g=d.atan2(2*h[s][q],h[s][s]-h[q][q])*0.5;t=d.sin(g);y=d.cos(g);for(p=0;pB&&u<2000);return[h,m]},NewtonCotes:function(g,k,h){var l=0,q=h&&typeof h.number_of_nodes==="number"?h.number_of_nodes:28,n={trapez:true,simpson:true,milne:true},r=h&&h.integration_type&&n.hasOwnProperty(h.integration_type)&&n[h.integration_type]?h.integration_type:"milne",p=(g[1]-g[0])/q,m,j,s;switch(r){case"trapez":l=(k(g[0])+k(g[1]))*0.5;m=g[0];for(j=0;j0){throw new Error("JSXGraph: INT_SIMPSON requires config.number_of_nodes dividable by 2.")}s=q/2;l=k(g[0])+k(g[1]);m=g[0];for(j=0;j0){throw new Error("JSXGraph: Error in INT_MILNE: config.number_of_nodes must be a multiple of 4")}s=q*0.25;l=7*(k(g[0])+k(g[1]));m=g[0];for(j=0;jm){q=this.D(p,j)(g);l+=2;if(d.abs(q)>m){g-=n/q}else{g+=(d.random()*0.2-1)}n=p.apply(j,[g]);l++;k++}return g},root:function(j,g,h){return this.fzero(j,g,h)},Neville:function(l){var h=[],g=function(m){return function(x,n){var q,w,y,z=e.Math.binomial,v=l.length,p=v-1,r=0,u=0;if(!n){y=1;for(q=0;q=0;m--){u[m]=(q[m]-(v[m+1]*u[m+1]))/p[m]}for(m=g-3;m>=0;m--){u[m+1]=u[m]}u[0]=0;u[g-1]=0;return u},splineEval:function(h,z,v,B){var k=d.min(z.length,v.length),p=1,m=false,A=[],r,q,w,u,t,s,g;if(e.isArray(h)){p=h.length;m=true}else{h=[h]}for(r=0;rz[k-1])){return NaN}for(q=1;q=0;k--){l=l.concat(["(",g[k].toPrecision(j),")"]);if(k>1){l=l.concat(["*",h,"",k,"<","/sup> + "])}else{if(k===1){l=l.concat(["*",h," + "])}}}return l.join("")},lagrangePolynomial:function(j){var g=[],h=function(w,l){var p,m,t,v,y,q=0,r=0,u,n;t=j.length;if(!l){for(p=0;p0&&e.isPoint(q[0])){j=1}else{throw new Error("JSXGraph: Can't create regressionPolynomial. Wrong parameters.")}}r=function(G,t){var w,v,D,A,F,u,E,H,C,z=q.length;C=d.floor(h());if(!t){if(j===1){n=[];m=[];for(w=0;w=0;w--){H=(H*G+g[w])}return H};r.getTerm=function(){return k};return r},bezier:function(j){var g,h=function(k){return function(m,l){var q=d.floor(m)*3,p=m%1,n=1-p;if(!l){g=d.floor(j.length/3)}if(m<0){return j[0][k]()}if(m>=g){return j[j.length-1][k]()}if(isNaN(m)){return NaN}return n*n*(n*j[q][k]()+3*p*j[q+1][k]())+(3*n*j[q+2][k]()+p*j[q+3][k]())*p*p}};return[h("X"),h("Y"),0,function(){return d.floor(j.length/3)}]},bspline:function(k,g){var l,n=[],m=function(s,p){var q,r=[];for(q=0;q=A){w=0}else{w=v[r+1]}y=B[r+u-1]-B[r];if(y==0){v[r]=0}else{v[r]=(z-B[r])/y*x}y=B[r+u]-B[r+1];if(y!=0){v[r]+=(B[r+u]-z)/y*w}}}return v},h=function(p){return function(w,r){var q=k.length,A,v,x,z=q-1,u=g;if(z<=0){return NaN}if(z+2<=u){u=z+1}if(w<=0){return k[0][p]()}if(w>=z-u+2){return k[z][p]()}l=m(z,u);x=d.floor(w)+u-1;n=j(w,l,z,u,x);A=0;for(v=x-u+1;v<=x;v++){if(v=0){A+=k[v][p]()*n[v]}}return A}};return[h("X"),h("Y"),0,function(){return k.length-1}]},D:function(k,l){var j=0.00001,g=1/(j*2);if(arguments.length==1||(arguments.length>1&&!e.exists(arguments[1]))){return function(h,m){return(k(h+j,m)-k(h-j,m))*g}}else{return function(h,m){return(k.apply(l,[h+j,m])-k.apply(l,[h-j,m]))*g}}},riemann:function(s,m,t,k,p){var l=[],A=[],r,q=0,z,w=k,u,h,v,g;m=d.floor(m);l[q]=w;A[q]=0;if(m>0){z=(p-k)/m;g=z*0.01;for(r=0;ru){u=v}}}}}}q++;l[q]=w;A[q]=u;q++;w+=z;if(t==="trapezodial"){u=s(w)}l[q]=w;A[q]=u;q++;l[q]=w;A[q]=0}}return[l,A]},riemannsum:function(p,k,r,j,l){var q=0,m,v,u=j,s,h,t,g;k=d.floor(k);if(k>0){v=(l-j)/k;g=v*0.01;for(m=0;ms){s=t}}}}}}}q+=v*s;u+=v}}return q},rungeKutta:function(g,H,p,m,G){var q=[],n=[],F=(p[1]-p[0])/m,v=p[0],J,E,D,B,A,C=H.length,w,u=[],z=0;if(e.isString(g)){g=f[g]||f.euler}w=g.s;for(J=0;J0){if(e.isArray(H)){return this.fminbr(G,[K,J],M)}else{return this.Newton(G,K,M)}}I=K;w=A;while(y=F&&d.abs(A)>d.abs(x)){t=I-J;if(K==I){l=x/A;v=t*l;s=1-l}else{s=A/w;l=x/w;k=x/A;v=k*(t*s*(s-l)-(J-K)*(l-1));s=(s-1)*(l-1)*(k-1)}if(v>0){s=-s}else{v=-v}if(v<(0.75*t*s-d.abs(F*s)*0.5)&&v0){m=F}else{m=-F}}K=J;A=x;J+=m;x=G.apply(M,[J]);B++;if((x>0&&w>0)||(x<0&&w<0)){I=K;w=A}y++}e.debug("fzero: maxiter="+g+" reached.");return J},fminbr:function(I,J,N){var M,K,m,u,s,h,k,j,A=(3-d.sqrt(5))*0.5,F=e.Math.eps,C=d.sqrt(e.Math.eps),g=50,E=0,z,L,H,n,D,B,y,l,G=0;if(!e.isArray(J)||J.length<2){throw new Error("JXG.Math.Numerics.fminbr: length of array x0 has to be at least two.")}M=J[0];K=J[1];u=M+A*(K-M);k=I.apply(N,[u]);G++;m=u;s=u;h=k;j=k;while(E=H){y=(m-s)*(h-k);B=(m-u)*(h-j);D=(m-u)*B-(m-s)*y;B=2*(B-y);if(B>0){D=-D}else{B=-B}if(d.abs(D)B*(M-m+2*H)&&D0){n=H}else{n=-H}}y=m+n;l=I.apply(N,[y]);G++;if(l<=h){if(y0){return this.sum(d)/d.length}else{return 0}};JXG.Math.Statistics.median=function(e){var f,d;if(e.length>0){f=e.slice(0,e.length);f.sort(function(h,g){return h-g});d=f.length;if(d%2==1){return f[parseInt(d*0.5)]}else{return(f[d*0.5-1]+f[d*0.5])*0.5}}else{return 0}};JXG.Math.Statistics.variance=function(f){var e,h,g,d;if(f.length>1){e=this.mean(f);h=0;for(g=0,d=f.length;g0){return this.mean(this.multiply(d,e))}else{return 0}};JXG.Math.Statistics.max=function(e){var g,f,d;if(e.length==0){return NaN}g=e[0];for(f=1,d=e.length;fg)?(e[f]):g}return g};JXG.Math.Statistics.min=function(e){var g,f,d;if(e.length==0){return NaN}g=e[0];for(f=1,d=e.length;f0){l=m[q].generatePolynomial();for(g=0;g0)){if((y.toOrigin!==e)&&(y.toOrigin!=null)&&C(y.toOrigin.id,n.listOfFreePoints)){k=y.toOrigin}else{k=n.listOfFreePoints[0]}v=k.symbolic.x;t=k.symbolic.y;for(D=0;D1)){if((y.to10!==e)&&(y.to10!=null)&&(y.to10.id!=y.toOrigin.id)&&C(y.to10.id,n.listOfFreePoints)){j=y.to10}else{if(n.listOfFreePoints[0].id==k.id){j=n.listOfFreePoints[1]}else{j=n.listOfFreePoints[0]}}p=d.Math.Geometry.rad([1,0],[0,0],[j.symbolic.x,j.symbolic.y]);E=Math.cos(-p);x=Math.sin(-p);for(D=0;Dd.Math.eps)){G=j.symbolic.x;for(D=0;Ds){l+=Math.PI}r=Math.cos(l)+q[1];p=Math.sin(l)+q[2];return new JXG.Coords(JXG.COORDS_BY_USER,[r,p],m)},reflection:function(q,m,f){var h=m.coords.usrCoords,r=q.point1.coords.usrCoords,g=q.point2.coords.usrCoords,e,l,d,j,n,k,p;if(!JXG.exists(f)){f=m.board}n=g[1]-r[1];k=g[2]-r[2];e=h[1]-r[1];l=h[2]-r[2];p=(n*l-k*e)/(n*n+k*k);d=h[1]+2*p*k;j=h[2]-2*p*n;return new JXG.Coords(JXG.COORDS_BY_USER,[d,j],f)},rotation:function(d,p,h,j){var l=p.coords.usrCoords,e=d.coords.usrCoords,g,n,k,q,f,m;if(!JXG.exists(j)){j=p.board}g=l[1]-e[1];n=l[2]-e[2];k=Math.cos(h);q=Math.sin(h);f=g*k-n*q+e[1];m=g*q+n*k+e[2];return new JXG.Coords(JXG.COORDS_BY_USER,[f,m],j)},perpendicular:function(s,q,j){var h=s.point1.coords.usrCoords,g=s.point2.coords.usrCoords,e=q.coords.usrCoords,n,m,l,r,k,f,d,p;if(!JXG.exists(j)){j=q.board}if(q==s.point1){n=h[1]+g[2]-h[2];m=h[2]-g[1]+h[1];l=true}else{if(q==s.point2){n=g[1]+h[2]-g[2];m=g[2]-h[1]+g[1];l=false}else{if(((Math.abs(h[1]-g[1])>JXG.Math.eps)&&(Math.abs(e[2]-(h[2]-g[2])*(e[1]-h[1])/(h[1]-g[1])-h[2])JXG.Math.eps&&(Math.abs(f[0])0){e=m.midpoint.Dist(z.point1);K=m.midpoint.Dist(z.point2);I=((e*e)+(D*D)-(K*K))/(2*D);B=(e*e)-(I*I);B=(B<0)?0:B;G=Math.sqrt(B);E=m.Radius();p=Math.sqrt((E*E)-G*G);C=J[1]-L[1];A=J[2]-L[2];k=g[1]+(G/D)*A;j=g[2]-(G/D)*C;e=(J[1]*A)-(J[2]*C);K=(k*C)+(j*A);F=(A*A)+(C*C);if(Math.abs(F)r){return[0]}else{if(v=d&&Math.abs(e[3])=d){return this.meetLineCircle(g,e,f,h)}else{return this.meetCircleCircle(g,e,f,h)}}}},meetLineLine:function(e,d,f,h){var g=JXG.Math.crossProduct(e,d);if(Math.abs(g[0])>JXG.Math.eps){g[1]/=g[0];g[2]/=g[0];g[0]=1}return new JXG.Coords(JXG.COORDS_BY_USER,g,h)},meetLineCircle:function(j,e,p,q){var v,u,s,r,l,h,g,f,m,w;if(e[4]=0){m=Math.sqrt(m);w=[(-g+m)/(2*h),(-g-m)/(2*h)];return((p==0)?new JXG.Coords(JXG.COORDS_BY_USER,[-w[0]*(-l[1])-r*l[0],-w[0]*l[0]-r*l[1]],q):new JXG.Coords(JXG.COORDS_BY_USER,[-w[1]*(-l[1])-r*l[0],-w[1]*l[0]-r*l[1]],q))}else{return new JXG.Coords(JXG.COORDS_BY_USER,[NaN,NaN],q)}},meetCircleCircle:function(f,d,e,g){var h;if(f[4]JXG.Math.eps&&m<10){B=A(q);z=-y(p);x=k(q);w=-j(p);g=B*w-z*x;q-=(w*v-z*u)/g;p-=(B*u-x*v)/g;v=t.X(q)-s.X(p);u=t.Y(q)-s.Y(p);r=v*v+u*u;m++}arguments.callee.t1memo=q;arguments.callee.t2memo=p;if(Math.abs(q)0.1&&Math.abs(f-g.X(l))>0.1&&Math.abs(d-g.Y(l))>0.1)){v=20;w=(g.maxX()-g.minX())/v;x=g.minX();for(u=0;u0.1&&Math.abs(f-g.X(l))>0.1&&Math.abs(d-g.Y(l))>0.1){break}x+=w}}p=l;arguments.callee.t2memo=p}if(Math.abs(h(p))>JXG.Math.eps){k=0}else{k=1}return(new JXG.Coords(JXG.COORDS_BY_USER,[k,g.X(p),g.Y(p)],j))},projectPointToCircle:function(m,d,f){var j=m.coords.distance(JXG.COORDS_BY_USER,d.midpoint.coords),e=m.coords.usrCoords,g=d.midpoint.coords.usrCoords,l,k,h;if(!JXG.exists(f)){f=m.board}if(Math.abs(j)r.maxX()){q=r.minX()+q-r.maxX()}C=new JXG.Coords(JXG.COORDS_BY_USER,[r.X(q),r.Y(q)],h)}else{if(r.curveType=="plot"){B=p;for(v=0;v=JXG.Math.eps){g=(A*z+e*d)/k;s=Math.sqrt(A*A+e*e-g*(A*z+e*d))}else{g=0;s=Math.sqrt(A*A+e*e)}if(g>=0&&g<=1&&sJXG.Math.eps){for(h=2;h>0;h--){v[l][h]/=v[l][0]}v[l][0]=1}}e=false;d=false;if(!r&&q.scrCoords[1]>=0&&q.scrCoords[1]<=g.board.canvasWidth&&q.scrCoords[2]>=0&&q.scrCoords[2]<=g.board.canvasHeight){e=true}if(!f&&p.scrCoords[1]>=0&&p.scrCoords[1]<=g.board.canvasWidth&&p.scrCoords[2]>=0&&p.scrCoords[2]<=g.board.canvasHeight){d=true}if(Math.abs(v[1][0])g.board.canvasHeight){k=v[2]}else{k=v[3]}}else{if(v[1][2]>g.board.canvasHeight){m=v[2];if(v[3][2]<0){k=v[0]}else{k=v[3]}}else{m=v[1];if(v[3][2]<0){k=v[0]}else{if(v[3][2]>g.board.canvasHeight){k=v[2]}else{k=v[3]}}}}}}m=new JXG.Coords(JXG.COORDS_BY_SCREEN,m.slice(1),g.board);k=new JXG.Coords(JXG.COORDS_BY_SCREEN,k.slice(1),g.board);if(!e&&!d){if(!r&&f&&!this.isSameDirection(q,p,m)&&!this.isSameDirection(q,p,k)){return}else{if(r&&!f&&!this.isSameDirection(p,q,m)&&!this.isSameDirection(p,q,k)){return}}}if(!e){if(!d){if(this.isSameDirection(q,p,m)){if(!this.isSameDirection(q,p,k)){t=m;u=k}else{if(JXG.Math.Geometry.affineDistance(p.usrCoords,m.usrCoords)=0&&k>=0){if((d>=0&&j>=0)||(d<=0&&j<=0)){g=true}}else{if(e<=0&&k<=0){if((d>=0&&j>=0)||(d<=0&&j<=0)){g=true}}}return g},updateTicks:function(e,g,d,h,f){},removeTicks:function(d){this.remove(this.getElementById(d.id+"_ticks"))},drawCurve:function(d){this.appendChildPrim(this.createPrim("path",d.id),d.layer);this.appendNodesToElement(d,"path");this.updateVisual(d,{shadow:true},true);this.updateCurve(d)},updateCurve:function(d){this.updateVisual(d);this.updatePathPrim(d.rendNode,this.updatePathStringPrim(d),d.board);this.makeArrows(d)},drawCircle:function(d){this.appendChildPrim(this.createPrim("ellipse",d.id),d.layer);this.appendNodesToElement(d,"ellipse");this.updateCircle(d)},updateCircle:function(e){this.updateVisual(e);var d=e.Radius();if(d>0&&!isNaN(d+e.midpoint.coords.scrCoords[1]+e.midpoint.coords.scrCoords[2])&&d*e.board.stretchX<20000){this.updateEllipsePrim(e.rendNode,e.midpoint.coords.scrCoords[1],e.midpoint.coords.scrCoords[2],(d*e.board.stretchX),(d*e.board.stretchY))}},drawPolygon:function(d){this.appendChildPrim(this.createPrim("polygon",d.id),d.layer);this.appendNodesToElement(d,"polygon");this.updatePolygon(d)},updatePolygon:function(d){this.updateVisual(d,{stroke:true,dash:true});this.updatePolygonPrim(d.rendNode,d)},drawText:function(d){var e;if(d.display=="html"){e=this.container.ownerDocument.createElement("div");e.style.position="absolute";e.style.color=d.visProp.strokeColor;e.className="JXGtext";e.style.zIndex="10";this.container.appendChild(e);e.setAttribute("id",this.container.id+"_"+d.id)}else{e=this.drawInternalText(d)}e.style.fontSize=d.board.options.text.fontSize+"px";d.rendNode=e;d.htmlStr="";this.updateText(d)},drawInternalText:function(d){},updateText:function(d){if(!d.visProp.visible){return}if(isNaN(d.coords.scrCoords[1]+d.coords.scrCoords[2])){return}this.updateTextStyle(d);if(d.display=="html"){d.rendNode.style.left=(d.coords.scrCoords[1])+"px";d.rendNode.style.top=(d.coords.scrCoords[2]-this.vOffsetText)+"px";d.updateText();if(d.htmlStr!=d.plaintextStr){d.rendNode.innerHTML=d.plaintextStr;if(d.board.options.text.useASCIIMathML){AMprocessNode(d.rendNode,false)}d.htmlStr=d.plaintextStr;if(d.board.options.text.useMathJax){MathJax.Hub.Typeset(d.rendNode)}}this.transformImage(d,d.transformations)}else{this.updateInternalText(d)}},updateInternalText:function(d){},updateTextStyle:function(e){var d;if(e.visProp.fontSize){if(typeof e.visProp.fontSize=="function"){d=e.visProp.fontSize();e.rendNode.style.fontSize=(d>0?d:0)}else{e.rendNode.style.fontSize=(e.visProp.fontSize)}}},drawImage:function(d){},updateImageURL:function(d){},updateImage:function(d){this.updateRectPrim(d.rendNode,d.coords.scrCoords[1],d.coords.scrCoords[2]-d.size[1],d.size[0],d.size[1]);this.updateImageURL(d);this.transformImage(d,d.transformations);this.updateVisual(d,{stroke:true,dash:true},true)},joinTransforms:function(d,n){var g=[[1,0,0],[0,1,0],[0,0,1]],l=[[1,0,0],[-d.board.origin.scrCoords[1],1,0],[-d.board.origin.scrCoords[2],0,1]],k=[[1,0,0],[0,1/d.board.stretchX,0],[0,0,-1/d.board.stretchY]],e=[[1,0,0],[0,d.board.stretchX,0],[0,0,-d.board.stretchY]],f=[[1,0,0],[d.board.origin.scrCoords[1],1,0],[d.board.origin.scrCoords[2],0,1]],h,j=n.length;for(h=0;hs.usrCoords[1]){y=n-1;break}}m=Math.ceil(s.usrCoords[2]);e=0;for(n=0;n<=p+1;n++){if(m-n/pg.usrCoords[2]){f=n-1;break}}x=Math.round((1/q)*t.stretchX);w=Math.round((1/p)*t.stretchY);u=new JXG.Coords(JXG.COORDS_BY_USER,[Math.ceil(g.usrCoords[1])-h/q,Math.floor(g.usrCoords[2])+f/p],t);r=new JXG.Coords(JXG.COORDS_BY_USER,[Math.floor(s.usrCoords[1])+y/q,Math.ceil(s.usrCoords[2])-e/p],t);v=this.drawVerticalGrid(u,r,x,t);this.appendChildPrim(v,t.options.layer.grid);if(!t.options.grid.snapToGrid){d=new Object();d.visProp={};d.rendNode=v;d.elementClass=JXG.OBJECT_CLASS_LINE;d.id="gridx";JXG.clearVisPropOld(d);this.setObjectStrokeColor(d,t.options.grid.gridColor,t.options.grid.gridOpacity)}else{d=new Object();d.visProp={};d.rendNode=v;d.elementClass=JXG.OBJECT_CLASS_LINE;d.id="gridx";JXG.clearVisPropOld(d);this.setObjectStrokeColor(d,"#FF8080",0.5)}this.setPropertyPrim(v,"stroke-width","0.4px");if(t.options.grid.gridDash){this.setGridDash("gridx")}v=this.drawHorizontalGrid(u,r,w,t);this.appendChildPrim(v,t.options.layer.grid);if(!t.options.grid.snapToGrid){d=new Object();d.visProp={};d.rendNode=v;d.elementClass=JXG.OBJECT_CLASS_LINE;d.id="gridy";JXG.clearVisPropOld(d);this.setObjectStrokeColor(d,t.options.grid.gridColor,t.options.grid.gridOpacity)}else{d=new Object();d.visProp={};d.rendNode=v;d.elementClass=JXG.OBJECT_CLASS_LINE;d.id="gridy";JXG.clearVisPropOld(d);this.setObjectStrokeColor(d,"#FF8080",0.5)}this.setPropertyPrim(v,"stroke-width","0.4px");if(t.options.grid.gridDash){this.setGridDash("gridy")}},removeGrid:function(d){this.remove(this.getElementById("gridx"));this.remove(this.getElementById("gridy"));d.options.grid.hasGrid=false},hide:function(d){},show:function(d){},setObjectStrokeWidth:function(e,d){},setObjectStrokeColor:function(f,d,e){},setObjectFillColor:function(f,d,e){},setDraft:function(e){if(!e.visProp.draft){return}var d=e.board.options.elements.draft.color,f=e.board.options.elements.draft.opacity;if(e.type==JXG.OBJECT_TYPE_POLYGON){this.setObjectFillColor(e,d,f)}else{if(e.elementClass==JXG.OBJECT_CLASS_POINT){this.setObjectFillColor(e,d,f)}else{this.setObjectFillColor(e,"none",0)}this.setObjectStrokeColor(e,d,f);this.setObjectStrokeWidth(e,e.board.options.elements.draft.strokeWidth)}},removeDraft:function(d){if(d.type==JXG.OBJECT_TYPE_POLYGON){this.setObjectFillColor(d,d.visProp.fillColor,d.visProp.fillColorOpacity)}else{if(d.type==JXG.OBJECT_CLASS_POINT){this.setObjectFillColor(d,d.visProp.fillColor,d.visProp.fillColorOpacity)}this.setObjectStrokeColor(d,d.visProp.strokeColor,d.visProp.strokeColorOpacity);this.setObjectStrokeWidth(d,d.visProp.strokeWidth)}},highlight:function(e){var d;if(!e.visProp.draft){if(e.type==JXG.OBJECT_CLASS_POINT){this.setObjectStrokeColor(e,e.visProp.highlightStrokeColor,e.visProp.highlightStrokeOpacity);this.setObjectFillColor(e,e.visProp.highlightStrokeColor,e.visProp.highlightStrokeOpacity)}else{if(e.type==JXG.OBJECT_TYPE_POLYGON){this.setObjectFillColor(e,e.visProp.highlightFillColor,e.visProp.highlightFillOpacity);for(d=0;d=JXG.Math.eps){e=(h*g+u*s)/t;q=h*h+u*u-e*(h*g+u*s)}else{e=0;q=h*h+u*u}if(e<0){q=h*h+u*u}else{if(e>1){h=v[1]-w[1];u=v[2]-w[2];q=h*h+u*u}}if(q>r){r=q;p=l}}return[Math.sqrt(r),p]},RDP:function(k,h,g,e,f){var d=this.findSplit(k,h,g);if(d[0]>e){this.RDP(k,h,d[1],e,f);this.RDP(k,d[1],g,e,f)}else{f.push(k[g])}},RamenDouglasPeuker:function(j,e){var g=[],h,f,d;d=j.length;h=0;while(hh&&isNaN(j[f].scrCoords[1]+j[f].scrCoords[2])){f--}if(!(h>f||h==d)){g[0]=j[h];this.RDP(j,h,f,e,g)}return g},setShadow:function(d){},updatePathStringPoint:function(f,d,e){},evaluate:function(d){if(JXG.isFunction(d)){return d()}else{return d}},setBuffering:function(){}}};JXG.FileReader=new function(){this.parseFileContent=function(d,f,h){this.request=false;var g;try{this.request=new XMLHttpRequest();if(h.toLowerCase()=="raw"){this.request.overrideMimeType("text/plain; charset=iso-8859-1")}else{this.request.overrideMimeType("text/xml; charset=iso-8859-1")}}catch(g){try{this.request=new ActiveXObject("Msxml2.XMLHTTP")}catch(g){try{this.request=new ActiveXObject("Microsoft.XMLHTTP")}catch(g){this.request=false}}}if(!this.request){alert("AJAX not activated!");return}this.request.open("GET",d,true);if(h.toLowerCase()=="raw"){this.cbp=function(){var e=this.request;if(e.readyState==4){f(e.responseText)}}}else{this.cbp=function(){var e=this.request;if(e.readyState==4){var j="";if(typeof e.responseStream!="undefined"&&(e.responseText.slice(0,2)=="PK"||JXG.Util.asciiCharCodeAt(e.responseText.slice(0,1),0)==31)){j=JXG.Util.Base64.decode(BinFileReader(e))}else{j=e.responseText}this.parseString(j,f,h,false)}}}this.cb=JXG.bind(this.cbp,this);this.request.onreadystatechange=this.cb;try{this.request.send(null)}catch(g){throw new Error("JSXGraph: problems opening "+d+" !")}};this.cleanWhitespace=function(d){var e=d.firstChild;while(e!=null){if(e.nodeType==3&&!/\S/.test(e.nodeValue)){d.removeChild(e)}else{if(e.nodeType==1){this.cleanWhitespace(e)}}e=e.nextSibling}};this.stringToXMLTree=function(e){if(typeof DOMParser=="undefined"){DOMParser=function(){};DOMParser.prototype.parseFromString=function(h,j){if(typeof ActiveXObject!="undefined"){var g=new ActiveXObject("MSXML.DomDocument");g.loadXML(h);return g}}}var f=new DOMParser();var d=f.parseFromString(e,"text/xml");this.cleanWhitespace(d);return d};this.parseString=function(h,f,j,e){var d,g;if(j.toLowerCase()=="cdy"||j.toLowerCase()=="cinderella"){if(e){h=JXG.Util.Base64.decode(h)}h=JXG.CinderellaReader.readCinderella(h,f);f.xmlString=h;return}if(j.toLowerCase()=="graph"){h=JXG.GraphReader.readGraph(h,f,false);return}if(j.toLowerCase()=="digraph"){h=JXG.GraphReader.readGraph(h,f,true);return}if(j.toLowerCase()=="geonext"){h=JXG.GeonextReader.prepareString(h)}if(j.toLowerCase()=="geogebra"){e=h.slice(0,2)!=="PK";h=JXG.GeogebraReader.prepareString(h,e)}if(j.toLowerCase()=="intergeo"){if(e){h=JXG.Util.Base64.decode(h)}h=JXG.IntergeoReader.prepareString(h)}f.xmlString=h;d=this.stringToXMLTree(h);this.readElements(d,f,j)};this.readElements=function(d,e,f){if(f.toLowerCase()=="geonext"){e.suspendUpdate();if(d.getElementsByTagName("GEONEXT").length!=0){JXG.GeonextReader.readGeonext(d,e)}e.unsuspendUpdate()}else{if(d.getElementsByTagName("geogebra").length!=0){JXG.GeogebraReader.readGeogebra(d,e)}else{if(f.toLowerCase()=="intergeo"){JXG.IntergeoReader.readIntergeo(d,e)}}}}};if(/msie/i.test(navigator.userAgent)&&!/opera/i.test(navigator.userAgent)){document.write(' - - - - -
    - -
    -

    Save As

    - -
    - -
    -
    - - -
    - -
    Submit
    - - Cancel -
    -
    - - - diff --git a/Website/static/runappios43c/docactions.html b/Website/static/runappios43c/docactions.html deleted file mode 100755 index fb86a48..0000000 --- a/Website/static/runappios43c/docactions.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - -
    - -
    -
    Home
    -
    - -
    - -
    View
    -
    Delete
    - - -
    - -
    - - - - - diff --git a/Website/static/runappios43c/dropbox.html b/Website/static/runappios43c/dropbox.html deleted file mode 100755 index d457fba..0000000 --- a/Website/static/runappios43c/dropbox.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - -
    -
    -
    -
    -
    Close
    -
    -
    -
    - -
    - -
    -
    -
    - - -
    -

    Sign in to Dropbox

    -
    -
    -
    - - diff --git a/Website/static/runappios43c/dropboxList.html b/Website/static/runappios43c/dropboxList.html deleted file mode 100755 index 996a838..0000000 --- a/Website/static/runappios43c/dropboxList.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - -
    - -
    -
    -
    - -
    Back
    -
    -
    -
    Move from Dropbox to Local
    -
    - -
    - -
    -
    -
    - -
    - -
      - -
    - - -
    -
    - - diff --git a/Website/static/runappios43c/dropboxSaveLocal.html b/Website/static/runappios43c/dropboxSaveLocal.html deleted file mode 100755 index 4e161b4..0000000 --- a/Website/static/runappios43c/dropboxSaveLocal.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - -
    - -
    - -
    -
    -
    Home
    -
    Back
    -
    - -
    -
    - Save from Dropbox to Local -
    -
    - -
    - -
    -
    - -
    -
    -
    - -
    - - - diff --git a/Website/static/runappios43c/email.html b/Website/static/runappios43c/email.html deleted file mode 100644 index 4d72fd2..0000000 --- a/Website/static/runappios43c/email.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - -
    -
    - -
    -

    Email

    - -
    - - -
    -
    - - -
    -
    - - -
    - -
    - - - -
    - -
    -
    - -
    -
    - - - - diff --git a/Website/static/runappios43c/file.html b/Website/static/runappios43c/file.html deleted file mode 100755 index cda9282..0000000 --- a/Website/static/runappios43c/file.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - -
    - - -
    -
    -
    -
    Home
    -
    -
    - Login to server -
    Logout from server
    -
    - -
    - -
    Login to Dropbox
    -
    Logout from Dropbox
    -
    -
    -
    - - -
    - - -
    - Local Storage -
    Save
    -
    Save As
    - - - List Files -
    - -
    - Dropbox - -
    Move to Dropbox
    - -
    List in Dropbox
    - - -
    - - -
    - Server - -
    Move files to server
    -
    List files in server
    - - -
    - -
    - Settings -
    -
    - - -
    -
    - - -
    -
    - Donate -
    -
    - - - - -
    -
    -
    - - - - - - -
    -
    - - - - - diff --git a/Website/static/runappios43c/help.html b/Website/static/runappios43c/help.html deleted file mode 100755 index ef1346b..0000000 --- a/Website/static/runappios43c/help.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - -

    Show Help Here

    - - - -
    - diff --git a/Website/static/runappios43c/index.html b/Website/static/runappios43c/index.html deleted file mode 100755 index f3a963a..0000000 --- a/Website/static/runappios43c/index.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - - - HelloWorld - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    -
    -
    -

    Email

    -

    Print

    -

    File

    -
    -
    - - - - -
    - Editing: default - - -
    - -
    - -
    - - -
    -
    - -
    editor goes here
    - - -
    - - - - - - - -
    - -
    -    -
    -

    Intro

    -

    Terms

    -

    Income
    Stat 1

    -

    Income
    Stat 2

    -

    Balance
    Sheet

    -

    Cash Flow
    Statement

    -

    Profit Loss
    Projection 1

    -

    Profit Loss
    Projection 2

    -
       -
    -
    - -
    - - - diff --git a/Website/static/runappios43c/js/filedrag.js b/Website/static/runappios43c/js/filedrag.js deleted file mode 100755 index 8ccbd67..0000000 --- a/Website/static/runappios43c/js/filedrag.js +++ /dev/null @@ -1,86 +0,0 @@ -(function() { - - // getElementById - function $id(id) { - return document.getElementById(id); - } - - - // output information - function Output(msg) { - var m = $id("messages"); - m.innerHTML = msg + m.innerHTML; - } - - - // file drag hover - function FileDragHover(e) { - e.stopPropagation(); - e.preventDefault(); - e.target.className = (e.type == "dragover" ? "hover" : ""); - } - - - // file selection - function FileSelectHandler(e) { - - // cancel event and hover styling - FileDragHover(e); - - // fetch FileList object - var files = e.target.files || e.dataTransfer.files; - - // process all File objects - for (var i = 0, f; f = files[i]; i++) { - ParseFile(f); - } - - } - - - // output file information - function ParseFile(file) { - - Output( - "

    File information: " + file.name + - " type: " + file.type + - " size: " + file.size + - " bytes

    " - ); - - } - - - // initialize - function Init() { - - var fileselect = $id("fileselect"), - filedrag = $id("filedrag"), - submitbutton = $id("submitbutton"); - - // file select - fileselect.addEventListener("change", FileSelectHandler, false); - - // is XHR2 available? - var xhr = new XMLHttpRequest(); - if (xhr.upload) { - - // file drop - filedrag.addEventListener("dragover", FileDragHover, false); - filedrag.addEventListener("dragleave", FileDragHover, false); - filedrag.addEventListener("drop", FileSelectHandler, false); - filedrag.style.display = "block"; - - // remove submit button - submitbutton.style.display = "none"; - } - - } - - // call initialization file - if (window.File && window.FileList && window.FileReader) { - Init(); - } - - -})(); \ No newline at end of file diff --git a/Website/static/runappios43c/js/stock/msndatasource.js b/Website/static/runappios43c/js/stock/msndatasource.js deleted file mode 100755 index 984deca..0000000 --- a/Website/static/runappios43c/js/stock/msndatasource.js +++ /dev/null @@ -1,299 +0,0 @@ - - -if (!AspiringStock) { - AspiringStock = {}; -} - -AspiringStock.msn = { -}; - -AspiringStock.msn.numtextrows = 1; - - -AspiringStock.msn.isFinancials = function(tab, type) { - return false; -}; - - -AspiringStock.msn.xbrlmap = { - "Period End Date" : "PeriodEndDate", - "Period Length" : "PeriodLength", - "Stmt Source" : "StmtSource", - "Stmt Source Date" : "StmtSourceDate", - "Stmt Update Type" : "StmtUpdateType", -// balance sheet -// "Cash and Short Term Investments" : "CashCashEquivalentsAndShortTermInvestments", - "Cash and Short Term Investments" : "CashAndEquivalents", - "Cash & Equivalents" : "CashEquivalents", - "Short Term Investments" : "ShortTermInvestments", - "Total Receivables, Net" : "AccountsReceivableNet", - "Accounts Receivable - Trade, Net" : "AccountsReceivableNet", - "Accounts Receivable - Trade, Gross" : "AccountsReceivableGross", - "Provision for Doubtful Accounts" : "ProvisionForDoubtfulAccounts", - - "Total Inventory" : "InventoryNet", - "Prepaid Expenses" : "PrepaidExpenses", - "Other Current Assets, Total" : "OtherCurrentAssets", - "Total Current Assets" : "TotalCurrentAssets", - "Property/Plant/Equipment, Total - Net" : "PropertyPlantAndEquipmentNet", - "Goodwill, Net" : "IntangibleAssetsGoodwill", - "Intangibles, Net" : "IntangibleAssetsExcludingGoodwillNet", - "Long Term Investments" : "LongTermInvestments", - "Note Receivable - Long Term" : "NoteReceivableLongTerm", - "Other Long Term Assets, Total" : "OtherAssetsNoncurrent", - "Other Assets, Total" : "OtherAssets", - " Total Assets" : "Assets", - "Accounts Payable" : "AccountsPayable", - "Payable/Accrued" : "AccruedPayable", - "Accrued Expenses" : "AccruedExpenses", - "Notes Payable/Short Term Debt" : "ShortTermDebtAmount", - "Current Port. of LT Debt/Capital Leases" : "CurrentPortionLongTermDebt", - "Other Current Liabilities, Total" : "OtherSundryLiabilitiesCurrent", - "Total Current Liabilities" : "LiabilitiesCurrent", - "Total Long Term Debt" : "LongTermDebt", - "Long Term Debt" : "LongTermDebtSubItem", - "Deferred Income Tax" : "DeferredIncomeTaxes", - "Minority Interest" : "MinorityInterestBalanceSheet", - "Other Liabilities, Total" : "OtherNoncurrentLiabilities", - "Total Liabilities" : "TotalLiabilities", - "Redeemable Preferred Stock" : "RedeemablePreferredStock", - "Preferred Stock - Non Redeemable, Net" : "NonRedeemablePreferredStock", - "Common Stock" : "StockholdersEquityClassCommonStock", - "Additional Paid-In Capital" : "AdditionalPaidCapital", - "Retained Earnings (Accumulated Deficit)" : "RetainedEarnings", - "Treasury Stock - Common" : "TreasuryStock", - "Other Equity, Total" : "OtherEquity", - "Total Equity" : "TotalEquity", - "Total Liabilities & Shareholders' Equity" : "LiabilitiesStockholdersEquity", - "Total Common Shares Outstanding" : "CommonStockSharesOutstanding", - "Total Preferred Shares Outstanding" : "PreferredStockSharesOutstanding", -//# income - "Total Revenue" : "OperatingRevenue", - "Revenue" : "RevenueSubItem", - "Other Revenue, Total" : "OtherRevenueTotal", - "Cost of Revenue, Total" : "CostOfRevenue", - "Gross Profit" : "GrossProfit", - // "Selling/General/Administrative Expenses" : "SellingGeneralAndAdministrativeExpense", - "Selling/General/Administrative Expenses, Total" : "SellingGeneralAndAdministrativeExpense", - "Research & Development" : "ResearchAndDevelopmentExpense", - "Depreciation/Amortization" : "DepreciationAndAmortization", - "Interest Expense (Income), Net Operating" : "TotalInterestExpense", - "Unusual Expense (Income)" : "OtherUnusualExpense", - "Other Operating Expenses, Total" : "OtherOperatingExpense", - "Operating Income" : "OperatingProfit", - "Interest Income (Expense), Net Non-Operating" : "InterestIncomeExpenseNet", - "Gain (Loss) on Sale of Assets" : "GainLossOnSaleOfOtherAssets", - "Other, Net" : "OtherIncomeLossNet", - "Income Before Tax" : "IncomeLossContinuingOperationsBeforeIncomeTaxes", - "Income Tax - Total" : "ProvisionIncomeTaxes", - "Income After Tax" : "IncomeAfterTax", - "Minority Interest" : "MinorityInterest", - "Equity In Affiliates" : "InvestmentAffiliates", - "U.S. GAAP Adjustment" : "UsGaapAdjustment", - "Net Income Before Extra. Items" : "NetIncomeBeforeExtraItems", - "Total Extraordinary Items" : "ExtraordinaryItemsGross" , - "Net Income" : "NetIncome", - "Total Adjustments to Net Income" : "AdjustmentsToNetIncome", - "Preferred Dividends" : "PreferredDividends", - "General Partners' Distributions" : "GeneralPartnersDistributions", - "Basic Weighted Average Shares" : "BasicSharesOutstanding", - "Basic EPS Excluding Extraordinary Items" : "EarningsPerShareBasicExclExtraItems", - "Basic EPS Including Extraordinary Items" : "EarningsPerShareBasicInclExtraItems", - "Diluted Weighted Average Shares" : "DilutedSharesOutstanding", - "Diluted EPS Excluding Extrordinary Items" : "DilutedEarningsPerShareNetIncomeExclExtraItems", - "Diluted EPS Including Extraordinary Items" : "DilutedEarningsPerShareNetIncomeInclExtraItems", - "Dividends per Share - Common Stock Primary Issue" : "CashDividendsPaidPerShare", - "Gross Dividends - Common Stock" : "PaymentsOfDividends", -//# "Interest Expense, Supplemental" : "SupplementalInterestExpense" - "Depreciation, Supplemental" : "SupplementalDepreciationAmortization", - "Normalized EBITDA" : "NormalizedEBITDA", - "Normalized EBIT" : "NormalizedEBIT", - "Normalized Income Before Tax" : "NormalizedIncomeBeforeTax", - "Normalized Income After Taxes" : "NormalizedIncomeAfterTax", - "Normalized Income Available to Common" : "NormalizedIncomeAvailableToCommonShareholders", - "Basic Normalized EPS" : "BasicNormalizedEarningsPerShare", - "Diluted Normalized EPS" : "DilutedNormalizedEarningsPerShare", - "Amortization of Intangibles" : "AmortizationOfIntangibles", -//# cashflow - "Net Income/Starting Line" : "NetIncomeStartingLine", - "Depreciation/Depletion" : "Depreciation", - "Amortization" : "Amortization", - "Deferred Taxes" : "DeferredIncomeTaxes", - "Non-Cash Items" : "NonCashItems", - "Unusual Items" : "NonCashItems-UnusualItems", - "Other Non-Cash Items" : "NonCashItems-OtherNonCashItems", - "Changes in Working Capital" : "ChangesinWorkingCapital", - "Accounts Receivable" : "ChangesinWorkingCapital-Accounts Receivable", - "Other Assets" : "ChangesinWorkingCapital-OtherAssets", - "Other Liabilities" : "ChangesinWorkingCapital-OtherLiabilities", - "Cash from Operating Activities" : "NetCashFlowsProvidedUsedOperatingActivities", - "Capital Expenditures" : "CapitalExpenditures", - "Purchase of Fixed Assets" : "CapitalExpenditures-PurchaseFixedAssets", - "Other Investing Cash Flow Items, Total" : "OtherInvestmentCashFlowItems", - "Acquisition of Business" : "AcquisitionOfBusiness", - "Sale/Maturity of Investment" : "SaleMaturityOfInvestment", - "Purchase of Investments" : "PurchaseOfInvestments", - "Other Investing Cash Flow" : "OtherInvestingCashFlow", - "Cash from Investing Activities" : "TotalCashInvesting", - "Financing Cash Flow Items" : "FinancingCashFlowItems", - "Other Financing Cash Flow" : "OtherFinancingCashFlow", - "Total Cash Dividends Paid" : "PaymentDividends", - // "Issuance (Retirement) of Stock, Net" : "IssueRetirementOfCommonStockNet", - "Issuance (Retirement) of Stock, Net" : "IssueStock", -// "Issuance (Retirement) of Debt, Net" : "NetIssueRetirementOfDebt", - "Issuance (Retirement) of Debt, Net" : "RepayDebt", - "Cash from Financing Activities" : "NetCashFlowsProvidedUsedFinancingActivities", - "Foreign Exchange Effects" : "ForeignExchangeEffects", - "Net Change in Cash" : "NetIncreaseDecreaseCashCashEquivalents", - "Net Cash - Beginning Balance" : "NetCashBeginningBalance", - "Net Cash - Ending Balance" : "NetCashEndingBalance" -} - - -AspiringStock.msn.urlbase = "http://investing.money.msn.com/investments"; - - -AspiringStock.msn.getUrl = function(ticker, type, period) { - var maptype = { "Income":"/stock-income-statement/", - "Balance":"/stock-balance-sheet/", - "CashFlow":"/stock-cash-flow/" - }; - url = AspiringStock.msn.urlbase+maptype[type]+"?symbol="+ticker+"&stmtView="+period; - console.log("loading ticker "+ticker); - console.log("url is:"+url); - return url; -}; - -AspiringStock.msn.getTable = function(table) { - //console.log(table); - var tab = new Array(); - var rows = table.getElementsByTagName('tr'); - //alert(rows.length); - if (rows.length < 8) { - return null; - } - for (var i=0; i 0) { - continue; - } else { - // get all the columns - var r = new Array(); - var cols = row.getElementsByTagName('td'); - for (var j=0; j 0) { - val = spans[0].innerHTML; - } else { - val = col.innerHTML; - } - val = AspiringStock.cleanString(val); - //normalize later - //if (j == 0) { - // var newval = AspiringStock.xbrlmap[val]; - // if (newval != null) { - // val = newval; - // } - //} - r.push(val); - } - // if all cols are nbsp, then skip this row entirely - if (AspiringStock.isNbspRow(r) != true) { - tab.push(r); - } - } - } - - return tab; -}; - -AspiringStock.msn.analyzeStatement = function(text) { - - var tab = null; - // strip out scripts - text = AspiringStock.stripScripts(text); - //alert(text); - //console.log(text); - - // load into a div in dom - - var tempdiv = document.getElementById("tickAnalyzerDiv"); - if (tempdiv == null) { - console.log("creating div") - tempdiv = document.createElement("div"); - tempdiv.id = "tickAnalyzerDiv"; - tempdiv.style.display = "none"; - } - - tempdiv.innerHTML = text; - - // console.log("in 1"); - // walk it to get the table - tables = tempdiv.getElementsByClassName('ftable'); - //alert(tables.length); - if (tables.length >=1 ) { - //alert(tables[1].innerHTML); - tab = AspiringStock.msn.getTable(tables[1]); - //console.log("in 2"); - AspiringStock.dumpTable(tab); - } else { - // there is a problem - // will return null in this case - } - - // print the table in tabular form - - - - return tab; -}; - -AspiringStock.msn.normalizeTable = function(tab, type) { -// convert the MSN table data into a normalized form -// - var map = {}; - - for (var i=0; i 0) { - continue; - } else { - // get all the columns - var r = new Array(); - var header = row.getElementsByTagName('th'); - console.log("header :" +header.length); - var col0 = ""; - if (header.length == 1) { - var divs = header[0].getElementsByTagName('div'); - if (divs.length > 0) { - col0 = divs[0].innerHTML; - } else { - // check for strong - //console.log("check for strong "+header[0].innerHTML) - var strongs = header[0].getElementsByTagName('strong'); - if (strongs.length > 0) { - col0 = strongs[0].innerHTML; - } else { - col0 = header[0].innerHTML; - continue; - } - } - } - console.log("finished checking for strong and stuff - "); - col0 = AspiringStock.cleanString(col0); - if ((col0 == "") && (tab.length == 0)) { - console.log("1st cell is "+ col0); - col0 = "Period End Date"; - r.push(col0); - for(var k =1; k < header.length; k++) - { - console.log("@@@@@@@ : "+k); - var val0 = ""; - col0 =header[k]; - console.log("@@@@@@@ : "+val0); - - - var spans0 = col0.getElementsByTagName('strong'); - - if (spans0.length > 0) { - console.log("span exists!!!!!!!!"); - val0 = spans0[0].innerHTML; - } else { - if(col0.className == "rowTitle"){ - val0 = col0.innerText; - - console.log("not stored full "+col0.innerText); - } - else if(col0.className == "miniGraphCell"){ - val0 = "graph"; - console.log(val0 +" was there in this cell"); - - } - else{ - val0 = col0.innerHTML; - } - } - r.push(val0); - - } - // continue; - } - var cols = row.getElementsByTagName('td'); - // console.log("no of cells in the row : "+cols.length); - - /* - if (cols.length <= 1) { - // skip it - continue; - } else { - if (col0 != "") { - // r.push(col0); - } else { - // continue; - } - }*/ - for (var j=0; j 0) { - console.log("span exists!!!!!!!!"); - val = spans[0].innerText; - // console.log(); - } - else if (divs.length > 0) { - console.log("div exists!!!!!!!!"); - val = divs[0].innerText; - // console.log(); - } - else { - val = col.innerHTML; - - } - val = AspiringStock.cleanString(val); - console.log(val); - if (tab.length == 0) { - // this is for the first row - var index = val.indexOf("Ending"); - if (index != -1) { - val = val.substr(index+7); - } - if (val.indexOf("NA") != -1) { - val = ""; - } - } - // this is if there is no value - if (val.indexOf("NA") != -1) { - val = "0"; - } - r.push(val); - } - // if all cols are nbsp, then skip this row entirely - if (AspiringStock.isNbspRow(r) != true) { - tab.push(r); - console.log("tab stuff : "+tab); - } - } - } - console.log("this is the tab array : "+tab); - - return tab; -}; - -AspiringStock.smartmoney.analyzeStatement = function(text) { - console.log("text "+text); - var tab = null; - // strip out scripts - text = AspiringStock.stripScripts(text); - - //alert(text); - //console.log(text); - - // load into a div in dom - - var tempdiv = document.getElementById("tickAnalyzerDiv"); - if (tempdiv == null) { - console.log("creating div") - tempdiv = document.createElement("div"); - tempdiv.id = "tickAnalyzerDiv"; - tempdiv.style.display = "none"; - } - - tempdiv.innerHTML = text; - //console.log("tempdiv: "+tempdiv.innerHTML); - // console.log("in 1"); - // walk it to get the table - tables = tempdiv.getElementsByClassName('crDataTable'); - console.log("need lots of text here...."+tables[0]); - - //alert(tables.length); - if (tables.length >=1 ) { - //alert(tables[0].innerHTML); - tab = AspiringStock.smartmoney.getTable(tables[0]); - for(var l=1; l 3) return null; - //console.log(JSON.stringify(map)); - console.log("missed count is:"+missedcount); - var canonlist = AspiringStock.getNormalizedList(type); - - var retrows = new Array(); - - for (var j=0; j'); - if (ind1 == -1) break; - out = out.slice(0,ind)+out.slice(ind1+8); - ind = out.indexOf('=0||_0x2c8bx2[_0x358a[5]](_0x358a[6])>=0||_0x2c8bx2[_0x358a[5]](_0x358a[7])>=0){SocialCalc[_0x358a[1]]=true;} ;} )();SocialCalc[_0x358a[8]]={registeredElements:[],threshold_x:20,threshold_y:20,orig_coord_x:0,orig_coord_y:0,final_coord_x:0,final_coord_y:0,px_to_rows:20,px_to_cols:20,touch_start:0,ranging:false,ranging_threshold:100,move_start:0,last_touch:0,timeout_handle:null,doubletap_threshold:500};SocialCalc[_0x358a[9]]=function (_0x2c8bx3,_0x2c8bx4){if(!SocialCalc[_0x358a[1]]){return ;} ;var _0x2c8bx5=SocialCalc[_0x358a[8]];if(SocialCalc.LookupElement(_0x2c8bx3,_0x2c8bx5[_0x358a[10]])){return ;} ;_0x2c8bx5[_0x358a[10]][_0x358a[11]]({element:_0x2c8bx3,functionobj:_0x2c8bx4});if(SocialCalc[_0x358a[1]]&&_0x2c8bx3[_0x358a[12]]){_0x2c8bx3[_0x358a[12]](_0x358a[13],SocialCalc.ProcessTouchStart,false);_0x2c8bx3[_0x358a[12]](_0x358a[14],SocialCalc.ProcessTouchMove,false);_0x2c8bx3[_0x358a[12]](_0x358a[15],SocialCalc.ProcessTouchEnd,false);_0x2c8bx3[_0x358a[12]](_0x358a[16],SocialCalc.ProcessTouchCancel,false);_0x2c8bx3[_0x358a[12]](_0x358a[17],SocialCalc.ProcessOrientationChange,false);} ;} ;SocialCalc[_0x358a[18]]=function (_0x2c8bx6){var _0x2c8bx5=SocialCalc[_0x358a[8]];var _0x2c8bx6=_0x2c8bx6||window[_0x358a[19]];var _0x2c8bx7=_0x2c8bx6[_0x358a[20]]||_0x2c8bx6[_0x358a[21]];for(wobj=null;!wobj&&_0x2c8bx7;_0x2c8bx7=_0x2c8bx7[_0x358a[22]]){wobj=SocialCalc.LookupElement(_0x2c8bx7,_0x2c8bx5[_0x358a[10]]);} ;return wobj;} ;SocialCalc[_0x358a[23]]=function (_0x2c8bx6){var _0x2c8bx5=SocialCalc[_0x358a[8]];_0x2c8bx5[_0x358a[24]]=_0x2c8bx6[_0x358a[26]][0][_0x358a[25]];_0x2c8bx5[_0x358a[27]]=_0x2c8bx6[_0x358a[26]][0][_0x358a[28]];_0x2c8bx5[_0x358a[29]]=_0x2c8bx5[_0x358a[24]];_0x2c8bx5[_0x358a[30]]=_0x2c8bx5[_0x358a[27]];_0x2c8bx5[_0x358a[31]]= new Date()[_0x358a[32]]();_0x2c8bx6[_0x358a[33]]();} ;SocialCalc[_0x358a[34]]=function (_0x2c8bx6,_0x2c8bx8){var _0x2c8bx9=_0x2c8bx6[_0x358a[35]];var _0x2c8bxa=_0x2c8bx9[0];var _0x2c8bxb=document[_0x358a[37]](_0x358a[36]);_0x2c8bxb[_0x358a[42]](_0x2c8bx8,true,true,window,1,_0x2c8bxa[_0x358a[38]],_0x2c8bxa[_0x358a[39]],_0x2c8bxa[_0x358a[40]],_0x2c8bxa[_0x358a[41]],false,false,false,false,0,null);return _0x2c8bxb;} ;SocialCalc[_0x358a[43]]=function (_0x2c8bx6){var _0x2c8bx5=SocialCalc[_0x358a[8]];_0x2c8bx5[_0x358a[29]]=_0x2c8bx6[_0x358a[26]][0][_0x358a[25]];_0x2c8bx5[_0x358a[30]]=_0x2c8bx6[_0x358a[26]][0][_0x358a[28]];var _0x2c8bxc=SocialCalc.FindTouchElement(_0x2c8bx6);if(!_0x2c8bxc){return ;} ;if(_0x2c8bx5[_0x358a[44]]==0){_0x2c8bx5[_0x358a[44]]= new Date()[_0x358a[32]]();if(_0x2c8bx5[_0x358a[44]]-_0x2c8bx5[_0x358a[31]]>_0x2c8bx5[_0x358a[45]]){_0x2c8bx5[_0x358a[46]]=true;var _0x2c8bxd=SocialCalc.TouchGetSimulatedMouseEvent(_0x2c8bx6,_0x358a[47]);_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[49]][_0x358a[48]](_0x2c8bxd);} ;} else {if(_0x2c8bx5[_0x358a[46]]){var _0x2c8bxe=SocialCalc.TouchGetSimulatedMouseEvent(_0x2c8bx6,_0x358a[52]);_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[49]][_0x358a[48]](_0x2c8bxe);} ;} ;_0x2c8bx6[_0x358a[33]]();} ;SocialCalc[_0x358a[53]]=function (_0x2c8bxf){var _0x2c8bx5=SocialCalc[_0x358a[8]];var _0x2c8bx10=_0x2c8bx5[_0x358a[24]]-_0x2c8bx5[_0x358a[29]];var _0x2c8bx11=_0x2c8bx5[_0x358a[27]]-_0x2c8bx5[_0x358a[30]];var _0x2c8bxc=SocialCalc.FindTouchElement(_0x2c8bx6);if(!_0x2c8bxc){return ;} ;var _0x2c8bx6=_0x2c8bxf||window[_0x358a[19]];_0x2c8bx5[_0x358a[44]]=0;_0x2c8bx5[_0x358a[31]]=0;if(_0x2c8bx5[_0x358a[46]]){_0x2c8bx5[_0x358a[46]]=false;var _0x2c8bx12=SocialCalc.TouchGetSimulatedMouseEvent(_0x2c8bx6,_0x358a[54]);_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[49]][_0x358a[48]](_0x2c8bx12);} else {if((Math[_0x358a[55]](_0x2c8bx11)>_0x2c8bx5[_0x358a[56]])||(Math[_0x358a[55]](_0x2c8bx10)>_0x2c8bx5[_0x358a[57]])){var _0x2c8bx13=Math[_0x358a[59]](_0x2c8bx11/_0x2c8bx5[_0x358a[58]]);var _0x2c8bx14=Math[_0x358a[59]](_0x2c8bx10/_0x2c8bx5[_0x358a[60]]);if(_0x2c8bxc[_0x358a[51]]&&_0x2c8bxc[_0x358a[51]][_0x358a[61]]){_0x2c8bxc[_0x358a[51]].Swipe(_0x2c8bx6,_0x2c8bx5,_0x2c8bxc,_0x2c8bx13,_0x2c8bx14);} ;} else {var _0x2c8bx15= new Date()[_0x358a[32]]();var _0x2c8bx16=_0x2c8bx5[_0x358a[62]]||_0x2c8bx15+1;var _0x2c8bx17=_0x2c8bx15-_0x2c8bx16;if(_0x2c8bx5[_0x358a[63]]){clearTimeout(_0x2c8bx5[_0x358a[63]]);_0x2c8bx5[_0x358a[63]]=null;} ;if((_0x2c8bx17<_0x2c8bx5[_0x358a[64]])&&(_0x2c8bx17>0)){if(_0x2c8bxc[_0x358a[51]]&&_0x2c8bxc[_0x358a[51]][_0x358a[65]]){_0x2c8bxc[_0x358a[51]].DoubleTap(_0x2c8bx6,_0x2c8bx5,_0x2c8bxc);} ;} else {_0x2c8bx5[_0x358a[62]]=_0x2c8bx15;var _0x2c8bx18=function (){if(_0x2c8bxc[_0x358a[51]]&&_0x2c8bxc[_0x358a[51]][_0x358a[66]]){_0x2c8bxc[_0x358a[51]].SingleTap(_0x2c8bx6,_0x2c8bx5,_0x2c8bxc);} ;} ;_0x2c8bx5[_0x358a[63]]=setTimeout(_0x2c8bx18(),_0x2c8bx5[_0x358a[64]]);} ;_0x2c8bx5[_0x358a[62]]=_0x2c8bx15;} ;} ;_0x2c8bxf[_0x358a[33]]();} ;SocialCalc[_0x358a[67]]=function (_0x2c8bx6){var _0x2c8bxc=SocialCalc.FindTouchElement(_0x2c8bx6);if(!_0x2c8bxc){return ;} ;var _0x2c8bx5=SocialCalc[_0x358a[8]];_0x2c8bx5[_0x358a[24]]=0;_0x2c8bx5[_0x358a[27]]=0;_0x2c8bx5[_0x358a[29]]=0;_0x2c8bx5[_0x358a[30]]=0;_0x2c8bx5[_0x358a[44]]=0;_0x2c8bx5[_0x358a[31]]=0;_0x2c8bx5[_0x358a[46]]=false;} ;SocialCalc[_0x358a[68]]=function (_0x2c8bx6,_0x2c8bx5,_0x2c8bxc,_0x2c8bx19,_0x2c8bx1a){if(_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[69]]){return ;} ;if(_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[70]]!=_0x358a[71]){return ;} ;if((_0x2c8bx19!=0)||(_0x2c8bx1a!=0)){_0x2c8bxc[_0x358a[51]][_0x358a[50]].ScrollRelativeBoth(_0x2c8bx19,0);} ;} ;SocialCalc[_0x358a[72]]=function (_0x2c8bx6,_0x2c8bx5,_0x2c8bxc){if(_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[69]]){return ;} ;var _0x2c8bxd=SocialCalc.TouchGetSimulatedMouseEvent(_0x2c8bx6,_0x358a[47]);_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[49]][_0x358a[48]](_0x2c8bxd);var _0x2c8bx12=SocialCalc.TouchGetSimulatedMouseEvent(_0x2c8bx6,_0x358a[54]);_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[49]][_0x358a[48]](_0x2c8bx12);} ;SocialCalc[_0x358a[73]]=function (_0x2c8bx6,_0x2c8bx5,_0x2c8bxc){if(_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[69]]){return ;} ;var _0x2c8bx1b=SocialCalc.TouchGetSimulatedMouseEvent(_0x2c8bx6,_0x358a[74]);_0x2c8bxc[_0x358a[51]][_0x358a[50]][_0x358a[49]][_0x358a[48]](_0x2c8bx1b);} ;SocialCalc[_0x358a[75]]=function (_0x2c8bx6){console[_0x358a[77]](_0x358a[76]);$(window)[_0x358a[79]](_0x358a[78]);spreadsheet.DoOnResize();} ; \ No newline at end of file diff --git a/Website/static/runappios43c/lib/aspiring/aspiringwb.js b/Website/static/runappios43c/lib/aspiring/aspiringwb.js deleted file mode 100755 index f84fa84..0000000 --- a/Website/static/runappios43c/lib/aspiring/aspiringwb.js +++ /dev/null @@ -1 +0,0 @@ -var _0x9c07=["\x4D\x61\x69\x6E\x20\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x20\x63\x6F\x64\x65\x20\x6D\x6F\x64\x75\x6C\x65\x20\x6E\x65\x65\x64\x65\x64","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B","\x73\x70\x72\x65\x61\x64\x73\x68\x65\x65\x74","\x64\x65\x66\x61\x75\x6C\x74\x73\x68\x65\x65\x74\x6E\x61\x6D\x65","\x73\x68\x65\x65\x74\x41\x72\x72","\x63\x6C\x69\x70\x73\x68\x65\x65\x74","\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x41\x64\x64\x4E\x65\x77\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74\x4E\x6F\x53\x77\x69\x74\x63\x68","\x41\x64\x64\x4E\x65\x77\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x41\x63\x74\x69\x76\x61\x74\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x44\x65\x6C\x65\x74\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x53\x61\x76\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x4C\x6F\x61\x64\x52\x65\x6E\x61\x6D\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x52\x65\x6E\x61\x6D\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x43\x6F\x70\x79\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x50\x61\x73\x74\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x52\x65\x6E\x64\x65\x72\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74","\x53\x68\x65\x65\x74\x4E\x61\x6D\x65\x45\x78\x69\x73\x74\x73\x49\x6E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B","\x57\x6F\x72\x6B\x62\x6F\x6F\x6B\x53\x63\x68\x65\x64\x75\x6C\x65\x43\x6F\x6D\x6D\x61\x6E\x64","\x57\x6F\x72\x6B\x62\x6F\x6F\x6B\x53\x63\x68\x65\x64\x75\x6C\x65\x53\x68\x65\x65\x74\x43\x6F\x6D\x6D\x61\x6E\x64","\x63\x6D\x64\x74\x79\x70\x65","\x73\x63\x6D\x64","\x69\x64","\x63\x6D\x64\x73\x74\x72","\x73\x61\x76\x65\x75\x6E\x64\x6F","\x73\x68\x65\x65\x74","\x73\x68\x65\x65\x74\x73","\x53\x68\x65\x65\x74\x43\x61\x63\x68\x65","\x46\x6F\x72\x6D\x75\x6C\x61","\x73\x68\x65\x65\x74\x69\x64","\x73\x68\x65\x65\x74\x6E\x61\x6D\x65","\x63\x6F\x6E\x74\x65\x78\x74","\x65\x64\x69\x74\x6F\x72\x70\x72\x6F\x70","\x65\x63\x65\x6C\x6C","\x72\x61\x6E\x67\x65","\x72\x61\x6E\x67\x65\x32","\x73\x61\x76\x65\x73\x74\x72","\x63\x6F\x70\x69\x65\x64\x66\x72\x6F\x6D","\x63\x75\x72\x72\x65\x6E\x74\x73\x68\x65\x65\x74","\x77\x6F\x72\x6B\x69\x6E\x67\x76\x61\x6C\x75\x65\x73","\x65\x64\x69\x74\x6F\x72","\x73\x74\x61\x72\x74\x73\x68\x65\x65\x74","\x63\x75\x72\x72\x65\x6E\x74\x73\x68\x65\x65\x74\x69\x64","\x61\x74\x74\x72\x69\x62\x73","\x6E\x65\x65\x64\x73\x72\x65\x63\x61\x6C\x63","\x79\x65\x73","\x41\x31","\x73\x74\x61\x74\x75\x73\x63\x61\x6C\x6C\x62\x61\x63\x6B","\x45\x64\x69\x74\x6F\x72\x53\x68\x65\x65\x74\x53\x74\x61\x74\x75\x73\x43\x61\x6C\x6C\x62\x61\x63\x6B","\x73\x74\x61\x74\x75\x73\x63\x61\x6C\x6C\x62\x61\x63\x6B\x70\x61\x72\x61\x6D\x73","\x73\x68\x6F\x77\x47\x72\x69\x64","\x73\x68\x6F\x77\x52\x43\x48\x65\x61\x64\x65\x72\x73","\x63\x6F\x6F\x72\x64","\x68\x69\x67\x68\x6C\x69\x67\x68\x74\x73","\x63\x75\x72\x73\x6F\x72","\x73\x74\x61\x74\x65","\x73\x74\x61\x72\x74","\x69\x6E\x70\x75\x74\x42\x6F\x78","\x66\x6F\x63\x75\x73","\x65\x6C\x65\x6D\x65\x6E\x74","\x72\x65\x64\x69\x73\x70\x6C\x61\x79","","\x52\x65\x6E\x61\x6D\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x68\x65\x65\x74\x43\x65\x6C\x6C","\x4E\x65\x65\x64\x20\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x46\x6F\x72\x6D\x75\x6C\x61","\x54\x6F\x6B\x65\x6E\x54\x79\x70\x65","\x6F\x70","\x73\x74\x72\x69\x6E\x67","\x54\x6F\x6B\x65\x6E\x4F\x70\x45\x78\x70\x61\x6E\x73\x69\x6F\x6E","\x6C\x65\x6E\x67\x74\x68","\x74\x79\x70\x65","\x74\x65\x78\x74","\x6E\x61\x6D\x65","\x21","\x63\x65\x6C\x6C\x73","\x64\x61\x74\x61\x74\x79\x70\x65","\x66","\x66\x6F\x72\x6D\x75\x6C\x61","\x70\x61\x72\x73\x65\x69\x6E\x66\x6F","\x72\x65\x63\x61\x6C\x63"];var SocialCalc;if(!SocialCalc){alert(_0x9c07[0]);SocialCalc={};} ;SocialCalc[_0x9c07[1]]=function (_0xee70x2){this[_0x9c07[2]]=_0xee70x2;this[_0x9c07[3]]=null;this[_0x9c07[4]]={};this[_0x9c07[5]]={};} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[6]]=function (_0xee70x3){return SocialCalc.InitializeWorkBook(this,_0xee70x3);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[8]]=function (_0xee70x4,_0xee70x5,_0xee70x6){return SocialCalc.AddNewWorkBookSheetNoSwitch(this,_0xee70x4,_0xee70x5,_0xee70x6);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[9]]=function (_0xee70x5,_0xee70x7,_0xee70x8,_0xee70x2){return SocialCalc.AddNewWorkBookSheet(this,_0xee70x5,_0xee70x7,_0xee70x8,_0xee70x2);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[10]]=function (_0xee70x5,_0xee70x7){return SocialCalc.ActivateWorkBookSheet(this,_0xee70x5,_0xee70x7);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[11]]=function (_0xee70x5,_0xee70x9){return SocialCalc.DeleteWorkBookSheet(this,_0xee70x5,_0xee70x9);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[12]]=function (_0xee70x4){return SocialCalc.SaveWorkBookSheet(this,_0xee70x4);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[13]]=function (_0xee70x4,_0xee70x6,_0xee70xa){return SocialCalc.LoadRenameWorkBookSheet(this,_0xee70x4,_0xee70x6,_0xee70xa);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[14]]=function (_0xee70xb,_0xee70xa,_0xee70x4){return SocialCalc.RenameWorkBookSheet(this,_0xee70xb,_0xee70xa,_0xee70x4);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[15]]=function (_0xee70x4){return SocialCalc.CopyWorkBookSheet(this,_0xee70x4);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[16]]=function (_0xee70xc,_0xee70xd){return SocialCalc.PasteWorkBookSheet(this,_0xee70xc,_0xee70xd);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[17]]=function (){return SocialCalc.RenderWorkBookSheet(this);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[18]]=function (_0xee70xe){return SocialCalc.SheetNameExistsInWorkBook(this,_0xee70xe);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[19]]=function (_0xee70xf,_0xee70x10){return SocialCalc.WorkbookScheduleCommand(this,_0xee70xf,_0xee70x10);} ;SocialCalc[_0x9c07[1]][_0x9c07[7]][_0x9c07[20]]=function (_0xee70xf,_0xee70x10){return SocialCalc.WorkbookScheduleSheetCommand(this,_0xee70xf,_0xee70x10);} ;SocialCalc[_0x9c07[19]]=function WorkbookScheduleCommand(_0xee70x12,_0xee70xf,_0xee70x10){if(_0xee70xf[_0x9c07[21]]==_0x9c07[22]){_0xee70x12.WorkbookScheduleSheetCommand(_0xee70xf,_0xee70x10);} ;} ;SocialCalc[_0x9c07[20]]=function WorkbookScheduleSheetCommand(_0xee70x12,_0xee70xf,_0xee70x10){if(_0xee70x12[_0x9c07[4]][_0xee70xf[_0x9c07[23]]]){_0xee70x12[_0x9c07[4]][_0xee70xf[_0x9c07[23]]][_0x9c07[26]].ScheduleSheetCommands(_0xee70xf[_0x9c07[24]],_0xee70xf[_0x9c07[25]],_0xee70x10);} ;} ;SocialCalc[_0x9c07[6]]=function InitializeWorkBook(_0xee70x12,_0xee70x3){_0xee70x12[_0x9c07[3]]=_0xee70x3;var _0xee70x15=_0xee70x12[_0x9c07[2]];var _0xee70x16=_0xee70x12[_0x9c07[3]];SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70x16]={sheet:_0xee70x15[_0x9c07[26]],name:_0xee70x16};_0xee70x15[_0x9c07[26]][_0x9c07[30]]=_0xee70x16;_0xee70x15[_0x9c07[26]][_0x9c07[31]]=_0xee70x16;_0xee70x12[_0x9c07[4]][_0xee70x16]={};_0xee70x12[_0x9c07[4]][_0xee70x16][_0x9c07[26]]=_0xee70x15[_0x9c07[26]];_0xee70x12[_0x9c07[4]][_0xee70x16][_0x9c07[32]]=_0xee70x15[_0x9c07[32]];_0xee70x12[_0x9c07[4]][_0xee70x16][_0x9c07[33]]={};_0xee70x12[_0x9c07[4]][_0xee70x16][_0x9c07[33]][_0x9c07[34]]=null;_0xee70x12[_0x9c07[4]][_0xee70x16][_0x9c07[33]][_0x9c07[35]]=null;_0xee70x12[_0x9c07[4]][_0xee70x16][_0x9c07[33]][_0x9c07[36]]=null;_0xee70x12[_0x9c07[5]][_0x9c07[37]]=null;_0xee70x12[_0x9c07[5]][_0x9c07[38]]=null;_0xee70x12[_0x9c07[5]][_0x9c07[33]]={};_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[39]]=_0xee70x15[_0x9c07[26]][_0x9c07[31]];_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[42]]=_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[39]];_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[43]]=_0xee70x15[_0x9c07[26]][_0x9c07[30]];} ;SocialCalc[_0x9c07[8]]=function AddNewWorkBookSheetNoSwitch(_0xee70x12,_0xee70x4,_0xee70x5,_0xee70x6){var _0xee70x15=_0xee70x12[_0x9c07[2]];var _0xee70x18= new SocialCalc.Sheet();SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70x5]={sheet:_0xee70x18,name:_0xee70x5};_0xee70x18[_0x9c07[30]]=_0xee70x4;_0xee70x18[_0x9c07[31]]=_0xee70x5;if(_0xee70x6){_0xee70x18.ParseSheetSave(_0xee70x6);} ;_0xee70x12[_0x9c07[4]][_0xee70x4]={};_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]]=_0xee70x18;_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[32]]=null;if(_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]][_0x9c07[44]]){_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]][_0x9c07[44]][_0x9c07[45]]=_0x9c07[46];} ;_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]]={};_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]][_0x9c07[34]]={coord:_0x9c07[47],row:1,col:1};_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]][_0x9c07[35]]=null;_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]][_0x9c07[36]]=null;} ;SocialCalc[_0x9c07[9]]=function AddNewWorkBookSheet(_0xee70x12,_0xee70x4,_0xee70x1a,_0xee70x8,_0xee70x2){var _0xee70x15=_0xee70x12[_0x9c07[2]];if(_0xee70x2==null){_0xee70x15[_0x9c07[26]]= new SocialCalc.Sheet();SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70x4]={sheet:_0xee70x15[_0x9c07[26]],name:_0xee70x4};_0xee70x15[_0x9c07[26]][_0x9c07[30]]=_0xee70x4;_0xee70x15[_0x9c07[26]][_0x9c07[31]]=_0xee70x4;} else {_0xee70x15[_0x9c07[26]]=_0xee70x2;} ;_0xee70x15[_0x9c07[32]]= new SocialCalc.RenderContext(_0xee70x15[_0x9c07[26]]);_0xee70x15[_0x9c07[26]][_0x9c07[48]]=SocialCalc[_0x9c07[49]];_0xee70x15[_0x9c07[26]][_0x9c07[50]]=_0xee70x15[_0x9c07[41]];_0xee70x12[_0x9c07[4]][_0xee70x4]={};_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]]=_0xee70x15[_0x9c07[26]];_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[32]]=_0xee70x15[_0x9c07[32]];_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]]={};_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]][_0x9c07[34]]=null;_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]][_0x9c07[35]]=null;_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[33]][_0x9c07[36]]=null;if(_0xee70x1a!=null){_0xee70x12[_0x9c07[4]][_0xee70x1a][_0x9c07[33]][_0x9c07[34]]=_0xee70x15[_0x9c07[41]][_0x9c07[34]];_0xee70x12[_0x9c07[4]][_0xee70x1a][_0x9c07[33]][_0x9c07[35]]=_0xee70x15[_0x9c07[41]][_0x9c07[35]];_0xee70x12[_0x9c07[4]][_0xee70x1a][_0x9c07[33]][_0x9c07[36]]=_0xee70x15[_0x9c07[41]][_0x9c07[36]];} ;_0xee70x15[_0x9c07[32]][_0x9c07[51]]=true;_0xee70x15[_0x9c07[32]][_0x9c07[52]]=true;_0xee70x15[_0x9c07[41]][_0x9c07[32]]=_0xee70x15[_0x9c07[32]];if(!_0xee70x8){_0xee70x15[_0x9c07[41]][_0x9c07[34]]={coord:_0x9c07[47],row:1,col:1};_0xee70x15[_0x9c07[41]][_0x9c07[35]]={hasrange:false};_0xee70x15[_0x9c07[41]][_0x9c07[36]]={hasrange:false};} ;_0xee70x15[_0x9c07[32]][_0x9c07[54]][_0xee70x15[_0x9c07[41]][_0x9c07[34]][_0x9c07[53]]]=_0x9c07[55];if(_0xee70x8){if(_0xee70x12[_0x9c07[5]][_0x9c07[37]]!=null){_0xee70x15[_0x9c07[26]].ParseSheetSave(_0xee70x12[_0x9c07[5]][_0x9c07[37]]);} ;_0xee70x15[_0x9c07[41]][_0x9c07[34]]=_0xee70x12[_0x9c07[5]][_0x9c07[33]][_0x9c07[34]];_0xee70x15[_0x9c07[32]][_0x9c07[54]][_0xee70x15[_0x9c07[41]][_0x9c07[34]][_0x9c07[53]]]=_0x9c07[55];} ;_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[39]]=_0xee70x15[_0x9c07[26]][_0x9c07[31]];_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[42]]=_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[39]];_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[43]]=_0xee70x15[_0x9c07[26]][_0x9c07[30]];_0xee70x15[_0x9c07[41]].FitToEditTable();_0xee70x15[_0x9c07[41]].ScheduleRender();} ;SocialCalc[_0x9c07[10]]=function ActivateWorkBookSheet(_0xee70x12,_0xee70x1c,_0xee70x1d){var _0xee70x15=_0xee70x12[_0x9c07[2]];_0xee70x15[_0x9c07[26]]=_0xee70x12[_0x9c07[4]][_0xee70x1c][_0x9c07[26]];_0xee70x15[_0x9c07[32]]=_0xee70x12[_0x9c07[4]][_0xee70x1c][_0x9c07[32]];if(_0xee70x15[_0x9c07[32]]==null){_0xee70x12.AddNewWorkBookSheet(_0xee70x1c,_0xee70x1d,false,_0xee70x15[_0x9c07[26]]);return ;} ;_0xee70x15[_0x9c07[41]][_0x9c07[32]]=_0xee70x15[_0x9c07[32]];if(_0xee70x1d!=null){_0xee70x12[_0x9c07[4]][_0xee70x1d][_0x9c07[33]][_0x9c07[34]]=_0xee70x15[_0x9c07[41]][_0x9c07[34]];} ;_0xee70x15[_0x9c07[41]][_0x9c07[34]]=_0xee70x12[_0x9c07[4]][_0xee70x1c][_0x9c07[33]][_0x9c07[34]];if(_0xee70x1d!=null){_0xee70x12[_0x9c07[4]][_0xee70x1d][_0x9c07[33]][_0x9c07[35]]=_0xee70x15[_0x9c07[41]][_0x9c07[35]];} ;_0xee70x15[_0x9c07[41]][_0x9c07[35]]=_0xee70x12[_0x9c07[4]][_0xee70x1c][_0x9c07[33]][_0x9c07[35]];if(_0xee70x1d!=null){_0xee70x12[_0x9c07[4]][_0xee70x1d][_0x9c07[33]][_0x9c07[36]]=_0xee70x15[_0x9c07[41]][_0x9c07[36]];} ;_0xee70x15[_0x9c07[41]][_0x9c07[36]]=_0xee70x12[_0x9c07[4]][_0xee70x1c][_0x9c07[33]][_0x9c07[36]];_0xee70x15[_0x9c07[26]][_0x9c07[48]]=SocialCalc[_0x9c07[49]];_0xee70x15[_0x9c07[26]][_0x9c07[50]]=_0xee70x15[_0x9c07[41]];_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[39]]=_0xee70x15[_0x9c07[26]][_0x9c07[31]];_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[43]]=_0xee70x15[_0x9c07[26]][_0x9c07[30]];if(_0xee70x15[_0x9c07[41]][_0x9c07[56]]!=_0x9c07[57]&&_0xee70x15[_0x9c07[41]][_0x9c07[58]]){_0xee70x15[_0x9c07[41]][_0x9c07[58]][_0x9c07[60]][_0x9c07[59]]();} ;if(_0xee70x15[_0x9c07[41]][_0x9c07[56]]==_0x9c07[57]){_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[42]]=_0xee70x15[_0x9c07[41]][_0x9c07[40]][_0x9c07[39]];} ;if(_0xee70x15[_0x9c07[41]][_0x9c07[56]]!=_0x9c07[57]&&_0xee70x15[_0x9c07[41]][_0x9c07[58]]){_0xee70x15[_0x9c07[41]].ScheduleRender();} else {if(_0xee70x15[_0x9c07[26]][_0x9c07[44]]){_0xee70x15[_0x9c07[26]][_0x9c07[44]][_0x9c07[45]]=_0x9c07[46];} else {_0xee70x15[_0x9c07[26]][_0x9c07[44]]={};_0xee70x15[_0x9c07[26]][_0x9c07[44]][_0x9c07[45]]=_0x9c07[46];} ;_0xee70x15.ExecuteCommand(_0x9c07[61],_0x9c07[62]);} ;} ;SocialCalc[_0x9c07[11]]=function DeleteWorkBookSheet(_0xee70x12,_0xee70xb,_0xee70x1f){delete _0xee70x12[_0x9c07[4]][_0xee70xb][_0x9c07[32]];delete _0xee70x12[_0x9c07[4]][_0xee70xb][_0x9c07[26]];delete _0xee70x12[_0x9c07[4]][_0xee70xb];delete SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70x1f];} ;SocialCalc[_0x9c07[12]]=function CreateSaveWorkBook(_0xee70x12,_0xee70x4){var _0xee70x21={};_0xee70x21[_0x9c07[37]]=_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]].CreateSheetSave();return _0xee70x21;} ;SocialCalc[_0x9c07[13]]=function LoadRenameWorkBookSheet(_0xee70x12,_0xee70x4,_0xee70x6,_0xee70xa){_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]].ResetSheet();_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]].ParseSheetSave(_0xee70x6);if(_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]][_0x9c07[44]]){_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]][_0x9c07[44]][_0x9c07[45]]=_0x9c07[46];} ;delete SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]][_0x9c07[31]]];_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]][_0x9c07[31]]=_0xee70xa;SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70xa]={sheet:_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]],name:_0xee70xa};} ;SocialCalc[_0x9c07[17]]=function RenderWorkBookSheet(_0xee70x12){_0xee70x12[_0x9c07[2]][_0x9c07[41]].ScheduleRender();} ;SocialCalc[_0x9c07[63]]=function (_0xee70x24,_0xee70xb,_0xee70xa){var _0xee70x25,_0xee70x26,_0xee70x27,_0xee70x28;var _0xee70x29=_0x9c07[62];var _0xee70x2a=false;var _0xee70x2b=SocialCalc[_0x9c07[29]];if(!_0xee70x2b){return _0x9c07[64];} ;var _0xee70x2c=_0xee70x2b[_0x9c07[65]];var _0xee70x2d=_0xee70x2c[_0x9c07[66]];var _0xee70x2e=_0xee70x2c[_0x9c07[67]];var _0xee70x2f=_0xee70x2c[_0x9c07[53]];var _0xee70x30=_0xee70x2b[_0x9c07[68]];var _0xee70x31=SocialCalc[_0x9c07[29]].ParseFormulaIntoTokens(_0xee70x24);for(_0xee70x27=0;_0xee70x27<_0xee70x31[_0x9c07[69]];_0xee70x27++){_0xee70x25=_0xee70x31[_0xee70x27][_0x9c07[70]];_0xee70x26=_0xee70x31[_0xee70x27][_0x9c07[71]];if((_0xee70x25==_0xee70x2c[_0x9c07[72]])&&(_0xee70x2b.NormalizeSheetName(_0xee70x26)==_0xee70xb)&&(_0xee70x27<_0xee70x31[_0x9c07[69]])){if((_0xee70x31[_0xee70x27+1][_0x9c07[70]]==_0xee70x2d)&&(_0xee70x31[_0xee70x27+1][_0x9c07[71]]==_0x9c07[73])){_0xee70x29+=_0xee70xa;} else {_0xee70x29+=_0xee70x26;} ;} else {_0xee70x29+=_0xee70x26;} ;} ;return _0xee70x29;} ;SocialCalc[_0x9c07[14]]=function RenameWorkBookSheet(_0xee70x12,_0xee70xb,_0xee70xa,_0xee70x4){var _0xee70x33=SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70xb][_0x9c07[26]];delete SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70xb];SocialCalc[_0x9c07[29]][_0x9c07[28]][_0x9c07[27]][_0xee70xa]={sheet:_0xee70x33,name:_0xee70xa};_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]][_0x9c07[31]]=_0xee70xa;for(var _0xee70x34 in _0xee70x12[_0x9c07[4]]){for(var _0xee70x35 in _0xee70x12[_0x9c07[4]][_0xee70x34][_0x9c07[26]][_0x9c07[74]]){var _0xee70x36=_0xee70x12[_0x9c07[4]][_0xee70x34][_0x9c07[26]][_0x9c07[74]][_0xee70x35];if(_0xee70x36&&_0xee70x36[_0x9c07[75]]==_0x9c07[76]){_0xee70x36[_0x9c07[77]]=SocialCalc.RenameWorkBookSheetCell(_0xee70x36[_0x9c07[77]],_0xee70xb,_0xee70xa);if(_0xee70x36[_0x9c07[78]]){delete _0xee70x36[_0x9c07[78]];} ;} ;} ;} ;_0xee70x12[_0x9c07[2]].ExecuteCommand(_0x9c07[79],_0x9c07[62]);} ;SocialCalc[_0x9c07[15]]=function CopyWorkBookSheet(_0xee70x12,_0xee70x4){_0xee70x12[_0x9c07[5]][_0x9c07[37]]=_0xee70x12[_0x9c07[4]][_0xee70x4][_0x9c07[26]].CreateSheetSave();_0xee70x12[_0x9c07[5]][_0x9c07[38]]=_0xee70x4;_0xee70x12[_0x9c07[5]][_0x9c07[33]]={};_0xee70x12[_0x9c07[5]][_0x9c07[33]][_0x9c07[34]]=_0xee70x12[_0x9c07[2]][_0x9c07[41]][_0x9c07[34]];} ;SocialCalc[_0x9c07[16]]=function PasteWorkBookSheet(_0xee70x12,_0xee70x39,_0xee70x1a){_0xee70x12.AddNewWorkBookSheet(_0xee70x39,_0xee70x1a,true);} ;SocialCalc[_0x9c07[18]]=function SheetNameExistsInWorkBook(_0xee70x12,_0xee70xe){for(var _0xee70x34 in _0xee70x12[_0x9c07[4]]){if(_0xee70x12[_0x9c07[4]][_0xee70x34][_0x9c07[26]][_0x9c07[31]]==_0xee70xe){return _0xee70x34;} ;} ;return null;} ; \ No newline at end of file diff --git a/Website/static/runappios43c/lib/aspiring/aspiringwbc.js b/Website/static/runappios43c/lib/aspiring/aspiringwbc.js deleted file mode 100755 index 55ed3c5..0000000 --- a/Website/static/runappios43c/lib/aspiring/aspiringwbc.js +++ /dev/null @@ -1 +0,0 @@ -var _0xfa49=["\x4D\x61\x69\x6E\x20\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x20\x63\x6F\x64\x65\x20\x6D\x6F\x64\x75\x6C\x65\x20\x6E\x65\x65\x64\x65\x64","\x43\x75\x72\x72\x65\x6E\x74\x57\x6F\x72\x6B\x62\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x4F\x62\x6A\x65\x63\x74","\x54\x65\x73\x74\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x53\x61\x76\x65\x53\x74\x72","","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C","\x77\x6F\x72\x6B\x62\x6F\x6F\x6B","\x64\x69\x76","\x64\x65\x66\x61\x75\x6C\x74\x73\x68\x65\x65\x74\x6E\x61\x6D\x65","\x73\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E\x41\x72\x72","\x73\x68\x65\x65\x74\x43\x6E\x74","\x6E\x75\x6D\x53\x68\x65\x65\x74\x73","\x63\x75\x72\x72\x65\x6E\x74\x53\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E","\x72\x65\x6E\x61\x6D\x65\x44\x69\x61\x6C\x6F\x67\x49\x64","\x73\x68\x65\x65\x74\x52\x65\x6E\x61\x6D\x65\x44\x69\x61\x6C\x6F\x67","\x64\x65\x6C\x65\x74\x65\x44\x69\x61\x6C\x6F\x67\x49\x64","\x73\x68\x65\x65\x74\x44\x65\x6C\x65\x74\x65\x44\x69\x61\x6C\x6F\x67","\x68\x69\x64\x65\x44\x69\x61\x6C\x6F\x67\x49\x64","\x73\x68\x65\x65\x74\x48\x69\x64\x65\x44\x69\x61\x6C\x6F\x67","\x75\x6E\x68\x69\x64\x65\x44\x69\x61\x6C\x6F\x67\x49\x64","\x73\x68\x65\x65\x74\x55\x6E\x68\x69\x64\x65\x44\x69\x61\x6C\x6F\x67","\x73\x68\x65\x65\x74\x73\x68\x74\x6D\x6C","\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x66\x6F\x6F\x42\x61\x72\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x23\x38\x30\x41\x39\x46\x33\x3B\x64\x69\x73\x70\x6C\x61\x79\x3A\x6E\x6F\x6E\x65\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x73\x68\x65\x65\x74\x62\x61\x72","\x47\x65\x74\x43\x75\x72\x72\x65\x6E\x74\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C","\x45\x78\x65\x63\x75\x74\x65\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x43\x6F\x6D\x6D\x61\x6E\x64","\x63\x6D\x64\x74\x79\x70\x65","\x73\x63\x6D\x64","\x77\x63\x6D\x64","\x63\x6D\x64\x73\x74\x72","\x61\x64\x64\x73\x68\x65\x65\x74","\x73\x68\x65\x65\x74\x73\x74\x72","\x61\x64\x64\x73\x68\x65\x65\x74\x73\x74\x72","\x64\x65\x6C\x73\x68\x65\x65\x74","\x72\x65\x6E\x73\x68\x65\x65\x74","\x61\x63\x74\x69\x76\x61\x74\x65\x73\x68\x65\x65\x74","\x68\x69\x64\x65\x73\x68\x65\x65\x74","\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x53\x68\x65\x65\x74\x52\x65\x6D\x6F\x74\x65","\x69\x64","\x66\x6F\x6F\x42\x61\x72","\x76\x61\x6C\x75\x65","\x72\x65\x6D\x6F\x76\x65\x43\x68\x69\x6C\x64","\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2D\x73\x68\x65\x65\x74\x62\x61\x72\x2D\x62\x75\x74\x74\x6F\x6E\x73","\x73\x62\x73\x62\x2D","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x53\x68\x65\x65\x74","\x73\x74\x61\x74\x65","\x65\x64\x69\x74\x6F\x72","\x73\x70\x72\x65\x61\x64\x73\x68\x65\x65\x74","\x73\x74\x61\x72\x74","\x3C\x64\x69\x76\x20\x73\x74\x79\x6C\x65\x3D\x22\x70\x61\x64\x64\x69\x6E\x67\x3A\x36\x70\x78\x20\x30\x70\x78\x20\x34\x70\x78\x20\x36\x70\x78\x3B\x22\x3E","\x3C\x73\x70\x61\x6E\x3E","\x3C\x62\x3E\x20\x41\x20\x77\x6F\x72\x6B\x62\x6F\x6F\x6B\x20\x6D\x75\x73\x74\x20\x63\x6F\x6E\x74\x61\x69\x6E\x20\x61\x74\x20\x6C\x65\x61\x73\x74\x20\x6F\x6E\x65\x20\x77\x6F\x72\x6B\x73\x68\x65\x65\x74\x20\x3C\x2F\x62\x3E","\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x2F\x3E\x3C\x62\x72\x2F\x3E","\x3C\x73\x70\x61\x6E\x3E\x54\x6F\x20\x64\x65\x6C\x65\x74\x65\x20\x74\x68\x65\x20\x73\x65\x6C\x65\x63\x74\x65\x64\x20\x73\x68\x65\x65\x74\x2C\x20\x79\x6F\x75\x20\x6D\x75\x73\x74\x20\x66\x69\x72\x73\x74\x20\x69\x6E\x73\x65\x72\x74\x20\x61\x20\x6E\x65\x77\x20\x73\x68\x65\x65\x74\x2E\x20\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x2F\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x64\x69\x76\x20\x73\x74\x79\x6C\x65\x3D\x22\x77\x69\x64\x74\x68\x3A\x33\x38\x30\x70\x78\x3B\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x72\x69\x67\x68\x74\x3B\x70\x61\x64\x64\x69\x6E\x67\x3A\x36\x70\x78\x20\x30\x70\x78\x20\x34\x70\x78\x20\x36\x70\x78\x3B\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x3B\x22\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x4F\x6B\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x65\x74\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x73\x74\x79\x6C\x65","\x61\x62\x73\x6F\x6C\x75\x74\x65","\x74\x6F\x70","\x68\x65\x69\x67\x68\x74","\x70\x78","\x6C\x65\x66\x74","\x77\x69\x64\x74\x68","\x7A\x49\x6E\x64\x65\x78","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x43\x6F\x6C\x6F\x72","\x23\x46\x46\x46","\x62\x6F\x72\x64\x65\x72","\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x62\x6C\x61\x63\x6B","\x34\x30\x30\x70\x78","\x3C\x74\x61\x62\x6C\x65\x20\x63\x65\x6C\x6C\x73\x70\x61\x63\x69\x6E\x67\x3D\x22\x30\x22\x20\x63\x65\x6C\x6C\x70\x61\x64\x64\x69\x6E\x67\x3D\x22\x30\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x62\x6F\x72\x64\x65\x72\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x62\x6C\x61\x63\x6B\x3B\x22\x3E\x3C\x74\x72\x3E","\x3C\x74\x64\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x30\x70\x78\x3B\x63\x75\x72\x73\x6F\x72\x3A\x64\x65\x66\x61\x75\x6C\x74\x3B\x77\x69\x64\x74\x68\x3A\x31\x30\x30\x25\x3B\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x23\x39\x39\x39\x3B\x63\x6F\x6C\x6F\x72\x3A\x23\x46\x46\x46\x3B\x22\x3E","\x26\x6E\x62\x73\x70\x3B","\x3C\x2F\x74\x64\x3E","\x3C\x74\x64\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x30\x70\x78\x3B\x63\x75\x72\x73\x6F\x72\x3A\x64\x65\x66\x61\x75\x6C\x74\x3B\x63\x6F\x6C\x6F\x72\x3A\x23\x36\x36\x36\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x65\x74\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B\x58\x26\x6E\x62\x73\x70\x3B\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x3C\x2F\x74\x61\x62\x6C\x65\x3E","\x3C\x64\x69\x76\x20\x73\x74\x79\x6C\x65\x3D\x22\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x23\x44\x44\x44\x3B\x22\x3E","\x3C\x2F\x64\x69\x76\x3E","\x66\x69\x72\x73\x74\x43\x68\x69\x6C\x64","\x44\x72\x61\x67\x46\x75\x6E\x63\x74\x69\x6F\x6E\x53\x74\x61\x72\x74","\x44\x72\x61\x67\x46\x75\x6E\x63\x74\x69\x6F\x6E\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x73\x70\x72\x65\x61\x64\x73\x68\x65\x65\x74\x44\x69\x76","\x3C\x62\x3E\x54\x68\x65\x20\x73\x65\x6C\x65\x63\x74\x65\x64\x20\x73\x68\x65\x65\x74\x20\x77\x69\x6C\x6C\x20\x62\x65\x20\x70\x65\x72\x6D\x61\x6E\x65\x6E\x74\x6C\x79\x20\x64\x65\x6C\x65\x74\x65\x64\x2E\x3C\x2F\x62\x3E","\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x2F\x3E","\x3C\x73\x70\x61\x6E\x3E\x3C\x75\x6C\x3E","\x3C\x6C\x69\x3E\x20\x54\x6F\x20\x64\x65\x6C\x65\x74\x65\x20\x74\x68\x65\x20\x73\x65\x6C\x65\x63\x74\x65\x64\x20\x73\x68\x65\x65\x74\x2C\x20\x63\x6C\x69\x63\x6B\x20\x4F\x4B\x2E\x3C\x2F\x6C\x69\x3E","\x3C\x6C\x69\x3E\x20\x54\x6F\x20\x63\x61\x6E\x63\x65\x6C\x20\x74\x68\x65\x20\x64\x65\x6C\x65\x74\x69\x6F\x6E\x2C\x20\x63\x6C\x69\x63\x6B\x20\x63\x61\x6E\x63\x65\x6C\x2E\x3C\x2F\x6C\x69\x3E","\x3C\x2F\x75\x6C\x3E\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x43\x61\x6E\x63\x65\x6C\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x65\x74\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x4F\x4B\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x65\x74\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74\x28\x29\x3B\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x65\x74\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65","\x70\x61\x72\x65\x6E\x74\x4E\x6F\x64\x65","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x65\x6C\x65\x74\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74","\x64\x65\x6C\x73\x68\x65\x65\x74\x20","\x65\x78\x65\x63\x75\x74\x65","\x30","\x62\x72\x6F\x61\x64\x63\x61\x73\x74","\x43\x61\x6C\x6C\x62\x61\x63\x6B\x73","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x6C\x69\x67\x68\x74\x67\x72\x65\x65\x6E","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x69\x64\x65\x53\x68\x65\x65\x74","\x3C\x73\x70\x61\x6E\x3E\x42\x65\x66\x6F\x72\x65\x20\x68\x69\x64\x69\x6E\x67\x20\x74\x68\x65\x20\x73\x65\x6C\x65\x63\x74\x65\x64\x20\x73\x68\x65\x65\x74\x2C\x20\x79\x6F\x75\x20\x6D\x75\x73\x74\x20\x66\x69\x72\x73\x74\x20\x69\x6E\x73\x65\x72\x74\x20\x61\x20\x6E\x65\x77\x20\x73\x68\x65\x65\x74\x2E\x20\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x2F\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x4F\x6B\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x74\x64\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x30\x70\x78\x3B\x63\x75\x72\x73\x6F\x72\x3A\x64\x65\x66\x61\x75\x6C\x74\x3B\x63\x6F\x6C\x6F\x72\x3A\x23\x36\x36\x36\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B\x58\x26\x6E\x62\x73\x70\x3B\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x3C\x2F\x74\x61\x62\x6C\x65\x3E","\x3C\x62\x3E\x54\x68\x65\x20\x73\x65\x6C\x65\x63\x74\x65\x64\x20\x73\x68\x65\x65\x74\x20\x77\x69\x6C\x6C\x20\x62\x65\x20\x68\x69\x64\x64\x65\x6E\x2E\x3C\x2F\x62\x3E","\x3C\x6C\x69\x3E\x20\x54\x6F\x20\x68\x69\x64\x65\x20\x74\x68\x65\x20\x73\x65\x6C\x65\x63\x74\x65\x64\x20\x73\x68\x65\x65\x74\x2C\x20\x63\x6C\x69\x63\x6B\x20\x4F\x4B\x2E\x3C\x2F\x6C\x69\x3E","\x3C\x6C\x69\x3E\x20\x54\x6F\x20\x63\x61\x6E\x63\x65\x6C\x20\x74\x68\x65\x20\x68\x69\x64\x69\x6E\x67\x2C\x20\x63\x6C\x69\x63\x6B\x20\x63\x61\x6E\x63\x65\x6C\x2E\x3C\x2F\x6C\x69\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x43\x61\x6E\x63\x65\x6C\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x4F\x4B\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x69\x64\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74\x28\x29\x3B\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x69\x64\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74","\x64\x69\x73\x70\x6C\x61\x79","\x6E\x6F\x6E\x65","\x68\x69\x64\x65\x73\x68\x65\x65\x74\x20","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74","\x3C\x62\x3E\x20\x54\x68\x65\x72\x65\x20\x61\x72\x65\x20\x6E\x6F\x20\x68\x69\x64\x64\x65\x6E\x20\x77\x6F\x72\x6B\x73\x68\x65\x65\x74\x73\x2E\x20\x3C\x2F\x62\x3E","\x3C\x73\x70\x61\x6E\x3E\x42\x65\x66\x6F\x72\x65\x20\x75\x6E\x68\x69\x64\x69\x6E\x67\x20\x61\x6E\x79\x20\x73\x68\x65\x65\x74\x73\x2C\x20\x79\x6F\x75\x20\x6D\x75\x73\x74\x20\x66\x69\x72\x73\x74\x20\x68\x69\x64\x65\x20\x61\x20\x73\x68\x65\x65\x74\x2E\x20\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x2F\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x4F\x6B\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x74\x64\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x30\x70\x78\x3B\x63\x75\x72\x73\x6F\x72\x3A\x64\x65\x66\x61\x75\x6C\x74\x3B\x63\x6F\x6C\x6F\x72\x3A\x23\x36\x36\x36\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B\x3C\x62\x3E\x58\x3C\x2F\x62\x3E\x26\x6E\x62\x73\x70\x3B\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x3C\x2F\x74\x61\x62\x6C\x65\x3E","\x3C\x62\x3E\x54\x68\x65\x20\x66\x6F\x6C\x6C\x6F\x77\x69\x6E\x67\x20\x73\x68\x65\x65\x74\x73\x20\x61\x72\x65\x20\x68\x69\x64\x64\x65\x6E\x2E\x3C\x2F\x62\x3E","\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x2F\x3E\x3C\x66\x6F\x72\x6D\x20\x69\x64\x3D\x22\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74\x66\x6F\x72\x6D\x22\x3E\x3C\x75\x6C\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x68\x69\x64\x64\x65\x6E\x22\x20\x6E\x61\x6D\x65\x3D\x22\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x22\x2F\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x72\x61\x64\x69\x6F\x22\x20\x76\x61\x6C\x75\x65\x3D\x22","\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x64\x6F\x63\x75\x6D\x65\x6E\x74\x2E\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64\x28\x26\x71\x75\x6F\x74\x3B\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74\x66\x6F\x72\x6D\x26\x71\x75\x6F\x74\x3B\x29\x2E\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74\x2E\x76\x61\x6C\x75\x65\x3D\x26\x71\x75\x6F\x74\x3B","\x26\x71\x75\x6F\x74\x3B\x3B\x22\x2F\x3E","\x3C\x62\x72\x2F\x3E","\x3C\x2F\x75\x6C\x3E\x3C\x2F\x66\x6F\x72\x6D\x3E\x0A\x3C\x73\x70\x61\x6E\x3E\x3C\x75\x6C\x3E","\x3C\x6C\x69\x3E\x20\x54\x6F\x20\x75\x6E\x68\x69\x64\x65\x20\x74\x68\x65\x20\x73\x65\x6C\x65\x63\x74\x65\x64\x20\x73\x68\x65\x65\x74\x2C\x20\x63\x6C\x69\x63\x6B\x20\x4F\x4B\x2E\x3C\x2F\x6C\x69\x3E","\x3C\x6C\x69\x3E\x20\x54\x6F\x20\x63\x61\x6E\x63\x65\x6C\x20\x74\x68\x65\x20\x75\x6E\x68\x69\x64\x69\x6E\x67\x2C\x20\x63\x6C\x69\x63\x6B\x20\x63\x61\x6E\x63\x65\x6C\x2E\x3C\x2F\x6C\x69\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x43\x61\x6E\x63\x65\x6C\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x4F\x4B\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74\x28\x64\x6F\x63\x75\x6D\x65\x6E\x74\x2E\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64\x28\x26\x71\x75\x6F\x74\x3B\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74\x66\x6F\x72\x6D\x26\x71\x75\x6F\x74\x3B\x29\x2E\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74\x2E\x76\x61\x6C\x75\x65\x29\x3B\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x74\x64\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x30\x70\x78\x3B\x63\x75\x72\x73\x6F\x72\x3A\x64\x65\x66\x61\x75\x6C\x74\x3B\x63\x6F\x6C\x6F\x72\x3A\x23\x36\x36\x36\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B\x58\x26\x6E\x62\x73\x70\x3B\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x3C\x2F\x74\x61\x62\x6C\x65\x3E","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x55\x6E\x68\x69\x64\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74","\x6C\x6F\x67","\x69\x6E\x6C\x69\x6E\x65","\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74\x20","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x41\x64\x64\x53\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E","\x69\x6E\x70\x75\x74","\x73\x68\x65\x65\x74","\x74\x79\x70\x65","\x62\x75\x74\x74\x6F\x6E","\x6E\x61\x6D\x65","\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x41\x63\x74\x69\x76\x61\x74\x65\x53\x68\x65\x65\x74\x28","\x27","\x29","\x6F\x6E\x63\x6C\x69\x63\x6B","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x41\x64\x64\x53\x68\x65\x65\x74","\x73\x68\x65\x65\x74\x31","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x41\x64\x64\x53\x68\x65\x65\x74\x52\x65\x6D\x6F\x74\x65","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x41\x63\x74\x69\x76\x61\x74\x65\x53\x68\x65\x65\x74","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x6C\x69\x67\x68\x74\x67\x72\x65\x65\x6E\x3B","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x48\x74\x74\x70\x52\x65\x71\x75\x65\x73\x74","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x41\x6C\x65\x72\x74\x43\x6F\x6E\x74\x65\x6E\x74\x73","\x72\x65\x61\x64\x79\x53\x74\x61\x74\x65","\x73\x74\x61\x74\x75\x73","\x72\x65\x73\x70\x6F\x6E\x73\x65\x54\x65\x78\x74","\x63\x6C\x69\x70\x62\x6F\x61\x72\x64","\x43\x6C\x69\x70\x62\x6F\x61\x72\x64","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x41\x6A\x61\x78\x43\x61\x6C\x6C","\x69\x6E\x20\x61\x6A\x61\x78","\x58\x4D\x4C\x48\x74\x74\x70\x52\x65\x71\x75\x65\x73\x74","\x41\x63\x74\x69\x76\x65\x58\x4F\x62\x6A\x65\x63\x74","\x4D\x73\x78\x6D\x6C\x32\x2E\x58\x4D\x4C\x48\x54\x54\x50","\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x58\x4D\x4C\x48\x54\x54\x50","\x47\x69\x76\x69\x6E\x67\x20\x75\x70\x20\x3A\x28\x20\x43\x61\x6E\x6E\x6F\x74\x20\x63\x72\x65\x61\x74\x65\x20\x61\x6E\x20\x58\x4D\x4C\x48\x54\x54\x50\x20\x69\x6E\x73\x74\x61\x6E\x63\x65","\x6F\x6E\x72\x65\x61\x64\x79\x73\x74\x61\x74\x65\x63\x68\x61\x6E\x67\x65","\x50\x4F\x53\x54","\x6F\x70\x65\x6E","\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64","\x73\x65\x74\x52\x65\x71\x75\x65\x73\x74\x48\x65\x61\x64\x65\x72","\x73\x65\x6E\x64","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x53\x61\x76\x65\x53\x68\x65\x65\x74","\x6E\x75\x6D\x73\x68\x65\x65\x74\x73","\x63\x75\x72\x72\x65\x6E\x74\x69\x64","\x63\x75\x72\x72\x65\x6E\x74\x6E\x61\x6D\x65","\x73\x68\x65\x65\x74\x41\x72\x72","\x68\x69\x64\x64\x65\x6E","\x31","\x45\x64\x69\x74\x61\x62\x6C\x65\x43\x65\x6C\x6C\x73","\x61\x6C\x6C\x6F\x77","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x49\x6E\x73\x65\x72\x74\x57\x6F\x72\x6B\x62\x6F\x6F\x6B","\x70\x61\x72\x73\x65","\x73\x61\x76\x65\x73\x74\x72","\x65\x6E\x64","\x73\x75\x62\x73\x74\x72\x69\x6E\x67","\x65\x78\x69\x73\x74\x73","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x4C\x6F\x61\x64","\x73\x65\x74\x54\x69\x6D\x65\x6F\x75\x74","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x52\x65\x6E\x61\x6D\x65\x53\x68\x65\x65\x74","\x3C\x73\x70\x61\x6E\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x3E","\x52\x65\x6E\x61\x6D\x65\x2D","\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x3E","\x50\x6C\x65\x61\x73\x65\x20\x65\x6E\x73\x75\x72\x65\x20\x74\x68\x61\x74\x20\x79\x6F\x75\x20\x44\x4F\x20\x4E\x4F\x54\x20\x68\x61\x76\x65\x20\x41\x4E\x59\x20\x73\x70\x61\x63\x65\x73\x20\x69\x6E\x20\x74\x68\x65\x20\x73\x68\x65\x65\x74\x20\x6E\x61\x6D\x65\x2E","\x3C\x2F\x73\x70\x61\x6E\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x20\x69\x64\x3D\x22\x6E\x65\x77\x53\x68\x65\x65\x74\x4E\x61\x6D\x65\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x77\x69\x64\x74\x68\x3A\x33\x38\x30\x70\x78\x3B\x22\x20\x76\x61\x6C\x75\x65\x3D\x22","\x22\x3E\x3C\x62\x72\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x53\x75\x62\x6D\x69\x74\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x52\x65\x6E\x61\x6D\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x62\x75\x74\x74\x6F\x6E\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x43\x61\x6E\x63\x65\x6C\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x65\x72\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x52\x65\x6E\x61\x6D\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x3C\x2F\x64\x69\x76\x3E","\x3C\x74\x64\x20\x73\x74\x79\x6C\x65\x3D\x22\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x30\x70\x78\x3B\x63\x75\x72\x73\x6F\x72\x3A\x64\x65\x66\x61\x75\x6C\x74\x3B\x63\x6F\x6C\x6F\x72\x3A\x23\x36\x36\x36\x3B\x22\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2E\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x52\x65\x6E\x61\x6D\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65\x28\x29\x3B\x22\x3E\x26\x6E\x62\x73\x70\x3B\x58\x26\x6E\x62\x73\x70\x3B\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x3C\x2F\x74\x61\x62\x6C\x65\x3E","\x6E\x65\x77\x53\x68\x65\x65\x74\x4E\x61\x6D\x65","\x66\x6F\x63\x75\x73","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x52\x65\x6E\x61\x6D\x65\x53\x68\x65\x65\x74\x48\x69\x64\x65","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x52\x65\x6E\x61\x6D\x65\x53\x68\x65\x65\x74\x53\x75\x62\x6D\x69\x74","\x6C\x65\x6E\x67\x74\x68","\x20","\x69\x6E\x64\x65\x78\x4F\x66","\x41\x20\x73\x70\x61\x63\x65\x20\x77\x61\x73\x20\x66\x6F\x75\x6E\x64\x20\x69\x6E\x20\x74\x68\x65\x20\x6E\x65\x77\x20\x6E\x61\x6D\x65\x2E\x20\x50\x6C\x65\x61\x73\x65\x20\x65\x6E\x73\x75\x72\x65\x20\x74\x68\x61\x74\x20\x74\x68\x65\x20\x6E\x65\x77\x20\x6E\x61\x6D\x65\x20\x68\x61\x73\x20\x6E\x6F\x20\x73\x61\x70\x63\x65\x73","\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65","\x73\x68\x65\x65\x74\x6E\x61\x6D\x65","\x20\x61\x6C\x72\x65\x61\x64\x79\x20\x65\x78\x69\x73\x74\x73","\x72\x65\x6E\x73\x68\x65\x65\x74\x20","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x52\x65\x6E\x61\x6D\x65\x53\x68\x65\x65\x74\x52\x65\x6D\x6F\x74\x65","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x43\x72\x65\x61\x74\x65\x4E\x65\x77\x42\x6F\x6F\x6B","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x4E\x65\x77\x42\x6F\x6F\x6B","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x4D\x6F\x76\x65","\x70\x72\x65\x76\x69\x6F\x75\x73\x53\x69\x62\x6C\x69\x6E\x67","\x43\x61\x6E\x6E\x6F\x74\x20\x6D\x6F\x76\x65\x20\x6C\x65\x66\x74\x6D\x6F\x73\x74\x20\x53\x68\x65\x65\x74\x20\x66\x75\x72\x74\x68\x65\x72\x20\x74\x6F\x20\x74\x68\x65\x20\x6C\x65\x66\x74","\x6E\x65\x78\x74\x53\x69\x62\x6C\x69\x6E\x67","\x43\x61\x6E\x6E\x6F\x74\x20\x6D\x6F\x76\x65\x20\x72\x69\x67\x68\x74\x6D\x6F\x73\x74\x20\x53\x68\x65\x65\x74\x20\x66\x75\x72\x74\x68\x65\x72\x20\x74\x6F\x20\x74\x68\x65\x20\x72\x69\x67\x68\x74","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x4D\x6F\x76\x65\x4C\x65\x66\x74","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x4D\x6F\x76\x65\x52\x69\x67\x68\x74","\x72\x69\x67\x68\x74","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x43\x6F\x70\x79\x53\x68\x65\x65\x74","\x63\x6F\x70\x69\x65\x64\x20\x73\x68\x65\x65\x74\x3A","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x43\x6F\x6E\x74\x72\x6F\x6C\x50\x61\x73\x74\x65\x53\x68\x65\x65\x74","\x63\x6C\x69\x70\x73\x68\x65\x65\x74","\x53\x68\x65\x65\x74\x42\x61\x72","\x62\x61\x73\x65\x44\x69\x76","\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2D\x73\x68\x65\x65\x74\x62\x61\x72","\x70\x72\x65\x62\x75\x74\x74\x6F\x6E\x73\x44\x69\x76","\x63\x73\x73\x54\x65\x78\x74","\x64\x69\x73\x70\x6C\x61\x79\x3A\x69\x6E\x6C\x69\x6E\x65\x3B","\x26\x6E\x62\x73\x70\x26\x6E\x62\x73\x70\x26\x6E\x62\x73\x70\x26\x6E\x62\x73\x70\x26\x6E\x62\x73\x70\x26\x6E\x62\x73\x70\x26\x6E\x62\x73\x70\x26\x6E\x62\x73\x70","\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2D\x73\x68\x65\x65\x74\x62\x61\x72\x2D\x70\x72\x65\x62\x75\x74\x74\x6F\x6E\x73","\x62\x75\x74\x74\x6F\x6E\x73\x44\x69\x76","\x62\x75\x74\x74\x6F\x6E\x41\x63\x74\x69\x6F\x6E\x73\x44\x69\x76","\x53\x6F\x63\x69\x61\x6C\x43\x61\x6C\x63\x2D\x73\x68\x65\x65\x74\x62\x61\x72\x2D\x62\x75\x74\x74\x6F\x6E\x61\x63\x74\x69\x6F\x6E\x73","\x73\x62\x73\x62\x61\x2D\x61\x64\x64","\x61\x64\x64\x2D\x32\x2E\x70\x6E\x67","\x53\x68\x65\x65\x74\x42\x61\x72\x53\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E","\x65\x6C\x65","\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x73\x6D\x61\x6C\x6C\x3B\x64\x69\x73\x70\x6C\x61\x79\x3A\x69\x6E\x6C\x69\x6E\x65\x3B\x70\x61\x64\x64\x69\x6E\x67\x3A\x35\x70\x78\x20\x35\x70\x78\x20\x32\x70\x78\x20\x35\x70\x78\x3B\x62\x6F\x72\x64\x65\x72\x3A\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x23\x30\x30\x30\x3B","\x69\x6D\x67","\x2D\x69\x6D\x67","\x73\x72\x63","\x64\x65\x66\x61\x75\x6C\x74\x49\x6D\x61\x67\x65\x50\x72\x65\x66\x69\x78","\x43\x6F\x6E\x73\x74\x61\x6E\x74\x73","\x6D\x65\x6E\x75\x2D\x64\x72\x6F\x70\x64\x6F\x77\x6E\x2E\x70\x6E\x67","\x70\x61\x64\x64\x69\x6E\x67\x3A\x30\x70\x78\x20\x32\x70\x78\x3B\x77\x69\x64\x74\x68\x3A\x31\x36\x70\x78\x3B\x68\x65\x69\x67\x68\x74\x3A\x31\x36\x70\x78\x3B\x76\x65\x72\x74\x69\x63\x61\x6C\x2D\x61\x6C\x69\x67\x6E\x3A\x6D\x69\x64\x64\x6C\x65\x3B","\x77\x69\x64\x74\x68\x3A\x31\x36\x70\x78\x3B\x68\x65\x69\x67\x68\x74\x3A\x31\x36\x70\x78\x3B\x76\x65\x72\x74\x69\x63\x61\x6C\x2D\x61\x6C\x69\x67\x6E\x3A\x6D\x69\x64\x64\x6C\x65\x3B","\x64\x69\x73\x70\x6C\x61\x79\x3A\x69\x6E\x6C\x69\x6E\x65\x3B\x70\x61\x64\x64\x69\x6E\x67\x3A\x35\x70\x78\x20\x35\x70\x78\x20\x32\x70\x78\x20\x35\x70\x78\x3B","\x53\x68\x65\x65\x74\x42\x61\x72\x42\x75\x74\x74\x6F\x6E\x41\x63\x74\x69\x76\x61\x74\x65","\x69\x73\x61\x63\x74\x69\x76\x65","\x23\x43\x43\x43","\x73\x62\x73\x62\x2D\x6D\x65\x6E\x75","\x53\x68\x65\x65\x74\x42\x61\x72\x42\x75\x74\x74\x6F\x6E\x53\x65\x74\x4E\x61\x6D\x65","\x53\x68\x65\x65\x74\x42\x61\x72\x53\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E\x50\x72\x65\x73\x73","\x63\x6C\x69\x63\x6B\x65\x64\x73\x68\x65\x65\x74\x69\x64","\x53\x68\x65\x65\x74\x42\x61\x72\x53\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E\x4D\x65\x6E\x75\x49\x74\x65\x6D","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x70\x61\x64\x64\x69\x6E\x67\x3A\x33\x70\x78\x20\x34\x70\x78\x3B\x77\x69\x64\x74\x68\x3A\x31\x30\x30\x70\x78\x3B\x68\x65\x69\x67\x68\x74\x3A\x32\x30\x70\x78\x3B\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x23\x46\x46\x46\x3B","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x43\x6F\x6C\x6F\x72\x3A\x23\x46\x46\x46\x3B","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x43\x6F\x6C\x6F\x72\x3A\x23\x43\x43\x43\x3B","\x4D\x6F\x75\x73\x65\x44\x6F\x77\x6E","\x53\x68\x65\x65\x74\x42\x61\x72\x4D\x65\x6E\x75\x49\x74\x65\x6D\x50\x72\x65\x73\x73","\x73\x62\x73\x62\x5F\x64\x65\x6C\x65\x74\x65\x73\x68\x65\x65\x74","\x73\x62\x73\x62\x5F\x68\x69\x64\x65\x73\x68\x65\x65\x74","\x73\x62\x73\x62\x5F\x75\x6E\x68\x69\x64\x65\x73\x68\x65\x65\x74","\x73\x62\x73\x62\x5F\x63\x6F\x70\x79\x73\x68\x65\x65\x74","\x73\x62\x73\x62\x5F\x6D\x6F\x76\x65\x6C\x65\x66\x74","\x73\x62\x73\x62\x5F\x6D\x6F\x76\x65\x72\x69\x67\x68\x74","\x73\x62\x73\x62\x5F\x70\x61\x73\x74\x65\x73\x68\x65\x65\x74","\x73\x62\x73\x62\x5F\x72\x65\x6E\x61\x6D\x65\x73\x68\x65\x65\x74","\x73\x62\x73\x62\x5F\x63\x6C\x6F\x73\x65\x6D\x65\x6E\x75","\x53\x68\x65\x65\x74\x42\x61\x72\x53\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E\x4D\x65\x6E\x75","\x62\x6F\x72\x64\x65\x72\x3A\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x23\x30\x30\x30\x3B\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3A\x61\x62\x73\x6F\x6C\x75\x74\x65\x3B\x74\x6F\x70\x3A\x32\x30\x30\x70\x78\x3B\x6C\x65\x66\x74\x3A\x30\x70\x78\x3B\x77\x69\x64\x74\x68\x3D\x31\x30\x30\x70\x78\x3B\x7A\x2D\x69\x6E\x64\x65\x78\x3A\x31\x32\x30","\x20\x44\x65\x6C\x65\x74\x65\x20\x53\x68\x65\x65\x74","\x20\x48\x69\x64\x65\x20\x53\x68\x65\x65\x74\x20","\x20\x55\x6E\x68\x69\x64\x65\x20\x53\x68\x65\x65\x74\x20","\x20\x52\x65\x6E\x61\x6D\x65\x20\x53\x68\x65\x65\x74\x20","\x20\x4D\x6F\x76\x65\x20\x4C\x65\x66\x74\x20","\x20\x4D\x6F\x76\x65\x20\x52\x69\x67\x68\x74\x20","\x20\x43\x6F\x70\x79\x20\x53\x68\x65\x65\x74\x20","\x20\x50\x61\x73\x74\x65\x20\x53\x68\x65\x65\x74\x20","\x20\x43\x61\x6E\x63\x65\x6C","\x74\x6F\x70\x6C\x65\x76\x65\x6C","\x53\x68\x65\x65\x74\x42\x61\x72\x53\x68\x65\x65\x74\x42\x75\x74\x74\x6F\x6E\x4D\x65\x6E\x75\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x74\x65\x5F\x6C\x65\x73\x73\x62\x75\x74\x74\x6F\x6E\x68","\x73\x6C\x69\x63\x65","\x6F\x66\x66\x73\x65\x74\x4C\x65\x66\x74","\x53\x63\x72\x69\x70\x74\x49\x6E\x66\x6F","\x53\x63\x72\x69\x70\x74\x43\x68\x65\x63\x6B","\x3C\x21\x2D\x2D\x73\x63\x72\x69\x70\x74","\x73\x63\x72\x69\x70\x74\x2D\x2D\x3E","\x73\x63\x72\x69\x70\x74\x73","\x68\x61\x6E\x64\x6C\x65","\x45\x76\x61\x6C\x55\x73\x65\x72\x53\x63\x72\x69\x70\x74","\x68\x65\x61\x64","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x73\x42\x79\x54\x61\x67\x4E\x61\x6D\x65","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x73\x63\x72\x69\x70\x74","\x74\x65\x78\x74\x2F\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74","\x63\x72\x65\x61\x74\x65\x54\x65\x78\x74\x4E\x6F\x64\x65","\x74\x65\x78\x74","\x69\x6E\x73\x65\x72\x74\x42\x65\x66\x6F\x72\x65","\x45\x76\x61\x6C\x55\x73\x65\x72\x53\x63\x72\x69\x70\x74\x73","\x43\x61\x6C\x6C\x4F\x75\x74\x4F\x6E\x52\x65\x6E\x64\x65\x72\x43\x65\x6C\x6C","\x63\x65\x6C\x6C\x73","\x76\x61\x6C\x75\x65\x74\x79\x70\x65","\x61\x74\x74\x72\x69\x62\x73","\x63\x68\x61\x72\x41\x74","\x74","\x74\x65\x78\x74\x76\x61\x6C\x75\x65\x66\x6F\x72\x6D\x61\x74","\x76\x61\x6C\x75\x65\x66\x6F\x72\x6D\x61\x74\x73","\x64\x65\x66\x61\x75\x6C\x74\x74\x65\x78\x74\x76\x61\x6C\x75\x65\x66\x6F\x72\x6D\x61\x74","\x74\x65\x78\x74\x2D\x68\x74\x6D\x6C","\x73\x68\x65\x65\x74\x69\x64","\x47\x65\x74\x43\x65\x6C\x6C\x44\x61\x74\x61\x56\x61\x6C\x75\x65","\x21","\x64\x61\x74\x61\x76\x61\x6C\x75\x65","\x47\x65\x74\x43\x65\x6C\x6C\x44\x61\x74\x61\x41\x72\x72\x61\x79","\x2C","\x73\x70\x6C\x69\x74","\x70\x75\x73\x68","\x55\x73\x65\x72\x53\x63\x72\x69\x70\x74\x44\x61\x74\x61","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x52\x65\x63\x61\x6C\x63\x75\x6C\x61\x74\x65\x49\x6E\x66\x6F","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x52\x65\x63\x61\x6C\x63\x75\x6C\x61\x74\x65\x41\x6C\x6C","\x63\x75\x72\x72\x65\x6E\x74","\x63\x61\x6C\x63\x6F\x72\x64\x65\x72","\x73\x68\x65\x65\x74\x73","\x57\x6F\x72\x6B\x42\x6F\x6F\x6B\x52\x65\x63\x61\x6C\x63\x75\x6C\x61\x74\x65\x53\x74\x65\x70","\x70\x61\x73\x73","\x53\x70\x69\x6E\x6E\x65\x72\x57\x61\x69\x74\x43\x72\x65\x61\x74\x65","\x77\x61\x69\x74\x6C\x6F\x61\x64\x69\x6E\x67\x73\x70\x69\x6E\x6E\x65\x72","\x35\x30\x70\x78","\x3C\x69\x6D\x67\x20\x73\x72\x63\x3D\x22\x73\x74\x61\x74\x69\x63\x2F\x69\x6D\x61\x67\x65\x73\x2F\x73\x70\x69\x6E\x6E\x65\x72\x2E\x67\x69\x66\x22\x20\x61\x6C\x74\x3D\x22\x4C\x6F\x61\x64\x69\x6E\x67\x2E\x2E\x2E\x22\x20\x2F\x3E","\x53\x70\x69\x6E\x6E\x65\x72\x57\x61\x69\x74\x48\x69\x64\x65","\x49\x73\x43\x6F\x6F\x72\x64\x45\x64\x69\x74\x61\x62\x6C\x65","\x49\x73\x43\x65\x6C\x6C\x45\x64\x69\x74\x61\x62\x6C\x65","\x63\x75\x72\x72\x65\x6E\x74\x73\x68\x65\x65\x74","\x77\x6F\x72\x6B\x69\x6E\x67\x76\x61\x6C\x75\x65\x73","\x63\x6F\x6F\x72\x64","\x65\x63\x65\x6C\x6C","\x49\x73\x53\x63\x72\x6F\x6C\x6C\x50\x6F\x73\x73\x69\x62\x6C\x65"];var SocialCalc;if(!SocialCalc){alert(_0xfa49[0]);SocialCalc={};} ;SocialCalc[_0xfa49[1]]=null;SocialCalc[_0xfa49[2]]=_0xfa49[3];SocialCalc[_0xfa49[4]]=function (_0xc8b2x2,_0xc8b2x3,_0xc8b2x4){this[_0xfa49[5]]=_0xc8b2x2;this[_0xfa49[6]]=_0xc8b2x3;this[_0xfa49[7]]=_0xc8b2x4;this[_0xfa49[8]]={};this[_0xfa49[9]]=0;this[_0xfa49[10]]=0;this[_0xfa49[11]]=null;this[_0xfa49[12]]=_0xfa49[13];this[_0xfa49[14]]=_0xfa49[15];this[_0xfa49[16]]=_0xfa49[17];this[_0xfa49[18]]=_0xfa49[19];this[_0xfa49[20]]=_0xfa49[21];SocialCalc[_0xfa49[1]]=this;this[_0xfa49[22]]= new SocialCalc.SheetBar();} ;SocialCalc[_0xfa49[4]][_0xfa49[24]][_0xfa49[23]]=function (){return SocialCalc.GetCurrentWorkBookControl();} ;SocialCalc[_0xfa49[4]][_0xfa49[24]][_0xfa49[25]]=function (){return SocialCalc.InitializeWorkBookControl(this);} ;SocialCalc[_0xfa49[4]][_0xfa49[24]][_0xfa49[26]]=function (_0xc8b2x5,_0xc8b2x6){return SocialCalc.ExecuteWorkBookControlCommand(this,_0xc8b2x5,_0xc8b2x6);} ;SocialCalc[_0xfa49[26]]=function (_0xc8b2x7,_0xc8b2x5,_0xc8b2x6){if(_0xc8b2x5[_0xfa49[27]]==_0xfa49[28]){_0xc8b2x7[_0xfa49[5]].WorkbookScheduleCommand(_0xc8b2x5,_0xc8b2x6);return ;} ;if(_0xc8b2x5[_0xfa49[27]]!=_0xfa49[29]){return ;} ;var _0xc8b2x8= new SocialCalc.Parse(_0xc8b2x5[_0xfa49[30]]);var _0xc8b2x9=_0xc8b2x8.NextToken();switch(_0xc8b2x9){case _0xfa49[31]:SocialCalc.WorkBookControlAddSheetRemote(null);break ;;case _0xfa49[33]:var _0xc8b2xa=_0xc8b2x5[_0xfa49[32]];SocialCalc.WorkBookControlAddSheetRemote(_0xc8b2xa);break ;;case _0xfa49[34]:var _0xc8b2xb=_0xc8b2x8.NextToken();SocialCalc.WorkBookControlDelSheetRemote(_0xc8b2xb);break ;;case _0xfa49[35]:var _0xc8b2xb=_0xc8b2x8.NextToken();var _0xc8b2xc=_0xc8b2x8.NextToken();var _0xc8b2xd=_0xc8b2x8.NextToken();SocialCalc.WorkBookControlRenameSheetRemote(_0xc8b2xb,_0xc8b2xc,_0xc8b2xd);break ;;case _0xfa49[36]:var _0xc8b2xb=_0xc8b2x8.NextToken();SocialCalc.WorkBookControlActivateSheet(_0xc8b2xb);break ;;case _0xfa49[37]:var _0xc8b2xb=_0xc8b2x8.NextToken();break ;;case _0xfa49[38]:var _0xc8b2xb=_0xc8b2x8.NextToken();break ;;} ;} ;SocialCalc[_0xfa49[23]]=function (){return SocialCalc[_0xfa49[1]];} ;SocialCalc[_0xfa49[25]]=function (_0xc8b2x7){var _0xc8b2xe=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2xe[_0xfa49[40]]=_0xc8b2x7[_0xfa49[20]];var _0xc8b2xf=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[6]]);_0xc8b2xf[_0xfa49[42]](_0xc8b2xe);SocialCalc.WorkBookControlAddSheet(false);} ;SocialCalc[_0xfa49[43]]=function (_0xc8b2xb){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2xb==_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]){SocialCalc.WorkBookControlDelSheet();return ;} ;var _0xc8b2xf=document[_0xfa49[41]](_0xfa49[45]);var _0xc8b2x10=document[_0xfa49[41]](_0xc8b2xb);var _0xc8b2x11=_0xc8b2x10[_0xfa49[44]];var _0xc8b2x12=_0xc8b2x10[_0xfa49[46]];delete _0xc8b2x7[_0xfa49[8]][_0xc8b2x11];_0xc8b2xf[_0xfa49[47]](_0xc8b2x10);var _0xc8b2x13=document[_0xfa49[41]](_0xfa49[48]);var _0xc8b2x14=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x11);_0xc8b2x13[_0xfa49[47]](_0xc8b2x14);_0xc8b2x7[_0xfa49[5]].DeleteWorkBookSheet(_0xc8b2x11,_0xc8b2x12);_0xc8b2x7[_0xfa49[10]]=_0xc8b2x7[_0xfa49[10]]-1;} ;SocialCalc[_0xfa49[50]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;if(_0xc8b2x7[_0xfa49[10]]==1){var _0xc8b2x15=_0xfa49[55]+_0xfa49[56]+_0xfa49[57]+_0xfa49[58];_0xc8b2x15+=_0xfa49[59];_0xc8b2x15+=_0xfa49[60]+_0xfa49[61];var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xc8b2x7[_0xfa49[14]];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=100;_0xc8b2x16[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];_0xc8b2x16[_0xfa49[63]][_0xfa49[73]]=_0xfa49[74];_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[75];_0xc8b2x16[_0xfa49[40]]=_0xfa49[76]+_0xfa49[77]+_0xfa49[78]+_0xfa49[79]+_0xfa49[80]+_0xfa49[81]+_0xc8b2x15+_0xfa49[82];SocialCalc.DragRegister(_0xc8b2x16[_0xfa49[83]][_0xfa49[83]][_0xfa49[83]][_0xfa49[83]],true,true,{MouseDown:SocialCalc[_0xfa49[84]],MouseMove:SocialCalc[_0xfa49[85]],MouseUp:SocialCalc[_0xfa49[85]],Disabled:null,positionobj:_0xc8b2x16});_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);return ;} ;var _0xc8b2xe=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[14]]);if(_0xc8b2xe){return ;} ;var _0xc8b2x18=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];var _0xc8b2x15=_0xfa49[55]+_0xfa49[56]+_0xfa49[87]+_0xfa49[88];_0xc8b2x15+=_0xfa49[89];_0xc8b2x15+=_0xfa49[90];_0xc8b2x15+=_0xfa49[91];_0xc8b2x15+=_0xfa49[92];_0xc8b2x15+=_0xfa49[60]+_0xfa49[93]+_0xfa49[94];var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xc8b2x7[_0xfa49[14]];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=100;_0xc8b2x16[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];_0xc8b2x16[_0xfa49[63]][_0xfa49[73]]=_0xfa49[74];_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[75];_0xc8b2x16[_0xfa49[40]]=_0xfa49[76]+_0xfa49[77]+_0xfa49[78]+_0xfa49[79]+_0xfa49[80]+_0xfa49[81]+_0xc8b2x15+_0xfa49[82];SocialCalc.DragRegister(_0xc8b2x16[_0xfa49[83]][_0xfa49[83]][_0xfa49[83]][_0xfa49[83]],true,true,{MouseDown:SocialCalc[_0xfa49[84]],MouseMove:SocialCalc[_0xfa49[85]],MouseUp:SocialCalc[_0xfa49[85]],Disabled:null,positionobj:_0xc8b2x16});_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);} ;SocialCalc[_0xfa49[95]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2x19=_0xc8b2x7[_0xfa49[5]][_0xfa49[53]];var _0xc8b2x1a=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[14]]);_0xc8b2x1a[_0xfa49[40]]=_0xfa49[3];SocialCalc.DragUnregister(_0xc8b2x1a);SocialCalc.KeyboardFocus();if(_0xc8b2x1a[_0xfa49[96]]){_0xc8b2x1a[_0xfa49[96]][_0xfa49[47]](_0xc8b2x1a);} ;} ;SocialCalc[_0xfa49[97]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();SocialCalc.WorkBookControlDeleteSheetHide();var _0xc8b2xf=document[_0xfa49[41]](_0xfa49[45]);var _0xc8b2x1b=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]);var _0xc8b2x1c=_0xc8b2x1b[_0xfa49[44]];var _0xc8b2x1d=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];delete _0xc8b2x7[_0xfa49[8]][_0xc8b2x1c];_0xc8b2xf[_0xfa49[47]](_0xc8b2x1b);var _0xc8b2x13=document[_0xfa49[41]](_0xfa49[48]);var _0xc8b2x14=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1b[_0xfa49[44]]);_0xc8b2x13[_0xfa49[47]](_0xc8b2x14);_0xc8b2x7[_0xfa49[11]]=null;_0xc8b2x7[_0xfa49[5]].DeleteWorkBookSheet(_0xc8b2x1c,_0xc8b2x1d);_0xc8b2x7[_0xfa49[10]]=_0xc8b2x7[_0xfa49[10]]-1;var _0xc8b2x1e=_0xfa49[98]+_0xc8b2x1c;SocialCalc[_0xfa49[102]][_0xfa49[101]](_0xfa49[99],{cmdtype:_0xfa49[29],id:_0xfa49[100],cmdstr:_0xc8b2x1e});for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){if(_0xc8b2x1f!=null){_0xc8b2x7[_0xfa49[11]]=_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f];_0xc8b2x7[_0xfa49[11]][_0xfa49[104]](_0xfa49[63],_0xfa49[103]);SocialCalc.SheetBarButtonActivate(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],true);break ;} ;} ;if(_0xc8b2x7[_0xfa49[11]]!=null){_0xc8b2x7[_0xfa49[5]].ActivateWorkBookSheet(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],null);} ;} ;SocialCalc[_0xfa49[105]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;if(_0xc8b2x7[_0xfa49[10]]==1){var _0xc8b2x15=_0xfa49[55]+_0xfa49[56]+_0xfa49[57]+_0xfa49[58];_0xc8b2x15+=_0xfa49[106];_0xc8b2x15+=_0xfa49[60]+_0xfa49[107];var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xc8b2x7[_0xfa49[16]];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=100;_0xc8b2x16[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];_0xc8b2x16[_0xfa49[63]][_0xfa49[73]]=_0xfa49[74];_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[75];_0xc8b2x16[_0xfa49[40]]=_0xfa49[76]+_0xfa49[77]+_0xfa49[78]+_0xfa49[79]+_0xfa49[108]+_0xfa49[81]+_0xc8b2x15+_0xfa49[82];SocialCalc.DragRegister(_0xc8b2x16[_0xfa49[83]][_0xfa49[83]][_0xfa49[83]][_0xfa49[83]],true,true,{MouseDown:SocialCalc[_0xfa49[84]],MouseMove:SocialCalc[_0xfa49[85]],MouseUp:SocialCalc[_0xfa49[85]],Disabled:null,positionobj:_0xc8b2x16});_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);return ;} ;var _0xc8b2xe=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[16]]);if(_0xc8b2xe){return ;} ;var _0xc8b2x18=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];var _0xc8b2x15=_0xfa49[55]+_0xfa49[56]+_0xfa49[109]+_0xfa49[88];_0xc8b2x15+=_0xfa49[89];_0xc8b2x15+=_0xfa49[110];_0xc8b2x15+=_0xfa49[111];_0xc8b2x15+=_0xfa49[92];_0xc8b2x15+=_0xfa49[60]+_0xfa49[112]+_0xfa49[113];var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xc8b2x7[_0xfa49[16]];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=100;_0xc8b2x16[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];_0xc8b2x16[_0xfa49[63]][_0xfa49[73]]=_0xfa49[74];_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[75];_0xc8b2x16[_0xfa49[40]]=_0xfa49[76]+_0xfa49[77]+_0xfa49[78]+_0xfa49[79]+_0xfa49[108]+_0xfa49[81]+_0xc8b2x15+_0xfa49[82];SocialCalc.DragRegister(_0xc8b2x16[_0xfa49[83]][_0xfa49[83]][_0xfa49[83]][_0xfa49[83]],true,true,{MouseDown:SocialCalc[_0xfa49[84]],MouseMove:SocialCalc[_0xfa49[85]],MouseUp:SocialCalc[_0xfa49[85]],Disabled:null,positionobj:_0xc8b2x16});_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);} ;SocialCalc[_0xfa49[114]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2x19=_0xc8b2x7[_0xfa49[5]][_0xfa49[53]];var _0xc8b2x1a=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[16]]);_0xc8b2x1a[_0xfa49[40]]=_0xfa49[3];SocialCalc.DragUnregister(_0xc8b2x1a);SocialCalc.KeyboardFocus();if(_0xc8b2x1a[_0xfa49[96]]){_0xc8b2x1a[_0xfa49[96]][_0xfa49[47]](_0xc8b2x1a);} ;} ;SocialCalc[_0xfa49[115]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();SocialCalc.WorkBookControlHideSheetHide();var _0xc8b2xf=document[_0xfa49[41]](_0xfa49[45]);var _0xc8b2x1b=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]);var _0xc8b2x1c=_0xc8b2x1b[_0xfa49[44]];var _0xc8b2x1d=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];var _0xc8b2x13=document[_0xfa49[41]](_0xfa49[48]);var _0xc8b2x14=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1b[_0xfa49[44]]);SocialCalc.SheetBarButtonActivate(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],false);_0xc8b2x14[_0xfa49[63]][_0xfa49[116]]=_0xfa49[117];_0xc8b2x7[_0xfa49[11]]=null;_0xc8b2x7[_0xfa49[10]]=_0xc8b2x7[_0xfa49[10]]-1;var _0xc8b2x1e=_0xfa49[118]+_0xc8b2x1c;SocialCalc[_0xfa49[102]][_0xfa49[101]](_0xfa49[99],{cmdtype:_0xfa49[29],id:_0xfa49[100],cmdstr:_0xc8b2x1e});for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){if(_0xc8b2x1f!=null&&document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1f)[_0xfa49[63]][_0xfa49[116]]!=_0xfa49[117]){_0xc8b2x7[_0xfa49[11]]=_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f];break ;} ;} ;if(_0xc8b2x7[_0xfa49[11]]!=null){_0xc8b2x7[_0xfa49[11]][_0xfa49[104]](_0xfa49[63],_0xfa49[103]);SocialCalc.SheetBarButtonActivate(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],true);_0xc8b2x7[_0xfa49[5]].ActivateWorkBookSheet(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],null);} ;} ;SocialCalc[_0xfa49[119]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;var _0xc8b2x20=0;for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){if(document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1f)[_0xfa49[63]][_0xfa49[116]]==_0xfa49[117]){_0xc8b2x20++;} ;} ;if(_0xc8b2x20==0){var _0xc8b2x15=_0xfa49[55]+_0xfa49[56]+_0xfa49[120]+_0xfa49[58];_0xc8b2x15+=_0xfa49[121];_0xc8b2x15+=_0xfa49[60]+_0xfa49[122];var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xc8b2x7[_0xfa49[18]];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=100;_0xc8b2x16[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];_0xc8b2x16[_0xfa49[63]][_0xfa49[73]]=_0xfa49[74];_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[75];_0xc8b2x16[_0xfa49[40]]=_0xfa49[76]+_0xfa49[77]+_0xfa49[78]+_0xfa49[79]+_0xfa49[123]+_0xfa49[81]+_0xc8b2x15+_0xfa49[82];SocialCalc.DragRegister(_0xc8b2x16[_0xfa49[83]][_0xfa49[83]][_0xfa49[83]][_0xfa49[83]],true,true,{MouseDown:SocialCalc[_0xfa49[84]],MouseMove:SocialCalc[_0xfa49[85]],MouseUp:SocialCalc[_0xfa49[85]],Disabled:null,positionobj:_0xc8b2x16});_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);return ;} ;var _0xc8b2xe=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[18]]);if(_0xc8b2xe){return ;} ;var _0xc8b2x18=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];var _0xc8b2x15=_0xfa49[55]+_0xfa49[56]+_0xfa49[124]+_0xfa49[125]+_0xfa49[126];for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){if(document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1f)[_0xfa49[63]][_0xfa49[116]]==_0xfa49[117]){_0xc8b2x15+=_0xfa49[127]+_0xc8b2x1f+_0xfa49[128]+_0xc8b2x1f+_0xfa49[129]+_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f][_0xfa49[46]]+_0xfa49[130];} ;} ;_0xc8b2x15+=_0xfa49[131];_0xc8b2x15+=_0xfa49[132];_0xc8b2x15+=_0xfa49[133];_0xc8b2x15+=_0xfa49[92];_0xc8b2x15+=_0xfa49[60]+_0xfa49[134]+_0xfa49[135];var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xc8b2x7[_0xfa49[18]];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=100;_0xc8b2x16[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];_0xc8b2x16[_0xfa49[63]][_0xfa49[73]]=_0xfa49[74];_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[75];_0xc8b2x16[_0xfa49[40]]=_0xfa49[76]+_0xfa49[77]+_0xfa49[78]+_0xfa49[79]+_0xfa49[136]+_0xfa49[81]+_0xc8b2x15+_0xfa49[82];SocialCalc.DragRegister(_0xc8b2x16[_0xfa49[83]][_0xfa49[83]][_0xfa49[83]][_0xfa49[83]],true,true,{MouseDown:SocialCalc[_0xfa49[84]],MouseMove:SocialCalc[_0xfa49[85]],MouseUp:SocialCalc[_0xfa49[85]],Disabled:null,positionobj:_0xc8b2x16});_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);} ;SocialCalc[_0xfa49[137]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2x19=_0xc8b2x7[_0xfa49[5]][_0xfa49[53]];var _0xc8b2x1a=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[18]]);_0xc8b2x1a[_0xfa49[40]]=_0xfa49[3];SocialCalc.DragUnregister(_0xc8b2x1a);SocialCalc.KeyboardFocus();if(_0xc8b2x1a[_0xfa49[96]]){_0xc8b2x1a[_0xfa49[96]][_0xfa49[47]](_0xc8b2x1a);} ;} ;SocialCalc[_0xfa49[138]]=function (_0xc8b2x1c){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();SocialCalc.WorkBookControlUnhideSheetHide();var _0xc8b2x1b=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]);var _0xc8b2x21=_0xc8b2x1b[_0xfa49[44]];var _0xc8b2x1d=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];_0xc8b2x7[_0xfa49[11]][_0xfa49[104]](_0xfa49[63],_0xfa49[3]);var _0xc8b2x22=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];console[_0xfa49[139]](_0xc8b2x22);SocialCalc.SheetBarButtonActivate(_0xc8b2x22,false);var _0xc8b2x14=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1c);_0xc8b2x14[_0xfa49[63]][_0xfa49[116]]=_0xfa49[140];_0xc8b2x7[_0xfa49[11]]=null;_0xc8b2x7[_0xfa49[10]]=_0xc8b2x7[_0xfa49[10]]+1;var _0xc8b2x1e=_0xfa49[141]+_0xc8b2x1c;SocialCalc[_0xfa49[102]][_0xfa49[101]](_0xfa49[99],{cmdtype:_0xfa49[29],id:_0xfa49[100],cmdstr:_0xc8b2x1e});for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){if(_0xc8b2x1f!=null&&document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1f)[_0xfa49[63]][_0xfa49[116]]!=_0xfa49[117]){_0xc8b2x7[_0xfa49[11]]=_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f];break ;} ;} ;if(_0xc8b2x7[_0xfa49[11]]!=null){_0xc8b2x7[_0xfa49[11]][_0xfa49[104]](_0xfa49[63],_0xfa49[103]);SocialCalc.SheetBarButtonActivate(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],true);_0xc8b2x7[_0xfa49[5]].ActivateWorkBookSheet(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],null);} ;} ;SocialCalc[_0xfa49[142]]=function (_0xc8b2x23,_0xc8b2xb){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2xe=document[_0xfa49[39]](_0xfa49[143]);var _0xc8b2x1c=null;if(_0xc8b2xb!=null){_0xc8b2x1c=_0xc8b2xb;} else {_0xc8b2x1c=_0xfa49[144]+(_0xc8b2x7[_0xfa49[9]]+1).toString();_0xc8b2x7[_0xfa49[9]]=_0xc8b2x7[_0xfa49[9]]+1;} ;_0xc8b2xe[_0xfa49[104]](_0xfa49[145],_0xfa49[146]);if(_0xc8b2x23==null){_0xc8b2xe[_0xfa49[104]](_0xfa49[46],_0xc8b2x1c);} else {_0xc8b2xe[_0xfa49[104]](_0xfa49[46],_0xc8b2x23);} ;_0xc8b2xe[_0xfa49[104]](_0xfa49[44],_0xc8b2x1c);_0xc8b2xe[_0xfa49[104]](_0xfa49[147],_0xc8b2x1c);var _0xc8b2x24=_0xfa49[148]+_0xfa49[149]+_0xc8b2x1c+_0xfa49[149]+_0xfa49[150];_0xc8b2xe[_0xfa49[104]](_0xfa49[151],_0xc8b2x24);_0xc8b2x7[_0xfa49[8]][_0xc8b2x1c]=_0xc8b2xe;var _0xc8b2xf=document[_0xfa49[41]](_0xfa49[45]);_0xc8b2xf[_0xfa49[42]](_0xc8b2xe);_0xc8b2x7[_0xfa49[10]]=_0xc8b2x7[_0xfa49[10]]+1;var _0xc8b2x25= new SocialCalc.SheetBarSheetButton(_0xfa49[49]+_0xc8b2x1c,(_0xc8b2x23?_0xc8b2x23:_0xc8b2x1c),document[_0xfa49[41]](_0xfa49[48]),{},{MouseDown:function (){SocialCalc.SheetBarSheetButtonPress(_0xc8b2x1c);} ,Repeat:function (){} ,Disabled:function (){} });return _0xc8b2xe;} ;SocialCalc[_0xfa49[152]]=function (_0xc8b2x26,_0xc8b2x23){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;var _0xc8b2xe=SocialCalc.WorkBookControlAddSheetButton(_0xc8b2x23);var _0xc8b2x22=_0xfa49[153];if(_0xc8b2x7[_0xfa49[11]]!=null){_0xc8b2x7[_0xfa49[11]][_0xfa49[104]](_0xfa49[63],_0xfa49[3]);_0xc8b2x22=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];SocialCalc.SheetBarButtonActivate(_0xc8b2x22,false);} ;_0xc8b2xe[_0xfa49[104]](_0xfa49[63],_0xfa49[103]);_0xc8b2x7[_0xfa49[11]]=_0xc8b2xe;var _0xc8b2x27=_0xc8b2xe[_0xfa49[44]];SocialCalc.SheetBarButtonActivate(_0xc8b2x27,true);if(_0xc8b2x26){_0xc8b2x7[_0xfa49[5]].AddNewWorkBookSheet(_0xc8b2x27,_0xc8b2x22,false);var _0xc8b2x1e=_0xfa49[31];SocialCalc[_0xfa49[102]][_0xfa49[101]](_0xfa49[99],{cmdtype:_0xfa49[29],id:_0xfa49[100],cmdstr:_0xc8b2x1e});} ;} ;SocialCalc[_0xfa49[154]]=function (_0xc8b2x28){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2xe=SocialCalc.WorkBookControlAddSheetButton();_0xc8b2x7[_0xfa49[5]].AddNewWorkBookSheetNoSwitch(_0xc8b2xe[_0xfa49[44]],_0xc8b2xe[_0xfa49[46]],_0xc8b2x28);} ;SocialCalc[_0xfa49[155]]=function (_0xc8b2x1c){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2xf=document[_0xfa49[41]](_0xc8b2x1c);_0xc8b2xf[_0xfa49[104]](_0xfa49[63],_0xfa49[156]);SocialCalc.SheetBarButtonActivate(_0xc8b2x1c,true);var _0xc8b2x22=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];if(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]!=_0xc8b2xf[_0xfa49[44]]){_0xc8b2x7[_0xfa49[11]][_0xfa49[104]](_0xfa49[63],_0xfa49[3]);SocialCalc.SheetBarButtonActivate(_0xc8b2x22,false);} ;_0xc8b2x7[_0xfa49[11]]=_0xc8b2xf;_0xc8b2x7[_0xfa49[5]].ActivateWorkBookSheet(_0xc8b2x1c,_0xc8b2x22);} ;SocialCalc[_0xfa49[157]]=null;SocialCalc[_0xfa49[158]]=function (){var _0xc8b2x29=_0xfa49[3];var _0xc8b2x2a=SocialCalc[_0xfa49[157]];if(_0xc8b2x2a[_0xfa49[159]]==4){try{if(_0xc8b2x2a[_0xfa49[160]]==200){_0xc8b2x29=_0xc8b2x2a[_0xfa49[161]]||_0xfa49[3];_0xc8b2x2a=null;} else {;;} ;} catch(e){} ;SocialCalc[_0xfa49[2]]=_0xc8b2x29;SocialCalc[_0xfa49[163]][_0xfa49[162]]=_0xc8b2x29;} ;} ;SocialCalc[_0xfa49[164]]=function (_0xc8b2x2b,_0xc8b2x2c){var _0xc8b2x2a=null;alert(_0xfa49[165]);if(window[_0xfa49[166]]){_0xc8b2x2a= new XMLHttpRequest();} else {if(window[_0xfa49[167]]){try{_0xc8b2x2a= new ActiveXObject(_0xfa49[168]);} catch(e){try{_0xc8b2x2a= new ActiveXObject(_0xfa49[169]);} catch(e){} ;} ;} ;} ;if(!_0xc8b2x2a){alert(_0xfa49[170]);return false;} ;SocialCalc[_0xfa49[157]]=_0xc8b2x2a;_0xc8b2x2a[_0xfa49[171]]=SocialCalc[_0xfa49[158]];_0xc8b2x2a[_0xfa49[173]](_0xfa49[172],document.URL,true);_0xc8b2x2a[_0xfa49[176]](_0xfa49[174],_0xfa49[175]);_0xc8b2x2a[_0xfa49[177]](_0xc8b2x2c);return true;} ;SocialCalc[_0xfa49[178]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2x2d={};_0xc8b2x2d[_0xfa49[179]]=_0xc8b2x7[_0xfa49[10]];_0xc8b2x2d[_0xfa49[180]]=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];_0xc8b2x2d[_0xfa49[181]]=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];_0xc8b2x2d[_0xfa49[182]]={};for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){var _0xc8b2xa=_0xc8b2x7[_0xfa49[5]].SaveWorkBookSheet(_0xc8b2x1f);_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f]={};_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[32]]=_0xc8b2xa;_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]]=_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f][_0xfa49[46]];_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[183]]=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1f)[_0xfa49[63]][_0xfa49[116]]==_0xfa49[117]?_0xfa49[184]:_0xfa49[100];} ;if(SocialCalc[_0xfa49[185]]&&SocialCalc[_0xfa49[185]][_0xfa49[186]]){_0xc8b2x2d[_0xfa49[185]]={};for(var _0xc8b2x2e in SocialCalc[_0xfa49[185]]){_0xc8b2x2d[_0xfa49[185]][_0xc8b2x2e]=SocialCalc[_0xfa49[185]][_0xc8b2x2e];} ;} ;SocialCalc[_0xfa49[2]]=JSON[_0xfa49[187]](_0xc8b2x2d);return SocialCalc[_0xfa49[2]];} ;SocialCalc[_0xfa49[188]]=function (_0xc8b2x28){var _0xc8b2x2d;if(_0xc8b2x28){_0xc8b2x2d=JSON[_0xfa49[189]](_0xc8b2x28);} ;var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();for(var _0xc8b2x1f in _0xc8b2x2d[_0xfa49[182]]){var _0xc8b2x28=_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[32]][_0xfa49[190]];var _0xc8b2x2f=_0xc8b2x7[_0xfa49[5]][_0xfa49[53]].DecodeSpreadsheetSave(_0xc8b2x28);if(_0xc8b2x2f){if(_0xc8b2x2f[_0xfa49[144]]){_0xc8b2x28=_0xc8b2x28[_0xfa49[192]](_0xc8b2x2f[_0xfa49[144]][_0xfa49[54]],_0xc8b2x2f[_0xfa49[144]][_0xfa49[191]]);} ;} ;var _0xc8b2x23=_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]];var _0xc8b2xb=_0xc8b2x7[_0xfa49[5]].SheetNameExistsInWorkBook(_0xc8b2x23);if(_0xc8b2xb){console[_0xfa49[139]](_0xc8b2x23+_0xfa49[193]);_0xc8b2x7[_0xfa49[5]].LoadRenameWorkBookSheet(_0xc8b2xb,_0xc8b2x28,_0xc8b2x23);} else {_0xc8b2xb=_0xfa49[144]+(_0xc8b2x7[_0xfa49[9]]+1).toString();_0xc8b2x7[_0xfa49[9]]=_0xc8b2x7[_0xfa49[9]]+1;SocialCalc.WorkBookControlAddSheetButton(_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]],_0xc8b2xb);_0xc8b2x7[_0xfa49[5]].AddNewWorkBookSheetNoSwitch(_0xc8b2xb,_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]],_0xc8b2x28);} ;} ;} ;SocialCalc[_0xfa49[194]]=function (_0xc8b2x28){var _0xc8b2x2d;if(_0xc8b2x28==_0xfa49[3]){return ;} ;if(_0xc8b2x28){_0xc8b2x2d=JSON[_0xfa49[189]](_0xc8b2x28);} else {_0xc8b2x2d=JSON[_0xfa49[189]](SocialCalc.TestWorkBookSaveStr);} ;var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();SocialCalc.WorkBookControlCreateNewBook();var _0xc8b2x30=true;var _0xc8b2x31=0;var _0xc8b2xb=null;var _0xc8b2x32=_0xc8b2x2d[_0xfa49[180]];for(var _0xc8b2x1f in _0xc8b2x2d[_0xfa49[182]]){if(_0xc8b2x31>_0xc8b2x2d[_0xfa49[179]]){break ;} ;var _0xc8b2x28=_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[32]][_0xfa49[190]];var _0xc8b2x2f=_0xc8b2x7[_0xfa49[5]][_0xfa49[53]].DecodeSpreadsheetSave(_0xc8b2x28);if(_0xc8b2x2f){if(_0xc8b2x2f[_0xfa49[144]]){_0xc8b2x28=_0xc8b2x28[_0xfa49[192]](_0xc8b2x2f[_0xfa49[144]][_0xfa49[54]],_0xc8b2x2f[_0xfa49[144]][_0xfa49[191]]);} ;} ;if(_0xc8b2x30){_0xc8b2x30=false;_0xc8b2xb=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];_0xc8b2x7[_0xfa49[11]][_0xfa49[46]]=_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]];SocialCalc.SheetBarButtonSetName(_0xc8b2xb,_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]]);_0xc8b2x7[_0xfa49[5]].LoadRenameWorkBookSheet(_0xc8b2xb,_0xc8b2x28,_0xc8b2x7[_0xfa49[11]][_0xfa49[46]]);_0xc8b2x32=_0xc8b2xb;} else {_0xc8b2xb=_0xfa49[144]+(_0xc8b2x7[_0xfa49[9]]+1).toString();_0xc8b2x7[_0xfa49[9]]=_0xc8b2x7[_0xfa49[9]]+1;SocialCalc.WorkBookControlAddSheetButton(_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]],_0xc8b2xb);_0xc8b2x7[_0xfa49[5]].AddNewWorkBookSheetNoSwitch(_0xc8b2xb,_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[147]],_0xc8b2x28);} ;if(_0xc8b2x2d[_0xfa49[182]][_0xc8b2x1f][_0xfa49[183]]==_0xfa49[184]){var _0xc8b2x14=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2xb);_0xc8b2x14[_0xfa49[63]][_0xfa49[116]]=_0xfa49[117];SocialCalc.SheetBarButtonActivate(_0xc8b2x1f,false);_0xc8b2x31=_0xc8b2x31-1;} ;if(_0xc8b2x1f==_0xc8b2x2d[_0xfa49[180]]){_0xc8b2x32=_0xc8b2xb;} ;_0xc8b2x31=_0xc8b2x31+1;} ;if(_0xc8b2x2d[_0xfa49[185]]){SocialCalc[_0xfa49[185]]={};for(var _0xc8b2x2e in _0xc8b2x2d[_0xfa49[185]]){SocialCalc[_0xfa49[185]][_0xc8b2x2e]=_0xc8b2x2d[_0xfa49[185]][_0xc8b2x2e];} ;} ;var _0xc8b2x33=function (){SocialCalc.WorkBookControlActivateSheet(_0xc8b2x32);} ;window[_0xfa49[195]](_0xc8b2x33,200);} ;SocialCalc[_0xfa49[196]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;var _0xc8b2xe=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[12]]);if(_0xc8b2xe){return ;} ;var _0xc8b2x18=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];var _0xc8b2x15=_0xfa49[55]+_0xfa49[197]+_0xfa49[198]+_0xc8b2x18+_0xfa49[199]+_0xfa49[197]+_0xfa49[200]+_0xfa49[201]+_0xfa49[202]+_0xc8b2x18+_0xfa49[203]+_0xfa49[82];_0xc8b2x15+=_0xfa49[60]+_0xfa49[204]+_0xfa49[205];var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xc8b2x7[_0xfa49[12]];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/3)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=100;_0xc8b2x16[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];_0xc8b2x16[_0xfa49[63]][_0xfa49[73]]=_0xfa49[74];_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[75];_0xc8b2x16[_0xfa49[40]]=_0xfa49[76]+_0xfa49[77]+_0xfa49[78]+_0xfa49[79]+_0xfa49[206]+_0xfa49[81]+_0xc8b2x15+_0xfa49[82];SocialCalc.DragRegister(_0xc8b2x16[_0xfa49[83]][_0xfa49[83]][_0xfa49[83]][_0xfa49[83]],true,true,{MouseDown:SocialCalc[_0xfa49[84]],MouseMove:SocialCalc[_0xfa49[85]],MouseUp:SocialCalc[_0xfa49[85]],Disabled:null,positionobj:_0xc8b2x16});_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);var _0xc8b2x1a=document[_0xfa49[41]](_0xfa49[207]);_0xc8b2x1a[_0xfa49[208]]();SocialCalc.CmdGotFocus(_0xc8b2x1a);} ;SocialCalc[_0xfa49[209]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2x19=_0xc8b2x7[_0xfa49[5]][_0xfa49[53]];var _0xc8b2x1a=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[12]]);_0xc8b2x1a[_0xfa49[40]]=_0xfa49[3];SocialCalc.DragUnregister(_0xc8b2x1a);SocialCalc.KeyboardFocus();if(_0xc8b2x1a[_0xfa49[96]]){_0xc8b2x1a[_0xfa49[96]][_0xfa49[47]](_0xc8b2x1a);} ;} ;SocialCalc[_0xfa49[210]]=function (){var _0xc8b2x1a=document[_0xfa49[41]](_0xfa49[207]);var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x1a[_0xfa49[46]][_0xfa49[211]]==0){_0xc8b2x1a[_0xfa49[208]]();return ;} ;var _0xc8b2xc=_0xc8b2x7[_0xfa49[11]][_0xfa49[46]];var _0xc8b2xd=_0xc8b2x1a[_0xfa49[46]];if(_0xc8b2xd[_0xfa49[213]](_0xfa49[212])!=-1){alert(_0xfa49[214]);return ;} ;SocialCalc.WorkBookControlRenameSheetHide();var _0xc8b2x34=_0xc8b2xd[_0xfa49[215]]();for(var _0xc8b2x1f in workbook[_0xfa49[182]]){console[_0xfa49[139]](workbook[_0xfa49[182]][_0xc8b2x1f][_0xfa49[144]][_0xfa49[216]]);if(workbook[_0xfa49[182]][_0xc8b2x1f][_0xfa49[144]][_0xfa49[216]]==_0xc8b2x34){alert(_0xc8b2xd+_0xfa49[217]);return ;} ;} ;_0xc8b2x7[_0xfa49[11]][_0xfa49[46]]=_0xc8b2x34;SocialCalc.SheetBarButtonSetName(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],_0xc8b2xd);_0xc8b2x7[_0xfa49[5]].RenameWorkBookSheet(_0xc8b2xc,_0xc8b2x34,_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]);var _0xc8b2x1e=_0xfa49[218]+_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]+_0xfa49[212]+_0xc8b2xc+_0xfa49[212]+_0xc8b2xd;SocialCalc[_0xfa49[102]][_0xfa49[101]](_0xfa49[99],{cmdtype:_0xfa49[29],id:_0xfa49[100],cmdstr:_0xc8b2x1e});} ;SocialCalc[_0xfa49[219]]=function (_0xc8b2xb,_0xc8b2xc,_0xc8b2xd){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2xf=document[_0xfa49[41]](_0xfa49[45]);var _0xc8b2x35=document[_0xfa49[41]](_0xc8b2xb);_0xc8b2x35[_0xfa49[46]]=_0xc8b2xd;SocialCalc.SheetBarButtonSetName(_0xc8b2xb,_0xc8b2xd);_0xc8b2x7[_0xfa49[5]].RenameWorkBookSheet(_0xc8b2xc,_0xc8b2xd,_0xc8b2xb);} ;SocialCalc[_0xfa49[220]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){if(_0xc8b2x1f!=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]){_0xc8b2x7[_0xfa49[5]].DeleteWorkBookSheet(_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f][_0xfa49[44]],_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f][_0xfa49[46]]);} ;} ;_0xc8b2x7[_0xfa49[5]].LoadRenameWorkBookSheet(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]],_0xfa49[3],_0xc8b2x7[_0xfa49[5]][_0xfa49[7]]);for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[8]]){if(_0xc8b2x1f!=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]){var _0xc8b2xf=document[_0xfa49[41]](_0xfa49[45]);var _0xc8b2x1b=document[_0xfa49[41]](_0xc8b2x7[_0xfa49[8]][_0xc8b2x1f][_0xfa49[44]]);var _0xc8b2x1c=_0xc8b2x1b[_0xfa49[44]];delete _0xc8b2x7[_0xfa49[8]][_0xc8b2x1c];_0xc8b2xf[_0xfa49[47]](_0xc8b2x1b);var _0xc8b2x13=document[_0xfa49[41]](_0xfa49[48]);var _0xc8b2x14=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x1c);_0xc8b2x13[_0xfa49[47]](_0xc8b2x14);_0xc8b2x7[_0xfa49[10]]=_0xc8b2x7[_0xfa49[10]]-1;} ;} ;_0xc8b2x7[_0xfa49[11]][_0xfa49[46]]=_0xc8b2x7[_0xfa49[5]][_0xfa49[7]];} ;SocialCalc[_0xfa49[221]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();SocialCalc.WorkBookControlCreateNewBook();_0xc8b2x7[_0xfa49[5]].RenderWorkBookSheet();} ;SocialCalc[_0xfa49[222]]=function (_0xc8b2x36){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;var _0xc8b2x37=_0xc8b2x7[_0xfa49[8]];var _0xc8b2x38={};var _0xc8b2xb=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];var _0xc8b2x39=document[_0xfa49[41]](_0xc8b2xb);var _0xc8b2x3a=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2xb);var _0xc8b2x3b=null;var _0xc8b2x3c=null;if(_0xc8b2x36==_0xfa49[68]){_0xc8b2x3b=_0xc8b2x39[_0xfa49[223]];_0xc8b2x3c=_0xc8b2x3a[_0xfa49[223]];if(!_0xc8b2x3c){alert(_0xfa49[224]);return ;} ;} else {_0xc8b2x3b=_0xc8b2x39[_0xfa49[225]];_0xc8b2x3c=_0xc8b2x3a[_0xfa49[225]];if(!_0xc8b2x3c){alert(_0xfa49[226]);return ;} ;} ;var _0xc8b2x3d=_0xc8b2xb;var _0xc8b2x3e=_0xc8b2x3b[_0xfa49[44]];var _0xc8b2x3f=_0xc8b2x39[_0xfa49[96]];var _0xc8b2x40=_0xc8b2x3a[_0xfa49[96]];var _0xc8b2x41={};var _0xc8b2x42={};for(button in _0xc8b2x37){_0xc8b2x42[button]=document[_0xfa49[41]](_0xfa49[49]+button);_0xc8b2x41[button]=document[_0xfa49[41]](button);_0xc8b2x40[_0xfa49[47]](document[_0xfa49[41]](_0xfa49[49]+button));_0xc8b2x3f[_0xfa49[47]](document[_0xfa49[41]](button));} ;for(button in _0xc8b2x37){if(button!=_0xc8b2x3d&&button!=_0xc8b2x3e){_0xc8b2x38[button]=_0xc8b2x37[button];_0xc8b2x40[_0xfa49[42]](_0xc8b2x42[button]);_0xc8b2x3f[_0xfa49[42]](_0xc8b2x41[button]);} else {if(button==_0xc8b2x3d){if(_0xc8b2x36==_0xfa49[68]){_0xc8b2x38[_0xc8b2x3d]=_0xc8b2x37[_0xc8b2x3d];_0xc8b2x38[_0xc8b2x3e]=_0xc8b2x37[_0xc8b2x3e];_0xc8b2x40[_0xfa49[42]](_0xc8b2x42[_0xc8b2x3d]);_0xc8b2x3f[_0xfa49[42]](_0xc8b2x41[_0xc8b2x3d]);_0xc8b2x40[_0xfa49[42]](_0xc8b2x42[_0xc8b2x3e]);_0xc8b2x3f[_0xfa49[42]](_0xc8b2x41[_0xc8b2x3e]);} else {_0xc8b2x38[_0xc8b2x3e]=_0xc8b2x37[_0xc8b2x3e];_0xc8b2x38[_0xc8b2x3d]=_0xc8b2x37[_0xc8b2x3d];_0xc8b2x40[_0xfa49[42]](_0xc8b2x42[_0xc8b2x3e]);_0xc8b2x3f[_0xfa49[42]](_0xc8b2x41[_0xc8b2x3e]);_0xc8b2x40[_0xfa49[42]](_0xc8b2x42[_0xc8b2x3d]);_0xc8b2x3f[_0xfa49[42]](_0xc8b2x41[_0xc8b2x3d]);} ;} ;} ;} ;_0xc8b2x7[_0xfa49[8]]=_0xc8b2x38;SocialCalc.SheetBarButtonActivate(_0xc8b2x3d,true);} ;SocialCalc[_0xfa49[227]]=function (){SocialCalc.WorkBookControlMove(_0xfa49[68]);} ;SocialCalc[_0xfa49[228]]=function (){SocialCalc.WorkBookControlMove(_0xfa49[229]);} ;SocialCalc[_0xfa49[230]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;_0xc8b2x7[_0xfa49[5]].CopyWorkBookSheet(_0xc8b2x7[_0xfa49[11]][_0xfa49[44]]);alert(_0xfa49[231]+_0xc8b2x7[_0xfa49[11]][_0xfa49[46]]);} ;SocialCalc[_0xfa49[232]]=function (){var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;var _0xc8b2x43=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];SocialCalc.WorkBookControlAddSheet(false);var _0xc8b2x44=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];_0xc8b2x7[_0xfa49[5]].PasteWorkBookSheet(_0xc8b2x44,_0xc8b2x43);var _0xc8b2x1e=_0xfa49[33];SocialCalc[_0xfa49[102]][_0xfa49[101]](_0xfa49[99],{cmdtype:_0xfa49[29],id:_0xfa49[100],cmdstr:_0xc8b2x1e,sheetstr:_0xc8b2x7[_0xfa49[5]][_0xfa49[233]][_0xfa49[190]]});} ;SocialCalc[_0xfa49[234]]=function (){this[_0xfa49[235]]=document[_0xfa49[41]](_0xfa49[236]);this[_0xfa49[237]]=document[_0xfa49[39]](_0xfa49[6]);this[_0xfa49[237]][_0xfa49[63]][_0xfa49[238]]=_0xfa49[239];this[_0xfa49[237]][_0xfa49[40]]=_0xfa49[240];this[_0xfa49[237]][_0xfa49[44]]=_0xfa49[241];this[_0xfa49[242]]=document[_0xfa49[39]](_0xfa49[6]);this[_0xfa49[242]][_0xfa49[44]]=_0xfa49[48];this[_0xfa49[242]][_0xfa49[63]][_0xfa49[238]]=_0xfa49[239];this[_0xfa49[243]]=document[_0xfa49[39]](_0xfa49[6]);this[_0xfa49[243]][_0xfa49[44]]=_0xfa49[244];this[_0xfa49[243]][_0xfa49[63]][_0xfa49[116]]=_0xfa49[140];var _0xc8b2x45= new SocialCalc.SheetBarSheetButton(_0xfa49[245],_0xfa49[245],this[_0xfa49[243]],{},{MouseDown:function (){var _0xc8b2x46=SocialCalc.WorkBookControlAddSheet(true);} },_0xfa49[246]);this[_0xfa49[235]][_0xfa49[42]](this[_0xfa49[237]]);this[_0xfa49[235]][_0xfa49[42]](this[_0xfa49[242]]);this[_0xfa49[235]][_0xfa49[42]](this[_0xfa49[243]]);} ;SocialCalc[_0xfa49[247]]=function (_0xc8b2x47,_0xc8b2x1c,_0xc8b2x48,_0xc8b2x49,_0xc8b2x4a,_0xc8b2x4b){this[_0xfa49[248]]=document[_0xfa49[39]](_0xfa49[6]);this[_0xfa49[248]][_0xfa49[44]]=_0xc8b2x47;this[_0xfa49[248]][_0xfa49[147]]=_0xc8b2x1c;if(!_0xc8b2x4b){this[_0xfa49[248]][_0xfa49[40]]=_0xc8b2x1c;this[_0xfa49[248]][_0xfa49[63]][_0xfa49[238]]=_0xfa49[249];_0xc8b2x4c=document[_0xfa49[39]](_0xfa49[250]);_0xc8b2x4c[_0xfa49[44]]=_0xc8b2x47+_0xfa49[251];_0xc8b2x4c[_0xfa49[252]]=SocialCalc[_0xfa49[254]][_0xfa49[253]]+_0xfa49[255];_0xc8b2x4c[_0xfa49[63]][_0xfa49[238]]=_0xfa49[256];this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x4c);SocialCalc.ButtonRegister(this[_0xfa49[248]],_0xc8b2x49,_0xc8b2x4a);SocialCalc.ButtonRegister(_0xc8b2x4c,_0xc8b2x49,_0xc8b2x4a);} else {var _0xc8b2x4c=document[_0xfa49[39]](_0xfa49[250]);_0xc8b2x4c[_0xfa49[252]]=SocialCalc[_0xfa49[254]][_0xfa49[253]]+_0xc8b2x4b;_0xc8b2x4c[_0xfa49[63]][_0xfa49[238]]=_0xfa49[257];this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x4c);this[_0xfa49[248]][_0xfa49[63]][_0xfa49[238]]=_0xfa49[258];SocialCalc.ButtonRegister(_0xc8b2x4c,_0xc8b2x49,_0xc8b2x4a);} ;_0xc8b2x48[_0xfa49[42]](this[_0xfa49[248]]);} ;SocialCalc[_0xfa49[259]]=function (_0xc8b2x47,_0xc8b2x4d){var _0xc8b2x4e=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x47);_0xc8b2x4e[_0xfa49[260]]=_0xc8b2x4d;if(_0xc8b2x4d){_0xc8b2x4e[_0xfa49[63]][_0xfa49[71]]=_0xfa49[72];var _0xc8b2x4c=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x47+_0xfa49[251]);if(!_0xc8b2x4c){_0xc8b2x4c=document[_0xfa49[39]](_0xfa49[250]);_0xc8b2x4c[_0xfa49[44]]=_0xfa49[49]+_0xc8b2x47+_0xfa49[251];_0xc8b2x4c[_0xfa49[252]]=SocialCalc[_0xfa49[254]][_0xfa49[253]]+_0xfa49[255];_0xc8b2x4c[_0xfa49[63]][_0xfa49[238]]=_0xfa49[256];} ;_0xc8b2x4e[_0xfa49[42]](_0xc8b2x4c);SocialCalc.ButtonRegister(_0xc8b2x4c,{},{MouseDown:function (){SocialCalc.SheetBarSheetButtonPress(_0xc8b2x47);} ,Repeat:function (){} ,Disabled:function (){} });} else {_0xc8b2x4e[_0xfa49[63]][_0xfa49[71]]=_0xfa49[261];var _0xc8b2x4c=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x47+_0xfa49[251]);if(_0xc8b2x4c){_0xc8b2x4e[_0xfa49[47]](_0xc8b2x4c);} ;} ;var _0xc8b2x4f=document[_0xfa49[41]](_0xfa49[262]);if(_0xc8b2x4f&&_0xc8b2x4f[_0xfa49[63]][_0xfa49[116]]!=_0xfa49[117]){_0xc8b2x4f[_0xfa49[63]][_0xfa49[116]]=_0xfa49[117];} ;} ;SocialCalc[_0xfa49[263]]=function (_0xc8b2x47,_0xc8b2x1c){var _0xc8b2x4e=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x47);_0xc8b2x4e[_0xfa49[147]]=_0xc8b2x1c;_0xc8b2x4e[_0xfa49[40]]=_0xc8b2x1c;if(_0xc8b2x4e[_0xfa49[260]]){SocialCalc.SheetBarButtonActivate(_0xc8b2x47,true);} ;} ;SocialCalc[_0xfa49[264]]=function (_0xc8b2x47){var _0xc8b2x4e=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x47);if(_0xc8b2x4e&&_0xc8b2x4e[_0xfa49[260]]){var _0xc8b2x4f=document[_0xfa49[41]](_0xfa49[262]);if(!_0xc8b2x4f){var _0xc8b2x50= new SocialCalc.SheetBarSheetButtonMenu(_0xfa49[262],_0xc8b2x47);} else {_0xc8b2x4f[_0xfa49[265]]=_0xc8b2x47;if(_0xc8b2x4f[_0xfa49[63]][_0xfa49[116]]==_0xfa49[117]){_0xc8b2x4f[_0xfa49[63]][_0xfa49[116]]=_0xfa49[140];SocialCalc.SheetBarSheetButtonMenuPosition(_0xc8b2x4f,_0xc8b2x47);} else {_0xc8b2x4f[_0xfa49[63]][_0xfa49[116]]=_0xfa49[117];} ;} ;} else {if(_0xc8b2x4e){SocialCalc.WorkBookControlActivateSheet(_0xc8b2x47);} ;} ;} ;SocialCalc[_0xfa49[266]]=function (_0xc8b2x47,_0xc8b2x51){this[_0xfa49[248]]=document[_0xfa49[39]](_0xfa49[6]);this[_0xfa49[248]][_0xfa49[44]]=_0xc8b2x47;this[_0xfa49[248]][_0xfa49[40]]=_0xc8b2x51;this[_0xfa49[248]][_0xfa49[267]]=_0xfa49[3];this[_0xfa49[248]][_0xfa49[63]][_0xfa49[238]]=_0xfa49[268];var _0xc8b2x49={normalstyle:_0xfa49[269],downstyle:_0xfa49[270],hoverstyle:_0xfa49[270]};var _0xc8b2x4a={MouseDown:function (){SocialCalc.SheetBarMenuItemPress(_0xc8b2x47);} ,Repeat:function (){} ,Disabled:function (){} };SocialCalc.ButtonRegister(this[_0xfa49[248]],_0xc8b2x49,_0xc8b2x4a);SocialCalc.TouchRegister(this[_0xfa49[248]],{SingleTap:_0xc8b2x4a[_0xfa49[271]]});return this[_0xfa49[248]];} ;SocialCalc[_0xfa49[272]]=function (_0xc8b2x47){var _0xc8b2x4f=document[_0xfa49[41]](_0xfa49[262]);if(!_0xc8b2x4f){return ;} ;var _0xc8b2x52=_0xc8b2x4f[_0xfa49[265]];switch(_0xc8b2x47){case _0xfa49[273]:SocialCalc.WorkBookControlDelSheet();break ;;case _0xfa49[274]:SocialCalc.WorkBookControlHideSheet();break ;;case _0xfa49[275]:SocialCalc.WorkBookControlUnhideSheet();break ;;case _0xfa49[276]:SocialCalc.WorkBookControlCopySheet();break ;;case _0xfa49[277]:SocialCalc.WorkBookControlMoveLeft();break ;;case _0xfa49[278]:SocialCalc.WorkBookControlMoveRight();break ;;case _0xfa49[279]:SocialCalc.WorkBookControlPasteSheet();break ;;case _0xfa49[280]:SocialCalc.WorkBookControlRenameSheet();break ;;case _0xfa49[281]:_0xc8b2x4f[_0xfa49[63]][_0xfa49[116]]=_0xfa49[117];break ;;default:break ;;} ;_0xc8b2x4f[_0xfa49[63]][_0xfa49[116]]=_0xfa49[117];} ;SocialCalc[_0xfa49[282]]=function (_0xc8b2x47,_0xc8b2x52){this[_0xfa49[248]]=document[_0xfa49[39]](_0xfa49[6]);this[_0xfa49[248]][_0xfa49[44]]=_0xc8b2x47;this[_0xfa49[248]][_0xfa49[267]]=_0xfa49[3];this[_0xfa49[248]][_0xfa49[265]]=_0xc8b2x52;this[_0xfa49[248]][_0xfa49[63]][_0xfa49[238]]=_0xfa49[283];var _0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[273],_0xfa49[284]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[274],_0xfa49[285]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[275],_0xfa49[286]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[280],_0xfa49[287]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[277],_0xfa49[288]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[278],_0xfa49[289]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[276],_0xfa49[290]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[279],_0xfa49[291]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);_0xc8b2x53= new SocialCalc.SheetBarSheetButtonMenuItem(_0xfa49[281],_0xfa49[292]);this[_0xfa49[248]][_0xfa49[42]](_0xc8b2x53);SocialCalc.SheetBarSheetButtonMenuPosition(this[_0xfa49[248]],_0xc8b2x52);var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[293]][_0xfa49[42]](this[_0xfa49[248]]);} ;SocialCalc[_0xfa49[294]]=function (_0xc8b2x4f,_0xc8b2x52){var _0xc8b2x54=document[_0xfa49[41]](_0xfa49[295]);var _0xc8b2x4e=document[_0xfa49[41]](_0xfa49[49]+_0xc8b2x52);var _0xc8b2x55=_0xc8b2x54[_0xfa49[63]][_0xfa49[65]][_0xfa49[296]](0,-2)-220;var _0xc8b2x56=_0xc8b2x4e[_0xfa49[297]]+7;_0xc8b2x4f[_0xfa49[63]][_0xfa49[65]]=_0xc8b2x55+_0xfa49[67];_0xc8b2x4f[_0xfa49[63]][_0xfa49[68]]=_0xc8b2x56+_0xfa49[67];} ;SocialCalc[_0xfa49[298]]={scripts:{},handle:null};SocialCalc[_0xfa49[299]]=function (_0xc8b2xb,_0xc8b2x57,_0xc8b2x58){var _0xc8b2x59=_0xc8b2x58[_0xfa49[213]](_0xfa49[300]);var _0xc8b2x5a=_0xc8b2x58[_0xfa49[213]](_0xfa49[301]);if((_0xc8b2x59!=-1)&&(_0xc8b2x5a!=-1)){script=_0xc8b2x58[_0xfa49[296]](_0xc8b2x59+10,_0xc8b2x5a);SocialCalc[_0xfa49[298]][_0xfa49[302]][_0xc8b2x57]=script;if(SocialCalc[_0xfa49[298]][_0xfa49[303]]==null){SocialCalc[_0xfa49[298]][_0xfa49[303]]=window[_0xfa49[195]](SocialCalc.EvalUserScripts,500);} ;} ;} ;SocialCalc[_0xfa49[304]]=function (_0xc8b2x5b){var _0xc8b2x5c=document[_0xfa49[306]](_0xfa49[305])[0]||document[_0xfa49[307]];if(_0xc8b2x5b==_0xfa49[3]){return ;} ;var _0xc8b2x5d=document[_0xfa49[39]](_0xfa49[308]);_0xc8b2x5d[_0xfa49[145]]=_0xfa49[309];try{_0xc8b2x5d[_0xfa49[42]](document[_0xfa49[310]](_0xc8b2x5b));} catch(e){_0xc8b2x5d[_0xfa49[311]]=_0xc8b2x5b;} ;_0xc8b2x5c[_0xfa49[312]](_0xc8b2x5d,_0xc8b2x5c[_0xfa49[83]]);_0xc8b2x5c[_0xfa49[47]](_0xc8b2x5d);} ;SocialCalc[_0xfa49[313]]=function (){for(var _0xc8b2x5e in SocialCalc[_0xfa49[298]][_0xfa49[302]]){SocialCalc.EvalUserScript(SocialCalc[_0xfa49[298]][_0xfa49[302]][_0xc8b2x5e]);} ;SocialCalc[_0xfa49[298]][_0xfa49[303]]=null;SocialCalc[_0xfa49[298]][_0xfa49[302]]={};} ;SocialCalc[_0xfa49[314]]=function (_0xc8b2x5f,_0xc8b2x60,_0xc8b2x5e){var _0xc8b2x61=_0xc8b2x5f[_0xfa49[315]][_0xc8b2x5e];if(!_0xc8b2x61){return ;} ;var _0xc8b2x62=_0xc8b2x61[_0xfa49[316]]||_0xfa49[3];var _0xc8b2x63=_0xc8b2x62[_0xfa49[192]](1);var _0xc8b2x64=_0xc8b2x5f[_0xfa49[317]];_0xc8b2x62=_0xc8b2x62[_0xfa49[318]](0);if(_0xc8b2x62==_0xfa49[319]){valueformat=_0xc8b2x5f[_0xfa49[321]][_0xc8b2x61[_0xfa49[320]]-0]||_0xc8b2x5f[_0xfa49[321]][_0xc8b2x64[_0xfa49[322]]-0]||_0xfa49[3];if(valueformat==_0xfa49[323]){SocialCalc.ScriptCheck(_0xc8b2x5f[_0xfa49[324]],_0xc8b2x5e,_0xc8b2x60);} ;} ;} ;SocialCalc[_0xfa49[325]]=function (_0xc8b2x57){var _0xc8b2x23=null;var _0xc8b2xb=_0xfa49[3];var _0xc8b2x65=_0xc8b2x57[_0xfa49[213]](_0xfa49[326]);if(_0xc8b2x65!=-1){_0xc8b2x23=_0xc8b2x57[_0xfa49[296]](0,_0xc8b2x65);_0xc8b2x57=_0xc8b2x57[_0xfa49[296]](_0xc8b2x65+1);} ;var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x23==null){_0xc8b2xb=_0xc8b2x7[_0xfa49[11]][_0xfa49[44]];} else {_0xc8b2xb=_0xc8b2x7[_0xfa49[5]].SheetNameExistsInWorkBook(_0xc8b2x23);} ;if((_0xc8b2xb==null)||(_0xc8b2xb==_0xfa49[3])){return _0xfa49[100];} ;var _0xc8b2x5f=_0xc8b2x7[_0xfa49[5]][_0xfa49[182]][_0xc8b2xb][_0xfa49[144]];var _0xc8b2x61=_0xc8b2x5f[_0xfa49[315]][_0xc8b2x57];if(_0xc8b2x61){return _0xc8b2x61[_0xfa49[327]];} else {return 0;} ;} ;SocialCalc[_0xfa49[328]]=function (_0xc8b2x66,_0xc8b2x23){var _0xc8b2x67=[];var _0xc8b2x68=_0xc8b2x66[_0xfa49[330]](_0xfa49[329]);if(_0xc8b2x23==null){_0xc8b2x23=_0xfa49[3];} else {_0xc8b2x23=_0xc8b2x23+_0xfa49[326];} ;for(var _0xc8b2x69 in _0xc8b2x68){_0xc8b2x67[_0xfa49[331]](SocialCalc.GetCellDataValue(_0xc8b2x23+_0xc8b2x68[_0xc8b2x69]));} ;return _0xc8b2x67;} ;SocialCalc[_0xfa49[332]]={};SocialCalc[_0xfa49[333]]={sheets:[],calcorder:[],current:0,pass:0};SocialCalc[_0xfa49[334]]=function (){if((SocialCalc[_0xfa49[333]][_0xfa49[335]]!=0)||(SocialCalc[_0xfa49[333]][_0xfa49[336]][_0xfa49[211]]!=0)||(SocialCalc[_0xfa49[333]][_0xfa49[337]][_0xfa49[211]]!=0)){return ;} ;var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();if(_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[52]][_0xfa49[51]]!=_0xfa49[54]){return ;} ;SocialCalc[_0xfa49[333]][_0xfa49[335]]=0;for(var _0xc8b2x1f in _0xc8b2x7[_0xfa49[5]][_0xfa49[182]]){SocialCalc[_0xfa49[333]][_0xfa49[337]][_0xfa49[331]](_0xc8b2x1f);} ;var _0xc8b2x2e=0;for(var _0xc8b2x69=SocialCalc[_0xfa49[333]][_0xfa49[337]][_0xfa49[211]];_0xc8b2x69>0;_0xc8b2x69--){SocialCalc[_0xfa49[333]][_0xfa49[336]][_0xc8b2x2e]=SocialCalc[_0xfa49[333]][_0xfa49[337]][_0xc8b2x69-1];_0xc8b2x2e++;} ;window[_0xfa49[195]](SocialCalc.WorkBookRecalculateStep,500);} ;SocialCalc[_0xfa49[338]]=function (){if(SocialCalc[_0xfa49[333]][_0xfa49[335]]==SocialCalc[_0xfa49[333]][_0xfa49[336]][_0xfa49[211]]){SocialCalc[_0xfa49[333]][_0xfa49[335]]=0;SocialCalc[_0xfa49[333]][_0xfa49[336]]=[];SocialCalc[_0xfa49[333]][_0xfa49[337]]=[];if(SocialCalc[_0xfa49[333]][_0xfa49[339]]==1){SocialCalc[_0xfa49[333]][_0xfa49[339]]=0;SocialCalc.SpinnerWaitHide();return ;} else {SocialCalc[_0xfa49[333]][_0xfa49[339]]++;SocialCalc.WorkBookRecalculateAll();return ;} ;} ;var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();var _0xc8b2xb=SocialCalc[_0xfa49[333]][_0xfa49[336]][SocialCalc[_0xfa49[333]][_0xfa49[335]]];SocialCalc.WorkBookControlActivateSheet(_0xc8b2xb);SocialCalc[_0xfa49[333]][_0xfa49[335]]++;window[_0xfa49[195]](SocialCalc.WorkBookRecalculateStep,1000);} ;SocialCalc[_0xfa49[340]]=function (){var _0xc8b2x1a=document[_0xfa49[41]](_0xfa49[341]);if(_0xc8b2x1a){return ;} ;var _0xc8b2x16=document[_0xfa49[39]](_0xfa49[6]);_0xc8b2x16[_0xfa49[44]]=_0xfa49[341];_0xc8b2x16[_0xfa49[63]][_0xfa49[62]]=_0xfa49[64];var _0xc8b2x17=SocialCalc.GetViewportInfo();_0xc8b2x16[_0xfa49[63]][_0xfa49[65]]=(_0xc8b2x17[_0xfa49[66]]/2)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[68]]=(_0xc8b2x17[_0xfa49[69]]/2)+_0xfa49[67];_0xc8b2x16[_0xfa49[63]][_0xfa49[70]]=110;_0xc8b2x16[_0xfa49[63]][_0xfa49[69]]=_0xfa49[342];_0xc8b2x16[_0xfa49[63]][_0xfa49[66]]=_0xfa49[342];_0xc8b2x16[_0xfa49[40]]=_0xfa49[343];var _0xc8b2x7=SocialCalc.GetCurrentWorkBookControl();_0xc8b2x7[_0xfa49[5]][_0xfa49[53]][_0xfa49[86]][_0xfa49[42]](_0xc8b2x16);} ;SocialCalc[_0xfa49[344]]=function (){var _0xc8b2x1a=document[_0xfa49[41]](_0xfa49[341]);if(_0xc8b2x1a){_0xc8b2x1a[_0xfa49[40]]=_0xfa49[3];if(_0xc8b2x1a[_0xfa49[96]]){_0xc8b2x1a[_0xfa49[96]][_0xfa49[47]](_0xc8b2x1a);} ;} ;} ;SocialCalc[_0xfa49[185]]={};SocialCalc[_0xfa49[185]][_0xfa49[186]]=false;SocialCalc[_0xfa49[185]][_0xfa49[315]]={};SocialCalc[_0xfa49[102]][_0xfa49[345]]=function (_0xc8b2x6a){if(!(SocialCalc[_0xfa49[185]][_0xfa49[186]])){return true;} ;if(SocialCalc[_0xfa49[185]][_0xfa49[315]][_0xc8b2x6a]){return true;} ;return false;} ;SocialCalc[_0xfa49[102]][_0xfa49[346]]=function (_0xc8b2x6b){var _0xc8b2x6c=_0xc8b2x6b[_0xfa49[348]][_0xfa49[347]]+_0xfa49[326]+_0xc8b2x6b[_0xfa49[350]][_0xfa49[349]];if(!(SocialCalc[_0xfa49[185]][_0xfa49[186]])){return true;} ;if(SocialCalc[_0xfa49[185]][_0xfa49[315]][_0xc8b2x6c]){return true;} ;return false;} ;SocialCalc[_0xfa49[351]]=function (_0xc8b2x6d,_0xc8b2x6e,_0xc8b2x6f,_0xc8b2x70,_0xc8b2x71,_0xc8b2x72){if(_0xc8b2x6f+10+_0xc8b2x71>_0xc8b2x6d){return false;} ;if(_0xc8b2x70+_0xc8b2x72>_0xc8b2x6e){return false;} ;return true;} ; \ No newline at end of file diff --git a/Website/static/runappios43c/lib/aspiring/autosave.js b/Website/static/runappios43c/lib/aspiring/autosave.js deleted file mode 100755 index a263b4c..0000000 --- a/Website/static/runappios43c/lib/aspiring/autosave.js +++ /dev/null @@ -1,53 +0,0 @@ -// -// Autosave functionality -- this is the browser version that saves to the server -// -// External interfaces are from: -// SocialCalcTableEditor (for autosave upon edit) -// - -if (!Aspiring) { - console.log("aspiring not defined"); - var Aspiring = {}; -} -Aspiring.AutoSave = {}; -Aspiring.AutoSave.selectedFile = "default"; -Aspiring.AutoSave.autoSaveTimeoutId = null; -Aspiring.AutoSave.SaveTimeout = 10000; // 10 seconds - - -// This is called from the SocialCalcTableEditor -// EditorSaveEdit function -SocialCalc.Callbacks.editAutoSave = function() { - // start a timer - //console.log("in auto save"); - //var control = SocialCalc.GetCurrentWorkBookControl(); - //if (Aspiring.AutoSave.autoSaveTimeoutId != null) { - // console.log("timer already running"); - //} else { - // Aspiring.AutoSave.autoSaveTimeoutId = - // window.setTimeout(Aspiring.AutoSave.TimerExpiry, Aspiring.AutoSave.SaveTimeout ); - //} - Aspiring.AutoSave.TimerExpiry(); -} - -Aspiring.AutoSave.TimerExpiry = function() { - //console.log("auto save timer"); - - // save file - if ( Aspiring.AutoSave.selectedFile == "default") { - Aspiring.AutoSave.selectedFile = "Untitled"; - } - - var data = SocialCalc.WorkBookControlSaveSheet(); - - //console.log(data.length); - var encodedData = encodeURIComponent(data); - window.localStorage.setItem(Aspiring.getPathFromFilename(Aspiring.AutoSave.selectedFile), encodedData); - //Aspiring.AutoSave.autoSaveTimeoutId = null; - - updateFileName(Aspiring.AutoSave.selectedFile); - -}; - - - diff --git a/Website/static/runappios43c/lib/aspiring/formatnumber2.js b/Website/static/runappios43c/lib/aspiring/formatnumber2.js deleted file mode 100755 index 0cf3f94..0000000 --- a/Website/static/runappios43c/lib/aspiring/formatnumber2.js +++ /dev/null @@ -1,950 +0,0 @@ -// -/* -// SocialCalc Number Formatting Library -// -// Part of the SocialCalc package. -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - -SocialCalc.FormatNumber = {}; - -SocialCalc.FormatNumber.format_definitions = {}; // Parsed formats are stored here globally - -// Most constants that are often customized for localization are in the SocialCalc.Constants module. -// If you use this module standalone, provide at least the "FormatNumber" values. -// - -// The following values may be customized externally for further localization of the format definitions themselves, -// but that would make them incompatible with other uses and is discouraged. -// - -SocialCalc.FormatNumber.separatorchar = ","; -SocialCalc.FormatNumber.decimalchar = "."; -SocialCalc.FormatNumber.daynames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; -SocialCalc.FormatNumber.daynames3 = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; -SocialCalc.FormatNumber.monthnames3 = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; -SocialCalc.FormatNumber.monthnames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", - "October", "November", "December"]; - -SocialCalc.FormatNumber.allowedcolors = - {BLACK: "#000000", BLUE: "#0000FF", CYAN: "#00FFFF", GREEN: "#00FF00", MAGENTA: "#FF00FF", - RED: "#FF0000", WHITE: "#FFFFFF", YELLOW: "#FFFF00"}; - -SocialCalc.FormatNumber.alloweddates = - {H: "h]", M: "m]", MM: "mm]", S: "s]", SS: "ss]"}; - -// Other constants - -SocialCalc.FormatNumber.commands = - {copy: 1, color: 2, integer_placeholder: 3, fraction_placeholder: 4, decimal: 5, - currency: 6, general:7, separator: 8, date: 9, comparison: 10, section: 11, style: 12}; - -SocialCalc.FormatNumber.datevalues = {julian_offset: 2415019, seconds_in_a_day: 24 * 60 * 60, seconds_in_an_hour: 60 * 60}; - -/* ******************* - - result = SocialCalc.FormatNumber.formatNumberWithFormat = function(rawvalue, format_string, currency_char) - -************************* */ - -SocialCalc.FormatNumber.formatNumberWithFormat = function(rawvalue, format_string, currency_char) { - - var scc = SocialCalc.Constants; - var scfn = SocialCalc.FormatNumber; - - var op, operandstr, fromend, cval, operandstrlc; - var startval, estartval; - var hrs, mins, secs, ehrs, emins, esecs, ampmstr, ymd; - var minOK, mpos; - var result=""; - var thisformat; - var section, gotcomparison, compop, compval, cpos, oppos; - var sectioninfo; - var i, decimalscale, scaledvalue, strvalue, strparts, integervalue, fractionvalue; - var integerdigits2, integerpos, fractionpos, textcolor, textstyle, separatorchar, decimalchar; - var value; // working copy to change sign, etc. - - rawvalue = rawvalue-0; // make sure a number - value = rawvalue; - if (!isFinite(value)) return "NaN"; - - var negativevalue = value < 0 ? 1 : 0; // determine sign, etc. - if (negativevalue) value = -value; - var zerovalue = value == 0 ? 1 : 0; - - currency_char = currency_char || scc.FormatNumber_DefaultCurrency; - - scfn.parse_format_string(scfn.format_definitions, format_string); // make sure format is parsed - thisformat = scfn.format_definitions[format_string]; // Get format structure - - if (!thisformat) throw "Format not parsed error!"; - - section = thisformat.sectioninfo.length - 1; // get number of sections - 1 - - if (thisformat.hascomparison) { // has comparisons - determine which section - section = 0; // set to which section we will use - gotcomparison = 0; // this section has no comparison - for (cpos=0; ;cpos++) { // scan for comparisons - op = thisformat.operators[cpos]; - operandstr = thisformat.operands[cpos]; // get next operator and operand - if (!op) { // at end with no match - if (gotcomparison) { // if comparison but no match - format_string = "General"; // use default of General - scfn.parse_format_string(scfn.format_definitions, format_string); - thisformat = scfn.format_definitions[format_string]; - section = 0; - } - break; // if no comparision, matches on this section - } - if (op == scfn.commands.section) { // end of section - if (!gotcomparison) { // no comparison, so it's a match - break; - } - gotcomparison = 0; - section++; // check out next one - continue; - } - if (op == scfn.commands.comparison) { // found a comparison - do we meet it? - i=operandstr.indexOf(":"); - compop=operandstr.substring(0,i); - compval=operandstr.substring(i+1)-0; - if ((compop == "<" && rawvalue < compval) || - (compop == "<=" && rawvalue <= compval) || - (compop == "=" && rawvalue == compval) || - (compop == "<>" && rawvalue != compval) || - (compop == ">=" && rawvalue >= compval) || - (compop == ">" && rawvalue > compval)) { // a match - break; - } - gotcomparison = 1; - } - } - } - else if (section > 0) { // more than one section (separated by ";") - if (section == 1) { // two sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } - else { - section = 0; // use first for all others - } - } - else if (section == 2) { // three sections - if (negativevalue) { - negativevalue = 0; // sign will provided by section, not automatically - section = 1; // use second section for negative values - } - else if (zerovalue) { - section = 2; // use third section for zero values - } - else { - section = 0; // use first for positive - } - } - } - - sectioninfo = thisformat.sectioninfo[section]; // look at values for our section - - if (sectioninfo.commas > 0) { // scale by thousands - for (i=0; i 0) { // do percent scaling - for (i=0; i=0) { // converted to scientific notation - return rawvalue+""; // Just return plain converted raw value - } - - strparts=strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - if (!strparts) return "NaN"; // if not a number - integervalue = strparts[1]; - if (!integervalue || integervalue=="0") integervalue=""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - - if (sectioninfo.hasdate) { // there are date placeholders - if (rawvalue < 0) { // bad date - return "??-???-?? ??:??:??"; - } - startval = (rawvalue-Math.floor(rawvalue)) * scfn.datevalues.seconds_in_a_day; // get date/time parts - estartval = rawvalue * scfn.datevalues.seconds_in_a_day; // do elapsed time version, too - hrs = Math.floor(startval / scfn.datevalues.seconds_in_an_hour); - ehrs = Math.floor(estartval / scfn.datevalues.seconds_in_an_hour); - startval = startval - hrs * scfn.datevalues.seconds_in_an_hour; - mins = Math.floor(startval / 60); - emins = Math.floor(estartval / 60); - secs = startval - mins * 60; - decimalscale = 1; // round appropriately depending if there is ss.0 - for (i=0; i= 60) { // handle round up into next second, minute, etc. - secs = 0; - mins++; emins++; - if (mins >= 60) { - mins = 0; - hrs++; ehrs++; - if (hrs >= 24) { - hrs = 0; - rawvalue++; - } - } - } - fractionvalue = (secs-Math.floor(secs))+""; // for "hh:mm:ss.000" - fractionvalue = fractionvalue.substring(2); // skip "0." - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian(Math.floor(rawvalue+scfn.datevalues.julian_offset)); - - minOK = 0; // says "m" can be minutes if true - mspos = sectioninfo.sectionstart; // m scan position in ops - for ( ; ; mspos++) { // scan for "m" and "mm" to see if any minutes fields, and am/pm - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op==scfn.commands.section) break; - if (op==scfn.commands.date) { - if ((operandstr.toLowerCase()=="am/pm" || operandstr.toLowerCase()=="a/p") && !ampmstr) { - if (hrs >= 12) { - hrs -= 12; - ampmstr = operandstr.toLowerCase()=="a/p" ? scc.s_FormatNumber_pm1 : scc.s_FormatNumber_pm; // "P" : "PM"; - } - else { - ampmstr = operandstr.toLowerCase()=="a/p" ? scc.s_FormatNumber_am1 : scc.s_FormatNumber_am; // "A" : "AM"; - } - if (operandstr.indexOf(ampmstr)<0) - ampmstr = ampmstr.toLowerCase(); // have case match case in format - } - if (minOK && (operandstr=="m" || operandstr=="mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr.charAt(0)=="h") { - minOK = 1; // m following h or hh or [h] is minutes not months - } - else { - minOK = 0; - } - } - else if (op!=scfn.commands.copy) { // copying chars can be between h and m - minOK = 0; - } - } - minOK = 0; - for (--mspos; ; mspos--) { // scan other way for s after m - op = thisformat.operators[mspos]; - operandstr = thisformat.operands[mspos]; // get next operator and operand - if (!op) break; // don't go past end - if (op==scfn.commands.section) break; - if (op==scfn.commands.date) { - if (minOK && (operandstr=="m" || operandstr=="mm")) { - thisformat.operands[mspos] += "in"; // turn into "min" or "mmin" - } - if (operandstr=="ss") { - minOK = 1; // m before ss is minutes not months - } - else { - minOK = 0; - } - } - else if (op!=scfn.commands.copy) { // copying chars can be between ss and m - minOK = 0; - } - } - } - - integerdigits2 = 0; // init counters, etc. - integerpos = 0; - fractionpos = 0; - textcolor = ""; - textstyle = ""; - separatorchar = scc.FormatNumber_separatorchar; - if (separatorchar.indexOf(" ")>=0) separatorchar = separatorchar.replace(/ /g, " "); - decimalchar = scc.FormatNumber_decimalchar; - if (decimalchar.indexOf(" ")>=0) decimalchar = decimalchar.replace(/ /g, " "); - - oppos = sectioninfo.sectionstart; - - while (op = thisformat.operators[oppos]) { // execute format - operandstr = thisformat.operands[oppos++]; // get next operator and operand - - if (op == scfn.commands.copy) { // put char in result - result += operandstr; - } - - else if (op == scfn.commands.color) { // set color - textcolor = operandstr; - } - - else if (op == scfn.commands.style) { // set style - textstyle = operandstr; - } - - else if (op == scfn.commands.integer_placeholder) { // insert number part - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - integerdigits2++; - if (integerdigits2 == 1) { // first one - if (integervalue.length > sectioninfo.integerdigits) { // see if integer wider than field - for (;integerpos < (integervalue.length - sectioninfo.integerdigits); integerpos++) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - } - if (integervalue.length < sectioninfo.integerdigits - && integerdigits2 <= sectioninfo.integerdigits - integervalue.length) { // field is wider than value - if (operandstr == "0" || operandstr == "?") { // fill with appropriate characters - result += operandstr == "0" ? "0" : " "; - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = sectioninfo.integerdigits - integerdigits2; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - else { // normal integer digit - add it - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - integerpos++; - } - } - else if (op == scfn.commands.fraction_placeholder) { // add fraction part of number - if (fractionpos >= fractionvalue.length) { - if (operandstr == "0" || operandstr == "?") { - result += operandstr == "0" ? "0" : " "; - } - } - else { - result += fractionvalue.charAt(fractionpos); - } - fractionpos++; - } - - else if (op == scfn.commands.decimal) { // decimal point - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += decimalchar; - } - - else if (op == scfn.commands.currency) { // currency symbol - if (negativevalue) { - result += "-"; - negativevalue = 0; - } - result += operandstr; - } - - else if (op == scfn.commands.general) { // insert "General" conversion - - // *** Cut down number of significant digits to avoid floating point artifacts: - - if (value!=0) { // only if non-zero - var factor = Math.floor(Math.LOG10E * Math.log(value)); // get integer magnitude as a power of 10 - factor = Math.pow(10, 13-factor); // turn into scaling factor - value = Math.floor(factor * value + 0.5)/factor; // scale positive value, round, undo scaling - if (!isFinite(value)) return "NaN"; - } - if (negativevalue) { - result += "-"; - } - strvalue = value+""; // convert original value to string - if (strvalue.indexOf("e")>=0) { // converted to scientific notation - result += strvalue; - continue; - } - strparts=strvalue.match(/^\+{0,1}(\d*)(?:\.(\d*)){0,1}$/); // get integer and fraction parts - integervalue = strparts[1]; - if (!integervalue || integervalue=="0") integervalue=""; - fractionvalue = strparts[2]; - if (!fractionvalue) fractionvalue = ""; - integerpos = 0; - fractionpos = 0; - if (integervalue.length) { - for (;integerpos < integervalue.length; integerpos++) { - result += integervalue.charAt(integerpos); - if (sectioninfo.thousandssep) { // see if this is a separator position - fromend = integervalue.length - integerpos - 1; - if (fromend > 2 && fromend % 3 == 0) { - result += separatorchar; - } - } - } - } - else { - result += "0"; - } - if (fractionvalue.length) { - result += decimalchar; - for (;fractionpos < fractionvalue.length; fractionpos++) { - result += fractionvalue.charAt(fractionpos); - } - } - } - else if (op==scfn.commands.date) { // date placeholder - operandstrlc = operandstr.toLowerCase(); - if (operandstrlc=="y" || operandstrlc=="yy") { - result += (ymd.year+"").substring(2); - } - else if (operandstrlc=="yyyy") { - result += ymd.year+""; - } - else if (operandstrlc=="d") { - result += ymd.day+""; - } - else if (operandstrlc=="dd") { - cval = 1000 + ymd.day; - result += (cval+"").substr(2); - } - else if (operandstrlc=="ddd") { - cval = Math.floor(rawvalue+6) % 7; - result += scc.s_FormatNumber_daynames3[cval]; - } - else if (operandstrlc=="dddd") { - cval = Math.floor(rawvalue+6) % 7; - result += scc.s_FormatNumber_daynames[cval]; - } - else if (operandstrlc=="m") { - result += ymd.month+""; - } - else if (operandstrlc=="mm") { - cval = 1000 + ymd.month; - result += (cval+"").substr(2); - } - else if (operandstrlc=="mmm") { - result += scc.s_FormatNumber_monthnames3[ymd.month-1]; - } - else if (operandstrlc=="mmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month-1]; - } - else if (operandstrlc=="mmmmm") { - result += scc.s_FormatNumber_monthnames[ymd.month-1].charAt(0); - } - else if (operandstrlc=="h") { - result += hrs+""; - } - else if (operandstrlc=="h]") { - result += ehrs+""; - } - else if (operandstrlc=="mmin") { - cval = (1000 + mins)+""; - result += cval.substr(2); - } - else if (operandstrlc=="mm]") { - if (emins < 100) { - cval = (1000 + emins)+""; - result += cval.substr(2); - } - else { - result += emins+""; - } - } - else if (operandstrlc=="min") { - result += mins+""; - } - else if (operandstrlc=="m]") { - result += emins+""; - } - else if (operandstrlc=="hh") { - cval = (1000 + hrs)+""; - result += cval.substr(2); - } - else if (operandstrlc=="s") { - cval = Math.floor(secs); - result += cval+""; - } - else if (operandstrlc=="ss") { - cval = (1000 + Math.floor(secs))+""; - result += cval.substr(2); - } - else if (operandstrlc=="am/pm" || operandstrlc=="a/p") { - result += ampmstr; - } - else if (operandstrlc=="ss]") { - if (esecs < 100) { - cval = (1000 + Math.floor(esecs))+""; - result += cval.substr(2); - } - else { - cval = Math.floor(esecs); - result += cval+""; - } - } - } - else if (op == scfn.commands.section) { // end of section - break; - } - - else if (op == scfn.commands.comparison) { // ignore - continue; - } - - else { - result += "!! Parse error !!"; - } - } - - if (textcolor) { - result = ''+result+''; - } - if (textstyle) { - result = ''+result+''; - } - - return result; - - }; - -/* ******************* - - SocialCalc.FormatNumber.parse_format_string(format_defs, format_string) - - Takes a format string (e.g., "#,##0.00_);(#,##0.00)") and fills in format_defs with the parsed info - - format_defs - ["#,##0.0"]->{} - elements in the hash are one hash for each format - .operators->[] - array of operators from parsing the format string (each a number) - .operands->[] - array of corresponding operators (each usually a string) - .sectioninfo->[] - one hash for each section of the format - .start - .integerdigits - .fractiondigits - .commas - .percent - .thousandssep - .hasdates - .hascomparison - true if any section has [<100], etc. - -************************* */ - -SocialCalc.FormatNumber.parse_format_string = function(format_defs, format_string) { - - var scfn = SocialCalc.FormatNumber; - - var thisformat, section, sectionfinfo; - var integerpart = 1; // start out in integer part - var lastwasinteger; // last char was an integer placeholder - var lastwasslash; // last char was a backslash - escaping following character - var lastwasasterisk; // repeat next char - var lastwasunderscore; // last char was _ which picks up following char for width - var inquote, quotestr; // processing a quoted string - var inbracket, bracketstr, bracketdata; // processing a bracketed string - var ingeneral, gpos; // checks for characters "General" - var ampmstr, part; // checks for characters "A/P" and "AM/PM" - var indate; // keeps track of date/time placeholders - var chpos; // character position being looked at - var ch; // character being looked at - - if (format_defs[format_string]) return; // already defined - nothing to do - - thisformat = {operators: [], operands: [], sectioninfo: [{}]}; // create info structure for this format - format_defs[format_string] = thisformat; // add to other format definitions - - section = 0; // start with section 0 - sectioninfo = thisformat.sectioninfo[section]; // get reference to info for current section - sectioninfo.sectionstart = 0; // position in operands that starts this section - sectioninfo.integerdigits = 0; // number of integer-part placeholders - sectioninfo.fractiondigits = 0; // fraction placeholders - sectioninfo.commas = 0; // commas encountered, to handle scaling - sectioninfo.percent = 0; // times to scale by 100 - - for (chpos=0; chpos=0) { - indate = ch; - } - else { - lastwasinteger = 0; - thisformat.operators.push(scfn.commands.copy); - thisformat.operands.push(ch); - } - } - - if (indate) { // last char was part of unsaved date placeholder - thisformat.operators.push(scfn.commands.date); - thisformat.operands.push(indate); - sectioninfo.hasdate = 1; - } - - return; - - } - - -/* ******************* - - bracketdata = SocialCalc.FormatNumber.parse_format_bracket(bracketstr) - - Takes a bracket contents (e.g., "RED", ">10") and returns an operator and operand - - bracketdata->{} - .operator - .operand - -************************* */ - -SocialCalc.FormatNumber.parse_format_bracket = function(bracketstr) { - - var scfn = SocialCalc.FormatNumber; - var scc = SocialCalc.Constants; - - var bracketdata={}; - var parts; - - if (bracketstr.charAt(0)=='$') { // currency - bracketdata.operator = scfn.commands.currency; - parts=bracketstr.match(/^\$(.+?)(\-.+?){0,1}$/); - if (parts) { - bracketdata.operand = parts[1] || scc.FormatNumber_defaultCurrency || '$'; - } - else { - bracketdata.operand = bracketstr.substring(1) || scc.FormatNumber_defaultCurrency || '$'; - } - } - else if (bracketstr=='?$') { - bracketdata.operator = scfn.commands.currency; - bracketdata.operand = '[?$]'; - } - else if (scfn.allowedcolors[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.color; - bracketdata.operand = scfn.allowedcolors[bracketstr.toUpperCase()]; - } - else if (parts=bracketstr.match(/^style=([^"]*)$/)) { // [style=...] - bracketdata.operator = scfn.commands.style; - bracketdata.operand = parts[1]; - } - else if (bracketstr==",") { - bracketdata.operator = scfn.commands.separator; - bracketdata.operand = bracketstr; - } - else if (scfn.alloweddates[bracketstr.toUpperCase()]) { - bracketdata.operator = scfn.commands.date; - bracketdata.operand = scfn.alloweddates[bracketstr.toUpperCase()]; - } - else if (parts=bracketstr.match(/^[<>=]/)) { // comparison operator - parts=bracketstr.match(/^([<>=]+)(.+)$/); // split operator and value - bracketdata.operator = scfn.commands.comparison; - bracketdata.operand = parts[1]+":"+parts[2]; - } - else { // unknown bracket - bracketdata.operator = scfn.commands.copy; - bracketdata.operand = "["+bracketstr+"]"; - } - - return bracketdata; - - } - -/* ******************* - - juliandate = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, month, day) - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - - I= YEAR - J= MONTH - K= DAY -C - JD= K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12) - 2 /12-3*((I+4900+(J-14)/12)/100)/4 - -************************* */ - -SocialCalc.FormatNumber.convert_date_gregorian_to_julian = function(year, month, day) { - - var juliandate; - - juliandate = day-32075+SocialCalc.intFunc(1461*(year+4800+SocialCalc.intFunc((month-14)/12))/4); - juliandate += SocialCalc.intFunc(367*(month-2-SocialCalc.intFunc((month-14)/12)*12)/12); - juliandate = juliandate - SocialCalc.intFunc(3*SocialCalc.intFunc((year+4900+SocialCalc.intFunc((month-14)/12))/100)/4); - - return juliandate; - - } - - -/* ******************* - - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian(juliandate) - - ymd->{} - .year - .month - .day - - From: http://aa.usno.navy.mil/faq/docs/JD_Formula.html - Uses: Fliegel, H. F. and van Flandern, T. C. (1968). Communications of the ACM, Vol. 11, No. 10 (October, 1968). - Translated from the FORTRAN - -************************* */ - -SocialCalc.FormatNumber.convert_date_julian_to_gregorian = function(juliandate) { - - var L, N, I, J, K; - - L = juliandate+68569; - N = Math.floor(4*L/146097); - L = L-Math.floor((146097*N+3)/4); - I = Math.floor(4000*(L+1)/1461001); - L = L-Math.floor(1461*I/4)+31; - J = Math.floor(80*L/2447); - K = L-Math.floor(2447*J/80); - L = Math.floor(J/11); - J = J+2-12*L; - I = 100*(N-49)+I+L; - - return {year:I, month:J, day:K}; - - } - -SocialCalc.intFunc = function(n) { - if (n < 0) { - return -Math.floor(-n); - } - else { - return Math.floor(n); - } - } - diff --git a/Website/static/runappios43c/lib/aspiring/formula1.js b/Website/static/runappios43c/lib/aspiring/formula1.js deleted file mode 100755 index 15ecebc..0000000 --- a/Website/static/runappios43c/lib/aspiring/formula1.js +++ /dev/null @@ -1,4749 +0,0 @@ -// -/* -// SocialCalc Spreadsheet Formula Library -// -// Part of the SocialCalc package -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - - var SocialCalc; - if (!SocialCalc) SocialCalc = {}; // May be used with other SocialCalc libraries or standalone - // In any case, requires SocialCalc.Constants. - -SocialCalc.Formula = {}; - -// -// Formula constants for parsing: -// - - SocialCalc.Formula.ParseState = {num: 1, alpha: 2, coord: 3, string: 4, stringquote: 5, numexp1: 6, numexp2: 7, alphanumeric: 8, specialvalue:9}; - - SocialCalc.Formula.TokenType = {num: 1, coord: 2, op: 3, name: 4, error: 5, string: 6, space: 7}; - - SocialCalc.Formula.CharClass = {num: 1, numstart: 2, op: 3, eof: 4, alpha: 5, incoord: 6, error: 7, quote: 8, space: 9, specialstart: 10}; - - SocialCalc.Formula.CharClassTable = { - " ": 9, "!": 3, '"': 8, "#": 10, "$":6, "%":3, "&":3, "(": 3, ")": 3, "*": 3, "+": 3, ",": 3, "-": 3, ".": 2, "/": 3, - "0": 1, "1": 1, "2": 1, "3": 1, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "9": 1, - ":": 3, "<": 3, "=": 3, ">": 3, - "A": 5, "B": 5, "C": 5, "D": 5, "E": 5, "F": 5, "G": 5, "H": 5, "I": 5, "J": 5, "K": 5, "L": 5, "M": 5, "N": 5, - "O": 5, "P": 5, "Q": 5, "R": 5, "S": 5, "T": 5, "U": 5, "V": 5, "W": 5, "X": 5, "Y": 5, "Z": 5, - "^": 3, "_": 5, - "a": 5, "b": 5, "c": 5, "d": 5, "e": 5, "f": 5, "g": 5, "h": 5, "i": 5, "j": 5, "k": 5, "l": 5, "m": 5, "n": 5, - "o": 5, "p": 5, "q": 5, "r": 5, "s": 5, "t": 5, "u": 5, "v": 5, "w": 5, "x": 5, "y": 5, "z": 5 - }; - - SocialCalc.Formula.UpperCaseTable = { - "a": "A", "b": "B", "c": "C", "d": "D", "e": "E", "f": "F", "g": "G", "h": "H", "i": "I", "j": "J", "k": "K", "l": "L", "m": "M", - "n": "N", "o": "O", "p": "P", "q": "Q", "r": "R", "s": "S", "t": "T", "u": "U", "v": "V", "w": "W", "x": "X", "y": "Y", "z": "Z" - } - - SocialCalc.Formula.SpecialConstants = { // names that turn into constants for name lookup - "#NULL!": "0,e#NULL!", "#NUM!": "0,e#NUM!", "#DIV/0!": "0,e#DIV/0!", "#VALUE!": "0,e#VALUE!", - "#REF!": "0,e#REF!", "#NAME?": "0,e#NAME?"}; - - - // Operator Precedence table - // - // 1- !, 2- : ,, 3- M P, 4- %, 5- ^, 6- * /, 7- + -, 8- &, 9- < > = G(>=) L(<=) N(<>), - // Negative value means Right Associative - - SocialCalc.Formula.TokenPrecedence = { - "!": 1, - ":": 2, ",": 2, - "M": -3, "P": -3, - "%": 4, - "^": 5, - "*": 6, "/": 6, - "+": 7, "-": 7, - "&": 8, - "<": 9, ">": 9, "G": 9, "L": 9, "N": 9 - }; - - // Convert one-char token text to input text: - - SocialCalc.Formula.TokenOpExpansion = {'G': '>=', 'L': '<=', 'M': '-', 'N': '<>', 'P': '+'}; - - // - // Information about the resulting value types when doing operations on values (used by LookupResultType) - // - // Each object entry is an object with specific types with result type info as follows: - // - // 'type1a': '|type2a:resulta|type2b:resultb|... - // Type of t* or n* matches any of those types not listed - // Results may be a type or the numbers 1 or 2 specifying to return type1 or type2 - - - SocialCalc.Formula.TypeLookupTable = { - unaryminus: { 'n*': '|n*:1|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - unaryplus: { 'n*': '|n*:1|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - unarypercent: { 'n*': '|n:n%|n*:n|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - plus: { - 'n%': '|n%:n%|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nd': '|n%:n|nd:nd|nt:ndt|ndt:ndt|n$:n|n:nd|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nt': '|n%:n|nd:ndt|nt:nt|ndt:ndt|n$:n|n:nt|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'ndt': '|n%:n|nd:ndt|nt:ndt|ndt:ndt|n$:n|n:ndt|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'n$': '|n%:n|nd:n|nt:n|ndt:n|n$:n$|n:n$|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'nl': '|n%:n|nd:n|nt:n|ndt:n|n$:n|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'n': '|n%:n|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 'b': '|n%:n%|nd:nd|nt:nt|ndt:ndt|n$:n$|n:n|n*:n|b:n|e*:2|t*:e#VALUE!|', - 't*': '|n*:e#VALUE!|t*:e#VALUE!|b:e#VALUE!|e*:2|', - 'e*': '|e*:1|n*:1|t*:1|b:1|' - }, - concat: { - 't': '|t:t|th:th|tw:tw|tl:t|t*:2|e*:2|', - 'th': '|t:th|th:th|tw:t|tl:th|t*:t|e*:2|', - 'tw': '|t:tw|th:t|tw:tw|tl:tw|t*:t|e*:2|', - 'tl': '|t:tl|th:th|tw:tw|tl:tl|t*:t|e*:2|', - 'e*': '|e*:1|n*:1|t*:1|' - }, - oneargnumeric: { 'n*': '|n*:n|', 'e*': '|e*:1|', 't*': '|t*:e#VALUE!|', 'b': '|b:n|'}, - twoargnumeric: { 'n*': '|n*:n|t*:e#VALUE!|e*:2|', 'e*': '|e*:1|n*:1|t*:1|', 't*': '|t*:e#VALUE!|n*:e#VALUE!|e*:2|'}, - propagateerror: { 'n*': '|n*:2|e*:2|', 'e*': '|e*:2|', 't*': '|t*:2|e*:2|', 'b': '|b:2|e*:2|'} - }; - -/* ******************* - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(line) - - Parses a text string as if it was a spreadsheet formula - - This uses a simple state machine run on each character in turn. - States remember whether a number is being gathered, etc. - The result is parseinfo which is an array with one entry for each token: - parseinfo[i] = { - text: "the characters making up the parsed token", - type: the type of the token (a number), - opcode: a single character version of an operator suitable for use in the - precedence table and distinguishing between unary and binary + and -. - -************************* */ - -SocialCalc.Formula.ParseFormulaIntoTokens = function(line) { - - var i, ch, chclass, haddecimal, last_token, last_token_type, last_token_text, t; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var parsestate = scf.ParseState; - var tokentype = scf.TokenType; - var charclass = scf.CharClass; - var charclasstable = scf.CharClassTable; - var uppercasetable = scf.UpperCaseTable; // much faster than toUpperCase function - var pushtoken = scf.ParsePushToken; - var coordregex = /^\$?[A-Z]{1,2}\$?[1-9]\d*$/i; - - var parseinfo = []; - var str = ""; - var state = 0; - var haddecimal = false; - - for (i=0; i<=line.length; i++) { - if (i0) { - last_token = parseinfo[parseinfo.length-1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - if (last_token_type == charclass.op) { - if (last_token_text == '<' || last_token_text == ">") { - str = last_token_text + str; - parseinfo.pop(); - if (parseinfo.length>0) { - last_token = parseinfo[parseinfo.length-1]; - last_token_type = last_token.type; - last_token_text = last_token.text; - } - else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - } - } - } - else { - last_token_type = charclass.eof; - last_token_text = "EOF"; - } - t = tokentype.op; - if ((parseinfo.length == 0) - || (last_token_type == charclass.op && last_token_text != ')' && last_token_text != '%')) { // Unary operator - if (str == '-') { // M is unary minus - str = "M"; - ch = "M"; - } - else if (str == '+') { // P is unary plus - str = "P"; - ch = "P"; - } - else if (str == ')' && last_token_text == '(') { // null arg list OK - ; - } - else if (str != '(') { // binary-op open-paren OK, others no - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } - else if (str.length > 1) { - if (str == '>=') { // G is >= - str = "G"; - ch = "G"; - } - else if (str == '<=') { // L is <= - str = "L"; - ch = "L"; - } - else if (str == '<>') { // N is <> - str = "N"; - ch = "N"; - } - else { - t = tokentype.error; - str = scc.s_parseerrtwoops; - } - } - pushtoken(parseinfo, str, t, ch); - state = 0; - } - else if (cclass == charclass.quote) { // starting a string - str = ""; - state = parsestate.string; - } - else if (cclass == charclass.space) { // store so can reconstruct spacing - pushtoken(parseinfo, " ", tokentype.space, 0); - } - else if (cclass == charclass.eof) { // ignore -- needed to have extra loop to close out other things - } - else { // unknown class - such as unknown char - pushtoken(parseinfo, scc.s_parseerrchar, tokentype.error, 0); - } - } - } - - return parseinfo; - - } - -SocialCalc.Formula.ParsePushToken = function(parseinfo, ttext, ttype, topcode) { - - parseinfo.push({text: ttext, type: ttype, opcode: topcode}); - - } - -/* ******************* - - result = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, allowrangereturn) - - Does the calculation expressed in a parsed formula, returning a value, its type, and error info - returns: {value: value, type: valuetype, error: errortext}. - - If allowrangereturn is present and true, can return a range (e.g., "A1:A10" - translated from "A1|A10|") - -************************* */ - -SocialCalc.Formula.evaluate_parsed_formula = function(parseinfo, sheet, allowrangereturn) { - - var result; - - var scf = SocialCalc.Formula; - var tokentype = scf.TokenType; - - var revpolish; - var parsestack = []; - - var errortext = ""; - - revpolish = scf.ConvertInfixToPolish(parseinfo); // result is either an array or a string with error text - - result = scf.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn); - - return result; - -} - -// -// revpolish = SocialCalc.Formula.ConvertInfixToPolish(parseinfo) -// -// Convert infix to reverse polish notation -// -// Returns revpolish array with a sequence of references to tokens by number if successful. -// Errors return a string with the error. -// -// Based upon the algorithm shown in Wikipedia "Reverse Polish notation" article -// and then enhanced for additional spreadsheet things -// - -SocialCalc.Formula.ConvertInfixToPolish = function(parseinfo) { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var token_precedence = scf.TokenPrecedence; - - var revpolish = []; - var parsestack = []; - - var errortext = ""; - - var function_start = -1; - - var i, pii, ttype, ttext, tprecedence, tstackprecedence; - - for (i=0; i= 0 && tprecedence < tstackprecedence) { - break; - } - else if (tprecedence < 0) { - tprecedence = -tprecedence; - if (tstackprecedence < 0) tstackprecedence = -tstackprecedence; - if (tprecedence <= tstackprecedence) { - break; - } - } - revpolish.push(parsestack.pop()); - } - parsestack.push(i); - } - else if (ttype == tokentype.error) { - errortext = ttext; - break; - } - else { - errortext = "Internal error while processing parsed formula. "; - break; - } - } - while (parsestack.length>0) { - if (parseinfo[parsestack[parsestack.length-1]].text == '(') { - errortext = scc.s_parseerrmissingcloseparen; - break; - } - revpolish.push(parsestack.pop()); - } - - if (errortext) { - return errortext; - } - - return revpolish; - - } - - -// -// result = SocialCalc.Formula.EvaluatePolish(parseinfo, revpolish, sheet, allowrangereturn) -// -// Execute reverse polish representation of formula -// -// Operand values are objects in the operand array with a "type" and an optional "value". -// Type can have these values (many are type and sub-type as two or more letters): -// "tw", "th", "t", "n", "nt", "coord", "range", "start", "eErrorType", "b" (blank) -// The value of a coord is in the form A57 or A57!sheetname -// The value of a range is coord|coord|number where number starts at 0 and is -// the offset of the next item to fetch if you are going through the range one by one -// The number starts as a null string ("A1|B3|") -// - -SocialCalc.Formula.EvaluatePolish = function(parseinfo, revpolish, sheet, allowrangereturn) { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var tokentype = scf.TokenType; - var lookup_result_type = scf.LookupResultType; - var typelookup = scf.TypeLookupTable; - var operand_as_number = scf.OperandAsNumber; - var operand_as_text = scf.OperandAsText; - var operand_value_and_type = scf.OperandValueAndType; - var operands_as_coord_on_sheet = scf.OperandsAsCoordOnSheet; - var format_number_for_display = SocialCalc.format_number_for_display || function(v, t, f) {return v+"";}; - - var errortext = ""; - var function_start = -1; - var missingOperandError = {value: "", type: "e#VALUE!", error: scc.s_parseerrmissingoperand}; - - var operand = []; - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var i, rii, prii, ttype, ttext, value1, value2, tostype, tostype2, resulttype, valuetype, cond, vmatch, smatch; - - if (!parseinfo.length || (! (revpolish instanceof Array))) { - return ({value: "", type: "e#VALUE!", error: (typeof revpolish == "string" ? revpolish : "")}); - } - - for (i=0; i N (< <= = >= > <>) - - else if (ttext == "<" || ttext == "L" || ttext == "=" || ttext == "G" || ttext == ">" || ttext == "N") { - if (operand.length <= 1) { // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_value_and_type(sheet, operand); - value1 = operand_value_and_type(sheet, operand); - if (value1.type.charAt(0) == "n" && value2.type.charAt(0) == "n") { // compare two numbers - cond = 0; - if (ttext == "<") { cond = value1.value < value2.value ? 1 : 0; } - else if (ttext == "L") { cond = value1.value <= value2.value ? 1 : 0; } - else if (ttext == "=") { cond = value1.value == value2.value ? 1 : 0; } - else if (ttext == "G") { cond = value1.value >= value2.value ? 1 : 0; } - else if (ttext == ">") { cond = value1.value > value2.value ? 1 : 0; } - else if (ttext == "N") { cond = value1.value != value2.value ? 1 : 0; } - PushOperand("nl", cond); - } - else if (value1.type.charAt(0) == "e") { // error on left - PushOperand(value1.type, 0); - } - else if (value2.type.charAt(0) == "e") { // error on right - PushOperand(value2.type, 0); - } - else { // text maybe mixed with numbers or blank - tostype = value1.type.charAt(0); - tostype2 = value2.type.charAt(0); - if (tostype == "n") { - value1.value = format_number_for_display(value1.value, "n", ""); - } - else if (tostype == "b") { - value1.value = ""; - } - if (tostype2 == "n") { - value2.value = format_number_for_display(value2.value, "n", ""); - } - else if (tostype2 == "b") { - value2.value = ""; - } - cond = 0; - value1.value = value1.value.toLowerCase(); // ignore case - value2.value = value2.value.toLowerCase(); - if (ttext == "<") { cond = value1.value < value2.value ? 1 : 0; } - else if (ttext == "L") { cond = value1.value <= value2.value ? 1 : 0; } - else if (ttext == "=") { cond = value1.value == value2.value ? 1 : 0; } - else if (ttext == "G") { cond = value1.value >= value2.value ? 1 : 0; } - else if (ttext == ">") { cond = value1.value > value2.value ? 1 : 0; } - else if (ttext == "N") { cond = value1.value != value2.value ? 1 : 0; } - PushOperand("nl", cond); - } - } - - // Normal infix arithmethic operators: +, -. *, /, ^ - - else { // what's left are the normal infix arithmetic operators - if (operand.length <= 1) { // Need at least two things on the stack... - errortext = scc.s_parseerrmissingoperand; // remember error - break; - } - value2 = operand_as_number(sheet, operand); - value1 = operand_as_number(sheet, operand); - if (ttext == '+') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value + value2.value); - } - else if (ttext == '-') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value - value2.value); - } - else if (ttext == '*') { - resulttype = lookup_result_type(value1.type, value2.type, typelookup.plus); - PushOperand(resulttype, value1.value * value2.value); - } - else if (ttext == '/') { - if (value2.value != 0) { - PushOperand("n", value1.value / value2.value); // gives plain numeric result type - } - else { - PushOperand("e#DIV/0!", 0); - } - } - else if (ttext == '^') { - value1.value = Math.pow(value1.value, value2.value); - value1.type = "n"; // gives plain numeric result type - if (isNaN(value1.value)) { - value1.value = 0; - value1.type = "e#NUM!"; - } - PushOperand(value1.type, value1.value); - } - } - } - - // function or name - - else if (ttype == tokentype.name) { - errortext = scf.CalculateFunction(ttext, operand, sheet); - if (errortext) break; - } - - else { - errortext = scc.s_InternalError+"Unknown token "+ttype+" ("+ttext+"). "; - break; - } - } - - // look at final value and handle special cases - - value = operand[0] ? operand[0].value : ""; - tostype = operand[0] ? operand[0].type : ""; - - if (tostype == "name") { // name - expand it - value1 = SocialCalc.Formula.LookupName(sheet, value); - value = value1.value; - tostype = value1.type; - errortext = errortext || value1.error; - } - - if (tostype == "coord") { // the value is a coord reference, get its value and type - value1 = operand_value_and_type(sheet, operand); - value = value1.value; - tostype = value1.type; - if (tostype == "b") { - tostype = "n"; - value = 0; - } - } - - if (operand.length > 1 && !errortext) { // something left - error - errortext += scc.s_parseerrerrorinformula; - } - - // set return type - - valuetype = tostype; - - if (tostype.charAt(0) == "e") { // error value - errortext = errortext || tostype.substring(1) || scc.s_calcerrerrorvalueinformula; - } - else if (tostype == "range") { - vmatch = value.match(/^(.*)\|(.*)\|/); - smatch = vmatch[1].indexOf("!"); - if (smatch>=0) { // swap sheetname - vmatch[1] = vmatch[1].substring(smatch+1) + "!" + vmatch[1].substring(0, smatch).toUpperCase(); - } - else { - vmatch[1] = vmatch[1].toUpperCase(); - } - value = vmatch[1] + ":" + vmatch[2].toUpperCase(); - if (!allowrangereturn) { - errortext = scc.s_formularangeresult+" "+value; - } - } - - if (errortext && valuetype.charAt(0) != "e") { - value = errortext; - valuetype = "e"; - } - - // look for overflow - - if (valuetype.charAt(0) == "n" && (isNaN(value) || !isFinite(value))) { - value = 0; - valuetype = "e#NUM!"; - errortext = isNaN(value) ? scc.s_calcerrnumericnan: scc.s_calcerrnumericoverflow; - } - - return ({value: value, type: valuetype, error: errortext}); - - } - - -/* -# -# resulttype = SocialCalc.Formula.LookupResultType(type1, type2, typelookup); -# -# typelookup has values of the following form: -# -# typelookup{"typespec1"} = "|typespec2A:resultA|typespec2B:resultB|..." -# -# First type1 is looked up. If no match, then the first letter (major type) of type1 plus "*" is looked up -# resulttype is type1 if result is "1", type2 if result is "2", otherwise the value of result. -# -*/ - -SocialCalc.Formula.LookupResultType = function(type1, type2, typelookup) { - - var pos1, pos2, result; - - var table1 = typelookup[type1]; - - if (!table1) { - table1 = typelookup[type1.charAt(0)+'*']; - if (!table1) { - return "e#VALUE! (internal error, missing LookupResultType "+type1.charAt(0)+"*)"; // missing from table -- please add it - } - } - pos1 = table1.indexOf("|"+type2+":"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1+1); - if (pos2<0) return "e#VALUE! (internal error, incorrect LookupResultType "+table1+")"; - result = table1.substring(pos1+type2.length+2, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - pos1 = table1.indexOf("|"+type2.charAt(0)+"*:"); - if (pos1 >= 0) { - pos2 = table1.indexOf("|", pos1+1); - if (pos2<0) return "e#VALUE! (internal error, incorrect LookupResultType "+table1+")"; - result = table1.substring(pos1+4, pos2); - if (result == "1") return type1; - if (result == "2") return type2; - return result; - } - return "e#VALUE!"; - - } - -/* -# -# operandinfo = SocialCalc.Formula.TopOfStackValueAndType(sheet, operand) -# -# Returns top of stack value and type and then pops the stack. -# The result is {value: value, type: type, error: "only if bad error"} -# -*/ - -SocialCalc.Formula.TopOfStackValueAndType = function(sheet, operand) { - - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - if (!stacklen) { // make sure something is there - result.error = SocialCalc.Constants.s_InternalError+"no operand on stack"; - return result; - } - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - return result; - - } - - -/* -# -# operandinfo = OperandAsNumber(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns numeric value and type. -# Text values are treated as 0 if they can't be converted somehow. -# -*/ - -SocialCalc.Formula.OperandAsNumber = function(sheet, operand) { - - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "n") { - operandinfo.value = operandinfo.value-0; - } - else if (t == "b") { // blank cell - operandinfo.type = "n"; - operandinfo.value = 0; - } - else if (t == "e") { // error - operandinfo.value = 0; - } - else { - valueinfo = SocialCalc.DetermineValueType ? SocialCalc.DetermineValueType(operandinfo.value) : - {value: operandinfo.value-0, type: "n"}; // if without rest of SocialCalc - if (valueinfo.type.charAt(0) == "n") { - operandinfo.value = valueinfo.value-0; - operandinfo.type = valueinfo.type; - } - else { - operandinfo.value = 0; - operandinfo.type = valueinfo.type; - } - } - - return operandinfo; - - } - -/* -# -# operandinfo = OperandAsText(sheet, operand) -# -# Uses operand_value_and_type to get top of stack and pops it. -# Returns text value, preserving sub-type. -# -*/ - -SocialCalc.Formula.OperandAsText = function(sheet, operand) { - - var t, valueinfo; - var operandinfo = SocialCalc.Formula.OperandValueAndType(sheet, operand); - - t = operandinfo.type.charAt(0); - - if (t == "t") { // any flavor of text returns as is - ; - } - else if (t == "n") { - operandinfo.value = SocialCalc.format_number_for_display ? - SocialCalc.format_number_for_display(operandinfo.value, operandinfo.type, "") : - operandinfo.value = operandinfo.value+""; - operandinfo.type = "t"; - } - else if (t == "b") { // blank - operandinfo.value = ""; - operandinfo.type = "t"; - } - else if (t == "e") { // error - operandinfo.value = ""; - } - else { - operand.value = operandinfo.value + ""; - operand.type = "t"; - } - - return operandinfo; - - } - -/* -# -# result = SocialCalc.Formula.OperandValueAndType(sheet, operand) -# -# Pops the top of stack and returns it, following a coord reference if necessary. -# The result is {value: value, type: type, error: "only if bad error"} -# Ranges are returned as if they were pushed onto the stack first coord first -# Also sets type with "t", "n", "th", etc., as appropriate -# -*/ - -SocialCalc.Formula.OperandValueAndType = function(sheet, operand) { - - var cellvtype, cell, pos, coordsheet; - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - if (!stacklen) { // make sure something is there - result.error = SocialCalc.Constants.s_InternalError+"no operand on stack"; - return result; - } - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - if (result.type == "name") { - result = scf.LookupName(sheet, result.value); - } - - if (result.type == "range") { - result = scf.StepThroughRangeDown(operand, result.value); - } - - if (result.type == "coord") { // value is a coord reference - coordsheet = sheet; - pos = result.value.indexOf("!"); - if (pos != -1) { // sheet reference - coordsheet = scf.FindInSheetCache(result.value.substring(pos+1)); // get other sheet - if (coordsheet == null) { // unavailable - result.type = "e#REF!"; - result.error = SocialCalc.Constants.s_sheetunavailable+" "+result.value.substring(pos+1); - result.value = 0; - return result; - } - result.value = result.value.substring(0, pos); // get coord part - } - - if (coordsheet) { - cell = coordsheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - cellvtype = cell.valuetype; // get type of value in the cell it points to - result.value = cell.datavalue; - } - else { - cellvtype = "b"; - } - } - else { - cellvtype = "e#N/A"; - result.value = 0; - } - result.type = cellvtype || "b"; - if (result.type == "b") { // blank - result.value = 0; - } - } - - return result; - - } - -/* -# -# operandinfo = SocialCalc.Formula.OperandAsCoord(sheet, operand) -# -# Gets top of stack and pops it. -# Returns coord value. All others are treated as an error. -# -*/ - - -SocialCalc.Formula.OperandAsCoord = function(sheet, operand) { - - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - result = SocialCalc.Formula.LookupName(sheet, result.value); - } - if (result.type == "coord") { // value is a coord reference - return result; - } - else { - result.value = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - return result; - } -} - - -/* -# -# result = SocialCalc.Formula.OperandsAsCoordOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as sheetname!coord-or-name. -# Returns stack-style coord value (coord!sheetname, or coord!sheetname|coord|) with -# a type of coord or range. All others are treated as an error. -# If sheetname not available, sets result.error. -# -*/ - -SocialCalc.Formula.OperandsAsCoordOnSheet = function(sheet, operand) { - - var sheetname, othersheet, pos1, pos2; - var value1 = {}; - var result = {}; - var scf = SocialCalc.Formula; - - var stacklen = operand.length; - value1.value = operand[stacklen-1].value; // get top of stack - coord or name - value1.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - sheetname = scf.OperandAsSheetName(sheet, operand); // get sheetname as text - othersheet = scf.FindInSheetCache(sheetname.value); - if (othersheet == null) { // unavailable - result.type = "e#REF!"; - result.value = 0; - result.error = SocialCalc.Constants.s_sheetunavailable+" "+sheetname.value; - return result; - } - - if (value1.type == "name") { - value1 = scf.LookupName(othersheet, value1.value); - } - result.type = value1.type; - if (value1.type == "coord") { // value is a coord reference - result.value = value1.value + "!" + sheetname.value; // return in the format as used on stack - } - else if (value1.type == "range") { // value is a range reference - pos1 = value1.value.indexOf("|"); - pos2 = value1.value.indexOf("|", pos1+1); - result.value = value1.value.substring(0, pos1) + "!" + sheetname.value + - "|" + value1.value.substring(pos1+1, pos2) + "|"; - } - else if (value1.type.charAt(0)=="e") { - result.value = value1.value; - } - else { - result.error = SocialCalc.Constants.s_calcerrcellrefmissing; - result.type = "e#REF!"; - result.value = 0; - } - return result; - - } - -/* -# -# result = SocialCalc.Formula.OperandsAsRangeOnSheet(sheet, operand) -# -# Gets 2 at top of stack and pops them, treating them as coord2-or-name:coord1. -# Name is evaluated on sheet of coord1. -# Returns result with "value" of stack-style range value (coord!sheetname|coord|) and -# "type" of "range". All others are treated as an error. -# -*/ - -SocialCalc.Formula.OperandsAsRangeOnSheet = function(sheet, operand) { - - var value1, othersheet, pos1, pos2; - var value2 = {}; - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var stacklen = operand.length; - value2.value = operand[stacklen-1].value; // get top of stack - coord or name for "right" side - value2.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - - value1 = scf.OperandAsCoord(sheet, operand); // get "left" coord - if (value1.type != "coord") { // not a coord, which it must be - return {value: 0, type: "e#REF!"}; - } - - othersheet = sheet; - pos1 = value1.value.indexOf("!"); - if (pos1 != -1) { // sheet reference - pos2 = value1.value.indexOf("|", pos1+1); - if (pos2 < 0) pos2 = value1.value.length; - othersheet = scf.FindInSheetCache(value1.value.substring(pos1+1,pos2)); // get other sheet - if (othersheet == null) { // unavailable - return {value: 0, type: "e#REF!", errortext: scc.s_sheetunavailable+" "+value1.value.substring(pos1+1,pos2)}; - } - } - - if (value2.type == "name") { // coord:name is allowed, if name is just one cell - value2 = scf.LookupName(othersheet, value2.value); - } - - if (value2.type == "coord") { // value is a coord reference, so return the combined range - return {value: value1.value+"|"+value2.value+"|", type: "range"}; // return range in the format as used on stack - } - else { // bad form - return {value: scc.s_calcerrcellrefmissing, type: "e#REF!"}; - } - } - - -/* -# -# result = SocialCalc.Formula.OperandAsSheetName(sheet, operand) -# -# Gets top of stack and pops it. -# Returns sheetname value. All others are treated as an error. -# Accepts text, cell reference, and named value which is one of those two. -# -*/ - -SocialCalc.Formula.OperandAsSheetName = function(sheet, operand) { - - var nvalue, cell; - - var scf = SocialCalc.Formula; - - var result = {type: "", value: ""}; - - var stacklen = operand.length; - - result.value = operand[stacklen-1].value; // get top of stack - result.type = operand[stacklen-1].type; - operand.pop(); // we have data - pop stack - if (result.type == "name") { - nvalue = SocialCalc.Formula.LookupName(sheet, result.value); - if (!nvalue.value) { // not a known name - return bare name as the name value - return result; - } - result.value = nvalue.value; - result.type = nvalue.type; - } - if (result.type == "coord") { // value is a coord reference, follow it to find sheet name - cell = sheet.cells[SocialCalc.Formula.PlainCoord(result.value)]; - if (cell) { - result.value = cell.datavalue; - result.type = cell.valuetype; - } - else { - result.value = ""; - result.type = "b"; - } - } - if (result.type.charAt(0) == "t") { // value is a string which could be a sheet name - return result; - } - else { - result.value = ""; - result.error = SocialCalc.Constants.s_calcerrsheetnamemissing; - return result; - } - - } - -// -// value = SocialCalc.Formula.LookupName(sheet, name) -// -// Returns value and type of a named value -// Names are case insensitive -// Names may have a definition which is a coord (A1), a range (A1:B7), or a formula (=OFFSET(A1,0,0,5,1)) -// Note: The range must not have sheet names ("!") in them. -// - -SocialCalc.Formula.LookupName = function(sheet, name) { - - var pos, specialc, parseinfo; - var names = sheet.names; - var value = {}; - var startedwalk = false; - - if (names[name.toUpperCase()]) { // is name defined? - - value.value = names[name.toUpperCase()].definition; // yes - - if (value.value.charAt(0) == "=") { // formula - if (!sheet.checknamecirc) { // are we possibly walking the name tree? - sheet.checknamecirc = {}; // not yet - startedwalk = true; // remember we are the reference that started it - } - else { - if (sheet.checknamecirc[name]) { // circular reference - value.type = "e#NAME?"; - value.error = SocialCalc.Constants.s_circularnameref+' "' + name + '".'; - return value; - } - } - sheet.checknamecirc[name] = true; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(value.value.substring(1)); - value = SocialCalc.Formula.evaluate_parsed_formula(parseinfo, sheet, 1); // parse formula, allowing range return - - delete sheet.checknamecirc[name]; // done with us - if (startedwalk) { - delete sheet.checknamecirc; // done with walk - } - - if (value.type != "range") { - return value; - } - } - - pos = value.value.indexOf(":"); - if (pos != -1) { // range - value.type = "range"; - value.value = value.value.substring(0, pos) + "|" + value.value.substring(pos+1)+"|"; - value.value = value.value.toUpperCase(); - } - else { - value.type = "coord"; - value.value = value.value.toUpperCase(); - } - return value; - } - else if (specialc=SocialCalc.Formula.SpecialConstants[name.toUpperCase()]) { // special constant, like #REF! - pos = specialc.indexOf(","); - value.value = specialc.substring(0,pos)-0; - value.type = specialc.substring(pos+1); - return value; - } - else { - value.value = ""; - value.type = "e#NAME?"; - value.error = SocialCalc.Constants.s_calcerrunknownname+' "'+name+'"'; - return value; - } - } - -/* -# -# coord = SocialCalc.Formula.StepThroughRangeDown(operand, rangevalue) -# -# Returns next coord in a range, keeping track on the operand stack -# Goes from upper left across and down to bottom right. -# -*/ - -SocialCalc.Formula.StepThroughRangeDown = function(operand, rangevalue) { - - var value1, value2, sequence, pos1, pos2, sheet1, rp, c, r, count; - var scf = SocialCalc.Formula; - - pos1 = rangevalue.indexOf("|"); - pos2 = rangevalue.indexOf("|", pos1+1); - value1 = rangevalue.substring(0, pos1); - value2 = rangevalue.substring(pos1+1, pos2); - sequence = rangevalue.substring(pos2+1) - 0; - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1); - value1 = value1.substring(0, pos1); - } - else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - rp = scf.OrderRangeParts(value1, value2); - - count = 0; - for (r=rp.r1; r<=rp.r2; r++) { - for (c=rp.c1; c<=rp.c2; c++) { - count++; - if (count > sequence) { - if (r!=rp.r2 || c!=rp.c2) { // keep on stack until done - scf.PushOperand(operand, "range", value1+sheet1+"|"+value2+"|"+count); - } - return {value: SocialCalc.crToCoord(c, r)+sheet1, type: "coord"}; - } - } - } - } - -/* -# -# result = SocialCalc.Formula.DecodeRangeParts(sheetdata, range) -# -# Returns sheetdata for the sheet where the range is, as well as -# the number of the first column in the range, the number of columns, -# and equivalent row information: -# -# {sheetdata: sheet, sheetname: name-or-"", col1num: n, ncols: n, row1num: n, nrows: n} -# -# If any errors, a null result is returned. -# -*/ - -SocialCalc.Formula.DecodeRangeParts = function(sheetdata, range) { - - var value1, value2, pos1, pos2, sheet1, coordsheetdata, rp; - - var scf = SocialCalc.Formula; - - pos1 = range.indexOf("|"); - pos2 = range.indexOf("|", pos1+1); - value1 = range.substring(0, pos1); - value2 = range.substring(pos1+1, pos2); - - pos1 = value1.indexOf("!"); - if (pos1 != -1) { - sheet1 = value1.substring(pos1+1); - value1 = value1.substring(0, pos1); - } - else { - sheet1 = ""; - } - pos1 = value2.indexOf("!"); - if (pos1 != -1) { - value2 = value2.substring(0, pos1); - } - - coordsheetdata = sheetdata; - if (sheet1) { // sheet reference - coordsheetdata = scf.FindInSheetCache(sheet1); - if (coordsheetdata == null) { // unavailable - return null; - } - } - - rp = scf.OrderRangeParts(value1, value2); - - return {sheetdata: coordsheetdata, sheetname: sheet1, col1num: rp.c1, ncols: rp.c2-rp.c1+1, row1num: rp.r1, nrows: rp.r2-rp.r1+1} - - } - - -//********************* -// -// Function Handling -// -//********************* - -// List of functions -- Define after functions are defined -// -// SocialCalc.Formula.FunctionList["function_name"] = [function_subroutine, number_of_arguments, arg_def, func_def, func_class] -// function_subroutine takes arguments (fname, operand, foperand, sheet), returns -// errortext or null, pushing result on operand stack. -// number_of_arguments is: -// 0 = no arguments -// >0 = exactly that many arguments -// <0 = that many arguments (abs value) or more -// 100 = don't check -// -// arg_def, if present, is the name of the element in SocialCalc.Formula.FunctionArgDefs. -// func_def, if present, is a string explaining the function. If not, looked up in SocialCalc.Constants. -// func_class, if present, is the comma-separated names of the elements in SocialCalc.Formula.FunctionClasses. -// -// To add a function, just add it to this object. - - if (!SocialCalc.Formula.FunctionList) { // make sure it is defined (could have been in another module) - SocialCalc.Formula.FunctionList = {}; - } - - // FunctionClasses[classname] = {name: full-name-string, items: [sorted list of function names]}; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionClasses = null; // start null to say needs filling in - - // FunctionArgDef[argname] = explicit-string-for-arg-list; - // filled in by SocialCalc.Formula.FillFunctionInfo - - SocialCalc.Formula.FunctionArgDefs = {}; - - -/* -# -# errortext = SocialCalc.Formula.CalculateFunction(fname, operand, sheet) -# -# Dispatches for function fname. -# -*/ - -SocialCalc.Formula.CalculateFunction = function(fname, operand, sheet) { - - var fobj, foperand, ffunc, argnum, ttext; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = ""; - - fobj = scf.FunctionList[fname]; - - if (fobj) { - foperand = []; - ffunc = fobj[0]; - argnum = fobj[1]; - scf.CopyFunctionArgs(operand, foperand); - if (argnum != 100) { - if (argnum < 0) { - if (foperand.length < -argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } - else { - if (foperand.length != argnum) { - errortext = scf.FunctionArgsError(fname, operand); - return errortext; - } - } - } - errortext = ffunc(fname, operand, foperand, sheet); - } - - else { - ttext = fname; - - if (operand.length && operand[operand.length-1].type == "start") { // no arguments - name or zero arg function - operand.pop(); - scf.PushOperand(operand, "name", ttext); - } - - else { - errortext = SocialCalc.Constants.s_sheetfuncunknownfunction+" " + ttext +". "; - } - } - - return errortext; - -} - -// -// SocialCalc.Formula.PushOperand(operand, t, v) -// -// Pushes the type and value onto the operand stack -// - -SocialCalc.Formula.PushOperand = function(operand, t, v) { - - operand.push({type: t, value: v}); - - } - -// -// SocialCalc.Formula.CopyFunctionArgs(operand, foperand) -// -// Pops operands from operand and pushes on foperand up to function start -// reversing order in the process. -// - -SocialCalc.Formula.CopyFunctionArgs = function(operand, foperand) { - - var fobj, foperand, ffunc, argnum; - var scf = SocialCalc.Formula; - var ok = 1; - var errortext = null; - - while (operand.length>0 && operand[operand.length-1].type != "start") { // get each arg - foperand.push(operand.pop()); // copy it - } - operand.pop(); // get rid of "start" - - return; - - } - -// -// errortext = SocialCalc.Formula.FunctionArgsError(fname, operand) -// -// Pushes appropriate error on operand stack and returns errortext, including fname -// - -SocialCalc.Formula.FunctionArgsError = function(fname, operand) { - - var errortext = SocialCalc.Constants.s_calcerrincorrectargstofunction+" " + fname + ". "; - SocialCalc.Formula.PushOperand(operand, "e#VALUE!", errortext); - - return errortext; - - } - - -// -// errortext = SocialCalc.Formula.FunctionSpecificError(fname, operand, errortype, errortext) -// -// Pushes specified error and text on operand stack. -// - -SocialCalc.Formula.FunctionSpecificError = function(fname, operand, errortype, errortext) { - - SocialCalc.Formula.PushOperand(operand, errortype, errortext); - - return errortext; - - } - -// -// haserror = SocialCalc.Formula.CheckForErrorValue(operand, v) -// -// If v.type is an error, push it on operand stack and return true, otherwise return false. -// - -SocialCalc.Formula.CheckForErrorValue = function(operand, v) { - - if (v.type.charAt(0) == "e") { - operand.push(v); - return true; - } - else { - return false; - } - - } - -///////////////////////// -// -// FUNCTION INFORMATION ROUTINES -// - -// -// SocialCalc.Formula.FillFunctionInfo() -// -// Goes through function definitions and fills out FunctionArgDefs and FunctionClasses. -// Execute this after any changes to SocialCalc.Constants but before UI is used. -// - -SocialCalc.Formula.FillFunctionInfo = function() { - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - - var fname, f, classes, cname, i; - - if (scf.FunctionClasses) { // only do once - return; - } - - for (fname in scf.FunctionList) { - f = scf.FunctionList[fname]; - if (f[2]) { // has an arg def - scf.FunctionArgDefs[f[2]] = scc["s_farg_"+f[2]] || ""; // get it from constants - } - if (!f[3]) { // no text def, see if in constants - if (scc["s_fdef_"+fname]) { - scf.FunctionList[fname][3] = scc["s_fdef_"+fname]; - } - } - } - - scf.FunctionClasses = {}; - - for (i=0; i 0) { - str = "v1"; - for (i=2; i<=nargs; i++) { - str += ", v"+i; - } - return str; - } - else if (nargs < 0) { - str = "v1"; - for (i=2; i<-nargs; i++) { - str += ", v"+i; - } - return str+", ..."; - } - else { - return "nargs: "+nargs; - } - } - - str = scf.FunctionArgDefs[adef] || adef; - - return str; - - } - - -///////////////////////// -// -// FUNCTION DEFINITIONS -// -// The standard function definitions follow. -// -// Note that some need SocialCalc.DetermineValueType to be defined. -// - -/* -# -# AVERAGE(v1,c1:c2,...) -# COUNT(v1,c1:c2,...) -# COUNTA(v1,c1:c2,...) -# COUNTBLANK(v1,c1:c2,...) -# MAX(v1,c1:c2,...) -# MIN(v1,c1:c2,...) -# PRODUCT(v1,c1:c2,...) -# STDEV(v1,c1:c2,...) -# STDEVP(v1,c1:c2,...) -# SUM(v1,c1:c2,...) -# VAR(v1,c1:c2,...) -# VARP(v1,c1:c2,...) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the dseries_functions, too. -# -*/ - -SocialCalc.Formula.SeriesFunctions = function(fname, operand, foperand, sheet) { - - var value1, t, v1; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - while (foperand.length > 0) { - value1 = operand_value_and_type(sheet, foperand); - t = value1.type.charAt(0); - if (t == "n") count += 1; - if (t != "b") counta += 1; - if (t == "b") countblank += 1; - - if (t == "n") { - v1 = value1.value-0; // get it as a number - sum += v1; - product *= v1; - maxval = (maxval!=undefined) ? (v1 > maxval ? v1 : maxval) : v1; - minval = (minval!=undefined) ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } - else { // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type(value1.type, resulttypesum || value1.type, typelookupplus); - } - else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "SUM": - PushOperand(resulttypesum, sum); - break; - - case "PRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "MIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "MAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "COUNT": - PushOperand("n", count); - break; - - case "COUNTA": - PushOperand("n", counta); - break; - - case "COUNTBLANK": - PushOperand("n", countblank); - break; - - case "AVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum/count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "STDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "VARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - } - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["AVERAGE"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNT"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNTA"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["COUNTBLANK"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["MAX"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["MIN"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["PRODUCT"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["STDEV"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["STDEVP"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["SUM"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["VAR"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; -SocialCalc.Formula.FunctionList["VARP"] = [SocialCalc.Formula.SeriesFunctions, -1, "vn", null, "stat"]; - -/* -# -# DAVERAGE(databaserange, fieldname, criteriarange) -# DCOUNT(databaserange, fieldname, criteriarange) -# DCOUNTA(databaserange, fieldname, criteriarange) -# DGET(databaserange, fieldname, criteriarange) -# DMAX(databaserange, fieldname, criteriarange) -# DMIN(databaserange, fieldname, criteriarange) -# DPRODUCT(databaserange, fieldname, criteriarange) -# DSTDEV(databaserange, fieldname, criteriarange) -# DSTDEVP(databaserange, fieldname, criteriarange) -# DSUM(databaserange, fieldname, criteriarange) -# DVAR(databaserange, fieldname, criteriarange) -# DVARP(databaserange, fieldname, criteriarange) -# -# Calculate all of these and then return the desired one (overhead is in accessing not calculating) -# If this routine is changed, check the series_functions, too. -# -*/ - -SocialCalc.Formula.DSeriesFunctions = function(fname, operand, foperand, sheet) { - - var value1, tostype, cr, dbrange, fieldname, criteriarange, dbinfo, criteriainfo; - var fieldasnum, targetcol, i, j, k, cell, criteriafieldnums; - var testok, criteriacr, criteria, testcol, testcr; - var t; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - var value1 = {}; - - var sum = 0; - var resulttypesum = ""; - var count = 0; - var counta = 0; - var countblank = 0; - var product = 1; - var maxval; - var minval; - var mk, sk, mk1, sk1; // For variance, etc.: M sub k, k-1, and S sub k-1 - // as per Knuth "The Art of Computer Programming" Vol. 2 3rd edition, page 232 - - dbrange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - fieldname = scf.OperandValueAndType(sheet, foperand); // get a value - criteriarange = scf.TopOfStackValueAndType(sheet, foperand); // get a range - - if (dbrange.type != "range" || criteriarange.type != "range") { - return scf.FunctionArgsError(fname, operand); - } - - dbinfo = scf.DecodeRangeParts(sheet, dbrange.value); - criteriainfo = scf.DecodeRangeParts(sheet, criteriarange.value); - - fieldasnum = scf.FieldToColnum(dbinfo.sheetdata, dbinfo.col1num, dbinfo.ncols, dbinfo.row1num, fieldname.value, fieldname.type); - if (fieldasnum <= 0) { - PushOperand("e#VALUE!", 0); - return; - } - - targetcol = dbinfo.col1num + fieldasnum - 1; - criteriafieldnums = []; - - for (i=0; i maxval ? v1 : maxval) : v1; - minval = (minval!=undefined) ? (v1 < minval ? v1 : minval) : v1; - if (count == 1) { // initialize with first values for variance used in STDEV, VAR, etc. - mk1 = v1; - sk1 = 0; - } - else { // Accumulate S sub 1 through n as per Knuth noted above - mk = mk1 + (v1 - mk1) / count; - sk = sk1 + (v1 - mk1) * (v1 - mk); - sk1 = sk; - mk1 = mk; - } - resulttypesum = lookup_result_type(value1.type, resulttypesum || value1.type, typelookupplus); - } - else if (t == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value1.type; - } - } - - resulttypesum = resulttypesum || "n"; - - switch (fname) { - case "DSUM": - PushOperand(resulttypesum, sum); - break; - - case "DPRODUCT": // may handle cases with text differently than some other spreadsheets - PushOperand(resulttypesum, product); - break; - - case "DMIN": - PushOperand(resulttypesum, minval || 0); - break; - - case "DMAX": - PushOperand(resulttypesum, maxval || 0); - break; - - case "DCOUNT": - PushOperand("n", count); - break; - - case "DCOUNTA": - PushOperand("n", counta); - break; - - case "DAVERAGE": - if (count > 0) { - PushOperand(resulttypesum, sum/count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEV": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / (count - 1))); // sk is never negative according to Knuth - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DSTDEVP": - if (count > 1) { - PushOperand(resulttypesum, Math.sqrt(sk / count)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVAR": - if (count > 1) { - PushOperand(resulttypesum, sk / (count - 1)); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DVARP": - if (count > 1) { - PushOperand(resulttypesum, sk / count); - } - else { - PushOperand("e#DIV/0!", 0); - } - break; - - case "DGET": - if (count == 1) { - PushOperand(resulttypesum, sum); - } - else if (count == 0) { - PushOperand("e#VALUE!", 0); - } - else { - PushOperand("e#NUM!", 0); - } - break; - - } - - return; - - } - -SocialCalc.Formula.FunctionList["DAVERAGE"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DCOUNT"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DCOUNTA"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DGET"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DMAX"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DMIN"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DPRODUCT"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSTDEV"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSTDEVP"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DSUM"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DVAR"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; -SocialCalc.Formula.FunctionList["DVARP"] = [SocialCalc.Formula.DSeriesFunctions, 3, "dfunc", "", "stat"]; - -/* -# -# colnum = SocialCalc.Formula.FieldToColnum(sheet, col1num, ncols, row1num, fieldname, fieldtype) -# -# If fieldname is a number, uses it, otherwise looks up string in cells in row to find field number -# -# If not found, returns 0. -# -*/ - -SocialCalc.Formula.FieldToColnum = function(sheet, col1num, ncols, row1num, fieldname, fieldtype) { - - var colnum, cell, value; - - if (fieldtype.charAt(0) == "n") { // number - return it if legal - colnum = fieldname - 0; // make sure a number - if (colnum <= 0 || colnum > ncols) { - return 0; - } - return Math.floor(colnum); - } - - if (fieldtype.charAt(0) != "t") { // must be text otherwise - return 0; - } - - fieldname = fieldname ? fieldname.toLowerCase() : ""; - - for (colnum=0; colnum < ncols; colnum++) { // look through column headers for a match - cell = sheet.GetAssuredCell(SocialCalc.crToCoord(col1num+colnum, row1num)); - value = cell.datavalue; - value = (value+"").toLowerCase(); // ignore case - if (value == fieldname) { // match - return colnum+1; - } - } - return 0; // looked at all and no match - - } - - -/* -# -# HLOOKUP(value, range, row, [rangelookup]) -# VLOOKUP(value, range, col, [rangelookup]) -# MATCH(value, range, [rangelookup]) -# -*/ - -SocialCalc.Formula.LookupFunctions = function(fname, operand, foperand, sheet) { - - var lookupvalue, range, offset, rangelookup, offsetvalue, rangeinfo; - var c, r, cincr, rincr, previousOK, csave, rsave, cell, value, valuetype, cr, lookupvalue; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - lookupvalue = operand_value_and_type(sheet, foperand); - if (typeof lookupvalue.value == "string") { - lookupvalue.value = lookupvalue.value.toLowerCase(); - } - - range = scf.TopOfStackValueAndType(sheet, foperand); - - rangelookup = 1; // default to true or 1 - if (fname == "MATCH") { - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value - 0; - } - } - else { - offsetvalue = scf.OperandAsNumber(sheet, foperand); - if (offsetvalue.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - offsetvalue = Math.floor(offsetvalue.value); - if (foperand.length) { - rangelookup = scf.OperandAsNumber(sheet, foperand); - if (rangelookup.type.charAt(0) != "n") { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - rangelookup = rangelookup.value ? 1 : 0; // convert to 1 or 0 - } - } - lookupvalue.type = lookupvalue.type.charAt(0); // only deal with general type - if (lookupvalue.type == "n") { // if number, make sure a number - lookupvalue.value = lookupvalue.value - 0; - } - - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - rangeinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (!rangeinfo) { - PushOperand("e#REF!", 0); - return; - } - - c = 0; - r = 0; - cincr = 0; - rincr = 0; - if (fname == "HLOOKUP") { - cincr = 1; - if (offsetvalue > rangeinfo.nrows) { - PushOperand("e#REF!", 0); - return; - } - } - else if (fname == "VLOOKUP") { - rincr = 1; - if (offsetvalue > rangeinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - } - else if (fname == "MATCH") { - if (rangeinfo.ncols > 1) { - if (rangeinfo.nrows > 1) { - PushOperand("e#N/A", 0); - return; - } - cincr = 1; - } - else { - rincr = 1; - } - } - else { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (offsetvalue < 1 && fname != "MATCH") { - PushOperand("e#VALUE!", 0); - return 0; - } - - previousOK; // if 1, previous test was <. If 2, also this one wasn't - - while (1) { - cr = SocialCalc.crToCoord(rangeinfo.col1num + c, rangeinfo.row1num + r); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype ? cell.valuetype.charAt(0) : "b"; // only deal with general types - if (valuetype == "n") { - value = value - 0; // make sure number - } - if (rangelookup) { // rangelookup type 1 or -1: look for within brackets for matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { // match - break; - } - if ((rangelookup > 0 && lookupvalue.value > value) - || (rangelookup < 0 && lookupvalue.value < value)) { // possible match: wait and see - previousOK = 1; - csave = c; // remember col and row of last OK - rsave = r; - } - else if (previousOK) { // last one was OK, this one isn't - previousOK = 2; - break; - } - } - - else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { // match - break; - } - if ((rangelookup > 0 && lookupvalue.value > value) - || (rangelookup < 0 && lookupvalue.value < value)) { // possible match: wait and see - previousOK = 1; - csave = c; - rsave = r; - } - else if (previousOK) { // last one was OK, this one isn't - previousOK = 2; - break; - } - } - } - else { // exact value matches - if (lookupvalue.type == "n" && valuetype == "n") { - if (lookupvalue.value == value) { // match - break; - } - } - else if (lookupvalue.type == "t" && valuetype == "t") { - value = typeof value == "string" ? value.toLowerCase() : ""; - if (lookupvalue.value == value) { // match - break; - } - } - } - - r += rincr; - c += cincr; - if (r >= rangeinfo.nrows || c >= rangeinfo.ncols) { // end of range to check, no exact match - if (previousOK) { // at least one could have been OK - previousOK = 2; - break; - } - PushOperand("e#N/A", 0); - return; - } - } - - if (previousOK == 2) { // back to last OK - r = rsave; - c = csave; - } - - if (fname == "MATCH") { - value = c + r + 1; // only one may be <> 0 - valuetype = "n"; - } - else { - cr = SocialCalc.crToCoord(rangeinfo.col1num+c+(fname == "VLOOKUP" ? offsetvalue-1 : 0), rangeinfo.row1num+r+(fname == "HLOOKUP" ? offsetvalue-1 : 0)); - cell = rangeinfo.sheetdata.GetAssuredCell(cr); - value = cell.datavalue; - valuetype = cell.valuetype; - } - PushOperand(valuetype, value); - - return; - - } - -SocialCalc.Formula.FunctionList["HLOOKUP"] = [SocialCalc.Formula.LookupFunctions, -3, "hlookup", "", "lookup"]; -SocialCalc.Formula.FunctionList["MATCH"] = [SocialCalc.Formula.LookupFunctions, -2, "match", "", "lookup"]; -SocialCalc.Formula.FunctionList["VLOOKUP"] = [SocialCalc.Formula.LookupFunctions, -3, "vlookup", "", "lookup"]; - -/* -# -# INDEX(range, rownum, colnum) -# -*/ - -SocialCalc.Formula.IndexFunction = function(fname, operand, foperand, sheet) { - - var range, sheetname, indexinfo, rowindex, colindex, result, resulttype; - - var scf = SocialCalc.Formula; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range - if (range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - indexinfo = scf.DecodeRangeParts(sheet, range.value, range.type); - if (indexinfo.sheetname) { - sheetname = "!" + indexinfo.sheetname; - } - else { - sheetname = ""; - } - - rowindex = {value:0}; - colindex = {value:0}; - - if (foperand.length) { // look for row number - rowindex = scf.OperandAsNumber(sheet, foperand); - if (rowindex.type.charAt(0) != "n" || rowindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { // look for col number - colindex = scf.OperandAsNumber(sheet, foperand); - if (colindex.type.charAt(0) != "n" || colindex.value < 0) { - PushOperand("e#VALUE!", 0); - return; - } - if (foperand.length) { - scf.FunctionArgsError(fname, operand); - return 0; - } - } - else { // col number missing - if (indexinfo.nrows == 1) { // if only one row, then rowindex is really colindex - colindex.value = rowindex.value; - rowindex.value = 0; - } - } - } - - if (rowindex.value > indexinfo.nrows || colindex.value > indexinfo.ncols) { - PushOperand("e#REF!", 0); - return; - } - - if (rowindex.value == 0) { - if (colindex.value == 0) { - if (indexinfo.nrows == 1 && indexinfo.ncols == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+indexinfo.ncols-1, indexinfo.row1num+indexinfo.nrows-1) + - "|"; - resulttype = "range"; - } - } - else { - if (indexinfo.nrows == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num+indexinfo.nrows-1) + - "|"; - resulttype = "range"; - } - } - } - else { - if (colindex.value == 0) { - if (indexinfo.ncols == 1) { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num+rowindex.value-1) + sheetname; - resulttype = "coord"; - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num, indexinfo.row1num+rowindex.value-1) + sheetname + "|" + - SocialCalc.crToCoord(indexinfo.col1num+indexinfo.ncols-1, indexinfo.row1num+rowindex.value-1) + - "|"; - resulttype = "range"; - } - } - else { - result = SocialCalc.crToCoord(indexinfo.col1num+colindex.value-1, indexinfo.row1num+rowindex.value-1) + sheetname; - resulttype = "coord"; - } - } - - PushOperand(resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["INDEX"] = [SocialCalc.Formula.IndexFunction, -1, "index", "", "lookup"]; - -/* -# -# COUNTIF(c1:c2,"criteria") -# SUMIF(c1:c2,"criteria",[range2]) -# -*/ - -SocialCalc.Formula.CountifSumifFunctions = function(fname, operand, foperand, sheet) { - - var range, criteria, sumrange, f2operand, result, resulttype, value1, value2; - var sum = 0; - var resulttypesum = ""; - var count = 0; - - var scf = SocialCalc.Formula; - var operand_value_and_type = scf.OperandValueAndType; - var lookup_result_type = scf.LookupResultType; - var typelookupplus = scf.TypeLookupTable.plus; - - var PushOperand = function(t, v) {operand.push({type: t, value: v});}; - - range = scf.TopOfStackValueAndType(sheet, foperand); // get range or coord - criteria = scf.OperandAsText(sheet, foperand); // get criteria - if (fname == "SUMIF") { - if (foperand.length == 1) { // three arg form of SUMIF - sumrange = scf.TopOfStackValueAndType(sheet, foperand); - } - else if (foperand.length == 0) { // two arg form - sumrange = {value: range.value, type: range.type}; - } - else { - scf.FunctionArgsError(fname, operand); - return 0; - } - } - else { - sumrange = {value: range.value, type: range.type}; - } - - if (criteria.type.charAt(0) == "n") { - criteria.value = criteria.value + ""; // make text - } - else if (criteria.type.charAt(0) == "e") { // error - criteria.value = null; - } - else if (criteria.type.charAt(0) == "b") { // blank here is undefined - criteria.value = null; - } - - if (range.type != "coord" && range.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - if (fname == "SUMIF" && sumrange.type != "coord" && sumrange.type != "range") { - scf.FunctionArgsError(fname, operand); - return 0; - } - - foperand.push(range); - f2operand = []; // to allow for 3 arg form - f2operand.push(sumrange); - - while (foperand.length) { - value1 = operand_value_and_type(sheet, foperand); - value2 = operand_value_and_type(sheet, f2operand); - - if (!scf.TestCriteria(value1.value, value1.type, criteria.value)) { - continue; - } - - count += 1; - - if (value2.type.charAt(0) == "n") { - sum += value2.value-0; - resulttypesum = lookup_result_type(value2.type, resulttypesum || value2.type, typelookupplus); - } - else if (value2.type.charAt(0) == "e" && resulttypesum.charAt(0) != "e") { - resulttypesum = value2.type; - } - } - - resulttypesum = resulttypesum || "n"; - - if (fname == "SUMIF") { - PushOperand(resulttypesum, sum); - } - else if (fname == "COUNTIF") { - PushOperand("n", count); - } - - return; - - } - -SocialCalc.Formula.FunctionList["COUNTIF"] = [SocialCalc.Formula.CountifSumifFunctions, 2, "rangec", "", "stat"]; -SocialCalc.Formula.FunctionList["SUMIF"] = [SocialCalc.Formula.CountifSumifFunctions, -2, "sumif", "", "stat"]; - -/* -# -# IF(cond,truevalue,falsevalue) -# -*/ - -SocialCalc.Formula.IfFunction = function(fname, operand, foperand, sheet) { - - var cond, t; - - cond = SocialCalc.Formula.OperandValueAndType(sheet, foperand); - t = cond.type.charAt(0); - if (t != "n" && t != "b") { - operand.push({type: "e#VALUE!", value: 0}); - return; - } - - if (!cond.value) foperand.pop(); - operand.push(foperand.pop()); - if (cond.value) foperand.pop(); - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["IF"] = [SocialCalc.Formula.IfFunction, 3, "iffunc", "", "test"]; - -/* -# -# DATE(year,month,day) -# -*/ - -SocialCalc.Formula.DateFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var year = scf.OperandAsNumber(sheet, foperand); - var month = scf.OperandAsNumber(sheet, foperand); - var day = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(year.type, month.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, day.type, scf.TypeLookupTable.twoargnumeric); - if (resulttype.charAt(0) == "n") { - result = SocialCalc.FormatNumber.convert_date_gregorian_to_julian( - Math.floor(year.value), Math.floor(month.value), Math.floor(day.value) - ) - SocialCalc.FormatNumber.datevalues.julian_offset; - resulttype = "nd"; - } - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["DATE"] = [SocialCalc.Formula.DateFunction, 3, "date", "", "datetime"]; - -/* -# -# TIME(hour,minute,second) -# -*/ - -SocialCalc.Formula.TimeFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var hours = scf.OperandAsNumber(sheet, foperand); - var minutes = scf.OperandAsNumber(sheet, foperand); - var seconds = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(hours.type, minutes.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, seconds.type, scf.TypeLookupTable.twoargnumeric); - if (resulttype.charAt(0) == "n") { - result = ((hours.value * 60 * 60) + (minutes.value * 60) + seconds.value) / (24*60*60); - resulttype = "nt"; - } - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["TIME"] = [SocialCalc.Formula.TimeFunction, 3, "hms", "", "datetime"]; - -/* -# -# DAY(date) -# MONTH(date) -# YEAR(date) -# WEEKDAY(date, [type]) -# -*/ - -SocialCalc.Formula.DMYFunctions = function(fname, operand, foperand, sheet) { - - var ymd, dtype, doffset; - var scf = SocialCalc.Formula; - var result = 0; - - var datevalue = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(datevalue.type, datevalue.type, scf.TypeLookupTable.oneargnumeric); - - if (resulttype.charAt(0) == "n") { - ymd = SocialCalc.FormatNumber.convert_date_julian_to_gregorian( - Math.floor(datevalue.value + SocialCalc.FormatNumber.datevalues.julian_offset)); - switch (fname) { - case "DAY": - result = ymd.day; - break; - - case "MONTH": - result = ymd.month; - break; - - case "YEAR": - result = ymd.year; - break; - - case "WEEKDAY": - dtype = {value: 1}; - if (foperand.length) { // get type if present - dtype = scf.OperandAsNumber(sheet, foperand); - if (dtype.type.charAt(0) != "n" || dtype.value < 1 || dtype.value > 3) { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { // extra args - scf.FunctionArgsError(fname, operand); - return; - } - } - doffset = 6; - if (dtype.value > 1) { - doffset -= 1; - } - result = Math.floor(datevalue.value+doffset) % 7 + (dtype.value < 3 ? 1 : 0); - break; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["DAY"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["MONTH"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["YEAR"] = [SocialCalc.Formula.DMYFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["WEEKDAY"] = [SocialCalc.Formula.DMYFunctions, -1, "weekday", "", "datetime"]; - -/* -# -# HOUR(datetime) -# MINUTE(datetime) -# SECOND(datetime) -# -*/ - -SocialCalc.Formula.HMSFunctions = function(fname, operand, foperand, sheet) { - - var hours, minutes, seconds, fraction; - var scf = SocialCalc.Formula; - var result = 0; - - var datetime = scf.OperandAsNumber(sheet, foperand); - var resulttype = scf.LookupResultType(datetime.type, datetime.type, scf.TypeLookupTable.oneargnumeric); - - if (resulttype.charAt(0) == "n") { - if (datetime.value < 0) { - scf.PushOperand(operand, "e#NUM!", 0); // must be non-negative - return; - } - fraction = datetime.value - Math.floor(datetime.value); // fraction of a day - fraction *= 24; - hours = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - minutes = Math.floor(fraction); - fraction -= Math.floor(fraction); - fraction *= 60; - seconds = Math.floor(fraction + (datetime.value >= 0 ? 0.5: -0.5)); - if (fname == "HOUR") { - result = hours; - } - else if (fname == "MINUTE") { - result = minutes; - } - else if (fname == "SECOND") { - result = seconds; - } - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["HOUR"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["MINUTE"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; -SocialCalc.Formula.FunctionList["SECOND"] = [SocialCalc.Formula.HMSFunctions, 1, "v", "", "datetime"]; - -/* -# -# EXACT(v1,v2) -# -*/ - -SocialCalc.Formula.ExactFunction = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value1 = scf.OperandValueAndType(sheet, foperand); - var v1type = value1.type.charAt(0); - var value2 = scf.OperandValueAndType(sheet, foperand); - var v2type = value2.type.charAt(0); - - if (v1type == "t") { - if (v2type == "t") { - result = value1.value == value2.value ? 1 : 0; - } - else if (v2type == "b") { - result = value1.value.length ? 0 : 1; - } - else if (v2type == "n") { - result = value1.value == value2.value+"" ? 1 : 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "n") { - if (v2type == "n") { - result = value1.value-0 == value2.value-0 ? 1 : 0; - } - else if (v2type == "b") { - result = 0; - } - else if (v2type == "t") { - result = value1.value+"" == value2.value ? 1 : 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "b") { - if (v2type == "t") { - result = value2.value.length ? 0 : 1; - } - else if (v2type == "b") { - result = 1; - } - else if (v2type == "n") { - result = 0; - } - else if (v2type == "e") { - result = value2.value; - resulttype = value2.type; - } - else { - result = 0; - } - } - else if (v1type == "e") { - result = value1.value; - resulttype = value1.type; - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["EXACT"] = [SocialCalc.Formula.ExactFunction, 2, "", "", "text"]; - -/* -# -# FIND(key,string,[start]) -# LEFT(string,[length]) -# LEN(string) -# LOWER(string) -# MID(string,start,length) -# PROPER(string) -# REPLACE(string,start,length,new) -# REPT(string,count) -# RIGHT(string,[length]) -# SUBSTITUTE(string,old,new,[which]) -# TRIM(string) -# UPPER(string) -# -*/ - -// SocialCalc.Formula.ArgList has an array for each function, one entry for each possible arg (up to max). -// Min args are specified in SocialCalc.Formula.FunctionList. -// If array element is 1 then it's a text argument, if it's 0 then it's numeric, if -1 then just get whatever's there -// Text values are manipulated as UTF-8, converting from and back to byte strings - -SocialCalc.Formula.ArgList = { - FIND: [1, 1, 0], - LEFT: [1, 0], - LEN: [1], - LOWER: [1], - MID: [1, 0, 0], - PROPER: [1], - REPLACE: [1, 0, 0, 1], - REPT: [1, 0], - RIGHT: [1, 0], - SUBSTITUTE: [1, 1, 1, 0], - TRIM: [1], - UPPER: [1] - }; - -SocialCalc.Formula.StringFunctions = function(fname, operand, foperand, sheet) { - - var i, value, offset, len, start, count; - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var numargs = foperand.length; - var argdef = scf.ArgList[fname]; - var operand_value = []; - var operand_type = []; - - for (i=1; i <= numargs; i++) { // go through each arg, get value and type, and check for errors - if (i > argdef.length) { // too many args - scf.FunctionArgsError(fname, operand); - return; - } - if (argdef[i-1] == 0) { - value = scf.OperandAsNumber(sheet, foperand); - } - else if (argdef[i-1] == 1) { - value = scf.OperandAsText(sheet, foperand); - } - else if (argdef[i-1] == -1) { - value = scf.OperandValueAndType(sheet, foperand); - } - operand_value[i] = value.value; - operand_type[i] = value.type; - if (value.type.charAt(0) == "e") { - scf.PushOperand(operand, value.type, result); - return; - } - } - - switch (fname) { - case "FIND": - offset = operand_type[3] ? operand_value[3]-1 : 0; - if (offset < 0) { - result = "Start is before string"; // !! not displayed, no need to translate - } - else { - result = operand_value[2].indexOf(operand_value[1], offset); // (null string matches first char) - if (result >= 0) { - result += 1; - resulttype = "n"; - } - else { - result = "Not found"; // !! not displayed, error is e#VALUE! - } - } - break; - - case "LEFT": - len = operand_type[2] ? operand_value[2]-0 : 1; - if (len < 0) { - result = "Negative length"; - } - else { - result = operand_value[1].substring(0, len); - resulttype = "t"; - } - break; - - case "LEN": - result = operand_value[1].length; - resulttype = "n"; - break; - - case "LOWER": - result = operand_value[1].toLowerCase(); - resulttype = "t"; - break; - - case "MID": - start = operand_value[2]-0; - len = operand_value[3]-0; - if (len < 1 || start < 1) { - result = "Bad arguments"; - } - else { - result = operand_value[1].substring(start-1, start+len-1); - resulttype = "t"; - } - break; - - case "PROPER": - result = operand_value[1].replace(/\b\w+\b/g, function(word) { - return word.substring(0,1).toUpperCase() + - word.substring(1); - }); // uppercase first character of words (see JavaScript, Flanagan, 5th edition, page 704) - resulttype = "t"; - break; - - case "REPLACE": - start = operand_value[2]-0; - len = operand_value[3]-0; - if (len < 0 || start < 1) { - result = "Bad arguments"; - } - else { - result = operand_value[1].substring(0, start-1) + operand_value[4] + - operand_value[1].substring(start-1+len); - resulttype = "t"; - } - break; - - case "REPT": - count = operand_value[2]-0; - if (count < 0) { - result = "Negative count"; - } - else { - result = ""; - for (; count > 0; count--) { - result += operand_value[1]; - } - resulttype = "t"; - } - break; - - case "RIGHT": - len = operand_type[2] ? operand_value[2]-0 : 1; - if (len < 0) { - result = "Negative length"; - } - else { - result = operand_value[1].slice(-len); - resulttype = "t"; - } - break; - - case "SUBSTITUTE": - fulltext = operand_value[1]; - oldtext = operand_value[2]; - newtext = operand_value[3]; - if (operand_value[4] != null) { - which = operand_value[4]-0; - if (which <= 0) { - result = "Non-positive instance number"; - break; - } - } - else { - which = 0; - } - count = 0; - oldpos = 0; - result = ""; - while (true) { - pos = fulltext.indexOf(oldtext, oldpos); - if (pos >= 0) { - count++; //!!!!!! old test just in case: if (count>1000) {alert(pos); break;} - result += fulltext.substring(oldpos, pos); - if (which==0) { - result += newtext; // substitute - } - else if (which==count) { - result += newtext + fulltext.substring(pos+oldtext.length); - break; - } - else { - result += oldtext; // leave as was - } - oldpos = pos + oldtext.length; - } - else { // no more - result += fulltext.substring(oldpos); - break; - } - } - resulttype = "t"; - break; - - case "TRIM": - result = operand_value[1]; - result = result.replace(/^ */, ""); - result = result.replace(/ *$/, ""); - result = result.replace(/ +/g, " "); - resulttype = "t"; - break; - - case "UPPER": - result = operand_value[1].toUpperCase(); - resulttype = "t"; - break; - - } - - scf.PushOperand(operand, resulttype, result); - return; - - } - -SocialCalc.Formula.FunctionList["FIND"] = [SocialCalc.Formula.StringFunctions, -2, "find", "", "text"]; -SocialCalc.Formula.FunctionList["LEFT"] = [SocialCalc.Formula.StringFunctions, -2, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["LEN"] = [SocialCalc.Formula.StringFunctions, 1, "txt", "", "text"]; -SocialCalc.Formula.FunctionList["LOWER"] = [SocialCalc.Formula.StringFunctions, 1, "txt", "", "text"]; -SocialCalc.Formula.FunctionList["MID"] = [SocialCalc.Formula.StringFunctions, 3, "mid", "", "text"]; -SocialCalc.Formula.FunctionList["PROPER"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["REPLACE"] = [SocialCalc.Formula.StringFunctions, 4, "replace", "", "text"]; -SocialCalc.Formula.FunctionList["REPT"] = [SocialCalc.Formula.StringFunctions, 2, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["RIGHT"] = [SocialCalc.Formula.StringFunctions, -1, "tc", "", "text"]; -SocialCalc.Formula.FunctionList["SUBSTITUTE"] = [SocialCalc.Formula.StringFunctions, -3, "subs", "", "text"]; -SocialCalc.Formula.FunctionList["TRIM"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["UPPER"] = [SocialCalc.Formula.StringFunctions, 1, "v", "", "text"]; - -/* -# -# is_functions: -# -# ISBLANK(value) -# ISERR(value) -# ISERROR(value) -# ISLOGICAL(value) -# ISNA(value) -# ISNONTEXT(value) -# ISNUMBER(value) -# ISTEXT(value) -# -*/ - -SocialCalc.Formula.IsFunctions = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "nl"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - - case "ISBLANK": - result = value.type == "b" ? 1 : 0; - break; - - case "ISERR": - result = t == "e" ? (value.type == "e#N/A" ? 0 : 1) : 0; - break; - - case "ISERROR": - result = t == "e" ? 1 : 0; - break; - - case "ISLOGICAL": - result = value.type == "nl" ? 1 : 0; - break; - - case "ISNA": - result = value.type == "e#N/A" ? 1 : 0; - break; - - case "ISNONTEXT": - result = t == "t" ? 0 : 1; - break; - - case "ISNUMBER": - result = t == "n" ? 1 : 0; - break; - - case "ISTEXT": - result = t == "t" ? 1 : 0; - break; - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["ISBLANK"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISERR"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISERROR"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISLOGICAL"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNA"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNONTEXT"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISNUMBER"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; -SocialCalc.Formula.FunctionList["ISTEXT"] = [SocialCalc.Formula.IsFunctions, 1, "v", "", "test"]; - -/* -# -# ntv_functions: -# -# N(value) -# T(value) -# VALUE(value) -# -*/ - -SocialCalc.Formula.NTVFunctions = function(fname, operand, foperand, sheet) { - - var scf = SocialCalc.Formula; - var result = 0; - var resulttype = "e#VALUE!"; - - var value = scf.OperandValueAndType(sheet, foperand); - var t = value.type.charAt(0); - - switch (fname) { - - case "N": - result = t == "n" ? value.value-0 : 0; - resulttype = "n"; - break; - - case "T": - result = t == "t" ? value.value+"" : ""; - resulttype = "t"; - break; - - case "VALUE": - if (t == "n" || t == "b") { - result = value.value || 0; - resulttype = "n"; - } - else if (t == "t") { - value = SocialCalc.DetermineValueType(value.value); - if (value.type.charAt(0) != "n") { - result = 0; - resulttype = "e#VALUE!"; - } - else { - result = value.value-0; - resulttype = "n"; - } - } - break; - } - - if (t == "e") { // error trumps - resulttype = value.type; - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["N"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["T"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "text"]; -SocialCalc.Formula.FunctionList["VALUE"] = [SocialCalc.Formula.NTVFunctions, 1, "v", "", "text"]; - -/* -# -# ABS(value) -# ACOS(value) -# ASIN(value) -# ATAN(value) -# COS(value) -# DEGREES(value) -# EVEN(value) -# EXP(value) -# FACT(value) -# INT(value) -# LN(value) -# LOG10(value) -# ODD(value) -# RADIANS(value) -# SIN(value) -# SQRT(value) -# TAN(value) -# -*/ - -SocialCalc.Formula.Math1Functions = function(fname, operand, foperand, sheet) { - - var v1, value, f; - var result = {}; - - var scf = SocialCalc.Formula; - - v1 = scf.OperandAsNumber(sheet, foperand); - value = v1.value; - result.type = scf.LookupResultType(v1.type, v1.type, scf.TypeLookupTable.oneargnumeric); - - if (result.type == "n") { - switch (fname) { - case "ABS": - value = Math.abs(value); - break; - - case "ACOS": - if (value >= -1 && value <= 1) { - value = Math.acos(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "ASIN": - if (value >= -1 && value <= 1) { - value = Math.asin(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "ATAN": - value = Math.atan(value); - break; - - case "COS": - value = Math.cos(value); - break; - - case "DEGREES": - value = value * 180/Math.PI; - break; - - case "EVEN": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (Math.floor(value + 1) % 2); - } - else { // integer - value = value + (value % 2); - } - if (v1.value < 0) value = -value; - break; - - case "EXP": - value = Math.exp(value); - break; - - case "FACT": - f = 1; - value = Math.floor(value); - for (;value>0;value--) { - f *= value; - } - value = f; - break; - - case "INT": - value = Math.floor(value); // spreadsheet INT is floor(), not int() - break; - - case "LN": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclnarg; - } - value = Math.log(value); - break; - - case "LOG10": - if (value <= 0) { - result.type = "e#NUM!"; - result.error = SocialCalc.Constants.s_sheetfunclog10arg; - } - value = Math.log(value)/Math.log(10); - break; - - case "ODD": - value = value < 0 ? -value : value; - if (value != Math.floor(value)) { - value = Math.floor(value + 1) + (1 - (Math.floor(value + 1) % 2)); - } - else { // integer - value = value + (1 - (value % 2)); - } - if (v1.value < 0) value = -value; - break; - - case "RADIANS": - value = value * Math.PI/180; - break; - - case "SIN": - value = Math.sin(value); - break; - - case "SQRT": - if (value >= 0) { - value = Math.sqrt(value); - } - else { - result.type = "e#NUM!"; - } - break; - - case "TAN": - if (Math.cos(value) != 0) { - value = Math.tan(value); - } - else { - result.type = "e#NUM!"; - } - break; - } - } - - result.value = value; - operand.push(result); - - return null; - - } - -// Add to function list -SocialCalc.Formula.FunctionList["ABS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ACOS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ASIN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ATAN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["COS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["DEGREES"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["EVEN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["EXP"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["FACT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["INT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["LN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["LOG10"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["ODD"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["RADIANS"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["SIN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["SQRT"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; -SocialCalc.Formula.FunctionList["TAN"] = [SocialCalc.Formula.Math1Functions, 1, "v", "", "math"]; - - -/* -# -# ATAN2(x, y) -# MOD(a, b) -# POWER(a, b) -# TRUNC(value, precision) -# -*/ - -SocialCalc.Formula.Math2Functions = function(fname, operand, foperand, sheet) { - - var xval, yval, value, quotient, decimalscale, i; - var result = {}; - - var scf = SocialCalc.Formula; - - xval = scf.OperandAsNumber(sheet, foperand); - yval = scf.OperandAsNumber(sheet, foperand); - value = 0; - result.type = scf.LookupResultType(xval.type, yval.type, scf.TypeLookupTable.twoargnumeric); - - if (result.type == "n") { - switch (fname) { - case "ATAN2": - if (xval.value == 0 && yval.value == 0) { - result.type = "e#DIV/0!"; - } - else { - result.value = Math.atan2(yval.value, xval.value); - } - break; - - case "POWER": - result.value = Math.pow(xval.value, yval.value); - if (isNaN(result.value)) { - result.value = 0; - result.type = "e#NUM!"; - } - break; - - case "MOD": // en.wikipedia.org/wiki/Modulo_operation, etc. - if (yval.value == 0) { - result.type = "e#DIV/0!"; - } - else { - quotient = xval.value/yval.value; - quotient = Math.floor(quotient); - result.value = xval.value - (quotient * yval.value); - } - break; - - case "TRUNC": - decimalscale = 1; // cut down to required number of decimal digits - if (yval.value >= 0) { - yval.value = Math.floor(yval.value); - for (i=0; i 0) { - decimalscale = 1; // cut down to required number of decimal digits - value2.value = Math.floor(value2.value); - for (i=0; i 0 ) { - method = scf.OperandAsNumber(sheet, foperand); - } - if (foperand.length != 0) { - scf.FunctionArgsError(fname, operand); - return 0; - } - if (scf.CheckForErrorValue(operand, method)) return; - - depreciation = 0; // calculated for each period - accumulateddepreciation = 0; // accumulated by adding each period's - - for (i=1; i<=period.value-0 && i<=lifetime.value; i++) { // calculate for each period based on net from previous - depreciation = (cost.value - accumulateddepreciation) * (method.value / lifetime.value); - if (cost.value - accumulateddepreciation - depreciation < salvage.value) { // don't go lower than salvage value - depreciation = cost.value - accumulateddepreciation - salvage.value; - } - accumulateddepreciation += depreciation; - } - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["DDB"] = [SocialCalc.Formula.DDBFunction, -4, "ddb", "", "financial"]; - -/* -# -# SLN(cost,salvage,lifetime) -# -# Depreciation for each period by straight-line method -# See: http://en.wikipedia.org/wiki/Depreciation -# -*/ - -SocialCalc.Formula.SLNFunction = function(fname, operand, foperand, sheet) { - - var depreciation; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - - if (lifetime.value < 1) { - scf.FunctionSpecificError(fname, operand, "e#NUM!", SocialCalc.Constants.s_sheetfuncslnlife); - return 0; - } - - depreciation = (cost.value - salvage.value) / lifetime.value; - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["SLN"] = [SocialCalc.Formula.SLNFunction, 3, "csl", "", "financial"]; - -/* -# -# SYD(cost,salvage,lifetime,period) -# -# Depreciation by Sum of Year's Digits method -# -*/ - -SocialCalc.Formula.SYDFunction = function(fname, operand, foperand, sheet) { - - var depreciation, sumperiods; - var scf = SocialCalc.Formula; - - var cost = scf.OperandAsNumber(sheet, foperand); - var salvage = scf.OperandAsNumber(sheet, foperand); - var lifetime = scf.OperandAsNumber(sheet, foperand); - var period = scf.OperandAsNumber(sheet, foperand); - - if (scf.CheckForErrorValue(operand, cost)) return; - if (scf.CheckForErrorValue(operand, salvage)) return; - if (scf.CheckForErrorValue(operand, lifetime)) return; - if (scf.CheckForErrorValue(operand, period)) return; - - if (lifetime.value < 1 || period.value <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return 0; - } - - sumperiods = ((lifetime.value + 1) * lifetime.value)/2; // add up 1 through lifetime - depreciation = (cost.value - salvage.value) * (lifetime.value - period.value + 1) / sumperiods; // calc depreciation - - scf.PushOperand(operand, 'n$', depreciation); - - return; - - } - -SocialCalc.Formula.FunctionList["SYD"] = [SocialCalc.Formula.SYDFunction, 4, "cslp", "", "financial"]; - -/* -# -# FV(rate, n, payment, [pv, [paytype]]) -# NPER(rate, payment, pv, [fv, [paytype]]) -# PMT(rate, n, pv, [fv, [paytype]]) -# PV(rate, n, payment, [fv, [paytype]]) -# RATE(n, payment, pv, [fv, [paytype, [guess]]]) -# -# Following the Open Document Format formula specification: -# -# PV = - Fv - (Payment * Nper) [if rate equals 0] -# Pv*(1+Rate)^Nper + Payment * (1 + Rate*PaymentType) * ( (1+Rate)^nper -1)/Rate + Fv = 0 -# -# For each function, the formulas are solved for the appropriate value (transformed using -# basic algebra). -# -*/ - -SocialCalc.Formula.InterestFunctions = function(fname, operand, foperand, sheet) { - - var resulttype, result, dval, eval, fval; - var pv, fv, rate, n, payment, paytype, guess, part1, part2, part3, part4, part5; - var olddelta, maxloop, tries, deltaepsilon, rate, oldrate, m; - - var scf = SocialCalc.Formula; - - var aval = scf.OperandAsNumber(sheet, foperand); - var bval = scf.OperandAsNumber(sheet, foperand); - var cval = scf.OperandAsNumber(sheet, foperand); - - resulttype = scf.LookupResultType(aval.type, bval.type, scf.TypeLookupTable.twoargnumeric); - resulttype = scf.LookupResultType(resulttype, cval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - dval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, dval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - eval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, eval.type, scf.TypeLookupTable.twoargnumeric); - if (foperand.length) { // optional arguments - if (fname != "RATE") { // only rate has 6 possible args - scf.FunctionArgsError(fname, operand); - return 0; - } - fval = scf.OperandAsNumber(sheet, foperand); - resulttype = scf.LookupResultType(resulttype, fval.type, scf.TypeLookupTable.twoargnumeric); - } - } - } - - if (resulttype == "n") { - switch (fname) { - case "FV": // FV(rate, n, payment, [pv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - pv = dval!=null ? dval.value : 0; // get value if present, or use default - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == 0) { // simple calculation if no interest - fv = -pv - (payment * n); - } - else { - fv = -(pv*Math.pow(1+rate,n) + payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate); - } - result = fv; - resulttype = 'n$'; - break; - - case "NPER": // NPER(rate, payment, pv, [fv, [paytype]]) - rate = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == 0) { // simple calculation if no interest - if (payment == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - n = (pv + fv)/(-payment); - } - else { - part1 = payment * (1 + rate * paytype) / rate; - part2 = pv + part1; - if (part2 == 0 || rate <= -1) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part3 = (part1 - fv) / part2; - if (part3 <= 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - part4 = Math.log(part3); - part5 = Math.log(1 + rate); // rate > -1 - n = part4/part5; - } - result = n; - resulttype = 'n'; - break; - - case "PMT": // PMT(rate, n, pv, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (n == 0) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - else if (rate == 0) { // simple calculation if no interest - payment = (fv - pv)/n; - } - else { - payment = (0 - fv - pv*Math.pow(1+rate,n))/((1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate); - } - result = payment; - resulttype = 'n$'; - break; - - case "PV": // PV(rate, n, payment, [fv, [paytype]]) - rate = aval.value; - n = bval.value; - payment = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - if (rate == -1) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - else if (rate == 0) { // simple calculation if no interest - pv = -fv - (payment * n); - } - else { - pv = (-fv - payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate)/(Math.pow(1+rate,n)); - } - result = pv; - resulttype = 'n$'; - break; - - case "RATE": // RATE(n, payment, pv, [fv, [paytype, [guess]]]) - n = aval.value; - payment = bval.value; - pv = cval.value; - fv = dval!=null ? dval.value : 0; - paytype = eval!=null ? (eval.value ? 1 : 0) : 0; - guess = fval!=null ? fval.value : 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 100; - tries = 0; - delta = 1; - epsilon = 0.0000001; // this is close enough - rate = guess || 0.00000001; // zero is not allowed - while ((delta >= 0 ? delta : -delta) > epsilon && (rate != oldrate)) { - delta = fv + pv*Math.pow(1+rate,n) + payment * (1 + rate*paytype) * ( Math.pow(1+rate,n) -1)/rate; - if (olddelta!=null) { - m = (delta - olddelta)/(rate - oldrate) || .001; // get slope (not zero) - oldrate = rate; - rate = rate - delta / m; // look for zero crossing - olddelta = delta; - } - else { // first time - no old values - oldrate = rate; - rate = 1.1 * rate; - olddelta = delta; - } - tries++; - if (tries >= maxloop) { // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - result = rate; - resulttype = 'n%'; - break; - } - } - - scf.PushOperand(operand, resulttype, result); - - return; - - } - -SocialCalc.Formula.FunctionList["FV"] = [SocialCalc.Formula.InterestFunctions, -3, "fv", "", "financial"]; -SocialCalc.Formula.FunctionList["NPER"] = [SocialCalc.Formula.InterestFunctions, -3, "nper", "", "financial"]; -SocialCalc.Formula.FunctionList["PMT"] = [SocialCalc.Formula.InterestFunctions, -3, "pmt", "", "financial"]; -SocialCalc.Formula.FunctionList["PV"] = [SocialCalc.Formula.InterestFunctions, -3, "pv", "", "financial"]; -SocialCalc.Formula.FunctionList["RATE"] = [SocialCalc.Formula.InterestFunctions, -3, "rate", "", "financial"]; - -/* -# -# NPV(rate,v1,v2,c1:c2,...) -# -*/ - -SocialCalc.Formula.NPVFunction = function(fname, operand, foperand, sheet) { - - var resulttypenpv, rate, sum, factor, value1; - - var scf = SocialCalc.Formula; - - var rate = scf.OperandAsNumber(sheet, foperand); - if (scf.CheckForErrorValue(operand, rate)) return; - - sum = 0; - resulttypenpv = "n"; - factor = 1; - - while (foperand.length) { - value1 = scf.OperandValueAndType(sheet, foperand); - if (value1.type.charAt(0) == "n") { - factor *= (1 + rate.value); - if (factor == 0) { - scf.PushOperand(operand, "e#DIV/0!", 0); - return; - } - sum += value1.value / factor; - resulttypenpv = scf.LookupResultType(value1.type, resulttypenpv || value1.type, scf.TypeLookupTable.plus); - } - else if (value1.type.charAt(0) == "e" && resulttypenpv.charAt(0) != "e") { - resulttypenpv = value1.type; - break; - } - } - - if (resulttypenpv.charAt(0) == "n") { - resulttypenpv = 'n$'; - } - - scf.PushOperand(operand, resulttypenpv, sum); - - return; - - } - -SocialCalc.Formula.FunctionList["NPV"] = [SocialCalc.Formula.NPVFunction, -2, "npv", "", "financial"]; - -/* -# -# IRR(c1:c2,[guess]) -# -*/ - -SocialCalc.Formula.IRRFunction = function(fname, operand, foperand, sheet) { - - var value1, guess, oldsum, maxloop, tries, epsilon, rate, oldrate, m, sum, factor, i; - var rangeoperand = []; - var cashflows = []; - - var scf = SocialCalc.Formula; - - rangeoperand.push(foperand.pop()); // first operand is a range - - while (rangeoperand.length) { // get values from range so we can do iterative approximations - value1 = scf.OperandValueAndType(sheet, rangeoperand); - if (value1.type.charAt(0) == "n") { - cashflows.push(value1.value); - } - else if (value1.type.charAt(0) == "e") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - } - - if (!cashflows.length) { - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - - guess = {value: 0}; - - if (foperand.length) { // guess is provided - guess = scf.OperandAsNumber(sheet, foperand); - if (guess.type.charAt(0) != "n" && guess.type.charAt(0) != "b") { - scf.PushOperand(operand, "e#VALUE!", 0); - return; - } - if (foperand.length) { // should be no more args - scf.FunctionArgsError(fname, operand); - return; - } - } - - guess.value = guess.value || 0.1; - - // rate is calculated by repeated approximations - // The deltas are used to calculate new guesses - - maxloop = 20; - tries = 0; - epsilon = 0.0000001; // this is close enough - rate = guess.value; - sum = 1; - - while ((sum >= 0 ? sum : -sum) > epsilon && (rate != oldrate)) { - sum = 0; - factor = 1; - for (i=0; i= maxloop) { // didn't converge yet - scf.PushOperand(operand, "e#NUM!", 0); - return; - } - } - - scf.PushOperand(operand, 'n%', rate); - - return; - - } - -SocialCalc.Formula.FunctionList["IRR"] = [SocialCalc.Formula.IRRFunction, -1, "irr", "", "financial"]; - -// -// SHEET CACHE -// - -SocialCalc.Formula.SheetCache = { - - // Sheet data: Attributes are each sheet in the cache with values of an object with: - // - // sheet: sheet-obj (or null, meaning not found) - // recalcstate: constants.asloaded = as loaded - // constants.recalcing = being recalced now - // constants.recalcdone = recalc done - // name: name of sheet (in case just have object and don't know name) - // - - sheets: {}, - - // Waiting for loading: - // If sheet is not in cache, this is set to the sheetname being loaded - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForLoading: null, - - // Constants to use for setting sheets[*].recalcstate: - - constants: {asloaded: 0, recalcing: 1, recalcdone: 2}, - - loadsheet: null // (deprecated - use SocialCalc.RecalcInfo.LoadSheet) - - }; - -// -// othersheet = SocialCalc.Formula.FindInSheetCache(sheetname) -// -// Returns a SocialCalc.Sheet object corresponding to string sheetname -// or null if the sheet is not available or in error. -// -// Each sheet is loaded only once and then stored in a cache. -// Loading is handled elsewhere, e.g., in the recalc loop. -// - -SocialCalc.Formula.FindInSheetCache = function(sheetname) { - - var str; - var sfsc = SocialCalc.Formula.SheetCache; - - var nsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); // normalize different versions - - if (sfsc.sheets[nsheetname]) { // a sheet by that name is in the cache already - return sfsc.sheets[nsheetname].sheet; // return it - } - - if (sfsc.waitingForLoading) { // waiting already - only queue up one - return null; // return not found - } - - sfsc.waitingForLoading = nsheetname; // let recalc loop know that we have a sheet to load - - return null; // return not found - - } - -// -// newsheet = SocialCalc.Formula.AddSheetToCache(sheetname, str) -// -// Adds a new sheet to the sheet cache. -// Returns the sheet object filled out with the str (a saved sheet). -// - -SocialCalc.Formula.AddSheetToCache = function(sheetname, str) { - - var newsheet = null; - var sfsc = SocialCalc.Formula.SheetCache; - var sfscc = sfsc.constants; - var newsheetname = SocialCalc.Formula.NormalizeSheetName(sheetname); - - if (str) { - newsheet = new SocialCalc.Sheet(); - newsheet.ParseSheetSave(str); - } - - sfsc.sheets[newsheetname] = {sheet: newsheet, recalcstate: sfscc.asloaded, name: newsheetname}; - - SocialCalc.Formula.FreshnessInfo.sheets[newsheetname] = true; - - return newsheet; - - } - -// -// nsheet = SocialCalc.Formula.NormalizeSheetName(sheetname) -// - -SocialCalc.Formula.NormalizeSheetName = function(sheetname) { - - if (SocialCalc.Callbacks.NormalizeSheetName) { - return SocialCalc.Callbacks.NormalizeSheetName(sheetname); - } - else { - return sheetname.toLowerCase(); - } - } - -// -// REMOTE FUNCTION INFO -// - -SocialCalc.Formula.RemoteFunctionInfo = { - - // Waiting for server: - // If waiting for an XHR response from the server, this is set to some non-blank status text - // so it can be tested in the recalc loop to start load and then wait until restarted. - // Reset to null before restarting. - - waitingForServer: null - - }; - -// -// FRESHNESS INFO -// -// This information is generated during recalc. -// It may be used to help determine when the recalc data in a spreadsheet -// may be out of date. -// For example, it may be used to display a message like: -// "Dependent on sheet 'FOO' which was updated more recently than this printout" - -SocialCalc.Formula.FreshnessInfo = { - - // For each external sheet referenced successfully an attribute of that name with value true. - - sheets: {}, - - // For each volatile function that is called an attribute of that name with value true. - - volatile: {}, - - // Set to false when started and true when recalc completes - - recalc_completed: false - - }; - -SocialCalc.Formula.FreshnessInfoReset = function() { - - var scffi = SocialCalc.Formula.FreshnessInfo; - - scffi.sheets = {}; - scffi.volatile = {}; - scffi.recalc_completed = false; - - } - -// -// MISC ROUTINES -// - -// -// result = SocialCalc.Formula.PlainCoord(coord) -// -// Returns: coord without any $'s -// - -SocialCalc.Formula.PlainCoord = function(coord) { - - if (coord.indexOf("$") == -1) return coord; - - return coord.replace(/\$/g, ""); // remove any $'s - - } - -// -// result = SocialCalc.Formula.OrderRangeParts(coord1, coord2) -// -// Returns: {c1: col, r1: row, c2: col, r2 = row} with c1/r1 upper left -// - -SocialCalc.Formula.OrderRangeParts = function(coord1, coord2) { - - var cr1, cr2; - var result = {}; - - cr1 = SocialCalc.coordToCr(coord1); - cr2 = SocialCalc.coordToCr(coord2); - if (cr1.col > cr2.col) { result.c1 = cr2.col; result.c2 = cr1.col; } - else { result.c1 = cr1.col; result.c2 = cr2.col; } - if (cr1.row > cr2.row) { result.r1 = cr2.row; result.r2 = cr1.row; } - else { result.r1 = cr1.row; result.r2 = cr2.row; } - - return result; - - } - -// -// cond = SocialCalc.Formula.TestCriteria(value, type, criteria) -// -// Determines whether a value/type meets the criteria. -// A criteria can be a numeric value, text beginning with <, <=, =, >=, >, <>, text by itself is start of text to match. -// Used by a variety of functions, including the "D" functions (DSUM, etc.). -// -// Returns true or false -// - -SocialCalc.Formula.TestCriteria = function(value, type, criteria) { - - var comparitor, basestring, basevalue, cond, testvalue; - - if (criteria == null) { // undefined (e.g., error value) is always false - return false; - } - - criteria = criteria + ""; - comparitor = criteria.charAt(0); // look for comparitor - if (comparitor == "=" || comparitor == "<" || comparitor == ">") { - basestring = criteria.substring(1); - } - else { - comparitor = criteria.substring(0,2); - if (comparitor == "<=" || comparitor == "<>" || comparitor == ">=") { - basestring = criteria.substring(2); - } - else { - comparitor = "none"; - basestring = criteria; - } - } - - basevalue = SocialCalc.DetermineValueType(basestring); // get type of value being compared - if (!basevalue.type) { // no criteria base value given - if (comparitor == "none") { // blank criteria matches nothing - return false; - } - if (type.charAt(0) == "b") { // comparing to empty cell - if (comparitor == "=") { // empty equals empty - return true; - } - } - else { - if (comparitor == "<>") { // "something" does not equal empty - return true; - } - } - return false; // otherwise false - } - - cond = false; - - if (basevalue.type.charAt(0) == "n" && type.charAt(0) == "t") { // criteria is number, but value is text - testvalue = SocialCalc.DetermineValueType(value); - if (testvalue.type.charAt(0) == "n") { // could be number - make it one - value = testvalue.value; - type = testvalue.type; - } - } - - if (type.charAt(0) == "n" && basevalue.type.charAt(0) == "n") { // compare two numbers - value = value - 0; // make sure numbers - basevalue.value = basevalue.value - 0; - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - case "none": - cond = value == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } - - else if (type.charAt(0) == "e") { // error on left - cond = false; - } - - else if (basevalue.type.charAt(0) == "e") { // error on right - cond = false; - } - - else { // text, maybe mixed with number or blank - if (type.charAt(0) == "n") { - value = SocialCalc.format_number_for_display(value, "n", ""); - } - if (basevalue.type.charAt(0) == "n") { - return false; // if number and didn't match already, isn't a match - } - - value = value ? value.toLowerCase() : ""; - basevalue.value = basevalue.value ? basevalue.value.toLowerCase() : ""; - - switch (comparitor) { - case "<": - cond = value < basevalue.value; - break; - - case "<=": - cond = value <= basevalue.value; - break; - - case "=": - cond = value == basevalue.value; - break; - - case "none": - cond = value.substring(0, basevalue.value.length) == basevalue.value; - break; - - case ">=": - cond = value >= basevalue.value; - break; - - case ">": - cond = value > basevalue.value; - break; - - case "<>": - cond = value != basevalue.value; - break; - } - } - - return cond; - - } - diff --git a/Website/static/runappios43c/lib/aspiring/images/delete.png b/Website/static/runappios43c/lib/aspiring/images/delete.png deleted file mode 100755 index 903b660..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/delete.png and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/delete24.png b/Website/static/runappios43c/lib/aspiring/images/delete24.png deleted file mode 100755 index 2010ee8..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/delete24.png and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/icons/14_128x128.png b/Website/static/runappios43c/lib/aspiring/images/icons/14_128x128.png deleted file mode 100755 index 981e2a6..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/icons/14_128x128.png and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/icons/20_128x128.png b/Website/static/runappios43c/lib/aspiring/images/icons/20_128x128.png deleted file mode 100755 index 37262a2..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/icons/20_128x128.png and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/icons/23_128x128.png b/Website/static/runappios43c/lib/aspiring/images/icons/23_128x128.png deleted file mode 100755 index ddf28f0..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/icons/23_128x128.png and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/icons/cash-register-icon.png b/Website/static/runappios43c/lib/aspiring/images/icons/cash-register-icon.png deleted file mode 100755 index 91f2239..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/icons/cash-register-icon.png and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/icons/spreadsheet-icon.png b/Website/static/runappios43c/lib/aspiring/images/icons/spreadsheet-icon.png deleted file mode 100755 index 38a7392..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/icons/spreadsheet-icon.png and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-1x1.gif b/Website/static/runappios43c/lib/aspiring/images/sc-1x1.gif deleted file mode 100755 index 1d9a4f5..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-1x1.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-add-2.png b/Website/static/runappios43c/lib/aspiring/images/sc-add-2.png deleted file mode 100755 index 3cd3b73..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-add-2.png and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-aligncenter.gif b/Website/static/runappios43c/lib/aspiring/images/sc-aligncenter.gif deleted file mode 100755 index 81fae2a..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-aligncenter.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-alignleft.gif b/Website/static/runappios43c/lib/aspiring/images/sc-alignleft.gif deleted file mode 100755 index 0f3fea7..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-alignleft.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-alignright.gif b/Website/static/runappios43c/lib/aspiring/images/sc-alignright.gif deleted file mode 100755 index c89e242..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-alignright.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-bordersoff.gif b/Website/static/runappios43c/lib/aspiring/images/sc-bordersoff.gif deleted file mode 100755 index ffad4a2..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-bordersoff.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-borderson.gif b/Website/static/runappios43c/lib/aspiring/images/sc-borderson.gif deleted file mode 100755 index 0224acc..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-borderson.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-chooserarrow.gif b/Website/static/runappios43c/lib/aspiring/images/sc-chooserarrow.gif deleted file mode 100755 index b9010e2..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-chooserarrow.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-commentbg.gif b/Website/static/runappios43c/lib/aspiring/images/sc-commentbg.gif deleted file mode 100755 index 0b5e17a..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-commentbg.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-copy.gif b/Website/static/runappios43c/lib/aspiring/images/sc-copy.gif deleted file mode 100755 index 4ed54d0..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-copy.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-cursorinsertleft.gif b/Website/static/runappios43c/lib/aspiring/images/sc-cursorinsertleft.gif deleted file mode 100755 index 03e9769..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-cursorinsertleft.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-cursorinsertup.gif b/Website/static/runappios43c/lib/aspiring/images/sc-cursorinsertup.gif deleted file mode 100755 index 03e9769..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-cursorinsertup.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-cut.gif b/Website/static/runappios43c/lib/aspiring/images/sc-cut.gif deleted file mode 100755 index cb906cc..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-cut.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-defaultcolor.gif b/Website/static/runappios43c/lib/aspiring/images/sc-defaultcolor.gif deleted file mode 100755 index e9d69cd..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-defaultcolor.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-delete.gif b/Website/static/runappios43c/lib/aspiring/images/sc-delete.gif deleted file mode 100755 index b8d18a7..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-delete.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-deletecol.gif b/Website/static/runappios43c/lib/aspiring/images/sc-deletecol.gif deleted file mode 100755 index 0242f70..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-deletecol.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-deleterow.gif b/Website/static/runappios43c/lib/aspiring/images/sc-deleterow.gif deleted file mode 100755 index 0ff543e..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-deleterow.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-divider1.gif b/Website/static/runappios43c/lib/aspiring/images/sc-divider1.gif deleted file mode 100755 index 2f3ac5b..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-divider1.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-drag-handles.gif b/Website/static/runappios43c/lib/aspiring/images/sc-drag-handles.gif deleted file mode 100755 index e2ffef1..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-drag-handles.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-drag-handles.png b/Website/static/runappios43c/lib/aspiring/images/sc-drag-handles.png deleted file mode 100755 index b57b5a2..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-drag-handles.png and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-endcap-h.gif b/Website/static/runappios43c/lib/aspiring/images/sc-endcap-h.gif deleted file mode 100755 index 900afd6..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-endcap-h.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-endcap-v.gif b/Website/static/runappios43c/lib/aspiring/images/sc-endcap-v.gif deleted file mode 100755 index 3e6ba4f..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-endcap-v.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-filldown.gif b/Website/static/runappios43c/lib/aspiring/images/sc-filldown.gif deleted file mode 100755 index a0d6cba..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-filldown.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-fillright.gif b/Website/static/runappios43c/lib/aspiring/images/sc-fillright.gif deleted file mode 100755 index 5169a72..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-fillright.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-formuladialog.gif b/Website/static/runappios43c/lib/aspiring/images/sc-formuladialog.gif deleted file mode 100755 index 404f991..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-formuladialog.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-insertcol.gif b/Website/static/runappios43c/lib/aspiring/images/sc-insertcol.gif deleted file mode 100755 index 8be72e8..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-insertcol.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-insertrow.gif b/Website/static/runappios43c/lib/aspiring/images/sc-insertrow.gif deleted file mode 100755 index 28ab390..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-insertrow.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-less-hd.gif b/Website/static/runappios43c/lib/aspiring/images/sc-less-hd.gif deleted file mode 100755 index 689ebc9..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-less-hd.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-less-hh.gif b/Website/static/runappios43c/lib/aspiring/images/sc-less-hh.gif deleted file mode 100755 index f1d978e..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-less-hh.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-less-hn.gif b/Website/static/runappios43c/lib/aspiring/images/sc-less-hn.gif deleted file mode 100755 index 81245b8..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-less-hn.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-less-vd.gif b/Website/static/runappios43c/lib/aspiring/images/sc-less-vd.gif deleted file mode 100755 index 605801f..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-less-vd.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-less-vh.gif b/Website/static/runappios43c/lib/aspiring/images/sc-less-vh.gif deleted file mode 100755 index aa2de92..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-less-vh.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-less-vn.gif b/Website/static/runappios43c/lib/aspiring/images/sc-less-vn.gif deleted file mode 100755 index 88290ef..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-less-vn.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-linkdialog.gif b/Website/static/runappios43c/lib/aspiring/images/sc-linkdialog.gif deleted file mode 100755 index d206394..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-linkdialog.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-linkout.gif b/Website/static/runappios43c/lib/aspiring/images/sc-linkout.gif deleted file mode 100755 index 9215def..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-linkout.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-logo.gif b/Website/static/runappios43c/lib/aspiring/images/sc-logo.gif deleted file mode 100755 index b76d534..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-logo.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-main-h.gif b/Website/static/runappios43c/lib/aspiring/images/sc-main-h.gif deleted file mode 100755 index 0b260ed..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-main-h.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-main-v.gif b/Website/static/runappios43c/lib/aspiring/images/sc-main-v.gif deleted file mode 100755 index 0fb12bb..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-main-v.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-menu-dropdown.png b/Website/static/runappios43c/lib/aspiring/images/sc-menu-dropdown.png deleted file mode 100755 index 938cee8..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-menu-dropdown.png and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-merge.gif b/Website/static/runappios43c/lib/aspiring/images/sc-merge.gif deleted file mode 100755 index 666b597..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-merge.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-more-hd.gif b/Website/static/runappios43c/lib/aspiring/images/sc-more-hd.gif deleted file mode 100755 index 2eb56e0..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-more-hd.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-more-hh.gif b/Website/static/runappios43c/lib/aspiring/images/sc-more-hh.gif deleted file mode 100755 index fc1059a..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-more-hh.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-more-hn.gif b/Website/static/runappios43c/lib/aspiring/images/sc-more-hn.gif deleted file mode 100755 index 7e07204..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-more-hn.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-more-vd.gif b/Website/static/runappios43c/lib/aspiring/images/sc-more-vd.gif deleted file mode 100755 index 055f4ac..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-more-vd.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-more-vh.gif b/Website/static/runappios43c/lib/aspiring/images/sc-more-vh.gif deleted file mode 100755 index 07acdf7..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-more-vh.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-more-vn.gif b/Website/static/runappios43c/lib/aspiring/images/sc-more-vn.gif deleted file mode 100755 index 922756d..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-more-vn.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-movefrom.gif b/Website/static/runappios43c/lib/aspiring/images/sc-movefrom.gif deleted file mode 100755 index 7f665eb..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-movefrom.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-movefromoff.gif b/Website/static/runappios43c/lib/aspiring/images/sc-movefromoff.gif deleted file mode 100755 index 1760f02..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-movefromoff.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-moveinsert.gif b/Website/static/runappios43c/lib/aspiring/images/sc-moveinsert.gif deleted file mode 100755 index f082171..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-moveinsert.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-moveinsertoff.gif b/Website/static/runappios43c/lib/aspiring/images/sc-moveinsertoff.gif deleted file mode 100755 index cbb4f30..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-moveinsertoff.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-movepaste.gif b/Website/static/runappios43c/lib/aspiring/images/sc-movepaste.gif deleted file mode 100755 index 93108d1..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-movepaste.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-movepasteoff.gif b/Website/static/runappios43c/lib/aspiring/images/sc-movepasteoff.gif deleted file mode 100755 index 254c572..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-movepasteoff.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-multilinedialog.gif b/Website/static/runappios43c/lib/aspiring/images/sc-multilinedialog.gif deleted file mode 100755 index 1e0d6d6..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-multilinedialog.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-paneslider-h.gif b/Website/static/runappios43c/lib/aspiring/images/sc-paneslider-h.gif deleted file mode 100755 index 8cb31d4..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-paneslider-h.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-paneslider-v.gif b/Website/static/runappios43c/lib/aspiring/images/sc-paneslider-v.gif deleted file mode 100755 index c4bcaee..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-paneslider-v.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-paste.gif b/Website/static/runappios43c/lib/aspiring/images/sc-paste.gif deleted file mode 100755 index e39f06c..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-paste.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-pasteformats.gif b/Website/static/runappios43c/lib/aspiring/images/sc-pasteformats.gif deleted file mode 100755 index 94b2f50..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-pasteformats.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-peerbg.gif b/Website/static/runappios43c/lib/aspiring/images/sc-peerbg.gif deleted file mode 100755 index bef9c21..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-peerbg.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-range2.gif b/Website/static/runappios43c/lib/aspiring/images/sc-range2.gif deleted file mode 100755 index e9d69cd..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-range2.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-recalc.gif b/Website/static/runappios43c/lib/aspiring/images/sc-recalc.gif deleted file mode 100755 index 6e1ebb8..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-recalc.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-redo.gif b/Website/static/runappios43c/lib/aspiring/images/sc-redo.gif deleted file mode 100755 index b14aca8..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-redo.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-scrollarea-h.gif b/Website/static/runappios43c/lib/aspiring/images/sc-scrollarea-h.gif deleted file mode 100755 index c12715b..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-scrollarea-h.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-scrollarea-v.gif b/Website/static/runappios43c/lib/aspiring/images/sc-scrollarea-v.gif deleted file mode 100755 index df99311..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-scrollarea-v.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-sumdialog.gif b/Website/static/runappios43c/lib/aspiring/images/sc-sumdialog.gif deleted file mode 100755 index f6bb9ad..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-sumdialog.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-swapcolors.gif b/Website/static/runappios43c/lib/aspiring/images/sc-swapcolors.gif deleted file mode 100755 index 49c6e80..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-swapcolors.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-thumb-hd.gif b/Website/static/runappios43c/lib/aspiring/images/sc-thumb-hd.gif deleted file mode 100755 index e3afbd2..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-thumb-hd.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-thumb-hh.gif b/Website/static/runappios43c/lib/aspiring/images/sc-thumb-hh.gif deleted file mode 100755 index 47237c2..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-thumb-hh.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-thumb-hn.gif b/Website/static/runappios43c/lib/aspiring/images/sc-thumb-hn.gif deleted file mode 100755 index a8e0f08..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-thumb-hn.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-thumb-vd.gif b/Website/static/runappios43c/lib/aspiring/images/sc-thumb-vd.gif deleted file mode 100755 index c900734..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-thumb-vd.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-thumb-vh.gif b/Website/static/runappios43c/lib/aspiring/images/sc-thumb-vh.gif deleted file mode 100755 index a3229c7..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-thumb-vh.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-thumb-vn.gif b/Website/static/runappios43c/lib/aspiring/images/sc-thumb-vn.gif deleted file mode 100755 index d528f43..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-thumb-vn.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-trackingline-h.gif b/Website/static/runappios43c/lib/aspiring/images/sc-trackingline-h.gif deleted file mode 100755 index efeff83..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-trackingline-h.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-trackingline-v.gif b/Website/static/runappios43c/lib/aspiring/images/sc-trackingline-v.gif deleted file mode 100755 index ce6e8cb..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-trackingline-v.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-undo.gif b/Website/static/runappios43c/lib/aspiring/images/sc-undo.gif deleted file mode 100755 index 66a07f8..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-undo.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-unmerge.gif b/Website/static/runappios43c/lib/aspiring/images/sc-unmerge.gif deleted file mode 100755 index 7e0df32..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-unmerge.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-wikiflag.gif b/Website/static/runappios43c/lib/aspiring/images/sc-wikiflag.gif deleted file mode 100755 index caf0e3f..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-wikiflag.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/sc-wikilinkflag.gif b/Website/static/runappios43c/lib/aspiring/images/sc-wikilinkflag.gif deleted file mode 100755 index 5ed3700..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/sc-wikilinkflag.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/images/spinner.gif b/Website/static/runappios43c/lib/aspiring/images/spinner.gif deleted file mode 100755 index cc70a7a..0000000 Binary files a/Website/static/runappios43c/lib/aspiring/images/spinner.gif and /dev/null differ diff --git a/Website/static/runappios43c/lib/aspiring/json2.js b/Website/static/runappios43c/lib/aspiring/json2.js deleted file mode 100755 index 6bdea10..0000000 --- a/Website/static/runappios43c/lib/aspiring/json2.js +++ /dev/null @@ -1,482 +0,0 @@ -/* - http://www.JSON.org/json2.js - 2010-08-25 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date ? - 'Date(' + this[key] + ')' : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - -/*jslint evil: true, strict: false */ - -/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, - call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - -// Create a JSON object only if one does not already exist. We create the -// methods in a closure to avoid creating global variables. - -if (!this.JSON) { - this.JSON = {}; -} - -(function () { - - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - if (typeof Date.prototype.toJSON !== 'function') { - - Date.prototype.toJSON = function (key) { - - return isFinite(this.valueOf()) ? - this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z' : null; - }; - - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = function (key) { - return this.valueOf(); - }; - } - - var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; - - - function quote(string) { - -// If the string contains no control characters, no quote characters, and no -// backslash characters, then we can safely slap some quotes around it. -// Otherwise we must also replace the offending characters with safe escape -// sequences. - - escapable.lastIndex = 0; - return escapable.test(string) ? - '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : - '"' + string + '"'; - } - - - function str(key, holder) { - -// Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - -// If the value has a toJSON method, call it to obtain a replacement value. - - if (value && typeof value === 'object' && - typeof value.toJSON === 'function') { - value = value.toJSON(key); - } - -// If we were called with a replacer function, then call the replacer to -// obtain a replacement value. - - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } - -// What happens next depends on the value's type. - - switch (typeof value) { - case 'string': - return quote(value); - - case 'number': - -// JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : 'null'; - - case 'boolean': - case 'null': - -// If the value is a boolean or null, convert it to a string. Note: -// typeof null does not produce 'null'. The case is included here in -// the remote chance that this gets fixed someday. - - return String(value); - -// If the type is 'object', we might be dealing with an object or an array or -// null. - - case 'object': - -// Due to a specification blunder in ECMAScript, typeof null is 'object', -// so watch out for that case. - - if (!value) { - return 'null'; - } - -// Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - -// Is the value an array? - - if (Object.prototype.toString.apply(value) === '[object Array]') { - -// The value is an array. Stringify every element. Use null as a placeholder -// for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } - -// Join all of the elements together, separated with commas, and wrap them in -// brackets. - - v = partial.length === 0 ? '[]' : - gap ? '[\n' + gap + - partial.join(',\n' + gap) + '\n' + - mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - -// If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === 'string') { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } else { - -// Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - -// Join all of the member texts together, separated with commas, -// and wrap them in braces. - - v = partial.length === 0 ? '{}' : - gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + - mind + '}' : '{' + partial.join(',') + '}'; - gap = mind; - return v; - } - } - -// If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== 'function') { - JSON.stringify = function (value, replacer, space) { - -// The stringify method takes a value and an optional replacer, and an optional -// space parameter, and returns a JSON text. The replacer can be a function -// that can replace values, or an array of strings that will select the keys. -// A default replacer method can be provided. Use of the space parameter can -// produce text that is more easily readable. - - var i; - gap = ''; - indent = ''; - -// If the space parameter is a number, make an indent string containing that -// many spaces. - - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - -// If the space parameter is a string, it will be used as the indent string. - - } else if (typeof space === 'string') { - indent = space; - } - -// If there is a replacer, it must be a function or an array. -// Otherwise, throw an error. - - rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - -// Make a fake root object containing our value under the key of ''. -// Return the result of stringifying the value. - - return str('', {'': value}); - }; - } - - -// If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== 'function') { - JSON.parse = function (text, reviver) { - -// The parse method takes a text and an optional reviver function, and returns -// a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - -// The walk method is used to recursively walk the resulting structure so -// that modifications can be made. - - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - -// Parsing happens in four stages. In the first stage, we replace certain -// Unicode characters with escape sequences. JavaScript handles many characters -// incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return '\\u' + - ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - -// In the second stage, we run the text against regular expressions that look -// for non-JSON patterns. We are especially concerned with '()' and 'new' -// because they can cause invocation, and '=' because it can cause mutation. -// But just to be safe, we want to reject all unexpected forms. - -// We split the second stage into 4 regexp operations in order to work around -// crippling inefficiencies in IE's and Safari's regexp engines. First we -// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we -// replace all simple value tokens with ']' characters. Third, we delete all -// open brackets that follow a colon or comma or that begin the text. Finally, -// we look to see that the remaining characters are only whitespace or ']' or -// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if (/^[\],:{}\s]*$/ -.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') -.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') -.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { - -// In the third stage we use the eval function to compile the text into a -// JavaScript structure. The '{' operator is subject to a syntactic ambiguity -// in JavaScript: it can begin a block or an object literal. We wrap the text -// in parens to eliminate the ambiguity. - - j = eval('(' + text + ')'); - -// In the optional fourth stage, we recursively walk the new structure, passing -// each name/value pair to a reviver function for possible transformation. - - return typeof reviver === 'function' ? - walk({'': j}, '') : j; - } - -// If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError('JSON.parse'); - }; - } -}()); diff --git a/Website/static/runappios43c/lib/aspiring/socialcalc-3.js b/Website/static/runappios43c/lib/aspiring/socialcalc-3.js deleted file mode 100755 index fe55082..0000000 --- a/Website/static/runappios43c/lib/aspiring/socialcalc-3.js +++ /dev/null @@ -1,5827 +0,0 @@ -// -// The main SocialCalc code module of the SocialCalc package -// -/* -// (c) Copyright 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - -/* - -**** Overview **** - -This is the beginning of a library of routines for displaying and editing spreadsheet -data in a browser. The HTML that includes this does not need to have anything -specific to the spreadsheet or editor already present -- everything is dynamically -added to the DOM by this code, including the rendered sheet and any editing controls. - -The library has a few parts. This is the main SocialCalc code module. -Other parts are the Table Editor module, the Formula module, and the Format Number module. -Note: The Table Editor module is licensed under a different license than this module. - -The class/object style is derived from O'Reilly's JavaScript by Flanagan, 5th Edition, -section 9.3, page 157. - -All of the data, object definitions, functions, etc., are stored as properties of the SocialCalc -object so as not to clutter up the global variables nor conflict with other names. - -A design goal (not tested yet for success) is to make it possible to have more than one -spreadsheet active on a page, perhaps even open for editing. It is assumed, though, that -there is only one mouse and one keyboard (a good assumption on most PCs today but not in the -new "touch and surface world" Apple and Microsoft are working towards). - -The testing has been on Windows Firefox (2 and 3), -Internet Explorer (6 and 7), Opera (9.23 and mainly later), Mac Safari (3.1), and Mac Firefox (2.0.0.6). -There are small issues with Firefox before 2.0 (cosmetic with drag handles) and larger ones -with Opera before 9.5 (the Delete key isn't recognized in some cases -- the 9.5 version was still -in beta and this bug affects other products like GMail, I believe). - -The data is stored in a SocialCalc.Sheet object. The data is organized in a form similar to that -used by SocialCalc 1.1.0. There is a function for converting a normal SocialCalc spreadsheet -save data string (the spreadsheet part of a SocialCalc data file) into this internal form. - -The SocialCalc.RenderContext class provides methods for rendering a table into the DOM representing -part of the spreadsheet. It is assumed that the spreadsheet could possibly be very large -and that rendering the whole thing at once could be too time consuming. It is also set up so -that it might be possible to have some of the sheet data only be loaded on demand (such as by Ajax). -The rendering can render cells to the right and below the already active area of the spreadsheet -so that you can scroll to that "clean" area without explicitly doing "add row/column". The class also -does simple operations such as "scrolling" within that table. The table may optionally include -row and column headers and may be split into panes. Most of the code assumes any number of panes, -but only the rightmost pane has scrolling code. In normal operation there would be one or two -panes horizontally and vertically. The panes may start on any row/column, though a given row/column -should only appear in one pane at a time (not all code enforces this, yet). - -The RenderContext is designed to be rendered as part of a SocialCalc.TableEditor. The TableEditor -includes the spreadsheet grid as well as scrollbars, pane sliders, and (eventually) editing controls. -The layout is dynamic and may be recomputed on the fly, such as in response to resizing the browser -window. - -The scrollbars and pane sliders are created using SocialCalc.TableControl objects. These in turn -make use of Dragging, ToolTip, Button, and MouseWheel functions. - -The keyboard input is handled by keyboard code. - -There are also some helper routines. - -More comments yet to come... - -*/ - - -var SocialCalc; -if (!SocialCalc) SocialCalc = {}; - -// ************************************* -// -// Shared values -// -// These are "global" values shared by the classes, including default settings -// -// ************************************* - -// Callbacks - -SocialCalc.Callbacks = { - - // The next two are used by SocialCalc.format_text_for_display - - // The function to expand wiki text - should be set if you want wikitext expansion - // The form is: expand_wiki(displayvalue, sheetobj, linkstyle, valueformat) - // valueformat is text-wiki followed by optional sub-formats, e.g., text-wikipagelink - - expand_wiki: null, - - expand_markup: function(displayvalue, sheetobj, linkstyle) // the old function to expand wiki text - may be replaced - {return SocialCalc.default_expand_markup(displayvalue, sheetobj, linkstyle);}, - - // MakePageLink is used to create the href for a link to another "page" - // The form is: MakePageLink(pagename, workspacename, linktyle, valueformat), returns string - - MakePageLink: null, - - // NormalizeSheetName is used to make different variations of sheetnames use the same cache slot - - NormalizeSheetName: null // use default - lowercase - - }; - -// Shared flags - - // none at present - - -// ************************************* -// -// Cell class: -// -// ************************************* - -// -// Class SocialCalc.Cell -// -// Usage: var s = new SocialCalc.Cell(coord); -// -// Cell attributes include: -// -// coord: the column/row as a string, e.g., "A1" -// datavalue: the value to be used for computation and formatting for display, -// string or numeric (tolerant of numbers stored as strings) -// datatype: if present, v=numeric value, t=text value, f=formula, -// or c=constant that is not a simple number (like "$1.20") -// formula: if present, the formula (without leading "=") for computation or the constant -// valuetype: first char is main type, the following are sub-types. -// Main types are b=blank cell, n=numeric, t=text, e=error -// Examples of using sub-types would be "nt" for a numeric time value, "n$" for currency, "nl" for logical -// displayvalue: if present, rendered version of datavalue with formatting attributes applied -// parseinfo: if present, cached parsed version of formula -// -// The following optional values, if present, are mainly used in rendering, overriding defaults: -// -// bt, br, bb, bl: number of border's definition -// layout: layout (vertical alignment, padding) definition number -// font: font definition number -// color: text color definition number -// bgcolor: background color definition number -// cellformat: cell format (horizontal alignment) definition number -// nontextvalueformat: custom format definition number for non-text values, e.g., numbers -// textvalueformat: custom format definition number for text values -// colspan, rowspan: number of cells to span for merged cells (only on main cell) -// cssc: custom css classname for cell, as text (no special chars) -// csss: custom css style definition -// mod: modification allowed flag "y" if present -// comment: cell comment string -// - -SocialCalc.Cell = function(coord) { - - this.coord = coord; - this.datavalue = ""; - this.datatype = null; - this.formula = ""; - this.valuetype = "b"; - - } - -// The types of cell properties -// -// Type 1: Base, Type 2: Attribute, Type 3: Special (e.g., displaystring, parseinfo) - -SocialCalc.CellProperties = { - coord: 1, datavalue: 1, datatype: 1, formula: 1, valuetype: 1, errors: 1, comment: 1, - bt: 2, br: 2, bb: 2, bl: 2, layout: 2, font: 2, color: 2, bgcolor: 2, - cellformat: 2, nontextvalueformat: 2, textvalueformat: 2, colspan: 2, rowspan: 2, - cssc: 2, csss: 2, mod: 2, - displaystring: 3, // used to cache rendered HTML of cell contents - parseinfo: 3, // used to cache parsed formulas - hcolspan: 3, hrowspan: 3 // spans taking hidden cols/rows into account (!!! NOT YET !!!) - }; - -SocialCalc.CellPropertiesTable = { - bt: "borderstyle", br: "borderstyle", bb: "borderstyle", bl: "borderstyle", - layout: "layout", font: "font", color: "color", bgcolor: "color", - cellformat: "cellformat", nontextvalueformat: "valueformat", textvalueformat: "valueformat" - }; - -// ************************************* -// -// Sheet class: -// -// ************************************* - -// -// Class SocialCalc.Sheet -// -// Usage: var s = new SocialCalc.Sheet(); -// - -SocialCalc.Sheet = function() { - - SocialCalc.ResetSheet(this); - - // Set other values: - // - // sheet.statuscallback(data, status, arg, this.statuscallbackparams) is called - // during recalc and commands. - // - // During recalc, data is the current recalcdata. - // The values for status and the corresponding arg are: - // - // calcorder, {coord: coord, total: celllist length, count: count} [0 or more times per recalc] - // calccheckdone, calclist length [once per recalc] - // calcstep, {coord: coord, total: calclist length, count: count} [0 or more times per recalc] - // calcloading, {sheetname: name-of-sheet} - // calcserverfunc, {funcname: name-of-function, coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds [once per recalc] - // - // During commands, data is SocialCalc.SheetCommandInfo. - // These values for status and arg are: - // - // cmdstart, cmdstr - // cmdend - // - - this.statuscallback = null; // routine called with cmdstart, calcstart, etc., status and args: - // sheet.statuscallback(data, status, arg, params) - this.statuscallbackparams = null; // parameters passed to that routine - - } - -// -// SocialCalc.ResetSheet(sheet) -// -// Resets (and/or initializes) sheet data values. -// - -SocialCalc.ResetSheet = function(sheet, reload) { - - // properties: - - sheet.cells = {}; // at least one for each non-blank cell: coord: cell-object - sheet.attribs = // sheet attributes - { - lastcol: 1, - lastrow: 1, - defaultlayout: 0 - }; - sheet.rowattribs = - { - hide: {}, // access by row number - height: {} - }; - sheet.colattribs = - { - width: {}, // access by col name - hide: {} - }; - sheet.names={}; // Each is: {desc: "optional description", definition: "B5, A1:B7, or =formula"} - sheet.layouts=[]; - sheet.layouthash={}; - sheet.fonts=[]; - sheet.fonthash={}; - sheet.colors=[]; - sheet.colorhash={}; - sheet.borderstyles=[]; - sheet.borderstylehash={}; - sheet.cellformats=[]; - sheet.cellformathash={}; - sheet.valueformats=[]; - sheet.valueformathash={}; - - sheet.copiedfrom = ""; // if a range, then this was loaded from a saved range as clipboard content - - sheet.changes = new SocialCalc.UndoStack(); - - sheet.renderneeded = false; - - sheet.changedrendervalues = true; // if true, spans and/or fonts have changed (set by ExecuteSheetCommand & GetStyle) - - sheet.recalcchangedavalue = false; // true if a recalc resulted in a change to a cell's calculated value - - } - -// Methods: - -SocialCalc.Sheet.prototype.ResetSheet = function() {SocialCalc.ResetSheet(this);}; -SocialCalc.Sheet.prototype.AddCell = function(newcell) {return this.cells[newcell.coord]=newcell;}; -SocialCalc.Sheet.prototype.GetAssuredCell = function(coord) { - return this.cells[coord] || this.AddCell(new SocialCalc.Cell(coord)); - }; -SocialCalc.Sheet.prototype.ParseSheetSave = function(savedsheet) {SocialCalc.ParseSheetSave(savedsheet,this);}; -SocialCalc.Sheet.prototype.CellFromStringParts = function(cell, parts, j) {return SocialCalc.CellFromStringParts(this, cell, parts, j);}; -SocialCalc.Sheet.prototype.CreateSheetSave = function(range, canonicalize) {return SocialCalc.CreateSheetSave(this, range, canonicalize);}; -SocialCalc.Sheet.prototype.CellToString = function(cell) {return SocialCalc.CellToString(this, cell);}; -SocialCalc.Sheet.prototype.CanonicalizeSheet = function(full) {return SocialCalc.CanonicalizeSheet(this, full);}; -SocialCalc.Sheet.prototype.EncodeCellAttributes = function(coord) {return SocialCalc.EncodeCellAttributes(this, coord);}; -SocialCalc.Sheet.prototype.EncodeSheetAttributes = function() {return SocialCalc.EncodeSheetAttributes(this);}; -SocialCalc.Sheet.prototype.DecodeCellAttributes = function(coord, attribs, range) {return SocialCalc.DecodeCellAttributes(this, coord, attribs, range);}; -SocialCalc.Sheet.prototype.DecodeSheetAttributes = function(attribs) {return SocialCalc.DecodeSheetAttributes(this, attribs);}; - -SocialCalc.Sheet.prototype.ScheduleSheetCommands = function(cmd, saveundo, isRemote) {return SocialCalc.ScheduleSheetCommands(this, cmd, saveundo, isRemote);}; -SocialCalc.Sheet.prototype.SheetUndo = function() {return SocialCalc.SheetUndo(this);}; -SocialCalc.Sheet.prototype.SheetRedo = function() {return SocialCalc.SheetRedo(this);}; -SocialCalc.Sheet.prototype.CreateAuditString = function() {return SocialCalc.CreateAuditString(this);}; -SocialCalc.Sheet.prototype.GetStyleNum = function(atype, style) {return SocialCalc.GetStyleNum(this, atype, style);}; -SocialCalc.Sheet.prototype.GetStyleString = function(atype, num) {return SocialCalc.GetStyleString(this, atype, num);}; -SocialCalc.Sheet.prototype.RecalcSheet = function() {return SocialCalc.RecalcSheet(this);}; - -// -// Sheet save format: -// -// linetype:param1:param2:... -// -// Linetypes are: -// -// version:versionname - version of this format. Currently 1.4. -// -// cell:coord:type:value...:type:value... - Types are as follows: -// -// v:value - straight numeric value -// t:value - straight text/wiki-text in cell, encoded to handle \, :, newlines -// vt:fulltype:value - value with value type/subtype -// vtf:fulltype:value:formulatext - formula resulting in value with value type/subtype, value and text encoded -// vtc:fulltype:value:valuetext - formatted text constant resulting in value with value type/subtype, value and text encoded -// vf:fvalue:formulatext - formula resulting in value, value and text encoded (obsolete: only pre format version 1.1) -// fvalue - first char is "N" for numeric value, "T" for text value, "H" for HTML value, rest is the value -// e:errortext - Error text. Non-blank means formula parsing/calculation results in error. -// b:topborder#:rightborder#:bottomborder#:leftborder# - border# in sheet border list or blank if none -// l:layout# - number in cell layout list -// f:font# - number in sheet fonts list -// c:color# - sheet color list index for text -// bg:color# - sheet color list index for background color -// cf:format# - sheet cell format number for explicit format (align:left, etc.) -// cvf:valueformat# - sheet cell value format number (obsolete: only pre format v1.2) -// tvf:valueformat# - sheet cell text value format number -// ntvf:valueformat# - sheet cell non-text value format number -// colspan:numcols - number of columns spanned in merged cell -// rowspan:numrows - number of rows spanned in merged cell -// cssc:classname - name of CSS class to be used for cell when published instead of one calculated here -// csss:styletext - explicit CSS style information, encoded to handle :, etc. -// mod:allow - if "y" allow modification of cell for live "view" recalc -// comment:value - encoded text of comment for this cell (added in v1.5) -// -// col: -// w:widthval - number, "auto" (no width in tag), number%, or blank (use default) -// hide: - yes/no, no is assumed if missing -// row: -// hide - yes/no, no is assumed if missing -// -// sheet: -// c:lastcol - number -// r:lastrow - number -// w:defaultcolwidth - number, "auto", number%, or blank (default->80) -// h:defaultrowheight - not used -// tf:format# - cell format number for sheet default for text values -// ntf:format# - cell format number for sheet default for non-text values (i.e., numbers) -// layout:layout# - default cell layout number in cell layout list -// font:font# - default font number in sheet font list -// vf:valueformat# - default number value format number in sheet valueformat list (obsolete: only pre format version 1.2) -// ntvf:valueformat# - default non-text (number) value format number in sheet valueformat list -// tvf:valueformat# - default text value format number in sheet valueformat list -// color:color# - default number for text color in sheet color list -// bgcolor:color# - default number for background color in sheet color list -// circularreferencecell:coord - cell coord with a circular reference -// recalc:value - on/off (on is default). If not "off", appropriate changes to the sheet cause a recalc -// needsrecalc:value - yes/no (no is default). If "yes", formula values are not up to date -// -// name:name:description:value - name definition, name in uppercase, with value being "B5", "A1:B7", or "=formula"; -// description and value are encoded. -// font:fontnum:value - text of font definition (style weight size family) for font fontnum -// "*" for "style weight", size, or family, means use default (first look to sheet, then builtin) -// color:colornum:rgbvalue - text of color definition (e.g., rgb(255,255,255)) for color colornum -// border:bordernum:value - text of border definition (thickness style color) for border bordernum -// layout:layoutnum:value - text of vertical alignment and padding style for cell layout layoutnum (* for default): -// vertical-alignment:vavalue;padding:topval rightval bottomval leftval; -// cellformat:cformatnum:value - text of cell alignment (left/center/right) for cellformat cformatnum -// valueformat:vformatnum:value - text of number format (see FormatValueForDisplay) for valueformat vformatnum (changed in v1.2) -// clipboardrange:upperleftcoord:bottomrightcoord - ignored -- from wikiCalc -// clipboard:coord:type:value:... - ignored -- from wikiCalc -// -// If this is clipboard contents, then there is also information to facilitate pasting: -// -// copiedfrom:upperleftcoord:bottomrightcoord - range from which this was copied -// - -// Functions: - -SocialCalc.ParseSheetSave = function(savedsheet,sheetobj) { - - var lines=savedsheet.split(/\r\n|\n/); - var parts=[]; - var line; - var i, j, t, v, coord, cell, attribs, name; - var scc = SocialCalc.Constants; - - for (i=0;i maxrow) maxrow = cr.row; - if (cr.col > maxcol) maxcol = cr.col; - } - } - - for (i=0; i maxrow) maxrow = cr; - } - } - a = {"hide": 1, "width": 1}; // look at explicit col settings - for (v in a) { - for (coord in sheetobj.colattribs[v]) { - cr = SocialCalc.coordToCr(coord+"1"); - if (cr.col > maxcol) maxcol = cr.col; - } - } - - for (an=0; an0, command loop waits for SocialCalc.ResumeFromCmdExtension() - -// statuscallback: null, // called during execution - obsolete: use sheet obj's -// statuscallbackparams: null - - }; - -// -// SocialCalc.ScheduleSheetCommands -// -// statuscallback is called at the beginning (cmdstart) and end (cmdend). -// - -SocialCalc.ScheduleSheetCommands = function(sheet, cmdstr, saveundo, isRemote) { - if (SocialCalc.Callbacks.broadcast && !isRemote) { - if (cmdstr != 'redisplay' && cmdstr != 'set sheet defaulttextvalueformat text-wiki' && - cmdstr != 'recalc') { - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"scmd", id:sheet.sheetid,cmdstr: cmdstr, saveundo: saveundo }); - } - } - - var sci = SocialCalc.SheetCommandInfo; - - sci.sheetobj = sheet; - sci.parseobj = new SocialCalc.Parse(cmdstr); - sci.saveundo = saveundo; - - if (sci.sheetobj.statuscallback) { // notify others if requested - sheet.statuscallback(sci, "cmdstart", "", sci.sheetobj.statuscallbackparams); - } - - if (sci.saveundo) { - sci.sheetobj.changes.PushChange(""); // add a step to undo stack - } - - sci.timerobj = window.setTimeout(SocialCalc.SheetCommandsTimerRoutine, sci.firsttimerdelay); - - } - -SocialCalc.SheetCommandsTimerRoutine = function() { - - var errortext; - var sci = SocialCalc.SheetCommandInfo; - var starttime = new Date(); - - sci.timerobj = null; - - while (!sci.parseobj.EOF()) { // go through all commands (separated by newlines) - - errortext = SocialCalc.ExecuteSheetCommand(sci.sheetobj, sci.parseobj, sci.saveundo); - if (errortext) alert(errortext); - - sci.parseobj.NextLine(); - - if (sci.cmdextensionbusy.length > 0) { // forced wait - if (sci.sheetobj.statuscallback) { // notify others if requested - sci.sheetobj.statuscallback(sci, "cmdextension", sci.cmdextensionbusy, sci.sheetobj.statuscallbackparams); - } - return; - } - - if (((new Date()) - starttime) >= sci.maxtimeslice) { // if taking too long, give up CPU for a while - sci.timerobj = window.setTimeout(SocialCalc.SheetCommandsTimerRoutine, sci.timerdelay); - return; - } - } - - if (sci.sheetobj.statuscallback) { // notify others if requested - sci.sheetobj.statuscallback(sci, "cmdend", "", sci.sheetobj.statuscallbackparams); - } - - } - -SocialCalc.ResumeFromCmdExtension = function() { - - var sci = SocialCalc.SheetCommandInfo; - - sci.cmdextensionbusy = ""; - - SocialCalc.SheetCommandsTimerRoutine(); - -} - -// -// errortext = SocialCalc.ExecuteSheetCommand(sheet, cmd, saveundo) -// -// cmd is a SocialCalc.Parse object. -// -// Executes commands that modify the sheet data. -// Sets sheet "needsrecalc" as needed. -// Sets sheet "changedrendervalues" as needed. -// -// The cmd string may be multiple commands, separated by newlines. In that case -// only one "step" is put on the undo stack representing all the commands. -// Note that because of this, in "set A1 text ..." and "set A1 comment ..." text is -// treated as encoded (newline => \n, \ => \b, : => \c). -// -// The commands are in the forms: -// -// set sheet attributename value (plus lastcol and lastrow) -// set 22 attributename value -// set B attributename value -// set A1 attributename value1 value2... (see each attribute in code for details) -// set A1:B5 attributename value1 value2... -// erase/copy/cut/paste/fillright/filldown A1:B5 all/formulas/format -// loadclipboard save-encoded-clipboard-data -// clearclipboard -// merge C3:F3 -// unmerge C3 -// insertcol/insertrow C5 -// deletecol/deleterow C5:E7 -// movepaste/moveinsert A1:B5 A8 all/formulas/format (if insert, destination must be in same rows or columns or else paste done) -// sort cr1:cr2 col1 up/down col2 up/down col3 up/down -// name define NAME definition -// name desc NAME description -// name delete NAME -// recalc -// redisplay -// changedrendervalues -// startcmdextension extension rest-of-command -// -// If saveundo is true, then undo information is saved in sheet.changes. -// - -SocialCalc.ExecuteSheetCommand = function(sheet, cmd, saveundo) { - - var cmdstr, cmd1, rest, what, attrib, num, pos, pos2, errortext, undostart, val; - var cr1, cr2, col, row, cr, cell, newcell; - var fillright, rowstart, colstart, crbase, rowoffset, coloffset, basecell; - var clipsheet, cliprange, numcols, numrows, attribtable; - var colend, rowend, newcolstart, newrowstart, newcolend, newrowend, rownext, colnext, colthis, cellnext; - var lastrow, lastcol, rowbefore, colbefore, oldformula, oldcr; - var cols, dirs, lastsortcol, i, sortlist, sortcells, sortvalues, sorttypes; - var sortfunction, slen, valtype, originalrow, sortedcr; - var name, v1, v2; - var cmdextension; - - var attribs = sheet.attribs; - var changes = sheet.changes; - var cellProperties = SocialCalc.CellProperties; - var scc = SocialCalc.Constants; - - var ParseRange = - function() { - var prange = SocialCalc.ParseRange(what); - cr1 = prange.cr1; - cr2 = prange.cr2; - if (cr2.col > attribs.lastcol) attribs.lastcol = cr2.col; - if (cr2.row > attribs.lastrow) attribs.lastrow = cr2.row; - }; - - errortext = ""; - - cmdstr = cmd.RestOfStringNoMove(); - if (saveundo) { - sheet.changes.AddDo(cmdstr); - } - - cmd1 = cmd.NextToken(); - - switch (cmd1) { - - case "set": - what = cmd.NextToken(); - attrib = cmd.NextToken(); - rest = cmd.RestOfString(); - undostart = "set "+what+" "+attrib; - - if (what=="sheet") { - sheet.renderneeded = true; - switch (attrib) { - case "defaultcolwidth": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]); - attribs[attrib] = rest; - break; - case "defaultcolor": - case "defaultbgcolor": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("color", attribs[attrib])); - attribs[attrib] = sheet.GetStyleNum("color", rest); - break; - case "defaultlayout": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("layout", attribs[attrib])); - attribs[attrib] = sheet.GetStyleNum("layout", rest); - break; - case "defaultfont": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("font", attribs[attrib])); - if (rest=="* * *") rest = ""; // all default - attribs[attrib] = sheet.GetStyleNum("font", rest); - break; - case "defaulttextformat": - case "defaultnontextformat": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("cellformat", attribs[attrib])); - attribs[attrib] = sheet.GetStyleNum("cellformat", rest); - break; - case "defaulttextvalueformat": - case "defaultnontextvalueformat": - if (saveundo) changes.AddUndo(undostart, sheet.GetStyleString("valueformat", attribs[attrib])); - attribs[attrib] = sheet.GetStyleNum("valueformat", rest); - for (cr in sheet.cells) { // forget all cached display strings - delete sheet.cells[cr].displaystring; - } - break; - case "lastcol": - case "lastrow": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]-0); - num = rest-0; - if (typeof num == "number") attribs[attrib] = num > 0 ? num : 1; - break; - case "recalc": - if (saveundo) changes.AddUndo(undostart, attribs[attrib]); - if (rest == "off") { - attribs.recalc = rest; // manual recalc, not auto - } - else { // all values other than "off" mean "on" - delete attribs.recalc; - } - break; - default: - errortext = scc.s_escUnknownSheetCmd+cmdstr; - break; - } - } - - else if (/(^[A-Z])([A-Z])?(:[A-Z][A-Z]?){0,1}$/i.test(what)) { // col attributes - sheet.renderneeded = true; - what = what.toUpperCase(); - pos = what.indexOf(":"); - if (pos>=0) { - cr1 = SocialCalc.coordToCr(what.substring(0,pos)+"1"); - cr2 = SocialCalc.coordToCr(what.substring(pos+1)+"1"); - } - else { - cr1 = SocialCalc.coordToCr(what+"1"); - cr2 = cr1; - } - for (col=cr1.col; col <= cr2.col; col++) { - if (attrib=="width") { - cr = SocialCalc.rcColname(col); - if (saveundo) changes.AddUndo("set "+cr+" width", sheet.colattribs.width[cr]); - if (rest.length > 0 ) { - sheet.colattribs.width[cr] = rest; - } - else { - delete sheet.colattribs.width[cr]; - } - } - } - } - - // !!!!! need row attribs !!!! - - else if (/([a-z]){0,1}(\d+)/i.test(what)) { // cell attributes - ParseRange(); - if (cr1.row!=cr2.row || cr1.col!=cr2.col || sheet.celldisplayneeded || sheet.renderneeded) { // not one cell - sheet.renderneeded = true; - sheet.celldisplayneeded = ""; - } - else { - sheet.celldisplayneeded = SocialCalc.crToCoord(cr1.col, cr1.row); - } - for (row=cr1.row; row <= cr2.row; row++) { - for (col=cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - if (attrib=="value") { // set coord value type numeric-value - pos = rest.indexOf(" "); - cell.datavalue = rest.substring(pos+1)-0; - delete cell.errors; - cell.datatype = "v"; - cell.valuetype = rest.substring(0,pos); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="text") { // set coord text type text-value - pos = rest.indexOf(" "); - cell.datavalue = SocialCalc.decodeFromSave(rest.substring(pos+1)); - delete cell.errors; - cell.datatype = "t"; - cell.valuetype = rest.substring(0,pos); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="formula") { // set coord formula formula-body-less-initial-= - cell.datavalue = 0; // until recalc - delete cell.errors; - cell.datatype = "f"; - cell.valuetype = "e#N/A"; // until recalc - cell.formula = rest; - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="constant") { // set coord constant type numeric-value source-text - pos = rest.indexOf(" "); - pos2 = rest.substring(pos+1).indexOf(" "); - cell.datavalue = rest.substring(pos+1,pos+1+pos2)-0; - cell.valuetype = rest.substring(0,pos); - if (cell.valuetype.charAt(0)=="e") { // error - cell.errors = cell.valuetype.substring(1); - } - else { - delete cell.errors; - } - cell.datatype = "c"; - cell.formula = rest.substring(pos+pos2+2); - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="empty") { // erase value - cell.datavalue = ""; - delete cell.errors; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - delete cell.displaystring; - delete cell.parseinfo; - attribs.needsrecalc = "yes"; - } - else if (attrib=="all") { // set coord all :this:val1:that:val2... - if (rest.length>0) { - cell = new SocialCalc.Cell(cr); - sheet.CellFromStringParts(cell, rest.split(":"), 1); - sheet.cells[cr] = cell; - } - else { - delete sheet.cells[cr]; - } - attribs.needsrecalc = "yes"; - } - else if (/^b[trbl]$/.test(attrib)) { // set coord bt 1px solid black - cell[attrib] = sheet.GetStyleNum("borderstyle", rest); - sheet.renderneeded = true; // affects more than just one cell - } - else if (attrib=="color" || attrib=="bgcolor") { - cell[attrib] = sheet.GetStyleNum("color", rest); - } - else if (attrib=="layout" || attrib=="cellformat") { - cell[attrib] = sheet.GetStyleNum(attrib, rest); - } - else if (attrib=="font") { // set coord font style weight size family - if (rest=="* * *") rest = ""; - cell[attrib] = sheet.GetStyleNum("font", rest); - } - else if (attrib=="textvalueformat" || attrib=="nontextvalueformat") { - cell[attrib] = sheet.GetStyleNum("valueformat", rest); - delete cell.displaystring; - } - else if (attrib=="cssc") { - rest = rest.replace(/[^a-zA-Z0-9\-]/g, ""); - cell.cssc = rest; - } - else if (attrib=="csss") { - rest = rest.replace(/\n/g, ""); - cell.csss = rest; - } - else if (attrib=="mod") { - rest = rest.replace(/[^yY]/g, "").toLowerCase(); - cell.mod = rest; - } - else if (attrib=="comment") { - cell.comment = SocialCalc.decodeFromSave(rest); - } - else { - errortext = scc.s_escUnknownSetCoordCmd+cmdstr; - } - } - } - - } - break; - - case "merge": - sheet.renderneeded = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - cell=sheet.GetAssuredCell(cr1.coord); - if (saveundo) changes.AddUndo("unmerge "+cr1.coord); - - if (cr2.col > cr1.col) cell.colspan = cr2.col - cr1.col + 1; - else delete cell.colspan; - if (cr2.row > cr1.row) cell.rowspan = cr2.row - cr1.row + 1; - else delete cell.rowspan; - - sheet.changedrendervalues = true; - - break; - - case "unmerge": - sheet.renderneeded = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - cell=sheet.GetAssuredCell(cr1.coord); - if (saveundo) changes.AddUndo("merge "+cr1.coord+":"+SocialCalc.crToCoord(cr1.col+(cell.colspan||1)-1, cr1.row+(cell.rowspan||1)-1)); - - delete cell.colspan; - delete cell.rowspan; - - sheet.changedrendervalues = true; - - break; - - case "erase": - case "cut": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - if (cmd1=="cut") { // save copy of whole thing before erasing - if (saveundo) changes.AddUndo("loadclipboard", SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard)); - SocialCalc.Clipboard.clipboard = SocialCalc.CreateSheetSave(sheet, what); - } - - for (row = cr1.row; row <= cr2.row; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - if (rest=="all") { - delete sheet.cells[cr]; - } - else if (rest == "formulas") { - cell.datavalue = ""; - cell.datatype = null; - cell.formula = ""; - cell.valuetype = "b"; - delete cell.errors; - delete cell.displaystring; - delete cell.parseinfo; - if (cell.comment) { // comments are considered content for erasing - delete cell.comment; - } - } - else if (rest == "formats") { - newcell = new SocialCalc.Cell(cr); // create a new cell without attributes - newcell.datavalue = cell.datavalue; // copy existing values - newcell.datatype = cell.datatype; - newcell.formula = cell.formula; - newcell.valuetype = cell.valuetype; - if (cell.comment) { - newcell.comment = cell.comment; - } - sheet.cells[cr] = newcell; // replace - } - } - } - attribs.needsrecalc = "yes"; - break; - - case "fillright": - case "filldown": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - if (cmd1 == "fillright") { - fillright = true; - rowstart = cr1.row; - colstart = cr1.col + 1; - } - else { - fillright = false; - rowstart = cr1.row + 1; - colstart = cr1.col; - } - for (row = rowstart; row <= cr2.row; row++) { - for (col = colstart; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - if (fillright) { - crbase = SocialCalc.crToCoord(cr1.col, row); - coloffset = col - colstart + 1; - rowoffset = 0; - } - else { - crbase = SocialCalc.crToCoord(col, cr1.row); - coloffset = 0; - rowoffset = row - rowstart + 1; - } - basecell = sheet.GetAssuredCell(crbase); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - if (cell.datatype == "f") { // offset relative coords, even in sheet references - cell.formula = SocialCalc.OffsetFormulaCoords(basecell.formula, coloffset, rowoffset); - } - else { - cell.formula = basecell.formula; - } - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - } - } - - attribs.needsrecalc = "yes"; - break; - - case "copy": - what = cmd.NextToken(); - rest = cmd.RestOfString(); - if (saveundo) changes.AddUndo("loadclipboard", SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard)); - SocialCalc.Clipboard.clipboard = SocialCalc.CreateSheetSave(sheet, what); - break; - - case "loadclipboard": - rest = cmd.RestOfString(); - if (saveundo) changes.AddUndo("loadclipboard", SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard)); - SocialCalc.Clipboard.clipboard = SocialCalc.decodeFromSave(rest); - break; - - case "clearclipboard": - if (saveundo) changes.AddUndo("loadclipboard", SocialCalc.encodeForSave(SocialCalc.Clipboard.clipboard)); - SocialCalc.Clipboard.clipboard = ""; - break; - - case "paste": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - if (!SocialCalc.Clipboard.clipboard) { - break; - } - clipsheet = new SocialCalc.Sheet(); // load clipboard contents as another sheet - clipsheet.ParseSheetSave(SocialCalc.Clipboard.clipboard); - cliprange = SocialCalc.ParseRange(clipsheet.copiedfrom); - coloffset = cr1.col - cliprange.cr1.col; // get sizes, etc. - rowoffset = cr1.row - cliprange.cr1.row; - numcols = cliprange.cr2.col - cliprange.cr1.col + 1; - numrows = cliprange.cr2.row - cliprange.cr1.row + 1; - if (cr1.col+numcols-1 > attribs.lastcol) attribs.lastcol = cr1.col+numcols-1; - if (cr1.row+numrows-1 > attribs.lastrow) attribs.lastrow = cr1.row+numrows-1; - - for (row = cr1.row; row < cr1.row+numrows; row++) { - for (col = cr1.col; col < cr1.col+numcols; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - crbase = SocialCalc.crToCoord(col-coloffset, row-rowoffset); - basecell = clipsheet.GetAssuredCell(crbase); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - attribtable = SocialCalc.CellPropertiesTable[attrib]; - if (attribtable && basecell[attrib]) { // table indexes to expand to strings since other sheet may have diff indexes - cell[attrib] = sheet.GetStyleNum(attribtable, clipsheet.GetStyleString(attribtable, basecell[attrib])); - } - else { // these are not table indexes - cell[attrib] = basecell[attrib]; - } - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - if (cell.datatype == "f") { // offset relative coords, even in sheet references - cell.formula = SocialCalc.OffsetFormulaCoords(basecell.formula, coloffset, rowoffset); - } - else { - cell.formula = basecell.formula; - } - delete cell.parseinfo; - cell.errors = basecell.errors; - if (basecell.comment) { // comments are pasted as part of content, though not filled, etc. - cell.comment = basecell.comment; - } - else if (cell.comment) { - delete cell.comment; - } - } - delete cell.displaystring; - } - } - - attribs.needsrecalc = "yes"; - break; - - case "sort": // sort cr1:cr2 col1 up/down col2 up/down col3 up/down - sheet.renderneeded = true; - sheet.changedrendervalues = true; - if (saveundo) changes.AddUndo("changedrendervalues"); // to take care of undone pasted spans - what = cmd.NextToken(); - ParseRange(); - cols = []; // get columns and sort directions (or "") - dirs = []; - lastsortcol = 0; - for (i=0; i<=3; i++) { - cols[i] = cmd.NextToken(); - dirs[i] = cmd.NextToken(); - if (cols[i]) lastsortcol = i; - } - - sortcells = {}; // a copy of the data which will replace the original, but in the new order - sortlist = []; // an array of 0, 1, ..., nrows-1 needed for sorting - sortvalues = []; // values to be sorted corresponding to sortlist - sorttypes = []; // basic types of the values - - for (row = cr1.row; row <= cr2.row; row++) { // fill in the sort info - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell=sheet.cells[cr]; - if (cell) { // only copy non-empty cells - sortcells[cr] = sheet.CellToString(cell); - if (saveundo) changes.AddUndo("set "+cr+" all", sortcells[cr]); - } - else { - if (saveundo) changes.AddUndo("set "+cr+" all"); - } - } - sortlist.push(sortlist.length); - sortvalues.push([]); - sorttypes.push([]); - slast = sorttypes.length-1; - for (i = 0; i <= lastsortcol; i++) { - cr = cols[i] + row; // get cr on this row in sort col - cell = sheet.GetAssuredCell(cr); - val = cell.datavalue; - valtype = cell.valuetype.charAt(0) || "b"; - if (valtype == "t") val = val.toLowerCase(); - sortvalues[slast].push(val); - sorttypes[slast].push(valtype); - } - } - - sortfunction = function(a, b) { // a comparison function that can handle all the type variations - var i, a1, b1, ta, cresult; - for (i=0; i<=lastsortcol; i++) { - if (dirs[i] == "up") { // handle sort direction - a1 = a; b1 = b; - } - else { - a1 = b; b1 = a; - } - ta = sorttypes[a1][i]; - tb = sorttypes[b1][i]; - if (ta == "t") { // numbers < text < errors, blank always last no matter what dir - if (tb == "t") { - a1 = sortvalues[a1][i]; - b1 = sortvalues[b1][i]; - cresult = a1 > b1 ? 1 : (a1 < b1 ? -1 : 0); - } - else if (tb == "n") { - cresult = 1; - } - else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } - else if (tb == "e") { - cresult = -1; - } - } - else if (ta == "n") { - if (tb == "t") { - cresult = -1; - } - else if (tb == "n") { - a1 = sortvalues[a1][i]-0; // force to numeric, just in case - b1 = sortvalues[b1][i]-0; - cresult = a1 > b1 ? 1 : (a1 < b1 ? -1 : 0); - } - else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } - else if (tb == "e") { - cresult = -1; - } - } - else if (ta == "e") { - if (tb == "e") { - a1 = sortvalues[a1][i]; - b1 = sortvalues[b1][i]; - cresult = a1 > b1 ? 1 : (a1 < b1 ? -1 : 0); - } - else if (tb == "b") { - cresult = dirs[i] == "up" ? -1 : 1; - } - else { - cresult = 1; - } - } - else if (ta == "b") { - if (tb == "b") { - cresult = 0; - } - else { - cresult = dirs[i] == "up" ? 1 : -1; - } - } - if (cresult) { // return if tested not equal, otherwise do next column - return cresult; - } - } - cresult = a > b ? 1 : (a < b ? -1 : 0); // equal - return position in original to maintain it - return cresult; - } - - sortlist.sort(sortfunction); - - for (row = cr1.row; row <= cr2.row; row++) { // copy original rows into sorted positions - originalrow = sortlist[row-cr1.row]; // relative position where it was in original - for (col = cr1.col; col <= cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - sortedcr = SocialCalc.crToCoord(col, originalrow+cr1.row); // original cell to be put in new place - if (sortcells[sortedcr]) { - cell = new SocialCalc.Cell(cr); - sheet.CellFromStringParts(cell, sortcells[sortedcr].split(":"), 1); - if (cell.datatype == "f") { // offset coord refs, even to ***relative*** coords in other sheets - cell.formula = SocialCalc.OffsetFormulaCoords(cell.formula, 0, (row-cr1.row)-originalrow); - } - sheet.cells[cr] = cell; - } - else { - delete sheet.cells[cr]; - } - } - } - - attribs.needsrecalc = "yes"; - break; - - case "insertcol": - case "insertrow": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - ParseRange(); - - if (cmd1 == "insertcol") { - coloffset = 1; - colend = cr1.col; - rowoffset = 0; - rowend = 1; - newcolstart = cr1.col; - newcolend = cr1.col; - newrowstart = 1; - newrowend = attribs.lastrow; - if (saveundo) changes.AddUndo("deletecol "+cr1.coord); - } - else { - coloffset = 0; - colend = 1; - rowoffset = 1; - rowend = cr1.row; - newcolstart = 1; - newcolend = attribs.lastcol; - newrowstart = cr1.row; - newrowend = cr1.row; - if (saveundo) changes.AddUndo("deleterow "+cr1.coord); - } - - for (row=attribs.lastrow; row >= rowend; row--) { // copy the cells forward - for (col=attribs.lastcol; col >= colend; col--) { - crbase = SocialCalc.crToCoord(col, row); - cr = SocialCalc.crToCoord(col+coloffset, row+rowoffset); - if (!sheet.cells[crbase]) { // copying empty cell - delete sheet.cells[cr]; // delete anything that may have been there - } - else { // overwrite existing cell with moved contents - sheet.cells[cr] = sheet.cells[crbase]; - } - } - } - - for (row=newrowstart; row <= newrowend; row++) { // fill the "new" empty cells - for (col=newcolstart; col <= newcolend; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = new SocialCalc.Cell(cr); - sheet.cells[cr] = cell; - crbase = SocialCalc.crToCoord(col-coloffset, row-rowoffset); // copy attribs of the one before (0 gives you A or 1) - basecell = sheet.GetAssuredCell(crbase); - for (attrib in cellProperties) { - if (cellProperties[attrib] == 2) { // copy only format attributes - cell[attrib] = basecell[attrib]; - } - } - } - } - - for (cr in sheet.cells) { // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell && cell.datatype == "f") { - cell.formula = SocialCalc.AdjustFormulaCoords(cell.formula, cr1.col, coloffset, cr1.row, rowoffset); - } - if (cell) { - delete cell.parseinfo; - } - } - - for (name in sheet.names) { // update cell references to moved cells in names - if (sheet.names[name]) { // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = v2 + - SocialCalc.AdjustFormulaCoords(v1, cr1.col, coloffset, cr1.row, rowoffset); - } - } - - for (row = attribs.lastrow; row >= rowend && cmd1 == "insertrow"; row--) { // copy the row attributes forward - rownext = row + rowoffset; - for (attrib in sheet.rowattribs) { - val = sheet.rowattribs[attrib][row]; - if (sheet.rowattribs[attrib][rownext] != val) { // make assignment only if different - if (val) { - sheet.rowattribs[attrib][rownext] = val; - } - else { - delete sheet.rowattribs[attrib][rownext]; - } - } - } - } - - for (col = attribs.lastcol; col >= colend && cmd1 == "insertcol"; col--) { // copy the column attributes forward - colthis = SocialCalc.rcColname(col); - colnext = SocialCalc.rcColname(col + coloffset); - for (attrib in sheet.colattribs) { - val = sheet.colattribs[attrib][colthis]; - if (sheet.colattribs[attrib][colnext] != val) { // make assignment only if different - if (val) { - sheet.colattribs[attrib][colnext] = val; - } - else { - delete sheet.colattribs[attrib][colnext]; - } - } - } - } - - attribs.lastcol += coloffset; - attribs.lastrow += rowoffset; - attribs.needsrecalc = "yes"; - break; - - case "deletecol": - case "deleterow": - sheet.renderneeded = true; - sheet.changedrendervalues = true; - what = cmd.NextToken(); - rest = cmd.RestOfString(); - lastcol = attribs.lastcol; // save old values since ParseRange sets... - lastrow = attribs.lastrow; - ParseRange(); - - if (cmd1 == "deletecol") { - coloffset = cr1.col - cr2.col - 1; - rowoffset = 0; - colstart = cr2.col + 1; - rowstart = 1; - } - else { - coloffset = 0; - rowoffset = cr1.row - cr2.row - 1; - colstart = 1; - rowstart = cr2.row + 1; - } - - for (row=rowstart; row <= lastrow - rowoffset; row++) { // copy the cells backwards - extra so no dup of last set - for (col=colstart; col <= lastcol - coloffset; col++) { - cr = SocialCalc.crToCoord(col+coloffset, row+rowoffset); - if (saveundo && (row cr2.col)) { - if (destcr.col < cr1.col) { // moving left - pushamount = cr1.col - destcr.col; - inserthoriz = -1; - } - else { - destcr.col -= 1; - coloffset = destcr.col - cr2.col; - pushamount = destcr.col - cr2.col; - inserthoriz = 1; - } - } - else if (coloffset==0 && (destcr.row < cr1.row || destcr.row > cr2.row)) { - if (destcr.row < cr1.row) { // moving up - pushamount = cr1.row - destcr.row; - insertvert = -1; - } - else { - destcr.row -= 1; - rowoffset = destcr.row - cr2.row; - pushamount = destcr.row - cr2.row; - insertvert = 1; - } - } - else { - cmd1 = "movepaste"; // not allowed right now - ignore - } - } - - // push any cells that need pushing - - movedto = {}; // remember what was moved where - - if (insertvert) { - for (row = 0; row < pushamount; row++) { - for (col = cr1.col; col <= cr2.col; col++) { - if (insertvert < 0) { - crbase = SocialCalc.crToCoord(col, destcr.row+pushamount-row-1); // from cell - cr = SocialCalc.crToCoord(col, cr2.row-row); // to cell - } - else { - crbase = SocialCalc.crToCoord(col, destcr.row-pushamount+row+1); // from cell - cr = SocialCalc.crToCoord(col, cr1.row+row); // to cell - } - - basecell = sheet.GetAssuredCell(crbase); - if (saveundo) changes.AddUndo("set "+crbase+" all", sheet.CellToString(basecell)); - - cell = sheet.GetAssuredCell(cr); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - - movedto[crbase] = cr; // old crbase is now at cr - } - } - } - if (inserthoriz) { - for (col = 0; col < pushamount; col++) { - for (row = cr1.row; row <= cr2.row; row++) { - if (inserthoriz < 0) { - crbase = SocialCalc.crToCoord(destcr.col+pushamount-col-1, row); - cr = SocialCalc.crToCoord(cr2.col-col, row); - } - else { - crbase = SocialCalc.crToCoord(destcr.col-pushamount+col+1, row); - cr = SocialCalc.crToCoord(cr1.col+col, row); - } - - basecell = sheet.GetAssuredCell(crbase); - if (saveundo) changes.AddUndo("set "+crbase+" all", sheet.CellToString(basecell)); - - cell = sheet.GetAssuredCell(cr); - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - } - delete cell.displaystring; - - movedto[crbase] = cr; // old crbase is now at cr - } - } - } - - // paste moved cells into new place - - if (destcr.col+numcols-1 > attribs.lastcol) attribs.lastcol = destcr.col+numcols-1; - if (destcr.row+numrows-1 > attribs.lastrow) attribs.lastrow = destcr.row+numrows-1; - - for (row = cr1.row; row < cr1.row+numrows; row++) { - for (col = cr1.col; col < cr1.col+numcols; col++) { - cr = SocialCalc.crToCoord(col+coloffset, row+rowoffset); - cell=sheet.GetAssuredCell(cr); - if (saveundo) changes.AddUndo("set "+cr+" all", sheet.CellToString(cell)); - - crbase = SocialCalc.crToCoord(col, row); // get old cell to move - - movedto[crbase] = cr; // old crbase (moved cell) will now be at cr (destination) - - if (rest == "all" && !movingcells[crbase]) { // moving an empty cell - delete sheet.cells[cr]; // make the cell empty - continue; - } - - basecell = movingcells[crbase]; - if (!basecell) basecell = sheet.GetAssuredCell(crbase); - - if (rest == "all" || rest == "formats") { - for (attrib in cellProperties) { - if (cellProperties[attrib] == 1) continue; // copy only format attributes - if (typeof basecell[attrib] === undefined || cellProperties[attrib] == 3) { - delete cell[attrib]; - } - else { - cell[attrib] = basecell[attrib]; - } - } - } - if (rest == "all" || rest == "formulas") { - cell.datavalue = basecell.datavalue; - cell.datatype = basecell.datatype; - cell.valuetype = basecell.valuetype; - cell.formula = basecell.formula; - delete cell.parseinfo; - cell.errors = basecell.errors; - if (basecell.comment) { // comments are pasted as part of content, though not filled, etc. - cell.comment = basecell.comment; - } - else if (cell.comment) { - delete cell.comment; - } - } - delete cell.displaystring; - } - } - - // do fixups - - for (cr in sheet.cells) { // update cell references to moved cells in calculated formulas - cell = sheet.cells[cr]; - if (cell) { - if (cell.datatype == "f") { - oldformula = cell.formula; - cell.formula = SocialCalc.ReplaceFormulaCoords(oldformula, movedto); - if (cell.formula != oldformula) { - delete cell.parseinfo; - if (saveundo && !movedto[cr]) { // moved cells are already saved for undo - changes.AddUndo("set "+cr+" formula "+oldformula); - } - } - } - else { - delete cell.parseinfo; - } - } - } - - for (name in sheet.names) { // update cell references to moved cells in names - if (sheet.names[name]) { // works with "A1", "A1:A20", and "=formula" forms - v1 = sheet.names[name].definition; - oldformula = v1; - v2 = ""; - if (v1.charAt(0) == "=") { - v2 = "="; - v1 = v1.substring(1); - } - sheet.names[name].definition = v2 + - SocialCalc.ReplaceFormulaCoords(v1, movedto); - if (saveundo && sheet.names[name].definition != oldformula) { // save changes - changes.AddUndo("name define "+name+" "+oldformula); - } - } - } - - attribs.needsrecalc = "yes"; - break; - - case "name": - what = cmd.NextToken(); - name = cmd.NextToken(); - rest = cmd.RestOfString(); - - name = name.toUpperCase().replace(/[^A-Z0-9_\.]/g, ""); - if (name == "") break; // must have something - - if (what == "define") { - if (rest == "") break; // must have something - if (sheet.names[name]) { // already exists - if (saveundo) changes.AddUndo("name define "+name+" "+sheet.names[name].definition); - sheet.names[name].definition = rest; - } - else { // new - if (saveundo) changes.AddUndo("name delete "+name); - sheet.names[name] = {definition: rest, desc: ""}; - } - } - else if (what == "desc") { - if (sheet.names[name]) { // must already exist - if (saveundo) changes.AddUndo("name desc "+name+" "+sheet.names[name].desc); - sheet.names[name].desc = rest; - } - } - else if (what == "delete") { - if (saveundo) { - if (sheet.names[name].desc) changes.AddUndo("name desc "+name+" "+sheet.names[name].desc); - changes.AddUndo("name define "+name+" "+sheet.names[name].definition); - } - delete sheet.names[name]; - } - attribs.needsrecalc = "yes"; - - break; - - case "recalc": - attribs.needsrecalc = "yes"; // request recalc - sheet.recalconce = true; // even if turned off - break; - - case "redisplay": - sheet.renderneeded = true; - break; - - case "changedrendervalues": // needed for undo sometimes - sheet.changedrendervalues = true; - break; - - case "startcmdextension": // startcmdextension extension rest-of-command - name = cmd.NextToken(); - cmdextension = SocialCalc.SheetCommandInfo.CmdExtensionCallbacks[name]; - if (cmdextension) { - cmdextension.func(name, cmdextension.data, sheet, cmd, saveundo); - } - break; - - default: - errortext = scc.s_escUnknownCmd+cmdstr; - break; - } - -/* For Debugging: -var ustack=""; -for (var i=0;i=0; i--) { // do them backwards - if (cmdstr) cmdstr += "\n"; // concatenate with separate lines - cmdstr += tos.undo[i]; - } - sheet.changes.Undo(); - sheet.ScheduleSheetCommands(cmdstr, false); // do undo operations - - } - -SocialCalc.SheetRedo = function(sheet) { - - var tos, i; - var didredo = sheet.changes.Redo(); - if (!didredo) { - sheet.ScheduleSheetCommands("", false); // schedule doing nothing - return; - } - tos = sheet.changes.TOS(); - var cmdstr = ""; - - for (i=0; tos && i= 0) { // quotes to double - updatedformula += '"' + ttext.replace(/"/, '""') + '"'; - } - else updatedformula += '"' + ttext + '"'; - } - else if (ttype == token_op) { - updatedformula += tokenOpExpansion[ttext] || ttext; // make sure short tokens (e.g., "G") go back full (">=") - } - else { // leave everything else alone - updatedformula += ttext; - } - } - - return updatedformula; - - } - -// -// updatedformula = SocialCalc.AdjustFormulaCoords(formula, col, coloffset, row, rowoffset) -// -// Change all cell references to cells starting with col/row by offsets -// - -SocialCalc.AdjustFormulaCoords = function(formula, col, coloffset, row, rowoffset) { - - var ttype, ttext, i, newcr; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i=0; i=") - } - if (ttype == token_coord) { - cr = SocialCalc.coordToCr(ttext); - if ((coloffset < 0 && cr.col >= col && cr.col < col-coloffset) || - (rowoffset < 0 && cr.row >= row && cr.row < row-rowoffset)) { // refs to deleted cells become invalid - if (!sheetref) { - cr.col = 0; - cr.row = 0; - } - } - if (!sheetref) { - if (cr.col >= col) { - cr.col += coloffset; - } - if (cr.row >= row) { - cr.row += rowoffset; - } - } - if (ttext.charAt(0)=="$") { - newcr = "$"+SocialCalc.rcColname(cr.col); - } - else { - newcr = SocialCalc.rcColname(cr.col); - } - if (ttext.indexOf("$", 1)!=-1) { - newcr += "$" + cr.row; - } - else { - newcr += cr.row; - } - if (cr.row < 1 || cr.col < 1) { - newcr = "#REF!"; - } - ttext = newcr; - } - else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { // quotes to double - ttext = '"' + ttext.replace(/"/, '""') + '"'; - } - else ttext = '"' + ttext + '"'; - } - updatedformula += ttext; - } - - return updatedformula; - - } - -// -// updatedformula = SocialCalc.ReplaceFormulaCoords(formula, movedto) -// -// Change all cell references to cells that are keys in moveto to be to moveto[coord]. -// Don't change references to other sheets. -// Handle range extents specially. -// - -SocialCalc.ReplaceFormulaCoords = function(formula, movedto) { - - var ttype, ttext, i, newcr, coord; - var updatedformula = ""; - var sheetref = false; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_string = tokentype.string; - var token_coord = tokentype.coord; - var tokenOpExpansion = scf.TokenOpExpansion; - - parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula); - - for (i=0; i=") - } - if (ttype == token_coord) { - cr = SocialCalc.coordToCr(ttext); // get parts - coord = SocialCalc.crToCoord(cr.col, cr.row); // get "clean" reference - if (movedto[coord] && !sheetref) { // this is a reference to a moved cell - cr = SocialCalc.coordToCr(movedto[coord]); // get new row and col - if (ttext.charAt(0)=="$") { // copy absolute ref marks if present - newcr = "$"+SocialCalc.rcColname(cr.col); - } - else { - newcr = SocialCalc.rcColname(cr.col); - } - if (ttext.indexOf("$", 1)!=-1) { - newcr += "$" + cr.row; - } - else { - newcr += cr.row; - } - ttext = newcr; - } - } - else if (ttype == token_string) { - if (ttext.indexOf('"') >= 0) { // quotes to double - ttext = '"' + ttext.replace(/"/, '""') + '"'; - } - else ttext = '"' + ttext + '"'; - } - updatedformula += ttext; - } - - return updatedformula; - - } - - -// ************************ -// -// Recalc Loop Code -// -// ************************ - -// -// How recalc works: -// -// !!!!!!!!!!!!!! -// - -// SocialCalc.RecalcInfo - object with global recalc info - -SocialCalc.RecalcInfo = { - - sheet: null, // which sheet is being recalced - - currentState: 0, // current state - state: {start_calc: 1, order: 2, calc: 3, start_wait: 4, done_wait: 5}, // allowed state values - - recalctimer: null, // value to cancel timer - maxtimeslice: 100, // maximum milliseconds per slice of recalc time before a wait - timeslicedelay: 1, // milliseconds to wait between recalc time slices - starttime: 0, // when recalc started - - // LoadSheet: a function that returns true if started a load or false if not. - // - - LoadSheet: function(sheetname) {return false;} // default returns not found - - } - -// SocialCalc.RecalcData - object with recalc info while determining recalc order and afterward - -SocialCalc.RecalcData = function() { // initialize a RecalcData object - - this.inrecalc = true; // if true, doing a recalc - this.celllist = []; // list with all potential cells to calculate - this.celllistitem = 0; // cell to check next when ordering - this.calclist = null; // object which is the chained list of cells to calculate - // each in the form of "coord: nextcoord" - // e.g., if B8 is calculated right after A8, then calclist.A8=="B8" - // if null, need to create the list - this.calclistlength = 0; // number of items in calclist - - this.firstcalc = null; // start of the calc list - a string or null - this.lastcalc = null; // last one on chain (used to add more to the end) - - this.nextcalc = null; // used to keep track during background recalc to make it restartable - this.count = 0; // number calculated - - // checkinfo is used when determining calc order: - - this.checkinfo = {}; // attributes are coords; if no attrib for a coord, it wasn't checked or doesn't need it - // values are RecalcCheckInfo objects while checking or TRUE when complete - - } - -// SocialCalc.RecalcCheckInfo - object that stores checking info while determining recalc order - -SocialCalc.RecalcCheckInfo = function() { // initialize a RecalcCheckInfo object - - this.oldcoord = null; // chain back up of cells referring to cells - this.parsepos = 0; // which token we are up to - - // range info - - this.inrange = false; // if true, in the process of checking a range of coords - this.inrangestart = false; // if true, have not yet filled in range loop values - this.cr1 = null; // range first coord as a cr object - this.cr2 = null; // range second coord as a cr object - this.c1 = null; // range extents - this.c2 = null; - this.r1 = null; - this.r2 = null; - this.c = null; // looping values - this.r = null; - - } - -// Recalc the entire sheet - -SocialCalc.RecalcSheet = function(sheet) { - - var coord, err, recalcdata; - var scri = SocialCalc.RecalcInfo; - - delete sheet.attribs.circularreferencecell; // reset recalc-wide things - SocialCalc.Formula.FreshnessInfoReset(); - - SocialCalc.RecalcClearTimeout(); - - scri.sheet = sheet; // set values needed by background recalc - scri.currentState = scri.state.start_calc; - - scri.starttime = new Date(); - - if (sheet.statuscallback) { - sheet.statuscallback(scri, "calcstart", null, sheet.statuscallbackparams); - } - - SocialCalc.RecalcSetTimeout(); - - } - -// -// SocialCalc.RecalcSetTimeout - set a timer for next recalc step -// - -SocialCalc.RecalcSetTimeout = function() { - - var scri = SocialCalc.RecalcInfo; - - scri.recalctimer = window.setTimeout(SocialCalc.RecalcTimerRoutine, scri.timeslicedelay); - - } - -// -// SocialCalc.RecalcClearTimeout - cancel any timeouts -// - -SocialCalc.RecalcClearTimeout = function() { - - var scri = SocialCalc.RecalcInfo; - - if (scri.recalctimer) { - window.clearTimeout(scri.recalctimer); - scri.recalctimer = null; - } - - } - - -// -// SocialCalc.RecalcLoadedSheet(sheetname, str, recalcneeded) -// -// Called when a sheet finishes loading with name, string, and t/f whether it should be recalced. -// If loaded sheet has sheet.attribs.recalc=="off", then no recalc done. -// If sheetname is null, then the sheetname waiting for will be used. -// - -SocialCalc.RecalcLoadedSheet = function(sheetname, str, recalcneeded) { - - var sheet; - var scri = SocialCalc.RecalcInfo; - var scf = SocialCalc.Formula; - - sheet = SocialCalc.Formula.AddSheetToCache(sheetname || scf.SheetCache.waitingForLoading, str); - - if (recalcneeded && sheet && sheet.attribs.recalc!="off") { // if recalcneeded, and not manual sheet, chain in this new sheet to recalc loop - sheet.previousrecalcsheet = scri.sheet; - scri.sheet = sheet; - scri.currentState = scri.state.start_calc; - } - scf.SheetCache.waitingForLoading = null; - - SocialCalc.RecalcSetTimeout(); - - } - - -// -// SocialCalc.RecalcTimerRoutine - handles the actual order determination and cell-by-cell recalculation in the background -// - -SocialCalc.RecalcTimerRoutine = function() { - - var eresult, cell, coord, err, status; - var starttime = new Date(); - var count = 0; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var scri = SocialCalc.RecalcInfo; - var sheet = scri.sheet; - if (!sheet) { - return; - } - var recalcdata = sheet.recalcdata; - - var do_statuscallback = function(status, arg) { // routine to do callback if required - if (sheet.statuscallback) { - sheet.statuscallback(recalcdata, status, arg, sheet.statuscallbackparams); - } - } - - SocialCalc.RecalcClearTimeout(); - - if (scri.currentState == scri.state.start_calc) { - - recalcdata = new SocialCalc.RecalcData(); - sheet.recalcdata = recalcdata; - - for (coord in sheet.cells) { // get list of cells to check for order - if (!coord) continue; - recalcdata.celllist.push(coord); - } - - recalcdata.calclist = {}; // start with empty list - scri.currentState = scri.state.order; // drop through to determining recalc order - } - - if (scri.currentState == scri.state.order) { - while (recalcdata.celllistitem < recalcdata.celllist.length) { // check all the cells to see if they should be on the list - coord = recalcdata.celllist[recalcdata.celllistitem++]; - err = SocialCalc.RecalcCheckCell(sheet, coord); - if (((new Date()) - starttime) >= scri.maxtimeslice) { // if taking too long, give up CPU for a while - do_statuscallback("calcorder", {coord: coord, total: recalcdata.celllist.length, count: recalcdata.celllistitem}); - SocialCalc.RecalcSetTimeout(); - return; - } - } - - do_statuscallback("calccheckdone", recalcdata.calclistlength); - - recalcdata.nextcalc = recalcdata.firstcalc; // start at the beginning of the recalc chain - scri.currentState = scri.state.calc; // loop through cells on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - if (scri.currentState == scri.state.start_wait) { // starting to wait for something - scri.currentState = scri.state.done_wait; // finished on next timer call - if (scri.LoadSheet) { - status = scri.LoadSheet(scf.SheetCache.waitingForLoading); - if (status) { // started a load operation - return; - } - } - SocialCalc.RecalcLoadedSheet(null, "", false); - return; - } - - if (scri.currentState == scri.state.done_wait) { - scri.currentState = scri.state.calc; // loop through cells on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - // otherwise should be scri.state.calc - - if (scri.currentState != scri.state.calc) { - alert("Recalc state error: "+scri.currentState+". Error in SocialCalc code."); - } - - coord = sheet.recalcdata.nextcalc; - while (coord) { - cell = sheet.cells[coord]; - eresult = scf.evaluate_parsed_formula(cell.parseinfo, sheet, false); - if (scf.SheetCache.waitingForLoading) { // wait until restarted - recalcdata.nextcalc = coord; // start with this cell again - recalcdata.count += count; - do_statuscallback("calcloading", {sheetname: scf.SheetCache.waitingForLoading}); - scri.currentState = scri.state.start_wait; // start load on next timer call - SocialCalc.RecalcSetTimeout(); - return; - } - - if (scf.RemoteFunctionInfo.waitingForServer) { // wait until restarted - recalcdata.nextcalc = coord; // start with this cell again - recalcdata.count += count; - do_statuscallback("calcserverfunc", - {funcname: scf.RemoteFunctionInfo.waitingForServer, coord: coord, total: recalcdata.calclistlength, count: recalcdata.count}); - scri.currentState = scri.state.done_wait; // start load on next timer call - return; // return and wait for next recalc timer event - } - - if (cell.datavalue != eresult.value || - cell.valuetype != eresult.type) { // only update if changed from last time - cell.datavalue = eresult.value; - cell.valuetype = eresult.type; - delete cell.displaystring; - sheet.recalcchangedavalue = true; // remember something changed in case other code wants to know - } - if (eresult.error) { - cell.errors = eresult.error; - } - count++; - coord = sheet.recalcdata.calclist[coord]; - - if (((new Date()) - starttime) >= scri.maxtimeslice) { // if taking too long, give up CPU for a while - recalcdata.nextcalc = coord; // start with next cell on chain - recalcdata.count += count; - do_statuscallback("calcstep", {coord: coord, total: recalcdata.calclistlength, count: recalcdata.count}); - SocialCalc.RecalcSetTimeout(); - return; - } - } - - recalcdata.inrecalc = false; - - delete sheet.recalcdata; // save memory and clear out for name lookup formula evaluation - - delete sheet.attribs.needsrecalc; // remember recalc done - - scri.sheet = sheet.previousrecalcsheet || null; // chain back if doing recalc of loaded sheets - if (scri.sheet) { - scri.currentState = scri.state.calc; // start where we left off - SocialCalc.RecalcSetTimeout(); - return; - } - - scf.FreshnessInfo.recalc_completed = true; // say freshness info is complete - - do_statuscallback("calcfinished", (new Date()) - scri.starttime); - - } - - -// -// circref = SocialCalc.RecalcCheckCell(sheet, coord) -// -// Checks cell to put on calclist, looking at parsed tokens. -// Also checks cells this cell is dependent upon -// if it contains a formula with cell references. -// If circular reference, returns non-null. -// - -SocialCalc.RecalcCheckCell = function(sheet, startcoord) { - - var parseinfo, ttext, ttype, i, rangecoord, circref, value, pos, pos2, cell, coordvals; - var scf = SocialCalc.Formula; - if (!scf) { - return "Need SocialCalc.Formula"; - } - var tokentype = scf.TokenType; - var token_op = tokentype.op; - var token_name = tokentype.name; - var token_coord = tokentype.coord; - - var recalcdata = sheet.recalcdata; - var checkinfo = recalcdata.checkinfo; - - var sheetref = false; // if true, a sheet reference is in effect, so don't check that - var oldcoord = null; // coord of formula that referred to this one when checking down the tree - var coord = startcoord; // the coord of the cell we are checking - - // Start with requested cell, and then continue down or up the dependency tree - // oldcoord (and checkinfo[coord].oldcoord) maintains the reference stack during the tree walk - // checkinfo[coord] maintains the stack of checking looping values, e.g., token number being checked - -mainloop: - while (coord) { - cell = sheet.cells[coord]; - coordvals = checkinfo[coord]; - - if (!cell || cell.datatype != "f" || // Don't calculate if not a formula - (coordvals && typeof coordvals != "object")) { // Don't calc if already calculated - coord = oldcoord; // go back up dependency tree to coord that referred to us - if (checkinfo[coord]) oldcoord = checkinfo[coord].oldcoord; - continue; - } - - if (!coordvals) { // do we have checking information about this cell? - coordvals = new SocialCalc.RecalcCheckInfo(); // no - make a place to hold it - checkinfo[coord] = coordvals; - } - - if (cell.errors) { // delete errors from previous recalcs - delete cell.errors; - } - - if (!cell.parseinfo) { // cache parsed formula - cell.parseinfo = scf.ParseFormulaIntoTokens(cell.formula); - } - parseinfo = cell.parseinfo; - - for (i=coordvals.parsepos; i coordvals.cr2.col) { coordvals.c1 = coordvals.cr2.col; coordvals.c2 = coordvals.cr1.col; } - else { coordvals.c1 = coordvals.cr1.col; coordvals.c2 = coordvals.cr2.col; } - coordvals.c = coordvals.c1 - 1; // start one before - - if (coordvals.cr1.row > coordvals.cr2.row) { coordvals.r1 = coordvals.cr2.row; coordvals.r2 = coordvals.cr1.row; } - else { coordvals.r1 = coordvals.cr1.row; coordvals.r2 = coordvals.cr2.row; } - coordvals.r = coordvals.r1; // start on this row - coordvals.inrangestart = false; - } - else { // not first time - } - coordvals.c += 1; // increment column - if (coordvals.c > coordvals.c2) { // finished the columns of this row - coordvals.r += 1; // increment row - if (coordvals.r > coordvals.r2) { // finished checking the entire range - coordvals.inrange = false; - continue; - } - coordvals.c = coordvals.c1; // start at the beginning of next row - } - rangecoord = SocialCalc.crToCoord(coordvals.c, coordvals.r); - - // now check that one - - coordvals.parsepos = i; // remember our position - coordvals.oldcoord = oldcoord; // remember back up chain - oldcoord = coord; // come back to us - coord = rangecoord; - if (checkinfo[coord] && typeof checkinfo[coord] == "object") { // Circular reference - cell.errors = SocialCalc.Constants.s_caccCircRef+startcoord; // set on original cell making the ref - checkinfo[startcoord] = true; // this one should be calculated once at this point - if (!recalcdata.firstcalc) { - recalcdata.firstcalc = startcoord; - } - else { - recalcdata.calclist[recalcdata.lastcalc] = startcoord; - } - recalcdata.lastcalc = startcoord; - recalcdata.calclistlength++; // count number on list - sheet.attribs.circularreferencecell = coord+"|"+oldcoord; // remember at least one circ ref - return cell.errors; - } - continue mainloop; - } - - ttype = parseinfo[i].type; // get token details - ttext = parseinfo[i].text; - if (ttype == token_op) { // references with sheet specifier are not checked - if (ttext == "!") { - sheetref = true; // found a sheet reference - } - else if (ttext != ":") { // for everything but a range, reset - sheetref = false; - } - } - - if (ttype == token_name) { // look for named range - value = scf.LookupName(sheet, ttext); - if (value.type == "range") { // only need to recurse here for range, which may be just one cell - pos = value.value.indexOf("|"); - if (pos != -1) { // range - check each cell - coordvals.cr1 = SocialCalc.coordToCr(value.value.substring(0,pos)); - pos2 = value.value.indexOf("|", pos+1); - coordvals.cr2 = SocialCalc.coordToCr(value.value.substring(pos+1,pos2)); - coordvals.inrange = true; - coordvals.inrangestart = true; - i = i-1; // back up so will start up again here - continue; - } - } - else if (value.type == "coord") { // just a coord - ttype = token_coord; // treat as a coord inline - ttext = value.value; // and then drop through to next test which should succeed - } - else { // not a defined name - probably a function - } - } - - if (ttype == token_coord) { // token is a coord - - if (i >= 2 // look for a range - && parseinfo[i-1].type == token_op && parseinfo[i-1].text == ':' - && parseinfo[i-2].type == token_coord - && !sheetref) { // Range -- check each cell - coordvals.cr1 = SocialCalc.coordToCr(parseinfo[i-2].text); // remember range extents - coordvals.cr2 = SocialCalc.coordToCr(ttext); - coordvals.inrange = true; // next time use the range looping code - coordvals.inrangestart = true; - i = i-1; // back up so will start up again here - continue; - } - - else if (!sheetref) { // Single cell reference - if (ttext.indexOf("$") != -1) ttext = ttext.replace(/\$/g, ""); // remove any $'s - coordvals.parsepos = i+1; // remember our position - come back on next token - coordvals.oldcoord = oldcoord; // remember back up chain - oldcoord = coord; // come back to us - coord = ttext; - if (checkinfo[coord] && typeof checkinfo[coord] == "object") { // Circular reference - cell.errors = SocialCalc.Constants.s_caccCircRef+startcoord; // set on original cell making the ref - checkinfo[startcoord] = true; // this one should be calculated once at this point - if (!recalcdata.firstcalc) { // add to calclist - recalcdata.firstcalc = startcoord; - } - else { - recalcdata.calclist[recalcdata.lastcalc] = startcoord; - } - recalcdata.lastcalc = startcoord; - recalcdata.calclistlength++; // count number on list - sheet.attribs.circularreferencecell = coord+"|"+oldcoord; // remember at least one circ ref - return cell.errors; - } - continue mainloop; - } - } - } - - sheetref = false; // make sure off when bump back up - - checkinfo[coord] = true; // this one is finished - if (!recalcdata.firstcalc) { // add to calclist - recalcdata.firstcalc = coord; - } - else { - recalcdata.calclist[recalcdata.lastcalc] = coord; - } - recalcdata.lastcalc = coord; - recalcdata.calclistlength++; // count number on list - - coord = oldcoord; // go back to the formula that referred to us and continue - oldcoord = checkinfo[coord] ? checkinfo[coord].oldcoord : null; - - } - - return ""; - - } - - -// ************************************* -// -// Parse class: -// -// Used by ExecuteSheetCommand to get elements of commands to execute. -// The string it works with consists of one or more lines each -// made up of one or more tokens separated by a delimiter. -// -// ************************************* - -// Initialize: set string to work with - -SocialCalc.Parse = function(str) { - - // properties: - - this.str = str; - this.pos = 0; - this.delimiter = " "; - this.lineEnd = str.indexOf("\n"); - if (this.lineEnd < 0) { - this.lineEnd = str.length; - } - - } - -// Return next token as a string - -SocialCalc.Parse.prototype.NextToken = function() { - if (this.pos < 0) return ""; - var pos2 = this.str.indexOf(this.delimiter, this.pos); - var pos1 = this.pos; - if (pos2 > this.lineEnd) { // don't go past end of line - pos2 = this.lineEnd; - } - if (pos2 >= 0) { - this.pos = pos2 + 1; - return this.str.substring(pos1, pos2); - } - else { - this.pos = this.lineEnd; - return this.str.substring(pos1, this.lineEnd); - } - } - -// Return everything from current point until end of line - -SocialCalc.Parse.prototype.RestOfString = function() { - var oldpos = this.pos; - if (this.pos < 0 || this.pos >= this.lineEnd) return ""; - this.pos = this.lineEnd; - return this.str.substring(oldpos, this.lineEnd); - } - -SocialCalc.Parse.prototype.RestOfStringNoMove = function() { - if (this.pos < 0 || this.pos >= this.lineEnd) return ""; - return this.str.substring(this.pos, this.lineEnd); - } - -// Move current point to next line - -SocialCalc.Parse.prototype.NextLine = function() { - this.pos = this.lineEnd + 1; - this.lineEnd = this.str.indexOf("\n", this.pos); - if (this.lineEnd < 0) { - this.lineEnd = this.str.length; - } - } - -// Check to see if at end of string with no more to process - -SocialCalc.Parse.prototype.EOF = function() { - if (this.pos < 0 || this.pos >= this.str.length) return true; - return false; - } - - -// ************************************* -// -// UndoStack class: -// -// Implements the behavior needed for a normal application's undo/redo stack. -// You add a new change sequence with PushChange. -// The type argument is a string that can be used to lookup some general string -// like "typing" or "setting attribute" for the menu prompts for undo/redo. -// -// You add the "do" steps with AddDo. The non-null, non-undefined arguments are -// joined together with " " to make a command string to be saved. -// -// You add the undo steps as commands for the most recent change with AddUndo. -// The non-null, non-undefined arguments are joined together with " " to make -// a command string to be saved. -// -// The Undo and Redo functions move the Top Of Stack pointer through the changes stack -// so you can undo and redo. Doing a new PushChange removes all undone items -// after TOS. -// -// You can push more things than you can undo if you want. -// There is a maximum to remember as the "did" stack for an audit trail (and as redo). This may be unlimited. -// There is a separate maximum to remember that can be undone. This may be smaller than maxRedo. -// -// ************************************* - -SocialCalc.UndoStack = function() { - - // properties: - - this.stack = []; // {command: [], type: type, undo: []} -- multiple dos and undos allowed - this.tos = -1; // top of stack position, used for undo/redo - this.maxRedo = 0; // Maximum size of redo stack (and audit trail which is this.stack[n].command) or zero if no limit - this.maxUndo = 50; // Maximum number of steps kept for undo (usually the memory intensive part) or zero if no limit - - } - -SocialCalc.UndoStack.prototype.PushChange = function(type) { // adding a new thing to the stack - while (this.stack.length > 0 && this.stack.length-1 > this.tos) { // pop off things not redone - this.stack.pop(); - } - this.stack.push({command: [], type: type, undo: []}); - if (this.maxRedo && this.stack.length > this.maxRedo) { // limit number kept as audit trail - this.stack.shift(); // remove the extra one - } - if (this.maxUndo && this.stack.length > this.maxUndo) { // need to trim excess undo info - this.stack[this.stack.length - this.maxUndo - 1].undo = []; // only need to remove one - } - this.tos = this.stack.length - 1; - } - -SocialCalc.UndoStack.prototype.AddDo = function() { - var args = []; - for (var i=0; i= 0) return this.stack[this.tos]; - else return null; - } - -SocialCalc.UndoStack.prototype.Undo = function() { - if (this.tos >= 0 && (!this.maxUndo || this.tos > this.stack.length - this.maxUndo - 1)) { - this.tos -= 1; - return true; - } - else { - return false; - } - } - -SocialCalc.UndoStack.prototype.Redo = function() { - if (this.tos < this.stack.length-1) { - this.tos += 1; - return true; - } - else { - return false; - } - } - -// ************************************* -// -// Clipboard Object: -// -// This is a single object. -// Stores the clipboard, which is shared by all active sheets. -// Like the undo stack, it does not persist from one editing session to another. -// -// ************************************* - -SocialCalc.Clipboard = { - - // properties: - - clipboard: "" // empty or string in save format with "copiedfrom:" set to a range - - } - - -// ************************************* -// -// RenderContext class: -// -// ************************************* - -SocialCalc.RenderContext = function(sheetobj) { - - var parts, num, s; - var attribs = sheetobj.attribs; - var scc = SocialCalc.Constants; - - // properties: - - this.sheetobj = sheetobj; - this.hideRowsCols = false; // Rendering with panes only works with "false" - // !!!! Note: not implemented yet in rendering, just saved as an attribute - this.showGrid = false; - this.showRCHeaders = false; - this.rownamewidth = scc.defaultRowNameWidth; - this.pixelsPerRow = scc.defaultAssumedRowHeight; - - this.cellskip = {}; // if present, coord of cell covering this cell - this.coordToCR = {}; // for cells starting spans, coordToCR[coord]={row:row, col:col} - this.colwidth = []; // precomputed column widths, taking into account defaults - this.totalwidth = 0; // precomputed total table width - - this.rowpanes = []; // for each pane, {first: firstrow, last: lastrow} - this.colpanes = []; // for each pane, {first: firstrow, last: lastrow} - this.maxcol=0; // max col and row to display, adding long spans, etc. - this.maxrow=0; - - this.highlights = {}; // for each cell with special display: coord:highlightType (see this.highlightTypes) - this.cursorsuffix = ""; // added to highlights[cr]=="cursor" to get type to lookup - - this.highlightTypes = // attributes to change when highlit - { - cursor: {style: scc.defaultHighlightTypeCursorStyle, className: scc.defaultHighlightTypeCursorClass}, - range: {style: scc.defaultHighlightTypeRangeStyle, className: scc.defaultHighlightTypeRangeClass}, - cursorinsertup: {style: "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-x;backgroundPosition:top left;backgroundImage:url("+scc.defaultImagePrefix+"cursorinsertup.gif);", className: scc.defaultHighlightTypeCursorClass}, - cursorinsertleft: {style: "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-y;backgroundPosition:top left;backgroundImage:url("+scc.defaultImagePrefix+"cursorinsertleft.gif);", className: scc.defaultHighlightTypeCursorClass}, - range2: {style: "color:#000;backgroundColor:#FFF;backgroundImage:url("+scc.defaultImagePrefix+"range2.gif);", className: ""} - } - - this.cellIDprefix = scc.defaultCellIDPrefix; // if non-null, each cell will render with an ID - - this.defaultlinkstyle = null; // default linkstyle object (allows you to pass values to link renderer) - this.defaultHTMLlinkstyle = {type: "html"}; // default linkstyle for standalone HTML - - // constants: - - this.defaultfontstyle = scc.defaultCellFontStyle; - this.defaultfontsize = scc.defaultCellFontSize; - this.defaultfontfamily = scc.defaultCellFontFamily; - - this.defaultlayout = scc.defaultCellLayout; - - this.defaultpanedividerwidth = scc.defaultPaneDividerWidth; - this.defaultpanedividerheight = scc.defaultPaneDividerHeight; - - this.gridCSS = scc.defaultGridCSS; - - this.commentClassName = scc.defaultCommentClass; // for cells with non-blank comments when this.showGrid is true - this.commentCSS = scc.defaultCommentStyle; // any combination of classnames and styles may be used - this.commentNoGridClassName = scc.defaultCommentNoGridClass; // for cells when this.showGrid is false - this.commentNoGridCSS = scc.defaultCommentNoGridStyle; // any combination of classnames and styles may be used - - this.classnames = // any combination of classnames and explicitStyles can be used - { - colname: scc.defaultColnameClass, - rowname: scc.defaultRownameClass, - selectedcolname: scc.defaultSelectedColnameClass, - selectedrowname: scc.defaultSelectedRownameClass, - upperleft: scc.defaultUpperLeftClass, - skippedcell: scc.defaultSkippedCellClass, - panedivider: scc.defaultPaneDividerClass - }; - - this.explicitStyles = // these may be used so you won't need a stylesheet with the classnames - { - colname: scc.defaultColnameStyle, - rowname: scc.defaultRownameStyle, - selectedcolname: scc.defaultSelectedColnameStyle, - selectedrowname: scc.defaultSelectedRownameStyle, - upperleft: scc.defaultUpperLeftStyle, - skippedcell: scc.defaultSkippedCellStyle, - panedivider: scc.defaultPaneDividerStyle - }; - - // processed info about cell skipping - - this.cellskip = null; - this.needcellskip = true; - - // precomputed values, filling in defaults indicated by "*" - - this.fonts=[]; // for each fontnum, {style: fs, weight: fw, size: fs, family: ff} - this.layouts=[]; // for each layout, "padding:Tpx Rpx Bpx Lpx;vertical-align:va;" - - this.needprecompute = true; // need to call PrecomputeSheetFontsAndLayouts - - // if have a sheet object, initialize constants and precomputed values - - if (sheetobj) { - this.rowpanes[0] = {first: 1, last: attribs.lastrow}; - this.colpanes[0] = {first: 1, last: attribs.lastcol}; - - } - else throw scc.s_rcMissingSheet; - - } - -// Methods: - -SocialCalc.RenderContext.prototype.PrecomputeSheetFontsAndLayouts = function() {SocialCalc.PrecomputeSheetFontsAndLayouts(this);}; -SocialCalc.RenderContext.prototype.CalculateCellSkipData = function() {SocialCalc.CalculateCellSkipData(this);}; -SocialCalc.RenderContext.prototype.CalculateColWidthData = function() {SocialCalc.CalculateColWidthData(this);}; -SocialCalc.RenderContext.prototype.SetRowPaneFirstLast = function(panenum, first, last) {this.rowpanes[panenum]={first:first, last:last};}; -SocialCalc.RenderContext.prototype.SetColPaneFirstLast = function(panenum, first, last) {this.colpanes[panenum]={first:first, last:last};}; -SocialCalc.RenderContext.prototype.CoordInPane = function(coord, rowpane, colpane) {return SocialCalc.CoordInPane(this, coord, rowpane, colpane);}; -SocialCalc.RenderContext.prototype.CellInPane = function(row, col, rowpane, colpane) {return SocialCalc.CellInPane(this, row, col, rowpane, colpane);}; -SocialCalc.RenderContext.prototype.InitializeTable = function(tableobj) {SocialCalc.InitializeTable(this, tableobj);}; -SocialCalc.RenderContext.prototype.RenderSheet = function(oldtable, linkstyle) {return SocialCalc.RenderSheet(this, oldtable, linkstyle);}; -SocialCalc.RenderContext.prototype.RenderColGroup = function() {return SocialCalc.RenderColGroup(this);}; -SocialCalc.RenderContext.prototype.RenderColHeaders = function() {return SocialCalc.RenderColHeaders(this);}; -SocialCalc.RenderContext.prototype.RenderSizingRow = function() {return SocialCalc.RenderSizingRow(this);}; -SocialCalc.RenderContext.prototype.RenderRow = function(rownum, rowpane, linkstyle) {return SocialCalc.RenderRow(this, rownum, rowpane, linkstyle);}; -SocialCalc.RenderContext.prototype.RenderSpacingRow = function() {return SocialCalc.RenderSpacingRow(this);}; -SocialCalc.RenderContext.prototype.RenderCell = function(rownum, colnum, rowpane, colpane, noElement, linkstyle) - {return SocialCalc.RenderCell(this, rownum, colnum, rowpane, colpane, noElement, linkstyle);}; - -// Functions: - -SocialCalc.PrecomputeSheetFontsAndLayouts = function(context) { - - var defaultfont, parts, layoutre, dparts, sparts, num, s, i; - var sheetobj = context.sheetobj; - var attribs = sheetobj.attribs; - - if (attribs.defaultfont) { - defaultfont = sheetobj.fonts[attribs.defaultfont]; - defaultfont = defaultfont.replace(/^\*/,SocialCalc.Constants.defaultCellFontStyle); - defaultfont = defaultfont.replace(/(.+)\*(.+)/,"$1"+SocialCalc.Constants.defaultCellFontSize+"$2"); - defaultfont = defaultfont.replace(/\*$/,SocialCalc.Constants.defaultCellFontFamily); - parts=defaultfont.match(/^(\S+? \S+?) (\S+?) (\S.*)$/); - context.defaultfontstyle = parts[1]; - context.defaultfontsize = parts[2]; - context.defaultfontfamily = parts[3]; - } - - for (num=1; num1 || rowspan>1) { - for (skiprow=row; skiprowcontext.maxrow) maxrow=skiprow; - if (skipcol>context.maxcol) maxcol=skipcol; - } - } - } - } - } - - context.needcellskip = false; - - } - -SocialCalc.CalculateColWidthData = function(context) { - - var colnum, colname, colwidth, totalwidth; - - var sheetobj=context.sheetobj; - var sheetcolattribs=sheetobj.colattribs; - - // Calculate column width data - - totalwidth=context.showRCHeaders ? context.rownamewidth-0 : 0; - for (colpane=0; colpane0)) ? (colwidth-0) : 10; - } - } - context.totalwidth = totalwidth; - - } - -SocialCalc.InitializeTable = function(context, tableobj) { - -/* - -Uses border-collapse so corners don't have holes -Note: IE and Firefox handle differently (IE adds borders and padding) -under border-collapse and Safari has problems with and wide text -Tablelayout "fixed" also leads to problems - -*/ - -/* - -*** Discussion *** - -The rendering assumes fixed column widths, even though SocialCalc allows "auto". -There may be issues with "auto" and it is hard to make it work cross-browser -with border-collapse, etc. - -This and the RenderSheet routine are where in the code the specifics of -table attributes and column size definitions are set. As the browsers settle down -and when we decide if we don't need auto width, we may want to revisit the way the -code does this (e.g., use table-layout:fixed). - -*/ - tableobj.style.borderCollapse="collapse"; - tableobj.cellSpacing="0"; - tableobj.cellPadding="0"; - - tableobj.style.width=context.totalwidth+"px"; - - } - -// -// tableobj = SocialCalc.RenderSheet(context, oldtable, linkstyle) -// -// Renders a render context returning a DOM table object. -// If there is an oldtable object, it replaces it in the parent node. -// If oldtable is null, it just returns the new one. -// The linkstyle is "" or null for editing rendering -// and optionally an object passed on to formatting code. -// - -SocialCalc.RenderSheet = function(context, oldtable, linkstyle) { - - var newrow, rowpane; - var tableobj, colgroupobj, tbodyobj, parentnode; - - // do precompute stuff if necessary - - if (context.sheetobj.changedrendervalues) { - context.needcellskip = true; - context.needprecompute = true; - context.sheetobj.changedrendervalues = false; - } - if (context.needcellskip) { - context.CalculateCellSkipData(); - } - if (context.needprecompute) { - context.PrecomputeSheetFontsAndLayouts(); - } - - context.CalculateColWidthData(); // always make sure col width values are up to date - - // make the table element and fill it in - - tableobj=document.createElement("table"); - context.InitializeTable(tableobj); - - colgroupobj=context.RenderColGroup(); - tableobj.appendChild(colgroupobj); - - tbodyobj=document.createElement("tbody"); - - tbodyobj.appendChild(context.RenderSizingRow()); - - if (context.showRCHeaders) { - newrow=context.RenderColHeaders(); - if (newrow) tbodyobj.appendChild(newrow); - } - - for (rowpane=0; rowpane position in Safari) - if (!SocialCalc.Constants.SCNoRowName) { - newcol.innerHTML=rownum+""; - } - result.appendChild(newcol); - } - - for (colpane=0; colpane1) { - span=1; - for (num=1; num1) { - span=1; - for (num=1; num panerowlimits.last) return false; - if (col < panecollimits.first || col > panecollimits.last) return false; - return true; - } - -SocialCalc.CreatePseudoElement = function() { - return {style:{cssText:""}, innerHTML: "", className: ""}; - } - - -// ************************************* -// -// Misc. functions: -// -// ************************************* - -SocialCalc.rcColname = function(c) { - - if (c > 702) c = 702; // maximum number of columns - ZZ - if (c < 1) c = 1; - var collow = (c - 1) % 26 + 65; - var colhigh = Math.floor((c - 1) / 26); - if (colhigh) - return String.fromCharCode(colhigh + 64) + String.fromCharCode(collow); - else - return String.fromCharCode(collow); - } - -SocialCalc.letters = ["A","B","C","D","E","F","G","H","I","J","K","L","M", - "N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]; - -SocialCalc.crToCoord = function(c, r) { - var result; - if (c < 1) c = 1; - if (c > 702) c = 702; // maximum number of columns - ZZ - if (r < 1) r = 1; - var collow = (c - 1) % 26; - var colhigh = Math.floor((c - 1) / 26); - if (colhigh) - result = SocialCalc.letters[colhigh-1] + SocialCalc.letters[collow] + r; - else - result = SocialCalc.letters[collow] + r; - return result; - } - -SocialCalc.coordToCol = {}; // too expensive to set in crToCoord since that is called so many times -SocialCalc.coordToRow = {}; - -SocialCalc.coordToCr = function(cr) { - var c, i, ch; - var r = SocialCalc.coordToRow[cr]; - if (r) return {row: r, col: SocialCalc.coordToCol[cr]}; - c=0;r=0; - for (i=0; i=97) c = 26*c + ch-96; - else if (ch>=65) c = 26*c + ch-64; - } - SocialCalc.coordToCol[cr] = c; - SocialCalc.coordToRow[cr] = r; - return {row: r, col: c}; - - } - -SocialCalc.ParseRange = function(range) { - var pos, cr, cr1, cr2; - if (!range) range = "A1:A1"; // error return, hopefully benign - range = range.toUpperCase(); - pos = range.indexOf(":"); - if (pos>=0) { - cr = range.substring(0,pos); - cr1 = SocialCalc.coordToCr(cr); - cr1.coord = cr; - cr = range.substring(pos+1); - cr2 = SocialCalc.coordToCr(cr); - cr2.coord = cr; - } - else { - cr1 = SocialCalc.coordToCr(range); - cr1.coord = range; - cr2 = SocialCalc.coordToCr(range); - cr2.coord = range; - } - return {cr1: cr1, cr2: cr2}; - } - -SocialCalc.decodeFromSave = function(s) { - if (typeof s != "string") return s; - if (s.indexOf("\\")==-1) return s; // for performace reasons: replace nothing takes up time - var r=s.replace(/\\c/g,":"); - r=r.replace(/\\n/g,"\n"); - return r.replace(/\\b/g,"\\"); - } - -SocialCalc.decodeFromAjax = function(s) { - if (typeof s != "string") return s; - if (s.indexOf("\\")==-1) return s; // for performace reasons: replace nothing takes up time - var r=s.replace(/\\c/g,":"); - r=r.replace(/\\n/g,"\n"); - r=r.replace(/\\e/g,"]]"); - return r.replace(/\\b/g,"\\"); - } - -SocialCalc.encodeForSave = function(s) { - if (typeof s != "string") return s; - if (s.indexOf("\\")!=-1) // for performace reasons: replace nothing takes up time - s=s.replace(/\\/g,"\\b"); - if (s.indexOf(":")!=-1) - s=s.replace(/:/g,"\\c"); - if (s.indexOf("\n")!=-1) - s=s.replace(/\n/g,"\\n"); - return s; - } - -// -// Returns estring where &, <, >, " are HTML escaped -// -SocialCalc.special_chars = function(string) { - - if (/[&<>"]/.test(string)) { // only do "slow" replaces if something to replace - string = string.replace(/&/g, "&"); - string = string.replace(//g, ">"); - string = string.replace(/"/g, """); - } - return string; - - } - -SocialCalc.Lookup = function(value, list) { - - for (i=0; i value) { - if (i>0) return i-1; - else return null; - } - } - return list.length-1; // if all smaller, matches last - - } - -// -// setStyles(element, cssText) -// -// Takes a pseudo style string (e.g., text-align must be textAlign) and sets -// the element's style value for each style name listed (leaving others unchanged). -// OK to call with null cssText. -// - -SocialCalc.setStyles = function (element, cssText) { - - var parts, part, pos, name, value; - - if (!cssText) return; - - parts = cssText.split(";"); - for (part=0; part'+dvsc+''; - } - else if (valueformat=="text-link") { // more extensive link capabilities for regular web links - displayvalue = SocialCalc.expand_text_link(displayvalue, sheetobj, linkstyle, valueformat); - } - else if (valueformat=="text-image") { // text is a URL for an image - dvue = encodeURI(displayvalue); - displayvalue = ''; - } - else if (valueformat.substring(0,12)=="text-custom:") { // construct a custom text format: @r = text raw, @s = special chars, @u = url encoded - dvsc = SocialCalc.special_chars(displayvalue); // do special chars - dvsc = dvsc.replace(/ /g, "  "); // keep multiple spaces - dvsc = dvsc.replace(/\n/g, "
    "); // keep line breaks - dvue = encodeURI(displayvalue); - textval={}; - textval.r = displayvalue; - textval.s = dvsc; - textval.u = dvue; - displayvalue = valueformat.substring(12); // remove "text-custom:" - displayvalue = displayvalue.replace(/@(r|s|u)/g, function(a,c){return textval[c];}); // replace placeholders - } - else if (valueformat.substring(0,6)=="custom") { // custom - displayvalue = SocialCalc.special_chars(displayvalue); // do special chars - displayvalue = displayvalue.replace(/ /g, "  "); // keep multiple spaces - displayvalue = displayvalue.replace(/\n/g, "
    "); // keep line breaks - displayvalue += " (custom format)"; - } - else if (valueformat=="hidden") { - displayvalue = " "; - } - else { // plain text - displayvalue = SocialCalc.special_chars(displayvalue); // do special chars - displayvalue = displayvalue.replace(/ /g, "  "); // keep multiple spaces - displayvalue = displayvalue.replace(/\n/g, "
    "); // keep line breaks - } - - return displayvalue; - - } - - -// -// displayvalue = format_number_for_display(rawvalue, valuetype, valueformat) -// - -SocialCalc.format_number_for_display = function(rawvalue, valuetype, valueformat) { - - var value, valuesubtype; - var scc = SocialCalc.Constants; - - value = rawvalue-0; - - valuesubtype = valuetype.substring(1); - - if (valueformat=="Auto" || valueformat=="") { // cases with default format - if (valuesubtype=="%") { // will display a % character - valueformat = "#,##0.0%"; - } - else if (valuesubtype=='$') { - valueformat = '[$]#,##0.00'; - } - else if (valuesubtype=='dt') { - valueformat = scc.defaultFormatdt; - } - else if (valuesubtype=='d') { - valueformat = scc.defaultFormatd; - } - else if (valuesubtype=='t') { - valueformat = scc.defaultFormatt; - } - else if (valuesubtype=='l') { - valueformat = 'logical'; - } - else { - valueformat = "General"; - } - } - - if (valueformat=="logical") { // do logical format - return value ? scc.defaultDisplayTRUE : scc.defaultDisplayFALSE; - } - - if (valueformat=="hidden") { // do hidden format - return " "; - } - - // Use format - - return SocialCalc.FormatNumber.formatNumberWithFormat(rawvalue, valueformat, ""); - - } - -// -// valueinfo = DetermineValueType(rawvalue) -// -// Takes a value and looks for special formatting like $, %, numbers, etc. -// Returns the value as a number or string and the type as {value: value, type: type}. -// Tries to follow the spec for spreadsheet function VALUE(v). -// - -SocialCalc.DetermineValueType = function(rawvalue) { - - var value = rawvalue + ""; - var type = "t"; - var tvalue, matches, year, hour, minute, second, denom, num, intgr, constr; - - tvalue = value.replace(/^\s+/, ""); // remove leading and trailing blanks - tvalue = tvalue.replace(/\s+$/, ""); - - if (value.length==0) { - type = ""; - } - else if (value.match(/^\s+$/)) { // just blanks - ; // leave type "t" - } - else if (tvalue.match(/^[-+]?\d*(?:\.)?\d*(?:[eE][-+]?\d+)?$/)) { // general number, including E - value = tvalue - 0; // try converting to number - if (isNaN(value)) { // leave alone - catches things like plain "-" - value = rawvalue + ""; - } - else { - type = "n"; - } - } - else if (tvalue.match(/^[-+]?\d*(?:\.)?\d*\s*%$/)) { // percent form: 15.1% - value = (tvalue.slice(0, -1) - 0) / 100; // convert and scale - type = "n%"; - } - else if (tvalue.match(/^[-+]?\$\s*\d*(?:\.)?\d*\s*$/) && tvalue.match(/\d/)) { // $ format: $1.49 - value = tvalue.replace(/\$/, "") - 0; - type = "n$"; - } - else if (tvalue.match(/^[-+]?(\d*,\d*)+(?:\.)?\d*$/)) { // number format ignoring commas: 1,234.49 - value = tvalue.replace(/,/g, "") - 0; - type = "n"; - } - else if (tvalue.match(/^[-+]?(\d*,\d*)+(?:\.)?\d*\s*%$/)) { // % with commas: 1,234.49% - value = (tvalue.replace(/[%,]/g, "") - 0) / 100; - type = "n%"; - } - else if (tvalue.match(/^[-+]?\$\s*(\d*,\d*)+(?:\.)?\d*$/) && tvalue.match(/\d/)) { // $ and commas: $1,234.49 - value = tvalue.replace(/[\$,]/g, "") - 0; - type = "n$"; - } - else if (matches=value.match(/^(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{1,4})\s*$/)) { // MM/DD/YYYY, MM/DD/YYYY - year = matches[3] - 0; - year = year < 1000 ? year + 2000 : year; - value = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, matches[1]-0, matches[2]-0)-2415019; - type = "nd"; - } - else if (matches=value.match(/^(\d{4})[\/\-](\d{1,2})[\/\-](\d{1,2})\s*$/)) { // YYYY-MM-DD, YYYY/MM/DD - year = matches[1]-0; - year = year < 1000 ? year + 2000 : year; - value = SocialCalc.FormatNumber.convert_date_gregorian_to_julian(year, matches[2]-0, matches[3]-0)-2415019; - type = "nd"; - } - else if (matches=value.match(/^(\d{1,2}):(\d{1,2})\s*$/)) { // HH:MM - hour = matches[1]-0; - minute = matches[2]-0; - if (hour < 24 && minute < 60) { - value = hour/24 + minute/(24*60); - type = "nt"; - } - } - else if (matches=value.match(/^(\d{1,2}):(\d{1,2}):(\d{1,2})\s*$/)) { // HH:MM:SS - hour = matches[1]-0; - minute = matches[2]-0; - second = matches[3]-0; - if (hour < 24 && minute < 60 && second < 60) { - value = hour/24 + minute/(24*60) + second/(24*60*60); - type = "nt"; - } - } - else if (matches=value.match(/^\s*([-+]?\d+) (\d+)\/(\d+)\s*$/)) { // 1 1/2 - intgr = matches[1]-0; - num = matches[2]-0; - denom = matches[3]-0; - if (denom && denom > 0) { - value = intgr + (intgr < 0 ? -num/denom : num/denom); - type = "n"; - } - } - else if (constr=SocialCalc.InputConstants[value.toUpperCase()]) { // special constants, like "false" and #N/A - num = constr.indexOf(","); - value = constr.substring(0,num)-0; - type = constr.substring(num+1); - } - - else if (tvalue.length > 7 && tvalue.substring(0,7).toLowerCase()=="http://") { // URL - value = tvalue; - type = "tl"; - } - - return {value: value, type: type}; - - } - -SocialCalc.InputConstants = { // strings that turn into constants for SocialCalc.DetermineValueType - "TRUE": "1,nl", "FALSE": "0,nl", "#N/A": "0,e#N/A", "#NULL!": "0,e#NULL!", "#NUM!": "0,e#NUM!", - "#DIV/0!": "0,e#DIV/0!", "#VALUE!": "0,e#VALUE!", "#REF!": "0,e#REF!", "#NAME?": "0,e#NAME?"}; - -// -// result = default_expand_markup(displayvalue, sheetobj, linkstyle) -// -// Processes wiki-text -- this is a placeholder. -// Reference to here in SocialCalc.expand_markup should be replaced by application-specific routine. -// - -SocialCalc.default_expand_markup = function(displayvalue, sheetobj, linkstyle) { - - var result = displayvalue; - - result = SocialCalc.special_chars(result); // do special chars - result = result.replace(/ /g, "  "); // keep multiple spaces - result = result.replace(/\n/g, "
    "); // keep line breaks - - return result; // do very little by default - - result = result.replace(/('*)'''(.*?)'''/g, "$1$2<\/b>"); // Wiki-style bold/italics - result = result.replace(/''(.*?)''/g, "$1<\/i>"); - - return result; - - } - - -// -// result = SocialCalc.expand_text_link(displayvalue, sheetobj, linkstyle, valueformat) -// -// Parses link text (URL, descriptions, pagenames, workspace names) and returns HTML -// - -SocialCalc.expand_text_link = function(displayvalue, sheetobj, linkstyle, valueformat) { - - var desc, tb, str; - - var scc = SocialCalc.Constants; - - var url = ""; - var parts = SocialCalc.ParseCellLinkText(displayvalue+""); - - if (parts.desc) { - desc = SocialCalc.special_chars(parts.desc); - } - else { - desc = parts.pagename ? scc.defaultPageLinkFormatString : scc.defaultLinkFormatString; - } - - if (displayvalue.length > 7 && displayvalue.substring(0,7).toLowerCase()=="http://" - && displayvalue.charAt(displayvalue.length-1)!=">") { - desc = desc.substring(7); // remove http:// unless explicit - } - - tb = (parts.newwin || !linkstyle) ? ' target="_blank"' : ""; - - if (parts.pagename) { - if (SocialCalc.Callbacks.MakePageLink) { - url = SocialCalc.Callbacks.MakePageLink(parts.pagename, parts.workspacename, linkstyle, valueformat); - } -// else if (parts.workspace) { -// url = "/" + encodeURI(parts.workspace) + "/" + encodeURI(parts.pagename); -// } -// else { -// url = parts.pagename; -// } - } - else { - url = encodeURI(parts.url); - } - str = '' + desc + ''; - - return str; - - } - - -// -// result = SocialCalc.ParseCellLinkText(str) -// -// Given: url = http://www.someurl.com/more, desc = Some descriptive text -// -// Takes the following: -// -// url -// -// desc -// "desc" -// <<>> instead of <> => target="_blank" (new window) -// -// [page name] -// "desc"[page name] -// desc[page name] -// {workspace name [page name]} -// "desc"{workspace name [page name]} -// [[]] instead of [] => target="_blank" (new window) -// -// -// Returns: {url: url, desc: desc, newwin: t/f, pagename: pagename, workspace: workspace} -// - -SocialCalc.ParseCellLinkText = function(str) { - - var result = {url: "", desc: "", newwin: false, pagename: "", workspace: ""}; - - var pageform = false; - var urlend = str.length - 1; - var descstart = 0; - var lastlt = str.lastIndexOf("<"); - var lastbrkt = str.lastIndexOf("["); - var lastbrace = str.lastIndexOf("{"); - var descend = -1; - - if ((str.charAt(urlend) != ">" || lastlt == -1) - && (str.charAt(urlend) != "]" || lastbrkt == -1) - && (str.charAt(urlend) != "}" || str.charAt(urlend-1) != "]" || - lastbrace == -1 || lastbrkt == -1 || lastbrkt < lastbrace)) { // plain url - urlend++; - descend = urlend; - } - else { // some markup - if (str.charAt(urlend)==">") { // url form - descend = lastlt - 1; - if (lastlt > 0 && str.charAt(descend) == "<" && str.charAt(urlend-1) == ">") { - descend--; - urlend--; - result.newwin = true; - } - } - - else if (str.charAt(urlend)=="]") { // plain page form - descend = lastbrkt - 1; - pageform = true; - if (lastbrkt > 0 && str.charAt(descend) == "[" && str.charAt(urlend-1) == "]") { - descend--; - urlend--; - result.newwin = true; - } - } - - else if (str.charAt(urlend)=="}") { // page and workspace form - descend = lastbrace - 1; - pageform = true; - wsend = lastbrkt; - urlend--; - if (lastbrkt > 0 && str.charAt(lastbrkt-1) == "[" && str.charAt(urlend-1) == "]") { - wsend = lastbrkt-1; - urlend--; - result.newwin = true; - } - if (str.charAt(wsend-1)==" ") { // trim trailing space in workspace name - wsend--; - } - result.workspace = str.substring(lastbrace+1, wsend) || ""; - } - - if (str.charAt(descend)==" ") { // trim trailing space on desc - descend--; - } - - if (str.charAt(descstart) == '"' && str.charAt(descend) == '"') { - descstart++; - descend--; - } - } - - if (pageform) { - result.pagename = str.substring(lastbrkt+1, urlend) || ""; - } - else { - result.url = str.substring(lastlt+1, urlend) || ""; - } - - if (descend >= descstart) { - result.desc = str.substring(descstart, descend+1); - } - - return result; - - } - - -// -// result = SocialCalc.ConvertSaveToOtherFormat(savestr, outputformat, dorecalc) -// -// Returns a string in the specificed format: "scsave", "html", "csv", "tab" (tab delimited) -// If dorecalc is true, performs a recalc after loading (NO: obsolete!). -// - -SocialCalc.ConvertSaveToOtherFormat = function(savestr, outputformat, dorecalc) { - - var sheet, context, clipextents, div, ele, row, col, cr, cell, str; - - var result = ""; - - if (outputformat == "scsave") { - return savestr; - } - - if (savestr == "") { - return ""; - } - - sheet = new SocialCalc.Sheet(); - sheet.ParseSheetSave(savestr); - - if (dorecalc) { - // no longer supported as of 9/10/08 - // Recalc is now async, so can't do it this way - throw("SocialCalc.ConvertSaveToOtherFormat: Not doing recalc."); - } - - if (sheet.copiedfrom) { - clipextents = SocialCalc.ParseRange(sheet.copiedfrom); - } - else { - clipextents = {cr1: {row: 1, col: 1}, cr2: {row: sheet.attribs.lastrow, col: sheet.attribs.lastcol}}; - } - - if (outputformat == "html") { - context=new SocialCalc.RenderContext(sheet); - if (sheet.copiedfrom) { - context.rowpanes[0] = {first: clipextents.cr1.row, last: clipextents.cr2.row}; - context.colpanes[0] = {first: clipextents.cr1.col, last: clipextents.cr2.col}; - } - div = document.createElement("div"); - ele = context.RenderSheet(null, context.defaultHTMLlinkstyle); - div.appendChild(ele); - delete context; - delete sheet; - result = div.innerHTML; - delete ele; - delete div; - return result; - } - - for (row = clipextents.cr1.row; row <= clipextents.cr2.row; row++) { - for (col = clipextents.cr1.col; col <= clipextents.cr2.col; col++) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - - if (cell.errors) { - str = cell.errors; - } - else { - str = cell.datavalue+""; // get value as text - } - - if (outputformat == "csv") { - if (str.indexOf('"')!=-1) { - str = str.replace(/"/g, '""'); // double quotes - } - if (/[, \n"]/.test(str)) { - str = '"' + str + '"'; // add quotes - } - if (col>clipextents.cr1.col) { - str = "," + str; // add commas - } - } - else if (outputformat == "tab") { - if (str.indexOf('\n')!=-1) { // if multiple lines - if (str.indexOf('"')!=-1) { - str = str.replace(/"/g, '""'); // double quotes - } - str = '"' + str + '"'; // add quotes - } - if (col>clipextents.cr1.col) { - str = "\t" + str; // add tabs - } - } - result += str; - } - result += "\n"; - } - - return result; - - } - - -// -// result = SocialCalc.ConvertOtherFormatToSave(inputstr, inputformat) -// -// Returns a string converted from the specified format: "scsave", "csv", "tab" (tab delimited) -// - -SocialCalc.ConvertOtherFormatToSave = function(inputstr, inputformat) { - - var sheet, context, lines, i, line, value, inquote, j, ch, values, row, col, cr, maxc; - - var result = ""; - - var AddCell = function() { - col++; - if (col>maxc) maxc = col; - cr = SocialCalc.crToCoord(col, row); - SocialCalc.SetConvertedCell(sheet, cr, value); - value = ""; - } - - if (inputformat == "scsave") { - return inputstr; - } - - sheet = new SocialCalc.Sheet(); - - lines = inputstr.split(/\r\n|\n/); - - maxc = 0; - if (inputformat == "csv") { - row = 0; - inquote = false; - for (i=0; i0) { - sheet.attribs.lastrow = row; - sheet.attribs.lastcol = maxc; - result = sheet.CreateSheetSave("A1:"+SocialCalc.crToCoord(maxc, row)); - } - } - - if (inputformat == "tab") { - row = 0; - inquote = false; - for (i=0; i0) { - sheet.attribs.lastrow = row; - sheet.attribs.lastcol = maxc; - result = sheet.CreateSheetSave("A1:"+SocialCalc.crToCoord(maxc, row)); - } - } - - return result; - - } - -// -// SocialCalc.SetConvertedCell(sheet, cr, rawvalue) -// -// Sets the cell cr with a value and type determined from rawvalue -// - -SocialCalc.SetConvertedCell = function(sheet, cr, rawvalue) { - - var cell, value; - - cell = sheet.GetAssuredCell(cr); - - value = SocialCalc.DetermineValueType(rawvalue); - - if (value.type == 'n' && value.value == rawvalue) { // check that we don't need "constant" to remember original value - cell.datatype = "v"; - cell.valuetype = "n"; - cell.datavalue = value.value; - } - else if (value.type.charAt(0) == 't') { // text of some sort but left unchanged - cell.datatype = "t"; - cell.valuetype = value.type; - cell.datavalue = value.value; - } - else { // special number types - cell.datatype = "c"; - cell.valuetype = value.type; - cell.datavalue = value.value; - cell.formula = rawvalue; - } - - } - diff --git a/Website/static/runappios43c/lib/aspiring/socialcalc.css b/Website/static/runappios43c/lib/aspiring/socialcalc.css deleted file mode 100755 index 78f4dc5..0000000 --- a/Website/static/runappios43c/lib/aspiring/socialcalc.css +++ /dev/null @@ -1,49 +0,0 @@ -/* -// The optional default CSS style sheet for the SocialCalc package. -// SocialCalc can run without a style sheet (the default) or with one. -// -// (c) Copyright 2008 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -*/ - -.defaultPeer {background-repeat:no-repeat;background-position:top left;background-image:url(images/sc-peerbg.gif);} -.defaultComment {background-repeat:no-repeat;background-position:top right;background-image:url(static/images/sc-commentbg.gif);} -.defaultCommentNoGridStyle {} -.defaultHighlightTypeCursor {color:#FFF;background-color:#A6A6A6;} -.defaultHighlightTypeRange {color:#000;background-color:#E5E5E5;} -.defaultColname {font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;} -.defaultSelectedColname {font-size:small;text-align:center;color:#FFFFFF;background-color:#404040;cursor:e-resize;} -.defaultRowname {font-size:small;text-align:right;color:#FFFFFF;background-color:#808080;} -.defaultSelectedRowname {font-size:small;text-align:right;color:#FFFFFF;background-color:#404040;} -.defaultUpperLeft {font-size:small;} -.defaultSkippedCell {font-size:small;background-color:#CCC;} -.defaultPaneDivider {font-size:small;background-color:#ECECEC;padding:0px;} -.cteGriddiv {} -.defaultInputEcho {background-color:#FFD;border:1px solid #884; - font-size:small;padding:2px 10px 1px 2px;cursor:default;} -.TCmain {background-color:#EEE;} -.TCendcap {background-color:#FFF;} -.TCpaneslider {background-color:#CCC;} -.TClessbutton {background-color:#AAA;} -.TCmorebutton {background-color:#AAA;} -.TCscrollarea {background-color:#DDD;} -.TCthumb {background-color:#CCC;} -.TCPStrackingline {overflow:hidden;position:absolute;z-index:100;} -.TCTDFSthumbstatus {height:20px;width:auto;border:1px solid black;padding:2px; - background-color:#FFF;font-size:small;position:absolute;z-index:100;} -.TDpopupElement {border:1px solid black;padding:1px 2px 2px 2px;text-align:center;background-color:#FFF; - font-size:7pt;font-family:Verdana,Arial,Helvetica,sans-serif; - position:absolute;width:auto;z-index:110;} - - diff --git a/Website/static/runappios43c/lib/aspiring/socialcalcconstants.js b/Website/static/runappios43c/lib/aspiring/socialcalcconstants.js deleted file mode 100755 index 2c2ae5b..0000000 --- a/Website/static/runappios43c/lib/aspiring/socialcalcconstants.js +++ /dev/null @@ -1,834 +0,0 @@ -// -/* -// The module of the SocialCalc package with customizable constants, strings, etc. -// This is where most of the common localizations are done. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// -*/ - -var SocialCalc; -if (!SocialCalc) SocialCalc = {}; - -// ************************************* -// -// TO LEARN HOW TO LOCALIZE OR CUSTOMIZE SOCIALCALC, PLEASE READ THIS: -// -// The constants are all properties of the SocialCalc.Constants object. -// They are grouped here by what they are for, which module uses them, etc. -// -// Properties whose names start with "s_" are strings, or arrays of strings, -// that are good candidates for translation from the English. -// -// Other properties relate to visual settings, localization parameters, etc. -// -// These values are not used when SocialCalc modules are first loaded. -// They may be modified before the first use of the routines that use them, -// e.g., before creating SocialCalc objects. -// -// The exceptions are: -// TooltipOffsetX and TooltipOffsetY, as described with their definitions. -// -// SocialCalc IS NOT DESIGNED FOR USE WITH A TRANSLATION FUNCTION each time a string -// is used. Instead, language translations may be done by modifying this object. -// -// To customize SocialCalc, you may either replace this file with a modified version -// or you can overwrite the values before use. An example would be to -// iterate over all the properties looking for names that start with "s_" and -// use some other mechanism to obtain a localized string and replace the values -// here with those translated values. -// -// There is also a function, SocialCalc.ConstantsSetClasses, that may be used -// to easily switch SocialCalc from using explicit CSS styles for many things -// to using CSS classes. See the function, below, for more information. -// -// ************************************* - -SocialCalc.Constants = { - -// -// Main SocialCalc module, socialcalc-3.js: -// - - //*** Common Constants - - textdatadefaulttype: "t", // This sets the default type for text on reading source file - // It should normally be "t" - - //*** Common error messages - - s_BrowserNotSupported: "Browser not supported.", // error thrown if browser can't handle events like IE or Firefox. - s_InternalError: "Internal SocialCalc error (probably an internal bug): ", // hopefully unlikely, but a test failed - - //*** SocialCalc.ParseSheetSave - - // Errors thrown on unexpected value in save file: - - s_pssUnknownColType: "Unknown col type item", - s_pssUnknownRowType: "Unknown row type item", - s_pssUnknownLineType: "Unknown line type", - - //*** SocialCalc.CellFromStringParts - - // Error thrown on unexpected value in save file: - - s_cfspUnknownCellType: "Unknown cell type item", - - //*** SocialCalc.CanonicalizeSheet - - doCanonicalizeSheet: true, // if true, do the canonicalization calculations - - //*** ExecuteSheetCommand - - s_escUnknownSheetCmd: "Unknown sheet command: ", - s_escUnknownSetCoordCmd: "Unknown set coord command: ", - s_escUnknownCmd: "Unknown command: ", - - //*** SocialCalc.CheckAndCalcCell - - s_caccCircRef: "Circular reference to ", // circular reference found during recalc - - //*** SocialCalc.RenderContext - - defaultRowNameWidth: "30", // used to set minimum width of the row header column - a string in pixels - defaultAssumedRowHeight: 15, // used when guessing row heights - number - defaultCellIDPrefix: "cell_", // if non-null, each cell will render with an ID starting with this - - // Default sheet display values - - defaultCellLayout: "padding:2px 2px 1px 2px;vertical-align:top;", - defaultCellFontStyle: "normal normal", - defaultCellFontSize: "small", - defaultCellFontFamily: "Verdana,Arial,Helvetica,sans-serif", - - defaultPaneDividerWidth: "2", // a string - defaultPaneDividerHeight: "3", // a string - - defaultGridCSS: "1px solid #C0C0C0;", // used as style to set each border when grid enabled (was #ECECEC) - - defaultCommentClass: "", // class added to cells with non-null comments when grid enabled - defaultCommentStyle: "background-repeat:no-repeat;background-position:top right;background-image:url(images/sc-commentbg.gif);", // style added to cells with non-null comments when grid enabled - defaultCommentNoGridClass: "", // class added to cells with non-null comments when grid not enabled - defaultCommentNoGridStyle: "", // style added to cells with non-null comments when grid not enabled - - defaultColWidth: "80", // text - defaultMinimumColWidth: 10, // numeric - - // For each of the following default sheet display values at least one of class and/or style are needed - - defaultHighlightTypeCursorClass: "", - // defaultHighlightTypeCursorStyle: "color:#FFF;backgroundColor:#A6A6A6;", - defaultHighlightTypeCursorStyle: "", - defaultHighlightTypeRangeClass: "", - //defaultHighlightTypeRangeStyle: "color:#000;backgroundColor:#E5E5E5;", - defaultHighlightTypeRangeStyle: "", - - defaultColnameClass: "", // regular column heading letters, needs a cursor property - defaultColnameStyle: "font-size:small;text-align:center;color:#FFFFFF;background-color:#808080;cursor:e-resize;", - defaultSelectedColnameClass: "", // column with selected cell, needs a cursor property - defaultSelectedColnameStyle: "font-size:small;text-align:center;color:#FFFFFF;background-color:#404040;cursor:e-resize;", - defaultRownameClass: "", // regular row heading numbers - defaultRownameStyle: "font-size:small;text-align:right;color:#FFFFFF;background-color:#808080;", - defaultSelectedRownameClass: "", // column with selected cell, needs a cursor property - defaultSelectedRownameStyle: "font-size:small;text-align:right;color:#FFFFFF;background-color:#404040;", - defaultUpperLeftClass: "", // Corner cell in upper left - defaultUpperLeftStyle: "font-size:small;", - defaultSkippedCellClass: "", // used if present for spanned cells peeking into a pane (at least one of class/style needed) - defaultSkippedCellStyle: "font-size:small;background-color:#CCC", // used if present - defaultPaneDividerClass: "", // used if present for the look of the space between panes (at least one of class/style needed) - defaultPaneDividerStyle: "font-size:small;background-color:#C0C0C0;padding:0px;", // used if present - - s_rcMissingSheet: "Render Context must have a sheet object", // unlikely thrown error - - //*** SocialCalc.format_text_for_display - - defaultLinkFormatString: 'Link', // used for format "text-link"; you could make this an img tag if desired -// defaultLinkFormatString: 'Link out', - defaultPageLinkFormatString: 'Page', // used for format "text-link"; you could make this an img tag if desired - - //*** SocialCalc.format_number_for_display - - defaultFormatdt: 'd-mmm-yyyy h:mm:ss', - defaultFormatd: 'd-mmm-yyyy', - defaultFormatt: '[h]:mm:ss', - defaultDisplayTRUE: 'TRUE', // how TRUE shows when rendered - defaultDisplayFALSE: 'FALSE', - -// -// SocialCalc Table Editor module, socialcalctableeditor.js: -// - - //*** SocialCalc.TableEditor - - defaultImagePrefix: "images/sc-", // URL prefix for images (e.g., "/images/sc") - defaultTableEditorIDPrefix: "te_", // if present, many TableEditor elements are assigned IDs with this prefix - defaultPageUpDnAmount: 15, // number of rows to move cursor on PgUp/PgDn keys (numeric) - - AllowCtrlS: true, // turns on Ctrl-S trapdoor for setting custom numeric formats and commands if true - - //*** SocialCalc.CreateTableEditor - - defaultTableControlThickness: 20, // the short size for the scrollbars, etc. (numeric in pixels) - cteGriddivClass: "", // if present, the class for the TableEditor griddiv element - - //** SocialCalc.EditorGetStatuslineString -- strings shown on status line - - s_statusline_executing: "Executing...", - s_statusline_displaying: "Displaying...", - s_statusline_ordering: "Ordering...", - s_statusline_calculating: "Calculating...", - s_statusline_calculatingls: "Calculating... Loading Sheet...", - s_statusline_doingserverfunc: "doing server function ", - s_statusline_incell: " in cell ", - s_statusline_calcstart: "Calculation start...", - s_statusline_sum: "SUM", - s_statusline_recalcneeded: '(Recalc needed)', - s_statusline_circref: 'Circular reference: ', - - //** SocialCalc.InputBoxDisplayCellContents - - s_inputboxdisplaymultilinetext: "[Multi-line text: Click icon on right to edit]", - - //** SocialCalc.InputEcho - - defaultInputEchoClass: "", // if present, the class of the popup inputEcho div - defaultInputEchoStyle: "filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;border:1px solid #884;"+ - "fontSize:small;padding:2px 10px 1px 2px;cursor:default;", // if present, pseudo style - defaultInputEchoPromptClass: "", // if present, the class of the popup inputEcho div - defaultInputEchoPromptStyle: "filter:alpha(opacity=90);opacity:.9;backgroundColor:#FFD;"+ - "borderLeft:1px solid #884;borderRight:1px solid #884;borderBottom:1px solid #884;"+ - "fontSize:small;fontStyle:italic;padding:2px 10px 1px 2px;cursor:default;", // if present, pseudo style - - //** SocialCalc.InputEchoText - - ietUnknownFunction: "Unknown function ", // displayed when typing "=unknown(" - - //** SocialCalc.CellHandles - - CH_radius1: 29.0, // extent of inner circle within 90px image - CH_radius2: 41.0, // extent of outer circle within 90px image - s_CHfillAllTooltip: "Fill Contents and Formats Down/Right", // tooltip for fill all handle - s_CHfillContentsTooltip: "Fill Contents Only Down/Right", // tooltip for fill formulas handle - s_CHmovePasteAllTooltip: "Move Contents and Formats", // etc. - s_CHmovePasteContentsTooltip: "Move Contents Only", - s_CHmoveInsertAllTooltip: "Slide Contents and Formats within Row/Col", - s_CHmoveInsertContentsTooltip: "Slide Contents within Row/Col", - s_CHindicatorOperationLookup: {"Fill": "Fill", "FillC": "Fill Contents", - "Move": "Move", "MoveI": "Slide", - "MoveC": "Move Contents", "MoveIC": "Slide Contents"}, // short form of operation to follow drag - s_CHindicatorDirectionLookup: {"Down": " Down", "Right": " Right", - "Horizontal": " Horizontal", "Vertical": " Vertical"}, // direction that modifies operation during drag - - //*** SocialCalc.TableControl - - defaultTCSliderThickness: 9, // length of pane slider (numeric in pixels) - defaultTCButtonThickness: 20, // length of scroll +/- buttons (numeric in pixels) - defaultTCThumbThickness: 15, // length of thumb (numeric in pixels) - - //*** SocialCalc.CreateTableControl - - TCmainStyle: "backgroundColor:#EEE;", // if present, pseudo style (text-align is textAlign) for main div of a table control - TCmainClass: "", // if present, the CSS class of the main div for a table control - TCendcapStyle: "backgroundColor:#FFF;", // backgroundColor may be used while waiting for image that may not come - TCendcapClass: "", - TCpanesliderStyle: "backgroundColor:#CCC;", - TCpanesliderClass: "", - s_panesliderTooltiph: "Drag to lock pane vertically", // tooltip for horizontal table control pane slider - s_panesliderTooltipv: "Drag to lock pane horizontally", - TClessbuttonStyle: "backgroundColor:#AAA;", - TClessbuttonClass: "", - TClessbuttonRepeatWait: 300, // in milliseconds - TClessbuttonRepeatInterval: 20,//100, // in milliseconds - TCmorebuttonStyle: "backgroundColor:#AAA;", - TCmorebuttonClass: "", - TCmorebuttonRepeatWait: 300, // in milliseconds - TCmorebuttonRepeatInterval: 20,//100, // in milliseconds - TCscrollareaStyle: "backgroundColor:#DDD;", - TCscrollareaClass: "", - TCscrollareaRepeatWait: 500, // in milliseconds - TCscrollareaRepeatInterval: 100, // in milliseconds - TCthumbClass: "", - TCthumbStyle: "backgroundColor:#CCC;", - - //*** SocialCalc.TCPSDragFunctionStart - - TCPStrackinglineClass: "", // at least one of class/style for pane slider tracking line display in table control - TCPStrackinglineStyle: "overflow:hidden;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCPStrackinglineThickness: "2px", // narrow dimension of trackling line (string with units) - - - //*** SocialCalc.TCTDragFunctionStart - - TCTDFSthumbstatusvClass: "", // at least one of class/style for vertical thumb dragging status display in table control - TCTDFSthumbstatusvStyle: "height:20px;width:auto;border:3px solid #808080;overflow:hidden;"+ - "backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCTDFSthumbstatushClass: "", // at least one of class/style for horizontal thumb dragging status display in table control - TCTDFSthumbstatushStyle: "height:20px;width:auto;border:1px solid black;padding:2px;"+ - "backgroundColor:#FFF;fontSize:small;position:absolute;zIndex:100;", - // if present, pseudo style (text-align is textAlign) - TCTDFSthumbstatusrownumClass: "", // at least one of class/style for thumb dragging status display in table control - TCTDFSthumbstatusrownumStyle: "color:#FFF;background-color:#808080;font-size:small;white-space:nowrap;padding:3px;", // if present, real style - TCTDFStopOffsetv: 0, // offsets for thumbstatus display while dragging - TCTDFSleftOffsetv: -80, - s_TCTDFthumbstatusPrefixv: "Row ", // Text Control Drag Function text before row number - TCTDFStopOffseth: -30, - TCTDFSleftOffseth: 0, - s_TCTDFthumbstatusPrefixh: "Col ", // Text Control Drag Function text before col number - - //*** SocialCalc.TooltipInfo - - // Note: These two values are used to set the TooltipInfo initial values when the code is first read in. - // Modifying them here after loading has no effect -- you need to modify SocialCalc.TooltipInfo directly - // to dynamically set them. This is different than most other constants which may be modified until use. - - TooltipOffsetX: 2, // offset in pixels from mouse position (to right on left side of screen, to left on right) - TooltipOffsetY: 10, // offset in pixels above mouse position for lower edge - - //*** SocialCalc.TooltipDisplay - - TDpopupElementClass: "", // at least one of class/style for tooltip display - TDpopupElementStyle: "border:1px solid black;padding:1px 2px 2px 2px;textAlign:center;backgroundColor:#FFF;"+ - "fontSize:7pt;fontFamily:Verdana,Arial,Helvetica,sans-serif;"+ - "position:absolute;width:auto;zIndex:110;", - // if present, pseudo style (text-align is textAlign) - - -// -// SocialCalc Spreadsheet Control module, socialcalcspreadsheetcontrol.js: -// - - //*** SocialCalc.SpreadsheetControl - - SCToolbarbackground: "background-color:#404040;", - SCTabbackground: "background-color:#CCC;", - SCTabselectedCSS: "font-size:small;padding:6px 30px 6px 8px;color:#FFF;background-color:#404040;cursor:default;border-right:1px solid #CCC;", - SCTabplainCSS: "font-size:small;padding:6px 30px 6px 8px;color:#FFF;background-color:#808080;cursor:default;border-right:1px solid #CCC;", - SCToolbartext: "font-size:x-small;font-weight:bold;color:#FFF;padding-bottom:4px;", - - SCFormulabarheight: 40, // in pixels, will contain a text input box - - SCStatuslineheight: 20, // in pixels - SCStatuslineCSS: "font-size:10px;padding:3px 0px;", - - - // workbook - doWorkBook: true, - SCSheetBarHeight: 25, - SCSheetBarBackground: "background-color:#CCC;", - SCSheetBarCSS: "background-color:#CCC;", - SCSheetBarWidth: "70%", - - SCCellHandlesDisable: true, - SCNoInputEcho: true, // do we need an input echo ? - s_inputboxdisplaynoteditable: "[not editable]", - SCNoRowName: true, - SCNoRanging: true, - SCNoQuoteInInputBox: true, - // Constants for default Format tab (settings) - // - // *** EVEN THOUGH THESE DON'T START WITH s_: *** - // - // These should be carefully checked for localization. Make sure you understand what they do and how they work! - // The first part of "first:second|first:second|..." is what is displayed and the second is the value to be used. - // The value is normally not translated -- only the displayed part. The [cancel], [break], etc., are not translated -- - // they are commands to SocialCalc.SettingsControls.PopupListInitialize - - SCFormatNumberFormats: "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Auto w/ commas!:[,]General|[break]:|"+ - "00:00|000:000|0000:0000|00000:00000|[break]:|%loc!Formula!:formula|%loc!Hidden!:hidden|[newcol]:"+ - "1234:0|1,234:#,##0|1,234.5:#,##0.0|1,234.56:#,##0.00|1,234.567:#,##0.000|1,234.5678:#,##0.0000|"+ - "[break]:|1,234%:#,##0%|1,234.5%:#,##0.0%|1,234.56%:#,##0.00%|"+ - "[newcol]:|$1,234:$#,##0|$1,234.5:$#,##0.0|$1,234.56:$#,##0.00|[break]:|"+ - "(1,234):#,##0_);(#,##0)|(1,234.5):#,##0.0_);(#,##0.0)|(1,234.56):#,##0.00_);(#,##0.00)|[break]:|"+ - "($1,234):#,##0_);($#,##0)|($1,234.5):$#,##0.0_);($#,##0.0)|($1,234.56):$#,##0.00_);($#,##0.00)|"+ - "[newcol]:|1/4/06:m/d/yy|01/04/2006:mm/dd/yyyy|2006-01-04:yyyy-mm-dd|4-Jan-06:d-mmm-yy|04-Jan-2006:dd-mmm-yyyy|January 4, 2006:mmmm d, yyyy|"+ - "[break]:|1\\c23:h:mm|1\\c23 PM:h:mm AM/PM|1\\c23\\c45:h:mm:ss|01\\c23\\c45:hh:mm:ss|26\\c23 (h\\cm):[hh]:mm|69\\c45 (m\\cs):[mm]:ss|69 (s):[ss]|"+ - "[newcol]:|2006-01-04 01\\c23\\c45:yyyy-mm-dd hh:mm:ss|January 4, 2006:mmmm d, yyyy hh:mm:ss|Wed:ddd|Wednesday:dddd|", - SCFormatTextFormats: "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!Automatic!:general|%loc!Plain Text!:text-plain|"+ - "HTML:text-html|%loc!Wikitext!:text-wiki|%loc!Link!:text-link|%loc!Formula!:formula|%loc!Hidden!:hidden|", - SCFormatPadsizes: "[cancel]:|[break]:|%loc!Default!:|[custom]:|%loc!No padding!:0px|"+ - "[newcol]:|1 pixel:1px|2 pixels:2px|3 pixels:3px|4 pixels:4px|5 pixels:5px|"+ - "6 pixels:6px|7 pixels:7px|8 pixels:8px|[newcol]:|9 pixels:9px|10 pixels:10px|11 pixels:11px|"+ - "12 pixels:12px|13 pixels:13px|14 pixels:14px|16 pixels:16px|"+ - "18 pixels:18px|[newcol]:|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|", - SCFormatFontsizes: "[cancel]:|[break]:|%loc!Default!:|[custom]:|X-Small:x-small|Small:small|Medium:medium|Large:large|X-Large:x-large|"+ - "[newcol]:|6pt:6pt|7pt:7pt|8pt:8pt|9pt:9pt|10pt:10pt|11pt:11pt|12pt:12pt|14pt:14pt|16pt:16pt|"+ - "[newcol]:|18pt:18pt|20pt:20pt|22pt:22pt|24pt:24pt|28pt:28pt|36pt:36pt|48pt:48pt|72pt:72pt|"+ - "[newcol]:|8 pixels:8px|9 pixels:9px|10 pixels:10px|11 pixels:11px|"+ - "12 pixels:12px|13 pixels:13px|14 pixels:14px|[newcol]:|16 pixels:16px|"+ - "18 pixels:18px|20 pixels:20px|22 pixels:22px|24 pixels:24px|28 pixels:28px|36 pixels:36px|", - SCFormatFontfamilies: "[cancel]:|[break]:|%loc!Default!:|[custom]:|Verdana:Verdana,Arial,Helvetica,sans-serif|"+ - "Arial:arial,helvetica,sans-serif|Courier:'Courier New',Courier,monospace|", - SCFormatFontlook: "[cancel]:|[break]:|%loc!Default!:|%loc!Normal!:normal normal|%loc!Bold!:normal bold|%loc!Italic!:italic normal|"+ - "%loc!Bold Italic!:italic bold", - SCFormatTextAlignhoriz: "[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|", - SCFormatNumberAlignhoriz: "[cancel]:|[break]:|%loc!Default!:|%loc!Left!:left|%loc!Center!:center|%loc!Right!:right|", - SCFormatAlignVertical: "[cancel]:|[break]:|%loc!Default!:|%loc!Top!:top|%loc!Middle!:middle|%loc!Bottom!:bottom|", - SCFormatColwidth: "[cancel]:|[break]:|%loc!Default!:|[custom]:|[newcol]:|"+ - "20 pixels:20|40:40|60:60|80:80|100:100|120:120|140:140|160:160|"+ - "[newcol]:|180 pixels:180|200:200|220:220|240:240|260:260|280:280|300:300|", - SCFormatRecalc: "[cancel]:|[break]:|%loc!Auto!:|%loc!Manual!:off|", - - //*** SocialCalc.InitializeSpreadsheetControl - - ISCButtonBorderNormal: "#404040", - ISCButtonBorderHover: "#999", - ISCButtonBorderDown: "#FFF", - ISCButtonDownBackground: "#888", - - //*** SocialCalc.SettingsControls.PopupListInitialize - - s_PopupListCancel: "[Cancel]", - s_PopupListCustom: "Custom", - - // *** - // - // s_loc_ constants accessed by SocialCalc.LocalizeString and SocialCalc.LocalizeSubstrings - // - // Used extensively by socialcalcspreadsheetcontrol.js - // - // *** - - s_loc_align_center: "Align Center", - s_loc_align_left: "Align Left", - s_loc_align_right: "Align Right", - s_loc_alignment: "Alignment", - s_loc_audit: "Audit", - s_loc_audit_trail_this_session: "Audit Trail This Session", - s_loc_auto: "Auto", - s_loc_auto_sum: "Auto Sum", - s_loc_auto_wX_commas: "Auto w/ commas", - s_loc_automatic: "Automatic", - s_loc_background: "Background", - s_loc_bold: "Bold", - s_loc_bold_XampX_italics: "Bold & Italics", - s_loc_bold_italic: "Bold Italic", - s_loc_borders: "Borders", - s_loc_borders_off: "Borders Off", - s_loc_borders_on: "Borders On", - s_loc_bottom: "Bottom", - s_loc_bottom_border: "Bottom Border", - s_loc_cell_settings: "CELL SETTINGS", - s_loc_csv_format: "CSV format", - s_loc_cancel: "Cancel", - s_loc_category: "Category", - s_loc_center: "Center", - s_loc_clear: "Clear", - s_loc_clear_socialcalc_clipboard: "Clear SocialCalc Clipboard", - s_loc_clipboard: "Clipboard", - s_loc_color: "Color", - s_loc_column_: "Column ", - s_loc_comment: "Comment", - s_loc_copy: "Copy", - s_loc_custom: "Custom", - s_loc_cut: "Cut", - s_loc_default: "Default", - s_loc_default_alignment: "Default Alignment", - s_loc_default_column_width: "Default Column Width", - s_loc_default_font: "Default Font", - s_loc_default_format: "Default Format", - s_loc_default_padding: "Default Padding", - s_loc_delete: "Delete", - s_loc_delete_column: "Delete Column", - s_loc_delete_contents: "Delete Contents", - s_loc_delete_row: "Delete Row", - s_loc_description: "Description", - s_loc_display_clipboard_in: "Display Clipboard in", - s_loc_down: "Down", - s_loc_edit: "Edit", - s_loc_existing_names: "Existing Names", - s_loc_family: "Family", - s_loc_fill_down: "Fill Down", - s_loc_fill_right: "Fill Right", - s_loc_font: "Font", - s_loc_format: "Format", - s_loc_formula: "Formula", - s_loc_function_list: "Function List", - s_loc_functions: "Functions", - s_loc_grid: "Grid", - s_loc_hidden: "Hidden", - s_loc_horizontal: "Horizontal", - s_loc_insert_column: "Insert Column", - s_loc_insert_row: "Insert Row", - s_loc_italic: "Italic", - s_loc_last_sort: "Last Sort", - s_loc_left: "Left", - s_loc_left_border: "Left Border", - s_loc_link: "Link", - s_loc_link_input_box: "Link Input Box", - s_loc_list: "List", - s_loc_load_socialcalc_clipboard_with_this: "Load SocialCalc Clipboard With This", - s_loc_major_sort: "Major Sort", - s_loc_manual: "Manual", - s_loc_merge_cells: "Merge Cells", - s_loc_middle: "Middle", - s_loc_minor_sort: "Minor Sort", - s_loc_move_insert: "Move Insert", - s_loc_move_paste: "Move Paste", - s_loc_multiXline_input_box: "Multi-line Input Box", - s_loc_name: "Name", - s_loc_names: "Names", - s_loc_no_padding: "No padding", - s_loc_normal: "Normal", - s_loc_number: "Number", - s_loc_number_horizontal: "Number Horizontal", - s_loc_ok: "OK", - s_loc_padding: "Padding", - s_loc_page_name: "Page Name", - s_loc_paste: "Paste", - s_loc_paste_formats: "Paste Formats", - s_loc_plain_text: "Plain Text", - s_loc_recalc: "Recalc", - s_loc_recalculation: "Recalculation", - s_loc_redo: "Redo", - s_loc_right: "Right", - s_loc_right_border: "Right Border", - s_loc_sheet_settings: "SHEET SETTINGS", - s_loc_save: "Save", - s_loc_save_to: "Save to", - s_loc_set_cell_contents: "Set Cell Contents", - s_loc_set_cells_to_sort: "Set Cells To Sort", - s_loc_set_value_to: "Set Value To", - s_loc_set_to_link_format: "Set to Link format", - s_loc_setXclear_move_from: "Set/Clear Move From", - s_loc_show_cell_settings: "Show Cell Settings", - s_loc_show_sheet_settings: "Show Sheet Settings", - s_loc_show_in_new_browser_window: "Show in new browser window", - s_loc_size: "Size", - s_loc_socialcalcXsave_format: "SocialCalc-save format", - s_loc_sort: "Sort", - s_loc_sort_: "Sort ", - s_loc_sort_cells: "Sort Cells", - s_loc_swap_colors: "Swap Colors", - s_loc_tabXdelimited_format: "Tab-delimited format", - s_loc_text: "Text", - s_loc_text_horizontal: "Text Horizontal", - s_loc_this_is_aXbrXsample: "This is a
    sample", - s_loc_top: "Top", - s_loc_top_border: "Top Border", - s_loc_undone_steps: "UNDONE STEPS", - s_loc_url: "URL", - s_loc_undo: "Undo", - s_loc_unmerge_cells: "Unmerge Cells", - s_loc_up: "Up", - s_loc_value: "Value", - s_loc_vertical: "Vertical", - s_loc_wikitext: "Wikitext", - s_loc_workspace: "Workspace", - s_loc_XnewX: "[New]", - s_loc_XnoneX: "[None]", - s_loc_Xselect_rangeX: "[select range]", - -// -// SocialCalc Spreadsheet Viewer module, socialcalcviewer.js: -// - - //*** SocialCalc.SpreadsheetViewer - - SVStatuslineheight: 20, // in pixels - SVStatuslineCSS: "font-size:10px;padding:3px 0px;", - -// -// SocialCalc Format Number module, formatnumber2.js: -// - - FormatNumber_separatorchar: ",", // the thousands separator character when formatting numbers for display - FormatNumber_decimalchar: ".", // the decimal separator character when formatting numbers for display - FormatNumber_defaultCurrency: "$", // the currency string used if none specified - - // The following constants are arrays of strings with the short (3 character) and full names of days and months - - s_FormatNumber_daynames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - s_FormatNumber_daynames3: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - s_FormatNumber_monthnames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", - "October", "November", "December"], - s_FormatNumber_monthnames3: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - s_FormatNumber_am: "AM", - s_FormatNumber_am1: "A", - s_FormatNumber_pm: "PM", - s_FormatNumber_pm1: "P", - -// -// SocialCalc Spreadsheet Formula module, formula1.js: -// - - s_parseerrexponent: "Improperly formed number exponent", - s_parseerrchar: "Unexpected character in formula", - s_parseerrstring: "Improperly formed string", - s_parseerrspecialvalue: "Improperly formed special value", - s_parseerrtwoops: "Error in formula (two operators inappropriately in a row)", - s_parseerrmissingopenparen: "Missing open parenthesis in list with comma(s). ", - s_parseerrcloseparennoopen: "Closing parenthesis without open parenthesis. ", - s_parseerrmissingcloseparen: "Missing close parenthesis. ", - s_parseerrmissingoperand: "Missing operand. ", - s_parseerrerrorinformula: "Error in formula.", - s_calcerrerrorvalueinformula: "Error value in formula", - s_parseerrerrorinformulabadval: "Error in formula resulting in bad value", - s_formularangeresult: "Formula results in range value:", - s_calcerrnumericnan: "Formula results in an bad numeric value", - s_calcerrnumericoverflow: "Numeric overflow", - s_sheetunavailable: "Sheet unavailable:", // when FindSheetInCache returns null - s_calcerrcellrefmissing: "Cell reference missing when expected.", - s_calcerrsheetnamemissing: "Sheet name missing when expected.", - s_circularnameref: "Circular name reference to name", - s_calcerrunknownname: "Unknown name", - s_calcerrincorrectargstofunction: "Incorrect arguments to function", - s_sheetfuncunknownfunction: "Unknown function", - s_sheetfunclnarg: "LN argument must be greater than 0", - s_sheetfunclog10arg: "LOG10 argument must be greater than 0", - s_sheetfunclogsecondarg: "LOG second argument must be numeric greater than 0", - s_sheetfunclogfirstarg: "LOG first argument must be greater than 0", - s_sheetfuncroundsecondarg: "ROUND second argument must be numeric", - s_sheetfuncddblife: "DDB life must be greater than 1", - s_sheetfuncslnlife: "SLN life must be greater than 1", - - // Function definition text - - s_fdef_ABS: 'Absolute value function. ', - s_fdef_ACOS: 'Trigonometric arccosine function. ', - s_fdef_AND: 'True if all arguments are true. ', - s_fdef_ASIN: 'Trigonometric arcsine function. ', - s_fdef_ATAN: 'Trigonometric arctan function. ', - s_fdef_ATAN2: 'Trigonometric arc tangent function (result is in radians). ', - s_fdef_AVERAGE: 'Averages the values. ', - s_fdef_CHOOSE: 'Returns the value specified by the index. The values may be ranges of cells. ', - s_fdef_COLUMNS: 'Returns the number of columns in the range. ', - s_fdef_COS: 'Trigonometric cosine function (value is in radians). ', - s_fdef_COUNT: 'Counts the number of numeric values, not blank, text, or error. ', - s_fdef_COUNTA: 'Counts the number of non-blank values. ', - s_fdef_COUNTBLANK: 'Counts the number of blank values. (Note: "" is not blank.) ', - s_fdef_COUNTIF: '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). ', - s_fdef_DATE: '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. ', - s_fdef_DAVERAGE: 'Averages the values in the specified field in records that meet the criteria. ', - s_fdef_DAY: 'Returns the day of month for a date value. ', - s_fdef_DCOUNT: 'Counts the number of numeric values, not blank, text, or error, in the specified field in records that meet the criteria. ', - s_fdef_DCOUNTA: 'Counts the number of non-blank values in the specified field in records that meet the criteria. ', - s_fdef_DDB: 'Returns the amount of depreciation at the given period of time (the default factor is 2 for double-declining balance). ', - s_fdef_DEGREES: 'Converts value in radians into degrees. ', - s_fdef_DGET: 'Returns the value of the specified field in the single record that meets the criteria. ', - s_fdef_DMAX: 'Returns the maximum of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DMIN: 'Returns the maximum of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DPRODUCT: 'Returns the result of multiplying the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DSTDEV: 'Returns the sample standard deviation of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DSTDEVP: 'Returns the standard deviation of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DSUM: 'Returns the sum of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DVAR: 'Returns the sample variance of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_DVARP: 'Returns the variance of the numeric values in the specified field in records that meet the criteria. ', - s_fdef_EVEN: 'Rounds the value up in magnitude to the nearest even integer. ', - s_fdef_EXACT: 'Returns "true" if the values are exactly the same, including case, type, etc. ', - s_fdef_EXP: 'Returns e raised to the value power. ', - s_fdef_FACT: 'Returns factorial of the value. ', - s_fdef_FALSE: 'Returns the logical value "false". ', - s_fdef_FIND: 'Returns the starting position within string2 of the first occurrence of string1 at or after "start". If start is omitted, 1 is assumed. ', - s_fdef_FV: '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). ', - s_fdef_HLOOKUP: '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. ', - s_fdef_HOUR: 'Returns the hour portion of a time or date/time value. ', - s_fdef_IF: 'Results in true-value if logical-expression is TRUE or non-zero, otherwise results in false-value. ', - s_fdef_INDEX: '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)). ', - s_fdef_INT: 'Returns the value rounded down to the nearest integer (towards -infinity). ', - s_fdef_IRR: '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%). ', - s_fdef_ISBLANK: 'Returns "true" if the value is a reference to a blank cell. ', - s_fdef_ISERR: 'Returns "true" if the value is of type "Error" but not "NA". ', - s_fdef_ISERROR: 'Returns "true" if the value is of type "Error". ', - s_fdef_ISLOGICAL: 'Returns "true" if the value is of type "Logical" (true/false). ', - s_fdef_ISNA: 'Returns "true" if the value is the error type "NA". ', - s_fdef_ISNONTEXT: 'Returns "true" if the value is not of type "Text". ', - s_fdef_ISNUMBER: 'Returns "true" if the value is of type "Number" (including logical values). ', - s_fdef_ISTEXT: 'Returns "true" if the value is of type "Text". ', - s_fdef_LEFT: 'Returns the specified number of characters from the text value. If count is omitted, 1 is assumed. ', - s_fdef_LEN: 'Returns the number of characters in the text value. ', - s_fdef_LN: 'Returns the natural logarithm of the value. ', - s_fdef_LOG: 'Returns the logarithm of the value using the specified base. ', - s_fdef_LOG10: 'Returns the base 10 logarithm of the value. ', - s_fdef_LOWER: 'Returns the text value with all uppercase characters converted to lowercase. ', - s_fdef_MATCH: '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. ', - s_fdef_MAX: 'Returns the maximum of the numeric values. ', - s_fdef_MID: 'Returns the specified number of characters from the text value starting from the specified position. ', - s_fdef_MIN: 'Returns the minimum of the numeric values. ', - s_fdef_MINUTE: 'Returns the minute portion of a time or date/time value. ', - s_fdef_MOD: 'Returns the remainder of the first value divided by the second. ', - s_fdef_MONTH: 'Returns the month part of a date value. ', - s_fdef_N: 'Returns the value if it is a numeric value otherwise an error. ', - s_fdef_NA: 'Returns the #N/A error value which propagates through most operations. ', - s_fdef_NOT: 'Returns FALSE if value is true, and TRUE if it is false. ', - s_fdef_NOW: 'Returns the current date/time. ', - s_fdef_NPER: '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. ', - s_fdef_NPV: '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. ', - s_fdef_ODD: 'Rounds the value up in magnitude to the nearest odd integer. ', - s_fdef_OR: 'True if any argument is true ', - s_fdef_PI: 'The value 3.1415926... ', - s_fdef_PMT: '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). ', - s_fdef_POWER: 'Returns the first value raised to the second value power. ', - s_fdef_PRODUCT: 'Returns the result of multiplying the numeric values. ', - s_fdef_PROPER: 'Returns the text value with the first letter of each word converted to uppercase and the others to lowercase. ', - s_fdef_PV: '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). ', - s_fdef_RADIANS: 'Converts value in degrees into radians. ', - s_fdef_RATE: '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%). ', - s_fdef_REPLACE: 'Returns text1 with the specified number of characters starting from the specified position replaced by text2. ', - s_fdef_REPT: 'Returns the text repeated the specified number of times. ', - s_fdef_RIGHT: 'Returns the specified number of characters from the text value starting from the end. If count is omitted, 1 is assumed. ', - s_fdef_ROUND: '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). ', - s_fdef_ROWS: 'Returns the number of rows in the range. ', - s_fdef_SECOND: 'Returns the second portion of a time or date/time value (truncated to an integer). ', - s_fdef_SIN: 'Trigonometric sine function (value is in radians) ', - s_fdef_SLN: 'Returns the amount of depreciation at each period of time using the straight-line method. ', - s_fdef_SQRT: 'Square root of the value ', - s_fdef_STDEV: 'Returns the sample standard deviation of the numeric values. ', - s_fdef_STDEVP: 'Returns the standard deviation of the numeric values. ', - s_fdef_SUBSTITUTE: 'Returns text1 with the all occurrences of oldtext replaced by newtext. If "occurrence" is present, then only that occurrence is replaced. ', - s_fdef_SUM: 'Adds the numeric values. The values to the sum function may be ranges in the form similar to A1:B5. ', - s_fdef_SUMIF: '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. ', - s_fdef_SYD: 'Depreciation by Sum of Year\'s Digits method. ', - s_fdef_T: 'Returns the text value or else a null string. ', - s_fdef_TAN: 'Trigonometric tangent function (value is in radians) ', - s_fdef_TIME: 'Returns the time value given the specified hour, minute, and second. ', - s_fdef_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. ', - s_fdef_TRIM: 'Returns the text value with leading, trailing, and repeated spaces removed. ', - s_fdef_TRUE: 'Returns the logical value "true". ', - s_fdef_TRUNC: 'Truncates the value to the specified number of decimal places. If precision is negative, truncate to powers of 10. ', - s_fdef_UPPER: 'Returns the text value with all lowercase characters converted to uppercase. ', - s_fdef_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. ', - s_fdef_VAR: 'Returns the sample variance of the numeric values. ', - s_fdef_VARP: 'Returns the variance of the numeric values. ', - s_fdef_VLOOKUP: '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. ', - s_fdef_WEEKDAY: '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. ', - s_fdef_YEAR: 'Returns the year part of a date value. ', - - s_farg_v: "value", - s_farg_vn: "value1, value2, ...", - s_farg_xy: "valueX, valueY", - s_farg_choose: "index, value1, value2, ...", - s_farg_range: "range", - s_farg_rangec: "range, criteria", - s_farg_date: "year, month, day", - s_farg_dfunc: "databaserange, fieldname, criteriarange", - s_farg_ddb: "cost, salvage, lifetime, period [, factor]", - s_farg_find: "string1, string2 [, start]", - s_farg_fv: "rate, n, payment, [pv, [paytype]]", - s_farg_hlookup: "value, range, row, [rangelookup]", - s_farg_iffunc: "logical-expression, true-value, false-value", - s_farg_index: "range, rownum, colnum", - s_farg_irr: "range, [guess]", - s_farg_tc: "text, count", - s_farg_log: "value, base", - s_farg_match: "value, range, [rangelookup]", - s_farg_mid: "text, start, length", - s_farg_nper: "rate, payment, pv, [fv, [paytype]]", - s_farg_npv: "rate, value1, value2, ...", - s_farg_pmt: "rate, n, pv, [fv, [paytype]]", - s_farg_pv: "rate, n, payment, [fv, [paytype]]", - s_farg_rate: "n, payment, pv, [fv, [paytype, [guess]]]", - s_farg_replace: "text1, start, length, text2", - s_farg_vp: "value, [precision]", - s_farg_valpre: "value, precision", - s_farg_csl: "cost, salvage, lifetime", - s_farg_cslp: "cost, salvage, lifetime, period", - s_farg_subs: "text1, oldtext, newtext [, occurrence]", - s_farg_sumif: "range1, criteria [, range2]", - s_farg_hms: "hour, minute, second", - s_farg_txt: "text", - s_farg_vlookup: "value, range, col, [rangelookup]", - s_farg_weekday: "date, [type]", - s_farg_dt: "date", - - function_classlist: ["all", "stat", "lookup", "datetime", "financial", "test", "math", "text"], // order of function classes - - s_fclass_all: "All", - s_fclass_stat: "Statistics", - s_fclass_lookup: "Lookup", - s_fclass_datetime: "Date & Time", - s_fclass_financial: "Financial", - s_fclass_test: "Test", - s_fclass_math: "Math", - s_fclass_text: "Text", - - lastone: null - - }; - -// Default classnames for use with SocialCalc.ConstantsSetClasses: - -SocialCalc.ConstantsDefaultClasses = { - defaultComment: "", - defaultCommentNoGrid: "", - defaultHighlightTypeCursor: "", - defaultHighlightTypeRange: "", - defaultColname: "", - defaultSelectedColname: "", - defaultRowname: "", - defaultSelectedRowname: "", - defaultUpperLeft: "", - defaultSkippedCell: "", - defaultPaneDivider: "", - cteGriddiv: "", // this one has no Style version with it - defaultInputEcho: {classname: "", style: "filter:alpha(opacity=90);opacity:.9;"}, // so FireFox won't show warning - TCmain: "", - TCendcap: "", - TCpaneslider: "", - TClessbutton: "", - TCmorebutton: "", - TCscrollarea: "", - TCthumb: "", - TCPStrackingline: "", - TCTDFSthumbstatus: "", - TDpopupElement: "" - }; - -// -// SocialCalc.ConstantsSetClasses(prefix) -// -// This routine goes through all of the xyzClass/xyzStyle pairs and sets the Class to a default and -// turns off the Style, if present. The prefix is put before each default. -// The list of items to set is in SocialCalc.ConstantsDefaultClasses. The names there -// correspond to the "xyz" parts. If there is a value, it is the default to set. If the -// default is a null, no change is made. If the default is the null string (""), the -// name of the item is used (e.g., "defaultComment" would use the classname "defaultComment"). -// If the default is an object, then it expects {classname: classname, style: stylestring} - this -// lets you combine both. -// - -SocialCalc.ConstantsSetClasses = function(prefix) { - - var defaults = SocialCalc.ConstantsDefaultClasses; - var scc = SocialCalc.Constants; - var item; - - prefix = prefix || ""; - - for (item in defaults) { - if (typeof defaults[item] == "string") { - scc[item+"Class"] = prefix + (defaults[item] || item); - if (scc[item+"Style"] !== undefined) { - scc[item+"Style"] = ""; - } - } - else if (typeof defaults[item] == "object") { - scc[item+"Class"] = prefix + (defaults[item].classname || item); - scc[item+"Style"] = defaults[item].style; - } - } - } - diff --git a/Website/static/runappios43c/lib/aspiring/socialcalcpopup.js b/Website/static/runappios43c/lib/aspiring/socialcalcpopup.js deleted file mode 100755 index a19e4da..0000000 --- a/Website/static/runappios43c/lib/aspiring/socialcalcpopup.js +++ /dev/null @@ -1,1618 +0,0 @@ -// -/* -// The module of the SocialCalc package for the optional popup menus in socialcalcspreadsheetcontrol.js -// -// (c) Copyright 2009 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// -*/ - - var SocialCalc; // All values are stored in the master SocialCalc object - if (!SocialCalc) { - SocialCalc = {}; - } - - // The main Popup data -- there is only one set - - SocialCalc.Popup = {}; - - // Routines and values for each type of control, indexed by type name - // The value for each is an object constructed as follows: - // - // Create = function(type, id, attribs) - // Initialize = function(type, id, data) - // SetValue = function(type, id, value) - // GetValue = function(type, id) returns value - // SetDisabled = function(type, id, t/f) - // Show = function(type, id) - // Hide = function(type, id) - // Cancel = function(type, id) - // Reset = function(type) - // - // data = object to hold type-specific data - // - - SocialCalc.Popup.Types = {}; - - // Definitions for each individual control, indexed by id - // The value for each is an object constructed as follows: - // - // type: type name of the control - // value: current value of the control (usually a string, but can depend on type) - // data: object with type-specific items - // - - SocialCalc.Popup.Controls = {}; - - // System-wide values of currently active control - // - // id: id of current control or null - // - - SocialCalc.Popup.Current = {}; - - // Other values used by the Popup system - // - - SocialCalc.Popup.imagePrefix = "images/sc-"; // image prefix - - // Override this for localization - - SocialCalc.Popup.LocalizeString = function(str) {return str;}; - - -// * * * * * * * * * * * * * * * * -// -// GENERAL ROUTINES -// -// * * * * * * * * * * * * * * * * - -// -// SocialCalc.Popup.Create(type, id, attribs) -// -// Creates a control of type "type" as the children of document element "id" using "attribs" -// - -SocialCalc.Popup.Create = function(type, id, attribs) { - - var pt = SocialCalc.Popup.Types[type]; - if (pt && pt.Create) { - pt.Create(type, id, attribs); - } - - } - - -// -// SocialCalc.Popup.SetValue(id, value) -// -// Sets the value of control. -// - -SocialCalc.Popup.SetValue = function(id, value) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - var pt = spt[type]; - var spcdata = spc[id].data; - - if (pt && pt.Create) { - pt.SetValue(type, id, value); - if (spcdata.attribs && spcdata.attribs.changedcallback) { - spcdata.attribs.changedcallback(spcdata.attribs, id, value); - } - } - - } - - -// -// SocialCalc.Popup.SetDisabled(id, disabled) -// -// Sets whether the control is disabled (true) or not (false). -// - -SocialCalc.Popup.SetDisabled = function(id, disabled) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - if (sp.Current.id && id == sp.Current.id) { - pt.Hide(type, sp.Current.id); - sp.Current.id = null; - } - pt.SetDisabled(type, id, disabled); - } - - } - - -// -// SocialCalc.Popup.GetValue(id) -// -// Returns the value of control. -// - -SocialCalc.Popup.GetValue = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - return pt.GetValue(type, id); - } - - return null; - - } - - -// -// SocialCalc.Popup.Initialize(id, data) -// -// Gives "data" to the appropriate initialization code. -// - -SocialCalc.Popup.Initialize = function(id, data) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Initialize) { - pt.Initialize(type, id, data); - } - - } - - -// -// SocialCalc.Popup.Reset(type) -// -// Resets Popup, such as when turning to page. -// - -SocialCalc.Popup.Reset = function(type) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (spt[type].Reset) spt[type].Reset(type); - - } - - -// -// SocialCalc.Popup.CClick(id) -// -// Should be called when the user clicks on a control to do the popup -// - -SocialCalc.Popup.CClick = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - if (spc[id].data && spc[id].data.disabled) return; - - var type = spc[id].type; - - var pt = spt[type]; - - if (sp.Current.id) { - spt[spc[sp.Current.id].type].Hide(type, sp.Current.id); - if (id == sp.Current.id) { // same one - done - sp.Current.id = null; - return; - } - } - - if (pt && pt.Show) { - pt.Show(type, id); - } - - sp.Current.id = id; - - } - - -// -// SocialCalc.Popup.Close() -// -// Used to close any open popup. -// - -SocialCalc.Popup.Close = function() { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - sp.CClick(sp.Current.id); - - } - -// -// SocialCalc.Popup.Cancel() -// -// Closes Popup and restores old value -// - -SocialCalc.Popup.Cancel = function() { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - var type = spc[sp.Current.id].type; - - var pt = spt[type]; - - pt.Cancel(type, sp.Current.id); - - sp.Current.id = null; - - } - -// -// ele = SocialCalc.Popup.CreatePopupDiv(id, attribs) -// -// Utility function to create the main popup div of width attribs.width. -// If attribs.title, create one with that text, and optionally attribs.moveable. -// - -SocialCalc.Popup.CreatePopupDiv = function(id, attribs) { - - var pos, ele; - - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = document.createElement("div"); - main.style.position = "absolute"; - - pos = SocialCalc.GetElementPositionWithScroll(spcdata.mainele); - - main.style.top = (pos.top+spcdata.mainele.offsetHeight)+"px"; - main.style.left = (pos.left)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - if (attribs.width) { - main.style.width = attribs.width; - } - - spcdata.mainele.appendChild(main); - - if (attribs.title) { - main.innerHTML = ''+ - ''+ - '
    '+attribs.title+' X 
    '; - - if (attribs.moveable) { - spcdata.dragregistered = main.firstChild.firstChild.firstChild.firstChild; - SocialCalc.DragRegister(spcdata.dragregistered, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - } - } - - return main; - - } - -// -// SocialCalc.Popup.EnsurePosition(id, container) -// -// Utility function to make sure popup is positioned completely within container (both element objects) -// and appropriate with respect to the main element controlling the popup. -// - -SocialCalc.Popup.EnsurePosition = function(id, container) { - - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = spcdata.mainele.firstChild; - if (!main) {alert("No main popup element firstChild.");return}; - var popup = spcdata.popupele; - - function GetLayoutValues(ele) { - var r = SocialCalc.GetElementPositionWithScroll(ele); - r.height = ele.offsetHeight; - r.width = ele.offsetWidth; - r.bottom = r.top+r.height; - r.right = r.left+r.width; - return r; - } - - var p = GetLayoutValues(popup); - var c = GetLayoutValues(container); - var m = GetLayoutValues(main); - var t = 0; // type of placement -//addmsg("popup t/r/b/l/h/w= "+p.top+"/"+p.right+"/"+p.bottom+"/"+p.left+"/"+p.height+"/"+p.width); -//addmsg("container t/r/b/l/h/w= "+c.top+"/"+c.right+"/"+c.bottom+"/"+c.left+"/"+c.height+"/"+c.width); -//addmsg("main t/r/b/l/h/w= "+m.top+"/"+m.right+"/"+m.bottom+"/"+m.left+"/"+m.height+"/"+m.width); - - // Check various layout cases in priority order - - if (m.bottom+p.height < c.bottom && m.left+p.width < c.right) { // normal case: room on bottom and right - popup.style.top = m.bottom + "px"; - popup.style.left = m.left + "px"; - t = 1; - } - - else if (m.top-p.height > c.top && m.left+p.width < c.right) { // room on top and right - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = m.left + "px"; - t = 2; - } - - else if (m.bottom+p.height < c.bottom && m.right-p.width > c.left) { // room on bottom and left - popup.style.top = m.bottom + "px"; - popup.style.left = (m.right-p.width) + "px"; - t = 3; - } - - else if (m.top-p.height > c.top && m.right-p.width > c.left) { // room on top and left - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = (m.right-p.width) + "px"; - t = 4; - } - - else if (m.bottom+p.height < c.bottom && p.width < c.width) { // room on bottom and middle - popup.style.top = m.bottom + "px"; - popup.style.left = (c.left+Math.floor((c.width-p.width)/2)) + "px"; - t = 5; - } - - else if (m.top-p.height > c.top && p.width < c.width) { // room on top and middle - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = (c.left+Math.floor((c.width-p.width)/2)) + "px"; - t = 6; - } - - else if (p.height < c.height && m.right+p.width < c.right) { // room on middle and right - popup.style.top = (c.top+Math.floor((c.height-p.height)/2)) + "px"; - popup.style.left = m.right + "px"; - t = 7; - } - - else if (p.height < c.height && m.left-p.width > c.left) { // room on middle and left - popup.style.top = (c.top+Math.floor((c.height-p.height)/2)) + "px"; - popup.style.left = (m.left-p.width) + "px"; - t = 8; - } - - else { // nothing works, so leave as it is - } -//addmsg("Popup layout "+t); - -} - -// -// ele = SocialCalc.Popup.DestroyPopupDiv(ele, dragregistered) -// -// Utility function to get rid of the main popup div. -// - -SocialCalc.Popup.DestroyPopupDiv = function(ele, dragregistered) { - - if (!ele) return; - - ele.innerHTML = ""; - - SocialCalc.DragUnregister(dragregistered); // OK to do this even if not registered - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - } - -// -// Color Utility Functions -// - -SocialCalc.Popup.RGBToHex = function(val) { - - var sp = SocialCalc.Popup; - - if (val=="") { - return "000000"; - } - var rgbvals = val.match(/(\d+)\D+(\d+)\D+(\d+)/); - if (rgbvals) { - return sp.ToHex(rgbvals[1])+sp.ToHex(rgbvals[2])+sp.ToHex(rgbvals[3]); - } - else { - return "000000"; - } - } - -SocialCalc.Popup.HexDigits="0123456789ABCDEF"; - -SocialCalc.Popup.ToHex = function(num) { - var sp = SocialCalc.Popup; - var first=Math.floor(num / 16); - var second=num % 16; - return sp.HexDigits.charAt(first)+sp.HexDigits.charAt(second); - } - -SocialCalc.Popup.FromHex = function(str) { - - var sp = SocialCalc.Popup; - var first = sp.HexDigits.indexOf(str.charAt(0).toUpperCase()); - var second = sp.HexDigits.indexOf(str.charAt(1).toUpperCase()); - return ((first>=0)?first:0)*16+((second>=0)?second:0); - } - -SocialCalc.Popup.HexToRGB = function(val) { - - var sp = SocialCalc.Popup; - - return "rgb("+sp.FromHex(val.substring(1,3))+","+sp.FromHex(val.substring(3,5))+","+sp.FromHex(val.substring(5,7))+")"; - - } - -SocialCalc.Popup.makeRGB = function(r, g, b) { - return "rgb("+(r>0?r:0)+","+(g>0?g:0)+","+(b>0?b:0)+")"; - } - -SocialCalc.Popup.splitRGB = function(rgb) { - var parts = rgb.match(/(\d+)\D+(\d+)\D+(\d+)\D/); - if (!parts) { - return {r:0, g:0, b:0}; - } - else { - return {r: parts[1]-0, g: parts[2]-0, b: parts[3]-0}; - } - } - -// * * * * * * * * * * * * * * * * -// -// ROUTINES FOR EACH TYPE -// -// * * * * * * * * * * * * * * * * - -// -// List -// -// type: List -// value: value of control, -// display: "value to display", -// custom: true if custom value, -// disabled: t/f, -// attribs: { -// title: "popup title string", -// moveable: t/f, -// width: optional width, e.g., "100px", -// ensureWithin: optional element object to ensure popup fits within if possible -// changedcallback: optional function(attribs, id, newvalue), -// ... -// } -// data: { -// ncols: calculated number of columns -// options: [ -// {o: option-name, v: value-to-return, -// a: {option attribs} // optional: {skip: true, custom: true, cancel: true, newcol: true} -// }, -// ...] -// } -// -// popupele: gets popup element object when created -// contentele: gets element created with all the content -// listdiv: gets div with list of items -// customele: gets input element with custom value -// dragregistered: gets element, if any, registered as draggable -// - -SocialCalc.Popup.Types.List = {}; - -SocialCalc.Popup.Types.List.Create = function(type, id, attribs) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - var spcid = {type: type, value: "", display: "", data: {}}; - if (spc[id]) { return;} - spc[id] = spcid; - var spcdata = spcid.data; - - spcdata.attribs = attribs || {}; - - var ele = document.getElementById(id); - if (!ele) {alert("Missing element "+id); return;} - - spcdata.mainele = ele; - - ele.innerHTML = ''; - - spcdata.options = []; // set to nothing - use Initialize to fill - - } - -SocialCalc.Popup.Types.List.SetValue = function(type, id, value) { - - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - spcdata.value = value; - spcdata.custom = false; - - for (i=0; i'; - - spcdata.customele = ele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = ele; - } - else { - str = SocialCalc.Popup.Types.List.MakeList(type, id); - - ele = document.createElement("div"); - ele.innerHTML = '
    '+str+'
    '; - - spcdata.customele = null; - spcdata.listdiv = ele.firstChild; - spcdata.contentele = ele; - } - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = true; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - -SocialCalc.Popup.Types.List.MakeList = function(type, id) { - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data - - var str = ''; - var td = '
    '; - - str += td; - - spcdata.ncols = 1; - - for (i=0; i'+td; - spcdata.ncols += 1; - continue; - } - if (o.a.skip) { - str += '
    '+o.o+'
    '; - continue; - } - } - if (o.v == spcdata.value && !(o.a && (o.a.custom || o.a.cancel))) { // matches value - bg = "background-color:#DDF;"; - } - else { - bg = ""; - } - str += '
    '+o.o+'
    '; - } - - str += "
    "; - - return str; - - } - - -SocialCalc.Popup.Types.List.MakeCustom = function(type, id) { - - var SPLoc = SocialCalc.Popup.LocalizeString; - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - var val = spcdata.value; - val = SocialCalc.special_chars(val); - - str = '

    '+ - '

    '+ - ''+ - ''+ - ''+ - '
    '; - - return str; - - } - - -SocialCalc.Popup.Types.List.ItemClicked = function(id, num) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var a = spcdata.options[num].a; - - if (a && a.custom) { - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeCustom("List", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = nele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - return; - } - - if (a && a.cancel) { - SocialCalc.Popup.Close(); - return; - } - - SocialCalc.Popup.SetValue(id, spcdata.options[num].v); - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.List.CustomToList = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeList("List", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = null; - spcdata.listdiv = nele.firstChild; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - } - - -SocialCalc.Popup.Types.List.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.customele.value); - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.List.MouseMove = function(id, ele) { - - var col, i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var list = spcdata.listdiv; - - if (!list) return; - - var rowele = list.firstChild.firstChild.firstChild; // div.table.tbody.tr - - for (col=0; col '; - - } - -SocialCalc.Popup.Types.ColorChooser.SetValue = function(type, id, value) { - - var i, img, pos; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.value = value; - spcdata.custom = false; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (spcdata.value) { - spcdata.mainele.firstChild.style.backgroundColor = spcdata.value; - if (spca.backgroundImage) { - img = "url("+sp.imagePrefix+spca.backgroundImage+")"; - } - else { - img = ""; - } - pos = "center center"; - } - else { - spcdata.mainele.firstChild.style.backgroundColor = "#FFF"; - if (spca.backgroundImageDefault) { - img = "url("+sp.imagePrefix+spca.backgroundImageDefault+")"; - pos = "center center"; - } - else { - img = "url("+sp.imagePrefix+"defaultcolor.gif)"; - pos = "left top"; - } - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } - - } - - -SocialCalc.Popup.Types.ColorChooser.SetDisabled = function(type, id, disabled) { - - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.disabled = disabled; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (disabled) { - spcdata.mainele.firstChild.style.backgroundColor = "#DDD"; - if (spca.backgroundImageDisabled) { - img = "url("+sp.imagePrefix+spca.backgroundImageDisabled+")"; - pos = "center center"; - } - else { - img = "url("+sp.imagePrefix+"defaultcolor.gif)"; - pos = "left top"; - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } - else { - sp.SetValue(id, spcdata.value); - } - } - - } - - -SocialCalc.Popup.Types.ColorChooser.GetValue = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - return spcdata.value; - - } - - -SocialCalc.Popup.Types.ColorChooser.Initialize = function(type, id, data) { - - var a; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - for (a in data.attribs) { - spcdata.attribs[a] = data.attribs[a]; - } - - if (data.value) { // if has a value, set to it - sp.SetValue(id, data.value); - } - - } - - -SocialCalc.Popup.Types.ColorChooser.Reset = function(type) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (sp.Current.id && spc[sp.Current.id].type == type) { // we have a popup - spt[type].Hide(type, sp.Current.id); - sp.Current.id = null; - } - - } - - -SocialCalc.Popup.Types.ColorChooser.Show = function(type, id) { - - var i, ele, mainele; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data - - var str = ""; - - spcdata.oldvalue = spcdata.value; // remember starting value - - spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs); - - if (spcdata.custom) { - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom(type, id); - - ele = document.createElement("div"); - ele.innerHTML = '
    '+str+'
    '; - - spcdata.customele = ele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = ele; - } - else { - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid(type, id); - - ele = document.createElement("div"); - ele.style.padding = "3px"; - ele.style.backgroundColor = "#CCC"; - ele.appendChild(mainele); - - spcdata.customele = null; - spcdata.contentele = ele; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - -SocialCalc.Popup.Types.ColorChooser.MakeCustom = function(type, id) { - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var SPLoc = sp.LocalizeString; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - str = '

    '+ - '#

    '+ - ''+ - ''+ - '
    '; - - return str; - - } - - -SocialCalc.Popup.Types.ColorChooser.ItemClicked = function(id, num) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.ColorChooser.CustomToList = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - } - - -SocialCalc.Popup.Types.ColorChooser.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.customele.value); - - sp.Close(); - - } - - -SocialCalc.Popup.Types.ColorChooser.Hide = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered); - spcdata.popupele = null; - - } - - -SocialCalc.Popup.Types.ColorChooser.Cancel = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.oldvalue); // reset to old value - - SocialCalc.Popup.Types.ColorChooser.Hide(type, id); - - } - - -SocialCalc.Popup.Types.ColorChooser.CreateGrid = function (type, id) { - - var ele, pos, row, rowele, col, g; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var SPLoc = sp.LocalizeString; - var spcdata = spc[id].data; - spcdata.grid = {}; - var grid = spcdata.grid; - - var mainele = document.createElement("div"); - - ele = document.createElement("table"); - ele.cellSpacing = 0; - ele.cellPadding = 0; - ele.style.width = "100px"; - grid.table = ele; - - ele = document.createElement("tbody"); - grid.table.appendChild(ele); - grid.tbody = ele; - - for (row=0; row<16; row++) { - rowele = document.createElement("tr"); - for (col=0; col<5; col++) { - g = {}; - grid[row+","+col] = g; - ele = document.createElement("td"); - ele.style.fontSize = "1px"; - ele.innerHTML = " "; - ele.style.height = "10px"; - if (col<=1) { - ele.style.width = "17px"; - ele.style.borderRight = "3px solid white"; - } - else { - ele.style.width = "20px"; - ele.style.backgroundRepeat = "no-repeat"; - } - rowele.appendChild(ele); - g.ele = ele; - } - grid.tbody.appendChild(rowele); - } - mainele.appendChild(grid.table); - - ele = document.createElement("div"); - ele.style.marginTop = "3px"; - ele.innerHTML = ''+ - ''+ - ''+ - ''+ - '
     #'+SPLoc("OK")+'
    '; - grid.defaultbox = ele.firstChild.firstChild.firstChild.childNodes[0]; - grid.defaultbox.onclick = spt.ColorChooser.DefaultClicked; - grid.custom = ele.firstChild.firstChild.firstChild.childNodes[1]; - grid.custom.onclick = spt.ColorChooser.CustomClicked; - grid.msg = ele.firstChild.firstChild.firstChild.childNodes[2]; - grid.msg.onclick = spt.ColorChooser.CloseOK; - mainele.appendChild(ele); - - grid.table.onmousedown = spt.ColorChooser.GridMouseDown; - - spt.ColorChooser.DetermineColors(id); - spt.ColorChooser.SetColors(id); - - return mainele; - - } - -SocialCalc.Popup.Types.ColorChooser.gridToG = function(grid, row, col) { - - return grid[row+","+col]; - - } - -SocialCalc.Popup.Types.ColorChooser.DetermineColors = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - var col, row; - var rgb = sp.splitRGB(spcdata.value); - var color; - - col = 2; - row = 16-Math.floor((rgb.r+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(17*(15-row),0,0); - } - - col = 3; - row = 16-Math.floor((rgb.g+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(0,17*(15-row),0); - } - - col = 4; - row = 16-Math.floor((rgb.b+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(0,0,17*(15-row)); - } - - col = 1; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(17*(15-row),17*(15-row),17*(15-row)); - } - - col = 0; - var steps = [0, 68, 153, 204, 255]; - var commonrgb = ["400", "310", "420", "440", "442", "340", "040", "042", "032", "044", "024", "004", "204", "314", "402", "414"]; - var x; - for (row=0; row<16; row++) { - x = commonrgb[row]; - sptc.gridToG(grid,row,col).rgb = "rgb("+steps[x.charAt(0)-0]+","+steps[x.charAt(1)-0]+","+steps[x.charAt(2)-0]+")"; - } - - } - -SocialCalc.Popup.Types.ColorChooser.SetColors = function(id) { - - var row, col, g, ele, rgb; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - for (row=0; row<16; row++) { - for (col=0; col<5; col++) { - g = sptc.gridToG(grid,row, col); - g.ele.style.backgroundColor = g.rgb; - g.ele.title = sp.RGBToHex(g.rgb); - if (grid["selectedrow"+col]==row) { - g.ele.style.backgroundImage = "url("+sp.imagePrefix+"chooserarrow.gif)"; - } - else { - g.ele.style.backgroundImage = ""; - } - } - } - - sp.SetValue(id, spcdata.value); - - grid.msg.style.backgroundColor = spcdata.value; - rgb = sp.splitRGB(spcdata.value || "rgb(255,255,255)"); - if (rgb.r+rgb.g+rgb.b < 220) { - grid.msg.style.color = "#FFF"; - } - else { - grid.msg.style.color = "#000"; - } - if (!spcdata.value) { // default - grid.msg.style.backgroundColor = "#FFF"; - grid.msg.style.backgroundImage = "url("+sp.imagePrefix+"defaultcolor.gif)"; - grid.msg.title = "Default"; - } - else { - grid.msg.style.backgroundImage = ""; - grid.msg.title = sp.RGBToHex(spcdata.value); - } - - } - -SocialCalc.Popup.Types.ColorChooser.GridMouseDown = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - var grid = spcdata.grid; - - switch (event.type) { - case "mousedown": - grid.mousedown = true; - break; - case "mouseup": - grid.mousedown = false; - break; - case "mousemove": - if (!grid.mousedown) { - return; - } - break; - } - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - var gpos = SocialCalc.GetElementPosition(grid.table); - var row = Math.floor((clientY-gpos.top-2)/10); // -2 is to split the diff btw IE & FF - row = row < 0 ? 0 : row; - var col = Math.floor((clientX-gpos.left)/20); - row = row < 0 ? 0 : (row > 15 ? 15 : row); - col = col < 0 ? 0 : (col > 4 ? 4 : col); - var color = sptc.gridToG(grid,row,col).ele.style.backgroundColor; - var newrgb = sp.splitRGB(color); - var oldrgb = sp.splitRGB(spcdata.value); - - switch (col) { - case 2: - spcdata.value = sp.makeRGB(newrgb.r, oldrgb.g, oldrgb.b); - break; - case 3: - spcdata.value = sp.makeRGB(oldrgb.r, newrgb.g, oldrgb.b); - break; - case 4: - spcdata.value = sp.makeRGB(oldrgb.r, oldrgb.g, newrgb.b); - break; - case 0: - case 1: - spcdata.value = color; - } - - sptc.DetermineColors(id); - sptc.SetColors(id); - - } - - -SocialCalc.Popup.Types.ColorChooser.ControlClicked = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var cid = sp.Current.id; - if (!cid || id != cid) { - sp.CClick(id); - return; - } - - sptc.CloseOK(); - - } - -SocialCalc.Popup.Types.ColorChooser.DefaultClicked = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - spcdata.value = ""; - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - - } - -SocialCalc.Popup.Types.ColorChooser.CustomClicked = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - var oele, str, nele; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom("ColorChooser", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = nele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - spcdata.customele.value = sp.RGBToHex(spcdata.value); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - - -SocialCalc.Popup.Types.ColorChooser.CustomToGrid = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#"+spcdata.customele.value)); - - var oele, mainele, nele; - - oele = spcdata.contentele; - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid("ColorChooser", id); - nele = document.createElement("div"); - nele.style.padding = "3px"; - nele.style.backgroundColor = "#CCC"; - nele.appendChild(mainele); - spcdata.customele = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - } - - -SocialCalc.Popup.Types.ColorChooser.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#"+spcdata.customele.value)); - - SocialCalc.Popup.Close(); - - } - -SocialCalc.Popup.Types.ColorChooser.CloseOK = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - - } - diff --git a/Website/static/runappios43c/lib/aspiring/socialcalcspreadsheetcontrol.js b/Website/static/runappios43c/lib/aspiring/socialcalcspreadsheetcontrol.js deleted file mode 100755 index 2e1f77d..0000000 --- a/Website/static/runappios43c/lib/aspiring/socialcalcspreadsheetcontrol.js +++ /dev/null @@ -1,3687 +0,0 @@ -// -// SocialCalcSpreadsheetControl -// -/* -// The code module of the SocialCalc package that lets you embed a spreadsheet -// control with toolbar, etc., into a web page. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript SpreadsheetControl. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the SpreadsheetControl is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/ - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); - } - -// ************************************* -// -// SpreadsheetControl class: -// -// ************************************* - -// Global constants: - - SocialCalc.CurrentSpreadsheetControlObject = null; // right now there can only be one active at a time - - -// Constructor: - -SocialCalc.SpreadsheetControl = function() { - - var scc = SocialCalc.Constants; - - // Properties: - - this.parentNode = null; - this.spreadsheetDiv = null; - this.requestedHeight = 0; - this.requestedWidth = 0; - this.requestedSpaceBelow = 0; - this.height = 0; - this.width = 0; - this.viewheight = 0; // calculated amount for views below toolbar, etc. - - // Tab definitions: An array where each tab is an object of the form: - // - // name: "name", - // text: "text-on-tab", - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext - // Other replacements from spreadsheet.tabreplacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // view: "viewname", // view to show when selected; "sheet" or missing/null is spreadsheet - // oncreate: function(spreadsheet, tab-name), // called when first created to initialize - // onclick: function(spreadsheet, tab-name), missing/null is sheet default - // onclickFocus: text, // spreadsheet.idPrefix+text is given the focus if present instead of normal KeyboardFocus - // or if text isn't a string, that value (e.g., true) is used for SocialCalc.CmdGotFocus - // onunclick: function(spreadsheet, tab-name), missing/null is sheet default - - this.tabs = []; - this.tabnums = {}; // when adding tabs, add tab-name: array-index to this object - this.tabreplacements = {}; // see use above - this.currentTab = -1; // currently selected tab index in this.tabs or -1 (maintained by SocialCalc.SetTab) - - // View definitions: An object where each view is an object of the form: - // - // name: "name", // localized when first set using SocialCalc.LocalizeString - // element: node-in-the-dom, // filled in when initialized - // replacements: {}, // see below - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext, "%img.": spreadsheet.imagePrefix, - // SocialCalc.LocalizeSubstring replacements ("%loc!string!" and "%ssc!constant-name!") - // Other replacements from viewobject.replacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // divStyle: attributes for sheet div (SocialCalc.setStyles format) - // oncreate: function(spreadsheet, viewobject), // called when first created to initialize - // needsresize: true/false/null, // if true, do resize calc after displaying - // onresize: function(spreadsheet, viewobject), // called if needs resize - // values: {} // optional values to share with onclick handlers, etc. - // - // There is always a "sheet" view. - - this.views = {}; // {viewname: view-object, ...} - - // Dynamic properties: - - this.sheet = null; - this.context = null; - this.editor = null; - - this.spreadsheetDiv = null; - this.editorDiv = null; - - this.sortrange = ""; // remembered range for sort tab - - this.moverange = ""; // remembered range from movefrom used by movepaste/moveinsert - - // Constants: - - this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-" - this.multipartBoundary = "SocialCalcSpreadsheetControlSave"; // boundary used by SpreadsheetControlCreateSpreadsheetSave - this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src - - this.toolbarbackground = scc.SCToolbarbackground; - this.tabbackground = scc.SCTabbackground; // "background-color:#CCC;"; - this.tabselectedCSS = scc.SCTabselectedCSS; - this.tabplainCSS = scc.SCTabplainCSS; - this.toolbartext = scc.SCToolbartext; - - this.formulabarheight = scc.SCFormulabarheight; // in pixels, will contain a text input box - - - if (scc.doWorkBook) { - this.sheetbarheight = scc.SCSheetBarHeight; - this.sheetbarCSS = scc.SCSheetBarCSS; - } else { - this.sheetbarheight = 0; - } - - - this.statuslineheight = scc.SCStatuslineheight; // in pixels - this.statuslineCSS = scc.SCStatuslineCSS; - - // Callbacks: - - this.ExportCallback = null; // a function called for Clipboard Export button: this.ExportCallback(spreadsheet_control_object) - - // Initialization Code: - - this.sheet = new SocialCalc.Sheet(); - this.context = new SocialCalc.RenderContext(this.sheet); - this.context.showGrid=true; - this.context.showRCHeaders=true; - this.editor = new SocialCalc.TableEditor(this.context); - this.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetControlStatuslineCallback, - params: {statuslineid: this.idPrefix+"statusline", - recalcid1: this.idPrefix+"divider_recalc", - recalcid2: this.idPrefix+"button_recalc"}}; - - SocialCalc.CurrentSpreadsheetControlObject = this; // remember this for rendezvousing on events - - this.editor.MoveECellCallback.movefrom = function(editor) { - var cr; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - spreadsheet.context.cursorsuffix = ""; - if (editor.range2.hasrange && !editor.cellhandles.noCursorSuffix) { - if (editor.ecell.row==editor.range2.top && (editor.ecell.coleditor.range2.right+1)) { - spreadsheet.context.cursorsuffix = "insertleft"; - } - if (editor.ecell.col==editor.range2.left && (editor.ecell.roweditor.range2.bottom+1)) { - spreadsheet.context.cursorsuffix = "insertup"; - } - } - }; - - // formula bar buttons - - this.formulabuttons = { - formulafunctions: {image: "formuladialog.gif", tooltip: "Functions", // tooltips are localized when set below - command: SocialCalc.SpreadsheetControl.DoFunctionList}, - multilineinput: {image: "multilinedialog.gif", tooltip: "Multi-line Input Box", - command: SocialCalc.SpreadsheetControl.DoMultiline}, - link: {image: "linkdialog.gif", tooltip: "Link Input Box", - command: SocialCalc.SpreadsheetControl.DoLink}, - sum: {image: "sumdialog.gif", tooltip: "Auto Sum", - command: SocialCalc.SpreadsheetControl.DoSum}, -/* image: {image: "sumdialog.gif", tooltip: "Insert", - command: SocialCalc.Images.Insert }*/ - } - - // Default tabs: - - // Edit - - this.tabnums.edit = this.tabs.length; - this.tabs.push({name: "edit", text: "Edit", html: - '
    '+ -' '+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -''+ -' '+ -'    '+ -''+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -' '+ -' '+ -' '+ -'    '+ -' '+ -' '+ -'    '+ -' '+ -' '+ -'  '+ -' '+ -'    '+ -' '+ - '
    ', - oncreate: null, //function(spreadsheet, viewobject) {SocialCalc.DoCmd(null, "fill-rowcolstuff");}, - onclick: null}); - - // Settings (Format) - - this.tabnums.settings = this.tabs.length; - this.tabs.push({name: "settings", text: "Format", html: - '', - view: "settings", - onclick: function(s, t) { - SocialCalc.SettingsControls.idPrefix = s.idPrefix; // used to get color chooser div - SocialCalc.SettingControlReset(); - var sheetattribs = s.sheet.EncodeSheetAttributes(); - var cellattribs = s.sheet.EncodeCellAttributes(s.editor.ecell.coord); - SocialCalc.SettingsControlLoadPanel(s.views.settings.values.sheetspanel, sheetattribs); - SocialCalc.SettingsControlLoadPanel(s.views.settings.values.cellspanel, cellattribs); - document.getElementById(s.idPrefix+"settingsecell").innerHTML = s.editor.ecell.coord; - SocialCalc.SpreadsheetControlSettingsSwitch("cell"); - s.views.settings.element.style.height = s.viewheight+"px"; - s.views.settings.element.firstChild.style.height = s.viewheight+"px"; - - var range; // set save message - if (s.editor.range.hasrange) { - range = SocialCalc.crToCoord(s.editor.range.left, s.editor.range.top) + ":" + - SocialCalc.crToCoord(s.editor.range.right, s.editor.range.bottom); - } - else { - range = s.editor.ecell.coord; - } - document.getElementById(s.idPrefix+"settings-savecell").value = SocialCalc.LocalizeString("Save to")+": "+range; - }, - onclickFocus: true - }); - - this.views["settings"] = {name: "settings", values: {}, - oncreate: function(s, viewobj) { - var scc = SocialCalc.Constants; - - viewobj.values.sheetspanel = { -// name: "sheet", - colorchooser: {id: s.idPrefix+"scolorchooser"}, - formatnumber: {setting: "numberformat", type: "PopupList", id: s.idPrefix+"formatnumber", - initialdata: scc.SCFormatNumberFormats}, - formattext: {setting: "textformat", type: "PopupList", id: s.idPrefix+"formattext", - initialdata: scc.SCFormatTextFormats}, - fontfamily: {setting: "fontfamily", type: "PopupList", id: s.idPrefix+"fontfamily", - initialdata: scc.SCFormatFontfamilies}, - fontlook: {setting: "fontlook", type: "PopupList", id: s.idPrefix+"fontlook", - initialdata: scc.SCFormatFontlook}, - fontsize: {setting: "fontsize", type: "PopupList", id: s.idPrefix+"fontsize", - initialdata: scc.SCFormatFontsizes}, - textalignhoriz: {setting: "textalignhoriz", type: "PopupList", id: s.idPrefix+"textalignhoriz", - initialdata: scc.SCFormatTextAlignhoriz}, - numberalignhoriz: {setting: "numberalignhoriz", type: "PopupList", id: s.idPrefix+"numberalignhoriz", - initialdata: scc.SCFormatNumberAlignhoriz}, - alignvert: {setting: "alignvert", type: "PopupList", id: s.idPrefix+"alignvert", - initialdata: scc.SCFormatAlignVertical}, - textcolor: {setting: "textcolor", type: "ColorChooser", id: s.idPrefix+"textcolor"}, - bgcolor: {setting: "bgcolor", type: "ColorChooser", id: s.idPrefix+"bgcolor"}, - padtop: {setting: "padtop", type: "PopupList", id: s.idPrefix+"padtop", - initialdata: scc.SCFormatPadsizes}, - padright: {setting: "padright", type: "PopupList", id: s.idPrefix+"padright", - initialdata: scc.SCFormatPadsizes}, - padbottom: {setting: "padbottom", type: "PopupList", id: s.idPrefix+"padbottom", - initialdata: scc.SCFormatPadsizes}, - padleft: {setting: "padleft", type: "PopupList", id: s.idPrefix+"padleft", - initialdata: scc.SCFormatPadsizes}, - colwidth: {setting: "colwidth", type: "PopupList", id: s.idPrefix+"colwidth", - initialdata: scc.SCFormatColwidth}, - recalc: {setting: "recalc", type: "PopupList", id: s.idPrefix+"recalc", - initialdata: scc.SCFormatRecalc} - }; - viewobj.values.cellspanel = { - name: "cell", - colorchooser: {id: s.idPrefix+"scolorchooser"}, - cformatnumber: {setting: "numberformat", type: "PopupList", id: s.idPrefix+"cformatnumber", - initialdata: scc.SCFormatNumberFormats}, - cformattext: {setting: "textformat", type: "PopupList", id: s.idPrefix+"cformattext", - initialdata: scc.SCFormatTextFormats}, - cfontfamily: {setting: "fontfamily", type: "PopupList", id: s.idPrefix+"cfontfamily", - initialdata: scc.SCFormatFontfamilies}, - cfontlook: {setting: "fontlook", type: "PopupList", id: s.idPrefix+"cfontlook", - initialdata: scc.SCFormatFontlook}, - cfontsize: {setting: "fontsize", type: "PopupList", id: s.idPrefix+"cfontsize", - initialdata: scc.SCFormatFontsizes}, - calignhoriz: {setting: "alignhoriz", type: "PopupList", id: s.idPrefix+"calignhoriz", - initialdata: scc.SCFormatTextAlignhoriz}, - calignvert: {setting: "alignvert", type: "PopupList", id: s.idPrefix+"calignvert", - initialdata: scc.SCFormatAlignVertical}, - ctextcolor: {setting: "textcolor", type: "ColorChooser", id: s.idPrefix+"ctextcolor"}, - cbgcolor: {setting: "bgcolor", type: "ColorChooser", id: s.idPrefix+"cbgcolor"}, - cbt: {setting: "bt", type: "BorderSide", id: s.idPrefix+"cbt"}, - cbr: {setting: "br", type: "BorderSide", id: s.idPrefix+"cbr"}, - cbb: {setting: "bb", type: "BorderSide", id: s.idPrefix+"cbb"}, - cbl: {setting: "bl", type: "BorderSide", id: s.idPrefix+"cbl"}, - cpadtop: {setting: "padtop", type: "PopupList", id: s.idPrefix+"cpadtop", - initialdata: scc.SCFormatPadsizes}, - cpadright: {setting: "padright", type: "PopupList", id: s.idPrefix+"cpadright", - initialdata: scc.SCFormatPadsizes}, - cpadbottom: {setting: "padbottom", type: "PopupList", id: s.idPrefix+"cpadbottom", - initialdata: scc.SCFormatPadsizes}, - cpadleft: {setting: "padleft", type: "PopupList", id: s.idPrefix+"cpadleft", - initialdata: scc.SCFormatPadsizes} - }; - - SocialCalc.SettingsControlInitializePanel(viewobj.values.sheetspanel); - SocialCalc.SettingsControlInitializePanel(viewobj.values.cellspanel); - }, - replacements: { - itemtitle: {regex: /\%itemtitle\./g, replacement: 'style="padding:12px 10px 0px 10px;font-weight:bold;text-align:right;vertical-align:top;font-size:small;"'}, - sectiontitle: {regex: /\%sectiontitle\./g, replacement: 'style="padding:16px 10px 0px 0px;font-weight:bold;vertical-align:top;font-size:small;color:#C00;"'}, - parttitle: {regex: /\%parttitle\./g, replacement: 'style="font-weight:bold;font-size:x-small;padding:0px 0px 3px 0px;"'}, - itembody: {regex: /\%itembody\./g, replacement: 'style="padding:12px 0px 0px 0px;vertical-align:top;font-size:small;"'}, - bodypart: {regex: /\%bodypart\./g, replacement: 'style="padding:0px 10px 0px 0px;font-size:small;vertical-align:top;"'} - }, - divStyle: "border:1px solid black;overflow:auto;", - html: - ''+ -''+ -'
    '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -'

    %loc!Format!:
    '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Number!
    '+ -' '+ -'
    '+ -'
    %loc!Text!
    '+ -' '+ -'
    '+ -'

    %loc!Alignment!:
    '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Horizontal!
    '+ -' '+ -'
    '+ -'
    %loc!Vertical!
    '+ -' '+ -'
    '+ -'

    %loc!Font!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Family!
    '+ -' '+ -'
    '+ -'
    %loc!Bold & Italics!
    '+ -' '+ -'
    '+ -'
    %loc!Size!
    '+ -' '+ -'
    '+ -'
    %loc!Color!
    '+ -'
    '+ -'
    '+ -'
    %loc!Background!
    '+ -'
    '+ -'
    '+ -'

    %loc!Borders!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    %loc!Top Border!
    %loc!Right Border!
    %loc!Bottom Border!
    %loc!Left Border!
    '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        
    '+ -'

    %loc!Padding!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Top!
    '+ -' '+ -'
    '+ -'
    %loc!Right!
    '+ -' '+ -'
    '+ -'
    %loc!Bottom!
    '+ -' '+ -'
    '+ -'
    %loc!Left!
    '+ -' '+ -'
    '+ -'
    '+ -'
    '+ -'
    '+ -' '+ -' '+ -'
    %loc!This is a
    sample!
    -1234.5
    '+ -'
    '+ -'
    '+ -'
    ' - }; - - // Sort - - this.tabnums.sort = this.tabs.length; - this.tabs.push({name: "sort", text: "Sort", html: - ' ', - onclick: SocialCalc.SpreadsheetControlSortOnclick}); - this.editor.SettingsCallbacks.sort = {save: SocialCalc.SpreadsheetControlSortSave, load: SocialCalc.SpreadsheetControlSortLoad}; - - // Audit - - this.tabnums.audit = this.tabs.length; - this.tabs.push({name: "audit", text: "Audit", html: - '', - view: "audit", - onclick: - function(s, t) { - var SCLoc = SocialCalc.LocalizeString; - var i, j; - var str = '
    '+SCLoc("Audit Trail This Session")+':

    '; - var stack = s.sheet.changes.stack; - var tos = s.sheet.changes.tos; - for (i=0; i'; - for (j=0; j"; - } - } - s.views.audit.element.innerHTML = str+"
    "; - SocialCalc.CmdGotFocus(true); - }, - onclickFocus: true - }); - - this.views["audit"] = {name: "audit", - divStyle: "border:1px solid black;overflow:auto;", - html: 'Audit Trail' - }; - - // Comment - - this.tabnums.comment = this.tabs.length; - this.tabs.push({name: "comment", text: "Comment", html: - '', - view: "sheet", - onclick: SocialCalc.SpreadsheetControlCommentOnclick, - onunclick: SocialCalc.SpreadsheetControlCommentOnunclick - }); - - // Names - - this.tabnums.names = this.tabs.length; - this.tabs.push({name: "names", text: "Names", html: - '', - view: "sheet", - onclick: SocialCalc.SpreadsheetControlNamesOnclick, - onunclick: SocialCalc.SpreadsheetControlNamesOnunclick - }); - - // Clipboard - - this.tabnums.clipboard = this.tabs.length; - this.tabs.push({name: "clipboard", text: "Clipboard", html: - '', - view: "clipboard", - onclick: SocialCalc.SpreadsheetControlClipboardOnclick, - onclickFocus: "clipboardtext" - }); - - this.views["clipboard"] = {name: "clipboard", divStyle: "overflow:auto;", html: - '
    '+ - ' %loc!Display Clipboard in!:'+ - ' %loc!Tab-delimited format!  '+ - ' %loc!CSV format!  '+ - ' %loc!SocialCalc-save format!'+ - '
    '+ - '   '+ - '   '+ - '
    '+ - ' ' - }; - - return; - - } - -// Methods: - -SocialCalc.SpreadsheetControl.prototype.InitializeSpreadsheetControl = - function(node, height, width, spacebelow) {return SocialCalc.InitializeSpreadsheetControl(this, node, height, width, spacebelow);}; -SocialCalc.SpreadsheetControl.prototype.DoOnResize = function() {return SocialCalc.DoOnResize(this);}; -SocialCalc.SpreadsheetControl.prototype.SizeSSDiv = function() {return SocialCalc.SizeSSDiv(this);}; -SocialCalc.SpreadsheetControl.prototype.ExecuteCommand = - function(combostr, sstr) {return SocialCalc.SpreadsheetControlExecuteCommand(this, combostr, sstr);}; -SocialCalc.SpreadsheetControl.prototype.CreateSheetHTML = - function() {return SocialCalc.SpreadsheetControlCreateSheetHTML(this);}; -SocialCalc.SpreadsheetControl.prototype.CreateSpreadsheetSave = - function(otherparts) {return SocialCalc.SpreadsheetControlCreateSpreadsheetSave(this, otherparts);}; -SocialCalc.SpreadsheetControl.prototype.DecodeSpreadsheetSave = - function(str) {return SocialCalc.SpreadsheetControlDecodeSpreadsheetSave(this, str);}; -SocialCalc.SpreadsheetControl.prototype.CreateCellHTML = - function(coord) {return SocialCalc.SpreadsheetControlCreateCellHTML(this, coord);}; -SocialCalc.SpreadsheetControl.prototype.CreateCellHTMLSave = - function(range) {return SocialCalc.SpreadsheetControlCreateCellHTMLSave(this, range);}; - - -// Sheet Methods to make things a little easier: - -SocialCalc.SpreadsheetControl.prototype.ParseSheetSave = function(str) {return this.sheet.ParseSheetSave(str);}; -SocialCalc.SpreadsheetControl.prototype.CreateSheetSave = function() {return this.sheet.CreateSheetSave();}; - - -// Functions: - -// -// InitializeSpreadsheetControl(spreadsheet, node, height, width, spacebelow) -// -// Creates the control elements and makes them the child of node (string or element). -// If present, height and width specify size. -// If either is 0 or null (missing), the maximum that fits on the screen -// (taking spacebelow into account) is used. -// -// Displays the tabs and creates the views (other than "sheet"). -// The first tab is set as selected, but onclick is not invoked. -// -// You should do a redisplay or recalc (which redisplays) after running this. -// - -SocialCalc.InitializeSpreadsheetControl = function(spreadsheet, node, height, width, spacebelow) { - - var scc = SocialCalc.Constants; - var SCLoc = SocialCalc.LocalizeString; - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var html, child, i, vname, v, style, button, bele; - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - spreadsheet.requestedHeight = height; - spreadsheet.requestedWidth = width; - spreadsheet.requestedSpaceBelow = spacebelow; - - if (typeof node == "string") node = document.getElementById(node); - - if (node == null) { - alert("SocialCalc.SpreadsheetControl not given parent node."); - } - - spreadsheet.parentNode = node; - - // create node to hold spreadsheet control - - spreadsheet.spreadsheetDiv = document.createElement("div"); - - spreadsheet.SizeSSDiv(); // calculate and fill in the size values - - for (child=node.firstChild; child!=null; child=node.firstChild) { - node.removeChild(child); - } - - // create the tabbed UI at the top - - html = '
    '; - - for (i=0; i'+ - ''; - - for (i=0; i' + SCLoc(tabs[i].text) + ''; - } - - html += '
    '; - - spreadsheet.currentTab = 0; // this is where we started - - for (style in spreadsheet.tabreplacements) { - html = html.replace(spreadsheet.tabreplacements[style].regex, spreadsheet.tabreplacements[style].replacement); - } - html = html.replace(/\%s\./g, "SocialCalc."); - html = html.replace(/\%id\./g, spreadsheet.idPrefix); - html = html.replace(/\%tbt\./g, spreadsheet.toolbartext); - html = html.replace(/\%img\./g, spreadsheet.imagePrefix); - - html = SCLocSS(html); // localize with %loc!string! and %scc!constant! - - spreadsheet.spreadsheetDiv.innerHTML = html; - - node.appendChild(spreadsheet.spreadsheetDiv); - - // Initialize SocialCalc buttons - -spreadsheet.Buttons = { - button_undo: {tooltip: "Undo", command: "undo"}, - button_redo: {tooltip: "Redo", command: "redo"}, - button_copy: {tooltip: "Copy", command: "copy"}, - button_cut: {tooltip: "Cut", command: "cut"}, - button_paste: {tooltip: "Paste", command: "paste"}, - button_pasteformats: {tooltip: "Paste Formats", command: "pasteformats"}, - button_delete: {tooltip: "Delete Contents", command: "delete"}, - button_filldown: {tooltip: "Fill Down", command: "filldown"}, - button_fillright: {tooltip: "Fill Right", command: "fillright"}, - button_movefrom: {tooltip: "Set/Clear Move From", command: "movefrom"}, - button_movepaste: {tooltip: "Move Paste", command: "movepaste"}, - button_moveinsert: {tooltip: "Move Insert", command: "moveinsert"}, - button_alignleft: {tooltip: "Align Left", command: "align-left"}, - button_aligncenter: {tooltip: "Align Center", command: "align-center"}, - button_alignright: {tooltip: "Align Right", command: "align-right"}, - button_borderon: {tooltip: "Borders On", command: "borderon"}, - button_borderoff: {tooltip: "Borders Off", command: "borderoff"}, - button_swapcolors: {tooltip: "Swap Colors", command: "swapcolors"}, - button_merge: {tooltip: "Merge Cells", command: "merge"}, - button_unmerge: {tooltip: "Unmerge Cells", command: "unmerge"}, - button_insertrow: {tooltip: "Insert Row", command: "insertrow"}, - button_insertcol: {tooltip: "Insert Column", command: "insertcol"}, - button_deleterow: {tooltip: "Delete Row", command: "deleterow"}, - button_deletecol: {tooltip: "Delete Column", command: "deletecol"}, - button_recalc: {tooltip: "Recalc", command: "recalc"} - } - - for (button in spreadsheet.Buttons) { - bele = document.getElementById(spreadsheet.idPrefix+button); - if (!bele) {/*alert("Button "+(spreadsheet.idPrefix+button)+" missing");*/ continue;} - bele.style.border = "1px solid "+scc.ISCButtonBorderNormal; - SocialCalc.TooltipRegister(bele, SCLoc(spreadsheet.Buttons[button].tooltip), {}); - SocialCalc.ButtonRegister(bele, - {normalstyle: "border:1px solid "+scc.ISCButtonBorderNormal+";backgroundColor:"+scc.ISCButtonBorderNormal+";", - hoverstyle: "border:1px solid "+scc.ISCButtonBorderHover+";backgroundColor:"+scc.ISCButtonBorderNormal+";", - downstyle: "border:1px solid "+scc.ISCButtonBorderDown+";backgroundColor:"+scc.ISCButtonDownBackground+";"}, - {MouseDown: SocialCalc.DoButtonCmd, command: spreadsheet.Buttons[button].command}); - } - - // create formula bar - - spreadsheet.dummyFormulaDiv = document.createElement("div"); - spreadsheet.dummyFormulaDiv.style.height = spreadsheet.formulabarheight + "px"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.dummyFormulaDiv); - - spreadsheet.formulabarDiv = document.createElement("div"); - spreadsheet.formulabarDiv.id = "formulabardiv"; - spreadsheet.formulabarDiv.style.height = spreadsheet.formulabarheight + "px"; - spreadsheet.formulabarDiv.innerHTML = ''; //' '; - //spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - var inputbox = new SocialCalc.InputBox(spreadsheet.formulabarDiv.firstChild, spreadsheet.editor); - - //bele = document.createElement("img"); - // bele.id = "testtest"; - // bele.src = "lib/aspiring/images/delete24.png"; - // bele.style.verticalAlign = "middle"; - //bele.style.border = "1px solid #FFF"; - //bele.style.marginLeft = "4px"; - // bele.style.display = "none"; - // SocialCalc.ButtonRegister(bele, - // {normalstyle: "", - // hoverstyle: "", - // downstyle: ""}, - // {MouseDown: SocialCalc.InputLineClearText}); - - - //spreadsheet.formulabarDiv.appendChild(bele); - - /* - for (button in spreadsheet.formulabuttons) { - bele = document.createElement("img"); - bele.id = spreadsheet.idPrefix+button; - bele.src = spreadsheet.imagePrefix+spreadsheet.formulabuttons[button].image; - bele.style.verticalAlign = "middle"; - bele.style.border = "1px solid #FFF"; - bele.style.marginLeft = "4px"; - SocialCalc.TooltipRegister(bele, SCLoc(spreadsheet.formulabuttons[button].tooltip), {}); - SocialCalc.ButtonRegister(bele, - {normalstyle: "border:1px solid #FFF;backgroundColor:#FFF;", - hoverstyle: "border:1px solid #CCC;backgroundColor:#FFF;", - downstyle: "border:1px solid #000;backgroundColor:#FFF;"}, - {MouseDown: spreadsheet.formulabuttons[button].command}); - spreadsheet.formulabarDiv.appendChild(bele); - } - */ - // initialize tabs that need it - - for (i=0; i 1 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 1; // restore what was there if reasonable - sele = document.getElementById(spreadsheet.idPrefix+"minorsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col=range.cr1.col; col<=range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = oldindex > 0 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 0; // default to [none] - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col=range.cr1.col; col<=range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = oldindex > 0 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 0; // default to [none] - - } - -// -// SocialCalc.CmdGotFocus(obj) -// -// Sets SocialCalc.Keyboard.passThru: obj should be element with focus or "true" -// - -SocialCalc.CmdGotFocus = function(obj) { - - SocialCalc.Keyboard.passThru = obj; - - } - - -// -// SocialCalc.DoButtonCmd(e, buttoninfo, bobj) -// - -SocialCalc.DoButtonCmd = function(e, buttoninfo, bobj) { - - SocialCalc.DoCmd(bobj.element, bobj.functionobj.command); - - } - -// -// SocialCalc.DoCmd(obj, which) -// -// xxx -// - -SocialCalc.DoCmd = function(obj, which) { - - var combostr, sstr, cl, i, clele, slist, slistele, str, sele, rele, lele, ele, sortrange, nrange, rparts; - var sheet, cell, color, bgcolor, defaultcolor, defaultbgcolor; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - switch (which) { - case "undo": - spreadsheet.ExecuteCommand("undo", ""); - break; - - case "redo": - spreadsheet.ExecuteCommand("redo", ""); - break; - - case "fill-rowcolstuff": - case "fill-text": - cl = which.substring(5); - clele = document.getElementById(spreadsheet.idPrefix+cl+"list"); - clele.length = 0; - for (i=0; i0) { - rele = document.getElementById(spreadsheet.idPrefix+"minorsortup"); - str += " "+sele.options[sele.selectedIndex].value + (rele.checked ? " up" : " down"); - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (sele.selectedIndex>0) { - rele = document.getElementById(spreadsheet.idPrefix+"lastsortup"); - str += " "+sele.options[sele.selectedIndex].value + (rele.checked ? " up" : " down"); - } - spreadsheet.ExecuteCommand(str, ""); - break; - - case "merge": - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - if (editor.range.hasrange) { // set ecell to upper left - editor.MoveECell(SocialCalc.crToCoord(editor.range.left, editor.range.top)); - editor.RangeRemove(); - } - break; - - case "movefrom": - if (editor.range2.hasrange) { // toggle if already there - spreadsheet.context.cursorsuffix = ""; - editor.Range2Remove(); - spreadsheet.ExecuteCommand("redisplay", ""); - } - else if (editor.range.hasrange) { // set range2 to range or one cell - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.MoveECell(SocialCalc.crToCoord(editor.range.left, editor.range.top)); - } - else { - editor.range2.top = editor.ecell.row; - editor.range2.right = editor.ecell.col; - editor.range2.bottom = editor.ecell.row; - editor.range2.left = editor.ecell.col; - editor.range2.hasrange = true; - } - str = editor.range2.hasrange ? "" : "off"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movefrom"); - ele.src=spreadsheet.imagePrefix+"movefrom"+str+".gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movepaste"); - ele.src=spreadsheet.imagePrefix+"movepaste"+str+".gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_moveinsert"); - ele.src=spreadsheet.imagePrefix+"moveinsert"+str+".gif"; - if (editor.range2.hasrange) editor.RangeRemove(); - break; - - case "movepaste": - case "moveinsert": - if (editor.range2.hasrange) { - spreadsheet.context.cursorsuffix = ""; - combostr = which+" "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord; - spreadsheet.ExecuteCommand(combostr, ""); - editor.Range2Remove(); - ele = document.getElementById(spreadsheet.idPrefix+"button_movefrom"); - ele.src=spreadsheet.imagePrefix+"movefromoff.gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movepaste"); - ele.src=spreadsheet.imagePrefix+"movepasteoff.gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_moveinsert"); - ele.src=spreadsheet.imagePrefix+"moveinsertoff.gif"; - } - break; - - case "swapcolors": - sheet = spreadsheet.sheet; - cell = sheet.GetAssuredCell(editor.ecell.coord); - defaultcolor = sheet.attribs.defaultcolor ? sheet.colors[sheet.attribs.defaultcolor] : "rgb(0,0,0)"; - defaultbgcolor = sheet.attribs.defaultbgcolor ? sheet.colors[sheet.attribs.defaultbgcolor] : "rgb(255,255,255)"; - color = cell.color ? sheet.colors[cell.color] : defaultcolor; // get color - if (color == defaultbgcolor) color = ""; // going to swap, so if same as background default, use default - bgcolor = cell.bgcolor ? sheet.colors[cell.bgcolor] : defaultbgcolor; - if (bgcolor == defaultcolor) bgcolor = ""; // going to swap, so if same as foreground default, use default - spreadsheet.ExecuteCommand("set %C color "+bgcolor+"%Nset %C bgcolor "+color, ""); - break; - - default: - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - break; - } - - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - - } - -SocialCalc.SpreadsheetCmdLookup = { - 'copy': 'copy %C all', - 'cut': 'cut %C all', - 'paste': 'paste %C all', - 'pasteformats': 'paste %C formats', - 'delete': 'erase %C formulas', - 'filldown': 'filldown %C all', - 'fillright': 'fillright %C all', - 'erase': 'erase %C all', - 'borderon': 'set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S', - 'borderoff': 'set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S', - 'merge': 'merge %C', - 'unmerge': 'unmerge %C', - 'align-left': 'set %C cellformat left', - 'align-center': 'set %C cellformat center', - 'align-right': 'set %C cellformat right', - 'align-default': 'set %C cellformat', - 'insertrow': 'insertrow %C', - 'insertcol': 'insertcol %C', - 'deleterow': 'deleterow %C', - 'deletecol': 'deletecol %C', - 'undo': 'undo', - 'redo': 'redo', - 'recalc': 'recalc' - } - -SocialCalc.SpreadsheetCmdSLookup = { - 'borderon': '1px solid rgb(0,0,0)', - 'borderoff': '' - } - -/******* NO LONGER USED - -SocialCalc.SpreadsheetCmdTable = { - cmd: [ - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"}, - {t:"Copy", s:"all", c:"copy %C %S"}, - {t:"Cut", s:"all", c:"cut %C %S"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Merge Cells", s:"none", c:"merge %C"}, - {t:"Unmerge", s:"none", c:"unmerge %C"}, - {t:"Sort", s:"sortcol", c:"sort %R %S"}, - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Cell Borders", s:"borderOnOff", c:"set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S"}, - {t:"Column Width", s:"colWidths", c:"set %W width %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"}, - {t:"Default Column Width", s:"colWidths", c:"set sheet defaultcolwidth %S"} - ], - rowcolstuff: [ - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"} - ], - text: [ - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Text Format", s:"tvf", c:"set %C textvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Text Format", s:"tvf", c:"set sheet defaulttextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"} - ], - slists: { - "colors": [ - {t:"Default", s:""}, - {t:"Black", s:"rgb(0,0,0)"}, - {t:"Dark Gray", s:"rgb(102,102,102)"}, // #666 - {t:"Gray", s:"rgb(204,204,204)"}, // #CCC - {t:"White", s:"rgb(255,255,255)"}, - {t:"Red", s:"rgb(255,0,0)"}, - {t:"Dark Red", s:"rgb(153,0,0)"}, - {t:"Orange", s:"rgb(255,153,0)"}, - {t:"Yellow", s:"rgb(255,255,0)"}, - {t:"Light Yellow", s:"rgb(255,255,204)"}, - {t:"Green", s:"rgb(0,255,0)"}, - {t:"Dark Green", s:"rgb(0,153,0)"}, - {t:"Blue", s:"rgb(0,0,255)"}, - {t:"Dark Blue", s:"rgb(0,0,153)"}, - {t:"Light Blue", s:"rgb(204,204,255)"} - ], - "fonts": [ // style weight size family - {t:"Default", s:""}, - {t:"Bold", s:"normal bold * *"}, - {t:"Italic", s:"italic normal * *"}, - {t:"Small", s:"* small *"}, - {t:"Medium", s:"* medium *"}, - {t:"Large", s:"* large *"}, - {t:"Bold Small", s:"normal bold small *"}, - {t:"Bold Medium", s:"normal bold medium *"}, - {t:"Bold Large", s:"normal bold large *"} - ], - "cellformat": [ - {t:"Default", s:""}, - {t:"Left", s:"left"}, - {t:"Right", s:"right"}, - {t:"Center", s:"center"} - ], - "borderOnOff": [ - {t:"On", s:"1px solid rgb(0,0,0)"}, - {t:"Off", s:""} - ], - "colWidths": [ - {t:"Default", s:""}, - {t:"20", s:"20"}, - {t:"40", s:"40"}, - {t:"60", s:"60"}, - {t:"80", s:"80"}, - {t:"100", s:"100"}, - {t:"120", s:"120"}, - {t:"140", s:"140"}, - {t:"160", s:"160"}, - {t:"180", s:"180"}, - {t:"200", s:"200"}, - {t:"220", s:"220"}, - {t:"240", s:"240"}, - {t:"260", s:"260"}, - {t:"280", s:"280"}, - {t:"300", s:"300"} - ], - "ntvf": [ - {t:"Default", s:""}, - {t:"1234", s:"0"}, - {t:"1,234", s:"#,##0"}, - {t:"1,234.5", s:"#,##0.0"}, - {t:"1,234.56", s:"#,##0.00"}, - {t:"1,234.567", s:"#,##0.000"}, - {t:"1,234%", s:"#,##0%"}, - {t:"1,234.5%", s:"#,##0.0%"}, - {t:"(1,234)", s:"#,##0_);(#,##0)"}, - {t:"(1,234.5)", s:"#,##0.0_);(#,##0.0)"}, - {t:"(1,234.56)", s:"#,##0.00_);(#,##0.00)"}, - {t:"00", s:"00"}, - {t:"000", s:"000"}, - {t:"0000", s:"0000"}, - {t:"$1,234.56", s:"$#,##0.00"}, - {t:"2006-01-04", s:"yyyy-mm-dd"}, - {t:"01:23:45", s:"hh:mm:ss"}, - {t:"2006-01-04 01:23:45", s:"yyyy-mm-dd hh:mm:ss"}, - {t:"Hidden", s:"hidden"} - ], - "tvf": [ - {t:"Default", s:""}, - {t:"Automatic", s:"general"}, - {t:"Plain Text", s:"text-plain"}, - {t:"HTML", s:"text-html"}, - {t:"Wiki", s:"text-wiki"}, - {t:"Hidden", s:"hidden"} - ], - "ffal": [ // Formulas, Formats, All - {t:"All", s:"all"}, - {t:"Contents", s:"formulas"}, - {t:"Formats", s:"formats"} - ], - "all": [ // All - {t:"All", s:"all"} - ], - "rowcol": [ - {t:"Row", s:"row"}, - {t:"Column", s:"col"} - ], - "sortcol": [ - {t:"A up", s:"A up"}, - {t:"B up", s:"B up"}, - {t:"C up", s:"C up"}, - {t:"A down", s:"A down"}, - {t:"B down", s:"B down"}, - {t:"C down", s:"C down"}, - {t:"A, B, C up", s:"A up B up C up"} - ], - "none": [ // nothing - {t:" ", s:" "} - ] - } - } -*********/ - -// -// SocialCalc.SpreadsheetControlExecuteCommand(obj, combostr, sstr) -// -// xxx -// - -SocialCalc.SpreadsheetControlExecuteCommand = function(obj, combostr, sstr) { - - var i, commands; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var eobj = spreadsheet.editor; - - var str = {}; - str.P = "%"; - str.N = "\n" - if (eobj.range.hasrange) { - str.R = SocialCalc.crToCoord(eobj.range.left, eobj.range.top)+ - ":"+SocialCalc.crToCoord(eobj.range.right, eobj.range.bottom); - str.C = str.R; - str.W = SocialCalc.rcColname(eobj.range.left) + ":" + SocialCalc.rcColname(eobj.range.right); - } - else { - str.C = eobj.ecell.coord; - str.R = eobj.ecell.coord+":"+eobj.ecell.coord; - str.W = SocialCalc.rcColname(SocialCalc.coordToCr(eobj.ecell.coord).col); - } - str.S = sstr; - combostr = combostr.replace(/%C/g, str.C); - combostr = combostr.replace(/%R/g, str.R); - combostr = combostr.replace(/%N/g, str.N); - combostr = combostr.replace(/%S/g, str.S); - combostr = combostr.replace(/%W/g, str.W); - combostr = combostr.replace(/%P/g, str.P); - - eobj.EditorScheduleSheetCommands(combostr, true, false); - - } - -// -// result = SocialCalc.SpreadsheetControlCreateSheetHTML(spreadsheet) -// -// Returns the HTML representation of the whole spreadsheet -// - -SocialCalc.SpreadsheetControlCreateSheetHTML = function(spreadsheet) { - - var context, div, ele; - - var result = ""; - - context = new SocialCalc.RenderContext(spreadsheet.sheet); - div = document.createElement("div"); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - result = div.innerHTML; - delete ele; - delete div; - return result; - - } - -// -// result = SocialCalc.SpreadsheetControlCreateCellHTML(spreadsheet, coord, linkstyle) -// -// Returns the HTML representation of a cell. Blank is "", not " ". -// - -SocialCalc.SpreadsheetControlCreateCellHTML = function(spreadsheet, coord, linkstyle) { - - var result = ""; - var cell = spreadsheet.sheet.cells[coord]; - - if (!cell) return ""; - - if (cell.displaystring == undefined) { - result = SocialCalc.FormatValueForDisplay(spreadsheet.sheet, cell.datavalue, coord, (linkstyle || spreadsheet.context.defaultHTMLlinkstyle)); - } - else { - result = cell.displaystring; - } - - if (result == " ") result = ""; - - return result; - - } - -// -// result = SocialCalc.SpreadsheetControlCreateCellHTMLSave(spreadsheet, range, linkstyle) -// -// Returns the HTML representation of a range of cells, or the whole sheet if range is null. -// The form is: -// version:1.0 -// coord:cell-HTML -// coord:cell-HTML -// ... -// -// Empty cells are skipped. The cell-HTML is encoded with ":"=>"\c", newline=>"\n", and "\"=>"\b". -// - -SocialCalc.SpreadsheetControlCreateCellHTMLSave = function(spreadsheet, range, linkstyle) { - - var cr1, cr2, row, col, coord, cell, cellHTML; - var result = []; - var prange; - - if (range) { - prange = SocialCalc.ParseRange(range); - } - else { - prange = {cr1: {row: 1, col:1}, - cr2: {row: spreadsheet.sheet.attribs.lastrow, col: spreadsheet.sheet.attribs.lastcol}}; - } - cr1 = prange.cr1; - cr2 = prange.cr2; - - result.push("version:1.0"); - - for (row=cr1.row; row <= cr2.row; row++) { - for (col=cr1.col; col <= cr2.col; col++) { - coord = SocialCalc.crToCoord(col, row); - cell=spreadsheet.sheet.cells[coord]; - if (!cell) continue; - if (cell.displaystring == undefined) { - cellHTML = SocialCalc.FormatValueForDisplay(spreadsheet.sheet, cell.datavalue, coord, (linkstyle || spreadsheet.context.defaultHTMLlinkstyle)); - } - else { - cellHTML = cell.displaystring; - } - if (cellHTML == " ") continue; - result.push(coord+":"+SocialCalc.encodeForSave(cellHTML)); - } - } - - result.push(""); // one extra to get extra \n - return result.join("\n"); - } - -// -// Formula Bar Button Routines -// - -SocialCalc.SpreadsheetControl.DoFunctionList = function() { - - var i, cname, str, f, ele; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var fcl = scc.function_classlist; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - scf.FillFunctionInfo(); - - str = '
    %loc!Category!
    '+ - '
      %loc!Functions!
    '+ - '
    '+ - '
    '+SocialCalc.SpreadsheetControl.GetFunctionInfoStr(scf.FunctionClasses[fcl[0]].items[0])+'
    '+ - '
    '+ - ' '+ - '
    '+ - '
    '; - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - str = ''+ - ''+ - '
    '+" %loc!Function List!"+' X 
    '+ - '
    '+str+'
    '; - - str = SocialCalc.LocalizeSubstrings(str); - - main.innerHTML = str; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"name"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide; if All, letter scrolls to there - - } - -SocialCalc.SpreadsheetControl.GetFunctionNamesStr = function(cname) { - - var i, f; - var scf = SocialCalc.Formula; - var str = ""; - - f = scf.FunctionClasses[cname]; - for (i=0; i':'>')+f.items[i]+''; - } - - return str; - - } - -SocialCalc.SpreadsheetControl.FillFunctionNames = function(cname, ele) { - - var i, f; - var scf = SocialCalc.Formula; - - ele.length = 0; - f = scf.FunctionClasses[cname]; - for (i=0; i
    "; - str += scsc(f[3]); - - return str; - - } - -SocialCalc.SpreadsheetControl.FunctionClassChosen = function(cname) { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - var scf = SocialCalc.Formula; - - SocialCalc.SpreadsheetControl.FillFunctionNames(cname, document.getElementById(idp+"name")); - - SocialCalc.SpreadsheetControl.FunctionChosen(scf.FunctionClasses[cname].items[0]); - - } - -SocialCalc.SpreadsheetControl.FunctionChosen = function(fname) { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - - document.getElementById(idp+"desc").innerHTML = SocialCalc.SpreadsheetControl.GetFunctionInfoStr(fname); - - } - -SocialCalc.SpreadsheetControl.HideFunctions = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById(spreadsheet.idPrefix+"functiondialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - } - -SocialCalc.SpreadsheetControl.DoFunctionPaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var ele = document.getElementById(spreadsheet.idPrefix+"functionname"); - var mele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - var text = ele.value+"("; - - SocialCalc.SpreadsheetControl.HideFunctions(); - - if (mele) { // multi-line editing is in progress - mele.value += text; - mele.focus(); - SocialCalc.CmdGotFocus(mele); - } - else { - editor.EditorAddToInput(text, "="); - } - - } - - -SocialCalc.SpreadsheetControl.DoMultiline = function() { - - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var str, ele, text; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"multiline"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - text = SocialCalc.special_chars(text); - - str = ''+ - '
    '+ - SCLocSS(' '+ - ' '+ - '
    '+ - ''); - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+ - SCLocSS(" %loc!Multi-line Input Box!")+' X 
    '+ - '
    '+str+'
    '; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"textarea"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide? - - } - - -SocialCalc.SpreadsheetControl.HideMultiline = function() { - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinedialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - - } - -SocialCalc.SpreadsheetControl.DoMultilineClear = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - ele.value = ""; - ele.focus(); - - } - - -SocialCalc.SpreadsheetControl.DoMultilinePaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - var text = ele.value; - - SocialCalc.SpreadsheetControl.HideMultiline(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - editor.EditorSaveEdit(text); - - } - - -SocialCalc.SpreadsheetControl.DoLink = function() { - - var SCLoc = SocialCalc.LocalizeString; - - var str, ele, text, cell, setformat, popup; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"link"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - if (text.charAt(0)=="'") { - text = text.slice(1); - } - - var parts = SocialCalc.ParseCellLinkText(text); - - text = SocialCalc.special_chars(text); - - cell = spreadsheet.sheet.cells[editor.ecell.coord]; - if (!cell || !cell.textvalueformat) { // set to link format, but don't override - setformat = " checked"; - } - else { - setformat = ""; - } - - popup = parts.newwin ? " checked" : ""; - - str = '
    '+ - ''+SCLoc("Description")+'
    '+ - '
    '+ - ''+SCLoc("URL")+'
    '+ - '
    '; - if (SocialCalc.Callbacks.MakePageLink) { // only show if handling pagenames here - str += ''+SCLoc("Page Name")+'
    '+ - '
    '+ - ''+SCLoc("Workspace")+'
    '+ - '
    '; - } - str += SocialCalc.LocalizeSubstrings(' '+ - '%loc!Set to Link format!
    '+ - ' '+ - '%loc!Show in new browser window!'+ - '
    '+ - '
    '+ - ' '+ - ' '+ - '
    '+ - ''); - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+SCLoc("Link Input Box")+' X 
    '+ - '
    '+str+'
    '; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"url"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide? - - } - - -SocialCalc.SpreadsheetControl.HideLink = function() { - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix+"linkdialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - - } - -SocialCalc.SpreadsheetControl.DoLinkClear = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - document.getElementById(spreadsheet.idPrefix+"linkdesc").value = ""; - document.getElementById(spreadsheet.idPrefix+"linkpagename").value = ""; - document.getElementById(spreadsheet.idPrefix+"linkworkspace").value = ""; - - var ele = document.getElementById(spreadsheet.idPrefix+"linkurl"); - ele.value = ""; - ele.focus(); - - } - - -SocialCalc.SpreadsheetControl.DoLinkPaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var descele = document.getElementById(spreadsheet.idPrefix+"linkdesc"); - var urlele = document.getElementById(spreadsheet.idPrefix+"linkurl"); - var pagenameele = document.getElementById(spreadsheet.idPrefix+"linkpagename"); - var workspaceele = document.getElementById(spreadsheet.idPrefix+"linkworkspace"); - var formatele = document.getElementById(spreadsheet.idPrefix+"linkformat"); - var popupele = document.getElementById(spreadsheet.idPrefix+"linkpopup"); - - var text = ""; - - var ltsym, gtsym, obsym, cbsym; - - if (popupele.checked) { - ltsym = "<<"; gtsym = ">>"; obsym = "[["; cbsym = "]]"; - } - else { - ltsym = "<"; gtsym = ">"; obsym = "["; cbsym = "]"; - } - - if (pagenameele && pagenameele.value) { - if (workspaceele.value) { - text = descele.value+"{"+workspaceele.value+obsym+pagenameele.value+cbsym+"}"; - } - else { - text = descele.value+obsym+pagenameele.value+cbsym; - } - } - else { - text = descele.value+ltsym+urlele.value+gtsym; - } - - SocialCalc.SpreadsheetControl.HideLink(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - if (formatele.checked) { - SocialCalc.SpreadsheetControlExecuteCommand(null, "set %C textvalueformat text-link", ""); - } - - editor.EditorSaveEdit(text); - - } - -SocialCalc.SpreadsheetControl.DoSum = function() { - - var cmd, cell, row, col, sel, cr, foundvalue; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var sheet = editor.context.sheetobj; - - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - cmd = "set "+SocialCalc.crToCoord(editor.range.right, editor.range.bottom+1)+ - " formula sum("+sel+")"; - } - else { - row = editor.ecell.row - 1; - col = editor.ecell.col; - if (row<=1) { - cmd = "set "+editor.ecell.coord+" constant e#REF! 0 #REF!"; - } - else { - foundvalue = false; - while (row>0) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (!cell.datatype || cell.datatype=="t") { - if (foundvalue) { - row++; - break; - } - } - else { - foundvalue = true; - } - row--; - } - cmd = "set "+editor.ecell.coord+" formula sum("+ - SocialCalc.crToCoord(col,row)+":"+SocialCalc.crToCoord(col, editor.ecell.row-1)+")"; - } - } - - editor.EditorScheduleSheetCommands(cmd, true, false); - - } - - -// -// TAB Routines -// - -// Sort - -SocialCalc.SpreadsheetControlSortOnclick = function(s, t) { - - var name, i; - var namelist = []; - var nl = document.getElementById(s.idPrefix+"sortlist"); - SocialCalc.LoadColumnChoosers(s); - s.editor.RangeChangeCallback.sort = SocialCalc.UpdateSortRangeProposal; - - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - nl.options[0] = new Option(SocialCalc.LocalizeString("[select range]")); - for (i=0; i0) { - rele = document.getElementById(spreadsheet.idPrefix+"minorsortup"); - str += ":"+sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } - else { - str += "::"; - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (sele.selectedIndex>0) { - rele = document.getElementById(spreadsheet.idPrefix+"lastsortup"); - str += ":"+sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } - else { - str += "::"; - } - return str+"\n"; - } - -SocialCalc.SpreadsheetControlSortLoad = function(editor, setting, line, flags) { - var parts, ele; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - parts = line.split(":"); - spreadsheet.sortrange = SocialCalc.decodeFromSave(parts[1]); - ele = document.getElementById(spreadsheet.idPrefix+"sortbutton"); - if (spreadsheet.sortrange) { - ele.value = SocialCalc.LocalizeString("Sort ")+spreadsheet.sortrange; - ele.style.visibility = "visible"; - } - else { - ele.style.visibility = "hidden"; - } - SocialCalc.LoadColumnChoosers(spreadsheet); - - sele = document.getElementById(spreadsheet.idPrefix+"majorsort"); - sele.selectedIndex = parts[2]-0; - document.getElementById(spreadsheet.idPrefix+"majorsort"+parts[3]).checked = true; - sele = document.getElementById(spreadsheet.idPrefix+"minorsort"); - if (parts[4]) { - sele.selectedIndex = parts[4]-0; - document.getElementById(spreadsheet.idPrefix+"minorsort"+parts[5]).checked = true; - } - else { - sele.selectedIndex = 0; - document.getElementById(spreadsheet.idPrefix+"minorsortup").checked = true; - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (parts[6]) { - sele.selectedIndex = parts[6]-0; - document.getElementById(spreadsheet.idPrefix+"lastsort"+parts[7]).checked = true; - } - else { - sele.selectedIndex = 0; - document.getElementById(spreadsheet.idPrefix+"lastsortup").checked = true; - } - - return true; - } - -// Comment - -SocialCalc.SpreadsheetControlCommentOnclick = function(s, t) { - s.editor.MoveECellCallback.comment = SocialCalc.SpreadsheetControlCommentMoveECell; - SocialCalc.SpreadsheetControlCommentDisplay(s, t); - SocialCalc.KeyboardFocus(); - return; - } - -SocialCalc.SpreadsheetControlCommentDisplay = function(s, t) { - var c = ""; - if (s.editor.ecell && s.editor.ecell.coord && s.sheet.cells[s.editor.ecell.coord]) { - c = s.sheet.cells[s.editor.ecell.coord].comment || ""; - } - document.getElementById(s.idPrefix+"commenttext").value = c; - } - -SocialCalc.SpreadsheetControlCommentMoveECell = function(editor) { - SocialCalc.SpreadsheetControlCommentDisplay(SocialCalc.GetSpreadsheetControlObject(), "comment"); - } - -SocialCalc.SpreadsheetControlCommentSet = function() { - var s=SocialCalc.GetSpreadsheetControlObject(); - s.ExecuteCommand("set %C comment "+SocialCalc.encodeForSave(document.getElementById(s.idPrefix+"commenttext").value)); - var cell=SocialCalc.GetEditorCellElement(s.editor, s.editor.ecell.row, s.editor.ecell.col); - s.editor.UpdateCellCSS(cell, s.editor.ecell.row, s.editor.ecell.col); - SocialCalc.KeyboardFocus(); - } - -SocialCalc.SpreadsheetControlCommentOnunclick = function(s, t) { - delete s.editor.MoveECellCallback.comment; - } - -// Names - -SocialCalc.SpreadsheetControlNamesOnclick = function(s, t) { - document.getElementById(s.idPrefix+"namesname").value = ""; - document.getElementById(s.idPrefix+"namesdesc").value = ""; - document.getElementById(s.idPrefix+"namesvalue").value = ""; - s.editor.RangeChangeCallback.names = SocialCalc.SpreadsheetControlNamesRangeChange; - s.editor.MoveECellCallback.names = SocialCalc.SpreadsheetControlNamesRangeChange; - SocialCalc.SpreadsheetControlNamesRangeChange(s.editor); - SocialCalc.SpreadsheetControlNamesFillNameList(); - SocialCalc.SpreadsheetControlNamesChangedName(); - } - -SocialCalc.SpreadsheetControlNamesFillNameList = function() { - var SCLoc = SocialCalc.LocalizeString; - var name, i; - var namelist = []; - var s=SocialCalc.GetSpreadsheetControlObject(); - var nl = document.getElementById(s.idPrefix+"nameslist"); - var currentname = document.getElementById(s.idPrefix+"namesname").value.toUpperCase().replace(/[^A-Z0-9_\.]/g, ""); - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - if (namelist.length > 0) { - nl.options[0] = new Option(SCLoc("[New]")); - } - else { - nl.options[0] = new Option(SCLoc("[None]")); - } - for (i=0; i 0) { - strtoedit = SocialCalc.special_chars(SocialCalc.OtherSaveParts[whichpart] || ""); - } - else { - strtoedit = "Listing of Parts\n"; - for (partname in SocialCalc.OtherSaveParts) { - strtoedit += SocialCalc.special_chars("\nPart: "+partname+"\n=====\n"+SocialCalc.OtherSaveParts[partname]+"\n"); - } - } - var editbox = document.createElement("div"); - editbox.style.cssText = "position:absolute;z-index:500;width:300px;height:300px;left:100px;top:200px;border:1px solid black;background-color:#EEE;text-align:center;"; - editbox.id = "socialcalc-editbox"; - editbox.innerHTML = whichpart+'



    '; - document.body.appendChild(editbox); - - var ebta = document.getElementById("socialcalc-editbox-textarea"); - ebta.focus(); - SocialCalc.CmdGotFocus(ebta); - - } - -SocialCalc.CtrlSEditorDone = function(idprefix, whichpart) { - - var edittextarea = document.getElementById(idprefix+"-textarea"); - var text = edittextarea.value; - if (whichpart.length > 0) { - if (text.length > 0) { - SocialCalc.OtherSaveParts[whichpart] = text; - } - else { - delete SocialCalc.OtherSaveParts[whichpart]; - } - } - - var editbox = document.getElementById(idprefix); - SocialCalc.KeyboardFocus(); - editbox.parentNode.removeChild(editbox); - - } - diff --git a/Website/static/runappios43c/lib/aspiring/socialcalctableeditor.js b/Website/static/runappios43c/lib/aspiring/socialcalctableeditor.js deleted file mode 100755 index 24179b3..0000000 --- a/Website/static/runappios43c/lib/aspiring/socialcalctableeditor.js +++ /dev/null @@ -1,6599 +0,0 @@ -// -// SocialCalcTableEditor -// -/* -// The code module of the SocialCalc package that displays a scrolling grid with panes -// and handles keyboard and mouse I/O. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript TableEditor. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the TableEditor is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/xoattrib - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { // created here, too, in case load order is wrong, but main routines are required - SocialCalc = {}; - } - -// ************************************* -// -// Table Editor class: -// -// ************************************* - -// Constructor: - -SocialCalc.TableEditor = function(context) { - - var scc = SocialCalc.Constants; - - // Properties: - - this.context = context; // editing context - this.toplevel = null; // top level HTML element for this table editor - this.fullgrid = null; // rendered editing context - - this.noEdit = false; // if true, disable all edit UI and make read-only - - this.width = null; - this.tablewidth = null; - this.height = null; - this.tableheight = null; - - this.inputBox = null; - this.inputEcho = null; - this.verticaltablecontrol = null; - this.horizontaltablecontrol = null; - - this.logo = null; - - this.cellhandles = null; - - // Dynamic properties: - - this.timeout = null; // if non-null, timer id for position calculations - this.busy = false; // true when executing command, calculating, etc. - this.ensureecell = false; // if true, ensure ecell is visible after timeout - this.deferredCommands = []; // commands to execute after busy, in form: {cmdstr: "cmds", saveundo: t/f} - - this.gridposition = null; // screen coords of full grid - this.headposition = null; // screen coords of upper left of grid within header rows - this.firstscrollingrow = null; // row number of top row in last (the scrolling) pane - this.firstscrollingrowtop = null; // position of top row in last (the scrolling) pane - this.lastnonscrollingrow = null; // row number of last displayed row in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblerow = null; // used for paging down - this.firstscrollingcol = null; // column number of top col in last (the scrolling) pane - this.firstscrollingcolleft = null; // position of top col in last (the scrolling) pane - this.lastnonscrollingcol = null; // col number of last displayed column in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblecol = null; // used for paging right - - this.rowpositions = []; // screen positions of the top of some rows - this.colpositions = []; // screen positions of the left side of some rows - this.rowheight = []; // size in pixels of each row when last checked, or null/undefined, for page up - this.colwidth = []; // size in pixels of each column when last checked, or null/undefined, for page left - - this.ecell = null; // either null or {coord: c, row: r, col: c} - this.state = "start"; // the keyboard states: see EditorProcessKey - - this.workingvalues = {}; // values used during keyboard editing, etc. - - // Constants: - - this.imageprefix = scc.defaultImagePrefix; // URL prefix for images (e.g., "/images/sc") - this.idPrefix = scc.defaultTableEditorIDPrefix; - this.pageUpDnAmount = scc.defaultPageUpDnAmount; // number of rows to move cursor on PgUp/PgDn keys (numeric) - - // Callbacks - - // recalcFunction: if present, function(editor) {...}, called to do a recalc - // Default (sheet.RecalcSheet) does all the right stuff. - - this.recalcFunction = function(editor) { - if (editor.context.sheetobj.RecalcSheet) { - editor.context.sheetobj.RecalcSheet(SocialCalc.EditorSheetStatusCallback, editor); - } - else return null; - }; - - // ctrlkeyFunction: if present, function(editor, charname) {...}, called to handle ctrl-V, etc., at top level - // Returns true (pass through for continued processing) or false (stop processing this key). - - this.ctrlkeyFunction = function(editor, charname) { - - var ta, ha, cell, position, cmd, sel, cliptext; - - switch (charname) { - case "[ctrl-c]": - case "[ctrl-x]": - ta = editor.pasteTextarea; - ta.value = ""; - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = (position.left-1)+"px"; - ta.style.top = (position.top-1)+"px"; - } - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - else { - sel = editor.ecell.coord; - } - - // get what to copy to clipboard - cliptext = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), "tab"); - - if (charname == "[ctrl-c]" || editor.noEdit || (SocialCalc.Callbacks.IsCellEditable && (!SocialCalc.Callbacks.IsCellEditable(editor)))) { // if copy or cut but in no edit - cmd = "copy "+sel+" formulas"; - } - else { // [ctrl-x] - cmd = "cut "+sel+" formulas"; - } - editor.EditorScheduleSheetCommands(cmd, true, false); // queue up command to put on SocialCalc clipboard - - /* Copy as HTML: This fails rather badly as it won't paste into Notepad as tab-delimited text. Oh well. - - ha = editor.pasteHTMLarea; - if (editor.range.hasrange) { - cell = SocialCalc.GetEditorCellElement(editor, editor.range.top, editor.range.left); - } - else { - cell = SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - } - if (cell) position = SocialCalc.GetElementPosition(cell.element); - - if (ha) { - if (position) { - ha.style.left = (position.left-1)+"px"; - ha.style.top = (position.top-1)+"px"; - } - ha.style.visibility="visible"; - cliptext = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), "html"); - ha.innerHTML = cliptext.replace(/]*>[\d\D]*?<\/tr\b[^>]*>/i, ''); - ha.focus(); - - var range = document.body.createControlRange(); - range.addElement(ha.childNodes[0]); - range.select(); - } - */ - ta.style.display = "block"; - ta.value = cliptext; // must follow "block" setting for Webkit - ta.focus(); - ta.select(); - window.setTimeout(function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; // in case not loaded - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - /* - var ha = editor.pasteHTMLarea; - if (ha) { - ha.blur(); - ha.innerHTML = ''; - ha.style.visibility = 'hidden'; - } - */ - var ta = editor.pasteTextarea; - ta.blur(); - ta.style.display = "none"; - SocialCalc.KeyboardFocus(); - }, 200); - - return true; - - case "[ctrl-v]": - if (editor.noEdit) return true; // not if no edit - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - var showPasteTextArea = function() { - ta = editor.pasteTextarea; - ta.value = ""; - - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = (position.left-1)+"px"; - ta.style.top = (position.top-1)+"px"; - } - ta.style.display = "block"; - ta.value = ""; // must follow "block" setting for Webkit - ta.focus(); - }; - - ha = editor.pasteHTMLarea; - if (ha) { - /* Pasting via HTML - Currently IE only */ - ha.style.visibility = "visible"; - ha.focus(); - } - else { - showPasteTextArea(); - } - window.setTimeout(function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var value = null; - var isPasteSameAsClipboard = false; - - ha = editor.pasteHTMLarea; - if (ha) { - /* IE: We append a U+FFFC to every TD that's not the last of its row, - * then we obtain innerText, then turn U+FFFC back to \t, - * thereby preserving the cell separations (which gets discarded - * if we simply paste via textarea. - */ - var _ObjectReplacementCharacter_ = String.fromCharCode(0xFFFC); - var html = ha.innerHTML; - - if (html.search(/<(?![Bb][Rr])[A-Za-z]/) >= 0) { - /* HTML Paste: Mark TDs with U+FFFC accordingly.. */ - ha.innerHTML = html.replace( - /(?:<\/[Tt][Dd]>)/g, - _ObjectReplacementCharacter_ - ); - } - else { - /* Text Paste: In IE, \t is transformed into  , so replace them with U+FFFC. */ - ha.innerHTML = html.replace( - /&[Nn][Bb][Ss][Pp];/g, - _ObjectReplacementCharacter_ - ); - } - - value = ha.innerText.replace(new RegExp(_ObjectReplacementCharacter_, 'g'), '\t'); - - ha.innerHTML = ''; - ha.blur(); - ha.style.visibility = "hidden"; - } - else { - var ta = editor.pasteTextarea; - value = ta.value; - ta.blur(); - ta.style.display = "none"; - } - - value = value.replace(/\r\n/g, "\n").replace(/\n?$/, '\n'); - var clipstr = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.Clipboard.clipboard, "tab"); - if (value == clipstr || (value.length-clipstr.length==1 && value.substring(0,value.length-1)==clipstr)) { - isPasteSameAsClipboard = true; - } - - var cmd = ""; - // pastes SocialCalc clipboard if did a Ctrl-C and contents still the same - // Webkit adds an extra blank line, so need to allow for that - if (!isPasteSameAsClipboard) { - cmd = "loadclipboard "+ - SocialCalc.encodeForSave(SocialCalc.ConvertOtherFormatToSave(value, "tab")) + "\n"; - } - var cr; - if (editor.range.hasrange) { - cr = SocialCalc.crToCoord(editor.range.left, editor.range.top); - } - else { - cr = editor.ecell.coord; - } - cmd += "paste "+cr+" formulas"; - editor.EditorScheduleSheetCommands(cmd, true, false); - SocialCalc.KeyboardFocus(); - }, 200); - return true; - - case "[ctrl-z]": - editor.EditorScheduleSheetCommands("undo", true, false); - return false; - - case "[ctrl-s]": // !!!! temporary hack - window.setTimeout( - function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var sheet = editor.context.sheetobj; - var cell = sheet.GetAssuredCell(editor.ecell.coord); - var ntvf = cell.nontextvalueformat ? sheet.valueformats[cell.nontextvalueformat-0] || "" : ""; - var newntvf = window.prompt("Advanced Feature:\n\nCustom Numeric Format or Command", ntvf); - if (newntvf != null) { // not cancelled - if (newntvf.match(/^cmd:/)) { - cmd = newntvf.substring(4); // execute as command - } - else if (newntvf.match(/^edit:/)) { - cmd = newntvf.substring(5); // execute as command - if (SocialCalc.CtrlSEditor) { - SocialCalc.CtrlSEditor(cmd); - } - return; - } - else { - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - else { - sel = editor.ecell.coord; - } - cmd = "set "+sel+" nontextvalueformat "+newntvf; - } - editor.EditorScheduleSheetCommands(cmd, true, false); - } - }, - 200); - return false; - - default: - break; - } - return true; - }; - - // Set sheet's status callback: - - context.sheetobj.statuscallback = SocialCalc.EditorSheetStatusCallback; - context.sheetobj.statuscallbackparams = this; // this object: the table editor object - - - // StatusCallback: all values are called at appropriate times, add with unique name, delete when done - // - // Each value must be an object in the form of: - // - // func: function(editor, status, arg, params) {...}, - // params: params value to call func with - // - // The values for status and arg are: - // - // all the SocialCalc RecalcSheet statuscallbacks, including: - // - // calccheckdone, calclist length - // calcorder, {coord: coord, total: celllist length, count: count} - // calcstep, {coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds - // - // the command callbacks, like cmdstart and cmdend - // cmdendnorender - // - // calcstart, null - // moveecell, new ecell coord - // rangechange, "coord:coord" or "coord" or "" - // specialkey, keyname ("[esc]") - // - - this.StatusCallback = {}; - - - this.MoveECellCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.RangeChangeCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.SettingsCallbacks = {}; // See SocialCalc.SaveEditorSettings - - // Set initial cursor - - this.ecell = {coord: "A1", row: 1, col: 1}; - context.highlights[this.ecell.coord] = "cursor"; - - // Initialize range data - // Range has at least hasrange (true/false). - // It may also have: anchorcoord, anchorrow, anchorcol, top, bottom, left, and right. - - this.range = {hasrange: false}; - - // Initialize range2 data (used to show selections, such as for move) - // Range2 has at least hasrange (true/false). - // It may also have: top, bottom, left, and right. - - this.range2 = {hasrange: false}; - - } - -// Methods: - -SocialCalc.TableEditor.prototype.CreateTableEditor = function(width, height) {return SocialCalc.CreateTableEditor(this, width, height);}; -SocialCalc.TableEditor.prototype.ResizeTableEditor = function(width, height) {return SocialCalc.ResizeTableEditor(this, width, height);}; - -SocialCalc.TableEditor.prototype.SaveEditorSettings = function() {return SocialCalc.SaveEditorSettings(this);}; -SocialCalc.TableEditor.prototype.LoadEditorSettings = function(str, flags) {return SocialCalc.LoadEditorSettings(this, str, flags);}; - -SocialCalc.TableEditor.prototype.EditorRenderSheet = function() {SocialCalc.EditorRenderSheet(this);}; -SocialCalc.TableEditor.prototype.EditorScheduleSheetCommands = function(cmdstr, saveundo, ignorebusy) {SocialCalc.EditorScheduleSheetCommands(this, cmdstr, saveundo, ignorebusy);}; -SocialCalc.TableEditor.prototype.ScheduleSheetCommands = function(cmdstr, saveundo) { - this.context.sheetobj.ScheduleSheetCommands(cmdstr, saveundo); - }; -SocialCalc.TableEditor.prototype.SheetUndo = function() { - this.context.sheetobj.SheetUndo(); - }; -SocialCalc.TableEditor.prototype.SheetRedo = function() { - this.context.sheetobj.SheetRedo(); - }; -SocialCalc.TableEditor.prototype.EditorStepSet = function(status, arg) {SocialCalc.EditorStepSet(this, status, arg);}; -SocialCalc.TableEditor.prototype.GetStatuslineString = function(status, arg, params) {return SocialCalc.EditorGetStatuslineString(this, status, arg, params);}; - -SocialCalc.TableEditor.prototype.EditorMouseRegister = function() {return SocialCalc.EditorMouseRegister(this);}; -SocialCalc.TableEditor.prototype.EditorMouseUnregister = function() {return SocialCalc.EditorMouseUnregister(this);}; -SocialCalc.TableEditor.prototype.EditorMouseRange = function(coord) {return SocialCalc.EditorMouseRange(this, coord);}; - -SocialCalc.TableEditor.prototype.EditorProcessKey = function(ch, e) {return SocialCalc.EditorProcessKey(this, ch, e);}; -SocialCalc.TableEditor.prototype.EditorAddToInput = function(str, prefix) {return SocialCalc.EditorAddToInput(this, str, prefix);}; -SocialCalc.TableEditor.prototype.DisplayCellContents = function() {return SocialCalc.EditorDisplayCellContents(this);}; -SocialCalc.TableEditor.prototype.EditorSaveEdit = function(text) {return SocialCalc.EditorSaveEdit(this, text);}; -SocialCalc.TableEditor.prototype.EditorApplySetCommandsToRange = function(cmdline, type) {return SocialCalc.EditorApplySetCommandsToRange(this, cmdline, type);}; - -SocialCalc.TableEditor.prototype.MoveECellWithKey = function(ch) {return SocialCalc.MoveECellWithKey(this, ch);}; -SocialCalc.TableEditor.prototype.MoveECell = function(newcell) {return SocialCalc.MoveECell(this, newcell);}; -SocialCalc.TableEditor.prototype.ReplaceCell = function(cell, row, col) {SocialCalc.ReplaceCell(this, cell, row, col);}; -SocialCalc.TableEditor.prototype.UpdateCellCSS = function(cell, row, col) {SocialCalc.UpdateCellCSS(this, cell, row, col);}; -SocialCalc.TableEditor.prototype.SetECellHeaders = function(selected) {SocialCalc.SetECellHeaders(this, selected);}; -SocialCalc.TableEditor.prototype.EnsureECellVisible = function() {SocialCalc.EnsureECellVisible(this);}; -SocialCalc.TableEditor.prototype.RangeAnchor = function(coord) {SocialCalc.RangeAnchor(this, coord);}; -SocialCalc.TableEditor.prototype.RangeExtend = function(coord) {SocialCalc.RangeExtend(this, coord);}; -SocialCalc.TableEditor.prototype.RangeRemove = function() {SocialCalc.RangeRemove(this);}; -SocialCalc.TableEditor.prototype.Range2Remove = function() {SocialCalc.Range2Remove(this);}; - -SocialCalc.TableEditor.prototype.FitToEditTable = function() {SocialCalc.FitToEditTable(this);}; -SocialCalc.TableEditor.prototype.CalculateEditorPositions = function() {SocialCalc.CalculateEditorPositions(this);}; -SocialCalc.TableEditor.prototype.ScheduleRender = function() {SocialCalc.ScheduleRender(this);}; -SocialCalc.TableEditor.prototype.DoRenderStep = function() {SocialCalc.DoRenderStep(this);}; -SocialCalc.TableEditor.prototype.SchedulePositionCalculations = function() {SocialCalc.SchedulePositionCalculations(this);}; -SocialCalc.TableEditor.prototype.DoPositionCalculations = function() {SocialCalc.DoPositionCalculations(this);}; -SocialCalc.TableEditor.prototype.CalculateRowPositions = function(panenum, positions, sizes) {return SocialCalc.CalculateRowPositions(this, panenum, positions, sizes);}; -SocialCalc.TableEditor.prototype.CalculateColPositions = function(panenum, positions, sizes) {return SocialCalc.CalculateColPositions(this, panenum, positions, sizes);}; - -SocialCalc.TableEditor.prototype.ScrollRelative = function(vertical, amount) {SocialCalc.ScrollRelative(this, vertical, amount);}; -SocialCalc.TableEditor.prototype.ScrollRelativeBoth = function(vamount, hamount) {SocialCalc.ScrollRelativeBoth(this, vamount, hamount);}; -SocialCalc.TableEditor.prototype.PageRelative = function(vertical, direction) {SocialCalc.PageRelative(this, vertical, direction);}; -SocialCalc.TableEditor.prototype.LimitLastPanes = function() {SocialCalc.LimitLastPanes(this);}; - -SocialCalc.TableEditor.prototype.ScrollTableUpOneRow = function() {return SocialCalc.ScrollTableUpOneRow(this);}; -SocialCalc.TableEditor.prototype.ScrollTableDownOneRow = function() {return SocialCalc.ScrollTableDownOneRow(this);}; -SocialCalc.TableEditor.prototype.ScrollTableLeftOneCol = function() {return SocialCalc.ScrollTableLeftOneCol(this);}; -SocialCalc.TableEditor.prototype.ScrollTableRightOneCol = function() {return SocialCalc.ScrollTableRightOneCol(this);}; - -// Functions: - -SocialCalc.CreateTableEditor = function(editor, width, height) { - - var scc = SocialCalc.Constants; - var AssignID = SocialCalc.AssignID; - - editor.toplevel = document.createElement("div"); - editor.width = width; - editor.height = height; - - editor.griddiv = document.createElement("div"); - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width=editor.tablewidth+"px"; - editor.griddiv.style.height=editor.tableheight+"px"; - editor.griddiv.style.overflow="hidden"; - editor.griddiv.style.cursor="default"; - if (scc.cteGriddivClass) editor.griddiv.className = scc.cteGriddivClass; - AssignID(editor, editor.griddiv, "griddiv"); - - editor.FitToEditTable(); - - editor.EditorRenderSheet(); - - editor.griddiv.appendChild(editor.fullgrid); - - editor.verticaltablecontrol = new SocialCalc.TableControl(editor, true, editor.tableheight); - editor.verticaltablecontrol.CreateTableControl(); - AssignID(editor, editor.verticaltablecontrol.main, "tablecontrolv"); - - editor.horizontaltablecontrol = new SocialCalc.TableControl(editor, false, editor.tablewidth); - editor.horizontaltablecontrol.CreateTableControl(); - AssignID(editor, editor.horizontaltablecontrol.main, "tablecontrolh"); - - var table, tbody, tr, td, img, anchor, ta, ha; - - table = document.createElement("table"); - editor.layouttable = table; - table.cellSpacing = 0; - table.cellPadding = 0; - AssignID(editor, table, "layouttable"); - - tbody = document.createElement("tbody"); - table.appendChild(tbody); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - td.appendChild(editor.griddiv); - tr.appendChild(td); - td = document.createElement("td"); - //td.appendChild(editor.verticaltablecontrol.main); - tr.appendChild(td); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - //td.appendChild(editor.horizontaltablecontrol.main); - tr.appendChild(td); - - td = document.createElement("td"); // logo display: Required by CPAL License for this code! - //td.style.background="url("+editor.imageprefix+"logo.gif) no-repeat center center"; - td.innerHTML = "
    "; - tr.appendChild(td); - editor.logo = td; - AssignID(editor, editor.logo, "logo"); - SocialCalc.TooltipRegister(td.firstChild.firstChild, "SocialCalc", null); - - editor.toplevel.appendChild(editor.layouttable); - - if (!editor.noEdit) { - editor.inputEcho = new SocialCalc.InputEcho(editor); - AssignID(editor, editor.inputEcho.main, "inputecho"); - } - - editor.cellhandles = new SocialCalc.CellHandles(editor); - - ta = document.createElement("textarea"); // used for ctrl-c/ctrl-v where an invisible text area is needed - SocialCalc.setStyles(ta, "display:none;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);"); - ta.value = ""; - editor.pasteTextarea = ta; - AssignID(editor, editor.pasteTextarea, "pastetextarea"); - - if (navigator.userAgent.match(/Safari\//) &&!navigator.userAgent.match(/Chrome\//)) { // special code for Safari 5 change - window.removeEventListener('beforepaste', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforepaste', SocialCalc.SafariPasteFunction, false); - window.removeEventListener('beforecopy', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforecopy', SocialCalc.SafariPasteFunction, false); - window.removeEventListener('beforecut', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforecut', SocialCalc.SafariPasteFunction, false); - } - - editor.toplevel.appendChild(editor.pasteTextarea); - - var div = document.createElement("div"); - div.innerHTML = '
    '; - if (div.firstChild.nodeType == 1) { - /* We are running in IE -- Using HTML-based area for Ctrl-V */ - ha = document.createElement("div"); // used for ctrl-v where an invisible html area is needed - editor.pasteHTMLarea = ha; - editor.toplevel.appendChild(editor.pasteHTMLarea); - ha.contentEditable = true; - AssignID(editor, editor.pasteHTMLarea, "pastehtmlarea"); - SocialCalc.setStyles(ha, "display:block;visibility:hidden;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);overflow:hidden"); - } - - SocialCalc.MouseWheelRegister(editor.toplevel, {WheelMove: SocialCalc.EditorProcessMouseWheel, editor: editor}); - - if (SocialCalc.HasTouch) { - SocialCalc.TouchRegister(editor.toplevel, {Swipe: SocialCalc.EditorProcessSwipe, - DoubleTap: SocialCalc.EditorProcessDoubleTap, - SingleTap: SocialCalc.EditorProcessSingleTap, - editor: editor}); - } - - if (editor.inputBox) { // this seems to fix an obscure bug with Firefox 2 Mac where Ctrl-V doesn't get fired right - if (editor.inputBox.element) { - editor.inputBox.element.focus(); - editor.inputBox.element.blur(); - } - } - SocialCalc.KeyboardSetFocus(editor); - - // do status reporting things - - SocialCalc.EditorSheetStatusCallback(null, "startup", null, editor); - - // done - - return editor.toplevel; - - } - -// Special code needed for change that occurred with Safari 5 that made paste not work for some reason - -SocialCalc.SafariPasteFunction = function(e) { - e.preventDefault(); - } - -// -// SocialCalc.ResizeTableEditor(editor, width, height) -// -// Move things around as appropriate and resize -// - -SocialCalc.ResizeTableEditor = function(editor, width, height) { - - var scc = SocialCalc.Constants; - - editor.width = width; - editor.height = height; - - editor.toplevel.style.width = width+"px"; - editor.toplevel.style.height = height+"px"; - - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width=editor.tablewidth+"px"; - editor.griddiv.style.height=editor.tableheight+"px"; - - editor.verticaltablecontrol.main.style.height = editor.tableheight + "px"; - editor.horizontaltablecontrol.main.style.width = editor.tablewidth + "px"; - - editor.FitToEditTable(); - - editor.ScheduleRender(); - - return; - - } - -// -// str = SaveEditorSettings(editor) -// -// Returns a string representation of the pane settings, etc. -// -// The format is: -// -// version:1.0 -// rowpane:panenumber:firstnum:lastnum -// colpane:panenumber:firstnum:lastnum -// ecell:coord -- if set -// range:anchorcoord:top:bottom:left:right -- if set -// -// You can add additional values to be saved by using editor.SettingsCallbacks: -// -// editor.SettingsCallbacks["item-name"] = {save: savefunction, load: loadfunction} -// -// where savefunction(editor, "item-name") returns a string with the new lines to be added to the saved settings -// which include the trailing newlines, and loadfunction(editor, "item-name", line, flags) is given the line to process -// without the trailing newlines. -// - -SocialCalc.SaveEditorSettings = function(editor) { - - var i, setting; - var context = editor.context; - var range = editor.range; - var result = ""; - - result += "version:1.0\n"; - - for (i=0; i'; - } - - return sstr; - - } - - -// -// Mouse stuff -// - -SocialCalc.EditorMouseInfo = { - - // The registeredElements array is used to identify editor grid in which the mouse is doing things. - - // One item for each active editor, each an object with: - // .element, .editor - - registeredElements: [], - - editor: null, // editor being processed (between mousedown and mouseup) - element: null, // element being processed - - ignore: false, // if true, mousedowns are ignored - - mousedowncoord: "", // coord where mouse went down for drag range - mouselastcoord: "", // coord where mouse last was during drag - mouseresizecol: "", // col being resized - mouseresizeclientx: null, // where resize started - mouseresizedisplay: null // element tracking new size - } - -// -// EditorMouseRegister(editor) -// - -SocialCalc.EditorMouseRegister = function(editor) { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var element = editor.fullgrid; - var i; - - for (i=0; i=^".indexOf(inputtext.slice(-1))>=0 && inputtext.slice(0,1)=="=") || - (inputtext == "=")) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { // if in pointing operation - if (coord) { - if (range.hasrange) { - var sheetpref = (wval.currentsheet == wval.startsheet)?"":wval.currentsheet+"!"; - editor.inputBox.SetText(wval.partialexpr + sheetpref+ SocialCalc.crToCoord(range.left, range.top) + ":" + sheetpref + - SocialCalc.crToCoord(range.right, range.bottom)); - } - else { - var sheetpref = (wval.currentsheet == wval.startsheet)?"":wval.currentsheet+"!"; - editor.inputBox.SetText(wval.partialexpr + sheetpref+coord); - } - } - } - else { // not in point -- done editing - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - } - break; - - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - break; - } - } - -SocialCalc.ProcessEditorMouseMove = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat(editor, result); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - if (result.coord!=mouseinfo.mouselastcoord) { - if (!e.shiftKey && !editor.range.hasrange) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - } - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - mouseinfo.mouselastcoord = result.coord; - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.ProcessEditorMouseUp = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result) return; - - if (!result.coord) result.coord = editor.ecell.coord; - - if (editor.range.hasrange) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - else if (result.coord && result.coord!=mouseinfo.mousedowncoord) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.ProcessEditorMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.ProcessEditorMouseUp, true); - } - else if (element.detachEvent) { // IE - element.detachEvent("onlosecapture", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmouseup", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmousemove", SocialCalc.ProcessEditorMouseMove); - element.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - - } - - -SocialCalc.ProcessEditorColsizeMouseDown = function(e, ele, result) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - mouseinfo.mouseresizecolnum = result.coltoresize; // remember col being resized - mouseinfo.mouseresizecol = SocialCalc.rcColname(result.coltoresize); - mouseinfo.mousedownclientx = clientX; - - var sizedisplay = document.createElement("div"); - mouseinfo.mouseresizedisplay = sizedisplay; - sizedisplay.style.width = "auto"; - sizedisplay.style.position = "absolute"; - sizedisplay.style.zIndex = 100; - sizedisplay.style.top = (editor.headposition.top+0)+"px"; - sizedisplay.style.left = editor.colpositions[result.coltoresize]+"px"; - sizedisplay.innerHTML = ''+ - '
     
    '+ - editor.context.colwidth[mouseinfo.mouseresizecolnum] + '
    '; - SocialCalc.setStyles(sizedisplay.firstChild.lastChild.firstChild.childNodes[0], "filter:alpha(opacity=85);opacity:.85;"); // so no warning msg with Firefox about filter - - editor.toplevel.appendChild(sizedisplay); - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mousemove", SocialCalc.ProcessEditorColsizeMouseMove, true); // capture everywhere - document.addEventListener("mouseup", SocialCalc.ProcessEditorColsizeMouseUp, true); // capture everywhere - } - else if (editor.toplevel.attachEvent) { // IE 5+ - editor.toplevel.setCapture(); - editor.toplevel.attachEvent("onmousemove", SocialCalc.ProcessEditorColsizeMouseMove); - editor.toplevel.attachEvent("onmouseup", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.attachEvent("onlosecapture", SocialCalc.ProcessEditorColsizeMouseUp); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - } - - -SocialCalc.ProcessEditorColsizeMouseMove = function(e) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - var newsize = (editor.context.colwidth[mouseinfo.mouseresizecolnum]-0) + (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) newsize = SocialCalc.Constants.defaultMinimumColWidth; - - var sizedisplay = mouseinfo.mouseresizedisplay; -// sizedisplay.firstChild.lastChild.firstChild.childNodes[1].firstChild.innerHTML = newsize+""; -// sizedisplay.firstChild.lastChild.firstChild.childNodes[0].firstChild.style.width = (newsize-2)+"px"; - sizedisplay.innerHTML = ''+ - '
     
    '+ - newsize + '
    '; - SocialCalc.setStyles(sizedisplay.firstChild.lastChild.firstChild.childNodes[0], "filter:alpha(opacity=85);opacity:.85;"); // so no warning msg with Firefox about filter - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.ProcessEditorColsizeMouseUp = function(e) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - element = mouseinfo.element; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.ProcessEditorColsizeMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.ProcessEditorColsizeMouseUp, true); - } - else if (editor.toplevel.detachEvent) { // IE - editor.toplevel.detachEvent("onlosecapture", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.detachEvent("onmouseup", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.detachEvent("onmousemove", SocialCalc.ProcessEditorColsizeMouseMove); - editor.toplevel.releaseCapture(); - } - - var newsize = (editor.context.colwidth[mouseinfo.mouseresizecolnum]-0) + (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) newsize = SocialCalc.Constants.defaultMinimumColWidth; - - editor.EditorScheduleSheetCommands("set "+mouseinfo.mouseresizecol+" width "+newsize, true, false); - - if (editor.timeout) window.clearTimeout(editor.timeout); - editor.timeout = window.setTimeout(SocialCalc.FinishColsize, 1); // wait - Firefox 2 has a bug otherwise with next mousedown - - return false; - - } - - -SocialCalc.FinishColsize = function() { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; - - editor.toplevel.removeChild(mouseinfo.mouseresizedisplay); - mouseinfo.mouseresizedisplay = null; - -// editor.FitToEditTable(); -// editor.EditorRenderSheet(); -// editor.SchedulePositionCalculations(); - - mouseinfo.editor = null; - - return; - - } - -// -// Handle auto-repeat of dragging the cursor into the borders of the sheet -// - -SocialCalc.AutoRepeatInfo = { - - timer: null, // timer object for repeating - mouseinfo: null, // result from SocialCalc.GridMousePosition - repeatinterval: 1000, // milliseconds to wait between repeats - editor: null, // editor object to use when it repeats - repeatcallback: null // used instead of default when repeating (e.g., for cellhandles) - // called as: repeatcallback(newcoord, direction) - -}; - -// Control auto-repeat. If mouseinfo==null, cancel. - -SocialCalc.SetDragAutoRepeat = function(editor, mouseinfo, callback) { - - var repeatinfo = SocialCalc.AutoRepeatInfo; - var coord, direction; - - repeatinfo.repeatcallback = callback; // null in regular case - - if (!mouseinfo) { // cancel - if (repeatinfo.timer) { // If was repeating, stop - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - repeatinfo.mouseinfo = null; - return; // done - } - - repeatinfo.editor = editor; - - if (repeatinfo.mouseinfo) { // check for change while repeating - if (mouseinfo.rowheader || mouseinfo.rowfooter) { - if (mouseinfo.row != repeatinfo.mouseinfo.row) { // changed row while dragging sidewards - coord = SocialCalc.crToCoord(editor.ecell.col, mouseinfo.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } - else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } - else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } - else { - editor.MoveECell(coord); - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } - else if (mouseinfo.colheader || mouseinfo.colfooter) { - if (mouseinfo.col != repeatinfo.mouseinfo.col) { // changed col while dragging vertically - coord = SocialCalc.crToCoord(mouseinfo.col, editor.ecell.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } - else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } - else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } - else { - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } - } - - repeatinfo.mouseinfo = mouseinfo; - - if (mouseinfo.distance < 5) repeatinfo.repeatinterval = 333; - else if (mouseinfo.distance < 10) repeatinfo.repeatinterval = 250; - else if (mouseinfo.distance < 25) repeatinfo.repeatinterval = 100; - else if (mouseinfo.distance < 35) repeatinfo.repeatinterval = 75; - else { // too far - stop repeating - if (repeatinfo.timer) { // if repeating, cancel it - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - return; - } - - if (!repeatinfo.timer) { // start if not already running - repeatinfo.timer = window.setTimeout(SocialCalc.DragAutoRepeat, repeatinfo.repeatinterval); - } - - return; - - } - -// -// DragAutoRepeat() -// - -SocialCalc.DragAutoRepeat = function() { - - var repeatinfo = SocialCalc.AutoRepeatInfo; - var mouseinfo = repeatinfo.mouseinfo; - - var direction, coord, cr; - - if (mouseinfo.rowheader) direction = "left"; - else if (mouseinfo.rowfooter) direction = "right"; - else if (mouseinfo.colheader) direction = "up"; - else if (mouseinfo.colfooter) direction = "down"; - - if (repeatinfo.repeatcallback) { - cr = SocialCalc.coordToCr(repeatinfo.editor.ecell.coord); - if (direction == "left" && cr.col > 1) cr.col--; - else if (direction == "right") cr.col++; - else if (direction == "up" && cr.row > 1) cr.row--; - else if (direction == "down") cr.row++; - coord = SocialCalc.crToCoord(cr.col, cr.row); - repeatinfo.repeatcallback(coord, direction); - } - else { - coord = repeatinfo.editor.MoveECellWithKey("[a"+direction+"]shifted"); - if (coord) repeatinfo.editor.EditorMouseRange(coord); - } - - repeatinfo.timer = window.setTimeout(SocialCalc.DragAutoRepeat, repeatinfo.repeatinterval); - - } - -// -// Handling Clicking -// - -SocialCalc.ProcessEditorDblClick = function(e) { - - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var mobj; - - if (mouseinfo.ignore) return; // ignore this - - for (mobj=null; !mobj && ele; ele=ele.parentNode) { // go up tree looking for one of our elements - mobj = SocialCalc.LookupElement(ele, mouseinfo.registeredElements); - } - if (!mobj) { - mouseinfo.editor = null; - return; // not one of our elements - } - - editor = mobj.editor; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); - if (!result || !result.coord) return; // not within cell area - ignore - - mouseinfo.editor = editor; // remember for later - mouseinfo.element = ele; - range = editor.range; - - sheetobj = editor.context.sheetobj; - - switch (editor.state) { - case "start": - SocialCalc.EditorOpenCellEdit(editor); - break; - - case "input": - break; - - default: - break; - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.EditorOpenCellEdit = function(editor) { - - var wval; - - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no input box, so no editing (happens on noEdit) - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - if (editor.inputBox.element.disabled) return true; // multi-line: ignore - if (editor.inputBox.element.style.display == 'none') { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "editecell", null, editor.StatusCallback[f].params); - } - return true; // no inputBox display, so no editing - } - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - - editor.state = "inputboxdirect"; - - editor.inputBox.SetText(""); - editor.inputBox.DisplayCellContents(); - editor.inputBox.Select("end"); - wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - - return; - - } - - -SocialCalc.EditorProcessKey = function(editor, ch, e) { - - var result, cell, cellobj, valueinfo, fch, coord, inputtext, f; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - var range = editor.range; - - if (typeof ch != "string") ch = ""; - - switch (editor.state) { - case "start": - if (e.shiftKey && ch.substr(0,2)=="[a") { - ch = ch + "shifted"; - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a" || ch.substr(0,3)=="[pg" || ch=="[home]") { - result = editor.MoveECellWithKey(ch); - return !result; - } - if (ch=="[del]" || ch=="[backspace]") { - if (!editor.noEdit) { - editor.EditorApplySetCommandsToRange("empty", ""); - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - break; - } - if (ch=="[esc]") { - if (range.hasrange) { - editor.RangeRemove(); - editor.MoveECell(range.anchorcoord); - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "specialkey", ch, editor.StatusCallback[f].params); - } - } - return false; - } - - if (ch=="[f2]") { - if (editor.noEdit) return true; - SocialCalc.EditorOpenCellEdit(editor); - return false; - } - - if ((ch.length>1 && ch.substr(0,1)=="[") || ch.length==0) { // some control key - if (editor.ctrlkeyFunction && ch.length>0) { - return editor.ctrlkeyFunction(editor, ch); - } - else { - return true; - } - } - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no inputBox so no editing - if (editor.inputBox.element.style.display == 'none') { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "editecell", ch, editor.StatusCallback[f].params); - } - return true; // no inputBox display, so no editing - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - editor.inputBox.element.disabled = false; // make sure editable - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - editor.inputBox.SetText(ch); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (editor.inputBox.skipOne) return false; // ignore a key already handled - if (ch=="[esc]" || ch=="[enter]" || ch=="[tab]" || (ch && ch.substr(0,2)=="[a")) { - if (("(+-*/,:!&<>=^".indexOf(inputtext.slice(-1))>=0 && inputtext.slice(0,1)=="=") || - (inputtext == "=")) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { // if in pointing operation - if (e.shiftKey && ch.substr(0,2)=="[a") { - ch = ch + "shifted"; - } - coord = editor.MoveECellWithKey(ch); - if (coord) { - if (range.hasrange) { - editor.inputBox.SetText(wval.partialexpr + SocialCalc.crToCoord(range.left, range.top) + ":" + - SocialCalc.crToCoord(range.right, range.bottom)); - } - else { - editor.inputBox.SetText(wval.partialexpr + coord); - } - return false; - } - } - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch != "[esc]") { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a") { - editor.MoveECellWithKey(ch); - } - } - else { - editor.inputBox.DisplayCellContents(); - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - break; - } - if (wval.partialexpr && ch=="[backspace]") { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - return false; - } - if (ch=="[f2]") return false; - if (range.hasrange) { - editor.RangeRemove(); - } - editor.MoveECell(wval.ecoord); - if (wval.partialexpr) { - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - wval.partialexpr = ""; // not pointing - } - return true; - - case "inputboxdirect": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (ch=="[esc]" || ch=="[enter]" || ch=="[tab]") { - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch == "[esc]") { - editor.inputBox.DisplayCellContents(); - } - else { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a") { - editor.MoveECellWithKey(ch); - } - } - break; - } - if (ch=="[f2]") return false; - return true; - - case "skip-and-start": - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - return false; - - default: - return true; - } - - return false; - - } - -SocialCalc.EditorAddToInput = function(editor, str, prefix) { - - var wval = editor.workingvalues; - - if (editor.noEdit) return; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - - switch (editor.state) { - case "start": - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.element.disabled = false; // make sure editable and overwrite old - editor.inputBox.Focus(); - editor.inputBox.SetText((prefix||"")+str); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.focus(); - if (wval.partialexpr) { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - editor.inputBox.SetText(editor.inputBox.GetText()+str); - break; - - default: - break; - } - - } - - -SocialCalc.EditorDisplayCellContents = function(editor) { - - if (editor.inputBox) editor.inputBox.DisplayCellContents(); - - } - -SocialCalc.EditorSaveEdit = function(editor, text) { - - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - type = "text t"; - value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord)+""; - if (value == oldvalue) { // no change - return; - } - if ("'"+value == oldvalue) { - return; - } - - if (SocialCalc.Callbacks.editAutoSave) { - console.log("editAutoSave"); - SocialCalc.Callbacks.editAutoSave(); - } - - - fch = value.charAt(0); - if (fch=="=" && value.indexOf("\n")==-1) { - type = "formula"; - value = value.substring(1); - } - else if (fch=="'") { - type = "text t"; - value = value.substring(1); - } - else if (value.length==0) { - type = "empty"; - } - else { - valueinfo = SocialCalc.DetermineValueType(value) - if (valueinfo.type=="n" && value==(valueinfo.value+"")) { // see if don't need "constant" - type = "value n"; - } - else if (valueinfo.type.charAt(0)=="t") { - type = "text "+valueinfo.type; - } - else if (valueinfo.type=="") { - type = "text t"; - } - else { - type = "constant "+valueinfo.type+" "+valueinfo.value; - } - } - - if (type.charAt(0)=="t") { // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && (wval.currentsheet != wval.startsheet)) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " +wval.startsheetid; - control.ExecuteWorkBookControlCommand( { cmdtype:"wcmd", id:"0", cmdstr: cmdstr} - ,false) - } - - cmdline = "set "+wval.ecoord+" "+type+" "+value; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - - } - -// -// SocialCalc.EditorApplySetCommandsToRange(editor, cmd) -// -// Takes ecell or range and does a "set" command with cmd. -// - -SocialCalc.EditorApplySetCommandsToRange = function(editor, cmd) { - - var cell, row, col, line, errortext; - - var sheetobj = editor.context.sheetobj; - var ecell = editor.ecell; - var range = editor.range; - - if (range.hasrange) { - coord = SocialCalc.crToCoord(range.left, range.top)+":"+SocialCalc.crToCoord(range.right, range.bottom); - line = "set "+coord+" "+cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } - else { - line = "set "+ecell.coord+" "+cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } - - editor.DisplayCellContents(); - - } - -SocialCalc.EditorProcessMouseWheel = function(event, delta, mousewheelinfo, wobj) { - - if (wobj.functionobj.editor.busy) return; // ignore if busy - - if (delta > 0) { - wobj.functionobj.editor.ScrollRelative(true, -1); - } - if (delta < 0) { - wobj.functionobj.editor.ScrollRelative(true, +1); - } - - } - -// -// GridMousePosition(editor, clientX, clientY) -// -// Returns an object with row and col numbers and coord (spans handled for coords), -// and rowheader/colheader true if in header (where coord will be undefined). -// If in colheader, will return coltoresize if on appropriate place in col header. -// Also, there is rowfooter (on right) and colfooter (on bottom). -// In row/col header/footer, returns "distance" as pixels over the edge. -// - -SocialCalc.GridMousePosition = function(editor, clientX, clientY) { - - var row, col, colpane; - var result = {}; - - for (row=1; rowclientY) { - break; - } - } - for (col=1; colclientX) { - break; - } - } - - result.row = row; - result.col = col; - - if (editor.headposition) { - if (clientX < editor.headposition.left && clientX >= editor.gridposition.left) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } - else if (clientY < editor.headposition.top && clientY > editor.gridposition.top) { // > because of sizing row - result.colheader = true; - result.distance = editor.headposition.top - clientY; - result.coltoresize = col-(editor.colpositions[col]+editor.colwidth[col]/2>clientX?1:0) || 1; - for (colpane=0; colpane= editor.context.colpanes[colpane].first && - result.coltoresize <= editor.context.colpanes[colpane].last) { // visible column - return result; - } - } - delete result.coltoresize; - return result; - } - else if (clientX >= editor.verticaltablecontrol.controlborder) { - result.rowfooter = true; - result.distance = clientX - editor.verticaltablecontrol.controlborder; - return result; - } - else if (clientY >= editor.horizontaltablecontrol.controlborder) { - result.colfooter = true; - result.distance = clientY - editor.horizontaltablecontrol.controlborder; - return result; - } - else if (clientX < editor.gridposition.left) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } - else if (clientY <= editor.gridposition.top) { - result.colheader = true; - result.distance = editor.headposition.top - clientY; - return result; - } - else { - result.coord = SocialCalc.crToCoord(result.col, result.row); - if (editor.context.cellskip[result.coord]) { // handle skipped cells - result.coord = editor.context.cellskip[result.coord]; - } - return result; - } - } - - return null; - - } - -// -// GetEditorCellElement(editor, row, col) -// -// Returns an object with element, the table cell element in the DOM that corresponds to row and column, -// as well as rowpane and colpane, the panes with the cell. -// If no such element, then returns null; -// - -SocialCalc.GetEditorCellElement = function(editor, row, col) { - - var rowpane, colpane, c, coord; - var rowindex = 0; - var colindex = 0; - - for (rowpane=0; rowpane= editor.context.rowpanes[rowpane].first && row <= editor.context.rowpanes[rowpane].last) { - for (colpane=0; colpane= editor.context.colpanes[colpane].first && col <= editor.context.colpanes[colpane].last) { - rowindex += row - editor.context.rowpanes[rowpane].first + 2; - for (c=editor.context.colpanes[colpane].first; c<=col; c++) { - coord=editor.context.cellskip[SocialCalc.crToCoord(c,row)]; - if (!coord || !editor.context.CoordInPane(coord, rowpane, colpane)) // don't count col-spanned cells - colindex++; - } - return { - element: editor.griddiv.firstChild.lastChild.childNodes[rowindex].childNodes[colindex], - rowpane: rowpane, colpane: colpane}; - } - for (c=editor.context.colpanes[colpane].first; c<=editor.context.colpanes[colpane].last; c++) { - coord=editor.context.cellskip[SocialCalc.crToCoord(c,row)]; - if (!coord || !editor.context.CoordInPane(coord, rowpane, colpane)) // don't count col-spanned cells - colindex++; - } - colindex += 1; - } - } - rowindex += editor.context.rowpanes[rowpane].last - editor.context.rowpanes[rowpane].first + 1 + 1; - } - - return null; -} - -// -// cellcoord = MoveECellWithKey(editor, ch) -// -// Processes an arrow key, etc., moving the edit cell. -// If not a movement key, returns null. -// - -SocialCalc.MoveECellWithKey = function(editor, ch) { - - var coord, row, col, cell; - var shifted = false; - - if (!editor.ecell) { - return null; - } - - if (ch.slice(-7)=="shifted") { - ch = ch.slice(0,-7); - shifted = true; - } - - row = editor.ecell.row; - col = editor.ecell.col; - cell = editor.context.sheetobj.cells[editor.ecell.coord]; - - switch (ch) { - case "[adown]": - row += (cell && cell.rowspan) || 1; - break; - case "[aup]": - row--; - break; - case "[pgdn]": - row += editor.pageUpDnAmount - 1 + ((cell && cell.rowspan) || 1); - break; - case "[pgup]": - row -= editor.pageUpDnAmount; - break; - case "[aright]": - col += (cell && cell.colspan) || 1; - break; - case "[aleft]": - col--; - break; - case "[home]": - row = 1; - col = 1; - break; - default: - return null; - } - - if (!editor.range.hasrange) { - if (shifted) - editor.RangeAnchor(); - } - - coord = editor.MoveECell(SocialCalc.crToCoord(col, row)); - - if (editor.range.hasrange) { - if (shifted) - editor.RangeExtend(); - else - editor.RangeRemove(); - } - - return coord; - - } - -// -// cellcoord = MoveECell(editor, newecell) -// -// Takes a coordinate and returns the new edit cell coordinate (which may be -// different if newecell is covered by a span). -// - -SocialCalc.MoveECell = function(editor, newcell) { - - var cell, f; - - var highlights = editor.context.highlights; - - if (editor.ecell) { - if (editor.ecell.coord==newcell) return newcell; // already there - don't do anything and don't tell anybody - - if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast('ecell', { original: editor.ecell.coord, ecell: newcell }); - } - - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - delete highlights[editor.ecell.coord]; - if (editor.range2.hasrange && - editor.ecell.row>=editor.range2.top && editor.ecell.row<=editor.range2.bottom && - editor.ecell.col>=editor.range2.left && editor.ecell.col<=editor.range2.right) { - highlights[editor.ecell.coord] = "range2"; - } - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders(""); // set to regular col/rowname styles - editor.cellhandles.ShowCellHandles(false); - } - else if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast('ecell', { ecell: newcell }); - } - newcell = editor.context.cellskip[newcell] || newcell; - editor.ecell = SocialCalc.coordToCr(newcell); - editor.ecell.coord = newcell; - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - highlights[newcell] = "cursor"; - - for (f in editor.MoveECellCallback) { // let others know - editor.MoveECellCallback[f](editor); - } - - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders("selected"); - - for (f in editor.StatusCallback) { // let status line, etc., know - editor.StatusCallback[f].func(editor, "moveecell", newcell, editor.StatusCallback[f].params); - } - - if (editor.busy) { - editor.ensureecell = true; // wait for when not busy - } - else { - editor.ensureecell = false; - editor.EnsureECellVisible(); - } - - return newcell; - - } - -SocialCalc.EnsureECellVisible = function(editor) { - - var vamount = 0; - var hamount = 0; - - if (editor.ecell.row > editor.lastnonscrollingrow) { - if (editor.ecell.row < editor.firstscrollingrow) { - vamount = editor.ecell.row - editor.firstscrollingrow; - } - else if (editor.ecell.row > editor.lastvisiblerow) { - vamount = editor.ecell.row - editor.lastvisiblerow; - } - } - if (editor.ecell.col > editor.lastnonscrollingcol) { - if (editor.ecell.col < editor.firstscrollingcol) { - hamount = editor.ecell.col - editor.firstscrollingcol; - } - else if (editor.ecell.col > editor.lastvisiblecol) { - hamount = editor.ecell.col- editor.lastvisiblecol; - } - } - - if (vamount!=0 || hamount!=0) { - editor.ScrollRelativeBoth(vamount, hamount); - } - else { - editor.cellhandles.ShowCellHandles(true); - } - - } - -SocialCalc.ReplaceCell = function(editor, cell, row, col) { - - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell(row, col, cell.rowpane, cell.colpane, true, null); - if (newelement) { - // Don't use a real element and replaceChild, which seems to have focus issues with IE, Firefox, and speed issues - cell.element.innerHTML = newelement.innerHTML; - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a]!="cssText") - cell.element.style[a] = newelement.style[a]; - } - } - } - - -SocialCalc.UpdateCellCSS = function(editor, cell, row, col) { - - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell(row, col, cell.rowpane, cell.colpane, true, null); - if (newelement) { - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a]!="cssText") - cell.element.style[a] = newelement.style[a]; - } - } - } - - -SocialCalc.SetECellHeaders = function(editor, selected) { - - var ecell = editor.ecell; - var context = editor.context; - - var rowpane, colpane, first, last; - var rowindex = 0; - var colindex = 0; - var headercell; - - if (!ecell) return; - - for (rowpane=0; rowpane= first && ecell.row <= last) { - headercell = editor.fullgrid.childNodes[1].childNodes[2+rowindex+ecell.row-first].childNodes[0]; - if (headercell) { - if (context.classnames) headercell.className=context.classnames[selected+"rowname"]; - if (context.explicitStyles) headercell.style.cssText=context.explicitStyles[selected+"rowname"]; - headercell.style.verticalAlign="top"; // to get around Safari making top of centered row number be - // considered top of row (and can't get position in Safari) - } - } - rowindex += last - first + 1 + 1; - } - - for (colpane=0; colpane= first && ecell.col <= last) { - headercell = editor.fullgrid.childNodes[1].childNodes[1].childNodes[1+colindex+ecell.col-first]; - if (headercell) { - if (context.classnames) headercell.className=context.classnames[selected+"colname"]; - if (context.explicitStyles) headercell.style.cssText=context.explicitStyles[selected+"colname"]; - } - } - colindex += last - first + 1 + 1; - } - } - -// -// RangeAnchor(editor, ecoord) -// -// Sets the anchor of a range to ecoord (or ecell if missing). -// - -SocialCalc.RangeAnchor = function(editor, ecoord) { - - if (editor.range.hasrange) { - editor.RangeRemove(); - } - - editor.RangeExtend(ecoord); - - } - -// -// RangeExtend(editor, ecoord) -// -// Sets the other corner of the range to ecoord or, if missing, ecell. -// - -SocialCalc.RangeExtend = function(editor, ecoord) { - - var a, cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - var ecell; - if (ecoord) { - ecell = SocialCalc.coordToCr(ecoord); - ecell.coord = ecoord; - } - else ecell = editor.ecell; - - if (!ecell) return; // just in case - if (SocialCalc.Constants.SCNoRanging) return; - - if (!range.hasrange) { // called without RangeAnchor... - range.anchorcoord = ecell.coord; - range.anchorrow = ecell.row; - range.top = ecell.row; - range.bottom = ecell.row; - range.anchorcol = ecell.col; - range.left = ecell.col; - range.right = ecell.col; - range.hasrange = true; - } - - if (range.anchorrow < ecell.row) { - range.top = range.anchorrow; - range.bottom = ecell.row; - } - else { - range.top = ecell.row; - range.bottom = range.anchorrow; - } - if (range.anchorcol < ecell.col) { - range.left = range.anchorcol; - range.right = ecell.col; - } - else { - range.left = ecell.col; - range.right = range.anchorcol; - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - highlights[coord] = "unrange"; - break; - case "range2": - highlights[coord] = "unrange2"; - break; - } - } - - for (row=range.top; row<=range.bottom; row++) { - for (col=range.left; col<=range.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange": - highlights[coord] = "range"; - break; - case "cursor": - break; - case "unrange2": - default: - highlights[coord] = "newrange"; - break; - } - } - } - - for (row=range2.top; range2.hasrange && row<=range2.bottom; row++) { - for (col=range2.left; col<=range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange2": - highlights[coord] = "range2"; - break; - case "range": - case "newrange": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - - switch (highlights[coord]) { - case "unrange": - delete highlights[coord]; - break; - case "newrange": - highlights[coord] = "range"; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "range": - case "range2": - case "cursor": - continue; - } - - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - - } - - for (f in editor.RangeChangeCallback) { // let others know - editor.RangeChangeCallback[f](editor); - } - - // create range/coord string and do status callback - - coord = SocialCalc.crToCoord(editor.range.left, editor.range.top); - if (editor.range.left!=editor.range.right || editor.range.top!=editor.range.bottom) { // more than one cell - coord += ":" + SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "rangechange", coord, editor.StatusCallback[f].params); - } - - return; - - } - -// -// RangeRemove(editor) -// -// Turns off the range. -// - -SocialCalc.RangeRemove = function(editor) { - - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - if (!range.hasrange && !range2.hasrange) return; - - for (row=range2.top; range2.hasrange && row<=range2.bottom; row++) { - for (col=range2.left; col<=range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "range": - highlights[coord] = "newrange2"; - break; - case "range2": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - delete highlights[coord]; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell=SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range.hasrange = false; - - for (f in editor.RangeChangeCallback) { // let others know - editor.RangeChangeCallback[f](editor); - } - - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "rangechange", "", editor.StatusCallback[f].params); - } - - return; - - } - -// -// Range2Remove(editor) -// -// Turns off the range2. -// - -SocialCalc.Range2Remove = function(editor) { - - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range2 = editor.range2; - - if (!range2.hasrange) return; - - for (coord in highlights) { - switch (highlights[coord]) { - case "range2": - delete highlights[coord]; - break; - case "range": - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell=SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range2.hasrange = false; - - return; - - } - -// -// FitToEditTable(editor) -// -// Figure out (through column width declarations and approximation of pixels per row) -// how many rendered rows and columns you need to be at least a little larger than -// the editor's editing area. -// - -SocialCalc.FitToEditTable = function(editor) { - - var colnum, colname, colwidth, totalwidth, totalrows, rowpane, needed; - - var context=editor.context; - var sheetobj=context.sheetobj; - var sheetcolattribs=sheetobj.colattribs; - - // Calculate column width data - - totalwidth=context.showRCHeaders ? context.rownamewidth-0 : 0; - for (colpane=0; colpane0)) ? (colwidth-0) : 10; - } - } - - for (colnum=context.colpanes[colpane].first; colnum<=10000; colnum++) { //!!! max for safety, but makes that col max!!! - colname=SocialCalc.rcColname(colnum); - colwidth = sheetobj.colattribs.width[colname] || sheetobj.attribs.defaultcolwidth || SocialCalc.Constants.defaultColWidth; - if (colwidth=="blank" || colwidth=="auto") colwidth=""; - totalwidth+=(colwidth && ((colwidth-0)>0)) ? (colwidth-0) : 10; - if (totalwidth > editor.tablewidth) break; - } - - context.colpanes[colpane].last = colnum; - - // Calculate row height data - - totalrows=context.showRCHeaders ? 1 : 0; - for (rowpane=0; rowpaneeditor.gridposition.top+editor.tableheight) break; - } - editor.lastvisiblerow = i-1; - - editor.colpositions = []; - for (colpane=0; colpaneeditor.gridposition.left+editor.tablewidth) break; - } - editor.lastvisiblecol = i-1; - - editor.firstscrollingrow = editor.context.rowpanes[editor.context.rowpanes.length-1].first; - editor.firstscrollingrowtop = editor.rowpositions[editor.firstscrollingrow] || editor.headposition.top; - editor.lastnonscrollingrow = editor.context.rowpanes.length-1 > 0 ? - editor.context.rowpanes[editor.context.rowpanes.length-2].last : 0; - editor.firstscrollingcol = editor.context.colpanes[editor.context.colpanes.length-1].first; - editor.firstscrollingcolleft = editor.colpositions[editor.firstscrollingcol] || editor.headposition.left; - editor.lastnonscrollingcol = editor.context.colpanes.length-1 > 0 ? - editor.context.colpanes[editor.context.colpanes.length-2].last : 0; - - // Now do the table controls - - editor.verticaltablecontrol.ComputeTableControlPositions(); - editor.horizontaltablecontrol.ComputeTableControlPositions(); - } - -// -// ScheduleRender(editor) -// -// Do a series of timeouts to render the sheet, wait for background layout and -// rendering by the browser, and then update editor visuals, sliders, etc. -// - -SocialCalc.ScheduleRender = function(editor) { - - if (editor.timeout) window.clearTimeout(editor.timeout); // in case called more than once, just use latest - - SocialCalc.EditorSheetStatusCallback(null, "schedrender", null, editor); - SocialCalc.EditorStepInfo.editor = editor; - editor.timeout = window.setTimeout(SocialCalc.DoRenderStep, 1); - - } - -// DoRenderStep() -// - -SocialCalc.DoRenderStep = function() { - - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - editor.EditorRenderSheet(); - - SocialCalc.EditorSheetStatusCallback(null, "renderdone", null, editor); - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - - } - -// -// SocialCalc.SchedulePositionCalculations(editor) -// - -SocialCalc.SchedulePositionCalculations = function(editor) { - - SocialCalc.EditorStepInfo.editor = editor; - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - - } - -// DoPositionCalculations(editor) -// -// Update editor visuals, sliders, etc. -// -// Note: Only call this after the DOM objects have been modified and rendered! -// - -SocialCalc.DoPositionCalculations = function() { - - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - var ok = false; - try { - editor.CalculateEditorPositions(); - ok = true; - } catch (e) {} - - if (!ok) { - if (typeof $ != 'undefined') { - $(window).trigger('resize'); - setTimeout( SocialCalc.DoPositionCalculations, 400); - } - return; /* Workaround IE6 partial-initialized-DOM bug */ - } - - editor.verticaltablecontrol.PositionTableControlElements(); - editor.horizontaltablecontrol.PositionTableControlElements(); - - SocialCalc.EditorSheetStatusCallback(null, "doneposcalc", null, editor); - - if (editor.ensureecell && editor.ecell && !editor.deferredCommands.length) { // don't do if deferred cmd to execute - editor.ensureecell = false; - editor.EnsureECellVisible(); // this could cause another redisplay - } - - editor.cellhandles.ShowCellHandles(true); - - -//!!! Need to now check to see if this positioned controls out of the editing area -//!!! (such as when there is a large wrapped cell and it pushes the pane boundary too far down). - - if (SocialCalc.Callbacks.broadcast) SocialCalc.Callbacks.broadcast('ask.ecell'); - } - -SocialCalc.CalculateRowPositions = function(editor, panenum, positions, sizes) { - - var toprow, rowpane, rownum, offset, trowobj, cellposition; - - var context=editor.context; - var sheetobj=context.sheetobj; - - var tbodyobj; - - if (!context.showRCHeaders) throw("Needs showRCHeaders=true"); - - tbodyobj=editor.fullgrid.lastChild; - - // Calculate start of this pane as row in this table: - - toprow = 2; - for (rowpane=0; rowpane1 ? context.rowpanes[vplen-2].last+1 : 1; // don't scroll past here - if (context.rowpanes[vplen-1].first+vamount < vlimit) { // limit amount - vamount = (-context.rowpanes[vplen-1].first) + vlimit; - } - - var hplen=context.colpanes.length; - var hlimit = hplen>1 ? context.colpanes[hplen-2].last+1 : 1; // don't scroll past here - - if (context.colpanes[hplen-1].first+hamount < hlimit) { // limit amount - hamount = (-context.colpanes[hplen-1].first) + hlimit; - } - - if (SocialCalc.IsScrollPossible && !SocialCalc.IsScrollPossible(editor.context.sheetobj.attribs.lastrow, editor.context.sheetobj.attribs.lastcol,context.rowpanes[vplen-1].first, -context.colpanes[hplen-1].first,vamount,hamount)) { - return; - } - - if ((vamount==1 || vamount==-1) && hamount==0) { // special case quick scrolls - if (vamount==1) { - editor.ScrollTableUpOneRow(); - } - else { - editor.ScrollTableDownOneRow(); - } - if (editor.ecell) editor.SetECellHeaders("selected"); - editor.SchedulePositionCalculations(); - return; - } - - - // Do a gross move and render - - if (vamount!=0 || hamount!=0) { - context.rowpanes[vplen-1].first += vamount; - context.rowpanes[vplen-1].last += vamount; - context.colpanes[hplen-1].first += hamount; - context.colpanes[hplen-1].last += hamount; - editor.FitToEditTable(); - editor.ScheduleRender(); - } - - } - - -// PageRelative(editor, vertical, direction) -// -// If vertical true, pages up(direction is -)/down(+), else left(-)/right(+) - -SocialCalc.PageRelative = function(editor, vertical, direction) { - - var context=editor.context; - var panes=vertical ? "rowpanes" : "colpanes"; - var lastpane=context[panes][context[panes].length-1]; - var lastvisible=vertical ? "lastvisiblerow" : "lastvisiblecol"; - var sizearray=vertical ? editor.rowheight : editor.colwidth; - var defaultsize=vertical ? SocialCalc.Constants.defaultAssumedRowHeight : SocialCalc.Constants.defaultColWidth; - var size, newfirst, totalsize, current; - - if (direction > 0) { // down/right - newfirst = editor[lastvisible]; - if (newfirst == lastpane.first) newfirst += 1; // move at least one - } - else { - if (vertical) { // calculate amount to scroll - totalsize = editor.tableheight - (editor.firstscrollingrowtop - editor.gridposition.top); - } - else { - totalsize = editor.tablewidth - (editor.firstscrollingcolleft - editor.gridposition.left); - } - totalsize -= sizearray[editor[lastvisible]] > 0 ? sizearray[editor[lastvisible]] : defaultsize; - - for (newfirst=lastpane.first-1; newfirst>0; newfirst--) { - size = sizearray[newfirst] > 0 ? sizearray[newfirst] : defaultsize; - if (totalsize < size) break; - totalsize -= size; - } - - current = lastpane.first; - if (newfirst >= current) newfirst = current-1; // move at least 1 - if (newfirst < 1) newfirst = 1; - } - - lastpane.first = newfirst; - lastpane.last = newfirst+1; - editor.LimitLastPanes(); - editor.FitToEditTable(); - editor.ScheduleRender(); - - } - -// LimitLastPanes(editor) -// -// Makes sure that the "first" of the last panes isn't before the last of the previous pane -// - -SocialCalc.LimitLastPanes = function(editor) { - - var context=editor.context; - var plen; - - plen = context.rowpanes.length; - if (plen>1 && context.rowpanes[plen-1].first <= context.rowpanes[plen-2].last) - context.rowpanes[plen-1].first = context.rowpanes[plen-2].last+1; - - plen = context.colpanes.length; - if (plen>1 && context.colpanes[plen-1].first <= context.colpanes[plen-2].last) - context.colpanes[plen-1].first = context.colpanes[plen-2].last+1; - - } - -SocialCalc.ScrollTableUpOneRow = function(editor) { - - var toprow, rowpane, rownum, colnum, colpane, cell, oldrownum, maxspan, newbottomrow, newrow, oldchild, bottomrownum; - var rowneedsrefresh={}; - - var context=editor.context; - var sheetobj=context.sheetobj; - var tableobj=editor.fullgrid; - - var tbodyobj; - - tbodyobj=tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane=0; rowpanemaxrowspan) maxrowspan=cell.rowspan; - } - } - - if (maxrowspan>1) { - for (rownum=1; rownum= context.rowpanes[rowpane].last) break; - newrow=context.RenderRow(rownum+oldrownum, rowpane); - oldchild=tbodyobj.childNodes[toprow+rownum-1]; - tbodyobj.replaceChild(newrow,oldchild); - } - } - - // if added a row that includes rowspans from above, update the size of those to include new row - - bottomrownum=context.rowpanes[rowpane].last; - - for (colpane=0; colpane1) rowneedsrefresh[rownum]=true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow=context.RenderRow(rownum, rowpane); - oldchild=tbodyobj.childNodes[(toprow+(rownum-context.rowpanes[rowpane].first))]; - tbodyobj.replaceChild(newrow,oldchild); - } - - return tableobj; - } - -SocialCalc.ScrollTableDownOneRow = function(editor) { - - var toprow, rowpane, rownum, colnum, colpane, cell, newrownum, maxspan, newbottomrow, newrow, oldchild, bottomrownum; - var rowneedsrefresh={}; - - var context=editor.context; - var sheetobj=context.sheetobj; - var tableobj=editor.fullgrid; - - var tbodyobj; - - tbodyobj=tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane=0; rowpanemaxrowspan) maxrowspan=cell.rowspan; - } - } - - if (maxrowspan>1) { - for (rownum=1; rownum context.rowpanes[rowpane].last) break; - newrow=context.RenderRow(rownum+newrownum, rowpane); - oldchild=tbodyobj.childNodes[toprow+rownum]; - tbodyobj.replaceChild(newrow,oldchild); - } - } - - // if last row now includes rowspans or rowspans from above, update the size of those to remove deleted row - - bottomrownum=context.rowpanes[rowpane].last; - - for (colpane=0; colpane1) { - rowneedsrefresh[bottomrownum]=true; // need to update this row - continue; - } - coord=context.cellskip[SocialCalc.crToCoord(colnum, bottomrownum)]; - if (!coord) continue; // only look at spanned cells - rownum=context.coordToCR[coord].row-0; - if (rownum==bottomrownum || - rownum1) rowneedsrefresh[rownum]=true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow=context.RenderRow(rownum, rowpane); - oldchild=tbodyobj.childNodes[(toprow+(rownum-context.rowpanes[rowpane].first))]; - tbodyobj.replaceChild(newrow,oldchild); - } - - return tableobj; - } - - -// ************************************* -// -// InputBox class: -// -// This class deals with the text box for editing cell contents. -// It mainly controls a user input box for typed content and is used to interact with -// the keyboard code, etc. -// -// You can use this inside a formula bar control of some sort. -// You create this after you have created a table editor object (but not necessarily -// done the CreateTableEditor method). -// -// When the user starts typing text, or double-clicks on a cell, this object -// comes into play. -// -// The element given when this is first constructed should be an input HTMLElement or -// something that acts like one. Check the code here to see what is done to it. -// -// ************************************* - -SocialCalc.InputBox = function(element, editor) { - - if (!element) return; // invoked without enough data to work - - this.element = element; // the input element associated with this InputBox - this.editor = editor; // the TableEditor this belongs to - this.inputEcho = null; - - editor.inputBox = this; - - element.onmousedown = SocialCalc.InputBoxOnMouseDown; - - editor.MoveECellCallback.formulabar = function(e){ - if (e.state!="start") { return; }// if not in normal keyboard mode don't replace formula bar - editor.inputBox.DisplayCellContents(e.ecell.coord); - }; - } - - -// Methods: - -SocialCalc.InputBox.prototype.DisplayCellContents = function(coord) {SocialCalc.InputBoxDisplayCellContents(this, coord);}; -SocialCalc.InputBox.prototype.ShowInputBox = function(show) {this.editor.inputEcho.ShowInputEcho(show);}; -SocialCalc.InputBox.prototype.GetText = function() {return this.element.value;}; -SocialCalc.InputBox.prototype.SetText = function(newtext) { - if (!this.element) return; - this.element.value=newtext; - - if (!SocialCalc.Constants.SCNoInputEcho) { - this.editor.inputEcho.SetText(newtext+"_"); - } - -}; -SocialCalc.InputBox.prototype.Focus = function() {SocialCalc.InputBoxFocus(this);}; -SocialCalc.InputBox.prototype.Blur = function() {return this.element.blur();}; -SocialCalc.InputBox.prototype.Select = function(t) { - if (!this.element) return; - switch (t) { - case "end": - if (document.selection && document.selection.createRange) { - /* IE 4+ - Safer than setting .selectionEnd as it also works for Textareas. */ - var range = document.selection.createRange().duplicate(); - range.moveToElementText(this.element); - range.collapse(false); - range.select(); - } else if (this.element.selectionStart!=undefined) { - this.element.selectionStart=this.element.value.length; - this.element.selectionEnd=this.element.value.length; - } - break; - } - }; - -// Functions: - -// -// SocialCalc.InputBoxDisplayCellContents(inputbox, coord) -// -// Sets input box to the contents of the specified cell (or ecell if null). -// - -SocialCalc.InputBoxDisplayCellContents = function(inputbox, coord) { - - var scc = SocialCalc.Constants; - - if (!inputbox) return; - if (!coord) coord = inputbox.editor.ecell.coord; - var text = SocialCalc.GetCellContents(inputbox.editor.context.sheetobj, coord); - if (text.indexOf("\n")!=-1) { - //text = scc.s_inputboxdisplaymultilinetext; - text = scc.s_inputboxdisplaynoteditable; - inputbox.element.disabled = true; - SocialCalc.ToggleInputLineButtons(false); - } - else if (!SocialCalc.Callbacks.IsCellEditable(inputbox.editor)) { - text = scc.s_inputboxdisplaynoteditable; - SocialCalc.ToggleInputLineButtons(false); - inputbox.element.disabled = true; - inputbox.element.style.display = "none"; - - } - else { - - var control = SocialCalc.GetCurrentWorkBookControl(); - var spreadsheet = control.workbook.spreadsheet; -cell=SocialCalc.GetEditorCellElement(inputbox.editor, inputbox.editor.ecell.row, inputbox.editor.ecell.col); - var left = "100px"; - var top = "100px"; - var width = 100; - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - left = (position.left-4)+"px"; - top = (position.top-3)+"px"; - width = cell.element.offsetWidth; - } -var ele = document.getElementById(spreadsheet.formulabarDiv.id); -if (ele) { -spreadsheet.spreadsheetDiv.removeChild(spreadsheet.formulabarDiv); -} -spreadsheet.formulabarDiv.style.left = left; -spreadsheet.formulabarDiv.style.top = top; -//spreadsheet.formulabarDiv.style.width = "30px"; -//spreadsheet.formulabarDiv.style.fontSize = "10px"; -spreadsheet.formulabarDiv.style.zIndex = 100; -spreadsheet.formulabarDiv.style.position = "absolute"; -var input = spreadsheet.formulabarDiv.firstChild; -input.style.fontSize="100%"; -//console.log("cell width ="+width) -input.size = ""+(width/8) - -input.style.borderBottomColor = "#306eff"; -input.style.borderBottomLeftRadius = "3px"; -input.style.borderBottomRightRadius = "3px"; -input.style.borderBottomStyle = "solid"; -input.style.borderBottomWidth = "2px"; -input.style.borderLeftColor = "#306eff"; -input.style.borderLeftStyle = "solid"; -input.style.borderLeftWidth = "2px"; -input.style.borderRightColor = "#306eff"; -input.style.borderRightStyle = "solid"; -input.style.borderRightWidth = "2px"; -input.style.borderTopColor = "#306eff"; -input.style.borderTopLeftRadius = "3px"; -input.style.borderTopRightRadius = "3px"; -input.style.borderTopStyle = "solid"; -input.style.borderTopWidth = "2px"; - - -//console.log("cell width ="+width) -input.size = ""+(width/9) - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - - - inputbox.element.disabled = false; - inputbox.element.style.display = "inline"; - SocialCalc.ToggleInputLineButtons(true); - - } - if (scc.SCNoQuoteInInputBox && (text.substring(0,1) == "'")) { - text = text.substring(1); - } - inputbox.SetText(text); - - } - -// -// SocialCalc.InputBoxFocus(inputbox) -// -// Call this to have the input box get the focus and respond to keystrokes -// but still pass them off to SocialCalc.ProcessKey. -// - -SocialCalc.InputBoxFocus = function(inputbox) { - - if (!inputbox) return; - inputbox.element.focus(); - var editor = inputbox.editor; - editor.state = "input"; - var wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - - }; - -// -// SocialCalc.InputBoxOnMouseDown(e) -// -// This is called when the input box gets the focus. It then responds to keystrokes -// and pass them off to SocialCalc.ProcessKey, but in a different editing state. -// - -SocialCalc.InputBoxOnMouseDown = function(e) { - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var wval = editor.workingvalues; - - switch (editor.state) { - case "start": - editor.state="inputboxdirect"; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.inputEcho.ShowInputEcho(true); - break; - - case "input": - wval.partialexpr = ""; // make sure not pointing - editor.MoveECell(wval.ecoord); - editor.state="inputboxdirect"; - SocialCalc.KeyboardFocus(); // may have come here from outside of grid - break; - - case "inputboxdirect": - break; - } - } - - -// ************************************* -// -// InputEcho class: -// -// This object creates and controls an element that echos what's in the InputBox during editing -// It is draggable. -// -// ************************************* - -SocialCalc.InputEcho = function(editor) { - - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - this.text = ""; // current value of what is displayed - this.interval = null; // timer handle - - this.container = null; // element containing main echo as well as prompt line - this.main = null; // main echo area - this.prompt = null; - - this.functionbox = null; // function chooser dialog - - this.container = document.createElement("div"); - SocialCalc.setStyles(this.container, "display:none;position:absolute;zIndex:10;"); - - this.topprompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) this.topprompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) SocialCalc.setStyles(this.topprompt, scc.defaultInputEchoPromptStyle); - this.topprompt.innerHTML = ""; - - this.container.appendChild(this.topprompt); - - - this.main = document.createElement("div"); - - if (scc.defaultInputEchoClass) this.main.className = scc.defaultInputEchoClass; - if (scc.defaultInputEchoStyle) SocialCalc.setStyles(this.main, scc.defaultInputEchoStyle); - - this.main.innerHTML = " "; - - this.container.appendChild(this.main); - - this.prompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) this.prompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) SocialCalc.setStyles(this.prompt, scc.defaultInputEchoPromptStyle); - this.prompt.innerHTML = ""; - - this.container.appendChild(this.prompt); - - SocialCalc.DragRegister(this.main, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: this.container}); - - editor.toplevel.appendChild(this.container); - - } - -// Methods: - -SocialCalc.InputEcho.prototype.ShowInputEcho = function(show) {return SocialCalc.ShowInputEcho(this, show);}; -SocialCalc.InputEcho.prototype.SetText = function(str) {return SocialCalc.SetInputEchoText(this, str);}; - -// Functions: - -SocialCalc.ShowInputEcho = function(inputecho, show) { - - var cell, position; - var editor = inputecho.editor; - - if (!editor) return; - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - if (show) { - editor.cellhandles.ShowCellHandles(false); - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - inputecho.container.style.left = (position.left-1)+"px"; - inputecho.container.style.top = (position.top-1)+"px"; - } - inputecho.container.style.display = "block"; - if (inputecho.interval) window.clearInterval(inputecho.interval); // just in case - inputecho.interval = window.setInterval(SocialCalc.InputEchoHeartbeat, 50); - - } - else { - if (inputecho.interval) window.clearInterval(inputecho.interval); - inputecho.container.style.display = "none"; - inputecho.topprompt.innerHTML = ""; - - } - -} - -SocialCalc.SetInputEchoText = function(inputecho, str) { - - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - var scc = SocialCalc.Constants; - var fname, fstr; - var newstr = SocialCalc.special_chars(str); - newstr = newstr.replace(/\n/g,"
    "); - - if (inputecho.text != newstr) { - inputecho.main.innerHTML = newstr; - inputecho.text = newstr; - } - - - - var parts = str.match(/.*[\+\-\*\/\&\^\<\>\=\,\(]([A-Za-z][A-ZA-z]\w*?)\([^\)]*$/); - if (str.charAt(0)=="=" && parts) { - fname = parts[1].toUpperCase(); - if (SocialCalc.Formula.FunctionList[fname]) { - SocialCalc.Formula.FillFunctionInfo(); // make sure filled - fstr = SocialCalc.special_chars(fname+"("+SocialCalc.Formula.FunctionArgString(fname)+")"); - } - else { - fstr = scc.ietUnknownFunction+fname; - } - if (inputecho.prompt.innerHTML != fstr) { - inputecho.prompt.innerHTML = fstr; - inputecho.prompt.style.display = "block"; - } - } - else if (inputecho.prompt.style.display != "none") { - inputecho.prompt.innerHTML = ""; - inputecho.prompt.style.display = "none"; - } - - var editor = inputecho.editor; - - - if (editor.workingvalues.currentsheet != - editor.workingvalues.startsheet) { - - var promptstr = "Editing:"+editor.workingvalues.startsheet+"!"+editor.workingvalues.ecoord; - if (promptstr != inputecho.topprompt.innerHTML) { - inputecho.topprompt.innerHTML = "Editing:"+editor.workingvalues.startsheet+"!"+editor.workingvalues.ecoord; - inputecho.topprompt.style.display = "block"; - } - } else { - if (inputecho.topprompt.style.display != "none") { - inputecho.topprompt.innerHTML = ""; - inputecho.topprompt.style.display = "none"; - } - } -} - -SocialCalc.InputEchoHeartbeat = function() { - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - if (editor.state == "inputboxdirect") { - editor.inputEcho.SetText(editor.inputBox.GetText()+"_"); - } - -} - -SocialCalc.InputEchoMouseDown = function(e) { - var event = e || window.event; - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (SocialCalc.Constants.SCNoInputEcho) { - return; - } - - -// if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 -// else event.cancelBubble = true; // IE 5+ -// if (event.preventDefault) event.preventDefault(); // DOM Level 2 -// else event.returnValue = false; // IE 5+ - - editor.inputBox.element.focus(); - -// return false; - }; - - -// ************************************* -// -// CellHandles class: -// -// This object creates and controls the elements around the cursor cell for dragging, etc. -// -// ************************************* - -SocialCalc.CellHandles = function(editor) { - - var scc = SocialCalc.Constants; - var functions; - - if (editor.noEdit) return; // leave us with nothing - if (scc.SCCellHandlesDisable) return; - - this.editor = editor; // the TableEditor this belongs to - - this.noCursorSuffix = false; - - this.movedmouse = false; // used to detect no-op - - this.draghandle = document.createElement("div"); - SocialCalc.setStyles(this.draghandle, "display:none;position:absolute;zIndex:8;border:1px solid white;width:4px;height:4px;fontSize:1px;backgroundColor:#0E93D8;cursor:default;"); - this.draghandle.innerHTML = ' '; - editor.toplevel.appendChild(this.draghandle); - SocialCalc.AssignID(editor, this.draghandle, "draghandle"); - - var imagetype = "png"; - if (navigator.userAgent.match(/MSIE 6\.0/)) { - imagetype = "gif"; - } - - this.dragpalette = document.createElement("div"); - SocialCalc.setStyles(this.dragpalette, "display:none;position:absolute;zIndex:8;width:90px;height:90px;fontSize:1px;textAlign:center;cursor:default;"+ - "backgroundImage:url("+SocialCalc.Constants.defaultImagePrefix+"drag-handles."+imagetype+");"); - this.dragpalette.innerHTML = ' '; - editor.toplevel.appendChild(this.dragpalette); - SocialCalc.AssignID(editor, this.dragpalette, "dragpalette"); - - this.dragtooltip = document.createElement("div"); - SocialCalc.setStyles(this.dragtooltip, "display:none;position:absolute;zIndex:9;border:1px solid black;width:100px;height:auto;fontSize:10px;backgroundColor:#FFFFFF;"); - this.dragtooltip.innerHTML = ' '; - editor.toplevel.appendChild(this.dragtooltip); - SocialCalc.AssignID(editor, this.dragtooltip, "dragtooltip"); - - this.fillinghandle = document.createElement("div"); - SocialCalc.setStyles(this.fillinghandle, "display:none;position:absolute;zIndex:9;border:1px solid black;width:auto;height:14px;fontSize:10px;backgroundColor:#FFFFFF;"); - this.fillinghandle.innerHTML = ' '; - editor.toplevel.appendChild(this.fillinghandle); - SocialCalc.AssignID(editor, this.fillinghandle, "fillinghandle"); - - if (this.draghandle.addEventListener) { // DOM Level 2 -- Firefox, et al - this.draghandle.addEventListener("mousemove", SocialCalc.CellHandlesMouseMoveOnHandle, false); - this.dragpalette.addEventListener("mousedown", SocialCalc.CellHandlesMouseDown, false); - this.dragpalette.addEventListener("mousemove", SocialCalc.CellHandlesMouseMoveOnHandle, false); - } - else if (this.draghandle.attachEvent) { // IE 5+ - this.draghandle.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMoveOnHandle); - this.dragpalette.attachEvent("onmousedown", SocialCalc.CellHandlesMouseDown); - this.dragpalette.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMoveOnHandle); - } - else { // don't handle this - throw "Browser not supported"; - } - - } - -// Methods: - -SocialCalc.CellHandles.prototype.ShowCellHandles = function(show, moveshow) {return SocialCalc.ShowCellHandles(this, show, moveshow);}; - -// Functions: - -SocialCalc.ShowCellHandles = function(cellhandles, show, moveshow) { - - var cell, cell2, position, position2; - var editor = cellhandles.editor; - var doshow = false; - var row, col, viewport; - - if (!editor) return; - - do { // a block that can you can "break" out of easily - - if (!show) break; - - row = editor.ecell.row; - col = editor.ecell.col; - - if (editor.state != "start") break; - if (row >= editor.lastvisiblerow) break; - if (col >= editor.lastvisiblecol) break; - if (row < editor.firstscrollingrow) break; - if (col < editor.firstscrollingcol) break; - - if (editor.rowpositions[row+1]+20>editor.horizontaltablecontrol.controlborder) { - break; - } - if (editor.rowpositions[row+1]-10editor.verticaltablecontrol.controlborder) { - break; - } - if (editor.colpositions[col+1]-30= left && x < left+width/2 && y >= top && y < top+height/2) { // upper left - if (len <= segtable[0]) v = -1; - else if (len <= segtable[1]) v = 1; - } - if (x >= left+width/2 && x < left+width && y >= top && y < top+height/2) { // upper right - if (len <= segtable[0]) v = -2; - else if (len <= segtable[1]) v = 2; - } - if (x >= left+width/2 && x < left+width && y >= top+height/2 && y < top+height) { // bottom right - if (len <= segtable[0]) v = -3; - else if (len <= segtable[1]) v = 3; - } - if (x >= left && x < left+width/2 && y >= top+height/2 && y < top+height) { // bottom right - if (len <= segtable[0]) v = -4; - else if (len <= segtable[1]) v = 4; - } - return v; - } - - while (true) { - if (x >= left && x < left+width/2 && y >= top && y < top+height/2) { // upper left - quadrant += "1"; - v = table[0]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - height = height/2; - continue; - } - if (x >= left+width/2 && x < left+width && y >= top && y < top+height/2) { // upper right - quadrant += "2"; - v = table[1]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - left = left+width; - height = height/2; - continue; - } - if (x >= left+width/2 && x < left+width && y >= top+height/2 && y < top+height) { // bottom right - quadrant += "3"; - v = table[2]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - left = left + width; - height = height/2; - top = top + height; - continue; - } - if (x >= left && x < left+width/2 && y >= top+height/2 && y < top+height) { // bottom right - quadrant += "4"; - v = table[3]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - height = height/2; - top = top + height; - continue; - } - return 0; // didn't match - } - -//addmsg((x-divWithMouseHit.offsetLeft)+","+(y-divWithMouseHit.offsetTop)+"="+quadrant+" "+v); - return v; - -} - -SocialCalc.CellHandlesHoverTimeout = function() { - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.timer) { - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - editor.cellhandles.ShowCellHandles(true, false); // hide move handles - -} - -SocialCalc.CellHandlesTooltipsTimeout = function() { - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - - var whichhandle = cellhandles.tooltipswhichhandle; - if (whichhandle==0) { // off of active part of palette - SocialCalc.CellHandlesHoverTimeout(); - return; - } - if (whichhandle==-3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillAllTooltip; - } - else if (whichhandle==3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillContentsTooltip; - } - else if (whichhandle==-2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteAllTooltip; - } - else if (whichhandle==-4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertAllTooltip; - } - else if (whichhandle==2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteContentsTooltip; - } - else if (whichhandle==4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertContentsTooltip; - } - else { - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - return; - } - - cellhandles.dragtooltip.style.display = "block"; - -} - -SocialCalc.CellHandlesMouseDown = function(e) { - - var scc = SocialCalc.Constants; - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (editor.busy) return; // don't do anything when busy (is this correct?) - - var cellhandles = editor.cellhandles; - - cellhandles.movedmouse = false; // detect no-op - - if (cellhandles.timer) { // cancel timer - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - - range = editor.range; - - var whichhandle = SocialCalc.SegmentDivHit([scc.CH_radius1, scc.CH_radius2], editor.cellhandles.dragpalette, clientX, clientY); - if (whichhandle==1 || whichhandle==-1 || whichhandle==0) { - cellhandles.ShowCellHandles(true, false); // hide move handles - return; - } - - mouseinfo.ignore = true; // stop other code from looking at the mouse - - if (whichhandle==-3) { - cellhandles.dragtype = "Fill"; -// mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==3) { - cellhandles.dragtype = "FillC"; -// mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==-2) { - cellhandles.dragtype = "Move"; -// mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } - else if (whichhandle==-4) { - cellhandles.dragtype = "MoveI"; -// mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==2) { - cellhandles.dragtype = "MoveC"; -// mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } - else if (whichhandle==4) { - cellhandles.dragtype = "MoveIC"; -// mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } - - cellhandles.filltype = null; - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - break; - - case "Move": - case "MoveI": - case "MoveC": - case "MoveIC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.RangeRemove(); - break; - - default: - return; // not for us - } - - cellhandles.fillinghandle.style.left = (clientX)+"px"; - cellhandles.fillinghandle.style.top = (clientY - 17)+"px"; - cellhandles.fillinghandle.innerHTML = scc.s_CHindicatorOperationLookup[cellhandles.dragtype]+ - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - cellhandles.ShowCellHandles(true, false); // hide move handles - cellhandles.mouseDown = true; - - mouseinfo.editor = editor; // remember for later - - coord = editor.ecell.coord; // start with cell with handles - - cellhandles.startingcoord = coord; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - - mouseinfo.mouselastcoord = coord; - - SocialCalc.KeyboardSetFocus(editor); - - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mousemove", SocialCalc.CellHandlesMouseMove, true); // capture everywhere - document.addEventListener("mouseup", SocialCalc.CellHandlesMouseUp, true); // capture everywhere - } - else if (cellhandles.draghandle.attachEvent) { // IE 5+ - cellhandles.draghandle.setCapture(); - cellhandles.draghandle.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMove); - cellhandles.draghandle.attachEvent("onmouseup", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.attachEvent("onlosecapture", SocialCalc.CellHandlesMouseUp); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - -SocialCalc.CellHandlesMouseMove = function(e) { - - var scc = SocialCalc.Constants; - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - var crstart, crend, cr, c, r; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat(editor, result, SocialCalc.CellHandlesDragAutoRepeat); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - - - cellhandles.movedmouse = true; // did move, so not no-op - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - - if (result.coord == cellhandles.startingcoord) { // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } - else { - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Down") { // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } - else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } - else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Down"; - } - else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Right"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - c = editor.range2.right - editor.range2.left + result.col; - r = editor.range2.bottom - editor.range2.top + result.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (result.coord == cellhandles.startingcoord) { // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } - else { - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Vertical") { // coerse to that - crend.col = editor.range2.left; - if (crend.row>=editor.range2.top && crend.row<=editor.range2.bottom+1) crend.row = editor.range2.bottom+2; - } - else { - crend.row = editor.range2.top; - if (crend.col>=editor.range2.left && crend.col<=editor.range2.right+1) crend.col = editor.range2.right+2; - } - } - else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Vertical"; - } - else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Horizontal"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - if (!cellhandles.filltype) { // no fill type - editor.RangeRemove(); - } - else { - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - } - break; - - } - - - cellhandles.fillinghandle.style.left = (clientX)+"px"; - cellhandles.fillinghandle.style.top = (clientY - 17)+"px"; - cellhandles.fillinghandle.innerHTML = scc.s_CHindicatorOperationLookup[cellhandles.dragtype]+ - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - mouseinfo.mouselastcoord = result.coord; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - -SocialCalc.CellHandlesDragAutoRepeat = function(coord, direction) { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - var crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - var crend = SocialCalc.coordToCr(coord); - - var newcoord, c, r; - - var vscroll = 0; - var hscroll = 0; - - if (direction == "left") hscroll = -1; - else if (direction == "right") hscroll = 1; - else if (direction == "up") vscroll = -1; - else if (direction == "down") vscroll = 1; - editor.ScrollRelativeBoth(vscroll, hscroll); - - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Down") { // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } - else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } - else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord!=mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - c = editor.range2.right - editor.range2.left + editor.ecell.col; - r = editor.range2.bottom - editor.range2.top + editor.ecell.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Vertical") { // coerse to that - crend.col = editor.range2.left; - if (crend.row>=editor.range2.top && crend.row<=editor.range2.bottom+1) crend.row = editor.range2.bottom+2; - } - else { - crend.row = editor.range2.top; - if (crend.col>=editor.range2.left && crend.col<=editor.range2.right+1) crend.col = editor.range2.right+2; - } - } - else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord!=mouseinfo.mouselastcoord) { - editor.MoveECell(newcoord); - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - } - - mouseinfo.mouselastcoord = newcoord; - - } - -SocialCalc.CellHandlesMouseUp = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval, cstr, cmdtype, cmdtype2; - var crstart, crend; - var sizec, sizer, deltac, deltar; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - mouseinfo.ignore = false; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - cellhandles.mouseDown = false; - cellhandles.noCursorSuffix = false; - - cellhandles.fillinghandle.style.display = "none"; - - if (!result) result = {}; - if (!result.coord) result.coord = editor.ecell.coord; - - switch (cellhandles.dragtype) { - case "Fill": - case "Move": - case "MoveI": - cmdtype2 = " all"; - break; - case "FillC": - case "MoveC": - case "MoveIC": - cmdtype2 = " formulas"; - break; - } - - if (!cellhandles.movedmouse) { // didn't move: just leave one cell selected - cellhandles.dragtype = "Nothing"; - } - - switch (cellhandles.dragtype) { - case "Nothing": - editor.Range2Remove(); - editor.RangeRemove(); - break; - - case "Fill": - case "FillC": - - crstart = SocialCalc.coordToCr(cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - if (cellhandles.filltype) { - if (cellhandles.filltype=="Down") { - crend.col = crstart.col; - } - else { - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - - editor.MoveECell(result.coord); - editor.RangeExtend(); - - if (editor.cellhandles.filltype=="Right") { - cmdtype = "right"; - } - else { - cmdtype = "down"; - } - cstr = "fill"+cmdtype+" "+SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom)+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - break; - - case "Move": - case "MoveC": - editor.context.cursorsuffix = ""; - cstr = "movepaste "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - - break; - - case "MoveI": - case "MoveIC": - editor.context.cursorsuffix = ""; - sizec = editor.range2.right - editor.range2.left; - sizer = editor.range2.bottom - editor.range2.top; - deltac = editor.ecell.col - editor.range2.left; - deltar = editor.ecell.row - editor.range2.top; - cstr = "moveinsert "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - editor.RangeRemove(); - if (editor.cellhandles.filltype==" Horizontal" && deltac > 0) { - editor.MoveECell(SocialCalc.crToCoord(editor.ecell.col-sizec-1, editor.ecell.row)); - } - else if (editor.cellhandles.filltype==" Vertical" && deltar > 0) { - editor.MoveECell(SocialCalc.crToCoord(editor.ecell.col, editor.ecell.row-sizer-1)); - } - editor.RangeAnchor(SocialCalc.crToCoord(editor.ecell.col+sizec, editor.ecell.row+sizer)); - editor.RangeExtend(); - - break; - - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.CellHandlesMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.CellHandlesMouseUp, true); - } - else if (cellhandles.draghandle.detachEvent) { // IE - cellhandles.draghandle.detachEvent("onlosecapture", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.detachEvent("onmouseup", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.detachEvent("onmousemove", SocialCalc.CellHandlesMouseMove); - cellhandles.draghandle.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - - } - -// ************************************* -// -// TableControl class: -// -// This class deals with the horizontal and verical scrollbars and pane sliders. -// -// +--------------+ -// | Endcap | -// +- - - - - - - + -// | | -// +--------------+ -// | Pane Slider | -// +--------------+ -// | | -// | Less Button | -// | | -// +--------------+ -// | Scroll Area | -// | | -// | | -// +--------------+ -// | Thumb | -// +--------------+ -// | | -// +--------------+ -// | | -// | More Button | -// | | -// +--------------+ -// -// ************************************* - -SocialCalc.TableControl = function(editor, vertical, size) { - - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - - this.vertical = vertical; // true if vertical control, false if horizontal - this.size = size; // length in pixels - - this.main = null; // main element containing all the others - this.endcap = null; // the area at the top/left between the end and the pane slider - this.paneslider = null; // the slider to adjust the pane split - this.lessbutton = null; // the top/left scroll button - this.morebutton = null; // the bottom/right scroll button - this.scrollarea = null; // the area between the scroll buttons - this.thumb = null; // the sliding thing in the scrollarea - - // computed position values: - - this.controlborder = null; // left or top screen position for vertical or horizontal control - this.endcapstart = null; // top or left screen position for vertical or horizontal control - this.panesliderstart = null; - this.lessbuttonstart = null; - this.morebuttonstart = null; - this.scrollareastart = null; - this.scrollareaend = null; - this.scrollareasize = null; - this.thumbpos = null; - - // constants: - - this.controlthickness = scc.defaultTableControlThickness; // other dimension of complete control in pixels - this.sliderthickness = scc.defaultTCSliderThickness; - this.buttonthickness = scc.defaultTCButtonThickness; - this.thumbthickness = scc.defaultTCThumbThickness; - this.minscrollingpanesize = this.buttonthickness+this.buttonthickness+this.thumbthickness+20; // the 20 is to leave a little space - - } - -// Methods: - -SocialCalc.TableControl.prototype.CreateTableControl = function() {return SocialCalc.CreateTableControl(this);}; -SocialCalc.TableControl.prototype.PositionTableControlElements = function() {SocialCalc.PositionTableControlElements(this);}; -SocialCalc.TableControl.prototype.ComputeTableControlPositions = function() {SocialCalc.ComputeTableControlPositions(this);}; - -// Functions: - -SocialCalc.CreateTableControl = function(control) { - - var s, functions, params; - var AssignID = SocialCalc.AssignID; - var setStyles = SocialCalc.setStyles; - var scc = SocialCalc.Constants; - var TooltipRegister = function(element, etype, vh) { - if (scc["s_"+etype+"Tooltip"+vh]) { - SocialCalc.TooltipRegister(element, scc["s_"+etype+"Tooltip"+vh], null); - } - } - - var imageprefix = control.editor.imageprefix; - var vh = control.vertical ? "v" : "h"; - - control.main = document.createElement("div"); - s = control.main.style; - s.height = (control.vertical ? control.size : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.size)+"px"; - s.zIndex = 0; - setStyles(control.main, scc.TCmainStyle); - s.backgroundImage="url("+imageprefix+"main-"+vh+".gif)"; - if (scc.TCmainClass) control.main.className = scc.TCmainClass; - - control.main.style.display="none"; // wait for layout - - control.endcap = document.createElement("div"); - s = control.endcap.style; - s.height = control.controlthickness+"px"; - s.width = control.controlthickness+"px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.endcap, scc.TCendcapStyle); - s.backgroundImage="url("+imageprefix+"endcap-"+vh+".gif)"; - if (scc.TCendcapClass) control.endcap.className = scc.TCendcapClass; - AssignID(control.editor, control.endcap, "endcap"+vh); - - control.main.appendChild(control.endcap); - - control.paneslider = document.createElement("div"); - s = control.paneslider.style; - s.height = (control.vertical ? control.sliderthickness : control.controlthickness)+"px"; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.width = (control.vertical ? control.controlthickness : control.sliderthickness)+"px"; - s.position = "absolute"; - s[control.vertical?"top":"left"] = "4px"; - s.zIndex = 3; - setStyles(control.paneslider, scc.TCpanesliderStyle); - s.backgroundImage="url("+imageprefix+"paneslider-"+vh+".gif)"; - if (scc.TCpanesliderClass) control.paneslider.className = scc.TCpanesliderClass; - AssignID(control.editor, control.paneslider, "paneslider"+vh); - TooltipRegister(control.paneslider, "paneslider", vh); - - functions = {MouseDown:SocialCalc.TCPSDragFunctionStart, - MouseMove: SocialCalc.TCPSDragFunctionMove, - MouseUp: SocialCalc.TCPSDragFunctionStop, - Disabled: function() {return control.editor.busy;}}; - - functions.control = control; // make sure this is there - - SocialCalc.DragRegister(control.paneslider, control.vertical, !control.vertical, functions); - - control.main.appendChild(control.paneslider); - - control.lessbutton = document.createElement("div"); - s = control.lessbutton.style; - s.height = (control.vertical ? control.buttonthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.buttonthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.lessbutton, scc.TClessbuttonStyle); - s.backgroundImage="url("+imageprefix+"less-"+vh+"n.gif)" - if (scc.TClessbuttonClass) control.lessbutton.className = scc.TClessbuttonClass; - AssignID(control.editor, control.lessbutton, "lessbutton"+vh); - - params = {repeatwait:scc.TClessbuttonRepeatWait, repeatinterval:scc.TClessbuttonRepeatInterval, - normalstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"n.gif);", - downstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"d.gif);", - hoverstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"h.gif);"}; - functions = {MouseDown:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, -1);}, - Repeat:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, -1);}, - Disabled: function() {return control.editor.busy;}}; - - SocialCalc.ButtonRegister(control.lessbutton, params, functions); - - control.main.appendChild(control.lessbutton); - - control.morebutton = document.createElement("div"); - s = control.morebutton.style; - s.height = (control.vertical ? control.buttonthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.buttonthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.morebutton, scc.TCmorebuttonStyle); - s.backgroundImage="url("+imageprefix+"more-"+vh+"n.gif)" - if (scc.TCmorebuttonClass) control.morebutton.className = scc.TCmorebuttonClass; - AssignID(control.editor, control.morebutton, "morebutton"+vh); - - params = {repeatwait:scc.TCmorebuttonRepeatWait, repeatinterval:scc.TCmorebuttonRepeatInterval, - normalstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"n.gif);", - downstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"d.gif);", - hoverstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"h.gif);"}; - functions = {MouseDown:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, +1);}, - Repeat:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, +1);}, - Disabled: function() {return control.editor.busy;}}; - - SocialCalc.ButtonRegister(control.morebutton, params, functions); - - control.main.appendChild(control.morebutton); - - control.scrollarea = document.createElement("div"); - s = control.scrollarea.style; - s.height = control.controlthickness+"px"; - s.width = control.controlthickness+"px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.scrollarea, scc.TCscrollareaStyle); - s.backgroundImage="url("+imageprefix+"scrollarea-"+vh+".gif)"; - if (scc.TCscrollareaClass) control.scrollarea.className = scc.TCscrollareaClass; - AssignID(control.editor, control.scrollarea, "scrollarea"+vh); - - params = {repeatwait:scc.TCscrollareaRepeatWait, repeatinterval:scc.TCscrollareaRepeatWait}; - functions = {MouseDown:SocialCalc.ScrollAreaClick, Repeat:SocialCalc.ScrollAreaClick, - Disabled: function() {return control.editor.busy;}}; - functions.control = control; - - SocialCalc.ButtonRegister(control.scrollarea, params, functions); - - control.main.appendChild(control.scrollarea); - - control.thumb = document.createElement("div"); - s = control.thumb.style; - s.height = (control.vertical ? control.thumbthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.thumbthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.thumb, scc.TCthumbStyle); - control.thumb.style.backgroundImage="url("+imageprefix+"thumb-"+vh+"n.gif)"; - if (scc.TCthumbClass) control.thumb.className = scc.TCthumbClass; - AssignID(control.editor, control.thumb, "thumb"+vh); - - functions = {MouseDown:SocialCalc.TCTDragFunctionStart, - MouseMove: SocialCalc.TCTDragFunctionMove, - MouseUp: SocialCalc.TCTDragFunctionStop, - Disabled: function() {return control.editor.busy;}}; - functions.control = control; // make sure this is there - SocialCalc.DragRegister(control.thumb, control.vertical, !control.vertical, functions); - - params = {normalstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"n.gif)", name:"Thumb", - downstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"d.gif)", - hoverstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"h.gif)"}; - SocialCalc.ButtonRegister(control.thumb, params, null); // give it button-like visual behavior - - control.main.appendChild(control.thumb); - - return control.main; - -} - -// -// ScrollAreaClick - Button function to process pageup/down clicks -// - -SocialCalc.ScrollAreaClick = function(e, buttoninfo, bobj) { - - var control = bobj.functionobj.control; - var bposition = SocialCalc.GetElementPosition(bobj.element); - var clickpos = control.vertical ? buttoninfo.clientY : buttoninfo.clientX; - if (control.editor.busy) { // ignore if busy - wait for next repeat - return; - } - control.editor.PageRelative(control.vertical, clickpos > control.thumbpos ? 1 : -1); - - return; - -} - -// -// PositionTableControlElements -// - -SocialCalc.PositionTableControlElements = function(control) { - - var border, realend, thumbpos; - - var editor = control.editor; - - if (control.vertical) { - border = control.controlborder+"px"; - control.endcap.style.top = control.endcapstart+"px"; - control.endcap.style.left = border; - control.paneslider.style.top = control.panesliderstart+"px"; - control.paneslider.style.left = border - control.lessbutton.style.top = control.lessbuttonstart+"px"; - control.lessbutton.style.left = border; - control.morebutton.style.top = control.morebuttonstart+"px"; - control.morebutton.style.left = border; - control.scrollarea.style.top = control.scrollareastart+"px"; - control.scrollarea.style.left = border; - control.scrollarea.style.height = control.scrollareasize+"px"; - realend = Math.max(editor.context.sheetobj.attribs.lastrow, editor.firstscrollingrow+1); - thumbpos = ((editor.firstscrollingrow-(editor.lastnonscrollingrow+1))*(control.scrollareasize-3*control.thumbthickness))/ - (realend-(editor.lastnonscrollingrow+1))+control.scrollareastart-1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.top = thumbpos+"px"; - control.thumb.style.left = border; - } - else { - border = control.controlborder+"px"; - control.endcap.style.left = control.endcapstart+"px"; - control.endcap.style.top = border; - control.paneslider.style.left = control.panesliderstart+"px"; - control.paneslider.style.top = border - control.lessbutton.style.left = control.lessbuttonstart+"px"; - control.lessbutton.style.top = border; - control.morebutton.style.left = control.morebuttonstart+"px"; - control.morebutton.style.top = border; - control.scrollarea.style.left = control.scrollareastart+"px"; - control.scrollarea.style.top = border; - control.scrollarea.style.width = control.scrollareasize+"px"; - realend = Math.max(editor.context.sheetobj.attribs.lastcol, editor.firstscrollingcol+1); - thumbpos = ((editor.firstscrollingcol-(editor.lastnonscrollingcol+1))*(control.scrollareasize-control.thumbthickness))/ - (realend-editor.lastnonscrollingcol)+control.scrollareastart-1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.left = thumbpos+"px"; - control.thumb.style.top = border; - } - control.thumbpos = thumbpos; - control.main.style.display="block"; - - } - -// -// ComputeTableControlPositions -// -// This routine computes the screen positions and other values needed for laying out -// the table control elements. -// - -SocialCalc.ComputeTableControlPositions = function(control) { - - var editor = control.editor; - - if (!editor.gridposition || !editor.headposition) throw("Can't compute table control positions before editor positions"); - - if (control.vertical) { - control.controlborder = editor.gridposition.left+editor.tablewidth; // border=left position - control.endcapstart = editor.gridposition.top; // start=top position - control.panesliderstart = editor.firstscrollingrowtop-control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingrowtop-1; - control.morebuttonstart = editor.gridposition.top+editor.tableheight-control.buttonthickness; - control.scrollareastart = editor.firstscrollingrowtop-1+control.buttonthickness; - control.scrollareaend = control.morebuttonstart-1; - control.scrollareasize = control.scrollareaend-control.scrollareastart+1; - } - else { - control.controlborder = editor.gridposition.top+editor.tableheight; // border=top position - control.endcapstart = editor.gridposition.left; // start=left position - control.panesliderstart = editor.firstscrollingcolleft-control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingcolleft-1; - control.morebuttonstart = editor.gridposition.left+editor.tablewidth-control.buttonthickness; - control.scrollareastart = editor.firstscrollingcolleft-1+control.buttonthickness; - control.scrollareaend = control.morebuttonstart-1; - control.scrollareasize = control.scrollareaend-control.scrollareastart+1; - } - } - -////// TCPS - TableControl Pan Slider methods - -// -// TCPSDragFunctionStart(event, draginfo, dobj) -// -// TableControlPaneSlider function for starting drag -// - -SocialCalc.TCPSDragFunctionStart = function(event, draginfo, dobj) { - - var editor = dobj.functionobj.control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - draginfo.trackingline = document.createElement("div"); - draginfo.trackingline.style.height = dobj.vertical ? scc.TCPStrackinglineThickness : - (editor.tableheight-(editor.headposition.top-editor.gridposition.top))+"px"; - draginfo.trackingline.style.width = dobj.vertical ? - (editor.tablewidth-(editor.headposition.left-editor.gridposition.left))+"px" : scc.TCPStrackinglineThickness; - draginfo.trackingline.style.backgroundImage="url("+editor.imageprefix+"trackingline-"+(dobj.vertical?"v":"h")+".gif)";; - if (scc.TCPStrackinglineClass) draginfo.trackingline.className = scc.TCPStrackinglineClass; - SocialCalc.setStyles(draginfo.trackingline, scc.TCPStrackinglineStyle); - - if (dobj.vertical) { - row = SocialCalc.Lookup(draginfo.clientY+dobj.functionobj.control.sliderthickness, editor.rowpositions); - draginfo.trackingline.style.top = (editor.rowpositions[row] || editor.headposition.top)+"px"; - draginfo.trackingline.style.left = editor.headposition.left+"px"; - if (editor.context.rowpanes.length-1) { // has 2 already - editor.context.SetRowPaneFirstLast(1, editor.context.rowpanes[0].last+1, editor.context.rowpanes[0].last+1); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } - else { - col = SocialCalc.Lookup(draginfo.clientX+dobj.functionobj.control.sliderthickness, editor.colpositions); - draginfo.trackingline.style.top = editor.headposition.top+"px"; - draginfo.trackingline.style.left = (editor.colpositions[col] || editor.headposition.left)+"px"; - if (editor.context.colpanes.length-1) { // has 2 already - editor.context.SetColPaneFirstLast(1, editor.context.colpanes[0].last+1, editor.context.colpanes[0].last+1); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } - - editor.griddiv.appendChild(draginfo.trackingline); - - } - -// -// TCPSDragFunctionMove(event, draginfo, dobj) -// - -SocialCalc.TCPSDragFunctionMove = function(event, draginfo, dobj) { - - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup(draginfo.clientY+sliderthickness, editor.rowpositions); - draginfo.trackingline.style.top = (editor.rowpositions[row] || editor.headposition.top)+"px"; - } - else { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup(draginfo.clientX+sliderthickness, editor.colpositions); - draginfo.trackingline.style.left = (editor.colpositions[col] || editor.headposition.left)+"px"; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - - } - -// -// TCPSDragFunctionStop(event, draginfo, dobj) -// - -SocialCalc.TCPSDragFunctionStop = function(event, draginfo, dobj) { - - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup(draginfo.clientY+sliderthickness, editor.rowpositions); - if (row>editor.context.sheetobj.attribs.lastrow) row=editor.context.sheetobj.attribs.lastrow; // can't extend sheet here - if (!row || row<=editor.context.rowpanes[0].first) { // set to no panes, leaving first pane settings - if (editor.context.rowpanes.length>1) editor.context.rowpanes.length = 1; - } - else if (editor.context.rowpanes.length-1) { // has 2 already - if (!editor.timeout) { // not waiting for position calc (so positions could be wrong) - editor.context.SetRowPaneFirstLast(0, editor.context.rowpanes[0].first, row-1); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } - else { - editor.context.SetRowPaneFirstLast(0, editor.context.rowpanes[0].first, row-1); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } - else { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup(draginfo.clientX+sliderthickness, editor.colpositions); - if (col>editor.context.sheetobj.attribs.lastcol) col=editor.context.sheetobj.attribs.lastcol; // can't extend sheet here - if (!col || col<=editor.context.colpanes[0].first) { // set to no panes, leaving first pane settings - if (editor.context.colpanes.length>1) editor.context.colpanes.length = 1; - } - else if (editor.context.colpanes.length-1) { // has 2 already - if (!editor.timeout) { // not waiting for position calc (so positions could be wrong) - editor.context.SetColPaneFirstLast(0, editor.context.colpanes[0].first, col-1); - editor.context.SetColPaneFirstLast(1, col, col); - } - } - else { - editor.context.SetColPaneFirstLast(0, editor.context.colpanes[0].first, col-1); - editor.context.SetColPaneFirstLast(1, col, col); - } - } - - editor.FitToEditTable(); - - editor.griddiv.removeChild(draginfo.trackingline); - - editor.ScheduleRender(); - - } - -////// TCT - TableControl Thumb methods - -//!!!! Note: Need to make start use same code as move/stop for determining row/col, since stop will set that -//!!!! Note: Need to make start/move/stop use positioning code that corresponds closer to -//!!!! ComputeTableControlPositions calculations. - -// -// TCTDragFunctionStart(event, draginfo, dobj) -// -// TableControlThumb function for starting drag -// - -SocialCalc.TCTDragFunctionStart = function(event, draginfo, dobj) { - - var rowpane, colpane, row, col; - - var control = dobj.functionobj.control; - var editor = control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - if (draginfo.thumbstatus) { // get rid of old one if mouseup was out of window - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - } - - draginfo.thumbstatus = document.createElement("div"); - - if (dobj.vertical) { - if (scc.TCTDFSthumbstatusvClass) draginfo.thumbstatus.className = scc.TCTDFSthumbstatusvClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatusvStyle); - draginfo.thumbstatus.style.top = (draginfo.clientY+scc.TCTDFStopOffsetv)+"px"; - draginfo.thumbstatus.style.left = (control.controlborder-10-(editor.tablewidth/2))+"px"; - draginfo.thumbstatus.style.width = (editor.tablewidth/2)+"px"; - - draginfo.thumbcontext = new SocialCalc.RenderContext(editor.context.sheetobj); - draginfo.thumbcontext.showGrid = true; - draginfo.thumbcontext.rowpanes = [{first: 1, last: 1}]; - var pane = editor.context.colpanes[editor.context.colpanes.length-1]; - draginfo.thumbcontext.colpanes = [{first: pane.first, last: pane.last}]; - draginfo.thumbstatus.innerHTML = '
    msg
    preview
    '; - draginfo.thumbstatus.rowmsgele = draginfo.thumbstatus.firstChild.firstChild.firstChild.firstChild.firstChild; - draginfo.thumbstatus.rowpreviewele = draginfo.thumbstatus.firstChild.firstChild.firstChild.childNodes[1].firstChild; - editor.toplevel.appendChild(draginfo.thumbstatus); - SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, editor.firstscrollingrow || 1); - } - else { - if (scc.TCTDFSthumbstatushClass) draginfo.thumbstatus.className = scc.TCTDFSthumbstatushClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatushStyle); - draginfo.thumbstatus.style.top = (control.controlborder+scc.TCTDFStopOffseth)+"px"; - draginfo.thumbstatus.style.left = (draginfo.clientX+scc.TCTDFSleftOffseth)+"px"; - editor.toplevel.appendChild(draginfo.thumbstatus); - draginfo.thumbstatus.innerHTML = scc.s_TCTDFthumbstatusPrefixh+SocialCalc.rcColname(editor.firstscrollingcol); - } - - } - - -// -// SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, row) -// -// Render partial row -// - -SocialCalc.TCTDragFunctionRowSetStatus = function(draginfo, editor, row) { - - var scc = SocialCalc.Constants; - var msg = scc.s_TCTDFthumbstatusPrefixv+row+" "; - - draginfo.thumbstatus.rowmsgele.innerHTML = msg; - - draginfo.thumbcontext.rowpanes = [{first: row, last: row}]; - draginfo.thumbrowshown = row; - - var ele = draginfo.thumbcontext.RenderSheet(draginfo.thumbstatus.rowpreviewele.firstChild, {type: "html"}); - - } - - -// -// TCTDragFunctionMove(event, draginfo, dobj) -// - -SocialCalc.TCTDragFunctionMove = function(event, draginfo, dobj) { - - var first, msg; - var control = dobj.functionobj.control; - var thumbthickness = control.thumbthickness; - var editor = control.editor; - var scc = SocialCalc.Constants; - - if (dobj.vertical) { - if (draginfo.clientY > control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2) - draginfo.clientY = control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2; - if (draginfo.clientY < control.scrollareastart - draginfo.offsetY - 1) - draginfo.clientY = control.scrollareastart - draginfo.offsetY - 1; - draginfo.thumbstatus.style.top = draginfo.clientY+"px"; - - first = - ((draginfo.clientY+draginfo.offsetY-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastrow-editor.lastnonscrollingrow) - + editor.lastnonscrollingrow + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) first = editor.context.sheetobj.attribs.lastrow; -// msg = scc.s_TCTDFthumbstatusPrefixv+first; - if (first != draginfo.thumbrowshown) { - SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, first); - } - } - else { - if (draginfo.clientX > control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2) - draginfo.clientX = control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2; - if (draginfo.clientX < control.scrollareastart - draginfo.offsetX - 1) - draginfo.clientX = control.scrollareastart - draginfo.offsetX - 1; - draginfo.thumbstatus.style.left = draginfo.clientX+"px"; - - first = - ((draginfo.clientX+draginfo.offsetX-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastcol-editor.lastnonscrollingcol) - + editor.lastnonscrollingcol + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) first = editor.context.sheetobj.attribs.lastcol; - msg = scc.s_TCTDFthumbstatusPrefixh+SocialCalc.rcColname(first); - draginfo.thumbstatus.innerHTML = msg; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - - } - -// -// TCTDragFunctionStop(event, draginfo, dobj) -// - -SocialCalc.TCTDragFunctionStop = function(event, draginfo, dobj) { - - var first; - var control = dobj.functionobj.control; - var editor = control.editor; - - if (dobj.vertical) { - first = - ((draginfo.clientY+draginfo.offsetY-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastrow-editor.lastnonscrollingrow) - + editor.lastnonscrollingrow + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) first = editor.context.sheetobj.attribs.lastrow; - - editor.context.SetRowPaneFirstLast(editor.context.rowpanes.length-1, first, first+1); - } - else { - first = - ((draginfo.clientX+draginfo.offsetX-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastcol-editor.lastnonscrollingcol) - + editor.lastnonscrollingcol + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) first = editor.context.sheetobj.attribs.lastcol; - - editor.context.SetColPaneFirstLast(editor.context.colpanes.length-1, first, first+1); - } - - editor.FitToEditTable(); - - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - - editor.ScheduleRender(); - - } - -// ************************************* -// -// Dragging functions: -// -// ************************************* - -SocialCalc.DragInfo = { - - // There is only one of these -- no "new" is done. - // Only one dragging operation can be active at a time. - // The registeredElements array is used to decide which item to drag. - - // One item for each draggable thing, each an object with: - // .element, .vertical, .horizontal, .functionobj - - registeredElements: [], - - // Items used during a drag - - draggingElement: null, // item being processed (.element is the actual element) - startX: 0, - startY: 0, - startZ: 0, - clientX: 0, // modifyable version to restrict movement - clientY: 0, - offsetX: 0, - offsetY: 0, - horizontalScroll: 0, // retrieved at drag start - verticalScroll: 0 - - } - -// -// DragRegister(element, vertical, horizontal, functionobj) - make element draggable -// -// The functionobj defaults to moving the element contrained only by vertical and horizontal settings. -// - -SocialCalc.DragRegister = function(element, vertical, horizontal, functionobj) { - - var draginfo = SocialCalc.DragInfo; - - if (!functionobj) { - functionobj = {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null}; - } - - draginfo.registeredElements.push( - {element: element, vertical: vertical, horizontal: horizontal, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.DragMouseDown, false); - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousedown", SocialCalc.DragMouseDown); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - } - -// -// DragUnregister(element) - remove object from list -// - -SocialCalc.DragUnregister = function(element) { - - var draginfo = SocialCalc.DragInfo; - - var i; - - if (!element) return; - - for (i=0; i tooltipinfo.viewport.width/2) { // on right side of screen - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY)+"px"; - tooltipinfo.popupElement.style.right = (tooltipinfo.viewport.width - tooltipinfo.clientX + offsetX)+"px"; - } - else { // on left side of screen - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY)+"px"; - tooltipinfo.popupElement.style.left = (tooltipinfo.clientX + offsetX)+"px"; - } - - if (tooltipinfo.clientY < 50) { // make sure fits on screen if nothing above grid - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY - 50)+"px"; - } - - document.body.appendChild(tooltipinfo.popupElement); - - } - -// -// TooltipHide() -// - -SocialCalc.TooltipHide = function() { - - var tooltipinfo = SocialCalc.TooltipInfo; - - if (tooltipinfo.popupElement) { - tooltipinfo.popupElement.parentNode.removeChild(tooltipinfo.popupElement); - tooltipinfo.popupElement = null; - } - - } - -// -// TooltipWaitDone() -// - -SocialCalc.TooltipWaitDone = function() { - - var tooltipinfo = SocialCalc.TooltipInfo; - - tooltipinfo.timer = null; - - SocialCalc.TooltipDisplay(tooltipinfo.tooltipElement); - - } - - -// ************************************* -// -// Button functions: -// -// ************************************* - -SocialCalc.ButtonInfo = { - - // There is only one of these -- no "new" is done. - // Only one button operation can be active at a time. - // The registeredElements array is used to identify items. - - // One item for each clickable element, each an object with: - // .element, .normalstyle, .hoverstyle, .downstyle, .repeatinterval, .functionobj - // - // .functionobj is an object with optional function objects for: - // mouseover, mouseout, mousedown, repeatinterval, mouseup, disabled - - registeredElements: [], - - // Items used during hover over an element, clicking, repeating, etc. - - buttonElement: null, // item being processed, hover or down (.element is the actual element) - doingHover: false, // true if mouse is over one of our elements - buttonDown: false, // true if button down and buttonElement not null - timer: null, // timer object for repeating - - // Used while processing an event - - horizontalScroll: 0, - verticalScroll: 0, - clientX: 0, - clientY: 0 - - } - -// -// ButtonRegister(element, paramobj, functionobj) - make element clickable -// -// The arguments (other than element) may be null (meaning no change for style and no repeat) -// The paramobj has the optional normalstyle, hoverstyle, downstyle, repeatwait, repeatinterval settings - -SocialCalc.ButtonRegister = function(element, paramobj, functionobj) { - - var buttoninfo = SocialCalc.ButtonInfo; - - if (!paramobj) paramobj = {}; - - buttoninfo.registeredElements.push( - {name: paramobj.name, element: element, normalstyle: paramobj.normalstyle, hoverstyle: paramobj.hoverstyle, downstyle: paramobj.downstyle, - repeatwait: paramobj.repeatwait, repeatinterval: paramobj.repeatinterval, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.ButtonMouseDown, false); - element.addEventListener("mouseover", SocialCalc.ButtonMouseOver, false); - element.addEventListener("mouseout", SocialCalc.ButtonMouseOut, false); - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousedown", SocialCalc.ButtonMouseDown); - element.attachEvent("onmouseover", SocialCalc.ButtonMouseOver); - element.attachEvent("onmouseout", SocialCalc.ButtonMouseOut); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - - } - -// -// ButtonMouseOver(event) -// - -SocialCalc.ButtonMouseOver = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (!bobj) return; - - if (buttoninfo.buttonDown) { - if (buttoninfo.buttonElement==bobj) { - buttoninfo.doingHover = true; // keep track whether we are on the pressed button or not - } - return; - } - - if (buttoninfo.buttonElement && - buttoninfo.buttonElement!=bobj && buttoninfo.doingHover) { // moved to a new one, undo hover there - SocialCalc.setStyles(buttoninfo.buttonElement.element, buttoninfo.buttonElement.normalstyle); - } - - buttoninfo.buttonElement = bobj; // remember this one is hovering - buttoninfo.doingHover = true; - - SocialCalc.setStyles(bobj.element, bobj.hoverstyle); // set style (if provided) - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOver) bobj.functionobj.MouseOver(e, buttoninfo, bobj); - - return; - - } - -// -// ButtonMouseOut(event) -// - -SocialCalc.ButtonMouseOut = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - if (buttoninfo.buttonDown) { - buttoninfo.doingHover = false; // keep track of overs and outs - return; - } - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (buttoninfo.doingHover) { // if there was a hover, undo it - if (buttoninfo.buttonElement) - SocialCalc.setStyles(buttoninfo.buttonElement.element, buttoninfo.buttonElement.normalstyle); - buttoninfo.buttonElement = null; - buttoninfo.doingHover = false; - } - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOut) bobj.functionobj.MouseOut(e, buttoninfo, bobj); - - return; - - } - -// -// ButtonMouseDown(event) -// - -SocialCalc.ButtonMouseDown = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var viewportinfo = SocialCalc.GetViewportInfo(); - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (!bobj) return; // not one of our elements - - if (bobj && bobj.functionobj && bobj.functionobj.Disabled) { - if (bobj.functionobj.Disabled(e, buttoninfo, bobj)) { - return; - } - } - - buttoninfo.buttonElement = bobj; - buttoninfo.buttonDown = true; - - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.downstyle); - - // Register event handler for mouse up - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mouseup", SocialCalc.ButtonMouseUp, true); // capture everywhere - } - else if (bobj.element.attachEvent) { // IE 5+ - bobj.element.setCapture(); - bobj.element.attachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.attachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - } - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - buttoninfo.horizontalScroll = viewportinfo.horizontalScroll; - buttoninfo.verticalScroll = viewportinfo.verticalScroll; - buttoninfo.clientX = e.clientX + buttoninfo.horizontalScroll; // get document-relative coordinates - buttoninfo.clientY = e.clientY + buttoninfo.verticalScroll; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseDown) bobj.functionobj.MouseDown(e, buttoninfo, bobj); - - if (bobj.repeatwait) { // if a repeat wait is set, then starting waiting for first repetition - buttoninfo.timer = window.setTimeout(SocialCalc.ButtonRepeat, bobj.repeatwait); - } - - return; - - } - -// -// ButtonMouseUp(event) -// - -SocialCalc.ButtonMouseUp = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (buttoninfo.timer) { // if repeating, cancel it - window.clearTimeout(buttoninfo.timer); // cancel timer - buttoninfo.timer = null; - } - - if (!buttoninfo.buttonDown) return; // already did this (e.g., in IE, releaseCapture fires losecapture) - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mouseup", SocialCalc.ButtonMouseUp, true); - } - else if (document.detachEvent) { // IE - bobj.element.detachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - bobj.element.detachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.releaseCapture(); - } - - if (buttoninfo.buttonElement.downstyle) { - if (buttoninfo.doingHover) - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.hoverstyle); - else - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.normalstyle); - } - - buttoninfo.buttonDown = false; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseUp) bobj.functionobj.MouseUp(e, buttoninfo, bobj); - - } - -// -// ButtonRepeat() -// - -SocialCalc.ButtonRepeat = function() { - - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (!bobj) return; - - if (bobj && bobj.functionobj && bobj.functionobj.Repeat) bobj.functionobj.Repeat(null, buttoninfo, bobj); - - buttoninfo.timer = window.setTimeout(SocialCalc.ButtonRepeat, bobj.repeatinterval || 100); - - } - -// ************************************* -// -// MouseWheel functions: -// -// ************************************* - -SocialCalc.MouseWheelInfo = { - - // There is only one of these -- no "new" is done. - // The mousewheel only affects the one area the mouse pointer is over - // The registeredElements array is used to identify items. - - // One item for each element to respond to the mousewheel, each an object with: - // .element, .functionobj - - registeredElements: [] - - } - -// -// MouseWheelRegister(element, functionobj) - make element respond to mousewheel -// - -SocialCalc.MouseWheelRegister = function(element, functionobj) { - - var mousewheelinfo = SocialCalc.MouseWheelInfo; - - mousewheelinfo.registeredElements.push( - {element: element, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("DOMMouseScroll", SocialCalc.ProcessMouseWheel, false); - element.addEventListener("mousewheel", SocialCalc.ProcessMouseWheel, false); // Opera needs this - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousewheel", SocialCalc.ProcessMouseWheel); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - - } - -SocialCalc.ProcessMouseWheel = function(e) { - - var event = e || window.event; - var delta; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - var mousewheelinfo = SocialCalc.MouseWheelInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var wobj; - - for (wobj=null; !wobj && ele; ele=ele.parentNode) { // go up tree looking for one of our elements - wobj = SocialCalc.LookupElement(ele, mousewheelinfo.registeredElements); - } - if (!wobj) return; // not one of our elements - - if (event.wheelDelta) { - delta = event.wheelDelta/120; - } - else delta = -event.detail/3; - if (!delta) delta = 0; - - if (wobj.functionobj && wobj.functionobj.WheelMove) wobj.functionobj.WheelMove(event, delta, mousewheelinfo, wobj); - - if (event.preventDefault) event.preventDefault(); - event.returnValue = false; - - } - -// ************************************* -// -// Keyboard functions: -// -// For more information about keyboard handling, see: http://unixpapa.com/js/key.html -// -// ************************************* - -SocialCalc.keyboardTables = { - - specialKeysCommon: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - specialKeysIE: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - controlKeysIE: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]" - }, - - specialKeysOpera: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", - 45: "[ins]", // issues with releases before 9.5 - same as "-" ("-" changed in 9.5) - 46: "[del]", // issues with releases before 9.5 - same as "." ("." changed in 9.5) - 113: "[f2]" - }, - - controlKeysOpera: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]" - }, - - specialKeysSafari: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 63232: "[aup]", 63233: "[adown]", - 63234: "[aleft]", 63235: "[aright]", 63272: "[del]", 63273: "[home]", 63275: "[end]", 63276: "[pgup]", - 63277: "[pgdn]", 63237: "[f2]" - }, - - controlKeysSafari: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]" - }, - - ignoreKeysSafari: { - 63236: "[f1]", 63238: "[f3]", 63239: "[f4]", 63240: "[f5]", 63241: "[f6]", 63242: "[f7]", - 63243: "[f8]", 63244: "[f9]", 63245: "[f10]", 63246: "[f11]", 63247: "[f12]", 63289: "[numlock]" - }, - - specialKeysFirefox: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - controlKeysFirefox: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]" - }, - - ignoreKeysFirefox: { - 16: "[shift]", 17: "[ctrl]", 18: "[alt]", 20: "[capslock]", 19: "[pause]", 44: "[printscreen]", - 91: "[windows]", 92: "[windows]", 112: "[f1]", 114: "[f3]", 115: "[f4]", 116: "[f5]", - 117: "[f6]", 118: "[f7]", 119: "[f8]", 120: "[f9]", 121: "[f10]", 122: "[f11]", 123: "[f12]", - 144: "[numlock]", 145: "[scrolllock]", 224: "[cmd]" - } - } - -SocialCalc.Keyboard = { - areListener: false, // if true, we have been installed as a listener for keyboard events - focusTable: null, // the table editor object that gets keystrokes or null - passThru: null, // if not null, control element with focus to pass keyboard events to (has blur method), or "true" - didProcessKey: false, // did SocialCalc.ProcessKey in keydown - statusFromProcessKey: false, // the status from the keydown SocialCalc.ProcessKey - repeatingKeyPress: false, // some browsers (Opera, Gecko Mac) repeat special keys as KeyPress not KeyDown - chForProcessKey: "" // remember so can do repeat in those cases - }; - -SocialCalc.KeyboardSetFocus = function(editor) { - - SocialCalc.Keyboard.focusTable = editor; - - if (!SocialCalc.Keyboard.areListener) { - document.onkeydown = SocialCalc.ProcessKeyDown; - document.onkeypress = SocialCalc.ProcessKeyPress; - SocialCalc.Keyboard.areListener = true; - } - if (SocialCalc.Keyboard.passThru) { - if (SocialCalc.Keyboard.passThru.blur) { - SocialCalc.Keyboard.passThru.blur(); - } - SocialCalc.Keyboard.passThru = null; - } - window.focus(); - } - -SocialCalc.KeyboardFocus = function() { - - SocialCalc.Keyboard.passThru = null; - window.focus(); - - } - -SocialCalc.ProcessKeyDown = function(e) { - - var kt = SocialCalc.keyboardTables; - kt.didProcessKey = false; // always start false - kt.statusFromProcessKey = false; - kt.repeatingKeyPress = false; - - var ch=""; - var status=true; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - // IE and Safari 3.1+ won't fire keyPress, so check for special keys here. - if (e.which==undefined || (typeof e.keyIdentifier == "string")) { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { - if (e.ctrlKey) { - ch=kt.controlKeysIE[e.keyCode]; - } - if (!ch) - return true; - } - status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - } - - else { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { -// return true; - if (e.ctrlKey || e.metaKey) { - ch=kt.controlKeysIE[e.keyCode]; // this works here - } - if (!ch) - return true; - } - - status = SocialCalc.ProcessKey(ch, e); // process the key - kt.didProcessKey = true; // remember what happened - kt.statusFromProcessKey = status; - kt.chForProcessKey = ch; - } - - return status; - - } - -SocialCalc.ProcessKeyPress = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - - e = e || window.event; - - if (SocialCalc.Keyboard.passThru) return; // ignore - if (kt.didProcessKey) { // already processed this key - if (kt.repeatingKeyPress) { - return SocialCalc.ProcessKey(kt.chForProcessKey, e); // process the same key as on KeyDown - } - else { - kt.repeatingKeyPress = true; // see if get another KeyPress before KeyDown - return kt.statusFromProcessKey; // do what it said to do - } - } - - if (e.which==undefined) { // IE - // Note: Esc and Enter will come through here, too, if not stopped at KeyDown - ch=String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) - } - - else { // not IE - if (!e.which) - return false; // ignore - special key - if (e.charCode==undefined) { // Opera - if (e.which!=0) { // character - if (e.which<32 || e.which==144) { // special char (144 is numlock) - ch = kt.specialKeysOpera[e.which]; - if (ch) { - return true; - } - } - else { - if (e.ctrlKey) { - ch=kt.controlKeysOpera[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - else { // special char - return true; - } - } - - else if (e.keyCode==0 && e.charCode==0) { // OLPC Fn key or something - return; // ignore - } - - else if (e.keyCode==e.charCode) { // Safari - ch = kt.specialKeysSafari[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysSafari[e.keyCode]) // pass this through - return true; - if (e.metaKey) { - ch=kt.controlKeysSafari[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - - else { // Firefox - if (kt.specialKeysFirefox[e.keyCode]) { - return true; - } - ch = String.fromCharCode(e.which); - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysFirefox[e.which]; - } - } - } - - var status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - - return status; - - } - -/* - * - * OLD ProcessKeyDown and ProcessKeyPress -- replaced for handling newer browsers, including Safari 3.1 and Opera 9.5 - * - -SocialCalc.ProcessKeyDown = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - var status=true; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - if (e.which==undefined) { // IE - ch = kt.specialKeysIE[e.keyCode]; - if (!ch) { - if (e.ctrlKey) { - ch=kt.controlKeysIE[e.keyCode]; - } - if (!ch) - return true; - } - - status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - } - - else { // don't do anything for other browsers - wait for keyPress - ; // special key repeats are done as keypress in those browsers - } - - return status; - - } - -SocialCalc.ProcessKeyPress = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - if (e.which==undefined) { // IE - // Note: Esc and Enter will come through here, too, if not stopped at KeyDown - ch=String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) - } - - else { // not IE - if (e.charCode==undefined) { // Opera - if (e.which!=0) { // character - if (e.which<32) { // special char - ch = kt.specialKeysOpera[e.keyCode]; - if (!ch) - return true; - } - else { - if (e.ctrlKey) { - ch=kt.controlKeysOpera[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - else { // special char - ch = kt.specialKeysOpera[e.keyCode]; - if (!ch) - return true; - } - } - - else if (e.keyCode==0 && e.charCode==0) { // OLPC Fn key or something - return; // ignore - } - - else if (e.keyCode==e.charCode) { // Safari - ch = kt.specialKeysSafari[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysSafari[e.keyCode]) // pass this through - return true; - if (e.metaKey) { - ch=kt.controlKeysSafari[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - - else { // Firefox - ch = kt.specialKeysFirefox[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysFirefox[e.keyCode]) // pass this through - return true; - if (e.which) { // normal char - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysFirefox[e.which]; - } - else { - ch = String.fromCharCode(e.which); - } - } - else { // usually a special char - return true; // old Firefox gives extra, empty keyPress for "/" - ignore - } - } - } - } - - var status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - - return status; - - } -*/ - -// -// status = SocialCalc.ProcessKey(ch, e) -// -// Take a key representation as a character string and dispatch to appropriate routine -// - -SocialCalc.ProcessKey = function (ch, e) { - - var ft = SocialCalc.Keyboard.focusTable; - - if (!ft) return true; // we're not handling it -- let browser do default - - return ft.EditorProcessKey(ch, e); - - } - - diff --git a/Website/static/runappios43c/lib/aspiring/socialcalcviewer.js b/Website/static/runappios43c/lib/aspiring/socialcalcviewer.js deleted file mode 100755 index 7abcf8b..0000000 --- a/Website/static/runappios43c/lib/aspiring/socialcalcviewer.js +++ /dev/null @@ -1,687 +0,0 @@ -// -// SocialCalcViewer -// -/* -// The code module of the SocialCalc package that lets you embed a spreadsheet viewer -// with an optional simple toolbar into a web page. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript SpreadsheetViewer. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the SpreadsheetViewer is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/ - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); - } - -// ************************************* -// -// SpreadsheetViewer class: -// -// ************************************* - -// Global constants: - - SocialCalc.CurrentSpreadsheetViewerObject = null; // right now there can only be one active at a time - - -// Constructor: - -SocialCalc.SpreadsheetViewer = function() { - - var scc = SocialCalc.Constants; - - // Properties: - - this.parentNode = null; - this.spreadsheetDiv = null; - this.requestedHeight = 0; - this.requestedWidth = 0; - this.requestedSpaceBelow = 0; - this.height = 0; - this.width = 0; - this.viewheight = 0; // calculated amount for views below toolbar, etc. - - // Dynamic properties: - - this.sheet = null; - this.context = null; - this.editor = null; - - this.spreadsheetDiv = null; - this.editorDiv = null; - - this.sortrange = ""; // remembered range for sort tab - - // Constants: - - this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-" - this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src - - this.statuslineheight = scc.SVStatuslineheight; // in pixels - this.statuslineCSS = scc.SVStatuslineCSS; - - // Callbacks: - - // Initialization Code: - - this.sheet = new SocialCalc.Sheet(); - this.context = new SocialCalc.RenderContext(this.sheet); - this.context.showGrid=true; - this.context.showRCHeaders=true; - this.editor = new SocialCalc.TableEditor(this.context); - this.editor.noEdit = true; - this.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetViewerStatuslineCallback, - params: {}}; - this.hasStatusLine = true; // default -// this.statuslineHTML = '
    {status}Will be link
    '; - this.statuslineHTML = '
    {status} 
    '; - this.statuslineFull = true; - this.noRecalc = true; // don't do a recalc when loaded, so no need for external sheet routines - - // Repeating macro info - - this.repeatingMacroTimer = null; - this.repeatingMacroInterval = 60; // default to 60 seconds - this.repeatingMacroCommands = ""; // what to execute - - - SocialCalc.CurrentSpreadsheetViewerObject = this; // remember this for rendezvousing on events - - return; - - } - -// Methods: - -SocialCalc.SpreadsheetViewer.prototype.InitializeSpreadsheetViewer = - function(node, height, width, spacebelow) {return SocialCalc.InitializeSpreadsheetViewer(this, node, height, width, spacebelow);}; -SocialCalc.SpreadsheetViewer.prototype.LoadSave = function(str) {return SocialCalc.SpreadsheetViewerLoadSave(this, str);}; -SocialCalc.SpreadsheetViewer.prototype.DoOnResize = function() {return SocialCalc.DoOnResize(this);}; -SocialCalc.SpreadsheetViewer.prototype.SizeSSDiv = function() {return SocialCalc.SizeSSDiv(this);}; -SocialCalc.SpreadsheetViewer.prototype.DecodeSpreadsheetSave = - function(str) {return SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave(this, str);}; - -// Sheet Methods to make things a little easier: - -SocialCalc.SpreadsheetViewer.prototype.ParseSheetSave = function(str) {return this.sheet.ParseSheetSave(str);}; - - -// Functions: - -// -// InitializeSpreadsheetViewer(spreadsheet, node, height, width, spacebelow) -// -// Creates the control elements and makes them the child of node (string or element). -// If present, height and width specify size. -// If either is 0 or null (missing), the maximum that fits on the screen -// (taking spacebelow into account) is used. -// -// You should do a redisplay or recalc (which redisplays) after running this. -// - -SocialCalc.InitializeSpreadsheetViewer = function(spreadsheet, node, height, width, spacebelow) { - - var scc = SocialCalc.Constants; - var SCLoc = SocialCalc.LocalizeString; - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var html, child, i, vname, v, style, button, bele; - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - spreadsheet.requestedHeight = height; - spreadsheet.requestedWidth = width; - spreadsheet.requestedSpaceBelow = spacebelow; - - if (typeof node == "string") node = document.getElementById(node); - - if (node == null) { - alert("SocialCalc.SpreadsheetControl not given parent node."); - } - - spreadsheet.parentNode = node; - - // create node to hold spreadsheet view - - spreadsheet.spreadsheetDiv = document.createElement("div"); - - spreadsheet.SizeSSDiv(); // calculate and fill in the size values - - for (child=node.firstChild; child!=null; child=node.firstChild) { - node.removeChild(child); - } - - node.appendChild(spreadsheet.spreadsheetDiv); - - // create sheet div - - spreadsheet.nonviewheight = spreadsheet.hasStatusLine ? spreadsheet.statuslineheight : 0; - spreadsheet.viewheight = spreadsheet.height-spreadsheet.nonviewheight; - spreadsheet.editorDiv=spreadsheet.editor.CreateTableEditor(spreadsheet.width, spreadsheet.viewheight); - - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.editorDiv); - - // create statusline - - if (spreadsheet.hasStatusLine) { - spreadsheet.statuslineDiv = document.createElement("div"); - spreadsheet.statuslineDiv.style.cssText = spreadsheet.statuslineCSS; - spreadsheet.statuslineDiv.style.height = spreadsheet.statuslineheight - - (spreadsheet.statuslineDiv.style.paddingTop.slice(0,-2)-0) - - (spreadsheet.statuslineDiv.style.paddingBottom.slice(0,-2)-0) + "px"; - spreadsheet.statuslineDiv.id = spreadsheet.idPrefix+"statusline"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.statuslineDiv); - spreadsheet.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetViewerStatuslineCallback, - params: {spreadsheetobj:spreadsheet}}; - } - - // done - refresh screen needed - - return; - - } - -SocialCalc.SpreadsheetViewerLoadSave = function(spreadsheet, savestr) { - - var rmstr, pos, t, t2; - - var parts = spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - spreadsheet.sheet.ResetSheet(); - spreadsheet.sheet.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) { // executed now - spreadsheet.editor.EditorScheduleSheetCommands(savestr.substring(parts.startupmacro.start, parts.startupmacro.end), false, true); - } - if (parts.repeatingmacro) { // first line tells how many seconds before first execution. Last cmd must be "cmdextension repeatmacro delay" to continue repeating. - rmstr = savestr.substring(parts.repeatingmacro.start, parts.repeatingmacro.end); - rmstr = rmstr.replace("\r", ""); // make sure no CR, only LF - pos = rmstr.indexOf("\n"); - if (pos > 0) { - t = rmstr.substring(0, pos)-0; // get number - t2 = t; -// if (!(t > 0)) t = 60; // handles NAN, too - spreadsheet.repeatingMacroInterval = t; - spreadsheet.repeatingMacroCommands = rmstr.substring(pos+1); - if (t2 > 0) { // zero means don't start yet - spreadsheet.repeatingMacroTimer = window.setTimeout(SocialCalc.SpreadsheetViewerDoRepeatingMacro, spreadsheet.repeatingMacroInterval * 1000); - } - } - } - } - if (spreadsheet.editor.context.sheetobj.attribs.recalc=="off" || spreadsheet.noRecalc) { - spreadsheet.editor.ScheduleRender(); - } - else { - spreadsheet.editor.EditorScheduleSheetCommands("recalc"); - } - } - -// -// SocialCalc.SpreadsheetViewerDoRepeatingMacro -// -// Called by a timer. Executes repeatingMacroCommands once. -// Use the "startcmdextension repeatmacro delay" command last to schedule this again. -// - -SocialCalc.SpreadsheetViewerDoRepeatingMacro = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - var editor = spreadsheet.editor; - - spreadsheet.repeatingMacroTimer = null; - - SocialCalc.SheetCommandInfo.CmdExtensionCallbacks.repeatmacro = {func:SocialCalc.SpreadsheetViewerRepeatMacroCommand, data:null}; - - editor.EditorScheduleSheetCommands(spreadsheet.repeatingMacroCommands); - -} - -SocialCalc.SpreadsheetViewerRepeatMacroCommand = function(name, data, sheet, cmd, saveundo) { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - - var rest = cmd.RestOfString(); - var t = rest-0; // get number - if (!(t > 0)) t = spreadsheet.repeatingMacroInterval; // handles NAN, too, using last value - spreadsheet.repeatingMacroInterval = t; - - spreadsheet.repeatingMacroTimer = window.setTimeout(SocialCalc.SpreadsheetViewerDoRepeatingMacro, spreadsheet.repeatingMacroInterval * 1000); - -} - -SocialCalc.SpreadsheetViewerStopRepeatingMacro = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - - if (spreadsheet.repeatingMacroTimer) { - window.clearTimeout(spreadsheet.repeatingMacroTimer); - spreadsheet.repeatingMacroTimer = null; - } -} - -// -// SocialCalc.SpreadsheetViewerDoButtonCmd(e, buttoninfo, bobj) -// -// xxx -// - -SocialCalc.SpreadsheetViewerDoButtonCmd = function(e, buttoninfo, bobj) { - - var obj = bobj.element; - var which = bobj.functionobj.command; - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - var editor = spreadsheet.editor; - - switch (which) { - case "recalc": - editor.EditorScheduleSheetCommands("recalc"); - break; - - default: - break; - } - - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - - } - - -// -// outstr = SocialCalc.LocalizeString(str) -// -// SocialCalc function to make localization easier. -// If str is "Text to localize", it returns -// SocialCalc.Constants.s_loc_text_to_localize if -// it exists, or else with just "Text to localize". -// Note that spaces are replaced with "_" and other special -// chars with "X" in the name of the constant (e.g., "A & B" -// would look for SocialCalc.Constants.s_loc_a_X_b. -// - -SocialCalc.LocalizeString = function(str) { - var cstr = SocialCalc.LocalizeStringList[str]; // found already this session? - if (!cstr) { // no - look up - cstr = SocialCalc.Constants["s_loc_"+str.toLowerCase().replace(/\s/g, "_").replace(/\W/g, "X")] || str; - SocialCalc.LocalizeStringList[str] = cstr; - } - return cstr; - } - -SocialCalc.LocalizeStringList = {}; // a list of strings to localize accumulated by the routine - -// -// outstr = SocialCalc.LocalizeSubstrings(str) -// -// SocialCalc function to make localization easier using %loc and %scc. -// -// Replaces sections of str with: -// %loc!Text to localize! -// with SocialCalc.Constants.s_loc_text_to_localize if -// it exists, or else with just "Text to localize". -// Note that spaces are replaced with "_" and other special -// chars with "X" in the name of the constant (e.g., %loc!A & B! -// would look for SocialCalc.Constants.s_loc_a_X_b. -// Uses SocialCalc.LocalizeString for this. -// -// Replaces sections of str with: -// %ssc!constant-name! -// with SocialCalc.Constants.constant-name. -// If the constant doesn't exist, throws and alert. -// - -SocialCalc.LocalizeSubstrings = function(str) { - - var SCLoc = SocialCalc.LocalizeString; - - return str.replace(/%(loc|ssc)!(.*?)!/g, function(a, t, c) { - if (t=="ssc") { - return SocialCalc.Constants[c] || alert("Missing constant: "+c); - } - else { - return SCLoc(c); - } - }); - - } - -// -// obj = GetSpreadsheetViewerObject() -// -// Returns the current spreadsheet view object -// - -SocialCalc.GetSpreadsheetViewerObject = function() { - - var csvo = SocialCalc.CurrentSpreadsheetViewerObject; - if (csvo) return csvo; - - throw ("No current SpreadsheetViewer object."); - - } - - -// -// SocialCalc.DoOnResize(spreadsheet) -// -// Processes an onResize event, setting the different views. -// - -SocialCalc.DoOnResize = function(spreadsheet) { - - var v; - var views = spreadsheet.views; - - var needresize = spreadsheet.SizeSSDiv(); - if (!needresize) return; - - for (vname in views) { - v = views[vname].element; - v.style.width = spreadsheet.width + "px"; - v.style.height = (spreadsheet.height-spreadsheet.nonviewheight) + "px"; - } - - spreadsheet.editor.ResizeTableEditor(spreadsheet.width, spreadsheet.height-spreadsheet.nonviewheight); - - } - - -// -// resized = SocialCalc.SizeSSDiv(spreadsheet) -// -// Figures out a reasonable size for the spreadsheet, given any requested values and viewport. -// Sets ssdiv to that. -// Return true if different than existing values. -// - -SocialCalc.SizeSSDiv = function(spreadsheet) { - - var sizes, pos, resized, nodestyle, newval; - var fudgefactorX = 10; // for IE - var fudgefactorY = 10; - - resized = false; - - sizes = SocialCalc.GetViewportInfo(); - pos = SocialCalc.GetElementPosition(spreadsheet.parentNode); - pos.bottom = 0; - pos.right = 0; - - nodestyle = spreadsheet.parentNode.style; - - if (nodestyle.marginTop) { - pos.top += nodestyle.marginTop.slice(0,-2)-0; - } - if (nodestyle.marginBottom) { - pos.bottom += nodestyle.marginBottom.slice(0,-2)-0; - } - if (nodestyle.marginLeft) { - pos.left += nodestyle.marginLeft.slice(0,-2)-0; - } - if (nodestyle.marginRight) { - pos.right += nodestyle.marginRight.slice(0,-2)-0; - } - - newval = spreadsheet.requestedHeight || - sizes.height - (pos.top + pos.bottom + fudgefactorY) - - (spreadsheet.requestedSpaceBelow || 0); - if (spreadsheet.height != newval) { - spreadsheet.height = newval; - spreadsheet.spreadsheetDiv.style.height = newval + "px"; - resized = true; - } - newval = spreadsheet.requestedWidth || - sizes.width - (pos.left + pos.right + fudgefactorX) || 700; - if (spreadsheet.width != newval) { - spreadsheet.width = newval; - spreadsheet.spreadsheetDiv.style.width = newval + "px"; - resized = true; - } - - return resized; - - } - - -// -// SocialCalc.SpreadsheetViewerStatuslineCallback -// - -SocialCalc.SpreadsheetViewerStatuslineCallback = function(editor, status, arg, params) { - - var spreadsheet = params.spreadsheetobj; - var slstr = ""; - - if (spreadsheet && spreadsheet.statuslineDiv) { - if (spreadsheet.statuslineFull) { - slstr = editor.GetStatuslineString(status, arg, params); - } - else { - slstr = editor.ecell.coord; - } - slstr = spreadsheet.statuslineHTML.replace(/\{status\}/, slstr); - spreadsheet.statuslineDiv.innerHTML = slstr; - } - - switch (status) { - case "cmdendnorender": - case "calcfinished": - case "doneposcalc": - break; // not updating Recalc button since no toolbar - - default: - break; - } - - } - - -// -// SocialCalc.CmdGotFocus(obj) -// -// Sets SocialCalc.Keyboard.passThru: obj should be element with focus or "true" -// - -SocialCalc.CmdGotFocus = function(obj) { - - SocialCalc.Keyboard.passThru = obj; - - } - - -// -// result = SocialCalc.SpreadsheetViewerCreateSheetHTML(spreadsheet) -// -// Returns the HTML representation of the whole spreadsheet -// - -SocialCalc.SpreadsheetViewerCreateSheetHTML = function(spreadsheet) { - - var context, div, ele; - - var result = ""; - - context = new SocialCalc.RenderContext(spreadsheet.sheet); - div = document.createElement("div"); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - result = div.innerHTML; - delete ele; - delete div; - return result; - - } - - -/////////////////////// -// -// LOAD ROUTINE -// -/////////////////////// - -// -// parts = SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave(spreadsheet, str) -// -// Separates the parts from a spreadsheet save string, returning an object with the sub-strings. -// -// {type1: {start: startpos, end: endpos}, type2:...} -// - -SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave = function(spreadsheet, str) { - - var pos1, mpregex, searchinfo, boundary, boundaryregex, blanklineregex, start, ending, lines, i, lines, p, pnun; - var parts = {}; - var partlist = []; - -var hasreturnonly = /[^\n]\r[^\n]/; -if (hasreturnonly.test(str)) { -str = str.replace(/([^\n])\r([^\n])/g, "$1\r\n$2"); -} - pos1 = str.search(/^MIME-Version:\s1\.0/mi); - if (pos1 < 0) return parts; - - mpregex = /^Content-Type:\s*multipart\/mixed;\s*boundary=(\S+)/mig; - mpregex.lastIndex = pos1; - - searchinfo = mpregex.exec(str); - if (mpregex.lastIndex <= 0) return parts; - boundary = searchinfo[1]; - - boundaryregex = new RegExp("^--"+boundary+"(?:\r\n|\n)", "mg"); - boundaryregex.lastIndex = mpregex.lastIndex; - - searchinfo = boundaryregex.exec(str); // find header top boundary - blanklineregex = /(?:\r\n|\n)(?:\r\n|\n)/gm; - blanklineregex.lastIndex = boundaryregex.lastIndex; - searchinfo = blanklineregex.exec(str); // skip to after blank line - if (!searchinfo) return parts; - start = blanklineregex.lastIndex; - boundaryregex.lastIndex = start; - searchinfo = boundaryregex.exec(str); // find end of header - if (!searchinfo) return parts; - ending = searchinfo.index; - - lines = str.substring(start, ending).split(/\r\n|\n/); // get header as lines - for (i=0;i'+ -//'
    '+ -//''+ -//''+ -//''+ - -// ''+ -// ''+ -// ''+ - -//''+ -//''+ -//'
    '+ -//''; - - SocialCalc.CurrentWorkbookControlObject = this; - this.sheetbar = new SocialCalc.SheetBar(); -} - -// methods -SocialCalc.WorkBookControl.prototype.GetCurrentWorkBookControl = function() {return SocialCalc.GetCurrentWorkBookControl();}; -SocialCalc.WorkBookControl.prototype.InitializeWorkBookControl = function() {return SocialCalc.InitializeWorkBookControl(this);}; - - -SocialCalc.WorkBookControl.prototype.ExecuteWorkBookControlCommand = function(cmd, isremote) { - return SocialCalc.ExecuteWorkBookControlCommand(this, cmd, isremote); -} - -SocialCalc.ExecuteWorkBookControlCommand = function(control, cmd, isremote) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - //if (!isremote) { - // return; - //} - - if (cmd.cmdtype == "scmd") { - // dispatch a sheet command - control.workbook.WorkbookScheduleCommand(cmd, isremote); - return; - - } - - if (cmd.cmdtype != "wcmd") { - return; - } - - var parseobj = new SocialCalc.Parse(cmd.cmdstr); - - var cmd1 = parseobj.NextToken(); - - switch (cmd1) { - case "addsheet": - SocialCalc.WorkBookControlAddSheetRemote(null); - break; - - case "addsheetstr": - var sheetstr = cmd.sheetstr; - SocialCalc.WorkBookControlAddSheetRemote(sheetstr); - break; - - case "delsheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlDelSheetRemote(sheetid); - break; - - case "rensheet": - var sheetid = parseobj.NextToken(); - var oldname = parseobj.NextToken(); - var newname = parseobj.NextToken(); - SocialCalc.WorkBookControlRenameSheetRemote(sheetid, oldname, newname); - break; - - case "activatesheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlActivateSheet(sheetid); - break; - - case "hidesheet": - var sheetid = parseobj.NextToken(); - - break; - - case "unhidesheet": - var sheetid = parseobj.NextToken(); - - break; - } -} - -SocialCalc.GetCurrentWorkBookControl = function() { - return SocialCalc.CurrentWorkbookControlObject; -} - -SocialCalc.InitializeWorkBookControl = function(control) { - var element = document.createElement("div"); - element.innerHTML = control.sheetshtml; - var foo = document.getElementById(control.div); - foo.appendChild(element); - //var element2 = document.createElement("div"); - //element2.innerHTML = control.buttonshtml; - //foo.appendChild(element2); - SocialCalc.WorkBookControlAddSheet(false); // this is for the default sheet -} - -SocialCalc.WorkBookControlDelSheetRemote = function(sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (sheetid == control.currentSheetButton.id) { - // the active sheet is being deleted - SocialCalc.WorkBookControlDelSheet(); - return; - } - // some non active sheet is being deleted - var foo = document.getElementById("fooBar"); - var deletedbutton = document.getElementById(sheetid); - - var did = deletedbutton.id; - var dname = deletedbutton.value; - delete control.sheetButtonArr[did]; - - foo.removeChild(deletedbutton); - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+did); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - // delete the sheet - control.workbook.DeleteWorkBookSheet(did, dname); - control.numSheets = control.numSheets-1; - -} - -// assumes that the current active sheet is being deleted -SocialCalc.WorkBookControlDelSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } -if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='To delete the selected sheet, you must first insert a new sheet.
    '; -str +='
    '+ - '
    '; - var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the deletion of the sheet - // the popup has two buttons : Confirm and Cancel -var element = document.getElementById(control.deleteDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+ 'The selected sheet will be permanently deleted.'+ '
    '; -str +='
      '; - str +='
    • To delete the selected sheet, click OK.
    • '; - str +='
    • To cancel the deletion, click cancel.
    • '; -str+='
    '; -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.WorkBookControlDeleteSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.deleteDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlDeleteSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlDeleteSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.currentSheetButton = null; - // delete the sheets - control.workbook.DeleteWorkBookSheet(name, curname); - control.numSheets = control.numSheets-1; - - var cmdstr = "delsheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true) - break; - } - } - if (control.currentSheetButton != null) { - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } -} - -// assumes that the current active sheet is being hidden -SocialCalc.WorkBookControlHideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='Before hiding the selected sheet, you must first insert a new sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the hiding of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.hideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The selected sheet will be hidden.'+ '
    '; - str +='
      '; - str +='
    • To hide the selected sheet, click OK.
    • '; - str +='
    • To cancel the hiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - -SocialCalc.WorkBookControlHideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.hideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlHideSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlHideSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, false); - sheetbarbutton.style.display="none"; - control.currentSheetButton = null; - // delete the sheets - - control.numSheets = control.numSheets-1; - - var cmdstr = "hidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - -// displays all hidden sheets, and then unhides whatever is selected -SocialCalc.WorkBookControlUnhideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - - var unhiddencount = 0; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - unhiddencount++; - } - } - - if(unhiddencount==0) { //no hidden sheets, error message here - var str = '
    '+ - ''+' There are no hidden worksheets. ' + '

    '; - str +='Before unhiding any sheets, you must first hide a sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - var element = document.getElementById(control.unhideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The following sheets are hidden.'+ '
      ' + - ''; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - str += '' + control.sheetButtonArr[sheet].value +'
      '; - } - } - - str +='
    \n
      '; - str +='
    • To unhide the selected sheet, click OK.
    • '; - str +='
    • To cancel the unhiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - - - -SocialCalc.WorkBookControlUnhideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.unhideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} - - -SocialCalc.WorkBookControlUnhideSheetSubmit = function(name) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlUnhideSheetHide(); - var current = document.getElementById(control.currentSheetButton.id); - - var curid = current.id; - var curname = control.currentSheetButton.value; - - control.currentSheetButton.setAttribute("style",""); - var old = control.currentSheetButton.id; - console.log(old); - SocialCalc.SheetBarButtonActivate(old, false); - - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unhide the button - sheetbarbutton.style.display = "inline"; - control.currentSheetButton = null; - - control.numSheets = control.numSheets+1; - - var cmdstr = "unhidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - - - -SocialCalc.WorkBookControlAddSheetButton = function(sheetname, sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - //Create an input type dynamically. - var element = document.createElement("input"); - - var name = null; - - if (sheetid != null) { - name = sheetid - } else { - name = "sheet"+ (control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt + 1; - } - - //Assign different attributes to the element. - element.setAttribute("type", "button"); - if (sheetname == null) { - element.setAttribute("value", name); - } else { - element.setAttribute("value", sheetname); - } - element.setAttribute("id", name); - element.setAttribute("name", name); - - var fnname = "SocialCalc.WorkBookControlActivateSheet("+"'"+name+"'"+")"; - - element.setAttribute("onclick",fnname); - - control.sheetButtonArr[name] = element; - - - var foo = document.getElementById("fooBar"); - - //Append the element in page (in span). - foo.appendChild(element); - - control.numSheets = control.numSheets + 1; - - var el = new SocialCalc.SheetBarSheetButton("sbsb-"+name, (sheetname?sheetname:name), - document.getElementById("SocialCalc-sheetbar-buttons"), - { - //normalstyle: "border:1px solid #000;backgroundColor:#FFF;", - //downstyle: "border:1px solid #000;backgroundColor:#CCC;", - //hoverstyle: "border:1px solid #000;backgroundColor:#FFF;" - }, - { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(name);}, - Repeat:function(){}, - Disabled: function() {} - } - ); - - return element; -} - -SocialCalc.WorkBookControlAddSheet = function(addworksheet, sheetname){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(sheetname); - - // then change the highlight - - var old="sheet1"; - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style", ""); - old = control.currentSheetButton.id; - SocialCalc.SheetBarButtonActivate(old, false); - } - - element.setAttribute("style","background-color:lightgreen"); - control.currentSheetButton = element; - var newsheetid = element.id; - SocialCalc.SheetBarButtonActivate(newsheetid, true); - - // create the sheet - if (addworksheet) { - control.workbook.AddNewWorkBookSheet(newsheetid, old, false); - // broadcast an add command here - var cmdstr = "addsheet" - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - } - -} - -SocialCalc.WorkBookControlAddSheetRemote = function(savestr){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(); - - // add the sheet, dont switch to it - control.workbook.AddNewWorkBookSheetNoSwitch(element.id, - element.value, savestr); -} - - -SocialCalc.WorkBookControlActivateSheet = function(name) { - - //alert("in activate sheet="+name) - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById(name); - foo.setAttribute("style","background-color:lightgreen;"); - SocialCalc.SheetBarButtonActivate(name, true) - - var old = control.currentSheetButton.id; - if (control.currentSheetButton.id != foo.id) { - control.currentSheetButton.setAttribute("style", ""); - SocialCalc.SheetBarButtonActivate(old, false) - } - - control.currentSheetButton = foo; - - control.workbook.ActivateWorkBookSheet(name, old); - -} - -SocialCalc.WorkBookControlHttpRequest = null; - -SocialCalc.WorkBookControlAlertContents = function(){ - - var loadedstr = ""; - var http_request = SocialCalc.WorkBookControlHttpRequest; - - if (http_request.readyState == 4) { - //addmsg("received:" + http_request.responseText.length + " chars"); - try { - if (http_request.status == 200) { - loadedstr = http_request.responseText || ""; - http_request = null; - } - else { - ; - } - } - catch (e) { - } - // do something with loaded str - //alert("loaded="+loadedstr); - SocialCalc.TestWorkBookSaveStr = loadedstr; - SocialCalc.Clipboard.clipboard = loadedstr; - } -} - - -SocialCalc.WorkBookControlAjaxCall = function(url, contents) { - - var http_request = null; - - alert("in ajax") - if (window.XMLHttpRequest) { // Mozilla, Safari,... - http_request = new XMLHttpRequest(); - } - else - if (window.ActiveXObject) { // IE - try { - http_request = new ActiveXObject("Msxml2.XMLHTTP"); - } - catch (e) { - try { - http_request = new ActiveXObject("Microsoft.XMLHTTP"); - } - catch (e) { - } - } - } - if (!http_request) { - alert('Giving up :( Cannot create an XMLHTTP instance'); - return false; - } - - // Make the actual request - SocialCalc.WorkBookControlHttpRequest = http_request; - - http_request.onreadystatechange = SocialCalc.WorkBookControlAlertContents; - http_request.open('POST', document.URL, true); // async - http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - http_request.send(contents); - - return true; - -} - -SocialCalc.WorkBookControlSaveSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetsave = {}; - - sheetsave.numsheets = control.numSheets; - sheetsave.currentid = control.currentSheetButton.id; - sheetsave.currentname = control.currentSheetButton.value; - - sheetsave.sheetArr = {} - for (var sheet in control.sheetButtonArr) { - var sheetstr = control.workbook.SaveWorkBookSheet(sheet); - sheetsave.sheetArr[sheet] = {} - sheetsave.sheetArr[sheet].sheetstr = sheetstr; - sheetsave.sheetArr[sheet].name = control.sheetButtonArr[sheet].value; - sheetsave.sheetArr[sheet].hidden = document.getElementById("sbsb-" + sheet).style.display == "none" ? "1" : "0"; - } - - // Save the editable cells if specified - if (SocialCalc.EditableCells && SocialCalc.EditableCells.allow) { - sheetsave.EditableCells = {}; - for (var i in SocialCalc.EditableCells) { - sheetsave.EditableCells[i] = SocialCalc.EditableCells[i]; - } - } - - var d = new Date(); - sheetsave["timestamp"] = d.toString(); - - - if (SocialCalc.saveAppData) { - SocialCalc.saveAppData(); - } - - if (SocialCalc.AppData) { - console.log("saving appdata") - sheetsave.AppData = {}; - for (var i in SocialCalc.AppData) { - sheetsave.AppData[i] = SocialCalc.AppData[i]; - } - } else { - sheetsave.AppData = null; - console.log("did not save appdata") - } - - - - SocialCalc.TestWorkBookSaveStr = JSON.stringify(sheetsave); - //alert(SocialCalc.TestWorkBookSaveStr); - // send it to the backend - // SocialCalc.WorkBookControlAjaxCall("/", "&sheetdata="+encodeURIComponent(SocialCalc.TestWorkBookSaveStr)); - return SocialCalc.TestWorkBookSaveStr; -} - - -// insert another workbook into an existing workbook -// assumption is at least 1 sheet exists in existing workbook -// sheets with same names will be overwritten ! -SocialCalc.WorkBookControlInsertWorkbook = function(savestr, sheetsave) { - var sheetsave - if (savestr) { - sheetsave = JSON.parse(savestr); - } - var control = SocialCalc.GetCurrentWorkBookControl(); - for (var sheet in sheetsave.sheetArr) { - - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end) - } - } - // check if sheetname already exists - var sheetname = sheetsave.sheetArr[sheet].name - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - if (sheetid) { - console.log(sheetname+"exists") - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, sheetname) - } - else { - //just test-brand new insert first - sheetid = "sheet"+(control.sheetCnt+1).toString() - control.sheetCnt = control.sheetCnt+1 - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid) - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr) - - } - } - - if(sheetsave.AppData) { - console.log("appdata found"); - SocialCalc.AppData = {}; - for (var i in sheetsave.AppData) { - SocialCalc.AppData[i] = sheetsave.AppData[i]; - } - } else { - console.log("appdata NOT found"); - SocialCalc.AppData = null; - } - - -} - -SocialCalc.WorkBookControlLoad = function(savestr){ - - var sheetsave; - - if (savestr == "") return; - - if (savestr) { - sheetsave = JSON.parse(savestr); - } else { - sheetsave = JSON.parse(SocialCalc.TestWorkBookSaveStr); - } - //alert(sheetsave.currentid+","+sheetsave.currentname) - - // first create a new workbook - var control = SocialCalc.GetCurrentWorkBookControl(); - - SocialCalc.WorkBookControlCreateNewBook(); - - // at this point there is one sheet, and 1 button - // create the sequence of buttons, and sheets - var firstrun = true; - var newbuttons = 0 - var sheetid = null; - var currentsheetid = sheetsave.currentid; - //alert("button="+newbuttons) - for (var sheet in sheetsave.sheetArr) { - //alert(sheet); - if (newbuttons > sheetsave.numsheets) { - break; - } - //alert("button="+newbuttons) - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - if (firstrun) { - firstrun=false; - // set the first button's name correctly - sheetid = control.currentSheetButton.id; - control.currentSheetButton.value = sheetsave.sheetArr[sheet].name; - SocialCalc.SheetBarButtonSetName(sheetid, sheetsave.sheetArr[sheet].name); - // set the sheet data for the first sheet which already exists - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, control.currentSheetButton.value); - // need to also set the formula cache - currentsheetid = sheetid; - } - else { - sheetid = "sheet"+(control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt+1; - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr); - } - if(sheetsave.sheetArr[sheet].hidden=="1") { - // unregister with mouse ? etc - var sheetbarbutton = document.getElementById("sbsb-" + sheetid); - sheetbarbutton.style.display="none"; - SocialCalc.SheetBarButtonActivate(sheet, false); - newbuttons= newbuttons - 1; - } - if (sheet == sheetsave.currentid) { - currentsheetid = sheetid - } - newbuttons = newbuttons + 1; - } - // Save the user script data - if (sheetsave.EditableCells) { - SocialCalc.EditableCells = {}; - for (var i in sheetsave.EditableCells) { - SocialCalc.EditableCells[i] = sheetsave.EditableCells[i]; - } - } - - if(sheetsave.AppData) { - console.log("appdata found"); - SocialCalc.AppData = {}; - for (var i in sheetsave.AppData) { - SocialCalc.AppData[i] = sheetsave.AppData[i]; - } - } else { - console.log("appdata NOT found"); - SocialCalc.AppData = null; - } - - - var timeoutFn = function() { - SocialCalc.WorkBookControlActivateSheet(currentsheetid); - }; - window.setTimeout(timeoutFn, 200); -} - - -SocialCalc.WorkBookControlRenameSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // do a popup to get the new name of the sheet - // the popup has an input element with submit, and cancel buttons - var element = document.getElementById(control.renameDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+'Rename-'+ currentsheet + '
    '+ - '' + 'Please ensure that you DO NOT have ANY spaces in the sheet name.' + '' + - '
    '+'
    '; - -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.renameDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - -var ele = document.getElementById("newSheetName"); -ele.focus(); -SocialCalc.CmdGotFocus(ele); - -} - -SocialCalc.WorkBookControlRenameSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.renameDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlRenameSheetSubmit = function(){ - -// this handles all the rename action -var ele = document.getElementById("newSheetName"); -//console.log(ele.value); -var control = SocialCalc.GetCurrentWorkBookControl(); -if (ele.value.length == 0) { - ele.focus(); - return; -} -var oldname = control.currentSheetButton.value; -var newname = ele.value; -if(newname.indexOf(" ")!=-1) { - alert("A space was found in the new name. Please ensure that the new name has no sapces"); - return; - } -SocialCalc.WorkBookControlRenameSheetHide(); -// verify newname does not clash with any existing sheet name -// if so reject -var smallname = newname.toLowerCase();//converting to lower case to normalise -//console.log(smallname + " old " + ele.value); -for (var sheet in workbook.sheetArr) { - console.log(workbook.sheetArr[sheet].sheet.sheetname);//checking in sheetarr for repeated names - if (workbook.sheetArr[sheet].sheet.sheetname == smallname) { - alert(newname+" already exists"); - return; - } - } // variation of Case in letters of a sheet name will give an error if smallname is used. - -control.currentSheetButton.value = smallname; - -SocialCalc.SheetBarButtonSetName (control.currentSheetButton.id, newname); - -// perform a rename for formula references to this sheet in all the -// sheets in the workbook -control.workbook.RenameWorkBookSheet(oldname, smallname, control.currentSheetButton.id); - - var cmdstr = "rensheet "+control.currentSheetButton.id+" "+oldname+" "+newname; - //console.log(cmdstr); - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - -} - -SocialCalc.WorkBookControlRenameSheetRemote = function(sheetid, oldname, newname) { - //console.log("rename sheet ",sheetid, oldname, newname) - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById("fooBar"); - var renbutton = document.getElementById(sheetid); - - renbutton.value = newname; - - SocialCalc.SheetBarButtonSetName(sheetid, newname); - -control.workbook.RenameWorkBookSheet(oldname, newname, sheetid); - -} - - -SocialCalc.WorkBookControlCreateNewBook = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // delete all the sheets except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - control.workbook.DeleteWorkBookSheet(control.sheetButtonArr[sheet].id, control.sheetButtonArr[sheet].value); - } - } - // Reset that 1 sheet - - control.workbook.LoadRenameWorkBookSheet(control.currentSheetButton.id, "", control.workbook.defaultsheetname) - - - // delete all the buttons except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.sheetButtonArr[sheet].id); - - var name = current.id; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - control.numSheets = control.numSheets - 1; - } - } - // rename that button - control.currentSheetButton.value = control.workbook.defaultsheetname; - //alert("done new workbook") -} - -SocialCalc.WorkBookControlNewBook = function() { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlCreateNewBook(); - control.workbook.RenderWorkBookSheet(); -} - - -SocialCalc.WorkBookControlMove = function(direction){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - return; - } - var sheetArr = control.sheetButtonArr; - var newSheetArr = {}; - var sheetid = control.currentSheetButton.id; - - var curr_button = document.getElementById(sheetid); - var curr_sb_button = document.getElementById("sbsb-"+sheetid); - var sib_button = null; - var sib_sb_button = null; - if (direction == "left") { - sib_button = curr_button.previousSibling; - sib_sb_button = curr_sb_button.previousSibling; - if(!sib_sb_button) { - alert("Cannot move leftmost Sheet further to the left"); - return; - } - } - else { - sib_button = curr_button.nextSibling; - sib_sb_button = curr_sb_button.nextSibling; - if(!sib_sb_button) { - alert("Cannot move rightmost Sheet further to the right"); - return; - } - } - var currid = sheetid; - var sibid = sib_button.id; - var parent = curr_button.parentNode; - var sb_parent = curr_sb_button.parentNode; - - var cloned = {}; - var clonedsb = {}; - for(button in sheetArr) { - clonedsb[button] = document.getElementById("sbsb-"+button); - cloned[button] = document.getElementById(button); - sb_parent.removeChild(document.getElementById("sbsb-"+button)); - parent.removeChild(document.getElementById(button)); - } - for(button in sheetArr) { - if(button != currid && button != sibid) { - newSheetArr[button] = sheetArr[button]; - sb_parent.appendChild(clonedsb[button]); - parent.appendChild(cloned[button]); - } - else if(button == currid) { - if (direction == "left") { - newSheetArr[currid] = sheetArr[currid]; - newSheetArr[sibid] = sheetArr[sibid]; - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - } else { - newSheetArr[sibid] = sheetArr[sibid]; - newSheetArr[currid] = sheetArr[currid]; - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - } - } - } - control.sheetButtonArr = newSheetArr; - SocialCalc.SheetBarButtonActivate(currid,true); -} - -SocialCalc.WorkBookControlMoveLeft = function(){ - SocialCalc.WorkBookControlMove("left"); -} -SocialCalc.WorkBookControlMoveRight = function(){ - SocialCalc.WorkBookControlMove("right"); -} - - - -SocialCalc.WorkBookControlCopySheet = function(){ - - //alert("in copy"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - control.workbook.CopyWorkBookSheet(control.currentSheetButton.id); - - alert("copied sheet:"+control.currentSheetButton.value); -} - -SocialCalc.WorkBookControlPasteSheet = function() { - - //alert("in paste"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - var oldid = control.currentSheetButton.id; - - SocialCalc.WorkBookControlAddSheet(false); - - var newid = control.currentSheetButton.id; - - //alert(newid+oldid); - - control.workbook.PasteWorkBookSheet(newid, oldid); - - var cmdstr = "addsheetstr"; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr, sheetstr: control.workbook.clipsheet.savestr}); - -} - -SocialCalc.SheetBar = function() { - this.baseDiv = document.getElementById("SocialCalc-sheetbar"); - - this.prebuttonsDiv = document.createElement("div"); - this.prebuttonsDiv.style.cssText = "display:inline;"; - this.prebuttonsDiv.innerHTML="        "; - this.prebuttonsDiv.id = "SocialCalc-sheetbar-prebuttons"; - - this.buttonsDiv = document.createElement("div"); - this.buttonsDiv.id = "SocialCalc-sheetbar-buttons"; - this.buttonsDiv.style.cssText = "display:inline;"; - - this.buttonActionsDiv = document.createElement("div"); - this.buttonActionsDiv.id = "SocialCalc-sheetbar-buttonactions"; - this.buttonActionsDiv.style.display = "inline"; - var addbutton = new SocialCalc.SheetBarSheetButton("sbsba-add", "sbsba-add", this.buttonActionsDiv, - {}, - { - MouseDown:function(){var abc=SocialCalc.WorkBookControlAddSheet(true);} - }, - "add-2.png"); - - - this.baseDiv.appendChild(this.prebuttonsDiv); - this.baseDiv.appendChild(this.buttonsDiv); - this.baseDiv.appendChild(this.buttonActionsDiv); -} - -// define a new class for sheetbarsheetbutton - -SocialCalc.SheetBarSheetButton = function(id, name, parentdiv, params, functions, img) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.name = name; - if (!img) { - this.ele.innerHTML = name; - this.ele.style.cssText = "font-size:small;display:inline;padding:5px 5px 2px 5px;border:1px solid #000;"; - imgele = document.createElement("img"); - imgele.id = id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - SocialCalc.ButtonRegister(this.ele, params, functions); - SocialCalc.ButtonRegister(imgele, params, functions); - } else { - var imgele = document.createElement("img"); - imgele.src = SocialCalc.Constants.defaultImagePrefix +img; - imgele.style.cssText = "width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - this.ele.style.cssText = "display:inline;padding:5px 5px 2px 5px;"; - SocialCalc.ButtonRegister(imgele, params, functions); - } - parentdiv.appendChild(this.ele); -} - -SocialCalc.SheetBarButtonActivate = function(id, active) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.isactive = active; - if (active) { - sbbutton.style.backgroundColor = "#FFF"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (!imgele) { - imgele = document.createElement("img"); - imgele.id = "sbsb-"+id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - } - sbbutton.appendChild(imgele); - SocialCalc.ButtonRegister(imgele, {}, { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(id);}, - Repeat:function(){}, - Disabled: function() {} - } ); - } - else { - sbbutton.style.backgroundColor = "#CCC"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (imgele) { - sbbutton.removeChild(imgele); - } - } - var menu = document.getElementById("sbsb-menu"); - if (menu && menu.style.display != "none") { - menu.style.display = "none"; - } -} - -SocialCalc.SheetBarButtonSetName = function(id, name) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.name = name; - sbbutton.innerHTML = name; - if (sbbutton.isactive) { - SocialCalc.SheetBarButtonActivate(id, true); - } -} - - -SocialCalc.SheetBarSheetButtonPress = function(id) { - //console.log("button press") - var sbbutton = document.getElementById("sbsb-"+id); - if (sbbutton && sbbutton.isactive) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) { - var sbsbm = new SocialCalc.SheetBarSheetButtonMenu("sbsb-menu", id); - } else { - menu.clickedsheetid = id; - if (menu.style.display == "none") { - menu.style.display = "inline"; - SocialCalc.SheetBarSheetButtonMenuPosition(menu, id); - } else { - menu.style.display = "none"; - } - } - - } else if (sbbutton) { - SocialCalc.WorkBookControlActivateSheet(id); - } - -} - - -// define a new class for sheetbarsheet button menu item - -SocialCalc.SheetBarSheetButtonMenuItem = function(id, t) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.innerHTML = t; - this.ele.className = ""; - this.ele.style.cssText = "padding:3px 4px;width:100px;height:20px;background-color:#FFF;"; - - var params = { - normalstyle: "backgroundColor:#FFF;", - downstyle: "backgroundColor:#CCC;", - hoverstyle: "backgroundColor:#CCC;"}; - var functions = {MouseDown:function(){SocialCalc.SheetBarMenuItemPress(id);}, - Repeat:function(){}, - Disabled: function() {}}; - - SocialCalc.ButtonRegister(this.ele, params, functions); - - SocialCalc.TouchRegister(this.ele, {SingleTap:functions.MouseDown}); - - return this.ele; - -} - -SocialCalc.SheetBarMenuItemPress = function(id) { - - var menu = document.getElementById("sbsb-menu"); - if (!menu) return; - - var clickedsheetid = menu.clickedsheetid; - - switch(id) { - case "sbsb_deletesheet": - //console.log("delete "+clickedsheetid); - SocialCalc.WorkBookControlDelSheet(); - break; - case "sbsb_hidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlHideSheet(); - break; - case "sbsb_unhidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlUnhideSheet(); - break; - case "sbsb_copysheet": - //console.log("copy "+clickedsheetid); - SocialCalc.WorkBookControlCopySheet(); - break; - case "sbsb_moveleft": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveLeft(); - break; - case "sbsb_moveright": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveRight(); - break; - - case "sbsb_pastesheet": - //console.log("paste "+clickedsheetid); - SocialCalc.WorkBookControlPasteSheet(); - break; - case "sbsb_renamesheet": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlRenameSheet(); - break; - case "sbsb_closemenu": - //console.log("rename "+clickedsheetid); - menu.style.display = "none"; - break; - default: - break; - } - menu.style.display = "none"; - -} - -// define a new class for sheetbarsheet button menu -SocialCalc.SheetBarSheetButtonMenu = function(id, clickedsheetid) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.className = ""; - this.ele.clickedsheetid = clickedsheetid; - this.ele.style.cssText = "border:1px solid #000;position:absolute;top:200px;left:0px;width=100px;z-index:120"; - - var ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_deletesheet"," Delete Sheet"); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_hidesheet"," Hide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_unhidesheet"," Unhide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_renamesheet"," Rename Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveleft"," Move Left "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveright"," Move Right "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_copysheet"," Copy Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_pastesheet"," Paste Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_closemenu"," Cancel"); - this.ele.appendChild(ele1); - - - SocialCalc.SheetBarSheetButtonMenuPosition(this.ele, clickedsheetid); - - //var clickedsheet = document.getElementById(clickedsheetid); - //var position = SocialCalc.GetElementPosition(clickedsheet); - //console.log(clickedsheet.offsetHeight,clickedsheet.offsetWidth,clickedsheet.offsetLeft, clickedsheet.offsetTop); - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.editor.toplevel.appendChild(this.ele); - - - - - -} - -// position the sheet menu -SocialCalc.SheetBarSheetButtonMenuPosition = function(menu, clickedsheetid) { - - var hlessbutton = document.getElementById("te_lessbuttonh"); - - //console.log(hlessbutton.style.top, hlessbutton.style.left); - - var sbbutton = document.getElementById("sbsb-"+clickedsheetid); - - //console.log(sbbutton.offsetLeft,clickedsheetid); - - var top = hlessbutton.style.top.slice(0,-2)-220; - var left = sbbutton.offsetLeft+7; - - menu.style.top = top+"px"; - menu.style.left = left+"px"; - - //console.log(menu.style.top, menu.style.left); -} - -SocialCalc.ScriptInfo = { - scripts : {}, - handle:null -}; - -SocialCalc.ScriptCheck = function(sheetid, coord, text) { -var commentstart = text.indexOf(""); -if ((commentstart != -1) && (commentend != -1)) { - script = text.slice(commentstart+10,commentend); - //alert(script); - SocialCalc.ScriptInfo.scripts[coord] = script; - if (SocialCalc.ScriptInfo.handle == null) { - SocialCalc.ScriptInfo.handle = - window.setTimeout(SocialCalc.EvalUserScripts,500); - } - //alert(coord+"-"+sheetid); -} -} - -SocialCalc.EvalUserScript = function(data) { - var head = document.getElementsByTagName("head")[0] || - document.documentElement; - - if (data == "") return; - - var script = document.createElement("script"); - - script.type = "text/javascript"; - try { - // doesn't work on ie... - script.appendChild(document.createTextNode(data)); - } catch(e) { - // IE has funky script nodes - script.text = data; - } - - head.insertBefore(script, head.firstChild); - head.removeChild(script); -} - -SocialCalc.EvalUserScripts = function() { -for (var cr in SocialCalc.ScriptInfo.scripts) { - SocialCalc.EvalUserScript(SocialCalc.ScriptInfo.scripts[cr]); - //console.log(cr,SocialCalc.ScriptInfo.scripts[cr]) -} -SocialCalc.ScriptInfo.handle = null; -SocialCalc.ScriptInfo.scripts = {}; -} - -SocialCalc.CallOutOnRenderCell = function(sheetobj, value, cr) { -var cell=sheetobj.cells[cr]; -if (!cell) return; -var valuetype = cell.valuetype || ""; // get type of value to determine formatting -var valuesubtype = valuetype.substring(1); -var sheetattribs=sheetobj.attribs; -valuetype = valuetype.charAt(0); -if (valuetype=="t") { - valueformat = sheetobj.valueformats[cell.textvalueformat-0] || sheetobj.valueformats[sheetattribs.defaulttextvalueformat-0] || ""; - if (valueformat == "text-html") {SocialCalc.ScriptCheck(sheetobj.sheetid,cr,value);} -} -} - -SocialCalc.GetCellDataValue = function(coord) { - - var sheetname = null; - var sheetid = ""; - var bindex = coord.indexOf("!"); - if (bindex != -1) { - sheetname = coord.slice(0,bindex); - coord = coord.slice(bindex+1); - //console.log(sheetname,coord) - } - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (sheetname == null) { - sheetid = control.currentSheetButton.id - } else { - sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - } - - if ((sheetid == null) || (sheetid == "")) { - return "0"; - } - - var sheetobj = control.workbook.sheetArr[sheetid].sheet - - var cell = sheetobj.cells[coord] - - if (cell) {return cell.datavalue;} else {return 0;} -} - -SocialCalc.GetCellDataArray = function(coordstr,sheetname) { - var vals = [] - var coords = coordstr.split(","); - if (sheetname == null) { sheetname=""; } - else { - sheetname = sheetname+"!"; - } - for (var c in coords) { - - vals.push(SocialCalc.GetCellDataValue(sheetname+coords[c])); - } - return vals; -} - -SocialCalc.UserScriptData = {} - - -SocialCalc.WorkBookRecalculateInfo = { - sheets : [], - calcorder: [], - current: 0, - pass: 0 -}; - -SocialCalc.WorkBookRecalculateAll = function() { - // do it from the last sheet to the first sheet - // using the recalc-done signal to trigger the next sheet - - // if already in the middle of a recalculate-all, ignore this. - if ((SocialCalc.WorkBookRecalculateInfo.current != 0) || - (SocialCalc.WorkBookRecalculateInfo.calcorder.length != 0) || - (SocialCalc.WorkBookRecalculateInfo.sheets.length != 0)) { - return; - } - - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - SocialCalc.WorkBookRecalculateInfo.current = 0; - - for (var sheet in control.workbook.sheetArr) { - SocialCalc.WorkBookRecalculateInfo.sheets.push(sheet); - } - - var i = 0; - for (var c=SocialCalc.WorkBookRecalculateInfo.sheets.length; - c>0; c--) { - SocialCalc.WorkBookRecalculateInfo.calcorder[i] = - SocialCalc.WorkBookRecalculateInfo.sheets[c-1]; - i++; - } - - $.mobile.showPageLoadingMsg(); - window.setTimeout(SocialCalc.WorkBookRecalculateStep,500); -} - -SocialCalc.WorkBookRecalculateStep = function() { - if (SocialCalc.WorkBookRecalculateInfo.current == - SocialCalc.WorkBookRecalculateInfo.calcorder.length) { - SocialCalc.WorkBookRecalculateInfo.current = 0; - SocialCalc.WorkBookRecalculateInfo.calcorder = []; - SocialCalc.WorkBookRecalculateInfo.sheets = []; - if (SocialCalc.WorkBookRecalculateInfo.pass == - 1) { - SocialCalc.WorkBookRecalculateInfo.pass = 0; - //SocialCalc.SpinnerWaitHide(); - //alert("load done"); - $.mobile.hidePageLoadingMsg(); - - return; - } else { - SocialCalc.WorkBookRecalculateInfo.pass++; - SocialCalc.WorkBookRecalculateAll(); - return; - } - } - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert("recalculate "+ - // SocialCalc.WorkBookRecalculateInfo.calcorder[ - // SocialCalc.WorkBookRecalculateInfo.current] - // ); - var sheetid = -SocialCalc.WorkBookRecalculateInfo.calcorder[ - SocialCalc.WorkBookRecalculateInfo.current]; - SocialCalc.WorkBookControlActivateSheet(sheetid); - SocialCalc.WorkBookRecalculateInfo.current++; - - - window.setTimeout(SocialCalc.WorkBookRecalculateStep,1000); -} - - -SocialCalc.SpinnerWaitCreate = function() { - // if the div exists already just use it - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - return; - } - var main = document.createElement("div"); - main.id = "waitloadingspinner"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - main.style.top = (vp.height/2)+"px"; - main.style.left = (vp.width/2)+"px"; - main.style.zIndex = 110; - - main.style.width='50px' - main.style.height = '50px' - main.innerHTML = 'Loading...'; - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.SpinnerWaitHide = function() { - // if the div exists already just use it - -var ele = document.getElementById("waitloadingspinner"); -if (ele) { - ele.innerHTML = ""; - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} -} - -SocialCalc.EditableCells = {}; -SocialCalc.EditableCells.allow = false; -SocialCalc.EditableCells.cells = {}; - -SocialCalc.Callbacks.IsCoordEditable = function(sheetcoord) { - if (!(SocialCalc.EditableCells.allow)) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[sheetcoord]) { - // by default all cells are editable - return true; - } - - return false; -} - -SocialCalc.Callbacks.IsCellEditable = function(editor) { - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - if (!(SocialCalc.EditableCells.allow)) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[cellname]) { - // by default all cells are editable - return true; - } - - return false; -} - -SocialCalc.IsScrollPossible = function(lastrow, lastcol, - curr_vpos, curr_hpos, - vamount, hamount - ) { - //return false; - //console.log(lastrow+","+lastcol); - //console.log(curr_vpos+","+curr_hpos); - //console.log(vamount+","+hamount); - - if (curr_vpos+10+vamount > lastrow ) { - return false; - } - if (curr_hpos+hamount > lastcol) { - return false; - } - return true; -} - - -SocialCalc.Callbacks.CheckConstraints = function(editor, value) -{ - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - if (!SocialCalc.EditableCells.constraints) {return true;}; - var constraint = SocialCalc.EditableCells.constraints[cellname]; - //alert(JSON.stringify(constraint)) - if (constraint != null) { - switch (constraint[0]) { - case "numeric": - // check that value is numeric - var val = parseInt(value); - var low = parseInt(constraint[1]); - var high = parseInt(constraint[2]); - var text = ""; - if (constraint.length > 3) { - text = constraint[3]; - } - console.log(val+" "+text+","+high); - - if (isNaN(val)) { - var msg = "please input a number"; - window.plugins.Prompt.show( - msg, - saveAsCancel, - saveAsCancel, - "nope", // ok button title - not used - "OK", // cancel button title - "no" - ); - return false; - } - - if (val < low) { - var msg = text +" must be at least "+low; - window.plugins.Prompt.show( - msg, - saveAsCancel, - saveAsCancel, - "nope", // ok button title - not used - "OK", // cancel button title - "no" - ); - - return false; - } - - if (val > high) { - var msg = text + " must be atmost "+high; - window.plugins.Prompt.show( - msg, - saveAsCancel, - saveAsCancel, - "nope", // ok button title - not used - "OK", // cancel button title - "no" - ); - - return false; - } - if (Aspiring.appSpecificInputValidation && !Aspiring.appSpecificInputValidation(cellname, val)) { - return false; - } - break; - case "float": - var val = parseFloat(value); - var low = parseFloat(constraint[1]); - var high = parseFloat(constraint[2]); - var text = ""; - if (constraint.length > 3) { - text = constraint[3]; - } - //alert(val) - if (isNaN(val)) { - var msg = "please input a number"; - window.plugins.Prompt.show( - msg, - saveAsCancel, - saveAsCancel, - "nope", // ok button title - not used - "OK", // cancel button title - "no" - ); - return false; - - } - if (val < low) { - var msg = text +" must be at least "+low; - window.plugins.Prompt.show( - msg, - saveAsCancel, - saveAsCancel, - "nope", // ok button title - not used - "OK", // cancel button title - "no" - ); - - return false; - - } - if (val > high) { - var msg = text + " must be atmost "+high; - window.plugins.Prompt.show( - msg, - saveAsCancel, - saveAsCancel, - "nope", // ok button title - not used - "OK", // cancel button title - "no" - ); - - return false; - - } - if (Aspiring.appSpecificInputValidation && !Aspiring.appSpecificInputValidation(cellname, val)) { - return false; - } - break; - case "percent": - break; - } - } - return true; -} - - -// this is for checkmark toggling -SocialCalc.Callbacks.ToggleCell = function(cellname){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - var sheetid = control.currentSheetButton.id; - var sheetobj = control.workbook.sheetArr[sheetid].sheet; - var cell = sheetobj.cells[cellname]; - var sheetname = sheetobj.sheetname; - - // check if cell is in constraints - - - var constraint = SocialCalc.EditableCells.constraints[sheetname+"!"+cellname]; - if (!constraint || (constraint[0] != "tc")) { - return; - } - - // console.log(sheetname); - // console.log(cellname); - - var cellinner = document.getElementById("cell_"+cellname) - - - - if ((cellinner.innerHTML.indexOf(" ") != -1)) { - // set the value to the img value - cellinner.innerHTML = '
    ' - if (cell) {//cell.displaystring = '
    ' ; - //cell.datavalue = '
    ' ; - //console.log("found cell") - cell.displaystring = '
    ' ; - cell.datavalue = '
    ' ; - //http://img689.imageshack.us/img689/9234/checkmark.png - } - } - else { - // set the value to a space - cellinner.innerHTML = "
     
    "; - if (cell) {cell.datavalue = "
     
    ";cell.displaystring = "
     
    ";} - } - -} - -SocialCalc.WorkbookControlCreateSheetHTML = function(sheetlist) { - - var context, div, ele; - - var result = ""; - - var control = SocialCalc.GetCurrentWorkBookControl(); - - div = document.createElement("div"); - - if (!sheetlist) { - context = new SocialCalc.RenderContext(spreadsheet.sheet); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - } else { - for (var sheetid in sheetlist) { - //console.log("getting html for "+sheetid) - context = new SocialCalc.RenderContext(control.workbook.sheetArr[sheetid].sheet); - ele = context.RenderSheet(null, {type: "html"}); - delete context; - div.appendChild(ele); - } - } - - result = div.innerHTML; - delete ele; - delete div; - //console.log(result); - return result; - -} - - -SocialCalc.GetSheetFromCoord = function(crd, sheetobj) { - var bindex = crd.indexOf("!"); - var sheetname = null; - if (bindex != -1) { - sheetname = crd.slice(0,bindex); - var control = SocialCalc.GetCurrentWorkBookControl(); - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname.toLowerCase()); - if ((sheetid == null) || (sheetid == "")) { - return sheetobj; - } - return control.workbook.sheetArr[sheetid].sheet; - } - return sheetobj; -}; -SocialCalc.GetCellFromCoord = function(crd, sheetobj) { - var bindex = crd.indexOf("!"); - var sheetname = null; - if (bindex != -1) { - sheetname = crd.slice(0,bindex); - crd = crd.slice(bindex+1); - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname.toLowerCase()); - - if ((sheetid == null) || (sheetid == "")) { - return null; - } - sheetobj = control.workbook.sheetArr[sheetid].sheet; - } - return sheetobj.cells[crd]; -}; - - - - - - - - - - - diff --git a/Website/static/runappios43c/lib/dropbox/OAuthSimple.js b/Website/static/runappios43c/lib/dropbox/OAuthSimple.js deleted file mode 100755 index f2b9c94..0000000 --- a/Website/static/runappios43c/lib/dropbox/OAuthSimple.js +++ /dev/null @@ -1,477 +0,0 @@ -/* OAuthSimple - * A simpler version of OAuth - * - * author: jr conlin - * mail: src@anticipatr.com - * copyright: unitedHeroes.net - * version: 1.2 - * url: http://unitedHeroes.net/OAuthSimple - * - * Copyright (c) 2011, unitedHeroes.net - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the unitedHeroes.net nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY UNITEDHEROES.NET ''AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL UNITEDHEROES.NET BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -var OAuthSimple; - -if (OAuthSimple === undefined) -{ - /* Simple OAuth - * - * This class only builds the OAuth elements, it does not do the actual - * transmission or reception of the tokens. It does not validate elements - * of the token. It is for client use only. - * - * api_key is the API key, also known as the OAuth consumer key - * shared_secret is the shared secret (duh). - * - * Both the api_key and shared_secret are generally provided by the site - * offering OAuth services. You need to specify them at object creation - * because nobody ing uses OAuth without that minimal set of - * signatures. - * - * If you want to use the higher order security that comes from the - * OAuth token (sorry, I don't provide the functions to fetch that because - * sites aren't horribly consistent about how they offer that), you need to - * pass those in either with .signatures() or as an argument to the - * .sign() or .getHeaderString() functions. - * - * Example: - - var oauthObject = OAuthSimple().sign({path:'http://example.com/rest/', - parameters: 'foo=bar&gorp=banana', - signatures:{ - api_key:'12345abcd', - shared_secret:'xyz-5309' - }}); - document.getElementById('someLink').href=oauthObject.signed_url; - - * - * that will sign as a "GET" using "SHA1-MAC" the url. If you need more than - * that, read on, McDuff. - */ - - /** OAuthSimple creator - * - * Create an instance of OAuthSimple - * - * @param api_key {string} The API Key (sometimes referred to as the consumer key) This value is usually supplied by the site you wish to use. - * @param shared_secret (string) The shared secret. This value is also usually provided by the site you wish to use. - */ - OAuthSimple = function (consumer_key,shared_secret) - { -/* if (api_key == undefined) - throw("Missing argument: api_key (oauth_consumer_key) for OAuthSimple. This is usually provided by the hosting site."); - if (shared_secret == undefined) - throw("Missing argument: shared_secret (shared secret) for OAuthSimple. This is usually provided by the hosting site."); -*/ var self = {}; - self._secrets={}; - - - // General configuration options. - if (consumer_key !== undefined) { - self._secrets['consumer_key'] = consumer_key; - } - if (shared_secret !== undefined) { - self._secrets['shared_secret'] = shared_secret; - } - self._default_signature_method= "HMAC-SHA1"; - self._action = "GET"; - self._nonce_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - self._parameters={}; - - - self.reset = function() { - this._parameters={}; - this._path=undefined; - this.sbs=undefined; - return this; - }; - - /** set the parameters either from a hash or a string - * - * @param {string,object} List of parameters for the call, this can either be a URI string (e.g. "foo=bar&gorp=banana" or an object/hash) - */ - self.setParameters = function (parameters) { - if (parameters === undefined) { - parameters = {}; - } - if (typeof(parameters) == 'string') { - parameters=this._parseParameterString(parameters); - } - this._parameters = this._merge(parameters,this._parameters); - if (this._parameters['oauth_nonce'] === undefined) { - this._getNonce(); - } - if (this._parameters['oauth_timestamp'] === undefined) { - this._getTimestamp(); - } - if (this._parameters['oauth_method'] === undefined) { - this.setSignatureMethod(); - } - if (this._parameters['oauth_consumer_key'] === undefined) { - this._getApiKey(); - } - if(this._parameters['oauth_token'] === undefined) { - this._getAccessToken(); - } - if(this._parameters['oauth_version'] === undefined) { - this._parameters['oauth_version']=='1.0'; - } - - return this; - }; - - /** convienence method for setParameters - * - * @param parameters {string,object} See .setParameters - */ - self.setQueryString = function (parameters) { - return this.setParameters(parameters); - }; - - /** Set the target URL (does not include the parameters) - * - * @param path {string} the fully qualified URI (excluding query arguments) (e.g "http://example.org/foo") - */ - self.setURL = function (path) { - if (path == '') { - throw ('No path specified for OAuthSimple.setURL'); - } - this._path = path; - return this; - }; - - /** convienence method for setURL - * - * @param path {string} see .setURL - */ - self.setPath = function(path){ - return this.setURL(path); - }; - - /** set the "action" for the url, (e.g. GET,POST, DELETE, etc.) - * - * @param action {string} HTTP Action word. - */ - self.setAction = function(action) { - if (action === undefined) { - action="GET"; - } - action = action.toUpperCase(); - if (action.match('[^A-Z]')) { - throw ('Invalid action specified for OAuthSimple.setAction'); - } - this._action = action; - return this; - }; - - /** set the signatures (as well as validate the ones you have) - * - * @param signatures {object} object/hash of the token/signature pairs {api_key:, shared_secret:, oauth_token: oauth_secret:} - */ - self.signatures = function(signatures) { - if (signatures) - { - this._secrets = this._merge(signatures,this._secrets); - } - // Aliases - if (this._secrets['api_key']) { - this._secrets.consumer_key = this._secrets.api_key; - } - if (this._secrets['access_token']) { - this._secrets.oauth_token = this._secrets.access_token; - } - if (this._secrets['access_secret']) { - this._secrets.oauth_secret = this._secrets.access_secret; - } - if (this._secrets['oauth_token_secret']) { - this._secrets.oauth_secret = this._secrets.oauth_token_secret; - } - // Gauntlet - if (this._secrets.consumer_key === undefined) { - throw('Missing required consumer_key in OAuthSimple.signatures'); - } - if (this._secrets.shared_secret === undefined) { - throw('Missing required shared_secret in OAuthSimple.signatures'); - } - if ((this._secrets.oauth_token !== undefined) && (this._secrets.oauth_secret === undefined)) { - throw('Missing oauth_secret for supplied oauth_token in OAuthSimple.signatures'); - } - return this; - }; - - self.setTokensAndSecrets = function(signatures) { - return this.signatures(signatures); - }; - - /** set the signature method (currently only Plaintext or SHA-MAC1) - * - * @param method {string} Method of signing the transaction (only PLAINTEXT and SHA-MAC1 allowed for now) - */ - self.setSignatureMethod = function(method) { - if (method === undefined) { - method = this._default_signature_method; - } - //TODO: accept things other than PlainText or SHA-MAC1 - if (method.toUpperCase().match(/(PLAINTEXT|HMAC-SHA1)/) === undefined) { - throw ('Unknown signing method specified for OAuthSimple.setSignatureMethod'); - } - this._parameters['oauth_signature_method']= method.toUpperCase(); - return this; - }; - - /** sign the request - * - * note: all arguments are optional, provided you've set them using the - * other helper functions. - * - * @param args {object} hash of arguments for the call - * {action:, path:, parameters:, method:, signatures:} - * all arguments are optional. - */ - self.sign = function (args) { - if (args === undefined) { - args = {}; - } - // Set any given parameters - if(args['action'] !== undefined) { - this.setAction(args['action']); - } - if (args['path'] !== undefined) { - this.setPath(args['path']); - } - if (args['method'] !== undefined) { - this.setSignatureMethod(args['method']); - } - this.signatures(args['signatures']); - this.setParameters(args['parameters']); - // check the parameters - var normParams = this._normalizedParameters(); - this._parameters['oauth_signature']=this._generateSignature(normParams); - return { - parameters: this._parameters, - signature: this._oauthEscape(this._parameters['oauth_signature']), - signed_url: this._path + '?' + this._normalizedParameters(), - header: this.getHeaderString() - }; - }; - - /** Return a formatted "header" string - * - * NOTE: This doesn't set the "Authorization: " prefix, which is required. - * I don't set it because various set header functions prefer different - * ways to do that. - * - * @param args {object} see .sign - */ - self.getHeaderString = function(args) { - if (this._parameters['oauth_signature'] === undefined) { - this.sign(args); - } - - var j,pName,pLength,result = 'OAuth '; - for (pName in this._parameters) - { - if (pName.match(/^oauth/) === undefined) { - continue; - } - if ((this._parameters[pName]) instanceof Array) - { - pLength = this._parameters[pName].length; - for (j=0;j>16)+(y>>16)+(l>>16);return(m<<16)|(l&0xFFFF);}function _r(n,c){return(n<>>(32-c));}function _c(x,l){x[l>>5]|=0x80<<(24-l%32);x[((l+64>>9)<<4)+15]=l;var w=[80],a=1732584193,b=-271733879,c=-1732584194,d=271733878,e=-1009589776;for(var i=0;i>5]|=(s.charCodeAt(i/8)&m)<<(32-_z-i%32);}return b;}function _h(k,d){var b=_b(k);if(b.length>16){b=_c(b,k.length*_z);}var p=[16],o=[16];for(var i=0;i<16;i++){p[i]=b[i]^0x36363636;o[i]=b[i]^0x5C5C5C5C;}var h=_c(p.concat(_b(d)),512+d.length*_z);return _c(o.concat(h),512+160);}function _n(b){var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s='';for(var i=0;i>2]>>8*(3-i%4))&0xFF)<<16)|(((b[i+1>>2]>>8*(3-(i+1)%4))&0xFF)<<8)|((b[i+2>>2]>>8*(3-(i+2)%4))&0xFF);for(var j=0;j<4;j++){if(i*8+j*6>b.length*32){s+=_p;}else{s+=t.charAt((r>>6*(3-j))&0x3F);}}}return s;}function _x(k,d){return _n(_h(k,d));}return _x(k,d); - } - - - self._normalizedParameters = function() { - var elements = new Array(), - paramNames = [], - i=0, - ra =0; - for (var paramName in this._parameters) - { - if (ra++ > 1000) { - throw('runaway 1'); - } - paramNames.unshift(paramName); - } - paramNames = paramNames.sort(); - pLen = paramNames.length; - for (;i 1000) { - throw('runaway 1'); - } - elements.push(this._oauthEscape(paramName) + '=' + - this._oauthEscape(sorted[j])); - } - continue; - } - elements.push(this._oauthEscape(paramName) + '=' + - this._oauthEscape(this._parameters[paramName])); - } - return elements.join('&'); - }; - - self._generateSignature = function() { - - var secretKey = this._oauthEscape(this._secrets.shared_secret)+'&'+ - this._oauthEscape(this._secrets.oauth_secret); - if (this._parameters['oauth_signature_method'] == 'PLAINTEXT') - { - return secretKey; - } - if (this._parameters['oauth_signature_method'] == 'HMAC-SHA1') - { - var sigString = this._oauthEscape(this._action)+'&'+this._oauthEscape(this._path)+'&'+this._oauthEscape(this._normalizedParameters()); - return this.b64_hmac_sha1(secretKey,sigString); - } - return null; - }; - - self._merge = function(source,target) { - if (source == undefined) - source = {}; - if (target == undefined) - target = {}; - for (var key in source) { - target[key] = source[key]; - } - return target; - } - - return self; - }; -} diff --git a/Website/static/runappios43c/lib/dropbox/dropbox.js b/Website/static/runappios43c/lib/dropbox/dropbox.js deleted file mode 100755 index 697b90b..0000000 --- a/Website/static/runappios43c/lib/dropbox/dropbox.js +++ /dev/null @@ -1,306 +0,0 @@ -/* * - * Dropbox Javascript API v1.0 * - * Copyright Ayush Goyal 2012 * - * * - * Uses the Javascript OAuth library by Rob Griffiths aka bytespider * - * https://github.com/bytespider/jsOAuth * - * * - * Licensed under the Apache License, Version 2.0 (the "License"); * - * you may not use this file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, software * - * distributed under the License is distributed on an "AS IS" BASIS, * - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * - * See the License for the specific language governing permissions and * - * limitations under the License. */ - -var dropbox = {}; - -//Change to your own Dropbox API keys -dropbox.consumerKey = "v6idq5t8xavq1cz"; -dropbox.consumerSecret = "62mo4p5i2skxzb2"; - -//access Token Epire Limit in milliseconds -accessTokenExpireLimit = 2505600000; - -//Set to "dropbox" if your application has been given full Dropbox folder access -dropbox.accessType = "sandbox"; - -dropbox.htmlAccessStorageKey = "accessTokenKeyIsLooooooooooooooooooongEnough"; -/*-------------------No editing required beneath this line-------------------*/ - -// function to setup dropbox.oauth object -dropbox.setupoauth = function(userEmail,userPass,success,failure){ - - failure = (typeof(failure) == 'function')? failure:dropbox.log; - console.log(userEmail); - console.log(userPass); - var requestURL = "https://api.dropbox.com/1/oauth/request_token"; - var authorizeURL = "https://www.dropbox.com/1/oauth/authorize"; - var accessURL = "https://api.dropbox.com/1/oauth/access_token"; - var loginURL = "https://www.dropbox.com/login"; - - var config = { - requestTokenUrl: requestURL, - authorizationUrl:authorizeURL, - accessTokenUrl: accessURL, - consumerKey : dropbox.consumerKey, - consumerSecret: dropbox.consumerSecret, - }; - - var loginData = { - login_email:userEmail, - login_password: userPass, - login_submit:"Sign in", - }; - console.log(loginData); - - oauth = OAuth(config); - oauth.fetchRequestToken(function(url){ - - //Split OAuth requestToken for later use - try{ - - var requestTokenTemp = url.split('?'); - requestTokenTemp = requestTokenTemp[1].split('&'); - var requestTokenSecret = requestTokenTemp[0].split('='); - requestTokenSecret = requestTokenSecret[1]; - var requestToken = requestTokenTemp[1].split('='); - requestToken = requestToken[1]; - } - catch(error){ - var errorObj = {}; - errorObj.text = '{"error":"Connection could not be established."}'; - failure(errorObj); - return; - } - var accessData={ - oauth_token:requestToken, - oauth_token_secret:requestTokenSecret - }; - - // for testing - console.log(requestToken + " " + requestTokenSecret); - - //Login in dropbox - oauth.post(loginURL,loginData,function(data){ - oauth.get(url,function(data){ - console.log(data); - textString = data.text; - pos = textString.search("TOKEN"); - relevent = textString.slice(pos,pos+40); - pos2 = relevent.search(","); - relevent = relevent.slice(0,pos2); - releventArray = relevent.split("'"); - authorizeToken = releventArray[1] - allowData = {allow_access : "Continue", - oauth_token:requestToken, - t : authorizeToken - } - oauth.post(url,allowData,function(data){ - - //Get Access Token - oauth.post(accessURL,accessData,function(data){ - - //Split OAuth AcessToken for later use - var accessTokenTemp=data["text"].split("&"); - var accessTokenSecret = accessTokenTemp[0].split('='); - accessTokenSecret = accessTokenSecret[1]; - var accessToken = accessTokenTemp[1].split('='); - accessToken = accessToken[1]; - - oauth.setAccessToken(accessToken, accessTokenSecret); - var dateValue = new Date(); - dateValue = dateValue.getTime(); - var accessTokenString = accessToken + '&' + accessTokenSecret + '&' +dateValue; - window.localStorage.setItem(dropbox.htmlAccessStorageKey,accessTokenString); - - //setup OAuth object - dropbox.oauth = oauth; - - //run the success function - if(typeof(success)=="function") - success(); - },failure); - - },failure); - },failure); - },failure); - },failure); -} - -dropbox.setupHtml5Oauth = function(){ - var accessDetails = window.localStorage.getItem(dropbox.htmlAccessStorageKey); - if(accessDetails){ - accessDetails = accessDetails.split('&'); - var config = { - consumerKey : dropbox.consumerKey, - consumerSecret: dropbox.consumerSecret, - }; - - var dateValue = new Date(); - dateValue = dateValue.getTime(); - accessDetails[2] = parseInt(accessDetails[2]); - if(dateValue - accessDetails[2] < accessTokenExpireLimit ){ - var oauth = OAuth(config); - oauth.setAccessToken(accessDetails[0], accessDetails[1]); - dropbox.oauth = oauth; - return true; - } - else{ - window.localStorage.removeItem(dropbox.htmlAccessStorageKey); - return false; - } - } - else - return false; -} - - -//function to get metadata about folder/file from dropbox -dropbox.getMetadata = function(location,success,failure){ - location = (typeof(location) == 'undefined')? null:location; - success = (typeof(success) == 'function')? success:dropbox.log; - failure = (typeof(failure) == 'function')? failure:dropbox.log; - - var metaURL = "https://api.dropbox.com/1/metadata/"+ dropbox.accessType + "/"; - if(location){ - metaURL = metaURL+location; - } - - dropbox.oauth.getJSON(metaURL,success,failure); -} - -//function to get dropbox AccountInfo -dropbox.getAccountInfo = function(){ - var accountInfoURL = "https://api.dropbox.com/1/account/info"; - - dropbox.oauth.getJSON(accountInfoURL,function(data){dropbox.getAccountInfo.Info = data;}, - dropbox.log); - -} - -//function to get contents of a file from dropbox(not download) -dropbox.getFile = function(path,success,failure){ - - success = (typeof(success) == 'function')? success:dropbox.log; - failure = (typeof(failure) == 'function')? failure:dropbox.log; - - - var getURL = "https://api-content.dropbox.com/1/files/"+ dropbox.accessType + "/"; - if(path){ - getURL = getURL+path; - } - dropbox.oauth.get(encodeURI(getURL),success,failure); - -} - -//function to generate download Url of a file from dropbox -dropbox.downloadFile = function(path){ - var getURL = "https://api-content.dropbox.com/1/files/"+ dropbox.accessType + "/"; - if(path){ - getURL = getURL+path; - } - var downloadURL = dropbox.signedUrl(getURL,""); - console.log(downloadURL); - return downloadURL; -} - - -// funtion to upload File -dropbox.uploadFile = function(path,fileObj,overwrite,success,failure){ - - - path = (typeof(path) == 'undefined')? null:path; //path of folder to upload file - - //upload URL - var uploadURL="https://api-content.dropbox.com/1/files_put/"+ dropbox.accessType + "/"; - if (path!= null && path!=""){ - uploadURL = uploadURL + path + '/' + fileObj.name; - } - else{ - uploadURL = uploadURL + fileObj.name; - } - - success = (typeof(success)=="function")?success:dropbox.log; - failure = (typeof(success)=="function")?failure:dropbox.log; - - - var options = { - method: 'PUT', - url: encodeURI(uploadURL), - success: success, - failure: failure, - headers: { - "Content-Type": fileObj.mimeType, - "Content-length": fileObj.length, - "overwrite":overwrite - }, - data: fileObj.string - }; - dropbox.oauth.request(options); - - -} - -//delete URL -dropbox.deletePath = function(path,success,failure){ - - - path = (typeof(path) == 'undefined')? null:path; //path of folder to upload file - success = (typeof(success) == 'function')? success:dropbox.log; - failure = (typeof(failure) == 'function')? failure:dropbox.log; - - //delete URL - var deleteURL="https://api.dropbox.com/1/fileops/delete"; - - if (path!= null && path!=""){ - - var options = { - method: 'POST', - url: encodeURI(deleteURL), - success: success, - failure: dropbox.log, - data: { - "path":path, - "root": dropbox.accessType - } - }; - dropbox.oauth.request(options); - } -} - -// general failure log -dropbox.log = function(data){ - console.log(data); -}; - - -// Get signed oauth url using OAuthSimple Library -dropbox.signedUrl = function(url,argumentsAsString){ - var accessTokenKey = dropbox.oauth.getAccessTokenKey(); - var accessTokenSecret = dropbox.oauth.getAccessTokenSecret(); - var resultUrl =(new OAuthSimple()).sign({path:url, - parameters:argumentsAsString, - signatures:{ - 'consumer_key':dropbox.consumerKey, 'shared_secret':dropbox.consumerSecret, - 'access_token':accessTokenKey,'access_secret':accessTokenSecret}}); - return resultUrl; -} - - -dropbox.file = function (id){ - var fileElement = document.getElementById(id); - - var fileObj = new Object(); - fileObj.name = fileElement.files[0].name; - fileObj.file = fileElement.files[0]; - fileObj.length = fileElement.files[0].size; - fileObj.mimeType = fileElement.files[0].type; - //fileObj.reader = new FileReader(); - //fileObj.reader.readAsBinaryString(fileElement.files[0]); - return fileObj; -} \ No newline at end of file diff --git a/Website/static/runappios43c/lib/dropbox/dropboxHandler.js b/Website/static/runappios43c/lib/dropbox/dropboxHandler.js deleted file mode 100755 index 1f20f6c..0000000 --- a/Website/static/runappios43c/lib/dropbox/dropboxHandler.js +++ /dev/null @@ -1,491 +0,0 @@ -dropboxHandler = {}; - -//Not used -// dropboxHandler.getAutheticated = function(success,failure){ -// $.mobile.changePage("dropbox.html"); -// console.log(success); -// console.log(failure); -// $('#dropboxLogin').live('pageshow',function(event){ -// $("#dropboxLoginButton").unbind(); -// $("#password").val(""); -// $("#dropboxLoginButton").click(function(){ -// var userEmail = $("#email").val(); -// var userPass = $("#password").val(); -// console.log(userEmail); -// console.log(userPass); -// $.mobile.pageLoading(); -// dropbox.setupoauth(userEmail,userPass,success,failure); - -// }); -// }); -// }; - -$('#filePage').live( 'pagebeforeshow',function(event){ - if(window.sessionStorage.getItem('dbLogin')) - { - $("#dropboxLoginButton").hide(); - $("#dropboxLogoutButton").show(); - } - else - { - $("#dropboxLoginButton").show(); - $("#dropboxLogoutButton").hide(); - } -}); - -//Get the authorization URL from Dropbox, and redirect the user to that URL, a boolean variable 'dbLogin' will be stored in -//session storage to indicate whether the user is logged in or not, in the onBodyLoad function in the runappios43.html file -dropboxHandler.login = function() { - $.ajax({ - type: 'GET', - url: "/dropbox", - data: {action: 'dropbox-auth-start'}, - dataType: 'json', - success: function(data) { - window.location.replace(data.url); - }, - error: function(e) { - alert("Unable to get auth URL"); - } - }); -}; - -//Delete the dropbox authentication token from cache/cookies and remove the dbLogin boolean variable from sessionStorage -dropboxHandler.logout = function(){ - $.ajax({ - type: 'GET', - url: "/dropbox", - data: {action: 'logout' }, - dataType: 'json', - success: function(data) { - window.sessionStorage.removeItem('dbLogin'); - alert("You have been logged out from dropbox"); - $("#dropboxLoginButton").show(); - $("#dropboxLogoutButton").hide(); - }, - error: function(e) { - alert("Unable to log out from Dropbox"); - } - }); -}; - -//Save the current sheet in dropbox -dropboxHandler.save = function() { - promptConfirm = function(fileStr) { - var fileObj = {}; - fileObj.mimeType = "text/plain"; - fileObj.name = fileStr; - - if (fileObj.name != 'null' && fileObj.name.length < 30){ - - var fileData = SocialCalc.WorkBookControlSaveSheet(); - - //fileObj.name += ".msc.txt"; - fileObj.string = encodeURIComponent(fileData); - // fileObj.length = fileObj.string.length; - - var success = function(){ - $.mobile.pageLoading(true); - alert("File saved in Dropbox"); - }; - - var failure = function(){ - $.mobile.pageLoading(true); - alert("File could not be saved in Dropbox"); - }; - - if(window.sessionStorage.getItem('dbLogin')) { - $.mobile.pageLoading(); - fileObj.action = 'upload'; - $.postJSON('/dropbox', fileObj, success, failure); - } - else - { - alert("Please login to dropbox"); - } - } - else if(fileObj.name.length >=30){ - alert("File name should be less than 30 characters"); - } - - else - { - alert("Invalid file name"); - } - }; - var fileName = window.prompt("Enter File Name"); - if (fileName) - { - promptConfirm(fileName); - } -} - -//Get the list of files in the user's dropbox folder, add them to the list with ID dropboxList, and then redirect to the -//dropboxList.html page -dropboxHandler.populateList = function(){ -$.mobile.pageLoading(); - -dropboxHandler.list = Array(); - success = function(data) { - if(data.contents.length == 0) { - $.mobile.pageLoading(true); - alert("No file in Dropbox"); - $.mobile.changePage('file.html'); - } - else { - for (item in data.contents) { - var str = data.contents[item].path; - // str = str.slice(1,-8); - dropboxHandler.list.push(str); - } - - $.mobile.pageLoading(true); - - $('#dropboxFileList').live( 'pagebeforeshow',function(event){ - $("#dropboxList").empty(); - for (item in dropboxHandler.list){ - var str = dropboxHandler.list[item]; - // console.log(str); - name = str.slice(1,-8) - $("#dropboxList").append( - '
  • '+ - '
    '+ - '
    '+ - '

    '+name+'

    '+ - '
    '+ - '
    '+ - '
    '+ - ''+ - ''+ - ''+ - '
    '+ - '
  • '); - } - $("#dropboxFileList *" ).page(); - $("#dropboxList").listview("refresh"); - //This was missing earlier - $("#dropboxList").show(); - }); - // console.log(dropboxHandler.list); - //this did not work - // $.mobile.changePage("dropboxList.html",{ transition: "pop"}); - - //So I had to do this. This code will replace the runappios43c/file.html?v=xs84c code with runappios43c/dropboxLogin.html - var url = window.location.href; - url = url.slice(0, url.indexOf('runappios43c')); - url += "runappios43c/dropboxList.html"; - // console.log("Final url: "+url); - - // $.mobile.changePage(url,{ transition: "pop"}); - window.location.replace(url); - } - - } - - failure = function (data){ - $.mobile.pageLoading(true); - console.log(data); - errorObj= JSON.parse(data.text); - console.log(errorObj); - errorStr = dropboxHandler.errorString(errorObj.error); - console.log(errorStr); - navigator.notification.alert("Connection was unsuccessful\n" + errorStr,null,applicationName); - alert("Connection was unsuccessful"); - } - - if(window.sessionStorage.getItem('dbLogin')) { - $.mobile.pageLoading(); - var message = {} - message.action = "listdir" - $.postJSON('/dropbox', message, success); - } - else{ - alert("Please login to Dropbox first."); - } -} - - -//This function will load the sheetdata from dropbox, and display it in the web app -dropboxHandler.View= function(str){ - $.mobile.pageLoading(); - success = function(data){ - - var fileContent = data.text; - $.mobile.pageLoading(true); - SocialCalc.WorkBookControlInsertWorkbook(decodeURIComponent(fileContent)); - SocialCalc.GetCurrentWorkBookControl().workbook.spreadsheet.editor.state = "start"; - SocialCalc.GetCurrentWorkBookControl().workbook.spreadsheet.ExecuteCommand('redisplay', ''); - $.mobile.changePage("#indexPage",{ transition: "pop"}); - } - str = decodeURI(str); - // var strFname = str +".msc"; - // var strFname = str +".msc.txt"; - var strFname = str; - console.log(strFname); - - var message = {} - message.action = "view" - message.fname = strFname; - $.postJSON('/dropbox', message, success); -} - -//function to handle delete in fileList -dropboxHandler.Delete = function (str) { - str = decodeURI(str); - - var deleteConfirm = function() { - $.mobile.pageLoading(); - // var fileNameStr = str + ".msc"; - var fileNameStr = str; - success = function(data) { - $.mobile.pageLoading(true); - var filterfunc = function(index) { - if($(this).find('h2').text() == str) - return true; - else - return false; - }; - $("#dropboxList li").filter(filterfunc).remove(); - if($("#dropboxList li").length ==0) { - $("#dropboxList").append('
  • No files in Dropbox
  • '); - } - alert("File deleted!"); - console.log(data); - }; - - failure = function(data) { - $.mobile.pageLoading(true); - alert("File could not be deleted"); - console.log(data); - }; - - var message = {} - message.action = "delete" - message.fname = fileNameStr; - - $.ajax({ - url: '/dropbox', - type: 'POST', - data: message, - dataType: 'json', - success: success, - error: failure - }); - } - - var confirm = window.confirm("Are you sure you want to delete the file '"+str+"' from Dropbox?"); - if (confirm) - { - deleteConfirm(); - } -}; - -dropboxHandler.saveLocal = function(str){ - $.mobile.pageLoading(); - var success = function(data) { - - var fileContent = data.text; - $.mobile.pageLoading(true); - // window.localStorage.setItem(str ,fileContent); - // cloud save the file !! - if (strFname[0] == '/') - { - strFname = strFname.slice(1, strFname.length); - } - if (strFname.indexOf('.msc')) - { - strFname = strFname.slice(0, strFname.indexOf('.msc')); - } - console.log("Saving as: "+strFname); - var message = {} - message.action = "savefile" - message.appname = Aspiring.appname - message.fname = strFname - message.data = fileContent - - $.postJSON("/webapp", message, function(response) { - result = response["result"] - if (result == "ok") { - // set the top right file to selected file - updateFileName(strFname); - alert("Saved "+strFname) - } else { - alert("Save failed "+strFname) - } - }); - // alert("File moved to local storage successfully"); - } - - var failure = function(data) { - $.mobile.pageLoading(true); - alert("File could not be saved"); - console.log(data); - }; - - // dropbox.getFile(strFname,success); - str = decodeURI(str); - // var strFname = str +".msc"; - // var strFname = str +".msc.txt"; - var strFname = str; - // console.log(strFname); - - var message = {} - message.action = "view" - message.fname = strFname; - $.postJSON('/dropbox', message, success); -} - -dropboxHandler.saveLocalPage = function() { - - $('#dropboxSaveList').live( 'pagebeforeshow',function(event) { - $("#dropboxCheckList").empty(); - var fieldElement = $('
    '); - for (item in dropboxHandler.list) { - var str = dropboxHandler.list[item]; - var checkboxElement = $(''+ - ''); - fieldElement.append(checkboxElement); - } - var divElement = $('
    '); - divElement.append(fieldElement); - divElement.page(); - $("#dropboxCheckList").append(divElement).trigger('create'); - }); - $.mobile.changePage("dropboxSaveLocal.html"); - //var url = window.location.href; - //url = url.slice(0, url.indexOf('runappios43c')); - //url += "runappios43c/dropboxSaveLocal.html"; - - //window.location.replace(url); - -}; - -dropboxHandler.saveLocalMultiple = function(str){ - $.mobile.pageLoading(); - var fileNames = []; - - $("#dropboxCheckList :checked").each( - function(index){ - var fileName = encodeURI($(this).attr("id").slice(9)); - // fileName = fileName + ".msc"; - fileNames.push(fileName); - }); - - dropboxHandler.recursiveSave(fileNames); - -} - -dropboxHandler.recursiveSave= function(fileNames){ - - if(fileNames.length!=0) { - var strFname = fileNames.pop(); - // dropbox.getFile(fileName,function(data){ - // var fileContent = data.text; - // var str = fileName.slice(0,-4); - // window.localStorage.setItem(str,fileContent); - // dropboxHandler.recursiveSave(fileNames); - // },function(data){ - // $.mobile.pageLoading(true); - // // navigator.notification.alert("Error occured while saving file",null,applicationName); - // alert("Error occured while saving file"); - // console.log(data); - // }); - - $.mobile.pageLoading(); - var success = function(data) { - console.log(data); - var fileContent = data.text; - $.mobile.pageLoading(true); - // window.localStorage.setItem(str ,fileContent); - // cloud save the file !! - if (strFname[0] == '/') - { - strFname = strFname.slice(1, strFname.length); - } - if (strFname.indexOf('.msc')) - { - strFname = strFname.slice(0, strFname.indexOf('.msc')); - } - console.log("Saving as: "+strFname); - var message = {} - message.action = "savefile" - message.appname = Aspiring.appname - message.fname = strFname - message.data = fileContent - console.log("Saving file "+strFname+" in cloud"); - - $.ajax({ - url: '/webapp', - type: 'POST', - data: message, - dataType: 'json', - success: function (response) { - if (response) - { - result = response["result"] - if (result == "ok") { - // set the top right file to selected file - updateFileName(strFname); - alert("Saved "+strFname); - dropboxHandler.recursiveSave(fileNames); - } else { - alert("Save failed "+strFname); - dropboxHandler.recursiveSave(fileNames); - } - } - else - { - alert("Unable to save file: "+strFname); - } - }, - error: function (e) { - alert("Save failed "+strFname); - dropboxHandler.recursiveSave(fileNames); - } - }); - } - - var failure = function(data) { - $.mobile.pageLoading(true); - alert("File could not be saved"); - console.log(data); - }; - - strFname = decodeURI(strFname); - // var strFname = fileName +".msc"; - // var strFname = fileName +".msc.txt"; - // var strFname = fileName; - - var message = {} - message.action = "view" - message.fname = strFname; - console.log("Getting file "+strFname+" from dropbox"); - console.log(message); - - $.ajax({ - url: '/dropbox', - type: 'POST', - data: message, - dataType: 'json', - success: success, - error: failure - }); - - } - else{ - $.mobile.pageLoading(true); - // navigator.notification.alert("Files saved successfully",null,applicationName); - alert("Files saved successfully"); - } -} - -dropboxHandler.errorString = function(str){ - if(str == "Token is not an authorized request token."){ - return "Login Error"; - } - if(str == "Connection could not be established."){ - return "Connection could not be established. Check your Internet Connectivity."; - } - - return "Undefined Error"; -} \ No newline at end of file diff --git a/Website/static/runappios43c/lib/dropbox/dropboxHandler_amazon.js b/Website/static/runappios43c/lib/dropbox/dropboxHandler_amazon.js deleted file mode 100644 index 0141ab2..0000000 --- a/Website/static/runappios43c/lib/dropbox/dropboxHandler_amazon.js +++ /dev/null @@ -1,562 +0,0 @@ -dropboxHandler = {}; - - -$('#dropboxlogin').live( 'pagebeforeshow',function(event){ - - var ele = document.getElementById("dropboxiframe") - ele.innerHTML = ''; -} -function GraphHorizontalBar(spreadsheet, range, gview, gtype, helpflag) { - - var maxheight, totalwidth, color, nitems, byrow, maxval, minval, i, cr, cr1, cell, val, extra, eachwidth, str, thisbar; - var values = []; - var labels = []; - - if (helpflag || !range) { - str = '

    '+ - 'This is the help text for graph type: '+SocialCalc.GraphTypesInfo[gtype].display+'.

    '+ - 'The Graph tab displays a very simple bar graph representation of the cells currently selected as a range to graph '+ - '(either in a single row across or column down). '+ - 'If the range is a single row or column, and if the row above (or column to the left) has values, those values are used as labels. '+ - 'Otherwise the cell coordinates are used (e.g., B5). '+ - 'This is a very early, minimal implementation for demonstration purposes. '+ - '

    '; - - gview.innerHTML = str; - - return; - } - - if (range.left==range.right) { // down - nitems = range.bottom - range.top + 1; - byrow = true; - } - else { - nitems = range.right - range.left + 1; - byrow = false; - } - - str = ""; - - maxheight = (spreadsheet.height-spreadsheet.nonviewheight)-50; - totalwidth = spreadsheet.width-30; - minval = null; - maxval = null; - - for (i=0; ival) minval = val; - values.push(val); - cell = spreadsheet.sheet.GetAssuredCell(cr1); - if ((range.right==range.left || range.top==range.bottom) && (cell.valuetype.charAt(0) == "t" || cell.valuetype.charAt(0) == "n")) { - labels.push(cell.datavalue+""); - } - else { - labels.push(val+""); - } - } - } - if(maxval < 0){ maxval = 0; } - if(minval > 0){ minval = 0; } - str = '
    '; - gview.innerHTML = str; - var profChartVals = new Array(); - var profChartLabels = new Array(); - - var canv = document.getElementById("myBarCanvas"); - var ctx = canv.getContext('2d'); - //deprecated mozTextStyle is used by the laptop's rendering engine - ctx.mozTextStyle = "10pt bold Arial"; - var maxheight = canv.height - 60; - totalwidth = canv.width; - var colors = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]; - var barColor= colors[Math.round(Math.random()*14)] + '' + colors[Math.round(Math.random()*14)] + ''+ colors[Math.round(Math.random()*14)]+ '' + colors[Math.round(Math.random()*14)]+ '' + colors[Math.round(Math.random()*14)]+ '' + colors[Math.round(Math.random()*14)]; - ctx.fillStyle = "#" + barColor; - var colorList = [barColor]; - eachwidth = Math.floor(maxheight / (values.length || 1))-4 || 1; - var zeroLine = totalwidth * (maxval / (maxval-minval)) - 5; - zeroLine = canv.width - zeroLine + 40; - ctx.lineWidth = 5; - ctx.moveTo(zeroLine,0); - ctx.lineTo(zeroLine,canv.height); - ctx.stroke(); - var yScale = totalwidth / (maxval-minval) * 4.4/5; - for (i=0; i 0){ - ctx.translate(zeroLine-22,45); - } - else{ - ctx.translate(zeroLine+15,45); - } - ctx.mozDrawText(labels[0]); - for (i=1; i 0)&&(values[i-1] < 0)){ - ctx.translate(-37,eachwidth); - } - else{ - if((values[i] < 0)&&(values[i-1] > 0)){ - ctx.translate(37,eachwidth); - } - else{ - ctx.translate(0,eachwidth); - } - } - ctx.mozDrawText(labels[i]); - } - - //order a Google Charts API image - var gChart = document.getElementById("googleBarChart"); - var zeroLine = (-1*minval) * yScale / (canv.width); - profChartUrl = 'chs=300x250&cht=bhs&chd=t:' + profChartVals.join(",") + "&chxt=x,y&chxl=1:|" + profChartLabels.reverse().join("|") + "|&chxr=0," + minval + "," + maxval + "&chp=" + zeroLine + "&chbh=a&chm=r,000000,0," + zeroLine + "," + (zeroLine + 0.005) + "&chco=" + colorList.join("|"); - gChart.innerHTML = ''; -} - -function MakePieChart(spreadsheet, range, gview, gtype, helpflag){ - var maxheight, totalwidth, color, nitems, byrow, maxval, minval, i, cr, cr1, cell, val, extra, eachwidth, str, thisbar; - var values = []; - var labels = []; - var total = 0; - - // collect the selected values and labels - if (range.left==range.right) { // down - nitems = range.bottom - range.top + 1; - byrow = true; - } - else { - nitems = range.right - range.left + 1; - byrow = false; - } - - // find total to be distributed over 2 Pi radians - for (i=0; i 1.5)&&(centralRad < 4.6)){ leftBias = 55; } - - ctx.translate(centerX + Math.cos(centralRad) * textRad - leftBias, centerY + Math.sin(centralRad) * textRad); - //deprecated mozDrawText is needed for the laptop's rendering engine - ctx.mozDrawText(labels[i] + " (" + Math.round(values[i]/total*100) + "%)"); - //this operation allows canvas to continue drawing - ctx.translate(-1*centerX - Math.cos(centralRad)*textRad + leftBias,-1*centerY - Math.sin(centralRad) * textRad); - ctx.fillRect(1,1,1,1); - ctx.closePath(); - profChartLabels += "|" + labels[i]; - - //prepare for next arc - lastStart += arcRads; - } - //replace HTML canvas with its PNG image - var realCanv = document.getElementById("canvImg"); - realCanv.src = canv.toDataURL(); - - //request a Google Charts API image - var gChart = document.getElementById("googleChart"); - profChartUrl = 'chs=300x145&cht=p&chd=t:' + profChartUrl.substring(1) + '&chl=' + profChartLabels.substring(1); - gChart.innerHTML = ''; -} - -function MakeLineChart(spreadsheet, range, gview, gtype, helpflag, isResize){ - var nitems, byrow, maxval, minval, i, cr, cr1, cell, val, extra, str, maxX, minX; - var values = []; - var labels = []; - var total = 0; - var colors = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]; - var shapes = ["s","o","c"]; - - // collect the selected values and labels - if (range.left==range.right) { // down - nitems = range.bottom - range.top + 1; - byrow = true; - } - else { - nitems = range.right - range.left + 1; - byrow = false; - } - - //if the user has set the min/max values, use them - if(isResize){ - try{ minX = 1 * document.getElementById("SocialCalc-graphMinX").value; } - catch(e){ minX = null; } - try{ maxX = 1 * document.getElementById("SocialCalc-graphMaxX").value; } - catch(e){ maxX = null; } - try{ minval = 1 * document.getElementById("SocialCalc-graphMinY").value; } - catch(e){ minval = null; } - try{ maxval = 1 * document.getElementById("SocialCalc-graphMaxY").value; } - catch(e){ maxval = null; } - } - - var evenlySpaced = false; - for (i=0; ival) && !isResize){ minval = val; } - values.push(val); - cell = spreadsheet.sheet.GetAssuredCell(cr1); - if ((range.right==range.left || range.top==range.bottom) && (cell.valuetype.charAt(0) == "t" || cell.valuetype.charAt(0) == "n")) { - labels.push(cell.datavalue+""); - if ((maxX==null || maxXcell.datavalue) && !isResize){ minX = cell.datavalue; } - } - else { - labels.push(cr); - evenlySpaced = true; - } - } - } - // create evenly-spaced X values if none were given - if(evenlySpaced){ - for(var i=0; i (labels[i-1] * 1)){ - //draw line to the next point - ctx.moveTo(lastX,topY-lastY); - ctx.lineTo((scaleFactorX * (labels[i] - minX)) + 20, topY-(scaleFactorY * (values[i] - minval) + 20)); - ctx.stroke(); - } - else{ - //start a new line - drawColor = "#" + colors[Math.round(Math.random()*14)] + '' + colors[Math.round(Math.random()*14)] + '' + colors[Math.round(Math.random()*14)] + '' + colors[Math.round(Math.random()*14)] + '' + colors[Math.round(Math.random()*14)] + '' + colors[Math.round(Math.random()*14)]; - ctx.strokeStyle = drawColor; - ctx.fillStyle = drawColor; - colorArray.push(drawColor.replace("#","")); - ctx.beginPath(); - } - - //calculate canvas coordinates for next point - lastX = scaleFactorX * (labels[i] - minX) + 20; - lastY = scaleFactorY * (values[i] - minval) + 20; - // draw different shapes - if((colorArray.length-1)%3 == 0){ - //square - ctx.fillRect(lastX-3,topY-lastY-3,6,6); - } - else if((colorArray.length-1)%3 == 1){ - //circle - ctx.beginPath(); - ctx.arc(lastX,topY-lastY,3,0,Math.PI * 2,false); - ctx.fill(); - } - else{ - // + sign - ctx.fillRect(lastX,topY-lastY-3,2,8); - ctx.fillRect(lastX-3,topY-lastY,8,2); - } - // update Google chart - if((labels[i] * 1) > (labels[i-1] * 1)){ - //add a point to the current line - profChart[profChart.length-2] += "," + Math.floor(lastX/canv.width*100); - profChart[profChart.length-1] += "," + Math.floor(lastY/canv.height*100); - } - else{ - //add a new line - var newIndex = profChart.length; - profChart[newIndex] = Math.floor(lastX/canv.width*100); - profChart[newIndex+1] = Math.floor(lastY/canv.height*100); - } - } - ctx.stroke(); - //colorMarkings stores the colors of the lines and orders input points to be marked - var colorMarkings = "&chco=" + colorArray.join(",") + "&chm="; - for(var i=0;i= 0){ - //draw X=0 axis on both canvas and Google chart - ctx.beginPath(); - ctx.strokeStyle = "#000000"; - ctx.moveTo(0,canv.height-(scaleFactorY * -1 * minval + 20)); - ctx.lineTo(canv.width,canv.height-(scaleFactorY * -1 * minval + 20)); - ctx.stroke(); - var graphPlace = 1-((canv.height-(scaleFactorY * -1 * minval + 20)) / canv.height); - colorMarkings += "|r,000000,0," + graphPlace + "," + (graphPlace + 0.005) - } - if(minX <= 0 && maxX >= 0){ - //draw Y=0 axis on both canvas and Google chart - ctx.beginPath(); - ctx.strokeStyle = "#000000"; - ctx.moveTo(scaleFactorX * -1 * minX + 20, 0); - ctx.lineTo(scaleFactorX * -1 * minX + 20, canv.height); - ctx.stroke(); - var graphPlace = (scaleFactorX * -1 * minX + 20) / canv.width; - colorMarkings += "|R,000000,0," + graphPlace + "," + (graphPlace + 0.005) - } - var gChart = document.getElementById("googleLineChart"); - //add margin to sides of Google chart - minX -= (maxX-minX)/23; - maxX += (maxX-minX)/23; - minval -= (maxval-minval)/18; - maxval += (maxval-minval)/18; - profChartUrl = 'chs=300x250' + colorMarkings + '&cht=lxy&chxt=x,y&chxr=0,' + minX + ',' + maxX + '|1,' + minval + ',' + maxval + '&chd=t:' + profChart.join("|"); - gChart.innerHTML = ''; -} - -function MakeScatterChart(spreadsheet, range, gview, gtype, helpflag, isResize){ - var nitems, byrow, maxval, minval, i, cr, cr1, cell, val, extra, str, maxX, minX, dotSizes; - var values = []; - var labels = []; - var total = 0; - var colors = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]; - - // collect the selected values and labels - if (range.left==range.right) { // down - nitems = range.bottom - range.top + 1; - byrow = true; - } - else { - nitems = range.right - range.left + 1; - byrow = false; - } - - //if the user has set the min/max values, use them - if(isResize){ - try{ minX = 1 * document.getElementById("SocialCalc-graphMinX").value; } - catch(e){ minX = null; } - try{ maxX = 1 * document.getElementById("SocialCalc-graphMaxX").value; } - catch(e){ maxX = null; } - try{ minval = 1 * document.getElementById("SocialCalc-graphMinY").value; } - catch(e){ minval = null; } - try{ maxval = 1 * document.getElementById("SocialCalc-graphMaxY").value; } - catch(e){ maxval = null; } - } - - var evenlySpaced = false; - dotSizes = new Array(); - for (i=0; ival) && !isResize){ minval = val; } - values.push(val); - cell = spreadsheet.sheet.GetAssuredCell(cr1); - if ((range.right==range.left || range.top==range.bottom) && (cell.valuetype.charAt(0) == "t" || cell.valuetype.charAt(0) == "n")) { - labels.push(cell.datavalue+""); - if ((maxX==null || maxXcell.datavalue) && !isResize){ minX = cell.datavalue; } - } - else { - labels.push(cr); - evenlySpaced = true; - } - cell = spreadsheet.sheet.GetAssuredCell(cr2); - if ((range.right==range.left || range.top==range.bottom) && (cell.valuetype.charAt(0) == "t" || cell.valuetype.charAt(0) == "n")) { - dotSizes.push(cell.datavalue+""); - } - else { - dotSizes.push("5"); - } - } - } - // create evenly-spaced X values if none were given - if(evenlySpaced){ - for(var i=0; i= 0){ - //draw X=0 axis on both canvas and Google chart - ctx.beginPath(); - ctx.strokeStyle = "#000000"; - ctx.moveTo(0,canv.height-(scaleFactorY * -1 * minval + 20)); - ctx.lineTo(canv.width,canv.height-(scaleFactorY * -1 * minval + 20)); - ctx.stroke(); - var graphPlace = 1-((canv.height-(scaleFactorY * -1 * minval + 20)) / canv.height); - colorMarkings += "|r,000000,0," + graphPlace + "," + (graphPlace + 0.005) - } - if(minX <= 0 && maxX >= 0){ - //draw Y=0 axis on both canvas and Google chart - ctx.beginPath(); - ctx.strokeStyle = "#000000"; - ctx.moveTo(scaleFactorX * -1 * minX + 20, 0); - ctx.lineTo(scaleFactorX * -1 * minX + 20, canv.height); - ctx.stroke(); - var graphPlace = (scaleFactorX * -1 * minX + 20) / canv.width; - colorMarkings += "|R,000000,0," + graphPlace + "," + (graphPlace + 0.005) - } - var gChart = document.getElementById("googleScatterChart"); - //add margin to sides of Google chart - minX -= (maxX-minX)/23; - maxX += (maxX-minX)/23; - minval -= (maxval-minval)/18; - maxval += (maxval-minval)/18; - profChartUrl = 'chs=300x250' + colorMarkings + '&cht=s&chxt=x,y&chxr=0,' + minX + ',' + maxX + '|1,' + minval + ',' + maxval + '&chd=t:' + profChart.join("|"); - gChart.innerHTML = ''; -} \ No newline at end of file diff --git a/Website/static/socialcalcimages.js b/Website/static/socialcalcimages.js deleted file mode 100644 index 3a1d43a..0000000 --- a/Website/static/socialcalcimages.js +++ /dev/null @@ -1,141 +0,0 @@ -var SocialCalc; -var SocialCalc; -if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; -} -if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); -} - -SocialCalc.getCellDetails = function (str) { - var col=""; - var i =-1; - var char; - var code = 0; - while(true) { - char = str.charCodeAt(++i); - if(char >=65 && char <=90) { - code = 26 * code + (char - 64); - col = col + str.charAt(i); - } - else { - break; - } - } - var row = str.substring(i); - var arr = []; - arr.push(code); - arr.push(parseInt(row)); - arr.push(col); - arr.push(row); - return arr; -} - -SocialCalc.getRange = function (str) { - var strarr = str.split(":"); - var arr = []; - arr.push(SocialCalc.getCellDetails(strarr[0])); - arr.push(SocialCalc.getCellDetails(strarr[1])); - var range = []; - range.push(arr[1][0] - arr[0][0] + 1); - range.push(arr[1][1] - arr[0][1] + 1); - return range; -} - - - -SocialCalc.Images = function() { - this.hieght = 0; - this.width = 0; - } - -SocialCalc.Images.Insert = function() { - document.getElementById("EmbedImage").style.display = "inline"; - SocialCalc.CmdGotFocus(document.getElementById('image-embed-range')); - } - -SocialCalc.Images.showImgForm = function(value) { - var x = value + "ImgForm"; - document.getElementById("localImgForm").style.display = "none"; - document.getElementById("urlImgForm").style.display = "none"; - document.getElementById(x).style.display = "inline"; - if(value = 'url') { - var txtBox = document.getElementById("imgurl"); - SocialCalc.CmdGotFocus(txtBox); - } - document.getElementById("image-embed-submit-button").style.display = "inline"; - document.getElementById("image-embed-cancel-button").style.display = "inline"; - } - -SocialCalc.Images.handleFileSelect = function(evt) { - var files = evt.target.files; - for (var i = 0, f; f = files[i]; i++) { - console.log(f); - if (!f.type.match('image.*')) { - continue; - } - var reader = new FileReader(); - // Need a closure to capture the file information. - reader.onload = (function(theFile) { - return function(e) { - document.getElementById("file-image-holder").src = e.target.result; - document.getElementById("file-image-holder").style.display = "inline"; - document.getElementById("file-text-holder").style.display = "none"; - var img = document.getElementById('file-image-holder'); - img.setAttribute("class","thumb"); - img.setAttribute("src",e.target.result); - img.setAttribute("title",theFile.title); - }; - })(f); - reader.readAsDataURL(f); - } - } - -SocialCalc.Images.getUrlImage = function () { - var str = document.getElementById("imgurl").value; - document.getElementById("url-image-holder").src = str; - document.getElementById("url-image-holder").style.display = "inline"; - document.getElementById("url-text-holder").style.display = "none"; - } - -SocialCalc.Images.Embed = function () { - var ifi = document.getElementById("img-file-inp"); - var fih = document.getElementById("file-image-holder"); - var uih = document.getElementById("url-image-holder"); - var ier = document.getElementById("image-embed-range"); - var imgsource = uih.width!=0?uih:fih; - var width = imgsource.width; - var height = imgsource.width; - - var colrange = width/SocialCalc.Constants.defaultColWidth; - var rowrange = height/20; - - var arr = SocialCalc.getRange(ier.value); - var height = 20 * arr[1]; - var str = ''; - - var spl = ier.value.split(":")[0]; - - var cmdk="merge "+ier.value+"\n"+"set "+spl+" textvalueformat text-html"+"\n"+"set "+spl+" text t "+str; - console.log(cmdk); - - SocialCalc.ScheduleSheetCommands(workbook.sheetArr[""+SocialCalc.GetCurrentWorkBookControl().currentSheetButton.id+""].sheet,cmdk,true,true) ; - - //cleanup - ifi.value = ""; - fih.src = ""; - fih.style.display = "none"; - uih.src = ""; - ier.value = ""; - uih.style.display = "none"; - document.getElementById("imgurl").value = ""; - document.getElementById("localImgForm").style.display = "none"; - document.getElementById("urlImgForm").style.display = "none"; - document.getElementById("embed-button").style.display = "none"; - document.getElementById("EmbedImage").style.display = "none"; - } - -SocialCalc.Images.hideImgForm = function(value) { - document.getElementById("EmbedImage").style.display = "none"; - } \ No newline at end of file diff --git a/Website/static/socialcalcpopup.js b/Website/static/socialcalcpopup.js deleted file mode 100644 index 33af813..0000000 --- a/Website/static/socialcalcpopup.js +++ /dev/null @@ -1,1618 +0,0 @@ -// -/* -// The module of the SocialCalc package for the optional popup menus in socialcalcspreadsheetcontrol.js -// -// (c) Copyright 2009 Socialtext, Inc. -// All Rights Reserved. -// -// The contents of this file are subject to the Artistic License 2.0; you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at http://socialcalc.org/licenses/al-20/. -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// -*/ - - var SocialCalc; // All values are stored in the master SocialCalc object - if (!SocialCalc) { - SocialCalc = {}; - } - - // The main Popup data -- there is only one set - - SocialCalc.Popup = {}; - - // Routines and values for each type of control, indexed by type name - // The value for each is an object constructed as follows: - // - // Create = function(type, id, attribs) - // Initialize = function(type, id, data) - // SetValue = function(type, id, value) - // GetValue = function(type, id) returns value - // SetDisabled = function(type, id, t/f) - // Show = function(type, id) - // Hide = function(type, id) - // Cancel = function(type, id) - // Reset = function(type) - // - // data = object to hold type-specific data - // - - SocialCalc.Popup.Types = {}; - - // Definitions for each individual control, indexed by id - // The value for each is an object constructed as follows: - // - // type: type name of the control - // value: current value of the control (usually a string, but can depend on type) - // data: object with type-specific items - // - - SocialCalc.Popup.Controls = {}; - - // System-wide values of currently active control - // - // id: id of current control or null - // - - SocialCalc.Popup.Current = {}; - - // Other values used by the Popup system - // - - SocialCalc.Popup.imagePrefix = "images/sc-"; // image prefix - - // Override this for localization - - SocialCalc.Popup.LocalizeString = function(str) {return str;}; - - -// * * * * * * * * * * * * * * * * -// -// GENERAL ROUTINES -// -// * * * * * * * * * * * * * * * * - -// -// SocialCalc.Popup.Create(type, id, attribs) -// -// Creates a control of type "type" as the children of document element "id" using "attribs" -// - -SocialCalc.Popup.Create = function(type, id, attribs) { - - var pt = SocialCalc.Popup.Types[type]; - if (pt && pt.Create) { - pt.Create(type, id, attribs); - } - - } - - -// -// SocialCalc.Popup.SetValue(id, value) -// -// Sets the value of control. -// - -SocialCalc.Popup.SetValue = function(id, value) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - var pt = spt[type]; - var spcdata = spc[id].data; - - if (pt && pt.Create) { - pt.SetValue(type, id, value); - if (spcdata.attribs && spcdata.attribs.changedcallback) { - spcdata.attribs.changedcallback(spcdata.attribs, id, value); - } - } - - } - - -// -// SocialCalc.Popup.SetDisabled(id, disabled) -// -// Sets whether the control is disabled (true) or not (false). -// - -SocialCalc.Popup.SetDisabled = function(id, disabled) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - if (sp.Current.id && id == sp.Current.id) { - pt.Hide(type, sp.Current.id); - sp.Current.id = null; - } - pt.SetDisabled(type, id, disabled); - } - - } - - -// -// SocialCalc.Popup.GetValue(id) -// -// Returns the value of control. -// - -SocialCalc.Popup.GetValue = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Create) { - return pt.GetValue(type, id); - } - - return null; - - } - - -// -// SocialCalc.Popup.Initialize(id, data) -// -// Gives "data" to the appropriate initialization code. -// - -SocialCalc.Popup.Initialize = function(id, data) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - var type = spc[id].type; - - var pt = spt[type]; - if (pt && pt.Initialize) { - pt.Initialize(type, id, data); - } - - } - - -// -// SocialCalc.Popup.Reset(type) -// -// Resets Popup, such as when turning to page. -// - -SocialCalc.Popup.Reset = function(type) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (spt[type].Reset) spt[type].Reset(type); - - } - - -// -// SocialCalc.Popup.CClick(id) -// -// Should be called when the user clicks on a control to do the popup -// - -SocialCalc.Popup.CClick = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!spc[id]) {alert("Unknown control "+id);return;} - - if (spc[id].data && spc[id].data.disabled) return; - - var type = spc[id].type; - - var pt = spt[type]; - - if (sp.Current.id) { - spt[spc[sp.Current.id].type].Hide(type, sp.Current.id); - if (id == sp.Current.id) { // same one - done - sp.Current.id = null; - return; - } - } - - if (pt && pt.Show) { - pt.Show(type, id); - } - - sp.Current.id = id; - - } - - -// -// SocialCalc.Popup.Close() -// -// Used to close any open popup. -// - -SocialCalc.Popup.Close = function() { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - sp.CClick(sp.Current.id); - - } - -// -// SocialCalc.Popup.Cancel() -// -// Closes Popup and restores old value -// - -SocialCalc.Popup.Cancel = function() { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (!sp.Current.id) return; - - var type = spc[sp.Current.id].type; - - var pt = spt[type]; - - pt.Cancel(type, sp.Current.id); - - sp.Current.id = null; - - } - -// -// ele = SocialCalc.Popup.CreatePopupDiv(id, attribs) -// -// Utility function to create the main popup div of width attribs.width. -// If attribs.title, create one with that text, and optionally attribs.moveable. -// - -SocialCalc.Popup.CreatePopupDiv = function(id, attribs) { - - var pos, ele; - - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = document.createElement("div"); - main.style.position = "absolute"; - - pos = SocialCalc.GetElementPositionWithScroll(spcdata.mainele); - - main.style.top = (pos.top+spcdata.mainele.offsetHeight)+"px"; - main.style.left = (pos.left)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - if (attribs.width) { - main.style.width = attribs.width; - } - - spcdata.mainele.appendChild(main); - - if (attribs.title) { - main.innerHTML = ''+ - ''+ - '
    '+attribs.title+' X 
    '; - - if (attribs.moveable) { - spcdata.dragregistered = main.firstChild.firstChild.firstChild.firstChild; - SocialCalc.DragRegister(spcdata.dragregistered, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - } - } - - return main; - - } - -// -// SocialCalc.Popup.EnsurePosition(id, container) -// -// Utility function to make sure popup is positioned completely within container (both element objects) -// and appropriate with respect to the main element controlling the popup. -// - -SocialCalc.Popup.EnsurePosition = function(id, container) { - - var sp = SocialCalc.Popup; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var main = spcdata.mainele.firstChild; - if (!main) {alert("No main popup element firstChild.");return}; - var popup = spcdata.popupele; - - function GetLayoutValues(ele) { - var r = SocialCalc.GetElementPositionWithScroll(ele); - r.height = ele.offsetHeight; - r.width = ele.offsetWidth; - r.bottom = r.top+r.height; - r.right = r.left+r.width; - return r; - } - - var p = GetLayoutValues(popup); - var c = GetLayoutValues(container); - var m = GetLayoutValues(main); - var t = 0; // type of placement -//addmsg("popup t/r/b/l/h/w= "+p.top+"/"+p.right+"/"+p.bottom+"/"+p.left+"/"+p.height+"/"+p.width); -//addmsg("container t/r/b/l/h/w= "+c.top+"/"+c.right+"/"+c.bottom+"/"+c.left+"/"+c.height+"/"+c.width); -//addmsg("main t/r/b/l/h/w= "+m.top+"/"+m.right+"/"+m.bottom+"/"+m.left+"/"+m.height+"/"+m.width); - - // Check various layout cases in priority order - - if (m.bottom+p.height < c.bottom && m.left+p.width < c.right) { // normal case: room on bottom and right - popup.style.top = m.bottom + "px"; - popup.style.left = m.left + "px"; - t = 1; - } - - else if (m.top-p.height > c.top && m.left+p.width < c.right) { // room on top and right - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = m.left + "px"; - t = 2; - } - - else if (m.bottom+p.height < c.bottom && m.right-p.width > c.left) { // room on bottom and left - popup.style.top = m.bottom + "px"; - popup.style.left = (m.right-p.width) + "px"; - t = 3; - } - - else if (m.top-p.height > c.top && m.right-p.width > c.left) { // room on top and left - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = (m.right-p.width) + "px"; - t = 4; - } - - else if (m.bottom+p.height < c.bottom && p.width < c.width) { // room on bottom and middle - popup.style.top = m.bottom + "px"; - popup.style.left = (c.left+Math.floor((c.width-p.width)/2)) + "px"; - t = 5; - } - - else if (m.top-p.height > c.top && p.width < c.width) { // room on top and middle - popup.style.top = (m.top-p.height) + "px"; - popup.style.left = (c.left+Math.floor((c.width-p.width)/2)) + "px"; - t = 6; - } - - else if (p.height < c.height && m.right+p.width < c.right) { // room on middle and right - popup.style.top = (c.top+Math.floor((c.height-p.height)/2)) + "px"; - popup.style.left = m.right + "px"; - t = 7; - } - - else if (p.height < c.height && m.left-p.width > c.left) { // room on middle and left - popup.style.top = (c.top+Math.floor((c.height-p.height)/2)) + "px"; - popup.style.left = (m.left-p.width) + "px"; - t = 8; - } - - else { // nothing works, so leave as it is - } -//addmsg("Popup layout "+t); - -} - -// -// ele = SocialCalc.Popup.DestroyPopupDiv(ele, dragregistered) -// -// Utility function to get rid of the main popup div. -// - -SocialCalc.Popup.DestroyPopupDiv = function(ele, dragregistered) { - - if (!ele) return; - - ele.innerHTML = ""; - - SocialCalc.DragUnregister(dragregistered); // OK to do this even if not registered - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - } - -// -// Color Utility Functions -// - -SocialCalc.Popup.RGBToHex = function(val) { - - var sp = SocialCalc.Popup; - - if (val=="") { - return "000000"; - } - var rgbvals = val.match(/(\d+)\D+(\d+)\D+(\d+)/); - if (rgbvals) { - return sp.ToHex(rgbvals[1])+sp.ToHex(rgbvals[2])+sp.ToHex(rgbvals[3]); - } - else { - return "000000"; - } - } - -SocialCalc.Popup.HexDigits="0123456789ABCDEF"; - -SocialCalc.Popup.ToHex = function(num) { - var sp = SocialCalc.Popup; - var first=Math.floor(num / 16); - var second=num % 16; - return sp.HexDigits.charAt(first)+sp.HexDigits.charAt(second); - } - -SocialCalc.Popup.FromHex = function(str) { - - var sp = SocialCalc.Popup; - var first = sp.HexDigits.indexOf(str.charAt(0).toUpperCase()); - var second = sp.HexDigits.indexOf(str.charAt(1).toUpperCase()); - return ((first>=0)?first:0)*16+((second>=0)?second:0); - } - -SocialCalc.Popup.HexToRGB = function(val) { - - var sp = SocialCalc.Popup; - - return "rgb("+sp.FromHex(val.substring(1,3))+","+sp.FromHex(val.substring(3,5))+","+sp.FromHex(val.substring(5,7))+")"; - - } - -SocialCalc.Popup.makeRGB = function(r, g, b) { - return "rgb("+(r>0?r:0)+","+(g>0?g:0)+","+(b>0?b:0)+")"; - } - -SocialCalc.Popup.splitRGB = function(rgb) { - var parts = rgb.match(/(\d+)\D+(\d+)\D+(\d+)\D/); - if (!parts) { - return {r:0, g:0, b:0}; - } - else { - return {r: parts[1]-0, g: parts[2]-0, b: parts[3]-0}; - } - } - -// * * * * * * * * * * * * * * * * -// -// ROUTINES FOR EACH TYPE -// -// * * * * * * * * * * * * * * * * - -// -// List -// -// type: List -// value: value of control, -// display: "value to display", -// custom: true if custom value, -// disabled: t/f, -// attribs: { -// title: "popup title string", -// moveable: t/f, -// width: optional width, e.g., "100px", -// ensureWithin: optional element object to ensure popup fits within if possible -// changedcallback: optional function(attribs, id, newvalue), -// ... -// } -// data: { -// ncols: calculated number of columns -// options: [ -// {o: option-name, v: value-to-return, -// a: {option attribs} // optional: {skip: true, custom: true, cancel: true, newcol: true} -// }, -// ...] -// } -// -// popupele: gets popup element object when created -// contentele: gets element created with all the content -// listdiv: gets div with list of items -// customele: gets input element with custom value -// dragregistered: gets element, if any, registered as draggable -// - -SocialCalc.Popup.Types.List = {}; - -SocialCalc.Popup.Types.List.Create = function(type, id, attribs) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - var spcid = {type: type, value: "", display: "", data: {}}; - if (spc[id]) {alert("Already created "+id); return;} - spc[id] = spcid; - var spcdata = spcid.data; - - spcdata.attribs = attribs || {}; - - var ele = document.getElementById(id); - if (!ele) {alert("Missing element "+id); return;} - - spcdata.mainele = ele; - - ele.innerHTML = ''; - - spcdata.options = []; // set to nothing - use Initialize to fill - - } - -SocialCalc.Popup.Types.List.SetValue = function(type, id, value) { - - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - spcdata.value = value; - spcdata.custom = false; - - for (i=0; i'; - - spcdata.customele = ele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = ele; - } - else { - str = SocialCalc.Popup.Types.List.MakeList(type, id); - - ele = document.createElement("div"); - ele.innerHTML = '
    '+str+'
    '; - - spcdata.customele = null; - spcdata.listdiv = ele.firstChild; - spcdata.contentele = ele; - } - - if (spcdata.mainele && spcdata.mainele.firstChild) { - spcdata.mainele.firstChild.disabled = true; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - -SocialCalc.Popup.Types.List.MakeList = function(type, id) { - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data - - var str = ''; - var td = '
    '; - - str += td; - - spcdata.ncols = 1; - - for (i=0; i'+td; - spcdata.ncols += 1; - continue; - } - if (o.a.skip) { - str += '
    '+o.o+'
    '; - continue; - } - } - if (o.v == spcdata.value && !(o.a && (o.a.custom || o.a.cancel))) { // matches value - bg = "background-color:#DDF;"; - } - else { - bg = ""; - } - str += '
    '+o.o+'
    '; - } - - str += "
    "; - - return str; - - } - - -SocialCalc.Popup.Types.List.MakeCustom = function(type, id) { - - var SPLoc = SocialCalc.Popup.LocalizeString; - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - var val = spcdata.value; - val = SocialCalc.special_chars(val); - - str = '

    '+ - '

    '+ - ''+ - ''+ - ''+ - '
    '; - - return str; - - } - - -SocialCalc.Popup.Types.List.ItemClicked = function(id, num) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var a = spcdata.options[num].a; - - if (a && a.custom) { - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeCustom("List", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = nele.firstChild.firstChild.childNodes[1]; - spcdata.listdiv = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - return; - } - - if (a && a.cancel) { - SocialCalc.Popup.Close(); - return; - } - - SocialCalc.Popup.SetValue(id, spcdata.options[num].v); - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.List.CustomToList = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.List.MakeList("List", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = null; - spcdata.listdiv = nele.firstChild; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - } - - -SocialCalc.Popup.Types.List.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.customele.value); - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.List.MouseMove = function(id, ele) { - - var col, i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var list = spcdata.listdiv; - - if (!list) return; - - var rowele = list.firstChild.firstChild.firstChild; // div.table.tbody.tr - - for (col=0; col '; - - } - -SocialCalc.Popup.Types.ColorChooser.SetValue = function(type, id, value) { - - var i, img, pos; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.value = value; - spcdata.custom = false; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (spcdata.value) { - spcdata.mainele.firstChild.style.backgroundColor = spcdata.value; - if (spca.backgroundImage) { - img = "url("+sp.imagePrefix+spca.backgroundImage+")"; - } - else { - img = ""; - } - pos = "center center"; - } - else { - spcdata.mainele.firstChild.style.backgroundColor = "#FFF"; - if (spca.backgroundImageDefault) { - img = "url("+sp.imagePrefix+spca.backgroundImageDefault+")"; - pos = "center center"; - } - else { - img = "url("+sp.imagePrefix+"defaultcolor.gif)"; - pos = "left top"; - } - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } - - } - - -SocialCalc.Popup.Types.ColorChooser.SetDisabled = function(type, id, disabled) { - - var i; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - var spca = spcdata.attribs; - - spcdata.disabled = disabled; - - if (spcdata.mainele && spcdata.mainele.firstChild) { - if (disabled) { - spcdata.mainele.firstChild.style.backgroundColor = "#DDD"; - if (spca.backgroundImageDisabled) { - img = "url("+sp.imagePrefix+spca.backgroundImageDisabled+")"; - pos = "center center"; - } - else { - img = "url("+sp.imagePrefix+"defaultcolor.gif)"; - pos = "left top"; - } - spcdata.mainele.firstChild.style.backgroundPosition = pos; - spcdata.mainele.firstChild.style.backgroundImage = img; - } - else { - sp.SetValue(id, spcdata.value); - } - } - - } - - -SocialCalc.Popup.Types.ColorChooser.GetValue = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - return spcdata.value; - - } - - -SocialCalc.Popup.Types.ColorChooser.Initialize = function(type, id, data) { - - var a; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - for (a in data.attribs) { - spcdata.attribs[a] = data.attribs[a]; - } - - if (data.value) { // if has a value, set to it - sp.SetValue(id, data.value); - } - - } - - -SocialCalc.Popup.Types.ColorChooser.Reset = function(type) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - - if (sp.Current.id && spc[sp.Current.id].type == type) { // we have a popup - spt[type].Hide(type, sp.Current.id); - sp.Current.id = null; - } - - } - - -SocialCalc.Popup.Types.ColorChooser.Show = function(type, id) { - - var i, ele, mainele; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data - - var str = ""; - - spcdata.oldvalue = spcdata.value; // remember starting value - - spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs); - - if (spcdata.custom) { - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom(type, id); - - ele = document.createElement("div"); - ele.innerHTML = '
    '+str+'
    '; - - spcdata.customele = ele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = ele; - } - else { - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid(type, id); - - ele = document.createElement("div"); - ele.style.padding = "3px"; - ele.style.backgroundColor = "#CCC"; - ele.appendChild(mainele); - - spcdata.customele = null; - spcdata.contentele = ele; - } - - spcdata.popupele.appendChild(ele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - -SocialCalc.Popup.Types.ColorChooser.MakeCustom = function(type, id) { - - var i, ele, o, bg; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - var SPLoc = sp.LocalizeString; - - var style = 'style="font-size:smaller;"'; - - var str = ""; - - str = '

    '+ - '#

    '+ - ''+ - ''+ - '
    '; - - return str; - - } - - -SocialCalc.Popup.Types.ColorChooser.ItemClicked = function(id, num) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.Close(); - - } - - -SocialCalc.Popup.Types.ColorChooser.CustomToList = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - } - - -SocialCalc.Popup.Types.ColorChooser.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.customele.value); - - sp.Close(); - - } - - -SocialCalc.Popup.Types.ColorChooser.Hide = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered); - spcdata.popupele = null; - - } - - -SocialCalc.Popup.Types.ColorChooser.Cancel = function(type, id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - sp.SetValue(id, spcdata.oldvalue); // reset to old value - - SocialCalc.Popup.Types.ColorChooser.Hide(type, id); - - } - - -SocialCalc.Popup.Types.ColorChooser.CreateGrid = function (type, id) { - - var ele, pos, row, rowele, col, g; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var SPLoc = sp.LocalizeString; - var spcdata = spc[id].data; - spcdata.grid = {}; - var grid = spcdata.grid; - - var mainele = document.createElement("div"); - - ele = document.createElement("table"); - ele.cellSpacing = 0; - ele.cellPadding = 0; - ele.style.width = "100px"; - grid.table = ele; - - ele = document.createElement("tbody"); - grid.table.appendChild(ele); - grid.tbody = ele; - - for (row=0; row<16; row++) { - rowele = document.createElement("tr"); - for (col=0; col<5; col++) { - g = {}; - grid[row+","+col] = g; - ele = document.createElement("td"); - ele.style.fontSize = "1px"; - ele.innerHTML = " "; - ele.style.height = "10px"; - if (col<=1) { - ele.style.width = "17px"; - ele.style.borderRight = "3px solid white"; - } - else { - ele.style.width = "20px"; - ele.style.backgroundRepeat = "no-repeat"; - } - rowele.appendChild(ele); - g.ele = ele; - } - grid.tbody.appendChild(rowele); - } - mainele.appendChild(grid.table); - - ele = document.createElement("div"); - ele.style.marginTop = "3px"; - ele.innerHTML = ''+ - ''+ - ''+ - ''+ - '
     #'+SPLoc("OK")+'
    '; - grid.defaultbox = ele.firstChild.firstChild.firstChild.childNodes[0]; - grid.defaultbox.onclick = spt.ColorChooser.DefaultClicked; - grid.custom = ele.firstChild.firstChild.firstChild.childNodes[1]; - grid.custom.onclick = spt.ColorChooser.CustomClicked; - grid.msg = ele.firstChild.firstChild.firstChild.childNodes[2]; - grid.msg.onclick = spt.ColorChooser.CloseOK; - mainele.appendChild(ele); - - grid.table.onmousedown = spt.ColorChooser.GridMouseDown; - - spt.ColorChooser.DetermineColors(id); - spt.ColorChooser.SetColors(id); - - return mainele; - - } - -SocialCalc.Popup.Types.ColorChooser.gridToG = function(grid, row, col) { - - return grid[row+","+col]; - - } - -SocialCalc.Popup.Types.ColorChooser.DetermineColors = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - var col, row; - var rgb = sp.splitRGB(spcdata.value); - var color; - - col = 2; - row = 16-Math.floor((rgb.r+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(17*(15-row),0,0); - } - - col = 3; - row = 16-Math.floor((rgb.g+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(0,17*(15-row),0); - } - - col = 4; - row = 16-Math.floor((rgb.b+16)/16); - grid["selectedrow"+col] = row; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(0,0,17*(15-row)); - } - - col = 1; - for (row=0; row<16; row++) { - sptc.gridToG(grid,row,col).rgb = sp.makeRGB(17*(15-row),17*(15-row),17*(15-row)); - } - - col = 0; - var steps = [0, 68, 153, 204, 255]; - var commonrgb = ["400", "310", "420", "440", "442", "340", "040", "042", "032", "044", "024", "004", "204", "314", "402", "414"]; - var x; - for (row=0; row<16; row++) { - x = commonrgb[row]; - sptc.gridToG(grid,row,col).rgb = "rgb("+steps[x.charAt(0)-0]+","+steps[x.charAt(1)-0]+","+steps[x.charAt(2)-0]+")"; - } - - } - -SocialCalc.Popup.Types.ColorChooser.SetColors = function(id) { - - var row, col, g, ele, rgb; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - var spcdata = spc[id].data; - var grid = spcdata.grid; - - for (row=0; row<16; row++) { - for (col=0; col<5; col++) { - g = sptc.gridToG(grid,row, col); - g.ele.style.backgroundColor = g.rgb; - g.ele.title = sp.RGBToHex(g.rgb); - if (grid["selectedrow"+col]==row) { - g.ele.style.backgroundImage = "url("+sp.imagePrefix+"chooserarrow.gif)"; - } - else { - g.ele.style.backgroundImage = ""; - } - } - } - - sp.SetValue(id, spcdata.value); - - grid.msg.style.backgroundColor = spcdata.value; - rgb = sp.splitRGB(spcdata.value || "rgb(255,255,255)"); - if (rgb.r+rgb.g+rgb.b < 220) { - grid.msg.style.color = "#FFF"; - } - else { - grid.msg.style.color = "#000"; - } - if (!spcdata.value) { // default - grid.msg.style.backgroundColor = "#FFF"; - grid.msg.style.backgroundImage = "url("+sp.imagePrefix+"defaultcolor.gif)"; - grid.msg.title = "Default"; - } - else { - grid.msg.style.backgroundImage = ""; - grid.msg.title = sp.RGBToHex(spcdata.value); - } - - } - -SocialCalc.Popup.Types.ColorChooser.GridMouseDown = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - var grid = spcdata.grid; - - switch (event.type) { - case "mousedown": - grid.mousedown = true; - break; - case "mouseup": - grid.mousedown = false; - break; - case "mousemove": - if (!grid.mousedown) { - return; - } - break; - } - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - var gpos = SocialCalc.GetElementPosition(grid.table); - var row = Math.floor((clientY-gpos.top-2)/10); // -2 is to split the diff btw IE & FF - row = row < 0 ? 0 : row; - var col = Math.floor((clientX-gpos.left)/20); - row = row < 0 ? 0 : (row > 15 ? 15 : row); - col = col < 0 ? 0 : (col > 4 ? 4 : col); - var color = sptc.gridToG(grid,row,col).ele.style.backgroundColor; - var newrgb = sp.splitRGB(color); - var oldrgb = sp.splitRGB(spcdata.value); - - switch (col) { - case 2: - spcdata.value = sp.makeRGB(newrgb.r, oldrgb.g, oldrgb.b); - break; - case 3: - spcdata.value = sp.makeRGB(oldrgb.r, newrgb.g, oldrgb.b); - break; - case 4: - spcdata.value = sp.makeRGB(oldrgb.r, oldrgb.g, newrgb.b); - break; - case 0: - case 1: - spcdata.value = color; - } - - sptc.DetermineColors(id); - sptc.SetColors(id); - - } - - -SocialCalc.Popup.Types.ColorChooser.ControlClicked = function(id) { - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var cid = sp.Current.id; - if (!cid || id != cid) { - sp.CClick(id); - return; - } - - sptc.CloseOK(); - - } - -SocialCalc.Popup.Types.ColorChooser.DefaultClicked = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - spcdata.value = ""; - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - - } - -SocialCalc.Popup.Types.ColorChooser.CustomClicked = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - var oele, str, nele; - - oele = spcdata.contentele; - str = SocialCalc.Popup.Types.ColorChooser.MakeCustom("ColorChooser", id); - nele = document.createElement("div"); - nele.innerHTML = '
    '+str+'
    '; - spcdata.customele = nele.firstChild.firstChild.childNodes[2]; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - spcdata.customele.value = sp.RGBToHex(spcdata.value); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - - } - - - -SocialCalc.Popup.Types.ColorChooser.CustomToGrid = function(id) { - - var oele, str, nele; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#"+spcdata.customele.value)); - - var oele, mainele, nele; - - oele = spcdata.contentele; - mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid("ColorChooser", id); - nele = document.createElement("div"); - nele.style.padding = "3px"; - nele.style.backgroundColor = "#CCC"; - nele.appendChild(mainele); - spcdata.customele = null; - spcdata.contentele = nele; - spcdata.popupele.replaceChild(nele, oele); - - if (spcdata.attribs.ensureWithin) { - SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin); - } - } - - -SocialCalc.Popup.Types.ColorChooser.CustomOK = function(id) { - - var i, c; - var sp = SocialCalc.Popup; - var spt = sp.Types; - var spc = sp.Controls; - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, sp.HexToRGB("#"+spcdata.customele.value)); - - SocialCalc.Popup.Close(); - - } - -SocialCalc.Popup.Types.ColorChooser.CloseOK = function(e) { - - var event = e || window.event; - - var sp = SocialCalc.Popup; - var spt = sp.Types; - var sptc = spt.ColorChooser; - var spc = sp.Controls; - - var id = sp.Current.id; - if (!id) return; - - var spcdata = spc[id].data; - - SocialCalc.Popup.SetValue(id, spcdata.value); - - SocialCalc.Popup.Close(); - - } - diff --git a/Website/static/socialcalcspreadsheetcontrol.js b/Website/static/socialcalcspreadsheetcontrol.js deleted file mode 100644 index 6d7c113..0000000 --- a/Website/static/socialcalcspreadsheetcontrol.js +++ /dev/null @@ -1,3697 +0,0 @@ -// -// SocialCalcSpreadsheetControl -// -/* -// The code module of the SocialCalc package that lets you embed a spreadsheet -// control with toolbar, etc., into a web page. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript SpreadsheetControl. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the SpreadsheetControl is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/ - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); - } - -// ************************************* -// -// SpreadsheetControl class: -// -// ************************************* - -// Global constants: - - SocialCalc.CurrentSpreadsheetControlObject = null; // right now there can only be one active at a time - - -// Constructor: - -SocialCalc.SpreadsheetControl = function() { - - var scc = SocialCalc.Constants; - - // Properties: - - this.parentNode = null; - this.spreadsheetDiv = null; - this.requestedHeight = 0; - this.requestedWidth = 0; - this.requestedSpaceBelow = 0; - this.height = 0; - this.width = 0; - this.viewheight = 0; // calculated amount for views below toolbar, etc. - - // Tab definitions: An array where each tab is an object of the form: - // - // name: "name", - // text: "text-on-tab", - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext - // Other replacements from spreadsheet.tabreplacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // view: "viewname", // view to show when selected; "sheet" or missing/null is spreadsheet - // oncreate: function(spreadsheet, tab-name), // called when first created to initialize - // onclick: function(spreadsheet, tab-name), missing/null is sheet default - // onclickFocus: text, // spreadsheet.idPrefix+text is given the focus if present instead of normal KeyboardFocus - // or if text isn't a string, that value (e.g., true) is used for SocialCalc.CmdGotFocus - // onunclick: function(spreadsheet, tab-name), missing/null is sheet default - - this.tabs = []; - this.tabnums = {}; // when adding tabs, add tab-name: array-index to this object - this.tabreplacements = {}; // see use above - this.currentTab = -1; // currently selected tab index in this.tabs or -1 (maintained by SocialCalc.SetTab) - - // View definitions: An object where each view is an object of the form: - // - // name: "name", // localized when first set using SocialCalc.LocalizeString - // element: node-in-the-dom, // filled in when initialized - // replacements: {}, // see below - // html: "html-to-create div", - // replacements: - // "%s.": "SocialCalc", "%id.": spreadsheet.idPrefix, "%tbt.": spreadsheet.toolbartext, "%img.": spreadsheet.imagePrefix, - // SocialCalc.LocalizeSubstring replacements ("%loc!string!" and "%ssc!constant-name!") - // Other replacements from viewobject.replacements: - // replacementname: {regex: regular-expression-to-match-with-g, replacement: string} - // divStyle: attributes for sheet div (SocialCalc.setStyles format) - // oncreate: function(spreadsheet, viewobject), // called when first created to initialize - // needsresize: true/false/null, // if true, do resize calc after displaying - // onresize: function(spreadsheet, viewobject), // called if needs resize - // values: {} // optional values to share with onclick handlers, etc. - // - // There is always a "sheet" view. - - this.views = {}; // {viewname: view-object, ...} - - // Dynamic properties: - - this.sheet = null; - this.context = null; - this.editor = null; - - this.spreadsheetDiv = null; - this.editorDiv = null; - - this.sortrange = ""; // remembered range for sort tab - - this.moverange = ""; // remembered range from movefrom used by movepaste/moveinsert - - // Constants: - - this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-" - this.multipartBoundary = "SocialCalcSpreadsheetControlSave"; // boundary used by SpreadsheetControlCreateSpreadsheetSave - this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src - - this.toolbarbackground = scc.SCToolbarbackground; - this.tabbackground = scc.SCTabbackground; // "background-color:#CCC;"; - this.tabselectedCSS = scc.SCTabselectedCSS; - this.tabplainCSS = scc.SCTabplainCSS; - this.toolbartext = scc.SCToolbartext; - - this.formulabarheight = scc.SCFormulabarheight; // in pixels, will contain a text input box - - - if (scc.doWorkBook) { - this.sheetbarheight = scc.SCSheetBarHeight; - this.sheetbarCSS = scc.SCSheetBarCSS; - } else { - this.sheetbarheight = 0; - } - - - this.statuslineheight = scc.SCStatuslineheight; // in pixels - this.statuslineCSS = scc.SCStatuslineCSS; - - // Callbacks: - - this.ExportCallback = null; // a function called for Clipboard Export button: this.ExportCallback(spreadsheet_control_object) - - // Initialization Code: - - this.sheet = new SocialCalc.Sheet(); - this.context = new SocialCalc.RenderContext(this.sheet); - this.context.showGrid=true; - this.context.showRCHeaders=true; - this.editor = new SocialCalc.TableEditor(this.context); - this.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetControlStatuslineCallback, - params: {statuslineid: this.idPrefix+"statusline", - recalcid1: this.idPrefix+"divider_recalc", - recalcid2: this.idPrefix+"button_recalc"}}; - - SocialCalc.CurrentSpreadsheetControlObject = this; // remember this for rendezvousing on events - - this.editor.MoveECellCallback.movefrom = function(editor) { - var cr; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - spreadsheet.context.cursorsuffix = ""; - if (editor.range2.hasrange && !editor.cellhandles.noCursorSuffix) { - if (editor.ecell.row==editor.range2.top && (editor.ecell.coleditor.range2.right+1)) { - spreadsheet.context.cursorsuffix = "insertleft"; - } - if (editor.ecell.col==editor.range2.left && (editor.ecell.roweditor.range2.bottom+1)) { - spreadsheet.context.cursorsuffix = "insertup"; - } - } - }; - - // formula bar buttons - - this.formulabuttons = { - formulafunctions: {image: "formuladialog.gif", tooltip: "Functions", // tooltips are localized when set below - command: SocialCalc.SpreadsheetControl.DoFunctionList}, - multilineinput: {image: "multilinedialog.gif", tooltip: "Multi-line Input Box", - command: SocialCalc.SpreadsheetControl.DoMultiline}, - link: {image: "linkdialog.gif", tooltip: "Link Input Box", - command: SocialCalc.SpreadsheetControl.DoLink}, - sum: {image: "sumdialog.gif", tooltip: "Auto Sum", - command: SocialCalc.SpreadsheetControl.DoSum} -//, -// image: {image: "sumdialog.gif", tooltip: "Insert", -// command: SocialCalc.Images.Insert } - } - - // Default tabs: - - // Edit - - this.tabnums.edit = this.tabs.length; - this.tabs.push({name: "edit", text: "Edit", html: - '
    '+ -' '+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -''+ -' '+ -'    '+ -''+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -''+ -' '+ -' '+ -'    '+ -' '+ -' '+ -' '+ -'    '+ -' '+ -' '+ -'    '+ -' '+ -' '+ -'  '+ -' '+ -'    '+ -' '+ - '
    ', - oncreate: null, //function(spreadsheet, viewobject) {SocialCalc.DoCmd(null, "fill-rowcolstuff");}, - onclick: null}); - - // Settings (Format) - - this.tabnums.settings = this.tabs.length; - this.tabs.push({name: "settings", text: "Format", html: - '', - view: "settings", - onclick: function(s, t) { - SocialCalc.SettingsControls.idPrefix = s.idPrefix; // used to get color chooser div - SocialCalc.SettingControlReset(); - var sheetattribs = s.sheet.EncodeSheetAttributes(); - var cellattribs = s.sheet.EncodeCellAttributes(s.editor.ecell.coord); - if (SocialCalc.Callbacks.GetCellEditableAttribs) - SocialCalc.Callbacks.GetCellEditableAttribs(cellattribs,s.editor.ecell.coord) - SocialCalc.SettingsControlLoadPanel(s.views.settings.values.sheetspanel, sheetattribs); - SocialCalc.SettingsControlLoadPanel(s.views.settings.values.cellspanel, cellattribs); - document.getElementById(s.idPrefix+"settingsecell").innerHTML = s.editor.ecell.coord; - SocialCalc.SpreadsheetControlSettingsSwitch("cell"); - s.views.settings.element.style.height = s.viewheight+"px"; - s.views.settings.element.firstChild.style.height = s.viewheight+"px"; - - var range; // set save message - if (s.editor.range.hasrange) { - range = SocialCalc.crToCoord(s.editor.range.left, s.editor.range.top) + ":" + - SocialCalc.crToCoord(s.editor.range.right, s.editor.range.bottom); - } - else { - range = s.editor.ecell.coord; - } - document.getElementById(s.idPrefix+"settings-savecell").value = SocialCalc.LocalizeString("Save to")+": "+range; - }, - onclickFocus: true - }); - - this.views["settings"] = {name: "settings", values: {}, - oncreate: function(s, viewobj) { - var scc = SocialCalc.Constants; - - viewobj.values.sheetspanel = { -// name: "sheet", - colorchooser: {id: s.idPrefix+"scolorchooser"}, - formatnumber: {setting: "numberformat", type: "PopupList", id: s.idPrefix+"formatnumber", - initialdata: scc.SCFormatNumberFormats}, - formattext: {setting: "textformat", type: "PopupList", id: s.idPrefix+"formattext", - initialdata: scc.SCFormatTextFormats}, - fontfamily: {setting: "fontfamily", type: "PopupList", id: s.idPrefix+"fontfamily", - initialdata: scc.SCFormatFontfamilies}, - fontlook: {setting: "fontlook", type: "PopupList", id: s.idPrefix+"fontlook", - initialdata: scc.SCFormatFontlook}, - fontsize: {setting: "fontsize", type: "PopupList", id: s.idPrefix+"fontsize", - initialdata: scc.SCFormatFontsizes}, - textalignhoriz: {setting: "textalignhoriz", type: "PopupList", id: s.idPrefix+"textalignhoriz", - initialdata: scc.SCFormatTextAlignhoriz}, - numberalignhoriz: {setting: "numberalignhoriz", type: "PopupList", id: s.idPrefix+"numberalignhoriz", - initialdata: scc.SCFormatNumberAlignhoriz}, - alignvert: {setting: "alignvert", type: "PopupList", id: s.idPrefix+"alignvert", - initialdata: scc.SCFormatAlignVertical}, - textcolor: {setting: "textcolor", type: "ColorChooser", id: s.idPrefix+"textcolor"}, - bgcolor: {setting: "bgcolor", type: "ColorChooser", id: s.idPrefix+"bgcolor"}, - padtop: {setting: "padtop", type: "PopupList", id: s.idPrefix+"padtop", - initialdata: scc.SCFormatPadsizes}, - padright: {setting: "padright", type: "PopupList", id: s.idPrefix+"padright", - initialdata: scc.SCFormatPadsizes}, - padbottom: {setting: "padbottom", type: "PopupList", id: s.idPrefix+"padbottom", - initialdata: scc.SCFormatPadsizes}, - padleft: {setting: "padleft", type: "PopupList", id: s.idPrefix+"padleft", - initialdata: scc.SCFormatPadsizes}, - colwidth: {setting: "colwidth", type: "PopupList", id: s.idPrefix+"colwidth", - initialdata: scc.SCFormatColwidth}, - recalc: {setting: "recalc", type: "PopupList", id: s.idPrefix+"recalc", - initialdata: scc.SCFormatRecalc} - }; - viewobj.values.cellspanel = { - name: "cell", - colorchooser: {id: s.idPrefix+"scolorchooser"}, - cformatnumber: {setting: "numberformat", type: "PopupList", id: s.idPrefix+"cformatnumber", - initialdata: scc.SCFormatNumberFormats}, - cformattext: {setting: "textformat", type: "PopupList", id: s.idPrefix+"cformattext", - initialdata: scc.SCFormatTextFormats}, - cfontfamily: {setting: "fontfamily", type: "PopupList", id: s.idPrefix+"cfontfamily", - initialdata: scc.SCFormatFontfamilies}, - cfontlook: {setting: "fontlook", type: "PopupList", id: s.idPrefix+"cfontlook", - initialdata: scc.SCFormatFontlook}, - cfontsize: {setting: "fontsize", type: "PopupList", id: s.idPrefix+"cfontsize", - initialdata: scc.SCFormatFontsizes}, - calignhoriz: {setting: "alignhoriz", type: "PopupList", id: s.idPrefix+"calignhoriz", - initialdata: scc.SCFormatTextAlignhoriz}, - calignvert: {setting: "alignvert", type: "PopupList", id: s.idPrefix+"calignvert", - initialdata: scc.SCFormatAlignVertical}, - ctextcolor: {setting: "textcolor", type: "ColorChooser", id: s.idPrefix+"ctextcolor"}, - cbgcolor: {setting: "bgcolor", type: "ColorChooser", id: s.idPrefix+"cbgcolor"}, - cbt: {setting: "bt", type: "BorderSide", id: s.idPrefix+"cbt"}, - cbr: {setting: "br", type: "BorderSide", id: s.idPrefix+"cbr"}, - cbb: {setting: "bb", type: "BorderSide", id: s.idPrefix+"cbb"}, - cbl: {setting: "bl", type: "BorderSide", id: s.idPrefix+"cbl"}, - cpadtop: {setting: "padtop", type: "PopupList", id: s.idPrefix+"cpadtop", - initialdata: scc.SCFormatPadsizes}, - cpadright: {setting: "padright", type: "PopupList", id: s.idPrefix+"cpadright", - initialdata: scc.SCFormatPadsizes}, - cpadbottom: {setting: "padbottom", type: "PopupList", id: s.idPrefix+"cpadbottom", - initialdata: scc.SCFormatPadsizes}, - cpadleft: {setting: "padleft", type: "PopupList", id: s.idPrefix+"cpadleft", - initialdata: scc.SCFormatPadsizes}, - ceditable: {setting: "ceditable", type: "PopupList", id: s.idPrefix+"ceditable", - initialdata: scc.SCFormatEditable}, - constraints: {setting: "cconstraints", type: "PopupList", id: s.idPrefix+"cconstraints", - initialdata: scc.SCFormatConstraints} - }; - - SocialCalc.SettingsControlInitializePanel(viewobj.values.sheetspanel); - SocialCalc.SettingsControlInitializePanel(viewobj.values.cellspanel); - }, - replacements: { - itemtitle: {regex: /\%itemtitle\./g, replacement: 'style="padding:12px 10px 0px 10px;font-weight:bold;text-align:right;vertical-align:top;font-size:small;"'}, - sectiontitle: {regex: /\%sectiontitle\./g, replacement: 'style="padding:16px 10px 0px 0px;font-weight:bold;vertical-align:top;font-size:small;color:#C00;"'}, - parttitle: {regex: /\%parttitle\./g, replacement: 'style="font-weight:bold;font-size:x-small;padding:0px 0px 3px 0px;"'}, - itembody: {regex: /\%itembody\./g, replacement: 'style="padding:12px 0px 0px 0px;vertical-align:top;font-size:small;"'}, - bodypart: {regex: /\%bodypart\./g, replacement: 'style="padding:0px 10px 0px 0px;font-size:small;vertical-align:top;"'} - }, - divStyle: "border:1px solid black;overflow:auto;", - html: - ''+ -''+ -'
    '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -''+ -' '+ -' '+ -''+ -'

    %loc!Format!:
    '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Number!
    '+ -' '+ -'
    '+ -'
    %loc!Text!
    '+ -' '+ -'
    '+ -'

    %loc!Alignment!:
    '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Horizontal!
    '+ -' '+ -'
    '+ -'
    %loc!Vertical!
    '+ -' '+ -'
    '+ -'

    %loc!Font!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Family!
    '+ -' '+ -'
    '+ -'
    %loc!Bold & Italics!
    '+ -' '+ -'
    '+ -'
    %loc!Size!
    '+ -' '+ -'
    '+ -'
    %loc!Color!
    '+ -'
    '+ -'
    '+ -'
    %loc!Background!
    '+ -'
    '+ -'
    '+ -'

    %loc!Borders!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    %loc!Top Border!
    %loc!Right Border!
    %loc!Bottom Border!
    %loc!Left Border!
    '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        '+ -' '+ -' '+ -'
    '+ -'
        
    '+ -'

    %loc!Padding!:
    '+ -' '+ -' '+ -' '+ -' '+ -' '+ -'
    '+ -'
    %loc!Top!
    '+ -' '+ -'
    '+ -'
    %loc!Right!
    '+ -' '+ -'
    '+ -'
    %loc!Bottom!
    '+ -' '+ -'
    '+ -'
    %loc!Left!
    '+ -' '+ -'
    '+ -'

    %loc!Editable!:
    '+ -' '+ -' '+ -'
    '+ -'
     
    '+ -' '+ -'
    '+ -'

    %loc!Constraints!:
    '+ -' '+ -' '+ -'
    '+ -'
     
    '+ -' '+ -'
    '+ -'
    '+ -'
    '+ -'
    '+ -' '+ -' '+ -'
    %loc!This is a
    sample!
    -1234.5
    '+ -'
    '+ -'
    '+ -'
    ' - }; - - // Sort - - this.tabnums.sort = this.tabs.length; - this.tabs.push({name: "sort", text: "Sort", html: - ' ', - onclick: SocialCalc.SpreadsheetControlSortOnclick}); - this.editor.SettingsCallbacks.sort = {save: SocialCalc.SpreadsheetControlSortSave, load: SocialCalc.SpreadsheetControlSortLoad}; - - // Audit - - this.tabnums.audit = this.tabs.length; - this.tabs.push({name: "audit", text: "Audit", html: - '', - view: "audit", - onclick: - function(s, t) { - var SCLoc = SocialCalc.LocalizeString; - var i, j; - var str = '
    '+SCLoc("Audit Trail This Session")+':

    '; - var stack = s.sheet.changes.stack; - var tos = s.sheet.changes.tos; - for (i=0; i'; - for (j=0; j"; - } - } - s.views.audit.element.innerHTML = str+"
    "; - SocialCalc.CmdGotFocus(true); - }, - onclickFocus: true - }); - - this.views["audit"] = {name: "audit", - divStyle: "border:1px solid black;overflow:auto;", - html: 'Audit Trail' - }; - - // Comment - - this.tabnums.comment = this.tabs.length; - this.tabs.push({name: "comment", text: "Comment", html: - '', - view: "sheet", - onclick: SocialCalc.SpreadsheetControlCommentOnclick, - onunclick: SocialCalc.SpreadsheetControlCommentOnunclick - }); - - // Names - - this.tabnums.names = this.tabs.length; - this.tabs.push({name: "names", text: "Names", html: - '', - view: "sheet", - onclick: SocialCalc.SpreadsheetControlNamesOnclick, - onunclick: SocialCalc.SpreadsheetControlNamesOnunclick - }); - - // Clipboard - - this.tabnums.clipboard = this.tabs.length; - this.tabs.push({name: "clipboard", text: "Clipboard", html: - '', - view: "clipboard", - onclick: SocialCalc.SpreadsheetControlClipboardOnclick, - onclickFocus: "clipboardtext" - }); - - this.views["clipboard"] = {name: "clipboard", divStyle: "overflow:auto;", html: - '
    '+ - ' %loc!Display Clipboard in!:'+ - ' %loc!Tab-delimited format!  '+ - ' %loc!CSV format!  '+ - ' %loc!SocialCalc-save format!'+ - '
    '+ - '   '+ - '   '+ - '
    '+ - ' ' - }; - - return; - - } - -// Methods: - -SocialCalc.SpreadsheetControl.prototype.InitializeSpreadsheetControl = - function(node, height, width, spacebelow) {return SocialCalc.InitializeSpreadsheetControl(this, node, height, width, spacebelow);}; -SocialCalc.SpreadsheetControl.prototype.DoOnResize = function() {return SocialCalc.DoOnResize(this);}; -SocialCalc.SpreadsheetControl.prototype.SizeSSDiv = function() {return SocialCalc.SizeSSDiv(this);}; -SocialCalc.SpreadsheetControl.prototype.ExecuteCommand = - function(combostr, sstr) {return SocialCalc.SpreadsheetControlExecuteCommand(this, combostr, sstr);}; -SocialCalc.SpreadsheetControl.prototype.CreateSheetHTML = - function() {return SocialCalc.SpreadsheetControlCreateSheetHTML(this);}; -SocialCalc.SpreadsheetControl.prototype.CreateSpreadsheetSave = - function(otherparts) {return SocialCalc.SpreadsheetControlCreateSpreadsheetSave(this, otherparts);}; -SocialCalc.SpreadsheetControl.prototype.DecodeSpreadsheetSave = - function(str) {return SocialCalc.SpreadsheetControlDecodeSpreadsheetSave(this, str);}; -SocialCalc.SpreadsheetControl.prototype.CreateCellHTML = - function(coord) {return SocialCalc.SpreadsheetControlCreateCellHTML(this, coord);}; -SocialCalc.SpreadsheetControl.prototype.CreateCellHTMLSave = - function(range) {return SocialCalc.SpreadsheetControlCreateCellHTMLSave(this, range);}; - - -// Sheet Methods to make things a little easier: - -SocialCalc.SpreadsheetControl.prototype.ParseSheetSave = function(str) {return this.sheet.ParseSheetSave(str);}; -SocialCalc.SpreadsheetControl.prototype.CreateSheetSave = function() {return this.sheet.CreateSheetSave();}; - - -// Functions: - -// -// InitializeSpreadsheetControl(spreadsheet, node, height, width, spacebelow) -// -// Creates the control elements and makes them the child of node (string or element). -// If present, height and width specify size. -// If either is 0 or null (missing), the maximum that fits on the screen -// (taking spacebelow into account) is used. -// -// Displays the tabs and creates the views (other than "sheet"). -// The first tab is set as selected, but onclick is not invoked. -// -// You should do a redisplay or recalc (which redisplays) after running this. -// - -SocialCalc.InitializeSpreadsheetControl = function(spreadsheet, node, height, width, spacebelow) { - - var scc = SocialCalc.Constants; - var SCLoc = SocialCalc.LocalizeString; - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var html, child, i, vname, v, style, button, bele; - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - spreadsheet.requestedHeight = height; - spreadsheet.requestedWidth = width; - spreadsheet.requestedSpaceBelow = spacebelow; - - if (typeof node == "string") node = document.getElementById(node); - - if (node == null) { - alert("SocialCalc.SpreadsheetControl not given parent node."); - } - - spreadsheet.parentNode = node; - - // create node to hold spreadsheet control - - spreadsheet.spreadsheetDiv = document.createElement("div"); - - spreadsheet.SizeSSDiv(); // calculate and fill in the size values - - for (child=node.firstChild; child!=null; child=node.firstChild) { - node.removeChild(child); - } - - // create the tabbed UI at the top - - html = '
    '; - - for (i=0; i'+ - ''; - - for (i=0; i' + SCLoc(tabs[i].text) + ''; - } - - html += '
    '; - - spreadsheet.currentTab = 0; // this is where we started - - for (style in spreadsheet.tabreplacements) { - html = html.replace(spreadsheet.tabreplacements[style].regex, spreadsheet.tabreplacements[style].replacement); - } - html = html.replace(/\%s\./g, "SocialCalc."); - html = html.replace(/\%id\./g, spreadsheet.idPrefix); - html = html.replace(/\%tbt\./g, spreadsheet.toolbartext); - html = html.replace(/\%img\./g, spreadsheet.imagePrefix); - - html = SCLocSS(html); // localize with %loc!string! and %scc!constant! - - spreadsheet.spreadsheetDiv.innerHTML = html; - - node.appendChild(spreadsheet.spreadsheetDiv); - - // Initialize SocialCalc buttons - -spreadsheet.Buttons = { - button_undo: {tooltip: "Undo", command: "undo"}, - button_redo: {tooltip: "Redo", command: "redo"}, - button_copy: {tooltip: "Copy", command: "copy"}, - button_cut: {tooltip: "Cut", command: "cut"}, - button_paste: {tooltip: "Paste", command: "paste"}, - button_pasteformats: {tooltip: "Paste Formats", command: "pasteformats"}, - button_delete: {tooltip: "Delete Contents", command: "delete"}, - button_filldown: {tooltip: "Fill Down", command: "filldown"}, - button_fillright: {tooltip: "Fill Right", command: "fillright"}, - button_movefrom: {tooltip: "Set/Clear Move From", command: "movefrom"}, - button_movepaste: {tooltip: "Move Paste", command: "movepaste"}, - button_moveinsert: {tooltip: "Move Insert", command: "moveinsert"}, - button_alignleft: {tooltip: "Align Left", command: "align-left"}, - button_aligncenter: {tooltip: "Align Center", command: "align-center"}, - button_alignright: {tooltip: "Align Right", command: "align-right"}, - button_borderon: {tooltip: "Borders On", command: "borderon"}, - button_borderoff: {tooltip: "Borders Off", command: "borderoff"}, - button_swapcolors: {tooltip: "Swap Colors", command: "swapcolors"}, - button_merge: {tooltip: "Merge Cells", command: "merge"}, - button_unmerge: {tooltip: "Unmerge Cells", command: "unmerge"}, - button_insertrow: {tooltip: "Insert Row", command: "insertrow"}, - button_insertcol: {tooltip: "Insert Column", command: "insertcol"}, - button_deleterow: {tooltip: "Delete Row", command: "deleterow"}, - button_deletecol: {tooltip: "Delete Column", command: "deletecol"}, - button_recalc: {tooltip: "Recalc", command: "recalc"} - } - - for (button in spreadsheet.Buttons) { - bele = document.getElementById(spreadsheet.idPrefix+button); - if (!bele) {alert("Button "+(spreadsheet.idPrefix+button)+" missing"); continue;} - bele.style.border = "1px solid "+scc.ISCButtonBorderNormal; - SocialCalc.TooltipRegister(bele, SCLoc(spreadsheet.Buttons[button].tooltip), {}); - SocialCalc.ButtonRegister(bele, - {normalstyle: "border:1px solid "+scc.ISCButtonBorderNormal+";backgroundColor:"+scc.ISCButtonBorderNormal+";", - hoverstyle: "border:1px solid "+scc.ISCButtonBorderHover+";backgroundColor:"+scc.ISCButtonBorderNormal+";", - downstyle: "border:1px solid "+scc.ISCButtonBorderDown+";backgroundColor:"+scc.ISCButtonDownBackground+";"}, - {MouseDown: SocialCalc.DoButtonCmd, command: spreadsheet.Buttons[button].command}); - } - - // create formula bar - - spreadsheet.formulabarDiv = document.createElement("div"); - spreadsheet.formulabarDiv.style.height = spreadsheet.formulabarheight + "px"; - spreadsheet.formulabarDiv.innerHTML = ' '; //' '; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.formulabarDiv); - var inputbox = new SocialCalc.InputBox(spreadsheet.formulabarDiv.firstChild, spreadsheet.editor); - - for (button in spreadsheet.formulabuttons) { - bele = document.createElement("img"); - bele.id = spreadsheet.idPrefix+button; - bele.src = spreadsheet.imagePrefix+spreadsheet.formulabuttons[button].image; - bele.style.verticalAlign = "middle"; - bele.style.border = "1px solid #FFF"; - bele.style.marginLeft = "4px"; - SocialCalc.TooltipRegister(bele, SCLoc(spreadsheet.formulabuttons[button].tooltip), {}); - SocialCalc.ButtonRegister(bele, - {normalstyle: "border:1px solid #FFF;backgroundColor:#FFF;", - hoverstyle: "border:1px solid #CCC;backgroundColor:#FFF;", - downstyle: "border:1px solid #000;backgroundColor:#FFF;"}, - {MouseDown: spreadsheet.formulabuttons[button].command}); - spreadsheet.formulabarDiv.appendChild(bele); - } - - // initialize tabs that need it - - for (i=0; i 1 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 1; // restore what was there if reasonable - sele = document.getElementById(spreadsheet.idPrefix+"minorsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col=range.cr1.col; col<=range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = oldindex > 0 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 0; // default to [none] - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - oldindex = sele.selectedIndex; - sele.options.length = 0; - sele.options[sele.options.length] = new Option(SCLoc("[None]"), ""); - for (var col=range.cr1.col; col<=range.cr2.col; col++) { - colname = SocialCalc.rcColname(col); - sele.options[sele.options.length] = new Option(colname, colname); - } - sele.selectedIndex = oldindex > 0 && oldindex <= (range.cr2.col-range.cr1.col+1) ? oldindex : 0; // default to [none] - - } - -// -// SocialCalc.CmdGotFocus(obj) -// -// Sets SocialCalc.Keyboard.passThru: obj should be element with focus or "true" -// - -SocialCalc.CmdGotFocus = function(obj) { - - SocialCalc.Keyboard.passThru = obj; - - } - - -// -// SocialCalc.DoButtonCmd(e, buttoninfo, bobj) -// - -SocialCalc.DoButtonCmd = function(e, buttoninfo, bobj) { - - SocialCalc.DoCmd(bobj.element, bobj.functionobj.command); - - } - -// -// SocialCalc.DoCmd(obj, which) -// -// xxx -// - -SocialCalc.DoCmd = function(obj, which) { - - var combostr, sstr, cl, i, clele, slist, slistele, str, sele, rele, lele, ele, sortrange, nrange, rparts; - var sheet, cell, color, bgcolor, defaultcolor, defaultbgcolor; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - switch (which) { - case "undo": - spreadsheet.ExecuteCommand("undo", ""); - break; - - case "redo": - spreadsheet.ExecuteCommand("redo", ""); - break; - - case "fill-rowcolstuff": - case "fill-text": - cl = which.substring(5); - clele = document.getElementById(spreadsheet.idPrefix+cl+"list"); - clele.length = 0; - for (i=0; i0) { - rele = document.getElementById(spreadsheet.idPrefix+"minorsortup"); - str += " "+sele.options[sele.selectedIndex].value + (rele.checked ? " up" : " down"); - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (sele.selectedIndex>0) { - rele = document.getElementById(spreadsheet.idPrefix+"lastsortup"); - str += " "+sele.options[sele.selectedIndex].value + (rele.checked ? " up" : " down"); - } - spreadsheet.ExecuteCommand(str, ""); - break; - - case "merge": - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - if (editor.range.hasrange) { // set ecell to upper left - editor.MoveECell(SocialCalc.crToCoord(editor.range.left, editor.range.top)); - editor.RangeRemove(); - } - break; - - case "movefrom": - if (editor.range2.hasrange) { // toggle if already there - spreadsheet.context.cursorsuffix = ""; - editor.Range2Remove(); - spreadsheet.ExecuteCommand("redisplay", ""); - } - else if (editor.range.hasrange) { // set range2 to range or one cell - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.MoveECell(SocialCalc.crToCoord(editor.range.left, editor.range.top)); - } - else { - editor.range2.top = editor.ecell.row; - editor.range2.right = editor.ecell.col; - editor.range2.bottom = editor.ecell.row; - editor.range2.left = editor.ecell.col; - editor.range2.hasrange = true; - } - str = editor.range2.hasrange ? "" : "off"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movefrom"); - ele.src=spreadsheet.imagePrefix+"movefrom"+str+".gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movepaste"); - ele.src=spreadsheet.imagePrefix+"movepaste"+str+".gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_moveinsert"); - ele.src=spreadsheet.imagePrefix+"moveinsert"+str+".gif"; - if (editor.range2.hasrange) editor.RangeRemove(); - break; - - case "movepaste": - case "moveinsert": - if (editor.range2.hasrange) { - spreadsheet.context.cursorsuffix = ""; - combostr = which+" "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord; - spreadsheet.ExecuteCommand(combostr, ""); - editor.Range2Remove(); - ele = document.getElementById(spreadsheet.idPrefix+"button_movefrom"); - ele.src=spreadsheet.imagePrefix+"movefromoff.gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_movepaste"); - ele.src=spreadsheet.imagePrefix+"movepasteoff.gif"; - ele = document.getElementById(spreadsheet.idPrefix+"button_moveinsert"); - ele.src=spreadsheet.imagePrefix+"moveinsertoff.gif"; - } - break; - - case "swapcolors": - sheet = spreadsheet.sheet; - cell = sheet.GetAssuredCell(editor.ecell.coord); - defaultcolor = sheet.attribs.defaultcolor ? sheet.colors[sheet.attribs.defaultcolor] : "rgb(0,0,0)"; - defaultbgcolor = sheet.attribs.defaultbgcolor ? sheet.colors[sheet.attribs.defaultbgcolor] : "rgb(255,255,255)"; - color = cell.color ? sheet.colors[cell.color] : defaultcolor; // get color - if (color == defaultbgcolor) color = ""; // going to swap, so if same as background default, use default - bgcolor = cell.bgcolor ? sheet.colors[cell.bgcolor] : defaultbgcolor; - if (bgcolor == defaultcolor) bgcolor = ""; // going to swap, so if same as foreground default, use default - spreadsheet.ExecuteCommand("set %C color "+bgcolor+"%Nset %C bgcolor "+color, ""); - break; - - default: - combostr = SocialCalc.SpreadsheetCmdLookup[which] || ""; - sstr = SocialCalc.SpreadsheetCmdSLookup[which] || ""; - spreadsheet.ExecuteCommand(combostr, sstr); - break; - } - - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - - } - -SocialCalc.SpreadsheetCmdLookup = { - 'copy': 'copy %C all', - 'cut': 'cut %C all', - 'paste': 'paste %C all', - 'pasteformats': 'paste %C formats', - 'delete': 'erase %C formulas', - 'filldown': 'filldown %C all', - 'fillright': 'fillright %C all', - 'erase': 'erase %C all', - 'borderon': 'set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S', - 'borderoff': 'set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S', - 'merge': 'merge %C', - 'unmerge': 'unmerge %C', - 'align-left': 'set %C cellformat left', - 'align-center': 'set %C cellformat center', - 'align-right': 'set %C cellformat right', - 'align-default': 'set %C cellformat', - 'insertrow': 'insertrow %C', - 'insertcol': 'insertcol %C', - 'deleterow': 'deleterow %C', - 'deletecol': 'deletecol %C', - 'undo': 'undo', - 'redo': 'redo', - 'recalc': 'recalc' - } - -SocialCalc.SpreadsheetCmdSLookup = { - 'borderon': '1px solid rgb(0,0,0)', - 'borderoff': '' - } - -/******* NO LONGER USED - -SocialCalc.SpreadsheetCmdTable = { - cmd: [ - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"}, - {t:"Copy", s:"all", c:"copy %C %S"}, - {t:"Cut", s:"all", c:"cut %C %S"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Merge Cells", s:"none", c:"merge %C"}, - {t:"Unmerge", s:"none", c:"unmerge %C"}, - {t:"Sort", s:"sortcol", c:"sort %R %S"}, - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Cell Borders", s:"borderOnOff", c:"set %C bt %S%Nset %C br %S%Nset %C bb %S%Nset %C bl %S"}, - {t:"Column Width", s:"colWidths", c:"set %W width %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"}, - {t:"Default Column Width", s:"colWidths", c:"set sheet defaultcolwidth %S"} - ], - rowcolstuff: [ - {t:"Insert", s:"rowcol", c:"insert%S %C"}, - {t:"Delete", s:"rowcol", c:"delete%S %C"}, - {t:"Paste", s:"ffal", c:"paste %C %S"}, - {t:"Erase", s:"ffal", c:"erase %C %S"}, - {t:"Fill Right", s:"ffal", c:"fillright %C %S"}, - {t:"Fill Down", s:"ffal", c:"filldown %C %S"} - ], - text: [ - {t:"Cell Color", s:"colors", c:"set %C color %S"}, - {t:"Cell Background", s:"colors", c:"set %C bgcolor %S"}, - {t:"Cell Number Format", s:"ntvf", c:"set %C nontextvalueformat %S"}, - {t:"Cell Text Format", s:"tvf", c:"set %C textvalueformat %S"}, - {t:"Cell Font", s:"fonts", c:"set %C font %S"}, - {t:"Cell Align", s:"cellformat", c:"set %C cellformat %S"}, - {t:"Default Color", s:"colors", c:"set sheet defaultcolor %S"}, - {t:"Default Background", s:"colors", c:"set sheet defaultbgcolor %S"}, - {t:"Default Number Format", s:"ntvf", c:"set sheet defaultnontextvalueformat %S"}, - {t:"Default Text Format", s:"tvf", c:"set sheet defaulttextvalueformat %S"}, - {t:"Default Font", s:"fonts", c:"set sheet defaultfont %S"}, - {t:"Default Text Align", s:"cellformat", c:"set sheet defaulttextformat %S"}, - {t:"Default Number Align", s:"cellformat", c:"set sheet defaultnontextformat %S"} - ], - slists: { - "colors": [ - {t:"Default", s:""}, - {t:"Black", s:"rgb(0,0,0)"}, - {t:"Dark Gray", s:"rgb(102,102,102)"}, // #666 - {t:"Gray", s:"rgb(204,204,204)"}, // #CCC - {t:"White", s:"rgb(255,255,255)"}, - {t:"Red", s:"rgb(255,0,0)"}, - {t:"Dark Red", s:"rgb(153,0,0)"}, - {t:"Orange", s:"rgb(255,153,0)"}, - {t:"Yellow", s:"rgb(255,255,0)"}, - {t:"Light Yellow", s:"rgb(255,255,204)"}, - {t:"Green", s:"rgb(0,255,0)"}, - {t:"Dark Green", s:"rgb(0,153,0)"}, - {t:"Blue", s:"rgb(0,0,255)"}, - {t:"Dark Blue", s:"rgb(0,0,153)"}, - {t:"Light Blue", s:"rgb(204,204,255)"} - ], - "fonts": [ // style weight size family - {t:"Default", s:""}, - {t:"Bold", s:"normal bold * *"}, - {t:"Italic", s:"italic normal * *"}, - {t:"Small", s:"* small *"}, - {t:"Medium", s:"* medium *"}, - {t:"Large", s:"* large *"}, - {t:"Bold Small", s:"normal bold small *"}, - {t:"Bold Medium", s:"normal bold medium *"}, - {t:"Bold Large", s:"normal bold large *"} - ], - "cellformat": [ - {t:"Default", s:""}, - {t:"Left", s:"left"}, - {t:"Right", s:"right"}, - {t:"Center", s:"center"} - ], - "borderOnOff": [ - {t:"On", s:"1px solid rgb(0,0,0)"}, - {t:"Off", s:""} - ], - "colWidths": [ - {t:"Default", s:""}, - {t:"20", s:"20"}, - {t:"40", s:"40"}, - {t:"60", s:"60"}, - {t:"80", s:"80"}, - {t:"100", s:"100"}, - {t:"120", s:"120"}, - {t:"140", s:"140"}, - {t:"160", s:"160"}, - {t:"180", s:"180"}, - {t:"200", s:"200"}, - {t:"220", s:"220"}, - {t:"240", s:"240"}, - {t:"260", s:"260"}, - {t:"280", s:"280"}, - {t:"300", s:"300"} - ], - "ntvf": [ - {t:"Default", s:""}, - {t:"1234", s:"0"}, - {t:"1,234", s:"#,##0"}, - {t:"1,234.5", s:"#,##0.0"}, - {t:"1,234.56", s:"#,##0.00"}, - {t:"1,234.567", s:"#,##0.000"}, - {t:"1,234%", s:"#,##0%"}, - {t:"1,234.5%", s:"#,##0.0%"}, - {t:"(1,234)", s:"#,##0_);(#,##0)"}, - {t:"(1,234.5)", s:"#,##0.0_);(#,##0.0)"}, - {t:"(1,234.56)", s:"#,##0.00_);(#,##0.00)"}, - {t:"00", s:"00"}, - {t:"000", s:"000"}, - {t:"0000", s:"0000"}, - {t:"$1,234.56", s:"$#,##0.00"}, - {t:"2006-01-04", s:"yyyy-mm-dd"}, - {t:"01:23:45", s:"hh:mm:ss"}, - {t:"2006-01-04 01:23:45", s:"yyyy-mm-dd hh:mm:ss"}, - {t:"Hidden", s:"hidden"} - ], - "tvf": [ - {t:"Default", s:""}, - {t:"Automatic", s:"general"}, - {t:"Plain Text", s:"text-plain"}, - {t:"HTML", s:"text-html"}, - {t:"Wiki", s:"text-wiki"}, - {t:"Hidden", s:"hidden"} - ], - "ffal": [ // Formulas, Formats, All - {t:"All", s:"all"}, - {t:"Contents", s:"formulas"}, - {t:"Formats", s:"formats"} - ], - "all": [ // All - {t:"All", s:"all"} - ], - "rowcol": [ - {t:"Row", s:"row"}, - {t:"Column", s:"col"} - ], - "sortcol": [ - {t:"A up", s:"A up"}, - {t:"B up", s:"B up"}, - {t:"C up", s:"C up"}, - {t:"A down", s:"A down"}, - {t:"B down", s:"B down"}, - {t:"C down", s:"C down"}, - {t:"A, B, C up", s:"A up B up C up"} - ], - "none": [ // nothing - {t:" ", s:" "} - ] - } - } -*********/ - -// -// SocialCalc.SpreadsheetControlExecuteCommand(obj, combostr, sstr) -// -// xxx -// - -SocialCalc.SpreadsheetControlExecuteCommand = function(obj, combostr, sstr) { - - var i, commands; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var eobj = spreadsheet.editor; - - var str = {}; - str.P = "%"; - str.N = "\n" - if (eobj.range.hasrange) { - str.R = SocialCalc.crToCoord(eobj.range.left, eobj.range.top)+ - ":"+SocialCalc.crToCoord(eobj.range.right, eobj.range.bottom); - str.C = str.R; - str.W = SocialCalc.rcColname(eobj.range.left) + ":" + SocialCalc.rcColname(eobj.range.right); - } - else { - str.C = eobj.ecell.coord; - str.R = eobj.ecell.coord+":"+eobj.ecell.coord; - str.W = SocialCalc.rcColname(SocialCalc.coordToCr(eobj.ecell.coord).col); - } - str.S = sstr; - combostr = combostr.replace(/%C/g, str.C); - combostr = combostr.replace(/%R/g, str.R); - combostr = combostr.replace(/%N/g, str.N); - combostr = combostr.replace(/%S/g, str.S); - combostr = combostr.replace(/%W/g, str.W); - combostr = combostr.replace(/%P/g, str.P); - - eobj.EditorScheduleSheetCommands(combostr, true, false); - - } - -// -// result = SocialCalc.SpreadsheetControlCreateSheetHTML(spreadsheet) -// -// Returns the HTML representation of the whole spreadsheet -// - -SocialCalc.SpreadsheetControlCreateSheetHTML = function(spreadsheet) { - - var context, div, ele; - - var result = ""; - - context = new SocialCalc.RenderContext(spreadsheet.sheet); - div = document.createElement("div"); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - result = div.innerHTML; - delete ele; - delete div; - return result; - - } - -// -// result = SocialCalc.SpreadsheetControlCreateCellHTML(spreadsheet, coord, linkstyle) -// -// Returns the HTML representation of a cell. Blank is "", not " ". -// - -SocialCalc.SpreadsheetControlCreateCellHTML = function(spreadsheet, coord, linkstyle) { - - var result = ""; - var cell = spreadsheet.sheet.cells[coord]; - - if (!cell) return ""; - - if (cell.displaystring == undefined) { - result = SocialCalc.FormatValueForDisplay(spreadsheet.sheet, cell.datavalue, coord, (linkstyle || spreadsheet.context.defaultHTMLlinkstyle)); - } - else { - result = cell.displaystring; - } - - if (result == " ") result = ""; - - return result; - - } - -// -// result = SocialCalc.SpreadsheetControlCreateCellHTMLSave(spreadsheet, range, linkstyle) -// -// Returns the HTML representation of a range of cells, or the whole sheet if range is null. -// The form is: -// version:1.0 -// coord:cell-HTML -// coord:cell-HTML -// ... -// -// Empty cells are skipped. The cell-HTML is encoded with ":"=>"\c", newline=>"\n", and "\"=>"\b". -// - -SocialCalc.SpreadsheetControlCreateCellHTMLSave = function(spreadsheet, range, linkstyle) { - - var cr1, cr2, row, col, coord, cell, cellHTML; - var result = []; - var prange; - - if (range) { - prange = SocialCalc.ParseRange(range); - } - else { - prange = {cr1: {row: 1, col:1}, - cr2: {row: spreadsheet.sheet.attribs.lastrow, col: spreadsheet.sheet.attribs.lastcol}}; - } - cr1 = prange.cr1; - cr2 = prange.cr2; - - result.push("version:1.0"); - - for (row=cr1.row; row <= cr2.row; row++) { - for (col=cr1.col; col <= cr2.col; col++) { - coord = SocialCalc.crToCoord(col, row); - cell=spreadsheet.sheet.cells[coord]; - if (!cell) continue; - if (cell.displaystring == undefined) { - cellHTML = SocialCalc.FormatValueForDisplay(spreadsheet.sheet, cell.datavalue, coord, (linkstyle || spreadsheet.context.defaultHTMLlinkstyle)); - } - else { - cellHTML = cell.displaystring; - } - if (cellHTML == " ") continue; - result.push(coord+":"+SocialCalc.encodeForSave(cellHTML)); - } - } - - result.push(""); // one extra to get extra \n - return result.join("\n"); - } - -// -// Formula Bar Button Routines -// - -SocialCalc.SpreadsheetControl.DoFunctionList = function() { - - var i, cname, str, f, ele; - - var scf = SocialCalc.Formula; - var scc = SocialCalc.Constants; - var fcl = scc.function_classlist; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - scf.FillFunctionInfo(); - - str = '
    %loc!Category!
    '+ - '
      %loc!Functions!
    '+ - '
    '+ - '
    '+SocialCalc.SpreadsheetControl.GetFunctionInfoStr(scf.FunctionClasses[fcl[0]].items[0])+'
    '+ - '
    '+ - ' '+ - '
    '+ - '
    '; - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - str = ''+ - ''+ - '
    '+" %loc!Function List!"+' X 
    '+ - '
    '+str+'
    '; - - str = SocialCalc.LocalizeSubstrings(str); - - main.innerHTML = str; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"name"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide; if All, letter scrolls to there - - } - -SocialCalc.SpreadsheetControl.GetFunctionNamesStr = function(cname) { - - var i, f; - var scf = SocialCalc.Formula; - var str = ""; - - f = scf.FunctionClasses[cname]; - for (i=0; i':'>')+f.items[i]+''; - } - - return str; - - } - -SocialCalc.SpreadsheetControl.FillFunctionNames = function(cname, ele) { - - var i, f; - var scf = SocialCalc.Formula; - - ele.length = 0; - f = scf.FunctionClasses[cname]; - for (i=0; i
    "; - str += scsc(f[3]); - - return str; - - } - -SocialCalc.SpreadsheetControl.FunctionClassChosen = function(cname) { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - var scf = SocialCalc.Formula; - - SocialCalc.SpreadsheetControl.FillFunctionNames(cname, document.getElementById(idp+"name")); - - SocialCalc.SpreadsheetControl.FunctionChosen(scf.FunctionClasses[cname].items[0]); - - } - -SocialCalc.SpreadsheetControl.FunctionChosen = function(fname) { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"function"; - - document.getElementById(idp+"desc").innerHTML = SocialCalc.SpreadsheetControl.GetFunctionInfoStr(fname); - - } - -SocialCalc.SpreadsheetControl.HideFunctions = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById(spreadsheet.idPrefix+"functiondialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - } - -SocialCalc.SpreadsheetControl.DoFunctionPaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var ele = document.getElementById(spreadsheet.idPrefix+"functionname"); - var mele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - var text = ele.value+"("; - - SocialCalc.SpreadsheetControl.HideFunctions(); - - if (mele) { // multi-line editing is in progress - mele.value += text; - mele.focus(); - SocialCalc.CmdGotFocus(mele); - } - else { - editor.EditorAddToInput(text, "="); - } - - } - - -SocialCalc.SpreadsheetControl.DoMultiline = function() { - - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var str, ele, text; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"multiline"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - text = SocialCalc.special_chars(text); - - str = ''+ - '
    '+ - SCLocSS(' '+ - ' '+ - '
    '+ - ''); - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+ - SCLocSS(" %loc!Multi-line Input Box!")+' X 
    '+ - '
    '+str+'
    '; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"textarea"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide? - - } - - -SocialCalc.SpreadsheetControl.HideMultiline = function() { - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinedialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - - } - -SocialCalc.SpreadsheetControl.DoMultilineClear = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - ele.value = ""; - ele.focus(); - - } - - -SocialCalc.SpreadsheetControl.DoMultilinePaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var ele = document.getElementById(spreadsheet.idPrefix+"multilinetextarea"); - - var text = ele.value; - - SocialCalc.SpreadsheetControl.HideMultiline(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - editor.EditorSaveEdit(text); - - } - - -SocialCalc.SpreadsheetControl.DoLink = function() { - - var SCLoc = SocialCalc.LocalizeString; - - var str, ele, text, cell, setformat, popup; - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var idp = spreadsheet.idPrefix+"link"; - - ele = document.getElementById(idp+"dialog"); - if (ele) return; // already have one - - switch (editor.state) { - case "start": - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.RangeRemove(); - text = SocialCalc.GetCellContents(editor.context.sheetobj, wval.ecoord); - break; - - case "input": - case "inputboxdirect": - text = editor.inputBox.GetText(); - break; - } - - editor.inputBox.element.disabled = true; - - if (text.charAt(0)=="'") { - text = text.slice(1); - } - - var parts = SocialCalc.ParseCellLinkText(text); - - text = SocialCalc.special_chars(text); - - cell = spreadsheet.sheet.cells[editor.ecell.coord]; - if (!cell || !cell.textvalueformat) { // set to link format, but don't override - setformat = " checked"; - } - else { - setformat = ""; - } - - popup = parts.newwin ? " checked" : ""; - - str = '
    '+ - ''+SCLoc("Description")+'
    '+ - '
    '+ - ''+SCLoc("URL")+'
    '+ - '
    '; - if (SocialCalc.Callbacks.MakePageLink) { // only show if handling pagenames here - str += ''+SCLoc("Page Name")+'
    '+ - '
    '+ - ''+SCLoc("Workspace")+'
    '+ - '
    '; - } - str += SocialCalc.LocalizeSubstrings(' '+ - '%loc!Set to Link format!
    '+ - ' '+ - '%loc!Show in new browser window!'+ - '
    '+ - '
    '+ - ' '+ - ' '+ - '
    '+ - ''); - - var main = document.createElement("div"); - main.id = idp+"dialog"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+SCLoc("Link Input Box")+' X 
    '+ - '
    '+str+'
    '; - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - spreadsheet.spreadsheetDiv.appendChild(main); - - ele = document.getElementById(idp+"url"); - ele.focus(); - SocialCalc.CmdGotFocus(ele); -//!!! need to do keyboard handling: if esc, hide? - - } - - -SocialCalc.SpreadsheetControl.HideLink = function() { - - var scc = SocialCalc.Constants; - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - - var ele = document.getElementById(spreadsheet.idPrefix+"linkdialog"); - ele.innerHTML = ""; - - SocialCalc.DragUnregister(ele); - - SocialCalc.KeyboardFocus(); - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } - - switch (editor.state) { - case "start": - editor.inputBox.DisplayCellContents(null); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.disabled = false; - editor.inputBox.Focus(); - break; - } - - } - -SocialCalc.SpreadsheetControl.DoLinkClear = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - document.getElementById(spreadsheet.idPrefix+"linkdesc").value = ""; - document.getElementById(spreadsheet.idPrefix+"linkpagename").value = ""; - document.getElementById(spreadsheet.idPrefix+"linkworkspace").value = ""; - - var ele = document.getElementById(spreadsheet.idPrefix+"linkurl"); - ele.value = ""; - ele.focus(); - - } - - -SocialCalc.SpreadsheetControl.DoLinkPaste = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var wval = editor.workingvalues; - - var descele = document.getElementById(spreadsheet.idPrefix+"linkdesc"); - var urlele = document.getElementById(spreadsheet.idPrefix+"linkurl"); - var pagenameele = document.getElementById(spreadsheet.idPrefix+"linkpagename"); - var workspaceele = document.getElementById(spreadsheet.idPrefix+"linkworkspace"); - var formatele = document.getElementById(spreadsheet.idPrefix+"linkformat"); - var popupele = document.getElementById(spreadsheet.idPrefix+"linkpopup"); - - var text = ""; - - var ltsym, gtsym, obsym, cbsym; - - if (popupele.checked) { - ltsym = "<<"; gtsym = ">>"; obsym = "[["; cbsym = "]]"; - } - else { - ltsym = "<"; gtsym = ">"; obsym = "["; cbsym = "]"; - } - - if (pagenameele && pagenameele.value) { - if (workspaceele.value) { - text = descele.value+"{"+workspaceele.value+obsym+pagenameele.value+cbsym+"}"; - } - else { - text = descele.value+obsym+pagenameele.value+cbsym; - } - } - else { - text = descele.value+ltsym+urlele.value+gtsym; - } - - SocialCalc.SpreadsheetControl.HideLink(); - - switch (editor.state) { - case "start": - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - break; - case "input": - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - break; - } - - if (formatele.checked) { - SocialCalc.SpreadsheetControlExecuteCommand(null, "set %C textvalueformat text-link", ""); - } - - editor.EditorSaveEdit(text); - - } - -SocialCalc.SpreadsheetControl.DoSum = function() { - - var cmd, cell, row, col, sel, cr, foundvalue; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - var editor = spreadsheet.editor; - var sheet = editor.context.sheetobj; - - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - cmd = "set "+SocialCalc.crToCoord(editor.range.right, editor.range.bottom+1)+ - " formula sum("+sel+")"; - } - else { - row = editor.ecell.row - 1; - col = editor.ecell.col; - if (row<=1) { - cmd = "set "+editor.ecell.coord+" constant e#REF! 0 #REF!"; - } - else { - foundvalue = false; - while (row>0) { - cr = SocialCalc.crToCoord(col, row); - cell = sheet.GetAssuredCell(cr); - if (!cell.datatype || cell.datatype=="t") { - if (foundvalue) { - row++; - break; - } - } - else { - foundvalue = true; - } - row--; - } - cmd = "set "+editor.ecell.coord+" formula sum("+ - SocialCalc.crToCoord(col,row)+":"+SocialCalc.crToCoord(col, editor.ecell.row-1)+")"; - } - } - - editor.EditorScheduleSheetCommands(cmd, true, false); - - } - - -// -// TAB Routines -// - -// Sort - -SocialCalc.SpreadsheetControlSortOnclick = function(s, t) { - - var name, i; - var namelist = []; - var nl = document.getElementById(s.idPrefix+"sortlist"); - SocialCalc.LoadColumnChoosers(s); - s.editor.RangeChangeCallback.sort = SocialCalc.UpdateSortRangeProposal; - - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - nl.options[0] = new Option(SocialCalc.LocalizeString("[select range]")); - for (i=0; i0) { - rele = document.getElementById(spreadsheet.idPrefix+"minorsortup"); - str += ":"+sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } - else { - str += "::"; - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (sele.selectedIndex>0) { - rele = document.getElementById(spreadsheet.idPrefix+"lastsortup"); - str += ":"+sele.selectedIndex + (rele.checked ? ":up" : ":down"); - } - else { - str += "::"; - } - return str+"\n"; - } - -SocialCalc.SpreadsheetControlSortLoad = function(editor, setting, line, flags) { - var parts, ele; - - var spreadsheet = SocialCalc.GetSpreadsheetControlObject(); - - parts = line.split(":"); - spreadsheet.sortrange = SocialCalc.decodeFromSave(parts[1]); - ele = document.getElementById(spreadsheet.idPrefix+"sortbutton"); - if (spreadsheet.sortrange) { - ele.value = SocialCalc.LocalizeString("Sort ")+spreadsheet.sortrange; - ele.style.visibility = "visible"; - } - else { - ele.style.visibility = "hidden"; - } - SocialCalc.LoadColumnChoosers(spreadsheet); - - sele = document.getElementById(spreadsheet.idPrefix+"majorsort"); - sele.selectedIndex = parts[2]-0; - document.getElementById(spreadsheet.idPrefix+"majorsort"+parts[3]).checked = true; - sele = document.getElementById(spreadsheet.idPrefix+"minorsort"); - if (parts[4]) { - sele.selectedIndex = parts[4]-0; - document.getElementById(spreadsheet.idPrefix+"minorsort"+parts[5]).checked = true; - } - else { - sele.selectedIndex = 0; - document.getElementById(spreadsheet.idPrefix+"minorsortup").checked = true; - } - sele = document.getElementById(spreadsheet.idPrefix+"lastsort"); - if (parts[6]) { - sele.selectedIndex = parts[6]-0; - document.getElementById(spreadsheet.idPrefix+"lastsort"+parts[7]).checked = true; - } - else { - sele.selectedIndex = 0; - document.getElementById(spreadsheet.idPrefix+"lastsortup").checked = true; - } - - return true; - } - -// Comment - -SocialCalc.SpreadsheetControlCommentOnclick = function(s, t) { - s.editor.MoveECellCallback.comment = SocialCalc.SpreadsheetControlCommentMoveECell; - SocialCalc.SpreadsheetControlCommentDisplay(s, t); - SocialCalc.KeyboardFocus(); - return; - } - -SocialCalc.SpreadsheetControlCommentDisplay = function(s, t) { - var c = ""; - if (s.editor.ecell && s.editor.ecell.coord && s.sheet.cells[s.editor.ecell.coord]) { - c = s.sheet.cells[s.editor.ecell.coord].comment || ""; - } - document.getElementById(s.idPrefix+"commenttext").value = c; - } - -SocialCalc.SpreadsheetControlCommentMoveECell = function(editor) { - SocialCalc.SpreadsheetControlCommentDisplay(SocialCalc.GetSpreadsheetControlObject(), "comment"); - } - -SocialCalc.SpreadsheetControlCommentSet = function() { - var s=SocialCalc.GetSpreadsheetControlObject(); - s.ExecuteCommand("set %C comment "+SocialCalc.encodeForSave(document.getElementById(s.idPrefix+"commenttext").value)); - var cell=SocialCalc.GetEditorCellElement(s.editor, s.editor.ecell.row, s.editor.ecell.col); - s.editor.UpdateCellCSS(cell, s.editor.ecell.row, s.editor.ecell.col); - SocialCalc.KeyboardFocus(); - } - -SocialCalc.SpreadsheetControlCommentOnunclick = function(s, t) { - delete s.editor.MoveECellCallback.comment; - } - -// Names - -SocialCalc.SpreadsheetControlNamesOnclick = function(s, t) { - document.getElementById(s.idPrefix+"namesname").value = ""; - document.getElementById(s.idPrefix+"namesdesc").value = ""; - document.getElementById(s.idPrefix+"namesvalue").value = ""; - s.editor.RangeChangeCallback.names = SocialCalc.SpreadsheetControlNamesRangeChange; - s.editor.MoveECellCallback.names = SocialCalc.SpreadsheetControlNamesRangeChange; - SocialCalc.SpreadsheetControlNamesRangeChange(s.editor); - SocialCalc.SpreadsheetControlNamesFillNameList(); - SocialCalc.SpreadsheetControlNamesChangedName(); - } - -SocialCalc.SpreadsheetControlNamesFillNameList = function() { - var SCLoc = SocialCalc.LocalizeString; - var name, i; - var namelist = []; - var s=SocialCalc.GetSpreadsheetControlObject(); - var nl = document.getElementById(s.idPrefix+"nameslist"); - var currentname = document.getElementById(s.idPrefix+"namesname").value.toUpperCase().replace(/[^A-Z0-9_\.]/g, ""); - for (name in s.sheet.names) { - namelist.push(name); - } - namelist.sort(); - nl.length = 0; - if (namelist.length > 0) { - nl.options[0] = new Option(SCLoc("[New]")); - } - else { - nl.options[0] = new Option(SCLoc("[None]")); - } - for (i=0; i 0) { - strtoedit = SocialCalc.special_chars(SocialCalc.OtherSaveParts[whichpart] || ""); - } - else { - strtoedit = "Listing of Parts\n"; - for (partname in SocialCalc.OtherSaveParts) { - strtoedit += SocialCalc.special_chars("\nPart: "+partname+"\n=====\n"+SocialCalc.OtherSaveParts[partname]+"\n"); - } - } - var editbox = document.createElement("div"); - editbox.style.cssText = "position:absolute;z-index:500;width:300px;height:300px;left:100px;top:200px;border:1px solid black;background-color:#EEE;text-align:center;"; - editbox.id = "socialcalc-editbox"; - editbox.innerHTML = whichpart+'



    '; - document.body.appendChild(editbox); - - var ebta = document.getElementById("socialcalc-editbox-textarea"); - ebta.focus(); - SocialCalc.CmdGotFocus(ebta); - - } - -SocialCalc.CtrlSEditorDone = function(idprefix, whichpart) { - - var edittextarea = document.getElementById(idprefix+"-textarea"); - var text = edittextarea.value; - if (whichpart.length > 0) { - if (text.length > 0) { - SocialCalc.OtherSaveParts[whichpart] = text; - } - else { - delete SocialCalc.OtherSaveParts[whichpart]; - } - } - - var editbox = document.getElementById(idprefix); - SocialCalc.KeyboardFocus(); - editbox.parentNode.removeChild(editbox); - - } - diff --git a/Website/static/socialcalctableeditor.js b/Website/static/socialcalctableeditor.js deleted file mode 100644 index 9d8d0c0..0000000 --- a/Website/static/socialcalctableeditor.js +++ /dev/null @@ -1,6524 +0,0 @@ -// -// SocialCalcTableEditor -// -/* -// The code module of the SocialCalc package that displays a scrolling grid with panes -// and handles keyboard and mouse I/O. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript TableEditor. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the TableEditor is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/xoattrib - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// 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. -// All Rights Reserved. -// Portions (c) Copyright 2007 Socialtext, Inc. -// All Rights Reserved. -// The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0. -// wikiCalc 1.0 was written by Software Garden, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { // created here, too, in case load order is wrong, but main routines are required - SocialCalc = {}; - } - -// ************************************* -// -// Table Editor class: -// -// ************************************* - -// Constructor: - -SocialCalc.TableEditor = function(context) { - - var scc = SocialCalc.Constants; - - // Properties: - - this.context = context; // editing context - this.toplevel = null; // top level HTML element for this table editor - this.fullgrid = null; // rendered editing context - - this.noEdit = false; // if true, disable all edit UI and make read-only - - this.width = null; - this.tablewidth = null; - this.height = null; - this.tableheight = null; - - this.inputBox = null; - this.inputEcho = null; - this.verticaltablecontrol = null; - this.horizontaltablecontrol = null; - - this.logo = null; - - this.cellhandles = null; - - // Dynamic properties: - - this.timeout = null; // if non-null, timer id for position calculations - this.busy = false; // true when executing command, calculating, etc. - this.ensureecell = false; // if true, ensure ecell is visible after timeout - this.deferredCommands = []; // commands to execute after busy, in form: {cmdstr: "cmds", saveundo: t/f} - - this.gridposition = null; // screen coords of full grid - this.headposition = null; // screen coords of upper left of grid within header rows - this.firstscrollingrow = null; // row number of top row in last (the scrolling) pane - this.firstscrollingrowtop = null; // position of top row in last (the scrolling) pane - this.lastnonscrollingrow = null; // row number of last displayed row in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblerow = null; // used for paging down - this.firstscrollingcol = null; // column number of top col in last (the scrolling) pane - this.firstscrollingcolleft = null; // position of top col in last (the scrolling) pane - this.lastnonscrollingcol = null; // col number of last displayed column in last non-scrolling - // pane, or zero (for thumb position calculations) - this.lastvisiblecol = null; // used for paging right - - this.rowpositions = []; // screen positions of the top of some rows - this.colpositions = []; // screen positions of the left side of some rows - this.rowheight = []; // size in pixels of each row when last checked, or null/undefined, for page up - this.colwidth = []; // size in pixels of each column when last checked, or null/undefined, for page left - - this.ecell = null; // either null or {coord: c, row: r, col: c} - this.state = "start"; // the keyboard states: see EditorProcessKey - - this.workingvalues = {}; // values used during keyboard editing, etc. - - // Constants: - - this.imageprefix = scc.defaultImagePrefix; // URL prefix for images (e.g., "/images/sc") - this.idPrefix = scc.defaultTableEditorIDPrefix; - this.pageUpDnAmount = scc.defaultPageUpDnAmount; // number of rows to move cursor on PgUp/PgDn keys (numeric) - - // Callbacks - - // recalcFunction: if present, function(editor) {...}, called to do a recalc - // Default (sheet.RecalcSheet) does all the right stuff. - - this.recalcFunction = function(editor) { - if (editor.context.sheetobj.RecalcSheet) { - editor.context.sheetobj.RecalcSheet(SocialCalc.EditorSheetStatusCallback, editor); - } - else return null; - }; - - // ctrlkeyFunction: if present, function(editor, charname) {...}, called to handle ctrl-V, etc., at top level - // Returns true (pass through for continued processing) or false (stop processing this key). - - this.ctrlkeyFunction = function(editor, charname) { - - var ta, ha, cell, position, cmd, sel, cliptext; - - switch (charname) { - case "[ctrl-c]": - case "[ctrl-x]": - ta = editor.pasteTextarea; - ta.value = ""; - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = (position.left-1)+"px"; - ta.style.top = (position.top-1)+"px"; - } - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - else { - sel = editor.ecell.coord; - } - - // get what to copy to clipboard - cliptext = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), "tab"); - - if (charname == "[ctrl-c]" || editor.noEdit || (SocialCalc.Callbacks.IsCellEditable && (!SocialCalc.Callbacks.IsCellEditable(editor)))) { // if copy or cut but in no edit - cmd = "copy "+sel+" formulas"; - } - else { // [ctrl-x] - cmd = "cut "+sel+" formulas"; - } - editor.EditorScheduleSheetCommands(cmd, true, false); // queue up command to put on SocialCalc clipboard - - /* Copy as HTML: This fails rather badly as it won't paste into Notepad as tab-delimited text. Oh well. - - ha = editor.pasteHTMLarea; - if (editor.range.hasrange) { - cell = SocialCalc.GetEditorCellElement(editor, editor.range.top, editor.range.left); - } - else { - cell = SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - } - if (cell) position = SocialCalc.GetElementPosition(cell.element); - - if (ha) { - if (position) { - ha.style.left = (position.left-1)+"px"; - ha.style.top = (position.top-1)+"px"; - } - ha.style.visibility="visible"; - cliptext = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.CreateSheetSave(editor.context.sheetobj, sel), "html"); - ha.innerHTML = cliptext.replace(/]*>[\d\D]*?<\/tr\b[^>]*>/i, ''); - ha.focus(); - - var range = document.body.createControlRange(); - range.addElement(ha.childNodes[0]); - range.select(); - } - */ - ta.style.display = "block"; - ta.value = cliptext; // must follow "block" setting for Webkit - ta.focus(); - ta.select(); - window.setTimeout(function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; // in case not loaded - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - /* - var ha = editor.pasteHTMLarea; - if (ha) { - ha.blur(); - ha.innerHTML = ''; - ha.style.visibility = 'hidden'; - } - */ - var ta = editor.pasteTextarea; - ta.blur(); - ta.style.display = "none"; - SocialCalc.KeyboardFocus(); - }, 200); - - return true; - - case "[ctrl-v]": - if (editor.noEdit) return true; // not if no edit - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - var showPasteTextArea = function() { - ta = editor.pasteTextarea; - ta.value = ""; - - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - ta.style.left = (position.left-1)+"px"; - ta.style.top = (position.top-1)+"px"; - } - ta.style.display = "block"; - ta.value = ""; // must follow "block" setting for Webkit - ta.focus(); - }; - - ha = editor.pasteHTMLarea; - if (ha) { - /* Pasting via HTML - Currently IE only */ - ha.style.visibility = "visible"; - ha.focus(); - } - else { - showPasteTextArea(); - } - window.setTimeout(function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var value = null; - var isPasteSameAsClipboard = false; - - ha = editor.pasteHTMLarea; - if (ha) { - /* IE: We append a U+FFFC to every TD that's not the last of its row, - * then we obtain innerText, then turn U+FFFC back to \t, - * thereby preserving the cell separations (which gets discarded - * if we simply paste via textarea. - */ - var _ObjectReplacementCharacter_ = String.fromCharCode(0xFFFC); - var html = ha.innerHTML; - - if (html.search(/<(?![Bb][Rr])[A-Za-z]/) >= 0) { - /* HTML Paste: Mark TDs with U+FFFC accordingly.. */ - ha.innerHTML = html.replace( - /(?:<\/[Tt][Dd]>)/g, - _ObjectReplacementCharacter_ - ); - } - else { - /* Text Paste: In IE, \t is transformed into  , so replace them with U+FFFC. */ - ha.innerHTML = html.replace( - /&[Nn][Bb][Ss][Pp];/g, - _ObjectReplacementCharacter_ - ); - } - - value = ha.innerText.replace(new RegExp(_ObjectReplacementCharacter_, 'g'), '\t'); - - ha.innerHTML = ''; - ha.blur(); - ha.style.visibility = "hidden"; - } - else { - var ta = editor.pasteTextarea; - value = ta.value; - ta.blur(); - ta.style.display = "none"; - } - - value = value.replace(/\r\n/g, "\n").replace(/\n?$/, '\n'); - var clipstr = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.Clipboard.clipboard, "tab"); - if (value == clipstr || (value.length-clipstr.length==1 && value.substring(0,value.length-1)==clipstr)) { - isPasteSameAsClipboard = true; - } - - var cmd = ""; - // pastes SocialCalc clipboard if did a Ctrl-C and contents still the same - // Webkit adds an extra blank line, so need to allow for that - if (!isPasteSameAsClipboard) { - cmd = "loadclipboard "+ - SocialCalc.encodeForSave(SocialCalc.ConvertOtherFormatToSave(value, "tab")) + "\n"; - } - var cr; - if (editor.range.hasrange) { - cr = SocialCalc.crToCoord(editor.range.left, editor.range.top); - } - else { - cr = editor.ecell.coord; - } - cmd += "paste "+cr+" formulas"; - editor.EditorScheduleSheetCommands(cmd, true, false); - SocialCalc.KeyboardFocus(); - }, 200); - return true; - - case "[ctrl-z]": - editor.EditorScheduleSheetCommands("undo", true, false); - return false; - - case "[ctrl-s]": // !!!! temporary hack - window.setTimeout( - function() { - if (!SocialCalc.GetSpreadsheetControlObject) return; - var s = SocialCalc.GetSpreadsheetControlObject(); - if (!s) return; - var editor = s.editor; - var sheet = editor.context.sheetobj; - var cell = sheet.GetAssuredCell(editor.ecell.coord); - var ntvf = cell.nontextvalueformat ? sheet.valueformats[cell.nontextvalueformat-0] || "" : ""; - var newntvf = window.prompt("Advanced Feature:\n\nCustom Numeric Format or Command", ntvf); - if (newntvf != null) { // not cancelled - if (newntvf.match(/^cmd:/)) { - cmd = newntvf.substring(4); // execute as command - } - else if (newntvf.match(/^edit:/)) { - cmd = newntvf.substring(5); // execute as command - if (SocialCalc.CtrlSEditor) { - SocialCalc.CtrlSEditor(cmd); - } - return; - } - else { - if (editor.range.hasrange) { - sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - else { - sel = editor.ecell.coord; - } - cmd = "set "+sel+" nontextvalueformat "+newntvf; - } - editor.EditorScheduleSheetCommands(cmd, true, false); - } - }, - 200); - return false; - - default: - break; - } - return true; - }; - - // Set sheet's status callback: - - context.sheetobj.statuscallback = SocialCalc.EditorSheetStatusCallback; - context.sheetobj.statuscallbackparams = this; // this object: the table editor object - - - // StatusCallback: all values are called at appropriate times, add with unique name, delete when done - // - // Each value must be an object in the form of: - // - // func: function(editor, status, arg, params) {...}, - // params: params value to call func with - // - // The values for status and arg are: - // - // all the SocialCalc RecalcSheet statuscallbacks, including: - // - // calccheckdone, calclist length - // calcorder, {coord: coord, total: celllist length, count: count} - // calcstep, {coord: coord, total: calclist length, count: count} - // calcfinished, time in milliseconds - // - // the command callbacks, like cmdstart and cmdend - // cmdendnorender - // - // calcstart, null - // moveecell, new ecell coord - // rangechange, "coord:coord" or "coord" or "" - // specialkey, keyname ("[esc]") - // - - this.StatusCallback = {}; - - - this.MoveECellCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.RangeChangeCallback = {}; // all values are called with editor as arg; add with unique name, delete when done - this.SettingsCallbacks = {}; // See SocialCalc.SaveEditorSettings - - // Set initial cursor - - this.ecell = {coord: "A1", row: 1, col: 1}; - context.highlights[this.ecell.coord] = "cursor"; - - // Initialize range data - // Range has at least hasrange (true/false). - // It may also have: anchorcoord, anchorrow, anchorcol, top, bottom, left, and right. - - this.range = {hasrange: false}; - - // Initialize range2 data (used to show selections, such as for move) - // Range2 has at least hasrange (true/false). - // It may also have: top, bottom, left, and right. - - this.range2 = {hasrange: false}; - - } - -// Methods: - -SocialCalc.TableEditor.prototype.CreateTableEditor = function(width, height) {return SocialCalc.CreateTableEditor(this, width, height);}; -SocialCalc.TableEditor.prototype.ResizeTableEditor = function(width, height) {return SocialCalc.ResizeTableEditor(this, width, height);}; - -SocialCalc.TableEditor.prototype.SaveEditorSettings = function() {return SocialCalc.SaveEditorSettings(this);}; -SocialCalc.TableEditor.prototype.LoadEditorSettings = function(str, flags) {return SocialCalc.LoadEditorSettings(this, str, flags);}; - -SocialCalc.TableEditor.prototype.EditorRenderSheet = function() {SocialCalc.EditorRenderSheet(this);}; -SocialCalc.TableEditor.prototype.EditorScheduleSheetCommands = function(cmdstr, saveundo, ignorebusy) {SocialCalc.EditorScheduleSheetCommands(this, cmdstr, saveundo, ignorebusy);}; -SocialCalc.TableEditor.prototype.ScheduleSheetCommands = function(cmdstr, saveundo) { - this.context.sheetobj.ScheduleSheetCommands(cmdstr, saveundo); - }; -SocialCalc.TableEditor.prototype.SheetUndo = function() { - this.context.sheetobj.SheetUndo(); - }; -SocialCalc.TableEditor.prototype.SheetRedo = function() { - this.context.sheetobj.SheetRedo(); - }; -SocialCalc.TableEditor.prototype.EditorStepSet = function(status, arg) {SocialCalc.EditorStepSet(this, status, arg);}; -SocialCalc.TableEditor.prototype.GetStatuslineString = function(status, arg, params) {return SocialCalc.EditorGetStatuslineString(this, status, arg, params);}; - -SocialCalc.TableEditor.prototype.EditorMouseRegister = function() {return SocialCalc.EditorMouseRegister(this);}; -SocialCalc.TableEditor.prototype.EditorMouseUnregister = function() {return SocialCalc.EditorMouseUnregister(this);}; -SocialCalc.TableEditor.prototype.EditorMouseRange = function(coord) {return SocialCalc.EditorMouseRange(this, coord);}; - -SocialCalc.TableEditor.prototype.EditorProcessKey = function(ch, e) {return SocialCalc.EditorProcessKey(this, ch, e);}; -SocialCalc.TableEditor.prototype.EditorAddToInput = function(str, prefix) {return SocialCalc.EditorAddToInput(this, str, prefix);}; -SocialCalc.TableEditor.prototype.DisplayCellContents = function() {return SocialCalc.EditorDisplayCellContents(this);}; -SocialCalc.TableEditor.prototype.EditorSaveEdit = function(text) {return SocialCalc.EditorSaveEdit(this, text);}; -SocialCalc.TableEditor.prototype.EditorApplySetCommandsToRange = function(cmdline, type) {return SocialCalc.EditorApplySetCommandsToRange(this, cmdline, type);}; - -SocialCalc.TableEditor.prototype.MoveECellWithKey = function(ch) {return SocialCalc.MoveECellWithKey(this, ch);}; -SocialCalc.TableEditor.prototype.MoveECell = function(newcell) {return SocialCalc.MoveECell(this, newcell);}; -SocialCalc.TableEditor.prototype.ReplaceCell = function(cell, row, col) {SocialCalc.ReplaceCell(this, cell, row, col);}; -SocialCalc.TableEditor.prototype.UpdateCellCSS = function(cell, row, col) {SocialCalc.UpdateCellCSS(this, cell, row, col);}; -SocialCalc.TableEditor.prototype.SetECellHeaders = function(selected) {SocialCalc.SetECellHeaders(this, selected);}; -SocialCalc.TableEditor.prototype.EnsureECellVisible = function() {SocialCalc.EnsureECellVisible(this);}; -SocialCalc.TableEditor.prototype.RangeAnchor = function(coord) {SocialCalc.RangeAnchor(this, coord);}; -SocialCalc.TableEditor.prototype.RangeExtend = function(coord) {SocialCalc.RangeExtend(this, coord);}; -SocialCalc.TableEditor.prototype.RangeRemove = function() {SocialCalc.RangeRemove(this);}; -SocialCalc.TableEditor.prototype.Range2Remove = function() {SocialCalc.Range2Remove(this);}; - -SocialCalc.TableEditor.prototype.FitToEditTable = function() {SocialCalc.FitToEditTable(this);}; -SocialCalc.TableEditor.prototype.CalculateEditorPositions = function() {SocialCalc.CalculateEditorPositions(this);}; -SocialCalc.TableEditor.prototype.ScheduleRender = function() {SocialCalc.ScheduleRender(this);}; -SocialCalc.TableEditor.prototype.DoRenderStep = function() {SocialCalc.DoRenderStep(this);}; -SocialCalc.TableEditor.prototype.SchedulePositionCalculations = function() {SocialCalc.SchedulePositionCalculations(this);}; -SocialCalc.TableEditor.prototype.DoPositionCalculations = function() {SocialCalc.DoPositionCalculations(this);}; -SocialCalc.TableEditor.prototype.CalculateRowPositions = function(panenum, positions, sizes) {return SocialCalc.CalculateRowPositions(this, panenum, positions, sizes);}; -SocialCalc.TableEditor.prototype.CalculateColPositions = function(panenum, positions, sizes) {return SocialCalc.CalculateColPositions(this, panenum, positions, sizes);}; - -SocialCalc.TableEditor.prototype.ScrollRelative = function(vertical, amount) {SocialCalc.ScrollRelative(this, vertical, amount);}; -SocialCalc.TableEditor.prototype.ScrollRelativeBoth = function(vamount, hamount) {SocialCalc.ScrollRelativeBoth(this, vamount, hamount);}; -SocialCalc.TableEditor.prototype.PageRelative = function(vertical, direction) {SocialCalc.PageRelative(this, vertical, direction);}; -SocialCalc.TableEditor.prototype.LimitLastPanes = function() {SocialCalc.LimitLastPanes(this);}; - -SocialCalc.TableEditor.prototype.ScrollTableUpOneRow = function() {return SocialCalc.ScrollTableUpOneRow(this);}; -SocialCalc.TableEditor.prototype.ScrollTableDownOneRow = function() {return SocialCalc.ScrollTableDownOneRow(this);}; -SocialCalc.TableEditor.prototype.ScrollTableLeftOneCol = function() {return SocialCalc.ScrollTableLeftOneCol(this);}; -SocialCalc.TableEditor.prototype.ScrollTableRightOneCol = function() {return SocialCalc.ScrollTableRightOneCol(this);}; - -// Functions: - -SocialCalc.CreateTableEditor = function(editor, width, height) { - - var scc = SocialCalc.Constants; - var AssignID = SocialCalc.AssignID; - - editor.toplevel = document.createElement("div"); - editor.width = width; - editor.height = height; - - editor.griddiv = document.createElement("div"); - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width=editor.tablewidth+"px"; - editor.griddiv.style.height=editor.tableheight+"px"; - editor.griddiv.style.overflow="hidden"; - editor.griddiv.style.cursor="default"; - if (scc.cteGriddivClass) editor.griddiv.className = scc.cteGriddivClass; - AssignID(editor, editor.griddiv, "griddiv"); - - editor.FitToEditTable(); - - editor.EditorRenderSheet(); - - editor.griddiv.appendChild(editor.fullgrid); - - editor.verticaltablecontrol = new SocialCalc.TableControl(editor, true, editor.tableheight); - editor.verticaltablecontrol.CreateTableControl(); - AssignID(editor, editor.verticaltablecontrol.main, "tablecontrolv"); - - editor.horizontaltablecontrol = new SocialCalc.TableControl(editor, false, editor.tablewidth); - editor.horizontaltablecontrol.CreateTableControl(); - AssignID(editor, editor.horizontaltablecontrol.main, "tablecontrolh"); - - var table, tbody, tr, td, img, anchor, ta, ha; - - table = document.createElement("table"); - editor.layouttable = table; - table.cellSpacing = 0; - table.cellPadding = 0; - AssignID(editor, table, "layouttable"); - - tbody = document.createElement("tbody"); - table.appendChild(tbody); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - td.appendChild(editor.griddiv); - tr.appendChild(td); - td = document.createElement("td"); - td.appendChild(editor.verticaltablecontrol.main); - tr.appendChild(td); - - tr = document.createElement("tr"); - tbody.appendChild(tr); - td = document.createElement("td"); - td.appendChild(editor.horizontaltablecontrol.main); - tr.appendChild(td); - - td = document.createElement("td"); // logo display: Required by CPAL License for this code! - td.style.background="url("+editor.imageprefix+"logo.gif) no-repeat center center"; - td.innerHTML = "
    "; - tr.appendChild(td); - editor.logo = td; - AssignID(editor, editor.logo, "logo"); - SocialCalc.TooltipRegister(td.firstChild.firstChild, "SocialCalc", null); - - editor.toplevel.appendChild(editor.layouttable); - - if (!editor.noEdit) { - editor.inputEcho = new SocialCalc.InputEcho(editor); - AssignID(editor, editor.inputEcho.main, "inputecho"); - } - - editor.cellhandles = new SocialCalc.CellHandles(editor); - - ta = document.createElement("textarea"); // used for ctrl-c/ctrl-v where an invisible text area is needed - SocialCalc.setStyles(ta, "display:none;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);"); - ta.value = ""; - editor.pasteTextarea = ta; - AssignID(editor, editor.pasteTextarea, "pastetextarea"); - - if (navigator.userAgent.match(/Safari\//) &&!navigator.userAgent.match(/Chrome\//)) { // special code for Safari 5 change - window.removeEventListener('beforepaste', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforepaste', SocialCalc.SafariPasteFunction, false); - window.removeEventListener('beforecopy', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforecopy', SocialCalc.SafariPasteFunction, false); - window.removeEventListener('beforecut', SocialCalc.SafariPasteFunction, false); - window.addEventListener('beforecut', SocialCalc.SafariPasteFunction, false); - } - - editor.toplevel.appendChild(editor.pasteTextarea); - - var div = document.createElement("div"); - div.innerHTML = '
    '; - if (div.firstChild.nodeType == 1) { - /* We are running in IE -- Using HTML-based area for Ctrl-V */ - ha = document.createElement("div"); // used for ctrl-v where an invisible html area is needed - editor.pasteHTMLarea = ha; - editor.toplevel.appendChild(editor.pasteHTMLarea); - ha.contentEditable = true; - AssignID(editor, editor.pasteHTMLarea, "pastehtmlarea"); - SocialCalc.setStyles(ha, "display:block;visibility:hidden;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);overflow:hidden"); - } - - SocialCalc.MouseWheelRegister(editor.toplevel, {WheelMove: SocialCalc.EditorProcessMouseWheel, editor: editor}); - - if (SocialCalc.HasTouch) { - SocialCalc.TouchRegister(editor.toplevel, {Swipe: SocialCalc.EditorProcessSwipe, - DoubleTap: SocialCalc.EditorProcessDoubleTap, - SingleTap: SocialCalc.EditorProcessSingleTap, - editor: editor}); - } - - if (editor.inputBox) { // this seems to fix an obscure bug with Firefox 2 Mac where Ctrl-V doesn't get fired right - if (editor.inputBox.element) { - editor.inputBox.element.focus(); - editor.inputBox.element.blur(); - } - } - SocialCalc.KeyboardSetFocus(editor); - - // do status reporting things - - SocialCalc.EditorSheetStatusCallback(null, "startup", null, editor); - - // done - - return editor.toplevel; - - } - -// Special code needed for change that occurred with Safari 5 that made paste not work for some reason - -SocialCalc.SafariPasteFunction = function(e) { - e.preventDefault(); - } - -// -// SocialCalc.ResizeTableEditor(editor, width, height) -// -// Move things around as appropriate and resize -// - -SocialCalc.ResizeTableEditor = function(editor, width, height) { - - var scc = SocialCalc.Constants; - - editor.width = width; - editor.height = height; - - editor.toplevel.style.width = width+"px"; - editor.toplevel.style.height = height+"px"; - - editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness); - editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness); - editor.griddiv.style.width=editor.tablewidth+"px"; - editor.griddiv.style.height=editor.tableheight+"px"; - - editor.verticaltablecontrol.main.style.height = editor.tableheight + "px"; - editor.horizontaltablecontrol.main.style.width = editor.tablewidth + "px"; - - editor.FitToEditTable(); - - editor.ScheduleRender(); - - return; - - } - -// -// str = SaveEditorSettings(editor) -// -// Returns a string representation of the pane settings, etc. -// -// The format is: -// -// version:1.0 -// rowpane:panenumber:firstnum:lastnum -// colpane:panenumber:firstnum:lastnum -// ecell:coord -- if set -// range:anchorcoord:top:bottom:left:right -- if set -// -// You can add additional values to be saved by using editor.SettingsCallbacks: -// -// editor.SettingsCallbacks["item-name"] = {save: savefunction, load: loadfunction} -// -// where savefunction(editor, "item-name") returns a string with the new lines to be added to the saved settings -// which include the trailing newlines, and loadfunction(editor, "item-name", line, flags) is given the line to process -// without the trailing newlines. -// - -SocialCalc.SaveEditorSettings = function(editor) { - - var i, setting; - var context = editor.context; - var range = editor.range; - var result = ""; - - result += "version:1.0\n"; - - for (i=0; i'; - } - - return sstr; - - } - - -// -// Mouse stuff -// - -SocialCalc.EditorMouseInfo = { - - // The registeredElements array is used to identify editor grid in which the mouse is doing things. - - // One item for each active editor, each an object with: - // .element, .editor - - registeredElements: [], - - editor: null, // editor being processed (between mousedown and mouseup) - element: null, // element being processed - - ignore: false, // if true, mousedowns are ignored - - mousedowncoord: "", // coord where mouse went down for drag range - mouselastcoord: "", // coord where mouse last was during drag - mouseresizecol: "", // col being resized - mouseresizeclientx: null, // where resize started - mouseresizedisplay: null // element tracking new size - } - -// -// EditorMouseRegister(editor) -// - -SocialCalc.EditorMouseRegister = function(editor) { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var element = editor.fullgrid; - var i; - - for (i=0; i=^".indexOf(inputtext.slice(-1))>=0 && inputtext.slice(0,1)=="=") || - (inputtext == "=")) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { // if in pointing operation - if (coord) { - if (range.hasrange) { - var sheetpref = (wval.currentsheet == wval.startsheet)?"":wval.currentsheet+"!"; - editor.inputBox.SetText(wval.partialexpr + sheetpref+ SocialCalc.crToCoord(range.left, range.top) + ":" + sheetpref + - SocialCalc.crToCoord(range.right, range.bottom)); - } - else { - var sheetpref = (wval.currentsheet == wval.startsheet)?"":wval.currentsheet+"!"; - editor.inputBox.SetText(wval.partialexpr + sheetpref+coord); - } - } - } - else { // not in point -- done editing - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - } - break; - - case "inputboxdirect": - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - editor.EditorSaveEdit(); - editor.inputBox.DisplayCellContents(null); - break; - } - } - -SocialCalc.ProcessEditorMouseMove = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat(editor, result); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - if (result.coord!=mouseinfo.mouselastcoord) { - if (!e.shiftKey && !editor.range.hasrange) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - } - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - mouseinfo.mouselastcoord = result.coord; - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.ProcessEditorMouseUp = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - if (mouseinfo.ignore) return; // ignore this - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result) return; - - if (!result.coord) result.coord = editor.ecell.coord; - - if (editor.range.hasrange) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - else if (result.coord && result.coord!=mouseinfo.mousedowncoord) { - editor.RangeAnchor(mouseinfo.mousedowncoord); - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - - editor.EditorMouseRange(result.coord); - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.ProcessEditorMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.ProcessEditorMouseUp, true); - } - else if (element.detachEvent) { // IE - element.detachEvent("onlosecapture", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmouseup", SocialCalc.ProcessEditorMouseUp); - element.detachEvent("onmousemove", SocialCalc.ProcessEditorMouseMove); - element.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - - } - - -SocialCalc.ProcessEditorColsizeMouseDown = function(e, ele, result) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - mouseinfo.mouseresizecolnum = result.coltoresize; // remember col being resized - mouseinfo.mouseresizecol = SocialCalc.rcColname(result.coltoresize); - mouseinfo.mousedownclientx = clientX; - - var sizedisplay = document.createElement("div"); - mouseinfo.mouseresizedisplay = sizedisplay; - sizedisplay.style.width = "auto"; - sizedisplay.style.position = "absolute"; - sizedisplay.style.zIndex = 100; - sizedisplay.style.top = (editor.headposition.top+0)+"px"; - sizedisplay.style.left = editor.colpositions[result.coltoresize]+"px"; - sizedisplay.innerHTML = ''+ - '
     
    '+ - editor.context.colwidth[mouseinfo.mouseresizecolnum] + '
    '; - SocialCalc.setStyles(sizedisplay.firstChild.lastChild.firstChild.childNodes[0], "filter:alpha(opacity=85);opacity:.85;"); // so no warning msg with Firefox about filter - - editor.toplevel.appendChild(sizedisplay); - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mousemove", SocialCalc.ProcessEditorColsizeMouseMove, true); // capture everywhere - document.addEventListener("mouseup", SocialCalc.ProcessEditorColsizeMouseUp, true); // capture everywhere - } - else if (editor.toplevel.attachEvent) { // IE 5+ - editor.toplevel.setCapture(); - editor.toplevel.attachEvent("onmousemove", SocialCalc.ProcessEditorColsizeMouseMove); - editor.toplevel.attachEvent("onmouseup", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.attachEvent("onlosecapture", SocialCalc.ProcessEditorColsizeMouseUp); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - } - - -SocialCalc.ProcessEditorColsizeMouseMove = function(e) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - var newsize = (editor.context.colwidth[mouseinfo.mouseresizecolnum]-0) + (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) newsize = SocialCalc.Constants.defaultMinimumColWidth; - - var sizedisplay = mouseinfo.mouseresizedisplay; -// sizedisplay.firstChild.lastChild.firstChild.childNodes[1].firstChild.innerHTML = newsize+""; -// sizedisplay.firstChild.lastChild.firstChild.childNodes[0].firstChild.style.width = (newsize-2)+"px"; - sizedisplay.innerHTML = ''+ - '
     
    '+ - newsize + '
    '; - SocialCalc.setStyles(sizedisplay.firstChild.lastChild.firstChild.childNodes[0], "filter:alpha(opacity=85);opacity:.85;"); // so no warning msg with Firefox about filter - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.ProcessEditorColsizeMouseUp = function(e) { - - var event = e || window.event; - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - element = mouseinfo.element; - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.ProcessEditorColsizeMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.ProcessEditorColsizeMouseUp, true); - } - else if (editor.toplevel.detachEvent) { // IE - editor.toplevel.detachEvent("onlosecapture", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.detachEvent("onmouseup", SocialCalc.ProcessEditorColsizeMouseUp); - editor.toplevel.detachEvent("onmousemove", SocialCalc.ProcessEditorColsizeMouseMove); - editor.toplevel.releaseCapture(); - } - - var newsize = (editor.context.colwidth[mouseinfo.mouseresizecolnum]-0) + (clientX - mouseinfo.mousedownclientx); - if (newsize < SocialCalc.Constants.defaultMinimumColWidth) newsize = SocialCalc.Constants.defaultMinimumColWidth; - - editor.EditorScheduleSheetCommands("set "+mouseinfo.mouseresizecol+" width "+newsize, true, false); - - if (editor.timeout) window.clearTimeout(editor.timeout); - editor.timeout = window.setTimeout(SocialCalc.FinishColsize, 1); // wait - Firefox 2 has a bug otherwise with next mousedown - - return false; - - } - - -SocialCalc.FinishColsize = function() { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; - - editor.toplevel.removeChild(mouseinfo.mouseresizedisplay); - mouseinfo.mouseresizedisplay = null; - -// editor.FitToEditTable(); -// editor.EditorRenderSheet(); -// editor.SchedulePositionCalculations(); - - mouseinfo.editor = null; - - return; - - } - -// -// Handle auto-repeat of dragging the cursor into the borders of the sheet -// - -SocialCalc.AutoRepeatInfo = { - - timer: null, // timer object for repeating - mouseinfo: null, // result from SocialCalc.GridMousePosition - repeatinterval: 1000, // milliseconds to wait between repeats - editor: null, // editor object to use when it repeats - repeatcallback: null // used instead of default when repeating (e.g., for cellhandles) - // called as: repeatcallback(newcoord, direction) - -}; - -// Control auto-repeat. If mouseinfo==null, cancel. - -SocialCalc.SetDragAutoRepeat = function(editor, mouseinfo, callback) { - - var repeatinfo = SocialCalc.AutoRepeatInfo; - var coord, direction; - - repeatinfo.repeatcallback = callback; // null in regular case - - if (!mouseinfo) { // cancel - if (repeatinfo.timer) { // If was repeating, stop - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - repeatinfo.mouseinfo = null; - return; // done - } - - repeatinfo.editor = editor; - - if (repeatinfo.mouseinfo) { // check for change while repeating - if (mouseinfo.rowheader || mouseinfo.rowfooter) { - if (mouseinfo.row != repeatinfo.mouseinfo.row) { // changed row while dragging sidewards - coord = SocialCalc.crToCoord(editor.ecell.col, mouseinfo.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } - else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } - else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } - else { - editor.MoveECell(coord); - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } - else if (mouseinfo.colheader || mouseinfo.colfooter) { - if (mouseinfo.col != repeatinfo.mouseinfo.col) { // changed col while dragging vertically - coord = SocialCalc.crToCoord(mouseinfo.col, editor.ecell.row); // change to it - if (repeatinfo.repeatcallback) { - if (mouseinfo.row < repeatinfo.mouseinfo.row) { - direction = "left"; - } - else if (mouseinfo.row > repeatinfo.mouseinfo.row) { - direction = "right"; - } - else { - direction = ""; - } - repeatinfo.repeatcallback(coord, direction); - } - else { - editor.MoveECell(coord); - editor.RangeExtend(); - editor.EditorMouseRange(coord); - } - } - } - } - - repeatinfo.mouseinfo = mouseinfo; - - if (mouseinfo.distance < 5) repeatinfo.repeatinterval = 333; - else if (mouseinfo.distance < 10) repeatinfo.repeatinterval = 250; - else if (mouseinfo.distance < 25) repeatinfo.repeatinterval = 100; - else if (mouseinfo.distance < 35) repeatinfo.repeatinterval = 75; - else { // too far - stop repeating - if (repeatinfo.timer) { // if repeating, cancel it - window.clearTimeout(repeatinfo.timer); // cancel timer - repeatinfo.timer = null; - } - return; - } - - if (!repeatinfo.timer) { // start if not already running - repeatinfo.timer = window.setTimeout(SocialCalc.DragAutoRepeat, repeatinfo.repeatinterval); - } - - return; - - } - -// -// DragAutoRepeat() -// - -SocialCalc.DragAutoRepeat = function() { - - var repeatinfo = SocialCalc.AutoRepeatInfo; - var mouseinfo = repeatinfo.mouseinfo; - - var direction, coord, cr; - - if (mouseinfo.rowheader) direction = "left"; - else if (mouseinfo.rowfooter) direction = "right"; - else if (mouseinfo.colheader) direction = "up"; - else if (mouseinfo.colfooter) direction = "down"; - - if (repeatinfo.repeatcallback) { - cr = SocialCalc.coordToCr(repeatinfo.editor.ecell.coord); - if (direction == "left" && cr.col > 1) cr.col--; - else if (direction == "right") cr.col++; - else if (direction == "up" && cr.row > 1) cr.row--; - else if (direction == "down") cr.row++; - coord = SocialCalc.crToCoord(cr.col, cr.row); - repeatinfo.repeatcallback(coord, direction); - } - else { - coord = repeatinfo.editor.MoveECellWithKey("[a"+direction+"]shifted"); - if (coord) repeatinfo.editor.EditorMouseRange(coord); - } - - repeatinfo.timer = window.setTimeout(SocialCalc.DragAutoRepeat, repeatinfo.repeatinterval); - - } - -// -// Handling Clicking -// - -SocialCalc.ProcessEditorDblClick = function(e) { - - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var mobj; - - if (mouseinfo.ignore) return; // ignore this - - for (mobj=null; !mobj && ele; ele=ele.parentNode) { // go up tree looking for one of our elements - mobj = SocialCalc.LookupElement(ele, mouseinfo.registeredElements); - } - if (!mobj) { - mouseinfo.editor = null; - return; // not one of our elements - } - - editor = mobj.editor; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); - if (!result || !result.coord) return; // not within cell area - ignore - - mouseinfo.editor = editor; // remember for later - mouseinfo.element = ele; - range = editor.range; - - sheetobj = editor.context.sheetobj; - - switch (editor.state) { - case "start": - SocialCalc.EditorOpenCellEdit(editor); - break; - - case "input": - break; - - default: - break; - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - - -SocialCalc.EditorOpenCellEdit = function(editor) { - - var wval; - - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no input box, so no editing (happens on noEdit) - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - if (editor.inputBox.element.disabled) return true; // multi-line: ignore - if (editor.inputBox.element.style.display == 'none') { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "editecell", null, editor.StatusCallback[f].params); - } - return true; // no inputBox display, so no editing - } - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - if (SocialCalc.HasTouch) { - editor.state = "input"; - } else { - editor.state = "inputboxdirect"; - } - editor.inputBox.SetText(""); - editor.inputBox.DisplayCellContents(); - editor.inputBox.Select("end"); - wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - - return; - - } - - -SocialCalc.EditorProcessKey = function(editor, ch, e) { - - var result, cell, cellobj, valueinfo, fch, coord, inputtext, f; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - var range = editor.range; - - if (typeof ch != "string") ch = ""; - - switch (editor.state) { - case "start": - if (e.shiftKey && ch.substr(0,2)=="[a") { - ch = ch + "shifted"; - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a" || ch.substr(0,3)=="[pg" || ch=="[home]") { - result = editor.MoveECellWithKey(ch); - return !result; - } - if (ch=="[del]" || ch=="[backspace]") { - if (!editor.noEdit) { - editor.EditorApplySetCommandsToRange("empty", ""); - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - break; - } - if (ch=="[esc]") { - if (range.hasrange) { - editor.RangeRemove(); - editor.MoveECell(range.anchorcoord); - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "specialkey", ch, editor.StatusCallback[f].params); - } - } - return false; - } - - if (ch=="[f2]") { - if (editor.noEdit) return true; - SocialCalc.EditorOpenCellEdit(editor); - return false; - } - - if ((ch.length>1 && ch.substr(0,1)=="[") || ch.length==0) { // some control key - if (editor.ctrlkeyFunction && ch.length>0) { - return editor.ctrlkeyFunction(editor, ch); - } - else { - return true; - } - } - if (!editor.ecell) return true; // no ecell - if (!editor.inputBox) return true; // no inputBox so no editing - if (editor.inputBox.element.style.display == 'none') { - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "editecell", ch, editor.StatusCallback[f].params); - } - return true; // no inputBox display, so no editing - } - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - editor.inputBox.element.disabled = false; // make sure editable - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.Focus(); - editor.inputBox.SetText(ch); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (editor.inputBox.skipOne) return false; // ignore a key already handled - if (ch=="[esc]" || ch=="[enter]" || ch=="[tab]" || (ch && ch.substr(0,2)=="[a")) { - if (("(+-*/,:!&<>=^".indexOf(inputtext.slice(-1))>=0 && inputtext.slice(0,1)=="=") || - (inputtext == "=")) { - wval.partialexpr = inputtext; - } - if (wval.partialexpr) { // if in pointing operation - if (e.shiftKey && ch.substr(0,2)=="[a") { - ch = ch + "shifted"; - } - coord = editor.MoveECellWithKey(ch); - if (coord) { - if (range.hasrange) { - editor.inputBox.SetText(wval.partialexpr + SocialCalc.crToCoord(range.left, range.top) + ":" + - SocialCalc.crToCoord(range.right, range.bottom)); - } - else { - editor.inputBox.SetText(wval.partialexpr + coord); - } - return false; - } - } - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch != "[esc]") { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a") { - editor.MoveECellWithKey(ch); - } - } - else { - editor.inputBox.DisplayCellContents(); - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - break; - } - if (wval.partialexpr && ch=="[backspace]") { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - return false; - } - if (ch=="[f2]") return false; - if (range.hasrange) { - editor.RangeRemove(); - } - editor.MoveECell(wval.ecoord); - if (wval.partialexpr) { - editor.inputBox.ShowInputBox(true); // make sure it's moved back if necessary - wval.partialexpr = ""; // not pointing - } - return true; - - case "inputboxdirect": - inputtext = editor.inputBox.GetText(); // should not get here if no inputBox - if (ch=="[esc]" || ch=="[enter]" || ch=="[tab]") { - editor.inputBox.Blur(); - editor.inputBox.ShowInputBox(false); - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - if (ch == "[esc]") { - editor.inputBox.DisplayCellContents(); - } - else { - editor.EditorSaveEdit(); - if (editor.ecell.coord != wval.ecoord) { - editor.MoveECell(wval.ecoord); - } - if (ch=="[enter]") ch = "[adown]"; - if (ch=="[tab]") ch = e.shiftKey ? "[aleft]" : "[aright]"; - if (ch.substr(0,2)=="[a") { - editor.MoveECellWithKey(ch); - } - } - break; - } - if (ch=="[f2]") return false; - return true; - - case "skip-and-start": - editor.state = "start"; - editor.cellhandles.ShowCellHandles(true); - return false; - - default: - return true; - } - - return false; - - } - -SocialCalc.EditorAddToInput = function(editor, str, prefix) { - - var wval = editor.workingvalues; - - if (editor.noEdit) return; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - - switch (editor.state) { - case "start": - editor.state = "input"; - editor.inputBox.ShowInputBox(true); - editor.inputBox.element.disabled = false; // make sure editable and overwrite old - editor.inputBox.Focus(); - editor.inputBox.SetText((prefix||"")+str); - editor.inputBox.Select("end"); - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - wval.startsheet = wval.currentsheet; - wval.startsheetid = wval.currentsheetid; - editor.RangeRemove(); - break; - - case "input": - case "inputboxdirect": - editor.inputBox.element.focus(); - if (wval.partialexpr) { - editor.inputBox.SetText(wval.partialexpr); - wval.partialexpr = ""; - editor.RangeRemove(); - editor.MoveECell(wval.ecoord); - } - editor.inputBox.SetText(editor.inputBox.GetText()+str); - break; - - default: - break; - } - - } - - -SocialCalc.EditorDisplayCellContents = function(editor) { - - if (editor.inputBox) editor.inputBox.DisplayCellContents(); - - } - -SocialCalc.EditorSaveEdit = function(editor, text) { - - var result, cell, valueinfo, fch, type, value, oldvalue, cmdline; - - var sheetobj = editor.context.sheetobj; - var wval = editor.workingvalues; - - if (SocialCalc.Callbacks && SocialCalc.Callbacks.IsCellEditable) { - if (!SocialCalc.Callbacks.IsCellEditable(editor)) { - return true; - } - } - - type = "text t"; - value = typeof text == "string" ? text : editor.inputBox.GetText(); // either explicit or from input box - - oldvalue = SocialCalc.GetCellContents(sheetobj, wval.ecoord)+""; - if (value == oldvalue) { // no change - return; - } - - if (!SocialCalc.Callbacks.CheckConstraints(editor,value)) { - return true; - } - - if (SocialCalc.Callbacks.editAutoSave) { - SocialCalc.Callbacks.editAutoSave(); - } - - fch = value.charAt(0); - if (fch=="=" && value.indexOf("\n")==-1) { - type = "formula"; - value = value.substring(1); - } - else if (fch=="'") { - type = "text t"; - value = value.substring(1); - } - else if (value.length==0) { - type = "empty"; - } - else { - valueinfo = SocialCalc.DetermineValueType(value) - if (valueinfo.type=="n" && value==(valueinfo.value+"")) { // see if don't need "constant" - type = "value n"; - } - else if (valueinfo.type.charAt(0)=="t") { - type = "text "+valueinfo.type; - } - else if (valueinfo.type=="") { - type = "text t"; - } - else { - type = "constant "+valueinfo.type+" "+valueinfo.value; - } - } - - if (type.charAt(0)=="t") { // text - value = SocialCalc.encodeForSave(value); // newlines, :, and \ are escaped - } - - // if startsheet different from currentsheet, switch to start sheet - // for the save to take effect - if (SocialCalc.WorkBook && (wval.currentsheet != wval.startsheet)) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var cmdstr = "activatesheet " +wval.startsheetid; - control.ExecuteWorkBookControlCommand( { cmdtype:"wcmd", id:"0", cmdstr: cmdstr} - ,false) - } - - cmdline = "set "+wval.ecoord+" "+type+" "+value; - editor.EditorScheduleSheetCommands(cmdline, true, false); - - return; - - } - -// -// SocialCalc.EditorApplySetCommandsToRange(editor, cmd) -// -// Takes ecell or range and does a "set" command with cmd. -// - -SocialCalc.EditorApplySetCommandsToRange = function(editor, cmd) { - - var cell, row, col, line, errortext; - - var sheetobj = editor.context.sheetobj; - var ecell = editor.ecell; - var range = editor.range; - - if (range.hasrange) { - coord = SocialCalc.crToCoord(range.left, range.top)+":"+SocialCalc.crToCoord(range.right, range.bottom); - line = "set "+coord+" "+cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } - else { - line = "set "+ecell.coord+" "+cmd; - errortext = editor.EditorScheduleSheetCommands(line, true, false); - } - - editor.DisplayCellContents(); - - } - -SocialCalc.EditorProcessMouseWheel = function(event, delta, mousewheelinfo, wobj) { - - if (wobj.functionobj.editor.busy) return; // ignore if busy - - if (delta > 0) { - wobj.functionobj.editor.ScrollRelative(true, -1); - } - if (delta < 0) { - wobj.functionobj.editor.ScrollRelative(true, +1); - } - - } - -// -// GridMousePosition(editor, clientX, clientY) -// -// Returns an object with row and col numbers and coord (spans handled for coords), -// and rowheader/colheader true if in header (where coord will be undefined). -// If in colheader, will return coltoresize if on appropriate place in col header. -// Also, there is rowfooter (on right) and colfooter (on bottom). -// In row/col header/footer, returns "distance" as pixels over the edge. -// - -SocialCalc.GridMousePosition = function(editor, clientX, clientY) { - - var row, col, colpane; - var result = {}; - - for (row=1; rowclientY) { - break; - } - } - for (col=1; colclientX) { - break; - } - } - - result.row = row; - result.col = col; - - if (editor.headposition) { - if (clientX < editor.headposition.left && clientX >= editor.gridposition.left) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } - else if (clientY < editor.headposition.top && clientY > editor.gridposition.top) { // > because of sizing row - result.colheader = true; - result.distance = editor.headposition.top - clientY; - result.coltoresize = col-(editor.colpositions[col]+editor.colwidth[col]/2>clientX?1:0) || 1; - for (colpane=0; colpane= editor.context.colpanes[colpane].first && - result.coltoresize <= editor.context.colpanes[colpane].last) { // visible column - return result; - } - } - delete result.coltoresize; - return result; - } - else if (clientX >= editor.verticaltablecontrol.controlborder) { - result.rowfooter = true; - result.distance = clientX - editor.verticaltablecontrol.controlborder; - return result; - } - else if (clientY >= editor.horizontaltablecontrol.controlborder) { - result.colfooter = true; - result.distance = clientY - editor.horizontaltablecontrol.controlborder; - return result; - } - else if (clientX < editor.gridposition.left) { - result.rowheader = true; - result.distance = editor.headposition.left - clientX; - return result; - } - else if (clientY <= editor.gridposition.top) { - result.colheader = true; - result.distance = editor.headposition.top - clientY; - return result; - } - else { - result.coord = SocialCalc.crToCoord(result.col, result.row); - if (editor.context.cellskip[result.coord]) { // handle skipped cells - result.coord = editor.context.cellskip[result.coord]; - } - return result; - } - } - - return null; - - } - -// -// GetEditorCellElement(editor, row, col) -// -// Returns an object with element, the table cell element in the DOM that corresponds to row and column, -// as well as rowpane and colpane, the panes with the cell. -// If no such element, then returns null; -// - -SocialCalc.GetEditorCellElement = function(editor, row, col) { - - var rowpane, colpane, c, coord; - var rowindex = 0; - var colindex = 0; - - for (rowpane=0; rowpane= editor.context.rowpanes[rowpane].first && row <= editor.context.rowpanes[rowpane].last) { - for (colpane=0; colpane= editor.context.colpanes[colpane].first && col <= editor.context.colpanes[colpane].last) { - rowindex += row - editor.context.rowpanes[rowpane].first + 2; - for (c=editor.context.colpanes[colpane].first; c<=col; c++) { - coord=editor.context.cellskip[SocialCalc.crToCoord(c,row)]; - if (!coord || !editor.context.CoordInPane(coord, rowpane, colpane)) // don't count col-spanned cells - colindex++; - } - return { - element: editor.griddiv.firstChild.lastChild.childNodes[rowindex].childNodes[colindex], - rowpane: rowpane, colpane: colpane}; - } - for (c=editor.context.colpanes[colpane].first; c<=editor.context.colpanes[colpane].last; c++) { - coord=editor.context.cellskip[SocialCalc.crToCoord(c,row)]; - if (!coord || !editor.context.CoordInPane(coord, rowpane, colpane)) // don't count col-spanned cells - colindex++; - } - colindex += 1; - } - } - rowindex += editor.context.rowpanes[rowpane].last - editor.context.rowpanes[rowpane].first + 1 + 1; - } - - return null; -} - -// -// cellcoord = MoveECellWithKey(editor, ch) -// -// Processes an arrow key, etc., moving the edit cell. -// If not a movement key, returns null. -// - -SocialCalc.MoveECellWithKey = function(editor, ch) { - - var coord, row, col, cell; - var shifted = false; - - if (!editor.ecell) { - return null; - } - - if (ch.slice(-7)=="shifted") { - ch = ch.slice(0,-7); - shifted = true; - } - - row = editor.ecell.row; - col = editor.ecell.col; - cell = editor.context.sheetobj.cells[editor.ecell.coord]; - - switch (ch) { - case "[adown]": - row += (cell && cell.rowspan) || 1; - break; - case "[aup]": - row--; - break; - case "[pgdn]": - row += editor.pageUpDnAmount - 1 + ((cell && cell.rowspan) || 1); - break; - case "[pgup]": - row -= editor.pageUpDnAmount; - break; - case "[aright]": - col += (cell && cell.colspan) || 1; - break; - case "[aleft]": - col--; - break; - case "[home]": - row = 1; - col = 1; - break; - default: - return null; - } - - if (!editor.range.hasrange) { - if (shifted) - editor.RangeAnchor(); - } - - coord = editor.MoveECell(SocialCalc.crToCoord(col, row)); - - if (editor.range.hasrange) { - if (shifted) - editor.RangeExtend(); - else - editor.RangeRemove(); - } - - return coord; - - } - -// -// cellcoord = MoveECell(editor, newecell) -// -// Takes a coordinate and returns the new edit cell coordinate (which may be -// different if newecell is covered by a span). -// - -SocialCalc.MoveECell = function(editor, newcell) { - - var cell, f; - - var highlights = editor.context.highlights; - - if (editor.ecell) { - if (editor.ecell.coord==newcell) return newcell; // already there - don't do anything and don't tell anybody - - if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast('ecell', { original: editor.ecell.coord, ecell: newcell }); - } - - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - delete highlights[editor.ecell.coord]; - if (editor.range2.hasrange && - editor.ecell.row>=editor.range2.top && editor.ecell.row<=editor.range2.bottom && - editor.ecell.col>=editor.range2.left && editor.ecell.col<=editor.range2.right) { - highlights[editor.ecell.coord] = "range2"; - } - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders(""); // set to regular col/rowname styles - editor.cellhandles.ShowCellHandles(false); - } - else if (SocialCalc.Callbacks.broadcast) { - SocialCalc.Callbacks.broadcast('ecell', { ecell: newcell }); - } - newcell = editor.context.cellskip[newcell] || newcell; - editor.ecell = SocialCalc.coordToCr(newcell); - editor.ecell.coord = newcell; - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - highlights[newcell] = "cursor"; - - for (f in editor.MoveECellCallback) { // let others know - editor.MoveECellCallback[f](editor); - } - - editor.UpdateCellCSS(cell, editor.ecell.row, editor.ecell.col); - editor.SetECellHeaders("selected"); - - for (f in editor.StatusCallback) { // let status line, etc., know - editor.StatusCallback[f].func(editor, "moveecell", newcell, editor.StatusCallback[f].params); - } - - if (editor.busy) { - editor.ensureecell = true; // wait for when not busy - } - else { - editor.ensureecell = false; - editor.EnsureECellVisible(); - } - - return newcell; - - } - -SocialCalc.EnsureECellVisible = function(editor) { - - var vamount = 0; - var hamount = 0; - - if (editor.ecell.row > editor.lastnonscrollingrow) { - if (editor.ecell.row < editor.firstscrollingrow) { - vamount = editor.ecell.row - editor.firstscrollingrow; - } - else if (editor.ecell.row > editor.lastvisiblerow) { - vamount = editor.ecell.row - editor.lastvisiblerow; - } - } - if (editor.ecell.col > editor.lastnonscrollingcol) { - if (editor.ecell.col < editor.firstscrollingcol) { - hamount = editor.ecell.col - editor.firstscrollingcol; - } - else if (editor.ecell.col > editor.lastvisiblecol) { - hamount = editor.ecell.col- editor.lastvisiblecol; - } - } - - if (vamount!=0 || hamount!=0) { - editor.ScrollRelativeBoth(vamount, hamount); - } - else { - editor.cellhandles.ShowCellHandles(true); - } - - } - -SocialCalc.ReplaceCell = function(editor, cell, row, col) { - - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell(row, col, cell.rowpane, cell.colpane, true, null); - if (newelement) { - // Don't use a real element and replaceChild, which seems to have focus issues with IE, Firefox, and speed issues - cell.element.innerHTML = newelement.innerHTML; - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a]!="cssText") - cell.element.style[a] = newelement.style[a]; - } - } - } - - -SocialCalc.UpdateCellCSS = function(editor, cell, row, col) { - - var newelement, a; - if (!cell) return; - newelement = editor.context.RenderCell(row, col, cell.rowpane, cell.colpane, true, null); - if (newelement) { - cell.element.style.cssText = ""; - cell.element.className = newelement.className; - for (a in newelement.style) { - if (newelement.style[a]!="cssText") - cell.element.style[a] = newelement.style[a]; - } - } - } - - -SocialCalc.SetECellHeaders = function(editor, selected) { - - var ecell = editor.ecell; - var context = editor.context; - - var rowpane, colpane, first, last; - var rowindex = 0; - var colindex = 0; - var headercell; - - if (!ecell) return; - - for (rowpane=0; rowpane= first && ecell.row <= last) { - headercell = editor.fullgrid.childNodes[1].childNodes[2+rowindex+ecell.row-first].childNodes[0]; - if (headercell) { - if (context.classnames) headercell.className=context.classnames[selected+"rowname"]; - if (context.explicitStyles) headercell.style.cssText=context.explicitStyles[selected+"rowname"]; - headercell.style.verticalAlign="top"; // to get around Safari making top of centered row number be - // considered top of row (and can't get position in Safari) - } - } - rowindex += last - first + 1 + 1; - } - - for (colpane=0; colpane= first && ecell.col <= last) { - headercell = editor.fullgrid.childNodes[1].childNodes[1].childNodes[1+colindex+ecell.col-first]; - if (headercell) { - if (context.classnames) headercell.className=context.classnames[selected+"colname"]; - if (context.explicitStyles) headercell.style.cssText=context.explicitStyles[selected+"colname"]; - } - } - colindex += last - first + 1 + 1; - } - } - -// -// RangeAnchor(editor, ecoord) -// -// Sets the anchor of a range to ecoord (or ecell if missing). -// - -SocialCalc.RangeAnchor = function(editor, ecoord) { - - if (editor.range.hasrange) { - editor.RangeRemove(); - } - - editor.RangeExtend(ecoord); - - } - -// -// RangeExtend(editor, ecoord) -// -// Sets the other corner of the range to ecoord or, if missing, ecell. -// - -SocialCalc.RangeExtend = function(editor, ecoord) { - - var a, cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - var ecell; - if (ecoord) { - ecell = SocialCalc.coordToCr(ecoord); - ecell.coord = ecoord; - } - else ecell = editor.ecell; - - if (!ecell) return; // just in case - - if (!range.hasrange) { // called without RangeAnchor... - range.anchorcoord = ecell.coord; - range.anchorrow = ecell.row; - range.top = ecell.row; - range.bottom = ecell.row; - range.anchorcol = ecell.col; - range.left = ecell.col; - range.right = ecell.col; - range.hasrange = true; - } - - if (range.anchorrow < ecell.row) { - range.top = range.anchorrow; - range.bottom = ecell.row; - } - else { - range.top = ecell.row; - range.bottom = range.anchorrow; - } - if (range.anchorcol < ecell.col) { - range.left = range.anchorcol; - range.right = ecell.col; - } - else { - range.left = ecell.col; - range.right = range.anchorcol; - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - highlights[coord] = "unrange"; - break; - case "range2": - highlights[coord] = "unrange2"; - break; - } - } - - for (row=range.top; row<=range.bottom; row++) { - for (col=range.left; col<=range.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange": - highlights[coord] = "range"; - break; - case "cursor": - break; - case "unrange2": - default: - highlights[coord] = "newrange"; - break; - } - } - } - - for (row=range2.top; range2.hasrange && row<=range2.bottom; row++) { - for (col=range2.left; col<=range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "unrange2": - highlights[coord] = "range2"; - break; - case "range": - case "newrange": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - - switch (highlights[coord]) { - case "unrange": - delete highlights[coord]; - break; - case "newrange": - highlights[coord] = "range"; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "range": - case "range2": - case "cursor": - continue; - } - - cr = SocialCalc.coordToCr(coord); - cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - - } - - for (f in editor.RangeChangeCallback) { // let others know - editor.RangeChangeCallback[f](editor); - } - - // create range/coord string and do status callback - - coord = SocialCalc.crToCoord(editor.range.left, editor.range.top); - if (editor.range.left!=editor.range.right || editor.range.top!=editor.range.bottom) { // more than one cell - coord += ":" + SocialCalc.crToCoord(editor.range.right, editor.range.bottom); - } - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "rangechange", coord, editor.StatusCallback[f].params); - } - - return; - - } - -// -// RangeRemove(editor) -// -// Turns off the range. -// - -SocialCalc.RangeRemove = function(editor) { - - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range = editor.range; - var range2 = editor.range2; - - if (!range.hasrange && !range2.hasrange) return; - - for (row=range2.top; range2.hasrange && row<=range2.bottom; row++) { - for (col=range2.left; col<=range2.right; col++) { - coord = SocialCalc.crToCoord(col, row); - switch (highlights[coord]) { - case "range": - highlights[coord] = "newrange2"; - break; - case "range2": - case "cursor": - break; - default: - highlights[coord] = "newrange2"; - break; - } - } - } - - for (coord in highlights) { - switch (highlights[coord]) { - case "range": - delete highlights[coord]; - break; - case "newrange2": - highlights[coord] = "range2"; - break; - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell=SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range.hasrange = false; - - for (f in editor.RangeChangeCallback) { // let others know - editor.RangeChangeCallback[f](editor); - } - - for (f in editor.StatusCallback) { - editor.StatusCallback[f].func(editor, "rangechange", "", editor.StatusCallback[f].params); - } - - return; - - } - -// -// Range2Remove(editor) -// -// Turns off the range2. -// - -SocialCalc.Range2Remove = function(editor) { - - var cell, cr, coord, row, col, f; - - var highlights = editor.context.highlights; - var range2 = editor.range2; - - if (!range2.hasrange) return; - - for (coord in highlights) { - switch (highlights[coord]) { - case "range2": - delete highlights[coord]; - break; - case "range": - case "cursor": - continue; - } - cr = SocialCalc.coordToCr(coord); - cell=SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - editor.UpdateCellCSS(cell, cr.row, cr.col); - } - - range2.hasrange = false; - - return; - - } - -// -// FitToEditTable(editor) -// -// Figure out (through column width declarations and approximation of pixels per row) -// how many rendered rows and columns you need to be at least a little larger than -// the editor's editing area. -// - -SocialCalc.FitToEditTable = function(editor) { - - var colnum, colname, colwidth, totalwidth, totalrows, rowpane, needed; - - var context=editor.context; - var sheetobj=context.sheetobj; - var sheetcolattribs=sheetobj.colattribs; - - // Calculate column width data - - totalwidth=context.showRCHeaders ? context.rownamewidth-0 : 0; - for (colpane=0; colpane0)) ? (colwidth-0) : 10; - } - } - - for (colnum=context.colpanes[colpane].first; colnum<=10000; colnum++) { //!!! max for safety, but makes that col max!!! - colname=SocialCalc.rcColname(colnum); - colwidth = sheetobj.colattribs.width[colname] || sheetobj.attribs.defaultcolwidth || SocialCalc.Constants.defaultColWidth; - if (colwidth=="blank" || colwidth=="auto") colwidth=""; - totalwidth+=(colwidth && ((colwidth-0)>0)) ? (colwidth-0) : 10; - if (totalwidth > editor.tablewidth) break; - } - - context.colpanes[colpane].last = colnum; - - // Calculate row height data - - totalrows=context.showRCHeaders ? 1 : 0; - for (rowpane=0; rowpaneeditor.gridposition.top+editor.tableheight) break; - } - editor.lastvisiblerow = i-1; - - editor.colpositions = []; - for (colpane=0; colpaneeditor.gridposition.left+editor.tablewidth) break; - } - editor.lastvisiblecol = i-1; - - editor.firstscrollingrow = editor.context.rowpanes[editor.context.rowpanes.length-1].first; - editor.firstscrollingrowtop = editor.rowpositions[editor.firstscrollingrow] || editor.headposition.top; - editor.lastnonscrollingrow = editor.context.rowpanes.length-1 > 0 ? - editor.context.rowpanes[editor.context.rowpanes.length-2].last : 0; - editor.firstscrollingcol = editor.context.colpanes[editor.context.colpanes.length-1].first; - editor.firstscrollingcolleft = editor.colpositions[editor.firstscrollingcol] || editor.headposition.left; - editor.lastnonscrollingcol = editor.context.colpanes.length-1 > 0 ? - editor.context.colpanes[editor.context.colpanes.length-2].last : 0; - - // Now do the table controls - - editor.verticaltablecontrol.ComputeTableControlPositions(); - editor.horizontaltablecontrol.ComputeTableControlPositions(); - } - -// -// ScheduleRender(editor) -// -// Do a series of timeouts to render the sheet, wait for background layout and -// rendering by the browser, and then update editor visuals, sliders, etc. -// - -SocialCalc.ScheduleRender = function(editor) { - - if (editor.timeout) window.clearTimeout(editor.timeout); // in case called more than once, just use latest - - SocialCalc.EditorSheetStatusCallback(null, "schedrender", null, editor); - SocialCalc.EditorStepInfo.editor = editor; - editor.timeout = window.setTimeout(SocialCalc.DoRenderStep, 1); - - } - -// DoRenderStep() -// - -SocialCalc.DoRenderStep = function() { - - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - editor.EditorRenderSheet(); - - SocialCalc.EditorSheetStatusCallback(null, "renderdone", null, editor); - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - - } - -// -// SocialCalc.SchedulePositionCalculations(editor) -// - -SocialCalc.SchedulePositionCalculations = function(editor) { - - SocialCalc.EditorStepInfo.editor = editor; - - SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor); - - editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1); - - } - -// DoPositionCalculations(editor) -// -// Update editor visuals, sliders, etc. -// -// Note: Only call this after the DOM objects have been modified and rendered! -// - -SocialCalc.DoPositionCalculations = function() { - - var editor = SocialCalc.EditorStepInfo.editor; - - editor.timeout = null; - - var ok = false; - try { - editor.CalculateEditorPositions(); - ok = true; - } catch (e) {} - - if (!ok) { - if (typeof $ != 'undefined') { - $(window).trigger('resize'); - setTimeout( SocialCalc.DoPositionCalculations, 400); - } - return; /* Workaround IE6 partial-initialized-DOM bug */ - } - - editor.verticaltablecontrol.PositionTableControlElements(); - editor.horizontaltablecontrol.PositionTableControlElements(); - - SocialCalc.EditorSheetStatusCallback(null, "doneposcalc", null, editor); - - if (editor.ensureecell && editor.ecell && !editor.deferredCommands.length) { // don't do if deferred cmd to execute - editor.ensureecell = false; - editor.EnsureECellVisible(); // this could cause another redisplay - } - - editor.cellhandles.ShowCellHandles(true); - - -//!!! Need to now check to see if this positioned controls out of the editing area -//!!! (such as when there is a large wrapped cell and it pushes the pane boundary too far down). - - if (SocialCalc.Callbacks.broadcast) SocialCalc.Callbacks.broadcast('ask.ecell'); - } - -SocialCalc.CalculateRowPositions = function(editor, panenum, positions, sizes) { - - var toprow, rowpane, rownum, offset, trowobj, cellposition; - - var context=editor.context; - var sheetobj=context.sheetobj; - - var tbodyobj; - - if (!context.showRCHeaders) throw("Needs showRCHeaders=true"); - - tbodyobj=editor.fullgrid.lastChild; - - // Calculate start of this pane as row in this table: - - toprow = 2; - for (rowpane=0; rowpane1 ? context.rowpanes[vplen-2].last+1 : 1; // don't scroll past here - if (context.rowpanes[vplen-1].first+vamount < vlimit) { // limit amount - vamount = (-context.rowpanes[vplen-1].first) + vlimit; - } - - var hplen=context.colpanes.length; - var hlimit = hplen>1 ? context.colpanes[hplen-2].last+1 : 1; // don't scroll past here - if (context.colpanes[hplen-1].first+hamount < hlimit) { // limit amount - hamount = (-context.colpanes[hplen-1].first) + hlimit; - } - - if ((vamount==1 || vamount==-1) && hamount==0) { // special case quick scrolls - if (vamount==1) { - editor.ScrollTableUpOneRow(); - } - else { - editor.ScrollTableDownOneRow(); - } - if (editor.ecell) editor.SetECellHeaders("selected"); - editor.SchedulePositionCalculations(); - return; - } - - // Do a gross move and render - - if (vamount!=0 || hamount!=0) { - context.rowpanes[vplen-1].first += vamount; - context.rowpanes[vplen-1].last += vamount; - context.colpanes[hplen-1].first += hamount; - context.colpanes[hplen-1].last += hamount; - editor.FitToEditTable(); - editor.ScheduleRender(); - } - - } - - -// PageRelative(editor, vertical, direction) -// -// If vertical true, pages up(direction is -)/down(+), else left(-)/right(+) - -SocialCalc.PageRelative = function(editor, vertical, direction) { - - var context=editor.context; - var panes=vertical ? "rowpanes" : "colpanes"; - var lastpane=context[panes][context[panes].length-1]; - var lastvisible=vertical ? "lastvisiblerow" : "lastvisiblecol"; - var sizearray=vertical ? editor.rowheight : editor.colwidth; - var defaultsize=vertical ? SocialCalc.Constants.defaultAssumedRowHeight : SocialCalc.Constants.defaultColWidth; - var size, newfirst, totalsize, current; - - if (direction > 0) { // down/right - newfirst = editor[lastvisible]; - if (newfirst == lastpane.first) newfirst += 1; // move at least one - } - else { - if (vertical) { // calculate amount to scroll - totalsize = editor.tableheight - (editor.firstscrollingrowtop - editor.gridposition.top); - } - else { - totalsize = editor.tablewidth - (editor.firstscrollingcolleft - editor.gridposition.left); - } - totalsize -= sizearray[editor[lastvisible]] > 0 ? sizearray[editor[lastvisible]] : defaultsize; - - for (newfirst=lastpane.first-1; newfirst>0; newfirst--) { - size = sizearray[newfirst] > 0 ? sizearray[newfirst] : defaultsize; - if (totalsize < size) break; - totalsize -= size; - } - - current = lastpane.first; - if (newfirst >= current) newfirst = current-1; // move at least 1 - if (newfirst < 1) newfirst = 1; - } - - lastpane.first = newfirst; - lastpane.last = newfirst+1; - editor.LimitLastPanes(); - editor.FitToEditTable(); - editor.ScheduleRender(); - - } - -// LimitLastPanes(editor) -// -// Makes sure that the "first" of the last panes isn't before the last of the previous pane -// - -SocialCalc.LimitLastPanes = function(editor) { - - var context=editor.context; - var plen; - - plen = context.rowpanes.length; - if (plen>1 && context.rowpanes[plen-1].first <= context.rowpanes[plen-2].last) - context.rowpanes[plen-1].first = context.rowpanes[plen-2].last+1; - - plen = context.colpanes.length; - if (plen>1 && context.colpanes[plen-1].first <= context.colpanes[plen-2].last) - context.colpanes[plen-1].first = context.colpanes[plen-2].last+1; - - } - -SocialCalc.ScrollTableUpOneRow = function(editor) { - - var toprow, rowpane, rownum, colnum, colpane, cell, oldrownum, maxspan, newbottomrow, newrow, oldchild, bottomrownum; - var rowneedsrefresh={}; - - var context=editor.context; - var sheetobj=context.sheetobj; - var tableobj=editor.fullgrid; - - var tbodyobj; - - tbodyobj=tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane=0; rowpanemaxrowspan) maxrowspan=cell.rowspan; - } - } - - if (maxrowspan>1) { - for (rownum=1; rownum= context.rowpanes[rowpane].last) break; - newrow=context.RenderRow(rownum+oldrownum, rowpane); - oldchild=tbodyobj.childNodes[toprow+rownum-1]; - tbodyobj.replaceChild(newrow,oldchild); - } - } - - // if added a row that includes rowspans from above, update the size of those to include new row - - bottomrownum=context.rowpanes[rowpane].last; - - for (colpane=0; colpane1) rowneedsrefresh[rownum]=true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow=context.RenderRow(rownum, rowpane); - oldchild=tbodyobj.childNodes[(toprow+(rownum-context.rowpanes[rowpane].first))]; - tbodyobj.replaceChild(newrow,oldchild); - } - - return tableobj; - } - -SocialCalc.ScrollTableDownOneRow = function(editor) { - - var toprow, rowpane, rownum, colnum, colpane, cell, newrownum, maxspan, newbottomrow, newrow, oldchild, bottomrownum; - var rowneedsrefresh={}; - - var context=editor.context; - var sheetobj=context.sheetobj; - var tableobj=editor.fullgrid; - - var tbodyobj; - - tbodyobj=tableobj.lastChild; - - toprow = context.showRCHeaders ? 2 : 1; - for (rowpane=0; rowpanemaxrowspan) maxrowspan=cell.rowspan; - } - } - - if (maxrowspan>1) { - for (rownum=1; rownum context.rowpanes[rowpane].last) break; - newrow=context.RenderRow(rownum+newrownum, rowpane); - oldchild=tbodyobj.childNodes[toprow+rownum]; - tbodyobj.replaceChild(newrow,oldchild); - } - } - - // if last row now includes rowspans or rowspans from above, update the size of those to remove deleted row - - bottomrownum=context.rowpanes[rowpane].last; - - for (colpane=0; colpane1) { - rowneedsrefresh[bottomrownum]=true; // need to update this row - continue; - } - coord=context.cellskip[SocialCalc.crToCoord(colnum, bottomrownum)]; - if (!coord) continue; // only look at spanned cells - rownum=context.coordToCR[coord].row-0; - if (rownum==bottomrownum || - rownum1) rowneedsrefresh[rownum]=true; // remember row num to update - } - } - - for (rownum in rowneedsrefresh) { - newrow=context.RenderRow(rownum, rowpane); - oldchild=tbodyobj.childNodes[(toprow+(rownum-context.rowpanes[rowpane].first))]; - tbodyobj.replaceChild(newrow,oldchild); - } - - return tableobj; - } - - -// ************************************* -// -// InputBox class: -// -// This class deals with the text box for editing cell contents. -// It mainly controls a user input box for typed content and is used to interact with -// the keyboard code, etc. -// -// You can use this inside a formula bar control of some sort. -// You create this after you have created a table editor object (but not necessarily -// done the CreateTableEditor method). -// -// When the user starts typing text, or double-clicks on a cell, this object -// comes into play. -// -// The element given when this is first constructed should be an input HTMLElement or -// something that acts like one. Check the code here to see what is done to it. -// -// ************************************* - -SocialCalc.InputBox = function(element, editor) { - - if (!element) return; // invoked without enough data to work - - this.element = element; // the input element associated with this InputBox - this.editor = editor; // the TableEditor this belongs to - this.inputEcho = null; - - editor.inputBox = this; - - element.onmousedown = SocialCalc.InputBoxOnMouseDown; - - editor.MoveECellCallback.formulabar = function(e){ - if (e.state!="start") return; // if not in normal keyboard mode don't replace formula bar - editor.inputBox.DisplayCellContents(e.ecell.coord); - }; - } - - -// Methods: - -SocialCalc.InputBox.prototype.DisplayCellContents = function(coord) {SocialCalc.InputBoxDisplayCellContents(this, coord);}; -SocialCalc.InputBox.prototype.ShowInputBox = function(show) {this.editor.inputEcho.ShowInputEcho(show);}; -SocialCalc.InputBox.prototype.GetText = function() {return this.element.value;}; -SocialCalc.InputBox.prototype.SetText = function(newtext) { - if (!this.element) return; - this.element.value=newtext; - if (!SocialCalc.HasTouch) { - this.editor.inputEcho.SetText(newtext+"_"); - } else { - this.editor.inputEcho.SetText(newtext); - } -}; -SocialCalc.InputBox.prototype.Focus = function() {SocialCalc.InputBoxFocus(this);}; -SocialCalc.InputBox.prototype.Blur = function() {return this.element.blur();}; -SocialCalc.InputBox.prototype.Select = function(t) { - if (!this.element) return; - switch (t) { - case "end": - if (document.selection && document.selection.createRange) { - /* IE 4+ - Safer than setting .selectionEnd as it also works for Textareas. */ - var range = document.selection.createRange().duplicate(); - range.moveToElementText(this.element); - range.collapse(false); - range.select(); - } else if (this.element.selectionStart!=undefined) { - this.element.selectionStart=this.element.value.length; - this.element.selectionEnd=this.element.value.length; - } - break; - } - }; - -// Functions: - -// -// SocialCalc.InputBoxDisplayCellContents(inputbox, coord) -// -// Sets input box to the contents of the specified cell (or ecell if null). -// - -SocialCalc.InputBoxDisplayCellContents = function(inputbox, coord) { - - var scc = SocialCalc.Constants; - - if (!inputbox) return; - if (!coord) coord = inputbox.editor.ecell.coord; - var text = SocialCalc.GetCellContents(inputbox.editor.context.sheetobj, coord); - if (text.indexOf("\n")!=-1) { - text = scc.s_inputboxdisplaymultilinetext; - inputbox.element.disabled = true; - } - else { - inputbox.element.disabled = false; - } - inputbox.SetText(text); - - } - -// -// SocialCalc.InputBoxFocus(inputbox) -// -// Call this to have the input box get the focus and respond to keystrokes -// but still pass them off to SocialCalc.ProcessKey. -// - -SocialCalc.InputBoxFocus = function(inputbox) { - - if (!inputbox) return; - inputbox.element.focus(); - var editor = inputbox.editor; - editor.state = "input"; - var wval = editor.workingvalues; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - - }; - -// -// SocialCalc.InputBoxOnMouseDown(e) -// -// This is called when the input box gets the focus. It then responds to keystrokes -// and pass them off to SocialCalc.ProcessKey, but in a different editing state. -// - -SocialCalc.InputBoxOnMouseDown = function(e) { - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var wval = editor.workingvalues; - - switch (editor.state) { - case "start": - editor.state="inputboxdirect"; - wval.partialexpr = ""; - wval.ecoord = editor.ecell.coord; - wval.erow = editor.ecell.row; - wval.ecol = editor.ecell.col; - editor.inputEcho.ShowInputEcho(true); - break; - - case "input": - wval.partialexpr = ""; // make sure not pointing - editor.MoveECell(wval.ecoord); - editor.state="inputboxdirect"; - SocialCalc.KeyboardFocus(); // may have come here from outside of grid - break; - - case "inputboxdirect": - break; - } - } - - -// ************************************* -// -// InputEcho class: -// -// This object creates and controls an element that echos what's in the InputBox during editing -// It is draggable. -// -// ************************************* - -SocialCalc.InputEcho = function(editor) { - - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - this.text = ""; // current value of what is displayed - this.interval = null; // timer handle - - this.container = null; // element containing main echo as well as prompt line - this.main = null; // main echo area - this.prompt = null; - - this.functionbox = null; // function chooser dialog - - this.container = document.createElement("div"); - SocialCalc.setStyles(this.container, "display:none;position:absolute;zIndex:10;"); - - this.topprompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) this.topprompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) SocialCalc.setStyles(this.topprompt, scc.defaultInputEchoPromptStyle); - this.topprompt.innerHTML = ""; - - this.container.appendChild(this.topprompt); - - - this.main = document.createElement("div"); - if (SocialCalc.HasTouch) { - this.maininput = document.createElement("input"); - } - if (scc.defaultInputEchoClass) this.main.className = scc.defaultInputEchoClass; - if (scc.defaultInputEchoStyle) SocialCalc.setStyles(this.main, scc.defaultInputEchoStyle); - if (SocialCalc.HasTouch) { - this.main.appendChild(this.maininput); - } else { - this.main.innerHTML = " "; - } - - - this.container.appendChild(this.main); - - this.prompt = document.createElement("div"); - if (scc.defaultInputEchoPromptClass) this.prompt.className = scc.defaultInputEchoPromptClass; - if (scc.defaultInputEchoPromptStyle) SocialCalc.setStyles(this.prompt, scc.defaultInputEchoPromptStyle); - this.prompt.innerHTML = ""; - - this.container.appendChild(this.prompt); - - SocialCalc.DragRegister(this.main, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: this.container}); - - editor.toplevel.appendChild(this.container); - - } - -// Methods: - -SocialCalc.InputEcho.prototype.ShowInputEcho = function(show) {return SocialCalc.ShowInputEcho(this, show);}; -SocialCalc.InputEcho.prototype.SetText = function(str) {return SocialCalc.SetInputEchoText(this, str);}; - -// Functions: - -SocialCalc.ShowInputEcho = function(inputecho, show) { - - var cell, position; - var editor = inputecho.editor; - - if (!editor) return; - - if (show) { - editor.cellhandles.ShowCellHandles(false); - cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col); - if (cell) { - position = SocialCalc.GetElementPosition(cell.element); - inputecho.container.style.left = (position.left-1)+"px"; - inputecho.container.style.top = (position.top-1)+"px"; - } - inputecho.container.style.display = "block"; - if (inputecho.interval) window.clearInterval(inputecho.interval); // just in case - inputecho.interval = window.setInterval(SocialCalc.InputEchoHeartbeat, 50); - if (SocialCalc.HasTouch) { - inputecho.maininput.focus(); - } - } - else { - if (inputecho.interval) window.clearInterval(inputecho.interval); - inputecho.container.style.display = "none"; - inputecho.topprompt.innerHTML = ""; - if (SocialCalc.HasTouch) { - inputecho.maininput.blur(); - inputecho.maininput.value = ""; - } - } - -} - -SocialCalc.SetInputEchoText = function(inputecho, str) { - - var scc = SocialCalc.Constants; - var fname, fstr; - var newstr = SocialCalc.special_chars(str); - newstr = newstr.replace(/\n/g,"
    "); - - if (!SocialCalc.HasTouch) { - if (inputecho.text != newstr) { - inputecho.main.innerHTML = newstr; - inputecho.text = newstr; - } - } else { - if (inputecho.maininput.value != newstr) { - inputecho.maininput.value = newstr; - } - } - - var parts = str.match(/.*[\+\-\*\/\&\^\<\>\=\,\(]([A-Za-z][A-ZA-z]\w*?)\([^\)]*$/); - if (str.charAt(0)=="=" && parts) { - fname = parts[1].toUpperCase(); - if (SocialCalc.Formula.FunctionList[fname]) { - SocialCalc.Formula.FillFunctionInfo(); // make sure filled - fstr = SocialCalc.special_chars(fname+"("+SocialCalc.Formula.FunctionArgString(fname)+")"); - } - else { - fstr = scc.ietUnknownFunction+fname; - } - if (inputecho.prompt.innerHTML != fstr) { - inputecho.prompt.innerHTML = fstr; - inputecho.prompt.style.display = "block"; - } - } - else if (inputecho.prompt.style.display != "none") { - inputecho.prompt.innerHTML = ""; - inputecho.prompt.style.display = "none"; - } - - var editor = inputecho.editor; - - - if (editor.workingvalues.currentsheet != - editor.workingvalues.startsheet) { - - var promptstr = "Editing:"+editor.workingvalues.startsheet+"!"+editor.workingvalues.ecoord; - if (promptstr != inputecho.topprompt.innerHTML) { - inputecho.topprompt.innerHTML = "Editing:"+editor.workingvalues.startsheet+"!"+editor.workingvalues.ecoord; - inputecho.topprompt.style.display = "block"; - } - } else { - if (inputecho.topprompt.style.display != "none") { - inputecho.topprompt.innerHTML = ""; - inputecho.topprompt.style.display = "none"; - } - } -} - -SocialCalc.InputEchoHeartbeat = function() { - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (! SocialCalc.HasTouch || editor.state == "inputboxdirect") { - editor.inputEcho.SetText(editor.inputBox.GetText()+"_"); - } else { - editor.inputBox.element.value = editor.inputEcho.maininput.value; - } - -} - -SocialCalc.InputEchoMouseDown = function(e) { - var event = e || window.event; - - var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - -// if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 -// else event.cancelBubble = true; // IE 5+ -// if (event.preventDefault) event.preventDefault(); // DOM Level 2 -// else event.returnValue = false; // IE 5+ - - editor.inputBox.element.focus(); - -// return false; - }; - - -// ************************************* -// -// CellHandles class: -// -// This object creates and controls the elements around the cursor cell for dragging, etc. -// -// ************************************* - -SocialCalc.CellHandles = function(editor) { - - var scc = SocialCalc.Constants; - var functions; - - if (editor.noEdit) return; // leave us with nothing - - this.editor = editor; // the TableEditor this belongs to - - this.noCursorSuffix = false; - - this.movedmouse = false; // used to detect no-op - - this.draghandle = document.createElement("div"); - SocialCalc.setStyles(this.draghandle, "display:none;position:absolute;zIndex:8;border:1px solid white;width:4px;height:4px;fontSize:1px;backgroundColor:#0E93D8;cursor:default;"); - this.draghandle.innerHTML = ' '; - editor.toplevel.appendChild(this.draghandle); - SocialCalc.AssignID(editor, this.draghandle, "draghandle"); - - var imagetype = "png"; - if (navigator.userAgent.match(/MSIE 6\.0/)) { - imagetype = "gif"; - } - - this.dragpalette = document.createElement("div"); - SocialCalc.setStyles(this.dragpalette, "display:none;position:absolute;zIndex:8;width:90px;height:90px;fontSize:1px;textAlign:center;cursor:default;"+ - "backgroundImage:url("+SocialCalc.Constants.defaultImagePrefix+"drag-handles."+imagetype+");"); - this.dragpalette.innerHTML = ' '; - editor.toplevel.appendChild(this.dragpalette); - SocialCalc.AssignID(editor, this.dragpalette, "dragpalette"); - - this.dragtooltip = document.createElement("div"); - SocialCalc.setStyles(this.dragtooltip, "display:none;position:absolute;zIndex:9;border:1px solid black;width:100px;height:auto;fontSize:10px;backgroundColor:#FFFFFF;"); - this.dragtooltip.innerHTML = ' '; - editor.toplevel.appendChild(this.dragtooltip); - SocialCalc.AssignID(editor, this.dragtooltip, "dragtooltip"); - - this.fillinghandle = document.createElement("div"); - SocialCalc.setStyles(this.fillinghandle, "display:none;position:absolute;zIndex:9;border:1px solid black;width:auto;height:14px;fontSize:10px;backgroundColor:#FFFFFF;"); - this.fillinghandle.innerHTML = ' '; - editor.toplevel.appendChild(this.fillinghandle); - SocialCalc.AssignID(editor, this.fillinghandle, "fillinghandle"); - - if (this.draghandle.addEventListener) { // DOM Level 2 -- Firefox, et al - this.draghandle.addEventListener("mousemove", SocialCalc.CellHandlesMouseMoveOnHandle, false); - this.dragpalette.addEventListener("mousedown", SocialCalc.CellHandlesMouseDown, false); - this.dragpalette.addEventListener("mousemove", SocialCalc.CellHandlesMouseMoveOnHandle, false); - } - else if (this.draghandle.attachEvent) { // IE 5+ - this.draghandle.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMoveOnHandle); - this.dragpalette.attachEvent("onmousedown", SocialCalc.CellHandlesMouseDown); - this.dragpalette.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMoveOnHandle); - } - else { // don't handle this - throw "Browser not supported"; - } - - } - -// Methods: - -SocialCalc.CellHandles.prototype.ShowCellHandles = function(show, moveshow) {return SocialCalc.ShowCellHandles(this, show, moveshow);}; - -// Functions: - -SocialCalc.ShowCellHandles = function(cellhandles, show, moveshow) { - - var cell, cell2, position, position2; - var editor = cellhandles.editor; - var doshow = false; - var row, col, viewport; - - if (!editor) return; - - do { // a block that can you can "break" out of easily - - if (!show) break; - - row = editor.ecell.row; - col = editor.ecell.col; - - if (editor.state != "start") break; - if (row >= editor.lastvisiblerow) break; - if (col >= editor.lastvisiblecol) break; - if (row < editor.firstscrollingrow) break; - if (col < editor.firstscrollingcol) break; - - if (editor.rowpositions[row+1]+20>editor.horizontaltablecontrol.controlborder) { - break; - } - if (editor.rowpositions[row+1]-10editor.verticaltablecontrol.controlborder) { - break; - } - if (editor.colpositions[col+1]-30= left && x < left+width/2 && y >= top && y < top+height/2) { // upper left - if (len <= segtable[0]) v = -1; - else if (len <= segtable[1]) v = 1; - } - if (x >= left+width/2 && x < left+width && y >= top && y < top+height/2) { // upper right - if (len <= segtable[0]) v = -2; - else if (len <= segtable[1]) v = 2; - } - if (x >= left+width/2 && x < left+width && y >= top+height/2 && y < top+height) { // bottom right - if (len <= segtable[0]) v = -3; - else if (len <= segtable[1]) v = 3; - } - if (x >= left && x < left+width/2 && y >= top+height/2 && y < top+height) { // bottom right - if (len <= segtable[0]) v = -4; - else if (len <= segtable[1]) v = 4; - } - return v; - } - - while (true) { - if (x >= left && x < left+width/2 && y >= top && y < top+height/2) { // upper left - quadrant += "1"; - v = table[0]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - height = height/2; - continue; - } - if (x >= left+width/2 && x < left+width && y >= top && y < top+height/2) { // upper right - quadrant += "2"; - v = table[1]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - left = left+width; - height = height/2; - continue; - } - if (x >= left+width/2 && x < left+width && y >= top+height/2 && y < top+height) { // bottom right - quadrant += "3"; - v = table[2]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - left = left + width; - height = height/2; - top = top + height; - continue; - } - if (x >= left && x < left+width/2 && y >= top+height/2 && y < top+height) { // bottom right - quadrant += "4"; - v = table[3]; - if (typeof v == "number") { - break; - } - table = v; - width = width/2; - height = height/2; - top = top + height; - continue; - } - return 0; // didn't match - } - -//addmsg((x-divWithMouseHit.offsetLeft)+","+(y-divWithMouseHit.offsetTop)+"="+quadrant+" "+v); - return v; - -} - -SocialCalc.CellHandlesHoverTimeout = function() { - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.timer) { - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - editor.cellhandles.ShowCellHandles(true, false); // hide move handles - -} - -SocialCalc.CellHandlesTooltipsTimeout = function() { - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - var cellhandles = editor.cellhandles; - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - - var whichhandle = cellhandles.tooltipswhichhandle; - if (whichhandle==0) { // off of active part of palette - SocialCalc.CellHandlesHoverTimeout(); - return; - } - if (whichhandle==-3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillAllTooltip; - } - else if (whichhandle==3) { - cellhandles.dragtooltip.innerHTML = scc.s_CHfillContentsTooltip; - } - else if (whichhandle==-2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteAllTooltip; - } - else if (whichhandle==-4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertAllTooltip; - } - else if (whichhandle==2) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmovePasteContentsTooltip; - } - else if (whichhandle==4) { - cellhandles.dragtooltip.innerHTML = scc.s_CHmoveInsertContentsTooltip; - } - else { - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - return; - } - - cellhandles.dragtooltip.style.display = "block"; - -} - -SocialCalc.CellHandlesMouseDown = function(e) { - - var scc = SocialCalc.Constants; - var editor, result, coord, textarea, wval, range; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - - editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff - if (!editor) return true; // we're not handling it -- let browser do default - - if (editor.busy) return; // don't do anything when busy (is this correct?) - - var cellhandles = editor.cellhandles; - - cellhandles.movedmouse = false; // detect no-op - - if (cellhandles.timer) { // cancel timer - window.clearTimeout(cellhandles.timer); - cellhandles.timer = null; - } - if (cellhandles.tooltipstimer) { - window.clearTimeout(cellhandles.tooltipstimer); - cellhandles.tooltipstimer = null; - } - cellhandles.dragtooltip.innerHTML = " "; - cellhandles.dragtooltip.style.display = "none"; - - range = editor.range; - - var whichhandle = SocialCalc.SegmentDivHit([scc.CH_radius1, scc.CH_radius2], editor.cellhandles.dragpalette, clientX, clientY); - if (whichhandle==1 || whichhandle==-1 || whichhandle==0) { - cellhandles.ShowCellHandles(true, false); // hide move handles - return; - } - - mouseinfo.ignore = true; // stop other code from looking at the mouse - - if (whichhandle==-3) { - cellhandles.dragtype = "Fill"; -// mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==3) { - cellhandles.dragtype = "FillC"; -// mouseinfo.element = editor.cellhandles.fillhandle; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==-2) { - cellhandles.dragtype = "Move"; -// mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } - else if (whichhandle==-4) { - cellhandles.dragtype = "MoveI"; -// mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } - else if (whichhandle==2) { - cellhandles.dragtype = "MoveC"; -// mouseinfo.element = editor.cellhandles.movehandle1; - cellhandles.noCursorSuffix = true; - } - else if (whichhandle==4) { - cellhandles.dragtype = "MoveIC"; -// mouseinfo.element = editor.cellhandles.movehandle2; - cellhandles.noCursorSuffix = false; - } - - cellhandles.filltype = null; - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - break; - - case "Move": - case "MoveI": - case "MoveC": - case "MoveIC": - if (!range.hasrange) { - editor.RangeAnchor(); - } - editor.range2.top = editor.range.top; - editor.range2.right = editor.range.right; - editor.range2.bottom = editor.range.bottom; - editor.range2.left = editor.range.left; - editor.range2.hasrange = true; - editor.RangeRemove(); - break; - - default: - return; // not for us - } - - cellhandles.fillinghandle.style.left = (clientX)+"px"; - cellhandles.fillinghandle.style.top = (clientY - 17)+"px"; - cellhandles.fillinghandle.innerHTML = scc.s_CHindicatorOperationLookup[cellhandles.dragtype]+ - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - cellhandles.ShowCellHandles(true, false); // hide move handles - cellhandles.mouseDown = true; - - mouseinfo.editor = editor; // remember for later - - coord = editor.ecell.coord; // start with cell with handles - - cellhandles.startingcoord = coord; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - - mouseinfo.mouselastcoord = coord; - - SocialCalc.KeyboardSetFocus(editor); - - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mousemove", SocialCalc.CellHandlesMouseMove, true); // capture everywhere - document.addEventListener("mouseup", SocialCalc.CellHandlesMouseUp, true); // capture everywhere - } - else if (cellhandles.draghandle.attachEvent) { // IE 5+ - cellhandles.draghandle.setCapture(); - cellhandles.draghandle.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMove); - cellhandles.draghandle.attachEvent("onmouseup", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.attachEvent("onlosecapture", SocialCalc.CellHandlesMouseUp); - } - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - -SocialCalc.CellHandlesMouseMove = function(e) { - - var scc = SocialCalc.Constants; - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval; - var crstart, crend, cr, c, r; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with move - - if (!result) return; - - if (result && !result.coord) { - SocialCalc.SetDragAutoRepeat(editor, result, SocialCalc.CellHandlesDragAutoRepeat); - return; - } - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - if (!result.coord) return; - - crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - - - cellhandles.movedmouse = true; // did move, so not no-op - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - - if (result.coord == cellhandles.startingcoord) { // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } - else { - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Down") { // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } - else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } - else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Down"; - } - else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Right"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - c = editor.range2.right - editor.range2.left + result.col; - r = editor.range2.bottom - editor.range2.top + result.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (result.coord == cellhandles.startingcoord) { // reset when come back - cellhandles.filltype = null; - cellhandles.startingX = clientX; - cellhandles.startingY = clientY; - } - else { - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Vertical") { // coerse to that - crend.col = editor.range2.left; - if (crend.row>=editor.range2.top && crend.row<=editor.range2.bottom+1) crend.row = editor.range2.bottom+2; - } - else { - crend.row = editor.range2.top; - if (crend.col>=editor.range2.left && crend.col<=editor.range2.right+1) crend.col = editor.range2.right+2; - } - } - else { - if (Math.abs(clientY - cellhandles.startingY) > 10) { - cellhandles.filltype = "Vertical"; - } - else if (Math.abs(clientX - cellhandles.startingX) > 10) { - cellhandles.filltype = "Horizontal"; - } - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - if (result.coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(result.coord); - if (!cellhandles.filltype) { // no fill type - editor.RangeRemove(); - } - else { - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - } - break; - - } - - - cellhandles.fillinghandle.style.left = (clientX)+"px"; - cellhandles.fillinghandle.style.top = (clientY - 17)+"px"; - cellhandles.fillinghandle.innerHTML = scc.s_CHindicatorOperationLookup[cellhandles.dragtype]+ - (scc.s_CHindicatorDirectionLookup[editor.cellhandles.filltype] || ""); - cellhandles.fillinghandle.style.display = "block"; - - mouseinfo.mouselastcoord = result.coord; - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - return; - - } - -SocialCalc.CellHandlesDragAutoRepeat = function(coord, direction) { - - var mouseinfo = SocialCalc.EditorMouseInfo; - var editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - var crstart = SocialCalc.coordToCr(editor.cellhandles.startingcoord); - var crend = SocialCalc.coordToCr(coord); - - var newcoord, c, r; - - var vscroll = 0; - var hscroll = 0; - - if (direction == "left") hscroll = -1; - else if (direction == "right") hscroll = 1; - else if (direction == "up") vscroll = -1; - else if (direction == "down") vscroll = 1; - editor.ScrollRelativeBoth(vscroll, hscroll); - - - switch (cellhandles.dragtype) { - case "Fill": - case "FillC": - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Down") { // coerse to that - crend.col = crstart.col; - if (crend.row < crstart.row) crend.row = crstart.row; - } - else { - crend.row = crstart.row; - if (crend.col < crstart.col) crend.col = crstart.col; - } - } - else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord!=mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - editor.RangeExtend(); - } - break; - - case "Move": - case "MoveC": - if (coord!=mouseinfo.mouselastcoord) { - editor.MoveECell(coord); - c = editor.range2.right - editor.range2.left + editor.ecell.col; - r = editor.range2.bottom - editor.range2.top + editor.ecell.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - case "MoveI": - case "MoveIC": - if (cellhandles.filltype) { // moving and have already determined filltype - if (cellhandles.filltype=="Vertical") { // coerse to that - crend.col = editor.range2.left; - if (crend.row>=editor.range2.top && crend.row<=editor.range2.bottom+1) crend.row = editor.range2.bottom+2; - } - else { - crend.row = editor.range2.top; - if (crend.col>=editor.range2.left && crend.col<=editor.range2.right+1) crend.col = editor.range2.right+2; - } - } - else { - crend.col = crstart.col; // until decide, leave it at start - crend.row = crstart.row; - } - - newcoord = SocialCalc.crToCoord(crend.col, crend.row); - if (newcoord!=mouseinfo.mouselastcoord) { - editor.MoveECell(newcoord); - c = editor.range2.right - editor.range2.left + crend.col; - r = editor.range2.bottom - editor.range2.top + crend.row; - editor.RangeAnchor(SocialCalc.crToCoord(c, r)); - editor.RangeExtend(); - } - break; - - } - - mouseinfo.mouselastcoord = newcoord; - - } - -SocialCalc.CellHandlesMouseUp = function(e) { - - var editor, element, result, coord, now, textarea, sheetobj, cellobj, wval, cstr, cmdtype, cmdtype2; - var crstart, crend; - var sizec, sizer, deltac, deltar; - - var event = e || window.event; - - var viewport = SocialCalc.GetViewportInfo(); - var clientX = event.clientX + viewport.horizontalScroll; - var clientY = event.clientY + viewport.verticalScroll; - - var mouseinfo = SocialCalc.EditorMouseInfo; - editor = mouseinfo.editor; - if (!editor) return; // not us, ignore - var cellhandles = editor.cellhandles; - - element = mouseinfo.element; - - mouseinfo.ignore = false; - - result = SocialCalc.GridMousePosition(editor, clientX, clientY); // get cell with up - - SocialCalc.SetDragAutoRepeat(editor, null); // stop repeating if it was - - cellhandles.mouseDown = false; - cellhandles.noCursorSuffix = false; - - cellhandles.fillinghandle.style.display = "none"; - - if (!result) result = {}; - if (!result.coord) result.coord = editor.ecell.coord; - - switch (cellhandles.dragtype) { - case "Fill": - case "Move": - case "MoveI": - cmdtype2 = " all"; - break; - case "FillC": - case "MoveC": - case "MoveIC": - cmdtype2 = " formulas"; - break; - } - - if (!cellhandles.movedmouse) { // didn't move: just leave one cell selected - cellhandles.dragtype = "Nothing"; - } - - switch (cellhandles.dragtype) { - case "Nothing": - editor.Range2Remove(); - editor.RangeRemove(); - break; - - case "Fill": - case "FillC": - - crstart = SocialCalc.coordToCr(cellhandles.startingcoord); - crend = SocialCalc.coordToCr(result.coord); - if (cellhandles.filltype) { - if (cellhandles.filltype=="Down") { - crend.col = crstart.col; - } - else { - crend.row = crstart.row; - } - } - result.coord = SocialCalc.crToCoord(crend.col, crend.row); - - editor.MoveECell(result.coord); - editor.RangeExtend(); - - if (editor.cellhandles.filltype=="Right") { - cmdtype = "right"; - } - else { - cmdtype = "down"; - } - cstr = "fill"+cmdtype+" "+SocialCalc.crToCoord(editor.range.left, editor.range.top)+ - ":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom)+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - break; - - case "Move": - case "MoveC": - editor.context.cursorsuffix = ""; - cstr = "movepaste "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - - break; - - case "MoveI": - case "MoveIC": - editor.context.cursorsuffix = ""; - sizec = editor.range2.right - editor.range2.left; - sizer = editor.range2.bottom - editor.range2.top; - deltac = editor.ecell.col - editor.range2.left; - deltar = editor.ecell.row - editor.range2.top; - cstr = "moveinsert "+ - SocialCalc.crToCoord(editor.range2.left, editor.range2.top) + ":" + - SocialCalc.crToCoord(editor.range2.right, editor.range2.bottom) - +" "+editor.ecell.coord+cmdtype2; - editor.EditorScheduleSheetCommands(cstr, true, false); - editor.Range2Remove(); - editor.RangeRemove(); - if (editor.cellhandles.filltype==" Horizontal" && deltac > 0) { - editor.MoveECell(SocialCalc.crToCoord(editor.ecell.col-sizec-1, editor.ecell.row)); - } - else if (editor.cellhandles.filltype==" Vertical" && deltar > 0) { - editor.MoveECell(SocialCalc.crToCoord(editor.ecell.col, editor.ecell.row-sizer-1)); - } - editor.RangeAnchor(SocialCalc.crToCoord(editor.ecell.col+sizec, editor.ecell.row+sizer)); - editor.RangeExtend(); - - break; - - } - - if (event.stopPropagation) event.stopPropagation(); // DOM Level 2 - else event.cancelBubble = true; // IE 5+ - if (event.preventDefault) event.preventDefault(); // DOM Level 2 - else event.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mousemove", SocialCalc.CellHandlesMouseMove, true); - document.removeEventListener("mouseup", SocialCalc.CellHandlesMouseUp, true); - } - else if (cellhandles.draghandle.detachEvent) { // IE - cellhandles.draghandle.detachEvent("onlosecapture", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.detachEvent("onmouseup", SocialCalc.CellHandlesMouseUp); - cellhandles.draghandle.detachEvent("onmousemove", SocialCalc.CellHandlesMouseMove); - cellhandles.draghandle.releaseCapture(); - } - - mouseinfo.editor = null; - - return false; - - } - -// ************************************* -// -// TableControl class: -// -// This class deals with the horizontal and verical scrollbars and pane sliders. -// -// +--------------+ -// | Endcap | -// +- - - - - - - + -// | | -// +--------------+ -// | Pane Slider | -// +--------------+ -// | | -// | Less Button | -// | | -// +--------------+ -// | Scroll Area | -// | | -// | | -// +--------------+ -// | Thumb | -// +--------------+ -// | | -// +--------------+ -// | | -// | More Button | -// | | -// +--------------+ -// -// ************************************* - -SocialCalc.TableControl = function(editor, vertical, size) { - - var scc = SocialCalc.Constants; - - this.editor = editor; // the TableEditor this belongs to - - this.vertical = vertical; // true if vertical control, false if horizontal - this.size = size; // length in pixels - - this.main = null; // main element containing all the others - this.endcap = null; // the area at the top/left between the end and the pane slider - this.paneslider = null; // the slider to adjust the pane split - this.lessbutton = null; // the top/left scroll button - this.morebutton = null; // the bottom/right scroll button - this.scrollarea = null; // the area between the scroll buttons - this.thumb = null; // the sliding thing in the scrollarea - - // computed position values: - - this.controlborder = null; // left or top screen position for vertical or horizontal control - this.endcapstart = null; // top or left screen position for vertical or horizontal control - this.panesliderstart = null; - this.lessbuttonstart = null; - this.morebuttonstart = null; - this.scrollareastart = null; - this.scrollareaend = null; - this.scrollareasize = null; - this.thumbpos = null; - - // constants: - - this.controlthickness = scc.defaultTableControlThickness; // other dimension of complete control in pixels - this.sliderthickness = scc.defaultTCSliderThickness; - this.buttonthickness = scc.defaultTCButtonThickness; - this.thumbthickness = scc.defaultTCThumbThickness; - this.minscrollingpanesize = this.buttonthickness+this.buttonthickness+this.thumbthickness+20; // the 20 is to leave a little space - - } - -// Methods: - -SocialCalc.TableControl.prototype.CreateTableControl = function() {return SocialCalc.CreateTableControl(this);}; -SocialCalc.TableControl.prototype.PositionTableControlElements = function() {SocialCalc.PositionTableControlElements(this);}; -SocialCalc.TableControl.prototype.ComputeTableControlPositions = function() {SocialCalc.ComputeTableControlPositions(this);}; - -// Functions: - -SocialCalc.CreateTableControl = function(control) { - - var s, functions, params; - var AssignID = SocialCalc.AssignID; - var setStyles = SocialCalc.setStyles; - var scc = SocialCalc.Constants; - var TooltipRegister = function(element, etype, vh) { - if (scc["s_"+etype+"Tooltip"+vh]) { - SocialCalc.TooltipRegister(element, scc["s_"+etype+"Tooltip"+vh], null); - } - } - - var imageprefix = control.editor.imageprefix; - var vh = control.vertical ? "v" : "h"; - - control.main = document.createElement("div"); - s = control.main.style; - s.height = (control.vertical ? control.size : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.size)+"px"; - s.zIndex = 0; - setStyles(control.main, scc.TCmainStyle); - s.backgroundImage="url("+imageprefix+"main-"+vh+".gif)"; - if (scc.TCmainClass) control.main.className = scc.TCmainClass; - - control.main.style.display="none"; // wait for layout - - control.endcap = document.createElement("div"); - s = control.endcap.style; - s.height = control.controlthickness+"px"; - s.width = control.controlthickness+"px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.endcap, scc.TCendcapStyle); - s.backgroundImage="url("+imageprefix+"endcap-"+vh+".gif)"; - if (scc.TCendcapClass) control.endcap.className = scc.TCendcapClass; - AssignID(control.editor, control.endcap, "endcap"+vh); - - control.main.appendChild(control.endcap); - - control.paneslider = document.createElement("div"); - s = control.paneslider.style; - s.height = (control.vertical ? control.sliderthickness : control.controlthickness)+"px"; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.width = (control.vertical ? control.controlthickness : control.sliderthickness)+"px"; - s.position = "absolute"; - s[control.vertical?"top":"left"] = "4px"; - s.zIndex = 3; - setStyles(control.paneslider, scc.TCpanesliderStyle); - s.backgroundImage="url("+imageprefix+"paneslider-"+vh+".gif)"; - if (scc.TCpanesliderClass) control.paneslider.className = scc.TCpanesliderClass; - AssignID(control.editor, control.paneslider, "paneslider"+vh); - TooltipRegister(control.paneslider, "paneslider", vh); - - functions = {MouseDown:SocialCalc.TCPSDragFunctionStart, - MouseMove: SocialCalc.TCPSDragFunctionMove, - MouseUp: SocialCalc.TCPSDragFunctionStop, - Disabled: function() {return control.editor.busy;}}; - - functions.control = control; // make sure this is there - - SocialCalc.DragRegister(control.paneslider, control.vertical, !control.vertical, functions); - - control.main.appendChild(control.paneslider); - - control.lessbutton = document.createElement("div"); - s = control.lessbutton.style; - s.height = (control.vertical ? control.buttonthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.buttonthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.lessbutton, scc.TClessbuttonStyle); - s.backgroundImage="url("+imageprefix+"less-"+vh+"n.gif)" - if (scc.TClessbuttonClass) control.lessbutton.className = scc.TClessbuttonClass; - AssignID(control.editor, control.lessbutton, "lessbutton"+vh); - - params = {repeatwait:scc.TClessbuttonRepeatWait, repeatinterval:scc.TClessbuttonRepeatInterval, - normalstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"n.gif);", - downstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"d.gif);", - hoverstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"h.gif);"}; - functions = {MouseDown:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, -1);}, - Repeat:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, -1);}, - Disabled: function() {return control.editor.busy;}}; - - SocialCalc.ButtonRegister(control.lessbutton, params, functions); - - control.main.appendChild(control.lessbutton); - - control.morebutton = document.createElement("div"); - s = control.morebutton.style; - s.height = (control.vertical ? control.buttonthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.buttonthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.morebutton, scc.TCmorebuttonStyle); - s.backgroundImage="url("+imageprefix+"more-"+vh+"n.gif)" - if (scc.TCmorebuttonClass) control.morebutton.className = scc.TCmorebuttonClass; - AssignID(control.editor, control.morebutton, "morebutton"+vh); - - params = {repeatwait:scc.TCmorebuttonRepeatWait, repeatinterval:scc.TCmorebuttonRepeatInterval, - normalstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"n.gif);", - downstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"d.gif);", - hoverstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"h.gif);"}; - functions = {MouseDown:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, +1);}, - Repeat:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, +1);}, - Disabled: function() {return control.editor.busy;}}; - - SocialCalc.ButtonRegister(control.morebutton, params, functions); - - control.main.appendChild(control.morebutton); - - control.scrollarea = document.createElement("div"); - s = control.scrollarea.style; - s.height = control.controlthickness+"px"; - s.width = control.controlthickness+"px"; - s.zIndex = 1; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.scrollarea, scc.TCscrollareaStyle); - s.backgroundImage="url("+imageprefix+"scrollarea-"+vh+".gif)"; - if (scc.TCscrollareaClass) control.scrollarea.className = scc.TCscrollareaClass; - AssignID(control.editor, control.scrollarea, "scrollarea"+vh); - - params = {repeatwait:scc.TCscrollareaRepeatWait, repeatinterval:scc.TCscrollareaRepeatWait}; - functions = {MouseDown:SocialCalc.ScrollAreaClick, Repeat:SocialCalc.ScrollAreaClick, - Disabled: function() {return control.editor.busy;}}; - functions.control = control; - - SocialCalc.ButtonRegister(control.scrollarea, params, functions); - - control.main.appendChild(control.scrollarea); - - control.thumb = document.createElement("div"); - s = control.thumb.style; - s.height = (control.vertical ? control.thumbthickness : control.controlthickness)+"px"; - s.width = (control.vertical ? control.controlthickness : control.thumbthickness)+"px"; - s.zIndex = 2; - s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this - s.position = "absolute"; - setStyles(control.thumb, scc.TCthumbStyle); - control.thumb.style.backgroundImage="url("+imageprefix+"thumb-"+vh+"n.gif)"; - if (scc.TCthumbClass) control.thumb.className = scc.TCthumbClass; - AssignID(control.editor, control.thumb, "thumb"+vh); - - functions = {MouseDown:SocialCalc.TCTDragFunctionStart, - MouseMove: SocialCalc.TCTDragFunctionMove, - MouseUp: SocialCalc.TCTDragFunctionStop, - Disabled: function() {return control.editor.busy;}}; - functions.control = control; // make sure this is there - SocialCalc.DragRegister(control.thumb, control.vertical, !control.vertical, functions); - - params = {normalstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"n.gif)", name:"Thumb", - downstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"d.gif)", - hoverstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"h.gif)"}; - SocialCalc.ButtonRegister(control.thumb, params, null); // give it button-like visual behavior - - control.main.appendChild(control.thumb); - - return control.main; - -} - -// -// ScrollAreaClick - Button function to process pageup/down clicks -// - -SocialCalc.ScrollAreaClick = function(e, buttoninfo, bobj) { - - var control = bobj.functionobj.control; - var bposition = SocialCalc.GetElementPosition(bobj.element); - var clickpos = control.vertical ? buttoninfo.clientY : buttoninfo.clientX; - if (control.editor.busy) { // ignore if busy - wait for next repeat - return; - } - control.editor.PageRelative(control.vertical, clickpos > control.thumbpos ? 1 : -1); - - return; - -} - -// -// PositionTableControlElements -// - -SocialCalc.PositionTableControlElements = function(control) { - - var border, realend, thumbpos; - - var editor = control.editor; - - if (control.vertical) { - border = control.controlborder+"px"; - control.endcap.style.top = control.endcapstart+"px"; - control.endcap.style.left = border; - control.paneslider.style.top = control.panesliderstart+"px"; - control.paneslider.style.left = border - control.lessbutton.style.top = control.lessbuttonstart+"px"; - control.lessbutton.style.left = border; - control.morebutton.style.top = control.morebuttonstart+"px"; - control.morebutton.style.left = border; - control.scrollarea.style.top = control.scrollareastart+"px"; - control.scrollarea.style.left = border; - control.scrollarea.style.height = control.scrollareasize+"px"; - realend = Math.max(editor.context.sheetobj.attribs.lastrow, editor.firstscrollingrow+1); - thumbpos = ((editor.firstscrollingrow-(editor.lastnonscrollingrow+1))*(control.scrollareasize-3*control.thumbthickness))/ - (realend-(editor.lastnonscrollingrow+1))+control.scrollareastart-1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.top = thumbpos+"px"; - control.thumb.style.left = border; - } - else { - border = control.controlborder+"px"; - control.endcap.style.left = control.endcapstart+"px"; - control.endcap.style.top = border; - control.paneslider.style.left = control.panesliderstart+"px"; - control.paneslider.style.top = border - control.lessbutton.style.left = control.lessbuttonstart+"px"; - control.lessbutton.style.top = border; - control.morebutton.style.left = control.morebuttonstart+"px"; - control.morebutton.style.top = border; - control.scrollarea.style.left = control.scrollareastart+"px"; - control.scrollarea.style.top = border; - control.scrollarea.style.width = control.scrollareasize+"px"; - realend = Math.max(editor.context.sheetobj.attribs.lastcol, editor.firstscrollingcol+1); - thumbpos = ((editor.firstscrollingcol-(editor.lastnonscrollingcol+1))*(control.scrollareasize-control.thumbthickness))/ - (realend-editor.lastnonscrollingcol)+control.scrollareastart-1; - thumbpos = Math.floor(thumbpos); - control.thumb.style.left = thumbpos+"px"; - control.thumb.style.top = border; - } - control.thumbpos = thumbpos; - control.main.style.display="block"; - - } - -// -// ComputeTableControlPositions -// -// This routine computes the screen positions and other values needed for laying out -// the table control elements. -// - -SocialCalc.ComputeTableControlPositions = function(control) { - - var editor = control.editor; - - if (!editor.gridposition || !editor.headposition) throw("Can't compute table control positions before editor positions"); - - if (control.vertical) { - control.controlborder = editor.gridposition.left+editor.tablewidth; // border=left position - control.endcapstart = editor.gridposition.top; // start=top position - control.panesliderstart = editor.firstscrollingrowtop-control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingrowtop-1; - control.morebuttonstart = editor.gridposition.top+editor.tableheight-control.buttonthickness; - control.scrollareastart = editor.firstscrollingrowtop-1+control.buttonthickness; - control.scrollareaend = control.morebuttonstart-1; - control.scrollareasize = control.scrollareaend-control.scrollareastart+1; - } - else { - control.controlborder = editor.gridposition.top+editor.tableheight; // border=top position - control.endcapstart = editor.gridposition.left; // start=left position - control.panesliderstart = editor.firstscrollingcolleft-control.sliderthickness; - control.lessbuttonstart = editor.firstscrollingcolleft-1; - control.morebuttonstart = editor.gridposition.left+editor.tablewidth-control.buttonthickness; - control.scrollareastart = editor.firstscrollingcolleft-1+control.buttonthickness; - control.scrollareaend = control.morebuttonstart-1; - control.scrollareasize = control.scrollareaend-control.scrollareastart+1; - } - } - -////// TCPS - TableControl Pan Slider methods - -// -// TCPSDragFunctionStart(event, draginfo, dobj) -// -// TableControlPaneSlider function for starting drag -// - -SocialCalc.TCPSDragFunctionStart = function(event, draginfo, dobj) { - - var editor = dobj.functionobj.control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - draginfo.trackingline = document.createElement("div"); - draginfo.trackingline.style.height = dobj.vertical ? scc.TCPStrackinglineThickness : - (editor.tableheight-(editor.headposition.top-editor.gridposition.top))+"px"; - draginfo.trackingline.style.width = dobj.vertical ? - (editor.tablewidth-(editor.headposition.left-editor.gridposition.left))+"px" : scc.TCPStrackinglineThickness; - draginfo.trackingline.style.backgroundImage="url("+editor.imageprefix+"trackingline-"+(dobj.vertical?"v":"h")+".gif)";; - if (scc.TCPStrackinglineClass) draginfo.trackingline.className = scc.TCPStrackinglineClass; - SocialCalc.setStyles(draginfo.trackingline, scc.TCPStrackinglineStyle); - - if (dobj.vertical) { - row = SocialCalc.Lookup(draginfo.clientY+dobj.functionobj.control.sliderthickness, editor.rowpositions); - draginfo.trackingline.style.top = (editor.rowpositions[row] || editor.headposition.top)+"px"; - draginfo.trackingline.style.left = editor.headposition.left+"px"; - if (editor.context.rowpanes.length-1) { // has 2 already - editor.context.SetRowPaneFirstLast(1, editor.context.rowpanes[0].last+1, editor.context.rowpanes[0].last+1); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } - else { - col = SocialCalc.Lookup(draginfo.clientX+dobj.functionobj.control.sliderthickness, editor.colpositions); - draginfo.trackingline.style.top = editor.headposition.top+"px"; - draginfo.trackingline.style.left = (editor.colpositions[col] || editor.headposition.left)+"px"; - if (editor.context.colpanes.length-1) { // has 2 already - editor.context.SetColPaneFirstLast(1, editor.context.colpanes[0].last+1, editor.context.colpanes[0].last+1); - editor.FitToEditTable(); - editor.ScheduleRender(); - } - } - - editor.griddiv.appendChild(draginfo.trackingline); - - } - -// -// TCPSDragFunctionMove(event, draginfo, dobj) -// - -SocialCalc.TCPSDragFunctionMove = function(event, draginfo, dobj) { - - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup(draginfo.clientY+sliderthickness, editor.rowpositions); - draginfo.trackingline.style.top = (editor.rowpositions[row] || editor.headposition.top)+"px"; - } - else { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup(draginfo.clientX+sliderthickness, editor.colpositions); - draginfo.trackingline.style.left = (editor.colpositions[col] || editor.headposition.left)+"px"; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - - } - -// -// TCPSDragFunctionStop(event, draginfo, dobj) -// - -SocialCalc.TCPSDragFunctionStop = function(event, draginfo, dobj) { - - var row, col, max, min; - var control = dobj.functionobj.control; - var sliderthickness = control.sliderthickness; - var editor = control.editor; - - if (dobj.vertical) { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetY; // restrict movement - if (draginfo.clientY > max) draginfo.clientY = max; - min = editor.headposition.top - sliderthickness - draginfo.offsetY; - if (draginfo.clientY < min) draginfo.clientY = min; - - row = SocialCalc.Lookup(draginfo.clientY+sliderthickness, editor.rowpositions); - if (row>editor.context.sheetobj.attribs.lastrow) row=editor.context.sheetobj.attribs.lastrow; // can't extend sheet here - if (!row || row<=editor.context.rowpanes[0].first) { // set to no panes, leaving first pane settings - if (editor.context.rowpanes.length>1) editor.context.rowpanes.length = 1; - } - else if (editor.context.rowpanes.length-1) { // has 2 already - if (!editor.timeout) { // not waiting for position calc (so positions could be wrong) - editor.context.SetRowPaneFirstLast(0, editor.context.rowpanes[0].first, row-1); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } - else { - editor.context.SetRowPaneFirstLast(0, editor.context.rowpanes[0].first, row-1); - editor.context.SetRowPaneFirstLast(1, row, row); - } - } - else { - max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetX; - if (draginfo.clientX > max) draginfo.clientX = max; - min = editor.headposition.left - sliderthickness - draginfo.offsetX; - if (draginfo.clientX < min) draginfo.clientX = min; - - col = SocialCalc.Lookup(draginfo.clientX+sliderthickness, editor.colpositions); - if (col>editor.context.sheetobj.attribs.lastcol) col=editor.context.sheetobj.attribs.lastcol; // can't extend sheet here - if (!col || col<=editor.context.colpanes[0].first) { // set to no panes, leaving first pane settings - if (editor.context.colpanes.length>1) editor.context.colpanes.length = 1; - } - else if (editor.context.colpanes.length-1) { // has 2 already - if (!editor.timeout) { // not waiting for position calc (so positions could be wrong) - editor.context.SetColPaneFirstLast(0, editor.context.colpanes[0].first, col-1); - editor.context.SetColPaneFirstLast(1, col, col); - } - } - else { - editor.context.SetColPaneFirstLast(0, editor.context.colpanes[0].first, col-1); - editor.context.SetColPaneFirstLast(1, col, col); - } - } - - editor.FitToEditTable(); - - editor.griddiv.removeChild(draginfo.trackingline); - - editor.ScheduleRender(); - - } - -////// TCT - TableControl Thumb methods - -//!!!! Note: Need to make start use same code as move/stop for determining row/col, since stop will set that -//!!!! Note: Need to make start/move/stop use positioning code that corresponds closer to -//!!!! ComputeTableControlPositions calculations. - -// -// TCTDragFunctionStart(event, draginfo, dobj) -// -// TableControlThumb function for starting drag -// - -SocialCalc.TCTDragFunctionStart = function(event, draginfo, dobj) { - - var rowpane, colpane, row, col; - - var control = dobj.functionobj.control; - var editor = control.editor; - var scc = SocialCalc.Constants; - - SocialCalc.DragFunctionStart(event, draginfo, dobj); - - if (draginfo.thumbstatus) { // get rid of old one if mouseup was out of window - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - } - - draginfo.thumbstatus = document.createElement("div"); - - if (dobj.vertical) { - if (scc.TCTDFSthumbstatusvClass) draginfo.thumbstatus.className = scc.TCTDFSthumbstatusvClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatusvStyle); - draginfo.thumbstatus.style.top = (draginfo.clientY+scc.TCTDFStopOffsetv)+"px"; - draginfo.thumbstatus.style.left = (control.controlborder-10-(editor.tablewidth/2))+"px"; - draginfo.thumbstatus.style.width = (editor.tablewidth/2)+"px"; - - draginfo.thumbcontext = new SocialCalc.RenderContext(editor.context.sheetobj); - draginfo.thumbcontext.showGrid = true; - draginfo.thumbcontext.rowpanes = [{first: 1, last: 1}]; - var pane = editor.context.colpanes[editor.context.colpanes.length-1]; - draginfo.thumbcontext.colpanes = [{first: pane.first, last: pane.last}]; - draginfo.thumbstatus.innerHTML = '
    msg
    preview
    '; - draginfo.thumbstatus.rowmsgele = draginfo.thumbstatus.firstChild.firstChild.firstChild.firstChild.firstChild; - draginfo.thumbstatus.rowpreviewele = draginfo.thumbstatus.firstChild.firstChild.firstChild.childNodes[1].firstChild; - editor.toplevel.appendChild(draginfo.thumbstatus); - SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, editor.firstscrollingrow || 1); - } - else { - if (scc.TCTDFSthumbstatushClass) draginfo.thumbstatus.className = scc.TCTDFSthumbstatushClass; - SocialCalc.setStyles(draginfo.thumbstatus, scc.TCTDFSthumbstatushStyle); - draginfo.thumbstatus.style.top = (control.controlborder+scc.TCTDFStopOffseth)+"px"; - draginfo.thumbstatus.style.left = (draginfo.clientX+scc.TCTDFSleftOffseth)+"px"; - editor.toplevel.appendChild(draginfo.thumbstatus); - draginfo.thumbstatus.innerHTML = scc.s_TCTDFthumbstatusPrefixh+SocialCalc.rcColname(editor.firstscrollingcol); - } - - } - - -// -// SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, row) -// -// Render partial row -// - -SocialCalc.TCTDragFunctionRowSetStatus = function(draginfo, editor, row) { - - var scc = SocialCalc.Constants; - var msg = scc.s_TCTDFthumbstatusPrefixv+row+" "; - - draginfo.thumbstatus.rowmsgele.innerHTML = msg; - - draginfo.thumbcontext.rowpanes = [{first: row, last: row}]; - draginfo.thumbrowshown = row; - - var ele = draginfo.thumbcontext.RenderSheet(draginfo.thumbstatus.rowpreviewele.firstChild, {type: "html"}); - - } - - -// -// TCTDragFunctionMove(event, draginfo, dobj) -// - -SocialCalc.TCTDragFunctionMove = function(event, draginfo, dobj) { - - var first, msg; - var control = dobj.functionobj.control; - var thumbthickness = control.thumbthickness; - var editor = control.editor; - var scc = SocialCalc.Constants; - - if (dobj.vertical) { - if (draginfo.clientY > control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2) - draginfo.clientY = control.scrollareaend - draginfo.offsetY - control.thumbthickness + 2; - if (draginfo.clientY < control.scrollareastart - draginfo.offsetY - 1) - draginfo.clientY = control.scrollareastart - draginfo.offsetY - 1; - draginfo.thumbstatus.style.top = draginfo.clientY+"px"; - - first = - ((draginfo.clientY+draginfo.offsetY-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastrow-editor.lastnonscrollingrow) - + editor.lastnonscrollingrow + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) first = editor.context.sheetobj.attribs.lastrow; -// msg = scc.s_TCTDFthumbstatusPrefixv+first; - if (first != draginfo.thumbrowshown) { - SocialCalc.TCTDragFunctionRowSetStatus(draginfo, editor, first); - } - } - else { - if (draginfo.clientX > control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2) - draginfo.clientX = control.scrollareaend - draginfo.offsetX - control.thumbthickness + 2; - if (draginfo.clientX < control.scrollareastart - draginfo.offsetX - 1) - draginfo.clientX = control.scrollareastart - draginfo.offsetX - 1; - draginfo.thumbstatus.style.left = draginfo.clientX+"px"; - - first = - ((draginfo.clientX+draginfo.offsetX-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastcol-editor.lastnonscrollingcol) - + editor.lastnonscrollingcol + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) first = editor.context.sheetobj.attribs.lastcol; - msg = scc.s_TCTDFthumbstatusPrefixh+SocialCalc.rcColname(first); - draginfo.thumbstatus.innerHTML = msg; - } - - SocialCalc.DragFunctionPosition(event, draginfo, dobj); - - } - -// -// TCTDragFunctionStop(event, draginfo, dobj) -// - -SocialCalc.TCTDragFunctionStop = function(event, draginfo, dobj) { - - var first; - var control = dobj.functionobj.control; - var editor = control.editor; - - if (dobj.vertical) { - first = - ((draginfo.clientY+draginfo.offsetY-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastrow-editor.lastnonscrollingrow) - + editor.lastnonscrollingrow + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingrow) first = editor.lastnonscrollingrow + 1; - if (first > editor.context.sheetobj.attribs.lastrow) first = editor.context.sheetobj.attribs.lastrow; - - editor.context.SetRowPaneFirstLast(editor.context.rowpanes.length-1, first, first+1); - } - else { - first = - ((draginfo.clientX+draginfo.offsetX-control.scrollareastart+1)/(control.scrollareasize-control.thumbthickness)) - * (editor.context.sheetobj.attribs.lastcol-editor.lastnonscrollingcol) - + editor.lastnonscrollingcol + 1; - first = Math.floor(first); - if (first <= editor.lastnonscrollingcol) first = editor.lastnonscrollingcol + 1; - if (first > editor.context.sheetobj.attribs.lastcol) first = editor.context.sheetobj.attribs.lastcol; - - editor.context.SetColPaneFirstLast(editor.context.colpanes.length-1, first, first+1); - } - - editor.FitToEditTable(); - - if (draginfo.thumbstatus.rowmsgele) draginfo.thumbstatus.rowmsgele = null; - if (draginfo.thumbstatus.rowpreviewele) draginfo.thumbstatus.rowpreviewele = null; - editor.toplevel.removeChild(draginfo.thumbstatus); - draginfo.thumbstatus = null; - - editor.ScheduleRender(); - - } - -// ************************************* -// -// Dragging functions: -// -// ************************************* - -SocialCalc.DragInfo = { - - // There is only one of these -- no "new" is done. - // Only one dragging operation can be active at a time. - // The registeredElements array is used to decide which item to drag. - - // One item for each draggable thing, each an object with: - // .element, .vertical, .horizontal, .functionobj - - registeredElements: [], - - // Items used during a drag - - draggingElement: null, // item being processed (.element is the actual element) - startX: 0, - startY: 0, - startZ: 0, - clientX: 0, // modifyable version to restrict movement - clientY: 0, - offsetX: 0, - offsetY: 0, - horizontalScroll: 0, // retrieved at drag start - verticalScroll: 0 - - } - -// -// DragRegister(element, vertical, horizontal, functionobj) - make element draggable -// -// The functionobj defaults to moving the element contrained only by vertical and horizontal settings. -// - -SocialCalc.DragRegister = function(element, vertical, horizontal, functionobj) { - - var draginfo = SocialCalc.DragInfo; - - if (!functionobj) { - functionobj = {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null}; - } - - draginfo.registeredElements.push( - {element: element, vertical: vertical, horizontal: horizontal, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.DragMouseDown, false); - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousedown", SocialCalc.DragMouseDown); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - } - -// -// DragUnregister(element) - remove object from list -// - -SocialCalc.DragUnregister = function(element) { - - var draginfo = SocialCalc.DragInfo; - - var i; - - if (!element) return; - - for (i=0; i tooltipinfo.viewport.width/2) { // on right side of screen - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY)+"px"; - tooltipinfo.popupElement.style.right = (tooltipinfo.viewport.width - tooltipinfo.clientX + offsetX)+"px"; - } - else { // on left side of screen - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY)+"px"; - tooltipinfo.popupElement.style.left = (tooltipinfo.clientX + offsetX)+"px"; - } - - if (tooltipinfo.clientY < 50) { // make sure fits on screen if nothing above grid - tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY - 50)+"px"; - } - - document.body.appendChild(tooltipinfo.popupElement); - - } - -// -// TooltipHide() -// - -SocialCalc.TooltipHide = function() { - - var tooltipinfo = SocialCalc.TooltipInfo; - - if (tooltipinfo.popupElement) { - tooltipinfo.popupElement.parentNode.removeChild(tooltipinfo.popupElement); - tooltipinfo.popupElement = null; - } - - } - -// -// TooltipWaitDone() -// - -SocialCalc.TooltipWaitDone = function() { - - var tooltipinfo = SocialCalc.TooltipInfo; - - tooltipinfo.timer = null; - - SocialCalc.TooltipDisplay(tooltipinfo.tooltipElement); - - } - - -// ************************************* -// -// Button functions: -// -// ************************************* - -SocialCalc.ButtonInfo = { - - // There is only one of these -- no "new" is done. - // Only one button operation can be active at a time. - // The registeredElements array is used to identify items. - - // One item for each clickable element, each an object with: - // .element, .normalstyle, .hoverstyle, .downstyle, .repeatinterval, .functionobj - // - // .functionobj is an object with optional function objects for: - // mouseover, mouseout, mousedown, repeatinterval, mouseup, disabled - - registeredElements: [], - - // Items used during hover over an element, clicking, repeating, etc. - - buttonElement: null, // item being processed, hover or down (.element is the actual element) - doingHover: false, // true if mouse is over one of our elements - buttonDown: false, // true if button down and buttonElement not null - timer: null, // timer object for repeating - - // Used while processing an event - - horizontalScroll: 0, - verticalScroll: 0, - clientX: 0, - clientY: 0 - - } - -// -// ButtonRegister(element, paramobj, functionobj) - make element clickable -// -// The arguments (other than element) may be null (meaning no change for style and no repeat) -// The paramobj has the optional normalstyle, hoverstyle, downstyle, repeatwait, repeatinterval settings - -SocialCalc.ButtonRegister = function(element, paramobj, functionobj) { - - var buttoninfo = SocialCalc.ButtonInfo; - - if (!paramobj) paramobj = {}; - - buttoninfo.registeredElements.push( - {name: paramobj.name, element: element, normalstyle: paramobj.normalstyle, hoverstyle: paramobj.hoverstyle, downstyle: paramobj.downstyle, - repeatwait: paramobj.repeatwait, repeatinterval: paramobj.repeatinterval, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("mousedown", SocialCalc.ButtonMouseDown, false); - element.addEventListener("mouseover", SocialCalc.ButtonMouseOver, false); - element.addEventListener("mouseout", SocialCalc.ButtonMouseOut, false); - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousedown", SocialCalc.ButtonMouseDown); - element.attachEvent("onmouseover", SocialCalc.ButtonMouseOver); - element.attachEvent("onmouseout", SocialCalc.ButtonMouseOut); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - - } - -// -// ButtonMouseOver(event) -// - -SocialCalc.ButtonMouseOver = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (!bobj) return; - - if (buttoninfo.buttonDown) { - if (buttoninfo.buttonElement==bobj) { - buttoninfo.doingHover = true; // keep track whether we are on the pressed button or not - } - return; - } - - if (buttoninfo.buttonElement && - buttoninfo.buttonElement!=bobj && buttoninfo.doingHover) { // moved to a new one, undo hover there - SocialCalc.setStyles(buttoninfo.buttonElement.element, buttoninfo.buttonElement.normalstyle); - } - - buttoninfo.buttonElement = bobj; // remember this one is hovering - buttoninfo.doingHover = true; - - SocialCalc.setStyles(bobj.element, bobj.hoverstyle); // set style (if provided) - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOver) bobj.functionobj.MouseOver(e, buttoninfo, bobj); - - return; - - } - -// -// ButtonMouseOut(event) -// - -SocialCalc.ButtonMouseOut = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - if (buttoninfo.buttonDown) { - buttoninfo.doingHover = false; // keep track of overs and outs - return; - } - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (buttoninfo.doingHover) { // if there was a hover, undo it - if (buttoninfo.buttonElement) - SocialCalc.setStyles(buttoninfo.buttonElement.element, buttoninfo.buttonElement.normalstyle); - buttoninfo.buttonElement = null; - buttoninfo.doingHover = false; - } - - if (bobj && bobj.functionobj && bobj.functionobj.MouseOut) bobj.functionobj.MouseOut(e, buttoninfo, bobj); - - return; - - } - -// -// ButtonMouseDown(event) -// - -SocialCalc.ButtonMouseDown = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - - var viewportinfo = SocialCalc.GetViewportInfo(); - - var bobj = SocialCalc.LookupElement(e.target || e.srcElement, buttoninfo.registeredElements); - - if (!bobj) return; // not one of our elements - - if (bobj && bobj.functionobj && bobj.functionobj.Disabled) { - if (bobj.functionobj.Disabled(e, buttoninfo, bobj)) { - return; - } - } - - buttoninfo.buttonElement = bobj; - buttoninfo.buttonDown = true; - - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.downstyle); - - // Register event handler for mouse up - - // Event code from JavaScript, Flanagan, 5th Edition, pg. 422 - if (document.addEventListener) { // DOM Level 2 -- Firefox, et al - document.addEventListener("mouseup", SocialCalc.ButtonMouseUp, true); // capture everywhere - } - else if (bobj.element.attachEvent) { // IE 5+ - bobj.element.setCapture(); - bobj.element.attachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.attachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - } - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - buttoninfo.horizontalScroll = viewportinfo.horizontalScroll; - buttoninfo.verticalScroll = viewportinfo.verticalScroll; - buttoninfo.clientX = e.clientX + buttoninfo.horizontalScroll; // get document-relative coordinates - buttoninfo.clientY = e.clientY + buttoninfo.verticalScroll; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseDown) bobj.functionobj.MouseDown(e, buttoninfo, bobj); - - if (bobj.repeatwait) { // if a repeat wait is set, then starting waiting for first repetition - buttoninfo.timer = window.setTimeout(SocialCalc.ButtonRepeat, bobj.repeatwait); - } - - return; - - } - -// -// ButtonMouseUp(event) -// - -SocialCalc.ButtonMouseUp = function(event) { - - var e = event || window.event; - - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (buttoninfo.timer) { // if repeating, cancel it - window.clearTimeout(buttoninfo.timer); // cancel timer - buttoninfo.timer = null; - } - - if (!buttoninfo.buttonDown) return; // already did this (e.g., in IE, releaseCapture fires losecapture) - - if (e.stopPropagation) e.stopPropagation(); // DOM Level 2 - else e.cancelBubble = true; // IE 5+ - if (e.preventDefault) e.preventDefault(); // DOM Level 2 - else e.returnValue = false; // IE 5+ - - if (document.removeEventListener) { // DOM Level 2 - document.removeEventListener("mouseup", SocialCalc.ButtonMouseUp, true); - } - else if (document.detachEvent) { // IE - bobj.element.detachEvent("onlosecapture", SocialCalc.ButtonMouseUp); - bobj.element.detachEvent("onmouseup", SocialCalc.ButtonMouseUp); - bobj.element.releaseCapture(); - } - - if (buttoninfo.buttonElement.downstyle) { - if (buttoninfo.doingHover) - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.hoverstyle); - else - SocialCalc.setStyles(bobj.element, buttoninfo.buttonElement.normalstyle); - } - - buttoninfo.buttonDown = false; - - if (bobj && bobj.functionobj && bobj.functionobj.MouseUp) bobj.functionobj.MouseUp(e, buttoninfo, bobj); - - } - -// -// ButtonRepeat() -// - -SocialCalc.ButtonRepeat = function() { - - var buttoninfo = SocialCalc.ButtonInfo; - var bobj = buttoninfo.buttonElement; - - if (!bobj) return; - - if (bobj && bobj.functionobj && bobj.functionobj.Repeat) bobj.functionobj.Repeat(null, buttoninfo, bobj); - - buttoninfo.timer = window.setTimeout(SocialCalc.ButtonRepeat, bobj.repeatinterval || 100); - - } - -// ************************************* -// -// MouseWheel functions: -// -// ************************************* - -SocialCalc.MouseWheelInfo = { - - // There is only one of these -- no "new" is done. - // The mousewheel only affects the one area the mouse pointer is over - // The registeredElements array is used to identify items. - - // One item for each element to respond to the mousewheel, each an object with: - // .element, .functionobj - - registeredElements: [] - - } - -// -// MouseWheelRegister(element, functionobj) - make element respond to mousewheel -// - -SocialCalc.MouseWheelRegister = function(element, functionobj) { - - var mousewheelinfo = SocialCalc.MouseWheelInfo; - - mousewheelinfo.registeredElements.push( - {element: element, functionobj: functionobj} - ); - - if (element.addEventListener) { // DOM Level 2 -- Firefox, et al - element.addEventListener("DOMMouseScroll", SocialCalc.ProcessMouseWheel, false); - element.addEventListener("mousewheel", SocialCalc.ProcessMouseWheel, false); // Opera needs this - } - else if (element.attachEvent) { // IE 5+ - element.attachEvent("onmousewheel", SocialCalc.ProcessMouseWheel); - } - else { // don't handle this - throw SocialCalc.Constants.s_BrowserNotSupported; - } - - return; - - } - -SocialCalc.ProcessMouseWheel = function(e) { - - var event = e || window.event; - var delta; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - var mousewheelinfo = SocialCalc.MouseWheelInfo; - var ele = event.target || event.srcElement; // source object is often within what we want - var wobj; - - for (wobj=null; !wobj && ele; ele=ele.parentNode) { // go up tree looking for one of our elements - wobj = SocialCalc.LookupElement(ele, mousewheelinfo.registeredElements); - } - if (!wobj) return; // not one of our elements - - if (event.wheelDelta) { - delta = event.wheelDelta/120; - } - else delta = -event.detail/3; - if (!delta) delta = 0; - - if (wobj.functionobj && wobj.functionobj.WheelMove) wobj.functionobj.WheelMove(event, delta, mousewheelinfo, wobj); - - if (event.preventDefault) event.preventDefault(); - event.returnValue = false; - - } - -// ************************************* -// -// Keyboard functions: -// -// For more information about keyboard handling, see: http://unixpapa.com/js/key.html -// -// ************************************* - -SocialCalc.keyboardTables = { - - specialKeysCommon: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - specialKeysIE: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - controlKeysIE: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]" - }, - - specialKeysOpera: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", - 45: "[ins]", // issues with releases before 9.5 - same as "-" ("-" changed in 9.5) - 46: "[del]", // issues with releases before 9.5 - same as "." ("." changed in 9.5) - 113: "[f2]" - }, - - controlKeysOpera: { - 67: "[ctrl-c]", - 83: "[ctrl-s]", - 86: "[ctrl-v]", - 88: "[ctrl-x]", - 90: "[ctrl-z]" - }, - - specialKeysSafari: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 63232: "[aup]", 63233: "[adown]", - 63234: "[aleft]", 63235: "[aright]", 63272: "[del]", 63273: "[home]", 63275: "[end]", 63276: "[pgup]", - 63277: "[pgdn]", 63237: "[f2]" - }, - - controlKeysSafari: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]" - }, - - ignoreKeysSafari: { - 63236: "[f1]", 63238: "[f3]", 63239: "[f4]", 63240: "[f5]", 63241: "[f6]", 63242: "[f7]", - 63243: "[f8]", 63244: "[f9]", 63245: "[f10]", 63246: "[f11]", 63247: "[f12]", 63289: "[numlock]" - }, - - specialKeysFirefox: { - 8: "[backspace]", 9: "[tab]", 13: "[enter]", 25: "[tab]", 27: "[esc]", 33: "[pgup]", 34: "[pgdn]", - 35: "[end]", 36: "[home]", 37: "[aleft]", 38: "[aup]", 39: "[aright]", 40: "[adown]", 45: "[ins]", - 46: "[del]", 113: "[f2]" - }, - - controlKeysFirefox: { - 99: "[ctrl-c]", - 115: "[ctrl-s]", - 118: "[ctrl-v]", - 120: "[ctrl-x]", - 122: "[ctrl-z]" - }, - - ignoreKeysFirefox: { - 16: "[shift]", 17: "[ctrl]", 18: "[alt]", 20: "[capslock]", 19: "[pause]", 44: "[printscreen]", - 91: "[windows]", 92: "[windows]", 112: "[f1]", 114: "[f3]", 115: "[f4]", 116: "[f5]", - 117: "[f6]", 118: "[f7]", 119: "[f8]", 120: "[f9]", 121: "[f10]", 122: "[f11]", 123: "[f12]", - 144: "[numlock]", 145: "[scrolllock]", 224: "[cmd]" - } - } - -SocialCalc.Keyboard = { - areListener: false, // if true, we have been installed as a listener for keyboard events - focusTable: null, // the table editor object that gets keystrokes or null - passThru: null, // if not null, control element with focus to pass keyboard events to (has blur method), or "true" - didProcessKey: false, // did SocialCalc.ProcessKey in keydown - statusFromProcessKey: false, // the status from the keydown SocialCalc.ProcessKey - repeatingKeyPress: false, // some browsers (Opera, Gecko Mac) repeat special keys as KeyPress not KeyDown - chForProcessKey: "" // remember so can do repeat in those cases - }; - -SocialCalc.KeyboardSetFocus = function(editor) { - - SocialCalc.Keyboard.focusTable = editor; - - if (!SocialCalc.Keyboard.areListener) { - document.onkeydown = SocialCalc.ProcessKeyDown; - document.onkeypress = SocialCalc.ProcessKeyPress; - SocialCalc.Keyboard.areListener = true; - } - if (SocialCalc.Keyboard.passThru) { - if (SocialCalc.Keyboard.passThru.blur) { - SocialCalc.Keyboard.passThru.blur(); - } - SocialCalc.Keyboard.passThru = null; - } - window.focus(); - } - -SocialCalc.KeyboardFocus = function() { - - SocialCalc.Keyboard.passThru = null; - window.focus(); - - } - -SocialCalc.ProcessKeyDown = function(e) { - - var kt = SocialCalc.keyboardTables; - kt.didProcessKey = false; // always start false - kt.statusFromProcessKey = false; - kt.repeatingKeyPress = false; - - var ch=""; - var status=true; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - // IE and Safari 3.1+ won't fire keyPress, so check for special keys here. - if (e.which==undefined || (typeof e.keyIdentifier == "string")) { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { - if (e.ctrlKey) { - ch=kt.controlKeysIE[e.keyCode]; - } - if (!ch) - return true; - } - status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - } - - else { - ch = kt.specialKeysCommon[e.keyCode]; - if (!ch) { -// return true; - if (e.ctrlKey || e.metaKey) { - ch=kt.controlKeysIE[e.keyCode]; // this works here - } - if (!ch) - return true; - } - - status = SocialCalc.ProcessKey(ch, e); // process the key - kt.didProcessKey = true; // remember what happened - kt.statusFromProcessKey = status; - kt.chForProcessKey = ch; - } - - return status; - - } - -SocialCalc.ProcessKeyPress = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - - e = e || window.event; - - if (SocialCalc.Keyboard.passThru) return; // ignore - if (kt.didProcessKey) { // already processed this key - if (kt.repeatingKeyPress) { - return SocialCalc.ProcessKey(kt.chForProcessKey, e); // process the same key as on KeyDown - } - else { - kt.repeatingKeyPress = true; // see if get another KeyPress before KeyDown - return kt.statusFromProcessKey; // do what it said to do - } - } - - if (e.which==undefined) { // IE - // Note: Esc and Enter will come through here, too, if not stopped at KeyDown - ch=String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) - } - - else { // not IE - if (!e.which) - return false; // ignore - special key - if (e.charCode==undefined) { // Opera - if (e.which!=0) { // character - if (e.which<32 || e.which==144) { // special char (144 is numlock) - ch = kt.specialKeysOpera[e.which]; - if (ch) { - return true; - } - } - else { - if (e.ctrlKey) { - ch=kt.controlKeysOpera[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - else { // special char - return true; - } - } - - else if (e.keyCode==0 && e.charCode==0) { // OLPC Fn key or something - return; // ignore - } - - else if (e.keyCode==e.charCode) { // Safari - ch = kt.specialKeysSafari[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysSafari[e.keyCode]) // pass this through - return true; - if (e.metaKey) { - ch=kt.controlKeysSafari[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - - else { // Firefox - if (kt.specialKeysFirefox[e.keyCode]) { - return true; - } - ch = String.fromCharCode(e.which); - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysFirefox[e.which]; - } - } - } - - var status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - - return status; - - } - -/* - * - * OLD ProcessKeyDown and ProcessKeyPress -- replaced for handling newer browsers, including Safari 3.1 and Opera 9.5 - * - -SocialCalc.ProcessKeyDown = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - var status=true; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - if (e.which==undefined) { // IE - ch = kt.specialKeysIE[e.keyCode]; - if (!ch) { - if (e.ctrlKey) { - ch=kt.controlKeysIE[e.keyCode]; - } - if (!ch) - return true; - } - - status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - } - - else { // don't do anything for other browsers - wait for keyPress - ; // special key repeats are done as keypress in those browsers - } - - return status; - - } - -SocialCalc.ProcessKeyPress = function(e) { - - var kt = SocialCalc.keyboardTables; - - var ch=""; - - if (SocialCalc.Keyboard.passThru) return; // ignore - - e = e || window.event; - - if (e.which==undefined) { // IE - // Note: Esc and Enter will come through here, too, if not stopped at KeyDown - ch=String.fromCharCode(e.keyCode); // convert to a character (special chars handled at ev1) - } - - else { // not IE - if (e.charCode==undefined) { // Opera - if (e.which!=0) { // character - if (e.which<32) { // special char - ch = kt.specialKeysOpera[e.keyCode]; - if (!ch) - return true; - } - else { - if (e.ctrlKey) { - ch=kt.controlKeysOpera[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - else { // special char - ch = kt.specialKeysOpera[e.keyCode]; - if (!ch) - return true; - } - } - - else if (e.keyCode==0 && e.charCode==0) { // OLPC Fn key or something - return; // ignore - } - - else if (e.keyCode==e.charCode) { // Safari - ch = kt.specialKeysSafari[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysSafari[e.keyCode]) // pass this through - return true; - if (e.metaKey) { - ch=kt.controlKeysSafari[e.keyCode]; - } - else { - ch = String.fromCharCode(e.which); - } - } - } - - else { // Firefox - ch = kt.specialKeysFirefox[e.keyCode]; - if (!ch) { - if (kt.ignoreKeysFirefox[e.keyCode]) // pass this through - return true; - if (e.which) { // normal char - if (e.ctrlKey || e.metaKey) { - ch = kt.controlKeysFirefox[e.which]; - } - else { - ch = String.fromCharCode(e.which); - } - } - else { // usually a special char - return true; // old Firefox gives extra, empty keyPress for "/" - ignore - } - } - } - } - - var status = SocialCalc.ProcessKey(ch, e); - - if (!status) { - if (e.preventDefault) e.preventDefault(); - e.returnValue = false; - } - - return status; - - } -*/ - -// -// status = SocialCalc.ProcessKey(ch, e) -// -// Take a key representation as a character string and dispatch to appropriate routine -// - -SocialCalc.ProcessKey = function (ch, e) { - - var ft = SocialCalc.Keyboard.focusTable; - - if (!ft) return true; // we're not handling it -- let browser do default - - return ft.EditorProcessKey(ch, e); - - } - - diff --git a/Website/static/socialcalctouch.js b/Website/static/socialcalctouch.js deleted file mode 100644 index 79cbe8a..0000000 --- a/Website/static/socialcalctouch.js +++ /dev/null @@ -1,350 +0,0 @@ -// -// socialcalctouch adds touch gestures to SocialCalc -// -// As a start, touch gestures are modeled similar to -// mouse events -// -// Author: Ramu Ramamurthy -// -// -// - -// -// -// To initialize, SocialCalc.CreateTableEditor must call -// SocialCalc.TouchRegister(editor.toplevel, {Swipe: SocialCalc.EditorProcessSwipe, editor: editor}); -// Also, any element create inside the grid needs to be touch registered for it to work -// this includes buttons, etc -// -// TestCases: -// 1) tap to point to cell, and to move edit-cell -// 2) double-tap on a cell to open edit-box, then tap on edit box to pullup keyboard -// -- when editing, tap on any other cell to be done with edit -// *** figure out escape to cancel edit versus return to accept edit -// -- when editing, and if = seen than tapping on cell puts the cell name into the edit box -// 3) tap on input box on top opens edit on cell -// tap on any cell accepts and finishes this edit -// *** need a way to cancel the edit versus accept the edit -// -// 4) tap on a cell and move finger starts a range -// removing finger completes the range -// tap on cell cancels range -// -// 5) a swipe action scrolls the sheet -// swipe up/dn scrolls up/dn -// swipe lt/rt scrolls lt/rt -// -// -// Wishlist: -// 1) smooth scroll will be nice (in addition to swipe) -- using a two-touch pan ? -// - - -var SocialCalc; -if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; -} - -// ************************************* -// -// Touch functions: -// -// ************************************* - -SocialCalc.HasTouch = false; - -(function() { - // platform specific registration - var agent = navigator.userAgent.toLowerCase(); - - if(agent.indexOf('iphone') >= 0 || agent.indexOf('ipad') >= 0 || agent.indexOf('android') >= 0){ - SocialCalc.HasTouch = true; - } -})(); - - - -SocialCalc.TouchInfo = { - - // In sequence the following will be implemented - // swipe up/dn, left/right will scroll up/dn/left/right respectively - // - // touch on a cell will move ecell to that cell - // repeated touch on a cell will start edit on that cell - // touch on another cell will cancel edit if it was in progress (?) - // etc - // - // touch on buttons will activate the buttons - // - // The registeredElements array is used to identify items. - - // One item for each element to respond to the touch, each an object with: - // .element, .functionobj - - registeredElements: [], - - // for swipe - threshold_x : 20, - threshold_y : 20, - - orig_coord_x : 0, - orig_coord_y : 0, - final_coord_x : 0, - final_coord_y : 0, - - px_to_rows : 20, // 20 pixels is 1 row scroll - px_to_cols : 20, // 20 pixels is 1 col scroll - - touch_start : 0, - ranging : false, - ranging_threshold : 100, - move_start: 0, - - last_touch : 0, - timeout_handle : null, - doubletap_threshold: 500 // max milliseconds between taps - -}; - - -// -// TouchRegister(element, functionobj) - make element respond to touch -// - -SocialCalc.TouchRegister = function(element, functionobj) { - - - if (!SocialCalc.HasTouch) { - return; - } - - var touchinfo = SocialCalc.TouchInfo; - - if (SocialCalc.LookupElement(element, touchinfo.registeredElements)) { - // already registered - return; - } - - - touchinfo.registeredElements.push({ - element: element, - functionobj: functionobj - } - ); - - if (SocialCalc.HasTouch && element.addEventListener) { // Webkit based (?) - element.addEventListener("touchstart", SocialCalc.ProcessTouchStart, false); - element.addEventListener("touchmove", SocialCalc.ProcessTouchMove, false); - element.addEventListener("touchend", SocialCalc.ProcessTouchEnd, false); - element.addEventListener("touchcancel", SocialCalc.ProcessTouchCancel, false); - //element.addEventListener("onorientationchange", SocialCalc.ProcessOrientationChange, false); - } -}; - -SocialCalc.FindTouchElement = function(event) { - - var touchinfo = SocialCalc.TouchInfo; - - var event = event || window.event; - - var ele = event.target || event.srcElement; // investigate - - for (wobj=null; !wobj && ele; ele=ele.parentNode) { // investigate - wobj = SocialCalc.LookupElement(ele, touchinfo.registeredElements); - } - - return wobj; - -} - -SocialCalc.ProcessTouchStart = function(event) { - - var touchinfo = SocialCalc.TouchInfo; - touchinfo.orig_coord_x = event.targetTouches[0].pageX; - touchinfo.orig_coord_y = event.targetTouches[0].pageY; - - touchinfo.final_coord_x = touchinfo.orig_coord_x; - touchinfo.final_coord_y = touchinfo.orig_coord_y; - - touchinfo.touch_start = new Date().getTime() - - event.preventDefault(); -}; - -SocialCalc.TouchGetSimulatedMouseEvent = function(event, mouse_evt_name) { - var touches = event.changedTouches; - var first = touches[0]; - var simulatedEvent = document.createEvent("MouseEvent"); - simulatedEvent.initMouseEvent(mouse_evt_name, true, true, window, 1, - first.screenX, first.screenY, - first.clientX, first.clientY, false, - false, false, false, 0, null); - return simulatedEvent; -} - -SocialCalc.ProcessTouchMove = function(event) { - - - var touchinfo = SocialCalc.TouchInfo; - touchinfo.final_coord_x = event.targetTouches[0].pageX; - touchinfo.final_coord_y = event.targetTouches[0].pageY; - - - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) return; // not one of our elements - - if (touchinfo.move_start == 0) { - touchinfo.move_start = new Date().getTime(); - if (touchinfo.move_start - touchinfo.touch_start > touchinfo.ranging_threshold) { - // This is a delayed move - // send a mouse down event - // This is for ranging and dragging - - touchinfo.ranging = true; - var mouseDn = SocialCalc.TouchGetSimulatedMouseEvent(event, "mousedown"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDn); - } - } else if (touchinfo.ranging) { - // already ranging - // send a mouse move event - - var mouseMv = SocialCalc.TouchGetSimulatedMouseEvent(event, "mousemove"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseMv); - } - - event.preventDefault(); -}; - -SocialCalc.ProcessTouchEnd = function(e) { - - var touchinfo = SocialCalc.TouchInfo; - - var changeX = touchinfo.orig_coord_x - touchinfo.final_coord_x; - var changeY = touchinfo.orig_coord_y - touchinfo.final_coord_y; - - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) return; // not one of our elements - - var event = e || window.event; - - touchinfo.move_start = 0; - touchinfo.touch_start = 0; - - if (touchinfo.ranging) { - // in ranging, and dragging - // send a mouseup event - touchinfo.ranging = false; - var mouseUp = SocialCalc.TouchGetSimulatedMouseEvent(event, "mouseup"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseUp); - - } else if ( (Math.abs(changeY) > touchinfo.threshold_y) || - (Math.abs(changeX) > touchinfo.threshold_x) ) { - - // check for swipe - - var amount_y = Math.floor(changeY / touchinfo.px_to_rows); - var amount_x = Math.floor(changeX / touchinfo.px_to_cols); - if (wobj.functionobj && wobj.functionobj.Swipe) { - wobj.functionobj.Swipe(event, touchinfo, wobj, amount_y, amount_x); - } - - } else { - - // detect a double tap - var now = new Date().getTime() - var lasttouch = touchinfo.last_touch || now + 1 - var delta = now - lasttouch; - if (touchinfo.timeout_handle) { - clearTimeout(touchinfo.timeout_handle); - touchinfo.timeout_handle = null; - } - - if ((delta < touchinfo.doubletap_threshold) && (delta > 0)) { - // doubletap seen - if (wobj.functionobj && wobj.functionobj.DoubleTap) { - wobj.functionobj.DoubleTap(event, touchinfo, wobj); - } - } else { - // this is a single tap - touchinfo.last_touch = now; - var timeoutFn = function() { - if (wobj.functionobj && wobj.functionobj.SingleTap) { - wobj.functionobj.SingleTap(event, touchinfo, wobj); - } - }; - touchinfo.timeout_handle = setTimeout(timeoutFn(), touchinfo.doubletap_threshold); - } - touchinfo.last_touch = now; - } - e.preventDefault(); -}; - -SocialCalc.ProcessTouchCancel = function(event) { - - var wobj = SocialCalc.FindTouchElement(event); - - if (!wobj) { - return; // do default behavior - } - - var touchinfo = SocialCalc.TouchInfo; - touchinfo.orig_coord_x = 0; - touchinfo.orig_coord_y = 0; - touchinfo.final_coord_x = 0; - touchinfo.final_coord_y = 0; - touchinfo.move_start = 0; - touchinfo.touch_start = 0; - touchinfo.ranging = false; -}; - -SocialCalc.EditorProcessSwipe = function(event, touchinfo, wobj, swipevert, swipehoriz) { - - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - - if ((swipevert != 0) || (swipehoriz != 0) ) { - - wobj.functionobj.editor.ScrollRelativeBoth(swipevert,swipehoriz); - - } - -}; - - -SocialCalc.EditorProcessSingleTap = function(event, touchinfo, wobj) { - - - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - - // send mouse down - var mouseDn = SocialCalc.TouchGetSimulatedMouseEvent(event, "mousedown"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDn); - - // then send mouse up - var mouseUp = SocialCalc.TouchGetSimulatedMouseEvent(event, "mouseup"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseUp); - -}; - - -SocialCalc.EditorProcessDoubleTap = function(event, touchinfo, wobj) { - - if (wobj.functionobj.editor.busy) { - return; // ignore if busy - } - // simulate a mouse double click - var mouseDblClick = SocialCalc.TouchGetSimulatedMouseEvent(event, "dblclick"); - wobj.functionobj.editor.fullgrid.dispatchEvent(mouseDblClick); - -}; - - -SocialCalc.ProcessOrientationChange = function(event) { - alert(window.orientation); -}; diff --git a/Website/static/socialcalcviewer.js b/Website/static/socialcalcviewer.js deleted file mode 100644 index 7abcf8b..0000000 --- a/Website/static/socialcalcviewer.js +++ /dev/null @@ -1,687 +0,0 @@ -// -// SocialCalcViewer -// -/* -// The code module of the SocialCalc package that lets you embed a spreadsheet viewer -// with an optional simple toolbar into a web page. -// -// (c) Copyright 2008, 2009, 2010 Socialtext, Inc. -// All Rights Reserved. -// -*/ - -/* - -LEGAL NOTICES REQUIRED BY THE COMMON PUBLIC ATTRIBUTION LICENSE: - -EXHIBIT A. Common Public Attribution License Version 1.0. - -The contents of this file are subject to the Common Public Attribution License Version 1.0 (the -"License"); you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://socialcalc.org. The License is based on the Mozilla Public License Version 1.1 but -Sections 14 and 15 have been added to cover use of software over a computer network and provide for -limited attribution for the Original Developer. In addition, Exhibit A has been modified to be -consistent with Exhibit B. - -Software distributed under the License 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 Original Code is SocialCalc JavaScript SpreadsheetViewer. - -The Original Developer is the Initial Developer. - -The Initial Developer of the Original Code is Socialtext, Inc. All portions of the code written by -Socialtext, Inc., are Copyright (c) Socialtext, Inc. All Rights Reserved. - -Contributor: Dan Bricklin. - - -EXHIBIT B. Attribution Information - -When the SpreadsheetViewer is producing and/or controlling the display the Graphic Image must be -displayed on the screen visible to the user in a manner comparable to that in the -Original Code. The Attribution Phrase must be displayed as a "tooltip" or "hover-text" for -that image. The image must be linked to the Attribution URL so as to access that page -when clicked. If the user interface includes a prominent "about" display which includes -factual prominent attribution in a form similar to that in the "about" display included -with the Original Code, including Socialtext copyright notices and URLs, then the image -need not be linked to the Attribution URL but the "tool-tip" is still required. - -Attribution Copyright Notice: - - Copyright (C) 2010 Socialtext, Inc. - All Rights Reserved. - -Attribution Phrase (not exceeding 10 words): SocialCalc - -Attribution URL: http://www.socialcalc.org/ - -Graphic Image: The contents of the sc-logo.gif file in the Original Code or -a suitable replacement from http://www.socialcalc.org/licenses specified as -being for SocialCalc. - -Display of Attribution Information is required in Larger Works which are defined -in the CPAL as a work which combines Covered Code or portions thereof with code -not governed by the terms of the CPAL. - -*/ - -// -// Some of the other files in the SocialCalc package are licensed under -// different licenses. Please note the licenses of the modules you use. -// -// Code History: -// -// Initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc. -// Unless otherwise specified, referring to "SocialCalc" in comments refers to this -// JavaScript version of the code, not the SocialCalc Perl code. -// - -/* - -See the comments in the main SocialCalc code module file of the SocialCalc package. - -*/ - - var SocialCalc; - if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; - } - if (!SocialCalc.TableEditor) { - alert("SocialCalc TableEditor code module needed"); - } - -// ************************************* -// -// SpreadsheetViewer class: -// -// ************************************* - -// Global constants: - - SocialCalc.CurrentSpreadsheetViewerObject = null; // right now there can only be one active at a time - - -// Constructor: - -SocialCalc.SpreadsheetViewer = function() { - - var scc = SocialCalc.Constants; - - // Properties: - - this.parentNode = null; - this.spreadsheetDiv = null; - this.requestedHeight = 0; - this.requestedWidth = 0; - this.requestedSpaceBelow = 0; - this.height = 0; - this.width = 0; - this.viewheight = 0; // calculated amount for views below toolbar, etc. - - // Dynamic properties: - - this.sheet = null; - this.context = null; - this.editor = null; - - this.spreadsheetDiv = null; - this.editorDiv = null; - - this.sortrange = ""; // remembered range for sort tab - - // Constants: - - this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-" - this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src - - this.statuslineheight = scc.SVStatuslineheight; // in pixels - this.statuslineCSS = scc.SVStatuslineCSS; - - // Callbacks: - - // Initialization Code: - - this.sheet = new SocialCalc.Sheet(); - this.context = new SocialCalc.RenderContext(this.sheet); - this.context.showGrid=true; - this.context.showRCHeaders=true; - this.editor = new SocialCalc.TableEditor(this.context); - this.editor.noEdit = true; - this.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetViewerStatuslineCallback, - params: {}}; - this.hasStatusLine = true; // default -// this.statuslineHTML = '
    {status}Will be link
    '; - this.statuslineHTML = '
    {status} 
    '; - this.statuslineFull = true; - this.noRecalc = true; // don't do a recalc when loaded, so no need for external sheet routines - - // Repeating macro info - - this.repeatingMacroTimer = null; - this.repeatingMacroInterval = 60; // default to 60 seconds - this.repeatingMacroCommands = ""; // what to execute - - - SocialCalc.CurrentSpreadsheetViewerObject = this; // remember this for rendezvousing on events - - return; - - } - -// Methods: - -SocialCalc.SpreadsheetViewer.prototype.InitializeSpreadsheetViewer = - function(node, height, width, spacebelow) {return SocialCalc.InitializeSpreadsheetViewer(this, node, height, width, spacebelow);}; -SocialCalc.SpreadsheetViewer.prototype.LoadSave = function(str) {return SocialCalc.SpreadsheetViewerLoadSave(this, str);}; -SocialCalc.SpreadsheetViewer.prototype.DoOnResize = function() {return SocialCalc.DoOnResize(this);}; -SocialCalc.SpreadsheetViewer.prototype.SizeSSDiv = function() {return SocialCalc.SizeSSDiv(this);}; -SocialCalc.SpreadsheetViewer.prototype.DecodeSpreadsheetSave = - function(str) {return SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave(this, str);}; - -// Sheet Methods to make things a little easier: - -SocialCalc.SpreadsheetViewer.prototype.ParseSheetSave = function(str) {return this.sheet.ParseSheetSave(str);}; - - -// Functions: - -// -// InitializeSpreadsheetViewer(spreadsheet, node, height, width, spacebelow) -// -// Creates the control elements and makes them the child of node (string or element). -// If present, height and width specify size. -// If either is 0 or null (missing), the maximum that fits on the screen -// (taking spacebelow into account) is used. -// -// You should do a redisplay or recalc (which redisplays) after running this. -// - -SocialCalc.InitializeSpreadsheetViewer = function(spreadsheet, node, height, width, spacebelow) { - - var scc = SocialCalc.Constants; - var SCLoc = SocialCalc.LocalizeString; - var SCLocSS = SocialCalc.LocalizeSubstrings; - - var html, child, i, vname, v, style, button, bele; - var tabs = spreadsheet.tabs; - var views = spreadsheet.views; - - spreadsheet.requestedHeight = height; - spreadsheet.requestedWidth = width; - spreadsheet.requestedSpaceBelow = spacebelow; - - if (typeof node == "string") node = document.getElementById(node); - - if (node == null) { - alert("SocialCalc.SpreadsheetControl not given parent node."); - } - - spreadsheet.parentNode = node; - - // create node to hold spreadsheet view - - spreadsheet.spreadsheetDiv = document.createElement("div"); - - spreadsheet.SizeSSDiv(); // calculate and fill in the size values - - for (child=node.firstChild; child!=null; child=node.firstChild) { - node.removeChild(child); - } - - node.appendChild(spreadsheet.spreadsheetDiv); - - // create sheet div - - spreadsheet.nonviewheight = spreadsheet.hasStatusLine ? spreadsheet.statuslineheight : 0; - spreadsheet.viewheight = spreadsheet.height-spreadsheet.nonviewheight; - spreadsheet.editorDiv=spreadsheet.editor.CreateTableEditor(spreadsheet.width, spreadsheet.viewheight); - - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.editorDiv); - - // create statusline - - if (spreadsheet.hasStatusLine) { - spreadsheet.statuslineDiv = document.createElement("div"); - spreadsheet.statuslineDiv.style.cssText = spreadsheet.statuslineCSS; - spreadsheet.statuslineDiv.style.height = spreadsheet.statuslineheight - - (spreadsheet.statuslineDiv.style.paddingTop.slice(0,-2)-0) - - (spreadsheet.statuslineDiv.style.paddingBottom.slice(0,-2)-0) + "px"; - spreadsheet.statuslineDiv.id = spreadsheet.idPrefix+"statusline"; - spreadsheet.spreadsheetDiv.appendChild(spreadsheet.statuslineDiv); - spreadsheet.editor.StatusCallback.statusline = - {func: SocialCalc.SpreadsheetViewerStatuslineCallback, - params: {spreadsheetobj:spreadsheet}}; - } - - // done - refresh screen needed - - return; - - } - -SocialCalc.SpreadsheetViewerLoadSave = function(spreadsheet, savestr) { - - var rmstr, pos, t, t2; - - var parts = spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - spreadsheet.sheet.ResetSheet(); - spreadsheet.sheet.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) { // executed now - spreadsheet.editor.EditorScheduleSheetCommands(savestr.substring(parts.startupmacro.start, parts.startupmacro.end), false, true); - } - if (parts.repeatingmacro) { // first line tells how many seconds before first execution. Last cmd must be "cmdextension repeatmacro delay" to continue repeating. - rmstr = savestr.substring(parts.repeatingmacro.start, parts.repeatingmacro.end); - rmstr = rmstr.replace("\r", ""); // make sure no CR, only LF - pos = rmstr.indexOf("\n"); - if (pos > 0) { - t = rmstr.substring(0, pos)-0; // get number - t2 = t; -// if (!(t > 0)) t = 60; // handles NAN, too - spreadsheet.repeatingMacroInterval = t; - spreadsheet.repeatingMacroCommands = rmstr.substring(pos+1); - if (t2 > 0) { // zero means don't start yet - spreadsheet.repeatingMacroTimer = window.setTimeout(SocialCalc.SpreadsheetViewerDoRepeatingMacro, spreadsheet.repeatingMacroInterval * 1000); - } - } - } - } - if (spreadsheet.editor.context.sheetobj.attribs.recalc=="off" || spreadsheet.noRecalc) { - spreadsheet.editor.ScheduleRender(); - } - else { - spreadsheet.editor.EditorScheduleSheetCommands("recalc"); - } - } - -// -// SocialCalc.SpreadsheetViewerDoRepeatingMacro -// -// Called by a timer. Executes repeatingMacroCommands once. -// Use the "startcmdextension repeatmacro delay" command last to schedule this again. -// - -SocialCalc.SpreadsheetViewerDoRepeatingMacro = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - var editor = spreadsheet.editor; - - spreadsheet.repeatingMacroTimer = null; - - SocialCalc.SheetCommandInfo.CmdExtensionCallbacks.repeatmacro = {func:SocialCalc.SpreadsheetViewerRepeatMacroCommand, data:null}; - - editor.EditorScheduleSheetCommands(spreadsheet.repeatingMacroCommands); - -} - -SocialCalc.SpreadsheetViewerRepeatMacroCommand = function(name, data, sheet, cmd, saveundo) { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - - var rest = cmd.RestOfString(); - var t = rest-0; // get number - if (!(t > 0)) t = spreadsheet.repeatingMacroInterval; // handles NAN, too, using last value - spreadsheet.repeatingMacroInterval = t; - - spreadsheet.repeatingMacroTimer = window.setTimeout(SocialCalc.SpreadsheetViewerDoRepeatingMacro, spreadsheet.repeatingMacroInterval * 1000); - -} - -SocialCalc.SpreadsheetViewerStopRepeatingMacro = function() { - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - - if (spreadsheet.repeatingMacroTimer) { - window.clearTimeout(spreadsheet.repeatingMacroTimer); - spreadsheet.repeatingMacroTimer = null; - } -} - -// -// SocialCalc.SpreadsheetViewerDoButtonCmd(e, buttoninfo, bobj) -// -// xxx -// - -SocialCalc.SpreadsheetViewerDoButtonCmd = function(e, buttoninfo, bobj) { - - var obj = bobj.element; - var which = bobj.functionobj.command; - - var spreadsheet = SocialCalc.GetSpreadsheetViewerObject(); - var editor = spreadsheet.editor; - - switch (which) { - case "recalc": - editor.EditorScheduleSheetCommands("recalc"); - break; - - default: - break; - } - - if (obj && obj.blur) obj.blur(); - SocialCalc.KeyboardFocus(); - - } - - -// -// outstr = SocialCalc.LocalizeString(str) -// -// SocialCalc function to make localization easier. -// If str is "Text to localize", it returns -// SocialCalc.Constants.s_loc_text_to_localize if -// it exists, or else with just "Text to localize". -// Note that spaces are replaced with "_" and other special -// chars with "X" in the name of the constant (e.g., "A & B" -// would look for SocialCalc.Constants.s_loc_a_X_b. -// - -SocialCalc.LocalizeString = function(str) { - var cstr = SocialCalc.LocalizeStringList[str]; // found already this session? - if (!cstr) { // no - look up - cstr = SocialCalc.Constants["s_loc_"+str.toLowerCase().replace(/\s/g, "_").replace(/\W/g, "X")] || str; - SocialCalc.LocalizeStringList[str] = cstr; - } - return cstr; - } - -SocialCalc.LocalizeStringList = {}; // a list of strings to localize accumulated by the routine - -// -// outstr = SocialCalc.LocalizeSubstrings(str) -// -// SocialCalc function to make localization easier using %loc and %scc. -// -// Replaces sections of str with: -// %loc!Text to localize! -// with SocialCalc.Constants.s_loc_text_to_localize if -// it exists, or else with just "Text to localize". -// Note that spaces are replaced with "_" and other special -// chars with "X" in the name of the constant (e.g., %loc!A & B! -// would look for SocialCalc.Constants.s_loc_a_X_b. -// Uses SocialCalc.LocalizeString for this. -// -// Replaces sections of str with: -// %ssc!constant-name! -// with SocialCalc.Constants.constant-name. -// If the constant doesn't exist, throws and alert. -// - -SocialCalc.LocalizeSubstrings = function(str) { - - var SCLoc = SocialCalc.LocalizeString; - - return str.replace(/%(loc|ssc)!(.*?)!/g, function(a, t, c) { - if (t=="ssc") { - return SocialCalc.Constants[c] || alert("Missing constant: "+c); - } - else { - return SCLoc(c); - } - }); - - } - -// -// obj = GetSpreadsheetViewerObject() -// -// Returns the current spreadsheet view object -// - -SocialCalc.GetSpreadsheetViewerObject = function() { - - var csvo = SocialCalc.CurrentSpreadsheetViewerObject; - if (csvo) return csvo; - - throw ("No current SpreadsheetViewer object."); - - } - - -// -// SocialCalc.DoOnResize(spreadsheet) -// -// Processes an onResize event, setting the different views. -// - -SocialCalc.DoOnResize = function(spreadsheet) { - - var v; - var views = spreadsheet.views; - - var needresize = spreadsheet.SizeSSDiv(); - if (!needresize) return; - - for (vname in views) { - v = views[vname].element; - v.style.width = spreadsheet.width + "px"; - v.style.height = (spreadsheet.height-spreadsheet.nonviewheight) + "px"; - } - - spreadsheet.editor.ResizeTableEditor(spreadsheet.width, spreadsheet.height-spreadsheet.nonviewheight); - - } - - -// -// resized = SocialCalc.SizeSSDiv(spreadsheet) -// -// Figures out a reasonable size for the spreadsheet, given any requested values and viewport. -// Sets ssdiv to that. -// Return true if different than existing values. -// - -SocialCalc.SizeSSDiv = function(spreadsheet) { - - var sizes, pos, resized, nodestyle, newval; - var fudgefactorX = 10; // for IE - var fudgefactorY = 10; - - resized = false; - - sizes = SocialCalc.GetViewportInfo(); - pos = SocialCalc.GetElementPosition(spreadsheet.parentNode); - pos.bottom = 0; - pos.right = 0; - - nodestyle = spreadsheet.parentNode.style; - - if (nodestyle.marginTop) { - pos.top += nodestyle.marginTop.slice(0,-2)-0; - } - if (nodestyle.marginBottom) { - pos.bottom += nodestyle.marginBottom.slice(0,-2)-0; - } - if (nodestyle.marginLeft) { - pos.left += nodestyle.marginLeft.slice(0,-2)-0; - } - if (nodestyle.marginRight) { - pos.right += nodestyle.marginRight.slice(0,-2)-0; - } - - newval = spreadsheet.requestedHeight || - sizes.height - (pos.top + pos.bottom + fudgefactorY) - - (spreadsheet.requestedSpaceBelow || 0); - if (spreadsheet.height != newval) { - spreadsheet.height = newval; - spreadsheet.spreadsheetDiv.style.height = newval + "px"; - resized = true; - } - newval = spreadsheet.requestedWidth || - sizes.width - (pos.left + pos.right + fudgefactorX) || 700; - if (spreadsheet.width != newval) { - spreadsheet.width = newval; - spreadsheet.spreadsheetDiv.style.width = newval + "px"; - resized = true; - } - - return resized; - - } - - -// -// SocialCalc.SpreadsheetViewerStatuslineCallback -// - -SocialCalc.SpreadsheetViewerStatuslineCallback = function(editor, status, arg, params) { - - var spreadsheet = params.spreadsheetobj; - var slstr = ""; - - if (spreadsheet && spreadsheet.statuslineDiv) { - if (spreadsheet.statuslineFull) { - slstr = editor.GetStatuslineString(status, arg, params); - } - else { - slstr = editor.ecell.coord; - } - slstr = spreadsheet.statuslineHTML.replace(/\{status\}/, slstr); - spreadsheet.statuslineDiv.innerHTML = slstr; - } - - switch (status) { - case "cmdendnorender": - case "calcfinished": - case "doneposcalc": - break; // not updating Recalc button since no toolbar - - default: - break; - } - - } - - -// -// SocialCalc.CmdGotFocus(obj) -// -// Sets SocialCalc.Keyboard.passThru: obj should be element with focus or "true" -// - -SocialCalc.CmdGotFocus = function(obj) { - - SocialCalc.Keyboard.passThru = obj; - - } - - -// -// result = SocialCalc.SpreadsheetViewerCreateSheetHTML(spreadsheet) -// -// Returns the HTML representation of the whole spreadsheet -// - -SocialCalc.SpreadsheetViewerCreateSheetHTML = function(spreadsheet) { - - var context, div, ele; - - var result = ""; - - context = new SocialCalc.RenderContext(spreadsheet.sheet); - div = document.createElement("div"); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - result = div.innerHTML; - delete ele; - delete div; - return result; - - } - - -/////////////////////// -// -// LOAD ROUTINE -// -/////////////////////// - -// -// parts = SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave(spreadsheet, str) -// -// Separates the parts from a spreadsheet save string, returning an object with the sub-strings. -// -// {type1: {start: startpos, end: endpos}, type2:...} -// - -SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave = function(spreadsheet, str) { - - var pos1, mpregex, searchinfo, boundary, boundaryregex, blanklineregex, start, ending, lines, i, lines, p, pnun; - var parts = {}; - var partlist = []; - -var hasreturnonly = /[^\n]\r[^\n]/; -if (hasreturnonly.test(str)) { -str = str.replace(/([^\n])\r([^\n])/g, "$1\r\n$2"); -} - pos1 = str.search(/^MIME-Version:\s1\.0/mi); - if (pos1 < 0) return parts; - - mpregex = /^Content-Type:\s*multipart\/mixed;\s*boundary=(\S+)/mig; - mpregex.lastIndex = pos1; - - searchinfo = mpregex.exec(str); - if (mpregex.lastIndex <= 0) return parts; - boundary = searchinfo[1]; - - boundaryregex = new RegExp("^--"+boundary+"(?:\r\n|\n)", "mg"); - boundaryregex.lastIndex = mpregex.lastIndex; - - searchinfo = boundaryregex.exec(str); // find header top boundary - blanklineregex = /(?:\r\n|\n)(?:\r\n|\n)/gm; - blanklineregex.lastIndex = boundaryregex.lastIndex; - searchinfo = blanklineregex.exec(str); // skip to after blank line - if (!searchinfo) return parts; - start = blanklineregex.lastIndex; - boundaryregex.lastIndex = start; - searchinfo = boundaryregex.exec(str); // find end of header - if (!searchinfo) return parts; - ending = searchinfo.index; - - lines = str.substring(start, ending).split(/\r\n|\n/); // get header as lines - for (i=0;i'+ -//'
    '+ -//''+ -//''+ -//''+ - -// ''+ -// ''+ -// ''+ - -//''+ -//''+ -//'
    '+ -//''; - - SocialCalc.CurrentWorkbookControlObject = this; - this.sheetbar = new SocialCalc.SheetBar(); -} - -// methods -SocialCalc.WorkBookControl.prototype.GetCurrentWorkBookControl = function() {return SocialCalc.GetCurrentWorkBookControl();}; -SocialCalc.WorkBookControl.prototype.InitializeWorkBookControl = function() {return SocialCalc.InitializeWorkBookControl(this);}; - - -SocialCalc.WorkBookControl.prototype.ExecuteWorkBookControlCommand = function(cmd, isremote) { - return SocialCalc.ExecuteWorkBookControlCommand(this, cmd, isremote); -} - -SocialCalc.ExecuteWorkBookControlCommand = function(control, cmd, isremote) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - //if (!isremote) { - // return; - //} - - if (cmd.cmdtype == "scmd") { - // dispatch a sheet command - control.workbook.WorkbookScheduleCommand(cmd, isremote); - return; - - } - - if (cmd.cmdtype != "wcmd") { - return; - } - - var parseobj = new SocialCalc.Parse(cmd.cmdstr); - - var cmd1 = parseobj.NextToken(); - - switch (cmd1) { - case "addsheet": - SocialCalc.WorkBookControlAddSheetRemote(null); - break; - - case "addsheetstr": - var sheetstr = cmd.sheetstr; - SocialCalc.WorkBookControlAddSheetRemote(sheetstr); - break; - - case "delsheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlDelSheetRemote(sheetid); - break; - - case "rensheet": - var sheetid = parseobj.NextToken(); - var oldname = parseobj.NextToken(); - var newname = parseobj.NextToken(); - SocialCalc.WorkBookControlRenameSheetRemote(sheetid, oldname, newname); - break; - - case "activatesheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlActivateSheet(sheetid); - break; - - case "hidesheet": - var sheetid = parseobj.NextToken(); - - break; - - case "unhidesheet": - var sheetid = parseobj.NextToken(); - - break; - } -} - -SocialCalc.GetCurrentWorkBookControl = function() { - return SocialCalc.CurrentWorkbookControlObject; -} - -SocialCalc.InitializeWorkBookControl = function(control) { - var element = document.createElement("div"); - element.innerHTML = control.sheetshtml; - var foo = document.getElementById(control.div); - foo.appendChild(element); - //var element2 = document.createElement("div"); - //element2.innerHTML = control.buttonshtml; - //foo.appendChild(element2); - SocialCalc.WorkBookControlAddSheet(false); // this is for the default sheet -} - -SocialCalc.WorkBookControlDelSheetRemote = function(sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (sheetid == control.currentSheetButton.id) { - // the active sheet is being deleted - SocialCalc.WorkBookControlDelSheet(); - return; - } - // some non active sheet is being deleted - var foo = document.getElementById("fooBar"); - var deletedbutton = document.getElementById(sheetid); - - var did = deletedbutton.id; - var dname = deletedbutton.value; - delete control.sheetButtonArr[did]; - - foo.removeChild(deletedbutton); - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+did); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - // delete the sheet - control.workbook.DeleteWorkBookSheet(did, dname); - control.numSheets = control.numSheets-1; - -} - -// assumes that the current active sheet is being deleted -SocialCalc.WorkBookControlDelSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } -if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='To delete the selected sheet, you must first insert a new sheet.
    '; -str +='
    '+ - '
    '; - var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the deletion of the sheet - // the popup has two buttons : Confirm and Cancel -var element = document.getElementById(control.deleteDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+ 'The selected sheet will be permanently deleted.'+ '
    '; -str +='
      '; - str +='
    • To delete the selected sheet, click OK.
    • '; - str +='
    • To cancel the deletion, click cancel.
    • '; -str+='
    '; -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.WorkBookControlDeleteSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.deleteDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlDeleteSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlDeleteSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.currentSheetButton = null; - // delete the sheets - control.workbook.DeleteWorkBookSheet(name, curname); - control.numSheets = control.numSheets-1; - - var cmdstr = "delsheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true) - break; - } - } - if (control.currentSheetButton != null) { - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } -} - -// assumes that the current active sheet is being hidden -SocialCalc.WorkBookControlHideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='Before hiding the selected sheet, you must first insert a new sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the hiding of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.hideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The selected sheet will be hidden.'+ '
    '; - str +='
      '; - str +='
    • To hide the selected sheet, click OK.
    • '; - str +='
    • To cancel the hiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - -SocialCalc.WorkBookControlHideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.hideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlHideSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlHideSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, false); - sheetbarbutton.style.display="none"; - control.currentSheetButton = null; - // delete the sheets - - control.numSheets = control.numSheets-1; - - var cmdstr = "hidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - -// displays all hidden sheets, and then unhides whatever is selected -SocialCalc.WorkBookControlUnhideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - - var unhiddencount = 0; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - unhiddencount++; - } - } - - if(unhiddencount==0) { //no hidden sheets, error message here - var str = '
    '+ - ''+' There are no hidden worksheets. ' + '

    '; - str +='Before unhiding any sheets, you must first hide a sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - var element = document.getElementById(control.unhideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The following sheets are hidden.'+ '
      ' + - ''; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - str += '' + control.sheetButtonArr[sheet].value +'
      '; - } - } - - str +='
    \n
      '; - str +='
    • To unhide the selected sheet, click OK.
    • '; - str +='
    • To cancel the unhiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - - - -SocialCalc.WorkBookControlUnhideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.unhideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} - - -SocialCalc.WorkBookControlUnhideSheetSubmit = function(name) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlUnhideSheetHide(); - var current = document.getElementById(control.currentSheetButton.id); - - var curid = current.id; - var curname = control.currentSheetButton.value; - - control.currentSheetButton.setAttribute("style",""); - var old = control.currentSheetButton.id; - console.log(old); - SocialCalc.SheetBarButtonActivate(old, false); - - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unhide the button - sheetbarbutton.style.display = "inline"; - control.currentSheetButton = null; - - control.numSheets = control.numSheets+1; - - var cmdstr = "unhidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - - - -SocialCalc.WorkBookControlAddSheetButton = function(sheetname, sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - //Create an input type dynamically. - var element = document.createElement("input"); - - var name = null; - - if (sheetid != null) { - name = sheetid - } else { - name = "sheet"+ (control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt + 1; - } - - //Assign different attributes to the element. - element.setAttribute("type", "button"); - if (sheetname == null) { - element.setAttribute("value", name); - } else { - element.setAttribute("value", sheetname); - } - element.setAttribute("id", name); - element.setAttribute("name", name); - - var fnname = "SocialCalc.WorkBookControlActivateSheet("+"'"+name+"'"+")"; - - element.setAttribute("onclick",fnname); - - control.sheetButtonArr[name] = element; - - - var foo = document.getElementById("fooBar"); - - //Append the element in page (in span). - foo.appendChild(element); - - control.numSheets = control.numSheets + 1; - - var el = new SocialCalc.SheetBarSheetButton("sbsb-"+name, (sheetname?sheetname:name), - document.getElementById("SocialCalc-sheetbar-buttons"), - { - //normalstyle: "border:1px solid #000;backgroundColor:#FFF;", - //downstyle: "border:1px solid #000;backgroundColor:#CCC;", - //hoverstyle: "border:1px solid #000;backgroundColor:#FFF;" - }, - { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(name);}, - Repeat:function(){}, - Disabled: function() {} - } - ); - - return element; -} - -SocialCalc.WorkBookControlAddSheet = function(addworksheet, sheetname){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(sheetname); - - // then change the highlight - - var old="sheet1"; - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style", ""); - old = control.currentSheetButton.id; - SocialCalc.SheetBarButtonActivate(old, false); - } - - element.setAttribute("style","background-color:lightgreen"); - control.currentSheetButton = element; - var newsheetid = element.id; - SocialCalc.SheetBarButtonActivate(newsheetid, true); - - // create the sheet - if (addworksheet) { - control.workbook.AddNewWorkBookSheet(newsheetid, old, false); - // broadcast an add command here - var cmdstr = "addsheet" - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - } - -} - -SocialCalc.WorkBookControlAddSheetRemote = function(savestr){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(); - - // add the sheet, dont switch to it - control.workbook.AddNewWorkBookSheetNoSwitch(element.id, - element.value, savestr); -} - - -SocialCalc.WorkBookControlActivateSheet = function(name) { - - //alert("in activate sheet="+name) - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById(name); - foo.setAttribute("style","background-color:lightgreen;"); - SocialCalc.SheetBarButtonActivate(name, true) - - var old = control.currentSheetButton.id; - if (control.currentSheetButton.id != foo.id) { - control.currentSheetButton.setAttribute("style", ""); - SocialCalc.SheetBarButtonActivate(old, false) - } - - control.currentSheetButton = foo; - - control.workbook.ActivateWorkBookSheet(name, old); - -} - -SocialCalc.WorkBookControlHttpRequest = null; - -SocialCalc.WorkBookControlAlertContents = function(){ - - var loadedstr = ""; - var http_request = SocialCalc.WorkBookControlHttpRequest; - - if (http_request.readyState == 4) { - //addmsg("received:" + http_request.responseText.length + " chars"); - try { - if (http_request.status == 200) { - loadedstr = http_request.responseText || ""; - http_request = null; - } - else { - ; - } - } - catch (e) { - } - // do something with loaded str - //alert("loaded="+loadedstr); - SocialCalc.TestWorkBookSaveStr = loadedstr; - SocialCalc.Clipboard.clipboard = loadedstr; - } -} - - -SocialCalc.WorkBookControlAjaxCall = function(url, contents) { - - var http_request = null; - - alert("in ajax") - if (window.XMLHttpRequest) { // Mozilla, Safari,... - http_request = new XMLHttpRequest(); - } - else - if (window.ActiveXObject) { // IE - try { - http_request = new ActiveXObject("Msxml2.XMLHTTP"); - } - catch (e) { - try { - http_request = new ActiveXObject("Microsoft.XMLHTTP"); - } - catch (e) { - } - } - } - if (!http_request) { - alert('Giving up :( Cannot create an XMLHTTP instance'); - return false; - } - - // Make the actual request - SocialCalc.WorkBookControlHttpRequest = http_request; - - http_request.onreadystatechange = SocialCalc.WorkBookControlAlertContents; - http_request.open('POST', document.URL, true); // async - http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - http_request.send(contents); - - return true; - -} - -SocialCalc.WorkBookControlSaveSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetsave = {}; - - sheetsave.numsheets = control.numSheets; - sheetsave.currentid = control.currentSheetButton.id; - sheetsave.currentname = control.currentSheetButton.value; - - sheetsave.sheetArr = {} - for (var sheet in control.sheetButtonArr) { - var sheetstr = control.workbook.SaveWorkBookSheet(sheet); - sheetsave.sheetArr[sheet] = {} - sheetsave.sheetArr[sheet].sheetstr = sheetstr; - sheetsave.sheetArr[sheet].name = control.sheetButtonArr[sheet].value; - sheetsave.sheetArr[sheet].hidden = document.getElementById("sbsb-" + sheet).style.display == "none" ? "1" : "0"; - } - - // Save the editable cells if specified - if (SocialCalc.EditableCells && SocialCalc.EditableCells.allow) { - sheetsave.EditableCells = {}; - for (var i in SocialCalc.EditableCells) { - sheetsave.EditableCells[i] = SocialCalc.EditableCells[i]; - } - } - - SocialCalc.TestWorkBookSaveStr = JSON.stringify(sheetsave); - //alert(SocialCalc.TestWorkBookSaveStr); - // send it to the backend - // SocialCalc.WorkBookControlAjaxCall("/", "&sheetdata="+encodeURIComponent(SocialCalc.TestWorkBookSaveStr)); - return SocialCalc.TestWorkBookSaveStr; -} - - -// insert another workbook into an existing workbook -// assumption is at least 1 sheet exists in existing workbook -// sheets with same names will be overwritten ! -SocialCalc.WorkBookControlInsertWorkbook = function(savestr, sheetsave) { - if (savestr) { - sheetsave = JSON.parse(savestr); - } - var control = SocialCalc.GetCurrentWorkBookControl(); - for (var sheet in sheetsave.sheetArr) { - - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end) - } - } - // check if sheetname already exists - var sheetname = sheetsave.sheetArr[sheet].name - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - if (sheetid) { - //alert(sheetname+"exists") - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, sheetname) - } - else { - //just test-brand new insert first - sheetid = "sheet"+(control.sheetCnt+1).toString() - control.sheetCnt = control.sheetCnt+1 - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid) - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr) - - } - } - -} - -SocialCalc.WorkBookControlLoad = function(savestr){ - - var sheetsave; - - if (savestr == "") return; - - if (savestr) { - sheetsave = JSON.parse(savestr); - } else { - sheetsave = JSON.parse(SocialCalc.TestWorkBookSaveStr); - } - //alert(sheetsave.currentid+","+sheetsave.currentname) - - // first create a new workbook - var control = SocialCalc.GetCurrentWorkBookControl(); - - SocialCalc.WorkBookControlCreateNewBook(); - - // at this point there is one sheet, and 1 button - // create the sequence of buttons, and sheets - var firstrun = true; - var newbuttons = 0 - var sheetid = null; - var currentsheetid = sheetsave.currentid; - //alert("button="+newbuttons) - for (var sheet in sheetsave.sheetArr) { - //alert(sheet); - if (newbuttons > sheetsave.numsheets) { - break; - } - //alert("button="+newbuttons) - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - if (firstrun) { - firstrun=false; - // set the first button's name correctly - sheetid = control.currentSheetButton.id; - control.currentSheetButton.value = sheetsave.sheetArr[sheet].name; - SocialCalc.SheetBarButtonSetName(sheetid, sheetsave.sheetArr[sheet].name); - // set the sheet data for the first sheet which already exists - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, control.currentSheetButton.value); - // need to also set the formula cache - currentsheetid = sheetid; - } - else { - sheetid = "sheet"+(control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt+1; - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr); - } - if(sheetsave.sheetArr[sheet].hidden=="1") { - // unregister with mouse ? etc - var sheetbarbutton = document.getElementById("sbsb-" + sheetid); - sheetbarbutton.style.display="none"; - SocialCalc.SheetBarButtonActivate(sheet, false); - newbuttons= newbuttons - 1; - } - if (sheet == sheetsave.currentid) { - currentsheetid = sheetid - } - newbuttons = newbuttons + 1; - } - // Save the user script data - if (sheetsave.EditableCells) { - SocialCalc.EditableCells = {}; - for (var i in sheetsave.EditableCells) { - SocialCalc.EditableCells[i] = sheetsave.EditableCells[i]; - } - } - var timeoutFn = function() { - SocialCalc.WorkBookControlActivateSheet(currentsheetid); - }; - window.setTimeout(timeoutFn, 200); -} - - -SocialCalc.WorkBookControlRenameSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // do a popup to get the new name of the sheet - // the popup has an input element with submit, and cancel buttons - var element = document.getElementById(control.renameDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+'Rename-'+ currentsheet + '
    '+ - '' + 'Please ensure that you DO NOT have ANY spaces in the sheet name.' + '' + - '
    '+'
    '; - -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.renameDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - -var ele = document.getElementById("newSheetName"); -ele.focus(); -SocialCalc.CmdGotFocus(ele); - -} - -SocialCalc.WorkBookControlRenameSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.renameDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlRenameSheetSubmit = function(){ - -// this handles all the rename action -var ele = document.getElementById("newSheetName"); -//console.log(ele.value); -var control = SocialCalc.GetCurrentWorkBookControl(); -if (ele.value.length == 0) { - ele.focus(); - return; -} -var oldname = control.currentSheetButton.value; -var newname = ele.value; -if(newname.indexOf(" ")!=-1) { - alert("A space was found in the new name. Please ensure that the new name has no sapces"); - return; - } -SocialCalc.WorkBookControlRenameSheetHide(); -// verify newname does not clash with any existing sheet name -// if so reject -var smallname = newname.toLowerCase();//converting to lower case to normalise -//console.log(smallname + " old " + ele.value); -for (var sheet in workbook.sheetArr) { - console.log(workbook.sheetArr[sheet].sheet.sheetname);//checking in sheetarr for repeated names - if (workbook.sheetArr[sheet].sheet.sheetname == smallname) { - alert(newname+" already exists"); - return; - } - } // variation of Case in letters of a sheet name will give an error if smallname is used. -// prevent a sheetname prefixed with sheet -if (smallname.indexOf("sheet") == 0) { - alert("sheetname cannot start with 'sheet'"); - return; -} - - -control.currentSheetButton.value = smallname; - -SocialCalc.SheetBarButtonSetName (control.currentSheetButton.id, newname); - -// perform a rename for formula references to this sheet in all the -// sheets in the workbook -control.workbook.RenameWorkBookSheet(oldname, smallname, control.currentSheetButton.id); - - var cmdstr = "rensheet "+control.currentSheetButton.id+" "+oldname+" "+newname; - //console.log(cmdstr); - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - -} - -SocialCalc.WorkBookControlRenameSheetRemote = function(sheetid, oldname, newname) { - //console.log("rename sheet ",sheetid, oldname, newname) - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById("fooBar"); - var renbutton = document.getElementById(sheetid); - - renbutton.value = newname; - - SocialCalc.SheetBarButtonSetName(sheetid, newname); - -control.workbook.RenameWorkBookSheet(oldname, newname, sheetid); - -} - - -SocialCalc.WorkBookControlCreateNewBook = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // delete all the sheets except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - control.workbook.DeleteWorkBookSheet(control.sheetButtonArr[sheet].id, control.sheetButtonArr[sheet].value); - } - } - // Reset that 1 sheet - - control.workbook.LoadRenameWorkBookSheet(control.currentSheetButton.id, "", control.workbook.defaultsheetname) - - - // delete all the buttons except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.sheetButtonArr[sheet].id); - - var name = current.id; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - control.numSheets = control.numSheets - 1; - } - } - // rename that button - control.currentSheetButton.value = control.workbook.defaultsheetname; - //alert("done new workbook") -} - -SocialCalc.WorkBookControlNewBook = function() { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlCreateNewBook(); - control.workbook.RenderWorkBookSheet(); -} - - -SocialCalc.WorkBookControlMove = function(direction){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - return; - } - var sheetArr = control.sheetButtonArr; - var newSheetArr = {}; - var sheetid = control.currentSheetButton.id; - - var curr_button = document.getElementById(sheetid); - var curr_sb_button = document.getElementById("sbsb-"+sheetid); - var sib_button = null; - var sib_sb_button = null; - if (direction == "left") { - sib_button = curr_button.previousSibling; - sib_sb_button = curr_sb_button.previousSibling; - if(!sib_sb_button) { - alert("Cannot move leftmost Sheet further to the left"); - return; - } - } - else { - sib_button = curr_button.nextSibling; - sib_sb_button = curr_sb_button.nextSibling; - if(!sib_sb_button) { - alert("Cannot move rightmost Sheet further to the right"); - return; - } - } - var currid = sheetid; - var sibid = sib_button.id; - var parent = curr_button.parentNode; - var sb_parent = curr_sb_button.parentNode; - - var cloned = {}; - var clonedsb = {}; - for(button in sheetArr) { - clonedsb[button] = document.getElementById("sbsb-"+button); - cloned[button] = document.getElementById(button); - sb_parent.removeChild(document.getElementById("sbsb-"+button)); - parent.removeChild(document.getElementById(button)); - } - for(button in sheetArr) { - if(button != currid && button != sibid) { - newSheetArr[button] = sheetArr[button]; - sb_parent.appendChild(clonedsb[button]); - parent.appendChild(cloned[button]); - } - else if(button == currid) { - if (direction == "left") { - newSheetArr[currid] = sheetArr[currid]; - newSheetArr[sibid] = sheetArr[sibid]; - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - } else { - newSheetArr[sibid] = sheetArr[sibid]; - newSheetArr[currid] = sheetArr[currid]; - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - } - } - } - control.sheetButtonArr = newSheetArr; - SocialCalc.SheetBarButtonActivate(currid,true); -} - -SocialCalc.WorkBookControlMoveLeft = function(){ - SocialCalc.WorkBookControlMove("left"); -} -SocialCalc.WorkBookControlMoveRight = function(){ - SocialCalc.WorkBookControlMove("right"); -} - - - -SocialCalc.WorkBookControlCopySheet = function(){ - - //alert("in copy"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - control.workbook.CopyWorkBookSheet(control.currentSheetButton.id); - - alert("copied sheet:"+control.currentSheetButton.value); -} - -SocialCalc.WorkBookControlPasteSheet = function() { - - //alert("in paste"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - var oldid = control.currentSheetButton.id; - - SocialCalc.WorkBookControlAddSheet(false); - - var newid = control.currentSheetButton.id; - - //alert(newid+oldid); - - control.workbook.PasteWorkBookSheet(newid, oldid); - - var cmdstr = "addsheetstr"; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr, sheetstr: control.workbook.clipsheet.savestr}); - -} - -SocialCalc.SheetBar = function() { - this.baseDiv = document.getElementById("SocialCalc-sheetbar"); - - this.prebuttonsDiv = document.createElement("div"); - this.prebuttonsDiv.style.cssText = "display:inline;"; - this.prebuttonsDiv.innerHTML="        "; - this.prebuttonsDiv.id = "SocialCalc-sheetbar-prebuttons"; - - this.buttonsDiv = document.createElement("div"); - this.buttonsDiv.id = "SocialCalc-sheetbar-buttons"; - this.buttonsDiv.style.cssText = "display:inline;"; - - this.buttonActionsDiv = document.createElement("div"); - this.buttonActionsDiv.id = "SocialCalc-sheetbar-buttonactions"; - this.buttonActionsDiv.style.display = "inline"; - var addbutton = new SocialCalc.SheetBarSheetButton("sbsba-add", "sbsba-add", this.buttonActionsDiv, - {}, - { - MouseDown:function(){var abc=SocialCalc.WorkBookControlAddSheet(true);} - }, - "add-2.png"); - - - this.baseDiv.appendChild(this.prebuttonsDiv); - this.baseDiv.appendChild(this.buttonsDiv); - this.baseDiv.appendChild(this.buttonActionsDiv); -} - -// define a new class for sheetbarsheetbutton - -SocialCalc.SheetBarSheetButton = function(id, name, parentdiv, params, functions, img) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.name = name; - if (!img) { - this.ele.innerHTML = name; - this.ele.style.cssText = "font-size:small;display:inline;padding:5px 5px 2px 5px;border:1px solid #000;"; - imgele = document.createElement("img"); - imgele.id = id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - SocialCalc.ButtonRegister(this.ele, params, functions); - SocialCalc.ButtonRegister(imgele, params, functions); - } else { - var imgele = document.createElement("img"); - imgele.src = SocialCalc.Constants.defaultImagePrefix +img; - imgele.style.cssText = "width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - this.ele.style.cssText = "display:inline;padding:5px 5px 2px 5px;"; - SocialCalc.ButtonRegister(imgele, params, functions); - } - parentdiv.appendChild(this.ele); -} - -SocialCalc.SheetBarButtonActivate = function(id, active) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.isactive = active; - if (active) { - sbbutton.style.backgroundColor = "#FFF"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (!imgele) { - imgele = document.createElement("img"); - imgele.id = "sbsb-"+id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - } - sbbutton.appendChild(imgele); - SocialCalc.ButtonRegister(imgele, {}, { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(id);}, - Repeat:function(){}, - Disabled: function() {} - } ); - } - else { - sbbutton.style.backgroundColor = "#CCC"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (imgele) { - sbbutton.removeChild(imgele); - } - } - var menu = document.getElementById("sbsb-menu"); - if (menu && menu.style.display != "none") { - menu.style.display = "none"; - } -} - -SocialCalc.SheetBarButtonSetName = function(id, name) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.name = name; - sbbutton.innerHTML = name; - if (sbbutton.isactive) { - SocialCalc.SheetBarButtonActivate(id, true); - } -} - - -SocialCalc.SheetBarSheetButtonPress = function(id) { - //console.log("button press") - var sbbutton = document.getElementById("sbsb-"+id); - if (sbbutton && sbbutton.isactive) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) { - var sbsbm = new SocialCalc.SheetBarSheetButtonMenu("sbsb-menu", id); - } else { - menu.clickedsheetid = id; - if (menu.style.display == "none") { - menu.style.display = "inline"; - SocialCalc.SheetBarSheetButtonMenuPosition(menu, id); - } else { - menu.style.display = "none"; - } - } - - } else if (sbbutton) { - SocialCalc.WorkBookControlActivateSheet(id); - } - -} - - -// define a new class for sheetbarsheet button menu item - -SocialCalc.SheetBarSheetButtonMenuItem = function(id, t) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.innerHTML = t; - this.ele.className = ""; - this.ele.style.cssText = "padding:3px 4px;width:100px;height:20px;background-color:#FFF;"; - - var params = { - normalstyle: "backgroundColor:#FFF;", - downstyle: "backgroundColor:#CCC;", - hoverstyle: "backgroundColor:#CCC;"}; - var functions = {MouseDown:function(){SocialCalc.SheetBarMenuItemPress(id);}, - Repeat:function(){}, - Disabled: function() {}}; - - SocialCalc.ButtonRegister(this.ele, params, functions); - - if (SocialCalc.TouchRegister) { - SocialCalc.TouchRegister(this.ele, {SingleTap:functions.MouseDown}); - } - - return this.ele; - -} - -SocialCalc.SheetBarMenuItemPress = function(id) { - - var menu = document.getElementById("sbsb-menu"); - if (!menu) return; - - var clickedsheetid = menu.clickedsheetid; - - switch(id) { - case "sbsb_deletesheet": - //console.log("delete "+clickedsheetid); - SocialCalc.WorkBookControlDelSheet(); - break; - case "sbsb_hidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlHideSheet(); - break; - case "sbsb_unhidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlUnhideSheet(); - break; - case "sbsb_copysheet": - //console.log("copy "+clickedsheetid); - SocialCalc.WorkBookControlCopySheet(); - break; - case "sbsb_moveleft": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveLeft(); - break; - case "sbsb_moveright": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveRight(); - break; - - case "sbsb_pastesheet": - //console.log("paste "+clickedsheetid); - SocialCalc.WorkBookControlPasteSheet(); - break; - case "sbsb_renamesheet": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlRenameSheet(); - break; - case "sbsb_closemenu": - //console.log("rename "+clickedsheetid); - menu.style.display = "none"; - break; - default: - break; - } - menu.style.display = "none"; - -} - -// define a new class for sheetbarsheet button menu -SocialCalc.SheetBarSheetButtonMenu = function(id, clickedsheetid) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.className = ""; - this.ele.clickedsheetid = clickedsheetid; - this.ele.style.cssText = "border:1px solid #000;position:absolute;top:200px;left:0px;width=100px;z-index:120"; - - var ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_deletesheet"," Delete Sheet"); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_hidesheet"," Hide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_unhidesheet"," Unhide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_renamesheet"," Rename Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveleft"," Move Left "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveright"," Move Right "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_copysheet"," Copy Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_pastesheet"," Paste Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_closemenu"," Cancel"); - this.ele.appendChild(ele1); - - - SocialCalc.SheetBarSheetButtonMenuPosition(this.ele, clickedsheetid); - - //var clickedsheet = document.getElementById(clickedsheetid); - //var position = SocialCalc.GetElementPosition(clickedsheet); - //console.log(clickedsheet.offsetHeight,clickedsheet.offsetWidth,clickedsheet.offsetLeft, clickedsheet.offsetTop); - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.editor.toplevel.appendChild(this.ele); - - - - - -} - -// position the sheet menu -SocialCalc.SheetBarSheetButtonMenuPosition = function(menu, clickedsheetid) { - - var hlessbutton = document.getElementById("te_lessbuttonh"); - - //console.log(hlessbutton.style.top, hlessbutton.style.left); - - var sbbutton = document.getElementById("sbsb-"+clickedsheetid); - - //console.log(sbbutton.offsetLeft,clickedsheetid); - - var top = hlessbutton.style.top.slice(0,-2)-220; - var left = sbbutton.offsetLeft+7; - - menu.style.top = top+"px"; - menu.style.left = left+"px"; - - //console.log(menu.style.top, menu.style.left); -} - -SocialCalc.ScriptInfo = { - scripts : {}, - handle:null -}; - -SocialCalc.ScriptCheck = function(sheetid, coord, text) { -var commentstart = text.indexOf(""); -if ((commentstart != -1) && (commentend != -1)) { - script = text.slice(commentstart+10,commentend); - //alert(script); - SocialCalc.ScriptInfo.scripts[coord] = script; - if (SocialCalc.ScriptInfo.handle == null) { - SocialCalc.ScriptInfo.handle = - window.setTimeout(SocialCalc.EvalUserScripts,500); - } - //alert(coord+"-"+sheetid); -} -} - -SocialCalc.EvalUserScript = function(data) { - var head = document.getElementsByTagName("head")[0] || - document.documentElement; - - if (data == "") return; - - var script = document.createElement("script"); - - script.type = "text/javascript"; - try { - // doesn't work on ie... - script.appendChild(document.createTextNode(data)); - } catch(e) { - // IE has funky script nodes - script.text = data; - } - - head.insertBefore(script, head.firstChild); - head.removeChild(script); -} - -SocialCalc.EvalUserScripts = function() { -for (var cr in SocialCalc.ScriptInfo.scripts) { - SocialCalc.EvalUserScript(SocialCalc.ScriptInfo.scripts[cr]); - //console.log(cr,SocialCalc.ScriptInfo.scripts[cr]) -} -SocialCalc.ScriptInfo.handle = null; -SocialCalc.ScriptInfo.scripts = {}; -} - -SocialCalc.CallOutOnRenderCell = function(sheetobj, value, cr) { -var cell=sheetobj.cells[cr]; -if (!cell) return; -var valuetype = cell.valuetype || ""; // get type of value to determine formatting -var valuesubtype = valuetype.substring(1); -var sheetattribs=sheetobj.attribs; -valuetype = valuetype.charAt(0); -if (valuetype=="t") { - valueformat = sheetobj.valueformats[cell.textvalueformat-0] || sheetobj.valueformats[sheetattribs.defaulttextvalueformat-0] || ""; - if (valueformat == "text-html") {SocialCalc.ScriptCheck(sheetobj.sheetid,cr,value);} -} -} - -SocialCalc.GetCellDataValue = function(coord) { - - var sheetname = null; - var sheetid = ""; - var bindex = coord.indexOf("!"); - if (bindex != -1) { - sheetname = coord.slice(0,bindex); - coord = coord.slice(bindex+1); - //console.log(sheetname,coord) - } - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (sheetname == null) { - sheetid = control.currentSheetButton.id - } else { - sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - } - - if ((sheetid == null) || (sheetid == "")) { - return "0"; - } - - var sheetobj = control.workbook.sheetArr[sheetid].sheet - - var cell = sheetobj.cells[coord] - - if (cell) {return cell.datavalue;} else {return 0;} -} - -SocialCalc.GetCellDataArray = function(coordstr,sheetname) { - var vals = [] - var coords = coordstr.split(","); - if (sheetname == null) { sheetname=""; } - else { - sheetname = sheetname+"!"; - } - for (var c in coords) { - - vals.push(SocialCalc.GetCellDataValue(sheetname+coords[c])); - } - return vals; -} - -SocialCalc.UserScriptData = {} - - -SocialCalc.WorkBookRecalculateInfo = { - sheets : [], - calcorder: [], - current: 0, - pass: 0 -}; - -SocialCalc.WorkBookRecalculateAll = function() { - // do it from the last sheet to the first sheet - // using the recalc-done signal to trigger the next sheet - - // if already in the middle of a recalculate-all, ignore this. - if ((SocialCalc.WorkBookRecalculateInfo.current != 0) || - (SocialCalc.WorkBookRecalculateInfo.calcorder.length != 0) || - (SocialCalc.WorkBookRecalculateInfo.sheets.length != 0)) { - return; - } - - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - SocialCalc.WorkBookRecalculateInfo.current = 0; - - for (var sheet in control.workbook.sheetArr) { - SocialCalc.WorkBookRecalculateInfo.sheets.push(sheet); - } - - var i = 0; - for (var c=SocialCalc.WorkBookRecalculateInfo.sheets.length; - c>0; c--) { - SocialCalc.WorkBookRecalculateInfo.calcorder[i] = - SocialCalc.WorkBookRecalculateInfo.sheets[c-1]; - i++; - } - window.setTimeout(SocialCalc.WorkBookRecalculateStep,500); -} - -SocialCalc.WorkBookRecalculateStep = function() { - if (SocialCalc.WorkBookRecalculateInfo.current == - SocialCalc.WorkBookRecalculateInfo.calcorder.length) { - SocialCalc.WorkBookRecalculateInfo.current = 0; - SocialCalc.WorkBookRecalculateInfo.calcorder = []; - SocialCalc.WorkBookRecalculateInfo.sheets = []; - if (SocialCalc.WorkBookRecalculateInfo.pass == - 1) { - SocialCalc.WorkBookRecalculateInfo.pass = 0; - SocialCalc.SpinnerWaitHide(); - //alert("load done"); - return; - } else { - SocialCalc.WorkBookRecalculateInfo.pass++; - SocialCalc.WorkBookRecalculateAll(); - return; - } - } - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert("recalculate "+ - // SocialCalc.WorkBookRecalculateInfo.calcorder[ - // SocialCalc.WorkBookRecalculateInfo.current] - // ); - var sheetid = -SocialCalc.WorkBookRecalculateInfo.calcorder[ - SocialCalc.WorkBookRecalculateInfo.current]; - SocialCalc.WorkBookControlActivateSheet(sheetid); - SocialCalc.WorkBookRecalculateInfo.current++; - - - window.setTimeout(SocialCalc.WorkBookRecalculateStep,1000); -} - - -SocialCalc.SpinnerWaitCreate = function() { - // if the div exists already just use it - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - return; - } - var main = document.createElement("div"); - main.id = "waitloadingspinner"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - main.style.top = (vp.height/2)+"px"; - main.style.left = (vp.width/2)+"px"; - main.style.zIndex = 110; - - main.style.width='50px' - main.style.height = '50px' - main.innerHTML = 'Loading...'; - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.SpinnerWaitHide = function() { - // if the div exists already just use it - -var ele = document.getElementById("waitloadingspinner"); -if (ele) { - ele.innerHTML = ""; - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} -} - -SocialCalc.EditableCells = {}; -SocialCalc.EditableCells.allow = false; -SocialCalc.EditableCells.cells = {}; -SocialCalc.EditableCells.constraints = {}; - -SocialCalc.Callbacks.IsCellEditable = function(editor) { - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - - if (!(SocialCalc.EditableCells.allow)) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[cellname]) { - // by default all cells are editable - return true; - } - return false; -} - -SocialCalc.Callbacks.CheckConstraints = function(editor, value) -{ - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - var constraint = SocialCalc.EditableCells.constraints[cellname]; - //alert(JSON.stringify(constraint)) - if (constraint != null) { - switch (constraint[0]) { - case "numeric": - // check that value is numeric - var val = parseInt(value); - var low = parseInt(constraint[1]); - var high = parseInt(constraint[2]); - var text = ""; - if (constraint.length > 3) { - text = constraint[3]; - } - //alert(val) - if (isNaN(val)) { - //Aspiring.showPopUp("please input a number"); - alert("please input a number"); - return false; - } - if (val < low) { - //Aspiring.showPopUp(text +" must be at least "+low); - alert(text +" must be at least "+low); - return false; - } - if (val > high) { - //Aspiring.showPopUp(text + " must be atmost "+high); - alert(text + " must be atmost "+high); - return false; - } - if (Aspiring.appSpecificInputValidation && !Aspiring.appSpecificInputValidation(cellname, val)) { - return false; - } - break; - case "float": - var val = parseFloat(value); - var low = parseFloat(constraint[1]); - var high = parseFloat(constraint[2]); - var text = ""; - if (constraint.length > 3) { - text = constraint[3]; - } - //alert(val) - if (isNaN(val)) { - //Aspiring.showPopUp("please input a number"); - alert("please input a number"); - return false; - } - if (val < low) { - //Aspiring.showPopUp(text +" must be at least "+low); - alert(text +" must be at least "+low); - return false; - } - if (val > high) { - //Aspiring.showPopUp(text + " must be atmost "+high); - alert(text + " must be atmost "+high); - return false; - } - if (Aspiring.appSpecificInputValidation && !Aspiring.appSpecificInputValidation(cellname, val)) { - return false; - } - break; - - case "percent": - break; - } - } - return true; - -} - -// this is for checkmark toggling -SocialCalc.Callbacks.ToggleCell = function() -{ - // check what the current ecell is - var control = SocialCalc.GetCurrentWorkBookControl(); - - var editor = control.workbook.spreadsheet.editor; - - var cellname = editor.ecell.coord; - - var value = SocialCalc.GetCellDataValue(cellname); - - console.log(cellname) - console.log(value) - - var cmdstr = ""; - if (value.indexOf(" ") != -1) { - // set the value to the img value - //cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - - } else { - // set the value to a space - cmdstr = "set " + cellname + ' text t
     
    ' + "\n"; - } - - var sheetid = control.currentSheetButton.id - console.log(sheetid) - console.log(cmdstr) - cmd = {cmdtype:"scmd", id:sheetid, cmdstr: cmdstr, saveundo: false}; - control.ExecuteWorkBookControlCommand(cmd, false); - -} - - -SocialCalc.WorkbookControlCreateSheetHTML = function(sheetlist) { - - var context, div, ele; - - var result = ""; - - var control = SocialCalc.GetCurrentWorkBookControl(); - - div = document.createElement("div"); - - if (!sheetlist) { - context = new SocialCalc.RenderContext(spreadsheet.sheet); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - } else { - for (var sheetid in sheetlist) { - context = control.workbook.sheetArr[sheetid].context; - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - } - } - - result = div.innerHTML; - delete ele; - delete div; - return result; - - } \ No newline at end of file diff --git a/Website/static/socialcalcworkbookcontrol.js b/Website/static/socialcalcworkbookcontrol.js deleted file mode 100644 index 44411ad..0000000 --- a/Website/static/socialcalcworkbookcontrol.js +++ /dev/null @@ -1,2015 +0,0 @@ -// -// Workbook Control controls workbook actions (add/del/rename etc) and can appear at the -// bottom of the screen (?). Right now its just a proof of concept -// and appears at the top of the screen -// -// Author: Ramu Ramamurthy -// -// - -var SocialCalc; -if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; -} - -SocialCalc.CurrentWorkbookControlObject = null; - -SocialCalc.TestWorkBookSaveStr = ""; - - -// Constructor: - -SocialCalc.WorkBookControl = function(book, divid, defaultsheetname) { - - this.workbook = book; - this.div = divid; - this.defaultsheetname = defaultsheetname; - this.sheetButtonArr = {}; - this.sheetCnt = 0; - this.numSheets = 0; - this.currentSheetButton = null; - this.renameDialogId = "sheetRenameDialog"; - this.deleteDialogId = "sheetDeleteDialog"; - this.hideDialogId = "sheetHideDialog"; - this.unhideDialogId = "sheetUnhideDialog"; - - this.sheetshtml = ''; - -//this.buttonshtml = -//'
    '+ -//'
    '+ -//''+ -//''+ -//''+ - -// ''+ -// ''+ -// ''+ - -//''+ -//''+ -//'
    '+ -//'
    '; - - SocialCalc.CurrentWorkbookControlObject = this; - this.sheetbar = new SocialCalc.SheetBar(); -} - -// methods -SocialCalc.WorkBookControl.prototype.GetCurrentWorkBookControl = function() {return SocialCalc.GetCurrentWorkBookControl();}; -SocialCalc.WorkBookControl.prototype.InitializeWorkBookControl = function() {return SocialCalc.InitializeWorkBookControl(this);}; - - -SocialCalc.WorkBookControl.prototype.ExecuteWorkBookControlCommand = function(cmd, isremote) { - return SocialCalc.ExecuteWorkBookControlCommand(this, cmd, isremote); -} - -SocialCalc.ExecuteWorkBookControlCommand = function(control, cmd, isremote) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - //if (!isremote) { - // return; - //} - - if (cmd.cmdtype == "scmd") { - // dispatch a sheet command - control.workbook.WorkbookScheduleCommand(cmd, isremote); - return; - - } - - if (cmd.cmdtype != "wcmd") { - return; - } - - var parseobj = new SocialCalc.Parse(cmd.cmdstr); - - var cmd1 = parseobj.NextToken(); - - switch (cmd1) { - case "addsheet": - SocialCalc.WorkBookControlAddSheetRemote(null); - break; - - case "addsheetstr": - var sheetstr = cmd.sheetstr; - SocialCalc.WorkBookControlAddSheetRemote(sheetstr); - break; - - case "delsheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlDelSheetRemote(sheetid); - break; - - case "rensheet": - var sheetid = parseobj.NextToken(); - var oldname = parseobj.NextToken(); - var newname = parseobj.NextToken(); - SocialCalc.WorkBookControlRenameSheetRemote(sheetid, oldname, newname); - break; - - case "activatesheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlActivateSheet(sheetid); - break; - - case "hidesheet": - var sheetid = parseobj.NextToken(); - - break; - - case "unhidesheet": - var sheetid = parseobj.NextToken(); - - break; - } -} - -SocialCalc.GetCurrentWorkBookControl = function() { - return SocialCalc.CurrentWorkbookControlObject; -} - -SocialCalc.InitializeWorkBookControl = function(control) { - var element = document.createElement("div"); - element.innerHTML = control.sheetshtml; - var foo = document.getElementById(control.div); - foo.appendChild(element); - //var element2 = document.createElement("div"); - //element2.innerHTML = control.buttonshtml; - //foo.appendChild(element2); - SocialCalc.WorkBookControlAddSheet(false); // this is for the default sheet -} - -SocialCalc.WorkBookControlDelSheetRemote = function(sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (sheetid == control.currentSheetButton.id) { - // the active sheet is being deleted - SocialCalc.WorkBookControlDelSheet(); - return; - } - // some non active sheet is being deleted - var foo = document.getElementById("fooBar"); - var deletedbutton = document.getElementById(sheetid); - - var did = deletedbutton.id; - var dname = deletedbutton.value; - delete control.sheetButtonArr[did]; - - foo.removeChild(deletedbutton); - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+did); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - // delete the sheet - control.workbook.DeleteWorkBookSheet(did, dname); - control.numSheets = control.numSheets-1; - -} - -// assumes that the current active sheet is being deleted -SocialCalc.WorkBookControlDelSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } -if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='To delete the selected sheet, you must first insert a new sheet.
    '; -str +='
    '+ - '
    '; - var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the deletion of the sheet - // the popup has two buttons : Confirm and Cancel -var element = document.getElementById(control.deleteDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+ 'The selected sheet will be permanently deleted.'+ '
    '; -str +='
      '; - str +='
    • To delete the selected sheet, click OK.
    • '; - str +='
    • To cancel the deletion, click cancel.
    • '; -str+='
    '; -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.WorkBookControlDeleteSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.deleteDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlDeleteSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlDeleteSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.currentSheetButton = null; - // delete the sheets - control.workbook.DeleteWorkBookSheet(name, curname); - control.numSheets = control.numSheets-1; - - var cmdstr = "delsheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true) - break; - } - } - if (control.currentSheetButton != null) { - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } -} - -// assumes that the current active sheet is being hidden -SocialCalc.WorkBookControlHideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='Before hiding the selected sheet, you must first insert a new sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the hiding of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.hideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The selected sheet will be hidden.'+ '
    '; - str +='
      '; - str +='
    • To hide the selected sheet, click OK.
    • '; - str +='
    • To cancel the hiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - -SocialCalc.WorkBookControlHideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.hideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlHideSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlHideSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, false); - sheetbarbutton.style.display="none"; - control.currentSheetButton = null; - // delete the sheets - - control.numSheets = control.numSheets-1; - - var cmdstr = "hidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - -// displays all hidden sheets, and then unhides whatever is selected -SocialCalc.WorkBookControlUnhideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - - var unhiddencount = 0; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - unhiddencount++; - } - } - - if(unhiddencount==0) { //no hidden sheets, error message here - var str = '
    '+ - ''+' There are no hidden worksheets. ' + '

    '; - str +='Before unhiding any sheets, you must first hide a sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - var element = document.getElementById(control.unhideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The following sheets are hidden.'+ '
      ' + - ''; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - str += '' + control.sheetButtonArr[sheet].value +'
      '; - } - } - - str +='
    \n
      '; - str +='
    • To unhide the selected sheet, click OK.
    • '; - str +='
    • To cancel the unhiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - - - -SocialCalc.WorkBookControlUnhideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.unhideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} - - -SocialCalc.WorkBookControlUnhideSheetSubmit = function(name) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlUnhideSheetHide(); - var current = document.getElementById(control.currentSheetButton.id); - - var curid = current.id; - var curname = control.currentSheetButton.value; - - control.currentSheetButton.setAttribute("style",""); - var old = control.currentSheetButton.id; - console.log(old); - SocialCalc.SheetBarButtonActivate(old, false); - - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unhide the button - sheetbarbutton.style.display = "inline"; - control.currentSheetButton = null; - - control.numSheets = control.numSheets+1; - - var cmdstr = "unhidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - - - -SocialCalc.WorkBookControlAddSheetButton = function(sheetname, sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - //Create an input type dynamically. - var element = document.createElement("input"); - - var name = null; - - if (sheetid != null) { - name = sheetid - } else { - name = "sheet"+ (control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt + 1; - } - - //Assign different attributes to the element. - element.setAttribute("type", "button"); - if (sheetname == null) { - element.setAttribute("value", name); - } else { - element.setAttribute("value", sheetname); - } - element.setAttribute("id", name); - element.setAttribute("name", name); - - var fnname = "SocialCalc.WorkBookControlActivateSheet("+"'"+name+"'"+")"; - - element.setAttribute("onclick",fnname); - - control.sheetButtonArr[name] = element; - - - var foo = document.getElementById("fooBar"); - - //Append the element in page (in span). - foo.appendChild(element); - - control.numSheets = control.numSheets + 1; - - var el = new SocialCalc.SheetBarSheetButton("sbsb-"+name, (sheetname?sheetname:name), - document.getElementById("SocialCalc-sheetbar-buttons"), - { - //normalstyle: "border:1px solid #000;backgroundColor:#FFF;", - //downstyle: "border:1px solid #000;backgroundColor:#CCC;", - //hoverstyle: "border:1px solid #000;backgroundColor:#FFF;" - }, - { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(name);}, - Repeat:function(){}, - Disabled: function() {} - } - ); - - return element; -} - -SocialCalc.WorkBookControlAddSheet = function(addworksheet, sheetname){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(sheetname); - - // then change the highlight - - var old="sheet1"; - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style", ""); - old = control.currentSheetButton.id; - SocialCalc.SheetBarButtonActivate(old, false); - } - - element.setAttribute("style","background-color:lightgreen"); - control.currentSheetButton = element; - var newsheetid = element.id; - SocialCalc.SheetBarButtonActivate(newsheetid, true); - - // create the sheet - if (addworksheet) { - control.workbook.AddNewWorkBookSheet(newsheetid, old, false); - // broadcast an add command here - var cmdstr = "addsheet" - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - } - -} - -SocialCalc.WorkBookControlAddSheetRemote = function(savestr){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(); - - // add the sheet, dont switch to it - control.workbook.AddNewWorkBookSheetNoSwitch(element.id, - element.value, savestr); -} - - -SocialCalc.WorkBookControlActivateSheet = function(name) { - - //alert("in activate sheet="+name) - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById(name); - foo.setAttribute("style","background-color:lightgreen;"); - SocialCalc.SheetBarButtonActivate(name, true) - - var old = control.currentSheetButton.id; - if (control.currentSheetButton.id != foo.id) { - control.currentSheetButton.setAttribute("style", ""); - SocialCalc.SheetBarButtonActivate(old, false) - } - - control.currentSheetButton = foo; - - control.workbook.ActivateWorkBookSheet(name, old); - -} - -SocialCalc.WorkBookControlHttpRequest = null; - -SocialCalc.WorkBookControlAlertContents = function(){ - - var loadedstr = ""; - var http_request = SocialCalc.WorkBookControlHttpRequest; - - if (http_request.readyState == 4) { - //addmsg("received:" + http_request.responseText.length + " chars"); - try { - if (http_request.status == 200) { - loadedstr = http_request.responseText || ""; - http_request = null; - } - else { - ; - } - } - catch (e) { - } - // do something with loaded str - //alert("loaded="+loadedstr); - SocialCalc.TestWorkBookSaveStr = loadedstr; - SocialCalc.Clipboard.clipboard = loadedstr; - } -} - - -SocialCalc.WorkBookControlAjaxCall = function(url, contents) { - - var http_request = null; - - alert("in ajax") - if (window.XMLHttpRequest) { // Mozilla, Safari,... - http_request = new XMLHttpRequest(); - } - else - if (window.ActiveXObject) { // IE - try { - http_request = new ActiveXObject("Msxml2.XMLHTTP"); - } - catch (e) { - try { - http_request = new ActiveXObject("Microsoft.XMLHTTP"); - } - catch (e) { - } - } - } - if (!http_request) { - alert('Giving up :( Cannot create an XMLHTTP instance'); - return false; - } - - // Make the actual request - SocialCalc.WorkBookControlHttpRequest = http_request; - - http_request.onreadystatechange = SocialCalc.WorkBookControlAlertContents; - http_request.open('POST', document.URL, true); // async - http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - http_request.send(contents); - - return true; - -} - -SocialCalc.WorkBookControlSaveSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetsave = {}; - - sheetsave.numsheets = control.numSheets; - sheetsave.currentid = control.currentSheetButton.id; - sheetsave.currentname = control.currentSheetButton.value; - - sheetsave.sheetArr = {} - for (var sheet in control.sheetButtonArr) { - var sheetstr = control.workbook.SaveWorkBookSheet(sheet); - sheetsave.sheetArr[sheet] = {} - sheetsave.sheetArr[sheet].sheetstr = sheetstr; - sheetsave.sheetArr[sheet].name = control.sheetButtonArr[sheet].value; - sheetsave.sheetArr[sheet].hidden = document.getElementById("sbsb-" + sheet).style.display == "none" ? "1" : "0"; - } - - // Save the editable cells if specified - if (SocialCalc.EditableCells && SocialCalc.EditableCells.allow) { - sheetsave.EditableCells = {}; - for (var i in SocialCalc.EditableCells) { - sheetsave.EditableCells[i] = SocialCalc.EditableCells[i]; - } - } - - SocialCalc.TestWorkBookSaveStr = JSON.stringify(sheetsave); - //alert(SocialCalc.TestWorkBookSaveStr); - // send it to the backend - // SocialCalc.WorkBookControlAjaxCall("/", "&sheetdata="+encodeURIComponent(SocialCalc.TestWorkBookSaveStr)); - return SocialCalc.TestWorkBookSaveStr; -} - - -// insert another workbook into an existing workbook -// assumption is at least 1 sheet exists in existing workbook -// sheets with same names will be overwritten ! -SocialCalc.WorkBookControlInsertWorkbook = function(savestr, sheetsave) { - if (savestr) { - sheetsave = JSON.parse(savestr); - } - var control = SocialCalc.GetCurrentWorkBookControl(); - for (var sheet in sheetsave.sheetArr) { - - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end) - } - } - // check if sheetname already exists - var sheetname = sheetsave.sheetArr[sheet].name - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - if (sheetid) { - //alert(sheetname+"exists") - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, sheetname) - } - else { - //just test-brand new insert first - sheetid = "sheet"+(control.sheetCnt+1).toString() - control.sheetCnt = control.sheetCnt+1 - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid) - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr) - - } - } - -} - -SocialCalc.WorkBookControlLoad = function(savestr){ - - var sheetsave; - - if (savestr == "") return; - - if (savestr) { - sheetsave = JSON.parse(savestr); - } else { - sheetsave = JSON.parse(SocialCalc.TestWorkBookSaveStr); - } - //alert(sheetsave.currentid+","+sheetsave.currentname) - - // first create a new workbook - var control = SocialCalc.GetCurrentWorkBookControl(); - - SocialCalc.WorkBookControlCreateNewBook(); - - // at this point there is one sheet, and 1 button - // create the sequence of buttons, and sheets - var firstrun = true; - var newbuttons = 0 - var sheetid = null; - var currentsheetid = sheetsave.currentid; - //alert("button="+newbuttons) - for (var sheet in sheetsave.sheetArr) { - //alert(sheet); - if (newbuttons > sheetsave.numsheets) { - break; - } - //alert("button="+newbuttons) - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - if (firstrun) { - firstrun=false; - // set the first button's name correctly - sheetid = control.currentSheetButton.id; - control.currentSheetButton.value = sheetsave.sheetArr[sheet].name; - SocialCalc.SheetBarButtonSetName(sheetid, sheetsave.sheetArr[sheet].name); - // set the sheet data for the first sheet which already exists - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, control.currentSheetButton.value); - // need to also set the formula cache - currentsheetid = sheetid; - } - else { - sheetid = "sheet"+(control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt+1; - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr); - } - if(sheetsave.sheetArr[sheet].hidden=="1") { - // unregister with mouse ? etc - var sheetbarbutton = document.getElementById("sbsb-" + sheetid); - sheetbarbutton.style.display="none"; - SocialCalc.SheetBarButtonActivate(sheet, false); - newbuttons= newbuttons - 1; - } - if (sheet == sheetsave.currentid) { - currentsheetid = sheetid - } - newbuttons = newbuttons + 1; - } - // Save the user script data - if (sheetsave.EditableCells) { - SocialCalc.EditableCells = {}; - for (var i in sheetsave.EditableCells) { - SocialCalc.EditableCells[i] = sheetsave.EditableCells[i]; - } - } - var timeoutFn = function() { - SocialCalc.WorkBookControlActivateSheet(currentsheetid); - }; - window.setTimeout(timeoutFn, 200); -} - - -SocialCalc.WorkBookControlRenameSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // do a popup to get the new name of the sheet - // the popup has an input element with submit, and cancel buttons - var element = document.getElementById(control.renameDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+'Rename-'+ currentsheet + '
    '+ - '' + 'Please ensure that you DO NOT have ANY spaces in the sheet name.' + '' + - '
    '+'
    '; - -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.renameDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - -var ele = document.getElementById("newSheetName"); -ele.focus(); -SocialCalc.CmdGotFocus(ele); - -} - -SocialCalc.WorkBookControlRenameSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.renameDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlRenameSheetSubmit = function(){ - -// this handles all the rename action -var ele = document.getElementById("newSheetName"); -//console.log(ele.value); -var control = SocialCalc.GetCurrentWorkBookControl(); -if (ele.value.length == 0) { - ele.focus(); - return; -} -var oldname = control.currentSheetButton.value; -var newname = ele.value; -if(newname.indexOf(" ")!=-1) { - alert("A space was found in the new name. Please ensure that the new name has no sapces"); - return; - } -SocialCalc.WorkBookControlRenameSheetHide(); -// verify newname does not clash with any existing sheet name -// if so reject -var smallname = newname.toLowerCase();//converting to lower case to normalise -//console.log(smallname + " old " + ele.value); -for (var sheet in workbook.sheetArr) { - console.log(workbook.sheetArr[sheet].sheet.sheetname);//checking in sheetarr for repeated names - if (workbook.sheetArr[sheet].sheet.sheetname == smallname) { - alert(newname+" already exists"); - return; - } - } // variation of Case in letters of a sheet name will give an error if smallname is used. -// prevent a sheetname prefixed with sheet -if (smallname.indexOf("sheet") == 0) { - alert("sheetname cannot start with 'sheet'"); - return; -} - - -control.currentSheetButton.value = smallname; - -SocialCalc.SheetBarButtonSetName (control.currentSheetButton.id, newname); - -// perform a rename for formula references to this sheet in all the -// sheets in the workbook -control.workbook.RenameWorkBookSheet(oldname, smallname, control.currentSheetButton.id); - - var cmdstr = "rensheet "+control.currentSheetButton.id+" "+oldname+" "+newname; - //console.log(cmdstr); - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - -} - -SocialCalc.WorkBookControlRenameSheetRemote = function(sheetid, oldname, newname) { - //console.log("rename sheet ",sheetid, oldname, newname) - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById("fooBar"); - var renbutton = document.getElementById(sheetid); - - renbutton.value = newname; - - SocialCalc.SheetBarButtonSetName(sheetid, newname); - -control.workbook.RenameWorkBookSheet(oldname, newname, sheetid); - -} - - -SocialCalc.WorkBookControlCreateNewBook = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // delete all the sheets except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - control.workbook.DeleteWorkBookSheet(control.sheetButtonArr[sheet].id, control.sheetButtonArr[sheet].value); - } - } - // Reset that 1 sheet - - control.workbook.LoadRenameWorkBookSheet(control.currentSheetButton.id, "", control.workbook.defaultsheetname) - - - // delete all the buttons except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.sheetButtonArr[sheet].id); - - var name = current.id; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - control.numSheets = control.numSheets - 1; - } - } - // rename that button - control.currentSheetButton.value = control.workbook.defaultsheetname; - //alert("done new workbook") -} - -SocialCalc.WorkBookControlNewBook = function() { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlCreateNewBook(); - control.workbook.RenderWorkBookSheet(); -} - - -SocialCalc.WorkBookControlMove = function(direction){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - return; - } - var sheetArr = control.sheetButtonArr; - var newSheetArr = {}; - var sheetid = control.currentSheetButton.id; - - var curr_button = document.getElementById(sheetid); - var curr_sb_button = document.getElementById("sbsb-"+sheetid); - var sib_button = null; - var sib_sb_button = null; - if (direction == "left") { - sib_button = curr_button.previousSibling; - sib_sb_button = curr_sb_button.previousSibling; - if(!sib_sb_button) { - alert("Cannot move leftmost Sheet further to the left"); - return; - } - } - else { - sib_button = curr_button.nextSibling; - sib_sb_button = curr_sb_button.nextSibling; - if(!sib_sb_button) { - alert("Cannot move rightmost Sheet further to the right"); - return; - } - } - var currid = sheetid; - var sibid = sib_button.id; - var parent = curr_button.parentNode; - var sb_parent = curr_sb_button.parentNode; - - var cloned = {}; - var clonedsb = {}; - for(button in sheetArr) { - clonedsb[button] = document.getElementById("sbsb-"+button); - cloned[button] = document.getElementById(button); - sb_parent.removeChild(document.getElementById("sbsb-"+button)); - parent.removeChild(document.getElementById(button)); - } - for(button in sheetArr) { - if(button != currid && button != sibid) { - newSheetArr[button] = sheetArr[button]; - sb_parent.appendChild(clonedsb[button]); - parent.appendChild(cloned[button]); - } - else if(button == currid) { - if (direction == "left") { - newSheetArr[currid] = sheetArr[currid]; - newSheetArr[sibid] = sheetArr[sibid]; - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - } else { - newSheetArr[sibid] = sheetArr[sibid]; - newSheetArr[currid] = sheetArr[currid]; - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - } - } - } - control.sheetButtonArr = newSheetArr; - SocialCalc.SheetBarButtonActivate(currid,true); -} - -SocialCalc.WorkBookControlMoveLeft = function(){ - SocialCalc.WorkBookControlMove("left"); -} -SocialCalc.WorkBookControlMoveRight = function(){ - SocialCalc.WorkBookControlMove("right"); -} - - - -SocialCalc.WorkBookControlCopySheet = function(){ - - //alert("in copy"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - control.workbook.CopyWorkBookSheet(control.currentSheetButton.id); - - alert("copied sheet:"+control.currentSheetButton.value); -} - -SocialCalc.WorkBookControlPasteSheet = function() { - - //alert("in paste"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - var oldid = control.currentSheetButton.id; - - SocialCalc.WorkBookControlAddSheet(false); - - var newid = control.currentSheetButton.id; - - //alert(newid+oldid); - - control.workbook.PasteWorkBookSheet(newid, oldid); - - var cmdstr = "addsheetstr"; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr, sheetstr: control.workbook.clipsheet.savestr}); - -} - -SocialCalc.SheetBar = function() { - this.baseDiv = document.getElementById("SocialCalc-sheetbar"); - - this.prebuttonsDiv = document.createElement("div"); - this.prebuttonsDiv.style.cssText = "display:inline;"; - this.prebuttonsDiv.innerHTML="        "; - this.prebuttonsDiv.id = "SocialCalc-sheetbar-prebuttons"; - - this.buttonsDiv = document.createElement("div"); - this.buttonsDiv.id = "SocialCalc-sheetbar-buttons"; - this.buttonsDiv.style.cssText = "display:inline;"; - - this.buttonActionsDiv = document.createElement("div"); - this.buttonActionsDiv.id = "SocialCalc-sheetbar-buttonactions"; - this.buttonActionsDiv.style.display = "inline"; - var addbutton = new SocialCalc.SheetBarSheetButton("sbsba-add", "sbsba-add", this.buttonActionsDiv, - {}, - { - MouseDown:function(){var abc=SocialCalc.WorkBookControlAddSheet(true);} - }, - "add-2.png"); - - - this.baseDiv.appendChild(this.prebuttonsDiv); - this.baseDiv.appendChild(this.buttonsDiv); - this.baseDiv.appendChild(this.buttonActionsDiv); -} - -// define a new class for sheetbarsheetbutton - -SocialCalc.SheetBarSheetButton = function(id, name, parentdiv, params, functions, img) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.name = name; - if (!img) { - this.ele.innerHTML = name; - this.ele.style.cssText = "font-size:small;display:inline;padding:5px 5px 2px 5px;border:1px solid #000;"; - imgele = document.createElement("img"); - imgele.id = id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - SocialCalc.ButtonRegister(this.ele, params, functions); - SocialCalc.ButtonRegister(imgele, params, functions); - } else { - var imgele = document.createElement("img"); - imgele.src = SocialCalc.Constants.defaultImagePrefix +img; - imgele.style.cssText = "width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - this.ele.style.cssText = "display:inline;padding:5px 5px 2px 5px;"; - SocialCalc.ButtonRegister(imgele, params, functions); - } - parentdiv.appendChild(this.ele); -} - -SocialCalc.SheetBarButtonActivate = function(id, active) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.isactive = active; - if (active) { - sbbutton.style.backgroundColor = "#FFF"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (!imgele) { - imgele = document.createElement("img"); - imgele.id = "sbsb-"+id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - } - sbbutton.appendChild(imgele); - SocialCalc.ButtonRegister(imgele, {}, { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(id);}, - Repeat:function(){}, - Disabled: function() {} - } ); - } - else { - sbbutton.style.backgroundColor = "#CCC"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (imgele) { - sbbutton.removeChild(imgele); - } - } - var menu = document.getElementById("sbsb-menu"); - if (menu && menu.style.display != "none") { - menu.style.display = "none"; - } -} - -SocialCalc.SheetBarButtonSetName = function(id, name) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.name = name; - sbbutton.innerHTML = name; - if (sbbutton.isactive) { - SocialCalc.SheetBarButtonActivate(id, true); - } -} - - -SocialCalc.SheetBarSheetButtonPress = function(id) { - //console.log("button press") - var sbbutton = document.getElementById("sbsb-"+id); - if (sbbutton && sbbutton.isactive) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) { - var sbsbm = new SocialCalc.SheetBarSheetButtonMenu("sbsb-menu", id); - } else { - menu.clickedsheetid = id; - if (menu.style.display == "none") { - menu.style.display = "inline"; - SocialCalc.SheetBarSheetButtonMenuPosition(menu, id); - } else { - menu.style.display = "none"; - } - } - - } else if (sbbutton) { - SocialCalc.WorkBookControlActivateSheet(id); - } - -} - - -// define a new class for sheetbarsheet button menu item - -SocialCalc.SheetBarSheetButtonMenuItem = function(id, t) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.innerHTML = t; - this.ele.className = ""; - this.ele.style.cssText = "padding:3px 4px;width:100px;height:20px;background-color:#FFF;"; - - var params = { - normalstyle: "backgroundColor:#FFF;", - downstyle: "backgroundColor:#CCC;", - hoverstyle: "backgroundColor:#CCC;"}; - var functions = {MouseDown:function(){SocialCalc.SheetBarMenuItemPress(id);}, - Repeat:function(){}, - Disabled: function() {}}; - - SocialCalc.ButtonRegister(this.ele, params, functions); - - if (SocialCalc.TouchRegister) { - SocialCalc.TouchRegister(this.ele, {SingleTap:functions.MouseDown}); - } - - return this.ele; - -} - -SocialCalc.SheetBarMenuItemPress = function(id) { - - var menu = document.getElementById("sbsb-menu"); - if (!menu) return; - - var clickedsheetid = menu.clickedsheetid; - - switch(id) { - case "sbsb_deletesheet": - //console.log("delete "+clickedsheetid); - SocialCalc.WorkBookControlDelSheet(); - break; - case "sbsb_hidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlHideSheet(); - break; - case "sbsb_unhidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlUnhideSheet(); - break; - case "sbsb_copysheet": - //console.log("copy "+clickedsheetid); - SocialCalc.WorkBookControlCopySheet(); - break; - case "sbsb_moveleft": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveLeft(); - break; - case "sbsb_moveright": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveRight(); - break; - - case "sbsb_pastesheet": - //console.log("paste "+clickedsheetid); - SocialCalc.WorkBookControlPasteSheet(); - break; - case "sbsb_renamesheet": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlRenameSheet(); - break; - case "sbsb_closemenu": - //console.log("rename "+clickedsheetid); - menu.style.display = "none"; - break; - default: - break; - } - menu.style.display = "none"; - -} - -// define a new class for sheetbarsheet button menu -SocialCalc.SheetBarSheetButtonMenu = function(id, clickedsheetid) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.className = ""; - this.ele.clickedsheetid = clickedsheetid; - this.ele.style.cssText = "border:1px solid #000;position:absolute;top:200px;left:0px;width=100px;z-index:120"; - - var ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_deletesheet"," Delete Sheet"); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_hidesheet"," Hide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_unhidesheet"," Unhide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_renamesheet"," Rename Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveleft"," Move Left "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveright"," Move Right "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_copysheet"," Copy Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_pastesheet"," Paste Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_closemenu"," Cancel"); - this.ele.appendChild(ele1); - - - SocialCalc.SheetBarSheetButtonMenuPosition(this.ele, clickedsheetid); - - //var clickedsheet = document.getElementById(clickedsheetid); - //var position = SocialCalc.GetElementPosition(clickedsheet); - //console.log(clickedsheet.offsetHeight,clickedsheet.offsetWidth,clickedsheet.offsetLeft, clickedsheet.offsetTop); - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.editor.toplevel.appendChild(this.ele); - - - - - -} - -// position the sheet menu -SocialCalc.SheetBarSheetButtonMenuPosition = function(menu, clickedsheetid) { - - var hlessbutton = document.getElementById("te_lessbuttonh"); - - //console.log(hlessbutton.style.top, hlessbutton.style.left); - - var sbbutton = document.getElementById("sbsb-"+clickedsheetid); - - //console.log(sbbutton.offsetLeft,clickedsheetid); - - var top = hlessbutton.style.top.slice(0,-2)-220; - var left = sbbutton.offsetLeft+7; - - menu.style.top = top+"px"; - menu.style.left = left+"px"; - - //console.log(menu.style.top, menu.style.left); -} - -SocialCalc.ScriptInfo = { - scripts : {}, - handle:null -}; - -SocialCalc.ScriptCheck = function(sheetid, coord, text) { -var commentstart = text.indexOf(""); -if ((commentstart != -1) && (commentend != -1)) { - script = text.slice(commentstart+10,commentend); - //alert(script); - SocialCalc.ScriptInfo.scripts[coord] = script; - if (SocialCalc.ScriptInfo.handle == null) { - SocialCalc.ScriptInfo.handle = - window.setTimeout(SocialCalc.EvalUserScripts,500); - } - //alert(coord+"-"+sheetid); -} -} - -SocialCalc.EvalUserScript = function(data) { - var head = document.getElementsByTagName("head")[0] || - document.documentElement; - - if (data == "") return; - - var script = document.createElement("script"); - - script.type = "text/javascript"; - try { - // doesn't work on ie... - script.appendChild(document.createTextNode(data)); - } catch(e) { - // IE has funky script nodes - script.text = data; - } - - head.insertBefore(script, head.firstChild); - head.removeChild(script); -} - -SocialCalc.EvalUserScripts = function() { -for (var cr in SocialCalc.ScriptInfo.scripts) { - SocialCalc.EvalUserScript(SocialCalc.ScriptInfo.scripts[cr]); - //console.log(cr,SocialCalc.ScriptInfo.scripts[cr]) -} -SocialCalc.ScriptInfo.handle = null; -SocialCalc.ScriptInfo.scripts = {}; -} - -SocialCalc.CallOutOnRenderCell = function(sheetobj, value, cr) { -var cell=sheetobj.cells[cr]; -if (!cell) return; -var valuetype = cell.valuetype || ""; // get type of value to determine formatting -var valuesubtype = valuetype.substring(1); -var sheetattribs=sheetobj.attribs; -valuetype = valuetype.charAt(0); -if (valuetype=="t") { - valueformat = sheetobj.valueformats[cell.textvalueformat-0] || sheetobj.valueformats[sheetattribs.defaulttextvalueformat-0] || ""; - if (valueformat == "text-html") {SocialCalc.ScriptCheck(sheetobj.sheetid,cr,value);} -} -} - -SocialCalc.GetCellDataValue = function(coord) { - - var sheetname = null; - var sheetid = ""; - var bindex = coord.indexOf("!"); - if (bindex != -1) { - sheetname = coord.slice(0,bindex); - coord = coord.slice(bindex+1); - //console.log(sheetname,coord) - } - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (sheetname == null) { - sheetid = control.currentSheetButton.id - } else { - sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - } - - if ((sheetid == null) || (sheetid == "")) { - return "0"; - } - - var sheetobj = control.workbook.sheetArr[sheetid].sheet - - var cell = sheetobj.cells[coord] - - if (cell) {return cell.datavalue;} else {return 0;} -} - -SocialCalc.GetCellDataArray = function(coordstr,sheetname) { - var vals = [] - var coords = coordstr.split(","); - if (sheetname == null) { sheetname=""; } - else { - sheetname = sheetname+"!"; - } - for (var c in coords) { - - vals.push(SocialCalc.GetCellDataValue(sheetname+coords[c])); - } - return vals; -} - -SocialCalc.UserScriptData = {} - - -SocialCalc.WorkBookRecalculateInfo = { - sheets : [], - calcorder: [], - current: 0, - pass: 0 -}; - -SocialCalc.WorkBookRecalculateAll = function() { - // do it from the last sheet to the first sheet - // using the recalc-done signal to trigger the next sheet - - // if already in the middle of a recalculate-all, ignore this. - if ((SocialCalc.WorkBookRecalculateInfo.current != 0) || - (SocialCalc.WorkBookRecalculateInfo.calcorder.length != 0) || - (SocialCalc.WorkBookRecalculateInfo.sheets.length != 0)) { - return; - } - - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - SocialCalc.WorkBookRecalculateInfo.current = 0; - - for (var sheet in control.workbook.sheetArr) { - SocialCalc.WorkBookRecalculateInfo.sheets.push(sheet); - } - - var i = 0; - for (var c=SocialCalc.WorkBookRecalculateInfo.sheets.length; - c>0; c--) { - SocialCalc.WorkBookRecalculateInfo.calcorder[i] = - SocialCalc.WorkBookRecalculateInfo.sheets[c-1]; - i++; - } - window.setTimeout(SocialCalc.WorkBookRecalculateStep,500); -} - -SocialCalc.WorkBookRecalculateStep = function() { - if (SocialCalc.WorkBookRecalculateInfo.current == - SocialCalc.WorkBookRecalculateInfo.calcorder.length) { - SocialCalc.WorkBookRecalculateInfo.current = 0; - SocialCalc.WorkBookRecalculateInfo.calcorder = []; - SocialCalc.WorkBookRecalculateInfo.sheets = []; - if (SocialCalc.WorkBookRecalculateInfo.pass == - 1) { - SocialCalc.WorkBookRecalculateInfo.pass = 0; - SocialCalc.SpinnerWaitHide(); - //alert("load done"); - return; - } else { - SocialCalc.WorkBookRecalculateInfo.pass++; - SocialCalc.WorkBookRecalculateAll(); - return; - } - } - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert("recalculate "+ - // SocialCalc.WorkBookRecalculateInfo.calcorder[ - // SocialCalc.WorkBookRecalculateInfo.current] - // ); - var sheetid = -SocialCalc.WorkBookRecalculateInfo.calcorder[ - SocialCalc.WorkBookRecalculateInfo.current]; - SocialCalc.WorkBookControlActivateSheet(sheetid); - SocialCalc.WorkBookRecalculateInfo.current++; - - - window.setTimeout(SocialCalc.WorkBookRecalculateStep,1000); -} - - -SocialCalc.SpinnerWaitCreate = function() { - // if the div exists already just use it - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - return; - } - var main = document.createElement("div"); - main.id = "waitloadingspinner"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - main.style.top = (vp.height/2)+"px"; - main.style.left = (vp.width/2)+"px"; - main.style.zIndex = 110; - - main.style.width='50px' - main.style.height = '50px' - main.innerHTML = 'Loading...'; - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.SpinnerWaitHide = function() { - // if the div exists already just use it - -var ele = document.getElementById("waitloadingspinner"); -if (ele) { - ele.innerHTML = ""; - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} -} - -SocialCalc.EditableCells = {}; -SocialCalc.EditableCells.allow = false; -SocialCalc.EditableCells.cells = {}; -SocialCalc.EditableCells.constraints = {}; - -SocialCalc.Callbacks.IsCellEditable = function(editor) { - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - - if (!(SocialCalc.EditableCells.allow)) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[cellname]) { - // by default all cells are editable - return true; - } - return false; -} - -SocialCalc.Callbacks.GetCellEditableAttribs = function(attribs, coord) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var editor = control.workbook.spreadsheet.editor; - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - - console.log(cellname) - if (!(SocialCalc.EditableCells.allow)) { - // by default all cells are editable - attribs["ceditable"] = {def: true, val: ""}; - attribs["cconstraints"] = {def: true, val: ""}; - return ; - } else if (SocialCalc.EditableCells.cells[cellname]) { - attribs["ceditable"] = {def: false, val: "yes"}; - } else { - attribs["ceditable"] = {def: false, val: "no"}; - } - /* - if (SocialCalc.EditableCells.constraints[cellname]) { - attribs["cconstraints"] = {def: false, val: SocialCalc.EditableCells.constraints[cellname]}; - } else { - attribs["cconstraints"] = {def: true, val: ""}; - } - */ - attribs["cconstraints"] = {def: true, val: ""}; - -} - -SocialCalc.Callbacks.SetCellEditableAttribs = function(coord, attribs, range) { - var control = SocialCalc.GetCurrentWorkBookControl(); - var editor = control.workbook.spreadsheet.editor; - var sheetname = editor.workingvalues.currentsheet - - if (range) { - var lis = range.split(":"); - var obj1 = SocialCalc.coordToCr(lis[0]); - var obj2 = SocialCalc.coordToCr(lis[1]); - var i=0; - var j=0; - for (i=obj1.col;i<=obj2.col;i++) { - for (j=obj1.row; j<=obj2.row; j++) { - var cellname = sheetname+"!"+SocialCalc.crToCoord(i,j) - if (!attribs["ceditable"].def && attribs["ceditable"].val == "yes") { - SocialCalc.EditableCells.allow = true - SocialCalc.EditableCells.cells[cellname] = true; - } - if (!attribs["ceditable"].def && attribs["ceditable"].val == "no") { - delete SocialCalc.EditableCells.cells[cellname]; - if (!SocialCalc.EditableCells.cells.length) { - SocialCalc.EditableCells.allow = false - } - } - /* - if (!attribs["cconstraints"].def) { - SocialCalc.EditableCells.constraints[cellname] = attribs["cconstraints"].val; - SocialCalc.EditableCells.allow = true - } - */ - } - } - - } else { - var cellname = sheetname+"!"+editor.ecell.coord; - - if (!attribs["ceditable"].def && attribs["ceditable"].val == "yes") { - SocialCalc.EditableCells.allow = true - SocialCalc.EditableCells.cells[cellname] = true; - } - if (!attribs["ceditable"].def && attribs["ceditable"].val == "no") { - delete SocialCalc.EditableCells.cells[cellname]; - if (!SocialCalc.EditableCells.cells.length) { - SocialCalc.EditableCells.allow = false - } - } - /* - if (!attribs["cconstraints"].def) { - SocialCalc.EditableCells.constraints[cellname] = attribs["cconstraints"].val; - SocialCalc.EditableCells.allow = true - } - */ - } -} - -SocialCalc.Callbacks.CheckConstraints = function(editor, value) -{ - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - var constraint = SocialCalc.EditableCells.constraints[cellname]; - //alert(JSON.stringify(constraint)) - if (constraint != null) { - switch (constraint[0]) { - case "numeric": - // check that value is numeric - var val = parseInt(value); - var low = parseInt(constraint[1]); - var high = parseInt(constraint[2]); - var text = ""; - if (constraint.length > 3) { - text = constraint[3]; - } - //alert(val) - if (isNaN(val)) { - //Aspiring.showPopUp("please input a number"); - alert("please input a number"); - return false; - } - if (val < low) { - //Aspiring.showPopUp(text +" must be at least "+low); - alert(text +" must be at least "+low); - return false; - } - if (val > high) { - //Aspiring.showPopUp(text + " must be atmost "+high); - alert(text + " must be atmost "+high); - return false; - } - if (Aspiring.appSpecificInputValidation && !Aspiring.appSpecificInputValidation(cellname, val)) { - return false; - } - break; - case "float": - var val = parseFloat(value); - var low = parseFloat(constraint[1]); - var high = parseFloat(constraint[2]); - var text = ""; - if (constraint.length > 3) { - text = constraint[3]; - } - //alert(val) - if (isNaN(val)) { - //Aspiring.showPopUp("please input a number"); - alert("please input a number"); - return false; - } - if (val < low) { - //Aspiring.showPopUp(text +" must be at least "+low); - alert(text +" must be at least "+low); - return false; - } - if (val > high) { - //Aspiring.showPopUp(text + " must be atmost "+high); - alert(text + " must be atmost "+high); - return false; - } - if (Aspiring.appSpecificInputValidation && !Aspiring.appSpecificInputValidation(cellname, val)) { - return false; - } - break; - - case "percent": - break; - } - } - return true; - -} - -// this is for checkmark toggling -SocialCalc.Callbacks.ToggleCell = function() -{ - // check what the current ecell is - var control = SocialCalc.GetCurrentWorkBookControl(); - - var editor = control.workbook.spreadsheet.editor; - - var cellname = editor.ecell.coord; - - var value = SocialCalc.GetCellDataValue(cellname); - if(typeof value !== Array) return - - console.log(cellname) - console.log(value) - - var cmdstr = ""; - if (value.indexOf(" ") != -1) { - // set the value to the img value - //cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - - } else { - // set the value to a space - cmdstr = "set " + cellname + ' text t
     
    ' + "\n"; - } - - var sheetid = control.currentSheetButton.id - console.log(sheetid) - console.log(cmdstr) - cmd = {cmdtype:"scmd", id:sheetid, cmdstr: cmdstr, saveundo: false}; - control.ExecuteWorkBookControlCommand(cmd, false); - -} - - -SocialCalc.WorkbookControlCreateSheetHTML = function(sheetlist) { - - var context, div, ele; - - var result = ""; - - var control = SocialCalc.GetCurrentWorkBookControl(); - - div = document.createElement("div"); - - if (!sheetlist) { - context = new SocialCalc.RenderContext(spreadsheet.sheet); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - } else { - for (var sheetid in sheetlist) { - context = control.workbook.sheetArr[sheetid].context; - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - } - } - - result = div.innerHTML; - delete ele; - delete div; - return result; - - } \ No newline at end of file diff --git a/Website/static/socialcalcworkbookcontrol.js.orig b/Website/static/socialcalcworkbookcontrol.js.orig deleted file mode 100644 index 6bdb435..0000000 --- a/Website/static/socialcalcworkbookcontrol.js.orig +++ /dev/null @@ -1,1912 +0,0 @@ -// -// Workbook Control controls workbook actions (add/del/rename etc) and can appear at the -// bottom of the screen (?). Right now its just a proof of concept -// and appears at the top of the screen -// -// Author: Ramu Ramamurthy -// -// - -var SocialCalc; -if (!SocialCalc) { - alert("Main SocialCalc code module needed"); - SocialCalc = {}; -} - -SocialCalc.CurrentWorkbookControlObject = null; - -SocialCalc.TestWorkBookSaveStr = ""; - - -// Constructor: - -SocialCalc.WorkBookControl = function(book, divid, defaultsheetname) { - - this.workbook = book; - this.div = divid; - this.defaultsheetname = defaultsheetname; - this.sheetButtonArr = {}; - this.sheetCnt = 0; - this.numSheets = 0; - this.currentSheetButton = null; - this.renameDialogId = "sheetRenameDialog"; - this.deleteDialogId = "sheetDeleteDialog"; - this.hideDialogId = "sheetHideDialog"; - this.unhideDialogId = "sheetUnhideDialog"; - - this.sheetshtml = ''; - -//this.buttonshtml = -//'
    '+ -//'
    '+ -//''+ -//''+ -//''+ - -// ''+ -// ''+ -// ''+ - -//''+ -//''+ -//'
    '+ -//'
    '; - - SocialCalc.CurrentWorkbookControlObject = this; - this.sheetbar = new SocialCalc.SheetBar(); -} - -// methods -SocialCalc.WorkBookControl.prototype.GetCurrentWorkBookControl = function() {return SocialCalc.GetCurrentWorkBookControl();}; -SocialCalc.WorkBookControl.prototype.InitializeWorkBookControl = function() {return SocialCalc.InitializeWorkBookControl(this);}; - - -SocialCalc.WorkBookControl.prototype.ExecuteWorkBookControlCommand = function(cmd, isremote) { - return SocialCalc.ExecuteWorkBookControlCommand(this, cmd, isremote); -} - -SocialCalc.ExecuteWorkBookControlCommand = function(control, cmd, isremote) { - //console.log("cmd ", cmd.cmdstr, cmd.cmdtype); - - //if (!isremote) { - // return; - //} - - if (cmd.cmdtype == "scmd") { - // dispatch a sheet command - control.workbook.WorkbookScheduleCommand(cmd, isremote); - return; - - } - - if (cmd.cmdtype != "wcmd") { - return; - } - - var parseobj = new SocialCalc.Parse(cmd.cmdstr); - - var cmd1 = parseobj.NextToken(); - - switch (cmd1) { - case "addsheet": - SocialCalc.WorkBookControlAddSheetRemote(null); - break; - - case "addsheetstr": - var sheetstr = cmd.sheetstr; - SocialCalc.WorkBookControlAddSheetRemote(sheetstr); - break; - - case "delsheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlDelSheetRemote(sheetid); - break; - - case "rensheet": - var sheetid = parseobj.NextToken(); - var oldname = parseobj.NextToken(); - var newname = parseobj.NextToken(); - SocialCalc.WorkBookControlRenameSheetRemote(sheetid, oldname, newname); - break; - - case "activatesheet": - var sheetid = parseobj.NextToken(); - SocialCalc.WorkBookControlActivateSheet(sheetid); - break; - - case "hidesheet": - var sheetid = parseobj.NextToken(); - - break; - - case "unhidesheet": - var sheetid = parseobj.NextToken(); - - break; - } -} - -SocialCalc.GetCurrentWorkBookControl = function() { - return SocialCalc.CurrentWorkbookControlObject; -} - -SocialCalc.InitializeWorkBookControl = function(control) { - var element = document.createElement("div"); - element.innerHTML = control.sheetshtml; - var foo = document.getElementById(control.div); - foo.appendChild(element); - //var element2 = document.createElement("div"); - //element2.innerHTML = control.buttonshtml; - //foo.appendChild(element2); - SocialCalc.WorkBookControlAddSheet(false); // this is for the default sheet -} - -SocialCalc.WorkBookControlDelSheetRemote = function(sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (sheetid == control.currentSheetButton.id) { - // the active sheet is being deleted - SocialCalc.WorkBookControlDelSheet(); - return; - } - // some non active sheet is being deleted - var foo = document.getElementById("fooBar"); - var deletedbutton = document.getElementById(sheetid); - - var did = deletedbutton.id; - var dname = deletedbutton.value; - delete control.sheetButtonArr[did]; - - foo.removeChild(deletedbutton); - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+did); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - // delete the sheet - control.workbook.DeleteWorkBookSheet(did, dname); - control.numSheets = control.numSheets-1; - -} - -// assumes that the current active sheet is being deleted -SocialCalc.WorkBookControlDelSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } -if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='To delete the selected sheet, you must first insert a new sheet.
    '; -str +='
    '+ - '
    '; - var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the deletion of the sheet - // the popup has two buttons : Confirm and Cancel -var element = document.getElementById(control.deleteDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+ 'The selected sheet will be permanently deleted.'+ '
    '; -str +='
      '; - str +='
    • To delete the selected sheet, click OK.
    • '; - str +='
    • To cancel the deletion, click cancel.
    • '; -str+='
    '; -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.deleteDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.WorkBookControlDeleteSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.deleteDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlDeleteSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlDeleteSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - control.currentSheetButton = null; - // delete the sheets - control.workbook.DeleteWorkBookSheet(name, curname); - control.numSheets = control.numSheets-1; - - var cmdstr = "delsheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null) { - control.currentSheetButton = control.sheetButtonArr[sheet]; - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true) - break; - } - } - if (control.currentSheetButton != null) { - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } -} - -// assumes that the current active sheet is being hidden -SocialCalc.WorkBookControlHideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - if (control.numSheets == 1) { //disallow this - var str = '
    '+ - ''+' A workbook must contain at least one worksheet ' + '

    '; - str +='Before hiding the selected sheet, you must first insert a new sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - - // do a popup to reaffirm the hiding of the sheet - // the popup has two buttons : Confirm and Cancel - var element = document.getElementById(control.hideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The selected sheet will be hidden.'+ '
    '; - str +='
      '; - str +='
    • To hide the selected sheet, click OK.
    • '; - str +='
    • To cancel the hiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.hideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - -SocialCalc.WorkBookControlHideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.hideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlHideSheetSubmit = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlHideSheetHide(); - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.currentSheetButton.id); - - var name = current.id; - var curname = control.currentSheetButton.value; - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+current.id); - // unregister with mouse ? etc - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, false); - sheetbarbutton.style.display="none"; - control.currentSheetButton = null; - // delete the sheets - - control.numSheets = control.numSheets-1; - - var cmdstr = "hidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - -// displays all hidden sheets, and then unhides whatever is selected -SocialCalc.WorkBookControlUnhideSheet = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit mode return - return; - } - - var unhiddencount = 0; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - unhiddencount++; - } - } - - if(unhiddencount==0) { //no hidden sheets, error message here - var str = '
    '+ - ''+' There are no hidden worksheets. ' + '

    '; - str +='Before unhiding any sheets, you must first hide a sheet.
    '; - str +='
    '+ - '
    '; - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - return; - } - - var element = document.getElementById(control.unhideDialogId); - if (element) return; - - var currentsheet = control.currentSheetButton.value; - var str = '
    '+ - ''+ 'The following sheets are hidden.'+ '
      ' + - ''; - for(var sheet in control.sheetButtonArr) { - if(document.getElementById("sbsb-" + sheet).style.display == "none") { - str += '' + control.sheetButtonArr[sheet].value +'
      '; - } - } - - str +='
    \n
      '; - str +='
    • To unhide the selected sheet, click OK.
    • '; - str +='
    • To cancel the unhiding, click cancel.
    • '; - str+='
    '; - str +='
    '+ - ' '+ - '
    '; - - var main = document.createElement("div"); - main.id = control.unhideDialogId; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - - main.style.top = (vp.height/3)+"px"; - main.style.left = (vp.width/3)+"px"; - main.style.zIndex = 100; - main.style.backgroundColor = "#FFF"; - main.style.border = "1px solid black"; - - main.style.width = "400px"; - - main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - //alert(main.innerHTML); - - SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - } - - - -SocialCalc.WorkBookControlUnhideSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.unhideDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} - - -SocialCalc.WorkBookControlUnhideSheetSubmit = function(name) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlUnhideSheetHide(); - var current = document.getElementById(control.currentSheetButton.id); - - var curid = current.id; - var curname = control.currentSheetButton.value; - - control.currentSheetButton.setAttribute("style",""); - var old = control.currentSheetButton.id; - console.log(old); - SocialCalc.SheetBarButtonActivate(old, false); - - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unhide the button - sheetbarbutton.style.display = "inline"; - control.currentSheetButton = null; - - control.numSheets = control.numSheets+1; - - var cmdstr = "unhidesheet "+name; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - - // reset current sheet - for (var sheet in control.sheetButtonArr) { - if (sheet != null && document.getElementById("sbsb-"+sheet).style.display != "none") { - control.currentSheetButton = control.sheetButtonArr[sheet]; - break; - } - } - - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style","background-color:lightgreen"); - SocialCalc.SheetBarButtonActivate(control.currentSheetButton.id, true); - control.workbook.ActivateWorkBookSheet(control.currentSheetButton.id, null); - } - } - - - -SocialCalc.WorkBookControlAddSheetButton = function(sheetname, sheetid) { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - //Create an input type dynamically. - var element = document.createElement("input"); - - var name = null; - - if (sheetid != null) { - name = sheetid - } else { - name = "sheet"+ (control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt + 1; - } - - //Assign different attributes to the element. - element.setAttribute("type", "button"); - if (sheetname == null) { - element.setAttribute("value", name); - } else { - element.setAttribute("value", sheetname); - } - element.setAttribute("id", name); - element.setAttribute("name", name); - - var fnname = "SocialCalc.WorkBookControlActivateSheet("+"'"+name+"'"+")"; - - element.setAttribute("onclick",fnname); - - control.sheetButtonArr[name] = element; - - - var foo = document.getElementById("fooBar"); - - //Append the element in page (in span). - foo.appendChild(element); - - control.numSheets = control.numSheets + 1; - - var el = new SocialCalc.SheetBarSheetButton("sbsb-"+name, (sheetname?sheetname:name), - document.getElementById("SocialCalc-sheetbar-buttons"), - { - //normalstyle: "border:1px solid #000;backgroundColor:#FFF;", - //downstyle: "border:1px solid #000;backgroundColor:#CCC;", - //hoverstyle: "border:1px solid #000;backgroundColor:#FFF;" - }, - { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(name);}, - Repeat:function(){}, - Disabled: function() {} - } - ); - - return element; -} - -SocialCalc.WorkBookControlAddSheet = function(addworksheet, sheetname){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(sheetname); - - // then change the highlight - - var old="sheet1"; - if (control.currentSheetButton != null) { - control.currentSheetButton.setAttribute("style", ""); - old = control.currentSheetButton.id; - SocialCalc.SheetBarButtonActivate(old, false); - } - - element.setAttribute("style","background-color:lightgreen"); - control.currentSheetButton = element; - var newsheetid = element.id; - SocialCalc.SheetBarButtonActivate(newsheetid, true); - - // create the sheet - if (addworksheet) { - control.workbook.AddNewWorkBookSheet(newsheetid, old, false); - // broadcast an add command here - var cmdstr = "addsheet" - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - } - -} - -SocialCalc.WorkBookControlAddSheetRemote = function(savestr){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // first add the button - var element = SocialCalc.WorkBookControlAddSheetButton(); - - // add the sheet, dont switch to it - control.workbook.AddNewWorkBookSheetNoSwitch(element.id, - element.value, savestr); -} - - -SocialCalc.WorkBookControlActivateSheet = function(name) { - - //alert("in activate sheet="+name) - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById(name); - foo.setAttribute("style","background-color:lightgreen;"); - SocialCalc.SheetBarButtonActivate(name, true) - - var old = control.currentSheetButton.id; - if (control.currentSheetButton.id != foo.id) { - control.currentSheetButton.setAttribute("style", ""); - SocialCalc.SheetBarButtonActivate(old, false) - } - - control.currentSheetButton = foo; - - control.workbook.ActivateWorkBookSheet(name, old); - -} - -SocialCalc.WorkBookControlHttpRequest = null; - -SocialCalc.WorkBookControlAlertContents = function(){ - - var loadedstr = ""; - var http_request = SocialCalc.WorkBookControlHttpRequest; - - if (http_request.readyState == 4) { - //addmsg("received:" + http_request.responseText.length + " chars"); - try { - if (http_request.status == 200) { - loadedstr = http_request.responseText || ""; - http_request = null; - } - else { - ; - } - } - catch (e) { - } - // do something with loaded str - //alert("loaded="+loadedstr); - SocialCalc.TestWorkBookSaveStr = loadedstr; - SocialCalc.Clipboard.clipboard = loadedstr; - } -} - - -SocialCalc.WorkBookControlAjaxCall = function(url, contents) { - - var http_request = null; - - alert("in ajax") - if (window.XMLHttpRequest) { // Mozilla, Safari,... - http_request = new XMLHttpRequest(); - } - else - if (window.ActiveXObject) { // IE - try { - http_request = new ActiveXObject("Msxml2.XMLHTTP"); - } - catch (e) { - try { - http_request = new ActiveXObject("Microsoft.XMLHTTP"); - } - catch (e) { - } - } - } - if (!http_request) { - alert('Giving up :( Cannot create an XMLHTTP instance'); - return false; - } - - // Make the actual request - SocialCalc.WorkBookControlHttpRequest = http_request; - - http_request.onreadystatechange = SocialCalc.WorkBookControlAlertContents; - http_request.open('POST', document.URL, true); // async - http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - http_request.send(contents); - - return true; - -} - -SocialCalc.WorkBookControlSaveSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - var sheetsave = {}; - - sheetsave.numsheets = control.numSheets; - sheetsave.currentid = control.currentSheetButton.id; - sheetsave.currentname = control.currentSheetButton.value; - - sheetsave.sheetArr = {} - for (var sheet in control.sheetButtonArr) { - var sheetstr = control.workbook.SaveWorkBookSheet(sheet); - sheetsave.sheetArr[sheet] = {} - sheetsave.sheetArr[sheet].sheetstr = sheetstr; - sheetsave.sheetArr[sheet].name = control.sheetButtonArr[sheet].value; - sheetsave.sheetArr[sheet].hidden = document.getElementById("sbsb-" + sheet).style.display == "none" ? "1" : "0"; - } - - // Save the editable cells if specified - if (SocialCalc.EditableCells && SocialCalc.EditableCells.allow) { - sheetsave.EditableCells = {}; - for (var i in SocialCalc.EditableCells) { - sheetsave.EditableCells[i] = SocialCalc.EditableCells[i]; - } - } - - SocialCalc.TestWorkBookSaveStr = JSON.stringify(sheetsave); - //alert(SocialCalc.TestWorkBookSaveStr); - // send it to the backend - // SocialCalc.WorkBookControlAjaxCall("/", "&sheetdata="+encodeURIComponent(SocialCalc.TestWorkBookSaveStr)); - return SocialCalc.TestWorkBookSaveStr; -} - - -// insert another workbook into an existing workbook -// assumption is at least 1 sheet exists in existing workbook -// sheets with same names will be overwritten ! -SocialCalc.WorkBookControlInsertWorkbook = function(savestr) { - var sheetsave - if (savestr) { - sheetsave = JSON.parse(savestr); - } - var control = SocialCalc.GetCurrentWorkBookControl(); - for (var sheet in sheetsave.sheetArr) { - - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end) - } - } - // check if sheetname already exists - var sheetname = sheetsave.sheetArr[sheet].name - var sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - if (sheetid) { - //alert(sheetname+"exists") - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, sheetname) - } - else { - //just test-brand new insert first - sheetid = "sheet"+(control.sheetCnt+1).toString() - control.sheetCnt = control.sheetCnt+1 - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid) - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr) - - } - } - -} - -SocialCalc.WorkBookControlLoad = function(savestr){ - - var sheetsave; - - if (savestr == "") return; - - if (savestr) { - sheetsave = JSON.parse(savestr); - } else { - sheetsave = JSON.parse(SocialCalc.TestWorkBookSaveStr); - } - //alert(sheetsave.currentid+","+sheetsave.currentname) - - // first create a new workbook - var control = SocialCalc.GetCurrentWorkBookControl(); - - SocialCalc.WorkBookControlCreateNewBook(); - - // at this point there is one sheet, and 1 button - // create the sequence of buttons, and sheets - var firstrun = true; - var newbuttons = 0 - var sheetid = null; - var currentsheetid = sheetsave.currentid; - //alert("button="+newbuttons) - for (var sheet in sheetsave.sheetArr) { - //alert(sheet); - if (newbuttons > sheetsave.numsheets) { - break; - } - //alert("button="+newbuttons) - var savestr = sheetsave.sheetArr[sheet].sheetstr.savestr; - var parts = control.workbook.spreadsheet.DecodeSpreadsheetSave(savestr); - if (parts) { - if (parts.sheet) { - savestr = savestr.substring(parts.sheet.start, parts.sheet.end); - } - } - if (firstrun) { - firstrun=false; - // set the first button's name correctly - sheetid = control.currentSheetButton.id; - control.currentSheetButton.value = sheetsave.sheetArr[sheet].name; - SocialCalc.SheetBarButtonSetName(sheetid, sheetsave.sheetArr[sheet].name); - // set the sheet data for the first sheet which already exists - control.workbook.LoadRenameWorkBookSheet(sheetid, savestr, control.currentSheetButton.value); - // need to also set the formula cache - currentsheetid = sheetid; - } - else { - sheetid = "sheet"+(control.sheetCnt+1).toString(); - control.sheetCnt = control.sheetCnt+1; - SocialCalc.WorkBookControlAddSheetButton(sheetsave.sheetArr[sheet].name, sheetid); - // create the sheet - control.workbook.AddNewWorkBookSheetNoSwitch(sheetid, sheetsave.sheetArr[sheet].name, savestr); - } - if(sheetsave.sheetArr[sheet].hidden=="1") { - // unregister with mouse ? etc - var sheetbarbutton = document.getElementById("sbsb-" + sheetid); - sheetbarbutton.style.display="none"; - SocialCalc.SheetBarButtonActivate(sheet, false); - newbuttons= newbuttons - 1; - } - if (sheet == sheetsave.currentid) { - currentsheetid = sheetid - } - newbuttons = newbuttons + 1; - } - // Save the user script data - if (sheetsave.EditableCells) { - SocialCalc.EditableCells = {}; - for (var i in sheetsave.EditableCells) { - SocialCalc.EditableCells[i] = sheetsave.EditableCells[i]; - } - } - var timeoutFn = function() { - SocialCalc.WorkBookControlActivateSheet(currentsheetid); - }; - window.setTimeout(timeoutFn, 200); -} - - -SocialCalc.WorkBookControlRenameSheet = function(){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - // do a popup to get the new name of the sheet - // the popup has an input element with submit, and cancel buttons - var element = document.getElementById(control.renameDialogId); -if (element) return; - -var currentsheet = control.currentSheetButton.value; -var str = '
    '+ - ''+'Rename-'+ currentsheet + '
    '+ - '' + 'Please ensure that you DO NOT have ANY spaces in the sheet name.' + '' + - '
    '+'
    '; - -str +='
    '+ - ' '+ - '
    '; - -var main = document.createElement("div"); -main.id = control.renameDialogId; - -main.style.position = "absolute"; - -var vp = SocialCalc.GetViewportInfo(); - -main.style.top = (vp.height/3)+"px"; -main.style.left = (vp.width/3)+"px"; -main.style.zIndex = 100; -main.style.backgroundColor = "#FFF"; -main.style.border = "1px solid black"; - -main.style.width = "400px"; - -main.innerHTML = ''+ - ''+ - '
    '+" "+' X 
    '+ - '
    '+str+'
    '; - - -SocialCalc.DragRegister(main.firstChild.firstChild.firstChild.firstChild, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition, - MouseUp: SocialCalc.DragFunctionPosition, - Disabled: null, positionobj: main}); - -control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); - -var ele = document.getElementById("newSheetName"); -ele.focus(); -SocialCalc.CmdGotFocus(ele); - -} - -SocialCalc.WorkBookControlRenameSheetHide = function(){ - -var control = SocialCalc.GetCurrentWorkBookControl(); -var spreadsheet = control.workbook.spreadsheet; - -var ele = document.getElementById(control.renameDialogId); -ele.innerHTML = ""; - -SocialCalc.DragUnregister(ele); - -SocialCalc.KeyboardFocus(); - -if (ele.parentNode) { - ele.parentNode.removeChild(ele); -} -} - -SocialCalc.WorkBookControlRenameSheetSubmit = function(){ - -<<<<<<< HEAD - // this handles all the rename action - var ele = document.getElementById("newSheetName"); - //alert(ele.value); - var control = SocialCalc.GetCurrentWorkBookControl(); - if (ele.value.length == 0) { - ele.focus(); - return; - } - var oldname = control.currentSheetButton.value; - var newname = ele.value; - - - SocialCalc.WorkBookControlRenameSheetHide(); - // verify newname does not clash with any existing sheet name - // if so reject - for (var sheet in control.sheetButtonArr) { - if (control.sheetButtonArr[sheet].value == newname) { - alert(newname+" already exists"); - return; - } - } - - control.currentSheetButton.value = newname; -======= -// this handles all the rename action -var ele = document.getElementById("newSheetName"); -//console.log(ele.value); -var control = SocialCalc.GetCurrentWorkBookControl(); -if (ele.value.length == 0) { - ele.focus(); - return; -} -var oldname = control.currentSheetButton.value; -var newname = ele.value; -if(newname.indexOf(" ")!=-1) { - alert("A space was found in the new name. Please ensure that the new name has no sapces"); - return; - } -SocialCalc.WorkBookControlRenameSheetHide(); -// verify newname does not clash with any existing sheet name -// if so reject -var smallname = newname.toLowerCase();//converting to lower case to normalise -//console.log(smallname + " old " + ele.value); -for (var sheet in workbook.sheetArr) { - console.log(workbook.sheetArr[sheet].sheet.sheetname);//checking in sheetarr for repeated names - if (workbook.sheetArr[sheet].sheet.sheetname == smallname) { - alert(newname+" already exists"); - return; - } - } // variation of Case in letters of a sheet name will give an error if smallname is used. ->>>>>>> 7da15749846142f38019a2c86828e1c9a1a6de12 - -control.currentSheetButton.value = smallname; - -<<<<<<< HEAD - // perform a rename for formula references to this sheet in all the - // sheets in the workbook - control.workbook.RenameWorkBookSheet(oldname, ele.value, control.currentSheetButton.id); - - var cmdstr = "rensheet "+control.currentSheetButton.id+" "+oldname+" "+newname; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - -======= -SocialCalc.SheetBarButtonSetName (control.currentSheetButton.id, newname); - -// perform a rename for formula references to this sheet in all the -// sheets in the workbook -control.workbook.RenameWorkBookSheet(oldname, smallname, control.currentSheetButton.id); - - var cmdstr = "rensheet "+control.currentSheetButton.id+" "+oldname+" "+newname; - //console.log(cmdstr); - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr}); - ->>>>>>> 7da15749846142f38019a2c86828e1c9a1a6de12 -} - -SocialCalc.WorkBookControlRenameSheetRemote = function(sheetid, oldname, newname) { - //console.log("rename sheet ",sheetid, oldname, newname) - var control = SocialCalc.GetCurrentWorkBookControl(); - - var foo = document.getElementById("fooBar"); - var renbutton = document.getElementById(sheetid); - - renbutton.value = newname; - - SocialCalc.SheetBarButtonSetName(sheetid, newname); - -control.workbook.RenameWorkBookSheet(oldname, newname, sheetid); - -} - - -SocialCalc.WorkBookControlCreateNewBook = function() { - - var control = SocialCalc.GetCurrentWorkBookControl(); - - // delete all the sheets except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - control.workbook.DeleteWorkBookSheet(control.sheetButtonArr[sheet].id, control.sheetButtonArr[sheet].value); - } - } - // Reset that 1 sheet - - control.workbook.LoadRenameWorkBookSheet(control.currentSheetButton.id, "", control.workbook.defaultsheetname) - - - // delete all the buttons except 1 - for (var sheet in control.sheetButtonArr) { - if (sheet != control.currentSheetButton.id) { - var foo = document.getElementById("fooBar"); - var current = document.getElementById(control.sheetButtonArr[sheet].id); - - var name = current.id; - delete control.sheetButtonArr[name]; - - foo.removeChild(current); - - var sheetbar = document.getElementById("SocialCalc-sheetbar-buttons"); - var sheetbarbutton = document.getElementById("sbsb-"+name); - // unregister with mouse ? etc - sheetbar.removeChild(sheetbarbutton); - - - control.numSheets = control.numSheets - 1; - } - } - // rename that button - control.currentSheetButton.value = control.workbook.defaultsheetname; - //alert("done new workbook") -} - -SocialCalc.WorkBookControlNewBook = function() { - var control = SocialCalc.GetCurrentWorkBookControl(); - SocialCalc.WorkBookControlCreateNewBook(); - control.workbook.RenderWorkBookSheet(); -} - - -SocialCalc.WorkBookControlMove = function(direction){ - - var control = SocialCalc.GetCurrentWorkBookControl(); - if (control.workbook.spreadsheet.editor.state != "start") { - return; - } - var sheetArr = control.sheetButtonArr; - var newSheetArr = {}; - var sheetid = control.currentSheetButton.id; - - var curr_button = document.getElementById(sheetid); - var curr_sb_button = document.getElementById("sbsb-"+sheetid); - var sib_button = null; - var sib_sb_button = null; - if (direction == "left") { - sib_button = curr_button.previousSibling; - sib_sb_button = curr_sb_button.previousSibling; - if(!sib_sb_button) { - alert("Cannot move leftmost Sheet further to the left"); - return; - } - } - else { - sib_button = curr_button.nextSibling; - sib_sb_button = curr_sb_button.nextSibling; - if(!sib_sb_button) { - alert("Cannot move rightmost Sheet further to the right"); - return; - } - } - var currid = sheetid; - var sibid = sib_button.id; - var parent = curr_button.parentNode; - var sb_parent = curr_sb_button.parentNode; - - var cloned = {}; - var clonedsb = {}; - for(button in sheetArr) { - clonedsb[button] = document.getElementById("sbsb-"+button); - cloned[button] = document.getElementById(button); - sb_parent.removeChild(document.getElementById("sbsb-"+button)); - parent.removeChild(document.getElementById(button)); - } - for(button in sheetArr) { - if(button != currid && button != sibid) { - newSheetArr[button] = sheetArr[button]; - sb_parent.appendChild(clonedsb[button]); - parent.appendChild(cloned[button]); - } - else if(button == currid) { - if (direction == "left") { - newSheetArr[currid] = sheetArr[currid]; - newSheetArr[sibid] = sheetArr[sibid]; - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - } else { - newSheetArr[sibid] = sheetArr[sibid]; - newSheetArr[currid] = sheetArr[currid]; - sb_parent.appendChild(clonedsb[sibid]); - parent.appendChild(cloned[sibid]); - sb_parent.appendChild(clonedsb[currid]); - parent.appendChild(cloned[currid]); - } - } - } - control.sheetButtonArr = newSheetArr; - SocialCalc.SheetBarButtonActivate(currid,true); -} - -SocialCalc.WorkBookControlMoveLeft = function(){ - SocialCalc.WorkBookControlMove("left"); -} -SocialCalc.WorkBookControlMoveRight = function(){ - SocialCalc.WorkBookControlMove("right"); -} - - - -SocialCalc.WorkBookControlCopySheet = function(){ - - //alert("in copy"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - control.workbook.CopyWorkBookSheet(control.currentSheetButton.id); - - alert("copied sheet:"+control.currentSheetButton.value); -} - -SocialCalc.WorkBookControlPasteSheet = function() { - - //alert("in paste"); - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - var oldid = control.currentSheetButton.id; - - SocialCalc.WorkBookControlAddSheet(false); - - var newid = control.currentSheetButton.id; - - //alert(newid+oldid); - - control.workbook.PasteWorkBookSheet(newid, oldid); - - var cmdstr = "addsheetstr"; - SocialCalc.Callbacks.broadcast('execute', { cmdtype:"wcmd", id:"0", cmdstr: cmdstr, sheetstr: control.workbook.clipsheet.savestr}); - -} - -SocialCalc.SheetBar = function() { - this.baseDiv = document.getElementById("SocialCalc-sheetbar"); - - this.prebuttonsDiv = document.createElement("div"); - this.prebuttonsDiv.style.cssText = "display:inline;"; - this.prebuttonsDiv.innerHTML="        "; - this.prebuttonsDiv.id = "SocialCalc-sheetbar-prebuttons"; - - this.buttonsDiv = document.createElement("div"); - this.buttonsDiv.id = "SocialCalc-sheetbar-buttons"; - this.buttonsDiv.style.cssText = "display:inline;"; - - this.buttonActionsDiv = document.createElement("div"); - this.buttonActionsDiv.id = "SocialCalc-sheetbar-buttonactions"; - this.buttonActionsDiv.style.display = "inline"; - var addbutton = new SocialCalc.SheetBarSheetButton("sbsba-add", "sbsba-add", this.buttonActionsDiv, - {}, - { - MouseDown:function(){var abc=SocialCalc.WorkBookControlAddSheet(true);} - }, - "add-2.png"); - - - this.baseDiv.appendChild(this.prebuttonsDiv); - this.baseDiv.appendChild(this.buttonsDiv); - this.baseDiv.appendChild(this.buttonActionsDiv); -} - -// define a new class for sheetbarsheetbutton - -SocialCalc.SheetBarSheetButton = function(id, name, parentdiv, params, functions, img) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.name = name; - if (!img) { - this.ele.innerHTML = name; - this.ele.style.cssText = "font-size:small;display:inline;padding:5px 5px 2px 5px;border:1px solid #000;"; - imgele = document.createElement("img"); - imgele.id = id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - SocialCalc.ButtonRegister(this.ele, params, functions); - SocialCalc.ButtonRegister(imgele, params, functions); - } else { - var imgele = document.createElement("img"); - imgele.src = SocialCalc.Constants.defaultImagePrefix +img; - imgele.style.cssText = "width:16px;height:16px;vertical-align:middle;" - this.ele.appendChild(imgele); - this.ele.style.cssText = "display:inline;padding:5px 5px 2px 5px;"; - SocialCalc.ButtonRegister(imgele, params, functions); - } - parentdiv.appendChild(this.ele); -} - -SocialCalc.SheetBarButtonActivate = function(id, active) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.isactive = active; - if (active) { - sbbutton.style.backgroundColor = "#FFF"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (!imgele) { - imgele = document.createElement("img"); - imgele.id = "sbsb-"+id+"-img"; - imgele.src = SocialCalc.Constants.defaultImagePrefix +"menu-dropdown.png"; - imgele.style.cssText = "padding:0px 2px;width:16px;height:16px;vertical-align:middle;" - } - sbbutton.appendChild(imgele); - SocialCalc.ButtonRegister(imgele, {}, { - MouseDown:function() {SocialCalc.SheetBarSheetButtonPress(id);}, - Repeat:function(){}, - Disabled: function() {} - } ); - } - else { - sbbutton.style.backgroundColor = "#CCC"; - var imgele = document.getElementById("sbsb-"+id+"-img"); - if (imgele) { - sbbutton.removeChild(imgele); - } - } - var menu = document.getElementById("sbsb-menu"); - if (menu && menu.style.display != "none") { - menu.style.display = "none"; - } -} - -SocialCalc.SheetBarButtonSetName = function(id, name) { - var sbbutton = document.getElementById("sbsb-"+id); - sbbutton.name = name; - sbbutton.innerHTML = name; - if (sbbutton.isactive) { - SocialCalc.SheetBarButtonActivate(id, true); - } -} - - -SocialCalc.SheetBarSheetButtonPress = function(id) { - //console.log("button press") - var sbbutton = document.getElementById("sbsb-"+id); - if (sbbutton && sbbutton.isactive) { - var menu = document.getElementById("sbsb-menu"); - if (!menu) { - var sbsbm = new SocialCalc.SheetBarSheetButtonMenu("sbsb-menu", id); - } else { - menu.clickedsheetid = id; - if (menu.style.display == "none") { - menu.style.display = "inline"; - SocialCalc.SheetBarSheetButtonMenuPosition(menu, id); - } else { - menu.style.display = "none"; - } - } - - } else if (sbbutton) { - SocialCalc.WorkBookControlActivateSheet(id); - } - -} - - -// define a new class for sheetbarsheet button menu item - -SocialCalc.SheetBarSheetButtonMenuItem = function(id, t) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.innerHTML = t; - this.ele.className = ""; - this.ele.style.cssText = "padding:3px 4px;width:100px;height:20px;background-color:#FFF;"; - - var params = { - normalstyle: "backgroundColor:#FFF;", - downstyle: "backgroundColor:#CCC;", - hoverstyle: "backgroundColor:#CCC;"}; - var functions = {MouseDown:function(){SocialCalc.SheetBarMenuItemPress(id);}, - Repeat:function(){}, - Disabled: function() {}}; - - SocialCalc.ButtonRegister(this.ele, params, functions); - - SocialCalc.TouchRegister(this.ele, {SingleTap:functions.MouseDown}); - - return this.ele; - -} - -SocialCalc.SheetBarMenuItemPress = function(id) { - - var menu = document.getElementById("sbsb-menu"); - if (!menu) return; - - var clickedsheetid = menu.clickedsheetid; - - switch(id) { - case "sbsb_deletesheet": - //console.log("delete "+clickedsheetid); - SocialCalc.WorkBookControlDelSheet(); - break; - case "sbsb_hidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlHideSheet(); - break; - case "sbsb_unhidesheet": - //console.log("hide" +clickedsheetid); - SocialCalc.WorkBookControlUnhideSheet(); - break; - case "sbsb_copysheet": - //console.log("copy "+clickedsheetid); - SocialCalc.WorkBookControlCopySheet(); - break; - case "sbsb_moveleft": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveLeft(); - break; - case "sbsb_moveright": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlMoveRight(); - break; - - case "sbsb_pastesheet": - //console.log("paste "+clickedsheetid); - SocialCalc.WorkBookControlPasteSheet(); - break; - case "sbsb_renamesheet": - //console.log("rename "+clickedsheetid); - SocialCalc.WorkBookControlRenameSheet(); - break; - case "sbsb_closemenu": - //console.log("rename "+clickedsheetid); - menu.style.display = "none"; - break; - default: - break; - } - menu.style.display = "none"; - -} - -// define a new class for sheetbarsheet button menu -SocialCalc.SheetBarSheetButtonMenu = function(id, clickedsheetid) { - this.ele = document.createElement("div"); - this.ele.id = id; - this.ele.className = ""; - this.ele.clickedsheetid = clickedsheetid; - this.ele.style.cssText = "border:1px solid #000;position:absolute;top:200px;left:0px;width=100px;z-index:120"; - - var ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_deletesheet"," Delete Sheet"); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_hidesheet"," Hide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_unhidesheet"," Unhide Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_renamesheet"," Rename Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveleft"," Move Left "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_moveright"," Move Right "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_copysheet"," Copy Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_pastesheet"," Paste Sheet "); - this.ele.appendChild(ele1); - ele1 = new SocialCalc.SheetBarSheetButtonMenuItem("sbsb_closemenu"," Cancel"); - this.ele.appendChild(ele1); - - - SocialCalc.SheetBarSheetButtonMenuPosition(this.ele, clickedsheetid); - - //var clickedsheet = document.getElementById(clickedsheetid); - //var position = SocialCalc.GetElementPosition(clickedsheet); - //console.log(clickedsheet.offsetHeight,clickedsheet.offsetWidth,clickedsheet.offsetLeft, clickedsheet.offsetTop); - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.editor.toplevel.appendChild(this.ele); - - - - - -} - -// position the sheet menu -SocialCalc.SheetBarSheetButtonMenuPosition = function(menu, clickedsheetid) { - - var hlessbutton = document.getElementById("te_lessbuttonh"); - - //console.log(hlessbutton.style.top, hlessbutton.style.left); - - var sbbutton = document.getElementById("sbsb-"+clickedsheetid); - - //console.log(sbbutton.offsetLeft,clickedsheetid); - - var top = hlessbutton.style.top.slice(0,-2)-220; - var left = sbbutton.offsetLeft+7; - - menu.style.top = top+"px"; - menu.style.left = left+"px"; - - //console.log(menu.style.top, menu.style.left); -} - -SocialCalc.ScriptInfo = { - scripts : {}, - handle:null -}; - -SocialCalc.ScriptCheck = function(sheetid, coord, text) { -var commentstart = text.indexOf(""); -if ((commentstart != -1) && (commentend != -1)) { - script = text.slice(commentstart+10,commentend); - //alert(script); - SocialCalc.ScriptInfo.scripts[coord] = script; - if (SocialCalc.ScriptInfo.handle == null) { - SocialCalc.ScriptInfo.handle = - window.setTimeout(SocialCalc.EvalUserScripts,500); - } - //alert(coord+"-"+sheetid); -} -} - -SocialCalc.EvalUserScript = function(data) { - var head = document.getElementsByTagName("head")[0] || - document.documentElement; - - if (data == "") return; - - var script = document.createElement("script"); - - script.type = "text/javascript"; - try { - // doesn't work on ie... - script.appendChild(document.createTextNode(data)); - } catch(e) { - // IE has funky script nodes - script.text = data; - } - - head.insertBefore(script, head.firstChild); - head.removeChild(script); -} - -SocialCalc.EvalUserScripts = function() { -for (var cr in SocialCalc.ScriptInfo.scripts) { - SocialCalc.EvalUserScript(SocialCalc.ScriptInfo.scripts[cr]); - //console.log(cr,SocialCalc.ScriptInfo.scripts[cr]) -} -SocialCalc.ScriptInfo.handle = null; -SocialCalc.ScriptInfo.scripts = {}; -} - -SocialCalc.CallOutOnRenderCell = function(sheetobj, value, cr) { -var cell=sheetobj.cells[cr]; -if (!cell) return; -var valuetype = cell.valuetype || ""; // get type of value to determine formatting -var valuesubtype = valuetype.substring(1); -var sheetattribs=sheetobj.attribs; -valuetype = valuetype.charAt(0); -if (valuetype=="t") { - valueformat = sheetobj.valueformats[cell.textvalueformat-0] || sheetobj.valueformats[sheetattribs.defaulttextvalueformat-0] || ""; - if (valueformat == "text-html") {SocialCalc.ScriptCheck(sheetobj.sheetid,cr,value);} -} -} - -SocialCalc.GetCellDataValue = function(coord) { - - var sheetname = null; - var sheetid = ""; - var bindex = coord.indexOf("!"); - if (bindex != -1) { - sheetname = coord.slice(0,bindex); - coord = coord.slice(bindex+1); - //console.log(sheetname,coord) - } - var control = SocialCalc.GetCurrentWorkBookControl(); - - - if (sheetname == null) { - sheetid = control.currentSheetButton.id - } else { - sheetid = control.workbook.SheetNameExistsInWorkBook(sheetname); - } - - if ((sheetid == null) || (sheetid == "")) { - return "0"; - } - - var sheetobj = control.workbook.sheetArr[sheetid].sheet - - var cell = sheetobj.cells[coord] - - if (cell) {return cell.datavalue;} else {return 0;} -} - -SocialCalc.GetCellDataArray = function(coordstr,sheetname) { - var vals = [] - var coords = coordstr.split(","); - if (sheetname == null) { sheetname=""; } - else { - sheetname = sheetname+"!"; - } - for (var c in coords) { - - vals.push(SocialCalc.GetCellDataValue(sheetname+coords[c])); - } - return vals; -} - -SocialCalc.UserScriptData = {} - - -SocialCalc.WorkBookRecalculateInfo = { - sheets : [], - calcorder: [], - current: 0, - pass: 0 -}; - -SocialCalc.WorkBookRecalculateAll = function() { - // do it from the last sheet to the first sheet - // using the recalc-done signal to trigger the next sheet - - // if already in the middle of a recalculate-all, ignore this. - if ((SocialCalc.WorkBookRecalculateInfo.current != 0) || - (SocialCalc.WorkBookRecalculateInfo.calcorder.length != 0) || - (SocialCalc.WorkBookRecalculateInfo.sheets.length != 0)) { - return; - } - - - var control = SocialCalc.GetCurrentWorkBookControl(); - - if (control.workbook.spreadsheet.editor.state != "start") { - // if in edit return - return; - } - - - SocialCalc.WorkBookRecalculateInfo.current = 0; - - for (var sheet in control.workbook.sheetArr) { - SocialCalc.WorkBookRecalculateInfo.sheets.push(sheet); - } - - var i = 0; - for (var c=SocialCalc.WorkBookRecalculateInfo.sheets.length; - c>0; c--) { - SocialCalc.WorkBookRecalculateInfo.calcorder[i] = - SocialCalc.WorkBookRecalculateInfo.sheets[c-1]; - i++; - } - window.setTimeout(SocialCalc.WorkBookRecalculateStep,500); -} - -SocialCalc.WorkBookRecalculateStep = function() { - if (SocialCalc.WorkBookRecalculateInfo.current == - SocialCalc.WorkBookRecalculateInfo.calcorder.length) { - SocialCalc.WorkBookRecalculateInfo.current = 0; - SocialCalc.WorkBookRecalculateInfo.calcorder = []; - SocialCalc.WorkBookRecalculateInfo.sheets = []; - if (SocialCalc.WorkBookRecalculateInfo.pass == - 1) { - SocialCalc.WorkBookRecalculateInfo.pass = 0; - SocialCalc.SpinnerWaitHide(); - //alert("load done"); - return; - } else { - SocialCalc.WorkBookRecalculateInfo.pass++; - SocialCalc.WorkBookRecalculateAll(); - return; - } - } - var control = SocialCalc.GetCurrentWorkBookControl(); - //alert("recalculate "+ - // SocialCalc.WorkBookRecalculateInfo.calcorder[ - // SocialCalc.WorkBookRecalculateInfo.current] - // ); - var sheetid = -SocialCalc.WorkBookRecalculateInfo.calcorder[ - SocialCalc.WorkBookRecalculateInfo.current]; - SocialCalc.WorkBookControlActivateSheet(sheetid); - SocialCalc.WorkBookRecalculateInfo.current++; - - - window.setTimeout(SocialCalc.WorkBookRecalculateStep,1000); -} - - -SocialCalc.SpinnerWaitCreate = function() { - // if the div exists already just use it - var ele = document.getElementById("waitloadingspinner"); - if (ele) { - return; - } - var main = document.createElement("div"); - main.id = "waitloadingspinner"; - - main.style.position = "absolute"; - - var vp = SocialCalc.GetViewportInfo(); - main.style.top = (vp.height/2)+"px"; - main.style.left = (vp.width/2)+"px"; - main.style.zIndex = 110; - - main.style.width='50px' - main.style.height = '50px' - main.innerHTML = 'Loading...'; - - var control = SocialCalc.GetCurrentWorkBookControl(); - control.workbook.spreadsheet.spreadsheetDiv.appendChild(main); -} - -SocialCalc.SpinnerWaitHide = function() { - // if the div exists already just use it - -var ele = document.getElementById("waitloadingspinner"); -if (ele) { - ele.innerHTML = ""; - - if (ele.parentNode) { - ele.parentNode.removeChild(ele); - } -} -} - -SocialCalc.EditableCells = {}; -SocialCalc.EditableCells.allow = false; -SocialCalc.EditableCells.cells = {}; -SocialCalc.EditableCells.constraints = {}; - -SocialCalc.Callbacks.IsCellEditable = function(editor) { - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - - if (!(SocialCalc.EditableCells.allow)) { - // by default all cells are editable - return true; - } - if (SocialCalc.EditableCells.cells[cellname]) { - // by default all cells are editable - return true; - } - return false; -} - -SocialCalc.Callbacks.CheckConstraints = function(editor, value) -{ - var cellname = editor.workingvalues.currentsheet+"!"+editor.ecell.coord; - var constraint = SocialCalc.EditableCells.constraints[cellname]; - //alert(JSON.stringify(constraint)) - if (constraint != null) { - switch (constraint[0]) { - case "numeric": - // check that value is numeric - var val = parseInt(value); - //alert(val) - if (isNaN(val)) { - alert("please input a number"); - return false; - } - - break; - case "percent": - break; - } - } - return true; -} - -// this is for checkmark toggling -SocialCalc.Callbacks.ToggleCell = function() -{ - // check what the current ecell is - var control = SocialCalc.GetCurrentWorkBookControl(); - - var editor = control.workbook.spreadsheet.editor; - - var cellname = editor.ecell.coord; - - var value = SocialCalc.GetCellDataValue(cellname); - - console.log(cellname) - console.log(value) - - var cmdstr = ""; - if (value.indexOf(" ") != -1) { - // set the value to the img value - //cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - cmdstr = "set "+ cellname + ' text t
    ' + "\n"; - - } else { - // set the value to a space - cmdstr = "set " + cellname + ' text t
     
    ' + "\n"; - } - - var sheetid = control.currentSheetButton.id - console.log(sheetid) - console.log(cmdstr) - cmd = {cmdtype:"scmd", id:sheetid, cmdstr: cmdstr, saveundo: false}; - control.ExecuteWorkBookControlCommand(cmd, false); - -} - - -SocialCalc.WorkbookControlCreateSheetHTML = function(sheetlist) { - - var context, div, ele; - - var result = ""; - - var control = SocialCalc.GetCurrentWorkBookControl(); - - div = document.createElement("div"); - - if (!sheetlist) { - context = new SocialCalc.RenderContext(spreadsheet.sheet); - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - delete context; - } else { - for (var sheetid in sheetlist) { - context = control.workbook.sheetArr[sheetid].context; - ele = context.RenderSheet(null, {type: "html"}); - div.appendChild(ele); - } - } - - result = div.innerHTML; - delete ele; - delete div; - return result; - - } \ No newline at end of file diff --git a/Website/static/statements.js b/Website/static/statements.js deleted file mode 100644 index bc2424a..0000000 --- a/Website/static/statements.js +++ /dev/null @@ -1,573 +0,0 @@ - -if (!Aspiring) { - var Aspiring = {}; -} - - -Aspiring.tickerInfo = { - state: 1, - error: false, - errorReason: "", - loading: false, - ticker: "", - rawData: {}, - Income: "", - Balance: "", - CashFlow: "", - tickData: "", - datasources: [Aspiring.smartmoney, Aspiring.msn],//[Aspiring.smartmoney],//,Aspiring.msn],//, // Aspiring.smartmoney], - currentDataSource: 0, - isFinancialsSupported: 1, - options: null -}; - -Aspiring.getDataSource = function() { - return Aspiring.tickerInfo.datasources[Aspiring.tickerInfo.currentDataSource]; -}; - -Aspiring.clearTickerInfo = function() { - Aspiring.tickerInfo.error = false; - Aspiring.tickerInfo.errorReason = ""; - Aspiring.tickerInfo.loading = false; - Aspiring.tickerInfo.state = 1; - Aspiring.tickerInfo.ticker = ""; - Aspiring.tickerInfo.Income = ""; - Aspiring.tickerInfo.Balance = ""; - Aspiring.tickerInfo.CashFlow = ""; - Aspiring.tickerInfo.tickData = ""; - Aspiring.tickerInfo.currentDataSource = 0; - Aspiring.tickerInfo.options = null; - Aspiring.tickerInfo.rawData = {}; -} - -Aspiring.buildSheetSave = function() { - // build sheet data from the tickerInfo as a json object - // which can be embedded into the spreadsheet - - var sheetsave = {}; - sheetsave.numsheets = 4; - sheetsave.currentid = "sheet1"; - sheetsave.currentname = "data"; - sheetsave.sheetArr = {}; - - sheetsave.sheetArr.sheet1 = {}; - sheetsave.sheetArr.sheet1.sheetstr = {}; - sheetsave.sheetArr.sheet1.sheetstr.savestr = Aspiring.tickerInfo.tickData; - sheetsave.sheetArr.sheet1.name = "data"; - - sheetsave.sheetArr.sheet2 = {}; - sheetsave.sheetArr.sheet2.sheetstr = {}; - sheetsave.sheetArr.sheet2.sheetstr.savestr = Aspiring.tickerInfo.Balance; - sheetsave.sheetArr.sheet2.name = "balance"; - - sheetsave.sheetArr.sheet3 = {}; - sheetsave.sheetArr.sheet3.sheetstr = {}; - sheetsave.sheetArr.sheet3.sheetstr.savestr = Aspiring.tickerInfo.Income; - sheetsave.sheetArr.sheet3.name = "income"; - - sheetsave.sheetArr.sheet4 = {}; - sheetsave.sheetArr.sheet4.sheetstr = {}; - sheetsave.sheetArr.sheet4.sheetstr.savestr = Aspiring.tickerInfo.CashFlow; - sheetsave.sheetArr.sheet4.name = "cashflow"; - - - return sheetsave; - -} - -Aspiring.stripScripts = function(html) { - console.log("in strip scripts") - var out = html; - var ind = out.indexOf(''); - if (ind1 == -1) break; - out = out.slice(0,ind)+out.slice(ind1+8); - ind = out.indexOf(' - - - - test graph - - - - - - - - - - - - -
    editor goes here
    -
    - - - - - - diff --git a/Website/static/testhighcharts.html b/Website/static/testhighcharts.html deleted file mode 100755 index cdf6943..0000000 --- a/Website/static/testhighcharts.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - -SocialCalc 0.8.1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - -
    -
    editor goes here
    -
    -
    - - - - - diff --git a/Website/static/testsparklines.html b/Website/static/testsparklines.html deleted file mode 100755 index 808a70f..0000000 --- a/Website/static/testsparklines.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - -SocialCalc 0.8.1 - - - - - - - - - - - - - - - - - - - - -
    -
    - -
    -
    editor goes here
    -
    -
    - - - - - diff --git a/Website/static/testworkbook.html b/Website/static/testworkbook.html deleted file mode 100644 index b93f662..0000000 --- a/Website/static/testworkbook.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - -SocialCalc 0.8.1 - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - -
    -
    editor goes here
    -
    -
    - - - - - diff --git a/Website/static/updater.js b/Website/static/updater.js deleted file mode 100644 index 61af15e..0000000 --- a/Website/static/updater.js +++ /dev/null @@ -1,240 +0,0 @@ -// -// -// -// -// -// - -$(document).ready(function() { - if (!window.console) window.console = {}; - if (!window.console.log) window.console.log = function() {}; - player.initialize(); - updater.poll(); -}); - - -function isMultipleSheet() { - if (SocialCalc.CurrentWorkbookControlObject) { - return true; - } - return false; -} - -function getCookie(name) { - var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); - return r ? r[1] : undefined; -} - -jQuery.postJSON = function(url, args, callback) { - //args._xsrf = getCookie("_xsrf"); - //console.log(args) - var test = $.param(args) - //console.log(test) - - $.ajax({url: url, data: $.param(args), dataType: "text", type: "POST", - success: function(response) { - if (callback) callback(eval("(" + response + ")")); - }, error: function(response) { - console.log("ERROR:", response) - }}); -}; - -SocialCalc.Callbacks.broadcast = function(type, data) { - if (type == 'ask.ecell') { - //console.log("skipping askecell") - return - } - if (type == 'ecell') { - //console.log("skipping askecell") - return - } - var message = {} - message.from = player.idInSession - message.type = type - message.data = encodeURIComponent(JSON.stringify(data)) - $.postJSON("/broadcast", message, function(response) { - updater.showMessage(response); - }); -} - - -var updater = { - errorSleepTime: 500, - cursor: null, - - poll: function() { - var args = {"_xsrf": getCookie("_xsrf")}; - if (updater.cursor) args.cursor = updater.cursor; - $.ajax({url: "/updates", type: "POST", dataType: "text", - data: $.param(args), success: updater.onSuccess, - error: updater.onError}); - }, - - onSuccess: function(response) { - try { - //console.log("response",response) - updater.newMessages(eval("(" + response + ")")); - } catch (e) { - updater.onError(); - return; - } - updater.errorSleepTime = 500; - window.setTimeout(updater.poll, 0); - }, - - onError: function(response) { - updater.errorSleepTime *= 2; - //console.log("Poll error; sleeping for", updater.errorSleepTime, "ms"); - window.setTimeout(updater.poll, updater.errorSleepTime); - }, - - newMessages: function(response) { - //console.log("new msg",response) - //if (!response.type) return; - //player.onNewEvent(response); - if (!response.messages) return; - //console.log("----didnt get here------") - //updater.cursor = response.cursor; - var messages = response.messages; - //console.log("messages=",messages) - updater.cursor = messages[messages.length - 1].id; - //console.log("cursor is",updater.cursor) - //console.log(messages.length, "new messages, cursor:", updater.cursor); - for (var i = 0; i < messages.length; i++) { - player.onNewEvent(messages[i]); - } - - }, - - showMessage: function(message) { - } -}; - -var player = { - - initialize : function() { - player.isConnected = true; - player.idInSession = getCookie("idinsession") - //console.log("idinsession",player.idInSession) - if (player.idInSession != "1") { - SocialCalc.Callbacks.broadcast('ask.snapshot',{arbit:"arbit"}) - //console.log("sent asking for snapshot") - } else { - //console.log("NOT asking for snapshot") - } - }, - - onNewEvent : function(data) { - //console.log("in on new evt",data.idinsession,player.idInSession,data.type) - if (!player.isConnected) return; - if (data.from == player.idInSession) return; - if (typeof SocialCalc == 'undefined') return; - decodeddata = decodeURIComponent(data["data"]); - msgdata = JSON.parse(decodeddata) - - //console.log(msgdata); - - var editor = SocialCalc.CurrentSpreadsheetControlObject.editor; - - switch (data.type) { - case 'ecell': { - //var peerClass = ' ' + data.idinsession + ' defaultPeer'; - break; - var peerClass = ' defaultPeer'; - var find = new RegExp(peerClass, 'g'); - - if (msgdata.original) { - var origCR = SocialCalc.coordToCr(msgdata.original); - var origCell = SocialCalc.GetEditorCellElement(editor, origCR.row, origCR.col); - origCell.element.className = origCell.element.className.replace(find, ''); - //console.log("----") - //console.log(origCell.element.className) - } - - var cr = SocialCalc.coordToCr(msgdata.ecell); - var cell = SocialCalc.GetEditorCellElement(editor, cr.row, cr.col); - if (cell.element.className.search(find) == -1) { - cell.element.className += peerClass; - //console.log("----",peerClass) - //console.log(origCell.element.className) - } - break; - } - case 'ask.snapshot': { - if (player.idInSession == "1") { - if (isMultipleSheet()) { - //console.log("multi sheet ask snapshot"); - SocialCalc.Callbacks.broadcast('snapshot', { - to: data.idinsession, - snapshot: SocialCalc.WorkBookControlSaveSheet() - }); - - - } else { - SocialCalc.Callbacks.broadcast('snapshot', { - to: data.idinsession, - snapshot: SocialCalc.CurrentSpreadsheetControlObject.CreateSpreadsheetSave() - }); - } - } - break; - } - case 'ask.ecell': { - break; - SocialCalc.Callbacks.broadcast('ecell', { - to: data.idinsession, - ecell: editor.ecell.coord - }); - break; - } - case 'snapshot': { - //console.log("------------"); - //if (player._hadSnapshot) break; - player._hadSnapshot = true; - if (isMultipleSheet()) { - SocialCalc.WorkBookControlLoad(msgdata.snapshot) - } else { - - - var spreadsheet = SocialCalc.CurrentSpreadsheetControlObject; - var parts = spreadsheet.DecodeSpreadsheetSave(msgdata.snapshot); - if (parts) { - if (parts.sheet) { - spreadsheet.sheet.ResetSheet(); - spreadsheet.ParseSheetSave(msgdata.snapshot.substring(parts.sheet.start, parts.sheet.end)); - } - //if (parts.edit) { - // spreadsheet.editor.LoadEditorSettings(msgdata.snapshot.substring(parts.edit.start, parts.edit.end)); - //} - } - if (spreadsheet.editor.context.sheetobj.attribs.recalc=="off") { - spreadsheet.ExecuteCommand('redisplay', ''); - //spreadsheet.ExecuteCommand('set sheet defaulttextvalueformat text-wiki'); - } - else { - spreadsheet.ExecuteCommand('recalc', ''); - //spreadsheet.ExecuteCommand('set sheet defaulttextvalueformat text-wiki'); - } - - } - - break; - } - case 'execute': { - if (isMultipleSheet()) { - //console.log("in execute"); - var control = SocialCalc.GetCurrentWorkBookControl(); - control.ExecuteWorkBookControlCommand(msgdata, true); // remote cmd - } else { - SocialCalc.CurrentSpreadsheetControlObject.context.sheetobj.ScheduleSheetCommands( - msgdata.cmdstr, - msgdata.saveundo, - true // isRemote = true - ); - } - break; - } - } - } - -}; \ No newline at end of file diff --git a/Website/static/urlJump.html b/Website/static/urlJump.html deleted file mode 100644 index 8d66eff..0000000 --- a/Website/static/urlJump.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Website/templates/allusersheets.html b/Website/templates/allusersheets.html deleted file mode 100644 index eaf22e4..0000000 --- a/Website/templates/allusersheets.html +++ /dev/null @@ -1,100 +0,0 @@ -{% extends "base.html" %} {% block head %} - - - -{% endblock %} {% block body %} - -
    -
    -
    -
    -
    -
    - - {% for entry in entries %} - - - - - - - {% endfor %} -
    {{ entry.fname }} - - - - - -
    - - - - - - - -
    -
    -
    -
    - -
    -
    -
    - - - -{% endblock %} diff --git a/Website/templates/base.html b/Website/templates/base.html deleted file mode 100644 index 6aef74f..0000000 --- a/Website/templates/base.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - {{ APP_TITLE }} - - {% block head %}{% endblock %} - - -
    -
    -

    Aspiring Investments

    - - {% if session['user'] %} user: {{session['user']}} - logout - {% endif %} - -
    - {% block body %}{% endblock %} {% block bottom %}{% endblock %} -
    -
    - -
    -

    - About   |   Feedback   | -   - FAQ -

    -

    © 2011

    -
    -
    - - diff --git a/Website/templates/importcollabload.html b/Website/templates/importcollabload.html deleted file mode 100644 index 3db9e39..0000000 --- a/Website/templates/importcollabload.html +++ /dev/null @@ -1,807 +0,0 @@ - - - - - -TestMultiSheet - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Aspiring Investments   Editing -{{ entry["fname"] }} in session {{ entry["session"] }}

    - - -
    -
    - -
    -
    Loading editor
    -
    -
    - - - - - - - - - - - - diff --git a/Website/templates/lostpassword-baduser.html b/Website/templates/lostpassword-baduser.html deleted file mode 100644 index 3340e16..0000000 --- a/Website/templates/lostpassword-baduser.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "base.html" %} {% block head %} {% endblock %} {% block body %} -
    -
    - User Email {{ reguser }} invalid. Reenter your email address -
    - Email:
    -
    - -

    -
    -
    -{% endblock %} diff --git a/Website/templates/lostpassword-sentemail.html b/Website/templates/lostpassword-sentemail.html deleted file mode 100644 index f1236cc..0000000 --- a/Website/templates/lostpassword-sentemail.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends "base.html" %} {% block head %} {% endblock %} {% block body %} -
    - Instructions to reset your password have been emailed to {{ reguser }}. Please - check your email. -
    -
    -{% endblock %} diff --git a/Website/templates/lostpassword.html b/Website/templates/lostpassword.html deleted file mode 100644 index 8203126..0000000 --- a/Website/templates/lostpassword.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "base.html" %} {% block head %} {% endblock %} {% block body %} -
    -
    - Enter your email address, instructions will be mailed to reset your - password. -
    - Email:
    -
    - -

    -
    -
    -{% endblock %} diff --git a/Website/templates/pwreset-invalid.html b/Website/templates/pwreset-invalid.html deleted file mode 100644 index fd5ed75..0000000 --- a/Website/templates/pwreset-invalid.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "base.html" %} {% block head %} {% endblock %} {% block body %} -
    - Invalid attempt to reset password for: {{ argument['reguser'] }} -
    -{% endblock %} diff --git a/Website/templates/pwreset-ok.html b/Website/templates/pwreset-ok.html deleted file mode 100644 index fda4286..0000000 --- a/Website/templates/pwreset-ok.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "base.html" %} {% block head %} {% endblock %} {% block body %} -

    Reset password for user {{ reguser }}

    -
    -

    Login

    -{% endblock %} diff --git a/Website/templates/pwreset.html b/Website/templates/pwreset.html deleted file mode 100644 index 5bb6b24..0000000 --- a/Website/templates/pwreset.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "base.html" %} {% block head %} {% endblock %} {% block body %} -
    -
    - Reset password for: {{ reguser }} -
    -
    - Password:
    - Retype Password:
    -
    - -
    -
    -
    -
    -{% endblock %} diff --git a/Website/templates/userlogin.html b/Website/templates/userlogin.html deleted file mode 100644 index b679faf..0000000 --- a/Website/templates/userlogin.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "base.html" %} {% block head %} {% endblock %} {% block body %} -
    -
    - Email:
    - Password:
    -
    - -

    - Register  Forgot Password -
    -
    -{% endblock %} diff --git a/Website/templates/userregister-exists.html b/Website/templates/userregister-exists.html deleted file mode 100644 index 416df83..0000000 --- a/Website/templates/userregister-exists.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "base.html" %} {% block head %} {% endblock %} {% block body %} -

    User {{ reguser }} already exists!! Please try again.

    -
    -
    -
    - Email: -
    - Password:
    - Retype Password:
    -
    - -
    -
    -{% endblock %} diff --git a/Website/templates/userregister-ok.html b/Website/templates/userregister-ok.html deleted file mode 100644 index ca9475c..0000000 --- a/Website/templates/userregister-ok.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "base.html" %} {% block head %} {% endblock %} {% block body %} -

    Registration Complete

    -
    -

    Login

    -{% endblock %} diff --git a/Website/templates/userregister.html b/Website/templates/userregister.html deleted file mode 100644 index 44804af..0000000 --- a/Website/templates/userregister.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends "base.html" %} {% block head %} {% endblock %} {% block body %} -
    -
    - Email:
    - Password:
    - Retype Password:
    -
    - -
    -
    -{% endblock %}